Spørgsmål:
Hvordan kan jeg fjerne (ikke-trivielle) dubletter fra en VCF-fil?
terdon
2019-02-27 21:56:46 UTC
view on stackexchange narkive permalink

Dette er relateret til det spørgsmål, jeg stillede her. Overvej en vcf-fil, der indeholder duplikatvarianter, men hvor duplikaterne ikke bare er de samme ting i samme notation, men i stedet er den ene en delmængde af den anden. For eksempel:

  ## fileformat = VCFv4.1 ## reference = foo ## FORMAT = <ID = GT, Number = 1, Type = String, Description = "Genotype" > ## contig = <ID = chr12> # CHROM POS ID REF ALT QUAL FILTER INFO FORMAT Prøve1chr12 529514. AACAC AATAC. PASS. GT 0 / 1chr12 529516. C T. PASS. GT 0/1  

Disse to varianter er faktisk de samme. De resulterer i nøjagtig den samme genotype. Ændring af AACAC til AATAC i position 529514 betyder bare at ændre C til T på position 529516.

Er der noget værktøj, der kan registrere sådanne duplikater og fjerne dem? Jeg prøvede vcfuniq fra vcflib , men det ser ikke ud til at genkende dette som en duplikat. Jeg tror, ​​det ser kun på de første 4 felter og betragter kun duplikater af disse varianter med nøjagtigt de samme værdier i de første 4 felter:

  $ ./bin/vcfuniq test.vcf ## fileformat = VCFv4.1 ## reference = foo ## FORMAT = <ID = GT, Number = 1, Type = String, Description = "Genotype" > ## contig = <ID = chr12> # CHROM POS ID REF ALT QUAL FILTER INFO FORMAT Sample1 Sample1 AACAC AATAC. PASS. GT 0 / 1chr12 529516. C T. PASS. GT 0/1  

Som forklaret i linket spørgsmål anser EBIs vcf_validator dette imidlertid for ugyldigt. Og det giver ikke rigtig mening at have disse duplikater under alle omstændigheder, så er der nogen måde, jeg kan registrere og fjerne dem på? Fortrinsvis et eksisterende værktøj, men jeg er også åben for script-løsninger.


Dette kompliceres yderligere af tilfælde som denne:

  ## fileformat = VCFv4 .1 ## reference = foo ## FORMAT = <ID = GT, Number = 1, Type = String, Description = "Genotype" >
## contig = <ID = chr12> # CHROM POS ID REF ALT QUAL FILTER INFO FORMAT Prøve1chr12 529514 529514 AACAC AAT, AATAC 0,00. . GT 0 / 1chr12 529516 529516 C T. PASS. GT 0/1  

Desværre bliver denne ikke fanget af tilgangen i Daniels smarte script:

  $ kat test2.vcf | foo.py ## fileformat = VCFv4.1 ## reference = foo ## FORMAT = <ID = GT, Number = 1, Type = String, Beskrivelse = "Genotype" > ## contig = <ID = chr12> # CHROM POS ID REF ALT KVALTFILTERINFO FORMAT Eksempel1chr12 529514 529514 AACAC AAT, AATAC 0,00. . GT 0 / 1chr12 529516 529516 C T. PASS. GT 0/1  
To svar:
terdon
2019-02-27 22:10:34 UTC
view on stackexchange narkive permalink

Det viser sig, at bcftools kan gøre dette (testet på bcftools-1.8), hvis du giver det referencegenomet til at teste mod:

  $ bcftools norm -d ingen -f hg19.fa test.vcf ## fileformat = VCFv4.1 ## FILTER = <ID = PASS, Beskrivelse = "Alle filtre bestået" > ## reference = foo ## FORMAT = <ID = GT, Number = 1 , Type = String, Beskrivelse = "Genotype" > ## contig = <ID = chr12> ## bcftools_normVersion = 1.8 + htslib-1.8 ## bcftools_normCommand = norm -d none -f hg19.fa test.vcf; Dato = Ons 27. feb 16:08:44 2019 # CHROM POS ID REF ALT KVAL FILTERINFO FORMAT Prøve1chr12 529516. C T. PASS. GT 0 / 1Linjer i alt / split / omstillet / sprunget over: 2/0/1/0  

For det mere komplekse tilfælde af multiallelisk variant i det andet VCF-eksempel fra spørgsmålet, du kan køre det gennem bcftools to gange. Når du bruger norm til venstrejustering og opdeling af multi-alleliske varianter, og derefter igen for at fjerne duplikaterne:

  $ bcftools norm -m -any -NO z - O v -o - ~ / test2.vcf | bcftools norm -d ingen -f hg19.faLines i alt / split / omstillet / sprunget over: 2/1/0/0 ## fileformat = VCFv4.1 ## FILTER = <ID = PASS, Beskrivelse = "Alle filtre bestået" > ## reference = foo ## FORMAT = <ID = GT, Number = 1, Type = String, Beskrivelse = "Genotype" > ## contig = <ID = chr12> ## bcftools_normVersion = 1.8 + htslib-1.8 ## bcftools_n -NO z-O v-o - test2.vcf; Dato = Ons 27 feb 18:18:32 2019 ## bcftools_normCommand = norm -d ingen -f hg19.fa -; Dato = Ons 27. februar 18:18:32 2019 # CHROM POS ID REF ALT KVAL FILTERINFO FORMAT Eksempel1chr12 529516 529514 CAC T 0. . GT 0 / 1chr12 529516 529514 C T 0. . GT 0/0 Linjer i alt / split / omstillet / sprunget over: 3/0/2/0  
