Example #1
0
def gendata(filename, q2Bin, nSample):
    time_start = time.time()
    obs = getobs()
    file = TFile.Open(filename)
    if not file:
        print('File not found: ', filename)
        return
    wspname = 'ws_b{}p0'.format(q2Bin)
    wsp = file.Get(wspname)
    if not wsp:
        print('Workspace not found in file: ', filename)
        return
    ctK = wsp.var('ctK')
    ctL = wsp.var('ctL')
    phi = wsp.var('phi')
    rand = wsp.var("rand")
    if (not ctK) or (not ctL) or (not phi):
        print('Variables not found in file: ', filename)
        return
    vars = RooArgList(ctK, ctL, phi)
    datasetname = 'data_genDen_ev_b{}'.format(q2Bin)
    fullData = wsp.data(datasetname)
    if not fullData:
        print('DataSet ', datasetname, ' not found in file: ', filename)
        return
    data = RooDataSet()
    if nSample == 0:
        data = fullData
    elif nSample <= 10000:
        data = fullData.reduce(
            RooArgSet(vars), 'rand > {:1.6f} && rand < {:1.6f}'.format(
                (nSample - 1) * dataStat[q2Bin] / genStat[q2Bin],
                nSample * dataStat[q2Bin] / genStat[q2Bin]))
    else:
        data = fullData.reduce(
            RooArgSet(vars), 'rand > {:.6f} && rand < {:.6f}'.format(
                (nSample % 10000 - 1) * d16Stat[q2Bin] / genStat[q2Bin],
                (nSample % 10000) * d16Stat[q2Bin] / genStat[q2Bin]))
    print('Fit ', data.numEntries(), ' events')
    ###convert the final dataset to pd.dataframe
    datalist = []
    for i in range(0, data.numEntries()):
        ctKvalue = data.get(i).getRealValue('ctK')
        ctLvalue = data.get(i).getRealValue('ctL')
        phivalue = data.get(i).getRealValue('phi')
        datalist.append([ctKvalue, ctLvalue, phivalue])
    #print ('lenth of datalist ', len(datalist))
    finaldata_df = pd.DataFrame(datalist, columns=['costk', 'costl', 'phi'])
    finaldata = zfit.Data.from_pandas(finaldata_df, obs=obs)
    print('generate zfit data from RooDataSet successfully')
    time_end = time.time()
    time_c = time_end - time_start
    print('time used in fit data import: ', time_c, 's')
    return finaldata
