@Override public int compare(final Pair<VariantContext,File> p1, final Pair<VariantContext,File> p2) { final VariantContext startPositionP1 = p1.getFirst(); final VariantContext startPositionP2 = p2.getFirst(); return comp.compare(startPositionP1, startPositionP2); } }
@Test public void testContigs() { final VariantContext contextOne = buildVariantContext("source", "one", 100); final VariantContext contextTwo = buildVariantContext("source", "two", 100); final List<String> contigs = getOrderedContigList(contextOne, contextTwo); Assert.assertTrue(new VariantContextComparator(contigs).compare(contextOne, contextTwo) < 0); Assert.assertTrue(new VariantContextComparator(contigs).compare(contextTwo, contextOne) > 0); }
@Test public void testCombinationOne() { final VariantContext contextOne = buildVariantContext("source", "one", 100); final VariantContext contextTwo = buildVariantContext("source", "two", 150); final List<String> contigs = getOrderedContigList(contextOne, contextTwo); Assert.assertTrue(new VariantContextComparator(contigs).compare(contextOne, contextTwo) < 0); Assert.assertTrue(new VariantContextComparator(contigs).compare(contextTwo, contextOne) > 0); }
@Test public void testCombinationTwo() { final VariantContext contextOne = buildVariantContext("source", "one", 150); final VariantContext contextTwo = buildVariantContext("source", "two", 100); final List<String> contigs = getOrderedContigList(contextOne, contextTwo); Assert.assertTrue(new VariantContextComparator(contigs).compare(contextOne, contextTwo) < 0); Assert.assertTrue(new VariantContextComparator(contigs).compare(contextTwo, contextOne) > 0); }
@Test public void testPositions() { final VariantContext contextOne = buildVariantContext("source", "one", 100); final VariantContext contextTwo = buildVariantContext("source", "one", 150); final List<String> contigs = getOrderedContigList(contextOne, contextTwo); Assert.assertTrue(new VariantContextComparator(contigs).compare(contextOne, contextTwo) < 0); Assert.assertTrue(new VariantContextComparator(contigs).compare(contextTwo, contextOne) > 0); }
@Override public VcfTuple next() { if (!hasNext()) throw new IllegalStateException("next() called while hasNext() is false."); final Optional<VariantContext> leftVariantContext = this.leftIterator.hasNext() ? Optional.of(this.leftIterator.peek()) : Optional.empty(); final Optional<VariantContext> rightVariantContext = this.rightIterator.hasNext() ? Optional.of(this.rightIterator.peek()) : Optional.empty(); // If one or the other is missing because there is no next, just return a one-sided tuple if (!leftVariantContext.isPresent() && !rightVariantContext.isPresent()) { throw new IllegalStateException("BUG: Both contexts empty."); } else if (!leftVariantContext.isPresent()) { return new VcfTuple(Optional.empty(), this.rightIterator.next().subContextFromSample(rightSample)); } else if (!rightVariantContext.isPresent()) { return new VcfTuple(this.leftIterator.next().subContextFromSample(leftSample), Optional.empty()); } else { // Otherwise check the ordering and do the right thing final int ordering = this.comparator.compare(leftVariantContext.get(), rightVariantContext.get()); if (ordering == 0) { return new VcfTuple(this.leftIterator.next().subContextFromSample(leftSample), this.rightIterator.next().subContextFromSample(rightSample)); } else if (ordering < 0) { return new VcfTuple(this.leftIterator.next().subContextFromSample(leftSample), Optional.empty()); } else { return new VcfTuple(Optional.empty(), this.rightIterator.next().subContextFromSample(rightSample)); } } }
@Override public VcfTuple next() { if (!hasNext()) throw new IllegalStateException("next() called while hasNext() is false."); final Optional<VariantContext> leftVariantContext = this.leftIterator.hasNext() ? Optional.of(this.leftIterator.peek()) : Optional.empty(); final Optional<VariantContext> rightVariantContext = this.rightIterator.hasNext() ? Optional.of(this.rightIterator.peek()) : Optional.empty(); // If one or the other is missing because there is no next, just return a one-sided tuple if (!leftVariantContext.isPresent() && !rightVariantContext.isPresent()) { throw new IllegalStateException("BUG: Both contexts empty."); } else if (!leftVariantContext.isPresent()) { return new VcfTuple(Optional.empty(), this.rightIterator.next().subContextFromSample(rightSample)); } else if (!rightVariantContext.isPresent()) { return new VcfTuple(this.leftIterator.next().subContextFromSample(leftSample), Optional.empty()); } else { // Otherwise check the ordering and do the right thing final int ordering = this.comparator.compare(leftVariantContext.get(), rightVariantContext.get()); if (ordering == 0) { return new VcfTuple(this.leftIterator.next().subContextFromSample(leftSample), this.rightIterator.next().subContextFromSample(rightSample)); } else if (ordering < 0) { return new VcfTuple(this.leftIterator.next().subContextFromSample(leftSample), Optional.empty()); } else { return new VcfTuple(Optional.empty(), this.rightIterator.next().subContextFromSample(rightSample)); } } }
@Test public void testIdentical() { final VariantContext contextOne = buildVariantContext("source", "one", 100); final List<String> contigs = getOrderedContigList(contextOne); Assert.assertEquals(0, new VariantContextComparator(contigs).compare(contextOne, contextOne)); }
if (variantIterator.hasNext()) { final VariantContext currentContext = variantIterator.next(); if (lastContext != null && comparator.compare(lastContext, currentContext) >= 0) { throw new IllegalArgumentException("First record in file " + f.getAbsolutePath() + " is not after first record in " + "previous file " + lastFile.getAbsolutePath());
if (variantIterator.hasNext()) { final VariantContext currentContext = variantIterator.next(); if (lastContext != null && comparator.compare(lastContext, currentContext) >= 0) { throw new IllegalArgumentException("First record in file " + f.getAbsolutePath() + " is not after first record in " + "previous file " + lastFile.getAbsolutePath());
@Test public void testRoundTripWithMerge() throws Exception { Path vcfPath = new Path("file://" + testVCFFileName); // run a MR job to write out a VCF file Path outputPath = doMapReduce(vcfPath, false); // merge the output VCFHeader vcfHeader = VCFHeaderReader.readHeaderFrom(new SeekableFileStream(new File(testVCFFileName))); final File outFile = File.createTempFile("testVCFWriter", testVCFFileName.substring(testVCFFileName.lastIndexOf("."))); outFile.deleteOnExit(); VCFFileMerger.mergeParts(outputPath.toUri().toString(), outFile.toURI().toString(), vcfHeader); List<VariantContext> actualVariants = new ArrayList<>(); VCFFileReader vcfFileReaderActual = parseVcf(outFile); Iterators.addAll(actualVariants, vcfFileReaderActual.iterator()); // verify the output is the same as the input List<VariantContext> expectedVariants = new ArrayList<>(); VCFFileReader vcfFileReader = parseVcf(new File(testVCFFileName)); Iterators.addAll(expectedVariants, vcfFileReader.iterator()); // use a VariantContextComparator to check variants are equal VariantContextComparator vcfRecordComparator = vcfHeader.getVCFRecordComparator(); assertEquals(expectedVariants.size(), actualVariants.size()); for (int i = 0; i < expectedVariants.size(); i++) { assertEquals(0, vcfRecordComparator.compare(expectedVariants.get(i), actualVariants.get(i))); } }
private void validateResultsForMultipleInputs(final File output, final List<Queue<String>> positionQueues) { final VCFFileReader outputReader = new VCFFileReader(output, false); final VariantContextComparator outputComparator = outputReader.getFileHeader().getVCFRecordComparator(); VariantContext last = null; final CloseableIterator<VariantContext> iterator = outputReader.iterator(); while (iterator.hasNext()) { final VariantContext outputContext = iterator.next(); final String position = getContigPosition(outputContext); for (final Queue<String> positionQueue : positionQueues) { if (position.equals(positionQueue.peek())) { positionQueue.poll(); break; } } if (last != null) Assert.assertTrue(outputComparator.compare(last, outputContext) <= 0); last = outputContext; } iterator.close(); for (final Queue<String> positionQueue : positionQueues) { Assert.assertEquals(positionQueue.size(), 0); } }
/** * Make sure that the order of the output file is identical to the order * of the input files by iterating through the output, making sure that, * if the context is an indel (snp), the next genomic position in the indel * (snp) queue is the same. Also make sure that the context is in the order * specified by the input files. */ private void validateSnpAndIndelResults(final File output, final Queue<String> indelContigPositions, final Queue<String> snpContigPositions) { final VCFFileReader outputReader = new VCFFileReader(output, false); final VariantContextComparator outputComparator = outputReader.getFileHeader().getVCFRecordComparator(); VariantContext last = null; final CloseableIterator<VariantContext> iterator = outputReader.iterator(); while (iterator.hasNext()) { final VariantContext outputContext = iterator.next(); if (outputContext.isIndel()) Assert.assertEquals(getContigPosition(outputContext), indelContigPositions.poll()); if (outputContext.isSNP()) Assert.assertEquals(getContigPosition(outputContext), snpContigPositions.poll()); if (last != null) Assert.assertTrue(outputComparator.compare(last, outputContext) <= 0); last = outputContext; } iterator.close(); // We should have polled everything off the indel (snp) queues Assert.assertEquals(indelContigPositions.size(), 0); Assert.assertEquals(snpContigPositions.size(), 0); }
assertEquals(expectedVariants.size(), actualVariants.size()); for (int i = 0; i < expectedVariants.size(); i++) { assertEquals(0, vcfRecordComparator.compare(expectedVariants.get(i), actualVariants.get(i)));
/** * Checks the ordering and total number of variant context entries in the specified output VCF file. * Does NOT check explicitly that the VC genomic positions match exactly those from the inputs. We assume this behavior from other tests. * * @param output VCF file representing the output of SortVCF * @param expectedVariantContextCount the total number of variant context entries from all input files that were merged/sorted */ private void validateSortingResults(final File output, final int expectedVariantContextCount) { final VCFFileReader outputReader = new VCFFileReader(output, false); final VariantContextComparator outputComparator = outputReader.getFileHeader().getVCFRecordComparator(); VariantContext last = null; int variantContextCount = 0; final CloseableIterator<VariantContext> iterator = outputReader.iterator(); while (iterator.hasNext()) { final VariantContext outputContext = iterator.next(); if (last != null) Assert.assertTrue(outputComparator.compare(last, outputContext) <= 0); last = outputContext; variantContextCount++; } iterator.close(); Assert.assertEquals(variantContextCount, expectedVariantContextCount); } }
if (comparator.compare(vc, lastContext) <= 0) { throw new IllegalArgumentException("First variant in file " + f.getAbsolutePath() + " is at " + vc.getContig() + ":" + vc.getStart() + " but last variant in earlier file " + lastFile.getAbsolutePath() + " is at " + lastContext.getContig() + ":" + lastContext.getStart());
if (comparator.compare(vc, lastContext) <= 0) { throw new IllegalArgumentException("First variant in file " + f.getAbsolutePath() + " is at " + vc.getContig() + ":" + vc.getStart() + " but last variant in earlier file " + lastFile.getAbsolutePath() + " is at " + lastContext.getContig() + ":" + lastContext.getStart());