CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes
TFWLiteSelectorBasic Class Referenceabstract

#include <FWCore/FWLite/interface/TFWLiteSelectorBasic.h>

Inheritance diagram for TFWLiteSelectorBasic:
TFWLiteSelector< TWorker > TFWLiteSelector< __class__Worker > TFWLiteSelector< ThingsWorker > TFWLiteSelector< TrackAnalysisAlgorithm > tfwliteselectortest::ThingsTSelector __class__< T > tfwliteselectortest::ThingsTSelector2 examples::TrackTSelector

Public Member Functions

virtual void begin (TList *&in)=0
 
virtual void postProcessing (TList &out)=0
 
virtual void preProcessing (const TList *in, TList &out)=0
 
virtual void process (const edm::Event &event)=0
 
virtual void terminate (TList &out)=0
 
 TFWLiteSelectorBasic ()
 
 ~TFWLiteSelectorBasic () override
 

Private Member Functions

void Begin (TTree *) override
 
void Init (TTree *) override
 
Bool_t Notify () override
 
const TFWLiteSelectorBasicoperator= (const TFWLiteSelectorBasic &)
 
Bool_t Process (Long64_t) override
 
void setupNewFile (TFile &)
 
void SlaveBegin (TTree *) override
 
void SlaveTerminate () override
 
void Terminate () override
 
 TFWLiteSelectorBasic (const TFWLiteSelectorBasic &)
 
Int_t Version () const override
 

Private Attributes

bool everythingOK_
 
edm::propagate_const< std::shared_ptr< edm::root::TFWLiteSelectorMembers > > m_
 

Detailed Description

Description: A ROOT TSelector which accesses data using an edm::Event

Usage: By inheriting from this class one can make a TSelector for ROOT which works with PROOF and which allows you to access data using an edm::Event.

Definition at line 42 of file TFWLiteSelectorBasic.h.

Constructor & Destructor Documentation

TFWLiteSelectorBasic::TFWLiteSelectorBasic ( )

Definition at line 206 of file TFWLiteSelectorBasic.cc.

207  everythingOK_(false) {
208 }
edm::propagate_const< std::shared_ptr< edm::root::TFWLiteSelectorMembers > > m_
TFWLiteSelectorBasic::~TFWLiteSelectorBasic ( )
override

Definition at line 215 of file TFWLiteSelectorBasic.cc.

215  {
216 }
TFWLiteSelectorBasic::TFWLiteSelectorBasic ( const TFWLiteSelectorBasic )
private

Member Function Documentation

virtual void TFWLiteSelectorBasic::begin ( TList *&  in)
pure virtual

Called each time the 'client' begins processing (remote 'slaves' do not see this message)

Parameters
inan assignable pointer to a list of objects you want passed to 'preProcessing'. This list is used to communicate with remote slaves. NOTE: you are responsible for deleting this TList and its content once you are done with it.

Implemented in __class__< T >, tfwliteselectortest::ThingsTSelector2, examples::TrackTSelector, and tfwliteselectortest::ThingsTSelector.

Referenced by Begin().

void TFWLiteSelectorBasic::Begin ( TTree *  iTree)
overrideprivate

Definition at line 234 of file TFWLiteSelectorBasic.cc.

References begin(), and Init().

234  {
235  Init(iTree);
236  begin(fInput);
237 }
void Init(TTree *) override
virtual void begin(TList *&in)=0
void TFWLiteSelectorBasic::Init ( TTree *  iTree)
overrideprivate

Definition at line 246 of file TFWLiteSelectorBasic.cc.

References m_.

Referenced by Begin(), and SlaveBegin().

246  {
247  if(iTree == nullptr) return;
248  m_->setTree(iTree);
249 }
edm::propagate_const< std::shared_ptr< edm::root::TFWLiteSelectorMembers > > m_
Bool_t TFWLiteSelectorBasic::Notify ( )
overrideprivate

