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)
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)
def Calculate(self): # Calculating Nrejected for positive and negative weighted events for icut in range(0,len(self.Nselected)): if icut==0: self.Nrejected_posweight[icut].mean = self.Ntotal_posweight.mean - self.Nselected_posweight[icut].mean self.Nrejected_negweight[icut].mean = self.Ntotal_negweight.mean - self.Nselected_negweight[icut].mean else: self.Nrejected_posweight[icut].mean = self.Nselected_posweight[icut-1].mean - self.Nselected_posweight[icut].mean self.Nrejected_negweight[icut].mean = self.Nselected_negweight[icut-1].mean - self.Nselected_negweight[icut].mean # Combining negative & positive weight events for computing Nselected, Nrejected and Ntotal self.Ntotal.mean = self.Ntotal_posweight.mean - self.Ntotal_negweight.mean for icut in range(0,len(self.Nselected)): self.Nselected[icut].mean = self.Nselected_posweight[icut].mean - self.Nselected_negweight[icut].mean self.Nrejected[icut].mean = self.Nrejected_posweight[icut].mean - self.Nrejected_negweight[icut].mean # Checking that all numbers are positive : Nselected and Ntotal for icut in range(0,len(self.Nselected)): if self.Nselected[icut].mean<0: self.warnings[icut].append('The number of selected events is negative: '+\ str(self.Nselected[icut].mean)+'. Set to 0.') self.Nselected[icut].mean=0 if self.Nrejected[icut].mean<0: self.warnings[icut].append('The number of rejected events is negative: '+\ str(self.Nrejected[icut].mean)+'. Set to 0.') self.Nrejected[icut].mean=0 # Checking that a N cut i > N cut i+1 : Nselected and Nrejected for icut in range(0,len(self.Nselected)): if icut==0: if self.Nselected[icut].mean > self.Ntotal.mean: self.warnings[icut].append('The number of selected events > the initial number of events : '+str(self.Nselected[icut].mean)+' > '+str(self.Ntotal.mean)+'. Set the number of selected events to 0.') self.Nselected[icut].mean=0 else: if self.Nselected[icut].mean > self.Nselected[icut-1].mean: self.warnings[icut].append('The number of selected events > the initial number of events : '+str(self.Nselected[icut].mean)+' > '+str(self.Nselected[icut-1].mean)+'. Set the number of selected events to 0.') self.Nselected[icut].mean=0 # Calculating errors on Naccepted and Nrejected for icut in range(0,len(self.Nselected)): self.Nselected[icut].error = Measure.binomialNEventError(self.Nselected[icut].mean,self.Ntotal.mean) self.Nrejected[icut].error = Measure.binomialNEventError(self.Nrejected[icut].mean,self.Ntotal.mean) # efficiency calculation and its error for icut in range(0,len(self.Nselected)): if icut==0: if self.Ntotal.mean==0: self.eff[icut].mean = 0 else: self.eff[icut].mean = float(self.Nselected[icut].mean) / \ float(self.Ntotal.mean) self.eff[icut].error = Measure.binomialError(self.Nselected[icut].mean,self.Ntotal.mean) else: if self.Nselected[icut-1].mean==0: self.eff[icut].mean = 0 else: self.eff[icut].mean = float(self.Nselected[icut].mean) / \ float(self.Nselected[icut-1].mean) self.eff[icut].error = Measure.binomialError(self.Nselected[icut].mean,self.Nselected[icut-1].mean) if self.Ntotal.mean==0: self.effcumu[icut].mean=0 else: self.effcumu[icut].mean = float(self.Nselected[icut].mean) / \ float(self.Ntotal.mean) self.effcumu[icut].error = Measure.binomialError(self.Nselected[icut].mean,self.Ntotal.mean) # Getting xsection xsection = self.dataset.measured_global.xsection xerror = self.dataset.measured_global.xerror if self.dataset.xsection!=0.: xsection=self.dataset.xsection xerror=0 # Saving ntotal ntot = 0.+self.Ntotal.mean # Scaling Ntotal if self.main.normalize == NormalizeType.LUMI: self.Ntotal.error = xerror * self.main.lumi * 1000 self.Ntotal.mean = xsection * self.main.lumi * 1000 elif self.main.normalize == NormalizeType.LUMI_WEIGHT: self.Ntotal.error = xerror * self.main.lumi * 1000 * \ self.dataset.weight self.Ntotal.mean = xsection * self.main.lumi * 1000 * \ self.dataset.weight # Scaling Nselected for icut in range(0,len(self.Nselected)): if self.main.normalize == NormalizeType.LUMI: # error due to xsec if ntot!=0: errXsec = xerror * self.main.lumi * 1000 * self.Nselected[icut].mean / ntot else: errXsec=0 # scale factor if ntot!=0: factor = xsection * self.main.lumi * 1000 / ntot else: factor = 0 self.Nselected[icut].mean *= factor self.Nselected[icut].error = Measure.binomialNEventError(self.Nselected[icut].mean,self.Ntotal.mean) # compute final error self.Nselected[icut].error = sqrt(\ self.Nselected[icut].error**2 + errXsec**2) elif self.main.normalize == NormalizeType.LUMI_WEIGHT: # error due to xsec if ntot!=0: errXsec = xerror * self.main.lumi * 1000 * self.dataset.weight * self.Nselected[icut].mean / ntot else: errXsec=0 # scale factor if ntot!=0: factor = xsection * self.main.lumi * self.dataset.weight * 1000 / ntot else: factor = 0 self.Nselected[icut].mean *= factor self.Nselected[icut].error = Measure.binomialNEventError(self.Nselected[icut].mean,self.Ntotal.mean) # compute final error self.Nselected[icut].error = sqrt(\ self.Nselected[icut].error**2 + errXsec**2) # Scaling Nrejected for icut in range(0,len(self.Nrejected)): if self.main.normalize == NormalizeType.LUMI: # error due to xsec if ntot!=0: errXsec = xerror * self.main.lumi * 1000 * self.Nrejected[icut].mean / ntot else: errXsec=0 # scale factor if ntot!=0: factor = xsection * self.main.lumi * 1000 / ntot else: factor = 0 self.Nrejected[icut].mean *= factor self.Nrejected[icut].error = Measure.binomialNEventError(self.Nrejected[icut].mean,self.Ntotal.mean) # compute final error self.Nrejected[icut].error = sqrt(\ self.Nrejected[icut].error**2 + errXsec**2) elif self.main.normalize == NormalizeType.LUMI_WEIGHT: # error due to xsec if ntot!=0: errXsec = xerror * self.main.lumi * 1000 * self.dataset.weight * self.Nrejected[icut].mean / ntot else: errXsec=0 # scale factor if ntot!=0: factor = xsection * self.main.lumi * self.dataset.weight * 1000 / ntot else: factor = 0 self.Nrejected[icut].mean *= factor self.Nrejected[icut].error = Measure.binomialNEventError(self.Nrejected[icut].mean,self.Ntotal.mean) # compute final error self.Nrejected[icut].error = sqrt(\ self.Nrejected[icut].error**2 + errXsec**2) # recompute error to efficiency for icut in range(0,len(self.Nselected)): if icut==0: self.eff[icut].error = Measure.binomialError(self.Nselected[icut].mean,self.Ntotal.mean) else: self.eff[icut].error = Measure.binomialError(self.Nselected[icut].mean,self.Nselected[icut-1].mean) self.effcumu[icut].error = Measure.binomialError(self.Nselected[icut].mean,self.Ntotal.mean)
def Calculate(self): myregs = self.main.regions.GetNames() if myregs == []: myregs = ['myregion'] # Calculating Nrejected for positive and negative weighted events for reg in range(len(myregs)): for icut in range(0, len(self.Nselected[reg])): if icut == 0: self.Nrejected_posweight[reg][ icut].mean = self.Ntotal_posweight.mean - self.Nselected_posweight[ reg][icut].mean self.Nrejected_negweight[reg][ icut].mean = self.Ntotal_negweight.mean - self.Nselected_negweight[ reg][icut].mean else: self.Nrejected_posweight[reg][ icut].mean = self.Nselected_posweight[reg][ icut - 1].mean - self.Nselected_posweight[reg][icut].mean self.Nrejected_negweight[reg][ icut].mean = self.Nselected_negweight[reg][ icut - 1].mean - self.Nselected_negweight[reg][icut].mean # Combining negative & positive weight events for computing Nselected, Nrejected and Ntotal self.Ntotal.mean = self.Ntotal_posweight.mean - self.Ntotal_negweight.mean for reg in range(len(myregs)): for icut in range(0, len(self.Nselected[reg])): self.Nselected[reg][icut].mean = self.Nselected_posweight[reg][ icut].mean - self.Nselected_negweight[reg][icut].mean self.Nrejected[reg][icut].mean = self.Nrejected_posweight[reg][ icut].mean - self.Nrejected_negweight[reg][icut].mean # Checking that all numbers are positive : Nselected and Ntotal for reg in range(len(myregs)): for icut in range(0, len(self.Nselected[reg])): if self.Nselected[reg][icut].mean < 0: self.warnings[reg][icut].append('The number of selected events is negative: '+\ str(self.Nselected[reg][icut].mean)+'. Set to 0.') self.Nselected[reg][icut].mean = 0 if self.Nrejected[reg][icut].mean < 0: self.warnings[reg][icut].append('The number of rejected events is negative: '+\ str(self.Nrejected[reg][icut].mean)+'. Set to 0.') self.Nrejected[reg][icut].mean = 0 # Checking that a N cut i > N cut i+1 : Nselected and Nrejected for reg in range(len(myregs)): for icut in range(0, len(self.Nselected[reg])): if icut == 0: if self.Nselected[reg][icut].mean > self.Ntotal.mean: self.warnings[reg][icut].append('The number of selected events > the initial number of events: '+\ str(self.Nselected[reg][icut].mean)+' > '+str(self.Ntotal.mean)+'. Set the number of selected events to 0.') self.Nselected[reg][icut].mean = 0 else: if self.Nselected[reg][icut].mean > self.Nselected[reg][ icut - 1].mean: self.warnings[reg][icut].append('The number of selected events > the initial number of events: '+\ str(self.Nselected[reg][icut].mean)+' > '+str(self.Nselected[reg][icut-1].mean)+'. Set the number of selected events to 0.') self.Nselected[reg][icut].mean = 0 # Calculating errors on Naccepted and Nrejected for reg in range(len(myregs)): for icut in range(0, len(self.Nselected[reg])): self.Nselected[reg][icut].error = Measure.binomialNEventError( self.Nselected[reg][icut].mean, self.Ntotal.mean) self.Nrejected[reg][icut].error = Measure.binomialNEventError( self.Nrejected[reg][icut].mean, self.Ntotal.mean) # efficiency calculation and its error for reg in range(len(myregs)): for icut in range(0, len(self.Nselected[reg])): if icut == 0: if self.Ntotal.mean == 0: self.eff[reg][icut].mean = 0 else: self.eff[reg][icut].mean = float(self.Nselected[reg][icut].mean) / \ float(self.Ntotal.mean) self.eff[reg][icut].error = Measure.binomialError( self.Nselected[reg][icut].mean, self.Ntotal.mean) else: if self.Nselected[reg][icut - 1].mean == 0: self.eff[reg][icut].mean = 0 else: self.eff[reg][icut].mean = float(self.Nselected[reg][icut].mean) / \ float(self.Nselected[reg][icut-1].mean) self.eff[reg][icut].error = Measure.binomialError( self.Nselected[reg][icut].mean, self.Nselected[reg][icut - 1].mean) if self.Ntotal.mean == 0: self.effcumu[reg][icut].mean = 0 else: self.effcumu[reg][icut].mean = float(self.Nselected[reg][icut].mean) / \ float(self.Ntotal.mean) self.effcumu[reg][icut].error = Measure.binomialError( self.Nselected[reg][icut].mean, self.Ntotal.mean) # Getting xsection xsection = self.dataset.measured_global.xsection xerror = self.dataset.measured_global.xerror if self.dataset.xsection != 0.: xsection = self.dataset.xsection xerror = 0 # Saving ntotal ntot = 0. + self.Ntotal.mean # Scaling Ntotal if self.main.normalize == NormalizeType.LUMI: self.Ntotal.error = xerror * self.main.lumi * 1000 self.Ntotal.mean = xsection * self.main.lumi * 1000 elif self.main.normalize == NormalizeType.LUMI_WEIGHT: self.Ntotal.error = xerror * self.main.lumi * 1000 * \ self.dataset.weight self.Ntotal.mean = xsection * self.main.lumi * 1000 * \ self.dataset.weight # Scaling Nselected for reg in range(len(myregs)): for icut in range(0, len(self.Nselected[reg])): if self.main.normalize == NormalizeType.LUMI: # error due to xsec if ntot != 0: errXsec = xerror * self.main.lumi * 1000 * self.Nselected[ reg][icut].mean / ntot else: errXsec = 0 # scale factor if ntot != 0: factor = xsection * self.main.lumi * 1000 / ntot else: factor = 0 self.Nselected[reg][icut].mean *= factor self.Nselected[reg][ icut].error = Measure.binomialNEventError( self.Nselected[reg][icut].mean, self.Ntotal.mean) # compute final error self.Nselected[reg][icut].error = sqrt( self.Nselected[reg][icut].error**2 + errXsec**2) elif self.main.normalize == NormalizeType.LUMI_WEIGHT: # error due to xsec if ntot != 0: errXsec = xerror * self.main.lumi * 1000 * self.dataset.weight * self.Nselected[ reg][icut].mean / ntot else: errXsec = 0 # scale factor if ntot != 0: factor = xsection * self.main.lumi * self.dataset.weight * 1000 / ntot else: factor = 0 self.Nselected[reg][icut].mean *= factor self.Nselected[reg][ icut].error = Measure.binomialNEventError( self.Nselected[reg][icut].mean, self.Ntotal.mean) # compute final error self.Nselected[reg][icut].error = sqrt( self.Nselected[reg][icut].error**2 + errXsec**2) # Scaling Nrejected for reg in range(len(myregs)): for icut in range(0, len(self.Nrejected[reg])): if self.main.normalize == NormalizeType.LUMI: # error due to xsec if ntot != 0: errXsec = xerror * self.main.lumi * 1000 * self.Nrejected[ reg][icut].mean / ntot else: errXsec = 0 # scale factor if ntot != 0: factor = xsection * self.main.lumi * 1000 / ntot else: factor = 0 self.Nrejected[reg][icut].mean *= factor self.Nrejected[reg][ icut].error = Measure.binomialNEventError( self.Nrejected[reg][icut].mean, self.Ntotal.mean) # compute final error self.Nrejected[reg][icut].error = sqrt( self.Nrejected[reg][icut].error**2 + errXsec**2) elif self.main.normalize == NormalizeType.LUMI_WEIGHT: # error due to xsec if ntot != 0: errXsec = xerror * self.main.lumi * 1000 * self.dataset.weight * self.Nrejected[ reg][icut].mean / ntot else: errXsec = 0 # scale factor if ntot != 0: factor = xsection * self.main.lumi * self.dataset.weight * 1000 / ntot else: factor = 0 self.Nrejected[reg][icut].mean *= factor self.Nrejected[reg][ icut].error = Measure.binomialNEventError( self.Nrejected[reg][icut].mean, self.Ntotal.mean) # compute final error self.Nrejected[reg][icut].error = sqrt( self.Nrejected[reg][icut].error**2 + errXsec**2) # recompute error to efficiency for reg in range(len(myregs)): for icut in range(0, len(self.Nselected[reg])): if icut == 0: self.eff[reg][icut].error = Measure.binomialError( self.Nselected[reg][icut].mean, self.Ntotal.mean) else: self.eff[reg][icut].error = Measure.binomialError( self.Nselected[reg][icut].mean, self.Nselected[reg][icut - 1].mean) self.effcumu[reg][icut].error = Measure.binomialError( self.Nselected[reg][icut].mean, self.Ntotal.mean)