On Feb 22, 2008, at 7:59 AM, Jean-Didier Maréchal wrote:

Hi again,


that follows an e-mail exchange with Eric a while ago. 


I am trying to place a given atom (for the moment, helium is fine) to

given x,y,z coordinates. You told me that the new BuildStructure module

could do that, unfortunately after having imported the module

import BuildStructure

when I do 

BuildStructure.placeHelium(res,model=0,position=13.2909,75.4474,25.4248)

I have 

SyntaxError: non-keyword arg after keyword arg

I tried different argumentations of this but I can't have it working, if

you can tell me how to do this, that would be perfect.


All the best,

JD


Hi JD,
The are a few things wrong with your placeHelium() call, some of them due to incorrect Python syntax (thereby producing the SyntaxError) and some from not providing the kind of input the routine expects.  They are actually interrelated in your case.
As mentioned in the doc string for the placeHelium() function, the 'model' argument has to be a string or a chimera.Molecule instance, not an integer.  If it's a string, a new Molecule will be created with that string as its name.  If you want to put the atom in model 0 (it seems like you do), you need to get the Molecule instance of model 0.  Like so:

from chimera import openModels, Molecule
model0 = openModels.list(id=0, modelTypes=[Molecule])[0]

The 'modelTypes=' part isn't necessary if the only thing in model 0 is a structure, but if you have a surface on the structure (which is a separate model of type MSMSModel) then you do need it.
Similarly, the 'position' argument needs to be a chimera.Point instance or None.  If None, the atom will be placed in the center of the view.  Clearly, you want a Point, like so:

from chimera import Point
pt = Point(13.2909,75.4474,25.4248)

This also where the syntax error occurred.  Commas separate arguments in Python calls, so the second and third numbers in your placeHelium() call were interpreted as additional arguments, not as part of the value being specified for the 'position' keyword.  You would have needed to surround the three numbers with parentheses to have them treated as a single argument (which would have avoided the SyntaxError but would have still failed since it wasn't a Point instance).

With the above, your call to placeHelium would be:

BuildStructure.placeHelium(res, model=model0, position=pt)

--Eric