use std::path::PathBuf;
use clap::{Args, Parser, Subcommand, ValueEnum};
#[derive(Parser)]
#[command(name = "dpack", version)]
pub struct Cli {
#[command(subcommand)]
pub command: SubCmd,
#[arg(short, long, global = true)]
pub quiet: bool,
}
#[derive(Subcommand)]
pub enum SubCmd {
#[command(alias = "f")]
Full(FullArgs),
#[command(alias = "p")]
Pocket(PocketArgs),
#[command(alias = "i")]
Interface(InterfaceArgs),
#[command(alias = "l")]
List(ListArgs),
}
impl SubCmd {
pub fn common(&self) -> (&IoArgs, &StructureArgs, &ChargesArgs, &PackingArgs) {
match self {
Self::Full(a) => (&a.io, &a.structure, &a.charges, &a.packing),
Self::Pocket(a) => (&a.io, &a.structure, &a.charges, &a.packing),
Self::Interface(a) => (&a.io, &a.structure, &a.charges, &a.packing),
Self::List(a) => (&a.io, &a.structure, &a.charges, &a.packing),
}
}
pub fn label(&self) -> &'static str {
match self {
Self::Full(_) | Self::List(_) => "packed",
Self::Pocket(_) => "pocket",
Self::Interface(_) => "interface",
}
}
}
#[derive(Args)]
pub struct FullArgs {
#[command(flatten)]
pub io: IoArgs,
#[command(flatten)]
pub structure: StructureArgs,
#[command(flatten)]
pub charges: ChargesArgs,
#[command(flatten)]
pub packing: PackingArgs,
}
#[derive(Args)]
pub struct PocketArgs {
#[command(flatten)]
pub io: IoArgs,
#[command(flatten)]
pub structure: StructureArgs,
#[command(flatten)]
pub charges: ChargesArgs,
#[command(flatten)]
pub packing: PackingArgs,
#[arg(short = 'L', long = "ligand")]
pub ligand: Option<String>,
#[arg(short, long, default_value_t = 8.0)]
pub radius: f32,
}
#[derive(Args)]
pub struct InterfaceArgs {
#[command(flatten)]
pub io: IoArgs,
#[command(flatten)]
pub structure: StructureArgs,
#[command(flatten)]
pub charges: ChargesArgs,
#[command(flatten)]
pub packing: PackingArgs,
#[arg(short = 'A', long = "group-a")]
pub group_a: String,
#[arg(short = 'B', long = "group-b")]
pub group_b: String,
#[arg(short, long, default_value_t = 6.0)]
pub cutoff: f32,
}
#[derive(Args)]
pub struct ListArgs {
#[command(flatten)]
pub io: IoArgs,
#[command(flatten)]
pub structure: StructureArgs,
#[command(flatten)]
pub charges: ChargesArgs,
#[command(flatten)]
pub packing: PackingArgs,
#[arg(short, long = "residues")]
pub residues: String,
}
#[derive(Args)]
pub struct IoArgs {
pub input: PathBuf,
pub output: Option<PathBuf>,
}
#[derive(Args)]
#[command(next_help_heading = "STRUCTURE")]
pub struct StructureArgs {
#[arg(long)]
pub ph: Option<f64>,
#[arg(long, default_value = "network")]
pub his: HisArg,
#[arg(long)]
pub no_water: bool,
#[arg(long)]
pub no_ions: bool,
#[arg(long)]
pub no_hetero: bool,
#[arg(long, default_value = "exp")]
pub vdw: VdwArg,
#[arg(long)]
pub ff_rules: Option<PathBuf>,
#[arg(long)]
pub ff_params: Option<PathBuf>,
}
#[derive(Args)]
#[command(next_help_heading = "CHARGES")]
pub struct ChargesArgs {
#[arg(long, default_value = "amber-ff14sb")]
pub protein_charges: ProteinChargesArg,
#[arg(long, default_value = "amber")]
pub nucleic_charges: NucleicChargesArg,
#[arg(long, default_value = "tip3p")]
pub water_charges: WaterChargesArg,
#[arg(long, default_value = "embedded")]
pub hetero_qeq: HeteroQeqArg,
#[arg(long, default_value_t = 10.0)]
pub qeq_shell: f64,
#[arg(long, default_value_t = 0.0)]
pub qeq_charge: f64,
#[arg(long, default_value = "sto")]
pub qeq_basis: BasisArg,
#[arg(long, default_value_t = 0.5)]
pub qeq_lambda: f64,
#[arg(long, default_value_t = 1e-6)]
pub qeq_tol: f64,
#[arg(long, default_value_t = 2000)]
pub qeq_iter: u32,
#[arg(long, default_value = "auto:0.4")]
pub qeq_damp: String,
#[arg(long)]
pub no_h_scf: bool,
}
#[derive(Args)]
#[command(next_help_heading = "PACKING")]
pub struct PackingArgs {
#[arg(short, long)]
pub electrostatics: Option<f32>,
#[arg(long)]
pub no_polar_h: bool,
#[arg(long)]
pub include_input: bool,
#[arg(short = 'T', long = "template")]
pub templates: Vec<PathBuf>,
#[arg(short = 'E', long, default_value_t = 30.0)]
pub self_energy: f32,
#[arg(short = 'p', long, default_value_t = 0.0)]
pub prob_cutoff: f32,
}
#[derive(Clone, Copy, ValueEnum)]
pub enum HisArg {
Network,
Hid,
Hie,
Random,
}
#[derive(Clone, Copy, ValueEnum)]
pub enum VdwArg {
Exp,
Lj,
}
#[derive(Clone, Copy, ValueEnum)]
pub enum ProteinChargesArg {
#[value(name = "amber-ff14sb")]
AmberFf14sb,
#[value(name = "amber-ff03")]
AmberFf03,
Charmm,
}
#[derive(Clone, Copy, ValueEnum)]
pub enum NucleicChargesArg {
Amber,
Charmm,
}
#[derive(Clone, Copy, ValueEnum)]
pub enum WaterChargesArg {
Tip3p,
#[value(name = "tip3p-fb")]
Tip3pFb,
Spc,
#[value(name = "spc-e")]
SpcE,
Opc3,
}
#[derive(Clone, Copy, ValueEnum)]
pub enum HeteroQeqArg {
Embedded,
Vacuum,
}
#[derive(Clone, Copy, ValueEnum)]
pub enum BasisArg {
Sto,
Gto,
}