Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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// $Id$
27//
28//
29// ------------------------------------------------------------
30// GEANT 4 class header file
31//
32// Class Description
33// G4PhysicsTableHelper is a static utility class
34// for helping proceeses to build their physics table
35//
36// ------------------------------------------------------------
37// First Implementation 20 Aug. 2004 H.Kurashige
38//
39// ------------------------------------------------------------
40
43
45
47{
48}
49
51{
52}
53
55{
56}
57
59{
60 return *this;
61}
62
63
65{
67 size_t numberOfMCC = cutTable->GetTableSize();
68
69 if ( physTable !=0) {
70 // compare size of physics table and number of material-cuts-couple
71 if ( physTable->size() < numberOfMCC) {
72 // enlarge physcis table
73 physTable->resize(numberOfMCC, (G4PhysicsVector*)(0));
74#ifdef G4VERBOSE
75 if (verboseLevel>2) {
76 G4cerr << "G4PhysicsTableHelper::PreparePhysicsTable ";
77 G4cerr << "Physics Table "<< physTable ;
78 G4cerr << " is resized to " << numberOfMCC << G4endl;
79 }
80#endif
81 } else if ( physTable->size() > numberOfMCC){
82 // ERROR: this situation should not occur
83 // size of physics table is shorter than number of material-cuts-couple
84 physTable->resize(numberOfMCC);
85#ifdef G4VERBOSE
86 if (verboseLevel>0) {
87 G4cerr << "G4PhysicsTableHelper::PreparePhysicsTable ";
88 G4cerr << "Physics Table "<< physTable ;
89 G4cerr << " is longer than number of material-cuts-couple " << G4endl;
90 }
91#endif
92 G4Exception( "G4PhysicsTableHelper::PreparePhysicsTable()",
93 "ProcCuts001", FatalException,
94 "Physics Table is inconsistent with material-cuts-couple");
95 }
96 } else {
97 // create PhysicsTable is given poitner is null
98 physTable = new G4PhysicsTable(numberOfMCC);
99 if (physTable!=0) {
100 physTable->resize(numberOfMCC, (G4PhysicsVector*)(0));
101 } else {
102 G4Exception( "G4PhysicsTableHelper::PreparePhysicsTable()",
103 "ProcCuts002", FatalException,
104 "Can't create Physics Table");
105 }
106 }
107
108#ifdef G4VERBOSE
109 if (verboseLevel>2) {
110 if ( physTable !=0) {
111 G4cerr << "Physics Table size "<< physTable->size();
112 } else {
113 G4cerr << "Physics Table does not exist ";
114 }
115 G4cerr << ": number of material-cuts-couple " << numberOfMCC << G4endl;
116 }
117#endif
118
119 // Reset recal-needed flag for all physics vectors
120 physTable->ResetFlagArray();
121
122 for (size_t idx = 0; idx <numberOfMCC; idx +=1){
123 const G4MaterialCutsCouple* mcc = cutTable->GetMaterialCutsCouple(idx);
124 //check if re-calculation of the physics vector is needed
125 // MCC is not used
126 if ( !mcc->IsUsed() ) physTable->ClearFlag(idx);
127
128 // RecalcNeeded flag of MCC is not asserted
129 if ( !mcc->IsRecalcNeeded() ) physTable->ClearFlag(idx);
130 }
131
132 return physTable;
133}
134
135
136
138 const G4String& fileName,
139 G4bool ascii )
140{
141 if (physTable == 0) return false;
142
143 // retrieve physics table from the given file
144 G4PhysicsTable* tempTable = new G4PhysicsTable();
145 if (! tempTable->RetrievePhysicsTable(fileName,ascii) ){
146#ifdef G4VERBOSE
147 if (verboseLevel>1) {
148 G4cerr << "G4PhysicsTableHelper::RetrievePhysicsTable ";
149 G4cerr << "Fail to retreive from "<< fileName << G4endl;
150 }
151#endif
152 G4Exception( "G4ProductionCutsTable::RetrievePhysicsTable()",
153 "ProcCuts105",
154 JustWarning, "Can not retrieve physics tables from file");
155 delete tempTable;
156 return false;
157 }
158
160 const G4MCCIndexConversionTable* converter = cutTable->GetMCCIndexConversionTable();
161
162 // check physics table size
163 if ( tempTable->size() != converter->size()){
164#ifdef G4VERBOSE
165 if (verboseLevel>0) {
166 G4cerr << "G4PhysicsTableHelper::RetrievePhysicsTable ";
167 G4cerr << "Size of the physics table in "<< fileName;
168 G4cerr << "( size =" << tempTable->size() << ")";
169 G4cerr << " is inconsistent with material-cut info";
170 G4cerr << "( size =" << converter->size() << ")";
171 G4cerr << G4endl;
172 }
173#endif
174 G4Exception( "G4ProductionCutsTable::RetrievePhysicsTable()",
175 "ProcCuts106",
176 JustWarning, "Retrived file is inconsistent with current physics tables ");
177 delete tempTable;
178 return false;
179 }
180
181 // fill the given physics table with retrived physics vectors
182 for (size_t idx=0; idx<converter->size(); idx++){
183 if (converter->IsUsed(idx)){
184 if (converter->GetIndex(idx)<0) continue;
185 size_t i = converter->GetIndex(idx);
186 G4PhysicsVector* vec = (*physTable)[i];
187 if (vec !=0 ) delete vec;
188 (*physTable)[i] = (*tempTable)[idx];
189 physTable->ClearFlag(i);
190 }
191 }
192 tempTable->clear();
193 delete tempTable;
194
195 return true;
196}
197
198
200 size_t idx,
201 G4PhysicsVector* vec)
202{
203 if ( physTable ==0) { return; }
204
205 if ( physTable->size() <= idx) {
206#ifdef G4VERBOSE
207 if (verboseLevel>0) {
208 G4cerr << "G4PhysicsTableHelper::SetPhysicsVector ";
209 G4cerr << "Given index (" << idx << ") exceeds ";
210 G4cerr << "size of the physics table ";
211 G4cerr << "( size =" << physTable->size()<< ")";
212 G4cerr << G4endl;
213 }
214#endif
215 G4Exception( "G4ProductionCutsTable::SetPhysicsVector()",
216 "ProcCuts107",
217 JustWarning, "Illegal index ");
218 return;
219 }
220
221 // set physics vector
222 (*physTable)[idx] = vec;
223 // clear flag
224 physTable->ClearFlag(idx);
225
226
227}
228
229
230
231
@ JustWarning
@ FatalException
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4int GetIndex(size_t index) const
G4bool IsUsed(size_t index) const
static void SetPhysicsVector(G4PhysicsTable *physTable, size_t idx, G4PhysicsVector *vec)
static G4PhysicsTable * PreparePhysicsTable(G4PhysicsTable *physTable)
G4PhysicsTableHelper & operator=(const G4PhysicsTableHelper &)
static G4bool RetrievePhysicsTable(G4PhysicsTable *physTable, const G4String &fileName, G4bool ascii)
void resize(size_t, G4PhysicsVector *vec=(G4PhysicsVector *)(0))
G4bool RetrievePhysicsTable(const G4String &filename, G4bool ascii=false)
void ClearFlag(size_t i)
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
const G4MCCIndexConversionTable * GetMCCIndexConversionTable() const
static G4ProductionCutsTable * GetProductionCutsTable()
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41