LDMX Software
framework::EventFile Class Reference

This class manages all ROOT file input/output operations. More...

#include <EventFile.h>

Public Member Functions

 EventFile (const framework::config::Parameters &params, const std::string &filename, EventFile *parent, bool isOutputFile, bool isSingleOutput, bool isLoopable)
 Constructor to make a general file.
 
 EventFile (const framework::config::Parameters &param, const std::string &fileName, bool isLoopable)
 Constructor to make a pileup overlay file.
 
 EventFile (const framework::config::Parameters &param, const std::string &fileName, EventFile *parent, bool isSingleOutput=false)
 Class constructor for cloning data from a "parent" file.
 
 EventFile (const framework::config::Parameters &params, const std::string &fileName)
 Class constructor to make a file to read in an event root file.
 
 ~EventFile ()
 Destructor.
 
bool isCorrupted () const
 Check if the file we have is corrupted.
 
void addDrop (const std::string &rule)
 Add a rule for dropping collections from the output.
 
void setupEvent (Event *evt)
 Set an Event object containing the event data to work with this file.
 
void updateParent (EventFile *parent)
 Change pointer to different parent file.
 
EventgetEvent ()
 Get the Event object containing the event data.
 
bool nextEvent (bool storeCurrentEvent=true)
 Prepare the next event.
 
int skipToEvent (int offset)
 Skip events using an offset.
 
void writeRunHeader (ldmx::RunHeader &runHeader)
 Write the run header into the run map.
 
void writeRunTree ()
 Write the map of run headers to the file as a TTree of RunHeader.
 
ldmx::RunHeadergetRunHeaderPtr (int runNumber)
 Update the RunHeader for a given run, if it exists in the input file.
 
ldmx::RunHeadergetRunHeader (int runNumber)
 Get the RunHeader for a given run, if it exists in the input file.
 
const std::string & getFileName ()
 

Private Member Functions

void importRunHeaders ()
 Fill the internal map of run numbers to RunHeader objects from the input file.
 

Private Attributes

Long64_t entries_ {-1}
 The number of entries in the tree.
 
Long64_t ientry_ {-1}
 The current entry in the tree.
 
std::string file_name_
 The file name.
 
bool is_output_file_
 True if file is an output file being written to disk.
 
bool is_single_output_
 True if there is only one output file.
 
bool is_loopable_ {false}
 True if this is an input file with pileup overlay events *‍/.
 
TFile * file_ {nullptr}
 The backing TFile for this EventFile.
 
TTree * tree_ {nullptr}
 The tree with event data.
 
EventFileparent_ {nullptr}
 A parent file containing event data.
 
Eventevent_ {nullptr}
 The object containing the actual event data (trees and branches).
 
std::vector< std::pair< std::string, bool > > pre_clone_rules_
 Pre-clone rules.
 
std::vector< std::string > reactivate_rules_
 Vector of drop rules that have been parsed and need to be used to reactivate these branches on the input tree.
 
std::map< int, std::pair< bool, ldmx::RunHeader * > > run_map_
 Map of run numbers to RunHeader objects.
 

Detailed Description

This class manages all ROOT file input/output operations.

Definition at line 26 of file EventFile.h.

Constructor & Destructor Documentation

◆ EventFile() [1/4]

framework::EventFile::EventFile ( const framework::config::Parameters & params,
const std::string & filename,
EventFile * parent,
bool isOutputFile,
bool isSingleOutput,
bool isLoopable )

Constructor to make a general file.

This is not used directly, but it is called in the more specialised constructors. This method is mainly focused on reducing code copying.

Parameters
[in]paramsThe parameters used to configure this EventFile.
[in]filenamethe name of the file to read/write
[in]parenta pointer to the parent file to copy
[in]isOutputFiletrue if this file is written out
[in]isSingleOutputtrue if only one output file is being written to
[in]isLoopabletrue for an input file where events can be reused

Definition at line 13 of file EventFile.cxx.

