4 // See the class description in the header file.
6 #include "AliPrimaryGeneratorAction.h"
7 #include "AliPrimaryGeneratorMessenger.h"
8 #include "AliTrackingAction.h"
9 #include "AliParticleGun.h"
10 #include "AliGunParticle.h"
11 #include "AliGlobals.h"
13 #include "AliGenerator.h"
18 #include <G4ParticleTable.hh>
19 #include <G4ParticleDefinition.hh>
21 #include <Randomize.hh>
23 #include <TParticle.h>
25 AliPrimaryGeneratorAction::AliPrimaryGeneratorAction()
26 : fGenerator(kAliGenerator),
31 fParticleGun = new AliParticleGun();
32 fMessenger = new AliPrimaryGeneratorMessenger(this);
35 AliPrimaryGeneratorAction::AliPrimaryGeneratorAction(
36 const AliPrimaryGeneratorAction& right) {
38 AliGlobals::Exception(
39 "AliPrimaryGeneratorAction is protected from copying.");
42 AliPrimaryGeneratorAction::~AliPrimaryGeneratorAction() {
50 AliPrimaryGeneratorAction&
51 AliPrimaryGeneratorAction::operator=(const AliPrimaryGeneratorAction &right)
53 // check assignement to self
54 if (this == &right) return *this;
56 AliGlobals::Exception(
57 "AliPrimaryGeneratorAction is protected from assigning.");
64 void AliPrimaryGeneratorAction::ConstructGenerator()
66 // Constructs selected generator.
71 // gun is constructed interactively
74 ConstructGeantinoGenerator(false);
76 case kChargedGeantino:
77 ConstructGeantinoGenerator(true);
80 ConstructAliGenerator();
85 void AliPrimaryGeneratorAction::ConstructGeantinoGenerator(G4bool isCharged)
87 // Geantino with random momentum direction
88 // (the default generator).
92 fParticleGun->Reset();
94 G4ParticleTable* particleTable
95 = G4ParticleTable::GetParticleTable();
97 for (G4int i=0; i< fNofGunParticles; i++)
99 G4ParticleDefinition* particleDef = 0;
101 particleDef = particleTable->FindParticle("geantino");
103 particleDef = particleTable->FindParticle("chargedgeantino");
106 G4String text = "AliPrimaryGeneratorAction::GenerateGeantino:\n";
107 text = text + " G4ParticleTable::FindParticle() failed.";
108 AliGlobals::Exception(text);
112 RandFlat::shootArray(3,rn);
116 G4ThreeVector momentumDir(px, py, pz);
118 G4double energy = 1.*GeV;
119 G4ThreeVector position(0.,0.,0.);
121 G4ThreeVector polarization(0.,0.,0.);
123 AliGunParticle * gunParticle
124 = new AliGunParticle(particleDef, momentumDir, energy, position, time,
127 fParticleGun->AddParticle(gunParticle);
129 if (fVerboseLevel>1) {
130 G4cout << "Geantino generator has been built." << G4endl;
134 void AliPrimaryGeneratorAction::ConstructAliGenerator()
136 // Generator from AliRoot
137 // AliGenerator::Generate() fills the AliRun::fParticles array.
140 // check if AliGenerator is set
141 AliGenerator* generator = gAlice->Generator();
143 G4String text = "AliPrimaryGeneratorAction::ConstructGenerator:\n";
144 text = text + " No AliGenerator is defined in gAlice.";
145 AliGlobals::Exception(text);
147 // fill AliRun::fParticleMap array
148 generator->Generate();
151 void AliPrimaryGeneratorAction::GenerateAliGeneratorPrimaries(G4Event* event)
153 // Creates a new G4PrimaryVertex objects for each TParticle
154 // in fParticles array.
157 G4PrimaryVertex* previousVertex = 0;
158 G4ThreeVector previousPosition = G4ThreeVector();
159 G4double previousTime = 0.;
161 G4int nofParticles = gAlice->GetNtrack();
163 //G4cout << " nofParticles: " << nofParticles << G4endl;
164 for( G4int i=0; i<nofParticles; i++ ) {
166 // get the particle from AliRun stack
167 TParticle* particle = gAlice->Particle(i);
169 // get particle definition from G4ParticleTable
170 G4int pdgEncoding = particle->GetPdgCode();
171 G4ParticleTable* particleTable
172 = G4ParticleTable::GetParticleTable();
173 G4ParticleDefinition* particleDefinition = 0;
174 if (pdgEncoding != 0)
175 particleDefinition = particleTable->FindParticle(pdgEncoding);
177 G4String name = particle->GetName();
178 if (name == "Rootino")
179 particleDefinition = particleTable->FindParticle("geantino");
182 if (particleDefinition==0) {
183 G4cout << "pdgEncoding: " << pdgEncoding << G4endl;
185 "AliPrimaryGeneratorAction::GenerateAliGeneratorPrimaries:\n";
186 text = text + " G4ParticleTable::FindParticle() failed.";
187 AliGlobals::Exception(text);
191 G4ThreeVector position
192 = G4ThreeVector(particle->Vx()*TG3Units::Length(),
193 particle->Vy()*TG3Units::Length(),
194 particle->Vz()*TG3Units::Length());
195 G4double time = particle->T()*TG3Units::Time();
196 G4PrimaryVertex* vertex;
197 if ( i==0 || position != previousPosition || time != previousTime ) {
198 // create a new vertex
199 // in case position and time of gun particle are different from
201 // (vertex objects are destroyed in G4EventManager::ProcessOneEvent()
202 // when event is deleted)
203 vertex = new G4PrimaryVertex(position, time);
204 event->AddPrimaryVertex(vertex);
206 previousVertex = vertex;
207 previousPosition = position;
211 vertex = previousVertex;
213 // create a primary particle and add it to the vertex
214 // (primaryParticle objects are destroyed in G4EventManager::ProcessOneEvent()
215 // when event and then vertex is deleted)
216 G4double px = particle->Px()*TG3Units::Energy();
217 G4double py = particle->Py()*TG3Units::Energy();
218 G4double pz = particle->Pz()*TG3Units::Energy();
219 G4PrimaryParticle* primaryParticle
220 = new G4PrimaryParticle(particleDefinition, px, py, pz);
223 TVector3 polarization;
224 particle->GetPolarisation(polarization);
226 ->SetPolarization(polarization.X(), polarization.Y(), polarization.Z());
228 // add primary particle to the vertex
229 vertex->SetPrimary(primaryParticle);
235 void AliPrimaryGeneratorAction::GeneratePrimaries(G4Event* event)
237 // Generates primary particles by the selected generator.
241 gAlice->BeginEvent();
243 // fill particle gun/particle array
244 ConstructGenerator();
246 // generate primary vertices
247 if (fGenerator == kAliGenerator) {
248 // use AliGenerator if set
249 GenerateAliGeneratorPrimaries(event);
251 // do not save primary particles
252 // (they would be stored twice)
253 AliTrackingAction* trackingAction
254 = AliTrackingAction::Instance();
255 trackingAction->SetSavePrimaries(false);
258 // use particle gun otherwise
259 fParticleGun->GeneratePrimaryVertex(event);
261 // primary particles have to be saved
262 AliTrackingAction* trackingAction
263 = AliTrackingAction::Instance();
264 trackingAction->SetSavePrimaries(true);
268 void AliPrimaryGeneratorAction::SetGenerator(AliPrimaryGenerator generator)
273 fGenerator = generator;
276 void AliPrimaryGeneratorAction::SetNofGunParticles(G4int nofParticles)
278 // Sets number of primary particles.
279 // This method is applied only to "gun" type generators
280 // (and not to AliGenerator from AliRoot).
283 fNofGunParticles = nofParticles;