Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Static Public Member Functions
G4PhysicsListHelper Class Reference

#include <G4PhysicsListHelper.hh>

Public Member Functions

G4bool RegisterProcess (G4VProcess *process, G4ParticleDefinition *particle)
 
void AddTransportation ()
 
void UseCoupledTransportation (G4bool vl=true)
 
void CheckParticleList () const
 
void DumpOrdingParameterTable (G4int subType=-1) const
 
G4PhysicsListOrderingParameter GetOrdingParameter (G4int subType) const
 
void SetVerboseLevel (G4int value)
 
G4int GetVerboseLevel () const
 

Static Public Member Functions

static G4PhysicsListHelperGetPhysicsListHelper ()
 

Detailed Description

Definition at line 50 of file G4PhysicsListHelper.hh.

Member Function Documentation

void G4PhysicsListHelper::AddTransportation ( )

Definition at line 207 of file G4PhysicsListHelper.cc.

References G4ProcessManager::AddProcess(), FatalException, G4cout, G4endl, G4Exception(), G4RunManagerKernel::GetNumberOfParallelWorld(), G4ParticleDefinition::GetParticleName(), G4ParticleDefinition::GetParticleType(), G4ParticleDefinition::GetProcessManager(), G4RunManagerKernel::GetRunManagerKernel(), G4ScoringManager::GetScoringManagerIfExist(), idxAlongStep, idxPostStep, G4ParticleTableIterator< K, V >::reset(), G4ProcessManager::SetProcessOrderingToFirst(), and G4ParticleTableIterator< K, V >::value().

208 {
209  G4int verboseLevelTransport = 0;
210 
211 #ifdef G4VERBOSE
212  if (verboseLevel >2){
213  G4cout << "G4PhysicsListHelper::AddTransportation() "<< G4endl;
214  }
215 #endif
216 
217  G4int nParaWorld =
219 
220  if ( nParaWorld>0 ||
221  useCoupledTransportation ||
223 #ifdef G4VERBOSE
224  if (verboseLevel >0) {
225  G4cout << " G4PhysicsListHelper::AddTransportation()"
226  << "--- G4CoupledTransportation is used "
227  << G4endl;
228  }
229 #endif
230  theTransportationProcess = new G4CoupledTransportation(verboseLevelTransport);
231  } else {
232  theTransportationProcess = new G4Transportation(verboseLevelTransport);
233  }
234 
235  // loop over all particles in G4ParticleTable
236  aParticleIterator->reset();
237  while( (*aParticleIterator)() ){
238  G4ParticleDefinition* particle = aParticleIterator->value();
239  G4ProcessManager* pmanager = particle->GetProcessManager();
240  // Add transportation process for all particles
241  if ( pmanager == 0) {
242  // Error !! no process manager
243 #ifdef G4VERBOSE
244  if (verboseLevel>0){
245  G4cout << "G4PhysicsListHelper::AddTransportation "
246  <<" : No Process Manager for "
247  << particle->GetParticleName() << G4endl;
248  }
249 #endif
250  G4Exception("G4PhysicsListHelper::AddTransportation",
251  "Run0104", FatalException,
252  "No process manager");
253  continue;
254  }
255  // Molecule use different type transportation
256  if(particle->GetParticleType() == "Molecule") continue;
257 
258  // add transportation with ordering = ( -1, "first", "first" )
259  pmanager ->AddProcess(theTransportationProcess);
260  pmanager ->SetProcessOrderingToFirst(theTransportationProcess, idxAlongStep);
261  pmanager ->SetProcessOrderingToFirst(theTransportationProcess, idxPostStep);
262  }
263 }
G4int GetNumberOfParallelWorld() const
void SetProcessOrderingToFirst(G4VProcess *aProcess, G4ProcessVectorDoItIndex idDoIt)
G4ProcessManager * GetProcessManager() const
int G4int
Definition: G4Types.hh:78
static G4RunManagerKernel * GetRunManagerKernel()
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
void reset(G4bool ifSkipIon=true)
static G4ScoringManager * GetScoringManagerIfExist()
G4int AddProcess(G4VProcess *aProcess, G4int ordAtRestDoIt=ordInActive, G4int ordAlongSteptDoIt=ordInActive, G4int ordPostStepDoIt=ordInActive)
const G4String & GetParticleType() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
#define G4endl
Definition: G4ios.hh:61
void G4PhysicsListHelper::CheckParticleList ( ) const

