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: G4HadronInelasticQBBC_ABLA 30 // 31 // Author: Alberto Ribon (CERN), April 2023 32 // 33 // Similar to the physics list constructor G4HadronInelasticQBBC_ABLA, 34 // except for the final-state of inelastic interactions of charged pions and 35 // nucleons in which ABLA nuclear de-excitation is utilized (instead of the 36 // usual Precompound/de-excitation). 37 // This is meant for testing purposes of the coupling between the hadronic 38 // string models (FTF and QGS) and ABLA (via G4GeneratorPrecompoundInterface), 39 // as well as of the coupling between intra-nuclear cascade models (BERT and BIC) 40 // and ABLA. 41 // 42 // Modified: 43 // 44 //---------------------------------------------------------------------------- 45 // 46 47 #include "G4HadronInelasticQBBC_ABLA.hh" 48 #include "G4SystemOfUnits.hh" 49 #include "G4HadronicProcess.hh" 50 #include "G4HadronInelasticProcess.hh" 51 #include "G4HadronicInteraction.hh" 52 #include "G4ParticleDefinition.hh" 53 #include "G4TheoFSGenerator.hh" 54 #include "G4FTFModel.hh" 55 #include "G4ExcitedStringDecay.hh" 56 #include "G4GeneratorPrecompoundInterface.hh" 57 #include "G4BGGNucleonInelasticXS.hh" 58 #include "G4BGGPionInelasticXS.hh" 59 #include "G4ParticleInelasticXS.hh" 60 #include "G4NeutronInelasticXS.hh" 61 #include "G4NeutronGeneralProcess.hh" 62 #include "G4CrossSectionInelastic.hh" 63 #include "G4CascadeInterface.hh" 64 #include "G4BinaryCascade.hh" 65 #include "G4PreCompoundModel.hh" 66 #include "G4AblaInterface.hh" 67 #include "G4HadronicInteractionRegistry.hh" 68 #include "G4HadronicParameters.hh" 69 #include "G4HadronicBuilder.hh" 70 #include "G4HadParticles.hh" 71 #include "G4HadProcesses.hh" 72 #include "G4BuilderType.hh" 73 #include "G4PhysicsConstructorFactory.hh" 74 75 76 G4_DECLARE_PHYSCONSTR_FACTORY( G4HadronInelasticQBBC_ABLA ); 77 78 79 G4HadronInelasticQBBC_ABLA::G4HadronInelasticQBBC_ABLA( G4int ver ) 80 : G4VHadronPhysics( "hInelasticQBBC_ABLA" ) 81 { 82 SetPhysicsType( bHadronInelastic ); 83 auto param = G4HadronicParameters::Instance(); 84 param->SetEnableBCParticles( true ); 85 param->SetEnableNeutronGeneralProcess( true ); 86 param->SetVerboseLevel( ver ); 87 } 88 89 90 void G4HadronInelasticQBBC_ABLA::ConstructProcess() { 91 G4HadronicParameters* param = G4HadronicParameters::Instance(); 92 G4bool useFactorXS = param->ApplyFactorXS(); 93 G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper(); 94 95 // configure models 96 const G4double eminFtf = param->GetMinEnergyTransitionFTF_Cascade(); 97 const G4double eminBert = 1.0*CLHEP::GeV; 98 const G4double emaxBic = 1.5*CLHEP::GeV; 99 const G4double emaxBert = param->GetMaxEnergyTransitionFTF_Cascade(); 100 const G4double emaxBertPions = 12.0*CLHEP::GeV; 101 const G4double emax = param->GetMaxEnergy(); 102 if ( G4Threading::IsMasterThread() && param->GetVerboseLevel() > 0 ) { 103 G4cout << "### HadronInelasticQBBC_ABLA Construct Process:\n" 104 << " Emin(FTFP)= " << eminFtf/CLHEP::GeV 105 << " GeV; Emax(FTFP)= " << emax/CLHEP::GeV << " GeV\n" 106 << " Emin(BERT)= " << eminBert/CLHEP::GeV 107 << " GeV; Emax(BERT)= " << emaxBert/CLHEP::GeV 108 << " GeV; Emax(BERTpions)= " << emaxBertPions/CLHEP::GeV 109 << " GeV;\n" << " Emin(BIC) = 0 GeV; Emax(BIC)= " 110 << emaxBic/CLHEP::GeV << " GeV." << G4endl; 111 } 112 113 G4PreCompoundModel* thePreCompound = nullptr; 114 G4HadronicInteraction* p = G4HadronicInteractionRegistry::Instance()->FindModel( "PRECO" ); 115 thePreCompound = static_cast< G4PreCompoundModel* >( p ); 116 if ( thePreCompound == nullptr ) thePreCompound = new G4PreCompoundModel; 117 118 G4AblaInterface* theAblaInterface = nullptr; 119 G4HadronicInteraction* pAbla = G4HadronicInteractionRegistry::Instance()->FindModel( "ABLAXX" ); 120 theAblaInterface = static_cast< G4AblaInterface* >( pAbla ); 121 if ( theAblaInterface == nullptr ) theAblaInterface = new G4AblaInterface; 122 123 auto theFTFP = new G4TheoFSGenerator( "FTFP" ); 124 auto theStringModel = new G4FTFModel; 125 theStringModel->SetFragmentationModel( new G4ExcitedStringDecay ); 126 theFTFP->SetHighEnergyGenerator( theStringModel ); 127 // theFTFP->SetTransport( new G4GeneratorPrecompoundInterface ); 128 theFTFP->SetTransport( new G4GeneratorPrecompoundInterface( theAblaInterface ) ); 129 theFTFP->SetMinEnergy( eminFtf ); 130 theFTFP->SetMaxEnergy( emax ); 131 132 auto theBERT = new G4CascadeInterface; 133 theBERT->SetMinEnergy( eminBert ); 134 theBERT->SetMaxEnergy( emaxBert ); 135 // theBERT->usePreCompoundDeexcitation(); 136 theBERT->useAblaDeexcitation(); 137 138 auto theBERT1 = new G4CascadeInterface; 139 theBERT1->SetMinEnergy( eminBert ); 140 theBERT1->SetMaxEnergy( emaxBertPions ); 141 // theBERT1->usePreCompoundDeexcitation(); 142 theBERT1->useAblaDeexcitation(); 143 144 // auto theBIC = new G4BinaryCascade( thePreCompound ); 145 auto theBIC = new G4BinaryCascade( theAblaInterface ); 146 theBIC->SetMaxEnergy( emaxBic ); 147 148 // p 149 G4ParticleDefinition* particle = G4Proton::Proton(); 150 G4HadronicProcess* hp = 151 new G4HadronInelasticProcess( particle->GetParticleName() + "Inelastic", particle ); 152 hp->AddDataSet( new G4ParticleInelasticXS( particle ) ); 153 hp->RegisterMe( theFTFP ); 154 hp->RegisterMe( theBERT ); 155 hp->RegisterMe( theBIC ); 156 ph->RegisterProcess( hp, particle ); 157 if ( useFactorXS ) hp->MultiplyCrossSectionBy( param->XSFactorNucleonInelastic() ); 158 159 // n 160 particle = G4Neutron::Neutron(); 161 G4HadronicProcess* ni = new G4HadronInelasticProcess( "neutronInelastic", particle ); 162 ni->RegisterMe( theFTFP ); 163 ni->RegisterMe( theBERT ); 164 ni->RegisterMe( theBIC ); 165 G4HadProcesses::BuildNeutronInelasticAndCapture( ni ); 166 167 // pi+ 168 particle = G4PionPlus::PionPlus(); 169 hp = new G4HadronInelasticProcess( particle->GetParticleName() + "Inelastic", particle ); 170 hp->AddDataSet( new G4BGGPionInelasticXS( particle ) ); 171 hp->RegisterMe( theFTFP ); 172 hp->RegisterMe( theBERT1 ); 173 hp->RegisterMe( theBIC ); 174 ph->RegisterProcess( hp, particle ); 175 if ( useFactorXS ) hp->MultiplyCrossSectionBy( param->XSFactorPionInelastic() ); 176 177 // pi- 178 particle = G4PionMinus::PionMinus(); 179 hp = new G4HadronInelasticProcess( particle->GetParticleName() + "Inelastic", particle ); 180 hp->AddDataSet( new G4BGGPionInelasticXS( particle ) ); 181 hp->RegisterMe( theFTFP ); 182 hp->RegisterMe( theBERT1 ); 183 hp->RegisterMe( theBIC ); 184 ph->RegisterProcess( hp, particle ); 185 if ( useFactorXS ) hp->MultiplyCrossSectionBy( param->XSFactorPionInelastic() ); 186 187 // kaons 188 G4HadronicBuilder::BuildKaonsFTFP_BERT(); 189 190 // high energy particles 191 if ( emax > param->EnergyThresholdForHeavyHadrons() ) { 192 193 // pbar, nbar, anti light ions 194 G4HadronicBuilder::BuildAntiLightIonsFTFP(); 195 196 // hyperons 197 G4HadronicBuilder::BuildHyperonsFTFP_BERT(); 198 199 // b-, c- baryons and mesons 200 if ( param->EnableBCParticles() ) G4HadronicBuilder::BuildBCHadronsFTFP_BERT(); 201 } 202 } 203