ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
HistoManager.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file HistoManager.cc
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
28 //
29 //
30 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
32 
33 #include <TH1D.h>
34 #include <TFile.h>
35 #include <TTree.h>
37 
38 #include "HistoManager.hh"
39 #include "G4UnitsTable.hh"
40 
41 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
42 
44 :fRootFile(0),
45  fNtuple1(0), fNtuple2(0),
46  fEabs(0.), fEgap(0.) ,fLabs(0.), fLgap(0.)
47 {
48 
49  // histograms
50  for (G4int k=0; k<kMaxHisto; k++) fHisto[k] = 0;
51 
52  // ntuple
53  fNtuple1 = 0;
54  fNtuple2 = 0;
55 }
56 
57 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
58 
60 {
61  if (fRootFile) delete fRootFile;
62 }
63 
64 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
65 
66 void HistoManager::Book()
67 {
68  // Creating a tree container to handle histograms and ntuples.
69  // This tree is associated to an output file.
70  //
71  G4String fileName = "AnaEx02.root";
72  fRootFile = new TFile(fileName,"RECREATE");
73  if (! fRootFile) {
74  G4cout << " HistoManager::Book :"
75  << " problem creating the ROOT TFile "
76  << G4endl;
77  return;
78  }
79 
80  // id = 0
81  fHisto[0] = new TH1D("EAbs", "Edep in absorber (MeV)", 100, 0., 800*CLHEP::MeV);
82  // id = 1
83  fHisto[1] = new TH1D("EGap", "Edep in gap (MeV)", 100, 0., 100*CLHEP::MeV);
84  // id = 2
85  fHisto[2] = new TH1D("LAbs", "trackL in absorber (mm)", 100, 0., 1*CLHEP::m);
86  // id = 3
87  fHisto[3] = new TH1D("LGap", "trackL in gap (mm)", 100, 0., 50*CLHEP::cm);
88 
89  for ( G4int i=0; i<kMaxHisto; ++i ) {
90  if (! fHisto[i]) G4cout << "\n can't create histo " << i << G4endl;
91  }
92 
93  // create 1st ntuple
94  fNtuple1 = new TTree("Ntuple1", "Edep");
95  fNtuple1->Branch("Eabs", &fEabs, "Eabs/D");
96  fNtuple1->Branch("Egap", &fEgap, "Egap/D");
97 
98  // create 2nd ntuple
99  fNtuple2 = new TTree("Ntuple2", "TrackL");
100  fNtuple2->Branch("Labs", &fLabs, "Labs/D");
101  fNtuple2->Branch("Lgap", &fLgap, "Lgap/D");
102 
103  G4cout << "\n----> Output file is open in " << fileName << G4endl;
104 }
105 
106 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
107 
108 void HistoManager::Save()
109 {
110  if (! fRootFile) return;
111 
112  fRootFile->Write(); // Writing the histograms to the file
113  fRootFile->Close(); // and closing the tree (and the file)
114 
115  G4cout << "\n----> Histograms and ntuples are saved\n" << G4endl;
116 }
117 
118 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
119 
121 {
122  if (ih >= kMaxHisto) {
123  G4cerr << "---> warning from HistoManager::FillHisto() : histo " << ih
124  << " does not exist. (xbin=" << xbin << " weight=" << weight << ")"
125  << G4endl;
126  return;
127  }
128  if (fHisto[ih]) { fHisto[ih]->Fill(xbin, weight); }
129 }
130 
131 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
132 
134 {
135  if (ih >= kMaxHisto) {
136  G4cout << "---> warning from HistoManager::Normalize() : histo " << ih
137  << " does not exist. (fac=" << fac << ")" << G4endl;
138  return;
139  }
140  if (fHisto[ih]) fHisto[ih]->Scale(fac);
141 }
142 
143 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
144 
145 void HistoManager::FillNtuple(G4double energyAbs, G4double energyGap,
146  G4double trackLAbs , G4double trackLGap )
147 {
148  fEabs = energyAbs;
149  fEgap = energyGap;
150  fLabs = trackLAbs;
151  fLgap = trackLGap;
152 
153  if (fNtuple1) fNtuple1->Fill();
154  if (fNtuple2) fNtuple2->Fill();
155 }
156 
157 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
158 
160 {
161  G4cout << "\n ----> print histograms statistic \n" << G4endl;
162  for ( G4int i=0; i<kMaxHisto; ++i ) {
163  TH1D* h1 = fHisto[i];
164  const G4String name = h1->GetName();
165 
166  G4String unitCategory;
167  if (name[0] == 'E' ) unitCategory = "Energy";
168  if (name[0] == 'L' ) unitCategory = "Length";
169 
170  G4cout << name
171  << ": mean = " << G4BestUnit(h1->GetMean(), unitCategory)
172  << " rms = " << G4BestUnit(h1->GetRMS(), unitCategory )
173  << G4endl;
174  }
175 }
176 
177 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......