Este es mi cuaderno para crear un motor personalizado en GATK.
Quiero leer un archivo VCF y obtener una tabla de categoría/recuento. Algo como esto:
TENER_ID | ESCRIBE | CONTAR |
---|---|---|
SÍ | SNP | 123 |
NO | SNP | 3 |
NO | INDEL | 13 |
creo una clase Categoría describiendo cada fila de la tabla. Es solo una lista de cadenas
static class Category
implements Comparable<Category>
{
private final List<String> labels ;
Category(final List<String> labels)
como iban a usar Categoría en una matriz asociativa / Mapa que necesitamos implementar hashCode
y equals
:
static class Category
implements Comparable<Category>
# El Caminante Principal:
El motor principal se llama CountPredictions extiende un RodWalker
. Por qué ? Realmente no sé, he copiado esto de otro motor. Vamos a hacer un mapa/reducir un ‘Mapa’ para que mi clase se declare como
public class CountPredictions
extends RodWalker< Map<CountPredictions.Category,Long>, Map<CountPredictions.Category,Long>>
# Documentando al Caminante
Se agrega una anotación ‘DocumentedGATKFeature’ para que GATKEngine pueda encontrar nuestro caminante
(...)
@DocumentedGATKFeature(
summary="Count Predictions",
groupName = HelpConstants.DOCS_CAT_VARMANIP,
extraDocs = )
public class CountPredictions extends RodWalker
(....)
La entrada es un archivo VCF:
@Input(fullName="variant", shortName = "V", doc="Input VCF file", required=true)
public RodBinding<VariantContext> variants;
La salida es un PrintStream (el valor predeterminado es stdout) donde escribiremos la tabla:
@Output(doc="File to which result should be written")
protected PrintStream out = System.out;
Los otros argumentos también se decoran con anotaciones de Java. Estos son los interruptores para agregar algunas columnas a la tabla final:
(...)
@Argument(fullName="chrom",shortName="chrom",required=false,doc="Group by Chromosome/Contig")
public boolean bychrom = false;
@Argument(fullName="ID",shortName="ID",required=false,doc="Group by having/not-having ID")
public boolean byID = false;
@Argument(fullName="variantType",shortName="variantType",required=false,doc="Group by VariantType")
(...)
este método se llama después de analizar los argumentos. Como queremos poder analizar la anotación VEP donde vamos a obtener el encabezado VCF y extraer los componentes del ANA atributo para obtener los índices de ‘Annotation_Impact’ y ‘Transcript_BioType’
@Override
public void initialize() bybiotype)
super.initialize();
según tengo entendido, ‘reduceInit()’ se usa para crear un primer elemento durante el proceso de mapa/reducción. Así que estamos creando un mapa asociativo vacío:
@Override
public Map<CountPredictions.Category,Long> reduceInit()
Este método reduce dos procesos de mapeo, por lo que estamos creando un mapa que combina ambos recuentos:
@Override
public Map<CountPredictions.Category,Long> reduce(Map<CountPredictions.Category,Long> value, Map<CountPredictions.Category,Long> sum)
Este es el caballo de batalla del motor. Por lo que puedo ver, se llama para cada variante. El método ‘tracker.getValues()’ devuelve una matriz de todas las variantes (aquí, solo una porque solo tenemos una entrada) en la posición actual. Al final del método, debemos devolver un recuento de Categoría para esas variantes…
@Override
public Map<CountPredictions.Category,Long> map(final RefMetaDataTracker tracker,final ReferenceContext ref, final AlignmentContext context)
para cada variante, se llena una nueva Categoría:
(...)
final List<String> labels=new ArrayList<>();
if(bychrom) labels.add(ctx.getContig());
if(byID) labels.add(ctx.hasID()?"Y":".");
(...)
final Category cat=new Category(labels);
Long n=count.get(cat);
count.put(cat, n==null?1L:n+1);
(...)
Cuando se llama a onTraversalDone, la tabla se imprime utilizando la clase GATKReport:
@Override
public void onTraversalDone(final Map<CountPredictions.Category,Long> counts)
el código fuente completo:
package mygatk;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import org.broadinstitute.gatk.engine.CommandLineGATK;
import org.broadinstitute.gatk.engine.GATKVCFUtils;
import org.broadinstitute.gatk.engine.walkers.RodWalker;
import org.broadinstitute.gatk.utils.commandline.Argument;
import org.broadinstitute.gatk.utils.commandline.Input;
import org.broadinstitute.gatk.utils.commandline.Output;
import org.broadinstitute.gatk.utils.commandline.RodBinding;
import org.broadinstitute.gatk.utils.contexts.AlignmentContext;
import org.broadinstitute.gatk.utils.contexts.ReferenceContext;
import org.broadinstitute.gatk.utils.help.DocumentedGATKFeature;
import org.broadinstitute.gatk.utils.help.HelpConstants;
import org.broadinstitute.gatk.utils.refdata.RefMetaDataTracker;
import org.broadinstitute.gatk.utils.report.GATKReport;
import org.broadinstitute.gatk.utils.report.GATKReportTable;
import htsjdk.variant.variantcontext.Genotype;
import htsjdk.variant.variantcontext.VariantContext;
import htsjdk.variant.vcf.VCFHeader;
import htsjdk.variant.vcf.VCFInfoHeaderLine;
/**
* Test Documentation
*/
@DocumentedGATKFeature(
summary="Count Predictions",
groupName = HelpConstants.DOCS_CAT_VARMANIP,
extraDocs = )
public class CountPredictions extends RodWalker<Map<CountPredictions.Category,Long>, Map<CountPredictions.Category,Long>> ]");
static class Category
implements Comparable<Category>
private int ann_impact_column=-1;/* eg: MODIFIER / LOW */
private int ann_transcript_biotype_column=-1;/* eg: transcript /intergenic_region */
@Override
public void initialize()
@Override
public Map<CountPredictions.Category,Long> map(final RefMetaDataTracker tracker,final ReferenceContext ref, final AlignmentContext context)
@Override
public Map<CountPredictions.Category,Long> reduce(Map<CountPredictions.Category,Long> value, Map<CountPredictions.Category,Long> sum)
@Override
public Map<CountPredictions.Category,Long> reduceInit()
@Override
public void onTraversalDone(final Map<CountPredictions.Category,Long> counts)
gatk.jar=/path/to/GenomeAnalysisTK.jar
VCF=input.vcf.gz
test: dist/mygatk.jar
java -cp $:dist/mygatk.jar
org.broadinstitute.gatk.engine.CommandLineGATK
-R /path/to/ref.fasta
-T CountPredictions -V $ -ID
dist/mygatk.jar : $ ./mygatk/CountPredictions.java
mkdir -p tmp dist
javac -d tmp -cp .:$ ./mygatk/CountPredictions.java
jar cfv [email protected] -C tmp .
rm -rf tmp
INFO 16:47:16,545 HelpFormatter - ----------------------------------------------------------------------------------
INFO 16:47:16,547 HelpFormatter - The Genome Analysis Toolkit (GATK) v3.6-0-g89b7209, Compiled 2016/06/01 22:27:29
INFO 16:47:16,547 HelpFormatter - Copyright (c) 2010-2016 The Broad Institute
INFO 16:47:16,547 HelpFormatter - For support and documentation go to https://www.broadinstitute.org/gatk
INFO 16:47:16,714 HelpFormatter - [Fri Jan 13 16:47:16 CET 2017] Executing on Linux 3.10.0-327.36.3.el7.x86_64 amd64
INFO 16:47:16,714 HelpFormatter - Java HotSpot(TM) 64-Bit Server VM 1.8.0_102-b14 JdkDeflater
INFO 16:47:16,717 HelpFormatter - Program Args: -R ref.fasta -T CountPredictions -V input.vcf.gz -ID
INFO 16:47:16,724 HelpFormatter - Date/Time: 2017/01/13 16:47:16
INFO 16:47:16,725 HelpFormatter - ----------------------------------------------------------------------------------
INFO 16:47:16,725 HelpFormatter - ----------------------------------------------------------------------------------
INFO 16:47:16,740 GenomeAnalysisEngine - Strictness is SILENT
INFO 16:47:16,829 GenomeAnalysisEngine - Downsampling Settings: Method: BY_SAMPLE, Target Coverage: 1000
WARN 16:47:16,881 IndexDictionaryUtils - Track variant doesn't have a sequence dictionary built in, skipping dictionary validation
INFO 16:47:16,936 GenomeAnalysisEngine - Preparing for traversal
INFO 16:47:16,940 GenomeAnalysisEngine - Done preparing for traversal
INFO 16:47:16,940 ProgressMeter - [INITIALIZATION COMPLETE; STARTING PROCESSING]
INFO 16:47:16,941 ProgressMeter - | processed | time | per 1M | | total | remaining
INFO 16:47:16,941 ProgressMeter - Location | sites | elapsed | sites | completed | runtime | runtime
INFO 16:47:46,946 ProgressMeter - chr22:26185095 167649.0 30.0 s 3.0 m 91.0% 32.0 s 2.0 s
#:GATKReport.v1.1:1
#:GATKTable:2:1:%s:%s:;
#:GATKTable:Variants:Variants input.vcf.gz
IN_DBSNP COUNT
. 139984
INFO 16:47:52,501 CountPredictions - TraversalDone
INFO 16:47:52,502 ProgressMeter - done 202931.0 35.0 s 2.9 m 91.1% 38.0 s 3.0 s
INFO 16:47:52,502 ProgressMeter - Total runtime 35.56 secs, 0.59 min, 0.01 hours
------------------------------------------------------------------------------------------
Done. There were 1 WARN messages, the first 1 are repeated below.
WARN 16:47:16,881 IndexDictionaryUtils - Track variant doesn't have a sequence dictionary built in, skipping dictionary validation
------------------------------------------------------------------------------------------