int main(int argc, char **argv) { FSLIO* fslio; void *buffer=NULL; char *hdrxml, *filename; int fileread=1, filetype=-1, existingimage=0; size_t bufsize=0; short x,y,z,v, dt=-1; if (argc<2) usage(); if ((argc==3) || (argc==4)) { /* use the XML form of header specification */ filename = argv[2]; } else { filename = argv[13]; } /* check if file already exists and if so, read the image contents */ /* also store the size of this buffer for later in case it is wrong */ if (FslFileExists(filename)) { /* buffer = FslReadAllVolumes(fslio,filename); */ existingimage = 1; fslio = FslOpen(filename,"rb"); FslGetDim(fslio,&x,&y,&z,&v); filetype = FslGetFileType(fslio); bufsize = x * y * z * v * (FslGetDataType(fslio,&dt) / 8); buffer = (void *) calloc(bufsize,1); FslReadVolumes(fslio,buffer,v); FslClose(fslio); } if (existingimage) { fslio = FslXOpen(filename,"wb",filetype); } else { fslio = FslOpen(filename,"wb"); filetype = FslGetFileType(fslio); } if (FslBaseFileType(FslGetFileType(fslio))==FSL_TYPE_MINC) { fprintf(stderr,"Minc file type is not supported yet\n"); exit(EXIT_FAILURE); } if (argc>3) { /* set uninteresting defaults */ if (existingimage) { FslSetDataType(fslio,dt); } else { FslSetDataType(fslio,atoi(argv[12])); } FslSetDim(fslio,atoi(argv[1]),atoi(argv[2]),atoi(argv[3]),atoi(argv[4])); FslSetVoxDim(fslio,atof(argv[5]),atof(argv[6]),atof(argv[7]),atof(argv[8])); { short short_array[100]; short_array[0]=atoi(argv[9]); short_array[1]=atoi(argv[10]); short_array[2]=atoi(argv[11]); if ( (short_array[0]!=0) || (short_array[1]!=0) || (short_array[2]!=0) ) { FslSetAnalyzeSform(fslio,short_array, atof(argv[5]),atof(argv[6]),atof(argv[7])); } } } else { /* read XML form */ char *newstr, *oldfname, *oldiname; FILE *fileptr=NULL; if (strcmp(argv[1],"-")==0) {fileread=0;} newstr = (char *)calloc(10000,1); oldfname = (char *)calloc(10000,1); oldiname = (char *)calloc(10000,1); hdrxml = (char *)calloc(65534,1); /* too long, to be safe */ if (fileread) { fileptr = fopen(argv[1],"rb"); if (fileptr==NULL) { fprintf(stderr,"Cannot open file %s\n",argv[1]); exit(EXIT_FAILURE); } } do { /* read string from file or stdin */ if (fileread) { if (fgets(newstr,9999,fileptr)==NULL) break; } else { if (fgets(newstr,9999,stdin)==NULL) break; } strcat(hdrxml,newstr); } while (strcmp(newstr + strlen(newstr) - 2,"/>")!=0); strcpy(oldfname,fslio->niftiptr->fname); strcpy(oldiname,fslio->niftiptr->iname); fslio->niftiptr = nifti_image_from_ascii(hdrxml); if (fslio->niftiptr == NULL) { fprintf(stderr,"Incomplete or incorrect text: could not form header info\n"); exit(EXIT_FAILURE); } fslio->niftiptr->fname = oldfname; fslio->niftiptr->iname = oldiname; free(hdrxml); if (fileread) fclose(fileptr); } /* reset filetype and datatype in case it has been overwritten */ FslSetFileType(fslio,filetype); if (existingimage) { /* dt is only set if an image was previously read */ FslSetDataType(fslio,dt); } /* swap bytes */ fslio->niftiptr->byteorder = short_order(); /* if (strcmp(argv[argc-1],"-r")==0) { */ /* /\* swap *\/ */ /* if (short_order()==MSB_FIRST) fslio->niftiptr->byteorder = LSB_FIRST; */ /* else fslio->niftiptr->byteorder = MSB_FIRST; */ /* } */ /* write header */ FslWriteHeader(fslio); /* if previously read buffer is wrong size then make a zero image here */ FslGetDim(fslio,&x,&y,&z,&v); if ( bufsize != ( x * y * z * v * (FslGetDataType(fslio,&dt)/8)) ) { if (bufsize>0) free(buffer); /* only if previously read */ buffer = (void *) calloc(x * y * z * v,FslGetDataType(fslio,&dt)/8); } /* write the data out - either from previous read or zeros */ FslWriteVolumes(fslio,buffer,fslio->niftiptr->dim[4]); FslClose(fslio); exit(0); }
int main(int argc, char * argv[]) { FSLIO *fslio; FSLIO *fslioOutput; void *buffer; void *outputBuffer; size_t buffsize; char *inputpath = NULL; char *outputpath = NULL; char *maskpath = NULL; int x=-1, y=-1, z=-1, t=0; short xDim, yDim, zDim, vDim; size_t pixtype; short dt; float inter = 0.0, slope = 1.0; BOOL verbose = FALSE; int threads = 1; int ac; if( argc < 2 ) { rsMaskPrintHelp(); return 1; } /* parse parameters */ for( ac = 1; ac < argc; ac++ ) { if( ! strncmp(argv[ac], "-h", 2) ) { rsMaskPrintHelp(); return 1; } else if ( ! strcmp(argv[ac], "-input") ) { if( ++ac >= argc ) { fprintf(stderr, "** missing argument for -input\n"); return 1; } inputpath = argv[ac]; /* no string copy, just pointer assignment */ } else if ( ! strncmp(argv[ac], "-m", 2) ) { if( ++ac >= argc ) { fprintf(stderr, "** missing argument for -m[ask]\n"); return 1; } maskpath = argv[ac]; /* no string copy, just pointer assignment */ } else if ( ! strncmp(argv[ac], "-v", 2) ) { verbose = TRUE; } else if ( ! strcmp(argv[ac], "-output") ) { if( ++ac >= argc ) { fprintf(stderr, "** missing argument for -output\n"); return 1; } outputpath = argv[ac]; /* no string copy, just pointer assignment */ } else if ( ! strcmp(argv[ac], "-threads") ) { if( ++ac >= argc ) { fprintf(stderr, "** missing argument for -threads\n"); return 1; } threads = atoi(argv[ac]); /* no string copy, just pointer assignment */ } else { fprintf(stderr, "\nError, unrecognized command %s\n", argv[ac]); } } rsSetThreadsNum(threads); if ( inputpath == NULL ) { fprintf(stderr, "No input volume specified!\n"); return 1; } if ( outputpath == NULL ) { fprintf(stderr, "No output volume specified!\n"); return 1; } if ( maskpath == NULL ) { fprintf(stderr, "A binary mask must be specified!\n"); return 1; } if ( verbose ) { fprintf(stdout, "Input file: %s\n", inputpath); fprintf(stdout, "Mask file: %s\n", maskpath); fprintf(stdout, "Output file: %s\n", outputpath); } // Load file /* open input file */ fslio = FslOpen(inputpath, "rb"); if (fslio == NULL) { fprintf(stderr, "\nError, could not read header info for %s.\n", inputpath); return 1; } /* determine dimensions */ FslGetDim(fslio, &xDim, &yDim, &zDim, &vDim); if ( verbose ) { fprintf(stdout, "Dim: %d %d %d (%d Volumes)\n", xDim, yDim, zDim, vDim); } if (fslio->niftiptr->scl_slope != 0) { slope = fslio->niftiptr->scl_slope; inter = fslio->niftiptr->scl_inter; } /* determine datatype and initalize buffer */ pixtype = FslGetDataType(fslio, &dt); /* prepare centrality file */ fslioOutput = FslOpen(outputpath, "wb"); if (fslioOutput == NULL) { fprintf(stderr, "\nError, could not read header info for %s.\n", outputpath); return 1; } FslCloneHeader(fslioOutput, fslio); FslSetDim(fslioOutput, xDim, yDim, zDim, vDim); FslSetDimensionality(fslioOutput, 4); FslSetDataType(fslioOutput, dt); char *callString = rsMergeStringArray(argc, argv); rsWriteNiftiHeader(fslioOutput, callString); free(callString); /* load mask */ unsigned long nPoints = 0L; double ***mask = d3matrix(zDim-1, yDim-1, xDim-1); Point3D *maskPoints = rsReadMask(maskpath, xDim, yDim, zDim, &nPoints, NULL, fslio, mask); if ( maskPoints == NULL) { fprintf(stderr, "\nError: Mask invalid.\n"); FslClose(fslio); FslClose(fslioOutput); return 1; } // Prepare buffer buffsize = rsGetBufferSize(xDim, yDim, zDim, vDim, dt); buffer = malloc(buffsize); outputBuffer = malloc(buffsize); if (buffer == NULL || outputBuffer == NULL) { fprintf(stdout, "Not enough free memory :-(\n"); return 1; } FslReadVolumes(fslio, buffer, vDim); rsResetBufferToValue(dt, outputBuffer, slope, inter, xDim, yDim, zDim, vDim, log(-1)); long p; #pragma omp parallel num_threads(rsGetThreadsNum()) private(p) shared(buffer,fslio) { #pragma omp for schedule(guided, 1) for (p = 0L; p<nPoints; p++) { const Point3D *point = &maskPoints[p]; double *pointValues = (double*)malloc(sizeof(double)*vDim); rsExtractTimecourseFromBuffer(dt, pointValues, buffer, slope, inter, point, xDim, yDim, zDim, vDim); rsWriteTimecourseToBuffer(dt, pointValues, outputBuffer, slope, inter, point, xDim, yDim, zDim, vDim); free(pointValues); } } /* write output */ free(buffer); FslWriteVolumes(fslioOutput, outputBuffer, vDim); FslClose(fslioOutput); free(outputBuffer); free(fslioOutput); free(maskPoints); }