CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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
< SiStripRawDigi
RawDigis
 

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_, SiStripFedCabling::connections(), sistrip::DetSetVectorFiller< T, dsvIsSparse >::createDetSetVector(), FEDRawData::data(), alignCSCRings::e, edm::hlt::Exception, sistrip::FED_ID_MAX, sistrip::FED_ID_MIN, sistrip::FEDCH_PER_FED, FEDRawDataCollection::FEDData(), SiStripFedKey::fedIndex(), SiStripFedCabling::feds(), sistrip::FEDSpyChannelUnpacker::hasData(), LaserDQM_cfg::input, edm::isDebugEnabled(), combine::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.feds().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  const std::vector<FedChannelConnection>& conns = cabling.connections(lFedId);
125 
126  //construct FEDBuffer
127  std::auto_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  //determine key from cabling
191  const uint32_t key = SiStripFedKey::fedIndex(lFedId,chan);
192 
193  // Start a new channel in the filler
194  dsvFiller.newChannel(key);
195  // Create the unpacker object
196  sistrip::FEDSpyChannelUnpacker unpacker = sistrip::FEDSpyChannelUnpacker(buffer->channel(chan));
197 
198  // Unpack the data into dsv filler
199  while (unpacker.hasData()) {
200  dsvFiller.addItem(unpacker.adc());
201  unpacker++;
202  }
203  } // end of channel loop
204 
205  } //fed loop
206 
207  //set the run number
208  *aRunRef = lRef;
209 
210  //create DSV to return
211  std::auto_ptr<RawDigis> pResult = dsvFiller.createDetSetVector();
212  pDigis->swap(*pResult);
213 
214  } // end of SpyUnpacker::createDigis method.
virtual char const * what() const
Definition: Exception.cc:141
bool isDebugEnabled()
static const uint16_t FED_ID_MIN
const std::vector< uint16_t > & feds() const
static const uint16_t SPY_SAMPLES_PER_CHANNEL
static uint32_t fedIndex(const uint16_t &fed_id, const uint16_t &fed_ch)
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:49
DetSetVectorFiller< SiStripRawDigi, false > RawDigiDetSetVectorFiller
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
const bool allowIncompleteEvents_
list key
Definition: combine.py:13
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:29
static const uint16_t FED_ID_MAX
const std::vector< FedChannelConnection > & connections(uint16_t fed_id) const

Member Data Documentation

const bool sistrip::SpyUnpacker::allowIncompleteEvents_
private

Definition at line 53 of file SiStripSpyUnpacker.h.

Referenced by createDigis().