Search in sources :

Example 1 with Program

use of nl.hartwigmedicalfoundation.bachelor.Program in project hmftools by hartwigmedical.

the class BachelorEligibility method processCopyNumbers.

@NotNull
Collection<EligibilityReport> processCopyNumbers(final String patient, final List<GeneCopyNumber> copyNumbers) {
    final List<EligibilityReport> results = Lists.newArrayList();
    for (final GeneCopyNumber copyNumber : copyNumbers) {
        // TODO: verify the germline check
        final boolean isGermline = copyNumber.germlineHet2HomRegions() + copyNumber.germlineHomRegions() > 0;
        final List<String> matchingPrograms = programs.stream().filter(program -> program.copyNumberProcessor().test(copyNumber)).map(BachelorProgram::name).collect(Collectors.toList());
        final List<EligibilityReport> interimResults = matchingPrograms.stream().map(p -> ImmutableEligibilityReport.builder().patient(patient).source(isGermline ? GERMLINE_DELETION : SOMATIC_DELETION).program(p).id("").genes(copyNumber.gene()).chrom(copyNumber.chromosome()).pos(copyNumber.start()).ref("").alts("").effects("").build()).collect(Collectors.toList());
        results.addAll(interimResults);
    }
    return results;
}
Also used : ProgramPanel(nl.hartwigmedicalfoundation.bachelor.ProgramPanel) Genotype(htsjdk.variant.variantcontext.Genotype) CloseableIterator(htsjdk.samtools.util.CloseableIterator) SOMATIC_DELETION(com.hartwig.hmftools.bachelor.EligibilityReport.ReportType.SOMATIC_DELETION) SOMATIC_DISRUPTION(com.hartwig.hmftools.bachelor.EligibilityReport.ReportType.SOMATIC_DISRUPTION) VCFFileReader(htsjdk.variant.vcf.VCFFileReader) HmfGenomeRegion(com.hartwig.hmftools.common.region.hmfslicer.HmfGenomeRegion) Multimap(com.google.common.collect.Multimap) StructuralVariant(com.hartwig.hmftools.common.variant.structural.StructuralVariant) HmfGenePanelSupplier(com.hartwig.hmftools.genepanel.HmfGenePanelSupplier) HashMultimap(com.google.common.collect.HashMultimap) Lists(com.google.common.collect.Lists) GenomePosition(com.hartwig.hmftools.common.position.GenomePosition) VariantAnnotation(com.hartwig.hmftools.common.variant.snpeff.VariantAnnotation) Map(java.util.Map) StructuralVariantType(com.hartwig.hmftools.common.variant.structural.StructuralVariantType) GenomePositions(com.hartwig.hmftools.common.position.GenomePositions) SnpEffect(nl.hartwigmedicalfoundation.bachelor.SnpEffect) GERMLINE_DELETION(com.hartwig.hmftools.bachelor.EligibilityReport.ReportType.GERMLINE_DELETION) SortedSetMultimap(com.google.common.collect.SortedSetMultimap) OtherEffect(nl.hartwigmedicalfoundation.bachelor.OtherEffect) Predicate(java.util.function.Predicate) Collection(java.util.Collection) Program(nl.hartwigmedicalfoundation.bachelor.Program) Set(java.util.Set) WhitelistPredicate(com.hartwig.hmftools.bachelor.predicates.WhitelistPredicate) Collectors(java.util.stream.Collectors) Maps(com.google.common.collect.Maps) Sets(com.google.common.collect.Sets) GeneIdentifier(nl.hartwigmedicalfoundation.bachelor.GeneIdentifier) List(java.util.List) Stream(java.util.stream.Stream) Logger(org.apache.logging.log4j.Logger) VariantContext(htsjdk.variant.variantcontext.VariantContext) HmfExonRegion(com.hartwig.hmftools.common.region.hmfslicer.HmfExonRegion) GeneCopyNumber(com.hartwig.hmftools.common.gene.GeneCopyNumber) NotNull(org.jetbrains.annotations.NotNull) Collections(java.util.Collections) LogManager(org.apache.logging.log4j.LogManager) BlacklistPredicate(com.hartwig.hmftools.bachelor.predicates.BlacklistPredicate) GeneCopyNumber(com.hartwig.hmftools.common.gene.GeneCopyNumber) NotNull(org.jetbrains.annotations.NotNull)

