Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/materials/src/G4MaterialPropertiesTable.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /materials/src/G4MaterialPropertiesTable.cc (Version 11.3.0) and /materials/src/G4MaterialPropertiesTable.cc (Version 1.1)


                                                   >>   1 // This code implementation is the intellectual property of
                                                   >>   2 // the GEANT4 collaboration.
  1 //                                                  3 //
  2 // ******************************************* <<   4 // By copying, distributing or modifying the Program (or any work
  3 // * License and Disclaimer                    <<   5 // based on the Program) you indicate your acceptance of this statement,
  4 // *                                           <<   6 // and all its terms.
  5 // * The  Geant4 software  is  copyright of th <<   7 //
  6 // * the Geant4 Collaboration.  It is provided <<   8 // $Id: G4MaterialPropertiesTable.cc,v 1.5.2.1.4.1 1999/12/08 17:34:06 gunter Exp $
  7 // * conditions of the Geant4 Software License <<   9 // GEANT4 tag $Name: geant4-01-01 $
  8 // * LICENSE and available at  http://cern.ch/ <<  10 //
  9 // * include a list of copyright holders.      <<  11 // 
 10 // *                                           << 
 11 // * Neither the authors of this software syst << 
 12 // * institutes,nor the agencies providing fin << 
 13 // * work  make  any representation or  warran << 
 14 // * regarding  this  software system or assum << 
 15 // * use.  Please see the license in the file  << 
 16 // * for the full disclaimer and the limitatio << 
 17 // *                                           << 
 18 // * This  code  implementation is the result  << 
 19 // * technical work of the GEANT4 collaboratio << 
 20 // * By using,  copying,  modifying or  distri << 
 21 // * any work based  on the software)  you  ag << 
 22 // * use  in  resulting  scientific  publicati << 
 23 // * acceptance of all terms of the Geant4 Sof << 
 24 // ******************************************* << 
 25                                                << 
 26 //////////////////////////////////////////////     12 ////////////////////////////////////////////////////////////////////////
 27 // G4MaterialPropertiesTable Implementation        13 // G4MaterialPropertiesTable Implementation
 28 //////////////////////////////////////////////     14 ////////////////////////////////////////////////////////////////////////
 29 //                                                 15 //
 30 // File: G4MaterialPropertiesTable.cc          <<  16 // File: G4MaterialPropertiesTable.cc 
 31 // Version:     1.0                                17 // Version:     1.0
 32 // Created:     1996-02-08                         18 // Created:     1996-02-08
 33 // Author:      Juliet Armstrong                   19 // Author:      Juliet Armstrong
 34 // Updated:     2005-05-12 add SetGROUPVEL(),  <<  20 // Updated:     1999-11-05 Migration from G4RWTPtrHashDictionary to STL
 35 //              Horton-Smith (bug report #741) << 
 36 //              2002-11-05 add named material  << 
 37 //              1999-11-05 Migration from G4RW << 
 38 //                         by John Allison         21 //                         by John Allison
 39 //              1997-03-26 by Peter Gumplinger     22 //              1997-03-26 by Peter Gumplinger
 40 //              > cosmetics (only)                 23 //              > cosmetics (only)
                                                   >>  24 // mail:        gum@triumf.ca
 41 //                                                 25 //
 42 //////////////////////////////////////////////     26 ////////////////////////////////////////////////////////////////////////
 43                                                    27 
 44 #include "G4MaterialPropertiesTable.hh"        << 
 45                                                << 
 46 #include "G4Log.hh"                            << 
 47 #include "G4OpticalMaterialProperties.hh"      << 
 48 #include "G4PhysicalConstants.hh"              << 
 49 #include "globals.hh"                              28 #include "globals.hh"
                                                   >>  29 #include "G4MaterialPropertiesTable.hh"
 50                                                    30 
 51 #include <algorithm>                           <<  31         //////////////
 52 #include <cassert>                             <<  32         // Operators
 53                                                <<  33         //////////////
 54 #ifdef G4MULTITHREADED                         <<  34 
 55 #  include "G4AutoLock.hh"                     <<  35 /**************
 56 namespace                                      <<  36 G4MaterialPropertiesTable&
 57 {                                              <<  37 G4MaterialPropertiesTable::operator =(const G4MaterialPropertiesTable& right)
 58 G4Mutex materialPropertyTableMutex = G4MUTEX_I <<  38 {
 59 }                                              <<  39         if (this == &right) return *this;
 60 #endif                                         <<  40   
 61                                                <<  41   // clear any current contents of MPT
 62 G4MaterialPropertiesTable::G4MaterialPropertie <<  42 
 63 {                                              <<  43         MPT.clearAndDestroy();
 64   // elements of these 2 vectors must be in sa <<  44 
 65   // the corresponding enums in G4MaterialProp <<  45         // want to make an actual copy -- not a shallow copy which is
 66   fMatPropNames.assign(kNumberOfPropertyIndex, <<  46   // the default for RWTPrtHashDictionary's assignment operator
 67   fMatPropNames[kRINDEX] =                     <<  47  
 68   fMatPropNames[kREFLECTIVITY] =               <<  48         G4RWTPtrHashDictionary<G4String, G4MaterialPropertyVector> 
 69   fMatPropNames[kREALRINDEX] =                 <<  49             rightMPT(right.MPT);
 70   fMatPropNames[kIMAGINARYRINDEX] =            <<  50         G4RWTPtrHashDictionaryIterator<G4String, G4MaterialPropertyVector> 
 71   fMatPropNames[kEFFICIENCY] =                 <<  51             rightIterator(rightMPT); 
 72   fMatPropNames[kTRANSMITTANCE] =              <<  52         rightIterator.reset();
 73   fMatPropNames[kSPECULARLOBECONSTANT] =       <<  53         while (++rightIterator) {
 74   fMatPropNames[kSPECULARSPIKECONSTANT] =      <<  54     G4MaterialPropertyVector *newProp =
 75   fMatPropNames[kBACKSCATTERCONSTANT] =        <<  55                         new G4MaterialPropertyVector(*(rightIterator.value()));
 76   fMatPropNames[kGROUPVEL] =                   <<  56                 G4String *newKey =
 77   fMatPropNames[kMIEHG] =                      <<  57                         new G4String(*(rightIterator.key()));
 78   fMatPropNames[kRAYLEIGH] =                   <<  58                 MPT.insertKeyAndValue(newKey, newProp);
 79   fMatPropNames[kWLSCOMPONENT] =               <<  59         }
 80   fMatPropNames[kWLSABSLENGTH] =               <<  60         return *this;
 81   fMatPropNames[kWLSCOMPONENT2] =              <<  61 }
 82   fMatPropNames[kWLSABSLENGTH2] =              <<  62 **********/
 83   fMatPropNames[kABSLENGTH] =                  <<  63 
 84   fMatPropNames[kPROTONSCINTILLATIONYIELD] =   <<  64         /////////////////
 85   fMatPropNames[kDEUTERONSCINTILLATIONYIELD] = <<  65         // Constructors
 86   fMatPropNames[kTRITONSCINTILLATIONYIELD] =   <<  66         /////////////////
 87   fMatPropNames[kALPHASCINTILLATIONYIELD] =    <<  67 
 88   fMatPropNames[kIONSCINTILLATIONYIELD] =      <<  68 G4MaterialPropertiesTable::G4MaterialPropertiesTable() {}
 89   fMatPropNames[kELECTRONSCINTILLATIONYIELD] = <<  69 
 90   fMatPropNames[kSCINTILLATIONCOMPONENT1] =    <<  70 /*********
 91   fMatPropNames[kSCINTILLATIONCOMPONENT2] =    <<  71 G4MaterialPropertiesTable::G4MaterialPropertiesTable
 92   fMatPropNames[kSCINTILLATIONCOMPONENT3] =    <<  72          (const G4MaterialPropertiesTable &right) : 
 93   fMatPropNames[kCOATEDRINDEX] =               <<  73          MPT(hashString), MPTiterator(MPT)
 94                                                <<  74 {
 95   fMP.assign(kNumberOfPropertyIndex, nullptr); <<  75         // want to make an actual copy -- not a shallow copy which is
 96                                                <<  76   // the default for RWTPrtHashDictionary's assignment operator
 97   fMatConstPropNames.assign(kNumberOfConstProp <<  77 
 98   fMatConstPropNames[kSURFACEROUGHNESS] =      <<  78         G4RWTPtrHashDictionary<G4String, G4MaterialPropertyVector> 
 99   fMatConstPropNames[kISOTHERMAL_COMPRESSIBILI <<  79             rightMPT(right.MPT);
100   fMatConstPropNames[kRS_SCALE_FACTOR] =       <<  80         G4RWTPtrHashDictionaryIterator<G4String, G4MaterialPropertyVector> 
101   fMatConstPropNames[kWLSMEANNUMBERPHOTONS] =  <<  81             rightIterator(rightMPT); 
102   fMatConstPropNames[kWLSTIMECONSTANT] =       <<  82 
103   fMatConstPropNames[kWLSMEANNUMBERPHOTONS2] = <<  83         rightIterator.reset();
104   fMatConstPropNames[kWLSTIMECONSTANT2] =      <<  84 
105   fMatConstPropNames[kMIEHG_FORWARD] =         <<  85         while (++rightIterator) {
106   fMatConstPropNames[kMIEHG_BACKWARD] =        <<  86     G4MaterialPropertyVector *newProp =
107   fMatConstPropNames[kMIEHG_FORWARD_RATIO] =   <<  87                         new G4MaterialPropertyVector(*(rightIterator.value()));
108   fMatConstPropNames[kSCINTILLATIONYIELD] =    <<  88                 G4String *newKey =
109   fMatConstPropNames[kRESOLUTIONSCALE] =       <<  89                         new G4String(*(rightIterator.key()));
110   fMatConstPropNames[kFERMIPOT] =              <<  90                 MPT.insertKeyAndValue(newKey, newProp);
111   fMatConstPropNames[kDIFFUSION] =             <<  91         }
112   fMatConstPropNames[kSPINFLIP] =              <<  92 }
113   fMatConstPropNames[kLOSS] =                  <<  93 *******/
114   fMatConstPropNames[kLOSSCS] =                <<  94 
115   fMatConstPropNames[kABSCS] =                 <<  95         ////////////////
116   fMatConstPropNames[kSCATCS] =                <<  96         // Destructors
117   fMatConstPropNames[kMR_NBTHETA] =            <<  97         ////////////////
118   fMatConstPropNames[kMR_NBE] =                << 
119   fMatConstPropNames[kMR_RRMS] =               << 
120   fMatConstPropNames[kMR_CORRLEN] =            << 
121   fMatConstPropNames[kMR_THETAMIN] =           << 
122   fMatConstPropNames[kMR_THETAMAX] =           << 
123   fMatConstPropNames[kMR_EMIN] =               << 
124   fMatConstPropNames[kMR_EMAX] =               << 
125   fMatConstPropNames[kMR_ANGNOTHETA] =         << 
126   fMatConstPropNames[kMR_ANGNOPHI] =           << 
127   fMatConstPropNames[kMR_ANGCUT] =             << 
128   fMatConstPropNames[kSCINTILLATIONTIMECONSTAN << 
129   fMatConstPropNames[kSCINTILLATIONTIMECONSTAN << 
130   fMatConstPropNames[kSCINTILLATIONTIMECONSTAN << 
131   fMatConstPropNames[kSCINTILLATIONRISETIME1]  << 
132   fMatConstPropNames[kSCINTILLATIONRISETIME2]  << 
133   fMatConstPropNames[kSCINTILLATIONRISETIME3]  << 
134   fMatConstPropNames[kSCINTILLATIONYIELD1] =   << 
135   fMatConstPropNames[kSCINTILLATIONYIELD2] =   << 
136   fMatConstPropNames[kSCINTILLATIONYIELD3] =   << 
137   fMatConstPropNames[kPROTONSCINTILLATIONYIELD << 
138   fMatConstPropNames[kPROTONSCINTILLATIONYIELD << 
139   fMatConstPropNames[kPROTONSCINTILLATIONYIELD << 
140   fMatConstPropNames[kDEUTERONSCINTILLATIONYIE << 
141   fMatConstPropNames[kDEUTERONSCINTILLATIONYIE << 
142   fMatConstPropNames[kDEUTERONSCINTILLATIONYIE << 
143   fMatConstPropNames[kTRITONSCINTILLATIONYIELD << 
144   fMatConstPropNames[kTRITONSCINTILLATIONYIELD << 
145   fMatConstPropNames[kTRITONSCINTILLATIONYIELD << 
146   fMatConstPropNames[kALPHASCINTILLATIONYIELD1 << 
147   fMatConstPropNames[kALPHASCINTILLATIONYIELD2 << 
148   fMatConstPropNames[kALPHASCINTILLATIONYIELD3 << 
149   fMatConstPropNames[kIONSCINTILLATIONYIELD1]  << 
150   fMatConstPropNames[kIONSCINTILLATIONYIELD2]  << 
151   fMatConstPropNames[kIONSCINTILLATIONYIELD3]  << 
152   fMatConstPropNames[kELECTRONSCINTILLATIONYIE << 
153   fMatConstPropNames[kELECTRONSCINTILLATIONYIE << 
154   fMatConstPropNames[kELECTRONSCINTILLATIONYIE << 
155   fMatConstPropNames[kCOATEDTHICKNESS] =       << 
156   fMatConstPropNames[kCOATEDFRUSTRATEDTRANSMIS << 
157   fMatConstPropNames[kPROTONSCINTILLATIONTIMEC << 
158   fMatConstPropNames[kPROTONSCINTILLATIONTIMEC << 
159   fMatConstPropNames[kPROTONSCINTILLATIONTIMEC << 
160   fMatConstPropNames[kDEUTERONSCINTILLATIONTIM << 
161   fMatConstPropNames[kDEUTERONSCINTILLATIONTIM << 
162   fMatConstPropNames[kDEUTERONSCINTILLATIONTIM << 
163   fMatConstPropNames[kTRITONSCINTILLATIONTIMEC << 
164   fMatConstPropNames[kTRITONSCINTILLATIONTIMEC << 
165   fMatConstPropNames[kTRITONSCINTILLATIONTIMEC << 
166   fMatConstPropNames[kALPHASCINTILLATIONTIMECO << 
167   fMatConstPropNames[kALPHASCINTILLATIONTIMECO << 
168   fMatConstPropNames[kALPHASCINTILLATIONTIMECO << 
169   fMatConstPropNames[kIONSCINTILLATIONTIMECONS << 
170   fMatConstPropNames[kIONSCINTILLATIONTIMECONS << 
171   fMatConstPropNames[kIONSCINTILLATIONTIMECONS << 
172   fMatConstPropNames[kELECTRONSCINTILLATIONTIM << 
173   fMatConstPropNames[kELECTRONSCINTILLATIONTIM << 
174   fMatConstPropNames[kELECTRONSCINTILLATIONTIM << 
175   fMCP.assign(kNumberOfConstPropertyIndex, {0. << 
176 }                                              << 
177                                                    98 
178 G4MaterialPropertiesTable::~G4MaterialProperti     99 G4MaterialPropertiesTable::~G4MaterialPropertiesTable()
179 {                                                 100 {
180   for (auto prop : fMP) {                      << 101   //  MPT.clearAndDestroy();
181     delete (prop);                             << 102   MPTiterator i;
182   }                                            << 103   for (i = MPT.begin(); i != MPT.end(); ++i) {
183 }                                              << 104     delete (*i).second;
184                                                << 
185 G4int G4MaterialPropertiesTable::GetConstPrope << 
186 {                                              << 
187   // Returns the constant material property in << 
188                                                << 
189   std::size_t index = std::distance(fMatConstP << 
190     std::find(fMatConstPropNames.cbegin(), fMa << 
191   if (index < fMatConstPropNames.size()) {     << 
192     return (G4int)index;                       << 
193   }                                            << 
194                                                << 
195   G4ExceptionDescription ed;                   << 
196   ed << "Constant Material Property Index for  << 
197   G4Exception("G4MaterialPropertiesTable::GetC << 
198   return 0;                                    << 
199 }                                              << 
200                                                << 
201 G4int G4MaterialPropertiesTable::GetPropertyIn << 
202 {                                              << 
203   // Returns the material property index corre << 
204   std::size_t index = std::distance(           << 
205     fMatPropNames.cbegin(), std::find(fMatProp << 
206   if (index < fMatPropNames.size()) {          << 
207     return (G4int)index;                       << 
208   }                                            << 
209   G4ExceptionDescription ed;                   << 
210   ed << "Material Property Index for key " <<  << 
211   G4Exception("G4MaterialPropertiesTable::GetP << 
212   return 0;                                    << 
213 }                                              << 
214                                                << 
215 G4double G4MaterialPropertiesTable::GetConstPr << 
216 {                                              << 
217   // Returns the constant material property co << 
218   // fatal exception if property not found     << 
219                                                << 
220   if (index < (G4int)fMCP.size() && fMCP[index << 
221     return fMCP[index].first;                  << 
222   }                                            << 
223   G4ExceptionDescription ed;                   << 
224   ed << "Constant Material Property " << fMatC << 
225   G4Exception("G4MaterialPropertiesTable::GetC << 
226   return 0.;                                   << 
227 }                                              << 
228                                                << 
229 G4double G4MaterialPropertiesTable::GetConstPr << 
230 {                                              << 
231   // Returns the constant material property co << 
232   // fatal exception if property not found     << 
233                                                << 
234   return GetConstProperty(GetConstPropertyInde << 
235 }                                              << 
236                                                << 
237 G4double G4MaterialPropertiesTable::GetConstPr << 
238 {                                              << 
239   return GetConstProperty(GetConstPropertyInde << 
240 }                                              << 
241                                                << 
242 G4bool G4MaterialPropertiesTable::ConstPropert << 
243 {                                              << 
244   // Returns true if a const property correspo << 
245                                                << 
246   return index >= 0 && index < (G4int)fMCP.siz << 
247 }                                              << 
248                                                << 
249 G4bool G4MaterialPropertiesTable::ConstPropert << 
250 {                                              << 
251   // Returns true if a const property 'key' ex << 
252   std::size_t index = std::distance(fMatConstP << 
253     std::find(fMatConstPropNames.cbegin(), fMa << 
254   if (index < fMatConstPropNames.size()) {  // << 
255     return ConstPropertyExists((G4int)index);  << 
256   }                                            << 
257   return false;                                << 
258 }                                              << 
259                                                << 
260 G4bool G4MaterialPropertiesTable::ConstPropert << 
261 {                                              << 
262   std::size_t index = std::distance(fMatConstP << 
263     std::find(fMatConstPropNames.cbegin(), fMa << 
264   if (index < fMatConstPropNames.size()) {  // << 
265     return ConstPropertyExists((G4int)index);  << 
266   }                                            << 
267   return false;                                << 
268 }                                              << 
269                                                << 
270 G4MaterialPropertyVector* G4MaterialProperties << 
271 {                                              << 
272   // Returns a Material Property Vector corres << 
273   if (std::find(fMatPropNames.cbegin(), fMatPr << 
274     const G4int index = GetPropertyIndex(G4Str << 
275     return GetProperty(index);                 << 
276   }                                            << 
277   return nullptr;                              << 
278 }                                              << 
279                                                << 
280 G4MaterialPropertyVector* G4MaterialProperties << 
281 {                                              << 
282   if (std::find(fMatPropNames.cbegin(), fMatPr << 
283     const G4int index = GetPropertyIndex(G4Str << 
284     return GetProperty(index);                 << 
285   }                                            << 
286   return nullptr;                              << 
287 }                                              << 
288                                                << 
289 G4MaterialPropertyVector* G4MaterialProperties << 
290 {                                              << 
291   // Returns a Material Property Vector corres << 
292   // returns nullptr if the property has not b << 
293   if (index >= 0 && index < (G4int)fMP.size()) << 
294     return fMP[index];                         << 
295   }                                            << 
296   return nullptr;                              << 
297 }                                              << 
298                                                << 
299 G4MaterialPropertyVector* G4MaterialProperties << 
300   const std::vector<G4double>& photonEnergies, << 
301   G4bool createNewKey, G4bool spline)          << 
302 {                                              << 
303   if (photonEnergies.size() != propertyValues. << 
304     G4ExceptionDescription ed;                 << 
305     ed << "AddProperty error. Number of proper << 
306        << "energy values. Property name: " <<  << 
307     G4Exception("G4MaterialPropertiesTable::Ad << 
308   }                                            << 
309                                                << 
310   if (photonEnergies.size() == 1) {            << 
311     G4ExceptionDescription ed;                 << 
312     ed << "AddProperty warning. A material pro << 
313        << "Unless you will later add an entry, << 
314        << "Property name: " << key;            << 
315     G4Exception("G4MaterialPropertiesTable::Ad << 
316   }                                            << 
317                                                << 
318   // G4PhysicsVector assumes energies are in i << 
319   for (std::size_t i = 0; i < photonEnergies.s << 
320     if (photonEnergies.at(i + 1) < photonEnerg << 
321       G4ExceptionDescription ed;               << 
322       ed << "Energies in material property vec << 
323          << "order. Key: " << key << " Energy: << 
324       G4Exception("G4MaterialPropertiesTable:: << 
325     }                                          << 
326   }                                            << 
327                                                << 
328   // if the key doesn't exist, add it if reque << 
329   if (std::find(fMatPropNames.cbegin(), fMatPr << 
330     if (createNewKey) {                        << 
331       fMatPropNames.push_back(key);            << 
332       fMP.push_back(nullptr);                  << 
333     }                                          << 
334     else {                                     << 
335       G4ExceptionDescription ed;               << 
336       ed << "Attempting to create a new materi << 
337          << "createNewKey parameter of AddProp << 
338       G4Exception("G4MaterialPropertiesTable:: << 
339     }                                          << 
340   }                                            << 
341                                                << 
342   auto* mpv = new G4MaterialPropertyVector(pho << 
343   mpv->SetVerboseLevel(1);                     << 
344   if (spline) {                                << 
345     mpv->FillSecondDerivatives();              << 
346   }                                            << 
347   G4int index = GetPropertyIndex(key);         << 
348   fMP[index] = mpv;                            << 
349                                                << 
350   // if key is RINDEX, we calculate GROUPVEL - << 
351   // contribution from Tao Lin (IHEP, the JUNO << 
352   if (key == "RINDEX") {                       << 
353     CalculateGROUPVEL();                       << 
354   }                                               105   }
355                                                << 106   MPT.clear();
356   return mpv;                                  << 
357 }                                                 107 }
358                                                   108 
359 G4MaterialPropertyVector* G4MaterialProperties << 109         ////////////
360   G4double* photonEnergies, G4double* property << 110         // Methods
361   G4bool spline)                               << 111         ////////////
362 {                                              << 
363   // Provides a way of adding a property to th << 
364   // Table given a pair of arrays and a key    << 
365   G4String k(key);                             << 
366                                                << 
367   std::vector<G4double> energies(photonEnergie << 
368   std::vector<G4double> values(propertyValues, << 
369   return AddProperty(k, energies, values, crea << 
370 }                                              << 
371                                                   112 
372 void G4MaterialPropertiesTable::AddProperty(   << 113 void G4MaterialPropertiesTable::AddProperty(char     *key,
373   const G4String& key, G4MaterialPropertyVecto << 114               G4double *PhotonMomenta,
                                                   >> 115               G4double *PropertyValues,
                                                   >> 116               G4int     NumEntries)
374 {                                                 117 {
375   //  Provides a way of adding a property to t << 118   G4MaterialPropertyVector *mpv = 
376   //  Table given an G4MaterialPropertyVector  << 119       new G4MaterialPropertyVector(PhotonMomenta, 
377                                                << 120                    PropertyValues, 
378   // G4PhysicsVector assumes energies are in i << 121                  NumEntries);
379   if (mpv->GetVectorLength() > 1) {            << 122   MPT [G4String(key)] = mpv;
380     for (std::size_t i = 0; i < mpv->GetVector << 
381       if (mpv->Energy(i + 1) < mpv->Energy(i)) << 
382         G4ExceptionDescription ed;             << 
383         ed << "Energies in material property v << 
384            << "order. Key: " << key << " Energ << 
385         G4Exception("G4MaterialPropertiesTable << 
386       }                                        << 
387     }                                          << 
388   }                                            << 
389                                                << 
390   if (mpv->GetVectorLength() <= 1) {           << 
391     G4ExceptionDescription ed;                 << 
392     ed << "AddProperty warning. A material pro << 
393        << "Unless you will later add an entry, << 
394        << "Property name: " << key;            << 
395     G4Exception("G4MaterialPropertiesTable::Ad << 
396   }                                            << 
397                                                << 
398   // if the key doesn't exist, add it          << 
399   if (std::find(fMatPropNames.cbegin(), fMatPr << 
400     if (createNewKey) {                        << 
401       fMatPropNames.push_back(key);            << 
402       fMP.push_back(nullptr);                  << 
403     }                                          << 
404     else {                                     << 
405       G4ExceptionDescription ed;               << 
406       ed << "Attempting to create a new materi << 
407          << "createNewKey parameter of AddProp << 
408       G4Exception("G4MaterialPropertiesTable:: << 
409     }                                          << 
410   }                                            << 
411   G4int index = GetPropertyIndex(key);         << 
412   fMP[index] = mpv;                            << 
413                                                << 
414   // if key is RINDEX, we calculate GROUPVEL - << 
415   // contribution from Tao Lin (IHEP, the JUNO << 
416   if (key == "RINDEX") {                       << 
417     CalculateGROUPVEL();                       << 
418   }                                            << 
419 }                                                 123 }
420                                                   124 
421 void G4MaterialPropertiesTable::AddProperty(   << 125 void G4MaterialPropertiesTable::AddProperty(char *key,
422   const char* key, G4MaterialPropertyVector* m << 126               G4MaterialPropertyVector *mpv)
423 {                                                 127 {
424   AddProperty(G4String(key), mpv, createNewKey << 128 //  Provides a way of adding a property to the Material Properties
425 }                                              << 129 //  Table given an G4MaterialPropertyVector Reference and a key 
426                                                   130 
427 void G4MaterialPropertiesTable::AddProperty(co << 131   MPT [G4String(key)] = mpv;
428 {                                              << 132 } 
429   // load a material property vector defined i << 
430   G4MaterialPropertyVector* v = G4OpticalMater << 
431   AddProperty(key, v);                         << 
432 }                                              << 
433                                                   133 
434 void G4MaterialPropertiesTable::AddConstProper << 134 void G4MaterialPropertiesTable::RemoveProperty(char *key)
435   const G4String& key, G4double propertyValue, << 
436 {                                                 135 {
437   // Provides a way of adding a constant prope << 136   MPT.erase(G4String(key));
438   // Table given a key                         << 
439   if (std::find(fMatConstPropNames.cbegin(), f << 
440       fMatConstPropNames.cend())               << 
441   {                                            << 
442     if (createNewKey) {                        << 
443       fMatConstPropNames.push_back(key);       << 
444       fMCP.emplace_back(0., true);             << 
445     }                                          << 
446     else {                                     << 
447       G4ExceptionDescription ed;               << 
448       ed << "Attempting to create a new materi << 
449          << " without setting\n"               << 
450          << "createNewKey parameter of AddProp << 
451       G4Exception("G4MaterialPropertiesTable:: << 
452     }                                          << 
453   }                                            << 
454   G4int index = GetConstPropertyIndex(key);    << 
455                                                << 
456   fMCP[index] = std::pair<G4double, G4bool>{pr << 
457 }                                                 137 }
458                                                   138 
459 void G4MaterialPropertiesTable::AddConstProper << 139 G4MaterialPropertyVector* G4MaterialPropertiesTable::GetProperty(char *key)
460   const char* key, G4double propertyValue, G4b << 
461 {                                                 140 {
462   // Provides a way of adding a constant prope << 141   return MPT [G4String(key)];
463   // Table given a key                         << 
464   AddConstProperty(G4String(key), propertyValu << 
465 }                                                 142 }
466                                                   143 
467 void G4MaterialPropertiesTable::RemoveConstPro << 144 void G4MaterialPropertiesTable::AddEntry(char     *key,
                                                   >> 145            G4double  aPhotonMomentum,
                                                   >> 146            G4double  aPropertyValue)
468 {                                                 147 {
469   G4int index = GetConstPropertyIndex(key);    << 148   G4MaterialPropertyVector *targetVector=MPT [G4String(key)];
470   if (index < (G4int)fMCP.size()) {            << 149   if (targetVector != NULL) {
471     fMCP[index] = std::pair<G4double, G4bool>{ << 150     targetVector->AddElement(aPhotonMomentum, aPropertyValue);
472   }                                            << 151   }
                                                   >> 152   else {
                                                   >> 153     G4Exception("G4MaterialPropertiesTable::AddEntry ==> "
                                                   >> 154           "Material Property Vector not found.");
                                                   >> 155   }
473 }                                                 156 }
474                                                   157 
475 void G4MaterialPropertiesTable::RemoveConstPro << 158 void G4MaterialPropertiesTable::RemoveEntry(char *key,  
                                                   >> 159               G4double  aPhotonMomentum)
476 {                                                 160 {
477   RemoveConstProperty(G4String(key));          << 161         G4MaterialPropertyVector *targetVector=MPT [G4String(key)];
                                                   >> 162   if (targetVector) {
                                                   >> 163     targetVector->RemoveElement(aPhotonMomentum);
                                                   >> 164   }
                                                   >> 165         else {
                                                   >> 166                 G4Exception("G4MaterialPropertiesTable::AddEntry ==> "
                                                   >> 167           "Material Property Vector not found.");
                                                   >> 168         }
478 }                                                 169 }
479                                                << 170 void G4MaterialPropertiesTable::DumpTable()
480 void G4MaterialPropertiesTable::RemoveProperty << 
481 {                                                 171 {
482   G4int index = GetPropertyIndex(key);         << 172   MPTiterator i;
483   delete fMP[index];                           << 173   for (i = MPT.begin(); i != MPT.end(); ++i) {
484   fMP[index] = nullptr;                        << 174     G4cout << *(*i).first << G4endl;
485 }                                              << 175     (*i).second->DumpVector();
486                                                << 
487 void G4MaterialPropertiesTable::RemoveProperty << 
488                                                << 
489 void G4MaterialPropertiesTable::AddEntry(      << 
490   const G4String& key, G4double aPhotonEnergy, << 
491 {                                              << 
492   // Allows to add an entry pair directly to t << 
493   // given a key.                              << 
494   if (std::find(fMatPropNames.cbegin(), fMatPr << 
495     G4ExceptionDescription ed;                 << 
496     ed << "Material Property Vector " << key < << 
497     G4Exception("G4MaterialPropertiesTable::Ad << 
498   }                                            << 
499   G4int index = GetPropertyIndex(key);         << 
500                                                << 
501   G4MaterialPropertyVector* targetVector = fMP << 
502   if (targetVector != nullptr) {               << 
503     // do not allow duplicate energies         << 
504     for (std::size_t i = 0; i < targetVector-> << 
505       if (aPhotonEnergy == targetVector->Energ << 
506         G4ExceptionDescription ed;             << 
507         ed << "Energy values in material prope << 
508            << "Key: " << key;                  << 
509         G4Exception("G4MaterialPropertiesTable << 
510       }                                        << 
511     }                                          << 
512                                                << 
513     targetVector->InsertValues(aPhotonEnergy,  << 
514   }                                            << 
515   else {                                       << 
516     G4ExceptionDescription ed;                 << 
517     ed << "Material Property Vector " << key < << 
518     G4Exception("G4MaterialPropertiesTable::Ad << 
519   }                                            << 
520   if (key == "RINDEX") {                       << 
521     CalculateGROUPVEL();                       << 
522   }                                            << 
523 }                                              << 
524                                                << 
525 void G4MaterialPropertiesTable::AddEntry(      << 
526   const char* key, G4double aPhotonEnergy, G4d << 
527 {                                              << 
528   AddEntry(G4String(key), aPhotonEnergy, aProp << 
529 }                                              << 
530                                                << 
531 void G4MaterialPropertiesTable::DumpTable() co << 
532 {                                              << 
533   // material properties                       << 
534   G4int j = 0;                                 << 
535   for (const auto& prop : fMP) {               << 
536     if (prop != nullptr) {                     << 
537       G4cout << j << ": " << fMatPropNames[j]  << 
538       prop->DumpValues();                      << 
539     }                                          << 
540     ++j;                                       << 
541   }                                            << 
542   // material constant properties              << 
543   j = 0;                                       << 
544   for (const auto& cprop : fMCP) {             << 
545     if (cprop.second) {                        << 
546       G4cout << j << ": " << fMatConstPropName << 
547     }                                          << 
548     ++j;                                       << 
549   }                                               176   }
550 }                                              << 
551                                                << 
552 G4MaterialPropertyVector* G4MaterialProperties << 
553 {                                              << 
554 #ifdef G4MULTITHREADED                         << 
555   G4AutoLock mptm(&materialPropertyTableMutex) << 
556 #endif                                         << 
557                                                << 
558   // check if "GROUPVEL" already exists. If so << 
559   if (fMP[kGROUPVEL] != nullptr) {             << 
560     this->RemoveProperty("GROUPVEL");          << 
561   }                                            << 
562                                                << 
563   // fetch RINDEX data, give up if unavailable << 
564   G4MaterialPropertyVector* rindex = this->Get << 
565   if (rindex == nullptr) {                     << 
566     return nullptr;                            << 
567   }                                            << 
568                                                << 
569   // RINDEX exists but has no entries, give up << 
570   if (rindex->GetVectorLength() == 0) {        << 
571     return nullptr;                            << 
572   }                                            << 
573                                                << 
574   // add GROUPVEL vector                       << 
575   auto* groupvel = new G4MaterialPropertyVecto << 
576   groupvel->SetVerboseLevel(1);                << 
577                                                << 
578   // fill GROUPVEL vector using RINDEX values  << 
579   // rindex built-in "iterator" was advanced t << 
580   G4double E0 = rindex->Energy(0);             << 
581   G4double n0 = (*rindex)[0];                  << 
582                                                << 
583   if (E0 <= 0.) {                              << 
584     G4Exception("G4MaterialPropertiesTable::Ca << 
585       "Optical Photon Energy <= 0");           << 
586   }                                            << 
587                                                << 
588   if (rindex->GetVectorLength() >= 2) {        << 
589     // good, we have at least two entries in R << 
590     // get next energy/value pair              << 
591                                                << 
592     G4double E1 = rindex->Energy(1);           << 
593     G4double n1 = (*rindex)[1];                << 
594                                                << 
595     if (E1 <= 0.) {                            << 
596       G4Exception("G4MaterialPropertiesTable:: << 
597         "Optical Photon Energy <= 0");         << 
598     }                                          << 
599                                                << 
600     G4double vg;                               << 
601                                                << 
602     // add entry at first photon energy        << 
603     vg = c_light / (n0 + (n1 - n0) / G4Log(E1  << 
604                                                << 
605     // allow only for 'normal dispersion' -> d << 
606     if ((vg < 0) || (vg > c_light / n0)) {     << 
607       vg = c_light / n0;                       << 
608     }                                          << 
609                                                << 
610     groupvel->InsertValues(E0, vg);            << 
611                                                << 
612     // add entries at midpoints between remain << 
613     for (std::size_t i = 2; i < rindex->GetVec << 
614       vg = c_light / (0.5 * (n0 + n1) + (n1 -  << 
615                                                << 
616       // allow only for 'normal dispersion' -> << 
617       if ((vg < 0) || (vg > c_light / (0.5 * ( << 
618         vg = c_light / (0.5 * (n0 + n1));      << 
619       }                                        << 
620       groupvel->InsertValues(0.5 * (E0 + E1),  << 
621                                                << 
622       // get next energy/value pair, or exit l << 
623       E0 = E1;                                 << 
624       n0 = n1;                                 << 
625       E1 = rindex->Energy(i);                  << 
626       n1 = (*rindex)[i];                       << 
627                                                << 
628       if (E1 <= 0.) {                          << 
629         G4Exception("G4MaterialPropertiesTable << 
630           "Optical Photon Energy <= 0");       << 
631       }                                        << 
632     }                                          << 
633                                                << 
634     // add entry at last photon energy         << 
635     vg = c_light / (n1 + (n1 - n0) / G4Log(E1  << 
636                                                << 
637     // allow only for 'normal dispersion' -> d << 
638     if ((vg < 0) || (vg > c_light / n1)) {     << 
639       vg = c_light / n1;                       << 
640     }                                          << 
641     groupvel->InsertValues(E1, vg);            << 
642   }                                            << 
643   else  // only one entry in RINDEX -- weird!  << 
644   {                                            << 
645     groupvel->InsertValues(E0, c_light / n0);  << 
646   }                                            << 
647                                                << 
648   this->AddProperty("GROUPVEL", groupvel);     << 
649                                                << 
650   return groupvel;                             << 
651 }                                                 177 }
652                                                   178