4 // See the class description in the header file.
6 #include "AliParticleGun.h"
7 #include "AliParticleGunMessenger.h"
8 #include "AliGunParticle.h"
9 #include "AliGlobals.h"
11 #include <G4ParticleDefinition.hh>
12 #include <G4PrimaryParticle.hh>
13 #include <G4PrimaryVertex.hh>
16 //_____________________________________________________________________________
17 AliParticleGun::AliParticleGun() {
19 fMessenger = new AliParticleGunMessenger(this);
22 //_____________________________________________________________________________
23 AliParticleGun::AliParticleGun(const AliParticleGun& right)
24 : G4VPrimaryGenerator(right)
27 fMessenger = new AliParticleGunMessenger(this);
33 //_____________________________________________________________________________
34 AliParticleGun::~AliParticleGun() {
36 fGunParticlesVector.clearAndDestroy();
42 //_____________________________________________________________________________
43 AliParticleGun& AliParticleGun::operator=(const AliParticleGun& right)
45 // check assignement to self
46 if (this == &right) return *this;
48 // base class assignment
49 this->G4VPrimaryGenerator::operator=(right);
52 fGunParticlesVector.clearAndDestroy();
53 for (G4int i=0; i<right.fGunParticlesVector.entries(); i++) {
54 AliGunParticle* rhsParticle = right.fGunParticlesVector[i];
55 AliGunParticle* newParticle = new AliGunParticle(*rhsParticle);
56 fGunParticlesVector.insert(newParticle);
64 //_____________________________________________________________________________
65 void AliParticleGun::AddParticle(AliGunParticle* particle)
70 fGunParticlesVector.insert(particle);
73 //_____________________________________________________________________________
74 void AliParticleGun::RemoveParticle(G4int iParticle)
79 AliGunParticle* particle = fGunParticlesVector[iParticle];
80 fGunParticlesVector.remove(particle);
84 //_____________________________________________________________________________
85 void AliParticleGun::GeneratePrimaryVertex(G4Event* event)
87 // Generates primary vertices.
90 G4PrimaryVertex* previousVertex = 0;
91 G4ThreeVector previousPosition = G4ThreeVector();
92 G4double previousTime = 0.;
94 G4int nofGunParticles = fGunParticlesVector.entries();
95 for( G4int i=0; i<nofGunParticles; i++ )
97 AliGunParticle* particle = fGunParticlesVector[i];
99 G4ParticleDefinition* particleDefinition
100 = particle->GetParticleDefinition();
101 if (particleDefinition==0) {
102 AliGlobals::Exception(
103 "AliParticleGun::GeneratePrimaryVertex: Unknown particle definition.");
106 G4ThreeVector position = particle->GetPosition();
107 G4double time = particle->GetTime();
108 G4PrimaryVertex* vertex;
109 if ( i==0 || position != previousPosition || time != previousTime ) {
110 // create a new vertex
111 // in case position and time of gun particle are different from
113 // (vertex objects are destroyed in G4EventManager::ProcessOneEvent()
114 // when event is deleted)
115 vertex = new G4PrimaryVertex(position, time);
116 event->AddPrimaryVertex(vertex);
118 previousVertex = vertex;
119 previousPosition = position;
123 vertex = previousVertex;
125 // create a primary particle and add it to the vertex
126 // (primaryParticle objects are destroyed in G4EventManager::ProcessOneEvent()
127 // when event and then vertex is deleted)
128 G4double px = particle->GetMomentum().x();
129 G4double py = particle->GetMomentum().y();
130 G4double pz = particle->GetMomentum().z();
131 G4PrimaryParticle* primaryParticle
132 = new G4PrimaryParticle(particleDefinition, px, py, pz);
134 G4double mass = particleDefinition->GetPDGMass();
135 primaryParticle->SetMass(mass);
136 primaryParticle->SetPolarization(particle->GetPolarization().x(),
137 particle->GetPolarization().y(),
138 particle->GetPolarization().z());
140 vertex->SetPrimary(primaryParticle);
143 // delete gun particles
144 fGunParticlesVector.clearAndDestroy();
147 G4cout << "AliParticleGun::GeneratePrimaryVertex:" << G4endl;
149 << event->GetNumberOfPrimaryVertex() << " of primary vertices,"
150 << " " << nofGunParticles << " of primary particles " << G4endl;
153 //_____________________________________________________________________________
154 void AliParticleGun::Reset()
156 // Resets the particle gun.
159 fGunParticlesVector.clearAndDestroy();
162 //_____________________________________________________________________________
163 void AliParticleGun::List()
165 // Lists the particle gun.
168 G4int nofGunParticles = fGunParticlesVector.entries();
170 G4cout << "Particle Gun: " << G4endl;
172 if (nofGunParticles==0)
173 { G4cout << " No particles are defined." << G4endl; }
176 for (G4int i=0; i<nofGunParticles; i++)
178 G4cout << i << " th particle properties: " << G4endl;
179 G4cout << "============================" << G4endl;
180 fGunParticlesVector[i]->Print();