CMS 3D CMS Logo

Public Member Functions | Private Member Functions | Private Attributes

SiStripFEDCheckPlugin Class Reference

Inheritance diagram for SiStripFEDCheckPlugin:
edm::EDAnalyzer edm::EDConsumerBase

List of all members.

Public Member Functions

 SiStripFEDCheckPlugin (const edm::ParameterSet &)
 ~SiStripFEDCheckPlugin ()

Private Member Functions

virtual void analyze (const edm::Event &, const edm::EventSetup &)
virtual void beginJob ()
void doUpdateIfNeeded ()
virtual void endJob ()
virtual void endRun ()
void fillFatalError (unsigned int fedId, bool fatalError)
void fillNonFatalError (unsigned int fedId, float nonFatalError)
void fillPresent (unsigned int fedId, bool present)
bool hasFatalError (const FEDRawData &fedData, unsigned int fedId) const
bool hasNonFatalError (const FEDRawData &fedData, unsigned int fedId) const
void updateCabling (const edm::EventSetup &eventSetup)
void updateHistograms ()

Private Attributes

const SiStripFedCablingcabling_
uint32_t cablingCacheId_
bool checkChannelLengths_
bool checkChannelStatusBits_
bool checkFELengths_
bool checkPacketCodes_
std::string dirName_
bool doPayloadChecks_
DQMStoredqm_
unsigned int eventCount_
std::vector< unsigned int > fedFatalErrorBinContents_
MonitorElementfedFatalErrors_
std::vector< unsigned int > fedNonFatalErrorBinContents_
MonitorElementfedNonFatalErrors_
MonitorElementfedsPresent_
std::vector< unsigned int > fedsPresentBinContents_
bool printDebug_
edm::InputTag rawDataTag_
unsigned int updateFrequency_
bool writeDQMStore_

Detailed Description

Description: DQM source application to produce data integrety histograms for SiStrip data for use in HLT and Prompt reco

Definition at line 51 of file SiStripFEDDataCheck.cc.


Constructor & Destructor Documentation

SiStripFEDCheckPlugin::SiStripFEDCheckPlugin ( const edm::ParameterSet iConfig) [explicit]

Definition at line 106 of file SiStripFEDDataCheck.cc.

References checkChannelLengths_, checkChannelStatusBits_, checkFELengths_, checkPacketCodes_, doPayloadChecks_, and printDebug_.

  : rawDataTag_(iConfig.getParameter<edm::InputTag>("RawDataTag")),
    dirName_(iConfig.getUntrackedParameter<std::string>("DirName","SiStrip/FEDIntegrity/")),
    printDebug_(iConfig.getUntrackedParameter<bool>("PrintDebugMessages",false)),
    writeDQMStore_(iConfig.getUntrackedParameter<bool>("WriteDQMStore",false)),
    updateFrequency_(iConfig.getUntrackedParameter<unsigned int>("HistogramUpdateFrequency",0)),
    fedsPresentBinContents_(FEDNumbering::MAXSiStripFEDID+1,0),
    fedFatalErrorBinContents_(FEDNumbering::MAXSiStripFEDID+1,0),
    fedNonFatalErrorBinContents_(FEDNumbering::MAXSiStripFEDID+1,0),
    eventCount_(0),
    doPayloadChecks_(iConfig.getUntrackedParameter<bool>("DoPayloadChecks",true)),
    checkChannelLengths_(iConfig.getUntrackedParameter<bool>("CheckChannelLengths",true)),
    checkPacketCodes_(iConfig.getUntrackedParameter<bool>("CheckChannelPacketCodes",true)),
    checkFELengths_(iConfig.getUntrackedParameter<bool>("CheckFELengths",true)),
    checkChannelStatusBits_(iConfig.getUntrackedParameter<bool>("CheckChannelStatus",true)),
    cablingCacheId_(0)
{
  if (printDebug_ && !doPayloadChecks_ && (checkChannelLengths_ || checkPacketCodes_ || checkFELengths_)) {
    std::stringstream ss;
    ss << "Payload checks are disabled but individual payload checks have been enabled. The following payload checks will be skipped: ";
    if (checkChannelLengths_) ss << "Channel length check, ";
    if (checkPacketCodes_) ss << "Channel packet code check, ";
    if (checkChannelStatusBits_) ss << "Cabled channel status bits checks, ";
    if (checkFELengths_) ss << "FE Unit legnth check";
    edm::LogWarning("SiStripFEDCheck") << ss.str();
  }
}
SiStripFEDCheckPlugin::~SiStripFEDCheckPlugin ( )

