All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.broadinstitute.hellbender.tools.walkers.mutect.SubsettedLikelihoodMatrix Maven / Gradle / Ivy

The newest version!
package org.broadinstitute.hellbender.tools.walkers.mutect;


import htsjdk.samtools.util.Locatable;
import htsjdk.variant.variantcontext.Allele;
import it.unimi.dsi.fastutil.ints.Int2IntArrayMap;
import it.unimi.dsi.fastutil.ints.Int2IntMap;
import org.broadinstitute.hellbender.utils.IndexRange;
import org.broadinstitute.hellbender.utils.Utils;
import org.broadinstitute.hellbender.utils.genotyper.LikelihoodMatrix;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Fast wrapper for a LikelihoodMatrix that uses only a subset of alleles.  Useful for model comparison of different
 * allele subsets without having to copy the underlying likelihoods.
 * Created by davidben on 1/26/17.
 */
//TODO: consider making the constructor a static method that returns an anonymous class instance in AlleleSubsettingUtils
public class SubsettedLikelihoodMatrix implements LikelihoodMatrix {
    private final LikelihoodMatrix matrix;
    private final List alleles;
    private final Int2IntMap newToOldIndexMap;

    public SubsettedLikelihoodMatrix(final LikelihoodMatrix matrix, final List alleles) {
        this.matrix = Utils.nonNull(matrix);
        this.alleles = Utils.nonNull(alleles);
        final int[] newIndices = new IndexRange(0, alleles.size()).mapToInteger(n -> n);
        final int[] oldIndices = alleles.stream().mapToInt(matrix::indexOfAllele).toArray();
        Utils.validateArg(Arrays.stream(oldIndices).noneMatch(n -> n < 0), "All alleles must be found in likelihoods matrix");
        newToOldIndexMap = new Int2IntArrayMap(newIndices, oldIndices);
    }

    public static  SubsettedLikelihoodMatrix excludingAllele(final LikelihoodMatrix matrix, final Allele excludedAllele) {
        final List alleles = matrix.alleles().stream().filter(a -> !basesMatch(a,excludedAllele)).collect(Collectors.toList());
        Utils.validateArg(alleles.size() == matrix.numberOfAlleles() - 1, "More than one allele excluded.");
        return new SubsettedLikelihoodMatrix<>(matrix, alleles);
    }

    //TODO: take this hack out
    public static boolean basesMatch(final Allele a, final Allele b) { return a.getBases() == b.getBases() || Arrays.equals(a.getBases(), b.getBases()); }

    @Override
    public List evidence() { return matrix.evidence(); }

    @Override
    public List alleles() { return alleles; }

    @Override
    public void set(final int alleleIndex, final int evidenceIndex, final double value) {
        throw new UnsupportedOperationException("Subsetted likelihood matrices are immutable.");
    }

    @Override
    public double get(final int alleleIndex, final int evidenceIndex) { return matrix.get(newToOldIndexMap.get(alleleIndex), evidenceIndex); }

    @Override
    public int indexOfAllele(final Allele allele) { return alleles.indexOf(allele); }

    @Override
    public int indexOfEvidence(final EVIDENCE evidence) { return matrix.indexOfEvidence(evidence); }

    @Override
    public int numberOfAlleles() { return alleles.size(); }

    @Override
    public int evidenceCount() { return matrix.evidenceCount(); }

    @Override
    public A getAllele(final int alleleIndex) { return alleles.get(alleleIndex); }

    @Override
    public EVIDENCE getEvidence(final int evidenceIndex) { return matrix.getEvidence(evidenceIndex); }

    @Override
    public void copyAlleleLikelihoods(final int alleleIndex, final double[] dest, final int offset) {
        throw new UnsupportedOperationException("Subsetted likelihood matrices are not meant to be copied.");
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy