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 41 of file TFWLiteSelectorBasic.h.

Constructor & Destructor Documentation

TFWLiteSelectorBasic::TFWLiteSelectorBasic ( )

Definition at line 185 of file TFWLiteSelectorBasic.cc.

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

Definition at line 194 of file TFWLiteSelectorBasic.cc.

194  {
195 }
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 213 of file TFWLiteSelectorBasic.cc.

References begin(), and Init().

213  {
214  Init(iTree);
215  begin(fInput);
216 }
virtual void Init(TTree *)
virtual void begin(TList *&in)=0
void TFWLiteSelectorBasic::Init ( TTree *  iTree)
privatevirtual

Definition at line 225 of file TFWLiteSelectorBasic.cc.

References m_.

Referenced by Begin(), and SlaveBegin().

225  {
226  if(iTree == nullptr) return;
227  m_->setTree(iTree);
228 }
std::shared_ptr< edm::root::TFWLiteSelectorMembers > m_
Bool_t TFWLiteSelectorBasic::Notify ( )
privatevirtual

Definition at line 232 of file TFWLiteSelectorBasic.cc.

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

232  {
233  //std::cout << "Notify start" << std::endl;
234  //we have switched to a new file
235  //get new file from Tree
236  if(nullptr == m_->tree_) {
237  std::cout << "No tree" << std::endl;
238  return kFALSE;
239  }
240  TFile* file = m_->tree_->GetCurrentFile();
241  if(nullptr == file) {
242  //When in Rome, do as the Romans
243  TChain* chain = dynamic_cast<TChain*>(m_->tree_);
244  if(nullptr == chain) {
245  std::cout << "No file" << std::endl;
246  return kFALSE;
247  }
248  file = chain->GetFile();
249  if(nullptr == file) {
250  std::cout << "No file" << std::endl;
251  return kFALSE;
252  }
253  }
254  setupNewFile(*file);
255  return everythingOK_ ? kTRUE: kFALSE;
256 }
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 270 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::InEvent, m_, process(), edm::EventAuxiliary::run(), and edm::EventAuxiliary::time().

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

References edm::poolNames::branchIDListBranchName(), edm::BranchDescription::branchName(), edm::BranchDescription::branchType(), edm::BranchDescription::className(), gather_cfg::cout, everythingOK_, 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().

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

Definition at line 219 of file TFWLiteSelectorBasic.cc.

References Init(), and preProcessing().

219  {
220  Init(iTree);
221  preProcessing(fInput, *fOutput);
222 }
virtual void preProcessing(const TList *in, TList &out)=0
virtual void Init(TTree *)
void TFWLiteSelectorBasic::SlaveTerminate ( )
privatevirtual

Definition at line 341 of file TFWLiteSelectorBasic.cc.

References postProcessing().

341  {
342  postProcessing(*fOutput);
343 }
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 346 of file TFWLiteSelectorBasic.cc.

References terminate().

346  {
347  terminate(*fOutput);
348 }
virtual void terminate(TList &out)=0
virtual Int_t TFWLiteSelectorBasic::Version ( ) const
inlineprivatevirtual

Definition at line 95 of file TFWLiteSelectorBasic.h.

95 { return 1; }

Member Data Documentation

bool TFWLiteSelectorBasic::everythingOK_
private

Definition at line 100 of file TFWLiteSelectorBasic.h.

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

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

Definition at line 99 of file TFWLiteSelectorBasic.h.

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