16 : file_name_(filename),
17 is_output_file_(is_output_file),
18 is_single_output_(isSingleOutput),
19 is_loopable_(isLoopable),
20 parent_(parent) {
21 if (is_output_file_) {
22 // we are writting out so open the file and make sure it is writable
23 file_ = new TFile(file_name_.c_str(), "RECREATE");
24 if (!file_->IsOpen() or !file_->IsWritable()) {
25 EXCEPTION_RAISE("FileError",
26 "Output file '" + file_name_ + "' is not writable.");
27 }
28
29 // set compression settings
30 // Check out the TFile constructor for explanation of how this integer is
31 // built Short Reference: setting = 100*algorithem + level algorithm = 0
32 // ==> use global default
33 file_->SetCompressionSettings(params.get<int>("compressionSetting", 9));
34
35 if (parent_) {
36 // output file when there are input files
37 // might be drop/keep rules, so we should have these rules to make sure
38 // it works
39
40 // turn everything on
41 // hypothetically could turn everything off? Doesn't work for some
42 // reason?
43 pre_clone_rules_.emplace_back("*", true);
44
45 // except EventHeader (copies over to output)
46 pre_clone_rules_.emplace_back("EventHeader*", true);
47
48 // reactivate all branches so default behavior is drop
49 reactivate_rules_.push_back("*");
50 }
51 } else {
52 // open file with only reading enabled
53 file_ = new TFile(file_name_.c_str());
54 // double check that file is open
55 if (!file_->IsOpen()) {
56 EXCEPTION_RAISE("FileError", "Input file '" + file_name_ +
57 "' is not readable or does not exist.");
58 }
59
60 bool skip_corrupted = params.get<bool>("skipCorruptedInputFiles", false);
61
62 // make sure file is not a zombie file
63 // (i.e. process ended without closing or the file was corrupted some other
64 // way)
65 if (file_->IsZombie()) {
66 if (not skip_corrupted) {
67 EXCEPTION_RAISE("FileError", "Input file '" + file_name_ +
68 "' is corrupted. Framework will not "
69 "attempt to recover this file.");
70 }
71 return;
72 }
73
74 // Get the tree name from the configuration
75 auto tree_name{params.get<std::string>("tree_name")};
76 tree_ = static_cast<TTree *>(file_->Get(tree_name.c_str()));
77 if (!tree_) {
78 if (not skip_corrupted) {
79 EXCEPTION_RAISE("FileError", "File '" + file_name_ +
80 "' does not have a TTree named '" +
81 tree_name + "' in it.");
82 }
83 return;
84 }
85 entries_ = tree_->GetEntriesFast();
86 }
87
89}
TFile * file_
The backing TFile for this EventFile.
Definition EventFile.h:299
Long64_t entries_
The number of entries in the tree.
Definition EventFile.h:281
std::vector< std::pair< std::string, bool > > pre_clone_rules_
Pre-clone rules.
Definition EventFile.h:316
bool is_loopable_
True if this is an input file with pileup overlay events *‍/.
Definition EventFile.h:296
void importRunHeaders()
Fill the internal map of run numbers to RunHeader objects from the input file.
std::string file_name_
The file name.
Definition EventFile.h:287
bool is_single_output_
True if there is only one output file.
Definition EventFile.h:293
EventFile * parent_
A parent file containing event data.
Definition EventFile.h:305
std::vector< std::string > reactivate_rules_
Vector of drop rules that have been parsed and need to be used to reactivate these branches on the in...
Definition EventFile.h:325
bool is_output_file_
True if file is an output file being written to disk.
Definition EventFile.h:290
TTree * tree_
The tree with event data.
Definition EventFile.h:302
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
Definition Parameters.h:78

References entries_, file_, file_name_, framework::config::Parameters::get(), importRunHeaders(), is_output_file_, parent_, pre_clone_rules_, reactivate_rules_, and tree_.

◆ EventFile() [2/4]

framework::EventFile::EventFile ( const framework::config::Parameters & param,
const std::string & fileName,
bool isLoopable )

Constructor to make a pileup overlay file.

This is an additional input file from which collections are pulled to be overlaid with simulated hit collections.

Parameters
[in]paramsThe parameters used to configure this EventFile.
fileNameThe file name.
isLoopabletrue if we want to reset the event counter and keep processing from the start when we hit the end of the event tree in this input file (set in the call in the producer)

