use clap::{Args, Parser, Subcommand};
#[cfg(feature = "blas-openblas-static")]
const CLI_VERSION: &str = concat!(env!("CARGO_PKG_VERSION"), " (openblas-static)");
#[cfg(feature = "blas-openblas-system")]
const CLI_VERSION: &str = concat!(env!("CARGO_PKG_VERSION"), " (openblas-system)");
#[cfg(not(any(feature = "blas-openblas-static", feature = "blas-openblas-system")))]
const CLI_VERSION: &str = env!("CARGO_PKG_VERSION");
#[derive(Parser)]
#[command(name = "ldsc", about = "LD Score Regression (Rust port)", version = CLI_VERSION)]
pub struct Cli {
#[arg(long, default_value_t = 4, global = true)]
pub blas_threads: usize,
#[arg(long, global = true)]
pub rayon_threads: Option<usize>,
#[arg(long, global = true)]
pub polars_threads: Option<usize>,
#[command(subcommand)]
pub command: Command,
}
#[derive(Subcommand)]
pub enum Command {
MungeSumstats(MungeArgs),
Ldscore(LdscoreArgs),
H2(H2Args),
Rg(RgArgs),
MakeAnnot(MakeAnnotArgs),
CtsAnnot(CtsAnnotArgs),
}
#[derive(Args)]
pub struct MungeArgs {
#[arg(long)]
pub sumstats: String,
#[arg(long)]
pub out: String,
#[arg(long)]
pub merge_alleles: Option<String>,
#[arg(long, default_value_t = false)]
pub daner: bool,
#[arg(long, default_value_t = false)]
pub daner_n: bool,
#[arg(long, default_value_t = 0.0)]
pub n_min: f64,
#[arg(long, default_value_t = 0.01)]
pub maf: f64,
#[arg(long, default_value_t = 0.9)]
pub info_min: f64,
#[arg(long, default_value_t = true)]
pub keep_mhc: bool,
#[arg(long)]
pub n: Option<f64>,
#[arg(long)]
pub n_cas: Option<f64>,
#[arg(long)]
pub n_con: Option<f64>,
#[arg(long)]
pub snp_col: Option<String>,
#[arg(long)]
pub n_col: Option<String>,
#[arg(long)]
pub n_cas_col: Option<String>,
#[arg(long)]
pub n_con_col: Option<String>,
#[arg(long)]
pub a1_col: Option<String>,
#[arg(long)]
pub a2_col: Option<String>,
#[arg(long)]
pub p_col: Option<String>,
#[arg(long)]
pub frq_col: Option<String>,
#[arg(long)]
pub info_col: Option<String>,
#[arg(long)]
pub signed_sumstats: Option<String>,
#[arg(long)]
pub ignore: Option<String>,
#[arg(long, default_value_t = false)]
pub keep_maf: bool,
#[arg(long, default_value_t = false)]
pub a1_inc: bool,
#[arg(long, default_value_t = false)]
pub no_alleles: bool,
#[arg(long)]
pub info_list: Option<String>,
#[arg(long)]
pub nstudy: Option<String>,
#[arg(long)]
pub nstudy_min: Option<u64>,
}
#[derive(Args)]
pub struct LdscoreArgs {
#[arg(long)]
pub bfile: String,
#[arg(long)]
pub out: String,
#[arg(long, default_value_t = 1.0)]
pub ld_wind_cm: f64,
#[arg(long)]
pub ld_wind_kb: Option<f64>,
#[arg(long)]
pub ld_wind_snp: Option<usize>,
#[arg(long)]
pub annot: Option<String>,
#[arg(long, default_value_t = false)]
pub thin_annot: bool,
#[arg(long)]
pub extract: Option<String>,
#[arg(long)]
pub maf: Option<f64>,
#[arg(long, default_value_t = false)]
pub maf_pre: bool,
#[arg(long)]
pub print_snps: Option<String>,
#[arg(long)]
pub keep: Option<String>,
#[arg(long, default_value_t = false)]
pub per_allele: bool,
#[arg(long)]
pub pq_exp: Option<f64>,
#[arg(long, default_value_t = false)]
pub no_print_annot: bool,
#[arg(long, default_value_t = 50)]
pub chunk_size: usize,
#[arg(long, default_value_t = false)]
pub yes_really: bool,
}
#[derive(Args)]
pub struct H2Args {
#[arg(long, required_unless_present = "h2_cts", conflicts_with = "h2_cts")]
pub h2: Option<String>,
#[arg(long, required_unless_present = "h2", conflicts_with = "h2")]
pub h2_cts: Option<String>,
#[arg(long)]
pub ref_ld_chr: Option<String>,
#[arg(long)]
pub ref_ld: Option<String>,
#[arg(long)]
pub w_ld_chr: Option<String>,
#[arg(long)]
pub ref_ld_chr_cts: Option<String>,
#[arg(long)]
pub w_ld: Option<String>,
#[arg(long)]
pub out: String,
#[arg(long)]
pub m_snps: Option<f64>,
#[arg(long, default_value_t = false)]
pub not_m_5_50: bool,
#[arg(long)]
pub samp_prev: Option<f64>,
#[arg(long)]
pub pop_prev: Option<f64>,
#[arg(long, default_value_t = false)]
pub no_intercept: bool,
#[arg(long)]
pub intercept_h2: Option<f64>,
#[arg(long)]
pub two_step: Option<f64>,
#[arg(long)]
pub chisq_max: Option<f64>,
#[arg(long, default_value_t = 200)]
pub n_blocks: usize,
#[arg(long, default_value_t = false)]
pub print_coefficients: bool,
#[arg(long, default_value_t = false)]
pub print_all_cts: bool,
#[arg(long, default_value_t = false)]
pub overlap_annot: bool,
#[arg(long)]
pub frqfile: Option<String>,
#[arg(long)]
pub frqfile_chr: Option<String>,
#[arg(long, default_value_t = false)]
pub print_cov: bool,
#[arg(long, default_value_t = false)]
pub print_delete_vals: bool,
#[arg(long, default_value_t = false)]
pub return_silly_things: bool,
#[arg(long, default_value_t = false)]
pub invert_anyway: bool,
}
#[derive(Args)]
pub struct RgArgs {
#[arg(long, value_delimiter = ',')]
pub rg: Vec<String>,
#[arg(long)]
pub ref_ld_chr: Option<String>,
#[arg(long)]
pub ref_ld: Option<String>,
#[arg(long)]
pub w_ld_chr: Option<String>,
#[arg(long)]
pub w_ld: Option<String>,
#[arg(long)]
pub out: String,
#[arg(long)]
pub m_snps: Option<f64>,
#[arg(long, default_value_t = false)]
pub not_m_5_50: bool,
#[arg(long, default_value_t = false)]
pub no_intercept: bool,
#[arg(long)]
pub two_step: Option<f64>,
#[arg(long)]
pub chisq_max: Option<f64>,
#[arg(long, default_value_t = 200)]
pub n_blocks: usize,
#[arg(long, value_delimiter = ',')]
pub samp_prev: Vec<f64>,
#[arg(long, value_delimiter = ',')]
pub pop_prev: Vec<f64>,
#[arg(long, value_delimiter = ',')]
pub intercept_gencov: Vec<f64>,
#[arg(long, value_delimiter = ',')]
pub intercept_h2: Vec<f64>,
#[arg(long, default_value_t = false)]
pub no_check_alleles: bool,
#[arg(long, default_value_t = false)]
pub print_cov: bool,
#[arg(long, default_value_t = false)]
pub print_delete_vals: bool,
#[arg(long, default_value_t = false)]
pub return_silly_things: bool,
#[arg(long, default_value_t = false)]
pub invert_anyway: bool,
}
#[derive(Args)]
pub struct MakeAnnotArgs {
#[arg(long)]
pub bimfile: String,
#[arg(long)]
pub annot_file: String,
#[arg(long)]
pub bed_file: Option<String>,
#[arg(long)]
pub gene_set_file: Option<String>,
#[arg(long)]
pub gene_coord_file: Option<String>,
#[arg(long, default_value_t = 0)]
pub windowsize: u32,
#[arg(long, default_value_t = false)]
pub nomerge: bool,
}
#[derive(Args)]
pub struct CtsAnnotArgs {
#[arg(long)]
pub bimfile: String,
#[arg(long)]
pub cts_bin: String,
#[arg(long)]
pub cts_breaks: String,
#[arg(long)]
pub cts_names: Option<String>,
#[arg(long)]
pub annot_file: String,
}