CMS 3D CMS Logo

Public Types | Public Member Functions | Protected Member Functions | Private Member Functions | Private Attributes

edm::eventsetup::EventSetupRecordProvider Class Reference

#include <EventSetupRecordProvider.h>

Inheritance diagram for edm::eventsetup::EventSetupRecordProvider:
edm::eventsetup::EventSetupRecordProviderTemplate< T >

List of all members.

Public Types

typedef std::map< DataKey,
ComponentDescription
DataToPreferredProviderMap

Public Member Functions

void add (boost::shared_ptr< DataProxyProvider >)
void addFinder (boost::shared_ptr< EventSetupRecordIntervalFinder >)
 For now, only use one finder.
void addRecordTo (EventSetupProvider &)
void addRecordToIfValid (EventSetupProvider &, IOVSyncValue const &)
virtual std::set
< EventSetupRecordKey
dependentRecords () const
 Returns the list of Records the provided Record depends on (usually none)
 EventSetupRecordProvider (EventSetupRecordKey const &iKey)
boost::shared_ptr
< EventSetupRecordIntervalFinder
finder () const
EventSetupRecordKey const & key () const
boost::shared_ptr
< DataProxyProvider
proxyProvider (ComponentDescription const &) const
 returns the DataProxyProvider or a 'null' if not found
std::set< ComponentDescriptionproxyProviderDescriptions () const
 return information on which DataProxyProviders are supplying information
void resetProxies ()
 This will clear the cache's of all the Proxies so that next time they are called they will run.
void setDependentProviders (std::vector< boost::shared_ptr< EventSetupRecordProvider > >const &)
 If the provided Record depends on other Records, here are the dependent Providers.
void setValidityInterval (ValidityInterval const &)
bool setValidityIntervalFor (IOVSyncValue const &)
 sets interval to this time and returns true if have a valid interval for time
void usePreferred (DataToPreferredProviderMap const &)
ValidityInterval const & validityInterval () const
virtual ~EventSetupRecordProvider ()

Protected Member Functions

void addProxiesToRecord (boost::shared_ptr< DataProxyProvider >, DataToPreferredProviderMap const &)
void cacheReset ()
virtual EventSetupRecordrecord ()=0
boost::shared_ptr
< EventSetupRecordIntervalFinder
swapFinder (boost::shared_ptr< EventSetupRecordIntervalFinder > iNew)

Private Member Functions

bool checkResetTransients ()
 EventSetupRecordProvider (EventSetupRecordProvider const &)
EventSetupRecordProvider const & operator= (EventSetupRecordProvider const &)
void resetTransients ()

Private Attributes

boost::shared_ptr
< EventSetupRecordIntervalFinder
finder_
EventSetupRecordKey const key_
bool lastSyncWasBeginOfRun_
std::auto_ptr< std::vector
< boost::shared_ptr
< EventSetupRecordIntervalFinder > > > 
multipleFinders_
std::vector< boost::shared_ptr
< DataProxyProvider > > 
providers_
ValidityInterval validityInterval_

Detailed Description

Definition at line 44 of file EventSetupRecordProvider.h.


Member Typedef Documentation

Definition at line 47 of file EventSetupRecordProvider.h.


Constructor & Destructor Documentation

EventSetupRecordProvider::EventSetupRecordProvider ( EventSetupRecordKey const &  iKey)

Definition at line 45 of file EventSetupRecordProvider.cc.

                                                                                  : key_(iKey),
    validityInterval_(), finder_(), providers_(),
    multipleFinders_(new std::vector<boost::shared_ptr<EventSetupRecordIntervalFinder> >()),
    lastSyncWasBeginOfRun_(true)
{
}
EventSetupRecordProvider::~EventSetupRecordProvider ( ) [virtual]

Definition at line 57 of file EventSetupRecordProvider.cc.

{
}
edm::eventsetup::EventSetupRecordProvider::EventSetupRecordProvider ( EventSetupRecordProvider const &  ) [private]

Member Function Documentation

void EventSetupRecordProvider::add ( boost::shared_ptr< DataProxyProvider iProvider)

Definition at line 77 of file EventSetupRecordProvider.cc.

References key_, providers_, and edm::search_all().