Definition at line 91 of file EventFile.cxx.

93 : EventFile(params, filename, nullptr, false, false, isLoopable) {}
EventFile(const framework::config::Parameters &params, const std::string &filename, EventFile *parent, bool isOutputFile, bool isSingleOutput, bool isLoopable)
Constructor to make a general file.
Definition EventFile.cxx:13

◆ EventFile() [3/4]

framework::EventFile::EventFile ( const framework::config::Parameters & param,
const std::string & fileName,
EventFile * parent,
bool isSingleOutput = false )

Class constructor for cloning data from a "parent" file.

This is used for output files when there is an input file. (OR for files with a parent EventFile to clone)

Parameters
[in]paramsThe parameters used to configure this EventFile.
[in]fileNameThe file name.
[in]parentParent file for cloning data tree.
[in]isSingleOutputboolean check if only one output file is being written to

Definition at line 99 of file EventFile.cxx.

102 : EventFile(params, filename, parent, true, isSingleOutput, false) {}

◆ EventFile() [4/4]

framework::EventFile::EventFile ( const framework::config::Parameters & params,
const std::string & fileName )

Class constructor to make a file to read in an event root file.

This constructor just wraps the constructor above and sets the parent to null and the parameters isOutputFile/isSingleOutput to false.

This is used for all input files.

Parameters
[in]paramsThe parameters used to configure this EventFile.
[in]fileNameThe file name.

Definition at line 95 of file EventFile.cxx.

97 : EventFile(params, filename, nullptr, false, false, false) {}

◆ ~EventFile()

framework::EventFile::~EventFile ( )

Destructor.

Make sure to close the file when we destruct

Definition at line 104 of file EventFile.cxx.

104 {
105 // Before an output file, the Event tree needs to be written.
106 if (is_output_file_) {
107 // make sure we are in output file before writing
108 file_->cd();
109 tree_->Write();
110 }
111
112 // Close the file
113 file_->Close();
114}

References file_, is_output_file_, and tree_.

Member Function Documentation

◆ addDrop()

void framework::EventFile::addDrop ( const std::string & rule)

Add a rule for dropping collections from the output.

This needs to be called after setupEvent. This method uses the event to help drop collections.

The rules should be of the following form: <drop,keep, or ignore> exp where exp is an expression that matches the collectionName. ignore ==> any branch with name matching exp is not even read in from the input file (if it exists) keep ==> any branch with name matching exp is read in from the input (if exists) and written to output (if exists) drop ==> any branch with name matching exp is read in from the input (if exists) and NOT written to output

The default behavior for all branches is keep.

ROOT uses the internal TRegexp to match branch names to the passed expression and set the status of the branch (whether it will be read or not). This internal object has different rules than real regular expressions, so it is best to keep it safe and only use asterisks or full names. Additionally, the rules you pass are analyzed in succession, so you can go from something more general to something more specific.

For example to drop all EcalSimHits.* drop EcalSimHits.*

or drop scoring plane collections drop .*ScoringPlane.*

or drop scoring plane collections but keep EcalScoringPlane collection drop .*ScoringPlane.* keep EcalScoringPlane.*

Note
The Event::getImpl overrides any ignore rules for the input file in order to avoid any seg faults. The items accessed will still be dropped.
Parameters
ruleThe rule for dropping collections.

Definition at line 121 of file EventFile.cxx.

