From 8cad172eb4a2b687ffcfc8f248f21ddb9321ded8 Mon Sep 17 00:00:00 2001 From: Marcello Barisonzi <marcello.barisonzi@cern.ch> Date: Fri, 23 May 2014 18:04:17 +0200 Subject: [PATCH] See ChangeLog (JetTagMonitoring-00-04-06) --- .../JetTagMonitoring/JetTagMonitoring.h | 400 ++++++ .../JetTagMonitoring/cmt/requirements | 54 + .../config/jetTag_collisions_run.config | 75 + .../share/JetTagMonitoring_jobOptions.py | 58 + .../JetTagMonitoring/share/JetTagging_test.cc | 523 +++++++ .../JetTagMonitoring/share/JetTagging_test.py | 174 +++ .../JetTagMonitoring/share/switchMon.py | 47 + .../JetTagMonitoring/src/JetTagMonitoring.cxx | 1201 +++++++++++++++++ .../components/JetTagMonitoring_entries.cxx | 10 + .../src/components/JetTagMonitoring_load.cxx | 3 + 10 files changed, 2545 insertions(+) create mode 100755 PhysicsAnalysis/JetTagging/JetTagMonitoring/JetTagMonitoring/JetTagMonitoring.h create mode 100755 PhysicsAnalysis/JetTagging/JetTagMonitoring/cmt/requirements create mode 100644 PhysicsAnalysis/JetTagging/JetTagMonitoring/config/jetTag_collisions_run.config create mode 100644 PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagMonitoring_jobOptions.py create mode 100644 PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagging_test.cc create mode 100644 PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagging_test.py create mode 100644 PhysicsAnalysis/JetTagging/JetTagMonitoring/share/switchMon.py create mode 100755 PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitoring.cxx create mode 100755 PhysicsAnalysis/JetTagging/JetTagMonitoring/src/components/JetTagMonitoring_entries.cxx create mode 100755 PhysicsAnalysis/JetTagging/JetTagMonitoring/src/components/JetTagMonitoring_load.cxx diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/JetTagMonitoring/JetTagMonitoring.h b/PhysicsAnalysis/JetTagging/JetTagMonitoring/JetTagMonitoring/JetTagMonitoring.h new file mode 100755 index 00000000000..1c313291994 --- /dev/null +++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/JetTagMonitoring/JetTagMonitoring.h @@ -0,0 +1,400 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************* +// +// NAME: JetTagMonitoring.h +// PACKAGE: PhysicsAnalysis/JetTagging/JetTagMonitoring +// +// AUTHOR: Andrea Coccaro +// EMAIL: Andrea.Coccaro@ge.infn.it +// +// ******************************************************* + +#ifndef JETTAGMONITORING_H +#define JETTAGMONITORING_H + +#include <vector> +#include <string> +#include <bitset> + +#include <map> +#include "GaudiKernel/ServiceHandle.h" +#include "GaudiKernel/ToolHandle.h" +#include "ITrackToVertex/ITrackToVertex.h" +#include "AthenaMonitoring/ManagedMonitorToolBase.h" + +#include "InDetConditionsSummaryService/IInDetConditionsSvc.h" + +#include "xAODJet/Jet.h" + +class TH1F_LW; +class TH2F_LW; +class StoreGateSvc; +class RunSummary; +class LWHist; + +namespace Trk { + class VxCandidate; +} +namespace Analysis { + class TrackSelector; +} + +/** + * @brief Class for monitoring variables related to offline flavour tagging. + * + * @author Andrea Coccaro <Andrea.Coccaro@ge.infn.it> + * + * This class answers monitoring needs related to offline flavour tagging: + * + * - btagging variables; + * - jet/tracks related variables; + * - muon/electron related variables; + * - global variables of interest for flavour tagging. + */ + + +class JetTagMonitoring : public ManagedMonitorToolBase { + + friend class RunSummary; + +public: + + JetTagMonitoring(const std::string & type, const std::string & name, const IInterface* parent); + + ~JetTagMonitoring(); + + virtual StatusCode initialize(); + + virtual StatusCode bookHistograms(); + virtual StatusCode fillHistograms(); + virtual StatusCode procHistograms( ); + + +private: + + enum Jet_t { goodJet, badJet, suspectJet }; + + virtual StatusCode registerHist (MonGroup& theGroup, TH1* h1); + virtual StatusCode registerHist (MonGroup& theGroup, LWHist* h1); + + bool applyKinematicCuts(const xAOD::Jet *jet); + Jet_t applyQualityCuts(const xAOD::Jet *jet); + + void fillJetHistograms(); + void fillGoodJetHistos(const xAOD::Jet *jet); + //void fillSuspectJetHistos(const xAOD::Jet *jet); + void fillDetailedHistograms(const xAOD::Jet *jet); + //void fillElectronHistograms(const xAOD::Jet *jet); + //void fillMuonHistograms(const xAOD::Jet *jet); + void fillTrackInJetHistograms(const xAOD::Jet *jet); + void fillBadTrackBits(const std::bitset<16> failedCuts, double eta, double phi); + //void fillBadZone(int zone, double w); + bool isGoodJet(const xAOD::Jet *jet); + + ServiceHandle<StoreGateSvc> m_storeGate; + + + ToolHandle< Analysis::TrackSelector > m_trackSelectorTool; + ToolHandle<Reco::ITrackToVertex> m_trackToVertexTool; + /* ToolHandle<InDet::IInDetTestBLayerTool> m_blayerTool; */ + bool m_histogramsCreated; + + const Trk::VxCandidate* m_priVtx; + + /** @brief String to retrieve JetContainer from StoreGate. */ + std::string m_jetName; + /** @brief String to retrieve TrackParticleContainer from StoreGate. */ + std::string m_trackParticleName; + /** @brief String to retrieve PrimaryVertexContainer from StoreGate. */ + std::string m_primaryVertexName; + /** @brief DQ cuts switcher. */ + bool m_do_cuts; + double m_trk_d0_min_cut; + double m_trk_d0_max_cut; + unsigned int m_pri_vtx_trk_min_cut; + double m_jet_pt_cut; + double m_jet_eta_cut; + unsigned int m_trk_n; + double m_sv0_weight_cut; + double m_sv1_weight_cut; + double m_sv2_weight_cut; + + double m_ip1d_weight_cut; + double m_ip2d_weight_cut; + double m_ip3d_weight_cut; + + double m_sv1ip3d_weight_cut; + double m_jfcnn_weight_cut; + + /* From the twiki: https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/TopCommonObjects#B_tagging + * As a starting point we recommend to use the 70% working point (also for the acceptance and yields challenges) + * This corresponds to a cut at: weight > 0.601713 */ + double m_mv1_weight_cut; + + /** @brief Master kill if no tools found. */ + bool m_switch_off; + + /** @brief Use Analysis::TrackSelector. */ + bool m_use_trackselector; + + /** @brief Use Analysis::TrigDecisionTool. */ + bool m_use_trigdectool; + + + /** @brief To monitor likelihood weight based on transverse impact parameter. */ + TH1F_LW* m_tag_ip1d_w; + /** @brief To monitor likelihood weight based on longitudinal impact parameter. */ + TH1F_LW* m_tag_ip2d_w; + /** @brief To monitor number of tracks used to evaluate IP2D weight. */ + TH1F_LW* m_tag_ip2d_n; + /** @brief To monitor jet likelihood value if coming from b decay for IP2D tagger. */ + TH1F_LW* m_tag_ip2d_b; + /** @brief To monitor jet likelihood value if coming from u decay for IP2D tagger. */ + TH1F_LW* m_tag_ip2d_u; + /** @brief To monitor likelihood weight based on combination of impact parameters. */ + TH1F_LW* m_tag_ip3d_w; + /** @brief To monitor number of tracks used to evaluate IP3D weight. */ + TH1F_LW* m_tag_ip3d_n; + /** @brief To monitor jet likelihood value if coming from b decay for IP3D tagger. */ + TH1F_LW* m_tag_ip3d_b; + /** @brief To monitor jet likelihood value if coming from u decay for IP3D tagger. */ + TH1F_LW* m_tag_ip3d_u; + /** @brief To monitor likelihood weight based on SV0 tagger. */ + TH1F_LW* m_tag_sv0_w; + /** @brief To monitor likelihood weight based on SV1 tagger. */ + TH1F_LW* m_tag_sv1_w; + /** @brief To monitor likelihood weight based on SV2 tagger. */ + TH1F_LW* m_tag_sv2_w; + /** @brief To monitor likelihood weight based on LF2D tagger. */ + TH1F_LW* m_tag_lf2d_w; + /** @brief To monitor likelihood weight based on SVBU tagger. */ + TH1F_LW* m_tag_svbu_w; + /** @brief To monitor likelihood weight based on LHSIG tagger. */ + TH1F_LW* m_tag_lhsig_w; + /** @brief To monitor likelihood weight based on SOFTM tagger. */ + TH1F_LW* m_tag_softm_w; + /** @brief To monitor likelihood weight based on SOFTE tagger. */ + TH1F_LW* m_tag_softe_w; + /** @brief To monitor likelihood weight based on combined tagger (IP3D+SV1). */ + TH1F_LW* m_tag_comb_w; + /** @brief To monitor likelihood weight based on combined tagger JetFitterCOMBNN. */ + TH1F_LW* m_tag_jfcnn_w; + /** @brief To monitor likelihood weight based on combined tagger MV1 (based on IP3D tagging weight, SV1 tagging weight, + * JetFitterCombNN tagging weight, jet pT (in MeV) and jet eta.). + */ + TH1F_LW* m_tag_mv1_w; + /* + TH1F_LW* m_tag_sv0_w_sj; + TH1F_LW* m_tag_comb_w_sj; + TH1F_LW* m_tag_jfcnn_w_sj; + + TH1F_LW* m_tag_sv0_w_DMZ1; + TH1F_LW* m_tag_comb_w_DMZ1; + TH1F_LW* m_tag_jfcnn_w_DMZ1; + TH1F_LW* m_tag_ip3d_w_DMZ1; + + TH1F_LW* m_tag_sv0_w_DMZ2; + TH1F_LW* m_tag_comb_w_DMZ2; + TH1F_LW* m_tag_jfcnn_w_DMZ2; + TH1F_LW* m_tag_ip3d_w_DMZ2; + + TH1F_LW* m_tag_sv0_w_DMZ3; + TH1F_LW* m_tag_comb_w_DMZ3; + TH1F_LW* m_tag_jfcnn_w_DMZ3; + TH1F_LW* m_tag_ip3d_w_DMZ3; + + TH1F_LW* m_tag_ip3d_w_DMZ2_x1; + TH1F_LW* m_tag_ip3d_w_DMZ2_x2; + TH1F_LW* m_tag_ip3d_w_DMZ2_x4; + TH1F_LW* m_tag_ip3d_w_DMZ2_x8; + + TH1F_LW* m_tag_ip3d_w_DMZ3_x1; + TH1F_LW* m_tag_ip3d_w_DMZ3_x2; + TH1F_LW* m_tag_ip3d_w_DMZ3_x4; + TH1F_LW* m_tag_ip3d_w_DMZ3_x8; + */ + + /** @brief To monitor likelihood weight based on TrackCounting tagger. */ + TH1F_LW* m_tag_trkcnt_w; + /** @brief To monitor likelihood weight based on JetProb tagger. */ + TH1F_LW* m_tag_jetprob_w; + + /** @brief To monitor number of Jets. */ + TH1F_LW* m_jet_n; + /** @brief To monitor number of TrackParticles. */ + TH1F_LW* m_trackParticle_n; + + /** @brief To monitor number of primary vertices. */ + TH1F_LW* m_global_nPrimVtx; + /** @brief To monitor x of primary vertex. */ + TH1F_LW* m_global_xPrimVtx; + /** @brief To monitor y of primary vertex. */ + TH1F_LW* m_global_yPrimVtx; + /** @brief To monitor z of primary vertex. */ + TH1F_LW* m_global_zPrimVtx; + + /** @brief To monitor number of b layer hits in TrackParticle. */ + TH1F_LW* m_global_BLayerHits; + /** @brief To monitor number of pixel hits in TrackParticle. */ + TH1F_LW* m_global_PixelHits; + /** @brief To monitor number of SCT hits in TrackParticle. */ + TH1F_LW* m_global_SCTHits; + /** @brief To monitor number of pixel+SCT hits in TrackParticle. */ + TH1F_LW* m_global_SiHits; + /** @brief To monitor number of TRT hits in TrackParticle. */ + TH1F_LW* m_global_TRTHits; + + /** @brief To monitor number of tags of the reconstructed jet. */ + TH1F_LW* m_jet_nTag; + /** @brief To monitor eta of the reconstructed jet. */ + TH1F_LW* m_jet_eta; + /** @brief To monitor phi of the reconstructed jet. */ + TH1F_LW* m_jet_phi; + /** @brief To monitor Et of the reconstructed jet. */ + TH1F_LW* m_jet_et; + + /** @brief To monitor number of tracks in a jet. */ + TH1F_LW* m_jet_tracks_n; + /** @brief To monitor Pt of tracks in a jet. */ + TH1F_LW* m_jet_tracks_pt; + /** @brief To monitor eta of tracks in a jet. */ + TH1F_LW* m_jet_tracks_eta; + /** @brief To monitor phi of tracks in a jet. */ + TH1F_LW* m_jet_tracks_phi; + /** @brief To monitor number of b layer hits in a jet. */ + TH1F_LW* m_jet_tracks_BLayerHits; + /** @brief To monitor number of pixel hits in a jet. */ + TH1F_LW* m_jet_tracks_PixelHits; + /** @brief To monitor number of SCT hits in a jet. */ + TH1F_LW* m_jet_tracks_SCTHits; + /** @brief To monitor number of muons in a jet. */ + TH1F_LW* m_jet_muons_n; + /** @brief To monitor Pt of muons in a jet. */ + TH1F_LW* m_jet_muons_pt; + + //* electron variables per jet *// + /** @brief To monitor number of electrons in a jet. */ + TH1F_LW* m_jet_electrons_n; + /** @brief To monitor Pt of electrons in a jet. */ + TH1F_LW* m_jet_electrons_pt; + + TH1F_LW* m_trigPassed; + TH1F_LW* m_cutflow; + + TH1F_LW* m_cutflow_jet; + + TH2F_LW* m_priVtx_trks; + + /** @brief 2D map of track selector efficiency. */ + TH2F_LW* m_track_selector_eff; + TH2F_LW* m_track_selector_eff_LS; + //TH2F_LW* m_track_selector_suspect; + TH2F_LW* m_track_selector_all; + TH2F_LW* m_track_selector_all_LS; + + /** @brief 2D map of jets at various cuts. */ + TH2F_LW* m_jet_2D_all; + TH2F_LW* m_jet_2D_good; + TH2F_LW* m_jet_2D_kinematic; + TH2F_LW* m_jet_2D_kinematic_LS; + TH2F_LW* m_jet_2D_quality; + //TH2F_LW* m_jet_2D_suspect; + + /** @brief 2D map of tag rates. */ + TH2F_LW* m_sv0_tag_pos_rate_2D; + TH2F_LW* m_sv0_tag_neg_rate_2D; + TH2F_LW* m_sv1_tag_pos_rate_2D; + TH2F_LW* m_sv1_tag_neg_rate_2D; + TH2F_LW* m_sv2_tag_pos_rate_2D; + TH2F_LW* m_sv2_tag_neg_rate_2D; + + TH2F_LW* m_ip1d_tag_pos_rate_2D; + TH2F_LW* m_ip1d_tag_neg_rate_2D; + TH2F_LW* m_ip2d_tag_pos_rate_2D; + TH2F_LW* m_ip2d_tag_neg_rate_2D; + TH2F_LW* m_ip3d_tag_pos_rate_2D; + TH2F_LW* m_ip3d_tag_neg_rate_2D; + TH2F_LW* m_ip3d_tag_def_rate_2D; + TH2F_LW* m_ip3d_tag_def_rate_2D_LS; + + TH2F_LW* m_sv1ip3d_tag_pos_rate_2D; + TH2F_LW* m_sv1ip3d_tag_neg_rate_2D; + + TH2F_LW* m_jfcnn_tag_pos_rate_2D; + TH2F_LW* m_jfcnn_tag_neg_rate_2D; + + enum Cuts_t { pTMin, d0Max, z0Max, sigd0Max, sigz0Max, etaMax, + nHitBLayer, deadBLayer, nHitPix, nHitSct, nHitSi, nHitTrt, nHitTrtHighE, + fitChi2, fitProb, fitChi2OnNdfMax, numCuts + }; + + /** @brief + * 2D map of MV1 tag rate + */ + TH2F_LW* m_mv1_tag_pos_rate_2D; + TH2F_LW* m_mv1_tag_neg_rate_2D; + TH2F_LW* m_mv1_tag_def_rate_2D; + TH2F_LW* m_mv1_tag_def_rate_2D_LS; + + + /** @brief 2D map of TrackSelectorTool cuts */ + TH2F_LW* m_tracks_all_2D; + TH2F_LW* m_tracks_pTMin_2D; + TH2F_LW* m_tracks_d0Max_2D; + TH2F_LW* m_tracks_z0Max_2D; + TH2F_LW* m_tracks_sigd0Max_2D; + TH2F_LW* m_tracks_sigz0Max_2D; + TH2F_LW* m_tracks_etaMax_2D; + TH2F_LW* m_tracks_nHitBLayer_2D; + TH2F_LW* m_tracks_deadBLayer_2D; + TH2F_LW* m_tracks_nHitPix_2D; + TH2F_LW* m_tracks_nHitSct_2D; + TH2F_LW* m_tracks_nHitSi_2D; + TH2F_LW* m_tracks_nHitTrt_2D; + TH2F_LW* m_tracks_nHitTrtHighE_2D; + TH2F_LW* m_tracks_fitChi2_2D; + TH2F_LW* m_tracks_fitProb_2D; + TH2F_LW* m_tracks_fitChi2OnNdfMax_2D; + + TH2F_LW* m_tracks_all_2D_LS; + TH2F_LW* m_tracks_pTMin_2D_LS; + TH2F_LW* m_tracks_d0Max_2D_LS; + TH2F_LW* m_tracks_z0Max_2D_LS; + TH2F_LW* m_tracks_sigd0Max_2D_LS; + TH2F_LW* m_tracks_sigz0Max_2D_LS; + TH2F_LW* m_tracks_etaMax_2D_LS; + TH2F_LW* m_tracks_nHitBLayer_2D_LS; + TH2F_LW* m_tracks_deadBLayer_2D_LS; + TH2F_LW* m_tracks_nHitPix_2D_LS; + TH2F_LW* m_tracks_nHitSct_2D_LS; + TH2F_LW* m_tracks_nHitSi_2D_LS; + TH2F_LW* m_tracks_nHitTrt_2D_LS; + TH2F_LW* m_tracks_nHitTrtHighE_2D_LS; + TH2F_LW* m_tracks_fitChi2_2D_LS; + TH2F_LW* m_tracks_fitProb_2D_LS; + TH2F_LW* m_tracks_fitChi2OnNdfMax_2D_LS; + + TH1F_LW* m_efficiency; + + unsigned int m_lumiBlockNum; + + MonGroup* m_monGr_shift; + MonGroup* m_monGr_LowStat; + + //--------------Pixel stuff-------------------------------------- + ServiceHandle <IInDetConditionsSvc> m_pixelCondSummarySvc; + + bool m_doModules; + bool m_doOffline; + bool m_isNewLumiBlock; + bool m_doLumiBlock; + bool m_majorityDisabled; + bool m_doStatus; + +}; + +#endif + diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/cmt/requirements b/PhysicsAnalysis/JetTagging/JetTagMonitoring/cmt/requirements new file mode 100755 index 00000000000..b48f10579c4 --- /dev/null +++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/cmt/requirements @@ -0,0 +1,54 @@ +package JetTagMonitoring + +author Andrea Coccaro <Andrea.Coccaro@ge.infn.it> + + +# ============================================================================================ +public + +use AtlasPolicy AtlasPolicy-* +use GaudiInterface GaudiInterface-* External +use AthenaMonitoring AthenaMonitoring-* Control + + +# ============================================================================================ +private + +use AtlasROOT AtlasROOT-* External +use JetTagTools JetTagTools-* PhysicsAnalysis/JetTagging +use xAODEventInfo xAODEventInfo-* Event/xAOD +use xAODTracking xAODTracking-* Event/xAOD +use xAODBTagging xAODBTagging-* Event/xAOD + +use TrigDecisionTool TrigDecisionTool-* Trigger/TrigAnalysis +use GaudiInterface GaudiInterface-* External + +use TrkVertexFitterInterfaces TrkVertexFitterInterfaces-* Tracking/TrkVertexFitter +use TrkParticleBase TrkParticleBase-* Tracking/TrkEvent +use VxSecVertex VxSecVertex-* Tracking/TrkEvent + +use LArRecEvent LArRecEvent-* LArCalorimeter + +use LWHists LWHists-* Tools + +# ============================================================================================ +public + +use xAODJet xAODJet-* Event/xAOD +use ITrackToVertex ITrackToVertex-* Reconstruction/RecoTools +use InDetConditionsSummaryService InDetConditionsSummaryService* InnerDetector/InDetConditions + + +library JetTagMonitoring *.cxx components/*.cxx + +apply_pattern component_library +apply_pattern declare_joboptions files="*.py" +apply_pattern declare_python_modules files="*.py" + + + + + + + + diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/config/jetTag_collisions_run.config b/PhysicsAnalysis/JetTagging/JetTagMonitoring/config/jetTag_collisions_run.config new file mode 100644 index 00000000000..503cfe6ea9c --- /dev/null +++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/config/jetTag_collisions_run.config @@ -0,0 +1,75 @@ +# ********************************************************************** +# $Id: jetTag_collisions_run.config,v 1.1 2008-09-03 14:00:56 mgwilson Exp $ +# ********************************************************************** + + +####################### +# References +####################### + +reference JetTagShiftHists_Ref { + file = /afs/cern.ch/user/a/atlasdqm/dqmdisk/tier0/han_references/Collisions/MonitorESD_run52300_BTagging_080902.SHIFT.root + path = run_52300 + name = same_name +} + +reference JetTagOverlay_Ref { + file = /afs/cern.ch/user/a/atlasdqm/dqmdisk/tier0/han_references/Collisions/MonitorESD_run52300_BTagging_080902.root + path = run_52300 + name = same_name +} + + +#################### +# Common Algorithms +#################### + +algorithm WorstCaseSummary { + libname = libdqm_summaries.so + name = WorstCaseSummary +} + +compositeAlgorithm Histogram_Not_Empty&GatherData { + subalgs = GatherData,Histogram_Not_Empty + libnames = libDataQualityInterfacesAlgs.so,libdqm_algorithms.so +} + + +############# +# Output +############# + +output top_level { + algorithm = WorstCaseSummary + + output JetTagging { + + } +} + + +############################################################ +# Jet Tagging +############################################################ + +####################### +# Histogram Assessments +####################### + +dir JetTagging { + reference = JetTagShiftHists_Ref + algorithm = JetTag_GatherData + output = JetTagging + hist all_in_dir { + } +} + +########################### +# Algorithms and Thresholds +########################### + +algorithm JetTag_GatherData { + name = Histogram_Not_Empty&GatherData + #reference = JetTagOverlay_Ref +} + diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagMonitoring_jobOptions.py b/PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagMonitoring_jobOptions.py new file mode 100644 index 00000000000..547e6bd4e87 --- /dev/null +++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagMonitoring_jobOptions.py @@ -0,0 +1,58 @@ + +monManJetTag = AthenaMonManager(name="JetTagMonManager", + FileKey = DQMonFlags.monManFileKey(), + Environment = DQMonFlags.monManEnvironment(), + ManualDataTypeSetup = DQMonFlags.monManManualDataTypeSetup(), + DataType = DQMonFlags.monManDataType()) +topSequence += monManJetTag + +from JetTagMonitoring.JetTagMonitoringConf import JetTagMonitoring +jetTagMonTool = JetTagMonitoring ( + name = "jetTagMonTool", + ) +ToolSvc += jetTagMonTool +monManJetTag.AthenaMonTools += [ jetTagMonTool ] + +# remove events with non-collision BCIDs from your monitoring tools +# see https://indico.cern.ch/getFile.py/access?contribId=1&resId=1&materialId=slides&confId=135968 +jetTagMonTool.FilterTools += [ monFilledBunchFilterTool ] + +# remove events with intolerable LAr defects +from AthenaMonitoring.BadLBFilterTool import GetLArBadLBFilterTool +monbadlb = GetLArBadLBFilterTool() +jetTagMonTool.FilterTools += [ monbadlb ] + +jetTagMonTool.OutputLevel = INFO +jetTagMonTool.JetContainer = "AntiKt4TopoEMJets" +jetTagMonTool.DQcuts = True +jetTagMonTool.PriVtxTrkMinCut = 4 +jetTagMonTool.D0_min_cuts = 0 +jetTagMonTool.D0_max_cuts = 1 +jetTagMonTool.JetPt_cuts = 15000 +jetTagMonTool.JetEta_cuts = 2.5 +jetTagMonTool.nTrk_cuts = 1 + +##### EPS recommendations +##### https://twiki.cern.ch/twiki/bin/view/AtlasProtected/Analysis16#Calibrations_to_be_used_for_EPS + +jetTagMonTool.SV0_weight_cut = 5.85 +jetTagMonTool.SV1IP3D_weight_cut = 4.5 +jetTagMonTool.JetFitterCOMBNN_weight_cut = 2.0 +#jetTagMonTool.MV1_weight_cut = 0.601713 +jetTagMonTool.MV1_weight_cut = 0.601713 +jetTagMonTool.IP3D_weight_cut = 3.75 + +if not rec.doInDet: + jetTagMonTool.UseTrackSelector = False +else: + jetTagMonTool.UseTrackSelector = True + +if DQMonFlags.useTrigger() and hasattr(ToolSvc, DQMonFlags.nameTrigDecTool()): + print "jetTagMonTool will use TrigDecisionTool instance: %s" % DQMonFlags.nameTrigDecTool() + jetTagMonTool.TrigDecisionTool = getattr(ToolSvc, DQMonFlags.nameTrigDecTool()) + jetTagMonTool.TriggerChain = "L1_J.*, L1_[3-5]J.* ,EF_e24vh_medium1, EF_mu18_IDTrkNoCut_tight, L1_RD0_FILLED" #"L1_J10" even older #"EF_mu4_L1J10_matched" + jetTagMonTool.UseTrigDecisionTool = True +else: + print "WARNING!!! jetTagMonTool will NOT use TrigDecisionTool." + jetTagMonTool.UseTrigDecisionTool = False + diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagging_test.cc b/PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagging_test.cc new file mode 100644 index 00000000000..4d2e98670ea --- /dev/null +++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagging_test.cc @@ -0,0 +1,523 @@ +#include "TCanvas.h" +#include "TGraph.h" +#include "TLegend.h" +#include "TH1F.h" +#include "TH2F.h" +#include "TROOT.h" +#include "TTree.h" +#include "TFile.h" +#include <iostream> +#include <string> +void JetTagging_test() +{ +//---------------------insert HIST filename here--------------------------- +string HISTfile = "/tmp/mbarison/data11_7TeV.00186493.physics_JetTauEtmiss.merge.HIST.f393_m926/data11_7TeV.00186493.physics_JetTauEtmiss.merge.HIST.f393_m926._0001.1"; +//--------------------------------------------------------------------------- + gStyle->SetPalette(1); + using std; + double P[16]; + double Summ[16]; + double Summ1[16]; + double Summ2[16]; + double Max[16]; + double Max1[16]; + double Max2[16]; + string MonFile = "root://castoratlas//castor/cern.ch/grid/atlas/caf/atlcal/perm/dataqual/han_references/Collisions/data11_7TeV.00183347.express_express.merge.HIST.f384_m875._0001.1.root"; + + + string run; + TFile* BTagMonteCarlo= TFile::Open(MonFile.c_str()); + TFile* BTagExp= TFile::Open(HISTfile.c_str()); + + size_t a; + a=HISTfile.find(".00"); + run=HISTfile.substr(a+3,6); + + printf ("================== Analysing Run %s ==================\n", run.c_str()); + + BTagMonteCarlo->cd(); + TH1F* m_jet_electrons_n = (TH1F*)BTagMonteCarlo->Get("run_183347/JetTagging/jet_electrons_n"); + TH1F* m_jet_muons_n = (TH1F*)BTagMonteCarlo->Get("run_183347/JetTagging/jet_muons_n"); + TH1F* m_jet_tracks_hits_BLayer = (TH1F*)BTagMonteCarlo->Get("run_183347/JetTagging/jet_tracks_hits_BLayer"); + TH1F* m_jet_tracks_hits_Pixel = (TH1F*)BTagMonteCarlo->Get("run_183347/JetTagging/jet_tracks_hits_Pixel"); + TH1F* m_jet_tracks_hits_SCT = (TH1F*)BTagMonteCarlo->Get("run_183347/JetTagging/jet_tracks_hits_SCT"); + TH1F* m_jet_tracks_n = (TH1F*)BTagMonteCarlo->Get("run_183347/JetTagging/jet_tracks_n"); + TH1F* m_jetProb = (TH1F*)BTagMonteCarlo->Get("run_183347/JetTagging/tag_JetProb_w"); + TH1F* m_sv0 = (TH1F*)BTagMonteCarlo->Get("run_183347/JetTagging/tag_SV0_w"); + TH1F* m_tag_COMB_w = (TH1F*)BTagMonteCarlo->Get("run_183347/JetTagging/tag_COMB_w"); + TH1F* m_tag_IP1D_w = (TH1F*)BTagMonteCarlo->Get("run_183347/JetTagging/tag_IP1D_w"); + TH1F* m_tag_IP2D_w = (TH1F*)BTagMonteCarlo->Get("run_183347/JetTagging/tag_IP2D_w"); + TH1F* m_tag_IP3D_w = (TH1F*)BTagMonteCarlo->Get("run_183347/JetTagging/tag_IP3D_w"); + TH1F* m_trkCnt = (TH1F*)BTagMonteCarlo->Get("run_183347/JetTagging/tag_TrkCnt_w"); + TH1F* m_SOFTE = (TH1F*)BTagMonteCarlo->Get("run_183347/JetTagging/tag_SOFTE_w"); + TH1F* m_SOFTM = (TH1F*)BTagMonteCarlo->Get("run_183347/JetTagging/tag_SOFTM_w"); + TH2F* m_trackSelEff = (TH2F*)BTagMonteCarlo->Get("run_183347/JetTagging/track_selector_eff"); + TH2F* m_trackSelAll = (TH2F*)BTagMonteCarlo->Get("run_183347/JetTagging/track_selector_all"); + + BTagExp->cd(); + TH1F* ex_jet_electrons_n = (TH1F*)BTagExp->Get(TString("run_")+run.c_str()+TString("/JetTagging/jet_electrons_n")); + TH1F* ex_jet_muons_n = (TH1F*)BTagExp->Get(TString("run_")+run.c_str()+TString("/JetTagging/jet_muons_n")); + TH1F* ex_jet_tracks_hits_BLayer = (TH1F*)BTagExp->Get(TString("run_")+run.c_str()+TString("/JetTagging/jet_tracks_hits_BLayer")); + TH1F* ex_jet_tracks_hits_Pixel = (TH1F*)BTagExp->Get(TString("run_")+run.c_str()+TString("/JetTagging/jet_tracks_hits_Pixel")); + TH1F* ex_jet_tracks_hits_SCT = (TH1F*)BTagExp->Get(TString("run_")+run.c_str()+TString("/JetTagging/jet_tracks_hits_SCT")); + TH1F* ex_jet_tracks_n = (TH1F*)BTagExp->Get(TString("run_")+run.c_str()+TString("/JetTagging/jet_tracks_n")); + TH1F* ex_jetProb = (TH1F*)BTagExp->Get(TString("run_")+run.c_str()+TString("/JetTagging/tag_JetProb_w")); + TH1F* ex_sv0 = (TH1F*)BTagExp->Get(TString("run_")+run.c_str()+TString("/JetTagging/tag_SV0_w")); + TH1F* ex_tag_COMB_w = (TH1F*)BTagExp->Get(TString("run_")+run.c_str()+TString("/JetTagging/tag_COMB_w")); + TH1F* ex_tag_IP1D_w = (TH1F*)BTagExp->Get(TString("run_")+run.c_str()+TString("/JetTagging/tag_IP1D_w")); + TH1F* ex_tag_IP2D_w = (TH1F*)BTagExp->Get(TString("run_")+run.c_str()+TString("/JetTagging/tag_IP2D_w")); + TH1F* ex_tag_IP3D_w = (TH1F*)BTagExp->Get(TString("run_")+run.c_str()+TString("/JetTagging/tag_IP3D_w")); + TH1F* ex_trkCnt = (TH1F*)BTagExp->Get(TString("run_")+run.c_str()+TString("/JetTagging/tag_TrkCnt_w")); + TH1F* ex_SOFTE = (TH1F*)BTagExp->Get(TString("run_")+run.c_str()+TString("/JetTagging/tag_SOFTE_w")); + TH1F* ex_SOFTM = (TH1F*)BTagExp->Get(TString("run_")+run.c_str()+TString("/JetTagging/tag_SOFTM_w")); + TH2F* ex_trackSelEff = (TH2F*)BTagExp->Get(TString("run_")+run.c_str()+TString("/JetTagging/track_selector_eff")); + TH2F* ex_trackSelAll = (TH2F*)BTagExp->Get(TString("run_")+run.c_str()+TString("/JetTagging/track_selector_all")); + +if((m_jet_electrons_n->Integral() != 0)&&(ex_jet_electrons_n->Integral()!=0)) + { + m_jet_electrons_n->Scale(1./m_jet_electrons_n->Integral()); + ex_jet_electrons_n->Scale(1./ex_jet_electrons_n->Integral()); + } + m_jet_electrons_n ->SetLineColor(kRed); + ex_jet_electrons_n->SetLineColor(kBlue); + +if((m_jet_muons_n->Integral() != 0)&&(ex_jet_muons_n->Integral()!=0)) + { + m_jet_muons_n->Scale(1./m_jet_muons_n->Integral()); + ex_jet_muons_n->Scale(1./ex_jet_muons_n->Integral()); + } + m_jet_muons_n->SetLineColor(kRed); + ex_jet_muons_n->SetLineColor(kBlue); + +if((m_jet_tracks_hits_BLayer->Integral() != 0)&&(ex_jet_tracks_hits_BLayer->Integral()!=0)) + { + m_jet_tracks_hits_BLayer->Scale(1./m_jet_tracks_hits_BLayer->Integral()); + ex_jet_tracks_hits_BLayer->Scale(1./ex_jet_tracks_hits_BLayer->Integral()); + } + m_jet_tracks_hits_BLayer->SetLineColor(kRed); + ex_jet_tracks_hits_BLayer->SetLineColor(kBlue); + +if((m_jet_tracks_hits_Pixel->Integral() != 0)&&(ex_jet_tracks_hits_Pixel->Integral()!=0)) + { + m_jet_tracks_hits_Pixel->Scale(1./m_jet_tracks_hits_Pixel->Integral()); + ex_jet_tracks_hits_Pixel->Scale(1./ex_jet_tracks_hits_Pixel->Integral()); + } + m_jet_tracks_hits_Pixel->SetLineColor(kRed); + ex_jet_tracks_hits_Pixel->SetLineColor(kBlue); + +if((m_jet_tracks_hits_SCT->Integral() != 0)&&(ex_jet_tracks_hits_SCT->Integral()!=0)) + { + m_jet_tracks_hits_SCT->Scale(1./m_jet_tracks_hits_SCT->Integral()); + ex_jet_tracks_hits_SCT->Scale(1./ex_jet_tracks_hits_SCT->Integral()); + } + m_jet_tracks_hits_SCT->SetLineColor(kRed); + ex_jet_tracks_hits_SCT->SetLineColor(kBlue); + +if((m_jet_tracks_n->Integral() != 0)&&(ex_jet_tracks_n->Integral()!=0)) + { + m_jet_tracks_n->Scale(1./m_jet_tracks_n->Integral()); + ex_jet_tracks_n->Scale(1./ex_jet_tracks_n->Integral()); + } + m_jet_tracks_n->SetLineColor(kRed); + ex_jet_tracks_n->SetLineColor(kBlue); + +if((m_jetProb->Integral() != 0)&&(ex_jetProb->Integral()!=0)) + { + m_jetProb->Scale(1./m_jetProb->Integral()); + ex_jetProb->Scale(1./ex_jetProb->Integral()); + } + m_jetProb->SetLineColor(kRed); + ex_jetProb->SetLineColor(kBlue); + +if((m_sv0->Integral() != 0)&&(ex_sv0->Integral()!=0)) + { + m_sv0->Scale(1./m_sv0->Integral()); + ex_sv0->Scale(1./ex_sv0->Integral()); + } + m_sv0->SetLineColor(kRed); + ex_sv0->SetLineColor(kBlue); + +if((m_tag_COMB_w->Integral() != 0)&&(ex_tag_COMB_w->Integral()!=0)) + { + m_tag_COMB_w->Scale(1./m_tag_COMB_w->Integral()); + ex_tag_COMB_w->Scale(1./ex_tag_COMB_w->Integral()); + } + m_tag_COMB_w->SetLineColor(kRed); + ex_tag_COMB_w->SetLineColor(kBlue); + +if((m_tag_IP1D_w->Integral() != 0)&&(ex_tag_IP1D_w->Integral()!=0)) + { + m_tag_IP1D_w->Scale(1./m_tag_IP1D_w->Integral()); + ex_tag_IP1D_w->Scale(1./ex_tag_IP1D_w->Integral()); + } + m_tag_IP1D_w->SetLineColor(kRed); + ex_tag_IP1D_w->SetLineColor(kBlue); + +if((m_tag_IP2D_w->Integral() != 0)&&(ex_tag_IP2D_w->Integral()!=0)) + { + m_tag_IP2D_w->Scale(1./m_tag_IP2D_w->Integral()); + ex_tag_IP2D_w->Scale(1./ex_tag_IP2D_w->Integral()); + } + m_tag_IP2D_w->SetLineColor(kRed); + ex_tag_IP2D_w->SetLineColor(kBlue); + +if((m_tag_IP3D_w->Integral() != 0)&&(ex_tag_IP3D_w->Integral()!=0)) + { + m_tag_IP3D_w->Scale(1./m_tag_IP3D_w->Integral()); + ex_tag_IP3D_w->Scale(1./ex_tag_IP3D_w->Integral()); + } + m_tag_IP3D_w->SetLineColor(kRed); + ex_tag_IP3D_w->SetLineColor(kBlue); + +if((m_trkCnt->Integral() != 0)&&(ex_trkCnt->Integral()!=0)) + { + m_trkCnt->Scale(1./m_trkCnt->Integral()); + ex_trkCnt->Scale(1./ex_trkCnt->Integral()); + } + m_trkCnt->SetLineColor(kRed); + ex_trkCnt->SetLineColor(kBlue); + +if((m_SOFTE->Integral() != 0)&&(ex_SOFTE->Integral()!=0)) + { + m_SOFTE->Scale(1./m_SOFTE->Integral()); + ex_SOFTE->Scale(1./ex_SOFTE->Integral()); + } + m_SOFTE->SetLineColor(kRed); + ex_SOFTE->SetLineColor(kBlue); + +if((m_SOFTM->Integral() != 0)&&(ex_SOFTM->Integral()!=0)) + { + m_SOFTM->Scale(1./m_SOFTM->Integral()); + ex_SOFTM->Scale(1./ex_SOFTM->Integral()); + } + m_SOFTM->SetLineColor(kRed); + ex_SOFTM->SetLineColor(kBlue); + + //if((m_trackSelEff->Integral() != 0)&&(ex_trackSelEff->Integral()!=0)) + // { + ex_trackSelEff->Divide(ex_trackSelAll); + //ex_trackSelEff->Scale(1./(ex_trackSelAll->Integral())); + // } + // m_trackSelEff->SetLineColor(kRed); + //ex_trackSelEff->SetLineColor(kBlue); + + + Max1[0]=m_jet_electrons_n->GetMaximum(); + Max2[0]=ex_jet_electrons_n->GetMaximum(); + Max1[1]=m_jet_muons_n->GetMaximum(); + Max2[1]=ex_jet_muons_n->GetMaximum(); + Max1[2]=m_jet_tracks_hits_BLayer->GetMaximum(); + Max2[2]=ex_jet_tracks_hits_BLayer->GetMaximum(); + Max1[3]=m_jet_tracks_hits_Pixel->GetMaximum(); + Max2[3]=ex_jet_tracks_hits_Pixel->GetMaximum(); + Max1[4]=m_jet_tracks_hits_SCT->GetMaximum(); + Max2[4]=ex_jet_tracks_hits_SCT->GetMaximum(); + Max1[5]=m_jet_tracks_n->GetMaximum(); + Max2[5]=ex_jet_tracks_n->GetMaximum(); + Max1[6]=m_jetProb->GetMaximum(); + Max2[6]=ex_jetProb->GetMaximum(); + Max1[7]=m_sv0->GetMaximum(); + Max2[7]=ex_sv0->GetMaximum(); + Max1[8]=m_trkCnt->GetMaximum(); + Max2[8]=ex_trkCnt->GetMaximum(); + Max1[9]=m_SOFTE->GetMaximum(); + Max2[9]=ex_SOFTE->GetMaximum(); + Max1[10]=m_SOFTM->GetMaximum(); + Max2[10]=ex_SOFTM->GetMaximum(); + Max1[11]=m_trackSelEff->GetMaximum(); + Max2[11]=ex_trackSelEff->GetMaximum(); + Max1[12]=m_tag_COMB_w->GetMaximum(); + Max2[12]=ex_tag_COMB_w->GetMaximum(); + Max1[13]=m_tag_IP1D_w->GetMaximum(); + Max2[13]=ex_tag_IP1D_w->GetMaximum(); + Max1[14]=m_tag_IP2D_w->GetMaximum(); + Max2[14]=ex_tag_IP2D_w->GetMaximum(); + Max1[15]=m_tag_IP3D_w->GetMaximum(); + Max2[15]=ex_tag_IP3D_w->GetMaximum(); + Summ1[0]= m_jet_electrons_n->GetEntries(); + Summ2[0]= ex_jet_electrons_n->GetEntries(); + for(int i=0;i<14;i++) + { + if (Max2[i]>Max1[i]) + { + Max[i]=Max2[i]; + Summ[i]=Summ2[i]; + } + else + { + Max[i]=Max1[i]; + Summ[i]=Summ1[i]; + } + } + P[0]=m_jet_electrons_n->KolmogorovTest(ex_jet_electrons_n,"M"); + P[1]=m_jet_muons_n->KolmogorovTest(ex_jet_muons_n,"M"); + P[2]=m_jet_tracks_hits_BLayer->KolmogorovTest(ex_jet_tracks_hits_BLayer,"M"); + P[3]=m_jet_tracks_hits_Pixel->KolmogorovTest(ex_jet_tracks_hits_Pixel,"M"); + P[4]=m_jet_tracks_hits_SCT->KolmogorovTest(ex_jet_tracks_hits_SCT,"M"); + P[5]=m_jet_tracks_n->KolmogorovTest(ex_jet_tracks_n,"M"); + P[6]=m_jetProb->KolmogorovTest(ex_jetProb,"M"); + P[7]=m_sv0->KolmogorovTest(ex_sv0,"M"); + P[8]=m_trkCnt->KolmogorovTest(ex_trkCnt,"M"); + P[9]=m_SOFTE->KolmogorovTest(ex_SOFTE,"M"); + P[10]=m_SOFTM->KolmogorovTest(ex_SOFTM,"M"); + P[11]=m_trackSelEff->KolmogorovTest(ex_trackSelEff,"M"); + P[12]=m_tag_COMB_w->KolmogorovTest(ex_tag_COMB_w,"M"); + P[13]=m_tag_IP1D_w->KolmogorovTest(ex_tag_IP1D_w,"M"); + P[14]=m_tag_IP2D_w->KolmogorovTest(ex_tag_IP2D_w,"M"); + P[15]=m_tag_IP3D_w->KolmogorovTest(ex_tag_IP3D_w,"M"); + + + TCanvas* c1 = new TCanvas("c1","cuts",0,0,1200,1000); + c1->Divide(4,4); + + c1->cd(1); + m_jet_electrons_n->Draw(); + ex_jet_electrons_n->Draw("same"); + if(P[0]<0.15) + c1_1->SetFillColor(kGreen); + else if (P[0]<0.3) + c1_1->SetFillColor(kYellow); + else + c1_1->SetFillColor(kRed); + gPad->SetFrameFillColor(10); + m_jet_electrons_n -> SetAxisRange(0.01, Max[0]*1.2, "Y"); + leg1 = new TLegend(0.9,0.6,0.55,0.8); + leg1->AddEntry(m_jet_electrons_n,"Reference","l"); + leg1->AddEntry(ex_jet_electrons_n,"Data","l"); + leg1->Draw(); + + c1->cd(2); + m_jet_muons_n->Draw(); + ex_jet_muons_n->Draw("same"); + if(P[1]<0.15) + c1_2->SetFillColor(kGreen); + else if (P[1]<0.3) + c1_2->SetFillColor(kYellow); + else + c1_2->SetFillColor(kRed); + gPad->SetFrameFillColor(10); + gPad->SetLogy(); + m_jet_muons_n -> SetAxisRange(1e-5, Max[1]*2, "Y"); + + c1->cd(3); + m_jet_tracks_hits_BLayer->Draw(); + ex_jet_tracks_hits_BLayer->Draw("same"); + if(P[2]<0.15) + c1_3->SetFillColor(kGreen); + else if (P[2]<0.3) + c1_3->SetFillColor(kYellow); + else + c1_3->SetFillColor(kRed); + gPad->SetFrameFillColor(10); + m_jet_tracks_hits_BLayer -> SetAxisRange(0, Max[2]*1.2, "Y"); + + c1->cd(4); + m_jet_tracks_hits_Pixel->Draw(); + ex_jet_tracks_hits_Pixel->Draw("same"); + if(P[3]<0.15) + c1_4->SetFillColor(kGreen); + else if (P[3]<0.3) + c1_4->SetFillColor(kYellow); + else + c1_4->SetFillColor(kRed); + gPad->SetFrameFillColor(10); + m_jet_tracks_hits_Pixel -> SetAxisRange(0, Max[3]*1.2, "Y"); + + c1->cd(5); + m_jet_tracks_hits_SCT->Draw(); + ex_jet_tracks_hits_SCT->Draw("same"); + if(P[4]<0.15) + c1_5->SetFillColor(kGreen); + else if (P[4]<0.3) + c1_5->SetFillColor(kYellow); + else + c1_5->SetFillColor(kRed); + gPad->SetFrameFillColor(10); + m_jet_tracks_hits_SCT -> SetAxisRange(0, Max[4]*1.2, "Y"); + + c1->cd(6); + m_jet_tracks_n->Draw(); + ex_jet_tracks_n->Draw("same"); + if(P[5]<0.15) + c1_6->SetFillColor(kGreen); + else if (P[5]<0.3) + c1_6->SetFillColor(kYellow); + else + c1_6->SetFillColor(kRed); + gPad->SetFrameFillColor(10); + m_jet_tracks_n -> SetAxisRange(0, Max[5]*1.2, "Y"); + + c1->cd(7); + m_jetProb->Draw(); + ex_jetProb->Draw("same"); + if(P[6]<0.15) + c1_7->SetFillColor(kGreen); + else if (P[6]<0.3) + c1_7->SetFillColor(kYellow); + else + c1_7->SetFillColor(kRed); + gPad->SetFrameFillColor(10); + gPad->SetLogy(); + m_jetProb -> SetAxisRange(1e-3, Max[6]*2, "Y"); + + c1->cd(8); + m_sv0->Draw(); + ex_sv0->Draw("same"); + if(P[7]<0.01) + c1_8->SetFillColor(kGreen); + else if (P[7]<0.03) + c1_8->SetFillColor(kYellow); + else + c1_8->SetFillColor(kRed); + gPad->SetFrameFillColor(10); + gPad->SetLogy(); + m_sv0 -> SetAxisRange(1e-5, Max[7]*2, "Y"); + + c1->cd(9); + m_trkCnt->Draw(); + ex_trkCnt->Draw("same"); + if(P[8]<0.15) + c1_9->SetFillColor(kGreen); + else if (P[8]<0.3) + c1_9->SetFillColor(kYellow); + else + c1_9->SetFillColor(kRed); + gPad->SetFrameFillColor(10); + gPad->SetLogy(); + m_trkCnt -> SetAxisRange(1e-3, Max[8]*2, "Y"); + + c1->cd(10); + m_SOFTE->Draw(); + ex_SOFTE->Draw("same"); + if(P[9]<0.15) + c1_10->SetFillColor(kGreen); + else if (P[9]<0.3) + c1_10->SetFillColor(kYellow); + else + c1_10->SetFillColor(kRed); + gPad->SetFrameFillColor(10); + m_SOFTE -> SetAxisRange(0, Max[9]*1.2, "Y"); + + c1->cd(11); + m_SOFTM->Draw(); + ex_SOFTM->Draw("same"); + if(P[10]<0.15) + c1_11->SetFillColor(kGreen); + else if (P[10]<0.3) + c1_11->SetFillColor(kYellow); + else + c1_11->SetFillColor(kRed); + gPad->SetFrameFillColor(10); + m_SOFTM -> SetAxisRange(0, Max[10]*1.2, "Y"); + + c1->cd(12); + // m_trackSelEff->Draw("colz"); + ex_trackSelEff->Draw("colz"); + if(P[11]<0.15) + c1_12->SetFillColor(kGreen); + else if (P[11]<0.3) + c1_12->SetFillColor(kYellow); + else + c1_12->SetFillColor(kRed); + gPad->SetFrameFillColor(10); + m_trackSelEff -> SetAxisRange(0, Max[11]*1.2, "Y"); + m_trackSelEff -> SetAxisRange(0, Max[11]*1.2, "X"); + + + c1->cd(13); + m_tag_COMB_w->Draw(); + ex_tag_COMB_w->Draw("same"); + if(P[12]<0.15) + c1_13->SetFillColor(kGreen); + else if (P[11]<0.3) + c1_13->SetFillColor(kYellow); + else + c1_13->SetFillColor(kRed); + gPad->SetFrameFillColor(10); + m_tag_COMB_w -> SetAxisRange(0, Max[12]*1.2, "Y"); + + + c1->cd(14); + m_tag_IP1D_w->Draw(); + ex_tag_IP1D_w->Draw("same"); + if(P[13]<0.15) + c1_14->SetFillColor(kGreen); + else if (P[13]<0.3) + c1_14->SetFillColor(kYellow); + else + c1_14->SetFillColor(kRed); + gPad->SetFrameFillColor(10); + m_tag_IP1D_w -> SetAxisRange(0, Max[13]*1.2, "Y"); + + + c1->cd(15); + m_tag_IP2D_w->Draw(); + ex_tag_IP2D_w->Draw("same"); + if(P[14]<0.15) + c1_15->SetFillColor(kGreen); + else if (P[14]<0.3) + c1_15->SetFillColor(kYellow); + else + c1_15->SetFillColor(kRed); + gPad->SetFrameFillColor(10); + m_tag_IP2D_w -> SetAxisRange(0, Max[14]*1.2, "Y"); + + + c1->cd(16); + m_tag_IP3D_w->Draw(); + ex_tag_IP3D_w->Draw("same"); + if(P[15]<0.15) + c1_16->SetFillColor(kGreen); + else if (P[15]<0.3) + c1_16->SetFillColor(kYellow); + else + c1_16->SetFillColor(kRed); + gPad->SetFrameFillColor(10); + m_tag_IP3D_w -> SetAxisRange(0, Max[15]*1.2, "Y"); + + + P[0]=m_jet_electrons_n->KolmogorovTest(ex_jet_electrons_n,"M"); + P[1]=m_jet_muons_n->KolmogorovTest(ex_jet_muons_n,"M"); + P[2]=m_jet_tracks_hits_BLayer->KolmogorovTest(ex_jet_tracks_hits_BLayer,"M"); + P[3]=m_jet_tracks_hits_Pixel->KolmogorovTest(ex_jet_tracks_hits_Pixel,"M"); + P[4]=m_jet_tracks_hits_SCT->KolmogorovTest(ex_jet_tracks_hits_SCT,"M"); + P[5]=m_jet_tracks_n->KolmogorovTest(ex_jet_tracks_n,"M"); + P[6]=m_jetProb->KolmogorovTest(ex_jetProb,"M"); + P[7]=m_sv0->KolmogorovTest(ex_sv0,"M"); + P[8]=m_trkCnt->KolmogorovTest(ex_trkCnt,"M"); + P[9]=m_SOFTE->KolmogorovTest(ex_SOFTE,"M"); + P[10]=m_SOFTM->KolmogorovTest(ex_SOFTM,"M"); + P[11]=m_trackSelEff->KolmogorovTest(ex_trackSelEff,"M"); + P[12]=m_tag_COMB_w->KolmogorovTest(ex_tag_COMB_w,"M"); + P[13]=m_tag_IP1D_w->KolmogorovTest(ex_tag_IP1D_w,"M"); + P[14]=m_tag_IP2D_w->KolmogorovTest(ex_tag_IP2D_w,"M"); + P[15]=m_tag_IP3D_w->KolmogorovTest(ex_tag_IP3D_w,"M"); + cout<<"MaxDifference value of KolmogorovTest for next variables:"<<endl; + cout<<"jet_electrons_n: "<<P[0]<<endl; + cout<<"jet_muons_n: "<<P[1]<<endl; + cout<<"jet_tracks_hits_BLayer: "<<P[2]<<endl; + cout<<"jet_tracks_hits_Pixel: "<<P[3]<<endl; + cout<<"jet_tracks_hits_SCT: "<<P[4]<<endl; + cout<<"jet_tracks_n: "<<P[5]<<endl; + cout<<"jetProb: "<<P[6]<<endl; + cout<<"sv0: "<<P[7]<<endl; + cout<<"trkCnt: "<<P[8]<<endl; + cout<<"SOFTE: "<<P[9]<<endl; + cout<<"SOFTM: "<<P[10]<<endl; + cout<<"track_selector_eff: "<<P[11]<<endl; + cout<<"tag_COMB_w: "<<P[12]<<endl; + cout<<"tag_IP1D_w: "<<P[13]<<endl; + cout<<"tag_IP2D_w: "<<P[14]<<endl; + cout<<"tag_IP3D_w: "<<P[15]<<endl; + + char name1[32]; + char name2[32]; + + sprintf(name1,"dq_%s.pdf", run.c_str()); + sprintf(name2,"dq_%s.png", run.c_str()); + + c1->Print(name1); + c1->Print(name2); + return ; +} + diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagging_test.py b/PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagging_test.py new file mode 100644 index 00000000000..4ced4475564 --- /dev/null +++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagging_test.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +#simple script to compare the actual data file with a reference and give a result depending on a +#K test +# use with > ./JetTagging_test.py [data file] [reference file] > ktest_[run].txt +# so you'll get an pdf file with an graphical representation and the actual test result in +# the text file. + + +import ROOT, sys, math, time, re +#from ROOT import gROOT, TCanvas, TH1, TH2, TH1F + +h2list = [] + + + +if __name__ == "__main__": + + ROOT.gStyle.SetPalette(1) + + #Reference file (maybe outdated + MonFile = "root://castoratlas//castor/cern.ch/grid/atlas/caf/atlcal/perm/dataqual/han_references/Collisions/data11_7TeV.00183347.express_express.merge.HIST.f384_m875._0001.1.root" + + print sys.argv + + tf = ROOT.TFile.Open(sys.argv[1]) + + if len(sys.argv) > 2: + tfref = ROOT.TFile.Open(sys.argv[2]) + else: + tfref = ROOT.TFile.Open(MonFile) + + #get run number from root directory + rDir = tf.GetListOfKeys()[0].GetName() + runTemp = re.search("\d{5,8}", rDir ) + if len(runTemp.group(0))==6: + run = runTemp.group(0) + elif len(runTemp.group(0))==8: + run = runTemp.group(0)[2:8] + else: + print ("No run number in the filename %s in format XXXXXX or 00XXXXXX given" % tf.GetName() ) + + print "run number from data file:\t %s " % run + + #get run number of reference from root directory + rDir = tfref.GetListOfKeys()[0].GetName() + runTempRef = re.search("\d{5,8}", rDir ) + if len(runTempRef.group(0))==6: + runref = runTempRef.group(0) + elif len(runTempRef.group(0))==8: + runref = runTempRef.group(0)[2:8] + else: + print ("No run number in reference filename %s in format XXXXXX or 00XXXXXX given" % tfref.GetName() ) + + print "run number from reference file:\t %s " % runref + + + + + + + #Define "to look at" histograms + histDict = { "jet_electrons_n" : { "LogY" : True, "PosInCanvas" : 1}, + "jet_muons_n" : { "LogY" : False, "PosInCanvas" : 2}, + "jet_tracks_hits_BLayer" : { "LogY" : False, "PosInCanvas" : 3}, + "jet_tracks_hits_Pixel" : { "LogY" : False, "PosInCanvas" : 4}, + "jet_tracks_hits_SCT" : { "LogY" : False, "PosInCanvas" : 5}, + "jet_tracks_n" : { "LogY" : True, "PosInCanvas" : 0}, + "tag_JetProb_w" : { "LogY" : True, "PosInCanvas" : 0}, + "tag_SV0_w" : { "LogY" : True, "PosInCanvas" : 6}, + "tag_COMB_w" : { "LogY" : False, "PosInCanvas" : 7}, + "tag_IP1D_w" : { "LogY" : False, "PosInCanvas" : 0}, + "tag_IP2D_w" : { "LogY" : False, "PosInCanvas" : 0}, + "tag_IP3D_w" : { "LogY" : False, "PosInCanvas" : 8}, + "tag_TrkCnt_w" : { "LogY" : False, "PosInCanvas" : 0}, + "tag_SOFTE_w" : { "LogY" : False, "PosInCanvas" : 0}, + "tag_SOFTM_w" : { "LogY" : False, "PosInCanvas" : 0}, + "track_selector_eff" : { "LogY" : False, "PosInCanvas" : 9} + } + + #list for the test results + KolmogorovResult = [ 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0] + + #histogram with all tracks (to normalise) + ref2d = tf.Get("run_%s/JetTagging/track_selector_all" % run ) + + #open canvas + c2 = ROOT.TCanvas("c2", "Histograms for shifters", 0, 0, 1200, 1000) + c2.Divide(3, 3) + + #iterate through the histograms + for key,value in histDict.iteritems(): + if value["PosInCanvas"] == 0: + continue + print "opening histogram %s" % key + c2.cd(value["PosInCanvas"]) + if key == "track_selector_eff": + #special theatment of 2D histos + + h4 = tf.Get("run_%s/JetTagging/%s" % (run, key)) + if h4 is None : + print "hist ", key, " not found" + h4.Divide(ref2d) + c2.cd(value["PosInCanvas"]) + h4.Draw("colz") + + else: + #all others + + + #get and check entries + h2 = tf.Get("run_%s/JetTagging/%s" % (run, key)) + #h3 = ROOT.TH1F(tfref.Get("run_%s/JetTagging/%s" % (runref, key))) + if h2 is None : + print "hist ", key, " not found" + + h3 = tfref.Get("run_%s/JetTagging/%s" % (runref, key)) + if h3 is None : + print "hist ", key, " not found" + + #c2.cd(value["PosInCanvas"]) + + + + # check if histos have entries and normalise them + if h2.Integral() > 0 and h3.Integral() > 0 : + if value["LogY"]==True: + ROOT.gPad.SetLogy(1) + else: + ROOT.gPad.SetLogy(0) + h2.Scale(1. / h2.Integral()) + h3.Scale(1. / h3.Integral()) + + # compare them + KolmogorovResult[value["PosInCanvas"]] = h3.KolmogorovTest(h2,"M") + print "KolmogorovResult for %s: %g" % (h2.GetName(), KolmogorovResult[value["PosInCanvas"]]) + + #line styling + h3.SetLineColor(2) + h2.SetLineColor(4) + ROOT.gPad.SetFrameFillColor(10) + + # depending on test result the frames got red (all ok), yellow, red (bad result) colour + if(KolmogorovResult[value["PosInCanvas"]] < 0.15): + c2.cd(value["PosInCanvas"]).SetFillColor(3) + elif (KolmogorovResult[value["PosInCanvas"]] < 0.3): + c2.cd(value["PosInCanvas"]).SetFillColor(5) + else: + c2.cd(value["PosInCanvas"]).SetFillColor(2) + + #draw the histos + h2.Draw("") + h3.Draw("same") + else: + print "Integral of % s was 0" % key + h3.SetLineColor(2) + h2.SetLineColor(4) + h2.Draw("") + h3.Draw("same") + + #print "Closed histogram %s" % key + c2.SaveAs("JetTaggingDQ_%s_run-%s.pdf" % ( time.strftime("%Y%m%d", time.localtime()), run)) + + + + + + + + diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/share/switchMon.py b/PhysicsAnalysis/JetTagging/JetTagMonitoring/share/switchMon.py new file mode 100644 index 00000000000..282fc99abf1 --- /dev/null +++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/share/switchMon.py @@ -0,0 +1,47 @@ +### switchMon.py +### +### written by Marcello Barisonzi +### marcello.barisonzi(at)cern.ch +### +### Usage: switch off all other monitoring +### when testing with a transform +### +### Example: +### +### Reco_trf.py inputESDFile=/tmp/mbarison/data10_7TeV.00166142.physics_JetTauEtmiss.merge.ESD.r1774_p327_tid203218_00/ESD.203218._000059.pool.root.1,/tmp/mbarison/data10_7TeV.00166142.physics_JetTauEtmiss.merge.ESD.r1774_p327_tid203218_00/ESD.203218._000542.pool.root.1 autoConfiguration=everything outputHISTFile=myMergedMonitoring.root preExec="execfile(os.path.expanduser('~/switchMon.py'))" +### +### +### +### + +from AthenaMonitoring.DQMonFlags import DQMonFlags + +DQMonFlags.doStreamAwareMon = False + +DQMonFlags.doCTPMon = False +DQMonFlags.doCaloMon = False +DQMonFlags.doEgammaMon = False +DQMonFlags.doGlobalMon = True +DQMonFlags.doHLTMon = False +DQMonFlags.doInDetAlignMon = False +DQMonFlags.doInDetGlobalMon = False +DQMonFlags.doInDetPerfMon = False +DQMonFlags.doJetMon = False +DQMonFlags.doJetTagMon = True +DQMonFlags.doLArMon = False +DQMonFlags.doLVL1CaloMon = False +DQMonFlags.doLucidMon = False +DQMonFlags.doMissingEtMon = False +DQMonFlags.doMuonAlignMon = False +DQMonFlags.doMuonCombinedMon = False +DQMonFlags.doMuonPhysicsMon = False +DQMonFlags.doMuonRawMon = False +DQMonFlags.doMuonSegmentMon = False +DQMonFlags.doMuonTrackMon = False +DQMonFlags.doMuonTrkPhysMon = False +DQMonFlags.doPixelMon = False +DQMonFlags.doSCTMon = False +DQMonFlags.doTRTElectronMon = False +DQMonFlags.doTRTMon = False +DQMonFlags.doTauMon = False +DQMonFlags.doTileMon = False diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitoring.cxx b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitoring.cxx new file mode 100755 index 00000000000..5b115b9db77 --- /dev/null +++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitoring.cxx @@ -0,0 +1,1201 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +//#include "ITrackToVertex/ITrackToVertex.h" +#include "xAODJet/JetContainer.h" +#include "xAODJet/JetAttributes.h" +#include "xAODBTagging/BTagging.h" +#include "xAODEventInfo/EventInfo.h" + +#include "JetTagMonitoring/JetTagMonitoring.h" +#include "JetTagTools/TrackSelector.h" + +#include "xAODTracking/TrackParticle.h" +#include "xAODTracking/TrackParticleContainer.h" + +#include "TrigDecisionTool/TrigDecisionTool.h" +#include "TrkParticleBase/LinkToTrackParticleBase.h" +#include "TrkVertexFitterInterfaces/ITrackToVertexIPEstimator.h" +#include "VxSecVertex/VxSecVKalVertexInfo.h" +#include "VxSecVertex/VxSecVertexInfo.h" + +#include "LArRecEvent/LArEventBitInfo.h" + +#include "LWHists/LWHist.h" +#include "LWHists/TH1F_LW.h" +#include "LWHists/TH2F_LW.h" + +#include "TH1F.h" +#include "TH2F.h" +#include "TMath.h" + +#include <vector> +#include <string> +#include <sstream> + +//** --------------------------------------------------------------------------------------------------------------- **// + +// Private methods + +namespace { + +template< class T > +bool retrieveCollection(const ServiceHandle<StoreGateSvc>& sg, const DataHandle<T>& coll, std::string key ) { + + StatusCode sc; + sc = sg->retrieve( coll, key ); + + if (!sc.isSuccess()) + return false; + + return true; +} + +} // unnamed namespace + + +//** --------------------------------------------------------------------------------------------------------------- **// + + +JetTagMonitoring::JetTagMonitoring(const std::string & type, const std::string & name, const IInterface* parent) : + ManagedMonitorToolBase(type, name, parent), + m_storeGate( "StoreGateSvc", name ), + m_trackSelectorTool("Analysis::TrackSelector"), + m_trackToVertexTool("Reco::TrackToVertex"), + m_histogramsCreated(false), + m_switch_off(false), + m_pixelCondSummarySvc("PixelConditionsSummarySvc",name) +{ + + declareProperty("JetContainer", m_jetName = "AntiKt4TopoJets"); + declareProperty("TrackParticleContainer", m_trackParticleName = "TrackParticleCandidate"); + declareProperty("PrimaryVertexContainer", m_primaryVertexName = "VxPrimaryCandidate"); + + declareProperty("DQcuts", m_do_cuts = true); + + declareProperty("PriVtxTrkMinCut", m_pri_vtx_trk_min_cut = 4 ); + declareProperty("D0_min_cuts", m_trk_d0_min_cut = 0); + declareProperty("D0_max_cuts", m_trk_d0_max_cut = 1); + declareProperty("JetPt_cuts", m_jet_pt_cut = 15e3); + declareProperty("JetEta_cuts", m_jet_eta_cut = 2.5); + declareProperty("nTrk_cuts", m_trk_n = 1); + declareProperty("SV0_weight_cut", m_sv0_weight_cut=0.); + declareProperty("SV1_weight_cut", m_sv1_weight_cut=0.); + declareProperty("SV2_weight_cut", m_sv2_weight_cut=0.); + declareProperty("IP1D_weight_cut", m_ip1d_weight_cut=0.); + declareProperty("IP2D_weight_cut", m_ip2d_weight_cut=0.); + declareProperty("IP3D_weight_cut", m_ip3d_weight_cut=0.); + declareProperty("SV1IP3D_weight_cut", m_sv1ip3d_weight_cut=0.); + declareProperty("JetFitterCOMBNN_weight_cut", m_jfcnn_weight_cut=0.); + declareProperty("MV1_weight_cut", m_mv1_weight_cut=0.601713); + declareProperty("UseTrackSelector", m_use_trackselector = true); + declareProperty("UseTrigDecisionTool", m_use_trigdectool = true); + declareProperty("doLumiBlock", m_doLumiBlock=false); + declareProperty("doStatus", m_doStatus = false); + + m_isNewLumiBlock = false; +} + +//** --------------------------------------------------------------------------------------------------------------- **// + + +JetTagMonitoring::~JetTagMonitoring() {} + + +//** --------------------------------------------------------------------------------------------------------------- **// + + +StatusCode JetTagMonitoring::registerHist(MonGroup& theGroup, TH1* h1) { + + msg(MSG::VERBOSE) << "in JetTagMonitoring::registerHist " << h1->GetName() << endreq; + + StatusCode sc = theGroup.regHist(h1); + if (!sc.isSuccess()) + msg(MSG::WARNING) << "Could not register histogram " << endreq; + + return sc; +} + +//** --------------------------------------------------------------------------------------------------------------- **// + + +StatusCode JetTagMonitoring::registerHist(MonGroup& theGroup, LWHist* h1) { + + msg(MSG::VERBOSE) << "in JetTagMonitoring::registerHist " << h1->GetName() << endreq; + + StatusCode sc = theGroup.regHist(h1); + if (!sc.isSuccess()) + msg(MSG::WARNING) << "Could not register histogram " << endreq; + + return sc; +} + + +//** --------------------------------------------------------------------------------------------------------------- **// + + + + + +//** --------------------------------------------------------------------------------------------------------------- **// + + + + +StatusCode JetTagMonitoring::initialize() { + + msg(MSG::INFO) << "in JetTagMonitoring::initialize" << endreq; + + StatusCode sc = ManagedMonitorToolBase::initialize(); + if (!sc.isSuccess()) { + msg(MSG::WARNING) << "Unable to initialize ManagedMonitorToolBase" << endreq; + return sc; + } + + sc = m_storeGate.retrieve(); + if (!sc.isSuccess()) { + msg(MSG::WARNING) << "Unable to retrieve StoreGateSvc handle" << endreq; + m_switch_off = true; + } + + if ( m_use_trackselector ) { + if ( m_trackSelectorTool.retrieve().isFailure() ) { + msg(MSG::WARNING) << "Failed to retrieve tool " << m_trackSelectorTool << endreq; + m_switch_off = true; + } + } else { + msg(MSG::INFO) << "Analysis::TrackSelector not used" << endreq; + } + + if ( m_switch_off ) + msg(MSG::WARNING) << "Switching off JetTagMonitoring::fillHistograms()" << endreq; + + m_lumiBlockNum = 0; + + return StatusCode::SUCCESS; +} + + +//** --------------------------------------------------------------------------------------------------------------- **// + + +StatusCode JetTagMonitoring::bookHistograms() { + + msg(MSG::DEBUG) << "bookHistograms()" << endreq; + + m_isNewLumiBlock = newLumiBlock; + if ( !newRun ) { + // Only book run-length histogram + return StatusCode::SUCCESS; + } + + + if ( (m_environment != AthenaMonManager::tier0) && + (m_environment != AthenaMonManager::tier0ESD) && + (m_environment != AthenaMonManager::online) ) { + // Only produce histograms from ESD, or from RAW if ESD-only monitoring is not enabled + msg(MSG::INFO) << "Monitoring environment is \'" << m_environment << "\', not booking histograms" << endreq; + return StatusCode::SUCCESS; + } + + if ( m_dataType == AthenaMonManager::cosmics ) { + msg(MSG::INFO) << "Cosmic-ray data, not booking histograms" << endreq; + return StatusCode::SUCCESS; + } + + msg(MSG::INFO) << "Monitoring environment is \'" << m_environment << "\', data type is \'" << m_dataType + << "\', booking histograms now." << endreq; + + + m_monGr_shift = new MonGroup( this, "JetTagging", run ); + m_monGr_LowStat = new MonGroup( this, "JetTagging", lowStat ); + + registerHist(*m_monGr_shift, m_tag_ip2d_w = TH1F_LW::create("tag_IP2D_w","IP2D weight",125,-25.,40.)); + registerHist(*m_monGr_shift, m_tag_ip2d_n = TH1F_LW::create("tag_IP2D_n","IP2D # of tracks",20,0.,20.)); + registerHist(*m_monGr_shift, m_tag_ip2d_b = TH1F_LW::create("tag_IP2D_b","IP2D Pb",10,0.,1.)); + registerHist(*m_monGr_shift, m_tag_ip2d_u = TH1F_LW::create("tag_IP2D_u","IP2D Pu",10,0.,1.)); + registerHist(*m_monGr_shift, m_tag_ip3d_w = TH1F_LW::create("tag_IP3D_w","IP3D weight",195,-25.,40.)); + registerHist(*m_monGr_shift, m_tag_ip3d_n = TH1F_LW::create("tag_IP3D_n","IP3D # of tracks",20,0.,20.)); + registerHist(*m_monGr_shift, m_tag_ip3d_b = TH1F_LW::create("tag_IP3D_b","IP3D Pb",10,0.,1.)); + registerHist(*m_monGr_shift, m_tag_ip3d_u = TH1F_LW::create("tag_IP3D_u","IP3D Pu",10,0.,1.)); + registerHist(*m_monGr_shift, m_tag_sv0_w = TH1F_LW::create("tag_SV0_w","SV0 weight",120,-20.,40.)); + registerHist(*m_monGr_shift, m_tag_sv1_w = TH1F_LW::create("tag_SV1_w","SV1 weight",120,-20.,40.)); + registerHist(*m_monGr_shift, m_tag_sv2_w = TH1F_LW::create("tag_SV2_w","SV2 weight",120,-20.,40.)); + registerHist(*m_monGr_shift, m_tag_lf2d_w = TH1F_LW::create("tag_LF2D_w","LifeTime2D weight",120,-20.,40.)); + registerHist(*m_monGr_shift, m_tag_svbu_w = TH1F_LW::create("tag_SVBU_w","SecVtxTagBU weight",120,-20.,40.)); + registerHist(*m_monGr_shift, m_tag_lhsig_w = TH1F_LW::create("tag_LHSIG_w","lhSig weight",160,-120.,120.)); + registerHist(*m_monGr_shift, m_tag_softm_w = TH1F_LW::create("tag_SOFTM_w","SoftMuonTag weight",120,-20.,40.)); + registerHist(*m_monGr_shift, m_tag_comb_w = TH1F_LW::create("tag_COMB_w","Combined weight IP3D+SV1",120,-2.,10.)); + registerHist(*m_monGr_shift, m_tag_jfcnn_w = TH1F_LW::create("tag_JFCNN_w","Combined weight JetFitterCOMBNN",120,-20.,40.)); + registerHist(*m_monGr_shift, m_tag_mv1_w = TH1F_LW::create("tag_MV1_w","Combined weight MV1",210,-1.,1.1)); + + /* + registerHist(*m_monGr_shift, m_tag_sv0_w_sj = TH1F_LW::create("tag_SV0_w_sj","SV0 weight Suspect Jets",120,-20.,40.)); + registerHist(*m_monGr_shift, m_tag_comb_w_sj = TH1F_LW::create("tag_COMB_w_sj","Combined weight IP3D+SV1 Suspect Jets",120,-20.,40.)); + registerHist(*m_monGr_shift, m_tag_jfcnn_w_sj = TH1F_LW::create("tag_JFCNN_w_sj","Combined weight JetFitterCOMBNN Suspect Jets",120,-20.,40.)); + + registerHist(*m_monGr_shift, m_tag_sv0_w_DMZ1 = TH1F_LW::create("tag_SV0_w_DMZ1","SV0 weight DMZ1",120,-20.,40.)); + registerHist(*m_monGr_shift, m_tag_comb_w_DMZ1 = TH1F_LW::create("tag_COMB_w_DMZ1","Combined weight IP3D+SV1 DMZ1",120,-20.,40.)); + registerHist(*m_monGr_shift, m_tag_jfcnn_w_DMZ1 = TH1F_LW::create("tag_JFCNN_w_DMZ1","Combined weight JetFitterCOMBNN DMZ1",120,-20.,40.)); + registerHist(*m_monGr_shift, m_tag_ip3d_w_DMZ1 = TH1F_LW::create("tag_IP3D_w_DMZ1","Combined weight IP3D DMZ1",120,-21.,40.)); + + registerHist(*m_monGr_shift, m_tag_sv0_w_DMZ2 = TH1F_LW::create("tag_SV0_w_DMZ2","SV0 weight DMZ2",120,-20.,40.)); + registerHist(*m_monGr_shift, m_tag_comb_w_DMZ2 = TH1F_LW::create("tag_COMB_w_DMZ2","Combined weight IP3D+SV1 DMZ2",120,-20.,40.)); + registerHist(*m_monGr_shift, m_tag_jfcnn_w_DMZ2 = TH1F_LW::create("tag_JFCNN_w_DMZ2","Combined weight JetFitterCOMBNN DMZ2",120,-20.,40.)); + + registerHist(*m_monGr_shift, m_tag_ip3d_w_DMZ2 = TH1F_LW::create("tag_IP3D_w_DMZ2","Combined weight IP3D DMZ2",120,-21.,40.)); + registerHist(*m_monGr_shift, m_tag_ip3d_w_DMZ2_x1 = TH1F_LW::create("tag_IP3D_w_DMZ2_x1","Combined weight IP3D DMZ2 x1",120,-21.,40.)); + registerHist(*m_monGr_shift, m_tag_ip3d_w_DMZ2_x2 = TH1F_LW::create("tag_IP3D_w_DMZ2_x2","Combined weight IP3D DMZ2 x2",120,-21.,40.)); + registerHist(*m_monGr_shift, m_tag_ip3d_w_DMZ2_x4 = TH1F_LW::create("tag_IP3D_w_DMZ2_x4","Combined weight IP3D DMZ2 x4",120,-21.,40.)); + registerHist(*m_monGr_shift, m_tag_ip3d_w_DMZ2_x8 = TH1F_LW::create("tag_IP3D_w_DMZ2_x8","Combined weight IP3D DMZ2 x8",120,-21.,40.)); + + registerHist(*m_monGr_shift, m_tag_sv0_w_DMZ3 = TH1F_LW::create("tag_SV0_w_DMZ3","SV0 weight DMZ3",120,-20.,40.)); + registerHist(*m_monGr_shift, m_tag_comb_w_DMZ3 = TH1F_LW::create("tag_COMB_w_DMZ3","Combined weight IP3D+SV1 DMZ3",120,-20.,40.)); + registerHist(*m_monGr_shift, m_tag_jfcnn_w_DMZ3 = TH1F_LW::create("tag_JFCNN_w_DMZ3","Combined weight JetFitterCOMBNN DMZ3",120,-20.,40.)); + + registerHist(*m_monGr_shift, m_tag_ip3d_w_DMZ3 = TH1F_LW::create("tag_IP3D_w_DMZ3","Combined weight IP3D DMZ3",120,-21.,40.)); + registerHist(*m_monGr_shift, m_tag_ip3d_w_DMZ3_x1 = TH1F_LW::create("tag_IP3D_w_DMZ3_x1","Combined weight IP3D DMZ3 x1",120,-21.,40.)); + registerHist(*m_monGr_shift, m_tag_ip3d_w_DMZ3_x2 = TH1F_LW::create("tag_IP3D_w_DMZ3_x2","Combined weight IP3D DMZ3 x2",120,-21.,40.)); + registerHist(*m_monGr_shift, m_tag_ip3d_w_DMZ3_x4 = TH1F_LW::create("tag_IP3D_w_DMZ3_x4","Combined weight IP3D DMZ3 x4",120,-21.,40.)); + registerHist(*m_monGr_shift, m_tag_ip3d_w_DMZ3_x8 = TH1F_LW::create("tag_IP3D_w_DMZ3_x8","Combined weight IP3D DMZ3 x8",120,-21.,40.)); + */ + + registerHist(*m_monGr_shift, m_tag_trkcnt_w = + TH1F_LW::create("tag_TrkCnt_w","TrackCounting2D",120,-20.,40.)); + registerHist(*m_monGr_shift, m_tag_jetprob_w = + TH1F_LW::create("tag_JetProb_w","JetProb",120,0.,1.01)); + + registerHist(*m_monGr_shift, m_jet_n = + TH1F_LW::create("jet_n","number of jets",20,0.,20.)); + + registerHist(*m_monGr_shift, m_global_nPrimVtx = + TH1F_LW::create("global_nPrimVtx","# primary vertex",30,0.,30.)); + registerHist(*m_monGr_shift, m_global_xPrimVtx = + TH1F_LW::create("global_xPrimVtx","x primary vertex",100,-0.5,0.5)); + registerHist(*m_monGr_shift, m_global_yPrimVtx = + TH1F_LW::create("global_yPrimVtx","y primary vertex",100,-1.2,1.2)); + registerHist(*m_monGr_shift, m_global_zPrimVtx = + TH1F_LW::create("global_zPrimVtx","z primary vertex",100,-250.,250.)); + + registerHist(*m_monGr_shift, m_global_BLayerHits = + TH1F_LW::create("global_BLayerHits","# of BLayer hits on TrackParticle",5,0.,5.)); + registerHist(*m_monGr_shift, m_global_PixelHits = + TH1F_LW::create("global_PixelHits","# of Pixel hits on TrackParticle",10,0.,10.)); + registerHist(*m_monGr_shift, m_global_SCTHits = + TH1F_LW::create("global_SCTHits","# of SCT hits on TrackParticle",15,0.,15.)); + registerHist(*m_monGr_shift, m_global_SiHits = + TH1F_LW::create("global_SiHits","# of pixel+SCT hits on TrackParticle",25,0.,25.)); + registerHist(*m_monGr_shift, m_global_TRTHits = + TH1F_LW::create("global_TRTHits","# of TRT hits on TrackParticle",100,0.,100.)); + + registerHist(*m_monGr_shift, m_trackParticle_n = TH1F_LW::create("NTrackParticle","number of TrackParticles",100,0.,1000.)); + + registerHist(*m_monGr_shift, m_jet_nTag = TH1F_LW::create("jet_nTag","# tags",20,0.,20.)); + registerHist(*m_monGr_shift, m_jet_eta = TH1F_LW::create("jet_eta","Jet eta",100,-5.,5.)); + registerHist(*m_monGr_shift, m_jet_phi = TH1F_LW::create("jet_phi","Jet phi",100,-3.15,3.15)); + registerHist(*m_monGr_shift, m_jet_et = TH1F_LW::create("jet_et","Jet et",100,0.,500000.)); + + registerHist(*m_monGr_shift, m_jet_tracks_n = + TH1F_LW::create("jet_tracks_n","# of tracks in a jet",50,0.,50.)); + registerHist(*m_monGr_shift, m_jet_tracks_pt = + TH1F_LW::create("jet_tracks_pt","pT of tracks in a jet",100,0.,100.)); + registerHist(*m_monGr_shift, m_jet_tracks_eta = + TH1F_LW::create("jet_tracks_eta","#eta of tracks in a jet",100,-2.5,2.5)); + registerHist(*m_monGr_shift, m_jet_tracks_phi = + TH1F_LW::create("jet_tracks_phi","#varphi of tracks in a jet",100,-TMath::Pi(),TMath::Pi())); + registerHist(*m_monGr_shift, m_jet_tracks_BLayerHits = + TH1F_LW::create("jet_tracks_hits_BLayer","# of BLayer hits per track in a jet",5,0.,5.)); + registerHist(*m_monGr_shift, m_jet_tracks_PixelHits = + TH1F_LW::create("jet_tracks_hits_Pixel","# of Pixel hits per track in a jet",10,0.,10.)); + registerHist(*m_monGr_shift, m_jet_tracks_SCTHits = + TH1F_LW::create("jet_tracks_hits_SCT","# of SCT hits per track in a jet",15,0.,15.)); + registerHist(*m_monGr_shift, m_jet_muons_n = + TH1F_LW::create("jet_muons_n","# of muons in a jet",10,0.,10.)); + registerHist(*m_monGr_shift, m_jet_muons_pt = + TH1F_LW::create("jet_muons_pt","pT of muons in a jet",100,0.,100.)); + registerHist(*m_monGr_shift, m_jet_electrons_n = + TH1F_LW::create("jet_electrons_n","# of electrons in a jet",10,0.,10.)); + registerHist(*m_monGr_shift, m_jet_electrons_pt = + TH1F_LW::create("jet_electrons_pt","pT of electrons in a jet",100,0.,100.)); + + registerHist(*m_monGr_shift, m_trigPassed = + TH1F_LW::create("trigPassed","Number of events passed trigger chains",25,0.,25.)); + + + m_trigPassed->GetXaxis()->SetBinLabel(1,"L1_J10") ; + m_trigPassed->GetXaxis()->SetBinLabel(2,"L1_J15") ; + m_trigPassed->GetXaxis()->SetBinLabel(3,"L1_J20") ; + m_trigPassed->GetXaxis()->SetBinLabel(4,"L1_J30") ; + m_trigPassed->GetXaxis()->SetBinLabel(5,"L1_J40") ; + m_trigPassed->GetXaxis()->SetBinLabel(6,"L1_J50") ; + m_trigPassed->GetXaxis()->SetBinLabel(7,"L1_J75") ; + m_trigPassed->GetXaxis()->SetBinLabel(8,"L1_J100") ; + m_trigPassed->GetXaxis()->SetBinLabel(9,"L1_J350"); + + m_trigPassed->GetXaxis()->SetBinLabel(10,"L1_3J10"); + m_trigPassed->GetXaxis()->SetBinLabel(11,"L1_3J15"); + m_trigPassed->GetXaxis()->SetBinLabel(12,"L1_3J20"); + m_trigPassed->GetXaxis()->SetBinLabel(13,"L1_3J50"); + m_trigPassed->GetXaxis()->SetBinLabel(14,"L1_3J75"); + m_trigPassed->GetXaxis()->SetBinLabel(15,"L1_4J10"); + m_trigPassed->GetXaxis()->SetBinLabel(16," L1_4J15"); + m_trigPassed->GetXaxis()->SetBinLabel(17,"L1_4J30"); + m_trigPassed->GetXaxis()->SetBinLabel(18,"L1_5J10"); + m_trigPassed->GetXaxis()->SetBinLabel(19,"L1_5J20"); + + m_trigPassed->GetXaxis()->SetBinLabel(20,"EF_mu4_L1J10_matched"); + m_trigPassed->GetXaxis()->SetBinLabel(21,"EF_e24vh_medium1"); + m_trigPassed->GetXaxis()->SetBinLabel(22,"EF_mu18_IDTrkNoCut_tight"); + + m_trigPassed->GetXaxis()->SetBinLabel(23,"L1_RD0_FILLED"); + + + registerHist(*m_monGr_shift, m_cutflow = + TH1F_LW::create("DQ_Cutflow","Number of events passing DQcuts",10,-0.5,9.5)); + + m_cutflow->GetXaxis()->SetBinLabel(1,"All"); + m_cutflow->GetXaxis()->SetBinLabel(2,"Good LAr"); + m_cutflow->GetXaxis()->SetBinLabel(3,"PV present"); + m_cutflow->GetXaxis()->SetBinLabel(4,"PV ntrk"); + + registerHist(*m_monGr_shift, m_priVtx_trks = TH2F_LW::create("priVtx_trks","Tracks PV",21,-0.5,20.5,21,-0.5,20.5)); + + m_priVtx_trks->GetXaxis()->SetTitle("Primary Vertex 0"); + m_priVtx_trks->GetYaxis()->SetTitle("Primary Vertex 1"); + + + + + registerHist(*m_monGr_shift, m_cutflow_jet = + TH1F_LW::create("Jet_Cutflow","Number of jets passed DQcuts",10,-0.5,9.5)); + + m_cutflow_jet->GetXaxis()->SetBinLabel(1,"All"); + m_cutflow_jet->GetXaxis()->SetBinLabel(2,"isGoodJet"); + m_cutflow_jet->GetXaxis()->SetBinLabel(3,"Kinematic Cuts"); + m_cutflow_jet->GetXaxis()->SetBinLabel(4,"Taggable"); + + registerHist(*m_monGr_shift, m_track_selector_eff = TH2F_LW::create("track_selector_eff", "Efficiency of Track Selector Tool;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_track_selector_all = TH2F_LW::create("track_selector_all", "Efficiency of Track Selector Tool;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + //registerHist(*m_monGr_shift, m_track_selector_suspect = TH2F_LW::create("track_selector_suspect", "Efficiency of Track Selector Tool (Suspect Jets)", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + + //2D plots + //secondary vertex based + registerHist(*m_monGr_shift, m_jet_2D_all = TH2F_LW::create("jet_2D_all", "Jet 2D plot (No Cuts);#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_jet_2D_good = TH2F_LW::create("jet_2D_good", "Jet 2D plot (Good Jets);#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_jet_2D_kinematic = TH2F_LW::create("jet_2D_kinematic", "Jet 2D plot (Kinematic Cuts);#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_jet_2D_quality = TH2F_LW::create("jet_2D_quality", "Jet 2D plot (Quality Cuts);#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + //registerHist(*m_monGr_shift, m_jet_2D_suspect = TH2F_LW::create("jet_2D_suspect", "Jet 2D plot (Suspect Jets)", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + + registerHist(*m_monGr_shift, m_sv0_tag_pos_rate_2D = TH2F_LW::create("sv0_tag_pos_rate_2D", "SV0 Tag Positive Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + + registerHist(*m_monGr_shift, m_sv0_tag_neg_rate_2D = TH2F_LW::create("sv0_tag_neg_rate_2D", "SV0 Tag Negative Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + + registerHist(*m_monGr_shift, m_sv1_tag_pos_rate_2D = TH2F_LW::create("sv1_tag_pos_rate_2D", "SV1 Tag Positive Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + + registerHist(*m_monGr_shift, m_sv1_tag_neg_rate_2D = TH2F_LW::create("sv1_tag_neg_rate_2D", "SV1 Tag Negative Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + + registerHist(*m_monGr_shift, m_sv2_tag_pos_rate_2D = TH2F_LW::create("sv2_tag_pos_rate_2D", "SV2 Tag Positive Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + + registerHist(*m_monGr_shift, m_sv2_tag_neg_rate_2D = TH2F_LW::create("sv2_tag_neg_rate_2D", "SV2 Tag Negative Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + + //impact parameter based + registerHist(*m_monGr_shift, m_ip2d_tag_pos_rate_2D = TH2F_LW::create("ip2d_tag_pos_rate_2D", "IP2D Tag Positive Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_ip2d_tag_neg_rate_2D = TH2F_LW::create("ip2d_tag_neg_rate_2D", "IP2D Tag Negative Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_ip3d_tag_pos_rate_2D = TH2F_LW::create("ip3d_tag_pos_rate_2D", "IP3D Tag Positive Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_ip3d_tag_neg_rate_2D = TH2F_LW::create("ip3d_tag_neg_rate_2D", "IP3D Tag Negative Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + + registerHist(*m_monGr_shift, m_ip3d_tag_def_rate_2D = TH2F_LW::create("ip3d_tag_def_rate_2D", "IP3D Tag Default Rate", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + + //MV1 based + registerHist(*m_monGr_shift, m_mv1_tag_pos_rate_2D = TH2F_LW::create("mv1_tag_pos_rate_2D", "MV1 Tag Positive Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_mv1_tag_neg_rate_2D = TH2F_LW::create("mv1_tag_neg_rate_2D", "MV1 Tag Negative Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_mv1_tag_def_rate_2D = TH2F_LW::create("mv1_tag_def_rate_2D", "MV1 Tag Default Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_mv1_tag_def_rate_2D_LS = TH2F_LW::create("mv1_tag_def_rate_2D_LS", "MV1 Tag Default Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + + registerHist(*m_monGr_shift, m_ip3d_tag_def_rate_2D = TH2F_LW::create("ip3d_tag_def_rate_2D", "IP3D Tag Default Rate", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + + registerHist(*m_monGr_shift, m_sv1ip3d_tag_pos_rate_2D = TH2F_LW::create("sv1ip3d_tag_pos_rate_2D", "SV1+IP3D Tag Positive Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_sv1ip3d_tag_neg_rate_2D = TH2F_LW::create("sv1ip3d_tag_neg_rate_2D", "SV1+IP3D Tag Negative Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + + registerHist(*m_monGr_shift, m_jfcnn_tag_pos_rate_2D = TH2F_LW::create("jfcnn_tag_pos_rate_2D", "JetFitterCOMBNN Tag Positive Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_jfcnn_tag_neg_rate_2D = TH2F_LW::create("jfcnn_tag_neg_rate_2D", "JetFitterCOMBNN Tag Negative Rate;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + + registerHist(*m_monGr_shift, m_tracks_all_2D = TH2F_LW::create("tracks_all_2D", "All Tracks", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_tracks_pTMin_2D = TH2F_LW::create("tracks_pTMin_2D", "Tracks Failed pTMin Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_tracks_d0Max_2D = TH2F_LW::create("tracks_d0Max_2D", "Tracks Failed d0Max Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_tracks_z0Max_2D = TH2F_LW::create("tracks_z0Max_2D", "Tracks Failed z0Max Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_tracks_sigd0Max_2D = TH2F_LW::create("tracks_sigd0Max_2D", "Tracks Failed sigd0Max Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_tracks_sigz0Max_2D = TH2F_LW::create("tracks_sigz0Max_2D", "Tracks Failed sigz0Max Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_tracks_etaMax_2D = TH2F_LW::create("tracks_etaMax_2D", "Tracks Failed etaMax Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_tracks_nHitBLayer_2D = TH2F_LW::create("tracks_nHitBLayer_2D", "Tracks Failed nHitBLayer Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_tracks_deadBLayer_2D = TH2F_LW::create("tracks_deadBLayer_2D", "Tracks Failed deadBLayer Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_tracks_nHitPix_2D = TH2F_LW::create("tracks_nHitPix_2D", "Tracks Failed nHitPix Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_tracks_nHitSct_2D = TH2F_LW::create("tracks_nHitSct_2D", "Tracks Failed nHitSct Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_tracks_nHitSi_2D = TH2F_LW::create("tracks_nHitSi_2D", "Tracks Failed nHitSi Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_tracks_nHitTrt_2D = TH2F_LW::create("tracks_nHitTrt_2D", "Tracks Failed nHitTrt Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_tracks_nHitTrtHighE_2D = TH2F_LW::create("tracks_nHitTrtHighE_2D", "Tracks Failed nHitTrtHighE Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_tracks_fitChi2_2D = TH2F_LW::create("tracks_fitChi2_2D", "Tracks Failed fitChi2 Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_tracks_fitProb_2D = TH2F_LW::create("tracks_fitProb_2D", "Tracks Failed fitProb Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_shift, m_tracks_fitChi2OnNdfMax_2D = TH2F_LW::create("tracks_fitChi2OnNdfMax_2D", "Tracks Failed fitChi2OnNdfMax Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + + + /* + Starting to register LowStat histograms: + */ + if ( newRun || newLowStatInterval ) { + registerHist(*m_monGr_LowStat, m_tracks_all_2D_LS = TH2F_LW::create("tracks_all_2D_LS", "All Tracks;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_tracks_pTMin_2D_LS = TH2F_LW::create("tracks_pTMin_2D_LS", "Tracks Failed pTMin Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_tracks_d0Max_2D_LS = TH2F_LW::create("tracks_d0Max_2D_LS", "Tracks Failed d0Max Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_tracks_z0Max_2D_LS = TH2F_LW::create("tracks_z0Max_2D_LS", "Tracks Failed z0Max Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_tracks_sigd0Max_2D_LS = TH2F_LW::create("tracks_sigd0Max_2D_LS", "Tracks Failed sigd0Max Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_tracks_sigz0Max_2D_LS = TH2F_LW::create("tracks_sigz0Max_2D_LS", "Tracks Failed sigz0Max Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_tracks_etaMax_2D_LS = TH2F_LW::create("tracks_etaMax_2D_LS", "Tracks Failed etaMax Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_tracks_nHitBLayer_2D_LS = TH2F_LW::create("tracks_nHitBLayer_2D_LS", "Tracks Failed nHitBLayer Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_tracks_deadBLayer_2D_LS = TH2F_LW::create("tracks_deadBLayer_2D_LS", "Tracks Failed deadBLayer Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_tracks_nHitPix_2D_LS = TH2F_LW::create("tracks_nHitPix_2D_LS", "Tracks Failed nHitPix Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_tracks_nHitSct_2D_LS = TH2F_LW::create("tracks_nHitSct_2D_LS", "Tracks Failed nHitSct Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_tracks_nHitSi_2D_LS = TH2F_LW::create("tracks_nHitSi_2D_LS", "Tracks Failed nHitSi Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_tracks_nHitTrt_2D_LS = TH2F_LW::create("tracks_nHitTrt_2D_LS", "Tracks Failed nHitTrt Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_tracks_nHitTrtHighE_2D_LS = TH2F_LW::create("tracks_nHitTrtHighE_2D_LS", "Tracks Failed nHitTrtHighE Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_tracks_fitChi2_2D_LS = TH2F_LW::create("tracks_fitChi2_2D_LS", "Tracks Failed fitChi2 Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_tracks_fitProb_2D_LS = TH2F_LW::create("tracks_fitProb_2D_LS", "Tracks Failed fitProb Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_tracks_fitChi2OnNdfMax_2D_LS = TH2F_LW::create("tracks_fitChi2OnNdfMax_2D_LS", "Tracks Failed fitChi2OnNdfMax Cut;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + + registerHist(*m_monGr_LowStat, m_ip3d_tag_def_rate_2D_LS = TH2F_LW::create("ip3d_tag_def_rate_2D_LS", "IP3D Tag Default Rate", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_jet_2D_kinematic_LS = TH2F_LW::create("jet_2D_kinematic_LS", "Jet 2D plot (Kinematic Cuts);#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_track_selector_eff_LS = TH2F_LW::create("track_selector_eff_LS", "Efficiency of Track Selector Tool;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + registerHist(*m_monGr_LowStat, m_track_selector_all_LS = TH2F_LW::create("track_selector_all_LS", "Efficiency of Track Selector Tool;#eta;#phi", 25, -2.5, 2.5, 25, -TMath::Pi(), TMath::Pi())); + } + + /* + Ended registering LowStat histograms + */ + + m_histogramsCreated = true; + + return StatusCode::SUCCESS; +} + + +//** --------------------------------------------------------------------------------------------------------------- **// + + +StatusCode JetTagMonitoring::fillHistograms() { + + msg(MSG::DEBUG)<< "fillHistograms()" << endreq; + + if (!m_histogramsCreated) + return StatusCode::SUCCESS; + + if (m_switch_off) + return StatusCode::SUCCESS; + + m_cutflow->Fill(0.); + + const xAOD::EventInfo* thisEventInfo; + if (evtStore()->retrieve(thisEventInfo).isFailure()) + msg(MSG::WARNING)<< "Cannot retrieve EventInfo" << endreq; + + m_lumiBlockNum = thisEventInfo->lumiBlock(); + + msg(MSG::DEBUG) << "Lumiblock ID: " << m_lumiBlockNum << endreq; + + //////////////////////////////// + //* skip events with bad LAr *// + //////////////////////////////// + + if ( thisEventInfo->isEventFlagBitSet(xAOD::EventInfo::LAr, LArEventBitInfo::BADFEBS) ) { + msg(MSG::DEBUG) << "Bad LAr event: True" << endreq; + return StatusCode::SUCCESS; + } + + m_cutflow->Fill(1.); + + + + /////////////////////////////// + //* Trigger container *// + /////////////////////////////// + + msg(MSG::DEBUG) << "TrigDecTool: " << m_trigDecTool << endreq; + + if (m_use_trigdectool && m_trigDecTool != 0) { + if (m_trigDecTool->isPassed("L1_J10")) m_trigPassed->Fill(0.); + if (m_trigDecTool->isPassed("L1_J15")) m_trigPassed->Fill(1.); + if (m_trigDecTool->isPassed("L1_J20")) m_trigPassed->Fill(2.); + if (m_trigDecTool->isPassed("L1_J30")) m_trigPassed->Fill(3.); + if (m_trigDecTool->isPassed("L1_J40")) m_trigPassed->Fill(4.); + if (m_trigDecTool->isPassed("L1_J50")) m_trigPassed->Fill(5.); + if (m_trigDecTool->isPassed("L1_J75")) m_trigPassed->Fill(6.); + if (m_trigDecTool->isPassed("L1_J100")) m_trigPassed->Fill(7.); + if (m_trigDecTool->isPassed("L1_J350")) m_trigPassed->Fill(8.); + if (m_trigDecTool->isPassed("L1_3J10")) m_trigPassed->Fill(9.); + if (m_trigDecTool->isPassed("L1_3J15")) m_trigPassed->Fill(10.); + if (m_trigDecTool->isPassed("L1_3J20")) m_trigPassed->Fill(11.); + if (m_trigDecTool->isPassed("L1_3J50")) m_trigPassed->Fill(12.); + if (m_trigDecTool->isPassed("L1_3J75")) m_trigPassed->Fill(13.); + if (m_trigDecTool->isPassed("L1_4J10")) m_trigPassed->Fill(14.); + if (m_trigDecTool->isPassed("L1_4J15")) m_trigPassed->Fill(15.); + if (m_trigDecTool->isPassed("L1_4J30")) m_trigPassed->Fill(16.); + if (m_trigDecTool->isPassed("L1_5J10")) m_trigPassed->Fill(17.); + if (m_trigDecTool->isPassed("L1_5J20")) m_trigPassed->Fill(18.); + + + if (m_trigDecTool->isPassed("EF_mu4_L1J10_matched")) m_trigPassed->Fill(19.); + if (m_trigDecTool->isPassed("EF_e24vh_medium1")) m_trigPassed->Fill(20.); + if (m_trigDecTool->isPassed("EF_mu18_IDTrkNoCut_tight")) m_trigPassed->Fill(21.); + + if (m_trigDecTool->isPassed("L1_RD0_FILLED")) m_trigPassed->Fill(22.); + } + + ////////////////////// + //* Primary vertex *// + ////////////////////// + + unsigned int npv = 0, npv_trk = 0, nsv_trk = 0; + double xpv = 0., ypv = 0., zpv = 0.; + + const DataHandle<VxContainer> vxContainer; + bool foundPrimaryVtx = retrieveCollection(m_storeGate, vxContainer, m_primaryVertexName); + + if (!foundPrimaryVtx) { + + msg(MSG::WARNING) << "Unable to retrieve \"" << m_primaryVertexName << "\" from StoreGate" << endreq; + + return StatusCode::SUCCESS; + } + + msg(MSG::DEBUG)<< "VxContainer \"" << m_primaryVertexName << "\" found with " << vxContainer->size() << " entries" << endreq; + + npv = vxContainer->size(); + m_global_nPrimVtx->Fill((float)npv); + + if (vxContainer->size() < 1) { + msg(MSG::WARNING) << "No primary vertices reconstructed" << endreq; + return StatusCode::SUCCESS; + } + + m_cutflow->Fill(2.); + + m_priVtx = vxContainer->at(0); + + npv_trk = m_priVtx->vxTrackAtVertex()->size(); + + msg(MSG::DEBUG) << "PV tracks: " << npv_trk << endreq; + + const Trk::RecVertex& primaryRecVertex = m_priVtx->recVertex(); + + xpv = primaryRecVertex.position().x(); + ypv = primaryRecVertex.position().y(); + zpv = primaryRecVertex.position().z(); + + m_global_xPrimVtx->Fill(xpv); + m_global_yPrimVtx->Fill(ypv); + m_global_zPrimVtx->Fill(zpv); + + msg(MSG::DEBUG)<< "primary vertex: x = " << xpv << ", y = " << ypv << ", z = " << zpv << endreq; + + if (xpv == 0 && ypv == 0 && zpv == 0) + msg(MSG::WARNING) << "Primary Vertex is (0,0,0)" << endreq; + + /* store the number of tracks of the second PV candidate, if any */ + if ( vxContainer->size() > 1 ) { + nsv_trk = vxContainer->at(1)->vxTrackAtVertex()->size(); + } + + m_priVtx_trks->Fill(npv_trk, nsv_trk); + + // check first PV > 4 tracks, if not, bail + if ( npv_trk < m_pri_vtx_trk_min_cut ) + return StatusCode::SUCCESS; + + m_cutflow->Fill(3.); + +// double vtxChiSq = primaryRecVertex.fitQuality().chiSquared(); +// int vtxNDoF = primaryRecVertex.fitQuality().numberDoF(); + +// double vtxProb = vtxChiSq / vtxNDoF; + + /* Fill Jet-based histograms */ + + fillJetHistograms(); + + /////////////////////////////// + //* TrackParticle container *// + /////////////////////////////// + + const DataHandle<xAOD::TrackParticleContainer> trackParticles; + bool foundTrackPartColl = retrieveCollection(m_storeGate, trackParticles, m_trackParticleName); + + if (!foundTrackPartColl) { + + msg(MSG::WARNING) << "Unable to retrieve \"" << m_trackParticleName << "\" from StoreGate" << endreq; + + return StatusCode::SUCCESS; + + } + + msg(MSG::DEBUG) << "TrackParticleContainer \"" << m_trackParticleName << "\" found with " << trackParticles->size() << " entries" << endreq; + + xAOD::TrackParticleContainer::const_iterator trackParticleItr = trackParticles->begin(); + xAOD::TrackParticleContainer::const_iterator trackParticleEnd = trackParticles->end(); + + // New for Release 19: summary information is filled by reference, with a boolean Pass/Fail check... + + uint8_t nPixHits = 0; + uint8_t nSCTHits = 0; + uint8_t nSiHits = 0; + uint8_t nBLayerHits = 0; + uint8_t nTRTHits = 0; + + for ( ; trackParticleItr != trackParticleEnd; trackParticleItr++) { + + if ((*trackParticleItr)->summaryValue(nBLayerHits, xAOD::numberOfBLayerHits)) { m_global_BLayerHits->Fill((float) nBLayerHits); } + if ((*trackParticleItr)->summaryValue(nPixHits, xAOD::numberOfPixelHits)) { m_global_PixelHits->Fill((float) nPixHits); } + if ((*trackParticleItr)->summaryValue(nSCTHits, xAOD::numberOfSCTHits)) { m_global_SCTHits->Fill((float) nSCTHits); } + if ((*trackParticleItr)->summaryValue(nTRTHits, xAOD::numberOfTRTHits)) { m_global_TRTHits->Fill((float) nTRTHits); } + + // too complicated to set up a check at this point... thank you framework! + nSiHits = nPixHits + nSCTHits; + m_global_SiHits->Fill((float)nSiHits); + nSiHits = 0; // clean up value for next round... + } + + m_trackParticle_n->Fill((*trackParticles).size()); + + msg(MSG::DEBUG) << "end of fillHistograms()" << endreq; + + return StatusCode::SUCCESS; +} + + +bool JetTagMonitoring::applyKinematicCuts(const xAOD::Jet *jet) { + + msg(MSG::DEBUG) << "applyKinematicCuts()" << endreq; + + //* get jet basic kinematics *// + CLHEP::HepLorentzVector p4(jet->px(),jet->py(),jet->pz(),jet->e()); + + m_jet_eta->Fill(p4.pseudoRapidity()); + m_jet_phi->Fill(p4.phi()); + m_jet_et->Fill(p4.et()); + + msg(MSG::DEBUG) << "BJet kinematics: eta = " << p4.pseudoRapidity() + << ", phi= " << p4.phi() << ", pT= " << p4.perp() + << endreq; + + + // kinematic cuts defined as properties + if ( jet->pt() < m_jet_pt_cut || fabs(jet->eta()) > m_jet_eta_cut ) + return false; + + return true; +} + + +JetTagMonitoring::Jet_t JetTagMonitoring::applyQualityCuts(const xAOD::Jet *jet) { + + msg(MSG::DEBUG) << "in applyQualityCuts()" << endreq; + + /* if TrackSelector not used, return true */ + if ( ! m_use_trackselector ) { + msg(MSG::DEBUG) << "Not running track selection" << endreq; + return goodJet; + } + + msg(MSG::DEBUG) << "Running track selection" << endreq; + + unsigned int nTrk = 0, nTrk_JetProb = 0; + + // std::vector<InDet::TrackStateOnBLayerInfo> bInfo; + m_track_selector_all->Fill(jet->eta(), jet->phi(), 1.); + m_track_selector_all_LS->Fill(jet->eta(), jet->phi(), 1.); + //Work around, but compared to _all not needed. + // m_track_selector_eff->Fill(jet->eta(), jet->phi(), 1.); + + m_trackSelectorTool->primaryVertex(m_priVtx->recVertex().position()); + m_trackSelectorTool->prepare(); + + std::vector<const xAOD::IParticle*> trackVector = jet->getAssociatedObjects<xAOD::IParticle>(xAOD::JetAttribute::GhostTrack); + + bool isSuspectJet = false; + + std::vector<const xAOD::IParticle*>::const_iterator trkItr; + + for ( trkItr = trackVector.begin(); trkItr != trackVector.end() ; trkItr++ ) { + + const xAOD::TrackParticle* trackPart = dynamic_cast<const xAOD::TrackParticle*>(*trkItr); + + double trk_eta = trackPart->eta(); + double trk_phi = trackPart->phi(); + + m_tracks_all_2D->Fill(trk_eta, trk_phi, 1.); + m_tracks_all_2D_LS->Fill(trk_eta, trk_phi, 1.); + + if ( m_trackSelectorTool->selectTrack(trackPart) ) { + + nTrk++; + + double trk_d0 = trackPart->d0(); + + if (trk_d0 > m_trk_d0_min_cut && trk_d0 < m_trk_d0_max_cut) + nTrk_JetProb++; + + } else { + const std::bitset<16> failedCuts = m_trackSelectorTool->currentTrackpassedCuts(); + fillBadTrackBits(failedCuts, trk_eta, trk_phi); + + if ( failedCuts[deadBLayer] || failedCuts[nHitBLayer] || failedCuts[nHitSi] ) + isSuspectJet = true; + } + + } + + + msg(MSG::DEBUG) << "Good tracks: " << nTrk << endreq; + + if ( nTrk_JetProb > m_trk_n ) { + + const xAOD::BTagging* btag = jet->btagging(); + + // get JetFitter b probability + double myTagValue = btag->JetFitter_pb(); + m_tag_jetprob_w->Fill(myTagValue ); + + } + if ( nTrk < m_trk_n ) + return badJet; + + m_track_selector_eff_LS->Fill(jet->eta(), jet->phi(), 1.); + + if ( isSuspectJet ) + return suspectJet; + + return goodJet; + +} + + +StatusCode JetTagMonitoring::procHistograms() { + + msg(MSG::DEBUG) << "in procHistograms()" << endreq; + + /* Finalize the histograms */ + if ( endOfRun && m_histogramsCreated ) { + + m_track_selector_eff->getROOTHist()->Divide(m_track_selector_all->getROOTHist(),m_tracks_all_2D->getROOTHist()); + } + msg(MSG::DEBUG) << "Exiting from procHistograms()" << endreq; + return StatusCode::SUCCESS; +} + + +void JetTagMonitoring::fillJetHistograms() { + + msg(MSG::DEBUG) << "in fillJetHistograms()" << endreq; + + ///////////////////// + //* Jet container *// + ///////////////////// + + const DataHandle<xAOD::JetContainer> jets; + bool foundJetColl = retrieveCollection(m_storeGate, jets, m_jetName); + + if (!foundJetColl) { + + msg(MSG::WARNING) << "Unable to retrieve \"" << m_jetName << "\" from StoreGate" << endreq; + + return; + + } + + msg(MSG::DEBUG) << "JetContainer \"" << m_jetName << "\" found with " << jets->size() << " entries" << endreq; + + xAOD::JetContainer::const_iterator jetItr = jets->begin(); + xAOD::JetContainer::const_iterator jetEnd = jets->end(); + + m_jet_n->Fill((*jets).size()); + + for ( ; jetItr != jetEnd; jetItr++) { + + m_cutflow_jet->Fill(0.); + + m_jet_2D_all->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + + if( !isGoodJet(*jetItr) ) continue; + + m_cutflow_jet->Fill(1.); + + m_jet_2D_good->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + + if ( !applyKinematicCuts(*jetItr) ) continue; + + m_jet_2D_kinematic->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + m_jet_2D_kinematic_LS->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + + m_cutflow_jet->Fill(2.); + + //* get information about Track Constituents *// + fillTrackInJetHistograms(*jetItr); + + const xAOD::BTagging* btag =(*jetItr)->btagging(); + + double ip3d = btag->IP3D_pb(); + double sv0 = btag->SV0_significance3D(); + double sv1 = btag->SV1_pb(); + double combNN = btag->JetFitter_pb(); + double mv1 = btag->MV1_discriminant(); + + /* fill the 2D SV0 rate */ + if ( sv0 > m_sv0_weight_cut ) { + m_sv0_tag_pos_rate_2D->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + } else { + m_sv0_tag_neg_rate_2D->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + } + + /* fill the 2D SV1 rate */ + if ( sv1 > m_sv1_weight_cut ) { + m_sv1_tag_pos_rate_2D->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + } else { + m_sv1_tag_neg_rate_2D->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + } + + /* fill the 2D IP3D rate */ + if ( ip3d > m_ip3d_weight_cut ) { + m_ip3d_tag_pos_rate_2D->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + } else if ( ip3d < -20 ) { + m_ip3d_tag_def_rate_2D->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + m_ip3d_tag_def_rate_2D_LS->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + } else { + m_ip3d_tag_neg_rate_2D->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + } + + /* fill the 2D MV1 rate */ + if ( mv1 > m_mv1_weight_cut ) { + m_mv1_tag_pos_rate_2D->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + } else if ( mv1 <= 0. ) { + m_mv1_tag_def_rate_2D->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + m_mv1_tag_def_rate_2D_LS->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + } else { + m_mv1_tag_neg_rate_2D->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + } + + /* fill the 2D JetFitterCOMBNN rate */ + if ( combNN > m_jfcnn_weight_cut ) { + m_jfcnn_tag_pos_rate_2D->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + } else { + m_jfcnn_tag_neg_rate_2D->Fill((*jetItr)->eta(), (*jetItr)->phi(), 1.); + } + + msg(MSG::DEBUG)<< "btagging weights: \n" + + << " SV0: " << sv0 << " SV1: " << sv1 << "\n" + << " IP3D: " << ip3d << "\n" + << " JetFitterCOMBNN: " << combNN << "\n" + << " MV1: "<< mv1 <<endreq; + + Jet_t quality = applyQualityCuts(*jetItr); + + if ( m_do_cuts && quality == badJet ) continue; + + m_cutflow_jet->Fill(3.); + + if ( quality == goodJet ) + fillGoodJetHistos(*jetItr); + //else if ( quality == suspectJet ) + // fillSuspectJetHistos(*jetItr); + + //* MOAR PLOTS! *// + fillDetailedHistograms(*jetItr); + + //* get information about Electron Constituents *// + //fillElectronHistograms(*jetItr); + + //* get information about Muon Constituents *// + //fillMuonHistograms(*jetItr); + + } + + + return; +} + +/* Soft Electron tagger no longer maintained +void JetTagMonitoring::fillElectronHistograms(const xAOD::Jet *jet) { + + // get information about Electron Constituents // + + msg(MSG::DEBUG) << "in fillElectronHistograms()" << endreq; + + int nElInJet = 0; + + const Analysis::ElectronAssociation *elInJet = jet->getAssociation<Analysis::ElectronAssociation>("Electrons"); + + // loop over electrons in a jet // + if (elInJet) { + nElInJet = elInJet->size(); + + Navigable<ElectronContainer,double>::object_iter elItr = elInJet->begin(); + for ( ; elItr != elInJet->end(); ++elItr) { + m_jet_electrons_pt->Fill((*elItr)->pt()/1000.); + } + } + + m_jet_electrons_n->Fill((float)nElInJet); + + return; +} +*/ + +/* Soft Muon tagger no longer maintained +void JetTagMonitoring::fillMuonHistograms(const xAOD::Jet *jet) { + + msg(MSG::DEBUG) << "in fillMuonHistograms()" << endreq; + + // get information about Muon Constituents // + int nMuInJet = 0; + + const Analysis::MuonAssociation *muInJet = jet->getAssociation<Analysis::MuonAssociation>("Muons"); + + // loop over muons in a jet // + if (muInJet) { + + nMuInJet = muInJet->size(); + + Navigable<Analysis::MuonContainer,double>::object_iter muItr = muInJet->begin(); + for ( ; muItr != muInJet->end(); ++muItr) { + m_jet_muons_pt->Fill((*muItr)->pt()/1000.); + } + } + + + m_jet_muons_n->Fill((float)nMuInJet); + + return; +} +*/ + +void JetTagMonitoring::fillTrackInJetHistograms(const xAOD::Jet *jet) { + + msg(MSG::DEBUG) << "in fillInJetTrackHistograms()" << endreq; + + //* get information about Track Constituents *// + int nTrkInJet = 0; + + std::vector<const xAOD::IParticle*> trackVector = jet->getAssociatedObjects<xAOD::IParticle>(xAOD::JetAttribute::GhostTrack); + + std::vector<const xAOD::IParticle*>::const_iterator trkItr; + + nTrkInJet = trackVector.size(); + msg(MSG::DEBUG) << "examining " << nTrkInJet << " tracks." << endreq; + + // loop over tracks in a jet // + for ( trkItr = trackVector.begin(); trkItr != trackVector.end() ; trkItr++ ) { + + const xAOD::TrackParticle* trackPart = dynamic_cast<const xAOD::TrackParticle*>(*trkItr); + + uint8_t nBLayerHits = 0; + uint8_t nPixHits = 0; + uint8_t nSCTHits = 0; + + m_jet_tracks_pt->Fill(trackPart->pt()/1000.); + m_jet_tracks_eta->Fill(trackPart->eta()); + m_jet_tracks_phi->Fill(trackPart->phi()); + + if (trackPart->summaryValue(nBLayerHits, xAOD::numberOfBLayerHits)) { m_jet_tracks_BLayerHits->Fill((float) nBLayerHits); } + if (trackPart->summaryValue(nPixHits, xAOD::numberOfPixelHits)) { m_jet_tracks_PixelHits->Fill((float) nPixHits); } + if (trackPart->summaryValue(nSCTHits, xAOD::numberOfSCTHits)) { m_jet_tracks_SCTHits->Fill((float) nSCTHits); } + + } + + m_jet_tracks_n->Fill((float)nTrkInJet); + + return; +} + +void JetTagMonitoring::fillDetailedHistograms(const xAOD::Jet *jet) { + + msg(MSG::DEBUG) << "in fillDetailedHistograms()" << endreq; + + //* get detailed information *// + const xAOD::BTagging* btag = jet->btagging(); + + + //* detailed information for impact parameter-based informations *// + unsigned int ntrk = btag->nIP3D_TrackParticles(); // number of tracks used for tagging in the jet + double pb = btag->IP3D_pb(); // b likelihood + double pu = btag->IP3D_pu(); // u likelihood + + m_tag_ip3d_n->Fill((float)ntrk); + m_tag_ip3d_b->Fill(pb); + m_tag_ip3d_u->Fill(pu); + + msg(MSG::VERBOSE) << "InfoBase for IP3D: #tracks = " << ntrk + << ", Pb = " << pb << ", Pu = " << pu << endreq; + + return; +} + + +void JetTagMonitoring::fillBadTrackBits(const std::bitset<16> failedCuts, double eta, double phi) { + + if ( failedCuts[pTMin] ) m_tracks_pTMin_2D->Fill(eta, phi, 1.); + if ( failedCuts[d0Max] ) m_tracks_d0Max_2D->Fill(eta, phi, 1.); + if ( failedCuts[z0Max] ) m_tracks_z0Max_2D->Fill(eta, phi, 1.); + if ( failedCuts[sigd0Max] ) m_tracks_sigd0Max_2D->Fill(eta, phi, 1.); + if ( failedCuts[sigz0Max] ) m_tracks_sigz0Max_2D->Fill(eta, phi, 1.); + if ( failedCuts[etaMax] ) m_tracks_etaMax_2D->Fill(eta, phi, 1.); + if ( failedCuts[nHitBLayer] ) m_tracks_nHitBLayer_2D->Fill(eta, phi, 1.); + if ( failedCuts[deadBLayer] ) m_tracks_deadBLayer_2D->Fill(eta, phi, 1.); + if ( failedCuts[nHitPix] ) m_tracks_nHitPix_2D->Fill(eta, phi, 1.); + if ( failedCuts[nHitSct] ) m_tracks_nHitSct_2D->Fill(eta, phi, 1.); + if ( failedCuts[nHitSi] ) m_tracks_nHitSi_2D->Fill(eta, phi, 1.); + if ( failedCuts[nHitTrt] ) m_tracks_nHitTrt_2D->Fill(eta, phi, 1.); + if ( failedCuts[nHitTrtHighE] ) m_tracks_nHitTrtHighE_2D->Fill(eta, phi, 1.); + if ( failedCuts[fitChi2] ) m_tracks_fitChi2_2D->Fill(eta, phi, 1.); + if ( failedCuts[fitProb] ) m_tracks_fitProb_2D->Fill(eta, phi, 1.); + if ( failedCuts[fitChi2OnNdfMax] ) m_tracks_fitChi2OnNdfMax_2D->Fill(eta, phi, 1.); + + + if ( failedCuts[pTMin] ) m_tracks_pTMin_2D_LS->Fill(eta, phi, 1.); + if ( failedCuts[d0Max] ) m_tracks_d0Max_2D_LS->Fill(eta, phi, 1.); + if ( failedCuts[z0Max] ) m_tracks_z0Max_2D_LS->Fill(eta, phi, 1.); + if ( failedCuts[sigd0Max] ) m_tracks_sigd0Max_2D_LS->Fill(eta, phi, 1.); + if ( failedCuts[sigz0Max] ) m_tracks_sigz0Max_2D_LS->Fill(eta, phi, 1.); + if ( failedCuts[etaMax] ) m_tracks_etaMax_2D_LS->Fill(eta, phi, 1.); + if ( failedCuts[nHitBLayer] ) m_tracks_nHitBLayer_2D_LS->Fill(eta, phi, 1.); + if ( failedCuts[deadBLayer] ) m_tracks_deadBLayer_2D_LS->Fill(eta, phi, 1.); + if ( failedCuts[nHitPix] ) m_tracks_nHitPix_2D_LS->Fill(eta, phi, 1.); + if ( failedCuts[nHitSct] ) m_tracks_nHitSct_2D_LS->Fill(eta, phi, 1.); + if ( failedCuts[nHitSi] ) m_tracks_nHitSi_2D_LS->Fill(eta, phi, 1.); + if ( failedCuts[nHitTrt] ) m_tracks_nHitTrt_2D_LS->Fill(eta, phi, 1.); + if ( failedCuts[nHitTrtHighE] ) m_tracks_nHitTrtHighE_2D_LS->Fill(eta, phi, 1.); + if ( failedCuts[fitChi2] ) m_tracks_fitChi2_2D_LS->Fill(eta, phi, 1.); + if ( failedCuts[fitProb] ) m_tracks_fitProb_2D_LS->Fill(eta, phi, 1.); + if ( failedCuts[fitChi2OnNdfMax] ) m_tracks_fitChi2OnNdfMax_2D_LS->Fill(eta, phi, 1.); + + + return; + +} + +void JetTagMonitoring::fillGoodJetHistos(const xAOD::Jet *jet) { + + m_jet_2D_quality->Fill(jet->eta(), jet->phi(), 1.); + + const xAOD::BTagging* btag = jet->btagging(); + + double ip3d = btag->IP3D_pb(); + double sv0 = btag->SV0_significance3D(); + double sv1 = btag->SV1_pb(); + double combNN = btag->JetFitter_pb(); + double mv1 = btag->MV1_discriminant(); + + m_tag_ip3d_w->Fill(ip3d); + m_tag_mv1_w->Fill(mv1); + m_tag_sv0_w->Fill(sv0); + m_tag_sv1_w->Fill(sv1); + m_tag_jfcnn_w->Fill(combNN); + + return; + +} + +/* should mimick as close as possible the same function from Reconstruction/Jet/JetMonitoring/src/JetRecMonToolBase.cxx */ + +bool JetTagMonitoring::isGoodJet(const xAOD::Jet *jet){ + + if (msgLvl(MSG::DEBUG)) + msg(MSG::DEBUG) << "in dq cleaning cuts JetTagMon" << endreq; + + bool pass_cuts = false; + + float jetQuality = jet->getAttribute<float>(xAOD::JetAttribute::LArQuality); + float jetTime = jet->getAttribute<float>(xAOD::JetAttribute::Timing); + float hecq = jet->getAttribute<float>(xAOD::JetAttribute::HECQuality); + float negE = jet->getAttribute<float>(xAOD::JetAttribute::NegativeE); + float chf = jet->getAttribute<float>(xAOD::JetAttribute::SumPtTrkPt1000)/jet->pt(); + float emf = jet->getAttribute<float>(xAOD::JetAttribute::EMFrac); + float hecf = jet->getAttribute<float>(xAOD::JetAttribute::HECFrac); + //int SamplingMax = CaloSampling::Unknown; + float fracSamplingMax = jet->getAttribute<float>(xAOD::JetAttribute::FracSamplingMax); + + if ( + !( + (hecf>0.5 && fabs(hecq)>0.5) || (fabs(negE) > 60*CLHEP::GeV) || + (emf>0.95 && fabs(jetQuality)>0.8 && fabs(jet->eta()) < 2.8) || + //(n90<=5 && hecf>0.8) || (hecf>0.5 && fabs(jetQuality)>0.5) || (emf<0.05) || + (fabs(jetTime)>25) || + (emf<0.05 && chf<0.05 && fabs(jet->eta())<2) || + (emf<0.05 && fabs(jet->eta())>= 2) || + (fracSamplingMax>0.99 && fabs(jet->eta())<2) + ) + ){ + pass_cuts = true; + } + + return pass_cuts; + +} + +/* +void JetTagMonitoring::fillSuspectJetHistos(const xAOD::Jet *jet) { + + float sv0 = jet->getFlavourTagWeight("SV0"); + float comb = jet->getFlavourTagWeight(); // combination of IP3D and SV1 + float combNN = jet->getFlavourTagWeight("JetFitterCOMBNN"); + + m_jet_2D_suspect->Fill(jet->eta(), jet->phi(), 1.); + + m_track_selector_suspect->Fill(jet->eta(), jet->phi(), 1.); + + m_tag_sv0_w_sj->Fill(sv0); + m_tag_comb_w_sj->Fill(comb); + m_tag_jfcnn_w_sj->Fill(combNN); + + return; + +} + + +void JetTagMonitoring::fillBadZone(int zone, double ip3d) { + + if( zone == 1 ) { + m_tag_ip3d_w_DMZ2_x1->Fill(ip3d, 1.); + m_tag_ip3d_w_DMZ2_x2->Fill(ip3d, 1.); + m_tag_ip3d_w_DMZ2_x4->Fill(ip3d, 1.); + m_tag_ip3d_w_DMZ2_x8->Fill(ip3d, 1.); + + m_tag_ip3d_w_DMZ3_x1->Fill(ip3d, 1.); + m_tag_ip3d_w_DMZ3_x2->Fill(ip3d, 1.); + m_tag_ip3d_w_DMZ3_x4->Fill(ip3d, 1.); + m_tag_ip3d_w_DMZ3_x8->Fill(ip3d, 1.); + } + else if ( zone == 2 ) { + m_tag_ip3d_w_DMZ2_x1->Fill(ip3d, 1.); + m_tag_ip3d_w_DMZ2_x2->Fill(ip3d, 2.); + m_tag_ip3d_w_DMZ2_x4->Fill(ip3d, 4.); + m_tag_ip3d_w_DMZ2_x8->Fill(ip3d, 8.); + + m_tag_ip3d_w_DMZ3_x1->Fill(ip3d, 1.); + m_tag_ip3d_w_DMZ3_x2->Fill(ip3d, 1.); + m_tag_ip3d_w_DMZ3_x4->Fill(ip3d, 1.); + m_tag_ip3d_w_DMZ3_x8->Fill(ip3d, 1.); + } + else if ( zone == 3 ) { + m_tag_ip3d_w_DMZ2_x1->Fill(ip3d, 1.); + m_tag_ip3d_w_DMZ2_x2->Fill(ip3d, 1.); + m_tag_ip3d_w_DMZ2_x4->Fill(ip3d, 1.); + m_tag_ip3d_w_DMZ2_x8->Fill(ip3d, 1.); + + m_tag_ip3d_w_DMZ3_x1->Fill(ip3d, 1.); + m_tag_ip3d_w_DMZ3_x2->Fill(ip3d, 2.); + m_tag_ip3d_w_DMZ3_x4->Fill(ip3d, 4.); + m_tag_ip3d_w_DMZ3_x8->Fill(ip3d, 8.); + } + + return; + +} +*/ diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/components/JetTagMonitoring_entries.cxx b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/components/JetTagMonitoring_entries.cxx new file mode 100755 index 00000000000..0b1cb9e4a01 --- /dev/null +++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/components/JetTagMonitoring_entries.cxx @@ -0,0 +1,10 @@ +#include "GaudiKernel/DeclareFactoryEntries.h" +#include "JetTagMonitoring/JetTagMonitoring.h" + +DECLARE_TOOL_FACTORY( JetTagMonitoring ) + +DECLARE_FACTORY_ENTRIES( JetTagMonitoring ) { + + DECLARE_ALGTOOL( JetTagMonitoring ) + +} diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/components/JetTagMonitoring_load.cxx b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/components/JetTagMonitoring_load.cxx new file mode 100755 index 00000000000..e6e758a9093 --- /dev/null +++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/components/JetTagMonitoring_load.cxx @@ -0,0 +1,3 @@ +#include "GaudiKernel/LoadFactoryEntries.h" + +LOAD_FACTORY_ENTRIES( JetTagMonitoring ) -- GitLab