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 ()
 
virtual ~TFWLiteSelectorBasic ()
 

Private Member Functions

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

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 204 of file TFWLiteSelectorBasic.cc.

205  everythingOK_(false) {
206 }
edm::propagate_const< std::shared_ptr< edm::root::TFWLiteSelectorMembers > > m_
TFWLiteSelectorBasic::~TFWLiteSelectorBasic ( )
virtual

Definition at line 213 of file TFWLiteSelectorBasic.cc.

213  {
214 }
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)
privatevirtual

Definition at line 232 of file TFWLiteSelectorBasic.cc.

References begin(), and Init().

232  {
233  Init(iTree);
234  begin(fInput);
235 }
virtual void Init(TTree *)
virtual void begin(TList *&in)=0
void TFWLiteSelectorBasic::Init ( TTree *  iTree)
privatevirtual

Definition at line 244 of file TFWLiteSelectorBasic.cc.

References m_.

Referenced by Begin(), and SlaveBegin().

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

Definition at line 251 of file TFWLiteSelectorBasic.cc.

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

251  {
252  //std::cout << "Notify start" << std::endl;
253  //we have switched to a new file
254  //get new file from Tree
255  if(nullptr == m_->tree_) {
256  std::cout << "No tree" << std::endl;
257  return kFALSE;
258  }
259  TFile* file = m_->tree_->GetCurrentFile();
260  if(nullptr == file) {
261  //When in Rome, do as the Romans
262  TChain* chain = dynamic_cast<TChain*>(m_->tree());
263  if(nullptr == chain) {
264  std::cout << "No file" << std::endl;
265  return kFALSE;
266  }
267  file = chain->GetFile();
268  if(nullptr == file) {
269  std::cout << "No file" << std::endl;
270  return kFALSE;
271  }
272  }
273  setupNewFile(*file);
274  return everythingOK_ ? kTRUE: kFALSE;
275 }
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)
privatevirtual

Definition at line 289 of file TFWLiteSelectorBasic.cc.

References printConversionInfo::aux, 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().

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

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

Definition at line 238 of file TFWLiteSelectorBasic.cc.

References Init(), and preProcessing().

238  {
239  Init(iTree);
240  preProcessing(fInput, *fOutput);
241 }
virtual void preProcessing(const TList *in, TList &out)=0
virtual void Init(TTree *)
void TFWLiteSelectorBasic::SlaveTerminate ( )
privatevirtual

Definition at line 360 of file TFWLiteSelectorBasic.cc.

References postProcessing().

360  {
361  postProcessing(*fOutput);
362 }
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 ( )
privatevirtual

Definition at line 365 of file TFWLiteSelectorBasic.cc.

References terminate().

365  {
366  terminate(*fOutput);
367 }
virtual void terminate(TList &out)=0
virtual Int_t TFWLiteSelectorBasic::Version ( ) const
inlineprivatevirtual

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().