00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 #define PROGRAM_NAME    "3dANOVA2"                   
00068 #define PROGRAM_AUTHOR  "B. Douglas Ward"                  
00069 #define PROGRAM_INITIAL "09 Dec 1996"     
00070 #define PROGRAM_LATEST  "02 Aug 2005"     
00071 
00072 
00073 
00074 #define SUFFIX ".3danova2"                
00075 
00076 #include "3dANOVA.h"
00077 #include "3dANOVA.lib"
00078 
00079 
00080 
00081 
00082 
00083 
00084 
00085 void display_help_menu()
00086 {
00087   printf 
00088     (
00089      "This program performs two-factor ANOVA on 3D data sets \n\n"
00090      "Usage: \n"
00091      "3dANOVA2 \n"
00092      "-type k          type of ANOVA model to be used:                      \n"
00093      "                    k=1  fixed effects model  (A and B fixed)         \n"
00094      "                    k=2  random effects model (A and B random)        \n"
00095      "                    k=3  mixed effects model  (A fixed, B random)     \n"
00096      "                                                                      \n"
00097      "-alevels a                     a = number of levels of factor A       \n"
00098      "-blevels b                     b = number of levels of factor B       \n"
00099      "-dset 1 1 filename             data set for level 1 of factor A       \n"
00100      "                                        and level 1 of factor B       \n"
00101      " . . .                           . . .                                \n"
00102      "                                                                      \n"
00103      "-dset i j filename             data set for level i of factor A       \n"
00104      "                                        and level j of factor B       \n"
00105      " . . .                           . . .                                \n"
00106      "                                                                      \n"
00107      "-dset a b filename             data set for level a of factor A       \n"
00108      "                                        and level b of factor B       \n"
00109      "                                                                      \n"
00110      "[-voxel num]                   screen output for voxel # num          \n"
00111      "[-diskspace]                   print out disk space required for      \n"
00112      "                                  program execution                   \n"
00113      "                                                                      \n"
00114      "                                                                      \n"
00115      "The following commands generate individual AFNI 2 sub-brick datasets: \n"
00116      "  (In each case, output is written to the file with the specified     \n"
00117      "   prefix file name.)                                                 \n"
00118      "                                                                      \n"
00119      "[-ftr prefix]                F-statistic for treatment effect         \n"
00120      "[-fa prefix]                 F-statistic for factor A effect          \n"
00121      "[-fb prefix]                 F-statistic for factor B effect          \n"
00122      "[-fab prefix]                F-statistic for interaction              \n"
00123      "[-amean i prefix]            estimate mean of factor A level i        \n"
00124      "[-bmean j prefix]            estimate mean of factor B level j        \n"
00125      "[-xmean i j prefix]          estimate mean of cell at level i of      \n"
00126      "                                factor A, level j of factor B         \n"
00127      "[-adiff i j prefix]          difference between levels i and j of     \n"
00128      "                                factor A                              \n"
00129      "[-bdiff i j prefix]          difference between levels i and j of     \n"
00130      "                                factor B                              \n"
00131      "[-xdiff i j k l prefix]      difference between cell mean at A=i,B=j  \n"
00132      "                                and cell mean at A=k,B=l              \n"
00133      "[-acontr c1 ... ca prefix]   contrast in factor A levels              \n"
00134      "[-bcontr c1 ... cb prefix]   contrast in factor B levels              \n"
00135      "[-xcontr c11 ... c1b c21 ... c2b  ...  ca1 ... cab  prefix]           \n"
00136      "                             contrast in cell means                   \n"
00137      "                                                                      \n"
00138      "                                                                      \n"
00139      "The following command generates one AFNI 'bucket' type dataset:       \n"
00140      "                                                                      \n"
00141      "[-bucket prefix]         create one AFNI 'bucket' dataset whose       \n"
00142      "                           sub-bricks are obtained by concatenating   \n"
00143      "                           the above output files; the output 'bucket'\n"
00144      "                           is written to file with prefix file name   \n"
00145      "\n");
00146 
00147   printf
00148     (
00149      "\n"
00150      "N.B.: For this program, the user must specify 1 and only 1 sub-brick  \n"
00151      "      with each -dset command. That is, if an input dataset contains  \n"
00152      "      more than 1 sub-brick, a sub-brick selector must be used, e.g.: \n"
00153      "      -dset 2 4 'fred+orig[3]'                                        \n"
00154      );
00155 
00156   printf("\n" MASTER_SHORTHELP_STRING ) ;
00157   
00158   exit(0);
00159 }
00160 
00161 
00162 
00163 
00164 
00165 
00166 
00167 void get_options (int argc, char ** argv, anova_options * option_data)
00168 {
00169   int nopt = 1;                  
00170   int ival, jval;                
00171   int i, j, k;                            
00172   int nij;                            
00173   float fval;                    
00174   THD_3dim_dataset * dset=NULL;             
00175   char message[MAX_NAME_LENGTH];            
00176   int n[MAX_LEVELS][MAX_LEVELS];            
00177 
00178 
00179   
00180   if (argc < 2 || strncmp(argv[1], "-help", 5) == 0)  display_help_menu();
00181 
00182   
00183   AFNI_logger (PROGRAM_NAME,argc,argv); 
00184 
00185   
00186   initialize_options (option_data);
00187 
00188   
00189   for (i = 0;  i < MAX_LEVELS;  i++)
00190     for (j = 0;  j < MAX_LEVELS;  j++)
00191       n[i][j] = 0;
00192   
00193 
00194   
00195   while (nopt < argc)
00196     {
00197 
00198       
00199       if ((option_data->xname == NULL) && (option_data->a > 0) &&
00200           (option_data->b > 0))
00201         {
00202           option_data->xname = 
00203             (char *****) malloc (sizeof(char ****) * option_data->a);
00204           for (i = 0;  i < option_data->a;  i++)
00205             {
00206               option_data->xname[i] =
00207                 (char ****) malloc (sizeof(char ***) * option_data->b);
00208               for (j = 0;  j < option_data->b;  j++)
00209                 {
00210                   option_data->xname[i][j] =
00211                     (char ***) malloc (sizeof(char **) * 1);
00212                   for (k = 0;  k < 1;  k++)
00213                     {
00214                       option_data->xname[i][j][k] =
00215                         (char **) malloc (sizeof(char *) * MAX_OBSERVATIONS);
00216                     }
00217                 }
00218             }
00219         }
00220           
00221 
00222       
00223       if( strncmp(argv[nopt],"-diskspace",5) == 0 )
00224         {
00225           option_data->diskspace = 1;
00226           nopt++ ; continue ;  
00227         }
00228 
00229       
00230       
00231       if( strncmp(argv[nopt],"-datum",5) == 0 ){
00232         if( ++nopt >= argc ) ANOVA_error("need an argument after -datum!") ;
00233         
00234         if( strcmp(argv[nopt],"short") == 0 ){
00235           option_data->datum = MRI_short ;
00236         } else if( strcmp(argv[nopt],"float") == 0 ){
00237           option_data->datum = MRI_float ;
00238         } else {
00239           char buf[256] ;
00240           sprintf(buf,"-datum of type '%s' is not supported in 3dANOVA2!",
00241                   argv[nopt] ) ;
00242           ANOVA_error(buf) ;
00243         }
00244         nopt++ ; continue ;  
00245       }
00246       
00247       
00248       
00249       if( strncmp(argv[nopt],"-session",5) == 0 ){
00250         nopt++ ;
00251         if( nopt >= argc ) ANOVA_error("need argument after -session!") ;
00252         strcpy(option_data->session , argv[nopt++]) ;
00253         continue ;
00254       }
00255       
00256       
00257       
00258       if (strncmp(argv[nopt], "-voxel", 6) == 0)
00259         {
00260           nopt++;
00261           if (nopt >= argc)  ANOVA_error ("need argument after -voxel ");
00262           sscanf (argv[nopt], "%d", &ival);
00263           if (ival <= 0)
00264             ANOVA_error ("illegal argument after -voxel ");
00265           option_data->nvoxel = ival;
00266           nopt++;
00267           continue;
00268         }
00269 
00270       
00271       
00272       if (strncmp(argv[nopt], "-type", 5) == 0)
00273         {
00274           nopt++;
00275           if (nopt >= argc)  ANOVA_error ("need argument after -type ");
00276           sscanf (argv[nopt], "%d", &ival);
00277           if ((ival < 1) || (ival > 3))
00278             ANOVA_error ("illegal argument after -type ");
00279           option_data->model = ival;
00280           nopt++;
00281           continue;
00282         }
00283       
00284       
00285       
00286       if (strncmp(argv[nopt], "-alevels", 5) == 0)
00287         {
00288           nopt++;
00289           if (nopt >= argc)  ANOVA_error ("need argument after -alevels ");
00290           sscanf (argv[nopt], "%d", &ival);
00291           if ((ival <= 0) || (ival > MAX_LEVELS))
00292             ANOVA_error ("illegal argument after -alevels ");
00293           option_data->a = ival;
00294           nopt++;
00295           continue;
00296         }
00297       
00298       
00299       
00300       if (strncmp(argv[nopt], "-blevels", 5) == 0)
00301         {
00302           nopt++;
00303           if (nopt >= argc)  ANOVA_error ("need argument after -blevels ");
00304           sscanf (argv[nopt], "%d", &ival);
00305           if ((ival <= 0) || (ival > MAX_LEVELS))
00306             ANOVA_error ("illegal argument after -blevels ");
00307           option_data->b = ival;
00308           nopt++;
00309           continue;
00310         }
00311       
00312       
00313       
00314       if (strncmp(argv[nopt], "-dset", 5) == 0)
00315         {
00316           nopt++;
00317           if (nopt+2 >= argc)  ANOVA_error ("need 3 arguments after -dset ");
00318           sscanf (argv[nopt], "%d", &ival);
00319           if ((ival <= 0) || (ival > option_data->a))
00320             ANOVA_error ("illegal argument after -dset ");
00321           
00322           nopt++;
00323           sscanf (argv[nopt], "%d", &jval);
00324           if ((jval <= 0) || (jval > option_data->b))
00325             ANOVA_error ("illegal argument after -dset ");
00326           
00327           n[ival-1][jval-1] += 1;
00328           nij = n[ival-1][jval-1];
00329           if (nij > MAX_OBSERVATIONS)
00330             ANOVA_error ("too many data files");
00331           
00332           
00333           nopt++;
00334           dset = THD_open_dataset( argv[nopt] ) ;
00335           if( ! ISVALID_3DIM_DATASET(dset) )
00336             {
00337               sprintf(message,"Unable to open dataset file %s\n", 
00338                       argv[nopt]);
00339               ANOVA_error (message);
00340             }
00341 
00342           
00343           if (DSET_NVALS(dset) != 1)
00344             {
00345              sprintf(message,"Must specify exactly 1 sub-brick for file %s\n",
00346                      argv[nopt]);
00347              ANOVA_error (message);
00348             }
00349 
00350           THD_delete_3dim_dataset( dset , False ) ; dset = NULL ;
00351           
00352           option_data->xname[ival-1][jval-1][0][nij-1] 
00353             =  malloc (sizeof(char) * MAX_NAME_LENGTH);
00354           strcpy (option_data->xname[ival-1][jval-1][0][nij-1], argv[nopt]);
00355           nopt++;
00356           continue;
00357         }
00358       
00359 
00360       
00361       if (strncmp(argv[nopt], "-ftr", 5) == 0)
00362         {
00363           nopt++;
00364           if (nopt >= argc)  ANOVA_error ("need argument after -ftr ");
00365           option_data->nftr = 1;
00366           option_data->ftrname = malloc (sizeof(char) * MAX_NAME_LENGTH);
00367           strcpy (option_data->ftrname, argv[nopt]);
00368           nopt++;
00369           continue;
00370         }
00371       
00372       
00373       
00374       if (strncmp(argv[nopt], "-fa", 5) == 0)
00375         {
00376           nopt++;
00377           if (nopt >= argc)  ANOVA_error ("need argument after -fa ");
00378           option_data->nfa = 1;
00379           option_data->faname = malloc (sizeof(char) * MAX_NAME_LENGTH);
00380           strcpy (option_data->faname, argv[nopt]);
00381           nopt++;
00382           continue;
00383         }
00384       
00385       
00386       
00387       if (strncmp(argv[nopt], "-fb", 5) == 0)
00388         {
00389           nopt++;
00390           if (nopt >= argc)  ANOVA_error ("need argument after -fb ");
00391           option_data->nfb = 1;
00392           option_data->fbname = malloc (sizeof(char) * MAX_NAME_LENGTH);
00393           strcpy (option_data->fbname, argv[nopt]);
00394           nopt++;
00395           continue;
00396         }
00397       
00398       
00399       
00400       if (strncmp(argv[nopt], "-fab", 5) == 0)
00401         {
00402           nopt++;
00403           if (nopt >= argc)  ANOVA_error ("need argument after -fab ");
00404           option_data->nfab = 1;
00405           option_data->fabname = malloc (sizeof(char) * MAX_NAME_LENGTH);
00406           strcpy (option_data->fabname, argv[nopt]);
00407           nopt++;
00408           continue;
00409         }
00410       
00411       
00412       
00413       if (strncmp(argv[nopt], "-amean", 5) == 0)
00414         {
00415           nopt++;
00416           if (nopt+1 >= argc)  ANOVA_error ("need 2 arguments after -amean ");
00417           
00418           option_data->num_ameans++;
00419           if (option_data->num_ameans > MAX_MEANS)
00420             ANOVA_error ("too many factor A level mean estimates");
00421           
00422           sscanf (argv[nopt], "%d", &ival);
00423           if ((ival <= 0) || (ival > option_data->a))
00424             ANOVA_error ("illegal argument after -amean ");
00425           option_data->ameans[option_data->num_ameans-1] = ival - 1;
00426           nopt++;
00427           
00428           option_data->amname[option_data->num_ameans-1] 
00429             =  malloc (sizeof(char) * MAX_NAME_LENGTH);
00430           strcpy (option_data->amname[option_data->num_ameans-1], argv[nopt]);
00431           nopt++;
00432           continue;
00433         }
00434       
00435       
00436       
00437       if (strncmp(argv[nopt], "-bmean", 5) == 0)
00438         {
00439           nopt++;
00440           if (nopt+1 >= argc)  ANOVA_error ("need 2 arguments after -bmean ");
00441           
00442           option_data->num_bmeans++;
00443           if (option_data->num_bmeans > MAX_MEANS)
00444             ANOVA_error ("too many factor B level mean estimates");
00445           
00446           sscanf (argv[nopt], "%d", &ival);
00447           if ((ival <= 0) || (ival > option_data->b))
00448             ANOVA_error ("illegal argument after -bmean ");
00449           option_data->bmeans[option_data->num_bmeans-1] = ival - 1;
00450           nopt++;
00451           
00452           option_data->bmname[option_data->num_bmeans-1] 
00453             =  malloc (sizeof(char) * MAX_NAME_LENGTH);
00454           strcpy (option_data->bmname[option_data->num_bmeans-1], argv[nopt]);
00455           nopt++;
00456           continue;
00457         }
00458 
00459 
00460       
00461       if (strncmp(argv[nopt], "-xmean", 5) == 0)
00462         {
00463           nopt++;
00464           if (nopt+2 >= argc)  ANOVA_error ("need 3 arguments after -xmean ");
00465           
00466           option_data->num_xmeans++;
00467           if (option_data->num_xmeans > MAX_MEANS)
00468             ANOVA_error ("too many cell mean estimates");
00469           
00470           sscanf (argv[nopt], "%d", &ival);
00471           if ((ival <= 0) || (ival > option_data->a))
00472             ANOVA_error ("illegal argument after -xmean ");
00473           option_data->xmeans[option_data->num_xmeans-1][0] = ival - 1;
00474           nopt++;
00475           
00476           sscanf (argv[nopt], "%d", &ival);
00477           if ((ival <= 0) || (ival > option_data->b))
00478             ANOVA_error ("illegal argument after -xmean ");
00479           option_data->xmeans[option_data->num_xmeans-1][1] = ival - 1;
00480           nopt++;
00481           
00482           option_data->xmname[option_data->num_xmeans-1] 
00483             =  malloc (sizeof(char) * MAX_NAME_LENGTH);
00484           strcpy (option_data->xmname[option_data->num_xmeans-1], argv[nopt]);
00485           nopt++;
00486           continue;
00487         }
00488 
00489 
00490       
00491       if (strncmp(argv[nopt], "-adiff", 5) == 0)
00492         {
00493           nopt++;
00494           if (nopt+2 >= argc)  ANOVA_error ("need 3 arguments after -adiff ");
00495           
00496           option_data->num_adiffs++;
00497           if (option_data->num_adiffs > MAX_DIFFS)
00498             ANOVA_error ("too many factor A level differences");
00499           
00500           sscanf (argv[nopt], "%d", &ival);
00501           if ((ival <= 0) || (ival > option_data->a))
00502             ANOVA_error ("illegal argument after -adiff ");
00503           option_data->adiffs[option_data->num_adiffs-1][0] = ival - 1;
00504           nopt++;
00505           
00506           sscanf (argv[nopt], "%d", &ival);
00507           if ((ival <= 0) || (ival > option_data->a))
00508             ANOVA_error ("illegal argument after -adiff ");
00509           option_data->adiffs[option_data->num_adiffs-1][1] = ival - 1;
00510           nopt++;
00511           
00512           option_data->adname[option_data->num_adiffs-1] 
00513             =  malloc (sizeof(char) * MAX_NAME_LENGTH);
00514           strcpy (option_data->adname[option_data->num_adiffs-1], argv[nopt]);
00515           nopt++;
00516           continue;
00517         }
00518       
00519       
00520       
00521       if (strncmp(argv[nopt], "-bdiff", 5) == 0)
00522         {
00523           nopt++;
00524           if (nopt+2 >= argc)  ANOVA_error ("need 3 arguments after -bdiff ");
00525           
00526           option_data->num_bdiffs++;
00527           if (option_data->num_bdiffs > MAX_DIFFS)
00528             ANOVA_error ("too many factor B level differences");
00529           
00530           sscanf (argv[nopt], "%d", &ival);
00531           if ((ival <= 0) || (ival > option_data->b))
00532             ANOVA_error ("illegal argument after -bdiff ");
00533           option_data->bdiffs[option_data->num_bdiffs-1][0] = ival - 1;
00534           nopt++;
00535           
00536           sscanf (argv[nopt], "%d", &ival);
00537           if ((ival <= 0) || (ival > option_data->b))
00538             ANOVA_error ("illegal argument after -bdiff ");
00539           option_data->bdiffs[option_data->num_bdiffs-1][1] = ival - 1;
00540           nopt++;
00541           
00542           option_data->bdname[option_data->num_bdiffs-1] 
00543             =  malloc (sizeof(char) * MAX_NAME_LENGTH);
00544           strcpy (option_data->bdname[option_data->num_bdiffs-1], argv[nopt]);
00545           nopt++;
00546           continue;
00547         }
00548       
00549       
00550       
00551       if (strncmp(argv[nopt], "-xdiff", 5) == 0)
00552         {
00553           nopt++;
00554           if (nopt+4 >= argc)  ANOVA_error ("need 5 arguments after -xdiff ");
00555           
00556           option_data->num_xdiffs++;
00557           if (option_data->num_xdiffs > MAX_DIFFS)
00558             ANOVA_error ("too many cell means differences");
00559           
00560           sscanf (argv[nopt], "%d", &ival);
00561           if ((ival <= 0) || (ival > option_data->a))
00562             ANOVA_error ("illegal argument after -xdiff ");
00563           option_data->xdiffs[option_data->num_xdiffs-1][0][0] = ival - 1;
00564           nopt++;
00565           
00566           sscanf (argv[nopt], "%d", &ival);
00567           if ((ival <= 0) || (ival > option_data->b))
00568             ANOVA_error ("illegal argument after -xdiff ");
00569           option_data->xdiffs[option_data->num_xdiffs-1][0][1] = ival - 1;
00570           nopt++;
00571           
00572           sscanf (argv[nopt], "%d", &ival);
00573           if ((ival <= 0) || (ival > option_data->a))
00574             ANOVA_error ("illegal argument after -xdiff ");
00575           option_data->xdiffs[option_data->num_xdiffs-1][1][0] = ival - 1;
00576           nopt++;
00577           
00578           sscanf (argv[nopt], "%d", &ival);
00579           if ((ival <= 0) || (ival > option_data->b))
00580             ANOVA_error ("illegal argument after -xdiff ");
00581           option_data->xdiffs[option_data->num_xdiffs-1][1][1] = ival - 1;
00582           nopt++;
00583           
00584           option_data->xdname[option_data->num_xdiffs-1] 
00585             =  malloc (sizeof(char) * MAX_NAME_LENGTH);
00586           strcpy (option_data->xdname[option_data->num_xdiffs-1], argv[nopt]);
00587           nopt++;
00588           continue;
00589         }
00590       
00591       
00592       
00593       if (strncmp(argv[nopt], "-acontr", 5) == 0)
00594         {
00595           nopt++;
00596           if (nopt + option_data->a >= argc)  
00597             ANOVA_error ("need a+1 arguments after -acontr ");
00598           
00599           option_data->num_acontr++;
00600           if (option_data->num_acontr > MAX_CONTR)
00601             ANOVA_error ("too many factor A level contrasts");
00602           
00603           for (i = 0;  i < option_data->a;  i++)
00604             {
00605               sscanf (argv[nopt], "%f", &fval); 
00606               option_data->acontr[option_data->num_acontr - 1][i] = fval ;
00607               nopt++;
00608             }
00609           
00610           option_data->acname[option_data->num_acontr-1] 
00611             =  malloc (sizeof(char) * MAX_NAME_LENGTH);
00612           strcpy (option_data->acname[option_data->num_acontr-1], argv[nopt]);
00613           nopt++;
00614           continue;
00615         }
00616       
00617       
00618       
00619       if (strncmp(argv[nopt], "-bcontr", 5) == 0)
00620         {
00621           nopt++;
00622           if (nopt + option_data->b >= argc)  
00623             ANOVA_error ("need b+1 arguments after -bcontr ");
00624           
00625           option_data->num_bcontr++;
00626           if (option_data->num_bcontr > MAX_CONTR)
00627             ANOVA_error ("too many factor B level contrasts");
00628                   
00629           for (i = 0;  i < option_data->b;  i++)
00630             {
00631               sscanf (argv[nopt], "%f", &fval); 
00632               option_data->bcontr[option_data->num_bcontr - 1][i] = fval ;
00633               nopt++;
00634             }
00635           
00636           option_data->bcname[option_data->num_bcontr-1] 
00637             =  malloc (sizeof(char) * MAX_NAME_LENGTH);
00638           strcpy (option_data->bcname[option_data->num_bcontr-1], argv[nopt]);
00639           nopt++;
00640           continue;
00641         }
00642 
00643 
00644       
00645       if (strncmp(argv[nopt], "-xcontr", 5) == 0)
00646         {
00647           nopt++;
00648           if (nopt + (option_data->a * option_data->b) >= argc)  
00649             ANOVA_error ("need ab+1 arguments after -xcontr ");
00650           
00651           option_data->num_xcontr++;
00652           if (option_data->num_xcontr > MAX_CONTR)
00653             ANOVA_error ("too many cell means contrasts");
00654                   
00655           for (i = 0;  i < option_data->a;  i++)
00656             for (j = 0;  j < option_data->b;  j++)
00657               {
00658                 sscanf (argv[nopt], "%f", &fval); 
00659                 option_data->xcontr[option_data->num_xcontr - 1][i][j] = fval ;
00660                 nopt++;
00661               }
00662           
00663           option_data->xcname[option_data->num_xcontr-1] 
00664             =  malloc (sizeof(char) * MAX_NAME_LENGTH);
00665           strcpy (option_data->xcname[option_data->num_xcontr-1], argv[nopt]);
00666           nopt++;
00667           continue;
00668         }
00669 
00670 
00671       
00672       if (strncmp(argv[nopt], "-bucket", 4) == 0)
00673         {
00674           nopt++;
00675           if (nopt >= argc)  ANOVA_error ("need argument after -bucket ");
00676           option_data->bucket_filename = malloc (sizeof(char)*MAX_NAME_LENGTH);
00677           strcpy (option_data->bucket_filename, argv[nopt]);
00678           nopt++;
00679           continue;
00680         }
00681       
00682       
00683       
00684       sprintf (message,"Unrecognized command line option: %s\n", argv[nopt]);
00685       ANOVA_error (message);
00686     }
00687 
00688 
00689   
00690   option_data->n = n[0][0];
00691   for (i = 0;  i < option_data->a;  i++)
00692     for (j = 0;  j < option_data->b;  j++)
00693       if (n[i][j] != option_data->n)
00694         ANOVA_error ("must have equal sample sizes for 3dANOVA2");
00695 }
00696 
00697 
00698 
00699 
00700 
00701 
00702 
00703 void check_temporary_files (anova_options * option_data)
00704 {
00705 
00706    check_one_temporary_file ("ss0");
00707    check_one_temporary_file ("ssi");
00708    check_one_temporary_file ("ssj");
00709    check_one_temporary_file ("ssij");
00710    check_one_temporary_file ("ssijk");
00711 
00712    check_one_temporary_file ("sse");
00713    check_one_temporary_file ("sstr");
00714    check_one_temporary_file ("ssa");
00715    check_one_temporary_file ("ssb");
00716    check_one_temporary_file ("ssab");
00717 }
00718 
00719 
00720 
00721 
00722 
00723 
00724 
00725 void check_output_files (anova_options * option_data)
00726 {
00727   int i;       
00728 
00729   if (option_data->nftr > 0)   
00730     check_one_output_file (option_data, option_data->ftrname);
00731 
00732   if (option_data->nfa > 0)   
00733     check_one_output_file (option_data, option_data->faname);
00734 
00735   if (option_data->nfb > 0)   
00736     check_one_output_file (option_data, option_data->fbname);
00737 
00738   if (option_data->nfab > 0)   
00739     check_one_output_file (option_data, option_data->fabname);
00740 
00741   if (option_data->num_ameans > 0)
00742     for (i = 0;  i < option_data->num_ameans;  i++)
00743       check_one_output_file (option_data, option_data->amname[i]);
00744 
00745   if (option_data->num_bmeans > 0)
00746     for (i = 0;  i < option_data->num_bmeans;  i++)
00747       check_one_output_file (option_data, option_data->bmname[i]);
00748 
00749   if (option_data->num_xmeans > 0)
00750     for (i = 0;  i < option_data->num_xmeans;  i++)
00751       check_one_output_file (option_data, option_data->xmname[i]);
00752 
00753   if (option_data->num_adiffs > 0)
00754     for (i = 0;  i < option_data->num_adiffs;  i++)
00755       check_one_output_file (option_data, option_data->adname[i]);
00756 
00757   if (option_data->num_bdiffs > 0)
00758     for (i = 0;  i < option_data->num_bdiffs;  i++)
00759       check_one_output_file (option_data, option_data->bdname[i]);
00760 
00761   if (option_data->num_xdiffs > 0)
00762     for (i = 0;  i < option_data->num_xdiffs;  i++)
00763       check_one_output_file (option_data, option_data->xdname[i]);
00764 
00765   if (option_data->num_acontr > 0)
00766     for (i = 0;  i < option_data->num_acontr;  i++)
00767       check_one_output_file (option_data, option_data->acname[i]);
00768 
00769   if (option_data->num_bcontr > 0)
00770     for (i = 0;  i < option_data->num_bcontr;  i++)
00771       check_one_output_file (option_data, option_data->bcname[i]);
00772 
00773   if (option_data->num_xcontr > 0)
00774     for (i = 0;  i < option_data->num_xcontr;  i++)
00775       check_one_output_file (option_data, option_data->xcname[i]);
00776 
00777   if (option_data->bucket_filename != NULL)
00778     check_one_output_file (option_data, option_data->bucket_filename);
00779 
00780 }
00781 
00782 
00783 
00784 
00785 
00786 
00787 
00788 void check_for_valid_inputs (anova_options * option_data)
00789 {
00790    int a, b;                            
00791    int n;                               
00792 
00793 
00794    
00795    a = option_data->a;
00796    b = option_data->b;
00797    n = option_data->n;
00798 
00799 
00800   
00801    if (a < 2)  ANOVA_error ("must specify number of factor A levels (a>1) ");
00802    if (b < 2)  ANOVA_error ("must specify number of factor B levels (b>1) ");
00803    if (n < 1)  ANOVA_error ("sample size is too small");
00804 
00805    switch (option_data->model)
00806    {
00807       case 1:     
00808          if (n == 1)  
00809             ANOVA_error ("sample size is too small for fixed effects model");
00810          break;
00811       case 2:   
00812          if (option_data->nftr > 0)
00813             ANOVA_error ("-ftr is inappropriate for random effects model");
00814          if (option_data->num_ameans > 0)
00815             ANOVA_error ("-amean is inappropriate for random effects model");
00816          if (option_data->num_bmeans > 0)
00817             ANOVA_error ("-bmean is inappropriate for random effects model");
00818          if (option_data->num_xmeans > 0)
00819             ANOVA_error ("-xmean is inappropriate for random effects model");
00820          if (option_data->num_adiffs > 0)
00821             ANOVA_error ("-adiff is inappropriate for random effects model");
00822          if (option_data->num_bdiffs > 0)
00823             ANOVA_error ("-bdiff is inappropriate for random effects model");
00824          if (option_data->num_xdiffs > 0)
00825             ANOVA_error ("-xdiff is inappropriate for random effects model");
00826          if (option_data->num_acontr > 0)
00827             ANOVA_error ("-acontr is inappropriate for random effects model");
00828          if (option_data->num_bcontr > 0)
00829             ANOVA_error ("-bcontr is inappropriate for random effects model");
00830          if (option_data->num_xcontr > 0)
00831             ANOVA_error ("-xcontr is inappropriate for random effects model");
00832          if ((n == 1) && (option_data->nfab > 0))
00833             ANOVA_error ("sample size too small to calculate F-interaction");
00834          break;
00835       case 3:   
00836          if (option_data->nftr > 0)
00837             ANOVA_error ("-ftr is inappropriate for mixed effects model");
00838          if (option_data->num_bmeans > 0)
00839             ANOVA_error ("-bmean is inappropriate for mixed effects model");
00840          if (option_data->num_xmeans > 0)
00841             ANOVA_error ("-xmean is inappropriate for mixed effects model");
00842          if (option_data->num_bdiffs > 0)
00843             ANOVA_error ("-bdiff is inappropriate for mixed effects model");
00844          if (option_data->num_xdiffs > 0)
00845             ANOVA_error ("-xdiff is inappropriate for mixed effects model");
00846          if (option_data->num_bcontr > 0)
00847             ANOVA_error ("-bcontr is inappropriate for mixed effects model");
00848          if (option_data->num_xcontr > 0)
00849             ANOVA_error ("-xcontr is inappropriate for mixed effects model");
00850          if ((n == 1) && (option_data->nfab > 0))
00851             ANOVA_error ("sample size too small to calculate F-interaction");
00852          if ((n == 1) && (option_data->nfb > 0))
00853             ANOVA_error ("sample size too small to calculate F for B effect");
00854          break;
00855    } 
00856 
00857 }
00858 
00859 
00860 
00861 
00862 
00863 
00864 
00865 
00866 int required_data_files (anova_options * option_data)
00867 {
00868   int now;                         
00869 
00870   int nout;                        
00871   int nmax;                        
00872 
00873 
00874   if (option_data->n != 1)
00875     {
00876       nmax = 6;  now = 5;
00877     }
00878   else
00879     {
00880       nmax = 5;  now = 5;
00881     }
00882 
00883   nout = option_data->nftr + option_data->nfab
00884   + option_data->nfa + option_data->nfb 
00885   + option_data->num_ameans + option_data->num_bmeans + option_data->num_xmeans
00886   + option_data->num_adiffs + option_data->num_bdiffs + option_data->num_xdiffs
00887   + option_data->num_acontr + option_data->num_bcontr  
00888   + option_data->num_xcontr;
00889 
00890   now = now + nout;
00891 
00892   nmax = max (now, nmax);
00893 
00894   if (option_data->bucket_filename != NULL)
00895     nmax = max (nmax, 2*nout);
00896   
00897   return (nmax);
00898 }
00899 
00900 
00901 
00902 
00903 
00904 
00905 
00906 void initialize (int argc,  char ** argv,  anova_options ** option_data)
00907 {
00908   int a, b;                            
00909   int n;                               
00910   
00911 
00912   
00913   commandline = tross_commandline( PROGRAM_NAME , argc,argv ) ;
00914 
00915  
00916      
00917   *option_data = (anova_options *) malloc(sizeof(anova_options));
00918   if (*option_data == NULL)
00919     ANOVA_error ("memory allocation error");
00920   
00921   
00922   get_options(argc, argv, *option_data);
00923 
00924   
00925   (*option_data)->first_dataset = (*option_data)->xname[0][0][0][0];
00926   get_dimensions (*option_data);
00927   printf ("Data set dimensions:  nx = %d  ny = %d  nz = %d  nxyz = %d \n",
00928           (*option_data)->nx, (*option_data)->ny,
00929           (*option_data)->nz, (*option_data)->nxyz);
00930   if ((*option_data)->nvoxel > (*option_data)->nxyz)
00931     ANOVA_error ("argument of -voxel is too large");
00932   
00933   
00934   a = (*option_data)->a;
00935   b = (*option_data)->b;
00936   n = (*option_data)->n;
00937   
00938   
00939   (*option_data)->nt = n * a * b;
00940   
00941   
00942   check_for_valid_inputs (*option_data);
00943   
00944   
00945   check_temporary_files (*option_data);
00946   
00947   
00948   check_output_files (*option_data);
00949   
00950   
00951   if ((*option_data)->diskspace)  check_disk_space (*option_data);
00952 }
00953 
00954 
00955 
00956 
00957 
00958 
00959 
00960 
00961 void calculate_sum (anova_options * option_data,
00962                     int ii, int jj, float * ysum)
00963 {
00964   float * y = NULL;                
00965   int i, itop, ibot;               
00966   int j, jtop, jbot;               
00967   int m;                           
00968   int a;                           
00969   int b;                           
00970   int n;                           
00971   int ixyz, nxyz;                  
00972   int nvoxel;                      
00973   char sum_label[MAX_NAME_LENGTH]; 
00974   char str[MAX_NAME_LENGTH];       
00975   
00976   
00977   
00978   a = option_data->a;
00979   b = option_data->b;
00980   n = option_data->n;
00981   nxyz = option_data->nxyz;
00982   nvoxel = option_data->nvoxel;
00983   
00984   
00985   y = (float *) malloc(sizeof(float)*nxyz);
00986   if (y == NULL)  ANOVA_error ("unable to allocate sufficient memory");
00987 
00988 
00989   
00990   if (ii < 0)
00991     { ibot = 0;   itop = a; }
00992   else
00993     { ibot = ii;  itop = ii+1; }
00994 
00995   if (jj < 0)
00996     { jbot = 0;   jtop = b; }
00997   else
00998     { jbot = jj;  jtop = jj+1; }
00999 
01000 
01001   volume_zero (ysum, nxyz);
01002 
01003   
01004   for (i = ibot;  i < itop;  i++)
01005     {
01006       
01007       for (j = jbot;  j < jtop;  j++)
01008         {
01009                     
01010           for (m = 0;  m < n;  m++)
01011             {  
01012               read_afni_data (option_data, 
01013                               option_data->xname[i][j][0][m], y);
01014               if (nvoxel > 0)
01015                 printf ("y[%d][%d][%d] = %f \n", 
01016                         i+1, j+1, m+1, y[nvoxel-1]);
01017               for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01018                 ysum[ixyz] += y[ixyz];
01019             } 
01020         }   
01021     }  
01022 
01023 
01024   
01025   if (nvoxel > 0)
01026     {
01027       strcpy (sum_label, "y");
01028       if (ii < 0)
01029         strcat (sum_label, "[.]");
01030       else
01031         {
01032           sprintf (str, "[%d]", ii+1);
01033           strcat (sum_label, str);
01034         }
01035       if (jj < 0)
01036         strcat (sum_label, "[.]");
01037       else
01038         {
01039           sprintf (str, "[%d]", jj+1);
01040           strcat (sum_label, str);
01041         }
01042       printf ("%s[.] = %f \n", sum_label, ysum[nvoxel-1]);
01043     }
01044  
01045   
01046   free (y);     y = NULL;
01047   
01048 }
01049   
01050 
01051 
01052 
01053 
01054 
01055 
01056 
01057 
01058 
01059 
01060 
01061 
01062 
01063 
01064 
01065 void calculate_t_from_sums(float * result, float * mean, float * sum_sq,
01066                            int df, int nvox)
01067 {
01068   const float  EPSILON = 1.0e-10;      
01069   double dval;
01070   float  *res, *mp, *ssp, sval;
01071   int    index, df_prod;
01072 
01073   
01074   df_prod = df * (df + 1);
01075 
01076   res = result;
01077   mp = mean;
01078   ssp = sum_sq;
01079   for (index = 0;  index < nvox;  index++)
01080   {
01081      sval = *mp;  
01082      dval = *ssp - (df+1.0) * sval * sval;
01083 
01084      if (dval < EPSILON) *res = 0.0;
01085      else                *res = sval * sqrt( df_prod / dval );
01086 
01087      res++;  mp++;  ssp++;
01088   }
01089 }
01090   
01091 
01092 
01093 
01094 
01095 
01096 
01097 
01098 
01099 
01100 void calculate_sum_sq (anova_options * option_data,
01101                     int ii, int jj, float * ysum)
01102 {
01103   double * yd = NULL;              
01104   float * y = NULL;                
01105   int i, itop, ibot;               
01106   int j, jtop, jbot;               
01107   int m;                           
01108   int a;                           
01109   int b;                           
01110   int n;                           
01111   int ixyz, nxyz;                  
01112   int nvoxel;                      
01113   char sum_label[MAX_NAME_LENGTH]; 
01114   char str[MAX_NAME_LENGTH];       
01115   
01116   
01117   
01118   a = option_data->a;
01119   b = option_data->b;
01120   n = option_data->n;
01121   nxyz = option_data->nxyz;
01122   nvoxel = option_data->nvoxel;
01123   
01124   
01125   y = (float *) malloc(sizeof(float)*nxyz);
01126   yd = (double *) malloc(sizeof(double)*nxyz);
01127   if (!y || !yd)  ANOVA_error ("sum_sq: unable to allocate sufficient memory");
01128 
01129   
01130   if (ii < 0) { ibot = 0;   itop = a; }
01131   else        { ibot = ii;  itop = ii+1; }
01132 
01133   if (jj < 0) { jbot = 0;   jtop = b; }
01134   else        { jbot = jj;  jtop = jj+1; }
01135 
01136   for (ixyz = 0; ixyz < nxyz; ixyz++)  
01137       yd[ixyz] = 0.0;
01138 
01139   
01140   for (i = ibot;  i < itop;  i++)
01141       
01142       for (j = jbot;  j < jtop;  j++)
01143                     
01144           for (m = 0;  m < n;  m++)
01145           {  
01146               read_afni_data (option_data, option_data->xname[i][j][0][m], y);
01147               if (nvoxel > 0)
01148                   printf ("y[%d][%d][%d] = %f \n", i+1, j+1, m+1, y[nvoxel-1]);
01149               for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01150                   yd[ixyz] += y[ixyz] * y[ixyz];
01151           }
01152 
01153   
01154   for (ixyz = 0; ixyz < nxyz; ixyz++)
01155       ysum[ixyz] = yd[ixyz];
01156 
01157   
01158   if (nvoxel > 0)
01159   {
01160       strcpy (sum_label, "y");
01161       if (ii < 0)
01162         strcat (sum_label, "[.]");
01163       else
01164         {
01165           sprintf (str, "[%d]", ii+1);
01166           strcat (sum_label, str);
01167         }
01168       if (jj < 0)
01169         strcat (sum_label, "[.]");
01170       else
01171         {
01172           sprintf (str, "[%d]", jj+1);
01173           strcat (sum_label, str);
01174         }
01175       printf ("%s_squares[.] = %f \n", sum_label, ysum[nvoxel-1]);
01176   }
01177  
01178   
01179   free (y);     y = NULL;
01180   free (yd);    yd = NULL;
01181 }
01182   
01183 
01184 
01185 
01186 
01187 
01188 
01189 
01190 
01191 
01192 
01193 
01194 void calc_acontr_mean (anova_options *option_data, float *contr, float *cmean)
01195 {
01196   double * sum = NULL;             
01197   int i;                           
01198   int a, b;                        
01199   int n;                           
01200   int ixyz, nxyz;                  
01201   int nvoxel;                      
01202   
01203   
01204   
01205   a = option_data->a;
01206   b = option_data->b;
01207   n = option_data->n;
01208   nxyz = option_data->nxyz;
01209   nvoxel = option_data->nvoxel;
01210   
01211   
01212   sum = (double *) malloc(sizeof(double)*nxyz);
01213   if (sum == NULL)
01214       ANOVA_error ("calc_acontr_mean: unable to allocate sufficient memory");
01215 
01216   for (ixyz = 0; ixyz < nxyz; ixyz++)  
01217       sum[ixyz] = 0.0;
01218 
01219   
01220   for (i = 0;  i < a;  i++)
01221   {
01222       if (contr[i] == 0.0 ) continue;  
01223 
01224       
01225       calculate_sum(option_data, i, -1, cmean);
01226       if (nvoxel > 0)
01227           printf( "acontr[%d] = %f, ymean = %f\n",
01228                   i, contr[i], cmean[nvoxel-1] / (n*b) );
01229       for (ixyz = 0; ixyz < nxyz; ixyz++)
01230           sum[ixyz] += (double)cmean[ixyz] / (n*b) * contr[i];
01231   }
01232 
01233   
01234   for (ixyz = 0; ixyz < nxyz; ixyz++)
01235       cmean[ixyz] = sum[ixyz];
01236 
01237   
01238   free (sum);
01239 }
01240   
01241 
01242 
01243 
01244 
01245 
01246 
01247 
01248 
01249 
01250 
01251 
01252 void calc_sum_sq_acontr(anova_options *option_data, float *acontr, float *sum)
01253 {
01254   double * dsum = NULL;            
01255   double * dcontr = NULL;          
01256   int i, j;                        
01257   int k;                           
01258   int a, b;                        
01259   int n;                           
01260   int ixyz, nxyz;                  
01261   int nvoxel;                      
01262   
01263   
01264   
01265   a = option_data->a;
01266   b = option_data->b;
01267   n = option_data->n;
01268   nxyz = option_data->nxyz;
01269   nvoxel = option_data->nvoxel;
01270   
01271   
01272   dsum = (double *) malloc(sizeof(double)*nxyz);
01273   dcontr = (double *) malloc(sizeof(double)*nxyz);
01274   if (dsum == NULL || dcontr == NULL)
01275       ANOVA_error ("calc_sum_sq_acontr: unable to allocate sufficient memory");
01276 
01277   for (ixyz = 0; ixyz < nxyz; ixyz++)  
01278       dsum[ixyz] = 0.0;
01279 
01280   
01281   for ( j = 0; j < b; j++ )
01282       for ( k = 0; k < n; k++ )
01283       {
01284           
01285           for (ixyz = 0; ixyz < nxyz; ixyz++)
01286               dcontr[ixyz] = 0.0;
01287 
01288           for (i = 0;  i < a;  i++)
01289           {
01290               if (acontr[i] == 0.0 ) continue;  
01291 
01292               
01293               read_afni_data(option_data, option_data->xname[i][j][0][k], sum);
01294               for (ixyz = 0; ixyz < nxyz; ixyz++)
01295                   dcontr[ixyz] += (double)sum[ixyz] * acontr[i];
01296           }
01297           for (ixyz = 0; ixyz < nxyz; ixyz++)
01298               dsum[ixyz] += dcontr[ixyz] * dcontr[ixyz];
01299       }
01300 
01301   
01302   for (ixyz = 0; ixyz < nxyz; ixyz++)
01303       sum[ixyz] = dsum[ixyz];
01304 
01305   
01306   free (dsum);
01307   free (dcontr);
01308 }
01309   
01310 
01311 
01312 
01313 
01314 
01315 
01316 
01317 void calculate_ss0 (anova_options * option_data)
01318 {
01319   float * ss0 = NULL;              
01320   float * ysum = NULL;             
01321   int a;                           
01322   int b;                           
01323   int n;                           
01324   int ixyz, nxyz;                  
01325   int nvoxel;                      
01326   int nval;                        
01327   char filename[MAX_NAME_LENGTH];  
01328   
01329   
01330   
01331   a = option_data->a;
01332   b = option_data->b;
01333   n = option_data->n;
01334   nxyz = option_data->nxyz;
01335   nvoxel = option_data->nvoxel;
01336   nval = a * b * n;
01337   
01338   
01339   ss0 = (float *) malloc(sizeof(float)*nxyz);
01340   ysum = (float *) malloc(sizeof(float)*nxyz);
01341   if ((ss0 == NULL) || (ysum == NULL))
01342     ANOVA_error ("unable to allocate sufficient memory");
01343   
01344   
01345   calculate_sum (option_data, -1, -1, ysum);
01346 
01347   
01348   for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01349     ss0[ixyz] = ysum[ixyz] * ysum[ixyz] / nval;
01350   
01351 
01352   
01353   if (nvoxel > 0)
01354     printf ("SS0 = %f \n", ss0[nvoxel-1]); 
01355   strcpy (filename, "ss0");
01356   volume_write (filename, ss0, nxyz);
01357   
01358 
01359   
01360   free (ysum);    ysum = NULL;
01361   free (ss0);     ss0 = NULL;
01362   
01363 }
01364 
01365   
01366 
01367 
01368 
01369 
01370 
01371 
01372 void calculate_ssi (anova_options * option_data)
01373 {
01374   float * ssi = NULL;              
01375   float * ysum = NULL;             
01376   int a;                           
01377   int b;                           
01378   int n;                           
01379   int i;                           
01380   int ixyz, nxyz;                  
01381   int nvoxel;                      
01382   int nval;                        
01383   char filename[MAX_NAME_LENGTH];  
01384   
01385   
01386   
01387   a = option_data->a;
01388   b = option_data->b;
01389   n = option_data->n;
01390   nxyz = option_data->nxyz;
01391   nvoxel = option_data->nvoxel;
01392   nval = b * n;
01393   
01394   
01395   ssi = (float *) malloc(sizeof(float)*nxyz);
01396   ysum = (float *) malloc(sizeof(float)*nxyz);
01397   if ((ssi == NULL) || (ysum == NULL))
01398     ANOVA_error ("unable to allocate sufficient memory");
01399   
01400   volume_zero (ssi, nxyz);
01401 
01402   
01403   for (i = 0;  i < a;  i++)
01404     {
01405       
01406       calculate_sum (option_data, i, -1, ysum);
01407 
01408       
01409       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01410         ssi[ixyz] += ysum[ixyz] * ysum[ixyz] / nval;
01411     }
01412 
01413   
01414   if (nvoxel > 0)
01415     printf ("SSI = %f \n", ssi[nvoxel-1]); 
01416   strcpy (filename, "ssi");
01417   volume_write (filename, ssi, nxyz);
01418   
01419 
01420   
01421   free (ysum);    ysum = NULL;
01422   free (ssi);     ssi = NULL;
01423   
01424 }
01425 
01426   
01427 
01428 
01429 
01430 
01431 
01432 
01433 void calculate_ssj (anova_options * option_data)
01434 {
01435   float * ssj = NULL;              
01436   float * ysum = NULL;             
01437   int a;                           
01438   int b;                           
01439   int n;                           
01440   int j;                           
01441   int ixyz, nxyz;                  
01442   int nvoxel;                      
01443   int nval;                        
01444   char filename[MAX_NAME_LENGTH];  
01445   
01446   
01447   
01448   a = option_data->a;
01449   b = option_data->b;
01450   n = option_data->n;
01451   nxyz = option_data->nxyz;
01452   nvoxel = option_data->nvoxel;
01453   nval = a * n;
01454   
01455   
01456   ssj = (float *) malloc(sizeof(float)*nxyz);
01457   ysum = (float *) malloc(sizeof(float)*nxyz);
01458   if ((ssj == NULL) || (ysum == NULL))
01459     ANOVA_error ("unable to allocate sufficient memory");
01460   
01461   volume_zero (ssj, nxyz);
01462 
01463   
01464   for (j = 0;  j < b;  j++)
01465     {
01466       
01467       calculate_sum (option_data, -1, j, ysum);
01468 
01469       
01470       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01471         ssj[ixyz] += ysum[ixyz] * ysum[ixyz] / nval;
01472     }
01473 
01474   
01475   if (nvoxel > 0)
01476     printf ("SSJ = %f \n", ssj[nvoxel-1]); 
01477   strcpy (filename, "ssj");
01478   volume_write (filename, ssj, nxyz);
01479   
01480 
01481   
01482   free (ysum);    ysum = NULL;
01483   free (ssj);     ssj = NULL;
01484   
01485 }
01486 
01487   
01488 
01489 
01490 
01491 
01492 
01493 
01494 void calculate_ssij (anova_options * option_data)
01495 {
01496   float * ssij = NULL;             
01497   float * ysum = NULL;             
01498   int a;                           
01499   int b;                           
01500   int n;                           
01501   int i, j;                        
01502   int ixyz, nxyz;                  
01503   int nvoxel;                      
01504   int nval;                        
01505   char filename[MAX_NAME_LENGTH];  
01506   
01507   
01508   
01509   a = option_data->a;
01510   b = option_data->b;
01511   n = option_data->n;
01512   nxyz = option_data->nxyz;
01513   nvoxel = option_data->nvoxel;
01514   nval = n;
01515   
01516   
01517   ssij = (float *) malloc(sizeof(float)*nxyz);
01518   ysum = (float *) malloc(sizeof(float)*nxyz);
01519   if ((ssij == NULL) || (ysum == NULL))
01520     ANOVA_error ("unable to allocate sufficient memory");
01521   
01522   volume_zero (ssij, nxyz);
01523 
01524   
01525   for (i = 0;  i < a;  i++)
01526     {
01527       
01528       for (j = 0;  j < b;  j++)
01529         {
01530           
01531           calculate_sum (option_data, i, j, ysum);
01532           
01533           
01534           for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01535             ssij[ixyz] += ysum[ixyz] * ysum[ixyz] / nval;
01536         }
01537     }
01538 
01539   
01540   if (nvoxel > 0)
01541     printf ("SSIJ = %f \n", ssij[nvoxel-1]); 
01542   strcpy (filename, "ssij");
01543   volume_write (filename, ssij, nxyz);
01544   
01545 
01546   
01547   free (ysum);    ysum = NULL;
01548   free (ssij);    ssij = NULL;
01549   
01550 }
01551 
01552   
01553 
01554 
01555 
01556 
01557 
01558 
01559 void calculate_ssijk (anova_options * option_data)
01560 {
01561   float * ssijk = NULL;            
01562   float * y = NULL;                 
01563   int i;                            
01564   int j;                            
01565   int m;                            
01566   int a;                            
01567   int b;                            
01568   int n;                            
01569   int ixyz, nxyz;                   
01570   int nvoxel;                       
01571   
01572   
01573   
01574   a = option_data->a;
01575   b = option_data->b;
01576   n = option_data->n;
01577   nxyz = option_data->nxyz;
01578   nvoxel = option_data->nvoxel;
01579   
01580   
01581   ssijk = (float *) malloc(sizeof(float)*nxyz);
01582   y = (float *) malloc(sizeof(float)*nxyz);
01583   if ((ssijk == NULL) || (y == NULL))
01584     ANOVA_error ("unable to allocate sufficient memory");
01585 
01586 
01587   volume_zero (ssijk, nxyz);
01588   
01589   for (i = 0;  i < a;  i++)
01590     {
01591       for (j = 0;  j < b;  j++)
01592         {
01593           for (m = 0;  m < n;  m++)
01594             {
01595               read_afni_data (option_data, 
01596                               option_data->xname[i][j][0][m], y);
01597               
01598               for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01599                 ssijk[ixyz] += y[ixyz] * y[ixyz]; 
01600             }
01601         }
01602     }
01603   
01604   
01605     
01606   if (nvoxel > 0)
01607     printf ("SSIJK = %f \n", ssijk[nvoxel-1]); 
01608   volume_write ("ssijk", ssijk, nxyz);
01609   
01610   
01611   free (y);       y = NULL;
01612   free (ssijk);   ssijk = NULL;
01613   
01614 }
01615 
01616 
01617 
01618 
01619 
01620 
01621 
01622 
01623 void calculate_sse (anova_options * option_data)
01624 {
01625   float * y = NULL;                   
01626   float * sse = NULL;                 
01627   int ixyz, nxyz;                     
01628   int nvoxel;                         
01629   
01630   
01631   
01632   nxyz = option_data->nxyz;
01633   nvoxel = option_data->nvoxel;
01634   
01635   
01636   sse = (float *) malloc (sizeof(float)*nxyz);
01637   y = (float *) malloc (sizeof(float)*nxyz);
01638   if ((y == NULL) || (sse == NULL))
01639     ANOVA_error ("unable to allocate sufficient memory");
01640 
01641  
01642   
01643   volume_read ("ssijk", sse, nxyz);
01644 
01645   volume_read ("ssij", y, nxyz);
01646   for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01647     sse[ixyz] -= y[ixyz]; 
01648   
01649   
01650   
01651   for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01652     if (sse[ixyz] < 0.0)  sse[ixyz] = 0.0; 
01653   
01654   
01655   if (nvoxel > 0)
01656     printf ("SSE = %f \n", sse[nvoxel-1]);
01657   volume_write ("sse", sse, nxyz);
01658   
01659   
01660   free (y);      y = NULL;
01661   free (sse);    sse = NULL;
01662   
01663 }
01664 
01665 
01666 
01667 
01668 
01669 
01670 
01671 
01672 void calculate_sstr (anova_options * option_data)
01673 {
01674   float * y = NULL;                   
01675   float * sstr = NULL;                
01676   int ixyz, nxyz;                     
01677   int nvoxel;                         
01678   
01679   
01680   
01681   nxyz = option_data->nxyz;
01682   nvoxel = option_data->nvoxel;
01683   
01684   
01685   sstr = (float *) malloc (sizeof(float)*nxyz);
01686   y = (float *) malloc (sizeof(float)*nxyz);
01687   if ((y == NULL) || (sstr == NULL))
01688     ANOVA_error ("unable to allocate sufficient memory");
01689 
01690  
01691   
01692   volume_read ("ssij", sstr, nxyz);
01693 
01694   volume_read ("ss0", y, nxyz);
01695   for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01696     sstr[ixyz] -= y[ixyz]; 
01697   
01698   
01699   
01700   for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01701     if (sstr[ixyz] < 0.0)  sstr[ixyz] = 0.0; 
01702   
01703   
01704   if (nvoxel > 0)
01705     printf ("SSTR = %f \n", sstr[nvoxel-1]);
01706   volume_write ("sstr", sstr, nxyz);
01707   
01708   
01709   free (y);      y = NULL;
01710   free (sstr);   sstr = NULL;
01711   
01712 }
01713 
01714 
01715 
01716 
01717 
01718 
01719 
01720 
01721 void calculate_ssa (anova_options * option_data)
01722 {
01723   float * y = NULL;                   
01724   float * ssa = NULL;                 
01725   int ixyz, nxyz;                     
01726   int nvoxel;                         
01727 
01728 
01729   
01730   nxyz = option_data->nxyz;
01731   nvoxel = option_data->nvoxel;
01732   
01733   
01734   ssa = (float *) malloc (sizeof(float)*nxyz);
01735   y = (float *) malloc (sizeof(float)*nxyz);
01736   if ((y == NULL) || (ssa == NULL))
01737     ANOVA_error ("unable to allocate sufficient memory");
01738 
01739  
01740   
01741   volume_read ("ssi", ssa, nxyz);
01742 
01743   volume_read ("ss0", y, nxyz);
01744   for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01745     ssa[ixyz] -= y[ixyz]; 
01746   
01747   
01748   
01749   for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01750     if (ssa[ixyz] < 0.0)  ssa[ixyz] = 0.0; 
01751   
01752   
01753   if (nvoxel > 0)
01754     printf ("SSA = %f \n", ssa[nvoxel-1]);
01755   volume_write ("ssa", ssa, nxyz);
01756   
01757   
01758   free (y);     y = NULL;
01759   free (ssa);   ssa = NULL;
01760   
01761 }
01762 
01763 
01764 
01765 
01766 
01767 
01768 
01769 
01770 void calculate_ssb (anova_options * option_data)
01771 {
01772   float * y = NULL;                   
01773   float * ssb = NULL;                 
01774   int ixyz, nxyz;                     
01775   int nvoxel;                         
01776 
01777 
01778   
01779   nxyz = option_data->nxyz;
01780   nvoxel = option_data->nvoxel;
01781   
01782   
01783   ssb = (float *) malloc (sizeof(float)*nxyz);
01784   y = (float *) malloc (sizeof(float)*nxyz);
01785   if ((y == NULL) || (ssb == NULL))
01786     ANOVA_error ("unable to allocate sufficient memory");
01787 
01788  
01789   
01790   volume_read ("ssj", ssb, nxyz);
01791 
01792   volume_read ("ss0", y, nxyz);
01793   for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01794     ssb[ixyz] -= y[ixyz]; 
01795   
01796   
01797   
01798   for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01799     if (ssb[ixyz] < 0.0)  ssb[ixyz] = 0.0; 
01800   
01801   
01802   if (nvoxel > 0)
01803     printf ("SSB = %f \n", ssb[nvoxel-1]);
01804   volume_write ("ssb", ssb, nxyz);
01805   
01806   
01807   free (y);     y = NULL;
01808   free (ssb);   ssb = NULL;
01809   
01810 }
01811 
01812 
01813 
01814 
01815 
01816 
01817 
01818 
01819 void calculate_ssab (anova_options * option_data)
01820 {
01821   float * y = NULL;                   
01822   float * ssab = NULL;                
01823   int ixyz, nxyz;                     
01824   int nvoxel;                         
01825 
01826 
01827   
01828   nxyz = option_data->nxyz;
01829   nvoxel = option_data->nvoxel;
01830   
01831   
01832   ssab = (float *) malloc (sizeof(float)*nxyz);
01833   y = (float *) malloc (sizeof(float)*nxyz);
01834   if ((y == NULL) || (ssab == NULL))
01835     ANOVA_error ("unable to allocate sufficient memory");
01836 
01837  
01838   
01839   volume_read ("sstr", ssab, nxyz);
01840 
01841   volume_read ("ssa", y, nxyz);
01842   for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01843     ssab[ixyz] -= y[ixyz];
01844 
01845   volume_read ("ssb", y, nxyz);
01846   for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01847     ssab[ixyz] -= y[ixyz];
01848 
01849   
01850   
01851   for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01852     if (ssab[ixyz] < 0.0)  ssab[ixyz] = 0.0; 
01853   
01854   
01855   if (nvoxel > 0)
01856     printf ("SSAB = %f \n", ssab[nvoxel-1]);
01857   volume_write ("ssab", ssab, nxyz);
01858   
01859   
01860   free (y);      y = NULL;
01861   free (ssab);   ssab = NULL;
01862   
01863 }
01864 
01865 
01866 
01867 
01868 
01869 
01870 
01871 
01872 
01873 
01874 
01875 
01876 
01877 void calculate_ftr (anova_options * option_data)
01878 {
01879    const float  EPSILON = 1.0e-10;      
01880    float * mstr = NULL;                 
01881    float * ftr = NULL;                  
01882    int a;                               
01883    int b;                               
01884    int n;                               
01885    int ixyz, nxyz;                      
01886    int nvoxel;                          
01887    float fval;                          
01888    float mse;                           
01889  
01890 
01891 
01892    
01893    a = option_data->a;
01894    b = option_data->b;
01895    n = option_data->n;
01896    nxyz = option_data->nxyz;
01897    nvoxel = option_data->nvoxel;
01898    
01899    
01900    ftr = (float *) malloc(sizeof(float)*nxyz);
01901    mstr = (float *) malloc(sizeof(float)*nxyz);
01902    if ((ftr == NULL) || (mstr == NULL))
01903       ANOVA_error ("unable to allocate sufficient memory");
01904 
01905    
01906    volume_read ("sstr", mstr, nxyz); 
01907    fval = 1.0 / (a*b - 1.0); 
01908    for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01909       mstr[ixyz] = mstr[ixyz] * fval;     
01910    if (nvoxel > 0)
01911       printf ("MSTR = %f \n", mstr[nvoxel-1]);
01912  
01913    
01914    volume_read ("sse", ftr, nxyz); 
01915    fval = 1.0 / (a * b * (n-1));
01916    for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01917      {
01918        mse = ftr[ixyz] * fval;            
01919        if (mse < EPSILON)
01920          ftr[ixyz] = 0.0;
01921        else
01922          ftr[ixyz] = mstr[ixyz] / mse;      
01923      }
01924    if (nvoxel > 0)
01925       printf ("FTR = %f \n", ftr[nvoxel-1]);
01926 
01927    
01928    for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01929       mstr[ixyz] = sqrt(mstr[ixyz]);      
01930    write_afni_data (option_data, option_data->ftrname, 
01931                     mstr, ftr, a*b-1, a*b*(n-1));
01932 
01933    
01934    volume_delete ("sstr");
01935 
01936    
01937    free (mstr);   mstr = NULL;
01938    free (ftr);    ftr = NULL;
01939 
01940 }
01941 
01942 
01943 
01944 
01945 
01946 
01947 
01948 
01949 
01950 
01951 
01952 
01953 
01954 
01955 
01956 
01957 
01958 
01959 
01960 
01961 
01962 void calculate_fa (anova_options * option_data)
01963 {
01964    const float  EPSILON = 1.0e-10;      
01965    float * msa = NULL;                  
01966    float * fa = NULL;                   
01967    int a;                               
01968    int b;                               
01969    int n;                               
01970    int ixyz, nxyz;                      
01971    int nvoxel;                          
01972    int numdf;                           
01973    int dendf;                           
01974    float mse;                           
01975    float msab;                          
01976 
01977 
01978    
01979    a = option_data->a;
01980    b = option_data->b;
01981    n = option_data->n;
01982    nxyz = option_data->nxyz;
01983    nvoxel = option_data->nvoxel;
01984    
01985    
01986    fa = (float *) malloc(sizeof(float)*nxyz);
01987    msa = (float *) malloc(sizeof(float)*nxyz);
01988    if ((fa == NULL) || (msa == NULL))
01989       ANOVA_error ("unable to allocate sufficient memory");
01990 
01991    
01992    volume_read ("ssa", msa, nxyz); 
01993    numdf = a - 1; 
01994    for (ixyz = 0;  ixyz < nxyz;  ixyz++)
01995       msa[ixyz] = msa[ixyz] / numdf;      
01996    if (nvoxel > 0)
01997       printf ("MSA = %f \n", msa[nvoxel-1]);
01998 
01999    
02000    if (option_data->model == 1)
02001    {
02002       
02003       volume_read ("sse", fa, nxyz); 
02004       dendf = a * b * (n-1);
02005       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02006       {
02007           mse = fa[ixyz] / dendf;        
02008           if (mse < EPSILON)
02009             fa[ixyz] = 0.0;
02010           else
02011             fa[ixyz] = msa[ixyz] / mse;    
02012       }
02013    }
02014    else
02015    {
02016       
02017       volume_read ("ssab", fa, nxyz);
02018       dendf = (a-1) * (b-1);
02019       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02020       {
02021           msab = fa[ixyz] / dendf;       
02022           if (msab < EPSILON)
02023             fa[ixyz] = 0.0;
02024           else
02025             fa[ixyz] = msa[ixyz] / msab;   
02026       }
02027    }
02028       
02029    if (nvoxel > 0)
02030       printf ("FA = %f \n", fa[nvoxel-1]);
02031 
02032    
02033    for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02034       msa[ixyz] = sqrt(msa[ixyz]);        
02035    write_afni_data (option_data, option_data->faname, 
02036                     msa, fa, numdf, dendf);
02037 
02038    
02039    volume_delete ("ssa");
02040 
02041    
02042    free (msa);   msa = NULL;
02043    free (fa);    fa = NULL;
02044 
02045 }
02046 
02047 
02048 
02049 
02050 
02051 
02052 
02053 
02054 
02055 
02056 
02057 
02058 
02059 
02060 
02061 
02062 
02063 
02064 
02065 
02066 
02067 void calculate_fb (anova_options * option_data)
02068 {
02069    const float  EPSILON = 1.0e-10;      
02070    float * msb = NULL;                  
02071    float * fb = NULL;                   
02072    int a;                               
02073    int b;                               
02074    int n;                               
02075    int ixyz, nxyz;                      
02076    int nvoxel;                          
02077    int numdf;                           
02078    int dendf;                           
02079    float mse;                           
02080    float msab;                          
02081  
02082 
02083    
02084    a = option_data->a;
02085    b = option_data->b;
02086    n = option_data->n;
02087    nxyz = option_data->nxyz;
02088    nvoxel = option_data->nvoxel;
02089    
02090    
02091    fb = (float *) malloc(sizeof(float)*nxyz);
02092    msb = (float *) malloc(sizeof(float)*nxyz);
02093    if ((fb == NULL) || (msb == NULL))
02094       ANOVA_error ("unable to allocate sufficient memory");
02095 
02096    
02097    volume_read ("ssb", msb, nxyz); 
02098    numdf = b - 1; 
02099    for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02100       msb[ixyz] = msb[ixyz] / numdf;     
02101    if (nvoxel > 0)
02102       printf ("MSB = %f \n", msb[nvoxel-1]);
02103 
02104    
02105    if ((option_data->model == 1) || (option_data->model == 3))
02106    {
02107       
02108       volume_read ("sse", fb, nxyz); 
02109       dendf = a * b * (n-1);
02110       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02111       {
02112           mse = fb[ixyz] / dendf;        
02113           if (mse < EPSILON)
02114             fb[ixyz] = 0.0;
02115           else
02116             fb[ixyz] = msb[ixyz] / mse;    
02117       }
02118    }
02119    else
02120    {
02121       
02122       volume_read ("ssab", fb, nxyz);
02123       dendf = (a-1) * (b-1);
02124       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02125       {
02126           msab = fb[ixyz] / dendf;       
02127           if (msab < EPSILON)
02128             fb[ixyz] = 0.0;
02129           else
02130             fb[ixyz] = msb[ixyz] / msab;   
02131       }
02132    }
02133       
02134    if (nvoxel > 0)
02135       printf ("FB = %f \n", fb[nvoxel-1]);
02136 
02137    
02138    for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02139       msb[ixyz] = sqrt(msb[ixyz]);        
02140    write_afni_data (option_data, option_data->fbname, 
02141                     msb, fb, numdf, dendf);
02142 
02143    
02144    volume_delete ("ssb");
02145 
02146    
02147    free (msb);   msb = NULL;
02148    free (fb);    fb  = NULL;
02149 
02150 }
02151 
02152 
02153 
02154 
02155 
02156 
02157 
02158 
02159 
02160 
02161 
02162 
02163 
02164 void calculate_fab (anova_options * option_data)
02165 {
02166    const float  EPSILON = 1.0e-10;      
02167    float * msab = NULL;                 
02168    float * fab = NULL;                  
02169    int a;                               
02170    int b;                               
02171    int n;                               
02172    int ixyz, nxyz;                      
02173    int nvoxel;                          
02174    float fval;                          
02175    float mse;                           
02176  
02177 
02178    
02179    a = option_data->a;
02180    b = option_data->b;
02181    n = option_data->n;
02182    nxyz = option_data->nxyz;
02183    nvoxel = option_data->nvoxel;
02184    
02185    
02186    fab = (float *) malloc(sizeof(float)*nxyz);
02187    msab = (float *) malloc(sizeof(float)*nxyz);
02188    if ((fab == NULL) || (msab == NULL))
02189       ANOVA_error ("unable to allocate sufficient memory");
02190 
02191    
02192    volume_read ("ssab", msab, nxyz); 
02193    fval = 1.0 / ((a - 1.0)*(b - 1.0)); 
02194    for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02195       msab[ixyz] = msab[ixyz] * fval;    
02196    if (nvoxel > 0)
02197       printf ("MSAB = %f \n", msab[nvoxel-1]);
02198 
02199    
02200    volume_read ("sse", fab, nxyz); 
02201    fval = 1.0 / (a * b * (n-1));
02202    for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02203      {
02204        mse = fab[ixyz] * fval;          
02205        if (mse < EPSILON)
02206          fab[ixyz] = 0.0;
02207        else
02208          fab[ixyz] = msab[ixyz] / mse;    
02209      }
02210    if (nvoxel > 0)
02211       printf ("FAB = %f \n", fab[nvoxel-1]);
02212 
02213    
02214    for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02215       msab[ixyz] = sqrt(msab[ixyz]);      
02216    write_afni_data (option_data, option_data->fabname, 
02217                     msab, fab, (a-1)*(b-1), a*b*(n-1));
02218 
02219    
02220    free (msab);   msab = NULL;
02221    free (fab);    fab  = NULL;
02222 
02223 }
02224 
02225 
02226 
02227 
02228 
02229 
02230 
02231 
02232 
02233 
02234 
02235 
02236 
02237 
02238 
02239 
02240 
02241 
02242 
02243 void calculate_ameans (anova_options * option_data)
02244 {
02245    float * mean = NULL;               
02246    float * tmean = NULL;              
02247    int imean;                         
02248    int level;                         
02249    int n;                             
02250    int ixyz, nxyz;                    
02251    int nvoxel;                        
02252    int b;                             
02253    int num_means;                     
02254    int df;                            
02255  
02256 
02257    
02258    b = option_data->b;
02259    n = option_data->n;
02260    num_means = option_data->num_ameans;
02261    nxyz = option_data->nxyz;
02262    nvoxel = option_data->nvoxel;
02263 
02264    
02265    df = b * n - 1;
02266 
02267    
02268    mean = (float *) malloc(sizeof(float)*nxyz);
02269    tmean = (float *) malloc(sizeof(float)*nxyz);
02270    if ((mean == NULL) || (tmean == NULL))  
02271       ANOVA_error ("unable to allocate sufficient memory");
02272    
02273     
02274    for (imean = 0;  imean < num_means;  imean++)
02275    {
02276       level = option_data->ameans[imean];
02277  
02278       
02279       calculate_sum (option_data, level, -1, mean);
02280       calculate_sum_sq (option_data, level, -1, tmean);
02281 
02282       
02283       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02284          mean[ixyz] /= (df + 1.0);
02285 
02286       
02287       calculate_t_from_sums(tmean, mean, tmean, df, nxyz);
02288 
02289       if (nvoxel > 0)
02290          printf ("factor A level %d: mean = %f, t = %f, df = %d\n",
02291                  level+1, mean[nvoxel-1], tmean[nvoxel-1], df);
02292 
02293 #if 0 
02294       
02295       calculate_sum (option_data, level, -1, mean);
02296       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02297           mean[ixyz] = mean[ixyz] / (n*b);
02298 
02299       
02300       if (option_data->model == 1)      
02301       {
02302          volume_read ("sse", tmean, nxyz);
02303          df = a*b*(n-1);
02304       }
02305       else                              
02306       {
02307          volume_read ("ssab", tmean, nxyz);
02308          df = (a-1)*(b-1);
02309       }
02310       fval = (1.0 / df) * (1.0 / (b*n));
02311       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02312       {
02313          stddev =  sqrt(tmean[ixyz] * fval);
02314          if (stddev < EPSILON) tmean[ixyz] = 0.0;
02315          else                  tmean[ixyz] = mean[ixyz] / stddev;
02316       }
02317 #endif
02318  
02319       
02320       write_afni_data (option_data, option_data->amname[imean], 
02321                        mean, tmean, df, 0);
02322 
02323    }
02324 
02325    
02326    free (tmean);   tmean = NULL;
02327    free (mean);    mean = NULL;
02328 }
02329 
02330 
02331 
02332 
02333 
02334 
02335 
02336 
02337 
02338 
02339 void calculate_bmeans (anova_options * option_data)
02340 {
02341    const float  EPSILON = 1.0e-10;    
02342    float * mean = NULL;               
02343    float * tmean = NULL;              
02344    int imean;                         
02345    int level;                         
02346    int n;                             
02347    int ixyz, nxyz;                    
02348    int nvoxel;                        
02349    int a;                             
02350    int b;                             
02351    int nt;                            
02352    int num_means;                     
02353    int df;                            
02354    float fval;                        
02355    float stddev;                      
02356  
02357 
02358    
02359    a = option_data->a;
02360    b = option_data->b;
02361    n = option_data->n;
02362    df = a * b * (n-1);
02363    nt = option_data->nt;
02364    num_means = option_data->num_bmeans;
02365    nxyz = option_data->nxyz;
02366    nvoxel = option_data->nvoxel;
02367                                                                                 
02368    
02369    mean = (float *) malloc(sizeof(float)*nxyz);
02370    tmean = (float *) malloc(sizeof(float)*nxyz);
02371    if ((mean == NULL) || (tmean == NULL))
02372       ANOVA_error ("unable to allocate sufficient memory");
02373                                                                                 
02374    
02375    for (imean = 0;  imean < num_means;  imean++)
02376    {
02377       level = option_data->bmeans[imean];
02378                                                                                 
02379       
02380       calculate_sum (option_data, -1, level, mean);
02381       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02382          mean[ixyz] = mean[ixyz] / (n*a);
02383       if (nvoxel > 0)
02384          printf ("Mean of factor B level %d = %f \n", level+1, mean[nvoxel-1]);
02385                                                                                 
02386       
02387       volume_read ("sse", tmean, nxyz);
02388       fval = (1.0 / df) * (1.0 / (a*n));
02389       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02390       {
02391          stddev =  sqrt(tmean[ixyz] * fval);
02392          if (stddev < EPSILON)
02393            tmean[ixyz] = 0.0;
02394          else
02395            tmean[ixyz] = mean[ixyz] / stddev;
02396       }
02397       if (nvoxel > 0)
02398          printf ("t for mean of factor B level %d = %f \n",
02399                  level+1, tmean[nvoxel-1]);
02400                                                                                 
02401       
02402       write_afni_data (option_data, option_data->bmname[imean],
02403                        mean, tmean, df, 0);
02404                                                                                 
02405    }
02406                                                                                 
02407       
02408       free (tmean);   tmean = NULL;
02409       free (mean);    mean = NULL;
02410 }
02411 
02412 
02413 
02414 
02415 
02416 
02417 
02418 
02419 
02420 
02421 void calculate_xmeans (anova_options * option_data)
02422 {
02423    const float  EPSILON = 1.0e-10;    
02424    float * mean = NULL;               
02425    float * tmean = NULL;              
02426    int imean;                         
02427    int alevel;                        
02428    int blevel;                        
02429    int n;                             
02430    int ixyz, nxyz;                    
02431    int nvoxel;                        
02432    int a;                             
02433    int b;                             
02434    int nt;                            
02435    int num_means;                     
02436    int df;                            
02437    float fval;                        
02438    float stddev;                      
02439  
02440 
02441    
02442    a = option_data->a;
02443    b = option_data->b;
02444    n = option_data->n;
02445    df = a * b * (n-1);
02446    nt = option_data->nt;
02447    num_means = option_data->num_xmeans;
02448    nxyz = option_data->nxyz;
02449    nvoxel = option_data->nvoxel;
02450 
02451    
02452    mean = (float *) malloc(sizeof(float)*nxyz);
02453    tmean = (float *) malloc(sizeof(float)*nxyz);
02454    if ((mean == NULL) || (tmean == NULL))  
02455       ANOVA_error ("unable to allocate sufficient memory");
02456    
02457     
02458    for (imean = 0;  imean < num_means;  imean++)
02459    {
02460       alevel = option_data->xmeans[imean][0];
02461       blevel = option_data->xmeans[imean][1];
02462 
02463       
02464       calculate_sum (option_data, alevel, blevel, mean);
02465       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02466          mean[ixyz] = mean[ixyz] / n;
02467       if (nvoxel > 0)
02468          printf ("Mean of Cell[%d][%d] = %f \n", 
02469                  alevel+1, blevel+1, mean[nvoxel-1]);
02470 
02471       
02472       volume_read ("sse", tmean, nxyz); 
02473       fval = (1.0 / df) * (1.0 / n);
02474       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02475       {
02476          stddev =  sqrt(tmean[ixyz] * fval);
02477          if (stddev < EPSILON)
02478            tmean[ixyz] = 0.0;
02479          else
02480            tmean[ixyz] = mean[ixyz] / stddev;
02481       }
02482       if (nvoxel > 0)
02483          printf ("t-stat for Mean of Cell[%d][%d] = %f \n", 
02484                  alevel+1, blevel+1, tmean[nvoxel-1]);
02485 
02486       
02487       write_afni_data (option_data, option_data->xmname[imean], 
02488                        mean, tmean, df, 0);
02489 
02490    }
02491 
02492       
02493       free (tmean);   tmean = NULL;
02494       free (mean);    mean = NULL;
02495 }
02496 
02497 
02498 
02499 
02500 
02501 
02502 
02503 
02504 
02505 
02506 
02507 
02508 
02509 void calculate_adifferences (anova_options * option_data)
02510 {
02511    float * diff = NULL;                
02512    float * tdiff = NULL;               
02513    float * contrast;                   
02514    int a;                              
02515    int b;                              
02516    int nxyz;                           
02517    int nvoxel;                         
02518    int num_diffs;                      
02519    int idiff;                          
02520    int i, j;                           
02521    int n;                              
02522    int df, df_prod;                    
02523 
02524 
02525    
02526    a = option_data->a;
02527    b = option_data->b;
02528    n = option_data->n;
02529    num_diffs = option_data->num_adiffs;
02530    nxyz = option_data->nxyz;
02531    nvoxel = option_data->nvoxel;
02532 
02533    
02534    df = b*n - 1;
02535    df_prod = df * (df+1);
02536    
02537    
02538    diff = (float *) malloc(sizeof(float)*nxyz);
02539    tdiff = (float *) malloc(sizeof(float)*nxyz);
02540    contrast = (float *) malloc(sizeof(float)*a);
02541    if ((diff == NULL) || (tdiff == NULL) || (contrast == NULL))
02542       ANOVA_error ("calc_adiffs: unable to allocate sufficient memory");
02543 
02544    
02545    for (idiff = 0;  idiff < num_diffs;  idiff++)
02546    {
02547       for (i = 0 ; i < a; i++ ) contrast[i] = 0.0;   
02548 
02549       i = option_data->adiffs[idiff][0];
02550       j = option_data->adiffs[idiff][1];
02551 
02552       
02553       contrast[i] = 1;  contrast[j] = -1;
02554 
02555       
02556       calc_acontr_mean(option_data, contrast, diff);
02557       calc_sum_sq_acontr(option_data, contrast, tdiff);
02558       calculate_t_from_sums(tdiff, diff, tdiff, df, nxyz);
02559 
02560       if (nvoxel > 0)
02561          printf ("Difference of factor A level %d - level %d = %f \n", 
02562                  i+1, j+1, diff[nvoxel-1]);
02563 
02564 #if 0
02565       
02566       calculate_sum (option_data, i, -1, diff);
02567       for (ixyz = 0;  ixyz < nxyz;  ixyz++) diff[ixyz] = diff[ixyz] / (b*n);
02568 
02569       
02570       calculate_sum (option_data, j, -1, tdiff);
02571       for (ixyz = 0;  ixyz < nxyz;  ixyz++) diff[ixyz] -= tdiff[ixyz] / (b*n);
02572 
02573       
02574       if (option_data->model == 1)     
02575       {
02576          volume_read ("sse", tdiff, nxyz); 
02577          df = a*b*(n-1);
02578       } else {                         
02579          volume_read ("ssab", tdiff, nxyz); 
02580          df = (a-1)*(b-1);
02581       }
02582       fval = (1.0 / df) * (2.0 / (b*n));
02583       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02584         {
02585           stddev = sqrt (tdiff[ixyz] * fval);
02586           if (stddev < EPSILON) tdiff[ixyz] = 0.0;
02587           else                  tdiff[ixyz] = diff[ixyz] / stddev;
02588         } 
02589 #endif
02590 
02591       if (nvoxel > 0)
02592          printf ("t for difference of factor A level %d - level %d = %f \n", 
02593                  i+1, j+1, tdiff[nvoxel-1]);
02594 
02595       
02596       write_afni_data (option_data, option_data->adname[idiff], 
02597                        diff, tdiff, df, 0);
02598 
02599    }
02600 
02601    
02602    free (tdiff);    tdiff = NULL;
02603    free (diff);     diff = NULL;
02604    free (contrast); contrast = NULL;
02605 }
02606 
02607 
02608 
02609 
02610 
02611 
02612 
02613 
02614 
02615 
02616 void calculate_bdifferences (anova_options * option_data)
02617 {
02618    const float  EPSILON = 1.0e-10;     
02619    float * diff = NULL;                
02620    float * tdiff = NULL;               
02621    int a;                              
02622    int b;                              
02623    int ixyz, nxyz;                     
02624    int nvoxel;                         
02625    int num_diffs;                      
02626    int idiff;                          
02627    int i, j;                           
02628    int n;                              
02629    int df;                             
02630    float fval;                         
02631    float stddev;                       
02632                                                                                 
02633                                                                                 
02634    
02635    a = option_data->a;
02636    b = option_data->b;
02637    n = option_data->n;
02638    df = a*b*(n-1);
02639    num_diffs = option_data->num_bdiffs;
02640    nxyz = option_data->nxyz;
02641    nvoxel = option_data->nvoxel;
02642                                                                                 
02643    
02644    diff = (float *) malloc(sizeof(float)*nxyz);
02645    tdiff = (float *) malloc(sizeof(float)*nxyz);
02646    if ((diff == NULL) || (tdiff == NULL))
02647       ANOVA_error ("unable to allocate sufficient memory");
02648                                                                                 
02649    
02650    for (idiff = 0;  idiff < num_diffs;  idiff++)
02651    {
02652                                                                                 
02653       
02654       i = option_data->bdiffs[idiff][0];
02655       calculate_sum (option_data, -1, i, diff);
02656       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02657          diff[ixyz] = diff[ixyz] / (a*n);
02658                                                                                 
02659       
02660       j = option_data->bdiffs[idiff][1];
02661       calculate_sum (option_data, -1, j, tdiff);
02662       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02663          diff[ixyz] -= tdiff[ixyz] / (a*n);
02664       if (nvoxel > 0)
02665          printf ("Difference of factor B level %d - level %d = %f \n",
02666                  i+1, j+1, diff[nvoxel-1]);
02667                                                                                 
02668       
02669       volume_read ("sse", tdiff, nxyz);
02670       fval = (1.0 / df) * (2.0 / (a*n));
02671       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02672         {
02673           stddev = sqrt (tdiff[ixyz] * fval);
02674           if (stddev < EPSILON)
02675             tdiff[ixyz] = 0.0;
02676           else
02677             tdiff[ixyz] = diff[ixyz] / stddev;
02678         }
02679                                                                                 
02680       if (nvoxel > 0)
02681          printf ("t for difference of factor B level %d - level %d = %f \n",
02682                  i+1, j+1, tdiff[nvoxel-1]);
02683                                                                                 
02684       
02685       write_afni_data (option_data, option_data->bdname[idiff],
02686                        diff, tdiff, df, 0);
02687                                                                                 
02688    }
02689                                                                                 
02690    
02691    free (tdiff);   tdiff = NULL;
02692    free (diff);    diff = NULL;
02693 }
02694 
02695 
02696 
02697 
02698 
02699 
02700 
02701 
02702 
02703 
02704 void calculate_xdifferences (anova_options * option_data)
02705 {
02706    const float  EPSILON = 1.0e-10;     
02707    float * diff = NULL;                
02708    float * tdiff = NULL;               
02709    int a;                              
02710    int b;                              
02711    int ixyz, nxyz;                     
02712    int nvoxel;                         
02713    int num_diffs;                      
02714    int idiff;                          
02715    int ia, ib, ja, jb;                 
02716    int n;                              
02717    int df;                             
02718    float fval;                         
02719    float stddev;                       
02720 
02721 
02722    
02723    a = option_data->a;
02724    b = option_data->b;
02725    n = option_data->n;
02726    df = a*b*(n-1);
02727    num_diffs = option_data->num_xdiffs;
02728    nxyz = option_data->nxyz;
02729    nvoxel = option_data->nvoxel;
02730    
02731    
02732    diff = (float *) malloc(sizeof(float)*nxyz);
02733    tdiff = (float *) malloc(sizeof(float)*nxyz);
02734    if ((diff == NULL) || (tdiff == NULL))
02735       ANOVA_error ("unable to allocate sufficient memory");
02736 
02737    
02738    for (idiff = 0;  idiff < num_diffs;  idiff++)
02739    {
02740 
02741       
02742       ia = option_data->xdiffs[idiff][0][0];
02743       ib = option_data->xdiffs[idiff][0][1];
02744       calculate_sum (option_data, ia, ib, diff);
02745       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02746          diff[ixyz] = diff[ixyz] / n;
02747 
02748       
02749       ja = option_data->xdiffs[idiff][1][0];
02750       jb = option_data->xdiffs[idiff][1][1];
02751       calculate_sum (option_data, ja, jb, tdiff);
02752       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02753          diff[ixyz] -= tdiff[ixyz] / n;
02754       if (nvoxel > 0)
02755          printf ("Difference of Cell[%d][%d] - Cell[%d][%d] = %f \n", 
02756                  ia+1, ib+1, ja+1, jb+1, diff[nvoxel-1]);
02757 
02758       
02759       volume_read ("sse", tdiff, nxyz); 
02760       fval = (1.0 / df) * (2.0 / n);
02761       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02762         {
02763           stddev = sqrt (tdiff[ixyz] * fval);
02764           if (stddev < EPSILON)
02765             tdiff[ixyz] = 0.0;
02766           else
02767             tdiff[ixyz] = diff[ixyz] / stddev;
02768         } 
02769 
02770       if (nvoxel > 0)
02771         printf ("t-stat for Cell[%d][%d] - Cell[%d][%d] = %f \n", 
02772                 ia+1, ib+1, ja+1, jb+1, tdiff[nvoxel-1]);
02773 
02774       
02775       write_afni_data (option_data, option_data->xdname[idiff], 
02776                        diff, tdiff, df, 0);
02777 
02778    }
02779 
02780    
02781    free (tdiff);   tdiff = NULL;
02782    free (diff);    diff = NULL;
02783 
02784 }
02785 
02786 
02787 
02788 
02789 
02790 
02791 
02792 
02793 
02794 
02795 
02796 
02797 void calculate_acontrasts (anova_options * option_data)
02798 {
02799    float * contr = NULL;               
02800    float * tcontr = NULL;              
02801    int b;                              
02802    int nxyz;                           
02803    int nvoxel;                         
02804    int num_contr;                      
02805    int icontr;                         
02806    int n;                              
02807    int df;                             
02808 
02809 
02810    
02811    b = option_data->b;
02812    n = option_data->n;
02813    num_contr = option_data->num_acontr;
02814    nxyz = option_data->nxyz;
02815    nvoxel = option_data->nvoxel;
02816 
02817    df = b*n - 1;                
02818    
02819    
02820    contr  = (float *) malloc(sizeof(float)*nxyz);
02821    tcontr = (float *) malloc(sizeof(float)*nxyz);
02822    if ((contr == NULL) || (tcontr == NULL))
02823       ANOVA_error ("unable to allocate sufficient memory");
02824 
02825 
02826    
02827    for (icontr = 0;  icontr < num_contr;  icontr++)
02828    {
02829       
02830       calc_acontr_mean(option_data, option_data->acontr[icontr], contr);
02831       calc_sum_sq_acontr(option_data, option_data->acontr[icontr], tcontr);
02832 
02833       
02834       calculate_t_from_sums(tcontr, contr, tcontr, df, nxyz);
02835 
02836 #if 0 
02837       for (level = 0;  level < a;  level++)
02838       {
02839          c = option_data->acontr[icontr][level];
02840          if (c == 0.0) continue;
02841 
02842          
02843          calculate_sum (option_data, level, -1, tcontr);
02844          fval += c * c / (b*n);
02845          for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02846             contr[ixyz] += c * tcontr[ixyz] / (b*n);
02847       }
02848 
02849       
02850       if (option_data->model == 1) {
02851          volume_read ("sse", tcontr, nxyz);
02852          df = a*b*(n-1);
02853       } else {
02854          volume_read ("ssab", tcontr, nxyz);
02855          df = (a-1)*(b-1);
02856       }
02857                                                                                 
02858       
02859       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02860       {
02861          stddev = sqrt ((tcontr[ixyz] / df) * fval);
02862          if (stddev < EPSILON) tcontr[ixyz] = 0.0;
02863          else                  tcontr[ixyz] = contr[ixyz] / stddev;
02864       }
02865 #endif
02866 
02867       if (nvoxel > 0)
02868          printf ("No.%d contrast for factor A = %f, t = %f, df = %d\n",
02869                  icontr+1, contr[nvoxel-1], tcontr[nvoxel-1], df);
02870 
02871       
02872       write_afni_data (option_data, option_data->acname[icontr], 
02873                        contr, tcontr, df, 0);
02874 
02875    }
02876 
02877    
02878    free (tcontr);   tcontr = NULL;
02879    free (contr);    contr = NULL;
02880 
02881 }
02882 
02883 
02884 
02885 
02886 
02887 
02888 
02889 
02890 
02891 void calculate_bcontrasts (anova_options * option_data)
02892 {
02893    const float  EPSILON = 1.0e-10;     
02894    float * contr = NULL;               
02895    float * tcontr = NULL;              
02896    int a;                              
02897    int b;                              
02898    int ixyz, nxyz;                     
02899    int nvoxel;                         
02900    int num_contr;                      
02901    int icontr;                         
02902    int level;                          
02903    int df;                             
02904    int n;                              
02905    float fval;                         
02906    float c;                            
02907    float stddev;                       
02908 
02909 
02910    
02911    a = option_data->a;
02912    b = option_data->b;
02913    n = option_data->n;
02914    num_contr = option_data->num_bcontr;
02915    nxyz = option_data->nxyz;
02916    nvoxel = option_data->nvoxel;
02917                                                                                 
02918    
02919    contr  = (float *) malloc(sizeof(float)*nxyz);
02920    tcontr = (float *) malloc(sizeof(float)*nxyz);
02921    if ((contr == NULL) || (tcontr == NULL))
02922       ANOVA_error ("unable to allocate sufficient memory");
02923                                                                                 
02924                                                                                 
02925    
02926    for (icontr = 0;  icontr < num_contr;  icontr++)
02927    {
02928       volume_zero (contr, nxyz);
02929       fval = 0.0;
02930                                                                                 
02931       for (level = 0;  level < b;  level++)
02932       {
02933          c = option_data->bcontr[icontr][level];
02934          if (c == 0.0) continue;
02935                                                                                 
02936          
02937          calculate_sum (option_data, -1, level, tcontr);
02938          fval += c * c / (a*n);
02939          for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02940             contr[ixyz] += c * tcontr[ixyz] / (a*n);
02941       }
02942       if (nvoxel > 0)
02943          printf ("No.%d contrast for factor B = %f \n",
02944                  icontr+1, contr[nvoxel-1]);
02945                                                                                 
02946       
02947       volume_read ("sse", tcontr, nxyz);
02948       df = a * b * (n-1);
02949       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
02950       {
02951           stddev = sqrt ((tcontr[ixyz] / df) * fval);
02952           if (stddev < EPSILON)
02953             tcontr[ixyz] = 0.0;
02954           else
02955             tcontr[ixyz] = contr[ixyz] / stddev;
02956       }
02957                                                                                 
02958       if (nvoxel > 0)
02959         printf ("t of No.%d contrast for factor B = %f \n",
02960                 icontr+1, tcontr[nvoxel-1]);
02961                                                                                 
02962       
02963       write_afni_data (option_data, option_data->bcname[icontr],
02964                        contr, tcontr, a*b*(n-1), 0);
02965                                                                                 
02966    }
02967                                                                                 
02968    
02969    free (tcontr);   tcontr = NULL;
02970    free (contr);    contr = NULL;
02971 }
02972 
02973 
02974 
02975 
02976 
02977 
02978 
02979 
02980 
02981 
02982 void calculate_xcontrasts (anova_options * option_data)
02983 {
02984    const float  EPSILON = 1.0e-10;     
02985    float * contr = NULL;               
02986    float * tcontr = NULL;              
02987    int a;                              
02988    int b;                              
02989    int ixyz, nxyz;                     
02990    int nvoxel;                         
02991    int num_contr;                      
02992    int icontr;                         
02993    int ilevel, jlevel;                 
02994    int df;                             
02995    int n;                              
02996    float fval;                         
02997    float c;                            
02998    float stddev;                       
02999 
03000 
03001    
03002    a = option_data->a;
03003    b = option_data->b;
03004    n = option_data->n;
03005    num_contr = option_data->num_xcontr;
03006    nxyz = option_data->nxyz;
03007    nvoxel = option_data->nvoxel;
03008    
03009    
03010    contr  = (float *) malloc(sizeof(float)*nxyz);
03011    tcontr = (float *) malloc(sizeof(float)*nxyz);
03012    if ((contr == NULL) || (tcontr == NULL))
03013       ANOVA_error ("unable to allocate sufficient memory");
03014 
03015 
03016    
03017    for (icontr = 0;  icontr < num_contr;  icontr++)
03018    {
03019       volume_zero (contr, nxyz);
03020       fval = 0.0;
03021       
03022       for (ilevel = 0;  ilevel < a;  ilevel++)
03023         for (jlevel = 0;  jlevel < b;  jlevel++)
03024           {
03025             c = option_data->xcontr[icontr][ilevel][jlevel]; 
03026             if (c == 0.0) continue; 
03027     
03028             
03029             calculate_sum (option_data, ilevel, jlevel, tcontr);
03030             fval += c * c / n;
03031             for (ixyz = 0;  ixyz < nxyz;  ixyz++)
03032               contr[ixyz] += c * tcontr[ixyz] / n;
03033           }
03034       if (nvoxel > 0)
03035         printf ("No.%d contrast for cell means = %f \n", 
03036                 icontr+1, contr[nvoxel-1]);
03037 
03038       
03039       volume_read ("sse", tcontr, nxyz);
03040       df = a * b * (n-1);
03041       for (ixyz = 0;  ixyz < nxyz;  ixyz++)
03042       {
03043           stddev = sqrt ((tcontr[ixyz] / df) * fval);
03044           if (stddev < EPSILON)
03045             tcontr[ixyz] = 0.0;
03046           else
03047             tcontr[ixyz] = contr[ixyz] / stddev;
03048       }   
03049 
03050       if (nvoxel > 0)
03051         printf ("t-stat for No.%d contrast for cell means = %f \n", 
03052                 icontr+1, tcontr[nvoxel-1]);
03053 
03054       
03055       write_afni_data (option_data, option_data->xcname[icontr], 
03056                        contr, tcontr, a*b*(n-1), 0);
03057 
03058    }
03059 
03060    
03061    free (tcontr);   tcontr = NULL;
03062    free (contr);    contr = NULL;
03063 
03064 }
03065 
03066 
03067 
03068 
03069 
03070 
03071 
03072 void calculate_anova (anova_options * option_data)
03073 {
03074 
03075   
03076   calculate_ss0 (option_data);
03077   calculate_ssi (option_data);
03078   calculate_ssj (option_data);
03079   calculate_ssij (option_data);
03080   if (option_data->n != 1)  calculate_ssijk (option_data);
03081 
03082 
03083   
03084   if (option_data->n != 1)  
03085     {
03086       calculate_sse (option_data);
03087       volume_delete ("ssijk");
03088     }
03089   
03090   
03091   calculate_sstr (option_data);
03092   volume_delete ("ssij");
03093 
03094   
03095   calculate_ssa (option_data);
03096   volume_delete ("ssi");
03097   
03098   
03099   calculate_ssb (option_data);
03100   volume_delete ("ssj");
03101 
03102   volume_delete ("ss0");
03103   
03104   
03105   calculate_ssab (option_data);
03106   
03107 }
03108 
03109 
03110 
03111 
03112 
03113 
03114 
03115 void analyze_results (anova_options * option_data)
03116 {
03117   
03118    
03119    if (option_data->nftr)  calculate_ftr (option_data);
03120 
03121    
03122    if (option_data->nfa)  calculate_fa (option_data);
03123 
03124    
03125    if (option_data->nfb)  calculate_fb (option_data);
03126 
03127    
03128    if (option_data->nfab)  calculate_fab (option_data);
03129 
03130    
03131    if (option_data->num_ameans)  calculate_ameans (option_data);
03132 
03133    
03134    if (option_data->num_bmeans)  calculate_bmeans (option_data);
03135 
03136    
03137    if (option_data->num_xmeans)  calculate_xmeans (option_data);
03138 
03139    
03140    if (option_data->num_adiffs)  calculate_adifferences (option_data);
03141 
03142    
03143    if (option_data->num_bdiffs)  calculate_bdifferences (option_data);
03144 
03145    
03146    if (option_data->num_xdiffs)  calculate_xdifferences (option_data);
03147 
03148    
03149    if (option_data->num_acontr)  calculate_acontrasts (option_data);
03150 
03151    
03152    if (option_data->num_bcontr)  calculate_bcontrasts (option_data);
03153 
03154    
03155    if (option_data->num_xcontr)  calculate_xcontrasts (option_data);
03156 
03157 }
03158 
03159 
03160 
03161 
03162 
03163 
03164 
03165 void create_bucket (anova_options * option_data)
03166 
03167 {
03168   char bucket_str[10000];             
03169   char refit_str[10000];              
03170   THD_3dim_dataset * dset=NULL;       
03171   THD_3dim_dataset * new_dset=NULL;   
03172   int i;                              
03173   int ibrick;                         
03174   char str[100];                      
03175 
03176 
03177   
03178   dset = THD_open_dataset (option_data->first_dataset) ;
03179   if( ! ISVALID_3DIM_DATASET(dset) ){
03180     fprintf(stderr,"*** Unable to open dataset file %s\n",
03181             option_data->first_dataset);
03182     exit(1) ;
03183   }
03184 
03185        if( DSET_IS_1D(dset) ) USE_1D_filenames(1) ; 
03186   else if( DSET_IS_3D(dset) ) USE_1D_filenames(3) ; 
03187   
03188 
03189   
03190   new_dset = EDIT_empty_copy( dset ) ;
03191   THD_delete_3dim_dataset (dset , False);   dset = NULL;
03192   EDIT_dset_items (new_dset, 
03193                    ADN_directory_name, option_data->session,
03194                    ADN_none);
03195 
03196   
03197   
03198   strcpy (bucket_str, "3dbucket");
03199   strcat (bucket_str, " -prefix ");
03200   strcat (bucket_str, option_data->bucket_filename);
03201 
03202 
03203   
03204   strcpy (refit_str, "3drefit ");
03205   ibrick = -1;
03206 
03207  
03208  
03209   if (option_data->nftr != 0)
03210     {
03211       add_file_name (new_dset, option_data->ftrname, bucket_str);
03212 
03213       ibrick++;
03214       sprintf (str, " -sublabel %d %s:Inten ",
03215                ibrick, option_data->ftrname);
03216       strcat (refit_str, str);
03217 
03218       ibrick++;
03219       sprintf (str, " -sublabel %d %s:F-stat ", 
03220                ibrick, option_data->ftrname);
03221       strcat (refit_str, str);
03222     }
03223   
03224   
03225   
03226   if (option_data->nfa != 0)
03227     {
03228       add_file_name (new_dset, option_data->faname, bucket_str);
03229 
03230       ibrick++;
03231       sprintf (str, " -sublabel %d %s:Inten ",
03232                ibrick, option_data->faname);
03233       strcat (refit_str, str);
03234 
03235       ibrick++;
03236       sprintf (str, " -sublabel %d %s:F-stat ", 
03237                ibrick, option_data->faname);
03238       strcat (refit_str, str);
03239     }
03240   
03241   
03242   
03243   if (option_data->nfb != 0)
03244     {
03245       add_file_name (new_dset, option_data->fbname, bucket_str);
03246 
03247       ibrick++;
03248       sprintf (str, " -sublabel %d %s:Inten ",
03249                ibrick, option_data->fbname);
03250       strcat (refit_str, str);
03251 
03252       ibrick++;
03253       sprintf (str, " -sublabel %d %s:F-stat ", 
03254                ibrick, option_data->fbname);
03255       strcat (refit_str, str);
03256     }
03257   
03258   
03259   
03260   if (option_data->nfab != 0)
03261     {
03262       add_file_name (new_dset, option_data->fabname, bucket_str);
03263 
03264       ibrick++;
03265       sprintf (str, " -sublabel %d %s:Inten ",
03266                ibrick, option_data->fabname);
03267       strcat (refit_str, str);
03268 
03269       ibrick++;
03270       sprintf (str, " -sublabel %d %s:F-stat ", 
03271                ibrick, option_data->fabname);
03272       strcat (refit_str, str);
03273     }
03274   
03275   
03276   
03277   if (option_data->num_ameans > 0)
03278     for (i = 0; i < option_data->num_ameans; i++)
03279       {
03280         add_file_name (new_dset, option_data->amname[i], bucket_str);
03281 
03282         ibrick++;
03283         sprintf (str, " -sublabel %d %s:Mean ", 
03284                  ibrick, option_data->amname[i]);
03285         strcat (refit_str, str);
03286 
03287         ibrick++;
03288         sprintf (str, " -sublabel %d %s:t-stat ", 
03289                  ibrick, option_data->amname[i]);
03290         strcat (refit_str, str);
03291       }
03292   
03293 
03294   
03295   if (option_data->num_bmeans > 0)
03296     for (i = 0; i < option_data->num_bmeans; i++)
03297       {
03298         add_file_name (new_dset, option_data->bmname[i], bucket_str);
03299 
03300         ibrick++;
03301         sprintf (str, " -sublabel %d %s:Mean ", 
03302                  ibrick, option_data->bmname[i]);
03303         strcat (refit_str, str);
03304 
03305         ibrick++;
03306         sprintf (str, " -sublabel %d %s:t-stat ", 
03307                  ibrick, option_data->bmname[i]);
03308         strcat (refit_str, str);
03309       }
03310   
03311 
03312   
03313   if (option_data->num_xmeans > 0)
03314     for (i = 0; i < option_data->num_xmeans; i++)
03315       {
03316         add_file_name (new_dset, option_data->xmname[i], bucket_str);
03317 
03318         ibrick++;
03319         sprintf (str, " -sublabel %d %s:Mean ", 
03320                  ibrick, option_data->xmname[i]);
03321         strcat (refit_str, str);
03322 
03323         ibrick++;
03324         sprintf (str, " -sublabel %d %s:t-stat ", 
03325                  ibrick, option_data->xmname[i]);
03326         strcat (refit_str, str);
03327       }
03328   
03329 
03330   
03331   if (option_data->num_adiffs > 0)
03332     for (i = 0; i < option_data->num_adiffs; i++)
03333       {
03334         add_file_name (new_dset, option_data->adname[i], bucket_str);
03335 
03336         ibrick++;
03337         sprintf (str, " -sublabel %d %s:Diff ", 
03338                  ibrick, option_data->adname[i]);
03339         strcat (refit_str, str);
03340 
03341         ibrick++;
03342         sprintf (str, " -sublabel %d %s:t-stat ", 
03343                  ibrick, option_data->adname[i]);
03344         strcat (refit_str, str);
03345       }
03346   
03347 
03348   
03349   if (option_data->num_bdiffs > 0)
03350     for (i = 0; i < option_data->num_bdiffs; i++)
03351       {
03352         add_file_name (new_dset, option_data->bdname[i], bucket_str);
03353 
03354         ibrick++;
03355         sprintf (str, " -sublabel %d %s:Diff ", 
03356                  ibrick, option_data->bdname[i]);
03357         strcat (refit_str, str);
03358 
03359         ibrick++;
03360         sprintf (str, " -sublabel %d %s:t-stat ", 
03361                  ibrick, option_data->bdname[i]);
03362         strcat (refit_str, str);
03363       }
03364   
03365 
03366   
03367   if (option_data->num_xdiffs > 0)
03368     for (i = 0; i < option_data->num_xdiffs; i++)
03369       {
03370         add_file_name (new_dset, option_data->xdname[i], bucket_str);
03371 
03372         ibrick++;
03373         sprintf (str, " -sublabel %d %s:Diff ", 
03374                  ibrick, option_data->xdname[i]);
03375         strcat (refit_str, str);
03376 
03377         ibrick++;
03378         sprintf (str, " -sublabel %d %s:t-stat ", 
03379                  ibrick, option_data->xdname[i]);
03380         strcat (refit_str, str);
03381       }
03382   
03383 
03384   
03385   if (option_data->num_acontr > 0)
03386     for (i = 0; i < option_data->num_acontr; i++)
03387       {
03388         add_file_name (new_dset, option_data->acname[i], bucket_str);
03389 
03390         ibrick++;
03391         sprintf (str, " -sublabel %d %s:Contr ", 
03392                  ibrick, option_data->acname[i]);
03393         strcat (refit_str, str);
03394 
03395         ibrick++;
03396         sprintf (str, " -sublabel %d %s:t-stat ", 
03397                  ibrick, option_data->acname[i]);
03398         strcat (refit_str, str);
03399       }
03400 
03401 
03402   
03403   if (option_data->num_bcontr > 0)
03404     for (i = 0; i < option_data->num_bcontr; i++)
03405       {
03406         add_file_name (new_dset, option_data->bcname[i], bucket_str);
03407 
03408         ibrick++;
03409         sprintf (str, " -sublabel %d %s:Contr ", 
03410                  ibrick, option_data->bcname[i]);
03411         strcat (refit_str, str);
03412 
03413         ibrick++;
03414         sprintf (str, " -sublabel %d %s:t-stat ", 
03415                  ibrick, option_data->bcname[i]);
03416         strcat (refit_str, str);
03417       }
03418 
03419 
03420   
03421   if (option_data->num_xcontr > 0)
03422     for (i = 0; i < option_data->num_xcontr; i++)
03423       {
03424         add_file_name (new_dset, option_data->xcname[i], bucket_str);
03425 
03426         ibrick++;
03427         sprintf (str, " -sublabel %d %s:Contr ", 
03428                  ibrick, option_data->xcname[i]);
03429         strcat (refit_str, str);
03430 
03431         ibrick++;
03432         sprintf (str, " -sublabel %d %s:t-stat ", 
03433                  ibrick, option_data->xcname[i]);
03434         strcat (refit_str, str);
03435       }
03436 
03437 
03438   
03439 
03440   printf("Writing `bucket' dataset ");
03441   printf("into %s\n", option_data->bucket_filename);
03442 
03443   fprintf(stderr,"RUNNING COMMAND: %s\n",bucket_str) ;
03444   system (bucket_str);
03445 
03446 
03447   
03448   add_file_name (new_dset, option_data->bucket_filename, refit_str);
03449   fprintf(stderr,"RUNNING COMMAND: %s\n",refit_str) ;
03450   system (refit_str);
03451 
03452 
03453   
03454   THD_delete_3dim_dataset (new_dset , False);   new_dset = NULL;
03455 
03456 }
03457 
03458 
03459 
03460 
03461 
03462 
03463 
03464 
03465 
03466 void terminate (anova_options * option_data)
03467 {
03468   int i, j;
03469   THD_3dim_dataset * dset=NULL;       
03470   THD_3dim_dataset * new_dset=NULL;   
03471   char filename[MAX_NAME_LENGTH];
03472 
03473 
03474    
03475    volume_delete ("sstr");
03476    volume_delete ("sse");
03477    volume_delete ("ssa");
03478    volume_delete ("ssb");
03479    volume_delete ("ssab");
03480    for (i = 0;  i < option_data->a;  i++)
03481    {
03482       sprintf (filename, "ya.%d", i);
03483       volume_delete (filename);
03484    }
03485    for (j = 0;  j < option_data->b;  j++)
03486    {
03487       sprintf (filename, "yb.%d", j);
03488       volume_delete (filename);
03489    }
03490 
03491 
03492   
03493   if (option_data->bucket_filename != NULL)
03494     create_bucket (option_data);
03495 
03496   
03497   
03498 
03499   if (option_data->bucket_filename != NULL)
03500     {
03501 
03502       
03503       dset = THD_open_dataset (option_data->first_dataset) ;
03504       if( ! ISVALID_3DIM_DATASET(dset) ){
03505         fprintf(stderr,"*** Unable to open dataset file %s\n",
03506                 option_data->first_dataset);
03507         exit(1) ;
03508       }
03509       
03510       
03511       new_dset = EDIT_empty_copy (dset);
03512       THD_delete_3dim_dataset (dset , False);   dset = NULL;
03513       EDIT_dset_items (new_dset, 
03514                        ADN_directory_name, option_data->session,
03515                        ADN_none);
03516       
03517       
03518       if (option_data->nftr != 0)
03519         remove_dataset (new_dset, option_data->ftrname);
03520       
03521       
03522       if (option_data->nfa != 0)
03523         remove_dataset (new_dset, option_data->faname);
03524       
03525       
03526       if (option_data->nfb != 0)
03527         remove_dataset (new_dset, option_data->fbname);
03528       
03529       
03530       if (option_data->nfab != 0)
03531         remove_dataset (new_dset, option_data->fabname);
03532       
03533       
03534       if (option_data->num_ameans > 0)
03535         for (i = 0; i < option_data->num_ameans; i++)
03536           remove_dataset (new_dset, option_data->amname[i]);
03537       
03538       
03539       if (option_data->num_bmeans > 0)
03540         for (i = 0; i < option_data->num_bmeans; i++)
03541           remove_dataset (new_dset, option_data->bmname[i]);
03542       
03543       
03544       if (option_data->num_xmeans > 0)
03545         for (i = 0; i < option_data->num_xmeans; i++)
03546           remove_dataset (new_dset, option_data->xmname[i]);
03547       
03548       
03549       if (option_data->num_adiffs > 0)
03550         for (i = 0; i < option_data->num_adiffs; i++)
03551           remove_dataset (new_dset, option_data->adname[i]);
03552       
03553       
03554       if (option_data->num_bdiffs > 0)
03555         for (i = 0; i < option_data->num_bdiffs; i++)
03556           remove_dataset (new_dset, option_data->bdname[i]);
03557       
03558       
03559       if (option_data->num_xdiffs > 0)
03560         for (i = 0; i < option_data->num_xdiffs; i++)
03561           remove_dataset (new_dset, option_data->xdname[i]);
03562       
03563       
03564       if (option_data->num_acontr > 0)
03565         for (i = 0; i < option_data->num_acontr; i++)
03566           remove_dataset (new_dset, option_data->acname[i]);
03567       
03568       
03569       if (option_data->num_bcontr > 0)
03570         for (i = 0; i < option_data->num_bcontr; i++)
03571           remove_dataset (new_dset, option_data->bcname[i]);
03572       
03573       
03574       if (option_data->num_xcontr > 0)
03575         for (i = 0; i < option_data->num_xcontr; i++)
03576           remove_dataset (new_dset, option_data->xcname[i]);
03577       
03578       THD_delete_3dim_dataset (new_dset , False);   new_dset = NULL;
03579     }  
03580   
03581 
03582   
03583   destroy_anova_options (option_data);
03584 
03585 }
03586 
03587 
03588 
03589 
03590 
03591 
03592 
03593 int main (int argc, char ** argv)
03594 {
03595    anova_options * option_data = NULL;
03596 
03597   
03598    
03599    printf ("\n\n");
03600    printf ("Program:          %s \n", PROGRAM_NAME);
03601    printf ("Author:           %s \n", PROGRAM_AUTHOR); 
03602    printf ("Initial Release:  %s \n", PROGRAM_INITIAL);
03603    printf ("Latest Revision:  %s \n", PROGRAM_LATEST);
03604    printf ("\n");
03605 
03606    
03607 
03608    machdep() ;
03609    { int new_argc ; char ** new_argv ;
03610      addto_args( argc , argv , &new_argc , &new_argv ) ;
03611      if( new_argv != NULL ){ argc = new_argc ; argv = new_argv ; }
03612    }
03613    
03614    
03615    initialize (argc, argv, &option_data);
03616 
03617    
03618    calculate_anova (option_data);
03619 
03620    
03621    analyze_results (option_data);
03622 
03623    
03624    terminate (option_data);
03625    free (option_data);   option_data = NULL;
03626 
03627    exit(0);
03628 }