Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4ProcessTable.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// G4ProcessTable class implementation
27//
28// Author: H.Kurashige, 4 August 1998
29// --------------------------------------------------------------------
30
32#include "G4ProcessTable.hh"
33#include "G4ParticleTable.hh"
34#include "G4ios.hh"
35
36// --------------------------------------------------------------------
37// Static class variable: ptr to single instance of class in a thread
38G4ThreadLocal G4ProcessTable* G4ProcessTable::fProcessTable = nullptr;
39
40// --------------------------------------------------------------------
41// Default constructor
42//
44{
45#ifdef G4VERBOSE
46 if (verboseLevel>1)
47 {
48 G4cout << "-- G4ProcessTable constructor --" << G4endl;
49 }
50#endif
51 fProcTblVector = new G4ProcTableVector();
52 fProcNameVector = new G4ProcNameVector();
53 tmpTblVector = new G4ProcTableVector();
54 fProcTblMessenger = new G4ProcessTableMessenger(this);
55}
56
57// --------------------------------------------------------------------
58// Destructor
59//
61{
62 if ( tmpTblVector != nullptr )
63 {
64 tmpTblVector ->clear();
65 delete tmpTblVector;
66 tmpTblVector = nullptr;
67 }
68
69 if ( fProcTblVector != nullptr )
70 {
71 for (auto elem : *fProcTblVector)
72 {
73 delete elem;
74 }
75 fProcTblVector ->clear();
76 delete fProcTblVector;
77 fProcTblVector = nullptr;
78 }
79
80 // delete all process except transportation
81 for(auto proc : fListProcesses)
82 {
83 if ( proc != nullptr )
84 {
85 G4ProcessType type = proc->GetProcessType();
86 if (type != fTransportation && type != fParallel
87 && type != fParameterisation)
88 {
89 delete proc;
90 }
91 }
92 }
93
94 fListProcesses.clear();
95
96 if ( fProcNameVector != nullptr )
97 {
98 fProcNameVector ->clear();
99 delete fProcNameVector;
100 fProcNameVector = nullptr;
101 }
102 fProcessTable = nullptr;
103 delete fProcTblMessenger;
104}
105
106// --------------------------------------------------------------------
107//
109{
110 if(fProcessTable == nullptr)
111 {
113 fProcessTable = inst.Instance();
114 }
115 return fProcessTable;
116}
117
118// --------------------------------------------------------------------
119//
121 G4ProcessManager* aProcMgr)
122{
123 if ( (aProcess == nullptr) || ( aProcMgr == nullptr ) || !fProcTblVector )
124 {
125#ifdef G4VERBOSE
126 if (verboseLevel>0)
127 {
128 G4cout << "G4ProcessTable::Insert() - arguments are null pointer "
129 << aProcess << "," << aProcMgr << G4endl;
130 }
131#endif
132 return -1;
133 }
134
135#ifdef G4VERBOSE
136 if (verboseLevel>1)
137 {
138 G4cout << "G4ProcessTable::Insert() -";
139 G4cout << " Process[" << aProcess->GetProcessName() << "]";
140 G4cout << " Particle[" << aProcMgr->GetParticleType()->GetParticleName()
141 << "]" << G4endl;
142 }
143#endif
144
145 G4int idxTbl = 0;
146 G4int nidx = (G4int)fProcTblVector->size();
147 G4ProcTblElement* anElement = nullptr;
148 // loop over all elements
149 for (; idxTbl < nidx; ++idxTbl)
150 {
151 anElement = (*fProcTblVector)[idxTbl];
152 if(!anElement) { continue; }
153 // check if this process is included
154 if (aProcess == anElement->GetProcess())
155 {
156 // add the process manager into the element
157 // unless this process manager is included
158 if (!anElement->Contains(aProcMgr))
159 {
160 anElement->Insert(aProcMgr);
161#ifdef G4VERBOSE
162 if (verboseLevel>2)
163 {
164 G4cout << " This Process Manager is registered !! " << G4endl;
165 }
166#endif
167 }
168 return idxTbl;
169 }
170 }
171 // add this process into the table by creating a new element
172 if (verboseLevel>2)
173 {
174 G4cout << " New element is created !! " << G4endl;
175 }
176 anElement = new G4ProcTblElement(aProcess);
177 anElement->Insert(aProcMgr);
178 fProcTblVector->push_back(anElement);
179 fProcNameVector->push_back(aProcess->GetProcessName() );
180 return nidx;
181}
182
183// --------------------------------------------------------------------
184//
186 G4ProcessManager* aProcMgr )
187{
188 if ( (aProcess == nullptr) || ( aProcMgr == nullptr ) || !fProcTblVector )
189 {
190#ifdef G4VERBOSE
191 if (verboseLevel>0)
192 {
193 G4cout << "G4ProcessTable::Remove() - arguments are null pointer "
194 << G4endl;
195 }
196#endif
197 return -1;
198 }
199
200#ifdef G4VERBOSE
201 if (verboseLevel>1)
202 {
203 G4cout << "G4ProcessTable::Remove() -";
204 G4cout << " Process[" << aProcess->GetProcessName() << "]";
205 G4cout << " Particle[" << aProcMgr->GetParticleType()->GetParticleName()
206 << "]" << G4endl;
207 }
208#endif
209
210 G4int idxTbl = 0;
211 G4int nidx = (G4int)fProcTblVector->size();
212 G4ProcTblElement* anElement =nullptr;
213 // loop over all elements
214 for (; idxTbl < nidx; ++idxTbl)
215 {
216 anElement = (*fProcTblVector)[idxTbl];
217 if(!anElement) { continue; }
218
219 // check if this process is included
220 if (aProcess == anElement->GetProcess())
221 {
222 if(anElement->Contains(aProcMgr))
223 {
224 // remove the process manager from the element
225 anElement->Remove(aProcMgr);
226#ifdef G4VERBOSE
227 if (verboseLevel>2)
228 {
229 G4cout << " This Process Manager is removed !! " << G4endl;
230 }
231#endif
232 if(anElement->Length() == 0)
233 {
234 delete anElement;
235 (*fProcTblVector)[idxTbl] = nullptr;
236#ifdef G4VERBOSE
237 if (verboseLevel>1)
238 {
239 G4cout << " This Process is removed !! " << G4endl;
240 }
241#endif
242 }
243 return idxTbl;
244 }
245 }
246 }
247#ifdef G4VERBOSE
248 if (verboseLevel>1)
249 {
250 G4cout << " This Process Manager is not registered to the process!! "
251 << G4endl;
252 }
253#endif
254 return -1;
255}
256
257// --------------------------------------------------------------------
258//
260{
261 for(auto proc : fListProcesses)
262 {
263 if(ptr == proc) { return; }
264 }
265 fListProcesses.push_back(ptr);
266}
267
268// --------------------------------------------------------------------
269//
271{
272 std::size_t nn = fListProcesses.size();
273 for(std::size_t i=0; i<nn; ++i)
274 {
275 if(ptr == fListProcesses[i])
276 {
277 fListProcesses[i] = nullptr;
278 return;
279 }
280 }
281}
282
283// --------------------------------------------------------------------
284//
286 const G4String& particleName) const
287{
288 return FindProcess(processName,
289 G4ParticleTable::GetParticleTable()->FindParticle(particleName));
290}
291
292// --------------------------------------------------------------------
293//
295 const G4ProcessManager* processManager)
296 const
297{
298 for (auto anElement : *fProcTblVector)
299 {
300 // check name and if the processManage is included
301 if (anElement && anElement->GetProcessName() == processName
302 && anElement->Contains(processManager))
303 {
304 return anElement->GetProcess();
305 }
306 }
307#ifdef G4VERBOSE
308 if (verboseLevel > 1)
309 {
310 G4cout << " G4ProcessTable::FindProcess() -" ;
311 G4cout << " The Process[" << processName << "] is not found ";
312 G4cout << " for [" << processManager->GetParticleType()->GetParticleName()
313 << "]" << G4endl;
314 }
315#endif
316 return nullptr;
317}
318
319// --------------------------------------------------------------------
320//
323 const G4ParticleDefinition* particle) const
324{
325 // find the first process of given type for this particle
326
327 const G4ProcessManager* processManager = particle->GetProcessManager();
328 for (auto anElement : *fProcTblVector)
329 {
330 if (anElement && anElement->GetProcess()->GetProcessType() == processType
331 && anElement->Contains(processManager))
332 {
333 return anElement->GetProcess();
334 }
335 }
336#ifdef G4VERBOSE
337 if (verboseLevel > 1)
338 {
339 G4cout << " G4ProcessTable::FindProcess() -";
340 G4cout << " The Process Type " << processType << " is not found ";
341 G4cout << " for [" << particle->GetParticleName() << "]" << G4endl;
342 }
343#endif
344 return nullptr;
345}
346
347// --------------------------------------------------------------------
348//
351 const G4ParticleDefinition* particle) const
352{
353 // find the first process of given type for this particle
354
355 const G4ProcessManager* processManager = particle->GetProcessManager();
356 for (auto anElement : *fProcTblVector)
357 {
358 if ( anElement != nullptr
359 && anElement->GetProcess()->GetProcessSubType() == procSubType
360 && anElement->Contains(processManager) )
361 {
362 return anElement->GetProcess();
363 }
364 }
365#ifdef G4VERBOSE
366 if (verboseLevel > 1)
367 {
368 G4cout << " G4ProcessTable::FindProcess() -";
369 G4cout << " The Process SubType " << procSubType << " is not found ";
370 G4cout << " for [" << particle->GetParticleName() << "]" << G4endl;
371 }
372#endif
373 return nullptr;
374}
375
376// --------------------------------------------------------------------
377//
379G4ProcessTable::Find(const G4String& processName)
380{
381 tmpTblVector->clear();
382
383 G4bool isFound = false;
384 G4ProcTblElement* anElement = nullptr;
385 for (auto itr=fProcTblVector->cbegin(); itr!=fProcTblVector->cend(); ++itr)
386 {
387 anElement = (*itr);
388 // check name
389 if ( anElement != nullptr && anElement->GetProcessName() == processName )
390 {
391 isFound = true;
392 tmpTblVector->push_back(anElement);
393 }
394 }
395
396 if (!isFound && verboseLevel>0)
397 {
398#ifdef G4VERBOSE
399 G4cout << " G4ProcessTable::Find() -" ;
400 G4cout << " The Process[" << processName << "] is not found " << G4endl;
401#endif
402 }
403
404 return tmpTblVector;
405}
406
407// --------------------------------------------------------------------
408//
410G4ProcessTable::Find(G4ProcessType processType)
411{
412 tmpTblVector->clear();
413
414 G4bool isFound = false;
415 G4ProcTblElement* anElement = nullptr;
416 for (auto itr=fProcTblVector->cbegin(); itr!=fProcTblVector->cend(); ++itr)
417 {
418 anElement = (*itr);
419 // check name
420 if ( anElement != nullptr && anElement->GetProcess()->GetProcessType() == processType )
421 {
422 isFound = true;
423 tmpTblVector->push_back(anElement);
424 }
425 }
426
427 if (!isFound && verboseLevel>0)
428 {
429#ifdef G4VERBOSE
430 G4cout << " G4ProcessTable::Find() -" ;
431 G4cout << " The ProcessType[" << processType << "] is not found "
432 << G4endl;
433#endif
434 }
435
436 return tmpTblVector;
437}
438
439// --------------------------------------------------------------------
440//
442G4ProcessTable::ExtractProcesses(G4ProcTableVector* procTblVector) const
443{
444 G4ProcessVector* procList = new G4ProcessVector();
445 // loop over all elements
446 for (auto itr=procTblVector->cbegin(); itr!=procTblVector->cend(); ++itr)
447 {
448 G4ProcTblElement* anElement = (*itr);
449 if ( anElement != nullptr) procList->insert( anElement->GetProcess() );
450 }
451 return procList;
452}
453
454// --------------------------------------------------------------------
455//
457 const G4String& particleName,
458 G4bool fActive )
459{
460 if (particleName == "ALL" )
461 {
462 SetProcessActivation( processName, fActive);
463 }
464 else
465 {
466 SetProcessActivation(processName,
467 G4ParticleTable::GetParticleTable()->FindParticle(particleName),
468 fActive );
469 }
470}
471
472// --------------------------------------------------------------------
473//
475 const G4String& particleName ,
476 G4bool fActive)
477{
478 if ((particleName == "ALL" ) || (particleName == "all" ))
479 {
480 SetProcessActivation( processType, fActive );
481 }
482 else
483 {
484 SetProcessActivation(processType,
485 G4ParticleTable::GetParticleTable()->FindParticle(particleName),
486 fActive );
487 }
488}
489
490// --------------------------------------------------------------------
491//
493 G4bool fActive )
494{
495#ifdef G4VERBOSE
496 if (verboseLevel>1)
497 {
498 G4cout << " G4ProcessTable::SetProcessActivation() -" ;
499 G4cout << " The Process[" << processName << "] "<< G4endl;
500 }
501#endif
502
503 G4ProcTableVector* pTblVector = Find(processName);
504 G4ProcTblElement* anElement;
505 // loop over all elements
506 for (auto itr=pTblVector->cbegin(); itr!=pTblVector->cend(); ++itr)
507 {
508 anElement = (*itr);
509 if ( anElement == nullptr ) continue;
510 G4VProcess* process = anElement->GetProcess();
511 for (G4int idx = 0 ; idx < anElement->Length(); ++idx)
512 {
513 G4ProcessManager* manager = anElement->GetProcessManager(idx);
514 manager->SetProcessActivation(process, fActive);
515#ifdef G4VERBOSE
516 if (verboseLevel>1)
517 {
518 G4cout << " for " << manager->GetParticleType()->GetParticleName();
519 G4cout << " Index = " << manager->GetProcessIndex(process);
520 G4cout << G4endl;
521 }
522#endif
523 }
524 }
525}
526
527// --------------------------------------------------------------------
528//
530 G4ProcessManager* processManager,
531 G4bool fActive )
532{
533#ifdef G4VERBOSE
534 if (verboseLevel>1)
535 {
536 G4cout << " G4ProcessTable::SetProcessActivation() -" ;
537 G4cout << " The Process[" << processName << "] "<< G4endl;
538 }
539#endif
540
541 G4VProcess* process = FindProcess( processName, processManager);
542 if ( process != nullptr)
543 {
544 processManager->SetProcessActivation(process, fActive);
545#ifdef G4VERBOSE
546 if (verboseLevel>1)
547 {
548 G4cout << " for "
549 << processManager->GetParticleType()->GetParticleName();
550 G4cout << " Index = "
551 << processManager->GetProcessIndex(process) << G4endl;
552 }
553#endif
554 }
555}
556
557// --------------------------------------------------------------------
558//
560 G4bool fActive )
561{
562#ifdef G4VERBOSE
563 if (verboseLevel>1)
564 {
565 G4cout << " G4ProcessTable::SetProcessActivation() -" ;
566 G4cout << " The ProcessType[" << G4int(processType) << "] "<< G4endl;
567 }
568#endif
569
570 G4ProcTableVector* pTblVector = Find(processType);
571 G4ProcTblElement* anElement;
572 // loop over all elements
573 for (auto itr=pTblVector->cbegin(); itr!=pTblVector->cend(); ++itr)
574 {
575 anElement = (*itr);
576 if ( anElement == nullptr ) continue;
577 G4VProcess* process = anElement->GetProcess();
578#ifdef G4VERBOSE
579 if (verboseLevel>1)
580 {
581 G4cout << " The Process[" << process->GetProcessName()<< "] "<< G4endl;
582 }
583#endif
584 for (G4int idx = 0 ; idx < anElement->Length(); ++idx)
585 {
586 G4ProcessManager* manager = anElement->GetProcessManager(idx);
587 manager->SetProcessActivation(process, fActive);
588#ifdef G4VERBOSE
589 if (verboseLevel>1)
590 {
591 G4cout << " for " << manager->GetParticleType()->GetParticleName();
592 G4cout << " Index = " << manager->GetProcessIndex(process) << G4endl;
593 }
594#endif
595 }
596 }
597}
598
599// --------------------------------------------------------------------
600//
602 G4ProcessManager* processManager,
603 G4bool fActive )
604{
605#ifdef G4VERBOSE
606 if (verboseLevel>1)
607 {
608 G4cout << " G4ProcessTable::SetProcessActivation() -" ;
609 G4cout << " The ProcessType[" << G4int(processType) << "] "<< G4endl;
610 }
611#endif
612
613 G4ProcessVector* procList = processManager->GetProcessList();
614 for (G4int idx = 0; idx < (G4int)procList->length(); ++idx)
615 {
616 G4VProcess* process = (*procList)(idx);
617 if ( process->GetProcessType() == processType)
618 {
619 processManager->SetProcessActivation(process, fActive);
620#ifdef G4VERBOSE
621 if (verboseLevel>1)
622 {
623 G4cout << " The Process[" << process->GetProcessName()<< "] "<< G4endl;
624 G4cout << " for "
625 << processManager->GetParticleType()->GetParticleName();
626 G4cout << " Index = " << idx << G4endl;
627 }
628#endif
629 }
630 }
631}
632
633// --------------------------------------------------------------------
634//
636 const G4ParticleDefinition* particle)
637{
638 G4int idxTbl=0;
639 G4ProcTblElement* anElement = nullptr;
640 G4bool isFoundInTbl = false;
641 G4ProcessManager* manager = nullptr;
642 G4int idx;
643 // loop over all elements
644 for (auto itr=fProcTblVector->cbegin();
645 itr!=fProcTblVector->cend(); ++itr, ++idxTbl)
646 {
647 anElement = (*itr);
648 if ( anElement == nullptr ) continue;
649 if (process == anElement->GetProcess() )
650 {
651 if (particle != nullptr)
652 {
653 for (idx=0; idx<anElement->Length(); ++idx)
654 {
655 manager = anElement->GetProcessManager(idx);
656 if (particle == manager->GetParticleType())
657 {
658 isFoundInTbl = true;
659 break;
660 }
661 }
662 }
663 else
664 {
665 isFoundInTbl = true;
666 }
667 break;
668 }
669 }
670 if (!isFoundInTbl ) return;
671
672 G4int tmpVerbose = process->GetVerboseLevel();
673 process->SetVerboseLevel(verboseLevel);
674 process->DumpInfo();
675 process->SetVerboseLevel(tmpVerbose);
676 if (particle == nullptr)
677 {
678 for (idx=0; idx<anElement->Length(); ++idx)
679 {
680 manager = anElement->GetProcessManager(idx);
681 G4cout << " for " << manager->GetParticleType()->GetParticleName();
682 G4cout << G4endl;
683#ifdef G4VERBOSE
684 if (verboseLevel >2)
685 {
686 tmpVerbose = manager->GetVerboseLevel();
687 manager->SetVerboseLevel(verboseLevel);
688 manager->DumpInfo();
689 manager->SetVerboseLevel(tmpVerbose);
690 }
691#endif
692 }
693 }
694 else
695 {
696 G4cout << " for " << manager->GetParticleType()->GetParticleName();
697 G4cout << G4endl;
698#ifdef G4VERBOSE
699 if (verboseLevel >2)
700 {
701 tmpVerbose = manager->GetVerboseLevel();
702 manager->SetVerboseLevel(verboseLevel);
703 manager->DumpInfo();
704 manager->SetVerboseLevel(tmpVerbose);
705 }
706#endif
707 }
708}
#define elem(i, j)
G4ProcessType
@ fParameterisation
@ fParallel
@ fTransportation
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
G4ProcessManager * GetProcessManager() const
const G4String & GetParticleName() const
static G4ParticleTable * GetParticleTable()
const G4String & GetProcessName() const
G4VProcess * GetProcess() const
G4bool Contains(const G4ProcessManager *pManager) const
void Remove(G4ProcessManager *aProcMgr)
G4int Length() const
G4ProcessManager * GetProcessManager(G4int index) const
void Insert(G4ProcessManager *aProcMgr)
G4VProcess * GetProcess(const G4String &) const
G4VProcess * SetProcessActivation(G4VProcess *aProcess, G4bool fActive)
G4ParticleDefinition * GetParticleType() const
void SetVerboseLevel(G4int value)
G4ProcessVector * GetProcessList() const
G4int GetProcessIndex(G4VProcess *) const
G4int GetVerboseLevel() const
G4ProcessTable(const G4ProcessTable &)=delete
void DumpInfo(G4VProcess *process, const G4ParticleDefinition *particle=nullptr)
static G4ProcessTable * GetProcessTable()
G4VProcess * FindProcess(const G4String &processName, const G4String &particleName) const
G4int Insert(G4VProcess *aProcess, G4ProcessManager *aProcMgr)
void RegisterProcess(G4VProcess *)
void DeRegisterProcess(G4VProcess *)
G4int Remove(G4VProcess *aProcess, G4ProcessManager *aProcMgr)
void SetProcessActivation(const G4String &processName, G4bool fActive)
std::vector< G4ProcTblElement * > G4ProcTableVector
std::vector< G4String > G4ProcNameVector
G4bool insert(G4VProcess *aProcess)
std::size_t length() const
void SetVerboseLevel(G4int value)
Definition: G4VProcess.hh:416
G4int GetVerboseLevel() const
Definition: G4VProcess.hh:422
G4ProcessType GetProcessType() const
Definition: G4VProcess.hh:392
virtual void DumpInfo() const
Definition: G4VProcess.cc:173
const G4String & GetProcessName() const
Definition: G4VProcess.hh:386
#define G4ThreadLocal
Definition: tls.hh:77