Definition at line 134 of file SiStripFEDDataCheck.cc.

{
}

Member Function Documentation

void SiStripFEDCheckPlugin::analyze ( const edm::Event iEvent,
const edm::EventSetup iSetup 
) [private, virtual]

Implements edm::EDAnalyzer.

Definition at line 145 of file SiStripFEDDataCheck.cc.

References cabling_, checkChannelLengths_, checkChannelStatusBits_, checkFELengths_, checkPacketCodes_, FEDRawData::data(), doPayloadChecks_, doUpdateIfNeeded(), FEDRawDataCollection::FEDData(), fillFatalError(), fillNonFatalError(), fillPresent(), edm::EventSetup::get(), edm::Event::getByLabel(), FEDNumbering::MAXSiStripFEDID, FEDNumbering::MINSiStripFEDID, printDebug_, edm::ESHandle< T >::product(), rawDataTag_, FEDRawData::size(), and updateCabling().

{
  //Retrieve tracker topology from geometry
  edm::ESHandle<TrackerTopology> tTopoHandle;
  iSetup.get<IdealGeometryRecord>().get(tTopoHandle);
  const TrackerTopology* const tTopo = tTopoHandle.product();

  //update cabling
  updateCabling(iSetup);
  
  //get raw data
  edm::Handle<FEDRawDataCollection> rawDataCollectionHandle;
  const bool gotData = iEvent.getByLabel(rawDataTag_,rawDataCollectionHandle);
  if (!gotData) {
    //module is required to silently do nothing when data is not present
    return;
  }
  const FEDRawDataCollection& rawDataCollection = *rawDataCollectionHandle;
  
  //get FED IDs
  const unsigned int siStripFedIdMin = FEDNumbering::MINSiStripFEDID;
  const unsigned int siStripFedIdMax = FEDNumbering::MAXSiStripFEDID;
  
  //FED errors
  FEDErrors lFedErrors;

  //loop over siStrip FED IDs
  for (unsigned int fedId = siStripFedIdMin; fedId <= siStripFedIdMax; fedId++) {
    const FEDRawData& fedData = rawDataCollection.FEDData(fedId);

    //create an object to fill all errors
    //third param to false:save time by not initialising anything not used here
    lFedErrors.initialiseFED(fedId,cabling_,tTopo,false);


    //check data exists
    if (!fedData.size() || !fedData.data()) {
      fillPresent(fedId,0);
      continue;
    }
    //fill buffer present histogram
    fillPresent(fedId,1);

    //check for fatal errors
    //no need for debug output
    bool hasFatalErrors = false;
    float rateNonFatal = 0;

    std::auto_ptr<const sistrip::FEDBuffer> buffer;

    if (!lFedErrors.fillFatalFEDErrors(fedData,0)) {
      hasFatalErrors = true;
    }
    else {
      //need to construct full object to go any further
      if (doPayloadChecks_ || checkChannelStatusBits_) {
        
        buffer.reset(new sistrip::FEDBuffer(fedData.data(),fedData.size(),true));
        if (doPayloadChecks_) {

          bool channelLengthsOK = checkChannelLengths_ ? buffer->checkChannelLengthsMatchBufferLength() : true;
          bool channelPacketCodesOK = checkPacketCodes_ ? buffer->checkChannelPacketCodes() : true;
          bool feLengthsOK = checkFELengths_ ? buffer->checkFEUnitLengths() : true;
          if ( !channelLengthsOK ||
               !channelPacketCodesOK ||
               !feLengthsOK ) {
            hasFatalErrors = true;
          }
        }
        if (checkChannelStatusBits_) rateNonFatal = lFedErrors.fillNonFatalFEDErrors(buffer.get(),cabling_);
      }
    }

    if (hasFatalErrors) {
      fillFatalError(fedId,1);
      if (printDebug_) {
        if (!buffer.get()) buffer.reset(new sistrip::FEDBuffer(fedData.data(),fedData.size(),true));
        edm::LogInfo("SiStripFEDCheck") << "Fatal error with FED ID " << fedId << ". Check summary: " 
                                        << std::endl << buffer->checkSummary() << std::endl;
        std::stringstream ss;
        buffer->dump(ss);
        edm::LogInfo("SiStripFEDCheck") << ss.str();
      }
    }
    else {
      fillFatalError(fedId,0);
      //fill non-fatal errors histogram if there were no fatal errors
      fillNonFatalError(fedId,rateNonFatal);
      if (printDebug_ && rateNonFatal > 0) {
        if (!buffer.get()) buffer.reset(new sistrip::FEDBuffer(fedData.data(),fedData.size(),true));
        edm::LogInfo("SiStripFEDCheck") << "Non-fatal error with FED ID " << fedId 
                                        << " for " << rateNonFatal << " of the channels. Check summary: " 
                                        << std::endl << buffer->checkSummary() << std::endl;
        std::stringstream ss;
        buffer->dump(ss);
        edm::LogInfo("SiStripFEDCheck") << ss.str();
      }

    }
  }//loop over FED IDs
  
  //update histograms if needed
  doUpdateIfNeeded();
}
void SiStripFEDCheckPlugin::beginJob ( void  ) [private, virtual]

