Jpp  master_rocky-43-ge265d140c
the software that should make you happy
JDrawPDF.cc
Go to the documentation of this file.
1 
2 #include <string>
3 #include <iostream>
4 #include <iomanip>
5 
6 #include "TROOT.h"
7 #include "TFile.h"
8 #include "TH1D.h"
9 
10 #include "JPhysics/JPDF.hh"
11 #include "JPhysics/Antares.hh"
12 #include "JPhysics/KM3NeT.hh"
13 #include "JTools/JElement.hh"
14 #include "JTools/JFunction1D_t.hh"
15 #include "JTools/JQuantiles.hh"
17 #include "JGeometry3D/JAngle3D.hh"
18 #include "Jeep/JProperties.hh"
19 #include "Jeep/JPrint.hh"
20 #include "Jeep/JParser.hh"
21 #include "Jeep/JMessage.hh"
22 #include "JPhysics/JGeane.hh"
23 
24 
25 /**
26  * Scaling of absorption and scattering length.
27  */
30 
31 inline double getAbsorptionLength(const double lambda)
32 {
34 }
35 
36 
37 inline double getScatteringLength(const double lambda)
38 {
40 }
41 
42 
43 /**
44  * \file
45  *
46  * Auxiliary program to draw PDF of Cherenkov light from muon.
47  * \author mdejong, bofearraigh
48  */
49 int main(int argc, char **argv)
50 {
51  using namespace std;
52  using namespace JPP;
53 
55 
56  string outputFile;
57  int numberOfPoints;
58  double epsilon;
59  double E;
60  double R;
61  double z;
62  JAngle3D dir;
63  vector<int> function;
64  JHistogram_t histogram;
65  int debug;
66 
67  try {
68 
69  JProperties properties;
70 
71  properties.insert(gmake_property(JPHYSICS::MODULE_RADIUS_M));
72 
73  JParser<> zap("Auxiliary program to draw PDF of Cherenkov light from muon.");
74 
75  zap['@'] = make_field(properties) = JPARSER::initialised();
76  zap['o'] = make_field(outputFile) = "";
77  zap['n'] = make_field(numberOfPoints, "points for integration") = 25;
78  zap['e'] = make_field(epsilon, "precision for integration") = 1.0e-10;
79  zap['A'] = make_field(absorptionLengthFactor, "scaling factor") = 1.0;
80  zap['S'] = make_field(scatteringLengthFactor, "scaling factor") = 1.0;
81  zap['E'] = make_field(E, "muon energy at vertex [GeV]")= 1.0;
82  zap['R'] = make_field(R, "distance of approach [m]");
83  zap['z'] = make_field(z, "PMT z-position [m]");
84  zap['D'] = make_field(dir, "(theta, phi) of PMT [rad]");
85  zap['F'] = make_field(function, "PDF type");
86  zap['H'] = make_field(histogram, "histogram binning") = JHistogram_t();
87  zap['d'] = make_field(debug) = 0;
88 
89  zap(argc, argv);
90  }
91  catch(const exception &error) {
92  FATAL(error.what() << endl);
93  }
94 
95 
96  const JPDF_C
107  epsilon);
108 
109  const double z_emission = z - R/getTanThetaC(); // emission point z-position
110  const double E_emission = gWater.getE(E, z_emission ); // Get energy of muon at emission point
111 
112  if (outputFile == "") {
113 
114  for (double dt; cin >> dt; ) {
115 
116  for (vector<int>::const_iterator F = function.begin(); F != function.end(); ++F) {
117 
118  cout << setw(2) << *F << ' '
119  << SCIENTIFIC(7,1) << E << ' '
120  << FIXED(5,1) << R << ' '
121  << FIXED(5,1) << z << ' '
122  << FIXED(5,2) << dir.getTheta() << ' '
123  << FIXED(5,2) << dir.getPhi() << ' '
124  << FIXED(5,1) << dt << ' '
125  << SCIENTIFIC(9,3) << pdf.getLightFromMuon(*F, E_emission, R, dir.getTheta(), dir.getPhi(), dt) * E_emission << endl;
126  }
127  }
128 
129  return 0;
130  }
131 
132 
133  TFile out(outputFile.c_str(), "recreate");
134 
135  const double t0 = 0.0; // time [ns]
136 
137  if (!histogram.is_valid()) {
138 
139  if (function.size() == 1 && function[0] == DIRECT_LIGHT_FROM_MUON) {
140 
141  histogram = JHistogram_t(t0 - 20.0, t0 + 50.0);
142 
143  histogram.setBinWidth(0.1);
144 
145  } else {
146 
147  histogram = JHistogram_t(t0 - 20.0, t0 + 500.0);
148 
149  histogram.setBinWidth(0.5);
150  }
151  }
152 
153  TH1D h0("h0", NULL, histogram.getNumberOfBins(), histogram.getLowerLimit(), histogram.getUpperLimit());
154 
156 
157  if ( E_emission > MASS_MUON* (1/COS_THETA_C_WATER) ) { // muon emission energy has to be above Cherenkov threshold
158 
159  if (z_emission >= 0 && z_emission <= gWater(E)) { // emission point is between start and end point of muon
160  for (int i = 1; i <= h0.GetNbinsX(); ++i) {
161 
162  const double dt = h0.GetBinCenter(i) - t0;
163 
164  double value = 0.0;
165 
166  for (vector<int>::const_iterator F = function.begin(); F != function.end(); ++F) {
167  value += pdf.getLightFromMuon(*F, E_emission, R, dir.getTheta(), dir.getPhi(), dt);
168  }
169 
170  h0.SetBinContent(i, value);
171 
172  f1[dt] = value;
173  }
174  }
175  }
176 
177  f1.setExceptionHandler(new JSplineFunction1S_t::JDefaultResult(JMATH::zero));
178  f1.compile();
179 
180  const double T = 5; // [ns]
181 
182  JQuantiles quantiles(f1);
183 
184  const double t1 = quantiles.getX();
185  const double y = f1(t1 + T).v - f1(t1 - T).v;
186 
187  DEBUG("E " << E << endl);
188  DEBUG("E_emission" << E_emission << endl);
189  DEBUG("R " << R << endl);
190  DEBUG("z " << z << endl);
191  DEBUG("theta " << dir.getTheta() << endl);
192  DEBUG("phi " << dir.getPhi() << endl);
193  DEBUG("int " << quantiles.getIntegral() << endl);
194  DEBUG("t1 " << t1 << endl);
195  DEBUG("max " << quantiles.getY() << endl);
196  DEBUG("FWHM " << quantiles.getFWHM() << endl);
197  DEBUG("int[] " << y << endl);
198 
199 
200  out.Write();
201  out.Close();
202 }
Properties of Antares PMT and deep-sea water.
string outputFile
double getAngularAcceptance(const double x)
Angular acceptence of PMT.
Definition: JDrawLED.cc:68
int main(int argc, char **argv)
Definition: JDrawPDF.cc:49
double getAbsorptionLength(const double lambda)
Definition: JDrawPDF.cc:31
double getScatteringLength(const double lambda)
Definition: JDrawPDF.cc:37
double absorptionLengthFactor
Scaling of absorption and scattering length.
Definition: JDrawPDF.cc:28
double scatteringLengthFactor
Definition: JDrawPDF.cc:29
The elements in a collection are sorted according to their abscissa values and a given distance opera...
Energy loss of muon.
General purpose messaging.
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
#define FATAL(A)
Definition: JMessage.hh:67
int debug
debug level
Definition: JSirene.cc:69
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:2142
I/O formatting auxiliaries.
Utility class to parse parameter values.
#define gmake_property(A)
macros to convert (template) parameter to JPropertiesElement object
int numberOfPoints
Definition: JResultPDF.cc:22
Properties of KM3NeT PMT and deep-sea water.
Utility class to parse parameter values.
Definition: JProperties.hh:501
Data structure for angles in three dimensions.
Definition: JAngle3D.hh:35
double getTheta() const
Get theta angle.
Definition: JAngle3D.hh:86
double getPhi() const
Get phi angle.
Definition: JAngle3D.hh:97
Utility class to parse command line options.
Definition: JParser.hh:1698
virtual double getE(const double E, const double dx) const override
Get energy of muon after specified distance.
Definition: JGeane.hh:257
Probability Density Functions of the time response of a PMT with an implementation of the JAbstractPM...
Definition: JPDF.hh:2185
double getLightFromMuon(const int type, const double E_GeV, const double R_m, const double theta, const double phi, const double t_ns) const
Probability density function for light from muon.
Definition: JPDF.hh:1751
Quantile calculator for a given function.
Definition: JQuantiles.hh:108
double getIntegral() const
Get integral of function.
Definition: JQuantiles.hh:346
double getY() const
Get value of maximum.
Definition: JQuantiles.hh:324
double getX() const
Get position of maximum.
Definition: JQuantiles.hh:313
double getFWHM() const
Get Full Width at Half Maximum.
Definition: JQuantiles.hh:335
T getLowerLimit() const
Get lower limit.
Definition: JRange.hh:202
T getUpperLimit() const
Get upper limit.
Definition: JRange.hh:213
double getAmbientPressure()
Get ambient pressure.
Definition: Antares.hh:40
double getScatteringProbability(const double x)
Function to describe light scattering in water.
Definition: Antares.hh:210
double getPhotocathodeArea()
Get photo-cathode area of PMT.
Definition: Antares.hh:51
const JPolynome f1(1.0, 2.0, 3.0)
Function.
const double epsilon
Definition: JQuadrature.cc:21
JAbstractHistogram< double > JHistogram_t
Type definition for scan along axis.
Definition: JBillabong.cc:61
double getQE(const double R, const double mu)
Get QE for given ratio of hit probabilities and expectation value of the number of photo-electrons.
static const JZero zero
Function object to assign zero value.
Definition: JZero.hh:105
static double MODULE_RADIUS_M
Radius of optical module [m].
Definition: JPDF.hh:40
static const double MASS_MUON
muon mass [GeV]
double getMinimalWavelength()
Get minimal wavelength for PDF evaluations.
Definition: JPDFToolkit.hh:35
static const JGeaneWater gWater
Function object for energy loss of muon in sea water.
Definition: JGeane.hh:381
double getTanThetaC()
Get average tangent of Cherenkov angle of water corresponding to group velocity.
@ DIRECT_LIGHT_FROM_MUON
direct light from muon
Definition: JPDFTypes.hh:26
double getMaximalWavelength()
Get maximal wavelength for PDF evaluations.
Definition: JPDFToolkit.hh:46
static const double COS_THETA_C_WATER
Average cosine corresponding to the group velocity.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Definition: JSTDTypes.hh:14
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:448
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:68
Simple data structure for histogram binning.
void setBinWidth(const abscissa_type dx, int option=0)
Set bin width.
bool is_valid() const
Check validity of histogram binning.
int getNumberOfBins() const
Get number of bins.
Type definition of a spline interpolation method based on a JCollection with JResultPDF result type.
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:488