private static AlternateCoordinate copyAlt(Variant var, AlternateCoordinate orig) { AlternateCoordinate copy = new AlternateCoordinate(); copy.setChromosome(orig.getChromosome() == null ? var.getChromosome() : orig.getChromosome()); copy.setStart(orig.getStart() == null ? var.getStart() : orig.getStart()); copy.setEnd(orig.getEnd() == null ? var.getEnd() : orig.getEnd()); copy.setReference(orig.getReference() == null ? var.getReference() : orig.getReference()); copy.setAlternate(orig.getAlternate() == null ? var.getAlternate() : orig.getAlternate()); copy.setType(orig.getType() == null ? var.getType() : orig.getType()); return copy; }
public static boolean isSameVariant(AlternateCoordinate a, AlternateCoordinate b){ return StringUtils.equals(a.getChromosome(), b.getChromosome()) && a.getStart().equals(b.getStart()) && a.getEnd().equals(b.getEnd()) && StringUtils.equals(a.getReference(), b.getReference()) && StringUtils.equals(a.getAlternate(), b.getAlternate()); } }
/** * @deprecated Use {@link #setSecondaryAlternates(List)} */ @Deprecated public void setSecondaryAlternatesAlleles(List<String> value) { List<AlternateCoordinate> secondaryAlternatesMap = null; if (value != null) { secondaryAlternatesMap = new ArrayList<>(value.size()); for (String secondaryAlternate : value) { secondaryAlternatesMap.add(new AlternateCoordinate(null, null, null, null, secondaryAlternate, VariantType.SNV)); } } impl.setSecondaryAlternates(secondaryAlternatesMap); }
Integer end = current.getEnd(); Consumer<AlternateCoordinate> updateAlt = a -> { a.setStart(start); a.setEnd(end); a.setReference(current.getReference()); a.setAlternate("*"); // set deletion to * Alternate a.setType(VariantType.MIXED); // set all to the same }; if (current.getType().equals(VariantType.SNP) pair.getValue().stream() .filter(a -> { if (a.getType().equals(VariantType.INDEL)) { return current.overlapWith(a.getChromosome(), a.getStart(), a.getEnd(), true); return stream.map(pair -> { pair.getValue().stream() .filter(a -> !a.equals(currAlt)) // not same as current variant .filter(a -> start >= a.getStart() && end <= a.getEnd()) .forEach(updateAlt); return pair; return stream.map(pair -> { pair.getValue().stream() .filter(a -> !a.equals(currAlt)) // not same as current variant .filter(a -> { if (isInsertion(a)) { return (start.equals(a.getStart()) && end.equals(a.getEnd())
.map(Pair::getValue) .flatMap(Collection::stream) .filter(a -> (start >= a.getStart() && end <= a.getEnd())) .forEach(altSets::add); } else if (this.collapseDeletions && isInsertion(current.getType(), current.getStart(), current.getEnd())) { .filter(a -> { if (isInsertion(a)) { return (start.equals(a.getStart()) && end.equals(a.getEnd()) && (a.getAlternate().equals("*") || a.getAlternate().length() >= current.getAlternate().length()) ); } else if (this.collapseDeletions && current.getType().equals(VariantType.SNP)) { varToAlts.forEach(p -> p.getValue().stream() .filter(a -> current.overlapWith(a.getChromosome(), a.getStart(), a.getEnd(), true)) .forEach(altSets::add)); } else { if (variant.getType().equals(VariantType.NO_VARIATION) && !alts.isEmpty()) { AlternateCoordinate mainAlternate = alts.get(0); mainAlternate.setStart(Math.max(mainAlternate.getStart(), current.getStart())); mainAlternate.setEnd(Math.min(mainAlternate.getEnd(), current.getEnd())); for (Iterator<AlternateCoordinate> iterator = currAlts.iterator(); iterator.hasNext();) { AlternateCoordinate alt = iterator.next(); if (alt.getType().equals(VariantType.NO_VARIATION)) { iterator.remove();
public List<String> buildAlleles(Variant variant, Pair<Integer, Integer> adjustedRange) { String reference = variant.getReference(); String alternate = variant.getAlternate(); List<AlternateCoordinate> secAlts = variant.getStudy(this.studyConfiguration.getStudyName()).getSecondaryAlternates(); List<String> alleles = new ArrayList<>(secAlts.size() + 2); Integer origStart = variant.getStart(); Integer origEnd = variant.getEnd(); alleles.add(buildAllele(variant.getChromosome(), origStart, origEnd, reference, adjustedRange)); alleles.add(buildAllele(variant.getChromosome(), origStart, origEnd, alternate, adjustedRange)); secAlts.forEach(alt -> { alleles.add(buildAllele(variant.getChromosome(), alt.getStart(), alt.getEnd(), alt.getAlternate(), adjustedRange)); }); return alleles; }
public static boolean hasAnyOverlap(Variant current, Variant other, Collection<AlternateCoordinate> alts) { if (current.overlapWith(other, true)) { return true; // Important for REF region } return alts.stream().filter(a -> current.overlapWith(a.getChromosome(), a.getStart(), a.getEnd(), true)) .findAny().isPresent(); }
/** * Build a list of all the alternates from a variant. Includes the main and the secondary alternates. * @param variant * @return */ public List<AlternateCoordinate> buildAltList(Variant variant) { AlternateCoordinate mainAlternate = getMainAlternate(variant); List<AlternateCoordinate> alternates = new ArrayList<>(); boolean emptyRefBlock = mainAlternate.getType().equals(VariantType.NO_VARIATION) && (mainAlternate.getAlternate().isEmpty() || mainAlternate.getAlternate().equals(Allele.NO_CALL_STRING)); // Skip Reference Blocks (NO_VARIATION) where the alternate is empty if (!emptyRefBlock) { alternates.add(mainAlternate); } StudyEntry se = getStudy(variant); if(se.getSecondaryAlternates() != null){ se.getSecondaryAlternates().forEach( alt -> alternates.add(copyAlt(variant, alt))); } return alternates; }
@Test public void resolveSameVariantWithSecAltInsertion() throws Exception { Variant a = getVariant("2:10048155:-:AT", "PASS", "220", "1/2"); Variant b = getVariant("2:10048155:ATATATATATAT:-", "PASS", "220", "2/1"); a.getStudies().get(0).getSecondaryAlternates().add(new AlternateCoordinate("2", b.getStart(), b.getEnd(), b.getReference(), b.getAlternate(), INDEL)); b.getStudies().get(0).getSecondaryAlternates().add(new AlternateCoordinate("2", a.getStart(), a.getEnd(), a.getReference(), a.getAlternate(), INDEL)); List<Variant> resolved = new ArrayList<>(new VariantLocalConflictResolver().resolveConflicts(Arrays.asList(a, b))); System.out.println("a.toString() = " + a.toString()); System.out.println("b.getStudies().get(0).getSecondaryAlternates().get(0).toString() = " + b.getStudies().get(0).getSecondaryAlternates().get(0).toString()); assertEquals(1, resolved.size()); assertEquals(1, resolved.get(0).getStudies().get(0).getSecondaryAlternates().size()); assertEquals("1/2", resolved.get(0).getStudies().get(0).getSamplesData().get(0).get(0)); }
public void checkConflictingFiles(StudyConfiguration studyConfiguration) throws Exception { HadoopVariantStorageEngine variantStorageEngine = (HadoopVariantStorageEngine) this.variantStorageEngine; VariantHadoopDBAdaptor dbAdaptor = variantStorageEngine.getDBAdaptor(); List<Integer> sampleIds = new ArrayList<>(studyConfiguration.getSampleIds().values()); sampleIds.sort(Integer::compareTo); fillGaps(variantStorageEngine, studyConfiguration, sampleIds); printVariants(dbAdaptor.getStudyConfigurationManager().getStudyConfiguration(studyConfiguration.getStudyId(), null).first(), dbAdaptor, newOutputUri(1)); checkFillGaps(studyConfiguration, dbAdaptor, sampleIds, Collections.singleton("1:10020:A:T")); checkSampleIndexTable(dbAdaptor); Variant variantGap = dbAdaptor.get(new Query(VariantQueryParam.ID.key(), "1:10020:A:T"), null).first(); assertEquals("0/1", variantGap.getStudies().get(0).getSampleData("s1", "GT")); assertEquals(GenotypeClass.UNKNOWN_GENOTYPE, variantGap.getStudies().get(0).getSampleData("s2", "GT")); Variant variantMulti = dbAdaptor.get(new Query(VariantQueryParam.ID.key(), "1:10012:TTT:-"), null).first(); assertEquals("<*>", variantMulti.getStudies().get(0).getSecondaryAlternates().get(0).getAlternate()); assertEquals("0/1", variantMulti.getStudies().get(0).getSampleData("s1", "GT")); assertEquals("2/2", variantMulti.getStudies().get(0).getSampleData("s2", "GT")); Variant variantNonMulti = dbAdaptor.get(new Query(VariantQueryParam.ID.key(), "1:10054:A:G"), null).first(); assertEquals(new HashSet<>(Arrays.asList("C", "T")), variantNonMulti.getStudies().get(0).getSecondaryAlternates().stream().map(AlternateCoordinate::getAlternate).collect(Collectors.toSet())); assertEquals("2/3", variantNonMulti.getStudies().get(0).getSampleData("s1", "GT")); assertEquals("0/1", variantNonMulti.getStudies().get(0).getSampleData("s2", "GT")); }
protected boolean equals(AlternateCoordinate alt1, AlternateCoordinate alt2) { return alt2.getStart().equals(alt1.getStart()) && alt2.getEnd().equals(alt1.getEnd()) && alt2.getReference().equals(alt1.getReference()) && alt2.getAlternate().equals(alt1.getAlternate()); }
public static AlternateCoordinate getAlternateCoordinate(String s) { String[] split = s.split(ALTERNATE_COORDINATE_SEPARATOR, 5); int idx = split[4].lastIndexOf(ALTERNATE_COORDINATE_SEPARATOR); String alternate = split[4].substring(0, idx); VariantType type = VariantType.valueOf(split[4].substring(idx + 1)); return new AlternateCoordinate( split[0], Integer.parseInt(split[1]), Integer.parseInt(split[2]), split[3], alternate, type ); }
@Override public List<String> buildAlleles(Variant variant, Pair<Integer, Integer> adjustedRange, Map<Integer, Character> referenceAlleles) { String reference = variant.getReference(); String alternate = variant.getAlternate(); if (variant.getSv() != null && variant.getSv().getType() == StructuralVariantType.TANDEM_DUPLICATION && alternate.equals(VariantBuilder.DUP_ALT)) { alternate = VariantBuilder.DUP_TANDEM_ALT; } if (variant.getType().equals(VariantType.NO_VARIATION)) { return Arrays.asList(reference, "."); } StudyEntry study = getStudy(variant); List<AlternateCoordinate> secAlts = study.getSecondaryAlternates(); List<String> alleles = new ArrayList<>(secAlts.size() + 2); int origStart = variant.getStart(); int origEnd; if (variant.getLength() == Variant.UNKNOWN_LENGTH) { // Variant::getLengthReference would return UNKNOWN_LENGTH, as the reference could have incomplete reference length origEnd = variant.getStart() + variant.getReference().length() - 1; } else { origEnd = variant.getEnd(); } alleles.add(buildAllele(variant.getChromosome(), origStart, origEnd, reference, adjustedRange, referenceAlleles)); alleles.add(buildAllele(variant.getChromosome(), origStart, origEnd, alternate, adjustedRange, referenceAlleles)); secAlts.forEach(alt -> { int alternateStart = alt.getStart() == null ? variant.getStart() : alt.getStart().intValue(); int alternateEnd = alt.getEnd() == null ? variant.getEnd() : alt.getEnd().intValue(); alleles.add(buildAllele(variant.getChromosome(), alternateStart, alternateEnd, alt.getAlternate(), adjustedRange, referenceAlleles)); }); return alleles; }
public static boolean hasAnyOverlap(Variant current, Variant other) { if (current.overlapWith(other, true)) { return true; } // SecAlt of query return other.getStudies().stream() .filter( s -> // foreach study s.getSecondaryAlternates().stream() .filter(a -> { // Avoid NPE a = copyAlt(other, a); return current.overlapWith(a.getChromosome(), a.getStart(), a.getEnd(), true); } ) .findAny() .isPresent() ) .findAny() .isPresent(); }
protected void validateAlternate(AlternateCoordinate alt) { if (alt.getChromosome() == null) { throw new IllegalStateException("Chromosome of alt is null: " + alt); } if (alt.getStart() == null) { throw new IllegalStateException("Start of alt is null: " + alt); } if (alt.getEnd() == null) { throw new IllegalStateException("End of alt is null: " + alt); } if (alt.getReference() == null) { throw new IllegalStateException("Reference of alt is null: " + alt); } if (alt.getAlternate() == null) { throw new IllegalStateException("Alternate of alt is null: " + alt); } }
.map(a -> new AlternateCoordinate(chromosome, null, null, null, a, null)) .collect(Collectors.toList()); StudyEntry entry = new StudyEntry(metadata.getId(), secondaryAlternatesMap, Arrays.asList(format.split(":")));
public static boolean isSameVariant(Variant a, AlternateCoordinate b){ return StringUtils.equals(a.getChromosome(), b.getChromosome()) && a.getStart().equals(b.getStart()) && a.getEnd().equals(b.getEnd()) && StringUtils.equals(a.getReference(), b.getReference()) && StringUtils.equals(a.getAlternate(), b.getAlternate()); }
public List<AlternateCoordinate> getSecondaryAlternates(String chromosome, VariantKeyFields alternate, List<VariantKeyFields> reorderedKeyFields) { List<AlternateCoordinate> secondaryAlternates = new ArrayList<>(reorderedKeyFields.size()); for (VariantKeyFields keyFields : reorderedKeyFields) { if (!keyFields.equals(alternate)) { secondaryAlternates.add(new AlternateCoordinate( chromosome, keyFields.getStart(), keyFields.getEnd(), keyFields.getReference(), keyFields.getAlternate(), VariantBuilder.inferType(keyFields.getReference(), keyFields.getAlternate()) )); } } return secondaryAlternates; }