Reimplemented from edm::EDAnalyzer.

Definition at line 252 of file SiStripFEDDataCheck.cc.

References DQMStore::book1D(), dirName_, dqm_, fedFatalErrors_, fedNonFatalErrors_, fedsPresent_, FEDNumbering::MAXSiStripFEDID, FEDNumbering::MINSiStripFEDID, MonitorElement::setAxisTitle(), and DQMStore::setCurrentFolder().

{
  //get FED IDs
  const unsigned int siStripFedIdMin = FEDNumbering::MINSiStripFEDID;
  const unsigned int siStripFedIdMax = FEDNumbering::MAXSiStripFEDID;
  //get DQM store
  dqm_ = &(*edm::Service<DQMStore>());
  dqm_->setCurrentFolder(dirName_);
  //book histograms
  fedsPresent_ = dqm_->book1D("FEDEntries",
                              "Number of times FED buffer is present in data",
                              siStripFedIdMax-siStripFedIdMin+1,
                              siStripFedIdMin-0.5,siStripFedIdMax+0.5);
  fedsPresent_->setAxisTitle("FED-ID",1);
  fedFatalErrors_ = dqm_->book1D("FEDFatal",
                              "Number of fatal errors in FED buffer",
                              siStripFedIdMax-siStripFedIdMin+1,
                              siStripFedIdMin-0.5,siStripFedIdMax+0.5);
  fedFatalErrors_->setAxisTitle("FED-ID",1);
  fedNonFatalErrors_ = dqm_->book1D("FEDNonFatal",
                              "Number of non fatal errors in FED buffer",
                              siStripFedIdMax-siStripFedIdMin+1,
                              siStripFedIdMin-0.5,siStripFedIdMax+0.5);
  fedNonFatalErrors_->setAxisTitle("FED-ID",1);
}
void SiStripFEDCheckPlugin::doUpdateIfNeeded ( ) [private]

Definition at line 331 of file SiStripFEDDataCheck.cc.

References eventCount_, updateFrequency_, and updateHistograms().

Referenced by analyze().

void SiStripFEDCheckPlugin::endJob ( void  ) [private, virtual]

Reimplemented from edm::EDAnalyzer.

Definition at line 287 of file SiStripFEDDataCheck.cc.

