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
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
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
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
00072 if(_physListName.contains((G4String)"synchrad")){
00073 if(!_emPhysics){
00074 LoadEm();
00075 }
00076 LoadSynchRad();
00077 }
00078
00079
00080 if(_physListName.contains((G4String)"muon")){
00081
00082 if(!_emPhysics){
00083 LoadEm();
00084 }
00085 if(!_hadronicPhysics){
00086 LoadHadronic();
00087 }
00088 LoadMuon();
00089 }
00090
00091 if(_physListName.contains((G4String)"optical")){
00092
00093 LoadOptical();
00094 }
00095
00096
00097 if(_hadronicPhysics || _emPhysics){
00098 if(!_physListName.contains((G4String)"nodecay")){
00099 LoadDecay();
00100 }
00101 }
00102
00103 LoadCutsAndLimits();
00104 }
00105
00106 void BDSModularPhysicsList::ConstructMinimumParticleSet(){
00107
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
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
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
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 }