diff --git a/modules/mol/alg/pymod/CMakeLists.txt b/modules/mol/alg/pymod/CMakeLists.txt index 000e754817bce15b4e118a6ad65de253d9af8763..6be6ca39d57e39c2b9d01ed951fb9a4b20cf6d17 100644 --- a/modules/mol/alg/pymod/CMakeLists.txt +++ b/modules/mol/alg/pymod/CMakeLists.txt @@ -13,6 +13,7 @@ set(OST_MOL_ALG_PYMOD_MODULES trajectory_analysis.py structure_analysis.py helix_kinks.py + hbond.py ) if (ENABLE_IMG) diff --git a/modules/mol/alg/pymod/__init__.py b/modules/mol/alg/pymod/__init__.py index b8c09d51d67b99b606ddc9c99af55afe37823dd4..73d5bd802ce28765d309e65b7eed4f65374abdfb 100644 --- a/modules/mol/alg/pymod/__init__.py +++ b/modules/mol/alg/pymod/__init__.py @@ -4,6 +4,7 @@ from ost.mol.alg.superpose import * import ost.mol.alg.trajectory_analysis import ost.mol.alg.structure_analysis import ost.mol.alg.helix_kinks +import ost.mol.alg.hbond # Fills a list of reference clashing distances from a file (requires a path to the file) def FillClashingDistancesFromFile(filename): diff --git a/modules/mol/alg/pymod/hbond.py b/modules/mol/alg/pymod/hbond.py new file mode 100644 index 0000000000000000000000000000000000000000..33545bd2f5430aac82e65cbb9023bece29608634 --- /dev/null +++ b/modules/mol/alg/pymod/hbond.py @@ -0,0 +1,443 @@ +import ost as _ost +import ost.geom as _geom + +""" +Module written by Niklaus Johner (niklaus.johner@a3.epfl.ch) 2012 + +This module is a flexible rewrite of HBPlus, allowing to calculate hbond +conservation between different structures or over a trajectory. +It uses customizable dictionaries to define donors and acceptors and can +account for equivalent HBonds such as involving for example either oxygen atom +of an Aspartic Acid. +""" +__all__=('HBondDonor','HBondAcceptor','BuildCHARMMHBondDonorAcceptorDict','AreHBonded','GetHbondDonorAcceptorList',\ + 'GetHbondListFromDonorAcceptorLists','GetHbondListFromView','GetHbondListFromTraj','GetHbondListBetweenViews'\ + 'CalculateHBondScore','AnalyzeHBondScore') + + +class HBondableAtoms: + def __init__(self,donors=[],acceptors=[]): + self.donors=donors + self.acceptors=acceptors + +def BuildCHARMMHBondDonorAcceptorDict(): + hb_da_dict={} + bb_donors=[['N','HN']] + bb_acceptors=[['O',['C']]] + + #hydrophobic + hb_da_dict['ALA']=HBondableAtoms(bb_donors,bb_acceptors) + hb_da_dict['GLY']=HBondableAtoms(bb_donors,bb_acceptors) + hb_da_dict['ILE']=HBondableAtoms(bb_donors,bb_acceptors) + hb_da_dict['LEU']=HBondableAtoms(bb_donors,bb_acceptors) + hb_da_dict['PHE']=HBondableAtoms(bb_donors,bb_acceptors) + hb_da_dict['MET']=HBondableAtoms(bb_donors,bb_acceptors) + hb_da_dict['VAL']=HBondableAtoms(bb_donors,bb_acceptors) + #special case + hb_da_dict['PRO']=HBondableAtoms([],bb_acceptors) + + #sidechain donors + ne=[['NE','HE']] + cz=[['NH1','HH11'],['NH1','HH12'],['NH2','HH21'],['NH2','HH22']] + hb_da_dict['ARG']=HBondableAtoms(bb_donors+ne+cz,bb_acceptors) + nz=[['NZ','HZ1'],['NZ','HZ2'],['NZ','HZ3']] + hb_da_dict['LYS']=HBondableAtoms(bb_donors+nz,bb_acceptors) + ne1=[['NE1','HE1']] + hb_da_dict['TRP']=HBondableAtoms(bb_donors+ne1,bb_acceptors) + sg=[['SG','HG1']] + hb_da_dict['CYS']=HBondableAtoms(bb_donors+sg,bb_acceptors) + + #sidechain acceptors + od12=[['OD1',['CG']],['OD2',['CG']]] + hb_da_dict['ASP']=HBondableAtoms(bb_donors,bb_acceptors+od12) + oe12=[['OE1',['CD']],['OE2',['CD']]] + hb_da_dict['GLU']=HBondableAtoms(bb_donors,bb_acceptors+oe12) + + #sidechain donor and acceptor + od1=[['OD1',['CG']]] + nd2=[['ND2','HD21'],['ND2','HD22']] + hb_da_dict['ASN']=HBondableAtoms(bb_donors+nd2,bb_acceptors+od1) + ne2=[['NE2','HE21'],['NE2','HE22']] + oe1=[['OE1',['CD']]] + hb_da_dict['GLN']=HBondableAtoms(bb_donors+ne2,bb_acceptors+oe1) + og_d=[['OG','HG1']] + og_a=[['OG',['CB']]] + hb_da_dict['SER']=HBondableAtoms(bb_donors+og_d,bb_acceptors+og_a) + og1_d=[['OG1','HG1']] + og1_a=[['OG1',['CB']]] + hb_da_dict['THR']=HBondableAtoms(bb_donors+og1_d,bb_acceptors+og1_a) + oh_d=[['OH','HH']] + oh_a=[['OH',['CZ']]] + hb_da_dict['TYR']=HBondableAtoms(bb_donors+oh_d,bb_acceptors+oh_a) + #histidine + nd1_d=[['ND1','HD1']] + ne2_a=[['NE2',['CD2','CE1']]] + hb_da_dict['HSD']=HBondableAtoms(bb_donors+nd1_d,bb_acceptors+ne2_a) + ne2_d=[['NE2','HE2']] + nd1_a=[['ND1',['CG','CE1']]] + hb_da_dict['HSE']=HBondableAtoms(bb_donors+ne2_d,bb_acceptors+nd1_a) + hb_da_dict['HSP']=HBondableAtoms(bb_donors+nd1_d+ne2_d,bb_acceptors) + #non-standard protonation state: + oe12=[['OE1',['CD']],['OE2',['CD']]] + oe2=[['OE2','HE2']] + hb_da_dict['GLUP']=HBondableAtoms(bb_donors+oe2,bb_acceptors+oe12) + od12=[['OD1',['CG']],['OD2',['CG']]] + od2=[['OD2','HD2']] + hb_da_dict['ASPP']=HBondableAtoms(bb_donors+od2,bb_acceptors+od12) + return hb_da_dict + +def BuildCHARMMHBondDonorEquivalenceDict(): + donor_swap_dict={} + donor_swap_dict['ARG']=[[['NH1','HH11'],['NH1','HH12'],['NH2','HH21'],['NH2','HH22']]] + donor_swap_dict['ASN']=[[['ND2','HD21'],['ND2','HD22']]] + donor_swap_dict['GLN']=[[['NE2','HE21'],['NE2','HE22']]] + donor_swap_dict['LYS']=[[['NZ','HZ1'],['NZ','HZ2'],['NZ','HZ3']]] + return donor_swap_dict + +def BuildCHARMMHBondAcceptorEquivalenceDict(): + acceptor_swap_dict={} + acceptor_swap_dict['ASP']=[[['OD1',['CG']],['OD2',['CG']]]] + acceptor_swap_dict['GLU']=[[['OE1',['CD']],['OE2',['CD']]]] + return acceptor_swap_dict + +def ListEquivalentDonors(donor,donor_swap_dict): + if not donor.heavy_atom.residue.name in donor_swap_dict:return [donor] + donor_list=[donor] + donor_atom_names=[donor.heavy_atom.name,donor.hydrogen.name] + res=donor.heavy_atom.residue + for equivalence_list in donor_swap_dict[donor.heavy_atom.residue.name]: + if not donor_atom_names in equivalence_list:continue + for atom_names in equivalence_list: + if atom_names==donor_atom_names:continue + else:donor_list.append(HBondDonor.FromResidue(res,atom_names[0],atom_names[1])) + return donor_list + +def ListEquivalentAcceptors(acceptor,acceptor_swap_dict): + if not acceptor.atom.residue.name in acceptor_swap_dict:return [acceptor] + acceptor_list=[acceptor] + acceptor_atom_names=[acceptor.atom.name,[a.name for a in acceptor.antecedent_list]] + res=acceptor.atom.residue + for equivalence_list in acceptor_swap_dict[acceptor.atom.residue.name]: + if not acceptor_atom_names in equivalence_list:continue + for atom_names in equivalence_list: + if atom_names==acceptor_atom_names:continue + else:acceptor_list.append(HBondAcceptor.FromResidue(res,atom_names[0],atom_names[1])) + return acceptor_list + + +class HBondDonor: + def __init__(self,donor,hydrogen): + self.heavy_atom=donor + self.hydrogen=hydrogen + def __eq__(self,hbd): + if not isinstance(hbd,HBondDonor):return False + else:return self.heavy_atom==hbd.heavy_atom and self.hydrogen==hbd.hydrogen + def __hash__(self): + return hash((self.heavy_atom,self.hydrogen)) + @classmethod + def FromResidue(cls,res,donor_name,hydrogen_name,verbose=True): + _donor=res.FindAtom(donor_name).handle + _hydrogen=res.FindAtom(hydrogen_name).handle + if not _donor.IsValid(): + if verbose:print 'Could not find '+donor_name+' in residue '+str(res) + return + if not _hydrogen.IsValid(): + if verbose:print 'Could not find '+hydrogen_name+' in residue '+str(res) + return + return cls(_donor,_hydrogen) + + def IsHBondedTo(self,acceptor): + return AreHBonded(self,acceptor) + + +class HBondAcceptor: + def __init__(self,acceptor,antecedent_list): + self.atom=acceptor + self.antecedent_list=antecedent_list + def __eq__(self,hba): + if not isinstance(hba,HBondAcceptor):return False + else:return self.atom==hba.atom + def __hash__(self): + return hash(self.atom) + @classmethod + def FromResidue(cls,res,acceptor_name,antecedent_name_list,verbose=True): + _acceptor=res.FindAtom(acceptor_name).handle + _antecedent_list=_ost.mol.AtomHandleList([res.FindAtom(name).handle for name in antecedent_name_list]) + if not _acceptor.IsValid(): + if verbose:print 'Could not find '+acceptor_name+' in residue '+str(res) + return + for i,a in enumerate(_antecedent_list): + if not a.IsValid(): + if verbose:print 'Could not find '+antecedent_name_list[i]+' in residue '+str(res) + return + return cls(_acceptor,_antecedent_list) + + def IsHBondedTo(self,donor): + return AreHBonded(donor,self) + +class HBond: + def __init__(self,donor,acceptor): + self.donor=donor + self.acceptor=acceptor + def __eq__(self,hb): + if not isinstance(hb,HBond):return False + else:return self.acceptor==hb.acceptor and self.donor==hb.donor + def __hash__(self): + return hash((self.donor,self.acceptor)) + def IsFormed(self):return AreHBonded(self.donor,self.acceptor) + def DonorAcceptorDistance(self):return _geom.Distance(self.donor.heavy_atom.pos,self.acceptor.atom.pos) + def HydrogenAcceptorDistance(self):return _geom.Distance(self.donor.hydrogen.pos,self.acceptor.atom.pos) + def DonorHydrogenAcceptorAngle(self): + dp=self.donor.heavy_atom.pos;ap=self.acceptor.atom.pos;hp=self.donor.hydrogen.pos + return _geom.Angle(dp-hp,ap-hp) + def DonorAcceptorAcceptorAntecedentAngle(self): + dp=self.donor.heavy_atom.pos;ap=self.acceptor.atom.pos + a=min([_geom.Angle(aa.pos-ap,dp-ap) for aa in self.acceptor.antecedent_list]) + return a + def HydrogenAcceptorAcceptorAntecedentAngle(self): + hp=self.donor.hydrogen.pos;ap=self.acceptor.atom.pos + a=min([_geom.Angle(aa.pos-ap,hp-ap) for aa in acceptor.antecedent_list]) + return a + + +def AreHBonded(donor,acceptor,da_dist=3.9,ha_dist=2.5,dha_angle=1.57,daaa_angle=1.57,haaa_angle=1.57): + """ + determines if a donor/acceptor pair is hydrogen bonded or not + """ + dp=donor.heavy_atom.pos + ap=acceptor.atom.pos + if _geom.Distance(dp,ap)>da_dist:return False + hp=donor.hydrogen.pos + if _geom.Distance(hp,ap)>ha_dist:return False + if _geom.Angle(dp-hp,ap-hp)<dha_angle:return False + a=min([_geom.Angle(aa.pos-ap,dp-ap) for aa in acceptor.antecedent_list]) + if a<daaa_angle:return False + a=min([_geom.Angle(aa.pos-ap,hp-ap) for aa in acceptor.antecedent_list]) + if a<haaa_angle:return False + return True + +def GetHbondDonorAcceptorList(eh,hbond_donor_acceptor_dict={},verbose=True): + """ + returns a list of hydrogen-bond donors and acceptors from an Entity or EntityView. + It relies on atom names to determine the list of H-bond donors and acceptors. + These names are given in a dictionary, which defaults to CHARMM. + """ + if not hbond_donor_acceptor_dict: + print 'Using default CHARMM atom namings' + hbond_donor_acceptor_dict=BuildCHARMMHBondDonorAcceptorDict() + donor_list=[] + acceptor_list=[] + for r in eh.residues: + if not r.name in hbond_donor_acceptor_dict: + print 'donors and acceptors for',r,'are not defined in the dictionary and will not be included' + continue + res_da_dict=hbond_donor_acceptor_dict[r.name] + for acceptor in res_da_dict.acceptors: + a=HBondAcceptor.FromResidue(r,acceptor[0],acceptor[1],verbose) + if not a==None:acceptor_list.append(a) + for donor in res_da_dict.donors: + d=HBondDonor.FromResidue(r,donor[0],donor[1],verbose) + if not d==None:donor_list.append(d) + return [donor_list,acceptor_list] + + +def GetHbondListFromDonorAcceptorLists(donor_list,acceptor_list): + """ + return a list of hydrogen bonds between donors and acceptors from + a list of donors and a list of acceptors. + """ + hbond_list=[] + for donor in donor_list: + for acceptor in acceptor_list: + if AreHBonded(donor,acceptor):hbond_list.append(HBond(donor,acceptor)) + return hbond_list + +def GetHbondListFromView(eh,hbond_donor_acceptor_dict={},verbose=True): + """ + return a list of hydrogen bonds from an Entity or EntityView. + if no dictionary for the hbond donors and acceptors is specified + it will use the standard CHARMM names to determine them + """ + [donor_list,acceptor_list]=GetHbondDonorAcceptorList(eh,hbond_donor_acceptor_dict,verbose) + hbond_list=[] + for donor in donor_list: + for acceptor in acceptor_list: + if AreHBonded(donor,acceptor):hbond_list.append(HBond(donor,acceptor)) + return hbond_list + +def GetHbondListFromTraj(t,eh,cutoff=0.7,stride=1,swap=False,donor_swap_dict={},acceptor_swap_dict={},hbond_donor_acceptor_dict={},verbose=True): + """ + return a list of hydrogen bonds from an Entity or EntityView that are + present in a fraction of the frames larger than *cutoff*. + if no dictionary for the hbond donors and acceptors is specified + it will use the standard CHARMM names to determine them + """ + if swap: + if not donor_swap_dict: + print 'use of standard CHARMM HBond donor swap dictionary' + donor_swap_dict=BuildCHARMMHBondDonorEquivalenceDict() + if not acceptor_swap_dict: + print 'use of standard CHARMM HBond acceptor swap dictionary' + acceptor_swap_dict=BuildCHARMMHBondAcceptorEquivalenceDict() + [donor_list,acceptor_list]=GetHbondDonorAcceptorList(eh,hbond_donor_acceptor_dict,verbose) + hb_list=[] + hb_score=[] + nframes=0 + for i in range(0,t.GetFrameCount(),stride): + t.CopyFrame(i) + nframes+=1 + hbond_list=GetHbondListFromDonorAcceptorLists(donor_list,acceptor_list) + if swap: + hbond_list=GetEquivalentHBonds(hbond_list,eh,swap,donor_swap_dict,acceptor_swap_dict,verbose) + for hb in hbond_list: + if hb in hbond_list[hbond_list.index(hb)+1:]:hbond_list.pop(hbond_list.index(hb)) + for hb in hbond_list: + if hb in hb_list:hb_score[hb_list.index(hb)]+=1 + else: + hb_score.append(1) + hb_list.append(hb) + hbond_list=[] + hbond_score=[] + for hb,s in zip(hb_list,hb_score): + if s/float(nframes)>=cutoff: + if swap:hbond_list.append(list(hb)[0]) + else:hbond_list.append(hb) + hbond_score.append(s/float(nframes)) + return (hbond_list,hbond_score) + +def GetHbondListBetweenViews(eh1,eh2,hbond_donor_acceptor_dict={},verbose=True): + """ + return the list of hydrogen bonds formed between two Entity or EntityView. + if no dictionary for the hbond donors and acceptors is specified + it will use the standard CHARMM names to determine them + """ + [donor_list1,acceptor_list1]=GetHbondDonorAcceptorList(eh1,hbond_donor_acceptor_dict,verbose) + [donor_list2,acceptor_list2]=GetHbondDonorAcceptorList(eh2,hbond_donor_acceptor_dict,verbose) + hbond_list=[] + for donor in donor_list1: + for acceptor in acceptor_list2: + if AreHBonded(donor,acceptor): + hb=HBond(donor,acceptor) + if hb in hbond_list:continue + hbond_list.append(hb) + for donor in donor_list2: + for acceptor in acceptor_list1: + if AreHBonded(donor,acceptor): + hb=HBond(donor,acceptor) + if hb in hbond_list:continue + hbond_list.append(hb) + return hbond_list + +def GetEquivalentHBonds(ref_hbond_list,eh,swap=False,donor_swap_dict={},acceptor_swap_dict={},verbose=True): + hbond_list=[] + if not swap: + for hbond in ref_hbond_list: + res1=eh.FindResidue(hbond.donor.heavy_atom.chain.name,hbond.donor.heavy_atom.residue.number.num) + res2=eh.FindResidue(hbond.acceptor.atom.chain.name,hbond.acceptor.atom.residue.number.num) + donor=HBondDonor.FromResidue(res1,hbond.donor.heavy_atom.name,hbond.donor.hydrogen.name,verbose) + acceptor=HBondAcceptor.FromResidue(res2,hbond.acceptor.atom.name,[a.name for a in hbond.acceptor.antecedent_list],verbose) + hbond_list.append(set([HBond(donor,acceptor)])) + else: + if not donor_swap_dict: + print 'use of standard CHARMM HBond donor swap dictionary' + donor_swap_dict=BuildCHARMMHBondDonorEquivalenceDict() + if not acceptor_swap_dict: + print 'use of standard CHARMM HBond acceptor swap dictionary' + acceptor_swap_dict=BuildCHARMMHBondAcceptorEquivalenceDict() + for hbond in ref_hbond_list: + res1=eh.FindResidue(hbond.donor.heavy_atom.chain.name,hbond.donor.heavy_atom.residue.number.num) + res2=eh.FindResidue(hbond.acceptor.atom.chain.name,hbond.acceptor.atom.residue.number.num) + donor=HBondDonor.FromResidue(res1,hbond.donor.heavy_atom.name,hbond.donor.hydrogen.name,verbose) + acceptor=HBondAcceptor.FromResidue(res2,hbond.acceptor.atom.name,[a.name for a in hbond.acceptor.antecedent_list],verbose) + donor_list=ListEquivalentDonors(donor,donor_swap_dict) + acceptor_list=ListEquivalentAcceptors(acceptor,acceptor_swap_dict) + hbond_list.append(set([HBond(d,a) for d in donor_list for a in acceptor_list])) + return hbond_list + + +def CalculateHBondScore(ref_eh,eh2,ref_eh2=None,hbond_donor_acceptor_dict={},swap=False,donor_swap_dict={},acceptor_swap_dict={},verbose=True): + """ + Returns the fraction of H-bonds from ref_eh that are also present in eh2. + If ref_eh2 is specified, it uses as reference the Hbonds between ref_eh and ref_eh2. + This allows to look at H-bonds between specific parts of proteins or so. + Alternatively ref_eh can be a list of H-bonds. + This function relies on atom names to determine the list of H-bond donors and acceptors. + These names are given in a dictionary, which defaults to CHARMM. + If swap is set to True, a dictionary for equivalent donors and one for equivalent acceptors + (defaults to CHARMM) is used to check for equivalent HBonds in eh2. + If swap is set to True, if two equivalent hydrogen bonds are present in the reference entity + (for example both oxygens of ASP H-bonding the same atom), it suffices that on of these bonds is + present in eh2 for both of them to be counted as present in eh2. + """ + if ref_eh2:hbond_list1=GetHbondListBetweenViews(ref_eh,ref_eh2,hbond_donor_acceptor_dict,verbose) + elif type(ref_eh)==list:hbond_list1=ref_eh + else:hbond_list1=GetHbondListFromView(ref_eh,hbond_donor_acceptor_dict,verbose) + nbonds=float(len(hbond_list1)) + if nbonds==0: + print 'No HBonds in reference view' + return None + hbond_list2=GetEquivalentHBonds(hbond_list1,eh2,swap,donor_swap_dict,acceptor_swap_dict,verbose) + c=0 + for hl in hbond_list2: + for hbond in hl: + if HBond(hbond.donor,hbond.acceptor).IsFormed(): + c+=1 + break + return c/float(len(hbond_list1)) + + +def AnalyzeHBondScore(ref_eh,t,eh2,ref_eh2=None,hbond_donor_acceptor_dict={},swap=False,donor_swap_dict={},acceptor_swap_dict={},first=0,last=-1,stride=1,verbose=True): + """ + Returns the same score as CalculateHBondScore, but for a trajectory. + """ + if swap: + if not donor_swap_dict: + print 'use of standard CHARMM HBond donor swap dictionary' + donor_swap_dict=BuildCHARMMHBondDonorEquivalenceDict() + if not acceptor_swap_dict: + print 'use of standard CHARMM HBond acceptor swap dictionary' + acceptor_swap_dict=BuildCHARMMHBondAcceptorEquivalenceDict() + if ref_eh2:hbond_list1=GetHbondListBetweenViews(ref_eh,ref_eh2,hbond_donor_acceptor_dict,verbose) + elif type(ref_eh)==list:hbond_list1=ref_eh + else:hbond_list1=GetHbondListFromView(ref_eh,hbond_donor_acceptor_dict,verbose) + nbonds=float(len(hbond_list1)) + if nbonds==0: + print 'No HBonds in reference view' + return None + print 'number of hbonds in ref_eh:',nbonds + hbond_list2=GetEquivalentHBonds(hbond_list1,eh2,swap,donor_swap_dict,acceptor_swap_dict,verbose) + if last==-1:last=t.GetFrameCount() + score=FloatList() + for f in range(first,last,stride): + t.CopyFrame(f) + c=0 + for hl in hbond_list2: + for hbond in hl: + if hbond.IsFormed(): + c+=1 + break + score.append(c/nbonds) + return score + + +def GetHBondListIntersection(ref_hbond_list,ref_eh,hbond_list,swap=False,donor_swap_dict={},acceptor_swap_dict={}): + if swap: + if not donor_swap_dict: + print 'use of standard CHARMM HBond donor swap dictionary' + donor_swap_dict=BuildCHARMMHBondDonorEquivalenceDict() + if not acceptor_swap_dict: + print 'use of standard CHARMM HBond acceptor swap dictionary' + acceptor_swap_dict=BuildCHARMMHBondAcceptorEquivalenceDict() + hbond_list=GetEquivalentHBonds(hbond_list,ref_eh,swap,donor_swap_dict,acceptor_swap_dict) + ref_hbond_list=GetEquivalentHBonds(ref_hbond_list,ref_eh,swap,donor_swap_dict,acceptor_swap_dict) + out_hbond_list=[] + for hb in ref_hbond_list: + if hb in hbond_list: + out_hbond_list.append(hb) + return out_hbond_list + + + + + + diff --git a/modules/mol/alg/tests/CMakeLists.txt b/modules/mol/alg/tests/CMakeLists.txt index 758bbbe10df71687391cac11a0425a253b94dc27..5db23c240db732ba6b00fc72da4b9581a2cf9af1 100644 --- a/modules/mol/alg/tests/CMakeLists.txt +++ b/modules/mol/alg/tests/CMakeLists.txt @@ -3,6 +3,7 @@ set(OST_MOL_ALG_UNIT_TESTS tests.cc test_consistency_checks.cc test_convenient_superpose.py + test_hbond.py ) ost_unittest(MODULE mol_alg SOURCES "${OST_MOL_ALG_UNIT_TESTS}") diff --git a/modules/mol/alg/tests/test_hbond.py b/modules/mol/alg/tests/test_hbond.py new file mode 100644 index 0000000000000000000000000000000000000000..dfef424412c5557c34c5f1b9202616076b4ccd86 --- /dev/null +++ b/modules/mol/alg/tests/test_hbond.py @@ -0,0 +1,25 @@ +from ost import io,mol +import unittest +import os + +class TestHBond(unittest.TestCase): + + def setUp(self): + p=io.IOProfile(dialect='CHARMM') + self.eh1=io.LoadPDB(os.path.join("testfiles","hbond1.pdb"),profile=p) + self.eh2=io.LoadPDB(os.path.join("testfiles","hbond2.pdb"),profile=p) + self.hb_da_dict=mol.alg.hbond.BuildCHARMMHBondDonorAcceptorDict() + + def testHBondList(self): + hbl1=mol.alg.hbond.GetHbondListFromView(self.eh1.Select('cname=PROA'),self.hb_da_dict) + for hb in hbl1:self.assertTrue(hb.IsFormed()) + hbl=mol.alg.hbond.GetHbondListBetweenViews(self.eh1,self.eh2,self.hb_da_dict) + self.assertEqual(len(hbl),1) + + def testHBondScore(self): + self.assertEqual(mol.alg.hbond.CalculateHBondScore(self.eh1,self.eh2,hbond_donor_acceptor_dict=self.hb_da_dict),0.8) + + +if __name__ == "__main__": + from ost import testutils + testutils.RunTests() diff --git a/modules/mol/alg/tests/testfiles/hbond1.pdb b/modules/mol/alg/tests/testfiles/hbond1.pdb new file mode 100644 index 0000000000000000000000000000000000000000..657a7721657b735840bc71ccebfec1302dad8ae6 --- /dev/null +++ b/modules/mol/alg/tests/testfiles/hbond1.pdb @@ -0,0 +1,153 @@ +CRYST1 0.000 0.000 0.000 90.00 90.00 90.00 P 1 1 +ATOM 1 N VAL X 365 11.618 5.729 5.041 1.00 0.00 PROA +ATOM 2 HN VAL X 365 12.357 5.874 5.695 1.00 0.00 PROA +ATOM 3 CA VAL X 365 11.817 4.614 4.057 1.00 0.00 PROA +ATOM 4 HA VAL X 365 12.120 5.063 3.123 1.00 0.00 PROA +ATOM 5 CB VAL X 365 12.880 3.638 4.555 1.00 0.00 PROA +ATOM 6 HB VAL X 365 12.758 3.271 5.597 1.00 0.00 PROA +ATOM 7 CG1 VAL X 365 12.923 2.493 3.581 1.00 0.00 PROA +ATOM 8 HG11 VAL X 365 13.769 1.825 3.851 1.00 0.00 PROA +ATOM 9 HG12 VAL X 365 13.253 2.820 2.572 1.00 0.00 PROA +ATOM 10 HG13 VAL X 365 11.981 1.905 3.547 1.00 0.00 PROA +ATOM 11 CG2 VAL X 365 14.252 4.368 4.370 1.00 0.00 PROA +ATOM 12 HG21 VAL X 365 15.034 3.769 4.883 1.00 0.00 PROA +ATOM 13 HG22 VAL X 365 14.264 5.327 4.931 1.00 0.00 PROA +ATOM 14 HG23 VAL X 365 14.509 4.512 3.299 1.00 0.00 PROA +ATOM 15 C VAL X 365 10.530 3.823 3.977 1.00 0.00 PROA +ATOM 16 O VAL X 365 9.878 3.644 2.985 1.00 0.00 PROA +ATOM 17 N VAL X 366 10.051 3.478 5.122 1.00 0.00 PROA +ATOM 18 HN VAL X 366 10.696 3.723 5.842 1.00 0.00 PROA +ATOM 19 CA VAL X 366 8.835 2.700 5.461 1.00 0.00 PROA +ATOM 20 HA VAL X 366 8.796 1.776 4.904 1.00 0.00 PROA +ATOM 21 CB VAL X 366 8.746 2.433 7.004 1.00 0.00 PROA +ATOM 22 HB VAL X 366 9.106 3.359 7.502 1.00 0.00 PROA +ATOM 23 CG1 VAL X 366 7.329 1.969 7.489 1.00 0.00 PROA +ATOM 24 HG11 VAL X 366 7.144 0.966 7.048 1.00 0.00 PROA +ATOM 25 HG12 VAL X 366 6.516 2.720 7.398 1.00 0.00 PROA +ATOM 26 HG13 VAL X 366 7.439 1.826 8.585 1.00 0.00 PROA +ATOM 27 CG2 VAL X 366 9.782 1.385 7.527 1.00 0.00 PROA +ATOM 28 HG21 VAL X 366 10.802 1.644 7.170 1.00 0.00 PROA +ATOM 29 HG22 VAL X 366 9.494 0.418 7.061 1.00 0.00 PROA +ATOM 30 HG23 VAL X 366 9.859 1.344 8.635 1.00 0.00 PROA +ATOM 31 C VAL X 366 7.586 3.380 4.923 1.00 0.00 PROA +ATOM 32 O VAL X 366 6.625 2.754 4.429 1.00 0.00 PROA +ATOM 33 N SER X 367 7.487 4.721 5.110 1.00 0.00 PROA +ATOM 34 HN SER X 367 8.179 5.195 5.649 1.00 0.00 PROA +ATOM 35 CA SER X 367 6.337 5.546 4.756 1.00 0.00 PROA +ATOM 36 HA SER X 367 5.563 4.863 5.073 1.00 0.00 PROA +ATOM 37 CB SER X 367 6.182 6.894 5.600 1.00 0.00 PROA +ATOM 38 HB1 SER X 367 5.344 7.513 5.212 1.00 0.00 PROA +ATOM 39 HB2 SER X 367 7.029 7.611 5.544 1.00 0.00 PROA +ATOM 40 OG SER X 367 5.775 6.479 6.922 1.00 0.00 PROA +ATOM 41 HG1 SER X 367 6.559 6.323 7.455 1.00 0.00 PROA +ATOM 42 C SER X 367 6.198 5.925 3.285 1.00 0.00 PROA +ATOM 43 O SER X 367 5.073 5.984 2.834 1.00 0.00 PROA +ATOM 44 N MET X 368 7.342 6.011 2.516 1.00 0.00 PROA +ATOM 45 HN MET X 368 8.222 5.956 2.983 1.00 0.00 PROA +ATOM 46 CA MET X 368 7.428 6.146 1.069 1.00 0.00 PROA +ATOM 47 HA MET X 368 6.557 6.750 0.862 1.00 0.00 PROA +ATOM 48 CB MET X 368 8.820 6.736 0.716 1.00 0.00 PROA +ATOM 49 HB1 MET X 368 8.940 6.324 -0.309 1.00 0.00 PROA +ATOM 50 HB2 MET X 368 9.600 6.202 1.300 1.00 0.00 PROA +ATOM 51 CG MET X 368 9.114 8.160 0.683 1.00 0.00 PROA +ATOM 52 HG1 MET X 368 8.970 8.637 1.676 1.00 0.00 PROA +ATOM 53 HG2 MET X 368 8.370 8.708 0.066 1.00 0.00 PROA +ATOM 54 SD MET X 368 10.854 8.414 0.112 1.00 0.00 PROA +ATOM 55 CE MET X 368 10.429 8.518 -1.623 1.00 0.00 PROA +ATOM 56 HE1 MET X 368 9.988 7.542 -1.920 1.00 0.00 PROA +ATOM 57 HE2 MET X 368 11.252 8.736 -2.337 1.00 0.00 PROA +ATOM 58 HE3 MET X 368 9.589 9.226 -1.790 1.00 0.00 PROA +ATOM 59 C MET X 368 7.275 4.776 0.395 1.00 0.00 PROA +ATOM 60 O MET X 368 7.019 4.790 -0.788 1.00 0.00 PROA +ATOM 61 N THR X 369 7.214 3.623 1.096 1.00 0.00 PROA +ATOM 62 HN THR X 369 7.600 3.536 2.011 1.00 0.00 PROA +ATOM 63 CA THR X 369 6.846 2.309 0.543 1.00 0.00 PROA +ATOM 64 HA THR X 369 6.730 2.329 -0.531 1.00 0.00 PROA +ATOM 65 CB THR X 369 7.907 1.155 0.795 1.00 0.00 PROA +ATOM 66 HB THR X 369 7.533 0.164 0.462 1.00 0.00 PROA +ATOM 67 OG1 THR X 369 8.262 1.067 2.193 1.00 0.00 PROA +ATOM 68 HG1 THR X 369 9.002 1.674 2.272 1.00 0.00 PROA +ATOM 69 CG2 THR X 369 9.178 1.518 0.004 1.00 0.00 PROA +ATOM 70 HG21 THR X 369 9.671 2.472 0.289 1.00 0.00 PROA +ATOM 71 HG22 THR X 369 8.889 1.546 -1.069 1.00 0.00 PROA +ATOM 72 HG23 THR X 369 9.937 0.734 0.209 1.00 0.00 PROA +ATOM 73 C THR X 369 5.462 1.772 0.950 1.00 0.00 PROA +ATOM 74 O THR X 369 4.930 0.735 0.605 1.00 0.00 PROA +ATOM 75 N THR X 370 4.854 2.524 1.837 1.00 0.00 PROA +ATOM 76 HN THR X 370 5.428 3.274 2.153 1.00 0.00 PROA +ATOM 77 CA THR X 370 3.475 2.307 2.319 1.00 0.00 PROA +ATOM 78 HA THR X 370 3.360 3.216 2.891 1.00 0.00 PROA +ATOM 79 CB THR X 370 2.240 2.301 1.374 1.00 0.00 PROA +ATOM 80 HB THR X 370 1.254 2.317 1.885 1.00 0.00 PROA +ATOM 81 OG1 THR X 370 2.242 1.131 0.613 1.00 0.00 PROA +ATOM 82 HG1 THR X 370 3.158 1.140 0.326 1.00 0.00 PROA +ATOM 83 CG2 THR X 370 2.369 3.574 0.385 1.00 0.00 PROA +ATOM 84 HG21 THR X 370 3.203 3.523 -0.347 1.00 0.00 PROA +ATOM 85 HG22 THR X 370 2.338 4.553 0.910 1.00 0.00 PROA +ATOM 86 HG23 THR X 370 1.474 3.574 -0.273 1.00 0.00 PROA +ATOM 87 C THR X 370 3.265 1.190 3.381 1.00 0.00 PROA +ATOM 88 O THR X 370 2.139 0.782 3.712 1.00 0.00 PROA +ATOM 89 N VAL X 371 4.303 0.659 4.032 1.00 0.00 PROA +ATOM 90 HN VAL X 371 5.248 0.913 3.842 1.00 0.00 PROA +ATOM 91 CA VAL X 371 4.174 -0.341 5.080 1.00 0.00 PROA +ATOM 92 HA VAL X 371 3.441 -1.080 4.793 1.00 0.00 PROA +ATOM 93 CB VAL X 371 5.481 -1.050 5.302 1.00 0.00 PROA +ATOM 94 HB VAL X 371 6.237 -0.236 5.308 1.00 0.00 PROA +ATOM 95 CG1 VAL X 371 5.466 -1.885 6.550 1.00 0.00 PROA +ATOM 96 HG11 VAL X 371 6.411 -2.466 6.596 1.00 0.00 PROA +ATOM 97 HG12 VAL X 371 4.716 -2.694 6.420 1.00 0.00 PROA +ATOM 98 HG13 VAL X 371 5.106 -1.485 7.523 1.00 0.00 PROA +ATOM 99 CG2 VAL X 371 5.853 -2.056 4.210 1.00 0.00 PROA +ATOM 100 HG21 VAL X 371 6.761 -2.619 4.515 1.00 0.00 PROA +ATOM 101 HG22 VAL X 371 6.035 -1.600 3.213 1.00 0.00 PROA +ATOM 102 HG23 VAL X 371 5.121 -2.885 4.106 1.00 0.00 PROA +ATOM 103 C VAL X 371 3.496 0.214 6.320 1.00 0.00 PROA +ATOM 104 O VAL X 371 2.650 -0.424 6.942 1.00 0.00 PROA +ATOM 105 N GLY X 372 3.947 1.347 6.802 1.00 0.00 PROA +ATOM 106 HN GLY X 372 4.595 1.901 6.287 1.00 0.00 PROA +ATOM 107 CA GLY X 372 3.520 1.972 8.032 1.00 0.00 PROA +ATOM 108 HA1 GLY X 372 2.723 2.649 7.763 1.00 0.00 PROA +ATOM 109 HA2 GLY X 372 4.361 2.574 8.344 1.00 0.00 PROA +ATOM 110 C GLY X 372 3.136 1.234 9.276 1.00 0.00 PROA +ATOM 111 O GLY X 372 1.970 1.231 9.629 1.00 0.00 PROA +ATOM 112 N TYR X 373 4.173 0.790 9.993 1.00 0.00 PROA +ATOM 113 HN TYR X 373 5.105 0.907 9.660 1.00 0.00 PROA +ATOM 114 CA TYR X 373 4.103 0.124 11.289 1.00 0.00 PROA +ATOM 115 HA TYR X 373 3.395 -0.690 11.244 1.00 0.00 PROA +ATOM 116 CB TYR X 373 5.483 -0.396 11.768 1.00 0.00 PROA +ATOM 117 HB1 TYR X 373 5.336 -1.033 12.666 1.00 0.00 PROA +ATOM 118 HB2 TYR X 373 6.131 0.393 12.207 1.00 0.00 PROA +ATOM 119 CG TYR X 373 6.167 -1.214 10.741 1.00 0.00 PROA +ATOM 120 CD1 TYR X 373 7.308 -0.793 10.077 1.00 0.00 PROA +ATOM 121 HD1 TYR X 373 7.643 0.203 10.326 1.00 0.00 PROA +ATOM 122 CE1 TYR X 373 8.073 -1.689 9.309 1.00 0.00 PROA +ATOM 123 HE1 TYR X 373 8.917 -1.335 8.734 1.00 0.00 PROA +ATOM 124 CZ TYR X 373 7.697 -2.975 9.180 1.00 0.00 PROA +ATOM 125 OH TYR X 373 8.377 -3.851 8.259 1.00 0.00 PROA +ATOM 126 HH TYR X 373 7.688 -4.382 7.853 1.00 0.00 PROA +ATOM 127 CD2 TYR X 373 5.680 -2.561 10.477 1.00 0.00 PROA +ATOM 128 HD2 TYR X 373 4.788 -3.024 10.874 1.00 0.00 PROA +ATOM 129 CE2 TYR X 373 6.480 -3.382 9.648 1.00 0.00 PROA +ATOM 130 HE2 TYR X 373 6.226 -4.418 9.483 1.00 0.00 PROA +ATOM 131 C TYR X 373 3.617 1.013 12.496 1.00 0.00 PROA +ATOM 132 O TYR X 373 3.034 0.496 13.423 1.00 0.00 PROA +ATOM 133 N GLY X 374 3.825 2.267 12.445 1.00 0.00 PROA +ATOM 134 HN GLY X 374 4.376 2.631 11.698 1.00 0.00 PROA +ATOM 135 CA GLY X 374 3.328 3.182 13.462 1.00 0.00 PROA +ATOM 136 HA1 GLY X 374 2.305 2.898 13.661 1.00 0.00 PROA +ATOM 137 HA2 GLY X 374 3.435 4.173 13.045 1.00 0.00 PROA +ATOM 138 C GLY X 374 3.994 3.245 14.868 1.00 0.00 PROA +ATOM 139 O GLY X 374 3.441 3.506 15.895 1.00 0.00 PROA +ATOM 140 N ASP X 375 5.321 2.894 14.810 1.00 0.00 PROA +ATOM 141 HN ASP X 375 5.795 2.561 13.998 1.00 0.00 PROA +ATOM 142 CA ASP X 375 6.199 2.731 15.953 1.00 0.00 PROA +ATOM 143 HA ASP X 375 5.607 2.484 16.822 1.00 0.00 PROA +ATOM 144 CB ASP X 375 7.318 1.659 15.729 1.00 0.00 PROA +ATOM 145 HB1 ASP X 375 6.916 0.639 15.553 1.00 0.00 PROA +ATOM 146 HB2 ASP X 375 7.905 1.600 16.671 1.00 0.00 PROA +ATOM 147 CG ASP X 375 8.095 1.992 14.492 1.00 0.00 PROA +ATOM 148 OD1 ASP X 375 7.527 2.389 13.446 1.00 0.00 PROA +ATOM 149 OD2 ASP X 375 9.333 1.825 14.541 1.00 0.00 PROA +ATOM 150 C ASP X 375 6.890 4.164 16.143 1.00 0.00 PROA +ATOM 151 O ASP X 375 7.375 4.508 17.268 1.00 0.00 PROA +END diff --git a/modules/mol/alg/tests/testfiles/hbond2.pdb b/modules/mol/alg/tests/testfiles/hbond2.pdb new file mode 100644 index 0000000000000000000000000000000000000000..2f1f7395b6721639c3137b8f54497e95ca636448 --- /dev/null +++ b/modules/mol/alg/tests/testfiles/hbond2.pdb @@ -0,0 +1,153 @@ +CRYST1 0.000 0.000 0.000 90.00 90.00 90.00 P 1 1 +ATOM 152 N VAL X 365 -5.554 10.917 5.263 1.00 0.00 PROA +ATOM 153 HN VAL X 365 -5.487 11.435 6.112 1.00 0.00 PROA +ATOM 154 CA VAL X 365 -4.443 11.069 4.295 1.00 0.00 PROA +ATOM 155 HA VAL X 365 -4.843 10.903 3.305 1.00 0.00 PROA +ATOM 156 CB VAL X 365 -3.524 12.340 4.423 1.00 0.00 PROA +ATOM 157 HB VAL X 365 -3.253 12.456 5.494 1.00 0.00 PROA +ATOM 158 CG1 VAL X 365 -2.216 12.278 3.596 1.00 0.00 PROA +ATOM 159 HG11 VAL X 365 -1.525 11.626 4.173 1.00 0.00 PROA +ATOM 160 HG12 VAL X 365 -1.831 13.320 3.602 1.00 0.00 PROA +ATOM 161 HG13 VAL X 365 -2.437 11.945 2.559 1.00 0.00 PROA +ATOM 162 CG2 VAL X 365 -4.425 13.546 3.950 1.00 0.00 PROA +ATOM 163 HG21 VAL X 365 -5.359 13.460 4.546 1.00 0.00 PROA +ATOM 164 HG22 VAL X 365 -4.691 13.416 2.879 1.00 0.00 PROA +ATOM 165 HG23 VAL X 365 -3.990 14.518 4.268 1.00 0.00 PROA +ATOM 166 C VAL X 365 -3.585 9.847 4.444 1.00 0.00 PROA +ATOM 167 O VAL X 365 -3.242 9.204 3.452 1.00 0.00 PROA +ATOM 168 N VAL X 366 -3.285 9.472 5.670 1.00 0.00 PROA +ATOM 169 HN VAL X 366 -3.775 9.952 6.394 1.00 0.00 PROA +ATOM 170 CA VAL X 366 -2.467 8.371 5.951 1.00 0.00 PROA +ATOM 171 HA VAL X 366 -1.507 8.470 5.466 1.00 0.00 PROA +ATOM 172 CB VAL X 366 -2.075 8.398 7.434 1.00 0.00 PROA +ATOM 173 HB VAL X 366 -3.000 8.654 7.994 1.00 0.00 PROA +ATOM 174 CG1 VAL X 366 -1.681 7.006 7.930 1.00 0.00 PROA +ATOM 175 HG11 VAL X 366 -1.042 6.384 7.268 1.00 0.00 PROA +ATOM 176 HG12 VAL X 366 -2.625 6.443 8.094 1.00 0.00 PROA +ATOM 177 HG13 VAL X 366 -1.257 7.106 8.952 1.00 0.00 PROA +ATOM 178 CG2 VAL X 366 -0.899 9.358 7.612 1.00 0.00 PROA +ATOM 179 HG21 VAL X 366 -1.114 10.376 7.223 1.00 0.00 PROA +ATOM 180 HG22 VAL X 366 -0.054 8.930 7.031 1.00 0.00 PROA +ATOM 181 HG23 VAL X 366 -0.616 9.392 8.686 1.00 0.00 PROA +ATOM 182 C VAL X 366 -3.008 6.988 5.448 1.00 0.00 PROA +ATOM 183 O VAL X 366 -2.313 6.111 4.893 1.00 0.00 PROA +ATOM 184 N SER X 367 -4.332 6.886 5.581 1.00 0.00 PROA +ATOM 185 HN SER X 367 -4.703 7.664 6.082 1.00 0.00 PROA +ATOM 186 CA SER X 367 -5.141 5.772 5.060 1.00 0.00 PROA +ATOM 187 HA SER X 367 -4.643 4.849 5.316 1.00 0.00 PROA +ATOM 188 CB SER X 367 -6.518 5.685 5.729 1.00 0.00 PROA +ATOM 189 HB1 SER X 367 -7.163 4.883 5.311 1.00 0.00 PROA +ATOM 190 HB2 SER X 367 -7.072 6.633 5.560 1.00 0.00 PROA +ATOM 191 OG SER X 367 -6.416 5.557 7.171 1.00 0.00 PROA +ATOM 192 HG1 SER X 367 -5.984 6.307 7.585 1.00 0.00 PROA +ATOM 193 C SER X 367 -5.415 5.859 3.562 1.00 0.00 PROA +ATOM 194 O SER X 367 -5.270 4.884 2.894 1.00 0.00 PROA +ATOM 195 N MET X 368 -5.730 7.029 2.940 1.00 0.00 PROA +ATOM 196 HN MET X 368 -5.866 7.929 3.348 1.00 0.00 PROA +ATOM 197 CA MET X 368 -5.795 7.114 1.519 1.00 0.00 PROA +ATOM 198 HA MET X 368 -6.548 6.394 1.235 1.00 0.00 PROA +ATOM 199 CB MET X 368 -6.380 8.511 1.170 1.00 0.00 PROA +ATOM 200 HB1 MET X 368 -6.326 8.686 0.074 1.00 0.00 PROA +ATOM 201 HB2 MET X 368 -5.876 9.300 1.768 1.00 0.00 PROA +ATOM 202 CG MET X 368 -7.924 8.541 1.385 1.00 0.00 PROA +ATOM 203 HG1 MET X 368 -8.032 8.383 2.479 1.00 0.00 PROA +ATOM 204 HG2 MET X 368 -8.330 7.620 0.915 1.00 0.00 PROA +ATOM 205 SD MET X 368 -8.865 9.874 0.776 1.00 0.00 PROA +ATOM 206 CE MET X 368 -9.036 9.409 -0.929 1.00 0.00 PROA +ATOM 207 HE1 MET X 368 -9.695 8.515 -0.956 1.00 0.00 PROA +ATOM 208 HE2 MET X 368 -8.087 9.204 -1.470 1.00 0.00 PROA +ATOM 209 HE3 MET X 368 -9.547 10.168 -1.559 1.00 0.00 PROA +ATOM 210 C MET X 368 -4.566 6.781 0.700 1.00 0.00 PROA +ATOM 211 O MET X 368 -4.593 6.129 -0.321 1.00 0.00 PROA +ATOM 212 N THR X 369 -3.408 7.154 1.181 1.00 0.00 PROA +ATOM 213 HN THR X 369 -3.323 7.498 2.112 1.00 0.00 PROA +ATOM 214 CA THR X 369 -2.039 6.822 0.741 1.00 0.00 PROA +ATOM 215 HA THR X 369 -2.031 7.105 -0.301 1.00 0.00 PROA +ATOM 216 CB THR X 369 -0.913 7.602 1.451 1.00 0.00 PROA +ATOM 217 HB THR X 369 0.129 7.288 1.229 1.00 0.00 PROA +ATOM 218 OG1 THR X 369 -1.048 7.538 2.896 1.00 0.00 PROA +ATOM 219 HG1 THR X 369 -1.786 8.110 3.119 1.00 0.00 PROA +ATOM 220 CG2 THR X 369 -0.882 9.067 0.993 1.00 0.00 PROA +ATOM 221 HG21 THR X 369 -0.022 9.636 1.405 1.00 0.00 PROA +ATOM 222 HG22 THR X 369 -1.903 9.483 1.130 1.00 0.00 PROA +ATOM 223 HG23 THR X 369 -0.623 9.074 -0.087 1.00 0.00 PROA +ATOM 224 C THR X 369 -1.678 5.341 0.902 1.00 0.00 PROA +ATOM 225 O THR X 369 -1.000 4.641 0.135 1.00 0.00 PROA +ATOM 226 N THR X 370 -2.257 4.809 2.001 1.00 0.00 PROA +ATOM 227 HN THR X 370 -2.900 5.255 2.619 1.00 0.00 PROA +ATOM 228 CA THR X 370 -2.193 3.436 2.374 1.00 0.00 PROA +ATOM 229 HA THR X 370 -3.085 3.344 2.976 1.00 0.00 PROA +ATOM 230 CB THR X 370 -2.419 2.272 1.319 1.00 0.00 PROA +ATOM 231 HB THR X 370 -2.680 1.365 1.904 1.00 0.00 PROA +ATOM 232 OG1 THR X 370 -1.216 2.089 0.500 1.00 0.00 PROA +ATOM 233 HG1 THR X 370 -1.051 3.016 0.312 1.00 0.00 PROA +ATOM 234 CG2 THR X 370 -3.679 2.581 0.484 1.00 0.00 PROA +ATOM 235 HG21 THR X 370 -3.498 3.399 -0.246 1.00 0.00 PROA +ATOM 236 HG22 THR X 370 -4.289 3.016 1.304 1.00 0.00 PROA +ATOM 237 HG23 THR X 370 -4.118 1.612 0.164 1.00 0.00 PROA +ATOM 238 C THR X 370 -1.029 3.093 3.264 1.00 0.00 PROA +ATOM 239 O THR X 370 -0.716 1.894 3.397 1.00 0.00 PROA +ATOM 240 N VAL X 371 -0.363 4.083 3.837 1.00 0.00 PROA +ATOM 241 HN VAL X 371 -0.669 4.976 3.515 1.00 0.00 PROA +ATOM 242 CA VAL X 371 0.627 3.921 4.891 1.00 0.00 PROA +ATOM 243 HA VAL X 371 1.450 3.259 4.667 1.00 0.00 PROA +ATOM 244 CB VAL X 371 1.338 5.277 5.130 1.00 0.00 PROA +ATOM 245 HB VAL X 371 0.594 6.103 5.108 1.00 0.00 PROA +ATOM 246 CG1 VAL X 371 2.304 5.414 6.306 1.00 0.00 PROA +ATOM 247 HG11 VAL X 371 3.003 4.559 6.434 1.00 0.00 PROA +ATOM 248 HG12 VAL X 371 1.759 5.579 7.260 1.00 0.00 PROA +ATOM 249 HG13 VAL X 371 2.814 6.399 6.357 1.00 0.00 PROA +ATOM 250 CG2 VAL X 371 2.294 5.484 3.901 1.00 0.00 PROA +ATOM 251 HG21 VAL X 371 3.148 4.775 3.948 1.00 0.00 PROA +ATOM 252 HG22 VAL X 371 2.613 6.548 3.904 1.00 0.00 PROA +ATOM 253 HG23 VAL X 371 1.822 5.394 2.899 1.00 0.00 PROA +ATOM 254 C VAL X 371 0.037 3.426 6.191 1.00 0.00 PROA +ATOM 255 O VAL X 371 0.538 2.690 7.003 1.00 0.00 PROA +ATOM 256 N GLY X 372 -1.232 3.937 6.416 1.00 0.00 PROA +ATOM 257 HN GLY X 372 -1.498 4.659 5.782 1.00 0.00 PROA +ATOM 258 CA GLY X 372 -2.162 3.544 7.487 1.00 0.00 PROA +ATOM 259 HA1 GLY X 372 -2.714 2.680 7.149 1.00 0.00 PROA +ATOM 260 HA2 GLY X 372 -2.750 4.408 7.761 1.00 0.00 PROA +ATOM 261 C GLY X 372 -1.600 3.218 8.845 1.00 0.00 PROA +ATOM 262 O GLY X 372 -1.643 2.102 9.319 1.00 0.00 PROA +ATOM 263 N TYR X 373 -1.031 4.202 9.564 1.00 0.00 PROA +ATOM 264 HN TYR X 373 -1.181 5.155 9.311 1.00 0.00 PROA +ATOM 265 CA TYR X 373 -0.306 3.990 10.850 1.00 0.00 PROA +ATOM 266 HA TYR X 373 0.450 3.300 10.505 1.00 0.00 PROA +ATOM 267 CB TYR X 373 0.222 5.228 11.603 1.00 0.00 PROA +ATOM 268 HB1 TYR X 373 0.710 4.995 12.573 1.00 0.00 PROA +ATOM 269 HB2 TYR X 373 -0.581 5.976 11.773 1.00 0.00 PROA +ATOM 270 CG TYR X 373 1.290 5.928 10.866 1.00 0.00 PROA +ATOM 271 CD1 TYR X 373 1.293 7.331 10.766 1.00 0.00 PROA +ATOM 272 HD1 TYR X 373 0.456 7.864 11.191 1.00 0.00 PROA +ATOM 273 CE1 TYR X 373 2.140 8.027 9.936 1.00 0.00 PROA +ATOM 274 HE1 TYR X 373 1.928 9.084 9.870 1.00 0.00 PROA +ATOM 275 CZ TYR X 373 3.187 7.395 9.338 1.00 0.00 PROA +ATOM 276 OH TYR X 373 4.021 8.140 8.369 1.00 0.00 PROA +ATOM 277 HH TYR X 373 4.637 7.538 7.945 1.00 0.00 PROA +ATOM 278 CD2 TYR X 373 2.341 5.259 10.196 1.00 0.00 PROA +ATOM 279 HD2 TYR X 373 2.410 4.189 10.323 1.00 0.00 PROA +ATOM 280 CE2 TYR X 373 3.305 5.961 9.450 1.00 0.00 PROA +ATOM 281 HE2 TYR X 373 4.168 5.521 8.972 1.00 0.00 PROA +ATOM 282 C TYR X 373 -1.188 3.298 11.900 1.00 0.00 PROA +ATOM 283 O TYR X 373 -0.739 2.394 12.589 1.00 0.00 PROA +ATOM 284 N GLY X 374 -2.486 3.742 12.054 1.00 0.00 PROA +ATOM 285 HN GLY X 374 -2.925 4.399 11.446 1.00 0.00 PROA +ATOM 286 CA GLY X 374 -3.364 3.172 13.072 1.00 0.00 PROA +ATOM 287 HA1 GLY X 374 -3.231 2.117 13.263 1.00 0.00 PROA +ATOM 288 HA2 GLY X 374 -4.362 3.397 12.726 1.00 0.00 PROA +ATOM 289 C GLY X 374 -3.137 3.860 14.374 1.00 0.00 PROA +ATOM 290 O GLY X 374 -3.327 3.323 15.446 1.00 0.00 PROA +ATOM 291 N ASP X 375 -2.716 5.132 14.258 1.00 0.00 PROA +ATOM 292 HN ASP X 375 -2.592 5.517 13.347 1.00 0.00 PROA +ATOM 293 CA ASP X 375 -2.706 6.055 15.382 1.00 0.00 PROA +ATOM 294 HA ASP X 375 -2.052 5.529 16.061 1.00 0.00 PROA +ATOM 295 CB ASP X 375 -1.922 7.358 15.033 1.00 0.00 PROA +ATOM 296 HB1 ASP X 375 -0.878 7.053 14.806 1.00 0.00 PROA +ATOM 297 HB2 ASP X 375 -1.902 8.008 15.933 1.00 0.00 PROA +ATOM 298 CG ASP X 375 -2.464 8.125 13.886 1.00 0.00 PROA +ATOM 299 OD1 ASP X 375 -3.290 7.631 13.085 1.00 0.00 PROA +ATOM 300 OD2 ASP X 375 -1.993 9.254 13.689 1.00 0.00 PROA +ATOM 301 C ASP X 375 -4.051 6.331 16.038 1.00 0.00 PROA +ATOM 302 O ASP X 375 -4.171 6.341 17.271 1.00 0.00 PROA +END