/scratch0/jsnuveri/BDSIM/BDSIMgit/bdsim/src/BDSModularPhysicsList.cc

00001 #include "BDSModularPhysicsList.hh"
00002 #include "BDSGlobalConstants.hh"
00003 #include "G4EmPenelopePhysics.hh"
00004 #include "G4OpticalPhysics.hh"
00005 #include "G4OpticalProcessIndex.hh"
00006 #include "G4ParticleTable.hh"
00007 #include "BDSSynchRadPhysics.hh"
00008 #include "G4EmStandardPhysics.hh"
00009 #include "BDSParameterisationPhysics.hh"
00010 #include "G4DecayPhysics.hh"
00011 #include "BDSSynchRadPhysics.hh"
00012 #include "G4Electron.hh"
00013 #include "G4Positron.hh"
00014 #include "G4Proton.hh"
00015 #include "G4AntiProton.hh"
00016 
00017 #include "G4Version.hh"
00018 #if G4VERSION_NUMBER < 1000
00019 #include "HadronPhysicsQGSP_BERT.hh"
00020 #include "HadronPhysicsQGSP_BERT_HP.hh"
00021 #else
00022 #include "G4HadronPhysicsQGSP_BERT_HP.hh"
00023 #include "G4HadronPhysicsQGSP_BERT.hh"
00024 #endif
00025 
00026 //Note: transportation process is constructed by default with classes derive from G4VModularPhysicsList
00027 
00028 BDSModularPhysicsList::BDSModularPhysicsList(): G4VModularPhysicsList(),_physListName(BDSGlobalConstants::Instance()->GetPhysListName()) {
00029   SetVerboseLevel(1);
00030   _emPhysics=NULL;
00031   _hadronicPhysics=NULL;
00032   _muonPhysics=NULL;
00033   _opticalPhysics=NULL;
00034   _decayPhysics=NULL;
00035   _paramPhysics=NULL;
00036   _synchRadPhysics=NULL;
00037   _cutsAndLimits=NULL;
00038   
00039   ParsePhysicsList();
00040   ConfigurePhysics();
00041   Register();
00042   ConstructMinimumParticleSet();
00043   SetParticleDefinition();
00044   SetCuts();
00045 }
00046 
00047 void BDSModularPhysicsList::Print(){
00048 }
00049 
00050 //Parse the physicsList option
00051 void BDSModularPhysicsList::ParsePhysicsList(){
00052   if(_physListName.contains((G4String)"em")){
00053     if(_physListName.contains((G4String)"emlow")){
00054       LoadEmLow();
00055     } else       
00056       LoadEm();
00057   }
00058   
00059   //Hadronic
00060   if(_physListName.contains((G4String)"hadronic")){
00061     if(!_emPhysics){
00062       LoadEm();
00063     }
00064     if(_physListName.contains((G4String)"hadronichp")){
00065       LoadHadronicHP();
00066     }else{
00067       LoadHadronic();
00068     }
00069   }
00070   
00071   //Synchrotron radiation
00072   if(_physListName.contains((G4String)"synchrad")){
00073     if(!_emPhysics){
00074       LoadEm();
00075     }
00076     LoadSynchRad();
00077   }
00078 
00079   //Cross section biased muon production
00080   if(_physListName.contains((G4String)"muon")){
00081     //Must construct em physics first
00082     if(!_emPhysics){
00083       LoadEm();
00084     }
00085     if(!_hadronicPhysics){
00086       LoadHadronic();
00087     }
00088     LoadMuon();
00089   }
00090 
00091   if(_physListName.contains((G4String)"optical")){
00092     //Optical
00093     LoadOptical();
00094   }
00095   //Decay - constructed by default if hadronic or em are constructed, 
00096   //unless "nodecay"
00097   if(_hadronicPhysics || _emPhysics){
00098     if(!_physListName.contains((G4String)"nodecay")){
00099       LoadDecay();
00100     }
00101   }
00102   //Always load cuts and limits.
00103   LoadCutsAndLimits();
00104 }
00105 
00106 void BDSModularPhysicsList::ConstructMinimumParticleSet(){
00107   //Minimum required set of particles required for tracking
00108   G4Electron::Electron();
00109   G4Positron::Positron();
00110   G4Proton::Proton();
00111   G4AntiProton::AntiProton();
00112 }
00113 
00114 void BDSModularPhysicsList::ConfigurePhysics(){
00115   if(_opticalPhysics){ ConfigureOptical();}
00116 }
00117 
00118 void BDSModularPhysicsList::ConfigureOptical(){
00119   if (!_opticalPhysics) return;
00120   BDSGlobalConstants* globals = BDSGlobalConstants::Instance();
00121   _opticalPhysics->Configure(kCerenkov,  globals->GetTurnOnCerenkov());
00122   _opticalPhysics->Configure(kScintillation, true);
00123   _opticalPhysics->Configure(kAbsorption, globals->GetTurnOnOpticalAbsorption());
00124   _opticalPhysics->Configure(kRayleigh, globals->GetTurnOnRayleighScattering());
00125   _opticalPhysics->Configure(kMieHG, globals->GetTurnOnMieScattering());
00126   _opticalPhysics->Configure(kBoundary, globals->GetTurnOnOpticalSurface());
00127   _opticalPhysics->Configure(kWLS, true);
00128     //    _opticalPhysics->Configure(kNoProcess,      globals->GetTurnOn< Number of processes, no selected process
00129   _opticalPhysics->SetScintillationYieldFactor(globals->GetScintYieldFactor());
00130 }
00131 
00132 void BDSModularPhysicsList::Register(){
00133   std::vector<G4VPhysicsConstructor*>::iterator it;
00134   for(it = _constructors.begin(); it != _constructors.end(); it++){
00135     RegisterPhysics(*it);
00136   }
00137 }
00138 
00139 BDSModularPhysicsList::~BDSModularPhysicsList()
00140 { 
00141 }
00142 
00143 
00144 void BDSModularPhysicsList::SetCuts()
00145 {
00146   G4VUserPhysicsList::SetCuts();
00147 
00148   SetCutsWithDefault();   
00149   
00150   if(BDSGlobalConstants::Instance()->GetProdCutPhotons()>0)
00151     SetCutValue(BDSGlobalConstants::Instance()->GetProdCutPhotons(),G4ProductionCuts::GetIndex("gamma"));
00152   
00153   if(BDSGlobalConstants::Instance()->GetProdCutElectrons()>0)
00154     SetCutValue(BDSGlobalConstants::Instance()->GetProdCutElectrons(),G4ProductionCuts::GetIndex("e-"));
00155   
00156   if(BDSGlobalConstants::Instance()->GetProdCutPositrons()>0)
00157     SetCutValue(BDSGlobalConstants::Instance()->GetProdCutPositrons(),G4ProductionCuts::GetIndex("e+"));
00158   
00159   DumpCutValuesTable(); 
00160 }  
00161 
00162 void BDSModularPhysicsList::SetParticleDefinition(){
00163   // set primary particle definition and kinetic beam parameters other than total energy
00164   G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
00165   BDSGlobalConstants::Instance()->SetParticleDefinition(particleTable->
00166                                                         FindParticle(BDSGlobalConstants::Instance()->GetParticleName()) );  
00167   
00168   if(!BDSGlobalConstants::Instance()->GetParticleDefinition()) 
00169     {
00170       G4Exception("Particle not found, quitting!", "-1", FatalException, "");
00171       exit(1);
00172     }
00173   
00174   // set kinetic beam parameters other than total energy
00175   BDSGlobalConstants::Instance()->SetBeamMomentum( sqrt(pow(BDSGlobalConstants::Instance()->GetBeamTotalEnergy(),2)-
00176                                                         pow(BDSGlobalConstants::Instance()->GetParticleDefinition()->GetPDGMass(),2)) );
00177   
00178   BDSGlobalConstants::Instance()->SetBeamKineticEnergy(BDSGlobalConstants::Instance()->GetBeamTotalEnergy() - 
00179                                                        BDSGlobalConstants::Instance()->GetParticleDefinition()->GetPDGMass() );
00180   
00181   BDSGlobalConstants::Instance()->SetParticleMomentum( sqrt(pow(BDSGlobalConstants::Instance()->GetParticleTotalEnergy(),2)-
00182                                     pow(BDSGlobalConstants::Instance()->GetParticleDefinition()->GetPDGMass(),2)) );
00183   
00184   BDSGlobalConstants::Instance()->SetParticleKineticEnergy(BDSGlobalConstants::Instance()->GetParticleTotalEnergy() - 
00185                                    BDSGlobalConstants::Instance()->GetParticleDefinition()->GetPDGMass() );
00186   
00187   G4cout << __METHOD_NAME__ << "Beam properties:"<<G4endl;
00188   G4cout << __METHOD_NAME__ << "Particle : " 
00189          << BDSGlobalConstants::Instance()->GetParticleDefinition()->GetParticleName()<<G4endl;
00190   G4cout << __METHOD_NAME__ << "Mass : " 
00191          << BDSGlobalConstants::Instance()->GetParticleDefinition()->GetPDGMass()/CLHEP::GeV<< " GeV"<<G4endl;
00192   G4cout << __METHOD_NAME__ << "Charge : " 
00193          << BDSGlobalConstants::Instance()->GetParticleDefinition()->GetPDGCharge()<< " e"<<G4endl;
00194   G4cout << __METHOD_NAME__ << "Total Energy : "
00195          << BDSGlobalConstants::Instance()->GetBeamTotalEnergy()/CLHEP::GeV<<" GeV"<<G4endl;
00196   G4cout << __METHOD_NAME__ << "Kinetic Energy : "
00197          << BDSGlobalConstants::Instance()->GetBeamKineticEnergy()/CLHEP::GeV<<" GeV"<<G4endl;
00198   G4cout << __METHOD_NAME__ << "Momentum : "
00199          << BDSGlobalConstants::Instance()->GetBeamMomentum()/CLHEP::GeV<<" GeV"<<G4endl;
00200 }
00201 
00202 void BDSModularPhysicsList::LoadEm(){                     
00203   if(!_emPhysics){
00204     _emPhysics = new G4EmStandardPhysics();               
00205     _constructors.push_back(_emPhysics);                          
00206     LoadParameterisationPhysics();      
00207   }               
00208 }                                                         
00209                                                           
00210 void BDSModularPhysicsList::LoadEmLow(){                          
00211   if(!_emPhysics){
00212     _emPhysics = new G4EmPenelopePhysics();               
00213     _constructors.push_back(_emPhysics);                          
00214     LoadParameterisationPhysics();                        
00215   }
00216 }                                                         
00217                                                           
00218 void BDSModularPhysicsList::LoadParameterisationPhysics(){  
00219   if(!_paramPhysics){
00220     _paramPhysics = new BDSParameterisationPhysics();     
00221     _constructors.push_back(_paramPhysics);               
00222   }
00223 }                                                         
00224                                                           
00225 void BDSModularPhysicsList::LoadHadronic(){               
00226   if(!_hadronicPhysics){
00227 #if G4VERSION_NUMBER < 1000
00228     _hadronicPhysics = new HadronPhysicsQGSP_BERT();
00229 #else
00230     _hadronicPhysics = new G4HadronPhysicsQGSP_BERT();
00231 #endif
00232     _constructors.push_back(_hadronicPhysics);            
00233   }
00234 }                                                         
00235                                                           
00236 void BDSModularPhysicsList::LoadHadronicHP(){             
00237   if(!_hadronicPhysics){
00238 #if G4VERSION_NUMBER < 1000
00239     _hadronicPhysics = new HadronPhysicsQGSP_BERT_HP();
00240 #else
00241     _hadronicPhysics = new G4HadronPhysicsQGSP_BERT_HP();
00242 #endif
00243     _constructors.push_back(_hadronicPhysics);            
00244   }
00245 }                                                         
00246                                                           
00247 void BDSModularPhysicsList::LoadSynchRad(){               
00248   if(!_synchRadPhysics){
00249     _synchRadPhysics = new BDSSynchRadPhysics();                  
00250     _constructors.push_back(_synchRadPhysics);            
00251   }
00252 }                                                         
00253                                                           
00254 void BDSModularPhysicsList::LoadMuon(){                   
00255   if(!_muonPhysics){
00256     _muonPhysics = new BDSMuonPhysics();                          
00257     _constructors.push_back(_muonPhysics);                
00258   }
00259 }                                                         
00260                                                           
00261 void BDSModularPhysicsList::LoadOptical(){                
00262   if(!_opticalPhysics){
00263     _opticalPhysics = new G4OpticalPhysics();             
00264     _constructors.push_back(_opticalPhysics);             
00265   }
00266 }                                                         
00267                                                           
00268 void BDSModularPhysicsList::LoadDecay(){                          
00269   if(!_decayPhysics){
00270     _decayPhysics = new G4DecayPhysics();                         
00271     _constructors.push_back(_decayPhysics);               
00272   }
00273 }                                                         
00274 
00275 void BDSModularPhysicsList::LoadCutsAndLimits(){                          
00276   if(!_cutsAndLimits){
00277     _cutsAndLimits = new BDSCutsAndLimits();                      
00278     _constructors.push_back(_cutsAndLimits);              
00279   }
00280 }                                                         

Generated on 28 Jun 2015 for BDSIM by  doxygen 1.4.7