Vraag:
Is er een Python / R-pakket met de mogelijkheid om een ​​uitlijning en referentie om te zetten in een SIGAAR?
EB2127
2018-04-04 22:05:03 UTC
view on stackexchange narkive permalink

Ik schrijf een python-functie vanaf het begin om dit te doen, maar ik heb het gevoel dat deze al in een standaard bio-informatica-bibliotheek moet bestaan. In principe is dit een simpele regex-bewerking die velen eerder moeten hebben geschreven. Met het doel om een ​​gecentraliseerde referentie te hebben, in tegenstelling tot iedereen die zijn eigen scripts schrijft om dezelfde taak uit te voeren (wat tijdrovend en niet noodzakelijk reproduceerbaar is), is hier de functie "bouw een SIGAR":

Hier is een uitlijning:

ACGT-TGC

Hier is een referentie:

  ACGTATGC  

De referentie is vereist om indels op te nemen. Men zou in principe een reeks "queries" kunnen hebben, b.v. een R-vector of een Python-lijst.

Dit zou de volgende CIGAR genereren:

4=1D3=

Welke R-pakketten / python-bibliotheek bestaat om deze bewerking uit te voeren ? Ik vermoed dat er ook iets met Bioconductor te maken heeft.

Misschien [GenomicAlignments] (https://bioconductor.org/packages/release/bioc/html/GenomicAlignments.html)?
@zx8754 Heeft u een functie in gedachten?
@gringer Bedankt. Ik heb geprobeerd het bovenstaande te bewerken om dit duidelijker te maken.
Sorry, ik realiseer me dat mijn vorige verklaring niet klopte; slechts twee van de drie (query, referentie, overeenkomst) zijn nodig om een ​​CIGAR-string te maken, rekening houdend met het feit dat hiaten in de referentie moeten worden toegestaan. In elk geval zou het handig zijn om een ​​demonstratieve CIGAR-string te hebben die ten minste I, D, X, = bevat.
Twee antwoorden:
user172818
2018-04-05 19:50:04 UTC
view on stackexchange narkive permalink

Uw verzoek is eenvoudig te implementeren. Ik zou in dit geval geen bibliotheken gebruiken. Aangezien je je implementatie niet hebt laten zien, zal ik er een geven:

  def gen_cigar (ref, qry): if len (ref)! = Len (qry): verhoog Uitzondering ('ongelijke lengte') cigar = [] voor i binnen bereik (len (ref)): r, q = ref [i], qry [i]; if r is '-' en q is '-': verhoog Uitzondering ('beide gaten') op = '=' als r is q anders 'I' als r is '-' anders 'D' als q is '-' anders 'X'; if len (cigar) > 0 en cigar [-1] [1] is op: # voeg toe aan de laatste bewerking cigar [-1] [0] + = 1 else: cigar.append ([1, op]); # een nieuwe operatie retourneren "" .join (map (lambda x: str (x [0]) + x [1], cigar)); # turn to stringprint (gen_cigar ('ACGTAT-CT', 'ACGT-TGGA'));  

De uitvoer is:

  4 = 1D1 = 1I2X  

PS: Het is interessant dat je problemen vaak vanuit een andere hoek benadert. De oplossingen waarvan je denkt dat ze 'moeten bestaan' bestaan ​​eigenlijk zelden, want dat zijn niet de manieren waarop we (ik tenminste) met data werken. Daarom geef ik er de voorkeur aan dat een vragensteller het grotere geheel uitlegt, naast de geïsoleerde tussenliggende problemen - er zouden eenvoudigere en eenvoudigere oplossingen kunnen zijn zonder dat de bedachte problemen moeten worden opgelost.

Hallo Heng Li, bedankt voor de hulp. Ik heb hieronder mijn eigen antwoord gedeeld. Je hebt gelijk dat dit geen moeilijke functie is om te schrijven; mijn motivatie was grotendeels om dit soort taken te standaardiseren. (bijv. blijkbaar is er een standaard MATLAB-functie voor het bovenstaande, `align2cigar`). Hoe dan ook, RE: PS ... bedankt voor het compliment! .... denk ik ....
Jouw gebruik van `is` in plaats van` == `geeft me de heebie-jeebies. Het is absoluut niet gegarandeerd dat dit zal lukken. Je hebt geluk gehad door string-internering (dat gezegd hebbende, ik heb het getest op CPython 2.6.9, 2.7.14, 3.6.4 en Pypy 5.10.0 en het werkt overal). Maar pylint klaagt terecht, en [het wordt sterk aanbevolen om hier niet op te vertrouwen voor correctheid] (https://stackoverflow.com/a/19899966/1968). ** Als ** je echt `is` wilt gebruiken voor efficiëntie, moet je de strings vooraf expliciet interneren.
EB2127
2018-04-10 00:24:04 UTC
view on stackexchange narkive permalink

Dit is wat ik zou doen in Python. Er zijn een paar extra controles die ik heb toegevoegd, en mijn definities van een paar gevallen zijn anders dan die van Heng Li hierboven, @ user172818. De uitvoering is redelijk vergelijkbaar.

  def create_cigar (reference, alignment): '' 'Construeer CIGAR van referentie en uitlijning' '' ## als referentie en uitlijning ongelijke lengtes hebben, stop dan als len (referentie)! = len ( alignment): raise Exception ('Error: reference and alignment are of unequal length') ## vervang '-' en '*' naar '_' reference = reference.translate (bytes.maketrans (b "* -", b "__")) alignment = alignment.translate (bytes.maketrans (b "* -", b "__")) ### maakt een string met een CIGAR-symbool voor elke positie met zip () vergelijk_strings = '' .join ( ['=', 'X'] [ref == '_'] if ref == algn else 'X' if ref! = '_' En algn! = '_' Else ['I', 'D'] [algn == '_' en ref! = '_'] voor ref, algn in zip (referentie, uitlijning)) ## nu, ontleed string in CIGAR-formaat; sneller dan itertools total_match = 0 # totaal aantal aangrenzende overeenkomsten current_base = vergelijk_strings [0] # huidig ​​teken wordt verwerkt resultaat = '' # resultaat van functie voor i binnen bereik (len (vergelijk_strings)): if vergelijk_strings [i] == huidige_reeks : total_match + = 1 else: result + = str (total_match) + current_base current_base = vergelijk_strings [i] total_match = 1 resultaat + = str (total_match) + current_base-resultaat  

In het voorbeeld :

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

welke uitvoert:

  4 = 1D1 = 1I2X  

(1) Ik standaard de ingangen, zodat hiaten - , _ , of * . (Gebruikers kunnen hun eigen toevoegen.)

(2) Er zijn geen N , overgeslagen regio's, hoewel ik op basis van de use case kon zien dat gebruikers dit schrijven, bijv. een schrapping> = grootte een aantal zou kunnen werken.

(3) Harde en zachte vulling hebben in deze context geen zin. Deze worden geclassificeerd als X .

(4) Volgens mijn definitie hierboven, als er een gat is in de referentie en de uitlijning, is dit een opvulling P .



Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...