CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TFWLiteSelectorBasic.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 
3 //
4 // Package: TFWLiteSelector
5 // Class : TFWLiteSelectorBasic
6 //
7 // Implementation:
8 // <Notes on implementation>
9 //
10 // Original Author: Chris Jones
11 // Created: Tue Jun 27 17:58:10 EDT 2006
12 //
13 
14 // user include files
16 
25 #include "DataFormats/Provenance/interface/EventEntryDescription.h" // kludge to allow compilation
49 
50 // system include files
51 #include "TBranch.h"
52 #include "TChain.h"
53 #include "TFile.h"
54 #include "TTree.h"
55 
56 #include <iostream>
57 #include <memory>
58 #include <string>
59 #include <vector>
60 
61 namespace edm {
62  namespace root {
64  public:
66  void setEntry(Long64_t iEntry) { entry_ = iEntry; }
67  void setTree(TTree* iTree) {eventTree_ = iTree;}
68  void set(std::shared_ptr<ProductRegistry const> iReg) { reg_ = iReg;}
69  private:
70  std::unique_ptr<WrapperBase> getTheProduct(BranchKey const& k) const;
71  virtual std::unique_ptr<WrapperBase> getProduct_(BranchKey const& k, EDProductGetter const* ep) override;
72  virtual std::unique_ptr<EventEntryDescription> getProvenance_(BranchKey const&) const {
73  return std::unique_ptr<EventEntryDescription>();
74  }
75  virtual void mergeReaders_(DelayedReader*) override {}
76  virtual void reset_() override {}
77  Long64_t entry_;
78  TTree* eventTree_;
79  std::shared_ptr<ProductRegistry const>(reg_);
80  };
81 
82  std::unique_ptr<WrapperBase>
84  return getTheProduct(k);
85  }
86 
87  std::unique_ptr<WrapperBase>
89  ProductRegistry::ProductList::const_iterator itFind= reg_->productList().find(k);
90  if(itFind == reg_->productList().end()) {
91  throw Exception(errors::ProductNotFound) << "could not find entry for product " << k;
92  }
93  BranchDescription const& bDesc = itFind->second;
94 
95  TBranch* branch= eventTree_->GetBranch(bDesc.branchName().c_str());
96  if(nullptr == branch) {
97  throw cms::Exception("MissingBranch")
98  << "could not find branch named '" << bDesc.branchName() << "'"
99  << "\n Perhaps the data being requested was not saved in this file?";
100  }
101  //find the class type
103  TypeWithDict classType = TypeWithDict::byName(fullName);
104  if(!bool(classType)) {
105  throw cms::Exception("MissingDictionary")
106  << "could not find dictionary for type '" << fullName << "'"
107  << "\n Please make sure all the necessary libraries are available.";
108  }
109 
110  //create an instance of it
111  ObjectWithDict wrapperObj = classType.construct();
112  if(nullptr == wrapperObj.address()) {
113  throw cms::Exception("FailedToCreate") << "could not create an instance of '" << fullName << "'";
114  }
115  void* address = wrapperObj.address();
116  branch->SetAddress(&address);
117  ObjectWithDict edProdObj = wrapperObj.castObject(TypeWithDict::byName("edm::WrapperBase"));
118 
119  WrapperBase* prod = reinterpret_cast<WrapperBase*>(edProdObj.address());
120 
121  if(nullptr == prod) {
122  throw cms::Exception("FailedConversion")
123  << "failed to convert a '" << fullName
124  << "' to a edm::WrapperBase."
125  << "Please contact developers since something is very wrong.";
126  }
127  branch->GetEntry(entry_);
128  return std::unique_ptr<WrapperBase>(prod);
129  }
130 
133  tree_(nullptr),
134  reg_(new ProductRegistry()),
137  // Note that thinned collections are not supported yet, the next
138  // line just makes it compile but when the Ref or Ptr tries to
139  // find the thinned collection it will report them not found.
140  // More work needed here if this is needed (we think no one
141  // is using TFWLiteSelector anymore and intend to implement
142  // this properly if it turns out we are wrong)
144  processNames_(),
146  prov_(),
149  reader_->set(reg());
150  }
151  void setTree(TTree* iTree) {
152  tree_ = iTree;
153  reader_->setTree(iTree);
154  }
155 
156  TTree const* tree() const {return get_underlying_safe(tree_);}
157  TTree*& tree() {return get_underlying_safe(tree_);}
158  std::shared_ptr<ProductRegistry const> reg() const {return get_underlying_safe(reg_);}
159  std::shared_ptr<ProductRegistry>& reg() {return get_underlying_safe(reg_);}
160  std::shared_ptr<BranchIDListHelper const> branchIDListHelper() const {return get_underlying_safe(branchIDListHelper_);}
161  std::shared_ptr<BranchIDListHelper>& branchIDListHelper() {return get_underlying_safe(branchIDListHelper_);}
162  std::shared_ptr<ThinnedAssociationsHelper const> thinnedAssociationsHelper() const {return get_underlying_safe(thinnedAssociationsHelper_);}
163  std::shared_ptr<ThinnedAssociationsHelper>& thinnedAssociationsHelper() {return get_underlying_safe(thinnedAssociationsHelper_);}
164 
172  std::vector<EventEntryDescription> prov_;
173  std::vector<EventEntryDescription const*> pointerToBranchBuffer_;
175 
180  };
181  }
182 }
183 
184 
185 //
186 // constants, enums and typedefs
187 //
188 
189 //
190 // static data member definitions
191 //
192 
193 //
194 // constructors and destructor
195 //
196 TFWLiteSelectorBasic::TFWLiteSelectorBasic() : m_(new edm::root::TFWLiteSelectorMembers),
197  everythingOK_(false) {
198 }
199 
200 // TFWLiteSelectorBasic::TFWLiteSelectorBasic(TFWLiteSelectorBasic const& rhs)
201 // {
202 // // do actual copying here;
203 // }
204 
206 }
207 
208 //
209 // assignment operators
210 //
211 // TFWLiteSelectorBasic const& TFWLiteSelectorBasic::operator=(TFWLiteSelectorBasic const& rhs)
212 // {
213 // //An exception safe implementation is
214 // TFWLiteSelectorBasic temp(rhs);
215 // swap(rhs);
216 //
217 // return *this;
218 // }
219 
220 //
221 // member functions
222 //
223 void
225  Init(iTree);
226  begin(fInput);
227 }
228 
229 void
231  Init(iTree);
232  preProcessing(fInput, *fOutput);
233 }
234 
235 void
237  if(iTree == nullptr) return;
238  m_->setTree(iTree);
239 }
240 
241 
242 Bool_t
244  //std::cout << "Notify start" << std::endl;
245  //we have switched to a new file
246  //get new file from Tree
247  if(nullptr == m_->tree_) {
248  std::cout << "No tree" << std::endl;
249  return kFALSE;
250  }
251  TFile* file = m_->tree_->GetCurrentFile();
252  if(nullptr == file) {
253  //When in Rome, do as the Romans
254  TChain* chain = dynamic_cast<TChain*>(m_->tree());
255  if(nullptr == chain) {
256  std::cout << "No file" << std::endl;
257  return kFALSE;
258  }
259  file = chain->GetFile();
260  if(nullptr == file) {
261  std::cout << "No file" << std::endl;
262  return kFALSE;
263  }
264  }
265  setupNewFile(*file);
266  return everythingOK_ ? kTRUE: kFALSE;
267 }
268 
269 namespace {
270  struct Operate {
271  Operate(edm::EDProductGetter const* iGetter): old_(setRefCoreStreamer(iGetter)) {
272  }
273 
274  ~Operate() {setRefCoreStreamer(old_);}
275  private:
276  edm::EDProductGetter const* old_;
277  };
278 }
279 
280 Bool_t
282  //std::cout << "Process start" << std::endl;
283  if(everythingOK_) {
284  std::unique_ptr<edm::EventAuxiliary> eaux = std::make_unique<edm::EventAuxiliary>();
285  edm::EventAuxiliary& aux = *eaux;
286  edm::EventAuxiliary* pAux= eaux.get();
287  TBranch* branch = m_->tree_->GetBranch(edm::BranchTypeToAuxiliaryBranchName(edm::InEvent).c_str());
288 
289  branch->SetAddress(&pAux);
290  branch->GetEntry(iEntry);
291 
292 //NEW m_->processNames_ = aux.processHistory();
293 
294 // std::cout << "ProcessNames\n";
295 // for(auto const& name : m_->processNames_) {
296 // std::cout << " " << name << std::endl;
297 // }
298 
299  edm::EventSelectionIDVector eventSelectionIDs;
300  edm::EventSelectionIDVector* pEventSelectionIDVector = &eventSelectionIDs;
301  TBranch* eventSelectionsBranch = m_->tree_->GetBranch(edm::poolNames::eventSelectionsBranchName().c_str());
302  if(!eventSelectionsBranch) {
304  << "Failed to find event Selections branch in event tree";
305  }
306  eventSelectionsBranch->SetAddress(&pEventSelectionIDVector);
307  eventSelectionsBranch->GetEntry(iEntry);
308 
309  edm::BranchListIndexes branchListIndexes;
310  edm::BranchListIndexes* pBranchListIndexes = &branchListIndexes;
311  TBranch* branchListIndexBranch = m_->tree_->GetBranch(edm::poolNames::branchListIndexesBranchName().c_str());
312  if(!branchListIndexBranch) {
314  << "Failed to find branch list index branch in event tree";
315  }
316  branchListIndexBranch->SetAddress(&pBranchListIndexes);
317  branchListIndexBranch->GetEntry(iEntry);
318  m_->branchIDListHelper_->fixBranchListIndexes(branchListIndexes);
319 
320  try {
321  m_->reader_->setEntry(iEntry);
322  auto runAux = std::make_shared<edm::RunAuxiliary>(aux.run(), aux.time(), aux.time());
323  auto rp = std::make_shared<edm::RunPrincipal>(runAux, m_->reg(), m_->pc_, nullptr, 0);
324  auto lumiAux = std::make_shared<edm::LuminosityBlockAuxiliary>(rp->run(), 1, aux.time(), aux.time());
325  auto lbp = std::make_shared<edm::LuminosityBlockPrincipal>(lumiAux, m_->reg(), m_->pc_, nullptr, 0);
326  m_->ep_->fillEventPrincipal(*eaux,
327  *m_->phreg_,
328  std::move(eventSelectionIDs),
329  std::move(branchListIndexes),
330  *(m_->provRetriever_),
331  m_->reader_.get());
332  lbp->setRunPrincipal(rp);
333  m_->ep_->setLuminosityBlockPrincipal(lbp);
334  m_->processNames_ = m_->ep_->processHistory();
335 
336  edm::Event event(*m_->ep_, m_->md_, nullptr);
337 
338  //Make the event principal accessible to edm::Ref's
339  Operate sentry(m_->ep_->prodGetter());
340  process(event);
341  } catch(std::exception const& iEx) {
342  std::cout << "While processing entry " << iEntry << " the following exception was caught \n"
343  << iEx.what() << std::endl;
344  } catch(...) {
345  std::cout << "While processing entry " << iEntry << " an unknown exception was caught" << std::endl;
346  }
347  }
348  return everythingOK_ ? kTRUE: kFALSE;
349 }
350 
351 void
353  postProcessing(*fOutput);
354 }
355 
356 void
358  terminate(*fOutput);
359 }
360 
361 void
363  //look up meta-data
364  //get product registry
365 
366  //std::vector<edm::EventProcessHistoryID> eventProcessHistoryIDs_;
367  TTree* metaDataTree = dynamic_cast<TTree*>(iFile.Get(edm::poolNames::metaDataTreeName().c_str()));
368  if(!metaDataTree) {
369  std::cout << "could not find TTree " << edm::poolNames::metaDataTreeName() << std::endl;
370  everythingOK_ = false;
371  return;
372  }
373  edm::FileFormatVersion* fftPtr = &(m_->fileFormatVersion_);
374  if(metaDataTree->FindBranch(edm::poolNames::fileFormatVersionBranchName().c_str()) != nullptr) {
375  metaDataTree->SetBranchAddress(edm::poolNames::fileFormatVersionBranchName().c_str(), &fftPtr);
376  }
377 
378 
379  edm::ProductRegistry* pReg = &(*m_->reg_);
380  metaDataTree->SetBranchAddress(edm::poolNames::productDescriptionBranchName().c_str(), &(pReg));
381 
382  typedef std::map<edm::ParameterSetID, edm::ParameterSetBlob> PsetMap;
383  PsetMap psetMap;
384  PsetMap *psetMapPtr = &psetMap;
385  if(metaDataTree->FindBranch(edm::poolNames::parameterSetMapBranchName().c_str()) != nullptr) {
386  metaDataTree->SetBranchAddress(edm::poolNames::parameterSetMapBranchName().c_str(), &psetMapPtr);
387  } else {
388  TTree* psetTree = dynamic_cast<TTree *>(iFile.Get(edm::poolNames::parameterSetsTreeName().c_str()));
389  if(nullptr == psetTree) {
391  << " in the input file.\n";
392  }
393  typedef std::pair<edm::ParameterSetID, edm::ParameterSetBlob> IdToBlobs;
394  IdToBlobs idToBlob;
395  IdToBlobs* pIdToBlob = &idToBlob;
396  psetTree->SetBranchAddress(edm::poolNames::idToParameterSetBlobsBranchName().c_str(), &pIdToBlob);
397  for(long long i = 0; i != psetTree->GetEntries(); ++i) {
398  psetTree->GetEntry(i);
399  psetMap.insert(idToBlob);
400  }
401  }
402 
404  edm::ProcessHistoryRegistry::vector_type *pHistVectorPtr = &pHistVector;
405  if(metaDataTree->FindBranch(edm::poolNames::processHistoryBranchName().c_str()) != nullptr) {
406  metaDataTree->SetBranchAddress(edm::poolNames::processHistoryBranchName().c_str(), &pHistVectorPtr);
407  }
408 
409 
410  edm::ProcessConfigurationVector procConfigVector;
411  edm::ProcessConfigurationVector* procConfigVectorPtr = &procConfigVector;
412  if(metaDataTree->FindBranch(edm::poolNames::processConfigurationBranchName().c_str()) != nullptr) {
413  metaDataTree->SetBranchAddress(edm::poolNames::processConfigurationBranchName().c_str(), &procConfigVectorPtr);
414  }
415 
416  auto branchIDListsHelper = std::make_shared<edm::BranchIDListHelper>();
417  edm::BranchIDLists const* branchIDListsPtr = &branchIDListsHelper->branchIDLists();
418  if(metaDataTree->FindBranch(edm::poolNames::branchIDListBranchName().c_str()) != nullptr) {
419  metaDataTree->SetBranchAddress(edm::poolNames::branchIDListBranchName().c_str(), &branchIDListsPtr);
420  }
421 
422  metaDataTree->GetEntry(0);
423 
424  for(auto& prod : m_->reg_->productListUpdator()) {
425  prod.second.init();
426  }
427 
428  // Merge into the registries. For now, we do NOT merge the product registry.
430  for(auto const& entry : psetMap) {
431  edm::ParameterSet pset(entry.second.pset());
432  pset.setID(entry.first);
433  psetRegistry.insertMapped(pset);
434  }
435 
436  for(auto const& ph : pHistVector) {
437  m_->phreg_->registerProcessHistory(ph);
438  }
439 
440  m_->pointerToBranchBuffer_.erase(m_->pointerToBranchBuffer_.begin(),
441  m_->pointerToBranchBuffer_.end());
442 
443  std::unique_ptr<edm::ProductRegistry> newReg = std::make_unique<edm::ProductRegistry>();
444 
445  edm::ProductRegistry::ProductList& prodList = m_->reg_->productListUpdator();
446  {
447  for(auto& item : prodList) {
448  edm::BranchDescription& prod = item.second;
449  //std::cout << "productname = " << item.second << " end " << std::endl;
450  std::string newFriendlyName = edm::friendlyname::friendlyName(prod.className());
451  if(newFriendlyName == prod.friendlyClassName()) {
452  newReg->copyProduct(prod);
453  } else {
454  if(m_->fileFormatVersion_.splitProductIDs()) {
456  << "Cannot change friendly class name algorithm without more development work\n"
457  << "to update BranchIDLists. Contact the framework group.\n";
458  }
459  edm::BranchDescription newBD(prod);
460  newBD.updateFriendlyClassName();
461  newReg->copyProduct(newBD);
462  }
463  prod.init();
464  }
465 
466  m_->reg().reset(newReg.release());
467  }
468 
469  edm::ProductRegistry::ProductList& prodList2 = m_->reg_->productListUpdator();
470  std::vector<edm::EventEntryDescription> temp(prodList2.size(), edm::EventEntryDescription());
471  m_->prov_.swap(temp);
472  m_->pointerToBranchBuffer_.reserve(prodList2.size());
473 
474  for(auto& item : prodList2) {
475  edm::BranchDescription& prod = item.second;
476  if(prod.branchType() == edm::InEvent) {
477  prod.init();
478  //NEED to do this and check to see if branch exists
479  if(m_->tree_->GetBranch(prod.branchName().c_str()) == nullptr) {
480  prod.setDropped(true);
481  }
482 
483  //std::cout << "id " << it->first << " branch " << it->second << std::endl;
484  //m_->pointerToBranchBuffer_.push_back(&(*itB));
485  //void* tmp = &(m_->pointerToBranchBuffer_.back());
486  //edm::EventEntryDescription* tmp = &(*itB);
487  //CDJ need to fix provenance and be backwards compatible, for now just don't read the branch
488  //m_->metaTree_->SetBranchAddress(prod.branchName().c_str(), tmp);
489  }
490  }
491  m_->branchIDListHelper_->updateFromInput(*branchIDListsPtr);
492  m_->reg_->setFrozen();
493  m_->ep_ = std::make_shared<edm::EventPrincipal>(m_->reg(), m_->branchIDListHelper(), m_->thinnedAssociationsHelper(), m_->pc_, nullptr);
494  everythingOK_ = true;
495 }
496 
497 //
498 // const member functions
499 //
500 
501 //
502 // static member functions
503 //
std::vector< EventEntryDescription const * > pointerToBranchBuffer_
std::string const & idToParameterSetBlobsBranchName()
Definition: BranchType.cc:255
virtual void terminate(TList &out)=0
std::vector< ProcessConfiguration > ProcessConfigurationVector
virtual void mergeReaders_(DelayedReader *) override
int i
Definition: DBlmapReader.cc:9
std::string const & branchName() const
std::shared_ptr< ThinnedAssociationsHelper const > thinnedAssociationsHelper() const
std::string const & BranchTypeToAuxiliaryBranchName(BranchType const &branchType)
Definition: BranchType.cc:115
BranchType const & branchType() const
std::vector< BranchIDList > BranchIDLists
Definition: BranchIDList.h:19
std::shared_ptr< BranchIDListHelper const > branchIDListHelper() const
virtual std::unique_ptr< EventEntryDescription > getProvenance_(BranchKey const &) const
void * address() const
virtual void preProcessing(const TList *in, TList &out)=0
std::vector< EventEntryDescription > prov_
edm::propagate_const< TTree * > tree_
edm::propagate_const< std::shared_ptr< edm::root::TFWLiteSelectorMembers > > m_
ObjectWithDict castObject(TypeWithDict const &) const
std::map< BranchKey, BranchDescription > ProductList
virtual Bool_t Process(Long64_t)
edm::propagate_const< std::shared_ptr< ThinnedAssociationsHelper > > thinnedAssociationsHelper_
void setRefCoreStreamer(bool resetAll=false)
virtual void SlaveBegin(TTree *)
std::string const & fileFormatVersionBranchName()
Definition: BranchType.cc:218
virtual void postProcessing(TList &out)=0
std::unique_ptr< WrapperBase > getTheProduct(BranchKey const &k) const
std::string const & eventSelectionsBranchName()
Definition: BranchType.cc:243
#define nullptr
edm::propagate_const< std::shared_ptr< edm::ProductProvenanceRetriever > > provRetriever_
std::shared_ptr< BranchIDListHelper > & branchIDListHelper()
virtual void process(const edm::Event &event)=0
std::vector< EventSelectionID > EventSelectionIDVector
std::string const & parameterSetsTreeName()
Definition: BranchType.cc:251
static TypeWithDict byName(std::string const &name)
Definition: TypeWithDict.cc:60
std::vector< BranchListIndex > BranchListIndexes
std::string const & className() const
std::string friendlyName(std::string const &iFullName)
edm::propagate_const< std::shared_ptr< ProductRegistry > > reg_
def move
Definition: eostools.py:510
edm::propagate_const< std::shared_ptr< FWLiteDelayedReader > > reader_
edm::propagate_const< std::shared_ptr< BranchIDListHelper > > branchIDListHelper_
std::string const & friendlyClassName() const
void setDropped(bool isDropped)
std::string const & metaDataTreeName()
Definition: BranchType.cc:168
std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
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
std::shared_ptr< ProductRegistry > & reg()
std::string const & parameterSetMapBranchName()
Definition: BranchType.cc:183
element_type const * get() const
void set(std::shared_ptr< ProductRegistry const > iReg)
std::string const & processHistoryBranchName()
Definition: BranchType.cc:198
edm::propagate_const< std::shared_ptr< edm::EventPrincipal > > ep_
string fullName
std::string wrappedClassName(std::string const &iFullName)
virtual void Init(TTree *)
std::string const & productDescriptionBranchName()
Definition: BranchType.cc:173
std::string const & processConfigurationBranchName()
Definition: BranchType.cc:203
std::shared_ptr< ThinnedAssociationsHelper > & thinnedAssociationsHelper()
edm::propagate_const< std::shared_ptr< ProcessHistoryRegistry > > phreg_
virtual std::unique_ptr< WrapperBase > getProduct_(BranchKey const &k, EDProductGetter const *ep) override
std::shared_ptr< ProductRegistry const > reg() const
tuple cout
Definition: gather_cfg.py:145
std::string const & branchIDListBranchName()
Definition: BranchType.cc:208
std::string const & branchListIndexesBranchName()
Definition: BranchType.cc:247
volatile std::atomic< bool > shutdown_flag false
virtual void Begin(TTree *)
bool insertMapped(value_type const &v)
Definition: Registry.cc:35
static Registry * instance()
Definition: Registry.cc:12
virtual void begin(TList *&in)=0