Definition at line 253 of file TFWLiteSelectorBasic.cc.

References gather_cfg::cout, everythingOK_, FrontierConditions_GlobalTag_cff::file, m_, edm::setRefCoreStreamer(), and setupNewFile().

253  {
254  //std::cout << "Notify start" << std::endl;
255  //we have switched to a new file
256  //get new file from Tree
257  if(nullptr == m_->tree_) {
258  std::cout << "No tree" << std::endl;
259  return kFALSE;
260  }
261  TFile* file = m_->tree_->GetCurrentFile();
262  if(nullptr == file) {
263  //When in Rome, do as the Romans
264  TChain* chain = dynamic_cast<TChain*>(m_->tree());
265  if(nullptr == chain) {
266  std::cout << "No file" << std::endl;
267  return kFALSE;
268  }
269  file = chain->GetFile();
270  if(nullptr == file) {
271  std::cout << "No file" << std::endl;
272  return kFALSE;
273  }
274  }
275  setupNewFile(*file);
276  return everythingOK_ ? kTRUE: kFALSE;
277 }
Definition: chain.py:1
edm::propagate_const< std::shared_ptr< edm::root::TFWLiteSelectorMembers > > m_
const TFWLiteSelectorBasic& TFWLiteSelectorBasic::operator= ( const TFWLiteSelectorBasic )
private
virtual void TFWLiteSelectorBasic::postProcessing ( TList &  out)
pure virtual

Called each time the 'slave' has seen all the events

Parameters
outthe list of objects that will be sent to 'terminate'. You can Add() additional objects to 'out' at this point as well.

Implemented in TFWLiteSelector< TWorker >, TFWLiteSelector< ThingsWorker >, TFWLiteSelector< __class__Worker >, TFWLiteSelector< TrackAnalysisAlgorithm >, and tfwliteselectortest::ThingsTSelector.

Referenced by SlaveTerminate().

virtual void TFWLiteSelectorBasic::preProcessing ( const TList *  in,
TList &  out 
)
pure virtual

Called each time the 'slave' is about to start processing

Parameters
ina pointer to the list of objects created in 'begin()'. The pointer can be 0
outa list of objects that are the result of processing (e.g. histograms). You should call 'Add()' for each object you want sent to the 'terminate' method.

Implemented in TFWLiteSelector< TWorker >, TFWLiteSelector< ThingsWorker >, TFWLiteSelector< __class__Worker >, TFWLiteSelector< TrackAnalysisAlgorithm >, and tfwliteselectortest::ThingsTSelector.

Referenced by SlaveBegin().

virtual void TFWLiteSelectorBasic::process ( const edm::Event event)
pure virtual
Bool_t TFWLiteSelectorBasic::Process ( Long64_t  iEntry)
overrideprivate

Definition at line 291 of file TFWLiteSelectorBasic.cc.

References printConversionInfo::aux, MicroEventContent_cff::branch, edm::poolNames::branchListIndexesBranchName(), edm::BranchTypeToAuxiliaryBranchName(), gather_cfg::cout, event(), edm::poolNames::eventSelectionsBranchName(), everythingOK_, cppFunctionSkipper::exception, Exception, edm::errors::FatalRootError, edm::propagate_const< T >::get(), edm::InEvent, m_, eostools::move(), and process().

