I am modelling a potassium channel protein using a template with fairly
low sequence similarity to my target, therefore, I am trying to put
several restraints. I am struggling to deal with a long loop supposed
to be extracellular: so its location to the rest of the protein is
roughly known. As I am refining the model using MD, the loop location
completely became wrong, I suppose that the absence of alignment in
the refinement process is the reason (which covers only small area of the loop anyway). I
don’t know if there is anyway to exclude the loop while refining the
rest of the model, or to restraint the loop in an approximate location
of the structure (like putting distance restraint) while refining it. I
must say that the gap in alignment corresponds to the loop is well over
15 amino acids.
Any thoughts are highly appreciated. My script is here:
from modeller import *
from modeller.automodel import * # Load the automodel class
log.verbose()
# Override the 'special_restraints' and 'user_after_single_model' methods:
class MyModel(automodel):
def special_restraints(self, aln):
# Constrain the A and B chains to be identical (but only restrain
# the C-alpha atoms, to reduce the number of interatomic distances
# that need to be calculated):
s1 = selection(self.chains['A'], self.residue_range('7:A',
'30:A'),self.residue_range('107:A', '130:A')).only_atom_types('CA')
#s2 = selection(self.chains['A'], self.residue_range('107:A', '130:A')).only_atom_types('CA')
s2 = selection(self.chains['A'], self.residue_range('157:A',
'180:A'),self.residue_range('217:A', '240:A')).only_atom_types('CA')
#s4 = selection(self.chains['A'], self.residue_range('217:A', '240:A')).only_atom_types('CA')
s5 = selection(self.chains['A']).only_atom_types('CA')
s6 = selection(self.chains['B']).only_atom_types('CA')
s7 = selection(self.chains['A'], self.residue_range('80:A', '135:A')).only_atom_types('CA')
s8 = selection(self.chains['A'], self.residue_range('185:A', '250:A')).only_atom_types('CA')
self.restraints.add(secondary_structure.alpha(self.residue_range('7:A', '30:A')))
#self.restraints.add(secondary_structure.alpha(self.residue_range('107:A', '130:A')))
self.restraints.add(secondary_structure.alpha(self.residue_range('157:A', '180:A')))
#self.restraints.add(secondary_structure.alpha(self.residue_range('217:A', '240:A')))
#self.restraints.add(secondary_structure.alpha(self.residue_range('73:A', '92:A')))
#self.restraints.symmetry.append(symmetry(s1, s2, 1.0))
self.restraints.symmetry.append(symmetry(s7, s8, 1.0))
#self.restraints.symmetry.append(symmetry(s2, s3, 1.0))
#self.restraints.symmetry.append(symmetry(s3, s4, 1.0))
self.restraints.symmetry.append(symmetry(s5, s6, 1.0))
def user_after_single_model(self):
# Report on symmetry violations greater than 1A after building
# each model:
self.restraints.symmetry.report(1.0)
env = environ()
# directories for input atom files
env.schedule_scale = physical.values(default=1.0, soft_sphere=0.7)
env.io.atom_files_directory = ['.', '../atom_files']
# Be sure to use 'MyModel' rather than 'automodel' here!
a = MyModel(env,
alnfile = 'task3Modified8.ali' , # alignment filename
knowns = '1orq_9', # codes of the templates
sequence = 'TASK3h27', # code of the target
assess_methods=assess.DOPE)
a.starting_model= 1 # index of the first model
a.ending_model = 15 # index of the last model
# Very thorough VTFM optimization:
a.library_schedule = autosched.slow
a.max_var_iterations = 300