CMS 3D CMS Logo

List of all members | Public Types | Public Member Functions | Private Attributes
sistrip::SpyUnpacker Class Reference

Unpacks spy channel data into scope mode-like digis. More...

#include <SiStripSpyUnpacker.h>

Public Types

typedef std::vector< uint32_t > Counters
 
typedef edm::DetSetVector< SiStripRawDigiRawDigis
 

Public Member Functions

void createDigis (const SiStripFedCabling &, const FEDRawDataCollection &, RawDigis *pDigis, const std::vector< uint32_t > &ids, Counters *pTotalEventCounts, Counters *pL1ACounts, uint32_t *aRunRef)
 Creates the scope mode digis for the supplied FED IDs or detIds and stores event counters. More...
 
 SpyUnpacker (const bool allowIncompleteEvents)
 Constructor. More...
 
 ~SpyUnpacker ()
 Destructor. More...
 

Private Attributes

const bool allowIncompleteEvents_
 

Detailed Description

Unpacks spy channel data into scope mode-like digis.

Author
Nick Cripps
Date
Autumn 2009

TODO: Implement unpacking by detID.

— Modifications: ---— A.-M. Magnan, 11/03/10: change Counters map to vectors: ---— save space and provide faster access to elements. ---— A.-M. Magnan, 25/02/10: add run number to the event ---— A.-M. Magnan, 13/01/10: change Counters map to be keyed by fedid

Definition at line 31 of file SiStripSpyUnpacker.h.

Member Typedef Documentation

typedef std::vector<uint32_t> sistrip::SpyUnpacker::Counters

Definition at line 35 of file SiStripSpyUnpacker.h.

Definition at line 34 of file SiStripSpyUnpacker.h.

Constructor & Destructor Documentation

sistrip::SpyUnpacker::SpyUnpacker ( const bool  allowIncompleteEvents)

Constructor.

Definition at line 29 of file SiStripSpyUnpacker.cc.

References edm::isDebugEnabled(), and LogTrace.

29  :
30  allowIncompleteEvents_(allowIncompleteEvents)
31  {
32  if ( edm::isDebugEnabled() ) {
33  LogTrace("SiStripSpyUnpacker")
34  << "[sistrip::SpyUnpacker::"<<__func__<<"]"
35  <<" Constructing object...";
36  }
37  } // end of SpyUnpacker constructor.
bool isDebugEnabled()
const bool allowIncompleteEvents_
#define LogTrace(id)
sistrip::SpyUnpacker::~SpyUnpacker ( )

Destructor.

Definition at line 39 of file SiStripSpyUnpacker.cc.

References edm::isDebugEnabled(), and LogTrace.

39  {
40  if ( edm::isDebugEnabled() ) {
41  LogTrace("SiStripSpyUnpacker")
42  << "[sistrip::SpyUnpacker::"<<__func__<<"]"
43  << " Destructing object...";
44  }
45  } // end of SpyUnpacker destructor.
bool isDebugEnabled()
#define LogTrace(id)

Member Function Documentation

void sistrip::SpyUnpacker::createDigis ( const SiStripFedCabling cabling,
const FEDRawDataCollection buffers,
RawDigis pDigis,
const std::vector< uint32_t > &  ids,
Counters pTotalEventCounts,
Counters pL1ACounts,
uint32_t *  aRunRef 
)

Creates the scope mode digis for the supplied FED IDs or detIds and stores event counters.

If FED IDs are supplied (useFedId=true), unpacks all channels found in the cabling with data. If an empty vector of IDs is supplied, it unpacks all it can find in the FEDRawDataCollection.

Definition at line 47 of file SiStripSpyUnpacker.cc.

References sistrip::FEDSpyChannelUnpacker::adc(), sistrip::DetSetVectorFiller< T, dsvIsSparse >::addItem(), allowIncompleteEvents_, edmScanValgrind::buffer, officialStyle::chan, sistrip::DetSetVectorFiller< T, dsvIsSparse >::createDetSetVector(), FEDRawData::data(), MillePedeFileConverter_cfg::e, Exception, sistrip::FED_ID_MAX, sistrip::FED_ID_MIN, sistrip::FEDCH_PER_FED, SiStripFedCabling::fedConnections(), FEDRawDataCollection::FEDData(), SiStripFedCabling::fedIds(), sistrip::FEDSpyChannelUnpacker::hasData(), input, sistrip::invalid_, edm::isDebugEnabled(), crabWrapper::key, sistrip::DetSetVectorFiller< T, dsvIsSparse >::newChannel(), FEDRawData::size(), sistrip::SPY_SAMPLES_PER_CHANNEL, edm::DetSetVector< T >::swap(), and cms::Exception::what().

