Ejemplo n.º 1
0
def _doProfile2d( solver, ipar1=0, type1="u", ipar2=1, type2= "m" ):
    from ConstrainedFit import clsq
    from ROOT import TGraph2D, TMarker, gPad
    from array import array
    global tg2d, hist, te1, te2, te3, tm
    par1= clsq.createClsqPar( ipar1, type1, solver )
    par2= clsq.createClsqPar( ipar2, type2, solver )
    parval1, parerr1, name1= _getUMParErrName( par1 )
    parval2, parerr2, name2= _getUMParErrName( par2 )
    print( "\nChi^2 profile plot " + name1 + " - " + name2 + ":" )
    corr= solver.getCorrMatrix()
    icorr1= ipar1
    icorr2= ipar2
    if type1 == "u" or type2 == "u":
        nmpar= len(solver.getMpars())
        if type1 == "u":
            icorr1= nmpar + ipar1
        if type2 == "u":
            icorr2= nmpar + ipar2
    rho= corr[icorr1,icorr2]
    te1= _makeEllipse( parval1, parval2, parerr1, parerr2, rho )
    te2= _makeEllipse( parval1, parval2, 2.0*parerr1, 2.0*parerr2, rho )
    te3= _makeEllipse( parval1, parval2, 3.0*parerr1, 3.0*parerr2, rho )
    ca= clsq.clsqAnalysis( solver )
    points= ca.profile2d( par1, par2 )
    npoints= len(points)
    tg2d= TGraph2D( npoints )
    for i in range( npoints ):
        point= points[i]
        tg2d.SetPoint( i, point[0], point[1], point[2] )
    hist= tg2d.GetHistogram()
    contourlevels= array( "d", [ 1.0, 4.0, 9.0 ] )
    hist.SetContour( 3, contourlevels )
    hist.GetXaxis().SetTitle( name1 )
    hist.GetYaxis().SetTitle( name2 )
    hist.SetTitle( "Triangle fit "+name2+" vs "+name1 )
    hist.Draw( "cont1" )
    tm= TMarker( parval1, parval2, 20 )
    tm.Draw( "s" )
    te1.Draw( "s" )
    te2.Draw( "s" )
    te3.Draw( "s" )
    gPad.Print( "triangle_errorellipse.png" )
    return
