CMS 3D CMS Logo

PixelSLinkDataInputSource.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: SiPixelInputSources
4 // Class: PixelSLinkDataInputSource
5 //
14 //
15 // Original Author: Freya Blekman
16 // Created: Fri Sep 7 15:46:34 CEST 2007
17 //
18 //
19 
28 #include <iostream>
29 #include <memory>
30 
31 using namespace edm;
32 
33 // function to get the trigger number from fill words
34 int PixelSLinkDataInputSource::getEventNumberFromFillWords(const std::vector<uint64_t> &buffer, uint32_t &totword) {
35  // buffer validity, should already be pretty clean as this is exactly what
36  // goes into the FEDRawDataobject.
37 
38  // code copied directly from A. Ryd's fill word checker in
39  // PixelFEDInterface::PwordSlink64
40 
41  int fif2cnt = 0;
42  int dumcnt = 0;
43  int gapcnt = 0;
44  uint32_t gap[9];
45  uint32_t dum[9];
46  uint32_t word[2] = {0, 0};
47  uint32_t chan = 0;
48  uint32_t roc = 0;
49 
50  const uint32_t rocmsk = 0x3e00000;
51  const uint32_t chnlmsk = 0xfc000000;
52 
53  for (int jk = 1; jk < 9; jk++)
54  gap[jk] = 0;
55  for (int jk = 1; jk < 9; jk++)
56  dum[jk] = 0;
57 
58  int fifcnt = 1;
59  for (size_t kk = 0; kk < buffer.size(); ++kk) {
60  word[0] = (uint32_t)buffer[kk];
61  word[1] = (uint32_t)(buffer[kk] >> 32);
62 
63  for (size_t iw = 0; iw < 2; iw++) {
64  chan = ((word[iw] & chnlmsk) >> 26);
65  roc = ((word[iw] & rocmsk) >> 21);
66 
67  // count non-error words
68  if (roc < 25) {
69  if ((chan > 4) && (chan < 10) && (fifcnt != 2)) {
70  fif2cnt = 0;
71  fifcnt = 2;
72  }
73  if ((chan > 9) && (chan < 14) && (fifcnt != 3)) {
74  fif2cnt = 0;
75  fifcnt = 3;
76  }
77  if ((chan > 13) && (chan < 19) && (fifcnt != 4)) {
78  fif2cnt = 0;
79  fifcnt = 4;
80  }
81  if ((chan > 18) && (chan < 23) && (fifcnt != 5)) {
82  fif2cnt = 0;
83  fifcnt = 5;
84  }
85  if ((chan > 22) && (chan < 28) && (fifcnt != 6)) {
86  fif2cnt = 0;
87  fifcnt = 6;
88  }
89  if ((chan > 27) && (chan < 32) && (fifcnt != 7)) {
90  fif2cnt = 0;
91  fifcnt = 7;
92  }
93  if ((chan > 31) && (fifcnt != 8)) {
94  fif2cnt = 0;
95  fifcnt = 8;
96  }
97  fif2cnt++;
98  }
99  if (roc == 26) {
100  gap[fifcnt] = (0x1000 + (word[iw] & 0xff));
101  gapcnt++;
102  }
103 
104  if ((roc == 27) && ((fif2cnt + dumcnt) < 6)) {
105  dumcnt++;
106  dum[fifcnt] = (0x1000 + (word[iw] & 0xff));
107  } else if ((roc == 27) && ((fif2cnt + dumcnt) > 6)) {
108  dumcnt = 1;
109  fif2cnt = 0;
110  fifcnt++;
111  }
112  }
113 
114  // word check complete
115  if (((fif2cnt + dumcnt) == 6) && (dumcnt > 0)) // done with this fifo
116  {
117  dumcnt = 0;
118  fif2cnt = 0;
119  fifcnt++;
120  }
121  if ((gapcnt > 0) && ((dumcnt + fif2cnt) > 5)) // done with this fifo
122  {
123  gapcnt = 0;
124  fifcnt++;
125  fif2cnt = 0;
126  dumcnt = 0;
127  } else if ((gapcnt > 0) && ((dumcnt + fif2cnt) < 6))
128  gapcnt = 0;
129 
130  } // end of fifo-3 word loop-see what we got!
131 
132  int status = 0;
133 
134  if (gap[1] > 0) {
135  totword = (gap[1] & 0xff);
136  status = 1;
137  } else if (gap[2] > 0) {
138  totword = (gap[2] & 0xff);
139  status = 1;
140  } else if (dum[1] > 0) {
141  totword = (dum[1] & 0xff);
142  status = 1;
143  } else if (dum[2] > 0) {
144  totword = (dum[2] & 0xff);
145  status = 1;
146  }
147 
148  if (gap[3] > 0) {
149  totword = totword | ((gap[3] & 0xff) << 8);
150  status = status | 0x2;
151  } else if (gap[4] > 0) {
152  totword = totword | ((gap[4] & 0xff) << 8);
153  status = status | 0x2;
154  } else if (dum[3] > 0) {
155  totword = totword | ((dum[3] & 0xff) << 8);
156  status = status | 0x2;
157  } else if (dum[4] > 0) {
158  totword = totword | ((dum[4] & 0xff) << 8);
159  status = status | 0x2;
160  }
161 
162  if (gap[5] > 0) {
163  totword = totword | ((gap[5] & 0xff) << 16);
164  status = status | 0x4;
165  } else if (gap[6] > 0) {
166  totword = totword | ((gap[6] & 0xff) << 16);
167  status = status | 0x4;
168  } else if (dum[5] > 0) {
169  totword = totword | ((dum[5] & 0xff) << 16);
170  status = status | 0x4;
171  } else if (dum[6] > 0) {
172  totword = totword | ((dum[6] & 0xff) << 16);
173  status = status | 0x4;
174  }
175 
176  if (gap[7] > 0) {
177  totword = totword | ((gap[7] & 0xff) << 24);
178  status = status | 0x8;
179  } else if (gap[8] > 0) {
180  totword = totword | ((gap[8] & 0xff) << 24);
181  status = status | 0x8;
182  } else if (dum[7] > 0) {
183  totword = totword | ((dum[7] & 0xff) << 24);
184  status = status | 0x8;
185  } else if (dum[8] > 0) {
186  totword = totword | ((dum[8] & 0xff) << 24);
187  status = status | 0x8;
188  }
189  return (status);
190 }
191 
192 // constructor
196  m_fedid(pset.getUntrackedParameter<int>("fedid")),
197  m_fileindex(0),
198  m_runnumber(pset.getUntrackedParameter<int>("runNumber", -1)),
199  m_currenteventnumber(0),
200  m_currenttriggernumber(0),
201  m_eventnumber_shift(0) {
202  produces<FEDRawDataCollection>();
203 
204  if (m_fileindex >= fileNames(0).size()) {
205  edm::LogInfo("") << "no more file to read " << std::endl;
206  return; // ???
207  }
208  std::string currentfilename = fileNames(0)[m_fileindex];
209  edm::LogInfo("") << "now examining file " << currentfilename;
210  m_fileindex++;
211  // reading both castor and other ('normal'/dcap) files.
212  using namespace edm::storage;
213  IOOffset size = -1;
214  StorageFactory::getToModify()->enableAccounting(true);
215 
216  edm::LogInfo("PixelSLinkDataInputSource")
217  << " unsigned long int size = " << sizeof(unsigned long int)
218  << "\n unsigned long size = " << sizeof(unsigned long)
219  << "\n unsigned long long size = " << sizeof(unsigned long long) << "\n uint32_t size = " << sizeof(uint32_t)
220  << "\n uint64_t size = " << sizeof(uint64_t) << std::endl;
221 
222  bool exists = StorageFactory::get()->check(currentfilename, &size);
223 
224  edm::LogInfo("PixelSLinkDataInputSource") << "file size " << size << std::endl;
225 
226  if (!exists) {
227  edm::LogInfo("") << "file " << currentfilename << " cannot be found.";
228  return;
229  }
230  // now open the file stream:
231  storage = StorageFactory::get()->open(currentfilename);
232  // (throw if storage is 0)
233 
234  // check run number by opening up data file...
235 
236  Storage &temp_file = *storage;
237  // IOSize n =
238  temp_file.read((char *)&m_data, 8);
239  if ((m_data >> 60) != 0x5) {
240  uint32_t runnum = m_data;
241  if (m_runnumber != -1)
242  edm::LogInfo("") << "WARNING: observed run number encoded in S-Link dump. Overwriting "
243  "run number as defined in .cfg file!!! Run number now set to "
244  << runnum << " (was " << m_runnumber << ")";
246  }
247  temp_file.read((char *)&m_data, 8);
248  m_currenteventnumber = (m_data >> 32) & 0x00ffffff;
249 }
250 
251 // destructor
253 
257  edm::storage::Storage &m_file = *storage;
258 
259  // create product (raw data)
260  buffers = std::make_unique<FEDRawDataCollection>();
261 
262  // uint32_t currenteventnumber = (m_data >> 32)&0x00ffffff;
263  uint32_t eventnumber = (m_data >> 32) & 0x00ffffff;
264 
265  do {
266  std::vector<uint64_t> buffer;
267 
268  uint16_t count = 0;
269  eventnumber = (m_data >> 32) & 0x00ffffff;
270  if (m_currenteventnumber == 0)
271  m_currenteventnumber = eventnumber;
272  edm::LogInfo("PixelSLinkDataInputSource::produce()")
273  << "**** event number = " << eventnumber << " global event number " << m_currenteventnumber << " data "
274  << std::hex << m_data << std::dec << std::endl;
275  while ((m_data >> 60) != 0x5) {
276  // std::cout << std::hex << m_data << std::dec << std::endl;
277  if (count == 0) {
278  edm::LogWarning("") << "DATA CORRUPTION!";
279  edm::LogWarning("") << "Expected to find header, but read: 0x" << std::hex << m_data << std::dec;
280  }
281 
282  count++;
283  int n = m_file.read((char *)&m_data, 8);
284  edm::LogWarning("") << "next data " << std::hex << m_data << std::dec << std::endl;
285 
286  if (n != 8) {
287  edm::LogInfo("") << "End of input file";
288  return false;
289  }
290  }
291 
292  if (count > 0) {
293  edm::LogWarning("") << "Had to read " << count << " words before finding header!" << std::endl;
294  }
295 
296  if (m_fedid > -1) {
297  m_data = (m_data & 0xfffffffffff000ffLL) | ((m_fedid & 0xfff) << 8);
298  }
299 
300  uint16_t fed_id = (m_data >> 8) & 0xfff;
301  // std::cout << "fed id = " << fed_id << std::endl;
302  buffer.push_back(m_data);
303 
304  do {
305  m_file.read((char *)&m_data, 8);
306  buffer.push_back(m_data);
307  } while ((m_data >> 60) != 0xa);
308  // std::cout << "read " << buffer.size() << " long words" << std::endl;
309 
310  auto rawData = std::make_unique<FEDRawData>(8 * buffer.size());
311  // FEDRawData * rawData = new FEDRawData(8*buffer.size());
312  unsigned char *dataptr = rawData->data();
313 
314  for (uint16_t i = 0; i < buffer.size(); i++) {
315  ((uint64_t *)dataptr)[i] = buffer[i];
316  }
317  uint32_t thetriggernumber = 0;
318  int nfillwords = 0; // getEventNumberFromFillWords(buffer,thetriggernumber);
319 
320  if (nfillwords > 0) {
321  LogInfo("") << "n fill words = " << nfillwords << ", trigger numbers: " << thetriggernumber << ","
322  << m_currenttriggernumber << std::endl;
323  m_eventnumber_shift = thetriggernumber - m_currenttriggernumber;
324  }
325  m_currenttriggernumber = thetriggernumber;
326  FEDRawData &fedRawData = buffers->FEDData(fed_id);
327  fedRawData = *rawData;
328 
329  // read the first data member of the next blob to check on event number
330  int n = m_file.read((char *)&m_data, 8);
331  if (n == 0) {
332  edm::LogInfo("") << "End of input file";
333  }
334  m_currenteventnumber = (m_data >> 32) & 0x00ffffff;
335  if (m_currenteventnumber < eventnumber)
336  LogError("PixelSLinkDataInputSource")
337  << " error, the previous event number (" << eventnumber << ") is LARGER than the next event number ("
338  << m_currenteventnumber << ")" << std::endl;
339 
340  } while (eventnumber == m_currenteventnumber);
341 
342  uint32_t realeventno = synchronizeEvents();
343  if (m_runnumber != 0)
344  id = edm::EventID(m_runnumber, id.luminosityBlock(), realeventno);
345  else
346  id = edm::EventID(id.run(), id.luminosityBlock(), realeventno);
347  return true;
348 }
349 
350 // produce() method. This is the worker method that is called every event.
352  event.put(std::move(buffers));
353  buffers.reset();
354 }
355 
356 // this function sets the m_globaleventnumber quantity. It uses the
357 // m_currenteventnumber and m_currenttriggernumber values as input
359  int32_t result = m_currenteventnumber - 1;
360 
361  return (uint32_t)result;
362 }
size
Write out results.
int64_t IOOffset
Definition: IOTypes.h:20
int runnum
Log< level::Error, false > LogError
uint64_t word
PixelSLinkDataInputSource(const edm::ParameterSet &pset, const edm::InputSourceDescription &desc)
std::unique_ptr< edm::storage::Storage > storage
void produce(edm::Event &event) override
unsigned long long TimeValue_t
Definition: Timestamp.h:28
std::unique_ptr< FEDRawDataCollection > buffers
Log< level::Info, false > LogInfo
unsigned long long uint64_t
Definition: Time.h:13
int getEventNumberFromFillWords(const std::vector< uint64_t > &data, uint32_t &totword)
chan
lumi = TPaveText(lowX+0.38, lowY+0.061, lowX+0.45, lowY+0.161, "NDC") lumi.SetBorderSize( 0 ) lumi...
HLT enums.
std::vector< std::string > fileNames(unsigned iCatalog) const
Definition: FromFiles.h:22
#define get
Log< level::Warning, false > LogWarning
bool setRunAndEventInfo(edm::EventID &id, edm::TimeValue_t &time, edm::EventAuxiliary::ExperimentType &) override
def move(src, dest)
Definition: eostools.py:511
Definition: event.py:1