291  {
292  //std::cout << "Process start" << std::endl;
293  if(everythingOK_) {
294  std::unique_ptr<edm::EventAuxiliary> eaux = std::make_unique<edm::EventAuxiliary>();
295  edm::EventAuxiliary& aux = *eaux;
296  edm::EventAuxiliary* pAux= eaux.get();
297  TBranch* branch = m_->tree_->GetBranch(edm::BranchTypeToAuxiliaryBranchName(edm::InEvent).c_str());
298 
299  branch->SetAddress(&pAux);
300  branch->GetEntry(iEntry);
301 
302 //NEW m_->processNames_ = aux.processHistory();
303 
304 // std::cout << "ProcessNames\n";
305 // for(auto const& name : m_->processNames_) {
306 // std::cout << " " << name << std::endl;
307 // }
308 
309  edm::EventSelectionIDVector eventSelectionIDs;
310  edm::EventSelectionIDVector* pEventSelectionIDVector = &eventSelectionIDs;
311  TBranch* eventSelectionsBranch = m_->tree_->GetBranch(edm::poolNames::eventSelectionsBranchName().c_str());
312  if(!eventSelectionsBranch) {
314  << "Failed to find event Selections branch in event tree";
315  }
316  eventSelectionsBranch->SetAddress(&pEventSelectionIDVector);
317  eventSelectionsBranch->GetEntry(iEntry);
318 
319  edm::BranchListIndexes branchListIndexes;
320  edm::BranchListIndexes* pBranchListIndexes = &branchListIndexes;
321  TBranch* branchListIndexBranch = m_->tree_->GetBranch(edm::poolNames::branchListIndexesBranchName().c_str());
322  if(!branchListIndexBranch) {
324  << "Failed to find branch list index branch in event tree";
325  }
326  branchListIndexBranch->SetAddress(&pBranchListIndexes);
327  branchListIndexBranch->GetEntry(iEntry);
328  m_->branchIDListHelper_->fixBranchListIndexes(branchListIndexes);
329 
330  try {
331  m_->reader_->setEntry(iEntry);
332  auto runAux = std::make_shared<edm::RunAuxiliary>(aux.run(), aux.time(), aux.time());
333  auto rp = std::make_shared<edm::RunPrincipal>(runAux, m_->reg(), m_->pc_, nullptr, 0);
334  auto lbp = std::make_shared<edm::LuminosityBlockPrincipal>(m_->reg(), m_->pc_, nullptr, 0);
335  lbp->setAux(edm::LuminosityBlockAuxiliary(rp->run(), 1, aux.time(), aux.time()));
336  m_->ep_->fillEventPrincipal(*eaux,
337  *m_->phreg_,
338  std::move(eventSelectionIDs),
339  std::move(branchListIndexes),
340  *(m_->provRetriever_),
341  m_->reader_.get());
342  lbp->setRunPrincipal(rp);
343  m_->ep_->setLuminosityBlockPrincipal(lbp.get());
344  m_->processNames_ = m_->ep_->processHistory();
345 
346  edm::Event event(*m_->ep_, m_->md_, nullptr);
347 
348  //Make the event principal accessible to edm::Ref's
349  Operate sentry(m_->ep_->prodGetter());
350  process(event);
351  } catch(std::exception const& iEx) {
352  std::cout << "While processing entry " << iEntry << " the following exception was caught \n"
353  << iEx.what() << std::endl;
354  } catch(...) {
355  std::cout << "While processing entry " << iEntry << " an unknown exception was caught" << std::endl;
356  }
357  }
358  return everythingOK_ ? kTRUE: kFALSE;
359 }
std::string const & BranchTypeToAuxiliaryBranchName(BranchType const &branchType)
Definition: BranchType.cc:115
edm::propagate_const< std::shared_ptr< edm::root::TFWLiteSelectorMembers > > m_
std::string const & eventSelectionsBranchName()
Definition: BranchType.cc:243
virtual void process(const edm::Event &event)=0
std::vector< EventSelectionID > EventSelectionIDVector
std::vector< BranchListIndex > BranchListIndexes
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
element_type const * get() const
std::string const & branchListIndexesBranchName()
Definition: BranchType.cc:247
def move(src, dest)
Definition: eostools.py:510
Definition: event.py:1
void TFWLiteSelectorBasic::setupNewFile ( TFile &  iFile)
private

Definition at line 372 of file TFWLiteSelectorBasic.cc.

