From 0ebdc74f1bda34d392be828754c0bc831c069c82 Mon Sep 17 00:00:00 2001 From: Avishai Weissberg Date: Mon, 20 Apr 2026 16:06:40 -0700 Subject: [PATCH] feat: add transcript.length --- genome_kit/genome_annotation.py | 13 +++++++++++++ tests/test_genome_annotation.py | 6 ++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/genome_kit/genome_annotation.py b/genome_kit/genome_annotation.py index 4f7726c9..5da539cb 100644 --- a/genome_kit/genome_annotation.py +++ b/genome_kit/genome_annotation.py @@ -603,6 +603,19 @@ def utr3s(self): # pragma: no cover mock_unreachable() return [Utr()] + @property + def length(self) -> int: + """The total length of this transcript, summing all exon lengths (includes UTRs).""" + return sum(len(exon) for exon in self.exons) + + @property + def length_cds(self) -> int: + """The CDS-only length of this transcript, summing all CDS element lengths. + + Returns 0 for non-coding transcripts. + """ + return sum(len(cds) for cds in self.cdss) + def __getstate__(self) -> bytes: genome = self.annotation_genome return pickle.dumps([genome, genome.transcripts.index_of(self)]) diff --git a/tests/test_genome_annotation.py b/tests/test_genome_annotation.py index ac77cf50..cf6b0a1f 100644 --- a/tests/test_genome_annotation.py +++ b/tests/test_genome_annotation.py @@ -1,11 +1,7 @@ # Copyright (C) 2016-2023 Deep Genomics Inc. All Rights Reserved. -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import unittest import gc import os -import genome_kit from genome_kit import Genome from genome_kit import GenomeAnnotation from genome_kit import GeneTable @@ -476,6 +472,8 @@ def test_transcript_attributes(self): self.assertEqual(len(tran.cdss), 4) self.assertEqual(len(tran.utr5s), 1) self.assertEqual(len(tran.utr3s), 1) + self.assertEqual(tran.length, 2895) # 515 + 227 + 197 + 1956 + self.assertEqual(tran.length_cds, 2514) # 352 + 227 + 197 + 1738 self.assertIsInstance(tran, Interval) self.assertIsInstance(tran.__repr__(), str)