# include # include # include # include # include # include # include # include # include # include #include #include #include // This shows one dna molecule, s1 is from 5' to 3' side, offset is with respect to the s1's start and negative towards left and positive towards right. s2 will be from 3' to 5' side then. #define maxlength 100 #define tracklength 100 #define max_free 1000 //------------------------------------------------------------------------- Display *disp; Colormap cm; Window w; GC gc; int whiteColor,blackColor; XColor greenColor,yellowColor,redColor,blueColor,purpleColor; #define NIL (0) // A name for the void pointer //------------------------------------------------------------------------ struct molecule { char* strand1; int offset; char* strand2; }; int total_free=0; int iscomplement(char* s1,int i1,int i2,char* s2,int j1,int j2,int direction) // s1 and s2 are in same direction for direction=1 { int iii,jjj; // if(s1[i1]=='t' && s1[i1+1]=='e' && s1[i2]=='c' && s2[j1]=='a' && s2[j1+1]=='c' && s2[j2]=='g') cout<<"MIL GAYA";getchar();getchar(); if(i1-i2==j1-j2) { if(direction==1) { // int i,j=j1; for(iii=i1,jjj=j1;iii<=i2;iii++,jjj++) { switch(s1[iii]) { case 'a':if(s2[jjj]!='t' && s2[jjj]!='T') return 0;break; case 'c':if(s2[jjj]!='g' && s2[jjj]!='G') return 0;break; case 't':if(s2[jjj]!='a' && s2[jjj]!='A') return 0;break; case 'g':if(s2[jjj]!='c' && s2[jjj]!='C') return 0;break; case 'e':if(s2[jjj]!='f') return 0;break; case 'f':if(s2[jjj]!='e') return 0;break; case 'i':if(s2[jjj]!='j') return 0;break; case 'j':if(s2[jjj]!='i') return 0;break; case '1':if(s2[jjj]!='6') return 0;break; case '2':if(s2[jjj]!='7') return 0;break; case '3':if(s2[jjj]!='8') return 0;break; case '4':if(s2[jjj]!='9') return 0;break; case '5':if(s2[jjj]!='0') return 0;break; case '6':if(s2[jjj]!='1') return 0;break; case '7':if(s2[jjj]!='2') return 0;break; case '8':if(s2[jjj]!='3') return 0;break; case '9':if(s2[jjj]!='4') return 0;break; case '0':if(s2[jjj]!='5') return 0;break; case 'A':if(s2[jjj]!='T' && s2[jjj]!='t') return 0;break; case 'C':if(s2[jjj]!='G' && s2[jjj]!='g') return 0;break; case 'T':if(s2[jjj]!='A' && s2[jjj]!='a') return 0;break; case 'G':if(s2[jjj]!='C' && s2[jjj]!='c') return 0;break; }; } return 1; } else { // int i,j=j2; for(iii=i1,jjj=j2;iii<=i2;iii++,jjj--) { switch(s1[iii]) { case 'a':if(s2[jjj]!='t' && s2[jjj]!='T') return 0;break; case 'c':if(s2[jjj]!='g' && s2[jjj]!='G') return 0;break; case 't':if(s2[jjj]!='a' && s2[jjj]!='A') return 0;break; case 'g':if(s2[jjj]!='c' && s2[jjj]!='C') return 0;break; case 'e':if(s2[jjj]!='f') return 0;break; case 'f':if(s2[jjj]!='e') return 0;break; case 'i':if(s2[jjj]!='j') return 0;break; case 'j':if(s2[jjj]!='i') return 0;break; case '1':if(s2[jjj]!='6') return 0;break; case '2':if(s2[jjj]!='7') return 0;break; case '3':if(s2[jjj]!='8') return 0;break; case '4':if(s2[jjj]!='9') return 0;break; case '5':if(s2[jjj]!='0') return 0;break; case '6':if(s2[jjj]!='1') return 0;break; case '7':if(s2[jjj]!='2') return 0;break; case '8':if(s2[jjj]!='3') return 0;break; case '9':if(s2[jjj]!='4') return 0;break; case '0':if(s2[jjj]!='5') return 0;break; case 'A':if(s2[jjj]!='T' && s2[jjj]!='t') return 0;break; case 'C':if(s2[jjj]!='G' && s2[jjj]!='g') return 0;break; case 'T':if(s2[jjj]!='A' && s2[jjj]!='a') return 0;break; case 'G':if(s2[jjj]!='C' && s2[jjj]!='c') return 0;break; }; } return 1; } } else return 0; } struct join { molecule mm; int jj; // -1 for free, 0 for left, 1 for front, 2 for right. }; //join headtrack[tracklength]; //int num_of_head=0; join symboltrack[tracklength]; int num_of_symbol=0; struct conc { molecule mm; int cc; // it shows the number of free molecules of this kind }; conc free_molecule[max_free]; int num_of_free=0; int dispcount=0; void display() { cout< m1.offset + l2 && done==0) //m1: upper strand has sticky end at right { if (m2.offset <0 ) //M1 UP RIGHT M2 LOW LEFT { if(iscomplement(m1.strand1,m1.offset+l2,l1-1,m2.strand2,0,-m2.offset-1,1)) { m.strand1=strcatt(m1.strand1,m2.strand1); m.strand2=strcatt(m1.strand2,m2.strand2); m.offset=m1.offset; done=1; } } if( l3-(m2.offset+l4) > 0 && done==0) //M1 UP RIGHT M2 UP RIGHT { if(iscomplement(m1.strand1,m1.offset+l2,l1-1,m2.strand1,m2.offset+l4,l3-1,-1)) { m.strand1=strcatt(m1.strand1,rev(m2.strand2)); m.strand2=strcatt(m1.strand2,rev(m2.strand1)); m.offset=m1.offset; done=1; } } } if( m1.offset>0 && done==0) //in m1 upper strand has a sticky end to its left { if(m2.offset>0 && done==0) //M1 UP LEFT M2 UP LEFT { if(iscomplement(m1.strand1,0,m1.offset-1,m2.strand1,0,m2.offset-1,-1)) { m.strand1=strcatt(rev(m2.strand2),m1.strand1); m.strand2=strcatt(rev(m2.strand1),m1.strand2); m.offset=m2.offset+l4-l3; done=1; } } if( l4+m2.offset-l3 >0 && done==0) //M1 UP LEFT M2 LOW RIGHT { if(iscomplement(m1.strand1,0,m1.offset-1,m2.strand2,l3-m2.offset,l4-1,1)) { m.strand1=strcatt(m2.strand1,m1.strand1); m.strand2=strcatt(m2.strand2,m1.strand2); m.offset=m2.offset; done=1; } } } if ( l2+m1.offset-l1 >0 && done==0) //m1: lower strand has a sticky end to its right { if(m2.offset>0 && done==0) //M1 LOW RIGHT M2 UP LEFT { if(iscomplement(m1.strand2,l1-m1.offset,l2-1,m2.strand1,0,m2.offset-1,1)) { m.strand1=strcatt(m1.strand1,m2.strand1); m.strand2=strcatt(m1.strand2,m2.strand2); m.offset=m1.offset; done=1; } } if( l4+m2.offset-l3 >0 && done==0) //M1 LOW RIGHT M2 LOW RIGHT { if(iscomplement(m1.strand2,l1-m1.offset,l2-1,m2.strand2,l3-m2.offset,l4-1,-1)) { m.strand1=strcatt(m1.strand1,rev(m2.strand2)); m.strand2=strcatt(m1.strand2,rev(m2.strand1)); m.offset=m1.offset; done=1; } } } if(m1.offset<0 && done==0) //in m1 lower strand has a sticky end to its left. { if (m2.offset <0 ) //M1 LOW LEFT M2 LOW LEFT { if(iscomplement(m1.strand2,0,-m1.offset-1,m2.strand2,0,-m2.offset-1,-1)) { m.strand1= strcatt(rev(m2.strand2),m1.strand1); m.strand2=strcatt(rev(m2.strand1),m1.strand2); m.offset=m2.offset+l4-l3; done=1; } } if( l3-(m2.offset+l4) > 0 && done==0) //M1 LOW LEFT M2 UP RIGHT { if(iscomplement(m1.strand2,0,-m1.offset-1,m2.strand1,m2.offset+l4,l3-1,1)) { m.strand1=strcatt(m2.strand1,m1.strand1); m.strand2=strcatt(m2.strand2,m1.strand2); m.offset=m2.offset; done=1; } } } return done; } int search1(char s[], char p[]) { int l1= strlen(s); for(int i=0;i=m.offset && k+6+28<=l1 && k+6+28<=m.offset+l2 && m.strand1[k+6+24]!='A' && m.strand1[k+6+24]!='C' && m.strand1[k+6+24]!='T' && m.strand1[k+6+24]!='G' && m.strand1[k+6+24]!='+' && m.strand2[k+6+27]!='A' && m.strand2[k+6+27]!='C' && m.strand2[k+6+27]!='T' && m.strand2[k+6+27]!='G' && m.strand2[k+6+27]!='+' ) { // k+6+25; copy(m1.strand1,m.strand1,0,k+6+24); copy(m2.strand1,m.strand1,k+6+25,l1-1); copy(m1.strand2,m.strand2,0,k+6+26); copy(m2.strand2,m.strand2,k+6+27,l2-1); m1.offset=m.offset; m2.offset=2; return 1; } else { k=search1(m.strand2,"gacgac"); if(k!=-1 && k+6+m.offset<=l1 && k+6<=l2 && k>=28 && k+m.offset >=28 && m.strand2[k-25]!='A' && m.strand2[k-25]!='C' && m.strand2[k-25]!='T' && m.strand2[k-25]!='G' && m.strand2[k-25]!='+' && m.strand1[k-28]!='A' && m.strand1[k-28]!='C' && m.strand1[k-28]!='T' && m.strand1[k-28]!='G' && m.strand1[k-28]!='+' ) { copy(m1.strand1,m.strand1,0,k-28); copy(m2.strand1,m.strand1,k-27,l1-1); copy(m1.strand2,m.strand2,0,k-26); copy(m2.strand2,m.strand2,k-25,l2-1); m1.offset=m.offset; m2.offset=2; return 1; } } return 0; } /* int restriction2(molecule &m1, molecule &m2, molecule m) { int k=search1(m.strand1,"ctggag"); int l1=strlen(m.strand1); int l2=strlen(m.strand2);//molecule m1,m2; if(k!=-1 && k>=m.offset && k+6+17<=l1 && k+6+17<=m.offset+l2) { // k+6+25; copy(m1.strand1,m.strand1,0,k+6+15); copy(m2.strand1,m.strand1,k+6+16,l1-1); copy(m1.strand2,m.strand2,0,k+6+13); copy(m2.strand2,m.strand2,k+6+14,l2-1); m1.offset=m.offset; m2.offset=-2; return 1; } else { k=search1(m.strand2,"gaggtc"); if(k!=-1 && k+6+m.offset<=l1 && k+6<=l2 && k>=17 && k+m.offset >=17) { copy(m1.strand1,m.strand1,0,k-15); copy(m2.strand1,m.strand1,k-14,l1-1); copy(m1.strand2,m.strand2,0,k-17); copy(m2.strand2,m.strand2,k-16,l2-1); m1.offset=m.offset; m2.offset=-2; return 1; } } return 0; } */ int restriction3(molecule &m1, molecule &m2, molecule m) { int k=search2(m.strand1,"gc*******gc"); int l1=strlen(m.strand1); int l2=strlen(m.strand2);//molecule m1,m2; if(k!=-1 && k>=m.offset && k+11<=l1 && k+11<=m.offset+l2 && m.strand1[k+6]!='A' && m.strand1[k+6]!='C' && m.strand1[k+6]!='T' && m.strand1[k+6]!='G' && m.strand1[k+6]!='+' && m.strand2[k+4]!='A' && m.strand2[k+4]!='C' && m.strand2[k+4]!='T' && m.strand2[k+4]!='G' && m.strand2[k+4]!='+' ) //return 0; { copy(m1.strand1,m.strand1,0,k+6); copy(m2.strand1,m.strand1,k+7,l1-1); copy(m1.strand2,m.strand2,0,k+3); copy(m2.strand2,m.strand2,k+4,l2-1); m1.offset=m.offset; m2.offset=-3; return 1; } return 0; } int restriction4(molecule &m1, molecule &m2, molecule m) { int k=search2(m.strand1,"cc*******gg"); int l1=strlen(m.strand1); int l2=strlen(m.strand2); //molecule m1,m2; if(k!=-1 && k>=m.offset && k+11<=l1 && k+11<=m.offset+l2 && m.strand1[k+6]!='A' && m.strand1[k+6]!='C' && m.strand1[k+6]!='T' && m.strand1[k+6]!='G' && m.strand1[k+6]!='+' && m.strand2[k+4]!='A' && m.strand2[k+4]!='C' && m.strand2[k+4]!='T' && m.strand2[k+4]!='G' && m.strand2[k+4]!='+' ) //return 0; { copy(m1.strand1,m.strand1,0,k+6); copy(m2.strand1,m.strand1,k+7,l1-1); copy(m1.strand2,m.strand2,0,k+3); copy(m2.strand2,m.strand2,k+4,l2-1); m1.offset=m.offset; m2.offset=-3; return 1; } return 0; } //--------------------------------------------- void graphic_disp() { int distance=40; int sticky_length=10; int width=3; int Hx1=20,Hy1=20,Hx2=360,Hy2=20; int Sx1=20,Sy1=160,Sx2=360,Sy2=160; //int h_length=60; int s_length=60; // track_head(); //track_symbol(); XClearWindow(disp,w); XSetForeground(disp,gc,blackColor); // XDrawLine(disp,w,gc,Hx1,Hy1,Hx2,Hy2); // XDrawString(disp,w,gc,Hx2+5,Hy2,"Heads",5); XDrawLine(disp,w,gc,Sx1,Sy1,Sx2,Sy2); XDrawString(disp,w,gc,Sx2+5,Sy2,"Symbols",7); /* for(int i=0;i=15 && symboltrack[i].mm.strand1[14]=='1' ) { XSetForeground(disp,gc,yellowColor.pixel); XDrawRectangle(disp,w,gc,Sx1+(i+1)*distance-5,Sy1+50,10,10); } else if(i%3==2 && strlen(symboltrack[i].mm.strand1)>=15 && symboltrack[i].mm.strand1[14]=='2' ) { XSetForeground(disp,gc,yellowColor.pixel); XDrawRectangle(disp,w,gc,Sx1+(i+1)*distance-5,Sy1+50,10,10); } else if(i%3==0 && strlen(symboltrack[i].mm.strand1)>=15 && symboltrack[i].mm.strand1[14]=='3' ) { XSetForeground(disp,gc,yellowColor.pixel); XDrawRectangle(disp,w,gc,Sx1+(i+1)*distance-5,Sy1+50,10,10); } else if(i%3==1) { XSetForeground(disp,gc,blackColor); XDrawRectangle(disp,w,gc,Sx1+(i+1)*distance-5,Sy1+50,10,10); XFillRectangle(disp,w,gc,Sx1+(i+1)*distance-5,Sy1+50,10,10); } else if(i%3==2) { XSetForeground(disp,gc,blackColor); XDrawRectangle(disp,w,gc,Sx1+(i+1)*distance-5,Sy1+50,10,10); XFillRectangle(disp,w,gc,Sx1+(i+1)*distance-5,Sy1+50,10,10); } else if(i%3==0) { XSetForeground(disp,gc,blackColor); XDrawRectangle(disp,w,gc,Sx1+(i+1)*distance-5,Sy1+50,10,10); XFillRectangle(disp,w,gc,Sx1+(i+1)*distance-5,Sy1+50,10,10); } } XFlush(disp); //sleep(0); } //--------------------------------------------- void run() { molecule result,result1,result2; int kk,kk1,kk2; /*for(int i=0;i0 && (rand()+0.0)/RAND_MAX <0.25) if(ligation(result,headtrack[i].mm,headtrack[i-1].mm)) { headtrack[i].jj=0; headtrack[i-1].jj=2; headtrack[i].mm=result; headtrack[i-1].mm=inv(result); cout<<"\nLIGATION"<<" head "<0 && (rand()+0.0)/RAND_MAX < free_molecule[j].cc/25.0 ) if(ligation(result,headtrack[i].mm,free_molecule[j].mm)) { free_molecule[j].cc--; headtrack[i].mm=result; total_free--; cout<<"\nLIGATION"<<" head "<0 && (rand()+0.0)/RAND_MAX <0.25) if(ligation(result,symboltrack[i].mm,symboltrack[i-1].mm)) { symboltrack[i].jj=0; symboltrack[i-1].jj=2; symboltrack[i].mm=result; symboltrack[i-1].mm=inv(result); if(i-1==0) cout<<"\nLIGATION"<<" symbol "<<"A"<<"0"<<" symbol "<<"I"<<"\n"; else if(i%3==2) cout<<"\nLIGATION"<<" symbol "<<"B"<0 && (rand()+0.0)/RAND_MAX < free_molecule[j].cc/25.0) if(ligation(result,symboltrack[i].mm,free_molecule[j].mm)) { free_molecule[j].cc--; symboltrack[i].mm=result; total_free--; if(i==0) cout<<"\nLIGATION"<<" symbol "<<"I"<<" with free"<<"\n"; else if(i%3==1) cout<<"\nLIGATION"<<" symbol "<<"A"<0 && free_molecule[j].cc>0 && (rand()+0.0)/RAND_MAX < 0 ) if(ligation(result,free_molecule[i].mm,free_molecule[j].mm)) { free_molecule[i].cc--; free_molecule[j].cc--; kk=find(result); if(kk!=-1) free_molecule[kk].cc++; else { free_molecule[num_of_free].mm=result; free_molecule[num_of_free].cc++; num_of_free++; } total_free--; cout<<"\nLIGATION"<<" free with free\n";graphic_disp();sleep(0);getchar(); } } display(); /* for(int i=0;i0 && (rand()+0.0)/RAND_MAX < 0 ) //free_molecule[i].cc/400.0) if(restriction1(result1, result2,free_molecule[i].mm)) { free_molecule[i].cc--; kk1=find(result1); kk2=find(result2); if(kk1==-1) { free_molecule[num_of_free].mm=result1; free_molecule[num_of_free].cc++; num_of_free++; } else { free_molecule[kk1].cc++; } if(kk2==-1) { free_molecule[num_of_free].mm=result2; free_molecule[num_of_free].cc++; num_of_free++; } else { free_molecule[kk2].cc++; } total_free++; cout<<"\nRestriction1"<<" free molecule";graphic_disp();sleep(0);getchar(); } if(free_molecule[i].cc>0 && (rand()+0.0)/RAND_MAX < 0) //free_molecule[i].cc/400.0) /*if(restriction2(result1, result2,free_molecule[i].mm)) { free_molecule[i].cc--; kk1=find(result1); kk2=find(result2); if(kk1==-1) { free_molecule[num_of_free].mm=result1; free_molecule[num_of_free].cc++; num_of_free++; } else { free_molecule[kk1].cc++; } if(kk2==-1) { free_molecule[num_of_free].mm=result2; free_molecule[num_of_free].cc++; num_of_free++; } else { free_molecule[kk2].cc++; } total_free++; cout<<"\nRestriction2"<<" free molecule";graphic_disp();sleep(0);getchar(); } */ if(free_molecule[i].cc>0 && (rand()+0.0)/RAND_MAX < 0) //free_molecule[i].cc/400.0) if(restriction3(result1, result2,free_molecule[i].mm)) { free_molecule[i].cc--; kk1=find(result1); kk2=find(result2); if(kk1==-1) { free_molecule[num_of_free].mm=result1; free_molecule[num_of_free].cc++; num_of_free++; } else { free_molecule[kk1].cc++; } if(kk2==-1) { free_molecule[num_of_free].mm=result2; free_molecule[num_of_free].cc++; num_of_free++; } else { free_molecule[kk2].cc++; } total_free++; cout<<"\nRestriction3"<<" free molecule";graphic_disp();sleep(0);getchar(); } if(free_molecule[i].cc>0 && (rand()+0.0)/RAND_MAX < 0) //free_molecule[i].cc/400.0) if(restriction4(result1, result2,free_molecule[i].mm)) { free_molecule[i].cc--; kk1=find(result1); kk2=find(result2); if(kk1==-1) { free_molecule[num_of_free].mm=result1; free_molecule[num_of_free].cc++; num_of_free++; } else { free_molecule[kk1].cc++; } if(kk2==-1) { free_molecule[num_of_free].mm=result2; free_molecule[num_of_free].cc++; num_of_free++; } else { free_molecule[kk2].cc++; } total_free++; cout<<"\nRestriction4"<<" free molecule";graphic_disp();sleep(0);getchar(); } } } int main(int argc, char* argv[]) { ifstream fin; if(argc==1) { cout<<"Please enter the input file name\n"; return 0; } else fin.open(argv[1]); // ifstream fin= /* fin>>num_of_head; for(int i=0;i>headtrack[i].mm.strand1>>headtrack[i].mm.strand2>>headtrack[i].mm.offset>>headtrack[i].jj; } */ fin>>num_of_symbol; for(int i=0;i>symboltrack[i].mm.strand1>>symboltrack[i].mm.strand2>>symboltrack[i].mm.offset>>symboltrack[i].jj; } fin>>num_of_free; for(int i=0;i>free_molecule[i].mm.strand1>>free_molecule[i].mm.strand2>>free_molecule[i].mm.offset>>free_molecule[i].cc; total_free+=free_molecule[i].cc; } //int steps=1; //--------------------------------------------------------------------- disp = XOpenDisplay(NIL); assert(disp); // Get some colors blackColor = BlackPixel(disp, DefaultScreen(disp)); whiteColor = WhitePixel(disp, DefaultScreen(disp)); cm=DefaultColormap(disp,DefaultScreen(disp)); greenColor.red=0; greenColor.green=65000 ; greenColor.blue=0; greenColor.flags=DoRed | DoGreen | DoBlue; XAllocColor(disp,cm,&greenColor); yellowColor.red=32000; yellowColor.green=32000 ; yellowColor.blue=0; yellowColor.flags=DoRed | DoGreen | DoBlue; XAllocColor(disp,cm,&yellowColor); redColor.red=65000; redColor.green= 0; redColor.blue=0; redColor.flags=DoRed | DoGreen | DoBlue; XAllocColor(disp,cm,&redColor); blueColor.red=0; blueColor.green=0 ; blueColor.blue=65000; blueColor.flags=DoRed | DoGreen | DoBlue; XAllocColor(disp,cm,&blueColor); purpleColor.red=32000; purpleColor.green=0 ; purpleColor.blue=32000; purpleColor.flags=DoRed | DoGreen | DoBlue; XAllocColor(disp,cm,&purpleColor); // Create the window w = XCreateSimpleWindow(disp, DefaultRootWindow(disp), 0, 0, 450, 300, 0, whiteColor, whiteColor); // We want to get MapNotify events XSelectInput(disp, w, StructureNotifyMask); // "Map" the window (that is, make it appear on the screen) XMapWindow(disp, w); // Create a "Graphics Context" gc = XCreateGC(disp, w, 0, NIL); // Tell the GC we draw using the white color XSetForeground(disp, gc, blackColor); // Wait for the MapNotify event for(;;) { XEvent e; XNextEvent(disp, &e); if (e.type == MapNotify) break; } // Draw the line //XDrawLine(disp, w, gc, 10, 10, 380, 10); // XDrawLine(disp, w, gc, 10, 190, 110, 190); // Send the "DrawLine" request to the server graphic_disp(); XFlush(disp); sleep(0);//getchar(); // Wait for 10 seconds // sleep(2); //--------------------------------------------------------------------- getchar(); int steps=8000; display(); for(int k=0;k