File indexing completed on 2026-04-09 07:49:11
0001 #pragma once
0002 #include <cstdio>
0003 #include <cassert>
0004 #include <cstring>
0005
0006 enum {
0007 UNKNOWN,
0008 RNG_SEQUENCE,
0009 RNG_SEQUENCE_WITH_SKIPAHEAD,
0010 BOUNDARY_LOOKUP_ALL,
0011 BOUNDARY_LOOKUP_WATER,
0012 BOUNDARY_LOOKUP_LS,
0013 WAVELENGTH_SCINTILLATION,
0014 WAVELENGTH_CERENKOV,
0015 SCINT_GENERATE,
0016 CERENKOV_GENERATE,
0017 CERENKOV_GENERATE_ENPROP_FLOAT,
0018 CERENKOV_GENERATE_ENPROP_DOUBLE,
0019 CERENKOV_GENERATE_EXPT,
0020 GENERATE_PHOTON_G,
0021 BOUNDARY_LOOKUP_LINE_LS_L,
0022 PROP_LOOKUP_Y,
0023 FILL_STATE_0,
0024 FILL_STATE_1,
0025 RAYLEIGH_SCATTER_ALIGN,
0026 PROPAGATE_TO_BOUNDARY,
0027 PROPAGATE_AT_BOUNDARY,
0028
0029 HEMISPHERE_S_POLARIZED,
0030 HEMISPHERE_P_POLARIZED,
0031 HEMISPHERE_X_POLARIZED,
0032
0033 PROPAGATE_AT_BOUNDARY_NORMAL_INCIDENCE,
0034
0035 PROPAGATE_AT_BOUNDARY_S_POLARIZED,
0036 PROPAGATE_AT_BOUNDARY_P_POLARIZED,
0037 PROPAGATE_AT_BOUNDARY_X_POLARIZED,
0038
0039 PROPAGATE_AT_MULTIFILM_S_POLARIZED,
0040 PROPAGATE_AT_MULTIFILM_P_POLARIZED,
0041 PROPAGATE_AT_MULTIFILM_X_POLARIZED,
0042
0043
0044 QGEN_RANDOM_DIRECTION_MARSAGLIA,
0045 QGEN_LAMBERTIAN_DIRECTION,
0046 QGEN_SMEAR_NORMAL_SIGMA_ALPHA,
0047 QGEN_SMEAR_NORMAL_POLISH,
0048
0049 REFLECT_DIFFUSE,
0050 REFLECT_SPECULAR,
0051 PROPAGATE_AT_SURFACE,
0052
0053 FAKE_PROPAGATE,
0054 GENTORCH,
0055 MULTIFILM_LOOKUP,
0056 RANDGAUSSQ_SHOOT
0057
0058 };
0059
0060 struct QSimLaunch
0061 {
0062 static unsigned Type(const char* name) ;
0063 static bool IsMutate(unsigned type) ;
0064 static bool IsSurface(unsigned type) ;
0065 static unsigned MutateSource(unsigned type);
0066 static const char* Name(unsigned type );
0067
0068 static constexpr const char* RNG_SEQUENCE_ = "rng_sequence" ;
0069 static constexpr const char* RNG_SEQUENCE_WITH_SKIPAHEAD_ = "rng_sequence_with_skipahead" ;
0070 static constexpr const char* BOUNDARY_LOOKUP_ALL_ = "boundary_lookup_all" ;
0071 static constexpr const char* BOUNDARY_LOOKUP_WATER_ = "boundary_lookup_water" ;
0072 static constexpr const char* BOUNDARY_LOOKUP_LS_ = "boundary_lookup_ls" ;
0073
0074 static constexpr const char* WAVELENGTH_SCINTILLATION_ = "wavelength_scintillation" ;
0075 static constexpr const char* WAVELENGTH_CERENKOV_ = "wavelength_cerenkov" ;
0076
0077 static constexpr const char* CERENKOV_GENERATE_ = "cerenkov_generate" ;
0078 static constexpr const char* CERENKOV_GENERATE_ENPROP_FLOAT_ = "cerenkov_generate_enprop_float" ;
0079 static constexpr const char* CERENKOV_GENERATE_ENPROP_DOUBLE_ = "cerenkov_generate_enprop_double" ;
0080 static constexpr const char* CERENKOV_GENERATE_EXPT_ = "cerenkov_generate_expt" ;
0081
0082 static constexpr const char* SCINT_GENERATE_ = "scint_generate" ;
0083
0084
0085 static constexpr const char* FILL_STATE_0_ = "fill_state_0" ;
0086 static constexpr const char* FILL_STATE_1_ = "fill_state_1" ;
0087 static constexpr const char* RAYLEIGH_SCATTER_ALIGN_ = "rayleigh_scatter_align" ;
0088 static constexpr const char* PROPAGATE_TO_BOUNDARY_ = "propagate_to_boundary" ;
0089 static constexpr const char* PROPAGATE_AT_BOUNDARY_ = "propagate_at_boundary" ;
0090
0091 static constexpr const char* HEMISPHERE_S_POLARIZED_ = "hemisphere_s_polarized" ;
0092 static constexpr const char* HEMISPHERE_P_POLARIZED_ = "hemisphere_p_polarized" ;
0093 static constexpr const char* HEMISPHERE_X_POLARIZED_ = "hemisphere_x_polarized" ;
0094
0095 static constexpr const char* PROPAGATE_AT_BOUNDARY_NORMAL_INCIDENCE_ = "propagate_at_boundary_normal_incidence" ;
0096
0097 static constexpr const char* PROPAGATE_AT_BOUNDARY_S_POLARIZED_ = "propagate_at_boundary_s_polarized" ;
0098 static constexpr const char* PROPAGATE_AT_BOUNDARY_P_POLARIZED_ = "propagate_at_boundary_p_polarized" ;
0099 static constexpr const char* PROPAGATE_AT_BOUNDARY_X_POLARIZED_ = "propagate_at_boundary_x_polarized" ;
0100
0101 static constexpr const char* PROPAGATE_AT_MULTIFILM_S_POLARIZED_ = "propagate_at_multifilm_s_polarized";
0102 static constexpr const char* PROPAGATE_AT_MULTIFILM_P_POLARIZED_ = "propagate_at_multifilm_p_polarized";
0103 static constexpr const char* PROPAGATE_AT_MULTIFILM_X_POLARIZED_ = "propagate_at_multifilm_x_polarized";
0104
0105
0106 static constexpr const char* QGEN_RANDOM_DIRECTION_MARSAGLIA_ = "random_direction_marsaglia" ;
0107 static constexpr const char* QGEN_LAMBERTIAN_DIRECTION_ = "lambertian_direction" ;
0108 static constexpr const char* QGEN_SMEAR_NORMAL_SIGMA_ALPHA_ = "smear_normal_sigma_alpha" ;
0109 static constexpr const char* QGEN_SMEAR_NORMAL_POLISH_ = "smear_normal_polish" ;
0110
0111
0112 static constexpr const char* REFLECT_DIFFUSE_ = "reflect_diffuse" ;
0113 static constexpr const char* REFLECT_SPECULAR_ = "reflect_specular" ;
0114 static constexpr const char* PROPAGATE_AT_SURFACE_ = "propagate_at_surface" ;
0115 static constexpr const char* FAKE_PROPAGATE_ = "fake_propagate" ;
0116 static constexpr const char* GENTORCH_ = "gentorch" ;
0117 static constexpr const char* MULTIFILM_LOOKUP_ = "multifilm_lookup";
0118 static constexpr const char* RANDGAUSSQ_SHOOT_ = "randgaussq_shoot" ;
0119
0120 };
0121
0122
0123 inline unsigned QSimLaunch::Type( const char* name )
0124 {
0125 unsigned test = UNKNOWN ;
0126
0127 if(strcmp(name,CERENKOV_GENERATE_) == 0 ) test = CERENKOV_GENERATE ;
0128 if(strcmp(name,CERENKOV_GENERATE_ENPROP_FLOAT_) == 0 ) test = CERENKOV_GENERATE_ENPROP_FLOAT ;
0129 if(strcmp(name,CERENKOV_GENERATE_ENPROP_DOUBLE_) == 0 ) test = CERENKOV_GENERATE_ENPROP_DOUBLE ;
0130 if(strcmp(name,CERENKOV_GENERATE_EXPT_) == 0 ) test = CERENKOV_GENERATE_EXPT ;
0131
0132 if(strcmp(name,SCINT_GENERATE_) == 0 ) test = SCINT_GENERATE ;
0133
0134 if(strcmp(name,WAVELENGTH_SCINTILLATION_) == 0 ) test = WAVELENGTH_SCINTILLATION ;
0135 if(strcmp(name,WAVELENGTH_CERENKOV_) == 0 ) test = WAVELENGTH_CERENKOV ;
0136
0137
0138 if(strcmp(name,"G") == 0 ) test = GENERATE_PHOTON_G ;
0139 if(strcmp(name,"L") == 0 ) test = BOUNDARY_LOOKUP_LINE_LS_L ;
0140 if(strcmp(name,"Y") == 0 ) test = PROP_LOOKUP_Y ;
0141
0142 if(strcmp(name,RNG_SEQUENCE_) == 0 ) test = RNG_SEQUENCE ;
0143 if(strcmp(name,RNG_SEQUENCE_WITH_SKIPAHEAD_) == 0 ) test = RNG_SEQUENCE_WITH_SKIPAHEAD ;
0144 if(strcmp(name,BOUNDARY_LOOKUP_ALL_) == 0 ) test = BOUNDARY_LOOKUP_ALL ;
0145 if(strcmp(name,BOUNDARY_LOOKUP_WATER_) == 0 ) test = BOUNDARY_LOOKUP_WATER ;
0146 if(strcmp(name,BOUNDARY_LOOKUP_LS_) == 0 ) test = BOUNDARY_LOOKUP_LS ;
0147
0148
0149 if(strcmp(name,FILL_STATE_0_) == 0) test = FILL_STATE_0 ;
0150 if(strcmp(name,FILL_STATE_1_) == 0) test = FILL_STATE_1 ;
0151 if(strcmp(name,RAYLEIGH_SCATTER_ALIGN_) == 0) test = RAYLEIGH_SCATTER_ALIGN ;
0152
0153 if(strcmp(name,PROPAGATE_TO_BOUNDARY_) == 0) test = PROPAGATE_TO_BOUNDARY ;
0154 if(strcmp(name,PROPAGATE_AT_BOUNDARY_) == 0) test = PROPAGATE_AT_BOUNDARY ;
0155
0156 if(strcmp(name,HEMISPHERE_S_POLARIZED_) == 0) test = HEMISPHERE_S_POLARIZED ;
0157 if(strcmp(name,HEMISPHERE_P_POLARIZED_) == 0) test = HEMISPHERE_P_POLARIZED ;
0158 if(strcmp(name,HEMISPHERE_X_POLARIZED_) == 0) test = HEMISPHERE_X_POLARIZED ;
0159
0160 if(strcmp(name,PROPAGATE_AT_BOUNDARY_NORMAL_INCIDENCE_) == 0) test = PROPAGATE_AT_BOUNDARY_NORMAL_INCIDENCE ;
0161
0162 if(strcmp(name,PROPAGATE_AT_BOUNDARY_S_POLARIZED_) == 0) test = PROPAGATE_AT_BOUNDARY_S_POLARIZED ;
0163 if(strcmp(name,PROPAGATE_AT_BOUNDARY_P_POLARIZED_) == 0) test = PROPAGATE_AT_BOUNDARY_P_POLARIZED ;
0164 if(strcmp(name,PROPAGATE_AT_BOUNDARY_X_POLARIZED_) == 0) test = PROPAGATE_AT_BOUNDARY_X_POLARIZED ;
0165
0166 if(strcmp(name,PROPAGATE_AT_MULTIFILM_S_POLARIZED_ ) == 0) test = PROPAGATE_AT_MULTIFILM_S_POLARIZED;
0167 if(strcmp(name,PROPAGATE_AT_MULTIFILM_P_POLARIZED_ ) == 0) test = PROPAGATE_AT_MULTIFILM_P_POLARIZED;
0168 if(strcmp(name,PROPAGATE_AT_MULTIFILM_X_POLARIZED_ ) == 0) test = PROPAGATE_AT_MULTIFILM_X_POLARIZED;
0169
0170 if(strcmp(name,QGEN_RANDOM_DIRECTION_MARSAGLIA_) == 0) test = QGEN_RANDOM_DIRECTION_MARSAGLIA ;
0171 if(strcmp(name,QGEN_LAMBERTIAN_DIRECTION_) == 0) test = QGEN_LAMBERTIAN_DIRECTION ;
0172 if(strcmp(name,QGEN_SMEAR_NORMAL_SIGMA_ALPHA_) == 0) test = QGEN_SMEAR_NORMAL_SIGMA_ALPHA ;
0173 if(strcmp(name,QGEN_SMEAR_NORMAL_POLISH_) == 0) test = QGEN_SMEAR_NORMAL_POLISH ;
0174
0175 if(strcmp(name,REFLECT_DIFFUSE_) == 0) test = REFLECT_DIFFUSE ;
0176 if(strcmp(name,REFLECT_SPECULAR_) == 0) test = REFLECT_SPECULAR ;
0177 if(strcmp(name,PROPAGATE_AT_SURFACE_) == 0) test = PROPAGATE_AT_SURFACE ;
0178 if(strcmp(name,FAKE_PROPAGATE_) == 0) test = FAKE_PROPAGATE ;
0179 if(strcmp(name,GENTORCH_) == 0) test = GENTORCH ;
0180 if(strcmp(name,MULTIFILM_LOOKUP_ ) == 0) test = MULTIFILM_LOOKUP ;
0181 if(strcmp(name,RANDGAUSSQ_SHOOT_ ) == 0) test = RANDGAUSSQ_SHOOT ;
0182
0183 bool known = test != UNKNOWN ;
0184 if(!known) printf("QSimLaunch::Type name [%s] is unknown \n", name) ;
0185
0186 return test ;
0187 }
0188
0189
0190 inline const char* QSimLaunch::Name( unsigned type )
0191 {
0192 const char* s = nullptr ;
0193 switch(type)
0194 {
0195 case RNG_SEQUENCE: s = RNG_SEQUENCE_ ; break ;
0196 case RNG_SEQUENCE_WITH_SKIPAHEAD: s = RNG_SEQUENCE_WITH_SKIPAHEAD_ ; break ;
0197 case BOUNDARY_LOOKUP_ALL: s = BOUNDARY_LOOKUP_ALL_ ; break ;
0198 case BOUNDARY_LOOKUP_WATER: s = BOUNDARY_LOOKUP_WATER_ ; break ;
0199 case BOUNDARY_LOOKUP_LS: s = BOUNDARY_LOOKUP_LS_ ; break ;
0200
0201 case WAVELENGTH_SCINTILLATION: s = WAVELENGTH_SCINTILLATION_ ; break ;
0202 case WAVELENGTH_CERENKOV: s = WAVELENGTH_CERENKOV_ ; break ;
0203
0204 case CERENKOV_GENERATE: s = CERENKOV_GENERATE_ ; break ;
0205 case CERENKOV_GENERATE_ENPROP_FLOAT: s = CERENKOV_GENERATE_ENPROP_FLOAT_ ; break ;
0206 case CERENKOV_GENERATE_ENPROP_DOUBLE: s = CERENKOV_GENERATE_ENPROP_DOUBLE_ ; break ;
0207 case CERENKOV_GENERATE_EXPT: s = CERENKOV_GENERATE_EXPT_ ; break ;
0208
0209 case SCINT_GENERATE: s = SCINT_GENERATE_ ; break ;
0210
0211
0212 case FILL_STATE_0: s = FILL_STATE_0_ ; break ;
0213 case FILL_STATE_1: s = FILL_STATE_1_ ; break ;
0214 case RAYLEIGH_SCATTER_ALIGN: s = RAYLEIGH_SCATTER_ALIGN_ ; break ;
0215 case PROPAGATE_TO_BOUNDARY: s = PROPAGATE_TO_BOUNDARY_ ; break ;
0216 case PROPAGATE_AT_BOUNDARY: s = PROPAGATE_AT_BOUNDARY_ ; break ;
0217
0218 case PROPAGATE_AT_BOUNDARY_NORMAL_INCIDENCE: s = PROPAGATE_AT_BOUNDARY_NORMAL_INCIDENCE_ ; break ;
0219
0220 case HEMISPHERE_S_POLARIZED: s = HEMISPHERE_S_POLARIZED_ ; break ;
0221 case HEMISPHERE_P_POLARIZED: s = HEMISPHERE_P_POLARIZED_ ; break ;
0222 case HEMISPHERE_X_POLARIZED: s = HEMISPHERE_X_POLARIZED_ ; break ;
0223
0224
0225 case PROPAGATE_AT_BOUNDARY_S_POLARIZED: s = PROPAGATE_AT_BOUNDARY_S_POLARIZED_ ; break ;
0226 case PROPAGATE_AT_BOUNDARY_P_POLARIZED: s = PROPAGATE_AT_BOUNDARY_P_POLARIZED_ ; break ;
0227 case PROPAGATE_AT_BOUNDARY_X_POLARIZED: s = PROPAGATE_AT_BOUNDARY_X_POLARIZED_ ; break ;
0228
0229 case PROPAGATE_AT_MULTIFILM_S_POLARIZED: s = PROPAGATE_AT_MULTIFILM_S_POLARIZED_ ; break ;
0230 case PROPAGATE_AT_MULTIFILM_P_POLARIZED: s = PROPAGATE_AT_MULTIFILM_P_POLARIZED_ ; break ;
0231 case PROPAGATE_AT_MULTIFILM_X_POLARIZED: s = PROPAGATE_AT_MULTIFILM_X_POLARIZED_ ; break ;
0232
0233
0234 case QGEN_RANDOM_DIRECTION_MARSAGLIA: s = QGEN_RANDOM_DIRECTION_MARSAGLIA_ ; break ;
0235 case QGEN_LAMBERTIAN_DIRECTION: s = QGEN_LAMBERTIAN_DIRECTION_ ; break ;
0236 case QGEN_SMEAR_NORMAL_SIGMA_ALPHA: s = QGEN_SMEAR_NORMAL_SIGMA_ALPHA_ ; break ;
0237 case QGEN_SMEAR_NORMAL_POLISH: s = QGEN_SMEAR_NORMAL_POLISH_ ; break ;
0238
0239
0240 case REFLECT_DIFFUSE: s = REFLECT_DIFFUSE_ ; break ;
0241 case REFLECT_SPECULAR: s = REFLECT_SPECULAR_ ; break ;
0242 case PROPAGATE_AT_SURFACE: s = PROPAGATE_AT_SURFACE_ ; break ;
0243 case FAKE_PROPAGATE: s = FAKE_PROPAGATE_ ; break ;
0244 case GENTORCH: s = GENTORCH_ ; break ;
0245 case MULTIFILM_LOOKUP: s = MULTIFILM_LOOKUP_ ; break ;
0246 case RANDGAUSSQ_SHOOT: s = RANDGAUSSQ_SHOOT_ ; break ;
0247 }
0248 return s;
0249 }
0250
0251
0252 inline bool QSimLaunch::IsMutate( unsigned type )
0253 {
0254 return
0255 type == PROPAGATE_AT_BOUNDARY_S_POLARIZED ||
0256 type == PROPAGATE_AT_BOUNDARY_P_POLARIZED ||
0257 type == PROPAGATE_AT_BOUNDARY_X_POLARIZED ||
0258 type == PROPAGATE_AT_MULTIFILM_S_POLARIZED||
0259 type == PROPAGATE_AT_MULTIFILM_P_POLARIZED||
0260 type == PROPAGATE_AT_MULTIFILM_X_POLARIZED||
0261 type == FAKE_PROPAGATE
0262 ;
0263 }
0264
0265 inline bool QSimLaunch::IsSurface( unsigned type )
0266 {
0267 return type == REFLECT_DIFFUSE || type == REFLECT_SPECULAR ;
0268 }
0269
0270 inline unsigned QSimLaunch::MutateSource( unsigned type )
0271 {
0272 unsigned src = UNKNOWN ;
0273 switch(type)
0274 {
0275 case PROPAGATE_AT_MULTIFILM_S_POLARIZED:
0276 case PROPAGATE_AT_BOUNDARY_S_POLARIZED: src = HEMISPHERE_S_POLARIZED ; break ;
0277 case PROPAGATE_AT_MULTIFILM_P_POLARIZED:
0278 case PROPAGATE_AT_BOUNDARY_P_POLARIZED: src = HEMISPHERE_P_POLARIZED ; break ;
0279 case PROPAGATE_AT_MULTIFILM_X_POLARIZED:
0280 case PROPAGATE_AT_BOUNDARY_X_POLARIZED: src = HEMISPHERE_X_POLARIZED ; break ;
0281 }
0282 return src ;
0283 }
0284
0285