Project
Loading...
Searching...
No Matches
WriteRawFileSpec.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
18
20
21#include <random>
22#include <iostream>
23#include <fstream>
24#include <stdexcept>
25#include <array>
26#include <functional>
27#include <vector>
28#include <algorithm>
29
34#include "Framework/Lifetime.h"
35#include "Framework/Output.h"
36#include "Framework/Task.h"
38#include "Framework/Logger.h"
41
45
47
50#include "HMPIDBase/Geo.h"
52
53namespace o2
54{
55namespace hmpid
56{
57
58using namespace o2;
59using namespace o2::header;
60using namespace o2::framework;
62
63//=======================
64// Data decoder
66{
67 LOG(info) << "[HMPID Write Raw File From Digits vector - init()]";
68 mBaseFileName = ic.options().get<std::string>("out-file");
69 mSkipEmpty = ic.options().get<bool>("skip-empty");
70 mFixedPacketLenght = ic.options().get<bool>("fixed-lenght");
71 mOrderTheEvents = ic.options().get<bool>("order-events");
72 mDigitsReceived = 0;
73 mFramesReceived = 0;
74
76 mCod->setSkipEmptyEvents(mSkipEmpty);
77 mCod->openOutputStream(mBaseFileName.c_str(), "all");
78
79 mExTimer.start();
80 return;
81}
82
84{
85 std::vector<o2::hmpid::Trigger> triggers;
86 std::vector<o2::hmpid::Digit> digits;
87
88 for (auto const& ref : InputRecordWalker(pc.inputs())) {
89 if (DataRefUtils::match(ref, {"check", ConcreteDataTypeMatcher{gDataOriginHMP, "INTRECORDS"}})) {
90 triggers = pc.inputs().get<std::vector<o2::hmpid::Trigger>>(ref);
91 }
93 digits = pc.inputs().get<std::vector<o2::hmpid::Digit>>(ref);
94 LOG(debug) << "The size of the vector =" << digits.size();
95 }
96 }
97
98 for (int i = 0; i < triggers.size(); i++) {
99 if (mOrderTheEvents) {
100 int first = mDigits.size();
101 mDigits.insert(mDigits.end(), digits.begin() + triggers[i].getFirstEntry(), digits.begin() + triggers[i].getLastEntry());
102 mEvents.push_back({triggers[i].getIr(), first, int(mDigits.size() - first)});
103 } else {
104 std::vector<o2::hmpid::Digit> dig = {digits.begin() + triggers[i].getFirstEntry(), digits.begin() + triggers[i].getLastEntry()};
105 mCod->codeEventChunkDigits(dig, triggers[i].getIr());
106 }
107 }
108 mDigitsReceived += digits.size();
109 mFramesReceived++;
110 LOG(debug) << "run() Digits received =" << mDigitsReceived << " frames = " << mFramesReceived;
111
112 mExTimer.elapseMes("Write raw file ... Digits received = " + std::to_string(mDigitsReceived) + " Frames received = " + std::to_string(mFramesReceived));
113 return;
114}
115
117{
118 std::vector<o2::hmpid::Digit> dig;
119
120 mExTimer.logMes("Received an End Of Stream !");
121 if (mOrderTheEvents && mEvents.size() > 0) {
122 sort(mEvents.begin(), mEvents.end());
123 uint32_t orbit = mEvents[0].getOrbit();
124 uint16_t bc = mEvents[0].getBc();
125 for (int idx = 0; idx < mEvents.size(); idx++) {
126 if (mSkipEmpty && (mEvents[idx].getNumberOfObjects() == 0 || mEvents[idx].getOrbit() == 0)) {
127 continue;
128 }
129 if (mEvents[idx].getOrbit() != orbit || mEvents[idx].getBc() != bc) {
131 LOG(info) << " Event :" << idx << " orbit=" << orbit << " bc=" << bc << " Digits:" << dig.size();
132 dig.clear();
133 orbit = mEvents[idx].getOrbit();
134 bc = mEvents[idx].getBc();
135 }
136 for (int i = mEvents[idx].getFirstEntry(); i <= mEvents[idx].getLastEntry(); i++) {
137 dig.push_back(mDigits[i]);
138 }
139 }
141 LOG(info) << " Event :" << mEvents.size() - 1 << " orbit=" << orbit << " bc=" << bc << " Digits:" << dig.size();
142 }
143 mCod->closeOutputStream();
144 mCod->dumpResults("all");
145
146 mExTimer.logMes("Raw File created ! Digits received = " + std::to_string(mDigitsReceived) + " Frame received =" + std::to_string(mFramesReceived));
147 mExTimer.stop();
148 return;
149}
150
151//_________________________________________________________________________________________________
153{
154 std::vector<o2::framework::InputSpec> inputs;
155 inputs.emplace_back("digits", o2::header::gDataOriginHMP, "DIGITS", 0, Lifetime::Timeframe);
156 inputs.emplace_back("intrecord", o2::header::gDataOriginHMP, "INTRECORDS", 0, Lifetime::Timeframe);
157
158 std::vector<o2::framework::OutputSpec> outputs;
159
160 return DataProcessorSpec{
161 "HMP-WriteRawFile",
162 inputs,
163 outputs,
164 AlgorithmSpec{adaptFromTask<WriteRawFileTask>()},
165 Options{{"out-file", VariantType::String, "hmpidRaw", {"name of the output file"}},
166 {"order-events", VariantType::Bool, false, {"order the events time"}},
167 {"skip-empty", VariantType::Bool, false, {"skip empty events"}},
168 {"fixed-lenght", VariantType::Bool, false, {"fixed lenght packets = 8K bytes"}}}};
169}
170
171} // namespace hmpid
172} // end namespace o2
A raw page parser for DPL input.
uint64_t orbit
Definition RawEventData.h:6
uint32_t getOrbit() const
uint64_t bc
Definition RawEventData.h:5
int32_t i
A helper class to iteratate over all parts of all input routes.
Definition of the RAW Data Header.
std::ostringstream debug
ConfigParamRegistry const & options()
Definition InitContext.h:33
A helper class to iteratate over all parts of all input routes.
decltype(auto) get(R binding, int part=0) const
InputRecord & inputs()
The inputs associated with this processing context.
void stop()
stop : stops the timer
Definition Common.h:73
void elapseMes(std::string const message)
Definition Common.h:91
void start()
start : starts the timer
Definition Common.h:64
void logMes(std::string const message)
Definition Common.h:81
static constexpr int MAXEQUIPMENTS
Definition Geo.h:79
void codeEventChunkDigits(std::vector< o2::hmpid::Digit > &digits, InteractionRecord ir)
void dumpResults(const std::string &outputFileName)
Dumps the results of the last coding.
void setSkipEmptyEvents(bool Skip)
void openOutputStream(const std::string &outputFileName, const std::string &fileFor)
void closeOutputStream()
Close and flush the output streams.
void endOfStream(framework::EndOfStreamContext &ec) override
This is invoked whenever we have an EndOfStream event.
void init(framework::InitContext &ic) final
void run(framework::ProcessingContext &pc) final
GLint ref
Definition glcorearb.h:291
constexpr o2::header::DataOrigin gDataOriginHMP
Definition DataHeader.h:569
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
std::vector< ConfigParamSpec > Options
O2 data header classes and API, v0.1.
Definition DetID.h:49
o2::framework::DataProcessorSpec getWriteRawFileSpec(std::string inputSpec="HMP/DIGITS")
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::string to_string(gsl::span< T, Size > span)
Definition common.h:52
static bool match(DataRef const &ref, const char *binding)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< Digit > digits