import os
from rdkit import RDConfig
from rdkit.Chem import ChemicalFeatures
from rdkit.Chem.Pharm2D.SigFactory import SigFactory
from molpher.algorithms.settings import Settings
[docs]class AntidecoysSettings(Settings):
    """
    A specialized class that holds the settings
    for the anti-decoys algorithm.
    """
    def __init__(
            self
            , source
            , target
            , storage_dir = os.path.abspath('antidecoys_data') # path to a directory where the results will be stored
            , max_threads = None # maximum number of threads to use in parallel computations
            , tree_params = None # custom parameters (same for both trees)
            , max_iters = 100  # maximum number of iterations to spend looking for a single path
            , verbose = False # require verbose output
            , fg_bins = ((0, 2), (2, 5), (5, 8)) # distance bins in the pharmacophore fingerprint
            , fg_min_points = 2 # min number of features encoded in the pharmacophore fingerprint
            , fg_max_points = 3 # max number of features encoded in the pharmacophore fingerprint
            , min_accepted = 1000 # minimum number of morphs the filter will accept on every iteration
            , common_bits_max_thrs = 0.75 # maximum common bits percentage the filter will accept on every iteration
            , common_bits_mean_thrs = 0.5 # if for the mols selected by the filter the mean common bits percentage falls below this value, antidecoys will be turned off
            , antidecoys_min_iters = 10 # minimum number of iterations where antidecoys are optimized
            , antidecoys_max_iters = 50 # maximum number of iterations where antidecoys are optimized
            , distance_thrs = 0.2 # turn antidecoys filter off when the distance between two closest molecules from each tree gets below this value
    ):
        super(AntidecoysSettings, self).__init__(
            source
            , target
            , storage_dir
            , max_threads
            , max_iters
            , tree_params
            , verbose
        )
        self.fg_bins = fg_bins
        """
        distance bins in the pharmacophore fingerprint (as described `here <http://www.rdkit.org/docs/GettingStartedInPython.html#d-pharmacophore-fingerprints>`_)
        """
        self.fg_min_points = fg_min_points
        """
        min number of features encoded in the pharmacophore fingerprint (as described `here <http://www.rdkit.org/docs/GettingStartedInPython.html#d-pharmacophore-fingerprints>`_)
        """
        self.fg_max_points = fg_max_points
        """
        max number of features encoded in the pharmacophore fingerprint (as described `here <http://www.rdkit.org/docs/GettingStartedInPython.html#d-pharmacophore-fingerprints>`_)
        """
        self.min_accepted = min_accepted
        """
        minimum number of morphs the antidecoys filter will accept on every iteration
        """
        self.common_bits_max_thrs = common_bits_max_thrs
        """
        maximum percentage of shared bits between a structure and the anti-fingerprint that the filter will accept on every iteration
        """
        self.common_bits_mean_thrs = common_bits_mean_thrs
        """
        if for the structures that survived the filter the mean common bits percentage falls below this value, antidecoys will be turned off
        """
        self.antidecoys_min_iters = antidecoys_min_iters
        """
        minimum number of iterations that will use the antidecoys filter
        """
        self.antidecoys_max_iters = antidecoys_max_iters
        """
        maximum number of iterations that will use the antidecoys filter
        """
        self.distance_thrs = distance_thrs
        """
        turn antidecoys filter off when the distance between two closest molecules from each tree gets below this value
        """
        # stuff for the pharmacophore fingerprints
        self._fdef_file = os.path.join(RDConfig.RDDataDir, 'BaseFeatures.fdef') # get basic feature definitions
        self._feature_factory = ChemicalFeatures.BuildFeatureFactory(self._fdef_file) # make feature factory
        self.signature_factory = SigFactory(self._feature_factory, minPointCount=self.fg_min_points, maxPointCount=self.fg_max_points, trianglePruneBins=False)  # make signature factory
        self.signature_factory.SetBins(self.fg_bins) # set the distance bins
        self.signature_factory.Init()