1// File Description
2/// \file BamHeader.inl
3/// \brief Inline implementations for the BamHeader class.
4//
5// Author: Derek Barnett
6
7#include "pbbam/BamHeader.h"
8
9namespace PacBio {
10namespace BAM {
11namespace internal {
12
13class BamHeaderPrivate
14{
15public:
16    std::string version_;
17    std::string pacbioBamVersion_;
18    std::string sortOrder_;
19    std::map<std::string, std::string> headerLineCustom_;
20
21    std::map<std::string, ReadGroupInfo> readGroups_; // id => read group info
22    std::map<std::string, ProgramInfo> programs_;     // id => program info
23    std::vector<std::string> comments_;
24
25    // we need to preserve insertion order, use lookup for access by name
26    std::vector<SequenceInfo> sequences_;
27    std::map<std::string, int32_t> sequenceIdLookup_;
28};
29
30} // namespace internal
31
32inline BamHeader::BamHeader()
33    : d_{std::make_shared<internal::BamHeaderPrivate>()}
34{ }
35
36inline BamHeader BamHeader::operator+(const BamHeader& other) const
37{ return DeepCopy() += other; }
38
39inline BamHeader& BamHeader::AddComment(std::string comment)
40{ d_->comments_.push_back(std::move(comment)); return *this; }
41
42inline BamHeader& BamHeader::AddProgram(ProgramInfo pg)
43{ d_->programs_[pg.Id()] = std::move(pg); return *this; }
44
45inline BamHeader& BamHeader::AddReadGroup(ReadGroupInfo readGroup)
46{ d_->readGroups_[readGroup.Id()] = std::move(readGroup); return *this; }
47
48inline BamHeader& BamHeader::ClearComments()
49{ d_->comments_.clear(); return* this; }
50
51inline BamHeader& BamHeader::ClearPrograms()
52{ d_->programs_.clear(); return *this; }
53
54inline BamHeader& BamHeader::ClearReadGroups()
55{ d_->readGroups_.clear(); return *this; }
56
57inline std::vector<std::string> BamHeader::Comments() const
58{ return d_->comments_; }
59
60inline BamHeader& BamHeader::Comments(std::vector<std::string> comments)
61{ d_->comments_ = std::move(comments); return *this; }
62
63inline bool BamHeader::HasProgram(const std::string& id) const
64{ return d_->programs_.find(id) != d_->programs_.cend(); }
65
66inline bool BamHeader::HasReadGroup(const std::string& id) const
67{ return d_->readGroups_.find(id) != d_->readGroups_.cend(); }
68
69inline bool BamHeader::HasSequence(const std::string& name) const
70{ return d_->sequenceIdLookup_.find(name) != d_->sequenceIdLookup_.cend(); }
71
72inline size_t BamHeader::NumSequences() const
73{ return d_->sequences_.size(); }
74
75inline std::string BamHeader::PacBioBamVersion() const
76{ return d_->pacbioBamVersion_; }
77
78inline SequenceInfo BamHeader::Sequence(const int32_t id) const
79{ return d_->sequences_.at(id); }
80
81inline std::string BamHeader::SequenceLength(const int32_t id) const
82{ return Sequence(id).Length(); }
83
84inline std::string BamHeader::SequenceName(const int32_t id) const
85{ return Sequence(id).Name(); }
86
87inline std::vector<SequenceInfo> BamHeader::Sequences() const
88{ return d_->sequences_; }
89
90inline std::string BamHeader::SortOrder() const
91{ return d_->sortOrder_; }
92
93inline BamHeader& BamHeader::SortOrder(std::string order)
94{ d_->sortOrder_ = std::move(order); return *this; }
95
96inline std::string BamHeader::Version() const
97{ return d_->version_; }
98
99inline BamHeader& BamHeader::Version(std::string version)
100{ d_->version_ = std::move(version); return *this; }
101
102} // namespace BAM
103} // namespace PacBio
104