From 91dd40a489e9b509365920359c4db9bbecdd1b72 Mon Sep 17 00:00:00 2001 From: Toshiki TAKEUCHI Date: Fri, 25 Apr 2014 14:30:48 +0900 Subject: [PATCH] Move bam-magic checking to file opening --- src/cljam/bam/common.clj | 2 +- src/cljam/bam/core.clj | 44 ++++++++++++++++++++++------------------ src/cljam/bam/reader.clj | 6 ++---- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/cljam/bam/common.clj b/src/cljam/bam/common.clj index 92fb3b69..654a9a95 100644 --- a/src/cljam/bam/common.clj +++ b/src/cljam/bam/common.clj @@ -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) diff --git a/src/cljam/bam/core.clj b/src/cljam/bam/core.clj index 8ef3b7a0..9cc07a61 100644 --- a/src/cljam/bam/core.clj +++ b/src/cljam/bam/core.clj @@ -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)) @@ -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)) diff --git a/src/cljam/bam/reader.clj b/src/cljam/bam/reader.clj index 9787bfe6..8994e8d3 100644 --- a/src/cljam/bam/reader.clj +++ b/src/cljam/bam/reader.clj @@ -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])) @@ -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 []]