Files
geant4/source/processes/electromagnetic/utils/src/G4EmExtraParameters.cc
T
2023-06-19 17:17:14 +02:00

487 lines
14 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. *
// ********************************************************************
//
// -------------------------------------------------------------------
//
// GEANT4 Class file
//
//
// File name: G4EmExtraParameters
//
// Author: Vladimir Ivanchenko
//
// Creation date: 07.05.2019
//
// -------------------------------------------------------------------
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#include "G4EmExtraParameters.hh"
#include "G4ParticleDefinition.hh"
#include "G4PhysicalConstants.hh"
#include "G4UnitsTable.hh"
#include "G4SystemOfUnits.hh"
#include "G4VEmProcess.hh"
#include "G4VEnergyLossProcess.hh"
#include "G4EmExtraParametersMessenger.hh"
#include "G4RegionStore.hh"
#include "G4Region.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
G4EmExtraParameters::G4EmExtraParameters()
{
theMessenger = new G4EmExtraParametersMessenger(this);
Initialise();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
G4EmExtraParameters::~G4EmExtraParameters()
{
delete theMessenger;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
void G4EmExtraParameters::Initialise()
{
quantumEntanglement = false;
directionalSplitting = false;
directionalSplittingTarget.set(0.,0.,0.);
directionalSplittingRadius = 0.;
dRoverRange = 0.2;
finalRange = CLHEP::mm;
dRoverRangeMuHad = 0.2;
finalRangeMuHad = 0.1*CLHEP::mm;
dRoverRangeLIons = 0.2;
finalRangeLIons = 0.1*CLHEP::mm;
dRoverRangeIons = 0.2;
finalRangeIons = 0.1*CLHEP::mm;
m_regnamesForced.clear();
m_procForced.clear();
m_lengthForced.clear();
m_weightForced.clear();
m_regnamesSubCut.clear();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
void G4EmExtraParameters::PrintWarning(G4ExceptionDescription& ed) const
{
G4Exception("G4EmExtraParameters", "em0044", JustWarning, ed);
}
G4String G4EmExtraParameters::CheckRegion(const G4String& reg) const
{
G4String r = reg;
if(r == "" || r == "world" || r == "World") {
r = "DefaultRegionForTheWorld";
}
return r;
}
void G4EmExtraParameters::SetStepFunction(G4double v1, G4double v2)
{
if(v1 > 0.0 && v1 <= 1.0 && v2 > 0.0) {
dRoverRange = v1;
finalRange = v2;
} else {
G4ExceptionDescription ed;
ed << "Values of step function are out of range: "
<< v1 << ", " << v2/CLHEP::mm << " mm - are ignored";
PrintWarning(ed);
}
}
G4double G4EmExtraParameters::GetStepFunctionP1() const
{
return dRoverRange;
}
G4double G4EmExtraParameters::GetStepFunctionP2() const
{
return finalRange;
}
void G4EmExtraParameters::SetStepFunctionMuHad(G4double v1, G4double v2)
{
if(v1 > 0.0 && v1 <= 1.0 && v2 > 0.0) {
dRoverRangeMuHad = v1;
finalRangeMuHad = v2;
} else {
G4ExceptionDescription ed;
ed << "Values of step function are out of range: "
<< v1 << ", " << v2/CLHEP::mm << " mm - are ignored";
PrintWarning(ed);
}
}
G4double G4EmExtraParameters::GetStepFunctionMuHadP1() const
{
return dRoverRangeMuHad;
}
G4double G4EmExtraParameters::GetStepFunctionMuHadP2() const
{
return finalRangeMuHad;
}
void G4EmExtraParameters::SetStepFunctionLightIons(G4double v1, G4double v2)
{
if(v1 > 0.0 && v1 <= 1.0 && v2 > 0.0) {
dRoverRangeLIons = v1;
finalRangeLIons = v2;
} else {
G4ExceptionDescription ed;
ed << "Values of step function are out of range: "
<< v1 << ", " << v2/CLHEP::mm << " mm - are ignored";
PrintWarning(ed);
}
}
G4double G4EmExtraParameters::GetStepFunctionLightIonsP1() const
{
return dRoverRangeLIons;
}
G4double G4EmExtraParameters::GetStepFunctionLightIonsP2() const
{
return finalRangeLIons;
}
void G4EmExtraParameters::SetStepFunctionIons(G4double v1, G4double v2)
{
if(v1 > 0.0 && v1 <= 1.0 && v2 > 0.0) {
dRoverRangeIons = v1;
finalRangeIons = v2;
} else {
G4ExceptionDescription ed;
ed << "Values of step function are out of range: "
<< v1 << ", " << v2/CLHEP::mm << " mm - are ignored";
PrintWarning(ed);
}
}
G4double G4EmExtraParameters::GetStepFunctionIonsP1() const
{
return dRoverRangeIons;
}
G4double G4EmExtraParameters::GetStepFunctionIonsP2() const
{
return finalRangeIons;
}
void G4EmExtraParameters::FillStepFunction(const G4ParticleDefinition* part, G4VEnergyLossProcess* proc) const
{
// electron and positron
if (11 == std::abs(part->GetPDGEncoding())) {
proc->SetStepFunction(dRoverRange, finalRange);
// all heavy ions
} else if ("GenericIon" == part->GetParticleName()) {
proc->SetStepFunction(dRoverRangeIons, finalRangeIons);
// light nucleus and anti-nucleus
} else if (part->GetParticleType() == "nucleus" || part->GetParticleType() == "anti_nucleus") {
proc->SetStepFunction(dRoverRangeLIons, finalRangeLIons);
// other particles
} else {
proc->SetStepFunction(dRoverRangeMuHad, finalRangeMuHad);
}
}
void G4EmExtraParameters::AddPAIModel(const G4String& particle,
const G4String& region,
const G4String& type)
{
G4String r = CheckRegion(region);
std::size_t nreg = m_regnamesPAI.size();
// in previously defined region other particles may be already defined
// type should be overrided for the same region and particle
for(std::size_t i=0; i<nreg; ++i) {
if(m_regnamesPAI[i] == r) {
if (particle == "all") {
m_particlesPAI[i] = particle;
m_typesPAI[i] = type;
return;
} else if(m_particlesPAI[i] == particle || m_particlesPAI[i] == "all") {
m_typesPAI[i] = type;
return;
}
}
}
// new regions and/or particles
m_particlesPAI.push_back(particle);
m_regnamesPAI.push_back(r);
m_typesPAI.push_back(type);
}
const std::vector<G4String>& G4EmExtraParameters::ParticlesPAI() const
{
return m_particlesPAI;
}
const std::vector<G4String>& G4EmExtraParameters::RegionsPAI() const
{
return m_regnamesPAI;
}
const std::vector<G4String>& G4EmExtraParameters::TypesPAI() const
{
return m_typesPAI;
}
void G4EmExtraParameters::AddPhysics(const G4String& region,
const G4String& type)
{
G4String r = CheckRegion(region);
std::size_t nreg = m_regnamesPhys.size();
for(std::size_t i=0; i<nreg; ++i) {
if(r == m_regnamesPhys[i]) { return; }
}
m_regnamesPhys.push_back(r);
m_typesPhys.push_back(type);
}
const std::vector<G4String>& G4EmExtraParameters::RegionsPhysics() const
{
return m_regnamesPhys;
}
const std::vector<G4String>& G4EmExtraParameters::TypesPhysics() const
{
return m_typesPhys;
}
void G4EmExtraParameters::SetSubCutRegion(const G4String& region)
{
const G4String& r = CheckRegion(region);
std::size_t nreg = m_regnamesSubCut.size();
for(std::size_t i=0; i<nreg; ++i) {
if(r == m_regnamesSubCut[i]) {
return;
}
}
m_regnamesSubCut.push_back(r);
}
void
G4EmExtraParameters::SetProcessBiasingFactor(const G4String& procname,
G4double val, G4bool wflag)
{
if(val > 0.0) {
std::size_t n = m_procBiasedXS.size();
for(std::size_t i=0; i<n; ++i) {
if(procname == m_procBiasedXS[i]) {
m_factBiasedXS[i] = val;
m_weightBiasedXS[i]= wflag;
return;
}
}
m_procBiasedXS.push_back(procname);
m_factBiasedXS.push_back(val);
m_weightBiasedXS.push_back(wflag);
} else {
G4ExceptionDescription ed;
ed << "Process: " << procname << " XS biasing factor "
<< val << " is negative - ignored";
PrintWarning(ed);
}
}
void
G4EmExtraParameters::ActivateForcedInteraction(const G4String& procname,
const G4String& region,
G4double length,
G4bool wflag)
{
const G4String& r = CheckRegion(region);
if(length >= 0.0) {
std::size_t n = m_procForced.size();
for(std::size_t i=0; i<n; ++i) {
if(procname == m_procForced[i] && r == m_regnamesForced[i] ) {
m_lengthForced[i] = length;
m_weightForced[i] = wflag;
return;
}
}
m_regnamesForced.push_back(r);
m_procForced.push_back(procname);
m_lengthForced.push_back(length);
m_weightForced.push_back(wflag);
} else {
G4ExceptionDescription ed;
ed << "Process: " << procname << " in region " << r
<< " : forced interacttion length= "
<< length << " is negative - ignored";
PrintWarning(ed);
}
}
void
G4EmExtraParameters::ActivateSecondaryBiasing(const G4String& procname,
const G4String& region,
G4double factor,
G4double energyLim)
{
const G4String& r = CheckRegion(region);
if(factor >= 0.0 && energyLim >= 0.0) {
std::size_t n = m_procBiasedSec.size();
for(std::size_t i=0; i<n; ++i) {
if(procname == m_procBiasedSec[i] && r == m_regnamesBiasedSec[i] ) {
m_factBiasedSec[i] = factor;
m_elimBiasedSec[i] = energyLim;
return;
}
}
m_regnamesBiasedSec.push_back(r);
m_procBiasedSec.push_back(procname);
m_factBiasedSec.push_back(factor);
m_elimBiasedSec.push_back(energyLim);
} else {
G4ExceptionDescription ed;
ed << "Process: " << procname << " in region " << r
<< " : secondary bised factor= "
<< factor << ", Elim= " << energyLim << " - ignored";
PrintWarning(ed);
}
}
void G4EmExtraParameters::DefineRegParamForLoss(G4VEnergyLossProcess* ptr) const
{
const G4RegionStore* regionStore = G4RegionStore::GetInstance();
std::size_t n = m_regnamesSubCut.size();
for(std::size_t i=0; i<n; ++i) {
const G4Region* reg = regionStore->GetRegion(m_regnamesSubCut[i], false);
if(nullptr != reg) { ptr->ActivateSubCutoff(reg); }
}
n = m_procBiasedXS.size();
for(std::size_t i=0; i<n; ++i) {
if(ptr->GetProcessName() == m_procBiasedXS[i]) {
ptr->SetCrossSectionBiasingFactor(m_factBiasedXS[i],
m_weightBiasedXS[i]);
break;
}
}
n = m_procForced.size();
for(std::size_t i=0; i<n; ++i) {
if(ptr->GetProcessName() == m_procForced[i]) {
ptr->ActivateForcedInteraction(m_lengthForced[i],
m_regnamesForced[i],
m_weightForced[i]);
break;
}
}
n = m_procBiasedSec.size();
for(std::size_t i=0; i<n; ++i) {
if(ptr->GetProcessName() == m_procBiasedSec[i]) {
ptr->ActivateSecondaryBiasing(m_regnamesBiasedSec[i],
m_factBiasedSec[i],
m_elimBiasedSec[i]);
break;
}
}
}
void G4EmExtraParameters::DefineRegParamForEM(G4VEmProcess* ptr) const
{
std::size_t n = m_procBiasedXS.size();
for(std::size_t i=0; i<n; ++i) {
if(ptr->GetProcessName() == m_procBiasedXS[i]) {
ptr->SetCrossSectionBiasingFactor(m_factBiasedXS[i],
m_weightBiasedXS[i]);
break;
}
}
n = m_procForced.size();
for(std::size_t i=0; i<n; ++i) {
if(ptr->GetProcessName() == m_procForced[i]) {
ptr->ActivateForcedInteraction(m_lengthForced[i],
m_regnamesForced[i],
m_weightForced[i]);
break;
}
}
n = m_procBiasedSec.size();
for(std::size_t i=0; i<n; ++i) {
if(ptr->GetProcessName() == m_procBiasedSec[i]) {
ptr->ActivateSecondaryBiasing(m_regnamesBiasedSec[i],
m_factBiasedSec[i],
m_elimBiasedSec[i]);
break;
}
}
}
G4bool G4EmExtraParameters::QuantumEntanglement()
{
return quantumEntanglement;
}
void G4EmExtraParameters::SetQuantumEntanglement(G4bool v)
{
quantumEntanglement = v;
}
G4bool G4EmExtraParameters::GetDirectionalSplitting() {
return directionalSplitting;
}
void G4EmExtraParameters::SetDirectionalSplitting(G4bool v)
{
directionalSplitting = v;
}
void
G4EmExtraParameters::SetDirectionalSplittingTarget(const G4ThreeVector& v)
{
directionalSplittingTarget = v;
}
G4ThreeVector G4EmExtraParameters::GetDirectionalSplittingTarget() const
{
return directionalSplittingTarget;
}
void G4EmExtraParameters::SetDirectionalSplittingRadius(G4double r)
{
directionalSplittingRadius = r;
}
G4double G4EmExtraParameters::GetDirectionalSplittingRadius()
{
return directionalSplittingRadius;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....