diff --git a/src/bam/reader.jl b/src/bam/reader.jl index 43e228e..3dd2f7f 100644 --- a/src/bam/reader.jl +++ b/src/bam/reader.jl @@ -8,7 +8,7 @@ Create a data reader of the BAM file format. # Arguments * `input`: data source -* `index=nothing`: filepath to a random access index (currently *bai* is supported) +* `index=nothing`: filepath to a random access index (currently *bai* is supported) or BAI object """ mutable struct Reader{T} <: BioGenerics.IO.AbstractReader stream::BGZFStreams.BGZFStream{T} @@ -28,13 +28,8 @@ function BioGenerics.IO.stream(reader::Reader) end function Reader(input::IO; index=nothing) - if isa(index, AbstractString) - index = BAI(index) - elseif index != nothing - error("unrecognizable index argument") - end reader = init_bam_reader(input) - reader.index = index + reader.index = init_bam_index(index) return reader end @@ -125,6 +120,11 @@ function init_bam_reader(input::IO) return init_bam_reader(BGZFStreams.BGZFStream(input)) end +init_bam_index(index::AbstractString) = BAI(index) +init_bam_index(index::BAI) = index +init_bam_index(index::Nothing) = nothing +init_bam_index(index) = error("unrecognizable index argument") + function _read!(reader::Reader, record) unsafe_read( reader.stream, diff --git a/test/test_bam.jl b/test/test_bam.jl index 1f2e8ac..f10bb72 100644 --- a/test/test_bam.jl +++ b/test/test_bam.jl @@ -241,6 +241,21 @@ end + @testset "BAI" begin + + filepath = joinpath(bamdir, "GSE25840_GSM424320_GM06985_gencode_spliced.head.bam") + + index = BAM.BAI(filepath * ".bai") + reader = open(BAM.Reader, filepath, index=index) + + @test isa(eachoverlap(reader, "chr1", 1:100), BAM.OverlapIterator) + + close(reader) + + @test_throws ErrorException open(BAM.Reader, filepath, index=1234) + + end + @testset "Random access" begin filepath = joinpath(bamdir, "GSE25840_GSM424320_GM06985_gencode_spliced.head.bam") reader = open(BAM.Reader, filepath, index=filepath * ".bai")