Example #2
0
    doubleCanvas = TCanvas();
        
    frameList = []
    print '\n\n',tupleDict.values(),'\n\n'

    doubleCanvas.Divide(3,3,0,0)

    for i in range(len(tupleDict)):
        #varName = tupleDict.keys()[i];
        frameList += [tupleDataSet.get().find(tupleDict.values()[i]).frame()];
        tupleDataSet.plotOn(frameList[i], RooFit.DrawOption('b'));
        doubleCanvas.cd(i+1);
        frameList[i].Draw();
    '''
    for i in range(len(tupleDict)):
        tupleDataSet.get().find(tupleDict.values()[i]).Print()
    sys.exit(0)
    '''
    doubleCanvas.Update();
    raw_input('Press Enter to continue');
    #doubleCanvas.Clear();
    #print tupleDict.keys()[i];
    #a.Print();
    #print
    doubleCanvas.Close();'''

tupleDataSet.Print()

sys.exit(0)

dirName = "tupleTestPlots"
Example #3
0
class DilutionToy(Toy):
    def __init__(self):
        Toy.__init__(self)
        self._gen_params = []

    def run(self, **kwargs):
        from ROOT import RooArgSet

        __check_req_kw__("Observables", kwargs)
        __check_req_kw__("Pdf", kwargs)
        __check_req_kw__("Sigmat", kwargs)
        __check_req_kw__("Time", kwargs)
        __check_req_kw__("SigmaGen", kwargs)
        sigma_gen = kwargs.pop("SigmaGen")
        observables = kwargs.pop("Observables")
        obs_set = RooArgSet(*observables)

        pdf = kwargs.pop("Pdf")
        sigmat = kwargs.pop("Sigmat")
        time = kwargs.pop("Time")

        gen_obs_set = RooArgSet(*observables)

        # Make another ArgSet to put the fit results in
        result_params = RooArgSet("result_params")

        from P2VV.RooFitWrappers import RealVar

        da = RealVar("da", Observable=True, MinMax=(0.01, 1.1))
        dft = RealVar("dft", Observable=True, MinMax=(0.01, 1.1))
        result_params.add(da._target_())
        result_params.add(dft._target_())

        transform = self.transform()
        if transform:
            trans_params = transform.gen_params(gen_obs_set)
            self._gen_params.extend(trans_params)
            for p in trans_params:
                result_params.add(p)

        # Some extra numbers of interest
        from ROOT import RooRealVar

        seed = RooRealVar("seed", "random seed", 0.0)
        result_params.add(seed)

        # The dataset to store the results
        from ROOT import RooDataSet

        self._data = RooDataSet("result_data", "result_data", result_params)
        data_params = self._data.get()

        from ROOT import RooRandom
        import struct, os

        # Reset pdf parameters to initial values. Note: this does not reset the estimated errors...
        args = dict(NumEvents=self.options().nevents)
        if "ProtoData" in kwargs:
            args["ProtoData"] = kwargs.pop("ProtoData")
        spec = pdf.prepareMultiGen(obs_set, **args)

        while self._data.numEntries() < self.options().ntoys:
            # Get a good random seed, set it and store it
            s = struct.unpack("I", os.urandom(4))[0]
            RooRandom.randomGenerator().SetSeed(s)
            seed.setVal(s)

            data = pdf.generate(spec)
            if self.transform():
                old_data = data
                data = self.transform()(old_data)
                if not data:
                    transform.set_params(data_params)
                    self._data.add(data_params)
                    continue

            from P2VV import Dilution

            d_ft = Dilution.dilution_ft(data, time, t_range=2, quiet=True)
            d_a = Dilution.signal_dilution_dg(data, sigmat, *sigma_gen)
            da.setVal(d_a[0])
            da.setError(d_a[1] if d_a[1] != None else 0.0)
            dft.setVal(d_ft[0])
            dft.setError(d_ft[1] if d_ft[1] != None else 0.0)

            if transform:
                transform.set_params(data_params)

            self._data.add(result_params)

        return self.data()

    def gen_params(self):
        return self._gen_params
Example #4
0
class FitToy(Toy):
    def __init__(self):
        Toy.__init__(self)

    def run(self, **kwargs):
        from ROOT import RooArgSet

        __check_req_kw__("Observables", kwargs)
        __check_req_kw__("Pdf", kwargs)

        observables = kwargs.pop("Observables")
        obs_set = RooArgSet(*observables)

        pdf = kwargs.pop("Pdf")
        genPdf = kwargs.pop("GenPdf", pdf)

        gen_obs_set = RooArgSet()
        for o in list(observables) + list(genPdf.ConditionalObservables()):
            gen_obs_set.add(o._target_())
        gen_pdf_params = genPdf.getParameters(gen_obs_set).snapshot(True)

        genPdf = genPdf.clone(genPdf.GetName() + "_toy_clone")
        genPdf.recursiveRedirectServers(gen_pdf_params)

        fit_obs_set = RooArgSet()
        for o in list(observables) + list(pdf.ConditionalObservables()):
            fit_obs_set.add(o._target_())
        params = pdf.getParameters(fit_obs_set)

        pdf_params = RooArgSet()
        for p in params:
            if p.isConstant():
                continue
            pdf_params.add(p)
        ## for param in pdf_params:
        ##     if param.GetName() not in ['Gamma', 'dGamma']:
        ##         param.setConstant()
        self._gen_params = pdf_params.snapshot(True)

        # Make another ArgSet to put the fit results in
        result_params = RooArgSet(pdf_params, "result_params")

        transform = self.transform()
        if transform:
            trans_params = transform.gen_params(gen_obs_set)
            for p in trans_params:
                result_params.add(p)

        # Some extra numbers of interest
        from ROOT import RooRealVar

        NLL = RooRealVar("NLL", "-log(Likelihood)", 1.0)
        ngen = RooRealVar("ngen", "number of generated events", self.options().nevents)
        seed = RooRealVar("seed", "random seed", 0.0)
        from ROOT import RooCategory

        status = RooCategory("status", "fit status")
        status.defineType("success", 0)
        status.defineType("one", 1)
        status.defineType("two", 2)
        status.defineType("three", 3)
        status.defineType("other", 4)
        result_params.add(status)
        result_params.add(NLL)
        result_params.add(ngen)
        result_params.add(seed)

        # The dataset to store the results
        from ROOT import RooDataSet

        self._data = RooDataSet("result_data", "result_data", result_params)
        data_params = self._data.get()

        from ROOT import RooRandom
        import struct, os

        while self._data.numEntries() < self.options().ntoys:
            # Get a good random seed, set it and store it
            s = struct.unpack("I", os.urandom(4))[0]
            RooRandom.randomGenerator().SetSeed(s)
            seed.setVal(s)

            # Reset pdf parameters to initial values. Note: this does not reset the estimated errors...
            pdf_params.assignValueOnly(self.gen_params())
            args = dict(NumEvents=self.options().nevents)
            if "ProtoData" in kwargs:
                args["ProtoData"] = kwargs.pop("ProtoData")

            genPdf.getParameters(obs_set).assignValueOnly(gen_pdf_params)
            data = genPdf.generate(obs_set, **args)
            if transform:
                data = transform(data)
                if not data:
                    # Transform has failed
                    transform.set_params(data_params)
                    self._data.add(data_params)
                    continue

            if data.isWeighted() and "SumW2Error" not in self.fit_opts():
                self.fit_opts()["SumW2Error"] = False

            j = 0
            while j < 4:
                fit_result = pdf.fitTo(data, NumCPU=self.options().ncpu, **(self.fit_opts()))
                if fit_result.status() == 0:
                    fit_result.Print()
                    break
                j += 1
            if fit_result.status() != 0:
                print "Fit result status = %s" % fit_result.status()
            NLL.setVal(fit_result.minNll())
            if fit_result.status() < 4:
                status.setIndex(fit_result.status())
            else:
                status.setIndex(4)
            for result_param in result_params:
                data_param = data_params.find(result_param.GetName())
                if isinstance(result_param, RooCategory):
                    data_param.setIndex(result_param.getIndex())
                else:
                    data_param.setVal(result_param.getVal())
                    # This sets a symmetric error, but since we don't run Minos, that's ok
                    data_param.setError(result_param.getError())
            if transform:
                transform.set_params(data_params)

            self._data.add(data_params)

        return self.data()

    def gen_params(self):
        return self._gen_params
Example #5
0
class SData( object ) :
    def __init__( self, **kwargs ) :
        # get input arguments
        def getKwArg( keyword, member, kwargs ) :
            if keyword in kwargs : setattr( self, '_' + member, kwargs.pop(keyword) )
            else : raise KeyError, 'P2VV - ERROR: SData.__init__(): key %s not found in input arguments' % keyword
        getKwArg( 'Name', 'name',      kwargs )
        getKwArg( 'Data', 'inputData', kwargs )
        getKwArg( 'Pdf',  'pdf',       kwargs )

        # initialize dictionary for weighted data sets per specie
        self._data = dict()

        # get yields and observables
        self._yields = [ par for par in self._pdf.Parameters() if par.getAttribute('Yield') ]
        self._observables = self._pdf.Observables()

        # calculate sWeights
        self._sData = None
        from ROOT import RooStats, RooArgList, RooSimultaneous
        if isinstance( self._pdf._var, RooSimultaneous ) and kwargs.pop( 'Simultaneous', True ) :
            import gc
            # split data set in categories of the simultaneous PDF
            splitCat        = self._pdf.indexCat()
            splitData       = self._inputData.split(splitCat)
            from ROOT import RooFormulaVar
            for splitCatState in splitCat:
                # calculate sWeights per category
                cat = splitCatState.GetName()
                data = filter(lambda d: d.GetName() == cat, splitData)[0]

                origYieldVals = [ ( par.GetName(), par.getVal(), par.getError() ) for par in self._yields if par.GetName().endswith(cat) ]
                splot = RooStats.SPlot( self._name + '_sData_' + cat, self._name + '_sData_' + cat, data, self._pdf.getPdf(cat)
                                        , RooArgList( par._var for par in self._yields if par.GetName().endswith(cat)))
                sdata = splot.GetSDataSet()

                print 'P2VV - INFO: SData.__init__(): yields category %s:' % cat
                print '    original:',
                for vals in origYieldVals : print '%s = %.2f +/- %.2f  ' % vals,
                print '\n    new:     ',
                for par in self._yields :
                    if par.GetName().endswith(cat) : print '%s = %.2f +/- %.2f  ' % ( par.GetName(), par.getVal(), par.getError() ),
                print

                # add column for splitting category/categories (was removed when data set was split)
                # FIXME: How can we do this more generally? These are special cases and it might go wrong here...
                from ROOT import RooSuperCategory
                splitCat.setLabel(cat)
                __dref = lambda o : o._target_() if hasattr(o,'_target_') else o
                if isinstance( __dref(splitCat), RooSuperCategory ) :
                    for fundCat in splitCat.inputCatList() :
                        if not sdata.get().find( fundCat.GetName() ) : sdata.addColumn(fundCat)
                elif splitCat.isFundamental() and not sdata.get().find( splitCat.GetName() ) :
                    sdata.addColumn(splitCat)

                # add general sWeight and PDF value columns (it must be possible to simplify this...)
                # FIXME: in some cases "par.GetName().strip( '_' + cat )" goes wrong:
                # use "par.GetName()[ : par.GetName().find(cat) - 1 ]" instead
                # (case: 'N_bkgMass_notExclBiased'.strip('_notExclBiased') --> 'N_bkgM' ?!!!!!!)
                weightVars = [ (  RooFormulaVar( par.GetName()[ : par.GetName().find(cat) - 1 ] + '_sw', '', '@0'
                                                , RooArgList( sdata.get().find( par.GetName() + '_sw' ) ) )
                                , RooFormulaVar( 'L_' + par.GetName()[ : par.GetName().find(cat) - 1 ], '', '@0'
                                                , RooArgList( sdata.get().find( 'L_' + par.GetName() ) ) )
                               ) for par in self._yields if par.GetName().endswith(cat)
                             ]

                for weight, pdfVal in weightVars :
                    sdata.addColumn(weight)
                    sdata.addColumn(pdfVal)

                if not self._sData:
                    # get set of variables in data
                    sDataVars = sdata.get()
                    for par in self._yields :
                        if cat in par.GetName() :
                            sDataVars.remove( sDataVars.find( par.GetName() + '_sw' ) )
                            sDataVars.remove( sDataVars.find( 'L_' + par.GetName()  ) )
                    from ROOT import RooDataSet
                    self._sData = RooDataSet( self._name + '_splotdata', self._name + '_splotdata', sDataVars )

                self._sData.append(sdata)
                splitData.remove(data)
                del data
                del splot
                gc.collect()
        else :
            # calculate sWeights with full data set
            if isinstance( self._pdf._var, RooSimultaneous ) :
                print 'P2VV - WARNING: SData.__init__(): computing sWeights with a simultaneous PDF'
            self._sPlot = RooStats.SPlot( self._name + '_splotdata', self._name + '_splotdata', self._inputData, self._pdf._var
                                         , RooArgList( par._var for par in self._yields ) )
            self._sData = self._sPlot.GetSDataSet()

        # check keyword arguments
        if kwargs : raise KeyError, 'P2VV - ERROR: SData.__init__(): got unknown keywords %s for %s' % ( kwargs, type(self) )

    def usedObservables( self ) : return self._observables
    def components( self )      : return [ y.GetName()[2:] for y in self._yields ]
    def Pdf( self )             : return self._pdf

    def Yield( self, Component ) :
        yName = 'N_%s' % Component
        for y in self._yields :
            if y.GetName() == yName : return y.getVal()

        raise KeyError, 'P2VV - ERROR: SData.__init__(): unknown component %s' % Component

    def data( self, Component = None ) :
        if not Component : return self._sData

        if Component not in self._data :
            # check if component exists
            yName = 'N_%s' % Component
            if not any( yName in y.GetName() for y in self._yields ) :
                raise KeyError, 'P2VV - ERROR: SData.__init__(): unknown component: %s' % Component
            wName = '%s_sw' % yName
            if wName not in [ w.GetName() for w in self._sData.get() ] :
                raise KeyError, 'no weight in dataset for component %s' % Component

            # create weighted data set
            dName = '%s_weighted_%s' % ( self._sData.GetName(), Component )
            from ROOT import RooDataSet
            from P2VV.ROOTDecorators import ROOTversion
            if ROOTversion[0] <= 5 and ROOTversion[1] <= 34 and ROOTversion[2] < 2 :
                self._data[Component] = RooDataSet( dName, dName, self._sData.get(), Import = self._sData, WeightVar = ( wName ) )
            else :
                self._data[Component] = RooDataSet( dName, dName, self._sData.get(), Import = self._sData, WeightVar = ( wName, True ) )

        return self._data[Component]
Example #6
0
#Iteartion over the workspce files
for i, f_wsp in enumerate(wlist):
    print "Processing workspace "+str(i)+"/"+str(len(wlist))
    ws_file = TFile(f_wsp, "read")
    wsp = ws_file.Get("wspace")
    ws_file.Close()
    dataset_RS = wsp.data("dataset_RS")
    dataset_COMB_OS = wsp.data("dataset_COMB_OS")
    dataset_COMB_OS_dtb = RooDataSet("dataset_COMB_OS_dtb", "Combinatorial shape",dataset_COMB_OS, varset_comb,combination_cut)

    Runs = {}
    
    #Getting list of runs in the workspace
    start = datetime.now()
    for i in range(dataset_COMB_OS_dtb.numEntries()):
        i_runNumber = dataset_COMB_OS_dtb.get(i).getRealValue("runNumber")
        if i_runNumber not in Runs:
            Runs[i_runNumber]=[]
    run_indexing_time = datetime.now()-start
    
    start = datetime.now()
    #Iterating over runs
    for i, i_run in enumerate(Runs):
        #For each run we create a lists of B and D* candidates and match them later using the Fill_shape() function
        signals = {}
        combs = []
        i_dataset_COMB_OS_dtb = RooDataSet("i_dataset_COMB_OS_dtb", "Combinatorial shape",dataset_COMB_OS_dtb, varset_comb,"runNumber=="+str(i_run))
        i_dataset_RS_dtb = RooDataSet("i_dataset_RS_dtb", "Signal shape",dataset_RS, varset, preselection_cut+" && ( runNumber=="+str(i_run)+" )")
        for s_i in range(i_dataset_RS_dtb.numEntries()):        
            signals[str(i_dataset_RS_dtb.get(s_i).getRealValue("LOG_D0_IPCHI2_OWNPV"))+"__"+str(i_dataset_RS_dtb.get(s_i).getRealValue("D0_M"))] = [i_dataset_RS_dtb.get(s_i).getRealValue("LOG_D0_IPCHI2_OWNPV"),i_dataset_RS_dtb.get(s_i).getRealValue("D0_M"), i_dataset_RS_dtb.get(s_i).getRealValue("Dst_DTF_D0_CTAU"), i_dataset_RS_dtb.get(s_i).getRealValue("DTF_D0sPi_M")]
    
Example #7
0
    RooArgSet(*varList),
    RooFit.Import(tree1))

tupleDataSet.Print();

tmt = RooRealVar('tMinusT','tMinusT',0,-maxV,maxV);

#tDataSet = RooDataSet('tDataSet','tDataSet',RooArgSet(tmt,weightvar), RooFit.WeightVar(weightvar));

from ROOT import TH1D

tHist = TH1D('tDataSet','tDataSet',100,-0.3,0.3)#RooArgSet(tmt,weightvar), RooFit.WeightVar(weightvar));

for i in range(tupleDataSet.numEntries()):
    
    tmt.setVal(tupleDataSet.get(i).find('Bs_ct').getValV()-tupleDataSet.get(i).find('Bs_TRUETAU').getValV()*1000.0);
    #tDataSet.add(RooArgSet(tmt,weightvar),tupleDataSet.get(i).find(weightVarName).getValV());
    tHist.Fill(tmt.getValV(),tupleDataSet.get(i).find(weightVarName).getValV());
    #print tupleDataSet.get(i).find(weightVarName).getValV(),"   ",tDataSet.weight()

#tupleDataSet.merge(tDataSet);

tHist.Fit('gaus');

from ROOT import TCanvas
aCanvas = TCanvas();
'''
tDataSet.Print();