121 {
122 int offset;
123 bool is_keep = false, is_drop = false, is_ignore = false;
124 size_t i = rule.find("keep");
125 if (i != std::string::npos) {
126 offset = i + 4;
127 is_keep = true;
128 }
129 i = rule.find("drop");
130 if (i != std::string::npos) {
131 offset = i + 4;
132 is_drop = true;
133 }
134 i = rule.find("ignore");
135 if (i != std::string::npos) {
136 offset = i + 6;
137 is_ignore = true;
138 }
139
140 // more than one of (keep,drop,ignore) was provided => not valid rule
141 if (int(is_keep) + int(is_drop) + int(is_ignore) != 1) return;
142
143 std::string srule = rule.substr(offset);
144 for (i = srule.find_first_of(" \t\n\r"); i != std::string::npos;
145 i = srule.find_first_of(" \t\n\r"))
146 srule.erase(i, 1);
147
148 // name of branch is not given
149 if (srule.length() == 0) return;
150
151 // add wild card at end for matching purposes
152 if (srule.back() != '*') srule += ".*"; // add wildcard to back
153
154 if (is_keep) {
155 // turn both the input and output tree's on
156 // root needs . removed otherwise it gets cranky
157 srule.erase(std::remove(srule.begin(), srule.end(), '.'), srule.end());
158 pre_clone_rules_.emplace_back(srule, true);
159 // this branch will then be copied over into output tree and be active
160 } else if (is_ignore) {
161 // don't even read it from the input file
162 // root needs . removed otherwise it gets cranky
163 srule.erase(std::remove(srule.begin(), srule.end(), '.'), srule.end());
164 pre_clone_rules_.emplace_back(srule, false);
165 // these branches won't be copied over into output tree
166 } else if (is_drop) {
167 // drop means allowing it on reading but not writing
168 // pass these regex to event bus so Event::add knows
169 event_->addDrop(srule); // requires event_ to be set
170
171 // root needs . removed otherwise it gets cranky
172 srule.erase(std::remove(srule.begin(), srule.end(), '.'), srule.end());
173 pre_clone_rules_.emplace_back(srule, false);
174 // these branches won't be copied over into output tree
175 // reactivate input branch after clone
176 reactivate_rules_.push_back(srule);
177 }
178}
Event * event_
The object containing the actual event data (trees and branches).
Definition EventFile.h:308
void addDrop(const std::string &exp)
Add a drop rule to the list of regex expressions to drop.
Definition Event.cxx:21

References framework::Event::addDrop(), event_, pre_clone_rules_, and reactivate_rules_.

Referenced by framework::Process::run().

◆ getEvent()

Event * framework::EventFile::getEvent ( )
inline

Get the Event object containing the event data.

Returns
The Event object containing event data.

Definition at line 181 of file EventFile.h.

181{ return event_; };

References event_.

◆ getFileName()

const std::string & framework::EventFile::getFileName ( )
inline
Returns
the name of the ROOT file being managed.

Definition at line 258 of file EventFile.h.

258{ return file_name_; }

References file_name_.

Referenced by framework::Process::run().

◆ getRunHeader()

ldmx::RunHeader & framework::EventFile::getRunHeader ( int runNumber)

Get the RunHeader for a given run, if it exists in the input file.

Parameters
runNumberThe run number.
Returns
The RunHeader from the input file.
Exceptions
Exceptionif there is no RunHeader in the map with the given run number.

Definition at line 391 of file EventFile.cxx.

391 {
392 ldmx::RunHeader *rh{this->getRunHeaderPtr(run_number)};
393 if (rh != nullptr) {
394 return *rh;
395 }
396 EXCEPTION_RAISE("RunHeader", "Unable to find header for run " +
397 std::to_string(run_number));
398}
ldmx::RunHeader * getRunHeaderPtr(int runNumber)
Update the RunHeader for a given run, if it exists in the input file.
Run-specific configuration and data stored in its own output TTree alongside the event TTree in the o...
Definition RunHeader.h:57

References getRunHeaderPtr().

◆ getRunHeaderPtr()

ldmx::RunHeader * framework::EventFile::getRunHeaderPtr ( int runNumber)

Update the RunHeader for a given run, if it exists in the input file.

Parameters
[in]runNumberThe run number.
Returns
pointer to the header corresponding to the run number
Note
the returned pointer will be nullptr if the run was not found

Definition at line 384 of file EventFile.cxx.

384 {
385 if (run_map_.find(run_number) != run_map_.end()) {
386 return run_map_.at(run_number).second;
387 }
388 return nullptr;
389}
std::map< int, std::pair< bool, ldmx::RunHeader * > > run_map_
Map of run numbers to RunHeader objects.
Definition EventFile.h:337

References run_map_.

Referenced by getRunHeader(), and framework::Process::run().

