05d23c91f5205c171156ed27b2328509f1092aeb
[mussa.git] / alg / conserved_path.hpp
1 #ifndef _CONSERVED_PATH_H
2 #define _CONSERVED_PATH_H
3 #include <vector>
4 #include <ostream>
5
6 struct ConservedPath
7 {
8   typedef int path_element;
9   typedef std::vector<path_element> path_type;
10   typedef path_type::iterator iterator;
11   typedef path_type::const_iterator const_iterator;
12   typedef path_type::size_type size_type;
13
14   ConservedPath();
15   ConservedPath(const ConservedPath& );
16   ConservedPath(size_t window_size, double score, path_type path);
17
18   //! reset our path to be empty (including setting threshold to 0)
19   void clear();
20   path_element& operator[](size_type index);
21   void push_back(const path_element& );
22   void pop_back();
23
24   size_type size() const;
25   iterator begin();
26   const_iterator begin() const;
27   iterator end();
28   const_iterator end() const;
29
30   friend bool operator==(const ConservedPath& a, const ConservedPath &b);
31   friend bool operator!=(const ConservedPath& a, const ConservedPath &b);
32   friend std::ostream& operator<<(std::ostream&, const ConservedPath&);
33
34   //! return true if all elements of the path are "next to" our current path.
35   /*! Next to is defined as being window index + 1
36    *  that definition may not properly track reverse compliment
37    */
38   bool nextTo(const ConservedPath& next) const;
39   //! indicate which elements of the path are reversed
40   std::vector<bool> reverseComplimented() const;
41   //! return the list of indexes normalized (to the left)
42   std::vector<path_element> normalizedIndexes() const;
43   //! extend our current path
44   //! (aka increment our window size  by growth)
45   ConservedPath& extend(int growth=1);
46
47   //! window size (really should always be positive
48   size_t window_size;
49   //! either number of conserved bases or average entropy
50   double score;
51   //! offsets into each of our sequences representing the start of our window
52   std::vector<path_element> track_indexes;
53 };
54 #endif