gatk-3.8/java/src/org/broadinstitute/sting/oneoffprojects/walkers/AnnotationByAlleleFrequency...

213 lines
8.9 KiB
Java
Executable File

/*
* Copyright (c) 2010 The Broad Institute
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package org.broadinstitute.sting.oneoffprojects.walkers;
import org.broad.tribble.util.variantcontext.VariantContext;
import org.broadinstitute.sting.commandline.Argument;
import org.broadinstitute.sting.gatk.contexts.AlignmentContext;
import org.broadinstitute.sting.gatk.contexts.ReferenceContext;
import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker;
import org.broadinstitute.sting.gatk.walkers.RodWalker;
import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.AnnotationType;
import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.GenotypeAnnotation;
import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation;
import org.broadinstitute.sting.utils.GenomeLoc;
import org.broadinstitute.sting.utils.StingException;
import org.broadinstitute.sting.utils.classloader.PackageUtils;
import java.util.*;
public class AnnotationByAlleleFrequencyWalker extends RodWalker<Integer, Integer> {
/* Get selected annotations from a given VCF File. If these annotations match a site reference ROD, output the annotation value.
Usage example:
java -jar dist/GenomeAnalysisTK.jar -R reference.fasta \
-T AnnotationByAlleleFrequency \
-A QualByDepth \
-B eval,VCF,eval.vcf \
-B HapMap,VCF,ref.vcf
*/
/////////////////////////////
// Command Line Arguments
/////////////////////////////
@Argument(fullName="annotation", shortName="A", doc="One or more specific annotations to apply to variant calls", required=false)
protected String[] annotationsToUse = {};
@Argument(fullName="group", shortName="G", doc="One or more classes/groups of annotations to apply to variant calls", required=false)
protected String[] annotationClassesToUse = { };
private ArrayList<InfoFieldAnnotation> requestedInfoAnnotations;
private ArrayList<GenotypeAnnotation> requestedGenotypeAnnotations;
//---------------------------------------------------------------------------------------------------------------
//
// initialize
//
//---------------------------------------------------------------------------------------------------------------
public void initialize() {
// create a map for all annotation classes which implement our top-level interfaces
HashMap<String, Class> classMap = new HashMap<String, Class>();
for ( Class c : PackageUtils.getClassesImplementingInterface(InfoFieldAnnotation.class) )
classMap.put(c.getSimpleName(), c);
for ( Class c : PackageUtils.getClassesImplementingInterface(GenotypeAnnotation.class) )
classMap.put(c.getSimpleName(), c);
for ( Class c : PackageUtils.getInterfacesExtendingInterface(AnnotationType.class) )
classMap.put(c.getSimpleName(), c);
HashSet<Class> classes = new HashSet<Class>();
// get the classes from the provided groups (interfaces)
for ( String group : annotationClassesToUse ) {
Class interfaceClass = classMap.get(group);
if ( interfaceClass == null )
interfaceClass = classMap.get(group + "Annotation");
if ( interfaceClass == null )
throw new StingException("Class " + group + " is not found; please check that you have specified the class name correctly");
classes.addAll(PackageUtils.getClassesImplementingInterface(interfaceClass));
}
// get the specific classes provided
for ( String annotation : annotationsToUse ) {
Class annotationClass = classMap.get(annotation);
if ( annotationClass == null )
annotationClass = classMap.get(annotation + "Annotation");
if ( annotationClass == null )
throw new StingException("Class " + annotation + " is not found; please check that you have specified the class name correctly");
classes.add(annotationClass);
}
// get the instances
requestedInfoAnnotations = new ArrayList<InfoFieldAnnotation>();
requestedGenotypeAnnotations = new ArrayList<GenotypeAnnotation>();
for ( Class c : classes ) {
// note that technically an annotation can work on both the INFO and FORMAT fields
if ( InfoFieldAnnotation.class.isAssignableFrom(c) )
requestedInfoAnnotations.add((InfoFieldAnnotation)getInstance(c));
if ( GenotypeAnnotation.class.isAssignableFrom(c) )
requestedGenotypeAnnotations.add((GenotypeAnnotation)getInstance(c));
}
}
private static <T> ArrayList<T> getInstances(List<Class<? extends T>> classes) {
ArrayList<T> objects = new ArrayList<T>();
for ( Class c : classes )
objects.add((T)getInstance(c));
return objects;
}
private static <T> T getInstance(Class<T> c) {
try {
return c.newInstance();
} catch (InstantiationException e) {
throw new StingException(String.format("Cannot instantiate annotation class '%s': must be concrete class", c.getSimpleName()));
} catch (IllegalAccessException e) {
throw new StingException(String.format("Cannot instantiate annotation class '%s': must have no-arg constructor", c.getSimpleName()));
}
}
//---------------------------------------------------------------------------------------------------------------
//
// map
//
//---------------------------------------------------------------------------------------------------------------
public Integer map( RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context ) {
if( tracker != null ) {
EnumSet<VariantContext.Type> vc = EnumSet.of(VariantContext.Type.SNP);
GenomeLoc loc = context.getLocation();
VariantContext vc_eval;
VariantContext vc_ref;
try {
vc_eval = tracker.getVariantContext(ref,"eval", vc, loc, true);
vc_ref = tracker.getVariantContext(ref,"HapMap", vc, loc, true);
} catch (java.util.NoSuchElementException e) {
return 0;
}
if (vc_ref == null || vc_eval == null) {
return 0;
}
// Get Allele frequency for reference ROD
double af_ref = Double.valueOf(2*vc_ref.getHomVarCount()+vc_ref.getHetCount());
af_ref = af_ref / (vc_ref.getChromosomeCount());
System.out.format("AF_Ref: %5.4f ", af_ref);
// Get Allele frequency for eval ROD
double af_eval = Double.valueOf(2*vc_eval.getHomVarCount()+vc_eval.getHetCount());
af_eval = af_eval / (vc_eval.getChromosomeCount());
System.out.format("AF_Eval: %5.4f ", af_eval);
/*
String qq = vc_eval.getAttributeAsString("AF");
System.out.format("AF_EvalVCF: %s ", qq);
*/
//go through all the requested info annotationTypes
for ( InfoFieldAnnotation annotationType : requestedInfoAnnotations )
{
String key = annotationType.getKeyNames().get(0);
String value_str = vc_eval.getAttributeAsString(key);
System.out.format("%s: %s ", key, value_str);
}
System.out.println();
}
return 1; // This value isn't actually used for anything
}
//---------------------------------------------------------------------------------------------------------------
//
// reduce
//
//---------------------------------------------------------------------------------------------------------------
public Integer reduceInit() {
return 0; // Nothing to do here
}
public Integer reduce( Integer value, Integer sum ) {
return 0; // Nothing to do here
}
public void onTraversalDone( Integer sum ) {
}
}