Skip to content

Commit

Permalink
Merge branch 'hotfix/header'
Browse files Browse the repository at this point in the history
  • Loading branch information
CiaranOMara committed Mar 21, 2020
2 parents c139754 + d0e2560 commit 6ae1180
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 23 deletions.
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "XAM"
uuid = "d759349c-bcba-11e9-07c2-5b90f8f05f7c"
authors = ["Kenta Sato <[email protected]>", "Ben J. Ward <[email protected]>", "Ciarán O'Mara <[email protected]>"]
version = "0.2.0"
version = "0.2.1"

[deps]
Automa = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b"
Expand Down
4 changes: 4 additions & 0 deletions src/sam/header.jl
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ function Header()
return Header(MetaInfo[])
end

function Base.:(==)(a::Header, b::Header)
return a.metainfo == b.metainfo
end

function Base.copy(header::Header)
return Header(header.metainfo)
end
Expand Down
9 changes: 9 additions & 0 deletions src/sam/metainfo.jl
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,15 @@ mutable struct MetaInfo
dictval::Vector{UnitRange{Int}}
end

function Base.:(==)(a::MetaInfo, b::MetaInfo)
return a.data == b.data &&
a.filled == b.filled &&
a.tag == b.tag &&
a.val == b.val &&
a.dictkey == b.dictkey &&
a.dictval == b.dictval
end

function MetaInfo(data::Vector{UInt8}=UInt8[])
metainfo = MetaInfo(data, 1:0, 1:0, 1:0, UnitRange{Int}[], UnitRange{Int}[])
if !isempty(data)
Expand Down
36 changes: 19 additions & 17 deletions src/sam/readrecord.jl
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,19 @@ function appendfrom!(dst, dpos, src, spos, n)
return dst
end

const action_metainfo = quote

let markpos = @markpos()

appendfrom!(metainfo.data, 1, data, markpos, length(markpos:p-1))

metainfo.filled = @relpos(markpos):@relpos(p-1)

found_metainfo = true
end

end

const sam_actions_metainfo = Dict(
:mark => :(@mark),
:pos1 => :(pos1 = @relpos(p)),
Expand All @@ -173,22 +186,18 @@ const sam_actions_metainfo = Dict(
:metainfo_val => :(metainfo.val = pos1:@relpos(p-1)),
:metainfo_dict_key => :(push!(metainfo.dictkey, pos2:@relpos(p-1))),
:metainfo_dict_val => :(push!(metainfo.dictval, pos2:@relpos(p-1))),
:metainfo => quote
let markpos = @markpos()

appendfrom!(metainfo.data, 1, data, markpos, length(markpos:p-1))

metainfo.filled = @relpos(markpos):@relpos(p-1)

found_metainfo = true
end
end
:metainfo => action_metainfo
)

const sam_actions_header = merge(
sam_actions_metainfo,
Dict(
:countline => :(linenum += 1),
:metainfo => quote
$(action_metainfo)
push!(header, metainfo)
metainfo = MetaInfo()
end,
:header => quote

finish_header = true
Expand Down Expand Up @@ -309,13 +318,6 @@ const sam_loopcode_header = quote
throw(ArgumentError("malformed metainfo at line $(linenum)"))
end

if found_metainfo
push!(header, metainfo)
found_metainfo = false
end

metainfo = MetaInfo()

if finish_header
@goto __return__
end
Expand Down
32 changes: 27 additions & 5 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -172,15 +172,27 @@ end
mktemp() do path, io
# copy
reader = open(SAM.Reader, filepath)
writer = SAM.Writer(io, header(reader))

header_original = header(reader)

writer = SAM.Writer(io, header_original)

records = SAM.Record[]
for record in reader
push!(records, record)
write(writer, record)
end

close(reader)
close(writer)
@test compare_records(open(collect, SAM.Reader, path), records)

reader = open(SAM.Reader, path)

@test header(reader) == header_original
@test compare_records(collect(reader), records)

close(reader)

end
end
end
Expand Down Expand Up @@ -378,16 +390,26 @@ end
else
reader = open(BAM.Reader, filepath)
end
writer = BAM.Writer(
BGZFStream(path, "w"), BAM.header(reader, fillSQ=isempty(findall(header(reader), "SQ"))))

header_original = header(reader)

writer = BAM.Writer(BGZFStream(path, "w"), BAM.header(reader, fillSQ=isempty(findall(header(reader), "SQ"))))

records = BAM.Record[]
for record in reader
push!(records, record)
write(writer, record)
end
close(reader)
close(writer)
@test compare_records(open(collect, BAM.Reader, path), records)

reader = open(BAM.Reader, path)

@test header(reader) == header_original
@test compare_records(collect(reader), records)

close(reader)

end
end
end
Expand Down

2 comments on commit 6ae1180

@CiaranOMara
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@BioJuliaBot register

@BioJuliaBot
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Registration pull request created: BioJulia/BioJuliaRegistry/61

After the above pull request is merged, it is recommended that a tag is created on this repository for the registered package version.

This will be done automatically if Julia TagBot is installed, or can be done manually through the github interface, or via:

git tag -a v0.2.1 -m "<description of version>" 6ae1180cfa1c9fc822f0a574ef825eecf3d5373b
git push origin v0.2.1

Please sign in to comment.