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) const
 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

◆ Counters

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

Definition at line 34 of file SiStripSpyUnpacker.h.

◆ RawDigis

Definition at line 33 of file SiStripSpyUnpacker.h.

Constructor & Destructor Documentation

◆ SpyUnpacker()

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

Constructor.

Definition at line 29 of file SiStripSpyUnpacker.cc.

References edm::isDebugEnabled(), and LogTrace.

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

◆ ~SpyUnpacker()

sistrip::SpyUnpacker::~SpyUnpacker ( )

Destructor.

Definition at line 36 of file SiStripSpyUnpacker.cc.

References edm::isDebugEnabled(), and LogTrace.

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

Member Function Documentation

◆ createDigis()

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 
) const

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 43 of file SiStripSpyUnpacker.cc.

References sistrip::FEDSpyChannelUnpacker::adc(), sistrip::DetSetVectorFiller< T, dsvIsSparse >::addItem(), allowIncompleteEvents_, edmScanValgrind::buffer, officialStyle::chan, sistrip::DetSetVectorFiller< T, dsvIsSparse >::createDetSetVector(), 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(), sistrip::preconstructCheckFEDSpyBuffer(), sistrip::SPY_SAMPLES_PER_CHANNEL, contentValuesCheck::ss, sistrip::SUCCESS, and edm::DetSetVector< T >::swap().

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

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

Member Data Documentation

◆ allowIncompleteEvents_

const bool sistrip::SpyUnpacker::allowIncompleteEvents_
private

Definition at line 54 of file SiStripSpyUnpacker.h.

Referenced by createDigis().