def _generate(self): spectrum = spectrum_util.default_energy() for energy_bin in range(1, spectrum.GetNbinsX() + 1): T = spectrum.GetBinCenter(energy_bin) Ne = 3.28229 - 0.219904 * T + 0.00981048 * T**2 - 0.0105927 * T**3 + 0.00151589 * T**4 - 7.66537e-05 * T**5 + 1.31912e-06 * T**6 spectrum.SetBinContent(energy_bin, Ne) spectrum.Scale(1.0 / spectrum.GetSumOfWeights()) spectrum.SetName(self.get_name()) return spectrum
def _generate(self): spectrum = spectrum_util.default_energy() for energy_bin in range(1, spectrum.GetNbinsX() + 1): T = spectrum.GetBinCenter(energy_bin) Ne = 0 if T <= 0.65 + spectrum.GetBinWidth(energy_bin): Ne = 3439.38 - 1531.56 * T + 654.453 * T**2 spectrum.SetBinContent(energy_bin, Ne) spectrum.Scale(1.0 / spectrum.GetSumOfWeights()) spectrum.SetName(self.get_name()) return spectrum
def _generate(self): spectrum = spectrum_util.default_energy() for energy_bin in range(1, spectrum.GetNbinsX() + 1): T = spectrum.GetBinCenter(energy_bin) Ne = 0 if T <= 1.2 + spectrum.GetBinWidth(energy_bin): Ne = 100 - 23.85 * T + 6.84 * T**2 spectrum.SetBinContent(energy_bin, Ne) spectrum.Scale(1.0 / spectrum.GetSumOfWeights()) spectrum.SetName(self.get_name()) return spectrum
def neutrinoless_double_beta(q, probability): """ Return a neutrinoless double beta spectrum of probability.""" spectrum = spectrum_util.default_energy() for energy_bin in range(1, spectrum.GetNbinsX() + 1): T = spectrum.GetBinCenter(energy_bin) Ne = 0 # Delta function at end point if math.fabs(T - q) < spectrum.GetBinWidth(energy_bin): Ne = 1 spectrum.SetBinContent(energy_bin, Ne) spectrum.Scale(probability / spectrum.GetSumOfWeights()) return spectrum
def alpha(q_alpha, probability): """ Return an alpha spectrum of probability.""" q_alpha = q_alpha / alpha_util.quenching_factor(q_alpha) # Quench the alpha energy spectrum = spectrum_util.default_energy() for energy_bin in range(1, spectrum.GetNbinsX() + 1): T = spectrum.GetBinCenter(energy_bin) Ne = 0 # Delta function at end point if math.fabs(T - q_alpha) < spectrum.GetBinWidth(energy_bin): Ne = 1 spectrum.SetBinContent(energy_bin, Ne) spectrum.Scale(probability / spectrum.GetSumOfWeights()) return spectrum
def _generate(self): spectrum = spectrum_util.default_energy() for energy_bin in range(1, spectrum.GetNbinsX() + 1): T = spectrum.GetBinCenter(energy_bin) Ne = 0 if T <= 1.0 + spectrum.GetBinWidth(energy_bin): Ne = 382.649 - 191.188 * T - 459.082 * T**2 + 307.816 * T**3 elif T <= 1.5 + spectrum.GetBinWidth(energy_bin): Ne = 332.084 - 423.353 * T + 134.585 * T**2 spectrum.SetBinContent(energy_bin, Ne) spectrum.Scale(1.0 / spectrum.GetSumOfWeights()) spectrum.SetName(self.get_name()) return spectrum
def beta(q_beta, probability): """ Return a beta spectrum of probability.""" spectrum = spectrum_util.default_energy() for energy_bin in range(1, spectrum.GetNbinsX() + 1): T = spectrum.GetBinCenter(energy_bin) Ne = 0 if T <= q_beta + spectrum.GetBinWidth(energy_bin): bin_fraction = 1.0 # Fraction of bin to fill if T > q_beta: # Allow for bin widths bin_fraction = 1.0 - (T - q_beta) / spectrum.GetBinWidth(energy_bin) T = q_beta Ne = bin_fraction * math.sqrt(T**2 + 2 * T * constants.me) * (q_beta - T)**2 * (T + constants.me) spectrum.SetBinContent(energy_bin, Ne) spectrum.Scale(probability / spectrum.GetSumOfWeights()) return spectrum
def double_beta(q, probability): """ Return a double beta spectrum of probability.""" spectrum = spectrum_util.default_energy() q = q / constants.me for energy_bin in range(1, spectrum.GetNbinsX() + 1): T = spectrum.GetBinCenter(energy_bin) T = T / constants.me Ne = 0 if T <= q + spectrum.GetBinWidth(energy_bin): binFraction = 1.0 # Fraction of bin to fill if T > q: # Allow for bin widths binFraction = 1.0 - (T - q) / spectrum.GetBinWidth(energy_bin) T = q Ne = binFraction * T * (q - T)**5 * (1 + 2 * T + 4 * T**2 / 3 + T**3 / 3 + T**4 / 30) spectrum.SetBinContent(energy_bin, Ne) spectrum.Scale(probability / spectrum.GetSumOfWeights()) return spectrum
def plot(self, low_energy, high_energy): """ Plot the data.""" ROOT.gROOT.SetStyle("Plain") ROOT.gStyle.SetCanvasBorderMode(0) ROOT.gStyle.SetPadBorderMode(0) ROOT.gStyle.SetPadColor(0) ROOT.gStyle.SetCanvasColor(0) ROOT.gStyle.SetOptTitle(0) ROOT.gStyle.SetLabelSize(0.06, "xyz") ROOT.gStyle.SetTitleSize(0.06, "xyz") ROOT.gStyle.SetOptStat(0) self._canvas = ROOT.TCanvas() self._canvas.Divide(2, 1) # Two columns, separate legend canvas self._legend = ROOT.TLegend(0.05, 0.05, 0.95, 0.95) self._legend.SetFillColor(ROOT.kWhite) self._histograms = [] # All plotted histograms, to store in memory frame = spectrum_util.default_energy() self._histograms.append(frame) vc1 = self._canvas.cd(1) vc1.SetLeftMargin(0.155) vc1.SetBottomMargin(0.15) vc1.SetTopMargin(0.05) vc1.SetRightMargin(0.05) frame.Draw() frame.GetXaxis().SetRangeUser(low_energy, high_energy) frame.GetXaxis().SetTitle("Energy [MeV]") frame.GetXaxis().SetTitleOffset(1.0) frame.GetYaxis().SetTitle("Events per %0.2f MeV" % frame.GetXaxis().GetBinWidth(1)) frame.GetYaxis().SetTitleOffset(1.3) # Create summed background and bg + signal histograms self._summed_bg = spectrum_util.default_energy("Sum BG") self._sum_bg_signal = spectrum_util.default_energy("Sum BG + Signal") maxCounts = 0.0 # For rescaling the histogram axis file = open("Te15load.txt", "w") # file = open("ALL_BG_PU_limited.txt","w") # OUTPUT FOR THE SIGNAL low_energy_FWHM = self._signal.GetXaxis().FindBin(2.485) high_energy_FWHM = self._signal.GetXaxis().FindBin(2.733) # low_energy_PWHM = self._signal.GetXaxis().FindBin(2.529) # high_energy_PWHM = self._signal.GetXaxis().FindBin(2.664) low_energy_per = self._signal.GetXaxis().FindBin(2.492) high_energy_per = self._signal.GetXaxis().FindBin(2.675) Integral_per = self._signal.Integral(low_energy_per, high_energy_per) Integral_FWHM = self._signal.Integral(low_energy_FWHM, high_energy_FWHM) # Integral_PWHM = self._signal.Integral(low_energy_PWHM, high_energy_PWHM) Tot_integral = self._signal.Integral() Weight = self._signal.GetSumOfWeights() print str("!!!!!!!!!ATTENTION!!!!!!!!!!!!") print self._signal print str("Integral BIS MSB FWHM from 2.485 MeV to 2.733 MeV") print Integral_FWHM print str("Integral PERYLENE FWHM from 2.492 MeV to 2.675 MeV") print Integral_per print str("total number of events") print Tot_integral print str("WEIGHTS") print Weight file.write(str("SIGNAL") + "\n") file.write( str("Integral BIS MSB FWHM from 2.485 MeV to 2.733 MeV") + "\n") file.write(str(Integral_FWHM) + "\n") file.write( str("Integral PERYLENE FWHM from 2.492 MeV to 2.675 MeV") + "\n") file.write(str(Integral_per) + "\n") file.write(str("total number of events") + "\n") file.write(str(Tot_integral) + "\n") file.write(str("") + "\n") # THE END OF THE OUTPUT # Draw backgrounds and signal and summed histograms for bg in self._backgrounds: print bg.GetName() hist = bg hist.SetLineWidth(1) hist.Draw("SAME") # THE OUTPUT FOR THE BACKGROUND low_energy_FWHM = hist.GetXaxis().FindBin(2.485) high_energy_FWHM = hist.GetXaxis().FindBin(2.733) # low_energy_PWHM = hist.GetXaxis().FindBin(2.529) # high_energy_PWHM = hist.GetXaxis().FindBin(2.664) Integral_FWHM = hist.Integral(low_energy_FWHM, high_energy_FWHM) # Integral_PWHM = hist.Integral(low_energy_PWHM, high_energy_PWHM) Tot_integral = hist.Integral() Weight = hist.GetSumOfWeights() low_energy_per = hist.GetXaxis().FindBin(2.492) high_energy_per = hist.GetXaxis().FindBin(2.675) Integral_per = hist.Integral(low_energy_per, high_energy_per) print str("!!!!!!!!!ATTENTION!!!!!!!!!!!!") print bg print str("Integral BIS MSB FWHM from 2.485 MeV to 2.733 MeV") print Integral_FWHM print str("Integral PERYLENE FWHM from 2.492 MeV to 2.675 MeV") print Integral_per print str("total number of events") print Tot_integral print str("WEIGHTS") print Weight file.write(str("") + "\n") file.write(str(bg.GetName()) + "\n") file.write( str("Integral BIS MSB FWHM from 2.485 MeV to 2.733 MeV") + "\n") file.write(str(Integral_FWHM) + "\n") file.write( str("Integral PERYLENE FWHM from 2.492 MeV to 2.675 MeV") + "\n") file.write(str(Integral_per) + "\n") file.write(str("total number of events") + "\n") file.write(str(Tot_integral) + "\n") #THE END OF THE OUTPUT hist.SetLineColor(self._colours.get_colour(bg.GetName())) hist.SetLineStyle(self._lines.get_style(bg.GetName())) self._histograms.append(hist) self._summed_bg.Add(hist) # Add to legend if visible in the energy domain countsInDomain = hist.Integral( hist.GetXaxis().FindBin(low_energy), hist.GetXaxis().FindBin(high_energy)) if countsInDomain > 1: self._legend.AddEntry(hist, bg.GetName(), "l") maxCounts = max([maxCounts, countsInDomain]) self._canvas.Update() # Rescale the histogram axis frame.GetYaxis().SetRangeUser(1e-1, maxCounts) # Draw the signal first self._sum_bg_signal.Add(self._summed_bg) self._signal.SetLineColor( self._colours.get_colour(self._signal.GetName())) self._signal.SetLineStyle(self._lines.get_style( self._signal.GetName())) self._signal.SetLineWidth(1) self._signal.Draw("SAME") self._legend.AddEntry(self._signal, self._signal.GetName() + " : Sig", "l") self._histograms.append(self._signal) self._sum_bg_signal.Add(self._signal) # Now draw the summed histograms self._summed_bg.SetLineWidth(2) self._summed_bg.Draw("SAME") print str("Summed_bg") print self._summed_bg.Integral() self._legend.AddEntry(self._summed_bg, "Sum BG", "l") self._sum_bg_signal.SetLineWidth(3) self._sum_bg_signal.SetLineStyle(1) self._sum_bg_signal.Draw("SAME") print str("Sum_bg_signal") print self._sum_bg_signal.Integral() self._legend.AddEntry(self._sum_bg_signal, "Sum BG + Sig", "l") self._canvas.cd(1).SetLogy() self._canvas.cd(2) # Draw the legend on a different canvas self._legend.SetNColumns(self._legend.GetNRows() / 50 + 1) self._legend.Draw() self._canvas.cd() file.close() return self._canvas
def plot(self, low_energy, high_energy): """ Plot the data.""" ROOT.gROOT.SetStyle("Plain") ROOT.gStyle.SetCanvasBorderMode(0) ROOT.gStyle.SetPadBorderMode(0) ROOT.gStyle.SetPadColor(0) ROOT.gStyle.SetCanvasColor(0) ROOT.gStyle.SetOptTitle(0) ROOT.gStyle.SetLabelSize(0.06, "xyz") ROOT.gStyle.SetTitleSize(0.06, "xyz") ROOT.gStyle.SetOptStat(0) self._canvas = ROOT.TCanvas() self._canvas.Divide(2, 1) # Two columns, separate legend canvas self._legend = ROOT.TLegend(0.05, 0.05, 0.95, 0.95) self._legend.SetFillColor(ROOT.kWhite) self._histograms = [] # All plotted histograms, to store in memory frame = spectrum_util.default_energy() self._histograms.append(frame) vc1 = self._canvas.cd(1) vc1.SetLeftMargin(0.155) vc1.SetBottomMargin(0.15) vc1.SetTopMargin(0.05) vc1.SetRightMargin(0.05) frame.Draw() frame.GetXaxis().SetRangeUser(low_energy, high_energy) frame.GetXaxis().SetTitle("Energy [MeV]") frame.GetXaxis().SetTitleOffset(1.0) frame.GetYaxis().SetTitle("Events per %0.2f MeV" % frame.GetXaxis().GetBinWidth(1)) frame.GetYaxis().SetTitleOffset(1.3) # Create summed background and bg + signal histograms self._summed_bg = spectrum_util.default_energy("Sum BG") self._sum_bg_signal = spectrum_util.default_energy("Sum BG + Signal") maxCounts = 0.0 # For rescaling the histogram axis # Draw backgrounds and signal and summed histograms for bg in self._backgrounds: print bg.GetName() hist = bg hist.Draw("SAME") hist.SetLineColor(self._colours.get_colour(bg.GetName())) hist.SetLineStyle(self._lines.get_style(bg.GetName())) self._histograms.append(hist) self._summed_bg.Add(hist) # Add to legend if visible in the energy domain countsInDomain = hist.Integral(hist.GetXaxis().FindBin(low_energy), hist.GetXaxis().FindBin(high_energy)) if countsInDomain > 1: self._legend.AddEntry(hist, bg.GetName(), "l") maxCounts = max([maxCounts, countsInDomain]) self._canvas.Update() # Rescale the histogram axis frame.GetYaxis().SetRangeUser(1e-1, maxCounts) # Draw the signal first self._sum_bg_signal.Add(self._summed_bg) self._signal.SetLineColor(self._colours.get_colour(self._signal.GetName())) self._signal.SetLineStyle(self._lines.get_style(self._signal.GetName())) self._signal.Draw("SAME") self._legend.AddEntry(self._signal, self._signal.GetName() + " : Sig", "l") self._histograms.append(self._signal) self._sum_bg_signal.Add(self._signal) # Now draw the summed histograms self._summed_bg.SetLineWidth(3) self._summed_bg.Draw("SAME") self._legend.AddEntry(self._summed_bg, "Sum BG", "l") self._sum_bg_signal.SetLineWidth(4) self._sum_bg_signal.SetLineStyle(2) self._sum_bg_signal.Draw("SAME") self._legend.AddEntry(self._sum_bg_signal, "Sum BG + Sig", "l") self._canvas.cd(1).SetLogy() self._canvas.cd(2) # Draw the legend on a different canvas self._legend.SetNColumns(self._legend.GetNRows() / 50 + 1) self._legend.Draw() self._canvas.cd() return self._canvas