<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hi Rodrigo,<div><span class="Apple-tab-span" style="white-space:pre">        </span>There is code in Chimera to read XYZ files, which are somewhat similar, so you could base you code off of that. &nbsp;The XYZ-reading code is in &lt;your Chimera&gt;/share/ReadXYZ/__init__.py, the readXYZ() function. &nbsp;On a Mac, "&lt;your Chimera&gt;" is actually Chimera.app/Contents/Resources. &nbsp;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. &nbsp;Here's a digest version:</div><div><div><br></div><div><i>import objects/functions we will be using</i></div></div><div>from chimera import Molecule, Element, Coord, connectMolecule</div><div><br></div><div><i>create a new empty molecule</i></div><div>m = Molecule()</div><div><br></div><div><i>create a residue named UNK in that molecule, with sequence position 1, no chain ID, and no insertion code</i></div><div>r = m.newResidue("UNK", " ", 1, " ")</div><div><br></div><div><i>assign a name to the molecule for display in the model panel and so forth</i></div><div>m.name = "<i>molecule_name</i>"</div><div><br></div><div><i>create the appropriate chemical element</i></div><div>element = Element(<i>text or integer</i>)</div><div><br></div><div><i>make a new atom with the appropriate name and element</i></div><div>a = m.newAtom("<i>atom_name</i>", element)</div><div><br></div><div><i>add the atom to the residue</i></div><div>r.addAtom(a)</div><div><br></div><div><i>assign the atom's xyz coordinate</i></div><div>a.setCoord(Coord(<i>x</i>, <i>y</i>, <i>z</i>))</div><div><br></div><div><i>assign a serial number to the atom</i></div><div>a.serialNumber = <i>serial</i></div><div><br></div><div><i>make appropriate bonds between the atoms</i></div><div>connectMolecule(m)</div><div><br></div><div><i>return a list of models (Molecules) to open</i></div><div>return [m]</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>Geez, that already was a lot. &nbsp;Anyway, let's ignore the file's "critical points" for a second so that we can finish with getting this open in Chimera. &nbsp;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-&gt;Open dialog and with the "open" command (<i>ala</i>&nbsp;"open coords.xyz"). &nbsp;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:</div><div><br></div><div>----</div><div>def aimallOpen(fileName):</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>from ReadAimall import readAimall</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>return readAimall(fileName)</div><div><br></div><div>import chimera</div><div>chimera.fileInfo.register("AIMAll mgpviz", aimallOpen, [".mgpviz"], ["mpgviz"],</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>category=chimera.FileInfo.STRUCTURE)</div><div>----</div><div>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.</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>You can then get Chimera to find this extension by adding the folder <i>above</i>&nbsp;the ReadAimall folder to the list in the Locations section of Chimera's Tools preferences (remember to click Save afterward), <i>i.e.</i>&nbsp;you add the folder containing new tools (in this case, the folder above ReadAimall) rather than each tool folder itself.</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>Okay, back to the critical points. &nbsp;Depending somewhat on what you want to learn from them, I see four possible options: &nbsp;1) fake atoms; &nbsp;2) markers; &nbsp;3) sphere shapes; &nbsp;4) bond colors. &nbsp;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, <i>etc</i>.</div><div><br></div><div><b>Fake Atoms</b></div><div>In this scenario, you would create a second Molecule as you read the file and add the critical points as atoms to that. &nbsp;You include the additional Molecule in the list of models you return ("return [m, m2]"). &nbsp; 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). &nbsp;The second molecule will have the same ID and sub-ID # as the first one, and will move in tandem with it. &nbsp;It will show up in the model panel.</div><div><br></div><div><b>Markers</b></div><div>Markers are what the Volume Tracer tool uses to mark volume data. &nbsp;They're really fake atoms, but have their own little support infrastructure. &nbsp;A simple example of using them is in the markeruse.py script on our Scripts page:&nbsp;<a href="http://plato.cgl.ucsf.edu/trac/chimera/wiki/Scripts">http://plato.cgl.ucsf.edu/trac/chimera/wiki/Scripts</a> . &nbsp;They would have the same limitation in that they could only connect to the "real" atoms via pseudobonds. &nbsp;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).</div><div><br></div><div><b>Sphere Shapes</b></div><div>These are shapes (surfaces, really) created by the "shape" command. &nbsp;Probably the easiest way to create them is something like:</div><div><br></div><div>from chimera import runCommand</div><div>runCommand("shape sphere radius <i>rad</i>&nbsp;center <i>x</i>,<i>y</i>,<i>z</i>&nbsp;modelName 'critical points' modelId 100")</div><div><br></div><div>which would put them all in model #100. &nbsp;If you wanted them in the same model number as the molecule, that would require fancier code. &nbsp;You could look at Aniso/__init__.py or at sphere_shape() in Shape/shapecmd.py for examples of that.</div><div><br></div><div><b>Bond Colors</b></div><div>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. &nbsp;To find the Bond object <i>b</i> between Atoms <i>a1</i>&nbsp;and <i>a2</i>, you would do this:</div><div><br></div><div><i>b</i>&nbsp;= <i>a1</i>.atomsMap(<i>a2</i>)</div><div><br></div><div>To change the bond radius, you would show it as stick and change the radius:</div><div><br></div><div>b.drawMode = chimera.Bond.Stick</div><div>b.radius = <i>radius</i></div><div><i><br></i></div><div>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:</div><div><br></div><div>b.halfbond = False</div><div>b.color = chimera.MaterialColor(<i>red</i>, <i>green</i>, <i>blue</i>, <i>opacity</i>)</div><div><br></div><div><i>red</i>&nbsp;/ <i>green</i>&nbsp;/ <i>blue</i>&nbsp;/ <i>opacity</i>&nbsp;all in the range 0-1.</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>So finally, this is really a developer-oriented subject, so I have directed follow ups to chimera-dev instead of chimera-users. &nbsp;Feel free to ask additional questions there…</div><div><br></div><div>--Eric</div><div><br><br><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Eric Pettersen<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;UCSF Computer Graphics Lab<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<a href="http://www.cgl.ucsf.edu">http://www.cgl.ucsf.edu</a><br><br></div><br></div><div><div><div>On Jan 5, 2015, at 1:33 PM, ros &lt;<a href="mailto:rodrigogalindo@gmail.com">rodrigogalindo@gmail.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Hello!<br><br>I would like to ask for advice and starting directions to be able to<br>parse a new file format in Chimera so I can use Chimera's tools and<br>generate images.<br><br>The file format that I want to be able to open is generated from the<br>Atoms in Molecules program AIMAll ( <a href="http://aim.tkgristmill.com/">http://aim.tkgristmill.com/</a> )<br><br>The AIMAll program of course can also do visualization and is very<br>good at it. &nbsp;I am attaching an example of how a molecule looks. &nbsp;The<br>problem is that if you want to work with big biomolecules (like DNA),<br>the program is not very good to cloak/hide/select atoms so you have to<br>click atom by atom to hide it and make some sense of the<br>visualization. &nbsp;So, I will try to make a parser (or something that you<br>would recommend) to open the file in Chimera and use Chimera's masking<br>rules to select/deselect, hide/show atoms, which is very powerful.<br><br>The text output generated by AIMAll has an XYZ list for each atom like this:<br><br>Nuclear Charges and Cartesian Coordinates:<br>-------------------------------------------------------------------------------<br>Atom &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Charge &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Y &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Z<br>-------------------------------------------------------------------------------<br>C1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.0000000000E+00 &nbsp;&nbsp;2.3265459100E+00 &nbsp;&nbsp;0.0000000000E+00<br>C2 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.0000000000E+00 &nbsp;&nbsp;0.0000000000E+00 &nbsp;&nbsp;1.7647056500E+00<br>C3 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.0000000000E+00 &nbsp;&nbsp;0.0000000000E+00 &nbsp;-1.7647056500E+00<br>H4 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.6866221200E+00 &nbsp;&nbsp;3.4814514700E+00 &nbsp;&nbsp;0.0000000000E+00<br>H5 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1.6866221200E+00 &nbsp;&nbsp;3.4814514700E+00 &nbsp;&nbsp;0.0000000000E+00<br>C6 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-2.0148478600E+00 &nbsp;-1.1632729600E+00 &nbsp;&nbsp;0.0000000000E+00<br>H7 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-2.1717143500E+00 &nbsp;-3.2013833400E+00 &nbsp;&nbsp;0.0000000000E+00<br>H8 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-3.8583364700E+00 &nbsp;-2.8006813000E-01 &nbsp;&nbsp;0.0000000000E+00<br>C9 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.0148478600E+00 &nbsp;-1.1632729600E+00 &nbsp;&nbsp;0.0000000000E+00<br>H10 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.1717143500E+00 &nbsp;-3.2013833400E+00 &nbsp;&nbsp;0.0000000000E+00<br>H11 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.8583364700E+00 &nbsp;-2.8006813000E-01 &nbsp;&nbsp;0.0000000000E+00<br>H12 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.0000000000E+00 &nbsp;&nbsp;0.0000000000E+00 &nbsp;&nbsp;3.8040484300E+00<br>H13 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.0000000000E+00 &nbsp;&nbsp;0.0000000000E+00 &nbsp;-3.8040484300E+00<br><br><br>That is easy, I think. &nbsp;But as you can see from the attached image, I<br>want to be able to visualize the green spheres (which are called<br>critical points and represents special properties of the electron<br>density, extracted from quantum mechanical calculations). &nbsp;Those<br>points are represented in the output file as:<br><br>CP# 16 &nbsp;&nbsp;&nbsp;&nbsp;Coords = &nbsp;5.97894312844235E-20 &nbsp;1.21974356425640E+00<br>-9.60854463947958E-01<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = (3,-1) BCP C1 C3<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rho = &nbsp;2.4067790431E-01<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GradRho = &nbsp;3.5016504866E-18 -2.7948129921E-14 &nbsp;1.7716730860E-14<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HessRho_EigVals = -4.4278076226E-01 -4.3836581782E-01<br>3.5682199801E-01<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HessRho_EigVec1 = &nbsp;1.0000000000E+00 &nbsp;0.0000000000E+00<br>0.0000000000E+00<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HessRho_EigVec2 = &nbsp;0.0000000000E+00 -6.1321358320E-01<br>7.8991714842E-01<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HessRho_EigVec3 = &nbsp;0.0000000000E+00 &nbsp;7.8991714842E-01<br>6.1321358320E-01<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DelSqRho = -5.2432458207E-01<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bond Ellipticity = &nbsp;1.0071370222E-02<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;V = -2.5219393995E-01<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G = &nbsp;6.0556397216E-02<br>CP# 18 &nbsp;&nbsp;&nbsp;&nbsp;Coords = &nbsp;1.05289204670721E+00 &nbsp;3.04112062239339E+00<br>1.96757752864282E-18<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = (3,-1) BCP H4 C1<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rho = &nbsp;2.9524693796E-01<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GradRho = &nbsp;1.0061396161E-16 -1.6479873022E-16 &nbsp;1.6660693347E-18<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HessRho_EigVals = -7.9444808957E-01 -7.8708168641E-01<br>4.1039750300E-01<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HessRho_EigVec1 = -5.7017191910E-01 &nbsp;8.2152539989E-01<br>0.0000000000E+00<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HessRho_EigVec2 = &nbsp;0.0000000000E+00 &nbsp;0.0000000000E+00<br>1.0000000000E+00<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HessRho_EigVec3 = &nbsp;8.2152539989E-01 &nbsp;5.7017191910E-01<br>0.0000000000E+00<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DelSqRho = -1.1711322730E+00<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bond Ellipticity = &nbsp;9.3591342377E-03<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;V = -3.7782718105E-01<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G = &nbsp;4.2522056404E-02<br><br>etc etc etc<br><br>First line indicates the critical point number followed by the XYZ<br>coordinate of the point, and the second line shows which atoms are<br>involved between that critical point. &nbsp;The rest is the electronic<br>properties of the critical point (nothing to visualize there)<br><br>So, I am guessing that the critical points can be represented as dummy<br>atoms in Chimera following the XYZ coordinates?<br><br>The idea is that first the molecule coordinates are parsed and the<br>molecule is displayed and then display the critical points of each<br>atom. &nbsp;If possible, show lines joining atoms that have a critical<br>point between them...<br><br>I know it is a difficult task, but maybe you can provide some starting<br>directions? &nbsp;Anything will help because right now is double clicking<br>1000+ atoms!<br><br>Thank you so much and have a good day,<br><br>Rodrigo.</blockquote></div></div></body></html>