◆ importRunHeaders()

void framework::EventFile::importRunHeaders ( )
private

Fill the internal map of run numbers to RunHeader objects from the input file.

If this file is an output file and parent_ and parent_->file_ are valid pointers, then the run headers are imported from parent_->file_.

Otherwise, we try to import run headers from file_.

Does not check if any run headers are getting overwritten!

Any RunHeaders read in from this function are owned by this instance of EventFile and are deleted in close().

Note
This function does nothing if parent_->file_ and file_ are nullptrs.

Definition at line 400 of file EventFile.cxx.

400 {
401 // choose which file to import from
402 auto the_import_file{file_}; // if this is an input file
404 the_import_file = parent_->file_; // output file with input parent
405 else if (is_output_file_)
406 return; // output file, no input parent to read from
407
408 if (the_import_file) {
409 // the file exist
410 TTreeReader old_run_tree("LDMX_Run", the_import_file);
411 TTreeReaderValue<ldmx::RunHeader> old_run_header(old_run_tree, "RunHeader");
412 // TODO check that setup went correctly
413 while (old_run_tree.Next()) {
414 auto *old_run_header_ptr = old_run_header.Get();
415 if (old_run_header_ptr != nullptr) {
416 // copy input run tree into run map
417 // We should consider moving to a shared_ptr instead of 'new'
418 run_map_[old_run_header_ptr->getRunNumber()] =
419 std::make_pair(true, new ldmx::RunHeader(*old_run_header_ptr));
420 }
421 }
422 }
423
424 return;
425}

References file_, is_output_file_, parent_, and run_map_.

Referenced by EventFile(), and updateParent().

◆ isCorrupted()

bool framework::EventFile::isCorrupted ( ) const

Check if the file we have is corrupted.

The check on if the file is corrupted is only helpful for input files, but we attempt to have a resonable definition for output files as well.

Input Files

There are two ways a file can be corrupted and these may not be mutually exclusive.

  1. The LDMX_Events tree does not exist within it.
  2. The IsZombie flag of the TFile is set

Output Files

For output files, we just check the IsZombie flag of the TFile. Again, since we are actively writing to this file, a corruption check is not very stable.

Definition at line 116 of file EventFile.cxx.

116 {
117 if (is_output_file_) return file_->IsZombie();
118 return (!tree_ or file_->IsZombie());
119}

References file_, is_output_file_, and tree_.

Referenced by framework::Process::run().

◆ nextEvent()

bool framework::EventFile::nextEvent ( bool storeCurrentEvent = true)

Prepare the next event.

We do the necessary set-up if ientry_ < 0. This means if we are an output file with a parent file, we clone our parent tree to our tree so we have the same branches.

After the first entry (when ientry_ >= 0), we "close up" the last event, filling our tree if we storeCurrentEvent is true and telling the event bus to clear.