References dqm_, DQMStore::save(), and writeDQMStore_.

{
  if (writeDQMStore_) dqm_->save("DQMStore.root");
}
void SiStripFEDCheckPlugin::endRun ( void  ) [private, virtual]

Definition at line 280 of file SiStripFEDDataCheck.cc.

References updateHistograms().

void SiStripFEDCheckPlugin::fillFatalError ( unsigned int  fedId,
bool  fatalError 
) [inline, private]

Definition at line 312 of file SiStripFEDDataCheck.cc.

References fedFatalErrorBinContents_, fedFatalErrors_, MonitorElement::Fill(), and updateFrequency_.

Referenced by analyze().

{
  if (updateFrequency_) {
    if (fatalError) fedFatalErrorBinContents_[fedId]++;
  } else {
    //fedFatalErrors_->Fill( fatalError ? 1 : 0 );
    if (fatalError) fedFatalErrors_->Fill(fedId);
  }
}
void SiStripFEDCheckPlugin::fillNonFatalError ( unsigned int  fedId,
float  nonFatalError 
) [inline, private]

Definition at line 322 of file SiStripFEDDataCheck.cc.

References fedNonFatalErrorBinContents_, fedNonFatalErrors_, MonitorElement::Fill(), and updateFrequency_.

Referenced by analyze().

{
  if (updateFrequency_) {
    if (nonFatalError>0) fedNonFatalErrorBinContents_[fedId]++;//nonFatalError;
  } else {
    if (nonFatalError>0) fedNonFatalErrors_->Fill(fedId);
  }
}
void SiStripFEDCheckPlugin::fillPresent ( unsigned int  fedId,
bool  present 
) [inline, private]

Definition at line 304 of file SiStripFEDDataCheck.cc.

References fedsPresent_, fedsPresentBinContents_, MonitorElement::Fill(), and updateFrequency_.

Referenced by analyze().

{
  if (present) {
    if (updateFrequency_) fedsPresentBinContents_[fedId]++;
    else fedsPresent_->Fill(fedId);
  }
}
bool SiStripFEDCheckPlugin::hasFatalError ( const FEDRawData fedData,
unsigned int  fedId 
) const [private]
bool SiStripFEDCheckPlugin::hasNonFatalError ( const FEDRawData fedData,
unsigned int  fedId 
) const [private]
void SiStripFEDCheckPlugin::updateCabling ( const edm::EventSetup eventSetup) [private]

Definition at line 293 of file SiStripFEDDataCheck.cc.

References cabling_, cablingCacheId_, edm::EventSetup::get(), and edm::ESHandle< T >::product().

Referenced by analyze().

{
  uint32_t currentCacheId = eventSetup.get<SiStripFedCablingRcd>().cacheIdentifier();
  if (cablingCacheId_ != currentCacheId) {
    edm::ESHandle<SiStripFedCabling> cablingHandle;
    eventSetup.get<SiStripFedCablingRcd>().get(cablingHandle);
    cabling_ = cablingHandle.product();
    cablingCacheId_ = currentCacheId;
  }
}
void SiStripFEDCheckPlugin::updateHistograms ( ) [private]

Definition at line 339 of file SiStripFEDDataCheck.cc.

References newFWLiteAna::bin, fedFatalErrorBinContents_, fedFatalErrors_, fedNonFatalErrorBinContents_, fedNonFatalErrors_, fedsPresent_, fedsPresentBinContents_, MonitorElement::getTH1(), FEDNumbering::MAXSiStripFEDID, FEDNumbering::MINSiStripFEDID, and updateFrequency_.

Referenced by doUpdateIfNeeded(), and endRun().

