Jpp  master_rocky-43-ge265d140c
the software that should make you happy
Functions
JDeltaRays.cc File Reference

Program to determine the energy loss due to visible delta-rays. More...

#include <string>
#include <iostream>
#include <iomanip>
#include "TROOT.h"
#include "TFile.h"
#include "TH1D.h"
#include "TF1.h"
#include "TFitResult.h"
#include "JROOT/JMinimizer.hh"
#include "JPhysics/JConstants.hh"
#include "JPhysics/JPDFToolkit.hh"
#include "JAAnet/JAAnetToolkit.hh"
#include "JTools/JRange.hh"
#include "Jeep/JPrint.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Program to determine the energy loss due to visible delta-rays.


Energy loss due to delta-rays and maximal kinetic energy (Tmax) are taken from reference https://pdg.lbl.gov/2020/reviews/rpp2020-rev-passage-particles-matter.pdf

Author
mdejong, bjung

Definition in file JDeltaRays.cc.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 194 of file JDeltaRays.cc.

195 {
196  using namespace std;
197  using namespace JPP;
198 
199  typedef JRange<double> JRange_t;
200 
201  string outputFile;
202  JRange_t T_GeV;
203  int numberOfPoints;
204  bool use_numerical;
205  string lepton;
206  double A;
207  double Z;
208  string option;
209  double precision;
210  int debug;
211 
212  try {
213 
214  JParser<> zap("Program to determine the energy loss due to visible delta-rays.");
215 
216  zap['o'] = make_field(outputFile) = "delta-rays.root";
217  zap['n'] = make_field(numberOfPoints, "points for integration") = 1000000;
218  zap['N'] = make_field(use_numerical, "perform numeric integration");
219  zap['T'] = make_field(T_GeV, "kinetic energy range of electron [GeV]") = JRange_t();
220  zap['L'] = make_field(lepton) = muon, tau, positron, electron;
221  zap['A'] = make_field(A, "atomic mass") = 18.0;
222  zap['Z'] = make_field(Z, "atomic number") = 10.0;
223  zap['O'] = make_field(option) = "";
224  zap['e'] = make_field(precision) = 1.0e-6;
225  zap['d'] = make_field(debug) = 1;
226 
227  zap(argc, argv);
228  }
229  catch(const exception &error) {
230  FATAL(error.what() << endl);
231  }
232 
233  if (option.find('R') == string::npos) { option += 'R'; }
234  if (option.find('S') == string::npos) { option += 'S'; }
235  if (option.find('Q') == string::npos && debug < JEEP::debug_t) { option += 'Q'; }
236 
237  double MASS_LEPTON;
238 
239  if (lepton == muon)
240  MASS_LEPTON = MASS_MUON;
241  else if (lepton == tau)
242  MASS_LEPTON = MASS_TAU;
243  else if (lepton == positron)
244  MASS_LEPTON = MASS_ELECTRON;
245  else if (lepton == electron)
246  MASS_LEPTON = MASS_ELECTRON;
247  else
248  FATAL("Invalid lepton " << lepton << endl);
249 
250  const double Tmin = (T_GeV.is_valid() ?
252 
253  TFile out(outputFile.c_str(), "recreate");
254 
255  const double error = 1.0e-12;
256 
257  const double xmin = log10(MASS_LEPTON);
258  const double xmax = 9.25;
259 
260  TH1D h0("h0", NULL, 320, xmin, xmax);
261  TH1D h1("h1", NULL, 320, xmin, xmax);
262 
263  for (int i = 1; i <= h0.GetNbinsX(); ++i) {
264 
265  const double x = h0.GetBinCenter(i);
266  const double E = pow(10.0,x); // particle energy [GeV]
267 
268  double Tmax = (lepton != electron ?
269  getDeltaRayTmax (E, MASS_LEPTON) :
270  0.5 * getKineticEnergy(E, MASS_ELECTRON));
271 
272  if (T_GeV.is_valid()) { Tmax = T_GeV.constrain(Tmax); }
273 
274  double dEdx = 0.0;
275  double dNdx = 0.0;
276 
277  if (use_numerical) {
278 
279  const double gamma = E / MASS_LEPTON;
280  const double beta = sqrt((1.0 + 1.0/gamma) * (1 - 1.0/gamma));
281 
282  const JFormFactor F(0.5/(E*E), -beta*beta/Tmax, 1.0);
283 
284  dEdx = getDeltaRays(E, MASS_LEPTON, Tmin, Tmax, Z, A, F, numberOfPoints) / DENSITY_SEA_WATER * 1e1; // [MeV g^-1 cm^2]
285  dNdx = getCount (E, MASS_LEPTON, Tmin, Tmax, Z, A, F, numberOfPoints) / DENSITY_SEA_WATER * 1e-2; // [g^-1 cm^2]
286 
287  } else {
288 
289  dEdx = getDeltaRays(E, MASS_LEPTON, Tmin, Tmax, Z, A) / DENSITY_SEA_WATER * 1e1; // [MeV g^-1 cm^2]
290  dNdx = getCount (E, MASS_LEPTON, Tmin, Tmax, Z, A) / DENSITY_SEA_WATER * 1e-2; // [g^-1 cm^2]
291  }
292 
293  DEBUG("E [GeV] " << SCIENTIFIC(8,2) << E << endl);
294  DEBUG("Tmin [GeV] " << SCIENTIFIC(8,2) << Tmin << endl);
295  DEBUG("Tmax [GeV] " << SCIENTIFIC(8,2) << Tmax << endl);
296  DEBUG("dE/dx [MeV g^-1 cm^2] " << FIXED(5,4) << dEdx << endl);
297  DEBUG("dE/dx [g^-1 cm^2] " << FIXED(5,2) << dNdx << endl);
298 
299  h0.SetBinContent(i, dEdx);
300  h0.SetBinError (i, error);
301  h1.SetBinContent(i, dNdx);
302  }
303 
304  if (use_numerical) {
305 
306  TF1 f1("f1", "[0] + [1]*x + [2]*x*x + [3]*x*x*x");
307 
308  if (option.find('W') == string::npos) {
309  option += "W";
310  }
311 
312  f1.SetParameter(0, h0.GetMinimum());
313  f1.SetParameter(1, (h0.GetMaximum() - h0.GetMinimum()) / (h0.GetXaxis()->GetXmax() - h0.GetXaxis()->GetXmin()));
314  f1.SetParameter(2, 0.0);
315  f1.SetParameter(3, 0.0);
316 
317  f1.SetLineColor(kRed);
318 
319  // fit
320 
321  const TFitResultPtr result = h0.Fit(&f1, option.c_str(), "same", xmin, xmax);
322 
323  cout << "chi2/NDF " << result->Chi2() << '/' << result->Ndf() << endl;
324 
325  cout << "\t// " << lepton << endl;
326  cout << "\t// dE/dX = a + bx + cx^2 + dx^3; // [MeV g^-1 cm^2]; x = log10(E/GeV);" << endl;
327 
328  for (int i = 0; i != 4; ++i) {
329  cout << "\tstatic const double " << (char) ('a' + i) << " = " << SCIENTIFIC(10,3) << f1.GetParameter(i) << ";" << endl;
330  }
331 
332  double Emin = 1 * MASS_LEPTON;
333  double Emax = 5 * MASS_LEPTON;
334 
335  for (double E = 0.5 * (Emin + Emax); ; E = 0.5 * (Emin + Emax)) {
336 
337  const double Tmax = getDeltaRayTmax(E, MASS_LEPTON);
338 
339  if (fabs(Tmax - Tmin) < precision) {
340  cout << "\tstatic const double Emin = " << FIXED(7,5) << E << "; // [GeV]" << endl;
341  break;
342  }
343 
344  if (Tmax > Tmin)
345  Emax = E;
346  else
347  Emin = E;
348  }
349  }
350 
351  out.Write();
352  out.Close();
353 }
string outputFile
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
#define FATAL(A)
Definition: JMessage.hh:67
int debug
debug level
Definition: JSirene.cc:69
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:2142
int numberOfPoints
Definition: JResultPDF.cc:22
Utility class to parse command line options.
Definition: JParser.hh:1698
bool is_valid() const
Check validity of range.
Definition: JRange.hh:311
T constrain(argument_type x) const
Constrain value to range.
Definition: JRange.hh:350
const JPolynome f1(1.0, 2.0, 3.0)
Function.
const double xmax
Definition: JQuadrature.cc:24
const double xmin
Definition: JQuadrature.cc:23
double getKineticEnergy(const Trk &trk)
Get track kinetic energy.
@ debug_t
debug
Definition: JMessage.hh:29
size_t getCount(const array_type< T > &buffer, const JCompare_t &compare)
Count number of unique values.
Definition: JVectorize.hh:261
T pow(const T &x, const double y)
Power .
Definition: JMath.hh:97
double getDeltaRayTmin()
Get minimum delta-ray kinetic energy.
Definition: JPDFToolkit.hh:73
static const double DENSITY_SEA_WATER
Fixed environment values.
static const double MASS_MUON
muon mass [GeV]
static const double MASS_ELECTRON
electron mass [GeV]
double getDeltaRayTmax(const double E, const double M)
Get maximum delta-ray kinetic energy for given lepton energy and mass.
Definition: JPDFToolkit.hh:93
static const double MASS_TAU
tau mass [GeV]
double getDeltaRays(const double E, const double M, const double Tmin, const double Tmax, const double Z, const double A)
Get equivalent EM-shower energy due to delta-rays per unit track length for an ionising particle with...
Definition: JPDFToolkit.hh:124
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
Type definition of range.
Definition: JHead.hh:43
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:488