tDataSet = tDataSet.reduce("tMinusT<1&&tMinusT>-1");
Example #8
0
        for name2 in funcNames :
            covs[name1][name2]  += ( momCoefs[name1][0]  - funcMeans[name1] ) * ( momCoefs[name2][0]  - funcMeans[name2] )
            covsW[name1][name2] += ( momCoefsW[name1][0] - funcMeans[name1] ) * ( momCoefsW[name2][0] - funcMeans[name2] )

# divide covariance sums by number of entries to get covariances
for name1 in funcNames :
    for name2 in funcNames :
        covs[name1][name2]  /= float(nIters)
        covsW[name1][name2] /= float(nIters)

# print data sets from last iteration
noWeightData.Print()
weightData.Print()
for evIt in range(10) :
    print 'not weighted: %+.2f (%.2f)   weighted: %+.2f (%.2f)'\
         % ( noWeightData.get(evIt).getRealValue('x'), noWeightData.weight(), weightData.get(evIt).getRealValue('x'), weightData.weight() )
print

# print moments from last iteration and computed covariances
maxLenName = max( [ len(name) for name in funcNames ] )
from math import sqrt
def printCovs(covMat) :
    print '  errors:'
    for name in funcNames :
        print ( '  {0:>%ds}:  {1:>7.5f}' % maxLenName ).format( name, sqrt( covMat[name][name] ) )
    print

    print '  correlations:'
    print ' ' * ( maxLenName + 5 ) + '   '.join( '{0:>6s}'.format(name) for name in funcNames )
    for name1 in funcNames :
        corrs = [ ( covMat[name1][name2] / sqrt( covMat[name1][name1] * covMat[name2][name2] ) )\
Example #9
0
def reweigh(target, target_cat, source, source_cat, binning = None):
    cats = {}
    for cat, data, name in [(target_cat, target, 'target_cat'), (source_cat, source, 'source_cat')]:
        if hasattr(cat, '_target_'):
            cat = cat._target_()
        elif type(cat) == str:
            cat_name = cat
            cat = data.get().find(cat_name)
            if not cat:
                data.Print()
                raise RuntimeError('observable or category %s is not present in data' % cat_name)
        if not any([isinstance(cat, t) for t in [RooCategory, RooRealVar]]):
            raise RuntimeError('category must be either a RooRealVar or a RooCategory')
        if isinstance(cat, RooRealVar):
            assert(binning)
            if type(binning) == array:
                binning = RooBinning(len(binning) - 1, binning)
                binning.SetName('reweigh')
            cat.setBinning(binning, 'reweigh')
            cat_name = cat.GetName() + '_cat_' + data.GetName()
            test_cat = data.get().find(cat_name)
            if not test_cat:
                cat = BinningCategory(Name = cat_name, Observable = cat,
                                      Binning = binning, Data = data, Fundamental = True)
            else:
                cat = test_cat
        cats[name] = cat

    target_cat = cats['target_cat']
    source_cat = cats['source_cat']

    print target_cat
    print source_cat
    target_bins = dict([(ct.getVal(), ct.GetName()) for ct in target_cat])
    source_bins = dict([(ct.getVal(), ct.GetName()) for ct in source_cat])
    
    print target_bins
    print source_bins
    
    target_table = target.table(target_cat)
    source_table = source.table(source_cat)
    
    target_table.Print('v')
    source_table.Print('v')
    
    from collections import defaultdict
    reweigh_weights = {}
    for i, l in sorted(target_bins.iteritems()):
        sf = source_table.getFrac(source_bins[i])
        if sf == 0:
            w = 0
        else:
            try:
                w = sf / target_table.getFrac(l)
            except ZeroDivisionError:
                print 'Warning bin %s in wpv_data is 0, setting weight to 0' % l
                w = 0.
        reweigh_weights[i] = w
    
    # RooFit infinity
    from ROOT import RooNumber
    RooInf = RooNumber.infinity()
    from RooFitWrappers import RealVar
    weight_var = RealVar('reweigh_var', MinMax = (RooInf, RooInf))
    
    from ROOT import RooDataSet
    data_name = target.GetName() + 'weight_data'
    from ROOT import RooArgSet
    weight_data = RooDataSet(data_name, data_name, RooArgSet(weight_var))
    weight_var = weight_data.get().find(weight_var.GetName())
    
    for i in range(target.numEntries()):
        r = target.get(i)
        n = target_cat.getIndex()
        w = reweigh_weights[n]
        weight_var.setVal(target.weight() * w)
        weight_data.fill()
    
    target.merge(weight_data)
    target = RooDataSet(target.GetName(), target.GetTitle(), target,
                             target.get(), '', weight_var.GetName())
    
    return target, reweigh_weights
graphHolder.Draw("ap")
graphHolder.GetXaxis().SetLimits(0.0, 0.5)
graphHolder.SetMinimum(0.0)
graphHolder.SetMaximum(0.5)
#graphHolder.Draw("ap")

graphHolder.GetYaxis().SetTitleSize(0.05)
graphHolder.GetXaxis().SetTitleSize(0.05)

leg = TLegend(0.1, 0.7, 0.4, 0.9)
#,"a f*****g header","tlNDC");
ROOT.SetOwnership(leg, False)
#leg.AddEntry(TObject(),"crap");

p0E = pDataSet.meanVar(pDataSet.get().find('p0Var')).getError()
p0V = pDataSet.meanVar(pDataSet.get().find('p0Var')).getValV()
p1E = pDataSet.meanVar(pDataSet.get().find('p1Var')).getError()
p1V = pDataSet.meanVar(pDataSet.get().find('p1Var')).getValV()
etaE = pDataSet.meanVar(pDataSet.get().find('etaAvgVar')).getError()
etaV = pDataSet.meanVar(pDataSet.get().find('etaAvgVar')).getValV()

leg.AddEntry(mistagVsEtaGraph, "data points", "lep")
leg.AddEntry(linFuncList[-1], "linear fit", "l")
leg.AddEntry(None,
             "#bar{p_{0}} = %.4f #pm %.4f" % (sumP0 / numP, sumP0E / numP), "")
leg.AddEntry(None,
             "#bar{p_{1}} = %.4f #pm %.4f" % (sumP1 / numP, sumP1E / numP), "")
leg.AddEntry(
    None, "#LT#eta#GT = %.4f #pm %.4f" % (sumAvgEta / numP, sumAvgEtaE / numP),
    "")
Example #11
0
# create weighted data set
from ROOT import RooProduct, RooArgSet, RooArgList
obsSet = RooArgSet( dataSetAsym.get() )
prodList = RooArgList( obsSet.find('sigWeight') )
if applyPlotWeights : prodList.add( obsSet.find('dilution') )
weightVar = RooProduct( 'weightVar', 'weightVar', prodList )
weightVar = dataSetAsym.addColumn(weightVar)
obsSet.add(weightVar)

from ROOT import RooDataSet
dataSetAsymW = RooDataSet( 'asymDataW', 'asymDataW', obsSet, Import = dataSetAsym, WeightVar = ( 'weightVar', True ) )
del dataSetAsym
ws.put(dataSetAsymW)
del dataSetAsymW
dataSetAsymW = ws['asymDataW']
obsSet = RooArgSet( dataSetAsymW.get() )
dataSetAsymW.Print()

# build PDF
from P2VV.Parameterizations.FullPDFs import Bs2Jpsiphi_RunIAnalysis as PdfConfig
pdfConfig = PdfConfig( RunPeriods = '3fb' )

timeEffFile2011 = dataPath + 'timeAcceptanceFit_2011.root'
timeEffFile2012 = dataPath + 'timeAcceptanceFit_2012.root'
pdfConfig['timeEffHistFiles'].getSettings( [ ( 'runPeriod', 'p2011' ) ] )['file'] = timeEffFile2011
pdfConfig['timeEffHistFiles'].getSettings( [ ( 'runPeriod', 'p2012' ) ] )['file'] = timeEffFile2012
pdfConfig['anglesEffType'] = 'basisSig6'
pdfConfig['angEffMomsFiles'] = dataPath + 'angEffNominalRew_5thOrder.par'
pdfConfig['signalData'] = dataSetAsymW
pdfConfig['readFromWS'] = True
Example #12
0
    varRenamedList += [RooFit.RenameVariable(varName, tupleDict[varName])]
    #RooFit.RenameVariable(varName, tupleDict[varName]);
    #varList[i].SetName(tupleDict.keys()[i]);
'''
for i in range(len(tupleDict)):
    varList[i].Print()
'''

#def test(a,b,c,d):
#    print "Yes"

#test(*(tupleDict.keys()))

tupleDataSet = RooDataSet("treeData", "treeData", tree1, RooArgSet(*varList))

tupleDataSet.get().find(varName).Print()

for i in range(len(tupleDict)):
    varName = tupleDict.keys()[i]
    a = tupleDataSet.get().find(varName)
    a.SetName(tupleDict[varName])
    a.SetTitle(tupleDict[varName])

tupleDataSet.get().find("SSKaon").SetMaximum(2)
tupleDataSet.get().find("SSKaon").SetMinimum(-2)

aFrame = tupleDataSet.get().find("SSKaon").frame()
tupleDataSet.get().find("SSKaon").Print()
tupleDataSet.plotOn(aFrame)

aFrame.Draw()
Example #13
0
    #keyList.At(0).ReadObj().Print();
    #keyList.At(1).ReadObj().Print();
    #tupleDataSet = rootInFile.Get('treeData');

    in_file = TFile('../BsStuff.root')
    tupleDataSet = in_file.Get('tupleDataSet')

    #aCanvas = TCanvas();
    #qtFrame = tupleDataSet.get().find('Bs_TAGDECISION_OS').frame();
    #tupleDataSet.add
    #tupleDataSet.Print();
    '''
    for i in tupleDataSet.numEntries():
        tupleDataSet.get(i).find('Bs_TAGDECISION_OS').getVal
    '''
    tupleDataSet.get().find('Bs_TAGDECISION_OS').Print()
    #tupleDataSet.plotOn(qtFrame, RooFit.DrawOption('b'));
    #qtFrame.Draw();
    #raw_input();

    in_file.Close()
    del in_file
    #sys.exit(0);

    tupleDict = importTupleDict(tupleDictFilename)

    print tupleDict.keys()
    #sys.exit(0);

    varList = []
    varRenamedList = []
Example #14
0
def correctWeights( dataSet, splitCatNames, **kwargs ) :
    """correct weights in dataSet for background dilution
    """

    if splitCatNames :
        # get category that splits data sample
        if type(splitCatNames) == str : splitCatNames = [ splitCatNames ]
        if len(splitCatNames) == 1 :
            splitCat = dataSet.get().find( splitCatNames[0] )
            assert splitCat, 'P2VV - ERROR: correctWeights: unknown split category: "%s"' % splitCatNames[0]

        else :
            from ROOT import RooArgSet
            catSet = RooArgSet()
            for catName in splitCatNames :
                cat = dataSet.get().find(catName)
                assert cat, 'P2VV - ERROR: correctWeights: unknown split category: "%s"' % catName
                catSet.add(cat)

            from ROOT import RooSuperCategory
            splitCat = RooSuperCategory( 'splitCat', 'splitCat', catSet)

        indexDict = { }
        for iter, catType in enumerate( splitCat ) : indexDict[ iter ] = ( catType.GetName(), catType.getVal() )

    # get variable that contains original event weights
    origWeightVar = None
    origWeightName = kwargs.pop( 'WeightName', '' )
    if origWeightName :
        origWeightVar = dataSet.get().find(origWeightName)
        from ROOT import RooAbsReal
        assert origWeightVar and isinstance( origWeightVar, RooAbsReal )\
               , 'P2VV - ERROR: correctWeights: unknown weight variable: "%s"' % origWeightName

    corrFactors = kwargs.pop( 'CorrectionFactors', [ ] )
    if not corrFactors :
        if splitCatNames :
            # initialize sums for the weights and the weights squared per category
            sumWeights   = [ 0. ] * ( splitCat.numTypes() + 1 )
            sumSqWeights = [ 0. ] * ( splitCat.numTypes() + 1 )
            posDict = { }
            for iter, catType in enumerate( splitCat ) : posDict[ catType.getVal() ] = iter

        else :
            # initialize sums for the weights and the weights squared
            sumWeights   = [ 0. ]
            sumSqWeights = [ 0. ]

        # loop over events and get sums of weights and weights squared
        for varSet in dataSet :
            weight = origWeightVar.getVal() if origWeightVar else dataSet.weight()
            sumWeights[0]   += weight
            sumSqWeights[0] += weight**2
            if splitCatNames :
                sumWeights[   posDict[ splitCat.getIndex() ] + 1 ] += weight
                sumSqWeights[ posDict[ splitCat.getIndex() ] + 1 ] += weight**2

        # get correction factors
        corrFactors = (  ( sumWeights[0] / sumSqWeights[0], sumWeights[0] )
                       , [ ( sum / sumSq, sum ) for sum, sumSq in zip( sumWeights[ 1 : ], sumSqWeights[ 1 : ] ) ]
                      )

    # add corrected weights to data set
    from P2VV.Load import P2VVLibrary
    from ROOT import RooCorrectedWeight
    if splitCatNames :
        from ROOT import std
        corrFactorsVec = std.vector('Double_t')()
        print 'P2VV - INFO: correctWeights: multiplying sWeights (-ln(L)) to correct for background dilution with factors (overall factor %.4f for %.1f events):'\
              % corrFactors[0]
        maxLenStateName = max( len( ind[0] ) for ind in indexDict.values() )
        for iter, fac in enumerate( corrFactors[1] ) :
            corrFactorsVec.push_back( fac[0] )
            print ( '    {0:%ds} : {1:.4f} (events: {2:.1f})' % maxLenStateName ).format( indexDict[iter][0], fac[0], fac[1] )

        if origWeightVar :
            weightVar = RooCorrectedWeight( 'weightVar', 'weight variable', origWeightVar, splitCat, corrFactorsVec )
        else :
            weightVar = RooCorrectedWeight( 'weightVar', 'weight variable', dataSet, splitCat, corrFactorsVec )

    else :
        print 'P2VV - INFO: correctWeights: multiplying sWeights (-ln(L)) to correct for background dilution with a factor %.4f for %.1f events'\
              % corrFactors[0]
        if origWeightVar :
            weightVar = RooCorrectedWeight( 'weightVar', 'weight variable', origWeightVar, corrFactors[0][0] )
        else :
            weightVar = RooCorrectedWeight( 'weightVar', 'weight variable', dataSet, corrFactors[0][0] )

    from ROOT import RooDataSet
    dataSet.addColumn(weightVar)
    dataSet = RooDataSet( dataSet.GetName() + '_corrErrs', dataSet.GetTitle() + ' corrected errors', dataSet.get()
                         , Import = dataSet, WeightVar = ( 'weightVar', True ) )

    importIntoWS = kwargs.pop( 'ImportIntoWS', True )
    if importIntoWS :
        # import data set into current workspace
        from P2VV.RooFitWrappers import RooObject
        return RooObject().ws().put( dataSet, **kwargs )
    else :
        return dataSet
Example #15
-1
def getData(workspace,
            mean1 = 1., sigma1 = 0.01,
            mean2 = 1., sigma2 = 0.01, nevents = 5000):

    ## Make a local workspace to use as a factory.
    w = RooWorkspace('w', 'w')

    ## Define the PDF's for m, f1 and f2 in m*sqrt(f1*f2)
    mPdf = w.factory("BreitWigner::mPdf(m[50,130], MZ[91.12], GammaZ[2.5])")
    f1Pdf = w.factory("Gaussian::f1Pdf(f1[0.5, 2], mean1[%f], sigma1[%f])" %
                      (mean1, sigma1))
    f2Pdf = w.factory("Gaussian::f2Pdf(f2[0.5, 2], mean2[%f], sigma2[%f])" %
                      (mean2, sigma2))

    ## Import the PDF's in the given workspace.
    workspace.Import(mPdf, RenameAllVariables("True"))
    workspace.Import(f1Pdf, RenameAllVariables("True"))
    workspace.Import(f2Pdf, RenameAllVariables("True"))

    ## Generate samples of M, F1 and F2 with a 10% margin for boundaries.
    moreEvents = int(2*nevents)
    mData = mPdf.generate(RooArgSet(w.var("m")), moreEvents, NumCPU(3))
    f1Data = f1Pdf.generate(RooArgSet(w.var("f1")), moreEvents, NumCPU(3))
    f2Data = f2Pdf.generate(RooArgSet(w.var("f2")), moreEvents, NumCPU(3))

    ## Create the new data with toy reco mass
    data = RooDataSet('data', 'toy reco Z->ll mass data',
                      RooArgSet(w.factory('mass[40,140]')))
    entry = data.get()

    ## Loop over the generated values and fill the new reco mass data.
    for i in range(moreEvents):
        ## Do we have enough entries already?
        if data.sumEntries() >= nevents:
            break
        ## Get the values of the random variables m, f1, f2.
        m  = mData.get(i).first().getVal()
        f1 = f1Data.get(i).first().getVal()
        f2 = f2Data.get(i).first().getVal()
        ## Here comes the formula!!
        mass = m * sqrt(f1*f2)
        ## Is the reco mass within its range?
        if 60. < mass and mass < 120.:
            ## Add the reco mass to the data
            entry.first().setVal(mass)
            data.addFast(entry)
    ## End of loop over the generated values
            
    workspace.Import(data)
    return data