Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
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//
27// $Id$
28//
29//
30// ------------------------------------------------------------
31// GEANT 4 class header file
32//
33// History: first implementation, based on object model of
34// 4th Aug 1998, H.Kurashige
35// ------------------------------------------------------------
36// History:
37// Use STL vector instead of RW vector 1. Mar 00 H.Kurashige
38//
39
41#include "G4ProcessTable.hh"
42
43// constructor //////////////////////////
45{
46#ifdef G4VERBOSE
47 if (verboseLevel>1){
48 G4cout << "-- G4ProcessTable constructor --" << G4endl;
49 }
50#endif
51 fProcTblVector = new G4ProcTableVector();
52 fProcNameVector = new G4ProcNameVector();
53 tmpTblVector = new G4ProcTableVector();
54 fProcTblMessenger = 0;
55}
56
57// copy constructor //////////////////////////
59 :verboseLevel(1)
60{
61 fProcTblVector = 0;
62 fProcNameVector = 0;
63 tmpTblVector = 0;
64 fProcTblMessenger = 0;
65#ifdef G4VERBOSE
66 if (verboseLevel>0){
67 G4cout << "-- G4ProcessTable copy constructor --" << G4endl;
68 }
69#endif
70}
71
72// destructor //////////////////////////
74{
75#ifdef G4VERBOSE
76 if (verboseLevel>1){
77 G4cout << "-- G4ProcessTable destructor --" << G4endl;
78 }
79#endif
80
81 if ( tmpTblVector != 0) {
82 tmpTblVector ->clear();
83 delete tmpTblVector;
84 }
85
86 if ( fProcTblVector != 0) {
87 G4ProcTableVector::iterator idx;
88
89 // destruction of processes has moved to G4VUserPhysicsList
90 for (idx=fProcTblVector->begin(); idx!=fProcTblVector->end(); ++idx) {
91 // delete all processes
92 // delete (*idx)->GetProcess();
93 delete (*idx);
94 }
95 fProcTblVector ->clear();
96 delete fProcTblVector;
97 }
98
99 if ( fProcNameVector != 0) {
100 fProcNameVector ->clear();
101 delete fProcNameVector;
102 }
103 fProcessTable =0;
104}
105
106/////////////////////////
108{
109 if (fProcTblMessenger == 0) {
110 fProcTblMessenger = new G4ProcessTableMessenger(this);
111 }
112 return fProcTblMessenger;
113}
114
115/////////////////////////
117{
118 if (fProcTblMessenger != 0) {
119 delete fProcTblMessenger;
120 }
121}
122
123
124//////////////////////////
125G4ProcessTable & G4ProcessTable::operator=(const G4ProcessTable &right)
126{
127 verboseLevel = right.verboseLevel;
128#ifdef G4VERBOSE
129 if (verboseLevel>0){
130 G4cout << "-- G4ProcessTable assignment operator --" << G4endl;
131 }
132#endif
133 if (&right == this) return *this;
134 else return *this;
135}
136
137//////////////////////////
138G4int G4ProcessTable::operator==(const G4ProcessTable &right) const
139{
140 return (this == &right);
141}
142
143//////////////////////////
144G4int G4ProcessTable::operator!=(const G4ProcessTable &right) const
145{
146 return (this != &right);
147}
148
149// Static class variable: ptr to single instance of class
150G4ProcessTable* G4ProcessTable::fProcessTable =0;
151
152
153//////////////////////////
155{
156 static G4ProcessTable theProcessTable;
157 if (!fProcessTable){
158 fProcessTable = &theProcessTable;
159 }
160 return fProcessTable;
161}
162
163//////////////////////////
165 G4ProcessManager* aProcMgr)
166{
167 if ( (aProcess == 0) || ( aProcMgr == 0 ) ){
168#ifdef G4VERBOSE
169 if (verboseLevel>0){
170 G4cout << "G4ProcessTable::Insert : arguments are 0 pointer "
171 <<aProcess <<","<< aProcMgr << G4endl;
172 }
173#endif
174 return -1;
175 }
176
177#ifdef G4VERBOSE
178 if (verboseLevel>1){
179 G4cout << "G4ProcessTable::Insert ";
180 G4cout << " Process[" << aProcess->GetProcessName() << "]";
181 G4cout << " Particle[" << aProcMgr->GetParticleType()->GetParticleName() << "]";
182 G4cout << G4endl;
183 }
184#endif
185
186 G4ProcTableVector::iterator itr;
187 G4int idxTbl=0;
188 G4ProcTblElement* anElement;
189 G4bool isFoundInTbl = false;
190 // loop over all elements
191 for (itr=fProcTblVector->begin(); itr!=fProcTblVector->end(); ++itr, ++idxTbl) {
192 anElement = (*itr);
193 // check if this process is included
194 if (aProcess == anElement->GetProcess()) {
195 isFoundInTbl = true;
196
197 // add the process manager into the element
198 // unless this process manager is included
199 if (!anElement->Contains(aProcMgr)) {
200 anElement->Insert(aProcMgr);
201#ifdef G4VERBOSE
202 if (verboseLevel>2){
203 G4cout << " This Process Manager is registered !! " << G4endl;
204 }
205#endif
206 }
207 break;
208 }
209 }
210 // add this process into the table by creating a new element
211 if (!isFoundInTbl) {
212 G4ProcTblElement* newElement = new G4ProcTblElement(aProcess);
213 newElement->Insert(aProcMgr);
214 fProcTblVector->push_back(newElement);
215 // add into name vector
216 G4ProcNameVector::iterator ip;
217 G4bool isFound = false;
218 for (ip=fProcNameVector->begin(); ip!=fProcNameVector->end(); ++ip) {
219 isFound |= (aProcess->GetProcessName() == (*ip));
220 }
221 if (!isFound) {
222 fProcNameVector->push_back(aProcess->GetProcessName() );
223#ifdef G4VERBOSE
224 if (verboseLevel>2){
225 G4cout << " This Process is registered !! " << G4endl;
226 }
227#endif
228 }
229 }
230 return idxTbl;
231}
232
233//////////////////////////
235 G4ProcessManager* aProcMgr)
236{
237 if ( (aProcess == 0) || ( aProcMgr == 0 ) ){
238#ifdef G4VERBOSE
239 if (verboseLevel>0){
240 G4cout << "G4ProcessTable::Remove : arguments are 0 pointer "<< G4endl;
241 }
242#endif
243 return -1;
244 }
245
246#ifdef G4VERBOSE
247 if (verboseLevel>1){
248 G4cout << "G4ProcessTable::Remove ";
249 G4cout << " Process[" << aProcess->GetProcessName() << "]";
250 G4cout << " Particle[" << aProcMgr->GetParticleType()->GetParticleName() << "]" << G4endl;
251 }
252#endif
253
254 G4ProcTableVector::iterator itr;
255 G4int idxTbl=0;
256 G4ProcTblElement* anElement=0;
257 G4bool isFound = false;
258 // loop over all elements
259 for (itr=fProcTblVector->begin(); itr!=fProcTblVector->end(); ++itr, ++idxTbl) {
260 anElement = (*itr);
261
262 // check if this process is included
263 if (aProcess == anElement->GetProcess()) {
264 isFound = anElement->Contains(aProcMgr);
265 // remove the process manager from the element
266 anElement->Remove(aProcMgr);
267#ifdef G4VERBOSE
268 if (verboseLevel>2){
269 G4cout << " This Process Manager is removed !! " << G4endl;
270 }
271#endif
272 break;
273 }
274 }
275 //
276 if (!isFound) {
277#ifdef G4VERBOSE
278 if (verboseLevel>0){
279 G4cout << " This Process Manager is not registered !! " << G4endl;
280 }
281#endif
282 return -1;
283 }
284 // remove the element if it has no entry
285 if (anElement->Length() == 0){
286 fProcTblVector->erase(itr);
287 delete anElement;
288 // check other prcesses with same name exist or not
289 G4bool isSameName = false;
290 for (itr=fProcTblVector->begin(); itr!=fProcTblVector->end(); ++itr) {
291 anElement = (*itr);
292 if (anElement->GetProcessName() == aProcess->GetProcessName()) {
293 isSameName = true;
294 break;
295 }
296 }
297 // remove from name vector
298 if (!isSameName ) {
299 G4ProcNameVector::iterator i;
300 for (i=fProcNameVector->begin(); i!=fProcNameVector->end(); ++i) {
301 if ( *i == aProcess->GetProcessName() ) {
302 fProcNameVector->erase(i);
303 break;
304 }
305 }
306 }
307#ifdef G4VERBOSE
308 if (verboseLevel>1){
309 G4cout << " This Process is removed !! " << G4endl;
310 }
311#endif
312 }
313 return idxTbl;
314}
315
316//////////////////////////
318 const G4ProcessManager* processManager)
319 const
320{
321 G4ProcTableVector::iterator itr;
322 G4int idxTbl = 0;
323 G4bool isFound = false;
324 G4ProcTblElement* anElement=0;
325 for (itr=fProcTblVector->begin(); itr!=fProcTblVector->end(); ++itr, ++idxTbl) {
326 anElement = (*itr);
327 // check name
328 if ( anElement->GetProcessName() == processName ) {
329 // check if the processManage is included
330 if ( anElement->Contains(processManager) ) {
331 isFound = true;
332 break;
333 }
334 }
335 }
336#ifdef G4VERBOSE
337 if (!isFound && verboseLevel>1){
338 G4cout << " G4ProcessTable::FindProcess :" ;
339 G4cout << " The Process[" << processName << "] is not found ";
340 G4cout << " for " << processManager->GetParticleType()->GetParticleName() << G4endl;
341 }
342#endif
343
344 if (isFound) return anElement->GetProcess();
345 else return 0;
346}
347
348///////////////
349G4ProcessTable::G4ProcTableVector* G4ProcessTable::Find(
350 G4ProcTableVector*,
351 const G4String& processName )
352{
353 tmpTblVector->clear();
354
355 G4ProcTableVector::iterator itr;
356 G4bool isFound = false;
357 G4ProcTblElement* anElement=0;
358 for (itr=fProcTblVector->begin(); itr!=fProcTblVector->end(); ++itr) {
359 anElement = (*itr);
360 // check name
361 if ( anElement->GetProcessName() == processName ) {
362 isFound = true;
363 tmpTblVector->push_back(anElement);
364 }
365 }
366
367#ifdef G4VERBOSE
368 if (!isFound && verboseLevel>0){
369 G4cout << " G4ProcessTable::Find :" ;
370 G4cout << " The Process[" << processName << "] is not found " << G4endl;
371 }
372#endif
373
374 return tmpTblVector;
375
376}
377///////////////
378G4ProcessTable::G4ProcTableVector* G4ProcessTable::Find(
379 G4ProcTableVector*,
380 G4ProcessType processType )
381{
382 tmpTblVector->clear();
383
384 G4ProcTableVector::iterator itr;
385 G4bool isFound = false;
386 G4ProcTblElement* anElement=0;
387 for (itr=fProcTblVector->begin(); itr!=fProcTblVector->end(); ++itr) {
388 anElement = (*itr);
389 // check name
390 if ( anElement->GetProcess()->GetProcessType() == processType ) {
391 isFound = true;
392 tmpTblVector->push_back(anElement);
393 }
394 }
395
396#ifdef G4VERBOSE
397 if (!isFound && verboseLevel>0){
398 G4cout << " G4ProcessTable::Find :" ;
399 G4cout << " The ProcessType[" << processType << "] is not found " << G4endl;
400 }
401#endif
402
403 return tmpTblVector;
404
405}
406
407///////////////
408G4ProcessVector* G4ProcessTable::ExtractProcesses( G4ProcTableVector* procTblVector)
409{
410 G4ProcessVector* procList = new G4ProcessVector();
411 G4ProcTableVector::iterator itr;
412 // loop over all elements
413 for (itr=procTblVector->begin(); itr!=procTblVector->end(); ++itr) {
414 G4ProcTblElement* anElement = (*itr);
415 procList->insert( anElement->GetProcess() );
416 }
417 return procList;
418}
419
420///////////////
422{
423 return ExtractProcesses(fProcTblVector);
424}
425
426///////////////
428{
429 G4ProcessVector* procList = pManager->GetProcessList();
430 return new G4ProcessVector(*procList);
431}
432
433///////////////
435{
436 G4ProcTableVector* pTblVector = Find(fProcTblVector, processName);
437 return ExtractProcesses(pTblVector);
438}
439
440///////////////
442{
443 G4ProcTableVector* pTblVector = Find(fProcTblVector, processType);
444 return ExtractProcesses(pTblVector);
445}
446
447///////////////
449 G4bool fActive )
450{
451#ifdef G4VERBOSE
452 if (verboseLevel>1){
453 G4cout << " G4ProcessTable::SetProcessActivation:" ;
454 G4cout << " The Process[" << processName << "] "<< G4endl;
455 }
456#endif
457
458 G4ProcTableVector* pTblVector = Find(fProcTblVector, processName);
459 G4ProcTableVector::iterator itr;
460 G4ProcTblElement* anElement;
461 // loop over all elements
462 for (itr=pTblVector->begin(); itr!=pTblVector->end(); ++itr) {
463 anElement = (*itr);
464 G4VProcess* process = anElement->GetProcess();
465 for (G4int idx = 0 ; idx < anElement->Length(); idx++) {
466 G4ProcessManager* manager = anElement->GetProcessManager(idx);
467 manager->SetProcessActivation(process, fActive);
468#ifdef G4VERBOSE
469 if (verboseLevel>1){
470 G4cout << " for " << manager->GetParticleType()->GetParticleName();
471 G4cout << " Index = " << manager->GetProcessIndex(process);
472 G4cout << G4endl;
473 }
474#endif
475 }
476 }
477}
478
479///////////////
481 const G4String& processName,
482 G4ProcessManager* processManager,
483 G4bool fActive )
484{
485#ifdef G4VERBOSE
486 if (verboseLevel>1){
487 G4cout << " G4ProcessTable::SetProcessActivation:" ;
488 G4cout << " The Process[" << processName << "] "<< G4endl;
489 }
490#endif
491
492 G4VProcess* process = FindProcess( processName, processManager);
493 if ( process != 0) {
494 processManager->SetProcessActivation(process, fActive);
495#ifdef G4VERBOSE
496 if (verboseLevel>1){
497 G4cout << " for " << processManager->GetParticleType()->GetParticleName();
498 G4cout << " Index = " << processManager->GetProcessIndex(process) << G4endl;
499 }
500#endif
501 }
502}
503
504
505///////////////
507 G4bool fActive )
508{
509#ifdef G4VERBOSE
510 if (verboseLevel>1){
511 G4cout << " G4ProcessTable::SetProcessActivation:" ;
512 G4cout << " The ProcessType[" << G4int(processType) << "] "<< G4endl;
513 }
514#endif
515
516 G4ProcTableVector* pTblVector = Find(fProcTblVector, processType);
517 G4ProcTableVector::iterator itr;
518 G4ProcTblElement* anElement;
519 // loop over all elements
520 for (itr=pTblVector->begin(); itr!=pTblVector->end(); ++itr) {
521 anElement = (*itr);
522 G4VProcess* process = anElement->GetProcess();
523#ifdef G4VERBOSE
524 if (verboseLevel>1){
525 G4cout << " The Process[" << process->GetProcessName()<< "] "<< G4endl;
526 }
527#endif
528 for (G4int idx = 0 ; idx < anElement->Length(); idx++) {
529 G4ProcessManager* manager = anElement->GetProcessManager(idx);
530 manager->SetProcessActivation(process, fActive);
531#ifdef G4VERBOSE
532 if (verboseLevel>1){
533 G4cout << " for " << manager->GetParticleType()->GetParticleName();
534 G4cout << " Index = " << manager->GetProcessIndex(process) << G4endl;
535 }
536#endif
537 }
538 }
539}
540
541///////////////
543 G4ProcessType processType,
544 G4ProcessManager* processManager,
545 G4bool fActive )
546{
547#ifdef G4VERBOSE
548 if (verboseLevel>1){
549 G4cout << " G4ProcessTable::SetProcessActivation:" ;
550 G4cout << " The ProcessType[" << G4int(processType) << "] "<< G4endl;
551 }
552#endif
553
554 G4ProcessVector* procList = processManager->GetProcessList();
555 for (G4int idx = 0; idx < procList->length(); idx++) {
556 G4VProcess* process = (*procList)(idx);
557 if ( process->GetProcessType() == processType) {
558 processManager->SetProcessActivation(process, fActive);
559#ifdef G4VERBOSE
560 if (verboseLevel>1){
561 G4cout << " The Process[" << process->GetProcessName()<< "] "<< G4endl;
562 G4cout << " for " << processManager->GetParticleType()->GetParticleName();
563 G4cout << " Index = " << idx << G4endl;
564 }
565#endif
566 }
567 }
568}
569
570
571/////////////
573 G4ParticleDefinition* particle)
574{
575 G4ProcTableVector::iterator itr;
576 G4int idxTbl=0;
577 G4ProcTblElement* anElement=0;
578 G4bool isFoundInTbl = false;
579 G4ProcessManager* manager=0;
580 G4int idx;
581 // loop over all elements
582 for (itr=fProcTblVector->begin(); itr!=fProcTblVector->end(); ++itr, ++idxTbl) {
583 anElement = (*itr);
584 if (process == anElement->GetProcess() ){
585 if (particle!=0) {
586 for (idx=0; idx<anElement->Length(); idx++){
587 manager = anElement->GetProcessManager(idx);
588 if (particle == manager->GetParticleType()) {
589 isFoundInTbl = true;
590 break;
591 }
592 }
593 } else {
594 isFoundInTbl = true;
595 }
596 break;
597 }
598 }
599 if (!isFoundInTbl ) return;
600
601 G4int tmpVerbose = process->GetVerboseLevel();
602 process->SetVerboseLevel(verboseLevel);
603 process->DumpInfo();
604 process->SetVerboseLevel(tmpVerbose);
605 if (particle==0) {
606 for (idx=0; idx<anElement->Length(); idx++){
607 manager = anElement->GetProcessManager(idx);
608 G4cout << " for " << manager->GetParticleType()->GetParticleName();
609 G4cout << G4endl;
610#ifdef G4VERBOSE
611 if (verboseLevel >2){
612 tmpVerbose = manager->GetVerboseLevel();
613 manager->SetVerboseLevel(verboseLevel);
614 manager->DumpInfo();
615 manager->SetVerboseLevel(tmpVerbose);
616 }
617#endif
618 }
619 } else {
620 G4cout << " for " << manager->GetParticleType()->GetParticleName();
621 G4cout << G4endl;
622#ifdef G4VERBOSE
623 if (verboseLevel >2){
624 tmpVerbose = manager->GetVerboseLevel();
625 manager->SetVerboseLevel(verboseLevel);
626 manager->DumpInfo();
627 manager->SetVerboseLevel(tmpVerbose);
628 }
629#endif
630 }
631}
632
633
634
635
636
637
G4ProcessType
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
const G4String & GetParticleName() const
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 * SetProcessActivation(G4VProcess *aProcess, G4bool fActive)
G4ParticleDefinition * GetParticleType() const
void SetVerboseLevel(G4int value)
G4ProcessVector * GetProcessList() const
G4int GetProcessIndex(G4VProcess *) const
G4int GetVerboseLevel() const
void DumpInfo(G4VProcess *process, G4ParticleDefinition *particle=0)
static G4ProcessTable * GetProcessTable()
G4VProcess * FindProcess(const G4String &processName, const G4String &particleName) const
G4int Insert(G4VProcess *aProcess, G4ProcessManager *aProcMgr)
std::vector< G4ProcTblElement * > G4ProcTableVector
G4UImessenger * CreateMessenger()
std::vector< G4String > G4ProcNameVector
G4int Remove(G4VProcess *aProcess, G4ProcessManager *aProcMgr)
void SetProcessActivation(const G4String &processName, G4bool fActive)
G4ProcessVector * FindProcesses()
G4bool insert(G4VProcess *aProcess)
G4int length() const
void SetVerboseLevel(G4int value)
Definition: G4VProcess.hh:408
G4int GetVerboseLevel() const
Definition: G4VProcess.hh:413
G4ProcessType GetProcessType() const
Definition: G4VProcess.hh:385
virtual void DumpInfo() const
Definition: G4VProcess.cc:206
const G4String & GetProcessName() const
Definition: G4VProcess.hh:379