1 #ifndef theplu_yat_omic_bam_pair_iterator
2 #define theplu_yat_omic_bam_pair_iterator
29 #include <yat/utility/yat_assert.h>
31 #include <boost/concept/assert.hpp>
32 #include <boost/iterator/iterator_concepts.hpp>
33 #include <boost/iterator/iterator_facade.hpp>
34 #include <boost/shared_ptr.hpp>
61 template<
typename Base>
63 :
public boost::iterator_facade<
64 BamPairIterator<Base>, const BamPair, std::input_iterator_tag,
84 #ifndef YAT_HAVE_BOOST_ITERATOR_FACADE_PROXY_PTR
103 YAT_ASSERT(iter_ != end_);
104 dummie_.
first() = *mate_;
105 dummie_.
second() = *iter_;
116 boost::shared_ptr<std::map<std::string, BamRead> > siam_reads_;
117 typedef std::pair<int32_t, int32_t> Position;
118 boost::shared_ptr<std::multimap<Position, BamRead> > reads_;
119 friend class boost::iterator_core_access;
123 void increment(
void);
124 void find_next(
void);
133 template<
typename Base>
144 template<
typename Base>
152 template<
typename Base>
154 : iter_(base), end_(end),
155 siam_reads_(new std::map<std::string,
BamRead>),
156 reads_(new std::multimap<Position,
BamRead>)
158 BOOST_CONCEPT_ASSERT((boost::InputIterator<Base>));
159 using boost::Convertible;
160 typedef typename std::iterator_traits<Base>::value_type value_type;
161 BOOST_CONCEPT_ASSERT((Convertible<value_type, BamRead>));
166 template<
typename Base>
169 BOOST_CONCEPT_ASSERT((boost::InputIterator<Base>));
170 using boost::Convertible;
171 typedef typename std::iterator_traits<Base>::value_type value_type;
172 BOOST_CONCEPT_ASSERT((Convertible<value_type, BamRead>));
176 template<
typename Base>
184 template<
typename Base>
185 bool BamPairIterator<Base>::equal(
const BamPairIterator& other)
const
187 return iter_ == other.iter_;
191 template<
typename Base>
192 void BamPairIterator<Base>::increment(
void)
199 template<
typename Base>
200 void BamPairIterator<Base>::find_next(
void)
203 for (; iter_!=end_; ++iter_) {
204 Position position(iter_->tid(), iter_->pos());
205 Position mate_position(iter_->mtid(), iter_->mpos());
207 if (siam_reads_->size() && less(siam_reads_->begin()->second, *iter_))
208 siam_reads_->clear();
211 if (mate_position > position)
212 reads_->insert(std::make_pair(mate_position, *iter_));
213 else if (position > mate_position) {
214 std::multimap<Position, BamRead>::iterator
215 lower = reads_->lower_bound(position);
218 reads_->erase(reads_->begin(), lower);
221 for (; lower!=reads_->end() && lower->first == position; ++lower)
222 if (same_query_name(lower->second, *iter_)) {
223 mate_ = &lower->second;
229 std::map<std::string, BamRead>::iterator
230 mate = siam_reads_->lower_bound(iter_->name());
231 if (mate!=siam_reads_->end() && same_query_name(mate->second, *iter_)) {
232 mate_ = &mate->second;
237 siam_reads_->insert(mate, std::make_pair(iter_->name(), *iter_));
BamPairIterator(void)
default constructor
Definition: BamPairIterator.h:167
BamRead & first(void)
access first BamRead
BamPairIterator::pointer operator->(void) const
Definition: BamPairIterator.h:91
Class holding a bam query.
Definition: BamRead.h:53
BamPairIterator< Base > bam_pair_iterator(Base end)
Definition: BamPairIterator.h:145
Definition: BamPairIterator.h:62
BamPairIterator< Base > bam_pair_iterator(Base base, Base end)
Definition: BamPairIterator.h:134
BamRead & second(void)
access second BamRead