1 #ifndef IOPool_Streamer_RawEventOutputModuleForBU_h
2 #define IOPool_Streamer_RawEventOutputModuleForBU_h
21 #include "boost/shared_array.hpp"
24 template <
class Consumer>
63 template <
class Consumer>
66 edm::one::OutputModule<
edm::one::WatchRuns,
edm::one::WatchLuminosityBlocks>(ps),
67 templateConsumer_(new Consumer(ps)),
68 label_(ps.getUntrackedParameter<
std::
string>(
"ProductLabel",
"source")),
69 instance_(ps.getUntrackedParameter<
std::
string>(
"ProductInstance",
"")),
71 numEventsPerFile_(ps.getUntrackedParameter<unsigned
int>(
"numEventsPerFile", 100)),
72 frdVersion_(ps.getUntrackedParameter<unsigned
int>(
"frdVersion", 3)),
80 template <
class Consumer>
83 template <
class Consumer>
85 unsigned int ls =
e.luminosityBlock();
86 if (totevents > 0 && totevents % numEventsPerFile_ == 0) {
90 templateConsumer_->initialize(destinationDir,
filename,
ls);
96 e.getByToken(token_, fedBuffers);
100 int expectedSize = headerSize;
105 expectedSize += singleFED.
size();
108 totsize += expectedSize;
110 boost::shared_array<unsigned char> workBuffer(
new unsigned char[expectedSize + 256]);
112 *bufPtr++ = (
uint32)frdVersion_;
113 *bufPtr++ = (
uint32)
e.id().run();
114 *bufPtr++ = (
uint32)
e.luminosityBlock();
115 *bufPtr++ = (
uint32)
e.id().event();
116 if (frdVersion_ == 4)
119 if (frdVersion_ < 3) {
123 fedsize[
idx] = singleFED.
size();
126 memcpy(bufPtr, fedsize, 1024 *
sizeof(
uint32));
129 *bufPtr++ = expectedSize - headerSize;
131 if (frdVersion_ <= 4)
134 uint32* payloadPtr = bufPtr;
137 if (singleFED.
size() > 0) {
138 memcpy(bufPtr, singleFED.
data(), singleFED.
size());
139 bufPtr += singleFED.
size() / 4;
142 if (frdVersion_ > 4) {
145 *(payloadPtr - 1) =
crc32c(crc, (
const unsigned char*)payloadPtr, expectedSize - headerSize);
146 }
else if (frdVersion_ >= 3) {
150 cms::Adler32((
const char*)payloadPtr, expectedSize - headerSize, adlera, adlerb);
151 *(payloadPtr - 1) = (adlerb << 16) | adlera;
156 writtensize +=
msg.size();
158 if (templateConsumer_->sharedMode())
159 templateConsumer_->doOutputEvent(workBuffer);
161 templateConsumer_->doOutputEvent(
msg);
164 template <
class Consumer>
167 templateConsumer_->start();
170 template <
class Consumer>
172 templateConsumer_->stop();
175 template <
class Consumer>
180 std::cout <<
" writing to destination dir " << destinationDir <<
" name: " <<
filename << std::endl;
181 templateConsumer_->initialize(destinationDir,
filename,
ls.id().luminosityBlock());
185 ::gettimeofday(&
now,
nullptr);
191 writtenSizeLast = writtensize;
192 ::gettimeofday(&startOfLastLumi,
nullptr);
195 ::gettimeofday(&startOfLastLumi,
nullptr);
200 template <
class Consumer>
203 templateConsumer_->endOfLS(
ls.id().luminosityBlock());