Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4ProductionCutsTable.hh
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 //
27 // $Id$
28 //
29 //
30 // ------------------------------------------------------------
31 // GEANT 4 class header file
32 //
33 // Class Description
34 // G4ProductionCutsTable is a static singleton class of a table of
35 // G4ProductionCuts objects. This class also manages tables of
36 // production cut and energy cut for each particle type.
37 //
38 // ------------------------------------------------------------
39 // First Implementation 05 Oct. 2002 M.Asai
40 //
41 // Modified 03 Feb 2004 H.Kurashige
42 // Modify RetrieveCutsTable to allow ordering of materials and
43 // couples can be different from one in file (i.e. at storing)
44 // Modified 20 Aug. 2004 H.Kurashige
45 // Modify RetrieveCutsTable to allow materials and
46 // couples can be different from one in file (i.e. at storing)
47 // Modified 2 Mar. 2008 H.Kurashige
48 // add messenger
49 // ------------------------------------------------------------
50 
51 #ifndef G4ProductionCutsTable_h
52 #define G4ProductionCutsTable_h 1
53 
54 class G4RegionStore;
56 class G4LogicalVolume;
57 class G4VPhysicalVolume;
58 class G4ProductionCuts;
59 
61 
62 #include "globals.hh"
63 #include <cmath>
64 #include "G4ios.hh"
65 #include <vector>
66 #include "G4MaterialCutsCouple.hh"
68 #include "G4Region.hh"
69 
70 
72 {
73  public: // with description
75  // This static method returns the singleton pointer of this class object.
76  // At the first invokation of this method, the singleton object is instantiated.
77 
78  protected:
80  private:
82 
83  public:
84  virtual ~G4ProductionCutsTable();
85 
86  public: // with description
87  void UpdateCoupleTable(G4VPhysicalVolume* currentWorld);
88  // This method triggers an update of the table of G4ProductionCuts objects.
89 
90  void SetEnergyRange(G4double lowedge, G4double highedge);
91  // This method sets the limits of energy cuts for all particles.
92 
93  G4double GetLowEdgeEnergy() const;
95  // These methods get the limits of energy cuts for all particles.
96 
97  // get/set max cut energy of RangeToEnergy Converter for all particle type
100 
101 
102  void DumpCouples() const;
103  // Display a list of registored couples
104 
106  // gives the pointer to the MCCIndexConversionTable
107 
108  private:
109 
110  static G4ProductionCutsTable* fG4ProductionCutsTable;
111 
112  typedef std::vector<G4MaterialCutsCouple*> G4CoupleTable;
113  typedef std::vector<G4MaterialCutsCouple*>::const_iterator CoupleTableIterator;
114  typedef std::vector<G4double> G4CutVectorForAParticle;
115  typedef std::vector<G4CutVectorForAParticle*> G4CutTable;
116  G4CoupleTable coupleTable;
117  G4CutTable rangeCutTable;
118  G4CutTable energyCutTable;
119 
120  G4RegionStore* fG4RegionStore;
122 
123  G4ProductionCuts* defaultProductionCuts;
124 
125  G4MCCIndexConversionTable mccConversionTable;
126 
127 // These two vectors are for the backward comparibility
128  G4double* rangeDoubleVector[NumberOfG4CutIndex];
129  G4double* energyDoubleVector[NumberOfG4CutIndex];
130 
131  public:
132  const std::vector<G4double>* GetRangeCutsVector(size_t pcIdx) const;
133  const std::vector<G4double>* GetEnergyCutsVector(size_t pcIdx) const;
134 
135 // These two vectors are for the backward comparibility
136  G4double* GetRangeCutsDoubleVector(size_t pcIdx) const;
137  G4double* GetEnergyCutsDoubleVector(size_t pcIdx) const;
138 
139  public: // with description
140  size_t GetTableSize() const;
141  // This method returns the size of the couple table.
142 
144  // This method returns the pointer to the couple.
145 
146  const G4MaterialCutsCouple*
147  GetMaterialCutsCouple(const G4Material* aMat,
148  const G4ProductionCuts* aCut) const;
149  // This method returns the pointer to the couple.
150 
151  G4int GetCoupleIndex(const G4MaterialCutsCouple* aCouple) const;
152  G4int GetCoupleIndex(const G4Material* aMat,
153  const G4ProductionCuts* aCut) const;
154  // These methods return the index of the couple.
155  // -1 is returned if index is not found.
156 
157  G4bool IsModified() const;
158  // This method returns TRUE if at least one production cut value is modified.
159 
160  void PhysicsTableUpdated();
161  // This method resets the status of IsModified(). This method must
162  // be exclusively used by RunManager when physics tables are built.
163 
165  // This method returns the default production cuts.
166 
168  const G4Material* material,
169  G4double range );
170  // This method gives energy corresponding to range value
171  //
172  // -1 is returned if particle or material is not found.
173 
174  void ResetConverters();
175  // reset all Range To Energy Converters
176 
177  private:
178  void ScanAndSetCouple(G4LogicalVolume* aLV,
179  G4MaterialCutsCouple* aCouple,
180  G4Region* aRegion);
181 
182  bool IsCoupleUsedInTheRegion(const G4MaterialCutsCouple* aCouple,
183  const G4Region* aRegion) const;
184 
185  public: // with description
186  // Store cuts and material information in files under the specified directory.
187  G4bool StoreCutsTable(const G4String& directory,
188  G4bool ascii = false);
189 
190  // Retrieve material cut couple information
191  // in files under the specified directory.
192  G4bool RetrieveCutsTable(const G4String& directory,
193  G4bool ascii = false);
194 
195  // check stored material and cut values are consistent with the current detector setup.
196  G4bool CheckForRetrieveCutsTable(const G4String& directory,
197  G4bool ascii = false);
198 
199  protected:
200 
201  // Store material information in files under the specified directory.
202  virtual G4bool StoreMaterialInfo(const G4String& directory,
203  G4bool ascii = false);
204 
205  // check stored material is consistent with the current detector setup.
206  virtual G4bool CheckMaterialInfo(const G4String& directory,
207  G4bool ascii = false);
208 
209  // Store materialCutsCouple information in files under the specified directory.
210  virtual G4bool StoreMaterialCutsCoupleInfo(const G4String& directory,
211  G4bool ascii = false);
212 
213  // check stored materialCutsCouple is consistent with the current detector setup.
214  virtual G4bool CheckMaterialCutsCoupleInfo(const G4String& directory,
215  G4bool ascii = false);
216 
217  // Store cut values information in files under the specified directory.
218  virtual G4bool StoreCutsInfo(const G4String& directory,
219  G4bool ascii = false);
220 
221  // Retrieve cut values information in files under the specified directory.
222  virtual G4bool RetrieveCutsInfo(const G4String& directory,
223  G4bool ascii = false);
224 
225  private:
226  G4bool firstUse;
227  enum { FixedStringLengthForStore = 32 };
228 
229  public: // with description
230  void SetVerboseLevel(G4int value);
231  G4int GetVerboseLevel() const;
232  // controle flag for output message
233  // 0: Silent
234  // 1: Warning message
235  // 2: More
236 
237  private:
238  G4int verboseLevel;
239  G4ProductionCutsTableMessenger* fMessenger;
240 
241 };
242 
243 inline
244  const std::vector<G4double>* G4ProductionCutsTable::GetRangeCutsVector(size_t pcIdx) const
245 {
246  return rangeCutTable[pcIdx];
247 }
248 
249 inline
250  const std::vector<G4double>* G4ProductionCutsTable::GetEnergyCutsVector(size_t pcIdx) const
251 {
252  return energyCutTable[pcIdx];
253 }
254 
255 inline
257 {
258  return coupleTable.size();
259 }
260 
261 inline
263 {
264  return coupleTable[size_t(i)];
265 }
266 
267 inline
269 {
270  if(firstUse) return true;
271  for(G4ProductionCutsTable::CoupleTableIterator itr=coupleTable.begin();
272  itr!=coupleTable.end();itr++){
273  if((*itr)->IsRecalcNeeded())
274  {
275  return true;
276  }
277  }
278  return false;
279 }
280 
281 inline
283 {
284  for(G4ProductionCutsTable::CoupleTableIterator itr=coupleTable.begin();itr!=coupleTable.end();itr++){
285  (*itr)->PhysicsTableUpdated();
286  }
287 }
288 
289 inline
291 { return rangeDoubleVector[pcIdx]; }
292 
293 inline
295 { return energyDoubleVector[pcIdx]; }
296 
297 inline
299 { return defaultProductionCuts; }
300 
301 inline
302 bool G4ProductionCutsTable::IsCoupleUsedInTheRegion(
303  const G4MaterialCutsCouple* aCouple,
304  const G4Region* aRegion) const
305 {
306  G4ProductionCuts* fProductionCut = aRegion->GetProductionCuts();
307  std::vector<G4Material*>::const_iterator mItr = aRegion->GetMaterialIterator();
308  size_t nMaterial = aRegion->GetNumberOfMaterials();
309  for(size_t iMate=0;iMate<nMaterial;iMate++, mItr++){
310  if(aCouple->GetMaterial()==(*mItr) &&
311  aCouple->GetProductionCuts()==fProductionCut){
312  return true;
313  }
314  }
315  return false;
316 }
317 
318 inline
319 const G4MaterialCutsCouple*
321  const G4ProductionCuts* aCut) const
322 {
323  for(CoupleTableIterator cItr=coupleTable.begin();cItr!=coupleTable.end();cItr++)
324  {
325  if((*cItr)->GetMaterial()!=aMat) continue;
326  if((*cItr)->GetProductionCuts()==aCut) return (*cItr);
327  }
328  return 0;
329 }
330 
331 inline
333 {
334  G4int idx = 0;
335  for(CoupleTableIterator cItr=coupleTable.begin();cItr!=coupleTable.end();cItr++)
336  {
337  if((*cItr)==aCouple) return idx;
338  idx++;
339  }
340  return -1;
341 }
342 
343 inline
345  const G4ProductionCuts* aCut) const
346 {
347  const G4MaterialCutsCouple* aCouple = GetMaterialCutsCouple(aMat,aCut);
348  return GetCoupleIndex(aCouple);
349 }
350 
351 inline
353 {
354  return verboseLevel;
355 }
356 
357 inline
360 {
361  return &mccConversionTable;
362 }
363 
364 #endif
365 
366 
367 
368 
369 
370