Ana içeriğe geç

Bölüm 4: Hello Modules

Yapay Zeka Destekli Çeviri - daha fazla bilgi ve iyileştirme önerileri

Bu bölüm, pipeline'ınızın geliştirilmesini ve bakımını daha verimli ve sürdürülebilir hale getirmek için iş akışı kodunuzu nasıl organize edeceğinizi kapsar. Özellikle, modülleri nasıl kullanacağınızı göstereceğiz.

Nextflow'da bir modül, bağımsız bir kod dosyasında kendi başına kapsüllenmiş tek bir süreç tanımıdır. Bir iş akışında bir modül kullanmak için, iş akışı kod dosyanıza tek satırlık bir import ifadesi eklemeniz yeterlidir; ardından süreci normalde yaptığınız gibi iş akışına entegre edebilirsiniz. Bu, kodun birden fazla kopyasını üretmeden süreç tanımlarını birden fazla iş akışında yeniden kullanmayı mümkün kılar.

İş akışımızı geliştirmeye başladığımızda, her şeyi tek bir kod dosyasına yazdık. Şimdi süreçleri bireysel modüllere taşıyacağız.

hello-modules.nfsayHello.nfconvertToUpper.nfcollectGreetings.nfincludemodules/sayHelloconvertToUppercollectGreetings

Bu, kodumuzu daha paylaşılabilir, esnek ve bakımı kolay hale getirecek.

Bu bölümden nasıl başlanır

Bu kursun bu bölümü, Hello Nextflow kursunun 1-3. Bölümlerini tamamladığınızı varsayar, ancak o bölümlerde ele alınan temel konulara hakimseniz, özel bir şey yapmadan buradan başlayabilirsiniz.


0. Isınma: hello-modules.nf dosyasını çalıştırın

Başlangıç noktası olarak hello-modules.nf iş akışı betiğini kullanacağız. Bu betik, bu eğitim kursunun 3. Bölümünde üretilen betiğe eşdeğerdir; ancak çıktı hedeflerini değiştirdik:

hello-modules.nf
output {
    first_output {
        path 'hello_modules'
        mode 'copy'
    }
    uppercased {
        path 'hello_modules'
        mode 'copy'
    }
    collected {
        path 'hello_modules'
        mode 'copy'
    }
    batch_report {
        path 'hello_modules'
        mode 'copy'
    }
}

Her şeyin çalıştığından emin olmak için, herhangi bir değişiklik yapmadan önce betiği bir kez çalıştırın:

nextflow run hello-modules.nf
Komut çıktısı
 N E X T F L O W   ~  version 25.10.2

Launching `hello-modules.nf` [hopeful_avogadro] DSL2 - revision: b09af1237d

executor >  local (7)
[0f/8795c9] sayHello (3)       [100%] 3 of 3 ✔
[6a/eb2510] convertToUpper (3) [100%] 3 of 3 ✔
[af/479117] collectGreetings   [100%] 1 of 1 ✔

Daha önce olduğu gibi, çıktı dosyalarını output bloğunda belirtilen dizinde bulacaksınız (burada, results/hello_modules/).

Dizin içerikleri
results/hello_modules/
├── Bonjour-output.txt
├── COLLECTED-batch-output.txt
├── Hello-output.txt
├── Holà-output.txt
├── batch-report.txt
├── UPPER-Bonjour-output.txt
├── UPPER-Hello-output.txt
└── UPPER-Holà-output.txt

Bu sizin için çalıştıysa, iş akışı kodunuzu modülerleştirmeyi öğrenmeye hazırsınız.


1. Modülleri depolamak için bir dizin oluşturun

Modüllerinizi belirli bir dizinde saklamak en iyi pratiktir. Bu dizine istediğiniz adı verebilirsiniz, ancak konvansiyon modules/ olarak adlandırmaktır.

mkdir modules

İpucu

Burada size yerel modülleri nasıl kullanacağınızı gösteriyoruz, yani uzak modüllerin aksine iş akışı kodunun geri kalanıyla aynı depoda yerel olarak depolanan modüller; uzak modüller diğer (uzak) depolarda saklanır. Uzak modüller hakkında daha fazla bilgi için dokümantasyona bakın.


2. sayHello() için bir modül oluşturun

En basit haliyle, mevcut bir süreci modüle dönüştürmek bir kopyala-yapıştır işleminden biraz fazlasıdır. Modül için bir dosya taslağı oluşturacağız, ilgili kodu kopyalayacağız ve ardından ana iş akışı dosyasından sileceğiz.

Sonra tek yapmamız gereken, Nextflow'un çalışma zamanında ilgili kodu çekmesini bilmesi için bir import ifadesi eklemek.

2.1. Yeni modül için bir dosya taslağı oluşturun

sayHello.nf adlı modül için boş bir dosya oluşturalım.

touch modules/sayHello.nf

Bu bize süreç kodunu koyacağımız bir yer verir.