Example 2 with Program

use of nl.hartwigmedicalfoundation.bachelor.Program in project hmftools by hartwigmedical.

the class BachelorEligibility method fromMap.

static BachelorEligibility fromMap(final Map<String, Program> input) {
    final BachelorEligibility result = new BachelorEligibility();
    for (final Program program : input.values()) {
        final Multimap<String, String> geneToEnsemblMap = HashMultimap.create();
        program.getPanel().stream().map(ProgramPanel::getGene).flatMap(Collection::stream).forEach(g -> geneToEnsemblMap.put(g.getName(), g.getEnsembl()));
        // NOTE: copy number and SVs are untested/unverified for now, but leave in support for them
        // process copy number sections
        final List<Predicate<GeneCopyNumber>> cnvPredicates = Lists.newArrayList();
        for (final ProgramPanel panel : program.getPanel()) {
            final List<GeneIdentifier> genes = panel.getGene();
            if (panel.getEffect().contains(OtherEffect.HOMOZYGOUS_DELETION)) {
                final Predicate<GeneCopyNumber> geneCopyNumberPredicate = cnv -> genes.stream().anyMatch(g -> g.getEnsembl().equals(cnv.transcriptID()));
                // TODO: we are matching on transcript ID here but we only have canonical transcripts in our panel file
                cnvPredicates.add(geneCopyNumberPredicate);
            }
        }
        // process structural variant disruptions
        final List<Predicate<HmfGenomeRegion>> disruptionPredicates = Lists.newArrayList();
        for (final ProgramPanel panel : program.getPanel()) {
            final List<GeneIdentifier> genes = panel.getGene();
            if (panel.getEffect().contains(OtherEffect.GENE_DISRUPTION)) {
                final Predicate<HmfGenomeRegion> disruptionPredicate = sv -> genes.stream().anyMatch(g -> g.getEnsembl().equals(sv.transcriptID()));
                // TODO: we are matching on transcript ID here but we only have canonical transcripts in our panel file
                disruptionPredicates.add(disruptionPredicate);
            }
        }
        // process variants from vcf
        final List<Predicate<VariantModel>> panelPredicates = Lists.newArrayList();
        List<String> requiredEffects = Lists.newArrayList();
        List<String> panelTranscripts = Lists.newArrayList();
        for (final ProgramPanel panel : program.getPanel()) {
            final List<GeneIdentifier> genes = panel.getGene();
            // take up a collection of the effects to search for
            requiredEffects = panel.getSnpEffect().stream().map(SnpEffect::value).collect(Collectors.toList());
            panelTranscripts = genes.stream().map(GeneIdentifier::getEnsembl).collect(Collectors.toList());
            final List<String> effects = requiredEffects;
            final Predicate<VariantModel> panelPredicate = v -> genes.stream().anyMatch(p -> v.sampleAnnotations().stream().anyMatch(a -> a.featureID().equals(p.getEnsembl()) && effects.stream().anyMatch(x -> a.effects().contains(x))));
            panelPredicates.add(panelPredicate);
            // update query targets
            for (final GeneIdentifier g : genes) {
                final HmfGenomeRegion region = allTranscriptsMap.get(g.getEnsembl());
                if (region == null) {
                    final HmfGenomeRegion namedRegion = allGenesMap.get(g.getName());
                    if (namedRegion == null) {
                        LOGGER.warn("Program {} gene {} non-canonical transcript {} couldn't find region, transcript will be skipped", program.getName(), g.getName(), g.getEnsembl());
                    // just skip this gene for now
                    } else {
                        result.variantLocationsToQuery.add(namedRegion);
                    }
                } else {
                    result.variantLocationsToQuery.add(region);
                }
            }
        }
        final Predicate<VariantModel> inPanel = v -> panelPredicates.stream().anyMatch(p -> p.test(v));
        final Predicate<VariantModel> inBlacklist = new BlacklistPredicate(geneToEnsemblMap.values(), program.getBlacklist());
        final Predicate<VariantModel> inWhitelist = new WhitelistPredicate(geneToEnsemblMap, program.getWhitelist());
        final Predicate<VariantModel> snvPredicate = v -> inPanel.test(v) ? !inBlacklist.test(v) : inWhitelist.test(v);
        final Predicate<GeneCopyNumber> copyNumberPredicate = cnv -> cnvPredicates.stream().anyMatch(p -> p.test(cnv)) && cnv.minCopyNumber() < MAX_COPY_NUMBER_FOR_LOSS;
        final Predicate<HmfGenomeRegion> disruptionPredicate = disruption -> disruptionPredicates.stream().anyMatch(p -> p.test(disruption));
        BachelorProgram bachelorProgram = new BachelorProgram(program.getName(), snvPredicate, copyNumberPredicate, disruptionPredicate, requiredEffects, panelTranscripts);
        result.programs.add(bachelorProgram);
    }
    return result;
}
Also used : GeneIdentifier(nl.hartwigmedicalfoundation.bachelor.GeneIdentifier) ProgramPanel(nl.hartwigmedicalfoundation.bachelor.ProgramPanel) Genotype(htsjdk.variant.variantcontext.Genotype) CloseableIterator(htsjdk.samtools.util.CloseableIterator) SOMATIC_DELETION(com.hartwig.hmftools.bachelor.EligibilityReport.ReportType.SOMATIC_DELETION) SOMATIC_DISRUPTION(com.hartwig.hmftools.bachelor.EligibilityReport.ReportType.SOMATIC_DISRUPTION) VCFFileReader(htsjdk.variant.vcf.VCFFileReader) HmfGenomeRegion(com.hartwig.hmftools.common.region.hmfslicer.HmfGenomeRegion) Multimap(com.google.common.collect.Multimap) StructuralVariant(com.hartwig.hmftools.common.variant.structural.StructuralVariant) HmfGenePanelSupplier(com.hartwig.hmftools.genepanel.HmfGenePanelSupplier) HashMultimap(com.google.common.collect.HashMultimap) Lists(com.google.common.collect.Lists) GenomePosition(com.hartwig.hmftools.common.position.GenomePosition) VariantAnnotation(com.hartwig.hmftools.common.variant.snpeff.VariantAnnotation) Map(java.util.Map) StructuralVariantType(com.hartwig.hmftools.common.variant.structural.StructuralVariantType) GenomePositions(com.hartwig.hmftools.common.position.GenomePositions) SnpEffect(nl.hartwigmedicalfoundation.bachelor.SnpEffect) GERMLINE_DELETION(com.hartwig.hmftools.bachelor.EligibilityReport.ReportType.GERMLINE_DELETION) SortedSetMultimap(com.google.common.collect.SortedSetMultimap) OtherEffect(nl.hartwigmedicalfoundation.bachelor.OtherEffect) Predicate(java.util.function.Predicate) Collection(java.util.Collection) Program(nl.hartwigmedicalfoundation.bachelor.Program) Set(java.util.Set) WhitelistPredicate(com.hartwig.hmftools.bachelor.predicates.WhitelistPredicate) Collectors(java.util.stream.Collectors) Maps(com.google.common.collect.Maps) Sets(com.google.common.collect.Sets) GeneIdentifier(nl.hartwigmedicalfoundation.bachelor.GeneIdentifier) List(java.util.List) Stream(java.util.stream.Stream) Logger(org.apache.logging.log4j.Logger) VariantContext(htsjdk.variant.variantcontext.VariantContext) HmfExonRegion(com.hartwig.hmftools.common.region.hmfslicer.HmfExonRegion) GeneCopyNumber(com.hartwig.hmftools.common.gene.GeneCopyNumber) NotNull(org.jetbrains.annotations.NotNull) Collections(java.util.Collections) LogManager(org.apache.logging.log4j.LogManager) BlacklistPredicate(com.hartwig.hmftools.bachelor.predicates.BlacklistPredicate) BlacklistPredicate(com.hartwig.hmftools.bachelor.predicates.BlacklistPredicate) Program(nl.hartwigmedicalfoundation.bachelor.Program) WhitelistPredicate(com.hartwig.hmftools.bachelor.predicates.WhitelistPredicate) Predicate(java.util.function.Predicate) WhitelistPredicate(com.hartwig.hmftools.bachelor.predicates.WhitelistPredicate) BlacklistPredicate(com.hartwig.hmftools.bachelor.predicates.BlacklistPredicate) GeneCopyNumber(com.hartwig.hmftools.common.gene.GeneCopyNumber) SnpEffect(nl.hartwigmedicalfoundation.bachelor.SnpEffect) ProgramPanel(nl.hartwigmedicalfoundation.bachelor.ProgramPanel) HmfGenomeRegion(com.hartwig.hmftools.common.region.hmfslicer.HmfGenomeRegion)

