Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4ProcessManager.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 implementation file
32//
33// History: first implementation, based on object model of
34// 2nd December 1995, G.Cosmo
35// ------------------------------------------------------------
36// New Physics scheme 8 Jan. 1997 H.Kurahige
37// remove sprintf 14 Nov 1997 H.Kurahige
38// fixed bugs in FindInsertPosition
39// 18 July 1998 H.Kurashige
40// Use STL vector instead of RW vector 1. Mar 00 H.Kurashige
41// Add exception to check ordering paramters 2 Oct. 2007 H.Kurashige
42// ------------------------------------------------------------
43
45#include "G4ProcessManager.hh"
46#include "G4ProcessAttribute.hh"
47#include "G4StateManager.hh"
48#include <iomanip>
49#include "G4ProcessTable.hh"
50#include "G4ios.hh"
51
52
53// ---------------------------------
54// function members implementation
55// ---------------------------------
56G4ProcessManagerMessenger* G4ProcessManager::fProcessManagerMessenger = 0;
57G4int G4ProcessManager::counterOfObjects = 0;
58
59// ///////////////////////////////////////
61 theParticleType(aParticleType),
62 numberOfProcesses(0),
63 duringTracking(false),
64 verboseLevel(1)
65{
66 // create the process List
67 theProcessList = new G4ProcessVector();
68 if ( theProcessList == 0) {
69 G4Exception( "G4ProcessManager::G4ProcessManager()","ProcMan012",
70 FatalException, "Can not create G4ProcessList ");
71 }
72
73 //create process vector
74 for (G4int i=0; i<SizeOfProcVectorArray; ++i) {
75 theProcVector[i] = new G4ProcessVector();
76 if ( theProcVector[i] == 0) {
77 G4Exception( "G4ProcessManager::G4ProcessManager()","ProcMan012",
78 FatalException, "Can not create G4ProcessVector ");
79 }
80 }
81
82 // create Process Attribute vector
83 theAttrVector = new G4ProcessAttrVector();
84
85 // create Process Manager Messenger
86 if (fProcessManagerMessenger == 0){
87 fProcessManagerMessenger = new G4ProcessManagerMessenger();
88 }
89
90 for (G4int i=0; i<NDoit; ++i) {
91 isSetOrderingFirstInvoked[i]=false;
92 isSetOrderingLastInvoked[i]=false;
93 }
94
95 // Increment counter of G4ProcessManager objects
96 counterOfObjects+=1;
97}
98
99// ///////////////////////////////////////
101 : theParticleType(right.theParticleType),
102 numberOfProcesses(0),
103 duringTracking(false),
104 verboseLevel(right.verboseLevel)
105{
106#ifdef G4VERBOSE
107 if (GetVerboseLevel() > 2) {
108 G4cout << "G4ProcessManageer:: copy constructor " <<G4endl;
109 }
110#endif
111
112 // create the process List and ProcessAttr Vector
113 theProcessList = new G4ProcessVector();
114 theAttrVector = new G4ProcessAttrVector();
115 if ( ( theProcessList == 0) || (theAttrVector == 0) ){
116 G4Exception( "G4ProcessManager::G4ProcessManager() [coopy constructor]",
117 "ProcMan011",FatalException, "Can not create G4ProcessList ");
118 }
119
120 for (G4int idx=0; idx < right.numberOfProcesses; idx++) {
121 // copy contents in theProcessList
122 theProcessList->insert((*right.theProcessList)[idx]);
123 // create a G4ProcessAttribute same as source's one
124 G4ProcessAttribute* sAttr = (*right.theAttrVector)[idx];
125 G4ProcessAttribute* dAttr = new G4ProcessAttribute(*sAttr);
126 // adds a G4ProcessAttribute object
127 theAttrVector->push_back(dAttr);
128 numberOfProcesses +=1;
129 }
130
131
132 // fill up theProcVector
133 for (G4int i=0; i<SizeOfProcVectorArray; ++i) {
134 // create i-th ProcessVector in theProcVector
135 theProcVector[i] = new G4ProcessVector();
136 if ( theProcVector[i] == 0) {
137 G4Exception( "G4ProcessManager::G4ProcessManager() [coopy constructor]",
138 "ProcMan011",FatalException, "Can not create G4ProcessVector ");
139 }
140
142 G4ProcessVector* src = right.theProcVector[i];
143 for (G4int j=0; j< src->entries() ; j++){
144 // copy j-th process in i-th ProcessVector
145 theProcVector[i]->insert((*src)[j]);
146 //add aProcess and this ProcessManager into ProcesssTable
147 if ( (*src)[j] !=0 ) {
148 theProcessTable->Insert((*src)[j], this);
149 }
150 }
151 }
152
153 for (G4int i=0; i<NDoit; ++i) {
154 isSetOrderingFirstInvoked[i]= right.isSetOrderingFirstInvoked[i];
155 isSetOrderingLastInvoked[i] = right.isSetOrderingLastInvoked[i];
156 }
157
158 // Increment counter of G4ProcessManager objects
159 counterOfObjects+=1;
160}
161
162// ///////////////////////////////////////
163G4ProcessManager::G4ProcessManager():
164 theParticleType(0),
165 numberOfProcesses(0),
166 duringTracking(false),
167 verboseLevel(1)
168{
169 // clear the process List and ProcessAttr Vector
170 theProcessList = 0;
171 theAttrVector = 0;
172
173 G4Exception("G4ProcessManager::G4ProcessManager()","ProcMan111",
174 JustWarning,"Default constructor is called");
175
176 //create process vector
177 for (G4int i=0; i<SizeOfProcVectorArray; ++i) {
178 theProcVector[i] = new G4ProcessVector();
179 }
180
181 for (G4int i=0; i<NDoit; ++i) {
182 isSetOrderingFirstInvoked[i]=false;
183 isSetOrderingLastInvoked[i]=false;
184 }
185}
186
187// ///////////////////////////////////////
188G4ProcessManager & G4ProcessManager::operator=(const G4ProcessManager &)
189{
190 // clear the process List and ProcessAttr Vector
191 theProcessList = 0;
192 theAttrVector = 0;
193
194 G4Exception("G4ProcessManager::operator=","ProcMan112",
195 JustWarning,"Assignemnet operator is called");
196
197 return *this;
198}
199
200// ///////////////////////////////////////
202{
203 for (G4int i=0; i<SizeOfProcVectorArray; i++) {
204 if (theProcVector[i]) {
205 theProcVector[i]->clear();
206 delete theProcVector[i];
207 }
208 }
209 theProcessList->clear();
210 delete theProcessList;
211
212 G4ProcessAttrVector::iterator itr;
213 for (itr = theAttrVector->begin(); itr!= theAttrVector->end(); ++itr) {
214 delete (*itr);
215 }
216 theAttrVector->clear();
217 delete theAttrVector;
218
219 counterOfObjects-=1;
220
221 // delete messenger if this object is last one
222 if ( counterOfObjects == 0 ){
223 if (fProcessManagerMessenger != 0){
224 delete fProcessManagerMessenger;
225 fProcessManagerMessenger = 0;
226#ifdef G4VERBOSE
227 if (GetVerboseLevel() > 1) {
228 G4cout << "G4ProcessManagerMessenger is deleted" << G4endl;
229 }
230#endif
231 }
232 }
233}
234
235////////////////////////////////////////////////////////////////
237 G4VProcess* aProcess,
240 ) const
241{
242 G4int idxVect = -1;
243 G4int idxProc = GetProcessIndex(aProcess);
244 G4int ivec = GetProcessVectorId(idx, typ);
245
246 if ( ( idxProc >=0) && (ivec >=0) ){
247 idxVect = GetAttribute(idxProc)->idxProcVector[ivec];
248 } else {
249#ifdef G4VERBOSE
250 if (verboseLevel>0) {
251 G4cout << " G4ProcessManager::GetProcessVectorIndex:";
252 G4cout << "particle[" << theParticleType->GetParticleName() << "] " ;
253 G4cout << "process[" << aProcess->GetProcessName() << "]" ;
254 G4cout << G4endl;
255 if (idxProc <0) {
256 G4cout << " is not registered yet ";
257 }
258 if (ivec <0) {
259 G4cout << " illegal DoIt Index [= " << G4int(idx) << ","
260 << G4int(typ) << "]";
261 }
262 G4cout << G4endl;
263 }
264#endif
265 }
266 return idxVect;
267}
268
269/////////////////////////////////////////
270G4ProcessAttribute* G4ProcessManager::GetAttribute(G4int index) const
271{
272 // check index range
273 if ((index<0) || (index>=numberOfProcesses)) {
274#ifdef G4VERBOSE
275 if (GetVerboseLevel()>0) {
276 G4cout << "G4ProcessManager::GetAttribute():";
277 G4cout << " particle[" << theParticleType->GetParticleName() << "]";
278 G4cout << G4endl;
279 G4cout << " index out of range " << G4endl;
280 G4cout << " #processes[" << numberOfProcesses << "]";
281 G4cout << " index [" << index << "]" << G4endl;
282 }
283#endif
284 return 0;
285 }
286
287 // check process pointer is not 0
288 G4VProcess* aProcess = (*theProcessList)[index];
289 if (aProcess == 0) {
290 G4String aErrorMessage("Bad ProcessList: Null Pointer for");
291 aErrorMessage += theParticleType->GetParticleName() ;
292 G4Exception("G4ProcessManager::GetAttribute()","ProcMan012",
293 FatalException,aErrorMessage);
294 return 0;
295 }
296
297 //find the process attribute
298 if ( ((*theAttrVector)[index])->idxProcessList == index ){
299 return (*theAttrVector)[index];
300 } else {
301 // !! Error !!
302 // attribute vector index is inconsistent with process List index
303#ifdef G4VERBOSE
304 if (GetVerboseLevel()>0) {
305 G4cout << "G4ProcessManager::GetAttribute():";
306 G4cout << " particle[" << theParticleType->GetParticleName() << "]"
307 << G4endl;
308 G4cout << "Warning:: attribute vector index is inconsistent with process List index"
309 << G4endl;
310 }
311#endif
312 // re-ordering attribute vector
313 G4ProcessAttribute *pAttr = 0;
314 G4ProcessAttrVector::iterator itr;
315 for (itr = theAttrVector->begin(); itr!= theAttrVector->end(); ++itr) {
316 if ( (*itr)->idxProcessList == index) {
317 pAttr = (*itr);
318 break;
319 }
320 }
321 return pAttr;
322 }
323}
324
325// ///////////////////////////////////////
326G4ProcessAttribute * G4ProcessManager::GetAttribute(G4VProcess *aProcess) const
327{
328 return GetAttribute( GetProcessIndex(aProcess));
329}
330
331// ///////////////////////////////////////
333{
334 G4ProcessVector* pVector = theProcVector[ivec];
335 // check position
336 if ( (ip<0) || (ip > pVector->entries()) ) return -1;
337
338 // insert in pVector
339 pVector->insertAt(ip, process);
340
341 //correct index in ProcessAttributes of processes
342 for (G4int iproc=0; iproc<numberOfProcesses; iproc++) {
343 G4ProcessAttribute* aAttr = (*theAttrVector)[iproc];
344 if (aAttr != 0) {
345 if (aAttr->idxProcVector[ivec] >= ip){
346 aAttr->idxProcVector[ivec] += 1;
347 }
348 } else {
349#ifdef G4VERBOSE
350 if (GetVerboseLevel()>0) {
351 G4cout << " G4ProcessManager::InsertAt : No Process Attribute " << G4endl;
352 }
353#endif
354 }
355 }
356 return ip;
357}
358
359// ///////////////////////////////////////
361{
362 G4ProcessVector* pVector = theProcVector[ivec];
363 // check position
364 if ( (ip<0) || (ip >= pVector->entries()) ) return -1;
365
366 // remove process
367 pVector->removeAt(ip);
368
369 // correct index
370 for(G4int iproc=0; iproc<numberOfProcesses; iproc++) {
371 G4ProcessAttribute* aAttr = (*theAttrVector)[iproc];
372 if (aAttr != 0) {
373 if (ip < aAttr->idxProcVector[ivec]) {
374 aAttr->idxProcVector[ivec] -=1;
375 } else if (ip == aAttr->idxProcVector[ivec]) {
376 aAttr->idxProcVector[ivec] = -1;
377 aAttr->ordProcVector[ivec] = ordInActive;
378 }
379 }else {
380#ifdef G4VERBOSE
381 if (GetVerboseLevel()>0) {
382 G4cout << " G4ProcessManager::RemoveAt : No Process Attribute " << G4endl;
383 }
384#endif
385 }
386 }
387 return ip;
388}
389
390// ///////////////////////////////////////
392{
393 G4ProcessVector* pVector = theProcVector[ivec];
394 G4int ip = pVector->entries();
395 G4int tmp = INT_MAX;
396 if (ord == ordLast) return ip;
397
398 // find insert position
399 for (G4int iproc=0; iproc<numberOfProcesses; iproc++) {
400 G4ProcessAttribute* aAttr = (*theAttrVector)[iproc];
401 if ( (aAttr->ordProcVector[ivec] > ord ) && (tmp > aAttr->ordProcVector[ivec])){
402 tmp = aAttr->ordProcVector[ivec] ;
403 if (ip > aAttr->idxProcVector[ivec]) ip = aAttr->idxProcVector[ivec];
404 }
405 }
406 return ip;
407}
408
409// ///////////////////////////////////////
411 G4VProcess *aProcess,
412 G4int ordAtRestDoIt,
413 G4int ordAlongStepDoIt,
414 G4int ordPostStepDoIt
415 )
416{
417
418 //check the process is applicable to this particle type
419 if ( !aProcess->IsApplicable(*theParticleType) ) {
420#ifdef G4VERBOSE
421 if (GetVerboseLevel()>1) {
422 G4cout << "G4ProcessManager::AddProcess()" << G4endl;
423 G4cout << "This process is not applicable to this particle" << G4endl;
424 }
425#endif
426 return -1;
427 }
428
429#ifdef G4VERBOSE
430 if (GetVerboseLevel()>2) {
431 G4cout << "G4ProcessManager::AddProcess()" << G4endl;
432 }
433#endif
434
435 //add aProcess and this ProcessManager into ProcesssTable
437 theProcessTable->Insert(aProcess, this);
438
439 //add aProcess to process List
440 theProcessList->insert(aProcess);
441 G4int idx = (theProcessList->entries()) - 1;
442
443 // check size of the ProcessVector[0]
444 if (numberOfProcesses != idx){
445 theProcessList->removeLast();
446 G4String anErrorMessage("Bad ProcessList: Inconsistent process List size for ");
447 anErrorMessage += "process[" + aProcess->GetProcessName() + "]";
448 anErrorMessage += " particle[" + theParticleType->GetParticleName() + "]";
449 G4Exception( "G4ProcessManager::AddProcess()","ProcMan012",
450 FatalException,anErrorMessage);
451 return -1;
452 }
453
454 // create ProcessAttribute
455 G4ProcessAttribute* pAttr = new G4ProcessAttribute(aProcess);
456 pAttr->idxProcessList = idx;
457
458 // check if ordering parameter is non-zero
459 if (ordAtRestDoIt==0) ordAtRestDoIt = 1;
460 if (ordAlongStepDoIt==0) ordAlongStepDoIt = 1;
461 if (ordPostStepDoIt==0) ordPostStepDoIt = 1;
462
463 // ordering parameter
464 pAttr->ordProcVector[0] = ordAtRestDoIt;
465 pAttr->ordProcVector[1] = ordAtRestDoIt;
466 pAttr->ordProcVector[2] = ordAlongStepDoIt;
467 pAttr->ordProcVector[3] = ordAlongStepDoIt;
468 pAttr->ordProcVector[4] = ordPostStepDoIt;
469 pAttr->ordProcVector[5] = ordPostStepDoIt;
470
471 // add aProccess in Process vectors
472 for (G4int ivec=1; ivec<SizeOfProcVectorArray; ivec+=2) {
473 if (pAttr->ordProcVector[ivec] < 0 ) {
474 // DoIt is inactive if ordering parameter is negative
475 pAttr->idxProcVector[ivec] = -1;
476
477 } else {
478 //add aProcess in ordering of ordProcVector
479 // G4ProcessVector* pVector = theProcVector[ivec];
480 // find insert position
481 G4int ip = FindInsertPosition(pAttr->ordProcVector[ivec], ivec);
482 // insert
483 InsertAt(ip, aProcess, ivec);
484 // set index in Process Attribute
485 pAttr->idxProcVector[ivec] = ip;
486
487#ifdef G4VERBOSE
488 if (verboseLevel>2) {
489 G4cout << "G4ProcessManager::AddProcess()" << G4endl;
490 G4cout << aProcess->GetProcessName() << " is inserted at "<< ip;
491 G4cout << " in ProcessVetor[" << ivec<< "]";
492 G4cout << " with Ordering parameter = " ;
493 G4cout << pAttr->ordProcVector[ivec] << G4endl;
494 }
495#endif
496 }
497 }
498
499 //add ProcessAttribute to ProcessAttrVector
500 theAttrVector->push_back(pAttr);
501
502 numberOfProcesses += 1;
503
504 // check consistencies between ordering parameters and process
505 CheckOrderingParameters(aProcess);
506
507 CreateGPILvectors();
508
509 // inform process manager pointer to the process
510 aProcess->SetProcessManager(this);
511
512 return idx;
513}
514
515
516// ///////////////////////////////////////
518{
519 //find the process attribute
520 G4ProcessAttribute* pAttr = GetAttribute(index);
521 if (pAttr == 0) return 0;
522
523 // remove process
524 G4VProcess* removedProcess = (*theProcessList)[index];
525
526 if (!(pAttr->isActive)) { ActivateProcess(index);}
527 // remove process from vectors if the process is active
528 for (G4int ivec=0; ivec<SizeOfProcVectorArray; ivec++) {
529 G4ProcessVector* pVector = theProcVector[ivec];
530 G4int idx = pAttr->idxProcVector[ivec];
531 if ((idx >= 0) && (idx < pVector->entries())) {
532 //remove
533 if (RemoveAt(idx, removedProcess, ivec) <0) {
534 G4String anErrorMessage("Bad index in attribute");
535 anErrorMessage += "for particle[" + theParticleType->GetParticleName() + "] ";
536 anErrorMessage += "process[" + removedProcess->GetProcessName() + "] " ;
537 G4Exception( "G4ProcessManager::RemoveProcess()","Fatal Error",
538 FatalException,anErrorMessage);
539 return 0;
540 }
541 } else if (idx<0) {
542 // corresponding DoIt is not active
543 } else {
544 // idx is out of range
545 G4String anErrorMessage("Bad ProcessList : Index is out of range ");
546 anErrorMessage += "for particle[" + theParticleType->GetParticleName() + "] ";
547 anErrorMessage += "process[" + removedProcess->GetProcessName() + "] " ;
548 G4Exception( "G4ProcessManager::RemoveProcess()","ProcMan012",
549 FatalException,anErrorMessage);
550 return 0;
551 }
552 }
553 pAttr->isActive = false;
554 // remove from the process List and delete the attribute
555 theProcessList->removeAt(index);
556 G4ProcessAttrVector::iterator itr;
557 for (itr = theAttrVector->begin(); itr!= theAttrVector->end(); ++itr) {
558 if ( (*itr) == pAttr) {
559 theAttrVector->erase(itr);
560 break;
561 }
562 }
563 delete pAttr;
564 numberOfProcesses -= 1;
565
566 // correct index
567 for(G4int i=0; i<numberOfProcesses; i++) {
568 G4ProcessAttribute* aAttr = (*theAttrVector)[i];
569 if (index < aAttr->idxProcessList) aAttr->idxProcessList -=1;
570 }
571
572 CreateGPILvectors();
573
574 //remove aProcess from ProcesssTable
576 theProcessTable->Remove(removedProcess, this);
577
578 return removedProcess;
579}
580
581// ///////////////////////////////////////
583{
584 return RemoveProcess(GetProcessIndex(aProcess));
585}
586
587/////////////////////////////////////////
589 G4VProcess *aProcess,
591 )
592{
593 // get Process Vector Id
594 G4int ivec = GetProcessVectorId(idDoIt, typeDoIt);
595 if (ivec >=0 ) {
596 // get attribute
597 G4ProcessAttribute* pAttr = GetAttribute(aProcess);
598 if (pAttr != 0) {
599 return pAttr->ordProcVector[ivec];
600 }
601 }
602 return -1;
603}
604
605
606// ///////////////////////////////////////
608 G4VProcess *aProcess,
610 G4int ordDoIt
611 )
612{
613 const G4String aErrorMessage(" G4ProcessManager::SetProcessOrdering");
614
615#ifdef G4VERBOSE
616 if (GetVerboseLevel()>2) {
617 G4cout << aErrorMessage ;
618 G4cout << "particle[" + theParticleType->GetParticleName() +"] " ;
619 G4cout <<"process[" + aProcess->GetProcessName() + "]"<< G4endl;
620 }
621#endif
622
623 // get Process Vector Id
624 G4int ivec = GetProcessVectorId(idDoIt, typeDoIt);
625 if (ivec <0 ) {
626#ifdef G4VERBOSE
627 if (verboseLevel>0) {
628 G4cout << aErrorMessage << G4endl;
629 G4cout << "particle[" << theParticleType->GetParticleName() << "] " ;
630 G4cout << "process[" << aProcess->GetProcessName() << "]"<< G4endl;
631 G4cout << " illegal DoIt Index [= " << G4int(idDoIt) << "]";
632 G4cout << G4endl;
633 }
634#endif
635 return;
636 }
637
638 if (ordDoIt>ordLast) ordDoIt=ordLast;
639 // get attribute
640 G4ProcessAttribute* pAttr = GetAttribute(aProcess);
641 if (pAttr == 0) {
642 // can not get process attribute
643 return;
644
645 } else {
646 G4int ip = pAttr->idxProcVector[ivec];
647 // remove a process from the process vector
648 if ( ip >=0 ) {
649 RemoveAt(ip, aProcess, ivec);
650 }
651
652 // set ordering parameter to non-zero
653 if (ordDoIt == 0) ordDoIt = 1;
654 pAttr->ordProcVector[ivec-1] = ordDoIt;
655 pAttr->ordProcVector[ivec] = ordDoIt;
656
657 // insert in process vector if ordDoIt >0
658 if (ordDoIt >0) {
659 // find insert position
660 ip = FindInsertPosition(pAttr->ordProcVector[ivec], ivec);
661 // insert
662 InsertAt(ip, aProcess, ivec);
663 // set index in Process Attribute
664 pAttr->idxProcVector[ivec] = ip;
665#ifdef G4VERBOSE
666 if (verboseLevel>2) {
667 G4cout << aErrorMessage << G4endl;
668 G4cout << "particle[" << theParticleType->GetParticleName() << "] " ;
669 G4cout <<"process[" << aProcess->GetProcessName() << "]"<< G4endl;
670 G4cout << aProcess->GetProcessName() << " is inserted at "<< ip;
671 G4cout << " in ProcessVetor[" << ivec<< "]";
672 G4cout << " with Ordering parameter = " << ordDoIt ;
673 G4cout << G4endl;
674 }
675#endif
676 }
677
678 }
679 // check consistencies between ordering parameters and process
680 CheckOrderingParameters(aProcess);
681
682 // create GPIL vectors
683 CreateGPILvectors();
684}
685
686
687// ///////////////////////////////////////
689 G4VProcess *aProcess,
691 )
692{
693 // get Process Vector Id(
694 G4int ivec = GetProcessVectorId(idDoIt, typeDoIt);
695 if (ivec <0 ) {
696#ifdef G4VERBOSE
697 if (verboseLevel>0) {
698 G4cout << "G4ProcessManager::SetProcessOrdering: ";
699 G4cout << " illegal DoIt Index [= " << G4int(idDoIt) << "]";
700 G4cout << G4endl;
701 }
702#endif
703 return;
704 }
705
706 // get attribute
707 G4ProcessAttribute* pAttr = GetAttribute(aProcess);
708 if (pAttr == 0) {
709 return;
710 } else {
711 G4int ip = pAttr->idxProcVector[ivec];
712
713 // remove a process from the process vector
714 if ( ip >=0 ) {
715 RemoveAt(ip, aProcess, ivec);
716 }
717
718 // set ordering parameter to zero
719 pAttr->ordProcVector[ivec] = 0;
720 pAttr->ordProcVector[ivec-1] = 0;
721
722 // insert
723 InsertAt(0, aProcess, ivec);
724
725 // set index in Process Attribute
726 pAttr->idxProcVector[ivec] = 0;
727
728#ifdef G4VERBOSE
729 if (verboseLevel>2) {
730 G4cout << "G4ProcessManager::SetProcessOrderingToFirst: ";
731 G4cout << aProcess->GetProcessName() << " is inserted at top ";
732 G4cout << " in ProcessVetor[" << ivec<< "]";
733 G4cout << G4endl;
734 }
735#endif
736 }
737
738 if (isSetOrderingFirstInvoked[idDoIt]){
739 G4String anErrMsg = "Set Ordering First is invoked twice for ";
740 anErrMsg += aProcess->GetProcessName();
741 anErrMsg += " to ";
742 anErrMsg += theParticleType->GetParticleName();
743 G4Exception( "G4ProcessManager::SetProcessOrderingToFirst()",
744 "ProcMan113",
745 JustWarning,anErrMsg);
746 }
747 isSetOrderingFirstInvoked[idDoIt] = true;
748
749 // check consistencies between ordering parameters and process
750 CheckOrderingParameters(aProcess);
751
752 // create GPIL vectors
753 CreateGPILvectors();
754
755}
756
757// ///////////////////////////////////////
759 G4VProcess *aProcess,
761 )
762{
763 const G4String aErrorMessage(" G4ProcessManager::SetProcessOrderingToSecond");
764
765#ifdef G4VERBOSE
766 if (GetVerboseLevel()>2) {
767 G4cout << aErrorMessage ;
768 G4cout << "particle[" << theParticleType->GetParticleName() << "] " ;
769 G4cout <<"process[" << aProcess->GetProcessName() << "]"<< G4endl;
770 }
771#endif
772
773 // get Process Vector Id
774 G4int ivec = GetProcessVectorId(idDoIt, typeDoIt);
775 if (ivec <0 ) {
776#ifdef G4VERBOSE
777 if (verboseLevel>0) {
778 G4cout << aErrorMessage << G4endl;
779 G4cout << "particle[" << theParticleType->GetParticleName() << "] " ;
780 G4cout << "process[" << aProcess->GetProcessName() << "]"<< G4endl;
781 G4cout << " illegal DoIt Index [= " << G4int(idDoIt) << "]";
782 G4cout << G4endl;
783 }
784#endif
785 return;
786 }
787
788 // get attribute
789 G4ProcessAttribute* pAttr = GetAttribute(aProcess);
790 if (pAttr == 0) {
791 // can not get process attribute
792 return;
793 } else {
794 G4int ip = pAttr->idxProcVector[ivec];
795 // remove a process from the process vector
796 if ( ip >=0 ) {
797 RemoveAt(ip, aProcess, ivec);
798 }
799 }
800
801 // set ordering parameter to 1
802 pAttr->ordProcVector[ivec-1] = 1;
803 pAttr->ordProcVector[ivec] = 1;
804
805 // find insert position
806 G4ProcessVector* pVector = theProcVector[ivec];
807 G4int ip = pVector->entries();
808 G4int tmp = INT_MAX;
809
810 // find insert position
811 for (G4int iproc=0; iproc<numberOfProcesses; iproc++) {
812 G4ProcessAttribute* aAttr = (*theAttrVector)[iproc];
813 if ( aAttr->idxProcVector[ivec] >= 0 ) {
814 if ( (aAttr->ordProcVector[ivec] !=0 ) &&
815 (tmp >= aAttr->ordProcVector[ivec]) ) {
816 tmp = aAttr->ordProcVector[ivec];
817 if ( ip > aAttr->idxProcVector[ivec] ) {
818 ip = aAttr->idxProcVector[ivec] ;
819 }
820 }
821 }
822 }
823
824 // insert
825 InsertAt(ip, aProcess, ivec);
826
827 // set index in Process Attribute
828 pAttr->idxProcVector[ivec] = ip;
829#ifdef G4VERBOSE
830 if (verboseLevel>2) {
831 G4cout << aErrorMessage << G4endl;
832 G4cout << "particle[" << theParticleType->GetParticleName() << "] " ;
833 G4cout <<"process[" << aProcess->GetProcessName() << "]"<< G4endl;
834 G4cout << aProcess->GetProcessName() << " is inserted at "<< ip;
835 G4cout << " in ProcessVetor[" << ivec<< "]";
836 G4cout << " with Ordering parameter = 1 ";
837 G4cout << G4endl;
838 }
839#endif
840
841 // check consistencies between ordering parameters and process
842 CheckOrderingParameters(aProcess);
843
844 // create GPIL vectors
845 CreateGPILvectors();
846}
847
848// ///////////////////////////////////////
850 G4VProcess *aProcess,
852 )
853{
854 SetProcessOrdering(aProcess, idDoIt, ordLast );
855
856 if (isSetOrderingLastInvoked[idDoIt]){
857 G4String anErrMsg = "Set Ordering Last is invoked twice for ";
858 anErrMsg += aProcess->GetProcessName();
859 anErrMsg += " to ";
860 anErrMsg += theParticleType->GetParticleName();
861 G4Exception( "G4ProcessManager::SetProcessOrderingToLast()","ProcMan114",
862 JustWarning,anErrMsg);
863 }
864 isSetOrderingLastInvoked[idDoIt] = true;
865}
866
867// ///////////////////////////////////////
868G4VProcess* G4ProcessManager::InActivateProcess(G4int index)
869{
870 G4ApplicationState currentState
872 if ( (currentState == G4State_PreInit) || (currentState == G4State_Init) ) {
873#ifdef G4VERBOSE
874 if (GetVerboseLevel()>1) {
875 G4cout << "G4ProcessManager::InActivateProcess is not valid in ";
876 if (currentState == G4State_PreInit ) {
877 G4cout << "PreInit ";
878 } else if (currentState == G4State_Init ) {
879 G4cout << "Init ";
880 }
881 G4cout << "state !" << G4endl;
882 }
883#endif
884 return 0;
885 }
886
887 //find the process attribute
888 G4ProcessAttribute* pAttr = GetAttribute(index);
889 if (pAttr == 0) return 0;
890
891 // remove process
892 G4VProcess* pProcess = (*theProcessList)[index];
893
894 const G4String aErrorMessage(" G4ProcessManager::InactivateProcess():");
895
896 if (pAttr->isActive) {
897
898 // remove process from vectors if the process is active
899 for (G4int i=0; i<SizeOfProcVectorArray; i++) {
900 G4ProcessVector* pVector = theProcVector[i];
901 G4int idx = pAttr->idxProcVector[i];
902
903 if (idx<0) {
904 // corresponding DoIt is not active
905 } else if ((idx >= 0) && (idx < pVector->entries())) {
906 //check pointer and set to 0
907 if ((*pVector)[idx]== pProcess) {
908 (*pVector)[idx]= 0;
909 } else {
910 G4String anErrorMessage("Bad ProcessList: Bad index in attribute");
911 anErrorMessage += "for particle[" + theParticleType->GetParticleName() + "] ";
912 anErrorMessage += "process[" + pProcess->GetProcessName() + "] " ;
913 G4Exception( "G4ProcessManager::InactivateProcess():","ProcMan012",
914 FatalException,anErrorMessage);
915 return 0;
916 }
917 } else {
918 // idx is out of range
919 G4String anErrorMessage("Bad ProcessList: Index is out of range");
920 anErrorMessage += "for particle[" + theParticleType->GetParticleName() + "] ";
921 anErrorMessage += "process[" + pProcess->GetProcessName() + "] " ;
922 G4Exception( "G4ProcessManager::InactivateProcess():","ProcMan012",
923 FatalException,anErrorMessage);
924 return 0;
925 }
926 }
927 pAttr->isActive = false;
928 }
929 return pProcess;
930}
931
932// ///////////////////////////////////////
933G4VProcess* G4ProcessManager::ActivateProcess(G4int index)
934{
935 G4ApplicationState currentState
937 if ( (currentState == G4State_PreInit) || (currentState == G4State_Init) ) {
938#ifdef G4VERBOSE
939 if (GetVerboseLevel()>1) {
940 G4cout << "G4ProcessManager::ActivateProcess is not valid in ";
941 if (currentState == G4State_PreInit ) {
942 G4cout << "PreInit ";
943 } else if (currentState == G4State_Init ) {
944 G4cout << "Init ";
945 }
946 G4cout << "state !" << G4endl;
947 }
948#endif
949 return 0;
950 }
951
952 //find the process attribute
953 G4ProcessAttribute* pAttr = GetAttribute(index);
954 if (pAttr == 0) return 0;
955
956 // remove process
957 G4VProcess* pProcess = (*theProcessList)[index];
958
959 if (!pAttr->isActive) {
960 // remove process from vectors if the process is active
961 for (G4int i=0; i<SizeOfProcVectorArray; i++) {
962 G4ProcessVector* pVector = theProcVector[i];
963 G4int idx = pAttr->idxProcVector[i];
964 if (idx<0) {
965 // corresponding DoIt is not active
966 } else if ((idx >= 0) && (idx < pVector->entries())) {
967 //check pointer and set
968 if ((*pVector)[idx]== 0) {
969 (*pVector)[idx] = pProcess;
970 } else {
971 G4String anErrorMessage("Bad ProcessList: Bad index in attribute");
972 anErrorMessage += "for particle[" + theParticleType->GetParticleName() + "] ";
973 anErrorMessage += "process[" + pProcess->GetProcessName() + "] " ;
974 G4Exception( "G4ProcessManager::ActivateProcess():","ProcMan012",
975 FatalException,anErrorMessage);
976 return 0;
977 }
978 } else {
979 // idx is out of range
980 G4String anErrorMessage("bad ProcessList: Index is out of range");
981 anErrorMessage += "for particle[" + theParticleType->GetParticleName() + "] ";
982 anErrorMessage += "process[" + pProcess->GetProcessName() + "] " ;
983 G4Exception("G4ProcessManager::ActivateProcess():","ProcMan012",
984 FatalException,anErrorMessage);
985 return 0;
986
987 }
988 }
989 pAttr->isActive = true;
990 }
991 return pProcess;
992}
993
994// ///////////////////////////////////////
996{
997 return (this == &right);
998}
999
1000// ///////////////////////////////////////
1002{
1003 return (this != &right);
1004}
1005
1006// ///////////////////////////////////////
1008{
1009 // Dump Information
1010
1011 // particle type
1012 G4cout << "G4ProcessManager: particle["
1013 << theParticleType->GetParticleName() << "]"
1014 << G4endl;
1015
1016 // loop over all processes
1017 for (G4int idx=0; idx <theProcessList->entries(); idx++){
1018 // process name/type
1019 G4cout << "[" << idx << "]";
1020 G4cout << "=== process[" << ((*theProcessList)(idx))->GetProcessName()<< " :";
1021 G4cout << G4VProcess::GetProcessTypeName( ((*theProcessList)(idx))->GetProcessType() )<< "]";
1022
1023 // process attribute
1024 G4ProcessAttribute* pAttr = (*theAttrVector)[idx];
1025 // status
1026 if ( pAttr-> isActive ) {
1027 G4cout << " Active ";
1028 } else {
1029 G4cout << " InActive ";
1030 }
1031 G4cout << G4endl;
1032
1033#ifdef G4VERBOSE
1034 if (verboseLevel>0) {
1035 // order parameter
1036 G4cout << " Ordering:: ";
1037 G4cout << " AtRest AlongStep PostStep ";
1038 G4cout << G4endl;
1039 G4cout << " ";
1040 G4cout << " GetPIL/ DoIt GetPIL/ DoIt GetPIL/ DoIt ";
1041 G4cout << G4endl;
1042 G4cout << " Ordering:: " << G4endl;
1043 G4cout << " index ";
1044 for (G4int idx2 = 0; idx2 <6 ; idx2++) {
1045 G4cout << std::setw(8) << pAttr->idxProcVector[idx2] <<":";
1046 }
1047 G4cout << G4endl;
1048 G4cout << " parameter ";
1049 for (G4int idx3 = 0; idx3 <6 ; idx3++) {
1050 G4cout << std::setw(8) << pAttr->ordProcVector[idx3] <<":";
1051 }
1052 G4cout << G4endl;
1053 }
1054#endif
1055 }
1056}
1057
1058void G4ProcessManager::CreateGPILvectors()
1059{
1060//-- create GetPhysicalInteractionLength process vectors just as the inverse
1061//-- order of DoIt process vector
1062 for(G4int k=0; k<theProcessList->entries(); k++) {
1063 GetAttribute((*theProcessList)[k])->idxProcVector[0]=-1;
1064 GetAttribute((*theProcessList)[k])->idxProcVector[2]=-1;
1065 GetAttribute((*theProcessList)[k])->idxProcVector[4]=-1;
1066 }
1067
1068 for(G4int i=0; i<SizeOfProcVectorArray; i += 2) {
1069 G4ProcessVector* procGPIL = theProcVector[i];
1070 G4ProcessVector* procDoIt = theProcVector[i+1];
1071 G4int nproc = procDoIt->entries();
1072 procGPIL->clear();
1073 for(G4int j=nproc-1;j>=0;j--) {
1074 G4VProcess* aProc = (*procDoIt)[j];
1075 procGPIL->insert(aProc);
1076 GetAttribute(aProc)->idxProcVector[i] = procGPIL->entries()-1;
1077 }
1078 }
1079
1080}
1081
1082
1083
1084
1085
1086
1087//////////////////////////////////////////
1089{
1090 for (G4int idx = 0; idx<theProcessList->entries(); idx++){
1091 if (GetAttribute(idx)->isActive)
1092 ((*theProcessList)[idx])->StartTracking(aTrack);
1093 }
1094 if(aTrack) duringTracking = true;
1095}
1096
1097/////////////////////////////////////////////
1099{
1100 for (G4int idx = 0; idx<theProcessList->entries(); idx++){
1101 if (GetAttribute(idx)->isActive)
1102 ((*theProcessList)[idx])->EndTracking();
1103 }
1104 duringTracking = false;
1105}
1106
1107
1108/////////////////////////////////////////////
1110 G4bool fActive )
1111{
1112 return SetProcessActivation(GetProcessIndex(aProcess), fActive);
1113}
1114
1115
1116/////////////////////////////////////////////
1118{
1119 if (fActive) return ActivateProcess(index);
1120 else return InActivateProcess(index);
1121}
1122
1123/////////////////////////////////////////////
1125{
1126 return GetProcessActivation(GetProcessIndex(aProcess));
1127}
1128
1129
1130/////////////////////////////////////////////
1132{
1133 if (index <0) {
1134#ifdef G4VERBOSE
1135 if (GetVerboseLevel()>0) {
1136 G4cout << "G4ProcessManager::GetProcessActivation ";
1137 G4cout << " process (or its index) not found ";
1138 }
1139#endif
1140 return false;
1141 }
1142 // process attribute
1143 G4ProcessAttribute* pAttr = (*theAttrVector)[index];
1144 // status
1145 return pAttr-> isActive;
1146}
1147
1148/////////////////////////////////////////////
1150{
1151 if (aProcess==0) return;
1152 G4ProcessAttribute* pAttr = GetAttribute(aProcess);
1153 if (pAttr ==0) {
1154#ifdef G4VERBOSE
1155 if (GetVerboseLevel()>0) {
1156 G4cout << "G4ProcessManager::CheckOrderingParameters ";
1157 G4cout << " process " << aProcess->GetProcessName()
1158 << " has no attribute" << G4endl;
1159 }
1160#endif
1161 return;
1162 }
1163
1164 // check consistencies between ordering parameters and
1165 // validity of DoIt of the Process
1166 G4bool isOK =true;
1167 if ( (pAttr->ordProcVector[0]>=0) && (!aProcess->isAtRestDoItIsEnabled()) ){
1168 #ifdef G4VERBOSE
1169 if (GetVerboseLevel()>0) {
1170 G4cerr << "G4ProcessManager::CheckOrderingParameters ";
1171 G4cerr << "You cannot set ordering parameter ["
1172 << pAttr->ordProcVector[0]
1173 << "] for AtRest DoIt to the process "
1174 << aProcess->GetProcessName() << G4endl;
1175 }
1176#endif
1177 isOK = false;
1178 }
1179
1180 if ( (pAttr->ordProcVector[2]>=0) && (!aProcess->isAlongStepDoItIsEnabled()) ){
1181#ifdef G4VERBOSE
1182 if (GetVerboseLevel()>0) {
1183 G4cerr << "G4ProcessManager::CheckOrderingParameters ";
1184 G4cerr << "You cannot set ordering parameter ["
1185 << pAttr->ordProcVector[2]
1186 << "] for AlongStep DoIt to the process "
1187 << aProcess->GetProcessName() << G4endl;
1188
1189 }
1190#endif
1191 isOK = false;
1192 }
1193
1194 if ( (pAttr->ordProcVector[4]>=0) && (!aProcess->isPostStepDoItIsEnabled()) ) {
1195#ifdef G4VERBOSE
1196 if (GetVerboseLevel()>0) {
1197 G4cerr << "G4ProcessManager::CheckOrderingParameters ";
1198 G4cerr << "You cannot set ordering parameter ["
1199 << pAttr->ordProcVector[4]
1200 << "] for PostStep DoIt to the process"
1201 << aProcess->GetProcessName() << G4endl;
1202 }
1203#endif
1204 isOK = false;
1205 }
1206
1207 if (!isOK) {
1208 G4String msg;
1209 msg = "Invalid ordering parameters are set for ";
1210 msg += aProcess->GetProcessName();
1211 G4Exception( "G4ProcessManager::CheckOrderingParameters ",
1212 "ProcMan013",FatalException, msg);
1213 }
1214
1215 return;
1216}
1217
1218
1219
G4ApplicationState
@ G4State_Init
@ G4State_PreInit
@ JustWarning
@ FatalException
G4ProcessVectorTypeIndex
@ typeDoIt
@ ordInActive
@ ordLast
G4ProcessVectorDoItIndex
@ NDoit
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
const G4String & GetParticleName() const
G4int ordProcVector[G4ProcessManager::SizeOfProcVectorArray]
G4int idxProcVector[G4ProcessManager::SizeOfProcVectorArray]
void SetProcessOrdering(G4VProcess *aProcess, G4ProcessVectorDoItIndex idDoIt, G4int ordDoIt=ordDefault)
G4VProcess * SetProcessActivation(G4VProcess *aProcess, G4bool fActive)
void StartTracking(G4Track *aTrack=0)
void CheckOrderingParameters(G4VProcess *) const
G4int GetProcessVectorId(G4ProcessVectorDoItIndex idx, G4ProcessVectorTypeIndex typ=typeGPIL) const
G4ProcessManager(G4ProcessManager &right)
G4int GetProcessVectorIndex(G4VProcess *aProcess, G4ProcessVectorDoItIndex idx, G4ProcessVectorTypeIndex typ=typeGPIL) const
G4int GetProcessOrdering(G4VProcess *aProcess, G4ProcessVectorDoItIndex idDoIt)
G4int operator!=(const G4ProcessManager &right) const
void SetProcessOrderingToSecond(G4VProcess *aProcess, G4ProcessVectorDoItIndex idDoIt)
G4bool GetProcessActivation(G4VProcess *aProcess) const
G4int GetProcessIndex(G4VProcess *) const
G4int FindInsertPosition(G4int ord, G4int ivec)
G4VProcess * RemoveProcess(G4VProcess *aProcess)
G4int AddProcess(G4VProcess *aProcess, G4int ordAtRestDoIt=ordInActive, G4int ordAlongSteptDoIt=ordInActive, G4int ordPostStepDoIt=ordInActive)
G4int operator==(const G4ProcessManager &right) const
G4int InsertAt(G4int position, G4VProcess *process, G4int ivec)
void SetProcessOrderingToLast(G4VProcess *aProcess, G4ProcessVectorDoItIndex idDoIt)
G4int GetVerboseLevel() const
void SetProcessOrderingToFirst(G4VProcess *aProcess, G4ProcessVectorDoItIndex idDoIt)
G4int RemoveAt(G4int position, G4VProcess *process, G4int ivec)
static G4ProcessTable * GetProcessTable()
G4int Insert(G4VProcess *aProcess, G4ProcessManager *aProcMgr)
G4int Remove(G4VProcess *aProcess, G4ProcessManager *aProcMgr)
G4bool insertAt(G4int i, G4VProcess *aProcess)
G4bool insert(G4VProcess *aProcess)
G4VProcess * removeLast()
G4int entries() const
G4VProcess * removeAt(G4int i)
G4ApplicationState GetCurrentState() const
static G4StateManager * GetStateManager()
static const G4String & GetProcessTypeName(G4ProcessType)
Definition: G4VProcess.cc:150
virtual G4bool IsApplicable(const G4ParticleDefinition &)
Definition: G4VProcess.hh:205
G4bool isAtRestDoItIsEnabled() const
Definition: G4VProcess.hh:491
G4bool isPostStepDoItIsEnabled() const
Definition: G4VProcess.hh:503
G4bool isAlongStepDoItIsEnabled() const
Definition: G4VProcess.hh:497
virtual void SetProcessManager(const G4ProcessManager *)
Definition: G4VProcess.hh:479
const G4String & GetProcessName() const
Definition: G4VProcess.hh:379
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
#define INT_MAX
Definition: templates.hh:111