configfile: "config.yaml"

rule all:
    input:
        "/output/celltype_map.png",
        "/output/kde_map.png",
        "/output/celltype_abundance.csv"

rule run_ssam:
    output:
        ct_map    = "/output/celltype_map.png",
        kde_map   = "/output/kde_map.png",
        abundance = "/output/celltype_abundance.csv"
    threads: config["threads"]
    params:
        csv         = config["csv"],
        bandwidth   = config["bandwidth"],
        sampling    = config["sampling_distance"],
        search_size = config["search_size"],
        resolution  = config["resolution"],
        min_norm    = config["min_norm"],
        outlier_min_r = config["outlier_min_r"],
        filter_min_r  = config["filter_min_r"],
        no_scale_arg  = ("" if config.get("scale_vectors", True) else "--no-scale"),
        # Optional norm-threshold override; empty string -> canonical default.
        norm_arg    = (f"--norm-threshold {config['norm_threshold']}"
                       if str(config.get("norm_threshold", "")).strip() != "" else ""),
    log:
        "/output/ssam.log"
    shell:
        """
        python /pipeline/scripts/run_ssam.py \
            --csv {params.csv} \
            --output-dir /output \
            --bandwidth {params.bandwidth} \
            --sampling-distance {params.sampling} \
            --search-size {params.search_size} \
            --resolution {params.resolution} \
            --min-norm {params.min_norm} \
            --outlier-min-r {params.outlier_min_r} \
            --filter-min-r {params.filter_min_r} \
            {params.no_scale_arg} \
            --threads {threads} \
            {params.norm_arg} \
            2>&1 | tee {log}
        """
