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 // Author: Alberto Ribon 29 // Date: October 2017 30 // 31 // Hadron physics for the new, experimental physics list FTFQGSP_BERT, 32 // with QGS fragmentation of strings, instead of the Lund string 33 // fragmentation. Note that the string excitation is still done with FTF, 34 // exactly as for FTFP_BERT. 35 // Given that it is an experimental, and perhaps temporary, new type of 36 // hadron physics, corresponding builders are not created and everything 37 // is implemented directly in this class. 38 //---------------------------------------------------------------------------- 39 // 40 #include <iomanip> 41 42 #include "G4HadronPhysicsFTFQGSP_BERT.hh" 43 44 #include "globals.hh" 45 #include "G4ios.hh" 46 #include "G4SystemOfUnits.hh" 47 #include "G4ParticleDefinition.hh" 48 #include "G4ParticleTable.hh" 49 50 #include "G4HadronInelasticProcess.hh" 51 #include "G4NeutronCaptureProcess.hh" 52 #include "G4NeutronRadCapture.hh" 53 #include "G4NeutronInelasticXS.hh" 54 #include "G4NeutronCaptureXS.hh" 55 #include "G4ParticleInelasticXS.hh" 56 57 #include "G4BGGNucleonInelasticXS.hh" 58 #include "G4BGGPionInelasticXS.hh" 59 #include "G4CrossSectionInelastic.hh" 60 61 #include "G4TheoFSGenerator.hh" 62 #include "G4FTFModel.hh" 63 #include "G4ExcitedStringDecay.hh" 64 #include "G4GeneratorPrecompoundInterface.hh" 65 #include "G4CascadeInterface.hh" 66 #include "G4QGSMFragmentation.hh" 67 68 #include "G4PhysListUtil.hh" 69 #include "G4HadParticles.hh" 70 #include "G4HadProcesses.hh" 71 72 #include "G4HadronicParameters.hh" 73 #include "G4HadronicBuilder.hh" 74 #include "G4PhysicsListHelper.hh" 75 76 // factory 77 #include "G4PhysicsConstructorFactory.hh" 78 // 79 G4_DECLARE_PHYSCONSTR_FACTORY(G4HadronPhysicsFTFQGSP_BERT); 80 81 G4HadronPhysicsFTFQGSP_BERT::G4HadronPhysicsFTFQGSP_BERT(G4int verb) 82 : G4HadronPhysicsFTFQGSP_BERT("hInelastic FTFQGSP_BERT", false) 83 { 84 G4HadronicParameters::Instance()->SetVerboseLevel(verb); 85 } 86 87 G4HadronPhysicsFTFQGSP_BERT::G4HadronPhysicsFTFQGSP_BERT(const G4String& name, G4bool qe) 88 : G4HadronPhysicsFTFP_BERT(name, qe) 89 {} 90 91 G4HadronPhysicsFTFQGSP_BERT::~G4HadronPhysicsFTFQGSP_BERT() 92 {} 93 94 void G4HadronPhysicsFTFQGSP_BERT::DumpBanner() 95 { 96 G4HadronPhysicsFTFP_BERT::DumpBanner(); 97 G4cout << " QGS string fragmentation instead of Lund string fragmentation." 98 << G4endl; 99 } 100 101 void G4HadronPhysicsFTFQGSP_BERT::ConstructProcess() 102 { 103 if(G4Threading::IsMasterThread()) { 104 DumpBanner(); 105 } 106 G4HadronicParameters* param = G4HadronicParameters::Instance(); 107 G4bool useFactorXS = param->ApplyFactorXS(); 108 G4double emax = param->GetMaxEnergy(); 109 G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper(); 110 111 auto theModel = new G4TheoFSGenerator("FTFQGSP"); 112 auto theStringModel = new G4FTFModel(); 113 theStringModel->SetFragmentationModel(new G4ExcitedStringDecay( new G4QGSMFragmentation() ) ); 114 theModel->SetHighEnergyGenerator( theStringModel ); 115 theModel->SetTransport( new G4GeneratorPrecompoundInterface() ); 116 theModel->SetMinEnergy( param->GetMinEnergyTransitionFTF_Cascade() ); 117 theModel->SetMaxEnergy( emax ); 118 119 auto theCascade = new G4CascadeInterface(); 120 theCascade->SetMaxEnergy( param->GetMaxEnergyTransitionFTF_Cascade() ); 121 122 // p 123 G4ParticleDefinition* particle = G4Proton::Proton(); 124 G4HadronicProcess* proc = 125 new G4HadronInelasticProcess( particle->GetParticleName()+"Inelastic", particle ); 126 proc->AddDataSet(new G4ParticleInelasticXS(particle)); 127 proc->RegisterMe(theModel); 128 proc->RegisterMe(theCascade); 129 ph->RegisterProcess(proc, particle); 130 if( useFactorXS ) proc->MultiplyCrossSectionBy( param->XSFactorNucleonInelastic() ); 131 132 // n 133 particle = G4Neutron::Neutron(); 134 proc = new G4HadronInelasticProcess( particle->GetParticleName()+"Inelastic", particle ); 135 proc->AddDataSet(new G4NeutronInelasticXS()); 136 proc->RegisterMe(theModel); 137 proc->RegisterMe(theCascade); 138 ph->RegisterProcess(proc, particle); 139 if( useFactorXS ) proc->MultiplyCrossSectionBy( param->XSFactorNucleonInelastic() ); 140 141 proc = new G4NeutronCaptureProcess("nCapture"); 142 proc->RegisterMe(new G4NeutronRadCapture()); 143 ph->RegisterProcess(proc, particle); 144 145 // pi+ 146 particle = G4PionPlus::PionPlus(); 147 proc = new G4HadronInelasticProcess( particle->GetParticleName()+"Inelastic", particle ); 148 proc->AddDataSet(new G4BGGPionInelasticXS(particle)); 149 proc->RegisterMe(theModel); 150 proc->RegisterMe(theCascade); 151 ph->RegisterProcess(proc, particle); 152 if( useFactorXS ) proc->MultiplyCrossSectionBy( param->XSFactorPionInelastic() ); 153 154 // pi- 155 particle = G4PionMinus::PionMinus(); 156 proc = new G4HadronInelasticProcess( particle->GetParticleName()+"Inelastic", particle ); 157 proc->AddDataSet(new G4BGGPionInelasticXS(particle)); 158 proc->RegisterMe(theModel); 159 proc->RegisterMe(theCascade); 160 ph->RegisterProcess(proc, particle); 161 if( useFactorXS ) proc->MultiplyCrossSectionBy( param->XSFactorPionInelastic() ); 162 163 // kaons 164 G4HadronicBuilder::BuildKaonsFTFQGSP_BERT(); 165 166 // high energy particles 167 if( emax > param->EnergyThresholdForHeavyHadrons() ) { 168 169 // pbar, nbar, anti light ions 170 G4HadronicBuilder::BuildAntiLightIonsFTFP(); 171 172 // hyperons 173 G4HadronicBuilder::BuildHyperonsFTFQGSP_BERT(); 174 175 // b-, c- baryons and mesons 176 if( param->EnableBCParticles() ) { 177 G4HadronicBuilder::BuildBCHadronsFTFQGSP_BERT(); 178 } 179 } 180 } 181 182