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 AliParticleGun::AliParticleGun() {
18 fMessenger = new AliParticleGunMessenger(this);
21 AliParticleGun::AliParticleGun(const AliParticleGun& right)
24 fGunParticlesVector.clearAndDestroy();
25 for (G4int i=0; i<right.fGunParticlesVector.entries(); i++) {
26 AliGunParticle* rhsParticle = right.fGunParticlesVector[i];
27 AliGunParticle* newParticle = new AliGunParticle(*rhsParticle);
28 fGunParticlesVector.insert(newParticle);
31 fMessenger = new AliParticleGunMessenger(this);
34 AliParticleGun::~AliParticleGun() {
36 fGunParticlesVector.clearAndDestroy();
42 AliParticleGun& AliParticleGun::operator=(const AliParticleGun& right)
44 // check assignement to self
45 if (this == &right) return *this;
48 fGunParticlesVector.clearAndDestroy();
49 for (G4int i=0; i<right.fGunParticlesVector.entries(); i++) {
50 AliGunParticle* rhsParticle = right.fGunParticlesVector[i];
51 AliGunParticle* newParticle = new AliGunParticle(*rhsParticle);
52 fGunParticlesVector.insert(newParticle);
60 void AliParticleGun::AddParticle(AliGunParticle* particle)
65 fGunParticlesVector.insert(particle);
68 void AliParticleGun::RemoveParticle(G4int iParticle)
73 AliGunParticle* particle = fGunParticlesVector[iParticle];
74 fGunParticlesVector.remove(particle);
78 void AliParticleGun::GeneratePrimaryVertex(G4Event* event)
80 // Generates primary vertices.
83 G4PrimaryVertex* previousVertex = 0;
84 G4ThreeVector previousPosition = G4ThreeVector();
85 G4double previousTime = 0.;
87 G4int nofGunParticles = fGunParticlesVector.entries();
88 for( G4int i=0; i<nofGunParticles; i++ )
90 AliGunParticle* particle = fGunParticlesVector[i];
92 G4ParticleDefinition* particleDefinition
93 = particle->GetParticleDefinition();
94 if (particleDefinition==0) {
95 AliGlobals::Exception(
96 "AliParticleGun::GeneratePrimaryVertex: Unknown particle definition.");
99 G4ThreeVector position = particle->GetPosition();
100 G4double time = particle->GetTime();
101 G4PrimaryVertex* vertex;
102 if ( i==0 || position != previousPosition || time != previousTime ) {
103 // create a new vertex
104 // in case position and time of gun particle are different from
106 // (vertex objects are destroyed in G4EventManager::ProcessOneEvent()
107 // when event is deleted)
108 vertex = new G4PrimaryVertex(position, time);
109 event->AddPrimaryVertex(vertex);
111 previousVertex = vertex;
112 previousPosition = position;
116 vertex = previousVertex;
118 // create a primary particle and add it to the vertex
119 // (primaryParticle objects are destroyed in G4EventManager::ProcessOneEvent()
120 // when event and then vertex is deleted)
121 G4double px = particle->GetMomentum().x();
122 G4double py = particle->GetMomentum().y();
123 G4double pz = particle->GetMomentum().z();
124 G4PrimaryParticle* primaryParticle
125 = new G4PrimaryParticle(particleDefinition, px, py, pz);
127 G4double mass = particleDefinition->GetPDGMass();
128 primaryParticle->SetMass(mass);
129 primaryParticle->SetPolarization(particle->GetPolarization().x(),
130 particle->GetPolarization().y(),
131 particle->GetPolarization().z());
133 vertex->SetPrimary(primaryParticle);
136 // delete gun particles
137 fGunParticlesVector.clearAndDestroy();
140 G4cout << "AliParticleGun::GeneratePrimaryVertex:" << G4endl;
142 << event->GetNumberOfPrimaryVertex() << " of primary vertices,"
143 << " " << nofGunParticles << " of primary particles " << G4endl;
146 void AliParticleGun::Reset()
148 // Resets the particle gun.
151 fGunParticlesVector.clearAndDestroy();
154 void AliParticleGun::List()
156 // Lists the particle gun.
159 G4int nofGunParticles = fGunParticlesVector.entries();
161 G4cout << "Particle Gun: " << G4endl;
163 if (nofGunParticles==0)
164 { G4cout << " No particles are defined." << G4endl; }
167 for (G4int i=0; i<nofGunParticles; i++)
169 G4cout << i << " th particle properties: " << G4endl;
170 G4cout << "============================" << G4endl;
171 fGunParticlesVector[i]->Print();