Skip to content

Commit ff4e0bc

Browse files
committed
feat: add fn that returns exon/intron region of the given pos
1 parent 83d0846 commit ff4e0bc

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

src/varity/ref_gene.clj

+22
Original file line numberDiff line numberDiff line change
@@ -526,3 +526,25 @@
526526
:else
527527
(throw (ex-info "The coordinate is invalid for the refGene."
528528
{:type ::invalid-coordinate, :coordinate coord}))))))
529+
530+
(defn- ranges->regions
531+
[ranges region strand]
532+
(let [ranges (if (= strand :forward)
533+
ranges
534+
(reverse ranges))]
535+
(map-indexed (fn [idx range] {:range range
536+
:region region
537+
:index (inc idx)
538+
:length (count ranges)})
539+
ranges)))
540+
541+
(defn pos->region
542+
"Returns exon or intron region of the given position"
543+
[pos {:keys [strand exon-ranges]}]
544+
(let [intron-ranges (exon-ranges->intron-ranges exon-ranges)
545+
regions (concat (ranges->regions exon-ranges "exon" strand)
546+
(ranges->regions intron-ranges "intron" strand))
547+
include-pos? (fn [{:keys [range]}]
548+
(let [[s e] range]
549+
(<= s pos e)))]
550+
(first (filter include-pos? regions))))

test/varity/ref_gene_test.clj

+24
Original file line numberDiff line numberDiff line change
@@ -544,3 +544,27 @@
544544
"5+1" :reverse
545545
"4-1" :reverse
546546
"3+1" :reverse)))
547+
548+
(deftest ranges->regions-test
549+
(let [ranges [[10 20] [30 40] [50 60]]]
550+
(is (= (#'rg/ranges->regions ranges "exon" :forward)
551+
[{:range [10 20] :region "exon" :index 1 :length 3}
552+
{:range [30 40] :region "exon" :index 2 :length 3}
553+
{:range [50 60] :region "exon" :index 3 :length 3}]))
554+
(is (= (#'rg/ranges->regions ranges "exon" :reverse)
555+
[{:range [50 60] :region "exon" :index 1 :length 3}
556+
{:range [30 40] :region "exon" :index 2 :length 3}
557+
{:range [10 20] :region "exon" :index 3 :length 3}]))))
558+
559+
(deftest pos->region
560+
(let [ranges [[10 20] [30 40] [50 60]]]
561+
(testing "forward"
562+
(are [pos pred] (= (rg/pos->region pos {:strand :forward :exon-ranges ranges})
563+
pred)
564+
10 {:range [10 20] :region "exon" :index 1 :length 3}
565+
25 {:range [21 29] :region "intron" :index 1 :length 2}))
566+
(testing "reverse"
567+
(are [pos pred] (= (rg/pos->region pos {:strand :reverse :exon-ranges ranges})
568+
pred)
569+
10 {:range [10 20] :region "exon" :index 3 :length 3}
570+
25 {:range [21 29] :region "intron" :index 2 :length 2}))))

0 commit comments

Comments
 (0)