Doxygen Source Code Documentation
3dZcat.c File Reference
#include "mrilib.h"Go to the source code of this file.
Defines | |
| #define | DSUB(id) DSET_IN_3DARR(ZCAT_dsar,(id)) |
Functions | |
| void | ZCAT_read_opts (int, char **) |
| void | ZCAT_Syntax (void) |
| void | ZCAT_read_opts (int argc, char *argv[]) |
| int | main (int argc, char *argv[]) |
Variables | |
| THD_3dim_dataset_array * | ZCAT_dsar = NULL |
| int | ZCAT_nxy = -1 |
| int | ZCAT_nbrik = -1 |
| int | ZCAT_verb = 0 |
| int | ZCAT_type = -1 |
| int | ZCAT_datum = -1 |
| int | ZCAT_fscale = 0 |
| int | ZCAT_gscale = 0 |
| int | ZCAT_nscale = 0 |
| char | ZCAT_output_prefix [THD_MAX_PREFIX] = "zcat" |
Define Documentation
|
|
|
Function Documentation
|
||||||||||||
|
---------- Adapted from 3dZeropad.c by RWCox - 08 Aug 2001 ----------* Definition at line 203 of file 3dZcat.c. References addto_args(), ADN_brick_fac, ADN_datum_all, ADN_none, ADN_nsl, ADN_nxyz, ADN_prefix, ADN_type, AFNI_logger(), argc, COMPRESS_fclose(), COMPRESS_fopen_write(), DATABLOCK_MEM_MALLOC, THD_3dim_dataset::dblk, DSET_ARRAY, DSET_BRICK_FACTOR, DSET_BRICK_TYPE, DSET_BRICKNAME, DSET_BRIKNAME, DSET_delete, DSET_HEADNAME, DSET_load, DSET_LOADED, DSET_NVALS, DSET_NVOX, DSET_NX, DSET_NY, DSET_NZ, DSET_TIMESTEP, DSET_unload, DSET_write_header, DSUB, EDIT_coerce_scale_type(), EDIT_dset_items(), EDIT_empty_copy(), far, free, LOAD_IVEC3, machdep(), mainENTRY, malloc, MCW_vol_amax(), mri_datum_size(), THD_3dim_dataset_array::num, nz, PRINT_VERSION, THD_force_malloc_type(), THD_get_write_compression(), THD_is_file(), THD_load_statistics(), tross_Copy_History(), tross_Make_History(), var, ZCAT_datum, ZCAT_fscale, ZCAT_nscale, ZCAT_output_prefix, ZCAT_read_opts(), ZCAT_Syntax(), ZCAT_type, and ZCAT_verb.
00204 {
00205 int ninp , ids , iv , iz,kz,new_nz, nx,ny,nz,nxy,nxyz ;
00206 THD_3dim_dataset * new_dset=NULL , * dset ;
00207 THD_ivec3 iv_nxyz ;
00208 float * fvol , *ffac ;
00209 void * svol ;
00210 int cmode , fscale ; FILE * far ;
00211
00212 /*** read input options ***/
00213
00214 if( argc < 2 || strncmp(argv[1],"-help",4) == 0 ) ZCAT_Syntax() ;
00215
00216 /*-- addto the arglist, if user wants to --*/
00217
00218 { int new_argc ; char ** new_argv ;
00219 addto_args( argc , argv , &new_argc , &new_argv ) ;
00220 if( new_argv != NULL ){ argc = new_argc ; argv = new_argv ; }
00221 }
00222
00223 mainENTRY("3dZcat main") ; machdep() ; AFNI_logger("3dZcat",argc,argv) ;
00224 PRINT_VERSION("3dZcat") ;
00225
00226 ZCAT_read_opts( argc , argv ) ;
00227
00228 /*** create new dataset (empty) ***/
00229
00230 ninp = ZCAT_dsar->num ;
00231 if( ninp < 2 ){
00232 fprintf(stderr,"*** Must have at least 2 input datasets!\n") ; exit(1) ;
00233 }
00234
00235 new_nz = 0 ;
00236 for( ids=0 ; ids < ninp ; ids++ ) new_nz += DSET_NZ(DSUB(ids)) ;
00237
00238 if( ZCAT_verb )
00239 fprintf(stderr,"+++ Output will have %d slices\n",new_nz) ;
00240
00241 /** find 1st dataset that is time dependent, if any **/
00242
00243 for( ids=0 ; ids < ninp ; ids++ ){
00244 dset = DSUB(ids) ;
00245 if( DSET_TIMESTEP(dset) > 0.0 ) break ;
00246 }
00247 if( ids == ninp ) dset = DSUB(0) ; /* fallback position */
00248 if( ZCAT_verb )
00249 fprintf(stderr,"+++ Using %s as 'master' dataset\n",DSET_HEADNAME(dset)) ;
00250
00251 new_dset = EDIT_empty_copy( dset ) ; /* make a copy of its header */
00252
00253 tross_Copy_History( dset , new_dset ) ;
00254 tross_Make_History( "3dZcat" , argc,argv , new_dset ) ;
00255
00256 /* modify its header */
00257
00258 nx = DSET_NX(dset) ;
00259 ny = DSET_NY(dset) ; nxy = nx*ny ; nxyz = nxy*new_nz ;
00260
00261 LOAD_IVEC3( iv_nxyz , nx , ny , new_nz ) ;
00262
00263 if( ZCAT_datum < 0 ) ZCAT_datum = DSET_BRICK_TYPE(dset,0) ;
00264
00265 EDIT_dset_items( new_dset ,
00266 ADN_prefix , ZCAT_output_prefix ,
00267 ADN_type , ZCAT_type ,
00268 ADN_nxyz , iv_nxyz ,
00269 ADN_datum_all , ZCAT_datum ,
00270 ADN_nsl , 0 , /* kill time offsets */
00271 ADN_none ) ;
00272
00273 /* can't re-write existing dataset */
00274
00275 if( THD_is_file(DSET_HEADNAME(new_dset)) ){
00276 fprintf(stderr,"*** Fatal error: dataset %s already exists!\n",
00277 DSET_HEADNAME(new_dset) ) ;
00278 exit(1) ;
00279 }
00280
00281 THD_force_malloc_type( new_dset->dblk , DATABLOCK_MEM_MALLOC ) ;
00282
00283 /*-- open output BRIK file --*/
00284
00285 cmode = THD_get_write_compression() ;
00286 far = COMPRESS_fopen_write( DSET_BRICKNAME(new_dset) , cmode ) ;
00287 if( far == NULL ){
00288 fprintf(stderr,
00289 "\a\n*** cannot open output file %s\n",DSET_BRICKNAME(new_dset)) ;
00290 exit(1) ;
00291 }
00292
00293 /* make space for sub-brick scaling factors */
00294
00295 ffac = (float *) malloc(sizeof(float)*DSET_NVALS(new_dset)) ;
00296
00297 /*** Loop over output sub-bricks ***/
00298
00299 for( iv=0 ; iv < DSET_NVALS(new_dset) ; iv++ ){
00300
00301 if( ZCAT_verb )
00302 fprintf(stderr,"+++ Computing output sub-brick #%d\n",iv) ;
00303
00304 fscale = ZCAT_fscale ; /* local for this brick */
00305
00306 /* make temporary holding space */
00307
00308 fvol = (float *) malloc(sizeof(float)*nxyz) ;
00309
00310 /* loop over input datasets */
00311 /* kz = slice index in output that this input dataset starts at */
00312
00313 for( kz=ids=0 ; ids < ninp ; ids++ ){
00314
00315 dset = DSUB(ids) ; nz = DSET_NZ(dset) ; DSET_load(dset) ;
00316 if( ! DSET_LOADED(dset) ){
00317 fprintf(stderr,"*** Fatal error: can't load data from %s\n",
00318 DSET_HEADNAME(dset)) ;
00319 exit(1) ;
00320 }
00321
00322 if( ZCAT_verb == 2 )
00323 fprintf(stderr," ++ processing input %s\n",DSET_HEADNAME(dset)) ;
00324
00325 /* copy data from input to holding space, converting to float */
00326
00327 switch( DSET_BRICK_TYPE(dset,iv) ){
00328
00329 default:
00330 fprintf(stderr,
00331 "*** Illegal input brick type=%s in dataset %s\n",
00332 MRI_TYPE_name[DSET_BRICK_TYPE(dset,iv)] ,
00333 DSET_HEADNAME(dset) ) ;
00334 exit(1) ;
00335
00336 case MRI_short:{
00337 register int ii , itop = DSET_NVOX(dset) ;
00338 register short *dar = DSET_ARRAY(dset,iv) ;
00339 register float fac = DSET_BRICK_FACTOR(dset,iv) ;
00340 register float *var = fvol + kz*nxy ;
00341 if( fac == 0.0 ) fac = 1.0 ;
00342 for( ii=0 ; ii < itop ; ii++ ) var[ii] = fac*dar[ii] ;
00343 if( fac != 1.0 ) fscale = 1 ;
00344 }
00345 break ;
00346
00347 case MRI_byte:{
00348 register int ii , itop = DSET_NVOX(dset) ;
00349 register byte *dar = DSET_ARRAY(dset,iv) ;
00350 register float fac = DSET_BRICK_FACTOR(dset,iv) ;
00351 register float *var = fvol + kz*nxy ;
00352 if( fac == 0.0 ) fac = 1.0 ;
00353 for( ii=0 ; ii < itop ; ii++ ) var[ii] = fac*dar[ii] ;
00354 if( fac != 1.0 ) fscale = 1 ;
00355 }
00356 break ;
00357
00358 case MRI_float:{
00359 register int ii , itop = DSET_NVOX(dset) ;
00360 register float *dar = DSET_ARRAY(dset,iv) ;
00361 register float fac = DSET_BRICK_FACTOR(dset,iv) ;
00362 register float *var = fvol + kz*nxy ;
00363 if( fac == 0.0 ) fac = 1.0 ;
00364 for( ii=0 ; ii < itop ; ii++ ) var[ii] = fac*dar[ii] ;
00365 }
00366 break ;
00367
00368 } /* end of switch over input brick type */
00369
00370 kz += nz ; DSET_unload(dset) ;
00371
00372 } /* end of loop over input datasets */
00373
00374 /* at this point, fvol holds the correctly
00375 scaled values for the output dataset;
00376 now, must store it in the correct datum into svol;
00377 this code is lifted/adapted from 3dcalc.c */
00378
00379 switch( ZCAT_datum ){
00380
00381 default: /* should never transpire */
00382 fprintf(stderr,
00383 "*** Fatal Error ***\n"
00384 "*** Somehow ended up with -datum = %d\n",ZCAT_datum) ;
00385 exit(1) ;
00386
00387 case MRI_float: /* the trivial case */
00388 svol = (void *) fvol ;
00389 ffac[iv] = 0.0 ; /* don't need no stinking factor */
00390 break ;
00391
00392 case MRI_byte: /* harder cases: */
00393 case MRI_short:{ /* must create svol and scale to it */
00394 float gtop , fimfac ;
00395
00396 /* find largest value in fvol */
00397
00398 gtop = MCW_vol_amax( nxyz , 1 , 1 , MRI_float, fvol ) ;
00399 if( gtop == 0.0 )
00400 fprintf(stderr,"+++ Warning: output sub-brick %d is all zeros!\n",iv) ;
00401
00402 /* compute scaling factor */
00403
00404 if( fscale ){
00405 fimfac = (gtop > 0.0) ? MRI_TYPE_maxval[ZCAT_datum] / gtop : 0.0 ;
00406 } else if( !ZCAT_nscale ){
00407 fimfac = (gtop > MRI_TYPE_maxval[ZCAT_datum] || (gtop > 0.0 && gtop <= 1.0) )
00408 ? MRI_TYPE_maxval[ZCAT_datum]/ gtop : 0.0 ;
00409 } else {
00410 fimfac = 0.0 ;
00411 }
00412
00413 if( ZCAT_verb == 2 ){
00414 if( fimfac != 0.0 )
00415 fprintf(stderr," ++ Output sub-brick %d scale factor = %f\n",iv,fimfac) ;
00416 else
00417 fprintf(stderr,"+++ Output sub-brick %d: no scale factor\n" ,iv) ;
00418 }
00419
00420 /* now scale fvol into svol */
00421
00422 svol = (void *) malloc( mri_datum_size(ZCAT_datum) * nxyz ) ;
00423
00424 EDIT_coerce_scale_type( nxyz , fimfac ,
00425 MRI_float, fvol , ZCAT_datum,svol ) ;
00426
00427 free(fvol) ;
00428 ffac[iv] = (fimfac > 0.0 && fimfac != 1.0) ? 1.0/fimfac : 0.0 ;
00429 }
00430 break ;
00431 } /* end of switch on output datum type */
00432
00433 /*-- now save svol to disk --*/
00434
00435 fwrite( svol , mri_datum_size(ZCAT_datum) , nxyz , far ) ;
00436 free(svol) ;
00437
00438 } /* end of loop over output sub-bricks */
00439
00440 /*-- cleanup, and write dataset header --*/
00441
00442 if( ZCAT_verb )
00443 fprintf(stderr,"+++ Computing output sub-brick statistics\n") ;
00444
00445 for( ids=0 ; ids < ninp ; ids++ ) /* remove inputs from memory */
00446 DSET_delete( DSUB(ids) ) ;
00447
00448 COMPRESS_fclose(far) ; /* close output BRIK file */
00449 EDIT_dset_items( new_dset , /* set sub-brick factors */
00450 ADN_brick_fac,ffac ,
00451 ADN_none ) ;
00452 free(ffac) ; /* don't need ffac no more */
00453 DSET_load(new_dset) ; /* read new dataset from disk */
00454 THD_load_statistics(new_dset) ; /* compute sub-brick statistics */
00455 DSET_write_header(new_dset) ; /* write output HEAD */
00456 fprintf(stderr,"++ output dataset: %s\n",DSET_BRIKNAME(new_dset)) ;
00457
00458 exit(0) ; /* stage left */
00459 }
|
|
||||||||||||
|
Definition at line 37 of file 3dZcat.c. References ADDTO_3DARR, argc, DATABLOCK_MEM_MALLOC, THD_3dim_dataset::daxes, THD_3dim_dataset::dblk, DSET_BRICK_TYPE, DSET_NVALS, INIT_3DARR, MCW_strncpy, THD_dataxes::nxx, THD_dataxes::nyy, THD_force_malloc_type(), THD_MAX_PREFIX, THD_open_dataset(), THD_3dim_dataset::type, ZCAT_datum, ZCAT_fscale, ZCAT_gscale, ZCAT_nbrik, ZCAT_nscale, ZCAT_nxy, ZCAT_output_prefix, ZCAT_type, and ZCAT_verb. Referenced by main().
00038 {
00039 int nopt = 1 , ii ;
00040 THD_3dim_dataset * dset ;
00041
00042 INIT_3DARR(ZCAT_dsar) ; /* array of datasets */
00043
00044 while( nopt < argc ){
00045
00046 /**** -nscale ****/
00047
00048 if( strncmp(argv[nopt],"-nscale",6) == 0 ){
00049 ZCAT_gscale = ZCAT_fscale = 0 ; ZCAT_nscale = 1 ;
00050 nopt++ ; continue ;
00051 }
00052
00053 /**** -fscale ****/
00054
00055 if( strncmp(argv[nopt],"-fscale",6) == 0 ){
00056 ZCAT_fscale = 1 ; ZCAT_nscale = 0 ;
00057 nopt++ ; continue ;
00058 }
00059
00060 #if 0
00061 /**** -gscale ****/
00062
00063 if( strncmp(argv[nopt],"-gscale",6) == 0 ){
00064 ZCAT_gscale = ZCAT_fscale = 1 ; ZCAT_nscale = 0 ;
00065 nopt++ ; continue ;
00066 }
00067 #endif
00068
00069 /**** -prefix prefix ****/
00070
00071 if( strncmp(argv[nopt],"-prefix",6) == 0 ){
00072 nopt++ ;
00073 if( nopt >= argc ){
00074 fprintf(stderr,"*** need argument after -prefix!\n") ; exit(1) ;
00075 }
00076 MCW_strncpy( ZCAT_output_prefix , argv[nopt++] , THD_MAX_PREFIX ) ;
00077 continue ;
00078 }
00079
00080 /**** -verb ****/
00081
00082 if( strncmp(argv[nopt],"-verb",5) == 0 ){
00083 ZCAT_verb++ ;
00084 nopt++ ; continue ;
00085 }
00086
00087 /**** -datum type ****/
00088
00089 if( strncmp(argv[nopt],"-datum",6) == 0 ){
00090 if( ++nopt >= argc ){
00091 fprintf(stderr,"*** need an argument after -datum!\n"); exit(1);
00092 }
00093 if( strcmp(argv[nopt],"short") == 0 ) ZCAT_datum = MRI_short ;
00094 else if( strcmp(argv[nopt],"float") == 0 ) ZCAT_datum = MRI_float ;
00095 else if( strcmp(argv[nopt],"byte" ) == 0 ) ZCAT_datum = MRI_byte ;
00096 #if 0
00097 else if( strcmp(argv[nopt],"complex")== 0) ZCAT_datum = MRI_complex ;
00098 #endif
00099 else {
00100 fprintf(stderr,"*** -datum %s not supported in 3dZcat!\n",
00101 argv[nopt] ) ;
00102 exit(1) ;
00103 }
00104 nopt++ ; continue ; /* go to next arg */
00105 }
00106
00107 /**** Garbage ****/
00108
00109 if( argv[nopt][0] == '-' ){
00110 fprintf(stderr,"*** Unknown option: %s\n",argv[nopt]) ; exit(1) ;
00111 }
00112
00113 /**** read dataset ****/
00114
00115 if( ZCAT_verb )
00116 fprintf(stderr,"+++ Opening dataset %s\n",argv[nopt]) ;
00117
00118 dset = THD_open_dataset( argv[nopt++] ) ;
00119 if( dset == NULL ){
00120 fprintf(stderr,"*** Can't open dataset %s\n",argv[nopt-1]) ; exit(1) ;
00121 }
00122 THD_force_malloc_type( dset->dblk , DATABLOCK_MEM_MALLOC ) ;
00123
00124 if( ZCAT_type < 0 ) ZCAT_type = dset->type ;
00125
00126 /* check if voxel counts match, etc. */
00127
00128 ii = dset->daxes->nxx * dset->daxes->nyy ;
00129 if( ZCAT_nxy < 0 ){
00130 ZCAT_nxy = ii ;
00131 ZCAT_nbrik = DSET_NVALS(dset) ;
00132 } else if( ii != ZCAT_nxy ){
00133 fprintf(stderr,"*** Dataset %s differs in slice size from others\n",argv[nopt-1]);
00134 exit(1) ;
00135 } else if ( DSET_NVALS(dset) != ZCAT_nbrik ){
00136 fprintf(stderr,"*** Dataset %s has different number of sub-bricks\n",argv[nopt-1]) ;
00137 exit(1) ;
00138 } else if ( DSET_BRICK_TYPE(dset,0) == MRI_complex ){
00139 fprintf(stderr,"*** Dataset %s is complex-valued -- ILLEGAL\n",argv[nopt-1]) ;
00140 exit(1) ;
00141 }
00142
00143 ADDTO_3DARR(ZCAT_dsar,dset) ; /* list of datasets */
00144
00145 } /* end of loop over command line arguments */
00146
00147 return ;
00148 }
|
|
||||||||||||
|
|
|
|
Definition at line 152 of file 3dZcat.c. References MASTER_SHORTHELP_STRING. Referenced by main().
00153 {
00154 printf(
00155 "Usage: 3dZcat [options] dataset dataset ...\n"
00156 "Concatenates datasets in the slice (z) direction. Each input\n"
00157 "dataset must have the same number of voxels in each slice, and\n"
00158 "must have the same number of sub-bricks.\n"
00159 "\n"
00160 "Options:\n"
00161 " -prefix pname = Use 'pname' for the output dataset prefix name.\n"
00162 " [default='zcat']\n"
00163 " -datum type = Coerce the output data to be stored as the given\n"
00164 " type, which may be byte, short, or float.\n"
00165 " -fscale = Force scaling of the output to the maximum integer\n"
00166 " range. This only has effect if the output datum\n"
00167 " is byte or short (either forced or defaulted).\n"
00168 " This option is sometimes necessary to eliminate\n"
00169 " unpleasant truncation artifacts.\n"
00170 " -nscale = Don't do any scaling on output to byte or short datasets.\n"
00171 " This may be especially useful when operating on mask\n"
00172 " datasets whose output values are only 0's and 1's.\n"
00173 " -verb = Print out some verbositiness as the program\n"
00174 " proceeds.\n"
00175 "\n"
00176 "Command line arguments after the above are taken as input datasets.\n"
00177 "A dataset is specified using one of these forms:\n"
00178 " 'prefix+view', 'prefix+view.HEAD', or 'prefix+view.BRIK'.\n"
00179 "\n"
00180
00181 MASTER_SHORTHELP_STRING
00182
00183 "\n"
00184 "Notes:\n"
00185 "* You can use the '3dinfo' program to see how many slices a\n"
00186 " dataset comprises.\n"
00187 "* There must be at least two datasets input (otherwise, the\n"
00188 " program doesn't make much sense, does it?).\n"
00189 "* Each input dataset must have the same number of voxels in each\n"
00190 " slice, and must have the same number of sub-bricks.\n"
00191 "* This program does not deal with complex-valued datasets.\n"
00192 "* See the output of '3dZcutup -help' for a C shell script that\n"
00193 " can be used to take a dataset apart into single slice datasets,\n"
00194 " analyze them separately, and then assemble the results into\n"
00195 " new 3D datasets.\n"
00196 ) ;
00197
00198 exit(0) ;
00199 }
|
Variable Documentation
|
|
Definition at line 19 of file 3dZcat.c. Referenced by main(), and ZCAT_read_opts(). |
|
|
|
|
|
Definition at line 20 of file 3dZcat.c. Referenced by main(), and ZCAT_read_opts(). |
|
|
Definition at line 21 of file 3dZcat.c. Referenced by ZCAT_read_opts(). |
|
|
Definition at line 16 of file 3dZcat.c. Referenced by ZCAT_read_opts(). |
|
|
Definition at line 22 of file 3dZcat.c. Referenced by main(), and ZCAT_read_opts(). |
|
|
Definition at line 15 of file 3dZcat.c. Referenced by ZCAT_read_opts(). |
|
|
Definition at line 26 of file 3dZcat.c. Referenced by main(), and ZCAT_read_opts(). |
|
|
Definition at line 18 of file 3dZcat.c. Referenced by main(), and ZCAT_read_opts(). |
|
|
Definition at line 17 of file 3dZcat.c. Referenced by main(), and ZCAT_read_opts(). |