ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4HadronHElasticPhysics.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4HadronHElasticPhysics.cc
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: G4HadronHElasticPhysics
29 //
30 // Author: 23 November 2006 V. Ivanchenko
31 //
32 // Modified:
33 // 21.03.07 (V.Ivanchenko) Use G4BGGNucleonElasticXS and G4BGGPionElasticXS;
34 // Reduce thresholds for HE and Q-models to zero
35 // 03.06.2010 V.Ivanchenko cleanup constructors and ConstructProcess method
36 // 06.06.2014 A.Ribon Use the current best elastic models.
37 //
38 //----------------------------------------------------------------------------
39 //
40 
42 
43 #include "G4SystemOfUnits.hh"
44 #include "G4ParticleDefinition.hh"
45 #include "G4ProcessManager.hh"
46 
47 #include "G4MesonConstructor.hh"
48 #include "G4BaryonConstructor.hh"
49 #include "G4IonConstructor.hh"
50 #include "G4Neutron.hh"
51 
53 #include "G4HadronElastic.hh"
54 #include "G4ChipsElasticModel.hh"
55 #include "G4AntiNuclElastic.hh"
56 #include "G4DiffuseElastic.hh"
58 
59 #include "G4CrossSectionElastic.hh"
60 #include "G4BGGNucleonElasticXS.hh"
61 #include "G4BGGPionElasticXS.hh"
62 #include "G4NeutronElasticXS.hh"
71 
72 #include "G4LMsdGenerator.hh"
73 #include "G4DiffElasticRatio.hh"
74 #include "G4AutoDelete.hh"
75 
76 // factory
78 //
80 
82 
84  : G4VPhysicsConstructor( "hElastic_BEST" ), verbose( ver ),
85  fDiffraction(diffraction)
86 {
87  if ( verbose > 1 ) {
88  G4cout << "### G4HadronHElasticPhysics: " << GetPhysicsName()
89  << " low-mass diffraction: " << fDiffraction << G4endl;
90  }
91 }
92 
94 
95 
97  // G4cout << "G4HadronElasticPhysics::ConstructParticle" << G4endl;
98  G4MesonConstructor pMesonConstructor;
99  pMesonConstructor.ConstructParticle();
100 
101  G4BaryonConstructor pBaryonConstructor;
102  pBaryonConstructor.ConstructParticle();
103 
104  // Construct light ions
105  G4IonConstructor pConstructor;
106  pConstructor.ConstructParticle();
107 }
108 
110 
111  const G4double elimitDiffuse = 0.0;
112  const G4double elimitAntiNuc = 100.0*MeV;
113  const G4double delta = 0.1*MeV;
114 
115  if ( verbose > 1 ) {
116  G4cout << "### HadronHElasticPhysics::ConstructProcess: lower energy limit for DiffuseElastic : "
117  << elimitDiffuse/GeV << " GeV" << G4endl
118  << " transition energy for anti-nuclei : "
119  << elimitAntiNuc/GeV << " GeV" << G4endl;
120  }
121 
122  G4AntiNuclElastic* anuc = new G4AntiNuclElastic();
123  anuc->SetMinEnergy( elimitAntiNuc );
124  G4CrossSectionElastic* anucxs =
126 
127  G4HadronElastic* lhep = new G4HadronElastic();
128  lhep->SetMaxEnergy( elimitAntiNuc + delta );
129 
130  G4HadronElastic* lhep0 = new G4HadronElastic();
131 
132  // Three instances of Chips elastic model: one used everywhere,
133  // one used below a energy threshold, and one used only for the
134  // hydrogen element.
137  chips2->SetMaxEnergy( elimitAntiNuc + delta );
139  const G4ElementTable* theElementTable = G4Element::GetElementTable();
140  for ( size_t i_ele = 0; i_ele < theElementTable->size(); i_ele++ ) {
141  G4Element* element = (*theElementTable)[ i_ele ];
142  if ( element->GetZ() > 1.0 ) chipsH->DeActivateFor( element );
143  }
144 
145  G4NuclNuclDiffuseElastic* diffuseNuclNuclElastic = new G4NuclNuclDiffuseElastic();
146  diffuseNuclNuclElastic->SetMinEnergy( elimitDiffuse );
147 
148  G4VCrossSectionDataSet* theComponentGGHadronNucleusData =
150 
151  G4VCrossSectionDataSet* theComponentGGNuclNuclData =
153 
154  G4LMsdGenerator* diffGen = nullptr;
155  if(fDiffraction) {
156  diffGen = new G4LMsdGenerator("LMsdDiffraction");
159  }
160  G4HadronElasticProcess* hel = nullptr;
161 
162  auto myParticleIterator=GetParticleIterator();
163  myParticleIterator->reset();
164  while( (*myParticleIterator)() ) {
165 
166  G4ParticleDefinition* particle = myParticleIterator->value();
167  G4ProcessManager* pmanager = particle->GetProcessManager();
168  G4String pname = particle->GetParticleName();
169 
170  if ( pname == "anti_lambda" ||
171  pname == "anti_sigma-" ||
172  pname == "anti_sigma0" ||
173  pname == "anti_sigma+" ||
174  pname == "anti_xi-" ||
175  pname == "anti_xi0" ||
176  pname == "anti_omega-" ||
177  pname == "lambda" ||
178  pname == "sigma-" ||
179  pname == "sigma0" ||
180  pname == "sigma+" ||
181  pname == "xi-" ||
182  pname == "xi0" ||
183  pname == "omega-"
184  ) {
185  hel = new G4HadronElasticProcess();
186  hel->AddDataSet( theComponentGGHadronNucleusData );
187  hel->RegisterMe( chips1 );
188  pmanager->AddDiscreteProcess( hel );
189  if ( verbose > 1 ) {
190  G4cout << "### HadronElasticPhysics: " << hel->GetProcessName()
191  << " added for " << particle->GetParticleName() << G4endl;
192  }
193 
194  } else if ( pname == "proton" ) {
195  hel = new G4HadronElasticProcess();
196  hel->AddDataSet( new G4BGGNucleonElasticXS( particle ) );
197  // To preserve reproducibility, a different instance of
198  // G4DiffuseElastic must be used for each particle type.
199  G4DiffuseElastic* protonDiffuseElastic = new G4DiffuseElastic();
200  protonDiffuseElastic->SetMinEnergy( elimitDiffuse );
201  hel->RegisterMe( chipsH ); // Use Chips only for Hydrogen element
202  hel->RegisterMe( protonDiffuseElastic );
203  pmanager->AddDiscreteProcess( hel );
204  if(fDiffraction) { hel->SetDiffraction(diffGen, diffRatio); }
205  if ( verbose > 1 ) {
206  G4cout << "### HadronElasticPhysics: " << hel->GetProcessName()
207  << " added for " << particle->GetParticleName() << G4endl;
208  }
209 
210  } else if ( pname == "neutron" ) {
211  hel = new G4HadronElasticProcess();
212  hel->AddDataSet(new G4NeutronElasticXS() );
213  // To preserve reproducibility, a different instance of
214  // G4DiffuseElastic must be used for each particle type.
215  G4DiffuseElastic* neutronDiffuseElastic = new G4DiffuseElastic();
216  neutronDiffuseElastic->SetMinEnergy( elimitDiffuse );
217  hel->RegisterMe( chipsH ); // Use Chips only for Hydrogen element
218  hel->RegisterMe( neutronDiffuseElastic );
219  pmanager->AddDiscreteProcess( hel );
220  if(fDiffraction) { hel->SetDiffraction(diffGen, diffRatio); }
221  if ( verbose > 1 ) {
222  G4cout << "### HadronElasticPhysics: "
223  << hel->GetProcessName()
224  << " added for " << particle->GetParticleName() << G4endl;
225  }
226 
227  } else if ( pname == "pi-" || pname == "pi+" ) {
228  hel = new G4HadronElasticProcess();
229  hel->AddDataSet( new G4BGGPionElasticXS( particle ) );
230  // To preserve reproducibility, a different instance of
231  // G4DiffuseElastic must be used for each particle type.
232  G4DiffuseElastic* dElastic = new G4DiffuseElastic();
233  dElastic->SetMinEnergy( elimitDiffuse );
234  hel->RegisterMe( chipsH ); // Use Chips only for Hydrogen element
235  hel->RegisterMe( dElastic );
236  pmanager->AddDiscreteProcess( hel );
237  if(fDiffraction) { hel->SetDiffraction(diffGen, diffRatio); }
238  if ( verbose > 1 ) {
239  G4cout << "### HadronElasticPhysics: " << hel->GetProcessName()
240  << " added for " << particle->GetParticleName() << G4endl;
241  }
242 
243  } else if ( pname == "kaon-" ||
244  pname == "kaon+" ||
245  pname == "kaon0S" ||
246  pname == "kaon0L"
247  ) {
248  hel = new G4HadronElasticProcess();
249  //AR-14Aug2017 : Replaced Chips elastic kaon cross sections with
250  // Grichine's Glauber-Gribov ones. In this way, the
251  // total (elastic + inelastic) kaon cross sections
252  // are consistent with the PDG ones.
253  // For the time being, kept Chips elastic as
254  // final-state model.
255  hel->AddDataSet( theComponentGGHadronNucleusData );
256  hel->RegisterMe( chips1 );
257  pmanager->AddDiscreteProcess( hel );
258  if(fDiffraction) { hel->SetDiffraction(diffGen, diffRatio); }
259  if ( verbose > 1 ) {
260  G4cout << "### HadronElasticPhysics: " << hel->GetProcessName()
261  << " added for " << particle->GetParticleName() << G4endl;
262  }
263 
264  } else if(pname == "alpha" ||
265  pname == "deuteron" ||
266  pname == "triton" ||
267  pname == "He3"
268  ) {
269  hel = new G4HadronElasticProcess();
270  hel->AddDataSet(theComponentGGNuclNuclData);
271  hel->RegisterMe(lhep0);
272  pmanager->AddDiscreteProcess(hel);
273  if(verbose > 1) {
274  G4cout << "### HadronElasticPhysics: " << hel->GetProcessName()
275  << " added for " << particle->GetParticleName() << G4endl;
276  }
277 
278  } else if ( pname == "anti_proton" || pname == "anti_neutron" ) {
279  hel = new G4HadronElasticProcess();
280  hel->AddDataSet( anucxs );
281  hel->RegisterMe( chips2 );
282  hel->RegisterMe( anuc );
283  pmanager->AddDiscreteProcess( hel );
284  if ( verbose > 1 ) {
285  G4cout << "### HadronElasticPhysics: " << hel->GetProcessName()
286  << " added for " << particle->GetParticleName() << G4endl;
287  }
288 
289  } else if ( pname == "anti_deuteron" ||
290  pname == "anti_triton" ||
291  pname == "anti_He3" ||
292  pname == "anti_alpha"
293  ) {
294  hel = new G4HadronElasticProcess();
295  hel->AddDataSet( anucxs );
296  hel->RegisterMe( lhep );
297  hel->RegisterMe( anuc );
298  pmanager->AddDiscreteProcess( hel );
299  if ( verbose > 1 ) {
300  G4cout << "### HadronElasticPhysics: " << hel->GetProcessName()
301  << " added for " << particle->GetParticleName() << G4endl;
302  }
303  }
304  }
305 }