53{
   56 
   60  int                 function;
   63  
   64  try {
   65 
   66    JParser<> zap(
"Program to create interpolation tables of the PDF of the arrival time of the Cherenkov light from a muon.");
 
   67 
   70    zap[
'e'] = 
make_field(epsilon,                
"precision for integration")  = 1.0e-10;
 
   74      DIRECT_LIGHT_FROM_MUON,
   75      DIRECT_LIGHT_FROM_EMSHOWERS,
   76      DIRECT_LIGHT_FROM_DELTARAYS,
   77      SCATTERED_LIGHT_FROM_MUON,
   78      SCATTERED_LIGHT_FROM_EMSHOWERS,
   79      SCATTERED_LIGHT_FROM_DELTARAYS;
   82 
   84 
   85    zap(argc, argv);
   86  }
   87  catch(const exception &error) {
   88    FATAL(error.what() << endl);
 
   89  }
   90 
   91 
   92  typedef double (
JPDF::*fcn)(
const double,
 
   93                              const double,
   94                              const double,
   95                              const double) const;
   96 
   97 
   98  
   99 
  100  const double P_atm = NAMESPACE::getAmbientPressure();
  103  
  104 
  106    pdf_c(NAMESPACE::getPhotocathodeArea(),
  107          NAMESPACE::getQE,
  108          NAMESPACE::getAngularAcceptance,
  111          NAMESPACE::getScatteringProbability,
  112          P_atm,
  113          wmin,
  114          wmax,
  116          epsilon);
  117 
  118 
  124 
  127 
  128  JPDF_t pdf;
  129 
  130 
  131  NOTICE(
"building multi-dimensional function object <" << function << 
">... " << flush);
 
  132  
  133 
  134  const double kmin = pdf_c.getKappa(wmax);
  135  const double kmax = pdf_c.getKappa(wmin);
  136  const double cmin = pdf_c.getKmin (wmax);
  137 
  139 
  140  zmap[DIRECT_LIGHT_FROM_MUON]         = make_pair((fcn) &JPDF::getDirectLightFromMuon,         JFunction3DTransformer_t(21.5, 2, kmin, kmax, NAMESPACE::getAngularAcceptance, 0.001));
  141  zmap[SCATTERED_LIGHT_FROM_MUON]      = make_pair((fcn) &JPDF::getScatteredLightFromMuon,      JFunction3DTransformer_t(35.0, 2, cmin, 0.0,  NAMESPACE::getAngularAcceptance, 0.10));
  142  zmap[DIRECT_LIGHT_FROM_EMSHOWERS]    = make_pair((fcn) &JPDF::getDirectLightFromEMshowers,    JFunction3DTransformer_t(21.5, 2, cmin, 0.0,  NAMESPACE::getAngularAcceptance, 0.10));
  143  zmap[SCATTERED_LIGHT_FROM_EMSHOWERS] = make_pair((fcn) &JPDF::getScatteredLightFromEMshowers, JFunction3DTransformer_t(35.0, 2, cmin, 0.0,  NAMESPACE::getAngularAcceptance, 0.10));
  144  zmap[DIRECT_LIGHT_FROM_DELTARAYS]    = make_pair((fcn) &JPDF::getDirectLightFromDeltaRays,    JFunction3DTransformer_t(21.5, 2, cmin, 0.0,  NAMESPACE::getAngularAcceptance, 0.10));
  145  zmap[SCATTERED_LIGHT_FROM_DELTARAYS] = make_pair((fcn) &JPDF::getScatteredLightFromDeltaRays, JFunction3DTransformer_t(35.0, 2, cmin, 0.0,  NAMESPACE::getAngularAcceptance, 0.10));
  146 
  147  if (zmap.find(function) == zmap.end()) {
  148    FATAL(
"illegal function specifier" << endl);
 
  149  }
  150 
  151  fcn                      f           = zmap[function].first;    
  152  JFunction3DTransformer_t transformer = zmap[function].second;   
  153 
  154 
  155  if (R.empty()) {
  156    R.insert(  0.10);
  157    R.insert(  0.30);
  158    R.insert(  0.50);
  159    R.insert(  1.00);
  160    R.insert(  2.00);
  161    R.insert(  3.00);
  162    R.insert(  4.00);
  163    R.insert(  5.00);
  164    R.insert(  6.00);
  165    R.insert(  7.00);
  166    R.insert(  8.00);
  167    R.insert(  9.00);
  168    R.insert( 10.00);
  169    R.insert( 11.00);
  170    R.insert( 12.00);
  171    R.insert( 13.00);
  172    R.insert( 14.00);
  173    R.insert( 15.00);
  174    R.insert( 16.00);
  175    R.insert( 17.00);
  176    R.insert( 18.00);
  177    R.insert( 19.00);
  178    R.insert( 20.00);
  179    R.insert( 22.00);
  180    R.insert( 24.00);
  181    R.insert( 26.00);
  182    R.insert( 28.00);
  183    R.insert( 30.00);
  184    R.insert( 32.00);
  185    R.insert( 34.00);
  186    R.insert( 36.00);
  187    R.insert( 38.00);
  188    R.insert( 40.00);
  189    R.insert( 42.00);
  190    R.insert( 44.00);
  191    R.insert( 46.00);
  192    R.insert( 48.00);
  193    R.insert( 50.00);
  194    R.insert( 55.00);
  195    R.insert( 60.00);
  196    R.insert( 65.00);
  197    R.insert( 70.00);
  198    R.insert( 75.00);
  199    R.insert( 80.00);
  200    R.insert( 85.00);
  201    R.insert( 90.00);
  202    R.insert( 95.00);
  203    R.insert(100.00);
  204    R.insert(110.00);
  205    R.insert(120.00);
  206    R.insert(130.00);
  207    R.insert(140.00);
  208    R.insert(150.00);
  209    R.insert(170.00);
  210    R.insert(190.00);
  211    R.insert(210.00);
  212    R.insert(250.00);
  213  }
  214 
  216 
  217  if (function == DIRECT_LIGHT_FROM_MUON) {
  218 
  219    for (
double buffer[] = { -0.01, -0.005, 0.0, 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, -1.0 }, *
x = buffer; *
x != -1.0; ++
x) {
 
  220      X.insert(0.0 + *x);
  221      X.insert(1.0 - *x);
  222    }
  223 
  224    for (
double x = 0.01; 
x < 0.1; 
x += 0.0025) {
 
  225      X.insert(0.0 + x);
  226      X.insert(1.0 - x);
  227    }
  228 
  229    for (
double x = 0.10; 
x < 0.5; 
x += 0.010) {
 
  230      X.insert(0.0 + x);
  231      X.insert(1.0 - x);
  232    }
  233     
  234  } else {
  235 
  236    X.insert(  0.00);
  237    X.insert(  0.01);
  238    X.insert(  0.02);
  239    X.insert(  0.03);
  240    X.insert(  0.04);
  241    X.insert(  0.05);
  242    X.insert(  0.06);
  243    X.insert(  0.07);
  244    X.insert(  0.08);
  245    X.insert(  0.09);
  246    X.insert(  0.10);
  247    X.insert(  0.12);
  248    X.insert(  0.15);
  249    X.insert(  0.20);
  250    X.insert(  0.25);
  251    X.insert(  0.30);
  252    X.insert(  0.40);
  253    X.insert(  0.50);
  254    X.insert(  0.60);
  255    X.insert(  0.70);
  256    X.insert(  0.80);
  257    X.insert(  0.90);
  258    X.insert(  1.00);
  259    X.insert(  1.10);
  260    X.insert(  1.20);
  261    X.insert(  1.30);
  262    X.insert(  1.40);
  263    X.insert(  1.50);
  264    X.insert(  1.60);
  265    X.insert(  1.70);
  266    X.insert(  1.80);
  267    X.insert(  1.90);
  268    X.insert(  2.00);
  269    X.insert(  2.20);
  270    X.insert(  2.40);
  271    X.insert(  2.60);
  272    X.insert(  2.80);
  273    X.insert(  3.00);
  274    X.insert(  3.25);
  275    X.insert(  3.50);
  276    X.insert(  3.75);
  277    X.insert(  4.00);
  278    X.insert(  4.25);
  279    X.insert(  4.50);
  280    X.insert(  4.75);
  281    X.insert(  5.0);
  282    X.insert(  6.0);
  283    X.insert(  7.0);
  284    X.insert(  8.0);
  285    X.insert(  9.0);
  286    X.insert( 10.0);
  287    X.insert( 12.0);
  288    X.insert( 14.0);
  289    X.insert( 16.0);
  290    X.insert( 18.0);
  291    X.insert( 20.0);
  292    X.insert( 25.0);
  293    X.insert( 30.0);
  294    X.insert( 40.0);
  295    X.insert( 50.0);
  296    X.insert( 60.0);
  297    X.insert( 70.0);
  298    X.insert( 80.0);
  299    X.insert( 90.0);
  300    X.insert(100.0);
  301    X.insert(120.0);
  302    X.insert(140.0);
  303    X.insert(160.0);
  304    X.insert(180.0);
  305    X.insert(200.0);
  306    X.insert(250.0);
  307    X.insert(300.0);
  308    X.insert(350.0);
  309    X.insert(400.0);
  310    X.insert(450.0);
  311    X.insert(500.0);
  312    X.insert(600.0);
  313    X.insert(700.0);
  314    X.insert(800.0);
  315    X.insert(900.0);
  316    X.insert(1200.0);
  317    X.insert(1500.0);
  318  }
  319 
  320    
  321  const double grid  =  5.0;                        
  322 
  323  const double alpha = 2.0 * sqrt(1.0 - cos(grid * PI / 180.0));  
  324 
  325 
  327 
  328    const double R_m = *
r;
 
  329 
  330    const unsigned int number_of_theta_points = max(2u, (unsigned int) (180.0/(1.4 * grid)));
  331    
  332    for (
double theta = 0.0; theta <= PI + 
epsilon; theta += PI/number_of_theta_points) {
 
  333      
  334      const unsigned int number_of_phi_points = max(2u, (unsigned int) (PI * sin(theta) / alpha));
  335      
  336      for (
double phi = 0.0; phi <= PI + 
epsilon; phi += PI/number_of_phi_points) {
 
  337        
  338        JFunction1D_t& 
f1 = pdf[R_m][theta][phi];
 
  339        
  340        const JArray_t 
array(R_m, theta, phi);
 
  341 
  342        double t_old = transformer.getXn(
array, *X.begin());
 
  343        double y_old = 0.0;
  344 
  346 
  347          const double t = transformer.getXn(
array, *x);
 
  348          const double y = (pdf_c.*f)(R_m, theta, phi, t);
 
  349 
  350          if (y != 0.0) {
  351 
  352            if (*x < 0.0) {
  353              WARNING(
"dt < 0 " << *x << 
' ' << R_m << 
' ' << t << 
' ' << y << endl);
 
  354            }
  355 
  356            if (y_old == 0.0) {
  358            }
  359 
  361            
  362          } else {
  363            
  364            if (y_old != 0.0) {
  366            }
  367          }
  368          
  369          t_old = t;
  371        }
  372      }
  373    }
  374  }
  375 
  376  pdf.transform(transformer);
  377  pdf.compile();
  378 
  380 
  381  try {
  382 
  384 
  386 
  388  }
  391  }
  392}
double getAbsorptionLength(const double lambda)
 
double getScatteringLength(const double lambda)
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
virtual const char * what() const override
Get error message.
 
Utility class to parse command line options.
 
Multi-dimensional PDF table for arrival time of Cherenkov light.
 
Probability Density Functions of the time response of a PMT with an implementation of the JAbstractPM...
 
const JPolynome f1(1.0, 2.0, 3.0)
Function.
 
double getMinimalWavelength()
Get minimal wavelength for PDF evaluations.
 
double getMaximalWavelength()
Get maximal wavelength for PDF evaluations.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
 
Empty structure for specification of parser element that is not initialised (i.e. does require input)...
 
Auxiliary data structure for muon PDF.