void gcSquiggle(char *chromName, char *destDir, char *type, bool thick, bool line) /* Make gcSquiggle pic for chromosome. */ { char gifName[512]; int chromSize = hChromSize(chromName); struct memGfx *mg = getScaledMg(chromSize, squiggleHeight); int dotWidth = mg->width; char nibName[512]; FILE *nibFile; int nibChromSize; struct dnaSeq *seq = NULL; double lastGcPercent = (gcPercentMin+gcPercentMax)/2; double gcPercent; int startBase = 0, endBase = 0, baseWidth; int lastDot = -1, dot; int realBaseCount; int gcBaseCount; bool lastMissing = TRUE; int squigHeight = squiggleHeight-thick; int y1,y2; sprintf(gifName, "%s/%sgc%s.gif", destDir, chromName, type); sprintf(nibName, "%s/%s.nib", nibDir, chromName); nibOpenVerify(nibName, &nibFile, &nibChromSize); if (nibChromSize != chromSize) errAbort("Disagreement on size of %s between database and %s\n", chromName, nibName); for (dot = 0; dot <dotWidth; ++dot) { startBase = endBase; endBase = dotToBase(dot+1); if (endBase > nibChromSize) endBase = nibChromSize; baseWidth = endBase-startBase; seq = nibLdPart(nibName, nibFile, nibChromSize, startBase, baseWidth); realBaseCount = realDnaCount(seq->dna, seq->size); gcBaseCount = gcDnaCount(seq->dna, seq->size); if (realBaseCount < 20) { /* Add psuedocounts from last time if sample is small. */ lastMissing = TRUE; } else { gcPercent = (double)gcBaseCount/(double)realBaseCount; y2 = gcScaleRange(gcPercent, squigHeight); if (line && !lastMissing) { y1 = gcScaleRange(lastGcPercent, squigHeight); mgDrawLine(mg, dot-1, y1, dot, y2, MG_BLACK); if (thick) { mgDrawLine(mg, dot-1, y1+1, dot, y2+1, MG_BLACK); } } else { mgPutDot(mg, dot, y2, MG_BLACK); if (thick) mgPutDot(mg, dot, y2+1, MG_BLACK); } lastGcPercent = gcPercent; lastMissing = FALSE; } freeDnaSeq(&seq); } fclose(nibFile); mgSaveGif(mg, gifName); mgFree(&mg); }
void mgCircle(struct memGfx *mg, int xCen, int yCen, int rad, Color color, boolean filled) /* Draw a circle using a stepping algorithm. Doesn't correct * for non-square pixels. */ { int err; int derr, yerr, xerr; int aderr, ayerr, axerr; register int x,y; int lasty; if (rad <= 0) { mgPutDot(mg, xCen, yCen, color); return; } err = 0; x = rad; lasty = y = 0; for (;;) { if (filled) { if (y == 0) mgLineH(mg, yCen, xCen-x, xCen+x, color); else { if (lasty != y) { mgLineH(mg, yCen-y, xCen-x, xCen+x, color); mgLineH(mg, yCen+y, xCen-x, xCen+x, color); lasty = y; } } } else { /* draw 4 quadrandts of a circle */ mgPutDot(mg, xCen+x, yCen+y, color); mgPutDot(mg, xCen+x, yCen-y, color); mgPutDot(mg, xCen-x, yCen+y, color); mgPutDot(mg, xCen-x, yCen-y, color); } axerr = xerr = err -x-x+1; ayerr = yerr = err +y+y+1; aderr = derr = yerr+xerr-err; if (aderr < 0) aderr = -aderr; if (ayerr < 0) ayerr = -ayerr; if (axerr < 0) axerr = -axerr; if (aderr <= ayerr && aderr <= axerr) { err = derr; x -= 1; y += 1; } else if (ayerr <= axerr) { err = yerr; y += 1; } else { err = xerr; x -= 1; } if (x < 0) break; } }