Skip to content

Commit e314887

Browse files
authored
Merge pull request #921 from yhuang43/development
DCM2NIIXFSLIB changes
2 parents 7d295ff + 9bba8d7 commit e314887

4 files changed

+81
-11
lines changed

console/dcm2niix_fswrapper.cpp

+44-4
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ void dcm2niix_fswrapper::setOpts(const char *dcmindir, const char *dcm2niixopts)
6868
// set the options for freesurfer mgz orientation
6969
tdcmOpts.isRotate3DAcq = false;
7070
tdcmOpts.isFlipY = false;
71-
tdcmOpts.isIgnoreSeriesInstanceUID = true;
71+
tdcmOpts.isIgnoreSeriesInstanceUID = true; // Advanced feature: '-m 2' ignores Series Instance UID
7272
tdcmOpts.isCreateBIDS = false;
7373
tdcmOpts.isGz = false;
7474
tdcmOpts.isForceStackSameSeries = 1; // merge 2D slice '-m y', tdcmOpts.isForceStackSameSeries = 1
@@ -153,7 +153,11 @@ void dcm2niix_fswrapper::__setDcm2niixOpts(const char *dcm2niixopts) {
153153
else if (*v == 'y' || *v == 'Y' || *v == '1')
154154
tdcmOpts.isForceStackSameSeries = 1;
155155
else if (*v == '2')
156+
{
156157
tdcmOpts.isForceStackSameSeries = 2;
158+
tdcmOpts.isIgnoreSeriesInstanceUID = true;
159+
//printf("Advanced feature: '-m 2' ignores Series Instance UID.\n");
160+
}
157161
else if (*v == 'o' || *v == 'O')
158162
tdcmOpts.isForceStackDCE = false;
159163
} else if (strcmp(k, "v") == 0) {
@@ -194,7 +198,7 @@ bool dcm2niix_fswrapper::isDICOM(const char *file) {
194198
* interface to nii_loadDirCore() to search all dicom files from the directory input file is in,
195199
* and convert dicom files with the same series as given file.
196200
*/
197-
int dcm2niix_fswrapper::dcm2NiiOneSeries(const char *dcmfile) {
201+
int dcm2niix_fswrapper::dcm2NiiOneSeries(const char *dcmfile, bool convert) {
198202
// get seriesNo for given dicom file
199203
struct TDICOMdata tdicomData = readDICOM((char *)dcmfile);
200204

@@ -206,19 +210,55 @@ int dcm2niix_fswrapper::dcm2NiiOneSeries(const char *dcmfile) {
206210
tdcmOpts.seriesNumber[0] = seriesNo;
207211
tdcmOpts.numSeries = 1;
208212

213+
if (!convert)
214+
tdcmOpts.isDumpNotConvert = true; // retrieve dicom info only
215+
209216
return nii_loadDirCore(tdcmOpts.indir, &tdcmOpts);
210217
}
211218

212-
// interface to nii_getMrifsStruct()
219+
/*
220+
* interface to singleDICOM() to to convert only the single image provided.
221+
*/
222+
int dcm2niix_fswrapper::dcm2NiiSingleFile(const char* dcmfile)
223+
{
224+
// get seriesNo for given dicom file
225+
struct TDICOMdata tdicomData = readDICOM((char*)dcmfile);
226+
227+
double seriesNo = (double)tdicomData.seriesUidCrc;
228+
if (tdcmOpts.isIgnoreSeriesInstanceUID)
229+
seriesNo = (double)tdicomData.seriesNum;
230+
231+
// set TDCMopts to convert just one series
232+
tdcmOpts.seriesNumber[0] = seriesNo;
233+
tdcmOpts.numSeries = 1;
234+
235+
tdcmOpts.isOnlySingleFile = true;
236+
237+
return singleDICOM(&tdcmOpts, (char*)dcmfile);
238+
}
239+
240+
// interface to nii_dicom_batch.cpp::nii_getMrifsStruct()
213241
MRIFSSTRUCT *dcm2niix_fswrapper::getMrifsStruct(void) {
214242
return nii_getMrifsStruct();
215243
}
216244

217-
// interface to nii_getMrifsStructVector()
245+
// interface to nii_dicom_batch.cpp::nii_getMrifsStructVector()
218246
std::vector<MRIFSSTRUCT> *dcm2niix_fswrapper::getMrifsStructVector(void) {
219247
return nii_getMrifsStructVector();
220248
}
221249

250+
// interface to nii_dicom_batch.cpp::nii_clrMrifsStruct()
251+
void dcm2niix_fswrapper::clrMrifsStruct(void)
252+
{
253+
nii_clrMrifsStruct();
254+
}
255+
256+
// interface to nii_dicom_batch.cpp::nii_clrMrifsStructVector()
257+
void dcm2niix_fswrapper::clrMrifsStructVector(void)
258+
{
259+
nii_clrMrifsStructVector();
260+
}
261+
222262
// return nifti header saved in MRIFSSTRUCT
223263
nifti_1_header *dcm2niix_fswrapper::getNiiHeader(void) {
224264
MRIFSSTRUCT *mrifsStruct = getMrifsStruct();

console/dcm2niix_fswrapper.h

+12-3
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,26 @@ class dcm2niix_fswrapper {
2323

2424
// interface to nii_loadDirCore() to search all dicom files from the directory input file is in,
2525
// and convert dicom files with the same series as given file.
26-
static int dcm2NiiOneSeries(const char *dcmfile);
26+
static int dcm2NiiOneSeries(const char *dcmfile, bool convert=true);
2727

28-
// interface to nii_getMrifsStruct()
28+
// interface to singleDICOM() to convert only the single image provided
29+
static int dcm2NiiSingleFile(const char* dcmfile);
30+
31+
// interface to nii_dicom_batch.cpp::nii_getMrifsStruct()
2932
static MRIFSSTRUCT *getMrifsStruct(void);
3033

34+
// interface to nii_dicom_batch.cpp::nii_clrMrifsStruct()
35+
static void clrMrifsStruct(void);
36+
3137
// return nifti header saved in MRIFSSTRUCT
3238
static nifti_1_header *getNiiHeader(void);
3339

34-
// interface to nii_getMrifsStructVector()
40+
// interface to nii_dicom_batch.cpp::nii_getMrifsStructVector()
3541
static std::vector<MRIFSSTRUCT> *getMrifsStructVector(void);
3642

43+
// interface to nii_dicom_batch.cpp::nii_clrMrifsStructVector()
44+
static void clrMrifsStructVector(void);
45+
3746
// return image data saved in MRIFSSTRUCT
3847
static const unsigned char *getMRIimg(void);
3948

console/nii_dicom_batch.cpp

+24-4
Original file line numberDiff line numberDiff line change
@@ -2650,6 +2650,18 @@ int *nii_saveDTI(char pathoutname[], int nConvert, struct TDCMsort dcmSort[], st
26502650
char sep = '\t';
26512651
if (opts.isCreateBIDS)
26522652
sep = ' ';
2653+
2654+
#ifdef USING_DCM2NIIXFSWRAPPER
2655+
mrifsStruct.numDti = numVol;
2656+
mrifsStruct.tdti = (TDTI *)malloc(numVol * sizeof(TDTI));
2657+
for (int i = 0; i < numVol; i++)
2658+
{
2659+
mrifsStruct.tdti[i].V[0] = 0;
2660+
mrifsStruct.tdti[i].V[1] = 0;
2661+
mrifsStruct.tdti[i].V[2] = 0;
2662+
mrifsStruct.tdti[i].V[3] = 0;
2663+
}
2664+
#else
26532665
// save bval
26542666
char txtname[2048] = {""};
26552667
strcpy(txtname, pathoutname);
@@ -2669,6 +2681,7 @@ int *nii_saveDTI(char pathoutname[], int nConvert, struct TDCMsort dcmSort[], st
26692681
fprintf(fp, "\n");
26702682
}
26712683
fclose(fp);
2684+
#endif // USING_DCM2NIIXFSWRAPPER
26722685
#endif
26732686
}
26742687
if (numDti < 1)
@@ -8566,6 +8579,7 @@ int saveDcm2NiiCore(int nConvert, struct TDCMsort dcmSort[], struct TDICOMdata d
85668579
return EXIT_SUCCESS;
85678580
}
85688581
#else
8582+
// opts.numSeries equals to 1
85698583
double seriesNum = (double)dcmList[dcmSort[0].indx].seriesUidCrc;
85708584
if (!isSameDouble(opts.seriesNumber[0], seriesNum))
85718585
return EXIT_SUCCESS;
@@ -9384,6 +9398,8 @@ int singleDICOM(struct TDCMopts *opts, char *fname) {
93849398
dcmList[0].converted2NII = 1;
93859399
dcmList[0] = readDICOMx(nameList.str[0], &prefs, dti4D); // ignore compile warning - memory only freed on first of 2 passes
93869400
// dcmList[0] = readDICOMv(nameList.str[0], opts->isVerbose, opts->compressFlag, dti4D); //ignore compile warning - memory only freed on first of 2 passes
9401+
if (opts->isIgnoreSeriesInstanceUID)
9402+
dcmList[0].seriesUidCrc = dcmList[0].seriesNum;
93879403
fillTDCMsort(dcmSort[0], 0, dcmList[0]);
93889404
int ret = saveDcm2Nii(1, dcmSort, dcmList, &nameList, *opts, dti4D);
93899405
freeNameList(nameList);
@@ -10587,14 +10603,18 @@ void dcmListDump(int nConvert, struct TDCMsort dcmSort[], struct TDICOMdata dcmL
1058710603
memset(mrifsStruct.dicomlst[i], 0, strlen(nameList->str[indx]) + 1);
1058810604
memcpy(mrifsStruct.dicomlst[i], nameList->str[indx], strlen(nameList->str[indx]));
1058910605

10590-
FILE *fp = stdout;
10591-
const char *imagelist = getenv("MGH_DCMUNPACK_IMAGELIST");
10592-
if (imagelist != NULL)
10593-
fp = fopen(imagelist, "a");
10606+
FILE *fp = stdout;
10607+
const char *imagelist = getenv("MGH_DCMUNPACK_IMAGELIST");
10608+
if (imagelist != NULL)
10609+
fp = fopen(imagelist, "a");
10610+
1059410611
fprintf(fp, "%s %ld %s %s %f %f %f %f\\%f %c %f %s %s\n",
1059510612
dcmList[indx].patientName, dcmList[indx].seriesNum, dcmList[indx].studyDate, dcmList[indx].studyTime,
1059610613
dcmList[indx].TE, dcmList[indx].TR, dcmList[indx].flipAngle, dcmList[indx].xyzMM[1], dcmList[indx].xyzMM[2],
1059710614
dcmList[indx].phaseEncodingRC, dcmList[indx].pixelBandwidth, nameList->str[indx], dcmList[indx].imageType);
10615+
10616+
if (fp != stdout)
10617+
fclose(fp);
1059810618
}
1059910619
}
1060010620
#endif

console/nii_dicom_batch.h

+1
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ void readIniFile(struct TDCMopts *opts, const char *argv[]);
9696
int nii_saveNIIx(char *niiFilename, struct nifti_1_header hdr, unsigned char *im, struct TDCMopts opts);
9797
int nii_loadDir(struct TDCMopts *opts);
9898
int nii_loadDirCore(char *indir, struct TDCMopts *opts);
99+
int singleDICOM(struct TDCMopts *opts, char *fname);
99100
void nii_SaveBIDS(char pathoutname[], struct TDICOMdata d, struct TDCMopts opts, struct nifti_1_header *h, const char *filename);
100101
int nii_createFilename(struct TDICOMdata dcm, char *niiFilename, struct TDCMopts opts);
101102
void nii_createDummyFilename(char *niiFilename, struct TDCMopts opts);

0 commit comments

Comments
 (0)