CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/EventFilter/SiStripRawToDigi/plugins/ExcludedFEDListProducer.cc

Go to the documentation of this file.
00001 #include "EventFilter/SiStripRawToDigi/plugins/ExcludedFEDListProducer.h"
00002 #include "DataFormats/Common/interface/DetSet.h"
00003 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
00004 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
00005 #include "DataFormats/FEDRawData/src/fed_header.h"
00006 #include "DataFormats/FEDRawData/src/fed_trailer.h"
00007 #include "DataFormats/SiStripCommon/interface/SiStripConstants.h"
00008 #include "DataFormats/SiStripCommon/interface/SiStripEventSummary.h"
00009 #include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
00010 #include "DataFormats/SiStripDigi/interface/SiStripRawDigi.h"
00011 #include "EventFilter/SiStripRawToDigi/interface/TFHeaderDescription.h"
00012 #include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
00013 #include "CondFormats/DataRecord/interface/SiStripFedCablingRcd.h"
00014 #include "FWCore/Utilities/interface/Exception.h"
00015 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00016 #include <iostream>
00017 #include <sstream>
00018 #include <iomanip>
00019 #include <ext/algorithm>
00020 
00021 namespace sistrip {
00022 
00023   ExcludedFEDListProducer::ExcludedFEDListProducer( const edm::ParameterSet& pset ) :
00024     runNumber_(0),
00025     productLabel_(pset.getParameter<edm::InputTag>("ProductLabel")),
00026     cabling_(0),
00027     cacheId_(0)
00028   {
00029     produces<DetIdCollection>();
00030   }
00031   
00032   ExcludedFEDListProducer::~ExcludedFEDListProducer()
00033   {
00034   }
00035   
00036   
00037   void ExcludedFEDListProducer::beginRun( const edm::Run & run, const edm::EventSetup & es)
00038   {
00039     uint32_t cacheId = es.get<SiStripFedCablingRcd>().cacheIdentifier();
00040     
00041     if ( cacheId_ != cacheId ) {
00042       
00043       edm::ESHandle<SiStripFedCabling> c;
00044       es.get<SiStripFedCablingRcd>().get( c );
00045       cabling_ = c.product();
00046     }
00047   }
00048   
00049   void ExcludedFEDListProducer::produce( edm::Event& event, const edm::EventSetup& es)
00050   {
00051     if( runNumber_ != event.run() ) {
00052     
00053       runNumber_ = event.run();
00054 
00055       DetIdCollection emptyDetIdCollection;
00056       detids_.swap(emptyDetIdCollection);
00057       // Reserve space in bad module list
00058       detids_.reserve(100);
00059     
00060       edm::Handle<FEDRawDataCollection> buffers;
00061       event.getByLabel( productLabel_, buffers ); 
00062  
00063       // Retrieve FED ids from cabling map and iterate through 
00064       std::vector<uint16_t>::const_iterator ifed = cabling_->feds().begin();
00065       for ( ; ifed != cabling_->feds().end(); ifed++ ) {
00066       
00067         // ignore trigger FED
00068         // if ( *ifed == triggerFedId_ ) { continue; }
00069         
00070         // Retrieve FED raw data for given FED 
00071         const FEDRawData& input = buffers->FEDData( static_cast<int>(*ifed) );
00072         // The FEDData contains a vector<unsigned char>. Check the size of this vector:
00073         
00074         if( input.size() == 0 ) {
00075           // std::cout << "Input size == 0 for FED number " << static_cast<int>(*ifed) << std::endl;
00076           // get the cabling connections for this FED
00077           const std::vector<FedChannelConnection>& conns = cabling_->connections(*ifed);
00078           // Mark FED modules as bad
00079           detids_.reserve(detids_.size()+conns.size());
00080           std::vector<FedChannelConnection>::const_iterator iconn = conns.begin();
00081           for ( ; iconn != conns.end(); ++iconn ) {
00082             if ( !iconn->detId() || iconn->detId() == sistrip::invalid32_ ) continue;
00083             detids_.push_back(iconn->detId()); //@@ Possible multiple entries
00084           }
00085         }
00086       }
00087     }
00088 
00089     std::auto_ptr< DetIdCollection > detids( new DetIdCollection(detids_) );
00090 
00091     // for( unsigned int it = 0; it < detids->size(); ++it ) {
00092     //   std::cout << "detId = " << (*detids)[it]() << std::endl;
00093     // }
00094 
00095     event.put(detids);
00096   }
00097 }