Advertisement
Guest User

Untitled

a guest
May 27th, 2015
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.89 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <string>
  5. #include <list>
  6. #include <vector>
  7. #include <getopt.h>
  8. #include <iomanip>
  9. #include <algorithm>
  10. #include <tgmath.h>
  11. #include<map>
  12. #include <set>
  13.  
  14. using namespace std;
  15.  
  16. string inputfname;
  17. string outputfname;
  18. string* indata = 0;
  19. vector <int> dlugosci;
  20. vector <string> naglowki;
  21. vector <int> czy_rowne;
  22. char **matryca;
  23. float **wynikowa;
  24.  
  25. class sekwencja
  26. {
  27. public:
  28. int ileA;
  29. int ileC;
  30. int ileT;
  31. int ileG;
  32. string idseq;
  33. string seq;
  34. /**trzeba bedzie zrobic chyba oddzielna klase czy cos zeby stackowac wyniki tych PAR
  35. albo inna strukture jak slownik/hasz**/
  36. };
  37.  
  38. vector <sekwencja> seqstack;
  39.  
  40. string* readfile(string filename)
  41. {
  42.  
  43. string* result = new string(); /** tabela wskaznikow na stringi pochodzace z wejscia **/
  44.  
  45. ifstream inputfile;
  46.  
  47. inputfile.open(filename.c_str());
  48.  
  49. dlugosci.push_back(0);
  50. if (inputfile.is_open() )
  51. {
  52. string s;
  53. string nagl;
  54. int ile=0; //dlugosc calej sekwencji
  55. int licznik=0;
  56. while (!inputfile.eof()) {
  57.  
  58. getline(inputfile,nagl);
  59. if(nagl.find(">")==0)
  60. {
  61. if(licznik>0)
  62. {
  63. dlugosci.push_back(ile);
  64. }
  65. naglowki.push_back(nagl);
  66. continue;
  67. }
  68. else
  69. {
  70.  
  71. s=nagl;
  72. czy_rowne.push_back(s.size());
  73. ile=ile+s.size();
  74.  
  75. }
  76. result->append(s);
  77. licznik++;
  78. }
  79. inputfile.close();
  80. }
  81. return result;
  82. }
  83.  
  84. int main(int argc, char *argv[])
  85. {
  86. int posi;
  87. int przelacznik=0;
  88. for (int i=0; i<argc; i++ )
  89. {
  90. string s(argv[i]);
  91. posi = s.find("-finput");
  92. if (posi >=0)
  93. {
  94. s.erase(0,7);
  95. inputfname.assign(s);
  96. }
  97. }
  98. indata = readfile(inputfname);
  99. string przetwarzane = *indata;
  100. set<int> s( czy_rowne.begin(), czy_rowne.end() ); /** usuwnie duplikatow z wektora**/
  101. if(s.size()>1)
  102. {
  103. cout<<"Blad! Sekwencje nie sa rowne!!"<<endl;
  104. return 0;
  105. }
  106. string teraz;
  107. int tyle=0;
  108. for(int x=0;x<dlugosci.size();x++)
  109. {
  110. teraz=przetwarzane.substr(dlugosci[x],czy_rowne[0]);
  111. sekwencja A;
  112. A.idseq=naglowki[x];
  113. A.seq=teraz;
  114. cout<<A.idseq<<endl;
  115. cout<<A.seq<<endl;
  116. int tyleA=0;
  117. int tyleC=0;
  118. int tyleG=0;
  119. int tyleT=0;
  120. for(int y=0;y<teraz.size();y++)
  121. {
  122. if(teraz[y]=='A')
  123. {
  124. tyleA++;
  125. }
  126. else if(teraz[y]=='C')
  127. {
  128. tyleC++;
  129. }
  130. else if(teraz[y]=='T')
  131. {
  132. tyleT++;
  133. }
  134. else if(teraz[y]=='G')
  135. {
  136. tyleG++;
  137. }
  138. }
  139. A.ileA=tyleA;
  140. A.ileC=tyleC;
  141. A.ileG=tyleG;
  142. A.ileT=tyleT;
  143. seqstack.push_back(A);
  144. cout<<A.ileC<<endl;
  145. cout<<A.ileT<<endl;
  146. cout<<A.ileG<<endl;
  147. cout<<A.ileA<<endl;
  148. }
  149. int rozmiar = przetwarzane.size()/naglowki.size(); /** chyba git to dzielenie przez naglowki **/
  150. matryca = new char *[2];
  151. for (int i=0; i<naglowki.size(); i++)
  152. {
  153. matryca[i]= new char [rozmiar];
  154. }
  155. for(int i=0; i<naglowki.size(); i++)
  156. {
  157. for (int j=0; j<rozmiar; j++)
  158. {
  159. matryca[i][j]=' ';
  160. }
  161. }
  162. wynikowa = new float *[rozmiar];
  163. for(int i=0; i<rozmiar; i++)
  164. {
  165. wynikowa[i]= new float [rozmiar];
  166. }
  167. for(int i=0; i<rozmiar; i++)
  168. {
  169. for (int j=0; j<rozmiar; j++)
  170. {
  171. wynikowa[i][j]=2.0;/** wstepnie jest 2, potem sie wymysli wartosc unikalna zeby sie git czytalo czy cos**/
  172. }
  173. }
  174. for(int o=0;o<naglowki.size();o++)
  175. {
  176. for (int g=0; g<rozmiar; g++)
  177. {
  178. matryca[o][g]=seqstack[o].seq.at(g);
  179. }
  180. }
  181.  
  182. /**liczenie mutuala dla poszczegolnych kolumn**/
  183.  
  184. /* for(int i=0; i<pairs.size(); i++)
  185. {
  186. it = two.find(string(pairs[i]) );
  187. if ( it != two.end() )
  188. {
  189. it->second = it->second + 1.0;
  190. //dwojki[string(pary[i])]=2.0;
  191. }
  192. else
  193. {
  194. two[string(pairs[i])]=1.0;
  195. }
  196. }
  197.  
  198. for (it = two.begin(); it != two.end(); ++it)
  199. {
  200. cout << it->first << setw(5) << it->second << endl;
  201. }
  202. // return 0;
  203.  
  204.  
  205. */
  206.  
  207.  
  208. /** pary.erase( unique( pary.begin(), pary.end() ), pary.end() ); **/
  209. /// to jest mozliwie potrzebne :P
  210.  
  211. string first;
  212. string second;
  213. float small1=0.0;
  214. float small2=0.0;
  215. float wynik=0.0;
  216. vector <string> pairs; /** wstepnie wymyslilem wektor **/
  217. map<string, float> two;
  218. map<string, float>::iterator it;
  219. /// liczniki dot. ACTG z kolumny i , i+1
  220. float liczA1, liczC1, liczT1, liczG1 = 0.0; ///liczenie wystapien actg w poszczegolnych kolumnach
  221. float liczA2, liczC2, liczT2, liczG2 = 0.0;
  222. for (int i=0; i<rozmiar; i++)
  223. {
  224. for(int x=0;x<naglowki.size();x++) /// liczy wystapienia w kolumnie "i"
  225. {
  226. if(matryca[x][i]=='A')
  227. {liczA1=liczA1+1.0;}
  228. else if(matryca[x][i]=='C')
  229. {liczC1=liczC1+1.0;}
  230. else if(matryca[x][i]=='T')
  231. {liczG1=liczG1+1.0;}
  232. else if(matryca[x][i]=='G')
  233. {liczT1=liczT1+1.0;}
  234. }
  235. liczA1=liczA1/naglowki.size();
  236. liczC1=liczC1/naglowki.size();
  237. liczT1=liczT1/naglowki.size();
  238. liczG1=liczG1/naglowki.size();
  239. for (int j=i+1; j<rozmiar; j++)
  240. {
  241. for(int x=0;x<naglowki.size();x++)
  242. {
  243. first.push_back(matryca[x][i]); /** tutaj robi sie slownik ala pythonowy ktory zbiera pary z danej iteracji: i , j=i+1**/
  244. first.push_back(matryca[x][j]);
  245. it = two.find(first);
  246. if ( it != two.end() )
  247. {
  248. it->second = it->second + 1.0;
  249. }
  250. else
  251. {
  252. two[first]=1.0;
  253. }
  254. first.clear();
  255. }
  256. for (it = two.begin(); it != two.end(); ++it) /** wyznaczanie wspolczynnikow czestosci (np. para AC byla 0.2)**/
  257. {
  258. it->second = it->second/naglowki.size();
  259. }
  260. for(int x=0;x<naglowki.size();x++)
  261. {
  262. if(matryca[x][j]=='A')
  263. {liczA2=liczA2+1.0;}
  264. else if(matryca[x][j]=='C')
  265. {liczC2=liczC2+1.0;}
  266. else if(matryca[x][j]=='T')
  267. {liczG2=liczG2+1.0;}
  268. else if(matryca[x][j]=='G')
  269. {liczT2=liczT2+1.0;}
  270. }
  271. liczA2=liczA2/naglowki.size();
  272. liczC2=liczC2/naglowki.size();
  273. liczT2=liczT2/naglowki.size();
  274. liczG2=liczG2/naglowki.size();
  275. /// tutaj jeszcze przed czyszczeniem mapy musi zadzialac wyliczenie z wzoru
  276. for (it = two.begin(); it != two.end(); ++it)
  277. {
  278. cout << it->first << setw(5) << it->second << endl;
  279. }
  280. two.clear();
  281. liczA2, liczC2, liczT2, liczG2 = 0.0;
  282. return 0;
  283. }
  284. liczA1, liczC1, liczT1, liczG1 = 0.0;
  285. }
  286. for(int i=0; i<rozmiar; i++)
  287. {
  288. cout<<i<<" ";
  289. for (int j=0; j<rozmiar; j++)
  290. {
  291. cout<<wynikowa[i][j];
  292. }
  293. cout<<endl;
  294. }
  295. delete wynikowa;
  296. delete matryca;
  297. return 0;
  298. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement