36 typedef JAbstractHistogram<double> JHistogram_t;
45 JHistogram_t histogram;
50 JParser<> zap(
"Program to verify generation of arrival times of Cherenkov photons from a shower using tabulated CDF.");
54 zap[
'E'] =
make_field(
E,
"muon energy [GeV]") = 1.0;
56 zap[
'c'] =
make_field(cd,
"cosine emission angle");
57 zap[
'D'] =
make_field(dir,
"(theta, phi) of PMT [rad]");
59 zap[
'H'] =
make_field(histogram,
"histogram binning") = JHistogram_t();
64 catch(
const exception& error) {
65 FATAL(error.what() << endl);
70 typedef JPolint2Function1D_t JFunction1D_t;
71 typedef JMAPLIST<JPolint1FunctionalMap,
72 JPolint1FunctionalMap,
73 JPolint1FunctionalGridMap,
74 JPolint1FunctionalGridMap>::maplist JMapList_t;
75 typedef JCDFTable<JFunction1D_t, JMapList_t> JCDF_t;
82 NOTICE(
"loading input from file " << inputFile <<
"... " << flush);
84 cdf.load(inputFile.c_str());
88 catch(
const JException& error) {
89 FATAL(error.what() << endl);
97 cout <<
"t0 " << t0 << endl;
103 cout <<
"> " << flush;
108 const double npe =
cdf.getNPE (
D, cd, dir.getTheta(), dir.getPhi()) *
E;
109 const double t =
cdf.getTime(
D, cd, dir.getTheta(), dir.getPhi(), x);
111 cout <<
" --> " << t <<
' ' << t0 + t <<
' ' << npe;
113 catch(
const exception& error) {
114 ERROR(error.what() << endl);
133 if (!histogram.is_valid()) {
137 histogram = JHistogram_t(t0 - 20.0, t0 + 50.0);
139 histogram.setBinWidth(0.1);
143 histogram = JHistogram_t(t0 - 20.0, t0 + 500.0);
145 histogram.setBinWidth(0.5);
149 TH1D h0(
"h0", NULL, histogram.getNumberOfBins(), histogram.getLowerLimit(), histogram.getUpperLimit());
150 TH1D
h1(
"h1", NULL, 5000, 0.0, +1.0);
152 for (
int j = 1;
j <=
h1.GetNbinsX(); ++
j) {
156 const double x =
h1.GetBinCenter(
j);
157 const double t =
cdf.getTime(
D, cd, dir.getTheta(), dir.getPhi(), x);
159 h1.SetBinContent(
j, t);
161 catch(
const exception& error) {
162 ERROR(error.what() << endl);
166 if (numberOfEvents > 0) {
173 for (
int i = 0; i != numberOfEvents; ++i) {
175 if (i%1000== 0) {
NOTICE(i <<
'\r'); }
181 const double npe =
cdf.getNPE(
D, cd, dir.getTheta(), dir.getPhi()) *
E;
183 for (
int j = gRandom->Poisson(npe);
j != 0; --
j) {
185 const double x = gRandom->Rndm();
186 const double t =
cdf.getTime(
D, cd, dir.getTheta(), dir.getPhi(), x);
191 catch(
const exception& error) {
192 ERROR(error.what() << endl);
199 const double w = 1.0 / (double) numberOfEvents;
202 timer.print(cout, w);
207 for (
int j = 1;
j <= h0.GetNbinsX(); ++
j) {
209 const double y = h0.GetBinContent(
j);
210 const double dx = h0.GetBinWidth (
j);
212 h0.SetBinContent(
j, y / (dx*numberOfEvents*
E));
Utility class to parse command line options.
do echo Generating $dir eval D
double getIndexOfRefraction()
Get average index of refraction of water corresponding to group velocity.
std::string getLabel(const JLocation &location)
Get module label for monitoring and other applications.
then for HISTOGRAM in h0 h1
static const double C
Physics constants.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
direct light from EM shower
then for FUNCTION in pdf npe cdf
then usage $script[input file[working directory[option]]] nWhere option can be E