(ns cljam.io.cram.core (:require [cljam.io.crai :as crai] [cljam.io.cram.reader :as reader] [cljam.io.cram.seq-resolver :as resolver] [cljam.io.sam.util.refs :as util.refs] [cljam.io.util.byte-buffer :as bb] [cljam.util :as util] [clojure.java.io :as cio] [clojure.string :as str]) (:import [cljam.io.cram.reader CRAMReader] [java.io FileNotFoundException] [java.net URL] [java.nio.channels FileChannel] [java.nio.file OpenOption StandardOpenOption])) | |
(defn- qname-generator [^URL url] (let [prefix (-> (.getPath url) (str/replace #"^.*/" ) (str/replace #"[^!-?A-~]+" "_")) len (inc (count prefix))] (fn [i] (let [digits (str (inc (long i))) len' (+ len (count digits))] (cond-> (str prefix \: digits) (> len' 254) (subs (- len' 254) len')))))) | |
Creates a new CRAM reader that reads a CRAM file f. Takes an option map as the second argument. An option map consists of: - reference: a string representing the path to a reference file | (defn reader ^CRAMReader [f {:keys [reference]}] (let [file (cio/file f) url (util/as-url (.getAbsolutePath file)) ch (FileChannel/open (.toPath file) (into-array OpenOption [StandardOpenOption/READ])) bb (bb/allocate-lsb-byte-buffer 256) seq-resolver (some-> reference resolver/seq-resolver) qname-gen (qname-generator url) header (volatile! nil) refs (delay (vec (util.refs/make-refs @header))) offset (volatile! nil) idx (delay (try (crai/read-index (str f ".crai") @refs) (catch FileNotFoundException _ nil))) rdr (reader/->CRAMReader url ch bb header refs offset idx seq-resolver qname-gen)] (reader/read-file-definition rdr) (vreset! header (reader/read-header rdr)) (vreset! offset (.position ch)) rdr)) |
Creates a cloned CRAM reader based on the given CRAM reader. | (defn clone-reader ^CRAMReader [^CRAMReader rdr] (let [url (.-url rdr) file (cio/as-file url) ch (FileChannel/open (.toPath file) (into-array OpenOption [StandardOpenOption/READ])) bb (bb/allocate-lsb-byte-buffer 256) seq-resolver (some-> (.-seq-resolver rdr) resolver/clone-seq-resolver) rdr' (reader/->CRAMReader url ch bb (delay @(.-header rdr)) (delay @(.-refs rdr)) (delay @(.-offset rdr)) (delay @(.-index rdr)) seq-resolver (.-qname-generator rdr))] (reader/read-file-definition rdr') (reader/skip-container rdr') rdr')) |