Definition at line 99 of file G4PhysicsListHelper.cc.

References FatalException, fElectromagnetic, G4cout, G4endl, G4Exception(), G4ParticleDefinition::GetParticleName(), G4ParticleDefinition::GetParticleType(), G4ParticleDefinition::GetPDGCharge(), G4ProcessManager::GetProcessList(), G4ParticleDefinition::GetProcessManager(), G4InuclParticleNames::isElectron(), G4ParticleTableIterator< K, V >::reset(), G4ProcessVector::size(), and G4ParticleTableIterator< K, V >::value().

100 {
101  bool isElectron = false;
102  bool isPositron = false;
103  bool isGamma = false;
104  bool isProton = false;
105  bool isGenericIon = false;
106  bool isAnyIon = false;
107  bool isAnyChargedBaryon = false;
108  bool isEmProc = false;
109 
110  // loop over all particles in G4ParticleTable
111  aParticleIterator->reset();
112  while( (*aParticleIterator)() ){
113  G4ParticleDefinition* particle = aParticleIterator->value();
114  G4String name = particle->GetParticleName();
115  // check if any EM process exists
116  if (!isEmProc) {
117  G4ProcessVector* list = particle->GetProcessManager()->GetProcessList();
118  for (int idx=0; idx<list->size(); idx++){
119  isEmProc = ((*list)[idx])->GetProcessType() == fElectromagnetic;
120  if (isEmProc) break;
121  }
122  }
123 
124  if ( name == "e-") isElectron = true;
125  else if ( name == "e+") isPositron = true;
126  else if ( name == "gamma") isGamma = true;
127  else if ( name == "GenericIon") isGenericIon = true;
128  else if ( name == "proton") isProton = true;
129  else if ( particle->GetParticleType() == "nucleus") isAnyIon = true;
130  else if ( particle->GetParticleType() == "baryon") {
131  if ( particle->GetPDGCharge() != 0.0 ) isAnyChargedBaryon = true;
132  }
133  }
134 
135  if (!isEmProc) return;
136 
137  // RULE 1
138  // e+, e- and gamma should exist
139  // if one of them exist
140  bool isEmBasic = isElectron || isPositron || isGamma;
141  bool isMissingEmBasic = !isElectron || !isPositron || !isGamma;
142  if (isEmBasic && isMissingEmBasic) {
143  G4String missingName="";
144  if (!isElectron) missingName += "e- ";
145  if (!isPositron) missingName += "e+ ";
146  if (!isGamma) missingName += "gamma ";
147 
148 #ifdef G4VERBOSE
149  if (verboseLevel >0){
150  G4cout << "G4PhysicsListHelper::CheckParticleList: "
151  << missingName << " do not exist " << G4endl;
152  G4cout << " These particle are necessary for basic EM processes"
153  << G4endl;
154  }
155 #endif
156  G4Exception("G4PhysicsListHelper::CheckParticleList",
157  "Run0101", FatalException,
158  "Missing EM basic particle");
159  }
160 
161  // RULE 2
162  // proton should exist
163  // if any other charged baryon exist
164  if (!isProton && isAnyChargedBaryon) {
165  G4String missingName="proton ";
166 
167 #ifdef G4VERBOSE
168  if (verboseLevel >0){
169  G4cout << "G4PhysicsListHelper::CheckParticleList: "
170  << missingName << " does not exist "<< G4endl;
171  G4cout << " Proton is necessary for EM baryon processes" << G4endl;
172  }
173 #endif
174  missingName += " should be created ";
175  G4Exception("G4PhysicsListHelper::CheckParticleList",
176  "Run0102", FatalException,
177  "Missing Proton");
178  }
179 
180  // RULE 3
181  // GenericIonn should exist
182  // if any other ion exist
183  if (!isGenericIon && isAnyIon) {
184  G4String missingName="GenericIon ";
185 
186 #ifdef G4VERBOSE
187  if (verboseLevel >0){
188  G4cout << "G4PhysicsListHelper::CheckParticleList: "
189  << missingName << " does not exist "<< G4endl;
190  G4cout << " GenericIon should be created if any ion is necessary" << G4endl;
191  }
192 #endif
193  G4Exception("G4PhysicsListHelper::CheckParticleList",
194  "Run0103", FatalException,
195  "Missing GenericIon");
196  }
197 
198 }
G4bool isElectron(G4int ityp)
const XML_Char * name
G4ProcessManager * GetProcessManager() const
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
void reset(G4bool ifSkipIon=true)
const G4String & GetParticleType() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
G4int size() const
#define G4endl
Definition: G4ios.hh:61
G4double GetPDGCharge() const
G4ProcessVector * GetProcessList() const
void G4PhysicsListHelper::DumpOrdingParameterTable ( G4int  subType = -1) const

