17#ifndef O2_TPCFLPIDCSPEC_H
18#define O2_TPCFLPIDCSPEC_H
22#include <fmt/format.h>
46 TPCFLPIDCDevice(
const int lane,
const std::vector<uint32_t>& crus,
const unsigned int rangeIDC,
const bool loadStatusMap,
const std::string idc0File,
const bool loadIDC0CCDB,
const bool enableSynchProc,
const int nTFsBuffer)
47 : mLane{lane}, mCRUs{crus}, mRangeIDC{rangeIDC}, mLoadPadMapCCDB{loadStatusMap}, mLoadIDC0CCDB{loadIDC0CCDB}, mEnableSynchProc{enableSynchProc}, mNTFsBuffer{nTFsBuffer}, mOneDIDCs{
std::vector<float>(rangeIDC),
std::vector<unsigned
int>(rangeIDC)}
49 const auto nSizeDeque = std::ceil(
static_cast<float>(mRangeIDC) / mMinIDCsPerTF);
50 for (
const auto& cru : mCRUs) {
51 mBuffer1DIDCs.emplace(cru, std::deque<std::pair<std::vector<float>, std::vector<unsigned int>>>(nSizeDeque, {std::vector<float>(mMinIDCsPerTF, 0), std::vector<unsigned int>(mMinIDCsPerTF, 1)}));
55 if (!idc0File.empty()) {
56 TFile
f(idc0File.data(),
"READ");
58 f.GetObject(
"IDC0", idcs);
60 LOGP(info,
"Setting IDC0 from file {}", idc0File);
64 }
else if (!mLoadIDC0CCDB) {
65 LOGP(info,
"setting standard IDC0 values");
72 mDumpIDCs = ic.options().get<
bool>(
"dump-idcs-flp");
80 if (mLoadPadMapCCDB) {
81 updateTimeDependentParams(pc);
85 LOGP(
debug,
"Loading IDC0 from CCDB as reference for calculating IDC1");
89 mLoadIDC0CCDB =
false;
94 auto const* tpcCRUHeader = o2::framework::DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
95 const int cru = tpcCRUHeader->subSpecification >> 7;
97 mIDCs[cru].insert(mIDCs[cru].
end(), vecIDCs.begin(), vecIDCs.end());
99 if (mEnableSynchProc) {
100 sendOutputSync(pc.outputs(), vecIDCs, cru);
105 if (mCountTFsForBuffer >= mNTFsBuffer) {
106 mCountTFsForBuffer = 0;
107 for (
const auto cru : mCRUs) {
109 sendOutput(pc.outputs(), cru);
116 auto const* tpcCRUHeader = o2::framework::DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
117 const int cru = tpcCRUHeader->subSpecification >> 7;
118 auto vec = pc.inputs().get<std::vector<float>>(
ref);
119 fOut.WriteObject(&
vec, fmt::format(
"CRU_{}", cru).data());
127 LOGP(
debug,
"Updating pad status from CCDB");
150 static void setMinIDCsPerTF(
const unsigned int nMinIDCsPerTF) { mMinIDCsPerTF = nMinIDCsPerTF; }
156 inline static unsigned int mMinIDCsPerTF{10};
158 const std::vector<uint32_t> mCRUs{};
159 const unsigned int mRangeIDC{};
160 const bool mLoadPadMapCCDB{};
161 bool mLoadIDC0CCDB{};
162 const bool mEnableSynchProc{};
165 int mCountTFsForBuffer{0};
166 std::pair<std::vector<float>, std::vector<unsigned int>> mOneDIDCs{};
167 std::unordered_map<unsigned int, o2::pmr::vector<float>> mIDCs{};
168 std::unordered_map<unsigned int, std::deque<std::pair<std::vector<float>, std::vector<unsigned int>>>> mBuffer1DIDCs{};
179 const CRU cruTmp(cru);
180 const int integrationIntervalOffset = 0;
181 const auto region = cruTmp.region();
184 const auto integrationIntervals = idc.size() / nIDCsPerIntegrationInterval;
185 std::vector<std::vector<float>> idcOneTmp(integrationIntervals);
186 for (
auto&
vec : idcOneTmp) {
187 vec.reserve(nIDCsPerIntegrationInterval);
189 IDCFactorization::calcIDCOne(idc, nIDCsPerIntegrationInterval, integrationIntervalOffset, indexOffset, cruTmp, idcOneTmp, &mIDCZero, mPadFlagsMap);
192 std::pair<std::vector<float>, std::vector<unsigned int>> idcOne;
193 idcOne.first.resize(integrationIntervals);
194 idcOne.second.resize(integrationIntervals);
195 for (
int i = 0;
i < integrationIntervals; ++
i) {
196 idcOne.first[
i] = std::accumulate(idcOneTmp[
i].
begin(), idcOneTmp[
i].
end(), 0);
197 idcOne.second[
i] = idcOneTmp[
i].size();
201 std::transform(idcOne.first.begin(), idcOne.first.end(), idcOne.first.begin(), [normVal =
Mapper::INVPADAREA[region]](
auto&
val) { return val * normVal; });
203 mBuffer1DIDCs[cru].emplace_back(std::move(idcOne));
204 mBuffer1DIDCs[cru].pop_front();
207 LOGP(
debug,
"Sending 1D-IDCs to EPNs of size {} and weights of size {}", mOneDIDCs.first.size(), mOneDIDCs.second.size());
218 void fill1DIDCs(
const uint32_t cru)
221 unsigned int i = mRangeIDC;
222 for (
int indexDeque = mBuffer1DIDCs[cru].
size() - 1; indexDeque >= 0; --indexDeque) {
223 for (
int indexIDCs = mBuffer1DIDCs[cru][indexDeque].
first.size() - 1; indexIDCs >= 0; --indexIDCs) {
224 mOneDIDCs.first[--
i] = mBuffer1DIDCs[cru][indexDeque].first[indexIDCs];
225 mOneDIDCs.second[
i] = mBuffer1DIDCs[cru][indexDeque].second[indexIDCs];
234DataProcessorSpec getTPCFLPIDCSpec(
const int ilane,
const std::vector<uint32_t>& crus,
const unsigned int rangeIDC,
const bool loadStatusMap,
const std::string idc0File,
const bool disableIDC0CCDB,
const bool enableSynchProc,
const int nTFsBuffer = 1)
236 std::vector<OutputSpec> outputSpecs;
237 std::vector<InputSpec> inputSpecs;
238 outputSpecs.reserve(crus.size());
239 inputSpecs.reserve(crus.size());
241 for (
const auto& cru : crus) {
247 if (enableSynchProc) {
255 LOGP(info,
"Using pad status map from CCDB");
259 const bool loadIDC0CCDB = !disableIDC0CCDB && idc0File.empty();
264 const auto id = fmt::format(
"tpc-flp-idc-{:02}", ilane);
269 AlgorithmSpec{adaptFromTask<TPCFLPIDCDevice>(ilane, crus, rangeIDC, loadStatusMap, idc0File, loadIDC0CCDB, enableSynchProc, nTFsBuffer)},
270 Options{{
"dump-idcs-flp", VariantType::Bool,
false, {
"Dump IDCs to file"}}}};
Simple interface to the CDB manager.
class for aggregating IDCs for the full TPC (all sectors) and factorization of aggregated IDCs
TPC integration of IDCs processor.
InputRecord & inputs()
The inputs associated with this processing context.
void calcIDCOne()
calculate I_1(t) = <I(r,\phi,t) / I_0(r,\phi)>_{r,\phi}
static constexpr unsigned int GLOBALPADOFFSET[NREGIONS]
offset of number of pads for region
static constexpr float INVPADAREA[NREGIONS]
inverse size of the pad area padwidth*padLength
static constexpr unsigned short getPadsInSector()
static constexpr int getNumberOfPadsPerSide()
static constexpr unsigned int PADSPERREGION[NREGIONS]
number of pads per CRU
void finaliseCCDB(ConcreteDataMatcher &matcher, void *obj) final
static constexpr header::DataDescription getDataDescriptionIDCGroupA()
return data description for IDC Group on A Side
static constexpr header::DataDescription getDataDescription1DIDCEPNWeights()
return data description for buffered weights for 1D IDCs for EPNs
static constexpr header::DataDescription getDataDescription1DIDCEPN()
return data description for buffered 1D IDCs for EPNs
void run(o2::framework::ProcessingContext &pc) final
static constexpr header::DataDescription getDataDescriptionIDCGroup(const Side side)
void endOfStream(o2::framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void init(o2::framework::InitContext &ic) final
static unsigned int getMinIDCsPerTF()
static void setMinIDCsPerTF(const unsigned int nMinIDCsPerTF)
static constexpr header::DataDescription getDataDescriptionIDCGroupC()
return data description for IDC Group on C Side
TPCFLPIDCDevice(const int lane, const std::vector< uint32_t > &crus, const unsigned int rangeIDC, const bool loadStatusMap, const std::string idc0File, const bool loadIDC0CCDB, const bool enableSynchProc, const int nTFsBuffer)
static constexpr header::DataDescription getDataDescription(const IDCFormat idcFormat)
constexpr o2::header::DataOrigin gDataOriginTPC
Defining PrimaryVertex explicitly as messageable.
std::vector< ConfigParamSpec > ccdbParamSpec(std::string const &path, int runDependent, std::vector< CCDBMetadata > metadata={}, int qrate=0)
std::vector< ConfigParamSpec > Options
std::vector< T, o2::pmr::polymorphic_allocator< T > > vector
uint32_t getCurrentTF(o2::framework::ProcessingContext &pc)
Global TPC definitions and constants.
const std::unordered_map< CDBType, const std::string > CDBTypeMap
Storage name in CCDB for each calibration and parameter type.
constexpr unsigned char SECTORSPERSIDE
DataProcessorSpec getTPCFLPIDCSpec(const int ilane, const std::vector< uint32_t > &crus, const unsigned int rangeIDC, const bool loadStatusMap, const std::string idc0File, const bool disableIDC0CCDB, const bool enableSynchProc, const int nTFsBuffer=1)
Enum< T >::Iterator begin(Enum< T >)
@ CalIDCPadStatusMapA
Status map of the pads (dead etc. obatined from CalIDC0)
@ CalIDC0C
I_0(r,\phi) = <I(r,\phi,t)>_t.
@ CalIDC0A
I_0(r,\phi) = <I(r,\phi,t)>_t.
@ CalIDCPadStatusMapC
Status map of the pads (dead etc. obatined from CalIDC0)
Defining DataPointCompositeObject explicitly as copiable.
struct containing the ITPC0 values (integrated TPC clusters)
std::vector< float > mIDCZero
I_0(r,\phi) = <I(r,\phi,t)>_t.
std::vector< o2::ctf::BufferType > vec