Commit ff4e0bc 1 parent 83d0846 commit ff4e0bc Copy full SHA for ff4e0bc
File tree 2 files changed +46
-0
lines changed
2 files changed +46
-0
lines changed Original file line number Diff line number Diff line change 526
526
:else
527
527
(throw (ex-info " The coordinate is invalid for the refGene."
528
528
{: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))))
Original file line number Diff line number Diff line change 544
544
" 5+1" :reverse
545
545
" 4-1" :reverse
546
546
" 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 }))))
You can’t perform that action at this time.
0 commit comments