// motif_map.h - MotifMap( mm, iPower0, iPower1, 640, 480 ...); //- #include #include //#include using namespace std; // Num of significant motifs ploted in bold: // *** 08.01.01 #define _SIGNI_NUM 10 //void f_line( gdImagePtr& im, int iY0, int iY, int iX1, int iX2 ) { int f_clr( gdImagePtr& im, int x, int pMin, int pMax ) { // P1 < x < P2 : min/max // Colors: 450 -> 450/4 int xP; double iR, iG,iB, dP; // Note: Here iR, iG, iB - double ! int ddY; int iC; dP = 450. / (double)(pMax - pMin); // Colors per power unit iR=0.; iG=0.; iB =0.; xP = (int)(dP * (x - pMin)); xP -= (xP % 4 ); // Reduce colors to 450/4 ddY = xP; if( ddY < 200 ) { iR = ddY * 0.5; iR+= 155.; if( iR < 0 ) iR = 0.; } else { //+if( ddY < 400 ) { if( ddY <= 455 ) { //iR = 255; iG = ddY - 200; iR = 255.; //-iG = (ddY - 200) * 0.5; } } /** iC = gdImageColorExact(im , (int)iR, (int)iG, (int)iB ); if( iC < 0 ) return gdImageColorAllocate(im , (int)iR, (int)iG, (int)iB); **/ iC = gdImageColorResolve( im , (int)iR, (int)iG, (int)iB ); return iC; // ----------------------------------------------------- /** iG = ddY * 0.5; //iG -= 200; if( iG > 255. ) iG = 255.; return gdImageColorAllocate(im , 255, (int)iG, 0); **/ } int f_1stN( int iL ) { // iL = seq len; returns: 1st N to plot if( iL <= 20 ) return 1; // 14 24 34 44 54 64 74 84 94 int a[] = { -1, 1, 2, 2, 4, 4, 5, 5, 5, 5 }; int iB = (int)log10( iL ); // 310: 2,... int i, iFactor=1, iR, i1st; for( i = 0; i < iB; i++ ) iFactor *= 10; // 100 i1st = iL / iFactor; // 3 iR = (int)((a[i1st] * iFactor) * 0.1); // 2 * 10 = 20 - 1st N and up to 20 points max return iR; } // if( iMsg <= iMaxMsg && (*imm).first < P1 ) { void MotMapMsg( FILE *fOut, const char *seq1, const char *seq2, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, int iMsg, int iPref, double dP, int len, int left1, int left2, char *seq1Name, char *seq2Name ) { //#define __MMAP_MSG_LEN 63 #define __MMAP_MSG_LEN 58 int iLen = len; if( iLen > __MMAP_MSG_LEN ) iLen = __MMAP_MSG_LEN; char buf1[__MMAP_MSG_LEN+1], buf2[__MMAP_MSG_LEN+1]; const char *tail = "..."; fprintf( fOut, " \n", s1Name, buf1, s2Name, buf2, iPref ); //seq1Name, buf1, seq2Name, buf2, iPref ); #undef __MMAP_MSG_LEN } // Pdrop/10 - only to output // P0/10, P1/10 void MotifMap( multimap< int, motif_opt > mm, int Pdrop, int P0, int P1, int iW, int iH, WorkSeq &wSeq1, WorkSeq &wSeq2, char *seq1Name, char *seq2Name, char *sOpt, FILE *fOut, int iMaxPlot, int iMaxOut, char *sFName, int iPref ) { //+int iLenLow, int iAccurate, char* wm_name, FILE *fOut, int iMaxOut ) { //int P00, int P11, intP22, int len1, int len2, int iW, int iH ) { multimap< int, motif_opt >::iterator imm; // Adjust P1: // *** 08.01.01 multimap< int, motif_opt >::reverse_iterator ir; int iQ = 0, iQ0; if( P1 == 0 ) { for( ir = mm.rbegin(); ir != mm.rend(); ir++ ) { iQ++; if( (*ir).first <= P0 ) { if( iQ == 1 ) { P1 = P0; } break; } if( iQ <= _SIGNI_NUM ) P1 = (*ir).first; //if( iQ == 10 ) break; //if( iQ == _SIGNI_NUM ) break; if( iQ == (_SIGNI_NUM * 2) ) break; } // mediana: if( iQ > 1 && (iQ < (_SIGNI_NUM * 2)) ) { iQ0 = (int)(iQ * 0.5 + 0.5 ); if( iQ0 == 1 ) iQ0 = 2; if( iQ0 > iQ ) iQ0 = iQ; //cout << "iQ0 = " << iQ0 << ", " << iQ << endl; iQ = 0; for( ir = mm.rbegin(); ir != mm.rend(); ir++ ) { iQ++; if( iQ == iQ0 ) { P1 = (*ir).first; break; } } } } // ---------------------------------------- end of adjust FILE *out; gdImagePtr im_out; // Color indexes int white; int blue, lblue; int red; int green, dgreen; int white2, lwhite, lwhite2, brown, brown2; int gray, lgray, vlgray, black; int i, j=0, iWk, iWk1, iWk2, dX_wk, dY_wk, iC; //++int iW=800, iH=480; int dX1, dX2, dY1, dY2; int dSP1, dSP2; // pixels in one space int SN1 = 10 , SN2 ; // 1st numbers int SL1 , SL2 ; // len in dSN units double xP, yP; // Factor; N -> pixels // Offsets: //dX1 = 32; dX2 = 32; dY1 = 16; dY2 = 16 + 16 + 16 ; //16; //+dX1 = 42; dX2 = 22; dY1 = 16; dY2 = 8 + 16 + 16 + 16 ; //16; dX1 = 42; dX2 = 22; dY1 = 26; dY2 = 8 + 16 + 16 + 16 ; //16; SL1 = 17; SL2 = 17; dSP1 = 34; dSP2 = 26; //xP = 3.4; //yP = 2.6; SN1 = f_1stN( wSeq1.len() ); SL1 = (int)(wSeq1.len() / SN1) + 1; dSP1 = (int)((double)(iW - dX1 - dX2) / SL1 + 0.5); xP = (double)dSP1 / SN1; SN2 = f_1stN( wSeq2.len() ); SL2 = (int)(wSeq2.len() / SN2) + 1; dSP2 = (int)((double)(iH - dY1 - dY2) / SL2 + 0.5); yP = (double)dSP2 / SN2; // Tune dX2, dY1 a little: dY1 = iH - dY2 - SL2 * dSP2; dX2 = iW - dX1 - SL1 * dSP1; #ifdef _TRACE cout << " -- SL1 (17) = " << SL1 << ", dSP1 (34) = " << dSP1 << ", xP (?3.4) = " << xP << endl; cout << " -- SL2 (17) = " << SL2 << ", dSP2 (26) = " << dSP2 << ", yP (?2.6) = " << yP << endl; #endif char buf100[100]; // Create output image im_out = gdImageCreate( iW, iH ); white = gdImageColorAllocate(im_out , 255, 255, 255); white2= gdImageColorAllocate(im_out, 247, 250, 255); //pwhite = gdImageColorAllocate(im_out2, 255, 255, 127); // Set transparent color. //gdImageColorTransparent(im_out , white); red = gdImageColorAllocate(im_out , 255, 0, 0); green = gdImageColorAllocate(im_out , 0, 255, 0); dgreen= gdImageColorAllocate(im_out , 0, 100, 0); blue = gdImageColorAllocate(im_out , 0, 0, 255); lblue = gdImageColorAllocate(im_out , 185, 215, 255); //lblue = gdImageColorAllocate(im_out , 100, 150, 200); brown = gdImageColorAllocate(im_out , 102, 51, 0); black = gdImageColorAllocate(im_out, 0, 0, 0); brown2 = gdImageColorAllocate(im_out, 7, 0, 0); gray = gdImageColorAllocate(im_out, 200, 200, 200); lgray = gdImageColorAllocate(im_out, 222, 222, 222); vlgray = gdImageColorAllocate(im_out, 250, 250, 250); lwhite = gdImageColorAllocate(im_out, 255, 250, 255); //lwhite2= gdImageColorAllocate(im_out, 255, 249, 232); //lwhite2= gdImageColorAllocate(im_out, 255, 240, 230); //lwhite2= gdImageColorAllocate(im_out, 247, 255, 255); lwhite2= gdImageColorAllocate(im_out, 247, 247, 255); gdImageFilledRectangle( im_out , 0, 0, iW - 1, iH - 1, white); // ? // internal gdImageFilledRectangle( im_out , dX1, dY1, iW - dX2, iH - dY2, white2); for( i = 0; i < 5; i++ ) { //iWk = 41 - i*5; // 0 = lgray 31 iWk = 50 - i*5; // 0 = lgray 31 iC = gdImageColorAllocate(im_out, 255 - iWk, 255 - iWk, 255 - iWk); gdImageLine(im_out, 1+i, 1+i, iW - i, 1+i, iC); gdImageLine(im_out, 1+i, 1+i, 1+i , iH - i, iC); } gdImageFilledRectangle(im_out, 1+i, 1+i, iW - i , dY1 - 1, iC ); gdImageFilledRectangle(im_out, 1+i, 1+i, dX1 - 1, iH - i, iC ); int iC2 = iC; // Light gray at right-lower: gdImageLine(im_out, iW - 1, iH - 1, iW - 1, 1 , gray); gdImageLine(im_out, iW - 1, iH - 1, 1 , iH - 1, gray); gdImageFilledRectangle(im_out, iW - dX2 + 1, dY1, iW - i, iH - i, iC2); gdImageFilledRectangle(im_out, dX1 , iH - dY2 + 1 ,iW - i, iH - i, iC2); // White lines: (..dark lines see below) gdImageLine(im_out, dX1 - 1 , dY1 - 1 , iW - dX2 + 1, dY1 - 1 , white); gdImageLine(im_out, dX1 - 1 , dY1 - 1 , dX1 - 1 , iH - dY2 + 1, white); gdImageLine(im_out, dX1 - 2 , dY1 - 2 , iW - dX2 + 2, dY1 - 2 , white); gdImageLine(im_out, dX1 - 2 , dY1 - 2 , dX1 - 2 , iH - dY2 + 2, white); gdImageLine(im_out, dX1 - 3 , dY1 - 2 , dX1 - 3 , iH - dY2 + 2, white); // Left-upper black frame: gdImageLine(im_out, 0, 0, iW - 1, 0, black); gdImageLine(im_out, 0, 0, 0 , iH - 1, black); char buf6[7]; // Y-lines: dX_wk = dX1 + dSP1; // + X_year; // 1st SEQ //for( i = 1; i < SL1; i++ ) { for( i = 1; i <= SL1; i++ ) { //-for( i = 0; i < SL1; i++ ) { iC = lgray; if( i % 2 == 0 ) iC = lblue; iWk2 = 0; if( ( i + 1 ) % 2 == 0 ) { // gdImageFilledRectangle( im_out , dX_wk+1, dY1+1, dX_wk + dSP1 - 1, // iH - dY2 - 1, lwhite); // transporent? //-if( ( i ) % 2 == 0 ) { gdImageFilledRectangle( im_out , dX_wk - dSP1 +1, dY1+1, dX_wk - 1, iH - dY2 - 1, lwhite2); // transporent? //iH - dY2 - 1, lwhite); // transporent? //itoa( (i+1)*10, buf6, 10 ); // 10 -> SN //gdImageString(im_out, gdFontSmall, dX_wk +dSP1 - 6, iH - dY2, //dY1 + 6, // (unsigned char*)buf6, brown2 ); } if( i % 2 == 0 ) { //itoa( i*10, buf6, 10 ); // 10 -> SN //+itoa( i*SN1, buf6, 10 ); // 10 -> SN sprintf( buf6, "%d\0", i*SN1); gdImageString(im_out, gdFontSmall, dX_wk - 6, iH - dY2, //dY1 + 6, (unsigned char*)buf6, brown2 ); //(unsigned char*)"20", brown2 ); } //+gdImageLine(im_out, dX_wk, dY1, dX_wk, iH - dY2, iC); dX_wk += dSP1; } // X-lines: dY_wk = iH - dY2 - dSP2; // + X_year; // 1st SEQ for( i = 1; i < SL1; i++ ) { iC = lgray; if( i % 2 == 0 ) iC = lblue; iWk2 = 0; //gdImageLine(im_out, dX1, dY_wk, iW - dX2, dY_wk, iC); gdImageDashedLine(im_out, dX1, dY_wk, iW - dX2, dY_wk, iC); if( i % 2 == 0 ) { //itoa( i*10, buf6, 10 ); //+itoa( i*SN2, buf6, 10 ); sprintf( buf6, "%d\0", i*SN2 ); //gdImageString(im_out, gdFontSmall, dX1 - 7 - 6* (int)(log10(i*10)), dY_wk - 7, gdImageString(im_out, gdFontSmall, dX1 - 9 - 6* (int)(log10(i*SN2)), dY_wk - 7, (unsigned char*)buf6, brown2 ); //gdImageString(im_out, gdFontSmall, dX1 - 13, dY_wk - 7, //(unsigned char*)"20", brown2 ); //(unsigned char*)sY[iY5], brown2 ); } dY_wk -= dSP2; } //cout << " - Lines" << endl; // ..white lines see above gdImageLine(im_out, dX1 , dY1 , iW - dX2, dY1, brown); gdImageLine(im_out, dX1 , dY1 , dX1 , iH - dY2, brown); gdImageLine(im_out, dX1 , iH - dY2, iW - dX2, iH - dY2, brown); gdImageLine(im_out, iW - dX2, dY1, iW - dX2, iH - dY2, brown); // Min/max power: int iP, Pmin, Pmax; // Check if empty: if( mm.empty() ) { gdImageString(im_out, gdFontGiant, (int)((iW - 9.*30.) * 0.5) , (int)(iH * 0.4), // (unsigned char*)"DOTHELIX MOTIFS' COLLECTION MAP", red ); (unsigned char*)" NO MOTIFS ARE FOUND.", red ); gdImageString(im_out, gdFontGiant, (int)((iW - 9.*30.) * 0.5) , (int)(iH * 0.4)+40, (unsigned char*)" TRY SMALLER THRESHOLDS.", red ); out = fopen( sFName, "wb"); // Write PNG gdImagePng(im_out , out); fclose(out); gdImageDestroy(im_out); return; // -----------------------------------> } imm = mm.end(); imm--; // at least one! //Pmax = (*imm).first; Pmin = -((*imm).first); // -max imm = mm.begin(); //Pmin = (*imm).first; Pmax = -((*imm).first); // -min #ifdef _TRACE cout << " -- Pmax before adjust*10 = " << Pmax << endl; #endif // Adjust min for Clr: int PmaxC = Pmax; if( PmaxC > -P0 ) PmaxC = -P0; //if( Pmax > -60 && Pmax < -30 ) Pmax = -30; //if( Pmax < -60 ) Pmax = -60; if( PmaxC > -P1 && PmaxC < -P0 ) PmaxC = -P0; if( PmaxC < -P1 ) PmaxC = -P1; if( PmaxC > -P0 ) PmaxC = -P0; #ifdef _TRACE cout << " -- Pmax*10 = " << -Pmin << ", PminC*10 = " << -PmaxC << endl; #endif // Motif lines: iC = brown; int iCmid = white, iPmid = P0; int iMsg, iSize = mm.size(), iMaxMsg = iMaxOut; //, iPlot; iQ = 0; // for( imm = mm.begin(); imm != mm.end(); imm++ ) { //cout << " P = " << (*imm).first << ", X = " << ((*imm).second).x // << ", Y = " << ((*imm).second).y // << ", Len = " << ((*imm).second).len // << endl; iQ++; iMsg = iSize - iQ + 1; if( iMsg > iMaxPlot ) continue; // <---------------------- iP = (*imm).first; if( iP < P0 ) { iC = lgray; } else { if( iP > 70 ) { // ? iC = f_clr( im_out, -iP, Pmin, PmaxC ); } else iC = f_clr( im_out, -iP, Pmin, PmaxC ); if( iP < P1 ) {iCmid = iP; iPmid = iP; } // ordered + } iWk = ((*imm).second).len; iWk1 = dX1 + (int)(((*imm).second).x * xP + 0.5); iWk2 = iH - dY2 - (int) ( ((*imm).second).y * yP + 0.5); gdImageLine(im_out, iWk1, iWk2, iWk1 + (int)((iWk * xP)+ 0.5), iWk2 - (int)(iWk * yP + 0.5), iC); gdImageLine(im_out, iWk1+1, iWk2, iWk1 + (int)((iWk * xP)+ 0.5), iWk2 - (int)(iWk * yP + 0.5 - 1), iC); // ?+1 gdImageLine(im_out, iWk1, iWk2 - 1, iWk1 + (int)((iWk * xP) - 1.5), iWk2 - (int)(iWk * yP + 0.5), iC); //+if( (*imm).first >= P0 ) { if( (*imm).first >= P0 || iQ == iSize) { // +max in any case *** 20.02.01 gdImageLine(im_out, iWk1+2, iWk2, iWk1 + (int)((iWk * xP)+ 0.5), iWk2 - (int)(iWk * yP + 0.5 - 2), iC); // +2 ? gdImageLine(im_out, iWk1, iWk2 - 2, iWk1 + (int)((iWk * xP) - 2.5), iWk2 - (int)(iWk * yP + 0.5), iC); // s - e : if( (*imm).first >= P0 ) { // *** 20.02.01 gdImageString(im_out, gdFontSmall, iWk1, iWk2 - 4, (unsigned char*)"s", blue ); gdImageString(im_out, gdFontSmall, iWk1 + (int)((iWk * xP)+ 0.5 - 4), iWk2 - (int)(iWk * yP + 0.5 + 11), (unsigned char*)"e", dgreen ); } if( iMsg <= iMaxMsg && (*imm).first < P1 ) { MotMapMsg( fOut, wSeq1.seq(), wSeq2.seq(), iWk1+2, iWk2, iWk1, iWk2 - 2, iWk1 + (int)((iWk * xP) - 2.5), iWk2 - (int)(iWk * yP + 0.5), iWk1 + (int)((iWk * xP)+ 0.5), iWk2 - (int)(iWk * yP + 0.5 - 2), iMsg, iPref, (double)iP * 0.1, iWk, ((*imm).second).x, ((*imm).second).y, seq1Name, seq2Name ); } } //+if( (*imm).first >= P1 ) { if( (*imm).first >= P1 || iQ == iSize) { // +max in any case *** 20.02.01 gdImageLine(im_out, iWk1+3, iWk2, iWk1 + (int)((iWk * xP)+ 0.5), iWk2 - (int)(iWk * yP + 0.5 - 3), iC); gdImageLine(im_out, iWk1+4, iWk2, iWk1 + (int)((iWk * xP)+ 0.5), iWk2 - (int)(iWk * yP + 0.5 - 4), iC); gdImageLine(im_out, iWk1, iWk2 - 3, iWk1 + (int)((iWk * xP) - 3.5), iWk2 - (int)(iWk * yP + 0.5), iC); gdImageLine(im_out, iWk1, iWk2 - 4, iWk1 + (int)((iWk * xP) - 4.5), iWk2 - (int)(iWk * yP + 0.5), iC); if( iMsg <= iMaxMsg ) { MotMapMsg( fOut, wSeq1.seq(), wSeq2.seq(), iWk1+4, iWk2, iWk1, iWk2 - 4, iWk1 + (int)((iWk * xP) - 4.5), iWk2 - (int)(iWk * yP + 0.5), iWk1 + (int)((iWk * xP)+ 0.5), iWk2 - (int)(iWk * yP + 0.5 - 4), iMsg, iPref, (double)iP * 0.1, iWk, ((*imm).second).x, ((*imm).second).y, seq1Name, seq2Name ); } } } //int iCmax = iC; int iCmax = f_clr( im_out, Pmin, Pmin, PmaxC ); int iPmax = iP; int iPmin = -Pmax; /** // Seqs: gdImageString(im_out, gdFontSmall, dX1 + 10, iH - dY2 , (unsigned char*)"Seq1", brown ); gdImageStringUp(im_out, gdFontSmall, dX1 - 16, iH - dY2 - 8, (unsigned char*)"Seq2", brown ); **/ // Seq names: gdImageString(im_out, gdFontTiny, dX1, iH - dY2 + 9, (unsigned char*)seq1Name, dgreen ); gdImageStringUp(im_out, gdFontTiny, 6 + 14, iH - 16, (unsigned char*)seq2Name, blue ); // Seq1 iWk = (iW - dX1 - dX2 ) / 6 - 4; // num. of letters int iL = wSeq1.len(); char *buf1; if( iL > iWk ) { buf1 = new char[iWk+4]; //wSeq1.set( iWk , '.' ); //wSeq1.s[iWk ] = '.'; //wSeq1.set( iWk + 1, '.' ); //wSeq1.set( iWk + 2, 0 ); strncpy( buf1, wSeq1.seq(), iWk ); strcpy ( buf1+iWk - 1, ".." ); gdImageString(im_out, gdFontSmall, dX1, iH - dY2 + 16 , (unsigned char*)buf1, dgreen ); delete buf1; } else { gdImageString(im_out, gdFontSmall, dX1, iH - dY2 + 16 , (unsigned char*)(wSeq1.seq()), dgreen ); } // Seq2 iWk = (iH - dY1 - dY2 ) / 6 - 4; // num. of letters iL = wSeq2.len(); if( iL > iWk ) { buf1 = new char[iWk+4]; //wSeq2.set( iWk , '.' ); //wSeq1.s[iWk ] = '.'; //wSeq2.set( iWk + 1, '.' ); //wSeq2.set( iWk + 2, 0 ); strncpy( buf1, wSeq2.seq(), iWk ); strcpy ( buf1+iWk - 1, ".." ); gdImageStringUp(im_out, gdFontSmall, 6, iH - dY2 , (unsigned char*)buf1, blue ); delete buf1; } else { gdImageStringUp(im_out, gdFontSmall, 6, iH - dY2 , (unsigned char*)(wSeq2.seq()), blue ); } // Legends: gdImageString(im_out, gdFontSmall, dX1, iH - dY2 + 16 + 16 , (unsigned char*)"Legends: ", brown ); // + 11 * 6 iWk = iH - dY2 + 16 + 16 + 5; iL = dSP1; // * 2; iWk2 = dX1 + 11*6 + iL; gdImageString(im_out, gdFontSmall, iWk2, iWk - 5 - 6 , (unsigned char*)"max", brown ); // + 11 * 6 for( i = 0; i < 6; i++ ) { gdImageLine(im_out, iWk2, iWk, iWk2 + iL, iWk, (iPmax >= P0 ? iCmax : gray ) ); iWk++; } //iWk2 = dX1 + 11*6 + iL + 3; iWk2 += (iL + 3); #ifdef _TRACE cout << " -- iPmax*10 = " << iPmax << ", iPmin*10 = " << iPmin << endl; #endif //gdImageString(im_out, gdFontSmall, iWk2 - 3*7, iH - dY2 + 16 + 16 , // (unsigned char*)"max", brown ); // + 11 * 6 //+sprintf( buf100, "%d ", int((iPmax + 5 ) * 0.1) ); //+sprintf( buf100, "%.1f (max) ", double(iPmax*0.1) ); sprintf( buf100, "%.1f ", double(iPmax*0.1) ); buf100[12] = 0; gdImageString(im_out, gdFontSmall, iWk2, iH - dY2 + 16 + 16 , (unsigned char*)buf100, brown ); // + 11 * 6 //(unsigned char*)"12", brown ); // + 11 * 6 iWk2 += (6*10); // ..P1 (mediana) if( P1 > P0 ) { // *** 20.02.01 iWk = iH - dY2 + 16 + 16 + 5; for( i = 0; i < 6; i++ ) { gdImageLine(im_out, iWk2, iWk, iWk2 + iL, iWk, f_clr(im_out, -P1, Pmin, PmaxC) ); //f_clr(im_out, -60, Pmin, Pmax) ); iWk++; } iWk2 += (iL + 3); sprintf( buf100, "%.1f ", double(P1*0.1) ); buf100[12] = 0; gdImageString(im_out, gdFontSmall, iWk2, iH - dY2 + 16 + 16 , (unsigned char*)buf100, brown ); // + 11 * 6 "6" iWk2 += (6*10); } // ..mid iWk = iH - dY2 + 16 + 16 + 5+1; #ifdef _TRACE // cout << " -- iPmin*10 = " << iPmin << endl; #endif //if( iPmin < 60 ) { if( iPmin < P1 ) { if( P1 != P0 ) { iC = f_clr(im_out, -P0, Pmin, PmaxC) ; //iC = f_clr(im_out, -30, Pmin, Pmax) ; for( i = 0; i < 4; i++ ) { gdImageLine(im_out, iWk2, iWk, iWk2 + iL, iWk, iC ); //iCmid); iWk++; } iWk2 += (iL + 3); sprintf( buf100, "%.1f ", double(P0*0.1) ); buf100[12] = 0; gdImageString(im_out, gdFontSmall, iWk2, iH - dY2 + 16 + 16 , (unsigned char*)buf100, brown ); // + 11 * 6 "3" iWk2 += (6*10); } // if( iPmin < 30 ) { if( iPmin < P0 ) { // ..lgray iWk = iH - dY2 + 16 + 16 + 5+2; for( i = 0; i < 2; iWk++, i++ ) { gdImageLine(im_out, iWk2, iWk, iWk2 + iL, iWk, gray ); //lgray); } //+gdImageLine(im_out, iWk2, iWk, iWk2 + iL, iWk, gray); // underline iWk2 += (iL + 3); if( Pdrop > 0 ) sprintf( buf100, "%.1f <= noise < %.1f ", double(Pdrop*0.1), double(P0*0.1) ); else sprintf( buf100, "noise less than %.1f ", double(P0*0.1) ); buf100[25] = 0; gdImageString(im_out, gdFontSmall, iWk2, iH - dY2 + 16 + 16 , (unsigned char*)buf100, brown ); // + 11 * 6 "power less than 3" } } // Opts: /** sprintf( buf100, "Length=%d, Accurate=%d,%s ", iLenLow, iAccurate, wm_name); buf100[50] = 0; //gdImageStringUp(im_out, gdFontTiny, iW - 20, iH - dY2 - 16, gdImageStringUp(im_out, gdFontTiny, iW - 16, iH - dY2 - 2, (unsigned char*)buf100, brown ); // wm_name **/ //gdImageStringUp(im_out, gdFontTiny, iW - 16, iH - dY2 - 2, gdImageStringUp(im_out, gdFontTiny, iW - 17, iH - dY2 - 2, (unsigned char*)sOpt, brown ); // wm_name // Seq names: gdImageString(im_out, gdFontTiny, 4, 4, (unsigned char*)seq1Name, dgreen ); gdImageString(im_out, gdFontTiny, 4, 11, (unsigned char*)seq2Name, blue ); // Title //+gdImageString(im_out, gdFontGiant, dX1 + 50, 5, gdImageString(im_out, gdFontGiant, (int)((double)(iW - 9*30) * 0.5) , 5, (unsigned char*)"DOTHELIX MOTIFS' COLLECTION MAP", brown ); /** //gdImageString(im_out, gdFontSmall, dX1 + 400, 2, // (unsigned char*)"Power thresholds: 3 and 6", brown ); sprintf( buf100, "Power thresholds: %.1f, %.1f, and %.1f ", double(Pdrop*0.1), double(P0*0.1), double(P1*0.1) ); //Pdrop*0.1, 3.3, P1 ); buf100[40] = 0; // 380 gdImageString(im_out, gdFontSmall, dX1 + 370, 5, (unsigned char*)buf100, brown ); **/ iWk = iW - 92; gdImageString(im_out, gdFontTiny, iWk, 4, (unsigned char*)"Power thresholds:", brown ); //+sprintf( buf100, "%.1f, %.1f, and %.1f \0", //***08.01.01 //+ double(Pdrop*0.1), double(P0*0.1), double(P1*0.1) ); sprintf( buf100, " %.1f, and %.1f \0", double(Pdrop*0.1), double(P0*0.1) ); //buf100[40] = 0; gdImageString(im_out, gdFontTiny, iWk, 11, (unsigned char*)buf100, brown ); // Check if empty: if( mm.empty() ) { gdImageString(im_out, gdFontGiant, (int)((iW - 9.*30.) * 0.5) , (int)(iH * 0.4), // (unsigned char*)"DOTHELIX MOTIFS' COLLECTION MAP", red ); (unsigned char*)" NO MOTIFS ARE FOUND.", red ); gdImageString(im_out, gdFontGiant, (int)((iW - 9.*30.) * 0.5) , (int)(iH * 0.4)+40, (unsigned char*)" TRY SMALLER THRESHOLDS.", red ); } //+out = fopen("mot10_1.png", "wb"); //sprint( buf100, "%s%d.png\0", sFName, iPref ); out = fopen( sFName, "wb"); // Write PNG gdImagePng(im_out , out); fclose(out); gdImageDestroy(im_out); /***/ } // EOF