def __call__(self, config): for id, settings in config['trigger_efficiency_fit']: if not id in config['objects']: raise ValueError('Requested id {} not found.'.format(id)) eff_fcn = ROOT.TF1("eff_fcn", "(1./2.)*(1 + TMath::Erf((x-[0])/(sqrt(2)*[1])))") print 'Fitting id {0}'.format(id) eff_fcn.SetParameters(100., 20.0, 1.) res = config['objects'][id]['obj'].Fit("eff_fcn", "SEX0", "") xmin = eff_fcn.GetX(0.5) eff_fcn.SetRange(xmin, 1000) res = config['objects'][id]['obj'].Fit("eff_fcn", "SREX0", "") xmin = eff_fcn.GetParameter(0) xmin = eff_fcn.GetX(0.7) eff_fcn.SetRange(xmin, 1000) res = config['objects'][id]['obj'].Fit("eff_fcn", "SREX0", "") x99 = math.ceil(eff_fcn.GetX(0.99)) print 'x99 at {0:.2f}'.format(x99) # Add label with the efficiency factor text = 's=.99 eff. at {0} GeV'.format(x99) config['ax_texts'].append(text + '?_bottomright_') print res.Get() print res.Status() if res.Get() == None or res.Status() != 0: log.critical('Could not fit that function shit.') vfitter = ROOT.TVirtualFitter.GetFitter() eff_fcn.SetNpx(1000) xmin, xmax = config['objects'][id]['obj'].GetXaxis().GetXmin(), config['objects'][id][ 'obj'].GetXaxis().GetXmax() eff_fcn.SetRange(xmin, xmax) eff_error_graph = get_tgrapherrors(eff_fcn, vfitter) id_fit = 'fit_{0}'.format(id.strip('_')) config['objects'].setdefault(id_fit, {})['obj'] = eff_error_graph
def __call__(self, config): for id, settings in config['fit_obj']: if id not in config['objects']: raise ValueError('Requested id {} not found.'.format(id)) log.debug('Fitting object {0}'.format(id)) fcn_name = 'fit_{0}'.format(id) fcn = ROOT.TF1(fcn_name, settings['fcn']) if 'fcn_0' in settings: fcn.SetParameters(*settings['fcn_0']) options = settings.get('options', '') xmin = settings.get('xmin', config['objects'][id]['obj'].GetXaxis().GetXmin()) xmax = settings.get('xmax', config['objects'][id]['obj'].GetXaxis().GetXmax()) # Do the fit if 'N' not in options: options += 'N' config['objects'][id]['obj'].Fit(fcn_name, options) vfitter = ROOT.TVirtualFitter.GetFitter() fcn.SetNpx(1000) fcn.SetRange(xmin, xmax) errorgraph = get_tgrapherrors(fcn, vfitter) # TODO fix this shit # config['objects']['fit_{0}'.format(id)] = copy.deepcopy(config['objects'][id]) new_obj_name = 'fit_{0}'.format(id) config['objects'].setdefault(new_obj_name, {})['obj'] = errorgraph # TGraph with the same number of points as the fitted object, but y values and errors taken from the fit. histo_fit_id = '_fit_graph_origbin_{0}'.format(id) # tmp tgraph of original obj. config['objects'].setdefault(histo_fit_id, {})['obj'] = ROOT.TGraphAsymmErrors(config['objects'][id]['obj']) for i in xrange(config['objects'][histo_fit_id]['obj'].GetN()): tmp_x, tmp_y = ROOT.Double(0), ROOT.Double(0) config['objects'][histo_fit_id]['obj'].GetPoint(i, tmp_x, tmp_y) config['objects'][histo_fit_id]['obj'].SetPoint(i, tmp_x, fcn.Eval(tmp_x)) config['objects'][histo_fit_id]['obj'].SetPointEYhigh(i, 0.) config['objects'][histo_fit_id]['obj'].SetPointEYlow(i, 0.)
def __call__(self, config): ROOT.TVirtualFitter.SetMaxIterations(99999) res_pars = {} for id in config['resolution']: if id not in config['objects']: raise ValueError('Requested id {} not found.'.format(id)) gen_bins = config['objects'][id]['obj'].GetNbinsY() resolution_graph = ROOT.TGraphErrors(gen_bins) for i in xrange(1, gen_bins + 1): # Get slice of 2d histogram print 'ptbin', i, config['objects'][id]['obj'].GetYaxis().GetBinLowEdge(i), config['objects'][id]['obj'].GetYaxis().GetBinLowEdge(i+1) pt_bin_obj = config['objects'][id]['obj'].ProjectionX("{0}_slice_{1}".format(id, i), i, i) # Continue if histogram if empty if pt_bin_obj.GetEntries() < 1: continue # If fit fails continue instead of failing id_slice = '_{0}_slice_{1}'.format(id.strip('_'), i) res = pt_bin_obj.Fit("gaus", "SQO") fcn = pt_bin_obj.GetFunction("gaus") if res.Get() == None or res.Status() != 0: continue xmin, xmax = pt_bin_obj.GetXaxis().GetXmin(), pt_bin_obj.GetXaxis().GetXmax() vfitter = ROOT.TVirtualFitter.GetFitter() fcn.SetNpx(1000) fcn.SetRange(xmin, xmax) error_graph = get_tgrapherrors(fcn, vfitter) # Omit bin with too large errors > 5% if (fcn.GetParError(2) / fcn.GetParameter(2)) > 0.05: continue # Uncomment to save also individual gauss fits to dict config['objects'].setdefault(id_slice, {}) config['objects'][id_slice]['obj'] = pt_bin_obj config['objects'].setdefault('{0}_fit'.format(id_slice), {}) config['objects']['{0}_fit'.format(id_slice)]['obj'] = error_graph resolution_graph.SetPoint(i, config['objects'][id]['obj'].GetYaxis().GetBinCenter(i), fcn.GetParameter(2)) resolution_graph.SetPointError(i, config['objects'][id]['obj'].GetYaxis().GetBinWidth(i) / 2., fcn.GetParError(2)) # Store TGraph and fit TGraph id_res = 'resolution_{0}'.format(id.strip('_')) config['objects'].setdefault(id_res, {}) config['objects'][id_res]['obj'] = resolution_graph res_fcn = ROOT.TF1("res_fcn", "sqrt(([0]/x)**2 + (([1]**2)/x) + [2]**2)") # res_fcn = ROOT.TF1("res_fcn", "sqrt(TMath::Sign(1.,[0])*([0]/x)**2 + (([1]**2)/x) + [2]**2)") # res_fcn = ROOT.TF1("res_fcn", "sqrt(TMath::Sign(1.,[0])*([0]**2) + ((x)**[1])*([2]**2/x) + [3]**2)") res_fcn.SetParameters(5., 1.0, 0.03, -0.5) res_fcn.SetRange(30., 9999.) print 'Fitting id {0}'.format(id_res) res = resolution_graph.Fit("res_fcn", "RSOEX0", "") # if res.Get() == None or res.Status() != 0: # raise Exception('Fit Failed') res_pars[id] = [res_fcn.GetParameter(0),res_fcn.GetParameter(1),res_fcn.GetParameter(2),res_fcn.GetParameter(3)] xmin, xmax = resolution_graph.GetXaxis().GetXmin(), resolution_graph.GetXaxis().GetXmax() vfitter = ROOT.TVirtualFitter.GetFitter() res_fcn.SetNpx(1000) res_fcn.SetRange(xmin, xmax) res_error_graph = get_tgrapherrors(res_fcn, vfitter) config['objects'].setdefault('{0}_fit'.format(id_res), {})['obj'] = res_error_graph print res_pars for k,v in res_pars.iteritems(): print '\'{0}\' : {1},'.format(k, v)