CMS 3D CMS Logo

FRDStreamSource.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <memory>
3 #include <zlib.h>
4 
7 
12 
14 
16 
19 
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  itFileName_ = fileNames(0).begin();
27  produces<FEDRawDataCollection>();
28 }
29 
31  edm::TimeValue_t& theTime,
33  if (fin_.peek() == EOF) {
34  if (++itFileName_ == fileNames(0).end()) {
35  fin_.close();
36  return false;
37  }
38  if (!openFile(*itFileName_)) {
39  throw cms::Exception("FRDStreamSource::setRunAndEventInfo") << "could not open file " << *itFileName_;
40  }
41  }
42  //look for FRD header at beginning of the file and skip it
43  if (fin_.tellg() == 0) {
44  constexpr size_t buf_sz = sizeof(FRDFileHeader_v1); //try to read v1 FRD header size
45  FRDFileHeader_v1 fileHead;
46  fin_.read((char*)&fileHead, buf_sz);
47 
48  if (fin_.gcount() == 0)
49  throw cms::Exception("FRDStreamSource::setRunAndEventInfo")
50  << "Unable to read file or empty file" << *itFileName_;
51  else if (fin_.gcount() < (ssize_t)buf_sz)
52  fin_.seekg(0);
53  else {
54  uint16_t frd_version = getFRDFileHeaderVersion(fileHead.id_, fileHead.version_);
55  if (frd_version >= 1) {
56  if (fileHead.headerSize_ < buf_sz)
57  throw cms::Exception("FRDStreamSource::setRunAndEventInfo")
58  << "Invalid FRD file header (size mismatch) in file " << *itFileName_;
59  else if (fileHead.headerSize_ > buf_sz)
60  fin_.seekg(fileHead.headerSize_, fin_.beg);
61  } else
62  fin_.seekg(0, fin_.beg);
63  }
64  }
65 
66  if (detectedFRDversion_ == 0) {
67  fin_.read((char*)&detectedFRDversion_, sizeof(uint16_t));
68  fin_.read((char*)&flags_, sizeof(uint16_t));
72  *((uint32_t*)(&buffer_[0])) = detectedFRDversion_;
73  fin_.read(&buffer_[0] + sizeof(uint32_t), FRDHeaderVersionSize[detectedFRDversion_] - sizeof(uint32_t));
74  assert(fin_.gcount() == FRDHeaderVersionSize[detectedFRDversion_] - (unsigned int)(sizeof(uint32_t)));
75  } else {
80  }
81 
82  std::unique_ptr<FRDEventMsgView> frdEventMsg(new FRDEventMsgView(&buffer_[0]));
83  if (useL1EventID_)
84  id = edm::EventID(frdEventMsg->run(), frdEventMsg->lumi(), frdEventMsg->event());
85 
86  const uint32_t totalSize = frdEventMsg->size();
87  if (totalSize > buffer_.size()) {
88  buffer_.resize(totalSize);
89  }
90  if (totalSize > FRDHeaderVersionSize[detectedFRDversion_]) {
93  if (fin_.gcount() != totalSize - FRDHeaderVersionSize[detectedFRDversion_]) {
94  throw cms::Exception("FRDStreamSource::setRunAndEventInfo") << "premature end of file " << *itFileName_;
95  }
96  frdEventMsg = std::make_unique<FRDEventMsgView>(&buffer_[0]);
97  }
98 
99  if (verifyChecksum_ && frdEventMsg->version() >= 5) {
100  uint32_t crc = 0;
101  crc = crc32c(crc, (const unsigned char*)frdEventMsg->payload(), frdEventMsg->eventSize());
102  if (crc != frdEventMsg->crc32c()) {
103  throw cms::Exception("FRDStreamSource::getNextEvent") << "Found a wrong crc32c checksum: expected 0x" << std::hex
104  << frdEventMsg->crc32c() << " but calculated 0x" << crc;
105  }
106  } else if (verifyAdler32_ && frdEventMsg->version() >= 3) {
107  uint32_t adler = adler32(0L, Z_NULL, 0);
108  adler = adler32(adler, (Bytef*)frdEventMsg->payload(), frdEventMsg->eventSize());
109 
110  if (adler != frdEventMsg->adler32()) {
111  throw cms::Exception("FRDStreamSource::setRunAndEventInfo")
112  << "Found a wrong Adler32 checksum: expected 0x" << std::hex << frdEventMsg->adler32() << " but calculated 0x"
113  << adler;
114  }
115  }
116 
117  rawData_ = std::make_unique<FEDRawDataCollection>();
118 
119  uint32_t eventSize = frdEventMsg->eventSize();
120  unsigned char* event = (unsigned char*)frdEventMsg->payload();
121  bool foundTCDSFED = false;
122  bool foundGTPFED = false;
123 
124  while (eventSize > 0) {
125  assert(eventSize >= FEDTrailer::length);
126  eventSize -= FEDTrailer::length;
127  const FEDTrailer fedTrailer(event + eventSize);
128  const uint32_t fedSize = fedTrailer.fragmentLength() << 3; //trailer length counts in 8 bytes
129  assert(eventSize >= fedSize - FEDHeader::length);
130  eventSize -= (fedSize - FEDHeader::length);
131  const FEDHeader fedHeader(event + eventSize);
132  const uint16_t fedId = fedHeader.sourceID();
134  throw cms::Exception("FedRawDataInputSource::fillFEDRawDataCollection") << "Out of range FED ID : " << fedId;
135  }
137  foundTCDSFED = true;
138  tcds::Raw_v1 const* tcds = reinterpret_cast<tcds::Raw_v1 const*>(event + eventSize + FEDHeader::length);
139  id = edm::EventID(frdEventMsg->run(), tcds->header.lumiSection, tcds->header.eventNumber);
140  eType = static_cast<edm::EventAuxiliary::ExperimentType>(fedHeader.triggerType());
141  theTime = static_cast<edm::TimeValue_t>(((uint64_t)tcds->bst.gpstimehigh << 32) | tcds->bst.gpstimelow);
142  }
143 
144  if (fedId == FEDNumbering::MINTriggerGTPFEDID && !foundTCDSFED) {
145  foundGTPFED = true;
146  const bool GTPEvmBoardSense = evf::evtn::evm_board_sense(event + eventSize, fedSize);
147  if (!useL1EventID_) {
148  if (GTPEvmBoardSense)
149  id = edm::EventID(frdEventMsg->run(), frdEventMsg->lumi(), evf::evtn::get(event + eventSize, true));
150  else
151  id = edm::EventID(frdEventMsg->run(), frdEventMsg->lumi(), evf::evtn::get(event + eventSize, false));
152  }
153  //evf::evtn::evm_board_setformat(fedSize);
154  const uint64_t gpsl = evf::evtn::getgpslow(event + eventSize);
155  const uint64_t gpsh = evf::evtn::getgpshigh(event + eventSize);
156  theTime = static_cast<edm::TimeValue_t>((gpsh << 32) + gpsl);
157  }
158 
159  //take event ID from GTPE FED
160  if (fedId == FEDNumbering::MINTriggerEGTPFEDID && !foundGTPFED && !foundTCDSFED && !useL1EventID_) {
161  if (evf::evtn::gtpe_board_sense(event + eventSize)) {
162  id = edm::EventID(frdEventMsg->run(), frdEventMsg->lumi(), evf::evtn::gtpe_get(event + eventSize));
163  }
164  }
165  FEDRawData& fedData = rawData_->FEDData(fedId);
166  fedData.resize(fedSize);
167  memcpy(fedData.data(), event + eventSize, fedSize);
168  }
169  assert(eventSize == 0);
170 
171  return true;
172 }
173 
175 
177  std::cout << " open file.. " << fileName << std::endl;
178  fin_.close();
179  fin_.clear();
180  size_t pos = fileName.find(':');
181  if (pos != std::string::npos) {
182  std::string prefix = fileName.substr(0, pos);
183  if (prefix != "file")
184  return false;
185  pos++;
186  } else
187  pos = 0;
188 
189  fin_.open(fileName.substr(pos).c_str(), std::ios::in | std::ios::binary);
190  return fin_.is_open();
191 }
192 
194 // define this class as an input source //
197 
198 // Keep old naming from DAQ1
FEDNumbering.h
dttmaxenums::L
Definition: DTTMax.h:29
electrons_cff.bool
bool
Definition: electrons_cff.py:366
getFRDFileHeaderVersion
uint16_t getFRDFileHeaderVersion(const std::array< uint8_t, 4 > &id, const std::array< uint8_t, 4 > &version)
Definition: FRDFileHeader.h:41
FEDNumbering::MINTriggerEGTPFEDID
Definition: FEDNumbering.h:63
funct::false
false
Definition: Factorize.h:29
FRDEventMsgView
Definition: FRDEventMessage.h:137
FRDStreamSource::fin_
std::ifstream fin_
Definition: FRDStreamSource.h:38
evf::evtn::gtpe_board_sense
bool gtpe_board_sense(const unsigned char *p)
Definition: GlobalEventNumber.cc:11
FRDStreamSource::FRDStreamSource
FRDStreamSource(edm::ParameterSet const &pset, edm::InputSourceDescription const &desc)
Definition: FRDStreamSource.cc:20
gather_cfg.cout
cout
Definition: gather_cfg.py:144
pos
Definition: PixelAliasList.h:18
FRDStreamSource::detectedFRDversion_
uint16_t detectedFRDversion_
Definition: FRDStreamSource.h:44
edm::InputSourceDescription
Definition: InputSourceDescription.h:20
cms::cuda::assert
assert(be >=bs)
FEDNumbering::MINTCDSuTCAFEDID
Definition: FEDNumbering.h:101
FRDStreamSource::useL1EventID_
const bool useL1EventID_
Definition: FRDStreamSource.h:43
evf::evtn::get
unsigned int get(const unsigned char *, bool)
Definition: GlobalEventNumber.cc:77
FRDEventMessage.h
FRDStreamSource::produce
void produce(edm::Event &e) override
Definition: FRDStreamSource.cc:174
FRDStreamSource::openFile
bool openFile(const std::string &fileName)
Definition: FRDStreamSource.cc:176
MillePedeFileConverter_cfg.fileName
fileName
Definition: MillePedeFileConverter_cfg.py:32
FRDStreamSource::setRunAndEventInfo
bool setRunAndEventInfo(edm::EventID &id, edm::TimeValue_t &theTime, edm::EventAuxiliary::ExperimentType &eType) override
Definition: FRDStreamSource.cc:30
evf::evtn::getgpslow
unsigned int getgpslow(const unsigned char *)
Definition: GlobalEventNumber.cc:92
FRDHeaderVersionSize
constexpr std::array< uint32, FRDHeaderMaxVersion+1 > FRDHeaderVersionSize
Definition: FRDEventMessage.h:129
FRDStreamSource::itFileName_
std::vector< std::string >::const_iterator itFileName_
Definition: FRDStreamSource.h:37
FEDRawData::data
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:24
FEDRawData
Definition: FEDRawData.h:19
FRDStreamSource::verifyChecksum_
const bool verifyChecksum_
Definition: FRDStreamSource.h:42
FRDFileHeader.h
DEFINE_FWK_INPUT_SOURCE
#define DEFINE_FWK_INPUT_SOURCE(type)
Definition: InputSourceMacros.h:8
FRDHeaderMaxVersion
constexpr size_t FRDHeaderMaxVersion
Definition: FRDEventMessage.h:128
TCDSRaw.h
tcds::Raw_v1
Definition: TCDSRaw.h:106
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
crc32c
uint32_t crc32c(uint32_t crc, const unsigned char *buf, size_t len)
Definition: crc32c.cc:340
FRDStreamSource
Definition: FRDStreamSource.h:20
funct::true
true
Definition: Factorize.h:173
FRDStreamSource::flags_
uint16_t flags_
Definition: FRDStreamSource.h:45
edm::ParameterSet
Definition: ParameterSet.h:47
FEDTrailer
Definition: FEDTrailer.h:14
FRDStreamSource::verifyAdler32_
const bool verifyAdler32_
Definition: FRDStreamSource.h:41
FEDHeader::triggerType
uint8_t triggerType() const
Event Trigger type identifier.
Definition: FEDHeader.cc:13
recoMuon::in
Definition: RecoMuonEnumerators.h:6
createfilelist.int
int
Definition: createfilelist.py:10
FEDRawDataCollection.h
crc32c.h
FEDHeader::length
static const uint32_t length
Definition: FEDHeader.h:54
edm::FromFiles::fileNames
std::vector< std::string > fileNames(unsigned iCatalog) const
Definition: FromFiles.h:22
l1tstage2_dqm_sourceclient-live_cfg.fedId
fedId
Definition: l1tstage2_dqm_sourceclient-live_cfg.py:88
tcds
Definition: TCDSRaw.h:16
evf::evtn::evm_board_sense
bool evm_board_sense(const unsigned char *p, size_t size)
Definition: GlobalEventNumber.cc:15
FRDFileHeader_v1
Definition: FRDFileHeader.h:22
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
eostools.move
def move(src, dest)
Definition: eostools.py:511
FEDTrailer::length
static const uint32_t length
Definition: FEDTrailer.h:57
edm::EventAuxiliary::ExperimentType
ExperimentType
Definition: EventAuxiliary.h:18
GlobalEventNumber.h
Exception
Definition: hltDiff.cc:245
FEDRawData::resize
void resize(size_t newsize)
Definition: FEDRawData.cc:28
FEDHeader::sourceID
uint16_t sourceID() const
Identifier of the FED.
Definition: FEDHeader.cc:19
cond::uint64_t
unsigned long long uint64_t
Definition: Time.h:13
cms::Exception
Definition: Exception.h:70
FRDStreamSource::buffer_
std::vector< char > buffer_
Definition: FRDStreamSource.h:40
evf::evtn::gtpe_get
unsigned int gtpe_get(const unsigned char *)
Definition: GlobalEventNumber.cc:83
event
Definition: event.py:1
edm::EventID
Definition: EventID.h:31
FEDHeader
Definition: FEDHeader.h:14
edm::Event
Definition: Event.h:73
FEDHeader.h
FRDStreamSource.h
hcallasereventfilter2012_cfi.prefix
prefix
Definition: hcallasereventfilter2012_cfi.py:10
evf::evtn::getgpshigh
unsigned int getgpshigh(const unsigned char *)
Definition: GlobalEventNumber.cc:95
edm::TimeValue_t
unsigned long long TimeValue_t
Definition: Timestamp.h:28
muonDTDigis_cfi.pset
pset
Definition: muonDTDigis_cfi.py:27
FRDStreamSource::rawData_
std::unique_ptr< FEDRawDataCollection > rawData_
Definition: FRDStreamSource.h:39
FEDNumbering::MAXFEDID
Definition: FEDNumbering.h:26
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37
FEDTrailer::fragmentLength
uint32_t fragmentLength() const
The length of the event fragment counted in 64-bit words including header and trailer.
Definition: FEDTrailer.cc:13
FEDNumbering::MINTriggerGTPFEDID
Definition: FEDNumbering.h:61
FEDTrailer.h