From 247801eaa1ba331a038a16a8b64a928c65ef5e96 Mon Sep 17 00:00:00 2001 From: Peter Onyisi <ponyisi@utexas.edu> Date: Fri, 30 Oct 2020 13:28:27 +0000 Subject: [PATCH] Speed up DQ algorithms in high nthread limit --- .../python/AthMonitorCfgHelper.py | 2 +- .../GenericMonitoringTool.h | 9 +- .../AthenaMonitoringKernel/HistogramFiller.h | 5 + .../src/GenericMonitoringTool.cxx | 99 ++-- .../TRTMonitoringRun3/CMakeLists.txt | 19 +- .../TRTMonitoringRun3RAW_Alg.h | 2 + .../python/TRTMonitoringRun3RAW_Alg.py | 50 +- .../src/TRTMonitoringRun3RAW_Alg.cxx | 461 ++++++++---------- .../src/MdtRawDataMonAlg.cxx | 277 ++++++----- 9 files changed, 473 insertions(+), 451 deletions(-) diff --git a/Control/AthenaMonitoring/python/AthMonitorCfgHelper.py b/Control/AthenaMonitoring/python/AthMonitorCfgHelper.py index 227b9d99cb2d..955aeb00492a 100644 --- a/Control/AthenaMonitoring/python/AthMonitorCfgHelper.py +++ b/Control/AthenaMonitoring/python/AthMonitorCfgHelper.py @@ -146,7 +146,7 @@ class AthMonitorCfgHelper(object): Finalize the creation of the set of monitoring algorithms. Returns: - (resobj, monSeq) -- a tuple with a ComponentAccumulator and an AthSequencer + resobj -- a ComponentAccumulator ''' self.resobj.addSequence(self.monSeq) return self.resobj diff --git a/Control/AthenaMonitoringKernel/AthenaMonitoringKernel/GenericMonitoringTool.h b/Control/AthenaMonitoringKernel/AthenaMonitoringKernel/GenericMonitoringTool.h index b152e39e4b5b..f643f8b31e46 100644 --- a/Control/AthenaMonitoringKernel/AthenaMonitoringKernel/GenericMonitoringTool.h +++ b/Control/AthenaMonitoringKernel/AthenaMonitoringKernel/GenericMonitoringTool.h @@ -72,7 +72,8 @@ public: virtual uint32_t lumiBlock(); private: - + void invokeFillersDebug(const std::shared_ptr<Monitored::HistogramFiller>& filler, + const std::vector<std::reference_wrapper<Monitored::IMonitoredVariable>>& monitoredVariables) const; /// THistSvc (do NOT fix the service type (only the name) to allow for a different implementation online ServiceHandle<ITHistSvc> m_histSvc { this, "THistSvc", "THistSvc", "Histogramming svc" }; @@ -83,9 +84,9 @@ private: BooleanProperty m_useCache { this, "UseCache", true, "Cache filler lookups" }; std::vector<std::shared_ptr<Monitored::HistogramFiller>> m_fillers; //!< plain list of fillers - mutable std::mutex m_fillMutex; - mutable Monitored::HistogramFiller::VariablesPack m_vars ATLAS_THREAD_SAFE; - mutable std::map<std::vector<std::string>,std::vector<std::shared_ptr<Monitored::HistogramFiller>>,std::less<>> m_fillerCacheMap ATLAS_THREAD_SAFE; //!< lookup map to speed up filler searches + mutable std::map<std::vector<std::string>,std::unique_ptr<std::vector<std::shared_ptr<Monitored::HistogramFiller>>>,std::less<>> m_fillerCacheMap ATLAS_THREAD_SAFE; //!< lookup map to speed up filler searches + mutable std::mutex m_cacheMutex; + }; /** diff --git a/Control/AthenaMonitoringKernel/AthenaMonitoringKernel/HistogramFiller.h b/Control/AthenaMonitoringKernel/AthenaMonitoringKernel/HistogramFiller.h index 7e9e7e8c8e71..0a074d164ac3 100644 --- a/Control/AthenaMonitoringKernel/AthenaMonitoringKernel/HistogramFiller.h +++ b/Control/AthenaMonitoringKernel/AthenaMonitoringKernel/HistogramFiller.h @@ -129,6 +129,10 @@ namespace Monitored { return m_histDef->cutMask; } + const std::unique_lock<std::mutex> getLock() const { + return std::unique_lock(m_lock); + } + protected: template <class H> H* histogram() const { @@ -179,6 +183,7 @@ namespace Monitored { std::shared_ptr<HistogramDef> m_histDef; std::shared_ptr<IHistogramProvider> m_histogramProvider; + mutable std::mutex m_lock; private: HistogramFiller& operator=(HistogramFiller const&) = delete; diff --git a/Control/AthenaMonitoringKernel/src/GenericMonitoringTool.cxx b/Control/AthenaMonitoringKernel/src/GenericMonitoringTool.cxx index ea0575f4a100..cafa55610621 100644 --- a/Control/AthenaMonitoringKernel/src/GenericMonitoringTool.cxx +++ b/Control/AthenaMonitoringKernel/src/GenericMonitoringTool.cxx @@ -125,37 +125,48 @@ namespace std { } } +namespace { + // this exists to avoid reallocating memory on every invokeFillers call + thread_local Monitored::HistogramFiller::VariablesPack tl_vars ATLAS_THREAD_SAFE; +} + void GenericMonitoringTool::invokeFillers(const std::vector<std::reference_wrapper<Monitored::IMonitoredVariable>>& monitoredVariables) const { - std::scoped_lock guard(m_fillMutex); // This is the list of fillers to consider in the invocation. // If we are using the cache then this may be a proper subset of m_fillers; otherwise will just be m_fillers const std::vector<std::shared_ptr<Monitored::HistogramFiller>>* fillerList{nullptr}; // do we need to update the cache? bool makeCache = false; - // list of matched fillers, if we need to update the cache - std::vector<std::shared_ptr<Monitored::HistogramFiller>> matchedFillerList; + // pointer to list of matched fillers, if we need to update the cache (default doesn't create the vector) + std::unique_ptr<std::vector<std::shared_ptr<Monitored::HistogramFiller>>> matchedFillerList; if (m_useCache) { + // lock the cache during lookup + std::scoped_lock cacheguard(m_cacheMutex); const auto match = m_fillerCacheMap.find(monitoredVariables); if (match != m_fillerCacheMap.end()) { - fillerList = &(match->second); + fillerList = match->second.get(); } else { fillerList = &m_fillers; + matchedFillerList = std::make_unique<std::vector<std::shared_ptr<Monitored::HistogramFiller>>>(); makeCache = true; } } else { fillerList = &m_fillers; } + for ( auto filler: *fillerList ) { - m_vars.reset(); + tl_vars.reset(); const int fillerCardinality = filler->histogramVariablesNames().size() + (filler->histogramWeightName().empty() ? 0: 1) + (filler->histogramCutMaskName().empty() ? 0 : 1); if ( fillerCardinality == 1 ) { // simplest case, optimising this to be super fast for ( auto& var: monitoredVariables ) { if ( var.get().name().compare( filler->histogramVariablesNames()[0] ) == 0 ) { - m_vars.var[0] = &var.get(); - filler->fill( m_vars ); + tl_vars.var[0] = &var.get(); + { + auto guard{filler->getLock()}; + filler->fill( tl_vars ); + } if (makeCache) { - matchedFillerList.push_back(filler); + matchedFillerList->push_back(filler); } break; } @@ -166,7 +177,7 @@ void GenericMonitoringTool::invokeFillers(const std::vector<std::reference_wrapp bool matched = false; for ( unsigned fillerVarIndex = 0; fillerVarIndex < filler->histogramVariablesNames().size(); ++fillerVarIndex ) { if ( var.get().name().compare( filler->histogramVariablesNames()[fillerVarIndex] ) == 0 ) { - m_vars.set(fillerVarIndex, &var.get()); + tl_vars.set(fillerVarIndex, &var.get()); matched = true; matchesCount++; break; @@ -175,51 +186,65 @@ void GenericMonitoringTool::invokeFillers(const std::vector<std::reference_wrapp if ( matchesCount == fillerCardinality ) break; if ( not matched ) { // may be a weight or cut variable still if ( var.get().name().compare( filler->histogramWeightName() ) == 0 ) { - m_vars.weight = &var.get(); + tl_vars.weight = &var.get(); matchesCount ++; } else if ( var.get().name().compare( filler->histogramCutMaskName() ) == 0 ) { - m_vars.cut = &var.get(); + tl_vars.cut = &var.get(); matchesCount++; } } if ( matchesCount == fillerCardinality ) break; } if ( matchesCount == fillerCardinality ) { - filler->fill( m_vars ); + { + auto guard{filler->getLock()}; + filler->fill( tl_vars ); + } if (makeCache) { - matchedFillerList.push_back(filler); + matchedFillerList->push_back(filler); } } else if ( ATH_UNLIKELY( matchesCount != 0 ) ) { // something has matched, but not all, worth informing user - bool reasonFound = false; - if (ATH_UNLIKELY(!filler->histogramWeightName().empty() && !m_vars.weight)) { - reasonFound = true; - ATH_MSG_DEBUG("Filler weight not found in monitoredVariables:" - << "\n Filler weight : " << filler->histogramWeightName() - << "\n Asked to fill from mon. vars: " << monitoredVariables); - } - if (ATH_UNLIKELY(!filler->histogramCutMaskName().empty() && !m_vars.cut)) { - reasonFound = true; - ATH_MSG_DEBUG("Filler cut mask not found in monitoredVariables:" - << "\n Filler cut mask : " << filler->histogramCutMaskName() - << "\n Asked to fill from mon. vars: " << monitoredVariables); - } - if ( not reasonFound ) { - ATH_MSG_DEBUG("Filler has different variables than monitoredVariables:" - << "\n Filler variables : " << filler->histogramVariablesNames() - << "\n Asked to fill from mon. vars: " << monitoredVariables - << "\n Selected monitored variables: " << m_vars.names() ); - } + invokeFillersDebug(filler, monitoredVariables); } } } if (makeCache) { - std::vector<std::string> key; - key.reserve(monitoredVariables.size()); - for (const auto& mv : monitoredVariables) { - key.push_back(mv.get().name()); + // we may hit this multiple times. If another thread has updated the cache in the meanwhile, don't update + // (or we might delete the fillerList under another thread) + std::scoped_lock cacheguard(m_cacheMutex); + const auto match = m_fillerCacheMap.find(monitoredVariables); + if (match == m_fillerCacheMap.end()) { + std::vector<std::string> key; + key.reserve(monitoredVariables.size()); + for (const auto& mv : monitoredVariables) { + key.push_back(mv.get().name()); + } + m_fillerCacheMap[key].swap(matchedFillerList); } - m_fillerCacheMap[key] = matchedFillerList; + } +} + +void GenericMonitoringTool::invokeFillersDebug(const std::shared_ptr<Monitored::HistogramFiller>& filler, + const std::vector<std::reference_wrapper<Monitored::IMonitoredVariable>>& monitoredVariables) const { + bool reasonFound = false; + if (ATH_UNLIKELY(!filler->histogramWeightName().empty() && !tl_vars.weight)) { + reasonFound = true; + ATH_MSG_DEBUG("Filler weight not found in monitoredVariables:" + << "\n Filler weight : " << filler->histogramWeightName() + << "\n Asked to fill from mon. tl_vars: " << monitoredVariables); + } + if (ATH_UNLIKELY(!filler->histogramCutMaskName().empty() && !tl_vars.cut)) { + reasonFound = true; + ATH_MSG_DEBUG("Filler cut mask not found in monitoredVariables:" + << "\n Filler cut mask : " << filler->histogramCutMaskName() + << "\n Asked to fill from mon. tl_vars: " << monitoredVariables); + } + if ( not reasonFound ) { + ATH_MSG_DEBUG("Filler has different variables than monitoredVariables:" + << "\n Filler variables : " << filler->histogramVariablesNames() + << "\n Asked to fill from mon. tl_vars: " << monitoredVariables + << "\n Selected monitored variables: " << tl_vars.names() ); } } diff --git a/InnerDetector/InDetMonitoring/TRTMonitoringRun3/CMakeLists.txt b/InnerDetector/InDetMonitoring/TRTMonitoringRun3/CMakeLists.txt index 61820cf9cf6f..80f48d09090a 100644 --- a/InnerDetector/InDetMonitoring/TRTMonitoringRun3/CMakeLists.txt +++ b/InnerDetector/InDetMonitoring/TRTMonitoringRun3/CMakeLists.txt @@ -5,26 +5,13 @@ # Declare the package name: atlas_subdir( TRTMonitoringRun3 ) - -# External dependencies: -find_package( Eigen ) -find_package( GeoModelCore ) -find_package( CORAL COMPONENTS CoralBase CoralKernel RelationalAccess ) -find_package( ROOT COMPONENTS Tree Hist RIO pthread MathCore Core Graf Graf3d Gpad Html Postscript Gui GX11TTF GX11) - -atlas_add_library( TRTMonitoringRun3Lib - src/*.cxx - PUBLIC_HEADERS TRTMonitoringRun3 - INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS} ${GEOMODELCORE_INCLUDE_DIRS} - PRIVATE_INCLUDE_DIRS ${CORAL_INCLUDE_DIRS} - LINK_LIBRARIES ${ROOT_LIBRARIES} ${EIGEN_LIBRARIES} ${GEOMODELCORE_LIBRARIES} AthenaBaseComps xAODEventInfo InDetPrepRawData GaudiKernel TRT_ConditionsServicesLib InDetReadoutGeometry TRT_ReadoutGeometry InDetRawData TrkTrack TrkToolInterfaces AthenaMonitoringLib CommissionEvent TrkSpacePoint MagFieldInterfaces InDetByteStreamErrors - PRIVATE_LINK_LIBRARIES ${CORAL_LIBRARIES} AthenaKernel SGTools SGAudCore AthenaPoolUtilities LumiBlockCompsLib EventInfo LWHists TrkTrackSummary InDetRIO_OnTrack InDetIdentifier TrkRIO_OnTrack TrkParameters TrkMeasurementBase TrkEventUtils TrkSurfaces PathResolver EventPrimitives Identifier AtlasDetDescr AthContainers TRT_DriftFunctionToolLib ) - + atlas_add_component( TRTMonitoringRun3 src/*.cxx src/components/*.cxx INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${CORAL_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS} ${GEOMODELCORE_INCLUDE_DIRS} - LINK_LIBRARIES ${ROOT_LIBRARIES} ${EIGEN_LIBRARIES} ${GEOMODELCORE_LIBRARIES} TRTMonitoringRun3Lib AthenaMonitoringLib SGAudCore SGTools AthenaPoolUtilities GaudiKernel EventInfo InDetRawData InDetPrepRawData LumiBlockCompsLib CommissionEvent AthContainers AtlasDetDescr Identifier xAODEventInfo EventPrimitives TRT_ConditionsServicesLib InDetReadoutGeometry TRT_ReadoutGeometry InDetRIO_OnTrack LWHists TrkTrack TrkTrackSummary TrkToolInterfaces AthenaKernel InDetIdentifier MagFieldInterfaces PathResolver TrkSurfaces TrkEventUtils TrkMeasurementBase TrkParameters TrkRIO_OnTrack TrkSpacePoint TRT_DriftFunctionToolLib ) + LINK_LIBRARIES AthenaMonitoringLib TrkToolInterfaces CommissionEvent TRT_DriftFunctionToolLib TRT_ConditionsServicesLib MagFieldInterfaces InDetByteStreamErrors InDetRIO_OnTrack + ) # Install files from the package: atlas_install_python_modules( python/*.py ) diff --git a/InnerDetector/InDetMonitoring/TRTMonitoringRun3/TRTMonitoringRun3/TRTMonitoringRun3RAW_Alg.h b/InnerDetector/InDetMonitoring/TRTMonitoringRun3/TRTMonitoringRun3/TRTMonitoringRun3RAW_Alg.h index 5fa1277d7147..c73a34741ef0 100644 --- a/InnerDetector/InDetMonitoring/TRTMonitoringRun3/TRTMonitoringRun3/TRTMonitoringRun3RAW_Alg.h +++ b/InnerDetector/InDetMonitoring/TRTMonitoringRun3/TRTMonitoringRun3/TRTMonitoringRun3RAW_Alg.h @@ -27,6 +27,7 @@ #include "TrkToolInterfaces/ITrackHoleSearchTool.h" #include "TRT_DriftFunctionTool/ITRT_DriftFunctionTool.h" #include "TRT_ConditionsServices/ITRT_CalDbTool.h" +#include "TRT_ConditionsServices/ITRT_StrawNeighbourSvc.h" #include "MagFieldInterfaces/IMagFieldSvc.h" @@ -113,6 +114,7 @@ private: // Services ToolHandle<ITRT_StrawStatusSummaryTool> m_sumTool; + ServiceHandle<ITRT_StrawNeighbourSvc> m_TRTStrawNeighbourSvc; // Data handles SG::ReadHandleKey<TRT_RDO_Container> m_rdoContainerKey{this, "TRTRawDataObjectName", "TRT_RDOs", "Name of TRT RDOs container"}; diff --git a/InnerDetector/InDetMonitoring/TRTMonitoringRun3/python/TRTMonitoringRun3RAW_Alg.py b/InnerDetector/InDetMonitoring/TRTMonitoringRun3/python/TRTMonitoringRun3RAW_Alg.py index 4ff8ded4e02d..386b2a49ba2d 100644 --- a/InnerDetector/InDetMonitoring/TRTMonitoringRun3/python/TRTMonitoringRun3RAW_Alg.py +++ b/InnerDetector/InDetMonitoring/TRTMonitoringRun3/python/TRTMonitoringRun3RAW_Alg.py @@ -55,33 +55,33 @@ def TRTMonitoringRun3RAW_AlgConfig(inputFlags): elif i >= numberOfStacks[ibe]: oss = 'TRT/EndcapC/Sector' + str(i + 1 - 32) - rdoStackGroup.defineHistogram('HitWMapS_passed,HitWMapS;hHitWMapS',type='TEfficiency',title='Leading Edge in Time Window: Straws;Straw Number in Stack;Probability per Event',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) - rdoStackGroup.defineHistogram('HitTrWMapS_x,HitTrWMapS_y;hHitTrWMapS',type='TProfile',title='Mean Trailing Edge in Time Window: Straws;Straw Number in Stack;Time (ns)',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) - rdoStackGroup.defineHistogram('HitTrMapS_x,HitTrMapS_y;hHitTrMapS',type='TProfile',title='Mean Trailing Edge: Straws;Straw Number in Stack;Time (ns)',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) - rdoStackGroup.defineHistogram('HitAWMapS_passed,HitAWMapS;hHitAWMapS',type='TEfficiency',title='LL in Time Window: Straws;Straw Number in Stack;Probability',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) - rdoStackGroup.defineHistogram('HitAMapS_passed,HitAMapS;hHitAMapS',type='TEfficiency',title='Any LL Bit: Straws;Straw Number in Stack;Probability',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) + rdoStackGroup.defineHistogram('HitWMapS_passed,strawNumber;hHitWMapS',type='TEfficiency',title='Leading Edge in Time Window: Straws;Straw Number in Stack;Probability per Event',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) + rdoStackGroup.defineHistogram('strawNumber,HitTrMapS_y;hHitTrWMapS',cutmask='HitTrWMapS_cut',type='TProfile',title='Mean Trailing Edge in Time Window: Straws;Straw Number in Stack;Time (ns)',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) + rdoStackGroup.defineHistogram('strawNumber,HitTrMapS_y;hHitTrMapS',type='TProfile',title='Mean Trailing Edge: Straws;Straw Number in Stack;Time (ns)',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) + rdoStackGroup.defineHistogram('HitAWMapS_passed,strawNumber;hHitAWMapS',type='TEfficiency',title='LL in Time Window: Straws;Straw Number in Stack;Probability',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) + rdoStackGroup.defineHistogram('HitAMapS_passed,strawNumber;hHitAMapS',type='TEfficiency',title='Any LL Bit: Straws;Straw Number in Stack;Probability',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) rdoStackGroup.defineHistogram('StrawOcc_passed,StrawOcc;hOccupancyS',type='TEfficiency',title='Straw Occupancy Distribution: Straws;Occupancy;Number of Straws',path=oss,xbins=201,xmin=0,xmax=1.005) - rdoStackGroup.defineHistogram('HitToTMapS_x,HitToTMapS_y;hHitToTMapS',type='TProfile',title='Mean ToT: Straws;Straw Number in Stack;Time (ns)',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) - rdoStackGroup.defineHistogram('HitToTLongMapS_x,HitToTLongMapS_y;hHitToTLongMapS',type='TProfile',title='Mean ToT for Straws with ToT > LongToTCut: Straws;Straw Number in Stack;Time (ns)',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) - rdoStackGroup.defineHistogram('HitToTLongTrMapS_x,HitToTLongTrMapS_y;hHitToTLongTrMapS',type='TProfile',title='Mean Trailing Edge for Straws with ToT > LongToTCut: Straws;Straw Number in Stack;Probability',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) - rdoStackGroup.defineHistogram('HitHMapS_passed,HitHMapS;hHitHMapS',type='TEfficiency',title='Any HL Bit: Straws;Straw Number in Stack;Probability',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) - rdoStackGroup.defineHistogram('HitHWMapS_passed,HitHWMapS;hHitHWMapS',type='TEfficiency',title='HL in Time Window: Straws;Straw Number in Stack;Probability',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) + rdoStackGroup.defineHistogram('strawNumber,HitToTMapS_y;hHitToTMapS',type='TProfile',title='Mean ToT: Straws;Straw Number in Stack;Time (ns)',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) + rdoStackGroup.defineHistogram('strawNumber,HitToTMapS_y;hHitToTLongMapS',cutmask='HitToTLong_cut',type='TProfile',title='Mean ToT for Straws with ToT > LongToTCut: Straws;Straw Number in Stack;Time (ns)',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) + rdoStackGroup.defineHistogram('strawNumber,HitTrMapS_y;hHitToTLongTrMapS',cutmask='HitToTLong_cut',type='TProfile',title='Mean Trailing Edge for Straws with ToT > LongToTCut: Straws;Straw Number in Stack;Probability',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) + rdoStackGroup.defineHistogram('HitHMapS_passed,strawNumber;hHitHMapS',type='TEfficiency',title='Any HL Bit: Straws;Straw Number in Stack;Probability',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) + rdoStackGroup.defineHistogram('HitHWMapS_passed,strawNumber;hHitHWMapS',type='TEfficiency',title='HL in Time Window: Straws;Straw Number in Stack;Probability',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) rdoStackGroup.defineHistogram('HtoLMapS_passed,HtoLMapS;hHtoLMapS',type='TEfficiency',title='HL/LL Ratio: Straws;Straw Number in Stack;Probability',path=oss,xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) - rdoStackGroup.defineHistogram('HitWMapC_passed,HitWMapC;hHitWMapC',type='TEfficiency',title='Leading Edge in Time Window: Chips;Chip Number in Stack;Probability',path=oss,xbins=iChipMax[ibe],xmin=0,xmax=iChipMax[ibe]) - rdoStackGroup.defineHistogram('HitTrMapC_x,HitTrMapC_y;hHitTrMapC',type='TProfile',title='Mean Trailing Edge: Chips;Chip Number in Stack;Time (ns)',path=oss,xbins=iChipMax[ibe],xmin=0,xmax=iChipMax[ibe]) - rdoStackGroup.defineHistogram('HitTrWMapC_x,HitTrWMapC_y;hHitTrWMapC',type='TProfile',title='Mean Trailing Edge in Time Window: Chips;Chip Number in Stack;Time (ns)',path=oss,xbins=iChipMax[ibe],xmin=0,xmax=iChipMax[ibe]) - rdoStackGroup.defineHistogram('HitAWMapC_passed,HitAWMapC;hHitAWMapC',type='TEfficiency',title='LL in Time Window: Chips;Chip Number in Stack;Probability',path=oss,xbins=iChipMax[ibe],xmin=0,xmax=iChipMax[ibe]) - rdoStackGroup.defineHistogram('HitAMapC_passed,HitAMapC;hHitAMapC',type='TEfficiency',title='Any LL Bit: Chips;Chip Number in Stack;Probability',path=oss,xbins=iChipMax[ibe],xmin=0,xmax=iChipMax[ibe]) + rdoStackGroup.defineHistogram('HitWMapC_passed,chipNumber;hHitWMapC',type='TEfficiency',title='Leading Edge in Time Window: Chips;Chip Number in Stack;Probability',path=oss,xbins=iChipMax[ibe],xmin=0,xmax=iChipMax[ibe]) + rdoStackGroup.defineHistogram('chipNumber,HitTrMapC_y;hHitTrMapC',type='TProfile',title='Mean Trailing Edge: Chips;Chip Number in Stack;Time (ns)',path=oss,xbins=iChipMax[ibe],xmin=0,xmax=iChipMax[ibe]) + rdoStackGroup.defineHistogram('chipNumber,HitTrMapC_y;hHitTrWMapC',cutmask='HitTrWMapC_cut',type='TProfile',title='Mean Trailing Edge in Time Window: Chips;Chip Number in Stack;Time (ns)',path=oss,xbins=iChipMax[ibe],xmin=0,xmax=iChipMax[ibe]) + rdoStackGroup.defineHistogram('HitAWMapC_passed,chipNumber;hHitAWMapC',type='TEfficiency',title='LL in Time Window: Chips;Chip Number in Stack;Probability',path=oss,xbins=iChipMax[ibe],xmin=0,xmax=iChipMax[ibe]) + rdoStackGroup.defineHistogram('HitAMapC_passed,chipNumber;hHitAMapC',type='TEfficiency',title='Any LL Bit: Chips;Chip Number in Stack;Probability',path=oss,xbins=iChipMax[ibe],xmin=0,xmax=iChipMax[ibe]) rdoStackGroup.defineHistogram('OccupancyC_passed,OccupancyC;hChipOcc',type='TEfficiency',title='Chip Occupancy Distribution;Occupancy;Number of Chips',path=oss,xbins=201,xmin=0,xmax=1.005) - rdoStackGroup.defineHistogram('HitToTMapC_x,HitToTMapC_y;hHitToTMapC',type='TProfile',title='Mean ToT: Chips;Chip Number in Stack;Time (ns)',path=oss,xbins=iChipMax[ibe],xmin=0,xmax=iChipMax[ibe]) - rdoStackGroup.defineHistogram('HitHMapC_passed,HitHMapC;hHitHMapC',type='TEfficiency',title='Any HL Bit: Chips;Chip Number in Stack;Probability',path=oss,xbins=iChipMax[ibe],xmin=0,xmax=iChipMax[ibe]) - rdoStackGroup.defineHistogram('HitHWMapC_passed,HitHWMapC;hHitHWMapC',type='TEfficiency',title='HL in Time Window: Chips;Chip Number in Stack;Probability',path=oss,xbins=iChipMax[ibe],xmin=0,xmax=iChipMax[ibe]) + rdoStackGroup.defineHistogram('chipNumber,HitToTMapC_y;hHitToTMapC',type='TProfile',title='Mean ToT: Chips;Chip Number in Stack;Time (ns)',path=oss,xbins=iChipMax[ibe],xmin=0,xmax=iChipMax[ibe]) + rdoStackGroup.defineHistogram('HitHMapC_passed,chipNumber;hHitHMapC',type='TEfficiency',title='Any HL Bit: Chips;Chip Number in Stack;Probability',path=oss,xbins=iChipMax[ibe],xmin=0,xmax=iChipMax[ibe]) + rdoStackGroup.defineHistogram('HitHWMapC_passed,chipNumber;hHitHWMapC',type='TEfficiency',title='HL in Time Window: Chips;Chip Number in Stack;Probability',path=oss,xbins=iChipMax[ibe],xmin=0,xmax=iChipMax[ibe]) rdoStackGroup.defineHistogram('HtoLMapC_passed,HtoLMapC;hHtoLMapC',type='TEfficiency',title='HL/LL Ratio: Chips;Chip Number in Stack;Probability',path=oss,xbins=iChipMax[ibe],xmin=0,xmax=iChipMax[ibe]) - rdoStackGroup.defineHistogram('HtoBCMapC_x,HtoBCMapC_y;hHtoBCMapC',type='TH2F',title='HL in BC: Chips;Bunch Crossing ID;Chip Number in Stack',path=oss,xbins=3,xmin=0,xmax=3,ybins=iChipMax[ibe],ymin=0,ymax=iChipMax[ibe]) + rdoStackGroup.defineHistogram('HtoBCMapC_x,chipNumber;hHtoBCMapC',cutmask='HtoBCMap_cut',type='TH2F',title='HL in BC: Chips;Bunch Crossing ID;Chip Number in Stack',path=oss,xbins=3,xmin=0,xmax=3,ybins=iChipMax[ibe],ymin=0,ymax=iChipMax[ibe]) - if ibe == 0: rdoStackGroup.defineHistogram('HtoBCMapB_x,HtoBCMapB_y;hHtoBCMapB',type='TH2F',title='HL in BC: Boards;Bunch Crossing ID;Board Number in Stack',path=oss,xbins=3,xmin=0,xmax=3,ybins=9,ymin=0,ymax=9) - elif ibe == 1: rdoStackGroup.defineHistogram('HtoBCMapB_x,HtoBCMapB_y;hHtoBCMapB',type='TH2F',title='HL in BC: Boards;Bunch Crossing ID;Board Number in Stack',path=oss,xbins=3,xmin=0,xmax=3,ybins=20,ymin=-0.5,ymax=19.5) + if ibe == 0: rdoStackGroup.defineHistogram('HtoBCMapB_x,HtoBCMapB_y;hHtoBCMapB',cutmask='HtoBCMap_cut',type='TH2F',title='HL in BC: Boards;Bunch Crossing ID;Board Number in Stack',path=oss,xbins=3,xmin=0,xmax=3,ybins=9,ymin=0,ymax=9) + elif ibe == 1: rdoStackGroup.defineHistogram('HtoBCMapB_x,HtoBCMapB_y;hHtoBCMapB',cutmask='HtoBCMap_cut',type='TH2F',title='HL in BC: Boards;Bunch Crossing ID;Board Number in Stack',path=oss,xbins=3,xmin=0,xmax=3,ybins=20,ymin=-0.5,ymax=19.5) ### Registering Collisions Histograms ### rdoShiftSmryGroup = helper.addGroup(algTRTMonitoringRun3RAW,'RDOShiftSmryHistograms') @@ -109,15 +109,15 @@ def TRTMonitoringRun3RAW_AlgConfig(inputFlags): rdoGroup = helper.addGroup(algTRTMonitoringRun3RAW,'RDOHistograms{0}'.format(ibe)) rdoGroup.defineHistogram('BCIDvsOcc_x,BCIDvsOcc_y;hBCIDvsOcc',type='TProfile',title='Avg. Occupancy vs BCID{0};Bunch Crossing ID;Occupancy'.format(regionTag),path='TRT/{0}/Expert'.format(barrelOrEndcap[ibe]),xbins=3564,xmin=0,xmax=3564) if ibe == 0: - rdoGroup.defineHistogram('HitWMap_passed,HitWMap;hHitWMap',type='TEfficiency',title='Leading Edge in Time Window: Xenon Straws (Barrel);Straw Number in Stack;Probability',path='TRT/Shift/{0}'.format(str(barrelOrEndcap[ibe])),xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) - rdoGroup.defineHistogram('HitWMap_Ar_passed,HitWMap_Ar;hHitWMap_Ar',type='TEfficiency',title='Leading Edge in Time Window: Argon Straws (Barrel);Straw Number in Stack;Probability',path='TRT/Shift/{0}'.format(barrelOrEndcap[ibe]),xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) + rdoGroup.defineHistogram('HitWMap_passed,strawNumber;hHitWMap',cutmask='isNotAr',type='TEfficiency',title='Leading Edge in Time Window: Xenon Straws (Barrel);Straw Number in Stack;Probability',path='TRT/Shift/{0}'.format(str(barrelOrEndcap[ibe])),xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) + rdoGroup.defineHistogram('HitWMap_passed,strawNumber;hHitWMap_Ar',cutmask='isAr',type='TEfficiency',title='Leading Edge in Time Window: Argon Straws (Barrel);Straw Number in Stack;Probability',path='TRT/Shift/{0}'.format(barrelOrEndcap[ibe]),xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) rdoGroup.defineHistogram('OccAll;hOccAll',type='TH1F',title='Occupancy per Event;Occupancy;Events',path='TRT/Shift/{0}'.format(barrelOrEndcap[ibe]),xbins=400,xmin=0.0,xmax=1.0) elif ibe == 1: for iside in range(2): side = ('A', 'C') rdoEndcapGroup = helper.addGroup(algTRTMonitoringRun3RAW,'RDOHistograms1{0}'.format(iside)) - rdoEndcapGroup.defineHistogram('HitWMap_passed,HitWMap;hHitWMap_{0}'.format(side[iside]),type='TEfficiency',title='Leading Edge in Time Window: Xenon Straws (E{0});Straw Number in Stack;Probability'.format(side[iside]),path='TRT/Shift/{0}'.format(barrelOrEndcap[ibe]),xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) - rdoEndcapGroup.defineHistogram('HitWMap_Ar_passed,HitWMap_Ar;hHitWMap_Ar_{0}'.format(side[iside]),type='TEfficiency',title='Leading Edge in Time Window: Argon Straws (E{0});Straw Number in Stack;Probability'.format(side[iside]),path='TRT/Shift/{0}'.format(barrelOrEndcap[ibe]),xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) + rdoEndcapGroup.defineHistogram('HitWMap_passed,strawNumber;hHitWMap_{0}'.format(side[iside]),cutmask='isNotAr',type='TEfficiency',title='Leading Edge in Time Window: Xenon Straws (E{0});Straw Number in Stack;Probability'.format(side[iside]),path='TRT/Shift/{0}'.format(barrelOrEndcap[ibe]),xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) + rdoEndcapGroup.defineHistogram('HitWMap_passed,strawNumber;hHitWMap_Ar_{0}'.format(side[iside]),cutmask='isAr',type='TEfficiency',title='Leading Edge in Time Window: Argon Straws (E{0});Straw Number in Stack;Probability'.format(side[iside]),path='TRT/Shift/{0}'.format(barrelOrEndcap[ibe]),xbins=strawMax[ibe],xmin=0,xmax=strawMax[ibe]) for iside in range(2): regionTag = ' (' + beId[ibe] + sideId[iside] + ')' regionMarker = (beId[ibe] + sideId[iside]) if isOnline is True else (sideId[iside]) diff --git a/InnerDetector/InDetMonitoring/TRTMonitoringRun3/src/TRTMonitoringRun3RAW_Alg.cxx b/InnerDetector/InDetMonitoring/TRTMonitoringRun3/src/TRTMonitoringRun3RAW_Alg.cxx index 6638d12341b2..ec918c8c4035 100644 --- a/InnerDetector/InDetMonitoring/TRTMonitoringRun3/src/TRTMonitoringRun3RAW_Alg.cxx +++ b/InnerDetector/InDetMonitoring/TRTMonitoringRun3/src/TRTMonitoringRun3RAW_Alg.cxx @@ -41,6 +41,7 @@ TRTMonitoringRun3RAW_Alg::TRTMonitoringRun3RAW_Alg( const std::string& name, ISv ,m_minTRThits(10) ,m_minP(0) ,m_sumTool("TRT_StrawStatusSummaryTool", this) +,m_TRTStrawNeighbourSvc("TRT_StrawNeighbourSvc", name) ,m_isCosmics(false) ,m_EventBurstCut(-1) { @@ -124,6 +125,80 @@ StatusCode TRTMonitoringRun3RAW_Alg::initialize() { ATH_CHECK( m_trackCollectionKey.initialize() ); ATH_CHECK( m_bsErrContKey.initialize(SG::AllowEmpty) ); + // initialize chip lookup maps + ATH_CHECK( m_TRTStrawNeighbourSvc.retrieve() ); + + //loop over straw hash index to create straw number mapping for TRTViewer + unsigned int maxHash = m_pTRTHelper->straw_layer_hash_max(); + + for (int ibe = 0; ibe < 2; ibe++) { // ibe=0(barrel), ibe=1(endcap) + for (unsigned int index = 0; index < maxHash; index++) { + IdentifierHash idHash = index; + Identifier id = m_pTRTHelper->layer_id(idHash); + int idBarrelEndcap = m_pTRTHelper->barrel_ec(id); + int idLayerWheel = m_pTRTHelper->layer_or_wheel(id); + int idPhiModule = m_pTRTHelper->phi_module(id); + int idStrawLayer = m_pTRTHelper->straw_layer(id); + bool isBarrel = m_pTRTHelper->is_barrel(id); + int idSide; + int sectorflag = 0; + const InDetDD::TRT_BaseElement *element = nullptr; + + if (ibe == 0) { // barrel + idSide = idBarrelEndcap ? 1 : -1; + + if (isBarrel && (idBarrelEndcap == -1)) { + sectorflag = 1; + element = m_mgr->getBarrelElement(idSide, idLayerWheel, idPhiModule, idStrawLayer); + } + } else if (ibe == 1) { // endcap + idSide = idBarrelEndcap ? 1 : 0; + + if (!isBarrel && ((idBarrelEndcap == -2) || (idBarrelEndcap == 2))) { + sectorflag = 1; + element = m_mgr->getEndcapElement(idSide, idLayerWheel, idStrawLayer, idPhiModule);//, idStrawLayer_ec); + } + } + + if (sectorflag == 1) { + if (!element) continue; + + for (unsigned int istraw = 0; istraw < element->nStraws(); istraw++) { + std::vector<Identifier> neighbourIDs; + Identifier strawID = m_pTRTHelper->straw_id(id, int(istraw)); + int i_chip, i_pad; + m_TRTStrawNeighbourSvc->getChip(strawID, i_chip); + m_TRTStrawNeighbourSvc->getPad(id, i_pad); + + if (ibe == 0) { //barrel + if (idLayerWheel == 1) i_chip += 21; + + if (idLayerWheel == 2) i_chip += 54; + + int tempStrawNumber = strawNumber(istraw, idStrawLayer, idLayerWheel); + + if (tempStrawNumber < 0 || tempStrawNumber > (s_Straw_max[ibe] - 1)) { + ATH_MSG_WARNING("Found tempStrawNumber = " << tempStrawNumber << " out of range."); + } else { + m_mat_chip_B[idPhiModule][tempStrawNumber] = i_chip; + m_mat_chip_B[idPhiModule + 32][tempStrawNumber] = i_chip; + } + } else if (ibe == 1) { //endcap + ++i_chip -= 104; + int tempStrawNumber = strawNumberEndCap(istraw, idStrawLayer, idLayerWheel, idPhiModule, idSide); + + if (tempStrawNumber < 0 || tempStrawNumber > (s_Straw_max[ibe] - 1)) { + ATH_MSG_WARNING("Found tempStrawNumber = " << tempStrawNumber << " out of range."); + } else { + m_mat_chip_E[idPhiModule][tempStrawNumber] = i_chip; + m_mat_chip_E[idPhiModule + 32][tempStrawNumber] = i_chip; + } + } + } + } + } + } + return StatusCode::SUCCESS; } @@ -450,6 +525,40 @@ float TRTMonitoringRun3RAW_Alg::radToDegrees(float radValue) const{ return degreeValue; } +struct straw_struct { + int strawNumber; + bool HitWMapS_passed; + bool HitAWMapS_passed; + bool HitAMapS_passed; + bool HitHMapS_passed; + bool HitHWMapS_passed; + float HitTrMapS_y; + float HitToTMapS_y; + bool HitToTLong_cut; + bool HitTrWMapS_cut; +}; + +struct chip_struct { + int chipNumber; + bool HitWMapC_passed; + bool HitAWMapC_passed; + bool HitAMapC_passed; + bool HitHMapC_passed; + bool HitHWMapC_passed; + float HitTrMapC_y; + bool HitTrWMapC_cut; + float HitToTMapC_y; + int HtoBCMapC_x; + int HtoBCMapB_x; + int HtoBCMapB_y; + bool HtoBCMap_cut; +}; + +struct straw_shifter_struct { + int strawNumber; + bool isAr; + bool HitWMap_passed; +}; //Fill the TRT RDO Histograms //----------------------------------------------------------------------------------// @@ -460,22 +569,10 @@ StatusCode TRTMonitoringRun3RAW_Alg::fillTRTRDOs(const TRT_RDO_Container& rdoCon ATH_MSG_DEBUG("Filling TRT RDO Histograms"); // TProfile - auto HitTrWMapS_x = Monitored::Scalar<float>("HitTrWMapS_x", 0.0); - auto HitTrWMapS_y = Monitored::Scalar<float>("HitTrWMapS_y", 0.0); - auto HitTrWMapC_x = Monitored::Scalar<float>("HitTrWMapC_x", 0.0); - auto HitTrWMapC_y = Monitored::Scalar<float>("HitTrWMapC_y", 0.0); - auto HitTrMapC_x = Monitored::Scalar<float>("HitTrMapC_x", 0.0); - auto HitTrMapC_y = Monitored::Scalar<float>("HitTrMapC_y", 0.0); auto HitToTLongTrMapS_x = Monitored::Scalar<float>("HitToTLongTrMapS_x", 0.0); auto HitToTLongTrMapS_y = Monitored::Scalar<float>("HitToTLongTrMapS_y", 0.0); - auto HitToTMapC_x = Monitored::Scalar<float>("HitToTMapC_x", 0.0); - auto HitToTMapC_y = Monitored::Scalar<float>("HitToTMapC_y", 0.0); - auto HitTrMapS_x = Monitored::Scalar<float>("HitTrMapS_x", 0.0); - auto HitTrMapS_y = Monitored::Scalar<float>("HitTrMapS_y", 0.0); auto HitToTLongMapS_x = Monitored::Scalar<float>("HitToTLongMapS_x", 0.0); auto HitToTLongMapS_y = Monitored::Scalar<float>("HitToTLongMapS_y", 0.0); - auto HitToTMapS_x = Monitored::Scalar<float>("HitToTMapS_x", 0.0); - auto HitToTMapS_y = Monitored::Scalar<float>("HitToTMapS_y", 0.0); auto BCIDvsOcc_x = Monitored::Scalar<float>("BCIDvsOcc_x", 0.0); auto BCIDvsOcc_y = Monitored::Scalar<float>("BCIDvsOcc_y", 0.0); auto AvgHLOcc_side_x = Monitored::Scalar<float>("AvgHLOcc_side_x", 0.0); @@ -497,30 +594,10 @@ StatusCode TRTMonitoringRun3RAW_Alg::fillTRTRDOs(const TRT_RDO_Container& rdoCon auto SummaryWeight = Monitored::Scalar<float>("SummaryWeight", 0.0); // TH2F - auto HtoBCMapC_x = Monitored::Scalar<float>("HtoBCMapC_x", 0.0); - auto HtoBCMapC_y = Monitored::Scalar<float>("HtoBCMapC_y", 0.0); - auto HtoBCMapB_x = Monitored::Scalar<float>("HtoBCMapB_x", 0.0); - auto HtoBCMapB_y = Monitored::Scalar<float>("HtoBCMapB_y", 0.0); // TEfficiency - auto HitWMapS = Monitored::Scalar<float>("HitWMapS", 0.0); - auto HitWMapS_passed = Monitored::Scalar<bool>("HitWMapS_passed", false); - auto HitAWMapS = Monitored::Scalar<float>("HitAWMapS", 0.0); - auto HitAWMapS_passed = Monitored::Scalar<bool>("HitAWMapS_passed", false); - auto HitAMapS = Monitored::Scalar<float>("HitAMapS", 0.0); - auto HitAMapS_passed = Monitored::Scalar<bool>("HitAMapS_passed", false); - auto HitHMapS = Monitored::Scalar<float>("HitHMapS", 0.0); - auto HitHMapS_passed = Monitored::Scalar<bool>("HitHMapS_passed", false); - auto HitHWMapS = Monitored::Scalar<float>("HitHWMapS", 0.0); - auto HitHWMapS_passed = Monitored::Scalar<bool>("HitHWMapS_passed", false); auto HtoLMapS = Monitored::Scalar<float>("HtoLMapS", 0.0); auto HtoLMapS_passed = Monitored::Scalar<bool>("HtoLMapS_passed", false); - auto HitWMapC = Monitored::Scalar<float>("HitWMapC", 0.0); - auto HitWMapC_passed = Monitored::Scalar<bool>("HitWMapC_passed", false); - auto HitAWMapC = Monitored::Scalar<float>("HitAWMapC", 0.0); - auto HitAWMapC_passed = Monitored::Scalar<bool>("HitAWMapC_passed", false); - auto HitAMapC = Monitored::Scalar<float>("HitAMapC", 0.0); - auto HitAMapC_passed = Monitored::Scalar<bool>("HitAMapC_passed", false); auto HitWMap_A = Monitored::Scalar<float>("HitWMap_A", 0.0); auto HitWMap_A_passed = Monitored::Scalar<bool>("HitWMap_A_passed", false); auto HitWMap_C = Monitored::Scalar<float>("HitWMap_C", 0.0); @@ -529,16 +606,8 @@ StatusCode TRTMonitoringRun3RAW_Alg::fillTRTRDOs(const TRT_RDO_Container& rdoCon auto HitWMap_Ar_A_passed = Monitored::Scalar<bool>("HitWMap_Ar_A_passed", false); auto HitWMap_Ar_C = Monitored::Scalar<float>("HitWMap_Ar_C", 0.0); auto HitWMap_Ar_C_passed = Monitored::Scalar<bool>("HitWMap_Ar_C_passed", false); - auto HitHMapC = Monitored::Scalar<float>("HitHMapC", 0.0); - auto HitHMapC_passed = Monitored::Scalar<bool>("HitHMapC_passed", false); - auto HitHWMapC = Monitored::Scalar<float>("HitHWMapC", 0.0); - auto HitHWMapC_passed = Monitored::Scalar<bool>("HitHWMapC_passed", false); auto HtoLMapC = Monitored::Scalar<float>("HtoLMapC", 0.0); auto HtoLMapC_passed = Monitored::Scalar<bool>("HtoLMapC_passed", false); - auto HitWMap = Monitored::Scalar<float>("HitWMap", 0.0); - auto HitWMap_passed = Monitored::Scalar<bool>("HitWMap_passed", false); - auto HitWMap_Ar = Monitored::Scalar<float>("HitWMap_Ar", 0.0); - auto HitWMap_Ar_passed = Monitored::Scalar<bool>("HitWMap_Ar_passed", false); auto OccupancyC = Monitored::Scalar<float>("OccupancyC", 0.0); auto OccupancyC_passed = Monitored::Scalar<bool>("OccupancyC_passed", false); auto IntLum = Monitored::Scalar<float>("IntLum", 0.0); @@ -626,6 +695,10 @@ StatusCode TRTMonitoringRun3RAW_Alg::fillTRTRDOs(const TRT_RDO_Container& rdoCon int nhitsall = 0; + std::map<int,std::map<int, std::vector<straw_struct>>> straw_map; + std::map<int,std::map<int, std::vector<chip_struct>>> chip_map; + std::map<int,std::vector<straw_shifter_struct>> straw_shifter_map; + for (; RDO_CollectionBegin != RDO_CollectionEnd; ++RDO_CollectionBegin) { const InDetRawDataCollection<TRT_RDORawData> *TRT_Collection(*RDO_CollectionBegin); @@ -730,18 +803,15 @@ StatusCode TRTMonitoringRun3RAW_Alg::fillTRTRDOs(const TRT_RDO_Container& rdoCon } else if (iside == 1) { iphi_module = phi_module + 32; } - if (ibe == 0) { - nTRTHits[ibe]++; - if (m_doStraws) { - if (isArgonStraw) { - HitWMap_Ar = thisStrawNumber; - fill("RDOHistograms0", HitWMap_Ar_passed, HitWMap_Ar); - } else { - HitWMap = thisStrawNumber; - fill("RDOHistograms0", HitWMap_passed, HitWMap); - } - } + if (m_doStraws) { + straw_shifter_struct& this_struct = straw_shifter_map[barrel_ec].emplace_back(); + this_struct.strawNumber = thisStrawNumber; + this_struct.isAr = isArgonStraw; + this_struct.HitWMap_passed = false; + } + nTRTHits[ibe]++; + if (ibe == 0) { if (m_doShift) { // m_nHitsperLB_B++; @@ -753,16 +823,6 @@ StatusCode TRTMonitoringRun3RAW_Alg::fillTRTRDOs(const TRT_RDO_Container& rdoCon } else if (ibe == 1) { nTRTHits[ibe]++; - if (m_doStraws) { - if (isArgonStraw) { - HitWMap_Ar = thisStrawNumber; - fill("RDOHistograms1"+std::to_string(iside), HitWMap_Ar_passed, HitWMap_Ar); - } else { - HitWMap = thisStrawNumber; - fill("RDOHistograms1"+std::to_string(iside), HitWMap_passed, HitWMap); - } - } - if (m_doShift) { // m_nHitsperLB_E[iside]++; @@ -772,196 +832,54 @@ StatusCode TRTMonitoringRun3RAW_Alg::fillTRTRDOs(const TRT_RDO_Container& rdoCon } } - if (m_doExpert) { - if (m_doStraws) { // Experimental - HitWMapS = thisStrawNumber; - HitWMapS_passed = 0.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitWMapS_passed, HitWMapS); - } - if (m_doChips) { // Experimental - HitWMapC = chip - 1; - HitWMapC_passed = 0.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitWMapC_passed, HitWMapC); - } - if ( (driftTimeBin > 2) && (driftTimeBin < 17) ) { - if (m_doStraws) { - HitWMapS = thisStrawNumber; - HitWMapS_passed = 1.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitWMapS_passed, HitWMapS); - } - if (m_doChips) { - HitWMapC = chip - 1; - HitWMapC_passed = 1.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitWMapC_passed, HitWMapC); - } - } + if (m_doExpert) { float trailingEdgeScaled = (trailingEdge + 1)*3.125; - if ((trailingEdge < 23) && !lastBinHigh && !firstBinHigh) { - if (m_doStraws) { - HitTrWMapS_x = thisStrawNumber; - HitTrWMapS_y = trailingEdgeScaled; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitTrWMapS_x, HitTrWMapS_y); - } - if (m_doChips) { - HitTrWMapC_x = chip - 1; - HitTrWMapC_y = trailingEdgeScaled; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitTrWMapC_x, HitTrWMapC_y); - } - } - if (m_doStraws) { - HitTrMapS_x = thisStrawNumber; - HitTrMapS_y = trailingEdgeScaled; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitTrMapS_x, HitTrMapS_y); - } - if (m_doChips) { - HitTrMapC_x = chip - 1; - HitTrMapC_y = trailingEdgeScaled; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitTrMapC_x, HitTrMapC_y); - } - if (m_doStraws) { // Experimental - HitHMapS = thisStrawNumber; - HitHMapS_passed = 0.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitHMapS_passed, HitHMapS); + straw_struct& this_struct = straw_map[ibe][iphi_module].emplace_back(); + this_struct.strawNumber=thisStrawNumber; + this_struct.HitWMapS_passed=((driftTimeBin > 2) && (driftTimeBin < 17) ? 1 : 0); + this_struct.HitHMapS_passed=highlevel; + this_struct.HitHWMapS_passed=(highlevel && is_middleHTbit_high); + this_struct.HitTrMapS_y=trailingEdgeScaled; + this_struct.HitAMapS_passed=((firstBinHigh || lastBinHigh || driftTimeBin > 0 || trailingEdge < 23) ? 1 : 0); + this_struct.HitAWMapS_passed=(is_anybininVgate_high ? 1 : 0); + this_struct.HitToTMapS_y = timeOverThreshold; + this_struct.HitToTLong_cut = (timeOverThreshold > m_longToTCut); + this_struct.HitTrWMapS_cut = (trailingEdge < 23) && !lastBinHigh && !firstBinHigh; } if (m_doChips) { // Experimental - HitHMapC = chip - 1; - HitHMapC_passed = 0.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitHMapC_passed, HitHMapC); - } - if (highlevel) { - if (m_doStraws) { - HitHMapS = thisStrawNumber; - HitHMapS_passed = 1.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitHMapS_passed, HitHMapS); - } - if (m_doChips) { - HitHMapC = chip - 1; - HitHMapC_passed = 1.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitHMapC_passed, HitHMapC); - } - - if (m_doStraws) { // Experimental - HitHWMapS = thisStrawNumber; - HitHWMapS_passed = 0.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitHWMapS_passed, HitHWMapS); - } - if (m_doChips) { // Experimental - HitHWMapC = chip - 1; - HitHWMapC_passed = 0.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitHWMapC_passed, HitHWMapC); - } - if (is_middleHTbit_high) { - if (m_doStraws) { - HitHWMapS = thisStrawNumber; - HitHWMapS_passed = 1.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitHWMapS_passed, HitHWMapS); - } - if (m_doChips) { - HitHWMapC = chip - 1; - HitHWMapC_passed = 1.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitHWMapC_passed, HitHWMapC); - } - } - } - - if (m_doStraws) { // Experimental - HitAMapS = thisStrawNumber; - HitAMapS_passed = 0.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitAMapS_passed, HitAMapS); - } - if (m_doChips) {// Experimental - HitAMapC = chip - 1; - HitAMapC_passed = 0.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitAMapC_passed, HitAMapC); - } - - if (firstBinHigh || lastBinHigh || driftTimeBin > 0 || trailingEdge < 23) { - if (m_doStraws) { - HitAMapS = thisStrawNumber; - HitAMapS_passed = 1.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitAMapS_passed, HitAMapS); - } - if (m_doChips) { - HitAMapC = chip - 1; - HitAMapC_passed = 1.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitAMapC_passed, HitAMapC); - } - } - - if (m_doStraws) {// Experimental - HitAWMapS = thisStrawNumber; - HitAWMapS_passed = 0.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitAWMapS_passed, HitAWMapS); - } - if (m_doChips) {// Experimental - HitAWMapC = chip - 1; - HitAWMapC_passed = 0.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitAWMapC_passed, HitAWMapC); - } - - if ( is_anybininVgate_high) { - if (m_doStraws) { - HitAWMapS = thisStrawNumber; -HitAWMapS_passed = 1.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitAWMapS_passed, HitAWMapS); - } - if (m_doChips) { - HitAWMapC = chip - 1; -HitAWMapC_passed = 1.0; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitAWMapC_passed, HitAWMapC); - } - } - - if (m_doStraws) { - HitToTMapS_x = thisStrawNumber; - HitToTMapS_y = timeOverThreshold; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitToTMapS_x, HitToTMapS_y); - - if (timeOverThreshold > m_longToTCut) { - HitToTLongMapS_x = thisStrawNumber; - HitToTLongMapS_y = timeOverThreshold; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitToTLongMapS_x, HitToTLongMapS_y); - HitToTLongTrMapS_x = thisStrawNumber; - HitToTLongTrMapS_y = trailingEdgeScaled; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitToTLongTrMapS_x, HitToTLongTrMapS_y); - } - } - - if (m_doChips) { - HitToTMapC_x = chip - 1; - HitToTMapC_y = timeOverThreshold; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HitToTMapC_x, HitToTMapC_y); - } - - if (m_doChips) { + chip_struct& this_struct = chip_map[ibe][iphi_module].emplace_back(); + this_struct.chipNumber = chip - 1; + this_struct.HitWMapC_passed = (driftTimeBin > 2) && (driftTimeBin < 17) ? 1 : 0; + this_struct.HitHMapC_passed = highlevel; + this_struct.HitHWMapC_passed = highlevel && is_middleHTbit_high; + this_struct.HitTrMapC_y = trailingEdgeScaled; + this_struct.HitAMapC_passed = ((firstBinHigh || lastBinHigh || driftTimeBin > 0 || trailingEdge < 23) ? 1 : 0); + this_struct.HitAWMapC_passed = is_anybininVgate_high ? 1 : 0; + this_struct.HitToTMapC_y = timeOverThreshold; + this_struct.HitTrWMapC_cut = (trailingEdge < 23) && !lastBinHigh && !firstBinHigh; + this_struct.HtoBCMap_cut=false; + this_struct.HtoBCMapB_y = board - 1; + this_struct.HtoBCMapC_x = -1; + this_struct.HtoBCMapB_x = -1; if (p_lolum->highLevel(1)) { - HtoBCMapC_x = 0.; - HtoBCMapC_y = chip - 1; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HtoBCMapC_x, HtoBCMapC_y); - HtoBCMapB_x = 0.; - HtoBCMapB_y = board - 1; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HtoBCMapB_x, HtoBCMapB_y); + this_struct.HtoBCMapC_x = 0.; + this_struct.HtoBCMapB_x = 0.; + this_struct.HtoBCMap_cut=true; } if (p_lolum->highLevel(2)) { - HtoBCMapC_x = 1.; - HtoBCMapC_y = chip - 1; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HtoBCMapC_x, HtoBCMapC_y); - HtoBCMapB_x = 1.; - HtoBCMapB_y = board - 1; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HtoBCMapB_x, HtoBCMapB_y); + this_struct.HtoBCMapC_x = 1.; + this_struct.HtoBCMapB_x = 1.; + this_struct.HtoBCMap_cut=true; } if (p_lolum->highLevel(3)) { - HtoBCMapC_x = 2.; - HtoBCMapC_y = chip - 1; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HtoBCMapC_x, HtoBCMapC_y); - HtoBCMapB_x = 2.; - HtoBCMapB_y = board - 1; - fill("RDOStackHistograms"+std::to_string(ibe)+std::to_string(iphi_module), HtoBCMapB_x, HtoBCMapB_y); + this_struct.HtoBCMapC_x = 2.; + this_struct.HtoBCMapB_x = 2.; + this_struct.HtoBCMap_cut=true; } } } @@ -1015,6 +933,63 @@ HitAWMapC_passed = 1.0; } } + for (const auto& ibarrel_ecpair : straw_shifter_map) { + int ibe = abs(ibarrel_ecpair.first) - 1; + int iside = ibarrel_ecpair.first > 0 ? 0 : 1; + auto strawNumber = Monitored::Collection("strawNumber", ibarrel_ecpair.second, [](const auto& s){return s.strawNumber;}); + auto HitWMap_passed = Monitored::Collection("HitWMap_passed", ibarrel_ecpair.second, [](const auto& s){return s.HitWMap_passed;}); + auto isAr = Monitored::Collection("isAr", ibarrel_ecpair.second, [](const auto& s){return s.isAr;}); + auto isNotAr = Monitored::Collection("isNotAr", ibarrel_ecpair.second, [](const auto& s){return not s.isAr;}); + if (ibe == 0) { + fill("RDOHistograms0", strawNumber, HitWMap_passed, isAr, isNotAr); + } else if (ibe == 1) { + fill("RDOHistograms1"+std::to_string(iside), strawNumber, HitWMap_passed, isAr, isNotAr); + } + } + + for (const auto& ibepair : straw_map) { + for (const auto& iphi_modulepair : ibepair.second ) { + auto strawNumber = Monitored::Collection("strawNumber", iphi_modulepair.second, [](const auto& s){return s.strawNumber;}); + auto HitWMapS_passed = Monitored::Collection("HitWMapS_passed", iphi_modulepair.second, [](const auto& s){return s.HitWMapS_passed;}); + auto HitAWMapS_passed = Monitored::Collection("HitAWMapS_passed", iphi_modulepair.second, [](const auto& s){return s.HitAWMapS_passed;}); + auto HitAMapS_passed = Monitored::Collection("HitAMapS_passed", iphi_modulepair.second, [](const auto& s){return s.HitAMapS_passed;}); + auto HitHMapS_passed = Monitored::Collection("HitHMapS_passed", iphi_modulepair.second, [](const auto& s){return s.HitHMapS_passed;}); + auto HitHWMapS_passed = Monitored::Collection("HitHWMapS_passed", iphi_modulepair.second, [](const auto& s){return s.HitHWMapS_passed;}); + auto HitTrMapS_y = Monitored::Collection("HitTrMapS_y", iphi_modulepair.second, [](const auto& s){return s.HitTrMapS_y;}); + auto HitToTMapS_y = Monitored::Collection("HitToTMapS_y", iphi_modulepair.second, [](const auto& s){return s.HitToTMapS_y;}); + auto HitToTLong_cut = Monitored::Collection("HitToTLong_cut", iphi_modulepair.second, [](const auto& s){return s.HitToTLong_cut;}); + auto HitTrWMapS_cut = Monitored::Collection("HitTrWMapS_cut", iphi_modulepair.second, [](const auto& s){return s.HitTrWMapS_cut;}); + + fill("RDOStackHistograms"+std::to_string(ibepair.first)+std::to_string(iphi_modulepair.first), strawNumber, + HitWMapS_passed, HitHWMapS_passed, HitHMapS_passed, HitAMapS_passed, HitAWMapS_passed, + HitTrMapS_y, HitToTMapS_y, HitToTLong_cut, HitTrWMapS_cut); + } + } + + for (const auto& ibepair : chip_map) { + for (const auto& iphi_modulepair : ibepair.second ) { + auto chipNumber = Monitored::Collection("chipNumber", iphi_modulepair.second, [](const auto& s){return s.chipNumber;}); + auto HitWMapC_passed = Monitored::Collection("HitWMapC_passed", iphi_modulepair.second, [](const auto& s){return s.HitWMapC_passed;}); + auto HitAWMapC_passed = Monitored::Collection("HitAWMapC_passed", iphi_modulepair.second, [](const auto& s){return s.HitAWMapC_passed;}); + auto HitAMapC_passed = Monitored::Collection("HitAMapC_passed", iphi_modulepair.second, [](const auto& s){return s.HitAMapC_passed;}); + auto HitHMapC_passed = Monitored::Collection("HitHMapC_passed", iphi_modulepair.second, [](const auto& s){return s.HitHMapC_passed;}); + auto HitHWMapC_passed = Monitored::Collection("HitHWMapC_passed", iphi_modulepair.second, [](const auto& s){return s.HitHWMapC_passed;}); + auto HitTrMapC_y = Monitored::Collection("HitTrMapC_y", iphi_modulepair.second, [](const auto& s){return s.HitTrMapC_y;}); + auto HitToTMapC_y = Monitored::Collection("HitToTMapC_y", iphi_modulepair.second, [](const auto& s){return s.HitToTMapC_y;}); + auto HtoBCMapC_x = Monitored::Collection("HtoBCMapC_x", iphi_modulepair.second, [](const auto& s){return s.HtoBCMapC_x;}); + auto HtoBCMapB_x = Monitored::Collection("HtoBCMapB_x", iphi_modulepair.second, [](const auto& s){return s.HtoBCMapB_x;}); + auto HtoBCMapB_y = Monitored::Collection("HtoBCMapB_y", iphi_modulepair.second, [](const auto& s){return s.HtoBCMapB_y;}); + auto HtoBCMap_cut = Monitored::Collection("HtoBCMap_cut", iphi_modulepair.second, [](const auto& s){return s.HtoBCMap_cut;}); + auto HitTrWMapC_cut = Monitored::Collection("HitTrWMapC_cut", iphi_modulepair.second, [](const auto& s){return s.HitTrWMapC_cut;}); + + fill("RDOStackHistograms"+std::to_string(ibepair.first)+std::to_string(iphi_modulepair.first), + chipNumber, HitWMapC_passed, HitHWMapC_passed, HitHMapC_passed, + HitAMapC_passed, HitAWMapC_passed, HitTrMapC_y, HitToTMapC_y, + HtoBCMapC_x, HtoBCMapB_x, HtoBCMapB_y, + HtoBCMap_cut, HitTrWMapC_cut); + } + } + OccAll = nhitsall/350848.; fill("RDOHistograms0", OccAll); @@ -1064,16 +1039,12 @@ HitAWMapC_passed = 1.0; // m_LLOcc[ibe][LLocc_index] += occLL; AvgLLOcc_side_x = i - (32 * nclass); AvgLLOcc_side_y = occLL; - fill("RDOLLHLOccHistograms"+std::to_string(ibe)+std::to_string(iside), AvgLLOcc_side_x, AvgLLOcc_side_y); AvgHLOcc_side_x = i - (32 * nclass); AvgHLOcc_side_y = occHL; - fill("RDOLLHLOccHistograms"+std::to_string(ibe)+std::to_string(iside), AvgHLOcc_side_x, AvgHLOcc_side_y); AvgLLOccMod_side_x = i; AvgLLOccMod_side_y = occLL; - fill("RDOLLHLOccHistograms"+std::to_string(ibe)+std::to_string(iside), AvgLLOccMod_side_x, AvgLLOccMod_side_y); AvgHLOccMod_side_x = i; AvgHLOccMod_side_y = occHL; - fill("RDOLLHLOccHistograms"+std::to_string(ibe)+std::to_string(iside), AvgHLOccMod_side_x, AvgHLOccMod_side_y); } else if (ibe == 1) { float occLL = float(moduleHits_E[modulenum_tmp]) / float(numberOfStrawsWheel[nclass]); float occHL = float(HLmoduleHits_E[modulenum_tmp]) / float(numberOfStrawsWheel[nclass]); @@ -1085,17 +1056,15 @@ HitAWMapC_passed = 1.0; } AvgLLOcc_side_x = i - (32 * nclass); AvgLLOcc_side_y = occLL; - fill("RDOLLHLOccHistograms"+std::to_string(ibe)+std::to_string(iside), AvgLLOcc_side_x, AvgLLOcc_side_y); AvgHLOcc_side_x = i - (32 * nclass); AvgHLOcc_side_y = occHL; - fill("RDOLLHLOccHistograms"+std::to_string(ibe)+std::to_string(iside), AvgHLOcc_side_x, AvgHLOcc_side_y); AvgLLOccMod_side_x = i; AvgLLOccMod_side_y = occLL; - fill("RDOLLHLOccHistograms"+std::to_string(ibe)+std::to_string(iside), AvgLLOccMod_side_x, AvgLLOccMod_side_y); AvgHLOccMod_side_x = i; AvgHLOccMod_side_y = occHL; - fill("RDOLLHLOccHistograms"+std::to_string(ibe)+std::to_string(iside), AvgHLOccMod_side_x, AvgHLOccMod_side_y); } + fill("RDOLLHLOccHistograms"+std::to_string(ibe)+std::to_string(iside), AvgLLOcc_side_x, AvgLLOcc_side_y, AvgHLOcc_side_x, AvgHLOcc_side_y, + AvgLLOccMod_side_x, AvgLLOccMod_side_y, AvgHLOccMod_side_x, AvgHLOccMod_side_y); } } } diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MdtRawDataMonAlg.cxx b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MdtRawDataMonAlg.cxx index 9d0df654342e..8315c9063843 100755 --- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MdtRawDataMonAlg.cxx +++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MdtRawDataMonAlg.cxx @@ -296,35 +296,39 @@ StatusCode MdtRawDataMonAlg::fillHistograms(const EventContext& ctx) const int lumiblock = -1; SG::ReadHandle<xAOD::EventInfo> evt(m_eventInfo, ctx); lumiblock = evt->lumiBlock(); - - ATH_MSG_DEBUG("MdtRawDataMonAlg::MDT RawData Monitoring Histograms being filled" ); + + ATH_MSG_DEBUG("MdtRawDataMonAlg::MDT RawData Monitoring Histograms being filled"); // Retrieve the LVL1 Muon RoIs: bool trig_BARREL = false; bool trig_ENDCAP = false; - if (!m_l1RoiKey.empty()) { + if (!m_l1RoiKey.empty()) + { SG::ReadHandle<xAOD::MuonRoIContainer> muonRoIs(m_l1RoiKey, ctx); - if(!muonRoIs.isValid()){ - ATH_MSG_ERROR("evtStore() does not contain muon L1 ROI Collection with name "<< m_l1RoiKey); + if (!muonRoIs.isValid()) + { + ATH_MSG_ERROR("evtStore() does not contain muon L1 ROI Collection with name " << m_l1RoiKey); } //DEV still needed ? does not compile - if(muonRoIs.isPresent() && muonRoIs.isValid()){ - ATH_MSG_VERBOSE( "Retrieved LVL1MuonRoIs object with key: " << m_l1RoiKey.key() ); - trig_BARREL = std::any_of(muonRoIs->begin(), muonRoIs->end(), - [](const auto& i){return i->getSource() == xAOD::MuonRoI::RoISource::Barrel;}); - trig_ENDCAP = std::any_of(muonRoIs->begin(), muonRoIs->end(), - [](const auto& i){return i->getSource() == xAOD::MuonRoI::RoISource::Endcap;}); + if (muonRoIs.isPresent() && muonRoIs.isValid()) + { + ATH_MSG_VERBOSE("Retrieved LVL1MuonRoIs object with key: " << m_l1RoiKey.key()); + trig_BARREL = std::any_of(muonRoIs->begin(), muonRoIs->end(), + [](const auto &i) { return i->getSource() == xAOD::MuonRoI::RoISource::Barrel; }); + trig_ENDCAP = std::any_of(muonRoIs->begin(), muonRoIs->end(), + [](const auto &i) { return i->getSource() == xAOD::MuonRoI::RoISource::Endcap; }); } } - //declare MDT stuff + //declare MDT stuff SG::ReadHandle<Muon::MdtPrepDataContainer> mdt_container(m_key_mdt, ctx); - if(!mdt_container.isValid()){ - ATH_MSG_ERROR("evtStore() does not contain mdt prd Collection with name "<< m_key_mdt); + if (!mdt_container.isValid()) + { + ATH_MSG_ERROR("evtStore() does not contain mdt prd Collection with name " << m_key_mdt); return StatusCode::FAILURE; } - ATH_MSG_DEBUG("****** mdtContainer->size() : " << mdt_container->size()); + ATH_MSG_DEBUG("****** mdtContainer->size() : " << mdt_container->size()); int nColl = 0; // Number of MDT chambers with hits int nColl_ADCCut = 0; // Number of MDT chambers with hits above ADC cut @@ -333,8 +337,9 @@ StatusCode MdtRawDataMonAlg::fillHistograms(const EventContext& ctx) const //declare RPC stuff SG::ReadHandle<Muon::RpcPrepDataContainer> rpc_container(m_key_rpc, ctx); - if(!rpc_container.isValid()){ - ATH_MSG_ERROR("evtStore() does not contain rpc prd Collection with name "<< m_key_rpc); + if (!rpc_container.isValid()) + { + ATH_MSG_ERROR("evtStore() does not contain rpc prd Collection with name " << m_key_rpc); return StatusCode::FAILURE; } @@ -343,160 +348,193 @@ StatusCode MdtRawDataMonAlg::fillHistograms(const EventContext& ctx) const Muon::RpcPrepDataContainer::const_iterator containerIt; /////////////////////////////this is the important plot! - float Nhitsrpc = 0 ; - for (containerIt = rpc_container->begin() ; containerIt != rpc_container->end() ; ++containerIt) + float Nhitsrpc = 0; + for (containerIt = rpc_container->begin(); containerIt != rpc_container->end(); ++containerIt) { - for (Muon::RpcPrepDataCollection::const_iterator rpcPrd = (*containerIt)->begin(); rpcPrd!=(*containerIt)->end(); ++rpcPrd) + for (Muon::RpcPrepDataCollection::const_iterator rpcPrd = (*containerIt)->begin(); rpcPrd != (*containerIt)->end(); ++rpcPrd) { - ++Nhitsrpc ; - }} - float Nhitsmdt = 0 ; + ++Nhitsrpc; + } + } + float Nhitsmdt = 0; bool isNoiseBurstCandidate = false; - Muon::MdtPrepDataContainer::const_iterator MdtcontainerIt ; - for (MdtcontainerIt = mdt_container->begin() ; MdtcontainerIt != mdt_container->end() ; ++MdtcontainerIt) + Muon::MdtPrepDataContainer::const_iterator MdtcontainerIt; + for (MdtcontainerIt = mdt_container->begin(); MdtcontainerIt != mdt_container->end(); ++MdtcontainerIt) { - for (Muon::MdtPrepDataCollection::const_iterator mdtCollection=(*MdtcontainerIt)->begin(); mdtCollection!=(*MdtcontainerIt)->end(); ++mdtCollection ) + for (Muon::MdtPrepDataCollection::const_iterator mdtCollection = (*MdtcontainerIt)->begin(); mdtCollection != (*MdtcontainerIt)->end(); ++mdtCollection) { - ++Nhitsmdt ; + ++Nhitsmdt; } } - if(Nhitsmdt > m_HighOccThreshold) isNoiseBurstCandidate = true; - std::string type="MDT"; + if (Nhitsmdt > m_HighOccThreshold) + isNoiseBurstCandidate = true; + std::string type = "MDT"; std::string hardware_name; - std::map<std::string,int> evnt_hitsperchamber_map; - std::set<std::string> chambers_from_tracks; + std::map<std::string, int> evnt_hitsperchamber_map; + std::set<std::string> chambers_from_tracks; - if (m_doMdtESD==true) { + if (m_doMdtESD == true) + { //DEV this shouls be done in some other way, in AthenaMonManager there is // Gaudi::Property<std::string> m_environmentStr {this,"Environment","user"}; ///< Environment string pulled from the job option and converted to enum //per il momento commento... // if(m_environment == AthenaMonManager::tier0 || m_environment == AthenaMonManager::tier0ESD || m_environment == AthenaMonManager::online) { - if(true) { //DEV to be updated + if (true) + { //DEV to be updated SG::ReadHandle<xAOD::MuonContainer> muons(m_muonKey, ctx); - if(!muons.isValid()){ - ATH_MSG_ERROR("evtStore() does not contain muon Collection with name "<< m_muonKey); - return StatusCode::FAILURE; + if (!muons.isValid()) + { + ATH_MSG_ERROR("evtStore() does not contain muon Collection with name " << m_muonKey); + return StatusCode::FAILURE; } - for(const auto mu : *muons){ - - if(! (mu->muonType() == xAOD::Muon::Combined)) continue; - xAOD::Muon::Quality quality = m_muonSelectionTool->getQuality(*mu); - if (!(quality <= xAOD::Muon::Medium)) continue; - const xAOD::TrackParticle* tp = mu->primaryTrackParticle(); - if(tp){ - const Trk::Track * trk= tp->track(); - //this work only if tp are available - if(!trk) continue; - // - uint8_t ntri_eta=0; - uint8_t n_phi=0; - tp->summaryValue(ntri_eta, xAOD::numberOfTriggerEtaLayers); - tp->summaryValue(n_phi, xAOD::numberOfPhiLayers); - if(ntri_eta+n_phi==0) continue; - } + for (const auto mu : *muons) + { + + if (!(mu->muonType() == xAOD::Muon::Combined)) + continue; + xAOD::Muon::Quality quality = m_muonSelectionTool->getQuality(*mu); + if (!(quality <= xAOD::Muon::Medium)) + continue; + const xAOD::TrackParticle *tp = mu->primaryTrackParticle(); + if (tp) + { + const Trk::Track *trk = tp->track(); + //this work only if tp are available + if (!trk) + continue; + // + uint8_t ntri_eta = 0; + uint8_t n_phi = 0; + tp->summaryValue(ntri_eta, xAOD::numberOfTriggerEtaLayers); + tp->summaryValue(n_phi, xAOD::numberOfPhiLayers); + if (ntri_eta + n_phi == 0) + continue; + } } MDTOverviewHistogramStruct overviewPlots; MDTSummaryHistogramStruct summaryPlots[4][4][16][4][4]; // [region][layer][phi][crate_region][crate] //loop in MdtPrepDataContainer - for (Muon::MdtPrepDataContainer::const_iterator containerIt = mdt_container->begin(); containerIt != mdt_container->end(); ++containerIt) { - if (containerIt == mdt_container->end() || (*containerIt)->size()==0) continue; //check if there are counts + std::vector<std::string> v_hit_in_chamber_allphi; + std::map<std::string, std::vector<std::string>> v_hit_in_chamber; + for (Muon::MdtPrepDataContainer::const_iterator containerIt = mdt_container->begin(); containerIt != mdt_container->end(); ++containerIt) + { + if (containerIt == mdt_container->end() || (*containerIt)->size() == 0) + continue; //check if there are counts nColl++; - + bool isHit_above_ADCCut = false; // loop over hits - for (Muon::MdtPrepDataCollection::const_iterator mdtCollection=(*containerIt)->begin(); mdtCollection!=(*containerIt)->end(); ++mdtCollection ) + for (Muon::MdtPrepDataCollection::const_iterator mdtCollection = (*containerIt)->begin(); mdtCollection != (*containerIt)->end(); ++mdtCollection) { nPrd++; - float adc = (*mdtCollection)->adc(); - hardware_name = getChamberName(*mdtCollection); - if(hardware_name.substr(0,3) == "BMG") adc /= 4.; - if( adc > m_ADCCut ) + hardware_name = getChamberName(*mdtCollection); + if (hardware_name.substr(0, 3) == "BMG") + adc /= 4.; + if (adc > m_ADCCut) { nPrdcut++; isHit_above_ADCCut = true; - std::string phi=hardware_name.substr( hardware_name.length() - 2); - auto hit_in_chamber = Monitored::Scalar<std::string>("hits_phi_"+phi,hardware_name); - if(m_do_mdtchamberstatphislice) fill("MdtMonitor",hit_in_chamber); - auto hit_in_chamber_allphi = Monitored::Scalar<std::string>("hits_allphi",hardware_name); - fill("MdtMonitor",hit_in_chamber_allphi); + if (m_do_mdtchamberstatphislice) + { + std::string phi = hardware_name.substr(hardware_name.length() - 2); + v_hit_in_chamber[phi].push_back(hardware_name); + } + v_hit_in_chamber_allphi.push_back(hardware_name); } fillMDTOverviewVects(*mdtCollection, isNoiseBurstCandidate, overviewPlots); - //======================================================================= - //======================================================================= - //======================================================================= - - ATH_CHECK(fillMDTSummaryVects(*mdtCollection, chambers_from_tracks, isNoiseBurstCandidate, trig_BARREL, trig_ENDCAP, summaryPlots)); - - //======================================================================= - //======================================================================= - //======================================================================= - if(m_doChamberHists){ - ATH_CHECK(fillMDTHistograms(*mdtCollection)); - } - - std::map<std::string,int>::iterator iter_hitsperchamber = evnt_hitsperchamber_map.find(hardware_name); - if ( iter_hitsperchamber == evnt_hitsperchamber_map.end() ) { - evnt_hitsperchamber_map.insert( make_pair( hardware_name, 1 ) ); - } - else { + //======================================================================= + //======================================================================= + //======================================================================= + + ATH_CHECK(fillMDTSummaryVects(*mdtCollection, chambers_from_tracks, isNoiseBurstCandidate, trig_BARREL, trig_ENDCAP, summaryPlots)); + + //======================================================================= + //======================================================================= + //======================================================================= + if (m_doChamberHists) + { + ATH_CHECK(fillMDTHistograms(*mdtCollection)); + } + + std::map<std::string, int>::iterator iter_hitsperchamber = evnt_hitsperchamber_map.find(hardware_name); + if (iter_hitsperchamber == evnt_hitsperchamber_map.end()) + { + evnt_hitsperchamber_map.insert(make_pair(hardware_name, 1)); + } + else + { iter_hitsperchamber->second += 1; - } + } } // for loop over hits mdtcollection - if( isHit_above_ADCCut ) + if (isHit_above_ADCCut) nColl_ADCCut++; } //loop in MdtPrepDataContainer + if (m_do_mdtchamberstatphislice) + { + for (const auto &phiitem : v_hit_in_chamber) + { + auto hit_in_chamber = Monitored::Collection("hits_phi_" + phiitem.first, phiitem.second); + fill("MdtMonitor", hit_in_chamber); + } + } + auto hit_in_chamber_allphi = Monitored::Collection("hits_allphi", v_hit_in_chamber_allphi); + fill("MdtMonitor", hit_in_chamber_allphi); fillMDTOverviewHistograms(overviewPlots); - ATH_CHECK( fillMDTSummaryHistograms(summaryPlots, lumiblock) ); - + ATH_CHECK(fillMDTSummaryHistograms(summaryPlots, lumiblock)); + int nHighOccChambers = 0; - for(const auto& iterstat: evnt_hitsperchamber_map) { - const auto iter_tubesperchamber = m_tubesperchamber_map.find(iterstat.first); - if (ATH_UNLIKELY(iter_tubesperchamber == m_tubesperchamber_map.end())) { // indicates software error - ATH_MSG_ERROR("Unable to find chamber " << iterstat.first); - continue; - } - float nTubes = iter_tubesperchamber->second; - float hits = iterstat.second; - float occ = hits/nTubes; - if ( occ > 0.1 ) nHighOccChambers++; + for (const auto &iterstat : evnt_hitsperchamber_map) + { + const auto iter_tubesperchamber = m_tubesperchamber_map.find(iterstat.first); + if (ATH_UNLIKELY(iter_tubesperchamber == m_tubesperchamber_map.end())) + { // indicates software error + ATH_MSG_ERROR("Unable to find chamber " << iterstat.first); + continue; + } + float nTubes = iter_tubesperchamber->second; + float hits = iterstat.second; + float occ = hits / nTubes; + if (occ > 0.1) + nHighOccChambers++; } - + auto nHighOccChambers_mon = Monitored::Scalar<float>("nHighOccChambers_mon", nHighOccChambers); auto nPrd_mon = Monitored::Scalar<int>("nPrd_mon", nPrd); auto nPrdcut_mon = Monitored::Scalar<int>("nPrdcut_mon", nPrdcut); auto Nhitsrpc_mon = Monitored::Scalar<int>("Nhitsrpc_mon", Nhitsrpc); - auto nColl_mon = Monitored::Scalar<int>("nColl_mon", nColl); + auto nColl_mon = Monitored::Scalar<int>("nColl_mon", nColl); auto nColl_ADCCut_mon = Monitored::Scalar<int>("nColl_ADCCut_mon", nColl_ADCCut); - - fill("MdtMonitor",nHighOccChambers_mon,nPrd_mon,Nhitsrpc_mon,nPrdcut_mon, nColl_mon, nColl_ADCCut_mon); + + fill("MdtMonitor", nHighOccChambers_mon, nPrd_mon, Nhitsrpc_mon, nPrdcut_mon, nColl_mon, nColl_ADCCut_mon); // if (m_mdtglobalhitstime) m_mdtglobalhitstime->Fill(m_time - m_firstTime); - } //m_environment == AthenaMonManager::tier0 || m_environment == AthenaMonManager::tier0ESD - } //m_doMdtESD==true + } //m_environment == AthenaMonManager::tier0 || m_environment == AthenaMonManager::tier0ESD + } //m_doMdtESD==true - SG::ReadHandle<Trk::SegmentCollection> segms(m_segm_type, ctx); - if(!segms.isValid()){ - ATH_MSG_ERROR("evtStore() does not contain mdt segms Collection with name "<< m_segm_type); - return StatusCode::FAILURE; - } + SG::ReadHandle<Trk::SegmentCollection> segms(m_segm_type, ctx); + if (!segms.isValid()) + { + ATH_MSG_ERROR("evtStore() does not contain mdt segms Collection with name " << m_segm_type); + return StatusCode::FAILURE; + } - MDTSegmentHistogramStruct segsPlots[4][4][16]; // [region][layer][phi] - ATH_CHECK(handleEvent_effCalc_fillVects( segms.cptr(), segsPlots )); + MDTSegmentHistogramStruct segsPlots[4][4][16]; // [region][layer][phi] + ATH_CHECK(handleEvent_effCalc_fillVects(segms.cptr(), segsPlots)); ATH_CHECK(fillMDTSegmentHistograms(segsPlots)); return StatusCode::SUCCESS; -} +} // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * void MdtRawDataMonAlg::fillMDTOverviewVects( const Muon::MdtPrepData* mdtCollection, bool &isNoiseBurstCandidate, MDTOverviewHistogramStruct& vects ) const { @@ -828,20 +866,15 @@ StatusCode MdtRawDataMonAlg::fillMDTSummaryHistograms( const MDTSummaryHistogram auto adc_mon = Monitored::Collection("adc_mon", thisVects.adc_mon); auto tdc_mon = Monitored::Collection("tdc_mon", thisVects.tdc_mon); - fill(MDT_regionGroup, adc_mon, tdc_mon); auto tdc_mon_nb2 = Monitored::Collection("tdc_mon_nb2", thisVects.tdc_mon_nb2); auto adc_mon_nb2 = Monitored::Collection("adc_mon_nb2", thisVects.adc_mon_nb2); - fill(MDT_regionGroup, tdc_mon_nb2, adc_mon_nb2); auto tdc_mon_nb1 = Monitored::Collection("tdc_mon_nb1", thisVects.tdc_mon_nb1); auto adc_mon_nb1 = Monitored::Collection("adc_mon_nb1", thisVects.adc_mon_nb1); - fill(MDT_regionGroup, tdc_mon_nb1, adc_mon_nb1); auto adc_mon_adccut = Monitored::Collection("adc_mon_adccut", thisVects.adc_mon_adccut); auto tdc_mon_adccut = Monitored::Collection("tdc_mon_adccut", thisVects.tdc_mon_adccut); - // fill(MDT_regionGroup, stationEta, tdc_mon_adccut, adc_mon_adccut); - fill(MDT_regionGroup, tdc_mon_adccut, adc_mon_adccut); std::string varx = iregion < 2 ? "x_mon_barrel" : "x_mon_endcap"; std::string vary = iregion < 2 ? "y_mon_barrel" : "y_mon_endcap"; @@ -850,19 +883,17 @@ StatusCode MdtRawDataMonAlg::fillMDTSummaryHistograms( const MDTSummaryHistogram auto x_mon = Monitored::Collection(varx, thisVects.x_mon); auto y_mon = Monitored::Collection(vary, thisVects.y_mon); - fill("MdtMonitor",x_mon,y_mon); auto x_mon_noise = Monitored::Collection(varx_noise, thisVects.x_mon_noise); auto y_mon_noise = Monitored::Collection(vary_noise, thisVects.y_mon_noise); - fill("MdtMonitor",x_mon_noise,y_mon_noise); + fill("MdtMonitor",x_mon,y_mon,x_mon_noise,y_mon_noise); auto tdc_mon_nb3 = Monitored::Collection("tdc_mon_nb3", thisVects.tdc_mon_nb3); - fill(MDT_regionGroup, tdc_mon_nb3); + varx = "x_mon_"+region[iregion]+"_"+layer[ilayer]; vary = "y_mon_"+region[iregion]+"_"+layer[ilayer]; auto x_bin_perML = Monitored::Collection(varx, thisVects.x_bin_perML);//get the right bin!!!! auto y_bin_perML = Monitored::Collection(vary, thisVects.y_bin_perML); - fill(MDT_regionGroup,x_bin_perML,y_bin_perML); if(layer[ilayer]!="Extra"){ varx="x_mon_"+layer[ilayer]; @@ -886,7 +917,9 @@ StatusCode MdtRawDataMonAlg::fillMDTSummaryHistograms( const MDTSummaryHistogram auto biny_name_bycrate_ontrack = "y_mon_bin_bycrate_ontrack_"+region[crate_region]+"_"+crate[icrate]; //y-axis of these histograms not yet defined auto biny_var_bycrate_ontrack = Monitored::Collection(biny_name_bycrate_ontrack, thisVects.biny_vslb_bycrate_ontrack); - fill(MDT_regionGroup,tdc_mon_rpc,tdc_mon_tgc,biny_var,lb_mon, biny_var, biny_var_bycrate, biny_var_bycrate_ontrack); + fill(MDT_regionGroup, adc_mon, tdc_mon, tdc_mon_nb2, adc_mon_nb2, tdc_mon_adccut, adc_mon_adccut, tdc_mon_adccut, adc_mon_adccut, + tdc_mon_nb3, x_bin_perML, y_bin_perML, tdc_mon_rpc,tdc_mon_tgc,biny_var,lb_mon, + biny_var, biny_var_bycrate, biny_var_bycrate_ontrack); //DEV to DO -- GitLab