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

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

Definition at line 164 of file TFWLiteSelectorBasic.cc.

164  {
165 }
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 183 of file TFWLiteSelectorBasic.cc.

References begin(), and Init().

183  {
184  Init(iTree);
185  begin(fInput);
186 }
virtual void Init(TTree *)
virtual void begin(TList *&in)=0
void TFWLiteSelectorBasic::Init ( TTree *  iTree)
privatevirtual

Definition at line 195 of file TFWLiteSelectorBasic.cc.

References m_.

Referenced by Begin(), and SlaveBegin().

195  {
196  if(iTree == 0) return;
197  m_->setTree(iTree);
198 }
boost::shared_ptr< edm::root::TFWLiteSelectorMembers > m_
Bool_t TFWLiteSelectorBasic::Notify ( )
privatevirtual

Definition at line 202 of file TFWLiteSelectorBasic.cc.

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

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

240  {
241  //std::cout << "Process start" << std::endl;
242  if(everythingOK_) {
243  std::auto_ptr<edm::EventAuxiliary> eaux(new edm::EventAuxiliary());
244  edm::EventAuxiliary& aux = *eaux;
245  edm::EventAuxiliary* pAux= eaux.get();
246  TBranch* branch = m_->tree_->GetBranch(edm::BranchTypeToAuxiliaryBranchName(edm::InEvent).c_str());
247 
248  branch->SetAddress(&pAux);
249  branch->GetEntry(iEntry);
250 
251 //NEW m_->processNames_ = aux.processHistory();
252 
253 // std::cout << "ProcessNames\n";
254 // for(edm::ProcessNameList::const_iterator itName = m_->processNames_.begin(),
255 // itNameEnd = m_->processNames_.end();
256 // itName != itNameEnd;
257 // ++itName) {
258 // std::cout << " " << *itName << std::endl;
259 // }
260 
261  boost::shared_ptr<edm::EventSelectionIDVector> eventSelectionIDs_(new edm::EventSelectionIDVector);
262  edm::EventSelectionIDVector* pEventSelectionIDVector = eventSelectionIDs_.get();
263  TBranch* eventSelectionsBranch = m_->tree_->GetBranch(edm::poolNames::eventSelectionsBranchName().c_str());
264  if(!eventSelectionsBranch) {
266  << "Failed to find event Selections branch in event tree";
267  }
268  eventSelectionsBranch->SetAddress(&pEventSelectionIDVector);
269  eventSelectionsBranch->GetEntry(iEntry);
270 
271  boost::shared_ptr<edm::BranchListIndexes> branchListIndexes_(new edm::BranchListIndexes);
272  edm::BranchListIndexes* pBranchListIndexes = branchListIndexes_.get();
273  TBranch* branchListIndexBranch = m_->tree_->GetBranch(edm::poolNames::branchListIndexesBranchName().c_str());
274  if(!branchListIndexBranch) {
276  << "Failed to find branch list index branch in event tree";
277  }
278  branchListIndexBranch->SetAddress(&pBranchListIndexes);
279  branchListIndexBranch->GetEntry(iEntry);
280  m_->branchIDListHelper_->fixBranchListIndexes(*branchListIndexes_);
281 
282  try {
283  m_->reader_->setEntry(iEntry);
284  boost::shared_ptr<edm::RunAuxiliary> runAux(new edm::RunAuxiliary(aux.run(), aux.time(), aux.time()));
285  boost::shared_ptr<edm::RunPrincipal> rp(new edm::RunPrincipal(runAux, m_->reg_, m_->pc_, nullptr));
286  boost::shared_ptr<edm::LuminosityBlockAuxiliary> lumiAux(
287  new edm::LuminosityBlockAuxiliary(rp->run(), 1, aux.time(), aux.time()));
288  boost::shared_ptr<edm::LuminosityBlockPrincipal>lbp(
289  new edm::LuminosityBlockPrincipal(lumiAux, m_->reg_, m_->pc_, nullptr));
290  m_->ep_->fillEventPrincipal(*eaux, eventSelectionIDs_, branchListIndexes_, m_->mapper_, m_->reader_.get());
291  lbp->setRunPrincipal(rp);
292  m_->ep_->setLuminosityBlockPrincipal(lbp);
293  m_->processNames_ = m_->ep_->processHistory();
294 
295  edm::Event event(*m_->ep_, m_->md_);
296 
297  //Make the event principal accessible to edm::Ref's
298  Operate sentry(m_->ep_->prodGetter());
299  process(event);
300  } catch(std::exception const& iEx) {
301  std::cout << "While processing entry " << iEntry << " the following exception was caught \n"
302  << iEx.what() << std::endl;
303  } catch(...) {
304  std::cout << "While processing entry " << iEntry << " an unknown exception was caught" << std::endl;
305  }
306  }
307  return everythingOK_ ? kTRUE: kFALSE;
308 }
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 321 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::fillProductRegistryTransients(), edm::BranchDescription::friendlyClassName(), edm::friendlyname::friendlyName(), i, edm::poolNames::idToParameterSetBlobsBranchName(), edm::InEvent, edm::BranchDescription::init(), edm::detail::ThreadSafeRegistry< KEY, T, E >::insertCollection(), edm::detail::ThreadSafeRegistry< KEY, T, E >::insertMapped(), edm::detail::ThreadSafeRegistry< KEY, T, E >::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().

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

Definition at line 189 of file TFWLiteSelectorBasic.cc.

References Init(), and preProcessing().

189  {
190  Init(iTree);
191  preProcessing(fInput, *fOutput);
192 }
virtual void preProcessing(const TList *in, TList &out)=0
virtual void Init(TTree *)
void TFWLiteSelectorBasic::SlaveTerminate ( )
privatevirtual

Definition at line 311 of file TFWLiteSelectorBasic.cc.

References postProcessing().

311  {
312  postProcessing(*fOutput);
313 }
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 316 of file TFWLiteSelectorBasic.cc.

References terminate().

316  {
317  terminate(*fOutput);
318 }
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().