CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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_
 
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 43 of file TFWLiteSelectorBasic.h.

Constructor & Destructor Documentation

TFWLiteSelectorBasic::TFWLiteSelectorBasic ( )

Definition at line 181 of file TFWLiteSelectorBasic.cc.

182  everythingOK_(false) {
183 }
std::shared_ptr< edm::root::TFWLiteSelectorMembers > m_
TFWLiteSelectorBasic::~TFWLiteSelectorBasic ( )
virtual

Definition at line 190 of file TFWLiteSelectorBasic.cc.

190  {
191 }
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 209 of file TFWLiteSelectorBasic.cc.

References begin(), and Init().

209  {
210  Init(iTree);
211  begin(fInput);
212 }
virtual void Init(TTree *)
virtual void begin(TList *&in)=0
void TFWLiteSelectorBasic::Init ( TTree *  iTree)
privatevirtual

Definition at line 221 of file TFWLiteSelectorBasic.cc.

References m_.

Referenced by Begin(), and SlaveBegin().

221  {
222  if(iTree == nullptr) return;
223  m_->setTree(iTree);
224 }
std::shared_ptr< edm::root::TFWLiteSelectorMembers > m_
Bool_t TFWLiteSelectorBasic::Notify ( )
privatevirtual

Definition at line 228 of file TFWLiteSelectorBasic.cc.

References chain::chain, gather_cfg::cout, everythingOK_, mergeVDriftHistosByStation::file, m_, and setupNewFile().

228  {
229  //std::cout << "Notify start" << std::endl;
230  //we have switched to a new file
231  //get new file from Tree
232  if(nullptr == m_->tree_) {
233  std::cout << "No tree" << std::endl;
234  return kFALSE;
235  }
236  TFile* file = m_->tree_->GetCurrentFile();
237  if(nullptr == file) {
238  //When in Rome, do as the Romans
239  TChain* chain = dynamic_cast<TChain*>(m_->tree_);
240  if(nullptr == chain) {
241  std::cout << "No file" << std::endl;
242  return kFALSE;
243  }
244  file = chain->GetFile();
245  if(nullptr == file) {
246  std::cout << "No file" << std::endl;
247  return kFALSE;
248  }
249  }
250  setupNewFile(*file);
251  return everythingOK_ ? kTRUE: kFALSE;
252 }
tuple chain
Definition: chain.py:105
std::shared_ptr< edm::root::TFWLiteSelectorMembers > m_
tuple cout
Definition: gather_cfg.py:121
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 266 of file TFWLiteSelectorBasic.cc.

References printConversionInfo::aux, edm::poolNames::branchListIndexesBranchName(), edm::BranchTypeToAuxiliaryBranchName(), gather_cfg::cout, event(), edm::poolNames::eventSelectionsBranchName(), everythingOK_, cppFunctionSkipper::exception, edm::hlt::Exception, edm::errors::FatalRootError, edm::InEvent, m_, process(), edm::EventAuxiliary::run(), and edm::EventAuxiliary::time().

