From d1acbb1140db78891829d87b3779e4f95c1d8739 Mon Sep 17 00:00:00 2001 From: Fabrizio Grosa Date: Wed, 20 May 2020 12:10:28 +0200 Subject: [PATCH] Add possibility to compare uncertainties --- comparisons/CompareGraphs.py | 65 ++++++++++++++++++++++++++++--- comparisons/config_comparison.yml | 8 ++++ 2 files changed, 67 insertions(+), 6 deletions(-) diff --git a/comparisons/CompareGraphs.py b/comparisons/CompareGraphs.py index bba9903d..af737a3c 100644 --- a/comparisons/CompareGraphs.py +++ b/comparisons/CompareGraphs.py @@ -40,17 +40,23 @@ ratioUncCorr = inputCfg['options']['ratio']['uncertainties']['corr'] displayRMS = inputCfg['options']['ratio']['displayRMS'] +doCompareUnc = inputCfg['options']['errcomp']['enable'] +compareRelUnc = inputCfg['options']['errcomp']['relative'] + wCanv = inputCfg['options']['canvas']['width'] hCanv = inputCfg['options']['canvas']['heigth'] xLimits = inputCfg['options']['canvas']['xlimits'] yLimits = inputCfg['options']['canvas']['ylimits'] yLimitsRatio = inputCfg['options']['canvas']['ylimitsratio'] +yLimitsUnc = inputCfg['options']['canvas']['ylimitserr'] xTitle = inputCfg['options']['canvas']['xaxistitle'] yTitle = inputCfg['options']['canvas']['yaxistitle'] logX = inputCfg['options']['canvas']['logx'] logY = inputCfg['options']['canvas']['logy'] ratioLogX = inputCfg['options']['canvas']['ratio']['logx'] ratioLogY = inputCfg['options']['canvas']['ratio']['logy'] +uncCompLogX = inputCfg['options']['canvas']['errcomp']['logx'] +uncCompLogY = inputCfg['options']['canvas']['errcomp']['logy'] xLegLimits = inputCfg['options']['legend']['xlimits'] yLegLimits = inputCfg['options']['legend']['ylimits'] @@ -65,7 +71,7 @@ leg.SetFillStyle(0) leg.SetTextSize(legTextSize) -hToCompare, hRatioToCompare = [], [] +hToCompare, hRatioToCompare, hUncToCompare = [], [], [] for iFile, (inFileName, objName, objType, scale, color, marker) in \ enumerate(zip(inFileNames, objNames, objTypes, scales, colors, markers)): if inDirName: @@ -99,6 +105,24 @@ #TODO: add util function in AnalysisUtils to manage ratios between graphs or graph and histo SetObjectStyle(hRatioToCompare[iFile], color=GetROOTColor(color), markerstyle=GetROOTMarker(marker), fillstyle=0) + if doCompareUnc: + if 'TH' in objType: + hUncToCompare.append(hToCompare[iFile].Clone(f'hUncToCompare{iFile}')) + for iBin in range(1, hUncToCompare[iFile].GetNbinsX()+1): + unc = hUncToCompare[iFile].GetBinError(iBin) + cent = hUncToCompare[iFile].GetBinContent(iBin) + if compareRelUnc: + hUncToCompare[iFile].SetBinContent(iBin, unc/cent) + else: + hUncToCompare[iFile].SetBinContent(iBin, unc) + hUncToCompare[iFile].SetBinError(iBin, 1.e-20) + hUncToCompare[iFile].SetDirectory(0) + SetObjectStyle(hUncToCompare[iFile], color=GetROOTColor(color), markerstyle=GetROOTMarker(marker), + fillstyle=0) + else: + #TODO: add uncertainty comparison for TGraphs + print('WARNING: uncertainty comparison for TGraphs not implemented. Switching off') + doCompareUnc = False leg.AddEntry(hToCompare[iFile], legNames[iFile], legOpt[iFile]) @@ -118,8 +142,18 @@ cOut = TCanvas('cOutput', '', wCanv, hCanv) -if doRatio: - cOut.Divide(2, 1) +if doRatio or doCompareUnc: + if doRatio and doCompareUnc: + cOut.Divide(3, 1) + ratioPad = 2 + uncPad = 3 + else: + cOut.Divide(2, 1) + if doRatio: + ratioPad = 2 + else: + uncPad = 2 + hFrame = cOut.cd(1).DrawFrame(xLimits[0], yLimits[0], xLimits[1], yLimits[1], f';{xTitle};{yTitle}') if logX: cOut.cd(1).SetLogx() @@ -141,12 +175,13 @@ leg.Draw() if doRatio: - hFrameRatio = cOut.cd(2).DrawFrame(xLimits[0], yLimitsRatio[0], xLimits[1], yLimitsRatio[1], f';{xTitle};Ratio') + hFrameRatio = cOut.cd(ratioPad).DrawFrame(xLimits[0], yLimitsRatio[0], xLimits[1], yLimitsRatio[1], + f';{xTitle};Ratio') hFrameRatio.GetYaxis().SetDecimals() if ratioLogX: - cOut.cd(2).SetLogx() + cOut.cd(ratioPad).SetLogx() if ratioLogY: - cOut.cd(2).SetLogy() + cOut.cd(ratioPad).SetLogy() lineAtOne = TLine(xLimits[0], 1., xLimits[1], 1.) lineAtOne.SetLineColor(GetROOTColor('kBlack')) lineAtOne.SetLineWidth(2) @@ -159,6 +194,21 @@ else: histo.Draw(drawOpt) +if doCompareUnc: + if compareRelUnc: + uncTitle = 'Relative uncertainties' + else: + uncTitle = 'Absolute uncertainties' + hFrameUnc = cOut.cd(uncPad).DrawFrame(xLimits[0], yLimitsUnc[0], xLimits[1], yLimitsUnc[1], + f';{xTitle};{uncTitle}') + hFrameUnc.GetYaxis().SetDecimals() + if uncCompLogX: + cOut.cd(uncPad).SetLogx() + if uncCompLogY: + cOut.cd(uncPad).SetLogy() + for iHisto, (histo, drawOpt) in enumerate(zip(hUncToCompare, drawOptions)): + histo.DrawCopy(f'{drawOpt}same') + for ext in outExtensions: if 'root' in ext: outFile = TFile(f'{outFileName}.root', 'recreate') @@ -168,6 +218,9 @@ if doRatio: for histo in hRatioToCompare: histo.Write() + if doCompareUnc: + for histo in hUncToCompare: + histo.Write() outFile.Close() else: cOut.SaveAs(f'{outFileName}.{ext}') diff --git a/comparisons/config_comparison.yml b/comparisons/config_comparison.yml index 67d69f01..48ee49a2 100644 --- a/comparisons/config_comparison.yml +++ b/comparisons/config_comparison.yml @@ -29,6 +29,10 @@ options: corr: false displayRMS: true + errcomp: # comparison of uncertainties + enable: true + relative: true + legend: xlimits: [0.2, 0.6] ylimits: [0.6, 0.9] @@ -44,8 +48,12 @@ options: xlimits: [2., 16.] ylimits: [0., 2.] ylimitsratio: [0., 2.] + ylimitserr: [0., 0.35] logy: true logx: false ratio: logy: false logx: false + errcomp: + logy: false + logx: false