CMS 3D CMS Logo

FRDStreamSource.cc
Go to the documentation of this file.
1 #include <zlib.h>
2 #include <iostream>
3 
5 
8 
10 
14 
17 
18 
20  edm::InputSourceDescription const& desc)
21  : ProducerSourceFromFiles(pset,desc,true),
22  verifyAdler32_(pset.getUntrackedParameter<bool> ("verifyAdler32", true)),
23  verifyChecksum_(pset.getUntrackedParameter<bool> ("verifyChecksum", true)),
24  useL1EventID_(pset.getUntrackedParameter<bool> ("useL1EventID", false))
25 {
26  itFileName_=fileNames().begin();
28  produces<FEDRawDataCollection>();
29 }
30 
31 
33 {
34  if ( fin_.peek() == EOF ) {
35  if ( ++itFileName_==fileNames().end() ) {
36  fin_.close();
37  return false;
38  }
39  if ( ! openFile(*itFileName_) ) {
40  throw cms::Exception("FRDStreamSource::setRunAndEventInfo") <<
41  "could not open file " << *itFileName_;
42  }
43  }
44 
45  if ( detectedFRDversion_==0) {
46  fin_.read((char*)&detectedFRDversion_,sizeof(uint32_t));
50  *((uint32_t*)(&buffer_[0]))=detectedFRDversion_;
51  fin_.read(&buffer_[0] + sizeof(uint32_t),FRDHeaderVersionSize[detectedFRDversion_]-sizeof(uint32_t));
52  assert( fin_.gcount() == FRDHeaderVersionSize[detectedFRDversion_]-(unsigned int)(sizeof(uint32_t) ));
53  }
54  else {
57  fin_.read(&buffer_[0],FRDHeaderVersionSize[detectedFRDversion_]);
58  assert( fin_.gcount() == FRDHeaderVersionSize[detectedFRDversion_] );
59  }
60 
61  std::unique_ptr<FRDEventMsgView> frdEventMsg(new FRDEventMsgView(&buffer_[0]));
62  if (useL1EventID_)
63  id = edm::EventID(frdEventMsg->run(), frdEventMsg->lumi(), frdEventMsg->event());
64 
65  const uint32_t totalSize = frdEventMsg->size();
66  if ( totalSize > buffer_.size() ) {
67  buffer_.resize(totalSize);
68  }
69  if ( totalSize > FRDHeaderVersionSize[detectedFRDversion_] ) {
70  fin_.read(&buffer_[0]+FRDHeaderVersionSize[detectedFRDversion_],totalSize-FRDHeaderVersionSize[detectedFRDversion_]);
71  if ( fin_.gcount() != totalSize-FRDHeaderVersionSize[detectedFRDversion_] ) {
72  throw cms::Exception("FRDStreamSource::setRunAndEventInfo") <<
73  "premature end of file " << *itFileName_;
74  }
75  frdEventMsg.reset(new FRDEventMsgView(&buffer_[0]));
76  }
77 
78  if ( verifyChecksum_ && frdEventMsg->version() >= 5 )
79  {
80  uint32_t crc=0;
81  crc = crc32c(crc,(const unsigned char*)frdEventMsg->payload(),frdEventMsg->eventSize());
82  if ( crc != frdEventMsg->crc32c() ) {
83  throw cms::Exception("FRDStreamSource::getNextEvent") <<
84  "Found a wrong crc32c checksum: expected 0x" << std::hex << frdEventMsg->crc32c() <<
85  " but calculated 0x" << crc;
86  }
87  }
88  else if ( verifyAdler32_ && frdEventMsg->version() >= 3 )
89  {
90  uint32_t adler = adler32(0L,Z_NULL,0);
91  adler = adler32(adler,(Bytef*)frdEventMsg->payload(),frdEventMsg->eventSize());
92 
93  if ( adler != frdEventMsg->adler32() ) {
94  throw cms::Exception("FRDStreamSource::setRunAndEventInfo") <<
95  "Found a wrong Adler32 checksum: expected 0x" << std::hex << frdEventMsg->adler32() <<
96  " but calculated 0x" << adler;
97  }
98  }
99 
100  rawData_ = std::make_unique<FEDRawDataCollection>();
101 
102  uint32_t eventSize = frdEventMsg->eventSize();
103  char* event = (char*)frdEventMsg->payload();
104  bool foundTCDSFED=false;
105  bool foundGTPFED=false;
106 
107 
108  while (eventSize > 0) {
109  assert(eventSize>=sizeof(fedt_t));
110  eventSize -= sizeof(fedt_t);
111  const fedt_t* fedTrailer = (fedt_t*) (event + eventSize);
112  const uint32_t fedSize = FED_EVSZ_EXTRACT(fedTrailer->eventsize) << 3; //trailer length counts in 8 bytes
113  assert(eventSize>=fedSize - sizeof(fedt_t));
114  eventSize -= (fedSize - sizeof(fedt_t));
115  const fedh_t* fedHeader = (fedh_t *) (event + eventSize);
116  const uint16_t fedId = FED_SOID_EXTRACT(fedHeader->sourceid);
117  if (fedId>FEDNumbering::MAXFEDID)
118  {
119  throw cms::Exception("FedRawDataInputSource::fillFEDRawDataCollection") << "Out of range FED ID : " << fedId;
120  }
121  if (fedId == FEDNumbering::MINTCDSuTCAFEDID) {
122  foundTCDSFED=true;
123  tcds::Raw_v1 const* tcds = reinterpret_cast<tcds::Raw_v1 const*>(event + eventSize);
124  id = edm::EventID(frdEventMsg->run(),tcds->header.lumiSection,tcds->header.eventNumber);
126  theTime = static_cast<edm::TimeValue_t>(((uint64_t)tcds->bst.gpstimehigh << 32) | tcds->bst.gpstimelow);
127  }
128 
129  if (fedId == FEDNumbering::MINTriggerGTPFEDID && !foundTCDSFED) {
130  foundGTPFED=true;
131  const bool GTPEvmBoardSense=evf::evtn::evm_board_sense((unsigned char*) fedHeader,fedSize);
132  if (!useL1EventID_) {
133  if (GTPEvmBoardSense)
134  id = edm::EventID(frdEventMsg->run(), frdEventMsg->lumi(), evf::evtn::get((unsigned char*) fedHeader,true));
135  else
136  id = edm::EventID(frdEventMsg->run(), frdEventMsg->lumi(), evf::evtn::get((unsigned char*) fedHeader,false));
137  }
138  //evf::evtn::evm_board_setformat(fedSize);
139  const uint64_t gpsl = evf::evtn::getgpslow((unsigned char*) fedHeader);
140  const uint64_t gpsh = evf::evtn::getgpshigh((unsigned char*) fedHeader);
141  theTime = static_cast<edm::TimeValue_t>((gpsh << 32) + gpsl);
142  }
143 
144 
145 
146  //take event ID from GTPE FED
147  if (fedId == FEDNumbering::MINTriggerEGTPFEDID && !foundGTPFED && !foundTCDSFED && !useL1EventID_) {
148  if (evf::evtn::gtpe_board_sense((unsigned char*)fedHeader)) {
149  id = edm::EventID(frdEventMsg->run(), frdEventMsg->lumi(), evf::evtn::gtpe_get((unsigned char*) fedHeader));
150  }
151  }
152  FEDRawData& fedData = rawData_->FEDData(fedId);
153  fedData.resize(fedSize);
154  memcpy(fedData.data(), event + eventSize, fedSize);
155  }
156  assert(eventSize == 0);
157 
158  return true;
159 }
160 
161 
163  e.put(std::move(rawData_));
164 }
165 
166 
168 {
169  std::cout << " open file.. " << fileName << std::endl;
170  fin_.close();
171  fin_.clear();
172  size_t pos = fileName.find(':');
173  if (pos!=std::string::npos) {
174  std::string prefix = fileName.substr(0,pos);
175  if (prefix!="file") return false;
176  pos++;
177  }
178  else pos=0;
179 
180  fin_.open(fileName.substr(pos).c_str(),std::ios::in|std::ios::binary);
181  return fin_.is_open();
182 }
183 
184 
186 // define this class as an input source //
189 
190 // Keep old naming from DAQ1
unsigned int detectedFRDversion_
unsigned int getgpshigh(const unsigned char *)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:127
std::ifstream fin_
#define FED_SOID_EXTRACT(a)
Definition: fed_header.h:53
bool gtpe_board_sense(const unsigned char *p)
std::unique_ptr< FEDRawDataCollection > rawData_
unsigned int get(const unsigned char *, bool)
const uint32_t lumiSection
Definition: TCDSRaw.h:46
void produce(edm::Event &e) override
const uint32 FRDHeaderVersionSize[6]
std::vector< char > buffer_
const bool useL1EventID_
unsigned int sourceid
Definition: fed_header.h:32
const uint64_t eventNumber
Definition: TCDSRaw.h:55
std::vector< std::string > const & fileNames() const
Definition: FromFiles.h:22
Definition: TCDSRaw.h:18
#define DEFINE_FWK_INPUT_SOURCE(type)
#define FED_EVSZ_EXTRACT(a)
Definition: fed_trailer.h:36
struct fedt_struct fedt_t
bool setRunAndEventInfo(edm::EventID &id, edm::TimeValue_t &theTime, edm::EventAuxiliary::ExperimentType &eType) override
const struct BST_v1 bst
Definition: TCDSRaw.h:121
bool openFile(const std::string &fileName)
unsigned long long TimeValue_t
Definition: Timestamp.h:28
std::vector< std::string >::const_iterator itFileName_
bool evm_board_sense(const unsigned char *p, size_t size)
#define FED_EVTY_EXTRACT(a)
Definition: fed_header.h:38
const bool verifyChecksum_
uint32_t crc32c(uint32_t crc, const unsigned char *buf, size_t len)
Definition: crc32c.cc:340
unsigned long long uint64_t
Definition: Time.h:15
const bool verifyAdler32_
unsigned int eventid
Definition: fed_header.h:33
const uint32_t gpstimelow
Definition: TCDSRaw.h:79
unsigned int eventsize
Definition: fed_trailer.h:33
const uint32_t gpstimehigh
Definition: TCDSRaw.h:80
unsigned int gtpe_get(const unsigned char *)
const struct Header_v1 header
Definition: TCDSRaw.h:119
unsigned int getgpslow(const unsigned char *)
def move(src, dest)
Definition: eostools.py:510
Definition: event.py:1
FRDStreamSource(edm::ParameterSet const &pset, edm::InputSourceDescription const &desc)