ATLAS Offline Software
Loading...
Searching...
No Matches
MuonValidation_AddGaussianFitToPulls.py
Go to the documentation of this file.
1# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
2
3#author: Dan Mori
4#Add gaussian curve to pull plots
5#if plotdir argument given, will output pdfs in that directory of all pull plots
6#usage: python PullFitMacro.py physval_file.root [plotdir]
7
8import ROOT
9import sys
10import os
11import itertools
12
13#---------------------------------------------------------------------------
14
15def AddGaussian( infile, HistDir, HistName ):
16 hist = infile.GetDirectory(HistDir).Get(HistName)
17 if hist.GetEntries() < 10:
18 print( 'INFO Skipping Fit. NumEntries = {0}: '.format(hist.GetEntries()) + HistName )
19 return
20 gaus2 = ROOT.TF1( "gaus2", "gaus", -2, 2 )
21 gaus5 = ROOT.TF1( "gaus", "gaus", -5, 5 )
22 if int(hist.Fit(gaus2,"RQ")) != 0:
23 print( 'WARNING fit failed for ' + HistName )
24 return
25 hist.GetListOfFunctions().Add(gaus5)
26 f1 = hist.GetFunction("gaus")
27 f1.SetParameters( hist.GetFunction("gaus2").GetParameters() )
28 hist.GetListOfFunctions().Remove( gaus2 )
29 f1.SetLineColor(ROOT.kRed)
30 print('INFO Overwriting histogram: ' + HistDir + '/' + HistName )
31 hist.GetDirectory().WriteTObject( hist, HistName, "Overwrite" )
32
33#---------------------------------------------------------------------------
34def main( args ):
35 if len( args ) > 1:
36 filename = args[1]
37 else:
38 print( 'Usage: python {0} filename'.format( args[0] ) )
39 return
40
41 if not os.path.exists( filename ):
42 print ( 'File not found: ' + filename )
43 return
44
45 infile = ROOT.TFile.Open( filename, 'update' )
46
47 MuonTypes = [ 'All', 'Prompt', 'InFlight', 'NonIsolated' ]
48 PullTypes = [ '', 'ID', 'MS' ]
49 Variables = [ 'phi', 'theta', 'qOverP', 'd0', 'z0' ]
50
51 for MuonType in MuonTypes:
52 if not infile.Get( 'Muons/' + MuonType ):
53 print( 'INFO TDirectory not found: Muons/' + MuonType )
54 continue
55 AuthDir = infile.Get( 'Muons/{0}/matched'.format( MuonType ) )
56 Authors = [ i.GetName() for i in AuthDir.GetListOfKeys() if AuthDir.Get( i.GetName() ).InheritsFrom( 'TDirectory' ) ]
57 for Author in Authors:
58 DirName = 'Muons/{0}/matched/{1}/Pulls'.format( MuonType, Author )
59 Dir = infile.Get( DirName )
60 if not Dir:
61 print( 'INFO TDirectory not found: ' + DirName )
62 continue
63 for PullType, var in itertools.product( PullTypes, Variables ):
64 HistName = '_'.join( DirName.split('/') ) + '_Pull{0}_'.format(PullType) + var
65 if not Dir.Get( HistName ):
66 print( 'INFO Histogram not found: ' + HistName )
67 continue
68 AddGaussian( infile, DirName, HistName )
69 infile.Close()
70
71#---------------------------------------------------------------------------
72
73if __name__ == "__main__":
74 ROOT.gROOT.SetBatch()
75 main( sys.argv )
void print(char *figname, TCanvas *c1)
T * Get(TFile &f, const std::string &n, const std::string &dir="", const chainmap_t *chainmap=0, std::vector< std::string > *saved=0)
get a histogram given a path, and an optional initial directory if histogram is not found,...
int main()
Definition hello.cxx:18