File size: 2,797 Bytes
4e2940e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/usr/bin/env python
"""Aim 1: Validate gamma estimates against published mRNA half-lives.

Correlates per-gene median gamma from scPTR with SLAM-seq (Herzog 2017)
and TimeLapse-seq (Schofield 2018) measurements.
"""

from __future__ import annotations

import argparse
import json
import sys
from pathlib import Path

import matplotlib
matplotlib.use("Agg")

# Add project root to path
sys.path.insert(0, str(Path(__file__).parent.parent))
from _common import set_figure_style, save_figure, setup_output_dirs

import scptr


def main(args: argparse.Namespace) -> None:
    set_figure_style()
    fig_dir, res_dir = setup_output_dirs(
        "figures/aim1", "results/aim1"
    )

    # Load dataset
    print(f"Loading dataset: {args.dataset}")
    if args.dataset == "pancreas":
        adata = scptr.datasets.pancreas()
    else:
        adata = scptr.readwrite.read_h5ad(args.dataset)

    # Run scPTR pipeline
    print("Running preprocessing...")
    scptr.pp.filter_genes(adata)
    scptr.pp.normalize_layers(adata)
    scptr.pp.neighbors(adata, n_neighbors=args.n_neighbors)
    scptr.pp.smooth_layers(adata)

    print("Estimating beta and gamma...")
    scptr.tl.estimate_beta(adata)
    scptr.tl.estimate_gamma(adata)

    # Load half-life references
    print("Loading half-life references...")
    herzog = scptr.datasets.herzog2017_halflives()
    schofield = scptr.datasets.schofield2018_halflives()

    # Correlate
    results = {}
    for name, hl_df in [("herzog2017", herzog), ("schofield2018", schofield)]:
        print(f"Correlating with {name}...")
        corr = scptr.benchmark.correlate_with_halflives(adata, hl_df)
        results[name] = corr
        print(f"  Spearman r={corr['spearman_r']:.3f}, p={corr['spearman_p']:.2e}")
        print(f"  Pearson  r={corr['pearson_r']:.3f}, p={corr['pearson_p']:.2e}")
        print(f"  n_genes={corr['n_genes']}")

        # Plot
        fig = scptr.pl.halflife_scatter(adata, hl_df)
        save_figure(fig, f"halflife_scatter_{name}", "figures/aim1")

    # Save results
    out_path = res_dir / "halflife_correlations.json"
    # Convert to serializable format
    serializable = {}
    for k, v in results.items():
        serializable[k] = {kk: vv for kk, vv in v.items() if kk != "matched_genes"}
    with open(out_path, "w") as f:
        json.dump(serializable, f, indent=2)
    print(f"Results saved to {out_path}")


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument(
        "--dataset", default="pancreas",
        help="Dataset name or path to h5ad file (default: pancreas)",
    )
    parser.add_argument(
        "--n-neighbors", type=int, default=30,
        help="Number of neighbors for kNN graph (default: 30)",
    )
    main(parser.parse_args())