Doxygen Source Code Documentation
plug_stavg.c File Reference
#include "afni.h"
Go to the source code of this file.
Defines | |
#define | TEST_VOXEL 6177 |
#define | TEST_TIME 0 |
#define | RMB_DEBUG 0 |
#define | _STAVG_NUM_METHODS (sizeof(method_strings)/sizeof(char *)) |
#define | _STAVG_METH_MEAN 0 |
#define | _STAVG_METH_SIGMA 1 |
#define | FREEUP(x) if((x) != NULL){free((x)); (x)=NULL;} |
#define | FREE_WORKSPACE |
Functions | |
char * | STAVG_main (PLUGIN_interface *) |
float ** | avg_epochs (THD_3dim_dataset *dset, float *ref, int user_maxlength, int no1, int meth, PLUGIN_interface *plint) |
MRI_IMARR * | dset_to_mri (THD_3dim_dataset *dset) |
DEFINE_PLUGIN_PROTOTYPE PLUGIN_interface * | PLUGIN_init (int ncall) |
Variables | |
char | helpstring [] |
char * | yes_no_strings [] = { "No" , "Yes" } |
char * | method_strings [] = { "Mean" , "Sigma" } |
PLUGIN_interface * | global_plint = NULL |
int | M_maxlength |
Define Documentation
|
Definition at line 44 of file plug_stavg.c. Referenced by avg_epochs(), and PLUGIN_init(). |
|
Definition at line 45 of file plug_stavg.c. Referenced by avg_epochs(). |
|
Definition at line 43 of file plug_stavg.c. Referenced by PLUGIN_init(), and STAVG_main(). |
|
Value: Definition at line 205 of file plug_stavg.c. Referenced by STAVG_main(). |
|
Definition at line 203 of file plug_stavg.c. |
|
Definition at line 15 of file plug_stavg.c. |
|
Definition at line 14 of file plug_stavg.c. |
|
Definition at line 13 of file plug_stavg.c. |
Function Documentation
|
Definition at line 479 of file plug_stavg.c. References _STAVG_METH_MEAN, _STAVG_METH_SIGMA, THD_3dim_dataset::daxes, DSET_BRICK_FACTOR, DSET_BRICK_TYPE, DSET_load, DSET_NUM_TIMES, dset_to_mri(), DSET_unload, free, FREE_IMARR, IMAGE_IN_IMARR, M_maxlength, malloc, MRI_FLOAT_PTR, mri_to_float(), THD_dataxes::nxx, THD_dataxes::nyy, nz, THD_dataxes::nzz, PLUTO_popup_meter(), PLUTO_set_meter(), and ref. Referenced by STAVG_main().
00483 { 00484 00485 int numepochs, lastindex; 00486 int nvox, numims, nx, ny, nz; 00487 int kim, ne, te, tinc, nia; 00488 int ii, kk; 00489 int maxlength, minlength; 00490 int datum; 00491 float fac; /* scaling factor for current subbrick */ 00492 double scaledval; /* temp var for scaled value to be used repeatedly */ 00493 float ** fxar; 00494 float ** outar; /* output averaged time-series */ 00495 float * sumsq = NULL; /* sum of squared voxel values */ 00496 float * pNumAvg; /* array for number of pts to avg at each time*/ 00497 int * pTimeIndex; /* array of time markers (1st img of each epoch) */ 00498 int * pEpochLength; /* array of epoch lengths */ 00499 float ** tempar; 00500 MRI_IMARR *inimar; 00501 00502 00503 nx = dset->daxes->nxx; 00504 ny = dset->daxes->nyy; 00505 nz = dset->daxes->nzz; 00506 nvox = dset->daxes->nxx * dset->daxes->nyy * dset->daxes->nzz; 00507 numims = DSET_NUM_TIMES(dset); 00508 datum = DSET_BRICK_TYPE( dset , 0 ) ; /* get old dataset datum type */ 00509 00510 PLUTO_popup_meter(plint) ; 00511 00512 DSET_load(dset); 00513 00514 inimar = dset_to_mri(dset); 00515 if( inimar == NULL ) return NULL ; 00516 00517 fxar = (float **) malloc( sizeof( float *) * numims); 00518 if( datum == MRI_float){ 00519 for( kk=0; kk<numims; kk++){ 00520 fxar[kk] = MRI_FLOAT_PTR(IMAGE_IN_IMARR(inimar,kk)); 00521 } 00522 } 00523 else{ 00524 for( kk=0; kk<numims; kk++){ 00525 fxar[kk] = MRI_FLOAT_PTR(mri_to_float(IMAGE_IN_IMARR(inimar,kk))); 00526 } 00527 } 00528 00529 nia = 0; /* number of images (timepoints) averaged where num epochs > 1*/ 00530 00531 if( RMB_DEBUG ) fprintf(stderr, "Start stavg\n"); 00532 00533 /* determine number of epochs to average */ 00534 if( RMB_DEBUG ) fprintf(stderr, "Determining number of epochs..."); 00535 numepochs = 1; 00536 for( kim=0; kim < numims; kim++ ){ 00537 if( ref[kim] > 0) numepochs++; 00538 } 00539 if( RMB_DEBUG ) fprintf(stderr, "done\n"); 00540 00541 /* set array of epoch lengths */ 00542 if( RMB_DEBUG ) fprintf(stderr, "Set array of epoch lengths..."); 00543 pEpochLength = (int *)malloc(sizeof(int) * numepochs); 00544 for( ne=0; ne < numepochs; ne++) pEpochLength[ne] = 0; 00545 ne = 0; 00546 for( kim=0; kim < numims; kim++ ){ 00547 if( ref[kim] > 0) ne++; 00548 pEpochLength[ne]++; 00549 } 00550 if( RMB_DEBUG ) fprintf(stderr, "done\n"); 00551 00552 /* set array of time markers (1st img of each epoch) */ 00553 if( RMB_DEBUG ) fprintf(stderr, "Set array of time markers..."); 00554 pTimeIndex = (int *)malloc(sizeof(int) * (numepochs - 1)); 00555 lastindex = 0; 00556 minlength = numims; 00557 maxlength = 0; 00558 for( ne=0; ne < (numepochs-1); ne++){ 00559 pTimeIndex[ne] = lastindex + pEpochLength[ne]; 00560 lastindex = pTimeIndex[ne]; 00561 if(pEpochLength[ne+1] > maxlength) maxlength = pEpochLength[ne+1]; 00562 if(pEpochLength[ne+1] < minlength) minlength = pEpochLength[ne+1]; 00563 } 00564 if( RMB_DEBUG ) fprintf(stderr, "done\n"); 00565 00566 if(maxlength > user_maxlength) maxlength = user_maxlength; 00567 00568 if( RMB_DEBUG ) fprintf(stderr, "init..."); 00569 pNumAvg = (float *) malloc( sizeof(float) * maxlength); 00570 outar = (float **) malloc( sizeof(float *) * maxlength); 00571 for( te=0; te < maxlength; te++){ 00572 outar[te] = (float *) malloc( sizeof(float) * nvox); 00573 for( ii=0; ii<nvox; ii++){ 00574 outar[te][ii] = 0.0; 00575 } 00576 } 00577 if (meth == _STAVG_METH_SIGMA) { 00578 sumsq = (float *) malloc( sizeof(float) * nvox); 00579 } 00580 if( RMB_DEBUG ) fprintf(stderr, "done\n"); 00581 00582 if( RMB_DEBUG ) fprintf(stderr, "Start averaging..."); 00583 for( te=0; te < maxlength; te++){ 00584 pNumAvg[te] = 0.0; 00585 00586 switch(meth) { 00587 default: case _STAVG_METH_MEAN: 00588 00589 for( ne=0; ne < (numepochs-1); ne++){ 00590 tinc = pTimeIndex[ne] + te; 00591 if( te < pEpochLength[ne+1] ){ 00592 fac = DSET_BRICK_FACTOR(dset, tinc); 00593 if (fac == 0.0 || fac == 1.0) { 00594 for( ii=0; ii<nvox; ii++){ 00595 outar[te][ii] += fxar[tinc][ii]; 00596 } 00597 } else { 00598 for( ii=0; ii<nvox; ii++){ 00599 outar[te][ii] += fxar[tinc][ii] * fac; 00600 } 00601 } 00602 pNumAvg[te]++; 00603 } 00604 } 00605 for( ii=0; ii<nvox; ii++){ 00606 outar[te][ii] = outar[te][ii]/pNumAvg[te]; 00607 } 00608 break; 00609 00610 case _STAVG_METH_SIGMA: 00611 00612 /* sigma statistic is actually the unbiased standard deviation 00613 calculated with this computational formula: 00614 sqrt( (sum(x^2) - sum(x)^2 / n) / (n-1) ) */ 00615 for( ii=0; ii<nvox; ii++){ 00616 sumsq[ii] = 0.0; 00617 } 00618 for( ne=0; ne < (numepochs-1); ne++){ 00619 tinc = pTimeIndex[ne] + te; 00620 if( te < pEpochLength[ne+1] ){ 00621 fac = DSET_BRICK_FACTOR(dset, tinc); 00622 if (fac == 0.0 || fac == 1.0) { 00623 for( ii=0; ii<nvox; ii++){ 00624 outar[te][ii] += fxar[tinc][ii]; 00625 sumsq[ii] += fxar[tinc][ii] * fxar[tinc][ii]; 00626 } 00627 } else { 00628 for( ii=0; ii<nvox; ii++){ 00629 scaledval = fxar[tinc][ii] * fac; 00630 outar[te][ii] += scaledval; 00631 sumsq[ii] += scaledval * scaledval; 00632 } 00633 } 00634 pNumAvg[te]++; 00635 } 00636 } 00637 for( ii=0; ii<nvox; ii++){ 00638 outar[te][ii] = sqrt( (sumsq[ii] - 00639 outar[te][ii] * outar[te][ii] / 00640 pNumAvg[te]) / 00641 (pNumAvg[te] - 1) ); 00642 } 00643 break; 00644 00645 } 00646 00647 if( pNumAvg[te] > 1) nia ++; 00648 PLUTO_set_meter(plint, (100*(te+1))/maxlength ) ; 00649 } 00650 if( RMB_DEBUG ) fprintf(stderr, "done\n"); 00651 if ( no1 ){ /* ignore images with only one average */ 00652 if( nia < maxlength) maxlength = nia; 00653 } 00654 00655 M_maxlength = maxlength; 00656 00657 00658 if( RMB_DEBUG ) fprintf(stderr, "malloc output..."); 00659 tempar = (float **) malloc(sizeof(float *) * maxlength); 00660 for( te=0 ; te < maxlength ; te++ ){ 00661 tempar[te] = (float *) malloc( sizeof(float) * nvox); 00662 } 00663 if( RMB_DEBUG ) fprintf(stderr, "done\n"); 00664 00665 if( RMB_DEBUG ) fprintf(stderr, "convert to output..."); 00666 for( te=0; te < maxlength; te++){ 00667 for( ii=0; ii<nvox; ii++){ 00668 tempar[te][ii] = outar[te][ii]; 00669 } 00670 } 00671 if( RMB_DEBUG ) fprintf(stderr, "done\n"); 00672 00673 /* toss arrays */ 00674 if( RMB_DEBUG ) fprintf(stderr, "free mem..."); 00675 FREE_IMARR( inimar ); 00676 if (meth == _STAVG_METH_SIGMA) free(sumsq); 00677 free( outar ); 00678 free( pNumAvg ); 00679 free( pTimeIndex ); 00680 free( pEpochLength ); 00681 if( RMB_DEBUG ) fprintf(stderr, "done\n"); 00682 DSET_unload(dset); 00683 00684 return(tempar); 00685 } |
|
Definition at line 689 of file plug_stavg.c. References ADDTO_IMARR, THD_3dim_dataset::daxes, DSET_ARRAY, DSET_BRICK_TYPE, DSET_NUM_TIMES, fout, IMARR_SUBIMAGE, INIT_IMARR, malloc, mri_fix_data_pointer(), mri_new_vol_empty(), THD_dataxes::nxx, THD_dataxes::nyy, nz, and THD_dataxes::nzz. Referenced by avg_epochs().
00691 { 00692 00693 int ii, kk, ntime, datum; 00694 int nvox, nx, ny, nz; 00695 int use_fac; 00696 00697 MRI_IMARR * ims_in; 00698 MRI_IMAGE * im, *temp_im; 00699 00700 00701 byte ** bptr = NULL ; /* one of these will be the array of */ 00702 short ** sptr = NULL ; /* pointers to input dataset sub-bricks */ 00703 float ** fptr = NULL ; /* (depending on input datum type) */ 00704 00705 float * fac = NULL ; /* array of brick scaling factors */ 00706 00707 float * fout; 00708 00709 00710 ntime = DSET_NUM_TIMES(dset) ; 00711 nx = dset->daxes->nxx; 00712 ny = dset->daxes->nyy; 00713 nz = dset->daxes->nzz; 00714 nvox = dset->daxes->nxx * dset->daxes->nyy * dset->daxes->nzz ; 00715 datum = DSET_BRICK_TYPE( dset , 0 ) ; /* get dataset datum type */ 00716 00717 switch( datum ){ /* pointer type depends on input datum type */ 00718 00719 default: 00720 return NULL ; 00721 00722 /** create array of pointers into old dataset sub-bricks **/ 00723 00724 /*--------- input is bytes ----------*/ 00725 /* voxel #i at time #k is bptr[k][i] */ 00726 /* for i=0..nvox-1 and k=0..ntime-1. */ 00727 00728 case MRI_byte: 00729 bptr = (byte **) malloc( sizeof(byte *) * ntime ) ; 00730 if( bptr == NULL ) return NULL ; 00731 for( kk=0 ; kk < ntime ; kk++ ) 00732 bptr[kk] = (byte *) DSET_ARRAY(dset,kk) ; 00733 break ; 00734 00735 /*--------- input is shorts ---------*/ 00736 /* voxel #i at time #k is sptr[k][i] */ 00737 /* for i=0..nvox-1 and k=0..ntime-1. */ 00738 00739 case MRI_short: 00740 sptr = (short **) malloc( sizeof(short *) * ntime ) ; 00741 if( sptr == NULL ) return NULL ; 00742 for( kk=0 ; kk < ntime; kk++ ) 00743 sptr[kk] = (short *) DSET_ARRAY(dset,kk) ; 00744 break ; 00745 00746 /*--------- input is floats ---------*/ 00747 /* voxel #i at time #k is fptr[k][i] */ 00748 /* for i=0..nvox-1 and k=0..ntime-1. */ 00749 00750 case MRI_float: 00751 fptr = (float **) malloc( sizeof(float *) * ntime) ; 00752 if( fptr == NULL ) return NULL ; 00753 for( kk=0 ; kk < ntime; kk++ ) 00754 fptr[kk] = (float *) DSET_ARRAY(dset,kk) ; 00755 break ; 00756 00757 } /* end of switch on input type */ 00758 00759 INIT_IMARR(ims_in) ; 00760 for( kk=0 ; kk < ntime ; kk++ ){ 00761 im = mri_new_vol_empty( nx , ny , nz , datum ) ; 00762 ADDTO_IMARR(ims_in,im) ; 00763 } 00764 00765 for( kk=0 ; kk < ntime ; kk++ ){ 00766 im = IMARR_SUBIMAGE(ims_in,kk) ; 00767 00768 switch( datum ){ 00769 case MRI_byte: mri_fix_data_pointer( bptr[kk], im ) ; break ; 00770 case MRI_short: mri_fix_data_pointer( sptr[kk], im ) ; break ; 00771 case MRI_float: mri_fix_data_pointer( fptr[kk], im ) ; break ; 00772 } 00773 } 00774 00775 00776 00777 return(ims_in); 00778 } |
|
Definition at line 79 of file plug_stavg.c. References _STAVG_METH_MEAN, _STAVG_NUM_METHODS, ANAT_ALL_MASK, FUNC_FIM_MASK, global_plint, helpstring, method_strings, PLUTO_add_hint(), PLUTO_set_sequence(), STAVG_main(), and yes_no_strings.
00080 { 00081 PLUGIN_interface * plint ; /* will be the output of this routine */ 00082 00083 if( ncall > 0 ) return NULL ; /* one interfaces */ 00084 00085 /*---------------- set titles and call point ----------------*/ 00086 00087 plint = PLUTO_new_interface( "SingleTrial Avg" , 00088 "Averaging of epochs in Single Trial data" , 00089 helpstring , 00090 PLUGIN_CALL_VIA_MENU , STAVG_main ) ; 00091 00092 PLUTO_add_hint( plint , "Averaging of epochs in Single Trial data" ) ; 00093 00094 global_plint = plint ; /* make global copy */ 00095 00096 PLUTO_set_sequence( plint , "z:Birn" ) ; 00097 00098 /*--------- 1st line ---------*/ 00099 00100 PLUTO_add_option( plint , 00101 "Datasets" , /* label at left of input line */ 00102 "Datasets" , /* tag to return to plugin */ 00103 TRUE /* is this mandatory? */ 00104 ) ; 00105 00106 PLUTO_add_dataset( plint , 00107 "Input" , /* label next to button */ 00108 ANAT_ALL_MASK , /* take any anat datasets */ 00109 FUNC_FIM_MASK , /* only allow fim funcs */ 00110 DIMEN_4D_MASK | /* need 3D+time datasets */ 00111 BRICK_ALLREAL_MASK /* need real-valued datasets */ 00112 ) ; 00113 PLUTO_add_hint( plint , "Input 3d+t dataset" ) ; 00114 00115 PLUTO_add_string( plint , 00116 "Output" , /* label next to textfield */ 00117 0,NULL , /* no fixed strings to choose among */ 00118 19 /* 19 spaces for typing in value */ 00119 ) ; 00120 PLUTO_add_hint( plint , "Name of output dataset" ) ; 00121 00122 /*---------- 2nd line --------*/ 00123 00124 PLUTO_add_option( plint , 00125 "Timing" , 00126 "Timing" , 00127 TRUE 00128 ) ; 00129 00130 00131 PLUTO_add_timeseries(plint, "Stim. Timing"); 00132 PLUTO_add_hint( plint , "Stimulus Timing (0 = no task, 1 = task)" ) ; 00133 00134 PLUTO_add_number( plint , 00135 "delta" , 00136 -1000 , 00137 1000 , 00138 0 , 00139 0 , 00140 TRUE 00141 ) ; 00142 PLUTO_add_hint( plint , "Shift data timecourse by delta before splitting and averaging" ) ; 00143 00144 /*---------- 3rd line: computation ----------*/ 00145 00146 PLUTO_add_option( plint , 00147 "Compute" , /* label at left of input line */ 00148 "Compute" , /* tag to return to plugin */ 00149 TRUE /* is this mandatory? */ 00150 ) ; 00151 00152 PLUTO_add_string( plint , 00153 "Method" , /* label next to chooser button */ 00154 _STAVG_NUM_METHODS, /* number of strings in list */ 00155 method_strings , /* list of strings to choose among */ 00156 _STAVG_METH_MEAN /* index of default string */ 00157 ) ; 00158 00159 PLUTO_add_hint( plint , "Choose statistic to compute" ) ; 00160 00161 /*---------- 4th line --------*/ 00162 00163 PLUTO_add_option( plint , 00164 "Parameters" , /* label at left of input line */ 00165 "Parameters" , /* tag to return to plugin */ 00166 FALSE /* is this mandatory? */ 00167 ) ; 00168 00169 PLUTO_add_number( plint , 00170 "maxlength" , /* label next to chooser */ 00171 0 , /* smallest possible value */ 00172 1000 , /* largest possible value */ 00173 0 , /* decimal shift (none in this case) */ 00174 15 , /* default value */ 00175 TRUE /* allow user to edit value? */ 00176 ) ; 00177 PLUTO_add_hint( plint , "maximum # of timepoints of output dataset" ) ; 00178 00179 PLUTO_add_string( plint , 00180 "no1?" , /* label next to chooser button */ 00181 2 , /* number of strings to choose among */ 00182 yes_no_strings , /* list of strings to choose among */ 00183 1 /* index of default string */ 00184 ) ; 00185 00186 PLUTO_add_hint( plint , "ignore timepoints where only one image is in average" ) ; 00187 00188 00189 /*--------- done with interface setup ---------*/ 00190 00191 return plint ; 00192 } |
|
Definition at line 213 of file plug_stavg.c. References _STAVG_NUM_METHODS, abs, ADN_datum_all, ADN_malloc_type, ADN_none, ADN_ntt, ADN_nvals, ADN_prefix, avg_epochs(), DATABLOCK_MEM_MALLOC, THD_3dim_dataset::daxes, DSET_BRICK_TYPE, DSET_NUM_TIMES, DSET_NVALS_PER_TIME, DSET_TIMESTEP, DSET_TIMEUNITS, EDIT_coerce_scale_type(), EDIT_dset_items(), EDIT_empty_copy(), EDIT_substitute_brick(), fout, free, FREE_WORKSPACE, M_maxlength, malloc, method_strings, MRI_FLOAT_PTR, MRI_IMAGE::nx, THD_dataxes::nxx, THD_dataxes::nyy, nz, THD_dataxes::nzz, PLUTO_add_dset(), PLUTO_commandstring(), PLUTO_find_dset(), PLUTO_popup_meter(), PLUTO_prefix_ok(), PLUTO_set_meter(), PLUTO_string_index(), THD_delete_3dim_dataset(), tross_Append_History(), tross_Copy_History(), and yes_no_strings. Referenced by PLUGIN_init().
00214 { 00215 MCW_idcode * idc ; /* input dataset idcode */ 00216 THD_3dim_dataset * old_dset , * new_dset ; /* input and output datasets */ 00217 char * new_prefix , * str , * str2; /* strings from user */ 00218 int meth; /* chosen computation method */ 00219 int new_datum , /* control parameters */ 00220 old_datum , ntime ; 00221 00222 int te, ne, tinc, kim, nia; 00223 int numepochs, minlength, maxlength, lastindex, navgpts; 00224 int nvox , perc , new_units, old_units ; 00225 int ii, ibot,itop , kk, jj; 00226 int no1, user_maxlength, delta; 00227 int *pEpochLength, *pTimeIndex; 00228 int nx, ny, nz, npix; 00229 float *pNumAvg; 00230 float old_dtime; 00231 00232 MRI_IMAGE * stimim; 00233 00234 MRI_IMARR *avgimar; 00235 00236 byte ** bptr = NULL ; /* one of these will be the array of */ 00237 short ** sptr = NULL ; /* pointers to input dataset sub-bricks */ 00238 float ** fptr = NULL ; /* (depending on input datum type) */ 00239 00240 float * fxar = NULL ; /* array loaded from input dataset */ 00241 float * stimar = NULL ; 00242 float ** fout = NULL ; /* will be array of output floats */ 00243 00244 float * tar = NULL ; /* will be array of taper coefficients */ 00245 00246 float * nstimar; 00247 00248 /*--------------------------------------------------------------------*/ 00249 /*----- Check inputs from AFNI to see if they are reasonable-ish -----*/ 00250 00251 /*--------- go to first input line ---------*/ 00252 00253 PLUTO_next_option(plint) ; 00254 00255 idc = PLUTO_get_idcode(plint) ; /* get dataset item */ 00256 old_dset = PLUTO_find_dset(idc) ; /* get ptr to dataset */ 00257 if( old_dset == NULL ) 00258 return "*************************\n" 00259 "Cannot find Input Dataset\n" 00260 "*************************" ; 00261 00262 ntime = DSET_NUM_TIMES(old_dset) ; 00263 if( ntime < 2 ) 00264 return "*****************************\n" 00265 "Dataset has only 1 time point\n" 00266 "*****************************" ; 00267 00268 ii = DSET_NVALS_PER_TIME(old_dset) ; 00269 if( ii > 1 ) 00270 return "************************************\n" 00271 "Dataset has > 1 value per time point\n" 00272 "************************************" ; 00273 00274 old_datum = DSET_BRICK_TYPE( old_dset , 0 ) ; /* get old dataset datum type */ 00275 new_datum = old_datum; 00276 old_dtime = DSET_TIMESTEP(old_dset); 00277 old_units = DSET_TIMEUNITS(old_dset); 00278 00279 nvox = old_dset->daxes->nxx * old_dset->daxes->nyy * old_dset->daxes->nzz; 00280 npix = old_dset->daxes->nxx * old_dset->daxes->nyy; 00281 nx = old_dset->daxes->nxx; 00282 00283 00284 new_prefix = PLUTO_get_string(plint) ; /* get string item (the output prefix) */ 00285 if( ! PLUTO_prefix_ok(new_prefix) ) /* check if it is OK */ 00286 return "************************\n" 00287 "Output Prefix is illegal\n" 00288 "************************" ; 00289 00290 /*--------- go to next input line ---------*/ 00291 00292 PLUTO_next_option(plint); 00293 00294 stimim = PLUTO_get_timeseries(plint); 00295 if( stimim == NULL ) return "Please specify stimulus timing"; 00296 00297 if( stimim->nx < ntime ){ 00298 return "**************************************\n" 00299 "Not enough pts in stimulus time-series\n" 00300 "**************************************"; 00301 } 00302 00303 stimar = MRI_FLOAT_PTR(stimim); 00304 00305 00306 delta = PLUTO_get_number(plint); 00307 00308 if( abs(delta) > ntime ){ 00309 return "************************\n" 00310 "Delta shift is too large\n" 00311 "************************"; 00312 } 00313 00314 /*initialize variables if not user specified */ 00315 user_maxlength = ntime; 00316 no1 = 0; 00317 00318 /*--------- go to next input line ---------*/ 00319 00320 PLUTO_next_option(plint); 00321 00322 str = PLUTO_get_string(plint) ; /* get string item (the method) */ 00323 meth = PLUTO_string_index( str , /* find it in list it is from */ 00324 _STAVG_NUM_METHODS , 00325 method_strings ) ; 00326 00327 /*--------- see if the 4th option line is present --------*/ 00328 00329 str = PLUTO_get_optiontag( plint ) ; 00330 if( str != NULL ){ 00331 user_maxlength = (int) PLUTO_get_number(plint) ; 00332 str2 = PLUTO_get_string(plint) ; /* get string item (the method) */ 00333 no1 = PLUTO_string_index( str2 , /* find it in list it is from */ 00334 2 , 00335 yes_no_strings) ; 00336 } 00337 00338 00339 /*------------------------------------------------------*/ 00340 /*---------- At this point, the inputs are OK ----------*/ 00341 00342 PLUTO_popup_meter( plint ) ; /* popup a progress meter */ 00343 00344 /*________________[ Main Code ]_________________________*/ 00345 00346 fout = avg_epochs( old_dset, stimar, user_maxlength, 1, meth, plint ); 00347 if( fout == NULL ) return " \nError in avg_epochs() function!\n " ; 00348 00349 if( RMB_DEBUG ) fprintf(stderr, "Done with avg_epochs\n"); 00350 maxlength = M_maxlength; 00351 00352 00353 /*______________________________________________________*/ 00354 00355 00356 new_dset = EDIT_empty_copy( old_dset ) ; /* start with copy of old one */ 00357 00358 { char * his = PLUTO_commandstring(plint) ; 00359 tross_Copy_History( old_dset , new_dset ) ; 00360 tross_Append_History( new_dset , his ) ; free( his ) ; 00361 } 00362 00363 /*-- edit some of its internal parameters --*/ 00364 ii = EDIT_dset_items( 00365 new_dset , 00366 ADN_prefix , new_prefix , /* filename prefix */ 00367 ADN_malloc_type , DATABLOCK_MEM_MALLOC , /* store in memory */ 00368 ADN_datum_all , new_datum , /* atomic datum */ 00369 ADN_nvals , maxlength , /* # sub-bricks */ 00370 ADN_ntt , maxlength , /* # time points */ 00371 /* ADN_ttorg , old_dtime , */ /* time origin */ 00372 /* ADN_ttdel , old_dtime , */ /* time step */ 00373 /* ADN_ttdur , old_dtime , */ /* time duration */ 00374 /* ADN_nsl , 0 , */ /* z-axis time slicing */ 00375 /* ADN_tunits , old_units , */ /* time units */ 00376 ADN_none ) ; 00377 00378 if( ii != 0 ){ 00379 THD_delete_3dim_dataset( new_dset , False ) ; 00380 FREE_WORKSPACE ; 00381 return "***********************************\n" 00382 "Error while creating output dataset\n" 00383 "***********************************" ; 00384 } 00385 00386 00387 /*------------------------------------------------------------*/ 00388 /*------- The output is now in fout[kk][ii], 00389 for kk=0..maxlength-1 , ii=0..nvox-1. 00390 We must now put this into the output dataset -------*/ 00391 00392 switch( new_datum ){ 00393 00394 /*** output is floats is the simplest: 00395 we just have to attach the fout bricks to the dataset ***/ 00396 00397 case MRI_float: 00398 for( kk=0 ; kk < maxlength ; kk++ ) 00399 EDIT_substitute_brick( new_dset , kk , MRI_float , fout[kk] ) ; 00400 break ; 00401 00402 /*** output is shorts: 00403 we have to create a scaled sub-brick from fout ***/ 00404 00405 case MRI_short:{ 00406 short * bout ; 00407 float fac ; 00408 00409 for( kk=0 ; kk < maxlength ; kk++ ){ /* loop over sub-bricks */ 00410 00411 /*-- get output sub-brick --*/ 00412 bout = (short *) malloc( sizeof(short) * nvox ) ; 00413 if( bout == NULL ){ 00414 fprintf(stderr,"\nFinal malloc error in plug_stavg!\n\a") ; 00415 return("Final malloc error in plug_stavg!"); ; 00416 /* exit(1) ;*/ 00417 } 00418 00419 /*-- find scaling and then scale --*/ 00420 /*fac = MCW_vol_amax( nvox,1,1 , MRI_float , fout[kk] ) ;*/ 00421 fac = 1.0; 00422 EDIT_coerce_scale_type( nvox,fac , 00423 MRI_float,fout[kk] , MRI_short,bout ) ; 00424 free( fout[kk] ) ; /* don't need this anymore */ 00425 00426 /*-- put output brick into dataset, and store scale factor --*/ 00427 EDIT_substitute_brick( new_dset , kk , MRI_short , bout ) ; 00428 } 00429 } 00430 break ; 00431 00432 /*** output is bytes (byte = unsigned char) 00433 we have to create a scaled sub-brick from fout ***/ 00434 00435 case MRI_byte:{ 00436 byte * bout ; 00437 float fac ; 00438 00439 for( kk=0 ; kk < maxlength ; kk++ ){ /* loop over sub-bricks */ 00440 00441 /*-- get output sub-brick --*/ 00442 00443 bout = (byte *) malloc( sizeof(byte) * nvox ) ; 00444 if( bout == NULL ){ 00445 fprintf(stderr,"\nFinal malloc error in plug_stavg!\n\a") ; 00446 return("Final malloc error in plug_stavg!"); ; 00447 /* exit(1) ;*/ 00448 } 00449 00450 /*-- find scaling and then scale --*/ 00451 00452 fac = 1.0; 00453 EDIT_coerce_scale_type( nvox,fac , 00454 MRI_float,fout[kk] , MRI_byte,bout ) ; 00455 00456 free( fout[kk] ) ; /* don't need this anymore */ 00457 00458 /*-- put output brick into dataset, and store scale factor --*/ 00459 00460 EDIT_substitute_brick( new_dset , kk , MRI_byte , bout ) ; 00461 } 00462 00463 } 00464 break ; 00465 00466 } /* end of switch on output data type */ 00467 00468 /*-------------- Cleanup and go home ----------------*/ 00469 00470 PLUTO_set_meter( plint , 100 ) ; /* set progress meter to 100% */ 00471 00472 PLUTO_add_dset( plint , new_dset , DSET_ACTION_MAKE_CURRENT ) ; 00473 00474 FREE_WORKSPACE ; 00475 return NULL ; /* null string returned means all was OK */ 00476 } |
Variable Documentation
|
Definition at line 60 of file plug_stavg.c. Referenced by PLUGIN_init(). |
|
Initial value: "Purpose: Averaging epochs of single trial data\n" "\n" "Input items to this plugin are:\n" " Datasets: Input = 3D+time dataset to process\n" " = reference time-series\n" " Output = Prefix for new dataset\n" " Additional Parameters\n" " delta = shift timeseries by delta before splitting and averaging\n" " method = type of statistic to calculate\n" " maxlength = maximum avg ts length\n" " no1? = images w/ only one img in avg ignored\n" "Author -- RM Birn" Definition at line 23 of file plug_stavg.c. Referenced by PLUGIN_init(). |
|
Definition at line 61 of file plug_stavg.c. Referenced by avg_epochs(), and STAVG_main(). |
|
Definition at line 41 of file plug_stavg.c. Referenced by PLUGIN_init(), and STAVG_main(). |
|
Definition at line 40 of file plug_stavg.c. Referenced by PLUGIN_init(), and STAVG_main(). |