예제 #1
0
파일: cutflow.py 프로젝트: rjwang/UserCode
    def CalculateSummary(self, summary, background=True):

        # Ntotal
        summary.Ntotal = Measure()
        for i in range(0, len(self.detail)):
            if background != self.main.datasets[i].background:
                continue
            summary.Ntotal.mean += self.detail[i].Ntotal.mean
            summary.Ntotal.error += self.detail[i].Ntotal.error**2
        summary.Ntotal.error = sqrt(summary.Ntotal.error)

        # Prepare vectors
        for i in range(0, len(self.detail[0].Nselected)):
            summary.Nselected.append(Measure())
            summary.Nrejected.append(Measure())
            summary.eff.append(Measure())
            summary.effcumu.append(Measure())

        # Fill selected and rejected
        for iset in range(0, len(self.detail)):

            if background != self.main.datasets[iset].background:
                continue

            for icut in range(0, len(self.detail[iset].Nselected)):
                summary.Nselected[icut].mean += self.detail[iset].Nselected[
                    icut].mean
                summary.Nrejected[icut].mean += self.detail[iset].Nrejected[
                    icut].mean
                summary.Nselected[icut].error += self.detail[iset].Nselected[
                    icut].error**2
                summary.Nrejected[icut].error += self.detail[iset].Nrejected[
                    icut].error**2
        for icut in range(0, len(self.detail[0].Nselected)):
            summary.Nselected[icut].error = sqrt(summary.Nselected[icut].error)
            summary.Nrejected[icut].error = sqrt(summary.Nrejected[icut].error)

        # Compute efficiencies
        for i in range(0, len(summary.eff)):
            if summary.Ntotal.mean != 0:
                summary.effcumu[i].mean = float(
                    summary.Nselected[i].mean) / float(summary.Ntotal.mean)
                summary.effcumu[i].error = Measure.binomialError(
                    summary.Nselected[i].mean, summary.Ntotal.mean)
            if i == 0:
                if summary.Ntotal.mean != 0:
                    summary.eff[i].mean = float(
                        summary.Nselected[i].mean) / float(summary.Ntotal.mean)
                    summary.eff[i].error = Measure.binomialError(
                        summary.Nselected[i].mean, summary.Ntotal.mean)
            else:
                if summary.Nselected[i - 1].mean != 0:
                    summary.eff[i].mean = float(
                        summary.Nselected[i].mean) / float(
                            summary.Nselected[i - 1].mean)
                    summary.eff[i].error = Measure.binomialError(
                        summary.Nselected[i].mean,
                        summary.Nselected[i - 1].mean)
