Auxiliary program to determine PDF of L1 hit.
35{
38
40
41 string inputFile;
43 double E;
44 double R;
45 double R_Hz;
47 double T_ns;
50
51 try {
52
53 JParser<> zap(
"Auxiliary program to determine PDF of L1 hit.");
54
57 zap[
'E'] =
make_field(E,
"muon energy [GeV]") = 1.0;
58 zap[
'R'] =
make_field(R,
"distance of approach [m]");
59 zap[
'D'] =
make_field(dir,
"(theta, phi) of PMT [rad]");
60 zap[
'T'] =
make_field(T_ns,
"time window [ns]") = 10.0;
61 zap[
'B'] =
make_field(R_Hz,
"background rate [Hz]") = 0.0;
64
65 zap(argc, argv);
66 }
67 catch(const exception &error) {
68 FATAL(error.what() << endl);
69 }
70
76
77 JFunction1D_t::JSupervisor supervisor(new JFunction1D_t::JDefaultResult(zero));
78
79 const JPDFType_t pdf_t[] = { DIRECT_LIGHT_FROM_MUON,
80 SCATTERED_LIGHT_FROM_MUON,
81 DIRECT_LIGHT_FROM_DELTARAYS,
82 SCATTERED_LIGHT_FROM_DELTARAYS,
83 DIRECT_LIGHT_FROM_EMSHOWERS,
84 SCATTERED_LIGHT_FROM_EMSHOWERS };
85
86 const int N = sizeof(pdf_t) / sizeof(pdf_t[0]);
87
88 JPDF_t pdf[N];
89
90 for (int i = 0; i != N; ++i) {
91
92 try {
93
94 const string file_name = getFilename(inputFile, pdf_t[i]);
95
96 NOTICE(
"loading input from file " << file_name <<
"... " << flush);
97
98 pdf[i].load(file_name.c_str());
99
101 }
104 }
105
106 pdf[i].setExceptionHandler(supervisor);
107 }
108
110
112
114 }
115
116
117 JModule module = getModule<JKM3NeT_t>(1);
118
119 module.rotate(JRotation3D(dir));
120
121
123
125
127
129
130 const double t2 = t1 + T_ns;
131
132 JFunction1D_t::result_type y1;
133 JFunction1D_t::result_type y2;
134
135 for (int i = 0; i != N; ++i) {
136
137 JFunction1D_t::result_type
p1;
138 JFunction1D_t::result_type p2;
139
140
141
142 for (const auto& pmt : module) {
143 p1 += pdf[i](R, pmt.getTheta(), pmt.getPhi(), t1);
144 p2 += pdf[i](R, pmt.getTheta(), pmt.getPhi(), t2);
145 }
146
152 p2 *= E;
153 }
154
156 y2 += p2;
157 }
158
159
160
161 y1.f += R_Hz * 1e-9;
164
165 zsp[t1] = y1.f * (1.0 - exp(y1.v - y2.v));
166 }
167
168 zsp.compile();
169
170 for (int ix = 1; ix <= h0.GetNbinsX(); ++ix) {
171
172 const double t1 = h0.GetBinCenter(ix);
173
174 try {
175
176 const JFunction1D_t::result_type
result = zsp(t1);
177
179
180 h0.SetBinContent(ix, W);
181 }
182 catch(const exception&) {}
183 }
184
185 out.Write();
186 out.Close();
187}
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Data structure for a composite optical module.
Data structure for angles in three dimensions.
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.
double getDeltaRaysFromMuon(const double E, const JRange< double > T_GeV=JRange< double >(DELTARAY_TMIN, DELTARAY_TMAX))
Equivalent EM-shower energy due to delta-rays per unit muon track length.
bool is_deltarays(const int pdf)
Test if given PDF type corresponds to Cherenkov light from delta-rays.
bool is_bremsstrahlung(const int pdf)
Test if given PDF type corresponds to Cherenkov light from Bremsstrahlung.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).