From 2345a1d2bd9a6d1ff8a0568cd0dc0a71787faf3e Mon Sep 17 00:00:00 2001 From: Chara Kitsaki <chara.kitsaki@cern.ch> Date: Fri, 2 Oct 2020 13:21:34 +0000 Subject: [PATCH] CSC DQ - CSC Segments --- .../CscRawDataMonitoring/CSCSegmValMonAlg.h | 69 +++ .../CscClusterValMonAlg.h | 13 +- .../CscRawDataMonitoring/CscPrdValMonAlg.h | 7 +- .../python/CscMonitorAlgorithm.py | 151 ++++- .../python/CscRawMonLabels.py | 4 +- .../src/CSCSegmValMonAlg.cxx | 542 ++++++++++++++++++ .../src/CscClusterValMonAlg.cxx | 48 +- .../src/CscPrdValMonAlg.cxx | 24 +- .../CscRawDataMonitoring_entries.cxx | 3 +- 9 files changed, 797 insertions(+), 64 deletions(-) create mode 100755 MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CSCSegmValMonAlg.h create mode 100755 MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/CSCSegmValMonAlg.cxx diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CSCSegmValMonAlg.h b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CSCSegmValMonAlg.h new file mode 100755 index 00000000000..54a68b8bf31 --- /dev/null +++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CSCSegmValMonAlg.h @@ -0,0 +1,69 @@ +/* + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef CSCSegmValMonAlg_H +#define CSCSegmValMonAlg_H + +#include "AthenaMonitoring/AthMonitorAlgorithm.h" +#include "AthenaMonitoring/ManagedMonitorToolBase.h" +#include "AthenaMonitoringKernel/Monitored.h" + +#include "GaudiKernel/ServiceHandle.h" +#include "GaudiKernel/ToolHandle.h" + +#include "MuonSegment/MuonSegment.h" +#include "TrkSegment/SegmentCollection.h" +#include "TrkTrack/Track.h" + +#include "TrigDecisionTool/TrigDecisionTool.h" +#include "StoreGate/ReadHandleKey.h" +#include "MuonRecHelperTools/IMuonEDMHelperSvc.h" +#include "MuonIdHelpers/IMuonIdHelperSvc.h" + +#include <vector> +#include <string> + +namespace Trk { + class MeasurementBase; +} + +class CSCSegmValMonAlg : public AthMonitorAlgorithm { + + public: + /** Constructor */ + CSCSegmValMonAlg( const std::string& name, ISvcLocator* pSvcLocator ); + /** Destructor */ + virtual ~CSCSegmValMonAlg()=default; + virtual StatusCode initialize() override; + virtual StatusCode fillHistograms( const EventContext& ctx ) const override; + + private: + + typedef std::vector<TH1 *> SegmHistType; + typedef std::vector<TH1 *>::const_iterator SegmHistIter; + + typedef std::vector<const Trk::MeasurementBase*> TrkSegmType; + typedef std::vector<const Trk::MeasurementBase*>::const_iterator TrkSegmIter; + + typedef enum EndCaps { ECA = 0, ECC } EndCapType; + + bool isCscSegment( const Muon::MuonSegment* seg ) const; + unsigned int cscHits( const Muon::MuonSegment* seg ) const; + bool segmSlopeCut(const float csc_x, const float csc_ax, const float cut ) const; + //Trigger aware monitoring + bool evtSelTriggersPassed() const; + + ServiceHandle<Muon::IMuonEDMHelperSvc> m_edmHelperSvc {this, "edmHelper", + "Muon::MuonEDMHelperSvc/MuonEDMHelperSvc", + "Handle to the service providing the IMuonEDMHelperSvc interface" }; + ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}; + SG::ReadHandleKey<Trk::SegmentCollection> m_segmKey{this,"SegmentKey","MuonSegments","muon segments"}; + + Gaudi::Property<std::vector<std::string>> m_sampSelTriggers{this,"EventSelTriggers",{}}; + Gaudi::Property<bool> m_doEvtSel{this,"DoEventSelection",false}; + Gaudi::Property<double> m_segmSlope{this,"SegmentSlopeCut",0}; + +}; + +#endif diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CscClusterValMonAlg.h b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CscClusterValMonAlg.h index 813613e7159..5a85d20849c 100644 --- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CscClusterValMonAlg.h +++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CscClusterValMonAlg.h @@ -29,7 +29,9 @@ public: private: - + //Trigger aware monitoring + bool evtSelTriggersPassed() const; + ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}; // Strip fitter. ToolHandle<ICscStripFitter> m_stripFitter{this, "CSCStripFitter", "CSCStripFitter", "Strip fitter Tool"}; @@ -41,10 +43,9 @@ private: SG::ReadHandleKey<Muon::CscPrepDataContainer> m_cscClusterKey{this,"CSCClusterKey","CSC_Clusters","CSC clusters"}; SG::ReadHandleKey<Muon::CscStripPrepDataContainer> m_cscPRDKey{this,"CSCPrepRawDataKey", "CSC_Measurements","CSC PRDs"}; - unsigned int m_qmaxADCCut; - - bool m_doEvtSel; - std::vector<std::string> m_sampSelTriggers; - + Gaudi::Property<std::vector<std::string>> m_sampSelTriggers{this,"CSCEventSelTriggers",{}}; + Gaudi::Property<bool> m_doEvtSel{this,"CSCDoEventSelection",false}; + Gaudi::Property<double> m_qmaxADCCut{this,"CSCQmaxCutADC",100}; + }; #endif diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CscPrdValMonAlg.h b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CscPrdValMonAlg.h index 29b8c74ede3..bad9a1ad686 100755 --- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CscPrdValMonAlg.h +++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CscPrdValMonAlg.h @@ -30,14 +30,15 @@ public: private: ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}; - - size_t m_cscNoiseCut; + SG::ReadHandleKey<Muon::CscStripPrepDataContainer> m_cscPrdKey{this,"CSCPrepRawDataKey","CSC_Measurements","CSC PRDs"}; - bool m_mapxyrz; // Strip fitter ToolHandle<ICscStripFitter> m_stripFitter{this, "CSCStripFitter", "CSCStripFitter", "Strip fitter Tool"}; + Gaudi::Property<bool> m_mapxyrz{this,"MapYXandRZ",false}; + Gaudi::Property<size_t> m_cscNoiseCut{this,"NoiseCutADC",50}; + }; #endif diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/python/CscMonitorAlgorithm.py b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/python/CscMonitorAlgorithm.py index cad0836c34f..2162a404b3e 100644 --- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/python/CscMonitorAlgorithm.py +++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/python/CscMonitorAlgorithm.py @@ -42,7 +42,7 @@ def CscMonitoringConfig(inputFlags): # This uses the new Configurables object system. cscClusMonAlg = helper.addAlgorithm(CompFactory.CscClusterValMonAlg,'CscClusMonAlg') cscPrdMonAlg = helper.addAlgorithm(CompFactory.CscPrdValMonAlg,'CscPrdMonAlg') - # cscSegmMonAlg = helper.addAlgorithm(CompFactory.CscSegmValMonAlg,'CscSegmValMonAlg') + cscSegmMonAlg = helper.addAlgorithm(CompFactory.CSCSegmValMonAlg,'CscSegmMonAlg') ### STEP 3 ### @@ -50,9 +50,12 @@ def CscMonitoringConfig(inputFlags): # some generic property # exampleMonAlg.RandomHist = True cscClusMonAlg.CSCQmaxCutADC = 100 + cscClusMonAlg.CSCDoEventSelection = False + cscClusMonAlg.CSCEventSelTriggers = [ "" ] cscPrdMonAlg.NoiseCutADC = 50 cscPrdMonAlg.MapYXandRZ = False - + cscSegmMonAlg.DoEventSelection = False + cscSegmMonAlg.EventSelTriggers = [ "" ] #[ "L1_MU10", "L1_MU15", "EF_mu20_muCombTag_NoEF", "EF_mu15", "EF_mu15_mu10_EFFS", "EF_2mu10", "EF_2mu10_loose" ] # to enable a trigger filter, for example: #exampleMonAlg.TriggerChain = 'HLT_mu26_ivarmedium' @@ -79,7 +82,7 @@ def CscMonitoringConfig(inputFlags): # object here is the standard GenericMonitoringTool. cscClusGroup = helper.addGroup(cscClusMonAlg,'CscClusMonitor','Muon/MuonRawDataMonitoring/CSC/') cscPrdGroup = helper.addGroup(cscPrdMonAlg,'CscPrdMonitor','Muon/MuonRawDataMonitoring/CSC/') - # cscSegmGroup = helper.addGroup(cscSegmMonAlg,'CscSegmMonitor','Muon/MuonRawDataMonitoring/CSC/') + cscSegmGroup = helper.addGroup(cscSegmMonAlg,'CscSegmMonitor','Muon/MuonSegmentMonitoring/') @@ -351,6 +354,147 @@ def CscMonitoringConfig(inputFlags): cscClusGroup.defineHistogram('nPhiClusWidthCnt_mon,nEtaClusWidthCnt_mon;h2csc_prd_eta_vs_phi_cluswidth',type='TH2F',title='Eta vs. Phi Cluster width correlation;#varphi-cluster width;#eta-cluster width', path='PRD/Expert',xbins=100,xmin=0,xmax=100,ybins=100,ymin=0,ymax=100) + #Segments + + cscSegmGroup.defineHistogram('n_clust,segm_sectorNo;Muon_Segm_NumSegments_EA',cutmask='sideA',type='TH2F',title='EndCap A: No. of segments; #segments; [sector] + [0.2 #times layer]', + path='EndCapA/Overview/MuonSegments/CSC',xbins=20,xmin=0,xmax=80,ybins=90,ymin=0,ymax=18.) + + cscSegmGroup.defineHistogram('n_clust,segm_sectorNo;Muon_Segm_NumSegments_EC',cutmask='sideC',type='TH2F',title='EndCap C: No. of segments; #segments; [sector] + [0.2 #times layer]', + path='EndCapC/Overview/MuonSegments/CSC',xbins=20,xmin=0,xmax=80,ybins=85,ymin=-17,ymax=0.) + + thisLabelx=getCSCLabelx("labels_sgm_status") + status_bins = len(thisLabelx) + cscSegmGroup.defineHistogram('status_mon;Muon_Segm_EtaClusterStatus_EA',cutmask='sideA_phi0',type='TH1F',title='Endcap A: #eta-cluster status;;entries', + path='EndCapA/Detail/CSC',xbins=status_bins,xmin=-0.5,xmax=status_bins-0.5,xlabels=thisLabelx) + + thisLabelx=getCSCLabelx("labels_sgm_status") + status_bins = len(thisLabelx) + cscSegmGroup.defineHistogram('status_mon;Muon_Segm_EtaClusterStatus_EC',cutmask='sideC_phi0',type='TH1F',title='Endcap C: #eta-cluster status;;entries', + path='EndCapC/Detail/CSC',xbins=status_bins,xmin=-0.5,xmax=status_bins-0.5,xlabels=thisLabelx) + + thisLabelx=getCSCLabelx("labels_sgm_status") + status_bins = len(thisLabelx) + cscSegmGroup.defineHistogram('status_mon;Muon_Segm_PhiClusterStatus_EA',cutmask='sideA_phi',type='TH1F',title='Endcap A: #phi-cluster status;;entries', + path='EndCapA/Detail/CSC',xbins=status_bins,xmin=-0.5,xmax=status_bins-0.5,xlabels=thisLabelx) + + thisLabelx=getCSCLabelx("labels_sgm_status") + status_bins = len(thisLabelx) + cscSegmGroup.defineHistogram('status_mon;Muon_Segm_PhiClusterStatus_EC',cutmask='sideC_phi',type='TH1F',title='Endcap C: #phi-cluster status;;entries', + path='EndCapC/Detail/CSC',xbins=status_bins,xmin=-0.5,xmax=status_bins-0.5,xlabels=thisLabelx) + + + cscSegmGroup.defineHistogram('clus_qsum_mon,clus_secLayer;Muon_Segm_QSumEtaGoodClusPerLayer_EA',cutmask='checkStatusEtaA',type='TH2F',title='EndCap A: #eta-cluster charge per layer;counts;[sector] + [0.2 #times layer]', + path='EndCapA/Overview/MuonSegments/CSC',xbins=80,xmin=0.,xmax=4000.,ybins=90,ymin=0.,ymax=18.) #PLEASE CHECk + + cscSegmGroup.defineHistogram('clus_time_mon,clus_secLayer;Muon_Segm_TimeEtaGoodClusPerLayer_EA',cutmask='checkTimeEtaA',type='TH2F',title='EndCap A: #eta-cluster time per layer;time [ns];[sector] + [0.2 #times layer]', + path='EndCapA/Overview/MuonSegments/CSC',xbins=40,xmin=-200.,xmax=200.,ybins=90,ymin=0.,ymax=18.) #PLEASE CHECk + + cscSegmGroup.defineHistogram('clus_qsum_mon,clus_secLayer;Muon_Segm_QSumEtaGoodClusPerLayer_EC',cutmask='checkStatusEtaC',type='TH2F',title='EndCap C: #eta-cluster charge per layer;counts;[sector] + [0.2 #times layer]', + path='EndCapC/Overview/MuonSegments/CSC',xbins=80,xmin=0.,xmax=4000.,ybins=85,ymin=-17.,ymax=0.) + + cscSegmGroup.defineHistogram('clus_time_mon,clus_secLayer;Muon_Segm_TimeEtaGoodClusPerLayer_EC',cutmask='checkTimeEtaC',type='TH2F',title='EndCap C: #eta-cluster time per layer;time [ns];[sector] + [0.2 #times layer]', + path='EndCapC/Overview/MuonSegments/CSC',xbins=40,xmin=-200.,xmax=200.,ybins=85,ymin=-17.,ymax=0.) + + cscSegmGroup.defineHistogram('clus_qsum_mon,clus_secLayer;Muon_Segm_QSumPhiGoodClusPerLayer_EA',cutmask='checkStatusPhiA',type='TH2F',title='EndCap A: #phi-cluster charge per layer;counts;[sector] + [0.2 #times layer]', + path='EndCapA/Overview/MuonSegments/CSC',xbins=80,xmin=0.,xmax=4000,ybins=90,ymin=0.,ymax=18.) + + cscSegmGroup.defineHistogram('clus_time_mon,clus_secLayer;Muon_Segm_TimePhiGoodClusPerLayer_EA',cutmask='checkTimePhiA',type='TH2F',title='EndCap A: #phi-cluster time per layer;time [ns];[sector] + [0.2 #times layer]', + path='EndCapA/Overview/MuonSegments/CSC',xbins=40,xmin=-200.,xmax=200.,ybins=90, ymin=0.,ymax=18.) + + cscSegmGroup.defineHistogram('clus_qsum_mon,clus_secLayer;Muon_Segm_QSumPhiGoodClusPerLayer_EC',cutmask='checkStatusPhiC',type='TH2F',title='EndCap C: #phi-cluster charge per layer;counts;[sector] + [0.2 #times layer]', + path='EndCapC/Overview/MuonSegments/CSC',xbins=80,xmin=0.,xmax=4000,ybins=85,ymin=-17.,ymax=0.) + + cscSegmGroup.defineHistogram('clus_time_mon,clus_secLayer;Muon_Segm_TimePhiGoodClusPerLayer_EC',cutmask='checkTimePhiC',type='TH2F',title='EndCap A: #phi-cluster time per layer;time [ns];[sector] + [0.2 #times layer]', + path='EndCapC/Overview/MuonSegments/CSC',xbins=40,xmin=-200.,xmax=200.,ybins=85,ymin=-17.,ymax=0.) + + cscSegmGroup.defineHistogram('tmp_etaClusA;Muon_Segm_NumEtaCluster_EA',cutmask='checkClusEtaA',type='TH1F',title='Endcap A: No. of #eta-clusters on segment;#clusters;entries', + path='EndCapA/Detail/CSC',xbins=11,xmin=-0.5,xmax=10.5) + + cscSegmGroup.defineHistogram('tmp_etaClusGoodA;Muon_Segm_NumGoodEtaCluster_EA',cutmask='checkClusEtaGoodA',type='TH1F',title='Endcap A: No. of good #eta-clusters on segment;#good-clusters;entries', + path='EndCapA/Detail/CSC',xbins=11,xmin=-0.5,xmax=10.5) + + cscSegmGroup.defineHistogram('tmp_phiClusA;Muon_Segm_NumPhiCluster_EA',cutmask='checkClusPhiA',type='TH1F',title='Endcap A: No. of #phi-clusters on segment;#clusters;entries', + path='EndCapA/Detail/CSC',xbins=11,xmin=-0.5,xmax=10.5) + + cscSegmGroup.defineHistogram('tmp_phiClusGoodA;Muon_Segm_NumGoodPhiCluster_EA',cutmask='checkClusPhiGoodA',type='TH1F',title='Endcap A: No. of good #phi-clusters on segment;#good-clusters;entries', + path='EndCapA/Detail/CSC',xbins=11,xmin=-0.5,xmax=10.5) + + cscSegmGroup.defineHistogram('tmp_etaClusC;Muon_Segm_NumEtaCluster_EC',cutmask='checkClusEtaC',type='TH1F',title='Endcap C: No. of #eta-clusters on segment;#clusters;entries', + path='EndCapC/Detail/CSC',xbins=11,xmin=-0.5,xmax=10.5) + + cscSegmGroup.defineHistogram('tmp_etaClusGoodC;Muon_Segm_NumGoodEtaCluster_EC',cutmask='checkClusEtaGoodC',type='TH1F',title='Endcap C: No. of good #eta-clusters on segment;#good-clusters;entries', + path='EndCapC/Detail/CSC',xbins=11,xmin=-0.5,xmax=10.5) + + cscSegmGroup.defineHistogram('tmp_phiClusC;Muon_Segm_NumPhiCluster_EC',cutmask='checkClusPhiC',type='TH1F',title='Endcap C: No. of #phi-clusters on segment;#clusters;entries', + path='EndCapC/Detail/CSC',xbins=11,xmin=-0.5,xmax=10.5) + + cscSegmGroup.defineHistogram('tmp_phiClusGoodC;Muon_Segm_NumGoodPhiCluster_EC',cutmask='checkClusPhiGoodC',type='TH1F',title='Endcap C: No. of good #phi-clusters on segment;#good-clusters;entries', + path='EndCapC/Detail/CSC',xbins=11,xmin=-0.5,xmax=10.5) + + thisLabelx=getCSCLabelx("labels_sgm_clusCounts") + cscSegmGroup.defineHistogram('tmp_layerIndexA_mon,tmp_isectA_mon;Muon_Segm_NumNClusSegments_EA',type='TH2F',title='EndCap A: #eta-number of 3 and 4 cluster segments with each layer;counts;[sector] + [0.2 #times layer]', + path='EndCapA/Detail/CSC',xbins=50,xmin=.5,xmax=5.5,ybins=90,ymin=0,ymax=18.,xlabels=thisLabelx) + + thisLabelx=getCSCLabelx("labels_sgm_clusCounts") + cscSegmGroup.defineHistogram('tmp_layerIndexC_mon,tmp_isectC_mon;Muon_Segm_NumNClusSegments_EC',type='TH2F',title='EndCap C: #eta-number of 3 and 4 cluster segments with each layer;counts;[sector] + [0.2 #times layer]', + path='EndCapC/Detail/CSC',xbins=50,xmin=.5,xmax=5.5,ybins=85,ymin=-17,ymax=0.,xlabels=thisLabelx) + + cscSegmGroup.defineHistogram('etaClusQSumA;Muon_Segm_QSumEtaCluster_EA',type='TH1F',title='Endcap A: #eta-cluster Qsum;counts;entries', + path='EndCapA/Detail/CSC',xbins=80,xmin=0.,xmax=4000.) + + cscSegmGroup.defineHistogram('phiClusQSumA;Muon_Segm_QSumPhiCluster_EA',type='TH1F',title='Endcap A: #phi-cluster Qsum;counts;entries', + path='EndCapA/Detail/CSC',xbins=80,xmin=0.,xmax=4000.) + + cscSegmGroup.defineHistogram('etaTimeClusA;Muon_Segm_TimeEtaCluster_EA',type='TH1F',title='Endcap A: #eta-cluster Time;time [ns];entries', + path='EndCapA/Detail/CSC',xbins=40,xmin=-200.,xmax=200.) + + cscSegmGroup.defineHistogram('phiTimeClusA;Muon_Segm_TimePhiCluster_EA',type='TH1F',title='Endcap A: #phi-cluster Time;time [ns];entries', + path='EndCapA/Detail/CSC',xbins=40,xmin=-200.,xmax=200.) + + cscSegmGroup.defineHistogram('etaClusQSumC;Muon_Segm_QSumEtaCluster_EC',type='TH1F',title='Endcap C: #eta-cluster Qsum;counts;entries', + path='EndCapC/Detail/CSC',xbins=80,xmin=0.,xmax=4000.) + + cscSegmGroup.defineHistogram('phiClusQSumC;Muon_Segm_QSumPhiCluster_EC',type='TH1F',title='Endcap C: #phi-cluster Qsum;counts;entries', + path='EndCapC/Detail/CSC',xbins=80,xmin=0.,xmax=4000.) + + cscSegmGroup.defineHistogram('etaTimeClusC;Muon_Segm_TimeEtaCluster_EC',type='TH1F',title='Endcap C: #eta-cluster Time;time [ns];entries', + path='EndCapC/Detail/CSC',xbins=40,xmin=-200.,xmax=200.) + + cscSegmGroup.defineHistogram('phiTimeClusC;Muon_Segm_TimePhiCluster_EC',type='TH1F',title='Endcap C: #phi-cluster Time;time [ns];entries', + path='EndCapC/Detail/CSC',xbins=40,xmin=-200.,xmax=200.) + + cscSegmGroup.defineHistogram('etaQSumGoodClusA;Muon_Segm_QSumGoodEtaCluster_EA',type='TH1F',title='Endcap A: Good #eta-cluster Qsum;counts;entries', + path='EndCapA/Detail/CSC',xbins=80,xmin=0.,xmax=4000.) + + cscSegmGroup.defineHistogram('phiQSumGoodClusA;Muon_Segm_QSumGoodPhiCluster_EA',type='TH1F',title='Endcap A: Good #phi-cluster Qsum;counts;entries', + path='EndCapA/Detail/CSC',xbins=80,xmin=0.,xmax=4000.) + + cscSegmGroup.defineHistogram('etaQSumGoodClusC;Muon_Segm_QSumGoodEtaCluster_EC',type='TH1F',title='Endcap C: Good #eta-cluster Qsum;counts;entries', + path='EndCapC/Detail/CSC',xbins=80,xmin=0.,xmax=4000.) + + cscSegmGroup.defineHistogram('phiQSumGoodClusC;Muon_Segm_QSumGoodPhiCluster_EC',type='TH1F',title='Endcap C: Good #phi-cluster Qsum;counts;entries', + path='EndCapC/Detail/CSC',xbins=80,xmin=0.,xmax=4000.) + + cscSegmGroup.defineHistogram('etaTimeGoodClusA;Muon_Segm_TimeGoodEtaCluster_EA',type='TH1F',title='Endcap A: Good #eta-cluster Time;time [ns];entries', + path='EndCapA/Detail/CSC',xbins=40,xmin=-200.,xmax=200.) + + cscSegmGroup.defineHistogram('etaTimeGoodClusC;Muon_Segm_TimeGoodEtaCluster_EC',type='TH1F',title='Endcap C: Good #eta-cluster Time;time [ns];entries', + path='EndCapC/Detail/CSC',xbins=40,xmin=-200.,xmax=200.) + + cscSegmGroup.defineHistogram('phiTimeGoodClusA;Muon_Segm_TimeGoodPhiCluster_EA',type='TH1F',title='Endcap A: Good #phi-cluster Time;time [ns];entries', + path='EndCapA/Detail/CSC',xbins=40,xmin=-200.,xmax=200.) + + cscSegmGroup.defineHistogram('phiTimeGoodClusC;Muon_Segm_TimeGoodPhiCluster_EC',type='TH1F',title='Endcap C: Good #phi-cluster Time;time [ns];entries', + path='EndCapC/Detail/CSC',xbins=40,xmin=-200.,xmax=200.) + + cscSegmGroup.defineHistogram('etaQSumTot0,phiQSumTot0;Muon_Segm_QSumGoodClusCorrelation_EA',type='TH2F',title='Endcap A: #phi-cluster vs. good #eta-cluster;good #eta-cluster counts;good #phi-cluster counts', + path='EndCapA/Detail/CSC',xbins=80,xmin=0.,xmax=4000.,ybins=80,ymin=0.,ymax=4000.) + + cscSegmGroup.defineHistogram('etaQSumTot,phiQSumTot;Muon_Segm_QSumGoodClusCorrelation_EC',type='TH2F',title='Endcap C: #phi-cluster vs. good #eta-cluster;good #eta-cluster counts;good #phi-cluster counts', + path='EndCapC/Detail/CSC',xbins=80,xmin=0.,xmax=4000.,ybins=80,ymin=0.,ymax=4000.) + + + #myGroup.defineHistogram('lb', title='Luminosity Block;lb;Events', @@ -432,6 +576,7 @@ if __name__=='__main__': from AthenaConfiguration.TestDefaults import defaultTestFiles ConfigFlags.Input.Files = defaultTestFiles.ESD + ConfigFlags.Output.HISTFileName = 'CscMonitorOutput.root' ConfigFlags.Muon.doCSCs = True ConfigFlags.Muon.doRPCs = False diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/python/CscRawMonLabels.py b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/python/CscRawMonLabels.py index 3fd6aa2d74a..7d02001b3c2 100644 --- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/python/CscRawMonLabels.py +++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/python/CscRawMonLabels.py @@ -3,4 +3,6 @@ # labels_clus_occupancy_signal_EA=['','','','','','L01:1', 'L01:2', 'L01:3', 'L01:4', '', 'S02:1', 'S02:2', 'S02:3', 'S02:4', '', 'L03:1', 'L03:2', 'L03:3', 'L03:4', '', 'S04:1', 'S04:2', 'S04:3', 'S04:4', '', 'L05:1', 'L05:2', 'L05:3', 'L05:4', '', 'S06:1', 'S06:2', 'S06:3', 'S06:4', '', 'L07:1', 'L07:2', 'L07:3', 'L07:4', '', 'S08:1', 'S08:2', 'S08:3', 'S08:4', '', 'L09:1', 'L09:2', 'L09:3', 'L09:4', '', 'S10:1', 'S10:2', 'S10:3', 'S10:4', '', 'L11:1', 'L11:2', 'L11:3', 'L11:4', '', 'S12:1', 'S12:2', 'S12:3', 'S12:4', '', 'L13:1', 'L13:2', 'L13:3', 'L13:4', '', 'S14:1', 'S14:2', 'S14:3', 'S14:4', '', 'L15:1', 'L15:2', 'L15:3', 'L15:4', '', 'S16:1', 'S16:2', 'S16:3', 'S16:4', '','','','','',''] -labels_clus_occupancy_signal_EC=['','','','','','L15:4', 'L15:3', 'L15:2', 'L15:1', '', 'S14:4', 'S14:3', 'S14:2', 'S14:1', '', 'L13:4', 'L13:3', 'L13:2', 'L13:1', '', 'S12:4', 'S12:3', 'S12:2', 'S12:1', '', 'L11:4', 'L11:3', 'L11:2', 'L11:1', '', 'S10:4', 'S10:3', 'S10:2', 'S10:1', '', 'L09:4', 'L09:3', 'L09:2', 'L09:1', '', 'S08:4', 'S08:3', 'S08:2', 'S08:1', '', 'L07:4', 'L07:3', 'L07:2', 'L07:1', '', 'S06:4', 'S06:3', 'S06:2', 'S06:1', '', 'L05:4', 'L05:3', 'L05:2', 'L05:1', '', 'S04:4', 'S04:3', 'S04:2', 'S04:1', '', 'L03:4', 'L03:3', 'L03:2', 'L03:1', '', 'S02:4', 'S02:3', 'S02:2', 'S02:1', '', 'L01:4', 'L01:3', 'L01:2', 'L01:1', '', 'S00:4', 'S00:3', 'S00:2', 'S00:1', ''] \ No newline at end of file +labels_clus_occupancy_signal_EC=['','','','','','L15:4', 'L15:3', 'L15:2', 'L15:1', '', 'S14:4', 'S14:3', 'S14:2', 'S14:1', '', 'L13:4', 'L13:3', 'L13:2', 'L13:1', '', 'S12:4', 'S12:3', 'S12:2', 'S12:1', '', 'L11:4', 'L11:3', 'L11:2', 'L11:1', '', 'S10:4', 'S10:3', 'S10:2', 'S10:1', '', 'L09:4', 'L09:3', 'L09:2', 'L09:1', '', 'S08:4', 'S08:3', 'S08:2', 'S08:1', '', 'L07:4', 'L07:3', 'L07:2', 'L07:1', '', 'S06:4', 'S06:3', 'S06:2', 'S06:1', '', 'L05:4', 'L05:3', 'L05:2', 'L05:1', '', 'S04:4', 'S04:3', 'S04:2', 'S04:1', '', 'L03:4', 'L03:3', 'L03:2', 'L03:1', '', 'S02:4', 'S02:3', 'S02:2', 'S02:1', '', 'L01:4', 'L01:3', 'L01:2', 'L01:1', '', 'S00:4', 'S00:3', 'S00:2', 'S00:1', ''] +labels_sgm_status = [ "Unspoiled", "Simple", "Edge", "MultiPeak", "Narrow", "Wide", "Skewed", "QRatInc", "StripFitFailed", "SplitUnspoiled", "SplitSimple", "SplitEdge", "SplitMultiPeak", "SplitNarrow", "SplitWide", "SplitSkewed", "SplitQRatInc", "SplitStripFitFailed", "Undefined" ] +labels_sgm_clusCounts = [ "234", "134", "124", "123", "All" ] \ No newline at end of file diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/CSCSegmValMonAlg.cxx b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/CSCSegmValMonAlg.cxx new file mode 100755 index 00000000000..d4461e6b887 --- /dev/null +++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/CSCSegmValMonAlg.cxx @@ -0,0 +1,542 @@ +/* + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +*/ +#include "AthenaMonitoring/AthenaMonManager.h" + +#include "CscRawDataMonitoring/CSCSegmValMonAlg.h" + +#include "MuonPrepRawData/CscClusterStatus.h" +#include "MuonPrepRawData/CscStripPrepDataCollection.h" +#include "MuonPrepRawData/CscStripPrepDataContainer.h" +#include "MuonPrepRawData/CscPrepData.h" + +// Track +#include "TrkTrack/TrackCollection.h" +#include "TrkEventPrimitives/PropDirection.h" +#include "TrkEventPrimitives/LocalDirection.h" +#include "TrkSurfaces/PlaneSurface.h" + +#include "TrkCompetingRIOsOnTrack/CompetingRIOsOnTrack.h" +#include "MuonRIO_OnTrack/CscClusterOnTrack.h" + +// STL +#include <sstream> +#include <utility> +#include "GaudiKernel/SystemOfUnits.h" + +//________________________________________________________________________________________________________ +CSCSegmValMonAlg::CSCSegmValMonAlg( const std::string& name, ISvcLocator* pSvcLocator ) : + AthMonitorAlgorithm(name,pSvcLocator) + { } + + +//________________________________________________________________________________________________________ +StatusCode CSCSegmValMonAlg::initialize() { + + ATH_MSG_INFO( "in CSCSegmValMonAlg::init()" ); + if( m_doEvtSel ) ATH_CHECK(m_trigDecTool.retrieve()); + + if(m_sampSelTriggers.empty() && m_doEvtSel) { + ATH_MSG_WARNING("Event selection triggers not specified. Switching off trigger-aware monitoring"); + m_doEvtSel = false; + } + + StoreGateSvc* detStore = nullptr; + ATH_CHECK(service("DetectorStore", detStore)); + ATH_CHECK(m_edmHelperSvc.retrieve()); + ATH_CHECK(m_idHelperSvc.retrieve()); + ATH_CHECK(m_segmKey.initialize()); + + return AthMonitorAlgorithm::initialize(); +} + +// +// fillHistograms----------------------------------------------------------------------------------------- +// + +StatusCode CSCSegmValMonAlg::fillHistograms(const EventContext& ctx) const{ + + ATH_MSG_DEBUG( "in CSCSegmValMonAlg::fillHistograms() " ); + + if( m_environment == AthMonitorAlgorithm::Environment_t::tier0 || m_environment == AthMonitorAlgorithm::Environment_t::tier0ESD || m_environment == AthMonitorAlgorithm::Environment_t::user ) { + + // if required, check if event passed sample-selection triggers + if(m_doEvtSel && !evtSelTriggersPassed()) return StatusCode::SUCCESS; + + // Segment Cluster counter + int segmClustCount[33]; + + // arrays to hold cluster-count + // 32 chambers and 8 layers (each has one extra - index '0' is not counted) + int clusCount[33][9]; + for(unsigned int kl = 0; kl < 33; kl++ ) { + for(unsigned int cm3 = 0; cm3 < 9; cm3++ ){ + clusCount[kl][cm3] = 0; + } + } + + SG::ReadHandle<Trk::SegmentCollection> segments(m_segmKey, ctx); + + if ( segments->empty() ){ + ATH_MSG_DEBUG( " Segm Collection is Empty, done... "); + return StatusCode::SUCCESS; + } + + ATH_MSG_DEBUG( " Segm Collection size " ); + ATH_MSG_DEBUG( "Number of segms found: " << segments->size() ); + + if(segments->size() > 0){ + ATH_MSG_DEBUG( "Number of segms in event is: " << segments->size() ); + ATH_MSG_DEBUG( "This algorithm is designed to operate for single segm / event only" ); + ATH_MSG_DEBUG( "Processing only the first segm in the segm collection" ); + } + + int segnum = 0; + int layerindex = 0; + + //Loop over segms + for (Trk::SegmentCollection::const_iterator s = segments->begin(); s != segments->end(); ++s) { + + //Get segm + const Muon::MuonSegment *segm=dynamic_cast<const Muon::MuonSegment*>(*s); + + if (!segm){ + ATH_MSG_WARNING( "no pointer to segm!!!" ); + continue; + } + + ATH_MSG_DEBUG( "Looking at segment id" ); + // Skip segment if there are no csc hits + if ( cscHits(segm)<1 ) continue; + + // Get contained measurements + const std::vector<const Trk::MeasurementBase*> meas = segm->containedMeasurements(); + + // Skip segment if no measurements + // Number of clusters on segment + auto n_clust = Monitored::Scalar<int>("n_clust", meas.size()); + + if ( n_clust < 2 ) continue; + + // Analyze segment if it is a csc segment + if ( isCscSegment(segm) ){ + + segnum++; + + // Initialize cluster counter + for(int sect = 0; sect < 33; sect++) { + segmClustCount[sect] = 0; + for(unsigned int ilay = 0; ilay < 9; ilay++ ){ + clusCount[sect][ilay] = 0; + } + } + + // Print out segment information + const Trk::FitQuality* fq = segm->fitQuality(); + double chi2 = 999.; + int ndof = -1; + if( fq ) { + chi2 = fq->chiSquared(); + ndof = fq->numberDoF(); + ATH_MSG_DEBUG( "Chi2 " << chi2 ); + ATH_MSG_DEBUG( "Ndof " << ndof ); + } + + // cut on segment angle + float segm_ly = segm->localParameters()[Trk::locY]; + float segm_ayz = segm->localDirection().angleYZ(); + segm_ayz -= M_PI/2.; + float segm_cut = m_segmSlope; + bool segmAngle_cut = segmSlopeCut(segm_ly, segm_ayz, segm_cut); + ATH_MSG_DEBUG(" local_pos: " << segm_ly << "\tangle_yz: " << segm_ayz << "\tcut: " << segm_cut << "\t pass = " << segmAngle_cut ); + + ATH_MSG_DEBUG( "R " << segm->globalPosition().perp() ); + ATH_MSG_DEBUG( "Z " << segm->globalPosition().z() ); + ATH_MSG_DEBUG( "Phi " << segm->globalPosition().phi() ); + ATH_MSG_DEBUG( "Eta " << segm->globalPosition().eta() ); + ATH_MSG_DEBUG( "Dir Phi " << segm->globalDirection().phi() ); + ATH_MSG_DEBUG( "Dir Eta " << segm->globalDirection().eta() ); + + // ============================================================================== + // Field Range Notes + // ============================================================================== + // StationName unsigned integer maps to "CSS", "CSL", etc. + // StationEta [-1,1] -1 for backward, 1 for forward endcap + // StationPhi [1,8] increases with Phi + // Technology [1] maps to "CSC" + // ChamberLayer [1,2] increases with |Z| + // WireLayer [1,4] increases with |Z| + // MeasuresPhi [0,1] 0 if measures R, 1 if measures Phi + // Strip [1,n] increases with R for MeasuresPhi=0 + // increases with Phi for MeasuresPhi=1 + // ============================================================================== + + // identify the segment location + const Trk::MeasurementBase* rio = meas.at(0); + Identifier segmId = m_edmHelperSvc->getIdentifier(*rio); + + int segm_stationPhi = m_idHelperSvc->cscIdHelper().stationPhi(segmId); + int segm_stationEta = m_idHelperSvc->cscIdHelper().stationEta(segmId); + int segm_stationName = m_idHelperSvc->cscIdHelper().stationName(segmId); + std::string segm_stationString = m_idHelperSvc->cscIdHelper().stationNameString(segm_stationName); + int segm_chamberType = Muon::MuonStationIndex::CSS == segm_stationName ? 0 : 1; + auto segm_sectorNo = Monitored::Scalar<int>("segm_sectorNo", (segm_stationEta * (2 * segm_stationPhi - segm_chamberType)) ); // [-16 -> -1] and [+1 -> +16] + int segm_isec = segm_sectorNo < 0 ? segm_sectorNo*(-1) : segm_sectorNo+16; // [-16 -> -1] shifted to [1 -> 16] and [+1 -> +16] shifted to [+17 -> +32] + ATH_MSG_DEBUG(" sgsec = " << segm_isec << "\tsec = " << segm_sectorNo); + auto sideA = Monitored::Scalar<int>("sideA", (int) (segm_stationEta==1)); + auto sideC = Monitored::Scalar<int>("sideC",(int)(segm_stationEta==-1)); + fill("CscSegmMonitor",n_clust,segm_sectorNo,sideA,sideC); + + float clus_kiloele = 1.0e-3; // multiply # of electrons by this number to get kiloElectrons (1 ke = 1 ADC) + int eta_clus_count[2][2] = {{0, 0},{0, 0}}, phi_clus_count[2][2] = {{0, 0},{0, 0}}; // no. of prec/trans hits per segment + float eta_clus_qsum[2][5] = {{-1., -1.}, {-1., -1., -1., -1., -1.}}, phi_clus_qsum[2][5] = {{-1., -1.}, {-1., -1., -1., -1., -1.}}; // qsum over each prec/trans. layer on segment + float eta_clus_time[2][5] = {{-1., -1.}, {-1., -1., -1., -1., -1.}}, phi_clus_time[2][5] = {{-1., -1.}, {-1., -1., -1., -1., -1.}}; // time over each prec/trans. layer on segment + int eta_clus_use[2][5] = {{0, 0},{0,0,0,0,0}}, phi_clus_use[2][5] = {{0,0}, {0,0,0,0,0}}; + + layerindex = 0; + + for( auto& hit : segm->containedMeasurements()) { + const Muon::CscClusterOnTrack* clust_rot = dynamic_cast<const Muon::CscClusterOnTrack*>(hit); + if ( clust_rot ) { + Identifier clusId = m_edmHelperSvc->getIdentifier(*clust_rot); + + // get the cluster coordinates + int clus_stationName = m_idHelperSvc->cscIdHelper().stationName(clusId); + int clus_chamberType = Muon::MuonStationIndex::CSS == clus_stationName ? 0 : 1; + int clus_stationEta = m_idHelperSvc->cscIdHelper().stationEta(clusId); + int clus_stationPhi = m_idHelperSvc->cscIdHelper().stationPhi(clusId); + int clus_wireLayer = m_idHelperSvc->cscIdHelper().wireLayer(clusId); + int clus_measuresPhi = m_idHelperSvc->cscIdHelper().measuresPhi(clusId); + + // convert to my coordinates + int clus_sectorNo = clus_stationEta * (2 * clus_stationPhi - clus_chamberType); // [-16 -> -1] and [+1 -> +16] + auto clus_secLayer = Monitored::Scalar<float>("clus_secLayer", clus_sectorNo + 0.2 * (clus_wireLayer - 1) + 0.1); + int clus_isec = clus_sectorNo < 0 ? clus_sectorNo*(-1) : clus_sectorNo+16; // [-16 -> -1] shifted to [1 -> 16] and [+1 -> +16] shifted to [+17 -> +32] + int clus_ilay = (clus_measuresPhi ? clus_wireLayer : clus_wireLayer+4); + + // check the cluster status; probably need to read status info from jobOptions - not done for the moment + Muon::CscClusterStatus status = clust_rot->status(); + auto status_mon = Monitored::Scalar<int>("status_mon",(int)clust_rot->status()); + auto sideA_phi0 = Monitored::Scalar<int>("sideA_phi0",(int) (segm_stationEta==1)&& (int)(clus_measuresPhi==0)); + auto sideC_phi0 = Monitored::Scalar<int>("sideC_phi0",(int) (segm_stationEta==-1) && (int)(clus_measuresPhi == 0)); + auto sideA_phi = Monitored::Scalar<int>("sideA_phi", (int) (segm_stationEta==1) && (int)(clus_measuresPhi!=0)); + auto sideC_phi = Monitored::Scalar<int>("sideC_phi", (int) (segm_stationEta==-1) && (int)(clus_measuresPhi!=0)); + + fill("CscSegmMonitor",status_mon, sideA_phi0, sideC_phi0, sideA_phi, sideC_phi); + + std::string clus_stat = Muon::toString(status); + bool clus_status = ( (int(status)==Muon::CscStatusUnspoiled) || (int(status)==Muon::CscStatusSplitUnspoiled) || (int(status)==Muon::CscStatusSimple)) ? true : false; + bool clus_stat_eff = ( (int(status) >= 0 && int(status) < 8 ) || (int(status) > 8 && int(status) < 18) ) ? true : false; + + // get cluster + const Muon::CscPrepData* theClus = clust_rot->prepRawData(); + float clus_qsum = 0, clus_time = -1.; + + if(theClus){ + clus_qsum = theClus->charge() * clus_kiloele; + clus_time = theClus->time(); + + if(clus_measuresPhi == 0){ + if(clus_stationEta == 1) eta_clus_count[0][0]++; + else eta_clus_count[1][0]++; + } else{ + if(clus_stationEta == 1) phi_clus_count[0][0]++; + else phi_clus_count[1][0]++; + } + } + + auto clus_qsum_mon = Monitored::Scalar<float>("clus_qsum_mon",clus_qsum); + auto clus_time_mon = Monitored::Scalar<float>("clus_time_mon",clus_time); + + // get no. of strips per cluster + unsigned int clus_noStrips = theClus->rdoList().size(); + + //need at least three strips in an eta-cluster + bool clus_eta_status = clus_status && ( clus_noStrips > 2 ) && (clus_measuresPhi == 0); + bool clus_eta_eff = clus_stat_eff && ( clus_noStrips > 2 ) && (clus_measuresPhi == 0); + if(clus_eta_eff){ + if(clus_stationEta == 1) eta_clus_count[0][1]++; + else phi_clus_count[1][1]++; + } + if(clus_eta_status){ + if(clus_stationEta == 1){ + eta_clus_qsum[0][clus_wireLayer] = clus_qsum; + eta_clus_time[0][clus_wireLayer] = clus_time; + eta_clus_use[0][clus_wireLayer] = 1; + } + else{ + eta_clus_qsum[1][clus_wireLayer] = clus_qsum; + eta_clus_time[1][clus_wireLayer] = clus_time; + eta_clus_use[1][clus_wireLayer] = 1; + } + } + + // need at least one strip in a phi-cluster + bool clus_phi_status = clus_status && ( clus_noStrips > 0 ) && (clus_measuresPhi == 1); + if(clus_phi_status) { + if(clus_stationEta==1){ + phi_clus_qsum[0][clus_wireLayer] = clus_qsum; + phi_clus_time[0][clus_wireLayer] = clus_time; + phi_clus_use[0][clus_wireLayer] = 1; + phi_clus_count[0][1]++; + } else { + phi_clus_qsum[1][clus_wireLayer] = clus_qsum; + phi_clus_time[1][clus_wireLayer] = clus_time; + phi_clus_use[1][clus_wireLayer] = 1; + phi_clus_count[1][1]++; + } + } + + + auto checkStatusEtaA = Monitored::Scalar<int>("checkStatusEtaA", (int)clus_eta_status && (int)(clus_stationEta==1)); + auto checkStatusEtaC = Monitored::Scalar<int>("checkStatusEtaC", (int)clus_eta_status && (int)(clus_stationEta==-1)); + auto checkTimeEtaA = Monitored::Scalar<int>("checkTimeEtaA", (int)clus_eta_status && (int)(clus_stationEta==1) && (int) (std::abs(clus_time) <= 200)); + auto checkTimeEtaC = Monitored::Scalar<int>("checkTimeEtaC", (int)clus_eta_status && (int)(clus_stationEta==-1) && (int) (std::abs(clus_time) <= 200)); + + auto checkStatusPhiA = Monitored::Scalar<int>("checkStatusPhiA", (int)clus_phi_status && (int)(clus_stationEta==1)); + auto checkStatusPhiC = Monitored::Scalar<int>("checkStatusPhiC", (int)clus_phi_status && (int)(clus_stationEta==-1)); + auto checkTimePhiA = Monitored::Scalar<int>("checkTimePhiA", (int)clus_phi_status && (int)(clus_stationEta==1) && (int) (std::abs(clus_time) <= 200)); + auto checkTimePhiC = Monitored::Scalar<int>("checkTimePhiC", (int)clus_phi_status && (int)(clus_stationEta==-1) && (int) (std::abs(clus_time) <= 200)); + fill("CscSegmMonitor", clus_qsum_mon, clus_secLayer, clus_time_mon, checkStatusEtaA, checkStatusEtaC, checkTimeEtaA, checkTimeEtaC, checkStatusPhiA, checkStatusPhiC, checkTimePhiA, checkTimePhiC ); + + // increment the cluster-count for this layer + if(clus_eta_status || clus_phi_status) clusCount[clus_isec][clus_ilay]++; + + // increment segment cluster count + if(clus_eta_status) segmClustCount[clus_isec]++; + + if(clus_eta_status) layerindex+=clus_wireLayer; + + ATH_MSG_DEBUG("status = " << clus_stat << "\tcharge = " << clus_qsum << "\ttime= " << clus_time << "\tnstrips = " << clus_noStrips); + + + } // if clust_rot + + } // for loop over clusters + + auto tmp_etaClusA = Monitored::Scalar<int>("tmp_etaClusA", eta_clus_count[0][0]); + auto tmp_etaClusGoodA = Monitored::Scalar<int>("tmp_etaClusGoodA", eta_clus_count[0][1]); + + auto tmp_phiClusA = Monitored::Scalar<int>("tmp_phiClusA", phi_clus_count[0][0]); + auto tmp_phiClusGoodA = Monitored::Scalar<int>("tmp_phiClusGoodA", phi_clus_count[0][1]); + + auto checkClusEtaA = Monitored::Scalar<int>("checkClusEtaA", (int)eta_clus_count[0][0] > 0); + auto checkClusEtaGoodA = Monitored::Scalar<int>("checkClusEtaGoodA", (int)eta_clus_count[0][1] > 0); + + auto checkClusPhiA = Monitored::Scalar<int>("checkClusPhiA", (int)phi_clus_count[0][0] > 0); + auto checkClusPhiGoodA = Monitored::Scalar<int>("checkClusPhiGoodA", (int)phi_clus_count[0][1] > 0); + + auto tmp_etaClusC = Monitored::Scalar<int>("tmp_etaClusC", eta_clus_count[1][0]); + auto tmp_etaClusGoodC = Monitored::Scalar<int>("tmp_etaClusGoodC", eta_clus_count[1][1]); + + auto tmp_phiClusC = Monitored::Scalar<int>("tmp_phiClusC", phi_clus_count[1][0]); + auto tmp_phiClusGoodC = Monitored::Scalar<int>("tmp_phiClusGoodC", phi_clus_count[1][1]); + + auto checkClusEtaC = Monitored::Scalar<int>("checkClusEtaC", (int)eta_clus_count[1][0] > 0); + auto checkClusEtaGoodC = Monitored::Scalar<int>("checkClusEtaGoodC", (int)eta_clus_count[1][1] > 0); + + auto checkClusPhiC = Monitored::Scalar<int>("checkClusPhiC", (int)phi_clus_count[1][0] > 0); + auto checkClusPhiGoodC = Monitored::Scalar<int>("checkClusPhiGoodC", (int)phi_clus_count[1][1] > 0); + + fill("CscSegmMonitor", tmp_etaClusA, checkClusEtaA, tmp_etaClusGoodA, checkClusEtaGoodA, tmp_phiClusA, tmp_phiClusGoodA, checkClusPhiA, checkClusPhiGoodA, tmp_etaClusC, checkClusEtaC, tmp_etaClusGoodC, checkClusEtaGoodC, tmp_phiClusC, tmp_phiClusGoodC, checkClusPhiC, checkClusPhiGoodC); + + // Fill number of 3 and 4 cluster segment histogram + std::vector<int> tmp_layerIndexA; + std::vector<int> tmp_isectA; + std::vector<int> tmp_layerIndexC; + std::vector<int> tmp_isectC; + + for( int isect = 1; isect < 17; isect++) { + + if(segmClustCount[isect+16] > 2 ) { + tmp_layerIndexA.push_back(layerindex-5); + tmp_isectA.push_back(isect); + } + + if(segmClustCount[isect+16] > 3){ + for(int i=1; i<=4; i++) { + tmp_layerIndexA.push_back(i); + tmp_isectA.push_back(isect); + } + } + + if(segmClustCount[isect] > 2) { + tmp_layerIndexC.push_back(layerindex-5); + tmp_isectC.push_back(-1.*isect); + } + + + if(segmClustCount[isect] > 3) { + for(int i=1; i<=4; i++) { + tmp_layerIndexC.push_back(i); + tmp_isectC.push_back(-1.*isect); + } + } + } + + auto tmp_layerIndexA_mon = Monitored::Collection("tmp_layerIndexA_mon", tmp_layerIndexA); + auto tmp_isectA_mon = Monitored::Collection("tmp_isectA_mon", tmp_isectA); + auto tmp_layerIndexC_mon = Monitored::Collection("tmp_layerIndexC_mon", tmp_layerIndexA); + auto tmp_isectC_mon = Monitored::Collection("tmp_isectC_mon", tmp_isectA); + fill("CscSegmMonitor", tmp_layerIndexA_mon, tmp_isectA_mon, tmp_layerIndexC_mon, tmp_isectC_mon); + + float eta_clus_qsum_tot = 0., phi_clus_qsum_tot = 0.; // total qsum over all prec. trans. layers on segment + + for(unsigned int i=0; i < 2; i++){ + eta_clus_qsum_tot = 0; phi_clus_qsum_tot = 0.; + + for(unsigned int j = 1; j <5; j++) { + if(i==0){ + auto etaClusQSumA = Monitored::Scalar<float>("etaClusQSumA", eta_clus_qsum[i][j]); + auto phiClusQSumA = Monitored::Scalar<float>("phiClusQSumA", phi_clus_qsum[i][j]); + fill("CscSegmMonitor", etaClusQSumA, phiClusQSumA); + + if(std::abs(eta_clus_time[i][j]) <= 200) { + auto etaTimeClusA = Monitored::Scalar<float>("etaTimeClusA",eta_clus_time[i][j]); + fill("CscSegmMonitor", etaTimeClusA); + } + + if(std::abs(phi_clus_time[i][j]) <= 200) { + auto phiTimeClusA = Monitored::Scalar<float>("phiTimeClusA",phi_clus_time[i][j]); + fill("CscSegmMonitor", phiTimeClusA); + } + } + + if(i==1){ + auto etaClusQSumC = Monitored::Scalar<float>("etaClusQSumC", eta_clus_qsum[i][j]); + auto phiClusQSumC = Monitored::Scalar<float>("phiClusQSumC", phi_clus_qsum[i][j]); + fill("CscSegmMonitor", etaClusQSumC, phiClusQSumC); + + if(std::abs(eta_clus_time[i][j]) <= 200) { + auto etaTimeClusC = Monitored::Scalar<float>("etaTimeClusC",eta_clus_time[i][j]); + fill("CscSegmMonitor", etaTimeClusC); + } + + if(std::abs(phi_clus_time[i][j]) <= 200) { + auto phiTimeClusC = Monitored::Scalar<float>("phiTimeClusC",phi_clus_time[i][j]); + fill("CscSegmMonitor", phiTimeClusC); + } + } + + + if(phi_clus_use[i][j] && eta_clus_use[i][j]){ + eta_clus_qsum_tot += eta_clus_qsum[i][j]; + phi_clus_qsum_tot += phi_clus_qsum[i][j]; + + if(i==0){ + auto etaQSumGoodClusA = Monitored::Scalar<float>("etaQSumGoodClusA",eta_clus_qsum[i][j]); + auto phiQSumGoodClusA = Monitored::Scalar<float>("phiQSumGoodClusA",phi_clus_qsum[i][j]); + fill("CscSegmMonitor", etaQSumGoodClusA, phiQSumGoodClusA); + if(std::abs(eta_clus_time[i][j]) <= 200){ + auto etaTimeGoodClusA = Monitored::Scalar<float>("etaTimeGoodClusA",eta_clus_time[i][j]); + fill("CscSegmMonitor", etaTimeGoodClusA); + } + + if(std::abs(phi_clus_time[i][j]) <= 200) { + auto phiTimeGoodClusA = Monitored::Scalar<float>("phiTimeGoodClusA",phi_clus_time[i][j]); + fill("CscSegmMonitor", phiTimeGoodClusA); + } + } + + if(i==1){ + auto etaQSumGoodClusC = Monitored::Scalar<float>("etaQSumGoodClusC",eta_clus_qsum[i][j]); + auto phiQSumGoodClusC = Monitored::Scalar<float>("phiQSumGoodClusC",phi_clus_qsum[i][j]); + fill("CscSegmMonitor", etaQSumGoodClusC, phiQSumGoodClusC); + if(std::abs(eta_clus_time[i][j]) <= 200){ + auto etaTimeGoodClusC = Monitored::Scalar<float>("etaTimeGoodClusC",eta_clus_time[i][j]); + fill("CscSegmMonitor", etaTimeGoodClusC); + } + + if(std::abs(phi_clus_time[i][j]) <= 200) { + auto phiTimeGoodClusC = Monitored::Scalar<float>("phiTimeGoodClusC",phi_clus_time[i][j]); + fill("CscSegmMonitor", phiTimeGoodClusC); + } + } + } + } + + if(i==0) { + auto etaQSumTot0 = Monitored::Scalar<float>("etaQSumTot0", eta_clus_qsum_tot); + auto phiQSumTot0 = Monitored::Scalar<float>("phiQSumTot0", phi_clus_qsum_tot); + fill("CscSegmMonitor", etaQSumTot0, phiQSumTot0); + } + + if(i==1) { + auto etaQSumTot = Monitored::Scalar<float>("etaQSumTot", eta_clus_qsum_tot); + auto phiQSumTot = Monitored::Scalar<float>("phiQSumTot", phi_clus_qsum_tot); + fill("CscSegmMonitor", etaQSumTot, phiQSumTot); + } + } + } // if is csc segment + } // loop over segms + } // environment if + + return StatusCode::SUCCESS; +} + +//________________________________________________________________________________________________________ +bool CSCSegmValMonAlg::evtSelTriggersPassed() const { + + if(!m_doEvtSel) return true; + + for (const auto& trig : m_sampSelTriggers) { + if(m_trigDecTool->isPassed(trig, TrigDefs::eventAccepted)) { + return true; + } + } + return false; + +} // end evtSelTriggersPassed + +//________________________________________________________________________________________________________ +bool CSCSegmValMonAlg::isCscSegment( const Muon::MuonSegment* seg ) const { + bool isCsc(false); + + std::vector<const Trk::MeasurementBase*> mbs = seg->containedMeasurements(); + for( unsigned int i = 0; i< mbs.size(); ++i){ + + const Trk::RIO_OnTrack* rot = dynamic_cast<const Trk::RIO_OnTrack*> (mbs[i]); + if (!rot){ + const Trk::CompetingRIOsOnTrack* crot = dynamic_cast<const Trk::CompetingRIOsOnTrack*> (mbs[i]); + if (crot) rot = &(crot->rioOnTrack(0)); + } + if( !rot ) { + continue; + } + if( m_idHelperSvc->isCsc( rot->identify() ) ) isCsc=true; + } + + return isCsc; +} + + +//________________________________________________________________________________________________________ +unsigned int CSCSegmValMonAlg::cscHits( const Muon::MuonSegment* seg ) const { + unsigned int nrHits(0); + + std::vector<const Trk::MeasurementBase*> mbs = seg->containedMeasurements(); + for( unsigned int i = 0; i< mbs.size(); ++i){ + + const Trk::RIO_OnTrack* rot = dynamic_cast<const Trk::RIO_OnTrack*> (mbs[i]); + if (!rot){ + const Trk::CompetingRIOsOnTrack* crot = dynamic_cast<const Trk::CompetingRIOsOnTrack*> (mbs[i]); + if (crot) rot = &(crot->rioOnTrack(0)); + } + if( !rot ) { + continue; + } + if( m_idHelperSvc->isCsc( rot->identify() ) ) ++nrHits; + } + + return nrHits ; +} + +//________________________________________________________________________________________________________ +bool CSCSegmValMonAlg::segmSlopeCut(const float csc_x, const float csc_ax, const float cut ) const { + float s0 = csc_x; + float s1 = -std::tan(csc_ax); + float s1corr = s1 - 0.000119 * s0; + bool good_segm = std::abs(s1corr)<cut ? true : false; + return good_segm; +} + diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/CscClusterValMonAlg.cxx b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/CscClusterValMonAlg.cxx index 3b426847449..77279b9049e 100644 --- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/CscClusterValMonAlg.cxx +++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/CscClusterValMonAlg.cxx @@ -2,16 +2,6 @@ Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration */ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// -/* NAME : CscClusterValMonAlg.cxx - * PACKAGE : MuonRawDataMonitoring/CscRawDataMonitoring - * PURPOSE : CSC cluster monitoring - * AUTHOR : Venkatesh Kaushik <venkat.kaushik@cern.ch> (2009-04-27) - * - * MODIFIED: C.Paraskevopoulos, C.Kitsaki - */ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// - #include "AthenaMonitoring/AthenaMonManager.h" // Athena include(s) @@ -27,13 +17,7 @@ using namespace Muon; CscClusterValMonAlg::CscClusterValMonAlg( const std::string& name, ISvcLocator* pSvcLocator ) : AthMonitorAlgorithm(name,pSvcLocator) - { - declareProperty("CSCQmaxCutADC", m_qmaxADCCut = 100); - - //trigger aware monitoring - declareProperty("CSCDoEventSelection", m_doEvtSel = false ); - declareProperty("CSCEventSelTriggers", m_sampSelTriggers ); - } + { } StatusCode CscClusterValMonAlg::initialize() { @@ -63,18 +47,7 @@ StatusCode CscClusterValMonAlg::fillHistograms( const EventContext& ctx ) const StatusCode sc = StatusCode::SUCCESS; // check if event passed sample-selection triggers - //if(m_doEvtSel) { if(!evtSelTriggersPassed()) return sc; } - - bool check = false; - - if(!m_doEvtSel) check = true; - std::vector<std::string>::const_iterator - it = m_sampSelTriggers.begin(), itE = m_sampSelTriggers.end(); - for ( ; it != itE; it++ ) { - if (m_trigDecTool->isPassed(*it, TrigDefs::eventAccepted)) check = true; - } - - if(m_doEvtSel) { if(!check) return sc; } + if(m_doEvtSel) { if(!evtSelTriggersPassed()) return sc; } // retrieve cluster / strip collection SG::ReadHandle<CscPrepDataContainer> cscCluster(m_cscClusterKey, ctx); @@ -453,3 +426,20 @@ StatusCode CscClusterValMonAlg::fillHistograms( const EventContext& ctx ) const return sc; } + +// +// evtSelTriggersPassed ---------------------------------------------------------------- +// +bool CscClusterValMonAlg::evtSelTriggersPassed() const { + + if(!m_doEvtSel) return true; + + for(const auto& trig : m_sampSelTriggers) { + if(m_trigDecTool->isPassed(trig,TrigDefs::eventAccepted)){ + return true; + } + } + return false; + +} // end evtSelTriggersPassed + diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/CscPrdValMonAlg.cxx b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/CscPrdValMonAlg.cxx index 30e457638e6..923d7dbf842 100755 --- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/CscPrdValMonAlg.cxx +++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/CscPrdValMonAlg.cxx @@ -2,20 +2,6 @@ Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration */ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// -/* NAME : CscPrdValMonAlg.cxx - * PACKAGE : MuonRawDataMonitoring/CscRawDataMonitoring - * PURPOSE : CSC PrepRawData (PRD) monitoring - * AUTHOR : Ken Johns, Xiaowen Lei (U.Arizona) - * - * MODIFIED: N. Benekos(Illinois) - * V. Kaushik(U.Arizona) : 2009-05-12 - * J. Veatch(U.Arizona) : 2012-02-08 - - * MODIFIED: C.Kitsaki, C.Paraskevopoulos - */ -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// - #include "AthenaMonitoring/AthenaMonManager.h" // Athena include(s) @@ -26,13 +12,9 @@ using namespace Muon; CscPrdValMonAlg::CscPrdValMonAlg( const std::string& name, ISvcLocator* pSvcLocator ) : - AthMonitorAlgorithm(name,pSvcLocator) - { - declareProperty("NoiseCutADC", m_cscNoiseCut = 50); - declareProperty("MapYXandRZ", m_mapxyrz = false); - } - - + AthMonitorAlgorithm(name,pSvcLocator) + { } + StatusCode CscPrdValMonAlg::initialize() { ATH_MSG_INFO( "CscPrdValMonAlg: in initialize" ); ATH_CHECK(m_idHelperSvc.retrieve()); diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/components/CscRawDataMonitoring_entries.cxx b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/components/CscRawDataMonitoring_entries.cxx index 366e04e5294..4b633badcd7 100644 --- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/components/CscRawDataMonitoring_entries.cxx +++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/components/CscRawDataMonitoring_entries.cxx @@ -4,6 +4,7 @@ #include "CscRawDataMonitoring/CSCSegmValAlg.h" #include "CscRawDataMonitoring/CscClusterValMonAlg.h" #include "CscRawDataMonitoring/CscPrdValMonAlg.h" +#include "CscRawDataMonitoring/CSCSegmValMonAlg.h" DECLARE_COMPONENT( CscRdoValAlg ) @@ -12,4 +13,4 @@ DECLARE_COMPONENT( CscClusterValAlg ) DECLARE_COMPONENT( CSCSegmValAlg ) DECLARE_COMPONENT( CscClusterValMonAlg ) DECLARE_COMPONENT( CscPrdValMonAlg ) - +DECLARE_COMPONENT( CSCSegmValMonAlg ) -- GitLab