CMS 3D CMS Logo

LmfSource.cc
Go to the documentation of this file.
1 /*
2  * \author Philippe Gras CEA/Saclay
3  */
4 
5 #include <iostream>
6 #include <iomanip>
15 
16 using namespace edm;
17 using namespace std;
18 
19 const unsigned char LmfSource::minDataFormatVersion_ = 4;
20 const unsigned char LmfSource::maxDataFormatVersion_ = 5;
21 const unsigned LmfSource::fileHeaderSize = 2;
22 
23 
25  const InputSourceDescription& desc) :
26  ProducerSourceBase(pset, desc, true),
27  fileNames_(pset.getParameter<vector<string> >("fileNames")),
28  iFile_ (-1),
29  fedId_(-1),
30  fileHeader_(fileHeaderSize),
31  dataFormatVers_(5),
32  rcRead_(false),
33  preScale_(pset.getParameter<unsigned>("preScale")),
34  iEvent_(0),
35  iEventInFile_(0),
36  indexTablePos_(0),
37  orderedRead_(pset.getParameter<bool>("orderedRead")),
38  watchFileList_(pset.getParameter<bool>("watchFileList")),
39  fileListName_(pset.getParameter<std::string>("fileListName")),
40  inputDir_(pset.getParameter<std::string>("inputDir")),
41  nSecondsToSleep_(pset.getParameter<int>("nSecondsToSleep")),
42  verbosity_(pset.getUntrackedParameter<int>("verbosity"))
43 {
44  if(preScale_==0) preScale_ = 1;
45  produces<FEDRawDataCollection>();
46  // open fileListName
47  if (watchFileList_) {
48  fileList_.open( fileListName_.c_str() );
49  if (fileList_.fail()) {
50  throw cms::Exception("FileListOpenError")
51  << "Failed to open input file " << fileListName_ << "\n";
52  }
53  } else {
54  //throws a cms exception if error in fileNames parameter
56  }
57 }
58 
60  if(iFile_==-1) return false; //no file open
61 
62  if(verbosity_) cout << "[LmfSource]"
63  << "Opening file #" << (iFile_+1) << " '"
64  << currentFileName_ << "'\n";
65 
66  in_.read((char*)&fileHeader_[0], fileHeaderSize*sizeof(uint32_t));
67 
68  if(in_.eof()) return false;
69 
70  if(verbosity_){
71  cout << "[LmfSource]"
72  << "File header (in hex):" << hex;
73  for(unsigned i=0; i < fileHeaderSize; ++i){
74  if(i%8==0) cout << "\n";
75  cout << setw(8) << fileHeader_[i] << " ";
76  }
77  cout << dec << "\n";
78  }
79 
80 
81  char id[4];
82 
83  id[0] = fileHeader_[0] & 0xFF;
84  id[1] = (fileHeader_[0] >>8) & 0xFF;
85  id[2] = (fileHeader_[0] >>16) & 0xFF;
86  id[3] = (fileHeader_[0] >>24) & 0xFF;
87 
88  if(!(id[0]=='L' && id[1] == 'M'
89  && id[2] == 'F')){
90  throw cms::Exception("FileReadError")
91  << currentFileName_ << " is not a file in LMF format!";
92  }
93  dataFormatVers_ = id[3];
94  if(verbosity_) cout << "[LmfSource]"
95  << "LMF format: " << (int)dataFormatVers_ << "\n";
96 
99  throw cms::Exception("FileReadError")
100  << currentFileName_ << ": LMF format version " << (int) dataFormatVers_
101  << " is not supported by this release of LmfSource module";
102  }
103 
105 
106  if(verbosity_) cout << "[LmfSource] File position of index table: 0x"
107  << setfill('0') << hex << setw(8) << indexTablePos_
108  << setfill(' ') << dec << "\n";
109 
110  if(dataFormatVers_ < 5){
111  in_.ignore(4);
112  }
113 
114  return true;
115 }
116 
118  // bool rc;
119  // while(!((rc = readFileHeader()) & readEventPayload())){
120  // if(openFile(++iFile_)==false){//no more files
121  // if(verbosity_) cout << "[LmfSource]"
122  // << "No more input file";
123  // return false;
124  // }
125  // }
126  auto coll = std::make_unique<FEDRawDataCollection>();
127  coll->swap(fedColl_);
128  if(verbosity_) cout << "[LmfSource] Putting FEDRawDataCollection in event\n";
129  evt.put(std::move(coll));
130 }
131 
132 bool LmfSource::openFile(int iFile){
133  iEventInFile_ = 0;
134  if(watchFileList_) {
135  for ( ;; ) {
136  // read the first field of the line, which must be the filename
138  currentFileName_ = inputDir_ + "/" + currentFileName_;
139  if (!fileList_.fail()) {
140  // skip the rest of the line
141  std::string tmp_buffer;
142  std::getline(fileList_, tmp_buffer);
143  if(verbosity_) cout << "[LmfSource]"
144  << "Opening file " << currentFileName_ << "\n";
145  in_.open(currentFileName_.c_str());
146  if (!in_.fail()) {
147  // file was successfully open
148  return true;
149  } else {
150  // skip file
151  edm::LogError("FileOpenError")
152  << "Failed to open input file " << currentFileName_ << ". Skipping file\n";
153  in_.close();
154  in_.clear();
155  }
156  }
157  // if here, no new file is available: sleep and retry later
158  if (verbosity_) std::cout << "[LmfSource]"
159  << " going to sleep 5 seconds\n";
160  sleep(nSecondsToSleep_);
161  fileList_.clear();
162  }
163  } else {
164  if(iFile > (int)fileNames_.size()-1) return false;
165  currentFileName_ = fileNames_[iFile];
166  if(verbosity_) cout << "[LmfSource]"
167  << "Opening file " << currentFileName_ << "\n";
168  in_.open(currentFileName_.c_str());
169  if(in_.fail()){
170  throw cms::Exception("FileOpenError")
171  << "Failed to open input file " << currentFileName_ << "\n";
172  }
173  }
174  return true;
175 }
176 
178  if(iFile_<0) return false; //no file opened.
179  if(orderedRead_){
180  if(iEventInFile_>=indexTable_.size()) return false;
181  if(verbosity_){
182  cout << "[LmfSource] move to event with orbit Id "
183  << indexTable_[iEventInFile_].orbit
184  << " at file position 0x"
185  << hex << setfill('0')
186  << setw(8) << indexTable_[iEventInFile_].filePos
187  << setfill(' ') << dec << "\n";
188  }
189  const streampos pos = indexTable_[iEventInFile_].filePos;
190  in_.clear();
191  in_.seekg(pos);
192  if(in_.bad()){
193  cout << "[LmfSource] Problem while reading file "
194  << currentFileName_ << ". Problem with event index table?\n";
195  return false;
196  }
197  ++iEventInFile_;
198  return true;
199  } else{
200  return true;
201  }
202 }
203 
204 bool LmfSource::readEvent(bool doSkip){
205  while(!(nextEventWithinFile() && readEventWithinFile(doSkip))){
206  //failed to read event. Let's look for next file:
207  in_.close();
208  in_.clear();
209  bool rcOpen = openFile(++iFile_);
210  if(rcOpen==false){//no more files
211  if(verbosity_) cout << "[LmfSource]"
212  << "No more input file";
213  rcRead_ = false;
214  return rcRead_;
215  }
217  if(verbosity_) cout << "File header readout "
218  << (rcRead_?"succeeded":"failed") << "\n";
220  }
221  return rcRead_;
222 }
223 
225  //empties collection:
226  if(fedId_>0){
228  }
229  if(verbosity_) cout << "[LmfSource]"
230  << "About to read event...\n";
231 
232  bool rc;
233  for(;;){
234  if(filter()){//event to read
235  rc = readEvent();
236  break; //either event is read or no more event
237  } else { //event to skip
238  rc = readEvent(true);
239  if(rc==false){//no more events
240  break;
241  }
242  }
243  }
244 
245  if(!rc) return false; //event readout failed
246 
247  if(verbosity_) cout << "[LmfSource]"
248  << "Setting event time to "
249  << /*toString(*/timeStamp_/*)*/ << ", "
250  << "Run number to " << runNum_ << ","
251  << "Event number to " << eventNum_ << "\n";
252 
253  time = timeStamp_;
254  id = EventID(runNum_, lumiBlock_, eventNum_);
255  return true;
256 }
257 
259  if(iFile_==-1 || !rcRead_) return false; //no file open
260  // or header reading failed
261  //number of 32-bit word to read first to get the event size
262  //field
263  const int timeStamp32[] = {0, 0}; //timestamp is 64-bit long
264  const int lumiBlock32[] = {2, 2};
265  const int runNum32[] = {3, 3};
266  const int orbitNum32[] = {4, 4};
267  const int bx32[] = {5, 5};
268  const int eventNum32[] = {6, 6};
269  const int activeFedId32[] = {7,-1};
270  const int calibTrig32[] = {-1,7};
271  const int nFeds32[] = {-1,8};
272  // const int reserved32[] = {-1,9};
273  const int evtHeadSize32[] = {8,10};
274 
275  const unsigned char iv = dataFormatVers_-minDataFormatVersion_;
276  assert(iv<=sizeof(timeStamp32)/sizeof(timeStamp32[0]));
277 
278  if((int)header_.size() < evtHeadSize32[iv]) header_.resize(evtHeadSize32[iv]);
279 
280 
281  if(verbosity_) cout << "[LmfSource]"
282  << "Reading event header\n";
283 
284  in_.read((char*)&header_[0], evtHeadSize32[iv]*4);
285  if(in_.bad()){//reading error other than eof
286  throw cms::Exception("FileReadError")
287  << "Error while reading from file " << currentFileName_;
288  }
289  if(in_.eof()) return false;
290 
291  if(verbosity_){
292  cout << "[LmfSource]"
293  << "Event header (in hex):" << hex << setfill('0');
294  for(int i=0; i < evtHeadSize32[iv]; ++i){
295  if(i%8==0) cout << "\n";
296  cout << setw(8) << header_[i] << " ";
297  }
298  cout << dec << setfill(' ') << "\n";
299  }
300 
301  timeStamp_ = *(uint64_t*)&header_[timeStamp32[iv]];
302  lumiBlock_ = header_[lumiBlock32[iv]];
303  runNum_ = header_[runNum32[iv]];
304  orbitNum_ = header_[orbitNum32[iv]];
305  eventNum_ = header_[eventNum32[iv]];
306  bx_ = header_[bx32[iv]];
307  calibTrig_ = calibTrig32[iv]>=0?header_[calibTrig32[iv]]:0;
308  int activeFedId = activeFedId32[iv]>=0?
309  header_[activeFedId32[iv]]:
310  ((calibTrig_ & 0x3F) + 600);
311  nFeds_ = nFeds32[iv] < 0 ? 1 : header_[nFeds32[iv]];
312 
313  if(verbosity_){
314  time_t t = time_t(timeStamp_ >>32);
315  div_t t_ms_us = div(timeStamp_ & 0xFFFFFFFF, 1000);
316  char tbuf[256];
317  strftime(tbuf, sizeof(tbuf), "%F %T", localtime(&t));
318  tbuf[sizeof(tbuf)-1] = 0;
319  cout << "[LmfSource] "
320  << "timeStamp: " << /*toString(timeStamp_)*/ timeStamp_
321  << " (" << tbuf << " " << t_ms_us.quot << " ms " << t_ms_us.rem << " us)\n"
322  << "lumiBlock: " << lumiBlock_ << "\n"
323  << "runNum: " << runNum_ << "\n"
324  << "orbitNum: " << orbitNum_ << "\n"
325  << "eventNum: " << eventNum_ << "\n"
326  << "bx: " << bx_ << "\n"
327  << "activeFedId: " << activeFedId << "\n"
328  << "Calib trigger type: " << ((calibTrig_ >>8) & 0x3) << "\n"
329  << "Color: " << ((calibTrig_ >>6) & 0x3) << "\n"
330  << "Side: " << ((calibTrig_ >>11) & 0x1) << "\n"
331  << "nFeds: " << nFeds_ << "\n";
332  }
333 
334  const int dccLenOffset32 = 2;
335  const int fedIdOffset32 = 0;
336  const int nPreRead32 = 3;
337  vector<int32_t> buf(nPreRead32);
338  for(int iFed = 0; iFed < nFeds_; ++iFed){
339  in_.read((char*) &buf[0], nPreRead32*sizeof(uint32_t));
340 
341  if(verbosity_){
342  cout << "[LmfSource] " << nPreRead32 << " first 32-bit words of "
343  << "FED block: " << hex << setfill('0');
344  for(unsigned i = 0; i< buf.size(); ++i){
345  cout << "0x" << setw(8) << buf[i] << " ";
346  }
347  cout << dec << setfill(' ');
348  }
349 
350 
351  if(in_.bad()) return false;
352 
353  const unsigned eventSize64 = buf[dccLenOffset32] & 0x00FFFFFF;
354  const unsigned eventSize32 = eventSize64*2;
355  const unsigned eventSize8 = eventSize64*8;
356  const unsigned fedId_ = (buf[fedIdOffset32] >>8) & 0xFFF;
357 
358  if(eventSize8 > maxEventSize_){
359  throw cms::Exception("FileReadError")
360  << "Size of event fragment (FED block) read from "
361  << " data of file " << currentFileName_
362  << "is unexpctively large (" << (eventSize8 >>10)
363  << " kByte). "
364  << "This must be an error (corrupted file?)\n";
365  }
366 
367  if(!FEDNumbering::inRange(fedId_)){
368  throw cms::Exception("FileReadError")
369  << "Invalid FED number read from data file.";
370  }
371 
372  int32_t toRead8 = (eventSize32-nPreRead32)*sizeof(int32_t);
373 
374  if(toRead8<0){
375  throw cms::Exception("FileReadError")
376  << "Event size error while reading an event from file "
377  << currentFileName_ << "\n";
378  }
379 
380  if(doSkip){//event to skip
381  if(verbosity_) cout << "[LmfSource] "
382  << "Skipping on event. Move file pointer "
383  << toRead8 << " ahead.\n";
384  in_.seekg(toRead8, ios::cur);
385  if(in_.bad()){//reading error other than eof
386  throw cms::Exception("FileReadError")
387  << "Error while reading from file " << currentFileName_;
388  }
389  } else{
390  //reads FED data:
391  FEDRawData& data_ = fedColl_.FEDData(fedId_);
392  data_.resize(eventSize8);
393 
394  //copy already read data:
395  copy(buf.begin(), buf.end(), (int32_t*)data_.data());
396 
397  in_.read((char*)(data_.data()) + nPreRead32*4,
398  toRead8);
399 
400  if(in_.bad()){//reading error other than eof
401  throw cms::Exception("FileReadError")
402  << "Error while reading from file " << currentFileName_;
403  }
404 
405  if(verbosity_ && data_.size()>16){
406  cout << "[LmfSource]"
407  << "Head of DCC data (in hex):" << hex;
408  for(int i=0; i < 16; ++i){
409  if(i%8==0) cout << "\n";
410  cout << setw(8) << ((uint32_t*)data_.data())[i] << " ";
411  }
412  cout << dec << "\n";
413  }
414 
415  if(dataFormatVers_<=4){//calib trigger in not in event header.
416  // gets it from DCC block
417  calibTrig_ = (((uint32_t*)data_.data())[5] & 0xFC0)
418  | ((activeFedId-600) & 0x3F);
419  if(verbosity_){
420  cout << "[LmfSource] Old data format. "
421  "Uses information read from FED block to retrieve calibration "
422  "trigger type. Value is: 0x"
423  << hex << setfill('0') << setw(3) << calibTrig_
424  << setfill(' ') << dec << "\n";
425  }
426  }
427  }
428  if(in_.eof()) return false;
429  }
430  ++iEvent_;
431  return true;
432 }
433 
434 bool LmfSource::filter() const{
435  return (iEvent_%preScale_==0);
436 }
437 
439  char buf[256];
440  const int secTousec = 1000*1000;
441  time_t tsec = t/secTousec;
442  uint32_t tusec = (uint32_t)(t-tsec);
443  strftime(buf, sizeof(buf), "%F %R %S s", localtime(&tsec));
444  buf[sizeof(buf)-1] = 0;
445  stringstream buf2;
446  buf2 << (tusec+500)/1000;
447  return string(buf) + " " + buf2.str() + " ms";
448 }
449 
451  for(unsigned i = 0; i < fileNames_.size(); ++i){
453  const char s[] = "file:";
454  if(fileName.compare(0, sizeof(s)-1, s)==0){ //file: prefix => to strip
455  fileName.erase(fileName.begin(),
456  fileName.begin() + sizeof(s)-1);
457  }
458  if(fileName.find_first_of(":")!=string::npos){
459  throw cms::Exception("LmfSource")
460  << "Character ':' is not allowed in paths specified fileNames "
461  << "parameter. Please note only local file (or NFS, AFS)"
462  << " is supported (no rfio, no /store)";
463  }
464  const char s1[] = "/store";
465  if(fileName.compare(0, sizeof(s1)-1, s1)==0){
466  throw cms::Exception("LmfSource")
467  << "CMSSW /store not supported by LmfSource. Only local file "
468  << "(or NFS/AFS) allowed. Path starting with /store not permitted";
469  }
470  }
471 }
472 
474 
475  stringstream errMsg;
476  errMsg << "Error while reading event index table of file "
477  << currentFileName_ << ". Try to read it with "
478  << "option orderedRead disabled.\n";
479 
480  if(indexTablePos_==0) throw cms::Exception("LmfSource") << errMsg.str();
481 
482  in_.clear();
483  in_.seekg(indexTablePos_);
484 
485  uint32_t nevts = 0;
486  in_.read((char*)&nevts, sizeof(nevts));
487  in_.ignore(4);
488  if(nevts>maxEvents_){
489  throw cms::Exception("LmfSource")
490  << "Number of events indicated in event index of file "
491  << currentFileName_ << " is unexpectively large. File cannot be "
492  << "read in time-ordered event mode. See orderedRead parmater of "
493  << "LmfSource module.\n";
494  }
495  //if(in_.bad()) throw cms::Exception("LmfSource") << errMsg.str();
496  if(in_.bad()) throw cms::Exception("LmfSource") << errMsg.str();
497  indexTable_.resize(nevts);
498  in_.read((char*)&indexTable_[0], nevts*sizeof(IndexRecord));
499 }
int iFile_
Definition: LmfSource.h:64
int nSecondsToSleep_
Definition: LmfSource.h:198
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:136
uint32_t orbitNum_
Definition: LmfSource.h:131
bool openFile(int iFile)
Definition: LmfSource.cc:132
std::ifstream in_
Definition: LmfSource.h:135
static const unsigned fileHeaderSize
Definition: LmfSource.h:83
def copy(args, dbName)
uint32_t runNum_
Definition: LmfSource.h:128
bool readEventWithinFile(bool doSkip)
Definition: LmfSource.cc:258
uint32_t indexTablePos_
Definition: LmfSource.h:151
bool rcRead_
Definition: LmfSource.h:139
std::vector< uint32_t > header_
Definition: LmfSource.h:81
std::string fileListName_
Definition: LmfSource.h:184
void checkFileNames()
Definition: LmfSource.cc:450
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:47
uint32_t iEventInFile_
Definition: LmfSource.h:149
uint32_t iEvent_
Definition: LmfSource.h:145
LmfSource(const edm::ParameterSet &pset, const edm::InputSourceDescription &isd)
Definition: LmfSource.cc:24
unsigned preScale_
Definition: LmfSource.h:141
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
int nFeds_
Definition: LmfSource.h:155
void resize(size_t newsize)
Definition: FEDRawData.cc:32
static const unsigned char minDataFormatVersion_
Definition: LmfSource.h:92
static const unsigned maxEvents_
Definition: LmfSource.h:165
uint32_t bx_
Definition: LmfSource.h:129
FEDRawDataCollection fedColl_
Definition: LmfSource.h:68
std::string inputDir_
Definition: LmfSource.h:188
int verbosity_
Definition: LmfSource.h:202
static const unsigned maxEventSize_
Definition: LmfSource.h:170
int calibTrig_
Definition: LmfSource.h:153
unsigned long long TimeValue_t
Definition: Timestamp.h:28
uint32_t lumiBlock_
Definition: LmfSource.h:127
bool filter() const
Definition: LmfSource.cc:434
bool setRunAndEventInfo(edm::EventID &id, edm::TimeValue_t &time, edm::EventAuxiliary::ExperimentType &eType) override
Definition: LmfSource.cc:224
void produce(edm::Event &e) override
Definition: LmfSource.cc:117
JetCorrectorParametersCollection coll
Definition: classes.h:10
unsigned long long uint64_t
Definition: Time.h:15
unsigned char dataFormatVers_
Definition: LmfSource.h:133
int fedId_
Definition: LmfSource.h:77
bool watchFileList_
Definition: LmfSource.h:180
static bool inRange(int)
HLT enums.
std::vector< IndexRecord > indexTable_
Definition: LmfSource.h:160
bool orderedRead_
Definition: LmfSource.h:175
void readIndexTable()
Definition: LmfSource.cc:473
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:28
std::ifstream fileList_
Definition: LmfSource.h:194
bool nextEventWithinFile()
Definition: LmfSource.cc:177
std::string currentFileName_
Definition: LmfSource.h:192
uint64_t timeStamp_
Definition: LmfSource.h:126
std::string toString(edm::TimeValue_t &t) const
Definition: LmfSource.cc:438
uint32_t eventNum_
Definition: LmfSource.h:130
bool readFileHeader()
Definition: LmfSource.cc:59
bool readEvent(bool doSkip=false)
Definition: LmfSource.cc:204
std::vector< uint32_t > fileHeader_
Definition: LmfSource.h:87
def move(src, dest)
Definition: eostools.py:510
std::vector< std::string > fileNames_
Definition: LmfSource.h:60
static const unsigned char maxDataFormatVersion_
Definition: LmfSource.h:96