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
G4HadronicBuilder.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// Geant4 class G4HadronicBuilder
28//
29// Author V.Ivanchenko 14.05.2020
30//
31
32#include "G4HadronicBuilder.hh"
33#include "G4HadParticles.hh"
34#include "G4HadProcesses.hh"
35
37#include "G4ParticleTable.hh"
39
41
42#include "G4TheoFSGenerator.hh"
43#include "G4FTFModel.hh"
46
47#include "G4QGSModel.hh"
48#include "G4QGSParticipants.hh"
51
52#include "G4CascadeInterface.hh"
56#include "G4HadronElastic.hh"
58
61
62#include "G4DecayTable.hh"
63#include "G4VDecayChannel.hh"
65
66#include "G4PreCompoundModel.hh"
67#include "G4INCLXXInterface.hh"
68
69
70void G4HadronicBuilder::BuildFTFP_BERT(const std::vector<G4int>& partList,
71 G4bool bert, const G4String& xsName) {
72
75
76 auto theModel = new G4TheoFSGenerator("FTFP");
77 auto theStringModel = new G4FTFModel();
78 theStringModel->SetFragmentationModel(new G4ExcitedStringDecay());
79 theModel->SetHighEnergyGenerator( theStringModel );
80 theModel->SetTransport( new G4GeneratorPrecompoundInterface() );
81 theModel->SetMaxEnergy( param->GetMaxEnergy() );
82
83 G4CascadeInterface* theCascade = nullptr;
84 if(bert) {
85 theCascade = new G4CascadeInterface();
86 theCascade->SetMaxEnergy( param->GetMaxEnergyTransitionFTF_Cascade() );
87 theModel->SetMinEnergy( param->GetMinEnergyTransitionFTF_Cascade() );
88 }
89
90 auto xsinel = G4HadProcesses::InelasticXS( xsName );
91
93 for( auto & pdg : partList ) {
94
95 auto part = table->FindParticle( pdg );
96 if ( part == nullptr ) { continue; }
97
98 auto hadi = new G4HadronInelasticProcess( part->GetParticleName()+"Inelastic", part );
99 hadi->AddDataSet( xsinel );
100 hadi->RegisterMe( theModel );
101 if( theCascade != nullptr ) hadi->RegisterMe( theCascade );
102 if( param->ApplyFactorXS() ) hadi->MultiplyCrossSectionBy( param->XSFactorHadronInelastic() );
103 ph->RegisterProcess(hadi, part);
104 }
105}
106
107void G4HadronicBuilder::BuildFTFQGSP_BERT(const std::vector<G4int>& partList,
108 G4bool bert, const G4String& xsName) {
109
112
113 auto theModel = new G4TheoFSGenerator("FTFQGSP");
114 auto theStringModel = new G4FTFModel();
115 theStringModel->SetFragmentationModel(new G4ExcitedStringDecay( new G4QGSMFragmentation() ) );
116 theModel->SetHighEnergyGenerator( theStringModel );
117 theModel->SetTransport( new G4GeneratorPrecompoundInterface() );
118 theModel->SetMaxEnergy( param->GetMaxEnergy() );
119
120 G4CascadeInterface* theCascade = nullptr;
121 if(bert) {
122 theCascade = new G4CascadeInterface();
123 theCascade->SetMaxEnergy( param->GetMaxEnergyTransitionFTF_Cascade() );
124 theModel->SetMinEnergy( param->GetMinEnergyTransitionFTF_Cascade() );
125 }
126
127 auto xsinel = G4HadProcesses::InelasticXS( xsName );
128
130 for( auto & pdg : partList ) {
131
132 auto part = table->FindParticle( pdg );
133 if ( part == nullptr ) { continue; }
134
135 auto hadi = new G4HadronInelasticProcess( part->GetParticleName()+"Inelastic", part );
136 hadi->AddDataSet( xsinel );
137 hadi->RegisterMe( theModel );
138 if( theCascade != nullptr ) hadi->RegisterMe( theCascade );
139 if( param->ApplyFactorXS() ) hadi->MultiplyCrossSectionBy( param->XSFactorHadronInelastic() );
140 ph->RegisterProcess(hadi, part);
141 }
142}
143
144void G4HadronicBuilder::BuildQGSP_FTFP_BERT(const std::vector<G4int>& partList,
145 G4bool bert, G4bool quasiElastic,
146 const G4String& xsName) {
147
150
151 auto theTransport = new G4GeneratorPrecompoundInterface();
152
153 auto theHEModel = new G4TheoFSGenerator("QGSP");
156 theHEModel->SetTransport( theTransport );
157 theHEModel->SetHighEnergyGenerator( theQGSModel );
158 if (quasiElastic) {
159 theHEModel->SetQuasiElasticChannel(new G4QuasiElasticChannel());
160 }
161 theHEModel->SetMinEnergy( param->GetMinEnergyTransitionQGS_FTF() );
162 theHEModel->SetMaxEnergy( param->GetMaxEnergy() );
163
164 auto theLEModel = new G4TheoFSGenerator("FTFP");
165 auto theFTFModel = new G4FTFModel();
166 theFTFModel->SetFragmentationModel(new G4ExcitedStringDecay());
167 theLEModel->SetHighEnergyGenerator( theFTFModel );
168 theLEModel->SetTransport( theTransport );
169 theLEModel->SetMaxEnergy( param->GetMaxEnergyTransitionQGS_FTF() );
170
171 G4CascadeInterface* theCascade = nullptr;
172 if(bert) {
173 theCascade = new G4CascadeInterface();
174 theCascade->SetMaxEnergy( param->GetMaxEnergyTransitionFTF_Cascade() );
175 theLEModel->SetMinEnergy( param->GetMinEnergyTransitionFTF_Cascade() );
176 }
177
178 auto xsinel = G4HadProcesses::InelasticXS( xsName );
179
181 for( auto & pdg : partList ) {
182
183 auto part = table->FindParticle( pdg );
184 if ( part == nullptr ) { continue; }
185
186 auto hadi = new G4HadronInelasticProcess( part->GetParticleName()+"Inelastic", part );
187 hadi->AddDataSet( xsinel );
188 hadi->RegisterMe( theHEModel );
189 hadi->RegisterMe( theLEModel );
190 if(theCascade != nullptr) hadi->RegisterMe( theCascade );
191 if( param->ApplyFactorXS() ) hadi->MultiplyCrossSectionBy( param->XSFactorHadronInelastic() );
192 ph->RegisterProcess(hadi, part);
193 }
194}
195
196void G4HadronicBuilder::BuildElastic(const std::vector<G4int>& partList) {
197
200
201 auto xsel = G4HadProcesses::ElasticXS("Glauber-Gribov");
202
203 auto elModel = new G4HadronElastic();
204 elModel->SetMaxEnergy( param->GetMaxEnergy() );
205
207 for( auto & pdg : partList ) {
208
209 auto part = table->FindParticle( pdg );
210 if ( part == nullptr ) { continue; }
211
212 auto hade = new G4HadronElasticProcess();
213 hade->AddDataSet( xsel );
214 hade->RegisterMe( elModel );
215 if( param->ApplyFactorXS() ) hade->MultiplyCrossSectionBy( param->XSFactorHadronElastic() );
216 ph->RegisterProcess(hade, part);
217 }
218}
219
221 // For hyperons, Bertini is used at low energies;
222 // for anti-hyperons, FTFP can be used down to zero kinetic energy.
223 BuildFTFP_BERT(G4HadParticles::GetHyperons(), true, "Glauber-Gribov");
224 BuildFTFP_BERT(G4HadParticles::GetAntiHyperons(), false, "Glauber-Gribov");
225}
226
228 // For hyperons, Bertini is used at low energies;
229 // for anti-hyperons, FTFP can be used down to zero kinetic energy.
230 BuildFTFQGSP_BERT(G4HadParticles::GetHyperons(), true, "Glauber-Gribov");
231 BuildFTFQGSP_BERT(G4HadParticles::GetAntiHyperons(), false, "Glauber-Gribov");
232}
233
235 // For hyperons, Bertini is used at low energies;
236 // for anti-hyperons, FTFP can be used down to zero kinetic energy.
237 // QGSP is used at high energies in all cases.
238 BuildQGSP_FTFP_BERT(G4HadParticles::GetHyperons(), true, qElastic, "Glauber-Gribov");
239 BuildQGSP_FTFP_BERT(G4HadParticles::GetAntiHyperons(), false, qElastic, "Glauber-Gribov");
240}
241
243 BuildFTFP_BERT(G4HadParticles::GetKaons(), true, "Glauber-Gribov");
244}
245
247 BuildFTFP_BERT(G4HadParticles::GetKaons(), true, "Glauber-Gribov");
248}
249
251 BuildQGSP_FTFP_BERT(G4HadParticles::GetKaons(), true, qElastic, "Glauber-Gribov");
252}
253
255 BuildFTFP_BERT(G4HadParticles::GetLightAntiIons(), false, "AntiAGlauber");
256}
257
258//void G4HadronicBuilder::BuildAntiLightIonsQGSP_FTFP(G4bool qElastic) {
259// Note: currently QGSP cannot be applied for any ion or anti-ion!
260// BuildQGSP_FTFP_BERT(G4HadParticles::GetLightAntiIons(), false, qElastic, "AntiAGlauber");
261//}
262
264 if( G4HadronicParameters::Instance()->EnableBCParticles() ) {
265 // Bertini is not applicable for charm and bottom hadrons, therefore FTFP is used
266 // down to zero kinetic energy (but at very low energies, a dummy model is used
267 // that returns the projectile heavy hadron in the final state).
268 BuildFTFP_BERT(G4HadParticles::GetBCHadrons(), false, "Glauber-Gribov");
270 }
271}
272
274 if( G4HadronicParameters::Instance()->EnableBCParticles() ) {
275 // Bertini is not applicable for charm and bottom hadrons, therefore FTFP is used
276 // down to zero kinetic energy (but at very low energies, a dummy model is used
277 // that returns the projectile heavy hadron in the final state).
278 BuildFTFQGSP_BERT(G4HadParticles::GetBCHadrons(), false, "Glauber-Gribov");
280 }
281}
282
284 if( G4HadronicParameters::Instance()->EnableBCParticles() ) {
285 // Bertini is not applicable for charm and bottom hadrons, therefore FTFP is used
286 // down to zero kinetic energy (but at very low energies, a dummy model is used
287 // that returns the projectile heavy hadron in the final state).
288 // QGSP is used at high energies in all cases.
289 BuildQGSP_FTFP_BERT(G4HadParticles::GetBCHadrons(), false, qElastic, "Glauber-Gribov");
291 }
292}
293
295 // Geant4 does not define the decay of most of charmed and bottom hadrons.
296 // The reason is that most of these heavy hadrons have many different
297 // decay channels, with a complex dynamics, quite different from the flat
298 // phase space kinematical treatment used in Geant4 for most of hadronic decays.
299 // High-energy experiments usually use dedicated Monte Carlo Event Generators
300 // for the decays of charmed and bottom hadrons; therefore, these heavy
301 // hadrons, which are passed to Geant4 as primary tracks, have pre-assigned
302 // decays. Moreover, no charmed or bottom secondary hadrons were created
303 // in Geant4 hadronic interactions before Geant4 10.7.
304 // With the extension of Geant4 hadronic interactions to charmed and bottom
305 // hadrons, in version Geant4 10.7, we do need to define decays in Geant4
306 // for these heavy hadrons, for two reasons:
307 // 1. For testing purposes, unless we pre-assign decays of heavy hadrons
308 // (as the HEP experiments normally do by using MC Event Generators);
309 // 2. To avoid crashes (due to missing decay channels) whenever charmed or
310 // bottom secondary hadrons are produced by Geant4 hadronic interactions,
311 // even with ordinary (i.e. not heavy) hadron projectiles, because in
312 // this case we cannot (easily!) pre-assign decays to them.
313 // Given that 1. is just a convenience for testing, and 2. happens rather
314 // rarely in practice - because very few primary energetic (i.e. boosted)
315 // heavy hadrons fly enough to reach the beam pipe or the tracker and
316 // having an inelastic interaction there, and the very low probability
317 // to create a heavy hadrons from the string fragmentation in ordinary
318 // (i.e. not heavy) hadronic interactions - there is no need in practice
319 // to define accurately the decays of heavy hadrons in Geant4.
320 // So, for our practical purposes, it is enough to define very simple,
321 // "dummy" decays of charmed and bottom hadrons.
322 // Here we use a single, fully hadronic channel, with 2 or 3 or 4
323 // daughters, for each of these heavy hadrons, assigning to this single
324 // decay channel a 100% branching ratio, although in reality such a
325 // channel is one between hundreds of possible ones (and therefore its
326 // real branching ratio is typical of a few per-cent); moreover, we treat
327 // the decay without any dynamics, i.e. with a flat phase space kinematical
328 // treatment.
329 // Note that some of the charmed and bottom hadrons such as SigmaC++,
330 // SigmaC+, SigmaC0, SigmaB+, SigmaB0 and SigmaB- have one dominant
331 // decay channel (to LambdaC/B + Pion) which is already defined in Geant4.
332 // This is not the case for EtaC, JPsi and Upsilon, whose decays need to
333 // be defined here (although they decay so quickly that their hadronic
334 // interactions can be neglected, as we do for Pi0 and Sigma0).
335 // Note that our definition of the decay tables for these heavy hadrons
336 // do not interfere with the pre-assign decays of primary charmed and
337 // bottom tracks made by the HEP experiments. In fact, pre-assign decays
338 // have priority over (i.e. override) decay tables.
339 static G4bool isFirstCall = true;
340 if ( ! isFirstCall ) return;
341 isFirstCall = false;
343 for ( auto & pdg : G4HadParticles::GetBCHadrons() ) {
344 auto part = particleTable->FindParticle( pdg );
345 if ( part == nullptr ) {
346 G4cout << "G4HadronicBuilder::BuildDecayTableForBCHadrons : ERROR ! particlePDG="
347 << pdg << " is not defined !" << G4endl;
348 continue;
349 }
350 if ( part->GetDecayTable() ) {
351 G4cout << "G4HadronicBuilder::BuildDecayTableForBCHadrons : WARNING ! particlePDG="
352 << pdg << " has already a decay table defined !" << G4endl;
353 continue;
354 }
355 G4DecayTable* decayTable = new G4DecayTable;
356 const G4int numberDecayChannels = 1;
357 G4VDecayChannel** mode = new G4VDecayChannel*[ numberDecayChannels ];
358 for ( G4int i = 0; i < numberDecayChannels; ++i ) mode[i] = nullptr;
359 switch ( pdg ) {
360 // Charmed mesons
361 case 411 : // D+
362 mode[0] = new G4PhaseSpaceDecayChannel( "D+", 1.0, 3, "kaon-", "pi+", "pi+" );
363 break;
364 case -411 : // D-
365 mode[0] = new G4PhaseSpaceDecayChannel( "D-", 1.0, 3, "kaon+", "pi-", "pi-" );
366 break;
367 case 421 : // D0
368 mode[0] = new G4PhaseSpaceDecayChannel( "D0", 1.0, 3, "kaon-", "pi+", "pi0" );
369 break;
370 case -421 : // anti_D0
371 mode[0] = new G4PhaseSpaceDecayChannel( "anti_D0", 1.0, 3, "kaon+", "pi-", "pi0" );
372 break;
373 case 431 : // Ds+
374 mode[0] = new G4PhaseSpaceDecayChannel( "Ds+", 1.0, 3, "kaon+", "kaon-", "pi+" );
375 break;
376 case -431 : // Ds-
377 mode[0] = new G4PhaseSpaceDecayChannel( "Ds-", 1.0, 3, "kaon-", "kaon+", "pi-" );
378 break;
379 // Bottom mesons
380 case 521 : // B+
381 mode[0] = new G4PhaseSpaceDecayChannel( "B+", 1.0, 3, "anti_D0", "pi+", "pi0" );
382 break;
383 case -521 : // B-
384 mode[0] = new G4PhaseSpaceDecayChannel( "B-", 1.0, 3, "D0", "pi-", "pi0" );
385 break;
386 case 511 : // B0
387 mode[0] = new G4PhaseSpaceDecayChannel( "B0", 1.0, 3, "D-", "pi+", "pi0" );
388 break;
389 case -511 : // anti_B0
390 mode[0] = new G4PhaseSpaceDecayChannel( "anti_B0", 1.0, 3, "D+", "pi-", "pi0" );
391 break;
392 case 531 : // Bs0
393 mode[0] = new G4PhaseSpaceDecayChannel( "Bs0", 1.0, 3, "Ds-", "pi+", "pi0" );
394 break;
395 case -531 : // anti_Bs0
396 mode[0] = new G4PhaseSpaceDecayChannel( "anti_Bs0", 1.0, 3, "Ds+", "pi-", "pi0" );
397 break;
398 case 541 : // Bc+
399 mode[0] = new G4PhaseSpaceDecayChannel( "Bc+", 1.0, 2, "J/psi", "pi+" );
400 break;
401 case -541 : // Bc-
402 mode[0] = new G4PhaseSpaceDecayChannel( "Bc-", 1.0, 2, "J/psi", "pi-" );
403 break;
404 // Charmed baryons (and anti-baryons)
405 case 4122 : // lambda_c+
406 mode[0] = new G4PhaseSpaceDecayChannel( "lambda_c+", 1.0, 3, "proton", "kaon-", "pi+" );
407 break;
408 case -4122 : // anti_lambda_c+
409 mode[0] = new G4PhaseSpaceDecayChannel( "anti_lambda_c+", 1.0, 3, "anti_proton", "kaon+", "pi-" );
410 break;
411 case 4232 : // xi_c+
412 mode[0] = new G4PhaseSpaceDecayChannel( "xi_c+", 1.0, 3, "sigma+", "kaon-", "pi+" );
413 break;
414 case -4232 : // anti_xi_c+
415 mode[0] = new G4PhaseSpaceDecayChannel( "anti_xi_c+", 1.0, 3, "anti_sigma+", "kaon+", "pi-" );
416 break;
417 case 4132 : // xi_c0
418 mode[0] = new G4PhaseSpaceDecayChannel( "xi_c0", 1.0, 3, "lambda", "kaon-", "pi+" );
419 break;
420 case -4132 : // anti_xi_c0
421 mode[0] = new G4PhaseSpaceDecayChannel( "anti_xi_c0", 1.0, 3, "anti_lambda", "kaon+", "pi-" );
422 break;
423 case 4332 : // omega_c0
424 mode[0] = new G4PhaseSpaceDecayChannel( "omega_c0", 1.0, 3, "xi0", "kaon-", "pi+" );
425 break;
426 case -4332 : // anti_omega_c0
427 mode[0] = new G4PhaseSpaceDecayChannel( "anti_omega_c0", 1.0, 3, "anti_xi0", "kaon+", "pi-" );
428 break;
429 // Bottom baryons (and anti-baryons)
430 case 5122 : // lambda_b
431 mode[0] = new G4PhaseSpaceDecayChannel( "lambda_b", 1.0, 4, "lambda_c+", "pi+", "pi-", "pi-" );
432 break;
433 case -5122 : // anti_lambda_b
434 mode[0] = new G4PhaseSpaceDecayChannel( "anti_lambda_b", 1.0, 4, "anti_lambda_c+", "pi-", "pi+", "pi+" );
435 break;
436 case 5232 : // xi_b0
437 mode[0] = new G4PhaseSpaceDecayChannel( "xi_b0", 1.0, 3, "lambda_c+", "kaon-", "pi0" );
438 break;
439 case -5232 : // anti_xi_b0
440 mode[0] = new G4PhaseSpaceDecayChannel( "anti_xi_b0", 1.0, 3, "anti_lambda_c+", "kaon+", "pi0" );
441 break;
442 case 5132 : // xi_b-
443 mode[0] = new G4PhaseSpaceDecayChannel( "xi_b-", 1.0, 3, "lambda_c+", "kaon-", "pi-" );
444 break;
445 case -5132 : // anti_xi_b-
446 mode[0] = new G4PhaseSpaceDecayChannel( "anti_xi_b-", 1.0, 3, "anti_lambda_c+", "kaon+", "pi+" );
447 break;
448 case 5332 : // omega_b-
449 mode[0] = new G4PhaseSpaceDecayChannel( "omega_b-", 1.0, 3, "xi_c+", "kaon-", "pi-" );
450 break;
451 case -5332 : // anti_omega_b-
452 mode[0] = new G4PhaseSpaceDecayChannel( "anti_omega_b-", 1.0, 3, "anti_xi_c+", "kaon+", "pi+" );
453 break;
454 default :
455 G4cout << "G4HadronicBuilder::BuildDecayTableForBCHadrons : UNKNOWN particlePDG=" << pdg << G4endl;
456 } // End of the switch
457
458 for ( G4int index = 0; index < numberDecayChannels; ++index ) decayTable->Insert( mode[index] );
459 delete [] mode;
460 part->SetDecayTable( decayTable );
461 } // End of the for loop over heavy hadrons
462 // Add now the decay for etac, JPsi and Upsilon because these can be produced as
463 // secondaries in hadronic interactions, while they are not part of the heavy
464 // hadrons included in G4HadParticles::GetBCHadrons() because they live too shortly
465 // and therefore their hadronic interactions can be neglected (as we do for pi0 and sigma0).
466 if ( ! G4Etac::Definition()->GetDecayTable() ) {
467 G4DecayTable* decayTable = new G4DecayTable;
468 const G4int numberDecayChannels = 1;
469 G4VDecayChannel** mode = new G4VDecayChannel*[ numberDecayChannels ];
470 for ( G4int i = 0; i < numberDecayChannels; ++i ) mode[i] = nullptr;
471 mode[0] = new G4PhaseSpaceDecayChannel( "etac", 1.0, 3, "eta", "pi+", "pi-" );
472 for ( G4int index = 0; index < numberDecayChannels; ++index ) decayTable->Insert( mode[index] );
473 delete [] mode;
474 G4Etac::Definition()->SetDecayTable( decayTable );
475 }
476 if ( ! G4JPsi::Definition()->GetDecayTable() ) {
477 G4DecayTable* decayTable = new G4DecayTable;
478 const G4int numberDecayChannels = 1;
479 G4VDecayChannel** mode = new G4VDecayChannel*[ numberDecayChannels ];
480 for ( G4int i = 0; i < numberDecayChannels; ++i ) mode[i] = nullptr;
481 mode[0] = new G4PhaseSpaceDecayChannel( "J/psi", 1.0, 3, "pi0", "pi+", "pi-" );
482 for ( G4int index = 0; index < numberDecayChannels; ++index ) decayTable->Insert( mode[index] );
483 delete [] mode;
484 G4JPsi::Definition()->SetDecayTable( decayTable );
485 }
486 if ( ! G4Upsilon::Definition()->GetDecayTable() ) {
487 G4DecayTable* decayTable = new G4DecayTable;
488 const G4int numberDecayChannels = 1;
489 G4VDecayChannel** mode = new G4VDecayChannel*[ numberDecayChannels ];
490 for ( G4int i = 0; i < numberDecayChannels; ++i ) mode[i] = nullptr;
491 mode[0] = new G4PhaseSpaceDecayChannel( "Upsilon", 1.0, 3, "eta_prime", "pi+", "pi-" );
492 for ( G4int index = 0; index < numberDecayChannels; ++index ) decayTable->Insert( mode[index] );
493 delete [] mode;
494 G4Upsilon::Definition()->SetDecayTable( decayTable );
495 }
496}
497
498
500 if ( G4HadronicParameters::Instance()->EnableHyperNuclei() ) {
501 // Bertini intra-nuclear cascade model is currently not applicable for light
502 // hypernuclei, therefore FTFP is used down to zero kinetic energy (but at
503 // very low energies, a dummy model is used that simply returns the projectile
504 // hypernucleus in the final state).
505 BuildFTFP_BERT( G4HadParticles::GetHyperNuclei(), false, "Glauber-Gribov" );
506 }
507}
508
509
511 if ( G4HadronicParameters::Instance()->EnableHyperNuclei() ) {
512 // FTFP can be used down to zero kinetic energy.
513 BuildFTFP_BERT( G4HadParticles::GetHyperAntiNuclei(), false, "AntiAGlauber" );
514 }
515}
516
517
519 if ( G4HadronicParameters::Instance()->EnableHyperNuclei() ) {
521 }
522}
523
524
525void G4HadronicBuilder::BuildFTFP_INCLXX( const std::vector< G4int >& partList, const G4String& xsName ) {
528 auto theTheoFSModel = new G4TheoFSGenerator( "FTFP" );
529 auto theStringModel = new G4FTFModel;
530 theStringModel->SetFragmentationModel( new G4ExcitedStringDecay );
531 theTheoFSModel->SetHighEnergyGenerator( theStringModel );
532 theTheoFSModel->SetTransport( new G4GeneratorPrecompoundInterface );
533 theTheoFSModel->SetMaxEnergy( param->GetMaxEnergy() );
534 theTheoFSModel->SetMinEnergy( 15.0*CLHEP::GeV );
535 G4VPreCompoundModel* thePrecoModel = new G4PreCompoundModel;
536 thePrecoModel->SetMinEnergy( 0.0 );
537 thePrecoModel->SetMaxEnergy( 2.0*CLHEP::MeV );
538 G4INCLXXInterface* theINCLXXModel = new G4INCLXXInterface( thePrecoModel );
539 theINCLXXModel->SetMinEnergy( 1.0*CLHEP::MeV );
540 theINCLXXModel->SetMaxEnergy( 20.0*CLHEP::GeV );
541 auto xsinel = G4HadProcesses::InelasticXS( xsName );
543 for ( auto & pdg : partList ) {
544 auto part = table->FindParticle( pdg );
545 if ( part == nullptr ) continue;
546 auto hadi = new G4HadronInelasticProcess( part->GetParticleName()+"Inelastic", part );
547 hadi->AddDataSet( xsinel );
548 hadi->RegisterMe( theTheoFSModel );
549 hadi->RegisterMe( theINCLXXModel );
550 if ( param->ApplyFactorXS() ) hadi->MultiplyCrossSectionBy( param->XSFactorHadronInelastic() );
551 ph->RegisterProcess( hadi, part );
552 }
553}
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
void Insert(G4VDecayChannel *aChannel)
Definition: G4DecayTable.cc:53
static G4Etac * Definition()
Definition: G4Etac.cc:52
static const std::vector< G4int > & GetBCHadrons()
static const std::vector< G4int > & GetAntiHyperons()
static const std::vector< G4int > & GetLightAntiIons()
static const std::vector< G4int > & GetHyperNuclei()
static const std::vector< G4int > & GetKaons()
static const std::vector< G4int > & GetHyperons()
static const std::vector< G4int > & GetHyperAntiNuclei()
static G4CrossSectionElastic * ElasticXS(const G4String &componentName)
static G4CrossSectionInelastic * InelasticXS(const G4String &componentName)
static void BuildBCHadronsFTFP_BERT()
static void BuildElastic(const std::vector< G4int > &particleList)
static void BuildHyperonsFTFP_BERT()
static void BuildKaonsQGSP_FTFP_BERT(G4bool quasiElastic)
static void BuildKaonsFTFQGSP_BERT()
static void BuildBCHadronsFTFQGSP_BERT()
static void BuildHyperonsQGSP_FTFP_BERT(G4bool quasiElastic)
static void BuildHyperonsFTFQGSP_BERT()
static void BuildDecayTableForBCHadrons()
static void BuildFTFP_INCLXX(const std::vector< G4int > &partList, const G4String &xsName)
static void BuildKaonsFTFP_BERT()
static void BuildAntiLightIonsFTFP()
static void BuildHyperAntiNucleiFTFP_BERT()
static void BuildBCHadronsQGSP_FTFP_BERT(G4bool quasiElastic)
static void BuildHyperNucleiFTFP_BERT()
static void BuildHyperNucleiFTFP_INCLXX()
void SetMinEnergy(G4double anEnergy)
void SetMaxEnergy(const G4double anEnergy)
static G4HadronicParameters * Instance()
G4double GetMinEnergyTransitionFTF_Cascade() const
G4double GetMinEnergyTransitionQGS_FTF() const
G4double GetMaxEnergyTransitionFTF_Cascade() const
G4double XSFactorHadronInelastic() const
G4double GetMaxEnergyTransitionQGS_FTF() const
G4double XSFactorHadronElastic() const
G4double GetMaxEnergy() const
INCL++ intra-nuclear cascade.
static G4JPsi * Definition()
Definition: G4JPsi.cc:47
void SetDecayTable(G4DecayTable *aDecayTable)
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
static G4ParticleTable * GetParticleTable()
G4bool RegisterProcess(G4VProcess *process, G4ParticleDefinition *particle)
static G4PhysicsListHelper * GetPhysicsListHelper()
static G4Upsilon * Definition()
Definition: G4Upsilon.cc:46
void SetFragmentationModel(G4VStringFragmentation *aModel)