1 // Code for the -*- C++ -*- namespace Sequence
4 #include <Sequence/stateCounter.hpp>
8 typename F> T removeColumns(const T & t,
14 static_assert( std::is_base_of<PolyTable,T>::value,
15 "T must be derived from Sequence::PolyTable" );
16 std::vector<typename T::column_t> columns;
19 std::for_each( t.sbegin(),t.send(),[&columns,&f,gapchar](const typename T::column_t & __c) {
20 auto sc = std::for_each(std::begin(__c.second),std::end(__c.second),stateCounter(gapchar));
21 if (f(sc)) columns.push_back(__c);
26 std::for_each( t.sbegin(),t.send(),[&columns,&f,anc,gapchar](const typename T::column_t & __c) {
27 auto sc = std::for_each(std::begin(__c.second),std::begin(__c.second)+anc,stateCounter(gapchar));
28 sc = std::for_each(std::begin(__c.second)+anc+1,std::end(__c.second),sc);
29 if (f(sc)) columns.push_back(__c);
32 return T(columns.cbegin(),columns.cend());
35 template<typename T> T removeGaps( const T & t, const bool skipAnc, const unsigned anc,const char gapchar)
37 auto remover = [](const stateCounter & sc) { return !sc.gap; };
38 return removeColumns(t,remover,skipAnc,anc,gapchar);
41 template<typename T> T removeInvariantPos(const T & t, const bool skipAnc,
45 auto remover = [](const stateCounter & sc) {return sc.nStates()>1;};
46 return removeColumns(t,remover,skipAnc,anc,gapchar);
49 template<typename T> T removeAmbiguous(const T & t, const bool skipAnc,
53 auto remover = [](const stateCounter & sc) { return !sc.ndna; };
54 return removeColumns(t,remover,skipAnc,anc,gapchar);
57 template<typename T> T removeMissing(const T & t, const bool skipAnc,
61 auto remover = [](const stateCounter & sc) { return !sc.n; };
62 return removeColumns(t,remover,skipAnc,anc,gapchar);
65 template<typename T> T removeMultiHits(const T & t, const bool skipAnc,
69 auto remover = [](const stateCounter & sc) { return sc.nStates()<=2; };
70 return removeColumns(t,remover,skipAnc,anc,gapchar);
73 template<typename T> T polyTableToBinary(const T & t, const unsigned ref, const char gapchar)
75 T t2 = removeMultiHits(t,true,ref,gapchar);
76 if (t2.empty()) return t2;
77 std::vector<std::string> bd(t2.size(),std::string(t2.numsites(),'0'));
78 auto updater = [&t2,&bd,&ref,gapchar](unsigned f, unsigned l)
82 for(unsigned i = 0 ; i < t2[f].size() ; ++i)
84 if(t2[f][i]!=t2[ref][i]) bd[f][i]='1';
89 updater(ref+1,t2.size());
90 return T(std::vector<double>(t2.pbegin(),t2.pend()),
94 template<typename T> T polyTableFreqFilter(const T & t, const unsigned mincount,const bool skipAnc, const unsigned anc, const char gapchar)
96 auto remover = [mincount](const stateCounter & sc)
99 if (sc.a > 0 && sc.a < mincount)
103 else if (freq == true && sc.g > 0 && sc.g < mincount)
107 else if (freq == true && sc.c > 0 && sc.c < mincount)
111 else if (freq == true && sc.t > 0 && sc.t < mincount)
115 else if (freq == true && sc.zero > 0 && sc.zero < mincount)
119 else if (freq == true && sc.one > 0 && sc.one < mincount)
125 return removeColumns(t,remover,skipAnc,anc,gapchar);