36 return fmt::format(
"{}_{}",
name, spec);
41 : mCTFCoder(
o2::ctf::CTFCoderBase::OpType::Decoder, doStag, ctfdictOpt), mDoStaggering(doStag), mGetDigits(getDigits)
46 mCTFCoder.setDictBinding(std::string(
"ctfdict_") +
ID.
getName());
52 mCTFCoder.template init<CTF>(ic);
53 mMaskNoise = ic.
options().
get<
bool>(
"mask-noise");
54 mUseClusterDictionary = !ic.
options().
get<
bool>(
"ignore-cluster-dictionary");
63 auto cput = mTimer.CpuTime();
66 size_t ndigcl = 0, nrofs = 0;
67 updateTimeDependentParams(pc);
68 std::string nm =
ID.getName();
70 for (uint32_t iLayer = 0; iLayer < nLayers; iLayer++) {
71 auto buff = pc.
inputs().
get<gsl::span<o2::ctf::BufferType>>(getBinding(nm +
"CTF", iLayer));
75 if (ctf.getHeader().maxStreams != nLayers) {
76 LOGP(fatal,
"Number of streams {} in the CTF header is not equal to NLayers {} from AlpideParam in {}staggered mode",
77 ctf.getHeader().maxStreams, nLayers, mDoStaggering ?
"" :
"non-");
81 auto& rofs = pc.
outputs().
make<std::vector<o2::itsmft::ROFRecord>>(
OutputRef{nm +
"ROframes", iLayer});
85 iosize += mCTFCoder.decode(ctf, rofs,
digits, mNoiseMap, mPattIdConverter);
90 auto& compcl = pc.
outputs().
make<std::vector<o2::itsmft::CompClusterExt>>(
OutputRef{nm +
"compClusters", iLayer});
91 auto& patterns = pc.
outputs().
make<std::vector<unsigned char>>(
OutputRef{nm +
"patterns", iLayer});
93 iosize += mCTFCoder.decode(ctf, rofs, compcl, patterns, mNoiseMap, mPattIdConverter);
95 ndigcl += compcl.size();
100 LOGP(info,
"Decoded {} {} in {} ROFs of {} streams ({}) in {}staggerd mode in {} s", ndigcl, mGetDigits ?
"digits" :
"clusters",
101 nrofs, nLayers, iosize.
asString(), mDoStaggering ?
"" :
"non-", mTimer.CpuTime() - cput);
107 LOGP(info,
"{} Entropy Decoding total timing: Cpu: {:.3e} Real: {:.3e} s in {} slots",
108 Origin.as<std::string>(), mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
114 std::string nm =
ID.getName();
119 if (mGetDigits || mMaskNoise) {
124 mCTFCoder.updateTimeDependentParams(pc,
true);
132 LOG(info) << Origin.as<std::string>() <<
" noise map updated";
136 LOG(info) << Origin.as<std::string>() <<
" cluster dictionary updated" << (!mUseClusterDictionary ?
" but its using is disabled" :
"");
141 LOG(info) <<
"Alpide param updated";
144 if (mCTFCoder.template finaliseCCDB<CTF>(matcher, obj)) {
156 std::vector<InputSpec> inputs;
157 std::vector<OutputSpec> outputs;
161 std::string nm =
ID.getName();
162 for (uint32_t iLayer = 0; iLayer < nLayers; ++iLayer) {
164 outputs.emplace_back(
OutputSpec{{nm +
"Digits"}, Origin,
"DIGITS", iLayer, Lifetime::Timeframe});
165 outputs.emplace_back(
OutputSpec{{nm +
"ROframes"}, Origin,
"DIGITSROF", iLayer, Lifetime::Timeframe});
167 outputs.emplace_back(
OutputSpec{{nm +
"compClusters"}, Origin,
"COMPCLUSTERS", iLayer, Lifetime::Timeframe});
168 outputs.emplace_back(
OutputSpec{{nm +
"ROframes"}, Origin,
"CLUSTERSROF", iLayer, Lifetime::Timeframe});
169 outputs.emplace_back(
OutputSpec{{nm +
"patterns"}, Origin,
"PATTERNS", iLayer, Lifetime::Timeframe});
173 outputs.emplace_back(
OutputSpec{{nm +
"ctfrep"}, Origin,
"CTFDECREP", 0, Lifetime::Timeframe});
175 inputs.emplace_back(nm +
"alppar", Origin,
"ALPIDEPARAM", 0, Lifetime::Condition,
ccdbParamSpec(fmt::format(
"{}/Config/AlpideParam", Origin.as<std::string>())));
176 inputs.emplace_back(nm +
"noise", Origin,
"NOISEMAP", 0, Lifetime::Condition,
ccdbParamSpec(fmt::format(
"{}/Calib/NoiseMap", Origin.as<std::string>())));
177 inputs.emplace_back(nm +
"cldict", Origin,
"CLUSDICT", 0, Lifetime::Condition,
ccdbParamSpec(fmt::format(
"{}/Calib/ClusterDictionary", Origin.as<std::string>())));
178 if (ctfdictOpt.empty() || ctfdictOpt ==
"ccdb") {
179 inputs.emplace_back(std::string{
"ctfdict_"} +
ID.getName(), Origin,
"CTFDICT", 0, Lifetime::Condition,
ccdbParamSpec(fmt::format(
"{}/Calib/CTFDictionaryTree", Origin.as<std::string>())));
181 inputs.emplace_back(
"trigoffset",
"CTP",
"Trig_Offset", 0, Lifetime::Condition,
ccdbParamSpec(
"CTP/Config/TriggerOffsets"));
188 Options{{
"mask-noise", VariantType::Bool,
false, {
"apply noise mask to digits or clusters (involves reclusterization)"}},
189 {
"ignore-cluster-dictionary", VariantType::Bool,
false, {
"do not use cluster dictionary, always store explicit patterns"}},
190 {
"ans-version", VariantType::String, {
"version of ans entropy coder implementation to use"}}}};
195 return getEntropyDecoderSpec<o2::detectors::DetID::ITS>(
verbosity, doStag, getDigits, sspec, ctfdictOpt);
200 return getEntropyDecoderSpec<o2::detectors::DetID::MFT>(
verbosity, doStag, getDigits, sspec, ctfdictOpt);
Definition of the ITS/MFT clusterer settings.
Definition of the ITSMFT compact cluster.
Definition of the Names Generator class.
Convert CTF (EncodedBlocks) to clusters streams.
Definition Physics trigger record extracted from the ITS/MFT stream.
static auto getImage(const void *newHead)
get const image of the container wrapper, with pointers in the image relocated to new head
Static class with identifiers, bitmasks and names for ALICE detectors.
static constexpr const char * getName(ID id)
names of defined detectors
T get(const char *key) const
void snapshot(const Output &spec, T const &object)
decltype(auto) make(const Output &spec, Args... args)
ConfigParamRegistry const & options()
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.
InputRecord & inputs()
The inputs associated with this processing context.
ServiceRegistryRef services()
The services registry associated with this processing context.
void endOfStream(o2::framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
static constexpr o2::detectors::DetID ID
static std::string getBinding(const std::string &name, int spec)
void init(o2::framework::InitContext &ic) final
void run(o2::framework::ProcessingContext &pc) final
EntropyDecoderSpec(int verbosity, bool doStag, bool getDigits=false, const std::string &ctfdictOpt="none")
void finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj) final
NoiseMap class for the ITS and MFT.
GLuint const GLchar * name
constexpr o2::header::DataOrigin gDataOriginMFT
constexpr o2::header::DataOrigin gDataOriginITS
Defining ITS Vertex explicitly as messageable.
std::vector< ConfigParamSpec > ccdbParamSpec(std::string const &path, int runDependent, std::vector< CCDBMetadata > metadata={}, int qrate=0)
std::vector< ConfigParamSpec > Options
framework::DataProcessorSpec getMFTEntropyDecoderSpec(int verbosity, bool doStag, bool getDigits, unsigned int sspec, const std::string &ctfdictOpt)
DataProcessorSpec getEntropyDecoderSpec(int verbosity, bool doStag, bool getDigits, unsigned int sspec, const std::string &ctfdictOpt)
framework::DataProcessorSpec getITSEntropyDecoderSpec(int verbosity, bool doStag, bool getDigits, unsigned int sspec, const std::string &ctfdictOpt)
create a processor spec
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::string asString() const
bool globalRunNumberChanged
static constexpr int getNLayers()
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< Digit > digits