Compararea eficienta a genomului coronavirusului 2019 cu alte cateva coronavirusuri din Swift. Acest proiect a fost selectat ca castigator al WWDC 2020 Swift Student Challenge!

Demo Youtube: aici.

Infiintat

Puteti rula acest proiect clonand acest depozit si deschizand locul de joaca Xcode WWDC2020.playground in Xcode 11.3.

Motivatie

Pandemia coronavirusului 2019 (SARS-CoV-2) este un eveniment major in acest nou deceniu. Exista milioane de cazuri la nivel mondial cauzate de aceasta boala coronavirus extrem de contagioasa (COVID-2019). Prin urmare, intelegerea acestui virus este foarte importanta. In acest proiect WWDC, compar coronavirusul din 2019 cu un cuplu de alti virusi similari, analizand genomii lor de ARN secventiat.

Prezentare generala

In primul rand, sa definim „virusul de baza” ca un esantion de coronavirus din 2019 de la o gazda umana din Illinois. Acest proiect ne permite sa vizualizam relatia dintre acest virus de baza si alte cateva esantioane care au fost secventiate de cercetatori. Aceste secvente au fost disponibile in format FASTA si au fost preluate din baza de date GenBank a Centrului National pentru Informatii despre Biotehnologie:

  • Illinois SARS-CoV-2 , gazda umana din Illinois in 2020 (virusul nostru de baza)
  • Wuhan SARS-CoV-2 , gazda umana de pe piata fructelor de mare din Wuhan in 2019
  • Human SARS-CoV , gazda umana din Toronto in 2003
  • Bat SARS-CoV , gazda de lilieci din China in 2015
  • Human CoV 229E , gazda umana din Seattle in 2015
  • Human MERS-CoV , gazda umana din Arabia Saudita in 2019
  • Camel MERS-CoV , gazda de camila din Emiratele Arabe Unite in 2014

Fisierele brute FASTA sunt disponibile in directorul WWDC2020.playground / Resources /.

Provocarea

Cu genomurile coronavirusului care ating o lungime de pana la aproape 30.000 de nucleotide, alinierea acestora va dura o perioada semnificativa de timp. Cu ajutorul algoritmului de baza de editare a programarii dinamice pentru a gasi asemanarile si diferentele dintre doua genomi, aceasta necesita aproximativ 900 de milioane de operatii si stocarea a 900 de milioane de numere intr-o matrice (repetata de 6 ori pentru compararea a 6 genomi de virus diferiti!). Acest lucru este mult prea ineficient pentru o demonstratie de aproximativ 3 minute. O mare parte din acest proiect este dedicat pentru a impinge Swift la limita si pentru a calcula alinierile in timp real.

Algoritm

Distanta de editare sau „Distanta Levenshtein” intre doua secvente este numarul de goluri (uneori numite insertii sau stergeri) si nepotriviri intre aceste doua secvente. Operatiile de editare reale (lacune si nepotriviri) alcatuiesc alinierea celor doua secvente. Algoritmul de baza al distantei Levenstein pentru calcularea valorii distantei de editare este o recursiune simpla, care poate fi exprimata ca

dp [i] [j] = dp [i – 1] [j – 1], daca A [i – 1] == B [j – 1] max de {dp [i – 1] [j – 1] + 1, dp [i] [j – 1] + 1, dp [i – 1] [j] + 1}, altfel (A [i – 1]! = B [j – 1])

pentru doua siruri A si B de lungime n si m folosind un pseudocod ondulat manual. Trebuie acordata o atentie speciala primului rand / coloana. dp [n] [m] este distanta Levenshtein dintre A si B.

hentai en castellano videos caseros españa
sexogratis incesto retro
fiestas xxx falsos casting porno
porno amas de casa xxx prostitutas
mujeres follando gratis cine para adultos gratis
concursos nudistas porno peludas españolas
porno loco analxxx
pajas de madres asiatica forzada
videos pornos muy guarros tata_latina
porno india cerdas com gratis
maduras tocandose me follo a
tuporn laura marano nude
torbe videos completos peliculas x en castellano
maduras sex pillada follando
joven folla por dinero se folla a su cuñada
mi madre me folla chupame las tetas
porno friki gay se la chupa a hetero
follando con abuelas fontanero cachondo
pillada follando porno italiano incesto
incestos lesbicos trios x