Definition at line 345 of file G4PhysicsListHelper.cc.

References G4cout, and G4endl.

Referenced by G4UserPhysicsListMessenger::SetNewValue().

346 {
347  if (theTable==0) {
348 #ifdef G4VERBOSE
349  if (verboseLevel >0) {
350  G4cout << "G4PhysicsListHelper::DumpOrdingParameterTable "
351  << " No ordering parameter table : " << ordParamFileName
352  << G4endl;
353  }
354 #endif
355  return;
356  }
357  G4cout << "G4PhysicsListHelper::DumpOrdingParameterTable : "
358  << ordParamFileName << G4endl;
359  G4cout << " TypeName "
360  << " ProcessType" << " SubType"
361  << " AtRest" << " AlongStep" << " PostStep"
362  << " Duplicable" << G4endl;
363  for (int i=0; i<sizeOfTable ; i++){
364  G4PhysicsListOrderingParameter* tmp=&(theTable->at(i));
365  if ((subType>=0) && (subType!=tmp->processSubType)) continue;
366  G4cout << std::setw(18) << tmp->processTypeName
367  << std::setw(15) << tmp->processType
368  << std::setw(15) << tmp->processSubType
369  << std::setw(15) << tmp->ordering[0]
370  << std::setw(15) << tmp->ordering[1]
371  << std::setw(15) << tmp->ordering[2];
372  if (tmp->isDuplicable) {
373  G4cout << " true";
374  } else {
375  G4cout << " false";
376  }
377  G4cout <<G4endl;
378  }
379 }
G4GLOB_DLL std::ostream G4cout
#define G4endl
Definition: G4ios.hh:61
G4PhysicsListOrderingParameter G4PhysicsListHelper::GetOrdingParameter ( G4int  subType) const

Definition at line 382 of file G4PhysicsListHelper.cc.

References G4cout, and G4endl.

383 {
385 
386  if (theTable==0) {
387 #ifdef G4VERBOSE
388  if (verboseLevel >0) {
389  G4cout << "G4PhysicsListHelper::GetOrderingParameter : "
390  << " No ordering parameter table : " << ordParamFileName
391  << G4endl;
392  }
393 #endif
394  return value;
395  }
396 
397  for (int i=0; i<sizeOfTable ; i++){
398  G4PhysicsListOrderingParameter* tmp=&(theTable->at(i));
399  if (subType == tmp->processSubType){
400  value.processTypeName = tmp->processTypeName;
401  value.processType = tmp->processType;
402  value.processSubType = tmp->processSubType;
403  value.ordering[0] = tmp->ordering[0];
404  value.ordering[1] = tmp->ordering[1];
405  value.ordering[2] = tmp->ordering[2];
406  value.isDuplicable = tmp->isDuplicable;
407  }
408  }
409  return value;
410 }
G4GLOB_DLL std::ostream G4cout
const XML_Char int const XML_Char * value
#define G4endl
Definition: G4ios.hh:61
G4PhysicsListHelper * G4PhysicsListHelper::GetPhysicsListHelper ( )
static
G4int G4PhysicsListHelper::GetVerboseLevel ( ) const
inline

Definition at line 132 of file G4PhysicsListHelper.hh.

133 {
134  return verboseLevel;
135 }
G4bool G4PhysicsListHelper::RegisterProcess ( G4VProcess process,
G4ParticleDefinition particle 
)

Definition at line 413 of file G4PhysicsListHelper.cc.

