Skip to content

Commit cfb525f

Browse files
committed
types: Rename SplicingType to TranscriptVariant
1 parent d33e8db commit cfb525f

3 files changed

Lines changed: 29 additions & 28 deletions

File tree

src/geneml/outputs.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ def get_end_coordinate(end_value, offset=offset):
5252
f"{transcript.score:.3f}",
5353
strand,
5454
".",
55-
f"ID={transcript_id};Parent={gene_id};SplicingType={transcript.splicing_type.name}",
55+
(f"ID={transcript_id};Parent={gene_id};"
56+
f"TranscriptVariant={transcript.transcript_variant.name}"),
5657
))
5758

5859
# exon records

src/geneml/splicing.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import logging
22

3-
from geneml.types import Exon, SplicingType, Transcript
3+
from geneml.types import Exon, Transcript, TranscriptVariant
44

55
logger = logging.getLogger("geneml")
66

@@ -53,8 +53,8 @@ def get_introns_in_range(introns: list[tuple[int,int]], range: tuple[int,int], s
5353
raise ValueError(f"Invalid strand: {strand}")
5454

5555

56-
def get_alternative_splicing_type(primary: Transcript, alt: Transcript) -> SplicingType:
57-
"""Classify alternative splicing events between a primary and alternative transcript.
56+
def get_alternative_transcript_variant(primary: Transcript, alt: Transcript) -> TranscriptVariant:
57+
"""Classify the transcript variant of an alternative transcript.
5858
5959
Compares intron junctions and terminal exon boundaries to detect exon skipping,
6060
alternative 3' and 5' splice sites, intron retention, and alternative first/last
@@ -66,7 +66,7 @@ def get_alternative_splicing_type(primary: Transcript, alt: Transcript) -> Splic
6666
alt: The alternative transcript being classified.
6767
6868
Returns:
69-
The assigned SplicingType for the alternative transcript.
69+
The assigned TranscriptVariant for the alternative transcript.
7070
"""
7171
assert primary.exons != alt.exons, (
7272
f"Identical transcripts: {primary.transcript_id} and {alt.transcript_id}"
@@ -110,9 +110,9 @@ def get_alternative_splicing_type(primary: Transcript, alt: Transcript) -> Splic
110110
raise ValueError(f"Invalid strand: {strand}")
111111

112112
if alt_first != primary_first:
113-
events.add(SplicingType.ALT_FIRST_EXON)
113+
events.add(TranscriptVariant.ALT_FIRST_EXON)
114114
if alt_last != primary_last:
115-
events.add(SplicingType.ALT_LAST_EXON)
115+
events.add(TranscriptVariant.ALT_LAST_EXON)
116116

117117
# 2. EXON SKIPPING
118118
for s, e in P:
@@ -121,7 +121,7 @@ def get_alternative_splicing_type(primary: Transcript, alt: Transcript) -> Splic
121121
s2, e2 = A[i + 1]
122122

123123
if s1 == s and e2 == e:
124-
events.add(SplicingType.EXON_SKIPPING)
124+
events.add(TranscriptVariant.EXON_SKIPPING)
125125
consumed_P.add((s, e))
126126
consumed_A.add((s1, e1))
127127
consumed_A.add((s2, e2))
@@ -132,7 +132,7 @@ def get_alternative_splicing_type(primary: Transcript, alt: Transcript) -> Splic
132132
s2, e2 = P[i + 1]
133133

134134
if s1 == s and e2 == e:
135-
events.add(SplicingType.EXON_SKIPPING)
135+
events.add(TranscriptVariant.EXON_SKIPPING)
136136
consumed_A.add((s, e))
137137
consumed_P.add((s1, e1))
138138
consumed_P.add((s2, e2))
@@ -148,18 +148,18 @@ def get_alternative_splicing_type(primary: Transcript, alt: Transcript) -> Splic
148148
# Skip if this is in a terminal exon already recognized as alt event
149149
at_alt_first_exon = (
150150
((s1, e1) == P[0] or (s2, e2) == A[0])
151-
and SplicingType.ALT_FIRST_EXON in events
151+
and TranscriptVariant.ALT_FIRST_EXON in events
152152
)
153153
at_alt_last_exon = (
154154
((s1, e1) == P[-1] or (s2, e2) == A[-1])
155-
and SplicingType.ALT_LAST_EXON in events
155+
and TranscriptVariant.ALT_LAST_EXON in events
156156
)
157157
if not (at_alt_first_exon or at_alt_last_exon):
158-
events.add(SplicingType.ALT_3_SPLICE_SITE)
158+
events.add(TranscriptVariant.ALT_3_SPLICE_SITE)
159159
consumed_P.add((s1, e1))
160160
consumed_A.add((s2, e2))
161161
if e1 == e2 and s1 != s2:
162-
events.add(SplicingType.ALT_5_SPLICE_SITE)
162+
events.add(TranscriptVariant.ALT_5_SPLICE_SITE)
163163
consumed_P.add((s1, e1))
164164
consumed_A.add((s2, e2))
165165

@@ -168,13 +168,13 @@ def get_alternative_splicing_type(primary: Transcript, alt: Transcript) -> Splic
168168
remaining_A = (A_set - P_set) - consumed_A
169169

170170
if remaining_P or remaining_A:
171-
events.add(SplicingType.INTRON_RETENTION)
171+
events.add(TranscriptVariant.INTRON_RETENTION)
172172

173173
assert events, (
174-
f"No splicing events detected between {primary.transcript_id} and {alt.transcript_id}; "
174+
f"No events detected between {primary.transcript_id} and {alt.transcript_id}; "
175175
f"this should not happen"
176176
)
177177

178178
if len(events) == 1:
179179
return events.pop()
180-
return SplicingType.COMPLEX
180+
return TranscriptVariant.COMPLEX

src/geneml/types.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
GeneCallNumbaType = typeof(typed.List.empty_list(GeneEventNumbaType))
1818

1919

20-
class SplicingType(Enum):
20+
class TranscriptVariant(Enum):
2121
UNKNOWN = 0
2222
PRIMARY = 1
2323
INTRON_RETENTION = 2
@@ -52,7 +52,7 @@ class Transcript:
5252
exons: tuple[Exon, ...]
5353
group_id: int = -1
5454
transcript_id: str = ""
55-
splicing_type: SplicingType = SplicingType.UNKNOWN
55+
transcript_variant: TranscriptVariant = TranscriptVariant.UNKNOWN
5656

5757
def __post_init__(self):
5858
if not self.exons:
@@ -66,17 +66,17 @@ def __post_init__(self):
6666
def set_transcript_id(self, transcript_id: str):
6767
self.transcript_id = transcript_id
6868

69-
def set_splicing_type(self, splicing_type: SplicingType):
70-
self.splicing_type = splicing_type
69+
def set_transcript_variant(self, transcript_variant: TranscriptVariant):
70+
self.transcript_variant = transcript_variant
7171

72-
def classify_splicing_type(self, primary_transcript: 'Transcript'):
73-
assert primary_transcript.splicing_type == SplicingType.PRIMARY
72+
def classify_transcript_variant(self, primary_transcript: 'Transcript'):
73+
assert primary_transcript.transcript_variant == TranscriptVariant.PRIMARY
7474

7575
if self.exons == primary_transcript.exons:
76-
return SplicingType.PRIMARY
76+
return TranscriptVariant.PRIMARY
7777

78-
from geneml.splicing import get_alternative_splicing_type
79-
return get_alternative_splicing_type(primary_transcript, self)
78+
from geneml.splicing import get_alternative_transcript_variant
79+
return get_alternative_transcript_variant(primary_transcript, self)
8080

8181
def overlaps_with(self, other: 'Transcript', ignore_strand: bool = False) -> bool:
8282
# by default only consider overlaps on the same strand
@@ -107,8 +107,8 @@ def __post_init__(self):
107107

108108
# First transcript always denotes the primary splicing type
109109
if i == 0:
110-
transcript.set_splicing_type(SplicingType.PRIMARY)
110+
transcript.set_transcript_variant(TranscriptVariant.PRIMARY)
111111
primary = transcript
112112
else:
113-
splicing_type = transcript.classify_splicing_type(primary)
114-
transcript.set_splicing_type(splicing_type)
113+
transcript_variant = transcript.classify_transcript_variant(primary)
114+
transcript.set_transcript_variant(transcript_variant)

0 commit comments

Comments
 (0)