ECCE @ EIC Software
Reference for
ECCE @ EIC
simulation and reconstruction software on GitHub
Home page
Related Pages
Modules
Namespaces
Classes
Files
External Links
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
G4GeneralParticleSource.cc
Go to the documentation of this file.
Or view
the newest version in sPHENIX GitHub for file G4GeneralParticleSource.cc
1
//
2
// ********************************************************************
3
// * License and Disclaimer *
4
// * *
5
// * The Geant4 software is copyright of the Copyright Holders of *
6
// * the Geant4 Collaboration. It is provided under the terms and *
7
// * conditions of the Geant4 Software License, included in the file *
8
// * LICENSE and available at http://cern.ch/geant4/license . These *
9
// * include a list of copyright holders. *
10
// * *
11
// * Neither the authors of this software system, nor their employing *
12
// * institutes,nor the agencies providing financial support for this *
13
// * work make any representation or warranty, express or implied, *
14
// * regarding this software system or assume any liability for its *
15
// * use. Please see the license in the file LICENSE and URL above *
16
// * for the full disclaimer and the limitation of liability. *
17
// * *
18
// * This code implementation is the result of the scientific and *
19
// * technical work of the GEANT4 collaboration. *
20
// * By using, copying, modifying or distributing the software (or *
21
// * any work based on the software) you agree to acknowledge its *
22
// * use in resulting scientific publications, and indicate your *
23
// * acceptance of all terms of the Geant4 Software license. *
24
// ********************************************************************
25
//
27
//
28
// MODULE: G4GeneralParticleSource.cc
29
//
30
// Version: 2.0
31
// Date: 5/02/04
32
// Author: Fan Lei
33
// Organisation: QinetiQ ltd.
34
// Customer: ESA/ESTEC
35
//
36
// Documentation avaialable at http://reat.space.qinetiq.com/gps
37
// These include:
38
// User Requirement Document (URD)
39
// Software Specification Documents (SSD)
40
// Software User Manual (SUM): on-line version available
41
// Technical Note (TN) on the physics and algorithms
42
//
44
//
45
// CHANGE HISTORY
46
// --------------
47
//
48
// Version 2.0, 05/02/2004, Fan Lei, Created.
49
// After changes to version 1.1 as in Geant4 v6.0
50
// - Mutilple particle source definition
51
// - Re-structured commands
52
// - Split the task into smaller classes
53
//
54
// - old commonds have been retained for backward compatibility, will be
55
// removed in the future.
56
//
57
// 25/03/2014, Andrew Green
58
// Various changes to use the new G4GeneralParticleSourceData class, mostly
59
// just transparent wrappers around the thread safe object.
60
//
62
//
63
#include "
G4Event.hh
"
64
#include "
Randomize.hh
"
65
#include "
G4GeneralParticleSource.hh
"
66
#include "
G4SingleParticleSource.hh
"
67
#include "
G4UnitsTable.hh
"
68
69
#include "
G4GeneralParticleSourceData.hh
"
70
71
#include "
G4Threading.hh
"
72
#include "
G4AutoLock.hh
"
73
74
namespace
{
75
G4Mutex
messangerInit =
G4MUTEX_INITIALIZER
;
76
}
77
78
G4GeneralParticleSource::G4GeneralParticleSource
() : normalised(
false
),
79
theMessenger(0)
80
{
81
GPSData
=
G4GeneralParticleSourceData::Instance
();
82
//currentSource = GPSData->GetCurrentSource();
83
//currentSourceIdx = G4int(GPSData->GetSourceVectorSize() - 1);
84
85
//Messenger is special, only a worker should instantiate it. Singleton pattern
86
theMessenger
=
G4GeneralParticleSourceMessenger::GetInstance
(
this
);
87
//Some initialization should be done only once
88
G4AutoLock
l(&messangerInit);
89
static
G4bool
onlyOnce =
false
;
90
if
( !onlyOnce ) {
91
theMessenger
->
SetParticleGun
(
GPSData
->
GetCurrentSource
());
92
IntensityNormalization
();
93
onlyOnce =
true
;
94
}
95
}
96
97
G4GeneralParticleSource::~G4GeneralParticleSource
()
98
{
99
theMessenger
->
Destroy
();
100
}
101
102
void
G4GeneralParticleSource::AddaSource
(
G4double
aV)
103
{
104
GPSData
->
Lock
();
105
GPSData
->
AddASource
(aV);
106
theMessenger
->
SetParticleGun
(
GPSData
->
GetCurrentSource
());
107
//TODO: But do we really normalize here after each source?
108
IntensityNormalization
();
109
GPSData
->
Unlock
();
110
}
111
112
void
G4GeneralParticleSource::IntensityNormalization
()
113
{
114
GPSData
->
IntensityNormalise
();
115
normalised
=
GPSData
->
Normalised
();
116
}
117
118
void
G4GeneralParticleSource::ListSource
()
119
{
120
G4cout
<<
"The number of particle sources is: "
<<
GPSData
->
GetIntensityVectorSize
() <<
G4endl
;
121
G4cout
<<
" Multiple Vertex sources: "
<<
GPSData
->
GetMultipleVertex
();
122
G4cout
<<
" Flat Sampling flag: "
<<
GPSData
->
GetFlatSampling
()<<
G4endl
;
123
const
G4int
currentIdx =
GPSData
->
GetCurrentSourceIdx
();
124
for
(
G4int
i=0; i<
GPSData
->
GetIntensityVectorSize
(); i++)
125
{
126
G4cout
<<
"\tsource "
<< i <<
" with intensity: "
<<
GPSData
->
GetIntensity
(i) <<
G4endl
;
127
const
G4SingleParticleSource
* thisSrc =
GPSData
->
GetCurrentSource
(i);
128
G4cout
<<
" \t\tNum Particles: "
<<thisSrc->
GetNumberOfParticles
()<<
"; Particle type: "
<<thisSrc->
GetParticleDefinition
()->
GetParticleName
()<<
G4endl
;
129
G4cout
<<
" \t\tEnergy: "
<<
G4BestUnit
(thisSrc->
GetParticleEnergy
(),
"Energy"
)<<
G4endl
;
130
G4cout
<<
" \t\tDirection: "
<<thisSrc->
GetAngDist
()->
GetDirection
()<<
"; Position: "
;
131
G4cout
<<
G4BestUnit
(thisSrc->
GetPosDist
()->
GetCentreCoords
(),
"Length"
)<<
G4endl
;
132
G4cout
<<
" \t\tAngular Distribution: "
<<thisSrc->
GetAngDist
()->
GetDistType
()<<
G4endl
;
133
G4cout
<<
" \t\tEnergy Distribution: "
<<thisSrc->
GetEneDist
()->
GetEnergyDisType
()<<
G4endl
;
134
G4cout
<<
" \t\tPosition Distribution Type: "
<<thisSrc->
GetPosDist
()->
GetPosDisType
();
135
G4cout
<<
"; Position Shape: "
<<thisSrc->
GetPosDist
()->
GetPosDisShape
()<<
G4endl
;
136
}
137
//Set back previous source
138
GPSData
->
GetCurrentSource
(currentIdx);
139
}
140
141
void
G4GeneralParticleSource::SetCurrentSourceto
(
G4int
aV)
142
{
143
G4int
id
= aV;
144
if
( id < GPSData->GetIntensityVectorSize() )
145
{
146
//currentSourceIdx = aV;
147
//currentSource = GPSData->GetCurrentSource(id);
148
theMessenger
->
SetParticleGun
(
GPSData
->
GetCurrentSource
(
id
));
149
}
150
else
151
{
152
G4ExceptionDescription
msg;
153
msg<<
"Trying to set source to index "
<<aV<<
" but only "
<<
GPSData
->
GetIntensityVectorSize
()<<
" sources are defined."
;
154
G4Exception
(
"G4GeneralParticleSoruce::SetCurrentSourceto"
,
"G4GPS004"
,
FatalException
,msg);
155
}
156
}
157
158
void
G4GeneralParticleSource::SetCurrentSourceIntensity
(
G4double
aV)
159
{
160
GPSData
->
Lock
();
161
GPSData
->
SetCurrentSourceIntensity
(aV);
162
GPSData
->
Unlock
();
163
normalised
=
GPSData
->
Normalised
();
164
}
165
166
void
G4GeneralParticleSource::ClearAll
()
167
{
168
GPSData
->
ClearSources
();
169
normalised
=
GPSData
->
Normalised
();
170
}
171
172
void
G4GeneralParticleSource::DeleteaSource
(
G4int
aV)
173
{
174
G4int
id
= aV;
175
if
( id <= GPSData->GetIntensityVectorSize() )
176
{
177
GPSData
->
DeleteASource
(aV);
178
normalised
=
GPSData
->
Normalised
();
179
}
180
else
181
{
182
G4cout
<<
" source index is invalid "
<<
G4endl
;
183
G4cout
<<
" it shall be <= "
<<
GPSData
->
GetIntensityVectorSize
() <<
G4endl
;
184
}
185
}
186
187
void
G4GeneralParticleSource::GeneratePrimaryVertex
(
G4Event
* evt)
188
{
189
if
(!
GPSData
->
GetMultipleVertex
())
190
{
191
G4SingleParticleSource
* currentSource =
GPSData
->
GetCurrentSource
();
192
if
(
GPSData
->
GetIntensityVectorSize
() > 1)
193
{
194
//Try to minimize locks
195
if
(!
normalised
) {
196
//According to local variable, normalization is needed
197
//Check with underlying shared resource, another
198
//thread could have already normalized this
199
GPSData
->
Lock
();
200
G4bool
norm
=
GPSData
->
Normalised
();
201
if
(!norm) {
202
IntensityNormalization
();
203
}
204
//This takes care of the case in which the local variable
205
//is False and the underlying resource is true.
206
normalised
=
GPSData
->
Normalised
();
207
GPSData
->
Unlock
();
208
}
209
G4double
rndm =
G4UniformRand
();
210
size_t
i = 0 ;
211
if
(!
GPSData
->
GetFlatSampling
() )
212
{
213
while
( rndm >
GPSData
->
GetSourceProbability
(i) ) i++;
214
currentSource =
GPSData
->
GetCurrentSource
(i);
215
}
216
else
217
{
218
i = size_t (
GPSData
->
GetIntensityVectorSize
()*rndm);
219
currentSource =
GPSData
->
GetCurrentSource
(i);
220
}
221
}
222
currentSource->
GeneratePrimaryVertex
(evt);
223
}
224
else
225
{
226
for
(
G4int
i = 0; i <
GPSData
->
GetIntensityVectorSize
(); i++)
227
{
228
GPSData
->
GetCurrentSource
(i)->
GeneratePrimaryVertex
(evt);
229
}
230
}
231
}
geant4
tree
geant4-10.6-release
source
event
src
G4GeneralParticleSource.cc
Built by
Jin Huang
. updated:
Wed Jun 29 2022 17:25:13
using
1.8.2 with
ECCE GitHub integration