mmc_utils.h
Go to the documentation of this file.
1 /***************************************************************************/
32 /***************************************************************************/
38 #ifndef _MMC_UTILITIES_H
39 #define _MMC_UTILITIES_H
40 
41 #include <stdio.h>
42 #include "vector_types.h"
43 #include "cjson/cJSON.h"
44 
45 #ifdef _OPENMP
46  #include <omp.h>
47 #endif
48 
49 #define MAX_FULL_PATH 2048
50 #define MAX_PATH_LENGTH 1024
51 #define MAX_SESSION_LENGTH 64
52 #define MAX_CHECKPOINT 16
53 #define DET_PHOTON_BUF 100000
54 #define SEED_FROM_FILE -999
55 #define MIN(a,b) ((a)<(b)?(a):(b))
56 #define MMC_ERROR(id,msg) mcx_error(id,msg,__FILE__,__LINE__)
57 #define MMC_INFO -99999
58 #define MAX_DEVICE 256
59 
60 #ifndef MCX_CONTAINER
61  #define S_RED "\x1b[31m"
62  #define S_GREEN "\x1b[32m"
63  #define S_YELLOW "\x1b[33m"
64  #define S_BLUE "\x1b[34m"
65  #define S_MAGENTA "\x1b[35m"
66  #define S_CYAN "\x1b[36m"
67  #define S_BOLD "\x1b[1m"
68  #define S_ITALIC "\x1b[3m"
69  #define S_RESET "\x1b[0m"
70 #else
71  #define S_RED
72  #define S_GREEN
73  #define S_YELLOW
74  #define S_BLUE
75  #define S_MAGENTA
76  #define S_CYAN
77  #define S_BOLD
78  #define S_ITALIC
79  #define S_RESET
80 #endif
81 
82 
83 typedef double OutputType;
84 
85 enum TDebugLevel {dlMove = 1, dlTracing = 2, dlBary = 4, dlWeight = 8, dlDist = 16, dlTracingEnter = 32,
86  dlTracingExit = 64, dlEdge = 128, dlAccum = 256, dlTime = 512, dlReflect = 1024,
87  dlProgress = 2048, dlExit = 4096
88  };
89 
90 enum TRTMethod {rtPlucker, rtHavel, rtBadouel, rtBLBadouel, rtBLBadouelGrid};
91 enum TMCMethod {mmMCX, mmMCML};
92 enum TComputeBackend {cbSSE, cbOpenCL, cbCUDA};
93 
94 enum TSrcType {stPencil, stIsotropic, stCone, stGaussian, stPlanar,
95  stPattern, stFourier, stArcSin, stDisk, stFourierX,
96  stFourier2D, stZGaussian, stLine, stSlit
97  };
98 enum TOutputType {otFlux, otFluence, otEnergy, otJacobian, otWL, otWP};
99 enum TOutputFormat {ofASCII, ofBin, ofNifti, ofAnalyze, ofMC2, ofTX3, ofJNifti, ofBJNifti};
100 enum TOutputDomain {odMesh, odGrid};
101 enum TDeviceVendor {dvUnknown, dvNVIDIA, dvAMD, dvIntel, dvIntelGPU};
102 enum TMCXParent {mpStandalone, mpMATLAB};
103 enum TBoundary {bcNoReflect, bcReflect, bcAbsorbExterior, bcMirror /*, bcCylic*/};
104 enum TRayHitType {htNone, htInOut, htOutIn, htNoHitIn, htNoHitOut};
105 enum TROIType {rtNone, rtEdge, rtNode, rtFace};
106 
107 enum TBJData {JDB_mixed, JDB_nulltype, JDB_noop, JDB_true, JDB_false,
108  JDB_char, JDB_string, JDB_hp, JDB_int8, JDB_uint8, JDB_int16, JDB_int32,
109  JDB_int64, JDB_single, JDB_double, JDB_array, JDB_object, JDB_numtypes,
110  JDB_uint16 = 10, JDB_uint32, JDB_uint64
111  };
112 
113 /***************************************************************************/
129 typedef struct MMC_medium {
130  float mua;
131  float mus;
132  float g;
133  float n;
134 } medium;
135 
142 typedef struct MMC_history {
143  char magic[4];
144  unsigned int version;
145  unsigned int maxmedia;
146  unsigned int detnum;
147  unsigned int colcount;
148  unsigned int totalphoton;
149  unsigned int detected;
150  unsigned int savedphoton;
151  float unitinmm;
152  unsigned int seedbyte;
153  float normalizer;
154  unsigned int srcnum;
155  int respin;
156  unsigned int savedetflag;
157  int reserved[2];
158 } history;
159 
160 
161 typedef struct MCXGPUInfo {
162  char name[MAX_SESSION_LENGTH];
163  int id;
164  int devcount;
165  int platformid;
166  int major, minor;
167  size_t globalmem, constmem, sharedmem;
168  int regcount;
169  int clock;
170  int sm, core;
171  size_t autoblock, autothread;
172  int maxgate;
174  enum TDeviceVendor vendor;
175 } GPUInfo;
176 
177 /***************************************************************************/
184 typedef struct MMC_config {
185  size_t nphoton;
187  int nthread;
188  int seed;
189  int e0;
191  float4 srcdir;
192  int srctype;
193  float4 srcparam1;
194  float4 srcparam2;
195  float* srcpattern;
196  int voidtime;
197  float4 bary0;
198  float tstart;
199  float tstep;
200  float tend;
203  uint4 crop0;
204  uint4 crop1;
205  int medianum;
206  int srcnum;
207  int detnum;
208  float detradius;
209  float sradius;
213  float4* detpos;
214  float4 detparam1;
215  float4 detparam2;
216  float* detpattern;
217  float minstep;
218  int maxgate;
219  int respin;
220  int printnum;
221  int replaydet;
223  unsigned char* vol;
224  char session[MAX_SESSION_LENGTH];
225  char meshtag[MAX_SESSION_LENGTH];
226  char isrowmajor;
227  char isreflect;
228  char isref3;
230  char issavedet;
231  char ismomentum;
232  char issaveexit;
234  char issave2pt;
235  char isgpuinfo;
236  char isspecular;
237  char issaveseed;
238  char issaveref;
239  char isatomic;
240  char method;
241  int implicit;
242  char basisorder;
243  char outputtype;
245  int mcmethod;
246  float roulettesize;
247  float minenergy;
248  float nout;
249  int isextdet;
250  FILE* flog;
251  char rootpath[MAX_PATH_LENGTH];
252  unsigned int debuglevel;
254  float unitinmm;
256  unsigned int checkpt[MAX_CHECKPOINT];
257  void* photonseed;
258  float* replayweight;
259  float* replaytime;
260  char seedfile[MAX_PATH_LENGTH];
261  char deviceid[MAX_DEVICE];
262  float workload[MAX_DEVICE];
263  char compileropt[MAX_PATH_LENGTH];
264  char kernelfile[MAX_SESSION_LENGTH];
265  char* clsource;
266  int parentid;
267  int optlevel;
268  unsigned int maxdetphoton; /*anticipated maximum detected photons*/
269  double* exportfield; /*memory buffer when returning the flux to external programs such as matlab*/
270  unsigned char* exportseed; /*memory buffer when returning the RNG seed to matlab*/
271  float* exportdetected; /*memory buffer when returning the partial length info to external programs such as matlab*/
272  double energytot, energyabs, energyesc;
273  unsigned int detectedcount;
274  unsigned int runtime;
275  char autopilot;
276  float normalizer;
277  unsigned int nbuffer;
278  unsigned int gpuid;
279  int compute;
280  char isdumpjson;
281  int zipid;
282  unsigned int savedetflag;
283  uint mediabyte;
284  char* shapedata;
285  char jsonfile[MAX_PATH_LENGTH];
286 } mcconfig;
287 
288 #ifdef __cplusplus
289 extern "C" {
290 #endif
291 void mcx_savedata(OutputType* dat, size_t len, mcconfig* cfg, int isref);
292 void mcx_savenii(OutputType* dat, size_t len, char* name, int type32bit, int outputformatid, mcconfig* cfg);
293 void mcx_error(const int id, const char* msg, const char* file, const int linenum);
294 void mcx_loadconfig(FILE* in, mcconfig* cfg);
295 void mcx_saveconfig(FILE* in, mcconfig* cfg);
296 void mcx_readconfig(char* fname, mcconfig* cfg);
297 void mcx_writeconfig(char* fname, mcconfig* cfg);
298 void mcx_initcfg(mcconfig* cfg);
299 void mcx_clearcfg(mcconfig* cfg);
300 void mcx_validatecfg(mcconfig* cfg);
301 void mcx_parsecmd(int argc, char* argv[], mcconfig* cfg);
302 void mcx_usage(char* exename, mcconfig* cfg);
303 void mcx_loadvolume(char* filename, mcconfig* cfg, int isbuf);
304 void mcx_normalize(float field[], float scale, int fieldlen);
305 int mcx_readarg(int argc, char* argv[], int id, void* output, const char* type);
306 void mcx_printlog(mcconfig* cfg, char* str);
307 int mcx_remap(char* opt);
308 int mcx_lookupindex(char* key, const char* index);
309 int mcx_keylookup(char* key, const char* table[]);
310 int mcx_parsedebugopt(char* debugopt);
311 void mcx_progressbar(float percent);
312 int mcx_loadjson(cJSON* root, mcconfig* cfg);
313 void mcx_version(mcconfig* cfg);
314 int mcx_loadfromjson(char* jbuf, mcconfig* cfg);
315 void mcx_prep(mcconfig* cfg);
316 void mcx_printheader(mcconfig* cfg);
317 void mcx_cleargpuinfo(GPUInfo** gpuinfo);
318 void mcx_convertcol2row(unsigned int** vol, uint3* dim);
319 void mcx_convertcol2row4d(unsigned int** vol, uint4* dim);
320 void mcx_savejdata(char* filename, mcconfig* cfg);
321 int mcx_jdataencode(void* vol, int ndim, uint* dims, char* type, int byte, int zipid, void* obj, int isubj, mcconfig* cfg);
322 int mcx_jdatadecode(void** vol, int* ndim, uint* dims, int maxdim, char** type, cJSON* obj, mcconfig* cfg);
323 void mcx_savejnii(OutputType* vol, int ndim, uint* dims, float* voxelsize, char* name, int isfloat, mcconfig* cfg);
324 void mcx_savebnii(OutputType* vol, int ndim, uint* dims, float* voxelsize, char* name, int isfloat, mcconfig* cfg);
325 void mcx_savejdet(float* ppath, void* seeds, uint count, int doappend, mcconfig* cfg);
326 void mcx_fflush(FILE* out);
327 
328 #ifdef MCX_CONTAINER
329 #ifdef _OPENMP
330 #define MMC_FPRINTF(fp,...) {if(omp_get_thread_num()==0) mexPrintf(__VA_ARGS__);}
331 #else
332 #define MMC_FPRINTF(fp,...) mexPrintf(__VA_ARGS__)
333 #endif
334 #else
335 #define MMC_FPRINTF(fp,...) fprintf(fp,__VA_ARGS__)
336 #endif
337 
338 #if defined(MATLAB_MEX_FILE) || defined(OCTAVE_API_VERSION_NUMBER) || defined (HAVE_OCTAVE)
339 int mexPrintf(const char* format, ... );
340 #else
341 int mexPrintf(const char* format, ... );
342 #endif
343 
344 #define MMCDEBUG(cfg,debugflag,outputstr) {\
345  if((cfg)->debuglevel & (debugflag)) {\
346  MMC_FPRINTF outputstr ;\
347  fflush((cfg)->flog);\
348  }\
349  }
350 
351 
352 #ifdef MCX_CONTAINER
353 #ifdef __cplusplus
354 extern "C"
355 #endif
356 int mmc_throw_exception(const int id, const char* msg, const char* filename, const int linenum);
357 void mcx_matlab_flush(void);
358 #endif
359 
360 
361 #ifdef __cplusplus
362 }
363 #endif
364 
365 #endif
This structure defines the problem settings (domain, filenames, session)
Definition: mmc_utils.h:184
void mcx_loadconfig(FILE *in, mcconfig *cfg)
Load user inputs from a .inp input file.
Definition: mmc_utils.c:1529
float tstart
Definition: mmc_utils.h:198
void mcx_progressbar(float percent)
Print a progress bar.
Definition: mmc_utils.c:2245
unsigned char * vol
Definition: mmc_utils.h:223
void mcx_matlab_flush()
Force matlab refresh the command window to print all buffered messages.
Definition: mmclab.cpp:1130
int mcmethod
Definition: mmc_utils.h:245
size_t nphoton
Definition: mmc_utils.h:185
void mcx_validatecfg(mcconfig *cfg)
Validate all input fields, and warn incompatible inputs.
Definition: mmc_utils.c:2472
int medianum
Definition: mmc_utils.h:205
int maxgate
Definition: mmc_utils.h:218
int mcx_jdatadecode(void **vol, int *ndim, uint *dims, int maxdim, char **type, cJSON *obj, mcconfig *cfg)
Decode an ND array from JSON/JData construct and output to a volumetric array.
Definition: mmc_utils.c:2046
int srcnum
Definition: mmc_utils.h:206
float minstep
Definition: mmc_utils.h:217
int mcx_lookupindex(char *key, const char *index)
Look up a single character in a string.
Definition: mmc_utils.c:2401
void mcx_clearcfg(mcconfig *cfg)
Clearing the simulation configuration data structure.
Definition: mmc_utils.c:350
FILE * flog
Definition: mmc_utils.h:250
void mcx_printlog(mcconfig *cfg, char *str)
Print a message to the console or a log file.
Definition: mmc_utils.c:1075
unsigned int savedetflag
Definition: mmc_utils.h:282
medium * prop
Definition: mmc_utils.h:212
uint4 crop1
Definition: mmc_utils.h:204
int detnum
Definition: mmc_utils.h:207
unsigned int nbuffer
Definition: mmc_utils.h:277
int e0
Definition: mmc_utils.h:189
float sradius
Definition: mmc_utils.h:209
char method
Definition: mmc_utils.h:240
void mcx_initcfg(mcconfig *cfg)
Initializing the simulation configuration with default values.
Definition: mmc_utils.c:207
void mcx_printheader(mcconfig *cfg)
Print MCX output header.
Definition: mmc_utils.c:3005
void mcx_savejnii(OutputType *vol, int ndim, uint *dims, float *voxelsize, char *name, int isfloat, mcconfig *cfg)
Save volumetric output (fluence etc) to a JNIfTI/JSON/JData format file.
Definition: mmc_utils.c:707
float * srcpattern
Definition: mmc_utils.h:195
int respin
Definition: mmc_utils.h:155
unsigned int srcnum
Definition: mmc_utils.h:154
float unitinmm
Definition: mmc_utils.h:254
float3 steps
Definition: mmc_utils.h:201
float tstep
Definition: mmc_utils.h:199
unsigned int detectedcount
Definition: mmc_utils.h:273
float minenergy
Definition: mmc_utils.h:247
int isextdet
Definition: mmc_utils.h:249
char issave2pt
Definition: mmc_utils.h:234
float normalizer
Definition: mmc_utils.h:153
void mcx_cleargpuinfo(GPUInfo **gpuinfo)
Reset and clear the GPU information data structure.
Definition: mmc_utils.c:415
unsigned int version
Definition: mmc_utils.h:144
float4 detparam1
Definition: mmc_utils.h:214
#define MAX_SESSION_LENGTH
Definition: mmc_utils.h:51
int srctype
Definition: mmc_utils.h:192
float normalizer
Definition: mmc_utils.h:276
void mcx_error(const int id, const char *msg, const char *file, const int linenum)
Error reporting function.
Definition: mmc_utils.c:1106
unsigned int detected
Definition: mmc_utils.h:149
float4 srcparam1
Definition: mmc_utils.h:193
float roulettesize
Definition: mmc_utils.h:246
uint4 crop0
Definition: mmc_utils.h:203
int nthread
Definition: mmc_utils.h:187
char isgpuinfo
Definition: mmc_utils.h:235
uint3 dim
Definition: mmc_utils.h:202
This structure defines the optical properties for each medium.
Definition: mmc_utils.h:129
float mus
Definition: mmc_utils.h:131
char isreflect
Definition: mmc_utils.h:227
void mcx_convertcol2row(unsigned int **vol, uint3 *dim)
Convert a column-major (MATLAB/FORTRAN) array to a row-major (C/C++) array.
Definition: mmc_utils.c:1970
void mcx_savebnii(OutputType *vol, int ndim, uint *dims, float *voxelsize, char *name, int isfloat, mcconfig *cfg)
Save volumetric output (fluence etc) to a binary JNIfTI/JSON/JData format file.
Definition: mmc_utils.c:543
float n
Definition: mmc_utils.h:133
char ismomentum
Definition: mmc_utils.h:231
void mcx_savejdata(char *filename, mcconfig *cfg)
Save simulation settings to an inp file.
Definition: mmc_utils.c:1814
float4 srcparam2
Definition: mmc_utils.h:194
char isref3
Definition: mmc_utils.h:228
float4 detparam2
Definition: mmc_utils.h:215
int debugphoton
Definition: mmc_utils.h:253
const int out[4][3]
Tetrahedron faces, in counter-clock-wise orders, represented using local node indices.
Definition: mmc_mesh.c:58
char * shapedata
Definition: mmc_utils.h:284
unsigned int detnum
Definition: mmc_utils.h:146
int mcx_loadfromjson(char *jbuf, mcconfig *cfg)
Load a .json input file into memory.
Definition: mmc_utils.c:1206
int mmc_throw_exception(const int id, const char *msg, const char *filename, const int linenum)
Error reporting function in the mex function, equivallent to mcx_error in binary mode.
Definition: mmclab.cpp:1112
char isspecular
Definition: mmc_utils.h:236
Filer header data structure to .mch files to store detected photon data This header has a total of 25...
Definition: mmc_utils.h:142
Definition: mmc_utils.h:161
void mcx_savejdet(float *ppath, void *seeds, uint count, int doappend, mcconfig *cfg)
Save detected photon data to mch format binary file.
Definition: mmc_utils.c:915
void mcx_readconfig(char *fname, mcconfig *cfg)
Read simulation settings from a configuration file (.inp or .json)
Definition: mmc_utils.c:1147
unsigned int savedphoton
Definition: mmc_utils.h:150
void mcx_usage(char *exename, mcconfig *cfg)
Print MCX help information.
Definition: mmc_utils.c:3031
int maxmpthread
Definition: mmc_utils.h:173
void mcx_saveconfig(FILE *in, mcconfig *cfg)
Save simulation settings to an inp file.
Definition: mmc_utils.c:1782
char issaveseed
Definition: mmc_utils.h:237
int respin
Definition: mmc_utils.h:219
int zipid
Definition: mmc_utils.h:281
void mcx_prep(mcconfig *cfg)
Preprocess configuration and set option dependency.
Definition: mmc_utils.c:2536
float3 srcpos
Definition: mmc_utils.h:190
float * replaytime
Definition: mmc_utils.h:259
char isatomic
Definition: mmc_utils.h:239
float tend
Definition: mmc_utils.h:200
float * replayweight
Definition: mmc_utils.h:258
float mua
Definition: mmc_utils.h:130
#define MAX_PATH_LENGTH
Definition: mmc_utils.h:50
void mcx_writeconfig(char *fname, mcconfig *cfg)
Write simulation settings to an inp file.
Definition: mmc_utils.c:1505
unsigned integer triplet {ix,iy,iz}
Definition: vector_types.h:108
history his
Definition: mmc_utils.h:255
char autopilot
Definition: mmc_utils.h:275
unsigned int seedbyte
Definition: mmc_utils.h:152
char isrowmajor
Definition: mmc_utils.h:226
int seed
Definition: mmc_utils.h:188
char issavedet
Definition: mmc_utils.h:230
float4 * detpos
Definition: mmc_utils.h:213
int implicit
Definition: mmc_utils.h:241
char basisorder
Definition: mmc_utils.h:242
unsigned int debuglevel
Definition: mmc_utils.h:252
float unitinmm
Definition: mmc_utils.h:151
int mcx_parsedebugopt(char *debugopt)
Parse the debug flag in the letter format.
Definition: mmc_utils.c:2204
float nout
Definition: mmc_utils.h:248
void mcx_convertcol2row4d(unsigned int **vol, uint4 *dim)
Convert a column-major (MATLAB/FORTRAN) array to a row-major (C/C++) array.
Definition: mmc_utils.c:2000
void mcx_savenii(OutputType *dat, size_t len, char *name, int type32bit, int outputformatid, mcconfig *cfg)
Save volumetric output (fluence etc) to an Nifty format binary file.
Definition: mmc_utils.c:436
float g
Definition: mmc_utils.h:132
unsigned int maxmedia
Definition: mmc_utils.h:145
char outputformat
Definition: mmc_utils.h:244
unsigned int totalphoton
Definition: mmc_utils.h:148
int mcx_readarg(int argc, char *argv[], int id, void *output, const char *type)
Function to read a single parameter value followed by a command line option.
Definition: mmc_utils.c:2307
int mcx_loadjson(cJSON *root, mcconfig *cfg)
Load user inputs from a .json input file.
Definition: mmc_utils.c:1246
float detradius
Definition: mmc_utils.h:208
float4 bary0
Definition: mmc_utils.h:197
int nblocksize
Definition: mmc_utils.h:186
float4 srcdir
Definition: mmc_utils.h:191
int mcx_remap(char *opt)
Test if a long command line option is supported.
Definition: mmc_utils.c:2373
void mcx_parsecmd(int argc, char *argv[], mcconfig *cfg)
Main function to read user command line options.
Definition: mmc_utils.c:2570
Definitions of the basic short vector data structures.
floating-point triplet {x,y,z}
Definition: vector_types.h:73
char issaveref
Definition: mmc_utils.h:238
int printnum
Definition: mmc_utils.h:220
unsigned int colcount
Definition: mmc_utils.h:147
#define MAX_CHECKPOINT
Definition: mmc_utils.h:52
void mcx_version(mcconfig *cfg)
Print MCX software version.
Definition: mmc_utils.c:2995
char isnormalized
Definition: mmc_utils.h:229
int mcx_keylookup(char *key, const char *table[])
Look up a string in a string list and return the index.
Definition: mmc_utils.c:2424
void mcx_savedata(OutputType *dat, size_t len, mcconfig *cfg, int isref)
Save volumetric output (fluence etc) to mc2 format binary file.
Definition: mmc_utils.c:831
char isdumpjson
Definition: mmc_utils.h:280
void * photonseed
Definition: mmc_utils.h:257
void mcx_normalize(float field[], float scale, int fieldlen)
Normalize the solution by multiplying a scaling factor.
Definition: mmc_utils.c:1089
void mcx_fflush(FILE *out)
Flush command line output.
Definition: mmc_utils.c:2228
float * detpattern
Definition: mmc_utils.h:216
char outputtype
Definition: mmc_utils.h:243
int mcx_jdataencode(void *vol, int ndim, uint *dims, char *type, int byte, int zipid, void *obj, int isubj, mcconfig *cfg)
Export an ND volumetric image to JSON/JData encoded construct.
Definition: mmc_utils.c:2129
int replaydet
Definition: mmc_utils.h:221
char issaveexit
Definition: mmc_utils.h:232