Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4HadronDElasticPhysics.cc
Go to the documentation of this file.
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
52
53#include "G4SystemOfUnits.hh"
55#include "G4ProcessManager.hh"
56#include "G4HadronicProcess.hh"
57
58#include "G4MesonConstructor.hh"
60#include "G4IonConstructor.hh"
61#include "G4Neutron.hh"
62
64#include "G4HadronElastic.hh"
66#include "G4AntiNuclElastic.hh"
67
69#include "G4BGGPionElasticXS.hh"
70#include "G4NeutronElasticXS.hh"
71
75
77#include "G4DiffuseElastic.hh"
78
80#include "G4HadronicBuilder.hh"
81#include "G4HadParticles.hh"
82#include "G4HadProcesses.hh"
83#include "G4PhysListUtil.hh"
84#include "G4BuilderType.hh"
85
86// factory
88//
90
92 : G4HadronElasticPhysics(ver, "hElasticDIFFUSE")
93{
94 if(ver > 1) {
95 G4cout << "### G4HadronDElasticPhysics: " << GetPhysicsName()
96 << G4endl;
97 }
98}
99
101{}
102
104{
106 G4bool useFactorXS = param->ApplyFactorXS();
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
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
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
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
213
214 // b-, c- baryons and mesons
215 if( G4HadronicParameters::Instance()->EnableBCParticles() ) {
217 }
218 }
219}
220
221
#define G4_DECLARE_PHYSCONSTR_FACTORY(physics_constructor)
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
static const std::vector< G4int > & GetBCHadrons()
static const std::vector< G4int > & GetAntiHyperons()
static const std::vector< G4int > & GetLightAntiIons()
static const std::vector< G4int > & GetLightIons()
static const std::vector< G4int > & GetKaons()
static const std::vector< G4int > & GetHyperons()
static G4CrossSectionElastic * ElasticXS(const G4String &componentName)
static void BuildElastic(const std::vector< G4int > &particleList)
void SetMinEnergy(G4double anEnergy)
void SetMaxEnergy(const G4double anEnergy)
G4double XSFactorPionElastic() const
static G4HadronicParameters * Instance()
G4double XSFactorNucleonElastic() const
G4double EnergyThresholdForHeavyHadrons() const
G4double XSFactorHadronElastic() const
G4double GetMaxEnergy() const
void AddDataSet(G4VCrossSectionDataSet *aDataSet)
void MultiplyCrossSectionBy(G4double factor)
void RegisterMe(G4HadronicInteraction *a)
static G4Neutron * Neutron()
Definition: G4Neutron.cc:103
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
static G4ParticleTable * GetParticleTable()
G4bool RegisterProcess(G4VProcess *process, G4ParticleDefinition *particle)
static G4PhysicsListHelper * GetPhysicsListHelper()
static G4PionMinus * PionMinus()
Definition: G4PionMinus.cc:97
static G4PionPlus * PionPlus()
Definition: G4PionPlus.cc:97
static G4Proton * Proton()
Definition: G4Proton.cc:92
const G4String & GetPhysicsName() const