40int main(
int argc,
char **argv)
45 string fileDescriptor;
61 zap[
'O'] =
make_field(option) =
"KM3NeT",
"Antares";
62 zap[
'E'] =
make_field(E,
"muon/shower energy [GeV]");
63 zap[
'c'] =
make_field(cd,
"cosine emission angle");
64 zap[
'D'] =
make_field(dir,
"(theta, phi) of PMT [rad]");
65 zap[
'T'] =
make_field(TMax_ns,
"L1 coincidence time window [ns]") = 20.0;
66 zap[
'P'] =
make_field(particle) = MUON_t, SHOWER_t;
71 catch(
const exception &error) {
72 FATAL(error.what() << endl);
76 const double epsilon = 1.0e-6;
84 if (option ==
"KM3NeT") {
118 }
else if (option ==
"Antares") {
126 FATAL(
"Fatal error at detector option " << option << endl);
142 TH1D h00(
"L00", NULL, 300, 1.0, 151.0);
144 TH1D h0m(
"L0m", NULL, 300, 1.0, 151.0);
145 TH1D h1m(
"L1m", NULL, 300, 1.0, 151.0);
147 TH1D h0s(
"L0s", NULL, 300, 1.0, 151.0);
148 TH1D h1s(
"L1s", NULL, 300, 1.0, 151.0);
151 if (particle == MUON_t) {
163 DIRECT_LIGHT_FROM_MUON,
164 SCATTERED_LIGHT_FROM_MUON,
165 DIRECT_LIGHT_FROM_EMSHOWERS,
166 SCATTERED_LIGHT_FROM_EMSHOWERS,
167 DIRECT_LIGHT_FROM_DELTARAYS,
168 SCATTERED_LIGHT_FROM_DELTARAYS
171 const double TTS = 2.0;
173 const double epsilon = 1.0e-10;
175 const int NUMBER_OF_PDFS =
sizeof(type)/
sizeof(type[0]);
177 JPDF_t pdf[NUMBER_OF_PDFS];
179 const JPDF_t::JSupervisor supervisor(
new JPDF_t::JDefaultResult(
JMATH::zero));
181 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
185 const string file_name = getFilename(fileDescriptor, type[i]);
187 NOTICE(
"loading PDF from file " << file_name <<
"... " << flush);
189 pdf[i].load(file_name.c_str());
193 pdf[i].setExceptionHandler(supervisor);
201 const double Tmin = -15.0;
202 const double Tmax = +250.0;
203 const double dt = 1.0;
205 for (
int ix = 1; ix <= h00.GetNbinsX(); ++ix) {
207 const double R = h00.GetBinCenter(ix);
211 for (vector<JAngle3D>::const_iterator pmt =
PMT.begin(); pmt !=
PMT.end(); ++pmt) {
213 const double theta = pi.
constrain(pmt->getTheta());
214 const double phi = pi.
constrain(fabs(pmt->getPhi()));
218 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
220 double yi = pdf[i](R, theta, phi, Tmax).v;
222 if (is_bremsstrahlung(type[i])) {
224 }
else if (is_deltarays(type[i])) {
225 yi *= JDeltaRays::getEnergyLossFromMuon(E);
231 W += 1.0 - TMath::PoissonI(0,w);
236 h00.SetBinContent(ix, W);
239 for (
int ix = 1; ix <= h0m.GetNbinsX(); ++ix) {
241 const double R = h0m.GetBinCenter(ix);
245 for (vector<JAngle3D>::const_iterator pmt =
PMT.begin(); pmt !=
PMT.end(); ++pmt) {
247 const double theta = pi.
constrain(pmt->getTheta());
248 const double phi = pi.
constrain(fabs(pmt->getPhi()));
250 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
252 double yi = pdf[i](R, theta, phi, Tmax).v;
254 if (is_bremsstrahlung(type[i])) {
256 }
else if (is_deltarays(type[i])) {
257 yi *= JDeltaRays::getEnergyLossFromMuon(E);
263 h0m.SetBinContent(ix, 1.0 - TMath::PoissonI(0,V));
268 const int NUMBER_OF_PMTS =
PMT.size();
270 double Vi[NUMBER_OF_PMTS];
272 for (
int ix = 1; ix <= h1m.GetNbinsX(); ++ix) {
274 const double R = h1m.GetBinCenter(ix);
278 for (
double x = Tmin; x <= Tmax; x += dt) {
282 for (
int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
287 const double phi = pi.
constrain(fabs(
PMT[pmt].getPhi()));
289 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
292 pdf[i](R, theta, phi, x).v,
293 pdf[i](R, theta, phi, x + TMax_ns).v
296 if (is_bremsstrahlung(type[i])) {
299 }
else if (is_deltarays(type[i])) {
300 yi[0] *= JDeltaRays::getEnergyLossFromMuon(E);
301 yi[1] *= JDeltaRays::getEnergyLossFromMuon(E);
304 Vi[pmt] += yi[1] - yi[0];
310 for (
int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
313 const double phi = pi.
constrain(fabs(
PMT[pmt].getPhi()));
317 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
319 double yi = pdf[i](R, theta, phi, x).f;
321 if (is_bremsstrahlung(type[i])) {
323 }
else if (is_deltarays(type[i])) {
324 yi *= JDeltaRays::getEnergyLossFromMuon(E);
331 Y += y * (1.0 - TMath::PoissonI(0, V - Vi[pmt])) * dt;
336 h1m.SetBinContent(ix, 1.0 - TMath::PoissonI(0,Y));
341 if (particle == SHOWER_t) {
354 DIRECT_LIGHT_FROM_EMSHOWER,
355 SCATTERED_LIGHT_FROM_EMSHOWER
358 const double TTS = 2.0;
360 const double epsilon = 1.0e-10;
362 const int NUMBER_OF_PDFS =
sizeof(type)/
sizeof(type[0]);
364 JPDF_t pdf[NUMBER_OF_PDFS];
366 const JPDF_t::JSupervisor supervisor(
new JPDF_t::JDefaultResult(
JMATH::zero));
368 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
372 const string file_name = getFilename(fileDescriptor, type[i]);
374 NOTICE(
"loading PDF from file " << file_name <<
"... " << flush);
376 pdf[i].load(file_name.c_str());
380 pdf[i].setExceptionHandler(supervisor);
388 const double Tmin = -15.0;
389 const double Tmax = +250.0;
390 const double dt = 1.0;
392 for (
int ix = 1; ix <= h0s.GetNbinsX(); ++ix) {
394 const double D = h0s.GetBinCenter(ix);
398 for (vector<JAngle3D>::const_iterator pmt =
PMT.begin(); pmt !=
PMT.end(); ++pmt) {
400 const double theta = pi.
constrain(pmt->getTheta());
401 const double phi = pi.
constrain(fabs(pmt->getPhi()));
403 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
405 double yi = pdf[i](D, cd, theta, phi, Tmax).V;
413 h0s.SetBinContent(ix, 1.0 - TMath::PoissonI(0,V));
417 const int NUMBER_OF_PMTS =
PMT.size();
419 double Vi[NUMBER_OF_PMTS];
421 for (
int ix = 1; ix <= h1s.GetNbinsX(); ++ix) {
423 const double D = h1s.GetBinCenter(ix);
427 for (
double x = Tmin; x <= Tmax; x += dt) {
431 for (
int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
436 const double phi = pi.
constrain(fabs(
PMT[pmt].getPhi()));
438 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
441 pdf[i](D, cd, theta, phi, x).v,
442 pdf[i](D, cd, theta, phi, x + TMax_ns).v
448 Vi[pmt] += yi[1] - yi[0];
454 for (
int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
457 const double phi = pi.
constrain(fabs(
PMT[pmt].getPhi()));
461 for (
int i = 0; i != NUMBER_OF_PDFS; ++i) {
463 double yi = pdf[i](D, cd, theta, phi, x).f;
471 Y += y * (1.0 - TMath::PoissonI(0, V - Vi[pmt])) * dt;
476 h1s.SetBinContent(ix, 1.0 - TMath::PoissonI(0,Y));