Skip to content

Commit f6c32a7

Browse files
committed
Added Decayer
Currently the decayer doesn't decay the Z0 particle anyway. I wasn't able to find a configuration that allows the decay of the resonance, might be implemented later, however the baseline is here and the Z0 is disabled from the transport for the time being, making the generator work.
1 parent fed51ce commit f6c32a7

File tree

1 file changed

+72
-4
lines changed

1 file changed

+72
-4
lines changed

MC/config/common/external/generator/performanceGenerator.C

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ namespace o2
3535
mTag = tag;
3636
LOG(info) << "Generator with tag " << mTag << " is selected";
3737
}
38+
mDecayer = std::make_unique<DecayerPythia8>();
39+
mDecayer->Init();
3840
Generator::setTimeUnit(1.0);
3941
Generator::setPositionUnit(1.0);
4042
}
@@ -66,6 +68,7 @@ namespace o2
6668
unsigned short int mNSig = 0; // Number of particles to generate
6769
unsigned int mNUE = 0; // Number of tracks in the Underlying event
6870
unsigned short int mTag = 1; // Tag to select the generation function
71+
std::unique_ptr<DecayerPythia8> mDecayer; // Pythia8 decayer for particles not present in the physics list of Geant4 (like Z0)
6972
const std::vector<std::shared_ptr<o2::eventgen::Generator>> genList = GeneratorHybrid::getGenerators();
7073
std::map<unsigned short int, std::function<TParticle()>> genMap;
7174
UInt_t mGenID = 42;
@@ -137,8 +140,42 @@ namespace o2
137140
TParticle generatedParticle(pdgCode, status, -1, -1, -1, -1, px, py, pz, energy, xyz[0], xyz[1], xyz[2], 0.0);
138141
generatedParticle.SetStatusCode(o2::mcgenstatus::MCGenStatusEncoding(generatedParticle.GetStatusCode(), 0).fullEncoding);
139142
generatedParticle.SetUniqueID(mGenID);
140-
generatedParticle.SetBit(ParticleStatus::kToBeDone, //
141-
o2::mcgenstatus::getHepMCStatusCode(generatedParticle.GetStatusCode()) == 1);
143+
if (pdgCode == 23) {
144+
generatedParticle.SetBit(ParticleStatus::kToBeDone, false); // Force Z0 to be decayed by the transport
145+
LOG(debug) << "Processing Z0 with DecayerPythia8";
146+
TLorentzVector *pDec = new TLorentzVector(px, py, pz, energy);
147+
mDecayer->Decay(pdgCode, pDec);
148+
TClonesArray *daughters = new TClonesArray("TParticle");
149+
mDecayer->ImportParticles(daughters);
150+
unsigned short int nDaughters = daughters->GetEntriesFast();
151+
if (daughters && nDaughters > 0) {
152+
for (int i = 0; i < daughters->GetEntriesFast(); i++) {
153+
TParticle* daughter = (TParticle*)daughters->At(i);
154+
daughter->SetUniqueID(mGenID);
155+
if (i > 0)
156+
{
157+
daughter->SetBit(ParticleStatus::kToBeDone, //
158+
o2::mcgenstatus::getHepMCStatusCode(generatedParticle.GetStatusCode()) == 1);
159+
}
160+
else
161+
{
162+
// First daughter is the mother (Z0)
163+
daughter->SetBit(ParticleStatus::kToBeDone, false);
164+
}
165+
LOG(debug) << "Daughter " << i << ": PDG=" << daughter->GetPdgCode() << ", E=" << daughter->Energy() << ", p=(" << daughter->Px() << "," << daughter->Py() << "," << daughter->Pz() << ")";
166+
mParticles.push_back(*daughter);
167+
}
168+
LOG(debug) << "Z0 decayed into " << daughters->GetEntriesFast() << " particles";
169+
daughters->Clear("C");
170+
delete daughters;
171+
} else {
172+
LOG(warn) << "DecayerPythia8 failed to decay Z0 or no daughters found";
173+
}
174+
delete pDec;
175+
} else {
176+
generatedParticle.SetBit(ParticleStatus::kToBeDone, //
177+
o2::mcgenstatus::getHepMCStatusCode(generatedParticle.GetStatusCode()) == 1);
178+
}
142179
return generatedParticle;
143180
}
144181

@@ -261,8 +298,39 @@ namespace o2
261298
TParticle generatedParticle(pdgCode, status, -1, -1, -1, -1, px, py, pz, energy, xyz[0], xyz[1], xyz[2], 0.0);
262299
generatedParticle.SetStatusCode(o2::mcgenstatus::MCGenStatusEncoding(generatedParticle.GetStatusCode(), 0).fullEncoding);
263300
generatedParticle.SetUniqueID(mGenID);
264-
generatedParticle.SetBit(ParticleStatus::kToBeDone, //
265-
o2::mcgenstatus::getHepMCStatusCode(generatedParticle.GetStatusCode()) == 1);
301+
if (pdgCode == 23) {
302+
generatedParticle.SetBit(ParticleStatus::kToBeDone, false); // Force Z0 to be decayed by the transport
303+
LOG(debug) << "Processing Z0 with DecayerPythia8";
304+
TLorentzVector *pDec = new TLorentzVector(px, py, pz, energy);
305+
mDecayer->Decay(pdgCode, pDec);
306+
TClonesArray *daughters = new TClonesArray("TParticle");
307+
mDecayer->ImportParticles(daughters);
308+
unsigned short int nDaughters = daughters->GetEntriesFast();
309+
if (daughters && nDaughters > 0) {
310+
for (int i = 0; i < daughters->GetEntriesFast(); i++) {
311+
TParticle* daughter = (TParticle*)daughters->At(i);
312+
daughter->SetUniqueID(mGenID);
313+
if (i > 0) {
314+
daughter->SetBit(ParticleStatus::kToBeDone, //
315+
o2::mcgenstatus::getHepMCStatusCode(generatedParticle.GetStatusCode()) == 1);
316+
} else {
317+
// First daughter is the mother (Z0)
318+
daughter->SetBit(ParticleStatus::kToBeDone, false);
319+
}
320+
LOG(debug) << "Daughter " << i << ": PDG=" << daughter->GetPdgCode() << ", E=" << daughter->Energy() << ", p=(" << daughter->Px() << "," << daughter->Py() << "," << daughter->Pz() << ")";
321+
mParticles.push_back(*daughter);
322+
}
323+
LOG(debug) << "Z0 decayed into " << daughters->GetEntriesFast() << " particles";
324+
daughters->Clear("C");
325+
delete daughters;
326+
} else {
327+
LOG(warn) << "DecayerPythia8 failed to decay Z0 or no daughters found";
328+
}
329+
delete pDec;
330+
} else {
331+
generatedParticle.SetBit(ParticleStatus::kToBeDone, //
332+
o2::mcgenstatus::getHepMCStatusCode(generatedParticle.GetStatusCode()) == 1);
333+
}
266334
return generatedParticle;
267335
}
268336

0 commit comments

Comments
 (0)