26 #ifndef SHORE_ALGO_TWODEX_HPP__
27 #define SHORE_ALGO_TWODEX_HPP__
34 #include <boost/iterator/iterator_facade.hpp>
48 :
public boost::iterator_facade<
49 size_iterator,size_t const,boost::random_access_traversal_tag>
53 friend class boost::iterator_core_access;
67 void advance(difference_type n)
74 return other.m_value-m_value;
79 return other.m_value==m_value;
82 const reference dereference()
const
94 :m_value(other.m_value)
99 m_value=other.m_value;
103 const size_t operator[](difference_type n)
const
123 bool operator()(
const size_t i,
const size_t j)
const
125 return pos[i]<pos[j];
128 bool operator()(
const size_t i,
const std::pair<size_t,size_t>& posend)
const
130 return pos[i]<posend.first;
133 bool operator()(
const std::pair<long,long>& posend,
const size_t i)
const
135 return posend.first<long(pos[i]);
154 bool operator()(
const size_t i,
const size_t j)
const
156 return (pos[i]+sizes[i])<(pos[j]+sizes[j]);
159 bool operator()(
const size_t i,
const std::pair<size_t,size_t>& posend)
const
161 return (pos[i]+sizes[i])<posend.second;
164 bool operator()(
const std::pair<long,long>& posend,
const size_t i)
const
166 return posend.second<long(pos[i]+sizes[i]);
185 bool operator()(
const size_t i,
const size_t j)
const
187 return pos[i]<(pos[j]+sizes[j]);
190 bool operator()(
const size_t i,
const std::pair<size_t,size_t>& posend)
const
192 return pos[i]<posend.second;
195 bool operator()(
const std::pair<long,long>& posend,
const size_t i)
const
197 return posend.first<long(pos[i]+sizes[i]);
244 seq_info(
const size_t i)
245 :id(i),offset(std::numeric_limits<long>::min()),
246 firstpos(std::numeric_limits<long>::max())
263 std::streamsize seq_total;
264 std::streamsize file_total;
267 std::map<std::string,seq_info> sequences;
268 std::vector<std::map<std::string,seq_info>::iterator> seqv;
280 size_t parse(std::istream& in);
283 void print(std::ostream& os)
const;
289 std::streamsize count;
292 void operator()(
const std::string& s);
299 typedef std::pair<shore::refseq_coor,shore::refseq_coor> range_t;
301 std::vector<range_t> ranges;
302 std::vector<range_t> rangebuf;
308 for(
size_t i=0;i<ranges.size();++i)
313 if(ranges[i].first<orange.first)
314 orange.first=ranges[i].first;
315 if(orange.second<ranges[i].second)
316 orange.second=ranges[i].second;
318 else if((ranges[i].first.chromosome!=p.
chromosome)
319 ||(ranges[i].second.position<=(p.
position-maxgap))
320 ||((e+maxgap)<=ranges[i].first.position))
322 rangebuf.push_back(ranges[i]);
326 if(ranges[i].first.position<orange.first.position)
327 orange.first.position=ranges[i].first.position;
329 if(orange.second.position<ranges[i].second.position)
330 orange.second.position=ranges[i].second.position;
335 ranges.swap(rangebuf);
336 ranges.push_back(orange);
345 intpack::const_iterator m_idbeg;
346 intpack::const_iterator m_idend;
347 intpack::const_iterator m_posbeg;
348 intpack::const_iterator m_posend;
349 intpack::const_iterator m_sizebeg;
350 intpack::const_iterator m_sizeend;
352 d2tree<blockcmp_pos,blockcmp_end,blockcmp_posend> m_tree;
357 void load(
const std::string &indexfile);
370 static void build(
const std::string &fn,
const std::string &colspec,
371 const size_t blocksize,
const size_t maxgap,
372 const D2Type d2type,
const char commentchar,
373 std::ostream *
const log=0);
375 static void build(
const std::string &fn,
const build_spec &bs,
376 std::ostream *
const log=0);
379 static void parse_xend(
long *
const xend,
const long pos,
380 const D2Type d2type,
const std::string& d2,
388 const header& get_header()
const;
390 void query(std::set<size_t>& res,
const std::pair<long,long>& r)
const;
402 static int test(
const std::pair<long,long>& r1,
403 const std::pair<long,long>& r2,
408 S_MAKE_ENUM_TRAITS(shore::twodex::D2Type)
412 #endif // SHORE_ALGO_TWODEX_HPP__