use of org.broadinstitute.hellbender.tools.exome.alleliccount.AllelicCountWithPhasePosteriorsCollection in project gatk-protected by broadinstitute.
the class CalculatePulldownPhasePosteriors method doWork.
@Override
public Object doWork() {
if (!new HDF5Library().load(null)) {
//Note: passing null means using the default temp dir.
throw new UserException.HardwareFeatureException("Cannot load the required HDF5 library. " + "HDF5 is currently supported on x86-64 architecture and Linux or OSX systems.");
}
//read counts, segments, and parameters from files
final AllelicCountCollection counts = new AllelicCountCollection(snpCountsFile);
final List<ACNVModeledSegment> segments = SegmentUtils.readACNVModeledSegmentFile(segmentsFile);
final AlleleFractionState state = reconstructState(segments, parametersFile);
//load allelic-bias panel of normals if provided
final AllelicPanelOfNormals allelicPoN = allelicPoNFile != null ? AllelicPanelOfNormals.read(allelicPoNFile) : AllelicPanelOfNormals.EMPTY_PON;
//calculate phase posteriors
final List<SimpleInterval> unmodeledSegments = segments.stream().map(ACNVModeledSegment::getInterval).collect(Collectors.toList());
final AllelicCountWithPhasePosteriorsCollection countsWithPhasePosteriors = calculatePhasePosteriors(counts, unmodeledSegments, state, allelicPoN);
//write phase posteriors to file with same verbosity as input file
countsWithPhasePosteriors.write(outputFile, counts.getVerbosity());
return "SUCCESS";
}
use of org.broadinstitute.hellbender.tools.exome.alleliccount.AllelicCountWithPhasePosteriorsCollection in project gatk-protected by broadinstitute.
the class CalculatePulldownPhasePosteriorsIntegrationTest method testCalculatePhasePosteriors.
/**
* Uses {@link AlleleFractionSimulatedData} to test recovery of phase indicators. Phase with highest posterior
* probability is compared to the true phase; we require that
* {@link CalculatePulldownPhasePosteriorsIntegrationTest#FRACTION_OF_INDICATORS_CORRECT_THRESHOLD} of the
* indicators are recovered correctly.
*/
@Test
public void testCalculatePhasePosteriors() {
final double averageHetsPerSegment = 100;
final int numSegments = 100;
final int averageDepth = 100;
final double biasMean = 1.1;
final double biasVariance = 0.01;
final double outlierProbability = 0.02;
final AlleleFractionSimulatedData simulatedData = new AlleleFractionSimulatedData(averageHetsPerSegment, numSegments, averageDepth, biasMean, biasVariance, outlierProbability);
final SegmentedGenome segmentedGenome = simulatedData.getSegmentedGenome();
final AlleleFractionState trueState = simulatedData.getTrueState();
final AlleleFractionSimulatedData.PhaseIndicators truePhases = simulatedData.getTruePhases();
final AllelicCountCollection counts = new AllelicCountCollection();
//note that chromosomes are in lexicographical order
segmentedGenome.getGenome().getSNPs().targets().stream().forEach(counts::add);
final AllelicCountWithPhasePosteriorsCollection countsWithPhasePosteriors = CalculatePulldownPhasePosteriors.calculatePhasePosteriors(counts, segmentedGenome.getSegments(), trueState, AllelicPanelOfNormals.EMPTY_PON);
int numIndicatorsCorrect = 0;
//order is ALT_MINOR, REF_MINOR, OUTLIER
final Iterator<AlleleFractionIndicator> phaseIterator = truePhases.iterator();
final Iterator<AllelicCountWithPhasePosteriors> countWithPhasePosteriorsIterator = countsWithPhasePosteriors.getCounts().iterator();
while (phaseIterator.hasNext() && countWithPhasePosteriorsIterator.hasNext()) {
final AlleleFractionIndicator truePhase = phaseIterator.next();
final AllelicCountWithPhasePosteriors countWithPhasePosteriors = countWithPhasePosteriorsIterator.next();
final List<Double> phaseProbabilities = Arrays.asList(countWithPhasePosteriors.getAltMinorProb(), countWithPhasePosteriors.getRefMinorProb(), countWithPhasePosteriors.getOutlierProb());
final int indexOfMaxProbPhase = phaseProbabilities.indexOf(Collections.max(phaseProbabilities));
final AlleleFractionIndicator maxProbPhase = AlleleFractionIndicator.values()[indexOfMaxProbPhase];
if (maxProbPhase.equals(truePhase)) {
numIndicatorsCorrect++;
}
}
final double fractionOfIndicatorsCorrect = (double) numIndicatorsCorrect / countsWithPhasePosteriors.getCounts().size();
Assert.assertTrue(fractionOfIndicatorsCorrect >= FRACTION_OF_INDICATORS_CORRECT_THRESHOLD);
}
use of org.broadinstitute.hellbender.tools.exome.alleliccount.AllelicCountWithPhasePosteriorsCollection in project gatk by broadinstitute.
the class CalculatePulldownPhasePosteriorsIntegrationTest method testRun.
private void testRun(final String[] arguments, final String outputFileName) {
runCommandLine(arguments);
//only check that file is created and can be read as an AllelicCountWithPhasePosteriorsCollection,
//do not check for correctness of results (which is tested by testCalculatePhasePosteriors)
final File outputFile = new File(outputFileName);
Assert.assertTrue(outputFile.isFile(), outputFile.getAbsolutePath() + " is not a file.");
Assert.assertTrue(outputFile.length() > 0);
try {
//check that file has:
// - at least two lines and all either start with "#" or contain at least one "\t"
// - at least two lines with tab (column names + 1 SNP)
final List<String> outputLines = FileUtils.readLines(outputFile);
Assert.assertTrue(outputLines.size() >= 2);
Assert.assertEquals(outputLines.stream().filter(l -> l.contains("\t") || l.startsWith("#")).count(), outputLines.size());
Assert.assertTrue(outputLines.stream().filter(l -> l.split("\t").length > 2 && !l.startsWith("#")).count() > 2, "File: " + outputFile + " does not seem to have at least one SNP and a header.");
final AllelicCountWithPhasePosteriorsCollection counts = new AllelicCountWithPhasePosteriorsCollection(outputFile);
} catch (final Exception e) {
Assert.fail("Could not create AllelicCountWithPhasePosteriorsCollection from file: " + outputFile, e);
}
}
use of org.broadinstitute.hellbender.tools.exome.alleliccount.AllelicCountWithPhasePosteriorsCollection in project gatk by broadinstitute.
the class CalculatePulldownPhasePosteriorsIntegrationTest method testCalculatePhasePosteriors.
/**
* Uses {@link AlleleFractionSimulatedData} to test recovery of phase indicators. Phase with highest posterior
* probability is compared to the true phase; we require that
* {@link CalculatePulldownPhasePosteriorsIntegrationTest#FRACTION_OF_INDICATORS_CORRECT_THRESHOLD} of the
* indicators are recovered correctly.
*/
@Test
public void testCalculatePhasePosteriors() {
final double averageHetsPerSegment = 100;
final int numSegments = 100;
final int averageDepth = 100;
final double biasMean = 1.1;
final double biasVariance = 0.01;
final double outlierProbability = 0.02;
final AlleleFractionSimulatedData simulatedData = new AlleleFractionSimulatedData(averageHetsPerSegment, numSegments, averageDepth, biasMean, biasVariance, outlierProbability);
final SegmentedGenome segmentedGenome = simulatedData.getSegmentedGenome();
final AlleleFractionState trueState = simulatedData.getTrueState();
final AlleleFractionSimulatedData.PhaseIndicators truePhases = simulatedData.getTruePhases();
final AllelicCountCollection counts = new AllelicCountCollection();
//note that chromosomes are in lexicographical order
segmentedGenome.getGenome().getSNPs().targets().stream().forEach(counts::add);
final AllelicCountWithPhasePosteriorsCollection countsWithPhasePosteriors = CalculatePulldownPhasePosteriors.calculatePhasePosteriors(counts, segmentedGenome.getSegments(), trueState, AllelicPanelOfNormals.EMPTY_PON);
int numIndicatorsCorrect = 0;
//order is ALT_MINOR, REF_MINOR, OUTLIER
final Iterator<AlleleFractionIndicator> phaseIterator = truePhases.iterator();
final Iterator<AllelicCountWithPhasePosteriors> countWithPhasePosteriorsIterator = countsWithPhasePosteriors.getCounts().iterator();
while (phaseIterator.hasNext() && countWithPhasePosteriorsIterator.hasNext()) {
final AlleleFractionIndicator truePhase = phaseIterator.next();
final AllelicCountWithPhasePosteriors countWithPhasePosteriors = countWithPhasePosteriorsIterator.next();
final List<Double> phaseProbabilities = Arrays.asList(countWithPhasePosteriors.getAltMinorProb(), countWithPhasePosteriors.getRefMinorProb(), countWithPhasePosteriors.getOutlierProb());
final int indexOfMaxProbPhase = phaseProbabilities.indexOf(Collections.max(phaseProbabilities));
final AlleleFractionIndicator maxProbPhase = AlleleFractionIndicator.values()[indexOfMaxProbPhase];
if (maxProbPhase.equals(truePhase)) {
numIndicatorsCorrect++;
}
}
final double fractionOfIndicatorsCorrect = (double) numIndicatorsCorrect / countsWithPhasePosteriors.getCounts().size();
Assert.assertTrue(fractionOfIndicatorsCorrect >= FRACTION_OF_INDICATORS_CORRECT_THRESHOLD);
}
use of org.broadinstitute.hellbender.tools.exome.alleliccount.AllelicCountWithPhasePosteriorsCollection in project gatk-protected by broadinstitute.
the class CalculatePulldownPhasePosteriors method calculatePhasePosteriors.
@VisibleForTesting
protected static AllelicCountWithPhasePosteriorsCollection calculatePhasePosteriors(final AllelicCountCollection counts, final List<SimpleInterval> segments, final AlleleFractionState state, final AllelicPanelOfNormals allelicPoN) {
final TargetCollection<SimpleInterval> segmentTargetCollection = new HashedListTargetCollection<>(segments);
final AllelicCountWithPhasePosteriorsCollection countsWithPhasePosteriors = new AllelicCountWithPhasePosteriorsCollection();
for (final AllelicCount count : counts.getCounts()) {
final int segmentIndex = segmentTargetCollection.index(count.getInterval());
if (segmentIndex < 0) {
throw new UserException.EmptyIntersection(String.format("The AllelicCount at %s is not located within one of the input segments.", count.getInterval()));
}
final AlleleFractionGlobalParameters parameters = state.globalParameters();
final double minorFraction = state.segmentMinorFraction(segmentIndex);
final double refMinorLogProb = AlleleFractionLikelihoods.hetLogLikelihood(parameters, minorFraction, count, AlleleFractionIndicator.REF_MINOR, allelicPoN);
final double altMinorLogProb = AlleleFractionLikelihoods.hetLogLikelihood(parameters, minorFraction, count, AlleleFractionIndicator.ALT_MINOR, allelicPoN);
final double outlierLogProb = AlleleFractionLikelihoods.hetLogLikelihood(parameters, minorFraction, count, AlleleFractionIndicator.OUTLIER, allelicPoN);
final AllelicCountWithPhasePosteriors countWithPhasePosteriors = new AllelicCountWithPhasePosteriors(count, refMinorLogProb, altMinorLogProb, outlierLogProb);
countsWithPhasePosteriors.add(countWithPhasePosteriors);
}
return countsWithPhasePosteriors;
}
Aggregations