Hi Rodrigo,
There is code in Chimera to read XYZ files, which are somewhat similar, so you could base you code off of that.  The XYZ-reading code is in <your Chimera>/share/ReadXYZ/__init__.py, the readXYZ() function.  On a Mac, "<your Chimera>" is actually Chimera.app/Contents/Resources.  Anyway, there is a lot of error-checking in that code so it may be hard to see the most relevant parts for your purposes.  Here's a digest version:

import objects/functions we will be using
from chimera import Molecule, Element, Coord, connectMolecule

create a new empty molecule
m = Molecule()

create a residue named UNK in that molecule, with sequence position 1, no chain ID, and no insertion code
r = m.newResidue("UNK", " ", 1, " ")

assign a name to the molecule for display in the model panel and so forth
m.name = "molecule_name"

create the appropriate chemical element
element = Element(text or integer)

make a new atom with the appropriate name and element
a = m.newAtom("atom_name", element)

add the atom to the residue
r.addAtom(a)

assign the atom's xyz coordinate
a.setCoord(Coord(x, y, z))

assign a serial number to the atom
a.serialNumber = serial

make appropriate bonds between the atoms
connectMolecule(m)

return a list of models (Molecules) to open
return [m]

Geez, that already was a lot.  Anyway, let's ignore the file's "critical points" for a second so that we can finish with getting this open in Chimera.  Basically, you will package this as an extension to Chimera that doesn't put anything in the Tools menu (or model panel) but just adds to the file types that Chimera knows how to open with the File->Open dialog and with the "open" command (ala "open coords.xyz").  To do so, in the same folder as your file-reading code you will need a file named ChimeraExtension.py that has this in it:

----
def aimallOpen(fileName):
from ReadAimall import readAimall
return readAimall(fileName)

import chimera
chimera.fileInfo.register("AIMAll mgpviz", aimallOpen, [".mgpviz"], ["mpgviz"],
category=chimera.FileInfo.STRUCTURE)
----
The above code assumes that the folder containing your code is named "ReadAimall", that the file-reading function is named "readAimall", that it is in a file named "__init__.py" in the folder, and that the files are ".mgpviz" files. The second list in the register call (["mpgviz"]) allows the file type to be specified with a "mpgviz:" prefix in an "open" command should the file not actually have a .mgpviz suffix.
You can then get Chimera to find this extension by adding the folder above the ReadAimall folder to the list in the Locations section of Chimera's Tools preferences (remember to click Save afterward), i.e. you add the folder containing new tools (in this case, the folder above ReadAimall) rather than each tool folder itself.

Okay, back to the critical points.  Depending somewhat on what you want to learn from them, I see four possible options:  1) fake atoms;  2) markers;  3) sphere shapes;  4) bond colors.  In the below, I tend to put the critical points in their own model, since having fake atoms mixed into a real molecule will mess up things like hydrogen bond finding, aromatic ring determination, etc.

