00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 """
00020 Utility functions to load secondary structure information from DSSP files
00021 and assign them to entities.
00022
00023 Authors: Pascal Benkert, Marco Biasini
00024 """
00025
00026 import os
00027 import tempfile,subprocess
00028
00029 from ost import io,mol
00030 from ost import settings
00031
00032
00033 def _SkipHeader(stream):
00034 line=stream.readline()
00035 while line:
00036 if line.strip().find('#')==0:
00037 return True
00038 line=stream.readline()
00039 return False
00040
00041
00042 def _ExecuteDSSP(path, temp_dir=None):
00043
00044
00045 temp_dssp_path=tempfile.mktemp(suffix=".out",prefix="dssp", dir=temp_dir)
00046 dssp_abs_path=settings.Locate('dssp', env_name='DSSP_EXECUTABLE')
00047 command=dssp_abs_path+" "+path+" "+temp_dssp_path
00048 ps=subprocess.Popen(command, shell=True, stderr=subprocess.PIPE)
00049 err_lines=ps.stderr.readlines()
00050
00051 return temp_dssp_path
00052
00053
00054 def _CalcRelativeSA(residue_type, absolute_sa):
00055 solvent_max_list=[118,317,238,243,183,262,286,154,258,228,
00056 243,278,260,271,204,234,206,300,303,216]
00057 residue_indices = "ARNDCQEGHILKMFPSTWYV"
00058 if residue_type.islower()==True:
00059 residue_type='C'
00060 if residue_indices.find(residue_type)==-1:
00061 raise RuntimeError('residue %s is a non-standard residue' %(residue_type))
00062 else:
00063 rel=float(absolute_sa)/(solvent_max_list[residue_indices.find(residue_type)])
00064 return rel
00065
00066
00067 def AssignDSSP(ent, pdb_path="", extract_burial_status_flag=0, tmp_dir=None):
00068 entity_saved_flag = 0
00069
00070
00071 pdb_path=tempfile.mktemp(suffix=".pdb",prefix="temp_entity",
00072 dir=tmp_dir)
00073 io.SaveEntity(ent, pdb_path)
00074 entity_saved_flag = 1
00075
00076
00077
00078 temp_dssp_path=_ExecuteDSSP(pdb_path)
00079
00080
00081 try:
00082 LoadDSSP(temp_dssp_path, ent, extract_burial_status_flag,
00083 entity_saved_flag)
00084 except Exception, e:
00085
00086 print "Exception in DSSP:", e
00087 if entity_saved_flag == 1:
00088 os.remove(pdb_path)
00089 os.remove(temp_dssp_path)
00090 raise RuntimeError(e)
00091
00092
00093
00094 if entity_saved_flag == 1:
00095 os.remove(pdb_path)
00096 os.remove(temp_dssp_path)
00097
00098 return ent
00099
00100
00101
00102 def LoadDSSP(file_name, model, extract_burial_status_flag=0,
00103 entity_saved_flag=0, calculate_relative_sa=True):
00104 if model.IsValid() == 0:
00105 print "DSSP: model is not valid"
00106 stream=open(file_name)
00107 if not _SkipHeader(stream):
00108 stream.close()
00109 raise RuntimeError('Ill-formatted DSSP file')
00110
00111 for line in stream:
00112 num=line[6:10].strip()
00113 ins_code=line[10].strip()
00114 chain_name=line[11]
00115 solvent_accessibility=float(line[34:39].strip())
00116
00117 amino_acid=line[13]
00118
00119
00120
00121 if isinstance(model,mol.ChainView):
00122 chain=model
00123 else:
00124 chain=model.FindChain(chain_name)
00125
00126 if not chain.IsValid():
00127 continue
00128 if num=='':
00129 continue
00130 residue=None
00131 try:
00132 if ins_code == "":
00133 residue=chain.FindResidue(mol.ResNum(int(num)))
00134 else:
00135 residue=chain.FindResidue(mol.ResNum(int(num),ins_code))
00136
00137
00138 if extract_burial_status_flag == 1:
00139
00140 residue.SetStringProp("burial_status", 'X')
00141
00142
00143 if residue.name=="MSE" and amino_acid=='X':
00144 amino_acid='M'
00145
00146 residue.SetFloatProp("solvent_accessibility",
00147 solvent_accessibility)
00148 if calculate_relative_sa:
00149 relative_sa=_CalcRelativeSA(amino_acid,solvent_accessibility)
00150 residue.SetFloatProp("relative_solvent_accessibility",
00151 relative_sa)
00152 if relative_sa < 0.25:
00153 residue.SetStringProp("burial_status", 'b')
00154 else:
00155 residue.SetStringProp("burial_status", 'e')
00156 except Exception, e:
00157 print "ERROR:",e
00158 continue
00159
00160 rtype=line[16:17]
00161 rt=mol.SecStructure.COIL
00162 if rtype=='H':
00163 rt=mol.SecStructure.ALPHA_HELIX
00164 elif rtype=='E':
00165 rt=mol.SecStructure.EXTENDED
00166 elif rtype=='B':
00167 rt=mol.SecStructure.BETA_BRIDGE
00168 elif rtype=='S':
00169 rt=mol.SecStructure.BEND
00170 elif rtype=='T':
00171 rt=mol.SecStructure.TURN
00172 elif rtype=='I':
00173 rt=mol.SecStructure.PI_HELIX
00174 elif rtype=='G':
00175 rt=mol.SecStructure.THREE_TEN_HELIX
00176
00177 if residue.IsValid() == 0:
00178
00179
00180
00181 stream.close()
00182 raise RuntimeError('Ill-formatted DSSP file: invalid residue')
00183 residue.SetSecStructure(mol.SecStructure(rt))
00184 stream.close()