Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer << 3 // * DISCLAIMER * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th << 5 // * The following disclaimer summarizes all the specific disclaimers * 6 // * the Geant4 Collaboration. It is provided << 6 // * of contributors to this software. The specific disclaimers,which * 7 // * conditions of the Geant4 Software License << 7 // * govern, are listed with their locations in: * 8 // * LICENSE and available at http://cern.ch/ << 8 // * http://cern.ch/geant4/license * 9 // * include a list of copyright holders. << 10 // * 9 // * * 11 // * Neither the authors of this software syst 10 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 11 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 12 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 13 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file << 14 // * use. * 16 // * for the full disclaimer and the limitatio << 17 // * 15 // * * 18 // * This code implementation is the result << 16 // * This code implementation is the intellectual property of the * 19 // * technical work of the GEANT4 collaboratio << 17 // * GEANT4 collaboration. * 20 // * By using, copying, modifying or distri << 18 // * By copying, distributing or modifying the Program (or any work * 21 // * any work based on the software) you ag << 19 // * based on the Program) you indicate your acceptance of this * 22 // * use in resulting scientific publicati << 20 // * statement, and all its terms. * 23 // * acceptance of all terms of the Geant4 Sof << 24 // ******************************************* 21 // ******************************************************************** 25 << 22 // >> 23 // >> 24 // $Id: G4MaterialPropertiesTable.cc,v 1.12 2001/10/17 07:59:54 gcosmo Exp $ >> 25 // GEANT4 tag $Name: geant4-04-01 $ >> 26 // >> 27 // 26 ////////////////////////////////////////////// 28 //////////////////////////////////////////////////////////////////////// 27 // G4MaterialPropertiesTable Implementation 29 // G4MaterialPropertiesTable Implementation 28 ////////////////////////////////////////////// 30 //////////////////////////////////////////////////////////////////////// 29 // 31 // 30 // File: G4MaterialPropertiesTable.cc << 32 // File: G4MaterialPropertiesTable.cc 31 // Version: 1.0 33 // Version: 1.0 32 // Created: 1996-02-08 34 // Created: 1996-02-08 33 // Author: Juliet Armstrong 35 // Author: Juliet Armstrong 34 // Updated: 2005-05-12 add SetGROUPVEL(), << 36 // 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 37 // by John Allison 39 // 1997-03-26 by Peter Gumplinger 38 // 1997-03-26 by Peter Gumplinger 40 // > cosmetics (only) 39 // > cosmetics (only) >> 40 // mail: gum@triumf.ca 41 // 41 // 42 ////////////////////////////////////////////// 42 //////////////////////////////////////////////////////////////////////// 43 43 44 #include "G4MaterialPropertiesTable.hh" << 45 << 46 #include "G4Log.hh" << 47 #include "G4OpticalMaterialProperties.hh" << 48 #include "G4PhysicalConstants.hh" << 49 #include "globals.hh" 44 #include "globals.hh" >> 45 #include "G4MaterialPropertiesTable.hh" 50 46 51 #include <algorithm> << 47 ////////////// 52 #include <cassert> << 48 // Operators 53 << 49 ////////////// 54 #ifdef G4MULTITHREADED << 50 55 # include "G4AutoLock.hh" << 51 /************** 56 namespace << 52 G4MaterialPropertiesTable& 57 { << 53 G4MaterialPropertiesTable::operator =(const G4MaterialPropertiesTable& right) 58 G4Mutex materialPropertyTableMutex = G4MUTEX_I << 54 { 59 } << 55 if (this == &right) return *this; 60 #endif << 56 61 << 57 // clear any current contents of MPT 62 G4MaterialPropertiesTable::G4MaterialPropertie << 58 63 { << 59 MPT.clearAndDestroy(); 64 // elements of these 2 vectors must be in sa << 60 65 // the corresponding enums in G4MaterialProp << 61 // want to make an actual copy -- not a shallow copy which is 66 fMatPropNames.assign(kNumberOfPropertyIndex, << 62 // the default for RWTPrtHashDictionary's assignment operator 67 fMatPropNames[kRINDEX] = << 63 68 fMatPropNames[kREFLECTIVITY] = << 64 G4RWTPtrHashDictionary<G4String, G4MaterialPropertyVector> 69 fMatPropNames[kREALRINDEX] = << 65 rightMPT(right.MPT); 70 fMatPropNames[kIMAGINARYRINDEX] = << 66 G4RWTPtrHashDictionaryIterator<G4String, G4MaterialPropertyVector> 71 fMatPropNames[kEFFICIENCY] = << 67 rightIterator(rightMPT); 72 fMatPropNames[kTRANSMITTANCE] = << 68 rightIterator.reset(); 73 fMatPropNames[kSPECULARLOBECONSTANT] = << 69 while (++rightIterator) { 74 fMatPropNames[kSPECULARSPIKECONSTANT] = << 70 G4MaterialPropertyVector *newProp = 75 fMatPropNames[kBACKSCATTERCONSTANT] = << 71 new G4MaterialPropertyVector(*(rightIterator.value())); 76 fMatPropNames[kGROUPVEL] = << 72 G4String *newKey = 77 fMatPropNames[kMIEHG] = << 73 new G4String(*(rightIterator.key())); 78 fMatPropNames[kRAYLEIGH] = << 74 MPT.insertKeyAndValue(newKey, newProp); 79 fMatPropNames[kWLSCOMPONENT] = << 75 } 80 fMatPropNames[kWLSABSLENGTH] = << 76 return *this; 81 fMatPropNames[kWLSCOMPONENT2] = << 77 } 82 fMatPropNames[kWLSABSLENGTH2] = << 78 **********/ 83 fMatPropNames[kABSLENGTH] = << 79 84 fMatPropNames[kPROTONSCINTILLATIONYIELD] = << 80 ///////////////// 85 fMatPropNames[kDEUTERONSCINTILLATIONYIELD] = << 81 // Constructors 86 fMatPropNames[kTRITONSCINTILLATIONYIELD] = << 82 ///////////////// 87 fMatPropNames[kALPHASCINTILLATIONYIELD] = << 83 88 fMatPropNames[kIONSCINTILLATIONYIELD] = << 84 G4MaterialPropertiesTable::G4MaterialPropertiesTable() {} 89 fMatPropNames[kELECTRONSCINTILLATIONYIELD] = << 85 90 fMatPropNames[kSCINTILLATIONCOMPONENT1] = << 86 /********* 91 fMatPropNames[kSCINTILLATIONCOMPONENT2] = << 87 G4MaterialPropertiesTable::G4MaterialPropertiesTable 92 fMatPropNames[kSCINTILLATIONCOMPONENT3] = << 88 (const G4MaterialPropertiesTable &right) : 93 fMatPropNames[kCOATEDRINDEX] = << 89 MPT(hashString), MPTiterator(MPT) 94 << 90 { 95 fMP.assign(kNumberOfPropertyIndex, nullptr); << 91 // want to make an actual copy -- not a shallow copy which is 96 << 92 // the default for RWTPrtHashDictionary's assignment operator 97 fMatConstPropNames.assign(kNumberOfConstProp << 93 98 fMatConstPropNames[kSURFACEROUGHNESS] = << 94 G4RWTPtrHashDictionary<G4String, G4MaterialPropertyVector> 99 fMatConstPropNames[kISOTHERMAL_COMPRESSIBILI << 95 rightMPT(right.MPT); 100 fMatConstPropNames[kRS_SCALE_FACTOR] = << 96 G4RWTPtrHashDictionaryIterator<G4String, G4MaterialPropertyVector> 101 fMatConstPropNames[kWLSMEANNUMBERPHOTONS] = << 97 rightIterator(rightMPT); 102 fMatConstPropNames[kWLSTIMECONSTANT] = << 98 103 fMatConstPropNames[kWLSMEANNUMBERPHOTONS2] = << 99 rightIterator.reset(); 104 fMatConstPropNames[kWLSTIMECONSTANT2] = << 100 105 fMatConstPropNames[kMIEHG_FORWARD] = << 101 while (++rightIterator) { 106 fMatConstPropNames[kMIEHG_BACKWARD] = << 102 G4MaterialPropertyVector *newProp = 107 fMatConstPropNames[kMIEHG_FORWARD_RATIO] = << 103 new G4MaterialPropertyVector(*(rightIterator.value())); 108 fMatConstPropNames[kSCINTILLATIONYIELD] = << 104 G4String *newKey = 109 fMatConstPropNames[kRESOLUTIONSCALE] = << 105 new G4String(*(rightIterator.key())); 110 fMatConstPropNames[kFERMIPOT] = << 106 MPT.insertKeyAndValue(newKey, newProp); 111 fMatConstPropNames[kDIFFUSION] = << 107 } 112 fMatConstPropNames[kSPINFLIP] = << 108 } 113 fMatConstPropNames[kLOSS] = << 109 *******/ 114 fMatConstPropNames[kLOSSCS] = << 110 115 fMatConstPropNames[kABSCS] = << 111 //////////////// 116 fMatConstPropNames[kSCATCS] = << 112 // Destructors 117 fMatConstPropNames[kMR_NBTHETA] = << 113 //////////////// 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 114 178 G4MaterialPropertiesTable::~G4MaterialProperti 115 G4MaterialPropertiesTable::~G4MaterialPropertiesTable() 179 { 116 { 180 for (auto prop : fMP) { << 117 // MPT.clearAndDestroy(); 181 delete (prop); << 118 MPTiterator i; >> 119 for (i = MPT.begin(); i != MPT.end(); ++i) { >> 120 delete (*i).second; 182 } 121 } >> 122 MPT.clear(); 183 } 123 } 184 124 185 G4int G4MaterialPropertiesTable::GetConstPrope << 125 //////////// 186 { << 126 // Methods 187 // Returns the constant material property in << 127 //////////// 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 128 242 G4bool G4MaterialPropertiesTable::ConstPropert << 129 void G4MaterialPropertiesTable::AddProperty(const char *key, >> 130 G4double *PhotonMomenta, >> 131 G4double *PropertyValues, >> 132 G4int NumEntries) 243 { 133 { 244 // Returns true if a const property correspo << 134 G4MaterialPropertyVector *mpv = 245 << 135 new G4MaterialPropertyVector(PhotonMomenta, 246 return index >= 0 && index < (G4int)fMCP.siz << 136 PropertyValues, >> 137 NumEntries); >> 138 MPT [G4String(key)] = mpv; 247 } 139 } 248 140 249 G4bool G4MaterialPropertiesTable::ConstPropert << 141 void G4MaterialPropertiesTable::AddProperty(const char *key, >> 142 G4MaterialPropertyVector *mpv) 250 { 143 { 251 // Returns true if a const property 'key' ex << 144 // Provides a way of adding a property to the Material Properties 252 std::size_t index = std::distance(fMatConstP << 145 // Table given an G4MaterialPropertyVector Reference and a key 253 std::find(fMatConstPropNames.cbegin(), fMa << 254 if (index < fMatConstPropNames.size()) { // << 255 return ConstPropertyExists((G4int)index); << 256 } << 257 return false; << 258 } << 259 146 260 G4bool G4MaterialPropertiesTable::ConstPropert << 147 MPT [G4String(key)] = mpv; 261 { << 148 } 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 149 270 G4MaterialPropertyVector* G4MaterialProperties << 150 void G4MaterialPropertiesTable::RemoveProperty(const char *key) 271 { 151 { 272 // Returns a Material Property Vector corres << 152 MPT.erase(G4String(key)); 273 if (std::find(fMatPropNames.cbegin(), fMatPr << 274 const G4int index = GetPropertyIndex(G4Str << 275 return GetProperty(index); << 276 } << 277 return nullptr; << 278 } 153 } 279 154 280 G4MaterialPropertyVector* G4MaterialProperties << 155 G4MaterialPropertyVector* G4MaterialPropertiesTable::GetProperty(const char *key) 281 { 156 { 282 if (std::find(fMatPropNames.cbegin(), fMatPr << 157 return MPT [G4String(key)]; 283 const G4int index = GetPropertyIndex(G4Str << 284 return GetProperty(index); << 285 } << 286 return nullptr; << 287 } 158 } 288 159 289 G4MaterialPropertyVector* G4MaterialProperties << 160 void G4MaterialPropertiesTable::AddEntry(const char *key, >> 161 G4double aPhotonMomentum, >> 162 G4double aPropertyValue) 290 { 163 { 291 // Returns a Material Property Vector corres << 164 G4MaterialPropertyVector *targetVector=MPT [G4String(key)]; 292 // returns nullptr if the property has not b << 165 if (targetVector != 0) { 293 if (index >= 0 && index < (G4int)fMP.size()) << 166 targetVector->AddElement(aPhotonMomentum, aPropertyValue); 294 return fMP[index]; << 167 } 295 } << 168 else { 296 return nullptr; << 169 G4Exception("G4MaterialPropertiesTable::AddEntry ==> " >> 170 "Material Property Vector not found."); >> 171 } 297 } 172 } 298 173 299 G4MaterialPropertyVector* G4MaterialProperties << 174 void G4MaterialPropertiesTable::RemoveEntry(const char *key, 300 const std::vector<G4double>& photonEnergies, << 175 G4double aPhotonMomentum) 301 G4bool createNewKey, G4bool spline) << 302 { 176 { 303 if (photonEnergies.size() != propertyValues. << 177 G4MaterialPropertyVector *targetVector=MPT [G4String(key)]; 304 G4ExceptionDescription ed; << 178 if (targetVector) { 305 ed << "AddProperty error. Number of proper << 179 targetVector->RemoveElement(aPhotonMomentum); 306 << "energy values. Property name: " << << 180 } 307 G4Exception("G4MaterialPropertiesTable::Ad << 181 else { 308 } << 182 G4Exception("G4MaterialPropertiesTable::RemoveEntry ==> " 309 << 183 "Material Property Vector not found."); 310 if (photonEnergies.size() == 1) { << 184 } 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 } << 355 << 356 return mpv; << 357 } 185 } 358 << 186 void G4MaterialPropertiesTable::DumpTable() 359 G4MaterialPropertyVector* G4MaterialProperties << 360 G4double* photonEnergies, G4double* property << 361 G4bool spline) << 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 << 372 void G4MaterialPropertiesTable::AddProperty( << 373 const G4String& key, G4MaterialPropertyVecto << 374 { 187 { 375 // Provides a way of adding a property to t << 188 MPTiterator i; 376 // Table given an G4MaterialPropertyVector << 189 for (i = MPT.begin(); i != MPT.end(); ++i) { 377 << 190 G4cout << (*i).first << G4endl; 378 // G4PhysicsVector assumes energies are in i << 191 if ( (*i).second != 0 ) { 379 if (mpv->GetVectorLength() > 1) { << 192 (*i).second->DumpVector(); 380 for (std::size_t i = 0; i < mpv->GetVector << 193 } 381 if (mpv->Energy(i + 1) < mpv->Energy(i)) << 194 else { 382 G4ExceptionDescription ed; << 195 G4cout << "NULL Material Property Vector Pointer." << G4endl; 383 ed << "Energies in material property v << 196 } 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 } 197 } 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 } << 420 << 421 void G4MaterialPropertiesTable::AddProperty( << 422 const char* key, G4MaterialPropertyVector* m << 423 { << 424 AddProperty(G4String(key), mpv, createNewKey << 425 } << 426 << 427 void G4MaterialPropertiesTable::AddProperty(co << 428 { << 429 // load a material property vector defined i << 430 G4MaterialPropertyVector* v = G4OpticalMater << 431 AddProperty(key, v); << 432 } << 433 << 434 void G4MaterialPropertiesTable::AddConstProper << 435 const G4String& key, G4double propertyValue, << 436 { << 437 // Provides a way of adding a constant prope << 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 } << 458 << 459 void G4MaterialPropertiesTable::AddConstProper << 460 const char* key, G4double propertyValue, G4b << 461 { << 462 // Provides a way of adding a constant prope << 463 // Table given a key << 464 AddConstProperty(G4String(key), propertyValu << 465 } << 466 << 467 void G4MaterialPropertiesTable::RemoveConstPro << 468 { << 469 G4int index = GetConstPropertyIndex(key); << 470 if (index < (G4int)fMCP.size()) { << 471 fMCP[index] = std::pair<G4double, G4bool>{ << 472 } << 473 } << 474 << 475 void G4MaterialPropertiesTable::RemoveConstPro << 476 { << 477 RemoveConstProperty(G4String(key)); << 478 } << 479 << 480 void G4MaterialPropertiesTable::RemoveProperty << 481 { << 482 G4int index = GetPropertyIndex(key); << 483 delete fMP[index]; << 484 fMP[index] = nullptr; << 485 } << 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 } << 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 } 198 } 652 199