Thank you very much for your quick response.


I have used the select_loop_atoms function within my LoopModel class to define the specific residues that are allowed to move (see script in initial email). I assumed based on this tutorial  https://salilab.org/modeller/wiki/Missing_residues that only the defined residues would be allowed to move, whilst any residues not defined would be restrained in their original positions. Is there something else I need to add to my script to ensure all the residues which have not been modelled in are restrained? I’ve checked my script several times and the numbering of my starting structure compared to the final models and they all match up so I’m unsure what’s going wrong.  





From: Joel Subach <mjsubach@alumni.ncsu.edu>
Date: Monday, October 16, 2023 at 4:23 PM
To: Isabel Elliott <I.G.Elliott@soton.ac.uk>
Cc: Isabel Elliott via modeller_usage <modeller_usage@salilab.org>
Subject: Re: [modeller_usage] Missing residues - restrain crystal coordinates

CAUTION: This e-mail originated outside the University of Southampton.

Hi Isabel thank you for your inquiry, if you restrain certain residues they should not move, maybe double-check to be sure

that you properly coded these residues to be restrained, thanks 🚀


On Mon, Oct 16, 2023 at 5:15 PM Isabel Elliott via modeller_usage <modeller_usage@salilab.org> wrote:

Good afternoon,


I am trying to model missing residues into my crystal structure following the method on the website: https://salilab.org/modeller/wiki/Missing_residues. I am also trying to restrain the crystal coordinates so that only missing residues move (and the rest of the original crystal coordinates remain the same) during refinement using the select_atoms method. However when I compare my final models produced by my script to my original crystal structure, I find that the side chains of several amino acids three of four amino acids away from the missing residues have been flipped. How can I ensure that only the missing residues are refined and the crystal coordinates remain the same? I am wondering if I’ve missed something important out of my script. See my script below.


Many thanks.


from modeller import *                      # Load standard Modeller classes

from modeller.automodel import *           # Load the AutoModel class


log.verbose()                              # Create log file 

env = Environ()


# directories for input atom files

env.io.atom_files_directory = ['.', '../atom_files']


env.io.water = True


# Only refine/move missing residues - restrain crystal coordinates

class MyModel(LoopModel):

        #picks residues to be refined by loop modelling

    def select_loop_atoms(self):

        #refines residue ranges defined simultaneously

        return Selection(self.residue_range('5:A', '13:A'),

                         self.residue_range('99:B', '105:B'),

                         self.residue_range('251:D', '256:D'))

# redefine the special_patches routine to include additional disulfides

    def special_patches(self,aln):




a = MyModel(env, alnfile = 'alignment.ali',            # alignment file

              knowns = 'xxx',                         # aa sequence of original template - crystal coordinates

              sequence = 'xxx_fill',                  # aa sequence of original template with missing residues filled in

              loop_assess_methods = (assess.DOPE,




a.starting_model= 1             # Index of the first model

a.ending_model  = 1             # Index of the last model


a.loop.starting_model = 1       # First loop refined model

a.loop.ending_model = 10        # Last loop refined model

a.loop.md_level = refine.fast   # Loop model refinement level


a.make()                        # Do modelling



modeller_usage mailing list