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_
 
boost::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 162 of file TFWLiteSelectorBasic.cc.

163  everythingOK_(false) {
164 }
boost::shared_ptr< edm::root::TFWLiteSelectorMembers > m_
TFWLiteSelectorBasic::~TFWLiteSelectorBasic ( )
virtual

Definition at line 171 of file TFWLiteSelectorBasic.cc.

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

References begin(), and Init().

190  {
191  Init(iTree);
192  begin(fInput);
193 }
virtual void Init(TTree *)
virtual void begin(TList *&in)=0
void TFWLiteSelectorBasic::Init ( TTree *  iTree)
privatevirtual

Definition at line 202 of file TFWLiteSelectorBasic.cc.

References m_.

Referenced by Begin(), and SlaveBegin().

202  {
203  if(iTree == nullptr) return;
204  m_->setTree(iTree);
205 }
boost::shared_ptr< edm::root::TFWLiteSelectorMembers > m_
Bool_t TFWLiteSelectorBasic::Notify ( )
privatevirtual

Definition at line 209 of file TFWLiteSelectorBasic.cc.

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

209  {
210  //std::cout << "Notify start" << std::endl;
211  //we have switched to a new file
212  //get new file from Tree
213  if(nullptr == m_->tree_) {
214  std::cout << "No tree" << std::endl;
215  return kFALSE;
216  }
217  TFile* file = m_->tree_->GetCurrentFile();
218  if(nullptr == file) {
219  //When in Rome, do as the Romans
220  TChain* chain = dynamic_cast<TChain*>(m_->tree_);
221  if(nullptr == chain) {
222  std::cout << "No file" << std::endl;
223  return kFALSE;
224  }
225  file = chain->GetFile();
226  if(nullptr == file) {
227  std::cout << "No file" << std::endl;
228  return kFALSE;
229  }
230  }
231  setupNewFile(*file);
232  return everythingOK_ ? kTRUE: kFALSE;
233 }
boost::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 247 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().

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

Definition at line 330 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().

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

Definition at line 196 of file TFWLiteSelectorBasic.cc.

References Init(), and preProcessing().

196  {
197  Init(iTree);
198  preProcessing(fInput, *fOutput);
199 }
virtual void preProcessing(const TList *in, TList &out)=0
virtual void Init(TTree *)
void TFWLiteSelectorBasic::SlaveTerminate ( )
privatevirtual

Definition at line 320 of file TFWLiteSelectorBasic.cc.

References postProcessing().

320  {
321  postProcessing(*fOutput);
322 }
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 325 of file TFWLiteSelectorBasic.cc.

References terminate().

325  {
326  terminate(*fOutput);
327 }
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().

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

Definition at line 99 of file TFWLiteSelectorBasic.h.

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