diff --git a/actions/pm-build-model b/actions/pm-build-model index d12f644831fae5238d6a62ad1521931975c201bd..222a18efd280acd08718461f6c8c8278fa65f5f1 100755 --- a/actions/pm-build-model +++ b/actions/pm-build-model @@ -45,6 +45,12 @@ parser.AssembleParser() parser.add_argument('-o', '--model-file', metavar='<FILENAME>', type=str, default='model.pdb', help='File to store model coordinates'+ ' (default: %(default)s).') +parser.add_argument('-t', '--model-termini', help="Enforce modelling of " + + "terminal stretches without template coverage with a " + + "crude Monte Carlo approach. The accuracy of those " + + "termini is likely to be limited.", action="store_true") + + # lots of checking being done here -> see PM3ArgumentParser opts = parser.Parse() @@ -78,7 +84,8 @@ try: if len(opts.fragger_handles) > 0: modelling.SetFraggerHandles(mhandle, opts.fragger_handles) # build final model - final_model = modelling.BuildFromRawModel(mhandle) + final_model = modelling.BuildFromRawModel(mhandle, + model_termini=opts.model_termini) except Exception as ex: helper.MsgErrorAndExit("Failed to perform modelling! An exception of type "+ type(ex).__name__ + " occured: " + str(ex), 3) diff --git a/modelling/pymod/_pipeline.py b/modelling/pymod/_pipeline.py index ecb968ba34349b7c60770cdcb5b7c54ae3efa4e7..b8895042d83adfa364b2c413f0abf08f5a174e6d 100644 --- a/modelling/pymod/_pipeline.py +++ b/modelling/pymod/_pipeline.py @@ -430,7 +430,8 @@ def CheckFinalModel(mhandle): ost.LogInfo("Stereo-chemical problem in sidechain " + \ "of residue " + str(res)) -def BuildFromRawModel(mhandle, use_amber_ff=False, extra_force_fields=list()): +def BuildFromRawModel(mhandle, use_amber_ff=False, extra_force_fields=list(), + model_termini=False): '''Build a model starting with a raw model (see :func:`BuildRawModel`). This function implements a recommended pipeline to generate complete models @@ -474,6 +475,19 @@ def BuildFromRawModel(mhandle, use_amber_ff=False, extra_force_fields=list()): existing parametrization are skipped. :type extra_force_fields: :class:`list` of :class:`ost.mol.mm.Forcefield` + :param model_termini: The default modelling pipeline in ProMod3 is optimized + to generate a gap-free model of the region in the + target sequence(s) that is covered with template + information. Terminal extensions without template + coverage are negelected. + You can activate this flag to enforce a model of the + full target sequence(s). The terminal parts will be + modelled with a crude Monte Carlo approach. Be aware + that the accuracy of those termini is likely to be + limited. Termini of length 1 won't be modelled. + :type model_termini: :class:`bool` + + :return: Delivers the model as an |ost_s| entity. :rtype: :class:`Entity <ost.mol.EntityHandle>` ''' @@ -493,8 +507,9 @@ def BuildFromRawModel(mhandle, use_amber_ff=False, extra_force_fields=list()): rotamer_library = sidechain.LoadBBDepLib() merge_distance = 4 - # remove terminal gaps - RemoveTerminalGaps(mhandle) + if not model_termini: + # remove terminal gaps + RemoveTerminalGaps(mhandle) # check whether we have fragger handles fragger_handles = None @@ -507,6 +522,10 @@ def BuildFromRawModel(mhandle, use_amber_ff=False, extra_force_fields=list()): fragment_db=fragment_db, structure_db=structure_db, torsion_sampler=torsion_sampler, fragger_handles=fragger_handles) + if model_termini: + ModelTermini(mhandle, torsion_sampler, fragger_handles=fragger_handles) + RemoveTerminalGaps(mhandle) # length=1 ignored above + # build sidechains BuildSidechains(mhandle, merge_distance, fragment_db, structure_db, torsion_sampler, rotamer_library)