use super::error::Error;
use std::collections::HashSet;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Format {
Pdb,
Mmcif,
}
#[derive(Debug, Clone, Default)]
pub struct ReadConfig {
pub clean: CleanConfig,
pub protonation: ProtonationConfig,
pub topology: TopologyConfig,
pub ff: ForceFieldConfig,
pub scope: PackingScope,
}
#[derive(Debug, Clone, Default)]
pub struct CleanConfig {
pub remove_water: bool,
pub remove_ions: bool,
pub remove_hetero: bool,
pub remove_residue_names: HashSet<String>,
pub keep_residue_names: HashSet<String>,
}
#[derive(Debug, Clone)]
pub struct ProtonationConfig {
pub target_ph: Option<f64>,
pub his_strategy: HisStrategy,
pub his_salt_bridge: bool,
}
impl Default for ProtonationConfig {
fn default() -> Self {
Self {
target_ph: None,
his_strategy: HisStrategy::default(),
his_salt_bridge: true,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum HisStrategy {
Hid,
Hie,
Random,
#[default]
HbNetwork,
}
#[derive(Debug, Clone)]
pub struct TopologyConfig {
pub templates: Vec<HeteroTemplate>,
pub disulfide_cutoff: f64,
}
impl Default for TopologyConfig {
fn default() -> Self {
Self {
templates: Vec::new(),
disulfide_cutoff: 2.2,
}
}
}
#[derive(Debug, Clone)]
pub struct HeteroTemplate(pub(crate) dreid_forge::io::Template);
impl HeteroTemplate {
pub fn read_mol2<R: std::io::BufRead>(reader: R) -> Result<Self, Error> {
dreid_forge::io::read_mol2_template(reader)
.map(Self)
.map_err(|e| Error::Template(e.to_string()))
}
}
#[derive(Debug, Clone, Default)]
pub struct ForceFieldConfig {
pub rules: Option<String>,
pub params: Option<String>,
pub vdw: VdwPotential,
pub charge: Option<ChargeConfig>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum VdwPotential {
#[default]
Buckingham,
LennardJones,
}
#[derive(Debug, Clone, Default)]
pub struct ChargeConfig {
pub protein_scheme: ProteinScheme,
pub nucleic_scheme: NucleicScheme,
pub water_scheme: WaterScheme,
pub hetero_configs: Vec<HeteroChargeConfig>,
pub default_hetero_method: HeteroQeqMethod,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ProteinScheme {
#[default]
AmberFFSB,
AmberFF03,
Charmm,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum NucleicScheme {
#[default]
Amber,
Charmm,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum WaterScheme {
#[default]
Tip3p,
Tip3pFb,
Spc,
SpcE,
Opc3,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ResidueSelector {
pub chain_id: String,
pub residue_id: i32,
pub insertion_code: Option<char>,
}
#[derive(Debug, Clone)]
pub struct HeteroChargeConfig {
pub selector: ResidueSelector,
pub method: HeteroQeqMethod,
}
#[derive(Debug, Clone)]
pub enum HeteroQeqMethod {
Vacuum(QeqConfig),
Embedded(EmbeddedQeqConfig),
}
impl Default for HeteroQeqMethod {
fn default() -> Self {
Self::Embedded(EmbeddedQeqConfig::default())
}
}
#[derive(Debug, Clone)]
pub struct QeqConfig {
pub total_charge: f64,
pub solver_options: SolverOptions,
}
impl Default for QeqConfig {
fn default() -> Self {
Self {
total_charge: 0.0,
solver_options: SolverOptions::default(),
}
}
}
#[derive(Debug, Clone)]
pub struct EmbeddedQeqConfig {
pub cutoff_radius: f64,
pub qeq: QeqConfig,
}
impl Default for EmbeddedQeqConfig {
fn default() -> Self {
Self {
cutoff_radius: 10.0,
qeq: QeqConfig::default(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct SolverOptions {
pub tolerance: f64,
pub max_iterations: u32,
pub lambda_scale: f64,
pub hydrogen_scf: bool,
pub basis_type: BasisType,
pub damping: DampingStrategy,
}
impl Default for SolverOptions {
fn default() -> Self {
Self {
tolerance: 1.0e-6,
max_iterations: 2000,
lambda_scale: 0.5,
hydrogen_scf: true,
basis_type: BasisType::default(),
damping: DampingStrategy::Auto { initial: 0.4 },
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum BasisType {
Gto,
#[default]
Sto,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum DampingStrategy {
None,
Fixed(f64),
Auto { initial: f64 },
}
#[derive(Debug, Clone, Default)]
pub enum PackingScope {
#[default]
Full,
Pocket {
anchor: ResidueSelector,
radius: f32,
},
Interface {
groups: [Vec<String>; 2],
cutoff: f32,
},
List(Vec<ResidueSelector>),
}