#include #include #include #include #include #include #include #include #include using namespace std; void plotParticleMomenta(TString filename, TString pdfname, TString particle, Double_t xmin = 0, Double_t xmax = 0) { // TFile* file = TFile::Open(filename + ".root", "read"); TFile *file = new TFile(filename + ".root", "read"); if (!file || file->IsZombie()) { cerr << "Error: Could not open file!" << endl; return; } TTree *tree = (TTree *)file->Get("Basic"); if (!tree) { cerr << "Error: Could not find TTree 'Basic'!" << endl; file->Close(); return; } const Int_t kMaxLen = 256; Char_t name[kMaxLen]; Double_t momentum; tree->SetBranchAddress("name", name); tree->SetBranchAddress("momentum", &momentum); TH1D *hist = new TH1D(particle, particle + "Momentum Distribution", 100, xmin, xmax); hist->SetTitle(particle + ";Momentum [MeV/c];Count"); hist->GetXaxis()->CenterTitle(); hist->GetXaxis()->SetTitleSize(0.05); hist->GetXaxis()->SetTitleOffset(1); hist->GetYaxis()->CenterTitle(); hist->GetYaxis()->SetTitleSize(0.05); hist->GetYaxis()->SetTitleOffset(1); Long64_t nEntries = tree->GetEntries(); for (Long64_t i = 0; i < nEntries; i++) { tree->GetEntry(i); TString sname(name); if (sname == particle) { hist->Fill(momentum); } } file->Close(); // close the file here lead to segmentation violation TCanvas *canvas = new TCanvas("canvas", particle, 800, 600); hist->Draw(); canvas->Print(pdfname + ".pdf"); delete hist; // file->Close(); delete canvas; } void get_particle() { TString pdfname = "ParticleMomenta"; TCanvas ctemp("temp"); ctemp.Print(pdfname + ".pdf["); plotParticleMomenta("Be_500MeVu_Fe_tower", pdfname, "e-", 0, 1); ctemp.Print(pdfname + ".pdf]"); }