TPCCLIB
Loading...
Searching...
No Matches
niftiift.c
Go to the documentation of this file.
1
6/*****************************************************************************/
7#include "tpcclibConfig.h"
8/*****************************************************************************/
9#include <stdio.h>
10#include <stdlib.h>
11#include <math.h>
12#include <string.h>
13/*****************************************************************************/
14#include "libtpcmisc.h"
15#include "libtpcimgio.h"
16/*****************************************************************************/
17#include "niftiift.h"
18/*****************************************************************************/
19
20/*****************************************************************************/
28 NIFTI_DSR *dsr,
30 IFT *ift,
32 int verbose
33) {
34 int i, n, ne=0, ret;
35 char keyname[256];
36 float f;
37
38 /* Check input */
39 if(verbose>0) printf("%s(dsr, ift)\n", __func__);
40 if(dsr==NULL || ift==NULL) return STATUS_FAULT;
41 if(ift->keyNr<1) return STATUS_INVALIDHEADER;
42 if(verbose>5) iftWrite(ift, "stdout", 0);
43
44 strcpy(keyname, "byte_order");
45 if((i=iftGet(ift, keyname, 0))>=0) {
46 if(strcasecmp(ift->item[i].value, "big")==0) {
47 dsr->byte_order=0; ne++;
48 } else if(strcasecmp(ift->item[i].value, "little")==0) {
49 dsr->byte_order=1; ne++;
50 }
51 }
52
53 strcpy(keyname, "sizeof_hdr");
54 ret=iftGetIntValue(ift, 0, keyname, &i, 0); if(ret<-1) return STATUS_UNSUPPORTED;
55 if(ret>=0 && i>=0) {dsr->h.sizeof_hdr=i; ne++;}
56
57 strcpy(keyname, "data_type");
58 if((i=iftGet(ift, keyname, 0))>=0) {
59 memcpy(dsr->h.data_type, ift->item[i].value, 10); ne++;}
60
61 strcpy(keyname, "db_name");
62 if((i=iftGet(ift, keyname, 0))>=0) {
63 memcpy(dsr->h.db_name, ift->item[i].value, 18); ne++;}
64
65 strcpy(keyname, "extents");
66 ret=iftGetIntValue(ift, 0, keyname, &i, 0); if(ret<-1) return STATUS_UNSUPPORTED;
67 if(ret>=0 && i>=0) {dsr->h.extents=i; ne++;}
68
69 strcpy(keyname, "session_error");
70 ret=iftGetIntValue(ift, 0, keyname, &i, 0); if(ret<-1) return STATUS_UNSUPPORTED;
71 if(ret>=0 && i>=0) {dsr->h.session_error=i; ne++;}
72
73 strcpy(keyname, "regular");
74 ret=iftGetIntValue(ift, 0, keyname, &i, 0); if(ret<-1) return STATUS_UNSUPPORTED;
75 if(ret>=0 && i>=0) {dsr->h.regular=i; ne++;}
76
77 strcpy(keyname, "dim_info");
78 ret=iftGetIntValue(ift, 0, keyname, &i, 0); if(ret<-1) return STATUS_UNSUPPORTED;
79 if(ret>=0 && i>=0) {dsr->h.dim_info=i; ne++;}
80
81 /* Data array dimensions */
82 strcpy(keyname, "dim");
83 if((i=iftGet(ift, keyname, 0))>=0) {
84 n=sscanf(ift->item[i].value, "%hd %hd %hd %hd %hd %hd %hd %hd",
85 &dsr->h.dim[0], &dsr->h.dim[1], &dsr->h.dim[2], &dsr->h.dim[3],
86 &dsr->h.dim[4], &dsr->h.dim[5], &dsr->h.dim[6], &dsr->h.dim[7]);
87 if(n!=8) return STATUS_UNSUPPORTED;
88 ne++;
89 }
90
91 /* Intent parameters */
92 strcpy(keyname, "intent_p1");
93 ret=iftGetFloatValue(ift, 0, keyname, &f, 0); if(ret<-1) return STATUS_UNSUPPORTED;
94 if(ret>=0 && !isnan(f)) {dsr->h.intent_p1=f; ne++;}
95 strcpy(keyname, "intent_p2");
96 ret=iftGetFloatValue(ift, 0, keyname, &f, 0); if(ret<-1) return STATUS_UNSUPPORTED;
97 if(ret>=0 && !isnan(f)) {dsr->h.intent_p2=f; ne++;}
98 strcpy(keyname, "intent_p3");
99 ret=iftGetFloatValue(ift, 0, keyname, &f, 0); if(ret<-1) return STATUS_UNSUPPORTED;
100 if(ret>=0 && !isnan(f)) {dsr->h.intent_p3=f; ne++;}
101 strcpy(keyname, "intent_code");
102 ret=iftGetIntValue(ift, 0, keyname, &i, 0); if(ret<-1) return STATUS_UNSUPPORTED;
103 if(ret>=0 && i>=0) {dsr->h.intent_code=i; ne++;}
104
105 strcpy(keyname, "datatype");
106 ret=iftGetIntValue(ift, 0, keyname, &i, 0); if(ret<-1) return STATUS_UNSUPPORTED;
107 if(ret>=0 && i>=0) {dsr->h.datatype=i; ne++;}
108
109 strcpy(keyname, "bitpix");
110 ret=iftGetIntValue(ift, 0, keyname, &i, 0); if(ret<-1) return STATUS_UNSUPPORTED;
111 if(ret>=0 && i>=0) {dsr->h.bitpix=i; ne++;}
112
113 strcpy(keyname, "slice_start");
114 ret=iftGetIntValue(ift, 0, keyname, &i, 0); if(ret<-1) return STATUS_UNSUPPORTED;
115 if(ret>=0 && i>=0) {dsr->h.slice_start=i; ne++;}
116
117 strcpy(keyname, "pixdim");
118 if((i=iftGet(ift, keyname, 0))>=0) {
119 n=sscanf(ift->item[i].value, "%f %f %f %f %f %f %f %f",
120 &dsr->h.pixdim[0], &dsr->h.pixdim[1], &dsr->h.pixdim[2],
121 &dsr->h.pixdim[3], &dsr->h.pixdim[4], &dsr->h.pixdim[5],
122 &dsr->h.pixdim[6], &dsr->h.pixdim[7]);
123 if(n!=8) return STATUS_UNSUPPORTED;
124 ne++;
125 }
126
127 strcpy(keyname, "vox_offset");
128 ret=iftGetFloatValue(ift, 0, keyname, &f, 0); if(ret<-1) return STATUS_UNSUPPORTED;
129 if(ret>=0 && !isnan(f)) {dsr->h.vox_offset=f; ne++;}
130
131 strcpy(keyname, "scl_slope");
132 ret=iftGetFloatValue(ift, 0, keyname, &f, 0); if(ret<-1) return STATUS_UNSUPPORTED;
133 if(ret>=0 && !isnan(f)) {dsr->h.scl_slope=f; ne++;}
134
135 strcpy(keyname, "scl_inter");
136 ret=iftGetFloatValue(ift, 0, keyname, &f, 0); if(ret<-1) return STATUS_UNSUPPORTED;
137 if(ret>=0 && !isnan(f)) {dsr->h.scl_inter=f; ne++;}
138
139 strcpy(keyname, "slice_end");
140 ret=iftGetIntValue(ift, 0, keyname, &i, 0); if(ret<-1) return STATUS_UNSUPPORTED;
141 if(ret>=0 && i>=0) {dsr->h.slice_end=i; ne++;}
142
143 strcpy(keyname, "slice_code");
144 ret=iftGetIntValue(ift, 0, keyname, &i, 0); if(ret<-1) return STATUS_UNSUPPORTED;
145 if(ret>=0 && i>=0) {dsr->h.slice_code=i; ne++;}
146
147 strcpy(keyname, "zyzt_units");
148 ret=iftGetIntValue(ift, 0, keyname, &i, 0); if(ret<-1) return STATUS_UNSUPPORTED;
149 if(ret>=0 && i>=0) {dsr->h.xyzt_units=i; ne++;}
150
151 strcpy(keyname, "cal_max");
152 ret=iftGetFloatValue(ift, 0, keyname, &f, 0); if(ret<-1) return STATUS_UNSUPPORTED;
153 if(ret>=0 && !isnan(f)) {dsr->h.cal_max=f; ne++;}
154
155 strcpy(keyname, "cal_min");
156 ret=iftGetFloatValue(ift, 0, keyname, &f, 0); if(ret<-1) return STATUS_UNSUPPORTED;
157 if(ret>=0 && !isnan(f)) {dsr->h.cal_min=f; ne++;}
158
159 strcpy(keyname, "slice_duration");
160 ret=iftGetFloatValue(ift, 0, keyname, &f, 0); if(ret<-1) return STATUS_UNSUPPORTED;
161 if(ret>=0 && !isnan(f)) {dsr->h.slice_duration=f; ne++;}
162
163 strcpy(keyname, "toffset");
164 ret=iftGetFloatValue(ift, 0, keyname, &f, 0); if(ret<-1) return STATUS_UNSUPPORTED;
165 if(ret>=0 && !isnan(f)) {dsr->h.toffset=f; ne++;}
166
167 strcpy(keyname, "glmax");
168 ret=iftGetIntValue(ift, 0, keyname, &i, 0); if(ret<-1) return STATUS_UNSUPPORTED;
169 if(ret>=0 && i>=0) {dsr->h.glmax=i; ne++;}
170
171 strcpy(keyname, "glmin");
172 ret=iftGetIntValue(ift, 0, keyname, &i, 0); if(ret<-1) return STATUS_UNSUPPORTED;
173 if(ret>=0 && i>=0) {dsr->h.glmin=i; ne++;}
174
175 strcpy(keyname, "descrip");
176 if((i=iftGet(ift, keyname, 0))>=0) {
177 memcpy(dsr->h.descrip, ift->item[i].value, 80); ne++;}
178
179 strcpy(keyname, "aux_file");
180 if((i=iftGet(ift, keyname, 0))>=0) {
181 memcpy(dsr->h.aux_file, ift->item[i].value, 24); ne++;}
182
183 /* Transformation parameters */
184 strcpy(keyname, "qform_code");
185 ret=iftGetIntValue(ift, 0, keyname, &i, 0); if(ret<-1) return STATUS_UNSUPPORTED;
186 if(ret>=0 && i>=0) {dsr->h.qform_code=i; ne++;}
187 strcpy(keyname, "sform_code");
188 ret=iftGetIntValue(ift, 0, keyname, &i, 0); if(ret<-1) return STATUS_UNSUPPORTED;
189 if(ret>=0 && i>=0) {dsr->h.sform_code=i; ne++;}
190 strcpy(keyname, "quatern_b");
191 ret=iftGetFloatValue(ift, 0, keyname, &f, 0); if(ret<-1) return STATUS_UNSUPPORTED;
192 if(ret>=0 && !isnan(f)) {dsr->h.quatern_b=f; ne++;}
193 strcpy(keyname, "quatern_c");
194 ret=iftGetFloatValue(ift, 0, keyname, &f, 0); if(ret<-1) return STATUS_UNSUPPORTED;
195 if(ret>=0 && !isnan(f)) {dsr->h.quatern_c=f; ne++;}
196 strcpy(keyname, "quatern_d");
197 ret=iftGetFloatValue(ift, 0, keyname, &f, 0); if(ret<-1) return STATUS_UNSUPPORTED;
198 if(ret>=0 && !isnan(f)) {dsr->h.quatern_d=f; ne++;}
199 strcpy(keyname, "qoffset_x");
200 ret=iftGetFloatValue(ift, 0, keyname, &f, 0); if(ret<-1) return STATUS_UNSUPPORTED;
201 if(ret>=0 && !isnan(f)) {dsr->h.qoffset_x=f; ne++;}
202 strcpy(keyname, "qoffset_y");
203 ret=iftGetFloatValue(ift, 0, keyname, &f, 0); if(ret<-1) return STATUS_UNSUPPORTED;
204 if(ret>=0 && !isnan(f)) {dsr->h.qoffset_y=f; ne++;}
205 strcpy(keyname, "qoffset_z");
206 ret=iftGetFloatValue(ift, 0, keyname, &f, 0); if(ret<-1) return STATUS_UNSUPPORTED;
207 if(ret>=0 && !isnan(f)) {dsr->h.qoffset_z=f; ne++;}
208
209 strcpy(keyname, "srow_x");
210 if((i=iftGet(ift, keyname, 0))>=0) {
211 n=sscanf(ift->item[i].value, "%f %f %f %f",
212 &dsr->h.srow_x[0], &dsr->h.srow_x[1],
213 &dsr->h.srow_x[2], &dsr->h.srow_x[3]);
214 if(n!=4) return STATUS_UNSUPPORTED;
215 ne++;
216 }
217 strcpy(keyname, "srow_y");
218 if((i=iftGet(ift, keyname, 0))>=0) {
219 n=sscanf(ift->item[i].value, "%f %f %f %f",
220 &dsr->h.srow_y[0], &dsr->h.srow_y[1],
221 &dsr->h.srow_y[2], &dsr->h.srow_y[3]);
222 if(n!=4) return STATUS_UNSUPPORTED;
223 ne++;
224 }
225 strcpy(keyname, "srow_z");
226 if((i=iftGet(ift, keyname, 0))>=0) {
227 n=sscanf(ift->item[i].value, "%f %f %f %f",
228 &dsr->h.srow_z[0], &dsr->h.srow_z[1],
229 &dsr->h.srow_z[2], &dsr->h.srow_z[3]);
230 if(n!=4) return STATUS_UNSUPPORTED;
231 ne++;
232 }
233
234 strcpy(keyname, "intent_name");
235 if((i=iftGet(ift, keyname, 0))>=0) {
236 memcpy(dsr->h.intent_name, ift->item[i].value, 16); ne++;}
237
238 strcpy(keyname, "magic");
239 if((i=iftGet(ift, keyname, 0))>=0) {
240 memcpy(dsr->h.magic, ift->item[i].value, 4); ne++;}
241
242 strcpy(keyname, "extension");
243 if((i=iftGet(ift, keyname, 0))>=0) {
244 memcpy(dsr->e.extension, ift->item[i].value, 4); ne++;}
245
246 if(verbose>1) printf("%d field(s) edited.\n", ne);
247 if(ne>0) return STATUS_OK;
248 return STATUS_INVALIDHEADER; // no fields were changed
249}
250/*****************************************************************************/
251
252/*****************************************************************************/
258 NIFTI_DSR *dsr,
261 IFT *ift,
263 int verbose
264) {
265 int i, ret;
266 char *cptr, tmp[1024], tmp2[256];
267
268
269 /* Check input */
270 if(verbose>0) printf("niftiHeaderToIFT(dsr, ift)\n");
271 if(dsr==NULL || ift==NULL) return STATUS_FAULT;
272
273 /* Empty IFT */
274 iftEmpty(ift);
275
276 /*
277 * Fill IFT
278 */
279
280 /* Byte order */
281 if(dsr->byte_order==0) strcpy(tmp, "big"); else strcpy(tmp, "little");
282 ret=iftPut(ift, "byte_order", tmp, NULL, 0);
283 if(ret!=0) return STATUS_UNSUPPORTED;
284
285 /* sizeof_hdr */
286 sprintf(tmp, "%d", dsr->h.sizeof_hdr);
287 ret=iftPut(ift, "sizeof_hdr", tmp, NULL, 0);
288 if(ret!=0) return STATUS_UNSUPPORTED;
289
290 /* data_type */
291 strlcpy(tmp, dsr->h.data_type, 10);
292 cptr=tmp; while(*cptr) {if(!isprint(cptr[0])) cptr[0]=' '; cptr++;}
293 ret=iftPut(ift, "data_type", tmp, NULL, 0);
294 if(ret!=0) return STATUS_UNSUPPORTED;
295
296 /* db_name */
297 strlcpy(tmp, dsr->h.db_name, 18);
298 cptr=tmp; while(*cptr) {if(!isprint(*cptr)) *cptr=' '; cptr++;}
299 ret=iftPut(ift, "db_name", tmp, NULL, 0);
300 if(ret!=0) return STATUS_UNSUPPORTED;
301
302 /* extents */
303 sprintf(tmp, "%d", dsr->h.extents);
304 ret=iftPut(ift, "extents", tmp, NULL, 0);
305 if(ret!=0) return STATUS_UNSUPPORTED;
306
307 /* session_error */
308 sprintf(tmp, "%d", dsr->h.session_error);
309 ret=iftPut(ift, "session_error", tmp, NULL, 0);
310 if(ret!=0) return STATUS_UNSUPPORTED;
311
312 /* regular */
313 sprintf(tmp, "%d", dsr->h.regular);
314 ret=iftPut(ift, "regular", tmp, NULL, 0);
315 if(ret!=0) return STATUS_UNSUPPORTED;
316
317 /* dim_info */
318 sprintf(tmp, "%d", dsr->h.dim_info);
319 ret=iftPut(ift, "dim_info", tmp, NULL, 0);
320 if(ret!=0) return STATUS_UNSUPPORTED;
321
322 /* Data array dimensions */
323 i=0; sprintf(tmp, "%d", dsr->h.dim[i]);
324 for(i=1; i<8; i++) {
325 sprintf(tmp2, " %d", dsr->h.dim[i]);
326 strcat(tmp, tmp2);
327 }
328 ret=iftPut(ift, "dim", tmp, NULL, 0);
329 if(ret!=0) return STATUS_UNSUPPORTED;
330
331 /* Intent parameters */
332 sprintf(tmp, "%g", dsr->h.intent_p1);
333 ret=iftPut(ift, "intent_p1", tmp, NULL, 0); if(ret!=0) return STATUS_UNSUPPORTED;
334 sprintf(tmp, "%g", dsr->h.intent_p2);
335 ret=iftPut(ift, "intent_p2", tmp, NULL, 0); if(ret!=0) return STATUS_UNSUPPORTED;
336 sprintf(tmp, "%g", dsr->h.intent_p3);
337 ret=iftPut(ift, "intent_p3", tmp, NULL, 0); if(ret!=0) return STATUS_UNSUPPORTED;
338 sprintf(tmp, "%d", dsr->h.intent_code);
339 ret=iftPut(ift, "intent_code", tmp, NULL, 0); if(ret!=0) return STATUS_UNSUPPORTED;
340
341 /* datatype */
342 sprintf(tmp, "%d", dsr->h.datatype);
343 if(iftPut(ift, "datatype", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
344
345 /* bitpix */
346 sprintf(tmp, "%d", dsr->h.bitpix);
347 if(iftPut(ift, "bitpix", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
348
349 /* slice_start */
350 sprintf(tmp, "%d", dsr->h.slice_start);
351 if(iftPut(ift, "slice_start", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
352
353 /* pixdim */
354 i=0; sprintf(tmp, "%g", dsr->h.pixdim[i]);
355 for(i=1; i<8; i++) {
356 sprintf(tmp2, " %g", dsr->h.pixdim[i]);
357 strcat(tmp, tmp2);
358 }
359 ret=iftPut(ift, "pixdim", tmp, NULL, 0);
360 if(ret!=0) return STATUS_UNSUPPORTED;
361
362 /* vox_offset */
363 sprintf(tmp, "%g", dsr->h.vox_offset);
364 if(iftPut(ift, "vox_offset", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
365
366 /* scl_slope */
367 sprintf(tmp, "%g", dsr->h.scl_slope);
368 if(iftPut(ift, "scl_slope", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
369
370 /* scl_inter */
371 sprintf(tmp, "%g", dsr->h.scl_inter);
372 if(iftPut(ift, "scl_inter", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
373
374 /* slice_end */
375 sprintf(tmp, "%d", dsr->h.slice_end);
376 if(iftPut(ift, "slice_end", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
377
378 /* slice_code */
379 sprintf(tmp, "%d", dsr->h.slice_code);
380 if(iftPut(ift, "slice_code", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
381
382 /* xyzt_units */
383 sprintf(tmp, "%d", dsr->h.xyzt_units);
384 if(iftPut(ift, "xyzt_units", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
385
386 /* cal_max */
387 sprintf(tmp, "%g", dsr->h.cal_max);
388 if(iftPut(ift, "cal_max", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
389
390 /* cal_min */
391 sprintf(tmp, "%g", dsr->h.cal_min);
392 if(iftPut(ift, "cal_min", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
393
394 /* slice_duration */
395 sprintf(tmp, "%g", dsr->h.slice_duration);
396 if(iftPut(ift, "slice_duration", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
397
398 /* toffset */
399 sprintf(tmp, "%g", dsr->h.toffset);
400 if(iftPut(ift, "toffset", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
401
402 /* glmax */
403 sprintf(tmp, "%d", dsr->h.glmax);
404 if(iftPut(ift, "glmax", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
405
406 /* glmin */
407 sprintf(tmp, "%d", dsr->h.glmin);
408 if(iftPut(ift, "glmin", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
409
410 /* study description */
411 strlcpy(tmp, dsr->h.descrip, 80);
412 cptr=tmp; while(*cptr) {if(!isprint(*cptr)) *cptr=' '; cptr++;}
413 if(iftPut(ift, "descrip", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
414
415 /* aux_file */
416 strlcpy(tmp, dsr->h.aux_file, 24);
417 cptr=tmp; while(*cptr) {if(!isprint(*cptr)) *cptr=' '; cptr++;}
418 if(iftPut(ift, "aux_file", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
419
420 /* Transformation parameters */
421 sprintf(tmp, "%d", dsr->h.qform_code);
422 if(iftPut(ift, "qform_code", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
423 sprintf(tmp, "%d", dsr->h.sform_code);
424 if(iftPut(ift, "sform_code", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
425 sprintf(tmp, "%g", dsr->h.quatern_b);
426 if(iftPut(ift, "quatern_b", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
427 sprintf(tmp, "%g", dsr->h.quatern_c);
428 if(iftPut(ift, "quatern_c", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
429 sprintf(tmp, "%g", dsr->h.quatern_d);
430 if(iftPut(ift, "quatern_d", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
431 sprintf(tmp, "%g", dsr->h.qoffset_x);
432 if(iftPut(ift, "qoffset_x", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
433 sprintf(tmp, "%g", dsr->h.qoffset_y);
434 if(iftPut(ift, "qoffset_y", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
435 sprintf(tmp, "%g", dsr->h.qoffset_z);
436 if(iftPut(ift, "qoffset_z", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
437
438 i=0; sprintf(tmp, "%g", dsr->h.srow_x[i]);
439 for(i=1; i<4; i++) {
440 sprintf(tmp2, " %g", dsr->h.srow_x[i]); strcat(tmp, tmp2);}
441 if(iftPut(ift, "srow_x", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
442
443 i=0; sprintf(tmp, "%g", dsr->h.srow_y[i]);
444 for(i=1; i<4; i++) {
445 sprintf(tmp2, " %g", dsr->h.srow_y[i]); strcat(tmp, tmp2);}
446 if(iftPut(ift, "srow_y", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
447
448 i=0; sprintf(tmp, "%g", dsr->h.srow_z[i]);
449 for(i=1; i<4; i++) {
450 sprintf(tmp2, " %g", dsr->h.srow_z[i]); strcat(tmp, tmp2);}
451 if(iftPut(ift, "srow_z", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
452
453 /* intent_name */
454 strlcpy(tmp, dsr->h.intent_name, 16);
455 cptr=tmp; while(*cptr) {if(!isprint(*cptr)) *cptr=' '; cptr++;}
456 if(iftPut(ift, "intent_name", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
457
458 /* Nifti magic number */
459 if(iftPut(ift, "magic", dsr->h.magic, NULL, 0)!=0) return STATUS_UNSUPPORTED;
460
461 /* Nifti header extender */
462 i=0; sprintf(tmp, "%d", dsr->e.extension[i]);
463 for(i=1; i<4; i++) {
464 sprintf(tmp2, " %d", dsr->e.extension[i]); strcat(tmp, tmp2);}
465 if(iftPut(ift, "extension", tmp, NULL, 0)!=0) return STATUS_UNSUPPORTED;
466
467 return STATUS_OK;
468}
469/*****************************************************************************/
470
471/*****************************************************************************/
int iftPut(IFT *ift, char *key, char *value, char *cmt_type, int verbose)
Definition ift.c:82
void iftEmpty(IFT *ift)
Definition ift.c:60
int iftWrite(IFT *ift, char *filename, int verbose)
Definition iftfile.c:282
int iftGetFloatValue(IFT *ift, int si, const char *key, float *value, int verbose)
Definition iftsrch.c:228
int iftGet(IFT *ift, char *key, int verbose)
Definition iftsrch.c:15
int iftGetIntValue(IFT *ift, int si, const char *key, int *value, int verbose)
Definition iftsrch.c:309
Header file for libtpcimgio.
Header file for libtpcmisc.
size_t strlcpy(char *dst, const char *src, size_t dstsize)
Definition strext.c:245
int niftiHeaderFromIFT(NIFTI_DSR *dsr, IFT *ift, int verbose)
Definition niftiift.c:25
int niftiHeaderToIFT(NIFTI_DSR *dsr, IFT *ift, int verbose)
Definition niftiift.c:256
Header file for niftiift.c.
int keyNr
Definition libtpcmisc.h:270
IFT_KEY_AND_VALUE * item
Definition libtpcmisc.h:279
short int qform_code
short int slice_start
short int slice_end
short int datatype
char aux_file[24]
char intent_name[16]
short int bitpix
char data_type[10]
short int sform_code
short int dim[8]
short int intent_code
short int session_error
NIFTI_1_HEADER h
NIFTI_EXTENDER e