@@ -15,6 +15,26 @@ MRISurfOverlay::MRISurfOverlay(MRIS *mris, int noverlay, OverlayInfoStruct *pove
15
15
for (int n = 0 ; n < __noverlay; n++)
16
16
{
17
17
__overlayInfo[n] = poverlayInfo[n];
18
+
19
+ __overlayInfo[n].__stframe = n; // assume one frame for each overlay
20
+
21
+ const char *curv_fname = __overlayInfo[n].__foverlay ;
22
+ __overlayInfo[n].__datatype = NULL ;
23
+ if (strstr (curv_fname, " .thickness" ))
24
+ __overlayInfo[n].__datatype = " Thickness" ;
25
+ else if (strstr (curv_fname, " .curv" ))
26
+ __overlayInfo[n].__datatype = " CurvatureRadial" ;
27
+ else if (strstr (curv_fname, " .sulc" ))
28
+ __overlayInfo[n].__datatype = " SulcalDepth" ;
29
+ else if (strstr (curv_fname, " .area" ))
30
+ __overlayInfo[n].__datatype = " Area" ;
31
+ else if (strstr (curv_fname, " .volume" ))
32
+ __overlayInfo[n].__datatype = " Volume" ;
33
+ else if (strstr (curv_fname, " .jacobian" ))
34
+ __overlayInfo[n].__datatype = " Jacobian" ;
35
+ else
36
+ __overlayInfo[n].__datatype = NULL ;
37
+
18
38
#if 0
19
39
memcpy(__overlayInfo[n], poverlayInfo[n], sizeof(__overlayInfo[n]));
20
40
__overlayInfo[n].__type = poverlayInfo[n]__type;
@@ -26,6 +46,7 @@ MRISurfOverlay::MRISurfOverlay(MRIS *mris, int noverlay, OverlayInfoStruct *pove
26
46
#endif
27
47
}
28
48
49
+ // Can't handle multi overlay in one input file
29
50
std::vector<int > shape{__nVertices, 1 , 1 , __noverlay};
30
51
__overlaymri = new MRI (shape, MRI_FLOAT);
31
52
__currFrame = 0 ;
@@ -43,7 +64,7 @@ MRISurfOverlay::~MRISurfOverlay()
43
64
/* static member method to return file type for the given file
44
65
*
45
66
* The following file types are considered valid overlay files:
46
- * MRI_CURV_FILE, MRI_MGH_FILE, GIFTI_FILE, MRIS_ASCII_FILE, MRIS_VTK_FILE
67
+ * MRI_CURV_FILE, MRI_MGH_FILE, GIFTI_FILE, ASCII_FILE, VTK_FILE
47
68
* For file types other than those, return MRI_VOLUME_TYPE_UNKNOWN to callers.
48
69
*
49
70
* Notes: This class only handles MRI_CURV_FILE, MRI_MGH_FILE, GIFTI_FILE now.
@@ -75,7 +96,7 @@ int MRISurfOverlay::read(int read_volume, MRIS *mris)
75
96
__currFrame = n;
76
97
__overlayInfo[n].__stframe = __currFrame;
77
98
78
- int error = readOneOverlay (n, read_volume, mris);
99
+ int error = __readOneOverlay (n, read_volume, mris);
79
100
if (error != NO_ERROR)
80
101
return error;
81
102
}
@@ -90,12 +111,12 @@ int MRISurfOverlay::read(int read_volume, MRIS *mris)
90
111
* (MRI_CURV_FILE, MRI_MGH_FILE, GIFTI_FILE).
91
112
* MRI_CURV_FILE is the new CURV format with MAGICNO. = 16777215.
92
113
*
93
- * Overlay files can also be in MRIS_ASCII_FILE, MRIS_VTK_FILE , and old CURV formats (read).
114
+ * Overlay files can also be in ASCII_FILE, VTK_FILE , and old CURV formats (read).
94
115
*
95
116
* The overlay data has 1D morphometry data (vertex-wise measures) or other per-vertex information.
96
117
* The data is read into MRI representation in this class for MRI_CURV_FILE, MRI_MGH_FILE, GIFTI_FILE.
97
118
*/
98
- int MRISurfOverlay::readOneOverlay (int nthOverlay, int read_volume, MRIS *mris)
119
+ int MRISurfOverlay::__readOneOverlay (int nthOverlay, int read_volume, MRIS *mris)
99
120
{
100
121
if (mris == NULL )
101
122
{
@@ -125,12 +146,25 @@ int MRISurfOverlay::readOneOverlay(int nthOverlay, int read_volume, MRIS *mris)
125
146
else if (overlayFormat == MRI_MGH_FILE)
126
147
{
127
148
MRI *tempMRI = mghRead (__overlayInfo[__currFrame].__foverlay , read_volume, -1 );
128
- if (tempMRI->width != __nVertices || tempMRI->height != 1 || tempMRI->depth != 1 || tempMRI-> nframes != 1 )
149
+ if (tempMRI->width != __nVertices || tempMRI->height != 1 || tempMRI->depth != 1 )
129
150
{
130
- printf (" ERROR MRISurfOverlay::readOneOverlay() - wrong MRI_MGH_FILE dimension (%s)\n " , __overlayInfo[nthOverlay].__foverlay );
151
+ printf (" [ERROR] MRISurfOverlay::readOneOverlay() - %s dimensions (%d x %d x %d) doesn't match number of surface vertices (%d)\n " ,
152
+ __overlayInfo[nthOverlay].__foverlay , tempMRI->width , tempMRI->height , tempMRI->depth , __nVertices);
131
153
return ERROR_BADFILE;
132
154
}
133
155
156
+ if (tempMRI->nframes > 1 )
157
+ {
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
+ }
165
+
166
+ __overlayInfo[__currOverlay].__numframe = 1 ;
167
+
134
168
// copy the data to __currFrame
135
169
for (int f = 0 ; f < __overlaymri->nframes ; f++) {
136
170
for (int s = 0 ; s < __overlaymri->depth ; s++) {
@@ -144,18 +178,18 @@ int MRISurfOverlay::readOneOverlay(int nthOverlay, int read_volume, MRIS *mris)
144
178
}
145
179
MRIfree (&tempMRI);
146
180
147
- __overlayInfo[__currOverlay].__numframe = __overlaymri->nframes ;
148
181
__copyOverlay2MRIS (mris);
149
182
}
150
183
else if (overlayFormat == GIFTI_FILE)
151
184
{
152
- // ??? only one SHAPE and <STATS> is handled ???
185
+ // after read,
186
+ // first SHAPE is saved in mris->curv;
187
+ // first <STATS> is saved in mris->val and mris->stat;
188
+ // all SHAPE and <STATS> data arrays are saved as multi-frame MRI
189
+ int currFrame_saved = __currFrame;
153
190
mrisReadGIFTIfile (__overlayInfo[__currFrame].__foverlay , mris, __overlaymri, &__currFrame);
154
191
155
- // ??? multiple frames ???
156
- __overlayInfo[__currOverlay].__numframe = 1 ;
157
- // else
158
- // __overlaymri = MRISreadGiftiAsMRI(__foverlay, read_volume);
192
+ __overlayInfo[__currOverlay].__numframe = (__currFrame - currFrame_saved);
159
193
}
160
194
else if (overlayFormat == ASCII_FILE)
161
195
{
@@ -424,13 +458,10 @@ int MRISurfOverlay::write(const char *fout, MRIS *mris, bool mergegifti)
424
458
}
425
459
else if (outtype == GIFTI_FILE)
426
460
{
427
- // MRISwriteGIFTICombined(mris, fout, __overlaymri, __noverlay, __overlayInfo);
428
461
if (mergegifti)
429
462
MRISwriteGIFTICombined (mris, this , fout);
430
463
else
431
464
{
432
- int giftiintent = getGIFTIIntent (0 );
433
-
434
465
/* ???__foverlay will be read again in MRISwriteGIFTI() why???
435
466
* ...
436
467
* if (intent_code == NIFTI_INTENT_SHAPE) {
@@ -442,6 +473,7 @@ int MRISurfOverlay::write(const char *fout, MRIS *mris, bool mergegifti)
442
473
* ...
443
474
* }
444
475
*/
476
+ int giftiintent = getGIFTIIntent (0 );
445
477
error = MRISwriteGIFTI (mris, giftiintent, fout, __overlayInfo[0 ].__foverlay );
446
478
}
447
479
}
0 commit comments