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 // 29 // ClassName: G4HadronPhysicsQGS_BIC 30 // 31 // Author: 2007 Gunter Folger 32 // created from G4HadronPhysicsQGSP_BIC by H.P.Wellisch 33 // 34 // Modified: 35 // 36 //---------------------------------------------------------------------------- 37 // 38 #include <iomanip> 39 40 #include "G4HadronPhysicsQGS_BIC.hh" 41 #include "G4PionBuilder.hh" 42 #include "G4BinaryPionBuilder.hh" 43 #include "G4BertiniPionBuilder.hh" 44 #include "G4FTFBinaryPionBuilder.hh" 45 #include "G4QGSBinaryPionBuilder.hh" 46 47 #include "G4KaonBuilder.hh" 48 #include "G4BertiniKaonBuilder.hh" 49 #include "G4FTFBinaryKaonBuilder.hh" 50 #include "G4QGSBinaryKaonBuilder.hh" 51 52 #include "G4ProtonBuilder.hh" 53 #include "G4FTFBinaryProtonBuilder.hh" 54 #include "G4QGSBinaryProtonBuilder.hh" 55 #include "G4BinaryProtonBuilder.hh" 56 57 #include "G4NeutronBuilder.hh" 58 #include "G4FTFBinaryNeutronBuilder.hh" 59 #include "G4QGSBinaryNeutronBuilder.hh" 60 #include "G4BinaryNeutronBuilder.hh" 61 62 #include "globals.hh" 63 #include "G4ios.hh" 64 #include "G4SystemOfUnits.hh" 65 #include "G4ParticleDefinition.hh" 66 #include "G4ParticleTable.hh" 67 68 #include "G4NeutronRadCapture.hh" 69 #include "G4NeutronInelasticXS.hh" 70 #include "G4NeutronCaptureXS.hh" 71 72 #include "G4PhysListUtil.hh" 73 #include "G4HadParticles.hh" 74 #include "G4HadronicParameters.hh" 75 76 #include "G4PhysicsConstructorFactory.hh" 77 // 78 G4_DECLARE_PHYSCONSTR_FACTORY(G4HadronPhysicsQGS_BIC); 79 80 G4HadronPhysicsQGS_BIC::G4HadronPhysicsQGS_BIC(G4int verb) 81 : G4HadronPhysicsQGS_BIC("hInelastic QGS_BIC",true) 82 { 83 G4HadronicParameters::Instance()->SetVerboseLevel(verb); 84 } 85 86 G4HadronPhysicsQGS_BIC::G4HadronPhysicsQGS_BIC(const G4String& name, G4bool qe) 87 : G4HadronPhysicsQGSP_BERT(name, qe) 88 { 89 minBERT_pion = 1.0*GeV; 90 maxBIC_pion = 1.5*GeV; 91 } 92 93 G4HadronPhysicsQGS_BIC::~G4HadronPhysicsQGS_BIC() 94 {} 95 96 void G4HadronPhysicsQGS_BIC::Neutron() 97 { 98 G4HadronicParameters* param = G4HadronicParameters::Instance(); 99 G4bool useFactorXS = param->ApplyFactorXS(); 100 //General schema: 101 // 1) Create a builder 102 // 2) Call AddBuilder 103 // 3) Configure the builder, possibly with sub-builders 104 // 4) Call builder->Build() 105 auto neu = new G4NeutronBuilder; 106 AddBuilder(neu); 107 auto qgs = new G4QGSBinaryNeutronBuilder(QuasiElasticQGS); 108 AddBuilder(qgs); 109 qgs->SetMinEnergy(minQGSP_neutron); 110 neu->RegisterMe(qgs); 111 auto ftf = new G4FTFBinaryNeutronBuilder(QuasiElasticFTF); 112 AddBuilder(ftf); 113 ftf->SetMinEnergy(minFTFP_neutron); 114 ftf->SetMaxEnergy(maxFTFP_neutron); 115 neu->RegisterMe(ftf); 116 auto bicn = new G4BinaryNeutronBuilder; 117 AddBuilder(bicn); 118 bicn->SetMaxEnergy(maxBERT_neutron); 119 neu->RegisterMe(bicn); 120 neu->Build(); 121 122 const G4ParticleDefinition* neutron = G4Neutron::Neutron(); 123 G4HadronicProcess* inel = G4PhysListUtil::FindInelasticProcess(neutron); 124 if(inel) { 125 inel->AddDataSet(new G4NeutronInelasticXS()); 126 if( useFactorXS ) inel->MultiplyCrossSectionBy( param->XSFactorNucleonInelastic() ); 127 } 128 G4HadronicProcess* capture = G4PhysListUtil::FindCaptureProcess(neutron); 129 if (capture) { 130 capture->RegisterMe(new G4NeutronRadCapture()); 131 } 132 } 133 134 void G4HadronPhysicsQGS_BIC::Proton() 135 { 136 G4HadronicParameters* param = G4HadronicParameters::Instance(); 137 G4bool useFactorXS = param->ApplyFactorXS(); 138 139 auto pro = new G4ProtonBuilder; 140 AddBuilder(pro); 141 auto qgs = new G4QGSBinaryProtonBuilder(QuasiElasticQGS); 142 AddBuilder(qgs); 143 qgs->SetMinEnergy(minQGSP_proton); 144 pro->RegisterMe(qgs); 145 auto ftf = new G4FTFBinaryProtonBuilder(QuasiElasticFTF); 146 AddBuilder(ftf); 147 ftf->SetMinEnergy(minFTFP_proton); 148 ftf->SetMaxEnergy(maxFTFP_proton); 149 pro->RegisterMe(ftf); 150 auto bic = new G4BinaryProtonBuilder; 151 AddBuilder(bic); 152 bic->SetMaxEnergy(maxBERT_proton); 153 pro->RegisterMe(bic); 154 pro->Build(); 155 156 const G4ParticleDefinition* proton = G4Proton::Proton(); 157 G4HadronicProcess* inel = G4PhysListUtil::FindInelasticProcess(proton); 158 if(inel) { 159 if( useFactorXS ) inel->MultiplyCrossSectionBy( param->XSFactorNucleonInelastic() ); 160 } 161 } 162 163 void G4HadronPhysicsQGS_BIC::Pion() 164 { 165 G4HadronicParameters* param = G4HadronicParameters::Instance(); 166 G4bool useFactorXS = param->ApplyFactorXS(); 167 168 auto pi = new G4PionBuilder; 169 AddBuilder(pi); 170 auto qgs = new G4QGSBinaryPionBuilder(QuasiElasticQGS); 171 AddBuilder(qgs); 172 qgs->SetMinEnergy(minQGSP_pik); 173 pi->RegisterMe(qgs); 174 auto ftf = new G4FTFBinaryPionBuilder(QuasiElasticFTF); 175 AddBuilder(ftf); 176 ftf->SetMinEnergy(minFTFP_pik); 177 ftf->SetMaxEnergy(maxFTFP_pik); 178 pi->RegisterMe(ftf); 179 auto bert = new G4BertiniPionBuilder; 180 AddBuilder(bert); 181 bert->SetMinEnergy(minBERT_pion); 182 bert->SetMaxEnergy(maxBERT_pik); 183 pi->RegisterMe(bert); 184 auto bic = new G4BinaryPionBuilder; 185 AddBuilder(bic); 186 bic->SetMaxEnergy(maxBIC_pion); 187 pi->RegisterMe(bic); 188 pi->Build(); 189 190 auto k = new G4KaonBuilder; 191 AddBuilder(k); 192 auto qgsk = new G4QGSBinaryKaonBuilder(QuasiElasticQGS); 193 AddBuilder(qgsk); 194 qgsk->SetMinEnergy(minQGSP_pik); 195 k->RegisterMe(qgsk); 196 auto ftfk = new G4FTFBinaryKaonBuilder(QuasiElasticFTF); 197 AddBuilder(ftfk); 198 ftfk->SetMaxEnergy(maxFTFP_pik); 199 k->RegisterMe(ftfk); 200 auto bertk = new G4BertiniKaonBuilder; 201 AddBuilder(bertk); 202 bertk->SetMaxEnergy(maxBERT_pik); 203 k->RegisterMe(bertk); 204 k->Build(); 205 206 // add cross section factor 207 if( useFactorXS ) { 208 const G4ParticleDefinition* pion = G4PionPlus::PionPlus(); 209 G4HadronicProcess* inel = G4PhysListUtil::FindInelasticProcess(pion); 210 if(inel) { 211 inel->MultiplyCrossSectionBy( param->XSFactorPionInelastic() ); 212 } 213 pion = G4PionMinus::PionMinus(); 214 inel = G4PhysListUtil::FindInelasticProcess(pion); 215 if(inel) { 216 inel->MultiplyCrossSectionBy( param->XSFactorPionInelastic() ); 217 } 218 G4ParticleTable* table = G4ParticleTable::GetParticleTable(); 219 for( auto & pdg : G4HadParticles::GetKaons() ) { 220 auto part = table->FindParticle( pdg ); 221 if ( part == nullptr ) { continue; } 222 inel = G4PhysListUtil::FindInelasticProcess(part); 223 if(inel) { 224 inel->MultiplyCrossSectionBy( param->XSFactorHadronInelastic() ); 225 } 226 } 227 } 228 } 229