CMS 3D CMS Logo

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

Input: edm::DetSetVector<SiStripDigi>. Output: FEDRawDataCollection. More...

#include <SiStripDigiToRaw.h>

Public Member Functions

void createFedBuffers (edm::Event &, edm::ESHandle< SiStripFedCabling > &cabling, edm::Handle< edm::DetSetVector< SiStripDigi > > &digis, std::unique_ptr< FEDRawDataCollection > &buffers)
 
void createFedBuffers (edm::Event &, edm::ESHandle< SiStripFedCabling > &cabling, edm::Handle< edm::DetSetVector< SiStripRawDigi > > &digis, std::unique_ptr< FEDRawDataCollection > &buffers)
 
void createFedBuffers (edm::Event &, edm::ESHandle< SiStripFedCabling > &cabling, edm::Handle< FEDRawDataCollection > &rawbuffers, edm::Handle< edm::DetSetVector< SiStripDigi > > &digis, std::unique_ptr< FEDRawDataCollection > &buffers)
 
void createFedBuffers (edm::Event &, edm::ESHandle< SiStripFedCabling > &cabling, edm::Handle< FEDRawDataCollection > &rawbuffers, edm::Handle< edm::DetSetVector< SiStripRawDigi > > &digis, std::unique_ptr< FEDRawDataCollection > &buffers)
 
 DigiToRaw (FEDReadoutMode mode, uint8_t packetCode, bool use_fed_key)
 
void fedReadoutMode (FEDReadoutMode mode)
 
 ~DigiToRaw ()
 

Private Member Functions

