gatk-3.8/archive/java/src/org/broadinstitute/sting/AlleleBalanceInspector.java

86 lines
3.2 KiB
Java
Executable File

package org.broadinstitute.sting.playground.gatk.walkers.diagnostics;
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.refdata.RodGenotypeChipAsGFF;
import org.broadinstitute.sting.gatk.walkers.LocusWalker;
import org.broadinstitute.sting.utils.BaseUtils;
/**
* Takes a BAM file and a Hapmap-chip file (via the -hc argument) and creates a table of reference allele
* percentage and alternate allele percentage for het, homvar, and other genotypes.
*/
public class AlleleBalanceInspector extends LocusWalker<Integer, Integer> {
private int item = 1;
public void initialize() {
out.printf("item\tlocus\tref\tgenotype\tstate\tdepth\trefdepth\taltdepth\trefpct\taltpct%n");
}
public boolean filter(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) {
RodGenotypeChipAsGFF hc = tracker.lookup("child",RodGenotypeChipAsGFF.class);
return hc != null && hc.getCalledGenotype().isVariant(ref.getBase());
}
public Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) {
RodGenotypeChipAsGFF hc = tracker.lookup("child",RodGenotypeChipAsGFF.class);
String state;
if (hc.getCalledGenotype().isHet()) {
state = "het";
} else if (hc.getCalledGenotype().isHom()) {
state = "homvar";
} else {
state = "other";
}
int refIndex = ref.getBaseIndex();
int altIndex = -1;
for (char base : hc.getCalledGenotype().getBases().toCharArray()) {
int baseIndex = BaseUtils.simpleBaseToBaseIndex(base);
if (baseIndex != refIndex) {
altIndex = baseIndex;
}
}
int[] baseCounts = context.getPileup().getBaseCounts();
double sum = (double) (baseCounts[refIndex] + baseCounts[altIndex]);
double refPct = ((double) baseCounts[refIndex])/sum;
double altPct = ((double) baseCounts[altIndex])/sum;
out.printf("%d\t%s\t%c\t%s\t%s\t%d\t%d\t%d\t%f\t%f%n",
item++,
context.getLocation(),
ref.getBase(),
hc.getCalledGenotype().getBases(),
state,
context.getPileup().getReads().size(),
baseCounts[refIndex],
baseCounts[altIndex], refPct, altPct);
return null;
}
/**
* Provide an initial value for reduce computations.
*
* @return Initial value of reduce.
*/
public Integer reduceInit() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
/**
* Reduces a single map with the accumulator provided as the ReduceType.
*
* @param value result of the map.
* @param sum accumulator for the reduce.
* @return accumulator with result of the map taken into account.
*/
public Integer reduce(Integer value, Integer sum) {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
}