References edm::poolNames::branchIDListBranchName(), edm::BranchDescription::branchName(), edm::BranchDescription::branchType(), edm::BranchDescription::className(), gather_cfg::cout, mps_splice::entry, everythingOK_, Exception, edm::poolNames::fileFormatVersionBranchName(), edm::errors::FileReadError, edm::BranchDescription::friendlyClassName(), edm::friendlyname::friendlyName(), mps_fire::i, edm::poolNames::idToParameterSetBlobsBranchName(), edm::InEvent, edm::BranchDescription::init(), edm::pset::Registry::insertMapped(), edm::pset::Registry::instance(), m_, edm::poolNames::metaDataTreeName(), AlCaHLTBitMon_ParallelJobs::p, edm::poolNames::parameterSetMapBranchName(), edm::poolNames::parameterSetsTreeName(), edm::poolNames::processConfigurationBranchName(), edm::poolNames::processHistoryBranchName(), parseEventContent::prod, edm::poolNames::productDescriptionBranchName(), muonDTDigis_cfi::pset, edm::BranchDescription::setDropped(), AlCaHLTBitMon_QueryRunRegistry::string, groupFilesInBlocks::temp, edm::errors::UnimplementedFeature, and edm::BranchDescription::updateFriendlyClassName().

Referenced by Notify().

