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 G4PhysicsListHelper * GetPhysicsListHelper ()


Detailed Description

Definition at line 50 of file G4PhysicsListHelper.hh.


Member Function Documentation

void G4PhysicsListHelper::AddTransportation (  ) 

Definition at line 205 of file G4PhysicsListHelper.cc.

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

Referenced by G4VUserPhysicsList::AddTransportation().

00206 {
00207   G4int verboseLevelTransport = 0;
00208 
00209 #ifdef G4VERBOSE
00210   if (verboseLevel >2){
00211     G4cout << "G4PhysicsListHelper::AddTransportation()  "<< G4endl;
00212   }
00213 #endif
00214 
00215   G4int nParaWorld = 
00216     G4RunManagerKernel::GetRunManagerKernel()->GetNumberOfParallelWorld();
00217   
00218   if ( nParaWorld>0 || 
00219        useCoupledTransportation || 
00220        G4ScoringManager::GetScoringManagerIfExist()) {
00221 #ifdef G4VERBOSE
00222     if (verboseLevel >0) {
00223       G4cout << " G4PhysicsListHelper::AddTransportation()"
00224              << "--- G4CoupledTransportation is used " 
00225              << G4endl;
00226     }
00227 #endif
00228     theTransportationProcess = new G4CoupledTransportation(verboseLevelTransport);    
00229   } else {
00230     theTransportationProcess = new G4Transportation(verboseLevelTransport);
00231   }
00232  
00233   // loop over all particles in G4ParticleTable
00234   theParticleIterator->reset();
00235   while( (*theParticleIterator)() ){
00236     G4ParticleDefinition* particle = theParticleIterator->value();
00237     G4ProcessManager* pmanager = particle->GetProcessManager();
00238     // Add transportation process for all particles 
00239     if ( pmanager == 0) {
00240       // Error !! no process manager
00241 #ifdef G4VERBOSE
00242       if (verboseLevel>0){
00243         G4cout << "G4PhysicsListHelper::AddTransportation  "
00244                <<" : No Process Manager for "
00245                << particle->GetParticleName() << G4endl;
00246       }
00247 #endif
00248       G4Exception("G4PhysicsListHelper::AddTransportation",
00249                   "Run0104", FatalException,
00250                   "No process manager");
00251       continue;
00252     } 
00253     // add transportation with ordering = ( -1, "first", "first" )
00254     pmanager ->AddProcess(theTransportationProcess);
00255     pmanager ->SetProcessOrderingToFirst(theTransportationProcess, idxAlongStep);
00256     pmanager ->SetProcessOrderingToFirst(theTransportationProcess, idxPostStep);
00257   }
00258 }

void G4PhysicsListHelper::CheckParticleList (  )  const

Definition at line 97 of file G4PhysicsListHelper.cc.

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

Referenced by G4VUserPhysicsList::CheckParticleList().

