int probeParseKind(void *ptr, char *str, char err[AIR_STRLEN_HUGE]) { char me[] = "probeParseKind"; gageKind **kindP; if (!(ptr && str)) { sprintf(err, "%s: got NULL pointer", me); return 1; } kindP = (gageKind **)ptr; airToLower(str); if (!strcmp(gageKindScl->name, str)) { *kindP = gageKindScl; } else if (!strcmp(gageKindVec->name, str)) { *kindP = gageKindVec; } else if (!strcmp(tenGageKind->name, str)) { *kindP = tenGageKind; } else if (!strcmp(TEN_DWI_GAGE_KIND_NAME, str)) { *kindP = tenDwiGageKindNew(); } else { sprintf(err, "%s: not \"%s\", \"%s\", \"%s\", or \"%s\"", me, gageKindScl->name, gageKindVec->name, tenGageKind->name, TEN_DWI_GAGE_KIND_NAME); return 1; } return 0; }
int probeParseKind(void *ptr, char *str, char err[AIR_STRLEN_HUGE]) { char me[] = "probeParseKind"; gageKind **kindP; if (!(ptr && str)) { sprintf(err, "%s: got NULL pointer", me); return 1; } kindP = (gageKind **)ptr; airToLower(str); if (!strcmp("scalar", str)) { *kindP = gageKindScl; } else if (!strcmp("vector", str)) { *kindP = gageKindVec; } else if (!strcmp("tensor", str)) { *kindP = tenGageKind; } else if (!strcmp("dwi", str)) { *kindP = tenDwiGageKindNew(); } else { sprintf(err, "%s: not \"scalar\", \"vector\", \"tensor\", or \"dwi\"", me); return 1; } return 0; }
gageKind * _meetGageKindParse(const char *_str, int constOnly) { char *str; gageKind *ret; if (!_str) { return NULL; } str = airToLower(airStrdup(_str)); if (!str) { return NULL; } if (!strcmp(gageKindScl->name, str)) { ret = gageKindScl; } else if (!strcmp(gageKindVec->name, str)) { ret = gageKindVec; } else if (!strcmp(tenGageKind->name, str)) { ret = tenGageKind; } else if (!constOnly && !strcmp(TEN_DWI_GAGE_KIND_NAME, str)) { ret = tenDwiGageKindNew(); } else { ret = NULL; } airFree(str); return ret; }
static tenFiberContext * _tenFiberContextCommonNew(const Nrrd *vol, int useDwi, double thresh, double soft, double valueMin, int ten1method, int ten2method) { char me[]="_tenFiberContextCommonNew", err[BIFF_STRLEN]; tenFiberContext *tfx; gageKind *kind; if (!( tfx = (tenFiberContext *)calloc(1, sizeof(tenFiberContext)) )) { sprintf(err, "%s: couldn't allocate new context", me); biffAdd(TEN, err); return NULL; } if (useDwi) { Nrrd *ngrad=NULL, *nbmat=NULL; double bval=0; unsigned int *skip, skipNum; tfx->useDwi = AIR_TRUE; /* default fiber type */ tfx->fiberType = tenDwiFiberTypeUnknown; if (tenDWMRIKeyValueParse(&ngrad, &nbmat, &bval, &skip, &skipNum, vol)) { sprintf(err, "%s: trouble parsing DWI info", me ); biffAdd(TEN, err); return NULL; } if (skipNum) { sprintf(err, "%s: sorry, can't do DWI skipping here", me); biffAdd(TEN, err); return NULL; } kind = tenDwiGageKindNew(); if (tenDwiGageKindSet(kind, thresh, soft, bval, valueMin, ngrad, NULL, ten1method, ten2method, 42)) { sprintf(err, "%s: trouble setting DWI kind", me); biffAdd(TEN, err); return NULL; } } else { /* it should be a tensor volume */ tfx->useDwi = AIR_FALSE; /* default fiber type */ tfx->fiberType = tenFiberTypeUnknown; if (tenTensorCheck(vol, nrrdTypeUnknown, AIR_TRUE, AIR_TRUE)) { sprintf(err, "%s: didn't get a tensor volume", me); biffAdd(TEN, err); return NULL; } kind = tenGageKind; } if ( !(tfx->gtx = gageContextNew()) || !(tfx->pvl = gagePerVolumeNew(tfx->gtx, vol, kind)) || (gagePerVolumeAttach(tfx->gtx, tfx->pvl)) ) { sprintf(err, "%s: gage trouble", me); biffMove(TEN, err, GAGE); free(tfx); return NULL; } tfx->nin = vol; tfx->ksp = nrrdKernelSpecNew(); if (nrrdKernelSpecParse(tfx->ksp, tenDefFiberKernel)) { sprintf(err, "%s: couldn't parse tenDefFiberKernel \"%s\"", me, tenDefFiberKernel); biffMove(TEN, err, NRRD); return NULL; } if (tenFiberKernelSet(tfx, tfx->ksp->kernel, tfx->ksp->parm)) { sprintf(err, "%s: couldn't set default kernel", me); biffAdd(TEN, err); return NULL; } /* looks to GK like GK says that we must set some stop criterion */ tfx->intg = tenDefFiberIntg; tfx->anisoStopType = tenDefFiberAnisoStopType; tfx->anisoSpeedType = tenAnisoUnknown; tfx->stop = 0; tfx->anisoThresh = tenDefFiberAnisoThresh; /* so I'm not using the normal default mechanism, shoot me */ tfx->anisoSpeedFunc[0] = 0; tfx->anisoSpeedFunc[1] = 0; tfx->anisoSpeedFunc[2] = 0; tfx->maxNumSteps = tenDefFiberMaxNumSteps; tfx->minNumSteps = 0; tfx->useIndexSpace = tenDefFiberUseIndexSpace; tfx->verbose = 0; tfx->stepSize = tenDefFiberStepSize; tfx->maxHalfLen = tenDefFiberMaxHalfLen; tfx->minWholeLen = 0.0; tfx->confThresh = 0.5; /* why do I even bother setting these- they'll only get read if the right tenFiberStopSet has been called, in which case they'll be set... */ tfx->minRadius = 1; /* above lament applies here as well */ tfx->minFraction = 0.5; /* and here */ tfx->wPunct = tenDefFiberWPunct; GAGE_QUERY_RESET(tfx->query); tfx->mframe[0] = vol->measurementFrame[0][0]; tfx->mframe[1] = vol->measurementFrame[1][0]; tfx->mframe[2] = vol->measurementFrame[2][0]; tfx->mframe[3] = vol->measurementFrame[0][1]; tfx->mframe[4] = vol->measurementFrame[1][1]; tfx->mframe[5] = vol->measurementFrame[2][1]; tfx->mframe[6] = vol->measurementFrame[0][2]; tfx->mframe[7] = vol->measurementFrame[1][2]; tfx->mframe[8] = vol->measurementFrame[2][2]; if (ELL_3M_EXISTS(tfx->mframe)) { tfx->mframeUse = AIR_TRUE; ELL_3M_TRANSPOSE(tfx->mframeT, tfx->mframe); } else { tfx->mframeUse = AIR_FALSE; } tfx->gageAnisoStop = NULL; tfx->gageAnisoSpeed = NULL; tfx->ten2AnisoStop = AIR_NAN; /* ... don't really see the point of initializing the ten2 stuff here; its properly done in tenFiberTraceSet() ... */ tfx->radius = AIR_NAN; return tfx; }