File tree Expand file tree Collapse file tree 2 files changed +46
-0
lines changed
Expand file tree Collapse file tree 2 files changed +46
-0
lines changed Original file line number Diff line number Diff line change 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))))
Original file line number Diff line number Diff line change 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 }))))
You can’t perform that action at this time.
0 commit comments