// aligra_image.h - AligraImage( mm, iPower0, iPower1, 640, 480 ...); *** 06.06.2001 // 04.07.2001 - splitting // *** 22.08.2001 // Alex //typedef multimap< double, int, greater< double >, alloc > orSumsDef; typedef multimap< double, int, greater< double > > orSumsDef; #define _IMAGE_WIDTH_SMALL 450 #include // ------------------- GD components #include "gd.h" #include "gdfontg.h" #include "gdfontl.h" #include "gdfontmb.h" #include "gdfonts.h" #include "gdfontt.h" // -------------------------------- #include //#include "aligwl.h" // see below void f_setGroupColors( gdImagePtr& im, int *aClr, int iRM, int iGM, int iBM ) // clrs & limits { int i; for( i = 0; i < (iGM - 1); ++i ) { //aClr[0] = f_clrGreen( im, 1, 0, iGM ); //aClr[1] = f_clrGreen( im, 2, 0, iGM ); aClr[i] = f_clrGreen( im, i+1, 0, iGM ); } for( i = 0; i < (iBM - 1); ++i ) { //aClr[3] = f_clrBlue ( im, 1, 0, iBM ); //aClr[4] = f_clrBlue ( im, 2, 0, iBM ); aClr[i+iGM - 1] = f_clrBlue ( im, i+1, 0, iBM ); } for( i = 0; i < (iRM - 1); ++i ) { //aClr[6] = f_clr( im, iRM - 1, 0, iRM ); //aClr[7] = f_clr( im, iRM - 2, 0, iRM ); //aClr[8] = f_clr( im, iRM - 3, 0, iRM ); aClr[i+iGM+iBM - 2] = f_clr( im, iRM - i - 1, 0, iRM ); } } void f_outCharFilled( gdImagePtr& im, ImageOptions cfg, int iSeq, int iX1, int iY1, int iX2, int iY2, int iC, int dgray ) { double dY, dY0, dX, dX0; int iY11, iY22, iX11, iX22; int fillType = cfg.fillType; //fillType = 5; //fillType = 6; //fillType = 7; // very weighted middle // weighted top if( fillType == 5 ) { dY = ( (double)(iY2 - iY1 + 1) * cfg.Weight) / cfg.WeightLineMax; if( dY < 1. ) dY = 1.; iY22 = (int)((double)iY1 + dY + 0.5); if( iY22 > iY2 ) iY22 = iY2; gdImageFilledRectangle( im , iX1, iY1, iX2, iY22, iC ); //aClr[iG] ); if( (iX2 - iX1) > 3 ) { gdImageRectangle( im , iX1, iY1, iX2, iY2, iC ); //, aClr[iG] ); } //cout << "*** wei/max = " << cfg.Weight << "/" << cfg.WeightLineMax // << ", iY2/iY22 = " << iY2 << "/" << iY22 << endl; //getch(); // weighted middle - space on Y, X is filled } else if( fillType == 6 ) { // upper line if( iSeq%2 == 0 ) { gdImageLine( im , iX1, iY1+1, iX2, iY1+1, dgray ); } dY = ( (double)(iY2 - iY1 + 1) * cfg.Weight) / cfg.WeightLineMax; if( dY < 1. ) dY = 1.; dY0 = ((double)(iY2 - iY1 + 1) - dY) * 0.5; if( dY0 > 1 ) dY0 -= 1; else dY0 = 0; iY11 = iY1 + dY0; //iY22 = (int)((double)iY11 + dY + 0.5); iY22 = iY2 - dY0 + 1; // *** 22.08.2001 if( iY22 > iY2 ) iY22 = iY2; if( iY1 > iY2 ) iY2 = iY1; // *** 22.08.2001 gdImageFilledRectangle( im , iX1, iY11, iX2, iY22, iC ); //aClr[iG] ); // very weighted middle } else if( fillType == 7 ) { // upper line if( iSeq%2 == 0 ) { gdImageLine( im , iX1, iY1+1, iX2, iY1+1, dgray ); } dY = ( (double)(iY2 - iY1 + 1) * cfg.Weight) / cfg.WeightLineMax; if( dY < 1. ) dY = 1.; dY0 = ((double)(iY2 - iY1 + 1) - dY) * 0.5; iY11 = iY1 + dY0; //iY22 = (int)((double)iY11 + dY + 0.5); iY22 = iY2 - dY0 + 1; // *** 22.08.2001 if( iY22 > iY2 ) iY22 = iY2; if( iY1 > iY2 ) iY2 = iY1; // *** 22.08.2001 dX = ( (double)(iX2 - iX1 + 1) * cfg.Weight) / cfg.WeightLineMax; if( dX < 1. ) dY = 1.; dX0 = ((double)(iX2 - iX1 + 1) - dX) * 0.5; iX11 = iX1 + dX0; iX22 = (int)((double)iX11 + dX + 0.5); if( iX22 > iX2 ) iX22 = iX2; //cout << " -- outChar: wei/max, Y-pos = " << cfg.Weight << " / " << // cfg.WeightLineMax << ", " << iY11 << ", " << iY22 << endl; gdImageFilledRectangle( im , iX11, iY11, iX22, iY22, iC ); //aClr[iG] ); // full } else { gdImageFilledRectangle( im , iX1, iY1, iX2, iY2, iC ); //aClr[iG] ); } } // iSeq (i), j - letter pos //void f_outColorChar( gdImagePtr& im, int *aClr, int gapColor, char c, const vGroupDef& aG, void f_outColorChar( gdImagePtr& im, int *aClr, ImageOptions cfg, char c, const vGroupDef& aG, int iX01, int iY1, int iX02, int iY2, int iSeq, int j, int iSeqLen, int iGmax ) { int iX1, iX2, i; /** // Calc x1, x2: iX1 = (double)(iX02 - iX01) * (double)j / (double)iSeqLen + (double)iX01; iX2 = (double)(iX02 - iX01) * (double)(j+1) / (double)iSeqLen + (double)iX01; **/ // Like WL iX1 = iX01; iX2 = iX02; int dgray = gdImageColorResolve( im, 185, 185, 185 ); // Gap if( c == '-' ) { int lgray = gdImageColorResolve( im, 222, 222, 222 ); double dWk = (double)( iY2 - iY1 ) * 0.33; //0.25; if( dWk < 1. ) dWk = 1.; gdImageFilledRectangle( im , iX1, iY1 , iX2, iY2 , cfg.gapColor ); // ? //gdImageFilledRectangle( im , iX1, iY1+(int)dWk, iX2, iY2 - (int)dWk, dgray ); //lgray ); // ? return; // ------------------------------> } int iG = f_findGroup( c, aG ); if( iG < 0 ) return; // ---------------------> group not found // Only max gr: if( cfg.type == 1 && iG != iGmax ) { if( iSeq % 2 == 0 ) gdImageLine( im , iX1, iY1+1, iX2, iY1+1, dgray ); return; // ---------> not max } // Only selected groups; if( cfg.type == 2 ) { vSelGroupDef& vSG = *(cfg.pSelGroup); bool bFound = false; for( i = 0; i < vSG.size(); ++i ) { if( vSG[i] == iG ) { bFound = true; break; } } if( !bFound ) { if( iSeq % 2 == 0 ) gdImageLine( im , iX1, iY1+1, iX2, iY1+1, dgray ); return; // ---------> not selected } } // Letter: //+double dY, dY0, dX, dX0; //+int iY11, iY22, iX11, iX22; //, fillType = 0; // 0 - full 5 - weighted top 6 - middle' /** int fillType = cfg.fillType; //fillType = 5; //fillType = 6; //fillType = 7; // very weighted middle // weighted top if( fillType == 5 ) { dY = ( (double)(iY2 - iY1 + 1) * cfg.Weight) / cfg.WeightLineMax; if( dY < 1. ) dY = 1.; iY22 = (int)((double)iY1 + dY + 0.5); if( iY22 > iY2 ) iY22 = iY2; gdImageFilledRectangle( im , iX1, iY1, iX2, iY22, aClr[iG] ); if( (iX2 - iX1) > 3 ) { gdImageRectangle( im , iX1, iY1, iX2, iY2, aClr[iG] ); } //cout << "*** wei/max = " << cfg.Weight << "/" << cfg.WeightLineMax // << ", iY2/iY22 = " << iY2 << "/" << iY22 << endl; //getch(); // weighted middle } else if( fillType == 6 ) { // upper line if( iSeq%2 == 0 ) { gdImageLine( im , iX1, iY1+1, iX2, iY1+1, dgray ); } dY = ( (double)(iY2 - iY1 + 1) * cfg.Weight) / cfg.WeightLineMax; if( dY < 1. ) dY = 1.; dY0 = ((double)(iY2 - iY1 + 1) - dY) * 0.5; iY11 = iY1 + dY0; iY22 = (int)((double)iY11 + dY + 0.5); if( iY22 > iY2 ) iY22 = iY2; gdImageFilledRectangle( im , iX1, iY11, iX2, iY22, aClr[iG] ); // very weighted middle } else if( fillType == 7 ) { // upper line if( iSeq%2 == 0 ) { gdImageLine( im , iX1, iY1+1, iX2, iY1+1, dgray ); } dY = ( (double)(iY2 - iY1 + 1) * cfg.Weight) / cfg.WeightLineMax; if( dY < 1. ) dY = 1.; dY0 = ((double)(iY2 - iY1 + 1) - dY) * 0.5; iY11 = iY1 + dY0; iY22 = (int)((double)iY11 + dY + 0.5); if( iY22 > iY2 ) iY22 = iY2; dX = ( (double)(iX2 - iX1 + 1) * cfg.Weight) / cfg.WeightLineMax; if( dX < 1. ) dY = 1.; dX0 = ((double)(iX2 - iX1 + 1) - dX) * 0.5; iX11 = iX1 + dX0; iX22 = (int)((double)iX11 + dX + 0.5); if( iX22 > iX2 ) iX22 = iX2; gdImageFilledRectangle( im , iX11, iY11, iX22, iY22, aClr[iG] ); // full } else { gdImageFilledRectangle( im , iX1, iY1, iX2, iY2, aClr[iG] ); } **/ f_outCharFilled( im, cfg, iSeq, iX1, iY1, iX2, iY2, aClr[iG], dgray ); } // display one letter // iCG - group color, iCL - letter color (white/black) // bSel == false - 'inactive' display void f_outLetter( gdImagePtr& im, char c, int iX1, int iY1, int iX2, int iY2, int dX, int dY, int iCG, bool bSel = true ) //, int iCL ) { int white = gdImageColorResolve( im, 255, 255, 255 ); int black = gdImageColorResolve( im, 0, 0, 0 ); int dgray = gdImageColorAllocate(im, 170, 170, 170 ); // ?unused int iCL = white; int iR = gdImageRed ( im, iCG ); int iG = gdImageGreen( im, iCG ); int iB = gdImageBlue ( im, iCG ); if( (iR + iG + iB) > 450 || (iR + iG) > 400) //450 ) // 0 - 765 iCL = black; if( !bSel ) iCL = iCG; //dgray; gdImageFilledRectangle( im, iX1, iY1, iX2, iY2, iCG ); gdImageChar(im, gdFontMediumBold, iX1+dX, iY1+dY, c, iCL ); //black/white // black/white lines if( bSel ) { gdImageLine( im, iX1, iY1, iX2, iY1, white ); gdImageLine( im, iX1, iY1, iX1, iY2, white ); gdImageLine( im, iX2, iY1, iX2, iY2, black ); gdImageLine( im, iX1, iY2, iX2, iY2, black ); } } bool is_selGroup( const vSelGroupDef& vSel, int x ) { int i; for( i = 0; i < vSel.size(); ++i ) { if( vSel[i] == x ) return true; } return false; } int f_minSelGroup( const vSelGroupDef& vSel ) { int i, m=999; //; for( i = 0; i < vSel.size(); ++i ) { if( vSel[i] < m ) m = vSel[i]; } return m; } int f_outGroupLetters( gdImagePtr& im, ImageOptions& cfg, int *aClr, const vGroupDef& aG, int iX, int iX2, int dXL, int iY1, int iY2, int dX1, int dX2, int dorange ) // int white, int black ) { int numClr = aG.size(); int i, j, iL; int iXC = iX, dLx, dLy; bool bSel = true; dLx = (double)(dXL - 7) * 0.5 +0.5; dLy = (double)(iY2 - iY1 + 1 - 13) * 0.5; // Calc len iL = 0; for( i = 0; i < numClr; ++i ) { for( j = 0; j < aG[i].length(); ++j ) { iL += (dXL + dX1); } iL += dX2; } iL -= dX2; iXC = (double)(iX + iX2 - iL) * 0.5 + 0.5; char *s1 = "color"; char *s2 = "groups"; gdImageString(im, gdFontTiny, iXC - strlen(s1)*5 - 4, iY1, (unsigned char*)s1, dorange ); //dgreen ); gdImageString(im, gdFontTiny, iXC - strlen(s2)*5 - 4, iY1+7, (unsigned char*)s2, dorange ); //dgreen ); // Display for( i = 0; i < numClr; ++i ) { //iC = white; // Find if sel group if( cfg.type == 2 ) { bSel = is_selGroup( *(cfg.pSelGroup), i ); //cout << "*** i/bSel = " << i << "/" << (bSel ? "true" : "-" ) << endl; //getch(); } for( j = 0; j < aG[i].length(); ++j ) { f_outLetter( im, aG[i][j], iXC, iY1, iXC+dXL, iY2, dLx, dLy, aClr[i], bSel ); //, iC ); iXC += (dXL + dX1); } iXC += dX2; } return iXC; } void f_outYaxeWeights( gdImagePtr& im, int letterScale, int iX1, int iY1, int iX2, int iY2, int SNw, int SLw, double dSPw, int iCW ) { int i, iWk; // iY1 - not used so far char buf20[21]; double dWk; for( i = 0; i < SLw; ++i ) { dWk = (double)iY2 - dSPw * (double)(i+1); iWk = (int)dWk; if( letterScale == 0 ) { // letter at left, weight at right f_scaleStroke( im, 'r', iX2, iWk ); // + 1 ); if( i%2 == 0 ) { //sprintf( buf20, "%d\0", SNw*(i+1) ); sprintf( buf20, "%.1f\0", (double)(SNw*(i+1))*0.1 ); //gdImageString(im_out, gdFontSmall, iW - dX2 + 4, iWk - 7, gdImageString(im, gdFontTiny, iX2 + 5, iWk - 5, (unsigned char*)buf20, iCW ); } // weight at left } else { f_scaleStroke( im, 'l', iX1 - 1, iWk ); // + 1 ); if( i%2 == 0 ) { sprintf( buf20, "%.1f\0", (double)(SNw*(i+1))*0.1 ); gdImageString(im, gdFontTiny, iX1 - strlen(buf20)*5 - 4, iWk - 5, (unsigned char*)buf20, iCW ); } } } // for end } void f_outYaxeNames( gdImagePtr& im, int letterScale, int iXleft, int iXright, int iY1, int iY2, int brown, int iCW ) { if( letterScale == 0 ) { // letter at left, weight at right //+gdImageStringUp(im_out, gdFontSmall, iXright, (iH - dY2 + dY1 - 12*6) / 2 + 12*6, //+ (unsigned char*)"w e i g h t", iCW ); gdImageStringUp(im, gdFontSmall, iXright, (iY2 + iY1 - 6*6) / 2 + 6*6, (unsigned char*)"weight", iCW ); //gdImageStringUp(im_out, gdFontTiny, iXright, (iH - dY2 + dY1 - 13*5) / 2 + 13*5, // (unsigned char*)"column weight", red ); gdImageStringUp(im, gdFontSmall, iXleft, (iY2 + iY1 - 14*6) / 2 + 14*6, //gdImageStringUp(im_out, gdFontTiny, iXleft, (iH - dY2 + dY1 - 14*5) / 2 + 14*5, (unsigned char*)"groups/letters", brown ); // letter scale at right, weight scale at left } else { gdImageStringUp(im, gdFontSmall, iXleft, (iY2 + iY1 - 6*6) / 2 + 6*6, (unsigned char*)"weight", iCW ); if( (iY2 - iY1) >= (14*6) ) { gdImageStringUp(im, gdFontSmall, iXright, (iY2 + iY1 - 14*6) / 2 + 14*6, (unsigned char*)"groups/letters", brown ); // H-small fragments } else { gdImageStringUp(im, gdFontTiny, iXright + 1, (iY2 + iY1 - 14*5) / 2 + 14*5, (unsigned char*)"groups/letters", brown ); } } } void f_outXaxe( gdImagePtr& im, ImageOptions& cfg, int splitOffset, int iX1, int iY1, int iX2, int iY2, int SN1, int SL1, double dSP1, int lblue, int lgray, int brown2 ) { int i, iWk2, iC, iOff = splitOffset; //dX_wk = dX1 + ddX1 + (int)dSP1 ; // + X_year; // 1st SEQ int dX_wk = iX1 + (int)dSP1 ; // + X_year; // 1st SEQ double dWk, dd05 = (dSP1/(double)SN1) *0.5; char buf6[10]; //7 //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 - dSP1 +1, dY1+1, dX_wk - 1, //+ iH - dY2 - 1, lwhite2); // transporent? //+} //- Distort the pic ! *** 13.06.2001 if( (cfg.type == 21) || (cfg.type == 22) ) { gdImageDashedLine(im, dX_wk - dd05, iY1, dX_wk - dd05, iY2, iC ); //++gdImageLine(im_out, dX_wk, iH - dY2 - ddY2, dX_wk, iH - dY2, iC ); // internal WL ! } if( i % 2 == 0 ) { if( cfg.type == 21 ) sprintf( buf6, "%d%%\0", i*SN1 + iOff ); else sprintf( buf6, "%d\0", i*SN1 + iOff ); if( iOff > 0 ) { // tiny 2nd's upper scales //gdImageString(im, gdFontTiny, dX_wk - dd05 - (int)((double)strlen(buf6)*2.5), iY1 - 16 + 1 + 3, gdImageString(im, gdFontTiny, dX_wk - dd05 - 5, iY1 - 16 + 1 + 3, (unsigned char*)buf6, brown2 ); } else { //+gdImageString(im, gdFontSmall, dX_wk - dd05 - strlen(buf6)*3, iY1 - 16 + 1, gdImageString(im, gdFontSmall, dX_wk - dd05 - 6, iY1 - 16 + 1, (unsigned char*)buf6, brown2 ); } //+gdImageString(im, gdFontSmall, dX_wk - dd05 - strlen(buf6)*3, iY2, //dY1 + 6, gdImageString(im, gdFontSmall, dX_wk - dd05 - 6, iY2, //dY1 + 6, (unsigned char*)buf6, brown2 ); //(unsigned char*)"20", brown2 ); f_scaleStroke( im, 'u', dX_wk - dd05, iY1 ); // - 1 ); f_scaleStroke( im, 'd', dX_wk - dd05, iY2 + 1 ); } if( i == 1 && (cfg.type != 21) ) { sprintf( buf6, "%d\0", 1 + iOff ); if( iOff > 0 ) { gdImageString(im, gdFontTiny, iX1, iY1 - 16 + 1 + 3, // tiny 2nd's upper scales (unsigned char*)buf6, brown2 ); } else { gdImageString(im, gdFontSmall, iX1, iY1 - 16 + 1, (unsigned char*)buf6, brown2 ); //(unsigned char*)"1", brown2 ); } gdImageString(im, gdFontSmall, iX1, iY2, //dY1 + 6, (unsigned char *)buf6, brown2 ); } //+gdImageLine(im_out, dX_wk, dY1, dX_wk, iH - dY2, iC); //dX_wk += dSP1; //dWk = (double)dX1 + ddX1 + dSP1 * (double)(i+1); dWk = (double)iX1 + dSP1 * (double)(i+1); dX_wk = (int)dWk; } // for end } void f_outFragment( gdImagePtr& im_out, Align& oAli, ImageOptions& image_cfg, int splitOffset, int iX1, int iY1,int iX2, int iY2, int aClr[22], double dWL, double dSP2, double dYLim0, double dYLim1, int letterScale, int white, int black, int brown, int brown2, int gray, int lgray, int lgray2, int lblue ) { vSNamesDef& vSNames = *(oAli.pSNames); vAliDef& vAli = *(oAli.pAli ); // Seq len & num: int iSeqLen = vAli[0].length(); int nSeq = vSNames.size(); // Seq Names vector size int iFragLen = iSeqLen; const vGroupDef aG = *(oAli.pGroup); vColGroupDef vColGroup = *(image_cfg.pColGroup); /*** - vGroupDef aG; // = *(oAli.pGroup); vColGroupDef vColGroup; // = *(image_cfg.pColGroup); if( image_cfg.type < 11 ) { //!= 22 ) { vGroupDef aG = *(oAli.pGroup); vColGroupDef vColGroup = *(image_cfg.pColGroup); } ***/ string sWk; int i, j, j0, dY_wk, dY1_wk, dY2_wk, iC, iOff = splitOffset; if( iOff < 0 ) iOff = 0; double dWk; char buf20[21]; //d_dY = 0.12 * dSP2; double d_dY = 0; // ********************** //dY1_wk = iH - dY2 - (int)(dSP2 + d_dY); //dY2_wk = iH - dY2 - d_dY; //-vector< char, alloc > vComp( nSeq, ' ' ); // 's' - same, 'u' - unpaired, 'm' - mismatch if( image_cfg.splitBlockSize > 0 ) iFragLen = image_cfg.splitBlockSize; for( i = 1; i <= nSeq; i++ ) { //+dWk = (double)(iH - dY2) - dSP2 * (double)i; // - (double)ddY2; // ddY2 - wei inside dWk = (double)(iY2) - dSP2 * (double)i; // - (double)ddY2; // ddY2 - wei inside dY_wk = (int)dWk; dY1_wk = (int)( (double)(iY2) - dSP2 * (double)i + d_dY); // - (double)ddY2); dY2_wk = (int)( (double)(iY2) - dSP2 * (double)(i - 1) - d_dY); // - (double)ddY2); //?? cout << " - dY_wk = " << dY_wk << endl; // *** See also after Y-lines ! iC = lgray; if( i % 2 == 0 ) iC = lblue; //iWk2 = 0; //gdImageDashedLine(im_out, dX1, dY_wk, iW - dX2, dY_wk, iC); //if( i % 2 == 0 ) { if( i % 2 > 0 ) { //gdImageFilledRectangle( im_out , dX1 +ddX1 +1, dY1_wk, iW - dX2 - ddX2 - 1, // dY2_wk, lgray2 ); //+white ); //(double)(dY2_wk + dY1_wk) *0.5, lgray2 ); //+white ); //gdImageFilledRectangle( im_out , dX1 +ddX1 +1, dY1_wk, iW - dX2 - ddX2 - 1, // (double)(dY2_wk + dY1_wk) *0.5, lgray ); //++gdImageFilledRectangle( im_out , dX1 +ddX1 +1, dY1_wk, iW - dX2 - ddX2 - 1, gdImageFilledRectangle( im_out , iX1 +1, dY1_wk, iX2 - 1, dY2_wk, white ); } if( i % 2 == 0 ) { if( image_cfg.type < 11 ) { gdImageFilledRectangle( im_out , iX1 +1, dY1_wk, iX2 - 1, dY2_wk, lgray2 ); //+white ); //(double)(dY2_wk + dY1_wk) *0.5, lgray2 ); //+white ); gdImageFilledRectangle( im_out , iX1 +1, dY1_wk, iX2 - 1, (double)(dY2_wk + dY1_wk) *0.5, lgray ); // gdImageFilledRectangle( im_out , dX1 +ddX1 +1, dY1_wk, iW - dX2 - ddX2 - 1, // (double)(dY2_wk + dY1_wk) *0.5, lgray2 ); } } sWk = vSNames[nSeq - i]; if( image_cfg.type < 11 ) { f_outSeqName( im_out, i, sWk, iX1, dY1_wk, ( dSP2 < dYLim1 ? (dSP2 < dYLim0 ? 2 : 1) : 0 ), brown2, brown, gray ); // type = 0 - std, 1 - tiny, 2 - two cols string sAli = vAli[nSeq - i]; //for( j = 0; j < iSeqLen && j < sAli.length(); ++j ) { for( j = iOff, j0 = 0; j < (iOff + iFragLen) && j < iSeqLen && j < sAli.length(); ++j, ++j0 ) { image_cfg.Weight = oAli.WeightLineSums[j]; // for weighted filling // !! Like WL (see above) //f_outColorChar( im_out, aClr, image_cfg.gapColor, toupper(sAli[j]), aG, f_outColorChar( im_out, aClr, image_cfg, toupper(sAli[j]), aG, //dX1 +ddX1 +1, dY1_wk, iW - dX2 - ddX2 - 1, dY2_wk, j, iX1 + (double)j0 * dWL + 1, dY1_wk, iX1 + (double)(j0+1) * dWL, dY2_wk, i,j, iSeqLen, vColGroup[j] ); } if( i % 2 == 0 ) { //|| i == 1) { //gdImageRectangle ( im_out , dX1 +ddX1 +1, dY1_wk, iW - dX2 - ddX2 - 1, // dY2_wk, black); //gray ); //brown ); //-?gdImageLine ( im_out , dX1 +ddX1 +1, dY1_wk, iW - dX2 - ddX2 - 1, //-? dY1_wk, white ); //gray ); //brown ); gdImageLine ( im_out , iX1 +1, dY2_wk, iX2 - 1, dY2_wk, black); //gray ); //brown ); } else { //gdImageLine ( im_out , dX1 +ddX1 , dY2_wk, iW - dX2 - ddX2 - 1, // after frame ? gdImageLine ( im_out , iX1 +1, dY2_wk, iX2 - 1, dY2_wk, white ); //gray ); //brown ); } } else { // type > 10 if( letterScale == 0 ) { // left //if( i < nSeq ) { f_scaleStroke( im_out, 'l', iX1 - 1 , dY1_wk ); // - 1 ); // left //f_scaleStroke( im_out, 'r', iW - dX2, dY1_wk ); // + 1 //} if( i % 2 > 0 ) { f_outNumLeft( im_out, i, iX1 - 4, dY1_wk, black ); } // at right } else { f_scaleStroke( im_out, 'r', iX2 , dY1_wk ); // right // +1 if( i % 2 > 0 ) { //f_outNumLeft( im_out, i, iW - dX2 + 4, dY1_wk, black ); sprintf( buf20, "%d\0", i ); // H-small if( dSP2 < dYLim1 ) { // ? dYLim0 gdImageString(im_out, gdFontTiny, iX2 + 5, dY1_wk - 3, (unsigned char*)buf20, black ); } else { if( i == nSeq ) gdImageString(im_out, gdFontSmall, iX2 + 5, dY1_wk - 5, (unsigned char*)buf20, black ); else gdImageString(im_out, gdFontSmall, iX2 + 5, dY1_wk - 7, (unsigned char*)buf20, black ); } } } } //dY_wk -= dSP2; } } void f_fillValueMaps( vAliDef& vAli, double *WeightLineSums, const vGroupDef& aG, vColGroupDef& vColGroup, orSumsDef& orSums, // Alex /* multiset< int, greater< int >, alloc >& orSL, multiset< int, greater< int >, alloc >& orGL, multiset< int, less< int >, alloc >& orNG */ multiset< int, greater< int > >& orSL, multiset< int, greater< int > >& orGL, multiset< int, less< int > >& orNG ) // multiset< double, greater< double >, alloc >& orSums, { // Seq len & num: int iSeqLen = vAli[0].length(); //, iSeqLenMin; int nSeq = vAli.size(); // Seq Names vector size int i, j; //+for( i = 0; i < sWL.length(); ++i ) { for( i = 0; i < iSeqLen; ++i ) { //+if( i >= iSeqLen ) break; // ---------> //orSums.insert( WeightLineSums[i] ); orSums.insert( orSumsDef::value_type( WeightLineSums[i], i ) ); // i - saved for GL *** 22.08.2001 } //-if( image_cfg.type == 22 ) { //- for( i = 0; i < oAli.WeightLineLen2; ++i ) { //- orSums2.insert( oAli.WeightLineSums2[i] ); //- } //-} int iQ, iG; for( i = 0; i < iSeqLen; ++i ) { //Num of same letters // Alex /* map< char, int, less< char >, alloc > mLet, mGLet; map< int , int, less< int >, alloc > mGr; map< char, int, less< char >, alloc >::iterator iiL; // set ? */ map< char, int, less< char > > mLet, mGLet; map< int , int, less< int > > mGr; map< char, int, less< char > >::iterator iiL; // set ? int iGL = 0; for( j = 0; j < nSeq; ++j ) { string sAli = vAli[j]; //mLet[vAli[j][i]] if( sAli[i] != '-' ) { iQ = mLet[ sAli[i] ]; mLet[ sAli[i] ] = iQ + 1; // same letters iG = f_findGroup( sAli[i], aG ); if( iG > -1 ) { if( iG == vColGroup[i] ) // Same group ++iGL; mGr[iG] = iG; // num of groups } } } // Max same letters iQ = -1; for( iiL = mLet.begin(); iiL != mLet.end(); ++iiL ) { if( (*iiL).second > iQ ) { iQ = (*iiL).second; } } // Inserts: orSL.insert( iQ ); orGL.insert( iGL ); orNG.insert( mGr.size() ); } } // type = 21, 22 - the only fragment is possible. // dYgroup - to plot GL *** 22.08.2001 void f_outColValues( gdImagePtr& im_out, Align& oAli, ImageOptions& image_cfg, int splitOffset, int dYgroup, int iX01, int iY01,int iX02, int iY02, orSumsDef::iterator& iiSU, // Alex /* multiset< int, greater< int >, alloc >::iterator& iiSL, multiset< int, greater< int >, alloc >::iterator& iiGL, multiset< int, less< int >, alloc >::iterator& iiNG, */ multiset< int, greater< int > >::iterator& iiSL, multiset< int, greater< int > >::iterator& iiGL, multiset< int, less< int > >::iterator& iiNG, int iCGL, int iCL, int iCG, int iCW, //, int blue int aClr[22], bool bSameLetters = true ) // multiset< double, greater< double >, alloc >::iterator& iiSU, { int iCLG2 = f_clrGreen( im_out, 2, 0, 4 ); // letters at max group of 2nd align int iCL2 = f_clrGreen( im_out, 3, 0, 4 ); // same letters of 2nd align int stDashed[6]; stDashed[0] = stDashed[1] = stDashed[2] = iCW; stDashed[3] = stDashed[4] = stDashed[5] = gdTransparent; gdImageSetStyle( im_out, stDashed, 6 ); int iDashedDelta = 6; // 6 = 6 int white = gdImageColorResolve( im_out, 255, 255, 255 ); vSNamesDef& vSNames = *(oAli.pSNames); vAliDef& vAli = *(oAli.pAli ); // Seq len & num: int iSeqLen = vAli[0].length(), iSeqLenMin; int nSeq = vSNames.size(); // Seq Names vector size iSeqLenMin = iSeqLen; if( image_cfg.type == 21 || image_cfg.type == 22 ) { // comp picture if( oAli.WeightLineLen2 < iSeqLenMin ) iSeqLenMin = oAli.WeightLineLen2; // (*(oAli.pAli2 )).size(), etc } double dFa = (double)iSeqLen / (double)oAli.WeightLineLen2; const vGroupDef aG = *(oAli.pGroup); vColGroupDef vColGroup = *(image_cfg.pColGroup); int iWgroup; // iiSU -> vColGroup[ iWgroup ] *** 22.08.2001 /*** - vGroupDef aG; // = *(oAli.pGroup); vColGroupDef vColGroup; // = *(image_cfg.pColGroup); if( image_cfg.type < 11 ) { vGroupDef aG = *(oAli.pGroup); vColGroupDef vColGroup = *(image_cfg.pColGroup); } ***/ int i, i0, j, iQ, iG, iOff = splitOffset, iFragLen = iSeqLen; if( iOff < 0 ) iOff = 0; if( image_cfg.splitBlockSize > 0 ) iFragLen = image_cfg.splitBlockSize; // ******************* 100 % if( image_cfg.type == 21 ) { // iFragLen = oAli.WeightLineLen2; } //for( i = 0; i < iSeqLen; ++i ) { //+for( i = iOff, i0 = 0; (i < (iOff + iFragLen)) && (i < iSeqLen); ++i, ++i0 ) { for( i = iOff, i0 = 0; (i < (iOff + iFragLen)) && (i < iSeqLenMin); ++i, ++i0 ) { //Num of same letters // Alex /* map< char, int, less< char >, alloc > mLet, mGLet; map< int , int, less< int >, alloc > mGr; map< char, int, less< char >, alloc >::iterator iiL; // set ? */ map< char, int, less< char > > mLet, mGLet; map< int , int, less< int > > mGr; map< char, int, less< char > >::iterator iiL; // set ? int iGL = 0; if( image_cfg.type == 11 ) { for( j = 0; j < nSeq; ++j ) { string sAli = vAli[j]; //mLet[vAli[j][i]] if( sAli[i] != '-' ) { iQ = mLet[ sAli[i] ]; mLet[ sAli[i] ] = iQ + 1; // same letters iG = f_findGroup( sAli[i], aG ); if( iG > -1 ) { if( iG == vColGroup[i] ) // Same group ++iGL; mGr[iG] = iG; // num of groups } } } // Max same letters iQ = -1; for( iiL = mLet.begin(); iiL != mLet.end(); ++iiL ) { if( (*iiL).second > iQ ) { iQ = (*iiL).second; } } } // endif of type = 11 int iX1, iX2, iYSL, iYSL0, iYG, iYG0, iXG0, dXG, iYGL, iYGL0, iYW, iYW0; int iXG0dashed, iYW0dashed, iYG0dashed, iX1dashed, iXW0dashed; //iYGL0dashed; //iX1 = (double)(iW - dX1 - dX2 + 1) * (double)i / (double)iSeqLen + //+iX1 = (double)(iW - dX1 - dX2) * (double)i / (double)iSeqLen + //+ (double)dX1; //+iX2 = (double)(iW - dX1 - dX2) * (double)(i+1) / (double)iSeqLen + //+ (double)dX1; //++iX1 = (double)(iX02 - iX01) * (double)i / (double)iSeqLen + //++ (double)iX01; //++iX2 = (double)(iX02 - iX01) * (double)(i+1) / (double)iSeqLen + //++ (double)iX01; iX1 = (double)(iX02 - iX01) * (double)i0 / (double)iFragLen + (double)iX01; iX2 = (double)(iX02 - iX01) * (double)(i0+1) / (double)iFragLen + (double)iX01; //if( image_cfg.type != 22 ) { // Same letters - iQ: //iY1 = (double)(iH - dY1 - dY2 - 1) * (double)iQ / (double)nSeq; // + if( image_cfg.type == 11 ) iYSL = (double)(iY02 - iY01 - 1) * (double)iQ / (double)nSeq; else { // == 12 //cout << " *** iiSL = " << *iiSL << endl; iYSL = (double)(iY02 - iY01 - 1) * (double)(*iiSL) / (double)nSeq; ++iiSL; } // Num of groups if( image_cfg.type == 11 ) iYG = (double)(iY02 - iY01 - 1) * (double)mGr.size() / (double)nSeq; else { // == 12 iYG = (double)(iY02 - iY01 - 1) * (double)(*iiNG) / (double)nSeq; ++iiNG; } // same group if( image_cfg.type == 11 ) //+iYGL = (double)(iH - dY1 - dY2 - 1) * (double)iGL / (double)nSeq; iYGL = (double)(iY02 - iY01 - 1) * (double)iGL / (double)nSeq; else { // == 12 iYGL = (double)(iY02 - iY01 - 1) * (double)(*iiGL) / (double)nSeq; ++iiGL; } //} dXG = (double)(iX2 - iX1 ) * 0.5; // weight if( image_cfg.type == 11 ) iYW = (double)(iY02 - iY01 - 1) * oAli.WeightLineSums[i] / oAli.WeightLineMax; else {// if( image_cfg.type == 12 ) || 22 //iYW = (double)(iY02 - iY01 - 1) * (*iiSU) / image_cfg.WeightLineScaleMax; //oAli.WeightLineMax; iYW = (double)(iY02 - iY01 - 1) * ((*iiSU).first) / image_cfg.WeightLineScaleMax; //oAli.WeightLineMax; iWgroup = (*iiSU).second; // respective group: vColGroup[ iWgroup ] *** 22.08.2001 ++iiSU; } if( image_cfg.type == 21 || image_cfg.type == 22) { // Hor - See below //+gdImageDashedLine( im_out , iX1, iY02 - iYGL, iX2, iY02 - iYGL, iCLG2 ); //+gdImageDashedLine( im_out , iX1, iY02 - iYGL + 1, iX2, iY02 - iYGL + 1, iCLG2 ); //-gdImageLine( im_out , iX1, iY02 - iYGL, iX2, iY02 - iYGL, iCW ); // w/o same letters ? See below if( bSameLetters ) { //gdImageDashedLine( im_out , iX1 - dXG, iY02 - iYSL, iX1 + dXG, iY02 - iYSL, iCL2 ); //gdImageDashedLine( im_out , iX1 - dXG, iY02 - iYSL + 1, iX1 + dXG, iY02 - iYSL + 1, iCL2 ); } // Vert if( (i0 > 0) && (iYGL0 != iYGL) ) { gdImageDashedLine( im_out , iX1, iY02 - iYGL0, iX1, iY02 - iYGL, iCL2 ); //G2 ); //+gdImageDashedLine( im_out , iX1 - 1, iY02 - iYGL0, iX1 - 1, iY02 - iYGL, iCLG2 ); // Hor (prev) gdImageDashedLine( im_out , iX1dashed, iY02 - iYGL0, iX1, iY02 - iYGL0, iCL2 ); //G2 ); iX1dashed = iX1; } if( i == (iSeqLenMin - 1) ) { // Hor (last if any) gdImageDashedLine( im_out , iX1dashed, iY02 - iYGL0, iX1, iY02 - iYGL0, iCL2 ) ; //G2 ); //iX1dashed = iX1; } if( bSameLetters ) { if( (i0 > 0) && (iYSL0 != iYSL) ) { gdImageDashedLine( im_out , iX1 - dXG, iY02 - iYSL0, iX1 + dXG, iY02 - iYSL, iCL2 ); gdImageDashedLine( im_out , iX1 - dXG - 1, iY02 - iYSL0, iX1 + dXG - 1, iY02 - iYSL, iCL2 ); } else { gdImageDashedLine( im_out , iX1 - dXG, iY02 - iYSL, iX1 + dXG, iY02 - iYSL, iCL2 ); gdImageDashedLine( im_out , iX1 - dXG, iY02 - iYSL + 1, iX1 + dXG, iY02 - iYSL + 1, iCL2 ); } } // all but 21/22 } else { gdImageFilledRectangle( im_out , iX1, iY02 - iYGL, iX2, iY02, iCGL ); if( bSameLetters ) { //gdImageFilledRectangle( im_out , iX1, iH - dY2 - iY1, iX2, iH - dY2, iCL ); //gdImageFilledRectangle( im_out , iX1 + dXG, iH - dY2 - iYG, iX1 + dXG + 1, iH - dY2, iCGL ); //+gdImageFilledRectangle( im_out , iX1 + dXG, iY02 - iYSL, iX1 + dXG+1, iY02, iCL ); gdImageFilledRectangle( im_out , iX1 + dXG - 1, iY02 - iYSL, iX1 + dXG, iY02, iCL ); } } if( i0 > 0 ) { if( image_cfg.type == 21 || image_cfg.type == 22 ) { // comp picture // Gr num // dashed W/NG: change only when suffisient delta to provide not solid line ! //+if( (iX1 + dXG - iXG0dashed) >= iDashedDelta || (i == (iSeqLenMin - 1)) || //+ ((iYG - iYG0dashed) >= iDashedDelta) ) { // 6 - gdStyled if( ((iYG - iYG0dashed) >= iDashedDelta) ) { // 6 - gdStyled // Num of gr //gdImageDashedLine( im_out , iXG0, iY02 - iYG0 +1 , iX1 + dXG, iY02 - iYG + 1, iCG ); //blue ); //iCG ); //+gdImageDashedLine( im_out , iXG0, iY02 - iYG0 , iX1 + dXG, iY02 - iYG , iCG ); //blue ); //iCG ); // Hor gdImageDashedLine( im_out , iXG0dashed, iY02 - iYG0dashed, iX1 - dXG + 1, iY02 - iYG0dashed, iCG ); //blue ); //iCG ); // Vert gdImageDashedLine( im_out , iXG0 , iY02 - iYG0dashed, iX1 + dXG, iY02 - iYG , iCG ); //blue ); //iCG ); iYG0dashed = iYG; iXG0dashed = iX1 + dXG; } else if( (iX1 + dXG - iXG0dashed) >= iDashedDelta || (i == (iSeqLenMin - 1)) ) { // 6 - gdStyled // Num of gr //gdImageDashedLine( im_out , iXG0, iY02 - iYG0 +1 , iX1 + dXG, iY02 - iYG + 1, iCG ); //blue ); //iCG ); //+gdImageDashedLine( im_out , iXG0, iY02 - iYG0 , iX1 + dXG, iY02 - iYG , iCG ); //blue ); //iCG ); gdImageDashedLine( im_out , iXG0dashed, iY02 - iYG0dashed, iX1 + dXG, iY02 - iYG , iCG ); //blue ); //iCG ); iYG0dashed = iYG; iXG0dashed = iX1 + dXG; } // Weight // dashed W/NG: change only when suffisient delta to provide not solid line ! if( (iX1 + dXG - iXW0dashed) >= iDashedDelta || (i == (iSeqLenMin - 1)) ) { // 6 - gdStyled //+gdImageDashedLine( im_out , iXG0, iY02 - iYW0 , iX1 + dXG, iY02 - iYW , iCW ); //iCG ); gdImageDashedLine( im_out , iXW0dashed, iY02 - iYW0dashed , iX1 + dXG, iY02 - iYW , iCW ); //iCG ); // save iXW0dashed = iX1 + dXG; iYW0dashed = iYW; } //gdImageLine( im_out , iXG0, iY02 - iYW0 , iX1 + dXG, iY02 - iYW , gdStyled ); //iCG ); if( (iY02 - iYW0 + 1) < iY02 ) { //++gdImageDashedLine( im_out , iXG0, iY02 - iYW0 + 1, iX1 + dXG, iY02 - iYW + 1, iCW ); //iCG ); //+gdImageLine( im_out , iXG0, iY02 - iYW0 + 1, iX1 + dXG, iY02 - iYW + 1, gdStyled ); } } else { // Num of groups //gdImageFilledRectangle( im_out , iX1 + dXG, iH - dY2 - iYG, iX1 + dXG + 1, iH - dY2, iCG ); gdImageLine( im_out , iXG0, iY02 - iYG0 + 1, iX1 + dXG, iY02 - iYG + 1, iCG ); //blue ); //iCG ); gdImageLine( im_out , iXG0, iY02 - iYG0 , iX1 + dXG, iY02 - iYG , iCG ); //blue ); //iCG ); // Weight gdImageLine( im_out , iXG0, iY02 - iYW0 , iX1 + dXG, iY02 - iYW , iCW ); //iCG ); if( (iY02 - iYW0 + 1) < iY02 ) { gdImageLine( im_out , iXG0, iY02 - iYW0 + 1, iX1 + dXG, iY02 - iYW + 1, iCW ); //iCG ); } } } // GL *** 22.08.2001 // image_cfg.Weight = oAli.WeightLineSums[j]; // for weighted filling // f_outColorChar( im_out, aClr, image_cfg, toupper(sAli[j]), aG, // iX1 + (double)j0 * dWL + 1, dY1_wk, iX1 + (double)(j0+1) * dWL, dY2_wk, i,j, // iSeqLen, vColGroup[j] ); //-int iCgroup; int dgray = gdImageColorResolve( im_out, 185, 185, 185 ); if( image_cfg.type == 11 ) { // *** 22.08.2001 //gdImageFilledRectangle( im_out, iX1, iY02 + dYgroup, iX2, // iY02 + dYgroup + image_cfg.WLwidth - 2, aClr[ vColGroup[i] ] ); //+gdImageFilledRectangle( im_out, iX1, iY02 + dYgroup, iX2, //+ iY02 + dYgroup + image_cfg.WLwidth - 2, white ); image_cfg.Weight = oAli.WeightLineSums[i]; f_outCharFilled( im_out, image_cfg, 1, iX1+1, iY02 + dYgroup , iX2, iY02 + dYgroup + image_cfg.WLwidth - 2, aClr[ vColGroup[i] ], dgray ); } else if( image_cfg.type == 12 ) { image_cfg.Weight = oAli.WeightLineSums[iWgroup]; //cout << " -- wei = " << image_cfg.Weight << ", " << iWgroup << endl; f_outCharFilled( im_out, image_cfg, 1, iX1+1, iY02 + dYgroup , iX2, iY02 + dYgroup + image_cfg.WLwidth - 2, aClr[ vColGroup[iWgroup] ], dgray ); } iYG0 = iYG; iYW0 = iYW; iXG0 = iX1 + dXG; iYGL0 = iYGL; iYSL0 = iYSL; // for dashed W: to change only when sufficient delta if( i == 0 ) { iYW0dashed = iYW; iYG0dashed = iYG; //iYGL0dashed = iYGL; iXG0dashed = iXG0; iXW0dashed = iXG0; iX1dashed = iX1; } } // end for } // ty = 'w', 'b' - white/brown // iC - white/brown void f_outFrame( gdImagePtr& im, char ty, int iX1, int iY1, int iX2, int iY2, int iC ) { if( ty == 'w' ) { gdImageLine(im, iX1 - 1 , iY1 - 1 , iX2 + 1, iY1 - 1, iC ); gdImageLine(im, iX1 - 1 , iY1 - 1 , iX1 - 1, iY2 + 1, iC ); gdImageLine(im, iX1 - 2 , iY1 - 2 , iX2 + 2, iY1 - 2, iC ); gdImageLine(im, iX1 - 2 , iY1 - 2 , iX1 - 2, iY2 + 2, iC ); gdImageLine(im, iX1 - 3 , iY1 - 2 , iX1 - 3, iY2 + 2, iC ); } else { // ty == 'b' gdImageLine(im, iX1 , iY1, iX2, iY1, iC ); gdImageLine(im, iX1 , iY1, iX1, iY2, iC ); gdImageLine(im, iX1 , iY2, iX2, iY2, iC ); gdImageLine(im, iX2, iY1, iX2, iY2, iC ); } } // sAlgo2 - for comparison picture (type = 22) void AligraImage( Align& oAli, ImageOptions& image_cfg, const char *sFName, const char *sTit , const char *sAlgo1, const char *sAlgo2 = "2nd" ) { vSNamesDef& vSNames = *(oAli.pSNames); vAliDef& vAli = *(oAli.pAli ); int iW=image_cfg.iW, iH = image_cfg.iH; cout << "*** AligraIma W/H: " << iW << ", " << iH << ", type: " << image_cfg.type << endl; // Seq len & num: int iSeqLen = vAli[0].length(); int nSeq = vSNames.size(); // Seq Names vector size cout << " - Seq Len = " << iSeqLen << ", Number of Seqs = " << nSeq << endl; int splitOffset = 0; // *** 04.07.2001 //bool bColWeight = true, bMoveLeft = true, bMoveRight = true; bool bColWeight = true; //, bMoveLeft = false, bMoveRight = false; //+string& sWL = *(oAli.pWeightLine); // *NIK rejected * 15.06.2001 int i, j=0, iWk, iWk2, iWk3, iC; //, iWk1, dX_wk; // dY_wk, dY1_wk, dY2_wk, //+if( sWL.length() < 1 ) // *NIK rejected // bColWeight = false; FILE *out; gdImagePtr im_out; // Group letters /** string aG[10]; aG[0] = "GAHDP"; aG[1] = "ILMN"; aG[2] = "WFY"; aG[3] = "KR"; aG[4] = "S"; aG[5] = "V"; aG[6] = "Q"; aG[7] = "T"; aG[8] = "C"; aG[9] = "E"; **/ const vGroupDef aG = *(oAli.pGroup); vColGroupDef vColGroup = *(image_cfg.pColGroup); /*** - vGroupDef aG; //*(oAli.pGroup); vColGroupDef vColGroup; //*(image_cfg.pColGroup); if( image_cfg.type < 11 ) { //!= 22 ) { aG = *(oAli.pGroup); vColGroup = *(image_cfg.pColGroup); } ***/ // 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, dY1_wk, dY2_wk, iC; //++int iW=800, iH=480; int dX1, dX2, dY1, dY2, ddX1, ddX2, ddY2; //int dSP1, dSP2; // pixels in one space double dSP1, dSP2, dSPw; // pixels in one space double dYLim0 = 7., dYLim1 = 11.;// 0 - go to two cols of names, 1 - go tiny font int SN1 = 10, SNw; // , SN2 ; // 1st numbers int SL1 , SL2, SLw ; // len in dSN units double xP; //, yP; // Factor; N -> pixels double dWk, iYwei; //d_dY, //int iX1, iX2; string sWk; int splitN = 1, splitSpace = 0; double splitH = 0.; //char buf6[7]; char buf20[21]; // 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; ddX1 = ddX2 = 0; //7; ****************** // Small font iWk = 7; // 7*6 = 42 - at least to place "weight" // max seq name for( i = 0; i < nSeq; ++i ) { if( (iWk2 = vSNames[i].length()) > iWk ) iWk = iWk2; } if( iWk > 10 ) // 10 letters in a name at most iWk = 10; dX1 = 10 + iWk * 6; // dX1, dX2 for funcs & dY2 for small func pictures int iXleft, iXright; // axe names int letterScale = 1; // 0 - left, 1 - right if( image_cfg.type > 10 ) { sprintf( buf20, "%d\0", nSeq ); if( letterScale == 0 ) { // left dX1 = (strlen(buf20) + 0 ) * 6 + 5 + 20; // 6 - Small font if( dX1 < 40 ) // to place "weight" dX1 = 40; iXleft = dX1 - strlen(buf20)*6 - 18 - 4; //15; sprintf( buf20, "%d\0", (int)((oAli.WeightLineMax)*10 ) ); dX2 = (strlen(buf20) + 1 ) * 5 + 5 + 20; // 5 - Tiny font iXright = iW - dX2 + (strlen(buf20)+1)*5 + 5; // letter scale at right, weight scale at left } else { dX2 = (strlen(buf20) + 0 ) * 6 + 5 + 20; // 6 - Small font iXright = iW - dX2 + strlen(buf20)*6 +5; //18; sprintf( buf20, "%d\0", (int)((oAli.WeightLineMax)*10 ) ); dX1 = (strlen(buf20) + 1 ) * 5 + 5 + 20; // 5 - Tiny font if( dX1 < 40 ) // to place "weight" dX1 = 40; iXleft = dX1 - (strlen(buf20)+1)*5 - 18 - 4; // 5; if( iXleft < 5 ) iXleft = 5; } // small pictures if( image_cfg.iW < 640 ) { dY2 += 16; } } dY1 += 16; // Upper scale dY1 += 2; // Subtitle //++if( image_cfg.type < 11 ) dY1 += 22; // group letters at top //dY2 -= 16; // Weight line moved inside // Dashed lines msg for comp picture if( image_cfg.type == 21 || image_cfg.type == 22 ) dY2 += 12; //16; int dY_WL = image_cfg.WLwidth, iLegLineGap = 4, dYwei; //7; int dYgroup, iYgroup; // *** 22.08.2001 // WL - bottom // if( image_cfg.WLtype == 0 ) { ddY2 = 0; dY2 += (image_cfg.WLwidth+iLegLineGap*3); // + 4*3 = 12 if( image_cfg.type > 10 ) { dY2 += (image_cfg.WLwidth+iLegLineGap*1); // max groups line *** 22.08.2001 } dYwei = 15; iYwei = iH - dY2 + dYwei; //15; //ddY2; iYgroup = iYwei + image_cfg.WLwidth+iLegLineGap*2 - 2; // + 2; dYgroup = dYwei + image_cfg.WLwidth+iLegLineGap*2 - 2; // + 2; if( image_cfg.type > 11 ) { iYgroup += 4; //2; dYgroup += 4; //2; } /** // WL-inside // *** outdated } else if( image_cfg.WLtype != 0 ) { // == 1 ) { //ddY2 = 7+4; // Weight line space // +2 ***13.06.2001 ddY2 = image_cfg.WLwidth+4; // Weight line space // +2 ***13.06.2001 iYwei = iH - dY2 - dY_WL; //ddY2; // inside dYwei = dY_WL; } **/ // splitN, splitH, splitSpace if( image_cfg.splitBlockSize > 0 ) { splitN = iSeqLen / image_cfg.splitBlockSize; if( (iSeqLen % image_cfg.splitBlockSize ) > 0 ) ++splitN; splitSpace = 16+16+22; if( image_cfg.type > 10 ) // *** 22.08.2001 splitSpace += 20; if( splitN > 0 ) splitH = (double)( iH - dY1 - dY2 - splitSpace * (splitN - 1) ) / (double)splitN; else splitH = iH - dY1 - dY2; // *err ? } // dSP2 before dSP1 ! ('dX1 += dX1' at end) //SN2 = f_1stN( nSeq ); SL2 = nSeq; //(int)(wSeq2.len() / SN2) + 1; //dSP2 = (int)((double)(iH - dY1 - dY2) / SL2 + 0.5); //+dSP2 = (double)(iH - dY1 - dY2) / SL2; // + 0.5; dSP2 = (double)(iH - dY1 - dY2 - ddY2) / SL2; // + 0.5; // +wei line if( image_cfg.splitBlockSize > 0 ) { dSP2 = splitH / SL2; } cout << " -- dSP2(Y) = " << dSP2 << endl; if( (image_cfg.type < 11) && (dSP2 < dYLim0) ) { dX1 += dX1; // two name cols ? } //yP = (double)dSP2 / SN2; //SL1 = 17; SL2 = 17; //dSP1 = 34; dSP2 = 26; //xP = 3.4; //yP = 2.6; if( image_cfg.splitBlockSize <= 0 ) { SN1 = f_1stN( iSeqLen ); SL1 = (int)(iSeqLen / SN1); // + 1; //++ if( SL1 * SN1 < iSeqLen ) //++ SL1++; //dSP1 = (int)((double)(iW - dX1 - dX2) / SL1 + 0.5); //+dSP1 = (double)(iW - dX1 - dX2 - ddX1 - ddX2 ) / SL1; dSP1 = (double)(iW - dX1 - dX2 - ddX1 - ddX2 ) * SN1/ iSeqLen; // %% if( image_cfg.type == 21 ) { SN1 = 5; SL1 = 20; // 20 * 5 =100% dSP1 = (double)(iW - dX1 - dX2 - ddX1 - ddX2 ) * (double)SN1 * 0.01; } // splitting } else { //- SN1 = f_1stN( image_cfg.splitBlockSize ); if( image_cfg.splitBlockSize < 200 ) { // 50, 60, 80, 100, 150 SN1 = 5; // 10; } else if( image_cfg.splitBlockSize < 400 ) { // 200, 300 SN1 = 10; //20; } else { // 400, 500 SN1 = 25; //50; } SL1 = (int)(image_cfg.splitBlockSize / SN1); // + 1; dSP1 = (double)(iW - dX1 - dX2 - ddX1 - ddX2 ) * SN1/ image_cfg.splitBlockSize; } xP = (double)dSP1 / SN1; cout << " -- dSP1(X) = " << dSP1 << ", SL1 = " << SL1 << endl; // weight scale numbers if( image_cfg.type > 10 ) { dWk = oAli.WeightLineMax; if( image_cfg.type == 21 || image_cfg.type == 22 ) { if( dWk < oAli.WeightLineMax2 ) { dWk = oAli.WeightLineMax2; } } image_cfg.WeightLineScaleMax = dWk; SNw = f_1stN( (int) (dWk * 10.) ); SLw = (int) (dWk * 10.) / SNw; dSPw = (double) (iH - dY1 - dY2 - ddY2) * SNw/ (dWk * 10.); if( image_cfg.splitBlockSize > 0 ) { dSPw = splitH * (double)SNw / (dWk * 10.); } cout << "--- dSPw = " << dSPw << ", max/1st*10 = " << dWk << "/" << SNw << endl; // Adjust for H-small fragmets if( dSPw < 8. ) { // 8 * 2 = 16 - min SNw *= 2; SLw = (int) (dWk * 10.) / SNw; dSPw *= 2.; cout << " -- dSPw = " << dSPw << ", max/1st*10 = " << dWk << "/" << SNw << endl; } //getch(); } /***** // 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[101]; // Create output image im_out = gdImageCreate( iW, iH ); int yellow = gdImageColorResolve( im_out, 255, 190, 0 ); int orange = gdImageColorResolve( im_out, 255, 100, 0 ); int dorange= gdImageColorResolve( im_out, 160, 70, 0 ); int dgray = gdImageColorAllocate(im_out, 180, 180, 180); int dblue = gdImageColorAllocate(im_out, 0, 0, 170); int unpaired = gdImageColorResolve( im_out, 250, 211, 233); int lblack = gdImageColorResolve( im_out, 140, 140, 140); //int lblack = gdImageColorResolve( im_out, 90, 90, 90); 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); //dgreen= gdImageColorAllocate(im_out , 0, 159, 0); dgreen= gdImageColorAllocate(im_out , 0, 133, 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); int lgray2 = gdImageColorAllocate(im_out, 233, 233, 233); vlgray = gdImageColorAllocate(im_out, 250, 250, 250); lwhite = gdImageColorAllocate(im_out, 255, 250, 245); 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, lwhite ); //white2); //-gdImageFilledRectangle( im_out , dX1, dY1, iW - dX2, iH - dY2, unpaired ); 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, frame_gray = 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) //+f_outFrame( im_out, 'w', dX1, dY1, iW - dX2, iH - dY2, white ); /** 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); image_cfg.gapColor = lblack; //dgray; //+gray; //lgray; //gray if( image_cfg.fillType == 0 ) { // even image_cfg.gapColor = black; } //image_cfg.unpairColor = unpaired; //lgray; //gray // Weight line: //#define _ALIG_WL_ORDERED //#include "aligwl.h" //#undef _ALIG_WL_ORDERED #include "aligwlor.h" // Display WL if( image_cfg.splitBlockSize <= 0 ) { f_outFragmentWL( im_out, oAli, image_cfg, dX1, iW - dX2, iYwei, dWL, iWLceil, iiSU, 0, 0 ); // 0, 0 = splitOffset & blocksize f_outFrameWL( im_out, image_cfg, dX1, iW - dX2, iYwei, bColOrdered, oAli.WeightLineMax, 1, 1, iW - dX2, white, black, brown, dorange ); // iFrag, iLast // Group Line (GL): if( image_cfg.type > 10 ) { f_outFrameGL( im_out, image_cfg, dX1, iW - dX2, iYgroup, white, black, brown, dorange, lgray, lgray2 ); } // Split WL } else { int iY01, iY02; for( i = 0; i < splitN; ++i ) { splitOffset = image_cfg.splitBlockSize * i; iY01 = dY1 + (int)((splitH + (double)splitSpace) * (double)i); iY02 = iY01 + splitH; iYwei = iY02 + dYwei - 1; // -1: a little closer.. cout << " - iYwei = " << iYwei << endl; //", " << iY02 << endl; // Space between fragments if( i < (splitN - 1 ) ) { gdImageFilledRectangle(im_out, dX1, iY02, iW - dX2, iY02 + splitSpace, frame_gray ); } iWk = f_outFragmentWL( im_out, oAli, image_cfg, dX1, iW - dX2, iYwei, (double)(iW - dX1 - dX2) / (double)image_cfg.splitBlockSize, iWLceil, iiSU, splitOffset, image_cfg.splitBlockSize ); // iWk - last pos to plot 'worst'. f_outFrameWL( im_out, image_cfg, dX1, iW - dX2, iYwei, bColOrdered, oAli.WeightLineMax, i+1, splitN, iWk, white, black, brown, dorange ); // iFrag, iLast // Group Line (GL): if( image_cfg.type > 10 ) { f_outFrameGL( im_out, image_cfg, dX1, iW - dX2, iY02+ dYgroup - 1, white, black, brown, dorange, lgray, lgray2 ); } } } // Group Colors //int aClr[10]; //f_setGroupColors( im_out, aClr, 5, 4, 4 ); int aClr[22]; iWk = iWk2 = iWk3 = (aG.size() / 3) + 1; if( aG.size() % 3 > 0 ) ++iWk; // red if( aG.size() % 3 > 1 ) ++iWk3; // blue // R G B f_setGroupColors( im_out, aClr, iWk, iWk2, iWk3 ); //+int iQ, iG; int iCGL = f_clrGreen( im_out, 0, 0, 4 ); // letters in MAX group int iCL = f_clrGreen( im_out, 1, 0, 4 ); // same letters int iCG = f_clrBlue ( im_out, 2, 0, 4 ); // num of group int iCW = f_clr ( im_out, 2, 0, 6 ); // weight iCG = blue; // ? if( image_cfg.type == 12 || image_cfg.type == 21 || image_cfg.type == 22 ) { iiSU = orSums.begin(); iiSL = orSL.begin(); iiGL = orGL.begin(); iiNG = orNG.begin(); if( image_cfg.type == 21 || image_cfg.type == 22 ) { iiSU2 = orSums2.begin(); iiSL2 = orSL2.begin(); iiGL2 = orGL2.begin(); iiNG2 = orNG2.begin(); } } // X-lines: if( image_cfg.splitBlockSize <= 0 ) { f_outFrame( im_out, 'w', dX1, dY1, iW - dX2, iH - dY2, white ); f_outFragment( im_out, oAli, image_cfg, splitOffset, dX1, dY1, iW - dX2, iH - dY2, aClr, dWL, dSP2, dYLim0, dYLim1, letterScale, white, black, brown, brown2, gray, lgray, lgray2, lblue ); /** //+dY_wk = iH - dY2 - (int)dSP2; // + X_year; //dY_wk = iH - dY2 - (int)dSP2 - ddY2; // +wei line d_dY = 0.12 * dSP2; d_dY = 0; // ********************** //dY1_wk = iH - dY2 - (int)(dSP2 + d_dY); //dY2_wk = iH - dY2 - d_dY; //-vector< char, alloc > vComp( nSeq, ' ' ); // 's' - same, 'u' - unpaired, 'm' - mismatch for( i = 1; i <= nSeq; i++ ) { //+dWk = (double)(iH - dY2) - dSP2 * (double)i; dWk = (double)(iH - dY2) - dSP2 * (double)i; // - (double)ddY2; // ddY2 - wei inside dY_wk = (int)dWk; dY1_wk = (int)( (double)(iH - dY2) - dSP2 * (double)i + d_dY; // - (double)ddY2); dY2_wk = (int)( (double)(iH - dY2) - dSP2 * (double)(i - 1) - d_dY; // - (double)ddY2); //?? cout << " - dY_wk = " << dY_wk << endl; // *** See also after Y-lines ! iC = lgray; if( i % 2 == 0 ) iC = lblue; //iWk2 = 0; //gdImageDashedLine(im_out, dX1, dY_wk, iW - dX2, dY_wk, iC); //if( i % 2 == 0 ) { if( i % 2 > 0 ) { //gdImageFilledRectangle( im_out , dX1 +ddX1 +1, dY1_wk, iW - dX2 - ddX2 - 1, // dY2_wk, lgray2 ); //+white ); //(double)(dY2_wk + dY1_wk) *0.5, lgray2 ); //+white ); //gdImageFilledRectangle( im_out , dX1 +ddX1 +1, dY1_wk, iW - dX2 - ddX2 - 1, // (double)(dY2_wk + dY1_wk) *0.5, lgray ); gdImageFilledRectangle( im_out , dX1 +ddX1 +1, dY1_wk, iW - dX2 - ddX2 - 1, dY2_wk, white ); } if( i % 2 == 0 ) { if( image_cfg.type < 11 ) { gdImageFilledRectangle( im_out , dX1 +ddX1 +1, dY1_wk, iW - dX2 - ddX2 - 1, dY2_wk, lgray2 ); //+white ); //(double)(dY2_wk + dY1_wk) *0.5, lgray2 ); //+white ); gdImageFilledRectangle( im_out , dX1 +ddX1 +1, dY1_wk, iW - dX2 - ddX2 - 1, (double)(dY2_wk + dY1_wk) *0.5, lgray ); // gdImageFilledRectangle( im_out , dX1 +ddX1 +1, dY1_wk, iW - dX2 - ddX2 - 1, // (double)(dY2_wk + dY1_wk) *0.5, lgray2 ); } } sWk = vSNames[nSeq - i]; if( image_cfg.type < 11 ) { f_outSeqName( im_out, i, sWk, dX1, dY1_wk, ( dSP2 < dYLim1 ? (dSP2 < dYLim0 ? 2 : 1) : 0 ), brown2, brown, gray ); // type = 0 - std, 1 - tiny, 2 - two cols string sAli = vAli[nSeq - i]; for( j = 0; j < iSeqLen && j < sAli.length(); ++j ) { image_cfg.Weight = oAli.WeightLineSums[j]; // for weighted filling // !! Like WL (see above) //f_outColorChar( im_out, aClr, image_cfg.gapColor, toupper(sAli[j]), aG, f_outColorChar( im_out, aClr, image_cfg, toupper(sAli[j]), aG, //dX1 +ddX1 +1, dY1_wk, iW - dX2 - ddX2 - 1, dY2_wk, j, dX1 + (double)j * dWL + 1, dY1_wk, dX1 + (double)(j+1) * dWL, dY2_wk, i,j, iSeqLen, vColGroup[j] ); } if( i % 2 == 0 ) { //|| i == 1) { //gdImageRectangle ( im_out , dX1 +ddX1 +1, dY1_wk, iW - dX2 - ddX2 - 1, // dY2_wk, black); //gray ); //brown ); //-?gdImageLine ( im_out , dX1 +ddX1 +1, dY1_wk, iW - dX2 - ddX2 - 1, //-? dY1_wk, white ); //gray ); //brown ); gdImageLine ( im_out , dX1 +ddX1 +1, dY2_wk, iW - dX2 - ddX2 - 1, dY2_wk, black); //gray ); //brown ); } else { //gdImageLine ( im_out , dX1 +ddX1 , dY2_wk, iW - dX2 - ddX2 - 1, // after frame ? gdImageLine ( im_out , dX1 +ddX1 +1, dY2_wk, iW - dX2 - ddX2 - 1, dY2_wk, white ); //gray ); //brown ); } } else { // type > 10 if( letterScale == 0 ) { // left //if( i < nSeq ) { f_scaleStroke( im_out, 'l', dX1 - 1 , dY1_wk ); // - 1 ); // left //f_scaleStroke( im_out, 'r', iW - dX2, dY1_wk ); // + 1 //} if( i % 2 > 0 ) { f_outNumLeft( im_out, i, dX1 - 4, dY1_wk, black ); } // at right } else { f_scaleStroke( im_out, 'r', iW - dX2 , dY1_wk ); // right // +1 if( i % 2 > 0 ) { //f_outNumLeft( im_out, i, iW - dX2 + 4, dY1_wk, black ); sprintf( buf20, "%d\0", i ); gdImageString(im_out, gdFontSmall, iW - dX2 + 5, dY1_wk - 7, (unsigned char*)buf20, black ); } } } //dY_wk -= dSP2; } **/ if( image_cfg.type == 21 || image_cfg.type == 22 ) { // comparison picture - only unsplitted so far! *** iWk = image_cfg.type; // save image_cfg.type = 12; f_outColValues( im_out, oAli, image_cfg, splitOffset, dYgroup, dX1, dY1, iW - dX2, iH - dY2, iiSU, iiSL, iiGL, iiNG, //iiSU2, iCGL, iCL, iCG, iCW, aClr, false // false - No same letters ); image_cfg.type = iWk; // restore 21 or 22; f_outColValues( im_out, oAli, image_cfg, splitOffset, dYgroup, dX1, dY1, iW - dX2, iH - dY2, iiSU2, iiSL2, iiGL2, iiNG2, //iiSU2, iCGL, iCL, iCG, iCW, aClr, false // false - No same letters ); } else if( image_cfg.type == 11 || image_cfg.type == 12 ) { // stat /** if( image_cfg.type == 12 ) { iiSU = orSums.begin(); iiSL = orSL.begin(); iiGL = orGL.begin(); iiNG = orNG.begin(); } **/ f_outColValues( im_out, oAli, image_cfg, splitOffset, dYgroup, dX1, dY1, iW - dX2, iH - dY2, iiSU, iiSL, iiGL, iiNG, //iiSU2, iCGL, iCL, iCG, iCW, aClr ); /** for( i = 0; i < iSeqLen; ++i ) { //Num of same letters map< char, int, less< char >, alloc > mLet, mGLet; map< int , int, less< int >, alloc > mGr; map< char, int, less< char >, alloc >::iterator iiL; // set ? int iGL = 0; if( image_cfg.type == 11 ) { for( j = 0; j < nSeq; ++j ) { string sAli = vAli[j]; //mLet[vAli[j][i]] if( sAli[i] != '-' ) { iQ = mLet[ sAli[i] ]; mLet[ sAli[i] ] = iQ + 1; // same letters iG = f_findGroup( sAli[i], aG ); if( iG > -1 ) { if( iG == vColGroup[i] ) // Same group ++iGL; mGr[iG] = iG; // num of groups } } } // Max same letters iQ = -1; for( iiL = mLet.begin(); iiL != mLet.end(); ++iiL ) { if( (*iiL).second > iQ ) { iQ = (*iiL).second; } } } // endif of type = 11 int iX1, iX2, iYSL, iYG, iYG0, iXG0, dXG, iYGL, iYW, iYW0; //iX1 = (double)(iW - dX1 - dX2 + 1) * (double)i / (double)iSeqLen + iX1 = (double)(iW - dX1 - dX2) * (double)i / (double)iSeqLen + (double)dX1; iX2 = (double)(iW - dX1 - dX2) * (double)(i+1) / (double)iSeqLen + (double)dX1; // Same letters - iQ: //iY1 = (double)(iH - dY1 - dY2 - 1) * (double)iQ / (double)nSeq; // + if( image_cfg.type == 11 ) iYSL = (double)(iH - dY1 - dY2 - 1) * (double)iQ / (double)nSeq; else { // == 12 iYSL = (double)(iH - dY1 - dY2 - 1) * (double)(*iiSL) / (double)nSeq; ++iiSL; } // Num of groups if( image_cfg.type == 11 ) iYG = (double)(iH - dY1 - dY2 - 1) * (double)mGr.size() / (double)nSeq; else { // == 12 iYG = (double)(iH - dY1 - dY2 - 1) * (double)(*iiNG) / (double)nSeq; ++iiNG; } dXG = (double)(iX2 - iX1 ) * 0.5; // same group if( image_cfg.type == 11 ) iYGL = (double)(iH - dY1 - dY2 - 1) * (double)iGL / (double)nSeq; else { // == 12 iYGL = (double)(iH - dY1 - dY2 - 1) * (double)(*iiGL) / (double)nSeq; ++iiGL; } // weight if( image_cfg.type == 11 ) iYW = (double)(iH - dY1 - dY2 - 1) * oAli.WeightLineSums[i] / oAli.WeightLineMax; else {// if( image_cfg.type == 12 ) iYW = (double)(iH - dY1 - dY2 - 1) * (*iiSU) / oAli.WeightLineMax; ++iiSU; } gdImageFilledRectangle( im_out , iX1, iH - dY2 - iYGL, iX2, iH - dY2, iCGL ); //gdImageFilledRectangle( im_out , iX1, iH - dY2 - iY1, iX2, iH - dY2, iCL ); //gdImageFilledRectangle( im_out , iX1 + dXG, iH - dY2 - iYG, iX1 + dXG + 1, iH - dY2, iCGL ); gdImageFilledRectangle( im_out , iX1 + dXG, iH - dY2 - iYSL, iX1 + dXG+1, iH - dY2, iCL ); if( i > 0 ) { // Num of groups //gdImageFilledRectangle( im_out , iX1 + dXG, iH - dY2 - iYG, iX1 + dXG + 1, iH - dY2, iCG ); gdImageLine( im_out , iXG0, iH - dY2 - iYG0 + 1, iX1 + dXG, iH - dY2 - iYG + 1, blue ); //iCG ); gdImageLine( im_out , iXG0, iH - dY2 - iYG0 , iX1 + dXG, iH - dY2 - iYG , blue ); //iCG ); // Weight gdImageLine( im_out , iXG0, iH - dY2 - iYW0 + 1, iX1 + dXG, iH - dY2 - iYW + 1, iCW ); //iCG ); gdImageLine( im_out , iXG0, iH - dY2 - iYW0 , iX1 + dXG, iH - dY2 - iYW , iCW ); //iCG ); } iYG0 = iYG; iYW0 = iYW; iXG0 = iX1 + dXG; } // end for **/ } // Y-lines: f_outXaxe( im_out, image_cfg, splitOffset, dX1, dY1, iW - dX2, iH - dY2, SN1, SL1, dSP1, lblue, lgray, brown2 ); /** dX_wk = dX1 + ddX1 + (int)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 - dSP1 +1, dY1+1, dX_wk - 1, //+ iH - dY2 - 1, lwhite2); // transporent? //+} //- Distort the pic ! *** 13.06.2001 //++gdImageDashedLine(im_out, dX_wk, dY1, dX_wk, iH - dY2, iC ); gdImageLine(im_out, dX_wk, iH - dY2 - ddY2, dX_wk, iH - dY2, iC ); if( i % 2 == 0 ) { sprintf( buf6, "%d\0", i*SN1); gdImageString(im_out, gdFontSmall, dX_wk - 6, dY1 - 16, (unsigned char*)buf6, brown2 ); gdImageString(im_out, gdFontSmall, dX_wk - 6, iH - dY2, //dY1 + 6, (unsigned char*)buf6, brown2 ); //(unsigned char*)"20", brown2 ); f_scaleStroke( im_out, 'u', dX_wk, dY1 ); // - 1 ); f_scaleStroke( im_out, 'd', dX_wk, iH - dY2 + 1 ); } if( i == 1 ) { gdImageString(im_out, gdFontSmall, dX1, dY1 - 16, (unsigned char*)"1", brown2 ); gdImageString(im_out, gdFontSmall, dX1, iH - dY2, //dY1 + 6, (unsigned char*)"1", brown2 ); } //+gdImageLine(im_out, dX_wk, dY1, dX_wk, iH - dY2, iC); //dX_wk += dSP1; dWk = (double)dX1 + ddX1 + dSP1 * (double)(i+1); dX_wk = (int)dWk; } **/ // Weight Y-axe numbers if( image_cfg.type > 10 ) { f_outYaxeWeights( im_out, letterScale, dX1, dY1, iW - dX2, iH - dY2 - ddY2, SNw, SLw, dSPw, iCW ); /** for( i = 0; i < SLw; ++i ) { dWk = (double)(iH - dY2 - ddY2) - dSPw * (double)(i+1); iWk = (int)dWk; if( letterScale == 0 ) { // letter at left, weight at right f_scaleStroke( im_out, 'r', iW - dX2, iWk ); // + 1 ); if( i%2 == 0 ) { //sprintf( buf20, "%d\0", SNw*(i+1) ); sprintf( buf20, "%.1f\0", (double)(SNw*(i+1))*0.1 ); //gdImageString(im_out, gdFontSmall, iW - dX2 + 4, iWk - 7, gdImageString(im_out, gdFontTiny, iW - dX2 + 5, iWk - 5, (unsigned char*)buf20, iCW ); } // weight at left } else { f_scaleStroke( im_out, 'l', dX1 - 1, iWk ); // + 1 ); if( i%2 == 0 ) { sprintf( buf20, "%.1f\0", (double)(SNw*(i+1))*0.1 ); gdImageString(im_out, gdFontTiny, dX1 - strlen(buf20)*5- 4, iWk - 5, (unsigned char*)buf20, iCW ); } } } // for end **/ // Y-axe names (left & right) f_outYaxeNames( im_out, letterScale, iXleft, iXright, dY1, iH - dY2, brown, iCW ); /** if( letterScale == 0 ) { // letter at left, weight at right //+gdImageStringUp(im_out, gdFontSmall, iXright, (iH - dY2 + dY1 - 12*6) / 2 + 12*6, //+ (unsigned char*)"w e i g h t", iCW ); gdImageStringUp(im_out, gdFontSmall, iXright, (iH - dY2 + dY1 - 6*6) / 2 + 6*6, (unsigned char*)"weight", iCW ); //gdImageStringUp(im_out, gdFontTiny, iXright, (iH - dY2 + dY1 - 13*5) / 2 + 13*5, // (unsigned char*)"column weight", red ); gdImageStringUp(im_out, gdFontSmall, iXleft, (iH - dY2 + dY1 - 14*6) / 2 + 14*6, //gdImageStringUp(im_out, gdFontTiny, iXleft, (iH - dY2 + dY1 - 14*5) / 2 + 14*5, (unsigned char*)"groups/letters", brown ); // letter scale at right, weight scale at left } else { gdImageStringUp(im_out, gdFontSmall, iXleft, (iH - dY2 + dY1 - 6*6) / 2 + 6*6, (unsigned char*)"weight", iCW ); gdImageStringUp(im_out, gdFontSmall, iXright, (iH - dY2 + dY1 - 14*6) / 2 + 14*6, (unsigned char*)"groups/letters", brown ); } **/ } f_outFrame( im_out, 'b', dX1, dY1, iW - dX2, iH - dY2, brown ); // Splitting } else { int iY01, iY02; for( i = 0; i < splitN; ++i ) { splitOffset = image_cfg.splitBlockSize * i; iY01 = dY1 + (int)((splitH + (double)splitSpace) * (double)i); iY02 = iY01 + splitH; cout << " - iY01,2 = " << iY01 << ", " << iY02 << endl; // White lines f_outFrame( im_out, 'w', dX1, iY01, iW - dX2, iY02, white ); // Space between fragments *** see above in display of WL //if( i < (splitN - 1 ) ) { // gdImageFilledRectangle(im_out, dX1, iY02, iW - dX2, iY02 + splitSpace, frame_gray ); //} f_outFragment( im_out, oAli, image_cfg, splitOffset, dX1, iY01, iW - dX2, iY02, aClr, (double)(iW - dX1 - dX2) / (double)image_cfg.splitBlockSize, dSP2, dYLim0, dYLim1, letterScale, white, black, brown, brown2, gray, lgray, lgray2, lblue ); if( image_cfg.type == 11 || image_cfg.type == 12 ) { // stat f_outColValues( im_out, oAli, image_cfg, splitOffset, dYgroup - 1, dX1, iY01, iW - dX2, iY02, iiSU, iiSL, iiGL, iiNG, iCGL, iCL, iCG, iCW, aClr ); } f_outXaxe( im_out, image_cfg, splitOffset, dX1, iY01, iW - dX2, iY02, SN1, SL1, dSP1, lblue, lgray, brown2 ); if( image_cfg.type > 10 ) { f_outYaxeWeights( im_out, letterScale, dX1, iY01, iW - dX2, iY02, // - ddY2, SNw, SLw, dSPw, iCW ); // Y-axe names (left & right) f_outYaxeNames( im_out, letterScale, iXleft, iXright, iY01, iY02, brown, iCW ); } // ..white lines see above f_outFrame( im_out, 'b', dX1, iY01, iW - dX2, iY02, brown ); //break; } } /***** // (After Y-lines!) // Comparison result types at right: for( i = 1; i <= nSeq; i++ ) { dWk = (double)(iH - dY2) - dSP2 * (double)i - (double)ddY2; // wei inside dY1_wk = (int)( (double)(iH - dY2) - dSP2 * (double)i + d_dY - (double)ddY2); dY2_wk = (int)( (double)(iH - dY2) - dSP2 * (double)(i - 1) - d_dY - (double)ddY2); f_outCompType( im_out, iW - dX2 - ddX2 - 1, dY1_wk, dY2_wk, vComp[nSeq - i], brown ); } *****/ //cout << " - Lines" << endl; // ..white lines see above //+f_outFrame( im_out, 'b', dX1, dY1, iW - dX2, iH - dX2, brown ); /** 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); **/ /*** not so good... // Tiny tune - white pixels over left Y-axe: if( image_cfg.type < 11 ) { for( i = 1; i <= nSeq; i++ ) { dWk = (double)(iH - dY2) - dSP2 * (double)i - (double)ddY2; // wei inside dY_wk = (int)dWk; dY1_wk = (int)( (double)(iH - dY2) - dSP2 * (double)i + d_dY - (double)ddY2); dY2_wk = (int)( (double)(iH - dY2) - dSP2 * (double)(i - 1) - d_dY - (double)ddY2); if( i % 2 == 0 ) continue; gdImageSetPixel ( im_out , dX1 +ddX1 , dY2_wk, white ); } } ***/ // group letters at top: //++if( image_cfg.type < 11 ) { // dX1, dX2 - to center iWk = f_outGroupLetters( im_out, image_cfg, aClr, aG, dX1, iW - dX2, 14, dY1 - 16 - 16, dY1 - 16 - 2, 1, 6, dorange ); // int iX, int dXL, int iY1, int iY2, int dX1, int dX2 ) //++} // Group Line (GL): *** see above due to splitting //-if( image_cfg.type > 10 ) { //- f_outFrameGL( im_out, image_cfg, dX1, iW - dX2, iYgroup, //- white, black, brown, dorange ); //-} // Legends: //+int iL, iYleg = iH - dY2 + 16 + 16; int iL, iYleg = iH - dY2 + 14; // wei inside //if( image_cfg.WLtype == 0 ) // wei at bottom *** outdated iYleg = (iYwei + dY_WL + iLegLineGap*3 ); if( image_cfg.type > 10 ) { iYleg += (dY_WL + iLegLineGap ); // max groups line (GL) } gdImageString(im_out, gdFontSmall, dX1, iYleg , (unsigned char*)"Legends: ", brown ); // + 11 * 6 iWk = iYleg + 5; iL = 25; //dSP1; // * 2; // *** 25*2 =50 colors iWk2 = dX1 + 9*6 + iL/2; // +iL int iWk2_0 = iWk2; // save to plot next leg line if( image_cfg.type < 11 ) { gdImageFilledRectangle(im_out, iWk2, iYleg+2, iWk2 + iL/2, iYleg + 12, image_cfg.gapColor ); // dgray ); iWk2 += (iL/2 + 3); gdImageString(im_out, gdFontSmall, iWk2, iYleg , (unsigned char*)"gap", brown ); // + 11 * 6 iWk2 += (iL + 3*6); } if( image_cfg.type < 11 ) { //++iWk2 = f_outGroupColors( im_out, aClr, aG.size(), iWk2, iYleg, //++ iWk2 + (int)((double)iL*(double)aG.size()*0.4), iYleg + 12, brown ); //++iWk2 += iL; } // weight scale if( bColWeight ) { if( (image_cfg.type != 12) && (image_cfg.type != 21) && (image_cfg.type != 22) ) { //iWk2 = f_colWeightLeg( im_out, iWk2, iWk2 + iL*2, iYleg, string(" .+*"), brown ); //++iWk2 = f_colWeightLeg( im_out, iWk2, iWk2 + iL*2, iYleg, *(oAli.pWLlegends), brown ); iWk2 = f_colWeightLeg( im_out, iWk2, iWk2 + iL*2, iYleg, iWLceil, oAli.WeightLineMax, brown ); //iWk2 += iL; //iWk2 += 3; } } int iGap = iL; if( image_cfg.iW >= 640 && image_cfg.iW <= 660 ) { // ***** iGap = iL/2; } if( image_cfg.type > 10 ) { // weight line gdImageFilledRectangle(im_out, iWk2, iYleg+6, iWk2 + iL/2, iYleg + 9, iCW ); //image_cfg.gapColor ); iWk2 += (iL/2 + 3); if( image_cfg.type == 12 || image_cfg.type == 21 || image_cfg.type == 22 ) { gdImageString(im_out, gdFontSmall, iWk2, iYleg , (unsigned char*)"weight", brown ); // + 11 * 6 iWk2 += (6*6); } iWk2 += iGap; //iL; // num of groups gdImageFilledRectangle(im_out, iWk2, iYleg+6, iWk2 + iL/2, iYleg + 9, iCG ); //image_cfg.gapColor ); iWk2 += (iL/2 + 3); gdImageString(im_out, gdFontSmall, iWk2, iYleg , (unsigned char*)"number of groups", brown ); // + 11 * 6 iWk2 += (iGap + 16*6); // iL // adjust to small picture if( iW < 640 ) { iYleg += 20; //16; iWk2 = iWk2_0; } // letters of max group gdImageFilledRectangle(im_out, iWk2, iYleg+6, iWk2 + iL/2, iYleg + 9, iCL ); //image_cfg.gapColor ); // *** iCGL tooo light ! iWk2 += (iL/2 + 3); gdImageString(im_out, gdFontSmall, iWk2, iYleg , (unsigned char*)"max group letters", brown ); // + 11 * 6 iWk2 += (iGap + 17*6); // iL // same letters if( (image_cfg.type != 21) && (image_cfg.type != 22) ) { //cout << "=== type " << image_cfg.type << endl; gdImageFilledRectangle(im_out, iWk2, iYleg+6, iWk2 + iL/2, iYleg + 9, dgreen ); //image_cfg.gapColor ); iWk2 += (iL/2 + 3); gdImageString(im_out, gdFontSmall, iWk2, iYleg , (unsigned char*)"same letters", brown ); // + 11 * 6 iWk2 += (iGap + 13*6); // iL } // Dashed lines msg for comp picture if( image_cfg.type == 21 || image_cfg.type == 22 ) { sprintf( buf100, "(dashed lines - for %s alignment)\0", sAlgo2 ); gdImageString(im_out, gdFontSmall, iWk2_0, iH - 16 - 3, (unsigned char*)buf100, brown ); } } /***** // Test Colors //int aClr[10]; //f_setGroupColors( im_out, aClr, 5, 4, 4 ); f_outGroupColors( im_out, aClr, iWk2, iYleg - 5, iW - dX2, iYleg + 7 ); f_setGroupColors( im_out, aClr, 7, 4, 4 ); f_outGroupColors( im_out, aClr, iWk2, iYleg + 9, iW - dX2, iYleg + 21 ); *****/ /***** //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); *****/ // Title char *subTit = "Graphical Image of Alignment"; //char *subTit2 = "with same sequences"; char *subTitComp = "Comparison of Two Alignments"; // two aligns if( image_cfg.type == 21 || image_cfg.type == 22 ) { if( strlen(sTit) < 1 ) { gdImageString(im_out, gdFontGiant, (int)((double)(iW - 9*strlen(subTitComp) - dX1 - dX2) * 0.5 + dX1), 7, //7, (unsigned char*)subTitComp, brown ); } else { gdImageString(im_out, gdFontGiant, (int)((double)(iW - 9*strlen(sTit) - dX1 - dX2) * 0.5 + dX1) , 5, (unsigned char*)sTit, brown ); gdImageString(im_out, gdFontTiny, (int)((double)(iW - 5*strlen(subTitComp) - dX1 - dX2) * 0.5 + dX1) , 5+15, (unsigned char*)subTitComp, brown ); } // one align } else { if( strlen(sTit) < 1 ) { gdImageString(im_out, gdFontGiant, (int)((double)(iW - 9*strlen(subTit) - dX1 - dX2) * 0.5 + dX1), 7, //7, (unsigned char*)subTit, brown ); //gdImageString(im_out, gdFontTiny, // (int)((double)(iW - 5*strlen(subTit2) - dX1 - dX2) * 0.5 + dX1) , 5+15, // (unsigned char*)subTit2, brown ); } else { //gdImageString(im_out, gdFontGiant, (int)((double)(iW - 9*strlen(sTit)) * 0.5) , 5, gdImageString(im_out, gdFontGiant, (int)((double)(iW - 9*strlen(sTit) - dX1 - dX2) * 0.5 + dX1) , 5, (unsigned char*)sTit, brown ); gdImageString(im_out, gdFontTiny, (int)((double)(iW - 5*strlen(subTit) - dX1 - dX2) * 0.5 + dX1) , 5+15, (unsigned char*)subTit, brown ); } } // Algo // two aligns if( image_cfg.type == 21 || image_cfg.type == 22 ) { //if( strlen( sAlgo1 ) > 0 ) { gdImageString(im_out, gdFontMediumBold, 10, 4, (unsigned char*)sAlgo1, dorange ); gdImageString(im_out, gdFontSmall, 10+strlen(sAlgo1)*7+6, 4, //+7, 4 (unsigned char*)"alignment", brown ); sprintf( buf100, "versus %s\0", sAlgo2 ); gdImageString(im_out, gdFontSmall, 10, 15, (unsigned char*)buf100, brown ); //} else { // gdImageString(im_out, gdFontMediumBold, 10, 4, // (unsigned char*)"1st alignment", dorange ); // gdImageString(im_out, gdFontSmall, 10, 15, // (unsigned char*)"versus 2nd", brown ); //{ // one align } else { if( strlen( sAlgo1 ) > 0 ) { gdImageString(im_out, gdFontMediumBold, 10, 4, (unsigned char*)sAlgo1, dorange ); //gdImageString(im_out, gdFontSmall, 5+strlen(sAlgo1)*7+6, 4, //+7, 4 //++gdImageString(im_out, gdFontSmall, 5, 15, //++ (unsigned char*)"alignment", brown ); } } // Max gr in a column char *im_type01 = "all"; char *im_type02 = "groups"; char *im_type11 = "max group"; char *im_type12 = "at column"; if( image_cfg.type == 0 ) { gdImageString(im_out, gdFontSmall, iW - strlen(im_type01)*6 - 10, 4, //-gdImageString(im_out, gdFontTiny, iW - strlen(im_type01)*5 - 10, 4, (unsigned char*)im_type01, dorange ); //dgreen ); gdImageString(im_out, gdFontSmall, iW - strlen(im_type02)*6 - 10, 15, //-gdImageString(im_out, gdFontTiny, iW - strlen(im_type02)*5 - 10, 15, (unsigned char*)im_type02, dorange ); } if( image_cfg.type == 1 ) { gdImageString(im_out, gdFontSmall, iW - strlen(im_type11)*6 - 10, 4, (unsigned char*)im_type11, dorange ); gdImageString(im_out, gdFontSmall, iW - strlen(im_type12)*6 - 10, 15, (unsigned char*)im_type12, dorange ); } // Selected groups char *im_type21 = "selected"; char *im_type22 = "groups only"; char *im_type23 = "gaps"; char *im_type24 = "only"; if( image_cfg.type == 2 ) { iWk = f_minSelGroup( *(image_cfg.pSelGroup) ); //cout << " - min sel gr = " << iWk << endl; if( iWk < aG.size() ) { // at least one group selected gdImageString(im_out, gdFontSmall, iW - strlen(im_type21)*6 - 10, 4, (unsigned char*)im_type21, dorange ); gdImageString(im_out, gdFontSmall, iW - strlen(im_type22)*6 - 10, 15, (unsigned char*)im_type22, dorange ); // only gaps } else { gdImageString(im_out, gdFontSmall, iW - strlen(im_type23)*6 - 10, 4, (unsigned char*)im_type23, dorange ); gdImageString(im_out, gdFontSmall, iW - strlen(im_type24)*6 - 10, 15, (unsigned char*)im_type24, dorange ); } } // Col. values char *im_type11_1 = "column"; char *im_type11_2 = "values"; if( image_cfg.type > 10 ) { gdImageString(im_out, gdFontSmall, iW - strlen(im_type11_1)*6 - 10, 4, (unsigned char*)im_type11_1, dorange ); gdImageString(im_out, gdFontSmall, iW - strlen(im_type11_2)*6 - 10, 15, (unsigned char*)im_type11_2, dorange ); } /***** 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( sFName, "wb"); // Write PNG gdImagePng(im_out , out); fclose(out); gdImageDestroy(im_out); /***/ } // EOF