This is great. Thanks a lot. I am wondering, are there any scripts/ plugins for PyMOL out there that facilitate the generation of a large amount of rotamers for different mutants? I might take the effort and start building this into a plugin.
Martin Am 16.09.10 19:51, schrieb Jason Vertrees: > Hi Martin, > > This took a bit of work to figure out, but the following code solves > your problem (above). It will download a PDB (I coded "1RSY") and > select a residue (I coded 236). I will then mutate that residue to > all possible residues given what the rotamer library knows about, and > write that out to N-files called "stateXYZ.pdb", where XYZ is the > mutation number. Instead of rewriting the code, it turns out you can > hack the wizard through the API to do what you want: > > # begin a python block of code; > python > org = "1rsy" > cpy = "1rsy_cpy" > > # fetch a PDB > cmd.fetch(org, async=0) > > # make a copy on which to operate > cmd.create(cpy,org) > res = cpy + " and i. 236" > > # focus no the residue, if you want > cmd.zoom(res, 3) > > # start the wizard to count the number of rotamers for this residue > cmd.wizard("mutagenesis") > > # this was the painful part: if you just write "res" instead of "(res)" > # pymol will delete your residue. "(res)" make it an anonymous selection > cmd.get_wizard().do_select("("+res+")") > nStates = cmd.count_states("mutation") > > # foreach state, make the change and write to disk > for i in range(1,nStates+1): > print "State ", i, "/", nStates > cmd.get_wizard().do_select("("+res+")") > cmd.frame(i) > cmd.get_wizard().apply() > cmd.save("state" + str(i) + ".pdb", cpy) > cmd.delete(cpy) > cmd.create(cpy,org) > > # end the python block > python end > > # quit the wizard > cmd.set_wizard() > > Cheers, > > -- Jason > > On Tue, Sep 14, 2010 at 6:33 PM, Martin Hediger<ma....@bluewin.ch> wrote: >> I'm beginning to see things. >> When I issue: >> >> for value in rot_lib[('ASP', 40, -100)]: >> rl.write(str(value) + '\n') >> >> rot_lib is being initiated by >> >> rot_lib = >> pickle.load(open("/Applications/PyMOLX11Hybrid.app/pymol/data/chempy/sidechains/sc_bb_dep.pkl",'r')) >> >> >> I get the following output: >> {('N', 'CA', 'CB', 'CG'): -169.69999999999999, 'FREQ': 0.47735699999999998, >> ('CA', 'CB', 'CG', 'OD1'): 3.6000000000000001} >> {('N', 'CA', 'CB', 'CG'): -173.5, 'FREQ': 0.19134399999999999, ('CA', 'CB', >> 'CG', 'OD1'): 56.799999999999997} >> {('N', 'CA', 'CB', 'CG'): -72.099999999999994, 'FREQ': 0.11949799999999999, >> ('CA', 'CB', 'CG', 'OD1'): -12.9} >> {('N', 'CA', 'CB', 'CG'): -167.80000000000001, 'FREQ': 0.108205, ('CA', >> 'CB', 'CG', 'OD1'): -55.5} >> {('N', 'CA', 'CB', 'CG'): -64.599999999999994, 'FREQ': 0.075302999999999995, >> ('CA', 'CB', 'CG', 'OD1'): -50.0} >> {('N', 'CA', 'CB', 'CG'): 62.399999999999999, 'FREQ': 0.013899, ('CA', 'CB', >> 'CG', 'OD1'): 1.3} >> >> I understand these are dictionaries containing the phi, psi values for a >> rotamer. Now this would mean in this case there are six rotamers for this >> situation. Starting to get closer to what i want. >> Still, if there is a easy way to get PDB files of every rotamer, that would >> solve my problem. >> So the thing left to figure out is how to find the right key for the rot_lib >> to give me the rotamers of the residue i am actually interested in. >> >> Thanks again for the support. >> >> Martin >> >> >> >> >> >> >> Am 14.09.10 01:01, schrieb Jason Vertrees: >>> Hi Martin, >>> >>> Try replacing >>> >>>> (phi, psi) = cmd.phi_psi("br. first my_res") >>> with >>> >>> (phi, psi) = cmd.phi_psi("br. first my_res").values()[0] >>> >>> >>> Here's what I have now, for the script (I fixed one more bug): >>> import pickle >>> rot_lib = >>> pickle.load(open("/Applications/PyMOLX11Hybrid.app/pymol/data/chempy/sidechains/sc_bb_dep.pkl",'r')) >>> from pymol import stored >>> from pymol import cmd >>> stored.r = '' >>> >>> # What are we doing here? What is 'first'? >>> >>> cmd.iterate("first my_res", "stored.r = resn") >>> >>> (phi, psi) = cmd.phi_psi("br. first my_res").values()[0] >>> key = (stored.r, int(10*round(phi/10)), int(10*round(psi/10))) >>> >>> if key in rot_lib.keys(): >>> print "This rot has %s possible positions" % len(rot_lib[key]) >>> >>> >>> >>> Cheers, >>> >>> -- Jason >>> >>> On Mon, Sep 13, 2010 at 5:04 PM, Martin Hediger<ma....@bluewin.ch> wrote: >>>> Hi Jason and PyMOL users >>>> I tried to run the script to get the number of rotamers, but I seem to >>>> have >>>> something missing. >>>> The script looks as follows: >>>> >>>> import pickle >>>> rot_lib = >>>> >>>> pickle.load(open("/Applications/PyMOLX11Hybrid.app/pymol/data/chempy/sidechains/sc_bb_dep.pkl",'r')) >>>> from pymol import stored >>>> from pymol import cmd >>>> stored.r = '' >>>> >>>> # What are we doing here? What is 'first'? >>>> cmd.iterate("first my_res", "stored.r = resn") >>>> >>>> (phi, psi) = cmd.phi_psi("br. first my_res") >>>> key = (stored.r, int(10*round(ph/10)), int(10*round(psi/10))) >>>> if key in rot_lib.keys(): >>>> print "This rot has %s possible positions" % len(rot_lib[key]) >>>> >>>> Now, I save this into rotlib.py, 'cd' PyMOL into the directory where this >>>> script lies, select a residue from the GUI, rename the selection to >>>> 'my_res' >>>> and then 'run rotlib.py' the script. This returns the following ERROR >>>> message in PyMOL: >>>> >>>> Traceback ... >>>> (phi, psi) = cmd.phi_psi("br. first my_res") >>>> ValueError: need more than 0 values to unpack >>>> >>>> Unfortunately, I dont understand what this is trying to tell me right >>>> now, >>>> ok, some Argument seems to be missing, but I cant tell what exactly. >>>> Also, >>>> could you possibly extend your explanation on what the 'iterate' method >>>> is >>>> used for. I think this would help me a lot. >>>> >>>> As I said, all I want is a PDB file for every rotamer itself. If there is >>>> a >>>> simpler way to achieve this, that is fine with me. The number of rotamers >>>> is >>>> only important to me, since I need to know how many times i should issue >>>> 'cmd.forward()' and save. >>>> >>>> Thanks for the help. >>>> Martin >>>> >>>> >>>> >>>> Am 13.09.10 00:30, schrieb Jason Vertrees: >>>>> Hi Martin, >>>>> >>>>>> iterate first my_res, stored.r = resn >>>>> is syntactically correct, but could also be written, >>>>> >>>>> cmd.iterate("first my_res", "stored.r = resn"); >>>>> >>>>> The command could be read as, "iterate over just first atom from the >>>>> selection called 'my_res' and place the residue name in which that >>>>> atom resides into 'stored.r'." So, "first" is a new-ish selection >>>>> modifier that takes just the first atom from a selection. It's _very_ >>>>> handy: why iterate through all atoms in a residue to get a residue >>>>> name, when just the first will do? "resn" indeed returns the 3-letter >>>>> residue code. >>>>> >>>>> A more efficient way might be: >>>>> >>>>> # select a residue, here #50 (or use the mouse) >>>>> select mySelection, i. 50 >>>>> >>>>> # get it's one-letter residue id >>>>> print string.split(cmd.get_fastastr("mySelection"),'\n')[1] >>>>> # get it's three-letter residue id >>>>> print >>>>> three_letter[string.split(cmd.get_fastastr("mySelection"),'\n')[1]] >>>>> >>>>> I just posted this on http://www.pymolwiki.org/index.php/Aa_codes. >>>>> (You will need the two dictionaries found there.) >>>>> >>>>> There really should be a much easier way to do that... Maybe someone >>>>> has a far easier command? >>>>> >>>>> Cheers, >>>>> >>>>> -- Jason >>>>> >>>>> >>>>> >>>>> >>>>> On Sun, Sep 12, 2010 at 4:25 PM, Martin Hediger<ma....@bluewin.ch> >>>>> wrote: >>>>>> Hi Jason, thanks for the comprehensive answer. >>>>>> One question though, is the line >>>>>> >>>>>> iterate first my_res, stored.r = resn >>>>>> >>>>>> >>>>>> >>>>>> correct this way? Are there no braces or quotation marks needed? Its >>>>>> not >>>>>> perfectly clear to me if 'first' and 'my_res' are selections (indicated >>>>>> by >>>>>> braces) or objects (name without braces in the main window). >>>>>> I understand 'resn' is something like 'GLU', if I want to know how many >>>>>> GLU >>>>>> rotamers are in the library. >>>>>> >>>>>> Thanks again >>>>>> Martin >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> Am 12.09.10 22:00, schrieb Jason Vertrees: >>>>>>> Hi Martin, >>>>>>> >>>>>>> PyMOL first searches the Dunbrack rotamer library for hits based upon >>>>>>> the amino acid type and it's original phi/psi angles. If it cannot >>>>>>> find a hit, it will then look for backbone independent positions. To >>>>>>> get the number of available rotamers given a residue, you need to >>>>>>> unpickle the library, create the lookup key into the library and then >>>>>>> count the results. It might look something like this: >>>>>>> >>>>>>> # unpickle the library >>>>>>> import pickle >>>>>>> rot_lib = >>>>>>> >>>>>>> >>>>>>> pickle.load(open("$PYMOL_HOME/data/chempy/sidechains/sc_bb_dep.pkl",'r')) >>>>>>> >>>>>>> # get residue name, you need to select the residue >>>>>>> # into "my_res" >>>>>>> from pymol import stored >>>>>>> stored.r = '' >>>>>>> iterate first my_res, stored.r = resn >>>>>>> >>>>>>> # get residue info; prepare dictionary key >>>>>>> (phi,psi) = cmd.phi_psi("br. first my_res") >>>>>>> >>>>>>> # warren also does 20 and 60 in place of 10--three possible lookups >>>>>>> key = ( stored.r, int(10*round(phi/10)), int(10*round(psi/10))) >>>>>>> >>>>>>> if key in rot_lib.keys(): >>>>>>> print "This rotamer has %s possible positions" % len(rot_lib[key]) >>>>>>> >>>>>>> Lookups in the independent library are easier--just provide a residue >>>>>>> name. >>>>>>> >>>>>>> Cheers, >>>>>>> >>>>>>> -- Jason >>>>>>> >>>>>>> >>>>>>> On Sun, Sep 12, 2010 at 11:04 AM, Martin Hediger<ma....@bluewin.ch> >>>>>>> wrote: >>>>>>>> Dear all, let me rephrase my question in a less confusing way. >>>>>>>> For a given mutant, I need a PDB file for every available rotamer. I >>>>>>>> guess thats the simplest way of putting it. How can I achieve that? >>>>>>>> >>>>>>>> Thanks for hints. >>>>>>>> Martin >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> Am 12.09.10 00:08, schrieb Martin Hediger: >>>>>>>>> Hi all >>>>>>>>> I want to do some scripted mutations on a range of residues. Say I >>>>>>>>> want >>>>>>>>> to mutate residue 189 to every rotamer of [Asp, His, Glu, Thr, Lys] >>>>>>>>> available in the PyMOL internal rotamer library. I'm seeing that >>>>>>>>> PyMOL >>>>>>>>> issues cmd.get_wizard().do_state(i) to select rotamer 'i' for a >>>>>>>>> mutation. Now, if I want to iterate over all available rotamers, I >>>>>>>>> need >>>>>>>>> the limit rotamer number. How can I obtain the maximum number of >>>>>>>>> rotamers available for every amino acid? >>>>>>>>> >>>>>>>>> Thanks for hints on this >>>>>>>>> >>>>>>>>> Martin >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> ------------------------------------------------------------------------------ >>>>>>>>> Start uncovering the many advantages of virtual appliances >>>>>>>>> and start using them to simplify application deployment and >>>>>>>>> accelerate your shift to cloud computing >>>>>>>>> http://p.sf.net/sfu/novell-sfdev2dev >>>>>>>>> _______________________________________________ >>>>>>>>> PyMOL-users mailing list (PyMOL-users@lists.sourceforge.net) >>>>>>>>> Info Page: https://lists.sourceforge.net/lists/listinfo/pymol-users >>>>>>>>> Archives: >>>>>>>>> http://www.mail-archive.com/pymol-users@lists.sourceforge.net >>>>>>>>> >>>>>>>> >>>>>>>> ------------------------------------------------------------------------------ >>>>>>>> Start uncovering the many advantages of virtual appliances >>>>>>>> and start using them to simplify application deployment and >>>>>>>> accelerate your shift to cloud computing >>>>>>>> http://p.sf.net/sfu/novell-sfdev2dev >>>>>>>> _______________________________________________ >>>>>>>> PyMOL-users mailing list (PyMOL-users@lists.sourceforge.net) >>>>>>>> Info Page: https://lists.sourceforge.net/lists/listinfo/pymol-users >>>>>>>> Archives: >>>>>>>> http://www.mail-archive.com/pymol-users@lists.sourceforge.net >>>>>>>> >>> >> > > ------------------------------------------------------------------------------ Start uncovering the many advantages of virtual appliances and start using them to simplify application deployment and accelerate your shift to cloud computing. http://p.sf.net/sfu/novell-sfdev2dev _______________________________________________ PyMOL-users mailing list (PyMOL-users@lists.sourceforge.net) Info Page: https://lists.sourceforge.net/lists/listinfo/pymol-users Archives: http://www.mail-archive.com/pymol-users@lists.sourceforge.net