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