@@ -195,7 +195,13 @@ def extract_features(
195195 )
196196 return [rec .to_seq_feature () for rec in gff_records ]
197197
198- def extract_exon_features (self , feature_type : str = "mRNA" ) -> list [SeqFeature ]:
198+ def extract_exon_features (
199+ self ,
200+ feature_type : str = "mRNA" ,
201+ * ,
202+ target_strand : int | None = None ,
203+ target_range : tuple [int , int ] | None = None ,
204+ ) -> list [SeqFeature ]:
199205 """Extract exon structure features
200206
201207 Extract exons based on `parent feature` and `exon` ID-Parent relation
@@ -204,6 +210,10 @@ def extract_exon_features(self, feature_type: str = "mRNA") -> list[SeqFeature]:
204210 ----------
205211 feature_type : str, optional
206212 Feature type (e.g. `mRNA`, `ncRNA` , etc...)
213+ target_strand : int | None, optional
214+ Extract target strand. If None, extract regardless of strand.
215+ target_range : tuple[int, int] | None, optional
216+ Extract target range. If None, extract regardless of range.
207217
208218 Returns
209219 -------
@@ -251,7 +261,19 @@ def extract_exon_features(self, feature_type: str = "mRNA") -> list[SeqFeature]:
251261
252262 exon_features .append (exon_feature )
253263
254- return exon_features
264+ # Filter exon features by target strand & range
265+ filter_exon_features = []
266+ for feature in exon_features :
267+ if target_strand is not None and feature .strand != target_strand :
268+ continue
269+ if target_range is not None :
270+ start , end = int (feature .location .start ), int (feature .location .end ) # type: ignore
271+ min_range , max_range = min (target_range ), max (target_range )
272+ if not min_range <= start <= end <= max_range :
273+ continue
274+ filter_exon_features .append (feature )
275+
276+ return filter_exon_features
255277
256278 ############################################################
257279 # Private Method
0 commit comments