CMS 3D CMS Logo

RawToDigiConverter.cc
Go to the documentation of this file.
1 /****************************************************************************
2 *
3 * This is a part of TOTEM offline software.
4 * Authors:
5 * Jan Kašpar (jan.kaspar@gmail.com)
6 * Seyed Mohsen Etesami (setesami@cern.ch)
7 ****************************************************************************/
8 
10 
15 
19 
20 //----------------------------------------------------------------------------------------------------
21 
22 using namespace std;
23 using namespace edm;
24 
25 //----------------------------------------------------------------------------------------------------
26 
28  verbosity(conf.getUntrackedParameter<unsigned int>("verbosity", 0)),
29  printErrorSummary(conf.getUntrackedParameter<unsigned int>("printErrorSummary", 1)),
30  printUnknownFrameSummary(conf.getUntrackedParameter<unsigned int>("printUnknownFrameSummary", 1)),
31 
32  testFootprint(conf.getParameter<unsigned int>("testFootprint")),
33  testCRC(conf.getParameter<unsigned int>("testCRC")),
34  testID(conf.getParameter<unsigned int>("testID")),
35  testECMostFrequent(conf.getParameter<unsigned int>("testECMostFrequent")),
36  testBCMostFrequent(conf.getParameter<unsigned int>("testBCMostFrequent")),
37 
38  EC_min(conf.getUntrackedParameter<unsigned int>("EC_min", 10)),
39  BC_min(conf.getUntrackedParameter<unsigned int>("BC_min", 10)),
40 
41  EC_fraction(conf.getUntrackedParameter<double>("EC_fraction", 0.6)),
42  BC_fraction(conf.getUntrackedParameter<double>("BC_fraction", 0.6))
43 {
44 }
45 
46 //----------------------------------------------------------------------------------------------------
47 
49  map<TotemFramePosition, RawToDigiConverter::Record> &records)
50 {
51  // EC and BC checks (wrt. the most frequent value), BC checks per subsystem
54 
55  // initialise structure merging vfat frame data with the mapping
56  for (auto &p : mapping.VFATMapping)
57  {
58  TotemVFATStatus st;
59  st.setMissing(true);
60  records[p.first] = { &p.second, nullptr, st };
61  }
62 
63  // event error message buffer
64  stringstream ees;
65 
66  // associate data frames with records
67  for (VFATFrameCollection::Iterator fr(&input); !fr.IsEnd(); fr.Next())
68  {
69  // frame error message buffer
70  stringstream fes;
71 
72  bool problemsPresent = false;
73  bool stopProcessing = false;
74 
75  // skip data frames not listed in the DAQ mapping
76  auto records_it = records.find(fr.Position());
77  if (records_it == records.end())
78  {
79  unknownSummary[fr.Position()]++;
80  continue;
81  }
82 
83  // update record
84  Record &record = records_it->second;
85  record.frame = fr.Data();
86  record.status.setMissing(false);
89 
90  // check footprint
91  if (testFootprint != tfNoTest && !record.frame->checkFootprint())
92  {
93  problemsPresent = true;
94 
95  if (verbosity > 0)
96  fes << " invalid footprint" << endl;
97 
98  if (testFootprint == tfErr)
99  {
100  record.status.setFootprintError();
101  stopProcessing = true;
102  }
103  }
104 
105  // check CRC
106  if (testCRC != tfNoTest && !record.frame->checkCRC())
107  {
108  problemsPresent = true;
109 
110  if (verbosity > 0)
111  fes << " CRC failure" << endl;
112 
113  if (testCRC == tfErr)
114  {
115  record.status.setCRCError();
116  stopProcessing = true;
117  }
118  }
119  // check the id mismatch
120  if (testID != tfNoTest && record.frame->isIDPresent() && (record.frame->getChipID() & 0xFFF) != (record.info->hwID & 0xFFF))
121  {
122  if (verbosity > 0)
123  fes << " ID mismatch (data: 0x" << hex << record.frame->getChipID()
124  << ", mapping: 0x" << record.info->hwID << dec << ", symbId: " << record.info->symbolicID.symbolicID << ")" << endl;
125 
126  if (testID == tfErr)
127  {
128  record.status.setIDMismatch();
129  stopProcessing = true;
130  }
131  }
132 
133  // if there were errors, put the information to ees buffer
134  if (verbosity > 0 && problemsPresent)
135  {
136  string message = (stopProcessing) ? "(and will be dropped)" : "(but will be used though)";
137  if (verbosity > 2)
138  {
139  ees << " Frame at " << fr.Position() << " seems corrupted " << message << ":" << endl;
140  ees << fes.rdbuf();
141  } else
142  ees << " Frame at " << fr.Position() << " seems corrupted " << message << "." << endl;
143  }
144 
145  // if there were serious errors, do not process this frame
146  if (stopProcessing)
147  continue;
148 
149  // fill EC and BC values to the statistics
150  if (fr.Data()->isECPresent())
151  ECChecker.Fill(fr.Data()->getEC(), fr.Position());
152 
153  if (fr.Data()->isBCPresent())
154  BCChecker.Fill(fr.Data()->getBC(), fr.Position());
155  }
156 
157  // analyze EC and BC statistics
159  ECChecker.Analyze(records, (testECMostFrequent == tfErr), ees);
160 
162  BCChecker.Analyze(records, (testBCMostFrequent == tfErr), ees);
163 
164  // add error message for missing frames
165  if (verbosity > 1)
166  {
167  for (const auto &p : records)
168  {
169  if (p.second.status.isMissing())
170  ees << "Frame for VFAT " << p.first << " is not present in the data." << endl;
171  }
172  }
173 
174  // print error message
175  if (verbosity > 0 && !ees.rdbuf()->str().empty())
176  {
177  if (verbosity > 1)
178  LogWarning("Totem") << "Error in RawToDigiConverter::runCommon > " << "event contains the following problems:" << endl << ees.rdbuf() << endl;
179  else
180  LogWarning("Totem") << "Error in RawToDigiConverter::runCommon > " << "event contains problems." << endl;
181  }
182 
183  // increase error counters
184  if (printErrorSummary)
185  {
186  for (const auto &it : records)
187  {
188  if (!it.second.status.isOK())
189  {
190  auto &m = errorSummary[it.first];
191  m[it.second.status]++;
192  }
193  }
194  }
195 }
196 
197 //----------------------------------------------------------------------------------------------------
198 
200  const TotemDAQMapping &mapping, const TotemAnalysisMask &analysisMask,
202 {
203  // structure merging vfat frame data with the mapping
204  map<TotemFramePosition, Record> records;
205 
206  // common processing - frame validation
207  runCommon(input, mapping, records);
208 
209  // second loop over data
210  for (auto &p : records)
211  {
212  Record &record = p.second;
213 
214  // calculate ids
215  TotemRPDetId chipId(record.info->symbolicID.symbolicID);
216  uint8_t chipPosition = chipId.chip();
217  TotemRPDetId detId = chipId.getPlaneId();
218 
219  // update chipPosition in status
220  record.status.setChipPosition(chipPosition);
221 
222  // produce digi only for good frames
223  if (record.status.isOK())
224  {
225  // find analysis mask (needs a default=no mask, if not in present the mapping)
227  anMa.fullMask = false;
228 
229  auto analysisIter = analysisMask.analysisMask.find(record.info->symbolicID);
230  if (analysisIter != analysisMask.analysisMask.end())
231  {
232  // if there is some information about masked channels - save it into conversionStatus
233  anMa = analysisIter->second;
234  if (anMa.fullMask)
235  record.status.setFullyMaskedOut();
236  else
237  record.status.setPartiallyMaskedOut();
238  }
239 
240  // create the digi
241  unsigned short offset = chipPosition * 128;
242  const vector<unsigned char> &activeChannels = record.frame->getActiveChannels();
243 
244  for (auto ch : activeChannels)
245  {
246  // skip masked channels
247  if (!anMa.fullMask && anMa.maskedChannels.find(ch) == anMa.maskedChannels.end())
248  {
249  DetSet<TotemRPDigi> &digiDetSet = rpData.find_or_insert(detId);
250  digiDetSet.push_back(TotemRPDigi(offset + ch));
251  }
252  }
253  }
254 
255  // save status
256  DetSet<TotemVFATStatus> &statusDetSet = finalStatus.find_or_insert(detId);
257  statusDetSet.push_back(record.status);
258  }
259 }
260 
261 //----------------------------------------------------------------------------------------------------
262 
265 {
266  // structure merging vfat frame data with the mapping
267  map<TotemFramePosition, Record> records;
268 
269  // common processing - frame validation
270  runCommon(coll, mapping, records);
271 
272  // second loop over data
273  for (auto &p : records)
274  {
275  Record &record = p.second;
276 
277  // calculate ids
279 
280  if (record.status.isOK())
281  {
282  const VFATFrame *fr = record.frame;
283  const DiamondVFATFrame *diamondframe = static_cast<const DiamondVFATFrame*>(fr);
284 
285  // update Event Counter in status
286  record.status.setEC(record.frame->getEC() & 0xFF);
287 
288  // create the digi
289  DetSet<CTPPSDiamondDigi> &digiDetSet = digi.find_or_insert(detId);
290  digiDetSet.push_back(CTPPSDiamondDigi(diamondframe->getLeadingEdgeTime(),diamondframe->getTrailingEdgeTime(),diamondframe->getThresholdVoltage(),diamondframe->getMultihit(),diamondframe->getHptdcErrorFlag()));
291  }
292 
293  // save status
294  DetSet<TotemVFATStatus> &statusDetSet = status.find_or_insert(detId);
295  statusDetSet.push_back(record.status);
296  }
297 }
298 
299 //----------------------------------------------------------------------------------------------------
300 
303 {
304  // structure merging vfat frame data with the mapping
305  map<TotemFramePosition, Record> records;
306 
307  // common processing - frame validation
308  runCommon(coll, mapping, records);
309 
310  // second loop over data
311  for (auto &p : records)
312  {
313  Record &record = p.second;
314  if (!record.status.isOK()) continue;
315 
316  const TotemFramePosition* framepos = &p.first;
317 
318  if(((framepos->getIdxInFiber()%2)==0)&&(framepos->getIdxInFiber()<14))
319  {
320  //corresponding channel data are always in the neighbouring idx in fiber
321 
322  TotemFramePosition frameposdata(framepos->getSubSystemId(),framepos->getTOTFEDId(),framepos->getOptoRxId(),framepos->getGOHId(),(framepos->getIdxInFiber()+1));
323  TotemFramePosition frameposEvtInfo(framepos->getSubSystemId(),framepos->getTOTFEDId(),framepos->getOptoRxId(),framepos->getGOHId(),0xe);
324 
325  auto channelwaveformPtr = records.find(frameposdata);
326  auto eventInfoPtr = records.find(frameposEvtInfo);
327 
328  if ( channelwaveformPtr != records.end() && eventInfoPtr != records.end() )
329  {
330  Record &channelwaveform = records[frameposdata];
331  Record &eventInfo = records[frameposEvtInfo];
332 
333  // Extract all the waveform information from the raw data
334  TotemSampicFrame totemSampicFrame((const uint8_t*) record.frame->getData(), (const uint8_t*) channelwaveform.frame->getData(), (const uint8_t*) eventInfo.frame->getData());
335 
336  if (totemSampicFrame.valid())
337  {
338  // create the digi
339  TotemTimingEventInfo eventInfoTmp( totemSampicFrame.getEventHardwareId(), totemSampicFrame.getL1ATimestamp(), totemSampicFrame.getBunchNumber(), totemSampicFrame.getOrbitNumber(), totemSampicFrame.getEventNumber(), totemSampicFrame.getChannelMap(), totemSampicFrame.getL1ALatency(), totemSampicFrame.getNumberOfSentSamples(), totemSampicFrame.getOffsetOfSamples(), totemSampicFrame.getPLLInfo() );
340  TotemTimingDigi digiTmp( totemSampicFrame.getHardwareId(), totemSampicFrame.getFPGATimestamp(), totemSampicFrame.getTimestampA(), totemSampicFrame.getTimestampB(), totemSampicFrame.getCellInfo(), totemSampicFrame.getSamples(), eventInfoTmp);
341  // calculate ids
343 
344  const TotemDAQMapping::TotemTimingPlaneChannelPair SWpair = mapping.getTimingChannel( totemSampicFrame.getHardwareId() );
345  // for FW Version > 0 plane and channel are encoded in the dataframe
346  if ( totemSampicFrame.getFWVersion() == 0 ) // Mapping not present in HW, read from SW
347  {
348  if ( SWpair.plane == -1 || SWpair.channel == -1 )
349  {
350  if (verbosity>0)
351  LogWarning("Totem") << "Error in RawToDigiConverter::TotemTiming > " << "HwId not recognized! hwId: " << std::hex << (unsigned int) totemSampicFrame.getHardwareId() << endl;
352  }
353  else
354  {
355  detId.setPlane( SWpair.plane % 4);
356  detId.setChannel( SWpair.channel );
357  detId.setRP( SWpair.plane / 4 ); // Top:0 or Bottom:1
358  }
359  }
360  else // Mapping read from HW, checked by SW
361  {
362  const int HWplane = totemSampicFrame.getDetPlane() % 16;
363  const int HWchannel = totemSampicFrame.getDetChannel() % 16;
364 
365  if ( SWpair.plane == -1 || SWpair.channel == -1 )
366  {
367  if ( verbosity>0 )
368  LogWarning("Totem") << "Warning in RawToDigiConverter::TotemTiming > " << "HwId not recognized! hwId: " << std::hex << (unsigned int) totemSampicFrame.getHardwareId() << "\tUsing plane and ch from HW without check!" << endl;
369  }
370  else
371  {
372  if ( verbosity>0 && ( SWpair.plane != HWplane || SWpair.channel != HWchannel ) )
373  LogWarning("Totem") << "Warning in RawToDigiConverter::TotemTiming > " << "Hw mapping different from SW mapping. hwId: " << std::hex << (unsigned int) totemSampicFrame.getHardwareId() << "HW: " << std::dec << HWplane << ":" << HWchannel << "\tSW " << SWpair.plane << ":" << SWpair.channel << "\tUsing plane and ch from HW!" << endl;
374  }
375  detId.setPlane( HWplane % 4 );
376  detId.setChannel( HWchannel );
377  detId.setRP( HWplane / 4 ); // Top:0 or Bottom:1
378  }
379 
380  DetSet<TotemTimingDigi> &digiDetSet = digi.find_or_insert(detId);
381  digiDetSet.push_back(digiTmp);
382  }
383  }
384  }
385  }
386 }
387 
388 
389 //----------------------------------------------------------------------------------------------------
390 
392 {
393  // print error summary
394  if (printErrorSummary)
395  {
396  if (!errorSummary.empty())
397  {
398  stringstream ees;
399  for (const auto &vit : errorSummary)
400  {
401  ees << vit.first << endl;
402 
403  for (const auto &it : vit.second)
404  ees << " " << it.first << " : " << it.second << endl;
405  }
406 
407  LogWarning("Totem") << "RawToDigiConverter: error summary (error signature : number of such events)\n" << endl << ees.rdbuf();
408  } else {
409  LogInfo("Totem") << "RawToDigiConverter: no errors to be reported.";
410  }
411  }
412 
413  // print summary of unknown frames (found in data but not in the mapping)
415  {
416  if (!unknownSummary.empty())
417  {
418  stringstream ees;
419  for (const auto &it : unknownSummary)
420  ees << " " << it.first << " : " << it.second << endl;
421 
422  LogWarning("Totem") << "RawToDigiConverter: frames found in data, but not in the mapping (frame position : number of events)\n"
423  << endl << ees.rdbuf();
424  } else {
425  LogInfo("Totem") << "RawToDigiConverter: no unknown frames to be reported.";
426  }
427  }
428 }
Detector ID class for TOTEM Si strip detectors.
Definition: TotemRPDetId.h:30
bool isOK() const
Contains data on masked channels of a VFAT.
void push_back(const T &t)
Definition: DetSet.h:68
unsigned int testECMostFrequent
Channel-mask mapping.
unsigned int printErrorSummary
VFATFrame::word * getData()
Definition: VFATFrame.h:40
void runCommon(const VFATFrameCollection &input, const TotemDAQMapping &mapping, std::map< TotemFramePosition, Record > &records)
Common processing for all VFAT based sub-systems.
void setCRCError(bool val=true)
Class for finding the most popular both EC and BC counter, and filling the conversion status &#39;wrong E...
uint32_t chip() const
Definition: TotemRPDetId.h:60
JetCorrectorParameters::Record record
Definition: classes.h:7
uint32_t getLeadingEdgeTime() const
get timing infromation
unsigned short getIdxInFiber() const
void Analyze(T &status, bool error, std::ostream &es)
summarizes and fill the status (wrong EC and BC progress error for some frames)
unsigned short getTOTFEDId() const
TotemSymbID symbolicID
the symbolic id
void setNumberOfClusters(uint8_t v)
bool checkFootprint() const
Definition: VFATFrame.cc:63
RawToDigiConverter(const edm::ParameterSet &conf)
virtual bool checkCRC() const
Definition: VFATFrame.cc:79
unsigned short getOptoRxId() const
uint8_t getNumberOfClusters() const
Definition: VFATFrame.h:130
uint32_t getThresholdVoltage() const
VFATFrame::word getMultihit() const
unsigned int testFootprint
flags for which tests to run
std::map< TotemSymbID, TotemVFATAnalysisMask > analysisMask
void setFullyMaskedOut()
static std::string const input
Definition: EdmProvDump.cc:44
reference find_or_insert(det_id_type id)
Definition: DetSetVector.h:254
the VFATFrameCollection interator
unsigned int printUnknownFrameSummary
bool isNumberOfClustersPresent() const
Returns true if the CRC word is present in the frame.
Definition: VFATFrame.h:112
The mapping between FramePosition and VFATInfo.
const TotemVFATInfo * info
unsigned short getSubSystemId() const
the getters and setters below are deprecated
bool fullMask
whether all channels of the VFAT shall be masked
const TotemTimingPlaneChannelPair getTimingChannel(const uint8_t hwId) const
Given the hardware ID, returns the corresponding Plane, Channel pair (TotemTimingPlaneChannelPair) ...
void setMissing(bool val=true)
unsigned short getGOHId() const
unsigned int symbolicID
chip ID, raw integer representation of DetId class
Definition: TotemSymbId.h:21
void setFootprintError(bool val=true)
Hw Id mapping for Totem Timing (dynamical mapping in Sampic)
void printSummaries() const
Print error summaries.
uint32_t getTrailingEdgeTime() const
void setNumberOfClustersSpecified(bool v)
unsigned char verbosity
JetCorrectorParametersCollection coll
Definition: classes.h:10
std::map< TotemFramePosition, unsigned int > unknownSummary
VFATFrame::word getHptdcErrorFlag() const
VFATFrame::word getEC() const
Returns Event Counter (EV<7:0>).
Definition: VFATFrame.h:57
unsigned int hwID
the hardware ID (16 bit)
unsigned int testBCMostFrequent
std::map< TotemFramePosition, TotemVFATInfo > VFATMapping
void setEC(const uint8_t ec)
void Fill(word counter, TotemFramePosition fr)
add new value to map, counter takes value of EC or BC number
HLT enums.
void setPartiallyMaskedOut()
std::set< unsigned char > maskedChannels
list of channels to be masked
std::map< TotemFramePosition, std::map< TotemVFATStatus, unsigned int > > errorSummary
error summaries
Detector ID class for CTPPS Timing Diamond detectors. Bits [19:31] : Assigend in CTPPSDetId Calss Bit...
bool IsEnd()
returns whether the iterator points over the end of the collection
void setIDMismatch(bool val=true)
bool isIDPresent() const
Returns true if the ID word is present in the frame.
Definition: VFATFrame.h:100
double EC_fraction
the minimal required (relative) occupancy of the most frequent counter value to be accepted ...
VFATFrame::word getChipID() const
Returns ChipID (ChipID<11:0>).
Definition: VFATFrame.h:69
eventInfo
add run, event number and lumi section
void setChipPosition(uint8_t _cp)
virtual std::vector< unsigned char > getActiveChannels() const
Definition: VFATFrame.cc:38
void run(const VFATFrameCollection &coll, const TotemDAQMapping &mapping, const TotemAnalysisMask &mask, edm::DetSetVector< TotemRPDigi > &digi, edm::DetSetVector< TotemVFATStatus > &status)
Creates RP digi.
TotemRPDetId getPlaneId() const
Definition: TotemRPDetId.h:73
unsigned int EC_min
the minimal required number of frames to determine the most frequent counter value ...
Detector ID class for CTPPS Totem Timing detectors. Bits [19:31] : Assigend in CTPPSDetId Calss Bits ...