Import Geant4 10.7.0 source tree

This commit is contained in:
Gabriele Cosmo
2020-12-04 12:30:43 +01:00
parent 67ba86d073
commit dab42d2018
3770 changed files with 226369 additions and 286486 deletions
@@ -31,6 +31,7 @@
#include "G4HadronicBuilder.hh"
#include "G4HadParticles.hh"
#include "G4HadProcesses.hh"
#include "G4ParticleDefinition.hh"
#include "G4ParticleTable.hh"
@@ -54,11 +55,16 @@
#include "G4CrossSectionElastic.hh"
#include "G4HadronElastic.hh"
#include "G4CrossSectionDataSetRegistry.hh"
#include "G4ComponentGGHadronNucleusXsc.hh"
#include "G4HadronElasticProcess.hh"
#include "G4HadronInelasticProcess.hh"
void G4HadronicBuilder::BuildFTFP_BERT(const std::vector<G4int>& partList) {
#include "G4DecayTable.hh"
#include "G4VDecayChannel.hh"
#include "G4PhaseSpaceDecayChannel.hh"
void G4HadronicBuilder::BuildFTFP_BERT(const std::vector<G4int>& partList,
G4bool bert, const G4String& xsName) {
G4HadronicParameters* param = G4HadronicParameters::Instance();
G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper();
@@ -68,40 +74,72 @@ void G4HadronicBuilder::BuildFTFP_BERT(const std::vector<G4int>& partList) {
theStringModel->SetFragmentationModel(new G4ExcitedStringDecay());
theModel->SetHighEnergyGenerator( theStringModel );
theModel->SetTransport( new G4GeneratorPrecompoundInterface() );
theModel->SetMinEnergy( param->GetMinEnergyTransitionFTF_Cascade() );
theModel->SetMaxEnergy( param->GetMaxEnergy() );
auto theCascade = new G4CascadeInterface();
theCascade->SetMaxEnergy( param->GetMaxEnergyTransitionFTF_Cascade() );
G4CascadeInterface* theCascade = nullptr;
if(bert) {
theCascade = new G4CascadeInterface();
theCascade->SetMaxEnergy( param->GetMaxEnergyTransitionFTF_Cascade() );
theModel->SetMinEnergy( param->GetMinEnergyTransitionFTF_Cascade() );
}
auto xsStore = G4CrossSectionDataSetRegistry::Instance();
auto xsComponent = xsStore->GetComponentCrossSection("Glauber-Gribov");
if(xsComponent == nullptr) xsComponent = new G4ComponentGGHadronNucleusXsc();
auto xsinel = new G4CrossSectionInelastic(xsComponent);
auto xsel = new G4CrossSectionElastic(xsComponent);
auto elModel = new G4HadronElastic();
auto xsinel = G4HadProcesses::InelasticXS( xsName );
G4ParticleTable* table = G4ParticleTable::GetParticleTable();
for( auto & pdg : partList ) {
for( auto & pdg : partList ) {
auto part = table->FindParticle( pdg );
if ( part == nullptr ) { continue; }
auto hade = new G4HadronElasticProcess();
hade->AddDataSet( xsel );
hade->RegisterMe( elModel );
ph->RegisterProcess(hade, part);
auto hadi = new G4HadronInelasticProcess( part->GetParticleName()+"Inelastic", part );
hadi->AddDataSet( xsinel );
hadi->RegisterMe( theModel );
hadi->RegisterMe( theCascade );
if( theCascade != nullptr ) hadi->RegisterMe( theCascade );
if( param->ApplyFactorXS() ) hadi->MultiplyCrossSectionBy( param->XSFactorHadronInelastic() );
ph->RegisterProcess(hadi, part);
}
}
void G4HadronicBuilder::BuildQGSP_FTFP_BERT(const std::vector<G4int>& partList, G4bool quasiElastic) {
void G4HadronicBuilder::BuildFTFQGSP_BERT(const std::vector<G4int>& partList,
G4bool bert, const G4String& xsName) {
G4HadronicParameters* param = G4HadronicParameters::Instance();
G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper();
auto theModel = new G4TheoFSGenerator("FTFQGSP");
auto theStringModel = new G4FTFModel();
theStringModel->SetFragmentationModel(new G4ExcitedStringDecay( new G4QGSMFragmentation() ) );
theModel->SetHighEnergyGenerator( theStringModel );
theModel->SetTransport( new G4GeneratorPrecompoundInterface() );
theModel->SetMaxEnergy( param->GetMaxEnergy() );
G4CascadeInterface* theCascade = nullptr;
if(bert) {
theCascade = new G4CascadeInterface();
theCascade->SetMaxEnergy( param->GetMaxEnergyTransitionFTF_Cascade() );
theModel->SetMinEnergy( param->GetMinEnergyTransitionFTF_Cascade() );
}
auto xsinel = G4HadProcesses::InelasticXS( xsName );
G4ParticleTable* table = G4ParticleTable::GetParticleTable();
for( auto & pdg : partList ) {
auto part = table->FindParticle( pdg );
if ( part == nullptr ) { continue; }
auto hadi = new G4HadronInelasticProcess( part->GetParticleName()+"Inelastic", part );
hadi->AddDataSet( xsinel );
hadi->RegisterMe( theModel );
if( theCascade != nullptr ) hadi->RegisterMe( theCascade );
if( param->ApplyFactorXS() ) hadi->MultiplyCrossSectionBy( param->XSFactorHadronInelastic() );
ph->RegisterProcess(hadi, part);
}
}
void G4HadronicBuilder::BuildQGSP_FTFP_BERT(const std::vector<G4int>& partList,
G4bool bert, G4bool quasiElastic,
const G4String& xsName) {
G4HadronicParameters* param = G4HadronicParameters::Instance();
G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper();
@@ -124,19 +162,42 @@ void G4HadronicBuilder::BuildQGSP_FTFP_BERT(const std::vector<G4int>& partList,
theFTFModel->SetFragmentationModel(new G4ExcitedStringDecay());
theLEModel->SetHighEnergyGenerator( theFTFModel );
theLEModel->SetTransport( theTransport );
theLEModel->SetMinEnergy( param->GetMinEnergyTransitionFTF_Cascade() );
theLEModel->SetMaxEnergy( param->GetMaxEnergyTransitionQGS_FTF() );
auto theCascade = new G4CascadeInterface();
theCascade->SetMaxEnergy( param->GetMaxEnergyTransitionFTF_Cascade() );
G4CascadeInterface* theCascade = nullptr;
if(bert) {
theCascade = new G4CascadeInterface();
theCascade->SetMaxEnergy( param->GetMaxEnergyTransitionFTF_Cascade() );
theLEModel->SetMinEnergy( param->GetMinEnergyTransitionFTF_Cascade() );
}
auto xsStore = G4CrossSectionDataSetRegistry::Instance();
auto xsComponent = xsStore->GetComponentCrossSection("Glauber-Gribov");
if(xsComponent == nullptr) xsComponent = new G4ComponentGGHadronNucleusXsc();
auto xsinel = new G4CrossSectionInelastic(xsComponent);
auto xsel = new G4CrossSectionElastic(xsComponent);
auto xsinel = G4HadProcesses::InelasticXS( xsName );
G4ParticleTable* table = G4ParticleTable::GetParticleTable();
for( auto & pdg : partList ) {
auto part = table->FindParticle( pdg );
if ( part == nullptr ) { continue; }
auto hadi = new G4HadronInelasticProcess( part->GetParticleName()+"Inelastic", part );
hadi->AddDataSet( xsinel );
hadi->RegisterMe( theHEModel );
hadi->RegisterMe( theLEModel );
if(theCascade != nullptr) hadi->RegisterMe( theCascade );
if( param->ApplyFactorXS() ) hadi->MultiplyCrossSectionBy( param->XSFactorHadronInelastic() );
ph->RegisterProcess(hadi, part);
}
}
void G4HadronicBuilder::BuildElastic(const std::vector<G4int>& partList) {
G4HadronicParameters* param = G4HadronicParameters::Instance();
G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper();
auto xsel = G4HadProcesses::ElasticXS("Glauber-Gribov");
auto elModel = new G4HadronElastic();
elModel->SetMaxEnergy( param->GetMaxEnergy() );
G4ParticleTable* table = G4ParticleTable::GetParticleTable();
for( auto & pdg : partList ) {
@@ -147,41 +208,281 @@ void G4HadronicBuilder::BuildQGSP_FTFP_BERT(const std::vector<G4int>& partList,
auto hade = new G4HadronElasticProcess();
hade->AddDataSet( xsel );
hade->RegisterMe( elModel );
if( param->ApplyFactorXS() ) hade->MultiplyCrossSectionBy( param->XSFactorHadronElastic() );
ph->RegisterProcess(hade, part);
auto hadi = new G4HadronInelasticProcess( part->GetParticleName()+"Inelastic", part );
hadi->AddDataSet( xsinel );
hadi->RegisterMe( theHEModel );
hadi->RegisterMe( theLEModel );
hadi->RegisterMe( theCascade );
ph->RegisterProcess(hadi, part);
}
}
void G4HadronicBuilder::BuildHyperonsFTFP_BERT() {
BuildFTFP_BERT(G4HadParticles::GetHyperons());
// For hyperons, Bertini is used at low energies;
// for anti-hyperons, FTFP can be used down to zero kinetic energy.
BuildFTFP_BERT(G4HadParticles::GetHyperons(), true, "Glauber-Gribov");
BuildFTFP_BERT(G4HadParticles::GetAntiHyperons(), false, "Glauber-Gribov");
}
void G4HadronicBuilder::BuildHyperonsQGSP_FTFP_BERT(G4bool quasiElastic) {
BuildQGSP_FTFP_BERT(G4HadParticles::GetHyperons(), quasiElastic);
void G4HadronicBuilder::BuildHyperonsFTFQGSP_BERT() {
// For hyperons, Bertini is used at low energies;
// for anti-hyperons, FTFP can be used down to zero kinetic energy.
BuildFTFQGSP_BERT(G4HadParticles::GetHyperons(), true, "Glauber-Gribov");
BuildFTFQGSP_BERT(G4HadParticles::GetAntiHyperons(), false, "Glauber-Gribov");
}
void G4HadronicBuilder::BuildHyperonsQGSP_FTFP_BERT(G4bool qElastic) {
// For hyperons, Bertini is used at low energies;
// for anti-hyperons, FTFP can be used down to zero kinetic energy.
// QGSP is used at high energies in all cases.
BuildQGSP_FTFP_BERT(G4HadParticles::GetHyperons(), true, qElastic, "Glauber-Gribov");
BuildQGSP_FTFP_BERT(G4HadParticles::GetAntiHyperons(), false, qElastic, "Glauber-Gribov");
}
void G4HadronicBuilder::BuildKaonsFTFP_BERT() {
BuildFTFP_BERT(G4HadParticles::GetKaons());
BuildFTFP_BERT(G4HadParticles::GetKaons(), true, "Glauber-Gribov");
}
void G4HadronicBuilder::BuildKaonsQGSP_FTFP_BERT(G4bool quasiElastic) {
BuildQGSP_FTFP_BERT(G4HadParticles::GetKaons(), quasiElastic);
void G4HadronicBuilder::BuildKaonsFTFQGSP_BERT() {
BuildFTFP_BERT(G4HadParticles::GetKaons(), true, "Glauber-Gribov");
}
void G4HadronicBuilder::BuildKaonsQGSP_FTFP_BERT(G4bool qElastic) {
BuildQGSP_FTFP_BERT(G4HadParticles::GetKaons(), true, qElastic, "Glauber-Gribov");
}
void G4HadronicBuilder::BuildAntiLightIonsFTFP() {
BuildFTFP_BERT(G4HadParticles::GetLightAntiIons(), false, "AntiAGlauber");
}
//void G4HadronicBuilder::BuildAntiLightIonsQGSP_FTFP(G4bool qElastic) {
// Note: currently QGSP cannot be applied for any ion or anti-ion!
// BuildQGSP_FTFP_BERT(G4HadParticles::GetLightAntiIons(), false, qElastic, "AntiAGlauber");
//}
void G4HadronicBuilder::BuildBCHadronsFTFP_BERT() {
if( G4HadronicParameters::Instance()->EnableBCParticles() ) {
BuildFTFP_BERT(G4HadParticles::GetBCHadrons());
// Bertini is not applicable for charm and bottom hadrons, therefore FTFP is used
// down to zero kinetic energy (but at very low energies, a dummy model is used
// that returns the projectile heavy hadron in the final state).
BuildFTFP_BERT(G4HadParticles::GetBCHadrons(), false, "Glauber-Gribov");
BuildDecayTableForBCHadrons();
}
}
void G4HadronicBuilder::BuildBCHadronsQGSP_FTFP_BERT(G4bool quasiElastic) {
void G4HadronicBuilder::BuildBCHadronsFTFQGSP_BERT() {
if( G4HadronicParameters::Instance()->EnableBCParticles() ) {
BuildQGSP_FTFP_BERT(G4HadParticles::GetBCHadrons(), quasiElastic);
// Bertini is not applicable for charm and bottom hadrons, therefore FTFP is used
// down to zero kinetic energy (but at very low energies, a dummy model is used
// that returns the projectile heavy hadron in the final state).
BuildFTFQGSP_BERT(G4HadParticles::GetBCHadrons(), false, "Glauber-Gribov");
BuildDecayTableForBCHadrons();
}
}
void G4HadronicBuilder::BuildBCHadronsQGSP_FTFP_BERT(G4bool qElastic) {
if( G4HadronicParameters::Instance()->EnableBCParticles() ) {
// Bertini is not applicable for charm and bottom hadrons, therefore FTFP is used
// down to zero kinetic energy (but at very low energies, a dummy model is used
// that returns the projectile heavy hadron in the final state).
// QGSP is used at high energies in all cases.
BuildQGSP_FTFP_BERT(G4HadParticles::GetBCHadrons(), false, qElastic, "Glauber-Gribov");
BuildDecayTableForBCHadrons();
}
}
void G4HadronicBuilder::BuildDecayTableForBCHadrons() {
// Geant4 does not define the decay of most of charmed and bottom hadrons.
// The reason is that most of these heavy hadrons have many different
// decay channels, with a complex dynamics, quite different from the flat
// phase space kinematical treatment used in Geant4 for most of hadronic decays.
// High-energy experiments usually use dedicated Monte Carlo Event Generators
// for the decays of charmed and bottom hadrons; therefore, these heavy
// hadrons, which are passed to Geant4 as primary tracks, have pre-assigned
// decays. Moreover, no charmed or bottom secondary hadrons were created
// in Geant4 hadronic interactions before Geant4 10.7.
// With the extension of Geant4 hadronic interactions to charmed and bottom
// hadrons, in version Geant4 10.7, we do need to define decays in Geant4
// for these heavy hadrons, for two reasons:
// 1. For testing purposes, unless we pre-assign decays of heavy hadrons
// (as the HEP experiments normally do by using MC Event Generators);
// 2. To avoid crashes (due to missing decay channels) whenever charmed or
// bottom secondary hadrons are produced by Geant4 hadronic interactions,
// even with ordinary (i.e. not heavy) hadron projectiles, because in
// this case we cannot (easily!) pre-assign decays to them.
// Given that 1. is just a convenience for testing, and 2. happens rather
// rarely in practice - because very few primary energetic (i.e. boosted)
// heavy hadrons fly enough to reach the beam pipe or the tracker and
// having an inelastic interaction there, and the very low probability
// to create a heavy hadrons from the string fragmentation in ordinary
// (i.e. not heavy) hadronic interactions - there is no need in practice
// to define accurately the decays of heavy hadrons in Geant4.
// So, for our practical purposes, it is enough to define very simple,
// "dummy" decays of charmed and bottom hadrons.
// Here we use a single, fully hadronic channel, with 2 or 3 or 4
// daughters, for each of these heavy hadrons, assigning to this single
// decay channel a 100% branching ratio, although in reality such a
// channel is one between hundreds of possible ones (and therefore its
// real branching ratio is typical of a few per-cent); moreover, we treat
// the decay without any dynamics, i.e. with a flat phase space kinematical
// treatment.
// Note that some of the charmed and bottom hadrons such as SigmaC++,
// SigmaC+, SigmaC0, SigmaB+, SigmaB0 and SigmaB- have one dominant
// decay channel (to LambdaC/B + Pion) which is already defined in Geant4.
// This is not the case for EtaC, JPsi and Upsilon, whose decays need to
// be defined here (although they decay so quickly that their hadronic
// interactions can be neglected, as we do for Pi0 and Sigma0).
// Note that our definition of the decay tables for these heavy hadrons
// do not interfere with the pre-assign decays of primary charmed and
// bottom tracks made by the HEP experiments. In fact, pre-assign decays
// have priority over (i.e. override) decay tables.
static G4bool isFirstCall = true;
if ( ! isFirstCall ) return;
isFirstCall = false;
G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
for ( auto & pdg : G4HadParticles::GetBCHadrons() ) {
auto part = particleTable->FindParticle( pdg );
if ( part == nullptr ) {
G4cout << "G4HadronicBuilder::BuildDecayTableForBCHadrons : ERROR ! particlePDG="
<< pdg << " is not defined !" << G4endl;
continue;
}
if ( part->GetDecayTable() ) {
G4cout << "G4HadronicBuilder::BuildDecayTableForBCHadrons : WARNING ! particlePDG="
<< pdg << " has already a decay table defined !" << G4endl;
continue;
}
G4DecayTable* decayTable = new G4DecayTable;
const G4int numberDecayChannels = 1;
G4VDecayChannel** mode = new G4VDecayChannel*[ numberDecayChannels ];
switch ( pdg ) {
// Charmed mesons
case 411 : // D+
mode[0] = new G4PhaseSpaceDecayChannel( "D+", 1.0, 3, "kaon-", "pi+", "pi+" );
break;
case -411 : // D-
mode[0] = new G4PhaseSpaceDecayChannel( "D-", 1.0, 3, "kaon+", "pi-", "pi-" );
break;
case 421 : // D0
mode[0] = new G4PhaseSpaceDecayChannel( "D0", 1.0, 3, "kaon-", "pi+", "pi0" );
break;
case -421 : // anti_D0
mode[0] = new G4PhaseSpaceDecayChannel( "anti_D0", 1.0, 3, "kaon+", "pi-", "pi0" );
break;
case 431 : // Ds+
mode[0] = new G4PhaseSpaceDecayChannel( "Ds+", 1.0, 3, "kaon+", "kaon-", "pi+" );
break;
case -431 : // Ds-
mode[0] = new G4PhaseSpaceDecayChannel( "Ds-", 1.0, 3, "kaon-", "kaon+", "pi-" );
break;
// Bottom mesons
case 521 : // B+
mode[0] = new G4PhaseSpaceDecayChannel( "B+", 1.0, 2, "anti_D0", "rho+" );
break;
case -521 : // B-
mode[0] = new G4PhaseSpaceDecayChannel( "B-", 1.0, 2, "D0", "rho-" );
break;
case 511 : // B0
mode[0] = new G4PhaseSpaceDecayChannel( "B0", 1.0, 2, "D-", "rho+" );
break;
case -511 : // anti_B0
mode[0] = new G4PhaseSpaceDecayChannel( "anti_B0", 1.0, 2, "D+", "rho-" );
break;
case 531 : // Bs0
mode[0] = new G4PhaseSpaceDecayChannel( "Bs0", 1.0, 2, "Ds-", "rho+" );
break;
case -531 : // anti_Bs0
mode[0] = new G4PhaseSpaceDecayChannel( "anti_Bs0", 1.0, 2, "Ds+", "rho-" );
break;
case 541 : // Bc+
mode[0] = new G4PhaseSpaceDecayChannel( "Bc+", 1.0, 2, "J/psi", "pi+" );
break;
case -541 : // Bc-
mode[0] = new G4PhaseSpaceDecayChannel( "Bc-", 1.0, 2, "J/psi", "pi-" );
break;
// Charmed baryons (and anti-baryons)
case 4122 : // lambda_c+
mode[0] = new G4PhaseSpaceDecayChannel( "lambda_c+", 1.0, 3, "proton", "kaon-", "pi+" );
break;
case -4122 : // anti_lambda_c+
mode[0] = new G4PhaseSpaceDecayChannel( "anti_lambda_c+", 1.0, 3, "anti_proton", "kaon+", "pi-" );
break;
case 4232 : // xi_c+
mode[0] = new G4PhaseSpaceDecayChannel( "xi_c+", 1.0, 3, "sigma+", "kaon-", "pi+" );
break;
case -4232 : // anti_xi_c+
mode[0] = new G4PhaseSpaceDecayChannel( "anti_xi_c+", 1.0, 3, "anti_sigma+", "kaon+", "pi-" );
break;
case 4132 : // xi_c0
mode[0] = new G4PhaseSpaceDecayChannel( "xi_c0", 1.0, 3, "lambda", "kaon-", "pi+" );
break;
case -4132 : // anti_xi_c0
mode[0] = new G4PhaseSpaceDecayChannel( "anti_xi_c0", 1.0, 3, "anti_lambda", "kaon+", "pi-" );
break;
case 4332 : // omega_c0
mode[0] = new G4PhaseSpaceDecayChannel( "omega_c0", 1.0, 3, "xi0", "kaon-", "pi+" );
break;
case -4332 : // anti_omega_c0
mode[0] = new G4PhaseSpaceDecayChannel( "anti_omega_c0", 1.0, 3, "anti_xi0", "kaon+", "pi-" );
break;
// Bottom baryons (and anti-baryons)
case 5122 : // lambda_b
mode[0] = new G4PhaseSpaceDecayChannel( "lambda_b", 1.0, 4, "lambda_c+", "pi+", "pi-", "pi-" );
break;
case -5122 : // anti_lambda_b
mode[0] = new G4PhaseSpaceDecayChannel( "anti_lambda_b", 1.0, 4, "anti_lambda_c+", "pi-", "pi+", "pi+" );
break;
case 5232 : // xi_b0
mode[0] = new G4PhaseSpaceDecayChannel( "xi_b0", 1.0, 3, "lambda_c+", "kaon-", "pi0" );
break;
case -5232 : // anti_xi_b0
mode[0] = new G4PhaseSpaceDecayChannel( "anti_xi_b0", 1.0, 3, "anti_lambda_c+", "kaon+", "pi0" );
break;
case 5132 : // xi_b-
mode[0] = new G4PhaseSpaceDecayChannel( "xi_b-", 1.0, 3, "lambda_c+", "kaon-", "pi-" );
break;
case -5132 : // anti_xi_b-
mode[0] = new G4PhaseSpaceDecayChannel( "anti_xi_b-", 1.0, 3, "anti_lambda_c+", "kaon+", "pi+" );
break;
case 5332 : // omega_b-
mode[0] = new G4PhaseSpaceDecayChannel( "omega_b-", 1.0, 3, "xi_c+", "kaon-", "pi-" );
break;
case -5332 : // anti_omega_b-
mode[0] = new G4PhaseSpaceDecayChannel( "anti_omega_b-", 1.0, 3, "anti_xi_c+", "kaon+", "pi+" );
break;
default :
G4cout << "G4HadronicBuilder::BuildDecayTableForBCHadrons : UNKNOWN particlePDG=" << pdg << G4endl;
} // End of the switch
for ( G4int index = 0; index < numberDecayChannels; ++index ) decayTable->Insert( mode[index] );
delete [] mode;
part->SetDecayTable( decayTable );
} // End of the for loop over heavy hadrons
// Add now the decay for etac, JPsi and Upsilon because these can be produced as
// secondaries in hadronic interactions, while they are not part of the heavy
// hadrons included in G4HadParticles::GetBCHadrons() because they live too shortly
// and therefore their hadronic interactions can be neglected (as we do for pi0 and sigma0).
if ( ! G4Etac::Definition()->GetDecayTable() ) {
G4DecayTable* decayTable = new G4DecayTable;
const G4int numberDecayChannels = 1;
G4VDecayChannel** mode = new G4VDecayChannel*[ numberDecayChannels ];
mode[0] = new G4PhaseSpaceDecayChannel( "etac", 1.0, 3, "eta", "pi+", "pi-" );
for ( G4int index = 0; index < numberDecayChannels; ++index ) decayTable->Insert( mode[index] );
delete [] mode;
G4Etac::Definition()->SetDecayTable( decayTable );
}
if ( ! G4JPsi::Definition()->GetDecayTable() ) {
G4DecayTable* decayTable = new G4DecayTable;
const G4int numberDecayChannels = 1;
G4VDecayChannel** mode = new G4VDecayChannel*[ numberDecayChannels ];
mode[0] = new G4PhaseSpaceDecayChannel( "J/psi", 1.0, 3, "pi0", "pi+", "pi-" );
for ( G4int index = 0; index < numberDecayChannels; ++index ) decayTable->Insert( mode[index] );
delete [] mode;
G4JPsi::Definition()->SetDecayTable( decayTable );
}
if ( ! G4Upsilon::Definition()->GetDecayTable() ) {
G4DecayTable* decayTable = new G4DecayTable;
const G4int numberDecayChannels = 1;
G4VDecayChannel** mode = new G4VDecayChannel*[ numberDecayChannels ];
mode[0] = new G4PhaseSpaceDecayChannel( "Upsilon", 1.0, 3, "eta_prime", "pi+", "pi-" );
for ( G4int index = 0; index < numberDecayChannels; ++index ) decayTable->Insert( mode[index] );
delete [] mode;
G4Upsilon::Definition()->SetDecayTable( decayTable );
}
}