Skip to content

Commit 85f9691

Browse files
committed
feat: add isConsensus method
1 parent 8d31cf3 commit 85f9691

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

src/main/scala/com/fulcrumgenomics/bam/api/SamRecord.scala

+5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ package com.fulcrumgenomics.bam.api
2727

2828
import com.fulcrumgenomics.FgBioDef._
2929
import com.fulcrumgenomics.alignment.Cigar
30+
import com.fulcrumgenomics.umi.ConsensusTags.PerRead.AllPerReadTags
3031
import htsjdk.samtools
3132
import htsjdk.samtools.SamPairUtil.PairOrientation
3233
import htsjdk.samtools._
@@ -269,6 +270,10 @@ trait SamRecord {
269270
SamPairUtil.getPairOrientation(this) == PairOrientation.FR
270271
}
271272

273+
def isConsensus: Boolean = {
274+
AllPerReadTags.exists(this.contains)
275+
}
276+
272277
/** Clone method that does a "reasonably deep" clone. The bases and quals are cloned as is the attributes map,
273278
* though not the values in the attributes map. */
274279
override def clone(): SamRecord = {

src/test/scala/com/fulcrumgenomics/bam/api/SamRecordTest.scala

+14
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ package com.fulcrumgenomics.bam.api
2727
import com.fulcrumgenomics.alignment.Cigar
2828
import com.fulcrumgenomics.testing.SamBuilder.{Minus, Plus}
2929
import com.fulcrumgenomics.testing.{SamBuilder, UnitSpec}
30+
import com.fulcrumgenomics.umi.ConsensusTags.PerRead.AllPerReadTags
3031
import htsjdk.samtools.TextCigarCodec
3132
import org.scalatest.OptionValues
3233

@@ -289,4 +290,17 @@ class SamRecordTest extends UnitSpec with OptionValues {
289290
rec1.matesOverlap shouldBe None // Mate's start is not enclosed by rec, and mate's end cannot be determined
290291
rec2.matesOverlap.value shouldBe true // Mate's start is enclosed by rec, regardless of where mate end is
291292
}
293+
294+
"SamRecord.isConsensus" should "return false for reads without consensus tags" in {
295+
val builder = new SamBuilder(sort=Some(SamOrder.Coordinate), readLength=10, baseQuality=20)
296+
builder.addFrag(start=100).exists(_.isConsensus) shouldBe false
297+
builder.addPair(start1=100, start2=100, unmapped2=true).exists(_.isConsensus) shouldBe false
298+
}
299+
300+
it should "return true for reads with consensus tags" in {
301+
val builder = new SamBuilder(sort=Some(SamOrder.Coordinate), readLength=10, baseQuality=20)
302+
AllPerReadTags.forall(
303+
tag => builder.addFrag(start=10, attrs=Map(tag -> 123)).exists(_.isConsensus)
304+
) shouldBe true
305+
}
292306
}

0 commit comments

Comments
 (0)