def load_coords_pymol(self, coordslist, oname, index=1): # pragma: no cover """load the coords into pymol the new object must be named oname so we can manipulate it later Parameters ---------- coordslist : list of arrays oname : str the new pymol object must be named oname so it can be manipulated later index : int we can have more than one molecule on the screen at one time. index tells which one to draw. They are viewed at the same time, so should be visually distinct, e.g. different colors. accepted values are 1 or 2 Notes ----- the implementation here is a bit hacky. we create a temporary xyz file from coords and load the molecule in pymol from this file. """ # pymol is imported here so you can do, e.g. basinhopping without installing pymol import pymol # create the temporary file suffix = ".xyz" f = tempfile.NamedTemporaryFile(mode="w", suffix=suffix) fname = f.name # write the coords into the xyz file from pele.mindist import CoMToOrigin for coords in coordslist: coords = CoMToOrigin(coords.copy()) write_xyz(f, coords, title=oname, atomtypes=["LA"]) f.flush() # load the molecule from the temporary file pymol.cmd.load(fname) # get name of the object just create and change it to oname objects = pymol.cmd.get_object_list() objectname = objects[-1] pymol.cmd.set_name(objectname, oname) # set the representation pymol.cmd.hide("everything", oname) pymol.cmd.show("spheres", oname) # set the color according to index if index == 1: pymol.cmd.color("red", oname) else: pymol.cmd.color("gray", oname)
def load_coords_pymol(self, coordslist, oname, index=1): """load the coords into pymol the new object must be named oname so we can manipulate it later Parameters ---------- coordslist : list of arrays oname : str the new pymol object must be named oname so it can be manipulated later index : int we can have more than one molecule on the screen at one time. index tells which one to draw. They are viewed at the same time, so should be visually distinct, e.g. different colors. accepted values are 1 or 2 Notes ----- the implementation here is a bit hacky. we create a temporary xyz file from coords and load the molecule in pymol from this file. """ # pymol is imported here so you can do, e.g. basinhopping without installing pymol import pymol # create the temporary file suffix = ".pdb" f = tempfile.NamedTemporaryFile(mode="w", suffix=suffix) fname = f.name from simtk.openmm.app import pdbfile as openmmpdb # write the coords into pdb file from pele.mindist import CoMToOrigin ct = 0 for coords in coordslist: ct += 1 coords = CoMToOrigin(coords.copy()) self.potential.copyToLocalCoords(coords) from simtk.unit import angstrom as openmm_angstrom # openmmpdb.PDBFile.writeFile(self.potential.prmtop.topology , self.potential.localCoords * openmm_angstrom , file=sys.stdout, modelIndex=1) openmmpdb.PDBFile.writeModel(self.potential.prmtop.topology, self.potential.localCoords * openmm_angstrom, file=f, modelIndex=ct) print "closing file" f.flush() # load the molecule from the temporary file pymol.cmd.load(fname) # get name of the object just created and change it to oname objects = pymol.cmd.get_object_list() objectname = objects[-1] pymol.cmd.set_name(objectname, oname) # set the representation pymol.cmd.hide("everything", oname) pymol.cmd.show("lines", oname)