AlignmentClass.cpp
上传用户:hnzyys
上传日期:2007-06-13
资源大小:32k
文件大小:11k
源码类别:

生物技术

开发平台:

Visual C++

  1. // aligmentClass.cpp: implementation of the AligmentClass class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "math.h"
  5. #include "AlignmentClass.h"
  6. //#include <fstream>
  7. //#include <math.h>
  8. //const float s[5][5]={{1,0.5,0.5,0,0},{0.5,1,0.5,0,0},{0,0.5,1,0.5,0},{0.5,0,0.5,1,0},{0,0,0,0,0}};//打分矩阵
  9. //const float s[5][5]={{1.0,-1,-2.0,-1,-2.0},{-1,1.0,-1,-2.0,-2.0},{-2.0,-1,1.0,-1,-2.0},{0,-2.0,0,1.0,-2.0},{-2.0,-2.0,-2.0,-2.0,0}};//打分矩阵
  10. const float s[5][5]={{1,0,0,0,-2},{0,1,0,0,-2},{0,0,1,0,-2},{0,0,0,1,-2},{-2,-2,-2,-2,-2}};//打分矩阵
  11. const float K = 1.23891;
  12. const float L = 1.386294;
  13. float tmpArray[PSS4LineLength][PSS4LineLength];
  14. float ArrayMax(int a,int b,int& rangei,int& rangej);
  15. float ShowMax(float a,float b,float c);
  16. float S(char a,char b);
  17. const float reducematrix=0;
  18. const float gap=-1;
  19. float ExtAlign(AlignmentResult &rar,int tb,int te,int pb,int pe)
  20. {
  21. int i,j;
  22. float score=0;
  23. std::ofstream log("log1");
  24. log<<"Seed:"<<std::endl;
  25. for(i=rar.TBegin;i<rar.TEnd;i++)
  26. log<<rar.Text[i];
  27. log<<std::endl;
  28. for(i=rar.PBegin;i<rar.PEnd;i++)
  29. log<<rar.Pattern[i];
  30. log<<std::endl;
  31. log<<std::endl;
  32. for(i=tb;i<te;i++)
  33. log<<rar.Text[i];
  34. log<<std::endl;
  35. for(i=pb;i<pe;i++)
  36. log<<rar.Pattern[i];
  37. log<<std::endl;
  38. for(i=0;i<=(te-tb);i++)
  39. {
  40. for(j=0;j<=(te-tb);j++)
  41. {
  42. log<<tmpArray[i][j]<<"  ";
  43. }
  44. log<<std::endl;
  45. }
  46. for(i=0;i<=(te-tb);i++)
  47. {
  48. int j1=(i-(int)(reducematrix*(te-tb)))>0?(i-(int)(reducematrix*(te-tb))):0;
  49. int j2=(i+(int)(reducematrix*(te-tb))<(te-tb))?(i+(int)(reducematrix*(te-tb))):(te-tb);
  50. for(j=j1;j<=j2;j++)
  51. {
  52. if(i==0||j==0)
  53. tmpArray[i][j]=0;
  54. else
  55. tmpArray[i][j]=ShowMax(tmpArray[i-1][j-1]+S(rar.Text[tb+j-1],rar.Pattern[pb+i-1]),tmpArray[i][j-1]+gap,tmpArray[i-1][j]+gap);
  56. }
  57. }
  58. for(i=0;i<=(te-tb);i++)
  59. {
  60. for(j=0;j<=(te-tb);j++)
  61. {
  62. log<<tmpArray[i][j]<<"  ";
  63. }
  64. log<<std::endl;
  65. }
  66.   int rangei=pe-pb,rangej=te-tb;
  67. score=ArrayMax(pe-pb,te-tb,rangei,rangej);
  68. log.close();
  69. return score;
  70. }
  71. float AlignmentClass::FinalAlign(AlignmentResult &rar,int tb,int te,int pb,int pe)
  72. {
  73. int i,j;
  74. float score=0;
  75. int tgapcount=0;
  76. int pgapcount=0;
  77. //int tmpArray[PSS4LineLength][PSS4LineLength];
  78. std::ofstream log("log1");
  79. for(i=0;i<=(pe-pb);i++)
  80. {
  81. //int j1=(i-(int)(reducematrix*(te-tb)))>0?(i-(int)(reducematrix*(te-tb))):0;
  82. //int j2=(i+(int)(reducematrix*(te-tb))<(te-tb))?(i+(int)(reducematrix*(te-tb))):(te-tb);
  83. for(j=0;j<=(te-tb);j++)
  84. {
  85. if(i==0||j==0)
  86. tmpArray[i][j]=0;
  87. else
  88. tmpArray[i][j]=ShowMax(tmpArray[i-1][j-1]+S(rar.Text[tb+j-1],rar.Pattern[pb+i-1]),tmpArray[i][j-1]+gap,tmpArray[i-1][j]+gap);
  89.   //tmpArray[i][j]=ShowMax(tmpArray[i-1][j-1]+S(rar.Text[tb+j-1],rar.Pattern[pb+i-1]),tmpArray[i][j-1]-gap,tmpArray[i-1][j]-gap);
  90. }
  91. }
  92. int rangei=pe-pb,rangej=te-tb;
  93. score=ArrayMax(pe-pb,te-tb,rangei,rangej);
  94.     /*log<<"tt";
  95. for(j=0;j<(te-tb);j++)
  96. log<<rar.Text[j]<<"t";
  97. log<<std::endl;*/
  98. /*for(i=0;i<=(pe-pb);i++)
  99. {
  100. if(i>0)
  101. log<<rar.Pattern[i-1]<<"t";
  102. else
  103. log<<"t";
  104. for(j=0;j<=(te-tb);j++)
  105. {
  106. log<<tmpArray[i][j]<<"t";
  107. }
  108. log<<std::endl;
  109. }*/
  110.  
  111. //for(i=(pe-pb),j=(te-tb);i>0&&j>0;)
  112. if(rangei<pe-pb)
  113. {
  114. //rar.Text=rar.gapinsert(rar.Text,te-tb,pe-pb-rangei,te-tb);
  115. for(int i=0;i<pe-pb-rangei;i++)
  116. {
  117. rar.TGapRecord.push_back(te-tb);
  118. tgapcount++;
  119. }
  120. //rar.Text[te-tb+pe-pb-rangei]='';
  121. }
  122. if(rangej<te-tb)
  123. {
  124. //rar.Pattern=rar.gapinsert(rar.Pattern,pe-pb,te-tb-rangej,pe-pb);
  125. for(int i=0;i<te-tb-rangej;i++)
  126. {
  127. rar.PGapRecord.push_back(pe-pb);
  128. pgapcount++;
  129. }
  130. //rar.Pattern[pe-pb+te-tb-rangej]='';
  131. }
  132. for(i=rangei,j=rangej;i>0&&j>0;)
  133. {
  134. float ttt=S(rar.Text[tb+j-1],rar.Pattern[pb+i-1]);
  135. if(tmpArray[i][j]==tmpArray[i-1][j-1]+ttt)
  136. {
  137. i--;
  138. j--;
  139. }
  140. else if(tmpArray[i][j]==tmpArray[i-1][j]+gap)
  141. {
  142. //rar.Text=rar.gapinsert(rar.Text,j-1,1,te-tb);
  143. rar.TGapRecord.push_back(j-1);
  144. tgapcount++;
  145. i--;
  146. }
  147. else if(tmpArray[i][j]==tmpArray[i][j-1]+gap)
  148. {
  149. //rar.Pattern=rar.gapinsert(rar.Pattern,i-1,1,pe-pb);
  150. rar.PGapRecord.push_back(i-1);
  151. pgapcount++;
  152. j--;
  153. }
  154. }
  155. if(i>0)
  156. {
  157. //rar.Text=rar.gapinsert(rar.Text,0,i,te-tb);
  158. for(int tmpi=0;tmpi<i;tmpi++)
  159. {
  160. rar.TGapRecord.push_back(-1);
  161. tgapcount++;
  162. }
  163. }
  164. if(j>0)
  165. {
  166. //rar.Pattern=rar.gapinsert(rar.Pattern,0,j,pe-pb);
  167. for(int tmpj=0;tmpj<j;tmpj++)
  168. {
  169. rar.PGapRecord.push_back(-1);
  170. pgapcount++;
  171. }
  172. }
  173. //score=tmpArray[pe-pb][te-tb];
  174. rar.SimScore=score;
  175. rar.Similarity=rar.SimScore/float(te-tb+pgapcount+tgapcount);
  176. rar.TGapCount=tgapcount;
  177. rar.PGapCount=pgapcount;
  178. rar.gapinsert();
  179. return score;
  180. }
  181. void AlignmentClass::MainAlignment(AlignmentResult &rar)
  182. {
  183. /*char *T=tar.Text;
  184. char *P=tar.Pattern;
  185. AlignmentResult rar;
  186. ResultAsignMent(&rar,&tar);*/
  187. bool RFlag=true,LFlag=true;
  188. int extcount=0;
  189. while(RFlag==true)//while(LFlag==TRUE||RFlag==TRUE)
  190. {
  191. if(LFlag==true)
  192. {
  193. //LeftExtend
  194. if(rar.IsPbegin()||rar.IsTbegin())
  195. {
  196. LFlag=false;
  197. }
  198. else
  199. {
  200. float Score=0;
  201. int Lext=rar.Lextern();
  202. Score=ExtAlign(rar,rar.TBegin-Lext,rar.TBegin,rar.PBegin-Lext,rar.PBegin);
  203. //int t1=(Score+rar.SimScore),t2=(Lext+(rar.PEnd-rar.PBegin)),t3=(rar.SimScore)+t1,t4=(rar.PEnd-rar.PBegin)+t2;
  204. if(Score/Lext<LocalSimDomain)
  205. LFlag=false;
  206. else
  207. {
  208. extcount++;
  209. //RFlag=true;
  210. rar.TBegin=rar.TBegin-Lext;
  211. rar.PBegin=rar.PBegin-Lext;
  212. //rar.SimScore=Score;
  213. //rar.Similarity=rar.SimScore/(rar.PEnd-rar.PBegin);
  214. }
  215. }
  216. if(RFlag==true)
  217. {
  218. //RExtend
  219. if(rar.IsPend()||rar.IsTend())
  220. {
  221. RFlag=false;
  222. }
  223. else
  224. {
  225. int Score=0;
  226. int Rext=rar.Rextern();
  227. Score=ExtAlign(rar,rar.TEnd,rar.TEnd+Rext,rar.PEnd,rar.PEnd+Rext);
  228. if(Score/Rext<LocalSimDomain)
  229. RFlag=false;
  230. else
  231. {
  232. extcount++;
  233. //LFlag=true;
  234. rar.TEnd=rar.TEnd+Rext;
  235. rar.PEnd=rar.PEnd+Rext;
  236. //rar.SimScore=Score;
  237. //rar.Similarity=rar.SimScore/(rar.PEnd-rar.PBegin);
  238. }
  239. }
  240. }
  241. }
  242. else
  243. {
  244. if(RFlag==true)
  245. {
  246. // RExtend();
  247. if(rar.IsPend()||rar.IsTend())
  248. {
  249. RFlag=false;
  250. }
  251. else
  252. {
  253. int Score=0;
  254. int Rext=rar.Rextern();
  255. Score=ExtAlign(rar,rar.TEnd,rar.TEnd+Rext,rar.PEnd,rar.PEnd+Rext);
  256. if(Score/Rext<LocalSimDomain)
  257. RFlag=false;
  258. else
  259. {
  260. extcount++;
  261. //LFlag=true;
  262. rar.TEnd=rar.TEnd+Rext;
  263. rar.PEnd=rar.PEnd+Rext;
  264. //rar.SimScore=Score;
  265. //rar.Similarity=rar.SimScore/(rar.PEnd-rar.PBegin);
  266. }
  267. }
  268. }
  269. }
  270. }
  271. if(extcount>=3)
  272. {
  273. rar.SimScore=FinalAlign(rar,rar.TBegin,rar.TEnd,rar.PBegin,rar.PEnd);
  274. rar.Similarity=rar.SimScore/(rar.PEnd-rar.PBegin);
  275. float m=rar.PatternCount;
  276. float n=rar.TextCount;
  277. float x=rar.SimScore;
  278. rar.p_value=1-exp(-K*m*n*exp(-L*x));
  279. }
  280. else
  281. {
  282. rar.SimScore=-1;
  283. rar.Similarity=-1;
  284. rar.p_value=-1;
  285. }
  286. //return rar;
  287. }
  288. int AlignmentResult::Lextern()
  289. {
  290. int i=(TBegin-ExtendStep)>0?ExtendStep:TBegin;
  291. int j=(PBegin-ExtendStep)>0?ExtendStep:PBegin;
  292. i=(i<=j?i:j);
  293. return i;
  294. }
  295. int AlignmentResult::Rextern()
  296. {
  297. int i=(TEnd+ExtendStep)<TextCount?ExtendStep:TextCount-TEnd;
  298. int j=(PEnd+ExtendStep)<PatternCount?ExtendStep:PatternCount-PEnd;
  299. i=(i<=j?i:j);
  300. return i;
  301. }
  302. bool AlignmentResult::IsTbegin()
  303. {
  304. if(TBegin==0)
  305. return true;
  306. else
  307. return false;
  308. }
  309. bool AlignmentResult::IsTend()
  310. {
  311. if(TEnd==TextCount)
  312. return true;
  313. else
  314. return false;
  315. }
  316. bool AlignmentResult::IsPend()
  317. {
  318. if(PEnd==PatternCount)
  319. return true;
  320. else
  321. return false;
  322. }
  323. bool AlignmentResult::IsPbegin()
  324. {
  325. if(PBegin==0)
  326. return true;
  327. else
  328. return false;
  329. }
  330. void AlignmentClass::ResultAsignMent(AlignmentResult& rar,AlignmentResult& tar)
  331. {
  332. rar.PBegin=tar.PBegin;
  333. rar.PEnd=tar.PEnd;
  334. rar.TBegin=tar.TBegin;
  335. rar.TEnd=tar.TEnd;
  336. rar.Similarity=tar.Similarity;
  337. rar.SimScore=tar.SimScore;
  338. rar.PatternCount=tar.PatternCount;
  339. rar.TextCount=tar.TextCount;
  340. rar.Text=tar.Text;
  341. rar.Pattern=tar.Pattern;
  342. }
  343. float S(char a,char b)//打分矩阵
  344. {
  345. int a1,b1;
  346. switch(a)
  347. {
  348. case '0':
  349.  a1=0;break;
  350. case '1':
  351.  a1=1;break;
  352. case '2':
  353.  a1=2;break;
  354. case '3':
  355.  a1=3;break;
  356. case ' ':
  357.  a1=4;break;
  358. }
  359. switch(b)
  360. {
  361. case '0':
  362.  b1=0;break;
  363. case '1':
  364.  b1=1;break;
  365. case '2':
  366.  b1=2;break;
  367. case '3':
  368.  b1=3;break;
  369. case ' ':
  370. b1=4;break;
  371. }
  372. if(a1==-1||b1==-1)
  373. return 0;
  374. float t=s[a1][b1];
  375. return t;
  376. }
  377. float ShowMax(float a,float b,float c)
  378. {
  379. float tmp=a>b?a:b;
  380. tmp=tmp>c?tmp:c;
  381. return tmp;
  382. }
  383. void AlignmentClass::test(AlignmentResult &tmpAR)
  384. {
  385. std::ofstream OutFile;
  386. OutFile.open("odata\test.out",std::ios::out|std::ios::app);
  387. //int tmpExt=Result.PEnd-Result.PBegin;
  388. int i,j;
  389. for(i=tmpAR.PBegin;i<tmpAR.PEnd;i++)
  390. {
  391. for(j=tmpAR.TBegin;j<tmpAR.TEnd;j++)
  392. {
  393. if(tmpArray[i][j]>=0)
  394. OutFile<<tmpArray[i][j]<<" ";
  395. else
  396. OutFile<<"*"<<" ";
  397. }
  398. OutFile<<std::endl;
  399. }
  400. }
  401. float ArrayMax(int a,int b,int &rangei,int &rangej)
  402. {
  403. float max;
  404. if(a<=0||b<=0)
  405. {
  406. rangei=0;
  407. rangej=0;
  408. return max=tmpArray[0][0];
  409. }
  410. else
  411. {
  412. max=tmpArray[a][a];
  413. rangei=a;
  414. rangej=b;
  415. for(int i=1;i<a;i++)
  416. {
  417. if(max<tmpArray[a-i][b])
  418. {
  419. rangei=a-i;
  420. max=tmpArray[a-i][b];
  421. }
  422. }
  423. for(int j=1;j<b;j++)
  424. {
  425. if(max<tmpArray[a][b-j])
  426. {
  427. rangej=b-j;
  428. max=tmpArray[a][b-j];
  429. }
  430. }
  431. return max;
  432. }
  433. }
  434. void AlignmentResult::gapinsert()
  435. {
  436. int PosMove=TGapRecord.size();
  437. if(!TGapRecord.empty())
  438. {
  439. int tmp=TGapRecord[PosMove-1];
  440. while(TGapRecord[PosMove-1]==-1)
  441. {
  442. AlignedT.push_back('-');
  443. if(PosMove>0)
  444. PosMove--;
  445. else
  446. break;
  447. }
  448. }
  449. for(int i=0;i<TextCount;i++)
  450. {
  451. AlignedT.push_back(Text[i]);
  452. int tmp=TGapRecord[PosMove-1];
  453. if(!TGapRecord.empty())
  454. {
  455. if(PosMove>0)
  456. {
  457. while(TGapRecord.at(PosMove-1)==i)
  458. {
  459. AlignedT.push_back('-');
  460. if(PosMove>0)
  461. PosMove--;
  462. else
  463. break;
  464. }
  465. }
  466. }
  467. }
  468. for(i=0;i<PosMove;i++)
  469. AlignedT.push_back('-');
  470. PosMove=PGapRecord.size();
  471. if(!PGapRecord.empty())
  472. {
  473. while(PGapRecord[PosMove-1]==-1)
  474. {
  475. AlignedP.push_back('-');
  476. if(PosMove>0)
  477. PosMove--;
  478. else
  479. break;
  480. }
  481. }
  482. for(i=0;i<PatternCount;i++)
  483. {
  484. AlignedP.push_back(Pattern[i]);
  485. if(!PGapRecord.empty())
  486. {
  487. if(PosMove>0)
  488. {
  489. while(PGapRecord.at(PosMove-1)==i)
  490. {
  491. AlignedP.push_back('-');
  492. if(PosMove>0)
  493. PosMove--;
  494. else
  495. break;
  496. }
  497. }
  498. }
  499. }
  500. for(i=0;i<PosMove;i++)
  501. AlignedP.push_back('-');
  502. }