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
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 ...