libsequence  1.9.5
PolyTableFunctions.tcc
1 // Code for the -*- C++ -*- namespace Sequence
2 #include <type_traits>
3 #include <algorithm>
4 #include <Sequence/stateCounter.hpp>
5 namespace Sequence
6 {
7  template<typename T,
8  typename F> T removeColumns(const T & t,
9  const F & f,
10  const bool skipAnc,
11  const unsigned anc,
12  const char gapchar)
13  {
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;
17  if(!skipAnc)
18  {
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);
22  });
23  }
24  else
25  {
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);
30  });
31  }
32  return T(columns.cbegin(),columns.cend());
33  }
34 
35  template<typename T> T removeGaps( const T & t, const bool skipAnc, const unsigned anc,const char gapchar)
36  {
37  auto remover = [](const stateCounter & sc) { return !sc.gap; };
38  return removeColumns(t,remover,skipAnc,anc,gapchar);
39  }
40 
41  template<typename T> T removeInvariantPos(const T & t, const bool skipAnc,
42  const unsigned anc,
43  const char gapchar)
44  {
45  auto remover = [](const stateCounter & sc) {return sc.nStates()>1;};
46  return removeColumns(t,remover,skipAnc,anc,gapchar);
47  }
48 
49  template<typename T> T removeAmbiguous(const T & t, const bool skipAnc,
50  const unsigned anc,
51  const char gapchar)
52  {
53  auto remover = [](const stateCounter & sc) { return !sc.ndna; };
54  return removeColumns(t,remover,skipAnc,anc,gapchar);
55  }
56 
57  template<typename T> T removeMissing(const T & t, const bool skipAnc,
58  const unsigned anc,
59  const char gapchar)
60  {
61  auto remover = [](const stateCounter & sc) { return !sc.n; };
62  return removeColumns(t,remover,skipAnc,anc,gapchar);
63  }
64 
65  template<typename T> T removeMultiHits(const T & t, const bool skipAnc,
66  const unsigned anc,
67  const char gapchar)
68  {
69  auto remover = [](const stateCounter & sc) { return sc.nStates()<=2; };
70  return removeColumns(t,remover,skipAnc,anc,gapchar);
71  }
72 
73  template<typename T> T polyTableToBinary(const T & t, const unsigned ref, const char gapchar)
74  {
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)
79  {
80  for( ; f < l ; ++f )
81  {
82  for(unsigned i = 0 ; i < t2[f].size() ; ++i)
83  {
84  if(t2[f][i]!=t2[ref][i]) bd[f][i]='1';
85  }
86  }
87  };
88  updater(0,ref);
89  updater(ref+1,t2.size());
90  return T(std::vector<double>(t2.pbegin(),t2.pend()),
91  std::move(bd));
92  }
93 
94  template<typename T> T polyTableFreqFilter(const T & t, const unsigned mincount,const bool skipAnc, const unsigned anc, const char gapchar)
95  {
96  auto remover = [mincount](const stateCounter & sc)
97  {
98  bool freq = true;
99  if (sc.a > 0 && sc.a < mincount)
100  {
101  freq = false;
102  }
103  else if (freq == true && sc.g > 0 && sc.g < mincount)
104  {
105  freq = false;
106  }
107  else if (freq == true && sc.c > 0 && sc.c < mincount)
108  {
109  freq = false;
110  }
111  else if (freq == true && sc.t > 0 && sc.t < mincount)
112  {
113  freq = false;
114  }
115  else if (freq == true && sc.zero > 0 && sc.zero < mincount)
116  {
117  freq = false;
118  }
119  else if (freq == true && sc.one > 0 && sc.one < mincount)
120  {
121  freq = false;
122  }
123  return freq;
124  };
125  return removeColumns(t,remover,skipAnc,anc,gapchar);
126  }
127 }