372  {
373  //look up meta-data
374  //get product registry
375 
376  //std::vector<edm::EventProcessHistoryID> eventProcessHistoryIDs_;
377  TTree* metaDataTree = dynamic_cast<TTree*>(iFile.Get(edm::poolNames::metaDataTreeName().c_str()));
378  if(!metaDataTree) {
379  std::cout << "could not find TTree " << edm::poolNames::metaDataTreeName() << std::endl;
380  everythingOK_ = false;
381  return;
382  }
383  edm::FileFormatVersion* fftPtr = &(m_->fileFormatVersion_);
384  if(metaDataTree->FindBranch(edm::poolNames::fileFormatVersionBranchName().c_str()) != nullptr) {
385  metaDataTree->SetBranchAddress(edm::poolNames::fileFormatVersionBranchName().c_str(), &fftPtr);
386  }
387 
388 
389  edm::ProductRegistry* pReg = &(*m_->reg_);
390  metaDataTree->SetBranchAddress(edm::poolNames::productDescriptionBranchName().c_str(), &(pReg));
391 
392  typedef std::map<edm::ParameterSetID, edm::ParameterSetBlob> PsetMap;
393  PsetMap psetMap;
394  PsetMap *psetMapPtr = &psetMap;
395  if(metaDataTree->FindBranch(edm::poolNames::parameterSetMapBranchName().c_str()) != nullptr) {
396  metaDataTree->SetBranchAddress(edm::poolNames::parameterSetMapBranchName().c_str(), &psetMapPtr);
397  } else {
398  TTree* psetTree = dynamic_cast<TTree *>(iFile.Get(edm::poolNames::parameterSetsTreeName().c_str()));
399  if(nullptr == psetTree) {
401  << " in the input file.\n";
402  }
403  typedef std::pair<edm::ParameterSetID, edm::ParameterSetBlob> IdToBlobs;
404  IdToBlobs idToBlob;
405  IdToBlobs* pIdToBlob = &idToBlob;
406  psetTree->SetBranchAddress(edm::poolNames::idToParameterSetBlobsBranchName().c_str(), &pIdToBlob);
407  for(long long i = 0; i != psetTree->GetEntries(); ++i) {
408  psetTree->GetEntry(i);
409  psetMap.insert(idToBlob);
410  }
411  }
412 
414  edm::ProcessHistoryRegistry::vector_type *pHistVectorPtr = &pHistVector;
415  if(metaDataTree->FindBranch(edm::poolNames::processHistoryBranchName().c_str()) != nullptr) {
416  metaDataTree->SetBranchAddress(edm::poolNames::processHistoryBranchName().c_str(), &pHistVectorPtr);
417  }
418 
419 
420  edm::ProcessConfigurationVector procConfigVector;
421  edm::ProcessConfigurationVector* procConfigVectorPtr = &procConfigVector;
422  if(metaDataTree->FindBranch(edm::poolNames::processConfigurationBranchName().c_str()) != nullptr) {
423  metaDataTree->SetBranchAddress(edm::poolNames::processConfigurationBranchName().c_str(), &procConfigVectorPtr);
424  }
425 
426  auto branchIDListsHelper = std::make_shared<edm::BranchIDListHelper>();
427  edm::BranchIDLists const* branchIDListsPtr = &branchIDListsHelper->branchIDLists();
428  if(metaDataTree->FindBranch(edm::poolNames::branchIDListBranchName().c_str()) != nullptr) {
429  metaDataTree->SetBranchAddress(edm::poolNames::branchIDListBranchName().c_str(), &branchIDListsPtr);
430  }
431 
432  metaDataTree->GetEntry(0);
433 
434  for(auto& prod : m_->reg_->productListUpdator()) {
435  prod.second.init();
436  }
437 
438  // Merge into the registries. For now, we do NOT merge the product registry.
440  for(auto const& entry : psetMap) {
441  edm::ParameterSet pset(entry.second.pset());
442  pset.setID(entry.first);
443  psetRegistry.insertMapped(pset);
444  }
445 
446  for(auto const& ph : pHistVector) {
447  m_->phreg_->registerProcessHistory(ph);
448  }
449 
450  m_->pointerToBranchBuffer_.erase(m_->pointerToBranchBuffer_.begin(),
451  m_->pointerToBranchBuffer_.end());
452 
453  std::unique_ptr<edm::ProductRegistry> newReg = std::make_unique<edm::ProductRegistry>();
454 
455  edm::ProductRegistry::ProductList& prodList = m_->reg_->productListUpdator();
456  {
457  for(auto& item : prodList) {
458  edm::BranchDescription& prod = item.second;
459  //std::cout << "productname = " << item.second << " end " << std::endl;
460  std::string newFriendlyName = edm::friendlyname::friendlyName(prod.className());
461  if(newFriendlyName == prod.friendlyClassName()) {
462  newReg->copyProduct(prod);
463  } else {
464  if(m_->fileFormatVersion_.splitProductIDs()) {
466  << "Cannot change friendly class name algorithm without more development work\n"
467  << "to update BranchIDLists. Contact the framework group.\n";
468  }
469  edm::BranchDescription newBD(prod);
470  newBD.updateFriendlyClassName();
471  newReg->copyProduct(newBD);
472  }
473  prod.init();
474  }
475 
476  m_->reg().reset(newReg.release());
477  }
478 
479  edm::ProductRegistry::ProductList& prodList2 = m_->reg_->productListUpdator();
480  std::vector<edm::EventEntryDescription> temp(prodList2.size(), edm::EventEntryDescription());
481  m_->prov_.swap(temp);
482  m_->pointerToBranchBuffer_.reserve(prodList2.size());
483 
484  for(auto& item : prodList2) {
485  edm::BranchDescription& prod = item.second;
486  if(prod.branchType() == edm::InEvent) {
487  prod.init();
488  //NEED to do this and check to see if branch exists
489  if(m_->tree_->GetBranch(prod.branchName().c_str()) == nullptr) {
490  prod.setDropped(true);
491  }
492 
493  //std::cout << "id " << it->first << " branch " << it->second << std::endl;
494  //m_->pointerToBranchBuffer_.push_back(&(*itB));
495  //void* tmp = &(m_->pointerToBranchBuffer_.back());
496  //edm::EventEntryDescription* tmp = &(*itB);
497  //CDJ need to fix provenance and be backwards compatible, for now just don't read the branch
498  //m_->metaTree_->SetBranchAddress(prod.branchName().c_str(), tmp);
499  }
500  }
501  m_->branchIDListHelper_->updateFromInput(*branchIDListsPtr);
502  m_->reg_->setFrozen();
503  m_->bidToDesc_->clear();
504  for(auto const&p: m_->reg_->productList()) {
505  m_->bidToDesc_->emplace(p.second.branchID().id(),&p.second);
506  }
507  m_->ep_ = std::make_shared<edm::EventPrincipal>(m_->reg(), m_->branchIDListHelper(), m_->thinnedAssociationsHelper(), m_->pc_, nullptr);
508  everythingOK_ = true;
509 }
std::string const & idToParameterSetBlobsBranchName()
Definition: BranchType.cc:255
std::vector< ProcessConfiguration > ProcessConfigurationVector
std::string const & branchName() const
BranchType const & branchType() const
std::vector< BranchIDList > BranchIDLists
Definition: BranchIDList.h:19
edm::propagate_const< std::shared_ptr< edm::root::TFWLiteSelectorMembers > > m_
std::map< BranchKey, BranchDescription > ProductList
std::string const & fileFormatVersionBranchName()
Definition: BranchType.cc:218
std::string const & parameterSetsTreeName()
Definition: BranchType.cc:251
std::string const & className() const
std::string friendlyName(std::string const &iFullName)
std::string const & friendlyClassName() const
void setDropped(bool isDropped)
bool insertMapped(value_type const &v, bool forceUpdate=false)
Definition: Registry.cc:36
std::string const & metaDataTreeName()
Definition: BranchType.cc:168
std::string const & parameterSetMapBranchName()
Definition: BranchType.cc:183
std::string const & processHistoryBranchName()
Definition: BranchType.cc:198
std::string const & productDescriptionBranchName()
Definition: BranchType.cc:173
std::string const & processConfigurationBranchName()
Definition: BranchType.cc:203
std::string const & branchIDListBranchName()
Definition: BranchType.cc:208
static Registry * instance()
Definition: Registry.cc:13
void TFWLiteSelectorBasic::SlaveBegin ( TTree *  iTree)
overrideprivate