{
  //if the cache is not being used then do nothing
  if (!updateFrequency_) return;
  const unsigned int siStripFedIdMin = FEDNumbering::MINSiStripFEDID;
  const unsigned int siStripFedIdMax = FEDNumbering::MAXSiStripFEDID;
  unsigned int entriesFedsPresent = 0;
  unsigned int entriesFatalErrors = 0;
  unsigned int entriesNonFatalErrors = 0;
  for (unsigned int fedId = siStripFedIdMin, bin = 1; fedId < siStripFedIdMax+1; fedId++, bin++) {
    unsigned int fedsPresentBin = fedsPresentBinContents_[fedId];
    fedsPresent_->getTH1()->SetBinContent(bin,fedsPresentBin);
    entriesFedsPresent += fedsPresentBin;
    unsigned int fedFatalErrorsBin = fedFatalErrorBinContents_[fedId];
    fedFatalErrors_->getTH1()->SetBinContent(bin,fedFatalErrorsBin);
    entriesFatalErrors += fedFatalErrorsBin;
    unsigned int fedNonFatalErrorsBin = fedNonFatalErrorBinContents_[fedId];
    fedNonFatalErrors_->getTH1()->SetBinContent(bin,fedNonFatalErrorsBin);
    entriesNonFatalErrors += fedNonFatalErrorsBin;
  }
  fedsPresent_->getTH1()->SetEntries(entriesFedsPresent);
  fedFatalErrors_->getTH1()->SetEntries(entriesFatalErrors);
  fedNonFatalErrors_->getTH1()->SetEntries(entriesNonFatalErrors);
}

Member Data Documentation

Definition at line 98 of file SiStripFEDDataCheck.cc.

Referenced by analyze(), and updateCabling().

Definition at line 97 of file SiStripFEDDataCheck.cc.

Referenced by updateCabling().

Definition at line 94 of file SiStripFEDDataCheck.cc.

Referenced by analyze(), and SiStripFEDCheckPlugin().

Definition at line 94 of file SiStripFEDDataCheck.cc.

Referenced by analyze(), and SiStripFEDCheckPlugin().

Definition at line 94 of file SiStripFEDDataCheck.cc.

Referenced by analyze(), and SiStripFEDCheckPlugin().

Definition at line 94 of file SiStripFEDDataCheck.cc.

Referenced by analyze(), and SiStripFEDCheckPlugin().

std::string SiStripFEDCheckPlugin::dirName_ [private]

Definition at line 75 of file SiStripFEDDataCheck.cc.

Referenced by beginJob().

Definition at line 94 of file SiStripFEDDataCheck.cc.

Referenced by analyze(), and SiStripFEDCheckPlugin().

Definition at line 80 of file SiStripFEDDataCheck.cc.

Referenced by beginJob(), and endJob().

unsigned int SiStripFEDCheckPlugin::eventCount_ [private]

Definition at line 91 of file SiStripFEDDataCheck.cc.

Referenced by doUpdateIfNeeded().

std::vector<unsigned int> SiStripFEDCheckPlugin::fedFatalErrorBinContents_ [private]

Definition at line 89 of file SiStripFEDDataCheck.cc.

Referenced by fillFatalError(), and updateHistograms().

Definition at line 82 of file SiStripFEDDataCheck.cc.

Referenced by beginJob(), fillFatalError(), and updateHistograms().

std::vector<unsigned int> SiStripFEDCheckPlugin::fedNonFatalErrorBinContents_ [private]

Definition at line 90 of file SiStripFEDDataCheck.cc.

Referenced by fillNonFatalError(), and updateHistograms().

Definition at line 83 of file SiStripFEDDataCheck.cc.

Referenced by beginJob(), fillNonFatalError(), and updateHistograms().

Definition at line 81 of file SiStripFEDDataCheck.cc.

Referenced by beginJob(), fillPresent(), and updateHistograms().

std::vector<unsigned int> SiStripFEDCheckPlugin::fedsPresentBinContents_ [private]

Definition at line 88 of file SiStripFEDDataCheck.cc.

Referenced by fillPresent(), and updateHistograms().

Definition at line 76 of file SiStripFEDDataCheck.cc.

Referenced by analyze(), and SiStripFEDCheckPlugin().

Definition at line 74 of file SiStripFEDDataCheck.cc.

Referenced by analyze().

Definition at line 77 of file SiStripFEDDataCheck.cc.

Referenced by endJob().