]> git.uio.no Git - u/mrichter/AliRoot.git/blob - AliGeant4/AliParticleGun.cxx
Merging the VirtualMC branch to the main development branch (HEAD)
[u/mrichter/AliRoot.git] / AliGeant4 / AliParticleGun.cxx
1 // $Id$
2 // Category: event
3 //
4 // Author: I. Hrivnacova
5 //
6 // Class AliParticleGun
7 // --------------------
8 // See the class description in the header file.
9
10 #include "AliParticleGun.h"
11 #include "AliParticleGunMessenger.h"
12 #include "AliGunParticle.h"
13 #include "AliGlobals.h"
14
15 #include <G4ParticleDefinition.hh>
16 #include <G4PrimaryParticle.hh>
17 #include <G4PrimaryVertex.hh>
18 #include <G4Event.hh>
19
20 //_____________________________________________________________________________
21 AliParticleGun::AliParticleGun() 
22   : G4VPrimaryGenerator(),
23     AliVerbose("particleGun"),
24     fMessenger(this) {
25 //
26 }
27
28 //_____________________________________________________________________________
29 AliParticleGun::AliParticleGun(const AliParticleGun& right)
30   : G4VPrimaryGenerator(right),
31     AliVerbose("particleGun"),
32     fMessenger(this)
33 {
34   // copy stuff
35   *this = right;
36 }
37
38 //_____________________________________________________________________________
39 AliParticleGun::~AliParticleGun() {
40 //
41   // delete gun particles
42   Reset();
43 }
44
45 // operators
46
47 //_____________________________________________________________________________
48 AliParticleGun& AliParticleGun::operator=(const AliParticleGun& right)
49 {
50   // check assignement to self
51   if (this == &right) return *this;
52
53   // base class assignment
54   this->G4VPrimaryGenerator::operator=(right);
55
56   // delete gun particles
57   Reset();
58
59   // copy  gun particles
60   GunParticleConstIterator it;
61   for (it = (right.fGunParticleVector).begin();
62        it != (right.fGunParticleVector).end(); it++)
63     fGunParticleVector.push_back(new AliGunParticle(**it));
64
65   return *this;  
66 }
67   
68 // public methods
69
70 //_____________________________________________________________________________
71 void AliParticleGun::AddParticle(AliGunParticle* particle)
72
73 // Adds particle.
74 // ---
75
76   fGunParticleVector.push_back(particle); 
77 }
78
79 //_____________________________________________________________________________
80 void AliParticleGun::RemoveParticle(G4int iParticle)
81
82 // Removes particle.
83 // ---
84
85   GunParticleIterator it = fGunParticleVector.begin();
86   it += iParticle;
87   //advance(it,iParticle);
88    
89   delete *it;
90   fGunParticleVector.erase(it); 
91 }
92
93 //_____________________________________________________________________________
94 void AliParticleGun::GeneratePrimaryVertex(G4Event* event)
95 {
96 // Generates primary vertices.
97 // ---
98
99   G4PrimaryVertex* previousVertex = 0;
100   G4ThreeVector previousPosition = G4ThreeVector(); 
101   G4double previousTime = 0.; 
102
103   GunParticleIterator it;
104   for (it = fGunParticleVector.begin(); it != fGunParticleVector.end(); it++) {    
105
106     AliGunParticle* particle = *it;
107
108     G4ParticleDefinition* particleDefinition
109       = particle->GetParticleDefinition();
110     if (particleDefinition==0) {
111       AliGlobals::Exception(
112         "AliParticleGun::GeneratePrimaryVertex: Unknown particle definition.");
113     }   
114
115     G4ThreeVector position = particle->GetPosition(); 
116     G4double time = particle->GetTime(); 
117     G4PrimaryVertex* vertex;
118     if (it == fGunParticleVector.begin() || 
119         position != previousPosition || time != previousTime ) {   
120       // create a new vertex 
121       // in case position and time of gun particle are different from 
122       // previous values
123       // (vertex objects are destroyed in G4EventManager::ProcessOneEvent()
124       // when event is deleted)  
125       vertex = new G4PrimaryVertex(position, time);
126       event->AddPrimaryVertex(vertex);
127
128       previousVertex = vertex;
129       previousPosition = position;
130       previousTime = time;
131     }
132     else 
133       vertex = previousVertex;
134
135     // create a primary particle and add it to the vertex
136     // (primaryParticle objects are destroyed in G4EventManager::ProcessOneEvent()
137     // when event and then vertex is deleted)
138     G4double px = particle->GetMomentum().x();
139     G4double py = particle->GetMomentum().y();
140     G4double pz = particle->GetMomentum().z();
141     G4PrimaryParticle* primaryParticle 
142       = new G4PrimaryParticle(particleDefinition, px, py, pz);
143       
144     G4double mass =  particleDefinition->GetPDGMass();
145     primaryParticle->SetMass(mass);
146     primaryParticle->SetPolarization(particle->GetPolarization().x(),
147                                      particle->GetPolarization().y(),
148                                      particle->GetPolarization().z());    
149     
150     vertex->SetPrimary(primaryParticle);
151   }
152   
153   if (VerboseLevel() > 0) {
154     G4cout << "AliParticleGun::GeneratePrimaryVertex:" << G4endl;
155     G4cout << "   " 
156            << event->GetNumberOfPrimaryVertex()  << " of primary vertices,"
157            << "   " << fGunParticleVector.size() << " of primary particles " 
158            << G4endl;  
159   }        
160
161   // delete gun particles
162   Reset();
163 }
164
165 //_____________________________________________________________________________
166 void AliParticleGun::Reset()
167
168 // Resets the particle gun.
169 // ---
170
171   GunParticleIterator it;
172   for (it = fGunParticleVector.begin(); it != fGunParticleVector.end(); it++)
173     delete *it;
174
175   fGunParticleVector.clear(); 
176 }
177
178 //_____________________________________________________________________________
179 void AliParticleGun::List()
180 {
181 // Lists the particle gun.
182 // ---
183
184   G4cout << "Particle Gun: " << G4endl;
185
186   if (fGunParticleVector.size() == 0) 
187     G4cout << "   No particles are defined." << G4endl; 
188   else {
189     G4int i = 0;
190     GunParticleIterator it;
191     for (it = fGunParticleVector.begin(); 
192          it != fGunParticleVector.end(); it++) {    
193          
194       G4cout << i++ << " th particle properties: " << G4endl;
195       G4cout << "============================" << G4endl;
196       (*it)->Print();
197     }
198   }
199 }
200