00098 {
00099   bool isElectron = false;
00100   bool isPositron = false;
00101   bool isGamma    = false;
00102   bool isProton   = false;
00103   bool isGenericIon = false;
00104   bool isAnyIon   = false;
00105   bool isAnyChargedBaryon   = false;
00106   bool isEmProc   = false;
00107 
00108   // loop over all particles in G4ParticleTable
00109   theParticleIterator->reset();
00110   while( (*theParticleIterator)() ){
00111     G4ParticleDefinition* particle = theParticleIterator->value();
00112     G4String name = particle->GetParticleName();
00113     // check if any EM process exists
00114     if (!isEmProc) {
00115       G4ProcessVector* list = particle->GetProcessManager()->GetProcessList();
00116       for (int idx=0; idx<list->size(); idx++){
00117         isEmProc = ((*list)[idx])->GetProcessType() == fElectromagnetic;
00118         if (isEmProc) break;
00119       }
00120     }
00121     
00122     if      ( name == "e-") isElectron = true; 
00123     else if ( name == "e+") isPositron = true; 
00124     else if ( name == "gamma") isGamma = true; 
00125     else if ( name == "GenericIon") isGenericIon = true; 
00126     else if ( name == "proton") isProton = true; 
00127     else if ( particle->GetParticleType() == "nucleus") isAnyIon = true;
00128     else if ( particle->GetParticleType() == "baryon") {
00129        if ( particle->GetPDGCharge() != 0.0 ) isAnyChargedBaryon = true;
00130     }
00131   }
00132 
00133   if (!isEmProc) return;
00134 
00135   // RULE 1
00136   //  e+, e- and gamma should exist 
00137   //   if one of them exist
00138   bool isEmBasic =  isElectron || isPositron || isGamma;
00139   bool isMissingEmBasic =  !isElectron || !isPositron || !isGamma;
00140   if (isEmBasic && isMissingEmBasic) {
00141     G4String missingName="";
00142     if (!isElectron) missingName += "e- ";
00143     if (!isPositron) missingName += "e+ ";
00144     if (!isGamma) missingName += "gamma ";
00145 
00146 #ifdef G4VERBOSE
00147     if (verboseLevel >0){
00148       G4cout << "G4PhysicsListHelper::CheckParticleList: "
00149              << missingName << " do not exist " << G4endl; 
00150       G4cout << " These particle are necessary for basic EM processes" 
00151              << G4endl;
00152     }
00153 #endif
00154     G4Exception("G4PhysicsListHelper::CheckParticleList",
00155                 "Run0101", FatalException,
00156                 "Missing EM basic particle");
00157   }
00158 
00159   // RULE 2
00160   //  proton should exist 
00161   //   if any other charged baryon  exist
00162   if (!isProton && isAnyChargedBaryon) {
00163     G4String missingName="proton ";
00164 
00165 #ifdef G4VERBOSE
00166     if (verboseLevel >0){
00167       G4cout << "G4PhysicsListHelper::CheckParticleList: "
00168              << missingName << " does not exist "<< G4endl; 
00169       G4cout << " Proton is necessary for EM baryon processes" << G4endl;
00170     }
00171 #endif
00172     missingName += " should be created ";
00173     G4Exception("G4PhysicsListHelper::CheckParticleList",
00174                 "Run0102", FatalException,
00175                 "Missing Proton");
00176   }
00177    
00178   // RULE 3
00179   //  GenericIonn should exist 
00180   //   if any other ion  exist
00181   if (!isGenericIon && isAnyIon) {
00182     G4String missingName="GenericIon ";
00183 
00184 #ifdef G4VERBOSE
00185     if (verboseLevel >0){
00186       G4cout << "G4PhysicsListHelper::CheckParticleList: "
00187              << missingName << " does not exist "<< G4endl; 
00188       G4cout << " GenericIon should be created if any ion is necessary" << G4endl;
00189     }
00190 #endif
00191     G4Exception("G4PhysicsListHelper::CheckParticleList",
00192                 "Run0103", FatalException,
00193                 "Missing GenericIon");
00194   }
00195       
00196 }

void G4PhysicsListHelper::DumpOrdingParameterTable ( G4int  subType = -1  )  const

Definition at line 340 of file G4PhysicsListHelper.cc.

References G4cout, and G4endl.

Referenced by G4UserPhysicsListMessenger::SetNewValue().