Ejemplo n.º 2
0
    def Simulate(self, save=None, draw=None):
        '''

        :param save: if True: saves the root file as well as the true signal distribution
        :param draw: if True draws the signal distribution
        :param ask:
        :return:
        '''

        # Settings:
        MPV = self.MCAttributes['Landau_MPV_bkg']  # background for Landau MPV distribution
        sigma = self.MCAttributes['Landau_Sigma']  # Landau scaling sigma
        NPeaks = self.MCAttributes['NPeaks']
        MCRunPath = self.MCAttributes['MCRunPath'].format(self.RunNumber)
        xmin = self.diamond.Position['xmin'] + 0.01
        xmax = self.diamond.Position['xmax'] - 0.01
        ymin = self.diamond.Position['ymin'] + 0.01
        ymax = self.diamond.Position['ymax'] - 0.01
        center_x = (xmax + xmin) / 2.
        center_y = (ymax + ymin) / 2.
        if draw != None:
            assert (type(draw) == t.BooleanType), "draw has to be boolean type"
            self.MCAttributes['DrawRealDistribution'] = draw
        if save != None:
            assert (type(save) == t.BooleanType), "save argument has to be of type boolean"
            self.MCAttributes['Save'] = save

        def ManualHitDistribution(x, par):
            '''
            Probability density function for hit distribution based on
            6 2d gaussian in a rectangular pattern. The PDF is NOT
            normalized to 1
            :param x: array, x[0]: x position, x[1]: y position
            :param par: parameter array;
            :return:
            '''
            result = 0.1  # bkg
            norm = 1.
            sigma = 0.04
            for i in range(len(par) / 2):
                result += norm * TMath.Gaus(x[0], par[2 * i], sigma) * TMath.Gaus(x[1], par[2 * i + 1], sigma)
            return result

        def CreateRandomPeaksConfig(xmin, xmax, ymin, ymax, bkg=120, peak_height=0.5, npeaks=NPeaks):
            '''
            Creates the input parameters for SignalShape, which describes the peak distribution in the
            Signal distribution
            :param xmin: window parameter
            :param xmax: window parameter
            :param ymin: window parameter
            :param ymax: window parameter
            :param bkg: background of signal response
            :param peak_height: height of one peak in % of bkg, if bkg==0: the peaks heights are set to 1
            :param npeaks: number of peaks in window - if none it picks random between 0 and 15
            :return: array containing the parameters
            '''
            if npeaks == None:
                npeaks = int(round(gRandom.Uniform(0, 15)))

            if self.MCAttributes['SpecialDistribution'] in ["Central", "central"]:
                npeaks = 1
                dxy = 0.02
                parameters = np.zeros(7)
                parameters[0] = npeaks
                parameters[1] = bkg
                parameters[2] = peak_height
                parameters[3] = gRandom.Uniform(center_x - dxy, center_x + dxy)
                parameters[4] = gRandom.Uniform(center_y - dxy, center_y + dxy)
                parameters[5] = gRandom.Uniform(self.MCAttributes['PeakSigmaX_min'], self.MCAttributes['PeakSigmaX_max'])
                parameters[6] = gRandom.Uniform(self.MCAttributes['PeakSigmaY_min'], self.MCAttributes['PeakSigmaY_max'])
            elif self.MCAttributes['SpecialDistribution'] in ["4Peaks", "4peaks", "L", "3Peaks"]:
                npeaks = 4
                dxy = 0.02
                parameters = np.zeros(3 + 4 * npeaks)
                parameters[0] = npeaks
                parameters[1] = bkg
                parameters[2] = peak_height
                # peaks:
                peaknr = 0
                for x in [center_x - 0.07, center_x + 0.07]:
                    for y in [center_y - 0.07, center_y + 0.07]:
                        parameters[3 + 4 * peaknr] = gRandom.Uniform(x - dxy, x + dxy)
                        parameters[4 + 4 * peaknr] = gRandom.Uniform(y - dxy, y + dxy)
                        parameters[5 + 4 * peaknr] = gRandom.Uniform(self.MCAttributes['PeakSigmaX_min'], self.MCAttributes['PeakSigmaX_max'])
                        parameters[6 + 4 * peaknr] = gRandom.Uniform(self.MCAttributes['PeakSigmaY_min'], self.MCAttributes['PeakSigmaY_max'])
                        peaknr += 1
                if self.MCAttributes['SpecialDistribution'] in ["L", "3Peaks"]:
                    npeaks = 3
                    parameters[0] = npeaks
                    parameters = parameters[:3 + 4 * npeaks]
            elif self.MCAttributes['SpecialDistribution'] in ["Testpattern", "testpattern", "Test", "test"]:
                npeaks = 8
                Center_x = gRandom.Uniform(center_x - 0.01, center_x + 0.01)
                Center_y = gRandom.Uniform(center_y - 0.01, center_y + 0.01)
                parameters = np.zeros(3 + 4 * npeaks)
                parameters[0] = npeaks
                parameters[1] = bkg
                parameters[2] = peak_height
                parameters[3] = Center_x - 0.1
                parameters[4] = Center_y + 0.08
                parameters[5] = 0.02
                parameters[6] = 0.02
                parameters[7] = Center_x - 0.04
                parameters[8] = Center_y + 0.08
                parameters[9] = 0.02
                parameters[10] = 0.02
                parameters[11] = Center_x - 0.1
                parameters[12] = Center_y
                parameters[13] = 0.025
                parameters[14] = 0.025
                parameters[15] = Center_x
                parameters[16] = Center_y
                parameters[17] = 0.02
                parameters[18] = 0.02
                parameters[19] = Center_x + 0.1
                parameters[20] = Center_y
                parameters[21] = 0.03
                parameters[22] = 0.03
                parameters[23] = Center_x - 0.04
                parameters[24] = Center_y - 0.06
                parameters[25] = 0.015
                parameters[26] = 0.015
                parameters[27] = Center_x - 0.12
                parameters[28] = Center_y - 0.12
                parameters[29] = 0.03
                parameters[30] = 0.03
                parameters[31] = Center_x + 0.08
                parameters[32] = Center_y - 0.12
                parameters[33] = 0.04
                parameters[34] = 0.04
            else:
                parameters = np.zeros(3 + 4 * npeaks)
                parameters[0] = npeaks
                parameters[1] = bkg
                parameters[2] = peak_height
                for i in range(npeaks):
                    parameters[3 + 4 * i] = gRandom.Uniform(xmin, xmax)
                    parameters[4 + 4 * i] = gRandom.Uniform(ymin, ymax)
                    parameters[5 + 4 * i] = gRandom.Uniform(0.02, 0.07)
                    parameters[6 + 4 * i] = gRandom.Uniform(0.02, 0.07)
            self.MCAttributes['NPeaks'] = npeaks
            return parameters

        def SignalShape(x, par):
            '''

            :param x:   x[0]: x position
                        x[1]: y position
            :param par: par[0]: number of peaks
                        par[1]: mean bkg signal
                        par[2]: peak height in percent of bkg
                        par[3]: peak1 x position
                        par[4]: peak1 y position
                        par[5]: peak1 sigma in x
                        par[6]: peak1 sigma in y
                        ...
                        par[3+4*n]: peakn x position
                        par[4+4*n]: peakn y position
                        par[5+4*n]: peakn sigma in x
                        par[6+4*n]: peakn sigma in y
            :return:
            '''
            norm = par[1] * par[2]
            result = par[1]
            if par[1] == 0:
                norm = 1
            for i in range(int(par[0])):
                result += norm * TMath.Gaus(x[0], par[3 + 4 * i], par[5 + 4 * i]) * TMath.Gaus(x[1], par[4 + 4 * i], par[6 + 4 * i])
            return result

        # Set seed for random number generator:
        today = datetime.today()
        seed = int((today - datetime(today.year, today.month, today.day, 0, 0, 0, 0)).total_seconds() % 1800 * 1e6)
        gRandom.SetSeed(seed)

        # create track_info ROOT file
        if not os.path.exists(MCRunPath):
            os.makedirs(MCRunPath)
        if self.MCAttributes['Save']:
            file = TFile(MCRunPath + 'track_info.root', 'RECREATE')
        self.track_info = TTree('track_info', 'MC track_info')
        track_x = array('f', [0])
        track_y = array('f', [0])
        integral50 = array('f', [0])
        calibflag = array('i', [0])
        calib_offset = array('i', [0])
        time_stamp = array('f', [0])
        self.track_info.Branch('track_x', track_x, 'track_x/F')
        self.track_info.Branch('track_y', track_y, 'track_y/F')
        self.track_info.Branch('integral50', integral50, 'integral50/F')
        self.track_info.Branch('calibflag', calibflag, 'calibflag/I')
        self.track_info.Branch('calib_offset', calib_offset, 'calib_offset/I')
        self.track_info.Branch('time_stamp', time_stamp, 'time_stamp/F')

        # Create Manual Hit Distribution:
        if self.MCAttributes['HitDistributionMode'] == 'Manual':
            dx = 0.08
            dy = 0.07
            f_lateral = TF2('f_lateral', ManualHitDistribution, xmin, xmax, ymin, ymax, 12)
            f_lateral.SetNpx(80)
            f_lateral.SetNpy(80)
            # 6 gaus centers:
            par = np.array([center_x - dx / 2.,  # x1
                            center_y + dy,  # y1
                            center_x + dx / 2.,  # x2
                            center_y + dy,  # y2
                            center_x + dx / 2.,  # x3
                            center_y,  # y3
                            center_x - dx / 2.,  # x4
                            center_y,  # y4
                            center_x - dx / 2.,  # x5
                            center_y - dy,  # y5
                            center_x + dx / 2.,  # x6
                            center_y - dy  # y6
                            ])
            f_lateral.SetParameters(par)
        a = Double()
        b = Double()

        # Generate Signal Distribution:
        if self.MCAttributes['SignalMode'] == 'Landau':
            self.SignalParameters = CreateRandomPeaksConfig(xmin, xmax, ymin, ymax, peak_height=self.MCAttributes['PeakHeight'], bkg=MPV)
        else:
            self.SignalParameters = CreateRandomPeaksConfig(xmin, xmax, ymin, ymax, peak_height=self.MCAttributes['PeakHeight'], bkg=100)
        f_signal = TF2('f_signal', SignalShape, xmin, xmax, ymin, ymax, len(self.SignalParameters))
        f_signal.SetNpx(40)  # Resolution
        f_signal.SetNpy(40)
        f_signal.SetParameters(self.SignalParameters)
        if self.MCAttributes['DrawRealDistribution']:
            canvas = TCanvas('canvas', 'canvas')
            canvas.cd()
            gStyle.SetPalette(55)  # a Rain Bow palette == used.
            gStyle.SetNumberContours(8)
            f_signal.Draw('surf1')
            gPad.Print(MCRunPath + 'RealSignalDistribution.png')
            if self.ShowAndWait:
                answer = input('for data creation, type `yes`: ')
            else:
                answer = 'yes'
        else:
            answer = 'yes'

        # Set the Hit distribution for Manual or Import
        if self.MCAttributes['HitDistributionMode'] == 'Manual':
            HitsTemplate = f_lateral
        elif self.MCAttributes['HitDistributionMode'] == 'Import':
            HitsTemplate = self.counthisto

        mc_start_timestamp = 42.  # arbitrary timestamp for the first MC event
        MCEventDeltaTime = 30. * 60. / 300000.  # 1800s/300000Hits = 0.006s/Hit
        tmp_time = mc_start_timestamp
        # Generate Toy Data:
        if answer == 'yes':
            if self.verbose:
                self.ShowMCConfig()
            self.verbose_print('Creating Toy Data with {0} Hits'.format(self.NumberOfHits))
            integral50_max = self.MCAttributes['integral50_max']  # Maximum of Signal response allowed (data: 500 ?)
            i = 0
            j = 0
            while i < self.NumberOfHits and j < 2 * self.NumberOfHits:
                # Get x and y
                if self.MCAttributes['HitDistributionMode'] == 'Uniform':
                    track_x[0] = gRandom.Uniform(xmin, xmax)
                    track_y[0] = gRandom.Uniform(ymin, ymax)
                else:
                    HitsTemplate.GetRandom2(a, b)
                    track_x[0] = gRandom.Gaus(a, self.MCAttributes['TrackResolution'])  # 0.002 = 20mu track resolution (first guess)
                    track_y[0] = gRandom.Gaus(b, self.MCAttributes['TrackResolution'])

                # Get Signal at x and y
                if self.MCAttributes['SignalMode'] == 'Landau':
                    integral50[0] = gRandom.Landau(f_signal(track_x[0], track_y[0]), sigma)
                else:
                    integral50[0] = gRandom.Gaus(f_signal(track_x[0], track_y[0]), 0.6 * f_signal(track_x[0], track_y[0]) - 33)

                # check if found values fulfill requirements
                if xmin < track_x[0] < xmax and ymin < track_y[0] < ymax and integral50[0] < integral50_max:
                    tmp_time += MCEventDeltaTime
                    time_stamp[0] = tmp_time
                    self.track_info.Fill()
                    self.Data['track_x'].append(track_x[0])
                    self.Data['track_y'].append(track_y[0])
                    self.Data['integral50'].append(integral50[0])
                    i += 1
                j += 1
            if not j < 2 * self.NumberOfHits:  # if too many times requirements were not fulfilled
                assert (False), "Bad MC Parameters"

            # Save root file and true Signal Shape:
            if self.MCAttributes['Save']:
                file.Write()
                f_signal.SaveAs(MCRunPath + 'RealSignalDistribution.root')
                self.verbose_print(MCRunPath + 'track_info.root has been written')
                self.TrackingPadAnalysis['ROOTFile'] = MCRunPath + 'track_info.root'

            # Print Settings of created data:
            if self.verbose:
                print("\nToydata containing {:.0f} peaks generated.".format(self.SignalParameters[0]))
                if self.MCAttributes['SignalMode'] == 'Landau':
                    for i in range(int(self.SignalParameters[0])):
                        x = self.SignalParameters[3 + 4 * i]
                        y = self.SignalParameters[4 + 4 * i]
                        print("Peak {0:.0f} at position: ({1:.3f}/{2:.3f}) with Laundau Response MPV: {3:.2f} Sigma: {4:.1f}".format(i + 1, x, y, f_signal(x, y), sigma))
                else:
                    integral50[0] = gRandom.Gaus(f_signal(track_x[0], track_y[0]), 0.6 * f_signal(track_x[0], track_y[0]) - 33)
                    for i in range(int(self.SignalParameters[0])):
                        x = self.SignalParameters[3 + 4 * i]
                        y = self.SignalParameters[4 + 4 * i]
                        print("Peak {0:.0f} at position: ({1:.3f}/{2:.3f}) with Gaussian Response Mean: {3:.2f} Sigma: {4:.1f}".format(i + 1, x, y, f_signal(x, y), 0.6 * f_signal(x, y) - 33))

            self.DataIsMade = True
            self.verbose_print('Monte Carlo Toy Data created.\n')
