md_analysis 0.1.0

molecular dynamics
// //! 分子动力学分析工具
// //!
// //! 读取 BAM 文件中的 dw/ar 字段(PacBio subread attributes),
// //! 截断到最大值 10000,分 bin (0~10000) 计数并输出 CSV。
// //!
// //! 支持:读长过滤、位置切片、ACGT 分碱基统计。
// //!
// //! 采用三阶段 worker 流水线架构(reader → stats workers → writer),
// //! 通过线程间通道实现并行 binning,writer 端 sequential merge 汇总结果。

mod bam_record_ext;
mod binning;
mod cli;
mod config;
mod raw_bam_pipeline;
mod reader;
mod record;
mod writer;
mod pbar;

use std::path::Path;

use anyhow::Result;
use clap::Parser;
use config::default_worker_count;
use raw_bam_pipeline::{PipelineConfig, run_pipeline};
// use writer::write_single_csv;

fn main() -> Result<()> {
    let args = cli::CliArgs::parse();

    if !Path::new(&args.bam_file).exists() {
        eprintln!("错误: 找不到文件 '{}'", args.bam_file);
        std::process::exit(1);
    }

    println!("处理 BAM: {}", args.bam_file);

    let worker_count = if args.workers > 0 {
        args.workers
    } else {
        default_worker_count()
    };

    let pipeline_cfg = PipelineConfig::new(worker_count);

    let out_path = Path::new(&args.output_dir);

    match args.commands {
        cli::Commands::RawBam(raw_bam_args) => {
            run_pipeline(&args.bam_file, &pipeline_cfg, raw_bam_args.slice_n, out_path);
        }

        cli::Commands::AlignedBam(args) => {}
    }
    // 通过流水线并行处理(支持 per-base + slicing + 长度过滤)

    Ok(())
}