BDSIM
BDSIM is a Geant4 extension toolkit for simulation of particle transport in accelerator beamlines.
Loading...
Searching...
No Matches
BDSRegion.cc
1/*
2Beam Delivery Simulation (BDSIM) Copyright (C) BDSIM Collaboration, 2001 - 2026.
3
4This file is part of BDSIM.
5
6BDSIM is free software: you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published
8by the Free Software Foundation version 3 of the License.
9
10BDSIM is distributed in the hope that it will be useful, but
11WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with BDSIM. If not, see <http://www.gnu.org/licenses/>.
17*/
18#include "BDSGlobalConstants.hh"
19#include "BDSRegion.hh"
20#include "BDSUtilities.hh"
21
22#include "parser/region.h"
23
24#include "globals.hh"
25#include "G4ProductionCuts.hh"
26#include "G4Region.hh"
27
28#include <ostream>
29
30BDSRegion::BDSRegion(G4String nameIn):
31 name(nameIn),
32 g4cuts(nullptr),
33 g4region(nullptr)
34{
35 // these are the defaults according to BDSIM, but no necessarily the defaults
36 // according to the physics list used - ie if a Geant4 reference physics list
37 // is used with default
39 defaultRangeCut = g->DefaultRangeCut();
40 if (g->DefaultRangeCutsSet())
41 {
42 rangeCutElectrons = g->ProdCutElectronsSet() ? g->ProdCutElectrons() : defaultRangeCut;
43 rangeCutPositrons = g->ProdCutPositronsSet() ? g->ProdCutPositrons() : defaultRangeCut;
44 rangeCutProtons = g->ProdCutProtonsSet() ? g->ProdCutProtons() : defaultRangeCut;
45 rangeCutPhotons = g->ProdCutPhotonsSet() ? g->ProdCutPhotons() : defaultRangeCut;
46 }
47 else
48 {
49 rangeCutElectrons = g->ProdCutElectrons();
50 rangeCutPositrons = g->ProdCutPositrons();
51 rangeCutProtons = g->ProdCutProtons();
52 rangeCutPhotons = g->ProdCutPhotons();
53 }
54 ProduceG4Region();
55}
56
57BDSRegion::BDSRegion(G4String nameIn,
58 const BDSRegion* defaultValue,
59 G4double defaultRangeCutIn,
60 G4double rangeCutElectronsIn,
61 G4double rangeCutPositronsIn,
62 G4double rangeCutProtonsIn,
63 G4double rangeCutPhotonsIn):
64 name(nameIn),
65 g4cuts(nullptr),
66 g4region(nullptr)
67{
68 // if the G4dobule defaultRangeCutIn is supplied, then this takes precedence over
69 // using any values from const BDSRegion* defaultValue
70 G4bool useSuppliedDefaultNumber = BDS::IsFinite(defaultRangeCutIn);
71 defaultRangeCut = BDS::IsFinite(defaultRangeCutIn) ? defaultRangeCutIn : defaultValue->defaultRangeCut;
72 rangeCutElectrons = BDS::IsFinite(rangeCutElectronsIn) ? rangeCutElectronsIn : (useSuppliedDefaultNumber ? defaultRangeCutIn : defaultValue->rangeCutElectrons);
73 rangeCutPositrons = BDS::IsFinite(rangeCutPositronsIn) ? rangeCutPositronsIn : (useSuppliedDefaultNumber ? defaultRangeCutIn : defaultValue->rangeCutPositrons);
74 rangeCutProtons = BDS::IsFinite(rangeCutProtonsIn) ? rangeCutProtonsIn : (useSuppliedDefaultNumber ? defaultRangeCutIn : defaultValue->rangeCutProtons);
75 rangeCutPhotons = BDS::IsFinite(rangeCutPhotonsIn) ? rangeCutPhotonsIn : (useSuppliedDefaultNumber ? defaultRangeCutIn : defaultValue->rangeCutPhotons);
76 ProduceG4Region();
77}
78
79BDSRegion::BDSRegion(const GMAD::Region& parserRegion,
80 const BDSRegion* defaultRegion):
81 BDSRegion(G4String(parserRegion.name),
82 defaultRegion,
83 parserRegion.defaultRangeCut * CLHEP::m,
84 parserRegion.prodCutElectrons * CLHEP::m,
85 parserRegion.prodCutPositrons * CLHEP::m,
86 parserRegion.prodCutProtons * CLHEP::m,
87 parserRegion.prodCutPhotons * CLHEP::m)
88{;}
89
90BDSRegion::~BDSRegion()
91{
92 delete g4cuts;
93 delete g4region;
94}
95
96std::ostream& operator<< (std::ostream& out, BDSRegion const &r)
97{
98 out << "Region \"" << r.name << "\"" << G4endl;
99 out << "default range cut " << r.defaultRangeCut << " mm" << G4endl;
100 out << "e- range cut " << r.rangeCutElectrons << " mm" << G4endl;
101 out << "e+ range cut " << r.rangeCutPositrons << " mm" << G4endl;
102 out << "proton range cut " << r.rangeCutProtons << " mm" << G4endl;
103 out << "photon range cut " << r.rangeCutPhotons << " mm" << G4endl;
104 return out;
105}
106
108{
109 g4cuts = new G4ProductionCuts();
110 g4cuts->SetProductionCut(rangeCutElectrons, "e-");
111 g4cuts->SetProductionCut(rangeCutPositrons, "e+");
112 g4cuts->SetProductionCut(rangeCutProtons, "proton");
113 g4cuts->SetProductionCut(rangeCutPhotons, "gamma");
114
115 g4region = new G4Region(name);
116 g4region->SetProductionCuts(g4cuts);
117}
118
A class that holds global options and constants.
static BDSGlobalConstants * Instance()
Access method.
Range cuts for a region. Help with defaults.
Definition BDSRegion.hh:40
G4Region * g4region
Public members for simplicity.
Definition BDSRegion.hh:63
G4double rangeCutElectrons
Public members for simplicity.
Definition BDSRegion.hh:58
G4double defaultRangeCut
Public members for simplicity.
Definition BDSRegion.hh:57
G4ProductionCuts * g4cuts
Public members for simplicity.
Definition BDSRegion.hh:62
G4String name
Public members for simplicity.
Definition BDSRegion.hh:56
G4double rangeCutPhotons
Public members for simplicity.
Definition BDSRegion.hh:61
G4double rangeCutProtons
Public members for simplicity.
Definition BDSRegion.hh:60
G4double rangeCutPositrons
Public members for simplicity.
Definition BDSRegion.hh:59
void ProduceG4Region()
Function to create cuts and region.
Definition BDSRegion.cc:107
Region class for parser.
Definition region.h:35
G4bool IsFinite(G4double value, G4double tolerance=std::numeric_limits< double >::epsilon())