HTML

Az élet kódjai

Csináld maga. Senki nem csinálja meg helyetted.

Friss topikok

Csővezeték fektetés

2016.06.13. 00:36 Travis.CG

Bioinformatikai munkafolyamatok (szaknyelven pipeline-ok) fejlesztésére a legegyszerűbb módszer még mindig a parancssori szkriptek írása. Az irányítás végig a kezünkben van, minden lépést aprólékosan felépíthetünk. Az adatok sokszínűsége viszont olyan potenciális hibaforrásokat hordozhat, ami a feldolgozást megakasztja.

Vegyük például a következő nagyon egyszerű munkafolyamatot:

bowtie-build reference.fasta refindex
bowtie -S refindex reads.fastq >out.sam
samtools view -b out.sam >out.bam

Már egy ilyen egyszerű folyamat is rengeteg hibát hordozhat. A teljesség igénye nélkül: a referencia fájl egy Word dokumentum, nincs írási jogunk az adott könyvtárra, a telepített samtools régi és kell neki a -S kapcsoló is. Ezek a hibák a folyamat különböző lépéseiben jelentkezhetnek és kijavításuk után mindent előről kell kezdeni, sőt mivel nincs hibakezelés, a hibás sort követő parancsok is megpróbálnak lefutni.

Profi Bash hekkerek persze képesek kitolni a határokat és ilyen szörnyetegeket hozhatnak létre:

if [ ! -f refindex.1.ebwt ]
then
bowtie-build reference.fasta refindex
fi
if [ ! -f out.sam ]
then
bowtie -S refindex reads.fastq >out.sam
fi
if [ ! -f out.bam ]
then
samtools view -b out.sam >out.bam
fi

De minden egyes lépést sok ugyan olyan sor vesz körbe, amit még a subrutinok használatával sem lehet csökkenteni. Arról nem is beszélve, hogy ez a szkript csak azt nézi, hogy bizonyos fájlok léteznek-e, azt nem, hogy a formátumuk helyes-e, illetve a program generalt-e hibát. Ha ezeket is beleépítenénk, igen áttekinthetetlen kódot kapnánk.

Makefile, a jobb megoldás

A fenti megoldásnál a make használata sokkal jobb. A make egy program, ami megkeresi az adott könyvtárban a Makefile nevű fájlt és végrehajtja azt. Eredetileg a C programok fordítására kezdték el fejleszteni, de mivel nagyon könnyű benne hierarchikus folyamatokat felépíteni, ezért elég sok helyen használják bioinformatikusok például prototípus folyamatok fejlesztésére. Az iRAP alapját is Makefileok tömeget képezi.

Az alapötlet, hogy amit már hibamentesen lefuttattunk, és létrejött belőle egy fájl, azt másodszor ne kelljen elindítani. Ezért a fenti példa esetén, ha az indexelés lefutott, akkor nincs szükség ezen időigényes lépés megismétlésére. A parancsok visszatérési értékét is ellenőrzi a program, hiba esetén nem megy tovább.

all: out.sam
   samtools view -b out.sam >out.bam
out.sam: refindex.4.ebwt
   bowtie -S refindex reads.fastq >out.sam
refindex.4.ebwt:
   bowtie-index reference.fasta refindex

A szkript úgy néz ki, mintha fordítva írtuk volna le a lépéseket, ami igaz is. Minden függőséget az adott lépés után kell definiálni. A szerkezet is egyszerű. Először az adott lépés azonosítóját adjuk meg, majd felsoroljuk, milyen más lépések szükségesek a cél eléréséhez. A trükk, hogy ha a lépés neve megegyezik egy fájl nevével, ami létezi, akkor azt a lépést már nem futtatja le a make. A definíció után egy tabulátorral kezdődően jönnek azok a sorok, amiket ténylegesen végre kell hajtani. Itt fontos megjegyezni, hogy tabulárot karakter helyett semmi más nem használható. Ha tehát olyan szövegszerkesztőt használunk, ami szóközzel helyettesíti a tabulátort, az eredmény használhatatlan lesz.

Természetesen ez sem tökéletes. Először is, csak egy szálon fut. Ha tehát egy lépésnek több függősége van, amelyek egymással párhuzamosan is futhatnak, ezt nem tudjuk definiálni. Ugyancsak tehetetlenek vagyunk azokkal a hibákkal szemben, amelyek futás közben lépnek fel. Képzeljük el például azt az esetet, hogy elfogy a tárhely a bowtie futása során. Hibával megszakad a futás, de egy csonka out.sam fájl már létrejött. Ezért ha némi tárhely felszabadítása után újra indítjuk a folyamatot, az illesztés nem fog ismét lefutni. Ez ellen lehet úgy védekezni, hogy a touch parancs segítségével hozzuk létre a fájlokat, amelyek összeköttetést jelentenek a lépések között, de ezzel megint csak azt érjük el, hogy bonyolítjuk a kódot. Kérdés, tudunk-e ennél jobbat?

bpipe, a tökéletes megoldás

Igen tudunk: bpipe. A bpipe az összes fenti problémára megoldást jelent. Szintaxisa egyszerű, figyeli a hibákat, többszálú. A Sangerben is ennek egy módosított verziója képezi a feldolgozó programok alapját. A fenti példa így néz ki:

index = {
   exec "bowtie-index reference.fasta refindex"
}
align = {
   exec "bowtie refindex reads.fastq >out.sam"
}
convert = {
   exec "samtools view -b out.sam >out.bam"
}
Bpipe.run {
   index + align + convert
}

Először minden lépést külön definiálunk. A lépések sorrendje nem kötött, mint a Makefile-ok esetén. Végül a Bpipe.run résznél megmondjuk, milyen sorrendben kell a lépéseket végrehajtani. Itt igen bonyolult összefüggéseket is definiálhatunk.

Szólj hozzá!

Címkék: bioinformatika

A bejegyzés trackback címe:

https://cybernetic.blog.hu/api/trackback/id/tr398278846

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása