CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
FileReaderDDU.cc
Go to the documentation of this file.
1 #include "FileReaderDDU.h"
2 #include <iostream> // cerr
3 #include <errno.h> // errno
4 #include <string.h> // bzero, memcpy
5 #include <stdlib.h> // exit
6 #include <sys/types.h> // open
7 #include <sys/stat.h> // open
8 #include <fcntl.h> // open
9 #include <unistd.h> // read, close
10 
11 #ifndef O_LARGEFILE //for OSX
12 #define O_LARGEFILE 0
13 #endif
14 
15 
17  if( sizeof(unsigned long long)!=8 || sizeof(unsigned short)!=2 )
18  throw std::runtime_error(std::string("Wrong platform: sizeof(unsigned long long)!=8 || sizeof(unsigned short)!=2"));
19  end = (file_buffer_end = file_buffer + sizeof(file_buffer)/sizeof(unsigned long long));
20  bzero(raw_event, sizeof(raw_event) );
21  bzero(file_buffer,sizeof(file_buffer));
22  word_0=0; word_1=0; word_2=0;
23  eventStatus = 0;
26  acceptCriteria = 0x3F; // Everything
27  fd = 0;
28 }
29 
30 FileReaderDDU::~FileReaderDDU(void){ if( fd ) close(fd); }
31 
32 int FileReaderDDU::open(const char *filename) throw (std::runtime_error) {
33  if( fd ) close(fd);
34  fd = ::open(filename,O_RDONLY|O_LARGEFILE);
35  if( fd == -1 ) throw ( std::runtime_error(std::string("Error opening ").append(filename).append(" data file.")) );
36  return fd;
37 }
38 
39 size_t FileReaderDDU::read(const unsigned short* &buf) throw (std::runtime_error) {
40  // Check for ubnormal situation
41  if( end>file_buffer_end || end<file_buffer ) throw ( std::runtime_error("Error of reading") );
42  if( !fd ) throw ( std::runtime_error("Open some file first") );
43 
44  unsigned long long *start = end;
45  unsigned short *event = raw_event;
46 
47  eventStatus = 0;
48  size_t dduWordCount = 0;
49  end = 0;
50 
51  while( !end && dduWordCount<50000 ){
52  unsigned long long *dduWord = start;
53  unsigned long long preHeader = 0;
54 
55  // Did we reach end of current buffer and want to read next block?
56  // If it was first time and we don't have file buffer then we won't get inside
57  while( dduWord<file_buffer_end && dduWordCount<50000 ){
58  word_0 = word_1; // delay by 2 DDU words
59  word_1 = word_2; // delay by 1 DDU word
60  word_2 = *dduWord;// current DDU word
61  if( (word_2&0xFFFFFFFFFFFF0000LL)==0x8000000180000000LL ){
62  if( eventStatus&Header ){ // Second header
63  word_2 = word_1; // Fall back to get rigth preHeader next time
64  end = dduWord; // Even if we end with preHeader of next evet put it to the end of this event too
65  break;
66  }
67  if( dduWordCount>1 ){ // Extra words between trailer and header
68  if( (word_0&0xFFFFFFFFFFFF0000LL)==0xFFFFFFFFFFFF0000LL ) eventStatus |= FFFF;
69  word_2 = word_1; // Fall back to get rigth preHeader next time
70  end = dduWord;
71  break;
72  }
73  eventStatus |= Header;
74  if( event==raw_event ) preHeader = word_1; // If preHeader not yet in event then put it there
75  start = dduWord;
76  }
77  if( (word_0&0xFFFFFFFFFFFF0000LL)==0x8000FFFF80000000LL ){
78  eventStatus |= Trailer;
79  end = ++dduWord;
80  break;
81  }
82  // Increase counters by one DDU word
83  dduWord++;
84  dduWordCount++;
85  }
86 
87  // If have DDU Header
88  if( preHeader ){
89  // Need to account first word of DDU Header
90  memcpy(event,&preHeader,sizeof(preHeader));
91  event += sizeof(preHeader)/sizeof(unsigned short);
92  }
93 
94  // Take care of the rest
95  memcpy(event,start,(dduWord-start)*sizeof(unsigned long long));
96  event += (dduWord-start)*sizeof(unsigned long long)/sizeof(unsigned short);
97 
98  // If reach max length
99  if( dduWordCount==50000 ){ end = dduWord; break; }
100 
101  if( !end ){
102  // Need to read next block for the rest of this event
103  ssize_t length = ::read(fd,file_buffer,sizeof(file_buffer));
104  if( length==-1 ) throw ( std::runtime_error("Error of reading") );
105  if( length== 0 ){
106  eventStatus |= EndOfStream;
107  end = (file_buffer_end = file_buffer + sizeof(file_buffer)/sizeof(unsigned long long));
108  break;
109  }
110  file_buffer_end = file_buffer + length/sizeof(unsigned long long);
111 
112  // Will start from the beginning of new buffer next time we read it
113  start = file_buffer;
114  }
115  }
116 
117  if( !end ) eventStatus |= DDUoversize;
118  if( !(eventStatus&Header) && !(eventStatus&Trailer) && !(eventStatus&FFFF) ) eventStatus |= Unknown;
119 
120  buf = (const unsigned short*)raw_event;
121  return (eventStatus&FFFF?event-raw_event-4:event-raw_event);
122 }
123 
124 size_t FileReaderDDU::next(const unsigned short* &buf, int prescaling) throw(std::runtime_error) {
125  size_t size=0;
126  for(int i=0; i<prescaling; i++){
127  do {
128  if( (size = read(buf)) == 0 ) break;
129  } while( rejectCriteria&eventStatus || !(acceptCriteria&eventStatus) || (selectCriteria?selectCriteria!=eventStatus:0) );
130  }
131  return size;
132 }
unsigned int rejectCriteria
Definition: FileReaderDDU.h:20
int i
Definition: DBlmapReader.cc:9
tuple start
Check for commandline option errors.
Definition: dqm_diff.py:58
unsigned long long word_2
Definition: FileReaderDDU.h:11
size_t read(const unsigned short *&buf)
virtual ~FileReaderDDU(void)
unsigned short raw_event[200000]
Definition: FileReaderDDU.h:9
unsigned int acceptCriteria
Definition: FileReaderDDU.h:20
unsigned long long word_0
Definition: FileReaderDDU.h:11
unsigned long long * file_buffer_end
Definition: FileReaderDDU.h:14
#define O_LARGEFILE
unsigned int eventStatus
Definition: FileReaderDDU.h:20
#define end
Definition: vmac.h:38
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
unsigned long long file_buffer[4000]
Definition: FileReaderDDU.h:12
size_t next(const unsigned short *&buf, int prescaling=1)
unsigned int selectCriteria
Definition: FileReaderDDU.h:20
tuple filename
Definition: lut2db_cfg.py:20
int open(const char *filename)
unsigned long long word_1
Definition: FileReaderDDU.h:11
unsigned long long * end
Definition: FileReaderDDU.h:14
tuple size
Write out results.