diff --git a/examples/docking-protein-protein/docking-protein-protein-cltsel.cfg b/examples/docking-protein-protein/docking-protein-protein-cltsel.cfg index d438a9e37..27e641dec 100644 --- a/examples/docking-protein-protein/docking-protein-protein-cltsel.cfg +++ b/examples/docking-protein-protein/docking-protein-protein-cltsel.cfg @@ -36,12 +36,17 @@ sampling = 100 noecv = true [clustfcc] +threshold=1 [seletopclusts] -# select the best 4 clusters -top_cluster = [1, 2, 3, 4] -# select the best 4 models of each cluster -top_models = 4 +## select the best 4 clusters +# top_cluster = [1, 2, 3, 4] +## select all the clusters +top_cluster = [] +## select the best 4 models of each cluster +# top_models = 4 +##select all the models +top_models = nan [caprieval] reference_fname = "data/e2a-hpr_1GGR.pdb" diff --git a/src/haddock/modules/analysis/seletopclusts/__init__.py b/src/haddock/modules/analysis/seletopclusts/__init__.py index 5342799a0..04b386a5c 100644 --- a/src/haddock/modules/analysis/seletopclusts/__init__.py +++ b/src/haddock/modules/analysis/seletopclusts/__init__.py @@ -1,4 +1,5 @@ """HADDOCK3 module to select a top cluster/model.""" +import math from pathlib import Path from haddock.libs.libontology import ModuleIO @@ -14,13 +15,8 @@ class HaddockModule(BaseHaddockModule): name = RECIPE_PATH.name - def __init__( - self, - order, - path, - *ignore, - init_params=DEFAULT_CONFIG, - **everything): + def __init__(self, order, path, *ignore, init_params=DEFAULT_CONFIG, + **everything): super().__init__(order, path, init_params) @classmethod @@ -30,24 +26,44 @@ def confirm_installation(cls): def _run(self): """Execute the module's protocol.""" + if self.params["top_models"] <= 0: + _msg = "top_models must be either > 0 or nan." + self.finish_with_error(_msg) + + if not isinstance(self.params["top_cluster"], list): + _msg = "top_cluster must be a list, it can be an empty one." + self.finish_with_error(_msg) + models_to_select = self.previous_io.retrieve_models() # how many models should we output? models = [] - for target_ranking in self.params['top_cluster']: - if self.params['top_models'] == 'all': + if not self.params["top_cluster"]: + target_rankings = list(set([p.clt_rank for p in models_to_select])) + target_rankins_str = ",".join(map(str, target_rankings)) + self.log(f"Selecting all clusters: {target_rankins_str}") + else: + target_rankings = list(set(self.params["top_cluster"])) + target_rankins_str = ",".join(map(str, target_rankings)) + self.log(f"Selecting clusters: {target_rankins_str}") + + for target_ranking in target_rankings: + if math.isnan(self.params["top_models"]): for pdb in models_to_select: if pdb.clt_rank == target_ranking: models.append(pdb) else: - for model_ranking in range(1, self.params['top_models'] + 1): + for model_ranking in range(1, self.params["top_models"] + 1): for pdb in models_to_select: - if (pdb.clt_rank == target_ranking - and pdb.clt_model_rank == model_ranking): + if ( + pdb.clt_rank == target_ranking + and pdb.clt_model_rank == model_ranking + ): self.log( f"Selecting {pdb.file_name} " f"Cluster {target_ranking} " - f"Model {model_ranking}") + f"Model {model_ranking}" + ) models.append(pdb) # Save module information diff --git a/src/haddock/modules/analysis/seletopclusts/defaults.cfg b/src/haddock/modules/analysis/seletopclusts/defaults.cfg index a62a3ba80..33eca86aa 100644 --- a/src/haddock/modules/analysis/seletopclusts/defaults.cfg +++ b/src/haddock/modules/analysis/seletopclusts/defaults.cfg @@ -1,2 +1,2 @@ -top_cluster = [1, 2, 3, 4] -top_models = 4 +top_cluster = [] +top_models = nan