4 // See the class description in the header file.
6 #include "AliParticleGun.h"
7 #include "AliParticleGunMessenger.h"
8 #include "AliGlobals.h"
10 #include <G4PrimaryParticle.hh>
15 AliParticleGun::AliParticleGun() {
17 fMessenger = new AliParticleGunMessenger(this);
20 AliParticleGun::AliParticleGun(const AliParticleGun& right)
23 fGunParticlesVector.clearAndDestroy();
24 for (G4int i=0; i<right.fGunParticlesVector.entries(); i++) {
25 AliGunParticle* rhsParticle = right.fGunParticlesVector[i];
26 AliGunParticle* newParticle = new AliGunParticle(*rhsParticle);
27 fGunParticlesVector.insert(newParticle);
30 fMessenger = new AliParticleGunMessenger(this);
33 AliParticleGun::~AliParticleGun() {
35 fGunParticlesVector.clearAndDestroy();
41 AliParticleGun& AliParticleGun::operator=(const AliParticleGun& right)
43 // check assignement to self
44 if (this == &right) return *this;
47 fGunParticlesVector.clearAndDestroy();
48 for (G4int i=0; i<right.fGunParticlesVector.entries(); i++) {
49 AliGunParticle* rhsParticle = right.fGunParticlesVector[i];
50 AliGunParticle* newParticle = new AliGunParticle(*rhsParticle);
51 fGunParticlesVector.insert(newParticle);
59 void AliParticleGun::AddParticle(AliGunParticle* particle)
64 fGunParticlesVector.insert(particle);
67 void AliParticleGun::RemoveParticle(G4int iParticle)
72 AliGunParticle* particle = fGunParticlesVector[iParticle];
73 fGunParticlesVector.remove(particle);
77 void AliParticleGun::GeneratePrimaryVertex(G4Event* event)
79 // Generates primary vertices.
82 G4PrimaryVertex* previousVertex = 0;
83 G4ThreeVector previousPosition = G4ThreeVector();
84 G4double previousTime = 0.;
86 G4int nofGunParticles = fGunParticlesVector.entries();
87 for( G4int i=0; i<nofGunParticles; i++ )
89 AliGunParticle* particle = fGunParticlesVector[i];
91 G4ParticleDefinition* particleDefinition
92 = particle->GetParticleDefinition();
93 if (particleDefinition==0) {
94 AliGlobals::Exception(
95 "AliParticleGun::GeneratePrimaryVertex: Unknown particle definition.");
98 G4ThreeVector position = particle->GetPosition();
99 G4double time = particle->GetTime();
100 G4PrimaryVertex* vertex;
101 if ( i==0 || position != previousPosition || time != previousTime ) {
102 // create a new vertex
103 // in case position and time of gun particle are different from
105 // (vertex objects are destroyed in G4EventManager::ProcessOneEvent()
106 // when event is deleted)
107 vertex = new G4PrimaryVertex(position, time);
108 event->AddPrimaryVertex(vertex);
110 previousVertex = vertex;
111 previousPosition = position;
115 vertex = previousVertex;
117 // create a primary particle and add it to the vertex
118 // (primaryParticle objects are destroyed in G4EventManager::ProcessOneEvent()
119 // when event and then vertex is deleted)
120 G4double px = particle->GetMomentum().x();
121 G4double py = particle->GetMomentum().y();
122 G4double pz = particle->GetMomentum().z();
123 G4PrimaryParticle* primaryParticle
124 = new G4PrimaryParticle(particleDefinition, px, py, pz);
126 G4double mass = particleDefinition->GetPDGMass();
127 primaryParticle->SetMass(mass);
128 primaryParticle->SetPolarization(particle->GetPolarization().x(),
129 particle->GetPolarization().y(),
130 particle->GetPolarization().z());
132 vertex->SetPrimary(primaryParticle);
135 // delete gun particles
136 fGunParticlesVector.clearAndDestroy();
139 G4cout << "AliParticleGun::GeneratePrimaryVertex:" << G4endl;
141 << event->GetNumberOfPrimaryVertex() << " of primary vertices,"
142 << " " << nofGunParticles << " of primary particles " << G4endl;
145 void AliParticleGun::Reset()
147 // Resets the particle gun.
150 fGunParticlesVector.clearAndDestroy();
153 void AliParticleGun::List()
155 // Lists the particle gun.
158 G4int nofGunParticles = fGunParticlesVector.entries();
160 G4cout << "Particle Gun: " << G4endl;
162 if (nofGunParticles==0)
163 { G4cout << " No particles are defined." << G4endl; }
166 for (G4int i=0; i<nofGunParticles; i++)
168 G4cout << i << " th particle properties: " << G4endl;
169 G4cout << "============================" << G4endl;
170 fGunParticlesVector[i]->Print();