int main(int argc, char *argv[]) { int i; Nrrd *nrrd; double diff, idx, idx2, idx3, idx4, lo, hi, pos, pos2, pos3, pos4; AIR_UNUSED(argc); AIR_UNUSED(argv); if (nrrdAlloc_va(nrrd=nrrdNew(), nrrdTypeFloat, 2, AIR_CAST(size_t, 4), AIR_CAST(size_t, 4))) { printf("trouble:\n%s\n", biffGet(NRRD)); exit(1); } nrrdAxisInfoSet_va(nrrd, nrrdAxisInfoMin, 10.0, 10.0); nrrdAxisInfoSet_va(nrrd, nrrdAxisInfoMax, 12.0, 12.0); nrrdAxisInfoSet_va(nrrd, nrrdAxisInfoCenter, nrrdCenterNode, nrrdCenterCell); idx = 0; printf("\n"); pos = nrrdAxisInfoPos(nrrd, 0, idx); printf("pos(0, %g) == %g --> %g\n", idx, pos, nrrdAxisInfoIdx(nrrd, 0, pos)); pos = nrrdAxisInfoPos(nrrd, 1, idx); printf("pos(1, %g) == %g --> %g\n", idx, pos, nrrdAxisInfoIdx(nrrd, 1, pos)); idx = 1; printf("\n"); pos = nrrdAxisInfoPos(nrrd, 0, idx); printf("pos(0, %g) == %g --> %g\n", idx, pos, nrrdAxisInfoIdx(nrrd, 0, pos)); pos = nrrdAxisInfoPos(nrrd, 1, idx); printf("pos(1, %g) == %g --> %g\n", idx, pos, nrrdAxisInfoIdx(nrrd, 1, pos)); idx = 2; printf("\n"); pos = nrrdAxisInfoPos(nrrd, 0, idx); printf("pos(0, %g) == %g --> %g\n", idx, pos, nrrdAxisInfoIdx(nrrd, 0, pos)); pos = nrrdAxisInfoPos(nrrd, 1, idx); printf("pos(1, %g) == %g --> %g\n", idx, pos, nrrdAxisInfoIdx(nrrd, 1, pos)); idx = 0; idx2 = 0; printf("\n"); nrrdAxisInfoPosRange(&lo, &hi, nrrd, 0, idx, idx2); nrrdAxisInfoIdxRange(&idx3, &idx4, nrrd, 0, lo, hi); printf("range(0, %g -- %g) == (%g -- %g) --> (%g -- %g)\n", idx, idx2, lo, hi, idx3, idx4); nrrdAxisInfoPosRange(&lo, &hi, nrrd, 1, idx, idx2); nrrdAxisInfoIdxRange(&idx3, &idx4, nrrd, 1, lo, hi); printf("range(1, %g -- %g) == (%g -- %g) --> (%g -- %g)\n", idx, idx2, lo, hi, idx3, idx4); idx = 0; idx2 = 1; printf("\n"); nrrdAxisInfoPosRange(&lo, &hi, nrrd, 0, idx, idx2); nrrdAxisInfoIdxRange(&idx3, &idx4, nrrd, 0, lo, hi); printf("range(0, %g -- %g) == (%g -- %g) --> (%g -- %g)\n", idx, idx2, lo, hi, idx3, idx4); nrrdAxisInfoPosRange(&lo, &hi, nrrd, 1, idx, idx2); nrrdAxisInfoIdxRange(&idx3, &idx4, nrrd, 1, lo, hi); printf("range(1, %g -- %g) == (%g -- %g) --> (%g -- %g)\n", idx, idx2, lo, hi, idx3, idx4); idx = 1; idx2 = 0; printf("\n"); nrrdAxisInfoPosRange(&lo, &hi, nrrd, 0, idx, idx2); nrrdAxisInfoIdxRange(&idx3, &idx4, nrrd, 0, lo, hi); printf("range(0, %g -- %g) == (%g -- %g) --> (%g -- %g)\n", idx, idx2, lo, hi, idx3, idx4); nrrdAxisInfoPosRange(&lo, &hi, nrrd, 1, idx, idx2); nrrdAxisInfoIdxRange(&idx3, &idx4, nrrd, 1, lo, hi); printf("range(1, %g -- %g) == (%g -- %g) --> (%g -- %g)\n", idx, idx2, lo, hi, idx3, idx4); nrrdAxisInfoSet_va(nrrd, nrrdAxisInfoMin, 12.0, 12.0); nrrdAxisInfoSet_va(nrrd, nrrdAxisInfoMax, 10.0, 10.0); printf("\n(axis min,max flipped)\n"); idx = 0; printf("\n"); pos = nrrdAxisInfoPos(nrrd, 0, idx); printf("pos(0, %g) == %g --> %g\n", idx, pos, nrrdAxisInfoIdx(nrrd, 0, pos)); pos = nrrdAxisInfoPos(nrrd, 1, idx); printf("pos(1, %g) == %g --> %g\n", idx, pos, nrrdAxisInfoIdx(nrrd, 1, pos)); idx = 1; printf("\n"); pos = nrrdAxisInfoPos(nrrd, 0, idx); printf("pos(0, %g) == %g --> %g\n", idx, pos, nrrdAxisInfoIdx(nrrd, 0, pos)); pos = nrrdAxisInfoPos(nrrd, 1, idx); printf("pos(1, %g) == %g --> %g\n", idx, pos, nrrdAxisInfoIdx(nrrd, 1, pos)); idx = 2; printf("\n"); pos = nrrdAxisInfoPos(nrrd, 0, idx); printf("pos(0, %g) == %g --> %g\n", idx, pos, nrrdAxisInfoIdx(nrrd, 0, pos)); pos = nrrdAxisInfoPos(nrrd, 1, idx); printf("pos(1, %g) == %g --> %g\n", idx, pos, nrrdAxisInfoIdx(nrrd, 1, pos)); idx = 0; idx2 = 0; printf("\n"); nrrdAxisInfoPosRange(&lo, &hi, nrrd, 0, idx, idx2); nrrdAxisInfoIdxRange(&idx3, &idx4, nrrd, 0, lo, hi); printf("range(0, %g -- %g) == (%g -- %g) --> (%g -- %g)\n", idx, idx2, lo, hi, idx3, idx4); nrrdAxisInfoPosRange(&lo, &hi, nrrd, 1, idx, idx2); nrrdAxisInfoIdxRange(&idx3, &idx4, nrrd, 1, lo, hi); printf("range(1, %g -- %g) == (%g -- %g) --> (%g -- %g)\n", idx, idx2, lo, hi, idx3, idx4); idx = 0; idx2 = 2; printf("\n"); nrrdAxisInfoPosRange(&lo, &hi, nrrd, 0, idx, idx2); nrrdAxisInfoIdxRange(&idx3, &idx4, nrrd, 0, lo, hi); printf("range(0, %g -- %g) == (%g -- %g) --> (%g -- %g)\n", idx, idx2, lo, hi, idx3, idx4); nrrdAxisInfoPosRange(&lo, &hi, nrrd, 1, idx, idx2); nrrdAxisInfoIdxRange(&idx3, &idx4, nrrd, 1, lo, hi); printf("range(1, %g -- %g) == (%g -- %g) --> (%g -- %g)\n", idx, idx2, lo, hi, idx3, idx4); idx = 2; idx2 = 0; printf("\n"); nrrdAxisInfoPosRange(&lo, &hi, nrrd, 0, idx, idx2); nrrdAxisInfoIdxRange(&idx3, &idx4, nrrd, 0, lo, hi); printf("range(0, %g -- %g) == (%g -- %g) --> (%g -- %g)\n", idx, idx2, lo, hi, idx3, idx4); nrrdAxisInfoPosRange(&lo, &hi, nrrd, 1, idx, idx2); nrrdAxisInfoIdxRange(&idx3, &idx4, nrrd, 1, lo, hi); printf("range(1, %g -- %g) == (%g -- %g) --> (%g -- %g)\n", idx, idx2, lo, hi, idx3, idx4); nrrd->axis[0].center = nrrdCenterCell; nrrd->axis[0].size = 4; nrrd->axis[0].min = -4; nrrd->axis[0].max = 4; pos = 0; pos2 = 1; nrrdAxisInfoIdxRange(&idx, &idx2, nrrd, 0, pos, pos2); nrrdAxisInfoPosRange(&pos3, &pos4, nrrd, 0, idx, idx2); printf("min, max = %g, %g\n", nrrd->axis[0].min, nrrd->axis[0].max); printf("pos, pos2 = %g, %g\n", pos, pos2); printf("idx, idx2 = %g, %g\n", idx, idx2); printf("pos3, pos4 = %g, %g\n", pos3, pos4); exit(1); /* and now for random-ness */ airSrandMT((int)airTime()); nrrd->axis[0].center = nrrdCenterNode; nrrd->axis[0].center = nrrdCenterCell; for (i=0; i<=1000000; i++) { nrrd->axis[0].min = frand(-3.0, 3.0); nrrd->axis[0].max = frand(-3.0, 3.0); idx = frand(-3.0, 3.0); pos = nrrdAxisInfoPos(nrrd, 0, idx); diff = idx - nrrdAxisInfoIdx(nrrd, 0, pos); if (AIR_ABS(diff) > 0.00000001) { printf("PANIC 0\n"); exit(2); } pos = frand(-3.0, 3.0); idx = nrrdAxisInfoIdx(nrrd, 0, pos); diff = pos - nrrdAxisInfoPos(nrrd, 0, idx); if (AIR_ABS(diff) > 0.00000001) { printf("PANIC 1\n"); exit(2); } nrrd->axis[0].min = (int)frand(-3.0, 3.0); nrrd->axis[0].max = (int)frand(-3.0, 3.0); idx = (int)frand(-10.0, 10.0); idx2 = (int)frand(-10.0, 10.0); nrrdAxisInfoPosRange(&pos, &pos2, nrrd, 0, idx, idx2); nrrdAxisInfoIdxRange(&idx3, &idx4, nrrd, 0, pos, pos2); diff = AIR_ABS(idx - idx3) + AIR_ABS(idx2 - idx4); if (AIR_ABS(diff) > 0.00000001) { printf("PANIC 2\n"); exit(2); } pos = (int)frand(-3.0, 3.0); pos2 = (int)frand(-3.0, 3.0); nrrdAxisInfoIdxRange(&idx, &idx2, nrrd, 0, pos, pos2); nrrdAxisInfoPosRange(&pos3, &pos4, nrrd, 0, idx, idx2); diff = AIR_ABS(pos - pos3) + AIR_ABS(pos2 - pos4); if (AIR_ABS(diff) > 0.00000001) { printf("min, max = %g, %g\n", nrrd->axis[0].min, nrrd->axis[0].max); printf("pos, pos2 = %g, %g\n", pos, pos2); printf("idx, idx2 = %g, %g\n", idx, idx2); printf("pos3, pos4 = %g, %g\n", pos3, pos4); printf("PANIC (%d) 3 %g\n", (int)nrrd->axis[0].size, diff); exit(2); } } exit(0); }
int nrrdHistoDraw(Nrrd *nout, const Nrrd *nin, size_t sy, int showLog, double max) { static const char me[]="nrrdHistoDraw", func[]="dhisto"; char cmt[AIR_STRLEN_MED]; unsigned int k, sx, x, y, maxhitidx, E, numticks, *Y, *logY, tick, *ticks; double hits, maxhits, usemaxhits; unsigned char *pgmData; airArray *mop; if (!(nin && nout && sy > 0)) { biffAddf(NRRD, "%s: invalid args", me); return 1; } if (nout == nin) { biffAddf(NRRD, "%s: nout==nin disallowed", me); return 1; } if (nrrdHistoCheck(nin)) { biffAddf(NRRD, "%s: input nrrd not a histogram", me); return 1; } sx = AIR_CAST(unsigned int, nin->axis[0].size); nrrdBasicInfoInit(nout, NRRD_BASIC_INFO_DATA_BIT); if (nrrdPGM(nout, sx, sy)) { biffAddf(NRRD, "%s: failed to allocate histogram image", me); return 1; } /* perhaps I should be using nrrdAxisInfoCopy */ nout->axis[0].spacing = nout->axis[1].spacing = AIR_NAN; nout->axis[0].thickness = nout->axis[1].thickness = AIR_NAN; nout->axis[0].min = nin->axis[0].min; nout->axis[0].max = nin->axis[0].max; nout->axis[0].center = nout->axis[1].center = nrrdCenterCell; nout->axis[0].label = (char *)airStrdup(nin->axis[0].label); nout->axis[1].label = (char *)airFree(nout->axis[1].label); pgmData = (unsigned char *)nout->data; maxhits = maxhitidx = 0; for (x=0; x<sx; x++) { hits = nrrdDLookup[nin->type](nin->data, x); if (maxhits < hits) { maxhits = hits; maxhitidx = x; } } if (AIR_EXISTS(max) && max > 0) { usemaxhits = max; } else { usemaxhits = maxhits; } nout->axis[1].min = usemaxhits; nout->axis[1].max = 0; numticks = (unsigned int)log10(usemaxhits + 1); mop = airMopNew(); ticks = (unsigned int*)calloc(numticks, sizeof(unsigned int)); airMopMem(mop, &ticks, airMopAlways); Y = (unsigned int*)calloc(sx, sizeof(unsigned int)); airMopMem(mop, &Y, airMopAlways); logY = (unsigned int*)calloc(sx, sizeof(unsigned int)); airMopMem(mop, &logY, airMopAlways); if (!(ticks && Y && logY)) { biffAddf(NRRD, "%s: failed to allocate temp arrays", me); airMopError(mop); return 1; } for (k=0; k<numticks; k++) { ticks[k] = airIndex(0, log10(pow(10,k+1) + 1), log10(usemaxhits+1), AIR_CAST(unsigned int, sy)); } for (x=0; x<sx; x++) { hits = nrrdDLookup[nin->type](nin->data, x); Y[x] = airIndex(0, hits, usemaxhits, AIR_CAST(unsigned int, sy)); logY[x] = airIndex(0, log10(hits+1), log10(usemaxhits+1), AIR_CAST(unsigned int, sy)); /* printf("%d -> %d,%d", x, Y[x], logY[x]); */ } for (y=0; y<sy; y++) { tick = 0; for (k=0; k<numticks; k++) tick |= ticks[k] == y; for (x=0; x<sx; x++) { pgmData[x + sx*(sy-1-y)] = (2 == showLog /* HACK: draw log curve, but not log tick marks */ ? (y >= logY[x] ? 0 /* above log curve */ : (y >= Y[x] ? 128 /* below log curve, above normal curve */ : 255 /* below log curve, below normal curve */ ) ) : (!showLog ? (y >= Y[x] ? 0 : 255) : (y >= logY[x] /* above log curve */ ? (!tick ? 0 /* not on tick mark */ : 255) /* on tick mark */ : (y >= Y[x] /* below log curve, above normal curve */ ? (!tick ? 128 /* not on tick mark */ : 0) /* on tick mark */ :255 /* below log curve, below normal curve */ ) ) ) ); } } E = AIR_FALSE; sprintf(cmt, "min value: %g\n", nout->axis[0].min); if (!E) E |= nrrdCommentAdd(nout, cmt); sprintf(cmt, "max value: %g\n", nout->axis[0].max); if (!E) E |= nrrdCommentAdd(nout, cmt); sprintf(cmt, "max hits: %g, in bin %d, around value %g\n", maxhits, maxhitidx, nrrdAxisInfoPos(nout, 0, maxhitidx)); if (!E) E |= nrrdCommentAdd(nout, cmt); if (!E) E |= nrrdContentSet_va(nout, func, nin, "%d", sy); if (E) { biffAddf(NRRD, "%s:", me); airMopError(mop); return 1; } /* bye */ airMopOkay(mop); return 0; }