예제 #2
0
    def Compute(self, s, es, b, eb):

        # Initialization
        value = Measure()

        # Converting in floating value
        S = float(s)
        B = float(b)
        ES = float(es)
        EB = float(eb)

        # Mean value
        try:
            if self.formula == 1:
                value.mean = S / B
            elif self.formula == 2:
                value.mean = S / sqrt(B)
            elif self.formula == 3:
                value.mean = S / (S + B)
            elif self.formula == 4:
                value.mean = S / sqrt(S + B)
            elif self.formula == 5:
                value.mean = S / sqrt(S + B + (self.x * B)**2)
        except ZeroDivisionError:  # division by 0
            value.mean = -1
        except ValueError:  # negative sqrt
            value.mean = -1

        # Error value
        try:
            if self.formula == 1:
                value.error = 1./(B**2)*\
                              sqrt(B**2*ES**2+S**2*EB**2)
            elif self.formula == 2:
                value.error = 1./(S+B)**2*\
                              sqrt(B**2*ES**2+S**2*EB**2)
            elif self.formula == 3:
                value.error = 1./(2*pow(B,3./2.))*\
                              sqrt((2*B)**2*ES**2+S**2*EB**2)
            elif self.formula == 4:
                value.error = 1./(2*pow(S+B,3./2.))*\
                              sqrt((S+2*B)**2*ES**2+S**2*EB**2)
            elif self.formula == 5:
                value.error = 1./(2*pow(S+B+self.x*B**2,3./2.))*\
                             sqrt((S+2*B+2*self.x*B**2)**2*ES**2+S**2*(2*self.x*B+1)**2*EB**2)

        except ZeroDivisionError:  # division by 0
            value.mean = -1
        except ValueError:  # negative sqrt
            value.mean = -1

        return value
    def Initialize(self):
        # Preparing architecture for vectors
        self.Ntotal = Measure()
        self.Ntotal_posweight = Measure()
        self.Ntotal_negweight = Measure()
        self.Ntotal_sumw2 = Measure()
        self.Ntotal_sumw2_posweight = Measure()
        self.Ntotal_sumw2_negweight = Measure()
        myregs = self.main.regions.GetNames()
        myregs.sort()
        if myregs == []:
            myregs = ['myregion']
        for iabscut in range(0, len(self.main.selection)):
            if self.main.selection[iabscut].__class__.__name__ != "Cut":
                continue
            if len(self.main.selection[iabscut].part) != 0:
                continue
            ireg = 0
            for reg in myregs:
                if (reg in self.main.selection[iabscut].regions) or (
                        self.main.regions.GetNames() == []
                        and reg == "myregion"):
                    self.Nselected[ireg].append(Measure())
                    self.Nrejected[ireg].append(Measure())
                    self.Nselected_sumw2[ireg].append(Measure())
                    self.Nrejected_sumw2[ireg].append(Measure())
                    self.Nselected_posweight[ireg].append(Measure())
                    self.Nrejected_posweight[ireg].append(Measure())
                    self.Nselected_negweight[ireg].append(Measure())
                    self.Nrejected_negweight[ireg].append(Measure())
                    self.Nselected_sumw2_posweight[ireg].append(Measure())
                    self.Nrejected_sumw2_posweight[ireg].append(Measure())
                    self.Nselected_sumw2_negweight[ireg].append(Measure())
                    self.Nrejected_sumw2_negweight[ireg].append(Measure())
                    self.eff[ireg].append(Measure())
                    self.effcumu[ireg].append(Measure())
                    self.warnings[ireg].append([])
                ireg += 1

        # Extracting Nselected information
        for reg in range(len(myregs)):
            for icut in range(0, len(self.Nselected[reg])):
                self.Nselected_posweight[reg][icut].mean = self.cuts[reg][
                    icut].sumw_pos
                self.Nselected_negweight[reg][icut].mean = self.cuts[reg][
                    icut].sumw_neg
                self.Nselected_sumw2_posweight[reg][icut].mean = self.cuts[
                    reg][icut].sumw2_pos
                self.Nselected_sumw2_negweight[reg][icut].mean = self.cuts[
                    reg][icut].sumw2_neg

        # Extracting Ntotal
        self.Ntotal_posweight.mean = self.initial.sumw_pos
        self.Ntotal_negweight.mean = self.initial.sumw_neg
        self.Ntotal_sumw2_posweight.mean = self.initial.sumw2_pos
        self.Ntotal_sumw2_negweight.mean = self.initial.sumw2_neg

        return True
예제 #4
0
    def Initialize(self):

        # Preparing architecture for vectors
        self.Ntotal = Measure()
        self.Ntotal_posweight = Measure()
        self.Ntotal_negweight = Measure()
        self.Ntotal_sumw2 = Measure()
        self.Ntotal_sumw2_posweight = Measure()
        self.Ntotal_sumw2_negweight = Measure()
        for iabscut in range(0, len(self.main.selection)):
            if self.main.selection[iabscut].__class__.__name__ != "Cut":
                continue
            self.Nselected.append(Measure())
            self.Nrejected.append(Measure())
            self.Nselected_sumw2.append(Measure())
            self.Nrejected_sumw2.append(Measure())
            self.Nselected_posweight.append(Measure())
            self.Nrejected_posweight.append(Measure())
            self.Nselected_negweight.append(Measure())
            self.Nrejected_negweight.append(Measure())
            self.Nselected_sumw2_posweight.append(Measure())
            self.Nrejected_sumw2_posweight.append(Measure())
            self.Nselected_sumw2_negweight.append(Measure())
            self.Nrejected_sumw2_negweight.append(Measure())
            self.eff.append(Measure())
            self.effcumu.append(Measure())
            self.warnings.append([])

        # Extracting Nselected information
        for icut in range(0, len(self.Nselected)):
            self.Nselected_posweight[icut].mean = self.cuts[icut].sumw_pos
            self.Nselected_negweight[icut].mean = self.cuts[icut].sumw_neg
            self.Nselected_sumw2_posweight[icut].mean = self.cuts[
                icut].sumw2_pos
            self.Nselected_sumw2_negweight[icut].mean = self.cuts[
                icut].sumw2_neg

        # Extracting Ntotal
        self.Ntotal_posweight.mean = self.initial.sumw_pos
        self.Ntotal_negweight.mean = self.initial.sumw_neg
        self.Ntotal_sumw2_posweight.mean = self.initial.sumw2_pos
        self.Ntotal_sumw2_negweight.mean = self.initial.sumw2_neg

        return True
예제 #5
0
파일: cutflow.py 프로젝트: rjwang/UserCode
 def calculateBSratio(self, B, eB, S, eS):
     value = Measure()
     value.mean = self.Mformula.Eval(S, B)
     value.error = self.Eformula.Eval(S, B, eS, eB)
     return value