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 dataclasses import dataclass
from typing import List
[docs]
class ParametersDefault:
"""Default values for molecular interaction analysis parameters."""
# Hydrogen bond parameters
HB_DISTANCE_CUTOFF = 3.5 # Å - H...A distance cutoff
HB_ANGLE_CUTOFF = 120.0 # degrees - D-H...A angle cutoff
HB_DA_DISTANCE = 4.0 # Å - Donor-acceptor distance cutoff
# Halogen bond parameters
XB_DISTANCE_CUTOFF = 4.0 # Å - X...A distance cutoff
XB_ANGLE_CUTOFF = 120.0 # degrees - C-X...A angle cutoff
# π interaction parameters
PI_DISTANCE_CUTOFF = 4.5 # Å - H...π distance cutoff
PI_ANGLE_CUTOFF = 90.0 # degrees - D-H...π angle cutoff
# General analysis parameters
COVALENT_CUTOFF_FACTOR = 0.6 # 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
FIX_PDB_ENABLED = True # Enable PDB structure fixing
FIX_PDB_METHOD = "openbabel" # Method: "openbabel" or "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]
@dataclass
class AnalysisParameters:
"""Parameters for molecular interaction analysis.
This class contains all configurable parameters used during
molecular interaction analysis, including distance cutoffs,
angle thresholds, and analysis modes.
: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 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
"""
# 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
# Halogen bond parameters
xb_distance_cutoff: float = ParametersDefault.XB_DISTANCE_CUTOFF
xb_angle_cutoff: float = ParametersDefault.XB_ANGLE_CUTOFF
# Pi interaction parameters
pi_distance_cutoff: float = ParametersDefault.PI_DISTANCE_CUTOFF
pi_angle_cutoff: float = ParametersDefault.PI_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
[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.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}Å"
)
# 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.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}°"
)
# 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]