1 #ifndef theplu_yat_omic_pileup
2 #define theplu_yat_omic_pileup
27 #include "yat/utility/CigarIterator.h"
28 #include "yat/utility/yat_assert.h"
30 #include <boost/iterator/iterator_traits.hpp>
31 #include <boost/concept/assert.hpp>
32 #include <boost/shared_ptr.hpp>
54 template<
typename Iterator>
81 YAT_ASSERT(bam_.get());
88 uint8_t
cigar_op(
void)
const {
return *cigar_; }
96 YAT_ASSERT(bam_.get());
97 YAT_ASSERT(cigar_.
base() >= bam_->cigar());
98 return bam_cigar_oplen(*cigar_.
base());
105 unsigned short qual(
void)
const
107 YAT_ASSERT(bam_.get());
108 YAT_ASSERT(qpos_ < bam_->sequence_length());
109 return bam_->qual(qpos_);
128 return cigar_type()==2;
134 size_t qpos(
void)
const {
return qpos_; }
136 boost::shared_ptr<BamRead> bam_;
142 uint8_t cigar_type(
void)
const {
return bam_cigar_type(
cigar_op()); }
164 Pileup(Iterator first, Iterator last);
184 bool good(
void)
const {
return !(bam_ == bam_end_ && data_.empty()); }
201 int32_t
tid(
void)
const {
return tid_; }
206 int32_t
pos(
void)
const {
return pos_; }
214 typedef typename std::list<Entry>::iterator iterator;
220 std::list<Entry> data_;
230 template<
typename Iterator>
238 template<
typename Iterator>
240 : bam_(first), bam_end_(last), pos_(0), tid_(0), skip_ref_(0)
242 BOOST_CONCEPT_ASSERT((boost::InputIterator<Iterator>));
243 using boost::Convertible;
244 typedef typename boost::iterator_value<Iterator>::type value_type;
245 BOOST_CONCEPT_ASSERT((Convertible<value_type, BamRead>));
250 template<
typename Iterator>
253 return data_.begin();
257 template<
typename Iterator>
264 template<
typename Iterator>
267 if (!data_.empty()) {
270 for (iterator it = data_.begin(); it!=data_.end(); ++it) {
271 if (it->cigar_type() == 1) {
281 typename std::list<Entry>::iterator read = data_.begin();
282 while (read != data_.end()) {
285 if (read->bam().end() <= pos_) {
290 if (read->cigar_op() == BAM_CINS) {
291 skip_ref_ =
std::max(skip_ref_, read->cigar_oplen());
298 for (iterator iter=data_.begin(); iter!=data_.end(); ++iter)
299 iter->skip_ = skip_ref_;
308 tid_ = bam_->core().tid;
309 pos_ = bam_->core().pos;
313 while (bam_!=bam_end_ && bam_->core().tid==tid_ && bam_->pos()<=pos_) {
315 if (!(bam_->core().flag & BAM_FUNMAP)) {
316 data_.push_back(
Entry(*bam_));
323 template<
typename Iterator>
330 template<
typename Iterator>
332 : bam_(new
BamRead(b)), qpos_(0), cigar_(bam_->cigar()), skip_(0)
334 YAT_ASSERT(cigar_.
base() == bam_->cigar());
335 if (bam_->core().n_cigar==0)
338 while (qpos_ < bam_->sequence_length() && cigar_type() != 3) {
340 YAT_ASSERT(cigar_type()!=2);
341 if (cigar_type() == 1)
348 template<
typename Iterator>
351 YAT_ASSERT(cigar_.base() >= bam_->cigar());
352 if (cigar_type() & 1)
355 YAT_ASSERT(cigar_.base() >= bam_->cigar());
359 template<
typename Iterator>
363 if (cigar_type() & 1)
364 return bam_->sequence(qpos_);
367 if (cigar_op()!=BAM_CINS)
369 return bam_->sequence(qpos_);
std::list< Entry >::const_iterator const_iterator
Definition: Pileup.h:151
void increment(void)
step to next position.
Definition: Pileup.h:265
Class holding a bam query.
Definition: BamRead.h:53
uint8_t cigar_op(void) const
Definition: Pileup.h:88
Pileup< Iterator > make_pileup(Iterator first, Iterator last)
Definition: Pileup.h:231
T max(const T &a, const T &b, const T &c)
Definition: stl_utility.h:683
bool is_del(void) const
Definition: Pileup.h:126
int32_t tid(void) const
Definition: Pileup.h:201
BASE base(void) const
Definition: CigarIterator.h:115
size_t qpos(void) const
Definition: Pileup.h:134
bool good(void) const
Definition: Pileup.h:184
Entry(void)
default constructor
Definition: Pileup.h:68
uint32_t cigar_oplen(void) const
Definition: Pileup.h:94
bool skip_ref(void) const
Definition: Pileup.h:324
uint8_t sequence(void) const
Definition: Pileup.h:360
int32_t pos(void) const
Definition: Pileup.h:206
const_iterator begin(void) const
Definition: Pileup.h:251
void increment(void)
Definition: Pileup.h:349
const BamRead & bam(void) const
Definition: Pileup.h:79
const_iterator end(void) const
Definition: Pileup.h:258
unsigned short qual(void) const
Definition: Pileup.h:105
Pileup(void)
Definition: Pileup.h:156