I am focusing on analyzing the global time to extract both the decay and rise times by applying a bi-exponential fit. However, I am encountering some challenges with the fitting process. Specifically, the chi-squared value of the fit is huge, and the second rise time appears to be shorter than the first.
I am attaching reference images that illustrate the expected data, as well as my current output for your review. Any advice or suggestions on resolving these issues would be greatly appreciated.
This is my code
#include <TTree.h>
#include <TH1F.h>
#include <TCanvas.h>
#include <TF1.h>
#include <TPaveStats.h>
#include <TStyle.h>
#include <iostream>
void GLobalTimeVsPhotonCount() {
// Style settings
gStyle->SetOptStat(0);
gStyle->SetOptFit(1111);
gStyle->SetFitFormat("6.3g");
gStyle->SetStatFormat("6.3g");
// Open file and get tree with error handling
TFile *file = TFile::Open("Outputtest.root");
if (!file || file->IsZombie()) {
std::cerr << "Error: Could not open file." << std::endl;
return;
}
TTree *tree = dynamic_cast<TTree*>(file->Get("Photon_Hit"));
if (!tree) {
std::cerr << "Error: Could not find tree Photon_Hit." << std::endl;
file->Close();
return;
}
// Canvas setup
TCanvas *c1 = new TCanvas("c1", "Time Spectrum", 1200, 800);
c1->SetMargin(0.12, 0.05, 0.12, 0.05);
gPad->SetGridx();
gPad->SetGridy();
gPad->SetLogy();
// Histogram creation and filling
double globalTime;
tree->SetBranchAddress("GlobalTime_ns", &globalTime);
TH1F *hist = new TH1F("hist", "Time Spectrum", 400, -20, 390);
hist->GetXaxis()->SetTitle("Time [ns]");
hist->GetYaxis()->SetTitle("Number of Counts");
hist->SetLineColor(kBlue);
Long64_t nEntries = tree->GetEntries();
for (Long64_t i = 0; i < nEntries; ++i) {
tree->GetEntry(i);
hist->Fill(globalTime);
}
// Single exponential rise and decay fit function
TF1 *fit_func = new TF1("fit_func",
"[0] * (exp(-x/[2]) - exp(-x/[1])) / ([2] - [1])", -20, 400);
// Set parameter names and initialize parameters
fit_func->SetParName(0, "Amplitude");
fit_func->SetParName(1, "#tau_{rise}");
fit_func->SetParName(2, "#tau_{decay}");
double max_val = hist->GetMaximum();
fit_func->SetParameter(0, max_val); // Amplitude
fit_func->SetParameter(1, 7); // tau_rise
fit_func->SetParameter(2, 10); // tau_decay
// Set limits on parameters to reasonable values
fit_func->SetParLimits(0, max_val * 0.1, max_val * 5); // Amplitude
fit_func->SetParLimits(1, 0.5, 10); // tau_rise
fit_func->SetParLimits(2, 10, 100); // tau_decay
// Fit histogram
hist->Fit(fit_func, "REMN");
// Draw the histogram with fit
hist->SetTitle("");
hist->GetXaxis()->SetTitleSize(0.045);
hist->GetYaxis()->SetTitleSize(0.045);
hist->GetXaxis()->SetLabelSize(0.04);
hist->GetYaxis()->SetLabelSize(0.04);
hist->Draw("E1");
fit_func->Draw("same");
// Get fit statistics
double chi2 = fit_func->GetChisquare();
double ndf = fit_func->GetNDF();
double chi2NDF = chi2 / ndf;
double prob = fit_func->GetProb();
// Create TPaveStats box for fit information
TPaveStats *stats = new TPaveStats(0.7, 0.7, 0.95, 0.95, "brNDC");
stats->SetTextColor(kRed);
stats->SetBorderSize(1);
stats->SetFillColor(0);
stats->SetTextAlign(12);
// Add parameter values to stats box
stats->AddText(Form("Amplitude = %.3f #pm %.3f", fit_func->GetParameter(0), fit_func->GetParError(0)));
stats->AddText(Form("#tau_{rise} = %.3f #pm %.3f ns", fit_func->GetParameter(1), fit_func->GetParError(1)));
stats->AddText(Form("#tau_{decay} = %.3f #pm %.3f ns", fit_func->GetParameter(2), fit_func->GetParError(2)));
stats->AddText(Form("Chi2/NDF = %.3f", chi2NDF));
stats->AddText(Form("Fit Probability = %.3g", prob));
stats->Draw();
// Print fit results to console
std::cout << "\nDetailed Fit Results:" << std::endl;
std::cout << "Chi2/NDF = " << chi2NDF << std::endl;
for (int i = 0; i < fit_func->GetNpar(); ++i) {
std::cout << fit_func->GetParName(i) << " = "
<< fit_func->GetParameter(i) << " ± "
<< fit_func->GetParError(i) << std::endl;
}
// Save canvas and fit results
c1->SaveAs("time_spectrum_fit_single_exp_rise_decay.pdf");
file->Close();
delete c1;
}
This is the output image
Thank you in advance, and I look forward to your responses.
ROOT Version: 6.32.04
Platform: 22.04.1-Ubuntu
Compiler: C++