]> git.uio.no Git - u/mrichter/AliRoot.git/blame - AliGeant4/AliParticleGun.cxx
Ali/Lego/SensitiveDetector, AliSingle/MoreModulesConstruction update, AliSDManager...
[u/mrichter/AliRoot.git] / AliGeant4 / AliParticleGun.cxx
CommitLineData
676fb573 1// $Id$
2// Category: event
3//
4// See the class description in the header file.
5
6#include "AliParticleGun.h"
7#include "AliParticleGunMessenger.h"
c97337f9 8#include "AliGunParticle.h"
676fb573 9#include "AliGlobals.h"
10
c97337f9 11#include <G4ParticleDefinition.hh>
676fb573 12#include <G4PrimaryParticle.hh>
c97337f9 13#include <G4PrimaryVertex.hh>
676fb573 14#include <G4Event.hh>
676fb573 15
78ca1e9c 16//_____________________________________________________________________________
676fb573 17AliParticleGun::AliParticleGun() {
18//
19 fMessenger = new AliParticleGunMessenger(this);
20}
21
78ca1e9c 22//_____________________________________________________________________________
676fb573 23AliParticleGun::AliParticleGun(const AliParticleGun& right)
58c0119e 24 : G4VPrimaryGenerator(right)
676fb573 25{
58c0119e 26 // allocation
676fb573 27 fMessenger = new AliParticleGunMessenger(this);
58c0119e 28
29 // copy stuff
30 *this = right;
676fb573 31}
32
78ca1e9c 33//_____________________________________________________________________________
676fb573 34AliParticleGun::~AliParticleGun() {
35//
36 fGunParticlesVector.clearAndDestroy();
37 delete fMessenger;
38}
39
40// operators
41
78ca1e9c 42//_____________________________________________________________________________
676fb573 43AliParticleGun& AliParticleGun::operator=(const AliParticleGun& right)
44{
45 // check assignement to self
46 if (this == &right) return *this;
47
58c0119e 48 // base class assignment
49 this->G4VPrimaryGenerator::operator=(right);
50
676fb573 51 // particles vector
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);
57 }
58c0119e 58
676fb573 59 return *this;
60}
61
62// public methods
63
78ca1e9c 64//_____________________________________________________________________________
676fb573 65void AliParticleGun::AddParticle(AliGunParticle* particle)
66{
67// Adds particle.
68// ---
69
70 fGunParticlesVector.insert(particle);
71}
72
78ca1e9c 73//_____________________________________________________________________________
676fb573 74void AliParticleGun::RemoveParticle(G4int iParticle)
75{
76// Removes particle.
77// ---
78
79 AliGunParticle* particle = fGunParticlesVector[iParticle];
80 fGunParticlesVector.remove(particle);
81 delete particle;
82}
83
78ca1e9c 84//_____________________________________________________________________________
676fb573 85void AliParticleGun::GeneratePrimaryVertex(G4Event* event)
86{
87// Generates primary vertices.
88// ---
89
90 G4PrimaryVertex* previousVertex = 0;
91 G4ThreeVector previousPosition = G4ThreeVector();
92 G4double previousTime = 0.;
93
94 G4int nofGunParticles = fGunParticlesVector.entries();
95 for( G4int i=0; i<nofGunParticles; i++ )
96 {
97 AliGunParticle* particle = fGunParticlesVector[i];
98
99 G4ParticleDefinition* particleDefinition
100 = particle->GetParticleDefinition();
101 if (particleDefinition==0) {
102 AliGlobals::Exception(
103 "AliParticleGun::GeneratePrimaryVertex: Unknown particle definition.");
104 }
105
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
112 // previous values
113 // (vertex objects are destroyed in G4EventManager::ProcessOneEvent()
114 // when event is deleted)
115 vertex = new G4PrimaryVertex(position, time);
116 event->AddPrimaryVertex(vertex);
117
118 previousVertex = vertex;
119 previousPosition = position;
120 previousTime = time;
121 }
122 else
123 vertex = previousVertex;
124
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);
133
134 G4double mass = particleDefinition->GetPDGMass();
135 primaryParticle->SetMass(mass);
136 primaryParticle->SetPolarization(particle->GetPolarization().x(),
137 particle->GetPolarization().y(),
138 particle->GetPolarization().z());
139
140 vertex->SetPrimary(primaryParticle);
141 }
142
143 // delete gun particles
144 fGunParticlesVector.clearAndDestroy();
145
146 // add verbose
5f1d09c5 147 G4cout << "AliParticleGun::GeneratePrimaryVertex:" << G4endl;
676fb573 148 G4cout << " "
149 << event->GetNumberOfPrimaryVertex() << " of primary vertices,"
5f1d09c5 150 << " " << nofGunParticles << " of primary particles " << G4endl;
676fb573 151}
152
78ca1e9c 153//_____________________________________________________________________________
676fb573 154void AliParticleGun::Reset()
155{
156// Resets the particle gun.
157// ---
158
159 fGunParticlesVector.clearAndDestroy();
160}
161
78ca1e9c 162//_____________________________________________________________________________
676fb573 163void AliParticleGun::List()
164{
165// Lists the particle gun.
166// ---
167
168 G4int nofGunParticles = fGunParticlesVector.entries();
169
5f1d09c5 170 G4cout << "Particle Gun: " << G4endl;
676fb573 171
172 if (nofGunParticles==0)
5f1d09c5 173 { G4cout << " No particles are defined." << G4endl; }
676fb573 174 else
175 {
176 for (G4int i=0; i<nofGunParticles; i++)
177 {
5f1d09c5 178 G4cout << i << " th particle properties: " << G4endl;
179 G4cout << "============================" << G4endl;
676fb573 180 fGunParticlesVector[i]->Print();
181 }
182 }
183}
184