Skip to content

Commit

Permalink
Move bam-magic checking to file opening
Browse files Browse the repository at this point in the history
  • Loading branch information
totakke committed Apr 25, 2014
1 parent 8edaead commit 91dd40a
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 25 deletions.
2 changes: 1 addition & 1 deletion src/cljam/bam/common.clj
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
(ns cljam.bam.common)

(def ^String bam-magic "BAM\1")
(def bam-magic "BAM\1")

(def ^:const fixed-block-size 32)
44 changes: 24 additions & 20 deletions src/cljam/bam/core.clj
Original file line number Diff line number Diff line change
@@ -1,36 +1,42 @@
(ns cljam.bam.core
"The core of BAM features."
(:require [clojure.java.io :refer [file]]
[me.raynes.fs :as fs]
[cljam.io]
(cljam.bam [reader :as reader]
[cljam.lsb :as lsb]
(cljam.bam [common :refer [bam-magic]]
[reader :as reader]
[writer :as writer])
[cljam.bam-index :as bai])
(:import java.util.Arrays
[java.io DataInputStream DataOutputStream IOException EOFException]
[java.io DataInputStream DataOutputStream IOException]
[bgzf4j BGZFInputStream BGZFOutputStream]
[java.nio ByteBuffer ByteOrder]))
cljam.bam.reader.BAMReader
cljam.bam.writer.BAMWriter))

;;;
;;; reader
;;;
;; Reading
;; -------

(defn- bam-index [f & {:keys [ignore]
:or {ignore false}}]
(if-not ignore
(let [bai-f (str f ".bai")]
(if (.exists (file bai-f))
(if (fs/exists? bai-f)
(bai/bam-index bai-f)
(throw (IOException. "Could not find BAM Index file"))))))

(defn reader [f {:keys [ignore-index]
:or {ignore-index false}}]
(defn ^BAMReader reader [f {:keys [ignore-index]
:or {ignore-index false}}]
(let [rdr (BGZFInputStream. (file f))
data-rdr (DataInputStream. rdr)]
(when-not (Arrays/equals ^bytes (lsb/read-bytes data-rdr 4) (.getBytes ^String bam-magic))
(throw (IOException. "Invalid BAM file")))
(let [{:keys [header refs]} (reader/load-headers data-rdr)
index (bam-index f :ignore ignore-index)]
(cljam.bam.reader.BAMReader. (.getAbsolutePath (file f))
header refs rdr data-rdr index))))
(BAMReader. (.getAbsolutePath (file f))
header refs rdr data-rdr index))))

(extend-type cljam.bam.reader.BAMReader
(extend-type BAMReader
cljam.io/ISAMReader
(reader-path [this]
(.f this))
Expand All @@ -54,16 +60,14 @@
(read-coordinate-blocks [this]
(reader/read-blocks-sequentially* this :coordinate)))

;; Writing
;; -------

;;
;; writer
;;
(defn ^BAMWriter writer [f]
(BAMWriter. (.getAbsolutePath (file f))
(DataOutputStream. (BGZFOutputStream. (file f)))))

(defn writer [f]
(cljam.bam.writer.BAMWriter. (.getAbsolutePath (file f))
(DataOutputStream. (BGZFOutputStream. (file f)))))

(extend-type cljam.bam.writer.BAMWriter
(extend-type BAMWriter
cljam.io/ISAMWriter
(writer-path [this]
(.f this))
Expand Down
6 changes: 2 additions & 4 deletions src/cljam/bam/reader.clj
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
compressed-bases->chars
parse-header]]
[cljam.bam-index :refer [get-spans]]
[cljam.bam.common :refer [bam-magic fixed-block-size]]
[cljam.bam.common :refer [fixed-block-size]]
[cljam.bam.decoder :as decoder])
(:import java.util.Arrays
[java.io DataInputStream Closeable IOException EOFException]
[java.io DataInputStream Closeable EOFException]
[java.nio ByteBuffer ByteOrder]
[bgzf4j BGZFInputStream]))

Expand Down Expand Up @@ -235,8 +235,6 @@

(defn load-headers
[rdr]
(when-not (Arrays/equals ^bytes (lsb/read-bytes rdr 4) (.getBytes bam-magic))
(throw (IOException. "Invalid BAM file header")))
(let [header (parse-header (lsb/read-string rdr (lsb/read-int rdr)))
n-ref (lsb/read-int rdr)
refs (loop [i n-ref, ret []]
Expand Down

0 comments on commit 91dd40a

Please sign in to comment.