From 6bce511488844ad90c79cf7673bdd4994d8f97d1 Mon Sep 17 00:00:00 2001 From: Terry Date: Tue, 21 Jan 2025 15:45:52 -0500 Subject: [PATCH 1/3] Add constructor to HaplotypeGraph that takes a directory --- .../net/maizegenetics/phgv2/api/HaplotypeGraph.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/kotlin/net/maizegenetics/phgv2/api/HaplotypeGraph.kt b/src/main/kotlin/net/maizegenetics/phgv2/api/HaplotypeGraph.kt index db3cabea..2828fc2e 100644 --- a/src/main/kotlin/net/maizegenetics/phgv2/api/HaplotypeGraph.kt +++ b/src/main/kotlin/net/maizegenetics/phgv2/api/HaplotypeGraph.kt @@ -39,6 +39,20 @@ class HaplotypeGraph(hvcfFiles: List) { // Map private lateinit var altHeaderMap: Map + constructor(hvcfDirectory: String) : this( + File(hvcfDirectory) + .walk() + .filter { + it.isFile && (it.name.endsWith(".h.vcf") || it.name.endsWith(".h.vcf.gz") || + it.name.endsWith(".hvcf") || it.name.endsWith(".hvcf.gz")) + } + .map { it.absolutePath } + .toList() + ) { + require(File(hvcfDirectory).exists()) { "HVCF directory does not exist: $hvcfDirectory" } + require(File(hvcfDirectory).isDirectory) { "Provided path is not a directory: $hvcfDirectory" } + } + init { getSampleNamesALTHeaders(hvcfFiles) From 34bf6d93f043a8bfc8afe27e9729d9ca68cef295 Mon Sep 17 00:00:00 2001 From: Terry Date: Tue, 21 Jan 2025 16:15:25 -0500 Subject: [PATCH 2/3] Added unit test for new HaplotypeGraph constructor --- .../phgv2/api/HaplotypeGraphTest.kt | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/src/test/kotlin/net/maizegenetics/phgv2/api/HaplotypeGraphTest.kt b/src/test/kotlin/net/maizegenetics/phgv2/api/HaplotypeGraphTest.kt index c03d974e..6da49ce2 100644 --- a/src/test/kotlin/net/maizegenetics/phgv2/api/HaplotypeGraphTest.kt +++ b/src/test/kotlin/net/maizegenetics/phgv2/api/HaplotypeGraphTest.kt @@ -1,15 +1,33 @@ package net.maizegenetics.phgv2.api import net.maizegenetics.phgv2.cli.TestExtension +import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows import org.junit.jupiter.api.extension.ExtendWith +import java.io.File import kotlin.test.assertEquals import kotlin.test.assertTrue @ExtendWith(TestExtension::class) class HaplotypeGraphTest { + companion object { + + private val multiInputDir = "${TestExtension.tempDir}/graph-input-dir/" + + @BeforeAll + @JvmStatic + fun setup() { + File(multiInputDir).mkdirs() + + File(TestExtension.smallseqRefHvcfFile).copyTo(File(multiInputDir + File(TestExtension.smallseqRefHvcfFile).name)) + File(TestExtension.smallseqLineAHvcfFile).copyTo(File(multiInputDir + File(TestExtension.smallseqLineAHvcfFile).name)) + File(TestExtension.smallseqLineBHvcfFile).copyTo(File(multiInputDir + File(TestExtension.smallseqLineBHvcfFile).name)) + } + + } + @Test fun testHaplotypeGraph() { @@ -111,6 +129,81 @@ class HaplotypeGraphTest { } + @Test + fun testDirectoryHaplotypeGraph() { + + val graph = HaplotypeGraph(multiInputDir) + + assertTrue( + graph.checksum == "9d81a63a9833793fac8712490361b297", + "checksum not 9d81a63a9833793fac8712490361b297: ${graph.checksum}" + ) + + assertEquals(40, graph.numberOfRanges(), "numOfRanges not 40: ${graph.numberOfRanges()}") + + assertEquals(3, graph.numberOfSamples(), "numOfSamples not 3: ${graph.numberOfSamples()}") + + val ranges = graph.ranges() + + assertTrue(ranges.isSorted(), "ranges not sorted") + + assertEquals(graph.numberOfRanges(), ranges.size, "ranges size not equal to numberOfRanges") + + // tests hapIdToSamples() method + + var hapIdToSamples = graph.hapIdToSampleGametes(ranges[0]) + + assertEquals(3, hapIdToSamples.size, "hapIdToSamples size not 3: ${hapIdToSamples.size}") + + var hapid = "12f0cec9102e84a161866e37072443b7" + var samples = hapIdToSamples[hapid] + assertEquals("LineA", samples?.get(0)?.name, "sample not LineA: ${samples?.get(0)?.name}") + + hapid = "4fc7b8af32ddd74e07cb49d147ef1938" + samples = hapIdToSamples[hapid] + assertEquals("LineB", samples?.get(0)?.name, "sample not LineB: ${samples?.get(0)?.name}") + + hapIdToSamples = graph.hapIdToSampleGametes(ranges[ranges.size - 2]) + hapid = "0eb9029f3896313aebc69c8489923141" + samples = hapIdToSamples[hapid] + assertEquals("LineA", samples?.get(0)?.name, "sample not LineA: ${samples?.get(0)?.name}") + + hapid = "5031218d4ac709dd51a946acd0550356" + samples = hapIdToSamples[hapid] + assertEquals("LineB", samples?.get(0)?.name, "sample not LineB: ${samples?.get(0)?.name}") + + // tests for sampleToHapId() method + + var checksum = graph.sampleToHapId(ranges[0], SampleGamete("LineA")) + assertEquals( + "12f0cec9102e84a161866e37072443b7", + checksum, + "sampleToHapId: checksum not 12f0cec9102e84a161866e37072443b7: $checksum" + ) + + checksum = graph.sampleToHapId(ranges[0], SampleGamete("LineB")) + assertEquals( + "4fc7b8af32ddd74e07cb49d147ef1938", + checksum, + "sampleToHapId: checksum not 4fc7b8af32ddd74e07cb49d147ef1938: $checksum" + ) + + checksum = graph.sampleToHapId(ranges[ranges.size - 2], SampleGamete("LineA")) + assertEquals( + "0eb9029f3896313aebc69c8489923141", + checksum, + "sampleToHapId: checksum not 0eb9029f3896313aebc69c8489923141: $checksum" + ) + + checksum = graph.sampleToHapId(ranges[ranges.size - 2], SampleGamete("LineB")) + assertEquals( + "5031218d4ac709dd51a946acd0550356", + checksum, + "sampleToHapId: checksum not 5031218d4ac709dd51a946acd0550356: $checksum" + ) + + } + @Test fun testBadInputHaplotypeGraph() { // ALT tag does not contain sample name From 2edbeea290a81ac9b6ca4c31697bec324ae4982b Mon Sep 17 00:00:00 2001 From: Terry Date: Tue, 21 Jan 2025 16:53:44 -0500 Subject: [PATCH 3/3] Corrected HaplotypeGraphTest --- .../kotlin/net/maizegenetics/phgv2/api/HaplotypeGraphTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/kotlin/net/maizegenetics/phgv2/api/HaplotypeGraphTest.kt b/src/test/kotlin/net/maizegenetics/phgv2/api/HaplotypeGraphTest.kt index 6da49ce2..823215e4 100644 --- a/src/test/kotlin/net/maizegenetics/phgv2/api/HaplotypeGraphTest.kt +++ b/src/test/kotlin/net/maizegenetics/phgv2/api/HaplotypeGraphTest.kt @@ -135,8 +135,8 @@ class HaplotypeGraphTest { val graph = HaplotypeGraph(multiInputDir) assertTrue( - graph.checksum == "9d81a63a9833793fac8712490361b297", - "checksum not 9d81a63a9833793fac8712490361b297: ${graph.checksum}" + graph.checksum == "1e3d5c6ed7d43c1725542d826a515b16", + "checksum not 1e3d5c6ed7d43c1725542d826a515b16: ${graph.checksum}" ) assertEquals(40, graph.numberOfRanges(), "numOfRanges not 40: ${graph.numberOfRanges()}")