Antonie
|
00001 #pragma once 00002 #include <string> 00003 #include <vector> 00004 #include <functional> 00005 #include <stdlib.h> 00006 #include <sstream> 00007 #include "antonie.hh" 00008 00009 extern const char* g_gitHash; 00010 00012 double qToErr(unsigned int i); 00013 00015 double getGCContent(const std::string& str); 00016 00017 00019 template<typename T> 00020 class Clusterer 00021 { 00022 public: 00024 explicit Clusterer(int limit) : d_limit(limit) 00025 {} 00026 00028 void feed(const T& t) 00029 { 00030 if(d_clusters.empty() || t.pos - d_clusters.rbegin()->getEnd() > d_limit) { 00031 d_clusters.push_back(cluster()); 00032 } 00033 d_clusters.rbegin()->d_members.push_back(t); 00034 } 00035 00037 struct cluster 00038 { 00039 int getBegin() 00040 { 00041 return d_members.begin()->pos; 00042 } 00043 int getEnd() 00044 { 00045 return d_members.rbegin()->pos; 00046 } 00047 int getMiddle() 00048 { 00049 return (getBegin()+getEnd())/2; 00050 } 00051 00052 std::vector<T> d_members; 00053 }; 00054 00056 std::vector<cluster> d_clusters; 00057 private: 00058 unsigned int d_limit; 00059 }; 00060 00061 typedef std::function<void(void)> acgt_t; 00062 inline void acgtDo(char c, acgt_t aDo, acgt_t cDo, acgt_t gDo, acgt_t tDo) 00063 { 00064 switch(c) { 00065 case 'A': 00066 aDo(); 00067 break; 00068 case 'C': 00069 cDo(); 00070 break; 00071 case 'G': 00072 gDo(); 00073 break; 00074 case 'T': 00075 tDo(); 00076 break; 00077 } 00078 } 00079 00080 typedef std::function<void(void)> acgt_t; 00081 inline void acgtxDo(char c, acgt_t aDo, acgt_t cDo, acgt_t gDo, acgt_t tDo, acgt_t xDo) 00082 { 00083 switch(c) { 00084 case 'A': 00085 aDo(); 00086 break; 00087 case 'C': 00088 cDo(); 00089 break; 00090 case 'G': 00091 gDo(); 00092 break; 00093 case 'T': 00094 tDo(); 00095 break; 00096 case 'X': 00097 xDo(); 00098 break; 00099 } 00100 } 00101 00102 00104 template<typename T> 00105 const typename T::value_type& pickRandom(const T& t) 00106 { 00107 return t[rand() % t.size()]; 00108 } 00109 00116 template<typename T> 00117 std::string jsonVector(const std::vector<T>& v, const std::string& name, 00118 std::function<double(dnapos_t)> yAdjust = [](dnapos_t d){return 1.0*d;}, 00119 std::function<double(int)> xAdjust = [](int i){return 1.0*i;}) 00120 { 00121 std::ostringstream ret; 00122 ret << "var "<<name<<"=["; 00123 for(auto iter = v.begin(); iter != v.end(); ++iter) { 00124 if(iter != v.begin()) 00125 ret<<','; 00126 ret << '[' << xAdjust(iter - v.begin()) <<','<< yAdjust(*iter)<<']'; 00127 } 00128 ret <<"];\n"; 00129 return ret.str(); 00130 } 00131 00132 00133 template<typename T> 00134 std::string jsonVectorD(const std::vector<T>& v, 00135 std::function<double(double)> yAdjust = [](double d){return d;}, 00136 std::function<double(int)> xAdjust = [](int i){return 1.0*i;}) 00137 { 00138 std::ostringstream ret; 00139 ret<<"["; 00140 for(auto iter = v.begin(); iter != v.end(); ++iter) { 00141 if(iter != v.begin()) 00142 ret<<','; 00143 ret << '[' << std::fixed<< xAdjust(iter - v.begin()) <<','<< std::scientific << yAdjust(*iter)<<']'; 00144 } 00145 ret <<"]"; 00146 return ret.str(); 00147 } 00148 00150 uint32_t kmerMapper(const std::string& str, int offset, int unsigned len);