{
   assert(iProvider->isUsingRecord(key_));
   assert(!search_all(providers_, iProvider));
   providers_.push_back(iProvider);
}
void EventSetupRecordProvider::addFinder ( boost::shared_ptr< EventSetupRecordIntervalFinder iFinder)

For now, only use one finder.

Definition at line 85 of file EventSetupRecordProvider.cc.

References Exception, finder_, key_, multipleFinders_, and edm::eventsetup::EventSetupRecordKey::name().

{
   boost::shared_ptr<EventSetupRecordIntervalFinder> oldFinder = finder_;  
   finder_ = iFinder;
   if (0 != multipleFinders_.get()) {
     multipleFinders_->push_back(iFinder);
   } else {
     //dependent records set there finders after the multipleFinders_ has been released
     // but they also have never had a finder set
     if(0 != oldFinder.get()) {
       cms::Exception("EventSetupMultipleSources")<<"An additional source has been added to the Record "
       <<key_.name()<<"'\n"
       <<"after all the other sources have been dealt with.  This is a logic error, please send email to the framework group.";
     }
   }
}
void EventSetupRecordProvider::addProxiesToRecord ( boost::shared_ptr< DataProxyProvider iProvider,
DataToPreferredProviderMap const &  iMap 
) [protected]

Definition at line 136 of file EventSetupRecordProvider.cc.

References edm::eventsetup::EventSetupRecord::add(), and record().

Referenced by usePreferred().

                                                                                                {
   typedef DataProxyProvider::KeyedProxies ProxyList ;
   typedef EventSetupRecordProvider::DataToPreferredProviderMap PreferredMap;
   
   EventSetupRecord& rec = record();
   const ProxyList& keyedProxies(iProvider->keyedProxies(this->key())) ;
   ProxyList::const_iterator finishedProxyList(keyedProxies.end()) ;
   for (ProxyList::const_iterator keyedProxy(keyedProxies.begin()) ;
        keyedProxy != finishedProxyList ;
        ++keyedProxy) {
      PreferredMap::const_iterator itFound = iMap.find(keyedProxy->first);
      if(iMap.end() != itFound) {
         if( itFound->second.type_ != keyedProxy->second->providerDescription()->type_ ||
            itFound->second.label_ != keyedProxy->second->providerDescription()->label_ ) {
            //this is not the preferred provider
            continue;
         }
      }
      rec.add((*keyedProxy).first , (*keyedProxy).second.get()) ;
   }
}
void EventSetupRecordProvider::addRecordTo ( EventSetupProvider iEventSetupProvider)

Definition at line 160 of file EventSetupRecordProvider.cc.

References edm::eventsetup::EventSetupProvider::addRecordToEventSetup(), record(), edm::eventsetup::EventSetupRecord::set(), and validityInterval().

Referenced by addRecordToIfValid().

                                                                             {
   EventSetupRecord& rec = record();
   rec.set(this->validityInterval());
   iEventSetupProvider.addRecordToEventSetup(rec);
}
void EventSetupRecordProvider::addRecordToIfValid ( EventSetupProvider iEventSetupProvider,
IOVSyncValue const &  iTime 
)

Definition at line 179 of file EventSetupRecordProvider.cc.

References addRecordTo(), and setValidityIntervalFor().

{
   if(setValidityIntervalFor(iTime)) {
      addRecordTo(iEventSetupProvider);
   } 
}
void EventSetupRecordProvider::cacheReset ( ) [protected]

Definition at line 239 of file EventSetupRecordProvider.cc.

References edm::eventsetup::EventSetupRecord::cacheReset(), and record().

Referenced by resetProxies(), and setValidityIntervalFor().

{
   record().cacheReset();
}
bool EventSetupRecordProvider::checkResetTransients ( ) [private]

Definition at line 245 of file EventSetupRecordProvider.cc.

References record(), and edm::eventsetup::EventSetupRecord::transientReset().

Referenced by resetTransients().

{
   return record().transientReset();
}
std::set< EventSetupRecordKey > EventSetupRecordProvider::dependentRecords ( ) const [virtual]

Returns the list of Records the provided Record depends on (usually none)

Reimplemented in edm::eventsetup::EventSetupRecordProviderTemplate< T >.

