def phipsi(selection="(pk1)",_self=cmd): pymol=_self._pymol cmd=_self # NOT THREAD SAFE n_sele = "((byres (%s)) & name n)"%selection c_sele = "((byres (%s)) & name c)"%selection ca_sele = "((byres (%s)) & name ca)"%selection cm_sele = "((neighbor (%s)) and not (byres (%s)))"%(n_sele,n_sele) np_sele = "((neighbor (%s)) and not (byres (%s)))"%(c_sele,c_sele) cmd.feedback("push") cmd.feedback("disable","selector","everythin") cm_cnt = cmd.select("_pp_cm",cm_sele) n_cnt = cmd.select("_pp_n",n_sele) c_cnt = cmd.select("_pp_c",c_sele) ca_cnt = cmd.select("_pp_ca",ca_sele) np_cnt = cmd.select("_pp_np",np_sele) if(cm_cnt and n_cnt and ca_cnt and c_cnt): phi = cmd.get_dihedral("_pp_c","_pp_ca","_pp_n","_pp_cm") else: phi = None if(n_cnt and ca_cnt and c_cnt and np_cnt): psi = cmd.get_dihedral("_pp_np","_pp_c","_pp_ca","_pp_n") else: psi = None cmd.feedback("pop") cmd.delete("_pp_cm") cmd.delete("_pp_n") cmd.delete("_pp_c") cmd.delete("_pp_ca") cmd.delete("_pp_np") return (phi,psi)
def doRotamers(sel,angles=[], type="color"): # Read in Rotamer library if not already done if len(rotdat) == 0: readRotLib() # Set up some variables.. residues = ['dummy'] # Keep track of residues already done probs = [] # probability of each residue conformation phi = 0 # phi,psi angles of current residue psi = 0 # Get atoms from selection atoms = cmd.get_model("byres ("+sel+")") # Loop through atoms in selection for at in atoms.atom: try: # Don't process Glycines or Alanines if not (at.resn == 'GLY' or at.resn == 'ALA'): if at.chain+":"+at.resn+":"+at.resi not in residues: residues.append(at.chain+":"+at.resn+":"+at.resi) # Check for a null chain id (some PDBs contain this) unit_select = "" if at.chain != "": unit_select = "chain "+str(at.chain)+" and " # Define selections for residue i-1, i and i+1 residue_def = unit_select+'resi '+str(at.resi) residue_def_prev = unit_select+'resi '+str(int(at.resi)-1) residue_def_next = unit_select+'resi '+str(int(at.resi)+1) # Compute phi/psi angle phi = cmd.get_dihedral(residue_def_prev+' and name C',residue_def+' and name N',residue_def+' and name CA',residue_def+' and name C') psi = cmd.get_dihedral(residue_def+' and name N',residue_def+' and name CA',residue_def+' and name C',residue_def_next+' and name N') if type == "set": print "Changing "+at.resn+str(at.resi)+" from "+str(phi)+","+str(psi)+" to "+str(angles[0])+","+str(angles[1]) cmd.set_dihedral(residue_def_prev+' and name C',residue_def+' and name N',residue_def+' and name CA',residue_def+' and name C',angles[0]) cmd.set_dihedral(residue_def+' and name N',residue_def+' and name CA',residue_def+' and name C',residue_def_next+' and name N', angles[1]) continue # Find correct 10x10 degree bin phi_digit = abs(int(phi)) - abs(int(phi/10)*10) psi_digit = abs(int(psi)) - abs(int(psi/10)*10) # Remember sign of phi,psi angles phi_sign = 1 if phi < 0: phi_sign = -1 psi_sign = 1 if psi < 0: psi_sign = -1 # Compute phi,psi bins phi_bin = int(math.floor(abs(phi/10))*10*phi_sign) if phi_digit >= 5: phi_bin = int(math.ceil(abs(phi/10))*10*phi_sign) psi_bin = int(math.floor(abs(psi/10))*10*psi_sign) if psi_digit >= 5: psi_bin = int(math.ceil(abs(psi/10))*10*psi_sign) print "Given "+at.resn+":"+at.resi+" PHI,PSI ("+str(phi)+","+str(psi)+") : bin ("+str(phi_bin)+","+str(psi_bin)+")" # Get current chi angle measurements chi = [] for i in range(len(CHIS[at.resn])): chi.append(cmd.get_dihedral(residue_def + ' and name '+CHIS[at.resn][i][0], residue_def + ' and name '+CHIS[at.resn][i][1], residue_def + ' and name '+CHIS[at.resn][i][2], residue_def + ' and name '+CHIS[at.resn][i][3])) print "CHIs: "+str(chi) if type == 'bins': return [at.resn, phi_bin,psi_bin] # Compute probabilities for given chi angles prob = 0 prob_box = 22 for item in range(len(rotdat[at.resn+":"+str(phi_bin)+":"+str(psi_bin)])): print "Rotamer from db: "+str(rotdat[at.resn+":"+str(phi_bin)+":"+str(psi_bin)][item]) if chi[0]: if chi[0] >= float(rotdat[at.resn+":"+str(phi_bin)+":"+str(psi_bin)][item][1]) - (prob_box/2) and \ chi[0] <= float(rotdat[at.resn+":"+str(phi_bin)+":"+str(psi_bin)][item][1]) + (prob_box/2): if len(chi) == 1: prob = rotdat[at.resn+":"+str(phi_bin)+":"+str(psi_bin)][item][0] break if chi[1] >= float(rotdat[at.resn+":"+str(phi_bin)+":"+str(psi_bin)][item][2]) - (prob_box/2) and \ float(chi[1] <= rotdat[at.resn+":"+str(phi_bin)+":"+str(psi_bin)][item][2]) + (prob_box/2): if len(chi) == 2: prob = rotdat[at.resn+":"+str(phi_bin)+":"+str(psi_bin)][item][0] break if chi[2] >= float(rotdat[at.resn+":"+str(phi_bin)+":"+str(psi_bin)][item][3]) - (prob_box/2) and \ float(chi[2] <= rotdat[at.resn+":"+str(phi_bin)+":"+str(psi_bin)][item][3]) + (prob_box/2): if len(chi) == 3: prob = rotdat[at.resn+":"+str(phi_bin)+":"+str(psi_bin)][item][0] break if chi[3] >= float(rotdat[at.resn+":"+str(phi_bin)+":"+str(psi_bin)][item][4]) - (prob_box/2) and \ float(chi[3] <= rotdat[at.resn+":"+str(phi_bin)+":"+str(psi_bin)][item][4]) + (prob_box/2): prob = rotdat[at.resn+":"+str(phi_bin)+":"+str(psi_bin)][item][0] break print "PROB OF ROTAMER: "+str(prob) print "---------------------------" probs.append([residue_def, prob]) except: # probs.append([residue_def, -1]) print "Exception found" continue # Color according to rotamer probability rot_color(probs)