1 #ifndef theplu_yat_omic_algorithm
2 #define theplu_yat_omic_algorithm
22 #include "GenomicPosition.h"
24 #include <boost/concept/assert.hpp>
54 template<
class Iterator,
class Visitor>
57 BOOST_CONCEPT_ASSERT((boost::InputIterator<Iterator>));
59 using boost::Convertible;
60 typedef typename std::iterator_traits<Iterator>::reference reference_type;
61 BOOST_CONCEPT_ASSERT((Convertible<reference_type, BamRead>));
64 typedef std::multimap<GenomicPosition, BamRead> Map;
66 std::map<std::string, BamRead> siam_reads;
68 for (; first!=last; ++first) {
72 if (position != siam_position) {
73 siam_position = position;
78 if (mate_position > position)
79 reads.insert(std::make_pair(mate_position, *first));
80 else if (mate_position < position) {
83 Map::iterator lower = reads.lower_bound(position);
84 reads.erase(reads.begin(), lower);
86 lower = reads.begin();
88 for (; lower!=reads.end() && lower->first == position; ++lower) {
89 if (same_query_name(lower->second, *first)) {
90 visitor(lower->second, *first);
97 std::map<std::string, BamRead>::iterator
98 mate = siam_reads.lower_bound(first->name());
99 if (mate!=siam_reads.end() && same_query_name(mate->second, *first)) {
100 visitor(mate->second, *first);
104 siam_reads.insert(mate, std::make_pair(first->name(), *first));