Skip to content

Commit c1998cd

Browse files
authored
Merge branch 'AliceO2Group:master' into master
2 parents 1b09671 + c75ea5d commit c1998cd

5 files changed

Lines changed: 209 additions & 55 deletions

File tree

DPG/Tasks/qaEfficiency.cxx

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,10 @@ struct QaEfficiency {
142142
"MC/ka/pos/prm/pt/num", "MC/pr/pos/prm/pt/num", "MC/de/pos/prm/pt/num",
143143
"MC/tr/pos/prm/pt/num", "MC/he/pos/prm/pt/num", "MC/al/pos/prm/pt/num",
144144
"MC/all/pos/prm/pt/num",
145-
"MC/el/den/prm/pt/num", "MC/mu/den/prm/pt/num", "MC/pi/den/prm/pt/num",
146-
"MC/ka/den/prm/pt/num", "MC/pr/den/prm/pt/num", "MC/de/den/prm/pt/num",
147-
"MC/tr/den/prm/pt/num", "MC/he/den/prm/pt/num", "MC/al/den/prm/pt/num",
148-
"MC/all/den/prm/pt/num"};
145+
"MC/el/neg/prm/pt/num", "MC/mu/neg/prm/pt/num", "MC/pi/neg/prm/pt/num",
146+
"MC/ka/neg/prm/pt/num", "MC/pr/neg/prm/pt/num", "MC/de/neg/prm/pt/num",
147+
"MC/tr/neg/prm/pt/num", "MC/he/neg/prm/pt/num", "MC/al/neg/prm/pt/num",
148+
"MC/all/neg/prm/pt/num"};
149149
static constexpr std::string_view hPtPrmNumTrk[nHistograms] = {"MC/el/sum/prm/pt/numtrk", "MC/mu/sum/prm/pt/numtrk", "MC/pi/sum/prm/pt/numtrk",
150150
"MC/ka/sum/prm/pt/numtrk", "MC/pr/sum/prm/pt/numtrk", "MC/de/sum/prm/pt/numtrk",
151151
"MC/tr/sum/prm/pt/numtrk", "MC/he/sum/prm/pt/numtrk", "MC/al/sum/prm/pt/numtrk",
@@ -191,10 +191,10 @@ struct QaEfficiency {
191191
"MC/ka/pos/dec/pt/num", "MC/pr/pos/dec/pt/num", "MC/de/pos/dec/pt/num",
192192
"MC/tr/pos/dec/pt/num", "MC/he/pos/dec/pt/num", "MC/al/pos/dec/pt/num",
193193
"MC/all/pos/dec/pt/num",
194-
"MC/el/den/dec/pt/num", "MC/mu/den/dec/pt/num", "MC/pi/den/dec/pt/num",
195-
"MC/ka/den/dec/pt/num", "MC/pr/den/dec/pt/num", "MC/de/den/dec/pt/num",
196-
"MC/tr/den/dec/pt/num", "MC/he/den/dec/pt/num", "MC/al/den/dec/pt/num",
197-
"MC/all/den/dec/pt/num"};
194+
"MC/el/neg/dec/pt/num", "MC/mu/neg/dec/pt/num", "MC/pi/neg/dec/pt/num",
195+
"MC/ka/neg/dec/pt/num", "MC/pr/neg/dec/pt/num", "MC/de/neg/dec/pt/num",
196+
"MC/tr/neg/dec/pt/num", "MC/he/neg/dec/pt/num", "MC/al/neg/dec/pt/num",
197+
"MC/all/neg/dec/pt/num"};
198198
static constexpr std::string_view hPtDecNumTrk[nHistograms] = {"MC/el/sum/dec/pt/numtrk", "MC/mu/sum/dec/pt/numtrk", "MC/pi/sum/dec/pt/numtrk",
199199
"MC/ka/sum/dec/pt/numtrk", "MC/pr/sum/dec/pt/numtrk", "MC/de/sum/dec/pt/numtrk",
200200
"MC/tr/sum/dec/pt/numtrk", "MC/he/sum/dec/pt/numtrk", "MC/al/sum/dec/pt/numtrk",
@@ -240,10 +240,10 @@ struct QaEfficiency {
240240
"MC/ka/pos/mat/pt/num", "MC/pr/pos/mat/pt/num", "MC/de/pos/mat/pt/num",
241241
"MC/tr/pos/mat/pt/num", "MC/he/pos/mat/pt/num", "MC/al/pos/mat/pt/num",
242242
"MC/all/pos/mat/pt/num",
243-
"MC/el/den/mat/pt/num", "MC/mu/den/mat/pt/num", "MC/pi/den/mat/pt/num",
244-
"MC/ka/den/mat/pt/num", "MC/pr/den/mat/pt/num", "MC/de/den/mat/pt/num",
245-
"MC/tr/den/mat/pt/num", "MC/he/den/mat/pt/num", "MC/al/den/mat/pt/num",
246-
"MC/all/den/mat/pt/num"};
243+
"MC/el/neg/mat/pt/num", "MC/mu/neg/mat/pt/num", "MC/pi/neg/mat/pt/num",
244+
"MC/ka/neg/mat/pt/num", "MC/pr/neg/mat/pt/num", "MC/de/neg/mat/pt/num",
245+
"MC/tr/neg/mat/pt/num", "MC/he/neg/mat/pt/num", "MC/al/neg/mat/pt/num",
246+
"MC/all/neg/mat/pt/num"};
247247
static constexpr std::string_view hPtMatNumTrk[nHistograms] = {"MC/el/sum/mat/pt/numtrk", "MC/mu/sum/mat/pt/numtrk", "MC/pi/sum/mat/pt/numtrk",
248248
"MC/ka/sum/mat/pt/numtrk", "MC/pr/sum/mat/pt/numtrk", "MC/de/sum/mat/pt/numtrk",
249249
"MC/tr/sum/mat/pt/numtrk", "MC/he/sum/mat/pt/numtrk", "MC/al/sum/mat/pt/numtrk",
@@ -1189,11 +1189,11 @@ struct QaEfficiency {
11891189
if (!isTrackSelected(track)) { // Check general cuts
11901190
continue;
11911191
}
1192-
histos.fill(HIST("MC/trackSelection"), 11);
1192+
histos.fill(HIST("MC/trackSelection"), 9);
11931193
if (!track.has_collision()) {
11941194
continue;
11951195
}
1196-
histos.fill(HIST("MC/trackSelection"), 12);
1196+
histos.fill(HIST("MC/trackSelection"), 10);
11971197
// Filling variable histograms
11981198
histos.fill(HIST("MC/trackLength"), track.length());
11991199
if (doEl) {

DPG/Tasks/qaEventTrack.h

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,16 +79,32 @@ DECLARE_SOA_COLUMN(PtMC, ptMC, float); //! Pt MC
7979
DECLARE_SOA_COLUMN(EtaMC, etaMC, float); //! Eta MC
8080
DECLARE_SOA_COLUMN(PhiMC, phiMC, float); //! Phi MC
8181
DECLARE_SOA_COLUMN(ProductionMode, productionMode, int); //! ProductionMode i.e. non matched (-1), physical primary (0), weak decay product (1) or material (2)
82+
DECLARE_SOA_DYNAMIC_COLUMN(IsNonMatched, isNonMatched, //! True if particle is considered a non matched particle
83+
[](int mode) -> bool { return mode == -1; });
84+
DECLARE_SOA_DYNAMIC_COLUMN(IsPhysicalPrimary, isPhysicalPrimary, //! True if particle is considered a physical primary according to the ALICE definition
85+
[](int mode) -> bool { return mode == 0; });
86+
DECLARE_SOA_DYNAMIC_COLUMN(IsFromWeakDecay, isFromWeakDecay, //! True if particle is considered from a weak decay
87+
[](int mode) -> bool { return mode == 1; });
88+
DECLARE_SOA_DYNAMIC_COLUMN(IsFromMaterial, isFromMaterial, //! True if particle is considered from a weak decay
89+
[](int mode) -> bool { return mode == 2; });
8290

8391
} // namespace dpgparticles
8492

8593
DECLARE_SOA_TABLE(DPGRecoParticles, "AOD", "DPGRecoPart", //! Table of the DPG reconstructed particles
8694
dpgparticles::PtMC, dpgparticles::EtaMC, dpgparticles::PhiMC,
87-
mcparticle::PdgCode, dpgparticles::ProductionMode);
95+
mcparticle::PdgCode, dpgparticles::ProductionMode,
96+
dpgparticles::IsNonMatched<dpgparticles::ProductionMode>,
97+
dpgparticles::IsPhysicalPrimary<dpgparticles::ProductionMode>,
98+
dpgparticles::IsFromWeakDecay<dpgparticles::ProductionMode>,
99+
dpgparticles::IsFromMaterial<dpgparticles::ProductionMode>);
88100

89-
DECLARE_SOA_TABLE(DPGNonRecoParticles, "AOD", "DPGNonRecoPart", //! Table of the DPG particles
101+
DECLARE_SOA_TABLE(DPGNonRecoParticles, "AOD", "DPGNonRecoPart", //! Table of the DPG non reconstructed particles
90102
dpgtrack::DPGCollisionId,
91103
dpgparticles::PtMC, dpgparticles::EtaMC, dpgparticles::PhiMC,
92104
mcparticle::PdgCode, dpgparticles::ProductionMode,
105+
dpgparticles::IsNonMatched<dpgparticles::ProductionMode>,
106+
dpgparticles::IsPhysicalPrimary<dpgparticles::ProductionMode>,
107+
dpgparticles::IsFromWeakDecay<dpgparticles::ProductionMode>,
108+
dpgparticles::IsFromMaterial<dpgparticles::ProductionMode>,
93109
mcparticle::Vx, mcparticle::Vy, mcparticle::Vz);
94110
} // namespace o2::aod

DPG/Tasks/qaEventTrackLite.cxx

Lines changed: 66 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ struct qaEventTrackLite {
4848
ConfigurableAxis binsImpPar{"binsImpPar", {200, -0.15, 0.15}, "Impact parameter binning (cm)"};
4949
ConfigurableAxis binsEta{"binsEta", {200, -2., 2.}, "Eta binning"};
5050
ConfigurableAxis binsPhi{"binsPhi", {180, 0., 2 * M_PI}, "Phi binning"};
51+
ConfigurableAxis binsVtxZ{"binsVtxZ", {100, -20., 20.}, "Vtx Z binning"};
5152

5253
HistogramRegistry histos;
5354

@@ -114,7 +115,9 @@ struct qaEventTrackLite {
114115
Configurable<float> dcaXYmaxSel3{"dcaXYMaxSel3", 999., "Max dca XY sel3"};
115116

116117
// MC selections
117-
Configurable<int> pdgCodeSel{"pdgCodeSel", 2, "pdgCode based particle selection, 1 defines pi,K,p,mu,e, 2 all final-state charged particles including light (hyper)nuclei"};
118+
Configurable<int> pdgCodeSel{"pdgCodeSel", 0, "pdgCode based particle selection. Provide a PDG code required for particles to have. To be used in combo with pdgCodeSelMode"};
119+
Configurable<int> pdgCodeSelMode{"pdgCodeSelMode", 2, "multiple pdgCode based particle selection. `1` accepts pi,K,p,mu,e, `2` accepts all final-state charged particles including light (hyper)nuclei"};
120+
118121
Configurable<bool> checkPdgAtReco{"checkPdgAtReco", false, "check pdg code also at reco levo for data-like reference"};
119122

120123
// TPC dEdx splines
@@ -187,14 +190,15 @@ struct qaEventTrackLite {
187190
const AxisSpec axis1overPt{bins1overPt, "1/#it{p}_{T} (GeV/c)^{-1}"};
188191
const AxisSpec axisEta{binsEta, "#it{#eta}"};
189192
const AxisSpec axisPhi{binsPhi, "#it{#phi} (rad)"};
193+
const AxisSpec axisVtxZ{binsVtxZ, "Vertex Z (cm)"};
190194

191195
// TPC dEdx splines
192196
betheBlock.setUpBetheBlockAleph(tpcSplinesPeriod);
193197

194198
// kine histograms
195-
histos.add("Tracks/VertexPositionZ", "", kTH1D, {{100, -20.f, 20.f, "Vertex Z (cm)"}});
196-
histos.add("Tracks/VertexPositionZvsEta", "", kTH2D, {axisEta, {100, -20.f, 20.f, "Vertex Z (cm)"}});
197-
histos.add("Tracks/VertexPositionZvsEtaHasITS", "", kTH2D, {axisEta, {100, -20.f, 20.f, "Vertex Z (cm)"}});
199+
histos.add("Tracks/VertexPositionZ", "", kTH1D, {axisVtxZ});
200+
histos.add("Tracks/VertexPositionZvsEta", "", kTH2D, {axisEta, axisVtxZ});
201+
histos.add("Tracks/VertexPositionZvsEtaHasITS", "", kTH2D, {axisEta, axisVtxZ});
198202
histos.add("Tracks/Kine/pt", "#it{p}_{T}", kTH1D, {axisPt});
199203
histos.add("Tracks/Kine/eta", "#eta", kTH1D, {axisEta});
200204
histos.add("Tracks/Kine/phi", "#phi", kTH1D, {axisPhi});
@@ -281,11 +285,17 @@ struct qaEventTrackLite {
281285
histos.add("Particles/Kine/pt", "Particle #it{p}_{T}", kTH1D, {axisPt});
282286
histos.add("Particles/Kine/eta", "Particle #eta", kTH1D, {axisEta});
283287
histos.add("Particles/Kine/phi", "Particle #phi", kTH1D, {axisPhi});
284-
histos.add("Particle/selPtEtaPhiMCGenPrimary", "pt eta phi map MC gen Primary; pt,eta,phi", kTH3D, {axisPt, {50, -1.2, 1.2, "#eta"}, {30, 0., 2 * M_PI, "#varphi"}});
285-
histos.add("Particle/selPtEtaPhiMCRecoNoSelPrimary", "pt eta phi map MC gen Primary sel0; pt,eta,phi", kTH3D, {axisPt, {50, -1.2, 1.2, "#eta"}, {30, 0., 2 * M_PI, "#varphi"}});
286-
histos.add("Particle/selPtEtaPhiMCRecoSel1Primary", "pt eta phi map MC gen Primary sel1; pt,eta,phi", kTH3D, {axisPt, {50, -1.2, 1.2, "#eta"}, {30, 0., 2 * M_PI, "#varphi"}});
287-
histos.add("Particle/selPtEtaPhiMCRecoSel2Primary", "pt eta phi map MC gen Primary sel2; pt,eta,phi", kTH3D, {axisPt, {50, -1.2, 1.2, "#eta"}, {30, 0., 2 * M_PI, "#varphi"}});
288-
histos.add("Particle/selPtEtaPhiMCRecoSel3Primary", "pt eta phi map MC gen Primary sel3; pt,eta,phi", kTH3D, {axisPt, {50, -1.2, 1.2, "#eta"}, {30, 0., 2 * M_PI, "#varphi"}});
288+
histos.add("Particle/selPtEtaPhiMCGenPrimary", "pt eta phi map MC gen Primary", kTH3D, {axisPt, {50, -1.2, 1.2, "#eta"}, {30, 0., 2 * M_PI, "#varphi"}});
289+
histos.add("Particle/selPtEtaPhiMCRecoNoSelPrimary", "pt eta phi map MC reco Primary sel0", kTH3D, {axisPt, {50, -1.2, 1.2, "#eta"}, {30, 0., 2 * M_PI, "#varphi"}});
290+
histos.add("Particle/selPtEtaPhiMCRecoSel1Primary", "pt eta phi map MC reco Primary sel1", kTH3D, {axisPt, {50, -1.2, 1.2, "#eta"}, {30, 0., 2 * M_PI, "#varphi"}});
291+
histos.add("Particle/selPtEtaPhiMCRecoSel2Primary", "pt eta phi map MC reco Primary sel2", kTH3D, {axisPt, {50, -1.2, 1.2, "#eta"}, {30, 0., 2 * M_PI, "#varphi"}});
292+
histos.add("Particle/selPtEtaPhiMCRecoSel3Primary", "pt eta phi map MC reco Primary sel3", kTH3D, {axisPt, {50, -1.2, 1.2, "#eta"}, {30, 0., 2 * M_PI, "#varphi"}});
293+
294+
histos.add("Particle/selPtEtaVtxzMCGenPrimary", "pt eta VtxZ map MC gen Primary", kTH3F, {axisPt, axisEta, axisVtxZ});
295+
histos.add("Particle/selPtEtaVtxzMCRecoNoSelPrimary", "pt eta VtxZ map MC reco Primary sel0", kTH3F, {axisPt, axisEta, axisVtxZ});
296+
histos.add("Particle/selPtEtaVtxzMCRecoSel1Primary", "pt eta VtxZ map MC reco Primary sel1", kTH3F, {axisPt, axisEta, axisVtxZ});
297+
histos.add("Particle/selPtEtaVtxzMCRecoSel2Primary", "pt eta VtxZ map MC reco Primary sel2", kTH3F, {axisPt, axisEta, axisVtxZ});
298+
histos.add("Particle/selPtEtaVtxzMCRecoSel3Primary", "pt eta VtxZ map MC reco Primary sel3", kTH3F, {axisPt, axisEta, axisVtxZ});
289299
histos.add("Tracks/resoPhivsPtvsEta", "#varphi(reco)-#varphi(gen);", kTH3D, {axisPt, axisEta, {180, -M_PI, M_PI, "#varphi(reco)-#varphi(gen)"}});
290300
histos.add("Tracks/phiRecovsphiGen", "#varphi(reco) vs. #varphi(gen);", kTH2D, {axisPhi, axisPhi});
291301
histos.get<TH2>(HIST("Tracks/phiRecovsphiGen"))->GetXaxis()->SetTitle("#varphi(reco)");
@@ -314,16 +324,17 @@ struct qaEventTrackLite {
314324
// TOF
315325
Filter tofChi = o2::aod::track::tofChi2 > chi2TofMin;
316326
Filter length = o2::aod::track::length > lengthMin;
317-
318327
template <bool isMC, typename trackType>
319328
void fillHistograms(trackType const& track)
320329
{
321-
322-
if (TMath::Abs(track.dpgCollision().posZ()) > vtxZMax)
330+
const float vtxZ = track.dpgCollision().posZ();
331+
if (TMath::Abs(vtxZ) > vtxZMax) {
323332
return;
333+
}
324334
if constexpr (isMC) {
325-
if (track.productionMode() == 0 && isPdgSelected(track.pdgCode())) {
335+
if (track.isPhysicalPrimary() && isPdgSelected(track.pdgCode())) {
326336
histos.fill(HIST("Particle/selPtEtaPhiMCGenPrimary"), track.ptMC(), track.etaMC(), track.phiMC());
337+
histos.fill(HIST("Particle/selPtEtaVtxzMCGenPrimary"), track.ptMC(), track.etaMC(), vtxZ);
327338
}
328339
}
329340
// temporary additional selections
@@ -336,18 +347,22 @@ struct qaEventTrackLite {
336347
Bool_t isPdgOk = true;
337348
if constexpr (isMC) {
338349
isPdgOk = isPdgSelected(track.pdgCode());
339-
if (track.productionMode() == 0 && isPdgOk) {
350+
if (track.isPhysicalPrimary() && isPdgOk) {
340351
histos.get<TH1>(HIST("Particles/PDGs"))->Fill(Form("%i", track.pdgCode()), 1);
341352
histos.fill(HIST("Particle/selPtEtaPhiMCRecoNoSelPrimary"), track.ptMC(), track.etaMC(), track.phiMC());
353+
histos.fill(HIST("Particle/selPtEtaVtxzMCRecoNoSelPrimary"), track.ptMC(), track.etaMC(), vtxZ);
342354

343355
if (sel1) {
344356
histos.fill(HIST("Particle/selPtEtaPhiMCRecoSel1Primary"), track.ptMC(), track.etaMC(), track.phiMC());
357+
histos.fill(HIST("Particle/selPtEtaVtxzMCRecoSel1Primary"), track.ptMC(), track.etaMC(), vtxZ);
345358
}
346359
if (sel2) {
347360
histos.fill(HIST("Particle/selPtEtaPhiMCRecoSel2Primary"), track.ptMC(), track.etaMC(), track.phiMC());
361+
histos.fill(HIST("Particle/selPtEtaVtxzMCRecoSel2Primary"), track.ptMC(), track.etaMC(), vtxZ);
348362
}
349363
if (sel3) {
350364
histos.fill(HIST("Particle/selPtEtaPhiMCRecoSel3Primary"), track.ptMC(), track.etaMC(), track.phiMC());
365+
histos.fill(HIST("Particle/selPtEtaVtxzMCRecoSel3Primary"), track.ptMC(), track.etaMC(), vtxZ);
351366
}
352367
}
353368

@@ -471,22 +486,27 @@ struct qaEventTrackLite {
471486
PROCESS_SWITCH(qaEventTrackLite, processDataLite, "process data lite", true);
472487

473488
// Process MC
474-
void processMCLite(o2::soa::Filtered<soa::Join<aod::DPGTracks, aod::DPGRecoParticles>> const& tracks, aod::DPGCollisions const&, aod::DPGNonRecoParticles const& particles)
489+
void processMCLite(o2::soa::Filtered<soa::Join<aod::DPGTracks, aod::DPGRecoParticles>> const& tracks, aod::DPGCollisions const&,
490+
aod::DPGNonRecoParticles const& nonRecoParticles)
475491
{
476492
for (const auto& track : tracks) {
477493
fillHistograms<true>(track);
478494
}
479495

480-
for (const auto& particle : particles) {
481-
if (TMath::Abs(particle.dpgCollision().posZ()) > vtxZMax)
496+
for (const auto& particle : nonRecoParticles) {
497+
const float vtxZ = particle.dpgCollision().posZ();
498+
if (TMath::Abs(vtxZ) > vtxZMax) {
482499
continue;
500+
}
483501

484502
histos.fill(HIST("Particles/Kine/pt"), particle.ptMC());
485503
histos.fill(HIST("Particles/Kine/eta"), particle.etaMC());
486504
histos.fill(HIST("Particles/Kine/phi"), particle.phiMC());
487505

488-
if (particle.productionMode() == 0 && isPdgSelected(particle.pdgCode()))
506+
if (particle.isPhysicalPrimary() && isPdgSelected(particle.pdgCode())) {
489507
histos.fill(HIST("Particle/selPtEtaPhiMCGenPrimary"), particle.ptMC(), particle.etaMC(), particle.phiMC());
508+
histos.fill(HIST("Particle/selPtEtaVtxzMCGenPrimary"), particle.ptMC(), particle.etaMC(), vtxZ);
509+
}
490510
}
491511
}
492512
PROCESS_SWITCH(qaEventTrackLite, processMCLite, "process MC lite", false);
@@ -578,18 +598,38 @@ struct qaEventTrackLite {
578598
return true;
579599
}
580600

581-
bool isPdgSelected(const Int_t pdgcode)
601+
bool isPdgSelected(const int pdgcode)
582602
{ // mimics selection of charged particles or id particles
583-
Int_t abspdgcode = TMath::Abs(pdgcode);
584-
if (abspdgcode == pdgCodeSel)
603+
604+
if (pdgcode == pdgCodeSel) { // Check that the pdg code is exactly what was asked
585605
return true;
586-
if (pdgCodeSel == 1 || pdgCodeSel == 2) {
587-
if (abspdgcode == 211 || abspdgcode == 321 || abspdgcode == 2212 || abspdgcode == 11 || abspdgcode == 13)
588-
return true;
589-
if (pdgCodeSel == 2) {
590-
if (abspdgcode == 3222 || abspdgcode == 3112 || abspdgcode == 3312 || abspdgcode == 3334 || abspdgcode == 1000010020 || abspdgcode == 1000010030 || abspdgcode == 1000020030 || abspdgcode == 1000020040 || abspdgcode == 1010010030 || abspdgcode == 1010020040)
606+
}
607+
const int abspdgcode = abs(pdgcode);
608+
if (pdgCodeSelMode == 1 || pdgCodeSelMode == 2) {
609+
switch (abspdgcode) {
610+
case 11: // electron
611+
case 13: // muon
612+
case 211: // pion
613+
case 321: // kaon
614+
case 2212: // proton
591615
return true;
592616
}
617+
618+
if (pdgCodeSelMode == 2) {
619+
switch (abspdgcode) {
620+
case 3222: // Σ+
621+
case 3112: // Σ−
622+
case 3312: // Ξ−
623+
case 3334: // Ω−
624+
case 1000010020: // deuteron
625+
case 1000010030: // triton
626+
case 1000020030: // helium3
627+
case 1000020040: // helium4
628+
case 1010010030: // hyper triton
629+
case 1010020040: // hyper helium4
630+
return true;
631+
}
632+
}
593633
}
594634
return false;
595635
}

0 commit comments

Comments
 (0)