Example #1
0
    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
Example #2
0
    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.)
Example #3
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)