Skip to content

Commit

Permalink
Merge pull request #12762 from abaty/CMSSW_8_0_0_pre2_SiStripErrors
Browse files Browse the repository at this point in the history
Fix for SiStripErrors in HI repacking (porting PR #12674)
  • Loading branch information
cmsbuild committed Dec 15, 2015
2 parents 6c316ac + b80189e commit 313aba8
Show file tree
Hide file tree
Showing 8 changed files with 461 additions and 79 deletions.
Expand Up @@ -8,7 +8,9 @@
SiStripDigiToZSRaw = EventFilter.SiStripRawToDigi.SiStripDigiToRaw_cfi.SiStripDigiToRaw.clone(
InputModuleLabel = 'siStripZeroSuppression',
InputDigiLabel = cms.string('VirginRaw'),
FedReadoutMode = cms.string('ZERO_SUPPRESSED')
FedReadoutMode = cms.string('ZERO_SUPPRESSED'),
CopyBufferHeader = cms.bool(True),
RawDataTag = cms.InputTag('rawDataCollector')
)

SiStripRawDigiToVirginRaw = SiStripDigiToZSRaw.clone(
Expand Down
Expand Up @@ -429,6 +429,9 @@ namespace sistrip {
virtual void setChannelStatus(const uint8_t internalFEDChannelNum, const FEDChannelStatus status) = 0;
virtual void setFEUnitMajorityAddress(const uint8_t internalFEUnitNum, const uint8_t address) = 0;
virtual void setBEStatusRegister(const FEDBackendStatusRegister beStatusRegister) = 0;
virtual void setDAQRegister(const uint32_t daqRegister) = 0;
virtual void setDAQRegister2(const uint32_t daqRegister2) = 0;
virtual void set32BitReservedRegister(const uint8_t internalFEUnitNum, const uint32_t reservedRegister) = 0;
virtual void setFEUnitLength(const uint8_t internalFEUnitNum, const uint16_t length) = 0;
void setChannelStatus(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum, const FEDChannelStatus status);
};
Expand All @@ -453,6 +456,9 @@ namespace sistrip {
virtual void setChannelStatus(const uint8_t internalFEDChannelNum, const FEDChannelStatus status);
virtual void setFEUnitMajorityAddress(const uint8_t internalFEUnitNum, const uint8_t address);
virtual void setBEStatusRegister(const FEDBackendStatusRegister beStatusRegister);
virtual void setDAQRegister(const uint32_t daqRegister);
virtual void setDAQRegister2(const uint32_t daqRegister2);
virtual void set32BitReservedRegister(const uint8_t internalFEUnitNum, const uint32_t reservedRegister);
virtual void setFEUnitLength(const uint8_t internalFEUnitNum, const uint16_t length);
private:
static const size_t APV_ERROR_HEADER_SIZE_IN_64BIT_WORDS = 3;
Expand Down Expand Up @@ -503,18 +509,19 @@ namespace sistrip {
virtual void setBEStatusRegister(const FEDBackendStatusRegister beStatusRegister);
virtual void setDAQRegister(const uint32_t daqRegister);
virtual void setDAQRegister2(const uint32_t daqRegister2);
virtual void set32BitReservedRegister(const uint8_t internalFEUnitNum, const uint32_t reservedRegister);
virtual void setFEUnitLength(const uint8_t internalFEUnitNum, const uint16_t length);
static uint32_t get32BitWordFrom(const uint8_t* startOfWord);
const uint8_t* feWord(const uint8_t internalFEUnitNum) const;
uint8_t* feWord(const uint8_t internalFEUnitNum);
FEDFullDebugHeader(const std::vector<uint16_t>& feUnitLengths = std::vector<uint16_t>(FEUNITS_PER_FED,0),
const std::vector<uint8_t>& feMajorityAddresses = std::vector<uint8_t>(FEUNITS_PER_FED,0),
const std::vector<FEDChannelStatus>& channelStatus = std::vector<FEDChannelStatus>(FEDCH_PER_FED,CHANNEL_STATUS_NO_PROBLEMS),
const FEDBackendStatusRegister beStatusRegister = FEDBackendStatusRegister(),
const uint32_t daqRegister = 0, const uint32_t daqRegister2 = 0);
private:
bool getBit(const uint8_t internalFEDChannelNum, const uint8_t bit) const;
static uint32_t get32BitWordFrom(const uint8_t* startOfWord);
static void set32BitWordAt(uint8_t* startOfWord, const uint32_t value);
const uint8_t* feWord(const uint8_t internalFEUnitNum) const;
uint8_t* feWord(const uint8_t internalFEUnitNum);
void setBit(const uint8_t internalFEDChannelNum, const uint8_t bit, const bool value);

//These methods return true if there was an error of the appropriate type (ie if the error bit is 0).
Expand Down
410 changes: 341 additions & 69 deletions EventFilter/SiStripRawToDigi/plugins/SiStripDigiToRaw.cc

Large diffs are not rendered by default.

24 changes: 24 additions & 0 deletions EventFilter/SiStripRawToDigi/plugins/SiStripDigiToRaw.h
Expand Up @@ -32,6 +32,7 @@ namespace sistrip {
DigiToRaw( FEDReadoutMode, bool use_fed_key );
~DigiToRaw();

//digi to raw with default headers
void createFedBuffers( edm::Event&,
edm::ESHandle<SiStripFedCabling>& cabling,
edm::Handle< edm::DetSetVector<SiStripDigi> >& digis,
Expand All @@ -40,6 +41,18 @@ namespace sistrip {
edm::ESHandle<SiStripFedCabling>& cabling,
edm::Handle< edm::DetSetVector<SiStripRawDigi> >& digis,
std::auto_ptr<FEDRawDataCollection>& buffers);

//with input raw data for copying header
void createFedBuffers( edm::Event&,
edm::ESHandle<SiStripFedCabling>& cabling,
edm::Handle<FEDRawDataCollection> & rawbuffers,
edm::Handle< edm::DetSetVector<SiStripDigi> >& digis,
std::auto_ptr<FEDRawDataCollection>& buffers );
void createFedBuffers( edm::Event&,
edm::ESHandle<SiStripFedCabling>& cabling,
edm::Handle<FEDRawDataCollection> & rawbuffers,
edm::Handle< edm::DetSetVector<SiStripRawDigi> >& digis,
std::auto_ptr<FEDRawDataCollection>& buffers);

inline void fedReadoutMode( FEDReadoutMode mode ) { mode_ = mode; }

Expand All @@ -51,6 +64,17 @@ namespace sistrip {
edm::Handle< edm::DetSetVector<Digi_t> >& digis,
std::auto_ptr<FEDRawDataCollection>& buffers,
bool zeroSuppressed);

template<class Digi_t>
void createFedBuffers_( edm::Event&,
edm::ESHandle<SiStripFedCabling>& cabling,
edm::Handle<FEDRawDataCollection> & rawbuffers,
edm::Handle< edm::DetSetVector<Digi_t> >& digis,
std::auto_ptr<FEDRawDataCollection>& buffers,
bool zeroSuppressed);



uint16_t STRIP(const edm::DetSet<SiStripDigi>::const_iterator& it, const edm::DetSet<SiStripDigi>::const_iterator& begin) const;
uint16_t STRIP(const edm::DetSet<SiStripRawDigi>::const_iterator& it, const edm::DetSet<SiStripRawDigi>::const_iterator& begin) const;

Expand Down
58 changes: 53 additions & 5 deletions EventFilter/SiStripRawToDigi/plugins/SiStripDigiToRawModule.cc
@@ -1,4 +1,3 @@

#include "SiStripDigiToRawModule.h"
#include "SiStripDigiToRaw.h"

Expand All @@ -7,12 +6,29 @@
#include "FWCore/Framework/interface/ESHandle.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/Utilities/interface/EDGetToken.h"
#include "FWCore/Utilities/interface/InputTag.h"
#include "DataFormats/Common/interface/Handle.h"
#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
#include "CondFormats/DataRecord/interface/SiStripFedCablingRcd.h"
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
#include <cstdlib>

namespace sistrip {

//fill Descriptions needed to define default parameters
void DigiToRawModule::fillDescriptions(edm::ConfigurationDescriptions & descriptions) {
edm::ParameterSetDescription desc;
desc.add<std::string>("InputModuleLabel", "simSiStripDigis");
desc.add<std::string>("InputDigiLabel", "ZeroSuppressed");
desc.add<std::string>("FedReadoutMode", "ZERO_SUPPRESSED");
desc.add<bool>("UseFedKey", false);
desc.add<bool>("UseWrongDigiType", false);
desc.add<bool>("CopyBufferHeader", false);
desc.add<edm::InputTag>("RawDataTag", edm::InputTag("rawDataCollector"));
descriptions.add("SiStripDigiToRawModule",desc);
}

// -----------------------------------------------------------------------------
/**
Expand All @@ -21,10 +37,12 @@ namespace sistrip {
DigiToRawModule::DigiToRawModule( const edm::ParameterSet& pset ) :
inputModuleLabel_( pset.getParameter<std::string>( "InputModuleLabel" ) ),
inputDigiLabel_( pset.getParameter<std::string>( "InputDigiLabel" ) ),
copyBufferHeader_(pset.getParameter<bool>("CopyBufferHeader")),
mode_( fedReadoutModeFromString(pset.getParameter<std::string>( "FedReadoutMode" ))),
rawdigi_( false ),
digiToRaw_(0),
eventCounter_(0)
eventCounter_(0),
rawDataTag_(pset.getParameter<edm::InputTag>("RawDataTag"))
{
if ( edm::isDebugEnabled() ) {
LogDebug("DigiToRawModule")
Expand Down Expand Up @@ -77,7 +95,15 @@ namespace sistrip {
tokenRawDigi = consumes< edm::DetSetVector<SiStripRawDigi> >(edm::InputTag(inputModuleLabel_, inputDigiLabel_));
} else {
tokenDigi = consumes< edm::DetSetVector<SiStripDigi> >(edm::InputTag(inputModuleLabel_, inputDigiLabel_));

}
if (copyBufferHeader_){
//CAMM input raw module label or same as digi ????
if( edm::isDebugEnabled()) {
edm::LogWarning("DigiToRawModule")
<< "[sistrip::DigiToRawModule::DigiToRawModule]"
<< "Copying buffer header from collection " << rawDataTag_;
}
tokenRawBuffer = consumes<FEDRawDataCollection>(rawDataTag_);
}

produces<FEDRawDataCollection>();
Expand Down Expand Up @@ -112,16 +138,38 @@ namespace sistrip {
edm::ESHandle<SiStripFedCabling> cabling;
iSetup.get<SiStripFedCablingRcd>().get( cabling );

//get buffer header from original rawdata
edm::Handle<FEDRawDataCollection> rawbuffers;
if (copyBufferHeader_){
if( edm::isDebugEnabled()) {
edm::LogWarning("DigiToRawModule")
<< "[sistrip::DigiToRawModule::DigiToRawModule]"
<< "Getting raw buffer: ";
}
try {
iEvent.getByToken( tokenRawBuffer, rawbuffers );
} catch (const cms::Exception& e){
if( edm::isDebugEnabled()) {
edm::LogWarning("DigiToRawModule")
<< "[sistrip::DigiToRawModule::DigiToRawModule]"
<< " Failed to get collection " << rawDataTag_;
}
}
}

if( rawdigi_ ) {
edm::Handle< edm::DetSetVector<SiStripRawDigi> > rawdigis;
iEvent.getByToken( tokenRawDigi, rawdigis );
digiToRaw_->createFedBuffers( iEvent, cabling, rawdigis, buffers );
if (copyBufferHeader_) digiToRaw_->createFedBuffers( iEvent, cabling, rawbuffers, rawdigis, buffers );
else digiToRaw_->createFedBuffers( iEvent, cabling, rawdigis, buffers );
} else {
edm::Handle< edm::DetSetVector<SiStripDigi> > digis;
iEvent.getByToken( tokenDigi, digis );
digiToRaw_->createFedBuffers( iEvent, cabling, digis, buffers );
if (copyBufferHeader_) digiToRaw_->createFedBuffers( iEvent, cabling, rawbuffers, digis, buffers );
else digiToRaw_->createFedBuffers( iEvent, cabling, digis, buffers );
}


iEvent.put( buffers );

}
Expand Down
9 changes: 9 additions & 0 deletions EventFilter/SiStripRawToDigi/plugins/SiStripDigiToRawModule.h
Expand Up @@ -7,8 +7,12 @@
#include "DataFormats/Common/interface/DetSetVector.h"
#include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
#include "DataFormats/SiStripDigi/interface/SiStripRawDigi.h"
#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
#include "boost/cstdint.hpp"
#include <string>
namespace edm {
class ConfigurationDescriptions;
}

namespace sistrip {

Expand All @@ -32,17 +36,22 @@ namespace sistrip {
virtual void endJob() {}

virtual void produce( edm::Event&, const edm::EventSetup& );
static void fillDescriptions(edm::ConfigurationDescriptions & descriptions);

private:

std::string inputModuleLabel_;
std::string inputDigiLabel_;
//CAMM can we do without this bool based on the mode ?
bool copyBufferHeader_;
FEDReadoutMode mode_;
bool rawdigi_;
DigiToRaw* digiToRaw_;
uint32_t eventCounter_;
edm::EDGetTokenT< edm::DetSetVector<SiStripRawDigi> > tokenRawDigi;
edm::EDGetTokenT< edm::DetSetVector<SiStripDigi> > tokenDigi;
edm::InputTag rawDataTag_;
edm::EDGetTokenT<FEDRawDataCollection> tokenRawBuffer;

};

Expand Down
4 changes: 3 additions & 1 deletion EventFilter/SiStripRawToDigi/python/SiStripDigiToRaw_cfi.py
Expand Up @@ -6,6 +6,8 @@
InputDigiLabel = cms.string('ZeroSuppressed'),
FedReadoutMode = cms.string('ZERO_SUPPRESSED'),
UseFedKey = cms.bool(False),
UseWrongDigiType = cms.bool(False)
UseWrongDigiType = cms.bool(False),
CopyBufferHeader = cms.bool(False),
RawDataTag = cms.InputTag('rawDataCollector')
)

18 changes: 18 additions & 0 deletions EventFilter/SiStripRawToDigi/src/SiStripFEDBufferComponents.cc
Expand Up @@ -1096,6 +1096,18 @@ namespace sistrip {
{
return;
}
void FEDAPVErrorHeader::setDAQRegister(const uint32_t daqRegister)
{
return;
}
void FEDAPVErrorHeader::setDAQRegister2(const uint32_t daqRegister2)
{
return;
}
void FEDAPVErrorHeader::set32BitReservedRegister(const uint8_t internalFEUnitNum, const uint32_t reservedRegister)
{
return;
}
void FEDAPVErrorHeader::setFEUnitLength(const uint8_t internalFEUnitNum, const uint16_t length)
{
return;
Expand Down Expand Up @@ -1231,6 +1243,12 @@ namespace sistrip {
{
set32BitWordAt(feWord(6)+10,daqRegister2);
}

//used by DigiToRaw to copy reserved registers in internalFEUnit buffers 1 through 5
void FEDFullDebugHeader::set32BitReservedRegister(const uint8_t internalFEUnitNum, const uint32_t reservedRegister)
{
set32BitWordAt(feWord(internalFEUnitNum)+10,reservedRegister);
}

void FEDFullDebugHeader::setFEUnitLength(const uint8_t internalFEUnitNum, const uint16_t length)
{
Expand Down

0 comments on commit 313aba8

Please sign in to comment.