From d14481038cb201890cea9d0e53d75dc07009c438 Mon Sep 17 00:00:00 2001
From: Yingrui Hou <yingrui.hou@cern.ch>
Date: Tue, 26 Jan 2021 17:48:18 +0100
Subject: [PATCH] new handler to check difference between two rootfiles

---
 handlers/PrCheckerMRDifferenceHandler.py | 1055 ++++++++++++++++++++++
 1 file changed, 1055 insertions(+)
 create mode 100644 handlers/PrCheckerMRDifferenceHandler.py

diff --git a/handlers/PrCheckerMRDifferenceHandler.py b/handlers/PrCheckerMRDifferenceHandler.py
new file mode 100644
index 00000000..70621e37
--- /dev/null
+++ b/handlers/PrCheckerMRDifferenceHandler.py
@@ -0,0 +1,1055 @@
+# Handler for summarizing the output of PrChecker2.
+#
+# It extracts the most interesting histograms and also
+# produces efficiency histograms of reconstructed vs
+# reconstructible tracks for different tracking categories.
+#
+# The 1D efficiencies are calculated usig TGraphAsymmErrors
+# and Bayesian error bars
+# The 2D efficiencies are calculated via TH2 and using standard error calculation. 
+#
+# Based on: PrCheckerEfficieincyHandler and _HLT2
+# author: Miroslav Saur (miroslav.saur@cern.ch) & Suzanne Klaver (suzanne.klaver@cern.ch)
+# Version:
+#	   - 0.1 (2020/01): basic plots and efficiencies as in LHCb-FIGURE-2019-
+#	   - 0.2 (2020/04): updated to work with python3
+#	   - 0.3 (2020/06): removal of basic plots, adding efficiecies for different track types	 
+#
+
+import os,sys
+import argparse
+import ROOT
+import math
+from ROOT import gStyle
+from ROOT import gROOT
+from ROOT import TStyle
+from ROOT import gPad
+from .BaseHandler import BaseHandler
+from .gaussValidation import grepPattern
+from collectRunResults import urlopen
+import logging
+import subprocess
+
+from collections import defaultdict
+
+def effPlotsDict_long() :
+	basedict = {
+	"Pt" : {},
+	"P" : {},
+	"Eta" : {},
+	"nPV" : {},
+	}
+
+	basedict["Pt"]["path"] = "Track/BestLongMCCheck/BestLong/01_long_Pt"
+	basedict["P"]["path"] = "Track/BestLongMCCheck/BestLong/01_long_P"
+	basedict["Eta"]["path"] = "Track/BestLongMCCheck/BestLong/01_long_Eta"
+	basedict["nPV"]["path"] = "Track/BestLongMCCheck/BestLong/01_long_nPV"
+	basedict["Pt"]["unit"] = "pT [MeV]"
+	basedict["P"]["unit"] = "p [MeV]"
+	basedict["Eta"]["unit"] = "#eta [-]"
+	basedict["nPV"]["unit"] = "nPV [-]"
+	basedict["Pt"]["unit_y"] = "Effciency [-]"
+	basedict["P"]["unit_y"] = "Effciency [-]"
+	basedict["Eta"]["unit_y"] = "Effciency [-]"
+	basedict["nPV"]["unit_y"] = "Effciency [-]"
+	basedict["Pt"]["cut"] = 10.0
+	basedict["P"]["cut"] = 10.0
+	basedict["Eta"]["cut"] = 10.0
+	basedict["nPV"]["cut"] = 10.0
+	return basedict
+
+def getEffPlots_long() :
+	return ["Pt", "P", "Eta", "nPV"]
+
+def effPlotsDict_down() :
+	basedict = {
+	"Pt" : {},
+	"P" : {},
+	"Eta" : {},
+	"nPV" : {},
+	}
+
+	basedict["Pt"]["path"] = "Track/BestDownMCCheck/BestDown/01_UT+T_Pt"
+	basedict["P"]["path"] = "Track/BestDownMCCheck/BestDown/01_UT+T_P"
+	basedict["Eta"]["path"] = "Track/BestDownMCCheck/BestDown/01_UT+T_Eta"
+	basedict["nPV"]["path"] = "Track/BestDownMCCheck/BestDown/01_UT+T_nPV"
+	basedict["Pt"]["unit"] = "pT [MeV]"
+	basedict["P"]["unit"] = "p [MeV]"
+	basedict["Eta"]["unit"] = "#eta [-]"
+	basedict["nPV"]["unit"] = "nPV [-]"
+	basedict["Pt"]["unit_y"] = "Effciency [-]"
+	basedict["P"]["unit_y"] = "Effciency [-]"
+	basedict["Eta"]["unit_y"] = "Effciency [-]"
+	basedict["nPV"]["unit_y"] = "Effciency [-]"
+	basedict["Pt"]["cut"] = 10.0
+	basedict["P"]["cut"] = 10.0
+	basedict["Eta"]["cut"] = 10.0
+	basedict["nPV"]["cut"] = 10.0
+	return basedict
+
+def getEffPlots_down() :
+	return ["Pt", "P", "Eta", "nPV"]
+
+def effPlotsDict_forward() :
+	basedict = {
+	"Pt" : {},
+	"P" : {},
+	"Eta" : {},
+	"nPV" : {},
+	}
+
+	basedict["Pt"]["path"] = "Track/ForwardBestMCCheck/Forward/01_long_Pt"
+	basedict["P"]["path"] = "Track/ForwardBestMCCheck/Forward/01_long_P"
+	basedict["Eta"]["path"] = "Track/ForwardBestMCCheck/Forward/01_long_Eta"
+	basedict["nPV"]["path"] = "Track/ForwardBestMCCheck/Forward/01_long_nPV"
+	basedict["Pt"]["unit"] = "pT [MeV]"
+	basedict["P"]["unit"] = "p [MeV]"
+	basedict["Eta"]["unit"] = "#eta [-]"
+	basedict["nPV"]["unit"] = "nPV [-]"
+	basedict["Pt"]["unit_y"] = "Effciency [-]"
+	basedict["P"]["unit_y"] = "Effciency [-]"
+	basedict["Eta"]["unit_y"] = "Effciency [-]"
+	basedict["nPV"]["unit_y"] = "Effciency [-]"
+	basedict["Pt"]["cut"] = 10.0
+	basedict["P"]["cut"] = 10.0
+	basedict["Eta"]["cut"] = 10.0
+	basedict["nPV"]["cut"] = 10.0
+	return basedict
+
+def getEffPlots_forward() :
+	return ["Pt", "P", "Eta", "nPV"]
+
+def effPlotsDict_velo() :
+	basedict = {
+	"Pt" : {},
+	"P" : {},
+	"Eta" : {},
+	"nPV" : {},
+	}
+
+	basedict["Pt"]["path"] = "Track/VeloFullMCCheck/Velo/01_notElectron_Velo_Pt"
+	basedict["P"]["path"] = "Track/VeloFullMCCheck/Velo/01_notElectron_Velo_P"
+	basedict["Eta"]["path"] = "Track/VeloFullMCCheck/Velo/01_notElectron_Velo_Eta"
+	basedict["nPV"]["path"] = "Track/VeloFullMCCheck/Velo/01_notElectron_Velo_nPV"
+	basedict["Pt"]["unit"] = "pT [MeV]"
+	basedict["P"]["unit"] = "p [MeV]"
+	basedict["Eta"]["unit"] = "#eta [-]"
+	basedict["nPV"]["unit"] = "nPV [-]"
+	basedict["Pt"]["unit_y"] = "Effciency [-]"
+	basedict["P"]["unit_y"] = "Effciency [-]"
+	basedict["Eta"]["unit_y"] = "Effciency [-]"
+	basedict["nPV"]["unit_y"] = "Effciency [-]"
+	basedict["Pt"]["cut"] = 10.0
+	basedict["P"]["cut"] = 10.0
+	basedict["Eta"]["cut"] = 10.0
+	basedict["nPV"]["cut"] = 10.0
+	return basedict
+
+def getEffPlots_velo() :
+	return ["Pt", "P", "Eta", "nPV"]
+
+def effPlotsDict_ttrack() :
+	basedict = {
+	"Pt" : {},
+	"P" : {},
+	"Eta" : {},
+	"nPV" : {},
+	}
+
+	basedict["Pt"]["path"] = "Track/TMCCheck/TTrack/01_hasT_Pt"
+	basedict["P"]["path"] = "Track/TMCCheck/TTrack/01_hasT_P"
+	basedict["Eta"]["path"] = "Track/TMCCheck/TTrack/01_hasT_Eta"
+	basedict["nPV"]["path"] = "Track/TMCCheck/TTrack/01_hasT_nPV"
+	basedict["Pt"]["unit"] = "pT [MeV]"
+	basedict["P"]["unit"] = "p [MeV]"
+	basedict["Eta"]["unit"] = "#eta [-]"
+	basedict["nPV"]["unit"] = "nPV [-]"
+	basedict["Pt"]["unit_y"] = "Effciency [-]"
+	basedict["P"]["unit_y"] = "Effciency [-]"
+	basedict["Eta"]["unit_y"] = "Effciency [-]"
+	basedict["nPV"]["unit_y"] = "Effciency [-]"
+	basedict["Pt"]["cut"] = 10.0
+	basedict["P"]["cut"] = 10.0
+	basedict["Eta"]["cut"] = 10.0
+	basedict["nPV"]["cut"] = 10.0
+	return basedict
+
+def getEffPlots_ttrack() :
+	return ["Pt", "P", "Eta", "nPV"]
+
+
+def effPlotsDict_2D_long() :
+	basedict = {
+	"EtaP" : {},
+	"EtaPhi" : {},
+	}
+
+	basedict["EtaP"]["path"] = "Track/BestLongMCCheck/BestLong/01_long_EtaP"
+	basedict["EtaPhi"]["path"] = "Track/BestLongMCCheck/BestLong/01_long_EtaPhi"
+	basedict["EtaP"]["unit"] = "#eta [-]"
+	basedict["EtaPhi"]["unit"] = "#eta [-]"
+	basedict["EtaP"]["unit_y"] = "p [MeV]"
+	basedict["EtaPhi"]["unit_y"] = "#phi [-]"
+	basedict["EtaP"]["cut"] = 10.0
+	basedict["EtaPhi"]["cut"] = 10.0
+	return basedict
+
+def getEffPlots_2D_long() :
+	return ["EtaP", "EtaPhi"]
+
+def effPlotsDict_2D_down() :
+	basedict = {
+	"EtaP" : {},
+	"EtaPhi" : {},
+	}
+
+	basedict["EtaP"]["path"] = "Track/BestDownMCCheck/BestDown/01_UT+T_EtaP"
+	basedict["EtaPhi"]["path"] = "Track/BestDownMCCheck/BestDown/01_UT+T_EtaPhi"
+	basedict["EtaP"]["unit"] = "#eta [-]"
+	basedict["EtaPhi"]["unit"] = "#eta [-]"
+	basedict["EtaP"]["unit_y"] = "p [MeV]"
+	basedict["EtaPhi"]["unit_y"] = "#phi [-]"
+	basedict["EtaP"]["cut"] = 10.0
+	basedict["EtaPhi"]["cut"] = 10.0
+	return basedict
+
+def getEffPlots_2D_down() :
+	return ["EtaP", "EtaPhi"]
+
+def effPlotsDict_2D_forward() :
+	basedict = {
+	"EtaP" : {},
+	"EtaPhi" : {},
+	}
+
+	basedict["EtaP"]["path"] = "Track/ForwardBestMCCheck/Forward/01_long_EtaP"
+	basedict["EtaPhi"]["path"] = "Track/ForwardBestMCCheck/Forward/01_long_EtaPhi"
+	basedict["EtaP"]["unit"] = "#eta [-]"
+	basedict["EtaPhi"]["unit"] = "#eta [-]"
+	basedict["EtaP"]["unit_y"] = "p [MeV]"
+	basedict["EtaPhi"]["unit_y"] = "#phi [-]"
+	basedict["EtaP"]["cut"] = 10.0
+	basedict["EtaPhi"]["cut"] = 10.0
+	return basedict
+
+def getEffPlots_2D_forward() :
+	return ["EtaP", "EtaPhi"]
+
+def effPlotsDict_2D_velo() :
+	basedict = {
+	"EtaP" : {},
+	"EtaPhi" : {},
+	}
+
+	basedict["EtaP"]["path"] = "Track/VeloFullMCCheck/Velo/01_notElectron_Velo_EtaP"
+	basedict["EtaPhi"]["path"] = "Track/VeloFullMCCheck/Velo/01_notElectron_Velo_EtaPhi"
+	basedict["EtaP"]["unit"] = "#eta [-]"
+	basedict["EtaPhi"]["unit"] = "#eta [-]"
+	basedict["EtaP"]["unit_y"] = "p [MeV]"
+	basedict["EtaPhi"]["unit_y"] = "#phi [-]"
+	basedict["EtaP"]["cut"] = 10.0
+	basedict["EtaPhi"]["cut"] = 10.0
+	return basedict
+
+def getEffPlots_2D_velo() :
+	return ["EtaP", "EtaPhi"]
+
+def effPlotsDict_2D_ttrack() :
+	basedict = {
+	"EtaP" : {},
+	"EtaPhi" : {},
+	}
+
+	basedict["EtaP"]["path"] = "Track/TMCCheck/TTrack/01_hasT_EtaP"
+	basedict["EtaPhi"]["path"] = "Track/TMCCheck/TTrack/01_hasT_EtaPhi"
+	basedict["EtaP"]["unit"] = "#eta [-]"
+	basedict["EtaPhi"]["unit"] = "#eta [-]"
+	basedict["EtaP"]["unit_y"] = "p [MeV]"
+	basedict["EtaPhi"]["unit_y"] = "#phi [-]"
+	basedict["EtaP"]["cut"] = 10.0
+	basedict["EtaPhi"]["cut"] = 10.0
+	return basedict
+
+def getEffPlots_2D_ttrack() :
+	return ["EtaP", "EtaPhi"]
+
+def effPlotsDict_basic() :
+	basedict = {
+	"#Tracks" :	{},
+	"chi2/ndof_long"	:	{},
+	"momentum_long"	:	{},
+	"chi2/ndof_down"	:	{},
+	"momentum_down"	:	{},
+	"#Tracks/Event"	:	{},
+	"dy"	:	{},
+	"dz"	:	{},
+	}
+	basedict["#Tracks"]["path"] = "Track/TrackMonitor/1"
+	basedict["chi2/ndof_long"]["path"] = "Track/TrackMonitor/Long/3"
+	basedict["momentum_long"]["path"] = "Track/TrackMonitor/Long/5"
+	basedict["chi2/ndof_down"]["path"] = "Track/TrackMonitor/Downstream/3"
+	basedict["momentum_down"]["path"] = "Track/TrackMonitor/Downstream/5"
+	basedict["#Tracks/Event"]["path"] = "RICH/RiLongTrkEff/nTracks"
+	basedict["dy"]["path"] = "PVChecker/1022"
+	basedict["dz"]["path"] = "PVChecker/1023"
+	basedict["#Tracks"]["unit"] = "number of tracks"
+	basedict["#Tracks"]["unit_y"] = ""
+	basedict["chi2/ndof_long"]["unit"] = ""
+	basedict["chi2/ndof_long"]["unit_y"] = ""
+	basedict["momentum_long"]["unit"] = "P [MeV]"
+	basedict["momentum_long"]["unit_y"] = ""
+	basedict["chi2/ndof_down"]["unit"] = ""
+	basedict["chi2/ndof_down"]["unit_y"] = ""
+	basedict["momentum_down"]["unit"] = "P [MeV]"
+	basedict["momentum_down"]["unit_y"] = ""
+	basedict["#Tracks/Event"]["unit"] = "number of tracks per event"
+	basedict["#Tracks/Event"]["unit_y"] = ""
+	basedict["dy"]["unit"] = "dy"
+	basedict["dy"]["unit_y"] = ""
+	basedict["dz"]["unit"] = "dz"
+	basedict["dz"]["unit_y"] = ""
+	basedict["#Tracks"]["cut"] = 10.0
+	basedict["chi2/ndof_long"]["cut"] = 10.0
+	basedict["momentum_long"]["cut"] = 10.0
+	basedict["chi2/ndof_down"]["cut"] = 10.0
+	basedict["momentum_down"]["cut"] = 10.0
+	basedict["#Tracks/Event"]["cut"] = 10.0
+	basedict["dy"]["cut"] = 10.0
+	basedict["dz"]["cut"] = 10.0
+	return basedict
+
+def getEffPlots_basic() :
+	return ["#Tracks", "chi2/ndof_long","momentum_long","chi2/ndof_down","momentum_down","#Tracks/Event","dy","dz"]
+
+def diff_1DG(h1,h2) :
+	n = h1.GetN()
+	V = 0.0
+	d1 = h1.GetY()
+	d2 = h2.GetY()
+	for i in range(n):
+		v1 = d1[i]
+		v2 = d2[i]
+		V += math.fabs(v1-v2)
+		#print("v1dg=",v1,"v2dg=",v2,"diffdg=",V)
+	return V
+
+def draw_diff(h1,h2) :
+	n = h1.GetN()
+	x = h1.GetX()
+	d1 = h1.GetY()
+	d2 = h2.GetY()
+	y = h1.GetY()
+	x1err_u = h1.GetEXhigh()
+	x1err_d = h1.GetEXlow()
+	x2err_u = h2.GetEXhigh()
+	x2err_d = h2.GetEXlow()
+	d1err_u = h1.GetEYhigh()
+	d1err_d = h1.GetEYlow()
+	d2err_u = h2.GetEYhigh()
+	d2err_d = h2.GetEYlow()
+	yerr_u = h1.GetEYhigh()
+	yerr_d = h1.GetEYlow()
+	xerr_u = h1.GetEXhigh()
+	xerr_d = h1.GetEXlow()
+	for i in range(n):
+		y[i] = d1[i] - d2[i]
+		yerr_u[i] = math.sqrt(d1err_u[i]*d1err_u[i] + d2err_u[i]*d2err_u[i])
+		yerr_d[i] = math.sqrt(d1err_d[i]*d1err_d[i] + d2err_d[i]*d2err_d[i])
+		xerr_u[i] = math.sqrt(x1err_u[i]*x1err_u[i] + x2err_u[i]*x2err_u[i])
+		xerr_d[i] = math.sqrt(x1err_d[i]*x1err_d[i] + x2err_d[i]*x2err_d[i])
+	D = ROOT.TGraphAsymmErrors(n,x,y,xerr_d,xerr_u,yerr_d,yerr_u)
+	return D
+		
+	
+
+def diff2_1DG(h1,h2) :
+	n = h1.GetN()
+	V = 0.0
+	d1 = h1.GetY()
+	d2 = h2.GetY()
+	for i in range(n):
+		v1 = d1[i]
+		v2 = d2[i]
+		V += (v1-v2) * (v1-v2)
+	return V
+
+def diff_1DH(h1,h2) :
+	n = h1.GetNbinsX()
+	V = 0.0
+	for i in range(n):
+		v1 = h1.GetBinContent(i+1)
+		v2 = h2.GetBinContent(i+1)
+		V += math.fabs(v1-v2)
+		#print("v1dh=",v1,"v2dg=",v2,"diffdh=",V)
+	return V
+
+def diff2_1DH(h1,h2) :
+	n = h1.GetNbinsX()
+	V = 0.0
+	for i in range(n):
+		v1 = h1.GetBinContent(i+1)
+		v2 = h2.GetBinContent(i+1)
+		V += (v1-v2) * (v1-v2)
+	return V
+
+def diff_2D(h1,h2) :
+	n1 = h1.GetNbinsX()
+	n2 = h1.GetNbinsY()
+	V = 0.0
+	for i in range(n1) :
+		for j in range(n2) :
+			v1 = h1.GetBinContent(i+1,j+1)
+			v2 = h2.GetBinContent(i+1,j+1)
+			V += math.fabs(v1-v2)
+			#print("v12d=",v1,"v22d=",v2,"diff2d=",V)
+	return V
+
+def diff2_2D(h1,h2) :
+	n1 = h1.GetNbinsX()
+	n2 = h1.GetNbinsY()
+	V = 0.0
+	for i in range(n1) :
+		for j in range(n2) :
+			v1 = h1.GetBinContent(i+1,j+1)
+			v2 = h2.GetBinContent(i+1,j+1)
+			V += (v1-v2)*(v1-v2)
+	return V
+
+		
+
+class PrCheckerMRDifferenceHandler(BaseHandler):
+	def __init__(self):
+		super(self.__class__, self).__init__()
+
+	def collectResultsExt(self, directory, project, version, platform, hostname, cpu_info, memoryinfo, startTime, endTime, options):
+		#logfile = os.path.join(directory, 'run.log')
+		#rootfile = grepPattern('INFO Writing ROOT histograms to: (\S+)' , open(logfile, 'r', encoding='ISO-8859-1').read() )
+		#inputfile = ROOT.TFile.Open(os.path.join(directory,rootfile), 'read')
+		inputfile1 = ROOT.TFile.Open(os.path.join(directory,'Brunel-1000ev-histos_20201110_def.root'), 'read')
+		inputfile2 = ROOT.TFile.Open(os.path.join(directory,'Brunel-1000ev-histos_20201203_misaligned.root'), 'read')
+		outputfile2 = ROOT.TFile("PrCheckerMRDifference_plots_diff.root","recreate")
+		outputfile3 = ROOT.TFile("PrCheckerMRDifference_plots_ldiff.root","recreate")
+
+		from .utils.LHCbStyle import setLHCbStyle
+		from .utils.Legend import place_legend
+
+		setLHCbStyle()
+
+		latex=ROOT.TLatex()
+		latex.SetNDC()
+		latex.SetTextSize(0.03)
+
+		outputfile2.mkdir('long')
+		outputfile2.mkdir('down')
+		outputfile2.mkdir('forward')
+		outputfile2.mkdir('velo')
+		outputfile2.mkdir('ttrack')
+		outputfile2.mkdir('basic')
+		outputfile3.mkdir('long')
+		outputfile3.mkdir('down')
+		outputfile3.mkdir('forward')
+		outputfile3.mkdir('velo')
+		outputfile3.mkdir('ttrack')
+		outputfile3.mkdir('basic')
+
+		effPlots_long = getEffPlots_long()
+		eff_dict_long  = effPlotsDict_long()
+		effPlots_down = getEffPlots_down()
+		eff_dict_down  = effPlotsDict_down()
+		effPlots_forward = getEffPlots_forward()
+		eff_dict_forward  = effPlotsDict_forward()
+		effPlots_velo = getEffPlots_velo()
+		eff_dict_velo  = effPlotsDict_velo()
+		effPlots_ttrack = getEffPlots_ttrack()
+		eff_dict_ttrack  = effPlotsDict_ttrack()
+
+		effPlots_2D_long = getEffPlots_2D_long()
+		eff_dict_2D_long  = effPlotsDict_2D_long()
+		effPlots_2D_down = getEffPlots_2D_down()
+		eff_dict_2D_down  = effPlotsDict_2D_down()
+		effPlots_2D_forward = getEffPlots_2D_forward()
+		eff_dict_2D_forward  = effPlotsDict_2D_forward()
+		effPlots_2D_velo = getEffPlots_2D_velo()
+		eff_dict_2D_velo  = effPlotsDict_2D_velo()
+		effPlots_2D_ttrack = getEffPlots_2D_ttrack()
+		eff_dict_2D_ttrack  = effPlotsDict_2D_ttrack()
+		
+		effPlots_basic = getEffPlots_basic()
+		eff_dict_basic = effPlotsDict_basic()
+
+			
+		for effPlot in effPlots_long:##UPDATE
+			effNom1 = inputfile1.Get(eff_dict_long[effPlot]["path"] + "_reconstructed")
+			effDenom1 = inputfile1.Get(eff_dict_long[effPlot]["path"] + "_reconstructible")
+			canvas_eff = ROOT.TCanvas(effPlot, effPlot)
+			efficiency1 = ROOT.TGraphAsymmErrors()
+			efficiency1.SetName(effPlot + "_tracking_efficiency")
+			efficiency1.Divide(effNom1, effDenom1, "w")
+
+			effNom2 = inputfile2.Get(eff_dict_long[effPlot]["path"] + "_reconstructed")
+			effDenom2 = inputfile2.Get(eff_dict_long[effPlot]["path"] + "_reconstructible")
+			efficiency2 = ROOT.TGraphAsymmErrors()
+			efficiency2.SetName(effPlot + "_tracking_efficiency")
+			efficiency2.Divide(effNom2, effDenom2, "w")
+
+			efficiency1.SetMarkerSize(0.5)
+			efficiency1.SetLineWidth(0)
+			efficiency1.SetMarkerColor(ROOT.kBlack)
+			efficiency1.SetMarkerStyle(5)
+			efficiency1.GetXaxis().SetLabelFont(132)
+			efficiency1.GetXaxis().SetLabelSize(0.04)
+			efficiency1.GetXaxis().SetTitleFont(132)
+			efficiency1.GetXaxis().SetTitleSize(0.06)
+			efficiency1.GetXaxis().SetTitleOffset(0.8)
+			efficiency1.GetYaxis().SetLabelFont(132)
+			efficiency1.GetYaxis().SetLabelSize(0.04)
+			efficiency1.GetYaxis().SetTitleFont(132)
+			efficiency1.GetYaxis().SetTitleSize(0.06)
+			efficiency1.GetYaxis().SetDecimals()
+			efficiency1.GetYaxis().SetTitleOffset(0.7)
+			efficiency1.GetXaxis().SetTitle(eff_dict_long[effPlot]["unit"])
+			efficiency1.GetYaxis().SetTitle(eff_dict_long[effPlot]["unit_y"])
+			efficiency1.SetTitle("{path} reconstructed / reconstructible".format(path=eff_dict_long[effPlot]["path"]))
+			efficiency2.SetMarkerColor(ROOT.kRed)
+
+			diff1 = diff_1DG(efficiency1,efficiency2)
+			#diff2 = diff2_1DG(efficiency1,efficiency2)
+			
+			if diff1 > 0.0 :
+				outputfile2.cd("long")
+				diff_graph = draw_diff(efficiency1,efficiency2)
+				diff_graph.Draw()
+				canvas_eff.Update()
+				print(effPlot,"_long", ":",diff1)
+				diff_graph.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+			if diff1 > eff_dict_long[effPlot]["cut"] :
+				outputfile3.cd("long")
+				print(effPlot,"_long", ":",diff1)
+				diff_graph.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+		for effPlot in effPlots_down:
+			effNom1 = inputfile1.Get(eff_dict_down[effPlot]["path"] + "_reconstructed")
+			effDenom1 = inputfile1.Get(eff_dict_down[effPlot]["path"] + "_reconstructible")
+			canvas_eff = ROOT.TCanvas(effPlot, effPlot)
+			efficiency1 = ROOT.TGraphAsymmErrors()
+			efficiency1.SetName(effPlot + "_tracking_efficiency")
+			efficiency1.Divide(effNom1, effDenom1, "w")
+			effNom2 = inputfile2.Get(eff_dict_down[effPlot]["path"] + "_reconstructed")
+			effDenom2 = inputfile2.Get(eff_dict_down[effPlot]["path"] + "_reconstructible")
+			efficiency2 = ROOT.TGraphAsymmErrors()
+			efficiency2.SetName(effPlot + "_tracking_efficiency")
+			efficiency2.Divide(effNom2, effDenom2, "w")
+
+			efficiency1.SetMarkerSize(0.5)
+			efficiency1.SetLineWidth(0)
+			efficiency1.SetMarkerColor(ROOT.kBlack)
+			efficiency1.SetMarkerStyle(5)
+			efficiency1.GetXaxis().SetLabelFont(132)
+			efficiency1.GetXaxis().SetLabelSize(0.04)
+			efficiency1.GetXaxis().SetTitleFont(132)
+			efficiency1.GetXaxis().SetTitleSize(0.06)
+			efficiency1.GetXaxis().SetTitleOffset(0.8)
+			efficiency1.GetYaxis().SetLabelFont(132)
+			efficiency1.GetYaxis().SetLabelSize(0.04)
+			efficiency1.GetYaxis().SetTitleFont(132)
+			efficiency1.GetYaxis().SetTitleSize(0.06)
+			efficiency1.GetYaxis().SetDecimals()
+			efficiency1.GetYaxis().SetTitleOffset(0.7)
+			efficiency1.GetXaxis().SetTitle(eff_dict_down[effPlot]["unit"])
+			efficiency1.GetYaxis().SetTitle(eff_dict_down[effPlot]["unit_y"])
+			efficiency1.SetTitle("{path} reconstructed / reconstructible".format(path=eff_dict_down[effPlot]["path"]))
+			efficiency2.SetMarkerColor(ROOT.kRed)
+
+			diff1 = diff_1DG(efficiency1,efficiency2)
+			#diff2 = diff2_1DG(efficiency1,efficiency2)
+
+			if diff1 > 0.0 :
+				outputfile2.cd("down")
+				diff_graph = draw_diff(efficiency1,efficiency2)
+				print(effPlot,"_down",":",diff1)
+				diff_graph.Draw()
+				canvas_eff.Update()
+				diff_graph.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+			if diff1 > eff_dict_down[effPlot]["cut"] :
+				outputfile3.cd("down")
+				print(effPlot,"_down", ":",diff1)
+				diff_graph.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+		for effPlot in effPlots_forward:
+			effNom1 = inputfile1.Get(eff_dict_forward[effPlot]["path"] + "_reconstructed")
+			effDenom1 = inputfile1.Get(eff_dict_forward[effPlot]["path"] + "_reconstructible")
+			canvas_eff = ROOT.TCanvas(effPlot, effPlot)
+			efficiency1 = ROOT.TGraphAsymmErrors()
+			efficiency1.SetName(effPlot + "_tracking_efficiency")
+			efficiency1.Divide(effNom1, effDenom1, "w")
+
+			effNom2 = inputfile2.Get(eff_dict_forward[effPlot]["path"] + "_reconstructed")
+			effDenom2 = inputfile2.Get(eff_dict_forward[effPlot]["path"] + "_reconstructible")
+			efficiency2 = ROOT.TGraphAsymmErrors()
+			efficiency2.SetName(effPlot + "_tracking_efficiency")
+			efficiency2.Divide(effNom2, effDenom2, "w")
+
+			efficiency1.SetMarkerSize(0.5)
+			efficiency1.SetLineWidth(0)
+			efficiency1.SetMarkerColor(ROOT.kBlack)
+			efficiency1.SetMarkerStyle(5)
+			efficiency1.GetXaxis().SetLabelFont(132)
+			efficiency1.GetXaxis().SetLabelSize(0.04)
+			efficiency1.GetXaxis().SetTitleFont(132)
+			efficiency1.GetXaxis().SetTitleSize(0.06)
+			efficiency1.GetXaxis().SetTitleOffset(0.8)
+			efficiency1.GetYaxis().SetLabelFont(132)
+			efficiency1.GetYaxis().SetLabelSize(0.04)
+			efficiency1.GetYaxis().SetTitleFont(132)
+			efficiency1.GetYaxis().SetTitleSize(0.06)
+			efficiency1.GetYaxis().SetDecimals()
+			efficiency1.GetYaxis().SetTitleOffset(0.7)
+			efficiency1.GetXaxis().SetTitle(eff_dict_forward[effPlot]["unit"])
+			efficiency1.GetYaxis().SetTitle(eff_dict_forward[effPlot]["unit_y"])
+			efficiency1.SetTitle("{path} reconstructed / reconstructible".format(path=eff_dict_forward[effPlot]["path"]))
+				
+			diff1 = diff_1DG(efficiency1,efficiency2)
+			#diff2 = diff2_1DG(efficiency1,efficiency2)
+
+			if diff1 > 0.0 :
+				outputfile2.cd("forward")
+				diff_graph = draw_diff(efficiency1,efficiency2)
+				diff_graph.Draw()
+				canvas_eff.Update()
+				print(effPlot,"_forward", ":",diff1)
+				diff_graph.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+			if diff1 > eff_dict_forward[effPlot]["cut"] :
+				outputfile3.cd("forward")
+				print(effPlot,"_forward", ":",diff1)
+				diff_graph.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+		for effPlot in effPlots_velo:
+			effNom1 = inputfile1.Get(eff_dict_velo[effPlot]["path"] + "_reconstructed")
+			effDenom1 = inputfile1.Get(eff_dict_velo[effPlot]["path"] + "_reconstructible")
+			canvas_eff = ROOT.TCanvas(effPlot, effPlot)
+			efficiency1 = ROOT.TGraphAsymmErrors()
+			efficiency1.SetName(effPlot + "_tracking_efficiency")
+			efficiency1.Divide(effNom1, effDenom1, "w")
+
+			effNom2 = inputfile2.Get(eff_dict_velo[effPlot]["path"] + "_reconstructed")
+			effDenom2 = inputfile2.Get(eff_dict_velo[effPlot]["path"] + "_reconstructible")
+			efficiency2 = ROOT.TGraphAsymmErrors()
+			efficiency2.SetName(effPlot + "_tracking_efficiency")
+			efficiency2.Divide(effNom2, effDenom2, "w")
+
+			efficiency1.SetMarkerSize(0.5)
+			efficiency1.SetLineWidth(0)
+			efficiency1.SetMarkerColor(ROOT.kBlack)
+			efficiency1.SetMarkerStyle(5)
+			efficiency1.GetXaxis().SetLabelFont(132)
+			efficiency1.GetXaxis().SetLabelSize(0.04)
+			efficiency1.GetXaxis().SetTitleFont(132)
+			efficiency1.GetXaxis().SetTitleSize(0.06)
+			efficiency1.GetXaxis().SetTitleOffset(0.8)
+			efficiency1.GetYaxis().SetLabelFont(132)
+			efficiency1.GetYaxis().SetLabelSize(0.04)
+			efficiency1.GetYaxis().SetTitleFont(132)
+			efficiency1.GetYaxis().SetTitleSize(0.06)
+			efficiency1.GetYaxis().SetDecimals()
+			efficiency1.GetYaxis().SetTitleOffset(0.7)
+			efficiency1.GetXaxis().SetTitle(eff_dict_velo[effPlot]["unit"])
+			efficiency1.GetYaxis().SetTitle(eff_dict_velo[effPlot]["unit_y"])
+			efficiency1.SetTitle("{path} reconstructed / reconstructible".format(path=eff_dict_velo[effPlot]["path"]))
+			
+			diff1 = diff_1DG(efficiency1,efficiency2)
+			#diff2 = diff2_1DG(efficiency1,efficiency2)
+
+			if diff1 > 0.0 :
+				outputfile2.cd("velo")
+				diff_graph = draw_diff(efficiency1,efficiency2)
+				diff_graph.Draw()
+				canvas_eff.Update()
+				print(effPlot,"_velo", ":",diff1)
+				diff_graph.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+			if diff1 > eff_dict_velo[effPlot]["cut"] :
+				outputfile3.cd("velo")
+				print(effPlot,"_velo", ":",diff1)
+				diff_graph.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+		for effPlot in effPlots_ttrack:
+			effNom1 = inputfile1.Get(eff_dict_ttrack[effPlot]["path"] + "_reconstructed")
+			effDenom1 = inputfile1.Get(eff_dict_ttrack[effPlot]["path"] + "_reconstructible")
+			canvas_eff = ROOT.TCanvas(effPlot, effPlot)
+			efficiency1 = ROOT.TGraphAsymmErrors()
+			efficiency1.SetName(effPlot + "_tracking_efficiency")
+			efficiency1.Divide(effNom1, effDenom1, "w")
+
+			effNom2 = inputfile2.Get(eff_dict_ttrack[effPlot]["path"] + "_reconstructed")
+			effDenom2 = inputfile2.Get(eff_dict_ttrack[effPlot]["path"] + "_reconstructible")
+			efficiency2 = ROOT.TGraphAsymmErrors()
+			efficiency2.SetName(effPlot + "_tracking_efficiency")
+			efficiency2.Divide(effNom2, effDenom2, "w")
+
+			efficiency1.SetMarkerSize(0.5)
+			efficiency1.SetLineWidth(0)
+			efficiency1.SetMarkerColor(ROOT.kBlack)
+			efficiency1.SetMarkerStyle(5)
+			efficiency1.GetXaxis().SetLabelFont(132)
+			efficiency1.GetXaxis().SetLabelSize(0.04)
+			efficiency1.GetXaxis().SetTitleFont(132)
+			efficiency1.GetXaxis().SetTitleSize(0.06)
+			efficiency1.GetXaxis().SetTitleOffset(0.8)
+			efficiency1.GetYaxis().SetLabelFont(132)
+			efficiency1.GetYaxis().SetLabelSize(0.04)
+			efficiency1.GetYaxis().SetTitleFont(132)
+			efficiency1.GetYaxis().SetTitleSize(0.06)
+			efficiency1.GetYaxis().SetDecimals()
+			efficiency1.GetYaxis().SetTitleOffset(0.7)
+			efficiency1.GetXaxis().SetTitle(eff_dict_ttrack[effPlot]["unit"])
+			efficiency1.GetYaxis().SetTitle(eff_dict_ttrack[effPlot]["unit_y"])
+			efficiency1.SetTitle("{path} reconstructed / reconstructible".format(path=eff_dict_ttrack[effPlot]["path"]))
+			
+			diff1 = diff_1DG(efficiency1,efficiency2)
+			#diff2 = diff2_1D(efficiency1,efficiency2)
+
+			if diff1 > 0.0 :		
+				outputfile2.cd("ttrack")
+				diff_graph = draw_diff(efficiency1,efficiency2)
+				diff_graph.Draw()
+				canvas_eff.Update()
+				print(effPlot,"_ttrack", ":",diff1)
+				diff_graph.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+			if diff1 > eff_dict_ttrack[effPlot]["cut"] :
+				outputfile3.cd("ttrack")
+				print(effPlot,"_ttrack", ":",diff1)
+				diff_graph.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+
+		for effPlot in effPlots_2D_long:
+			effNom1 = inputfile1.Get(eff_dict_2D_long[effPlot]["path"] + "_reconstructed")
+			effDenom1 = inputfile1.Get(eff_dict_2D_long[effPlot]["path"] + "_reconstructible")
+			effNom1.Sumw2()
+			effDenom1.Sumw2()
+			canvas_eff = ROOT.TCanvas(effPlot, effPlot)
+			efficiency1 = effNom1.Clone()
+			efficiency1.Divide(effDenom1)
+			efficiency1.SetName(effPlot + "_tracking_efficiency")
+
+			effNom2 = inputfile2.Get(eff_dict_2D_long[effPlot]["path"] + "_reconstructed")
+			effDenom2 = inputfile2.Get(eff_dict_2D_long[effPlot]["path"] + "_reconstructible")
+			effNom2.Sumw2()
+			effDenom2.Sumw2()
+			efficiency2 = effNom2.Clone()
+			efficiency2.Divide(effDenom2)
+			efficiency2.SetName(effPlot + "_tracking_efficiency")
+
+			efficiency1.SetMarkerSize(0.5)
+			efficiency1.SetLineWidth(0)
+			efficiency1.SetMarkerColor(ROOT.kBlack)
+			efficiency1.SetMarkerStyle(5)
+			efficiency1.GetXaxis().SetLabelFont(132)
+			efficiency1.GetXaxis().SetLabelSize(0.04)
+			efficiency1.GetXaxis().SetTitleFont(132)
+			efficiency1.GetXaxis().SetTitleSize(0.06)
+			efficiency1.GetXaxis().SetTitleOffset(0.8)
+			efficiency1.GetYaxis().SetLabelFont(132)
+			efficiency1.GetYaxis().SetLabelSize(0.04)
+			efficiency1.GetYaxis().SetTitleFont(132)
+			efficiency1.GetYaxis().SetTitleSize(0.06)
+			efficiency1.GetYaxis().SetDecimals()
+			efficiency1.GetYaxis().SetTitleOffset(0.7)
+			efficiency1.GetXaxis().SetTitle(eff_dict_2D_long[effPlot]["unit"])
+			efficiency1.GetYaxis().SetTitle(eff_dict_2D_long[effPlot]["unit_y"])
+			efficiency1.SetTitle("{path} reconstructed / reconstructible".format(path=eff_dict_2D_long[effPlot]["path"]))
+					
+
+			diff1 = diff_2D(efficiency1,efficiency2)
+			#diff2 = diff2_2D(efficiency1,efficiency2)
+
+			if diff1 > 0.0 :
+				outputfile2.cd("long")
+				efficiency1.Add(efficiency2,-1)
+				efficiency1.Draw("colz")
+				canvas_eff.Update()
+				print(effPlot,"_2Dlong", ":",diff1)
+				efficiency1.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+			if diff1 > eff_dict_2D_long[effPlot]["cut"] :
+				outputfile3.cd("long")
+				print(effPlot,"_2Dlong", ":",diff1)
+				efficiency1.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+		for effPlot in effPlots_2D_down:
+			effNom1 = inputfile1.Get(eff_dict_2D_down[effPlot]["path"] + "_reconstructed")
+			effDenom1 = inputfile1.Get(eff_dict_2D_down[effPlot]["path"] + "_reconstructible")
+			canvas_eff = ROOT.TCanvas(effPlot, effPlot)
+			efficiency1 = effNom1.Clone()
+			efficiency1.Divide(effDenom1)
+			efficiency1.SetName(effPlot + "_tracking_efficiency")
+
+			effNom2 = inputfile2.Get(eff_dict_2D_down[effPlot]["path"] + "_reconstructed")
+			effDenom2 = inputfile2.Get(eff_dict_2D_down[effPlot]["path"] + "_reconstructible")
+			efficiency2 = effNom2.Clone()
+			efficiency2.Divide(effDenom2)
+			efficiency2.SetName(effPlot + "_tracking_efficiency")
+			
+			efficiency1.SetMarkerSize(0.5)
+			efficiency1.SetLineWidth(0)
+			efficiency1.SetMarkerColor(ROOT.kBlack)
+			efficiency1.SetMarkerStyle(5)
+			efficiency1.GetXaxis().SetLabelFont(132)
+			efficiency1.GetXaxis().SetLabelSize(0.04)
+			efficiency1.GetXaxis().SetTitleFont(132)
+			efficiency1.GetXaxis().SetTitleSize(0.06)
+			efficiency1.GetXaxis().SetTitleOffset(0.8)
+			efficiency1.GetYaxis().SetLabelFont(132)
+			efficiency1.GetYaxis().SetLabelSize(0.04)
+			efficiency1.GetYaxis().SetTitleFont(132)
+			efficiency1.GetYaxis().SetTitleSize(0.06)
+			efficiency1.GetYaxis().SetDecimals()
+			efficiency1.GetYaxis().SetTitleOffset(0.7)
+			efficiency1.GetXaxis().SetTitle(eff_dict_2D_down[effPlot]["unit"])
+			efficiency1.GetYaxis().SetTitle(eff_dict_2D_down[effPlot]["unit_y"])
+			efficiency1.SetTitle("{path} reconstructed / reconstructible".format(path=eff_dict_2D_down[effPlot]["path"]))
+			
+			diff1 = diff_2D(efficiency1,efficiency2)
+			#diff2 = diff2_2D(efficiency1,efficiency2)
+
+			if diff1 > 0.0 :
+				outputfile2.cd("down")
+				efficiency1.Add(efficiency2,-1)
+				efficiency1.Draw("colz")
+				canvas_eff.Update()
+				print(effPlot,"_2Ddown", ":",diff1)
+				efficiency1.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+			if diff1 > eff_dict_2D_down[effPlot]["cut"] :
+				outputfile3.cd("down")
+				print(effPlot,"_2Ddown", ":",diff1)
+				efficiency1.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+		for effPlot in effPlots_2D_forward:
+			effNom1 = inputfile1.Get(eff_dict_2D_forward[effPlot]["path"] + "_reconstructed")
+			effDenom1 = inputfile1.Get(eff_dict_2D_forward[effPlot]["path"] + "_reconstructible")
+			canvas_eff = ROOT.TCanvas(effPlot, effPlot)
+			efficiency1 = effNom1.Clone()
+			efficiency1.Divide(effDenom1)
+			efficiency1.SetName(effPlot + "_tracking_efficiency")
+
+			effNom2 = inputfile2.Get(eff_dict_2D_forward[effPlot]["path"] + "_reconstructed")
+			effDenom2 = inputfile2.Get(eff_dict_2D_forward[effPlot]["path"] + "_reconstructible")
+			efficiency2 = effNom2.Clone()
+			efficiency2.Divide(effDenom2)
+			efficiency2.SetName(effPlot + "_tracking_efficiency")
+			
+			efficiency1.SetMarkerSize(0.5)
+			efficiency1.SetLineWidth(0)
+			efficiency1.SetMarkerColor(ROOT.kBlack)
+			efficiency1.SetMarkerStyle(5)
+			efficiency1.GetXaxis().SetLabelFont(132)
+			efficiency1.GetXaxis().SetLabelSize(0.04)
+			efficiency1.GetXaxis().SetTitleFont(132)
+			efficiency1.GetXaxis().SetTitleSize(0.06)
+			efficiency1.GetXaxis().SetTitleOffset(0.8)
+			efficiency1.GetYaxis().SetLabelFont(132)
+			efficiency1.GetYaxis().SetLabelSize(0.04)
+			efficiency1.GetYaxis().SetTitleFont(132)
+			efficiency1.GetYaxis().SetTitleSize(0.06)
+			efficiency1.GetYaxis().SetDecimals()
+			efficiency1.GetYaxis().SetTitleOffset(0.7)
+			efficiency1.GetXaxis().SetTitle(eff_dict_2D_forward[effPlot]["unit"])
+			efficiency1.GetYaxis().SetTitle(eff_dict_2D_forward[effPlot]["unit_y"])
+			efficiency1.SetTitle("{path} reconstructed / reconstructible".format(path=eff_dict_2D_forward[effPlot]["path"]))
+			
+			diff1 = diff_2D(efficiency1,efficiency2)
+			#diff2 = diff2_2D(efficiency1,efficiency2)
+
+			if diff1 > 0.0 :
+				outputfile2.cd("forward")
+				efficiency1.Add(efficiency2,-1)
+				efficiency1.Draw("colz")
+				canvas_eff.Update()
+				print(effPlot,"_2Dforward", ":",diff1)
+				efficiency1.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+			if diff1 > eff_dict_2D_forward[effPlot]["cut"] :
+				outputfile3.cd("forward")
+				print(effPlot,"_2Dforward", ":",diff1)
+				efficiency1.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+
+		for effPlot in effPlots_2D_velo:
+			effNom1 = inputfile1.Get(eff_dict_2D_velo[effPlot]["path"] + "_reconstructed")
+			effDenom1 = inputfile1.Get(eff_dict_2D_velo[effPlot]["path"] + "_reconstructible")
+			canvas_eff = ROOT.TCanvas(effPlot, effPlot)
+			efficiency1 = effNom1.Clone()
+			efficiency1.Divide(effDenom1)
+			efficiency1.SetName(effPlot + "_tracking_efficiency")
+			
+			effNom2 = inputfile2.Get(eff_dict_2D_velo[effPlot]["path"] + "_reconstructed")
+			effDenom2 = inputfile2.Get(eff_dict_2D_velo[effPlot]["path"] + "_reconstructible")
+			efficiency2 = effNom2.Clone()
+			efficiency2.Divide(effDenom2)
+			efficiency2.SetName(effPlot + "_tracking_efficiency")
+
+			efficiency1.SetMarkerSize(0.5)
+			efficiency1.SetLineWidth(0)
+			efficiency1.SetMarkerColor(ROOT.kBlack)
+			efficiency1.SetMarkerStyle(5)
+			efficiency1.GetXaxis().SetLabelFont(132)
+			efficiency1.GetXaxis().SetLabelSize(0.04)
+			efficiency1.GetXaxis().SetTitleFont(132)
+			efficiency1.GetXaxis().SetTitleSize(0.06)
+			efficiency1.GetXaxis().SetTitleOffset(0.8)
+			efficiency1.GetYaxis().SetLabelFont(132)
+			efficiency1.GetYaxis().SetLabelSize(0.04)
+			efficiency1.GetYaxis().SetTitleFont(132)
+			efficiency1.GetYaxis().SetTitleSize(0.06)
+			efficiency1.GetYaxis().SetDecimals()
+			efficiency1.GetYaxis().SetTitleOffset(0.7)
+			efficiency1.GetXaxis().SetTitle(eff_dict_2D_velo[effPlot]["unit"])
+			efficiency1.GetYaxis().SetTitle(eff_dict_2D_velo[effPlot]["unit_y"])
+			efficiency1.SetTitle("{path} reconstructed / reconstructible".format(path=eff_dict_2D_velo[effPlot]["path"]))
+			efficiency2.SetMarkerColor(ROOT.kRed)
+
+			diff1 = diff_2D(efficiency1,efficiency2)
+			#diff2 = diff2_2D(efficiency1,efficiency2)
+
+			if diff1 > 0.0 : 
+				outputfile2.cd("velo")
+				efficiency1.Add(efficiency2,-1)
+				efficiency1.Draw("colz")
+				canvas_eff.Update()
+				print(effPlot,"_2Dvelo", ":",diff1)
+				efficiency1.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+			if diff1 > eff_dict_2D_velo[effPlot]["cut"] :
+				outputfile3.cd("velo")
+				print(effPlot,"_2Dvelo", ":",diff1)
+				efficiency1.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+
+		for effPlot in effPlots_2D_ttrack:
+			effNom1 = inputfile1.Get(eff_dict_2D_ttrack[effPlot]["path"] + "_reconstructed")
+			effDenom1 = inputfile1.Get(eff_dict_2D_ttrack[effPlot]["path"] + "_reconstructible")
+			canvas_eff = ROOT.TCanvas(effPlot, effPlot)
+			efficiency1 = effNom1.Clone()
+			efficiency1.Divide(effDenom1)
+			efficiency1.SetName(effPlot + "_tracking_efficiency")
+
+			effNom2 = inputfile2.Get(eff_dict_2D_ttrack[effPlot]["path"] + "_reconstructed")
+			effDenom2 = inputfile2.Get(eff_dict_2D_ttrack[effPlot]["path"] + "_reconstructible")
+			efficiency2 = effNom2.Clone()
+			efficiency2.Divide(effDenom2)
+			efficiency2.SetName(effPlot + "_tracking_efficiency")
+
+			efficiency1.SetMarkerSize(0.5)
+			efficiency1.SetLineWidth(2)
+			efficiency1.SetMarkerColor(ROOT.kBlack)
+			efficiency1.SetMarkerStyle(5)
+			efficiency1.GetXaxis().SetLabelFont(132)
+			efficiency1.GetXaxis().SetLabelSize(0.04)
+			efficiency1.GetXaxis().SetTitleFont(132)
+			efficiency1.GetXaxis().SetTitleSize(0.06)
+			efficiency1.GetXaxis().SetTitleOffset(0.8)
+			efficiency1.GetYaxis().SetLabelFont(132)
+			efficiency1.GetYaxis().SetLabelSize(0.04)
+			efficiency1.GetYaxis().SetTitleFont(132)
+			efficiency1.GetYaxis().SetTitleSize(0.06)
+			efficiency1.GetYaxis().SetDecimals()
+			efficiency1.GetYaxis().SetTitleOffset(0.7)
+			efficiency1.GetXaxis().SetTitle(eff_dict_2D_ttrack[effPlot]["unit"])
+			efficiency1.GetYaxis().SetTitle(eff_dict_2D_ttrack[effPlot]["unit_y"])
+			efficiency1.SetTitle("{path} reconstructed / reconstructible".format(path=eff_dict_2D_ttrack[effPlot]["path"]))
+			
+			diff1 = diff_2D(efficiency1,efficiency2)
+			#diff2 = diff2_2D(efficiency1,efficiency2)
+
+			if diff1 > 0.0 :
+				outputfile2.cd("ttrack")
+				efficiency1.Add(efficiency2,-1)
+				efficiency1.Draw("colz")
+				canvas_eff.Update()
+				print(effPlot,"_2Dttrack", ":",diff1)
+				efficiency1.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+			if diff1 > eff_dict_2D_ttrack[effPlot]["cut"] :
+				outputfile3.cd("ttrack")
+				print(effPlot,"_2Dttrack", ":",diff1)
+				efficiency1.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+		for effPlot in effPlots_basic:
+			effNom1 = inputfile1.Get(eff_dict_basic[effPlot]["path"])
+			canvas_eff = ROOT.TCanvas(effPlot, effPlot)
+			efficiency1 = effNom1.Clone()
+			efficiency1.SetName(effPlot)
+
+			effNom2 = inputfile2.Get(eff_dict_basic[effPlot]["path"])
+			efficiency2 = effNom2.Clone()
+			efficiency2.SetName(effPlot)
+
+			efficiency1.SetMarkerSize(0.5)
+			efficiency1.SetLineWidth(2)
+			efficiency1.SetMarkerColor(ROOT.kBlack)
+			efficiency1.SetMarkerStyle(5)
+			efficiency1.GetXaxis().SetLabelFont(132)
+			efficiency1.GetXaxis().SetLabelSize(0.04)
+			efficiency1.GetXaxis().SetTitleFont(132)
+			efficiency1.GetXaxis().SetTitleSize(0.06)
+			efficiency1.GetXaxis().SetTitleOffset(0.8)
+			efficiency1.GetYaxis().SetLabelFont(132)
+			efficiency1.GetYaxis().SetLabelSize(0.04)
+			efficiency1.GetYaxis().SetTitleFont(132)
+			efficiency1.GetYaxis().SetTitleSize(0.06)
+			efficiency1.GetYaxis().SetDecimals()
+			efficiency1.GetYaxis().SetTitleOffset(0.7)
+			efficiency1.GetXaxis().SetTitle(eff_dict_basic[effPlot]["unit"])
+			efficiency1.GetYaxis().SetTitle(eff_dict_basic[effPlot]["unit_y"])
+			efficiency1.SetTitle("{path} ".format(path=eff_dict_basic[effPlot]["path"]))
+			
+			diff1 = diff_1DH(efficiency1,efficiency2)
+			#diff2 = diff2_1DH(efficiency1,efficiency2)
+
+			if diff1 > 0.0 :
+				outputfile2.cd("basic")
+				efficiency1.Add(efficiency2,-1)
+				efficiency1.Draw("")
+				canvas_eff.Update()
+				print(effPlot,":",diff1)
+				efficiency1.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+			if diff1 > eff_dict_basic[effPlot]["cut"] :
+				outputfile3.cd("basic")
+				print(effPlot,":",diff1)
+				efficiency1.Write(effPlot + "_tgraph")
+				canvas_eff.Write(effPlot + "_canvas")
+
+		outputfile2.Write()
+		outputfile2.Close()
+		outputfile3.Write()
+		outputfile3.Close()
+		inputfile1.Close()
+		inputfile2.Close()
+		self.saveFile('PrCheckerMRDifference','PrCheckerMRDifference_plots_diff.root')
+		self.saveFile('PrCheckerMRDifference','PrCheckerMRDifference_plots_ldiff.root')
-- 
GitLab