/* doStamps.c draw various stamps for Proteome Browser */ #include "common.h" #include "hCommon.h" #include "portable.h" #include "memalloc.h" #include "jksql.h" #include "vGfx.h" #include "htmshell.h" #include "cart.h" #include "hdb.h" #include "web.h" #include "hgColors.h" #include "pbStamp.h" #include "pbStampPict.h" #include "pbTracks.h" Color boundaryColor; void setPbStampPict(struct pbStampPict *stampPictPtr, struct pbStamp *stampDataP, int ix, int iy, int iw, int ih) /* set drawing parameters for a stamp */ { if (stampPictPtr == NULL) errAbort("In setPbStampPict(), stampPictPtr is NULL."); stampPictPtr->xOrig = ix; stampPictPtr->yOrig = iy; stampPictPtr->width = iw; stampPictPtr->height = ih; stampPictPtr->stampDataPtr = stampDataP; } void calStampXY(struct pbStampPict *PictPtr, double xin, double yin, int *outxp, int *outyp) /* coordinate conversion from stamp data space to picture space */ { double xScale0, yScale0; xScale0 = (double)(PictPtr->width) /(PictPtr->stampDataPtr->xmax - PictPtr->stampDataPtr->xmin); yScale0 = (double)(PictPtr->height)/(PictPtr->stampDataPtr->ymax - PictPtr->stampDataPtr->ymin); *outxp = (int)((xin - PictPtr->stampDataPtr->xmin)*xScale0) + PictPtr->xOrig; *outyp = -(int)((yin - PictPtr->stampDataPtr->ymin)*yScale0) + PictPtr->yOrig; } void pbBox(double fx, double fy, double fw, double fh, int color) /* draw a box based on data coordinates */ { int x, y, w, h; calStampXY(stampPictPtr, fx, fy, &x, &y); w = (int)(fw * xScale); h = (int)(fh * yScale); vgBox(g_vg, x, y-h, w+1, h, color); } void hLine(double fx, double fy, double fw, double ih, int color) /* draw a horizontal line based on data coordinates */ { int x, y, w, h; calStampXY(stampPictPtr, fx, fy, &x, &y); w = (int)(fw * xScale); h = ih; vgBox(g_vg, x, y-h, w+1, h, color); } void hLine2(double fx, double fy, double fw, double ih, int color) /* draw a horizontal line based on data coordinates, this function extend 1 pixel more to the right, useful for picture fine tuning of slight difference due to rounding. */ { int x, y, w, h; calStampXY(stampPictPtr, fx, fy, &x, &y); w = (int)(fw * xScale); h = ih; /* 1 pixel more to the width */ vgBox(g_vg, x, y-h, w+1+1, h, color); } void vLine(double fx, double fy, double fh, int iw, int color) /* draw a vertical line based on data coordinates */ { int x, y, w, h; calStampXY(stampPictPtr, fx, fy, &x, &y); w = iw, h = (int)(fh * yScale); vgBox(g_vg, x, y-h-1, w, h+1, color); } void vLineM(double fx, double fy, double fh, int iw, int color) /* draw a vertical line based on data coordinates, for Marker lines */ { int x, y, w, h; calStampXY(stampPictPtr, fx, fy, &x, &y); w = iw, h = (int)(fh * yScale); vgBox(g_vg, x, y-h-1, w, h-1, color); } void drawXScaleNonInt(struct pbStamp *pbStampPtr, struct pbStampPict *stampPictPtr, int increment) /* mark the X axis scale for non-Integer data */ { int i; double txmin, tymin, txmax, tymax; int xx, yy; char labelStr[20]; txmin = pbStampPtr->xmin; txmax = pbStampPtr->xmax; tymin = pbStampPtr->ymin; tymax = pbStampPtr->ymax; for (i=(int)txmin; i<(int)txmax; i=i+increment) { vLineM((double)i, 0.0, (tymax-tymin)*0.05, 2, boundaryColor); calStampXY(stampPictPtr, (double)i, 0, &xx, &yy); safef(labelStr, sizeof(labelStr), "%d", i); vgTextCentered(g_vg, xx-5, yy+5, 10, 10, MG_BLACK, g_font, labelStr); } } void drawXScale(struct pbStamp *pbStampPtr, struct pbStampPict *stampPictPtr, int increment) /* mark the X axis scale */ { int i; double txmin, tymin, txmax, tymax; int xx, yy; char labelStr[20]; txmin = pbStampPtr->xmin; txmax = pbStampPtr->xmax; tymin = pbStampPtr->ymin; tymax = pbStampPtr->ymax; for (i=(int)txmin; i<(int)txmax; i=i+increment) { vLineM((double)i+0.5, 0.0, (tymax-tymin)*0.05, 2, boundaryColor); calStampXY(stampPictPtr, (double)i+0.5, 0, &xx, &yy); safef(labelStr, sizeof(labelStr), "%d", i); vgTextCentered(g_vg, xx-5, yy+5, 10, 10, MG_BLACK, g_font, labelStr); } } void drawXScaleMW(struct pbStamp *pbStampPtr, struct pbStampPict *stampPictPtr, int increment) /* mark the X axis scale */ { int i; double txmin, tymin, txmax, tymax; int xx, yy; char labelStr[20]; txmin = pbStampPtr->xmin; txmax = pbStampPtr->xmax; tymin = pbStampPtr->ymin; tymax = pbStampPtr->ymax; for (i=(int)txmin; i<=(int)txmax; i=i+increment) { vLineM((double)i+0.5, 0.0, (tymax-tymin)*0.05, 1, boundaryColor); calStampXY(stampPictPtr, (double)i+0.5, 0, &xx, &yy); safef(labelStr, sizeof(labelStr), "%dK", i/1000); vgTextCentered(g_vg, xx-5, yy+5, 10, 10, MG_BLACK, g_font, labelStr); } } void drawXScaleHydro(struct pbStamp *pbStampPtr, struct pbStampPict *stampPictPtr, double increment) /* mark the X axis scale */ { int i; double txmin, tymin, txmax, tymax; double xValue; int xx, yy; char labelStr[20]; int i0, i9; txmin = pbStampPtr->xmin; txmax = pbStampPtr->xmax; tymin = pbStampPtr->ymin; tymax = pbStampPtr->ymax; i0 =0; i9 =(int)((txmax - txmin)/increment); for (i=0; i<=i9; i++) { vLineM((double)i*increment+txmin, 0.0, (tymax-tymin)*0.05, 1, boundaryColor); xValue = txmin + increment*(double)i; calStampXY(stampPictPtr, xValue, 0, &xx, &yy); safef(labelStr, sizeof(labelStr), "%.1f", xValue); vgTextCentered(g_vg, xx-5, yy+5, 10, 10, MG_BLACK, g_font, labelStr); } } void markResStamp(char aaChar, struct pbStamp *pbStampPtr, struct pbStampPict *stampPictPtr, int iTarget, double yValue, double tx[], double ty[], double avg[], double stddev[]) /* mark the AA residual stamp */ { int ix, iy; double txmin, tymin, txmax, tymax; double yPlotValue; int len; int xx, yy; double pctLow, pctHi; char cond_str[255]; char *answer; len = pbStampPtr->len; txmin = pbStampPtr->xmin; txmax = pbStampPtr->xmax; tymin = pbStampPtr->ymin; tymax = pbStampPtr->ymax; ix = stampPictPtr->xOrig; iy = stampPictPtr->yOrig; safef(cond_str, sizeof(cond_str), "AA='%c'", aaChar); answer = sqlGetField(database, "pbAnomLimit", "pctLow", cond_str); pctLow = (double)(atof(answer)); answer = sqlGetField(database, "pbAnomLimit", "pctHi", cond_str); pctHi = (double)(atof(answer)); calStampXY(stampPictPtr, (txmax-txmin)/2.0, tymax, &xx, &yy); if (yValue > tymax) { yPlotValue = tymax; } else { yPlotValue = yValue; } if (yValue >= pctHi) { vLineM(tx[iTarget]+0.4, 0, yPlotValue, 3, abnormalColor); } else { if (yValue <= pctLow) { vLineM(tx[iTarget]+0.4, 0, yPlotValue, 3, abnormalColor); } else { vLineM(tx[iTarget]+0.5, 0, yPlotValue, 2, normalColor); } } } void markResStdvStamp(struct pbStamp *pbStampPtr, struct pbStampPict *stampPictPtr, int iTarget, double yValueIn, double tx[], double ty[], double avg[], double stddev[]) /* mark the AA residual stddev stamp */ { int ix, iy; double txmin, tymin, txmax, tymax; double yValue, yPlotValue; int len; int xx, yy; double pctLow, pctHi; char cond_str[255]; char *answer; char aaChar; len = pbStampPtr->len; txmin = pbStampPtr->xmin; txmax = pbStampPtr->xmax; /* force fit for the stddev stamp plot */ tymin = -4.0; tymax = 4.0; ix = stampPictPtr->xOrig; iy = stampPictPtr->yOrig; aaChar = aaAlphabet[iTarget]; safef(cond_str, sizeof(cond_str), "AA='%c'", aaChar); answer = sqlGetField(database, "pbAnomLimit", "pctLow", cond_str); pctLow = (double)(atof(answer)); answer = sqlGetField(database, "pbAnomLimit", "pctHi", cond_str); pctHi = (double)(atof(answer)); yScale = (double)(120)/8.0; calStampXY(stampPictPtr, (txmax-txmin)/2.0, tymax, &xx, &yy); yValue = (yValueIn - avg[iTarget])/stddev[iTarget]; if (yValue > tymax) { yPlotValue = tymax; } else { if (yValue < tymin) { yPlotValue = tymin; } else { yPlotValue = yValue; } } if (yValueIn > pctHi) { vLine(tx[iTarget]+0.4, 0.0, yPlotValue, 3, abnormalColor); } else { if (yValueIn <= pctLow) { vLine(tx[iTarget]+0.4, 0.0+yPlotValue, -yPlotValue, 3, abnormalColor); } else { /* normal range */ if ((yValueIn - avg[iTarget]) >= 0.0) { vLine(tx[iTarget]+0.4, 0.0, yPlotValue, 2, normalColor); } else { vLine(tx[iTarget]+0.4, 0.0+yPlotValue, -yPlotValue, 2, normalColor); } } } } void markStamp(struct pbStamp *pbStampPtr, struct pbStampPict *stampPictPtr, double xValue, char *valStr, double tx[], double ty[]) /* mark the the stamp with a vertical line */ { int ix, iy; double txmin, tymin, txmax, tymax; double ytop=0.0; int len; int xx, yy; int i, iTarget; len = pbStampPtr->len; txmin = pbStampPtr->xmin; txmax = pbStampPtr->xmax; tymin = pbStampPtr->ymin; tymax = pbStampPtr->ymax; calStampXY(stampPictPtr, txmin+(txmax-txmin)/2.0, tymax, &xx, &yy); vgTextCentered(g_vg, xx-5, yy+3, 10, 10, pbBlue, g_font, valStr); ix = stampPictPtr->xOrig; iy = stampPictPtr->yOrig; calStampXY(stampPictPtr, (txmax-txmin)/2.0, tymax, &xx, &yy); iTarget = -1; for (i=0; i<(len-1); i++) { if ((xValue >= tx[i]) && (xValue <= tx[i+1])) { iTarget = i; } } if (iTarget != -1) { if (ty[iTarget] > 0.1 * (tymax - tymin)) { ytop = ty[iTarget]; } else { ytop = 0.1 * (tymax - tymin) + tymin; } } vLineM(tx[iTarget]+(tx[iTarget+1]-tx[iTarget])/2.0, 0, ytop, 2, pbBlue); } void markStamp0(struct pbStamp *pbStampPtr, struct pbStampPict *stampPictPtr, double xValue, char *valStr, double tx[], double ty[]) /* mark the the stamp with valStr only, used for 'N/A' case only */ { double txmin, tymin, txmax, tymax; int len; int xx, yy; len = pbStampPtr->len; txmin = pbStampPtr->xmin; txmax = pbStampPtr->xmax; tymin = pbStampPtr->ymin; tymax = pbStampPtr->ymax; calStampXY(stampPictPtr, txmin+(txmax-txmin)/2.0, tymax, &xx, &yy); vgTextCentered(g_vg, xx-5, yy+3, 10, 10, pbBlue, g_font, valStr); } struct pbStamp *getStampData(char *stampName) /* get data for a stamp */ { struct sqlConnection *conn2; char query2[256]; struct sqlResult *sr2; char **row2; struct pbStamp *pbStampPtr; int i; conn2= hAllocConn(database); safef(query2, sizeof(query2), "select * from %s.pbStamp where stampName ='%s'", database, stampName); sr2 = sqlMustGetResult(conn2, query2); row2 = sqlNextRow(sr2); pbStampPtr = pbStampLoad(row2); if (row2 == NULL) { errAbort("%s stamp data not found.", stampName); } sqlFreeResult(&sr2); safef(query2, sizeof(query2), "select * from %s.%s;", database, pbStampPtr->stampTable); sr2 = sqlMustGetResult(conn2, query2); row2 = sqlNextRow(sr2); i=0; while (row2 != NULL) { tx[i] = atof(row2[0]); ty[i] = atof(row2[1]); i++; row2 = sqlNextRow(sr2); } sqlFreeResult(&sr2); hFreeConn(&conn2); return(pbStampPtr); } void mapBoxStamp(int x, int y, int width, int height, char *title, char *tagName) { hPrintf("\"Click\n", '\'', title, '\''); } void mapBoxStampTitle(int x, int y, int width, int height, char *title, char *tagName) { hPrintf("\"Click\n", '\'', title, '\''); } void drawPbStamp(struct pbStamp *pbStampPtr, struct pbStampPict *stampPictPtr) /* draw the stamp */ { int ix, iy, iw, ih; char *stampName, *stampTable, *stampTitle, *stampDesc; double txmin, tymin, txmax, tymax; int i, n, index; int xx, yy; char charStr[2]; Color edgeColor; Color stampColor; int titleLen; stampName = cloneString(pbStampPtr->stampName); stampTable = cloneString(pbStampPtr->stampTable); stampTitle = cloneString(pbStampPtr->stampTitle); n = pbStampPtr->len; txmin = pbStampPtr->xmin; txmax = pbStampPtr->xmax; tymin = pbStampPtr->ymin; tymax = pbStampPtr->ymax; stampDesc = cloneString(pbStampPtr->stampDesc); ix = stampPictPtr->xOrig; iy = stampPictPtr->yOrig; iw = stampPictPtr->width; ih = stampPictPtr->height; xScale = (double)(iw)/(txmax - txmin); yScale = (double)(ih)/(tymax - tymin); calStampXY(stampPictPtr, txmin, tymax, &xx, &yy); mapBoxStamp(xx, yy, iw, ih, stampTitle, stampName); calStampXY(stampPictPtr, txmin+(txmax-txmin)/2.0, tymax, &xx, &yy); vgTextCentered(g_vg, xx-5, yy-12, 10, 10, MG_BLACK, g_font, stampTitle); titleLen = strlen(stampTitle); mapBoxStampTitle(xx-5-titleLen*6/2-6, yy-14, titleLen*6+12, 14, stampTitle, stampName); edgeColor = boundaryColor; stampColor = vgFindColorIx(g_vg, 220, 220, 220); for (index=0; index < (n-1); index++) { pbBox(tx[index], tymin, tx[index+1]-tx[index], ty[index], stampColor); hLine(tx[index], ty[index], tx[index+1]-tx[index], 1, edgeColor); } vLine(tx[0], 0, ty[0], 1, edgeColor); for (index=0; index < (n-1); index++) { if (ty[index+1] > ty[index]) { vLine(tx[index+1], ty[index], ty[index+1]-ty[index], 1, edgeColor); } else { vLine(tx[index+1], ty[index+1], ty[index]-ty[index+1], 1, edgeColor); } } hLine(txmin, tymin, txmax-txmin, 2, boundaryColor); /* this line needs to call hLine2 for fine tuning at the right hand side ending */ hLine2(txmin, tymax, txmax-txmin, 2, boundaryColor); vLine(txmin, tymin, tymax-tymin, 2, boundaryColor); vLine(txmax, tymin, tymax-tymin, 2, boundaryColor); if (strcmp(pbStampPtr->stampName, "pepRes") == 0) { for (i=0; i<20; i++) { calStampXY(stampPictPtr, tx[i], tymin, &xx, &yy); safef(charStr, sizeof(charStr), "%c", aaAlphabet[i]); vgTextCentered(g_vg, xx+1, yy+5, 10, 10, MG_BLACK, g_font, charStr); } } } void drawPbStampB(struct pbStamp *pbStampPtr, struct pbStampPict *stampPictPtr) /* draw the stamp, especially for the AA Anomaly */ { int ix, iy, iw, ih; char *stampTable, *stampTitle, *stampDesc; double txmin, tymin, txmax, tymax; int i, n, index; int xx, yy; char charStr[2]; int titleLen; stampTable = cloneString(pbStampPtr->stampTable); stampTitle = cloneString(pbStampPtr->stampTitle); n = pbStampPtr->len; txmin = pbStampPtr->xmin; txmax = pbStampPtr->xmax; tymin = pbStampPtr->ymin; tymax = pbStampPtr->ymax; stampDesc = cloneString(pbStampPtr->stampDesc); ix = stampPictPtr->xOrig; iy = stampPictPtr->yOrig; iw = stampPictPtr->width; ih = stampPictPtr->height; xScale = (double)(iw)/(txmax - txmin); yScale = (double)(ih)/(tymax - tymin); calStampXY(stampPictPtr, txmin, tymax, &xx, &yy); mapBoxStamp(xx, yy, iw, ih, "Amino Acid Anomalies", "pepAnomalies"); calStampXY(stampPictPtr, txmin+(txmax-txmin)/2.0, tymax, &xx, &yy); vgTextCentered(g_vg, xx-5, yy-12, 10, 10, MG_BLACK, g_font, "Amino Acid Anomalies"); titleLen = strlen("Amino Acid Anomoly"); mapBoxStampTitle(xx-5-titleLen*6/2-6, yy-14, titleLen*6+12, 14, "Amino Acid Anomolies", "pepAnomalies"); /* calStampXY(stampPictPtr, txmax-(txmax-txmin)*.25, tymin+(tymax-tymin)/4.0*3.0, &xx, &yy); vgTextCentered(g_vg, xx, yy-10, 10, 10, MG_BLACK, g_font, "+2 stddev"); calStampXY(stampPictPtr, txmax-(txmax-txmin)*.25, tymin+(tymax-tymin)/4.0, &xx, &yy); vgTextCentered(g_vg, xx, yy-10, 10, 10, MG_BLACK, g_font, "-2 stddev"); */ index = 0; hLine(tx[index], (tymax-tymin)/8.0, (tx[index+1]-tx[index])/2.0, 1, MG_GRAY); hLine(tx[index], (tymax-tymin)/4.0, (tx[index+1]-tx[index])/2.0, 1, MG_GRAY); hLine(tx[index], (tymax-tymin)/8.0*3.0, (tx[index+1]-tx[index])/2.0, 1, MG_GRAY); hLine(tx[index], (tymax-tymin)/4.0*3.0, (tx[index+1]-tx[index])/2.0, 1, MG_GRAY); hLine(tx[index], (tymax-tymin)/8.0*4.0, (tx[index+1]-tx[index])/2.0, 1, MG_GRAY); hLine(tx[index], (tymax-tymin)/8.0*5.0, (tx[index+1]-tx[index])/2.0, 1, MG_GRAY); hLine(tx[index], (tymax-tymin)/8.0*7.0, (tx[index+1]-tx[index])/2.0, 1, MG_GRAY); for (index=0; index < (n-1); index++) { hLine(tx[index], (tymax-tymin)/2.0, tx[index+1]-tx[index], 1, MG_BLACK); } vLine(tx[0], 0, ty[0], 1, pbBlue); hLine(txmin, tymin, txmax-txmin, 2, boundaryColor); /* this line needs to call hLine2 for fine tuning at the right hand side ending */ hLine2(txmin, tymax, txmax-txmin, 2, boundaryColor); vLine(txmin, tymin, tymax-tymin, 2, boundaryColor); vLine(txmax, tymin, tymax-tymin, 2, boundaryColor); if (strcmp(pbStampPtr->stampName, "pepRes") == 0) { for (i=0; i<20; i++) { calStampXY(stampPictPtr, tx[i], tymin, &xx, &yy); safef(charStr, sizeof(charStr), "%c", aaAlphabet[i]); vgTextCentered(g_vg, xx+1, yy+5, 10, 10, MG_BLACK, g_font, charStr); } } } void doStamps(char *proteinID, char *mrnaID, char *aa, struct vGfx *vg, int *yOffp) /* draw proteome browser stamps */ { int i,j,l; char cond_str[200]; char *valStr; char valStr2[50]; char *answer; double pI=0.0; double exonCount; char *chp; int len; int cCnt; int xPosition; int yPosition; int stampWidth, stampHeight; int aaResCnt[30]; double aaResFreqDouble[30]; int aaResFound; int totalResCnt; double molWeight=0.0; double hydroSum; struct pbStamp *stampDataPtr; for (j=0; j<23; j++) { aaResCnt[j] = 0; } l=len = strlen(aa); chp = aa; for (i=0; i= 6) yPosition = yPosition + 20; boundaryColor = vgFindColorIx(g_vg, 170, 170, 170); /* draw pI stamp */ safef(cond_str, sizeof(cond_str), "accession='%s'", proteinID); answer = sqlGetField(database, "pepPi", "count(*)", cond_str); /* either 0 or multiple rows are not valid */ if (strcmp(answer, "1") == 0) { answer = sqlGetField(database, "pepPi", "pI", cond_str); pI = (double)atof(answer); stampDataPtr = getStampData("pepPi"); setPbStampPict(stampPictPtr, stampDataPtr, xPosition, yPosition, stampWidth, stampHeight); drawPbStamp(stampDataPtr, stampPictPtr); drawXScaleNonInt(stampDataPtr, stampPictPtr, 2); safef(valStr2, sizeof(valStr2), "%.1f", pI); markStamp(stampDataPtr, stampPictPtr, pI, valStr2, tx, ty); pbStampFree(&stampDataPtr); } else { stampDataPtr = getStampData("pepPi"); setPbStampPict(stampPictPtr, stampDataPtr, xPosition, yPosition, stampWidth, stampHeight); drawPbStamp(stampDataPtr, stampPictPtr); drawXScale(stampDataPtr, stampPictPtr, 2); safef(valStr2, sizeof(valStr2), "N/A"); markStamp0(stampDataPtr, stampPictPtr, pI, valStr2, tx, ty); pbStampFree(&stampDataPtr); } /* skip Mol Wt, if it is GSID */ if (!hIsGsidServer()) { /* draw Mol Wt stamp */ safef(cond_str, sizeof(cond_str), "accession='%s'", proteinID); answer = sqlGetField(database, "pepMwAa", "MolWeight", cond_str); if (answer != NULL) { safef(valStr2, sizeof(valStr2), "%s Da", answer); molWeight = (double)atof(answer); stampDataPtr = getStampData("pepMolWt"); xPosition = xPosition + stampWidth + stampWidth/8; setPbStampPict(stampPictPtr, stampDataPtr, xPosition, yPosition, stampWidth, stampHeight); drawPbStamp(stampDataPtr, stampPictPtr); drawXScaleMW(stampDataPtr, stampPictPtr, 50000); markStamp(stampDataPtr, stampPictPtr, molWeight, valStr2, tx, ty); pbStampFree(&stampDataPtr); } else { safef(valStr2, sizeof(valStr2), "N/A"); stampDataPtr = getStampData("pepMolWt"); xPosition = xPosition + stampWidth + stampWidth/8; setPbStampPict(stampPictPtr, stampDataPtr, xPosition, yPosition, stampWidth, stampHeight); drawPbStamp(stampDataPtr, stampPictPtr); drawXScaleMW(stampDataPtr, stampPictPtr, 50000); markStamp0(stampDataPtr, stampPictPtr, molWeight, valStr2, tx, ty); pbStampFree(&stampDataPtr); } } if (!proteinInSupportedGenome) { if (!hIsGsidServer()) xPosition = xPosition + stampWidth + stampWidth/8; goto skip_exon; } /* draw exon count stamp */ if (kgVersion == KG_III) { safef(cond_str, sizeof(cond_str), "qName='%s'", mrnaID); } else { safef(cond_str, sizeof(cond_str), "qName='%s'", proteinID); } answer = sqlGetField(database, kgProtMapTableName, "blockCount", cond_str); if (answer != NULL) { valStr = cloneString(answer); exonCount = (double)atoi(answer); stampDataPtr = getStampData("exonCnt"); xPosition = xPosition + stampWidth + stampWidth/8; setPbStampPict(stampPictPtr, stampDataPtr, xPosition, yPosition, stampWidth, stampHeight); drawPbStamp(stampDataPtr, stampPictPtr); drawXScale(stampDataPtr, stampPictPtr, 5); markStamp(stampDataPtr, stampPictPtr, exonCount, valStr, tx, ty); pbStampFree(&stampDataPtr); } skip_exon: if (!hIsGsidServer()) { /* draw AA residual anomolies stamp */ if (answer != NULL) { stampDataPtr = getStampData("pepRes"); xPosition = xPosition + stampWidth + stampWidth/8; setPbStampPict(stampPictPtr, stampDataPtr, xPosition, yPosition, 3*stampWidth/2, stampHeight); drawPbStamp(stampDataPtr, stampPictPtr); for (i=0; i<20; i++) { markResStamp(aaAlphabet[i], stampDataPtr, stampPictPtr, i, aaResFreqDouble[i], tx, ty, avg, stddev); } pbStampFree(&stampDataPtr); } xPosition = 15; yPosition = yPosition + 170; } /* skip swInterPro if it is GSID */ if (!hIsGsidServer()) { /* draw family size stamp */ safef(cond_str, sizeof(cond_str), "accession='%s'", proteinID); answer = sqlGetField(protDbName, "swInterPro", "count(*)", cond_str); if (answer != NULL) { valStr = cloneString(answer); stampDataPtr = getStampData("intPCnt"); setPbStampPict(stampPictPtr, stampDataPtr, xPosition, yPosition, stampWidth, stampHeight); drawPbStamp(stampDataPtr, stampPictPtr); drawXScale(stampDataPtr, stampPictPtr, 1); markStamp(stampDataPtr, stampPictPtr, (double)(atoi(answer)), valStr, tx, ty); pbStampFree(&stampDataPtr); } else { valStr = cloneString("N/A"); stampDataPtr = getStampData("intPCnt"); setPbStampPict(stampPictPtr, stampDataPtr, xPosition, yPosition, stampWidth, stampHeight); drawPbStamp(stampDataPtr, stampPictPtr); drawXScale(stampDataPtr, stampPictPtr, 1); markStamp0(stampDataPtr, stampPictPtr, (double)(atoi(answer)), valStr, tx, ty); pbStampFree(&stampDataPtr); } } /* draw hydrophobicity stamp */ chp = protSeq; hydroSum = 0; for (i=0; iymin = -4.0; stampDataPtr->ymax = 4.0; for (i=0; i<20; i++) { markResStdvStamp(stampDataPtr, stampPictPtr, i, aaResFreqDouble[i], tx, ty, avg, stddev); } /* draw background after bars drawn so that "... stddev" labels do not get covered by bars */ stampDataPtr = getStampData("pepRes"); setPbStampPict(stampPictPtr, stampDataPtr, xPosition, yPosition, 3*stampWidth/2, stampHeight); drawPbStampB(stampDataPtr, stampPictPtr); pbStampFree(&stampDataPtr); } /* The follwing section was used to plot freq distribution for each AA so that we can view than to decide on whether +/- 2 stddev is applicable and what cutoff thresholds to use. Keep it here for possible future reuse. */ /* vertLabel = cloneString("Frequency"); for (i=strlen(vertLabel)-1; i>=0; i--) { vertLabel[i+1] = '\0'; vgTextCentered(g_vg, 3, 45+i*10, 10, 10, MG_BLACK, g_font, vertLabel+i); vgTextCentered(g_vg, 3, 215+i*10, 10, 10, MG_BLACK, g_font, vertLabel+i); } xPosition = xPosition + 80; for (j=0; j<20; j++) { safef(tempStr, sizeof(tempStr), "%c", aaAlphabet[j]); stampDataPtr = getStampData(tempStr); xPosition = xPosition + stampWidth + stampWidth/8; setPbStampPict(stampPictPtr, stampDataPtr, xPosition, yPosition, stampWidth, stampHeight); drawPbStamp(stampDataPtr, stampPictPtr); drawXScale(stampDataPtr, stampPictPtr, 10); safef(valStr2, sizeof(valStr2), "%c", aaAlphabet[j]); markStamp(stampDataPtr, stampPictPtr, 0.0, valStr2, tx, ty); pbStampFree(&stampDataPtr); } */ }