17#ifndef ALICEO2_FIT_DIGITBLOCKFIT_H_
18#define ALICEO2_FIT_DIGITBLOCKFIT_H_
38namespace DigitBlockFIThelper
43template <
typename ChannelDataType,
typename PMDataType>
46 pmData.pmBits = chData.ChainQTC;
48 pmData.time = chData.CFDTime;
49 pmData.charge = chData.QTCAmpl;
52template <
typename ChannelDataType,
typename PMDataType>
53auto ConvertChData2EventData(
const ChannelDataType& chData, PMDataType& pmData,
int channelID) -> std::enable_if_t<std::is_same<decltype(std::declval<ChannelDataType>().mChargeADC), int16_t>
::value>
55 pmData.pmBits = chData.mFEEBits;
57 pmData.time = chData.mTime;
58 pmData.charge = chData.mChargeADC;
63template <
typename DigitType,
typename TCMDataType>
66 tcmData.orA = digit.mTriggers.getOrA();
67 tcmData.orC = digit.mTriggers.getOrC();
68 tcmData.sCen = digit.mTriggers.getSCen();
69 tcmData.cen = digit.mTriggers.getCen();
70 tcmData.vertex = digit.mTriggers.getVertex();
71 tcmData.laser = digit.mTriggers.getLaser();
72 tcmData.outputsAreBlocked = digit.mTriggers.getOutputsAreBlocked();
73 tcmData.dataIsValid = digit.mTriggers.getDataIsValid();
74 tcmData.nChanA = digit.mTriggers.getNChanA();
75 tcmData.nChanC = digit.mTriggers.getNChanC();
76 const int64_t thresholdSignedInt17bit = 65535;
77 if (digit.mTriggers.getAmplA() > thresholdSignedInt17bit) {
78 tcmData.amplA = thresholdSignedInt17bit;
80 tcmData.amplA = digit.mTriggers.getAmplA();
82 if (digit.mTriggers.getAmplC() > thresholdSignedInt17bit) {
83 tcmData.amplC = thresholdSignedInt17bit;
85 tcmData.amplC = digit.mTriggers.getAmplC();
87 tcmData.timeA = digit.mTriggers.getTimeA();
88 tcmData.timeC = digit.mTriggers.getTimeC();
94template <
typename DigitType,
typename TCMDataType>
97 using TriggerType =
decltype(digit.mTriggers);
98 auto& trg = digit.mTriggers;
99 trg.setTriggers((
bool)tcmData.orA, (bool)tcmData.orC, (
bool)tcmData.vertex, (bool)tcmData.cen, (
bool)tcmData.sCen,
100 (int8_t)tcmData.nChanA, (int8_t)tcmData.nChanC, (int32_t)tcmData.amplA, (int32_t)tcmData.amplC,
101 (int16_t)tcmData.timeA, (int16_t)tcmData.timeC, (bool)tcmData.laser, (
bool)tcmData.outputsAreBlocked, (bool)tcmData.dataIsValid);
106template <
typename LookupTableType,
typename ChannelDataType,
typename PMDataType,
typename RawDataMetricType>
107auto ConvertEventData2ChData(std::vector<ChannelDataType>& vecChData,
const PMDataType& pmData, RawDataMetricType& metric,
int linkID,
int ep) -> std::enable_if_t<std::is_same<decltype(std::declval<ChannelDataType>().QTCAmpl), int16_t>
::value>
110 const auto globalChID = LookupTableType::Instance().getChannel(linkID, ep, pmData.channelID, isValid);
112 vecChData.emplace_back(
static_cast<uint8_t
>(globalChID),
static_cast<int>(pmData.time),
static_cast<int>(pmData.charge),
static_cast<uint8_t
>(pmData.pmBits));
114 static int warningCount = 0;
115 metric.addStatusBit(RawDataMetricType::EStatusBits::kWrongChannelMapping);
116 if (warningCount++ < 100) {
117 LOG(warning) <<
"Incorrect global channel! linkID: " << linkID <<
" | EndPoint: " << ep <<
" | LocalChID: " <<
static_cast<uint16_t
>(pmData.channelID);
122template <
typename LookupTableType,
typename ChannelDataType,
typename PMDataType,
typename RawDataMetricType>
123auto ConvertEventData2ChData(std::vector<ChannelDataType>& vecChData,
const PMDataType& pmData, RawDataMetricType& metric,
int linkID,
int ep) -> std::enable_if_t<std::is_same<decltype(std::declval<ChannelDataType>().mChargeADC), int16_t>
::value>
126 const auto globalChID = LookupTableType::Instance().getChannel(linkID, ep, pmData.channelID, isValid);
128 vecChData.emplace_back(
static_cast<uint8_t
>(globalChID),
static_cast<int>(pmData.time),
static_cast<int>(pmData.charge),
static_cast<uint8_t
>(pmData.pmBits));
130 metric.addStatusBit(RawDataMetricType::EStatusBits::kWrongChannelMapping);
131 static int warningCount = 0;
132 if (warningCount++ < 100) {
133 LOG(warning) <<
"Incorrect global channel! linkID: " << linkID <<
" | EndPoint: " << ep <<
" | LocalChID: " <<
static_cast<uint16_t
>(pmData.channelID);
141 return digit.mIntRecord;
146template <
typename LookupTableType,
typename DigitType,
typename ChannelDataType>
153 template <
typename... Args>
161 template <
class DataBlockType,
typename RawDataMetricType>
162 auto processDigits(
const DataBlockType& dataBlock, RawDataMetricType& metric,
int linkID,
int ep) -> std::enable_if_t<DigitBlockHelper::IsSpecOfType<DataBlockPM, DataBlockType>::value>
164 const int nElements = dataBlock.DataPM::mNelements;
165 for (
int iEventData = 0; iEventData < nElements; iEventData++) {
166 const auto& pmData = dataBlock.DataPM::mData[iEventData];
171 template <
class DataBlockType,
typename RawDataMetricType>
172 auto processDigits(
const DataBlockType& dataBlock, RawDataMetricType& metric,
int linkID,
int ep) -> std::enable_if_t<DigitBlockHelper::IsSpecOfType<DataBlockTCM, DataBlockType>::value>
175 auto& tcmData = dataBlock.DataTCM::mData[0];
180 template <
class DataBlockType>
181 auto decomposeDigits(
const typename RawDataMetric::Status_t& status)
const -> std::enable_if_t<DigitBlockHelper::IsSpecOfType<DataBlockPM, DataBlockType>::value, std::map<typename LookupTable_t::Topo_t, DataBlockType>>
183 using Topo_t =
typename LookupTable_t::Topo_t;
185 std::map<Topo_t, DataBlockType> mapResult;
186 std::map<Topo_t, std::reference_wrapper<const ChannelDataType>> mapTopo2SortedCh;
187 std::map<Topo_t, std::size_t> mapTopoCounter;
190 auto topoPM = LookupTable_t::Instance().getTopoPM(
static_cast<int>(
entry.getChannelID()));
191 mapTopo2SortedCh.insert({topoPM,
entry});
192 auto pairInserted = mapTopoCounter.insert({LookupTable_t::makeGlobalTopo(topoPM), 0});
193 pairInserted.first->second++;
196 for (
const auto&
entry : mapTopo2SortedCh) {
197 auto pairInserted = mapResult.insert({LookupTable_t::makeGlobalTopo(
entry.first), {}});
198 DataBlockType& refDataBlock = pairInserted.first->second;
199 if (pairInserted.second) {
201 refDataBlock.HeaderPM::mStatusBits |= status;
205 refDataBlock.HeaderPM::mData[0].startDescriptor = 0x0;
207 refDataBlock.HeaderPM::mData[0].startDescriptor = 0xf;
209 std::size_t nElements = mapTopoCounter.find(pairInserted.first->first)->second;
210 std::size_t nWords = nElements / 2 + nElements % 2;
213 refDataBlock.HeaderPM::mData[0].nGBTWords = 0;
215 refDataBlock.HeaderPM::mData[0].nGBTWords = nWords;
217 refDataBlock.HeaderPM::mNelements = 1;
220 refDataBlock.DataPM::mStatusBits |= status;
221 auto& refPos = refDataBlock.DataPM::mNelements;
222 auto& refData = refDataBlock.DataPM::mData[refPos];
224 int localChannelID = LookupTable_t::Instance().getLocalChannelID(
entry.first);
227 localChannelID = 0xf;
234 template <
class DataBlockType>
235 auto decomposeDigits(
const typename RawDataMetric::Status_t& status)
const -> std::enable_if_t<DigitBlockHelper::IsSpecOfType<DataBlockTCM, DataBlockType>::value, std::pair<typename LookupTable_t::Topo_t, DataBlockType>>
237 DataBlockType dataBlockTCM{};
239 dataBlockTCM.HeaderTCM::mStatusBits |= status;
243 dataBlockTCM.HeaderTCM::mData[0].startDescriptor = 0x0;
245 dataBlockTCM.HeaderTCM::mData[0].startDescriptor = 0xf;
249 dataBlockTCM.HeaderTCM::mData[0].nGBTWords = 0;
251 dataBlockTCM.HeaderTCM::mData[0].nGBTWords = 1;
254 dataBlockTCM.HeaderTCM::mNelements = 1;
255 auto& refTCMdata = dataBlockTCM.DataTCM::mData[0];
256 dataBlockTCM.DataTCM::mStatusBits |= status;
257 dataBlockTCM.DataTCM::mNelements = 1;
260 return {LookupTable_t::Instance().getTopoTCM(), dataBlockTCM};
263 template <
typename DigitBlockProcType>
266 assert(inputTree !=
nullptr);
267 std::vector<DigitBlockFIT_t> vecResult;
268 std::vector<typename DigitBlockBase_t::Digit_t> vecDigit;
269 std::vector<typename DigitBlockBase_t::Digit_t>* ptrVecDigit = &vecDigit;
272 inputTree->SetBranchAddress(
decltype(vecDigit)::value_type::sDigitBranchName, &ptrVecDigit);
273 inputTree->SetBranchAddress(
decltype(vecChannelData)::value_type::sDigitBranchName, &ptrVecChannelData);
274 for (
int iEntry = 0; iEntry < inputTree->GetEntries(); iEntry++) {
275 inputTree->GetEntry(iEntry);
276 LOG(detail) <<
"Processing TF " << iEntry;
277 digitBlockProc.processDigitBlockPerTF(DigitBlockBase_t::template makeDigitBlock<DigitBlockFIT_t>(vecDigit, vecChannelData));
280 template <
typename VecDigitType,
typename VecChannelDataType,
typename VecDetTrigInputType>
281 void getDigits(VecDigitType& vecDigits, VecChannelDataType& vecChannelData, VecDetTrigInputType& vecTriggerInput)
286 template <
typename VecDigitType,
typename VecChannelDataType>
287 void getDigits(VecDigitType& vecDigits, VecChannelDataType& vecChannelData)
291 static void print(
const std::vector<DigitType>& vecDigit,
const std::vector<ChannelDataType>& vecChannelData)
293 for (
const auto& digit : vecDigit) {
295 LOG(info) <<
"______________CHANNEL DATA____________";
296 for (
int iChData = digit.ref.getFirstEntry(); iChData < digit.ref.getFirstEntry() + digit.ref.getEntries(); iChData++) {
297 vecChannelData[iChData].printLog();
299 LOG(info) <<
"______________________________________";
309template <
typename LookupTableType,
typename DigitType,
typename ChannelDataType,
typename TriggersExtType>
317 template <
typename... Args>
325 template <
class DataBlockType,
typename RawDataMetricType>
326 auto processDigits(
const DataBlockType& dataBlock, RawDataMetricType& metric,
int linkID,
int ep) -> std::enable_if_t<DigitBlockHelper::IsSpecOfType<DataBlockPM, DataBlockType>::value>
328 const int nElements = dataBlock.DataPM::mNelements;
329 for (
int iEventData = 0; iEventData < nElements; iEventData++) {
330 const auto& pmData = dataBlock.DataPM::mData[iEventData];
335 template <
class DataBlockType,
typename RawDataMetricType>
336 auto processDigits(
const DataBlockType& dataBlock, RawDataMetricType& metric,
int linkID,
int ep) -> std::enable_if_t<DigitBlockHelper::IsSpecOfType<DataBlockTCMext, DataBlockType>::value>
338 auto& tcmData = dataBlock.DataTCM::mData[0];
341 const int nElements = dataBlock.DataTCMext::mNelements;
342 for (
int iTriggerWord = 0; iTriggerWord < nElements; iTriggerWord++) {
348 template <
class DataBlockType>
349 auto decomposeDigits(
const typename RawDataMetric::Status_t& status)
const -> std::enable_if_t<DigitBlockHelper::IsSpecOfType<DataBlockPM, DataBlockType>::value, std::map<typename LookupTable_t::Topo_t, DataBlockType>>
351 using Topo_t =
typename LookupTable_t::Topo_t;
352 std::map<Topo_t, DataBlockType> mapResult;
353 std::map<Topo_t, std::reference_wrapper<const ChannelDataType>> mapTopo2SortedCh;
354 std::map<Topo_t, std::size_t> mapTopoCounter;
357 auto topoPM = LookupTable_t::Instance().getTopoPM(
static_cast<int>(
entry.getChannelID()));
358 mapTopo2SortedCh.insert({topoPM,
entry});
359 auto pairInserted = mapTopoCounter.insert({LookupTable_t::makeGlobalTopo(topoPM), 0});
360 pairInserted.first->second++;
363 for (
const auto&
entry : mapTopo2SortedCh) {
364 auto pairInserted = mapResult.insert({LookupTable_t::makeGlobalTopo(
entry.first), {}});
365 auto& refDataBlock = pairInserted.first->second;
366 if (pairInserted.second) {
371 refDataBlock.HeaderPM::mData[0].startDescriptor = 0x0;
373 refDataBlock.HeaderPM::mData[0].startDescriptor = 0xf;
375 std::size_t nElements = mapTopoCounter.find(pairInserted.first->first)->second;
376 std::size_t nWords = nElements / 2 + nElements % 2;
379 refDataBlock.HeaderPM::mData[0].nGBTWords = 0;
381 refDataBlock.HeaderPM::mData[0].nGBTWords = nWords;
383 refDataBlock.HeaderPM::mNelements = 1;
386 auto& refPos = refDataBlock.DataPM::mNelements;
387 auto& refData = refDataBlock.DataPM::mData[refPos];
389 int localChannelID = LookupTable_t::Instance().getLocalChannelID(
entry.first);
392 localChannelID = 0xf;
399 template <
class DataBlockType>
400 auto decomposeDigits(
const typename RawDataMetric::Status_t& status)
const -> std::enable_if_t<DigitBlockHelper::IsSpecOfType<DataBlockTCMext, DataBlockType>::value, std::pair<typename LookupTable_t::Topo_t, DataBlockType>>
402 DataBlockType dataBlockTCM{};
407 dataBlockTCM.HeaderTCMext::mData[0].startDescriptor = 0x0;
409 dataBlockTCM.HeaderTCMext::mData[0].startDescriptor = 0xf;
413 dataBlockTCM.HeaderTCMext::mData[0].nGBTWords = 0;
415 dataBlockTCM.HeaderTCMext::mData[0].nGBTWords = 1;
417 dataBlockTCM.HeaderTCMext::mNelements = 1;
418 auto& refTCMdata = dataBlockTCM.DataTCM::mData[0];
421 dataBlockTCM.DataTCM::mNelements = 1;
424 for (
int i = 0;
i < std::decay<
decltype(dataBlockTCM.DataTCMext::mData[0])>::type::MaxNelements;
i++) {
427 dataBlockTCM.DataTCMext::mNelements = 1;
428 return {LookupTable_t::Instance().getTopoTCM(), dataBlockTCM};
430 template <
typename VecDigitType,
typename VecChannelDataType,
typename VecTriggersExtType,
typename VecDetTrigInputType>
431 void getDigits(VecDigitType& vecDigits, VecChannelDataType& vecChannelData, VecTriggersExtType& vecTriggersExt, VecDetTrigInputType& vecTriggerInput)
434 getDigits(vecDigits, vecChannelData, vecTriggersExt);
436 template <
typename VecDigitType,
typename VecChannelDataType,
typename VecTriggersExtType>
437 void getDigits(VecDigitType& vecDigits, VecChannelDataType& vecChannelData, VecTriggersExtType& vecTriggersExt)
442 static void print(
const std::vector<DigitType>& vecDigit,
const std::vector<ChannelDataType>& vecChannelData,
const std::vector<TriggersExtType>& vecTriggersExt)
444 for (
const auto& digit : vecDigit) {
446 LOG(info) <<
"______________CHANNEL DATA____________";
447 for (
int iChData = digit.ref.getFirstEntry(); iChData < digit.ref.getFirstEntry() + digit.ref.getEntries(); iChData++) {
448 vecChannelData[iChData].printLog();
450 LOG(info) <<
"______________________________________";
452 LOG(info) <<
"______________EXTENDED TRIGGERS____________";
453 for (
const auto& trgExt : vecTriggersExt) {
456 LOG(info) <<
"______________________________________";
auto getSubDigits(VecDigit &vecDigits, VecSubDigits &... vecSubDigits) -> std::enable_if_t< sizeof...(VecSubDigits)==sNSubDigits >
auto getSingleSubDigits(T &... vecSingleSubDigits) -> std::enable_if_t< sizeof...(T)==sNSingleSubDigits >
SingleSubDigit_t mSingleSubDigit
DigitBlockHelper::GetSubDigitField< VecSubDigit_t >::vector_type SubDigit_t
void getDigits(VecDigitType &vecDigits, VecChannelDataType &vecChannelData)
auto decomposeDigits(const typename RawDataMetric::Status_t &status) const -> std::enable_if_t< DigitBlockHelper::IsSpecOfType< DataBlockTCM, DataBlockType >::value, std::pair< typename LookupTable_t::Topo_t, DataBlockType > >
static void print(const std::vector< DigitType > &vecDigit, const std::vector< ChannelDataType > &vecChannelData)
DigitBlockFIT(Args &&... args)
auto processDigits(const DataBlockType &dataBlock, RawDataMetricType &metric, int linkID, int ep) -> std::enable_if_t< DigitBlockHelper::IsSpecOfType< DataBlockPM, DataBlockType >::value >
DigitBlockBase< DigitType, ChannelDataType > DigitBlockBase_t
DigitBlockFIT(const DigitBlockFIT &other)=default
auto processDigits(const DataBlockType &dataBlock, RawDataMetricType &metric, int linkID, int ep) -> std::enable_if_t< DigitBlockHelper::IsSpecOfType< DataBlockTCM, DataBlockType >::value >
void getDigits(VecDigitType &vecDigits, VecChannelDataType &vecChannelData, VecDetTrigInputType &vecTriggerInput)
static void processDigitBlocks(TTree *inputTree, DigitBlockProcType &digitBlockProc)
auto decomposeDigits(const typename RawDataMetric::Status_t &status) const -> std::enable_if_t< DigitBlockHelper::IsSpecOfType< DataBlockPM, DataBlockType >::value, std::map< typename LookupTable_t::Topo_t, DataBlockType > >
LookupTableType LookupTable_t
DigitBlockFIText()=default
~DigitBlockFIText()=default
LookupTableType LookupTable_t
auto decomposeDigits(const typename RawDataMetric::Status_t &status) const -> std::enable_if_t< DigitBlockHelper::IsSpecOfType< DataBlockTCMext, DataBlockType >::value, std::pair< typename LookupTable_t::Topo_t, DataBlockType > >
static void print(const std::vector< DigitType > &vecDigit, const std::vector< ChannelDataType > &vecChannelData, const std::vector< TriggersExtType > &vecTriggersExt)
void getDigits(VecDigitType &vecDigits, VecChannelDataType &vecChannelData, VecTriggersExtType &vecTriggersExt, VecDetTrigInputType &vecTriggerInput)
auto processDigits(const DataBlockType &dataBlock, RawDataMetricType &metric, int linkID, int ep) -> std::enable_if_t< DigitBlockHelper::IsSpecOfType< DataBlockTCMext, DataBlockType >::value >
auto decomposeDigits(const typename RawDataMetric::Status_t &status) const -> std::enable_if_t< DigitBlockHelper::IsSpecOfType< DataBlockPM, DataBlockType >::value, std::map< typename LookupTable_t::Topo_t, DataBlockType > >
auto processDigits(const DataBlockType &dataBlock, RawDataMetricType &metric, int linkID, int ep) -> std::enable_if_t< DigitBlockHelper::IsSpecOfType< DataBlockPM, DataBlockType >::value >
DigitBlockBase< DigitType, ChannelDataType, TriggersExtType > DigitBlockBase_t
void getDigits(VecDigitType &vecDigits, VecChannelDataType &vecChannelData, VecTriggersExtType &vecTriggersExt)
DigitBlockFIText(const DigitBlockFIText &other)=default
DigitBlockFIText(Args &&... args)
GLsizei const GLfloat * value
auto ConvertDigit2TCMData(const DigitType &digit, TCMDataType &tcmData)
auto ConvertEventData2ChData(std::vector< ChannelDataType > &vecChData, const PMDataType &pmData, RawDataMetricType &metric, int linkID, int ep) -> std::enable_if_t< std::is_same< decltype(std::declval< ChannelDataType >().QTCAmpl), int16_t >::value >
auto GetIntRecord(const T &digit)
auto ConvertTCMData2Digit(DigitType &digit, const TCMDataType &tcmData)
auto ConvertChData2EventData(const ChannelDataType &chData, PMDataType &pmData, int channelID) -> std::enable_if_t< std::is_same< decltype(std::declval< ChannelDataType >().QTCAmpl), int16_t >::value >
TFitResultPtr fit(const size_t nBins, const T *arr, const T xMin, const T xMax, TF1 &func, std::string_view option="")
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Defining DataPointCompositeObject explicitly as copiable.
static bool isBitActive(Status_t metric, EStatusBits statusBit)
VectorOfTObjectPtrs other
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"