Definition at line 240 of file TFWLiteSelectorBasic.cc.

References Init(), and preProcessing().

240  {
241  Init(iTree);
242  preProcessing(fInput, *fOutput);
243 }
virtual void preProcessing(const TList *in, TList &out)=0
void Init(TTree *) override
void TFWLiteSelectorBasic::SlaveTerminate ( )
overrideprivate

Definition at line 362 of file TFWLiteSelectorBasic.cc.

References postProcessing().

362  {
363  postProcessing(*fOutput);
364 }
virtual void postProcessing(TList &out)=0
virtual void TFWLiteSelectorBasic::terminate ( TList &  out)
pure virtual

Called each time the 'client' has finished processing.

Parameters
outcontains the accumulated output of all slaves.

Implemented in __class__< T >, tfwliteselectortest::ThingsTSelector2, examples::TrackTSelector, and tfwliteselectortest::ThingsTSelector.

Referenced by Terminate().

void TFWLiteSelectorBasic::Terminate ( )
overrideprivate

Definition at line 367 of file TFWLiteSelectorBasic.cc.

References terminate().

367  {
368  terminate(*fOutput);
369 }
virtual void terminate(TList &out)=0
Int_t TFWLiteSelectorBasic::Version ( ) const
inlineoverrideprivate

Definition at line 96 of file TFWLiteSelectorBasic.h.

96 { return 1; }

Member Data Documentation

bool TFWLiteSelectorBasic::everythingOK_
private

Definition at line 101 of file TFWLiteSelectorBasic.h.

Referenced by Notify(), Process(), and setupNewFile().

edm::propagate_const<std::shared_ptr<edm::root::TFWLiteSelectorMembers> > TFWLiteSelectorBasic::m_
private

Definition at line 100 of file TFWLiteSelectorBasic.h.

Referenced by Init(), Notify(), Process(), and setupNewFile().