17#ifndef ALICEO2_FIT_DIGITBLOCKBASE_H_
18#define ALICEO2_FIT_DIGITBLOCKBASE_H_
29#include <boost/mpl/vector.hpp>
30#include <boost/mpl/front.hpp>
31#include <boost/mpl/fold.hpp>
32#include <boost/mpl/remove_if.hpp>
33#include <boost/mpl/lambda.hpp>
34#include <boost/mpl/not.hpp>
35#include <boost/mpl/size.hpp>
43namespace DigitBlockHelper
47template <
template <
typename...>
class Template,
typename T>
50template <
template <
typename...>
class Template,
typename... T>
54template <
typename T,
typename =
void>
59struct HasRef<T,
std::enable_if_t<std::is_same<decltype(std::declval<T>().ref), typename o2::dataformats::RangeReference<int, int>>::value>> : std::true_type {
63struct HasRef<T,
std::enable_if_t<std::is_same<decltype(std::declval<T>().ref), typename o2::dataformats::RangeRefComp<6>>::value>> : std::true_type {
67struct HasRef<T,
std::enable_if_t<std::is_same<decltype(std::declval<T>().ref), typename o2::dataformats::RangeRefComp<5>>::value>> : std::true_type {
71template <
typename T,
typename =
void>
76struct HasArrayRef<T,
std::enable_if_t<std::is_same<decltype(std::declval<T>().ref), typename std::array<typename o2::dataformats::RangeReference<int, int>, std::tuple_size<decltype(std::declval<T>().ref)>::value>>::value>> : std::true_type {
80struct HasArrayRef<T,
std::enable_if_t<std::is_same<decltype(std::declval<T>().ref), typename std::array<typename o2::dataformats::RangeRefComp<6>, std::tuple_size<decltype(std::declval<T>().ref)>::value>>::value>> : std::true_type {
84struct HasArrayRef<T,
std::enable_if_t<std::is_same<decltype(std::declval<T>().ref), typename std::array<typename o2::dataformats::RangeRefComp<5>, std::tuple_size<decltype(std::declval<T>().ref)>::value>>::value>> : std::true_type {
88template <
typename T,
typename =
void>
90 constexpr static std::size_t
value = 0;
94 constexpr static std::size_t
value = 1;
97struct GetDigitRefsN<T,
std::enable_if_t<HasArrayRef<T>::value && (std::tuple_size<decltype(std::declval<T>().ref)>::value > 1)>> {
98 constexpr static std::size_t
value = std::tuple_size<decltype(std::declval<T>().ref)>
::value;
101template <
typename T,
typename =
void>
105struct HasIntRecord<T,
std::enable_if_t<std::is_same<decltype(std::declval<T>().mIntRecord), o2::InteractionRecord>::value>> : std::true_type {
109struct HasIntRecord<T,
std::enable_if_t<std::is_same<decltype(std::declval<T>().ir), o2::InteractionRecord>::value>> : std::true_type {
117template <
typename T,
typename =
void>
123 constexpr static std::size_t
size = 0;
128 typedef std::vector<typename boost::mpl::front<T>::type>
vector_type;
129 typedef typename boost::mpl::front<T>::type
type;
132 constexpr static std::size_t
size = 1;
138 template <
typename Arg1,
typename Arg2>
140 template <
typename... Args,
typename LastArg>
141 struct MakeTuple<
std::tuple<Args...>, LastArg> {
142 typedef std::tuple<Args..., LastArg>
type;
144 typedef typename boost::mpl::fold<T, std::tuple<>, MakeTuple<boost::mpl::_1, std::vector<boost::mpl::_2>>>
::type vector_type;
145 typedef typename boost::mpl::fold<T, std::tuple<>, MakeTuple<boost::mpl::_1, boost::mpl::_2>>
::type type;
148 constexpr static std::size_t
size = boost::mpl::size<T>::value;
158template <
typename DigitType,
typename... SubDigitTypes>
164 mDigit.setIntRecord(intRec);
185 template <
typename VecDigit,
typename... VecSubDigits>
187 -> std::enable_if_t<
sizeof...(VecSubDigits) ==
sNSubDigits>
190 getSubDigit<
sizeof...(VecSubDigits),
sizeof...(VecSubDigits)>(std::tie(vecSubDigits...));
192 vecDigits.push_back(std::move(
mDigit));
195 template <
typename... T>
204 template <std::size_t N, std::size_t N_TOTAL,
typename... T>
205 auto getSubDigit(std::tuple<T...> tupleVecSubDigits) -> std::enable_if_t<(N_TOTAL > 1)>
207 mDigit.ref[N - 1].set(std::get<N - 1>(tupleVecSubDigits).size(), std::get<N - 1>(
mSubDigit).
size());
208 std::move(std::get<N - 1>(
mSubDigit).begin(), std::get<N - 1>(
mSubDigit).
end(), std::back_inserter(std::get<N - 1>(tupleVecSubDigits)));
209 if constexpr (N > 1) {
213 template <std::size_t N, std::size_t N_TOTAL,
typename... T>
214 auto getSubDigit(std::tuple<T...> tupleVecSubDigits) -> std::enable_if_t<(N_TOTAL == 1)>
216 mDigit.ref.set(std::get<0>(tupleVecSubDigits).size(),
mSubDigit.size());
217 std::move(
mSubDigit.begin(),
mSubDigit.end(), std::back_inserter(std::get<0>(tupleVecSubDigits)));
220 template <std::size_t N, std::size_t N_TOTAL,
typename... T>
221 auto getSingleSubDigit(std::tuple<T...> tupleVecSingleSubDigits) -> std::enable_if_t<(N_TOTAL > 1)>
223 std::get<N - 1>(tupleVecSingleSubDigits).push_back(std::move(std::get<N - 1>(
mSingleSubDigit)));
224 if constexpr (N > 1) {
228 template <std::size_t N, std::size_t N_TOTAL,
typename... T>
229 auto getSingleSubDigit(std::tuple<T...> tupleVecSingleSubDigits) -> std::enable_if_t<(N_TOTAL == 1)>
231 std::get<0>(tupleVecSingleSubDigits).push_back(std::move(
mSingleSubDigit));
234 template <
typename DigitBlockType,
typename DigitT,
typename SubDigitT>
237 std::vector<DigitBlockType> vecResult;
238 vecResult.reserve(vecDigits.size());
239 for (
const auto& digit : vecDigits) {
240 auto itBegin = vecSubDigits.begin();
241 std::advance(itBegin, digit.ref.getFirstEntry());
242 auto itLast = itBegin;
243 std::advance(itLast, digit.ref.getEntries());
244 vecResult.push_back({digit});
245 vecResult.back().mSubDigit.reserve(digit.ref.getEntries());
246 std::copy(itBegin, itLast, std::back_inserter(vecResult.back().mSubDigit));
252 template <
typename DigitBlockType,
typename DigitT,
typename... SubDigitT>
255 std::vector<DigitBlockType> vecResult;
256 vecResult.reserve(vecDigits.size());
257 for (
const auto& digit : vecDigits) {
258 vecResult.push_back({digit});
259 auto& refTuple = vecResult.back().mSubDigit;
260 fillSubDigitTuple<
sizeof...(SubDigitT)>(digit, std::tie(vecSubDigits...), refTuple);
265 template <std::size_t N,
typename DigitT,
typename... T>
266 static void fillSubDigitTuple(
const DigitT& digit,
const std::tuple<T...>& tupleSrc, std::tuple<T...>& tupleDest)
268 const auto& vecSrc = std::get<N>(tupleSrc);
269 auto& vecDest = std::get<N>(tupleSrc);
270 auto itBegin = vecSrc.begin();
271 std::advance(itBegin, digit.ref[N - 1].getFirstEntry());
272 auto itLast = itBegin;
273 std::advance(itLast, digit.ref[N - 1].getEntries());
274 vecDest.reserve(digit.ref[N - 1].getEntries());
275 std::copy(itBegin, itLast, std::back_inserter(vecDest));
276 if constexpr (N > 1) {
285 LOG(info) <<
"______________SUB DIGITS____________";
286 std::apply([](
const auto&... vecSubDigit) {
287 ((std::for_each(vecSubDigit.begin(), vecSubDigit.end(), [](
const auto& subDigit) {
295 LOG(info) <<
"______________SUB DIGITS____________";
302 LOG(info) <<
"______________SINGLE SUB DIGITS____________";
303 std::apply([](
const auto&... singleSubDigit) {
304 ((singleSubDigit.printLog()), ...);
309 LOG(info) <<
"______________SINGLE SUB DIGITS____________";
312 LOG(info) << std::dec;
313 LOG(info) <<
"______________________________________";
Class to refer to the 1st entry and N elements of some group in the continuous container.
static constexpr std::size_t sNSubDigits
auto getSubDigits(VecDigit &vecDigits, VecSubDigits &... vecSubDigits) -> std::enable_if_t< sizeof...(VecSubDigits)==sNSubDigits >
DigitBlockBase(const DigitType &digit)
auto getSubDigit(std::tuple< T... > tupleVecSubDigits) -> std::enable_if_t<(N_TOTAL > 1)>
DigitBlockHelper::GetVecSingleSubDigit< VecAllSubDigit_t > VecSingleSubDigit_t
DigitBlockHelper::GetVecSubDigit< VecAllSubDigit_t > VecSubDigit_t
DigitBlockBase(const DigitBlockBase &other)=default
DigitBlockHelper::GetSubDigitField< VecSingleSubDigit_t >::type SingleSubDigit_t
~DigitBlockBase()=default
static void fillSubDigitTuple(const DigitT &digit, const std::tuple< T... > &tupleSrc, std::tuple< T... > &tupleDest)
static auto makeDigitBlock(const std::vector< DigitT > &vecDigits, const std::vector< SubDigitT > &... vecSubDigits) -> std::enable_if_t<(DigitBlockHelper::GetDigitRefsN< DigitT >::value > 1) &&(DigitBlockHelper::IsSpecOfType< DigitBlockBase, typename DigitBlockType::DigitBlockBase_t >::value), std::vector< DigitBlockType > >
auto getSingleSubDigits(T &... vecSingleSubDigits) -> std::enable_if_t< sizeof...(T)==sNSingleSubDigits >
auto getSingleSubDigit(std::tuple< T... > tupleVecSingleSubDigits) -> std::enable_if_t<(N_TOTAL > 1)>
std::tuple< std::vector< DigitType >, std::vector< SubDigitTypes >... > TupleVecDigitObjs_t
static constexpr std::size_t sNSingleSubDigits
SingleSubDigit_t mSingleSubDigit
auto getSubDigit(std::tuple< T... > tupleVecSubDigits) -> std::enable_if_t<(N_TOTAL==1)>
DigitBlockBase(const o2::InteractionRecord &intRec)
boost::mpl::vector< SubDigitTypes... > VecAllSubDigit_t
auto getSingleSubDigit(std::tuple< T... > tupleVecSingleSubDigits) -> std::enable_if_t<(N_TOTAL==1)>
DigitBlockHelper::GetSubDigitField< VecSubDigit_t >::vector_type SubDigit_t
static auto makeDigitBlock(const std::vector< DigitT > &vecDigits, const std::vector< SubDigitT > &vecSubDigits) -> std::enable_if_t< DigitBlockHelper::GetDigitRefsN< DigitT >::value==1 &&DigitBlockHelper::IsSpecOfType< DigitBlockBase, typename DigitBlockType::DigitBlockBase_t >::value, std::vector< DigitBlockType > >
GLsizei const GLfloat * value
GLint GLint GLsizei GLint GLenum GLenum type
typename boost::mpl::remove_if< T, boost::mpl::lambda< boost::mpl::not_< HasIntRecord< boost::mpl::_1 > > >::type >::type GetVecSingleSubDigit
typename boost::mpl::remove_if< T, boost::mpl::lambda< HasIntRecord< boost::mpl::_1 > >::type >::type GetVecSubDigit
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.
boost::mpl::front< T >::type type
std::vector< typename boost::mpl::front< T >::type > vector_type
boost::mpl::fold< T, std::tuple<>, MakeTuple< boost::mpl::_1, std::vector< boost::mpl::_2 > > >::type vector_type
boost::mpl::fold< T, std::tuple<>, MakeTuple< boost::mpl::_1, boost::mpl::_2 > >::type type
std::tuple< Args..., LastArg > type
static constexpr bool sIsEmpty
static constexpr bool sIsTuple
VectorOfTObjectPtrs other
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"