use clap::{Args, Parser, Subcommand};
use std::process;
#[derive(Parser, Clone)]
#[command(author, version, about, long_about = None)]
pub struct PdfCli {
#[command(subcommand)]
pub command: PdfCommands,
}
#[derive(Subcommand, Clone)]
pub enum PdfCommands {
#[command(name = "xfx_q2")]
XfxQ2(XfxQ2Args),
#[command(name = "alphas_q2")]
AlphasQ2(AlphasQ2Args),
#[cfg(feature = "tmdlib")]
#[command(name = "xfx_q2_kt")]
XfxQ2Kt(XfxQ2KtArgs),
}
#[derive(Args, Clone)]
pub struct XfxQ2Args {
pub pdf_name: String,
#[arg(short, long)]
pub member: usize,
#[arg(short = 'i', long)]
pub pid: i32,
#[arg(required = true)]
pub inputs: Vec<f64>,
}
#[derive(Args, Clone)]
pub struct AlphasQ2Args {
pub pdf_name: String,
#[arg(short, long)]
pub member: usize,
#[arg(short, long)]
pub q2: f64,
}
#[cfg(feature = "tmdlib")]
#[derive(Args, Clone)]
pub struct XfxQ2KtArgs {
pub pdf_name: String,
#[arg(short, long)]
pub member: usize,
#[arg(short = 'i', long)]
pub pid: i32,
#[arg(required = true)]
pub inputs: Vec<f64>,
}
#[allow(clippy::needless_pass_by_value)]
#[allow(clippy::cast_possible_truncation)]
#[allow(clippy::cast_possible_wrap)]
pub fn main(cli: PdfCli) {
match &cli.command {
PdfCommands::XfxQ2(args) => {
let pdf = neopdf::pdf::PDF::load(&args.pdf_name, args.member);
if args.inputs.len() < 2 {
eprintln!("Error: At least [x, Q2] must be provided as input.");
process::exit(1);
}
let val = pdf.xfxq2(args.pid, &args.inputs);
println!("{val}");
}
PdfCommands::AlphasQ2(args) => {
let pdf = neopdf::pdf::PDF::load(&args.pdf_name, args.member);
let val = pdf.alphas_q2(args.q2);
println!("{val}");
}
#[cfg(feature = "tmdlib")]
PdfCommands::XfxQ2Kt(args) => {
use neopdf_tmdlib::Tmd;
let mut tmd = Tmd::new();
tmd.init(&args.pdf_name, args.member as i32);
if args.inputs.len() < 3 {
eprintln!("Error: [kt, x, Q2] must be provided as input.");
process::exit(1);
}
let kt = args.inputs[0];
let x = args.inputs[1];
let q2 = args.inputs[2];
let pids = [-6, -5, -4, -3, -2, -1, 21, 1, 2, 3, 4, 5, 6];
let pid_idx = pids.iter().position(|&p| p == args.pid).unwrap_or_else(|| {
eprintln!("Error: PID {} not supported by TMDlib interface.", args.pid);
process::exit(1);
});
let pdfs = tmd.xfxq2kt(x, kt, q2.sqrt());
println!("{}", pdfs[pid_idx]);
}
}
}