Logo Universitas Teknokrat Indonesia

Dari Lokal ke Cloud: Panduan Praktis Membangun dan Menjalankan Pipeline Genomik Pertama Anda dengan WDL dan Cromwell

Kategori: Teknologi
Gambar untuk Dari Lokal ke Cloud: Panduan Praktis Membangun dan Menjalankan Pipeline Genomik Pertama Anda dengan WDL dan Cromwell

Bayangkan Anda baru saja menerima data sekuensing genom dari beberapa sampel. Tugas Anda jelas: melakukan perataan (alignment) pembacaan DNA terhadap genom referensi, menyortirnya, dan kemudian memanggil varian (variant calling). Secara tradisional, ini berarti menjalankan serangkaian perintah baris perintah (command-line) secara manual, satu per satu, sambil berharap Anda tidak membuat kesalahan ketik atau lupa urutan yang benar. Proses ini melelahkan dan rentan kesalahan, terutama ketika jumlah sampel bertambah.

baca Juga:Singkatan MGT Adalah: Arti dan Konteks Penggunaannya

Di sinilah WDL (Workflow Description Language) dan Cromwell masuk sebagai duo yang mengubah permainan. WDL memungkinkan Anda untuk mendefinisikan seluruh pipeline genomik Anda dalam satu file yang terstruktur, sementara Cromwell bertindak sebagai "mesin" yang membaca file tersebut dan menjalankan setiap langkahnya dengan benar. Yang lebih menakjubkan, pipeline yang sama yang Anda uji di laptop Anda dapat dijalankan pada ratusan sampel di cloud tanpa modifikasi.

Artikel ini bukan sekadar teori; ini adalah panduan praktis langkah demi langkah. Kami akan memandu Anda membangun pipeline genomik sederhana pertama Anda, dari menulis WDL hingga menjalankannya secara lokal dengan Cromwell, dan menunjukkan bagaimana fondasi ini membuka jalan untuk analisis skala besar di cloud.


Mengapa WDL? Meletakkan Fondasi Alur Kerja yang Kokoh

Sebelum kita mulai coding, mari kita ingat kembali mengapa kita memilih pendekatan ini. Menggunakan WDL untuk mendefinisikan alur kerja Anda memberikan tiga keuntungan utama yang tidak dapat ditawarkan oleh skrip Bash biasa:

  1. Reproducibility (Dapat Direproduksi): Dengan mendefinisikan versi software (melalui Docker) dan semua parameter secara eksplisit, Anda memastikan bahwa siapa pun, di mana pun, dapat menjalankan kembali analisis Anda dan mendapatkan hasil yang identik. Ini adalah pilar ilmu pengetahuan yang baik.
  2. Portability (Portabel): File WDL dan Cromwell tidak peduli apakah mereka berjalan di laptop Mac, server Linux, atau klaster Google Cloud. Logika alur kerja Anda terpisah dari infrastruktur komputasi, memberikan fleksibilitas tertinggi.
  3. Scalability (Dapat Diskalakan): Cromwell dirancang untuk menjalankan banyak alur kerja secara paralel. Alur kerja yang Anda tulis untuk satu sampel dapat dengan mudah diskalakan untuk ribuan sampel di lingkungan komputasi berkinerja tinggi (HPC) atau cloud.

Dengan fondasi ini, mari kita mulai membangun.


Membangun Pipeline Pertama Anda: Perataan dan Penyortiran Sederhana

Kita akan membuat pipeline dua langkah yang sangat umum dalam analisis genomik:

  1. Meratakan pembacaan FASTQ ke genom referensi menggunakan BWA-MEM.
  2. Menyortir file SAM yang dihasilkan dan mengubahnya menjadi format BAM menggunakan Samtools.

Langkah 1: Mendefinisikan task Pertama – Perataan (Alignment) dengan BWA

task adalah unit kerja terkecil dalam WDL. Buat file baru bernama align_and_sort.wdl dan ketik kode berikut:

Code snippet

task align_bwa {
  input {
    File fastq_read1
    File fastq_read2
    File ref_fasta
    File ref_index_amb
    File ref_index_ann
    File ref_index_bwt
    File ref_index_pac
    File ref_index_sa
  }

  command <<<
    bwa mem -t 4 ${ref_fasta} ${fastq_read1} ${fastq_read2} > output.sam
  >>>

  output {
    File out_sam = "output.sam"
  }

  runtime {
    docker: "biocontainers/bwa:v0.7.17_cv1"
    memory: "8 GB"
    cpu: 4
  }
}

Penjelasan:

  • input: Kita mendeklarasikan semua file yang dibutuhkan, termasuk sepasang FASTQ dan semua file indeks genom referensi yang dibutuhkan oleh BWA.
  • command <<< ... >>>: Ini adalah perintah yang akan dijalankan. Perhatikan bagaimana kita menggunakan ${...} untuk merujuk ke variabel input. Hasilnya dialihkan ke output.sam.
  • output: Kita memberitahu WDL file mana yang harus dianggap sebagai output dari task ini.
  • runtime: Di sini kita menentukan bahwa task ini harus dijalankan di dalam kontainer Docker yang berisi BWA v0.7.17, dan meminta sumber daya komputasi spesifik.

