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