void pbStampFreeList(struct pbStamp **pList) /* Free a list of dynamically allocated pbStamp's */ { struct pbStamp *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; pbStampFree(&el); } *pList = NULL; }
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<l; i++) { aaResFound = 0; for (j=0; j<23; j++) { if (*chp == aaAlphabet[j]) { aaResFound = 1; aaResCnt[j] ++; } } chp++; } totalResCnt = 0; for (i=0; i<23; i++) { totalResCnt = totalResCnt + aaResCnt[i]; } for (i=0; i<20; i++) { aaResFreqDouble[i] = ((double)aaResCnt[i])/((double)totalResCnt); } AllocVar(stampPictPtr); stampWidth = 75*(1+pbScale/3); stampHeight = 60*(1+pbScale/3); xPosition = 15; yPosition = *yOffp + 135; if (pbScale >= 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; i<protSeqLen; i++) { hydroSum = hydroSum + aa_hydro[(int)(*chp)]; chp++; } stampDataPtr = getStampData("hydro"); xPosition = xPosition + stampWidth + stampWidth/8; setPbStampPict(stampPictPtr, stampDataPtr, xPosition, yPosition, stampWidth, stampHeight); drawPbStamp(stampDataPtr, stampPictPtr); drawXScaleHydro(stampDataPtr, stampPictPtr, 1.0); safef(valStr2, sizeof(valStr2), "%.1f", hydroSum/(double)len); markStamp(stampDataPtr, stampPictPtr, hydroSum/(double)len, valStr2, tx, ty); pbStampFree(&stampDataPtr); /* draw Cystein Count stamp */ chp = protSeq; cCnt = 0; for (i=0; i<len; i++) { if (*chp == 'C') cCnt ++; chp++; } stampDataPtr = getStampData("cCnt"); xPosition = xPosition + stampWidth + stampWidth/8; setPbStampPict(stampPictPtr, stampDataPtr, xPosition, yPosition, stampWidth, stampHeight); drawPbStamp(stampDataPtr, stampPictPtr); drawXScale(stampDataPtr, stampPictPtr, 10); safef(valStr2, sizeof(valStr2), "%d", cCnt); markStamp(stampDataPtr, stampPictPtr, (double)cCnt, valStr2, tx, ty); pbStampFree(&stampDataPtr); /* if it is GSID, draw AA residual anomolies here */ if (hIsGsidServer()) { xPosition = 15; yPosition = yPosition + 170; /* draw AA residual anomolies stamp */ if (answer != NULL) { stampDataPtr = getStampData("pepRes"); 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); } } /* draw AA residual anomolies stddev stamp */ if (answer != NULL) { exonCount = (double)atof(answer); stampDataPtr = getStampData("pepRes"); if (hIsGsidServer()) { xPosition = xPosition + stampWidth*1.62 + stampWidth/8; } else { xPosition = xPosition + stampWidth + stampWidth/8; } setPbStampPict(stampPictPtr, stampDataPtr, xPosition, yPosition, 3*stampWidth/2, stampHeight); stampDataPtr->ymin = -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); } */ }