2.2. sayHello süreç kodunu modül dosyasına taşıyın

Tüm süreç tanımını iş akışı dosyasından modül dosyasına kopyalayın, #!/usr/bin/env nextflow shebang'ını da kopyaladığınızdan emin olun.

modules/sayHello.nf
#!/usr/bin/env nextflow

/*
 * 'Hello World!' ifadesini bir dosyaya yazdırmak için echo kullan
 */
process sayHello {

    input:
    val greeting

    output:
    path "${greeting}-output.txt"

    script:
    """
    echo '${greeting}' > '${greeting}-output.txt'
    """
}

Bu yapıldıktan sonra, süreç tanımını iş akışı dosyasından silin, ancak shebang'ı yerinde bıraktığınızdan emin olun.

2.3. İş akışı bloğundan önce bir import tanımı ekleyin

Yerel bir modülü içe aktarma sözdizimi oldukça basittir:

Sözdizimi: Import tanımı
include { <MODÜL_ADI> } from '<modül_yolu>'

Bunu params bloğunun üstüne ekleyelim ve uygun şekilde dolduralım.

hello-modules.nf
// Modülleri dahil et
include { sayHello } from './modules/sayHello.nf'

/*
* Pipeline parametreleri
*/
params {
    greeting: Path = 'data/greetings.csv'
    batch: String = 'batch'
}
hello-modules.nf
/*
* Pipeline parametreleri
*/
params {
    greeting: Path = 'data/greetings.csv'
    batch: String = 'batch'
}

Modül adını, sayHello, ve modül kodunu içeren dosyanın yolunu, ./modules/sayHello.nf, doldurduğumuzu görüyorsunuz.

2.4. İş akışını çalıştırın

İş akışını temelde daha önce olduğu gibi aynı kod ve girdilerle çalıştırıyoruz, bu yüzden -resume bayrağıyla çalıştıralım ve ne olduğunu görelim.

nextflow run hello-modules.nf -resume
Komut çıktısı
N E X T F L O W   ~  version 25.10.2

Launching `hello-modules.nf` [romantic_poisson] DSL2 - revision: 96edfa9ad3

[f6/cc0107] sayHello (1)       | 3 of 3, cached: 3 ✔
[3c/4058ba] convertToUpper (2) | 3 of 3, cached: 3 ✔
[1a/bc5901] collectGreetings   | 1 of 1, cached: 1 ✔

Her şey önbelleklendiği için bu çok hızlı çalışmalıdır. Yayınlanan çıktıları kontrol etmekten çekinmeyin.

Nextflow, kod birden fazla dosyaya bölünmüş olsa bile yapılması gereken işin hâlâ aynı olduğunu fark etti.

Özet

Bir süreci yerel bir modüle nasıl çıkaracağınızı biliyorsunuz ve bunun iş akışının devam ettirilebilirliğini bozmadığını biliyorsunuz.

Sırada ne var?

Daha fazla modül yapmayı pratik edin. Bir tane yaptıktan sonra, bir milyon tane daha yapabilirsiniz... Ama şimdilik sadece iki tane daha yapalım.


3. convertToUpper() sürecini modülerleştirin

3.1. Yeni modül için bir dosya taslağı oluşturun

convertToUpper.nf adlı modül için boş bir dosya oluşturun.

touch modules/convertToUpper.nf

3.2. convertToUpper süreç kodunu modül dosyasına taşıyın

Tüm süreç tanımını iş akışı dosyasından modül dosyasına kopyalayın, #!/usr/bin/env nextflow shebang'ını da kopyaladığınızdan emin olun.

modules/convertToUpper.nf
#!/usr/bin/env nextflow

/*
 * Selamlamayı büyük harfe dönüştürmek için bir metin değiştirme aracı kullan
 */
process convertToUpper {

    input:
    path input_file

    output:
    path "UPPER-${input_file}"

    script:
    """
    cat '${input_file}' | tr '[a-z]' '[A-Z]' > 'UPPER-${input_file}'
    """
}

Bu yapıldıktan sonra, süreç tanımını iş akışı dosyasından silin, ancak shebang'ı yerinde bıraktığınızdan emin olun.

3.3. params bloğundan önce bir import tanımı ekleyin

Import tanımını params bloğunun üstüne ekleyin ve uygun şekilde doldurun.

hello-modules.nf
// Modülleri dahil et
include { sayHello } from './modules/sayHello.nf'
include { convertToUpper } from './modules/convertToUpper.nf'

/*
* Pipeline parametreleri
*/
params {
    greeting: Path = 'data/greetings.csv'
    batch: String = 'batch'
}
hello-modules.nf
// Modülleri dahil et
include { sayHello } from './modules/sayHello.nf'

/*
* Pipeline parametreleri
*/
params {
    greeting: Path = 'data/greetings.csv'
    batch: String = 'batch'
}

Bu çok tanıdık görünmeye başlamalı.

3.4. İş akışını tekrar çalıştırın