Fantastisk information at have i baglommen. Dejlig løsning!
Ønske jeg kunne +1 dette igen.
Daniel Standage
2019-02-27 22:16:00 UTC
view on stackexchange narkive permalink

Jeg er ingen ekspert med VCF (få kan sige, at de er!), men jeg har arbejdet meget med VCF-data i de sidste par år, begge værktøjer til at forbruge og producere VCF. Jeg har aldrig set varianter kodet på denne måde, og det ser ud til at være ikke-kanonisk. Typisk:

  • Enkelt nukleotidvarianter (SNV'er) er kodet med en enkelt base som REF-allelen og en enkelt base som ALT-allelen.
  • I tilfælde af indsættelser eller sletninger, den kortere af REF- og ALT-allelerne er en enkelt base, hvor basen går forud for den indsatte / slettede sekvens. Således er den første base af REF- og ALT-allelerne altid den samme.
  • I det sjældnere tilfælde af to eller flere på hinanden følgende substitutioner, der danner en multinukleotidvariant (MNV), vil REF- og ALT-allelerne have samme længde.

Brug af multi-bp-strenge af samme længde til at kode SNV'er er unødvendig og, som du har påpeget, problematisk. Dette får mig til at tænke, det er en fejl eller en "funktion" af variantprædiktoren, der producerede VCF.

I dette tilfælde vil jeg skrive et lille script, der kontrollerer varianter, hvor REF og ALT alleler har samme længde. Hvis basen er den samme for REF og ALT i en hvilken som helst position, skal du slippe den og justere positionen i overensstemmelse hermed.

Skriptet nedenfor konverterer disse funky SNV'er til den kanoniske repræsentation og fungerer også på MNV'er. Standardværktøjer skal derefter arbejde for at fjerne dubletterne.

  #! / Usr / bin / env python3def kanonikaliser (instream): for linje i instream: hvis ikke line.startswith ('#'): værdier = line.split ('\ t') pos = int (værdier [1]) ref, alt = værdier [3: 5] hvis len (ref) > 1 og len ( ref) == len (alt): # Hvor mange bp der skal trimmes ud af slutningen for n, (r, a) i enumerate (zip (ref [:: - 1], alt [:: - 1])): hvis r! = a: revoffset = -1 * n break # Hvor mange bp for at trimme fronten
for n, (r, a) i enumerate (zip (ref, alt)): hvis r! = a: offset = n-værdier [1] = str (pos + offset) værdier [3] = ref [offset: revoffset] værdier [4] = alt [offset: revoffset] break line = '\ t'.join (værdier) giver lineif __name__ ==' __main__ ': import sys for line in canonicalize (sys.stdin): print (line, end = '')  

UPDATE : Efter yderligere refleksion giver det mere komplicerede eksempel, du har angivet, mening. I referencen har vi sekvensen AACAC , og de alternative alleler repræsenterer to variationer på dette: sletning af de sidste to bp (i det første tilfælde) og en punktmutation af den midterste C til T (i begge tilfælde). Normalt er kun en enkelt bp forud for definitionen af ​​en indel, så jeg ville have kodet denne komplekse variant som ref = ACAC alt = AT, ATAC .

Så SNV er "underforstået af" / "kodet i" / "overflødig med" den komplekse variant, men det er ikke strengt en duplikat. Jeg er nysgerrig efter, om VCF-validatoren også klager over disse sager?

Det er faktisk atypisk, men dette spørgsmål blev bedt om, fordi jeg faktisk stødte på dette i naturen. Jeg genererede ikke vcf, den blev sendt til mig, men overskriften antyder, at den blev produceret af 'freebayes' og fletning af to separate filer. Så dette var sandsynligvis en genstand for fusionen. Desværre har jeg brug for at håndtere VCF-filer, der er givet til mig af klienter, så selvom jeg kan insistere på, at de overholder standarderne, er dette [_does_ conform] (https://bioinformatics.stackexchange.com/q/7105/298 ) (AFAIK), så jeg havde brug for en måde at ordne det på.
Den var god! Desværre (og undskyld, jeg skulle have gjort dette klart), indeholder den faktiske fil, jeg havde, multi-alleliske varianter, hvor kun den ene var en dupe (se opdateret spørgsmål). Din tilgang fanger dem ikke, men bcftools gør det (se mit svar). Dette fungerer dog godt for singler.
Dude, det er noget knasende VCF.
Velkommen til min verden :(
Stadig en sej løsning @DanielStandage!


Denne spørgsmål og svar blev automatisk oversat fra det engelske sprog.Det originale indhold er tilgængeligt på stackexchange, som vi takker for den cc by-sa 4.0-licens, den distribueres under.
Loading...