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