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