4 // Author: I. Hrivnacova
8 // See the class description in the header file.
10 #include "AliDecayer.h"
12 #include "TG4ExtDecayer.h"
13 #include "TG4ParticlesManager.h"
14 #include "TG4G3Units.h"
16 #include <G4DynamicParticle.hh>
17 #include <G4DecayProducts.hh>
18 #include <G4DecayTable.hh>
19 #include <G4ParticleTable.hh>
20 #include <G4DynamicParticle.hh>
23 #include <TParticle.h>
24 #include <TLorentzVector.h>
25 #include <TClonesArray.h>
29 //_____________________________________________________________________________
30 TG4ExtDecayer::TG4ExtDecayer(AliDecayer* externalDecayer)
31 : G4VExtDecayer("TG4ExtDecayer"),
32 TG4Verbose("extDecayer"),
33 fExternalDecayer(externalDecayer) {
35 fDecayProductsArray = new TClonesArray("TParticle", 1000);
36 fParticlesManager = TG4ParticlesManager::Instance();
39 //_____________________________________________________________________________
40 TG4ExtDecayer::TG4ExtDecayer(const TG4ExtDecayer& right)
41 : TG4Verbose("extDecayer") {
43 TG4Globals::Exception(
44 "TG4ExtDecayer is protected from copying.");
47 //_____________________________________________________________________________
48 TG4ExtDecayer::~TG4ExtDecayer() {
50 delete fDecayProductsArray;
56 //_____________________________________________________________________________
57 TG4ExtDecayer& TG4ExtDecayer::operator=(const TG4ExtDecayer& right)
59 // check assignement to self
60 if (this == &right) return *this;
62 TG4Globals::Exception(
63 "TG4ExtDecayer is protected from assigning.");
70 //_____________________________________________________________________________
71 G4DecayProducts* TG4ExtDecayer::ImportDecayProducts(const G4Track& track)
73 // check if external decayer is defined
74 if (!fExternalDecayer) {
76 G4cerr << "TG4ExtDecayer::ImportDecayProducts: " << G4endl
77 << " No fExternalDecayer is defined." << G4endl;
82 // get particle momentum
83 G4ThreeVector momentum = track.GetMomentum();
84 G4double mag = momentum.mag();
86 p[0] = momentum.x()/mag;
87 p[1] = momentum.x()/mag;
88 p[2] = momentum.x()/mag;
89 p[3] = mag/TG4G3Units::Energy();
92 // ask TG4ParticlesManager to get PDG encoding
93 // (in order to get PDG from extended TDatabasePDG
94 // in case the standard PDG code is not defined)
95 G4ParticleDefinition* particleDef = track.GetDefinition();
96 G4int pdgEncoding = fParticlesManager->GetPDGEncodingFast(particleDef);
98 // let AliDecayer decay the particle
99 // and import the decay products
100 fExternalDecayer->Decay(pdgEncoding, &p);
102 = fExternalDecayer->ImportParticles(fDecayProductsArray);
104 if (VerboseLevel()>1) {
105 G4cout << "nofParticles: " << nofParticles << G4endl;
108 // convert decay products TParticle type
109 // to G4DecayProducts
110 G4DecayProducts* decayProducts
111 = new G4DecayProducts(*(track.GetDynamicParticle()));
114 for (G4int i=0; i<nofParticles; i++) {
116 // get particle from TClonesArray
118 = fParticlesManager->GetParticle(fDecayProductsArray, i);
120 G4int status = particle->GetStatusCode();
121 G4int pdg = particle->GetPdgCode();
122 if ( status>0 && status<11 &&
123 abs(pdg)!=12 && abs(pdg)!=14 && abs(pdg)!=16 ) {
124 // pass to tracking final particles only;
127 if (VerboseLevel()>1) {
128 G4cout << " " << i << "th particle PDG: " << pdg << " ";
131 // create G4DynamicParticle
132 G4DynamicParticle* dynamicParticle
133 = fParticlesManager->CreateDynamicParticle(particle);
135 if (dynamicParticle) {
137 if (VerboseLevel()>1) {
138 G4cout << " G4 particle name: "
139 << dynamicParticle->GetDefinition()->GetParticleName()
143 // add dynamicParticle to decayProducts
144 decayProducts->PushProducts(dynamicParticle);
150 if (VerboseLevel()>1) {
151 G4cout << "nofParticles for tracking: " << counter << G4endl;
154 return decayProducts;