Utility functions for SAM header. | (ns cljam.io.sam.util.header
(:refer-clojure :exclude [sorted?])
(:require [clojure.string :as cstr]
[cljam.io.sam.common :as sam-common])
(:import clojure.lang.IEditableCollection)) |
parse | |
e.g. "LN:45 SN:ref" -> {:LN 45, :SN "ref"} | (defn- parse-header-keyvalues
[keyvalues]
(into
{}
(map (fn [kv]
(let [[k v] (cstr/split kv #":" 2)]
[(keyword k)
(case k
"LN" (Integer/parseInt v)
"PI" (Integer/parseInt v)
v)])))
keyvalues)) |
e.g. "@SQ SN:ref LN:45" => [:SQ {:SN "ref" :LN 45}] | (defn parse-header-line
[line]
(let [[typ & kvs] (cstr/split line #"\t")]
[(keyword (subs typ 1)) (parse-header-keyvalues kvs)])) |
Wrap a reducing function with finalizing function. | (defn- finalize-rf
[rf f]
(fn finalize-rf-inner
([] (rf))
([x] (f (rf x)))
([x y] (rf x y)))) |
Returns a reducing function which returns a new coll with elements conjoined. | (defn- into-rf
[to]
(if (instance? IEditableCollection to)
(fn into-rf-editable
([] (transient to))
([x] (with-meta (persistent! x) (meta to)))
([r x] (conj! r x)))
(fn into-rf-non-editable
([] to)
([x] x)
([r x] (conj r x))))) |
Returns a reducing function acts like | (defn- group-by-rf
([keyfn] (group-by-rf keyfn (into-rf [])))
([keyfn rf]
(fn group-by-rf-inner
([] (transient {}))
([x] (into {} (map (fn group-by-rf-finalize [[k v]] [k (rf v)])) (persistent! x)))
([x y] (let [k (keyfn y)]
(if-let [old (get x k)]
(assoc! x k (rf old y))
(assoc! x k (rf (rf) y)))))))) |
A reducing function which builds a map from parsed headers. | (def into-header
(-> (group-by-rf first ((map second) (into-rf [])))
(finalize-rf (fn [m] (if (some? (:HD m)) (update m :HD first) m))))) |
Parse a header string, returning a map of the header. | (defn parse-header
[s]
(->> (cstr/split-lines s)
(transduce
(map parse-header-line)
into-header))) |
stringify | |
(defn- stringify-header-keyvalues [kv-map]
(cstr/join \tab
(map (fn [kv]
(let [[k v] (seq kv)]
(str (name k) \: v)))
kv-map))) | |
Converts parsed header lines to a string. | (defn stringify-header
[hdr]
(cstr/join \newline
(map (fn [h]
(let [[typ kvs] h]
(if (= typ :HD)
(str "@HD" \tab (stringify-header-keyvalues kvs))
(cstr/join \newline
(map #(str \@ (name typ) \tab (stringify-header-keyvalues %)) kvs)))))
(seq hdr)))) |
@HD | |
Overwrites format version in SAM header. | (defn update-version [header] (assoc-in header [:HD :VN] sam-common/sam-version)) |
Unknown sorting order of alignments. Unsorted of alignments. Coordinate sorting order of alignments. queryname sorting order of alignments. | (def ^:const order-unknown :unknown) (def ^:const order-unsorted :unsorted) (def ^:const order-coordinate :coordinate) (def ^:const order-queryname :queryname) |
Replaces the sorting order field in SAM header. | (defn sorted-by [order header] (assoc-in header [:HD :SO] (name order))) |
Returns sorting order of the sam as Keyword. Returning order is one of the following: :queryname, :coordinate, :unsorted, :unknown. | (defn sort-order [header] (or (keyword (:SO (:HD header))) order-unknown)) |
Returns true if the sam is sorted, false if not. It is detected by
| (defn sorted?
[header]
(let [so (:SO (:HD header))]
(or (= so (name order-queryname))
(= so (name order-coordinate))))) |