Ejemplo n.º 3
0
        N += model[6] / 2.

    Npb = model[6] / model[2]
    Nreco = tmpHist.Integral()
    print model[3], 'Ngen: %i Nreco: %0.0f xsec: %0.4f pb' % (model[6], Nreco, model[2]), \
          'equiv integrated lumi: %0.0f pb^(-1)' % (Npb),
    print 'Nreco/(fb^(-1)): %0.3f' % (Nreco * (1000. / Npb))
    print model[3], 'acceptance x efficiency = %04.3g' % (Nreco / model[6])
    ## print model[3], 'acceptance x efficiency = %04.3g' % (Nreco/N)
    tmpHist.Scale(1000. / Npb, 'width')
    tmpHist.SetLineColor(model[5])
    tmpHist.SetLineWidth(3)

    if model[4] == 'WH':
        HiggsEff = Nreco / N

    hists.append(tmpHist)

f = TFile('Mjj_%s_%iJets_NewPhysics_1fb.root' % (modeString, opts.Nj),
          'recreate')
for hist in hists:
    hist.Print()
    hist.Draw('hist')
    hist.SetXTitle("m_{jj} (GeV)")
    hist.SetYTitle("Arbitrary Units")
    gPad.Update()
    gPad.Print("Mjj_%s_%iJets_%s.pdf" % (modeString, opts.Nj, hist.GetName()))
    gPad.Print("Mjj_%s_%iJets_%s.png" % (modeString, opts.Nj, hist.GetName()))
    hist.Write()