Example 3 with Program

use of nl.hartwigmedicalfoundation.bachelor.Program in project hmftools by hartwigmedical.

the class BachelorHelper method loadXML.

@NotNull
public static Map<String, Program> loadXML(final Path path) throws IOException, SAXException {
    final BachelorSchema schema = BachelorSchema.make();
    final List<Program> programs = Files.walk(path).filter(p -> p.toString().endsWith(".xml")).map(schema::processXML).filter(Objects::nonNull).collect(Collectors.toList());
    final Map<String, Program> result = Maps.newHashMap();
    for (final Program p : programs) {
        if (result.containsKey(p.getName())) {
            LOGGER.error("duplicate programs detected: {}", p.getName());
            System.exit(1);
        } else {
            result.put(p.getName(), p);
        }
    }
    return result;
}
Also used : Files(java.nio.file.Files) Program(nl.hartwigmedicalfoundation.bachelor.Program) IOException(java.io.IOException) Collectors(java.util.stream.Collectors) Maps(com.google.common.collect.Maps) Objects(java.util.Objects) List(java.util.List) Logger(org.apache.logging.log4j.Logger) Map(java.util.Map) SAXException(org.xml.sax.SAXException) NotNull(org.jetbrains.annotations.NotNull) Path(java.nio.file.Path) LogManager(org.apache.logging.log4j.LogManager) Program(nl.hartwigmedicalfoundation.bachelor.Program) NotNull(org.jetbrains.annotations.NotNull)

