Back to home page

EIC code displayed by LXR

 
 

    


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    //assert(known);
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