public Variant buildVariant(String variantId, int end, String reference, String alternate) { String[] split = variantId.split(SEPARATOR, -1); String chr = split[CHR].trim(); int start = Integer.parseInt(split[POS].trim()); StructuralVariation sv = buildSv(split, reference, alternate); if (StringUtils.contains(alternate, INS_SEQ_SEPARATOR)) { String[] alternateSplit = StringUtils.splitPreserveAllTokens(alternate, INS_SEQ_SEPARATOR); alternate = alternateSplit[0]; if (sv == null) { sv = new StructuralVariation(); } sv.setLeftSvInsSeq(alternateSplit[1]); sv.setRightSvInsSeq(alternateSplit[2]); } Variant variant = new Variant(chr, start, end, reference, alternate); if (sv != null) { if (variant.getSv() != null && variant.getSv().getType() != null) { sv.setType(variant.getSv().getType()); } variant.setSv(sv); } return variant; }
} else if (sv != null && sv.getType() == StructuralVariantType.TANDEM_DUPLICATION) { sb.append("<DUP:TANDEM>"); } else {
@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; }
static String buildSVAlternate(String alternate, Integer end, StructuralVariation sv) { if (sv != null) { if (StructuralVariantType.TANDEM_DUPLICATION.equals(sv.getType())) { alternate = VariantBuilder.DUP_TANDEM_ALT; } alternate = alternate + SV_ALTERNATE_SEPARATOR + end + SV_ALTERNATE_SEPARATOR + (sv.getCiStartLeft() == null ? 0 : sv.getCiStartLeft()) + SV_ALTERNATE_SEPARATOR + (sv.getCiStartRight() == null ? 0 : sv.getCiStartRight()) + SV_ALTERNATE_SEPARATOR + (sv.getCiEndLeft() == null ? 0 : sv.getCiEndLeft()) + SV_ALTERNATE_SEPARATOR + (sv.getCiEndRight() == null ? 0 : sv.getCiEndRight()); if (StringUtils.isNotEmpty(sv.getLeftSvInsSeq()) || StringUtils.isNotEmpty(sv.getRightSvInsSeq())) { alternate = alternate + SV_ALTERNATE_SEPARATOR + sv.getLeftSvInsSeq() + SV_ALTERNATE_SEPARATOR + sv.getRightSvInsSeq(); } } return alternate; }
/** * Check if the structural variant information should be serialized. * * Checks if any field is non null, or the type is not COPY_NUMBER_GAIN nor COPY_NUMBER_LOSS * This two types are inferred from the Alternate * * @param sv StructuralVariation object * @return true if it should be serialized */ private boolean validSV(StructuralVariation sv) { if (sv == null) { return false; } else { StructuralVariantType type = sv.getType(); return type != null && !COPY_NUMBER_GAIN.equals(type) && !COPY_NUMBER_LOSS.equals(type) || sv.getCiStartLeft() != null || sv.getCiStartRight() != null || sv.getCiEndLeft() != null || sv.getCiEndRight() != null || sv.getLeftSvInsSeq() != null || sv.getRightSvInsSeq() != null || sv.getBreakend() != null; } }
ifNotNull(sv.getRightSvInsSeq(), svBuilder::setRightSvInsSeq); ifNotNull(sv.getLeftSvInsSeq(), svBuilder::setLeftSvInsSeq); ifNotNull(sv.getType(), type -> svBuilder.setType(VariantProto.StructuralVariantType.valueOf(sv.getType().toString()))); if (sv.getBreakend() != null) { Breakend bnd = sv.getBreakend();