-
Felix Weiglhofer authoredFelix Weiglhofer authored
RecoParams.h 4.36 KiB
/* Copyright (C) 2023 FIAS Frankfurt Institute for Advanced Studies, Frankfurt / Main
SPDX-License-Identifier: GPL-3.0-only
Authors: Felix Weiglhofer [committer] */
#ifndef CBM_ALGO_BASE_RECOPARAMS_H
#define CBM_ALGO_BASE_RECOPARAMS_H
#include "Definitions.h"
#include "config/Property.h"
#include "util/EnumDict.h"
#include <xpu/defines.h>
namespace cbm::algo
{
/**
* @brief RecoParams contains all parameters to configure reconstruction
*/
struct RecoParams {
enum class SortMode : u8
{
BlockSort = 0,
CUBSegmentedSort = 1,
};
enum class AllocationMode : u8
{
Auto, //< Static on GPU, dynamic on CPU
Static, //< Allocate all buffers beforehand
Dynamic, //< Allocate buffers per timeslice
};
struct STS {
SortMode digiSortMode;
SortMode clusterSortMode;
u8 findClustersMultiKernels;
f32 timeCutDigiAbs;
f32 timeCutDigiSig;
f32 timeCutClusterAbs;
f32 timeCutClusterSig;
struct Memory {
AllocationMode allocationMode;
u64 maxNDigisPerTS;
u64 maxNDigisPerModule;
f64 clustersPerDigi;
f64 hitsPerCluster;
u64 NClustersUpperBound(u64 nDigis) const { return nDigis * clustersPerDigi; }
u64 NHitsUpperBound(u64 nDigis) const { return NClustersUpperBound(nDigis) * hitsPerCluster; }
u64 MaxNClustersPerModule() const { return NClustersUpperBound(maxNDigisPerModule); }
u64 MaxNHitsPerModule() const { return MaxNClustersPerModule() * hitsPerCluster; }
bool IsDynamic() const { return allocationMode == RecoParams::AllocationMode::Dynamic; }
bool IsStatic() const { return allocationMode == RecoParams::AllocationMode::Static; }
bool IsAuto() const { return allocationMode == RecoParams::AllocationMode::Auto; }
static constexpr auto Properties = std::make_tuple(
config::Property(&Memory::allocationMode, "allocationMode", "Allocation mode (Auto, Static, Dynamic)"),
config::Property(&Memory::maxNDigisPerTS, "maxNDigisPerTS", "Maximal number of digis per time slice"),
config::Property(&Memory::maxNDigisPerModule, "maxNDigisPerModule", "Maximal number of digis per module"),
config::Property(&Memory::clustersPerDigi, "clustersPerDigi", "Number of clusters per digi in a time slice"),
config::Property(&Memory::hitsPerCluster, "hitsPerCluster", "Number of hits per cluster in a time slice"));
} memory;
static constexpr auto Properties = std::make_tuple(
config::Property(&STS::digiSortMode, "digiSortMode",
"Digi sort mode (0 = block sort, 1 = cub segmented sort))"),
config::Property(&STS::clusterSortMode, "clusterSortMode", "Cluster sort mode"),
config::Property(&STS::findClustersMultiKernels, "findClustersMultiKernels",
"Split cluster finding into multiple kernels"),
config::Property(&STS::timeCutDigiAbs, "timeCutDigiAbs",
"Time delta for neighboring digis to be considered for the same cluster. [ns]"),
config::Property(
&STS::timeCutDigiSig, "timeCutDigiSig",
"Used if timeCutDigiAbs is negative. Time delta must be < 'value * sqrt2 * timeResolution'. [ns]"),
config::Property(&STS::timeCutClusterAbs, "timeCutClusterAbs",
"Maximal time difference between two clusters in a hit [ns]."
" Setting to a positive value will override timeCutClustersSig."),
config::Property(
&STS::timeCutClusterSig, "timeCutClusterSig",
"Time cut for clusters."
" Two clusters are considered it their time difference is below 'value * sqrt(terr1**2 + terr2*+2)'"),
config::Property(&STS::memory, "memory", "Memory limits for STS reco"));
};
STS sts;
static constexpr auto Properties = std::make_tuple(config::Property(&RecoParams::sts, "sts", "STS reco settings"));
};
} // namespace cbm::algo
CBM_ENUM_DICT(cbm::algo::RecoParams::SortMode,
{"BlockSort", RecoParams::SortMode::BlockSort},
{"CUBSegmentedSort", RecoParams::SortMode::CUBSegmentedSort}
);
CBM_ENUM_DICT(cbm::algo::RecoParams::AllocationMode,
{"Auto", RecoParams::AllocationMode::Auto},
{"Static", RecoParams::AllocationMode::Static},
{"Dynamic", RecoParams::AllocationMode::Dynamic}
);
#endif // CBM_ALGO_BASE_RECOPARAMS_H