diff --git a/TileCalorimeter/TileTrackingGeometry/CMakeLists.txt b/TileCalorimeter/TileTrackingGeometry/CMakeLists.txt index fc4d3393492d3b88163b17f4fb51bbbc7ce82f85..1f77414b14b76c701e2a388073a77af04d3a4042 100644 --- a/TileCalorimeter/TileTrackingGeometry/CMakeLists.txt +++ b/TileCalorimeter/TileTrackingGeometry/CMakeLists.txt @@ -11,7 +11,7 @@ atlas_add_component( TileTrackingGeometry src/*.cxx src/components/*.cxx INCLUDE_DIRS ${GEOMODELCORE_INCLUDE_DIRS} - LINK_LIBRARIES ${GEOMODELCORE_LIBRARIES} AthenaBaseComps GaudiKernel TrkDetDescrInterfaces CaloDetDescrLib StoreGateLib TileDetDescr TrkDetDescrGeoModelCnv TrkDetDescrUtils TrkGeometry TrkSurfaces TrkVolumes CaloTrackingGeometryLib ) + LINK_LIBRARIES ${GEOMODELCORE_LIBRARIES} AthenaBaseComps GaudiKernel TrkDetDescrInterfaces CaloDetDescrLib StoreGateLib TileDetDescr TrkDetDescrGeoModelCnv TrkDetDescrUtils TrkGeometry TrkSurfaces TrkVolumes CaloTrackingGeometryLib CxxUtils ) # Install files from the package: atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} ) diff --git a/TileCalorimeter/TileTrackingGeometry/TileTrackingGeometry/TileVolumeBuilder.h b/TileCalorimeter/TileTrackingGeometry/TileTrackingGeometry/TileVolumeBuilder.h index 863678fc4fdaf6f3c53990712e1f7afe986b2f02..bd3a93c594e189ff4f1b7fb5e550a0a8f8ebbbbd 100755 --- a/TileCalorimeter/TileTrackingGeometry/TileTrackingGeometry/TileVolumeBuilder.h +++ b/TileCalorimeter/TileTrackingGeometry/TileTrackingGeometry/TileVolumeBuilder.h @@ -12,11 +12,15 @@ // Gaudi #include "AthenaBaseComps/AthAlgTool.h" #include "GaudiKernel/ToolHandle.h" +#include "CxxUtils/checker_macros.h" // Trk #include "TrkDetDescrInterfaces/ITrackingVolumeBuilder.h" #include "CaloTrackingGeometry/ICaloSurfaceBuilder.h" +#include "TrkGeometry/Material.h" // STL #include <vector> +#include <memory> +#include <mutex> class TileDetDescrManager; class CaloDetDescrManager; @@ -70,6 +74,8 @@ namespace Tile { void printInfo(GeoPVConstLink pv) const; void printChildren(GeoPVConstLink pv, int igen, Amg::Transform3D trIn) const; + void throwIntoGarbage (std::unique_ptr<Trk::Material> mat) const; + const TileDetDescrManager* m_tileMgr; //!< Calo DetDescrMgr std::string m_tileMgrLocation; //!< Location of the CaloDetDescrMgr @@ -84,6 +90,8 @@ namespace Tile { bool m_forceSymmetry; //!< forces volume symmetry between negative/positive part + mutable std::mutex m_garbageMutex; + mutable std::vector<std::unique_ptr<Trk::Material> > m_garbage ATLAS_THREAD_SAFE; }; } // end of namespace diff --git a/TileCalorimeter/TileTrackingGeometry/src/TileVolumeBuilder.cxx b/TileCalorimeter/TileTrackingGeometry/src/TileVolumeBuilder.cxx index ca6732cc16d8bfbd893ecdf86c5104ec51e553fb..6e09f563e3a7fb8fa2766b5a81b7a0648fb58d6d 100755 --- a/TileCalorimeter/TileTrackingGeometry/src/TileVolumeBuilder.cxx +++ b/TileCalorimeter/TileTrackingGeometry/src/TileVolumeBuilder.cxx @@ -185,8 +185,8 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking std::vector<std::pair<const Trk::Surface*,const Trk::Surface*> > exitSurf = m_surfBuilder->exitSurfaces(); // averaged material properties - const Trk::Material* barrelProperties = new Trk::Material(22.7, 212., 45.8, 21.4, 0.0062); - const Trk::Material* extendedBarrelProperties = new Trk::Material(22.7, 210., 45.8, 21.4, 0.0062); + auto barrelProperties = std::make_unique<Trk::Material>(22.7, 212., 45.8, 21.4, 0.0062); + auto extendedBarrelProperties = std::make_unique<Trk::Material>(22.7, 210., 45.8, 21.4, 0.0062); // material properties with layer encoding - to be defined later const Trk::BinnedMaterial* barrelMaterialBinned = 0; const Trk::BinnedMaterial* extendedMaterialBinned = 0; @@ -201,10 +201,10 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking // layer material can be adjusted here std::vector<Trk::IdentifiedMaterial> matTB; int baseID = Trk::GeometrySignature(Trk::Calo)*1000 + 12; - matTB.emplace_back(barrelProperties,0); - matTB.emplace_back(barrelProperties,baseID); - matTB.emplace_back(barrelProperties,baseID+1); - matTB.emplace_back(barrelProperties,baseID+2); + matTB.emplace_back(barrelProperties.get(),0); + matTB.emplace_back(barrelProperties.get(),baseID); + matTB.emplace_back(barrelProperties.get(),baseID+1); + matTB.emplace_back(barrelProperties.get(),baseID+2); // material index std::vector<size_t> ltb{0,1,2,3}; @@ -212,10 +212,10 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking // layer material can be adjusted here std::vector<Trk::IdentifiedMaterial> matETB; baseID = Trk::GeometrySignature(Trk::Calo)*1000 + 18; - matETB.emplace_back(extendedBarrelProperties,0); - matETB.emplace_back(extendedBarrelProperties,baseID); - matETB.emplace_back(extendedBarrelProperties,baseID+1); - matETB.emplace_back(extendedBarrelProperties,baseID+2); + matETB.emplace_back(extendedBarrelProperties.get(),0); + matETB.emplace_back(extendedBarrelProperties.get(),baseID); + matETB.emplace_back(extendedBarrelProperties.get(),baseID+1); + matETB.emplace_back(extendedBarrelProperties.get(),baseID+2); // layer material can be adjusted here //Trk::MaterialProperties barrelFingerGapProperties = Trk::MaterialProperties(1., 130./0.35, 0.003*pow(0.35,3),30.); @@ -292,7 +292,7 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking steps.push_back(depth); Trk::BinUtility* rBU = new Trk::BinUtility(steps, Trk::open, Trk::binR); - barrelMaterialBinned = new Trk::BinnedMaterial(barrelProperties,rBU,ltb,matTB); + barrelMaterialBinned = new Trk::BinnedMaterial(barrelProperties.get(),rBU,ltb,matTB); tileBarrel = new Trk::AlignableTrackingVolume(0,align, tileBarrelBounds, @@ -356,7 +356,7 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking steps.push_back(tileExtendedBounds->outerRadius()); Trk::BinUtility* eBU = new Trk::BinUtility(steps, Trk::open, Trk::binR); - extendedMaterialBinned = new Trk::BinnedMaterial(extendedBarrelProperties,eBU,ltb,matETB); + extendedMaterialBinned = new Trk::BinnedMaterial(extendedBarrelProperties.get(),eBU,ltb,matETB); tileExtendedTrackingVolume = new Trk::AlignableTrackingVolume(new Amg::Transform3D(Amg::Translation3D(childPosition)), align, @@ -381,7 +381,7 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking steps.push_back(tileExtendedBounds->outerRadius()); Trk::BinUtility* eBU = new Trk::BinUtility(steps, Trk::open, Trk::binR); - extendedMaterialBinned = new Trk::BinnedMaterial(extendedBarrelProperties,eBU,ltb,matETB); + extendedMaterialBinned = new Trk::BinnedMaterial(extendedBarrelProperties.get(),eBU,ltb,matETB); tileExtendedTrackingVolume = new Trk::AlignableTrackingVolume(new Amg::Transform3D(Amg::Translation3D(childPosition)), align, @@ -441,9 +441,9 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking std::vector<Trk::IdentifiedMaterial> matITC; // layer material can be adjusted here baseID = Trk::GeometrySignature(Trk::Calo)*1000; - matITC.emplace_back(barrelProperties,baseID+15); - matITC.emplace_back(barrelProperties,baseID+16); - matITC.emplace_back(barrelProperties,baseID+17); + matITC.emplace_back(barrelProperties.get(),baseID+15); + matITC.emplace_back(barrelProperties.get(),baseID+16); + matITC.emplace_back(barrelProperties.get(),baseID+17); // ITCPlug1 double p1Z = 0.5*(plug1Z-plug1hZ+tileExtZ); @@ -462,8 +462,8 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking std::vector<float> bpsteps{float(plug1R), float(tileBarrelBounds->outerRadius())}; Trk::BinUtility* rBU = new Trk::BinUtility(bpsteps, Trk::open, Trk::binR); Trk::BinUtility* rBUc = rBU->clone(); - const Trk::BinnedMaterial* plug1MatPos = new Trk::BinnedMaterial(barrelProperties,rBU,dummylay,matITC); - const Trk::BinnedMaterial* plug1MatNeg = new Trk::BinnedMaterial(barrelProperties,rBUc,dummylay,matITC); + const Trk::BinnedMaterial* plug1MatPos = new Trk::BinnedMaterial(barrelProperties.get(),rBU,dummylay,matITC); + const Trk::BinnedMaterial* plug1MatNeg = new Trk::BinnedMaterial(barrelProperties.get(),rBUc,dummylay,matITC); Amg::Transform3D* align=0; @@ -497,8 +497,8 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking std::vector<float> p2steps{float(plug2R), float(plug1R)}; Trk::BinUtility* p2BU = new Trk::BinUtility(p2steps, Trk::open, Trk::binR); Trk::BinUtility* p2BUc = p2BU->clone(); - const Trk::BinnedMaterial* plug2MatPos = new Trk::BinnedMaterial(barrelProperties,p2BU,p2lay,matITC); - const Trk::BinnedMaterial* plug2MatNeg = new Trk::BinnedMaterial(barrelProperties,p2BUc,p2lay,matITC); + const Trk::BinnedMaterial* plug2MatPos = new Trk::BinnedMaterial(barrelProperties.get(),p2BU,p2lay,matITC); + const Trk::BinnedMaterial* plug2MatNeg = new Trk::BinnedMaterial(barrelProperties.get(),p2BUc,p2lay,matITC); Trk::AlignableTrackingVolume* itcPlug2Pos = new Trk::AlignableTrackingVolume(itcP2PosTransform, align, itcPlug2Bounds, @@ -530,7 +530,7 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking std::vector<size_t> glay(1,2); std::vector<float> gsteps{float(gapi-gapBounds->halflengthZ()), float(gapi+gapBounds->halflengthZ())}; Trk::BinUtility* gp = new Trk::BinUtility(gsteps, Trk::open, Trk::binZ); - const Trk::BinnedMaterial* gpMat = new Trk::BinnedMaterial(barrelProperties,gp,glay,matITC); + const Trk::BinnedMaterial* gpMat = new Trk::BinnedMaterial(barrelProperties.get(),gp,glay,matITC); Trk::AlignableTrackingVolume* gapPos = new Trk::AlignableTrackingVolume(gapPosTransform, align, gapBounds, @@ -540,7 +540,7 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking std::vector<float> nsteps{float(-gapi-gapBounds->halflengthZ()), float(-gapi+gapBounds->halflengthZ())}; Trk::BinUtility* gn = new Trk::BinUtility(nsteps, Trk::open, Trk::binZ); - const Trk::BinnedMaterial* gnMat = new Trk::BinnedMaterial(barrelProperties,gn,glay,matITC); + const Trk::BinnedMaterial* gnMat = new Trk::BinnedMaterial(barrelProperties.get(),gn,glay,matITC); Trk::AlignableTrackingVolume* gapNeg = new Trk::AlignableTrackingVolume(gapNegTransform, align, gapBounds->clone(), @@ -795,6 +795,9 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking printCheckResult(msg(MSG::DEBUG), tileGirder); } // end of detailed output + throwIntoGarbage (std::move (barrelProperties)); + throwIntoGarbage (std::move (extendedBarrelProperties)); + return tileTrackingVolumes; } @@ -857,3 +860,10 @@ void Tile::TileVolumeBuilder::printChildren(const PVConstLink pv,int igen, Amg:: } } + + +void Tile::TileVolumeBuilder::throwIntoGarbage (std::unique_ptr<Trk::Material> mat) const +{ + std::scoped_lock lock (m_garbageMutex); + m_garbage.push_back (std::move (mat)); +}