1 /*****************************************************************************
2 Major portions of this software are copyrighted by the Medical College
3 of Wisconsin, 1994-2000, and are released under the Gnu General Public
4 License, Version 2. See the file README.Copyright for details.
5 ******************************************************************************/
6
7 #include "mrilib.h"
8 #include "thd.h"
9
10 /*---------------------------------------------------------------------------*/
11
THD_copy_datablock_auxdata(THD_datablock * old_dblk,THD_datablock * new_dblk)12 void THD_copy_datablock_auxdata( THD_datablock *old_dblk, THD_datablock *new_dblk )
13 {
14 int new_nvals , old_nvals , min_nvals , iv,kv , ibr ;
15
16 ENTRY("THD_copy_datablock_auxdata") ;
17
18 if( ! ISVALID_DATABLOCK(new_dblk) ) EXRETURN ;
19
20 new_nvals = new_dblk->nvals ;
21
22 if( new_dblk->brick_lab != NULL ){
23 for( ibr=0 ; ibr < new_nvals ; ibr++ ) myRwcFree( new_dblk->brick_lab[ibr] ) ;
24 myRwcFree( new_dblk->brick_lab ) ;
25 }
26
27 if( new_dblk->brick_keywords != NULL ){
28 for( ibr=0 ; ibr < new_nvals ; ibr++ ) myRwcFree( new_dblk->brick_keywords[ibr] ) ;
29 myRwcFree( new_dblk->brick_keywords ) ;
30 }
31
32 if( new_dblk->brick_statcode != NULL )
33 myRwcFree( new_dblk->brick_statcode ) ;
34
35 if( new_dblk->brick_stataux != NULL ){
36 for( ibr=0 ; ibr < new_nvals ; ibr++ ) myRwcFree( new_dblk->brick_stataux[ibr] ) ;
37 myRwcFree( new_dblk->brick_stataux ) ;
38 }
39
40 new_dblk->brick_lab = NULL ;
41 new_dblk->brick_keywords = NULL ;
42 new_dblk->brick_statcode = NULL ;
43 new_dblk->brick_stataux = NULL ;
44
45 STATUS("finish nulling") ;
46
47 if( ! ISVALID_DATABLOCK(old_dblk) ) EXRETURN ;
48
49 old_nvals = old_dblk->nvals ;
50 min_nvals = (old_nvals < new_nvals) ? old_nvals : new_nvals ;
51
52 STATUS("starting copy") ;
53
54 if( old_dblk->brick_lab != NULL ){
55 STATUS("copy labels") ;
56 THD_init_datablock_labels( new_dblk ) ;
57 for( iv=0 ; iv < min_nvals ; iv++ )
58 THD_store_datablock_label( new_dblk , iv , old_dblk->brick_lab[iv] ) ;
59 }
60
61 if( old_dblk->brick_keywords != NULL ){
62 STATUS("copy keywords") ;
63 THD_init_datablock_keywords( new_dblk ) ;
64 for( iv=0 ; iv < min_nvals ; iv++ )
65 THD_store_datablock_keywords( new_dblk , iv , old_dblk->brick_keywords[iv] ) ;
66 }
67
68 if( old_dblk->brick_statcode != NULL ){
69 STATUS("copy statcode and stataux") ;
70 THD_init_datablock_stataux( new_dblk ) ;
71 for( iv=0 ; iv < min_nvals ; iv++ ){
72 kv = old_dblk->brick_statcode[iv] ;
73 THD_store_datablock_stataux( new_dblk , iv , kv ,
74 FUNC_need_stat_aux[kv] ,
75 old_dblk->brick_stataux[iv] ) ;
76 }
77 }
78
79 /* we may need to copy the node_list 12 Jul 2006 [rickr] */
80 if( (DBLK_IS_NI_SURF_DSET(old_dblk) || DBLK_IS_GIFTI(old_dblk)) &&
81 old_dblk->nnodes > 0 && old_dblk->node_list ){
82 STATUS("copy surface node_list") ;
83 iv = old_dblk->nnodes * sizeof(int) ;
84 new_dblk->node_list = (int *)RwcMalloc(iv) ;
85 if( new_dblk->node_list ){
86 new_dblk->nnodes = old_dblk->nnodes ;
87 memcpy( new_dblk->node_list, old_dblk->node_list, iv ) ;
88 }
89 }
90
91 #if 0 /* Overkill, you don't want 3dcalc preserving.
92 such things for example ... */
93 /* preserve label tables ZSS: Jan 2012 */
94 STATUS("copying labeltables and Atlas PointLists, if any");
95 if (!THD_copy_labeltable_atr( new_dblk, old_dblk)) {
96 WARNING_message("Failed trying to preserve labeltables");
97 }
98 #endif
99
100 EXRETURN ;
101 }
102
103 /*----------------------------------------------------------------
104 30 Nov 1997: Initialize the brick fields in a datablock.
105 ------------------------------------------------------------------*/
106
THD_init_datablock_labels(THD_datablock * dblk)107 void THD_init_datablock_labels( THD_datablock *dblk )
108 {
109 int ibr , nvals ;
110
111 if( ! ISVALID_DATABLOCK(dblk) ) return ;
112
113 nvals = dblk->nvals ;
114
115 if( dblk->brick_lab != NULL ){
116 for( ibr=0 ; ibr < nvals ; ibr++ ) myRwcFree( dblk->brick_lab[ibr] ) ;
117 myRwcFree( dblk->brick_lab ) ;
118 }
119
120 dblk->brick_lab = (char **) RwcMalloc( sizeof(char *) * nvals ) ;
121 for( ibr=0 ; ibr < nvals ; ibr++ ){
122 dblk->brick_lab[ibr] = (char *) RwcMalloc(sizeof(char)*8) ;
123 sprintf( dblk->brick_lab[ibr] , "#%d" , ibr ) ;
124 }
125
126 return ;
127 }
128
129 /*---------------------------------------------------------------------------*/
130
THD_store_datablock_label(THD_datablock * dblk,int iv,char * str)131 void THD_store_datablock_label( THD_datablock *dblk , int iv , char *str )
132 {
133 char *sss ; /* 02 Sep 2004 */
134
135 if( ! ISVALID_DATABLOCK(dblk) || iv < 0 || iv >= dblk->nvals ) return ;
136
137 if( dblk->brick_lab == NULL ) THD_init_datablock_labels( dblk ) ;
138
139 myRwcFree( dblk->brick_lab[iv] ) ;
140 if( str != NULL && str[0] != '\0' ){
141 sss = strdup(str) ;
142 /* mod 10/27/2011 - drg */
143 if( strlen(sss) >= THD_MAX_SBLABEL ) sss[THD_MAX_SBLABEL-1] = '\0' ;
144 dblk->brick_lab[iv] = RwcNewString( sss ) ;
145 free((void *)sss) ;
146 } else {
147 dblk->brick_lab[iv] = (char *) RwcMalloc(sizeof(char)*8) ;
148 sprintf( dblk->brick_lab[iv] , "#%d" , iv ) ;
149 }
150 return ;
151 }
152
153 /*---------------------------------------------------------------------------*/
154
THD_init_datablock_keywords(THD_datablock * dblk)155 void THD_init_datablock_keywords( THD_datablock *dblk )
156 {
157 int ibr , nvals ;
158
159 if( ! ISVALID_DATABLOCK(dblk) ) return ;
160
161 nvals = dblk->nvals ;
162
163 if( dblk->brick_keywords != NULL ){
164 for( ibr=0 ; ibr < nvals ; ibr++ ) myRwcFree( dblk->brick_keywords[ibr] ) ;
165 myRwcFree( dblk->brick_keywords ) ;
166 }
167
168 dblk->brick_keywords = (char **) RwcMalloc( sizeof(char *) * nvals ) ;
169 for( ibr=0 ; ibr < nvals ; ibr++ ){
170 dblk->brick_keywords[ibr] = (char *) RwcMalloc(sizeof(char)*4) ;
171 dblk->brick_keywords[ibr][0] = '\0' ;
172 }
173
174 return ;
175 }
176
177 /*---------------------------------------------------------------------------*/
178
THD_store_datablock_keywords(THD_datablock * dblk,int iv,char * str)179 void THD_store_datablock_keywords( THD_datablock *dblk, int iv, char *str )
180 {
181 if( ! ISVALID_DATABLOCK(dblk) || iv < 0 || iv >= dblk->nvals ) return ;
182
183 if( dblk->brick_keywords == NULL ) THD_init_datablock_keywords( dblk ) ;
184
185 myRwcFree( dblk->brick_keywords[iv] ) ;
186 if( str != NULL && str[0] != '\0' )
187 dblk->brick_keywords[iv] = RwcNewString( str ) ;
188 return ;
189 }
190
191 /*---------------------------------------------------------------------------*/
192
THD_append_datablock_keywords(THD_datablock * dblk,int iv,char * str)193 void THD_append_datablock_keywords( THD_datablock *dblk, int iv , char *str )
194 {
195 if( ! ISVALID_DATABLOCK(dblk) ||
196 iv < 0 || iv >= dblk->nvals || str == NULL ) return ;
197
198 if( dblk->brick_keywords == NULL ) THD_init_datablock_keywords( dblk ) ;
199
200 if( dblk->brick_keywords[iv] == NULL || dblk->brick_keywords[iv][0] == '\0' ){
201 THD_store_datablock_keywords( dblk , iv , str ) ;
202 } else if( str[0] != '\0' ){
203 int ll = strlen(dblk->brick_keywords[iv]) + strlen(str) + 6 ;
204 char *cc = (char*)RwcMalloc( sizeof(char) * ll ) ;
205 strcpy(cc,dblk->brick_keywords[iv]) ; strcat(cc," ; ") ; strcat(cc,str) ;
206 myRwcFree( dblk->brick_keywords[iv] ) ;
207 dblk->brick_keywords[iv] = cc ;
208 }
209 return ;
210 }
211
212 /*---------------------------------------------------------------------------*/
213
THD_init_datablock_stataux(THD_datablock * dblk)214 void THD_init_datablock_stataux( THD_datablock *dblk )
215 {
216 int ibr , nvals ;
217
218 if( ! ISVALID_DATABLOCK(dblk) ) return ;
219
220 nvals = dblk->nvals ;
221
222 if( dblk->brick_statcode != NULL )
223 myRwcFree( dblk->brick_statcode ) ;
224
225 if( dblk->brick_stataux != NULL ){
226 for( ibr=0 ; ibr < nvals ; ibr++ ) myRwcFree( dblk->brick_stataux[ibr] ) ;
227 myRwcFree( dblk->brick_stataux ) ;
228 }
229
230 /* initialize to emptinesssss, my precioussss */
231
232 dblk->brick_statcode = (int *) RwcMalloc( sizeof(int) * nvals ) ;
233 dblk->brick_stataux = (float **) RwcMalloc( sizeof(float *) * nvals ) ;
234 for( ibr=0 ; ibr < nvals ; ibr++ ){
235 dblk->brick_statcode[ibr] = 0 ;
236 dblk->brick_stataux[ibr] = NULL ;
237 }
238
239 return ;
240 }
241
242 /*---------------------------------------------------------------------------*/
243
THD_store_datablock_stataux(THD_datablock * dblk,int iv,int scode,int npar,float * par)244 void THD_store_datablock_stataux( THD_datablock *dblk ,
245 int iv , int scode , int npar , float *par )
246 {
247 int kv , jv ;
248
249 if( ! ISVALID_DATABLOCK(dblk) ) return ;
250 if( iv < 0 || iv >= dblk->nvals || npar < 0 ) return ;
251
252 if( dblk->brick_statcode == NULL ) THD_init_datablock_stataux( dblk ) ;
253
254 dblk->brick_statcode[iv] = scode ; /* save statcode */
255
256 if( ! FUNC_IS_STAT(scode) ) return ; /* do nothing else */
257
258 /* make space, then copy data into it */
259
260 kv = FUNC_need_stat_aux[scode] ; /* how many params we need */
261 if( npar > kv ) npar = kv ; /* how many params we have */
262
263 myRwcFree( dblk->brick_stataux[iv] ) ; /* if any old stuff, toss it */
264
265 if( kv > 0 ){
266 dblk->brick_stataux[iv] = (float *) RwcMalloc( sizeof(float) * kv ) ;
267 for( jv=0 ; jv < npar ; jv++ )
268 dblk->brick_stataux[iv][jv] = par[jv] ; /* copy in */
269 for( ; jv < kv ; jv++ )
270 dblk->brick_stataux[iv][jv] = 0.0 ; /* 0 fill */
271 }
272
273 return ;
274 }
275
276 /*---------------------------------------------------------------------------*/
277
THD_string_has(char * strbig,char * strlit)278 int THD_string_has( char *strbig , char *strlit )
279 {
280 if( strbig == NULL || strbig[0] == '\0' ||
281 strlit == NULL || strlit[0] == '\0' ) return 0 ;
282
283 return ( strstr(strbig,strlit) != NULL ) ;
284 }
285
286 /*---------------------------------------------------------------------------*/
287
THD_store_dataset_keywords(THD_3dim_dataset * dset,char * str)288 void THD_store_dataset_keywords( THD_3dim_dataset *dset , char *str )
289 {
290 if( ! ISVALID_3DIM_DATASET(dset) ) return ;
291
292 myRwcFree( dset->keywords ) ;
293 if( str != NULL && str[0] != '\0' )
294 dset->keywords = RwcNewString( str ) ;
295 return ;
296 }
297
298 /*---------------------------------------------------------------------------*/
299
THD_append_dataset_keywords(THD_3dim_dataset * dset,char * str)300 void THD_append_dataset_keywords( THD_3dim_dataset *dset , char *str )
301 {
302 if( ! ISVALID_3DIM_DATASET(dset) || str == NULL ) return ;
303
304 if( dset->keywords == NULL || dset->keywords[0] == '\0' ){
305 THD_store_dataset_keywords( dset , str ) ;
306 } else if( str[0] != '\0' ){
307 int ll = strlen(dset->keywords) + strlen(str) + 6 ;
308 char *cc = (char*)RwcMalloc( sizeof(char) * ll ) ;
309 strcpy(cc,dset->keywords) ; strcat(cc," ; ") ; strcat(cc,str) ;
310 myRwcFree( dset->keywords ) ;
311 dset->keywords = cc ;
312 }
313 return ;
314 }
315
316 /*---------------------------------------------------------------------------*/
317
THD_patch_dxyz_one(THD_3dim_dataset * dset,int iv)318 void THD_patch_dxyz_one( THD_3dim_dataset *dset , int iv )
319 {
320 float dx,dy,dz ;
321 MRI_IMAGE *qm ;
322
323 dx = fabsf(DSET_DX(dset)) ;
324 dy = fabsf(DSET_DY(dset)) ;
325 dz = fabsf(DSET_DZ(dset)) ;
326 qm = DSET_BRICK(dset,iv) ;
327 qm->dx = dx ; qm->dy = dy ; qm->dz = dz ;
328
329 return ;
330 }
331
THD_patch_dxyz_all(THD_3dim_dataset * dset)332 void THD_patch_dxyz_all( THD_3dim_dataset *dset )
333 {
334 int ii , nvals ;
335 if( !ISVALID_DSET(dset) ) return ;
336 nvals = DSET_NVALS(dset) ;
337 for( ii=0 ; ii < nvals ; ii++ ) THD_patch_dxyz_one(dset,ii) ;
338 return ;
339 }
340