Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
SUMA_3dSurfMask.c
Go to the documentation of this file.00001 #include "SUMA_suma.h"
00002
00003 SUMA_SurfaceViewer *SUMAg_cSV = NULL;
00004 SUMA_SurfaceViewer *SUMAg_SVv = NULL;
00005
00006 int SUMAg_N_SVv = 0;
00007 SUMA_DO *SUMAg_DOv = NULL;
00008 int SUMAg_N_DOv = 0;
00009 SUMA_CommonFields *SUMAg_CF = NULL;
00010
00011 void usage_3dSurfMask (SUMA_GENERIC_ARGV_PARSE *ps)
00012 {
00013 static char FuncName[]={"usage_3dSurfMask"};
00014 char * s = NULL, *sio=NULL, *st = NULL, *sts = NULL;
00015 int i;
00016 s = SUMA_help_basics();
00017 sio = SUMA_help_IO_Args(ps);
00018 printf ( "\n"
00019 "Usage: 3dSurfMask <-i_TYPE SURFACE> <-prefix PREFIX>\n"
00020 " <-grid_parent GRID_VOL> [-sv SURF_VOL] [-mask_only]\n"
00021 " \n"
00022 " Creates a volumetric dataset that marks the inside\n"
00023 " of the surface."
00024 " Voxels in the output dataset are set to the following\n"
00025 " values:\n"
00026 " 0: Voxel outside surface\n"
00027 " 1: Voxel just outside the surface. This means the voxel\n"
00028 " center is outside the surface but inside the \n"
00029 " bounding box of a triangle in the mesh. \n"
00030 " 2: Voxel contains a surface node. \n"
00031 " 3: Voxel just inside the surface. This means the voxel\n"
00032 " center is inside the surface and inside the \n"
00033 " bounding box of a triangle in the mesh. \n"
00034 " 4: Voxel inside the surface. \n"
00035 "\n"
00036 " Mandatory Parameters:\n"
00037 " -i_TYPE SURFACE: Specify input surface.\n"
00038 " You can also use -t* and -spec and -surf\n"
00039 " methods to input surfaces. See below\n"
00040 " for more details.\n"
00041 " -prefix PREFIX: Prefix of output dataset.\n"
00042 " -grid_parent GRID_VOL: Specifies the grid for the\n"
00043 " output volume."
00044 "\n"
00045 " Other parameters:\n"
00046 " -mask_only: Produce an output dataset where voxels\n"
00047 " are 1 inside the surface and 0 outside,\n"
00048 " instead of the more nuanced output above.\n"
00049 "\n"
00050 "%s"
00051 "%s"
00052 "\n", sio, s);
00053 SUMA_free(s); s = NULL; SUMA_free(st); st = NULL; SUMA_free(sio); sio = NULL;
00054 s = SUMA_New_Additions(0, 1); printf("%s\n", s);SUMA_free(s); s = NULL;
00055 printf(" Ziad S. Saad SSCC/NIMH/NIH ziad@nih.gov \n");
00056 exit(0);
00057 }
00058
00059 SUMA_GENERIC_PROG_OPTIONS_STRUCT *SUMA_3dSurfMask_ParseInput(char *argv[], int argc, SUMA_GENERIC_ARGV_PARSE *ps)
00060 {
00061 static char FuncName[]={"SUMA_BrainWrap_ParseInput"};
00062 SUMA_GENERIC_PROG_OPTIONS_STRUCT *Opt=NULL;
00063 int kar;
00064 SUMA_Boolean brk;
00065 SUMA_Boolean LocalHead = NOPE;
00066
00067 SUMA_ENTRY;
00068
00069 Opt = SUMA_Alloc_Generic_Prog_Options_Struct();
00070 Opt->obj_type = 1;
00071 kar = 1;
00072 brk = NOPE;
00073 while (kar < argc) {
00074
00075 if (strcmp(argv[kar], "-h") == 0 || strcmp(argv[kar], "-help") == 0) {
00076 usage_3dSurfMask(ps);
00077 exit (0);
00078 }
00079
00080 SUMA_SKIP_COMMON_OPTIONS(brk, kar);
00081
00082 if (!brk && (strcmp(argv[kar], "-prefix") == 0))
00083 {
00084 if (kar+1 >= argc)
00085 {
00086 fprintf (SUMA_STDERR, "need a number after -prefix \n");
00087 exit (1);
00088 }
00089 Opt->out_vol_prefix = SUMA_AfniPrefix(argv[++kar], Opt->out_vol_view, NULL, &(Opt->out_vol_exists));
00090
00091 brk = YUP;
00092 }
00093
00094 if (!brk && (strcmp(argv[kar], "-grid_parent") == 0))
00095 {
00096 if (kar+1 >= argc)
00097 {
00098 fprintf (SUMA_STDERR, "need a dataset after -grid_parent \n");
00099 exit (1);
00100 }
00101 Opt->out_grid_prefix = SUMA_AfniPrefix(argv[++kar], Opt->out_grid_view, NULL, &(Opt->out_grid_exists));
00102 if (!SUMA_AfniExistsView(Opt->out_grid_exists, Opt->out_grid_view)) {
00103 fprintf(SUMA_STDERR, "Error 3dSurfMask:\nGrid parent %s%s does not exist.\n", Opt->out_grid_prefix, Opt->out_grid_view);
00104 exit(1);
00105 }
00106 brk = YUP;
00107 }
00108
00109 if (!brk && (strcmp(argv[kar], "-mask_only") == 0))
00110 {
00111 Opt->obj_type = 2;
00112 brk = YUP;
00113 }
00114
00115 if (!brk && (strcmp(argv[kar], "-debug") == 0))
00116 {
00117 if (kar+1 >= argc)
00118 {
00119 fprintf (SUMA_STDERR, "need a number after -debug \n");
00120 exit (1);
00121 }
00122
00123 Opt->debug = atoi(argv[++kar]);
00124 brk = YUP;
00125 }
00126 if (!brk && !ps->arg_checked[kar]) {
00127 fprintf (SUMA_STDERR,"Error 3dSurfMask:\nOption %s not understood. Try -help for usage\n", argv[kar]);
00128 exit (1);
00129 } else {
00130 brk = NOPE;
00131 kar ++;
00132 }
00133 }
00134
00135 SUMA_RETURN(Opt);
00136 }
00137
00138 int main (int argc,char *argv[])
00139 {
00140 static char FuncName[]={"3dSurfMask"};
00141 SUMA_GENERIC_PROG_OPTIONS_STRUCT *Opt;
00142 SUMA_GENERIC_ARGV_PARSE *ps=NULL;
00143 SUMA_SurfSpecFile *Spec = NULL;
00144 int N_Spec=0;
00145 short *isin = NULL;
00146 int N_in = 0, i;
00147 SUMA_FORM_AFNI_DSET_STRUCT *OptDs = NULL;
00148 SUMA_SurfaceObject *SO = NULL;
00149 SUMA_VOLPAR *vp = NULL;
00150 THD_3dim_dataset *dset = NULL;
00151 char *vpname=NULL;
00152 SUMA_Boolean LocalHead = NOPE;
00153
00154 SUMA_mainENTRY;
00155 SUMA_STANDALONE_INIT;
00156
00157
00158 SUMAg_DOv = SUMA_Alloc_DisplayObject_Struct (SUMA_MAX_DISPLAYABLE_OBJECTS);
00159 ps = SUMA_Parse_IO_Args(argc, argv, "-i;-t;-spec;-sv;");
00160
00161 if (argc < 2) {
00162 usage_3dSurfMask(ps);
00163 exit (1);
00164 }
00165
00166 Opt = SUMA_3dSurfMask_ParseInput (argv, argc, ps);
00167
00168 if (Opt->debug > 2) LocalHead = YUP;
00169
00170
00171 if (ps->s_N_surfnames + ps->i_N_surfnames + ps->t_N_surfnames != 1) {
00172 SUMA_S_Err("Multiple surface specifications used. Only one surface allowed.");
00173 exit(1);
00174 }
00175
00176 Spec = SUMA_IO_args_2_spec(ps, &N_Spec);
00177 if (N_Spec != 1) {
00178 SUMA_S_Err("Multiple spec at input.");
00179 exit(1);
00180 }
00181
00182 SO = SUMA_Load_Spec_Surf(Spec, 0, ps->sv[0], 0);
00183 if (!SO) {
00184 fprintf (SUMA_STDERR,"Error %s:\n"
00185 "Failed to find surface\n"
00186 "in spec file. \n",
00187 FuncName );
00188 exit(1);
00189
00190 }
00191
00192 if (Opt->out_grid_prefix) {
00193 vpname = SUMA_append_string(Opt->out_grid_prefix, Opt->out_grid_view);
00194 vp = SUMA_VolPar_Attr(vpname);
00195 } else {
00196 vp = SO->VolPar;
00197 if (!vp) {
00198 fprintf (SUMA_STDERR,"Error %s:\n"
00199 "Need a grid parent.\n",
00200 FuncName );
00201 exit(1);
00202 }
00203 vpname = SUMA_copy_string(ps->sv[0]);
00204 if (!SUMA_AfniView(ps->sv[0], Opt->out_grid_view)) {
00205 fprintf (SUMA_STDERR,"Error %s:\n"
00206 "Failed to get view!!!\n",
00207 FuncName );
00208 exit(1);
00209
00210 }
00211 }
00212 if (LocalHead) {
00213 fprintf(SUMA_STDERR,"%s: Using %s for grid\n", FuncName, vpname);
00214 }
00215
00216 if (!Opt->out_vol_prefix) {
00217 Opt->out_vol_prefix = SUMA_AfniPrefix("3dSurfMask", NULL, NULL, &(Opt->out_vol_exists));
00218 sprintf(Opt->out_vol_view, Opt->out_grid_view);
00219 }
00220
00221 if (SUMA_AfniExistsView(Opt->out_vol_exists, Opt->out_vol_view)) {
00222 fprintf(SUMA_STDERR, "Error 3dSurfMask:\nOutput volume %s%s exists.\n", Opt->out_vol_prefix, Opt->out_vol_view);
00223 exit(1);
00224 }
00225
00226 if (Opt->out_grid_prefix) {
00227 if (!SUMA_AfniExistsView(Opt->out_grid_exists, Opt->out_grid_view)) {
00228 fprintf(SUMA_STDERR, "Error 3dSurfMask:\nGrid parent %s%s does not exist.\n", Opt->out_grid_prefix, Opt->out_grid_view);
00229 exit(1);
00230 }
00231 }
00232
00233
00234 isin = SUMA_FindVoxelsInSurface (SO, vp, &N_in, 0, NULL);
00235 if (!isin) {
00236 SUMA_S_Err("No voxels in surface");
00237 exit(1);
00238 }
00239 OptDs = SUMA_New_FormAfniDset_Opt();
00240 if (Opt->out_vol_prefix) {
00241 SUMA_FileName NewName = SUMA_StripPath(Opt->out_vol_prefix);
00242 OptDs->prefix = NewName.FileName; NewName.FileName = NULL;
00243 OptDs->prefix_path = NewName.Path; NewName.Path = NULL;
00244 } else {
00245 OptDs->prefix = SUMA_copy_string("3dSurfMask");
00246 OptDs->prefix_path = SUMA_copy_string("./");
00247 }
00248
00249
00250 OptDs->master = SUMA_copy_string(vpname);
00251 OptDs->datum = MRI_byte;
00252 OptDs->full_list = 1;
00253 { float * isin_float = NULL;
00254 isin_float = (float *)SUMA_malloc(sizeof(float)*vp->nx*vp->ny*vp->nz);
00255 if (!isin_float) {
00256 SUMA_SL_Crit("Failed to allocate");
00257 exit(1);
00258 }
00259
00260 if (Opt->obj_type == 2) for (i=0; i<vp->nx*vp->ny*vp->nz; ++i) { if (isin[i] > 1) isin_float[i] = 1.0; else isin_float[i] = 0.0; }
00261 else {
00262 for (i=0; i<vp->nx*vp->ny*vp->nz; ++i) isin_float[i] = (float)isin[i];
00263 }
00264 dset = SUMA_FormAfnidset (NULL, isin_float, vp->nx*vp->ny*vp->nz, OptDs);
00265 if (!dset) {
00266 SUMA_SL_Err("Failed to create output dataset!");
00267 } else {
00268 tross_Make_History( FuncName , argc,argv , dset ) ;
00269 DSET_write(dset) ;
00270 }
00271 SUMA_free(isin_float); isin_float = NULL;
00272 }
00273
00274 if (vpname) SUMA_free(vpname); vpname = NULL;
00275 if (dset) { DSET_delete(dset); dset = NULL; }
00276 if (OptDs) { OptDs->mset = NULL; OptDs = SUMA_Free_FormAfniDset_Opt(OptDs); }
00277 if (vp != SO->VolPar) SUMA_Free_VolPar(vp); vp = NULL;
00278 if (SO) SUMA_Free_Surface_Object(SO); SO = NULL;
00279 if (ps) SUMA_FreeGenericArgParse(ps); ps = NULL;
00280 if (Spec) SUMA_free(Spec); Spec = NULL;
00281 if (Opt) Opt = SUMA_Free_Generic_Prog_Options_Struct(Opt);
00282 if (!SUMA_Free_CommonFields(SUMAg_CF)) SUMA_error_message(FuncName,"SUMAg_CF Cleanup Failed!",1);
00283 exit(0);
00284
00285 }