Re: [PyMOL] efficiency assigning b-factors
Hi Jordan et al., Yes one can use the alter command with a whole selection at once and it is much faster. I hadn't realized that until Thomas Holder helped fix my script that appears to do what you were wanting to do: http://pldserver1.biochem.queensu.ca/~rlc/work/pymol/data2bfactor.py The B-factor data is read in and assigned to a dictionary by the atom_data_extract function elsewhere in the script (indexed either by chain and residue number, or by chain and ID) and then it is applied like this: b_dict = atom_data_extract(data_file) quiet = int(quiet) == 1 def b_lookup(chain, resi, name, ID, b): def _lookup(chain, resi, name, ID): if resi in b_dict[chain] and isinstance(b_dict[chain][resi], dict): return b_dict[chain][resi][name][0] else: # find data by ID return b_dict[chain][int(ID)][0] try: if not chain in b_dict: chain = '' b = _lookup(chain, resi, name, ID) if not quiet: print '///%s/%s/%s new: %f' % (chain, resi, name, b) except KeyError: if not quiet: print '///%s/%s/%s keeping: %f' % (chain, resi, name, b) return b stored.b = b_lookup cmd.alter(mol, '%s=stored.b(chain, resi, name, ID, %s)' % (prop, prop)) cmd.rebuild() Hope that helps. Cheers, Rob On Tue, 2015-06-16 11:10 EDT, Tsjerk Wassenaar tsje...@gmail.com wrote: Hi Jordan, The answer is something like (assuming reading from a file): newb=[float(i) for i in open(stuff.dat).read().split()] alter n. ca, b=newb.pop() spectrum b Hope it helps, Tsjerk On Tue, Jun 16, 2015 at 10:25 AM, Jordan Willis jwillis0...@gmail.com wrote: Hi Tsjerk, It seems everyone is pointing to this ( http://www.pymolwiki.org/index.php/Color#Reassigning_B-Factors_and_Coloring) which I somehow missed. However, they seem to be altering one residue at a time like I’m doing. Jordan On Jun 15, 2015, at 11:59 PM, Tsjerk Wassenaar tsje...@gmail.com wrote: Hi Jordan, Yes, although I don't have the answer at hand, it has been given on the user list several times. You can find it in the archives. Cheers, Tsjerk On Jun 16, 2015 08:16, Jordan Willis jwillis0...@gmail.com wrote: Hi, I have a dictionary that has a bunch of values I want to assign to b-factors in order to color by. In my script: for residue in data: cmd.alter(“resi {}”.format(residue[‘resnum’]),”b={}”.format(residue[‘value’])) This executes the alter command for each residue. For some reason, its taking forever in my script. Is there something inherently inefficient about alter? And is there anyway to fix it? Perhaps, assign a bunch of b-factors at once. Jordan -- ___ 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 -- Robert L. Campbell, Ph.D. Senior Research Associate/Adjunct Assistant Professor Dept. of Biomedical Molecular Sciences, Botterell Hall Rm 644 Queen's University, Kingston, ON K7L 3N6 Canada Tel: 613-533-6821 robert.campb...@queensu.ca http://pldserver1.biochem.queensu.ca/~rlc -- ___ 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
Re: [PyMOL] efficiency assigning b-factors
Hi Jordan - I think you're doing it exactly the way I would, given an existing dict containing the values. Note, however, that if you have multiple loaded, or multiple chains with the same residue numbers, you may wish to be more specific with your selection string; your current script will alter every residue with the given resi # in all chains of all loaded objects. If you're having to do this multiple times with the same structure and it's slow each time (e.g. while creating a figure from a script), maybe consider saving a new PDB file with the modified B-factors using PyMOL's `save` command, so you can just load it directly. # After your `alter` script save myfile_mod_b.pdb, myfile # Then next time load the new version with the same name # as before to avoid breaking the rest of the script. Now you can # remove the `alter` for-loop from the script. load myfile_mod_b.pdb, myfile Hope that helps. Cheers, Jared -- Jared Sampson Xiangpeng Kong Lab NYU Langone Medical Center http://kong.med.nyu.edu/ On Jun 16, 2015, at 2:15 AM, Jordan Willis jwillis0...@gmail.commailto:jwillis0...@gmail.com wrote: Hi, I have a dictionary that has a bunch of values I want to assign to b-factors in order to color by. In my script: for residue in data: cmd.alter(“resi {}”.format(residue[‘resnum’]),”b={}”.format(residue[‘value’])) This executes the alter command for each residue. For some reason, its taking forever in my script. Is there something inherently inefficient about alter? And is there anyway to fix it? Perhaps, assign a bunch of b-factors at once. Jordan -- ___ PyMOL-users mailing list (PyMOL-users@lists.sourceforge.netmailto: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 -- ___ 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
Re: [PyMOL] efficiency assigning b-factors
Hi Jordan, Yes, although I don't have the answer at hand, it has been given on the user list several times. You can find it in the archives. Cheers, Tsjerk On Jun 16, 2015 08:16, Jordan Willis jwillis0...@gmail.com wrote: Hi, I have a dictionary that has a bunch of values I want to assign to b-factors in order to color by. In my script: for residue in data: cmd.alter(“resi {}”.format(residue[‘resnum’]),”b={}”.format(residue[‘value’])) This executes the alter command for each residue. For some reason, its taking forever in my script. Is there something inherently inefficient about alter? And is there anyway to fix it? Perhaps, assign a bunch of b-factors at once. Jordan -- ___ 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 -- ___ 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
Re: [PyMOL] efficiency assigning b-factors
Hi Tsjerk, It seems everyone is pointing to this (http://www.pymolwiki.org/index.php/Color#Reassigning_B-Factors_and_Coloring http://www.pymolwiki.org/index.php/Color#Reassigning_B-Factors_and_Coloring) which I somehow missed. However, they seem to be altering one residue at a time like I’m doing. Jordan On Jun 15, 2015, at 11:59 PM, Tsjerk Wassenaar tsje...@gmail.com wrote: Hi Jordan, Yes, although I don't have the answer at hand, it has been given on the user list several times. You can find it in the archives. Cheers, Tsjerk On Jun 16, 2015 08:16, Jordan Willis jwillis0...@gmail.com mailto:jwillis0...@gmail.com wrote: Hi, I have a dictionary that has a bunch of values I want to assign to b-factors in order to color by. In my script: for residue in data: cmd.alter(“resi {}”.format(residue[‘resnum’]),”b={}”.format(residue[‘value’])) This executes the alter command for each residue. For some reason, its taking forever in my script. Is there something inherently inefficient about alter? And is there anyway to fix it? Perhaps, assign a bunch of b-factors at once. Jordan -- ___ PyMOL-users mailing list (PyMOL-users@lists.sourceforge.net mailto:PyMOL-users@lists.sourceforge.net) Info Page: https://lists.sourceforge.net/lists/listinfo/pymol-users https://lists.sourceforge.net/lists/listinfo/pymol-users Archives: http://www.mail-archive.com/pymol-users@lists.sourceforge.net http://www.mail-archive.com/pymol-users@lists.sourceforge.net -- ___ 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
Re: [PyMOL] efficiency assigning b-factors
Hi Jordan, The answer is something like (assuming reading from a file): newb=[float(i) for i in open(stuff.dat).read().split()] alter n. ca, b=newb.pop() spectrum b Hope it helps, Tsjerk On Tue, Jun 16, 2015 at 10:25 AM, Jordan Willis jwillis0...@gmail.com wrote: Hi Tsjerk, It seems everyone is pointing to this ( http://www.pymolwiki.org/index.php/Color#Reassigning_B-Factors_and_Coloring) which I somehow missed. However, they seem to be altering one residue at a time like I’m doing. Jordan On Jun 15, 2015, at 11:59 PM, Tsjerk Wassenaar tsje...@gmail.com wrote: Hi Jordan, Yes, although I don't have the answer at hand, it has been given on the user list several times. You can find it in the archives. Cheers, Tsjerk On Jun 16, 2015 08:16, Jordan Willis jwillis0...@gmail.com wrote: Hi, I have a dictionary that has a bunch of values I want to assign to b-factors in order to color by. In my script: for residue in data: cmd.alter(“resi {}”.format(residue[‘resnum’]),”b={}”.format(residue[‘value’])) This executes the alter command for each residue. For some reason, its taking forever in my script. Is there something inherently inefficient about alter? And is there anyway to fix it? Perhaps, assign a bunch of b-factors at once. Jordan -- ___ 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 -- Tsjerk A. Wassenaar, Ph.D. -- ___ 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