f.Close()
Ejemplo n.º 4
0
fintegral = ratio.createIntegral(RooArgSet(time), 'fullrange').getVal()
hintegral = ratiohist.Integral('width') # has weights, use width
norm = fintegral / hintegral
print '=' * 5, ' Integrals ', '=' * 5
print 'Function integral / histogram integral = %g / %g = %g' % (
    fintegral, hintegral, norm)
ratiohist.Scale(norm)

# make dataset from histogram
ratiodset = RooDataHist('ratiodset', '', RooArgList(time), ratiohist)
ratiodset.Print('v')


## Plot
tframe = time.frame(RooFit.Title('Time acceptance ratio'))
paramset = RooArgSet(rturnon, roffset, rbeta)
ratio.plotOn(tframe, RooFit.VisualizeError(fitresult, paramset, 1, False))
ratio.plotOn(tframe)
ratiodset.plotOn(tframe, RooFit.MarkerStyle(kFullDotMedium))

tframe.Draw()

# Print
if doPrint:
    print 'Plotting to file: plots/DsK_ratio_%s.{png,pdf}' % timestamp
    gPad.Print('plots/DsK_ratio_%s.png' % timestamp)
    gPad.Print('plots/DsK_ratio_%s.pdf' % timestamp)

# NB: Do not close file, otherwise plot disappears
# ffile.Close()