void doExon(int exonCount, char *chrom, int aaLen, int *yOffp, char *proteinID, char *mrnaID) /* draw the track for exons */ { int xx, yy; int j; char exonNumStr[10]; int mrnaLen; Color color; int exonStartPos, exonEndPos; int exonGenomeStartPos, exonGenomeEndPos; int exonNumber; int printedExonNumber = -1; Color exonColor[2]; Color defaultColor; defaultColor = vgFindColorIx(g_vg, 170, 170, 170); /* The hypothetical mRNA length is 3 times of aaLen */ mrnaLen = aaLen * 3; exonColor[0] = pbBlue; exonColor[1] = vgFindColorIx(g_vg, 0, 180, 0); exonNumber = 1; exonStartPos = blockStartPositive[exonNumber-1]; exonEndPos = blockEndPositive[exonNumber-1]; exonGenomeStartPos = blockGenomeStartPositive[exonNumber-1]; exonGenomeEndPos = blockGenomeEndPositive[exonNumber-1]; currentYoffset = *yOffp; for (j = 0; j < mrnaLen; j++) { color = defaultColor; calxy(j/3, *yOffp, &xx, &yy); if (j > exonEndPos) { if (printedExonNumber != exonNumber) { if ((exonEndPos - exonStartPos)*pbScale/3 > 12) { safef(exonNumStr, sizeof(exonNumStr), "%d", exonNumber); vgTextRight(g_vg, xx-(exonEndPos - exonStartPos)*pbScale/3/2 - 4, yy-9, 10, 10, MG_WHITE, g_font, exonNumStr); } mapBoxExon(xx - (exonEndPos - exonStartPos)*pbScale/3, yy-9, (exonEndPos - exonStartPos)*pbScale/3, 9, mrnaID, exonNumber, chrom, blockGenomeStartPositive[exonNumber-1], blockGenomeEndPositive[exonNumber-1]); printedExonNumber = exonNumber; } if (exonNumber < exonCount) { exonNumber++; exonStartPos = blockStartPositive[exonNumber-1]; exonEndPos = blockEndPositive[exonNumber-1]; exonGenomeStartPos = blockGenomeStartPositive[exonNumber-1]; exonGenomeEndPos = blockGenomeEndPositive[exonNumber-1]; } } if ((j >= exonStartPos) && (j <= exonEndPos)) { color = exonColor[(exonNumber-1) % 2]; } vgBox(g_vg, xx, yy-9+3*(j-(j/3)*3), pbScale, 3, color); } if ((exonEndPos - exonStartPos)*pbScale/3 > 12) { safef(exonNumStr, sizeof(exonNumStr), "%d", exonNumber); vgTextRight(g_vg, xx-(exonEndPos - exonStartPos)*pbScale/3/2 - 5, yy-9, 10, 10, MG_WHITE, g_font, exonNumStr); } mapBoxExon(xx - (exonEndPos - exonStartPos)*pbScale/3, yy-9, (exonEndPos - exonStartPos)*pbScale/3, 9, mrnaID, exonNumber, chrom, blockGenomeStartPositive[exonNumber-1], blockGenomeEndPositive[exonNumber-1]); calxy0(0, *yOffp, &xx, &yy); vgBox(g_vg, 0, yy-10, xx, 12, bkgColor); trackTitle = cloneString("Exons"); vgTextRight(g_vg, xx-25, yy-9, 10, 10, MG_BLACK, g_font, trackTitle); trackTitleLen = strlen(trackTitle); mapBoxTrackTitle(xx-25-trackTitleLen*6, yy-12, trackTitleLen*6+12, 14, trackTitle, "exon"); *yOffp = *yOffp + 10; }
void makeActiveImagePB(char *psOutput, char *psOutput2) /* Make image and image map. */ { char *mapName = "map"; int pixWidth, pixHeight; char *answer; char cond_str[255]; struct sqlConnection *conn; struct sqlConnection *connCentral; char query[256]; struct sqlResult *sr; char **row; int iypos; char *blatGbDb; char *sciName, *commonName; char *spDisplayId; char *oldDisplayId; conn = sqlConnect(UNIPROT_DB_NAME); hPrintf("<br><font size=4>Protein "); hPrintf("<A HREF=\"http://www.uniprot.org/uniprot/%s\" TARGET=_blank><B>%s</B></A>\n", proteinID, proteinID); spDisplayId = spAccToId(conn, spFindAcc(conn, proteinID)); if (strstr(spDisplayId, spFindAcc(conn, proteinID)) == NULL) { hPrintf(" (aka %s", spDisplayId); /* show once if the new and old displayId are the same */ oldDisplayId = oldSpDisplayId(spDisplayId); if (oldDisplayId != NULL) { if (!sameWord(spDisplayId, oldDisplayId)) { hPrintf(" or %s", oldSpDisplayId(spDisplayId)); } } hPrintf(")\n"); } hPrintf(" %s\n", description); hPrintf("</font><br>"); hPrintf("Organism: "); /* get scientific and Genbank common name of this organism */ sciName = NULL; commonName = NULL; sqlSafefFrag(cond_str, sizeof(cond_str),"accession='%s'", proteinID); answer = sqlGetField(PROTEOME_DB_NAME, "spXref3", "division", cond_str); if (answer != NULL) { sqlSafefFrag(cond_str, sizeof(cond_str), "id=%s and nameType='scientific name'", answer); sciName = sqlGetField(PROTEOME_DB_NAME, "taxonNames", "name", cond_str); sqlSafefFrag(cond_str, sizeof(cond_str), "id=%s and nameType='genbank common name'", answer); commonName = sqlGetField(PROTEOME_DB_NAME, "taxonNames", "name", cond_str); } if (sciName != NULL) { hPrintf("%s", sciName); } if (commonName != NULL) { hPrintf(" (%s)", commonName); } hPrintf("<br>"); protSeq = getAA(proteinID); if (protSeq == NULL) { hUserAbort("%s is not a current valid entry in UniProtKB\n", proteinID); } protSeqLen = strlen(protSeq); fflush(stdout); iypos = 15; doTracks(proteinID, mrnaID, protSeq, &iypos, psOutput); if (!hTableExists(database, "pbStamp")) goto histDone; pbScale = 3; pixWidth = 765; insideWidth = pixWidth-gfxBorder; pixHeight = 350; if (psOutput2) { vg2 = vgOpenPostScript(pixWidth, pixHeight, psOutput2); } else { trashDirFile(&gifTn2, "pbt", "pbt", ".png"); vg2 = vgOpenPng(pixWidth, pixHeight, gifTn2.forCgi, FALSE); } g_vg = vg2; pbRed = vgFindColorIx(vg2, 0xf9, 0x51, 0x59); pbBlue = vgFindColorIx(g_vg, 0x00, 0x00, 0xd0); normalColor = pbBlue; abnormalColor = pbRed; bkgColor = vgFindColorIx(vg2, 255, 254, 232); vgBox(vg2, 0, 0, insideWidth, pixHeight, bkgColor); /* Start up client side map. */ mapName=cloneString("pbStamps"); hPrintf("\n<MAP Name=%s>\n", mapName); vgSetClip(vg2, 0, gfxBorder, insideWidth, pixHeight - 2*gfxBorder); iypos = 15; /* Draw stamps. */ doStamps(proteinID, mrnaID, protSeq, vg2, &iypos); /* Finish map. */ hPrintf("</MAP>\n"); /* Save out picture and tell html file about it. */ vgClose(&vg2); hPrintf("<P>"); hPrintf("\n<IMG SRC=\"%s\" BORDER=1 WIDTH=%d HEIGHT=%d USEMAP=#%s><BR>", gifTn2.forCgi, pixWidth, pixHeight, mapName); if (proteinInSupportedGenome) { hPrintf("\n<A HREF=\"../goldenPath/help/pbTracksHelpFiles/pbTracksHelp.shtml#histograms\" TARGET=_blank>"); } else { hPrintf("\n<A HREF=\"../goldenPath/help/pbTracksHelpFiles/pbTracksHelp.shtml#histograms\" TARGET=_blank>"); } hPrintf("Explanation of Protein Property Histograms</A><BR>"); hPrintf("<P>"); histDone: hPrintf("<P>"); fflush(stdout); /* See if a UCSC Genome Browser exist for this organism. If so, display BLAT link. */ connCentral = hConnectCentral(); sqlSafef(query, sizeof(query), "select defaultDb.name from dbDb, defaultDb where dbDb.scientificName='%s' and dbDb.name=defaultDb.name", sciName); sr = sqlGetResult(connCentral, query); row = sqlNextRow(sr); if (row != NULL) { blatGbDb = strdup(row[0]); } else { blatGbDb = NULL; } sqlFreeResult(&sr); hDisconnectCentral(&connCentral); if (proteinInSupportedGenome || (blatGbDb != NULL)) { hPrintf("\n<B>UCSC Links:</B><BR>\n "); hPrintf("<UL>\n"); /* Show GB links only if the protein belongs to a supported genome */ if (proteinInSupportedGenome) { doGenomeBrowserLink(proteinID, mrnaID, hgsidStr); doGeneDetailsLink(proteinID, mrnaID, hgsidStr); } /* Show Gene Sorter link only if it is valid for this genome */ if (hgNearOk(database)) { doGeneSorterLink(protDisplayID, mrnaID, hgsidStr); } /* Show BLAT link if we have UCSC Genome Browser for it */ if (blatGbDb != NULL) { doBlatLink(blatGbDb, sciName, commonName, protSeq); } hPrintf("</UL><P>"); } /* This section shows various types of domains */ conn = sqlConnect(UNIPROT_DB_NAME); domainsPrint(conn, proteinID); hPrintf("<P>"); /* Do Pathway section only if the protein belongs to a supported genome */ if (proteinInSupportedGenome); { doPathwayLinks(proteinID, mrnaID); } printFASTA(proteinID, protSeq); }
void doTracks(char *proteinID, char *mrnaID, char *aa, int *yOffp, char *psOutput) /* draw various protein tracks */ { int l; char aaOrigOffsetStr[20]; int hasResFreq; char uniProtDbName[50]; char *protDbDate; char *chrom; char strand; char *kgId, *kgPep, *protPep; char cond_str[255]; char *answer; //int i, ll; //char *chp1, *chp2; g_font = mgSmallFont(); safef(pbScaleStr, sizeof(pbScaleStr), "%d", pbScale); if (psOutput != NULL) { pbScale = atoi(cartOptionalString(cart, "pbt.pbScaleStr")); } if (cgiOptionalString("trackOffset") != NULL) { trackOrigOffset = atoi(cgiOptionalString("trackOffset")); } if (cgiOptionalString("pbScaleStr") != NULL) { pbScale = atoi(cgiOptionalString("pbScaleStr")); } if (cgiOptionalString("pbScale") != NULL) { scaleButtonPushed = TRUE; if (strcmp(cgiOptionalString("pbScale"), "1/6") == 0) pbScale = 1; if (strcmp(cgiOptionalString("pbScale"), "1/2") == 0) pbScale = 3; if (strcmp(cgiOptionalString("pbScale"), "FULL") == 0) pbScale = 6; if (strcmp(cgiOptionalString("pbScale"), "DNA") == 0) pbScale =22; safef(pbScaleStr, sizeof(pbScaleStr), "%d", pbScale); cgiMakeHiddenVar("pbScaleStr", pbScaleStr); } else { scaleButtonPushed = FALSE; } if (psOutput == NULL) { if (cgiVarExists("pbt.left3")) { relativeScroll(-0.95); initialWindow = FALSE; } else if (cgiVarExists("pbt.left2")) { relativeScroll(-0.475); initialWindow = FALSE; } else if (cgiVarExists("pbt.left1")) { relativeScroll(-0.02); initialWindow = FALSE; } else if (cgiVarExists("pbt.right1")) { relativeScroll(0.02); initialWindow = FALSE; } else if (cgiVarExists("pbt.right2")) { relativeScroll(0.475); initialWindow = FALSE; } else if (cgiVarExists("pbt.right3")) { relativeScroll(0.95); initialWindow = FALSE; } } dnaUtilOpen(); l=strlen(aa); /* initialize AA properties */ aaPropertyInit(&hasResFreq); sfCount = getSuperfamilies2(proteinID); if (sfCount == 0) { sfCount = getSuperfamilies(proteinID); } if (mrnaID != NULL) { if (kgVersion == KG_III) { doExonTrack = FALSE; sqlSafefFrag(cond_str, sizeof(cond_str), "spId='%s'", proteinID); kgId = sqlGetField(database, "kgXref", "kgId", cond_str); if (kgId != NULL) { sqlSafefFrag(cond_str, sizeof(cond_str), "name='%s'", kgId); kgPep = sqlGetField(database, "knownGenePep", "seq", cond_str); //printf("<pre><br>%s", kgPep);fflush(stdout); if (kgPep != NULL) { if (strstr(protDbName, "proteins") != NULL) { protDbDate = strstr(protDbName, "proteins") + strlen("proteins"); safef(uniProtDbName, sizeof(uniProtDbName),"sp%s", protDbDate); sqlSafefFrag(cond_str, sizeof(cond_str), "acc='%s'", proteinID); protPep = sqlGetField(uniProtDbName, "protein", "val", cond_str); //printf("<br>%s\n", protPep);fflush(stdout); if (protPep != NULL) { if (sameWord(kgPep, protPep)) { //printf("<br>MATCH!\n");fflush(stdout); sqlSafefFrag(cond_str, sizeof(cond_str), "qName='%s'", kgId); answer = sqlGetField(database, kgProtMapTableName, "qName", cond_str); if (answer != NULL) { /* NOTE: passing in kgId instead of proteinID because kgProtMap2's qName uses kgId instead of protein display ID */ getExonInfo(kgId, &exCount, &chrom, &strand); assert(exCount > 0); doExonTrack = TRUE; } } /* else { chp1 = kgPep; printf("<br>"); chp2 = protPep; ll = strlen(kgPep); if (strlen(protPep) < ll) ll= strlen(protPep); for (i=0; i<ll; i++) { if (*chp1 != *chp2) { printf("%c", *chp1); } else { printf("."); } chp1++; chp2++; } } //printf("</pre>");fflush(stdout); */ } } } } } else { doExonTrack = TRUE; getExonInfo(proteinID, &exCount, &chrom, &strand); assert(exCount > 0); } /* do the following only if pbTracks called doTracks() */ if (initialWindow && IAmPbTracks) { prevGBOffsetSav = calPrevGB(exCount, chrom, strand, l, yOffp, proteinID, mrnaID); trackOrigOffset = prevGBOffsetSav; if (trackOrigOffset > (protSeqLen*pbScale - 600)) trackOrigOffset = protSeqLen*pbScale - 600; /* prevent negative value */ if (trackOrigOffset < 0) trackOrigOffset = 0; } /* if this if for PDF/Postscript, the trackOrigOffset is already calculated previously, use the saved value */ if (psOutput != NULL) { trackOrigOffset = atoi(cartOptionalString(cart, "pbt.trackOffset")); } } /*printf("<br>%d %d<br>%d %d\n", prevGBStartPos, prevGBEndPos, blockGenomeStartPositive[exCount-1], blockGenomeStartPositive[0]); fflush(stdout); */ if (strand == '-') { if ((prevGBStartPos <= blockGenomeStartPositive[exCount-1]) && (prevGBEndPos >= blockGenomeStartPositive[0])) { showPrevGBPos = FALSE; } } else { if ((prevGBStartPos <= blockGenomeStartPositive[0]) && (prevGBEndPos >= blockGenomeStartPositive[exCount-1])) { showPrevGBPos = FALSE; } } if ((cgiOptionalString("aaOrigOffset") != NULL) && scaleButtonPushed) { trackOrigOffset = atoi(cgiOptionalString("aaOrigOffset"))*pbScale; } pixWidth = 160+ protSeqLen*pbScale; if (pixWidth > MAX_PB_PIXWIDTH) { pixWidth = MAX_PB_PIXWIDTH; } if ((protSeqLen*pbScale - trackOrigOffset) < MAX_PB_PIXWIDTH) { pixWidth = protSeqLen*pbScale - trackOrigOffset + 160; } if (pixWidth < 550) pixWidth = 550; insideWidth = pixWidth-gfxBorder; if (proteinInSupportedGenome) { pixHeight = 250; } else { pixHeight = 215; } if (sfCount > 0) pixHeight = pixHeight + 20; /* make room for individual residues display */ if (pbScale >=6) pixHeight = pixHeight + 20; if (pbScale >=18) pixHeight = pixHeight + 30; if (psOutput) { vg = vgOpenPostScript(pixWidth, pixHeight, psOutput); suppressHtml = TRUE; hideControls = TRUE; } else { trashDirFile(&gifTn, "pbt", "pbt", ".png"); vg = vgOpenPng(pixWidth, pixHeight, gifTn.forCgi, FALSE); } /* Put up horizontal scroll controls. */ hWrites("Move "); hButton("pbt.left3", "<<<"); hButton("pbt.left2", " <<"); hButton("pbt.left1", " < "); hButton("pbt.right1", " > "); hButton("pbt.right2", ">> "); hButton("pbt.right3", ">>>"); hPrintf("     "); /* Put up scaling controls. */ hPrintf("Current scale: "); if (pbScale == 1) hPrintf("1/6 "); if (pbScale == 3) hPrintf("1/2 "); if (pbScale == 6) hPrintf("FULL "); if (pbScale == 22) hPrintf("DNA "); hPrintf("    Rescale to "); hPrintf("<INPUT TYPE=SUBMIT NAME=\"pbScale\" VALUE=\"1/6\">\n"); hPrintf("<INPUT TYPE=SUBMIT NAME=\"pbScale\" VALUE=\"1/2\">\n"); hPrintf("<INPUT TYPE=SUBMIT NAME=\"pbScale\" VALUE=\"FULL\">\n"); if (kgVersion == KG_III) { /* for KG III, the protein has to exist in the kgProtMap2 table (which will turn on doExonTrack flag) to provide the genomic position data needed for DNA sequence display */ if ((proteinInSupportedGenome) && (doExonTrack)) hPrintf("<INPUT TYPE=SUBMIT NAME=\"pbScale\" VALUE=\"DNA\">\n"); } else { if (proteinInSupportedGenome) hPrintf("<INPUT TYPE=SUBMIT NAME=\"pbScale\" VALUE=\"DNA\">\n"); } hPrintf("<FONT SIZE=1><BR><BR></FONT>\n"); g_vg = vg; pbRed = vgFindColorIx(g_vg, 0xf9, 0x51, 0x59); pbBlue = vgFindColorIx(g_vg, 0x00, 0x00, 0xd0); bkgColor = vgFindColorIx(vg, 255, 254, 232); vgBox(vg, 0, 0, insideWidth, pixHeight, bkgColor); /* Start up client side map. */ hPrintf("<MAP Name=%s>\n", mapName); vgSetClip(vg, 0, gfxBorder, insideWidth, pixHeight - 2*gfxBorder); /* start drawing indivisual tracks */ doAAScale(l, yOffp, 1); if (pbScale >= 6) doResidues(aa, l, yOffp); if (pbScale >= 18) doDnaTrack(chrom, strand, exCount, l, yOffp); if ((mrnaID != NULL) && showPrevGBPos) { doPrevGB(exCount, chrom, strand, l, yOffp, proteinID, mrnaID); } if (mrnaID != NULL) { if (doExonTrack) doExon(exCount, chrom, l, yOffp, proteinID, mrnaID); } doCharge(aa, l, yOffp); doHydrophobicity(aa, l, yOffp); doCysteines(aa, l, yOffp); if (sfCount > 0) doSuperfamily(ensPepName, sfCount, yOffp); if (hasResFreq) doAnomalies(aa, l, yOffp); doAAScale(l, yOffp, -1); vgClose(&vg); /* Finish map and save out picture and tell html file about it. */ hPrintf("</MAP>\n"); /* put tracks image here */ hPrintf( "\n<IMG SRC=\"%s\" BORDER=1 WIDTH=%d HEIGHT=%d USEMAP=#%s><BR>", gifTn.forCgi, pixWidth, pixHeight, mapName); if (proteinInSupportedGenome) { hPrintf("<A HREF=\"../goldenPath/help/pbTracksHelpFiles/pbTracksHelp.shtml#tracks\" TARGET=_blank>"); } else { if (hIsGsidServer()) { hPrintf("<A HREF=\"../goldenPath/help/pbTracksHelpFiles/pbGsid/pbTracksHelp.shtml#tracks\" TARGET=_blank>"); } else { hPrintf("<A HREF=\"../goldenPath/help/pbTracksHelpFiles/pbTracksHelp.shtml#tracks\" TARGET=_blank>"); } } hPrintf("Explanation of Protein Tracks</A><br>"); safef(trackOffset, sizeof(trackOffset), "%d", trackOrigOffset); cgiMakeHiddenVar("trackOffset", trackOffset); /* remember where the AA base origin is so that it can be passed to next PB page */ aaOrigOffset = trackOrigOffset/pbScale; safef(aaOrigOffsetStr, sizeof(aaOrigOffsetStr), "%d", aaOrigOffset); cgiMakeHiddenVar("aaOrigOffset", aaOrigOffsetStr); /* save the following state variables, to be used by PDF/Postcript processing */ cartSetString(cart,"pbt.pbScaleStr", pbScaleStr); cartSetString(cart,"pbt.trackOffset", trackOffset); cartSaveSession(cart); fflush(stdout); }
void doPrevGB(int exonCount, char *chrom, char strand, int aaLen, int *yOffp, char *proteinID, char *mrnaID) /* draw the previous Genome Browser position range */ { int xx, yy, xx0; int i, j; char prevPosMessage[300]; char exonNumStr[10]; int mrnaLen; Color color; int exonStartPos, exonEndPos; int exonGenomeStartPos, exonGenomeEndPos; int exonNumber; int printedExonNumber = -1; Color exonColor[2]; int currentPos; int jPrevStart, jPrevEnd; int jcnt = 0; int iPrevExon = -1; int jPrevExonPos = 0; Color defaultColor; defaultColor = vgFindColorIx(g_vg, 170, 170, 170); /* The imaginary mRNA length is 3 times of aaLen */ mrnaLen = aaLen * 3; exonColor[0] = pbBlue; exonColor[1] = vgFindColorIx(g_vg, 0, 180, 0); jPrevStart = mrnaLen-1; jPrevEnd = 0; exonNumber = 1; exonStartPos = blockStartPositive[exonNumber-1]; exonEndPos = blockEndPositive[exonNumber-1]; exonGenomeStartPos = blockGenomeStartPositive[exonNumber-1]; exonGenomeEndPos = blockGenomeEndPositive[exonNumber-1]; currentYoffset = *yOffp; if (strand == '-') { for (i=0; i<(exonCount-2); i++) { if ((prevGBStartPos < blockGenomeStartPositive[i]) && (prevGBStartPos > blockGenomeEndPositive[i+1]) ) { iPrevExon = i; jPrevExonPos = blockStartPositive[i+1]; /*printf("<br>*%d %d %d %d\n",i,blockGenomeEndPositive[i], */ /*prevGBStartPos, blockGenomeStartPositive[i]);fflush(stdout); */ } } /* handle special cases at both ends when previous GB position is outside CDS */ if (prevGBStartPos < blockGenomeStartPositive[exonCount-1]) jPrevExonPos = blockEndPositive[exonCount-1] + 3; if (prevGBEndPos > blockGenomeStartPositive[0]) jPrevExonPos = blockStartPositive[0]; } else { for (i=0; i<(exonCount-1); i++) { if ((prevGBStartPos > blockGenomeEndPositive[i]) && (prevGBStartPos < blockGenomeStartPositive[i+1]) ) { iPrevExon = i; jPrevExonPos = blockEndPositive[i]; } } /* handle special cases at both ends when previous GB position is outside CDS */ if (prevGBStartPos < blockGenomeStartPositive[0]) jPrevExonPos = blockStartPositive[0]; if (prevGBEndPos > blockGenomeEndPositive[exonCount-1]) jPrevExonPos = blockEndPositive[exonCount-1]; } for (j = 0; j < mrnaLen; j++) { color = defaultColor; calxy(j/3, *yOffp, &xx, &yy); if (j > exonEndPos) { if (printedExonNumber != exonNumber) { if ((exonEndPos - exonStartPos)*pbScale/3 > 12) { safef(exonNumStr, sizeof(exonNumStr), "%d", exonNumber); } printedExonNumber = exonNumber; } if (exonNumber < exonCount) { exonNumber++; exonStartPos = blockStartPositive[exonNumber-1]; exonEndPos = blockEndPositive[exonNumber-1]; exonGenomeStartPos = blockGenomeStartPositive[exonNumber-1]; exonGenomeEndPos = blockGenomeEndPositive[exonNumber-1]; } } if ((j >= exonStartPos) && (j <= exonEndPos)) { color = exonColor[(exonNumber-1) % 2]; } if (strand == '-') { currentPos = blockGenomeStartPositive[exonNumber-1] + (blockEndPositive[exonNumber-1]-j)+1; } else { currentPos = blockGenomeStartPositive[exonNumber-1]+(j - blockStartPositive[exonNumber-1])+1; } if ((currentPos >= prevGBStartPos) && (currentPos <= prevGBEndPos)) { jcnt++; if (j < jPrevStart) jPrevStart = j; if (j > jPrevEnd) jPrevEnd = j; } } positionStr = cloneString(cartOptionalString(cart, "position")); if (jcnt > 0) { calxy(jPrevStart/3, *yOffp, &xx, &yy); if (pbScale > 6) { vgBox(g_vg, xx+(jPrevStart%3)*6, yy-2, (jPrevEnd-jPrevStart+1)*pbScale/3, 2, MG_BLACK); } else { vgBox(g_vg, xx, yy-2, (jPrevEnd-jPrevStart+1)*pbScale/3, 2, MG_BLACK); } mapBoxPrevGB(xx+(jPrevStart%3)*6, yy-2, (jPrevEnd-jPrevStart+1)*pbScale/3, 2, positionStr); safef(prevPosMessage, sizeof(prevPosMessage), "Previous position in UCSC Genome Browser: %s", positionStr); if (strand == '-') safef(prevPosMessage, sizeof(prevPosMessage), "%s (negative strand)", prevPosMessage); vgText(g_vg, xx+(jPrevStart%3)*pbScale/3, yy-10, MG_BLACK, g_font, prevPosMessage); } else { /*calxy(jPrevExonPos/3, *yOffp, &xx, &yy); */ if (jPrevExonPos <= 0) { calxy(jPrevExonPos/3, *yOffp, &xx, &yy); vgBox(g_vg, xx, yy, 1, 5, pbRed); } else { calxy(jPrevExonPos/3+1, *yOffp, &xx, &yy); vgBox(g_vg, xx, yy, 1, 5, pbRed); } mapBoxPrevGB(xx-1, yy-1, 2, 6, positionStr); safef(prevPosMessage, sizeof(prevPosMessage), "Previous position in UCSC Genome Browser: %s (not in a CDS)",positionStr); if (strand == '-') safef(prevPosMessage, sizeof(prevPosMessage), "%s (negative strand)", prevPosMessage); calxy(0, *yOffp, &xx0, &yy); calxy(jPrevExonPos/3, *yOffp, &xx, &yy); if (xx < xx0) { vgText(g_vg, xx0, yy-8, MG_BLACK, g_font, prevPosMessage); } else { if (jPrevExonPos/3 < aaLen/2) { vgText(g_vg, xx, yy-8, MG_BLACK, g_font, prevPosMessage); } else { vgTextRight(g_vg, xx, yy-8, 10, 10, MG_BLACK, g_font, prevPosMessage); } } } calxy0(0, *yOffp, &xx, &yy); vgBox(g_vg, 0, yy-10, xx, 20, bkgColor); trackTitle = cloneString("Genome Browser"); vgTextRight(g_vg, xx-25, yy-8, 10, 10, MG_BLACK, g_font, trackTitle); trackTitleLen = strlen(trackTitle); mapBoxTrackTitle(xx-25-trackTitleLen*6, yy-15, trackTitleLen*6+12, 14, trackTitle, "gb"); *yOffp = *yOffp + 7; }
void doDnaTrack(char *chrom, char strand, int exonCount, int len, int *yOffp) /* draw track for AA residue */ { int xx, yy; int j; int mrnaLen; int exonStartPos, exonEndPos; int exonGenomeStartPos, exonGenomeEndPos; int exonNumber; int printedExonNumber = -1; Color exonColor[2]; Color color; int k; struct dnaSeq *dna; char base[2]; char baseComp[2]; int dnaLen; Color defaultColor; defaultColor = vgFindColorIx(g_vg, 170, 170, 170); /* exonColor[0] = pbBlue; */ exonColor[0] = vgFindColorIx(g_vg, 0x00, 0x00, 0xd0); exonColor[1] = vgFindColorIx(g_vg, 0, 180, 0); base[1] = '\0'; baseComp[1] = '\0'; currentYoffset = *yOffp; calxy(0, *yOffp, &xx, &yy); /* The hypothetical mRNA length is 3 times of aaLen */ mrnaLen = len * 3; exonNumber = 1; exonStartPos = blockStartPositive[exonNumber-1]; exonEndPos = blockEndPositive[exonNumber-1]; exonGenomeStartPos = blockGenomeStartPositive[exonNumber-1]; exonGenomeEndPos = blockGenomeEndPositive[exonNumber-1]; dna = hChromSeq(database, chrom, exonGenomeStartPos, exonGenomeEndPos+1); dnaLen = strlen(dna->dna); k=0; for (j = 0; j < mrnaLen; j++) { if (j > exonEndPos) { if (printedExonNumber != exonNumber) { printedExonNumber = exonNumber; } if (exonNumber < exonCount) { exonNumber++; exonStartPos = blockStartPositive[exonNumber-1]; exonEndPos = blockEndPositive[exonNumber-1]; exonGenomeStartPos = blockGenomeStartPositive[exonNumber-1]; exonGenomeEndPos = blockGenomeEndPositive[exonNumber-1]; dna = hChromSeq(database, chrom, exonGenomeStartPos, exonGenomeEndPos+1); dnaLen = strlen(dna->dna); k=0; } } if ((j >= exonStartPos) && (j <= exonEndPos)) { if (strand == '+') { base[0] = toupper(*(dna->dna + k)); } else { base[0] = toupper(ntCompTable[(int)*(dna->dna + dnaLen - k -1 )]); baseComp[0] = toupper(*(dna->dna + dnaLen - k -1 )); } k++; color = exonColor[(exonNumber-1) % 2]; calxy(j/3, *yOffp, &xx, &yy); if (strand == '-') { vgTextRight(g_vg, xx-3+(j%3)*6, yy-3, 10, 10, color, g_font, base); vgTextRight(g_vg, xx-3+(j%3)*6, yy+9, 10, 10, color, g_font, baseComp); } else { vgTextRight(g_vg, xx-3+(j%3)*6, yy-3, 10, 10, color, g_font, base); } } color = pbBlue; } calxy0(0, *yOffp, &xx, &yy); vgBox(g_vg, 0, yy-10, xx, 30, bkgColor); if (strand == '-') { trackTitle = cloneString("Coding Sequence"); } else { trackTitle = cloneString("Genomic Sequence"); } vgTextRight(g_vg, xx-25, yy-4, 10, 10, MG_BLACK, g_font, trackTitle); trackTitleLen = strlen(trackTitle); mapBoxTrackTitle(xx-25-trackTitleLen*6, yy-6, trackTitleLen*6+12, 14, trackTitle, "dna"); if (strand == '-') { trackTitle = cloneString("Genomic Sequence"); vgTextRight(g_vg, xx-25, yy+9, 10, 10, MG_BLACK, g_font, trackTitle); trackTitleLen = strlen(trackTitle); mapBoxTrackTitle(xx-25-trackTitleLen*6, yy+7, trackTitleLen*6+12, 14, trackTitle, "dna"); } if (strand == '-') { *yOffp = *yOffp + 20; } else { *yOffp = *yOffp + 12; } }
int vgFindRgb(struct vGfx *vg, struct rgbColor *rgb) /* Find color index corresponding to rgb color. */ { return vgFindColorIx(vg, rgb->r, rgb->g, rgb->b); }
void makeActiveImagePB(char *psOutput, char *psOutput2) /* Make image and image map. */ { char *mapName = "map"; int pixWidth, pixHeight; struct sqlConnection *conn; char query[256]; struct sqlResult *sr; char **row; int iypos; char *spDisplayId; char *oldDisplayId; conn = sqlConnect(UNIPROT_DB_NAME); printf("<BR>"); hPrintf("<BR><font size=4><B>Protein: "); hPrintf("%s</B>", proteinID); /* Please note the hiv database name is hard wired here.*/ safef(query, sizeof(query), "select subjId from hivVax003Vax004.gsIdXref where aaSeqId = '%s'", proteinID); sr = sqlMustGetResult(conn, query); row = sqlNextRow(sr); if (row != NULL) { printf("<BR>"); hPrintf("<font size=4><B>Subject: "); hPrintf("<A HREF=\"../cgi-bin/gsidSubj?hgs_subj=%s&submit=Go!\">", row[0]); hPrintf("%s</A></B><BR>", row[0]); } sqlFreeResult(&sr); spDisplayId = spAccToId(conn, spFindAcc(conn, proteinID)); if (strstr(spDisplayId, spFindAcc(conn, proteinID)) == NULL) { hPrintf(" (aka %s", spDisplayId); /* show once if the new and old displayId are the same */ oldDisplayId = oldSpDisplayId(spDisplayId); if (oldDisplayId != NULL) { if (!sameWord(spDisplayId, oldDisplayId)) { hPrintf(" or %s", oldSpDisplayId(spDisplayId)); } } hPrintf(")\n"); } hPrintf("</font><br>"); protSeq = getAA(proteinID); if (protSeq == NULL) { errAbort("%s is not a current valid entry in UniProt(SWISS-PROT/TrEMBL)\n", proteinID); } protSeqLen = strlen(protSeq); fflush(stdout); iypos = 15; doTracks(proteinID, mrnaID, protSeq, &iypos, psOutput); if (!hTableExists(database, "pbStamp")) goto histDone; pbScale = 3; pixWidth = 520; insideWidth = pixWidth-gfxBorder; pixHeight = 350; if (psOutput2) { vg2 = vgOpenPostScript(pixWidth, pixHeight, psOutput2); } else { trashDirFile(&gifTn2, "pbt", "pbt", ".gif"); vg2 = vgOpenGif(pixWidth, pixHeight, gifTn2.forCgi, FALSE); } g_vg = vg2; pbRed = vgFindColorIx(vg2, 0xf9, 0x51, 0x59); pbBlue = vgFindColorIx(g_vg, 0x00, 0x00, 0xd0); normalColor = pbBlue; abnormalColor = pbRed; bkgColor = vgFindColorIx(vg2, 255, 254, 232); vgBox(vg2, 0, 0, insideWidth, pixHeight, bkgColor); /* Start up client side map. */ mapName=cloneString("pbStamps"); hPrintf("\n<MAP Name=%s>\n", mapName); vgSetClip(vg2, 0, gfxBorder, insideWidth, pixHeight - 2*gfxBorder); iypos = 15; /* Draw stamps. */ doStamps(proteinID, mrnaID, protSeq, vg2, &iypos); /* Finish map. */ hPrintf("</MAP>\n"); /* Save out picture and tell html file about it. */ vgClose(&vg2); hPrintf("<P>"); hPrintf("\n<IMG SRC=\"%s\" BORDER=1 WIDTH=%d HEIGHT=%d USEMAP=#%s><BR>", gifTn2.forCgi, pixWidth, pixHeight, mapName); if (proteinInSupportedGenome) { hPrintf("\n<A HREF=\"../goldenPath/help/pbTracksHelpFiles/pbTracksHelp.shtml#histograms\" TARGET=_blank>"); } else { hPrintf("\n<A HREF=\"../goldenPath/help/pbTracksHelpFiles/pbGsid/pbTracksHelp.shtml#histograms\" TARGET=_blank>"); } hPrintf("Explanation of Protein Property Histograms</A><BR>"); hPrintf("<P>"); histDone: hPrintf("<P>"); fflush(stdout); printFASTA(proteinID, protSeq); }
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); } */ }
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); } } }