From aac88cbbf63b456fa7e3da2eda9369ea12ed99ed Mon Sep 17 00:00:00 2001
From: Alessandro Lapertosa <alessandro.lapertosa@cern.ch>
Date: Fri, 18 Oct 2019 08:36:01 +0000
Subject: [PATCH] Update JetTagging monitoring in r22

---
 .../python/AthenaMonitoringCfg.py             |    9 +-
 .../JetTagMonitoring/CMakeLists.txt           |    4 +-
 .../config/jetTag_collisions_run.config       |   75 --
 .../python/JetTagMonitorAlgorithm.py          |  343 ++++++
 .../JetTagMonitoring/share/JetTagging_test.cc |  523 ---------
 .../JetTagMonitoring/share/JetTagging_test.py |  174 ---
 .../JetTagMonitoring/share/switchMon.py       |   47 -
 .../src/JetTagMonitorAlgorithm.cxx            | 1029 +++++++++++++++++
 .../src/JetTagMonitorAlgorithm.h              |  111 ++
 .../components/JetTagMonitoring_entries.cxx   |    3 +-
 10 files changed, 1494 insertions(+), 824 deletions(-)
 delete mode 100644 PhysicsAnalysis/JetTagging/JetTagMonitoring/config/jetTag_collisions_run.config
 create mode 100644 PhysicsAnalysis/JetTagging/JetTagMonitoring/python/JetTagMonitorAlgorithm.py
 delete mode 100644 PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagging_test.cc
 delete mode 100644 PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagging_test.py
 delete mode 100644 PhysicsAnalysis/JetTagging/JetTagMonitoring/share/switchMon.py
 create mode 100755 PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.cxx
 create mode 100755 PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.h

diff --git a/Control/AthenaMonitoring/python/AthenaMonitoringCfg.py b/Control/AthenaMonitoring/python/AthenaMonitoringCfg.py
index 87293a7ece3..382229855dd 100644
--- a/Control/AthenaMonitoring/python/AthenaMonitoringCfg.py
+++ b/Control/AthenaMonitoring/python/AthenaMonitoringCfg.py
@@ -32,17 +32,22 @@ def AthenaMonitoringCfg(flags):
         info('Set up Muon monitoring')
         from MuonDQAMonitoring.MuonDQAMonitoringConfig import MuonDQAMonitoringConfig
         result.merge(MuonDQAMonitoringConfig(flags))
-        
+
     if flags.DQ.Steering.doHLTMon:
         info('Set up HLT monitoring')
         from TrigHLTMonitoring.TrigHLTMonitorAlgorithm import TrigHLTMonTopConfig
         result.merge(TrigHLTMonTopConfig(flags))
 
+    if flags.DQ.Steering.doJetTagMon:
+        info('Set up JetTagging monitoring')
+        from JetTagMonitoring.JetTagMonitorAlgorithm import JetTagMonitorConfig
+        result.merge(JetTagMonitorConfig(flags))
+
     if flags.DQ.Steering.doJetMon:
         info('Set up Jet monitoring')
         from JetMonitoring.JetMonitoringExample import jetMonitoringExampleConfig
         result.merge(jetMonitoringExampleConfig(flags))
-        
+
     if flags.DQ.Steering.doGlobalMon:
         info('Set up Global monitoring')
         from DataQualityTools.DataQualityToolsConfig import DataQualityToolsConfig
diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/CMakeLists.txt b/PhysicsAnalysis/JetTagging/JetTagMonitoring/CMakeLists.txt
index 877984dfd10..5720afbf21a 100644
--- a/PhysicsAnalysis/JetTagging/JetTagMonitoring/CMakeLists.txt
+++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/CMakeLists.txt
@@ -29,12 +29,12 @@ find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
 
 # Component(s) in the package:
 atlas_add_component( JetTagMonitoring
-                     src/*.cxx
+		     src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
                      LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaMonitoringLib xAODJet ITrackToVertex xAODBTagging xAODEventInfo xAODTracking GaudiKernel LArRecEvent JetTagToolsLib LWHists TrkParticleBase VxSecVertex TrkVertexFitterInterfaces TrigDecisionToolLib )
 
 # Install files from the package:
-atlas_install_headers( JetTagMonitoring )
+atlas_install_python_modules( python/*.py )
 atlas_install_joboptions( share/*.py )
 
diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/config/jetTag_collisions_run.config b/PhysicsAnalysis/JetTagging/JetTagMonitoring/config/jetTag_collisions_run.config
deleted file mode 100644
index 503cfe6ea9c..00000000000
--- a/PhysicsAnalysis/JetTagging/JetTagMonitoring/config/jetTag_collisions_run.config
+++ /dev/null
@@ -1,75 +0,0 @@
-# **********************************************************************
-# $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/python/JetTagMonitorAlgorithm.py b/PhysicsAnalysis/JetTagging/JetTagMonitoring/python/JetTagMonitorAlgorithm.py
new file mode 100644
index 00000000000..3e4a9db5cdc
--- /dev/null
+++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/python/JetTagMonitorAlgorithm.py
@@ -0,0 +1,343 @@
+#
+#  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#
+
+'''@file JetTagMonitorAlgorithm.py
+@author A. Lapertosa
+@author S. Strandberg
+@date 2019-06-17
+@brief JetTagging python configuration for the Run III AthenaMonitoring package, based on the example by C Burton and P Onyisi'''
+
+import math
+
+def JetTagMonitorConfig(inputFlags):
+    '''Function to configures some algorithms in the monitoring system.'''
+
+    ### STEP 1 ###
+    # Define one top-level monitoring algorithm. The new configuration 
+    # framework uses a component accumulator.
+    #from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+    #result = ComponentAccumulator()
+
+    # The following class will make a sequence, configure algorithms, and link
+    # them to GenericMonitoringTools
+    from AthenaMonitoring import AthMonitorCfgHelper
+    helper = AthMonitorCfgHelper(inputFlags,'JetTagAthMonitorCfg')
+
+    ### STEP 2 ###
+    # Adding an algorithm to the helper. Here, we will use the jetTagging 
+    # algorithm in the AthenaMonitoring package. Just pass the type to the 
+    # helper. Then, the helper will instantiate an instance and set up the 
+    # base class configuration following the inputFlags. The returned object 
+    # is the algorithm.
+    # You can actually make multiple instances of the same algorithm and give 
+    # them different configurations
+    from JetTagMonitoring.JetTagMonitoringConf import JetTagMonitorAlgorithm
+    #jetTagGeneral = helper.addAlgorithm(JetTagMonitorAlgorithm,'JetTagGeneral')
+    jetTagMonAlg = helper.addAlgorithm(JetTagMonitorAlgorithm,'JetTagMonAlg')
+    #anotherJetTagMonAlg = helper.addAlgorithm(JetTagMonitorAlgorithm,'AnotherJetTagMonAlg')
+
+    # If for some really obscure reason you need to instantiate an algorithm
+    # yourself, the AddAlgorithm method will still configure the base 
+    # properties and add the algorithm to the monitoring sequence.
+    # helper.AddAlgorithm(myExistingAlg)
+    
+    ### STEP 3 ###
+    # Edit properties of an algorithm
+    # Declare properties
+    jetTagMonAlg.ElectronTrigger_201X = "HLT_e[2-9][0-9]_.*" # electrons 20-99 GeV
+    jetTagMonAlg.MuonTrigger_201X = "HLT_mu[2-9][0-9].*" # muons 20-99 GeV
+
+    jetTagMonAlg.TriggerChain = ''
+    #jetTagMonAlg.TriggerChain = 'HLT_mu26_ivarmedium'
+    #jetTagMonAlg.TriggerChain = 'HLT_e24_lhtight_nod0'
+    #jetTagMonAlg.RandomHist = True
+    
+    ### STEP 4 ###
+    # Add some tools. N.B. Do not use your own trigger decision tool. Use the
+    # standard one that is included with AthMonitorAlgorithm.
+
+    # First, add a tool that's set up by a different configuration function. 
+    # In this case, CaloNoiseToolCfg returns its own component accumulator, 
+    # which must be merged with the one from this function.
+    # from CaloTools.CaloNoiseToolConfig import CaloNoiseToolCfg
+    # caloNoiseAcc, caloNoiseTool = CaloNoiseToolCfg(inputFlags)
+    # result.merge(caloNoiseAcc)
+    # jetTagMonAlg.CaloNoiseTool = caloNoiseTool
+
+    # Then, add a tool that doesn't have its own configuration function. In
+    # this jetTagging, no accumulator is returned, so no merge is necessary.
+    # from MyDomainPackage.MyDomainPackageConf import MyDomainTool
+    # jetTagMonAlg.MyDomainTool = MyDomainTool()
+
+    # Add a generic monitoring tool (a "group" in old language). The returned 
+    # object here is the standard GenericMonitoringTool.
+    #GeneralGroup = helper.addGroup(jetTagGeneral,'JetTagMonitor')
+    GeneralGroup = helper.addGroup(jetTagMonAlg,'JetTagMonitor')
+    #JetGroup = helper.addGroup(jetTagMonAlg,'JetTagMonitor')
+    #AnotherGroup = helper.addGroup(anotherJetTagMonAlg,'JetTagMonitor')
+
+    # Add a GMT for the other jetTagging monitor algorithm
+    #shifterGroup = helper.addGroup(shifterTrigEgammaMonAlg,'TrigEgammaMonitor','HLT/EgammaMon/Shifter/')
+
+    ### STEP 5 ### 
+    #title is for plot, x-axis, y-axis
+    #type is type of plot?
+    #path is for folder structure of root output file 
+
+    ### General histograms <-----
+    GeneralGroup.defineHistogram('Event_CutFlow',title='Event CutFlow;Pass Event CutFlow;Events',path='General_plots',xbins=10,xmin=-0.5,xmax=9.5)
+    GeneralGroup.defineHistogram('Trigger_CutFlow',title='Trigger CutFlow;Pass Trigger CutFlow;Events',path='General_plots',xbins=10,xmin=-0.5,xmax=9.5)
+    GeneralGroup.defineHistogram('Jet_CutFlow',title='Jet CutFlow;Pass Event CutFlow;Jets',path='General_plots',xbins=10,xmin=-0.5,xmax=9.5)
+
+    GeneralGroup.defineHistogram('run',title='Run Number;run;Event',path='Run_plots',xbins=500000,xmin=-0.5,xmax=499999.5)
+    GeneralGroup.defineHistogram('lb',title='Lumi;LB;Events',path='Run_plots',xbins=1000,xmin=-0.5,xmax=999.5)
+    GeneralGroup.defineHistogram('mu',title='Mu;<mu>;Events',path='Run_plots',xbins=100,xmin=0,xmax=100.0)
+    GeneralGroup.defineHistogram('nPrimVtx',title='Primary vertices;PV;Events',path='Run_plots',xbins=100,xmin=0,xmax=100.0)
+    GeneralGroup.defineHistogram('xPrimVtx',title='Primary vertices X position;X;Events',path='Run_plots',xbins=40,xmin=-2.0,xmax=2.0)
+    GeneralGroup.defineHistogram('yPrimVtx',title='Primary vertices Y position;Y;Events',path='Run_plots',xbins=40,xmin=-2.0,xmax=2.0)
+    GeneralGroup.defineHistogram('zPrimVtx',title='Primary vertices Z position;Z;Events',path='Run_plots',xbins=100,xmin=-250,xmax=250.0)
+    GeneralGroup.defineHistogram('nTracks_PV',title='Number of tracks in PV;Tracks in PV;Number of tracks',path='Run_plots',xbins=150,xmin=-0.5,xmax=149.5)
+
+    GeneralGroup.defineHistogram('nTracks',title='Track multiplicity;Tracks;Number of tracks',path='Run_plots',xbins=100,xmin=0,xmax=1000)
+    GeneralGroup.defineHistogram('nHitsBLayer',title='Number of IBL hits;Hits on track;Number of IBL hits on track',path='Run_plots',xbins=5,xmin=0,xmax=5)
+    GeneralGroup.defineHistogram('nHitsPixel',title='Number of Pixel hits;Hits on track;Number of Pixel hits on track',path='Run_plots',xbins=10,xmin=0,xmax=10)
+    GeneralGroup.defineHistogram('nHitsSCT',title='Number of SCT hits;Hits on track;Number of SCT hits on track',path='Run_plots',xbins=15,xmin=0,xmax=15)
+    GeneralGroup.defineHistogram('nHitsSi',title='Number of PIX+SCT hits;Hits on track;Number of PIX+SCT hits on track',path='Run_plots',xbins=25,xmin=0,xmax=25)
+    GeneralGroup.defineHistogram('nHitsTRT',title='Number of TRT hits;Hits on track;Number of TRT hits on track',path='Run_plots',xbins=100,xmin=0,xmax=100)
+    GeneralGroup.defineHistogram('nHitsID',title='Number of ID hits;Hits on track;Number of ID hits on track',path='Run_plots',xbins=150,xmin=0,xmax=150)
+
+    GeneralGroup.defineHistogram('JetTracks_n',title='Track multiplicity in jet;Tracks;Number of tracks per jet',path='Run_plots',xbins=50,xmin=0,xmax=50)
+    GeneralGroup.defineHistogram('JetTracks_pt',title='pT of tracks in jet;pT;Tracks in jets',path='Run_plots',xbins=100,xmin=0,xmax=100)
+    GeneralGroup.defineHistogram('JetTracks_eta',title='#eta of tracks in jet;#eta;Tracks in jets',path='Run_plots',xbins=100,xmin=-2.5,xmax=2.5)
+    GeneralGroup.defineHistogram('JetTracks_phi',title='#phi of tracks in jet;#phi;Tracks in jets',path='Run_plots',xbins=100,xmin=-1*math.pi,xmax=math.pi)
+    GeneralGroup.defineHistogram('JetTracks_d0',title='d0 of tracks in jet;d0;Tracks in jets',path='Run_plots',xbins=100,xmin=-5,xmax=5)
+    GeneralGroup.defineHistogram('JetTracks_z0',title='z0 of tracks in jet;z0;Tracks in jets',path='Run_plots',xbins=100,xmin=-300,xmax=300)
+    GeneralGroup.defineHistogram('JetTracks_nHitsBLayer',title='Number of IBL hits on tracks in jets;Hits on track;Number of IBL hits on track',path='Run_plots',xbins=5,xmin=0,xmax=5)
+    GeneralGroup.defineHistogram('JetTracks_nHitsPixel',title='Number of Pixel hits on tracks in jets;Hits on track;Number of Pixel hits on track',path='Run_plots',xbins=10,xmin=0,xmax=10)
+    GeneralGroup.defineHistogram('JetTracks_nHitsSCT',title='Number of SCT hits on tracks in jets;Hits on track;Number of SCT hits on track',path='Run_plots',xbins=15,xmin=0,xmax=15)
+
+    ### is ttbar histograms <-----
+    #registerHist(*m_monGr_shift, m_jet_mv_w_top = TH1F_LW::create("jet_MV_top",(m_mv_algorithmName+" Tag Weight of Jets in Top Events; "+m_mv_algorithmName+" tag weight").c_str(),int(m_mv_nBins/2),m_mv_rangeStart,m_mv_rangeStop));
+    #registerHist(*m_monGr_shift, m_jet_top_eff = TH1F_LW::create("jet_top_eff","Fraction of b-tagged Jets in Top Events",1,-0.5,0.5));
+    #registerHist(*m_monGr_shift, m_jet_pt_top_eff = TH1F_LW::create("jet_pt_top_eff","Fraction of b-tagged Jets in Top Events vs pT; pT [GeV]",10,0.,200.));
+    
+    GeneralGroup.defineHistogram('muon_PT',title='muon_PT;muon_PT;Events',path='Muon_plots',xbins=100,xmin=0.0,xmax=200000.0)
+    GeneralGroup.defineHistogram('electron_PT',title='electron_PT;electron_PT;Events',path='Electron_plots',xbins=100,xmin=0.0,xmax=200000.0)
+    
+    GeneralGroup.defineHistogram('nIsoMuons',title='Number of isolated Muons; Isolated ;Number of muons',path='Top_plots',xbins=3,xmin=-0.5,xmax=2.5)
+    GeneralGroup.defineHistogram('nIsoElectrons',title='Number of isolated Electrons; Isolated ;Number of electrons',path='Top_plots',xbins=3,xmin=-0.5,xmax=2.5)
+
+    GeneralGroup.defineHistogram('nTTbarGoodJets',title='Number of good jets in ttbar events; Good ;Number of good jets',path='Top_plots',xbins=5,xmin=-0.5,xmax=4.5)
+
+    GeneralGroup.defineHistogram('nTTbarJets_pretag',title='Number of ttbar jets tot; Number ;Number of ttbar jets',path='Top_plots',xbins=1,xmin=-0.5,xmax=0.5)
+    GeneralGroup.defineHistogram('nTTbarJets_60tag',title='Number of ttbar jets passing 60 tag WP; Good ;Number of ttbar jets',path='Top_plots',xbins=1,xmin=-0.5,xmax=0.5)
+    GeneralGroup.defineHistogram('nTTbarJets_70tag',title='Number of ttbar jets passing 70 tag WP; Good ;Number of ttbar jets',path='Top_plots',xbins=1,xmin=-0.5,xmax=0.5)
+    GeneralGroup.defineHistogram('nTTbarJets_77tag',title='Number of ttbar jets passing 77 tag WP; Good ;Number of ttbar jets',path='Top_plots',xbins=1,xmin=-0.5,xmax=0.5)
+    GeneralGroup.defineHistogram('nTTbarJets_85tag',title='Number of ttbar jets passing 85 tag WP; Good ;Number of ttbar jets',path='Top_plots',xbins=1,xmin=-0.5,xmax=0.5)
+    GeneralGroup.defineHistogram('nTTbarJets_60tag,nTTTbarJets_pretag',type='TEfficiency',title='TTbar jets 60 tag WP Efficiency;60 tag WP;Efficiency',path='Top_plots',xbins=1,xmin=-0.5,xmax=0.5)
+    GeneralGroup.defineHistogram('nTTbarJets_70tag,nTTbarJets_pretag',type='TEfficiency',title='TTbar jets 70 tag WP Efficiency;70 tag WP;Efficiency',path='Top_plots',xbins=1,xmin=-0.5,xmax=0.5)
+    GeneralGroup.defineHistogram('nTTbarJets_77tag,nTTbarJets_pretag',type='TEfficiency',title='TTbar jets 77 tag WP Efficiency;77 tag WP;Efficiency',path='Top_plots',xbins=1,xmin=-0.5,xmax=0.5) 
+    GeneralGroup.defineHistogram('nTTbarJets_85tag,nTTbarJets_pretag',type='TEfficiency',title='TTbar jets 85 tag WP Efficiency;85 tag WP;Efficiency',path='Top_plots',xbins=1,xmin=-0.5,xmax=0.5)
+
+    GeneralGroup.defineHistogram('ptTTbarJet_pretag',title='Number of ttbar jets vs pT; pT ;Number of ttbar jets',path='Top_plots',xbins=40,xmin=0,xmax=200)
+    GeneralGroup.defineHistogram('ptTTbarJet_60tag',title='Number of ttbar jets passing 60 tag WP vs pT; pT ;Number of ttbar jets',path='Top_plots',xbins=40,xmin=0,xmax=200)
+    GeneralGroup.defineHistogram('ptTTbarJet_70tag',title='Number of ttbar jets passing 70 tag WP vs pT; pT ;Number of ttbar jets',path='Top_plots',xbins=40,xmin=0,xmax=200)
+    GeneralGroup.defineHistogram('ptTTbarJet_77tag',title='Number of ttbar jets passing 77 tag WP vs pT; pT ;Number of ttbar jets',path='Top_plots',xbins=40,xmin=0,xmax=200)
+    GeneralGroup.defineHistogram('ptTTbarJet_85tag',title='Number of ttbar jets passing 85 tag WP vs pT; pT ;Number of ttbar jets',path='Top_plots',xbins=40,xmin=0,xmax=200)
+    GeneralGroup.defineHistogram('ptTTbarJet_60tag,ptTTTbarJet_pretag',type='TEfficiency',title='TTbar jets 60 tag WP Efficiency vs pT;60 tag WP;Efficiency',path='Top_plots',xbins=40,xmin=0.0,xmax=200.0)
+    GeneralGroup.defineHistogram('ptTTbarJet_70tag,ptTTbarJet_pretag',type='TEfficiency',title='TTbar jets 70 tag WP Efficiency vs pT;70 tag WP;Efficiency',path='Top_plots',xbins=40,xmin=0.0,xmax=200.0)
+    GeneralGroup.defineHistogram('ptTTbarJet_77tag,ptTTbarJet_pretag',type='TEfficiency',title='TTbar jets 77 tag WP Efficiency vs pT;77 tag WP;Efficiency',path='Top_plots',xbins=40,xmin=0.0,xmax=200.0) 
+    GeneralGroup.defineHistogram('ptTTbarJet_85tag,ptTTbarJet_pretag',type='TEfficiency',title='TTbar jets 85 tag WP Efficiency vs pT;85 tag WP;Efficiency',path='Top_plots',xbins=40,xmin=0.0,xmax=200.0)
+
+    ### is SMT jet histograms <-----
+    GeneralGroup.defineHistogram('nSoftMuons',title='Number of Soft Muons; Muons per event ;Number of muons',path='SMT_plots',xbins=3,xmin=-0.5,xmax=2.5)
+    GeneralGroup.defineHistogram('nSMTJets',title='Number of SMT Jets; Jets per event ;Number of jets',path='SMT_plots',xbins=3,xmin=-0.5,xmax=2.5)
+
+    GeneralGroup.defineHistogram('drSMT',title='DeltaR between jet and soft muon; DR ;Number of SMT candidates',path='SMT_plots',xbins=40,xmin=0,xmax=0.4)
+    GeneralGroup.defineHistogram('ptSMT_mu',title='pT of SMT Muons; Muon pT [GeV];Number of muons',path='SMT_plots',xbins=50,xmin=0,xmax=100)
+    GeneralGroup.defineHistogram('ptSMT_jet',title='pT of SMT Jets; Jet pT [GeV];Number of jets',path='SMT_plots',xbins=50,xmin=0,xmax=150)
+    GeneralGroup.defineHistogram('ptSMT_ratio',title='pT ratio of SMT Jets (mu/jet); pT ratio ;Number of SMT jets',path='SMT_plots',xbins=50,xmin=0,xmax=1)
+    GeneralGroup.defineHistogram('pTrelSMT',title='pTrel of SMT Jets; pTrel ;Number of jets',path='SMT_plots',xbins=50,xmin=0,xmax=0.5)
+    GeneralGroup.defineHistogram('mvSMT',title='mv of SMT Jets; mv ;Number of jets',path='SMT_plots',xbins=50,xmin=-1,xmax=1)
+
+    ### jet quality cutflow histograms <-----
+    GeneralGroup.defineHistogram('nJets',title='Jet multiplicity;Number of jets;Events',path='Jet_quality',xbins=50,xmin=0,xmax=50)
+    GeneralGroup.defineHistogram('jet_PT',title='Jet pT;Jet pT [GeV];Jets',path='Jet_quality',xbins=100,xmin=0.0,xmax=200.0)
+    GeneralGroup.defineHistogram('jet_ETA',title='Jet eta;Jet eta;Jets',path='Jet_quality',xbins=100,xmin=-2.5,xmax=2.5)
+    GeneralGroup.defineHistogram('jet_PHI',title='Jet phi;Jet phi;Jets',path='Jet_quality',xbins=100,xmin=-1*math.pi,xmax=math.pi)
+    GeneralGroup.defineHistogram('jet_eta_all,jet_phi_all;jet_MAP_all',title='2D MAP of all jets;Jet #eta;Jet #phi',type='TH2F',path='Jet_quality',xbins=100,xmin=-2.5,xmax=2.5,ybins=200,ymin=-1*math.pi,ymax=math.pi)
+
+    GeneralGroup.defineHistogram('jet_eta_good,jet_phi_good;jet_MAP_good',title='2D MAP of good jets;Jet #eta;Jet #phi',type='TH2F',path='Jet_quality',xbins=100,xmin=-2.5,xmax=2.5,ybins=200,ymin=-1*math.pi,ymax=math.pi)
+    GeneralGroup.defineHistogram('jet_eta_kin,jet_phi_kin;jet_MAP_kin',title='2D MAP of jets passing kinematic selection;Jet #eta;Jet #phi',type='TH2F',path='Jet_quality',xbins=100,xmin=-2.5,xmax=2.5,ybins=200,ymin=-1*math.pi,ymax=math.pi)
+    GeneralGroup.defineHistogram('jet_eta_jvt,jet_phi_jvt;jet_MAP_jvt',title='2D MAP of jets passing JVT;Jet #eta;Jet #phi',type='TH2F',path='Jet_quality',xbins=100,xmin=-2.5,xmax=2.5,ybins=200,ymin=-1*math.pi,ymax=math.pi)
+    GeneralGroup.defineHistogram('jet_eta_overlap,jet_phi_overlap;jet_MAP_overlap',title='2D MAP of not overlapping jets;Jet #eta;Jet #phi',type='TH2F',path='Jet_quality',xbins=100,xmin=-2.5,xmax=2.5,ybins=200,ymin=-1*math.pi,ymax=math.pi)
+    GeneralGroup.defineHistogram('jet_eta_quality,jet_phi_quality;jet_MAP_quality',title='2D MAP of quality jets;Jet #eta;Jet #phi',type='TH2F',path='Jet_quality',xbins=100,xmin=-2.5,xmax=2.5,ybins=200,ymin=-1*math.pi,ymax=math.pi)
+    GeneralGroup.defineHistogram('jet_eta_suspect,jet_phi_suspect;jet_MAP_suspect',title='2D MAP of suspect jets;Jet #eta;Jet #phi',type='TH2F',path='Jet_quality',xbins=100,xmin=-2.5,xmax=2.5,ybins=200,ymin=-1*math.pi,ymax=math.pi)
+    GeneralGroup.defineHistogram('jet_eta_bad,jet_phi_bad;jet_MAP_bad',title='2D MAP of bad jets;Jet #eta;Jet #phi',type='TH2F',path='Jet_quality',xbins=100,xmin=-2.5,xmax=2.5,ybins=200,ymin=-1*math.pi,ymax=math.pi)
+    GeneralGroup.defineHistogram('jet_eta_smt,jet_phi_smt;jet_MAP_smt',title='2D MAP of SMT jets;Jet #eta;Jet #phi',type='TH2F',path='Jet_quality',xbins=100,xmin=-2.5,xmax=2.5,ybins=200,ymin=-1*math.pi,ymax=math.pi)
+    
+    ### tag weight histograms <-----
+
+    GeneralGroup.defineHistogram('jet_MV',title='Jet MV;Jet MV;Jets',path='Jet_quality',xbins=100,xmin=-1.0,xmax=1.0)
+    
+    GeneralGroup.defineHistogram('jet_MV_mu_0_30',title='Jet MV in mu bin 1 : <mu> = [0,30];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('jet_MV_mu_30_50',title='Jet MV in mu bin 2 : <mu> = [30,50];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('jet_MV_mu_50_100',title='Jet MV in mu bin 3 : <mu> = [50,100];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+
+    GeneralGroup.defineHistogram('jet_MV_pt_0_20',title='Jet MV in pT bin 1 : pT = [0,20];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('jet_MV_pt_20_40',title='Jet MV in pT bin 2 : pT = [20,40];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('jet_MV_pt_40_70',title='Jet MV in pT bin 3 : pT = [40,70];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('jet_MV_pt_70_100',title='Jet MV in pT bin 4 : pT = [70,100];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('jet_MV_pt_100_150',title='Jet MV in pT bin 5 : pT = [100,150];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('jet_MV_pt_150_200',title='Jet MV in pT bin 6 : pT = [150,200];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('jet_MV_pt_200_1000',title='Jet MV in pT bin 7 : pT = [200,1000];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+
+    GeneralGroup.defineHistogram('jet_MV_eta_00_05',title='Jet MV in #eta bin 1 : #eta = [0.0,0.5];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('jet_MV_eta_05_10',title='Jet MV in #eta bin 2 : #eta = [0.5,1.0];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('jet_MV_eta_10_15',title='Jet MV in #eta bin 3 : #eta = [1.0,1.5];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('jet_MV_eta_15_20',title='Jet MV in #eta bin 4 : #eta = [1.5,2.0];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('jet_MV_eta_20_25',title='Jet MV in #eta bin 5 : #eta = [2.0,2.5];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+
+    GeneralGroup.defineHistogram('jet_MV_phi_00_05',title='Jet MV in #phi bin 1 : #phi = [0.0,0.5];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('jet_MV_phi_05_10',title='Jet MV in #phi bin 2 : #phi = [0.5,1.0];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('jet_MV_phi_10_15',title='Jet MV in #phi bin 3 : #phi = [1.0,1.5];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('jet_MV_phi_15_20',title='Jet MV in #phi bin 4 : #phi = [1.5,2.0];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('jet_MV_phi_20_25',title='Jet MV in #phi bin 5 : #phi = [2.0,2.5];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('jet_MV_phi_25_31',title='Jet MV in #phi bin 6 : #phi = [2.5,3.1];Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+
+    #jets passing WPs in eta and phi bins, efficiency and 2D map
+    GeneralGroup.defineHistogram('jet_eta_pretag',title='Number jets before passing tag vs #eta; Good ;Number jets',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5)
+    GeneralGroup.defineHistogram('jet_eta_60tag',title='Number jets passing 60 tag WP vs #eta; Good ;Number jets',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5)
+    GeneralGroup.defineHistogram('jet_eta_70tag',title='Number jets passing 70 tag WP vs #eta; Good ;Number jets',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5)
+    GeneralGroup.defineHistogram('jet_eta_77tag',title='Number jets passing 77 tag WP vs #eta; Good ;Number jets',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5)
+    GeneralGroup.defineHistogram('jet_eta_85tag',title='Number jets passing 85 tag WP vs #eta; Good ;Number jets',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5)
+    GeneralGroup.defineHistogram('jet_eta_60tag,jet_MV_eta_pretag',type='TEfficiency',title='Jets 60 tag WP Efficiency vs #eta;60 tag WP;Efficiency',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5)
+    GeneralGroup.defineHistogram('jet_eta_70tag,jet_MV_eta_pretag',type='TEfficiency',title='Jets 70 tag WP Efficiency vs #eta;70 tag WP;Efficiency',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5)
+    GeneralGroup.defineHistogram('jet_eta_77tag,jet_MV_eta_pretag',type='TEfficiency',title='Jets 77 tag WP Efficiency vs #eta;77 tag WP;Efficiency',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5) 
+    GeneralGroup.defineHistogram('jet_eta_85tag,jet_MV_eta_pretag',type='TEfficiency',title='Jets 85 tag WP Efficiency vs #eta;85 tag WP;Efficiency',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5)
+    
+    GeneralGroup.defineHistogram('jet_phi_pretag',title='Number jets before passing tag vs #phi; Good ;Number jets',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi)
+    GeneralGroup.defineHistogram('jet_phi_60tag',title='Number jets passing 60 tag WP vs #phi; Good ;Number jets',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi)
+    GeneralGroup.defineHistogram('jet_phi_70tag',title='Number jets passing 70 tag WP vs #phi; Good ;Number jets',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi)
+    GeneralGroup.defineHistogram('jet_phi_77tag',title='Number jets passing 77 tag WP vs #phi; Good ;Number jets',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi)
+    GeneralGroup.defineHistogram('jet_phi_85tag',title='Number jets passing 85 tag WP vs #phi; Good ;Number jets',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi)
+    GeneralGroup.defineHistogram('jet_phi_60tag,jet_MV_phi_pretag',type='TEfficiency',title='Jets 60 tag WP Efficiency vs #phi;60 tag WP;Efficiency',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi)
+    GeneralGroup.defineHistogram('jet_phi_70tag,jet_MV_phi_pretag',type='TEfficiency',title='Jets 70 tag WP Efficiency vs #phi;70 tag WP;Efficiency',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi)
+    GeneralGroup.defineHistogram('jet_phi_77tag,jet_MV_phi_pretag',type='TEfficiency',title='Jets 77 tag WP Efficiency vs #phi;77 tag WP;Efficiency',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi) 
+    GeneralGroup.defineHistogram('jet_phi_85tag,jet_MV_phi_pretag',type='TEfficiency',title='Jets 85 tag WP Efficiency vs #phi;85 tag WP;Efficiency',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi)
+
+    GeneralGroup.defineHistogram('jet_eta_60tag,jet_phi_60tag;jet_MAP_60tag',title='2D MAP of jets passing 60 tag WP;Jet #eta;Jet #phi',type='TH2F',path='Jet_MV',xbins=100,xmin=-2.5,xmax=2.5,ybins=200,ymin=-1*math.pi,ymax=math.pi)
+    GeneralGroup.defineHistogram('jet_eta_70tag,jet_phi_70tag;jet_MAP_70tag',title='2D MAP of jets passing 70 tag WP;Jet #eta;Jet #phi',type='TH2F',path='Jet_MV',xbins=100,xmin=-2.5,xmax=2.5,ybins=200,ymin=-1*math.pi,ymax=math.pi)
+    GeneralGroup.defineHistogram('jet_eta_77tag,jet_phi_77tag;jet_MAP_77tag',title='2D MAP of jets passing 77 tag WP;Jet #eta;Jet #phi',type='TH2F',path='Jet_MV',xbins=100,xmin=-2.5,xmax=2.5,ybins=200,ymin=-1*math.pi,ymax=math.pi)
+    GeneralGroup.defineHistogram('jet_eta_85tag,jet_phi_85tag;jet_MAP_85tag',title='2D MAP of jets passing 85 tag WP;Jet #eta;Jet #phi',type='TH2F',path='Jet_MV',xbins=100,xmin=-2.5,xmax=2.5,ybins=200,ymin=-1*math.pi,ymax=math.pi)
+
+
+    ### the same but with suspect jets
+    GeneralGroup.defineHistogram('sus_jet_MV',title='Suspect Jet MV;Suspect Jet MV;Jets',path='Jet_quality',xbins=100,xmin=-1.0,xmax=1.0)
+
+    GeneralGroup.defineHistogram('sus_jet_MV_pt_0_20',title='Suspect Jet MV in pT bin 1 : pT = [0,20];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('sus_jet_MV_pt_20_40',title='Suspect Jet MV in pT bin 2 : pT = [20,40];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('sus_jet_MV_pt_40_80',title='Suspect Jet MV in pT bin 3 : pT = [40,80];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('sus_jet_MV_pt_80_100',title='Suspect Jet MV in pT bin 4 : pT = [80,100];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('sus_jet_MV_pt_100_150',title='Suspect Jet MV in pT bin 5 : pT = [100,150];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('sus_jet_MV_pt_150_200',title='Suspect Jet MV in pT bin 6 : pT = [150,200];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('sus_jet_MV_pt_200_1000',title='Suspect Jet MV in pT bin 7 : pT = [200,1000];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+
+    GeneralGroup.defineHistogram('sus_jet_MV_eta_0_05',title='Suspect Jet MV in #eta bin 1 : #eta = [0,0.5];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('sus_jet_MV_eta_05_10',title='Suspect Jet MV in #eta bin 2 : #eta = [0.5,1.0];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('sus_jet_MV_eta_10_15',title='Suspect Jet MV in #eta bin 3 : #eta = [1.0,1.5];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('sus_jet_MV_eta_15_20',title='Suspect Jet MV in #eta bin 4 : #eta = [1.5,2.0];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('sus_jet_MV_eta_20_25',title='Suspect Jet MV in #eta bin 5 : #eta = [2.0,2.5];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+
+    GeneralGroup.defineHistogram('sus_jet_MV_phi_0_05',title='Suspect Jet MV in #phi bin 1 : #phi = [0,0.5];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('sus_jet_MV_phi_05_10',title='Suspect Jet MV in #phi bin 2 : #phi = [0.5,1.0];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('sus_jet_MV_phi_10_15',title='Suspect Jet MV in #phi bin 3 : #phi = [1.0,1.5];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('sus_jet_MV_phi_15_20',title='Suspect Jet MV in #phi bin 4 : #phi = [1.5,2.0];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('sus_jet_MV_phi_20_25',title='Suspect Jet MV in #phi bin 5 : #phi = [2.0,2.5];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+    GeneralGroup.defineHistogram('sus_jet_MV_phi_25_31',title='Suspect Jet MV in #phi bin 6 : #phi = [2.5,3.1];Suspect Jet MV;Jets',path='Jet_MV',xbins=100,xmin=-1.0,xmax=1.0)
+
+    GeneralGroup.defineHistogram('sus_jet_MV_eta_pretag',title='Number jets before passing tag vs #eta; Good ;Number jets',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5)
+    GeneralGroup.defineHistogram('sus_jet_MV_eta_60tag',title='Number jets passing 60 tag WP vs #eta; Good ;Number jets',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5)
+    GeneralGroup.defineHistogram('sus_jet_MV_eta_70tag',title='Number jets passing 70 tag WP vs #eta; Good ;Number jets',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5)
+    GeneralGroup.defineHistogram('sus_jet_MV_eta_77tag',title='Number jets passing 77 tag WP vs #eta; Good ;Number jets',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5)
+    GeneralGroup.defineHistogram('sus_jet_MV_eta_85tag',title='Number jets passing 85 tag WP vs #eta; Good ;Number jets',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5)
+    GeneralGroup.defineHistogram('sus_jet_MV_eta_60tag,sus_jet_MV_eta_pretag',type='TEfficiency',title='Jets 60 tag WP Efficiency vs #eta;60 tag WP;Efficiency',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5)
+    GeneralGroup.defineHistogram('sus_jet_MV_eta_70tag,sus_jet_MV_eta_pretag',type='TEfficiency',title='Jets 70 tag WP Efficiency vs #eta;70 tag WP;Efficiency',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5)
+    GeneralGroup.defineHistogram('sus_jet_MV_eta_77tag,sus_jet_MV_eta_pretag',type='TEfficiency',title='Jets 77 tag WP Efficiency vs #eta;77 tag WP;Efficiency',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5) 
+    GeneralGroup.defineHistogram('sus_jet_MV_eta_85tag,sus_jet_MV_eta_pretag',type='TEfficiency',title='Jets 85 tag WP Efficiency vs #eta;85 tag WP;Efficiency',path='Jet_MV',xbins=10,xmin=-2.5,xmax=2.5)
+
+    GeneralGroup.defineHistogram('sus_jet_MV_phi_pretag',title='Number jets before passing tag vs #phi; Good ;Number jets',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi)
+    GeneralGroup.defineHistogram('sus_jet_MV_phi_60tag',title='Number jets passing 60 tag WP vs #phi; Good ;Number jets',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi)
+    GeneralGroup.defineHistogram('sus_jet_MV_phi_70tag',title='Number jets passing 70 tag WP vs #phi; Good ;Number jets',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi)
+    GeneralGroup.defineHistogram('sus_jet_MV_phi_77tag',title='Number jets passing 77 tag WP vs #phi; Good ;Number jets',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi)
+    GeneralGroup.defineHistogram('sus_jet_MV_phi_85tag',title='Number jets passing 85 tag WP vs #phi; Good ;Number jets',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi)
+    GeneralGroup.defineHistogram('sus_jet_MV_phi_60tag,sus_jet_MV_phi_pretag',type='TEfficiency',title='Jets 60 tag WP Efficiency vs #phi;60 tag WP;Efficiency',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi)
+    GeneralGroup.defineHistogram('sus_jet_MV_phi_70tag,sus_jet_MV_phi_pretag',type='TEfficiency',title='Jets 70 tag WP Efficiency vs #phi;70 tag WP;Efficiency',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi)
+    GeneralGroup.defineHistogram('sus_jet_MV_phi_77tag,sus_jet_MV_phi_pretag',type='TEfficiency',title='Jets 77 tag WP Efficiency vs #phi;77 tag WP;Efficiency',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi) 
+    GeneralGroup.defineHistogram('sus_jet_MV_phi_85tag,sus_jet_MV_phi_pretag',type='TEfficiency',title='Jets 85 tag WP Efficiency vs #phi;85 tag WP;Efficiency',path='Jet_MV',xbins=12,xmin=-1*math.pi,xmax=math.pi)
+
+    GeneralGroup.defineHistogram('sus_jet_eta_60tag,sus_jet_phi_60tag;sus_jet_MAP_60tag',title='2D MAP of jets passing 60 tag WP;Jet #eta;Jet #phi',type='TH2F',path='Jet_MV',xbins=100,xmin=-2.5,xmax=2.5,ybins=200,ymin=-1*math.pi,ymax=math.pi)
+    GeneralGroup.defineHistogram('sus_jet_eta_70tag,sus_jet_phi_70tag;sus_jet_MAP_70tag',title='2D MAP of jets passing 70 tag WP;Jet #eta;Jet #phi',type='TH2F',path='Jet_MV',xbins=100,xmin=-2.5,xmax=2.5,ybins=200,ymin=-1*math.pi,ymax=math.pi)
+    GeneralGroup.defineHistogram('sus_jet_eta_77tag,sus_jet_phi_77tag;sus_jet_MAP_77tag',title='2D MAP of jets passing 77 tag WP;Jet #eta;Jet #phi',type='TH2F',path='Jet_MV',xbins=100,xmin=-2.5,xmax=2.5,ybins=200,ymin=-1*math.pi,ymax=math.pi)
+    GeneralGroup.defineHistogram('sus_jet_eta_85tag,sus_jet_phi_85tag;sus_jet_MAP_85tag',title='2D MAP of jets passing 85 tag WP;Jet #eta;Jet #phi',type='TH2F',path='Jet_MV',xbins=100,xmin=-2.5,xmax=2.5,ybins=200,ymin=-1*math.pi,ymax=math.pi)
+
+    #aGroup.defineHistogram('pT_passed,pT',type='TEfficiency',title='Test TEfficiency;x;Eff',path='AndInTheDarkness',xbins=100,xmin=0.0,xmax=50.0)
+
+    ### STEP 6 ###
+    # Finalize. The return value should be a tuple of the ComponentAccumulator
+    # and the sequence containing the created algorithms. If we haven't called
+    # any configuration other than the AthMonitorCfgHelper here, then we can 
+    # just return directly (and not create "result" above)
+    return helper.result()
+    
+    # # Otherwise, merge with result object and return
+    # acc, seq = helper.result()
+    # result.merge(acc)
+    # return result, seq
+
+
+if __name__=='__main__':
+    # Setup the Run III behavior
+    from AthenaCommon.Configurable import Configurable
+    Configurable.configurableRun3Behavior = 1
+
+    # Setup logs
+    from AthenaCommon.Logging import log
+    from AthenaCommon.Constants import INFO
+    log.setLevel(INFO)
+
+    # Set the Athena configuration flags
+    from AthenaConfiguration.AllConfigFlags import ConfigFlags
+
+    #Select the input (data or MC) and output files
+
+    #Data input working:
+    ConfigFlags.Input.Files = ["/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/CommonInputs/data16_13TeV.00311321.physics_Main.recon.AOD.r9264/AOD.11038520._000001.pool.root.1"]
+    ConfigFlags.Input.isMC = False
+
+    #MC input for DQr22 first tests
+    #ConfigFlags.Input.Files = ["/afs/cern.ch/work/e/enagy/public/GenerateAOD/Gen_MT_240919/AOD.pool.root"]
+    #ConfigFlags.Input.isMC = True
+
+    #Output file
+    ConfigFlags.Output.HISTFileName = 'JetTagMonitorOutput.root'
+    ConfigFlags.lock()
+
+    # Initialize configuration object, add accumulator, merge, and run.
+    from AthenaConfiguration.MainServicesConfig import MainServicesSerialCfg 
+    from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
+    cfg = MainServicesSerialCfg()
+    cfg.merge(PoolReadCfg(ConfigFlags))
+
+    jetTagMonitorAcc = JetTagMonitorConfig(ConfigFlags)
+    cfg.merge(jetTagMonitorAcc)
+    
+    # If you want to turn on more detailed messages ...
+    #trigEgammaMonitorAcc.getEventAlgo('TrigEgammaMonAlg').OutputLevel = 2 # DEBUG
+    cfg.printConfig(withDetails=True) # set True for exhaustive info
+
+    #Select how many events to run on 
+    #use cfg.run() empty for all events
+    #use cfg.run(20) to only run on first 20 events
+    cfg.run(20) #2157 for data, 20 for MC working
diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagging_test.cc b/PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagging_test.cc
deleted file mode 100644
index 4d2e98670ea..00000000000
--- a/PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagging_test.cc
+++ /dev/null
@@ -1,523 +0,0 @@
-#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
deleted file mode 100644
index 4ced4475564..00000000000
--- a/PhysicsAnalysis/JetTagging/JetTagMonitoring/share/JetTagging_test.py
+++ /dev/null
@@ -1,174 +0,0 @@
-#!/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
deleted file mode 100644
index 282fc99abf1..00000000000
--- a/PhysicsAnalysis/JetTagging/JetTagMonitoring/share/switchMon.py
+++ /dev/null
@@ -1,47 +0,0 @@
-### 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/JetTagMonitorAlgorithm.cxx b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.cxx
new file mode 100755
index 00000000000..1bedcca2e46
--- /dev/null
+++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.cxx
@@ -0,0 +1,1029 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+//r22 header
+#include "JetTagMonitorAlgorithm.h"
+
+#include "xAODJet/JetContainer.h"   
+#include "xAODJet/JetAttributes.h"
+#include "xAODBTagging/BTagging.h"
+#include "xAODEventInfo/EventInfo.h"
+#include "xAODEgamma/ElectronContainer.h"
+#include "xAODMuon/MuonContainer.h"
+
+#include "xAODTracking/TrackParticle.h"
+#include "xAODTracking/TrackParticleContainer.h"    
+#include "xAODTracking/Vertex.h"
+#include "xAODTracking/VertexContainer.h"
+
+#include "TrkParticleBase/LinkToTrackParticleBase.h"
+#include "TrkVertexFitterInterfaces/ITrackToVertexIPEstimator.h"
+#include "VxSecVertex/VxSecVKalVertexInfo.h"
+#include "VxSecVertex/VxSecVertexInfo.h"
+
+#include "LArRecEvent/LArEventBitInfo.h"
+
+#include "GaudiKernel/SystemOfUnits.h"
+
+#include "TH1F.h"
+#include "TH2F.h"
+#include "TMath.h"
+#include "TEfficiency.h"
+
+#include <vector>
+#include <string>
+#include <sstream>
+
+JetTagMonitorAlgorithm::JetTagMonitorAlgorithm( const std::string& name, ISvcLocator* pSvcLocator )
+  :AthMonitorAlgorithm(name,pSvcLocator)
+  , m_jetContainerKey("AntiKt4EMTopoJets")
+  , m_muonContainerKey("Muons")
+  , m_electronContainerKey("Electrons")
+  , m_trigDecTool("Trig::TrigDecisionTool/TrigDecisionTool")
+  //add here other containers
+{
+
+  declareProperty("SkipJetQuality",         m_skipJetQuality    = false);
+
+  declareProperty("AntiKt4EMTopoJets",m_jetContainerKey);
+  declareProperty("Muons",m_muonContainerKey);
+  declareProperty("Electrons",m_electronContainerKey);
+ 
+  declareProperty("ElectronTrigger_201X", m_ElectronTrigger_201X = "HLT_e[2-9][0-9]_.*" ); // e20-e99_* triggers
+  declareProperty("MuonTrigger_201X", m_MuonTrigger_201X = "HLT_mu[2-9][0-9]_.*" ); // mu20-mu99_* triggers 
+  declareProperty("JetTrigger_201X", m_JetTrigger_201X = "HLT_j[1-9][0-9].*" ); // j10-j99* triggers 
+
+  declareProperty( "JetEtaCut", m_JetEtaCut = 2.5 );
+  declareProperty( "JetPtCut", m_JetPtCut = 25.0 );
+  declareProperty( "SoftMuonPtCut", m_softMuonPtCut = 5.0 );
+
+  declareProperty( "ElectronPtCut", m_ElectronPtCut = 25.0 );
+  declareProperty( "MuonPtCut", m_MuonPtCut = 25.0 );
+  declareProperty( "ElectronEtaCut", m_ElectronEtaCut = 2.47 );
+  declareProperty( "MuonEtaCut", m_MuonEtaCut = 2.5 );
+  declareProperty( "ElectronEtaCrackLowCut", m_ElectronEtaCrackLowCut = 1.37 );
+  declareProperty( "ElectronEtaCrackHighCut", m_ElectronEtaCrackHighCut = 1.52 );
+
+  declareProperty( "ElectronTopoEtCone20Cut", m_ElectronTopoEtCone20Cut = 0.06 );// corresponds to the FixedTightCut working point
+  declareProperty( "MuonTopoEtCone20Cut", m_MuonTopoEtCone20Cut = 0.06 );// corresponds to the FixedTightCut working point
+  declareProperty( "ElectronPtVarCone20Cut", m_ElectronPtVarCone20Cut = 0.06 );// corresponds to the FixedTightCut working point
+  declareProperty( "MuonPtVarCone30Cut", m_MuonPtVarCone30Cut = 0.06 );// corresponds to the FixedTightCut working point  
+
+  declareProperty("MV_algorithmName", m_mv_algorithmName="MV2c10");
+  declareProperty("MV_nBins", m_mv_nBins=100);
+  declareProperty("MV_rangeStart", m_mv_rangeStart=-1.);
+  declareProperty("MV_rangeStop", m_mv_rangeStop=1.);
+  declareProperty("MV_cFraction", m_mv_cFrac=0.08);//DL1
+  declareProperty("MV_60_cut", m_mv_60_weight_cut=0.94);
+  declareProperty("MV_70_cut", m_mv_70_weight_cut=0.83);
+  declareProperty("MV_77_cut", m_mv_77_weight_cut=0.64);
+  declareProperty("MV_85_cut", m_mv_85_weight_cut=0.11);
+}
+
+JetTagMonitorAlgorithm::~JetTagMonitorAlgorithm() {}
+
+StatusCode JetTagMonitorAlgorithm::initialize() {
+
+  //Initialize ReadHandles and ReadHandleKeys
+  ATH_CHECK(m_jetContainerKey.initialize());
+  ATH_CHECK(m_muonContainerKey.initialize());
+  ATH_CHECK(m_electronContainerKey.initialize());
+
+  ATH_CHECK(m_vertContainerKey.initialize());
+  ATH_CHECK(m_EventInfoKey.initialize());
+  ATH_CHECK(m_trackContainerKey.initialize());
+
+  return AthMonitorAlgorithm::initialize();
+}
+
+
+StatusCode JetTagMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const {
+
+  using namespace Monitored;
+
+  //----------------------Start Event Part---------------------------
+
+  //check number of events via const EventContext& ctx
+  //ctx.evt()
+
+  // Declare the quantities which should be monitored
+  //NB! The variables and histograms defined here must match the ones in the py file exactly!
+  auto lb = Monitored::Scalar<int>("lb",0);
+  auto run = Monitored::Scalar<int>("run",0);
+  auto event = Monitored::Scalar<int>("event",0);
+
+  //// Set the values of the monitored variables for the event		
+  lb = GetEventInfo(ctx)->lumiBlock();
+  run = GetEventInfo(ctx)->runNumber();
+  event = GetEventInfo(ctx)->eventNumber();
+
+  // auto lumiPerBCID = Monitored::Scalar<float>("lumiPerBCID",0.0);
+  // lumiPerBCID = lbAverageInteractionsPerCrossing();
+
+  //Fill. First argument is the tool name, all others are the variables to be saved.
+  //fill("JetTagMonitor",lumiPerBCID,lb,random,pT,pT_passed);
+  
+  //Alternative fill method. Get the group yourself, and pass it to the fill function.
+  auto tool = getGroup("JetTagMonitor");
+  fill(tool,run);
+  fill(tool,lb);
+
+  //r21 event cutflow
+  // 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");
+  // m_cutflow->GetXaxis()->SetBinLabel(5,"Trigger");
+
+  auto Event_CutFlow = Monitored::Scalar<int>("Event_CutFlow",0);
+  Event_CutFlow = 0;
+  fill(tool,Event_CutFlow);
+
+  if ( GetEventInfo(ctx)->errorState(xAOD::EventInfo::EventFlagSubDet::Tile) == xAOD::EventInfo::Error || 
+       GetEventInfo(ctx)->errorState(xAOD::EventInfo::EventFlagSubDet::LAr)  == xAOD::EventInfo::Error ||
+       GetEventInfo(ctx)->isEventFlagBitSet(xAOD::EventInfo::Core, 18) ) { 
+    ATH_MSG_DEBUG("Event cleaning : skip event");
+    return StatusCode::SUCCESS;    
+  }
+
+  Event_CutFlow = 1;
+  fill(tool,Event_CutFlow);
+
+  //////////////////////
+  //* Get Pileup     *//
+  //////////////////////
+
+  auto mu = Monitored::Scalar<float>("mu",0);
+  mu = GetEventInfo(ctx)->actualInteractionsPerCrossing();
+  fill(tool,mu); 
+
+  //////////////////////
+  //* Primary vertex *//
+  //////////////////////
+ 
+  auto nPrimVtx = Monitored::Scalar<int>("nPrimVtx",0);
+  auto xPrimVtx = Monitored::Scalar<float>("xPrimVtx",0);
+  auto yPrimVtx = Monitored::Scalar<float>("yPrimVtx",0);
+  auto zPrimVtx = Monitored::Scalar<float>("zPrimVtx",0);
+  auto nTracks_PV = Monitored::Scalar<int>("nTracks_PV",0);
+  
+  SG::ReadHandle<xAOD::VertexContainer> vertices(m_vertContainerKey, ctx);
+  if (!vertices.isValid()) {
+    ATH_MSG_ERROR("Could not find vertex AOD container with name " << m_vertContainerKey);
+    return StatusCode::FAILURE;
+  }
+  
+  nPrimVtx = vertices->size();
+  fill(tool,nPrimVtx);
+  
+  if (vertices->size() < 2) {//why < 2?
+    ATH_MSG_WARNING("No vertices reconstructed");
+    return StatusCode::SUCCESS;
+  }
+  
+  Event_CutFlow = 2;
+  fill(tool,Event_CutFlow);
+
+  bool foundVxTypePriVtx = false;
+
+  for (const auto& vertItr : *vertices) {
+    ATH_MSG_DEBUG("Simple vertex: x = " << xPrimVtx << ", y = " << yPrimVtx << ", z = " << zPrimVtx);
+   
+    if (vertItr->vertexType() == xAOD::VxType::PriVtx && vertItr->numberDoF() > 0 ) { 
+      foundVxTypePriVtx = true;
+
+      xPrimVtx = vertItr->x();
+      yPrimVtx = vertItr->y();
+      zPrimVtx = vertItr->z();
+      ATH_MSG_DEBUG("Primary vertex: x = " << xPrimVtx << ", y = " << yPrimVtx << ", z = " << zPrimVtx);
+      
+      if (xPrimVtx == 0 && yPrimVtx == 0 && zPrimVtx == 0)
+	ATH_MSG_WARNING("Primary Vertex is (0,0,0)");
+      
+      fill(tool,xPrimVtx);
+      fill(tool,yPrimVtx);
+      fill(tool,zPrimVtx);
+
+      if (vertItr->nTrackParticles()>0) {
+	nTracks_PV = vertItr->nTrackParticles();
+	ATH_MSG_DEBUG("PV has "<< nTracks_PV <<" tracks");
+      }
+      
+      fill(tool,nTracks_PV);
+
+    }
+  }
+  
+  if ( ! foundVxTypePriVtx ) {
+    ATH_MSG_WARNING("xAOD::Vertex of type xAOD::VxType::PriVtx was not found in vertex container.");
+    return StatusCode::SUCCESS;
+  }
+
+  //ATTENTION  
+  // check PV > 4 tracks, if not, fail
+  // if ( npv_trk <  m_pri_vtx_trk_min_cut )
+  if ( nTracks_PV <  4 )
+    return StatusCode::SUCCESS;
+
+  Event_CutFlow = 3;
+  fill(tool,Event_CutFlow);
+  
+  //////////////////////
+  //* Triggers *//
+  //////////////////////
+
+  //removed october
+  bool useTriggerDecisionTool = true; //how to implement in r22 python script?
+
+  if (useTriggerDecisionTool && m_trigDecTool != 0) { // only apply trigger selection if bool is true (false for express stream) and trigDecTool is ok
+
+    //ERROR for tool without explicit name
+    //NEED TO:
+    //find a way to put trigger name on python script (not hardcoded, by variable)
+    //find a way to put wildcards * for 20-99 GeV electron and muon triggers
+    
+    ATH_MSG_DEBUG("TrigDecTool: " << m_trigDecTool);
+    ATH_MSG_DEBUG("m_trigDecTool->isPassed(" << m_ElectronTrigger_201X << "): " << m_trigDecTool->isPassed(m_ElectronTrigger_201X));
+    ATH_MSG_DEBUG("m_trigDecTool->isPassed(" << m_MuonTrigger_201X << "): " << m_trigDecTool->isPassed(m_MuonTrigger_201X));
+    ATH_MSG_DEBUG("m_trigDecTool->isPassed(" << m_JetTrigger_201X << "): " << m_trigDecTool->isPassed(m_JetTrigger_201X));
+    
+    // auto chainGroup = m_trigDecTool->getChainGroup(".*");
+    // for (auto & trig : chainGroup->getListOfTriggers()) {
+    //   ATH_MSG_DEBUG("Found trigger " << trig);
+    // }
+    
+    auto Trigger_CutFlow = Monitored::Scalar<int>("Trigger_CutFlow",0);
+    Trigger_CutFlow = 0;
+    fill(tool,Trigger_CutFlow);
+   
+    // 201X menu triggers
+    if (m_trigDecTool->isPassed(m_ElectronTrigger_201X)) {
+      Trigger_CutFlow = 1;
+      fill(tool,Trigger_CutFlow);
+    }
+    if (m_trigDecTool->isPassed(m_MuonTrigger_201X)) {
+      Trigger_CutFlow = 2;
+      fill(tool,Trigger_CutFlow);
+    }
+    if (m_trigDecTool->isPassed(m_ElectronTrigger_201X) || m_trigDecTool->isPassed(m_MuonTrigger_201X)){
+      Trigger_CutFlow = 3;
+      fill(tool,Trigger_CutFlow);
+    }
+    if (m_trigDecTool->isPassed(m_ElectronTrigger_201X) && m_trigDecTool->isPassed(m_MuonTrigger_201X)){
+      Trigger_CutFlow = 4;
+      fill(tool,Trigger_CutFlow);
+    }
+    if (m_trigDecTool->isPassed(m_JetTrigger_201X)){
+      Trigger_CutFlow = 5;
+      fill(tool,Trigger_CutFlow);
+    }
+
+    //IMPORTANT    
+    // Require e/mu trigger to have unbiased sample of jets (and larger fraction of b-jets since many of these are ttbar events)
+    // if (!m_trigDecTool->isPassed(m_ElectronTrigger_201X) && !m_trigDecTool->isPassed(m_MuonTrigger_201X)) // 201X menu triggers
+    //return StatusCode::SUCCESS;
+  }
+  
+  Event_CutFlow = 4;
+  fill(tool,Event_CutFlow);
+
+  //Events are selected
+  //Fill track plots with ID tracks
+  //Fill jet histograms (after Jet Selection)  
+
+  ///////////////////////////////
+  //* TrackParticle container *//
+  ///////////////////////////////
+        
+  auto nTracks = Monitored::Scalar<int>("nTracks",0);
+
+  uint8_t nPixelHits  = 0;
+  uint8_t nSCTHits    = 0;
+  uint8_t nBLayerHits = 0;
+  uint8_t nTRTHits    = 0;
+
+  auto nHitsBLayer = Monitored::Scalar<float>("nHitsBLayer",0);
+  auto nHitsPixel = Monitored::Scalar<float>("nHitsPixel",0);
+  auto nHitsSCT = Monitored::Scalar<float>("nHitsSCT",0);
+  auto nHitsSi = Monitored::Scalar<float>("nHitsSi",0);
+  auto nHitsTRT = Monitored::Scalar<float>("nHitsTRT",0);
+  auto nHitsID = Monitored::Scalar<float>("nHitsID",0);
+
+  //RESTART FROM HERE
+  SG::ReadHandle<xAOD::TrackParticleContainer> tracks(m_trackContainerKey, ctx);
+  if (!tracks.isValid()) {
+    ATH_MSG_ERROR("Could not find track AOD container with name " << m_trackContainerKey);
+    return StatusCode::FAILURE;
+  }
+  
+  nTracks = tracks->size();
+  fill(tool,nTracks);
+
+  for (const auto& trackItr : *tracks) {
+    trackItr->summaryValue(nBLayerHits, xAOD::numberOfBLayerHits);
+    nHitsBLayer = (float)nBLayerHits;
+    fill(tool, nHitsBLayer);
+    trackItr->summaryValue(nPixelHits, xAOD::numberOfPixelHits);
+    nHitsPixel=(float)nPixelHits;
+    fill(tool, nHitsPixel);
+    trackItr->summaryValue(nSCTHits, xAOD::numberOfSCTHits);
+    nHitsSCT=(float)nSCTHits;
+    fill(tool, nHitsSCT);
+    trackItr->summaryValue(nTRTHits, xAOD::numberOfTRTHits);
+    nHitsTRT=(float)nTRTHits;
+    fill(tool, nHitsTRT);
+    nHitsSi=(float)nPixelHits+(float)nSCTHits;
+    fill(tool, nHitsSi);
+    nHitsID=(float)nPixelHits+(float)nSCTHits+(float)nTRTHits;
+    fill(tool, nHitsID);
+        
+    ATH_MSG_DEBUG("Track hits: BLayer = " << nHitsBLayer << ", PIX = " << nHitsBLayer);
+    ATH_MSG_DEBUG("Track hits: SCT = " << nHitsSCT << ", Si = " << nHitsSi);
+    ATH_MSG_DEBUG("Track hits: TRT = " << nHitsTRT << ", ID = " << nHitsID);
+    
+  }
+
+  //----------------------Start Muon & Electron Part for ttbar events ------------------------
+
+  //////////////////////
+  //* Muon container *//
+  //////////////////////
+
+  auto muon_PT = Monitored::Scalar<double>("muon_PT",0.0);
+  auto nIsoMuons = Monitored::Scalar<int>("nIsoMuons",0.0);
+  int muonCharge = 0;
+
+  SG::ReadHandle<xAOD::MuonContainer> muons(m_muonContainerKey, ctx);
+  if (! muons.isValid() ) {
+    ATH_MSG_ERROR("evtStore() does not contain muon Collection with name "<< m_muonContainerKey);
+    return StatusCode::FAILURE;
+  }
+
+  for (const auto& muonItr : *muons) {
+    ATH_MSG_DEBUG("Muon kinematics: eta = " << muonItr->eta() << ", phi= " << muonItr->phi() << ", pT= " << muonItr->pt() / Gaudi::Units::GeV);
+    muon_PT = muonItr->pt();
+    fill(tool,muon_PT);
+
+    //Look for isolated muons (for ttbar events selection)
+    //select muons which passed pT cut
+    if (muonItr->pt() / Gaudi::Units::GeV < m_MuonPtCut) continue;
+    bool inAcceptance = TMath::Abs(muonItr->eta()) < m_MuonEtaCut;
+    if (!inAcceptance) continue;
+    // medium muons
+    if (muonItr->quality() > 1) continue; // 0 tight, 1 medium, medium <= 1 (includes 0)
+    float topoetcone20_value = -999.;
+    float ptvarcone30_value = -999.;
+    muonItr-> isolation(topoetcone20_value, xAOD::Iso::topoetcone20);
+    muonItr-> isolation(ptvarcone30_value, xAOD::Iso::ptvarcone30);
+    if (topoetcone20_value/muonItr->pt() > m_MuonTopoEtCone20Cut) continue;
+    if (ptvarcone30_value/muonItr->pt() > m_MuonPtVarCone30Cut) continue;
+    muonCharge = muonItr->charge();
+    ++nIsoMuons;
+  }
+
+  if(nIsoMuons>0)
+    ATH_MSG_DEBUG(nIsoMuons << " Muon(s) isolated in event "<< event);
+  fill(tool,nIsoMuons);
+
+  //////////////////////////
+  //* Electron container *//
+  //////////////////////////
+
+  auto electron_PT = Monitored::Scalar<double>("electron_PT",0.0);
+  auto nIsoElectrons = Monitored::Scalar<int>("nIsoElectrons",0.0);
+  int electronCharge = 0;
+
+  SG::ReadHandle<xAOD::ElectronContainer> electrons(m_electronContainerKey, ctx);
+  if (! electrons.isValid() ) {
+    ATH_MSG_ERROR("evtStore() does not contain electron Collection with name "<< m_electronContainerKey);
+    return StatusCode::FAILURE;
+  }
+
+  for (const auto& electronItr : *electrons) {
+    ATH_MSG_DEBUG("Electron kinematics: eta = " << electronItr->eta() << ", phi= " << electronItr->phi() << ", pT= " << electronItr->pt() / Gaudi::Units::GeV);
+    electron_PT = electronItr->pt();
+    fill(tool,electron_PT);
+
+    //select electrons which passed author and pT cut
+    if (!electronItr->author(xAOD::EgammaParameters::AuthorElectron)) continue; 
+    if (electronItr->pt() / Gaudi::Units::GeV < m_ElectronPtCut) continue;
+    bool inAcceptance = (TMath::Abs(electronItr->eta()) > m_ElectronEtaCrackHighCut || TMath::Abs(electronItr->eta()) < m_ElectronEtaCrackLowCut) 
+      && TMath::Abs(electronItr->eta()) < m_ElectronEtaCut;
+    if (!inAcceptance) continue;
+    // select mediumLH electron
+    bool lhmedium = false;
+    electronItr->passSelection(lhmedium, "LHMedium");
+    if (!lhmedium) continue;
+    float topoetcone20_value = -999.;
+    float ptvarcone20_value = -999.;
+    electronItr-> isolationValue(topoetcone20_value, xAOD::Iso::topoetcone20);
+    electronItr-> isolationValue(ptvarcone20_value, xAOD::Iso::ptvarcone20);
+    if (topoetcone20_value/electronItr->pt() > m_ElectronTopoEtCone20Cut) continue;
+    if (ptvarcone20_value/electronItr->pt() > m_ElectronPtVarCone20Cut) continue;
+    electronCharge = electronItr->charge();
+    ++nIsoElectrons;
+  }
+
+  if(nIsoElectrons>0)
+    ATH_MSG_DEBUG(nIsoElectrons << " Electron(s) isolated in event "<< event);
+
+  fill(tool,nIsoElectrons);
+
+  // require == 1 electron, == 1 muon and opposite charged leptons
+  bool isTTbarEvent = false;
+  if (nIsoElectrons == 1 && nIsoMuons == 1 && electronCharge*muonCharge == -1) isTTbarEvent = true;
+
+  if(isTTbarEvent)
+    ATH_MSG_DEBUG("This is ttbar event "<< event);
+
+
+  /////////////////////
+  //* Jet container *//
+  /////////////////////
+
+  ATH_MSG_DEBUG("Start jet part");
+
+  //----------------------Start Jet Part---------------------------
+
+  SG::ReadHandle<xAOD::JetContainer> jets(m_jetContainerKey, ctx);
+  if (!jets.isValid()) {
+    ATH_MSG_ERROR("Could not find jet AOD container with name " << m_jetContainerKey);
+    return StatusCode::FAILURE;
+  }
+
+  //--> last Event CutFlow cut --> fill Jet CutFlow plot
+ 
+  //r21 jet cutflow
+  // m_cutflow_jet->GetXaxis()->SetBinLabel(1,"All");
+  // m_cutflow_jet->GetXaxis()->SetBinLabel(2,"Quality Cuts");
+  // m_cutflow_jet->GetXaxis()->SetBinLabel(3,"Kinematic Cuts");
+  // m_cutflow_jet->GetXaxis()->SetBinLabel(4,"JVT Cut");
+  // m_cutflow_jet->GetXaxis()->SetBinLabel(5,"Muon Overlap");
+  // m_cutflow_jet->GetXaxis()->SetBinLabel(6,"Taggable");
+  // m_cutflow_jet->GetXaxis()->SetBinLabel(7,"Taggable Good");
+  // m_cutflow_jet->GetXaxis()->SetBinLabel(8,"Taggable Suspect");
+
+  auto Jet_CutFlow = Monitored::Scalar<int>("Jet_CutFlow",0);
+ 
+  auto nJets = Monitored::Scalar<int>("nJets",0.0);
+
+  auto jet_PT = Monitored::Scalar<float>("jet_PT",0.0);
+  auto jet_ETA = Monitored::Scalar<float>("jet_ETA",0.0);
+  auto jet_PHI = Monitored::Scalar<float>("jet_PHI",0.0);
+
+  auto jet_eta_all = Monitored::Scalar<float>("jet_eta_all",0.0);
+  auto jet_phi_all = Monitored::Scalar<float>("jet_phi_all",0.0);
+  auto jet_eta_quality = Monitored::Scalar<float>("jet_eta_quality",0.0);
+  auto jet_phi_quality = Monitored::Scalar<float>("jet_phi_quality",0.0);
+  auto jet_eta_kin = Monitored::Scalar<float>("jet_eta_kin",0.0);
+  auto jet_phi_kin = Monitored::Scalar<float>("jet_phi_kin",0.0);
+  auto jet_eta_jvt = Monitored::Scalar<float>("jet_eta_jvt",0.0);
+  auto jet_phi_jvt = Monitored::Scalar<float>("jet_phi_jvt",0.0);
+  auto jet_eta_overlap = Monitored::Scalar<float>("jet_eta_overlap",0.0);
+  auto jet_phi_overlap = Monitored::Scalar<float>("jet_phi_overlap",0.0);
+  auto jet_eta_good = Monitored::Scalar<float>("jet_eta_good",0.0);
+  auto jet_phi_good = Monitored::Scalar<float>("jet_phi_good",0.0);
+  auto jet_eta_suspect = Monitored::Scalar<float>("jet_eta_suspect",0.0);
+  auto jet_phi_suspect = Monitored::Scalar<float>("jet_phi_suspect",0.0);
+  auto jet_eta_bad = Monitored::Scalar<float>("jet_eta_bad",0.0);
+  auto jet_phi_bad = Monitored::Scalar<float>("jet_phi_bad",0.0);
+  auto jet_eta_smt = Monitored::Scalar<float>("jet_eta_smt",0.0);
+  auto jet_phi_smt = Monitored::Scalar<float>("jet_phi_smt",0.0);
+
+  auto jet_MV = Monitored::Scalar<double>("jet_MV",0.0);
+  auto jet_DL = Monitored::Scalar<float>("jet_DL",0.0);
+
+  //Variables for TTbar events
+  const xAOD::Jet* firstTTbarJet = nullptr;
+  auto nTTbarGoodJets = Monitored::Scalar<int>("nTTbarGoodJets",0.0);
+
+  // soft muon observables
+  auto nSoftMuons = Monitored::Scalar<int>("nSoftMuons",0.0);
+  auto nSMTJets = Monitored::Scalar<int>("nSMTJets",0.0);
+  auto drSMT = Monitored::Scalar<float>("drSMT",0.0);
+  auto ptSMT_jet = Monitored::Scalar<float>("ptSMT_jet",0.0);
+  auto ptSMT_mu = Monitored::Scalar<float>("ptSMT_mu",0.0);
+  auto ptSMT_ratio = Monitored::Scalar<float>("ptSMT_ratio",0.0);
+  auto mvSMT = Monitored::Scalar<float>("mvSMT",0.0);
+  TLorentzVector smt_jet, smt_mu;
+  auto pTrelSMT = Monitored::Scalar<float>("pTrelSMT",0.0);
+
+  nJets = jets->size();
+  fill(tool,nJets);
+
+  for (const auto& jetItr : *jets) {
+    
+    jet_PT = jetItr->pt() / Gaudi::Units::GeV;
+    jet_ETA = jetItr->eta();
+    jet_PHI = jetItr->phi();
+    ATH_MSG_DEBUG("Jet kinematics: eta = " << jet_ETA << ", phi= " << jet_PHI << ", pT= " << jet_PT);
+
+    fill(tool,jet_PT);
+    fill(tool,jet_ETA);
+    fill(tool,jet_PHI);
+ 
+    // All jets
+    Jet_CutFlow = 0;
+    fill(tool,Jet_CutFlow);
+
+    jet_eta_all = jetItr->eta();
+    jet_phi_all = jetItr->phi();
+    fill(tool,jet_eta_all,jet_phi_all);//fill 2D plot
+
+    if( !passJetQualityCuts(jetItr) ) continue;
+    
+    // Jets passing quality cuts --> quality jets (standard jet cleaning cuts)
+    Jet_CutFlow = 1;
+    fill(tool,Jet_CutFlow);
+    jet_eta_quality = jetItr->eta();
+    jet_phi_quality = jetItr->phi();
+    fill(tool,jet_eta_quality,jet_phi_quality);//fill 2D plot
+    
+    if ( !passKinematicCuts(jetItr) ) continue; 
+    
+    // Jets passing kinematic cuts
+    Jet_CutFlow = 2;
+    fill(tool,Jet_CutFlow);
+    jet_eta_kin = jetItr->eta();
+    jet_phi_kin = jetItr->phi();
+    fill(tool,jet_eta_kin,jet_phi_kin);//fill 2D plot
+    
+    // fillTrackInJetHistograms(jetItr); // fill histograms with properties of associated tracks
+
+    if ( !passJVTCuts(jetItr) ) continue; 
+
+    // Jets passing JVT cuts
+    Jet_CutFlow = 3;
+    fill(tool,Jet_CutFlow);
+    jet_eta_jvt = jetItr->eta();
+    jet_phi_jvt = jetItr->phi();
+    fill(tool,jet_eta_jvt,jet_phi_jvt);//fill 2D plot
+ 
+    //if ( !passMuonOverlap(jetItr,ctx) ) continue; //developed inside
+
+    // loop over muon container  
+    int n_isoMuons = 0, n_ptMuons = 0;
+    for (const auto& muonItr : *muons) {
+      // do stuff with muons, i.e.  muonItr->pt();
+
+      //select muons which passed pT cut
+      if (muonItr->pt() / Gaudi::Units::GeV < m_MuonPtCut) continue;
+      bool inAcceptance = TMath::Abs(muonItr->eta()) < m_MuonEtaCut;
+      if (!inAcceptance) continue;
+      // medium muons
+      //if ((*muonItr)->quality() > 1) continue; // 0 tight, 1 medium, medium <= 1 (includes 0)
+
+      if ( (muonItr->pt() > (0.9*jetItr->pt())) && (jetItr->p4().DeltaR(muonItr->p4())<0.4) ) ++n_ptMuons;
+
+      float topoetcone20_value = -999.;
+      float ptvarcone30_value = -999.;
+      muonItr-> isolation(topoetcone20_value, xAOD::Iso::topoetcone20);
+      muonItr-> isolation(ptvarcone30_value, xAOD::Iso::ptvarcone30);
+      if (topoetcone20_value/muonItr->pt() > m_MuonTopoEtCone20Cut) continue;
+      if (ptvarcone30_value/muonItr->pt() > m_MuonPtVarCone30Cut) continue;
+      if (jetItr->p4().DeltaR(muonItr->p4())<0.4) ++n_isoMuons;
+    }
+  
+    ATH_MSG_DEBUG("Number of isolated muons within this jet: \"" << n_isoMuons);
+    ATH_MSG_DEBUG("Number of muons with 90% pT within this jet: \"" << n_ptMuons);
+
+    if(n_isoMuons>0) continue;
+    if(n_ptMuons>0) continue;
+  
+    // Jets passing basic isolated-muon overlap
+    Jet_CutFlow = 4;
+    fill(tool,Jet_CutFlow);
+    jet_eta_overlap = jetItr->eta();
+    jet_phi_overlap = jetItr->phi();
+    fill(tool,jet_eta_overlap,jet_phi_overlap);//fill 2D plot
+ 
+    Jet_t taggabilityLabel = getTaggabilityLabel(jetItr); // check if jet is taggable (defined as goodJet or suspectJet or badJet)
+
+    if ( taggabilityLabel == goodJet ) {
+      Jet_CutFlow = 5;
+      fill(tool,Jet_CutFlow);
+      jet_eta_good = jetItr->eta();
+      jet_phi_good = jetItr->phi();
+      fill(tool,jet_eta_good,jet_phi_good);//fill 2D plot
+
+      fillGoodJetHistos(jetItr); //fill good jet histograms, also with b-tagging information
+
+      //Fill ttbar plots (top)
+      if (isTTbarEvent){// Looking for ttbar events
+
+	++nTTbarGoodJets; //good jet counter, to check if jets are more than 2
+
+	if (nTTbarGoodJets == 1) firstTTbarJet = jetItr; //1st jet needed to fill ttbar histograms (if a 2nd jet is found later)
+	 
+	if(nTTbarGoodJets >= 2) { //at least 2 good jets --> fill ttbar histograms
+	  fillTTbarHistograms(jetItr); // fill histograms with b-tagging information
+	  if (nTTbarGoodJets == 2) { //(at least) two good jets --> fill also for 1st jet
+	    fillTTbarHistograms(firstTTbarJet); // fill histograms with b-tagging information
+	  }
+	}
+	
+      }
+
+      //Fill SMT jet plots (loop over muons looking for soft muons)
+
+      if (jetItr-> pt() / Gaudi::Units::GeV < m_JetPtCut) continue; // stronger Jet pT cut (25 GeV, eta < 2.5)
+      bool inAcceptance = TMath::Abs(jetItr-> eta()) < m_JetEtaCut; // usual eta cut
+      if (!inAcceptance) continue;
+
+      Jet_CutFlow = 8;
+      fill(tool,Jet_CutFlow);
+
+      nSoftMuons = 0; //restarting counter;
+
+      for (const auto& softMuonItr : *muons) {
+	//Look for soft muons (for SMT jets selection)
+	//select soft muons which pass eta and pT cut
+	bool inAcceptance = TMath::Abs(softMuonItr->eta()) < m_MuonEtaCut;
+	if (!inAcceptance) continue;
+	if (softMuonItr->pt() / Gaudi::Units::GeV < m_softMuonPtCut) continue; //fixed pT cut 5 GeV
+	// NO QUALITY (previously tight muons)
+	//if (softMuonItr->quality() > 0) continue; // 0 tight, 1 medium, 1 & 0 tight & medium
+	const ElementLink< xAOD::TrackParticleContainer >& pMuIDTrack=softMuonItr->inDetTrackParticleLink();
+	const ElementLink< xAOD::TrackParticleContainer >& pMuMSTrack=softMuonItr->muonSpectrometerTrackParticleLink();
+	if ( !pMuIDTrack.isValid() || !pMuMSTrack.isValid()) continue;
+	if (softMuonItr->muonType()!= xAOD::Muon::Combined) continue; //combined
+	if (softMuonItr->primaryTrackParticle()->d0() > 0.4) continue; // d0 cut < 0.4 mm
+	//this need to be done at jet level
+	drSMT = (jetItr->p4()).DeltaR(softMuonItr->p4());
+	if ( drSMT >= 0.4) continue; //jet muon DR < 0.4
+	ptSMT_mu = softMuonItr->pt() / Gaudi::Units::GeV;
+	smt_mu.SetPtEtaPhiE(softMuonItr->pt(),softMuonItr->eta(),softMuonItr->phi(),softMuonItr->e());
+	++nSoftMuons;
+      }//end loop on muons
+
+      ATH_MSG_DEBUG("Number of soft muons per jet is " << nSoftMuons);
+      fill(tool,nSoftMuons);
+
+      if( nSoftMuons == 1){
+	ptSMT_jet = jetItr->pt() / Gaudi::Units::GeV;
+	jet_eta_smt = jetItr->eta();
+	jet_phi_smt = jetItr->phi();
+	smt_jet.SetPtEtaPhiE(jetItr->pt(),jetItr->eta(),jetItr->phi(),jetItr->e());
+	++nSMTJets;
+      }
+
+    }
+    else if ( taggabilityLabel == suspectJet ) {
+      Jet_CutFlow = 6;
+      fill(tool,Jet_CutFlow);
+      jet_eta_suspect = jetItr->eta();
+      jet_phi_suspect = jetItr->phi();
+      fill(tool,jet_eta_suspect,jet_phi_suspect);//fill 2D plot
+
+      // fillSuspectJetHistos(*jetItr); //other histograms to fill
+    }
+    else if ( taggabilityLabel == badJet ) {
+      Jet_CutFlow = 7;
+      fill(tool,Jet_CutFlow);
+      jet_eta_bad = jetItr->eta();
+      jet_phi_bad = jetItr->phi();
+      fill(tool,jet_eta_bad,jet_phi_bad);//fill 2D plot
+
+      //fillBadJetHistos(*jetItr); //other histograms to fill
+    }
+    
+    double mv = 0; 
+    mv = getMVweight(jetItr); // get MV weight (MV2c10/DL1*)
+    jet_MV = mv;
+    
+    fill(tool,jet_MV);
+
+  }
+  //end of jetItr loop
+
+  //ATH_MSG_DEBUG("... done fillJetHistograms()");
+
+  if(isTTbarEvent){
+    ATH_MSG_DEBUG("Number of jets in ttbar events " << nTTbarGoodJets);
+    fill(tool,nTTbarGoodJets);
+  }
+
+  ATH_MSG_DEBUG("Number of jets with == 1 soft muon per event is " << nSMTJets);
+  fill(tool,nSMTJets);
+
+  if (nSMTJets == 1){ //Fill SMT plots 
+    fill(tool,drSMT);
+    fill(tool,ptSMT_mu);
+    fill(tool,ptSMT_jet);
+    ptSMT_ratio = ptSMT_mu/ptSMT_jet;
+    fill(tool,ptSMT_ratio);
+    pTrelSMT = smt_mu.Perp((smt_jet+smt_mu).Vect()) / Gaudi::Units::GeV;
+    fill(tool,pTrelSMT);
+    // m_smt_jet_mv_w->Fill(mv);   
+    fill(tool,jet_eta_smt,jet_phi_smt);//fill 2D plot
+  }
+
+  // Two variables (value and passed) needed for TEfficiency
+  // auto pT = Monitored::Scalar<float>("pT",0.0);
+  // auto pT_passed = Monitored::Scalar<float>("pT_passed",false);
+
+  return StatusCode::SUCCESS;
+}
+
+bool JetTagMonitorAlgorithm::passJetQualityCuts(const xAOD::Jet *jet) const {
+
+  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);
+  std::vector<float> SumPtTrkPt1000;
+  jet->getAttribute(xAOD::JetAttribute::SumPtTrkPt1000,SumPtTrkPt1000);
+  float chf             = SumPtTrkPt1000.size() > 0 ? SumPtTrkPt1000.at(0)/jet->pt() : -1;
+  float emf             = jet->getAttribute<float>(xAOD::JetAttribute::EMFrac);
+  float hecf            = jet->getAttribute<float>(xAOD::JetAttribute::HECFrac); 
+  float fracSamplingMax = jet->getAttribute<float>(xAOD::JetAttribute::FracSamplingMax); 
+ 	
+  if ( 
+      !(
+	(hecf>0.5 && fabs(hecq)>0.5) || (fabs(negE) > 60*Gaudi::Units::GeV) ||
+	(emf>0.95 && fabs(jetQuality)>0.8 && fabs(jet->eta()) < 2.8) || 
+	(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; 
+  }
+	
+  if (m_skipJetQuality) //In case of Ion-Ion or Ion-proton collision
+    pass_cuts = true; //Skip the Jet Quality cuts (thresholds tuned on pp event jets)
+
+  return pass_cuts;
+}
+
+bool JetTagMonitorAlgorithm::passKinematicCuts(const xAOD::Jet *jet) const {
+  
+  ATH_MSG_DEBUG("passKinematicCuts()");
+  ATH_MSG_DEBUG("Jet kinematics: eta = " << jet->eta() << ", phi= " << jet->phi() << ", pT= " << jet->pt() / Gaudi::Units::GeV);
+
+  // kinematic cuts defined as properties
+  if ( jet->pt()  / Gaudi::Units::GeV < m_JetPtCut || fabs(jet->eta()) > m_JetEtaCut )
+    return false;
+
+  return true;
+}
+
+
+bool JetTagMonitorAlgorithm::passJVTCuts(const xAOD::Jet *jet) const {
+
+  ATH_MSG_DEBUG("passJVTCuts()");
+  
+  static SG::AuxElement::Accessor<float> JVT( "Jvt" ); //JVT > 0.59 (60 GeV)
+  double jvt = JVT(*jet);
+
+  if( !( ((jet->pt()<60000)&&(abs(jet->eta())<2.4)&&(jvt > 0.59))||((jet->pt()<60000)&&(abs(jet->eta())>2.4))||(jet->pt()>60000) ) ) return false;
+
+  return true;
+}
+
+JetTagMonitorAlgorithm::Jet_t JetTagMonitorAlgorithm::getTaggabilityLabel(const xAOD::Jet *jet) const {
+  
+  // goodJet    = jet with at least one associated track passing track selection
+  // suspectJet = as goodJet but, at least one associated track does not pass deadBLayer, nHitBLayer or nSiHit requirement
+  // badJet     = not goodJet (i.e. no associated track passing track selection)
+
+  // ATH_MSG_DEBUG("in applyTaggabilityCuts()");
+
+  if(jet->pt()<25000) //fill properly
+    return badJet;
+
+  if(TMath::Abs(jet->eta())>2.5) //fill properly
+    return badJet;
+
+  return goodJet;
+}
+
+
+double JetTagMonitorAlgorithm::getMVweight(const xAOD::Jet *jet) const {
+
+  ATH_MSG_DEBUG("retrieving MV2c10/DL1* weight");
+  
+  const xAOD::BTagging* btag = jet->btagging();
+
+  if (!btag) return 0;
+
+  double mv = 0, mv_pu = 0, mv_pb = 0, mv_pc = 0;  
+  if(m_mv_algorithmName=="MV2c10" || m_mv_algorithmName=="MV2c10mu" || m_mv_algorithmName=="MV2c10rnn" || m_mv_algorithmName=="MV2c10r" || m_mv_algorithmName=="MV2c10rmu"){
+    btag->MVx_discriminant(m_mv_algorithmName,mv);
+  }
+  else if (m_mv_algorithmName=="DL1" || m_mv_algorithmName=="DL1mu" || m_mv_algorithmName=="DL1rnn" || m_mv_algorithmName=="DL1r" || m_mv_algorithmName=="DL1rmu"){
+    btag->pu(m_mv_algorithmName,mv_pu); 
+    btag->pb(m_mv_algorithmName,mv_pb); 
+    btag->pc(m_mv_algorithmName,mv_pc); 
+    mv = log(mv_pb/(mv_pu*(1-m_mv_cFrac)+m_mv_cFrac*mv_pc));
+  } //DL1* formula      
+
+  return mv;
+}
+
+void JetTagMonitorAlgorithm::fillTTbarHistograms(const xAOD::Jet *jet) const {
+  
+  double mv = getMVweight(jet); // get MV weight (MV2c10/DL1*)
+
+  auto tool = getGroup("JetTagMonitor");
+
+  auto nTTbarJets_pretag = Monitored::Scalar<float>("nTTbarJets_pretag",0);
+  auto nTTbarJets_60tag = Monitored::Scalar<float>("nTTbarJets_60tag",0);
+  auto nTTbarJets_70tag = Monitored::Scalar<float>("nTTbarJets_70tag",0);
+  auto nTTbarJets_77tag = Monitored::Scalar<float>("nTTbarJets_77tag",0);
+  auto nTTbarJets_85tag = Monitored::Scalar<float>("nTTbarJets_85tag",0);
+
+  auto ptTTbarJet_pretag = Monitored::Scalar<float>("ptTTbarJet_pretag",0);
+  auto ptTTbarJet_60tag = Monitored::Scalar<float>("ptTTbarJet_60tag",0);
+  auto ptTTbarJet_70tag = Monitored::Scalar<float>("ptTTbarJet_70tag",0);
+  auto ptTTbarJet_77tag = Monitored::Scalar<float>("ptTTbarJet_77tag",0);
+  auto ptTTbarJet_85tag = Monitored::Scalar<float>("ptTTbarJet_85tag",0);
+
+  nTTbarJets_pretag=1;
+  fill(tool,nTTbarJets_pretag);
+  ptTTbarJet_pretag=mv;
+  fill(tool,ptTTbarJet_pretag);
+
+  if (mv > m_mv_85_weight_cut) {
+    nTTbarJets_85tag=1;
+    fill(tool,nTTbarJets_pretag);
+    ptTTbarJet_85tag=jet->pt() / Gaudi::Units::GeV;
+    fill(tool,ptTTbarJet_85tag);
+  }
+  if (mv > m_mv_77_weight_cut) {
+    nTTbarJets_77tag=1;
+    fill(tool,nTTbarJets_pretag);
+    ptTTbarJet_77tag=jet->pt() / Gaudi::Units::GeV;
+    fill(tool,ptTTbarJet_77tag);
+  }
+  if (mv > m_mv_70_weight_cut) {
+    nTTbarJets_70tag=1;
+    fill(tool,nTTbarJets_pretag);
+    ptTTbarJet_70tag=jet->pt() / Gaudi::Units::GeV;
+    fill(tool,ptTTbarJet_70tag);
+  }
+  if (mv > m_mv_60_weight_cut) {
+    nTTbarJets_60tag=1;
+    fill(tool,nTTbarJets_pretag);
+    ptTTbarJet_60tag=jet->pt() / Gaudi::Units::GeV;
+    fill(tool,ptTTbarJet_60tag);
+  }
+
+  return;
+}
+
+
+void JetTagMonitorAlgorithm::fillGoodJetHistos(const xAOD::Jet *jet) const {
+
+  double mv = getMVweight(jet); // get MV weight (MV2c10/DL1*)
+
+  auto tool = getGroup("JetTagMonitor");
+
+  auto jet_MV = Monitored::Scalar<float>("jet_MV",0);
+  
+  jet_MV = mv;
+  fill(tool,jet_MV);
+
+  auto jet_MV_mu_0_30 = Monitored::Scalar<float>("jet_MV_mu_0_30",0);
+  auto jet_MV_mu_30_50 = Monitored::Scalar<float>("jet_MV_mu_30_50",0);
+  auto jet_MV_mu_50_100 = Monitored::Scalar<float>("jet_MV_mu_50_100",0);
+
+  double mu = 15; //define mu!
+
+  if ( mu > 0. && mu < 30. ) {
+    jet_MV_mu_0_30 = mv;
+    fill(tool,jet_MV_mu_0_30);}
+  else if ( mu > 30. && mu < 50. ) {
+    jet_MV_mu_30_50 = mv;
+    fill(tool,jet_MV_mu_30_50);}
+  else if ( mu > 50. && mu < 100. ) {
+    jet_MV_mu_50_100 = mv;
+    fill(tool,jet_MV_mu_50_100);}
+
+  // Fill general jet kinematic plots vs High level tagger
+  auto jet_MV_pt_0_20 = Monitored::Scalar<float>("jet_MV_pt_0_20",0);
+  auto jet_MV_pt_20_40 = Monitored::Scalar<float>("jet_MV_pt_20_40",0);
+  auto jet_MV_pt_40_70 = Monitored::Scalar<float>("jet_MV_pt_40_70",0);
+  auto jet_MV_pt_70_100 = Monitored::Scalar<float>("jet_MV_pt_70_100",0);
+  auto jet_MV_pt_100_150 = Monitored::Scalar<float>("jet_MV_pt_100_150",0);
+  auto jet_MV_pt_150_200 = Monitored::Scalar<float>("jet_MV_pt_150_200",0);
+  auto jet_MV_pt_200_1000 = Monitored::Scalar<float>("jet_MV_pt_200_1000",0);
+
+  if      ( jet->pt() / Gaudi::Units::GeV < 1000. ) {
+
+    if      ( jet->pt() / Gaudi::Units::GeV > 200. ) {
+      jet_MV_pt_200_1000=mv;
+      fill(tool,jet_MV_pt_200_1000);}
+    else if ( jet->pt() / Gaudi::Units::GeV > 150. ) {
+      jet_MV_pt_150_200=mv;
+      fill(tool,jet_MV_pt_150_200);}
+    else if ( jet->pt() / Gaudi::Units::GeV > 100. ) {
+      jet_MV_pt_100_150=mv;
+      fill(tool,jet_MV_pt_100_150);}
+    else if ( jet->pt() / Gaudi::Units::GeV > 70. ) {
+      jet_MV_pt_70_100=mv;
+      fill(tool,jet_MV_pt_70_100);}
+    else if ( jet->pt() / Gaudi::Units::GeV > 40. ) {
+      jet_MV_pt_40_70=mv;
+      fill(tool,jet_MV_pt_40_70);}
+    else if ( jet->pt() / Gaudi::Units::GeV > 20. ) {
+      jet_MV_pt_20_40=mv;
+      fill(tool,jet_MV_pt_20_40);}
+    else if ( jet->pt() / Gaudi::Units::GeV > 0. ) {
+      jet_MV_pt_0_20=mv;
+      fill(tool,jet_MV_pt_0_20);}
+
+  }
+
+  //fill jet MV plots in eta and phi bins
+  auto jet_MV_eta_00_05 = Monitored::Scalar<float>("jet_MV_eta_00_05",0);
+  auto jet_MV_eta_05_10 = Monitored::Scalar<float>("jet_MV_eta_05_10",0);
+  auto jet_MV_eta_10_15 = Monitored::Scalar<float>("jet_MV_eta_10_15",0);
+  auto jet_MV_eta_15_20 = Monitored::Scalar<float>("jet_MV_eta_15_20",0);
+  auto jet_MV_eta_20_25 = Monitored::Scalar<float>("jet_MV_eta_20_25",0);
+
+  auto jet_MV_phi_00_05 = Monitored::Scalar<float>("jet_MV_phi_00_05",0);
+  auto jet_MV_phi_05_10 = Monitored::Scalar<float>("jet_MV_phi_05_10",0);
+  auto jet_MV_phi_10_15 = Monitored::Scalar<float>("jet_MV_phi_10_15",0);
+  auto jet_MV_phi_15_20 = Monitored::Scalar<float>("jet_MV_phi_15_20",0);
+  auto jet_MV_phi_20_25 = Monitored::Scalar<float>("jet_MV_phi_20_25",0);
+  auto jet_MV_phi_25_31 = Monitored::Scalar<float>("jet_MV_phi_25_31",0);
+
+  if      ( fabs(jet->eta()) > 2.0 ) {
+    jet_MV_eta_20_25=mv;
+    fill(tool,jet_MV_eta_20_25);}
+  else if ( fabs(jet->eta()) > 1.5 ) {
+    jet_MV_eta_15_20=mv;
+    fill(tool,jet_MV_eta_15_20);}
+  else if ( fabs(jet->eta()) > 1.0 ) {
+    jet_MV_eta_10_15=mv;
+    fill(tool,jet_MV_eta_10_15);}
+  else if ( fabs(jet->eta()) > 0.5 ) {
+    jet_MV_eta_05_10=mv;
+    fill(tool,jet_MV_eta_05_10);}
+  else if ( fabs(jet->eta()) > 0.0 ) {
+    jet_MV_eta_00_05=mv;
+    fill(tool,jet_MV_eta_00_05);}
+
+  if      ( fabs(jet->phi()) > 2.5 ) {
+    jet_MV_phi_25_31=mv;
+    fill(tool,jet_MV_phi_25_31);}
+  if      ( fabs(jet->phi()) > 2.0 ) {
+    jet_MV_phi_20_25=mv;
+    fill(tool,jet_MV_phi_20_25);}
+  else if ( fabs(jet->phi()) > 1.5 ) {
+    jet_MV_phi_15_20=mv;
+    fill(tool,jet_MV_phi_15_20);}
+  else if ( fabs(jet->phi()) > 1.0 ) {
+    jet_MV_phi_10_15=mv;
+    fill(tool,jet_MV_phi_10_15);}
+  else if ( fabs(jet->phi()) > 0.5 ) {
+    jet_MV_phi_05_10=mv;
+    fill(tool,jet_MV_phi_05_10);}
+  else if ( fabs(jet->phi()) > 0.0 ) {
+    jet_MV_phi_00_05=mv;
+    fill(tool,jet_MV_phi_00_05);}
+
+  //fill efficiency plots of eta and phi distributions vs MV tag WP
+  auto jet_eta_pretag = Monitored::Scalar<float>("jet_eta_pretag",0);
+  auto jet_eta_60tag = Monitored::Scalar<float>("jet_eta_60tag",0);
+  auto jet_eta_70tag = Monitored::Scalar<float>("jet_eta_70tag",0);
+  auto jet_eta_77tag = Monitored::Scalar<float>("jet_eta_77tag",0);
+  auto jet_eta_85tag = Monitored::Scalar<float>("jet_eta_85tag",0);
+
+  auto jet_phi_pretag = Monitored::Scalar<float>("jet_phi_pretag",0);
+  auto jet_phi_60tag = Monitored::Scalar<float>("jet_phi_60tag",0);
+  auto jet_phi_70tag = Monitored::Scalar<float>("jet_phi_70tag",0);
+  auto jet_phi_77tag = Monitored::Scalar<float>("jet_phi_77tag",0);
+  auto jet_phi_85tag = Monitored::Scalar<float>("jet_phi_85tag",0);
+
+  if ( mv > m_mv_85_weight_cut ) {
+    jet_eta_85tag = jet->eta();
+    jet_phi_85tag = jet->phi();
+    fill(tool,jet_eta_85tag,jet_phi_85tag);//fill 2D plot (fill also efficiency?)
+  }
+  if ( mv > m_mv_77_weight_cut ) {
+    jet_eta_77tag = jet->eta();
+    jet_phi_77tag = jet->phi();
+    fill(tool,jet_eta_77tag,jet_phi_77tag);
+  }
+  if ( mv > m_mv_70_weight_cut ) {
+    jet_eta_70tag = jet->eta();
+    jet_phi_70tag = jet->phi();
+    fill(tool,jet_eta_70tag,jet_phi_70tag);
+  }
+  if ( mv >  m_mv_60_weight_cut ) {
+    jet_eta_60tag = jet->eta();
+    jet_phi_60tag = jet->phi();
+    fill(tool,jet_eta_60tag,jet_phi_60tag);
+  }
+  jet_eta_pretag = jet->eta();
+  jet_phi_pretag = jet->phi();
+  fill(tool,jet_eta_pretag,jet_phi_pretag);
+
+  return;
+}
diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.h b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.h
new file mode 100755
index 00000000000..22c13332cc4
--- /dev/null
+++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.h
@@ -0,0 +1,111 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef JETTAGMONITORALGORITHM_H
+#define JETTAGMONITORALGORITHM_H
+
+//Generic
+#include "AthenaMonitoring/AthMonitorAlgorithm.h"
+#include "AthenaMonitoring/Monitored.h"
+#include "StoreGate/ReadHandleKey.h"
+#include "StoreGate/ReadHandle.h"
+
+//Objects
+#include "xAODJet/Jet.h"
+#include "xAODJet/JetContainer.h"
+#include "xAODMuon/MuonContainer.h"
+#include "xAODEgamma/ElectronContainer.h"
+#include "xAODEventInfo/EventInfo.h"
+#include "VxVertex/VxContainer.h"
+#include "xAODTracking/VertexContainer.h"
+#include "TrkTrack/TrackCollection.h"
+#include "TrigDecisionTool/TrigDecisionTool.h"
+
+//Mix
+#include <string>
+#include <vector>
+#include "AthenaBaseComps/AthAlgorithm.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "GaudiKernel/ServiceHandle.h"
+#include <bitset>
+#include <map>
+
+class JetTagMonitorAlgorithm : public AthMonitorAlgorithm {
+ public:
+  JetTagMonitorAlgorithm( const std::string& name, ISvcLocator* pSvcLocator );
+  virtual ~JetTagMonitorAlgorithm();
+  virtual StatusCode initialize() override;
+  virtual StatusCode fillHistograms( const EventContext& ctx ) const override;
+
+ private:
+  SG::ReadHandleKey<xAOD::EventInfo> m_EventInfoKey{this,"EventInfoKey","EventInfo","RHK for xAOD::EventInfo"};
+  SG::ReadHandleKey<xAOD::VertexContainer> m_vertContainerKey{this,"VerticesKey","PrimaryVertices","RHK for primary veritces"};
+  SG::ReadHandleKey<xAOD::TrackParticleContainer> m_trackContainerKey{this,"TracksKey","InDetTrackParticles","RHK for ID tracks"};
+
+  SG::ReadHandleKey<xAOD::JetContainer> m_jetContainerKey;
+  SG::ReadHandleKey<xAOD::MuonContainer> m_muonContainerKey;
+  SG::ReadHandleKey<xAOD::ElectronContainer> m_electronContainerKey;
+  
+  bool m_skipJetQuality; //true for HI/HI-p collisions, false for pp collisions
+  std::string m_trackParticleName;
+  std::string m_primaryVertexName;
+  std::string m_jetName;
+  std::string m_electronName;
+  std::string m_muonName;
+
+  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_JetPtCut;
+  double m_JetEtaCut;
+  double m_softMuonPtCut;
+  double m_MuonPtCut;
+  double m_MuonEtaCut;
+  double m_ElectronPtCut;
+  double m_ElectronEtaCut;
+  double m_ElectronEtaCrackLowCut;
+  double m_ElectronEtaCrackHighCut;
+  double m_ElectronTopoEtCone20Cut;
+  double m_ElectronPtVarCone20Cut;
+  double m_MuonTopoEtCone20Cut;
+  double m_MuonPtVarCone20Cut;
+  double m_MuonPtVarCone30Cut;
+ 
+  std::string m_mv_algorithmName;
+  unsigned int m_mv_nBins;
+  double m_mv_rangeStart;
+  double m_mv_rangeStop;
+  double m_mv_cFrac;
+  double m_mv_60_weight_cut;
+  double m_mv_70_weight_cut;
+  double m_mv_77_weight_cut;
+  double m_mv_85_weight_cut;
+
+  //Additional methods
+  enum Jet_t { goodJet, suspectJet, badJet };
+  void fillGoodJetHistos(const xAOD::Jet *jet) const;
+  void fillSuspectJetHistos(const xAOD::Jet *jet) const;
+  void fillBadJetHistos(const xAOD::Jet *jet) const;
+  void fillDetailedHistograms(const xAOD::Jet *jet, Jet_t taggabilityLabel) const;
+  void fillTrackInJetHistograms(const xAOD::Jet *jet) const;
+  void fillTTbarHistograms(const xAOD::Jet *jet) const;
+  bool passJetQualityCuts(const xAOD::Jet *jet) const;
+  bool passKinematicCuts(const xAOD::Jet *jet) const;
+  bool passJVTCuts(const xAOD::Jet *jet) const;
+  bool passMuonOverlap(const xAOD::Jet *jet) const;
+  double getMVweight(const xAOD::Jet *jet) const;
+  Jet_t getTaggabilityLabel(const xAOD::Jet *jet) const; 
+
+  ToolHandle< Trig::TrigDecisionTool > m_trigDecTool;
+  std::string m_ElectronTrigger_201X;
+  std::string m_MuonTrigger_201X;
+  std::string m_JetTrigger_201X;
+
+};
+#endif
diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/components/JetTagMonitoring_entries.cxx b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/components/JetTagMonitoring_entries.cxx
index 9ed85791490..31a3b80d3b7 100644
--- a/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/components/JetTagMonitoring_entries.cxx
+++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/components/JetTagMonitoring_entries.cxx
@@ -1,4 +1,5 @@
 #include "JetTagMonitoring/JetTagMonitoring.h"
+#include "../JetTagMonitorAlgorithm.h"
 
 DECLARE_COMPONENT( JetTagMonitoring )
-
+DECLARE_COMPONENT( JetTagMonitorAlgorithm )
-- 
GitLab