diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/TgcRawDataMonitoring/python/TgcRawDataMonitorAlgorithm.py b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/TgcRawDataMonitoring/python/TgcRawDataMonitorAlgorithm.py index 5acf4fbfd96726df0f85ee4345f87828f50f3c0a..c62b6b33079edf6f81345b8b13f6af70b07bc97b 100644 --- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/TgcRawDataMonitoring/python/TgcRawDataMonitorAlgorithm.py +++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/TgcRawDataMonitoring/python/TgcRawDataMonitorAlgorithm.py @@ -58,25 +58,108 @@ def TgcRawDataMonitoringConfig(inputFlags): myGroup = helper.addGroup(tgcRawDataMonAlg,'TgcRawDataMonitor',mainDir) + myGroup.defineHistogram('roi_charge;MuonRoI_Charge',title='MuonRoI Charge;Charge;Number of events', + cutmask='roi_tgc',path=trigPath,xbins=3,xmin=-1.5,xmax=1.5) + myGroup.defineHistogram('muon_l1passCharge,muon_eta4gev,muon_phi4gev;MuonRoI_Eff_EtaVsPhi_Charge',title='MuonRoI_Eff_EtaVsPhi_Charge;Offline muon eta; Offline muon phi', + cutmask='muon_l1passThr1',type='TEfficiency',path=trigPath,xbins=100,xmin=-2.5,xmax=2.5,ybins=48,ymin=-math.pi,ymax=math.pi) + myGroup.defineHistogram('muon_l1passCharge,muon_pt_tgc;MuonRoI_Eff_Pt_TGC_Charge',title='MuonRoI_Eff_Pt_TGC_Charge;Offline muon pT [GeV];Efficiency', + cutmask='muon_l1passThr1',type='TEfficiency',path=trigPath,xbins=50,xmin=0,xmax=50) + myGroup.defineHistogram('roi_eta,roi_phi;MuonRoI_EtaVsPhi_Charge_Positive',type='TH2F', + title='MuonRoI Eta vs Phi Charge Positive;MuonRoI Eta;MuonRoI Phi',cutmask='roi_posCharge',path=trigPath, + xbins=100,xmin=-2.5,xmax=2.5,ybins=48,ymin=-math.pi,ymax=math.pi) + myGroup.defineHistogram('roi_eta,roi_phi;MuonRoI_EtaVsPhi_Charge_Negative',type='TH2F', + title='MuonRoI Eta vs Phi Charge Negative;MuonRoI Eta;MuonRoI Phi',cutmask='roi_negCharge',path=trigPath, + xbins=100,xmin=-2.5,xmax=2.5,ybins=48,ymin=-math.pi,ymax=math.pi) + myGroup.defineHistogram('roi_thr,roi_charge;MuonRoI_ThrVsCharge',type='TH2F', + title='MuonRoI Thr vs Charge;MuonRoI Thresholds;MuonRoI Charge',cutmask='roi_tgc',path=trigPath, + xbins=20,xmin=-0.5,xmax=19.5,ybins=3,ymin=-1.5,ymax=1.5) + + myGroup.defineHistogram('roi_bw3coin;MuonRoI_BW3Coin',title='MuonRoI BW3Coin Flag;BW3Coin Flag;Number of events', + cutmask='roi_tgc',path=trigPath,xbins=2,xmin=-0.5,xmax=1.5) + myGroup.defineHistogram('muon_l1passBW3Coin,muon_eta4gev,muon_phi4gev;MuonRoI_Eff_EtaVsPhi_BW3Coin',title='MuonRoI_Eff_EtaVsPhi_BW3Coin;Offline muon eta; Offline muon phi', + cutmask='muon_l1passThr1',type='TEfficiency',path=trigPath,xbins=100,xmin=-2.5,xmax=2.5,ybins=48,ymin=-math.pi,ymax=math.pi) + myGroup.defineHistogram('muon_l1passBW3Coin,muon_pt_tgc;MuonRoI_Eff_Pt_TGC_BW3Coin',title='MuonRoI_Eff_Pt_TGC_BW3Coin;Offline muon pT [GeV];Efficiency', + cutmask='muon_l1passThr1',type='TEfficiency',path=trigPath,xbins=50,xmin=0,xmax=50) + myGroup.defineHistogram('roi_eta,roi_phi;MuonRoI_EtaVsPhi_BW3Coin',type='TH2F', + title='MuonRoI Eta vs Phi BW3Coin;MuonRoI Eta;MuonRoI Phi',cutmask='roi_bw3coin',path=trigPath, + xbins=100,xmin=-2.5,xmax=2.5,ybins=48,ymin=-math.pi,ymax=math.pi) + myGroup.defineHistogram('roi_thr,roi_bw3coin;MuonRoI_ThrVsBW3Coin',type='TH2F', + title='MuonRoI Thr vs BW3Coin;MuonRoI Thresholds;MuonRoI BW3Coin',cutmask='roi_tgc',path=trigPath, + xbins=20,xmin=-0.5,xmax=19.5,ybins=2,ymin=-0.5,ymax=1.5) + + myGroup.defineHistogram('roi_inncoin;MuonRoI_InnerCoin',title='MuonRoI InnerCoin Flag;InnerCoin Flag;Number of events', + cutmask='roi_tgc',path=trigPath,xbins=2,xmin=-0.5,xmax=1.5) + myGroup.defineHistogram('muon_l1passInnerCoin,muon_eta4gev,muon_phi4gev;MuonRoI_Eff_EtaVsPhi_InnerCoin',title='MuonRoI_Eff_EtaVsPhi_InnerCoin;Offline muon eta; Offline muon phi', + cutmask='muon_l1passThr1',type='TEfficiency',path=trigPath,xbins=100,xmin=-2.5,xmax=2.5,ybins=48,ymin=-math.pi,ymax=math.pi) + myGroup.defineHistogram('muon_l1passInnerCoin,muon_pt_tgc;MuonRoI_Eff_Pt_TGC_InnerCoin',title='MuonRoI_Eff_Pt_TGC_InnerCoin;Offline muon pT [GeV];Efficiency', + cutmask='muon_l1passThr1',type='TEfficiency',path=trigPath,xbins=50,xmin=0,xmax=50) + myGroup.defineHistogram('roi_eta,roi_phi;MuonRoI_EtaVsPhi_InnerCoin',type='TH2F', + title='MuonRoI Eta vs Phi InnerCoin;MuonRoI Eta;MuonRoI Phi',cutmask='roi_inncoin',path=trigPath, + xbins=100,xmin=-2.5,xmax=2.5,ybins=48,ymin=-math.pi,ymax=math.pi) + myGroup.defineHistogram('roi_thr,roi_inncoin;MuonRoI_ThrVsInnerCoin',type='TH2F', + title='MuonRoI Thr vs InnerCoin;MuonRoI Thresholds;MuonRoI InnerCoin',cutmask='roi_tgc',path=trigPath, + xbins=20,xmin=-0.5,xmax=19.5,ybins=2,ymin=-0.5,ymax=1.5) + + myGroup.defineHistogram('roi_innveto;MuonRoI_InnerCoinVeto',title='MuonRoI InnerCoinVeto Flag;InnerCoinVeto Flag;Number of events', + cutmask='roi_tgc',path=trigPath,xbins=2,xmin=-0.5,xmax=1.5) + myGroup.defineHistogram('muon_l1passInnerCoinVeto,muon_eta4gev,muon_phi4gev;MuonRoI_Eff_EtaVsPhi_InnerCoinVeto',title='MuonRoI_Eff_EtaVsPhi_InnerCoinVeto;Offline muon eta; Offline muon phi', + cutmask='muon_l1passThr1',type='TEfficiency',path=trigPath,xbins=100,xmin=-2.5,xmax=2.5,ybins=48,ymin=-math.pi,ymax=math.pi) + myGroup.defineHistogram('muon_l1passInnerCoinVeto,muon_pt_tgc;MuonRoI_Eff_Pt_TGC_InnerCoinVeto',title='MuonRoI_Eff_Pt_TGC_InnerCoinVeto;Offline muon pT [GeV];Efficiency', + cutmask='muon_l1passThr1',type='TEfficiency',path=trigPath,xbins=50,xmin=0,xmax=50) + myGroup.defineHistogram('roi_eta,roi_phi;MuonRoI_EtaVsPhi_InnerCoinVeto',type='TH2F', + title='MuonRoI Eta vs Phi InnerCoinVeto;MuonRoI Eta;MuonRoI Phi',cutmask='roi_innveto',path=trigPath, + xbins=100,xmin=-2.5,xmax=2.5,ybins=48,ymin=-math.pi,ymax=math.pi) + myGroup.defineHistogram('roi_thr,roi_innveto;MuonRoI_ThrVsInnerCoinVeto',type='TH2F', + title='MuonRoI Thr vs InnerCoinVeto;MuonRoI Thresholds;MuonRoI InnerCoinVeto',cutmask='roi_tgc',path=trigPath, + xbins=20,xmin=-0.5,xmax=19.5,ybins=2,ymin=-0.5,ymax=1.5) + + myGroup.defineHistogram('roi_goodmf;MuonRoI_GoodMF',title='MuonRoI GoodMF Flag;GoodMF Flag;Number of events', + cutmask='roi_tgc',path=trigPath,xbins=2,xmin=-0.5,xmax=1.5) + myGroup.defineHistogram('roi_eta,roi_phi;MuonRoI_EtaVsPhi_GoodMF',type='TH2F', + title='MuonRoI Eta vs Phi GoodMF;MuonRoI Eta;MuonRoI Phi',cutmask='roi_goodmf',path=trigPath, + xbins=100,xmin=-2.5,xmax=2.5,ybins=48,ymin=-math.pi,ymax=math.pi) + myGroup.defineHistogram('roi_thr,roi_goodmf;MuonRoI_ThrVsGoodMF',type='TH2F', + title='MuonRoI Thr vs GoodMF;MuonRoI Thresholds;MuonRoI GoodMF',cutmask='roi_tgc',path=trigPath, + xbins=20,xmin=-0.5,xmax=19.5,ybins=2,ymin=-0.5,ymax=1.5) + + myGroup.defineHistogram('roi_badmf;MuonRoI_BadMF',title='MuonRoI BadMF Flag;BadMF Flag;Number of events', + cutmask='roi_tgc',path=trigPath,xbins=2,xmin=-0.5,xmax=1.5) + myGroup.defineHistogram('roi_eta,roi_phi;MuonRoI_EtaVsPhi_BadMF',type='TH2F', + title='MuonRoI Eta vs Phi BadMF;MuonRoI Eta;MuonRoI Phi',cutmask='roi_badmf',path=trigPath, + xbins=100,xmin=-2.5,xmax=2.5,ybins=48,ymin=-math.pi,ymax=math.pi) + myGroup.defineHistogram('roi_thr,roi_badmf;MuonRoI_ThrVsBadMF',type='TH2F', + title='MuonRoI Thr vs BadMF;MuonRoI Thresholds;MuonRoI BadMF',cutmask='roi_tgc',path=trigPath, + xbins=20,xmin=-0.5,xmax=19.5,ybins=2,ymin=-0.5,ymax=1.5) + + myGroup.defineHistogram('roi_ismorecand;MuonRoI_isMoreCandInRoI',title='MuonRoI isMoreCandInRoI Flag;isMoreCandInRoI Flag;Number of events', + cutmask='roi_rpc',path=trigPath,xbins=2,xmin=-0.5,xmax=1.5) + myGroup.defineHistogram('roi_eta,roi_phi;MuonRoI_EtaVsPhi_IsMoreCandInRoI',type='TH2F', + title='MuonRoI Eta vs Phi IsMoreCandInRoI;MuonRoI Eta;MuonRoI Phi',cutmask='roi_ismorecand',path=trigPath, + xbins=100,xmin=-2.5,xmax=2.5,ybins=48,ymin=-math.pi,ymax=math.pi) + myGroup.defineHistogram('roi_thr,roi_ismorecand;MuonRoI_ThrVsIsMoreCandInRoI',type='TH2F', + title='MuonRoI Thr vs IsMoreCandInRoI;MuonRoI Thresholds;MuonRoI IsMoreCandInRoI',cutmask='roi_rpc',path=trigPath, + xbins=20,xmin=-0.5,xmax=19.5,ybins=2,ymin=-0.5,ymax=1.5) + myGroup.defineHistogram('roi_thr;MuonRoI_Thresholds_RPC',title='MuonRoI Thresholds RPC;MuonRoI Threshold number;Number of events', cutmask='roi_rpc',path=trigPath,xbins=20,xmin=-0.5,xmax=19.5) myGroup.defineHistogram('roi_thr;MuonRoI_Thresholds_TGC',title='MuonRoI Thresholds TGC;MuonRoI Threshold number;Number of events', cutmask='roi_tgc',path=trigPath,xbins=20,xmin=-0.5,xmax=19.5) - myGroup.defineHistogram('lb,roi_phi_barrel;MuonRoI_PhiVsLB_Barrel_sideA',title='MuonRoI PhiVsLB Barrel sideA;Luminosity block;Trigger sector',type='TH2F', + myGroup.defineHistogram('roi_lumiBlock,roi_phi_barrel;MuonRoI_PhiVsLB_Barrel_sideA',title='MuonRoI PhiVsLB Barrel sideA;Luminosity block;Trigger sector',type='TH2F', cutmask='roi_sideA',path=trigPath,xbins=100,xmin=-0.5,xmax=99.5,ybins=8,ymin=-math.pi,ymax=math.pi,opt='kAddBinsDynamically') - myGroup.defineHistogram('lb,roi_phi_barrel;MuonRoI_PhiVsLB_Barrel_sideC',title='MuonRoI PhiVsLB Barrel sideC;Luminosity block;Trigger sector',type='TH2F', + myGroup.defineHistogram('roi_lumiBlock,roi_phi_barrel;MuonRoI_PhiVsLB_Barrel_sideC',title='MuonRoI PhiVsLB Barrel sideC;Luminosity block;Trigger sector',type='TH2F', cutmask='roi_sideC',path=trigPath,xbins=100,xmin=-0.5,xmax=99.5,ybins=8,ymin=-math.pi,ymax=math.pi,opt='kAddBinsDynamically') - myGroup.defineHistogram('lb,roi_phi_endcap;MuonRoI_PhiVsLB_Endcap_sideA',title='MuonRoI PhiVsLB Endcap sideA;Luminosity block;Trigger sector',type='TH2F', + myGroup.defineHistogram('roi_lumiBlock,roi_phi_endcap;MuonRoI_PhiVsLB_Endcap_sideA',title='MuonRoI PhiVsLB Endcap sideA;Luminosity block;Trigger sector',type='TH2F', cutmask='roi_sideA',path=trigPath,xbins=100,xmin=-0.5,xmax=99.5,ybins=48,ymin=-math.pi,ymax=math.pi,opt='kAddBinsDynamically') - myGroup.defineHistogram('lb,roi_phi_endcap;MuonRoI_PhiVsLB_Endcap_sideC',title='MuonRoI PhiVsLB Endcap sideC;Luminosity block;Trigger sector',type='TH2F', + myGroup.defineHistogram('roi_lumiBlock,roi_phi_endcap;MuonRoI_PhiVsLB_Endcap_sideC',title='MuonRoI PhiVsLB Endcap sideC;Luminosity block;Trigger sector',type='TH2F', cutmask='roi_sideC',path=trigPath,xbins=100,xmin=-0.5,xmax=99.5,ybins=48,ymin=-math.pi,ymax=math.pi,opt='kAddBinsDynamically') - myGroup.defineHistogram('lb,roi_phi_forward;MuonRoI_PhiVsLB_Forward_sideA',title='MuonRoI PhiVsLB Forward sideA;Luminosity block;Trigger sector',type='TH2F', + myGroup.defineHistogram('roi_lumiBlock,roi_phi_forward;MuonRoI_PhiVsLB_Forward_sideA',title='MuonRoI PhiVsLB Forward sideA;Luminosity block;Trigger sector',type='TH2F', cutmask='roi_sideA',path=trigPath,xbins=100,xmin=-0.5,xmax=99.5,ybins=24,ymin=-math.pi,ymax=math.pi,opt='kAddBinsDynamically') - myGroup.defineHistogram('lb,roi_phi_forward;MuonRoI_PhiVsLB_Forward_sideC',title='MuonRoI PhiVsLB Forward sideC;Luminosity block;Trigger sector',type='TH2F', + myGroup.defineHistogram('roi_lumiBlock,roi_phi_forward;MuonRoI_PhiVsLB_Forward_sideC',title='MuonRoI PhiVsLB Forward sideC;Luminosity block;Trigger sector',type='TH2F', cutmask='roi_sideC',path=trigPath,xbins=100,xmin=-0.5,xmax=99.5,ybins=24,ymin=-math.pi,ymax=math.pi,opt='kAddBinsDynamically') + for n in range(1,16): myGroup.defineHistogram('roi_eta;MuonRoI_Eta_Thr'+str(n),title='MuonRoI Eta Thr'+str(n)+';MuonRoI Eta;Number of events', @@ -286,8 +369,7 @@ if __name__=='__main__': from AthenaConfiguration.AllConfigFlags import ConfigFlags import glob - # inputs = glob.glob('/data03/mySamples/run_mc_zmumu/*/tmp.ESD') - inputs = glob.glob('/data02/data/mc16_13TeV.361107.PowhegPythia8EvtGen_AZNLOCTEQ6L1_Zmumu.recon.ESD.e3601_s3334_r9857_test2/*') + inputs = glob.glob('/data01/L1MuonSimulation/aaron/runs3_zmumu/*/AOD.pool.root') ConfigFlags.Input.Files = inputs ConfigFlags.Input.isMC = True diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/TgcRawDataMonitoring/src/TgcRawDataMonitorAlgorithm.cxx b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/TgcRawDataMonitoring/src/TgcRawDataMonitorAlgorithm.cxx index 3748de9878fd575ad8c6441b3ecfc46805bf9440..d8c61ba623242080f92140849c73221563680ba6 100644 --- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/TgcRawDataMonitoring/src/TgcRawDataMonitorAlgorithm.cxx +++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/TgcRawDataMonitoring/src/TgcRawDataMonitorAlgorithm.cxx @@ -11,6 +11,7 @@ namespace { constexpr float pt_30_cut = 30. * Gaudi::Units::GeV; constexpr float pt_15_cut = 15. * Gaudi::Units::GeV; constexpr float pt_10_cut = 10. * Gaudi::Units::GeV; + constexpr float pt_4_cut = 4. * Gaudi::Units::GeV; /// End of the barrel region constexpr float barrel_end = 1.05; @@ -66,14 +67,12 @@ StatusCode TgcRawDataMonitorAlgorithm::fillHistograms(const EventContext &ctx) c auto bcid = Monitored::Scalar<int>("bcid", GetEventInfo(ctx)->bcid()); - auto lumiPerBCID = Monitored::Scalar<int>("lumiPerBCID", lbAverageInteractionsPerCrossing(ctx)); - auto lb = Monitored::Scalar<int>("lb", GetEventInfo(ctx)->lumiBlock()); - auto run = Monitored::Scalar<int>("run", GetEventInfo(ctx)->runNumber()); + auto pileup = Monitored::Scalar<int>("pileup", lbAverageInteractionsPerCrossing(ctx)); + auto lumiBlock = Monitored::Scalar<int>("lumiBlock", GetEventInfo(ctx)->lumiBlock()); variables.push_back(bcid); - variables.push_back(lumiPerBCID); - variables.push_back(lb); - variables.push_back(run); + variables.push_back(pileup); + variables.push_back(lumiBlock); if (!m_anaMuonRoI.value()) { fill(m_packageName, variables); @@ -97,11 +96,16 @@ StatusCode TgcRawDataMonitorAlgorithm::fillHistograms(const EventContext &ctx) c } MonVariables roi_variables; + auto roi_bcid = Monitored::Scalar<int>("roi_bcid", GetEventInfo(ctx)->bcid()); + roi_variables.push_back(roi_bcid); + auto roi_pileup = Monitored::Scalar<int>("roi_pileup", lbAverageInteractionsPerCrossing(ctx)); + roi_variables.push_back(roi_pileup); + auto roi_lumiBlock = Monitored::Scalar<int>("roi_lumiBlock", GetEventInfo(ctx)->lumiBlock()); + roi_variables.push_back(roi_lumiBlock); auto roi_eta = Monitored::Collection("roi_eta", *rois, [](const xAOD::MuonRoI *m) { return m->eta(); }); roi_variables.push_back(roi_eta); - auto roi_phi = Monitored::Collection("roi_phi", *rois, [](const xAOD::MuonRoI *m) { return m->phi(); }); @@ -113,7 +117,7 @@ StatusCode TgcRawDataMonitorAlgorithm::fillHistograms(const EventContext &ctx) c auto roi_phi_tgc = Monitored::Collection("roi_phi_tgc", *rois, [](const xAOD::MuonRoI *m) { return (m->getSource() != xAOD::MuonRoI::Barrel) ? m->phi() : -10; }); - variables.push_back(roi_phi_tgc); + roi_variables.push_back(roi_phi_tgc); auto roi_thr = Monitored::Collection("roi_thr", *rois, [](const xAOD::MuonRoI *m) { return m->getThrNumber(); }); @@ -126,7 +130,6 @@ StatusCode TgcRawDataMonitorAlgorithm::fillHistograms(const EventContext &ctx) c return m->getSource() != xAOD::MuonRoI::Barrel; }); roi_variables.push_back(roi_tgc); - auto roi_barrel = Monitored::Collection("roi_barrel", *rois, [](const xAOD::MuonRoI *m) { return m->getSource() == xAOD::MuonRoI::Barrel; }); @@ -139,7 +142,6 @@ StatusCode TgcRawDataMonitorAlgorithm::fillHistograms(const EventContext &ctx) c return m->getSource() == xAOD::MuonRoI::Forward; }); roi_variables.push_back(roi_forward); - auto roi_phi_barrel = Monitored::Collection("roi_phi_barrel", *rois, [](const xAOD::MuonRoI *m) { return (m->getSource() == xAOD::MuonRoI::Barrel) ? m->phi() : -10; }); @@ -152,7 +154,6 @@ StatusCode TgcRawDataMonitorAlgorithm::fillHistograms(const EventContext &ctx) c return (m->getSource() == xAOD::MuonRoI::Forward) ? m->phi() : -10; }); roi_variables.push_back(roi_phi_forward); - auto roi_sideA = Monitored::Collection("roi_sideA", *rois, [](const xAOD::MuonRoI *m) { return m->getHemisphere() == xAOD::MuonRoI::Positive; }); @@ -161,7 +162,6 @@ StatusCode TgcRawDataMonitorAlgorithm::fillHistograms(const EventContext &ctx) c return m->getHemisphere() == xAOD::MuonRoI::Negative; }); roi_variables.push_back(roi_sideC); - auto thrmask1 = Monitored::Collection("thrmask1", *rois, [](const xAOD::MuonRoI *m) { return m->getThrNumber() == 1; }); @@ -222,6 +222,42 @@ StatusCode TgcRawDataMonitorAlgorithm::fillHistograms(const EventContext &ctx) c return m->getThrNumber() == 15; }); roi_variables.push_back(thrmask15); + auto roi_charge = Monitored::Collection("roi_charge", *rois, [](const xAOD::MuonRoI* m) { + return (m->getCharge()==xAOD::MuonRoI::Neg)?(-1):((m->getCharge()==xAOD::MuonRoI::Pos)?(+1):(0)); + }); + roi_variables.push_back(roi_charge); + auto roi_bw3coin = Monitored::Collection("roi_bw3coin",*rois,[](const xAOD::MuonRoI* m) { + return m->getBW3Coincidence(); + }); + roi_variables.push_back(roi_bw3coin); + auto roi_inncoin = Monitored::Collection("roi_inncoin",*rois,[](const xAOD::MuonRoI* m) { + return m->getInnerCoincidence(); + }); + roi_variables.push_back(roi_inncoin); + auto roi_innveto = Monitored::Collection("roi_innveto",*rois,[](const xAOD::MuonRoI* m) { + return !m->getInnerCoincidence() && m->getSource()!=xAOD::MuonRoI::Barrel; + }); + roi_variables.push_back(roi_innveto); + auto roi_goodmf = Monitored::Collection("roi_goodmf",*rois,[](const xAOD::MuonRoI* m) { + return m->getGoodMF(); + }); + roi_variables.push_back(roi_goodmf); + auto roi_badmf = Monitored::Collection("roi_badmf",*rois,[](const xAOD::MuonRoI* m){ + return !m->getGoodMF() && m->getSource()!=xAOD::MuonRoI::Barrel; + }); + roi_variables.push_back(roi_badmf); + auto roi_ismorecand = Monitored::Collection("roi_ismorecand",*rois,[](const xAOD::MuonRoI* m){ + return m->isMoreCandInRoI(); + }); + roi_variables.push_back(roi_ismorecand); + auto roi_posCharge = Monitored::Collection("roi_posCharge",*rois,[](const xAOD::MuonRoI* m){ + return m->getCharge()==xAOD::MuonRoI::Pos; + }); + roi_variables.push_back(roi_posCharge); + auto roi_negCharge = Monitored::Collection("roi_negCharge",*rois,[](const xAOD::MuonRoI* m){ + return m->getCharge()==xAOD::MuonRoI::Neg; + }); + roi_variables.push_back(roi_negCharge); fill(m_packageName, roi_variables); } if (!m_anaOfflMuon.value()) { @@ -237,104 +273,122 @@ StatusCode TgcRawDataMonitorAlgorithm::fillHistograms(const EventContext &ctx) c std::vector < MyMuon > mymuons; for (const auto muon : *muons) { - if (muon->muonType() != xAOD::Muon::Combined) continue; - if (muon->author() != xAOD::Muon::MuidCo && muon->author() != xAOD::Muon::STACO) continue; - if (muon->quality() != xAOD::Muon::Tight && muon->quality() != xAOD::Muon::Medium) continue; + if (muon->muonType() != xAOD::Muon::Combined) continue; + if (muon->author() != xAOD::Muon::MuidCo && muon->author() != xAOD::Muon::STACO) continue; + if (muon->quality() != xAOD::Muon::Tight && muon->quality() != xAOD::Muon::Medium) continue; - MyMuon mymuon; - /* fill basic info */ - mymuon.muon = muon; - mymuon.fourvec.SetPtEtaPhiM(muon->pt(), muon->eta(), muon->phi(), m_muonMass.value()); - /* fill tag of tag-and-probe info */ - mymuon.tagged = triggerMatching(muon, m_trigTagDefs); - /* fill info of isolation among muons */ - mymuon.isolated = true; - mymuon.probeOK = false; - if (!m_TagAndProbe.value()) mymuon.probeOK = true; - for (const auto muon2 : *muons) { - if (muon == muon2) continue; - if (muon2->muonType() != xAOD::Muon::Combined) continue; - if (muon2->author() != xAOD::Muon::MuidCo && muon2->author() != xAOD::Muon::STACO) continue; - if (muon2->quality() != xAOD::Muon::Tight && muon2->quality() != xAOD::Muon::Medium) continue; - if (!triggerMatching(muon2, m_trigTagDefs)) continue; - - TLorentzVector muonvec2; - muonvec2.SetPtEtaPhiM(muon2->pt(), muon2->eta(), muon2->phi(), m_muonMass.value()); - float dr = muonvec2.DeltaR(mymuon.fourvec); - if (dr < m_isolationWindow.value()) { - mymuon.isolated = false; - } - if (!m_TagAndProbeZmumu.value()) { - mymuon.probeOK = true; - } else { - if (muon->charge() == muon2->charge()) continue; - double dimuon_mass = (muonvec2 + mymuon.fourvec).M(); - if (std::abs(dimuon_mass - m_zMass.value()) > m_zMassWindow.value()) continue; - mymuon.probeOK = true; - } - break; - } - /* fill extrapolation info (only to TGC) */ - extrapolate(muon, mymuon); - /* L1Muon RoI matching */ - float max_dr = 999; - const float pt = mymuon.muon->pt(); + TLorentzVector muonvec; + muonvec.SetPtEtaPhiM(muon->pt(),muon->eta(),muon->phi(),m_muonMass.value()); + bool isolated = true; + bool probeOK = false; + for(const auto muon2 : *muons){ + // skip the same muon candidate + if( muon == muon2 )continue; + // check muon isolation + TLorentzVector muonvec2; + muonvec2.SetPtEtaPhiM(muon2->pt(),muon2->eta(),muon2->phi(),m_muonMass.value()); + float dr = muonvec2.DeltaR( muonvec ); + if( dr < m_isolationWindow.value() ){ + isolated = false; + } + // check tag-and-probe condition + if( muon2->muonType()!=xAOD::Muon::Combined )continue; + if( muon2->author()!=xAOD::Muon::MuidCo && muon2->author()!=xAOD::Muon::STACO )continue; + if( muon2->quality()!=xAOD::Muon::Tight && muon2->quality()!=xAOD::Muon::Medium )continue; + if( !triggerMatching(muon2,m_trigTagDefs) )continue; + if(!m_TagAndProbeZmumu.value()){ + probeOK=true; + }else{ + if( muon->charge() == muon2->charge() )continue; + double dimuon_mass = (muonvec + muonvec2).M(); + if(std::abs( dimuon_mass - m_zMass.value()) > m_zMassWindow.value() )continue; + probeOK=true; + } + } + if(m_requireIsolated.value() && !isolated)continue; + if(m_TagAndProbe.value() && !probeOK)continue; - if (pt > pt_15_cut) max_dr = m_l1trigMatchWindow1.value(); - else if (pt > pt_10_cut) max_dr = m_l1trigMatchWindow2.value() + m_l1trigMatchWindow3.value() * pt / Gaudi::Units::GeV; - else max_dr = m_l1trigMatchWindow4.value() + m_l1trigMatchWindow5.value() * pt / Gaudi::Units::GeV; - - if (!rois) { - ATH_MSG_DEBUG("No RoI matching possible as no container has been retrieved"); - mymuons.push_back(mymuon); - continue; - } - for (const auto roi : *rois) { - TLorentzVector roivec; - roivec.SetPtEtaPhiM(1, roi->eta(), roi->phi(), 1); - float dr = roivec.DeltaR(mymuon.fourvec); - if (dr < max_dr) { - mymuon.matchedL1ThrExclusive.insert(roi->getThrNumber()); - } - } - const bool L1ThrsEmpt = mymuon.matchedL1ThrExclusive.empty(); - for (int ithr = 0; ithr < 16 && !L1ThrsEmpt; ++ithr) { - bool pass = false; - for (const auto &thr : mymuon.matchedL1ThrExclusive) { - if (thr >= ithr) { - pass = true; - break; - } - } - if (pass) mymuon.matchedL1ThrInclusive.insert(ithr); - } + MyMuon mymuon; + /* fill basic info */ + mymuon.muon = muon; + /* fill extrapolation info (only to TGC) */ + extrapolate( muon, mymuon ); + /* L1Muon RoI matching */ + mymuon.matchedL1Charge=false; + mymuon.passBW3Coin=false; + mymuon.passInnerCoin=false; + mymuon.passGoodMF=false; + mymuon.passIsMoreCandInRoI=false; + float max_dr = 999; + float pt = mymuon.muon->pt(); + if (pt > pt_15_cut) max_dr = m_l1trigMatchWindow1.value(); + else if (pt > pt_10_cut) max_dr = m_l1trigMatchWindow2.value() + m_l1trigMatchWindow3.value() * pt / Gaudi::Units::GeV; + else max_dr = m_l1trigMatchWindow4.value() + m_l1trigMatchWindow5.value() * pt / Gaudi::Units::GeV; + if (!rois) { + ATH_MSG_DEBUG("No RoI matching possible as no container has been retrieved"); + mymuons.push_back(mymuon); + continue; + } + for(const auto roi : *rois){ + TLorentzVector roivec; + roivec.SetPtEtaPhiM(1,roi->eta(),roi->phi(),1); + double dr = roivec.DeltaR( muonvec ); + if( dr < max_dr ){ + mymuon.matchedL1ThrExclusive.insert( roi->getThrNumber() ); + if(muon->charge()<0 && roi->getCharge()==xAOD::MuonRoI::Neg)mymuon.matchedL1Charge|=true; + else if(muon->charge()>0 && roi->getCharge()==xAOD::MuonRoI::Pos)mymuon.matchedL1Charge|=true; + mymuon.passBW3Coin|=roi->getBW3Coincidence(); + mymuon.passInnerCoin|=roi->getInnerCoincidence(); + mymuon.passGoodMF|=roi->getGoodMF(); + mymuon.passIsMoreCandInRoI|=roi->isMoreCandInRoI(); + } + } + const bool L1ThrsEmpt = mymuon.matchedL1ThrExclusive.empty(); + for (int ithr = 0; ithr < 16 && !L1ThrsEmpt; ++ithr) { + bool pass = false; + for (const auto &thr : mymuon.matchedL1ThrExclusive) { + if (thr >= ithr) { + pass = true; + break; + } + } + if (pass) mymuon.matchedL1ThrInclusive.insert(ithr); + } - /* store MyMuon */ - mymuons.push_back(mymuon); + /* store MyMuon */ + mymuons.push_back(mymuon); } + auto muon_eta4gev = Monitored::Collection("muon_eta4gev",mymuons,[](const MyMuon& m){ + return (m.muon->pt()>pt_4_cut)?m.muon->eta():-10; + }); + variables.push_back(muon_eta4gev); + auto muon_phi4gev = Monitored::Collection("muon_phi4gev",mymuons,[](const MyMuon& m){ + return (m.muon->pt()>pt_4_cut)?m.muon->phi():-10; + }); + variables.push_back(muon_phi4gev); auto muon_eta = Monitored::Collection("muon_eta", mymuons, [](const MyMuon &m) { - return (m.probeOK && m.muon->pt() > pt_30_cut) ? m.muon->eta() : -10; + return (m.muon->pt() > pt_30_cut) ? m.muon->eta() : -10; }); variables.push_back(muon_eta); auto muon_phi = Monitored::Collection("muon_phi", mymuons, [](const MyMuon &m) { - return (m.probeOK && m.muon->pt() > pt_30_cut) ? m.muon->phi() : -10; + return (m.muon->pt() > pt_30_cut) ? m.muon->phi() : -10; }); variables.push_back(muon_phi); auto muon_phi_rpc = Monitored::Collection("muon_phi_rpc", mymuons, [](const MyMuon &m) { - return (m.probeOK && std::abs(m.muon->eta()) < barrel_end && m.muon->pt() > pt_30_cut) ? m.muon->phi() : -10; + return (std::abs(m.muon->eta()) < barrel_end && m.muon->pt() > pt_30_cut) ? m.muon->phi() : -10; }); variables.push_back(muon_phi_rpc); auto muon_phi_tgc = Monitored::Collection("muon_phi_tgc", mymuons, [](const MyMuon &m) { - return (m.probeOK && std::abs(m.muon->eta()) > barrel_end && std::abs(m.muon->eta()) < trigger_end && m.muon->pt() > pt_30_cut) ? m.muon->phi() : -10; + return (std::abs(m.muon->eta()) > barrel_end && std::abs(m.muon->eta()) < trigger_end && m.muon->pt() > pt_30_cut) ? m.muon->phi() : -10; }); variables.push_back(muon_phi_tgc); auto muon_pt_rpc = Monitored::Collection("muon_pt_rpc", mymuons, [](const MyMuon &m) { - return (m.probeOK && std::abs(m.muon->eta()) < barrel_end) ? m.muon->pt() / Gaudi::Units::GeV : -10; + return (std::abs(m.muon->eta()) < barrel_end) ? m.muon->pt() / Gaudi::Units::GeV : -10; }); variables.push_back(muon_pt_rpc); auto muon_pt_tgc = Monitored::Collection("muon_pt_tgc", mymuons, [](const MyMuon &m) { - return (m.probeOK && std::abs(m.muon->eta()) > barrel_end && std::abs(m.muon->eta()) < trigger_end) ? m.muon->pt() / Gaudi::Units::GeV : -10; + return (std::abs(m.muon->eta()) > barrel_end && std::abs(m.muon->eta()) < trigger_end) ? m.muon->pt() / Gaudi::Units::GeV : -10; }); variables.push_back(muon_pt_tgc); auto muon_l1passThr1 = Monitored::Collection("muon_l1passThr1", mymuons, [](const MyMuon &m) { @@ -397,6 +451,34 @@ StatusCode TgcRawDataMonitorAlgorithm::fillHistograms(const EventContext &ctx) c return m.matchedL1ThrInclusive.find(15) != m.matchedL1ThrInclusive.end(); }); variables.push_back(muon_l1passThr15); + auto muon_l1passCharge = Monitored::Collection("muon_l1passCharge",mymuons,[](const MyMuon& m){ + return m.matchedL1Charge; + }); + variables.push_back(muon_l1passCharge); + auto muon_l1passBW3Coin = Monitored::Collection("muon_l1passBW3Coin",mymuons,[](const MyMuon& m){ + return m.passBW3Coin; + }); + variables.push_back(muon_l1passBW3Coin); + auto muon_l1passInnerCoin = Monitored::Collection("muon_l1passInnerCoin",mymuons,[](const MyMuon& m){ + return m.passInnerCoin; + }); + variables.push_back(muon_l1passInnerCoin); + auto muon_l1passInnerCoinVeto = Monitored::Collection("muon_l1passInnerCoinVeto",mymuons,[](const MyMuon& m){ + return !m.passInnerCoin; + }); + variables.push_back(muon_l1passInnerCoinVeto); + auto muon_l1passGoodMF = Monitored::Collection("muon_l1passGoodMF",mymuons,[](const MyMuon& m){ + return m.passGoodMF; + }); + variables.push_back(muon_l1passGoodMF); + auto muon_l1passBadMF = Monitored::Collection("muon_l1passBadMF",mymuons,[](const MyMuon& m){ + return !m.passGoodMF; + }); + variables.push_back(muon_l1passBadMF); + auto muon_l1passIsMoreCandInRoI = Monitored::Collection("muon_l1passIsMoreCandInRoI",mymuons,[](const MyMuon& m){ + return m.passIsMoreCandInRoI; + }); + variables.push_back(muon_l1passIsMoreCandInRoI); if (!m_anaTgcPrd.value()) { fill(m_packageName, variables); diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/TgcRawDataMonitoring/src/TgcRawDataMonitorAlgorithm.h b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/TgcRawDataMonitoring/src/TgcRawDataMonitorAlgorithm.h index 3eb6ac62cae4ebfb9ac4ac1771d9410078b7027a..65a4c12c31d36cb44351bad3491221aa86feb716 100644 --- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/TgcRawDataMonitoring/src/TgcRawDataMonitorAlgorithm.h +++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/TgcRawDataMonitoring/src/TgcRawDataMonitorAlgorithm.h @@ -30,19 +30,17 @@ class TgcRawDataMonitorAlgorithm : public AthMonitorAlgorithm { }; struct MyMuon{ const xAOD::Muon* muon; - TLorentzVector fourvec; std::vector<double> extPosZ; std::vector<TVector3> extPos; std::vector<TVector3> extVec; - bool tagged; - bool isolated; - bool probeOK_any; - bool probeOK_Z; - bool probeOK; std::set<int> matchedL1ThrExclusive; std::set<int> matchedL1ThrInclusive; + bool matchedL1Charge; + bool passBW3Coin; + bool passInnerCoin; + bool passGoodMF; + bool passIsMoreCandInRoI; }; - struct TgcHit{ float x; float y; @@ -130,6 +128,7 @@ class TgcRawDataMonitorAlgorithm : public AthMonitorAlgorithm { DoubleProperty m_l1trigMatchWindow4{this,"L1TrigMatchingWindow4",0.36,"Window size in R for L1 trigger matching: param 4"}; DoubleProperty m_l1trigMatchWindow5{this,"L1TrigMatchingWindow5",-0.0016,"Window size in R for L1 trigger matching: param 5"}; DoubleProperty m_isolationWindow{this,"IsolationWindow",0.1,"Window size in R for isolation with other muons"}; + BooleanProperty m_requireIsolated{this,"RequireIsolated",true,"Probe muon should be isolated from other muons"}; DoubleProperty m_M1_Z{this,"M1_Z",13605.0,"z-position of TGC M1-station in mm for track extrapolate"}; DoubleProperty m_M2_Z{this,"M2_Z",14860.0,"z-position of TGC M2-station in mm for track extrapolate"}; DoubleProperty m_M3_Z{this,"M3_Z",15280.0,"z-position of TGC M3-station in mm for track extrapolate"};