266  {
267  //std::cout << "Process start" << std::endl;
268  if(everythingOK_) {
269  std::auto_ptr<edm::EventAuxiliary> eaux(new edm::EventAuxiliary());
270  edm::EventAuxiliary& aux = *eaux;
271  edm::EventAuxiliary* pAux= eaux.get();
272  TBranch* branch = m_->tree_->GetBranch(edm::BranchTypeToAuxiliaryBranchName(edm::InEvent).c_str());
273 
274  branch->SetAddress(&pAux);
275  branch->GetEntry(iEntry);
276 
277 //NEW m_->processNames_ = aux.processHistory();
278 
279 // std::cout << "ProcessNames\n";
280 // for(auto const& name : m_->processNames_) {
281 // std::cout << " " << name << std::endl;
282 // }
283 
284  edm::EventSelectionIDVector eventSelectionIDs;
285  edm::EventSelectionIDVector* pEventSelectionIDVector = &eventSelectionIDs;
286  TBranch* eventSelectionsBranch = m_->tree_->GetBranch(edm::poolNames::eventSelectionsBranchName().c_str());
287  if(!eventSelectionsBranch) {
289  << "Failed to find event Selections branch in event tree";
290  }
291  eventSelectionsBranch->SetAddress(&pEventSelectionIDVector);
292  eventSelectionsBranch->GetEntry(iEntry);
293 
294  edm::BranchListIndexes branchListIndexes;
295  edm::BranchListIndexes* pBranchListIndexes = &branchListIndexes;
296  TBranch* branchListIndexBranch = m_->tree_->GetBranch(edm::poolNames::branchListIndexesBranchName().c_str());
297  if(!branchListIndexBranch) {
299  << "Failed to find branch list index branch in event tree";
300  }
301  branchListIndexBranch->SetAddress(&pBranchListIndexes);
302  branchListIndexBranch->GetEntry(iEntry);
303  m_->branchIDListHelper_->fixBranchListIndexes(branchListIndexes);
304 
305  try {
306  m_->reader_->setEntry(iEntry);
307  auto runAux = std::make_shared<edm::RunAuxiliary>(aux.run(), aux.time(), aux.time());
308  auto rp = std::make_shared<edm::RunPrincipal>(runAux, m_->reg_, m_->pc_, nullptr, 0);
309  auto lumiAux = std::make_shared<edm::LuminosityBlockAuxiliary>(rp->run(), 1, aux.time(), aux.time());
310  auto lbp = std::make_shared<edm::LuminosityBlockPrincipal>(lumiAux, m_->reg_, m_->pc_, nullptr, 0);
311  m_->ep_->fillEventPrincipal(*eaux,
312  *m_->phreg_,
313  std::move(eventSelectionIDs),
314  std::move(branchListIndexes),
315  *(m_->provRetriever_),
316  m_->reader_.get());
317  lbp->setRunPrincipal(rp);
318  m_->ep_->setLuminosityBlockPrincipal(lbp);
319  m_->processNames_ = m_->ep_->processHistory();
320 
321  edm::Event event(*m_->ep_, m_->md_, nullptr);
322 
323  //Make the event principal accessible to edm::Ref's
324  Operate sentry(m_->ep_->prodGetter());
325  process(event);
326  } catch(std::exception const& iEx) {
327  std::cout << "While processing entry " << iEntry << " the following exception was caught \n"
328  << iEx.what() << std::endl;
329  } catch(...) {
330  std::cout << "While processing entry " << iEntry << " an unknown exception was caught" << std::endl;
331  }
332  }
333  return everythingOK_ ? kTRUE: kFALSE;
334 }
std::string const & BranchTypeToAuxiliaryBranchName(BranchType const &branchType)
Definition: BranchType.cc:115
Timestamp const & time() const
RunNumber_t run() const
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
std::shared_ptr< edm::root::TFWLiteSelectorMembers > m_
tuple cout
Definition: gather_cfg.py:121
std::string const & branchListIndexesBranchName()
Definition: BranchType.cc:247
void TFWLiteSelectorBasic::setupNewFile ( TFile &  iFile)
private

Definition at line 347 of file TFWLiteSelectorBasic.cc.

References edm::poolNames::branchIDListBranchName(), edm::BranchDescription::branchName(), edm::BranchDescription::branchType(), edm::BranchDescription::className(), gather_cfg::cout, everythingOK_, edm::hlt::Exception, edm::poolNames::fileFormatVersionBranchName(), edm::errors::FileReadError, edm::BranchDescription::friendlyClassName(), edm::friendlyname::friendlyName(), 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(), edm::BranchDescription::setDropped(), edm::ParameterSet::setID(), AlCaHLTBitMon_QueryRunRegistry::string, groupFilesInBlocks::temp, edm::errors::UnimplementedFeature, and edm::BranchDescription::updateFriendlyClassName().

Referenced by Notify().

