Otázka:
Existuje balíček Python / R se schopností převést zarovnání a odkaz na CIGAR?
EB2127
2018-04-04 22:05:03 UTC
view on stackexchange narkive permalink

Abych toho dosáhl, píšu od začátku funkci pythonu, ale mám pocit, že to již musí existovat v nějaké standardní knihovně bioinformatiky. V zásadě se jedná o jednoduše regexovou operaci, kterou mnozí museli psát již dříve. S cílem mít centralizovanou referenci na rozdíl od toho, aby každý psal své vlastní skripty pro splnění stejného úkolu (což je časově náročné a nemusí být nutně reprodukovatelné), je zde funkce „construct a CIGAR“:

Zde je zarovnání:

ACGT-TGC

Zde je odkaz:

  ACGTATGC  

Pro záznam indelů bude vyžadován odkaz. V zásadě lze mít řadu „dotazů“, např. vektor R nebo seznam Pythonu.

Tím by se vygeneroval následující CIGAR:

4=1D3=

Které R balíčky / knihovna pythonu existuje pro provedení této operace ? Mám podezření, že něco souvisí také s Bioconductor.

Možná [GenomicAlignments] (https://bioconductor.org/packages/release/bioc/html/GenomicAlignments.html)?
@zx8754 Máte na mysli nějakou funkci?
@gringer Díky. Pokusil jsem se upravit výše uvedené, aby to bylo jasnější.
Omlouvám se, uvědomuji si, že moje předchozí prohlášení bylo špatné; k vytvoření řetězce CIGAR jsou zapotřebí pouze dva ze tří (dotaz, reference, shoda), přičemž je třeba mít na paměti, že by měly být povoleny mezery v odkazu. V každém případě by bylo užitečné mít demonstrativní řetězec CIGAR, který obsahoval alespoň I, D, X, =.
Dva odpovědi:
user172818
2018-04-05 19:50:04 UTC
view on stackexchange narkive permalink

Váš požadavek se snadno realizuje. V tomto případě bych nepoužíval žádné knihovny. Jelikož jste neukázali svoji implementaci, poskytnu jednu:

  def gen_cigar (ref, qry): if len (ref)! = Len (qry): zvýšit výjimku ('nestejnou délku') doutníku = [] pro i v rozsahu (len (ref)): r, q = ref [i], qry [i]; pokud r je '-' a q je '-': zvýšit Exception ('both gaps') op = '=' pokud r je q else 'I' pokud r je '-' else 'D' pokud q je '-' jinak 'X'; pokud len (doutník) > 0 a doutník [-1] [1] je op: # přidat k poslední operaci doutník [-1] [0] + = 1 else: cigar.append ([1, op]); # a new operation return "" .join (map (lambda x: str (x [0]) + x [1], cigar)); # turn to stringprint (gen_cigar ('ACGTAT-CT', 'ACGT-TGGA'));  

Výstup je:

  4 = 1D1 = 1I2X  

PS: Je zajímavé, že k problémům často přistupujete z jiného úhlu. Řešení, o kterých si myslíte, že „musí existovat“, skutečně existují jen zřídka, protože to nejsou způsoby, jak (alespoň já) pracujeme s daty. Proto dávám přednost tomu, aby kromě izolovaných přechodných problémů vysvětlil větší obrázek i žadatel - mohla by existovat jednodušší a přímější řešení, aniž by bylo nutné řešit vzniklé problémy.

Ahoj Heng Li, děkuji za pomoc. Níže jsem sdílel svou vlastní odpověď. Máte pravdu, že to není obtížné napsat; mou motivací bylo do značné míry standardizovat tyto druhy úkolů. (např. zřejmě existuje standardní funkce MATLAB pro výše uvedené, `align2cigar`). RE: PS ... každopádně díky za kompliment! .... myslím ....
Vaše použití `is` místo` == `mi dává heebie-jeebies. Není absolutně zaručeno, že to bude úspěšné. Měl jsi štěstí kvůli interringu řetězce (to znamená, že jsem to testoval na CPython 2.6.9, 2.7.14, 3.6.4 a Pypy 5.10.0 a funguje to všude). Pylint si ale správně stěžuje a [důrazně se na něj nespoléhejte na správnost] (https://stackoverflow.com/a/19899966/1968). ** Pokud ** opravdu chcete pro efektivitu použít `is`, předem prosím explicitně internujte řetězce.
EB2127
2018-04-10 00:24:04 UTC
view on stackexchange narkive permalink

Tady je to, co bych dělal v Pythonu. Existuje několik dalších kontrol, které jsem zahrnul, a moje definice několika případů se liší od výše uvedených Heng Li, @ user172818. Výkon je docela podobný.

  def create_cigar (reference, alignment): '' 'Zkonstruujte CIGAR z reference a alignmentu' '' ## pokud reference a alignment mají nestejnou délku, stop if len (reference)! = len ( alignment): raise Exception ('Error: reference and alignment are of nestable length') ## replace any '-' and '*' to '_' reference = reference.translate (bytes.maketrans (b "* -", b "__")) alignment = alignment.translate (bytes.maketrans (b "* -", b "__")) ### vytvoří řetězec se symbolem CIGAR pro každou pozici pomocí zip () compare_strings = '' .join ( ['=', 'X'] [ref == '_'] if ref == algn else 'X' if ref! = '_' And algn! = '_' Else ['I', 'D'] [algn == '_' and ref! = '_'] pro ref, algn v zipu (reference, zarovnání)) ## now, parse string into CIGAR format; rychlejší než itertools total_match = 0 # celkový počet sousedních zápasů current_base = compare_strings [0] # aktuální zpracovávaný znak result = '' # výsledek funkce pro i v rozsahu (len (compare_strings)): if compare_strings [i] == current_base : total_match + = 1 else: result + = str (total_match) + current_base current_base = compare_strings [i] total_match = 1 result + = str (total_match) + current_base návratový výsledek  

Podle příkladu :

  print (create_cigar ('ACGTAT-CT', 'ACGT-TGGA'))  

které výstupy:

  4 = 1D1 = 1I2X  

(1) Standardizuji vstupy, takže mezery mohou být buď - , _ , nebo * . (Uživatelé si mohou přidat své vlastní.)

(2) Neexistují žádné vynechané oblasti N , i když na základě případu použití jsem viděl uživatele, kteří to píší, např. vymazání> = velikost, některé číslo může fungovat.

(3) Tvrdé a měkké polstrování v tomto kontextu nedává smysl. Ty budou klasifikovány jako X .

(4) Podle mé definice výše, pokud existuje mezera v odkazu a zarovnání, jedná se o výplň P .



Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...