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
G4PhysicsTableHelper.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// G4PhysicsTableHelper class implementation
27//
28// Author: H.Kurashige, 20 August 2004 - First implementation
29// --------------------------------------------------------------------
30
34#include "G4Threading.hh"
35#include "G4ios.hh"
36
38
39// --------------------------------------------------------------------
41{
42}
43
44// --------------------------------------------------------------------
46{
47}
48
49// --------------------------------------------------------------------
52{
53 G4ProductionCutsTable* cutTable
55 std::size_t numberOfMCC = cutTable->GetTableSize();
56
57 if ( physTable != nullptr )
58 {
59 // compare size of physics table and number of material-cuts-couple
60 if ( physTable->size() < numberOfMCC )
61 {
62#ifdef G4VERBOSE
63 if (verboseLevel>2)
64 {
65 G4cout << "G4PhysicsTableHelper::PreparePhysicsTable: "
66 << " the table " << physTable << " size="
67 << physTable->size()
68 << " will be is resized to " << numberOfMCC << G4endl;
69 }
70#endif
71 // enlarge physics table
72 physTable->resize(numberOfMCC, nullptr);
73 }
74 else if ( physTable->size() > numberOfMCC )
75 {
76 // ERROR: this situation should not occur
77 // size of physics table is larger than number of material-cuts-couple
79 ed << "table " << physTable << " size=" << physTable->size()
80 << " is longer than number of material-cuts-couple " << numberOfMCC;
81 G4Exception( "G4PhysicsTableHelper::PreparePhysicsTable()",
82 "ProcCuts001", FatalException, ed);
83 }
84 }
85 else
86 {
87 // create PhysicsTable is given poitner is null
88 physTable = new G4PhysicsTable();
89 physTable->resize(numberOfMCC, nullptr);
90 }
91
92#ifdef G4VERBOSE
93 if (verboseLevel>2)
94 {
95 G4cout << "G4PhysicsTableHelper::PreparePhysicsTable: "
96 << " the table "<< physTable
97 << " size=" << numberOfMCC << G4endl;
98 }
99#endif
100
101 // Reset recal-needed flag for all physics vectors
102 physTable->ResetFlagArray();
103
104 for (std::size_t idx = 0; idx <numberOfMCC; ++idx)
105 {
106 const G4MaterialCutsCouple* mcc = cutTable->GetMaterialCutsCouple((G4int)idx);
107
108 // check if re-calculation of the physics vector is needed
109 // MCC is not used
110 if ( !mcc->IsUsed() ) physTable->ClearFlag(idx);
111
112 // RecalcNeeded flag of MCC is not asserted
113 if ( !mcc->IsRecalcNeeded() ) physTable->ClearFlag(idx);
114 }
115
116 return physTable;
117}
118
119// --------------------------------------------------------------------
121 const G4String& fileName,
122 G4bool ascii, G4bool spline)
123{
124 if (physTable == nullptr ) return false;
125
126 // retrieve physics table from the given file
127 G4PhysicsTable* tempTable = new G4PhysicsTable();
128 if (! tempTable->RetrievePhysicsTable(fileName,ascii,spline) )
129 {
131 ed << "Cannot retrieve physics table from the file <" << fileName << ">";
132 G4Exception( "G4ProductionCutsTable::RetrievePhysicsTable()",
133 "ProcCuts105", JustWarning, ed);
134 delete tempTable;
135 return false;
136 }
137
138 G4ProductionCutsTable* cutTable
140 const G4MCCIndexConversionTable* converter
141 = cutTable->GetMCCIndexConversionTable();
142
143 // check physics table size
144 if ( tempTable->size() != converter->size())
145 {
147 ed << "Physics table in " << fileName
148 << "\n size=" << tempTable->size() << " "
149 << " is inconsistent with material-cut-couple "
150 << "size=" << converter->size() << " the table is not retrieved!";
151 G4Exception("G4ProductionCutsTable::RetrievePhysicsTable()",
152 "ProcCuts106", JustWarning, ed);
153 delete tempTable;
154 return false;
155 }
156
157 // fill the given physics table with retrieved physics vectors
158 for (std::size_t idx=0; idx<converter->size(); ++idx)
159 {
160 if (converter->IsUsed(idx))
161 {
162 G4int i = converter->GetIndex(idx);
163 if(i < 0)
164 {
165 tempTable->clearAndDestroy();
166 delete tempTable;
167 return false;
168 }
169 G4PhysicsVector* vec = (*physTable)[i];
170 if (vec != nullptr ) delete vec;
171 (*physTable)[i] = (*tempTable)[idx];
172 physTable->ClearFlag(i);
173 }
174 }
175 tempTable->clear();
176 delete tempTable;
177
178 return true;
179}
180
181// --------------------------------------------------------------------
183 std::size_t idx,
184 G4PhysicsVector* vec)
185{
186 if ( physTable == nullptr) { return; }
187
188 if ( physTable->size() <= idx)
189 {
191 ed << "Given index (" << idx << ") exceeds "
192 << "the size of the physics table "
193 << "( size =" << physTable->size() << ") the vector is not added!";
194 G4Exception("G4ProductionCutsTable::SetPhysicsVector()",
195 "ProcCuts107",
196 JustWarning, ed);
197 return;
198 }
199
200 // set physics vector
201 (*physTable)[idx] = vec;
202 // clear flag
203 physTable->ClearFlag(idx);
204}
205
206// --------------------------------------------------------------------
208{
210}
211
212// --------------------------------------------------------------------
214{
215 return verboseLevel;
216}
@ JustWarning
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
G4bool IsUsed(std::size_t index) const
G4int GetIndex(std::size_t index) const
static G4PhysicsTable * PreparePhysicsTable(G4PhysicsTable *physTable)
static G4bool RetrievePhysicsTable(G4PhysicsTable *physTable, const G4String &fileName, G4bool ascii, G4bool spline)
static void SetVerboseLevel(G4int value)
static void SetPhysicsVector(G4PhysicsTable *physTable, std::size_t idx, G4PhysicsVector *vec)
void clearAndDestroy()
void resize(std::size_t, G4PhysicsVector *vec=nullptr)
G4bool RetrievePhysicsTable(const G4String &filename, G4bool ascii=false, G4bool spline=false)
void ClearFlag(std::size_t i)
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
std::size_t GetTableSize() const
const G4MCCIndexConversionTable * GetMCCIndexConversionTable() const
static G4ProductionCutsTable * GetProductionCutsTable()
G4bool IsWorkerThread()
Definition: G4Threading.cc:123