Definition at line 252 of file EventSetupRecordProvider.cc.

{
   return std::set<EventSetupRecordKey>();
}
boost::shared_ptr<EventSetupRecordIntervalFinder> edm::eventsetup::EventSetupRecordProvider::finder ( ) const [inline]

Definition at line 92 of file EventSetupRecordProvider.h.

References finder_.

{ return finder_; }
EventSetupRecordKey const& edm::eventsetup::EventSetupRecordProvider::key ( ) const [inline]

Definition at line 57 of file EventSetupRecordProvider.h.

References key_.

Referenced by setDependentProviders().

{ return key_; }      
EventSetupRecordProvider const& edm::eventsetup::EventSetupRecordProvider::operator= ( EventSetupRecordProvider const &  ) [private]
boost::shared_ptr< DataProxyProvider > EventSetupRecordProvider::proxyProvider ( ComponentDescription const &  iDesc) const

returns the DataProxyProvider or a 'null' if not found

Definition at line 268 of file EventSetupRecordProvider.cc.

References edm::eventsetup::DataProxyProvider::description(), and providers_.

                                                                               {
   std::vector<boost::shared_ptr<DataProxyProvider> >::const_iterator itFound =
   std::find_if(providers_.begin(),providers_.end(),
                boost::bind(std::equal_to<ComponentDescription>(), 
                            iDesc, 
                            boost::bind(&DataProxyProvider::description,_1)));
   if(itFound == providers_.end()){
      return boost::shared_ptr<DataProxyProvider>();
   }
   return *itFound;
}
std::set< ComponentDescription > EventSetupRecordProvider::proxyProviderDescriptions ( ) const

return information on which DataProxyProviders are supplying information

Definition at line 258 of file EventSetupRecordProvider.cc.

References edm::eventsetup::DataProxyProvider::description(), and providers_.

Referenced by edm::eventsetup::EventSetupProvider::proxyProviderDescriptions().

{
   std::set<ComponentDescription> descriptions;
   std::transform(providers_.begin(), providers_.end(),
                  std::inserter(descriptions,descriptions.end()),
                  boost::bind(&DataProxyProvider::description,_1));
   return descriptions;
}
virtual EventSetupRecord& edm::eventsetup::EventSetupRecordProvider::record ( ) [protected, pure virtual]
void EventSetupRecordProvider::resetProxies ( )

This will clear the cache's of all the Proxies so that next time they are called they will run.

Definition at line 227 of file EventSetupRecordProvider.cc.

References cacheReset(), edm::for_all(), key_, providers_, edm::eventsetup::DataProxyProvider::resetProxies(), and edm::eventsetup::DataProxyProvider::resetProxiesIfTransient().

Referenced by edm::eventsetup::EventSetupProvider::resetRecordPlusDependentRecords().

{
  cacheReset();
  for_all(providers_, boost::bind(&DataProxyProvider::resetProxies,_1,key_));
  //some proxies only clear if they were accessed transiently,
  // since resetProxies resets that flag, calling resetTransients
  // will force a clear
  for_all(providers_, boost::bind(&DataProxyProvider::resetProxiesIfTransient,_1,key_)); 

}
void EventSetupRecordProvider::resetTransients ( ) [private]
void EventSetupRecordProvider::setDependentProviders ( std::vector< boost::shared_ptr< EventSetupRecordProvider > >const &  iProviders)

If the provided Record depends on other Records, here are the dependent Providers.

Definition at line 108 of file EventSetupRecordProvider.cc.

References edm::eventsetup::DependentRecordIntervalFinder::addProviderWeAreDependentOn(), edm::for_all(), key(), and swapFinder().

{
   boost::shared_ptr< DependentRecordIntervalFinder > newFinder(
                                                                new DependentRecordIntervalFinder(key()));
   
   boost::shared_ptr<EventSetupRecordIntervalFinder> old = swapFinder(newFinder);
   for_all(iProviders, boost::bind(std::mem_fun(&DependentRecordIntervalFinder::addProviderWeAreDependentOn), &(*newFinder), _1));
   //if a finder was already set, add it as a depedency.  This is done to ensure that the IOVs properly change even if the
   // old finder does not update each time a dependent record does change
   if(old.get() != 0) {
      newFinder->setAlternateFinder(old);
   }
}
void EventSetupRecordProvider::setValidityInterval ( ValidityInterval const &  iInterval)

