CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/DQM/SiStripMonitorHardware/interface/SiStripSpyEventMatcher.h

Go to the documentation of this file.
00001 #define SiStripMonitorHardware_BuildEventMatchingCode
00002 #ifdef SiStripMonitorHardware_BuildEventMatchingCode
00003 
00004 #ifndef DQM_SiStripMonitorHardware_SiStripSpyEventMatcher_H
00005 #define DQM_SiStripMonitorHardware_SiStripSpyEventMatcher_H
00006 
00007 #include "FWCore/Utilities/interface/InputTag.h"
00008 #include "FWCore/Sources/interface/VectorInputSource.h"
00009 #include "FWCore/Framework/interface/EventPrincipal.h"
00010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00011 #include "boost/cstdint.hpp"
00012 #include <set>
00013 #include <map>
00014 #include <memory>
00015 #include <vector>
00016 
00017 //forward declarations
00018 class FEDRawDataCollection;
00019 class SiStripRawDigi;
00020 namespace edm {
00021   template<class T> class DetSetVector;
00022   template<class T> class DetSet;
00023   class EventID;
00024   class ParameterSet;
00025 }
00026 class SiStripFedCabling;
00027 
00028 namespace sistrip {
00029   
00030   class SpyEventMatcher
00031   {
00032     public:
00033       class SpyDataCollections
00034       {
00035         public:
00036         std::auto_ptr< FEDRawDataCollection > rawData;
00037         std::auto_ptr< std::vector<uint32_t> > totalEventCounters;
00038         std::auto_ptr< std::vector<uint32_t> > l1aCounters;
00039         std::auto_ptr< std::vector<uint32_t> > apvAddresses;
00040         std::auto_ptr< edm::DetSetVector<SiStripRawDigi> > scopeDigis;
00041         std::auto_ptr< edm::DetSetVector<SiStripRawDigi> > payloadDigis;
00042         std::auto_ptr< edm::DetSetVector<SiStripRawDigi> > reorderedDigis;
00043         std::auto_ptr< edm::DetSetVector<SiStripRawDigi> > virginRawDigis;
00044         SpyDataCollections();
00045         //NB. This will remove all elements in the containers pasted in. It does not copy the data. 
00046         SpyDataCollections(FEDRawDataCollection& theRawData,
00047                            std::vector<uint32_t>& theTotalEventCounters,
00048                            std::vector<uint32_t>& theL1ACounters,
00049                            std::vector<uint32_t>& theAPVAddresses,
00050                            std::vector< edm::DetSet<SiStripRawDigi> >* theScopeDigisVector,
00051                            std::vector< edm::DetSet<SiStripRawDigi> >* thePayloadDigisVector,
00052                            std::vector< edm::DetSet<SiStripRawDigi> >* theReorderedDigisVector,
00053                            std::vector< edm::DetSet<SiStripRawDigi> >* theVirginRawDigisVector);
00054         //does not copy, orginal object looses ownership of collections
00055         SpyDataCollections& operator = (SpyDataCollections original);
00056       };
00057       struct MatchingOutput
00058       {
00059         explicit MatchingOutput(FEDRawDataCollection& outputRawData);
00060         FEDRawDataCollection& outputRawData_;
00061         std::vector<uint32_t> outputTotalEventCounters_;
00062         std::vector<uint32_t> outputL1ACounters_;
00063         std::vector<uint32_t> outputAPVAddresses_;
00064         boost::shared_ptr< std::vector< edm::DetSet<SiStripRawDigi> > > outputScopeDigisVector_;
00065         boost::shared_ptr< std::vector< edm::DetSet<SiStripRawDigi> > > outputPayloadDigisVector_;
00066         boost::shared_ptr< std::vector< edm::DetSet<SiStripRawDigi> > > outputReorderedDigisVector_;
00067         boost::shared_ptr< std::vector< edm::DetSet<SiStripRawDigi> > > outputVirginRawDigisVector_;
00068         std::set<uint16_t> alreadyMergedFeds_;
00069       };
00070 
00071       typedef edm::EventID EventID;
00072       typedef std::set<EventID> SpyEventList;
00073       
00074       SpyEventMatcher(const edm::ParameterSet& config);
00075       virtual ~SpyEventMatcher();
00076       //set up the internal map of eventID, to apvAddress
00077       void initialize();
00078       //check if there is any data for an event. Returns NULL if not or a pointer to a list of matches if they exist
00079       const SpyEventList* matchesForEvent(const uint32_t eventId, const uint8_t apvAddress) const;
00080       //get data for matching FEDs (non-const because reading events from the source modifies it)
00081       void getMatchedCollections(const uint32_t eventId, const uint8_t apvAddress, const SpyEventList* matchingEvents,
00082                                  const SiStripFedCabling& cabling, SpyDataCollections& collectionsToCreate);
00083       //helper for getMatchedCollections() 
00084       void getCollections(const edm::EventPrincipal& event, const uint32_t eventId,
00085                           const uint8_t apvAddress, const SiStripFedCabling& cabling,
00086                           MatchingOutput& matchingOutput);
00087 
00088     private:
00089       class EventKey
00090       {
00091         public:
00092           EventKey(const uint32_t eventId, const uint8_t apvAddress);
00093           uint32_t eventId() const { return eventId_; }
00094           uint8_t apvAddress() const { return apvAddress_; }
00095           bool operator < (const EventKey& rhs) const;
00096         private:
00097           uint32_t eventId_;
00098           uint8_t  apvAddress_;
00099       };
00100       typedef std::vector<uint32_t> Counters;
00101       //class to wrap counters that can take ownership of them or not.
00102       //It behaves like the counters themself but, it actualy holds a pointer to them and dletes them if necessary
00103       class CountersWrapper
00104       {
00105         public:
00106           CountersWrapper(const Counters* theCounters);
00107           CountersWrapper(Counters* theCounters, const bool takeOwnership);
00108           ~CountersWrapper();
00109           const Counters::value_type operator [] (const size_t i) const { return (*pConst)[i]; };
00110           const Counters::value_type at(const size_t i) const { return pConst->at(i); };
00111           Counters::const_iterator begin() const { return pConst->begin(); }
00112           Counters::const_iterator end() const { return pConst->end(); }
00113         private:
00114           const Counters* pConst;
00115           Counters* p;
00116           bool deleteP;
00117       };
00118       typedef boost::shared_ptr<CountersWrapper> CountersPtr;
00119       
00120       //source for spy events
00121       typedef edm::VectorInputSource Source;
00122       //reference counted pointer to an event
00123             
00124       std::unique_ptr<Source> constructSource(const edm::ParameterSet& sourceConfig);
00125       void addNextEventToMap(const edm::EventPrincipal& nextSpyEvent);
00126       template <class T> static const T* getProduct(const edm::EventPrincipal& event, const edm::InputTag& tag);
00127       static CountersPtr getCounters(const edm::EventPrincipal& event, const edm::InputTag& tag, const bool mapKeyIsByFedID = true);
00128       void operator()(const edm::EventPrincipal& event);
00129       static void findMatchingFeds(const uint32_t eventId, const uint8_t apvAddress,
00130                                    CountersPtr totalEventCounters,
00131                                    CountersPtr l1aCounters,
00132                                    CountersPtr apvAddresses,
00133                                    std::set<uint16_t>& matchingFeds);
00134       static void mergeMatchingData(const std::set<uint16_t>& matchingFeds,
00135                                     const FEDRawDataCollection& inputRawData,
00136                                     CountersPtr inputTotalEventCounters,
00137                                     CountersPtr inputL1ACounters,
00138                                     CountersPtr inputAPVAddresses,
00139                                     const edm::DetSetVector<SiStripRawDigi>* inputScopeDigis,
00140                                     const edm::DetSetVector<SiStripRawDigi>* inputPayloadDigis,
00141                                     const edm::DetSetVector<SiStripRawDigi>* inputReorderedDigis,
00142                                     const edm::DetSetVector<SiStripRawDigi>* inputVirginRawDigis,
00143                                     FEDRawDataCollection& outputRawData,
00144                                     std::vector<uint32_t>& outputTotalEventCounters,
00145                                     std::vector<uint32_t>& outputL1ACounters,
00146                                     std::vector<uint32_t>& outputAPVAddresses,
00147                                     std::vector< edm::DetSet<SiStripRawDigi> >* outputScopeDigisVector,
00148                                     std::vector< edm::DetSet<SiStripRawDigi> >* outputPayloadDigisVector,
00149                                     std::vector< edm::DetSet<SiStripRawDigi> >* outputReorderedDigisVector,
00150                                     std::vector< edm::DetSet<SiStripRawDigi> >* outputVirginRawDigisVector,
00151                                     const SiStripFedCabling& cabling);
00152       
00153       std::map<EventKey,SpyEventList> eventMatches_;
00154       edm::InputTag rawDataTag_;
00155       edm::InputTag totalEventCountersTag_;
00156       edm::InputTag l1aCountersTag_;
00157       edm::InputTag apvAddressesTag_;
00158       edm::InputTag scopeDigisTag_;
00159       edm::InputTag payloadDigisTag_;
00160       edm::InputTag reorderedDigisTag_;
00161       edm::InputTag virginRawDigisTag_;
00162       uint32_t counterDiffMax_;
00163       std::unique_ptr<edm::ProductRegistry> productRegistry_;
00164       std::unique_ptr<edm::VectorInputSource> const source_;
00165       std::unique_ptr<edm::ProcessConfiguration> processConfiguration_;
00166       std::unique_ptr<edm::EventPrincipal> eventPrincipal_;
00167       static const char* mlLabel_;
00168   };
00169   
00170   template <class T> const T* SpyEventMatcher::getProduct(const edm::EventPrincipal& event, const edm::InputTag& tag)
00171   {
00172     LogDebug(mlLabel_) << "Retrieving product " << tag;
00173     const boost::shared_ptr< const edm::Wrapper<T> > productWrapper = edm::getProductByTag<T>(event,tag);
00174     if (productWrapper) {
00175       return productWrapper->product();
00176     } else {
00177       return NULL;
00178     }
00179   }
00180   
00181   inline bool SpyEventMatcher::EventKey::operator < (const SpyEventMatcher::EventKey& rhs) const
00182   {
00183     return ( (this->eventId_<rhs.eventId_) ? true : ( ((this->eventId_==rhs.eventId_) && (this->apvAddress_<rhs.apvAddress_)) ? true : false) );
00184   }
00185   
00186 }
00187 
00188 #endif //ndef DQM_SiStripMonitorHardware_SiStripSpyEventMatcher_H
00189 
00190 #endif //SiStripMonitorHardware_BuildEventMatchingCode