diff --git a/DetectorDescription/IRegionSelector/IRegionSelector/RegSelCondData.h b/DetectorDescription/IRegionSelector/IRegionSelector/RegSelCondData.h index a6533b03772bbb44c72aeabd037598ba66f5e851..dd2c34cd84006064854b4cabfe9c4fbd89937362 100644 --- a/DetectorDescription/IRegionSelector/IRegionSelector/RegSelCondData.h +++ b/DetectorDescription/IRegionSelector/IRegionSelector/RegSelCondData.h @@ -18,6 +18,7 @@ #define REGSELCONDDATA_H #include <iostream> +#include <memory> template<typename T> @@ -25,15 +26,15 @@ class RegSelCondData { public: - RegSelCondData( const T& t ) : m_payload(t) { } - + RegSelCondData( std::unique_ptr<T> t ) : m_payload(std::move(t)) { } + virtual ~RegSelCondData() { } - - const T* payload() const { return &m_payload; } /// could return the actual payload reference, but have everything using pointers + + const T* payload() const { return m_payload.get(); } /// could return the actual payload reference, but have everything using pointers protected: - T m_payload; + std::unique_ptr<T> m_payload; }; diff --git a/DetectorDescription/RegionSelector/python/RegSelToolConfig.py b/DetectorDescription/RegionSelector/python/RegSelToolConfig.py index 545ff35a18a661e6158f993fea68f4ebd72ae75e..8b92557bac07e2cca49d993355f90614fad10f15 100644 --- a/DetectorDescription/RegionSelector/python/RegSelToolConfig.py +++ b/DetectorDescription/RegionSelector/python/RegSelToolConfig.py @@ -11,33 +11,34 @@ # - -def _makeSiRegSelTool(detector, enable) : +def _makeRegSelTool( detector, enable, CondAlgConstructor ) : from RegionSelector.RegionSelectorConf import RegSelTool tool = RegSelTool(name="RegSelTool_"+detector) - # should we enable the look up table access ? + # should we enable the look up table access for this subsystem ? if ( enable ) : - + # add the lookup table to retrieve - + tool.RegSelLUT = "RegSelLUTCondData_"+detector + tool.Initialised = True # add the conditions algorithm to create the lookup table from AthenaCommon.AlgSequence import AthSequencer condseq = AthSequencer('AthCondSeq') - if not hasattr(condseq, 'RegSelCondAlg_'+detector): - from InDetRegionSelector.InDetRegionSelectorConf import SiRegSelCondAlg - CondAlg = SiRegSelCondAlg( name = ("RegSelCondAlg_"+detector), - ManagerName = detector, - PrintTable = False) - CondAlg.RegSelLUT = "RegSelLUTCondData_"+detector + if not hasattr( condseq, 'RegSelCondAlg_'+detector ) : + CondAlg = CondAlgConstructor( name = ("RegSelCondAlg_"+detector), + ManagerName = detector, + PrintTable = False, + RegSelLUT = ("RegSelLUTCondData_"+detector) ) + condseq += CondAlg + else: # detector not configured so don't enable # lookup table access @@ -48,50 +49,71 @@ def _makeSiRegSelTool(detector, enable) : +# inner detector toold + def makeRegSelTool_Pixel() : from AthenaCommon.DetFlags import DetFlags enabled = DetFlags.detdescr.pixel_on() - return _makeSiRegSelTool( 'Pixel', enabled ) - + from InDetRegionSelector.InDetRegionSelectorConf import SiRegSelCondAlg + return _makeRegSelTool( 'Pixel', enabled, SiRegSelCondAlg ) def makeRegSelTool_SCT() : from AthenaCommon.DetFlags import DetFlags enabled = DetFlags.detdescr.SCT_on() - return _makeSiRegSelTool( 'SCT', enabled ) - + from InDetRegionSelector.InDetRegionSelectorConf import SiRegSelCondAlg + return _makeRegSelTool( 'SCT', enabled, SiRegSelCondAlg ) def makeRegSelTool_TRT() : - from AthenaCommon.DetFlags import DetFlags enabled = DetFlags.detdescr.TRT_on() - - from RegionSelector.RegionSelectorConf import RegSelTool - tool = RegSelTool(name="RegSelTool_TRT") - - # should we enable the look up table access ? + from InDetRegionSelector.InDetRegionSelectorConf import TRT_RegSelCondAlg + return _makeRegSelTool( 'TRT', enabled, TRT_RegSelCondAlg ) - if ( enabled ) : - # add the lookup table to retrieve +# muon spectrimeter tools - tool.RegSelLUT = "RegSelLUTCondData_TRT" +def makeRegSelTool_MDT() : + from AthenaCommon.DetFlags import DetFlags + enabled = DetFlags.detdescr.MDT_on() + from MuonRegionSelector.MuonRegionSelectorConf import MDT_RegSelCondAlg + return _makeRegSelTool( "MDT", enabled, MDT_RegSelCondAlg ) - # add the conditions algorithm to create the lookup table +def makeRegSelTool_RPC() : + from AthenaCommon.DetFlags import DetFlags + enabled = DetFlags.detdescr.RPC_on() + from MuonRegionSelector.MuonRegionSelectorConf import RPC_RegSelCondAlg + return _makeRegSelTool( "RPC", enabled, RPC_RegSelCondAlg ) - from AthenaCommon.AlgSequence import AthSequencer - condseq = AthSequencer('AthCondSeq') - - if not hasattr(condseq, 'RegSelCondAlg_TRT'): - from InDetRegionSelector.InDetRegionSelectorConf import TRT_RegSelCondAlg - CondAlg = TRT_RegSelCondAlg( name = "RegSelCondAlg_TRT", - ManagerName = "TRT", - PrintTable = False) - CondAlg.RegSelLUT = "RegSelLUTCondData_TRT" - condseq += CondAlg - else: - # detector subsystem not configured so don't enable - # lookup table access +def makeRegSelTool_TGC() : + from AthenaCommon.DetFlags import DetFlags + enabled = DetFlags.detdescr.TGC_on() + from MuonRegionSelector.MuonRegionSelectorConf import TGC_RegSelCondAlg + return _makeRegSelTool( "TGC", enabled, TGC_RegSelCondAlg ) + +def makeRegSelTool_CSC() : + from AthenaCommon.DetFlags import DetFlags + enabled = DetFlags.detdescr.CSC_on() + from MuonRegionSelector.MuonRegionSelectorConf import CSC_RegSelCondAlg + return _makeRegSelTool( "CSC", enabled, CSC_RegSelCondAlg ) + + +# new small wheel + +def makeRegSelTool_MM() : + from AtlasGeoModel.MuonGMJobProperties import MuonGeometryFlags + from AthenaCommon.DetFlags import DetFlags + enabled = False + if MuonGeometryFlags.hasMM() : + enabled = DetFlags.detdescr.Micromegas_on() + from MuonRegionSelector.MuonRegionSelectorConf import MM_RegSelCondAlg + return _makeRegSelTool( "MM", enabled, MM_RegSelCondAlg ) + +def makeRegSelTool_sTGC() : + from AtlasGeoModel.MuonGMJobProperties import MuonGeometryFlags + from AthenaCommon.DetFlags import DetFlags + enabled = False + if MuonGeometryFlags.hasSTGC() : + enabled = DetFlags.detdescr.sTGC_on() + from MuonRegionSelector.MuonRegionSelectorConf import sTGC_RegSelCondAlg + return _makeRegSelTool( "sTGC", enabled, sTGC_RegSelCondAlg ) - tool.Initialised = False - - return tool diff --git a/DetectorDescription/RegionSelector/src/RegSelTool.cxx b/DetectorDescription/RegionSelector/src/RegSelTool.cxx index 60fa55581c079c02d70db4aa7757cf871a1d0ccd..7a314e7b332624adf9508fc5f9a07e49117c633e 100644 --- a/DetectorDescription/RegionSelector/src/RegSelTool.cxx +++ b/DetectorDescription/RegionSelector/src/RegSelTool.cxx @@ -7,7 +7,7 @@ ** @date Sun 22 Sep 2019 10:21:50 BST ** ** - ** Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + ** Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration **/ @@ -27,12 +27,13 @@ //! Constructor RegSelTool::RegSelTool( const std::string& type, const std::string& name, const IInterface* parent ) : base_class( type, name, parent ), - m_initialised(true), - m_dumpTable(false) + m_initialised(false), + m_dumpTable(false), + m_rpcflag(false) { //! Declare properties - declareProperty( "WriteTable", m_dumpTable, "write out maps to files for debugging" ); - declareProperty( "Initialised", m_initialised=true, "flag to determine whether the corresponding subsystem is initilised" ); + declareProperty( "WriteTable", m_dumpTable, "write out maps to files for debugging" ); + declareProperty( "Initialised", m_initialised=false, "flag to determine whether the corresponding subsystem is initilised" ); } @@ -43,20 +44,19 @@ RegSelTool::~RegSelTool() { } const RegSelSiLUT* RegSelTool::lookup() const { if ( !m_initialised ) return nullptr; SG::ReadCondHandle< RegSelCondData<RegSelSiLUT> > table_handle( m_tableKey ); - // ATH_CHECK( table_handle.isSuccess() ); const RegSelSiLUT* lookup_table = (*table_handle)->payload(); - return lookup_table; - + return lookup_table; } - StatusCode RegSelTool::initialize() { - if ( m_initialised ) { - ATH_CHECK( m_tableKey.initialize() ); - ATH_MSG_INFO( "Initialising " << name() << "\tkey " << m_tableKey ); + ATH_CHECK( m_tableKey.initialize() ); + ATH_MSG_DEBUG( "Initialising RegSelTool " << name() << "\ttable: " << m_tableKey ); + if ( !m_initialised ) { + ATH_MSG_WARNING( "Lookup table will not be iitialised " << name() << "\tkey " << m_tableKey ); } + if ( name().find( "RPC") != std::string::npos ) m_rpcflag = true; return StatusCode::SUCCESS; } @@ -68,12 +68,14 @@ StatusCode RegSelTool::finalize() { } -bool RegSelTool::handle() { - return true; +void RegSelTool::cleanup( std::vector<IdentifierHash>& idvec ) const { + for ( size_t i=idvec.size() ; i-- ; ) idvec[i] = IdentifierHash( ((unsigned)idvec[i]) & 0xfff ); + RegSelSiLUT::removeDuplicates( idvec ); } + // new RegionSelector interface for the Innner Detector void RegSelTool::getRoIData( const IRoiDescriptor& roi, std::vector<const RegSelModule*>& modules ) const { @@ -113,6 +115,8 @@ void RegSelTool::HashIDList( const IRoiDescriptor& roi, std::vector<IdentifierHa const RegSelSiLUT* lookuptable = lookup(); if ( lookuptable ) lookuptable->getHashList( roitmp, idlist ); + if ( m_rpcflag ) cleanup( idlist ); + } @@ -136,6 +140,8 @@ void RegSelTool::HashIDList( long layer, const IRoiDescriptor& roi, std::vector< const RegSelSiLUT* lookuptable = lookup(); if ( lookuptable ) lookuptable->getHashList( roitmp, layer, idlist ); + if ( m_rpcflag ) cleanup( idlist ); + } @@ -202,6 +208,7 @@ void RegSelTool::ROBIDList( long layer, const IRoiDescriptor& roi, std::vector<u void RegSelTool::HashIDList( std::vector<IdentifierHash>& idlist ) const { const RegSelSiLUT* lookuptable = lookup(); if ( lookuptable ) lookuptable->getHashList( idlist ); + if ( m_rpcflag ) cleanup( idlist ); } /// fullscan hashid for specific layer @@ -209,6 +216,7 @@ void RegSelTool::HashIDList( std::vector<IdentifierHash>& idlist ) const { void RegSelTool::HashIDList( long layer, std::vector<IdentifierHash>& idlist ) const { const RegSelSiLUT* lookuptable = lookup(); if ( lookuptable ) lookuptable->getHashList( layer, idlist ); + if ( m_rpcflag ) cleanup( idlist ); } /// full scan robid diff --git a/DetectorDescription/RegionSelector/src/RegSelTool.h b/DetectorDescription/RegionSelector/src/RegSelTool.h index 4a7f728bb965eafc9eade223e71135272ab9d921..c34d06220cff5ba4b13c71945287a541639bb4b8 100644 --- a/DetectorDescription/RegionSelector/src/RegSelTool.h +++ b/DetectorDescription/RegionSelector/src/RegSelTool.h @@ -7,7 +7,7 @@ /// /// @author Mark Sutton /// -/// Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +/// Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration /// #ifndef REGIONSELECTOR_REGSELTOOL_H @@ -35,10 +35,9 @@ class RegSelSiLUT; class IInterface; - class RegSelTool : public extends<AthAlgTool, IRegSelTool> { - public: +public: /** @c Standard constructor for tool (obviously). */ @@ -74,9 +73,11 @@ class RegSelTool : public extends<AthAlgTool, IRegSelTool> { protected: // full scan + virtual void HashIDList( std::vector<IdentifierHash>& idlist ) const; // full scan for a specific layer + virtual void HashIDList( long layer, std::vector<IdentifierHash>& idlist ) const; // Methods to obtain the rob id list @@ -90,12 +91,13 @@ protected: // get list of modules void getRoIData( const IRoiDescriptor& roi, std::vector<const RegSelModule*>& modulelist ) const; - //! @method handle, handles the actual lookup table - bool handle(); - //! @method lookup, actually retrieve the lookup table as conditions data - might combine with handle() const RegSelSiLUT* lookup() const; +protected: + + void cleanup( std::vector<IdentifierHash>& idvec ) const; + private: //! Flag to determine whether it has yet been initialised @@ -106,7 +108,15 @@ private: //! Flag to dump loaded table in data file. BooleanProperty m_dumpTable; - SG::ReadCondHandleKey<RegSelLUTCondData> m_tableKey{ this, "RegSelLUT", "RegSelLUTCondData", "Region Selector lookup table" }; + SG::ReadCondHandleKey<RegSelLUTCondData> m_tableKey{ this, "RegSelLUT", "Tool_Not_Initalised", "Region Selector lookup table" }; + + /// flag to avoid the need for a separate rpc lookup table class + /// FixMe: this flag may be replaced by custom derived RegSelTool + /// class for the RPC. The tools are retrieved only via + /// the IRegSelTool interface so this would also be + /// transaprent to the user + + bool m_rpcflag; }; diff --git a/DetectorDescription/RegionSelector/src/components/RegionSelector_entries.cxx b/DetectorDescription/RegionSelector/src/components/RegionSelector_entries.cxx index 60ec75591704ceb7fb04a595c82da2c3db566f12..4aa5fb2f1b760cb08880efeada343a54b9f45d37 100644 --- a/DetectorDescription/RegionSelector/src/components/RegionSelector_entries.cxx +++ b/DetectorDescription/RegionSelector/src/components/RegionSelector_entries.cxx @@ -1,4 +1,5 @@ #include "../RegSelSvc.h" + #include "../RegSelTool.h" DECLARE_COMPONENT( RegSelSvc ) diff --git a/InnerDetector/InDetDetDescr/InDetRegionSelector/src/SiRegSelCondAlg.cxx b/InnerDetector/InDetDetDescr/InDetRegionSelector/src/SiRegSelCondAlg.cxx index 87fca7134c30ce4eddd28cad392549119448991c..a00d9e024a93aee74437e7d4b2995a39fec9e6ce 100644 --- a/InnerDetector/InDetDetDescr/InDetRegionSelector/src/SiRegSelCondAlg.cxx +++ b/InnerDetector/InDetDetDescr/InDetRegionSelector/src/SiRegSelCondAlg.cxx @@ -33,7 +33,7 @@ SiRegSelCondAlg::SiRegSelCondAlg(const std::string& name, ISvcLocator* pSvcLocat AthReentrantAlgorithm( name, pSvcLocator ), m_managerName(""), m_printTable(false), - m_sctCablingToolInc("SCT_CablingToolInc") + m_sctCablingTool("SCT_CablingTool") { ATH_MSG_DEBUG( "SiRegSelCondAlg::SiRegSelCondAlg() " << name ); declareProperty( "PrintTable", m_printTable=false ); @@ -46,7 +46,8 @@ SiRegSelCondAlg::SiRegSelCondAlg(const std::string& name, ISvcLocator* pSvcLocat StatusCode SiRegSelCondAlg::initialize() { ATH_MSG_DEBUG("SiRegSelCondAlg::initialize() "); - ATH_CHECK(m_condCablingKey.initialize()); + ATH_CHECK(m_pixCablingKey.initialize()); + ATH_CHECK(m_sctCablingKey.initialize()); ATH_CHECK(m_tableKey.initialize()); ATH_MSG_INFO("SiRegSelCondAlg::initialize() " << m_tableKey ); return StatusCode::SUCCESS; @@ -76,45 +77,39 @@ StatusCode SiRegSelCondAlg::execute(const EventContext& ctx) const ATH_MSG_DEBUG( "Found Manager " << m_managerName ); } - /// Since there are only really ~ 10 lines that would be different between the - /// SCT and pixel versions of this code, we chose to do everything in one class - /// Sadly, the pixel and SCT cabling don't inherit from the same interface - /// so we can't get the cabling using a generic call, and have to have separate - /// code blocks for each - /// As such, we need to set the cabling from inside conditional blocks, so have - /// to create the cabling as pointers so that we can set inside the blocks and - /// subsequently access them outside the blocks - - /// FIXME: since we store the LUT as conditions data, we need an EventIDRange for - /// the WriteCondHandle, but the SCT cabling is not yet conditions data so - /// have to get the pixelCabling for the SCT case also so that the - /// EventIDRange can be extracted - /// Once the SCT cabling is iself conditions data, we will be able to get - /// the corresponding EventIDRange from there + /// Need to get the SCT cabling conditions for the EventIDRange, but + /// still need to use the SCT_CablingTool to get the rob ids std::unique_ptr<SG::ReadCondHandle<PixelCablingCondData> > pixCabling; + std::unique_ptr<SG::ReadCondHandle<SCT_CablingData> > sctCabling; EventIDRange id_range; if (!manager->isPixel()) { // SCT - if (m_sctCablingToolInc.retrieve().isFailure()) { - msg(MSG::ERROR) << "Can't get the SCT_CablingToolInc." << endmsg; + sctCabling = std::make_unique<SG::ReadCondHandle<SCT_CablingData> >( m_sctCablingKey, ctx ); + if( !sctCabling->range( id_range ) ) { + ATH_MSG_ERROR("Failed to retrieve validity range for " << sctCabling->key()); + return StatusCode::FAILURE; + } + + /// keep explicit failure check for enhanced error reporting + if (m_sctCablingTool.retrieve().isFailure()) { + msg(MSG::ERROR) << "Can't get the SCT_CablingTool" << endmsg; return StatusCode::FAILURE; } } - // else { - pixCabling = std::make_unique<SG::ReadCondHandle<PixelCablingCondData> >( m_condCablingKey, ctx ); - + else { // PIXEL + pixCabling = std::make_unique<SG::ReadCondHandle<PixelCablingCondData> >( m_pixCablingKey, ctx ); if( !pixCabling->range( id_range ) ) { ATH_MSG_ERROR("Failed to retrieve validity range for " << pixCabling->key()); return StatusCode::FAILURE; } - // } + } - RegSelSiLUT* rd; + std::unique_ptr<RegSelSiLUT> rd; - if ( manager->isPixel() ) rd = new RegSelSiLUT(RegSelSiLUT::PIXEL); - else rd = new RegSelSiLUT(RegSelSiLUT::SCT); + if ( manager->isPixel() ) rd = std::make_unique<RegSelSiLUT>(RegSelSiLUT::PIXEL); + else rd = std::make_unique<RegSelSiLUT>(RegSelSiLUT::SCT); InDetDD::SiDetectorElementCollection::const_iterator iter = manager->getDetectorElementBegin(); @@ -163,7 +158,7 @@ StatusCode SiRegSelCondAlg::execute(const EventContext& ctx) const if ( sctId!=0 ) { barrelEC = sctId->barrel_ec(element->identify()); layerDisk = sctId->layer_disk(element->identify()); - robId=m_sctCablingToolInc->getRobIdFromOfflineId(element->identify()); + robId=m_sctCablingTool->getRobIdFromOfflineId(element->identify()); } else { ATH_MSG_ERROR("Could not get SCT_ID for " << element->getIdHelper() ); @@ -195,12 +190,9 @@ StatusCode SiRegSelCondAlg::execute(const EventContext& ctx) const rd->initialise(); // write out new new LUT to a file if need be - if ( m_printTable ) { - if ( manager->isPixel() ) rd->write("RegSelLUT_Pixel"); - else rd->write("RegSelLUT_SCT"); - } + if ( m_printTable ) rd->write( name()+".map" ); - RegSelLUTCondData* rcd = new RegSelLUTCondData( *rd ); + RegSelLUTCondData* rcd = new RegSelLUTCondData( std::move(rd) ); try { SG::WriteCondHandle<RegSelLUTCondData> lutCondData( m_tableKey, ctx ); diff --git a/InnerDetector/InDetDetDescr/InDetRegionSelector/src/SiRegSelCondAlg.h b/InnerDetector/InDetDetDescr/InDetRegionSelector/src/SiRegSelCondAlg.h index fc433a9e809c7619208703edf6f37a88318a8ba0..1998a05d65fa48379b07da56d436fe207536039c 100755 --- a/InnerDetector/InDetDetDescr/InDetRegionSelector/src/SiRegSelCondAlg.h +++ b/InnerDetector/InDetDetDescr/InDetRegionSelector/src/SiRegSelCondAlg.h @@ -21,6 +21,7 @@ #include "PixelConditionsData/PixelCablingCondData.h" +#include "SCT_Cabling/SCT_CablingData.h" #include "StoreGate/ReadCondHandleKey.h" #include "StoreGate/WriteCondHandleKey.h" @@ -49,11 +50,16 @@ public: /// Sadly the PIxel and SCT cabling are different classes so need both, /// even if only one is to be used - ToolHandle<ISCT_CablingTool> m_sctCablingToolInc; // This class accesses SCT cabling during initialization. + ToolHandle<ISCT_CablingTool> m_sctCablingTool; // This class accesses SCT cabling during table creation - SG::ReadCondHandleKey<PixelCablingCondData> m_condCablingKey + SG::ReadCondHandleKey<SCT_CablingData> m_sctCablingKey + {this, "SCT_CablingData", "SCT_CablingData", "SCT cabling key"}; + + SG::ReadCondHandleKey<PixelCablingCondData> m_pixCablingKey {this, "PixelCablingCondData", "PixelCablingCondData", "Pixel cabling key"}; + + /// Output conditions object SG::WriteCondHandleKey<RegSelLUTCondData> m_tableKey { this, "RegSelLUT", "RegSelLUTCondData", "Region Selector lookup table" }; diff --git a/InnerDetector/InDetDetDescr/InDetRegionSelector/src/TRT_RegSelCondAlg.cxx b/InnerDetector/InDetDetDescr/InDetRegionSelector/src/TRT_RegSelCondAlg.cxx index f701c83b95ad61fa036e1697d3563dfd942045ac..fd8f9e758ed637b66adf64d1772bd896c63889a3 100644 --- a/InnerDetector/InDetDetDescr/InDetRegionSelector/src/TRT_RegSelCondAlg.cxx +++ b/InnerDetector/InDetDetDescr/InDetRegionSelector/src/TRT_RegSelCondAlg.cxx @@ -130,17 +130,15 @@ StatusCode TRT_RegSelCondAlg::execute(const EventContext& ctx) const return StatusCode::FAILURE; } - - //----------------------------------------------------- - unsigned int maxHash = idHelper->straw_layer_hash_max(); - // // Try and iterate over all elements. // There is no iterator but we can get the elements via the idHash. - // - // MS create the new TRT look up table - RegSelSiLUT *rd = new RegSelSiLUT(RegSelSiLUT::TRT); + unsigned int maxHash = idHelper->straw_layer_hash_max(); + + // create the new TRT look up table + + std::unique_ptr<RegSelSiLUT> rd = std::make_unique<RegSelSiLUT>(RegSelSiLUT::TRT); constexpr double twoPi=2.*M_PI; constexpr double InnerRadiusOfStraw = 2.; //hardcoded. No method? (it will NEVER change anyway) @@ -229,9 +227,9 @@ StatusCode TRT_RegSelCondAlg::execute(const EventContext& ctx) const rd->initialise(); // write out new new LUT to a file if need be - if ( m_printTable ) rd->write("RegSelLUT_TRT"); + if ( m_printTable ) rd->write( name()+".map" ); - RegSelLUTCondData* rcd = new RegSelLUTCondData( *rd ); + RegSelLUTCondData* rcd = new RegSelLUTCondData( std::move(rd) ); try { SG::WriteCondHandle<RegSelLUTCondData> lutCondData( m_tableKey, ctx ); diff --git a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/CMakeLists.txt b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/CMakeLists.txt index 558400cab476c2919dd7de8189af3a7b82443e8e..bbd48c67f079e4dbeba968b0e34027be5c83ff72 100644 --- a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/CMakeLists.txt +++ b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/CMakeLists.txt @@ -13,8 +13,9 @@ atlas_depends_on_subdirs( PUBLIC GaudiKernel PRIVATE DetectorDescription/Identifier + DetectorDescription/IRegionSelector + MuonSpectrometer/MuonCablings/MuonCablingData MuonSpectrometer/MuonCablings/CSCcabling - MuonSpectrometer/MuonCablings/MuonMDT_Cabling MuonSpectrometer/MuonCablings/MuonTGC_Cabling MuonSpectrometer/MuonCablings/RPCcablingInterface MuonSpectrometer/MuonDetDescr/MuonReadoutGeometry @@ -31,8 +32,10 @@ atlas_add_component( MuonRegionSelector INCLUDE_DIRS ${CLHEP_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS} LINK_LIBRARIES ${CLHEP_LIBRARIES} ${EIGEN_LIBRARIES} AthenaBaseComps GeoPrimitives RegSelLUT GaudiKernel Identifier CSCcablingLib + MuonCablingData MuonMDT_CablingLib MuonTGC_CablingLib RPCcablingInterfaceLib MuonReadoutGeometry + MuonAGDDDescription ) # Install files from the package: diff --git a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/CSC_RegSelCondAlg.cxx b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/CSC_RegSelCondAlg.cxx new file mode 100644 index 0000000000000000000000000000000000000000..315462d996d0cf86106c6fc2c25536d0d7981813 --- /dev/null +++ b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/CSC_RegSelCondAlg.cxx @@ -0,0 +1,360 @@ +/** + ** @file CSC_RegSelCondAlg.cxx + ** + ** conditions algorithm to create the Si detector + ** lookup tables + ** + ** @author sutt + ** @date Sun 22 Sep 2019 10:21:50 BST + ** + ** + ** Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + **/ + + +#include "GaudiKernel/EventIDRange.h" +#include "StoreGate/WriteCondHandle.h" + +#include "CLHEP/Units/SystemOfUnits.h" +#include "Identifier/IdentifierHash.h" + +#include <iostream> +#include <fstream> +#include <string> +#include <cmath> + +#include "MuonCablingData/MuonMDT_CablingMap.h" +#include "CSCcabling/CSCcablingSvc.h" + +#include "MuonReadoutGeometry/MuonDetectorManager.h" +#include "MuonReadoutGeometry/MuonReadoutElement.h" +#include "MuonReadoutGeometry/MdtReadoutElement.h" +#include "MuonReadoutGeometry/CscReadoutElement.h" +#include "MuonReadoutGeometry/RpcReadoutElement.h" +#include "MuonReadoutGeometry/TgcReadoutElement.h" +#include "MuonReadoutGeometry/RpcReadoutSet.h" +#include "MuonReadoutGeometry/MuonStation.h" + + +#include "CSC_RegSelCondAlg.h" + + +CSC_RegSelCondAlg::CSC_RegSelCondAlg(const std::string& name, ISvcLocator* pSvcLocator): + MuonRegSelCondAlg( name, pSvcLocator ) +{ + ATH_MSG_DEBUG( "CSC_RegSelCondAlg::CSC_RegSelCondAlg() " << name ); +} + + + + + +std::unique_ptr<RegSelSiLUT> CSC_RegSelCondAlg::createTable( const MuonMDT_CablingMap* /* mdtCabling */ ) const { + + /// now get the CSC cabling service ... + + const CSCcablingSvc* cabling = nullptr; + + if ( service( "CSCcablingSvc", cabling ).isFailure() ) { + ATH_MSG_ERROR( "Could not retrieve CSC cabling for " << name() ); + return std::unique_ptr<RegSelSiLUT>(nullptr); + } + + /// get the CSC detector manager + + const MuonGM::MuonDetectorManager* manager = nullptr; + + if ( (detStore()->retrieve( manager ).isFailure() ) ) { + ATH_MSG_ERROR( "Could not retrieve CSC Manager for " << name() ); + return std::unique_ptr<RegSelSiLUT>(nullptr); + } + + const CscIdHelper* helper = manager->cscIdHelper(); + + std::vector<Identifier>::const_iterator idfirst = helper->module_begin(); + std::vector<Identifier>::const_iterator idlast = helper->module_end(); + + const IdContext ModuleContext = helper->module_context(); + + ATH_MSG_DEBUG("createTable()"); + + std::unique_ptr<RegSelSiLUT> lut = std::make_unique<RegSelSiLUT>(); + + + + for ( std::vector<Identifier>::const_iterator itr=idfirst ; itr!=idlast ; itr++ ) { + Identifier Id = *itr; + IdentifierHash Idhash; + + helper->get_hash(Id, Idhash, &ModuleContext); + + ExpandedIdentifier exp_id; + if (helper->get_expanded_id( Id, exp_id, &ModuleContext)) { + ATH_MSG_DEBUG("Failed retrieving ExpandedIdentifier for PRD Identifier = " << Id.getString() << ". Skipping to the next PRD."); + continue; + } + + int detid = ( exp_id[2]<0 ? -1 : 1 ); + int layerid = exp_id[1]+1; + + + // retrieve CscReadoutElement + + Identifier Id2ndLayer; + int chamberLayer = 2; + const MuonGM::CscReadoutElement *csc = manager->getCscReadoutElement(Id); + if (csc == NULL) { + + // std::cout << "Csc Readout Element not found for this Id ---- try 2nd layer"<<std::endl; + Id2ndLayer = helper->parentID(Id); + Id2ndLayer = helper->channelID(Id2ndLayer, chamberLayer, 1, 0, 1); + csc = manager->getCscReadoutElement(Id2ndLayer); + if (csc == NULL) + { + // std::cout << "Csc Readout Element not found for 2nd layer too ---- skip"<<std::endl; + continue; + } + } + + double eta_min = 99999999.; + double eta_max = -99999999.; + double phi_min = 999999.; + double phi_max = -999999.; + + double zmin = 999999999; + double zmax = -999999999; + + double rmin = 0; + double rmax = 0; + + double phi_test = 0.; + Identifier Id_phi_max; + Identifier Id_phi_min; + Identifier Id_eta_max; + Identifier Id_eta_min; + + // only use the extreme chamber layers and wirelayers + + int chlayer_inc = helper->chamberLayerMax(Id)-1; + if ( chlayer_inc<1 ) chlayer_inc = 1; + for ( int chlayer=1 ; chlayer<=helper->chamberLayerMax(Id) ; chlayer+=chlayer_inc ) { + + + int wlayer_inc = helper->wireLayerMax(Id)-1; + if ( wlayer_inc<1 ) wlayer_inc = 1; + for ( int wlayer=1 ; wlayer<=helper->wireLayerMax(Id) ; wlayer+=wlayer_inc ){ + + for ( int phis=1 ; phis<=csc->NphiStrips(wlayer) ; phis++ ) { + + + Identifier phis_id = helper->channelID(Id, chlayer, wlayer, 1, phis); + Amg::Vector3D phis_x = csc->localStripPos(phis_id); + double phis_lenght = csc->stripLength(phis_id); + + // positions of the strip endpoints + + Amg::Vector3D phis_x1 = phis_x; + Amg::Vector3D phis_x2 = phis_x; + + //phis_x1.setZ(phis_x.z()-phis_lenght/2.0); + //phis_x2.setZ(phis_x.z()+phis_lenght/2.0); + phis_x1[2] = phis_x.z()-phis_lenght/2.0; + phis_x2[2] = phis_x.z()+phis_lenght/2.0; + + Amg::Vector3D gphis_x1 = csc->globalPos(phis_x1); + Amg::Vector3D gphis_x2 = csc->globalPos(phis_x2); + + phi_test=gphis_x1.phi(); + // for detector in (-0.25,0.25) phi interval use +-3,14 phi interval + // if(!(aux1==51 && aux3==1))if (phi_test < 0) phi_test += 2.*M_PI; + if(!(exp_id[1]==51 && exp_id[3]==1))if (phi_test < 0) phi_test += 2.*M_PI; + + + if ( zmin>gphis_x1.z() ) zmin = gphis_x1.z(); + if ( zmax<gphis_x1.z() ) zmax = gphis_x1.z(); + + if ( rmin==0 || rmin>gphis_x1.perp() ) rmin = gphis_x1.perp(); + if ( rmax==0 || rmax<gphis_x1.perp() ) rmax = gphis_x1.perp(); + + if ( zmin>gphis_x2.z() ) zmin = gphis_x2.z(); + if ( zmax<gphis_x2.z() ) zmax = gphis_x2.z(); + + if ( rmin==0 || rmin>gphis_x2.perp() ) rmin = gphis_x2.perp(); + if ( rmax==0 || rmax<gphis_x2.perp() ) rmax = gphis_x2.perp(); + + // position of the strip centre + + + Amg::Vector3D gphis_x = csc->globalPos(phis_x); + + if ( rmin==0 || rmin>gphis_x.perp() ) rmin = gphis_x.perp(); + if ( rmax==0 || rmax<gphis_x.perp() ) rmax = gphis_x.perp(); + + // phi + if(phi_test > phi_max){ + Id_phi_max=phis_id; + phi_max=phi_test; + } + if(phi_test < phi_min){ + Id_phi_min=phis_id; + phi_min=phi_test; + } + // eta + if(gphis_x1.eta() > eta_max) { + Id_eta_max=phis_id; + eta_max=gphis_x1.eta(); + } + if(gphis_x1.eta() < eta_min) { + Id_eta_min=phis_id; + eta_min=gphis_x1.eta(); + } + + phi_test=gphis_x2.phi(); + // for detector in (-0.25,0.25) phi interval use +-3,14 phi interval + // if(!(aux1==51 && aux3==1)) if (phi_test < 0) phi_test += 2.*M_PI; + if(!(exp_id[1]==51 && exp_id[3]==1)) if (phi_test < 0) phi_test += 2.*M_PI; + + // phi + if(phi_test > phi_max) { + Id_phi_max=phis_id; + phi_max=phi_test; + } + if(phi_test < phi_min) { + Id_phi_min=phis_id; + phi_min=phi_test; + } + // eta + if(gphis_x2.eta() > eta_max) { + Id_eta_max=phis_id; + eta_max=gphis_x2.eta(); + } + if(gphis_x2.eta() < eta_min) { + Id_eta_min=phis_id; + eta_min=gphis_x2.eta(); + } + + } + + // only use the extreme and middle strips + + int eta_inc = csc->NetaStrips(wlayer)/2; + if ( eta_inc<1 ) eta_inc = 1; + for ( int etas=1 ; etas<=csc->NetaStrips(wlayer) ; etas+=eta_inc ) { + + + Identifier etas_id = helper->channelID(Id, chlayer, wlayer, 0, etas); + Amg::Vector3D etas_x = csc->localStripPos(etas_id); + double etas_lenght = csc->stripLength(etas_id); + + // strip endpoints + + Amg::Vector3D etas_x1 = etas_x; + Amg::Vector3D etas_x2 = etas_x; + + //etas_x1.setY(etas_x.y()-etas_lenght/2.0); + //etas_x2.setY(etas_x.y()+etas_lenght/2.0); + etas_x1[1] = etas_x.y()-etas_lenght/2.0; + etas_x2[1] = etas_x.y()+etas_lenght/2.0; + + Amg::Vector3D getas_x1 = csc->globalPos(etas_x1); + Amg::Vector3D getas_x2 = csc->globalPos(etas_x2); + + if ( zmin>getas_x1.z() ) zmin = getas_x1.z(); + if ( zmax<getas_x1.z() ) zmax = getas_x1.z(); + + if ( zmin>getas_x2.z() ) zmin = getas_x2.z(); + if ( zmax<getas_x2.z() ) zmax = getas_x2.z(); + + if ( rmin==0 || rmin>getas_x1.perp() ) rmin = getas_x1.perp(); + if ( rmax==0 || rmax<getas_x1.perp() ) rmax = getas_x1.perp(); + + if ( rmin==0 || rmin>getas_x2.perp() ) rmin = getas_x2.perp(); + if ( rmax==0 || rmax<getas_x2.perp() ) rmax = getas_x2.perp(); + + // position of the strip centre + + Amg::Vector3D getas_x = csc->globalPos(etas_x); + + if ( rmin==0 || rmin>getas_x.perp() ) rmin = getas_x.perp(); + if ( rmax==0 || rmax<getas_x.perp() ) rmax = getas_x.perp(); + + phi_test = getas_x1.phi(); + // for detector in (-0.25,0.25) phi interval use +-3,14 phi interval + // if(!(aux1==51 && aux3==1)) if (phi_test < 0) phi_test += 2.*M_PI; + if(!(exp_id[1]==51 && exp_id[3]==1)) if (phi_test < 0) phi_test += 2.*M_PI; + // phi + if(phi_test > phi_max){ + Id_phi_max=etas_id; + phi_max=phi_test; + } + if(phi_test < phi_min){ + Id_phi_min=etas_id; + phi_min=phi_test; + } + // eta + if(getas_x1.eta() > eta_max) { + Id_eta_max=etas_id; + eta_max=getas_x1.eta(); + } + if(getas_x1.eta() < eta_min) { + Id_eta_min=etas_id; + eta_min=getas_x1.eta(); + } + + phi_test = getas_x2.phi(); + // for detector in (-0.25,0.25) phi interval use +-3,14 phi interval + // if (!(aux1==51 && aux3==1)) if (phi_test < 0) phi_test += 2.*M_PI; + if (!(exp_id[1]==51 && exp_id[3]==1)) if (phi_test < 0) phi_test += 2.*M_PI; + // phi + if(phi_test > phi_max){ + Id_phi_max=etas_id; + phi_max=phi_test; + } + if(phi_test < phi_min){ + Id_phi_min=etas_id; + phi_min=phi_test; + } + // eta + if(getas_x2.eta() > eta_max) { + Id_eta_max=etas_id; + eta_max=getas_x2.eta(); + } + if(getas_x2.eta() < eta_min) { + Id_eta_min=etas_id; + eta_min=getas_x2.eta(); + } + + } + } //gas gaps + } // chamber layers + + // if(aux1==51 && aux3==1)if (phi_min < 0) phi_min += 2.*M_PI; + // if(aux1==51 && aux3==1)if (phi_max < 0) phi_max += 2.*M_PI; + if(exp_id[1]==51 && exp_id[3]==1) { + if (phi_max < 0) phi_max += 2.*M_PI; + if (phi_min < 0) phi_min += 2.*M_PI; + } + + uint16_t subDetectorId = (detid == -1) ? 0x6a : 0x69; + uint32_t cscrob = 0x0; + cabling->hash2Rob(Idhash.value(),cscrob); + cscrob = ((subDetectorId << 16) | cscrob); + RegSelModule m( zmin, zmax, rmin, rmax, phi_min, phi_max, layerid, detid, cscrob, Idhash ); + lut->addModule( m ); + + + } // modules + + + lut->initialise(); + + return lut; + +} + + + + + + + diff --git a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/CSC_RegSelCondAlg.h b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/CSC_RegSelCondAlg.h new file mode 100755 index 0000000000000000000000000000000000000000..fa51fe5f81dc70b18f6fea196e6df2f7bbc3515f --- /dev/null +++ b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/CSC_RegSelCondAlg.h @@ -0,0 +1,28 @@ +/** emacs: this is -*- c++ -*- **/ +/** + ** @file CSC_RegSelCondAlg.h + ** + ** @author sutt + ** @date Tue 4 Feb 2020 15:25:00 CET + ** + ** Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + **/ + +#ifndef CSC_RegSelCondAlg_h +#define CSC_RegSelCondAlg_h + + +#include "MuonRegSelCondAlg.h" + + +class CSC_RegSelCondAlg : public MuonRegSelCondAlg { + +public: + + CSC_RegSelCondAlg( const std::string& name, ISvcLocator* pSvcLocator ); + + std::unique_ptr<RegSelSiLUT> createTable( const MuonMDT_CablingMap* mdtCabling ) const; + +}; + +#endif // CSC_RegSelCondAlg_h diff --git a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MDT_RegSelCondAlg.cxx b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MDT_RegSelCondAlg.cxx new file mode 100644 index 0000000000000000000000000000000000000000..93d4e4ebd2fb2cf7556f4bbfdeb8846b359dba34 --- /dev/null +++ b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MDT_RegSelCondAlg.cxx @@ -0,0 +1,361 @@ +/** + ** @file MDT_RegSelCondAlg.cxx + ** + ** conditions algorithm to create the Si detector + ** lookup tables + ** + ** @author sutt + ** @date Sun 22 Sep 2019 10:21:50 BST + ** + ** + ** Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + **/ + +#include "MDT_RegSelCondAlg.h" + +#include "CLHEP/Units/SystemOfUnits.h" +#include "Identifier/IdentifierHash.h" + +#include <iostream> +#include <fstream> +#include <string> + +#include "MuonReadoutGeometry/MuonDetectorManager.h" +#include "MuonReadoutGeometry/MuonReadoutElement.h" +#include "MuonReadoutGeometry/MdtReadoutElement.h" +#include "MuonReadoutGeometry/CscReadoutElement.h" +#include "MuonReadoutGeometry/RpcReadoutElement.h" +#include "MuonReadoutGeometry/TgcReadoutElement.h" +#include "MuonReadoutGeometry/RpcReadoutSet.h" +#include "MuonReadoutGeometry/MuonStation.h" + + + +MDT_RegSelCondAlg::MDT_RegSelCondAlg(const std::string& name, ISvcLocator* pSvcLocator): + MuonRegSelCondAlg( name, pSvcLocator ) +{ + ATH_MSG_DEBUG( "MDT_RegSelCondAlg::MDT_RegSelCondAlg() " << name ); +} + + + +std::unique_ptr<RegSelSiLUT> MDT_RegSelCondAlg::createTable( const MuonMDT_CablingMap* cabling ) const { + + const MuonGM::MuonDetectorManager* manager = nullptr; // again 0 would do as well here + + StatusCode sc = detStore()->retrieve( manager ); + + /// can't use ATH_CHECK here as we can;'t return the StatusCode + if ( sc.isFailure() ) { + ATH_MSG_ERROR( "Could not retrieve MDT Manager for " << name() ); + return std::unique_ptr<RegSelSiLUT>(nullptr); + } + + const MdtIdHelper* helper = manager->mdtIdHelper(); + + /// ne wlookup table + std::unique_ptr<RegSelSiLUT> lut = std::make_unique<RegSelSiLUT>(); + + + IdContext ModuleContext = helper->module_context(); + + std::vector<Identifier>::const_iterator itr = helper->module_begin(); + std::vector<Identifier>::const_iterator idlast = helper->module_end(); + + for ( ; itr!=idlast; itr++ ) { + + Identifier Id = *itr; + IdentifierHash Idhash; + + helper->get_hash(Id, Idhash, &ModuleContext); + + ExpandedIdentifier exp_id; + if (helper->get_expanded_id( Id, exp_id, &ModuleContext)) { + ATH_MSG_DEBUG("Failed retrieving ExpandedIdentifier for PRD Identifier = " << Id.getString() << ". Skipping to the next PRD."); + continue; + } + + int detid = ( exp_id[2]<0 ? -1 : 1 ); + int layerid = exp_id[1]+1; + + IdContext mdtChannelContext = helper->channel_context(); + + // get the element corresponding to multilayer = 1 + const MuonGM::MdtReadoutElement* mdt1 = manager->getMdtReadoutElement(Id); + if (mdt1 == NULL) { + continue; + } + + Identifier Id2 = helper->channelID(Id, 2, 1, 1); + + // get the element corresponding to multilayer = 2 + const MuonGM::MdtReadoutElement* mdt2 = manager->getMdtReadoutElement(Id2); + + double tubePitch = mdt1->tubePitch(); + + int ntlay = mdt1->getNLayers(); + int ntubesl1 = mdt1->getNtubesperlayer(); + int ntubesl2 = 0; + + if (mdt2 != NULL) ntubesl2 = mdt2->getNtubesperlayer(); + + Identifier Idv[4]; + Idv[0] = helper->channelID(Id, 1, 1, 1); + Idv[1] = helper->channelID(Id, 1, 1, ntubesl1); + Idv[2] = helper->channelID(Id, 2, ntlay, 1); + Idv[3] = helper->channelID(Id, 2, ntlay, ntubesl2); + + // std::cout<<" Number of tube layers "<<ntlay; + // std::cout<<" Number of tubes / layer (1 ,2) "<<ntubesl1<<", "<<ntubesl2; + + double rmin = 99999999.; + double rmax = -99999999.; + double zmin = 99999999.; + double zmax = -99999999.; + double emin = 99999999.; + double emax = -99999999.; + double phimin = 999999.; + double phimax = -999999.; + + double zpos21 = 0.; + Identifier Idsl = helper->channelID(Id, 1, 2, 1); + if (mdt1->barrel()) { + zpos21 = (mdt1->tubePos(Idsl)).z()-(mdt1->tubePos(Idv[0])).z(); + } + else { + zpos21 = (mdt1->tubePos(Idsl)).perp()-(mdt1->tubePos(Idv[0])).perp(); + } + + /// what is this loop over? This is awful code, this i parameter hides + /// the "i" from loop over the iterators, or it did until I changed it + // to a more sensibly named "itr" + for (int i=0; i<4; i++) { + + const MuonGM::MdtReadoutElement* mdt = NULL; + + if ( i<2 ) mdt = mdt1; + else mdt = mdt2; + if (mdt == NULL) { + // std::cout<<" element not found for index i = "<<i<<" --------- "<<std::endl; + if (i==2) { + Idv[2] = helper->channelID(Id, 1, ntlay, 1); + mdt = manager->getMdtReadoutElement(Idv[2]); + } + else if (i==3) { + Idv[3] = helper->channelID(Id, 1, ntlay, ntubesl1); + mdt = manager->getMdtReadoutElement(Idv[3]); + } + else { + // std::cout<<" Skipping element; i = "<<i<<" ----- "<<std::endl; + continue; + } + + } + + Amg::Vector3D mdtPos = mdt->tubePos(Idv[i]); + + Amg::Vector3D mdtPos1 = mdtPos; + Amg::Vector3D mdtPos2 = mdtPos; + + double scaleMin = (mdtPos.perp()-tubePitch/2.)/mdtPos.perp(); + double scalePlus = (mdtPos.perp()+tubePitch/2.)/mdtPos.perp(); + + if (mdt->barrel()) { + + // these are z ranges of the first or last tube layer + // mdtPos1.setZ(mdtPos.z()-tubePitch/2.); + // mdtPos2.setZ(mdtPos.z()+tubePitch/2.); + mdtPos1[2] = mdtPos.z()-tubePitch/2.; + mdtPos2[2] = mdtPos.z()+tubePitch/2.; + + // correct the z ranges of the first or last tube layer to account for tube staggering + if (zpos21 > 1.) { + // mdtPos2.setZ(mdtPos2.z()+tubePitch/2.); + mdtPos2[2] = mdtPos2.z()+tubePitch/2.; + } + else if (zpos21 < -1.) { + //mdtPos1.setZ(mdtPos1.z()-tubePitch/2.); + mdtPos1[2] = mdtPos1.z()-tubePitch/2.; + } + + if (i<2) { + mdtPos1[0] *= scaleMin; + mdtPos1[1] *= scaleMin; + mdtPos2[0] *= scaleMin; + mdtPos2[1] *= scaleMin; + // mdtPos1.setPerp(mdtPos.perp()-tubePitch/2.); + // mdtPos2.setPerp(mdtPos.perp()-tubePitch/2.); + } + else { + mdtPos1[0] *= scalePlus; + mdtPos1[1] *= scalePlus; + mdtPos2[0] *= scalePlus; + mdtPos2[1] *= scalePlus; + // mdtPos1.setPerp(mdtPos.perp()+tubePitch/2.); + // mdtPos2.setPerp(mdtPos.perp()+tubePitch/2.); + } + } + else { + + // these are z ranges of the first or last tube layer + mdtPos1[0] *= scaleMin; + mdtPos1[1] *= scaleMin; + mdtPos2[0] *= scalePlus; + mdtPos2[1] *= scalePlus; + // mdtPos1.setPerp(mdtPos.perp()-tubePitch/2.); + // mdtPos2.setPerp(mdtPos.perp()+tubePitch/2.); + // correct the z ranges of the first or last tube layer to account for tube staggering + if (zpos21 > 1.) { + scalePlus = (mdtPos2.perp()+tubePitch/2.)/mdtPos2.perp(); + mdtPos2[0] *= scalePlus; + mdtPos2[1] *= scalePlus; + // mdtPos2.setPerp(mdtPos2.perp()+tubePitch/2.); + } + else if (zpos21 < -1.) { + scaleMin = (mdtPos1.perp()-tubePitch/2.)/mdtPos1.perp(); + mdtPos1[0] *= scaleMin; + mdtPos1[1] *= scaleMin; + // mdtPos1.setPerp(mdtPos1.perp()-tubePitch/2.); + } + if (i<2) { + if (mdt->sideA()){ + // mdtPos1.setZ(mdtPos.z()-tubePitch/2.); + // mdtPos2.setZ(mdtPos.z()-tubePitch/2.); + mdtPos1[2] = mdtPos.z()-tubePitch/2.; + mdtPos2[2] = mdtPos.z()-tubePitch/2.; + } + else { + // mdtPos1.setZ(mdtPos.z()+tubePitch/2.); + // mdtPos2.setZ(mdtPos.z()+tubePitch/2.); + mdtPos1[2] = mdtPos.z()+tubePitch/2.; + mdtPos2[2] = mdtPos.z()+tubePitch/2.; + } + } + else { + if (mdt->sideA()) { + // mdtPos1.setZ(mdtPos.z()+tubePitch/2.); + // mdtPos2.setZ(mdtPos.z()+tubePitch/2.); + mdtPos1[2] = mdtPos.z()+tubePitch/2.; + mdtPos2[2] = mdtPos.z()+tubePitch/2.; + } + else { + // mdtPos1.setZ(mdtPos.z()-tubePitch/2.); + // mdtPos2.setZ(mdtPos.z()-tubePitch/2.); + mdtPos1[2] = mdtPos.z()-tubePitch/2.; + mdtPos2[2] = mdtPos.z()-tubePitch/2.; + } + } + } + + double eminMod = 0.; + double emaxMod = 0.; + double zminMod = 0.; + double zmaxMod = 0.; + double rminMod = 0.; + double rmaxMod = 0.; + double dphi = 0.; + + if (mdt->barrel()) { + eminMod = mdtPos1.eta(); + emaxMod = mdtPos2.eta(); + + zminMod = mdtPos1.z(); + zmaxMod = mdtPos2.z(); + + rminMod = mdtPos1.perp(); + rmaxMod = mdtPos2.perp(); + + dphi = atan2(mdt->getSsize()/2., (mdtPos.perp()-tubePitch/2.)); + } + else { + if (mdt->sideA()) { + eminMod = mdtPos2.eta(); + emaxMod = mdtPos1.eta(); + + zminMod = mdtPos2.z(); + zmaxMod = mdtPos1.z(); + + rminMod = mdtPos1.perp(); + rmaxMod = mdtPos2.perp(); + } + else { + eminMod = mdtPos1.eta(); + emaxMod = mdtPos2.eta(); + + zminMod = mdtPos1.z(); + zmaxMod = mdtPos2.z(); + + rminMod = mdtPos1.perp(); + rmaxMod = mdtPos2.perp(); + } + + dphi = atan2(mdt->tubeLength(Idv[i])/2., (mdtPos.perp()-tubePitch/2.)); + } + + double pminMod = mdtPos.phi() - dphi; + double pmaxMod = mdtPos.phi() + dphi; + + if (zminMod < zmin) { + zmin = zminMod; + } + + if (zmaxMod > zmax) { + zmax = zmaxMod; + } + + if (pminMod < phimin) phimin = pminMod; + if (pmaxMod > phimax) phimax = pmaxMod; + if (eminMod < emin) emin = eminMod; + if (emaxMod > emax) emax = emaxMod; + if (rminMod < rmin) rmin = rminMod; + if (rmaxMod > rmax) rmax = rmaxMod; + // std::cout<<" Module emin - emax "<<emin<<" "<<emax<<" phimin - phimax "<<phimin<<" "<<phimax<<std::endl; + + } + + // here define the eta and phi(0-2*pi) ranges + if (phimin<0) phimin = phimin + 2*M_PI; + if (phimax<0) phimax = phimax + 2*M_PI; + + // calculate 4 sub detectors for the mdt, fore and aft barrel, + // and fore and aft endcaps + + if ( mdt1->barrel() ) { + if ( mdt1->sideA() ) detid = 1; + else if ( mdt1->sideC() ) detid = -1; + } + else { + if ( mdt1->sideA() ) detid = 2; + else if ( mdt1->sideC() ) detid = -2; + } + + + // std::cout << "detid " << detid; + + // if ( mdt1->barrel() ) detid = 0; + // if ( mdt1->sideA() ) detid = 1; + // if ( mdt1->sideC() ) detid = -1; + + // std::cout << " -> " << detid << std::endl; + + uint32_t RobId = cabling->getROBId(Idhash); + + RegSelModule m( zmin, zmax, rmin, rmax, phimin, phimax, layerid, detid, RobId, Idhash ); + + lut->addModule( m ); + + } + + + lut->initialise(); + + return lut; + +} + + + + + + + diff --git a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MDT_RegSelCondAlg.h b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MDT_RegSelCondAlg.h new file mode 100755 index 0000000000000000000000000000000000000000..1de2560110d41b456acc48b5dae7e219438d3153 --- /dev/null +++ b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MDT_RegSelCondAlg.h @@ -0,0 +1,27 @@ +/** emacs: this is -*- c++ -*- **/ +/** + ** @file MDT_RegSelCondAlg.h + ** + ** @author sutt + ** @date Tue 4 Feb 2020 15:25:00 CET + ** + ** Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + **/ + +#ifndef MDT_RegSelCondAlg_h +#define MDT_RegSelCondAlg_h + +#include "MuonRegSelCondAlg.h" + + +class MDT_RegSelCondAlg : public MuonRegSelCondAlg { + +public: + + MDT_RegSelCondAlg( const std::string& name, ISvcLocator* pSvcLocator ); + + std::unique_ptr<RegSelSiLUT> createTable( const MuonMDT_CablingMap* cabling ) const override; + +}; + +#endif // MDT_RegSelCondAlg_h diff --git a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MM_RegSelCondAlg.cxx b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MM_RegSelCondAlg.cxx new file mode 100644 index 0000000000000000000000000000000000000000..686fdc8981fa6b3fd64f47cff96abef21bad6c28 --- /dev/null +++ b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MM_RegSelCondAlg.cxx @@ -0,0 +1,156 @@ +/** + ** @file MM_RegSelCondAlg.cxx + ** + ** conditions algorithm to create the Si detector + ** lookup tables + ** + ** @author sutt + ** @date Sun 22 Sep 2019 10:21:50 BST + ** + ** + ** Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + **/ + +#include "GaudiKernel/EventIDRange.h" +#include "StoreGate/WriteCondHandle.h" + +#include "CLHEP/Units/SystemOfUnits.h" +#include "Identifier/IdentifierHash.h" + +#include <iostream> +#include <fstream> +#include <string> +#include <cmath> + +#include "MuonCablingData/MuonMDT_CablingMap.h" + +#include "MuonReadoutGeometry/MuonDetectorManager.h" +#include "MuonReadoutGeometry/MuonReadoutElement.h" + +#include "MuonReadoutGeometry/MMReadoutElement.h" +#include "MuonAGDDDescription/MMDetectorHelper.h" +#include "MuonAGDDDescription/MMDetectorDescription.h" + +#include "MuonReadoutGeometry/MuonStation.h" + +#include "RegSelLUT/RegSelSiLUT.h" + +/// not implemented yet +/// #include "MuonMM_Cabling/MuonMM_CablingSvc.h" + + +#include "MM_RegSelCondAlg.h" + + +MM_RegSelCondAlg::MM_RegSelCondAlg(const std::string& name, ISvcLocator* pSvcLocator): + MuonRegSelCondAlg( name, pSvcLocator ) +{ + ATH_MSG_DEBUG( "MM_RegSelCondAlg::MM_RegSelCondAlg() " << name ); +} + + + + + +std::unique_ptr<RegSelSiLUT> MM_RegSelCondAlg::createTable( const MuonMDT_CablingMap* /* mdtCabling */ ) const { + + /// no NSW cabling available at the moment ... + + /// get the MM detector manager + + const MuonGM::MuonDetectorManager* manager = nullptr; + + if ( (detStore()->retrieve( manager ).isFailure() ) ) { + ATH_MSG_ERROR( "Could not retrieve CSC Manager for " << name() ); + return std::unique_ptr<RegSelSiLUT>(nullptr); + } + + const MmIdHelper* helper = manager->mmIdHelper(); + + + std::vector<Identifier>::const_iterator idfirst = helper->module_begin(); + std::vector<Identifier>::const_iterator idlast = helper->module_end(); + + /// do we want the module context ... + /// const IdContext ModuleContext = helper->module_context(); + + /// or the detector element context ? Keep them both untill we are sure + const IdContext ModuleContext = helper->detectorElement_context(); + + ATH_MSG_DEBUG("createTable()"); + + std::unique_ptr<RegSelSiLUT> lut = std::make_unique<RegSelSiLUT>(); + + + for ( std::vector<Identifier>::const_iterator i=idfirst ; i!=idlast ; i++ ) { + + Identifier Id = *i; + IdentifierHash hashId; + + helper->get_hash( Id, hashId, &ModuleContext ); + + const MuonGM::MMReadoutElement* mm = manager->getMMReadoutElement(Id); + if (!mm) continue; + + int multilayer = helper->multilayer(Id); + + char side = mm->getStationEta() < 0 ? 'C' : 'A'; + + char sector_l = mm->getStationName().substr(2,1)=="L" ? 'L' : 'S'; + + MMDetectorHelper aHelper; + MMDetectorDescription* md = aHelper.Get_MMDetector( sector_l, std::abs(mm->getStationEta()), mm->getStationPhi(), multilayer, side ); + + /// now calculate the required limits + + Amg::Vector3D mmPos = mm->center(); + + + double swidth = md->sWidth(); + double lwidth = md->lWidth(); + + double length = md->Length(); + double depth = md->Tck(); + + double moduleR = std::sqrt( mmPos.mag()*mmPos.mag() - mmPos.z()*mmPos.z()); + + double zmin = mmPos.z()-0.5*depth; + double zmax = mmPos.z()+0.5*depth; + + // std::cout << "MM:module: rcen: " << moduleR << "\tlength: " << length << "\tswidth: " << swidth << "\tlwidth: " << lwidth << std::endl; + + double rmin = moduleR-0.5*length; + double rmax = std::sqrt( (moduleR+0.5*length)*(moduleR+0.5*length) + 0.25*lwidth*lwidth ); + + double dphi1 = std::atan( (0.5*lwidth)/(moduleR+0.5*length) ); + double dphi2 = std::atan( (0.5*swidth)/(moduleR-0.5*length) ); + + double dphi = ( dphi1 > dphi2 ? dphi1 : dphi2 ); + + double phimin = mmPos.phi()-dphi; + double phimax = mmPos.phi()+dphi; + + if ( phimin > M_PI ) phimin -= 2*M_PI; + if ( phimin < -M_PI ) phimin += 2*M_PI; + + if ( phimax > M_PI ) phimax -= 2*M_PI; + if ( phimax < -M_PI ) phimax += 2*M_PI; + + int layerid = multilayer; + int detid = ( side == 'C' ? -1 : 1 ); + + /// no cabling map at the moment - don't store robID + int robId = 0; + + RegSelModule m( zmin, zmax, rmin, rmax, phimin, phimax, int(layerid), int(detid), uint32_t(robId), hashId ); + + lut->addModule( m ); + + } + + lut->initialise(); + + return lut; + +} + diff --git a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MM_RegSelCondAlg.h b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MM_RegSelCondAlg.h new file mode 100755 index 0000000000000000000000000000000000000000..f21403219f3288c25aea143c1bf9f51fc54baf1b --- /dev/null +++ b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MM_RegSelCondAlg.h @@ -0,0 +1,28 @@ +/** emacs: this is -*- c++ -*- **/ +/** + ** @file MM_RegSelCondAlg.h + ** + ** @author sutt + ** @date Tue 4 Feb 2020 15:25:00 CET + ** + ** Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + **/ + +#ifndef MM_RegSelCondAlg_h +#define MM_RegSelCondAlg_h + + +#include "MuonRegSelCondAlg.h" + + +class MM_RegSelCondAlg : public MuonRegSelCondAlg { + +public: + + MM_RegSelCondAlg( const std::string& name, ISvcLocator* pSvcLocator ); + + std::unique_ptr<RegSelSiLUT> createTable( const MuonMDT_CablingMap* mdtCabling ) const; + +}; + +#endif // CSC_RegSelCondAlg_h diff --git a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MuonRegSelCondAlg.cxx b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MuonRegSelCondAlg.cxx new file mode 100644 index 0000000000000000000000000000000000000000..093503e8e680572a092182feba7b2cc5b01f59d9 --- /dev/null +++ b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MuonRegSelCondAlg.cxx @@ -0,0 +1,109 @@ +/** + ** @file MuonRegSelCondAlg.cxx + ** + ** conditions algorithm to create the Si detector + ** lookup tables + ** + ** @author sutt + ** @date Sun 22 Sep 2019 10:21:50 BST + ** + ** + ** Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + **/ + + +#include "GaudiKernel/EventIDRange.h" +#include "StoreGate/WriteCondHandle.h" + +#include <iostream> +#include <fstream> +#include <string> + + +#include "MuonCablingData/MuonMDT_CablingMap.h" + +#include "MDT_RegSelCondAlg.h" + + + +MuonRegSelCondAlg::MuonRegSelCondAlg(const std::string& name, ISvcLocator* pSvcLocator): + AthReentrantAlgorithm( name, pSvcLocator ), + m_managerName(""), + m_printTable(false) +{ + ATH_MSG_DEBUG( "MuonRegSelCondAlg::MuonRegSelCondAlg() " << name ); + declareProperty( "PrintTable", m_printTable=false ); + declareProperty( "ManagerName", m_managerName ); +} + + + + +StatusCode MuonRegSelCondAlg::initialize() +{ + ATH_MSG_DEBUG("MuonRegSelCondAlg::initialize() "); + ATH_CHECK(m_cablingKey.initialize()); + ATH_CHECK(m_tableKey.initialize()); + ATH_MSG_INFO("MuonRegSelCondAlg::initialize() " << m_tableKey ); + return StatusCode::SUCCESS; +} + + + +StatusCode MuonRegSelCondAlg::execute(const EventContext& ctx) const +{ + ATH_MSG_DEBUG("MuonRegSelCondAlg::execute() -- enter -- "); + + /// do stuff here ... + ATH_MSG_DEBUG( "Creating region selector table " << m_tableKey ); + + + SG::ReadCondHandle<MuonMDT_CablingMap> cabling( m_cablingKey, ctx ); + + EventIDRange id_range; + + if( !cabling.range( id_range ) ) { + ATH_MSG_ERROR("Failed to retrieve validity range for " << cabling.key()); + return StatusCode::FAILURE; + } + + /// create the new lookuo table + + std::unique_ptr<RegSelSiLUT> rd = createTable( *cabling ); + + if ( !rd ) return StatusCode::FAILURE; + + ATH_MSG_DEBUG( "Initialising new map " );; + + // write out new new LUT to a file if need be + + if ( m_printTable ) rd->write( name()+".map" ); + + /// create the conditions data for storage + + RegSelLUTCondData* rcd = new RegSelLUTCondData( std::move(rd) ); + + try { + SG::WriteCondHandle<RegSelLUTCondData> lutCondData( m_tableKey, ctx ); + if( lutCondData.record( id_range, rcd ).isFailure() ) { + ATH_MSG_ERROR( "Could not record " << m_tableKey + << " " << lutCondData.key() + << " with range " << id_range ); + return StatusCode::FAILURE; + } + ATH_MSG_INFO( "RegSelCondAlg LUT recorded: " << m_tableKey); + } + catch (...) { + ATH_MSG_ERROR("MuonRegSelCondAlg::execute() failed to record table: " << m_tableKey); + return StatusCode::FAILURE; + } + + + ATH_MSG_DEBUG("MuonRegSelCondAlg::execute() -- exit -- "); + + return StatusCode::SUCCESS; +} + + + + diff --git a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MuonRegSelCondAlg.h b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MuonRegSelCondAlg.h new file mode 100755 index 0000000000000000000000000000000000000000..bcccb38e924a61a814bb9e198c8e647e3d6c429d --- /dev/null +++ b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/MuonRegSelCondAlg.h @@ -0,0 +1,60 @@ +/** emacs: this is -*- c++ -*- **/ +/** + ** @file MuonRegSelCondAlg.h + ** + ** @author sutt + ** @date Tue 4 Feb 2020 15:25:00 CET + ** + ** Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + **/ + +#ifndef MuonRegSelCondAlg_h +#define MuonRegSelCondAlg_h + +#include "GaudiKernel/ISvcLocator.h" + +#include "AthenaBaseComps/AthReentrantAlgorithm.h" +#include "AthenaBaseComps/AthAlgTool.h" + +#include "GaudiKernel/ToolHandle.h" + +#include "MuonCablingData/MuonMDT_CablingMap.h" + +#include "StoreGate/ReadCondHandleKey.h" +#include "StoreGate/WriteCondHandleKey.h" + +#include "IRegionSelector/RegSelLUTCondData.h" + +#include <string> + + +///////////////////////////////////////////////////////////////////////////// + +class MuonRegSelCondAlg : public AthReentrantAlgorithm { + +public: + + MuonRegSelCondAlg( const std::string& name, ISvcLocator* pSvcLocator ); + + virtual StatusCode initialize() override; + virtual StatusCode execute (const EventContext& ctx) const override; + + virtual std::unique_ptr<RegSelSiLUT> createTable( const MuonMDT_CablingMap* cabling ) const = 0; + + private: + + std::string m_managerName; + bool m_printTable; + + SG::ReadCondHandleKey<MuonMDT_CablingMap> m_cablingKey + { this, "Cabling", "MuonMDT_CablingMap", "Key of output MDT cabling map" }; + + /// Output conditions object + SG::WriteCondHandleKey<RegSelLUTCondData> m_tableKey + { this, "RegSelLUT", "RegSelLUTCondData", "Region Selector lookup table" }; + + + +}; + +#endif // MuonRegSelCondAlg_h diff --git a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/RPC_RegSelCondAlg.cxx b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/RPC_RegSelCondAlg.cxx new file mode 100644 index 0000000000000000000000000000000000000000..34b375b253c908bd4979e1516b111c5e0b1b35ad --- /dev/null +++ b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/RPC_RegSelCondAlg.cxx @@ -0,0 +1,271 @@ +/** + ** @file RPC_RegSelCondAlg.cxx + ** + ** conditions algorithm to create the Si detector + ** lookup tables + ** + ** @author sutt + ** @date Sun 22 Sep 2019 10:21:50 BST + ** + ** + ** Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + **/ + + +#include "GaudiKernel/EventIDRange.h" +#include "StoreGate/WriteCondHandle.h" + +#include "CLHEP/Units/SystemOfUnits.h" +#include "Identifier/IdentifierHash.h" + +#include <iostream> +#include <fstream> +#include <string> + + +#include "MuonCablingData/MuonMDT_CablingMap.h" + +#include "MuonReadoutGeometry/MuonDetectorManager.h" +#include "MuonReadoutGeometry/MuonReadoutElement.h" +#include "MuonReadoutGeometry/MdtReadoutElement.h" +#include "MuonReadoutGeometry/CscReadoutElement.h" +#include "MuonReadoutGeometry/RpcReadoutElement.h" +#include "MuonReadoutGeometry/TgcReadoutElement.h" +#include "MuonReadoutGeometry/RpcReadoutSet.h" +#include "MuonReadoutGeometry/MuonStation.h" + +#include "RPC_RegSelCondAlg.h" + +#include "RPCcablingInterface/IRPCcablingServerSvc.h" +#include "RPCcablingInterface/IRPCcablingSvc.h" + + + +RPC_RegSelCondAlg::RPC_RegSelCondAlg(const std::string& name, ISvcLocator* pSvcLocator): + MuonRegSelCondAlg( name, pSvcLocator ) +{ + ATH_MSG_DEBUG( "RPC_RegSelCondAlg::RPC_RegSelCondAlg() " << name ); +} + + + +std::unique_ptr<RegSelSiLUT> RPC_RegSelCondAlg::createTable( const MuonMDT_CablingMap* /* mdtCabling */ ) const { + + /// now get the RPC cabling service ... + + const IRPCcablingServerSvc* cabling_server = nullptr; + + if ( service( "RPCcablingServerSvc", cabling_server ).isFailure() ) { + ATH_MSG_ERROR( "Could not retieve RPC cabling server"); + return std::unique_ptr<RegSelSiLUT>(nullptr); + } + + const IRPCcablingSvc* cabling = nullptr; + + if ( cabling_server->giveCabling( cabling ).isFailure() ) { + ATH_MSG_ERROR( "Could not retieve RPC cabling service"); + return std::unique_ptr<RegSelSiLUT>(nullptr); + } + + const MuonGM::MuonDetectorManager* manager = nullptr; + + if ( detStore()->retrieve( manager ).isFailure() ) { + ATH_MSG_ERROR( "Could not retrieve RPC Manager for " << name() ); + return std::unique_ptr<RegSelSiLUT>(nullptr); + } + + const RpcIdHelper* helper = manager->rpcIdHelper(); + + std::vector<Identifier>::const_iterator idfirst = helper->module_begin(); + std::vector<Identifier>::const_iterator idlast = helper->module_end(); + + IdContext ModuleContext = helper->module_context(); + + ATH_MSG_DEBUG("createTable()"); + + std::unique_ptr<RegSelSiLUT> lut = std::make_unique<RegSelSiLUT>(); + + + //loop over modules (PrepRawData collections) + for ( std::vector<Identifier>::const_iterator itr=idfirst ; itr!=idlast ; itr++ ) { + + Identifier prdId = *itr; + IdentifierHash prdHashId; + int gethash_code = helper->get_hash(prdId, prdHashId, &ModuleContext); + if (gethash_code != 0 ) { + ATH_MSG_DEBUG("Failed retrieving IdentifierHash for PRD Identifier = " << prdId.getString() << ". Skipping to the next PRD."); + continue; + } + + std::vector<uint32_t> robIds; + StatusCode sc = cabling->giveROB_fromPRD(prdHashId, robIds); + if ( (cabling->giveROB_fromPRD(prdHashId, robIds)).isFailure() ) { + ATH_MSG_ERROR( "RegSelCondAlg_RPC could not get ROBid" ); + return std::unique_ptr<RegSelSiLUT>(nullptr); + } + + + if (robIds.size() < 1) { + ATH_MSG_DEBUG("There is no ROB associated with the PRD HashId = " << (unsigned int)prdHashId << ". Skipping to the next PRD."); + continue; + } + if (robIds.size()!=1 && robIds.size()!=2 && robIds.size()!=4) { + ATH_MSG_WARNING("Unhandled number of ROBs per one PRD. Expected 1, 2 or 4, got " << robIds.size() << ". Omitting the PRD HashId = " << (unsigned int)prdHashId); + continue; + } + + ExpandedIdentifier exp_id; + if ( helper->get_expanded_id( prdId, exp_id, &ModuleContext) ) { + ATH_MSG_DEBUG("Failed retrieving ExpandedIdentifier for PRD Identifier = " << prdId.getString() << ". Skipping to the next PRD."); + continue; + } + + int detid = ( exp_id[2]<0 ? -1 : 1 ); + int layerid = exp_id[1]; + if ( layerid==0 ) layerid = 11; // this line should never be executed + + MuonGM::RpcReadoutSet Set( manager, prdId ); + //int nmod = Set.NreadoutElements(); + int ndbz = Set.NdoubletZ(); + + //std::cout<<" Number of modules in this RpcSet "<<nmod<<" Number of doubletZ in this RpcSet "<<Set.NdoubletZ()<<std::endl; + //std::cout<<" Number of modules in Phi/DoubletZ: "; + //for (int i=1; i<=ndbz; i++) std::cout<<Set.NPhimodules(i)<<" "; + //std::cout<<std::endl; + + double zmin = 99999999; + double zmax = -99999999; + double rmin = 99999999; + double rmax = -99999999; + double phimin = 999999; + double phimax = -999999; + Amg::Vector3D Pzmin; + Amg::Vector3D Pzmax; + unsigned nmodules = 0; + + for (int dbz=1; dbz<=ndbz; dbz++) { + + const MuonGM::RpcReadoutElement* rpcold = NULL; + int ndbp = Set.NPhimodules(dbz); + + for (int dbp=1; dbp<=ndbp; dbp++) { + + const MuonGM::RpcReadoutElement* rpc = Set.readoutElement(dbz, dbp); + + if ( rpc != rpcold ) { + + // here a new module + nmodules ++; + rpcold = rpc; + + Amg::Vector3D rpcPos = rpc->center(); + double zminMod = rpcPos.z()-0.5*rpc->getZsize(); + double zmaxMod = rpcPos.z()+0.5*rpc->getZsize(); + + //double rcen = std::sqrt(rpcPos.r()*rpcPos.r()-rpcPos.z()*rpcPos.z()); + double rcen = std::sqrt(rpcPos.mag()*rpcPos.mag()-rpcPos.z()*rpcPos.z()); + + double rminMod = rcen-0.5*rpc->getRsize(); + double rmaxMod = rcen+0.5*rpc->getRsize(); + + // double dphi = std::atan2(rpc->getSsize()/2.,rpcPos.perp()); + double dphi = std::atan2(rpc->getSsize()/2,rpcPos.perp()); + double pminMod = rpcPos.phi() - dphi; + double pmaxMod = rpcPos.phi() + dphi; + + if (zminMod < zmin) { + zmin = zminMod; + Pzmin = rpcPos; + //Pzmin.setZ(zmin); + Pzmin[2] = zmin; + } + if (zmaxMod > zmax) { + zmax = zmaxMod; + Pzmax = rpcPos; + //Pzmax.setZ(zmax); + Pzmax[2] = zmax; + } + if (rminMod < rmin) { + rmin = rminMod; + } + if (rmaxMod > rmax) { + rmax = rmaxMod; + } + if (pminMod < phimin) phimin = pminMod; + if (pmaxMod > phimax) phimax = pmaxMod; + + } + } + } + + double phiMinFirst = phimin; + double phiMaxFirst = 0.5*(phimin+phimax); + double phiMinSecond = 0.5*(phimin+phimax); + double phiMaxSecond = phimax; + + if (phiMinFirst < 0) phiMinFirst += 2*M_PI; + if (phiMaxFirst < 0) phiMaxFirst += 2*M_PI; + if (phiMinSecond < 0) phiMinSecond += 2*M_PI; + if (phiMaxSecond < 0) phiMaxSecond += 2*M_PI; + + + if (robIds.size()==1) { + IdentifierHash lowerHashId( (1<<16) | (unsigned int)prdHashId ); + + RegSelModule m1( zmin, zmax, rmin, rmax, phiMinFirst, phiMaxSecond, layerid, detid, robIds[0], lowerHashId ); + lut->addModule( m1 ); + } + //the code below exploits the fact that ROB Ids are sorted!!! They go in order: SIDE A, ROBs 0..15, then SIDE C ROBs 0..15 + //it is also assumed that if there are 4 ROBs, then zmin<0 and zmax>0 + else if (robIds.size()==2) { + uint32_t lowerRobId=0; + uint32_t higherRobId=0; + if ( ((robIds[0] & 0xff) == 0) && ((robIds[1] & 0xff) == 15) ) { //the two ROBs around phi=0 + lowerRobId = robIds[1]; + higherRobId = robIds[0]; + } + else { + lowerRobId = robIds[0]; + higherRobId = robIds[1]; + } + IdentifierHash lowerHashId( (1<<16) | (unsigned int)prdHashId ); + IdentifierHash higherHashId( (2<<16) | (unsigned int)prdHashId ); + + RegSelModule m1( zmin, zmax, rmin, rmax, phiMinFirst, phiMaxFirst, layerid, detid, lowerRobId, lowerHashId ); + RegSelModule m2( zmin, zmax, rmin, rmax, phiMinSecond, phiMaxSecond, layerid, detid, higherRobId, higherHashId ); + lut->addModule( m1 ); + lut->addModule( m2 ); + } + else if (robIds.size()==4) { //this is the case only for two BOG chambers at z=0 read by ROBs 10-11 and 12-13, each on both sides A and C + uint32_t sideA_lowerRobId = robIds[0]; + uint32_t sideA_higherRobId = robIds[1]; + uint32_t sideC_lowerRobId = robIds[2]; + uint32_t sideC_higherRobId = robIds[3]; + IdentifierHash sideA_lowerHashId( (1<<16) | (unsigned int)prdHashId ); + IdentifierHash sideA_higherHashId( (2<<16) | (unsigned int)prdHashId ); + IdentifierHash sideC_lowerHashId( (3<<16) | (unsigned int)prdHashId ); + IdentifierHash sideC_higherHashId( (4<<16) | (unsigned int)prdHashId ); + + RegSelModule m1( 0, zmax, rmin, rmax, phiMinFirst, phiMaxFirst, layerid, detid, sideA_lowerRobId, sideA_lowerHashId ); + RegSelModule m2( 0, zmax, rmin, rmax, phiMinSecond, phiMaxSecond, layerid, detid, sideA_higherRobId, sideA_higherHashId ); + RegSelModule m3( zmin, 0, rmin, rmax, phiMinFirst, phiMaxFirst, layerid, detid, sideC_lowerRobId, sideC_lowerHashId ); + RegSelModule m4( zmin, 0, rmin, rmax, phiMinSecond, phiMaxSecond, layerid, detid, sideC_higherRobId, sideC_higherHashId ); + lut->addModule( m1 ); + lut->addModule( m2 ); + lut->addModule( m3 ); + lut->addModule( m4 ); + } + } //end of loop over modules (PrepRawData collections) + + lut->initialise(); + + return lut; + +} + + + + + + + diff --git a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/RPC_RegSelCondAlg.h b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/RPC_RegSelCondAlg.h new file mode 100755 index 0000000000000000000000000000000000000000..e68633d44664ff0a3ff01212febd6a96aeed0908 --- /dev/null +++ b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/RPC_RegSelCondAlg.h @@ -0,0 +1,27 @@ +/** emacs: this is -*- c++ -*- **/ +/** + ** @file RPC_RegSelCondAlg.h + ** + ** @author sutt + ** @date Tue 4 Feb 2020 15:25:00 CET + ** + ** Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + **/ + +#ifndef RPC_RegSelCondAlg_h +#define RPC_RegSelCondAlg_h + +#include "MuonRegSelCondAlg.h" + + +class RPC_RegSelCondAlg : public MuonRegSelCondAlg { + +public: + + RPC_RegSelCondAlg( const std::string& name, ISvcLocator* pSvcLocator ); + + std::unique_ptr<RegSelSiLUT> createTable( const MuonMDT_CablingMap* mdtCabling ) const override; + +}; + +#endif // RPC_RegSelCondAlg_h diff --git a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/RPC_RegionSelectorTable.cxx b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/RPC_RegionSelectorTable.cxx index 850400e7649c0ef16da0105d1bc16f57a6551108..340119d40ed3ccf0665378bb9abdcbd9414388f6 100644 --- a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/RPC_RegionSelectorTable.cxx +++ b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/RPC_RegionSelectorTable.cxx @@ -231,7 +231,6 @@ StatusCode RPC_RegionSelectorTable::createTable() { RegSelModule m1( zmin, zmax, rmin, rmax, phiMinFirst, phiMaxSecond, layerid, detid, robIds[0], lowerHashId ); rpclut->addModule( m1 ); } - //the code below exploits the fact that ROB Ids are sorted!!! They go in order: SIDE A, ROBs 0..15, then SIDE C ROBs 0..15 //it is also assumed that if there are 4 ROBs, then zmin<0 and zmax>0 else if (robIds.size()==2) { @@ -253,7 +252,6 @@ StatusCode RPC_RegionSelectorTable::createTable() { rpclut->addModule( m1 ); rpclut->addModule( m2 ); } - else if (robIds.size()==4) { //this is the case only for two BOG chambers at z=0 read by ROBs 10-11 and 12-13, each on both sides A and C uint32_t sideA_lowerRobId = robIds[0]; uint32_t sideA_higherRobId = robIds[1]; diff --git a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/TGC_RegSelCondAlg.cxx b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/TGC_RegSelCondAlg.cxx new file mode 100644 index 0000000000000000000000000000000000000000..634918e7a81e2c8292759956449a37260fbb037a --- /dev/null +++ b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/TGC_RegSelCondAlg.cxx @@ -0,0 +1,185 @@ +/** + ** @file TGC_RegSelCondAlg.cxx + ** + ** conditions algorithm to create the Si detector + ** lookup tables + ** + ** @author sutt + ** @date Sun 22 Sep 2019 10:21:50 BST + ** + ** + ** Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + **/ + + +#include "GaudiKernel/EventIDRange.h" +#include "StoreGate/WriteCondHandle.h" + +#include "CLHEP/Units/SystemOfUnits.h" +#include "Identifier/IdentifierHash.h" + +#include <iostream> +#include <fstream> +#include <string> +#include <cmath> + +#include "MuonCablingData/MuonMDT_CablingMap.h" + +#include "MuonReadoutGeometry/MuonDetectorManager.h" +#include "MuonReadoutGeometry/MuonReadoutElement.h" +#include "MuonReadoutGeometry/MdtReadoutElement.h" +#include "MuonReadoutGeometry/CscReadoutElement.h" +#include "MuonReadoutGeometry/RpcReadoutElement.h" +#include "MuonReadoutGeometry/TgcReadoutElement.h" +#include "MuonReadoutGeometry/RpcReadoutSet.h" +#include "MuonReadoutGeometry/MuonStation.h" + +#include "MuonTGC_Cabling/MuonTGC_CablingSvc.h" + +#include "TGC_RegSelCondAlg.h" + + + +TGC_RegSelCondAlg::TGC_RegSelCondAlg(const std::string& name, ISvcLocator* pSvcLocator): + MuonRegSelCondAlg( name, pSvcLocator ) +{ + ATH_MSG_DEBUG( "TGC_RegSelCondAlg::TGC_RegSelCondAlg() " << name ); +} + + + + + + +std::unique_ptr<RegSelSiLUT> TGC_RegSelCondAlg::createTable( const MuonMDT_CablingMap* /* mdtCabling */ ) const { + + /// now get the TGC cabling service ... + + const MuonTGC_CablingSvc* cabling = nullptr; + + if ( service( "MuonTGC_CablingSvc", cabling ).isFailure() ) { + ATH_MSG_ERROR( "Could not retrieve TGC cabling for " << name() ); + return std::unique_ptr<RegSelSiLUT>(nullptr); + } + + /// now get the TGC detector manager ... + + const MuonGM::MuonDetectorManager* manager = nullptr; + + if ( (detStore()->retrieve( manager ).isFailure() ) ) { + ATH_MSG_ERROR( "Could not retrieve TGC Manager for " << name() ); + return std::unique_ptr<RegSelSiLUT>(nullptr); + } + + const TgcIdHelper* helper = manager->tgcIdHelper(); + + std::vector<Identifier>::const_iterator idfirst = helper->module_begin(); + std::vector<Identifier>::const_iterator idlast = helper->module_end(); + + const IdContext ModuleContext = helper->module_context(); + + ATH_MSG_DEBUG("createTable()"); + + std::unique_ptr<RegSelSiLUT> lut = std::make_unique<RegSelSiLUT>(); + + int maxRodId = 0; + int maxSswId = 0; + int maxSbloc = 0; + int minChannelId = 0; + int maxChannelId = 0; + cabling->getReadoutIDRanges(maxRodId, maxSswId, maxSbloc, minChannelId, maxChannelId); + + for (std::vector<Identifier>::const_iterator i = idfirst; i != idlast; i++) { + + Identifier Id = *i; + IdentifierHash hashId; + + helper->get_hash( Id,hashId,&ModuleContext); + + ExpandedIdentifier exp_id; + if (helper->get_expanded_id( Id, exp_id, &ModuleContext)) { + ATH_MSG_DEBUG("Failed retrieving ExpandedIdentifier for PRD Identifier = " << Id.getString() << ". Skipping to the next PRD."); + continue; + } + + int detid = ( exp_id[2]<0 ? -1 : 1 ); + int layerid = exp_id[1]+1; + + const MuonGM::TgcReadoutElement* tgc = manager->getTgcReadoutElement(Id); + if (tgc == NULL) { + continue; + } + + int gapMin = helper->gasGapMin(Id); + int gapMax = helper->gasGapMax(Id); + + Identifier chId; + chId = helper -> channelID(Id,gapMin,0,1); + const int chmax = helper -> channelMax(chId); + Amg::Vector3D posmax = tgc->channelPos(gapMin,0,chmax); // gapMax gives posmax! + chId = helper -> channelID(Id,gapMax,0,1); + const int chmin = helper -> channelMin(chId); + Amg::Vector3D posmin = tgc->channelPos(gapMax,0,chmin); // gapMin gives posmin! + + // caliculation based on max/min channels in a module + // etamin = -logf(tan(atan(posmin.perp()/fabs(posmin.z()))/2.)); + // etamax = -logf(tan(atan(posmax.perp()/fabs(posmax.z()))/2.)); + + // caliculation based on active sensitive area + + Amg::Vector3D posctr = tgc->globalPosition(); + double activeheight = tgc->length(); + + double etamin = -logf(std::tan(std::atan((posctr.perp()-0.5*activeheight)/std::fabs(posmin.z()))*0.5)); + double etamax = -logf(std::tan(std::atan((posctr.perp()+0.5*activeheight)/std::fabs(posmax.z()))*0.5)); + + double zmin = posmin.z(); + double zmax = posmax.z(); + + double rmin = posctr.perp()-0.5*activeheight; + double rmax = posctr.perp()+0.5*activeheight; + + + if (helper->stationEta(Id) < 0) { + etamin = -etamin; + etamax = -etamax; + } + + + // caliculation based on active sensitive area + double activelongside = tgc->longWidth()-tgc->frameXwidth()*2.; + /// Should use std::atan2 etc, but atan2f is not definied in cmath, so for backwards + /// compatability we are forced to use the old versions + double phimin = atan2f(posctr.y(),posctr.x()) - atan2f(activelongside/2.,posctr.perp()+activeheight/2.); + double phimax = atan2f(posctr.y(),posctr.x()) + atan2f(activelongside/2.,posctr.perp()+activeheight/2.); + + if (phimin < 0) phimin += 2.*M_PI; + if (phimax < 0) phimax += 2.*M_PI; + + // get ROB id + int subDetectorId = 0; // 0x67 (A side) or 0x68 (C side) + int rodId = 0; // 1-12 + cabling->getReadoutIDfromElementID(Id, subDetectorId, rodId); + //int isAside = (subDetectorId==0x67) ? 0 : 1; + //uint32_t robId = static_cast<uint32_t>(isAside*(maxRodId) + rodId -1); // 0-23 + // using Source ID :see Muon::TGC_Hid2RESrcID::getRodID()/getRobId() + uint32_t robId = ( ((0x0ff) & subDetectorId)<<16 ) | (rodId); + // end part to get ROB id + + RegSelModule m( zmin, zmax, rmin, rmax, phimin, phimax, layerid, detid, robId, hashId ); + lut->addModule( m ); + + } + + lut->initialise(); + + return lut; + +} + + + + + + + diff --git a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/TGC_RegSelCondAlg.h b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/TGC_RegSelCondAlg.h new file mode 100755 index 0000000000000000000000000000000000000000..aa0ce6d5bfa610687bc255afb4d6eb1cbe8d78db --- /dev/null +++ b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/TGC_RegSelCondAlg.h @@ -0,0 +1,27 @@ +/** emacs: this is -*- c++ -*- **/ +/** + ** @file TGC_RegSelCondAlg.h + ** + ** @author sutt + ** @date Tue 4 Feb 2020 15:25:00 CET + ** + ** Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + **/ + +#ifndef TGC_RegSelCondAlg_h +#define TGC_RegSelCondAlg_h + +#include "MuonRegSelCondAlg.h" + + +class TGC_RegSelCondAlg : public MuonRegSelCondAlg { + +public: + + TGC_RegSelCondAlg( const std::string& name, ISvcLocator* pSvcLocator ); + + std::unique_ptr<RegSelSiLUT> createTable( const MuonMDT_CablingMap* mdtCabling ) const; + +}; + +#endif // TGC_RegSelCondAlg_h diff --git a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/components/MuonRegionSelector_entries.cxx b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/components/MuonRegionSelector_entries.cxx index 0838295a11e4e3abc92bba99de6c47d06ceb50eb..df0b13f9670e2347656bc441a7bdd1506e496da0 100644 --- a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/components/MuonRegionSelector_entries.cxx +++ b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/components/MuonRegionSelector_entries.cxx @@ -13,3 +13,17 @@ DECLARE_COMPONENT( CSC_RegionSelectorTable ) DECLARE_COMPONENT( MM_RegionSelectorTable ) DECLARE_COMPONENT( sTGC_RegionSelectorTable ) +#include "../MDT_RegSelCondAlg.h" +#include "../RPC_RegSelCondAlg.h" +#include "../TGC_RegSelCondAlg.h" +#include "../CSC_RegSelCondAlg.h" +#include "../MM_RegSelCondAlg.h" +#include "../sTGC_RegSelCondAlg.h" + +DECLARE_COMPONENT( MDT_RegSelCondAlg ) +DECLARE_COMPONENT( RPC_RegSelCondAlg ) +DECLARE_COMPONENT( TGC_RegSelCondAlg ) +DECLARE_COMPONENT( CSC_RegSelCondAlg ) +DECLARE_COMPONENT( MM_RegSelCondAlg ) +DECLARE_COMPONENT( sTGC_RegSelCondAlg ) + diff --git a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/sTGC_RegSelCondAlg.cxx b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/sTGC_RegSelCondAlg.cxx new file mode 100644 index 0000000000000000000000000000000000000000..dcafed58827982d78e90ae0eca6ce9a60382ae5e --- /dev/null +++ b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/sTGC_RegSelCondAlg.cxx @@ -0,0 +1,155 @@ +/** + ** @file sTGC_RegSelCondAlg.cxx + ** + ** conditions algorithm to create the Si detector + ** lookup tables + ** + ** @author sutt + ** @date Sun 22 Sep 2019 10:21:50 BST + ** + ** + ** Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + **/ + + +#include <iostream> +#include <fstream> +#include <string> + +#include "CLHEP/Units/SystemOfUnits.h" +#include "Identifier/IdentifierHash.h" + +#include "RegSelLUT/RegSelModule.h" +#include "RegSelLUT/RegSelSiLUT.h" + +#include "MuonReadoutGeometry/MuonDetectorManager.h" +#include "MuonReadoutGeometry/MuonReadoutElement.h" + +/// sTGC naming convention headers +#include "MuonReadoutGeometry/sTgcReadoutElement.h" +#include "MuonAGDDDescription/sTGCDetectorHelper.h" +#include "MuonAGDDDescription/sTGCDetectorDescription.h" + +#include "MuonReadoutGeometry/MuonStation.h" + +#include "RegSelLUT/RegSelSiLUT.h" + + +/// not implemented yet +/// #include "Muon_sTGC_Cabling/MuonMM_CablingSvc.h" + +#include "sTGC_RegSelCondAlg.h" + + +sTGC_RegSelCondAlg::sTGC_RegSelCondAlg(const std::string& name, ISvcLocator* pSvcLocator): + MuonRegSelCondAlg( name, pSvcLocator ) +{ + ATH_MSG_DEBUG( "sTGC_RegSelCondAlg::sTGC_RegSelCondAlg() " << name ); +} + + + + + +std::unique_ptr<RegSelSiLUT> sTGC_RegSelCondAlg::createTable( const MuonMDT_CablingMap* /* mdtCabling */ ) const { + + /// no NSW cabling available at the moment ... + + /// get the MM detector manager + + const MuonGM::MuonDetectorManager* manager = nullptr; + + if ( (detStore()->retrieve( manager ).isFailure() ) ) { + ATH_MSG_ERROR( "Could not retrieve Muon Manager for " << name() ); + return std::unique_ptr<RegSelSiLUT>(nullptr); + } + + const sTgcIdHelper* helper = manager->stgcIdHelper(); + + std::vector<Identifier>::const_iterator idfirst = helper->module_begin(); + std::vector<Identifier>::const_iterator idlast = helper->module_end(); + + /// do we want the module context ... + /// const IdContext ModuleContext = helper->module_context(); + + /// or the detector element context ? Keep them both untill we are sure + const IdContext ModuleContext = helper->detectorElement_context(); + + ATH_MSG_DEBUG("createTable()"); + + std::unique_ptr<RegSelSiLUT> lut = std::make_unique<RegSelSiLUT>(); + + + for ( std::vector<Identifier>::const_iterator i=idfirst ; i!=idlast ; i++ ) { + + Identifier Id = *i; + IdentifierHash hashId; + + helper->get_hash( Id, hashId, &ModuleContext ); + + const MuonGM::sTgcReadoutElement* mm = manager->getsTgcReadoutElement(Id); + if (!mm) continue; + + // std::cout << "stgc station name: " << mm->getStationName() << "\teta: " << mm->getStationEta() << "\tphi: " << mm->getStationPhi() << std::endl; + + int multilayer = helper->multilayer(Id); + + char side = mm->getStationEta() < 0 ? 'C' : 'A'; + + char sector_l = mm->getStationName().substr(2,1)=="L" ? 'L' : 'S'; + + sTGCDetectorHelper aHelper; + sTGCDetectorDescription* md = aHelper.Get_sTGCDetector( sector_l, std::abs(mm->getStationEta()), mm->getStationPhi(), multilayer, side ); + + Amg::Vector3D mmPos = mm->center(); + + double swidth = md->sWidth(); + double lwidth = md->lWidth(); + + double ycutout = md->yCutout(); + + double length = md->Length(); + double depth = md->Tck(); + + double moduleR = std::sqrt( mmPos.mag()*mmPos.mag() - mmPos.z()*mmPos.z()); + + double zmin = mmPos.z()-0.5*depth; + double zmax = mmPos.z()+0.5*depth; + + double rmin = moduleR-0.5*length; + double rmax = std::sqrt( (moduleR+0.5*length)*(moduleR+0.5*length) + lwidth*lwidth/4 ); + + double dphi1 = std::atan( (0.5*lwidth)/(moduleR+0.5*length) ); + double dphi2 = std::atan( (0.5*swidth)/(moduleR-0.5*length) ); + + double dphi = ( dphi1 > dphi2 ? dphi1 : dphi2 ); + + if ( ycutout > 0 ) { + double rcutout = moduleR+0.5*length - ycutout; + double dphicutout = std::atan( (0.5*lwidth)/rcutout ); + if ( dphi < dphicutout ) dphi = dphicutout; + } + + double phimin = mmPos.phi()-dphi; + double phimax = mmPos.phi()+dphi; + + if ( phimin > M_PI ) phimin -= 2*M_PI; + if ( phimin < -M_PI ) phimin += 2*M_PI; + + int layerid = multilayer; + int detid = ( side == 'C' ? -1 : 1 ); + + int robId = 0; + + // std::cout << "sTGC::module r: " << moduleR << "\tlength: " << length << "\tswidth: " << swidth << "\tlwidth: " << lwidth << "\tycut: " << ycutout << std::endl; + + RegSelModule m( zmin, zmax, rmin, rmax, phimin, phimax, int(layerid), int(detid), uint32_t(robId), hashId ); + + lut->addModule( m ); + + } + + lut->initialise(); + + return lut; +} diff --git a/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/sTGC_RegSelCondAlg.h b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/sTGC_RegSelCondAlg.h new file mode 100755 index 0000000000000000000000000000000000000000..ace1a281544f3884315ef0ed6c10c246ec199f04 --- /dev/null +++ b/MuonSpectrometer/MuonDetDescr/MuonRegionSelector/src/sTGC_RegSelCondAlg.h @@ -0,0 +1,32 @@ +/** emacs: this is -*- c++ -*- **/ +/** + ** @file sTGC_RegSelCondAlg.h + ** + ** @author sutt + ** @date Tue 4 Feb 2020 15:25:00 CET + ** + ** Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + **/ + +#ifndef sTGC_RegSelCondAlg_h +#define sTGC_RegSelCondAlg_h + + +#include "MuonRegSelCondAlg.h" + + +/// NB: this sTGC class follows the naming convention from the +/// sTGC detector code base hence the non-standard naming +/// convention sTGC rather than STGC etc + +class sTGC_RegSelCondAlg : public MuonRegSelCondAlg { + +public: + + sTGC_RegSelCondAlg( const std::string& name, ISvcLocator* pSvcLocator ); + + std::unique_ptr<RegSelSiLUT> createTable( const MuonMDT_CablingMap* mdtCabling ) const; + +}; + +#endif // sTGC_RegSelCondAlg_h diff --git a/Trigger/TrigAlgorithms/TrigFastTrackFinder/python/TrigFastTrackFinder_Config.py b/Trigger/TrigAlgorithms/TrigFastTrackFinder/python/TrigFastTrackFinder_Config.py index da837120375577a0223520f7d01a030f01f3b7d1..0a3dde84435a8648f571e76ddfeee35533d938c9 100755 --- a/Trigger/TrigAlgorithms/TrigFastTrackFinder/python/TrigFastTrackFinder_Config.py +++ b/Trigger/TrigAlgorithms/TrigFastTrackFinder/python/TrigFastTrackFinder_Config.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration from TrigFastTrackFinder.TrigFastTrackFinderConf import TrigFastTrackFinder