def plotEffMap( self, name, x, y, Lumi, **keywords ): """.. method:: plotEff2D( name, varX, varY, Lumi ) Giving a RooDataSet name in directory-like format, the function will do a bi-dimensional plot of efficiency with ``varX`` and ``varY`` variables. Also, it will stores the graph within the dataset dictionary :param name: name of the dataset :type name: string :param varX: binned variable to be used in the x-axis :type varX: string :param varY: binned variable to be used in the y-axis :type varY: string :param Lumi: luminosity :type Lumi: string :raise KeyError: the dataset is not in the root file (to be changed to NameError) :raise KeyError: some binned variables is not in the dataset """ import ROOT ROOT.gROOT.SetBatch(1) import pytnp.steerplots.rootlogon from tnputils import getBinning,listTableEff,getEff #FIXME: Meter los errores en la misma linea (ahora te salta # de linea (TEXT option) try: dataSet = self.RooDataSet[name] except KeyError: message = """There is no RooDataSet with name '%s'""" % name printError( self.__module__+'.plotEfMap', message, AttributeError ) #-- Are the variables in the RooDataSet? varNotInDatasetList = filter( lambda var: not var in self[name]['binnedVar'].keys(), [x, y] ) if len(varNotInDatasetList) != 0: message = 'No binned variable: ' for var in varNotInDatasetList: message += "'%s' " % var message += "in the RooDataSet '%s'. Skipping plot generation..." % name printWarning( self.__module__+'.plotEffMap', message ) # --- Skipping plot generation return #--- Name for the histo and for the plot file to be saved histoName = 'TH2F_'+name #--- Checking if the histo is already stored and plotted if self[name].has_key('TH2'): #### FIXME: has_key o has_attribute ??? #-- Skipping, work it's done! return None #---- Preparing all the stuff title = self.resLatex+', '+self[name]['objectType']+' '+self[name]['effType']+' '+dataSet.GetTitle() yNbins = self[name]['variables'][y]['binN'] #arrayBinsY = self[name]['variables'][y]['arrayBins']---> # I need the PyDoubleBuffer #------------------------------------------ __argSet__ = dataSet.get() dum, arrayBinsY = getBinning( __argSet__[y] ) #------------------------------------------ xNbins = self[name]['variables'][x]['binN'] #arrayBinsX = self[name]['variables'][x]['arrayBins']---> # I need the PyDoubleBuffer #------------------------------------------ dum, arrayBinsX = getBinning( __argSet__[x] ) #------------------------------------------ hTitleOfHist = name.replace('/','_') h = ROOT.TH2F( hTitleOfHist, '', xNbins, arrayBinsX, yNbins, arrayBinsY ) hlo = h.Clone("eff_lo") hlo.SetName( 'low_'+hTitleOfHist ) hhi = h.Clone("eff_hi") hhi.SetName( 'high_'+hTitleOfHist ) #-- Getting the efficiencies _listTableEffList = listTableEff(self.RooDataSet[name]) #skipPoints = False for binDict in _listTableEffList: #-- Extract error values #if abs(binDict[self[name]['eff']][0]-self.badPoint[0]) < 1e-9: # skipPoints = True # continue b = h.FindBin( binDict[x][0] , binDict[y][0] ) h.SetBinContent(b, binDict[self[name]['eff']][0]) h.SetBinError(b, (binDict[self[name]['eff']][2]-binDict[self[name]['eff']][1])/2.0 ) # WATCH: Error 'Simetrized' hlo.SetBinContent(b, binDict[self[name]['eff']][1]) hhi.SetBinContent(b, binDict[self[name]['eff']][2]) c = ROOT.TCanvas() #c.SetLogy(isLog[1]) h.GetYaxis().SetTitle(self[name]['variables'][y]['latexName']) h.GetXaxis().SetTitle(self[name]['variables'][x]['latexName']) h.GetZaxis().SetTitle(self[name]['variables'][self[name]['eff']]['latexName']) #h.SetTitle( title ) --> Out titles h.SetTitle( ' CMS Preliminary,'+Lumi+' #sqrt{s}=7 TeV ' ) #h.SetTitle('' ) h.Draw('COLZ') htext = h.Clone('htext') htext.SetMarkerSize(1.0) htext.SetMarkerColor(1) #if isLog[1]: # ROOT.gStyle.SetPaintTextFormat("1.2f") # htext.Draw('ESAMETEXT0') #else: ROOT.gStyle.SetPaintTextFormat("1.3f") #htext.SetMarkerSize(2.2) htext.Draw('SAMETEXTE0') #plotName = self.resonance+'_'+name.replace('/','_')+isLog[0]+'.eps' plotName = self.resonance+'_'+name.replace('/','_')+'.eps' c.SaveAs(plotName) # if skipPoints: # message = '\033[1;33mplotEff2D Warning: Some efficiencies points are failed in the fit, the last plot will skip '\ # 'values with %.4f\033[1;m' % self.badPoint[0] # print message #FIXME: attribute o llave del diccionario del rootdataset?? try: self[name]['TH2'][histoName] = (h, hlo, hhi) except KeyError: self[name]['TH2F'] = {} self[name]['TH2F'][histoName] = (h, hlo, hhi)
def plotEff1D( self, name, inputVarName, Lumi ): """.. method:: plotEff1D( dataname, variable, Lumi ) Given a name directory-like for a ROOT.RooDataSet object, the function creates a 1-dim plot of 'variable_name' extracted from the object and it will save it in a eps file. Also it will store the graph object creating a new key in the dataset dictionary:: self[nameRooDataSet]['tgraphs'] = { 'class_graph_name': TGraphAsymmErrors, ... } :param name: name of the dataset :type name: string :param variable: binned variable to use :type variable: string :param Lumi: luminosity :type Lumi: string :raise KeyError: the dataset is not in the root file (to be changed to NameError) :raise KeyError: the binned variable is not in the dataset """ #import rootlogon from tnputils import listTableEff,getEff, graphclassname from pytnp.steerplots.plotfunctions import plotAsymGraphXY dataset = None #-- Getting the class graph name _graphclassname = graphclassname( self, name ) #-- Checking if the object exists try: dataset = self.RooDataSet[name] except KeyError: message = """you must introduce a valid name, '%s' is not a RooDataSet in the root file""" % name printError( self.__module__, message, KeyError ) #--- Empty dataset if self.RooDataSet[name].numEntries() == 0: message = """Empty RooDataSet '%s'. Skipping...""" % name printWarning( self.__module__+'.plotEff1D',message) return None #--- Checking variable if not inputVarName in self[name]['binnedVar'].keys(): message = """you must introduce a valid binned variable name, '%s' is not in the '%s' RooDataSet\n""" % (inputVarName,name ) message += """The list of binned variables are '%s'""" % str(self[name]['binnedVar'].keys()) printError( self.__module__, message, KeyError ) self[name]['tgraphs'] = { _graphclassname: {} } # Special case: we have only one variable if len(self[name]['binnedVar']) == 1: graphName = self.resonance+'_'+self[name]['effType']+'_'+self[name]['objectType']+'_'+\ self[name]['methodUsed']+'__'+inputVarName if self[name]['isMC'] == 1: graphName += '__mcTrue' #--- Extracting the efficiency values per bin plotList = listTableEff( dataset ) _min = 0 _max = 0 #--- Setting the points and extracting the min and max value #--- in order to build the frame to plot XPoints = [] YPoints = [] for varDict in plotList: (eff,effLo,effHi) = varDict[self.effName] (var,varLo,varHi) = varDict[inputVarName] XPoints.append( (var, varLo, varHi) ) YPoints.append( (eff, effLo, effHi) ) _min = min( _min, varLo ) _max = max( _max, varHi ) #--- Cosmethics to storing the plot #title = self[name]['objectType']+' category' xtitle = self[name]['variables'][inputVarName]['latexName']+' '+self[name]['variables'][inputVarName]['unit'] ytitle = 'efficiency' title = ' CMS Preliminary,'+Lumi+' #sqrt{s}=7 TeV ' self[name]['tgraphs'][_graphclassname][graphName] = plotAsymGraphXY( XPoints, YPoints, xtitle, ytitle,\ returnGraph=True, rangeFrame = (_min,0,_max,1.05), title=title, graphname=graphName ) return #-- More than one binned variable for varName in filter( lambda x: x != inputVarName, self[name]['binnedVar'].keys()): _otherVarList_ = filter( lambda x: x != varName, self[name]['binnedVar'].keys() ) _otherVar_ = '' for i in _otherVarList_: _otherVar_ += i+', ' _otherVar_ = _otherVar_[:-2] if len(_otherVar_ ) != 0: _otherVar_ = ' in all the range of \'' +_otherVar_+'\'' print '\033[1;34m'+name+': \''+varName+'\' bins'+_otherVar_+'\033[1;m' #--- Extracting bins and array of bins binsN = self[name]['variables'][varName]['binN'] arrayBins = self[name]['variables'][varName]['arrayBins'] for bin in xrange(binsN): arrayBins = self[name]['variables'][varName]['arrayBins'] Lo = arrayBins[bin] Hi = arrayBins[bin+1] Central = (Hi+Lo)/2.0 graphName = self.resonance+'_'+self[name]['effType']+'_'+self[name]['objectType']+'_'+\ self[name]['methodUsed']+'__'+varName+'_bin'+str(bin)+'_' #graphName = self.resonance+'_'+self[name]['methodUsed']+'_'+self[name]['effType']+'_'+\ # self[name]['objectType']+'__'+varName+'_bin'+str(bin)+'_' #Getting list of efficiency values plus variables _plotList = eval('getEff(dataset,self.effName,'+varName+'='+str(Central)+')') #print _plotList #Extracting info to plot #try: (eff,effErrorLo,effErrorHi),otherVarDict = _plotList[0] if len(filter( lambda (eff,__dic): eff[0] == 0.0, _plotList )) == len(_plotList): printWarning( self.__module__+'.plotEff1D',"Skipping... Efficiencies in the dataset not calculated") continue _max = {} _min = {} varPoints = {} effPoints = {} for otherVarName, val in otherVarDict.iteritems(): varPoints[otherVarName] = [] effPoints[otherVarName] = [] _max[otherVarName] = 0.0 _min[otherVarName] = 0.0 for (eff,effLo,effHi),otherVarDict in _plotList: for otherVarName, (central, low, high) in otherVarDict.iteritems(): _min[otherVarName] = min( _min[otherVarName], low ) _max[otherVarName] = max( _max[otherVarName], high ) varPoints[otherVarName].append( (central,low,high) ) effPoints[otherVarName].append( (eff, effLo, effHi) ) title = self.resLatex+', ('+str(Lo)+','+str(Hi)+') '+self[name]['variables'][varName]['latexName']+' range, ' title += self[name]['objectType']+' category' for otherVarName, (central, low, high) in otherVarDict.iteritems(): graphname = graphName+otherVarName if self[name]['isMC'] == 1: graphname += '__mcTrue' xtitle = self[name]['variables'][otherVarName]['latexName']+\ ' '+self[name]['variables'][otherVarName]['unit'] ytitle = 'efficiency' title = 'CMS Preliminary,'+Lumi+' #sqrt{s}=7 TeV' ranges = (_min[otherVarName],0,_max[otherVarName],1.05) self[name]['tgraphs'][_graphclassname][graphname] = plotAsymGraphXY( varPoints[otherVarName], effPoints[otherVarName],\ xtitle, ytitle, returnGraph=True, rangeFrame=ranges, title=title, graphname=graphname)