00341 {
00342  if (theTable==0) {
00343 #ifdef G4VERBOSE
00344     if (verboseLevel >0) {
00345       G4cout << "G4PhysicsListHelper::DumpOrdingParameterTable   "
00346              << " No ordering parameter table  : " << ordParamFileName 
00347              << G4endl;
00348     }
00349 #endif
00350     return;
00351   }
00352   G4cout << "G4PhysicsListHelper::DumpOrdingParameterTable  : "
00353          << ordParamFileName << G4endl; 
00354   G4cout << "          TypeName  " 
00355          << "    ProcessType" <<  "        SubType"
00356          << "         AtRest" <<  "      AlongStep" <<  "        PostStep"
00357          << "     Duplicable" << G4endl;
00358   for (int i=0; i<sizeOfTable ; i++){
00359     G4PhysicsListOrderingParameter* tmp=&(theTable->at(i));
00360     if ((subType>=0) && (subType!=tmp->processSubType)) continue;
00361     G4cout << std::setw(18)     << tmp->processTypeName 
00362            << std::setw(15)     << tmp->processType 
00363            << std::setw(15)     << tmp->processSubType
00364            << std::setw(15)     << tmp->ordering[0] 
00365            << std::setw(15)     << tmp->ordering[1] 
00366            << std::setw(15)     << tmp->ordering[2];
00367     if (tmp->isDuplicable) {
00368       G4cout << "  true";
00369     } else {
00370       G4cout << "  false";
00371     }
00372     G4cout <<G4endl;
00373   }  
00374 }

G4PhysicsListOrderingParameter G4PhysicsListHelper::GetOrdingParameter ( G4int  subType  )  const

Definition at line 377 of file G4PhysicsListHelper.cc.

References G4cout, G4endl, G4PhysicsListOrderingParameter::isDuplicable, G4PhysicsListOrderingParameter::ordering, G4PhysicsListOrderingParameter::processSubType, G4PhysicsListOrderingParameter::processType, and G4PhysicsListOrderingParameter::processTypeName.

00378 {
00379   G4PhysicsListOrderingParameter value;
00380 
00381  if (theTable==0) {
00382 #ifdef G4VERBOSE
00383     if (verboseLevel >0) {
00384       G4cout << "G4PhysicsListHelper::GetOrderingParameter : "
00385              << " No ordering parameter table  : " << ordParamFileName 
00386              << G4endl;
00387     }
00388 #endif
00389     return value;
00390   }
00391 
00392   for (int i=0; i<sizeOfTable ; i++){
00393     G4PhysicsListOrderingParameter* tmp=&(theTable->at(i));
00394     if (subType == tmp->processSubType){
00395       value.processTypeName = tmp->processTypeName; 
00396       value.processType     = tmp->processType; 
00397       value.processSubType  = tmp->processSubType; 
00398       value.ordering[0]     = tmp->ordering[0]; 
00399       value.ordering[1]     = tmp->ordering[1]; 
00400       value.ordering[2]     = tmp->ordering[2]; 
00401       value.isDuplicable    = tmp->isDuplicable;
00402     }
00403   }  
00404   return value;
00405 }

G4PhysicsListHelper * G4PhysicsListHelper::GetPhysicsListHelper (  )  [static]

Definition at line 89 of file G4PhysicsListHelper.cc.

Referenced by G4RadioactiveDecayPhysics::ConstructProcess(), G4EmStandardPhysics_option4::ConstructProcess(), G4EmStandardPhysics_option3::ConstructProcess(), G4EmStandardPhysics_option2::ConstructProcess(), G4EmStandardPhysics_option1::ConstructProcess(), G4EmStandardPhysics::ConstructProcess(), G4EmPenelopePhysics::ConstructProcess(), G4EmLowEPPhysics::ConstructProcess(), G4EmLivermorePolarizedPhysics::ConstructProcess(), G4EmLivermorePhysics::ConstructProcess(), G4EmDNAPhysicsChemistry::ConstructProcess(), G4EmDNAPhysics::ConstructProcess(), G4DecayPhysics::ConstructProcess(), G4VPhysicsConstructor::G4VPhysicsConstructor(), G4VUserPhysicsList::G4VUserPhysicsList(), and G4UserPhysicsListMessenger::SetNewValue().

00090 {
00091   static G4PhysicsListHelper thePLHelper;
00092   if (pPLHelper == 0) pPLHelper = &thePLHelper;
00093   return pPLHelper;
00094 }

G4int G4PhysicsListHelper::GetVerboseLevel (  )  const [inline]

Definition at line 132 of file G4PhysicsListHelper.hh.

00133 {
00134   return verboseLevel;
00135 }

