CONEXFile.cc
Go to the documentation of this file.
1 
9 #include <io/CONEXFile.h>
10 #include <io/CONEXStructures.h>
11 #include <io/CONEXIOException.h>
12 
13 #include <evt/Event.h>
14 #include <evt/ShowerSimData.h>
15 #include <evt/DefaultShowerGeometryProducer.h>
16 
17 #include <utl/ErrorLogger.h>
18 #include <utl/AugerUnits.h>
19 #include <utl/SaveCurrentTDirectory.h>
20 
21 #include <cmath>
22 #include <sstream>
23 #include <string>
24 #include <sstream>
25 #include <iostream>
26 #include <iomanip>
27 
28 #include <TFile.h>
29 #include <TTree.h>
30 
31 using namespace io;
32 using namespace evt;
33 using namespace utl;
34 using namespace std;
35 
36 
37 namespace io {
38 
40  {
41  delete fFile;
42  delete fShower;
43  delete fHeader;
44  }
45 
46 
47  CONEXFile::CONEXFile(const std::string& fileName, const Mode mode, utl::Branch* const b) :
48  VEventFile(fileName, mode)
49  {
50  Open(fileName, mode, b);
51  }
52 
53 
54  void
56  {
57  if (fFile) {
58  if (fFile->IsOpen())
59  fFile->Close();
60  delete fFile;
61  fFile = nullptr;
62  delete fShower;
63  fShower = nullptr;
64  delete fHeader;
65  fHeader = nullptr;
66  }
67  }
68 
69 
70  void
71  CONEXFile::Open(const std::string& fileName, const Mode mode, utl::Branch* const /*b*/)
72  {
73  if (fFile)
74  Close();
75 
76  if (mode != eRead) {
77  ostringstream msg;
78  msg << "Cannot open file " << fileName << " - CONEX files are read-only";
79  ERROR(msg);
80  throw CONEXIOException(msg.str());
81  }
82 
83  const SaveCurrentTDirectory save;
84  fFile = TFile::Open(fileName.c_str());
85 
86  if (!fFile) {
87  ostringstream msg;
88  msg << "Cannot open file " << fileName << " - ERROR";
89  ERROR(msg);
90  throw CONEXIOException(msg.str());
91  }
92 
93  if (!fFile->IsOpen()) {
94  ostringstream msg;
95  msg << "Cannot open file " << fileName << " - ERROR";
96  ERROR(msg);
97  throw CONEXIOException(msg.str());
98  }
99 
100  fHeaderTree = (TTree*)fFile->Get("Header");
101  fShowerTree = (TTree*)fFile->Get("Shower");
102 
103  if (!fHeaderTree || !fShowerTree) {
104  ostringstream msg;
105  msg << "Cannot open trees in file " << fileName << " - ERROR";
106  ERROR(msg);
107  throw CONEXIOException(msg.str());
108  }
109 
110  // check CONEX version
111  float version = 0;
112  fHeaderTree->SetBranchAddress("Version", &version);
113  fHeaderTree->GetEntry(0);
114  fHeaderTree->ResetBranchAddresses();
115 
116  // check CXROOT version (more important)
117  fROOTVersion = 0;
118  TBranch* rVbranch = fHeaderTree->GetBranch("OutputVersion");
119  if (rVbranch) {
120  rVbranch->SetAddress(&fROOTVersion);
121  rVbranch->GetEntry(0);
122  }
123  fHeaderTree->ResetBranchAddresses();
124 
125  ostringstream infoVersion;
126  infoVersion << " CONEX version " << version << " Output version " << fROOTVersion;
127  INFO(infoVersion);
128 
129  // read number of slant depth slices
130  if (version > 0 && fROOTVersion < 2.0) {
131  const int nX = int(fHeaderTree->GetMaximum("nX"));
132  if (fHeaderTree->GetMaximum("delX") != fHeaderTree->GetMinimum("delX") ) {
133  const string msg = "Cannot read from merged CONEXFile with different grammage binnings !!!!! Check your CONEX input.";
134  ERROR(msg);
135  throw CONEXIOException(msg);
136  }
137  float grammage[nX];
138  fHeaderTree->SetBranchAddress("X", grammage);
139  for (int iHeader = 0; iHeader < fHeaderTree->GetEntries(); ++iHeader) {
140  fHeaderTree->GetEntry(iHeader);
141  if (!iHeader) {
142  fFirstGrammageBin = grammage[0];
143  } else {
144  if (grammage[0] != fFirstGrammageBin) {
145  const string msg =
146  "Cannot read from merged CONEXFile with incompatible shower content !!!!! "
147  "Check your CONEX merging or don't use merged CONEX files !!!";
148  ERROR(msg);
149  throw CONEXIOException(msg);
150  }
151  }
152  }
153 
154  fHeaderTree->ResetBranchAddresses();
155  fShower = new CONEXShower(nX);
156  MapShower(fROOTVersion);
157  }
158 
159  fHeader = new CONEXHeader();
161  MapHeader(fROOTVersion);
162  fHeaderTree->GetEntry(0);
163  }
164 
165 
166  Status
168  {
169  if (!fFile)
170  return eFail;
171 
172  if (event.HasSimShower()) {
173  ERROR("Event not cleared - has SimShower. Cannot read CONEX.");
174  return eFail;
175  }
176  event.MakeSimShower(DefaultShowerGeometryProducer());
177 
178  if (!fFile->IsOpen() || fCurrentPosition >= (unsigned int)GetNEvents())
179  return eEOF;
180 
181  const int entry = NextEntry();
182 
183  if (fROOTVersion >= 2.0) {
184  int nX_shower = 0;
185  fShowerTree->ResetBranchAddresses();
186  fShowerTree->SetBranchAddress("nX", &nX_shower);
187  fShowerTree->GetEntry(entry);
188  fShowerTree->ResetBranchAddresses();
189  if (!fShower)
190  fShower = new CONEXShower(0);
191  fShower->SetVectorLength(nX_shower);
193  }
194 
195  fShowerTree->GetEntry(entry);
196 
197  ShowerSimData& shower = event.GetSimShower();
200 
202 
203  shower.SetShowerNumber(entry);
204  ostringstream runIdentifier;
205  runIdentifier << "cx_" << fHeader->fVersion
206  << "_" << fHeader->fHighEnergyModel
207  << "_" << fHeader->fSeed;
208  shower.SetShowerRunId(runIdentifier.str());
209 
210  ostringstream info;
211  info << "\n"
212  "\t ----------- CONEX -------------\n"
213  "\t event: " << entry << "\n"
214  "\t xmax/g*cm2: " << shower.GetGHParameters().GetXMax()/g*cm2 << "\n"
215  "\t energy/eV: " << shower.GetEnergy()/eV << "\n"
216  "\t zenith/deg: " << fShower->fZenith << "\n"
217  "\t ----------- CONEX -------------";
218 
219  INFO(info);
220 
222 
223  return eSuccess;
224  }
225 
226 
227  void
228  CONEXFile::Write(const evt::Event& /*event*/)
229  {
230  const string msg = "Cannot write to CONEXFile - read-only file";
231  ERROR(msg);
232  throw CONEXIOException(msg);
233  }
234 
235 
236  Status
237  CONEXFile::FindEvent(const unsigned int eventId)
238  {
239  // CONEX shower don't have event ids
240  return GotoPosition(eventId);
241  }
242 
243 
244  Status
245  CONEXFile::GotoPosition(const unsigned int position)
246  {
247  if (position > (unsigned int)GetNEvents())
248  return eFail;
249  else {
250  fCurrentPosition = position;
251  return eSuccess;
252  }
253  }
254 
255 
256  int
258  {
260  return fCurrentPosition - 1;
261  }
262 
263 
264  int
266  {
267  if (fShowerTree)
268  return fShowerTree->GetEntries();
269  else {
270  const string msg = "Cannot request number of events from NULL tree";
271  ERROR(msg);
272  throw CONEXIOException(msg);
273  }
274  }
275 
276 
277  void
278  CONEXFile::MapHeader(const float /*version*/)
279  {
280  // no version checks yet
281 
282  fHeaderTree->SetBranchAddress("Seed1", &(fHeader->fSeed));
283  fHeaderTree->SetBranchAddress("HEModel", &(fHeader->fHighEnergyModel));
284 
285  fHeaderTree->SetBranchAddress("Particle", &(fHeader->fParticleID));
286  fHeaderTree->SetBranchAddress("hadCut", &(fHeader->fECutHadrons));
287  fHeaderTree->SetBranchAddress("emCut", &(fHeader->fECutEM));
288  fHeaderTree->SetBranchAddress("hadThr", &(fHeader->fEThrHadrons));
289  fHeaderTree->SetBranchAddress("muThr", &(fHeader->fEThrMuons));
290  fHeaderTree->SetBranchAddress("emThr", &(fHeader->fEThrEM));
291  if (fROOTVersion < 2.0)
292  fHeaderTree->SetBranchAddress("delX", &(fHeader->fDelX));
293  else if (fROOTVersion >= 2.5) {
294  fHeaderTree->SetBranchAddress("LEModel", &(fHeader->fLowEnergyModel));
295  fHeaderTree->SetBranchAddress("HiLowEgy", &(fHeader->fHighLowEnergy));
296  fHeaderTree->SetBranchAddress("haCut", &(fHeader->fECutLongProfHadrons));
297  fHeaderTree->SetBranchAddress("muCut", &(fHeader->fECutLongProfMuons));
298  fHeaderTree->SetBranchAddress("elCut", &(fHeader->fECutLongProfElectrons));
299  fHeaderTree->SetBranchAddress("gaCut", &(fHeader->fECutLongProfPhotons));
300  }
301  }
302 
303 
304  void
305  CONEXFile::MapShower(const float /*version*/)
306  {
307  // no version checks yet
308 
309  fShowerTree->SetBranchAddress("lgE", &(fShower->fLogE));
310  fShowerTree->SetBranchAddress("zenith", &(fShower->fZenith));
311  fShowerTree->SetBranchAddress("Xfirst", &(fShower->fXfirst));
312  fShowerTree->SetBranchAddress("X0", &(fShower->fX0));
313  fShowerTree->SetBranchAddress("Xmax", &(fShower->fXmax));
314  fShowerTree->SetBranchAddress("Nmax", &(fShower->fNmax));
315  fShowerTree->SetBranchAddress("p1", &(fShower->fP1));
316  fShowerTree->SetBranchAddress("p2", &(fShower->fP2));
317  fShowerTree->SetBranchAddress("p3", &(fShower->fP3));
318  fShowerTree->SetBranchAddress("chi2", &(fShower->fChi2));
319  fShowerTree->SetBranchAddress("nX", &(fShower->fNX));
320  fShowerTree->SetBranchAddress("N", fShower->fN);
321  fShowerTree->SetBranchAddress("dEdX", fShower->fdEdX);
322  fShowerTree->SetBranchAddress("Mu", fShower->fNmu);
323 
324  if (fROOTVersion >= 1.1) {
325  fShowerTree->SetBranchAddress("Gamma", fShower->fNgam);
326  fShowerTree->SetBranchAddress("Electrons", fShower->fNele);
327  fShowerTree->SetBranchAddress("dMu", fShower->fMuProd);
328  }
329 
330  fShowerTree->SetBranchAddress("EGround", fShower->fGroundEnergy);
331 
332  if (fROOTVersion >= 1.2)
333  fShowerTree->SetBranchAddress("azimuth", &(fShower->fAzimuth));
334 
335  if (fROOTVersion >= 2.0)
336  fShowerTree->SetBranchAddress("X", fShower->fX);
337  }
338 
339 }
const double eV
Definition: GalacticUnits.h:35
Wrapper for CONEX header information.
void Close() override
Definition: CONEXFile.cc:55
Wrapper for CONEX header shower profile data.
CONEXHeader * fHeader
Definition: CONEXFile.h:65
const evt::VGaisserHillasParameter & GetGHParameters() const
Get the Gaisser-Hillas parameters of the shower.
virtual ~CONEXFile()
Definition: CONEXFile.cc:39
Status GotoPosition(const unsigned int position) override
goto by position in the file
Definition: CONEXFile.cc:245
bool HasSimShower() const
void Write(const evt::Event &event) override
Definition: CONEXFile.cc:228
void Open(const std::string &fileName, const Mode mode=eRead, utl::Branch *const b=nullptr) override
Definition: CONEXFile.cc:71
Mode
Available open modes.
Definition: IoCodes.h:16
#define INFO(message)
Macro for logging informational messages.
Definition: ErrorLogger.h:161
CONEXShower * fShower
Definition: CONEXFile.h:64
virtual int NextEntry()
Definition: CONEXFile.cc:257
TFile * fFile
Definition: CONEXFile.h:60
Status FindEvent(const unsigned int eventId) override
seek Event id set cursor there
Definition: CONEXFile.cc:237
TTree * fHeaderTree
Definition: CONEXFile.h:62
Interface class to access Shower Simulated parameters.
Definition: ShowerSimData.h:49
Class representing a document branch.
Definition: Branch.h:107
void MapHeader(const float version)
Definition: CONEXFile.cc:278
Status
Return code for seek operation.
Definition: IoCodes.h:24
float fECutLongProfPhotons
void MapShower(const float version)
Definition: CONEXFile.cc:305
constexpr double g
Definition: AugerUnits.h:200
double GetEnergy() const
Get the energy of the shower primary particle.
Definition: ShowerSimData.h:89
Base for exceptions in the CORSIKA reader.
void FillShowerSimDataFromConex(const CONEXHeader &conexHeader, const CONEXShower &conexShower, evt::ShowerSimData &)
void SetShowerNumber(const int sid)
Definition: ShowerSimData.h:75
unsigned int fCurrentPosition
Definition: CONEXFile.h:72
Status Read(evt::Event &event) override
read current event advance cursor by 1
Definition: CONEXFile.cc:167
float fECutLongProfHadrons
double fFirstGrammageBin
Definition: CONEXFile.h:67
void FillShowerProfileDataFromConex(const CONEXHeader &conexHeader, const CONEXShower &conexShower, const std::vector< io::CONEXLeadingParticles > conexLPvector, const float conexFileVersion, evt::ShowerSimData &, const double xShift=0)
void SetVectorLength(const int n)
float fROOTVersion
Definition: CONEXFile.h:70
void SetShowerRunId(const std::string srid)
Definition: ShowerSimData.h:81
TTree * fShowerTree
Definition: CONEXFile.h:61
#define ERROR(message)
Macro for logging error messages.
Definition: ErrorLogger.h:165
float fGroundEnergy[3]
int GetNEvents() override
Definition: CONEXFile.cc:265
float fECutLongProfElectrons
std::vector< io::CONEXLeadingParticles > fLPvector
Definition: CONEXFile.h:66
constexpr double cm2
Definition: AugerUnits.h:118

, generated on Tue Sep 26 2023.