template<class Digi_t >
void createFedBuffers_ (edm::Event &, edm::ESHandle< SiStripFedCabling > &cabling, edm::Handle< edm::DetSetVector< Digi_t > > &digis, std::unique_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::unique_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
 

Private Attributes

FEDBufferGenerator bufferGenerator_
 
FEDReadoutMode mode_
 
uint8_t packetCode_
 
bool useFedKey_
 

Detailed Description

Input: edm::DetSetVector<SiStripDigi>. Output: FEDRawDataCollection.

Definition at line 28 of file SiStripDigiToRaw.h.

Constructor & Destructor Documentation

sistrip::DigiToRaw::DigiToRaw ( FEDReadoutMode  mode,
uint8_t  packetCode,
bool  use_fed_key 
)

Definition at line 22 of file SiStripDigiToRaw.cc.

References bufferGenerator_, edm::isDebugEnabled(), LogDebug, mode_, and sistrip::FEDBufferGenerator::setReadoutMode().

24  :
25  mode_(mode),
26  packetCode_(packetCode),
27  useFedKey_(useFedKey),
29  {
30  if ( edm::isDebugEnabled() ) {
31  LogDebug("DigiToRaw")
32  << "[sistrip::DigiToRaw::DigiToRaw]"
33  << " Constructing object...";
34  }
36  }
#define LogDebug(id)
bool isDebugEnabled()
FEDBufferGenerator & setReadoutMode(const FEDReadoutMode newReadoutMode)
FEDReadoutMode mode_
FEDBufferGenerator bufferGenerator_
sistrip::DigiToRaw::~DigiToRaw ( )

Definition at line 40 of file SiStripDigiToRaw.cc.

References edm::isDebugEnabled(), and LogDebug.

40  {
41  if ( edm::isDebugEnabled() ) {
42  LogDebug("DigiToRaw")
43  << "[sistrip::DigiToRaw::~DigiToRaw]"
44  << " Destructing object...";
45  }
46  }
#define LogDebug(id)
bool isDebugEnabled()

Member Function Documentation

void sistrip::DigiToRaw::createFedBuffers ( edm::Event event,
edm::ESHandle< SiStripFedCabling > &  cabling,
edm::Handle< edm::DetSetVector< SiStripDigi > > &  collection,
std::unique_ptr< FEDRawDataCollection > &  buffers 
)

Input: DetSetVector of SiStripDigis. Output: FEDRawDataCollection. Retrieves and iterates through FED buffers, extract FEDRawData from collection and (optionally) dumps raw data to stdout, locates start of FED buffer by identifying DAQ header, creates new Fed9UEvent object using current FEDRawData buffer, dumps FED buffer to stdout, retrieves data from various header fields

Definition at line 57 of file SiStripDigiToRaw.cc.

References universalConfigTemplate::collection, and createFedBuffers_().

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

60  {
61  createFedBuffers_(event, cabling, collection, buffers, true);
62  }
void createFedBuffers_(edm::Event &, edm::ESHandle< SiStripFedCabling > &cabling, edm::Handle< edm::DetSetVector< Digi_t > > &digis, std::unique_ptr< FEDRawDataCollection > &buffers, bool zeroSuppressed)
void sistrip::DigiToRaw::createFedBuffers ( edm::Event event,
edm::ESHandle< SiStripFedCabling > &  cabling,
edm::Handle< edm::DetSetVector< SiStripRawDigi > > &  digis,
std::unique_ptr< FEDRawDataCollection > &  buffers 
)

Definition at line 64 of file SiStripDigiToRaw.cc.

References universalConfigTemplate::collection, and createFedBuffers_().

67  {
68  createFedBuffers_(event, cabling, collection, buffers, false);
69  }
void createFedBuffers_(edm::Event &, edm::ESHandle< SiStripFedCabling > &cabling, edm::Handle< edm::DetSetVector< Digi_t > > &digis, std::unique_ptr< FEDRawDataCollection > &buffers, bool zeroSuppressed)
void sistrip::DigiToRaw::createFedBuffers ( edm::Event event,
edm::ESHandle< SiStripFedCabling > &  cabling,
edm::Handle< FEDRawDataCollection > &  rawbuffers,
edm::Handle< edm::DetSetVector< SiStripDigi > > &  digis,
std::unique_ptr< FEDRawDataCollection > &  buffers 
)

Definition at line 72 of file SiStripDigiToRaw.cc.

References universalConfigTemplate::collection, and createFedBuffers_().

76  {
77  createFedBuffers_(event, cabling, rawbuffers, collection, buffers, true);
78  }
void createFedBuffers_(edm::Event &, edm::ESHandle< SiStripFedCabling > &cabling, edm::Handle< edm::DetSetVector< Digi_t > > &digis, std::unique_ptr< FEDRawDataCollection > &buffers, bool zeroSuppressed)
void sistrip::DigiToRaw::createFedBuffers ( edm::Event event,
edm::ESHandle< SiStripFedCabling > &  cabling,
edm::Handle< FEDRawDataCollection > &  rawbuffers,
edm::Handle< edm::DetSetVector< SiStripRawDigi > > &  digis,
std::unique_ptr< FEDRawDataCollection > &  buffers 
)

Definition at line 80 of file SiStripDigiToRaw.cc.

References universalConfigTemplate::collection, and createFedBuffers_().

84  {
85  createFedBuffers_(event, cabling, rawbuffers, collection, buffers, false);
86  }
void createFedBuffers_(edm::Event &, edm::ESHandle< SiStripFedCabling > &cabling, edm::Handle< edm::DetSetVector< Digi_t > > &digis, std::unique_ptr< FEDRawDataCollection > &buffers, bool zeroSuppressed)
template<class Digi_t >
void sistrip::DigiToRaw::createFedBuffers_ ( edm::Event event,
edm::ESHandle< SiStripFedCabling > &  cabling,
edm::Handle< edm::DetSetVector< Digi_t > > &  digis,
std::unique_ptr< FEDRawDataCollection > &  buffers,
bool  zeroSuppressed 
)
private

Definition at line 92 of file SiStripDigiToRaw.cc.

References universalConfigTemplate::collection.

Referenced by createFedBuffers().

96  {
97 
99  //CAMM initialise to some dummy empty buffers??? Or OK like this ?
100  createFedBuffers_(event,cabling,rawbuffers,collection,buffers,zeroSuppressed);
101 
102  }
void createFedBuffers_(edm::Event &, edm::ESHandle< SiStripFedCabling > &cabling, edm::Handle< edm::DetSetVector< Digi_t > > &digis, std::unique_ptr< FEDRawDataCollection > &buffers, bool zeroSuppressed)
template<class Digi_t >
void sistrip::DigiToRaw::createFedBuffers_ ( edm::Event event,
edm::ESHandle< SiStripFedCabling > &  cabling,
edm::Handle< FEDRawDataCollection > &  rawbuffers,
edm::Handle< edm::DetSetVector< Digi_t > > &  digis,
std::unique_ptr< FEDRawDataCollection > &  buffers,
bool  zeroSuppressed 
)
private

Definition at line 105 of file SiStripDigiToRaw.cc.

References sistrip::TrackerSpecialHeader::apvAddressErrorRegister(), sistrip::TrackerSpecialHeader::apveAddress(), sistrip::TrackerSpecialHeader::bufferFormat(), bufferGenerator_, universalConfigTemplate::collection, gather_cfg::cout, sistrip::FEDBufferGenerator::daqHeader(), sistrip::FEDBufferGenerator::daqTrailer(), FEDRawData::data(), edm::DetSet< T >::data, MillePedeFileConverter_cfg::e, edm::EventID::event(), cppFunctionSkipper::exception, sistrip::FEDCH_PER_FEUNIT, SiStripFedCabling::fedConnections(), FEDRawDataCollection::FEDData(), SiStripFedCabling::fedIds(), sistrip::TrackerSpecialHeader::fedStatusRegister(), sistrip::TrackerSpecialHeader::feEnableRegister(), sistrip::FEDBufferGenerator::feHeader(), sistrip::TrackerSpecialHeader::feOverflowRegister(), sistrip::FEUNITS_PER_FED, sistrip::FEDBufferGenerator::generateBuffer(), sistrip::FEDBufferGenerator::getBufferFormat(), sistrip::FEDBufferGenerator::getDAQEventType(), sistrip::HEADER_TYPE_FULL_DEBUG, sistrip::TrackerSpecialHeader::headerType(), edm::EventBase::id(), sistrip::invalid32_, sistrip::invalid_, edm::isDebugEnabled(), edm::HandleBase::isValid(), crabWrapper::key, sistrip::FEDFEHeader::lengthInBytes(), mode_, packetCode_, sistrip::TrackerSpecialHeader::print(), sistrip::FEDFEHeader::print(), sistrip::READOUT_MODE_PREMIX_RAW, sistrip::READOUT_MODE_SCOPE, sistrip::TrackerSpecialHeader::readoutMode(), sistrip::FEDBufferGenerator::setFEUnitEnables(), sistrip::FEDBufferGenerator::setHeaderType(), sistrip::FEDBufferGenerator::setL1ID(), sistrip::FEDBufferGenerator::setReadoutMode(), FEDRawData::size(), digitizers_cfi::strip, STRIP(), sistrip::STRIPS_PER_FEDCH, sistrip::FEDBufferGenerator::trackerSpecialHeader(), useFedKey_, and relativeConstraints::value.

110  {
111  try {
112 
113  //set the L1ID to use in the buffers
114  bufferGenerator_.setL1ID(0xFFFFFF & event.id().event());
115  auto fed_ids = cabling->fedIds();
116 
117  //copy header if valid rawbuffers handle
118  if (rawbuffers.isValid()){
119  if ( edm::isDebugEnabled() ) {
120  edm::LogWarning("DigiToRaw")
121  << "[sistrip::DigiToRaw::createFedBuffers_]"
122  << " Valid raw buffers, getting headers from them..."
123  << " Number of feds: " << fed_ids.size() << " between "
124  << *(fed_ids.begin()) << " and " << *(fed_ids.end());
125  }
126 
127  const FEDRawDataCollection& rawDataCollection = *rawbuffers;
128 
129  for ( auto ifed = fed_ids.begin(); ifed != fed_ids.end(); ++ifed ) {
130  const FEDRawData& rawfedData = rawDataCollection.FEDData(*ifed);
131 
132  if ( edm::isDebugEnabled() ) {
133  edm::LogWarning("DigiToRaw")
134  << "[sistrip::DigiToRaw::createFedBuffers_]"
135  << "Fed " << *ifed << " : size of buffer = " << rawfedData.size();
136  }
137 
138  //need to construct full object to copy full header
139  std::unique_ptr<const sistrip::FEDBuffer> fedbuffer;
140  //std::unique_ptr<const sistrip::FEDBufferBase> bufferBase;
141  try {
142  fedbuffer.reset(new sistrip::FEDBuffer(rawfedData.data(),rawfedData.size(),true));
143  //bufferBase.reset(new sistrip::FEDBufferBase(rawfedData.data(),rawfedData.size()));
144  } catch (const cms::Exception& e) {
145  edm::LogWarning("DigiToRaw") << "[sistrip::DigiToRaw::createFedBuffers_]"
146  << " Invalid raw data, cannot get buffer..."
147  << std::endl;
148  }
149 
150  if ( edm::isDebugEnabled() ) {
151  edm::LogWarning("DigiToRaw")
152  << "[sistrip::DigiToRaw::createFedBuffers_]"
153  << " Original header type: " << fedbuffer->headerType();
154  }
155 
157  //fedbuffer->headerType());
158  bufferGenerator_.daqHeader() = fedbuffer->daqHeader();
159  bufferGenerator_.daqTrailer() = fedbuffer->daqTrailer();
160 
161  bufferGenerator_.trackerSpecialHeader() = fedbuffer->trackerSpecialHeader();
163 
164  if ( edm::isDebugEnabled() ) {
165  std::ostringstream debugStream;
166  if(ifed==fed_ids.begin()){ bufferGenerator_.trackerSpecialHeader().print(std::cout); std::cout << std::endl;}
168  edm::LogWarning("DigiToRaw")
169  << "[sistrip::DigiToRaw::createFedBuffers_]"
170  << " Tracker special header apveAddress: " << static_cast<int>(bufferGenerator_.trackerSpecialHeader().apveAddress())
171  << " - event type = " << bufferGenerator_.getDAQEventType()
172  << " - buffer format = " << bufferGenerator_.getBufferFormat() << "\n"
173  << " - SpecialHeader bufferformat " << bufferGenerator_.trackerSpecialHeader().bufferFormat()
174  << " - headertype " << bufferGenerator_.trackerSpecialHeader().headerType()
175  << " - readoutmode " << bufferGenerator_.trackerSpecialHeader().readoutMode()
176  << " - apvaddrregister " << std::hex << static_cast<int>(bufferGenerator_.trackerSpecialHeader().apvAddressErrorRegister())
177  << " - feenabledregister " << std::hex << static_cast<int>(bufferGenerator_.trackerSpecialHeader().feEnableRegister())
178  << " - feoverflowregister " << std::hex << static_cast<int>(bufferGenerator_.trackerSpecialHeader().feOverflowRegister())
179  << " - statusregister " << bufferGenerator_.trackerSpecialHeader().fedStatusRegister() << "\n"
180  << " SpecialHeader: " << debugStream.str();
181  }
182 
183  std::unique_ptr<FEDFEHeader> tempFEHeader(fedbuffer->feHeader()->clone());
184  FEDFullDebugHeader* fedFeHeader = dynamic_cast<FEDFullDebugHeader*>(tempFEHeader.get());
185  if ( edm::isDebugEnabled() ) {
186  std::ostringstream debugStream;
187  if(ifed==fed_ids.begin()){ std::cout << "FEHeader before transfer: " << std::endl;fedFeHeader->print(std::cout);std::cout <<std::endl;}
188  fedFeHeader->print(debugStream);
189  edm::LogWarning("DigiToRaw")
190  << "[sistrip::DigiToRaw::createFedBuffers_]"
191  << " length of original feHeader: " << fedFeHeader->lengthInBytes() << "\n"
192  << debugStream.str();
193  }
194  //status registers
195  (bufferGenerator_.feHeader()).setBEStatusRegister(fedFeHeader->beStatusRegister());
196  (bufferGenerator_.feHeader()).setDAQRegister2(fedFeHeader->daqRegister2());
197  (bufferGenerator_.feHeader()).setDAQRegister(fedFeHeader->daqRegister());
198  for(uint8_t iFE=1; iFE<6; iFE++) {
199  (bufferGenerator_.feHeader()).set32BitReservedRegister(iFE,fedFeHeader->get32BitWordFrom(fedFeHeader->feWord(iFE)+10));
200  }
201 
202  std::vector<bool> feEnabledVec;
203  feEnabledVec.resize(FEUNITS_PER_FED,true);
204  for (uint8_t iFE = 0; iFE < FEUNITS_PER_FED; iFE++) {
205  feEnabledVec[iFE]=fedbuffer->trackerSpecialHeader().feEnabled(iFE);
206  (bufferGenerator_.feHeader()).setFEUnitMajorityAddress(iFE,fedFeHeader->feUnitMajorityAddress(iFE));
207  for (uint8_t iFEUnitChannel = 0; iFEUnitChannel < FEDCH_PER_FEUNIT; iFEUnitChannel++) {
208  (bufferGenerator_.feHeader()).setChannelStatus(iFE,iFEUnitChannel,fedFeHeader->getChannelStatus(iFE,iFEUnitChannel));
209  }//loop on channels
210  }//loop on fe units
211  bufferGenerator_.setFEUnitEnables(feEnabledVec);
212 
213  if ( edm::isDebugEnabled() ) {
214  std::ostringstream debugStream;
215  if(ifed==fed_ids.begin()){ std::cout << "\nFEHeader after transfer: " << std::endl;bufferGenerator_.feHeader().print(std::cout); std::cout << std::endl;}
216  bufferGenerator_.feHeader().print(debugStream);
217  edm::LogWarning("DigiToRaw")
218  << "[sistrip::DigiToRaw::createFedBuffers_]"
219  << " length of feHeader: " << bufferGenerator_.feHeader().lengthInBytes() << "\n"
220  << debugStream.str();
221  }
222  auto conns = cabling->fedConnections(*ifed);
223 
224  //for special mode premix raw, data is zero-suppressed but not converted to 8 bit
225  //zeroSuppressed here means converted to 8 bit...
226  if (mode_ == READOUT_MODE_PREMIX_RAW) zeroSuppressed=false;
227  FEDStripData fedData(zeroSuppressed);
228 
229 
230  for (auto iconn = conns.begin() ; iconn != conns.end(); iconn++ ) {
231 
232  // Determine FED key from cabling
233  uint32_t fed_key = ( ( iconn->fedId() & sistrip::invalid_ ) << 16 ) | ( iconn->fedCh() & sistrip::invalid_ );
234 
235  // Determine whether DetId or FED key should be used to index digi containers
236  uint32_t key = ( useFedKey_ || mode_ == READOUT_MODE_SCOPE ) ? fed_key : iconn->detId();
237 
238  // Check key is non-zero and valid
239  if ( !key || ( key == sistrip::invalid32_ ) ) { continue; }
240 
241  // Determine APV pair number (needed only when using DetId)
242  uint16_t ipair = ( useFedKey_ || mode_ == READOUT_MODE_SCOPE ) ? 0 : iconn->apvPairNumber();
243 
244  FEDStripData::ChannelData& chanData = fedData[iconn->fedCh()];
245 
246  // Find digis for DetID in collection
247  if (!collection.isValid()){
248  if ( edm::isDebugEnabled() ) {
249  edm::LogWarning("DigiToRaw")
250  << "[DigiToRaw::createFedBuffers] "
251  << "digis collection is not valid...";
252  }
253  break;
254  }
255  typename std::vector< edm::DetSet<Digi_t> >::const_iterator digis = collection->find( key );
256  if (digis == collection->end()) { continue; }
257 
258  typename edm::DetSet<Digi_t>::const_iterator idigi, digis_begin(digis->data.begin());
259  for ( idigi = digis_begin; idigi != digis->data.end(); idigi++ ) {
260 
261  if ( STRIP(idigi, digis_begin) < ipair*256 ||
262  STRIP(idigi, digis_begin) > ipair*256+255 ) { continue; }
263  const unsigned short strip = STRIP(idigi, digis_begin) % 256;
264 
265  if ( strip >= STRIPS_PER_FEDCH ) {
266  if ( edm::isDebugEnabled() ) {
267  std::stringstream ss;
268  ss << "[sistrip::DigiToRaw::createFedBuffers]"
269  << " strip >= strips_per_fedCh";
270  edm::LogWarning("DigiToRaw") << ss.str();
271  }
272  continue;
273  }
274 
275  // check if value already exists
276  if ( edm::isDebugEnabled() ) {
277  const uint16_t value = 0;//chanData[strip];
278  if ( value && value != (*idigi).adc() ) {
279  std::stringstream ss;
280  ss << "[sistrip::DigiToRaw::createFedBuffers]"
281  << " Incompatible ADC values in buffer!"
282  << " FedId/FedCh: " << *ifed << "/" << iconn->fedCh()
283  << " DetStrip: " << STRIP(idigi, digis_begin)
284  << " FedChStrip: " << strip
285  << " AdcValue: " << (*idigi).adc()
286  << " RawData[" << strip << "]: " << value;
287  edm::LogWarning("DigiToRaw") << ss.str();
288  }
289  }
290 
291  // Add digi to buffer
292  chanData[strip] = (*idigi).adc();
293  }
294  }
295  // if ((*idigi).strip() >= (ipair+1)*256) break;
296 
297  if ( edm::isDebugEnabled() ) {
298  edm::LogWarning("DigiToRaw")
299  << "DigiToRaw::createFedBuffers] "
300  << "Almost at the end...";
301  }
302  //create the buffer
303  FEDRawData& fedrawdata = buffers->FEDData( *ifed );
304  bufferGenerator_.generateBuffer(&fedrawdata, fedData, *ifed, packetCode_);
305 
306  if ( edm::isDebugEnabled() ) {
307  std::ostringstream debugStream;
308  bufferGenerator_.feHeader().print(debugStream);
309  edm::LogWarning("DigiToRaw")
310  << "[sistrip::DigiToRaw::createFedBuffers_]"
311  << " length of final feHeader: " << bufferGenerator_.feHeader().lengthInBytes() << "\n"
312  << debugStream.str();
313  }
314  }//loop on fedids
315  if ( edm::isDebugEnabled() ) {
316  edm::LogWarning("DigiToRaw")
317  << "[sistrip::DigiToRaw::createFedBuffers_]"
318  << "end of first loop on feds";
319  }
320 
321  }//end of workflow for copying header, below is workflow without copying header
322  else{
323  if ( edm::isDebugEnabled() ) {
324  edm::LogWarning("DigiToRaw")
325  << "[sistrip::DigiToRaw::createFedBuffers_]"
326  << "Now getting the digis..."
327  << " Number of feds: " << fed_ids.size() << " between "
328  << *(fed_ids.begin()) << " and " << *(fed_ids.end());
329  }
330 
331  for ( auto ifed = fed_ids.begin(); ifed != fed_ids.end(); ++ifed ) {
332 
333  auto conns = cabling->fedConnections(*ifed);
334 
335  //for special mode premix raw, data is zero-suppressed but not converted to 8 bit
336  //zeroSuppressed here means converted to 8 bit...
337  if (mode_ == READOUT_MODE_PREMIX_RAW) zeroSuppressed=false;
338  FEDStripData fedData(zeroSuppressed);
339 
340 
341  for (auto iconn = conns.begin() ; iconn != conns.end(); iconn++ ) {
342 
343  // Determine FED key from cabling
344  uint32_t fed_key = ( ( iconn->fedId() & sistrip::invalid_ ) << 16 ) | ( iconn->fedCh() & sistrip::invalid_ );
345 
346  // Determine whether DetId or FED key should be used to index digi containers
347  uint32_t key = ( useFedKey_ || mode_ == READOUT_MODE_SCOPE ) ? fed_key : iconn->detId();
348 
349  // Check key is non-zero and valid
350  if ( !key || ( key == sistrip::invalid32_ ) ) { continue; }
351 
352  // Determine APV pair number (needed only when using DetId)
353  uint16_t ipair = ( useFedKey_ || mode_ == READOUT_MODE_SCOPE ) ? 0 : iconn->apvPairNumber();
354 
355  FEDStripData::ChannelData& chanData = fedData[iconn->fedCh()];
356 
357  // Find digis for DetID in collection
358  if (!collection.isValid()){
359  if ( edm::isDebugEnabled() ) {
360  edm::LogWarning("DigiToRaw")
361  << "[DigiToRaw::createFedBuffers] "
362  << "digis collection is not valid...";
363  }
364  break;
365  }
366  typename std::vector< edm::DetSet<Digi_t> >::const_iterator digis = collection->find( key );
367  if (digis == collection->end()) { continue; }
368 
369  typename edm::DetSet<Digi_t>::const_iterator idigi, digis_begin(digis->data.begin());
370  for ( idigi = digis_begin; idigi != digis->data.end(); idigi++ ) {
371 
372  if ( STRIP(idigi, digis_begin) < ipair*256 ||
373  STRIP(idigi, digis_begin) > ipair*256+255 ) { continue; }
374  const unsigned short strip = STRIP(idigi, digis_begin) % 256;
375 
376  if ( strip >= STRIPS_PER_FEDCH ) {
377  if ( edm::isDebugEnabled() ) {
378  std::stringstream ss;
379  ss << "[sistrip::DigiToRaw::createFedBuffers]"
380  << " strip >= strips_per_fedCh";
381  edm::LogWarning("DigiToRaw") << ss.str();
382  }
383  continue;
384  }
385 
386  // check if value already exists
387  if ( edm::isDebugEnabled() ) {
388  const uint16_t value = 0;//chanData[strip];
389  if ( value && value != (*idigi).adc() ) {
390  std::stringstream ss;
391  ss << "[sistrip::DigiToRaw::createFedBuffers]"
392  << " Incompatible ADC values in buffer!"
393  << " FedId/FedCh: " << *ifed << "/" << iconn->fedCh()
394  << " DetStrip: " << STRIP(idigi, digis_begin)
395  << " FedChStrip: " << strip
396  << " AdcValue: " << (*idigi).adc()
397  << " RawData[" << strip << "]: " << value;
398  edm::LogWarning("DigiToRaw") << ss.str();
399  }
400  }
401 
402  // Add digi to buffer
403  chanData[strip] = (*idigi).adc();
404  }
405  }
406  // if ((*idigi).strip() >= (ipair+1)*256) break;
407 
408  if ( edm::isDebugEnabled() ) {
409  edm::LogWarning("DigiToRaw")
410  << "DigiToRaw::createFedBuffers] "
411  << "Almost at the end...";
412  }
413  //create the buffer
414  FEDRawData& fedrawdata = buffers->FEDData( *ifed );
415  bufferGenerator_.generateBuffer(&fedrawdata, fedData, *ifed, packetCode_);
416 
417  if ( edm::isDebugEnabled() ) {
418  std::ostringstream debugStream;
419  bufferGenerator_.feHeader().print(debugStream);
420  edm::LogWarning("DigiToRaw")
421  << "[sistrip::DigiToRaw::createFedBuffers_]"
422  << " length of final feHeader: " << bufferGenerator_.feHeader().lengthInBytes() << "\n"
423  << debugStream.str();
424  }
425  }//loop on feds
426  }//end if-else for copying header
427  }//try
428  catch (const std::exception& e) {
429  if ( edm::isDebugEnabled() ) {
430  edm::LogWarning("DigiToRaw")
431  << "DigiToRaw::createFedBuffers] "
432  << "Exception caught : " << e.what();
433  }
434  }
435 
436  }
EventNumber_t event() const
Definition: EventID.h:41
bool isDebugEnabled()
FEDBufferGenerator & setReadoutMode(const FEDReadoutMode newReadoutMode)
static const uint32_t invalid32_
Definition: Constants.h:15
FEDStatusRegister fedStatusRegister() const
virtual void print(std::ostream &os) const =0
TrackerSpecialHeader & trackerSpecialHeader()
FEDBufferFormat getBufferFormat() const
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:47
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
FEDBufferGenerator & setFEUnitEnables(const std::vector< bool > &feUnitsEnabled)
static const uint16_t FEUNITS_PER_FED
FedsConstIterRange fedIds() const
void generateBuffer(FEDRawData *rawDataObject, const FEDStripData &data, uint16_t sourceID, uint8_t packetCode) const
Definition: value.py:1
bool isValid() const
Definition: HandleBase.h:74
FEDReadoutMode mode_
void print(std::ostream &os) const
static const uint16_t STRIPS_PER_FEDCH
FEDBufferGenerator & setHeaderType(const FEDHeaderType newHeaderType)
FEDBufferGenerator & setL1ID(const uint32_t newL1ID)
static const uint16_t FEDCH_PER_FEUNIT
static const uint16_t invalid_
Definition: Constants.h:16
ConnsConstIterRange fedConnections(uint16_t fed_id) const
virtual size_t lengthInBytes() const =0
edm::EventID id() const
Definition: EventBase.h:60
collection_type data
Definition: DetSet.h:78
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:28
uint16_t STRIP(const edm::DetSet< SiStripDigi >::const_iterator &it, const edm::DetSet< SiStripDigi >::const_iterator &begin) const
FEDDAQEventType getDAQEventType() const
collection_type::const_iterator const_iterator
Definition: DetSet.h:33
FEDBufferGenerator bufferGenerator_
void sistrip::DigiToRaw::fedReadoutMode ( FEDReadoutMode  mode)
inline
uint16_t sistrip::DigiToRaw::STRIP ( const edm::DetSet< SiStripDigi >::const_iterator &  it,
const edm::DetSet< SiStripDigi >::const_iterator &  begin 
) const
inlineprivate

Definition at line 438 of file SiStripDigiToRaw.cc.

Referenced by createFedBuffers_().

438 {return it->strip();}
uint16_t sistrip::DigiToRaw::STRIP ( const edm::DetSet< SiStripRawDigi >::const_iterator &  it,
const edm::DetSet< SiStripRawDigi >::const_iterator &  begin 
) const
inlineprivate

Definition at line 439 of file SiStripDigiToRaw.cc.

References begin.

439 {return it-begin;}
#define begin
Definition: vmac.h:32

Member Data Documentation

FEDBufferGenerator sistrip::DigiToRaw::bufferGenerator_
private

Definition at line 84 of file SiStripDigiToRaw.h.

Referenced by createFedBuffers_(), and DigiToRaw().

FEDReadoutMode sistrip::DigiToRaw::mode_
private

Definition at line 81 of file SiStripDigiToRaw.h.

Referenced by createFedBuffers_(), and DigiToRaw().

uint8_t sistrip::DigiToRaw::packetCode_
private

Definition at line 82 of file SiStripDigiToRaw.h.

Referenced by createFedBuffers_().

bool sistrip::DigiToRaw::useFedKey_
private

Definition at line 83 of file SiStripDigiToRaw.h.

Referenced by createFedBuffers_().