Referenced by sistrip::SpyUnpackerModule::produce().

54  {
55  //create DSV filler to fill output
56 
57  //As of Feb 2010, bug in DataFormats/SiStripCommon/interface/ConstantsForHardwareSystems.h:
58  //number of feds=max-min+1 (440...). Corrected in head of DataFormats/SiStripCommon package.
59 
60  uint16_t nFeds = static_cast<uint16_t>( FED_ID_MAX - FED_ID_MIN + 1);
61 
62  RawDigiDetSetVectorFiller dsvFiller(nFeds*FEDCH_PER_FED,nFeds*FEDCH_PER_FED*SPY_SAMPLES_PER_CHANNEL);
63 
64  //check if FEDs found in cabling map and event data
65  if ( edm::isDebugEnabled() ) {
66  if ( cabling.fedIds().empty() ) {
67  edm::LogWarning("SiStripSpyUnpacker")
68  << "[sistrip::SpyUnpacker::" << __func__ << "]"
69  << " No FEDs found in cabling map!";
70  }
71  }
72 
73  //retrieve FED ids from cabling map and iterate through
74  std::vector<uint32_t>::const_iterator ifed = ids.begin();
75  std::vector<uint32_t>::const_iterator endfed = ids.end();
76 
77  //reference value for run number
78  //encoded per fed but should be the same for all feds
79  uint32_t lRef = 0;
80 
81  //initialise counter vectors to FED_ID_MAX+1
82  pTotalEventCounts->resize(FED_ID_MAX+1,0);
83  pL1ACounts->resize(FED_ID_MAX+1,0);
84 
85  for ( ; ifed != endfed; ++ifed ) {
86 
87  uint32_t lFedId = (*ifed);
88 
89  //check the fedid is valid:
90  if (lFedId < FED_ID_MIN || lFedId > FED_ID_MAX) {
91  if ( edm::isDebugEnabled() ) {
92  edm::LogWarning("SiStripSpyUnpacker")
93  << "[sistrip::SpyUnpacker::" << __func__ << "]"
94  << " Invalid FED id provided: "
95  << lFedId;
96  }
97  continue;
98  }
99 
100  //retrieve FED raw data for given FED
101  const FEDRawData& input = buffers.FEDData( static_cast<int>(lFedId) );
102  //check on FEDRawData pointer
103  if ( !input.data() ) {
104  if ( edm::isDebugEnabled() ) {
105  edm::LogWarning("SiStripSpyUnpacker")
106  << "[sistrip::SpyUnpacker::" << __func__ << "]"
107  << " NULL pointer to FEDRawData for FED id "
108  << lFedId;
109  }
110  continue;
111  }
112  //check on FEDRawData size
113  if ( !input.size() ) {
114  if ( edm::isDebugEnabled() ) {
115  edm::LogWarning("SiStripSpyUnpacker")
116  << "[sistrip::SpyUnpacker::" << __func__ << "]"
117  << " FEDRawData has zero size for FED id "
118  << lFedId;
119  }
120  continue;
121  }
122 
123  //get the cabling connections for this FED
124  auto conns = cabling.fedConnections(lFedId);
125 
126  //construct FEDBuffer
127  std::unique_ptr<sistrip::FEDSpyBuffer> buffer;
128  try {
129  buffer.reset(new sistrip::FEDSpyBuffer(input.data(),input.size()));
130  if (!buffer->doChecks() && !allowIncompleteEvents_) {
131  throw cms::Exception("FEDSpyBuffer") << "FED Buffer check fails for FED ID " << lFedId << ".";
132  }
133  } catch (const cms::Exception& e) {
134  if ( edm::isDebugEnabled() ) {
135  edm::LogWarning("SiStripSpyUnpacker")
136  << "Exception caught when creating FEDSpyBuffer object for FED " << lFedId << ": " << e.what();
137  }
138  continue;
139  } // end of buffer reset try.
140 
141  // Get the event counter values
142  uint32_t totalEvCount = buffer->spyHeaderTotalEventCount();
143  uint32_t l1ID = buffer->spyHeaderL1ID();
144 
145  uint32_t lGRun = buffer->globalRunNumber();
146 
147  //for the first fed, put it as reference value for others
148  if (lRef == 0) lRef = lGRun;
149  if (lGRun != lRef){
150  edm::LogError("SiStripSpyUnpacker")
151  << " -- Global run encoded in buffer for FED " << lFedId << ": "
152  << lGRun << " is different from reference value " << lRef
153  << std::endl;
154  }
155 
156  // Add event counters
157  (*pL1ACounts)[lFedId] = l1ID;
158  (*pTotalEventCounts)[lFedId] = totalEvCount;
159 
160  //iterate through FED channels, extract payload and create Digis
161  std::vector<FedChannelConnection>::const_iterator iconn = conns.begin();
162  std::vector<FedChannelConnection>::const_iterator endconn = conns.end();
163  for ( ; iconn != endconn; ++iconn ) {
164 
165  //check if fed connection is valid
166  if ( !iconn->isConnected()) { continue; }
167 
168  //FED channel
169  uint16_t chan = iconn->fedCh();
170 
171  //check values are valid:
172  if (chan > FEDCH_PER_FED || iconn->fedId() != lFedId){
173  if (edm::isDebugEnabled()) {
174  std::ostringstream ss;
175  ss << "Channel connection values invalid: iconn->fedId() = " << iconn->fedId() << " for FED " << lFedId << ", iconn->fedCh() = " << chan << std::endl;
176  edm::LogWarning("SiStripSpyUnpacker") << ss.str();
177  }
178  continue;
179  }
180 
181  //check FED channel
182  if (!buffer->channelGood(chan)) {
183  if (edm::isDebugEnabled()) {
184  std::ostringstream ss;
185  ss << "Channel check failed for FED " << lFedId << " channel " << chan << std::endl;
186  edm::LogWarning("SiStripSpyUnpacker") << ss.str();
187  }
188  continue;
189  }
190 
191  //determine key from cabling
192  const uint32_t key = ( ( lFedId & sistrip::invalid_ ) << 16 ) | ( chan & sistrip::invalid_ );
193 
194  // Start a new channel in the filler
195  dsvFiller.newChannel(key);
196  // Create the unpacker object
197  sistrip::FEDSpyChannelUnpacker unpacker = sistrip::FEDSpyChannelUnpacker(buffer->channel(chan));
198 
199  // Unpack the data into dsv filler
200  while (unpacker.hasData()) {
201  dsvFiller.addItem(unpacker.adc());
202  unpacker++;
203  }
204  } // end of channel loop
205 
206  } //fed loop
207 
208  //set the run number
209  *aRunRef = lRef;
210 
211  //create DSV to return
212  std::unique_ptr<RawDigis> pResult = dsvFiller.createDetSetVector();
213  pDigis->swap(*pResult);
214 
215  } // end of SpyUnpacker::createDigis method.
bool isDebugEnabled()
static const uint16_t FED_ID_MIN
static const uint16_t SPY_SAMPLES_PER_CHANNEL
char const * what() const override
Definition: Exception.cc:141
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:47
DetSetVectorFiller< SiStripRawDigi, false > RawDigiDetSetVectorFiller
static std::string const input
Definition: EdmProvDump.cc:45
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
const bool allowIncompleteEvents_
FedsConstIterRange fedIds() const
static const uint16_t invalid_
Definition: Constants.h:16
ConnsConstIterRange fedConnections(uint16_t fed_id) const
chan
lumi = TPaveText(lowX+0.38, lowY+0.061, lowX+0.45, lowY+0.161, "NDC") lumi.SetBorderSize( 0 ) lumi...
static const uint16_t FEDCH_PER_FED
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:28
static const uint16_t FED_ID_MAX

Member Data Documentation

const bool sistrip::SpyUnpacker::allowIncompleteEvents_
private

Definition at line 53 of file SiStripSpyUnpacker.h.

Referenced by createDigis().