Hello Chimera Users, I have recently installed chimera version 1.9 in Linux OpenSuSe 11.4 and am trying to get acquainted with its features. I am trying to measure dihedral angles (specifically the angle chiSS defined by Cb-Sg-Sg'-Cb' about disulfide bonds) for a list of pdb files containing NMR structure ensembles. I was trying to do this using a script (kindly given by a friend and pasted below) to which I can pass the coordinates of the four atoms and get the measured values for the "reply log" information. I need to put the files in a directory called pdb_files, open chimera and call the script and retrieve information from the "reply log". However, there is a problem: Since the coordinates of (Cb,Sg, etc ) will be different for each of the ensemble (since each ensemble is structure of a different molecule), I need to pass the coordinates dynamically for each pdbid. I have found from Chimera User group archives that reply log can be saved using a function. http://plato.cgl.ucsf.edu/pipermail/chimera-users/2008-October/003184.html So that should solve one issue. I can save the reply log and parse it later. What is the best way to measure specific dihedral angles from multiple pdb files ? Is it possible to invoke chimera in tty mode and make it execute functions? In that case, I could probably write a shell script to invoke chimera once for each pdb and ask it to execute python script having appropriate atom coordinates. I apologize for slightly long an e-mail. Any hints or directions to enable me figure out how to get this done efficiently in chimera will be of great help to me. with regards, Aswani *script:* *================================================================* *import os* *import Matrix* *from chimera import openModels, selection, runCommand* *#angle #0:resno@CB :resno@SG :resno@SG :resno@CB 34.6289* *# Directory containing PDB files* *directory = 'pdb_files'* *# Get paths to all files in the specfied directory * *paths = [os.path.join(directory,f) for f in os.listdir(directory) if f.endswith('.pdb')]* *for pdbfilename in paths:* * filename = pdbfilename.split("/")[1]* * openModels.open(pdbfilename, baseId = 0) # Open as model #2* * runCommand('angle #0:863@CB :980@SG :1130@SG :1235@CB') # calculate torsion angle* * runCommand('close #0') # close molecule and map* *=================================================================* -- K.Aswani Kumar Graduate Student Molecular Biophysics Unit Indian Institute of Science Bangalore-560012 Karnataka, India.
Hi Aswani, I can answer only part of the question. For writing scripts to loop through multiple PDBs please see: <http://www.rbvi.ucsf.edu/chimera/docs/ProgrammersGuide/basicPrimer.html> The script that you included gives specific residue numbers for the four atoms. You would need to know the residue numbers for the CB-SG-SG-CB in each structure. I’m not sure how you would get that or pass it in. (also: the script has four different residue numbers, which doesn’t really make sense to me; if it’s really a disulfide dihedral you would just have two residue numbers, one cysteine CB,SG and the other cysteine SG,CB). Best, Elaine ----- Elaine C. Meng, Ph.D. UCSF Computer Graphics Lab (Chimera team) and Babbitt Lab Department of Pharmaceutical Chemistry University of California, San Francisco On Aug 28, 2014, at 10:13 PM, Aswani Kumar Kancherla <ashwin2952@gmail.com> wrote:
Hello Chimera Users, I have recently installed chimera version 1.9 in Linux OpenSuSe 11.4 and am trying to get acquainted with its features.
I am trying to measure dihedral angles (specifically the angle chiSS defined by Cb-Sg-Sg'-Cb' about disulfide bonds) for a list of pdb files containing NMR structure ensembles. I was trying to do this using a script (kindly given by a friend and pasted below) to which I can pass the coordinates of the four atoms and get the measured values for the "reply log" information.
I need to put the files in a directory called pdb_files, open chimera and call the script and retrieve information from the "reply log". However, there is a problem:
Since the coordinates of (Cb,Sg, etc ) will be different for each of the ensemble (since each ensemble is structure of a different molecule), I need to pass the coordinates dynamically for each pdbid.
I have found from Chimera User group archives that reply log can be saved using a function. http://plato.cgl.ucsf.edu/pipermail/chimera-users/2008-October/003184.html So that should solve one issue. I can save the reply log and parse it later.
What is the best way to measure specific dihedral angles from multiple pdb files? Is it possible to invoke chimera in tty mode and make it execute functions? In that case, I could probably write a shell script to invoke chimera once for each pdb and ask it to execute python script having appropriate atom coordinates.
I apologize for slightly long an e-mail. Any hints or directions to enable me figure out how to get this done efficiently in chimera will be of great help to me.
with regards, Aswani
script: ================================================================
import os import Matrix from chimera import openModels, selection, runCommand
#angle #0:resno@CB :resno@SG :resno@SG :resno@CB 34.6289
# Directory containing PDB files directory = 'pdb_files'
# Get paths to all files in the specfied directory paths = [os.path.join(directory,f) for f in os.listdir(directory) if f.endswith('.pdb')]
for pdbfilename in paths: filename = pdbfilename.split("/")[1] openModels.open(pdbfilename, baseId = 0) # Open as model #2 runCommand('angle #0:863@CB :980@SG :1130@SG :1235@CB') # calculate torsion angle
runCommand('close #0') # close molecule and map =================================================================
-- K.Aswani Kumar Graduate Student Molecular Biophysics Unit Indian Institute of Science Bangalore-560012 Karnataka, India. _______________________________________________ Chimera-users mailing list Chimera-users@cgl.ucsf.edu http://plato.cgl.ucsf.edu/mailman/listinfo/chimera-users
Hi Aswani, I would recommend basing your script off the link that Elaine sent, since I think it is a little easier to understand, but you could use your original one if you like. In either case, in the main loop of the script, after either the "open" command or the "openModels" call (depending on which script you use), this code would identify and print out the disulphide dihedrals: from chimera import openModels, Molecule for m in openModels.list(modelTypes=[Molecule]): for b in m.bonds: if b.atoms[0].name == "SG" and b.atoms[1].name == "SG": sg1, sg2 = b.atoms cbs = [] for sg in [sg1, sg2]: if len(sg.neighbors) != 2: break for nb in sg.neighbors: if nb.name == "CB": cbs.append(nb) break else: # not bonded to a CB break if len(cbs) != 2: continue cb1, cb2 = cbs from chimera import dihedral print cb1, sg1, sg2, cb2, dihedral(cb1.coord(), sg1.coord(), sg2.coord(), cb2.coord()) Make sure you maintain the relative indentation of the code and the the 'from' and first 'for' statements above are indented the same amount as the other statements in your loop. --Eric Eric Pettersen UCSF Computer Graphics Lab http://www.cgl.ucsf.edu On Aug 29, 2014, at 10:35 AM, Elaine Meng <meng@cgl.ucsf.EDU> wrote:
Hi Aswani, I can answer only part of the question.
For writing scripts to loop through multiple PDBs please see: <http://www.rbvi.ucsf.edu/chimera/docs/ProgrammersGuide/basicPrimer.html>
The script that you included gives specific residue numbers for the four atoms. You would need to know the residue numbers for the CB-SG-SG-CB in each structure. I’m not sure how you would get that or pass it in. (also: the script has four different residue numbers, which doesn’t really make sense to me; if it’s really a disulfide dihedral you would just have two residue numbers, one cysteine CB,SG and the other cysteine SG,CB).
Best, Elaine ----- Elaine C. Meng, Ph.D. UCSF Computer Graphics Lab (Chimera team) and Babbitt Lab Department of Pharmaceutical Chemistry University of California, San Francisco
On Aug 28, 2014, at 10:13 PM, Aswani Kumar Kancherla <ashwin2952@gmail.com> wrote:
Hello Chimera Users, I have recently installed chimera version 1.9 in Linux OpenSuSe 11.4 and am trying to get acquainted with its features.
I am trying to measure dihedral angles (specifically the angle chiSS defined by Cb-Sg-Sg'-Cb' about disulfide bonds) for a list of pdb files containing NMR structure ensembles. I was trying to do this using a script (kindly given by a friend and pasted below) to which I can pass the coordinates of the four atoms and get the measured values for the "reply log" information.
I need to put the files in a directory called pdb_files, open chimera and call the script and retrieve information from the "reply log". However, there is a problem:
Since the coordinates of (Cb,Sg, etc ) will be different for each of the ensemble (since each ensemble is structure of a different molecule), I need to pass the coordinates dynamically for each pdbid.
I have found from Chimera User group archives that reply log can be saved using a function. http://plato.cgl.ucsf.edu/pipermail/chimera-users/2008-October/003184.html So that should solve one issue. I can save the reply log and parse it later.
What is the best way to measure specific dihedral angles from multiple pdb files? Is it possible to invoke chimera in tty mode and make it execute functions? In that case, I could probably write a shell script to invoke chimera once for each pdb and ask it to execute python script having appropriate atom coordinates.
I apologize for slightly long an e-mail. Any hints or directions to enable me figure out how to get this done efficiently in chimera will be of great help to me.
with regards, Aswani
script: ================================================================
import os import Matrix from chimera import openModels, selection, runCommand
#angle #0:resno@CB :resno@SG :resno@SG :resno@CB 34.6289
# Directory containing PDB files directory = 'pdb_files'
# Get paths to all files in the specfied directory paths = [os.path.join(directory,f) for f in os.listdir(directory) if f.endswith('.pdb')]
for pdbfilename in paths: filename = pdbfilename.split("/")[1] openModels.open(pdbfilename, baseId = 0) # Open as model #2 runCommand('angle #0:863@CB :980@SG :1130@SG :1235@CB') # calculate torsion angle
runCommand('close #0') # close molecule and map =================================================================
-- K.Aswani Kumar Graduate Student Molecular Biophysics Unit Indian Institute of Science Bangalore-560012 Karnataka, India. _______________________________________________ Chimera-users mailing list Chimera-users@cgl.ucsf.edu http://plato.cgl.ucsf.edu/mailman/listinfo/chimera-users
_______________________________________________ Chimera-users mailing list Chimera-users@cgl.ucsf.edu http://plato.cgl.ucsf.edu/mailman/listinfo/chimera-users
Hi Elaine and Eric, Many thanks for the prompt reply. @Elaine: thanks for the link. I have decided to start off from script given in the link sent by you. You said: "The script that you included gives specific residue numbers for the four atoms. You would need to know the residue numbers for the CB-SG-SG-CB in each structure. I’m not sure how you would get that or pass it in. (also: the script has four different residue numbers, which doesn’t really make sense to me; if it’s really a disulfide dihedral you would just have two residue numbers, one cysteine CB,SG and the other cysteine SG,CB)" You have got my problem right. I was hoping to get the specific residue numbers for four atoms (CB,SG,SG'.CB') for each pdb using "molmol" (which I am used to using for analysing NMR structures) and then some how pass the information to chimera in each iteration. I didn't know how to do the latter part. But with the code that Eric has sent, I can do everything using chimera itself and I don't need to pass the residue numbers from outside. Yeah, you are right that residue numbers in the script that I had sent do not make sense for measuring chiSS. There should just be two residue numbers. It was my fault: by mistake I had pasted an uncorrected script; my apologies. @Eric: Many thanks for the code that you gave for extracting disulfide bonds and measuring the chiSS. I incorporated it in the code from the link sent by Elaine and executed it on a list of pdb ids. It worked fine on most of pdb files. However, for a few pdb files, some of the disulfide bonds are not recognized. Could it be due to the bad geometry in those structures? If I understand the code right, it extracts pairs of SG atoms that are bonded together in each model "m" by looking in "m.bonds". Then it goes on to identify the attached beta carbons and then finally calculates the chiSS. My suspicion is that, in some of the NMR structures (the pdb ids on which the script failed to identify all the disulfide bonds), the disulfide bond geometry is not good and hence SS bond is not listed in "m.bonds". How do I go about, if I want to identify all the pairs of Cysteine SG atoms which are closer than say 2.5A and then calculate the appropriate dihedral angle about CB-SG-SG'-CB'? I will first need to calculate pairwise distances for SG atoms of all cysteines, select those pairs which are much nearer than allowed by their non-bonded distance (sum of van der waal radii) and then calculate the dihedral angle. This exercise will be useful for me to identify pairs of those Cysteines whose SG atoms have optimal geometry for formation of disulfide bond. Once again many thanks for your valuable time and prompt help. I am pasting the script that I have used below. It worked fine and hence the indentation must be fine. with regards, Aswani code: ================================================================================================= import os from chimera import runCommand as rc # use 'rc' as shorthand for runCommand from chimera import replyobj # for emitting status messages # change to folder with data files os.chdir("/home/aswani/Downloads/test") # gather the names of .pdb files in the folder file_names = [fn for fn in os.listdir(".") if fn.endswith(".pdb")] # loop through the files, opening, processing, and closing each in turn for fn in file_names: replyobj.status("Processing " + fn) # show what file we're working on rc("open " + fn) from chimera import openModels, Molecule for m in openModels.list(modelTypes=[Molecule]): for b in m.bonds: if b.atoms[0].name == "SG" and b.atoms[1].name == "SG": sg1, sg2 = b.atoms cbs = [] for sg in [sg1, sg2]: if len(sg.neighbors) != 2: break for nb in sg.neighbors: if nb.name == "CB": cbs.append(nb) break else: # not bonded to a CB break if len(cbs) != 2: continue cb1, cb2 = cbs from chimera import dihedral print cb1, sg1, sg2, cb2, dihedral(cb1.coord(), sg1.coord(), sg2.coord(), cb2.coord()) rc("close all") # uncommenting the line below will cause Chimera to exit when the script is done #rc("stop now") # note that indentation is significant in Python; the fact that # the above command is exdented means that it is executed after # the loop completes, whereas the indented commands that # preceded it are executed as part of the loop. =========================================================================================== On 29 August 2014 23:45, Eric Pettersen <pett@cgl.ucsf.edu> wrote:
Hi Aswani, I would recommend basing your script off the link that Elaine sent, since I think it is a little easier to understand, but you could use your original one if you like. In either case, in the main loop of the script, after either the "open" command or the "openModels" call (depending on which script you use), this code would identify and print out the disulphide dihedrals:
from chimera import openModels, Molecule for m in openModels.list(modelTypes=[Molecule]): for b in m.bonds: if b.atoms[0].name == "SG" and b.atoms[1].name == "SG": sg1, sg2 = b.atoms cbs = [] for sg in [sg1, sg2]: if len(sg.neighbors) != 2: break for nb in sg.neighbors: if nb.name == "CB": cbs.append(nb) break else: # not bonded to a CB break if len(cbs) != 2: continue cb1, cb2 = cbs from chimera import dihedral print cb1, sg1, sg2, cb2, dihedral(cb1.coord(), sg1.coord(), sg2.coord(), cb2.coord())
Make sure you maintain the relative indentation of the code and the the 'from' and first 'for' statements above are indented the same amount as the other statements in your loop.
--Eric
Eric Pettersen UCSF Computer Graphics Lab http://www.cgl.ucsf.edu
On Aug 29, 2014, at 10:35 AM, Elaine Meng <meng@cgl.ucsf.EDU> wrote:
Hi Aswani, I can answer only part of the question.
For writing scripts to loop through multiple PDBs please see: <http://www.rbvi.ucsf.edu/chimera/docs/ProgrammersGuide/basicPrimer.html
The script that you included gives specific residue numbers for the four atoms. You would need to know the residue numbers for the CB-SG-SG-CB in each structure. I’m not sure how you would get that or pass it in. (also: the script has four different residue numbers, which doesn’t really make sense to me; if it’s really a disulfide dihedral you would just have two residue numbers, one cysteine CB,SG and the other cysteine SG,CB).
Best, Elaine ----- Elaine C. Meng, Ph.D. UCSF Computer Graphics Lab (Chimera team) and Babbitt Lab Department of Pharmaceutical Chemistry University of California, San Francisco
On Aug 28, 2014, at 10:13 PM, Aswani Kumar Kancherla < ashwin2952@gmail.com> wrote:
Hello Chimera Users, I have recently installed chimera version 1.9 in Linux OpenSuSe 11.4 and am trying to get acquainted with its features.
I am trying to measure dihedral angles (specifically the angle chiSS defined by Cb-Sg-Sg'-Cb' about disulfide bonds) for a list of pdb files containing NMR structure ensembles. I was trying to do this using a script (kindly given by a friend and pasted below) to which I can pass the coordinates of the four atoms and get the measured values for the "reply log" information.
I need to put the files in a directory called pdb_files, open chimera and call the script and retrieve information from the "reply log". However, there is a problem:
Since the coordinates of (Cb,Sg, etc ) will be different for each of the ensemble (since each ensemble is structure of a different molecule), I need to pass the coordinates dynamically for each pdbid.
I have found from Chimera User group archives that reply log can be saved using a function.
So that should solve one issue. I can save the reply log and parse it later.
What is the best way to measure specific dihedral angles from multiple pdb files? Is it possible to invoke chimera in tty mode and make it execute functions? In that case, I could probably write a shell
http://plato.cgl.ucsf.edu/pipermail/chimera-users/2008-October/003184.html script to invoke chimera once for each pdb and ask it to execute python script having appropriate atom coordinates.
I apologize for slightly long an e-mail. Any hints or directions to
enable me figure out how to get this done efficiently in chimera will be of great help to me.
with regards, Aswani
script: ================================================================
import os import Matrix from chimera import openModels, selection, runCommand
#angle #0:resno@CB :resno@SG :resno@SG :resno@CB 34.6289
# Directory containing PDB files directory = 'pdb_files'
# Get paths to all files in the specfied directory paths = [os.path.join(directory,f) for f in os.listdir(directory) if
f.endswith('.pdb')]
for pdbfilename in paths: filename = pdbfilename.split("/")[1] openModels.open(pdbfilename, baseId = 0) # Open as model #2 runCommand('angle #0:863@CB :980@SG :1130@SG :1235@CB')
# calculate torsion angle
runCommand('close #0') # close molecule and map =================================================================
-- K.Aswani Kumar Graduate Student Molecular Biophysics Unit Indian Institute of Science Bangalore-560012 Karnataka, India. _______________________________________________ Chimera-users mailing list Chimera-users@cgl.ucsf.edu http://plato.cgl.ucsf.edu/mailman/listinfo/chimera-users
_______________________________________________ Chimera-users mailing list Chimera-users@cgl.ucsf.edu http://plato.cgl.ucsf.edu/mailman/listinfo/chimera-users
-- K.Aswani Kumar Prof. Siddhartha P Sarma's Group Molecular Biophysics Unit Indian Institute of Science Bangalore-560012 Karnataka, India. Ph: +91-9945633467 (mobile) +91-80-22933454 (lab) +91-8814-278410 (home)
On Aug 30, 2014, at 4:00 AM, Aswani Kumar Kancherla <ashwin2952@gmail.com> wrote:
@Eric: Many thanks for the code that you gave for extracting disulfide bonds and measuring the chiSS. I incorporated it in the code from the link sent by Elaine and executed it on a list of pdb ids. It worked fine on most of pdb files. However, for a few pdb files, some of the disulfide bonds are not recognized. Could it be due to the bad geometry in those structures?
If I understand the code right, it extracts pairs of SG atoms that are bonded together in each model "m" by looking in "m.bonds". Then it goes on to identify the attached beta carbons and then finally calculates the chiSS.
Yep.
My suspicion is that, in some of the NMR structures (the pdb ids on which the script failed to identify all the disulfide bonds), the disulfide bond geometry is not good and hence SS bond is not listed in "m.bonds".
Chimera relies on information inside the PDB file itself to "identify" SS bonds. In particular, LINK and/or CONECT records must be present that identify the SS linkage.
How do I go about, if I want to identify all the pairs of Cysteine SG atoms which are closer than say 2.5A and then calculate the appropriate dihedral angle about CB-SG-SG'-CB'? I will first need to calculate pairwise distances for SG atoms of all cysteines, select those pairs which are much nearer than allowed by their non-bonded distance (sum of van der waal radii) and then calculate the dihedral angle. This exercise will be useful for me to identify pairs of those Cysteines whose SG atoms have optimal geometry for formation of disulfide bond.
Once again many thanks for your valuable time and prompt help. I am pasting the script that I have used below. It worked fine and hence the indentation must be fine.
Well, if there are only a few of these "misses" (and you're certain you've caught all the misses), it might just be easier to add appropriate LINK/CONECT records to the files, or use Chimera's "bond" command to form the missing SS bond. Code to do what you suggested above would be something like this: from chimera import openModels, Molecule for m in openModels.list(modelTypes=[Molecule]): sgs = [a for a in m.atoms if a.name == "SG"] for i, sg1 in enumerate(sgs): for sg2 in sgs[i+1:]: if sg1.coord().distance(sg2.coord()) > 2.5: continue # the code below should look familiar :-) cbs = [] for sg in [sg1, sg2]: if len(sg.neighbors) > 2: break for nb in sg.neighbors: if nb.name == "CB": cbs.append(nb) break else: # not bonded to a CB break if len(cbs) != 2: continue cb1, cb2 = cbs from chimera import dihedral print cb1, sg1, sg2, cb2, dihedral(cb1.coord(), sg1.coord(), sg2.coord(), cb2.coord()) --Eric Eric Pettersen UCSF Computer Graphics Lab http://www.cgl.ucsf.edu
participants (3)
-
Aswani Kumar Kancherla
-
Elaine Meng
-
Eric Pettersen