00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef CGATOOLS_VARIANTS_SUPERLOCUSITERATOR_HPP_
00016 #define CGATOOLS_VARIANTS_SUPERLOCUSITERATOR_HPP_ 1
00017
00019
00020 #include "cgatools/core.hpp"
00021 #include "cgatools/variants/Superlocus.hpp"
00022 #include "cgatools/variants/VariantFileIterator.hpp"
00023
00024 #include <deque>
00025
00026 namespace cgatools { namespace variants {
00027
00028 class SuperlocusQueueIterator;
00029
00043 class SuperlocusIterator : private boost::noncopyable
00044 {
00045 public:
00053 SuperlocusIterator(uint32_t extend3Mers = 4, uint32_t extendBases = 0);
00054
00056 void setVariantFile(VariantFileIterator& iter);
00057
00059 void setVariantFiles(VariantFileIterator& iterA, VariantFileIterator& iterB);
00060
00062 void setVariantFiles(const std::vector<VariantFileIterator*> iters);
00063
00066 void skipToVariant(const reference::Range& range, const std::string& alleleSeq);
00067
00069 void seekFirst();
00070
00072 bool eof() const
00073 {
00074 return eof_;
00075 }
00076
00078 const Superlocus& operator*() const
00079 {
00080 return sl_;
00081 }
00082
00084 const Superlocus* operator->() const
00085 {
00086 return &sl_;
00087 }
00088
00093 reference::Location getPrecedingRefStart() const
00094 {
00095 return precedingRefStart_;
00096 }
00097
00099 SuperlocusIterator& operator++()
00100 {
00101 next();
00102 return *this;
00103 }
00104
00105 private:
00106 void next();
00107 bool findVariant(
00108 const reference::Location& loc, bool trackRefStart,
00109 reference::Range& range, reference::Range& searchRange);
00110 void retireLoci();
00111 void extendVariant();
00112 void extendVariant(reference::Range& slRange, reference::Range& searchRange);
00113
00114 reference::Range extendSearchRange(
00115 const reference::Range& range, const Locus& locus) const;
00116 uint32_t extendLeftBySuffixMatching(const Locus& locus) const;
00117 uint32_t extendRightByPrefixMatching(const Locus& locus) const;
00118 uint32_t extendLeftBySuffixMatching(
00119 const reference::Location& loc, const std::string& sequence) const;
00120 uint32_t extendRightByPrefixMatching(
00121 const reference::Location& loc, const std::string& sequence) const;
00122 size_t findContig(const reference::Location& loc) const;
00123
00124 Superlocus sl_;
00125 std::vector<VariantFileIterator*> iters_;
00126 std::vector< std::deque<Locus> >& queues_;
00127 std::vector< boost::shared_ptr<SuperlocusQueueIterator> > qIters_;
00128 bool started_;
00129 bool eof_;
00130 uint32_t extend3Mers_;
00131 uint32_t extendBases_;
00132 uint32_t padBases_;
00133 reference::Location queueCutoff_;
00134 reference::Location slRetired_;
00135 const reference::CrrFile* crr_;
00136 std::vector<reference::Range> contigs_;
00137
00138
00139
00140
00141 reference::Location precedingRefStart_;
00142 };
00143
00144 } }
00145
00146 #endif // CGATOOLS_VARIANTS_SUPERLOCUSITERATOR_HPP_