ATLAS Offline Software
Loading...
Searching...
No Matches
Geo2G4MatPropTableFactory.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
7#include "G4MaterialPropertiesTable.hh"
8#include "G4MaterialPropertyVector.hh"
9
12
13#include <mutex>
14#include <unordered_map>
15
16namespace {
17 typedef std::unordered_map<const GeoMaterialPropertiesTable*, G4MaterialPropertiesTable*> TableMap;
18}
19
20
21G4MaterialPropertiesTable* Geo2G4MatPropTableFactory::Build(const GeoMaterialPropertiesTable* thePropTable)
22{
23 static TableMap definedTables ATLAS_THREAD_SAFE;
24
25 // For now just use a global lock. If this turns out to be a bottleneck
26 // switch to a concurrent map or similar.
27 static std::mutex tableMutex;
28 std::scoped_lock lock(tableMutex);
29
30 //
31 // Check if this material has already been defined.
32 //
33 const auto itr = definedTables.find(thePropTable);
34 if(itr != definedTables.end())
35 return itr->second;
36
37 G4MaterialPropertiesTable* newTable = new G4MaterialPropertiesTable();
38
39 // Add properties to the table ...
40
41 // 1. Const properties
44
45 for(;it1_first!=it1_last;++it1_first)
46 newTable->AddConstProperty((it1_first->first).c_str(),it1_first->second);
47
48 // 2. Vector properties
51
52 for(;it2_first!=it2_last;++it2_first)
53 {
54 GeoMaterialPropertyVector* geoMPV = it2_first->second;
55 //from G4 9.6 G4MaterialPropertyVector is now a typedef of G4PhysicsOrderedFreeVector
56 G4MaterialPropertyVector* g4MPV = new G4MaterialPropertyVector();
57
58 geoMPV->ResetIterator();
59
60 while((*geoMPV).operator++())
61 {
62 //g4MPV->AddElement(geoMPV->GetPhotonMomentum(),geoMPV->GetProperty()); // G4 9.4 syntax
63 //assume G4PhysicsOrderedFreeVector::InsertValues is equivalent to G4MaterialPropertyVector::AddElement
64 g4MPV->InsertValues(geoMPV->GetPhotonMomentum(),geoMPV->GetProperty()); // G4 9.6 syntax
65 }
66
67 newTable->AddProperty((it2_first->first).c_str(),g4MPV);
68 }
69
70 // Save new table to the map
71 definedTables[thePropTable]=newTable;
72
73 return newTable;
74}
Define macros for attributes used to control the static checker.
#define ATLAS_THREAD_SAFE
G4MaterialPropertiesTable * Build(const GeoMaterialPropertiesTable *)
GeoMatPVMap::const_iterator GeoMatPVMap_ConstIt
GeoMatPVMap_ConstIt beginPVMap() const
GeoMatPMap::const_iterator GeoMatPMap_ConstIt
GeoMatPMap_ConstIt beginPMap() const
GeoMatPVMap_ConstIt endPVMap() const