References G4ProcessManager::AddProcess(), FatalException, G4cout, G4endl, G4Exception(), G4ParticleDefinition::GetParticleName(), G4ProcessManager::GetProcessList(), G4ParticleDefinition::GetProcessManager(), G4VProcess::GetProcessName(), G4VProcess::GetProcessSubType(), G4VProcess::GetProcessType(), JustWarning, G4ProcessManager::SetProcessOrdering(), G4ProcessManager::SetProcessOrderingToFirst(), G4ProcessManager::SetProcessOrderingToLast(), and G4ProcessVector::size().

Referenced by PhysicsList::AddDecay(), PhysicsList::AddRadioactiveDecay(), G4EmLowEPPhysics::ConstructProcess(), G4EmLivermorePolarizedPhysics::ConstructProcess(), G4EmLivermorePhysics::ConstructProcess(), G4EmPenelopePhysics::ConstructProcess(), G4EmDNAPhysics::ConstructProcess(), PhysListEmStandardNR::ConstructProcess(), G4MonopolePhysics::ConstructProcess(), G4EmStandardPhysics_option3::ConstructProcess(), G4EmStandardPhysics::ConstructProcess(), G4DecayPhysics::ConstructProcess(), G4EmStandardPhysics_option4::ConstructProcess(), G4EmStandardPhysics_option1::ConstructProcess(), G4EmStandardPhysics_option2::ConstructProcess(), and G4VPhysicsConstructor::RegisterProcess().

