diff --git a/src/cljam/bam.clj b/src/cljam/bam.clj index 1c64c66d..d542ad09 100644 --- a/src/cljam/bam.clj +++ b/src/cljam/bam.clj @@ -9,6 +9,11 @@ [f & option] (bam-core/reader f option)) +(defn ^BAMReader clone-reader + "Clones bam reader sharing persistent objects." + [r] + (bam-core/clone-reader r)) + (defn ^BAMWriter writer "Returns BAM file writer of f." [f] diff --git a/src/cljam/bam/core.clj b/src/cljam/bam/core.clj index 895e6199..949b120e 100644 --- a/src/cljam/bam/core.clj +++ b/src/cljam/bam/core.clj @@ -34,7 +34,15 @@ (let [{:keys [header refs]} (reader/load-headers data-rdr) index-delay (delay (bam-index f :ignore ignore-index))] (BAMReader. (.getAbsolutePath (file f)) - header refs rdr data-rdr index-delay)))) + header refs rdr data-rdr index-delay (.getFilePointer rdr))))) + +(defn ^BAMReader clone-reader + "Clones bam reader sharing persistent objects." + [^BAMReader rdr] + (let [bgzf-rdr (BGZFInputStream. (file (.f rdr))) + data-rdr (DataInputStream. bgzf-rdr)] + (.seek bgzf-rdr (.start-pos rdr)) + (BAMReader. (.f rdr) (.header rdr) (.refs rdr) bgzf-rdr data-rdr (.index-delay rdr) (.start-pos rdr)))) (extend-type BAMReader cljam.io/ISAMReader diff --git a/src/cljam/bam/reader.clj b/src/cljam/bam/reader.clj index 84c77e88..66fd21b2 100644 --- a/src/cljam/bam/reader.clj +++ b/src/cljam/bam/reader.clj @@ -12,7 +12,7 @@ ;; BAMReader ;; --------- -(deftype BAMReader [f header refs reader data-reader index-delay] +(deftype BAMReader [f header refs reader data-reader index-delay start-pos] Closeable (close [this] (.close ^Closeable (.reader this))))