Source code for hbat.constants.parameters

"""
Analysis parameters for HBAT molecular interaction analysis.

This module contains the AnalysisParameters class that defines all configurable
parameters for hydrogen bond, halogen bond, and π interaction analysis.
"""

from typing import List


[docs] class ParametersDefault: """Default values for molecular interaction analysis parameters.""" # Hydrogen bond parameters HB_DISTANCE_CUTOFF = 2.5 # Å - H...A distance cutoff HB_ANGLE_CUTOFF = 120.0 # degrees - D-H...A angle cutoff HB_DA_DISTANCE = 3.5 # Å - Donor-acceptor distance cutoff # Weak hydrogen bond parameters (for carbon donors) WHB_DISTANCE_CUTOFF = 3.6 # Å - H...A distance cutoff WHB_ANGLE_CUTOFF = 150.0 # degrees - D-H...A angle cutoff WHB_DA_DISTANCE = 3.5 # Å - Donor-acceptor distance cutoff # Halogen bond parameters (updated defaults) XB_DISTANCE_CUTOFF = 3.9 # Å - X...A distance cutoff <= vdW sum (Max vdW sum: I with SE → 3.88 Å) XB_ANGLE_CUTOFF = 150.0 # degrees - C-X...A angle cutoff (updated from 120° to 150°) # π interaction parameters PI_DISTANCE_CUTOFF = 3.5 # Å - H...π distance cutoff (legacy, kept for compatibility) PI_ANGLE_CUTOFF = 110.0 # degrees - D-H...π angle cutoff (legacy, kept for compatibility) # π interaction subtype parameters # Halogen-π interactions PI_CCL_DISTANCE_CUTOFF = 3.5 # Å - C-Cl...π distance cutoff PI_CCL_ANGLE_CUTOFF = 145 # degrees - C-Cl...π angle cutoff PI_CBR_DISTANCE_CUTOFF = 3.5 # Å - C-Br...π distance cutoff PI_CBR_ANGLE_CUTOFF = 155 # degrees - C-Br...π angle cutoff PI_CI_DISTANCE_CUTOFF = 3.6 # Å - C-I...π distance cutoff PI_CI_ANGLE_CUTOFF = 165.0 # degrees - C-I...π angle cutoff # Hydrogen-π interactions PI_CH_DISTANCE_CUTOFF = 3.5 # Å - C-H...π distance cutoff PI_CH_ANGLE_CUTOFF = 110.0 # degrees - C-H...π angle cutoff PI_NH_DISTANCE_CUTOFF = 3.2 # Å - N-H...π distance cutoff PI_NH_ANGLE_CUTOFF = 115.0 # degrees - N-H...π angle cutoff PI_OH_DISTANCE_CUTOFF = 3.0 # Å - O-H...π distance cutoff PI_OH_ANGLE_CUTOFF = 115.0 # degrees - O-H...π angle cutoff PI_SH_DISTANCE_CUTOFF = 3.8 # Å - S-H...π distance cutoff PI_SH_ANGLE_CUTOFF = 105.0 # degrees - S-H...π angle cutoff # General analysis parameters COVALENT_CUTOFF_FACTOR = 0.85 # Covalent bond detection factor (0.0-1.0) ANALYSIS_MODE = "complete" # Analysis mode: "complete" or "local" # Bond distance thresholds MAX_BOND_DISTANCE = 2.5 # Reasonable maximum for most covalent bonds (Angstroms) MIN_BOND_DISTANCE = 0.5 # Minimum realistic bond distance (Angstroms) # PDB structure fixing parameters (updated defaults) FIX_PDB_ENABLED = True # Enable PDB structure fixing (changed from False to True) FIX_PDB_METHOD = "pdbfixer" # Method: "openbabel" or "pdbfixer" (changed from "openbabel" to "pdbfixer") # Fixing operations (explicit control) FIX_PDB_ADD_HYDROGENS = ( True # Add missing hydrogen atoms (both OpenBabel and PDBFixer) ) FIX_PDB_ADD_HEAVY_ATOMS = False # Add missing heavy atoms (PDBFixer only) FIX_PDB_REPLACE_NONSTANDARD = False # Replace nonstandard residues (PDBFixer only) FIX_PDB_REMOVE_HETEROGENS = False # Remove heterogens (PDBFixer only) FIX_PDB_KEEP_WATER = True # Keep water when removing heterogens (PDBFixer only)
[docs] class AnalysisParameters: """Parameters for comprehensive molecular interaction analysis. This class contains all configurable parameters for detecting and analyzing molecular interactions in protein structures. Supports multiple interaction types with subtype-specific parameters. **Hydrogen Bonds (Classical):** - Strong N-H···O, O-H···O, N-H···N interactions - Default: 2.5Å H···A distance, 120° D-H···A angle **Weak Hydrogen Bonds (C-H···O):** - Carbon-hydrogen donor interactions with oxygen acceptors - Default: 3.6Å H···A distance, 150° D-H···A angle - Important in protein-ligand binding and aromatic interactions **Halogen Bonds:** - C-X···A interactions where X is Cl, Br, I - Default: 3.9Å X···A distance, 150° C-X···A angle (updated default) **π Interactions (Multiple Subtypes):** - Hydrogen-π: C-H···π, N-H···π, O-H···π, S-H···π - Halogen-π: C-Cl···π, C-Br···π, C-I···π - Each subtype has optimized distance/angle cutoffs :param hb_distance_cutoff: Maximum H...A distance for hydrogen bonds (Å) :type hb_distance_cutoff: float :param hb_angle_cutoff: Minimum D-H...A angle for hydrogen bonds (degrees) :type hb_angle_cutoff: float :param hb_donor_acceptor_cutoff: Maximum D...A distance for hydrogen bonds (Å) :type hb_donor_acceptor_cutoff: float :param whb_distance_cutoff: Maximum H...A distance for weak hydrogen bonds (Å) :type whb_distance_cutoff: float :param whb_angle_cutoff: Minimum D-H...A angle for weak hydrogen bonds (degrees) :type whb_angle_cutoff: float :param whb_donor_acceptor_cutoff: Maximum D...A distance for weak hydrogen bonds (Å) :type whb_donor_acceptor_cutoff: float :param xb_distance_cutoff: Maximum X...A distance for halogen bonds (Å) :type xb_distance_cutoff: float :param xb_angle_cutoff: Minimum C-X...A angle for halogen bonds (degrees, default: 150°) :type xb_angle_cutoff: float :param pi_distance_cutoff: Maximum H...π distance for π interactions (Å, legacy) :type pi_distance_cutoff: float :param pi_angle_cutoff: Minimum D-H...π angle for π interactions (degrees, legacy) :type pi_angle_cutoff: float :param pi_ccl_distance_cutoff: Maximum C-Cl...π distance for halogen-π interactions (Å) :type pi_ccl_distance_cutoff: float :param pi_ccl_angle_cutoff: Minimum C-Cl...π angle for halogen-π interactions (degrees) :type pi_ccl_angle_cutoff: float :param pi_cbr_distance_cutoff: Maximum C-Br...π distance for halogen-π interactions (Å) :type pi_cbr_distance_cutoff: float :param pi_cbr_angle_cutoff: Minimum C-Br...π angle for halogen-π interactions (degrees) :type pi_cbr_angle_cutoff: float :param pi_ci_distance_cutoff: Maximum C-I...π distance for halogen-π interactions (Å) :type pi_ci_distance_cutoff: float :param pi_ci_angle_cutoff: Minimum C-I...π angle for halogen-π interactions (degrees) :type pi_ci_angle_cutoff: float :param pi_ch_distance_cutoff: Maximum C-H...π distance for hydrogen-π interactions (Å) :type pi_ch_distance_cutoff: float :param pi_ch_angle_cutoff: Minimum C-H...π angle for hydrogen-π interactions (degrees) :type pi_ch_angle_cutoff: float :param pi_nh_distance_cutoff: Maximum N-H...π distance for hydrogen-π interactions (Å) :type pi_nh_distance_cutoff: float :param pi_nh_angle_cutoff: Minimum N-H...π angle for hydrogen-π interactions (degrees) :type pi_nh_angle_cutoff: float :param pi_oh_distance_cutoff: Maximum O-H...π distance for hydrogen-π interactions (Å) :type pi_oh_distance_cutoff: float :param pi_oh_angle_cutoff: Minimum O-H...π angle for hydrogen-π interactions (degrees) :type pi_oh_angle_cutoff: float :param pi_sh_distance_cutoff: Maximum S-H...π distance for hydrogen-π interactions (Å) :type pi_sh_distance_cutoff: float :param pi_sh_angle_cutoff: Minimum S-H...π angle for hydrogen-π interactions (degrees) :type pi_sh_angle_cutoff: float :param covalent_cutoff_factor: Factor for covalent bond detection :type covalent_cutoff_factor: float :param analysis_mode: Analysis mode ('local' or 'global') :type analysis_mode: str :param fix_pdb_enabled: Enable PDB structure fixing :type fix_pdb_enabled: bool :param fix_pdb_method: PDB fixing method ('openbabel' or 'pdbfixer') :type fix_pdb_method: str :param fix_pdb_add_hydrogens: Add missing hydrogen atoms (both methods) :type fix_pdb_add_hydrogens: bool :param fix_pdb_add_heavy_atoms: Add missing heavy atoms (PDBFixer only) :type fix_pdb_add_heavy_atoms: bool :param fix_pdb_replace_nonstandard: Replace nonstandard residues (PDBFixer only) :type fix_pdb_replace_nonstandard: bool :param fix_pdb_remove_heterogens: Remove heterogens (PDBFixer only) :type fix_pdb_remove_heterogens: bool :param fix_pdb_keep_water: Keep water when removing heterogens (PDBFixer only) :type fix_pdb_keep_water: bool """
[docs] def __init__(self, # Hydrogen bond parameters hb_distance_cutoff: float = ParametersDefault.HB_DISTANCE_CUTOFF, hb_angle_cutoff: float = ParametersDefault.HB_ANGLE_CUTOFF, hb_donor_acceptor_cutoff: float = ParametersDefault.HB_DA_DISTANCE, # Weak hydrogen bond parameters (for carbon donors) whb_distance_cutoff: float = ParametersDefault.WHB_DISTANCE_CUTOFF, whb_angle_cutoff: float = ParametersDefault.WHB_ANGLE_CUTOFF, whb_donor_acceptor_cutoff: float = ParametersDefault.WHB_DA_DISTANCE, # Halogen bond parameters xb_distance_cutoff: float = ParametersDefault.XB_DISTANCE_CUTOFF, xb_angle_cutoff: float = ParametersDefault.XB_ANGLE_CUTOFF, # Pi interaction parameters (legacy) pi_distance_cutoff: float = ParametersDefault.PI_DISTANCE_CUTOFF, pi_angle_cutoff: float = ParametersDefault.PI_ANGLE_CUTOFF, # Pi interaction subtype parameters pi_ccl_distance_cutoff: float = ParametersDefault.PI_CCL_DISTANCE_CUTOFF, pi_ccl_angle_cutoff: float = ParametersDefault.PI_CCL_ANGLE_CUTOFF, pi_cbr_distance_cutoff: float = ParametersDefault.PI_CBR_DISTANCE_CUTOFF, pi_cbr_angle_cutoff: float = ParametersDefault.PI_CBR_ANGLE_CUTOFF, pi_ci_distance_cutoff: float = ParametersDefault.PI_CI_DISTANCE_CUTOFF, pi_ci_angle_cutoff: float = ParametersDefault.PI_CI_ANGLE_CUTOFF, pi_ch_distance_cutoff: float = ParametersDefault.PI_CH_DISTANCE_CUTOFF, pi_ch_angle_cutoff: float = ParametersDefault.PI_CH_ANGLE_CUTOFF, pi_nh_distance_cutoff: float = ParametersDefault.PI_NH_DISTANCE_CUTOFF, pi_nh_angle_cutoff: float = ParametersDefault.PI_NH_ANGLE_CUTOFF, pi_oh_distance_cutoff: float = ParametersDefault.PI_OH_DISTANCE_CUTOFF, pi_oh_angle_cutoff: float = ParametersDefault.PI_OH_ANGLE_CUTOFF, pi_sh_distance_cutoff: float = ParametersDefault.PI_SH_DISTANCE_CUTOFF, pi_sh_angle_cutoff: float = ParametersDefault.PI_SH_ANGLE_CUTOFF, # General parameters covalent_cutoff_factor: float = ParametersDefault.COVALENT_CUTOFF_FACTOR, analysis_mode: str = ParametersDefault.ANALYSIS_MODE, # PDB structure fixing parameters fix_pdb_enabled: bool = ParametersDefault.FIX_PDB_ENABLED, fix_pdb_method: str = ParametersDefault.FIX_PDB_METHOD, fix_pdb_add_hydrogens: bool = ParametersDefault.FIX_PDB_ADD_HYDROGENS, fix_pdb_add_heavy_atoms: bool = ParametersDefault.FIX_PDB_ADD_HEAVY_ATOMS, fix_pdb_replace_nonstandard: bool = ParametersDefault.FIX_PDB_REPLACE_NONSTANDARD, fix_pdb_remove_heterogens: bool = ParametersDefault.FIX_PDB_REMOVE_HETEROGENS, fix_pdb_keep_water: bool = ParametersDefault.FIX_PDB_KEEP_WATER, **kwargs): """Initialize analysis parameters. :param hb_distance_cutoff: Maximum H...A distance for hydrogen bonds (Å) :type hb_distance_cutoff: float :param hb_angle_cutoff: Minimum D-H...A angle for hydrogen bonds (degrees) :type hb_angle_cutoff: float :param hb_donor_acceptor_cutoff: Maximum D...A distance for hydrogen bonds (Å) :type hb_donor_acceptor_cutoff: float :param whb_distance_cutoff: Maximum H...A distance for weak hydrogen bonds (Å) :type whb_distance_cutoff: float :param whb_angle_cutoff: Minimum D-H...A angle for weak hydrogen bonds (degrees) :type whb_angle_cutoff: float :param whb_donor_acceptor_cutoff: Maximum D...A distance for weak hydrogen bonds (Å) :type whb_donor_acceptor_cutoff: float :param xb_distance_cutoff: Maximum X...A distance for halogen bonds (Å) :type xb_distance_cutoff: float :param xb_angle_cutoff: Minimum C-X...A angle for halogen bonds (degrees) :type xb_angle_cutoff: float :param pi_distance_cutoff: Maximum H...π distance for π interactions (Å) :type pi_distance_cutoff: float :param pi_angle_cutoff: Minimum D-H...π angle for π interactions (degrees) :type pi_angle_cutoff: float :param covalent_cutoff_factor: Factor for covalent bond detection :type covalent_cutoff_factor: float :param analysis_mode: Analysis mode ('local' or 'global') :type analysis_mode: str :param fix_pdb_enabled: Enable PDB structure fixing :type fix_pdb_enabled: bool :param fix_pdb_method: PDB fixing method ('openbabel' or 'pdbfixer') :type fix_pdb_method: str :param fix_pdb_add_hydrogens: Add missing hydrogen atoms (both methods) :type fix_pdb_add_hydrogens: bool :param fix_pdb_add_heavy_atoms: Add missing heavy atoms (PDBFixer only) :type fix_pdb_add_heavy_atoms: bool :param fix_pdb_replace_nonstandard: Replace nonstandard residues (PDBFixer only) :type fix_pdb_replace_nonstandard: bool :param fix_pdb_remove_heterogens: Remove heterogens (PDBFixer only) :type fix_pdb_remove_heterogens: bool :param fix_pdb_keep_water: Keep water when removing heterogens (PDBFixer only) :type fix_pdb_keep_water: bool :param kwargs: Additional parameters (for future extensibility) :type kwargs: dict """ # Hydrogen bond parameters self.hb_distance_cutoff = hb_distance_cutoff self.hb_angle_cutoff = hb_angle_cutoff self.hb_donor_acceptor_cutoff = hb_donor_acceptor_cutoff # Weak hydrogen bond parameters (for carbon donors) self.whb_distance_cutoff = whb_distance_cutoff self.whb_angle_cutoff = whb_angle_cutoff self.whb_donor_acceptor_cutoff = whb_donor_acceptor_cutoff # Halogen bond parameters self.xb_distance_cutoff = xb_distance_cutoff self.xb_angle_cutoff = xb_angle_cutoff # π interaction parameters (legacy) self.pi_distance_cutoff = pi_distance_cutoff self.pi_angle_cutoff = pi_angle_cutoff # π interaction subtype parameters self.pi_ccl_distance_cutoff = pi_ccl_distance_cutoff self.pi_ccl_angle_cutoff = pi_ccl_angle_cutoff self.pi_cbr_distance_cutoff = pi_cbr_distance_cutoff self.pi_cbr_angle_cutoff = pi_cbr_angle_cutoff self.pi_ci_distance_cutoff = pi_ci_distance_cutoff self.pi_ci_angle_cutoff = pi_ci_angle_cutoff self.pi_ch_distance_cutoff = pi_ch_distance_cutoff self.pi_ch_angle_cutoff = pi_ch_angle_cutoff self.pi_nh_distance_cutoff = pi_nh_distance_cutoff self.pi_nh_angle_cutoff = pi_nh_angle_cutoff self.pi_oh_distance_cutoff = pi_oh_distance_cutoff self.pi_oh_angle_cutoff = pi_oh_angle_cutoff self.pi_sh_distance_cutoff = pi_sh_distance_cutoff self.pi_sh_angle_cutoff = pi_sh_angle_cutoff # General parameters self.covalent_cutoff_factor = covalent_cutoff_factor self.analysis_mode = analysis_mode # PDB structure fixing parameters self.fix_pdb_enabled = fix_pdb_enabled self.fix_pdb_method = fix_pdb_method self.fix_pdb_add_hydrogens = fix_pdb_add_hydrogens self.fix_pdb_add_heavy_atoms = fix_pdb_add_heavy_atoms self.fix_pdb_replace_nonstandard = fix_pdb_replace_nonstandard self.fix_pdb_remove_heterogens = fix_pdb_remove_heterogens self.fix_pdb_keep_water = fix_pdb_keep_water # Store any additional parameters for key, value in kwargs.items(): setattr(self, key, value)
[docs] def __repr__(self) -> str: """Return string representation of the parameters object. :returns: String representation showing all parameters :rtype: str """ params = [] # Hydrogen bond parameters params.append(f"hb_distance_cutoff={self.hb_distance_cutoff}") params.append(f"hb_angle_cutoff={self.hb_angle_cutoff}") params.append(f"hb_donor_acceptor_cutoff={self.hb_donor_acceptor_cutoff}") # Weak hydrogen bond parameters params.append(f"whb_distance_cutoff={self.whb_distance_cutoff}") params.append(f"whb_angle_cutoff={self.whb_angle_cutoff}") params.append(f"whb_donor_acceptor_cutoff={self.whb_donor_acceptor_cutoff}") # Halogen bond parameters params.append(f"xb_distance_cutoff={self.xb_distance_cutoff}") params.append(f"xb_angle_cutoff={self.xb_angle_cutoff}") # π interaction parameters (legacy) params.append(f"pi_distance_cutoff={self.pi_distance_cutoff}") params.append(f"pi_angle_cutoff={self.pi_angle_cutoff}") # π interaction subtype parameters params.append(f"pi_ccl_distance_cutoff={self.pi_ccl_distance_cutoff}") params.append(f"pi_ccl_angle_cutoff={self.pi_ccl_angle_cutoff}") params.append(f"pi_cbr_distance_cutoff={self.pi_cbr_distance_cutoff}") params.append(f"pi_cbr_angle_cutoff={self.pi_cbr_angle_cutoff}") params.append(f"pi_ci_distance_cutoff={self.pi_ci_distance_cutoff}") params.append(f"pi_ci_angle_cutoff={self.pi_ci_angle_cutoff}") params.append(f"pi_ch_distance_cutoff={self.pi_ch_distance_cutoff}") params.append(f"pi_ch_angle_cutoff={self.pi_ch_angle_cutoff}") params.append(f"pi_nh_distance_cutoff={self.pi_nh_distance_cutoff}") params.append(f"pi_nh_angle_cutoff={self.pi_nh_angle_cutoff}") params.append(f"pi_oh_distance_cutoff={self.pi_oh_distance_cutoff}") params.append(f"pi_oh_angle_cutoff={self.pi_oh_angle_cutoff}") params.append(f"pi_sh_distance_cutoff={self.pi_sh_distance_cutoff}") params.append(f"pi_sh_angle_cutoff={self.pi_sh_angle_cutoff}") # General parameters params.append(f"covalent_cutoff_factor={self.covalent_cutoff_factor}") params.append(f"analysis_mode='{self.analysis_mode}'") # PDB fixing parameters params.append(f"fix_pdb_enabled={self.fix_pdb_enabled}") params.append(f"fix_pdb_method='{self.fix_pdb_method}'") params.append(f"fix_pdb_add_hydrogens={self.fix_pdb_add_hydrogens}") params.append(f"fix_pdb_add_heavy_atoms={self.fix_pdb_add_heavy_atoms}") params.append(f"fix_pdb_replace_nonstandard={self.fix_pdb_replace_nonstandard}") params.append(f"fix_pdb_remove_heterogens={self.fix_pdb_remove_heterogens}") params.append(f"fix_pdb_keep_water={self.fix_pdb_keep_water}") return f"AnalysisParameters({', '.join(params)})"
[docs] def __eq__(self, other) -> bool: """Compare two AnalysisParameters objects for equality. :param other: Other AnalysisParameters object to compare :type other: AnalysisParameters :returns: True if all parameters are equal :rtype: bool """ if not isinstance(other, AnalysisParameters): return False return ( self.hb_distance_cutoff == other.hb_distance_cutoff and self.hb_angle_cutoff == other.hb_angle_cutoff and self.hb_donor_acceptor_cutoff == other.hb_donor_acceptor_cutoff and self.whb_distance_cutoff == other.whb_distance_cutoff and self.whb_angle_cutoff == other.whb_angle_cutoff and self.whb_donor_acceptor_cutoff == other.whb_donor_acceptor_cutoff and self.xb_distance_cutoff == other.xb_distance_cutoff and self.xb_angle_cutoff == other.xb_angle_cutoff and self.pi_distance_cutoff == other.pi_distance_cutoff and self.pi_angle_cutoff == other.pi_angle_cutoff and self.pi_ccl_distance_cutoff == other.pi_ccl_distance_cutoff and self.pi_ccl_angle_cutoff == other.pi_ccl_angle_cutoff and self.pi_cbr_distance_cutoff == other.pi_cbr_distance_cutoff and self.pi_cbr_angle_cutoff == other.pi_cbr_angle_cutoff and self.pi_ci_distance_cutoff == other.pi_ci_distance_cutoff and self.pi_ci_angle_cutoff == other.pi_ci_angle_cutoff and self.pi_ch_distance_cutoff == other.pi_ch_distance_cutoff and self.pi_ch_angle_cutoff == other.pi_ch_angle_cutoff and self.pi_nh_distance_cutoff == other.pi_nh_distance_cutoff and self.pi_nh_angle_cutoff == other.pi_nh_angle_cutoff and self.pi_oh_distance_cutoff == other.pi_oh_distance_cutoff and self.pi_oh_angle_cutoff == other.pi_oh_angle_cutoff and self.pi_sh_distance_cutoff == other.pi_sh_distance_cutoff and self.pi_sh_angle_cutoff == other.pi_sh_angle_cutoff and self.covalent_cutoff_factor == other.covalent_cutoff_factor and self.analysis_mode == other.analysis_mode and self.fix_pdb_enabled == other.fix_pdb_enabled and self.fix_pdb_method == other.fix_pdb_method and self.fix_pdb_add_hydrogens == other.fix_pdb_add_hydrogens and self.fix_pdb_add_heavy_atoms == other.fix_pdb_add_heavy_atoms and self.fix_pdb_replace_nonstandard == other.fix_pdb_replace_nonstandard and self.fix_pdb_remove_heterogens == other.fix_pdb_remove_heterogens and self.fix_pdb_keep_water == other.fix_pdb_keep_water )
[docs] def __hash__(self) -> int: """Return hash of the parameters object for use in sets/dicts. :returns: Hash value based on all parameters :rtype: int """ return hash(( self.hb_distance_cutoff, self.hb_angle_cutoff, self.hb_donor_acceptor_cutoff, self.whb_distance_cutoff, self.whb_angle_cutoff, self.whb_donor_acceptor_cutoff, self.xb_distance_cutoff, self.xb_angle_cutoff, self.pi_distance_cutoff, self.pi_angle_cutoff, self.pi_ccl_distance_cutoff, self.pi_ccl_angle_cutoff, self.pi_cbr_distance_cutoff, self.pi_cbr_angle_cutoff, self.pi_ci_distance_cutoff, self.pi_ci_angle_cutoff, self.pi_ch_distance_cutoff, self.pi_ch_angle_cutoff, self.pi_nh_distance_cutoff, self.pi_nh_angle_cutoff, self.pi_oh_distance_cutoff, self.pi_oh_angle_cutoff, self.pi_sh_distance_cutoff, self.pi_sh_angle_cutoff, self.covalent_cutoff_factor, self.analysis_mode, self.fix_pdb_enabled, self.fix_pdb_method, self.fix_pdb_add_hydrogens, self.fix_pdb_add_heavy_atoms, self.fix_pdb_replace_nonstandard, self.fix_pdb_remove_heterogens, self.fix_pdb_keep_water ))
[docs] def to_dict(self) -> dict: """Convert parameters to dictionary format. :returns: Dictionary representation of all parameters :rtype: dict """ return { # Hydrogen bond parameters 'hb_distance_cutoff': self.hb_distance_cutoff, 'hb_angle_cutoff': self.hb_angle_cutoff, 'hb_donor_acceptor_cutoff': self.hb_donor_acceptor_cutoff, # Weak hydrogen bond parameters 'whb_distance_cutoff': self.whb_distance_cutoff, 'whb_angle_cutoff': self.whb_angle_cutoff, 'whb_donor_acceptor_cutoff': self.whb_donor_acceptor_cutoff, # Halogen bond parameters 'xb_distance_cutoff': self.xb_distance_cutoff, 'xb_angle_cutoff': self.xb_angle_cutoff, # π interaction parameters 'pi_distance_cutoff': self.pi_distance_cutoff, 'pi_angle_cutoff': self.pi_angle_cutoff, # π interaction subtype parameters 'pi_ccl_distance_cutoff': self.pi_ccl_distance_cutoff, 'pi_ccl_angle_cutoff': self.pi_ccl_angle_cutoff, 'pi_cbr_distance_cutoff': self.pi_cbr_distance_cutoff, 'pi_cbr_angle_cutoff': self.pi_cbr_angle_cutoff, 'pi_ci_distance_cutoff': self.pi_ci_distance_cutoff, 'pi_ci_angle_cutoff': self.pi_ci_angle_cutoff, 'pi_ch_distance_cutoff': self.pi_ch_distance_cutoff, 'pi_ch_angle_cutoff': self.pi_ch_angle_cutoff, 'pi_nh_distance_cutoff': self.pi_nh_distance_cutoff, 'pi_nh_angle_cutoff': self.pi_nh_angle_cutoff, 'pi_oh_distance_cutoff': self.pi_oh_distance_cutoff, 'pi_oh_angle_cutoff': self.pi_oh_angle_cutoff, 'pi_sh_distance_cutoff': self.pi_sh_distance_cutoff, 'pi_sh_angle_cutoff': self.pi_sh_angle_cutoff, # General parameters 'covalent_cutoff_factor': self.covalent_cutoff_factor, 'analysis_mode': self.analysis_mode, # PDB fixing parameters 'fix_pdb_enabled': self.fix_pdb_enabled, 'fix_pdb_method': self.fix_pdb_method, 'fix_pdb_add_hydrogens': self.fix_pdb_add_hydrogens, 'fix_pdb_add_heavy_atoms': self.fix_pdb_add_heavy_atoms, 'fix_pdb_replace_nonstandard': self.fix_pdb_replace_nonstandard, 'fix_pdb_remove_heterogens': self.fix_pdb_remove_heterogens, 'fix_pdb_keep_water': self.fix_pdb_keep_water }
[docs] @classmethod def from_dict(cls, data: dict) -> 'AnalysisParameters': """Create AnalysisParameters object from dictionary. :param data: Dictionary containing parameter values :type data: dict :returns: New AnalysisParameters object :rtype: AnalysisParameters """ return cls(**data)
[docs] def validate(self) -> List[str]: """Validate parameter values and return list of validation errors. Checks all parameter values for validity and logical consistency. Returns a list of validation error messages, empty list if all valid. :returns: List of validation error messages :rtype: List[str] """ errors = [] # Distance parameter validation if not ( ParameterRanges.MIN_DISTANCE <= self.hb_distance_cutoff <= ParameterRanges.MAX_DISTANCE ): errors.append( f"Hydrogen bond distance cutoff must be between {ParameterRanges.MIN_DISTANCE}-{ParameterRanges.MAX_DISTANCE}Å" ) if not ( ParameterRanges.MIN_DISTANCE <= self.hb_donor_acceptor_cutoff <= ParameterRanges.MAX_DISTANCE ): errors.append( f"Donor-acceptor distance cutoff must be between {ParameterRanges.MIN_DISTANCE}-{ParameterRanges.MAX_DISTANCE}Å" ) if not ( ParameterRanges.MIN_DISTANCE <= self.whb_distance_cutoff <= ParameterRanges.MAX_DISTANCE ): errors.append( f"Weak hydrogen bond distance cutoff must be between {ParameterRanges.MIN_DISTANCE}-{ParameterRanges.MAX_DISTANCE}Å" ) if not ( ParameterRanges.MIN_DISTANCE <= self.whb_donor_acceptor_cutoff <= ParameterRanges.MAX_DISTANCE ): errors.append( f"Weak hydrogen bond donor-acceptor distance cutoff must be between {ParameterRanges.MIN_DISTANCE}-{ParameterRanges.MAX_DISTANCE}Å" ) if not ( ParameterRanges.MIN_DISTANCE <= self.xb_distance_cutoff <= ParameterRanges.MAX_DISTANCE ): errors.append( f"Halogen bond distance cutoff must be between {ParameterRanges.MIN_DISTANCE}-{ParameterRanges.MAX_DISTANCE}Å" ) if not ( ParameterRanges.MIN_DISTANCE <= self.pi_distance_cutoff <= ParameterRanges.MAX_DISTANCE ): errors.append( f"π interaction distance cutoff must be between {ParameterRanges.MIN_DISTANCE}-{ParameterRanges.MAX_DISTANCE}Å" ) # π interaction subtype distance validation pi_subtypes = [ ('pi_ccl_distance_cutoff', 'C-Cl...π'), ('pi_cbr_distance_cutoff', 'C-Br...π'), ('pi_ci_distance_cutoff', 'C-I...π'), ('pi_ch_distance_cutoff', 'C-H...π'), ('pi_nh_distance_cutoff', 'N-H...π'), ('pi_oh_distance_cutoff', 'O-H...π'), ('pi_sh_distance_cutoff', 'S-H...π') ] for param_name, desc in pi_subtypes: param_value = getattr(self, param_name) if not ( ParameterRanges.MIN_DISTANCE <= param_value <= ParameterRanges.MAX_DISTANCE ): errors.append( f"{desc} distance cutoff must be between {ParameterRanges.MIN_DISTANCE}-{ParameterRanges.MAX_DISTANCE}Å" ) # Angle parameter validation if not ( ParameterRanges.MIN_ANGLE <= self.hb_angle_cutoff <= ParameterRanges.MAX_ANGLE ): errors.append( f"Hydrogen bond angle cutoff must be between {ParameterRanges.MIN_ANGLE}-{ParameterRanges.MAX_ANGLE}°" ) if not ( ParameterRanges.MIN_ANGLE <= self.whb_angle_cutoff <= ParameterRanges.MAX_ANGLE ): errors.append( f"Weak hydrogen bond angle cutoff must be between {ParameterRanges.MIN_ANGLE}-{ParameterRanges.MAX_ANGLE}°" ) if not ( ParameterRanges.MIN_ANGLE <= self.xb_angle_cutoff <= ParameterRanges.MAX_ANGLE ): errors.append( f"Halogen bond angle cutoff must be between {ParameterRanges.MIN_ANGLE}-{ParameterRanges.MAX_ANGLE}°" ) if not ( ParameterRanges.MIN_ANGLE <= self.pi_angle_cutoff <= ParameterRanges.MAX_ANGLE ): errors.append( f"π interaction angle cutoff must be between {ParameterRanges.MIN_ANGLE}-{ParameterRanges.MAX_ANGLE}°" ) # π interaction subtype angle validation pi_subtype_angles = [ ('pi_ccl_angle_cutoff', 'C-Cl...π'), ('pi_cbr_angle_cutoff', 'C-Br...π'), ('pi_ci_angle_cutoff', 'C-I...π'), ('pi_ch_angle_cutoff', 'C-H...π'), ('pi_nh_angle_cutoff', 'N-H...π'), ('pi_oh_angle_cutoff', 'O-H...π'), ('pi_sh_angle_cutoff', 'S-H...π') ] for param_name, desc in pi_subtype_angles: param_value = getattr(self, param_name) if not ( ParameterRanges.MIN_ANGLE <= param_value <= ParameterRanges.MAX_ANGLE ): errors.append( f"{desc} angle cutoff must be between {ParameterRanges.MIN_ANGLE}-{ParameterRanges.MAX_ANGLE}°" ) # Covalent factor validation if not ( ParameterRanges.MIN_COVALENT_FACTOR <= self.covalent_cutoff_factor <= ParameterRanges.MAX_COVALENT_FACTOR ): errors.append( f"Covalent bond factor must be between {ParameterRanges.MIN_COVALENT_FACTOR}-{ParameterRanges.MAX_COVALENT_FACTOR}" ) # Analysis mode validation if self.analysis_mode not in AnalysisModes.ALL_MODES: errors.append( f"Analysis mode must be one of: {', '.join(AnalysisModes.ALL_MODES)}" ) # PDB fixing parameter validation if self.fix_pdb_method not in PDBFixingModes.ALL_METHODS: errors.append( f"PDB fixing method must be one of: {', '.join(PDBFixingModes.ALL_METHODS)}" ) # Logical consistency validation for PDB fixing if self.fix_pdb_enabled: if self.fix_pdb_method == "openbabel": # OpenBabel only supports hydrogen addition if self.fix_pdb_add_heavy_atoms: errors.append( "OpenBabel does not support adding heavy atoms - only PDBFixer supports this" ) if self.fix_pdb_replace_nonstandard: errors.append( "OpenBabel does not support replacing nonstandard residues - only PDBFixer supports this" ) if self.fix_pdb_remove_heterogens: errors.append( "OpenBabel does not support removing heterogens - only PDBFixer supports this" ) # At least one operation must be selected when fixing is enabled operations_selected = [ self.fix_pdb_add_hydrogens, self.fix_pdb_add_heavy_atoms, self.fix_pdb_replace_nonstandard, self.fix_pdb_remove_heterogens, ] if not any(operations_selected): errors.append( "At least one PDB fixing operation must be selected when PDB fixing is enabled" ) return errors
# Parameter validation ranges
[docs] class ParameterRanges: """Valid ranges for analysis parameters.""" # Distance ranges (Angstroms) MIN_DISTANCE = 0.5 MAX_DISTANCE = 6 # Angle ranges (degrees) MIN_ANGLE = 0.0 MAX_ANGLE = 180.0 # Factor ranges MIN_COVALENT_FACTOR = 0.0 MAX_COVALENT_FACTOR = 1.0
# PDB fixing mode constants
[docs] class PDBFixingModes: """Available PDB structure fixing modes.""" OPENBABEL = "openbabel" PDBFIXER = "pdbfixer" ALL_METHODS = [OPENBABEL, PDBFIXER] # Available operations ADD_HYDROGENS = "add_hydrogens" ADD_HEAVY_ATOMS = "add_heavy_atoms" # PDBFixer only REPLACE_NONSTANDARD = "replace_nonstandard" # PDBFixer only REMOVE_HETEROGENS = "remove_heterogens" # PDBFixer only # Operations available for each method OPENBABEL_OPERATIONS = [ADD_HYDROGENS] PDBFIXER_OPERATIONS = [ ADD_HYDROGENS, ADD_HEAVY_ATOMS, REPLACE_NONSTANDARD, REMOVE_HETEROGENS, ]
# Analysis mode constants
[docs] class AnalysisModes: """Available analysis modes.""" COMPLETE = "complete" LOCAL = "local" ALL_MODES = [COMPLETE, LOCAL]
# Bond detection method constants
[docs] class BondDetectionMethods: """Available bond detection methods.""" CONECT_RECORDS = "conect_records" RESIDUE_LOOKUP = "residue_lookup" DISTANCE_BASED = "distance_based" ALL_METHODS = [CONECT_RECORDS, RESIDUE_LOOKUP, DISTANCE_BASED]