CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/DQM/SiStripMonitorHardware/src/SiStripFEDEmulatorModule.cc

Go to the documentation of this file.
00001 // Original Author:  Anne-Marie Magnan
00002 //         Created:  2010/01/21
00003 // $Id: SiStripFEDEmulatorModule.cc,v 1.2 2013/03/04 07:53:45 davidlt Exp $
00004 //
00005 
00006 #include <sstream>
00007 #include <memory>
00008 #include <list>
00009 #include <algorithm>
00010 #include <cassert>
00011 #include <vector>
00012 
00013 #include "FWCore/Framework/interface/Frameworkfwd.h"
00014 #include "FWCore/Framework/interface/EDProducer.h"
00015 #include "FWCore/Framework/interface/Event.h"
00016 #include "FWCore/Framework/interface/EventSetup.h"
00017 #include "FWCore/Framework/interface/ESHandle.h"
00018 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00019 #include "FWCore/Utilities/interface/InputTag.h"
00020 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00021 #include "FWCore/ServiceRegistry/interface/Service.h"
00022 #include "FWCore/Utilities/interface/Exception.h"
00023 
00024 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
00025 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
00026 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
00027 #include "DataFormats/SiStripCommon/interface/SiStripFedKey.h"
00028 #include "DataFormats/Common/interface/DetSetVector.h"
00029 #include "DataFormats/SiStripDigi/interface/SiStripRawDigi.h"
00030 #include "DataFormats/SiStripDigi/interface/SiStripProcessedRawDigi.h"
00031 #include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
00032 #include "DataFormats/SiStripCommon/interface/ConstantsForHardwareSystems.h"
00033 
00034 #include "CondFormats/SiStripObjects/interface/SiStripPedestals.h"
00035 #include "CondFormats/SiStripObjects/interface/SiStripNoises.h"
00036 #include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
00037 
00038 #include "EventFilter/SiStripRawToDigi/interface/SiStripFEDBuffer.h"
00039 
00040 //for the zero suppression algorithm(s)
00041 #include "RecoLocalTracker/SiStripZeroSuppression/interface/SiStripRawProcessingFactory.h"
00042 #include "RecoLocalTracker/SiStripZeroSuppression/interface/SiStripRawProcessingAlgorithms.h"
00043 
00044 #include "DQM/SiStripMonitorHardware/interface/SiStripFEDEmulator.h"
00045 #include "DQM/SiStripMonitorHardware/interface/SiStripSpyUtilities.h"
00046 
00047 using edm::LogError;
00048 using edm::LogInfo;
00049 using edm::LogWarning;
00050 
00051 namespace sistrip
00052 {
00053 
00054   //
00055   // Class declaration
00056   //
00057 
00058   class FEDEmulatorModule : public edm::EDProducer
00059   {
00060   public:
00061 
00062     explicit FEDEmulatorModule(const edm::ParameterSet&);
00063     ~FEDEmulatorModule();
00064 
00065   private:
00066 
00067     virtual void produce(edm::Event&, const edm::EventSetup&) override;
00068     //virtual void endJob();
00069 
00070     //tag of spydata collection
00071     edm::InputTag spyReorderedDigisTag_;
00072     edm::InputTag spyVirginRawDigisTag_;
00073 
00074     //by fedIndex or module detid
00075     bool byModule_;
00076 
00077     sistrip::FEDEmulator fedEmulator_;
00078 
00079     static const char* messageLabel_;
00080   
00081     std::auto_ptr<SiStripRawProcessingAlgorithms> algorithms_; 
00082 
00083     //utilities for cabling etc...
00084     SpyUtilities utility_;
00085 
00086   };
00087 
00088 }//~sistrip
00089 
00090 namespace sistrip {
00091 
00092   //
00093   // Constructors and destructor
00094   //
00095   const char* FEDEmulatorModule::messageLabel_ = "SiStripFEDEmulatorModule";
00096 
00097 
00098   FEDEmulatorModule::FEDEmulatorModule(const edm::ParameterSet& iConfig): 
00099     spyReorderedDigisTag_(iConfig.getParameter<edm::InputTag>("SpyReorderedDigisTag")),
00100     spyVirginRawDigisTag_(iConfig.getParameter<edm::InputTag>("SpyVirginRawDigisTag")),
00101     byModule_(iConfig.getParameter<bool>("ByModule")),
00102     algorithms_(SiStripRawProcessingFactory::create(iConfig.getParameter<edm::ParameterSet>("Algorithms"))) 
00103   {
00104 
00105     fedEmulator_.initialise(byModule_);
00106 
00107     if (!byModule_) { //if not by module
00108       //the medians will be produced by fed id/channel
00109       produces<std::map<uint32_t,std::vector<uint32_t> > >("Medians");
00110       produces<edm::DetSetVector<SiStripRawDigi> >("PedestalsOrdered");
00111       produces<edm::DetSetVector<SiStripProcessedRawDigi> >("NoisesOrdered");
00112       produces<edm::DetSetVector<SiStripRawDigi> >("PedSubtrDigisOrdered");
00113       produces<edm::DetSetVector<SiStripRawDigi> >("CMSubtrDigisOrdered");
00114     }
00115     else { //by module
00116       produces<edm::DetSetVector<SiStripRawDigi> >("ModulePedestals");
00117       produces<edm::DetSetVector<SiStripProcessedRawDigi> >("ModuleNoises");
00118       produces<edm::DetSetVector<SiStripRawDigi> >("PedSubtrModuleDigis");
00119       produces<std::map<uint32_t,std::vector<uint32_t> > >("ModuleMedians");
00120       produces<edm::DetSetVector<SiStripRawDigi> >("CMSubtrModuleDigis");
00121       produces<edm::DetSetVector<SiStripDigi> >("ZSModuleDigis");
00122     }//end of by module check
00123 
00124   }//end of FEDEmulatorModule constructor
00125 
00126   FEDEmulatorModule::~FEDEmulatorModule()
00127   {
00128   }
00129 
00130   // ------------ method called to for each event  ------------
00131   void
00132   FEDEmulatorModule::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00133   {
00134     //update cabling and pedestals
00135     const SiStripFedCabling* lCabling = utility_.getCabling( iSetup );
00136     edm::ESHandle<SiStripPedestals> lPedsHandle = utility_.getPedestalHandle(iSetup);
00137     edm::ESHandle<SiStripNoises> lNoiseHandle = utility_.getNoiseHandle(iSetup);
00138   
00139     //initialise the algorithms object for the zero suppression
00140     algorithms_->initialize(iSetup);
00141 
00142     //retrieve the digis
00143     edm::Handle<edm::DetSetVector<SiStripRawDigi> > lDigisHandle;
00144     try { //to get the digis from the event
00145       if (!byModule_) {
00146         iEvent.getByLabel(spyReorderedDigisTag_, lDigisHandle);
00147       }
00148       else { //digis supplied by module
00149         iEvent.getByLabel(spyVirginRawDigisTag_, lDigisHandle);
00150       }//end of by module check
00151     } catch (const cms::Exception& e) {
00152       std::cout << e.what() ;
00153       return;
00154     } //end of get digis try
00155 
00156     const edm::DetSetVector<SiStripRawDigi> * lInputDigis = lDigisHandle.product();
00157 
00158     unsigned int lNDigis = lInputDigis->size();
00159 
00160     //define output containers
00161     //reserve space, will push_back elements
00162     std::vector<edm::DetSetVector<SiStripRawDigi>::detset > pedsData;
00163     pedsData.reserve(lNDigis);
00164     std::vector<edm::DetSetVector<SiStripProcessedRawDigi>::detset > noiseData;
00165     noiseData.reserve(lNDigis);
00166     std::vector<edm::DetSetVector<SiStripRawDigi>::detset > pedSubtrData;
00167     pedSubtrData.reserve(lNDigis);
00168     std::vector<edm::DetSetVector<SiStripRawDigi>::detset > cmSubtrData;
00169     cmSubtrData.reserve(lNDigis);
00170     //zero suppressed contained - no fixed size (could be empty) so no need to reserve elements.
00171     std::vector< edm::DetSet<SiStripDigi> > zsData;
00172     
00173     //this is a map: no reserve/resize
00174     std::map<uint32_t,std::vector<uint32_t> > medsData;
00175 
00176     edm::DetSetVector<SiStripRawDigi>::const_iterator inputChannel = lInputDigis->begin();
00177 
00178     for ( ; inputChannel!=lInputDigis->end(); ++inputChannel){//loop on input channels
00179       uint32_t lDetId = inputChannel->detId(); //either fedIndex or detId
00180 
00181       pedsData.push_back(    edm::DetSetVector<SiStripRawDigi>::detset(lDetId) );
00182       noiseData.push_back(   edm::DetSetVector<SiStripProcessedRawDigi>::detset(lDetId) );
00183       pedSubtrData.push_back(edm::DetSetVector<SiStripRawDigi>::detset(lDetId) );
00184       cmSubtrData.push_back( edm::DetSetVector<SiStripRawDigi>::detset(lDetId) );
00185 
00186       unsigned int lNStrips = inputChannel->size();
00187 
00188       //define output digi containers
00189       std::vector<SiStripRawDigi>& pedsDetSetData = pedsData.back().data;
00190       pedsDetSetData.reserve(lNStrips);
00191       std::vector<SiStripProcessedRawDigi>& noiseDetSetData = noiseData.back().data;
00192       noiseDetSetData.reserve(lNStrips);
00193       std::vector<SiStripRawDigi>& pedSubtrDetSetData = pedSubtrData.back().data;
00194       pedSubtrDetSetData.reserve(lNStrips);
00195       std::vector<SiStripRawDigi>& cmSubtrDetSetData = cmSubtrData.back().data;
00196       cmSubtrDetSetData.reserve(lNStrips);
00197       //zero suppressed - slightly different procedure as not fixed size
00198       edm::DetSet<SiStripDigi> zsDetSetData(lDetId);
00199       
00200       //determine the number of APV pairs in the channel
00201       uint32_t lNPairs = static_cast<uint32_t>(lNStrips*1./sistrip::STRIPS_PER_FEDCH);
00202       uint32_t lPair = 0;
00203       
00204       std::vector<uint32_t> medsDetSetData;
00205       medsDetSetData.reserve(lNPairs*2); //2*number of pairs per module. If not by module, lNPairs = 1...
00206       
00207       if (!byModule_) { //the input is not stored by module
00208         //need to retrieve the proper detId from cabling
00209         uint16_t lFedId = 0;
00210         uint16_t lFedChannel = 0;
00211         sistrip::SpyUtilities::fedIndex(lDetId, lFedId, lFedChannel);
00212                 
00213         const FedChannelConnection & lConnection = lCabling->connection(lFedId,lFedChannel);
00214         lDetId = lConnection.detId();
00215         lNPairs = lConnection.nApvPairs();
00216         lPair = lConnection.apvPairNumber();
00217       }//end of by module check
00218 
00219       fedEmulator_.initialiseModule(lDetId,lNPairs,lPair);
00220 
00221       //get the pedestal values
00222       //stored by module in the database
00223       fedEmulator_.retrievePedestals(lPedsHandle);
00224       fedEmulator_.retrieveNoises(lNoiseHandle);
00225       
00226       //last option: fill medians from these ped subtr data
00227       //if want something else, need to call a method to fill
00228       //the data member medians_ of the class fedEmulator.
00229       fedEmulator_.subtractPedestals(inputChannel,
00230                                      pedsDetSetData,
00231                                      noiseDetSetData,
00232                                      pedSubtrDetSetData,
00233                                      medsDetSetData,
00234                                      true);
00235       
00236       fedEmulator_.subtractCM(pedSubtrDetSetData,cmSubtrDetSetData);
00237 
00238       //fill the median map
00239       medsData[inputChannel->detId()] = medsDetSetData;
00240 
00241       //zero suppress the digis
00242       fedEmulator_.zeroSuppress(cmSubtrDetSetData, zsDetSetData, algorithms_);
00243       if (zsDetSetData.size()) zsData.push_back( zsDetSetData );
00244       
00245     }//loop on input channels
00246 
00247 
00248     std::auto_ptr<edm::DetSetVector<SiStripRawDigi> > lPeds(new edm::DetSetVector<SiStripRawDigi>(pedsData,true));
00249     std::auto_ptr<edm::DetSetVector<SiStripProcessedRawDigi> > lNoises(new edm::DetSetVector<SiStripProcessedRawDigi>(noiseData,true));
00250 
00251     std::auto_ptr<edm::DetSetVector<SiStripRawDigi> > lOutputPedSubtr(new edm::DetSetVector<SiStripRawDigi>(pedSubtrData,true));
00252 
00253     std::auto_ptr<edm::DetSetVector<SiStripRawDigi> > lOutputCMSubtr(new edm::DetSetVector<SiStripRawDigi>(cmSubtrData,true));
00254 
00255     std::auto_ptr<std::map<uint32_t,std::vector<uint32_t> > > lMedians(new std::map<uint32_t,std::vector<uint32_t> >(medsData));
00256   
00257     //zero suppressed digis
00258     std::auto_ptr< edm::DetSetVector<SiStripDigi> > lOutputZS(new edm::DetSetVector<SiStripDigi>(zsData));
00259     
00260     if (!byModule_) {
00261       iEvent.put(lMedians,"Medians");
00262       iEvent.put(lPeds,"PedestalsOrdered");
00263       iEvent.put(lNoises,"NoisesOrdered");
00264       iEvent.put(lOutputPedSubtr,"PedSubtrDigisOrdered");
00265       iEvent.put(lOutputCMSubtr,"CMSubtrDigisOrdered");
00266     }
00267     else {
00268       iEvent.put(lPeds,"ModulePedestals");
00269       iEvent.put(lNoises,"ModuleNoises");
00270       iEvent.put(lOutputPedSubtr,"PedSubtrModuleDigis");
00271       iEvent.put(lMedians,"ModuleMedians");
00272       iEvent.put(lOutputCMSubtr,"CMSubtrModuleDigis");
00273       iEvent.put(lOutputZS,"ZSModuleDigis");
00274     }
00275 
00276   }//produce method
00277 }//namespace sistrip
00278 
00279 //
00280 // Define as a plug-in
00281 //
00282 
00283 #include "FWCore/Framework/interface/MakerMacros.h"
00284 typedef sistrip::FEDEmulatorModule SiStripFEDEmulatorModule;
00285 DEFINE_FWK_MODULE(SiStripFEDEmulatorModule);