diff --git a/AtlasGeometryCommon/GeoModelEnvelopes/CMakeLists.txt b/AtlasGeometryCommon/GeoModelEnvelopes/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..c8279c12189013ef560a82a9ebe57fe859c655a1 --- /dev/null +++ b/AtlasGeometryCommon/GeoModelEnvelopes/CMakeLists.txt @@ -0,0 +1,27 @@ +################################################################################ +# Package: GeoModelEnvelopes +################################################################################ + +# Declare the package name: +atlas_subdir( GeoModelEnvelopes ) + +# Declare the package's dependencies: +atlas_depends_on_subdirs( PUBLIC + Control/CLIDSvc + DetectorDescription/GeoModel/GeoModelKernel + DetectorDescription/GeoModel/GeoModelUtilities + PRIVATE + Control/SGTools + Control/StoreGate + DetectorDescription/GeoModel/GeoModelInterfaces + GaudiKernel ) + +# Component(s) in the package: +atlas_add_component( GeoModelEnvelopes + src/*.cxx + src/components/*.cxx + LINK_LIBRARIES GeoModelKernel GeoModelUtilities SGTools StoreGateLib SGtests GaudiKernel ) + +# Install files from the package: +atlas_install_headers( GeoModelEnvelopes ) + diff --git a/AtlasGeometryCommon/GeoModelEnvelopes/GeoModelEnvelopes/ForDetEnvelopeFactory.h b/AtlasGeometryCommon/GeoModelEnvelopes/GeoModelEnvelopes/ForDetEnvelopeFactory.h new file mode 100755 index 0000000000000000000000000000000000000000..8d9c207098e9d6bbdbd964b0fe60fd6a4c2e927a --- /dev/null +++ b/AtlasGeometryCommon/GeoModelEnvelopes/GeoModelEnvelopes/ForDetEnvelopeFactory.h @@ -0,0 +1,47 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef ForDetEnvelopeFactory_h +#define ForDetEnvelopeFactory_h 1 + +#include "GeoModelKernel/GeoVDetectorFactory.h" +#include "GeoModelEnvelopes/ForDetEnvelopeManager.h" + +class StoreGateSvc; +class AbsMaterialManager; +class GeoShape; + +class ForDetEnvelopeFactory : public GeoVDetectorFactory +{ + public: + + // Constructor: + ForDetEnvelopeFactory(StoreGateSvc *pDetStore); + + // Destructor: + ~ForDetEnvelopeFactory(); + + // Creation of geometry: + virtual void create(GeoPhysVol *world); + + // Access to the results: + virtual const ForDetEnvelopeManager * getDetectorManager() const; + + private: + + // Illegal operations: + const ForDetEnvelopeFactory & operator=(const ForDetEnvelopeFactory &right); + ForDetEnvelopeFactory(const ForDetEnvelopeFactory &right); + + // The manager: + ForDetEnvelopeManager* m_detectorManager; + + const AbsMaterialManager* m_materialManager; + StoreGateSvc* m_detectorStore; +}; + +// Class ForDetEnvelopeFactory +#endif + + diff --git a/AtlasGeometryCommon/GeoModelEnvelopes/GeoModelEnvelopes/ForDetEnvelopeManager.h b/AtlasGeometryCommon/GeoModelEnvelopes/GeoModelEnvelopes/ForDetEnvelopeManager.h new file mode 100755 index 0000000000000000000000000000000000000000..07360c412126a9f293adc48fb6bbab32d88f9706 --- /dev/null +++ b/AtlasGeometryCommon/GeoModelEnvelopes/GeoModelEnvelopes/ForDetEnvelopeManager.h @@ -0,0 +1,48 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef ForDetEnvelopeManager_h +#define ForDetEnvelopeManager_h 1 + +#include "GeoModelKernel/GeoVPhysVol.h" +#include "GeoModelKernel/GeoVDetectorManager.h" + +#include <vector> + +class ForDetEnvelopeManager : public GeoVDetectorManager +{ + public: + + // Constructor + ForDetEnvelopeManager(); + + // Destructor + ~ForDetEnvelopeManager(); + + // Access to raw geometry: + virtual unsigned int getNumTreeTops() const; + + // Access to raw geometry: + virtual PVConstLink getTreeTop(unsigned int i) const; + + // Add a Tree top: + void addTreeTop(PVLink); + + private: + + const ForDetEnvelopeManager & operator=(const ForDetEnvelopeManager &right); + ForDetEnvelopeManager(const ForDetEnvelopeManager &right); + + std::vector<PVLink> m_volume; + +}; + +#ifndef GAUDI_NEUTRAL +#include "CLIDSvc/CLASS_DEF.h" +CLASS_DEF(ForDetEnvelopeManager, 238515740, 1) +#endif + +#endif + + diff --git a/AtlasGeometryCommon/GeoModelEnvelopes/GeoModelEnvelopes/ForDetEnvelopeTool.h b/AtlasGeometryCommon/GeoModelEnvelopes/GeoModelEnvelopes/ForDetEnvelopeTool.h new file mode 100755 index 0000000000000000000000000000000000000000..3dbf177a52a588567b6c33540b711babb353a31e --- /dev/null +++ b/AtlasGeometryCommon/GeoModelEnvelopes/GeoModelEnvelopes/ForDetEnvelopeTool.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef ForDetEnvelopeTool_h +#define ForDetEnvelopeTool_h 1 + +#include "GeoModelUtilities/GeoModelTool.h" +class ForDetEnvelopeManager; + +class ForDetEnvelopeTool : public GeoModelTool +{ + public: + + // Standard Constructor + ForDetEnvelopeTool( const std::string& type, const std::string& name, const IInterface* parent ); + + // Standard Destructor + virtual ~ForDetEnvelopeTool(); + + virtual StatusCode create( StoreGateSvc* detStore ); + virtual StatusCode clear(StoreGateSvc* detStore); + private: + const ForDetEnvelopeManager* m_manager; +}; + +#endif diff --git a/AtlasGeometryCommon/GeoModelEnvelopes/cmt/requirements b/AtlasGeometryCommon/GeoModelEnvelopes/cmt/requirements new file mode 100755 index 0000000000000000000000000000000000000000..fe6473895bcafc8e537430008d4207af3858898b --- /dev/null +++ b/AtlasGeometryCommon/GeoModelEnvelopes/cmt/requirements @@ -0,0 +1,15 @@ +package GeoModelEnvelopes + +use AtlasPolicy AtlasPolicy-* +use GeoModelKernel GeoModelKernel-* DetectorDescription/GeoModel +use GeoModelUtilities GeoModelUtilities-* DetectorDescription/GeoModel +use CLIDSvc CLIDSvc-* Control + +library GeoModelEnvelopes ../src/*.cxx ../src/components/*.cxx +apply_pattern component_library + +private +use SGTools SGTools-* Control +use StoreGate StoreGate-* Control +use GaudiInterface GaudiInterface-* External +use GeoModelInterfaces GeoModelInterfaces-* DetectorDescription/GeoModel \ No newline at end of file diff --git a/AtlasGeometryCommon/GeoModelEnvelopes/src/ForDetEnvelopeFactory.cxx b/AtlasGeometryCommon/GeoModelEnvelopes/src/ForDetEnvelopeFactory.cxx new file mode 100755 index 0000000000000000000000000000000000000000..fe8583c592186e76679dd848cf29935e487b0dfe --- /dev/null +++ b/AtlasGeometryCommon/GeoModelEnvelopes/src/ForDetEnvelopeFactory.cxx @@ -0,0 +1,72 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "GeoModelEnvelopes/ForDetEnvelopeFactory.h" + + +#include "GeoModelInterfaces/AbsMaterialManager.h" +#include "GeoModelKernel/GeoMaterial.h" +#include "GeoModelKernel/GeoTube.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelKernel/GeoNameTag.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoTransform.h" +#include "GeoModelKernel/GeoShapeShift.h" +#include "GeoModelKernel/GeoShapeUnion.h" + +#include "StoreGate/StoreGateSvc.h" + +#include "GeoModelInterfaces/StoredMaterialManager.h" + +#include <vector> + + +ForDetEnvelopeFactory::ForDetEnvelopeFactory(StoreGateSvc *detStore) + : m_detectorManager(0), + m_materialManager(0), + m_detectorStore(detStore) +{ +} + +ForDetEnvelopeFactory::~ForDetEnvelopeFactory() +{ +} + +void ForDetEnvelopeFactory::create(GeoPhysVol *world) +{ + const StoredMaterialManager * materialManagerTmp = 0; + if (StatusCode::SUCCESS != m_detectorStore->retrieve(materialManagerTmp, std::string("MATERIALS"))) { + return; + } + m_materialManager = materialManagerTmp; + + // Get the materials + const GeoMaterial* air = m_materialManager->getMaterial("std::Air"); + + // Build boolean shape: union of two tubes + const GeoTube* tube1 = new GeoTube(0.,2000.*CLHEP::mm,188750.*CLHEP::mm); + GeoTube* tube2 = new GeoTube(0.,2000.*CLHEP::mm,188750.*CLHEP::mm); + HepGeom::TranslateZ3D xfRelativeA(211250.*CLHEP::mm); + HepGeom::TranslateZ3D xfRelativeC(-211250.*CLHEP::mm); + + const GeoShapeShift& envShape1 = (*tube1)<<xfRelativeA; + const GeoShapeUnion& envShape = envShape1.add((*tube2)<<xfRelativeC); + + GeoLogVol* lvEnv = new GeoLogVol("ForDetEnvelope",&envShape,air); + GeoPhysVol* pvEnv = new GeoPhysVol(lvEnv); + + GeoNameTag *tag = new GeoNameTag("ForDetEnvelope"); + world->add(tag); + world->add(pvEnv); + + m_detectorManager=new ForDetEnvelopeManager(); + m_detectorManager->addTreeTop(pvEnv); +} + + +const ForDetEnvelopeManager * ForDetEnvelopeFactory::getDetectorManager() const +{ + return m_detectorManager; +} + diff --git a/AtlasGeometryCommon/GeoModelEnvelopes/src/ForDetEnvelopeManager.cxx b/AtlasGeometryCommon/GeoModelEnvelopes/src/ForDetEnvelopeManager.cxx new file mode 100755 index 0000000000000000000000000000000000000000..24d362bb47eb63d16f3303aaa44b0f6ab6b00787 --- /dev/null +++ b/AtlasGeometryCommon/GeoModelEnvelopes/src/ForDetEnvelopeManager.cxx @@ -0,0 +1,38 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "GeoModelEnvelopes/ForDetEnvelopeManager.h" + +ForDetEnvelopeManager::ForDetEnvelopeManager() +{ + setName("ForDetEnvelope"); +} + + +ForDetEnvelopeManager::~ForDetEnvelopeManager() +{ + for (unsigned int i = 0; i < m_volume.size(); i++) { + m_volume[i]->unref(); + } +} + + +unsigned int ForDetEnvelopeManager::getNumTreeTops() const +{ + return m_volume.size(); +} + +PVConstLink ForDetEnvelopeManager::getTreeTop(unsigned int i) const +{ + return m_volume[i]; +} + +void ForDetEnvelopeManager::addTreeTop(PVLink vol) +{ + vol->ref(); + m_volume.push_back(vol); +} + + + diff --git a/AtlasGeometryCommon/GeoModelEnvelopes/src/ForDetEnvelopeTool.cxx b/AtlasGeometryCommon/GeoModelEnvelopes/src/ForDetEnvelopeTool.cxx new file mode 100755 index 0000000000000000000000000000000000000000..3ec7b37462e6b090ddda8dfe248e71911a59ce19 --- /dev/null +++ b/AtlasGeometryCommon/GeoModelEnvelopes/src/ForDetEnvelopeTool.cxx @@ -0,0 +1,82 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "GeoModelEnvelopes/ForDetEnvelopeTool.h" +#include "GeoModelEnvelopes/ForDetEnvelopeFactory.h" +#include "GeoModelEnvelopes/ForDetEnvelopeManager.h" + +#include "GeoModelInterfaces/IGeoModelSvc.h" +#include "GeoModelUtilities/GeoModelExperiment.h" +#include "GaudiKernel/IService.h" +#include "GaudiKernel/ISvcLocator.h" +#include "GaudiKernel/MsgStream.h" + +#include "StoreGate/StoreGateSvc.h" + +#include "CLIDSvc/tools/ClassID_traits.h" +#include "SGTools/DataProxy.h" + +ForDetEnvelopeTool::ForDetEnvelopeTool(const std::string& type, + const std::string& name, + const IInterface* parent): + GeoModelTool(type,name,parent), + m_manager(0) +{ +} + +ForDetEnvelopeTool::~ForDetEnvelopeTool() +{ +} + + +StatusCode ForDetEnvelopeTool::create(StoreGateSvc* detStore) +{ + MsgStream log(msgSvc(), name()); + + log << MSG::INFO << "Building Forward Detectors Envelope" << endreq; + + IGeoModelSvc *geoModel; + StatusCode sc = service ("GeoModelSvc",geoModel); + if (sc.isFailure()) { + log << MSG::FATAL << "Could not locate GeoModelSvc" << endreq; + return StatusCode::FAILURE; + } + + GeoModelExperiment* theExpt; + if (StatusCode::SUCCESS != detStore->retrieve(theExpt,"ATLAS")) { + log << MSG::ERROR + << "Could not find GeoModelExperiment ATLAS" + << endreq; + return StatusCode::FAILURE; + } + + if(0==m_manager) { + GeoPhysVol *world=&*theExpt->getPhysVol(); + + ForDetEnvelopeFactory theFactory(detStore); + theFactory.create(world); + + m_manager = theFactory.getDetectorManager(); + theExpt->addManager(m_manager); + sc = detStore->record(m_manager, + m_manager->getName()); + + if (sc.isFailure()) { + log << MSG::ERROR << "Could not register ForDetEnvelope detector manager" << endreq; + return (StatusCode::FAILURE); + } + return StatusCode::SUCCESS; + } + return StatusCode::FAILURE; +} + +StatusCode ForDetEnvelopeTool::clear(StoreGateSvc* detStore) +{ + SG::DataProxy* _proxy = detStore->proxy(ClassID_traits<ForDetEnvelopeManager>::ID(),m_manager->getName()); + if(_proxy) { + _proxy->reset(); + m_manager = 0; + } + return StatusCode::SUCCESS; +} diff --git a/AtlasGeometryCommon/GeoModelEnvelopes/src/components/GeoModelEnvelopes_entries.cxx b/AtlasGeometryCommon/GeoModelEnvelopes/src/components/GeoModelEnvelopes_entries.cxx new file mode 100755 index 0000000000000000000000000000000000000000..ecefe75b64fc6f11fb87dc8e2a9e07685bd7bca6 --- /dev/null +++ b/AtlasGeometryCommon/GeoModelEnvelopes/src/components/GeoModelEnvelopes_entries.cxx @@ -0,0 +1,8 @@ +#include "GeoModelEnvelopes/ForDetEnvelopeTool.h" +#include "GaudiKernel/DeclareFactoryEntries.h" + +DECLARE_TOOL_FACTORY(ForDetEnvelopeTool) + +DECLARE_FACTORY_ENTRIES(GeoModelEnvelopes) { + DECLARE_ALGTOOL ( ForDetEnvelopeTool ) +} diff --git a/AtlasGeometryCommon/GeoModelEnvelopes/src/components/GeoModelEnvelopes_load.cxx b/AtlasGeometryCommon/GeoModelEnvelopes/src/components/GeoModelEnvelopes_load.cxx new file mode 100755 index 0000000000000000000000000000000000000000..bbd8388f64c0504a91dba7ccd6868da0190b68b9 --- /dev/null +++ b/AtlasGeometryCommon/GeoModelEnvelopes/src/components/GeoModelEnvelopes_load.cxx @@ -0,0 +1,4 @@ +#include "GaudiKernel/LoadFactoryEntries.h" + +LOAD_FACTORY_ENTRIES(GeoModelEnvelopes) +