CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
FRDStreamSource.cc
Go to the documentation of this file.
1 #include <zlib.h>
2 
4 
7 
11 
13 
14 
16  edm::InputSourceDescription const& desc)
17  : ProducerSourceFromFiles(pset,desc,true),
18  verifyAdler32_(pset.getUntrackedParameter<bool> ("verifyAdler32", true))
19 {
20  itFileName_=fileNames().begin();
22  produces<FEDRawDataCollection>();
23 }
24 
25 
27 {
28  if ( fin_.peek() == EOF ) {
29  if ( ++itFileName_==fileNames().end() ) {
30  fin_.close();
31  return false;
32  }
33  if ( ! openFile(*itFileName_) ) {
34  throw cms::Exception("FRDStreamSource::setRunAndEventInfo") <<
35  "could not open file " << *itFileName_;
36  }
37  }
38 
39  const uint32_t headerSize[4]={0,2*sizeof(uint32),(4+1024)*sizeof(uint32_t),7*sizeof(uint32_t)};//FRD header size per version
40  if ( detectedFRDversion_==0) {
41  fin_.read((char*)&detectedFRDversion_,sizeof(uint32_t));
43  if ( buffer_.size() < headerSize[detectedFRDversion_] )
44  buffer_.resize(headerSize[detectedFRDversion_]);
45  *((uint32_t*)(&buffer_[0]))=detectedFRDversion_;
46  fin_.read(&buffer_[0] + sizeof(uint32_t),headerSize[detectedFRDversion_]-sizeof(uint32_t));
47  assert( fin_.gcount() == headerSize[detectedFRDversion_]-(unsigned int)(sizeof(uint32_t) ));
48  }
49  else {
50  if ( buffer_.size() < headerSize[detectedFRDversion_] )
51  buffer_.resize(headerSize[detectedFRDversion_]);
52  fin_.read(&buffer_[0],headerSize[detectedFRDversion_]);
53  assert( fin_.gcount() == headerSize[detectedFRDversion_] );
54  }
55 
56  std::unique_ptr<FRDEventMsgView> frdEventMsg(new FRDEventMsgView(&buffer_[0]));
57  id = edm::EventID(frdEventMsg->run(), frdEventMsg->lumi(), frdEventMsg->event());
58 
59  const uint32_t totalSize = frdEventMsg->size();
60  if ( totalSize > buffer_.size() ) {
61  buffer_.resize(totalSize);
62  }
63  if ( totalSize > headerSize[detectedFRDversion_] ) {
64  fin_.read(&buffer_[0]+headerSize[detectedFRDversion_],totalSize-headerSize[detectedFRDversion_]);
65  if ( fin_.gcount() != totalSize-headerSize[detectedFRDversion_] ) {
66  throw cms::Exception("FRDStreamSource::setRunAndEventInfo") <<
67  "premature end of file " << *itFileName_;
68  }
69  frdEventMsg.reset(new FRDEventMsgView(&buffer_[0]));
70  }
71 
72  if ( verifyAdler32_ && frdEventMsg->version() >= 3 )
73  {
74  uint32_t adler = adler32(0L,Z_NULL,0);
75  adler = adler32(adler,(Bytef*)frdEventMsg->payload(),frdEventMsg->eventSize());
76 
77  if ( adler != frdEventMsg->adler32() ) {
78  throw cms::Exception("FRDStreamSource::setRunAndEventInfo") <<
79  "Found a wrong Adler32 checksum: expected 0x" << std::hex << frdEventMsg->adler32() <<
80  " but calculated 0x" << adler;
81  }
82  }
83 
84  rawData_.reset(new FEDRawDataCollection());
85 
86  uint32_t eventSize = frdEventMsg->eventSize();
87  char* event = (char*)frdEventMsg->payload();
88 
89  while (eventSize > 0) {
90  eventSize -= sizeof(fedt_t);
91  const fedt_t* fedTrailer = (fedt_t*) (event + eventSize);
92  const uint32_t fedSize = FED_EVSZ_EXTRACT(fedTrailer->eventsize) << 3; //trailer length counts in 8 bytes
93  eventSize -= (fedSize - sizeof(fedh_t));
94  const fedh_t* fedHeader = (fedh_t *) (event + eventSize);
95  const uint16_t fedId = FED_SOID_EXTRACT(fedHeader->sourceid);
96  if (fedId == FEDNumbering::MINTriggerGTPFEDID) {
98  const uint64_t gpsl = evf::evtn::getgpslow((unsigned char*) fedHeader);
99  const uint64_t gpsh = evf::evtn::getgpshigh((unsigned char*) fedHeader);
100  theTime = static_cast<edm::TimeValue_t>((gpsh << 32) + gpsl);
101  }
102  FEDRawData& fedData = rawData_->FEDData(fedId);
103  fedData.resize(fedSize);
104  memcpy(fedData.data(), event + eventSize, fedSize);
105  }
106  assert(eventSize == 0);
107 
108  return true;
109 }
110 
111 
113  e.put(rawData_);
114 }
115 
116 
118 {
119  std::cout << " open file.. " << fileName << std::endl;
120  fin_.close();
121  fin_.clear();
122  size_t pos = fileName.find(':');
123  if (pos!=std::string::npos) {
124  std::string prefix = fileName.substr(0,pos);
125  if (prefix!="file") return false;
126  pos++;
127  }
128  else pos=0;
129 
130  fin_.open(fileName.substr(pos).c_str(),std::ios::in|std::ios::binary);
131  return fin_.is_open();
132 }
133 
134 
136 // define this class as an input source //
139 
140 // Keep old naming from DAQ1
unsigned int detectedFRDversion_
unsigned int getgpshigh(const unsigned char *)
std::ifstream fin_
struct fedh_struct fedh_t
std::vector< char > buffer_
virtual void produce(edm::Event &e)
std::auto_ptr< FEDRawDataCollection > rawData_
unsigned int sourceid
Definition: fed_header.h:32
std::vector< std::string > const & fileNames() const
Definition: FromFiles.h:22
void evm_board_setformat(size_t size)
#define DEFINE_FWK_INPUT_SOURCE(type)
void resize(size_t newsize)
Definition: FEDRawData.cc:32
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:116
struct fedt_struct fedt_t
#define FED_EVSZ_EXTRACT(a)
Definition: fed_trailer.h:36
bool openFile(const std::string &fileName)
unsigned long long TimeValue_t
Definition: Timestamp.h:28
std::vector< std::string >::const_iterator itFileName_
unsigned int uint32
Definition: MsgTools.h:13
unsigned long long uint64_t
Definition: Time.h:15
const bool verifyAdler32_
unsigned int eventsize
Definition: fed_trailer.h:33
EventNumber_t event() const
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:28
tuple cout
Definition: gather_cfg.py:121
unsigned int getgpslow(const unsigned char *)
#define FED_SOID_EXTRACT(a)
Definition: fed_header.h:53
virtual bool setRunAndEventInfo(edm::EventID &id, edm::TimeValue_t &theTime)
FRDStreamSource(edm::ParameterSet const &pset, edm::InputSourceDescription const &desc)