415 {
416  if (theTable==0) {
417 #ifdef G4VERBOSE
418  if (verboseLevel >0) {
419  G4cout << "G4PhysicsListHelper::RegisterProcess :"
420  << " No ordering parameter table : " << ordParamFileName
421  << G4endl;
422  }
423 #endif
424  G4Exception("G4PhysicsListHelper::RegisterPorcess",
425  "Run0107", FatalException,
426  "No Ordering Parameter Table");
427  return false;
428  }
429 
430  const G4String pName = process->GetProcessName();
431  const G4int pType = process->GetProcessType();
432  const G4int pSubType = process->GetProcessSubType();
433 
434 #ifdef G4VERBOSE
435  if (verboseLevel >2) {
436  G4cout << "G4PhysicsListHelper::RegisterProcess :"
437  << pName << " Process Type = " << pType
438  << " SubType = "<< pSubType
439  << " to " << particle->GetParticleName()
440  << G4endl;
441  }
442 #endif
443 
444  // Check Process Type/SubType
445  if ((pType <1)||(pSubType<1)) {
446 #ifdef G4VERBOSE
447  if (verboseLevel >0) {
448  G4cout << "G4PhysicsListHelper::RegisterProcess :"
449  << pName << " for " << particle->GetParticleName()
450  << " has illegal Process Type = " << pType
451  << " SubType = "<< pSubType << G4endl;
452  }
453 #endif
454  G4Exception("G4PhysicsListHelper::RegisterPorcess",
455  "Run0108", FatalException,
456  "No Matching process Type/SubType");
457  return false;
458  }
459 
460  G4bool isFound = false;
461  G4int ord[3];
462  G4bool duplicable = false;
463  for (int i=0; i<sizeOfTable ; i++){
464  G4PhysicsListOrderingParameter* tmp=&(theTable->at(i));
465  if ((tmp->processType==pType)&&(tmp->processSubType==pSubType)){
466  ord[0] = tmp->ordering[0];
467  ord[1] = tmp->ordering[1];
468  ord[2] = tmp->ordering[2];
469  duplicable = tmp->isDuplicable;
470  isFound = true;
471  break;
472  }
473  }
474  if (!isFound) {
475 #ifdef G4VERBOSE
476  if (verboseLevel >0) {
477  G4cout << "G4PhysicsListHelper::RegisterProcess :"
478  << pName << " for " << particle->GetParticleName()
479  << " with type/subtype ="
480  << pType << "/" << pSubType
481  << " is not reigstered in OrdingParameterTable "
482  << G4endl;
483  }
484 #endif
485  G4Exception("G4PhysicsListHelper::RegisterPorcess",
486  "Run0109", FatalException,
487  "No Matching process Type/SubType");
488  return false;
489  }
490 
491  // Check Process Manager
492  G4ProcessManager* pManager = particle->GetProcessManager();
493  if ( pManager == 0) {
494  // Error !! no process manager
495 #ifdef G4VERBOSE
496  if (verboseLevel>0){
497  G4cout << "G4PhysicsListHelper::RegisterProcess "
498  <<" : No Process Manager for "
499  << particle->GetParticleName() << G4endl;
500  }
501 #endif
502  G4Exception("G4PhysicsListHelper::RegisterProcess ",
503  "Riun0110", FatalException,
504  "No process manager");
505  return false;
506  }
507 
508  // Check Duplication
509  if (!duplicable){
510  G4bool duplicated = false;
511  G4ProcessVector* pList = pManager->GetProcessList();
512  for (G4int idx=0; idx<pList->size(); idx++) {
513  const G4VProcess* p = (*pList)[idx];
514  if ((p->GetProcessType()== pType) &&
515  (p->GetProcessSubType()== pSubType)){
516  duplicated = true;
517 #ifdef G4VERBOSE
518  if (verboseLevel >0) {
519  G4cout << "G4PhysicsListHelper::RegisterProcess :"
520  << pName << " for " << particle->GetParticleName()
521  << " with type/subtype ="
522  << pType << "/" << pSubType
523  << " is has same subType as "
524  << p->GetProcessName()
525  << " for " << particle->GetParticleName()
526  << G4endl;
527  G4cout << "It will not be added !!" << G4endl;
528  }
529 #endif
530  G4Exception("G4PhysicsListHelper::RegisterPorcess",
531  "Run0111", JustWarning,
532  "Duplication of processes");
533  }
534  }
535  if (duplicated) return false;
536  }
537 
538  // Add Process
539  G4int code = pManager ->AddProcess(process);
540  if (code <0) return false;
541 
542  // Set Ordering Parameter
543  for(G4int idx=0; idx<3; idx++){
544  G4ProcessVectorDoItIndex idxOrd = static_cast<G4ProcessVectorDoItIndex>(idx);
545  if (ord[idx]<0) {
546  // Do Nothing because NO DOIT
547  } else if (ord[idx]==0) {
548  pManager->SetProcessOrderingToFirst( process, idxOrd );
549  } else if (ord[idx]<9999) {
550  pManager->SetProcessOrdering( process, idxOrd , ord[idx]);
551  } else {
552  pManager->SetProcessOrderingToLast( process, idxOrd );
553  }
554  }
555 #ifdef G4VERBOSE
556  if (verboseLevel >1) {
557  G4cout << "G4PhysicsListHelper::RegisterProcess :"
558  << pName << " for " << particle->GetParticleName()
559  << " with type/subtype ="
560  << pType << "/" << pSubType
561  << " is sucessfully registered with ordering parameters "
562  << ord[0] << ":" << ord[1] << ":" << ord[2]
563  << G4endl;
564  }
565 #endif
566  return true;
567 }
void SetProcessOrderingToFirst(G4VProcess *aProcess, G4ProcessVectorDoItIndex idDoIt)
const char * p
Definition: xmltok.h:285
G4ProcessType GetProcessType() const
Definition: G4VProcess.hh:414
G4ProcessManager * GetProcessManager() const
int G4int
Definition: G4Types.hh:78
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
bool G4bool
Definition: G4Types.hh:79
G4int AddProcess(G4VProcess *aProcess, G4int ordAtRestDoIt=ordInActive, G4int ordAlongSteptDoIt=ordInActive, G4int ordPostStepDoIt=ordInActive)
void SetProcessOrdering(G4VProcess *aProcess, G4ProcessVectorDoItIndex idDoIt, G4int ordDoIt=ordDefault)
const G4String & GetProcessName() const
Definition: G4VProcess.hh:408
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
G4int size() const
Definition: inftrees.h:24
void SetProcessOrderingToLast(G4VProcess *aProcess, G4ProcessVectorDoItIndex idDoIt)
#define G4endl
Definition: G4ios.hh:61
G4int GetProcessSubType() const
Definition: G4VProcess.hh:426
G4ProcessVectorDoItIndex
G4ProcessVector * GetProcessList() const
void G4PhysicsListHelper::SetVerboseLevel ( G4int  value)
inline

Definition at line 126 of file G4PhysicsListHelper.hh.

127 {
128  verboseLevel = value;
129 }
const XML_Char int const XML_Char * value
void G4PhysicsListHelper::UseCoupledTransportation ( G4bool  vl = true)
inline

Definition at line 120 of file G4PhysicsListHelper.hh.

121 {
122  useCoupledTransportation = vl;
123 }

The documentation for this class was generated from the following files: