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),
32 fParticleGun = new AliParticleGun();
33 fMessenger = new AliPrimaryGeneratorMessenger(this);
36 AliPrimaryGeneratorAction::AliPrimaryGeneratorAction(
37 const AliPrimaryGeneratorAction& right) {
39 AliGlobals::Exception(
40 "AliPrimaryGeneratorAction is protected from copying.");
43 AliPrimaryGeneratorAction::~AliPrimaryGeneratorAction() {
51 AliPrimaryGeneratorAction&
52 AliPrimaryGeneratorAction::operator=(const AliPrimaryGeneratorAction &right)
54 // check assignement to self
55 if (this == &right) return *this;
57 AliGlobals::Exception(
58 "AliPrimaryGeneratorAction is protected from assigning.");
65 void AliPrimaryGeneratorAction::ConstructGenerator()
67 // Constructs selected generator.
73 // gun is constructed interactively
76 ConstructGeantinoGenerator(false);
78 case kChargedGeantino:
79 ConstructGeantinoGenerator(true);
82 ConstructAliGenerator();
87 void AliPrimaryGeneratorAction::ConstructGeantinoGenerator(G4bool isCharged)
89 // Geantino with random momentum direction
90 // (the default generator).
94 fParticleGun->Reset();
96 G4ParticleTable* particleTable
97 = G4ParticleTable::GetParticleTable();
99 for (G4int i=0; i< fNofGunParticles; i++)
101 G4ParticleDefinition* particleDef = 0;
103 particleDef = particleTable->FindParticle("geantino");
105 particleDef = particleTable->FindParticle("chargedgeantino");
108 G4String text = "AliPrimaryGeneratorAction::GenerateGeantino:\n";
109 text = text + " G4ParticleTable::FindParticle() failed.";
110 AliGlobals::Exception(text);
114 RandFlat::shootArray(3,rn);
118 G4ThreeVector momentumDir(px, py, pz);
120 G4double energy = 1.*GeV;
121 G4ThreeVector position(0.,0.,0.);
123 G4ThreeVector polarization(0.,0.,0.);
125 AliGunParticle * gunParticle
126 = new AliGunParticle(particleDef, momentumDir, energy, position, time,
129 fParticleGun->AddParticle(gunParticle);
131 if (fVerboseLevel>1) {
132 G4cout << "Geantino generator has been built." << G4endl;
136 void AliPrimaryGeneratorAction::ConstructAliGenerator()
138 // Generator from AliRoot
139 // AliGenerator::Generate() fills the AliRun::fParticles array.
142 // check if AliGenerator is set
143 AliGenerator* generator = gAlice->Generator();
145 G4String text = "AliPrimaryGeneratorAction::ConstructGenerator:\n";
146 text = text + " No AliGenerator is defined in gAlice.";
147 AliGlobals::Exception(text);
149 // fill AliRun::fParticles array
150 generator->Generate();
151 fParticleArray = gAlice->Particles();
154 void AliPrimaryGeneratorAction::GenerateAliGeneratorPrimaries(G4Event* event)
156 // Creates a new G4PrimaryVertex objects for each TParticle
157 // in fParticles array.
160 G4PrimaryVertex* previousVertex = 0;
161 G4ThreeVector previousPosition = G4ThreeVector();
162 G4double previousTime = 0.;
164 G4int nofParticles = gAlice->GetNtrack();
166 //G4cout << " nofParticles: " << nofParticles << G4endl;
167 for( G4int i=0; i<nofParticles; i++ ) {
169 // get particle from TClonesArray
170 TObject* particleTObject
171 = fParticleArray->UncheckedAt(i);
173 = dynamic_cast<TParticle*>(particleTObject);
175 // check particle type
178 "AliPrimaryGeneratorAction::GenerateAliGeneratorPrimaries\n";
179 text = text + "Unknown particle type";
180 AliGlobals::Exception(text);
183 // get particle definition from G4ParticleTable
184 G4int pdgEncoding = particle->GetPdgCode();
185 G4ParticleTable* particleTable
186 = G4ParticleTable::GetParticleTable();
187 G4ParticleDefinition* particleDefinition = 0;
188 if (pdgEncoding != 0)
189 particleDefinition = particleTable->FindParticle(pdgEncoding);
191 G4String name = particle->GetName();
192 if (name == "Rootino")
193 particleDefinition = particleTable->FindParticle("geantino");
196 if (particleDefinition==0) {
197 G4cout << "pdgEncoding: " << pdgEncoding << G4endl;
199 "AliPrimaryGeneratorAction::GenerateAliGeneratorPrimaries:\n";
200 text = text + " G4ParticleTable::FindParticle() failed.";
201 AliGlobals::Exception(text);
205 G4ThreeVector position
206 = G4ThreeVector(particle->Vx()*TG3Units::Length(),
207 particle->Vy()*TG3Units::Length(),
208 particle->Vz()*TG3Units::Length());
209 G4double time = particle->T()*TG3Units::Time();
210 G4PrimaryVertex* vertex;
211 if ( i==0 || position != previousPosition || time != previousTime ) {
212 // create a new vertex
213 // in case position and time of gun particle are different from
215 // (vertex objects are destroyed in G4EventManager::ProcessOneEvent()
216 // when event is deleted)
217 vertex = new G4PrimaryVertex(position, time);
218 event->AddPrimaryVertex(vertex);
220 previousVertex = vertex;
221 previousPosition = position;
225 vertex = previousVertex;
227 // create a primary particle and add it to the vertex
228 // (primaryParticle objects are destroyed in G4EventManager::ProcessOneEvent()
229 // when event and then vertex is deleted)
230 G4double px = particle->Px()*TG3Units::Energy();
231 G4double py = particle->Py()*TG3Units::Energy();
232 G4double pz = particle->Pz()*TG3Units::Energy();
233 G4PrimaryParticle* primaryParticle
234 = new G4PrimaryParticle(particleDefinition, px, py, pz);
237 TVector3 polarization;
238 particle->GetPolarisation(polarization);
240 ->SetPolarization(polarization.X(), polarization.Y(), polarization.Z());
242 // add primary particle to the vertex
243 vertex->SetPrimary(primaryParticle);
249 void AliPrimaryGeneratorAction::GeneratePrimaries(G4Event* event)
251 // Generates primary particles by the selected generator.
255 gAlice->BeginEvent();
257 // fill particle gun/particle array
258 ConstructGenerator();
260 // generate primary vertices
261 if (fParticleArray) {
262 // use AliGenerator if set
263 GenerateAliGeneratorPrimaries(event);
265 // do not save primary particles
266 // (they would be stored twice)
267 AliTrackingAction* trackingAction
268 = AliTrackingAction::Instance();
269 trackingAction->SetSavePrimaries(false);
272 // use particle gun otherwise
273 fParticleGun->GeneratePrimaryVertex(event);
275 // primary particles have to be saved
276 AliTrackingAction* trackingAction
277 = AliTrackingAction::Instance();
278 trackingAction->SetSavePrimaries(true);
282 void AliPrimaryGeneratorAction::SetGenerator(AliPrimaryGenerator generator)
287 fGenerator = generator;
290 void AliPrimaryGeneratorAction::SetNofGunParticles(G4int nofParticles)
292 // Sets number of primary particles.
293 // This method is applied only to "gun" type generators
294 // (and not to AliGenerator from AliRoot).
297 fNofGunParticles = nofParticles;