///|
/// 免疫组库分析演示: V(D)J 指认 -> 克隆型聚类 -> 多样性 -> AIRR TSV -> TCRdist.
fn main raise {
println("=== 免疫组库分析 (TRB, 教学级 germline 库) ===")
// 构建自定义 germline 库(生产可用 vdj_build_gene_db 导入 IMGT 完整库)
let v : Array[@src.VdjGene] = [
{
name: "TRBV01",
locus: "TRB",
kind: @src.VGene,
sequence: "AAAACTGGGGTTTACCTGT",
},
{
name: "TRBV02",
locus: "TRB",
kind: @src.VGene,
sequence: "CCCCATCGGGGAACGATGT",
},
{
name: "TRBV03",
locus: "TRB",
kind: @src.VGene,
sequence: "TTTACGGCCTTAAGGTGT",
},
]
let d : Array[@src.VdjGene] = [
{
name: "TRBD1",
locus: "TRB",
kind: @src.DGene,
sequence: "GCGCGATTATCAGGCA",
},
{
name: "TRBD2",
locus: "TRB",
kind: @src.DGene,
sequence: "TTATCGGATTAAGCCT",
},
]
let j : Array[@src.VdjGene] = [
{
name: "TRBJ01",
locus: "TRB",
kind: @src.JGene,
sequence: "TGGGGCCATTTGAAAGTGG",
},
{
name: "TRBJ02",
locus: "TRB",
kind: @src.JGene,
sequence: "TGGGGTTAAACCGTTAGG",
},
]
let db = @src.vdj_build_gene_db(v, d, j, k=6)
// 模拟一条样本的 read 集(含克隆型扩张)
let v1 = "AAAACTGGGGTTTACCTGT"
let v2 = "CCCCATCGGGGAACGATGT"
let v3 = "TTTACGGCCTTAAGGTGT"
let j1 = "TGGGGCCATTTGAAAGTGG"
let j2 = "TGGGGTTAAACCGTTAGG"
let reads : Array[(String, String)] = [
(v1 + "ACG" + j1, "read01"),
(v1 + "ACG" + j1, "read02"),
(v1 + "ACG" + j1, "read03"),
(v1 + "GCA" + j1, "read04"),
(v2 + "TTA" + j2, "read05"),
(v2 + "TTA" + j2, "read06"),
(v3 + "GCC" + j1, "read07"),
(v1 + "ACGT" + j1, "read08"),
]
println("\n1. V(D)J 指认 (8 条 read)")
let chains = @src.vdj_assign_all(reads, db)
for ch in chains {
println(
" " +
ch.sequence_id +
": " +
ch.v_call +
"/" +
ch.d_call +
"/" +
ch.j_call +
" CDR3=" +
ch.cdr3_aa +
" (" +
ch.cdr3_nt.length().to_string() +
"nt) productive=" +
ch.productive.to_string(),
)
}
println("\n2. 克隆型聚类 (top)")
let clonotypes = @src.vdj_clonotypes(chains)
for c in clonotypes {
println(
" #" +
c.clonotype_id.to_string() +
" " +
c.cdr3_aa +
" " +
c.v_family +
"/" +
c.j_family +
" count=" +
c.count.to_string() +
" freq=" +
(c.frequency * 100.0).to_string() +
"%",
)
}
println("\n3. 多样性指标")
let div = @src.vdj_diversity(chains)
println(" total chains: " + div.total_chains.to_string())
println(" total clonotypes: " + div.total_clonotypes.to_string())
println(" shannon: " + div.shannon.to_string())
println(" simpson: " + div.simpson.to_string())
println(" gini: " + div.gini.to_string())
println(" clonality: " + div.clonality.to_string())
println(" d50: " + div.d50.to_string())
println("\n4. AIRR TSV 输出")
let records = @src.airr_from_vdj_chains(chains, locus="TRB")
let tsv = @src.airr_write(records)
let lines = tsv.split("\n").to_array()
println(" [header] " + lines[0].to_owned())
for li = 1; li < lines.length() && li <= 4; li = li + 1 {
println(" [row] " + lines[li].to_owned())
}
// roundtrip 验证
let reparsed = @src.airr_parse(tsv)
println(" roundtrip: " + reparsed.length().to_string() + " records reparsed")
println("\n5. TCRdist-lite 克隆型间距离矩阵 (top 3)")
let top_aas : Array[String] = []
for i = 0; i < 3 && i < clonotypes.length(); i = i + 1 {
top_aas.push(clonotypes[i].cdr3_aa)
}
let matrix = @src.vdj_tcrdist_matrix(top_aas)
println(" " + top_aas.join(" "))
for i = 0; i < matrix.length(); i = i + 1 {
let cells : Array[String] = []
for x in matrix[i] {
cells.push(x.to_string())
}
println(" " + top_aas[i] + " " + cells.join(" "))
}
println(
"\n完成: 指认 -> 克隆型 -> 多样性 -> AIRR -> TCRdist 全链路本地完成.",
)
}