Hello everybody. I’m a beginner with ROOT and I can’t do what my internship supervisor asks me. I have several root files each containing a tree. I perform a loop on these files in order to draw two different graphs (one for the neutrons and the other for the gammas) for each of these files and to trace them on two different canvases (one bringing together the histograms of the neutrons and the other that of gammas). But when I try the code below it returns two empty canvases, which doesn’t interest me. So I was wondering if you knew how to fix this problem.
// Liste des fichiers
std::vector files = {“RAW187OS_treeFF01.root”, “RAW173OS_treeFF01.root”, “RAW158OS_treeFF01.root”, “RAW148OS_treeFF01.root”};
// Liste des labels pour chaque histogramme
std::vector labels = {“E_{beam} = 187 MeV”, “E_{beam} = 173 MeV”, “E_{beam} = 158 MeV”, “E_{beam} = 148 MeV”};
//Création de 2 histogrammes un pour les neutrons et un pour les gammas
THStack *histogram_neutron = new THStack(“histogram_neutron”,“Os, for neutron;Number of detector;Number of event”);
THStack *histogram_gamma = new THStack(“histogram_gamma”,“Os, for gamma;Number of detector;Number of event”);
// Create a canvas to draw the histogram
TCanvas *canvas1 = new TCanvas(“canvas1”, “Canvas for neutrons histograms”, 800, 600);
TCanvas *canvas2 = new TCanvas(“canvas2”, “Canvas for gammas histograms”, 800, 600);
for (int k = 0; k <= 3 ; ++k) {
const auto& fileName = files[k];
const auto& labelName = labels[k];
TFile f{fileName};
std::unique_ptr tv__tree{f.Get(“Analysis_All”)};
//Création de l'histogramme
TH1F *histogram_n = new TH1F("histogram_n", labelName, 33, 0, 33);
TH1F *histogram_g = new TH1F("histogram_g", labelName, 33, 0, 33);
// Lier les variables de l'arbre aux variables locales
UShort_t Psd_All_Shift[34];
Double_t M_Tot[2];
// Définir les adresses des branches
tv__tree->SetBranchAddress("Psd_All_Shift", Psd_All_Shift);
tv__tree->SetBranchAddress("M_Tot", M_Tot);
// Définir les seuils de coupure pour Psd_All_Shift (première composante seulement)
UShort_t seuil_Psd_All_Shift_inf_n = 2550;
UShort_t seuil_Psd_All_Shift_sup_n = 6200;
UShort_t seuil_Psd_All_Shift_inf_g = 550;
UShort_t seuil_Psd_All_Shift_sup_g = 2550;
Double_t seuil_M_Tot_inf = 50;
Double_t seuil_M_Tot_sup = 127;
// Vecteur pour stocker le nombre d'événements dans l'encadrement pour chaque composante
std::vector<int> nb_evenements_par_detecteur_n(34, 0);
std::vector<int> nb_evenements_par_detecteur_g(34, 0);
// Boucle sur les événements pour compter les événements dans l'encadrement pour chaque composante de Psd_All_Shift
for (Long64_t i = 0; i < tv__tree->GetEntriesFast(); ++i) {
tv__tree->GetEntry(i);
int counter_n = 0, counter_g = 0;
// Parcourir toutes les composantes de Psd_All_Shift
for (int j = 0; j < 34; ++j) {
UShort_t Psd_All_Shift_j = Psd_All_Shift[j];
if (Psd_All_Shift_j > seuil_Psd_All_Shift_inf_n && Psd_All_Shift_j < seuil_Psd_All_Shift_sup_n && M_Tot[0] > seuil_M_Tot_inf && M_Tot[0] < seuil_M_Tot_sup && M_Tot[1] > seuil_M_Tot_inf && M_Tot[1] < seuil_M_Tot_sup) {
++counter_n;
} else if (Psd_All_Shift_j > seuil_Psd_All_Shift_inf_g && Psd_All_Shift_j < seuil_Psd_All_Shift_sup_g && M_Tot[0] > seuil_M_Tot_inf && M_Tot[0] < seuil_M_Tot_sup && M_Tot[1] > seuil_M_Tot_inf && M_Tot[1] < seuil_M_Tot_sup) {
++counter_g;
}
}
if (counter_n == 0) {
nb_evenements_par_detecteur_n[0] = nb_evenements_par_detecteur_n[0] + 1;
} else if (counter_n != 0) {
nb_evenements_par_detecteur_n[counter_n] = nb_evenements_par_detecteur_n[counter_n] + 1;
}
histogram_n->Fill(counter_n);
if (counter_g == 0) {
nb_evenements_par_detecteur_g[0] = nb_evenements_par_detecteur_g[0] + 1;
} else if (counter_g != 0) {
nb_evenements_par_detecteur_g[counter_g] = nb_evenements_par_detecteur_g[counter_g] + 1;
}
histogram_g->Fill(counter_g);
}
histogram_neutron->Add(histogram_n);
histogram_neutron->Draw("nostack hist");
histogram_gamma->Add(histogram_g);
histogram_gamma->Draw("nostack hist");
}
// Add grid to the canva
canvas1->SetGrid();
canvas1->SetLogy();
canvas2->SetGrid();
canvas2->SetLogy();
// Draw the histogram
canvas1->BuildLegend();
canvas2->BuildLegend();
// Show the canvas
canvas1->Draw();
canvas2->Draw();