Bunu -resume bayrağıyla çalıştırın.

nextflow run hello-modules.nf -resume
Komut çıktısı
N E X T F L O W   ~  version 25.10.2

Launching `hello-modules.nf` [nauseous_heisenberg] DSL2 - revision: a04a9f2da0

[c9/763d42] sayHello (3)       | 3 of 3, cached: 3 ✔
[60/bc6831] convertToUpper (3) | 3 of 3, cached: 3 ✔
[1a/bc5901] collectGreetings   | 1 of 1, cached: 1 ✔

Bu hâlâ daha önce olduğu gibi aynı çıktıyı üretmelidir.

İkisi tamam, bir tane daha kaldı!


4. collectGreetings() sürecini modülerleştirin

4.1. Yeni modül için bir dosya taslağı oluşturun

collectGreetings.nf adlı modül için boş bir dosya oluşturun.

touch modules/collectGreetings.nf

4.2. collectGreetings süreç kodunu modül dosyasına taşıyın

Tüm süreç tanımını iş akışı dosyasından modül dosyasına kopyalayın, #!/usr/bin/env nextflow shebang'ını da kopyaladığınızdan emin olun.

modules/collectGreetings.nf
#!/usr/bin/env nextflow

/*
 * Büyük harfli selamlamaları tek bir çıktı dosyasında topla
 */
process collectGreetings {

    input:
    path input_files
    val batch_name

    output:
    path "COLLECTED-${batch_name}-output.txt", emit: outfile
    path "${batch_name}-report.txt", emit: report

    script:
    count_greetings = input_files.size()
    """
    cat ${input_files} > 'COLLECTED-${batch_name}-output.txt'
    echo 'Bu grupta ${count_greetings} selamlama vardı.' > '${batch_name}-report.txt'
    """
}

Bu yapıldıktan sonra, süreç tanımını iş akışı dosyasından silin, ancak shebang'ı yerinde bıraktığınızdan emin olun.

4.3. params bloğundan önce bir import tanımı ekleyin

Import tanımını params bloğunun üstüne ekleyin ve uygun şekilde doldurun.

hello-modules.nf
// Modülleri dahil et
include { sayHello } from './modules/sayHello.nf'
include { convertToUpper } from './modules/convertToUpper.nf'
include { collectGreetings } from './modules/collectGreetings.nf'

/*
* Pipeline parametreleri
*/
params {
    greeting: Path = 'data/greetings.csv'
    batch: String = 'batch'
}
hello-modules.nf
// Modülleri dahil et
include { sayHello } from './modules/sayHello.nf'
include { convertToUpper } from './modules/convertToUpper.nf'

/*
* Pipeline parametreleri
*/
params {
    greeting: Path = 'data/greetings.csv'
    batch: String = 'batch'
}

Sonuncusu!

4.4. İş akışını çalıştırın

Bunu -resume bayrağıyla çalıştırın.

nextflow run hello-modules.nf -resume
Komut çıktısı
N E X T F L O W   ~  version 25.10.2

Launching `hello-modules.nf` [friendly_coulomb] DSL2 - revision: 7aa2b9bc0f

[f6/cc0107] sayHello (1)       | 3 of 3, cached: 3 ✔
[3c/4058ba] convertToUpper (2) | 3 of 3, cached: 3 ✔
[1a/bc5901] collectGreetings   | 1 of 1, cached: 1 ✔

Bu hâlâ daha önce olduğu gibi aynı çıktıyı üretmelidir.

Özet

Bir iş akışında birden fazla süreci nasıl modülerleştireceğinizi biliyorsunuz.

Tebrikler, tüm bu işi yaptınız ve pipeline'ın çalışma şeklinde kesinlikle hiçbir şey değişmedi!

Şakayı bir kenara bırakırsak, artık kodunuz daha modüler ve bu süreçlerden birini çağıran başka bir pipeline yazmaya karar verirseniz, ilgili modülü kullanmak için yalnızca bir kısa import ifadesi yazmanız gerekiyor. Bu, kodu kopyala-yapıştır yapmaktan daha iyi çünkü daha sonra modülü geliştirmeye karar verirseniz, tüm pipeline'larınız bu iyileştirmeleri miras alacak.

Sırada ne var?

İsterseniz kısa bir mola verin.

Hazır olduğunuzda, yazılım bağımlılıklarını daha kullanışlı ve tekrarlanabilir bir şekilde yönetmek için konteynerleri nasıl kullanacağınızı öğrenmek için Bölüm 5: Merhaba Konteynerler'e geçin.


Quiz

#

Nextflow'da modül nedir?

#

Modül dosyaları için önerilen adlandırma kuralı nedir?

#

Modül dosyaları nerede saklanmalıdır?

#

Bir modülü içe aktarmak için doğru sözdizimi nedir?

#

Modüller kullanıldığında -resume işlevselliğine ne olur?

#

Modül kullanmanın faydaları nelerdir? (Uygulanabilen tümünü seçin)