package picard.fingerprint; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import picard.vcf.VcfTestUtils; import java.io.File; import java.io.IOException; import java.util.*; /** * Created by farjoun on 8/27/15. */ public class FingerprintCheckerTest { private final double maf = 0.4; private final Snp snp = new Snp("test", "chr1", 1, (byte) 'A', (byte) 'C', maf, Collections.singletonList("dummy")); private final HaplotypeBlock hb = new HaplotypeBlock(maf); private static final double DELTA = 1e-6; private static final File TEST_DATA_DIR = new File("testdata/picard/fingerprint/"); private static final File SUBSETTED_HAPLOTYPE_DATABASE_FOR_TESTING = new File(TEST_DATA_DIR, "Homo_sapiens_assembly19.haplotype_database.subset.txt"); @BeforeClass public void setup() { hb.addSnp(snp); } @Test public void testRandomSublist() throws Exception { final List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); Assert.assertEquals(list, FingerprintChecker.randomSublist(list, 3)); Assert.assertEquals(list, FingerprintChecker.randomSublist(list, 4)); Assert.assertEquals(FingerprintChecker.randomSublist(list, 2).size(), 2); } @DataProvider(name = "pLoH") public Iterator<Object[]> pLohData() { final List<Object[]> listOfDoubles = new ArrayList<>(); for (int i = 1; i < 20; i++) { listOfDoubles.add(new Object[]{i / 40D}); } return listOfDoubles.iterator(); } @Test(dataProvider = "pLoH") public void testMatchResults(final double pLoH) { final Fingerprint fpObserved = new Fingerprint("test", null, "noop"); final Fingerprint fpExpected = new Fingerprint("test", null, "noop"); final HaplotypeProbabilities hpHet = new HaplotypeProbabilitiesFromGenotype(snp, hb, 0.0001, 1.0, 0.0001); final HaplotypeProbabilities hpHomRef = new HaplotypeProbabilitiesFromGenotype(snp, hb, 1.0, 0.00001, 0.000000001); // Expected is a het fpExpected.add(hpHet); // Observed is a hom, so possible scenario is that observed is tumor, and expected is normal fpObserved.add(hpHomRef); // get match results using pLOD final MatchResults mr = FingerprintChecker.calculateMatchResults(fpObserved, fpExpected, 0.01, pLoH); // make sure that it's more likely to be the same sample, if the observed is "tumor" and the expected is "normal" Assert.assertTrue(mr.getLodTN() > mr.getLOD()); // make sure that the regular LOD is negative (we're comparing a HET to a HOM) Assert.assertTrue(mr.getLOD() < 0); // make sure that it's more likely to be tumor/normal rather than normal/tumor // (a hom normal isn't expected to be measured as a het in the tumor) Assert.assertTrue(mr.getLodTN() > mr.getLodNT()); } @DataProvider(name = "checkFingerprintsVcfDataProvider") public Object[][] testCheckFingerprintsVcfDataProvider() { return new Object[][] { {new File(TEST_DATA_DIR, "NA12891.vcf"), new File(TEST_DATA_DIR, "NA12891.fp.vcf"), "NA12891", "NA12891", -0.02128, -1.026742, 1.005462}, {new File(TEST_DATA_DIR, "NA12892.vcf"), new File(TEST_DATA_DIR, "NA12892.fp.vcf"), "NA12892", "NA12892", -0.021945, -1.08308, 1.061135}, {new File(TEST_DATA_DIR, "NA12891.vcf"), new File(TEST_DATA_DIR, "NA12892.fp.vcf"), "NA12891", "NA12892", -5.941691, -1.026742, -4.914948}, {new File(TEST_DATA_DIR, "NA12892.vcf"), new File(TEST_DATA_DIR, "NA12891.fp.vcf"), "NA12892", "NA12891", -5.998029, -1.08308, -4.914948} }; } @Test(dataProvider = "checkFingerprintsVcfDataProvider") public void testCheckFingerprints(File vcfFile, File genotypesFile, String observedSampleAlias, String expectedSampleAlias, double llExpectedSample, double llRandomSample, double lodExpectedSample) throws IOException { final File indexedInputVcf = VcfTestUtils.createTemporaryIndexedVcfFromInput(vcfFile, "fingerprintcheckertest.tmp."); final File indexedGenotypesVcf = VcfTestUtils.createTemporaryIndexedVcfFromInput(genotypesFile, "fingerprintcheckertest.tmp."); final FingerprintChecker fpChecker = new FingerprintChecker(SUBSETTED_HAPLOTYPE_DATABASE_FOR_TESTING); final List<FingerprintResults> results = fpChecker.checkFingerprints(Collections.singletonList(indexedInputVcf), Collections.singletonList(indexedGenotypesVcf), observedSampleAlias, expectedSampleAlias); Assert.assertEquals(results.size(), 1); final FingerprintResults fpr = results.get(0); Assert.assertNull(fpr.getReadGroup()); Assert.assertEquals(fpr.getSampleAlias(), observedSampleAlias); final MatchResults mr = fpr.getMatchResults().first(); Assert.assertEquals(mr.getSample(), expectedSampleAlias); Assert.assertEquals(mr.getSampleLikelihood(), llExpectedSample, DELTA); Assert.assertEquals(mr.getPopulationLikelihood(), llRandomSample, DELTA); Assert.assertEquals(mr.getLOD(), lodExpectedSample, DELTA); } }