Going to the next event depends on the configuration of the event file. THere are three cases.

  1. We have a parent file - Just follow the parent's lead by calling the parent's nextEvent.
  2. We are an output file (and we don't have a parent file). Just increment the number of entries and the entry index_.
  3. We are an input file. Now we need to load the next entry of the our tree into the event bus objects. If we are configured to be "loopable", then we will reset ientry_ to -1 when we reach the last event. Otherwise, we will return false as a stopping condition.
Parameters
[in]storeCurrentEventShould we save the current event to the output (if we are an output file)?
Returns
If event was prepared/read successfully.

Definition at line 180 of file EventFile.cxx.

180 {
181 if (ientry_ < 0) {
182 // first entry of this file
183 if (parent_) {
184 // we have a parent file
185 if (!parent_->tree_) {
186 // this should _never_ happen
187 EXCEPTION_RAISE("EventFile", "No event tree in the file");
188 }
189 // Only clone parent tree if either
190 // 1) There is no tree setup yet (first input file)
191 // 2) This is not single output (new input file --> new output file)
192 if (!tree_ or !is_single_output_) {
193 // clones parent_->tree_ to our tree_ keeping drop/keep rules in mind
194 // clone tree (only copies over branches that are active on input tree)
195
196 file_->cd(); // go into output file
197
198 for (auto const &rule_pair : pre_clone_rules_)
199 parent_->tree_->SetBranchStatus(rule_pair.first.c_str(),
200 rule_pair.second);
201
202 tree_ = parent_->tree_->CloneTree(0);
203
204 // reactivate any drop branches (drop) on input tree
205 for (auto const &rule : reactivate_rules_)
206 parent_->tree_->SetBranchStatus(rule.c_str(), 1);
207 }
210 } // we have a parent file
211 } else {
212 // later than first entry of file
213 if (is_output_file_) {
215 if (storeCurrentEvent) // we should store before moving on
216 tree_->Fill(); // fill the clones...
217 } // we are an output file
218
219 // the event bus may not be defined
220 // for this file if we are input file and
221 // there is an output file during this run
222 if (event_) {
223 event_->clear();
225 } // event bus defined
226 } // first or not first entry in this file
227
228 if (parent_) {
229 // we have a parent, follow their lead
230 if (!parent_->nextEvent()) {
231 return false;
232 }
234 entries_++;
235 } else if (is_output_file_) {
236 // we don't have a parent and we
237 // are an output file
238 // Just increment the number of entries
239 // and the index_ of the current entry
240 ientry_++;
241 entries_++;
242 } else {
243 // we don't have a parent and
244 // we aren't an output file
245 // try to load another entry from our tree
246 if (ientry_ + 1 >= entries_) {
247 if (is_loopable_) {
248 // reset the event counter: reuse events from start of pileup tree
249 ientry_ = -1;
250 } else
251 return false;
252 }
253 ientry_++;
254 tree_->GetEntry(ientry_);
255 }
256
257 // if we have an event_
258 // make sure it is iterated as well
259 return event_ ? event_->nextEvent() : true;
260}
bool nextEvent(bool storeCurrentEvent=true)
Prepare the next event.
Long64_t ientry_
The current entry in the tree.
Definition EventFile.h:284
void clear()
Clear this object's data (including passengers).
Definition Event.cxx:165
void setOutputTree(TTree *tree)
Set the output data tree.
Definition Event.cxx:108
void beforeFill()
Action to be executed before the tree is filled.
Definition Event.cxx:156
void onEndOfEvent()
Perform end of event action (doesn't do anything right now).
Definition Event.cxx:170
bool nextEvent()
Go to the next event by retrieving the event header.
Definition Event.cxx:151
void setInputTree(TTree *tree)
Set the input data tree.
Definition Event.cxx:110

References framework::Event::beforeFill(), framework::Event::clear(), entries_, event_, file_, ientry_, is_loopable_, is_output_file_, is_single_output_, framework::Event::nextEvent(), nextEvent(), framework::Event::onEndOfEvent(), parent_, pre_clone_rules_, reactivate_rules_, framework::Event::setInputTree(), framework::Event::setOutputTree(), and tree_.

Referenced by nextEvent(), and framework::Process::run().

◆ setupEvent()

void framework::EventFile::setupEvent ( Event * evt)

Set an Event object containing the event data to work with this file.

Parameters
evtThe Event object with event data.

Definition at line 262 of file EventFile.cxx.

262 {
263 event_ = evt;
264 if (is_output_file_) {
265 // we are an output file
266 if (!tree_ && !parent_) {
267 // we don't have a tree and we don't have a parent
268 // ==> *Production Mode* create a new tree
270 ientry_ = 0;
271 entries_ = 0;
272 }
273
274 if (parent_) {
275 // we have a parent file so give
276 // the parent's tree to the event bus
277 // as the input tree
279 }
280
281 // give our tree to the event as the output tree
283 } else {
284 // we are an input file
285 // so give our tree to the event as input tree
287 } // output or input file
288}
TTree * createTree()
Create the output data tree.
Definition Event.cxx:102

References framework::Event::createTree(), entries_, event_, ientry_, is_output_file_, parent_, framework::Event::setInputTree(), framework::Event::setOutputTree(), and tree_.

Referenced by framework::Process::run().

◆ skipToEvent()

int framework::EventFile::skipToEvent ( int offset)

Skip events using an offset.

Used in pileup overlay.

Returns
New event number if read successfully, else -1.

Definition at line 290 of file EventFile.cxx.

290 {
291 // make sure the event number exists
292 ientry_ = offset % entries_ - 1;
293 return ientry_;
294}

References entries_, and ientry_.

◆ updateParent()

void framework::EventFile::updateParent ( EventFile * parent)

Change pointer to different parent file.

We assume that the parent file is an EventFile configured to be an input file. This allows us to assume that the tree_ member variable of parent is valid.

Parameters
parentpointer to new parent file

Definition at line 296 of file EventFile.cxx.

296 {
297 parent_ = parent;
298
299 // we can assume parent_->tree_ is valid
300 // because (for input files) the tree_ is imported
301 // from the file and then checked if its valid in the
302 // EventFile constructor
303
304 // Enter output file
305 file_->cd();
306
307 // need to turn on/off the same branches as in the initial setup...
308 for (auto const &rule_pair : pre_clone_rules_)
309 parent_->tree_->SetBranchStatus(rule_pair.first.c_str(), rule_pair.second);
310
311 // Copy over addresses from the new parent
312 parent_->tree_->CopyAddresses(tree_);
313
314 // and reactivate any dropping rules
315 for (auto const &rule : reactivate_rules_)
316 parent_->tree_->SetBranchStatus(rule.c_str(), 1);
317
318 // Reset the entry index_ with the new parent index_
320
321 // import run headers from new input file
323
324 return;
325}

References file_, ientry_, importRunHeaders(), parent_, pre_clone_rules_, reactivate_rules_, and tree_.

Referenced by framework::Process::run().

◆ writeRunHeader()

void framework::EventFile::writeRunHeader ( ldmx::RunHeader & runHeader)

Write the run header into the run map.

Any RunHeader passed here is not owned or cleaned up by this EventFile instance.

Parameters
runHeaderThe run header to write into the map
Exceptions
Exceptionif run number is already in run map

Definition at line 371 of file EventFile.cxx.

371 {
372 int run_number = run_header.getRunNumber();
373
374 if (run_map_.find(run_number) != run_map_.end()) {
375 EXCEPTION_RAISE("RunMap", "Run map already contains a run with number '" +
376 std::to_string(run_number) + "'.");
377 }
378
379 run_map_[run_number] = std::make_pair(false, &run_header);
380
381 return;
382}

References ldmx::RunHeader::getRunNumber(), and run_map_.

Referenced by framework::Process::run().

◆ writeRunTree()

void framework::EventFile::writeRunTree ( )

Write the map of run headers to the file as a TTree of RunHeader.

Deletes any RunHeaders that this instance of EventFile owns.

Exceptions
Exceptionif call this function on a non-output file.

ROOT requires us to be in the correct directory when we create the output TTree for us to have it written into the correct location.

In order to allow downstream processors to getHistoDirectory() and enter that directory for this histograms we need to enter the output event file again here so that our run tree ends up in the correct location.

Definition at line 327 of file EventFile.cxx.

327 {
328 if (not is_output_file_) {
329 EXCEPTION_RAISE("MisCall",
330 "Cannot write the run tree on an input event file.");
331 }
332
333 // store the run map into the output tree
334 // Check for the existence of the run tree in the file.
335 // If it already exists, throw an exception.
336 // TODO: Tree name shouldn't be hardcoded. Is this check really necessary?
337 auto run_tree{static_cast<TTree *>(file_->Get("LDMX_Run"))};
338 if (run_tree) {
339 EXCEPTION_RAISE("RunTree",
340 "RunTree 'LDMX_Run' already exists in output file '" +
341 file_name_ + "'.");
342 }
343
354 file_->cd();
355 run_tree = new TTree("LDMX_Run", "LDMX run header");
356
357 // create the branch on this tree
358 ldmx::RunHeader *the_handle = nullptr;
359 run_tree->Branch("RunHeader", "ldmx::RunHeader", &the_handle, 32000, 3);
360
361 // copy over the run headers into the tree
362 for (auto &[num, header_pair] : run_map_) {
363 the_handle = header_pair.second;
364 run_tree->Fill();
365 if (header_pair.first) delete header_pair.second;
366 }
367
368 run_tree->Write();
369}

References file_, file_name_, is_output_file_, and run_map_.

Referenced by framework::Process::run().

Member Data Documentation

◆ entries_

Long64_t framework::EventFile::entries_ {-1}
private

The number of entries in the tree.

Definition at line 281 of file EventFile.h.

281{-1};

Referenced by EventFile(), nextEvent(), setupEvent(), and skipToEvent().

◆ event_

Event* framework::EventFile::event_ {nullptr}
private

The object containing the actual event data (trees and branches).

Definition at line 308 of file EventFile.h.

308{nullptr};

Referenced by addDrop(), getEvent(), nextEvent(), and setupEvent().

◆ file_

TFile* framework::EventFile::file_ {nullptr}
private

The backing TFile for this EventFile.

Definition at line 299 of file EventFile.h.

299{nullptr};

Referenced by EventFile(), importRunHeaders(), isCorrupted(), nextEvent(), updateParent(), writeRunTree(), and ~EventFile().

◆ file_name_

std::string framework::EventFile::file_name_
private

The file name.

Definition at line 287 of file EventFile.h.

Referenced by EventFile(), getFileName(), and writeRunTree().

◆ ientry_

Long64_t framework::EventFile::ientry_ {-1}
private

The current entry in the tree.

Definition at line 284 of file EventFile.h.

284{-1};

Referenced by nextEvent(), setupEvent(), skipToEvent(), and updateParent().

◆ is_loopable_

bool framework::EventFile::is_loopable_ {false}
private

True if this is an input file with pileup overlay events *‍/.

Definition at line 296 of file EventFile.h.

296{false};

Referenced by nextEvent().

◆ is_output_file_

bool framework::EventFile::is_output_file_
private

True if file is an output file being written to disk.

Definition at line 290 of file EventFile.h.

Referenced by EventFile(), importRunHeaders(), isCorrupted(), nextEvent(), setupEvent(), writeRunTree(), and ~EventFile().

◆ is_single_output_

bool framework::EventFile::is_single_output_
private

True if there is only one output file.

Definition at line 293 of file EventFile.h.

Referenced by nextEvent().

◆ parent_

EventFile* framework::EventFile::parent_ {nullptr}
private

A parent file containing event data.

Definition at line 305 of file EventFile.h.

305{nullptr};

Referenced by EventFile(), importRunHeaders(), nextEvent(), setupEvent(), and updateParent().

◆ pre_clone_rules_

std::vector<std::pair<std::string, bool> > framework::EventFile::pre_clone_rules_
private

Pre-clone rules.

The series of rules to call before cloning/copying the parent tree.

Definition at line 316 of file EventFile.h.

Referenced by addDrop(), EventFile(), nextEvent(), and updateParent().

◆ reactivate_rules_

std::vector<std::string> framework::EventFile::reactivate_rules_
private

Vector of drop rules that have been parsed and need to be used to reactivate these branches on the input tree.

The branches were initial deactivated so they don't get cloned to output tree.

Definition at line 325 of file EventFile.h.

Referenced by addDrop(), EventFile(), nextEvent(), and updateParent().

◆ run_map_

std::map<int, std::pair<bool, ldmx::RunHeader *> > framework::EventFile::run_map_
private

Map of run numbers to RunHeader objects.

The value object is a pair that should remain internal.

  1. True if EventFile owns the RunHeader (and needs to clean it up)
    • This happens when RunHeaders are imported from an input file
  2. False if EventFile does not own the RunHeader
    • This happens when the RunHeader is created by Process::run during production

Definition at line 337 of file EventFile.h.

Referenced by getRunHeaderPtr(), importRunHeaders(), writeRunHeader(), and writeRunTree().

◆ tree_

TTree* framework::EventFile::tree_ {nullptr}
private

The tree with event data.

Definition at line 302 of file EventFile.h.

302{nullptr};

Referenced by EventFile(), isCorrupted(), nextEvent(), setupEvent(), updateParent(), and ~EventFile().


The documentation for this class was generated from the following files: