use clap::Parser;
use libc::{SIGPIPE, SIG_DFL};
use klassify::breakpoint;
use klassify::build;
use klassify::classify;
use klassify::cluster_pairs;
use klassify::extract;
use klassify::extract_bam;
use klassify::pipeline;
use klassify::regions;
use klassify::tools::info;
use klassify::tools::sort_bam;
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about=None)]
struct Args {
#[clap(subcommand)]
subcommand: SubCommand,
}
#[derive(Parser, Debug)]
enum SubCommand {
#[clap(about = "Detect breakpoints")]
Breakpoint(breakpoint::BreakpointArgs),
#[clap(about = "Build reference kmer table")]
Build(build::BuildArgs),
#[clap(about = "Classify reads")]
Classify(classify::ClassifyArgs),
#[clap(about = "Cluster paired cross-over regions")]
ClusterPairs(cluster_pairs::ClusterPairsArgs),
#[clap(about = "Print details about the kmer table")]
Info(info::InfoArgs),
#[clap(about = "Extract reads")]
Extract(extract::ExtractArgs),
#[clap(about = "Extract reads from BAM")]
ExtractBam(extract_bam::ExtractBamArgs),
#[clap(about = "Run simple pipeline from start to end")]
Pipeline(pipeline::PipelineArgs),
#[clap(about = "Prepare BAM files and generate depths for each bin")]
Regions(regions::RegionsArgs),
#[clap(about = "Sort BAM file by divergence")]
SortBam(sort_bam::SortBamArgs),
}
fn main() {
env_logger::init_from_env(
env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info"),
);
unsafe {
libc::signal(SIGPIPE, SIG_DFL);
}
let args = Args::parse();
match args.subcommand {
SubCommand::Build(build) => {
build::build(&build.fasta_files, &build.output_file, build.kmer_size);
}
SubCommand::Breakpoint(breakpoint) => {
breakpoint::breakpoint(breakpoint);
}
SubCommand::Classify(classify) => {
classify::classify(
&classify.bincode_file,
&classify.reads_file,
&classify.output_dir,
classify.prefix_length,
);
}
SubCommand::ClusterPairs(cluster_pairs) => {
cluster_pairs::cluster_pairs(cluster_pairs);
}
SubCommand::Info(info) => {
info::info(&info.bincode_file);
}
SubCommand::Extract(extract) => {
extract::extract(
&extract.reads_tsv,
&extract.fasta_files,
&extract.output_file,
);
}
SubCommand::ExtractBam(extract_bam) => {
extract_bam::extract_bam(
&extract_bam.regions_file,
&extract_bam.bam_file,
extract_bam.flank_size,
);
}
SubCommand::Pipeline(pipeline) => {
_ = pipeline::pipeline(pipeline);
}
SubCommand::Regions(regions) => {
regions::regions(
®ions.bam_files,
!regions.no_chr_only,
regions.min_support,
regions.max_support,
);
}
SubCommand::SortBam(sort_bam) => {
sort_bam::sort_bam(
&sort_bam.input,
&sort_bam.output,
sort_bam.max_de,
sort_bam.min_mapq,
);
}
}
}