Definition at line 102 of file EventSetupRecordProvider.cc.

References validityInterval_.

{
   validityInterval_ = iInterval;
}
bool EventSetupRecordProvider::setValidityIntervalFor ( IOVSyncValue const &  iTime)

sets interval to this time and returns true if have a valid interval for time

Definition at line 188 of file EventSetupRecordProvider.cc.

References cacheReset(), edm::EventID::event(), edm::IOVSyncValue::eventID(), finder_, edm::ValidityInterval::first(), edm::IOVSyncValue::invalidIOVSyncValue(), key_, lastSyncWasBeginOfRun_, providers_, resetTransients(), edm::ValidityInterval::validFor(), and validityInterval_.

Referenced by addRecordToIfValid().

{
   //we want to wait until after the first event of a new run before
   // we reset any transients just in case some modules get their data at beginRun or beginLumi
   // and others wait till the first event
   if(!lastSyncWasBeginOfRun_) {
      resetTransients();
   }
   lastSyncWasBeginOfRun_=iTime.eventID().event() == 0;
   
   if(validityInterval_.validFor(iTime)) {
      return true;
   }
   bool returnValue = false;
   //need to see if we get a new interval
   if(0 != finder_.get()) {
      IOVSyncValue oldFirst(validityInterval_.first());
      
      validityInterval_ = finder_->findIntervalFor(key_, iTime);
      //are we in a valid range?
      if(validityInterval_.first() != IOVSyncValue::invalidIOVSyncValue()) {
         returnValue = true;
         //did we actually change?
         if(oldFirst != validityInterval_.first()) {
            //tell all Providers to update
            for(std::vector<boost::shared_ptr<DataProxyProvider> >::iterator itProvider = providers_.begin(),
                itProviderEnd = providers_.end();
                itProvider != itProviderEnd;
                ++itProvider) {
               (*itProvider)->newInterval(key_, validityInterval_);
            }
            cacheReset();
         }
      }
   }
   return returnValue;
}
boost::shared_ptr<EventSetupRecordIntervalFinder> edm::eventsetup::EventSetupRecordProvider::swapFinder ( boost::shared_ptr< EventSetupRecordIntervalFinder iNew) [inline, protected]

Definition at line 101 of file EventSetupRecordProvider.h.

References finder_, and edm::eventsetup::swap().

Referenced by setDependentProviders().

                                                                                                                       {
        std::swap(iNew, finder_);
        return iNew;
      }
void EventSetupRecordProvider::usePreferred ( DataToPreferredProviderMap const &  iMap)

In the case of a conflict, sets what Provider to call. This must be called after all providers have been added. An empty map is acceptable.

Definition at line 122 of file EventSetupRecordProvider.cc.

References addProxiesToRecord(), finder_, edm::for_all(), key_, multipleFinders_, and providers_.

{
  for_all(providers_, boost::bind(&EventSetupRecordProvider::addProxiesToRecord,this,_1,iMap));
  if (1 < multipleFinders_->size()) {
     
     boost::shared_ptr<IntersectingIOVRecordIntervalFinder> intFinder(new IntersectingIOVRecordIntervalFinder(key_));
     intFinder->swapFinders(*multipleFinders_);
     finder_ = intFinder;
  }
  //now we get rid of the temporary
  multipleFinders_.reset(0);
}
ValidityInterval const& edm::eventsetup::EventSetupRecordProvider::validityInterval ( ) const [inline]

Definition at line 54 of file EventSetupRecordProvider.h.

References validityInterval_.

Referenced by addRecordTo().

                                                       {
         return validityInterval_;
      }

Member Data Documentation

Definition at line 119 of file EventSetupRecordProvider.h.

Referenced by setValidityIntervalFor().

std::auto_ptr<std::vector<boost::shared_ptr<EventSetupRecordIntervalFinder> > > edm::eventsetup::EventSetupRecordProvider::multipleFinders_ [private]

Definition at line 118 of file EventSetupRecordProvider.h.

Referenced by addFinder(), and usePreferred().