CorsikaUtilities.cc
Go to the documentation of this file.
1 #include <io/CorsikaUtilities.h>
2 #include <io/CorsikaIOException.h>
3 
4 #include <utl/Particle.h>
5 #include <utl/Math.h>
6 #include <utl/AugerUnits.h>
7 #include <utl/ErrorLogger.h>
8 
9 #include <map>
10 #include <utility>
11 #include <sstream>
12 
13 using utl::Particle;
14 using std::ostringstream;
15 using std::map;
16 
17 
18 namespace {
19 
20  map<int, int> gCorsikaToPDGMap;
21 
22 
23  void
24  InsertCorsikaToPDG(const int corsikaCode, const int pdgCode)
25  {
26  const auto ite = gCorsikaToPDGMap.insert(std::make_pair(corsikaCode, pdgCode));
27  if (!ite.second) {
28  ostringstream err;
29  err << "Particle with Corsika code " << corsikaCode << " already inserted.";
30  ERROR(err);
31  throw io::CorsikaIOException(err.str());
32  }
33  }
34 
35 
36  void
37  InitCorsikaToPDGMap()
38  {
39  InsertCorsikaToPDG(1, Particle::ePhoton);
40  InsertCorsikaToPDG(2, Particle::ePositron);
41  InsertCorsikaToPDG(3, Particle::eElectron);
42  // 4, none
43  InsertCorsikaToPDG(5, Particle::eAntiMuon);
44  InsertCorsikaToPDG(6, Particle::eMuon);
45  InsertCorsikaToPDG(7, Particle::ePiZero);
46  InsertCorsikaToPDG(8, Particle::ePiPlus);
47  InsertCorsikaToPDG(9, Particle::ePiMinus);
48 
49  InsertCorsikaToPDG(10, Particle::eKaon0L);
50  InsertCorsikaToPDG(11, Particle::eKaonPlus);
51  InsertCorsikaToPDG(12, Particle::eKaonMinus);
52  InsertCorsikaToPDG(13, Particle::eNeutron);
53  InsertCorsikaToPDG(14, Particle::eProton);
54  InsertCorsikaToPDG(15, Particle::eAntiProton);
55  InsertCorsikaToPDG(16, Particle::eKaon0S);
56  InsertCorsikaToPDG(17, Particle::eEta);
57  InsertCorsikaToPDG(18, Particle::eLambda);
58  InsertCorsikaToPDG(19, Particle::eSigmaPlus);
59  InsertCorsikaToPDG(20, Particle::eSigmaZero);
60  InsertCorsikaToPDG(21, Particle::eSigmaMinus);
61  InsertCorsikaToPDG(22, Particle::eXiZero);
62  InsertCorsikaToPDG(23, Particle::eXiMinus);
63  InsertCorsikaToPDG(24, Particle::eOmegaMinus);
64  InsertCorsikaToPDG(25, Particle::eAntiNeutron);
65  InsertCorsikaToPDG(26, Particle::eAntiLambda);
66  InsertCorsikaToPDG(27, Particle::eAntiSigmaPlus);
67  InsertCorsikaToPDG(28, Particle::eAntiSigmaZero);
68  InsertCorsikaToPDG(29, Particle::eAntiSigmaMinus);
69  InsertCorsikaToPDG(30, Particle::eAntiXiZero);
70  InsertCorsikaToPDG(31, Particle::eAntiXiMinus);
71  InsertCorsikaToPDG(32, Particle::eAntiOmegaMinus);
72 
73  InsertCorsikaToPDG(49, Particle::ePhi);
74 
75  InsertCorsikaToPDG(50, Particle::eOmegaMeson);
76  InsertCorsikaToPDG(51, Particle::eRhoZero);
77  InsertCorsikaToPDG(52, Particle::eRhoPlus);
78  InsertCorsikaToPDG(53, Particle::eRhoMinus);
79  InsertCorsikaToPDG(54, Particle::eDeltaPlusPlus);
80  InsertCorsikaToPDG(55, Particle::eDeltaPlus);
81  InsertCorsikaToPDG(56, Particle::eDeltaZero);
82  InsertCorsikaToPDG(57, Particle::eDeltaMinus);
83  InsertCorsikaToPDG(58, Particle::eAntiDeltaMinusMinus);
84  InsertCorsikaToPDG(59, Particle::eAntiDeltaMinus);
85  InsertCorsikaToPDG(60, Particle::eAntiDeltaZero);
86  InsertCorsikaToPDG(61, Particle::eAntiDeltaPlus);
87  InsertCorsikaToPDG(62, Particle::eKaonStarZero);
88  InsertCorsikaToPDG(63, Particle::eKaonStarPlus);
89  InsertCorsikaToPDG(64, Particle::eAntiKaonStarMinus);
90  InsertCorsikaToPDG(65, Particle::eAntiKaonStarZero);
91  InsertCorsikaToPDG(66, Particle::eNuElectron);
92  InsertCorsikaToPDG(67, Particle::eAntiNuElectron);
93  InsertCorsikaToPDG(68, Particle::eNuMuon);
94  InsertCorsikaToPDG(69, Particle::eAntiNuMuon);
95  // 70, none
96  InsertCorsikaToPDG(71, Particle::eEta);
97  InsertCorsikaToPDG(72, Particle::eEta);
98  InsertCorsikaToPDG(73, Particle::eEta);
99  InsertCorsikaToPDG(74, Particle::eEta);
100 
101  InsertCorsikaToPDG(95, Particle::eDecayedAntiMuon);
102  InsertCorsikaToPDG(96, Particle::eDecayedMuon);
103  }
104 
105 }
106 
107 
108 int
109 io::Corsika::CorsikaToPDG(const int corsikaCode)
110 {
111  if (corsikaCode < 100) {
112 
113  if (gCorsikaToPDGMap.empty())
114  InitCorsikaToPDGMap();
115 
116  const auto index = gCorsikaToPDGMap.find(corsikaCode);
117 
118  return (index != gCorsikaToPDGMap.end()) ? index->second : Particle::eUndefined;
119 
120  } else if (corsikaCode < 9900) { // nucleus
121 
122  const unsigned int z = corsikaCode % 100;
123  const unsigned int a = corsikaCode / 100;
124  return Particle::NucleusCode(z, a);
125 
126  } else // Cherenkov
127  return Particle::eUndefined;
128 }
129 
130 
150 double
151 io::Corsika::CorsikaAzimuthToAuger(const double corsikaAzimuth,
152  const double magneticFieldDeclination)
153 {
154  using utl::deg;
156 
157  // const double magneticFieldDeclination = 4.233*deg; // EAST
158  // EAST angles are unlogical in auger, use WEST=-EAST
159 
160  //#warning Uses const. declination of mag. field in conversion of Corsika coord
161  return NormalizeAngleMinusPiPi(corsikaAzimuth + 90*deg + magneticFieldDeclination);
162 }
double NormalizeAngleMinusPiPi(const double x)
Normalize angle to lie between -pi and pi (-180 and 180 deg)
Describes a particle for Simulation.
Definition: Particle.h:26
constexpr double deg
Definition: AugerUnits.h:140
Base for exceptions in the CORSIKA reader.
double CorsikaAzimuthToAuger(const double corsikaAzimuth, const double magneticFieldDeclination)
Returns the azimuth rotated from Corisika&#39;s system to Auger standard.
int CorsikaToPDG(const int corsikaCode)
converters from CORSIKA to PDG particle codes
#define ERROR(message)
Macro for logging error messages.
Definition: ErrorLogger.h:165

, generated on Tue Sep 26 2023.