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