1 // ***************************************************************************
2 // BamMultiMerger_p.h (c) 2010 Derek Barnett
3 // Marth Lab, Department of Biology, Boston College
4 // All rights reserved.
5 // ---------------------------------------------------------------------------
6 // Last modified: 17 January 2011 (DB)
7 // ---------------------------------------------------------------------------
8 // Provides merging functionality for BamMultiReader. At this point, supports
9 // sorting results by (refId, position) or by read name.
10 // ***************************************************************************
12 #ifndef BAMMULTIMERGER_P_H
13 #define BAMMULTIMERGER_P_H
19 // This file is not part of the BamTools API. It exists purely as an
20 // implementation detail. This header file may change from version to version
21 // without notice, or even be removed.
25 #include <api/BamAlignment.h>
26 #include <api/BamReader.h>
35 typedef std::pair<BamReader*, BamAlignment*> ReaderAlignment;
37 // generic MultiMerger interface
38 class IBamMultiMerger {
41 IBamMultiMerger(void) { }
42 virtual ~IBamMultiMerger(void) { }
45 virtual void Add(const ReaderAlignment& value) =0;
46 virtual void Clear(void) =0;
47 virtual const ReaderAlignment& First(void) const =0;
48 virtual const int Size(void) const =0;
49 virtual ReaderAlignment TakeFirst(void) =0;
52 // IBamMultiMerger implementation - sorted on BamAlignment: (RefId, Position)
53 class PositionMultiMerger : public IBamMultiMerger {
56 PositionMultiMerger(void) : IBamMultiMerger() { }
57 ~PositionMultiMerger(void) { }
60 void Add(const ReaderAlignment& value);
62 const ReaderAlignment& First(void) const;
63 const int Size(void) const;
64 ReaderAlignment TakeFirst(void);
67 typedef std::pair<int, int> KeyType;
68 typedef std::multimap<KeyType, ReaderAlignment> IndexType;
69 typedef std::pair<KeyType, ReaderAlignment> KeyValueType;
70 typedef IndexType::iterator IndexIterator;
71 typedef IndexType::const_iterator IndexConstIterator;
76 // IBamMultiMerger implementation - sorted on BamAlignment: Name
77 class ReadNameMultiMerger : public IBamMultiMerger {
80 ReadNameMultiMerger(void) : IBamMultiMerger() { }
81 ~ReadNameMultiMerger(void) { }
84 void Add(const ReaderAlignment& value);
86 const ReaderAlignment& First(void) const;
87 const int Size(void) const;
88 ReaderAlignment TakeFirst(void);
91 typedef std::string KeyType;
92 typedef std::multimap<KeyType, ReaderAlignment> IndexType;
93 typedef std::pair<KeyType, ReaderAlignment> KeyValueType;
94 typedef IndexType::iterator IndexIterator;
95 typedef IndexType::const_iterator IndexConstIterator;
100 // IBamMultiMerger implementation - unsorted BAM file(s)
101 class UnsortedMultiMerger : public IBamMultiMerger {
104 UnsortedMultiMerger(void) : IBamMultiMerger() { }
105 ~UnsortedMultiMerger(void) { }
108 void Add(const ReaderAlignment& value);
110 const ReaderAlignment& First(void) const;
111 const int Size(void) const;
112 ReaderAlignment TakeFirst(void);
115 typedef std::queue<ReaderAlignment> IndexType;
119 // ------------------------------------------
120 // PositionMultiMerger implementation
122 inline void PositionMultiMerger::Add(const ReaderAlignment& value) {
123 const KeyType key = std::make_pair<int, int>( value.second->RefID, value.second->Position );
124 m_data.insert( KeyValueType(key, value) );
127 inline void PositionMultiMerger::Clear(void) {
131 inline const ReaderAlignment& PositionMultiMerger::First(void) const {
132 const KeyValueType& entry = (*m_data.begin());
136 inline const int PositionMultiMerger::Size(void) const {
137 return m_data.size();
140 inline ReaderAlignment PositionMultiMerger::TakeFirst(void) {
141 IndexIterator first = m_data.begin();
142 ReaderAlignment next = (*first).second;
147 // ------------------------------------------
148 // ReadNameMultiMerger implementation
150 inline void ReadNameMultiMerger::Add(const ReaderAlignment& value) {
151 const KeyType key = value.second->Name;
152 m_data.insert( KeyValueType(key, value) );
155 inline void ReadNameMultiMerger::Clear(void) {
159 inline const ReaderAlignment& ReadNameMultiMerger::First(void) const {
160 const KeyValueType& entry = (*m_data.begin());
164 inline const int ReadNameMultiMerger::Size(void) const {
165 return m_data.size();
168 inline ReaderAlignment ReadNameMultiMerger::TakeFirst(void) {
169 IndexIterator first = m_data.begin();
170 ReaderAlignment next = (*first).second;
175 // ------------------------------------------
176 // UnsortedMultiMerger implementation
178 inline void UnsortedMultiMerger::Add(const ReaderAlignment& value) {
182 inline void UnsortedMultiMerger::Clear(void) {
183 for (size_t i = 0; i < m_data.size(); ++i )
187 inline const ReaderAlignment& UnsortedMultiMerger::First(void) const {
188 return m_data.front();
191 inline const int UnsortedMultiMerger::Size(void) const {
192 return m_data.size();
195 inline ReaderAlignment UnsortedMultiMerger::TakeFirst(void) {
196 ReaderAlignment first = m_data.front();
201 } // namespace Internal
202 } // namespace BamTools
204 #endif // BAMMULTIMERGER_P_H