Langkah 2: Mendefinisikan task Kedua – Penyortiran (Sorting) dengan Samtools

Sekarang, tambahkan task kedua di bawah yang pertama dalam file align_and_sort.wdl yang sama.

Code snippet

task sort_samtools {
  input {
    File in_sam
  }

  command <<<
    samtools sort -@ 4 -o sorted.bam ${in_sam}
  >>>

  output {
    File out_bam = "sorted.bam"
  }

  runtime {
    docker: "biocontainers/samtools:v1.17_cv2"
    memory: "4 GB"
    cpu: 4
  }
}

Task ini jauh lebih sederhana. Ia hanya menerima satu file SAM sebagai input, menjalankan samtools sort, dan menghasilkan file sorted.bam sebagai output.

Langkah 3: Mengorkestrasi Alur Kerja dengan workflow

Sekarang kita akan merangkai kedua task ini. Di bagian bawah file align_and_sort.wdl, tambahkan blok workflow:

Code snippet

workflow align_and_sort_wf {
  input {
    File fq1
    File fq2
    File ref_fa
    File ref_amb
    File ref_ann
    File ref_bwt
    File ref_pac
    File ref_sa
  }

  call align_bwa {
    input:
      fastq_read1 = fq1,
      fastq_read2 = fq2,
      ref_fasta = ref_fa,
      ref_index_amb = ref_amb,
      ref_index_ann = ref_ann,
      ref_index_bwt = ref_bwt,
      ref_index_pac = ref_pac,
      ref_index_sa = ref_sa
  }

  call sort_samtools {
    input:
      in_sam = align_bwa.out_sam
  }
}

Penjelasan:

  • workflow ... { ... }: Ini mendefinisikan alur kerja kita.
  • input: Ini adalah input global untuk seluruh alur kerja.
  • call align_bwa { ... }: Kita memanggil task pertama. Perhatikan bagaimana kita memetakan input workflow (seperti fq1) ke input task (fastq_read1).
  • call sort_samtools { ... }: Di sinilah keajaibannya terjadi. Untuk input in_sam dari task ini, kita memasok output dari task sebelumnya: align_bwa.out_sam. Ini secara otomatis menciptakan dependensi, dan Cromwell akan tahu bahwa ia harus menunggu align_bwa selesai sebelum memulai sort_samtools.

Langkah 4: Mendefinisikan Input dalam File JSON

Praktik terbaik adalah memisahkan logika workflow dari data input spesifik. Buat file baru bernama inputs.json untuk menentukan lokasi file kita.

JSON

{
  "align_and_sort_wf.fq1": "path/to/your/read1.fastq.gz",
  "align_and_sort_wf.fq2": "path/to/your/read2.fastq.gz",
  "align_and_sort_wf.ref_fa": "path/to/your/reference.fasta",
  "align_and_sort_wf.ref_amb": "path/to/your/reference.fasta.amb",
  "align_and_sort_wf.ref_ann": "path/to/your/reference.fasta.ann",
  "align_and_sort_wf.ref_bwt": "path/to/your/reference.fasta.bwt",
  "align_and_sort_wf.ref_pac": "path/to/your/reference.fasta.pac",
  "align_and_sort_wf.ref_sa": "path/to/your/reference.fasta.sa"
}

Pastikan untuk mengganti path/to/your/... dengan lokasi file Anda yang sebenarnya.


Menjalankan Alur Kerja Anda: Cromwell di Panggung Utama

Sekarang kita siap untuk eksekusi.

  1. Persiapan: Pastikan Anda telah menginstal Java, Docker, dan mengunduh file cromwell-XX.jar dari repositori GitHub-nya.
  2. Eksekusi Lokal: Buka terminal Anda, navigasikan ke direktori tempat Anda menyimpan file .wdl dan .json, lalu jalankan perintah berikut:Bashjava -jar cromwell-86.jar run align_and_sort.wdl --inputs inputs.json

Cromwell akan mulai bekerja. Ia akan membaca file WDL Anda, mengunduh kontainer Docker yang diperlukan, dan menjalankan setiap task secara berurutan. Anda akan melihat log eksekusi di terminal Anda. Setelah selesai, Anda akan menemukan direktori cromwell-executions yang berisi output (file sorted.bam) dan log untuk setiap langkah.

baca Juga:Universitas Teknokrat Indonesia Gandeng IIUM Malaysia dalam International Collaborative Visiting Lecture 2025

Dari Lokal ke Cloud: Visi Skalabilitas

Bagian yang paling kuat adalah: file align_and_sort.wdl dan inputs.json yang baru saja Anda buat siap untuk cloud. Platform seperti Terra.bio atau Google Cloud Life Sciences dapat mengambil file-file yang sama persis ini dan menjalankannya pada skala masif.

Ketika Anda menjalankan alur kerja ini untuk 100 sampel di cloud, execution engine akan secara cerdas melihat bahwa setiap sampel dapat diproses secara independen. Ia akan secara otomatis "memutar" 100 mesin virtual, menjalankan pipeline Anda secara paralel pada setiap sampel, lalu mematikan mesin-mesin tersebut setelah selesai. Anda tidak perlu mengubah satu baris pun dari logika WDL Anda untuk mencapai tingkat paralelisme ini.

penulis:dafa Aditya.f