Files
geant4/examples/extended/hadronic/Hadr08/src/BiasingOperation.cc
T
2024-06-28 13:08:51 +02:00

169 lines
8.4 KiB
C++

//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
/// \file BiasingOperation.cc
/// \brief Implementation of the BiasingOperation class
//
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#include "BiasingOperation.hh"
#include "G4BGGNucleonInelasticXS.hh"
#include "G4BGGPionInelasticXS.hh"
#include "G4BiasingProcessInterface.hh"
#include "G4CascadeInterface.hh"
#include "G4CrossSectionDataStore.hh"
#include "G4ExcitedStringDecay.hh"
#include "G4FTFModel.hh"
#include "G4GeneratorPrecompoundInterface.hh"
#include "G4HadronInelasticProcess.hh"
#include "G4HadronicParameters.hh"
#include "G4INCLXXInterface.hh"
#include "G4LundStringFragmentation.hh"
#include "G4NeutronInelasticXS.hh"
#include "G4TheoFSGenerator.hh"
#include "G4VParticleChange.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
BiasingOperation::BiasingOperation(G4String name) : G4VBiasingOperation(name)
{
// Create the inelastic processes for p , n , pi+ , pi-
fProtonInelasticProcess = new G4HadronInelasticProcess("protonInelastic", G4Proton::Definition());
fNeutronInelasticProcess =
new G4HadronInelasticProcess("neutronInelastic", G4Neutron::Definition());
fPionPlusInelasticProcess =
new G4HadronInelasticProcess("pi+Inelastic", G4PionPlus::Definition());
fPionMinusInelasticProcess =
new G4HadronInelasticProcess("pi-Inelastic", G4PionMinus::Definition());
// Set the energy ranges
const G4double maxBERT = 41.0 * CLHEP::MeV;
const G4double maxINCLXX = 12.0 * CLHEP::GeV;
const G4double minINCLXX = 40.0 * CLHEP::MeV;
const G4double minFTFP = 3.0 * CLHEP::GeV;
const G4double maxFTFP = G4HadronicParameters::Instance()->GetMaxEnergy();
// Create the hadronic models (to replace FTFP_BERT with "FTFP_INCLXX",
// keeping the same energy ranges for the transition between models).
// Notice that it is better to create the models here from scratch,
// instead of reusing the existing ones, because we might pick up the
// existing ones associated to the wrong particles...
// --- FTFP model ---
G4FTFModel* theStringModel = new G4FTFModel;
G4LundStringFragmentation* theLund = new G4LundStringFragmentation;
G4ExcitedStringDecay* theStringDecay = new G4ExcitedStringDecay(theLund);
theStringModel->SetFragmentationModel(theStringDecay);
G4GeneratorPrecompoundInterface* thePrecoInterface = new G4GeneratorPrecompoundInterface;
G4TheoFSGenerator* theHighEnergyModel = new G4TheoFSGenerator("FTFP");
theHighEnergyModel->SetHighEnergyGenerator(theStringModel);
theHighEnergyModel->SetTransport(thePrecoInterface);
theHighEnergyModel->SetMinEnergy(minFTFP);
theHighEnergyModel->SetMaxEnergy(maxFTFP);
// Bertini : create a new model to be used below INCLXX limit
G4CascadeInterface* theBertiniModel = new G4CascadeInterface();
theBertiniModel->SetMinEnergy(0.0);
theBertiniModel->SetMaxEnergy(maxBERT);
// --- Preco ---
// --- INCLXX model ---
// The instance for nucleons:
G4INCLXXInterface* theInclxxModel = new G4INCLXXInterface();
theInclxxModel->SetMinEnergy(minINCLXX);
theInclxxModel->SetMaxEnergy(maxINCLXX); // Use the same as for FTFP_BERT
// Register the models
fProtonInelasticProcess->RegisterMe(theHighEnergyModel);
fProtonInelasticProcess->RegisterMe(theInclxxModel);
fProtonInelasticProcess->RegisterMe(theBertiniModel);
fNeutronInelasticProcess->RegisterMe(theHighEnergyModel);
fNeutronInelasticProcess->RegisterMe(theInclxxModel);
fNeutronInelasticProcess->RegisterMe(theBertiniModel);
fPionPlusInelasticProcess->RegisterMe(theHighEnergyModel);
fPionPlusInelasticProcess->RegisterMe(theInclxxModel);
fPionPlusInelasticProcess->RegisterMe(theBertiniModel);
fPionMinusInelasticProcess->RegisterMe(theHighEnergyModel);
fPionMinusInelasticProcess->RegisterMe(theInclxxModel);
fPionMinusInelasticProcess->RegisterMe(theBertiniModel);
G4VCrossSectionDataSet* theProtonXSdata = new G4BGGNucleonInelasticXS(G4Proton::Definition());
theProtonXSdata->BuildPhysicsTable(*(G4Proton::Definition()));
fProtonInelasticProcess->AddDataSet(theProtonXSdata);
G4VCrossSectionDataSet* theNeutronXSdata = new G4NeutronInelasticXS;
theNeutronXSdata->BuildPhysicsTable(*(G4Neutron::Definition()));
fNeutronInelasticProcess->AddDataSet(theNeutronXSdata);
G4VCrossSectionDataSet* thePionPlusXSdata = new G4BGGPionInelasticXS(G4PionPlus::Definition());
thePionPlusXSdata->BuildPhysicsTable(*(G4PionPlus::Definition()));
fPionPlusInelasticProcess->AddDataSet(thePionPlusXSdata);
G4VCrossSectionDataSet* thePionMinusXSdata = new G4BGGPionInelasticXS(G4PionMinus::Definition());
thePionMinusXSdata->BuildPhysicsTable(*(G4PionMinus::Definition()));
fPionMinusInelasticProcess->AddDataSet(thePionMinusXSdata);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
BiasingOperation::~BiasingOperation() {}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4VParticleChange* BiasingOperation::ApplyFinalStateBiasing(const G4BiasingProcessInterface*,
const G4Track* track,
const G4Step* step, G4bool&)
{
if (track->GetParticleDefinition() == G4Proton::Definition()) {
auto particle = track->GetDynamicParticle();
auto material = track->GetMaterial();
fProtonInelasticProcess->GetCrossSectionDataStore()->ComputeCrossSection(particle, material);
return fProtonInelasticProcess->PostStepDoIt(*track, *step);
}
else if (track->GetParticleDefinition() == G4Neutron::Definition()) {
auto particle = track->GetDynamicParticle();
auto material = track->GetMaterial();
fNeutronInelasticProcess->GetCrossSectionDataStore()->ComputeCrossSection(particle, material);
return fNeutronInelasticProcess->PostStepDoIt(*track, *step);
}
else if (track->GetParticleDefinition() == G4PionPlus::Definition()) {
auto particle = track->GetDynamicParticle();
auto material = track->GetMaterial();
fPionPlusInelasticProcess->GetCrossSectionDataStore()->ComputeCrossSection(particle, material);
return fPionPlusInelasticProcess->PostStepDoIt(*track, *step);
}
else if (track->GetParticleDefinition() == G4PionMinus::Definition()) {
auto particle = track->GetDynamicParticle();
auto material = track->GetMaterial();
fPionMinusInelasticProcess->GetCrossSectionDataStore()->ComputeCrossSection(particle, material);
return fPionMinusInelasticProcess->PostStepDoIt(*track, *step);
}
else {
G4cerr << "ERROR in BiasingOperation::ApplyFinalStateBiasing : unexpected particle = "
<< track->GetParticleDefinition()->GetParticleName() << G4endl;
return 0;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......