@@ -9,6 +9,7 @@ import htsjdk.samtools.SAMSequenceRecord
99import htsjdk .samtools .SAMTag .{AS , NM }
1010import io .cvbio .neodisambiguate .CommonsDef .BamExtension
1111import io .cvbio .neodisambiguate .DisambiguationStrategy .Classic
12+ import io .cvbio .neodisambiguate .Disambiguate .NeodisambiguateConf
1213import io .cvbio .neodisambiguate .testing .{TemplateBuilder , UnitSpec }
1314
1415class DisambiguateTest extends UnitSpec {
@@ -113,7 +114,7 @@ class DisambiguateTest extends UnitSpec {
113114 val input = builder.toTempFile(deleteOnExit = true )
114115 val prefix = PathUtil .pathTo(dir.toString, more = " insilico" )
115116
116- val disambiguate = new Disambiguate (input = Seq (input), prefix = prefix)
117+ val disambiguate = new Disambiguate (input = Seq (input), prefix = prefix, referenceNames = Seq ( " hg38 " ) )
117118 disambiguate.execute()
118119
119120 val source = SamSource (PathUtil .pathTo(Seq (prefix, assembly).mkString(" ." ) + BamExtension ))
@@ -152,4 +153,76 @@ class DisambiguateTest extends UnitSpec {
152153
153154 Io .assertWritableDirectory(PathUtil .pathTo(dir.toString, more = " ambiguous-alignments" )) // will raise exception if non-existent.
154155 }
156+
157+ it should " write out ambiguous templates to ambiguous-specific BAM files" in {
158+ val humanAssembly : String = " hg38"
159+ val mouseAssembly : String = " mm10"
160+ val dir : DirPath = Io .makeTempDir(" disambiguate" )
161+ // dir.toFile.deleteOnExit()
162+
163+ val humanBuilder = new SamBuilder (sort = Some (SamOrder .Queryname ))
164+ val mouseBuilder = new SamBuilder (sort = Some (SamOrder .Queryname ))
165+
166+ val humanPair = humanBuilder.addPair(name = " pair" , attrs = Map (NM .toString -> 2 , AS .toString -> 32 ), start1 = 2 , start2 = 101 )
167+ val mousePair = mouseBuilder.addPair(name = " pair" , attrs = Map (NM .toString -> 2 , AS .toString -> 32 ), start1 = 2 , start2 = 101 )
168+
169+ humanBuilder.header.getSequenceDictionary.getSequences.forEach { seq : SAMSequenceRecord => val _ = seq.setAssembly(humanAssembly) }
170+ mouseBuilder.header.getSequenceDictionary.getSequences.forEach { seq : SAMSequenceRecord => val _ = seq.setAssembly(mouseAssembly) }
171+
172+ val prefix = PathUtil .pathTo(dir.toString, more = " insilico" )
173+
174+ val humanBam = humanBuilder.toTempFile(deleteOnExit = false )
175+ val mouseBam = mouseBuilder.toTempFile(deleteOnExit = false )
176+
177+ val disambiguate = new Disambiguate (input = Seq (mouseBam, humanBam), prefix = prefix)
178+ disambiguate.execute()
179+
180+ val humanSource = SamSource (PathUtil .pathTo(Seq (prefix, humanAssembly).mkString(" ." ) + BamExtension ))
181+ val mouseSource = SamSource (PathUtil .pathTo(Seq (prefix, mouseAssembly).mkString(" ." ) + BamExtension ))
182+
183+ humanSource.iterator.toSeq shouldBe empty
184+ mouseSource.iterator.toSeq shouldBe empty
185+
186+ val ambiguousAlignments = PathUtil .pathTo(dir.toString, more = " ambiguous-alignments" )
187+
188+ Io .assertWritableDirectory(ambiguousAlignments) // will raise exception if non-existent.
189+
190+ val ambiguousHumanSource = SamSource (ambiguousAlignments.resolve(PathUtil .replaceExtension(humanBam.getFileName, " .ambiguous" + BamExtension )))
191+ val ambiguousMouseSource = SamSource (ambiguousAlignments.resolve(PathUtil .replaceExtension(mouseBam.getFileName, " .ambiguous" + BamExtension )))
192+
193+ ambiguousHumanSource.map(_.name).toSeq should contain theSameElementsInOrderAs humanPair.map(_.name)
194+ ambiguousMouseSource.map(_.name).toSeq should contain theSameElementsInOrderAs mousePair.map(_.name)
195+ }
196+
197+ " NeoNeodisambiguate" should " run end-to-end via the CLI entrypoint" in {
198+ val humanAssembly : String = " hg38"
199+ val mouseAssembly : String = " mm10"
200+ val dir : DirPath = Io .makeTempDir(" disambiguate" )
201+ dir.toFile.deleteOnExit()
202+
203+ val humanBuilder = new SamBuilder (sort = Some (SamOrder .Queryname ))
204+ val mouseBuilder = new SamBuilder (sort = Some (SamOrder .Queryname ))
205+
206+ val _ = humanBuilder.addPair(name = " pair" , attrs = Map (NM .toString -> 6 , AS .toString -> 32 ), start1 = 2 , start2 = 101 )
207+ val mousePair = mouseBuilder.addPair(name = " pair" , attrs = Map (NM .toString -> 2 , AS .toString -> 32 ), start1 = 2 , start2 = 101 )
208+
209+ humanBuilder.header.getSequenceDictionary.getSequences.forEach { seq : SAMSequenceRecord => val _ = seq.setAssembly(humanAssembly) }
210+ mouseBuilder.header.getSequenceDictionary.getSequences.forEach { seq : SAMSequenceRecord => val _ = seq.setAssembly(mouseAssembly) }
211+
212+ val prefix = PathUtil .pathTo(dir.toString, more = " insilico" )
213+
214+ val mouseBam = mouseBuilder.toTempFile(deleteOnExit = true )
215+ val humanBam = humanBuilder.toTempFile(deleteOnExit = true )
216+
217+ val conf = new NeodisambiguateConf (args = Seq (" --input" , mouseBam.toString, humanBam.toString, " --output" , prefix.toString))
218+ Disambiguate .main(Array .from(conf.args))
219+
220+ val humanSource = SamSource (PathUtil .pathTo(Seq (prefix, humanAssembly).mkString(" ." ) + BamExtension ))
221+ val mouseSource = SamSource (PathUtil .pathTo(Seq (prefix, mouseAssembly).mkString(" ." ) + BamExtension ))
222+
223+ humanSource.iterator.toSeq shouldBe empty
224+ mouseSource.map(_.name).toSeq should contain theSameElementsInOrderAs mousePair.map(_.name)
225+
226+ Io .assertWritableDirectory(PathUtil .pathTo(dir.toString, more = " ambiguous-alignments" )) // will raise exception if non-existent.
227+ }
155228}
0 commit comments