Hello,
I am trying to perform loop optimization on a protein structure which contains a non-standard ligand. The optimization I am attempting requires constrains between the ligand and the loops. Protein is chain A, ligand is a single residue defined as chain B, described as heteroatoms.
I had no trouble performing homology modeling from a structure containing the ligand, and it was correctly carried upon once I define env.io.hetatm = True .However this seems not to work anymore when doing loop optimization only on the same structure. When I try to run the job, I always get:
Traceback (most recent call last): File "tas2r463pbl_mod.py", line 42, in ? a.make() File "/usr/lib/modeller9.10/modlib/modeller/automodel/loopmodel.py", line 36, in make self.build_seq(self.inimodel, 1) File "/usr/lib/modeller9.10/modlib/modeller/automodel/loopmodel.py", line 167, in build_seq self.loop_restraints(atmsel, aln) File "/usr/lib/modeller9.10/modlib/modeller/automodel/loopmodel.py", line 361, in loop_restraints self.special_restraints(aln) File "tas2r463pbl_mod.py", line 24, in special_restraints rsr.add(forms.gaussian(group=physical.bond,feature=features.distance(at['CA:70:A'],at['C16:309:B']), mean=1.00, stdev=0.10)) File "/usr/lib/modeller9.10/modlib/modeller/coordinates.py", line 376, in __getitem__ (self.offset, self.length, self.suffix)) File "/usr/lib/modeller9.10/modlib/modeller/util/modutil.py", line 23, in handle_seq_indx int_indx = lookup_func(*args) File "/usr/lib/modeller9.10/modlib/modeller/coordinates.py", line 289, in _indxatm raise KeyError("No such atom: %s" % indx) KeyError: 'No such atom: C16:309:B'
Looking in the log, I think this is the relevant warning:
transfe_404W> At least one template is aligned with model residue 309:B but no coordinates could be transferred. This usually occurs when your input files do not use the official PDBv3 atom names. Please check your templates.
The script follows:
----
#!/usr/bin/env python
from modeller import * from modeller.automodel import * from modeller.scripts import complete_pdb
log.verbose() env = environ()
env.io.atom_files_directory = ['.'] env.io.hetatm = True
class MyModel(loopmodel):
def select_loop_atoms(self): #return selection(self.residue_range('68:A','83:A'),self.residue_range('149:A','176:A'),self.residue_range('249:A','258:A'),self.residue_range('309:B','309:B')) return selection(self.residue_range('68:A','83:A'),self.residue_range('149:A','176:A'),self.residue_range('249:A','258:A'))
def special_restraints(self,aln): rsr = self.restraints at = self.atoms rsr.add(forms.gaussian(group=physical.bond,feature=features.distance(at['CA:70:A'],at['C16:309:B']), mean=1.00, stdev=0.10)) rsr.add(forms.gaussian(group=physical.bond,feature=features.distance(at['CA:71:A'],at['C16:309:B']), mean=1.00, stdev=0.10)) rsr.add(forms.gaussian(group=physical.bond,feature=features.distance(at['CA:253:A'],at['C16:309:B']), mean=1.00, stdev=0.10))
a = MyModel(env, inimodel="cluster_A.pdb", sequence='tas2r46', loop_assess_methods=(assess.DOPE, assess.GA341, assess.normalized_dope)) #a = MyModel(env, inimodel="cluster_A.pdb", loop_assess_methods=(assess.DOPE, assess.GA341, assess.normalized_dope)) a.loop.starting_model = 1 a.loop.ending_model = 1 a.loop.md_level = refine.very_fast a.make()
env = environ() env.libs.topology.read(file='$(LIB)/top_heav.lib') env.libs.parameters.read(file='$(LIB)/par.lib')
#for some reason, this has to be done env = environ() env.libs.topology.read(file='$(LIB)/top_heav.lib') env.libs.parameters.read(file='$(LIB)/par.lib')
#in case we output bad models... ok_models = filter(lambda x: x['failure'] is None, a.outputs)
for model in ok_models: mdl = complete_pdb(env, model['name']) s = selection(mdl) s.assess_dope(output='ENERGY_PROFILE NO_REPORT', file= model['name']+'.profile', normalize_profile=True, smoothing_window=15)
Any help on what information should I look for to troubleshoot this is very welcome.
thanks, Massimo