347  {
348  //look up meta-data
349  //get product registry
350 
351  //std::vector<edm::EventProcessHistoryID> eventProcessHistoryIDs_;
352  TTree* metaDataTree = dynamic_cast<TTree*>(iFile.Get(edm::poolNames::metaDataTreeName().c_str()));
353  if(!metaDataTree) {
354  std::cout << "could not find TTree " << edm::poolNames::metaDataTreeName() << std::endl;
355  everythingOK_ = false;
356  return;
357  }
358  edm::FileFormatVersion* fftPtr = &(m_->fileFormatVersion_);
359  if(metaDataTree->FindBranch(edm::poolNames::fileFormatVersionBranchName().c_str()) != nullptr) {
360  metaDataTree->SetBranchAddress(edm::poolNames::fileFormatVersionBranchName().c_str(), &fftPtr);
361  }
362 
363 
364  edm::ProductRegistry* pReg = &(*m_->reg_);
365  metaDataTree->SetBranchAddress(edm::poolNames::productDescriptionBranchName().c_str(), &(pReg));
366 
367  typedef std::map<edm::ParameterSetID, edm::ParameterSetBlob> PsetMap;
368  PsetMap psetMap;
369  PsetMap *psetMapPtr = &psetMap;
370  if(metaDataTree->FindBranch(edm::poolNames::parameterSetMapBranchName().c_str()) != nullptr) {
371  metaDataTree->SetBranchAddress(edm::poolNames::parameterSetMapBranchName().c_str(), &psetMapPtr);
372  } else {
373  TTree* psetTree = dynamic_cast<TTree *>(iFile.Get(edm::poolNames::parameterSetsTreeName().c_str()));
374  if(nullptr == psetTree) {
376  << " in the input file.\n";
377  }
378  typedef std::pair<edm::ParameterSetID, edm::ParameterSetBlob> IdToBlobs;
379  IdToBlobs idToBlob;
380  IdToBlobs* pIdToBlob = &idToBlob;
381  psetTree->SetBranchAddress(edm::poolNames::idToParameterSetBlobsBranchName().c_str(), &pIdToBlob);
382  for(long long i = 0; i != psetTree->GetEntries(); ++i) {
383  psetTree->GetEntry(i);
384  psetMap.insert(idToBlob);
385  }
386  }
387 
389  edm::ProcessHistoryRegistry::vector_type *pHistVectorPtr = &pHistVector;
390  if(metaDataTree->FindBranch(edm::poolNames::processHistoryBranchName().c_str()) != nullptr) {
391  metaDataTree->SetBranchAddress(edm::poolNames::processHistoryBranchName().c_str(), &pHistVectorPtr);
392  }
393 
394 
395  edm::ProcessConfigurationVector procConfigVector;
396  edm::ProcessConfigurationVector* procConfigVectorPtr = &procConfigVector;
397  if(metaDataTree->FindBranch(edm::poolNames::processConfigurationBranchName().c_str()) != nullptr) {
398  metaDataTree->SetBranchAddress(edm::poolNames::processConfigurationBranchName().c_str(), &procConfigVectorPtr);
399  }
400 
401  auto branchIDListsHelper = std::make_shared<edm::BranchIDListHelper>();
402  edm::BranchIDLists const* branchIDListsPtr = &branchIDListsHelper->branchIDLists();
403  if(metaDataTree->FindBranch(edm::poolNames::branchIDListBranchName().c_str()) != nullptr) {
404  metaDataTree->SetBranchAddress(edm::poolNames::branchIDListBranchName().c_str(), &branchIDListsPtr);
405  }
406 
407  metaDataTree->GetEntry(0);
408 
409  for(auto& prod : m_->reg_->productListUpdator()) {
410  prod.second.init();
411  }
412 
413  // Merge into the registries. For now, we do NOT merge the product registry.
415  for(auto const& entry : psetMap) {
416  edm::ParameterSet pset(entry.second.pset());
417  pset.setID(entry.first);
418  psetRegistry.insertMapped(pset);
419  }
420 
421  for(auto const& ph : pHistVector) {
422  m_->phreg_->registerProcessHistory(ph);
423  }
424 
425  m_->pointerToBranchBuffer_.erase(m_->pointerToBranchBuffer_.begin(),
426  m_->pointerToBranchBuffer_.end());
427 
428  std::auto_ptr<edm::ProductRegistry> newReg(new edm::ProductRegistry());
429 
430  edm::ProductRegistry::ProductList& prodList = m_->reg_->productListUpdator();
431  {
432  for(auto& item : prodList) {
433  edm::BranchDescription& prod = item.second;
434  //std::cout << "productname = " << item.second << " end " << std::endl;
435  std::string newFriendlyName = edm::friendlyname::friendlyName(prod.className());
436  if(newFriendlyName == prod.friendlyClassName()) {
437  newReg->copyProduct(prod);
438  } else {
439  if(m_->fileFormatVersion_.splitProductIDs()) {
441  << "Cannot change friendly class name algorithm without more development work\n"
442  << "to update BranchIDLists. Contact the framework group.\n";
443  }
444  edm::BranchDescription newBD(prod);
445  newBD.updateFriendlyClassName();
446  newReg->copyProduct(newBD);
447  }
448  prod.init();
449  }
450 
451  m_->reg_.reset(newReg.release());
452  }
453 
454  edm::ProductRegistry::ProductList& prodList2 = m_->reg_->productListUpdator();
455  std::vector<edm::EventEntryDescription> temp(prodList2.size(), edm::EventEntryDescription());
456  m_->prov_.swap(temp);
457  m_->pointerToBranchBuffer_.reserve(prodList2.size());
458 
459  for(auto& item : prodList2) {
460  edm::BranchDescription& prod = item.second;
461  if(prod.branchType() == edm::InEvent) {
462  prod.init();
463  //NEED to do this and check to see if branch exists
464  if(m_->tree_->GetBranch(prod.branchName().c_str()) == nullptr) {
465  prod.setDropped(true);
466  }
467 
468  //std::cout << "id " << it->first << " branch " << it->second << std::endl;
469  //m_->pointerToBranchBuffer_.push_back(&(*itB));
470  //void* tmp = &(m_->pointerToBranchBuffer_.back());
471  //edm::EventEntryDescription* tmp = &(*itB);
472  //CDJ need to fix provenance and be backwards compatible, for now just don't read the branch
473  //m_->metaTree_->SetBranchAddress(prod.branchName().c_str(), tmp);
474  }
475  }
476  m_->branchIDListHelper_->updateFromInput(*branchIDListsPtr);
477  m_->reg_->setFrozen();
478  m_->ep_.reset(new edm::EventPrincipal(m_->reg_, m_->branchIDListHelper_, m_->thinnedAssociationsHelper_, m_->pc_, nullptr));
479  everythingOK_ = true;
480 }
void setID(ParameterSetID const &id)
std::string const & idToParameterSetBlobsBranchName()
Definition: BranchType.cc:255
std::vector< ProcessConfiguration > ProcessConfigurationVector
int i
Definition: DBlmapReader.cc:9
std::string const & branchName() const
BranchType const & branchType() const
std::vector< BranchIDList > BranchIDLists
Definition: BranchIDList.h:19
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)
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::shared_ptr< edm::root::TFWLiteSelectorMembers > m_
tuple cout
Definition: gather_cfg.py:121
std::string const & branchIDListBranchName()
Definition: BranchType.cc:208
bool insertMapped(value_type const &v)
Definition: Registry.cc:39
static Registry * instance()
Definition: Registry.cc:16
void TFWLiteSelectorBasic::SlaveBegin ( TTree *  iTree)
privatevirtual

Definition at line 215 of file TFWLiteSelectorBasic.cc.

References Init(), and preProcessing().

215  {
216  Init(iTree);
217  preProcessing(fInput, *fOutput);
218 }
virtual void preProcessing(const TList *in, TList &out)=0
virtual void Init(TTree *)
void TFWLiteSelectorBasic::SlaveTerminate ( )
privatevirtual

Definition at line 337 of file TFWLiteSelectorBasic.cc.

References postProcessing().

337  {
338  postProcessing(*fOutput);
339 }
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 342 of file TFWLiteSelectorBasic.cc.

References terminate().

342  {
343  terminate(*fOutput);
344 }
virtual void terminate(TList &out)=0
virtual Int_t TFWLiteSelectorBasic::Version ( ) const
inlineprivatevirtual

Definition at line 97 of file TFWLiteSelectorBasic.h.

97 { return 1; }

Member Data Documentation

bool TFWLiteSelectorBasic::everythingOK_
private

Definition at line 102 of file TFWLiteSelectorBasic.h.

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

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

Definition at line 101 of file TFWLiteSelectorBasic.h.

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