Project
Loading...
Searching...
No Matches
O2DatabasePDG.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12//
13// Created by Sandro Wenzel on 11.08.22.
14//
15
16#ifndef O2_O2DATABASEPDG_H
17#define O2_O2DATABASEPDG_H
18
19#include <cmath>
20#include <string>
21#include "TDatabasePDG.h"
22#include "TParticlePDG.h"
24
25namespace o2
26{
27
28// An ALICE specific extension of ROOT's TDatabasePDG
29//
30// By using O2DatabasePDG::Instance() in our code instead of TDatabasePDG::Instance(), correct initialization
31// is guaranteed. Alternatively, a static function is exposed with which particles can be added to TDatabasePDG objects
32// directly.
34{
35 //
36 public:
38 {
39 // adds the ALICE particles to TDatabasePDG on first use.
40 // Initialisation is done through a local static database to make the Instance() function thread-safe
41 static TDatabasePDG* db = [] {
42 auto db = TDatabasePDG::Instance();
44 return db;
45 }();
46 return db;
47 }
48
49 // adds ALICE particles to a given TDatabasePDG instance
50 // monopoleMass is the mass of all monopole species in GeV; it has to match
51 // G4Params.monopoleMass or the generator and the transport will disagree
52 // To fix: all quantities in the MCTrack dependent from GetMass() will get the default 100 GeV.
53 // A possible fix would be to stop deriving the masses from the compiled-in table,
54 // or a better solution should be found in the future
55 static void addALICEParticles(TDatabasePDG* db = TDatabasePDG::Instance(),
56 double monopoleMass = getMonopoleMass());
58
59 // mass of all monopole species in GeV used when they get registered; since TDatabasePDG
60 // keeps the first registration of a PDG code, it has to be set before the first
61 // Instance() or addALICEParticles() call, which hasMonopoleMass() can verify
62 static double getMonopoleMass() { return sMonopoleMass; }
63 static void setMonopoleMass(double monopoleMass) { sMonopoleMass = monopoleMass; }
64
65 // true if all monopole species are registered with the given mass in GeV; TDatabasePDG
66 // keeps the first registration, so an earlier call with another mass makes this false
67 static bool hasMonopoleMass(TDatabasePDG* db, double monopoleMass)
68 {
70 const auto* particle = db->GetParticle(pdg);
71 if (particle == nullptr || std::abs(particle->Mass() - monopoleMass) > 1.e-6 * monopoleMass) {
72 return false;
73 }
74 }
75 return true;
76 }
77
78 // get particle's (if any) mass
79 static Double_t MassImpl(TParticlePDG* particle, bool& success)
80 {
81 success = false;
82 if (!particle) {
83 return -1.;
84 }
85 success = true;
86 return particle->Mass();
87 }
88
89 // determine particle to get mass for based on PDG
90 static Double_t Mass(int pdg, bool& success, TDatabasePDG* db = O2DatabasePDG::Instance())
91 {
92 if (pdg < IONBASELOW || pdg > IONBASEHIGH) {
93 // not an ion, return immediately
94 return MassImpl(db->GetParticle(pdg), success);
95 }
96 if (auto particle = db->GetParticle(pdg)) {
97 // see if this ion can be found
98 return MassImpl(particle, success);
99 }
100 // if we are here, try one last time to look for ground state of potential isomere state
101 pdg = pdg / 10 * 10;
102 return MassImpl(db->GetParticle(pdg), success);
103 }
104
105 // remove default constructor
106 O2DatabasePDG() = delete;
107
108 private:
109 inline static double sMonopoleMass = o2::sim::MonopoleMassDefaultGeV;
110 static constexpr int IONBASELOW{1000000000};
111 static constexpr int IONBASEHIGH{1099999999};
112};
113
114// by keeping this inline, we can use it in other parts of the code, for instance Framework or Analysis,
115// without needing to link against this library
116inline void O2DatabasePDG::addALICEParticles(TDatabasePDG* db, double monopoleMass)
117{
118 //
119 // Add ALICE particles to the ROOT PDG data base
120 // Code has been taken from AliRoot
121 const Int_t kspe = 50000000;
122
123 // PDG nuclear states are 10-digit numbers
124 // 10LZZZAAAI e.g. deuteron is
125 // 1000010020
126 const Int_t kion = 1000000000;
127
128 /*
129 const Double_t kAu2Gev=0.9314943228;
130*/
131
132 const Double_t khSlash = 1.0545726663e-27;
133 const Double_t kErg2Gev = 1 / 1.6021773349e-3;
134 const Double_t khShGev = khSlash * kErg2Gev;
135 const Double_t kYear2Sec = 3600 * 24 * 365.25;
136
137 // Heavy-flavour particles
138
139 // χc1(3872) aka X(3872), taken from PDG 2022 (https://pdg.lbl.gov/2022/listings/rpp2022-list-chi-c1-3872.pdf)
140 db->AddParticle("Chi_c1(3872)", "Chi_c1(3872)", 3.87165, kFALSE, 0, 0, "CCBarMeson", 9920443);
141
142 //
143 // Bottom mesons
144 // mass and life-time from PDG
145 //
146 db->AddParticle("Upsilon(3S)", "Upsilon(3S)", 10.3552, kTRUE,
147 0, 0, "Bottonium", 200553);
148
149 // QCD diffractive states
150 db->AddParticle("rho_diff0", "rho_diff0", 0, kTRUE,
151 0, 0, "QCD diffr. state", 9900110);
152 db->AddParticle("pi_diffr+", "pi_diffr+", 0, kTRUE,
153 0, 3, "QCD diffr. state", 9900210);
154 db->AddParticle("omega_di", "omega_di", 0, kTRUE,
155 0, 0, "QCD diffr. state", 9900220);
156 db->AddParticle("phi_diff", "phi_diff", 0, kTRUE,
157 0, 0, "QCD diffr. state", 9900330);
158 db->AddParticle("J/psi_di", "J/psi_di", 0, kTRUE,
159 0, 0, "QCD diffr. state", 9900440);
160 db->AddParticle("n_diffr0", "n_diffr0", 0, kTRUE,
161 0, 0, "QCD diffr. state", 9902110);
162 db->AddParticle("p_diffr+", "p_diffr+", 0, kTRUE,
163 0, 3, "QCD diffr. state", 9902210);
164
165 // From Herwig
166 db->AddParticle("PSID ", " ", 3.7699, kFALSE, 0.0, 0, "meson", 30443);
167
168 db->AddParticle("A_00 ", " ", 0.9960, kFALSE, 0.0, 0, "meson", 9000111);
169 db->AddParticle("A_0+ ", " ", 0.9960, kFALSE, 0.0, +3, "meson", 9000211);
170 db->AddParticle("A_0- ", " ", 0.9960, kFALSE, 0.0, -3, "meson", -9000211);
171
172 //db->AddParticle("F0P0 ", " ", 0.9960, kFALSE, 0.0, 0, "meson", 9010221);
173
174 db->AddParticle("KDL_2+ ", " ", 1.773, kFALSE, 0.0, +3, "meson", 10325);
175 db->AddParticle("KDL_2- ", " ", 1.773, kFALSE, 0.0, -3, "meson", -10325);
176
177 db->AddParticle("KDL_20 ", " ", 1.773, kFALSE, 0.0, 0, "meson", 10315);
178 db->AddParticle("KDL_2BR0", " ", 1.773, kFALSE, 0.0, 0, "meson", -10315);
179
180 db->AddParticle("PI_2+ ", " ", 1.670, kFALSE, 0.0, +3, "meson", 10215);
181 db->AddParticle("PI_2- ", " ", 1.670, kFALSE, 0.0, -3, "meson", -10215);
182 db->AddParticle("PI_20 ", " ", 1.670, kFALSE, 0.0, 0, "meson", 10115);
183
184 db->AddParticle("KD*+ ", " ", 1.717, kFALSE, 0.0, +3, "meson", 30323);
185 db->AddParticle("KD*- ", " ", 1.717, kFALSE, 0.0, -3, "meson", -30323);
186
187 db->AddParticle("KD*0 ", " ", 1.717, kFALSE, 0.0, 0, "meson", 30313);
188 db->AddParticle("KDBR*0 ", " ", 1.717, kFALSE, 0.0, 0, "meson", -30313);
189
190 db->AddParticle("RHOD+ ", " ", 1.700, kFALSE, 0.0, +3, "meson", 30213);
191 db->AddParticle("RHOD- ", " ", 1.700, kFALSE, 0.0, -3, "meson", -30213);
192 db->AddParticle("RHOD0 ", " ", 1.700, kFALSE, 0.0, 0, "meson", 30113);
193
194 db->AddParticle("ETA_2(L)", " ", 1.632, kFALSE, 0.0, 0, "meson", 10225);
195 db->AddParticle("ETA_2(H)", " ", 1.854, kFALSE, 0.0, 0, "meson", 10335);
196 db->AddParticle("OMEGA(H)", " ", 1.649, kFALSE, 0.0, 0, "meson", 30223);
197
198 db->AddParticle("KDH_2+ ", " ", 1.816, kFALSE, 0.0, +3, "meson", 20325);
199 db->AddParticle("KDH_2- ", " ", 1.816, kFALSE, 0.0, -3, "meson", -20325);
200
201 db->AddParticle("KDH_20 ", " ", 1.816, kFALSE, 0.0, 0, "meson", 20315);
202 db->AddParticle("KDH_2BR0", " ", 1.816, kFALSE, 0.0, 0, "meson", -20315);
203
204 db->AddParticle("KD_3+ ", " ", 1.773, kFALSE, 0.0, +3, "meson", 327);
205 db->AddParticle("KD_3- ", " ", 1.773, kFALSE, 0.0, -3, "meson", -327);
206
207 db->AddParticle("KD_30 ", " ", 1.773, kFALSE, 0.0, 0, "meson", 317);
208 db->AddParticle("KD_3BR0 ", " ", 1.773, kFALSE, 0.0, 0, "meson", -317);
209
210 db->AddParticle("RHO_3+ ", " ", 1.691, kFALSE, 0.0, +3, "meson", 217);
211 db->AddParticle("RHO_3- ", " ", 1.691, kFALSE, 0.0, -3, "meson", -217);
212 db->AddParticle("RHO_30 ", " ", 1.691, kFALSE, 0.0, 0, "meson", 117);
213 db->AddParticle("OMEGA_3 ", " ", 1.667, kFALSE, 0.0, 0, "meson", 227);
214 db->AddParticle("PHI_3 ", " ", 1.854, kFALSE, 0.0, 0, "meson", 337);
215
216 db->AddParticle("CHI2P_B0", " ", 10.232, kFALSE, 0.0, 0, "meson", 110551);
217 db->AddParticle("CHI2P_B1", " ", 10.255, kFALSE, 0.0, 0, "meson", 120553);
218 db->AddParticle("CHI2P_B2", " ", 10.269, kFALSE, 0.0, 0, "meson", 100555);
219 db->AddParticle("UPSLON4S", " ", 10.580, kFALSE, 0.0, 0, "meson", 300553);
220
221 // BSM targeted inclusions
222 // Monopoles with same electric and magnetic charge
223 db->AddParticle("Monopole_symm", "Monopole_symm", monopoleMass, kTRUE, 0.0, 0, "BSM", 4110000);
224 db->AddParticle("AntiMonopole_symm", "AntiMonopole_symm", monopoleMass, kTRUE, 0.0, 0, "BSM", -4110000);
225 // Monopoles with opposite electric and magnetic charge
226 db->AddParticle("Monopole_asymm", "Monopole_asymm", monopoleMass, kTRUE, 0.0, 0, "BSM", 4120000);
227 db->AddParticle("AntiMonopole_asymm", "AntiMonopole_asymm", monopoleMass, kTRUE, 0.0, 0, "BSM", -4120000);
228
229 // IONS
230 //
231 // Done by default now from Pythia6 table
232 // Needed for other generators
233 // So check if already defined
234
236 Int_t ionCode = kion + 10020;
237 if (!db->GetParticle(ionCode)) {
238 db->AddParticle("Deuteron", "Deuteron", 1.87561294257, kTRUE,
239 0, 3, "Ion", ionCode);
240 }
241 db->AddAntiParticle("AntiDeuteron", -ionCode);
242
243 ionCode = kion + 10030;
244 if (!db->GetParticle(ionCode)) {
245 db->AddParticle("Triton", "Triton", 2.80892113298, kFALSE,
246 khShGev / (12.33 * kYear2Sec), 3, "Ion", ionCode);
247 }
248 db->AddAntiParticle("AntiTriton", -ionCode);
249
250 ionCode = kion + 20030;
251 if (!db->GetParticle(ionCode)) {
252 db->AddParticle("HE3", "HE3", 2.80839160743, kFALSE,
253 0, 6, "Ion", ionCode);
254 }
255 db->AddAntiParticle("AntiHE3", -ionCode);
256
257 ionCode = kion + 20040;
258 if (!db->GetParticle(ionCode)) {
259 db->AddParticle("Alpha", "Alpha", 3.7273794066, kTRUE,
260 khShGev / (12.33 * kYear2Sec), 6, "Ion", ionCode);
261 }
262 db->AddAntiParticle("AntiAlpha", -ionCode);
264
265 // Special particles
266 //
267 db->AddParticle("Cherenkov", "Cherenkov", 0, kFALSE,
268 0, 0, "Special", kspe + 50);
269 db->AddParticle("FeedbackPhoton", "FeedbackPhoton", 0, kFALSE,
270 0, 0, "Special", kspe + 51);
271
272 //Hyper nuclei and exotica
273 ionCode = 1010010030;
274 if (!db->GetParticle(ionCode)) {
275 db->AddParticle("HyperTriton", "HyperTriton", 2.991134, kFALSE,
276 2.5e-15, 3, "Ion", ionCode);
277 }
278
279 ionCode = -1010010030;
280 if (!db->GetParticle(ionCode)) {
281 db->AddParticle("AntiHyperTriton", "AntiHyperTriton", 2.991134, kFALSE,
282 2.5e-15, 3, "Ion", ionCode);
283 }
284
285 //hyper hydrogen 4 ground state
286 ionCode = 1010010040;
287 if (!db->GetParticle(ionCode)) {
288 db->AddParticle("Hyperhydrog4", "Hyperhydrog4", 3.922434, kFALSE,
289 2.5e-15, 3, "Ion", ionCode);
290 }
291 //anti hyper hydrogen 4 ground state
292 ionCode = -1010010040;
293 if (!db->GetParticle(ionCode)) {
294 db->AddParticle("AntiHyperhydrog4", "AntiHyperhydrog4", 3.922434, kFALSE,
295 2.5e-15, 3, "Ion", ionCode);
296 }
297 //hyper helium 4 ground state
298 ionCode = 1010020040;
299 if (!db->GetParticle(ionCode)) {
300 db->AddParticle("Hyperhelium4", "Hyperhelium4", 3.921728, kFALSE,
301 2.5e-15, 6, "Ion", ionCode);
302 }
303 //anti hyper helium 4 ground state
304 ionCode = -1010020040;
305 if (!db->GetParticle(ionCode)) {
306 db->AddParticle("AntiHyperhelium4", "AntiHyperhelium4", 3.921728, kFALSE,
307 2.5e-15, 6, "Ion", ionCode);
308 }
309
310 // Lithium 4 ground state
311 ionCode = 1000030040;
312 if (!db->GetParticle(ionCode)) {
313 db->AddParticle("Lithium4", "Lithium4", 3.7513, kFALSE,
314 0.003, 9, "Ion", ionCode);
315 }
316 // anti Lithium 4 ground state
317 ionCode = -1000030040;
318 if (!db->GetParticle(ionCode)) {
319 db->AddParticle("AntiLithium4", "AntiLithium4", 3.7513, kFALSE,
320 0.003, 9, "Ion", ionCode);
321 }
322
323 ionCode = 1010020050;
324 if (!db->GetParticle(ionCode)) {
325 db->AddParticle("Hyperhelium5", "Hyperhelium5", 4.839961, kFALSE,
326 2.5e-15, 6, "Ion", ionCode);
327 }
328
329 ionCode = -1010020050;
330 if (!db->GetParticle(ionCode)) {
331 db->AddParticle("AntiHyperhelium5", "AntiHyperhelium5", 4.839961, kFALSE,
332 2.5e-15, 6, "Ion", ionCode);
333 }
334
335 ionCode = 1020010040;
336 if (!db->GetParticle(ionCode)) {
337 db->AddParticle("DoubleHyperhydrogen4", "DoubleHyperhydrogen4", 4.106, kFALSE,
338 2.5e-15, 6, "Ion", ionCode);
339 }
340
341 ionCode = -1020010040;
342 if (!db->GetParticle(ionCode)) {
343 db->AddParticle("DoubleAntiHyperhydrogen4", "DoubleAntiHyperhydrogen4", 4.106, kFALSE,
344 2.5e-15, 6, "Ion", ionCode);
345 }
346
347 // 4-Xi-He
348 ionCode = 1120020040;
349 if (!db->GetParticle(ionCode)) {
350 db->AddParticle("4XiHe", "4XiHe", 4.128, kFALSE, 4.04e-15, 3, "Ion", ionCode);
351 db->AddAntiParticle("Anti4XiHe", -ionCode);
352 }
353
354 // 4-Xi-H
355 ionCode = 1120010040;
356 if (!db->GetParticle(ionCode)) {
357 db->AddParticle("4XiH", "4XiH", 4.128, kFALSE, 4.04e-15, 3, "Ion", ionCode);
358 db->AddAntiParticle("Anti4XiH", -ionCode);
359 }
360
361 // hyper helium 4 sigma
362 ionCode = 1110020040;
363 if (!db->GetParticle(ionCode)) {
364 db->AddParticle("Hyperhelium4sigma", "Hyperhelium4sigma", 3.995, kFALSE,
365 2.5e-15, 6, "Ion", ionCode);
366 }
367 // anti-hyper helium 4 sigma
368 ionCode = -1110020040;
369 if (!db->GetParticle(ionCode)) {
370 db->AddParticle("AntiHyperhelium4sigma", "AntiHyperhelium4sigma", 3.995, kFALSE,
371 2.5e-15, 6, "Ion", ionCode);
372 }
373
374 ionCode = 1010000020;
375 if (!db->GetParticle(ionCode)) {
376 db->AddParticle("LambdaNeutron", "LambdaNeutron", 2.054, kFALSE,
377 2.5e-15, 0, "Special", ionCode);
378 }
379
380 ionCode = -1010000020;
381 if (!db->GetParticle(ionCode)) {
382 db->AddParticle("AntiLambdaNeutron", "AntiLambdaNeutron", 2.054, kFALSE,
383 2.5e-15, 0, "Special", ionCode);
384 }
385
386 ionCode = 1020000020;
387 if (!db->GetParticle(ionCode)) {
388 db->AddParticle("Hdibaryon", "Hdibaryon", 2.23, kFALSE,
389 2.5e-15, 0, "Special", ionCode);
390 }
391
392 ionCode = -1020000020;
393 if (!db->GetParticle(ionCode)) {
394 db->AddParticle("AntiHdibaryon", "AntiHdibaryon", 2.23, kFALSE,
395 2.5e-15, 0, "Special", ionCode);
396 }
397
398 ionCode = 1010000030;
399 if (!db->GetParticle(ionCode)) {
400 db->AddParticle("LambdaNeutronNeutron", "LambdaNeutronNeutron", 2.99, kFALSE,
401 2.5e-15, 0, "Special", ionCode);
402 }
403
404 ionCode = -1010000030;
405 if (!db->GetParticle(ionCode)) {
406 db->AddParticle("AntiLambdaNeutronNeutron", "AntiLambdaNeutronNeutron", 2.99, kFALSE,
407 2.5e-15, 0, "Special", ionCode);
408 }
409
410 ionCode = 1020010020;
411 if (!db->GetParticle(ionCode)) {
412 db->AddParticle("Xi0Proton", "Xi0Proton", 2.248, kFALSE,
413 5e-15, 3, "Ion", ionCode);
414 }
415
416 ionCode = -1020010020;
417 if (!db->GetParticle(ionCode)) {
418 db->AddParticle("AntiXi0Proton", "AntiXi0Proton", 2.248, kFALSE,
419 5e-15, 3, "Ion", ionCode);
420 }
421
422 ionCode = 1030000020;
423 if (!db->GetParticle(ionCode)) {
424 db->AddParticle("OmegaProton", "OmegaProton", 2.592, kFALSE,
425 2.5e-15, 0, "Special", ionCode);
426 }
427
428 ionCode = -1030000020;
429 if (!db->GetParticle(ionCode)) {
430 db->AddParticle("AntiOmegaProton", "AntiOmegaProton", 2.592, kFALSE,
431 2.5e-15, 0, "Special", ionCode);
432 }
433
434 ionCode = 1030010020;
435 if (!db->GetParticle(ionCode)) {
436 db->AddParticle("OmegaNeutron", "OmegaNeutron", 2.472, kFALSE,
437 0.003, 3, "Special", ionCode);
438 }
439
440 ionCode = -1030010020;
441 if (!db->GetParticle(ionCode)) {
442 db->AddParticle("AntiOmegaNeutron", "AntiOmegaNeutron", 2.472, kFALSE,
443 0.003, 3, "Special", ionCode);
444 }
445
446 ionCode = 1060020020;
447 if (!db->GetParticle(ionCode)) {
448 db->AddParticle("OmegaOmega", "OmegaOmega", 3.343, kFALSE,
449 8.01e-15, 6, "Special", ionCode);
450 }
451
452 ionCode = -1060020020;
453 if (!db->GetParticle(ionCode)) {
454 db->AddParticle("AntiOmegaOmega", "AntiOmegaOmega", 3.343, kFALSE,
455 8.01e-15, 6, "Special", ionCode);
456 }
457
458 ionCode = 1010010021;
459 if (!db->GetParticle(ionCode)) {
460 db->AddParticle("Lambda1405Proton", "Lambda1405Proton", 2.295, kFALSE,
461 0.05, 3, "Special", ionCode);
462 }
463
464 ionCode = -1010010021;
465 if (!db->GetParticle(ionCode)) {
466 db->AddParticle("AntiLambda1405Proton", "AntiLambda1405Proton", 2.295, kFALSE,
467 0.05, 3, "Special", ionCode);
468 }
469
470 ionCode = 1020000021;
471 if (!db->GetParticle(ionCode)) {
472 db->AddParticle("Lambda1405Lambda1405", "Lambda1405Lambda1405", 2.693, kFALSE,
473 0.05, 0, "Special", ionCode);
474 }
475
476 ionCode = -1020000021;
477 if (!db->GetParticle(ionCode)) {
478 db->AddParticle("AntiLambda1405Lambda1405", "AntiLambda1405Lambda1405", 2.693, kFALSE,
479 0.05, 0, "Special", ionCode);
480 }
481
482 ionCode = 2010010030;
483 if (!db->GetParticle(ionCode)) {
484 db->AddParticle("CTriton", "CTriton", 4.162, kFALSE,
485 3.3e-12, 3, "Ion", ionCode);
486 db->AddAntiParticle("AntiCTriton", -ionCode);
487 }
488
489 ionCode = 2010010020;
490 if (!db->GetParticle(ionCode)) {
491 db->AddParticle("CDeuteron", "CDeuteron", 3.226, kFALSE,
492 3.3e-12, 3, "Ion", ionCode);
493 db->AddAntiParticle("AntiCDeuteron", -ionCode);
494 }
495
496 // Special resonances
497
498 ionCode = 9010221;
499 if (!db->GetParticle(ionCode)) {
500 db->AddParticle("f0_980", "f0_980", 0.980, kFALSE,
501 0.07, 0, "Resonance", ionCode);
502 }
503
504 ionCode = 225;
505 if (!db->GetParticle(ionCode)) {
506 db->AddParticle("f2_1270", "f2_1270", 1.275, kFALSE,
507 0.185, 0, "Resonance", ionCode);
508 }
509
510 // Lambda(1405)0
511 ionCode = 102132;
512 if (!db->GetParticle(ionCode)) {
513 db->AddParticle("Lambda_1405_0", "Lambda_1405_0", 1.405, kFALSE, 0.05, 0, "Resonance", ionCode);
514 }
515 if (!db->GetParticle(-ionCode)) {
516 db->AddParticle("AntiLambda_1405_0", "AntiLambda_1405_0", 1.405, kFALSE, 0.05, 0, "Resonance", -ionCode);
517 }
518
519 // Lambda(1520)0
520 ionCode = 102134;
521 if (!db->GetParticle(ionCode)) {
522 db->AddParticle("Lambda_1520_0", "Lambda_1520_0", 1.5195, kFALSE, 0.0156, 0, "Resonance", ionCode);
523 }
524 if (!db->GetParticle(-ionCode)) {
525 db->AddParticle("AntiLambda_1520_0", "AntiLambda_1520_0", 1.5195, kFALSE, 0.0156, 0, "Resonance", -ionCode);
526 }
527
528 // f1 study
529 ionCode = 20223;
530 if (!db->GetParticle(ionCode)) {
531 db->AddParticle("f1_1285", "f1_1285", 1.28210, kFALSE, 0.02420, 0, "Resonance", ionCode);
532 }
533 ionCode = 20333;
534 if (!db->GetParticle(ionCode)) {
535 db->AddParticle("f1_1420", "f1_1420", 1.42640, kFALSE, 0.05490, 0, "Resonance", ionCode);
536 }
537
538 // glueball hunting
539 ionCode = 225;
540 if (!db->GetParticle(ionCode)) {
541 db->AddParticle("f2_1270", "f2_1270", 1.2754, kFALSE, 0.1858, 0, "Resonance", ionCode);
542 }
543 ionCode = 115;
544 if (!db->GetParticle(ionCode)) {
545 db->AddParticle("a2_1320", "a2_1320", 1.3182, kFALSE, 0.1078, 0, "Resonance", ionCode);
546 }
547 ionCode = 10221;
548 if (!db->GetParticle(ionCode)) {
549 db->AddParticle("f0_1370", "f0_1370", 1.37, kFALSE, 0.200, 0, "Resonance", ionCode);
550 }
551 ionCode = 9030221;
552 if (!db->GetParticle(ionCode)) {
553 db->AddParticle("f0_1500", "f0_1500", 1.500, kFALSE, 0.112, 0, "Resonance", ionCode);
554 }
555 ionCode = 10331;
556 if (!db->GetParticle(ionCode)) {
557 db->AddParticle("f0_1710", "f0_1710", 1.710, kFALSE, 0.139, 0, "Resonance", ionCode);
558 }
559 ionCode = 335;
560 if (!db->GetParticle(ionCode)) {
561 db->AddParticle("f2_1525", "f2_1525", 1.525, kFALSE, 0.073, 0, "Resonance", ionCode);
562 }
563
564 // when using hadronic rescattering in Pythia8
565 ionCode = 9000221;
566 if (!db->GetParticle(ionCode)) {
567 db->AddParticle("f0_500", "f0_500", 0.500, kFALSE, 0.350, 0.0, "Resonance", ionCode);
568 }
569 ionCode = -100313;
570 if (!db->GetParticle(ionCode)) {
571 db->AddParticle("K*(1410)bar0", "K*(1410)bar0", 1.414, kFALSE, 0.232, 0, "Resonance", ionCode);
572 }
573 ionCode = 100313;
574 if (!db->GetParticle(ionCode)) {
575 db->AddParticle("K*(1410)0", "K*(1410)0", 1.414, kFALSE, 0.232, 0, "Resonance", ionCode);
576 }
577 ionCode = 100323;
578 if (!db->GetParticle(ionCode)) {
579 db->AddParticle("K*(1410)+", "K*(1410)+", 1.414, kFALSE, 0.232, +1, "Resonance", ionCode);
580 }
581 ionCode = -100323;
582 if (!db->GetParticle(ionCode)) {
583 db->AddParticle("K*(1410)-", "K*(1410)-", 1.414, kFALSE, 0.232, -1, "Resonance", ionCode);
584 }
585 ionCode = 100211;
586 if (!db->GetParticle(ionCode)) {
587 db->AddParticle("pi(1300)+", "pi(1300)+", 1.165, kFALSE, 0.400, +1, "Resonance", ionCode);
588 }
589 ionCode = -100211;
590 if (!db->GetParticle(ionCode)) {
591 db->AddParticle("pi(1300)-", "pi(1300)-", 1.165, kFALSE, 0.400, -1, "Resonance", ionCode);
592 }
593 ionCode = 202112;
594 if (!db->GetParticle(ionCode)) {
595 db->AddParticle("n(1440)0", "n(1440)0", 1.358, kFALSE, 0.350, 0, "Ion", ionCode);
596 }
597 ionCode = -202212;
598 if (!db->GetParticle(ionCode)) {
599 db->AddParticle("p(1440)bar-", "p(1440)bar-", 1.793, kFALSE, 0.350, -1, "Ion", ionCode);
600 }
601 ionCode = 202212;
602 if (!db->GetParticle(ionCode)) {
603 db->AddParticle("p(1440)+", "p(1440)+", 1.793, kFALSE, 0.350, 1, "Ion", ionCode);
604 }
605
606 // Xi-/+ (1820)
607 ionCode = 123314;
608 if (!db->GetParticle(ionCode)) {
609 db->AddParticle("Xi_Minus_1820", "Xi_Minus_1820", 1.8234, kFALSE, 0.024, -3, "Resonance", ionCode);
610 }
611 if (!db->GetParticle(-ionCode)) {
612 db->AddParticle("Xi_Plus_1820", "Xi_Plus_1820", 1.8234, kFALSE, 0.024, 3, "Resonance", -ionCode);
613 }
614
615 // Xi0 (1820)
616 ionCode = 123324;
617 if (!db->GetParticle(ionCode)) {
618 db->AddParticle("Xi_0_1820", "Xi_0_1820", 1.8234, kFALSE, 0.024, 0, "Resonance", ionCode);
619 }
620 if (!db->GetParticle(-ionCode)) {
621 db->AddParticle("Xi_0_Bar_1820", "Xi_0_Bar_1820", 1.8234, kFALSE, 0.024, 0, "Resonance", -ionCode);
622 }
623
624 // Omega(2012)- -> Xi- K0S (see PDG code convention above for Xi(1820))
625 ionCode = 123334;
626 if (!db->GetParticle(ionCode)) {
627 db->AddParticle("Omega_Minus_2012", "Omega_Minus_2012", 2.0125, kFALSE, 0.0064, -3, "Resonance", ionCode);
628 }
629 db->AddAntiParticle("Omega_Plus_2012", -ionCode);
630
631 // Ps - hidden strange (s-sbar) pentaquarks
632
633 ionCode = 9322134;
634 if (!db->GetParticle(ionCode)) {
635 db->AddParticle("ps_2100", "ps_2100", 2.100, kFALSE,
636 0.040, 3, "Resonance", ionCode);
637 }
638 if (!db->GetParticle(-ionCode)) {
639 db->AddParticle("anti-ps_2100", "anti-ps_2100", 2.100, kFALSE,
640 0.040, -3, "Resonance", -ionCode);
641 }
642
643 ionCode = 9322136;
644 if (!db->GetParticle(ionCode)) {
645 db->AddParticle("ps_2500", "ps_2500", 2.500, kFALSE,
646 0.040, 3, "Resonance", ionCode);
647 }
648 if (!db->GetParticle(-ionCode)) {
649 db->AddParticle("anti-ps_2500", "anti-ps_2500", 2.500, kFALSE,
650 0.040, -3, "Resonance", -ionCode);
651 }
652
653 //Additional Hidden Strangeness Pentaquarks
654
655 //Ps +/-
656 ionCode = 9322132;
657 if (!db->GetParticle(ionCode)) {
658 db->AddParticle("Ps_Plus_1870", "Ps_Plus_1870", 1.870, kFALSE,
659 0.10, 3, "Resonance", ionCode);
660 }
661 if (!db->GetParticle(-ionCode)) {
662 db->AddParticle("Anti-Ps_Minus_1870", "Anti-Ps_Minus_1870", 1.870, kFALSE,
663 0.10, -3, "Resonance", -ionCode);
664 }
665 ionCode = 9322312;
666 if (!db->GetParticle(ionCode)) {
667 db->AddParticle("Ps_Plus_2065", "Ps_Plus_2065", 2.065, kFALSE,
668 0.10, 3, "Resonance", ionCode);
669 }
670 if (!db->GetParticle(-ionCode)) {
671 db->AddParticle("Anti-Ps_Minus_2065", "Anti-Ps_Minus_2065", 2.065, kFALSE,
672 0.10, -3, "Resonance", -ionCode);
673 }
674 ionCode = 9323212;
675 if (!db->GetParticle(ionCode)) {
676 db->AddParticle("Ps_Plus_2255", "Ps_Plus_2255", 2.255, kFALSE,
677 0.10, 3, "Resonance", ionCode);
678 }
679 if (!db->GetParticle(-ionCode)) {
680 db->AddParticle("Anti-Ps_Minus_2255", "Anti-Ps_Minus_2255", 2.255, kFALSE,
681 0.10, -3, "Resonance", -ionCode);
682 }
683 ionCode = 9332212;
684 if (!db->GetParticle(ionCode)) {
685 db->AddParticle("Ps_Plus_2455", "Ps_Plus_2455", 2.455, kFALSE,
686 0.10, 3, "Resonance", ionCode);
687 }
688 if (!db->GetParticle(-ionCode)) {
689 db->AddParticle("Anti-Ps_Minus_2455", "Anti-Ps_Minus_2455", 2.455, kFALSE,
690 0.10, -3, "Resonance", -ionCode);
691 }
692
693 //Ps0
694 ionCode = 9322131;
695 if (!db->GetParticle(ionCode)) {
696 db->AddParticle("Ps_0_1870", "Ps_0_1870", 1.870, kFALSE,
697 0.10, 0, "Resonance", ionCode);
698 }
699 if (!db->GetParticle(-ionCode)) {
700 db->AddParticle("Anti-Ps_0_1870", "Anti-Ps_0_1870", 1.870, kFALSE,
701 0.10, 0, "Resonance", -ionCode);
702 }
703 ionCode = 9322311;
704 if (!db->GetParticle(ionCode)) {
705 db->AddParticle("Ps_0_2065", "Ps_0_2065", 2.065, kFALSE,
706 0.10, 0, "Resonance", ionCode);
707 }
708 if (!db->GetParticle(-ionCode)) {
709 db->AddParticle("Anti-Ps_0_2065", "Anti-Ps_0_2065", 2.065, kFALSE,
710 0.10, 0, "Resonance", -ionCode);
711 }
712 ionCode = 9323211;
713 if (!db->GetParticle(ionCode)) {
714 db->AddParticle("Ps_0_2255", "Ps_0_2255", 2.255, kFALSE,
715 0.10, 0, "Resonance", ionCode);
716 }
717 if (!db->GetParticle(-ionCode)) {
718 db->AddParticle("Anti-Ps_0_2255", "Anti-Ps_0_2255", 2.255, kFALSE,
719 0.10, 0, "Resonance", -ionCode);
720 }
721 ionCode = 9332211;
722 if (!db->GetParticle(ionCode)) {
723 db->AddParticle("Ps_0_2455", "Ps_0_2455", 2.455, kFALSE,
724 0.10, 0, "Resonance", ionCode);
725 }
726 if (!db->GetParticle(-ionCode)) {
727 db->AddParticle("Anti-Ps_0_2455", "Anti-Ps_0_2455", 2.455, kFALSE,
728 0.10, 0, "Resonance", -ionCode);
729 }
730
731 // Charm pentaquarks
732 // Theta_c: isospin singlet with J=1/2+ (see https://arxiv.org/abs/hep-ph/0409121)
733 ionCode = 9422111;
734 if (!db->GetParticle(ionCode)) {
735 db->AddParticle("Anti-Theta_c_3100", "Anti-Theta_c_3100", 3.099, kFALSE,
736 83.e-6, 0, "Resonance", ionCode); // same width as D*+ (83 keV)
737 }
738 db->AddAntiParticle("Theta_c_3100", -ionCode);
739
740 // Charm resonances not present in PYTHIA (consistent with https://github.com/AliceO2Group/O2DPG/blob/master/MC/config/PWGHF/pythia8/generator/pythia8_charmhadronic_with_decays_DResoTrigger.cfg)
741 // Mesons
742 ionCode = 30433;
743 if (!db->GetParticle(ionCode)) {
744 db->AddParticle("D*_s1_Plus_2700", "D*_s1_Plus_2700", 2.714, false, 0.122, 3, "Resonance", ionCode);
745 }
746 db->AddAntiParticle("D*_s1_Minus_2700", -ionCode);
747 ionCode = 40433;
748 if (!db->GetParticle(ionCode)) {
749 db->AddParticle("D*_s1_Plus_2860", "D*_s1_Plus_2860", 2.859, false, 0.160, 3, "Resonance", ionCode);
750 }
751 db->AddAntiParticle("D*_s1_Minus_2860", -ionCode);
752 ionCode = 437;
753 if (!db->GetParticle(ionCode)) {
754 db->AddParticle("D*_s3_Plus_2860", "D*_s3_Plus_2860", 2.860, false, 0.053, 3, "Resonance", ionCode);
755 }
756 db->AddAntiParticle("D*_s3_Minus_2860", -ionCode);
757
758 // Baryons
759 ionCode = 4325;
760 if (!db->GetParticle(ionCode)) {
761 db->AddParticle("Xi_c_Plus_3055", "Xi_c_Plus_3055", 3.0559, false, 0.0078, 3, "Resonance", ionCode);
762 }
763 db->AddAntiParticle("Xi_c_Minus_3055", -ionCode);
764 ionCode = 4326;
765 if (!db->GetParticle(ionCode)) {
766 db->AddParticle("Xi_c_Plus_3080", "Xi_c_Plus_3080", 3.0772, false, 0.0036, 3, "Resonance", ionCode);
767 }
768 db->AddAntiParticle("Xi_c_Minus_3080", -ionCode);
769 ionCode = 4315;
770 if (!db->GetParticle(ionCode)) {
771 db->AddParticle("Xi_c_0_3055", "Xi_c_0_3055", 3.0590, false, 0.0064, 0, "Resonance", ionCode);
772 }
773 db->AddAntiParticle("Anti-Xi_c_0_3055", -ionCode);
774 ionCode = 4316;
775 if (!db->GetParticle(ionCode)) {
776 db->AddParticle("Xi_c_0_3080", "Xi_c_0_3080", 3.0799, false, 0.0056, 0, "Resonance", ionCode);
777 }
778 db->AddAntiParticle("Anti-Xi_c_0_3080", -ionCode);
779 ionCode = 24124;
780 if (!db->GetParticle(ionCode)) {
781 db->AddParticle("Lambda_c_Plus_2860", "Lambda_c_Plus_2860", 2.8561, false, 0.0680, 0, "Resonance", ionCode);
782 }
783 db->AddAntiParticle("Anti-Lambda_c_Minus_2860", -ionCode);
784 ionCode = 24126;
785 if (!db->GetParticle(ionCode)) {
786 db->AddParticle("Lambda_c_Plus_2880", "Lambda_c_Plus_2880", 2.8816, false, 0.0056, 0, "Resonance", ionCode);
787 }
788 db->AddAntiParticle("Anti-Lambda_c_Minus_2880", -ionCode);
789 ionCode = 4125;
790 if (!db->GetParticle(ionCode)) {
791 db->AddParticle("Lambda_c_Plus_2940", "Lambda_c_Plus_2940", 2.9396, false, 0.0200, 0, "Resonance", ionCode);
792 }
793 db->AddAntiParticle("Anti-Lambda_c_Minus_2940", -ionCode);
794
795 // d*(2380) - dibaryon resonance
796
797 ionCode = 900010020; //Arbitrary choice - as deuteron but with leading 9 instead of 10
798 if (!db->GetParticle(ionCode)) {
799 db->AddParticle("d*_2380", "d*_2380", 2.38, kFALSE,
800 0.070, 3, "Resonance", ionCode);
801 }
802 db->AddAntiParticle("d*_2380_bar", -ionCode);
803
804 //Sexaquark (uuddss): compact, neutral and stable hypothetical bound state (arxiv.org/abs/1708.08951)
805 ionCode = 900000020;
806 if (!db->GetParticle(ionCode)) {
807 db->AddParticle("Sexaquark", "Sexaquark", 2.0, kTRUE, 0.0, 0, "Special", ionCode);
808 }
809
810 if (!db->GetParticle(-ionCode)) {
811 db->AddParticle("AntiSexaquark", "AntiSexaquark", 2.0, kTRUE, 0.0, 0, "Special", -ionCode);
812 }
813
814 // lastly, add particle from the the extra text file
816}
817
819{
820 static bool initialized = false;
821 if (!initialized) {
822 // allow user to specify custom file
823 if (const char* custom = std::getenv("O2_SIM_CUSTOM_PDG")) {
824 // TODO: make sure this is a file
825 db->ReadPDGTable(custom);
826 } else if (const char* o2Root = std::getenv("O2_ROOT")) {
827 // take the maintained file from O2
828 auto inputExtraPDGs = std::string(o2Root) + "/share/Detectors/gconfig/data/extra_ions_pdg_table.dat";
829 db->ReadPDGTable(inputExtraPDGs.c_str());
830 }
831 initialized = true;
832 }
833}
834
835} // namespace o2
836
837#endif //O2_O2DATABASEPDG_H
Timeframe settings Average distance in cm of events merged into Randomize distance around average distance of merged events Simulate correct bunch interactions instead of placing only the average number of events A value[n] sets TFlen for[n] collisions in Number of bunches per trainsort Number of bunch trains Instantaneous interaction rate Do not simulate border Total number of collisions to be placed in the interior of all time Do not select random but walk over array of events in stride steps h Event generator settings h configStandalone Use CPU for GPU Force usage of the specified GPU device no CPU fallback Continue processing after an error First event to Number of events to Number of iterations to Number of iterations to Number of initial iterations excluded from const char e
Identification of the BSM magnetic monopoles across the simulation.
static TDatabasePDG * Instance()
static double getMonopoleMass()
static void addParticlesFromExternalFile(TDatabasePDG *db)
static Double_t Mass(int pdg, bool &success, TDatabasePDG *db=O2DatabasePDG::Instance())
static bool hasMonopoleMass(TDatabasePDG *db, double monopoleMass)
static void setMonopoleMass(double monopoleMass)
O2DatabasePDG()=delete
static void addALICEParticles(TDatabasePDG *db=TDatabasePDG::Instance(), double monopoleMass=getMonopoleMass())
static Double_t MassImpl(TParticlePDG *particle, bool &success)
constexpr int MonopolePdgSymm
constexpr int MonopolePdgAsymm
monopole intended to carry opposite electric and magnetic charge (not yet distinguished)
constexpr double MonopoleMassDefaultGeV
Default monopole mass in GeV.
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...