Source code for schrodinger.application.phase.packages.hypo_refine.hypo_utils

"""
Module with phase_hypo_refine hypothesis-related functionality.

Copyright Schrodinger LLC, All Rights Reserved.
"""

import itertools

from schrodinger.infra import phase


[docs]def clean_hypo(hypo, to_static): """ Prepares the hypothesis for refinement by removing attributes that are likely to be invalidated by the refinement process and/or would interfere with refinement. Also converts the reference ligand to static fragments if to_static is True. Returns a string that describes the changes made and a Boolean indicating whether the changes warrant a new active/decoy screen. :param hypo: Hypothesis to be cleaned :type hypo: phase.PhpHypoAdaptor :param to_static: Whether to convert reference ligand to static fragments :type to_static: bool :return: Description of changes and Boolean for rerunning screen :rtype: str, bool """ attr_names = [] rescreen = False if hypo.hasAddCts(): attr_names.append(phase.HYPO_ATTR_ADD) if hypo.hasCnst(): attr_names.append(phase.HYPO_ATTR_CNST) rescreen = True if hypo.hasIvol(): attr_names.append(phase.HYPO_ATTR_IVOL) rescreen = True if hypo.hasMask(): attr_names.append(phase.HYPO_ATTR_MASK) rescreen = True if hypo.hasQsar(): attr_names.append(phase.HYPO_ATTR_QSAR) if hypo.hasXvol(): attr_names.append(phase.HYPO_ATTR_XVOL) rescreen = True changes = "" for attr_name in attr_names: attr_descr = phase.HYPO_ATTR_DESCR[attr_name] changes += "\nDeleting attribute: %s" % attr_descr hypo.deleteAttr(attr_name) if to_static and not hypo.isStatic(): changes += "\nCreating fragment-based reference ligand" hypo.convertToStatic(hypo.getFd()) rescreen = True # Don't inadvertently run screens with partial matching. if hypo.hasProp(phase.PHASE_MIN_SITES): changes += "\nDeleting property %s" % phase.PHASE_MIN_SITES hypo.deleteProp(phase.PHASE_MIN_SITES) rescreen = True if changes: changes = "\nPreparing hypothesis for refinement" + changes return changes, rescreen
[docs]def get_match_options(hypo_file, exhaustive): """ Returns matching options that are appropriate for BEDROC screens against the supplied hypothesis. :param hypo_file: Hypothesis file :type hypo_file: str :param exhaustive: Whether to do exhaustive partial matching :type exhaustive: bool :return: Matching options :rtype: phase.PhpMatchOptions """ match_options = phase.PhpMatchOptions() # Turn off volume scoring if the hypothesis consists of static features. # Turn off vector scoring if hypothesis has feature rules that contain # mixed permitted feature types. hypo = phase.PhpHypoAdaptor(hypo_file) if hypo.isStatic(): match_options.setVolumeWeight(0.0) if hypo.hasRules() and hypo.getRules().hasMixedFeatures(): match_options.setVectorWeight(0.0) # Set minimum number of sites to match, if applicable. if hypo.hasProp(phase.PHASE_MIN_SITES): min_sites = int(hypo.getProp(phase.PHASE_MIN_SITES)) if min_sites < hypo.getSiteCount(): match_options.setMinSites(min_sites) if exhaustive: match_options.setExhaustiveMatching(True) return match_options
[docs]def get_site_mask_summary(hypo_file): """ Returns a string that contains a summary of the site mask in the provided hypothesis file. :param hypo_file: Hypothesis file :type hypo_file: str :return: Site mask summary :rtype: str """ hypo = phase.PhpHypoAdaptor(hypo_file) s = "Site Mask" for site in phase.PhpHypoAdaptor(hypo_file).getHypoSites(): site_name = site.getSiteName(0) s += " \n %s%d" % (site_name.ljust(8), site.getMaskValue()) return s
[docs]def get_site_masks(hypo, max_miss): """ Returns all possible site masks for the provided hypothesis, where the number of sites that may be missed is 1,...,max_miss. :param hypo: Pharmacophore hypothesis :type hypo: phase.PhpHypoAdaptor :param max_miss: Maximum number of sites that need not be matched :type max_miss: int :return: All possible site masks :rtype: list(phase.PhpSiteMask) """ num_sites = hypo.getSiteCount() sample_pool = range(num_sites) miss_limit = 1 + min(max_miss, num_sites) site_numbers = [] site_types = [] for site in hypo.getHypoSites(): site_numbers.append(site.getSiteNumber()) site_types.append(site.getSiteType()) site_masks = [] for n in range(1, miss_limit): for subset in itertools.combinations(sample_pool, n): mask_values = num_sites * [1] for i in subset: mask_values[i] = 0 site_mask = phase.PhpSiteMask() for i in range(num_sites): site_mask.addSiteMaskData(site_numbers[i], site_types[i], mask_values[i]) site_masks.append(site_mask) return site_masks
[docs]def get_site_tol(hypo, step_size, direct): """ Returns positional tolerances obtained by adding step_size * direct to the tolerances in the provided hypothesis. :param hypo: Pharmacophore hypothesis :type hypo: phase.PhpHypoAdaptor :param step_size: Scalar step size :type step_size: float :param direct: Direction of tolerance shift for each site in hypo :type direct: list(float) :return: Positional tolerances :rtype: phase.PhpDeltaHypo """ hypo_sites = hypo.getHypoSites() if hypo.hasTol(): t0 = [site.getTol() for site in hypo_sites] else: t0 = hypo.getSiteCount() * [phase.PHASE_DEFAULT_TOL] tstep = [t0[i] + step_size * direct[i] for i in range(len(direct))] site_tol = phase.PhpDeltaHypo() for tol, site in zip(tstep, hypo_sites): site_tol.addSiteData(site.getSiteNumber(), site.getSiteType(), tol) return site_tol
[docs]def get_site_tol_probes(hypo, step_size): """ Returns a list of hypothesis positional tolerance objects obtained by adding/subtracting step_size to/from each positional tolerance in the provided hypothesis. :param hypo: Pharmacophore hypothesis :type hypo: phase.PhpHypoAdaptor :param step_size: Scalar step size :type step_size: float :return: List of hypothesis positional tolerances :rtype: list(phase.PhpDeltaHypo) """ site_tol = [] num_sites = hypo.getSiteCount() for i in range(num_sites): direct = num_sites * [0.0] for value in [1.0, -1.0]: direct[i] = value site_tol.append(get_site_tol(hypo, step_size, direct)) return site_tol
[docs]def get_site_tol_summary(hypo_file): """ Returns a string that contains a summary of the positional tolerances in the provided hypothesis file. :param hypo_file: Hypothesis file :type hypo_file: str :return: Positional tolerances summary :rtype: str """ hypo = phase.PhpHypoAdaptor(hypo_file) s = "Site Tolerance" for site in phase.PhpHypoAdaptor(hypo_file).getHypoSites(): site_name = site.getSiteName(0) s += " \n %s%.2f" % (site_name.ljust(7), site.getTol()) return s
[docs]def save_hypo_with_score(hypo, score, hypo_file, baseline=False): """ Stores the provided score in the hypothesis property PHASE_WEIGHTED_BEDROC and saves the hypothesis to disk. If baseline is true, the score will also be stored in the property PHASE_WEIGHTED_BEDROC_BASELINE. :param hypo: Hypothesis :type hypo: phase.PhpHypoAdaptor :param score: Weighted BEDROC score :type score: float :param hypo_file: Destination hypothesis file :type hypo_file: str :param baseline: Whether to store score in baseline property :type baseline: bool """ hypo.addProp(phase.PHASE_WEIGHTED_BEDROC, score) if baseline: hypo.addProp(phase.PHASE_WEIGHTED_BEDROC_BASELINE, score) hypo.save(hypo_file, True)