@Override public Variant convert(ResultSet resultSet) { Variant variant = extractVariantFromResultSet(resultSet); try { String type = resultSet.getString(VariantPhoenixHelper.VariantColumn.TYPE.column()); if (StringUtils.isNotBlank(type)) { variant.setType(VariantType.valueOf(type)); } VariantAnnotation annotation = annotationConverter.convert(resultSet); Map<Integer, StudyEntry> samplesData = studyEntryConverter.convert(resultSet); return convert(variant, samplesData, annotation); } catch (RuntimeException | SQLException e) { logger.error("Fail to parse variant: " + variant); throw Throwables.propagate(e); } } }
public void resetType() { setType(VariantBuilder.inferType(getReference(), getAlternate())); }
private List<Variant> parseVariantList(List<String> batch) { List<Variant> variantList = new ArrayList<>(batch.size()); for (String line : batch) { if (line.startsWith("#") || line.trim().isEmpty()) { continue; } Variant variant = new Variant(jsonObjectMapper.convertValue(JSON.parse(line), VariantAvro.class)); if (isValid(variant)) { // Read variants may not have the variant type set and this might cause NPE if (variant.getType() == null) { variant.setType(variant.inferType(variant.getReference(), variant.getAlternate())); variant.resetLength(); } variantList.add(variant); } else { continue; } } return variantList; }
/** * Performs one read of from a CellBase variation collection. * * @return List of variants. It can be expected to contain only one variant. */ public List<Variant> read() { Variant variant = null; boolean valid = false; while (iterator.hasNext() && !valid) { variant = iterator.next(); valid = isValid(variant); } if (valid) { // New variants in the variation collection created during the update of the frequencies may not have // the variant type set and this might cause NPE if (variant.getType() == null) { variant.setType(variant.inferType(variant.getReference(), variant.getAlternate())); } return Collections.singletonList(variant); } else { return null; } }
@Test public void getMissingRegionsAfterOutside() throws Exception { Variant a = getVariant("1:1000:A:T"); a.setType(NO_VARIATION); Variant b = getVariant("1:1002:A:T"); b.setType(NO_VARIATION); Variant snp = getVariant("1:1003:A:T"); System.out.println("a = " + a.toJson()); System.out.println("b = " + b.toJson()); System.out.println("snp = " + snp.toJson()); List<Pair<Integer, Integer>> missingRegions = VariantLocalConflictResolver.getMissingRegions(Arrays.asList (new Variant[]{a, b}), snp); System.out.println("missingRegions = " + missingRegions); assertEquals(1, missingRegions.size()); }
/** * Create an empty Variant (position, ref, alt) from a template with basic Study information without samples. * @param target Variant to take as a template * @return Variant filled with chromosome, start, end, ref, alt, study ID and format set to GT only, BUT no samples. */ public Variant createFromTemplate(Variant target) { Variant var = new Variant(target.getChromosome(), target.getStart(), target.getEnd(), target.getReference(), target.getAlternate()); var.setType(target.getType()); for(StudyEntry tse : target.getStudies()){ StudyEntry se = new StudyEntry(tse.getStudyId()); se.setFiles(Collections.singletonList(new FileEntry("", "", new HashMap<>()))); se.setFormat(Arrays.asList(getGtKey(), getFilterKey())); se.setSamplesPosition(new HashMap<>()); se.setSamplesData(new ArrayList<>()); var.addStudyEntry(se); } return var; }
public static VariantType getVariantType(Variant variant) throws UnsupportedURLVariantFormat { if (variant.getType() == null) { variant.setType(Variant.inferType(variant.getReference(), variant.getAlternate())); } // FIXME: remove the if block below as soon as the Variant.inferType method is able to differentiate between // FIXME: insertions and deletions // if (variant.getType().equals(VariantType.INDEL) || variant.getType().equals(VariantType.SV)) { if (variant.getType().equals(VariantType.INDEL)) { if (variant.getReference().isEmpty()) { // variant.setType(VariantType.INSERTION); return VariantType.INSERTION; } else if (variant.getAlternate().isEmpty()) { // variant.setType(VariantType.DELETION); return VariantType.DELETION; } else { return VariantType.MNV; } } return variant.getType(); // return getVariantType(variant.getReference(), variant.getAlternate()); } }
public static VariantType getVariantType(Variant variant) throws UnsupportedURLVariantFormat { if (variant.getType() == null) { variant.setType(Variant.inferType(variant.getReference(), variant.getAlternate())); } // FIXME: remove the if block below as soon as the Variant.inferType method is able to differentiate between // FIXME: insertions and deletions // if (variant.getType().equals(VariantType.INDEL) || variant.getType().equals(VariantType.SV)) { if (variant.getType().equals(VariantType.INDEL)) { if (variant.getReference().isEmpty()) { // variant.setType(VariantType.INSERTION); return VariantType.INSERTION; } else if (variant.getAlternate().isEmpty()) { // variant.setType(VariantType.DELETION); return VariantType.DELETION; } else { return VariantType.MNV; } } return variant.getType(); // return getVariantType(variant.getReference(), variant.getAlternate()); } }
@Test public void resolveRefOverlap() throws Exception { Variant a = getVariant("2:10048155-10048156:", "PASS", "220", "0/0"); a.setType(NO_VARIATION); Variant b = getVariant("2:10048155:AAA:-", "PASS", "220", "0/1"); System.out.println("a.toString() = " + a.toJson()); System.out.println("b.toString() = " + b.toJson()); Collection<Variant> resolved = new VariantLocalConflictResolver().resolveConflicts(Arrays.asList(a, b)); resolved.forEach(res -> System.out.println("res.toJson() = " + res.toJson())); assertEquals(1, resolved.size()); }
mergedVariant.setType(variant.getType());
@Test public void resolve_DEL_REF() throws Exception { Variant a = getVariant("1:997:AT:-", "PASS", "390", "0/1"); Variant b = getVariant("1:997:AT:-", "PASS", "390", "0/0"); b.setEnd(1010); b.setType(NO_VARIATION); List<Variant> resolved = new VariantLocalConflictResolver().resolveConflicts(Arrays.asList(a, b)); assertEquals(2, resolved.size()); System.out.println("resolved = " + resolved); }
public static Variant asVariant(Variant v) { Variant variant = new Variant(v.getChromosome(), v.getStart(), v.getEnd(), v.getReference(), v.getAlternate(), v.getStrand()); variant.setType(v.getType()); return variant; }
@Test public void resolve_SNP_REF() throws Exception { Variant a = getVariant("1:100:A:T", "PASS", "731", "0/1"); Variant b = getVariant("1:100-103:AAAA", "PASS", "390", "0/0"); b.setType(NO_VARIATION); Collection<Variant> resolved = new VariantLocalConflictResolver().resolveConflicts(Arrays.asList(a, b)); assertEquals(2, resolved.size()); }
@Test public void resolve_INS_SNP() throws Exception { Variant a = getVariant("1:100:-:GGTTG", "PASS", "390", "0/1"); Variant b = getVariant("1:100:A:T", "PASS", "390", "0/1"); Variant c = getVariant("1:99:G:C", "PASS", "390", "0/1"); b.setType(NO_VARIATION); Collection<Variant> resolved = new VariantLocalConflictResolver().resolveConflicts(Arrays.asList(a, b, c)); assertEquals(3, resolved.size()); }
@Test public void resolve_INS_REF() throws Exception { Variant a = addAttribute(getVariantFilter("1:100:-:GGTTG", "PASS"), QUAL, "731"); Variant b = addAttribute(getVariantFilter("1:100-103:AAAA", "PASS"), QUAL, "390"); b.setType(NO_VARIATION); Collection<Variant> resolved = new VariantLocalConflictResolver().resolveConflicts(Arrays.asList(a, b)); assertEquals(2, resolved.size()); }
@Test public void resolve_INS_REF_Split() throws Exception { Variant a = addGTAndFilter(addAttribute(getVariantFilter("1:102::TTT", "PASS"), QUAL, "731"), "0/1", "PASS"); Variant b = addGTAndFilter(addAttribute(getVariantFilter("1:100-103:AAAA", "PASS"), QUAL, "390"), "0/0", "PASS"); b.setType(NO_VARIATION); List<Variant> resolved = new ArrayList<>(new VariantLocalConflictResolver().resolveConflicts(Arrays.asList(a, b))); assertEquals(3, resolved.size()); assertEquals("SiteConflict", resolved.get(2).getStudies().get(0).getSampleData("1", GENOTYPE_FILTER_KEY)); }
@Test public void resolve_INS_SNP_SEC_ALT() throws Exception { Variant a = getVariant("1:100:-:GGTTG", "PASS", "390", "1/2"); Variant b = getVariant("1:100:G:-", "PASS", "390", "0/0"); Variant c = getVariant("1:102:-:AGGA", "PASS", "390", "0/1"); b.setType(NO_VARIATION); a.getStudies().get(0).getSecondaryAlternates().add( new AlternateCoordinate(c.getChromosome(), c.getStart(), c.getEnd(), c.getReference(), c.getAlternate(), INDEL)); a.getStudies().get(0).getFiles().get(0).setCall("100:TT:GGTTGTT,TTAGGA:0"); b.getStudies().get(0).getFiles().get(0).setCall("100:TT:GGTTGTT,TTAGGA:0"); c.getStudies().get(0).getFiles().get(0).setCall("100:TT:GGTTGTT,TTAGGA:1"); Collection<Variant> resolved = new VariantLocalConflictResolver().resolveConflicts(Arrays.asList(a, b, c)); assertEquals(2, resolved.size()); }
public static Variant asVariant(Variant a, AlternateCoordinate altA) { String chr = ObjectUtils.firstNonNull(altA.getChromosome(), a.getChromosome()); Integer start = ObjectUtils.firstNonNull(altA.getStart(), a.getStart()); Integer end = ObjectUtils.firstNonNull(altA.getEnd(), a.getEnd()); String ref = ObjectUtils.firstNonNull(altA.getReference(), a.getReference()); String alt = ObjectUtils.firstNonNull(altA.getAlternate(), a.getAlternate()); VariantType type = ObjectUtils.firstNonNull(altA.getType(), a.getType()); try { Variant variant = new Variant(chr, start, end, ref, alt); variant.setType(type); return variant; } catch (IllegalArgumentException e) { String msg = altA + "\n" + a.toJson() + "\n"; throw new IllegalStateException(msg, e); } }
public static Variant getMateBreakend(Variant variant) { // Check variant does have a mate if (variant.getSv() != null && variant.getSv().getBreakend() != null && variant.getSv().getBreakend().getMate() != null) { Variant mate = new Variant(variant.getSv().getBreakend().getMate().getChromosome(), variant.getSv().getBreakend().getMate().getPosition(), null, null); mate.setType(VariantType.BREAKEND); mate.setSv(getMateStructuralVariation(variant)); return mate; } else { return null; } }
public Variant convert(VcfSliceProtos.VcfRecord vcfRecord, String chromosome, int slicePosition) { int start = getStart(vcfRecord, slicePosition); int end = getEnd(vcfRecord, slicePosition); Variant variant = new Variant(chromosome, start, end, vcfRecord.getReference(), vcfRecord.getAlternate()); variant.setType(getVariantType(vcfRecord.getType())); variant.setIds(vcfRecord.getIdNonDefaultList()); variant.resetLength(); FileEntry fileEntry = new FileEntry(); fileEntry.setFileId(fileId); Map<String, String> attributes = getFileAttributes(vcfRecord); fileEntry.setAttributes(attributes); fileEntry.setCall(vcfRecord.getCall().isEmpty() ? null : vcfRecord.getCall()); if (vcfRecord.getType().equals(VariantProto.VariantType.NO_VARIATION)) { attributes.put("END", Integer.toString(end)); } StudyEntry studyEntry = new StudyEntry(studyId); studyEntry.setFiles(Collections.singletonList(fileEntry)); studyEntry.setFormat(getFormat(vcfRecord)); studyEntry.setSamplesData(getSamplesData(vcfRecord, studyEntry.getFormatPositions())); studyEntry.setSamplesPosition(retrieveSamplePosition()); studyEntry.getFormatPositions(); // Initialize the map List<VariantProto.AlternateCoordinate> alts = vcfRecord.getSecondaryAlternatesList(); studyEntry.setSecondaryAlternates(getAlternateCoordinates(alts)); variant.addStudyEntry(studyEntry); studyEntry.getFormatPositions(); // Initialize the map return variant; }