Fake Atoms
In this scenario, you would create a second Molecule as you read the file and add the critical points as atoms to that.  You include the additional Molecule in the list of models you return ("return [m, m2]").   You would not call connectMolecule() on the second Molecule, but might add pseudobonds from the critical points to the appropriate atoms (you can't add regular bonds between models).  The second molecule will have the same ID and sub-ID # as the first one, and will move in tandem with it.  It will show up in the model panel.

Markers
Markers are what the Volume Tracer tool uses to mark volume data.  They're really fake atoms, but have their own little support infrastructure.  A simple example of using them is in the markeruse.py script on our Scripts page: http://plato.cgl.ucsf.edu/trac/chimera/wiki/Scripts .  They would have the same limitation in that they could only connect to the "real" atoms via pseudobonds.  Also, they would only move in tandem with the real molecule as long as both models are "active" (which is usually the case unless you specifically do something to make their active states different).

Sphere Shapes
These are shapes (surfaces, really) created by the "shape" command.  Probably the easiest way to create them is something like:

from chimera import runCommand
runCommand("shape sphere radius rad center x,y,z modelName 'critical points' modelId 100")

which would put them all in model #100.  If you wanted them in the same model number as the molecule, that would require fancier code.  You could look at Aniso/__init__.py or at sphere_shape() in Shape/shapecmd.py for examples of that.

Bond Colors
If the critical points are really associated with bonds and are trying to convey properties of the bonds, you could vary the thickness or color of the bonds instead.  To find the Bond object b between Atoms a1 and a2, you would do this:

b = a1.atomsMap(a2)

To change the bond radius, you would show it as stick and change the radius:

b.drawMode = chimera.Bond.Stick
b.radius = radius

To change the color, you would make sure it wasn't in "halfbond" mode (each half colored the same as its endpoint atom) and then set the color:

b.halfbond = False
b.color = chimera.MaterialColor(red, green, blue, opacity)

red / green / blue / opacity all in the range 0-1.
So finally, this is really a developer-oriented subject, so I have directed follow ups to chimera-dev instead of chimera-users.  Feel free to ask additional questions there…

--Eric


                        Eric Pettersen
                        UCSF Computer Graphics Lab
                        http://www.cgl.ucsf.edu


On Jan 5, 2015, at 1:33 PM, ros <rodrigogalindo@gmail.com> wrote:

Hello!

I would like to ask for advice and starting directions to be able to
parse a new file format in Chimera so I can use Chimera's tools and
generate images.

The file format that I want to be able to open is generated from the
Atoms in Molecules program AIMAll ( http://aim.tkgristmill.com/ )

The AIMAll program of course can also do visualization and is very
good at it.  I am attaching an example of how a molecule looks.  The
problem is that if you want to work with big biomolecules (like DNA),
the program is not very good to cloak/hide/select atoms so you have to
click atom by atom to hide it and make some sense of the
visualization.  So, I will try to make a parser (or something that you
would recommend) to open the file in Chimera and use Chimera's masking
rules to select/deselect, hide/show atoms, which is very powerful.

The text output generated by AIMAll has an XYZ list for each atom like this:

Nuclear Charges and Cartesian Coordinates:
-------------------------------------------------------------------------------
Atom      Charge                X                  Y                  Z
-------------------------------------------------------------------------------
C1         6.0           0.0000000000E+00   2.3265459100E+00   0.0000000000E+00
C2         6.0           0.0000000000E+00   0.0000000000E+00   1.7647056500E+00
C3         6.0           0.0000000000E+00   0.0000000000E+00  -1.7647056500E+00
H4         1.0           1.6866221200E+00   3.4814514700E+00   0.0000000000E+00
H5         1.0          -1.6866221200E+00   3.4814514700E+00   0.0000000000E+00
C6         6.0          -2.0148478600E+00  -1.1632729600E+00   0.0000000000E+00
H7         1.0          -2.1717143500E+00  -3.2013833400E+00   0.0000000000E+00
H8         1.0          -3.8583364700E+00  -2.8006813000E-01   0.0000000000E+00
C9         6.0           2.0148478600E+00  -1.1632729600E+00   0.0000000000E+00
H10        1.0           2.1717143500E+00  -3.2013833400E+00   0.0000000000E+00
H11        1.0           3.8583364700E+00  -2.8006813000E-01   0.0000000000E+00
H12        1.0           0.0000000000E+00   0.0000000000E+00   3.8040484300E+00
H13        1.0           0.0000000000E+00   0.0000000000E+00  -3.8040484300E+00


That is easy, I think.  But as you can see from the attached image, I
want to be able to visualize the green spheres (which are called
critical points and represents special properties of the electron
density, extracted from quantum mechanical calculations).  Those
points are represented in the output file as:

CP# 16     Coords =  5.97894312844235E-20  1.21974356425640E+00
-9.60854463947958E-01
          Type = (3,-1) BCP C1 C3
          Rho =  2.4067790431E-01
          GradRho =  3.5016504866E-18 -2.7948129921E-14  1.7716730860E-14
          HessRho_EigVals = -4.4278076226E-01 -4.3836581782E-01
3.5682199801E-01
          HessRho_EigVec1 =  1.0000000000E+00  0.0000000000E+00
0.0000000000E+00
          HessRho_EigVec2 =  0.0000000000E+00 -6.1321358320E-01
7.8991714842E-01
          HessRho_EigVec3 =  0.0000000000E+00  7.8991714842E-01
6.1321358320E-01
          DelSqRho = -5.2432458207E-01
          Bond Ellipticity =  1.0071370222E-02
          V = -2.5219393995E-01
          G =  6.0556397216E-02
CP# 18     Coords =  1.05289204670721E+00  3.04112062239339E+00
1.96757752864282E-18
          Type = (3,-1) BCP H4 C1
          Rho =  2.9524693796E-01
          GradRho =  1.0061396161E-16 -1.6479873022E-16  1.6660693347E-18
          HessRho_EigVals = -7.9444808957E-01 -7.8708168641E-01
4.1039750300E-01
          HessRho_EigVec1 = -5.7017191910E-01  8.2152539989E-01
0.0000000000E+00
          HessRho_EigVec2 =  0.0000000000E+00  0.0000000000E+00
1.0000000000E+00
          HessRho_EigVec3 =  8.2152539989E-01  5.7017191910E-01
0.0000000000E+00
          DelSqRho = -1.1711322730E+00
          Bond Ellipticity =  9.3591342377E-03
          V = -3.7782718105E-01
          G =  4.2522056404E-02

etc etc etc

First line indicates the critical point number followed by the XYZ
coordinate of the point, and the second line shows which atoms are
involved between that critical point.  The rest is the electronic
properties of the critical point (nothing to visualize there)

So, I am guessing that the critical points can be represented as dummy
atoms in Chimera following the XYZ coordinates?

The idea is that first the molecule coordinates are parsed and the
molecule is displayed and then display the critical points of each
atom.  If possible, show lines joining atoms that have a critical
point between them...

I know it is a difficult task, but maybe you can provide some starting
directions?  Anything will help because right now is double clicking
1000+ atoms!

Thank you so much and have a good day,

Rodrigo.