CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
ChainEvent.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: FWLite
4 // Class : ChainEvent
5 //
6 // Implementation:
7 // <Notes on implementation>
8 //
9 // Original Author: Chris Jones
10 // Created: Sat Jun 16 06:48:39 EDT 2007
11 //
12 
13 // system include files
14 
15 // user include files
19 #include "TFile.h"
20 #include "TTree.h"
21 #include "TROOT.h"
22 
23 namespace fwlite {
24 //
25 // constants, enums and typedefs
26 //
27 
28 //
29 // static data member definitions
30 //
31 
32 //
33 // constructors and destructor
34 //
35 ChainEvent::ChainEvent(const std::vector<std::string>& iFileNames):
36  fileNames_(),
37  file_(),
38  event_(),
39  eventIndex_(0),
40  accumulatedSize_()
41 {
42  Long64_t summedSize=0;
43  accumulatedSize_.reserve(iFileNames.size()+1);
44  fileNames_.reserve(iFileNames.size());
45 
46  for (std::vector<std::string>::const_iterator it= iFileNames.begin(), itEnd = iFileNames.end();
47  it!=itEnd;
48  ++it) {
49  TFile *tfilePtr = TFile::Open(it->c_str());
50  file_ = boost::shared_ptr<TFile>(tfilePtr);
51  gROOT->GetListOfFiles()->Remove(tfilePtr);
52  TTree* tree = dynamic_cast<TTree*>(file_->Get(edm::poolNames::eventTreeName().c_str()));
53  if (0 == tree) {
54  throw cms::Exception("NotEdmFile")<<"The file "<<*it<<" has no 'Events' TTree and therefore is not an EDM ROOT file";
55  }
56  Long64_t nEvents = tree->GetEntries();
57  if (nEvents > 0) { // skip empty files
58  fileNames_.push_back(*it);
59  // accumulatedSize_ is the entry # at the beginning of this file
60  accumulatedSize_.push_back(summedSize);
61  summedSize += nEvents;
62  }
63  }
64  // total accumulated size (last enry + 1) at the end of last file
65  accumulatedSize_.push_back(summedSize);
66 
67  if (fileNames_.size() > 0)
68  switchToFile(0);
69 }
70 
71 // ChainEvent::ChainEvent(const ChainEvent& rhs)
72 // {
73 // // do actual copying here;
74 // }
75 
77 {
78 }
79 
80 //
81 // assignment operators
82 //
83 // const ChainEvent& ChainEvent::operator=(const ChainEvent& rhs)
84 // {
85 // //An exception safe implementation is
86 // ChainEvent temp(rhs);
87 // swap(rhs);
88 //
89 // return *this;
90 // }
91 
92 //
93 // member functions
94 //
95 
96 const ChainEvent&
98 {
99  if(eventIndex_ != static_cast<Long64_t>(fileNames_.size())-1)
100  {
101  ++(*event_);
102  if(event_->atEnd()) {
104  }
105  } else {
106  if(*event_) {
107  ++(*event_);
108  }
109  }
110  return *this;
111 }
112 
114 bool
115 ChainEvent::to(Long64_t iIndex)
116 {
117  if (iIndex >= accumulatedSize_.back())
118  {
119  // if we're here, then iIndex was not valid
120  return false;
121  }
122 
123  Long64_t offsetIndex = eventIndex_;
124 
125  // we're going backwards, so start from the beginning
126  if (iIndex < accumulatedSize_[offsetIndex]) {
127  offsetIndex = 0;
128  }
129 
130  // is it past the end of this file?
131  while (iIndex >= accumulatedSize_[offsetIndex+1]) {
132  ++offsetIndex;
133  }
134 
135  if(offsetIndex != eventIndex_) {
136  switchToFile(eventIndex_ = offsetIndex);
137  }
138 
139  // adjust to entry # in this file
140  return event_->to( iIndex-accumulatedSize_[offsetIndex] );
141 }
142 
143 
145 bool
147 {
148  return to(id.run(), id.luminosityBlock(), id.event());
149 }
150 
153 bool
155 {
156 
157  // First try this file
158  if ( event_->to( run, lumi, event ) )
159  {
160  // found it, return
161  return true;
162  }
163  else
164  {
165  // Did not find it, try the other files sequentially.
166  // Someday I can make this smarter. For now... we get something working.
167  Long64_t thisFile = eventIndex_;
168  std::vector<std::string>::const_iterator filesBegin = fileNames_.begin(),
169  filesEnd = fileNames_.end(), ifile = filesBegin;
170  for ( ; ifile != filesEnd; ++ifile )
171  {
172  // skip the "first" file that we tried
173  if ( ifile - filesBegin != thisFile )
174  {
175  // switch to the next file
176  switchToFile( ifile - filesBegin );
177  // check that tree for the desired event
178  if ( event_->to( run, lumi, event ) )
179  {
180  // found it, return
181  return true;
182  }
183  }// end ignore "first" file that we tried
184  }// end loop over files
185 
186  // did not find the event with id "id".
187  return false;
188  }// end if we did not find event id in "first" file
189 }
190 
191 bool
193 {
194  return to(run, 0U, event);
195 }
196 
199 const ChainEvent&
201 {
202  if (eventIndex_ != 0)
203  {
204  switchToFile(0);
205  }
206  event_->toBegin();
207  return *this;
208 }
209 
210 void
211 ChainEvent::switchToFile(Long64_t iIndex)
212 {
213  eventIndex_= iIndex;
214  TFile *tfilePtr = TFile::Open(fileNames_[iIndex].c_str());
215  file_ = boost::shared_ptr<TFile>(tfilePtr);
216  gROOT->GetListOfFiles()->Remove(tfilePtr);
217  event_ = boost::shared_ptr<Event>( new Event(file_.get()));
218 }
219 
220 //
221 // const member functions
222 //
223 const std::string
224 ChainEvent::getBranchNameFor(const std::type_info& iType,
225  const char* iModule,
226  const char* iInstance,
227  const char* iProcess) const
228 {
229  return event_->getBranchNameFor(iType,iModule,iInstance,iProcess);
230 }
231 
232 const std::vector<edm::BranchDescription>&
234 {
235  return event_->getBranchDescriptions();
236 }
237 
238 const std::vector<std::string>&
240 {
241  return event_->getProcessHistory();
242 }
243 
244 edm::ProcessHistory const&
246 {
247  return event_->processHistory();
248 }
249 
250 edm::EventAuxiliary const&
252 {
253  return event_->eventAuxiliary();
254 }
255 
257 {
258  return event_->getLuminosityBlock();
259 }
260 
262 {
263  return event_->getRun();
264 }
265 
266 
267 bool
268 ChainEvent::getByLabel(const std::type_info& iType,
269  const char* iModule,
270  const char* iInstance,
271  const char* iProcess,
272  void* iValue) const
273 {
274  return event_->getByLabel(iType,iModule,iInstance,iProcess,iValue);
275 }
276 
278 {
279  return event_->getByProductID( iID );
280 }
281 
282 bool
284 {
285  return event_->isValid();
286 }
288 {
289  return *event_;
290 }
291 
292 bool
294 {
295  if (eventIndex_ == static_cast<Long64_t>(fileNames_.size())-1) {
296  return event_->atEnd();
297  }
298  return false;
299 }
300 
301 Long64_t
303 {
304  return accumulatedSize_.back();
305 }
306 
307 edm::TriggerNames const&
308 ChainEvent::triggerNames(edm::TriggerResults const& triggerResults) const
309 {
310  return event_->triggerNames(triggerResults);
311 }
312 
313 void
315 {
316  event_->fillParameterSetRegistry();
317 }
318 
320 ChainEvent::triggerResultsByName(std::string const& process) const {
321  return event_->triggerResultsByName(process);
322 }
323 
324 //
325 // static member functions
326 //
327 void
328 ChainEvent::throwProductNotFoundException(const std::type_info& iType,
329  const char* iModule,
330  const char* iInstance,
331  const char* iProcess) {
332  Event::throwProductNotFoundException(iType,iModule,iInstance,iProcess);
333 }
334 }
virtual edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const
Definition: ChainEvent.cc:308
virtual edm::TriggerResultsByName triggerResultsByName(std::string const &process) const
Definition: ChainEvent.cc:320
static void throwProductNotFoundException(const std::type_info &, const char *, const char *, const char *)
Definition: ChainEvent.cc:328
Long64_t size() const
Definition: ChainEvent.cc:302
unsigned int EventNumber_t
Definition: EventID.h:30
virtual edm::EventAuxiliary const & eventAuxiliary() const
Definition: ChainEvent.cc:251
void switchToFile(Long64_t)
Definition: ChainEvent.cc:211
tuple lumi
Definition: fjr2json.py:41
edm::LuminosityBlockNumber_t luminosityBlock() const
Definition: EventBase.h:59
edm::EDProduct const * getByProductID(edm::ProductID const &) const
Definition: ChainEvent.cc:277
virtual bool getByLabel(const std::type_info &, const char *, const char *, const char *, void *) const
Definition: ChainEvent.cc:268
Long64_t eventIndex_
Definition: ChainEvent.h:131
virtual ~ChainEvent()
Definition: ChainEvent.cc:76
unsigned int LuminosityBlockNumber_t
Definition: EventID.h:31
const std::vector< edm::BranchDescription > & getBranchDescriptions() const
Definition: ChainEvent.cc:233
const ChainEvent & operator++()
Definition: ChainEvent.cc:97
ChainEvent(const std::vector< std::string > &iFileNames)
Definition: ChainEvent.cc:35
fwlite::LuminosityBlock const & getLuminosityBlock()
Definition: ChainEvent.cc:256
const ChainEvent & toBegin()
Definition: ChainEvent.cc:200
void fillParameterSetRegistry() const
Definition: ChainEvent.cc:314
boost::shared_ptr< Event > event_
Definition: ChainEvent.h:130
fwlite::Run const & getRun()
Definition: ChainEvent.cc:261
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
bool to(Long64_t iIndex)
Go to the event at index iIndex.
Definition: ChainEvent.cc:115
virtual bool atEnd() const
Definition: ChainEvent.cc:293
const std::vector< std::string > & getProcessHistory() const
Definition: ChainEvent.cc:239
std::vector< Long64_t > accumulatedSize_
Definition: ChainEvent.h:132
virtual const std::string getBranchNameFor(const std::type_info &, const char *, const char *, const char *) const
Definition: ChainEvent.cc:224
tuple process
Definition: align_tpl.py:3
static void throwProductNotFoundException(const std::type_info &, const char *, const char *, const char *)
Definition: Event.cc:473
std::string const & eventTreeName()
Definition: BranchType.cc:244
unsigned int RunNumber_t
Definition: EventRange.h:32
edm::ProcessHistory const & processHistory() const
Definition: ChainEvent.cc:245
UInt_t nEvents
Definition: hcalCalib.cc:43
tuple ifile
Definition: indexGen.py:77
Event const * event() const
Definition: ChainEvent.h:102
bool isValid() const
Definition: ChainEvent.cc:283
boost::shared_ptr< TFile > file_
Definition: ChainEvent.h:129
std::vector< std::string > fileNames_
Definition: ChainEvent.h:128