Jpp  18.5.0
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JGeane.hh
Go to the documentation of this file.
1 #ifndef __JPHYSICS__JGEANE__
2 #define __JPHYSICS__JGEANE__
3 
4 #include <cmath>
5 #include <map>
6 
7 #include "JPhysics/JConstants.hh"
8 
9 
10 /**
11  * \file
12  * Energy loss of muon.
13  * \author mdejong
14  */
15 
16 namespace JPHYSICS {}
17 namespace JPP { using namespace JPHYSICS; }
18 
19 namespace JPHYSICS {
20 
21  /**
22  * Equivalent muon track length per unit shower energy.
23  *
24  * See ANTARES internal note ANTARES-SOFT-2002-015, J.\ Brunner.
25  *
26  * \return equivalent muon track length [m/Gev]
27  */
28  inline double geanc()
29  {
30  return 4.7319; // dx/dE [m/GeV]
31  }
32 
33 
34  /**
35  * Interface for muon energy loss.
36  *
37  * This interface provides for the various function object operators.
38  */
39  class JGeane {
40  public:
41  /**
42  * Get energy loss constant.
43  *
44  * \return Energy loss due to ionisation [GeV/m]
45  */
46  virtual double getA() const = 0;
47 
48 
49  /**
50  * Get energy loss constant.
51  *
52  * \return Energy loss due to pair production and bremsstrahlung [m^-1]
53  */
54  virtual double getB() const = 0;
55 
56 
57  /**
58  * Get energy of muon after specified distance.
59  *
60  * \param E Energy of muon [GeV]
61  * \param dx distance traveled [m]
62  * \return Energy of muon [GeV]
63  */
64  virtual double getE(const double E, const double dx) const = 0;
65 
66 
67  /**
68  * Get distance traveled by muon.
69  *
70  * \param E0 Energy of muon at start [GeV]
71  * \param E1 Energy of muon at end [GeV]
72  * \return distance traveled [m]
73  */
74  virtual double getX(const double E0,
75  const double E1) const = 0;
76 
77 
78  /**
79  * Energy of muon after specified distance.
80  *
81  * \param E Energy of muon [GeV]
82  * \param dx distance traveled [m]
83  * \return Energy of muon [GeV]
84  */
85  double operator()(const double E, const double dx) const
86  {
87  return this->getE(E, dx);
88  }
89 
90 
91  /**
92  * Range of muon.
93  *
94  * \param E Energy of muon [GeV]
95  * \return range [m]
96  */
97  double operator()(const double E) const
98  {
99  return this->getX(E, 0.0);
100  }
101 
102 
103  /**
104  * Equivalent unit track length per unit shower energy and per unit track length.
105  *
106  * \return equivalent unit track length [Gev^-1]
107  */
108  double operator()() const
109  {
110  return this->getB() * geanc();
111  }
112  };
113 
114 
115  /**
116  * Function object for the energy loss of the muon.\n
117  * The energy loss can be formulated as:
118  *
119  * \f[ -\frac{dE}{dx} = a + bE \f]
120  *
121  * N.B:
122  * \f$ a \f$ and \f$ b \f$ are assumed constant (internal units m and GeV, respectively).
123  */
124  class JGeane_t :
125  public JGeane
126  {
127  public:
128  /**
129  * constructor
130  * \param __a Energy loss due to ionisation [GeV/m]
131  * \param __b Energy loss due to pair production and bremsstrahlung [m^-1]
132  */
133  JGeane_t(const double __a,
134  const double __b) :
135  a(__a),
136  b(__b)
137  {}
138 
139 
140  /**
141  * Get energy loss constant.
142  *
143  * \return Energy loss due to ionisation [GeV/m]
144  */
145  virtual double getA() const override
146  {
147  return a;
148  }
149 
150 
151  /**
152  * Get energy loss constant.
153  *
154  * \return Energy loss due to pair production and bremsstrahlung [m^-1]
155  */
156  virtual double getB() const override
157  {
158  return b;
159  }
160 
161 
162  /**
163  * Get energy of muon after specified distance.
164  *
165  * \param E Energy of muon [GeV]
166  * \param dx distance traveled [m]
167  * \return Energy of muon [GeV]
168  */
169  virtual double getE(const double E, const double dx) const override
170  {
171  const double y = (a/b + E) * exp(-b*dx) - a/b;
172 
173  if (y > 0.0)
174  return y;
175  else
176  return 0.0;
177  }
178 
179 
180  /**
181  * Get distance traveled by muon.
182  *
183  * \param E0 Energy of muon at start [GeV]
184  * \param E1 Energy of muon at end [GeV]
185  * \return distance traveled [m]
186  */
187  virtual double getX(const double E0,
188  const double E1) const override
189  {
190  return -log((a + b*E1) / (a+b*E0)) / b;
191  }
192 
193  protected:
194  const double a;
195  const double b;
196  };
197 
198 
199  /**
200  * Function object for energy dependent energy loss of the muon.
201  *
202  * Approximate values of energy loss parameters taken from reference:
203  * Proceedings of ICRC 2001, "Precise parametrizations of muon energy losses in water",
204  * S. Klimushin, E. Bugaev and I. Sokalski.
205  */
206  class JGeaneWater :
207  public JGeane,
208  protected std::map<double, JGeane_t>
209  {
210  public:
211  /**
212  * Default constructor.
213  */
215  {
216  using namespace std;
217 
218  this->insert(make_pair( 0.0e0, JGeane_t( 2.30e-1 * DENSITY_SEA_WATER, 15.50e-4 * DENSITY_SEA_WATER)));
219  this->insert(make_pair(30.0e0, JGeane_t( 2.67e-1 * DENSITY_SEA_WATER, 3.40e-4 * DENSITY_SEA_WATER)));
220  this->insert(make_pair(35.3e3, JGeane_t(-6.50e-1 * DENSITY_SEA_WATER, 3.66e-4 * DENSITY_SEA_WATER)));
221  }
222 
223 
224  /**
225  * Get energy loss constant.
226  *
227  * N.B. The return value corresponds to the low-energy regime.
228  *
229  * \return Energy loss due to ionisation [GeV/m]
230  */
231  virtual double getA() const override
232  {
233  return 2.30e-1 * DENSITY_SEA_WATER; //This is the value for low energy (<30 GeV), the value used for step(ds) and getRange())
234  }
235 
236 
237  /**
238  * Get energy loss constant.
239  *
240  * N.B. The return value corresponds to the medium-energy regime.
241  *
242  * \return Energy loss due to pair production and bremsstrahlung [m^-1]
243  */
244  virtual double getB() const override
245  {
246  return 3.40e-4 * DENSITY_SEA_WATER;
247  }
248 
249 
250  /**
251  * Get energy of muon after specified distance.
252  *
253  * \param E Energy of muon [GeV]
254  * \param dx distance traveled [m]
255  * \return Energy of muon [GeV]
256  */
257  virtual double getE(const double E, const double dx) const override
258  {
259  double E1 = E;
260  double x1 = dx;
261 
262  if (E1 > MASS_MUON / getSinThetaC()) {
263 
264  const_iterator p = this->lower_bound(E1);
265 
266  do {
267 
268  --p;
269 
270  const double x2 = p->second.getX(E1, p->first);
271 
272  if (x2 > x1) {
273  return p->second.getE(E1, x1);
274  }
275 
276  E1 = p->first;
277  x1 -= x2;
278 
279  } while (p != this->begin());
280  }
281 
282  return E1;
283  }
284 
285 
286 
287 
288  /**
289  * Get energy loss due to ionisation.
290  *
291  * \param E initial energy [GeV]
292  * \param dx distance traveled [m]
293  * \return energy loss due to ionisation [GeV]
294  */
295  double getEa(const double E, const double dx) const
296  {
297  using namespace std;
298  using namespace JPP;
299 
300  double Ea = 0.0;
301 
302  double E1 = E;
303  double x1 = dx;
304 
305  if (E1 > MASS_MUON / getSinThetaC()) {
306 
307  map<double, JGeane_t>::const_iterator p = this->lower_bound(E1);
308 
309  do {
310 
311  --p;
312 
313  const double x2 = p->second.getX(E1, p->first);
314 
315  Ea += (x2 > x1 ? x1 : x2) * p->second.getA();
316  E1 = p->first;
317 
318  x1 -= x2;
319 
320  } while (p != this->cbegin() && x1 > 0.0);
321  }
322 
323  return Ea;
324  }
325 
326 
327  /**
328  * Get energy loss due to pair production and bremsstrahlung.
329  *
330  * \param E initial energy [GeV]
331  * \param dx distance traveled [m]
332  * \return energy loss due to pair production and bremsstrahlung [GeV]
333  */
334  double getEb(const double E, const double dx) const
335  {
336  const double dE = E - getE(E, dx);
337 
338  return dE - getEa(E, dx);
339  }
340 
341 
342  /**
343  * Get distance traveled by muon.
344  *
345  * \param E0 Energy of muon at start [GeV]
346  * \param E1 Energy of muon at end [GeV]
347  * \return distance traveled [m]
348  */
349  virtual double getX(const double E0,
350  const double E1) const override
351  {
352  double E = E0;
353  double dx = 0.0;
354 
355  if (E > MASS_MUON / getSinThetaC()) {
356 
357  const_iterator p = this->lower_bound(E);
358 
359  do {
360 
361  --p;
362 
363  if (E1 > p->first) {
364  return dx + p->second.getX(E, E1);
365  }
366 
367  dx += p->second.getX(E, p->first);
368  E = p->first;
369 
370  } while (p != this->begin());
371  }
372 
373  return dx;
374  }
375  };
376 
377 
378  /**
379  * Function object for energy loss of muon in sea water.
380  */
381  static const JGeaneWater gWater;
382 
383 
384  /**
385  * Function object for energy loss of muon in rock.
386  */
387  static const JGeane_t gRock(2.67e-1 * 0.9 * DENSITY_ROCK,
388  3.40e-4 * 1.2 * DENSITY_ROCK);
389 
390 }
391 
392 #endif
virtual double getB() const override
Get energy loss constant.
Definition: JGeane.hh:156
then usage $script< input file >[option[primary[working directory]]] nWhere option can be E
Definition: JMuonPostfit.sh:40
virtual double getX(const double E0, const double E1) const override
Get distance traveled by muon.
Definition: JGeane.hh:187
double geanc()
Equivalent muon track length per unit shower energy.
Definition: JGeane.hh:28
then set_variable DIR else fatal Wrong number of arguments fi for INPUT_FILE in ls rt $DIR stage * log
virtual double getE(const double E, const double dx) const =0
Get energy of muon after specified distance.
double getEa(const double E, const double dx) const
Get energy loss due to ionisation.
Definition: JGeane.hh:295
Function object for the energy loss of the muon.
Definition: JGeane.hh:124
double operator()() const
Equivalent unit track length per unit shower energy and per unit track length.
Definition: JGeane.hh:108
static const double MASS_MUON
muon mass [GeV]
static const JGeane_t gRock(2.67e-1 *0.9 *DENSITY_ROCK, 3.40e-4 *1.2 *DENSITY_ROCK)
Function object for energy loss of muon in rock.
static const JGeaneWater gWater
Function object for energy loss of muon in sea water.
Definition: JGeane.hh:381
virtual double getX(const double E0, const double E1) const override
Get distance traveled by muon.
Definition: JGeane.hh:349
static const double DENSITY_SEA_WATER
Fixed environment values.
double getEb(const double E, const double dx) const
Get energy loss due to pair production and bremsstrahlung.
Definition: JGeane.hh:334
const double b
Definition: JGeane.hh:195
virtual double getX(const double E0, const double E1) const =0
Get distance traveled by muon.
virtual double getE(const double E, const double dx) const override
Get energy of muon after specified distance.
Definition: JGeane.hh:169
const double a
Definition: JGeane.hh:194
Physics constants.
virtual double getB() const =0
Get energy loss constant.
virtual double getA() const =0
Get energy loss constant.
Interface for muon energy loss.
Definition: JGeane.hh:39
virtual double getB() const override
Get energy loss constant.
Definition: JGeane.hh:244
JGeane_t(const double __a, const double __b)
constructor
Definition: JGeane.hh:133
virtual double getE(const double E, const double dx) const override
Get energy of muon after specified distance.
Definition: JGeane.hh:257
double operator()(const double E) const
Range of muon.
Definition: JGeane.hh:97
Function object for energy dependent energy loss of the muon.
Definition: JGeane.hh:206
static const double DENSITY_ROCK
Density of rock [g/cm^3].
double operator()(const double E, const double dx) const
Energy of muon after specified distance.
Definition: JGeane.hh:85
JGeaneWater()
Default constructor.
Definition: JGeane.hh:214
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable STRING $argv[2] set_array QUANTILES set_variable FORMULA *[0] exp(-0.5 *(x-[1])*(x-[1])/([2]*[2]))" set_variable MODULE `getModule -a $DETECTOR -L "$STRING 0"` source JAcousticsToolkit.sh typeset -A TRIPODS get_tripods $WORKDIR/tripod.txt TRIPODS XMEAN
double getSinThetaC()
Get average sine of Cherenkov angle of water corresponding to group velocity.
virtual double getA() const override
Get energy loss constant.
Definition: JGeane.hh:145
virtual double getA() const override
Get energy loss constant.
Definition: JGeane.hh:231