Skip to content

Commit a13677c

Browse files
committed
mris_convert/gifti.cpp
add handling of multiple overlays in single input file
1 parent a08ab49 commit a13677c

File tree

4 files changed

+44
-20
lines changed

4 files changed

+44
-20
lines changed

include/MRISurfOverlay.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ class MRISurfOverlay
110110
int __currOverlay;
111111
int __currFrame;
112112

113+
int __nframes;
113114
MRI *__overlaymri; // overlay data in MRI representation
114115
};
115116

mris_convert/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@ project(mris_convert)
22

33
include_directories(${FS_INCLUDE_DIRS})
44

5+
# to set additional debug cxxflags:
6+
# export MRIS_CONVERT_DEBUG_CXXFLAG="-D__MRISURFOVERLAY_DEBUG"
7+
# touch CMakeLists.txt to trigger re-configuration
8+
if(DEFINED ENV{MRIS_CONVERT_DEBUG_CXXFLAG})
9+
message(WARNING "additional mris_convert cxxflags: $ENV{MRIS_CONVERT_DEBUG_CXXFLAG}")
10+
add_compile_options($ENV{MRIS_CONVERT_DEBUG_CXXFLAG})
11+
endif()
12+
513
add_executable(mris_convert mris_convert.cpp)
614
add_help(mris_convert mris_convert.help.xml)
715
target_link_libraries(mris_convert utils)

utils/MRISurfOverlay.cpp

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ MRISurfOverlay::MRISurfOverlay(MRIS *mris, int noverlay, OverlayInfoStruct *pove
4646
#endif
4747
}
4848

49-
// Can't handle multi overlay in one input file
50-
std::vector<int> shape{__nVertices, 1, 1, __noverlay};
49+
// handle multi overlay in one input file
50+
__nframes = __getFrameCount();
51+
std::vector<int> shape{__nVertices, 1, 1, __nframes};
5152
__overlaymri = new MRI(shape, MRI_FLOAT);
5253
__currFrame = 0;
5354
}
@@ -125,7 +126,10 @@ int MRISurfOverlay::__readOneOverlay(int nthOverlay, int read_volume, MRIS *mris
125126
}
126127

127128
// check if we support the file format
128-
int overlayFormat = getFileFormat(__overlayInfo[nthOverlay].__foverlay);
129+
int overlayFormat = __overlayInfo[__currFrame].__format;
130+
if (overlayFormat == MRI_VOLUME_TYPE_UNKNOWN)
131+
overlayFormat = getFileFormat(__overlayInfo[nthOverlay].__foverlay);
132+
129133
if (overlayFormat == MRI_VOLUME_TYPE_UNKNOWN)
130134
{
131135
printf("ERROR MRISurfOverlay::read() - unsupported overlay input type\n");
@@ -153,25 +157,24 @@ int MRISurfOverlay::__readOneOverlay(int nthOverlay, int read_volume, MRIS *mris
153157
return ERROR_BADFILE;
154158
}
155159

160+
__overlayInfo[__currOverlay].__numframe = 1;
156161
if (tempMRI->nframes > 1)
157162
{
158-
printf("[ERROR] MRISurfOverlay::readOneOverlay() - %s has multiple frames = %d.\n", __overlayInfo[nthOverlay].__foverlay, tempMRI->nframes);
159-
return ERROR_BADFILE;
160-
// Can't handle it now, just return error
161-
//__overlayInfo[__currOverlay].__numframe = tempMRI->nframes;
162-
//printf("[INFO] MRISurfOverlay::readOneOverlay() - Each frame will be treated as one overlay.\n");
163-
//__noverlay = tempMRI->nframes;
164-
}
163+
printf("[INFO] MRISurfOverlay::readOneOverlay() - %s has multiple frames = %d.\n", __overlayInfo[nthOverlay].__foverlay, tempMRI->nframes);
165164

166-
__overlayInfo[__currOverlay].__numframe = 1;
165+
printf("[INFO] MRISurfOverlay::readOneOverlay() - Each frame will be treated as one overlay.\n");
166+
__overlayInfo[__currOverlay].__numframe = tempMRI->nframes;
167+
}
167168

168-
// copy the data to __currFrame
169-
for (int f = 0; f < __overlaymri->nframes; f++) {
169+
// copy the data to MRI frames
170+
int stframe = __overlayInfo[__currOverlay].__stframe;
171+
int endframe = __overlayInfo[__currOverlay].__stframe + __overlayInfo[__currOverlay].__numframe;
172+
for (int f = stframe; f < endframe; f++) {
170173
for (int s = 0; s < __overlaymri->depth; s++) {
171174
for (int r = 0; r < __overlaymri->height; r++) {
172175
for (int c = 0; c < __overlaymri->width; c++) {
173-
float fval = MRIgetVoxVal(tempMRI, c, r, s, 0);
174-
MRIsetVoxVal(__overlaymri, c, r, s, __currFrame, fval);
176+
float fval = MRIgetVoxVal(tempMRI, c, r, s, f-stframe);
177+
MRIsetVoxVal(__overlaymri, c, r, s, f, fval);
175178
}
176179
}
177180
}
@@ -229,7 +232,7 @@ int MRISurfOverlay::__readOldCurvature(const char *fname)
229232
FILE *fp = fopen(fname, "r");
230233
if (fp == NULL)
231234
{
232-
printf("ERROR MRISurfOverlay::__readOldCurvature(): could not open %s", fname);
235+
printf("ERROR MRISurfOverlay::__readOldCurvature(): could not open %s\n", fname);
233236
return ERROR_BADFILE;
234237
}
235238

@@ -413,6 +416,15 @@ int MRISurfOverlay::write(const char *fout, MRIS *mris, bool mergegifti)
413416
{
414417
int error = 0;
415418

419+
#ifdef __MRISURFOVERLAY_DEBUG
420+
// debug
421+
char dbgvol[1024] = {'\0'}; //"/space/papancha/2/users/yh887/fs_test/mris_convert-gifti/dbgvol.mgz";
422+
sprintf(dbgvol, "%s.dbg.mgz", fout);
423+
printf("[DEBUG] write debug __overlaymri volume as %s\n", dbgvol);
424+
mghWrite(__overlaymri, dbgvol, -1);
425+
#endif
426+
427+
416428
if (!mergegifti && __noverlay > 1)
417429
ErrorReturn(ERROR_NOFILE, (ERROR_NOFILE, "MRISurfOverlay::write() - more than one overlay to output"));
418430

utils/gifti.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2231,10 +2231,13 @@ int MRISwriteGIFTICombined(MRIS *mris, MRISurfOverlay *poverlays, const char *ou
22312231
int giftiintent = poverlays->getGIFTIIntent(n);
22322232
int stFrame = poverlays->getFirstFrameNo(n);
22332233
int endFrame = poverlays->getNumFrames(n);
2234-
const char *datatype = poverlays->getDataType(n);
2235-
int error = MRISwriteGIFTIIntent(mris, overlaymri, stFrame, endFrame, image, giftiintent, out_fname, poverlays->getOverlayFilename(n), datatype);
2236-
if (error != NO_ERROR)
2237-
return error;
2234+
for (int f = stFrame; f < endFrame; f++)
2235+
{
2236+
const char *datatype = poverlays->getDataType(n);
2237+
int error = MRISwriteGIFTIIntent(mris, overlaymri, f, f+1, image, giftiintent, out_fname, poverlays->getOverlayFilename(n), datatype);
2238+
if (error != NO_ERROR)
2239+
return error;
2240+
}
22382241
}
22392242

22402243
// make sure version is recoded before validation

0 commit comments

Comments
 (0)