G4bool G4PhysicsListHelper::RegisterProcess ( G4VProcess *  process,
G4ParticleDefinition *  particle 
)

Definition at line 408 of file G4PhysicsListHelper.cc.

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

Referenced by G4EmStandardPhysics_option4::ConstructProcess(), G4EmStandardPhysics_option3::ConstructProcess(), G4EmStandardPhysics_option2::ConstructProcess(), G4EmStandardPhysics_option1::ConstructProcess(), G4EmStandardPhysics::ConstructProcess(), G4EmPenelopePhysics::ConstructProcess(), G4EmLowEPPhysics::ConstructProcess(), G4EmLivermorePolarizedPhysics::ConstructProcess(), G4EmLivermorePhysics::ConstructProcess(), G4EmDNAPhysicsChemistry::ConstructProcess(), G4EmDNAPhysics::ConstructProcess(), G4DecayPhysics::ConstructProcess(), G4VUserPhysicsList::RegisterProcess(), and G4VPhysicsConstructor::RegisterProcess().

00410 {
00411   if (theTable==0) {
00412 #ifdef G4VERBOSE
00413     if (verboseLevel >0) {
00414       G4cout << "G4PhysicsListHelper::RegisterProcess :"
00415              << " No ordering parameter table  : " << ordParamFileName 
00416              << G4endl;
00417     }
00418 #endif
00419     G4Exception("G4PhysicsListHelper::RegisterPorcess",
00420                 "Run0107", FatalException, 
00421                 "No Ordering Parameter Table");
00422     return false;
00423   }
00424 
00425   const G4String pName = process->GetProcessName(); 
00426   const G4int pType    = process->GetProcessType();
00427   const G4int pSubType = process->GetProcessSubType();
00428   
00429 #ifdef G4VERBOSE
00430   if (verboseLevel >2) {
00431     G4cout << "G4PhysicsListHelper::RegisterProcess :"
00432            << pName << " Process Type = " << pType 
00433            << " SubType = "<< pSubType  
00434            << " to " << particle->GetParticleName()
00435            << G4endl;
00436   }
00437 #endif
00438 
00439   // Check Process Type/SubType
00440   if ((pType <1)||(pSubType<1)) {
00441 #ifdef G4VERBOSE
00442     if (verboseLevel >0) {
00443       G4cout << "G4PhysicsListHelper::RegisterProcess :"
00444              << pName << " for " << particle->GetParticleName()
00445              << " has illegal Process Type = " << pType 
00446              << " SubType = "<< pSubType << G4endl;
00447     }
00448 #endif
00449     G4Exception("G4PhysicsListHelper::RegisterPorcess",
00450                 "Run0108", FatalException, 
00451                 "No Matching process Type/SubType");
00452     return false;
00453   }
00454   
00455   G4bool isFound = false;
00456   G4int  ord[3];
00457   G4bool duplicable = false;
00458   for (int i=0; i<sizeOfTable ; i++){
00459     G4PhysicsListOrderingParameter* tmp=&(theTable->at(i));
00460     if ((tmp->processType==pType)&&(tmp->processSubType==pSubType)){
00461       ord[0] = tmp->ordering[0]; 
00462       ord[1] = tmp->ordering[1]; 
00463       ord[2] = tmp->ordering[2];
00464       duplicable = tmp->isDuplicable;
00465       isFound = true;
00466       break;
00467     }
00468   } 
00469   if (!isFound) {
00470 #ifdef G4VERBOSE
00471     if (verboseLevel >0) {
00472       G4cout << "G4PhysicsListHelper::RegisterProcess :"
00473              << pName << " for " << particle->GetParticleName()
00474              << " with  type/subtype =" 
00475              << pType << "/" << pSubType 
00476              << "  is not reigstered in OrdingParameterTable  "
00477              << G4endl;
00478     }
00479 #endif
00480     G4Exception("G4PhysicsListHelper::RegisterPorcess",
00481                 "Run0109", FatalException, 
00482                 "No Matching process Type/SubType");
00483     return false;
00484   }
00485 
00486   // Check Process Manager
00487   G4ProcessManager* pManager = particle->GetProcessManager();
00488   if ( pManager == 0) {
00489       // Error !! no process manager
00490 #ifdef G4VERBOSE
00491     if (verboseLevel>0){
00492       G4cout << "G4PhysicsListHelper::RegisterProcess "
00493              <<" : No Process Manager for "
00494              << particle->GetParticleName() << G4endl;
00495     }
00496 #endif
00497     G4Exception("G4PhysicsListHelper::RegisterProcess   ",
00498                 "Riun0110", FatalException,
00499                 "No process manager");
00500     return false;
00501   }
00502 
00503   // Check Duplication
00504   if (!duplicable){
00505     G4bool duplicated = false;
00506     G4ProcessVector* pList = pManager->GetProcessList();
00507     for (G4int idx=0; idx<pList->size(); idx++) {
00508       const G4VProcess* p = (*pList)[idx];
00509       if ((p->GetProcessType()== pType)  && 
00510           (p->GetProcessSubType()== pSubType)){
00511         duplicated = true;
00512 #ifdef G4VERBOSE
00513         if (verboseLevel >0) {
00514           G4cout << "G4PhysicsListHelper::RegisterProcess :"
00515                  << pName << " for " << particle->GetParticleName()
00516                  << " with  type/subtype =" 
00517                  << pType << "/" << pSubType 
00518                  << "  is has same subType as "
00519                  << p->GetProcessName()
00520                  << " for " << particle->GetParticleName()
00521                  << G4endl;
00522           G4cout << "It will not be added !!" << G4endl;
00523         }
00524 #endif
00525         G4Exception("G4PhysicsListHelper::RegisterPorcess",
00526                     "Run0111", JustWarning, 
00527                     "Duplication of processes");
00528       }
00529     }
00530     if (duplicated) return false;
00531   }
00532 
00533   // Add Process
00534   G4int code = pManager ->AddProcess(process);
00535   if (code <0) return false;
00536 
00537   // Set Ordering Parameter
00538   for(G4int idx=0; idx<3; idx++){
00539     G4ProcessVectorDoItIndex idxOrd = static_cast<G4ProcessVectorDoItIndex>(idx);
00540     if (ord[idx]<0) {
00541       // Do Nothing because NO DOIT
00542     } else if (ord[idx]==0) {
00543       pManager->SetProcessOrderingToFirst( process, idxOrd );
00544     } else if (ord[idx]<9999) {
00545       pManager->SetProcessOrdering( process, idxOrd , ord[idx]);
00546     } else {
00547       pManager->SetProcessOrderingToLast( process, idxOrd );
00548     } 
00549   } 
00550 #ifdef G4VERBOSE
00551   if (verboseLevel >1) {
00552     G4cout << "G4PhysicsListHelper::RegisterProcess :"
00553            << pName << " for " << particle->GetParticleName()
00554            << " with  type/subtype =" 
00555            << pType << "/" << pSubType 
00556            << " is sucessfully registered with ordering parameters "
00557            << ord[0] << ":" << ord[1] << ":" << ord[2]
00558            << G4endl;
00559         }
00560 #endif
00561   return true;
00562 }

void G4PhysicsListHelper::SetVerboseLevel ( G4int  value  )  [inline]

Definition at line 126 of file G4PhysicsListHelper.hh.

Referenced by G4VUserPhysicsList::G4VUserPhysicsList(), and G4VUserPhysicsList::SetVerboseLevel().

00127 {  
00128   verboseLevel = value;
00129 }

void G4PhysicsListHelper::UseCoupledTransportation ( G4bool  vl = true  )  [inline]

Definition at line 120 of file G4PhysicsListHelper.hh.

Referenced by G4VUserPhysicsList::UseCoupledTransportation().

00121 { 
00122   useCoupledTransportation = vl; 
00123 }


The documentation for this class was generated from the following files:
Generated on Mon May 27 17:52:54 2013 for Geant4 by  doxygen 1.4.7