00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef POLYTABLE_H
00025 #define POLYTABLE_H
00026
00046 #include <string>
00047 #include <vector>
00048 #include <cassert>
00049 #include <iosfwd>
00050 #include <exception>
00051 #include <boost/type_traits.hpp>
00052 #include <boost/static_assert.hpp>
00053 #include <Sequence/SeqExceptions.hpp>
00054 #include <Sequence/PolyTableManip.hpp>
00055
00057 namespace Sequence
00058 {
00059 class PolyTable
00060 {
00061 private:
00068 std::vector<double> positions;
00074 std::vector<std::string> data;
00075 mutable Sequence::polySiteVector pv;
00076 mutable bool non_const_access;
00077 public:
00078
00079 typedef std::string & reference;
00080 typedef const std::string & const_reference;
00081 typedef std::vector<std::string>::size_type size_type;
00082
00086 typedef std::vector<std::string>::iterator data_iterator;
00090 typedef std::vector<std::string>::const_iterator const_data_iterator;
00094 typedef std::vector<double>::iterator pos_iterator;
00098 typedef std::vector<double>::const_iterator const_pos_iterator;
00107 typedef Sequence::polySiteVector::const_iterator const_site_iterator;
00108
00109
00110 data_iterator begin();
00111 data_iterator end();
00112 const_data_iterator begin() const;
00113 const_data_iterator end() const;
00114 pos_iterator pbegin();
00115 pos_iterator pend();
00116 const_pos_iterator pbegin() const;
00117 const_pos_iterator pend() const;
00118 const_site_iterator sbegin() const;
00119 const_site_iterator send() const;
00120
00121
00122 explicit PolyTable(const size_t & nsam = 0, const size_t nsnps = 0);
00123 explicit PolyTable(PolyTable::const_site_iterator beg,
00124 PolyTable::const_site_iterator end);
00125 virtual ~ PolyTable (void);
00126
00127
00128 std::vector < double > GetPositions (void) const;
00129 std::vector < std::string > GetData (void) const;
00130
00131
00132 virtual void ApplyFreqFilter(unsigned mincount,bool haveOutgroup=false,
00133 unsigned outgroup = 0);
00134 virtual void RemoveMultiHits(bool skipOutgroup=false,
00135 unsigned outgroup=0);
00136 virtual void RemoveMissing(bool skipOutgroup=false,
00137 unsigned outgroup=0);
00138 virtual void RemoveAmbiguous(bool skipOutgroup=false,
00139 unsigned outgroup=0);
00140 virtual void Binary (bool haveOutgroup = false,
00141 unsigned outgroup = 0,
00142 bool strictInfSites = true);
00143
00144
00145 virtual bool operator==(const PolyTable &rhs) const;
00146 virtual bool operator!=(const PolyTable &rhs) const;
00147 operator Sequence::polySiteVector() const;
00148
00149
00150 inline const_reference operator[] (const size_type & i) const
00155 {
00156 assert(i<data.size());
00157 return (data[i]);
00158 }
00159
00160 inline reference operator[] (const size_type & i)
00165 {
00166 assert(i<data.size());
00167 non_const_access=true;
00168 return (data[i]);
00169 }
00173 bool empty() const;
00174
00175 bool assign(PolyTable::const_site_iterator beg,
00176 PolyTable::const_site_iterator end);
00203 template<typename numeric_type,
00204 typename string_type>
00205 bool assign( const numeric_type * _positions,
00206 const size_t & _num_positions,
00207 const string_type * _data,
00208 const size_t & _num_individuals );
00209
00210
00211
00212
00213
00214 inline size_type size (void) const
00219 {
00220 return data.size();
00221 }
00222
00223 inline double position (const std::vector<double>::size_type & i) const
00228 {
00229 assert( i < positions.size());
00230 return positions[i];
00231 }
00232
00233 inline unsigned numsites (void) const
00238 {
00239 return unsigned(positions.size());
00240 }
00241
00248 virtual std::istream & read(std::istream &h)
00249 throw (Sequence::badFormat,std::exception) =0;
00250
00257 virtual std::ostream & print(std::ostream &h) const =0 ;
00258 };
00259
00260 inline std::istream & operator>> (std::istream & s, PolyTable & c)
00266 {
00267 return c.read (s);
00268 }
00269
00270 inline std::ostream & operator<< (std::ostream & o, const PolyTable & c)
00276 {
00277 return c.print (o);
00278 }
00279
00280 }
00281 #include <Sequence/bits/PolyTable.tcc>
00282 #endif