Desigur, memoizarea poate fi utilizata (asa cum sugereaza si numele dp, programare dinamica) pentru a obtine o complexitate temporala de O (mn). Acest lucru nu este suficient de bun pentru ~ 30.000 nucleotide ale genomului coronavirusului. Prin urmare, multe trucuri interesante pentru implementarea acestui algoritm:

  • In loc sa ne ocupam de siruri brute, putem folosi o clasa de vectori de biti (o matrice de UInts, cu cateva bituri pentru obtinerea si setarea valorilor) pentru a incerca sa impachetam nucleotidele impreuna si sa economisim spatiu.

  • In loc sa construim matricea de programare dinamica nxm completa, putem folosi ultimele doua randuri pentru complexitatea spatiului liniar. In loc sa cream un rand nou de fiecare data, putem suprascrie in mod inteligent portiuni din ultimul rand al doilea, de indata ce nu mai sunt necesare pentru calculul viitor.

  • Pentru a afla secventa exacta a nepotrivirilor si golurilor pentru a obtine alinierea, putem salva operatia utilizata pentru a ajunge la fiecare celula matrice de programare dinamica folosind vectorul de biti (doar 4 operatii in total, deci 2 biti). Acest lucru necesita salvarea intregului tabel, astfel incat complexitatea spatiului de ansamblu este inca tehnic inca patratica. Cu toate acestea, vectorul de biti ar trebui sa economiseasca mult spatiu. Partea de urmarire ar trebui sa dureze liniar dupa calcularea distantei Levenshtein.

  • Desi gasim distanta dintre doua siruri, sa presupunem deocamdata ca stim ca distanta este marginita de o anumita valoare k. De asemenea, pentru simplitate, lungimea celor doua corzi este aceeasi. In aceste conditii, algoritmul trebuie sa calculeze celulele la cel mult k / 2 pasi distanta de diagonala principala a matricei de programare dinamica. Intuitia este ca este nevoie de k / 2 pasi pentru a se indeparta de diagonala principala si k / 2 pentru a reveni inainte de a ajunge la capetele corzilor. Prin urmare, complexitatea timpului si spatiului poate fi redusa la O (kn) folosind aceasta metoda. Sa numim portiunea fiecarui rand calculat o fereastra care aluneca mai departe spre dreapta dupa fiecare rand.

  • Intr-o lucrare, Ukkonen a demonstrat ca distanta calculata de Levenshtein in fiecare diagonala (paralela cu diagonala principala) nu este in scadere. Prin urmare, de indata ce o diagonala a trecut de k in numarul de editari, putem opri doar sa privim celulele mai tarziu in diagonala. Cu aceste cunostinte, putem micsora fereastra pe care o examinam de ambele parti pe masura ce examinam fiecare rand din matricea de programare dinamica. Fereastra poate fi, de asemenea, micsorata fara ca diagonalele sa depaseasca k, deoarece, in final, trebuie efectuate editari pentru a reveni la diagonala principala de la o alta diagonala. De asemenea, putem anula calculul imediat ce oricare dintre limitele ferestrei traverseaza diagonala principala. Acest lucru ar trebui sa conduca la o accelerare buna.

  • Pentru a afla valoarea lui k de utilizat, putem folosi cautarea exponentiala si continuam sa dublam k pana putem calcula distanta Levenshtein fara a ne opri devreme, deoarece au existat mai mult de k modificari. Limita superioara k cu distanta Hamming intre cele doua siruri, deoarece distanta Levenshtein dintre aceste siruri trebuie sa fie mai mica sau egala cu distanta Hamming (intuitie: mai multe tipuri de editari de utilizat, deci mai putine editari sunt necesare). In cel mai rau caz, am petrece de doua ori mai mult timp total (cred ca suma exponentilor) deoarece distanta Levenshtein trebuie calculata de mai multe ori. Dar daca k este mic, acest lucru ar trebui sa duca la o accelerare buna.

  • Putem folosi multithreading pentru a calcula mai multe distante / alinieri de editare in paralel. De indata ce o aliniere este calculata, interfata de utilizare este actualizata si poate fi selectata de utilizator. Pentru a se bloca pentru o perioada de timp pe masura ce aceste aliniere sunt calculate, sunt afisate cateva diapozitive care descriu pe scurt coronavirusul.

  • Pentru vizualizare, putem adopta ideea in grep si diff si sa aratam doar portiuni din genomii virusului care au modificari pentru a economisi spatiu.

Limitari

Pentru o analiza serioasa, va rugam sa utilizati un instrument bine stabilit ca BLAST. Acest proiect este doar o demonstratie a algoritmilor si o vizualizare a diferentelor dintre genomii coronavirusului.