// annali.h
// ------------------------------------------------------
//f_scaleStep - get scale step values
// -----------------------------------------------------
function f_scaleStep2( $iL, $nmax = 30 ) {
$n = log10( $iL );
settype( $n, "integer" );
$n--;
$n = pow( 10, $n );
//echo "n(pow) = " . $n . "
";
if( $iL / $n > $nmax ) {
$r[0] = $n * 5;
$r[1] = 2; //$n * 10; //every 2nd
$r[2] = 2; //4; //$n * 20;
} else {
$r[0] = $n;
$r[1] = 5; //$n * 5; // every 5th
$r[2] = 5;
if( $iL / $n > 500 )
$r[2] = 10; //$n * 10;
if( $iL / $n < 20 )
$r[2] = 2;
if( $iL / $n < 10 )
$r[2] = 1;
}
return $r;
}
// ------------------------------------------------------
// f_clr - color index as func( power )
// -----------------------------------------------------
function f_clr( $im, $x, $pMin, $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. / ($pMax - $pMin); // Colors per power unit
$iR=0.; $iG=0.; $iB =0.;
$xP = $dP * ($x - $pMin); // int
$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 <= 455 ) {
$iG = $ddY - 200;
$iR = 255.;
}
}
$iC = imageColorResolve( $im , $iR, $iG, $iB );
return $iC;
}
// ------------------------------------------------------
// f_imFrame - shadow border around...
// -----------------------------------------------------
function f_imFrame( $im_out, $iW, $iH, $dX1, $dX2, $dY1, $dY2 ) {
$white = ImageColorResolve($im_out, 255, 255, 255);
$black = ImageColorResolve($im_out, 0, 0, 0);
$gray = ImageColorResolve($im_out, 200, 200, 200);
for( $i = 0; $i < 5; $i++ ) {
//iWk = 41 - i*5; // 0 = lgray 31
$iWk = 50 - $i*5; // 0 = lgray 31
$iC = ImageColorResolve($im_out, 255 - $iWk, 255 - $iWk, 255 - $iWk);
ImageLine($im_out, 1+$i, 1+$i, $iW - $i, 1+$i, $iC);
ImageLine($im_out, 1+$i, 1+$i, 1+$i , $iH - $i, $iC);
}
ImageFilledRectangle($im_out, 1+$i, 1+$i, $iW - $i, $dY1 - 1, $iC );
ImageFilledRectangle($im_out, 1+$i, 1+$i, $dX1 - 1, $iH - $i, $iC );
$iC2 = $iC;
// Light gray at right-lower:
ImageLine($im_out, $iW - 1, $iH - 1, $iW - 1, 1 , $gray);
ImageLine($im_out, $iW - 1, $iH - 1, 1 , $iH - 1, $gray);
ImageFilledRectangle($im_out, $iW - $dX2 + 1, $dY1, $iW - $i, $iH - $i, $iC2);
ImageFilledRectangle($im_out, $dX1 , $iH - $dY2 + 1 , $iW - $i, $iH - $i, $iC2);
// White lines: (..dark lines see below)
ImageLine($im_out, $dX1 - 1 , $dY1 - 1 , $iW - $dX2 + 1, $dY1 - 1 , $white);
ImageLine($im_out, $dX1 - 1 , $dY1 - 1 , $dX1 - 1 , $iH - $dY2 + 1, $white);
ImageLine($im_out, $dX1 - 2 , $dY1 - 2 , $iW - $dX2 + 2, $dY1 - 2 , $white);
ImageLine($im_out, $dX1 - 2 , $dY1 - 2 , $dX1 - 2 , $iH - $dY2 + 2, $white);
ImageLine($im_out, $dX1 - 3 , $dY1 - 2 , $dX1 - 3 , $iH - $dY2 + 2, $white);
// Left-upper black frame:
ImageLine($im_out, 0, 0, $iW - 1, 0, $black);
ImageLine($im_out, 0, 0, 0 , $iH - 1, $black);
}
function makeGrapAli( $iSup, $beg, $len, $maxLen, $power, $gif_file,
$bor, $size, $key_size, &$wid, &$hei, $aSN, $seqname, $wm,
$opt, &$DX0, &$DX1, &$DX12, $aKW01, $aPosName, $aST, &$kwMap, $exclu = "") {
global $OUTPUT;
//+echo "maxLen=" . $maxLen . "
";
//$dx1 = 50+16+40; $dx2 = 10+10+10 + 5;
$dx1 = 50+40 - 4; $dx2 = 10+10 + 5;
$twoColLim = 20;
//+if( $iSup < 10 ) {
if( $iSup < $twoColLim ) { // *** 02.02.01
$dx1 -= 30;
$DX0 = 0;
} else
$DX0 = 45; // See below "Seq name: "
$DX1 = $dx1; // return dx1
//$dy1 = 20+10; $dy2 = 20+10;
$dy1 = $bor + $key_size; $dy2 = 20+5 - 4;
// Set height:
//+$hei = $size*( 2*$iSup ) + 5*$bor + $key_size;
$space = 2; //3;
$hei = $size*( 1*$iSup ) +$space*$iSup + 5*$bor + $key_size + $size; // *0.5;
$hei += $dy2; // ***
if( $hei < 220 ) $hei = 220;
// Set width:
$key_dx = 16; //20;
$iWk = count( $aKW01 ) * $key_dx;
$dx12 = $dx1 + $bor + $iWk + $bor;
$wid += ($bor + $iWk + $bor);
$DX12 = $dx12;
# Header("Content-type: image/gif");
$k = imagecreate( $wid, $hei );
$white = imagecolorallocate($k,255,255,255);
imagefilledrectangle( $k, 0, 0, $wid, $hei, $white );
// ??? $white = imagecolorallocate($k,255,255,255);
$red = imagecolorallocate($k,255,0,0);
$green = imagecolorallocate($k,0,128,0);
//$lgreen= imagecolorallocate($k,0,196,0);
$lgreen= imagecolorallocate($k,0,210,0);
$lgreen2= imagecolorallocate($k,0,250,0);
// Maybe not only FT, KW, DE - so only two colors:
// cDE as 1st, cKW as 2nd
//-$cFT = imagecolorallocate($k,0,203,245);
//+$cFT = imagecolorallocate($k,223, 176, 240); // cFT - not used
$cKW = imagecolorallocate($k,0, 220, 200);
$cDE = imagecolorallocate($k,0,210,0);
$magen = imagecolorallocate($k,128,0,128);
$blue = imagecolorallocate($k,0,0,255);
$lblue = imagecolorallocate($k, 145, 0, 255);
$black = imagecolorallocate($k,0,0,0);
$lgray = imagecolorallocate($k,222,222,222);
$gray = imagecolorallocate($k,156,156,156);
//$lgray = imagecolorallocate($k,222,222,222);
//+$white2 = imagecolorallocate($k, 247, 240, 255);
$white2 = imagecolorallocate($k, 240, 233, 255);
//$lwhite = imagecolorallocate($k, 255, 240, 255);
$lwhite2 = imagecolorallocate($k, 255, 247, 255);
f_imFrame( $k, $wid, $hei, $dx1, $dx2, $dy1, $dy2 );
imageString( $k, 3, 5, 3, $seqname, $green );
imageString( $k, 2, $wid - strlen($wm)*6 - 10, 3, $wm, $blue );
// Color keys:
//-$key = imagecreatefromgif( "/www/col_key.gif" );
//-imagecopyresized( $k, $key, 0, 0, 0, 0, $wid, $key_size, $wid, $key_size );
$brown = imagecolorallocate($k,102, 51, 0);
$wk = "Color Key for Alignment Powers";
//+$x = ($wid - strlen( $wk ) * 9 ) * 0.5;
//+if( $x < 10 ) $x = 10;
$x = $dx12 + 20;
$y = 3;
imageString( $k, 5, $x, $y, $wk , $brown );
$x = 2*$bor + $key_size;
// -----------
// Source seq:
// -----------
//+imagefilledrectangle( $k, $bor, $x, $wid - $bor, $x+$size, $red );
//+imagefilledrectangle( $k, $bor, $x, $wid - $bor, $x+$size, $green );
//+$x += $size + 2*$bor;
//imagefilledrectangle( $k, $bor, $x, $wid - $bor, $x+$size + $size *0.5, $green );
//+imagefilledrectangle( $k, $dx12+$bor, $x, $wid - $bor - $dx2,
//+ $x+$size + $size *0.5, $green );
imagefilledrectangle( $k, $dx12+$bor, $x - 2, $wid - $bor - $dx2,
$x+$size + $size *0.5 - 2, $green );
$ySave = $x;
//-$ySave++;
$wk = "" );
$seqmap = $wk;
/**
imageString( $k, 1, $dx12+$bor - 1, $x+$size + $size *0.5 + 1,"1", $brown );
$wk = $maxLen;
settype( $wk, "string" );
imageString( $k, 1, $wid - $bor - $dx2 - strlen($wk) * 5 + 2, $x+$size + $size *0.5+1,
$wk, $brown );
**/
// X-Scale;
//+$y = $ySave + 2;
$y = $ySave + $size + $size *0.5 - 1;
$r = f_scaleStep2( $maxLen, 50 );
//+ echo "r[0]=". $r[0] . "
";
/**/
$xScale = ( $wid - 2*$bor - $dx12-$dx2)/$maxLen;
//+for( $n = $r[0], $i = 1; ($dx12 + $bor +$n*$xScale) < ($wid - $dx2 - $bor);
//++for( $n = 0, $i = 0; ($dx12 + $bor +$n*$xScale) < ($wid - $dx2 - $bor);
for( $n = 0, $i = 0; ($dx12 + $bor +$n*$xScale) < ($wid - $dx2 - $bor + 1 );
$n += $r[0], $i++ )
{
$x = $dx12 + $bor + $n * $xScale;
imageDashedLine( $k, $x, $y, $x, $hei - $dy2 - 2, $lgray );
$iC = $brown;
//if( $n % $r[1] == 0 ) $iC = $green;
if( $i % $r[1] == 0 ) {
imageLine( $k, $x , $y, $x , $y + 2, $iC );
imageLine( $k, $x+1, $y, $x+1, $y + 2, $iC );
imageLine( $k, $x-1, $y, $x-1, $y + 2, $iC );
} else {
//$iC = $green;
imageLine( $k, $x , $y, $x , $y + 1, $iC );
}
if( $i % $r[2] == 0 ) {
// move left if outside.
$nDig = log10( $n );
//-$wk = $nDig;
settype( $nDig, "integer" );
//-if($wk > $nDig)
$nDig++;
$nWid = $nDig * 6;
$nx = $x + 1;
if( $nx > ($wid - $dx2 - $nWid - 1) ) {
//$nx = $x - $nWid; // move left of dot if outside
$nx = $wid - $dx2 - $nWid - 1; // move left of border if outside
}
//imageString( $k, 2, $x, $y+2 - 2, $n, $black); //$brown );
//+imageString( $k, 2, $x+1, $y+2 - 2, $n, $black); //$brown );
imageString( $k, 2, $nx, $y+2 - 2, $n, $black); //$brown );
}
}
/**/
$x = $ySave;
$x += $size + 2*$bor + $size *0.5;
$x++; // *** 02.02.01
// *** req. dyScale = 12 instead of 2*bor?
// Y of the 1st supermotif/keyword: // ***
$yk0 = $x;
$imedi = $iSup * 0.5;
settype( $imedi, "integer" );
$pmedi = $power[$iSup - 1]; //$pmax; // init
$sfont = 2;
$sdy = $bor * 0.6; //$dy * 0.6; //0; //$dy * 0.4;
//+if( $iSup > 9) {
if( $iSup >= $twoColLim ) { // *** 02.02.01
$sfont = 1;
$sdy = 0; //$dy * 0.6;
}
for( $i=0; $i < $iSup; $i++) {
if( $i == $imedi ) $pmedi = $power[$i];
/**
if( $power[ $i ] > 20.0 ) {
$color = $red;
}
else if( $power[ $i ] > 12.0 ) {
$color = $green;
}
else if( $power[ $i ] > 8.0 ) {
$color = $magen;
}
else if( $power[ $i ] > 6.0 ) {
$color = $blue;
}
else
$color = $black;
**/
// Mark every 2nd line:
//+$iC =( $i % 2 == 0 ? $lwhite2 : $white2 );
//+imagefilledrectangle( $k, $dx1+1, $x, $wid - $dx2 - 1, $x+$size - 1, $iC );
if( ($i+1) % 2 == 0 )
//imagefilledrectangle( $k, $dx1+1, $x - 1, $wid - $dx2 - 1, $x+$size, $white2 );
imagefilledrectangle( $k, $dx1 - 10, $x, $wid - $dx2 - 1, $x+$size - 1, $white2 );
//$color = f_clr( $k, $power[$i], $power[$iSup - 1], $power[0] );
$color = f_clr( $k, $power[$i], $power[0], $power[$iSup - 1] );
// Force "dummy" mot
//+if( strpos( $exclu, "," . $aSN[$i] . "," ) > 0 )
$iC = $brown;
if( ($i+1) % 2 == 0 ) $iC = $lblue;
if( strpos( $exclu, "," . ($i+1) . "," ) > 0 ) {
$color = $lgray;
$iC = $gray;
}
for( $j=0; $j < count( $beg[ $i ] ); $j++) {
//$b = $bor+$beg[ $i ][ $j ]*( $wid - 2*$bor )/$maxLen;
//$e = $bor+($beg[ $i ][ $j ]+$len[ $i ][ $j ])*( $wid - 2*$bor )/$maxLen;
$b = $dx12+$bor+$beg[ $i ][ $j ]*( $wid - 2*$bor - $dx12-$dx2)/$maxLen;
$e = $dx12+$bor+($beg[ $i ][ $j ]+$len[ $i ][ $j ])*( $wid - 2*$bor - $dx12-$dx2)/$maxLen;
imagefilledrectangle( $k, $b, $x, $e, $x+$size-1, $color );
}
//$y = $dy1+$dy*$i;
$y = $x - $space; // ? * 0.5;
// Seq name:
//+if( $iSup > 9)
if( $iSup >= $twoColLim ) // *** 02.02.01
$iWk = ( $i % 2 == 0 ? 5 : 45 ) + 5;
else
$iWk = 5 + 5;
//imageString( $k, $sfont, $iWk, $y + $sdy, $aSN[ $i ], $iC ); // $brown );
imageString( $k, $sfont, $iWk, $y , $aSN[ $i ], $iC ); // $brown );
//$x += 2*$size;
$x += $size + $space;
// Skip last if prev has been displayed:
//if( $iSup > 9 && (($i+1) % 5 == 1) && ($i == ($iSup - 1)) ) continue; // <---
if( ($iSup >= $twoColLim) && (($i+1) % 5 == 1)
&& ($i == ($iSup - 1)) ) continue; // <---
// Display only 1st and every 5th:
//if( $iSup > 9 && (($i+1) % 5 != 0) && $i > 0 && ($i != ($iSup - 1)) ) continue;
if( ($iSup >= $twoColLim) && (($i+1) % 5 != 0)
&& $i > 0 && ($i != ($iSup - 1))) continue;
//-if( $iSup > 9 && (($i+1) % 5 != 0) && $i > 0 ) continue;
// Number
imageString( $k, 1, $wid - $dx2 +4, $y + $sdy, $i+1, $brown );
//+if( $iSup > 9 && (($i+1) % 5 == 0) )
imageline ( $k, $wid - $dx2 +3 - $bor, $y + $sdy + 3,
$wid - $dx2 , $y + $sdy + 3, $brown );
}
// Kewords: ---------------------------------------------
// get stat max:
$stV = array_values( $aST );
$stMax = 0;
for( $i = 1; $i < count( $stV ); $i++ ) {
if( $stV[ $i ] > $stMax )
$stMax = $stV[ $i ];
}
$aKW = array_keys( $aKW01 );
$kwLen = 0;
$kwtPrev = "";
$iC = $cKW;
for( $i = 0; $i < count( $aKW ); $i++ ) {
$kwt = substr($aKW[$i], 0, 2);
$kwl = strlen($aKW[$i]) - 4;
if( $kwl > $kwLen ) $kwLen = $kwl;
$li = $aKW01[ $aKW[$i] ];
//+ echo "li01=*" . $li . "*
";
$dxk = $dx1 + $bor + $key_dx * $i;
$yk = $yk0;
for( $j = 0; $j < $iSup; $j++ ) {
$sn = $aSN[ $j ];
if( isset($aPosName[ $sn ]) ) {
$pos = $aPosName[ $sn ];
if( substr( $li, $pos * 2, 1 ) != "0" ) {
// Adjust high level to SD value:
$ykh = $yk - 1;
$dykh =0;
/***
//imageRectangle( $k, $dxk, $yk - 1, $dxk+$key_dx - 3, $yk+$size-1, $lgreen );
//+$iC = $lgreen;
$iC = $cKW;
if( $kwt == "FT" ) $iC = $cFT;
if( $kwt == "DE" ) $iC = $cDE;
***/
if( $kwtPrev != $kwt ) { // cFT - not used
$kwtPrev = $kwt;
if( $iC == $cKW ) $iC = $cDE;
else $iC = $cKW;
}
/***
if( $size > 11 ) {
if( $aST[ $aKW[ $i ] ] < ( $stMax * 0.75 ) )
$dykh = $size * 0.25;
if( $aST[ $aKW[ $i ] ] < ( $stMax * 0.5 ) )
$dykh = $size * 0.5;
if( $aST[ $aKW[ $i ] ] < ( $stMax * 0.25 ) )
$dykh = $size * 0.75;
// When a lot of supermotifs:
} else {
if( $aST[ $aKW[ $i ] ] < ( $stMax * 0.5 ) ) {
$dykh = $size - 2;
$iC = $lgreen2;
}
}
***/
//+imageRectangle( $k, $dxk, $ykh + $dykh, $dxk + $key_dx - 3,
imageRectangle( $k, $dxk+2, $ykh + $dykh, $dxk + $key_dx - 3 - 1,
$yk + $size - 1, $iC ); //$lgreen );
}
}
$yk += ($size + $space);
}
// KW, DE, FT:
imageString( $k, 1, $dxk+3, $yk0 - 10, $kwt, $brown );
// Vert lines:
ImageDashedLine( $k, $dxk+$key_dx - 1, $dy1, $dxk+$key_dx - 1, $hei - $dy2, $lgray);
// fill kwmap:
//echo( "" );
$wk = " -1 ) {
$wk .= ( " href=#" . $kwt . "_" . substr($aKW[$i], 4) );
}
$wk .= ( " title='" . $aKW[$i] . "' >" );
$kwMap[$i] = $wk;
}
// Add seq map:
$kwMap[count($kwMap)] = $seqmap;
/**/
// Display KWs:
// max num:
$yk_space = 10;
$yk = $yk0 + $kwLen * 5 + $yk_space;
/**
// Only two:
$wk = ($hei - $dy2 - $yk0)* 0.5 - $kwLen * 5; // spaces in a half
$yk_space = $wk * 0.6;
settype( $yk_space, "integer" );
$yk = $yk0 + $kwLen * 5 + $yk_space;
**/
/**/
// keywords in line:
while( $yk < ($hei - $dy2 - 3) ) {
for( $i = 0; $i < count( $aKW ); $i++ ) {
$kwn = substr($aKW[$i], 4);
$dxk = $dx1 + $bor + $key_dx * $i;
imageStringUp( $k, 1, $dxk+3, $yk, $kwn, $black );
}
$yk += ( $kwLen * 5 + $yk_space );
}
/**/
/***
// keywords by stepwise:
$yk1 = $yk0;
$up = TRUE;
while( $yk1 < ($hei - $dy2 - 5) ) {
$yk = $yk1;
for( $i = 0; $i < count( $aKW ); $i++ ) {
$kwn_= substr($aKW[$i], 4);
$kwn = $kwn_;
$kwl_= strlen($aKW[$i]) - 4;
$kwl = $kwl_;
$kwlMax = ($hei - $dy2 - $yk - 5) * 0.2; // 5;
settype( $kwlmax, "integer" );
if( $kwl > $kwlMax ) {
$kwn = substr($aKW[$i], 4 + $kwl - $kwlMax );
$kwl = $kwlMax;
}
//+$yk += ($kwl*5);
$yk += (8*5);
if( $yk > ($hei - $dy2 - 5) ) continue; // break;
$dxk = $dx1 + $bor + $key_dx * $i;
imageStringUp( $k, 1, $dxk+3, $yk, $kwn, $black );
// upwards:
if( $up ) {
$upy = $yk - ( $kwLen * 5 * 2 + $yk_space );
while( $upy > ($yk0 + 5) ) {
if( ($upy - $kwl_ * 5) > ($yk0 + 1) ) {
imageStringUp( $k, 1, $dxk+3, $upy, $kwn_, $black );
}
$upy -= ( $kwLen * 5 * 2 + $yk_space );
}
}
//$yk += ( $kwl_ * 5 + 1 );
$yk++;
}
$yk1 += ( $kwLen * 5 * 2 + $yk_space );
$up = FALSE;
}
***/
// Internal frame
ImageRectangle ( $k, $dx1 , $dy1, $wid - $dx2, $hei - $dy2, $brown);
ImageDashedLine( $k, $dx12, $dy1, $dx12 , $hei - $dy2, $brown); //$lgray);
// KW, DE, FT ?
$kwl = 8 * 7;
if( ($dx12 - $dx1) > $kwl ) {
$wk = (($dx12 - $dx1) - $kwl ) *0.5;
ImageString( $k, 3, $dx1 + $wk, $dy1 - 14 - 4, "Keywords", $brown );
}
// Legends:
$pmax = $power[0]; $pmin = $power[$iSup - 1];
$sp = 20; // leg.space
$yleg = $dy1 - 15; //18; //20; //hei - 20;
$lleg = 60; // size
//ImageString( $k, 2, $dx1, $yleg, "Legends: ", $brown );
//$xleg = $dx1 + $bor + 40+20; //10*6; // + $sp;
//+$xleg = 120; //$dx1 + $bor + 40+20; //10*6; // + $sp;
$xleg = $dx12 + 20; // *** 20.01.01
$ic = f_clr( $k, $pmax, $pmax, $pmin );
//+imagefilledrectangle( $k, $xleg, $yleg+3, $xleg + $lleg, $yleg + 10, $ic );
imagefilledrectangle( $k, $xleg, $yleg+2, $xleg + $lleg, $yleg + 7, $ic );
$xleg += ($lleg + 4);
//ImageString( $k, 2, $xleg, $yleg, $pmax . " (max power)", $brown );
//+ImageString( $k, 1, $xleg, $yleg, $pmax . " (max)", $brown );
ImageString( $k, 2, $xleg, $yleg - 1, $pmax . " (max)", $brown );
$xleg += (12 * 6 + $sp);
$ic = f_clr( $k, $pmedi, $pmax, $pmin );
//+imagefilledrectangle( $k, $xleg, $yleg+3, $xleg + $lleg, $yleg + 10, $ic );
imagefilledrectangle( $k, $xleg, $yleg+2, $xleg + $lleg, $yleg + 7, $ic );
$xleg += ($lleg + 4);
ImageString( $k, 2, $xleg, $yleg - 1, $pmedi, $brown );
$xleg += (6 * 6 + $sp);
$ic = f_clr( $k, $pmin, $pmax, $pmin );
//+imagefilledrectangle( $k, $xleg, $yleg+3, $xleg + $lleg, $yleg + 10, $ic );
imagefilledrectangle( $k, $xleg, $yleg+2, $xleg + $lleg, $yleg + 7, $ic );
$xleg += ($lleg + 4);
ImageString( $k, 2, $xleg, $yleg - 1, $pmin . " (min)", $brown );
// Opt Line:
//ImageStringUp( $k, 1, $wid - 17, $hei - $dy2 - 2, $opt, $brown );
ImageString( $k, 1, $dx1, $hei - 16, $opt, $brown );
// *******************************************
//$er = imagegif( $k, $gif_file ); // ************ Linux GIF
$er = imagePng( $k, $gif_file );
// *******************************************
}
?>