CMS 3D CMS Logo

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