CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_4_5_patch3/src/EventFilter/SiStripRawToDigi/plugins/SiStripRawToDigiModule.cc

Go to the documentation of this file.
00001 
00002 #include "EventFilter/SiStripRawToDigi/plugins/SiStripRawToDigiModule.h"
00003 #include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
00004 #include "CondFormats/DataRecord/interface/SiStripFedCablingRcd.h"
00005 #include "DataFormats/Common/interface/DetSetVector.h"
00006 #include "DataFormats/Common/interface/Handle.h"
00007 #include "DataFormats/DetId/interface/DetIdCollection.h"
00008 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
00009 #include "DataFormats/SiStripCommon/interface/SiStripConstants.h"
00010 #include "DataFormats/SiStripCommon/interface/SiStripEventSummary.h"
00011 #include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
00012 #include "DataFormats/SiStripDigi/interface/SiStripRawDigi.h"
00013 #include "EventFilter/SiStripRawToDigi/interface/SiStripRawToDigiUnpacker.h"
00014 #include "FWCore/Framework/interface/ESHandle.h"
00015 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00016 #include <cstdlib>
00017 
00018 namespace sistrip {
00019 
00020   RawToDigiModule::RawToDigiModule( const edm::ParameterSet& pset ) :
00021     rawToDigi_(0),
00022     productLabel_(pset.getParameter<edm::InputTag>("ProductLabel")),
00023     cabling_(0),
00024     cacheId_(0),
00025     extractCm_(false),
00026     doFullCorruptBufferChecks_(false)
00027   {
00028     if ( edm::isDebugEnabled() ) {
00029       LogTrace("SiStripRawToDigi")
00030         << "[sistrip::RawToDigiModule::" << __func__ << "]"
00031         << " Constructing object...";
00032     }
00033     
00034     int16_t appended_bytes = pset.getParameter<int>("AppendedBytes");
00035     int16_t trigger_fed_id = pset.getParameter<int>("TriggerFedId");
00036     bool use_daq_register = pset.getParameter<bool>("UseDaqRegister");
00037     bool using_fed_key = pset.getParameter<bool>("UseFedKey");
00038     bool unpack_bad_channels = pset.getParameter<bool>("UnpackBadChannels");
00039     bool mark_missing_feds = pset.getParameter<bool>("MarkModulesOnMissingFeds");
00040 
00041     int16_t fed_buffer_dump_freq = pset.getUntrackedParameter<int>("FedBufferDumpFreq",0);
00042     int16_t fed_event_dump_freq = pset.getUntrackedParameter<int>("FedEventDumpFreq",0);
00043     bool quiet = pset.getUntrackedParameter<bool>("Quiet",true);
00044     extractCm_ = pset.getParameter<bool>("UnpackCommonModeValues");
00045     doFullCorruptBufferChecks_ = pset.getParameter<bool>("DoAllCorruptBufferChecks");
00046     uint32_t errorThreshold = pset.getParameter<unsigned int>("ErrorThreshold");
00047 
00048     rawToDigi_ = new sistrip::RawToDigiUnpacker( appended_bytes, fed_buffer_dump_freq, fed_event_dump_freq, trigger_fed_id, using_fed_key, unpack_bad_channels, mark_missing_feds, errorThreshold);
00049     rawToDigi_->quiet(quiet);
00050     rawToDigi_->useDaqRegister( use_daq_register ); 
00051     rawToDigi_->extractCm(extractCm_);
00052     rawToDigi_->doFullCorruptBufferChecks(doFullCorruptBufferChecks_);
00053   
00054     produces< SiStripEventSummary >();
00055     produces< edm::DetSetVector<SiStripRawDigi> >("ScopeMode");
00056     produces< edm::DetSetVector<SiStripRawDigi> >("VirginRaw");
00057     produces< edm::DetSetVector<SiStripRawDigi> >("ProcessedRaw");
00058     produces< edm::DetSetVector<SiStripDigi> >("ZeroSuppressed");
00059     produces<DetIdCollection>();
00060     if ( extractCm_ ) produces< edm::DetSetVector<SiStripRawDigi> >("CommonMode");
00061   
00062   }
00063 
00064   RawToDigiModule::~RawToDigiModule() {
00065     if ( rawToDigi_ ) { delete rawToDigi_; }
00066     if ( cabling_ ) { cabling_ = 0; }
00067     if ( edm::isDebugEnabled() ) {
00068       LogTrace("SiStripRawToDigi")
00069         << "[sistrip::RawToDigiModule::" << __func__ << "]"
00070         << " Destructing object...";
00071     }
00072   }
00073 
00074   void RawToDigiModule::beginRun( edm::Run& run, const edm::EventSetup& setup ) {
00075     updateCabling( setup );
00076   }  
00077   
00084   void RawToDigiModule::produce( edm::Event& event, const edm::EventSetup& setup ) {
00085   
00086     updateCabling( setup );
00087   
00088     // Retrieve FED raw data (by label, which is "source" by default)
00089     edm::Handle<FEDRawDataCollection> buffers;
00090     event.getByLabel( productLabel_, buffers ); 
00091 
00092     // Populate SiStripEventSummary object with "trigger FED" info
00093     std::auto_ptr<SiStripEventSummary> summary( new SiStripEventSummary() );
00094     rawToDigi_->triggerFed( *buffers, *summary, event.id().event() ); 
00095 
00096     // Create containers for digis
00097     edm::DetSetVector<SiStripRawDigi>* sm = new edm::DetSetVector<SiStripRawDigi>();
00098     edm::DetSetVector<SiStripRawDigi>* vr = new edm::DetSetVector<SiStripRawDigi>();
00099     edm::DetSetVector<SiStripRawDigi>* pr = new edm::DetSetVector<SiStripRawDigi>();
00100     edm::DetSetVector<SiStripDigi>* zs = new edm::DetSetVector<SiStripDigi>();
00101     DetIdCollection* ids = new DetIdCollection();
00102     edm::DetSetVector<SiStripRawDigi>* cm = new edm::DetSetVector<SiStripRawDigi>();
00103   
00104     // Create digis
00105     if ( rawToDigi_ ) { rawToDigi_->createDigis( *cabling_,*buffers,*summary,*sm,*vr,*pr,*zs,*ids,*cm ); }
00106   
00107     // Create auto_ptr's of digi products
00108     std::auto_ptr< edm::DetSetVector<SiStripRawDigi> > sm_dsv(sm);
00109     std::auto_ptr< edm::DetSetVector<SiStripRawDigi> > vr_dsv(vr);
00110     std::auto_ptr< edm::DetSetVector<SiStripRawDigi> > pr_dsv(pr);
00111     std::auto_ptr< edm::DetSetVector<SiStripDigi> > zs_dsv(zs);
00112     std::auto_ptr< DetIdCollection > det_ids(ids);
00113     std::auto_ptr< edm::DetSetVector<SiStripRawDigi> > cm_dsv(cm);
00114   
00115     // Add to event
00116     event.put( summary );
00117     event.put( sm_dsv, "ScopeMode" );
00118     event.put( vr_dsv, "VirginRaw" );
00119     event.put( pr_dsv, "ProcessedRaw" );
00120     event.put( zs_dsv, "ZeroSuppressed" );
00121     event.put( det_ids );
00122     if ( extractCm_ ) event.put( cm_dsv, "CommonMode" );
00123   
00124   }
00125 
00126   void RawToDigiModule::updateCabling( const edm::EventSetup& setup ) {
00127 
00128     uint32_t cache_id = setup.get<SiStripFedCablingRcd>().cacheIdentifier();
00129 
00130     if ( cacheId_ != cache_id ) {
00131     
00132       edm::ESHandle<SiStripFedCabling> c;
00133       setup.get<SiStripFedCablingRcd>().get( c );
00134       cabling_ = c.product();
00135     
00136       if ( edm::isDebugEnabled() ) {
00137         if ( !cacheId_ ) {
00138           std::stringstream ss;
00139           ss << "[sistrip::RawToDigiModule::" << __func__ << "]"
00140              << " Updating cabling for first time..." << std::endl
00141              << " Terse print out of FED cabling:" << std::endl;
00142           cabling_->terse(ss);
00143           LogTrace("SiStripRawToDigi") << ss.str();
00144         }
00145       }
00146     
00147       if ( edm::isDebugEnabled() ) {
00148         std::stringstream sss;
00149         sss << "[sistrip::RawToDigiModule::" << __func__ << "]"
00150             << " Summary of FED cabling:" << std::endl;
00151         cabling_->summary(sss);
00152         LogTrace("SiStripRawToDigi") << sss.str();
00153       }
00154       cacheId_ = cache_id;
00155     }
00156   }
00157 
00158 }
00159