Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4FastSimulationManager.cc
Go to the documentation of this file.
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//
26//
27// $Id$
28//
29//---------------------------------------------------------------
30//
31// G4FastSimulationManager.cc
32//
33// Description:
34// Manages the Fast Simulation models attached to a envelope.
35//
36// History:
37// Oct 97: Verderi && MoraDeFreitas - First Implementation.
38// ...
39// May 07: Move to parallel world scheme
40//
41//---------------------------------------------------------------
42
45#include "G4PVPlacement.hh"
47
48// --------------------------------------------------
49// Constructor with envelope and IsUnique flag :
50// --------------------------------------------------
51//
54 G4bool IsUnique) :
55 fFastTrack(anEnvelope,IsUnique),fTriggedFastSimulationModel(0),
56 fLastCrossedParticle(0)
57{
58 // Communicates to the region that it becomes a
59 // envelope and with this fast simulation manager.
60 anEnvelope->SetFastSimulationManager(this);
61
62 // Add itself to the GlobalFastSimulationManager
64 AddFastSimulationManager(this);
65}
66
67// -----------
68// Destructor:
69// -----------
71{
72 //
73 // Check out the Envelope about this pointer. If in use,
74 // resets the Logical Volume IsEnvelope flag to avoid clash.
75 //
76 if(fFastTrack.GetEnvelope()->GetFastSimulationManager()==this)
78 // Remove itself from the GlobalFastSimulationManager
80 RemoveFastSimulationManager(this);
81}
82
83// ---------------------------------------
84// Methods to activate/inactivate models
85//----------------------------------------
86
89{
90 size_t iModel;
91
92 // If the model is already active, do nothing.
93 for (iModel=0; iModel<ModelList.size(); iModel++)
94 if(ModelList[iModel]->GetName() == aName)
95 return true;
96
97 // Look for in the fInactivatedModels list, if found push_back it back to
98 // the ModelList
99 for (iModel=0; iModel<fInactivatedModels.size(); iModel++)
100 if(fInactivatedModels[iModel]->GetName() == aName) {
101 ModelList.
102 push_back (fInactivatedModels.removeAt(iModel));
103 // forces the fApplicableModelList to be rebuild
104 fLastCrossedParticle=0;
105 return true;
106 }
107 return false;
108}
109
110G4bool
112{
113 // Look for in the ModelList, if found remove from it and keep the pointer
114 // on the fInactivatedModels list.
115 for (size_t iModel=0; iModel<ModelList.size(); iModel++)
116 if(ModelList[iModel]->GetName() == aName) {
117 fInactivatedModels.
118 push_back (ModelList.removeAt(iModel));
119 // forces the fApplicableModelList to be rebuild
120 fLastCrossedParticle=0;
121 return true;
122 }
123 return false;
124}
125
128 const G4VFastSimulationModel* previousFound,
129 bool &foundPrevious) const
130{
131 G4VFastSimulationModel* model = 0;
132 for (size_t iModel=0; iModel<ModelList.size(); iModel++)
133 {
134 if(ModelList[iModel]->GetName() == modelName)
135 {
136 if (previousFound == 0)
137 {
138 model = ModelList[iModel];
139 break;
140 }
141 else
142 {
143 if (ModelList[iModel] == previousFound)
144 {
145 foundPrevious = true;
146 continue;
147 }
148 if (foundPrevious)
149 {
150 model = ModelList[iModel];
151 break;
152 }
153 }
154 }
155 }
156 return model;
157}
158
159
160//------------------------------------------------------------------
161// Interface trigger method for the G4ParameterisationManagerProcess
162//------------------------------------------------------------------
163// G4bool GetFastSimulationManagerTrigger(const G4Track &);
164//
165// This method is used to interface the G4FastSimulationManagerProcess
166// with the user Fast Simulation Models. It's called when the particle
167// is inside the envelope.
168//
169// It :
170//
171// 1) initialises the private members (fFastTrack and so
172// on);
173// 2) loops on the IsApplicable() methods to find out the
174// ones should be applied.
175// 2) for these, loops on the ModelTrigger() methods to find out
176// perhaps one that must be applied just now.
177//
178// If the a Fast Simulation Model is triggered then it returns
179// true, false otherwise.
180//
181//-----------------------------------------------------------
182G4bool
185 const G4Navigator* theNavigator)
186{
187 size_t iModel;
188
189 // If particle type changed re-build the fApplicableModelList.
190 if(fLastCrossedParticle!=track.GetDefinition()) {
191 fLastCrossedParticle=track.GetDefinition();
192 fApplicableModelList.clear();
193 // If Model List is empty, do nothing !
194 if(ModelList.size()==0) return false;
195 for (iModel=0; iModel<ModelList.size(); iModel++)
196 if(ModelList[iModel]->IsApplicable(*(track.GetDefinition())))
197 fApplicableModelList.push_back (ModelList[iModel]);
198 }
199
200 // If Applicable Model List is empty, do nothing !
201 if(fApplicableModelList.size()==0) return false;
202
203 // -- Register current track
204 fFastTrack.SetCurrentTrack(track,theNavigator);
205
206 // tests if particle are on the boundary and leaving,
207 // in this case do nothing !
208 if(fFastTrack.OnTheBoundaryButExiting()) return false;
209
210 // Loops on the ModelTrigger() methods
211 for (iModel=0; iModel<fApplicableModelList.size(); iModel++)
212
213 //---------------------------------------------------
214 // Asks the ModelTrigger method if it must be trigged now.
215 //---------------------------------------------------
216
217 if(fApplicableModelList[iModel]->ModelTrigger(fFastTrack)) {
218 //--------------------------------------------------
219 // The model will be applied. Initializes the G4FastStep
220 // with the current state of the G4Track and
221 // same usefull parameters.
222 // In particular it does SetLocalEnergyDeposit(0.0).
223 //--------------------------------------------------
224 fFastStep.Initialize(fFastTrack);
225
226 // Keeps the FastSimulationModel pointer to call the
227 // DoIt() method.
228 fTriggedFastSimulationModel=fApplicableModelList[iModel];
229 return true;
230 }
231
232 //--------------------------------------------
233 // Nobody asks to gain control, returns false
234 //--------------------------------------------
235 return false;
236}
237
239{
240 // const G4FastTrack& parFastTrack=fFastTrack;
241 fTriggedFastSimulationModel->DoIt(fFastTrack,fFastStep);
242 return &fFastStep;
243}
244
245// -------------------------------------------------------------
246// -- Mostly the same as above, in the case of AtRest particles:
247// -------------------------------------------------------------
248G4bool
250 const G4Navigator* theNavigator)
251{
252 size_t iModel;
253
254 // If particle type changed re-build the fApplicableModelList.
255 if(fLastCrossedParticle!=track.GetDefinition()) {
256 fLastCrossedParticle=track.GetDefinition();
257 fApplicableModelList.clear();
258 // If Model List is empty, do nothing !
259 if(ModelList.size()==0) return false;
260 for (iModel=0; iModel<ModelList.size(); iModel++)
261 if(ModelList[iModel]->IsApplicable(*(track.GetDefinition())))
262 fApplicableModelList.push_back (ModelList[iModel]);
263 }
264
265 // If Applicable Model List is empty, do nothing !
266 if(fApplicableModelList.size()==0) return false;
267
268 // -- Register current track
269 fFastTrack.SetCurrentTrack(track,theNavigator);
270
271 // -- (note: compared to the PostStepGetFastSimulationManagerTrigger,
272 // -- the test to see if the particle is on the boundary but leaving
273 // -- is irrelevant here)
274
275 // Loops on the models to see if one of them wants to trigger:
276 for (iModel=0; iModel < fApplicableModelList.size(); iModel++)
277 if(fApplicableModelList[iModel]->AtRestModelTrigger(fFastTrack))
278 {
279 fFastStep.Initialize(fFastTrack);
280 fTriggedFastSimulationModel=fApplicableModelList[iModel];
281 return true;
282 }
283
284 //--------------------------------------------
285 // Nobody asks to gain control, returns false
286 //--------------------------------------------
287 return false;
288}
289
291{
292 fTriggedFastSimulationModel->AtRestDoIt(fFastTrack,fFastStep);
293 return &fFastStep;
294}
295
296void
298{
299 G4cout << fFastTrack.GetEnvelope()->GetName();
300 // if(GhostPlacements.size()!=0) G4cout << " (ghost)";
302 else G4cout << " (// geom.)";
303
304}
305
306void
308{
309 size_t iModel;
310
311 G4cout << "Current Models for the ";
312 ListTitle();
313 G4cout << " envelope:\n";
314
315 for (iModel=0; iModel<ModelList.size(); iModel++)
316 G4cout << " " << ModelList[iModel]->GetName() << "\n";
317
318 for (iModel=0; iModel<fInactivatedModels.size(); iModel++)
319 G4cout << " " << fInactivatedModels[iModel]->GetName()
320 << "(inactivated)\n";
321}
322
323void
325{
326 size_t iModel;
327 G4int titled = 0;
328 G4ParticleTable* theParticleTable=
330
331 // Active Models
332 for (iModel=0; iModel<ModelList.size(); iModel++)
333 if(ModelList[iModel]->GetName() == aName ||
334 aName == "all" ) {
335 if(!(titled++)){
336 G4cout << "In the envelope ";
337 ListTitle();
338 G4cout << ",\n";
339 }
340 G4cout << " the model " << ModelList[iModel]->GetName()
341 << " is applicable for :\n ";
342
343 G4int list_started=0;
344 for (G4int iParticle=0; iParticle<theParticleTable->entries();
345 iParticle++)
346 if(ModelList[iModel]->
347 IsApplicable(*(theParticleTable->
348 GetParticle(iParticle)))) {
349 if(list_started++) G4cout << ", ";
350 G4cout << theParticleTable->
351 GetParticle(iParticle)->GetParticleName();
352 }
353 G4cout <<G4endl;
354 }
355
356 // Inactive Models
357 for (iModel=0; iModel<fInactivatedModels.size(); iModel++)
358 if(fInactivatedModels[iModel]->GetName() == aName ||
359 aName == "all" ) {
360 if(!(titled++)){
361 G4cout << "In the envelope ";
362 ListTitle();
363 G4cout << ",\n";
364 }
365 G4cout << " the model " << fInactivatedModels[iModel]->GetName()
366 << " (inactivated) is applicable for :\n ";
367
368 G4int list_started=0;
369 for (G4int iParticle=0; iParticle<theParticleTable->entries();
370 iParticle++)
371 if(fInactivatedModels[iModel]->
372 IsApplicable(*(theParticleTable->
373 GetParticle(iParticle)))) {
374 if(list_started++) G4cout << ", ";
375 G4cout << theParticleTable->
376 GetParticle(iParticle)->GetParticleName();
377 }
378 G4cout <<G4endl;
379 }
380}
381
382void
384{
385 size_t iModel;
386 G4bool unique=true;
387
388 // Active Models
389 for (iModel=0; iModel<ModelList.size(); iModel++)
390 if(ModelList[iModel]->IsApplicable(*aPD)) {
391 G4cout << "Envelope ";
392 ListTitle();
393 G4cout << ", Model "
394 << ModelList[iModel]->GetName()
395 << "." << G4endl;
396 }
397 // inactive Models
398 for (iModel=0; iModel<fInactivatedModels.size(); iModel++)
399 if(fInactivatedModels[iModel]->IsApplicable(*aPD)) {
400 G4cout << "Envelope ";
401 ListTitle();
402 G4cout << ", Model "
403 << fInactivatedModels[iModel]->GetName()
404 << " (inactivated)." << G4endl;
405 }
406
407 if( !unique )
408 {
410 ed << "Two or more Models are available for the same particle type, in the same envelope/region." << G4endl;
411 G4Exception("G4FastSimulationManager::ListModels(const G4ParticleDefinition* aPD) const",
412 "FastSim001",
413 JustWarning, ed,
414 "Models risk to exclude each other.");
415 }
416 unique=false;
417}
@ JustWarning
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
G4FastSimulationManager(G4Envelope *anEnvelope, G4bool IsUnique=FALSE)
G4VParticleChange * InvokePostStepDoIt()
G4VParticleChange * InvokeAtRestDoIt()
G4bool PostStepGetFastSimulationManagerTrigger(const G4Track &, const G4Navigator *a=0)
G4bool AtRestGetFastSimulationManagerTrigger(const G4Track &, const G4Navigator *a=0)
G4bool ActivateFastSimulationModel(const G4String &)
G4VFastSimulationModel * GetFastSimulationModel(const G4String &modelName, const G4VFastSimulationModel *previousFound, bool &foundPrevious) const
G4bool InActivateFastSimulationModel(const G4String &)
void Initialize(const G4FastTrack &)
Definition: G4FastStep.cc:53
G4Envelope * GetEnvelope() const
Definition: G4FastTrack.hh:188
G4bool OnTheBoundaryButExiting() const
Definition: G4FastTrack.hh:243
void SetCurrentTrack(const G4Track &, const G4Navigator *a=0)
Definition: G4FastTrack.cc:68
static G4GlobalFastSimulationManager * GetGlobalFastSimulationManager()
G4VPhysicalVolume * GetWorldVolume() const
G4int entries() const
const G4String & GetParticleName(G4int index)
static G4ParticleTable * GetParticleTable()
G4FastSimulationManager * GetFastSimulationManager() const
G4VPhysicalVolume * GetWorldPhysical() const
const G4String & GetName() const
void SetFastSimulationManager(G4FastSimulationManager *fsm)
void ClearFastSimulationManager()
Definition: G4Region.cc:355
G4ParticleDefinition * GetDefinition() const
static G4TransportationManager * GetTransportationManager()
G4Navigator * GetNavigatorForTracking() const
virtual void DoIt(const G4FastTrack &, G4FastStep &)=0
virtual void AtRestDoIt(const G4FastTrack &, G4FastStep &)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
std::ostringstream G4ExceptionDescription
Definition: globals.hh:76