MC simulation settings and command line option processing unit. More...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <time.h>
#include "mmc_utils.h"
#include "mmc_const.h"
#include "mmc_bench.h"
#include "zmat/zmatlib.h"
#include "ubj/ubj.h"
#include "nifti1.h"
Macros | |
#define | FIND_JSON_KEY(id, idfull, parent, fallback, val) |
#define | FIND_JSON_OBJ(id, idfull, parent) |
#define | UBJ_WRITE_KEY(ctx, key, type, val) {ubjw_write_key( (ctx), (key)); ubjw_write_##type((ctx), (val));} |
#define | UBJ_WRITE_ARRAY(ctx, type, nlen, val) {ubjw_write_buffer( (ctx), (uint8_t*)(val), JDB_##type, (nlen));} |
#define | ubjw_write_single ubjw_write_float32 |
#define | ubjw_write_double ubjw_write_float64 |
#define | ubjw_write_uint16 ubjw_write_int16 |
#define | ubjw_write_uint32 ubjw_write_int32 |
#define | ubjw_write_uint64 ubjw_write_int64 |
#define | MMC_ASSERT(id) mcx_assert(id,__FILE__,__LINE__) |
#define | MIN_HEADER_SIZE 348 |
#define | NII_HEADER_SIZE 352 |
#define | GL_RGBA32F 0x8814 |
Functions | |
void | mcx_initcfg (mcconfig *cfg) |
Initializing the simulation configuration with default values. More... | |
void | mcx_clearcfg (mcconfig *cfg) |
Clearing the simulation configuration data structure. More... | |
void | mcx_cleargpuinfo (GPUInfo **gpuinfo) |
Reset and clear the GPU information data structure. More... | |
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. More... | |
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. More... | |
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. More... | |
void | mcx_savedata (OutputType *dat, size_t len, mcconfig *cfg, int isref) |
Save volumetric output (fluence etc) to mc2 format binary file. More... | |
void | mcx_savejdet (float *ppath, void *seeds, uint count, int doappend, mcconfig *cfg) |
Save detected photon data to mch format binary file. More... | |
void | mcx_printlog (mcconfig *cfg, char *str) |
Print a message to the console or a log file. More... | |
void | mcx_normalize (float field[], float scale, int fieldlen) |
Normalize the solution by multiplying a scaling factor. More... | |
void | mcx_error (const int id, const char *msg, const char *file, const int linenum) |
Error reporting function. More... | |
void | mcx_assert (const int ret, const char *file, const int linenum) |
Function to test return value and raise an error. More... | |
void | mcx_readconfig (char *fname, mcconfig *cfg) |
Read simulation settings from a configuration file (.inp or .json) More... | |
int | mcx_loadfromjson (char *jbuf, mcconfig *cfg) |
Load a .json input file into memory. More... | |
int | mcx_loadjson (cJSON *root, mcconfig *cfg) |
Load user inputs from a .json input file. More... | |
void | mcx_writeconfig (char *fname, mcconfig *cfg) |
Write simulation settings to an inp file. More... | |
void | mcx_loadconfig (FILE *in, mcconfig *cfg) |
Load user inputs from a .inp input file. More... | |
void | mcx_saveconfig (FILE *out, mcconfig *cfg) |
Save simulation settings to an inp file. More... | |
void | mcx_savejdata (char *filename, mcconfig *cfg) |
Save simulation settings to an inp file. More... | |
void | mcx_convertcol2row (unsigned int **vol, uint3 *dim) |
Convert a column-major (MATLAB/FORTRAN) array to a row-major (C/C++) array. More... | |
void | mcx_convertcol2row4d (unsigned int **vol, uint4 *dim) |
Convert a column-major (MATLAB/FORTRAN) array to a row-major (C/C++) array. More... | |
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. More... | |
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. More... | |
int | mcx_parsedebugopt (char *debugopt) |
Parse the debug flag in the letter format. More... | |
void | mcx_fflush (FILE *out) |
Flush command line output. More... | |
void | mcx_progressbar (float percent) |
Print a progress bar. More... | |
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. More... | |
int | mcx_remap (char *opt) |
Test if a long command line option is supported. More... | |
int | mcx_lookupindex (char *key, const char *index) |
Look up a single character in a string. More... | |
int | mcx_keylookup (char *key, const char *table[]) |
Look up a string in a string list and return the index. More... | |
int | mcx_isbinstr (const char *str) |
void | mcx_validatecfg (mcconfig *cfg) |
Validate all input fields, and warn incompatible inputs. More... | |
void | mcx_prep (mcconfig *cfg) |
Preprocess configuration and set option dependency. More... | |
void | mcx_parsecmd (int argc, char *argv[], mcconfig *cfg) |
Main function to read user command line options. More... | |
void | mcx_savedetphoton (float *ppath, void *seeds, int count, int doappend, mcconfig *cfg) |
void | mcx_version (mcconfig *cfg) |
Print MCX software version. More... | |
void | mcx_printheader (mcconfig *cfg) |
Print MCX output header. More... | |
void | mcx_usage (char *exename, mcconfig *cfg) |
Print MCX help information. More... | |
Variables | |
const char | shortopt [] |
const char * | fullopt [] |
char | pathsep |
const char | debugflag [] = {'M', 'C', 'B', 'W', 'D', 'I', 'O', 'X', 'A', 'T', 'R', 'P', 'E', '\0'} |
const char | raytracing [] = {'p', 'h', 'b', 's', 'g', '\0'} |
const char | outputtype [] = {'x', 'f', 'e', 'j', 'l', 'p', '\0'} |
const char * | outputformat [] = {"ascii", "bin", "nii", "hdr", "mc2", "tx3", "jnii", "bnii", ""} |
const char * | srctypeid [] |
char | flagset [256] = {'\0'} |
const char * | zipformat [] = {"zlib", "gzip", "base64", "lzip", "lzma", "lz4", "lz4hc", ""} |
const char * | computebackend [] = {"sse", "opencl", "cuda", ""} |
MC simulation settings and command line option processing unit.
#define FIND_JSON_KEY | ( | id, | |
idfull, | |||
parent, | |||
fallback, | |||
val | |||
) |
Macro to load JSON keys
#define FIND_JSON_OBJ | ( | id, | |
idfull, | |||
parent | |||
) |
Macro to load JSON object
#define MIN_HEADER_SIZE 348 |
Analyze header size
#define MMC_ASSERT | ( | id | ) | mcx_assert(id,__FILE__,__LINE__) |
Macro to include unit name and line number in the error message
#define NII_HEADER_SIZE 352 |
NIFTI header size
void mcx_assert | ( | const int | ret, |
const char * | file, | ||
const int | linenum | ||
) |
Function to test return value and raise an error.
[in] | ret | function return value, non-zero means an error |
[in] | file | the unit file name where this error is raised |
[in] | linenum | the line number in the file where this error is raised |
void mcx_clearcfg | ( | mcconfig * | cfg | ) |
Clearing the simulation configuration data structure.
Destructor of the simulation configuration, delete all dynamically allocated members
void mcx_cleargpuinfo | ( | GPUInfo ** | gpuinfo | ) |
Reset and clear the GPU information data structure.
Clearing the GPU information data structure
void mcx_convertcol2row | ( | unsigned int ** | vol, |
uint3 * | dim | ||
) |
Convert a column-major (MATLAB/FORTRAN) array to a row-major (C/C++) array.
[in,out] | vol | a 3D array (wrapped in 1D) to be converted |
[in] | dim | the dimensions of the 3D array |
void mcx_convertcol2row4d | ( | unsigned int ** | vol, |
uint4 * | dim | ||
) |
Convert a column-major (MATLAB/FORTRAN) array to a row-major (C/C++) array.
[in,out] | vol | a 3D array (wrapped in 1D) to be converted |
[in] | dim | the dimensions of the 3D array |
void mcx_error | ( | const int | id, |
const char * | msg, | ||
const char * | file, | ||
const int | linenum | ||
) |
Error reporting function.
[in] | id | a single integer for the types of the error |
[in] | msg | the error message string |
[in] | file | the unit file name where this error is raised |
[in] | linenum | the line number in the file where this error is raised |
void mcx_fflush | ( | FILE * | out | ) |
Flush command line output.
[in] | out | the stream to be flushed |
void mcx_initcfg | ( | mcconfig * | cfg | ) |
Initializing the simulation configuration with default values.
Constructor of the simulation configuration, initializing all field to default values
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.
The JData specification defines a portable way to encode and share volumetric ND arrays and other complex data structures, such as trees, graphs and tables. This function is capable of importing any ND numerical arrays in the JData construct in to a generic array, permitting data decompression and base64 decoding.
[in] | vol | a pointer that points to the ND array buffer |
[in] | ndim | the number of dimensions |
[in] | dims | an integer pointer that points to the dimensional vector |
[in] | type | a string of JData data types, such as "uint8" "float32", "int32" etc |
[in] | byte | number of byte per voxel |
[in] | zipid | zip method: 0:zlib,1:gzip,2:base64,3:lzma,4:lzip,5:lz4,6:lz4hc |
[in] | obj | a pre-created cJSON object to store the output JData fields |
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.
The JData specification defines a portable way to encode and share volumetric ND arrays and other complex data structures, such as trees, graphs and tables. This function is capable of exporting any ND numerical arrays into a JData construct, permitting data compression and base64 encoding.
[in] | vol | a pointer that points to the ND array buffer |
[in] | ndim | the number of dimensions |
[in] | dims | an integer pointer that points to the dimensional vector |
[in] | type | a string of JData data types, such as "uint8" "float32", "int32" etc |
[in] | byte | number of byte per voxel |
[in] | zipid | zip method: 0:zlib,1:gzip,2:base64,3:lzma,4:lzip,5:lz4,6:lz4hc |
[in] | obj | a pre-created cJSON object to store the output JData fields |
int mcx_keylookup | ( | char * | key, |
const char * | table[] | ||
) |
Look up a string in a string list and return the index.
[in] | key | string to be looked up |
[out] | table | the dictionary where the string is searched |
void mcx_loadconfig | ( | FILE * | in, |
mcconfig * | cfg | ||
) |
Load user inputs from a .inp input file.
This function loads user input from a simple text input format in a .inp extension
[in] | in | file handle to the .inp file |
[in] | cfg | simulation configuration |
int mcx_loadfromjson | ( | char * | jbuf, |
mcconfig * | cfg | ||
) |
Load a .json input file into memory.
This function loads a JSON file using cJSON
[out] | jbuf | json data structure pointer |
[in] | cfg | simulation configuration |
int mcx_loadjson | ( | cJSON * | root, |
mcconfig * | cfg | ||
) |
Load user inputs from a .json input file.
This function loads user input from a JSON format in a .json extension
[out] | root | json data structure pointer |
[in] | cfg | simulation configuration |
int mcx_lookupindex | ( | char * | key, |
const char * | index | ||
) |
Look up a single character in a string.
[in] | key | character to be looked up |
[out] | index | the dictionary string where the char is searched |
void mcx_normalize | ( | float | field[], |
float | scale, | ||
int | fieldlen | ||
) |
Normalize the solution by multiplying a scaling factor.
[in,out] | field | volumetric data before normalization |
[in] | scale | the scaling factor (or normalization factor) to be applied |
[in] | fieldlen | the length (floating point) of elements in the volume |
void mcx_parsecmd | ( | int | argc, |
char * | argv[], | ||
mcconfig * | cfg | ||
) |
Main function to read user command line options.
This function process user command line inputs and parse all short and long options.
[in] | argc | the number of total command line parameters |
[in] | argv | the pointer to all command line options |
[in] | cfg | simulation configuration |
int mcx_parsedebugopt | ( | char * | debugopt | ) |
Parse the debug flag in the letter format.
The debug flag following the -D can be either a string format, or numerical format. This function converts the string debug flags into number format
[in] | debugopt | string following the -D parameter |
void mcx_prep | ( | mcconfig * | cfg | ) |
Preprocess configuration and set option dependency.
This function preprocess the user input and set dependent flags
[in,out] | cfg | simulation configuration |
void mcx_printheader | ( | mcconfig * | cfg | ) |
Print MCX output header.
[in] | cfg | simulation configuration |
void mcx_printlog | ( | mcconfig * | cfg, |
char * | str | ||
) |
Print a message to the console or a log file.
[in] | cfg | simulation configuration |
[in] | str | a string to be printed |
void mcx_progressbar | ( | float | percent | ) |
Print a progress bar.
When -D P is specified, this function prints and update a progress bar.
[in] | n | the number of completed photons |
[in] | cfg | simulation configuration |
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.
This function reads different types of parameter values following a command line option.
[in] | argc | the number of total command line parameters |
[in] | argv | the pointer to all command line options |
[in] | id | which parameter to be parsed |
[out] | output | the pointer to which the parsed value to be written |
[in] | type | the type of data support char, int, float, string, bytenumlist, floatlist |
void mcx_readconfig | ( | char * | fname, |
mcconfig * | cfg | ||
) |
Read simulation settings from a configuration file (.inp or .json)
[in] | fname | the name of the input file (.inp or .json) |
[in] | cfg | simulation configuration |
int mcx_remap | ( | char * | opt | ) |
Test if a long command line option is supported.
This function returns 1 if a long option is found, and 0 otherwise
[in] | opt | the long command line option string |
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.
[in] | dat | volumetric data to be saved |
[in] | len | total byte length of the data to be saved |
[in] | name | output file name (will append '.nii') |
[in] | type32bit | type of the data, only support 32bit per record |
[in] | outputformatid | decide if save as nii or analyze format |
[in] | cfg | simulation configuration |
void mcx_saveconfig | ( | FILE * | out, |
mcconfig * | cfg | ||
) |
Save simulation settings to an inp file.
[in] | out | handle to the output file |
[in] | cfg | simulation configuration |
void mcx_savedata | ( | OutputType * | dat, |
size_t | len, | ||
mcconfig * | cfg, | ||
int | isref | ||
) |
Save volumetric output (fluence etc) to mc2 format binary file.
[in] | dat | volumetric data to be saved |
[in] | len | total byte length of the data to be saved |
[in] | cfg | simulation configuration |
void mcx_savejdata | ( | char * | filename, |
mcconfig * | cfg | ||
) |
Save simulation settings to an inp file.
[in] | out | handle to the output file |
[in] | cfg | simulation configuration |
void mcx_savejdet | ( | float * | ppath, |
void * | seeds, | ||
uint | count, | ||
int | doappend, | ||
mcconfig * | cfg | ||
) |
Save detected photon data to mch format binary file.
[in] | ppath | buffer pointing to the detected photon data (partial path etc) |
[in] | seeds | buffer pointing to the detected photon seed data |
[in] | count | number of detected photons |
[in] | doappend | flag if the new data is appended or write from the begining |
[in] | cfg | simulation configuration |
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.
[in] | dat | volumetric data to be saved |
[in] | len | total byte length of the data to be saved |
[in] | name | output file name (will append '.nii') |
[in] | type32bit | type of the data, only support 32bit per record |
[in] | outputformatid | decide if save as nii or analyze format |
[in] | cfg | simulation configuration |
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.
[in] | dat | volumetric data to be saved |
[in] | len | total byte length of the data to be saved |
[in] | name | output file name (will append '.nii') |
[in] | type32bit | type of the data, only support 32bit per record |
[in] | outputformatid | decide if save as nii or analyze format |
[in] | cfg | simulation configuration |
void mcx_usage | ( | char * | exename, |
mcconfig * | cfg | ||
) |
Print MCX help information.
[in] | exename | path and name of the mcx executable |
void mcx_validatecfg | ( | mcconfig * | cfg | ) |
Validate all input fields, and warn incompatible inputs.
Perform self-checking and raise exceptions or warnings when input error is detected
[in,out] | cfg | the simulation configuration structure |
void mcx_version | ( | mcconfig * | cfg | ) |
Print MCX software version.
[in] | cfg | simulation configuration |
void mcx_writeconfig | ( | char * | fname, |
mcconfig * | cfg | ||
) |
Write simulation settings to an inp file.
[in] | fname | the name of the output file |
[in] | cfg | simulation configuration |
const char* computebackend[] = {"sse", "opencl", "cuda", ""} |
Flag to decide which platform to run mmc
const char debugflag[] = {'M', 'C', 'B', 'W', 'D', 'I', 'O', 'X', 'A', 'T', 'R', 'P', 'E', '\0'} |
Debug flags R: debug random number generator M: record photon movement and trajectory P: show progress bar
char flagset[256] = {'\0'} |
Flag to decide if parameter has been initialized over command line
const char* fullopt[] |
Long command line options The length of this array must match the length of shortopt[], terminates with ""
const char* outputformat[] = {"ascii", "bin", "nii", "hdr", "mc2", "tx3", "jnii", "bnii", ""} |
Output file format mc2: binary mc2 format to store fluence volume data nii: output fluence in nii format hdr: output volume in Analyze hdr/img format ubj: output volume in unversal binary json format (not implemented)
const char outputtype[] = {'x', 'f', 'e', 'j', 'l', 'p', '\0'} |
Output data types x: fluence rate f: fluence e: energy deposition j: jacobian for mua p: scattering counts for computing Jacobians for mus
char pathsep |
path separator on Linux/Unix/OSX
const char raytracing[] = {'p', 'h', 'b', 's', 'g', '\0'} |
Selecting mesh-based ray-tracing algorithm: p: Plucker-based ray-tracer, see Fang2010 h: Havel-based SSE4 ray-tracer, see Fang2012 b: Badouel ray-tracing algorithm, see Fang2011 s: branch-less Badouel SSE4 ray-tracer, see Fang2011 g: grid-output using dual-mesh MMC
const char shortopt[] |
Short command line options If a short command line option is '-' that means it only has long/verbose option. Array terminates with '\0'.
const char* srctypeid[] |
Source type specifier User can specify the source type using a string
const char* zipformat[] = {"zlib", "gzip", "base64", "lzip", "lzma", "lz4", "lz4hc", ""} |
Flag for JData compression methods