Geant4 Cross Reference |
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 // 28 // ClassName: G4HadronDElasticPhysics 29 // 30 // Author: 11 April 2006 V. Ivanchenko 31 // 32 // Modified: 33 // 05.07.2006 V.Ivanchenko define process by particle name; 34 // fix problem of initialisation of HP 35 // 24.07.2006 V.Ivanchenko add G4NeutronHPElasticData 36 // 10.08.2006 V.Ivanchenko separate neutrons from other particles 37 // 17.11.2006 V.Ivanchenko do not redefine G4HadronElastic default parameters 38 // 19.02.2007 V.Ivanchenko set QModelLowLimit and LowestEnergyLimit to zero 39 // 19.02.2007 A.Howard set QModelLowLimit and LowestEnergyLimit to zero 40 // for neutrons 41 // 06.03.2007 V.Ivanchenko use updated interface to G4UElasticCrossSection 42 // 03.06.2010 V.Ivanchenko cleanup constructors and ConstructProcess method 43 // 44 //---------------------------------------------------------------------------- 45 // 46 // Diffuse optical model for sampling scattering 47 // BBG cross sections for p, pi+- 48 // XS cross sections for n 49 // LHEP cross sections for other particles 50 51 #include "G4HadronDElasticPhysics.hh" 52 53 #include "G4SystemOfUnits.hh" 54 #include "G4ParticleDefinition.hh" 55 #include "G4ProcessManager.hh" 56 #include "G4HadronicProcess.hh" 57 58 #include "G4MesonConstructor.hh" 59 #include "G4BaryonConstructor.hh" 60 #include "G4IonConstructor.hh" 61 #include "G4Neutron.hh" 62 63 #include "G4HadronElasticProcess.hh" 64 #include "G4HadronElastic.hh" 65 #include "G4ElasticHadrNucleusHE.hh" 66 #include "G4AntiNuclElastic.hh" 67 68 #include "G4BGGNucleonElasticXS.hh" 69 #include "G4BGGPionElasticXS.hh" 70 #include "G4NeutronElasticXS.hh" 71 72 #include "G4ComponentGGHadronNucleusXsc.hh" 73 #include "G4ComponentGGNuclNuclXsc.hh" 74 #include "G4CrossSectionDataSetRegistry.hh" 75 76 #include "G4CrossSectionElastic.hh" 77 #include "G4DiffuseElastic.hh" 78 79 #include "G4HadronicParameters.hh" 80 #include "G4HadronicBuilder.hh" 81 #include "G4HadParticles.hh" 82 #include "G4HadProcesses.hh" 83 #include "G4PhysListUtil.hh" 84 #include "G4BuilderType.hh" 85 86 // factory 87 #include "G4PhysicsConstructorFactory.hh" 88 // 89 G4_DECLARE_PHYSCONSTR_FACTORY(G4HadronDElasticPhysics); 90 91 G4HadronDElasticPhysics::G4HadronDElasticPhysics(G4int ver) 92 : G4HadronElasticPhysics(ver, "hElasticDIFFUSE") 93 { 94 if(ver > 1) { 95 G4cout << "### G4HadronDElasticPhysics: " << GetPhysicsName() 96 << G4endl; 97 } 98 } 99 100 G4HadronDElasticPhysics::~G4HadronDElasticPhysics() 101 {} 102 103 void G4HadronDElasticPhysics::ConstructProcess() 104 { 105 G4HadronicParameters* param = G4HadronicParameters::Instance(); 106 G4bool useFactorXS = param->ApplyFactorXS(); 107 G4ParticleTable* table = G4ParticleTable::GetParticleTable(); 108 G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper(); 109 110 const G4double eminDElastic = 10.*MeV; 111 const G4double elimitAntiNuc = 100.*MeV; 112 const G4double delta = 0.1*MeV; 113 G4double emax = std::max(param->GetMaxEnergy(), elimitAntiNuc+delta); 114 if(param->GetVerboseLevel() > 1) { 115 G4cout << "### HadronDElasticPhysics Construct Processes " 116 << " for anti-neuclei " 117 << elimitAntiNuc/GeV << " GeV" << G4endl; 118 } 119 120 G4AntiNuclElastic* anuc = new G4AntiNuclElastic(); 121 anuc->SetMinEnergy(elimitAntiNuc); 122 anuc->SetMaxEnergy(emax); 123 124 auto anucxs = G4HadProcesses::ElasticXS("AntiAGlauber"); 125 auto xsNN = G4HadProcesses::ElasticXS("Glauber-Gribov Nucl-nucl"); 126 127 G4HadronElastic* lhep0 = new G4HadronElastic(); 128 G4HadronElastic* lhep1 = new G4HadronElastic(); 129 lhep1->SetMaxEnergy(eminDElastic + delta); 130 G4HadronElastic* lhep2 = new G4HadronElastic(); 131 lhep2->SetMaxEnergy(elimitAntiNuc); 132 133 G4DiffuseElastic* model = nullptr; 134 135 // p 136 G4ParticleDefinition* particle = G4Proton::Proton(); 137 G4HadronElasticProcess* hel = new G4HadronElasticProcess(); 138 hel->AddDataSet(new G4BGGNucleonElasticXS(particle)); 139 model = new G4DiffuseElastic(); 140 model->SetMinEnergy(eminDElastic); 141 hel->RegisterMe(lhep1); 142 hel->RegisterMe(model); 143 if( useFactorXS ) hel->MultiplyCrossSectionBy( param->XSFactorNucleonElastic() ); 144 ph->RegisterProcess(hel, particle); 145 146 // n 147 particle = G4Neutron::Neutron(); 148 hel = new G4HadronElasticProcess(); 149 hel->AddDataSet(new G4NeutronElasticXS()); 150 model = new G4DiffuseElastic(); 151 model->SetMinEnergy(eminDElastic); 152 hel->RegisterMe(lhep1); 153 hel->RegisterMe(model); 154 if( useFactorXS ) hel->MultiplyCrossSectionBy( param->XSFactorNucleonElastic() ); 155 ph->RegisterProcess(hel, particle); 156 157 // pi+ 158 particle = G4PionPlus::PionPlus(); 159 hel = new G4HadronElasticProcess(); 160 hel->AddDataSet(new G4BGGPionElasticXS(particle)); 161 model = new G4DiffuseElastic(); 162 model->SetMinEnergy(eminDElastic); 163 hel->RegisterMe(lhep1); 164 hel->RegisterMe(model); 165 if( useFactorXS ) hel->MultiplyCrossSectionBy( param->XSFactorPionElastic() ); 166 ph->RegisterProcess(hel, particle); 167 168 // pi- 169 particle = G4PionMinus::PionMinus(); 170 hel = new G4HadronElasticProcess(); 171 hel->AddDataSet(new G4BGGPionElasticXS(particle)); 172 model = new G4DiffuseElastic(); 173 model->SetMinEnergy(eminDElastic); 174 hel->RegisterMe(lhep1); 175 hel->RegisterMe(model); 176 if( useFactorXS ) hel->MultiplyCrossSectionBy( param->XSFactorPionElastic() ); 177 ph->RegisterProcess(hel, particle); 178 179 // kaons 180 G4HadronicBuilder::BuildElastic( G4HadParticles::GetKaons() ); 181 182 // d, t, He3, alpha 183 for( auto & pdg : G4HadParticles::GetLightIons() ) { 184 particle = table->FindParticle( pdg ); 185 if ( particle == nullptr ) { continue; } 186 187 hel = new G4HadronElasticProcess(); 188 hel->AddDataSet(xsNN); 189 hel->RegisterMe(lhep0); 190 if( useFactorXS ) hel->MultiplyCrossSectionBy( param->XSFactorHadronElastic() ); 191 ph->RegisterProcess(hel, particle); 192 } 193 194 // high energy particles 195 if( emax > param->EnergyThresholdForHeavyHadrons() ) { 196 197 // pbar, nbar, anti light ions 198 for( auto & pdg : G4HadParticles::GetLightAntiIons() ) { 199 particle = table->FindParticle( pdg ); 200 if ( particle == nullptr ) { continue; } 201 202 hel = new G4HadronElasticProcess(); 203 hel->RegisterMe(lhep2); 204 hel->RegisterMe(anuc); 205 hel->AddDataSet(anucxs); 206 if( useFactorXS ) hel->MultiplyCrossSectionBy( param->XSFactorHadronElastic() ); 207 ph->RegisterProcess(hel, particle); 208 } 209 210 // hyperons 211 G4HadronicBuilder::BuildElastic( G4HadParticles::GetHyperons() ); 212 G4HadronicBuilder::BuildElastic( G4HadParticles::GetAntiHyperons() ); 213 214 // b-, c- baryons and mesons 215 if( G4HadronicParameters::Instance()->EnableBCParticles() ) { 216 G4HadronicBuilder::BuildElastic( G4HadParticles::GetBCHadrons() ); 217 } 218 } 219 } 220 221 222