Example 4 with Program

use of nl.hartwigmedicalfoundation.bachelor.Program in project hmftools by hartwigmedical.

the class BachelorApplication method main.

public static void main(final String... args) {
    final Options options = createOptions();
    try {
        final CommandLine cmd = createCommandLine(options, args);
        // load configs
        final Map<String, Program> map;
        if (cmd.hasOption(CONFIG_DIRECTORY)) {
            map = BachelorHelper.loadXML(Paths.get(cmd.getOptionValue(CONFIG_DIRECTORY)));
        } else if (cmd.hasOption(CONFIG_XML)) {
            map = BachelorHelper.loadXML(Paths.get(cmd.getOptionValue(CONFIG_XML)));
        } else {
            LOGGER.error("config directory or xml required!");
            System.exit(1);
            return;
        }
        if (cmd.hasOption(VALIDATE)) {
            System.exit(0);
            return;
        }
        if (map.isEmpty()) {
            LOGGER.error("no programs loaded, exiting");
            System.exit(1);
            return;
        }
        final BachelorEligibility eligibility = BachelorEligibility.fromMap(map);
        LOGGER.info("beginning processing");
        final boolean germline = cmd.hasOption(GERMLINE);
        final boolean somatic = cmd.hasOption(SOMATIC);
        final boolean copyNumber = cmd.hasOption(COPYNUMBER);
        final boolean structuralVariants = cmd.hasOption(SV);
        final boolean doAll = !(germline || somatic || copyNumber || structuralVariants);
        final List<File> filesToMerge;
        if (cmd.hasOption(BATCH_DIRECTORY)) {
            final Path root = Paths.get(cmd.getOptionValue(BATCH_DIRECTORY));
            try (final Stream<Path> stream = Files.walk(root, 1, FileVisitOption.FOLLOW_LINKS).parallel()) {
                filesToMerge = stream.filter(p -> p.toFile().isDirectory()).filter(p -> !p.equals(root)).map(RunDirectory::new).map(run -> process(eligibility, run, germline || doAll, somatic || doAll, copyNumber || doAll, structuralVariants || doAll)).collect(Collectors.toList());
            }
        } else if (cmd.hasOption(RUN_DIRECTORY)) {
            final Path path = Paths.get(cmd.getOptionValue(RUN_DIRECTORY));
            if (!Files.exists(path)) {
                LOGGER.error("-runDirectory path does not exist");
                System.exit(1);
                return;
            }
            filesToMerge = Collections.singletonList(process(eligibility, new RunDirectory(path), germline || doAll, somatic || doAll, copyNumber || doAll, structuralVariants || doAll));
        } else {
            LOGGER.error("requires either a batch or single run directory");
            System.exit(1);
            return;
        }
        LOGGER.info("processing complete");
        LOGGER.info("merging to CSV {}", cmd.getOptionValue(OUTPUT));
        try (final BufferedWriter writer = Files.newBufferedWriter(Paths.get(cmd.getOptionValue(OUTPUT)))) {
            // header
            writer.write(fileHeader());
            writer.newLine();
            for (final File file : filesToMerge) {
                final List<String> lines = Files.readAllLines(file.toPath());
                for (final String line : lines) {
                    writer.write(line);
                    writer.newLine();
                }
            }
        }
        LOGGER.info("output written");
        LOGGER.info("bachelor done");
    } catch (final ParseException e) {
        printHelpAndExit(options);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Also used : Path(java.nio.file.Path) Arrays(java.util.Arrays) LineIterator(htsjdk.tribble.readers.LineIterator) VCFFileReader(htsjdk.variant.vcf.VCFFileReader) Options(org.apache.commons.cli.Options) HelpFormatter(org.apache.commons.cli.HelpFormatter) TribbleException(htsjdk.tribble.TribbleException) DefaultParser(org.apache.commons.cli.DefaultParser) AbstractFeatureReader(htsjdk.tribble.AbstractFeatureReader) Lists(com.google.common.collect.Lists) Map(java.util.Map) CommandLine(org.apache.commons.cli.CommandLine) GeneCopyNumberFile(com.hartwig.hmftools.common.gene.GeneCopyNumberFile) VCFCodec(htsjdk.variant.vcf.VCFCodec) Path(java.nio.file.Path) Option(org.apache.commons.cli.Option) Files(java.nio.file.Files) CommandLineParser(org.apache.commons.cli.CommandLineParser) BufferedWriter(java.io.BufferedWriter) Collection(java.util.Collection) Program(nl.hartwigmedicalfoundation.bachelor.Program) IOException(java.io.IOException) Collectors(java.util.stream.Collectors) File(java.io.File) List(java.util.List) Stream(java.util.stream.Stream) Logger(org.apache.logging.log4j.Logger) FileVisitOption(java.nio.file.FileVisitOption) Paths(java.nio.file.Paths) StructuralVariantFactory(com.hartwig.hmftools.common.variant.structural.StructuralVariantFactory) ParseException(org.apache.commons.cli.ParseException) VariantContext(htsjdk.variant.variantcontext.VariantContext) GeneCopyNumber(com.hartwig.hmftools.common.gene.GeneCopyNumber) NotNull(org.jetbrains.annotations.NotNull) Collections(java.util.Collections) LogManager(org.apache.logging.log4j.LogManager) Options(org.apache.commons.cli.Options) Program(nl.hartwigmedicalfoundation.bachelor.Program) TribbleException(htsjdk.tribble.TribbleException) IOException(java.io.IOException) ParseException(org.apache.commons.cli.ParseException) BufferedWriter(java.io.BufferedWriter) CommandLine(org.apache.commons.cli.CommandLine) ParseException(org.apache.commons.cli.ParseException) GeneCopyNumberFile(com.hartwig.hmftools.common.gene.GeneCopyNumberFile) File(java.io.File)

Example 5 with Program

use of nl.hartwigmedicalfoundation.bachelor.Program in project hmftools by hartwigmedical.

the class BachelorEligibility method processStructuralVariant.

private Collection<EligibilityReport> processStructuralVariant(final String patient, final GenomePosition position, final GenomePosition other, final StructuralVariantType svType) {
    final List<EligibilityReport> results = Lists.newArrayList();
    // TODO: can we do better than this performance wise? new map?
    for (final HmfGenomeRegion region : allGenesByChromosomeMap.get(position.chromosome())) {
        if (!region.contains(position)) {
            continue;
        }
        // skip non-inversion intronic variants
        if (region.contains(other) && svType != StructuralVariantType.INV) {
            final int intronStart = intron(region.exome(), position);
            final int intronEnd = intron(region.exome(), other);
            // the variant is intronic in a gene -- we will filter it
            if (intronStart >= 0 && intronStart == intronEnd) {
                continue;
            }
        }
        programs.stream().filter(p -> p.disruptionProcessor().test(region)).map(p -> ImmutableEligibilityReport.builder().patient(patient).source(SOMATIC_DISRUPTION).program(p.name()).id("").genes(region.gene()).chrom(region.chromosome()).pos(position.position()).ref("").alts("").effects("").build()).forEach(results::add);
    }
    return results;
}
Also used : ProgramPanel(nl.hartwigmedicalfoundation.bachelor.ProgramPanel) Genotype(htsjdk.variant.variantcontext.Genotype) CloseableIterator(htsjdk.samtools.util.CloseableIterator) SOMATIC_DELETION(com.hartwig.hmftools.bachelor.EligibilityReport.ReportType.SOMATIC_DELETION) SOMATIC_DISRUPTION(com.hartwig.hmftools.bachelor.EligibilityReport.ReportType.SOMATIC_DISRUPTION) VCFFileReader(htsjdk.variant.vcf.VCFFileReader) HmfGenomeRegion(com.hartwig.hmftools.common.region.hmfslicer.HmfGenomeRegion) Multimap(com.google.common.collect.Multimap) StructuralVariant(com.hartwig.hmftools.common.variant.structural.StructuralVariant) HmfGenePanelSupplier(com.hartwig.hmftools.genepanel.HmfGenePanelSupplier) HashMultimap(com.google.common.collect.HashMultimap) Lists(com.google.common.collect.Lists) GenomePosition(com.hartwig.hmftools.common.position.GenomePosition) VariantAnnotation(com.hartwig.hmftools.common.variant.snpeff.VariantAnnotation) Map(java.util.Map) StructuralVariantType(com.hartwig.hmftools.common.variant.structural.StructuralVariantType) GenomePositions(com.hartwig.hmftools.common.position.GenomePositions) SnpEffect(nl.hartwigmedicalfoundation.bachelor.SnpEffect) GERMLINE_DELETION(com.hartwig.hmftools.bachelor.EligibilityReport.ReportType.GERMLINE_DELETION) SortedSetMultimap(com.google.common.collect.SortedSetMultimap) OtherEffect(nl.hartwigmedicalfoundation.bachelor.OtherEffect) Predicate(java.util.function.Predicate) Collection(java.util.Collection) Program(nl.hartwigmedicalfoundation.bachelor.Program) Set(java.util.Set) WhitelistPredicate(com.hartwig.hmftools.bachelor.predicates.WhitelistPredicate) Collectors(java.util.stream.Collectors) Maps(com.google.common.collect.Maps) Sets(com.google.common.collect.Sets) GeneIdentifier(nl.hartwigmedicalfoundation.bachelor.GeneIdentifier) List(java.util.List) Stream(java.util.stream.Stream) Logger(org.apache.logging.log4j.Logger) VariantContext(htsjdk.variant.variantcontext.VariantContext) HmfExonRegion(com.hartwig.hmftools.common.region.hmfslicer.HmfExonRegion) GeneCopyNumber(com.hartwig.hmftools.common.gene.GeneCopyNumber) NotNull(org.jetbrains.annotations.NotNull) Collections(java.util.Collections) LogManager(org.apache.logging.log4j.LogManager) BlacklistPredicate(com.hartwig.hmftools.bachelor.predicates.BlacklistPredicate) HmfGenomeRegion(com.hartwig.hmftools.common.region.hmfslicer.HmfGenomeRegion)

Aggregations

Program (nl.hartwigmedicalfoundation.bachelor.Program)7 List (java.util.List)5 Map (java.util.Map)5 Collectors (java.util.stream.Collectors)5 LogManager (org.apache.logging.log4j.LogManager)5 Logger (org.apache.logging.log4j.Logger)5 NotNull (org.jetbrains.annotations.NotNull)5 Lists (com.google.common.collect.Lists)4 Maps (com.google.common.collect.Maps)4 GeneCopyNumber (com.hartwig.hmftools.common.gene.GeneCopyNumber)4 VariantContext (htsjdk.variant.variantcontext.VariantContext)4 VCFFileReader (htsjdk.variant.vcf.VCFFileReader)4 Collection (java.util.Collection)4 Collections (java.util.Collections)4 Stream (java.util.stream.Stream)4 HashMultimap (com.google.common.collect.HashMultimap)3 Multimap (com.google.common.collect.Multimap)3 Sets (com.google.common.collect.Sets)3 SortedSetMultimap (com.google.common.collect.SortedSetMultimap)3 GERMLINE_DELETION (com.hartwig.hmftools.bachelor.EligibilityReport.ReportType.GERMLINE_DELETION)3