///|
/// SystemPipeR module example - Pipeline orchestration for bioinformatics.
///
/// Run: moon run examples/system_piper_demo
fn main {
println("=== SystemPipeR Module Demo ===")
println("")
// Create a pipeline
println("=== Creating Pipeline ===")
let pipe = @bio.Pipeline::new("demo_pipeline", "Variant Calling Pipeline")
println("ID: \{pipe.get_id()}")
println("Name: \{pipe.get_name()}")
println("Steps: \{pipe.get_n_steps()}")
println("")
// Set description and params
let pipe2 = pipe
.set_description("Variant calling pipeline from aligned BAM files")
.set_param("reference", "GRCh38")
.set_param("species", "Homo sapiens")
.set_param("work_dir", "/data/workspace")
println("Description updated.")
println("Reference: \{pipe2.get_param("reference")}")
println("Species: \{pipe2.get_param("species")}")
println("")
// Build pipeline steps
println("=== Building Pipeline Steps ===")
// Step 1: Index reference
let step1 = @bio.PipelineStep::new("index", "Index Reference", "bwa")
.set_args(["index", "-a", "bwtsw", "ref.fa"])
.set_description("Build BWA index for reference genome")
.add_output("ref.fa.bwa")
let pipe3 = pipe2.add_step(step1)
println("Step 1 added: Index Reference")
// Step 2: Alignment
let step2 = @bio.PipelineStep::new("align", "Read Alignment", "bwa")
.set_args([
"mem", "-t", "8", "-R", "@RG\tID:test\tSM:sample", "ref.fa", "reads_R1.fq.gz",
"reads_R2.fq.gz",
])
.set_description("Align reads to reference using BWA-MEM")
.add_dependency("index")
.add_input("reads_R1.fq.gz")
.add_input("reads_R2.fq.gz")
.add_output("aligned.sam")
let pipe4 = pipe3.add_step(step2)
println("Step 2 added: Read Alignment (depends on index)")
// Step 3: Sort BAM
let step3 = @bio.PipelineStep::new("sort", "Sort & Index BAM", "samtools")
.set_args(["sort", "-@", "4", "-o", "sorted.bam", "aligned.sam"])
.set_description("Sort BAM file by coordinates")
.add_dependency("align")
.add_output("sorted.bam")
let pipe5 = pipe4.add_step(step3)
println("Step 3 added: Sort & Index BAM (depends on align)")
// Step 4: Mark duplicates
let step4 = @bio.PipelineStep::new("dedup", "Mark Duplicates", "picard")
.set_args([
"MarkDuplicates", "I=sorted.bam", "O=dedup.bam", "M=dup_metrics.txt",
])
.set_description("Mark PCR duplicates using Picard")
.add_dependency("sort")
.add_output("dedup.bam")
let pipe6 = pipe5.add_step(step4)
println("Step 4 added: Mark Duplicates (depends on sort)")
// Step 5: Variant calling
let step5 = @bio.PipelineStep::new("call", "Variant Calling", "bcftools")
.set_args([
"mpileup", "-f", "ref.fa", "dedup.bam", "|", "bcftools", "call", "-mv", "-o",
"variants.vcf",
])
.set_description("Call variants using bcftools")
.add_dependency("dedup")
.add_output("variants.vcf")
let pipe7 = pipe6.add_step(step5)
println("Step 5 added: Variant Calling (depends on dedup)")
// Step 6: Filtering
let step6 = @bio.PipelineStep::new("filter", "Variant Filtering", "bcftools")
.set_args([
"filter", "-e", "INFO/DP<10 | QUAL<30", "variants.vcf", "-o", "filtered.vcf",
])
.set_description("Filter variants by depth and quality")
.add_dependency("call")
.add_output("filtered.vcf")
let pipe8 = pipe7.add_step(step6)
println("Step 6 added: Variant Filtering (depends on call)")
println("")
// Pipeline progress
println("=== Pipeline Progress ===")
println("Steps: \{pipe8.get_n_steps()}")
println("Completed: \{pipe8.get_completed_count()}")
println("Failed: \{pipe8.get_failed_count()}")
println("Pending: \{pipe8.get_pending_count()}")
println("Progress: @{pipe8.get_progress()}%")
println("")
// Check if steps can run
println("=== Dependency Checking ===")
let all_steps = pipe8.get_steps()
let mut i = 0
while i < all_steps.length() {
let step = all_steps[i]
let can_run = pipe8.can_run_step(step)
println(" \{step.step_id}: can run = \{can_run}")
i = i + 1
}
println("")
// Pipeline configuration
println("=== Pipeline Configuration ===")
let config = @bio.PipelineConfig::new(
"/work/project", "/data/input", "/data/output",
).set_cores(16)
println("Work dir: \{config.get_work_dir()}")
println("Input dir: \{config.get_input_dir()}")
println("Output dir: \{config.get_output_dir()}")
println("Cores: \{config.get_cores()}")
println("")
// Pipeline summary
println("=== Pipeline Summary ===")
println(pipe8.summary())
// ASCII visualization
println("=== Pipeline Visualization ===")
println(pipe8.to_ascii())
// Sample pipeline
println("=== Sample RNA-Seq Pipeline ===")
let sample = @bio.pipeline_sample()
println(sample.summary())
println("=== Done ===")
}