CMS 3D CMS Logo

Public Member Functions | Private Attributes

FWLiteJobMetadataManager Class Reference

#include <FWLiteJobMetadataManager.h>

Inheritance diagram for FWLiteJobMetadataManager:
FWJobMetadataManager

List of all members.

Public Member Functions

virtual bool doUpdate (FWJobMetadataUpdateRequest *request)
 FWLiteJobMetadataManager (void)

Private Attributes

const fwlite::Eventm_event

Detailed Description

Definition at line 13 of file FWLiteJobMetadataManager.h.


Constructor & Destructor Documentation

FWLiteJobMetadataManager::FWLiteJobMetadataManager ( void  )

Definition at line 12 of file FWLiteJobMetadataManager.cc.


Member Function Documentation

bool FWLiteJobMetadataManager::doUpdate ( FWJobMetadataUpdateRequest request) [virtual]

This method inspects the currently opened TFile and for each branch containing products for which we can either build a TCollectionProxy or for which we have a specialized accessor, it registers it as a viewable item.

Implements FWJobMetadataManager.

Definition at line 23 of file FWLiteJobMetadataManager.cc.

References edm::BranchDescription::branchName(), FWItemAccessorFactory::classAccessedAsCollection(), filterCSVwithJSON::copy, debug, FWLiteJobMetadataUpdateRequest::event_, dbtoweb::file, FWLiteJobMetadataUpdateRequest::file_, edm::BranchDescription::fullClassName(), fwLog, fwlite::Event::getBranchDescriptions(), fwlite::Event::getProcessHistory(), ExpressReco_HICollisions_FallBack::infos, fwlog::kDebug, fwlog::kWarning, m_event, FWJobMetadataManager::m_typeAndReps, edm::BranchDescription::moduleLabel(), FWJobMetadataManager::Data::moduleLabel_, edm::BranchDescription::present(), edm::BranchDescription::processName(), FWJobMetadataManager::Data::processName_, FWJobMetadataManager::processNamesInJob(), FWJobMetadataManager::Data::productInstanceLabel_, edm::BranchDescription::productInstanceName(), FWJobMetadataManager::Data::purpose_, FWTypeToRepresentations::representationsForType(), FWJobMetadataManager::Data::type_, and FWJobMetadataManager::usableData().

{
   FWLiteJobMetadataUpdateRequest *liteRequest 
      = dynamic_cast<FWLiteJobMetadataUpdateRequest *>(request);
   // There is no way we are going to get a non-FWLite updated request for
   // this class.
   assert(liteRequest);
   if (m_event == liteRequest->event_) 
      return false;

   m_event = liteRequest->event_;
   const TFile *file = liteRequest->file_;

   assert(file);
   
   usableData().clear();
   
   if (!m_event)
      return true;
   
   const std::vector<std::string>& history = m_event->getProcessHistory();
   
   // Turns out, in the online system we do sometimes gets files without any  
   // history, this really should be investigated
   if (history.empty())
      fwLog(fwlog::kWarning) << "WARNING: the file '"
         << file->GetName() << "' contains no processing history"
            " and therefore should have no accessible data";
   
   std::copy(history.rbegin(),history.rend(),
             std::back_inserter(processNamesInJob()));
   
   static const std::string s_blank;
   const std::vector<edm::BranchDescription>& descriptions =
      m_event->getBranchDescriptions();

   Data d;
   
   //I'm not going to modify TFile but I need to see what it is holding
   TTree* eventsTree = dynamic_cast<TTree*>(const_cast<TFile*>(file)->Get("Events"));
   assert(eventsTree);
   
   std::set<std::string> branchNamesInFile;
   TIter nextBranch(eventsTree->GetListOfBranches());
   while(TBranch* branch = static_cast<TBranch*>(nextBranch()))
      branchNamesInFile.insert(branch->GetName());
   
   typedef std::set<std::string> Purposes;
   Purposes purposes;
   std::string classType;
   
   for(size_t bi = 0, be = descriptions.size(); bi != be; ++bi) 
   {
      const edm::BranchDescription &desc = descriptions[bi];
      
      if (!desc.present() 
          || branchNamesInFile.end() == branchNamesInFile.find(desc.branchName()))
         continue;
      
      const std::vector<FWRepresentationInfo>& infos 
         = m_typeAndReps->representationsForType(desc.fullClassName());
      
      /*
      //std::cout <<"try to find match "<<itBranch->fullClassName()<<std::endl;
      //For each view we need to find the non-sub-part builder whose proximity is smallest and 
      // then register only that purpose
      //NOTE: for now, we will ignore the view and only look for the closest proximity
      unsigned int minProx = ~(0U);
      for (size_t ii = 0, ei = infos.size(); ii != ei; ++ii) {
      if (!infos[ii].representsSubPart() && minProx > infos[ii].proximity()) {
      minProx = infos[ii].proximity();
      }
      }
      */
      
      //the infos list can contain multiple items with the same purpose so we will just find
      // the unique ones
      purposes.clear();
      for (size_t ii = 0, ei = infos.size(); ii != ei; ++ii) {
         /* if(!infos[ii].representsSubPart() && minProx != infos[ii].proximity()) {
            continue;
            } */
         purposes.insert(infos[ii].purpose());
      }
      
      if (purposes.empty())
         purposes.insert("Table");
      
      for (Purposes::const_iterator itPurpose = purposes.begin(),
              itEnd = purposes.end();
           itPurpose != itEnd;
           ++itPurpose) 
      {
         // Determine whether or not the class can be iterated
         // either by using a TVirtualCollectionProxy (of the class 
         // itself or on one of its members), or by using a 
         // FWItemAccessor plugin.
         TClass* theClass = TClass::GetClass(desc.fullClassName().c_str());
         
         if (!theClass)
            continue;
      
         if (!theClass->GetTypeInfo())
            continue;
         
         const static bool debug = false;
         // This is pretty much the same thing that happens 
         if (!FWItemAccessorFactory::classAccessedAsCollection(theClass) )
         {
            if (debug) {
               fwLog(fwlog::kDebug) << theClass->GetName() 
                                    << " will not be displayed in table." << std::endl;
            }
            continue;
         }
         d.type_ = desc.fullClassName();
         d.purpose_ = *itPurpose;
         d.moduleLabel_ = desc.moduleLabel();
         d.productInstanceLabel_ = desc.productInstanceName();
         d.processName_ = desc.processName();
         usableData().push_back(d);
         if (debug)
         {
            fwLog(fwlog::kDebug) << "Add collection will display " << d.type_ 
                                 << " " << d.moduleLabel_ 
                                 << " " << d.productInstanceLabel_
                                 << " " << d.processName_ << std::endl;
         }
      }
   }
   return true;
}

Member Data Documentation

Definition at line 19 of file FWLiteJobMetadataManager.h.

Referenced by doUpdate().