45 TPCIntegrateClusters(std::shared_ptr<o2::base::GRPGeomRequest> req,
const bool disableWriter) : mCCDBRequest(req), mDisableWriter(disableWriter){};
50 mNSlicesTF = ic.options().get<
int>(
"nSlicesTF");
51 mHBScaling = ic.options().get<
float>(
"heart-beat-scaling");
52 mProcess3D = ic.options().get<
bool>(
"process-3D-currents");
53 mNBits = ic.options().get<
int>(
"nBits");
59 if (mContinuousMaxTimeBin < 0) {
64 const auto&
clusters = getWorkflowTPCInput(pc);
71 const int slicesNew =
static_cast<int>(mNSlicesTF * mHBScaling + 0.5);
72 if (slicesNew != mNSlicesTF) {
73 LOGP(info,
"Adjusting number of slices to {}", slicesNew);
74 mNSlicesTF = slicesNew;
76 mNTSPerSlice = mContinuousMaxTimeBin / mNSlicesTF;
77 mInitICCBuffer =
false;
79 mBufferCurrents.
resize(mNSlicesTF);
94 for (
int icl = 0; icl <
nClusters; ++icl) {
95 const auto& cl = *(clIndex.
clusters[isector][irow] + icl);
96 const float time = cl.getTime();
97 const unsigned int sliceInTF =
time / mNTSPerSlice;
98 if (sliceInTF < mNSlicesTF) {
99 const float qMax = cl.getQmax();
100 const float qTot = cl.getQtot();
103 mBufferCurrents.
mIQMaxA[sliceInTF] += qMax;
104 mBufferCurrents.
mIQTotA[sliceInTF] += qTot;
105 ++mBufferCurrents.
mINClA[sliceInTF];
107 mBufferCurrents.
mIQMaxC[sliceInTF] += qMax;
108 mBufferCurrents.
mIQTotC[sliceInTF] += qTot;
109 ++mBufferCurrents.
mINClC[sliceInTF];
112 const int pad =
static_cast<int>(cl.getPad() + 0.5f);
117 LOGP(warning,
"Index {} is larger than max index {}",
index, mBufferCurrents.
mIQMaxA.size());
131 LOGP(
debug,
"slice in TF of ICC {} is larger than max slice {} with nTSPerSlice {}", sliceInTF, mNSlicesTF, mNTSPerSlice);
137 const float nTSPerSliceInv = 1. / float(mNTSPerSlice);
138 mBufferCurrents.
normalize(nTSPerSliceInv);
148 float mHBScaling = 1;
149 const bool mDisableWriter{
false};
150 bool mProcess3D{
false};
151 std::vector<int> mCounterNeighbours;
152 ITPCC mBufferCurrents;
153 std::shared_ptr<o2::base::GRPGeomRequest> mCCDBRequest;
154 int mContinuousMaxTimeBin{-1};
155 bool mInitICCBuffer{
true};
162 mBufferCurrents.compress(mNBits);
166 if (!mDisableWriter) {
176 std::vector<InputSpec> inputs;
179 auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,
187 std::vector<OutputSpec> outputs;
189 if (!disableWriter) {
194 "TPCIntegrateClusters",
197 AlgorithmSpec{adaptFromTask<TPCIntegrateClusters>(ccdbRequest, disableWriter)},
198 Options{{
"nSlicesTF", VariantType::Int, 11, {
"number of slices into which a TF is divided"}},
199 {
"heart-beat-scaling", VariantType::Float, 1.f, {
"fraction of filled TFs (1 full TFs, 0.25 TFs filled only with 25%)"}},
200 {
"process-3D-currents", VariantType::Bool,
false, {
"Process full 3D currents instead of 1D integrated only currents"}},
201 {
"nBits", VariantType::Int, 32, {
"Number of bits used for compression/rounding (values >= 32 results in no compression)"}}}};
Helper for geometry and GRP related CCDB requests.
calibrator class for accumulating integrated clusters
Helper class to obtain TPC clusters / digits / labels from DPL.
void checkUpdates(o2::framework::ProcessingContext &pc)
bool finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj)
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
void snapshot(const Output &spec, T const &object)
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.
static constexpr unsigned int GLOBALPADOFFSET[NREGIONS]
offset of number of pads for region
static constexpr unsigned short getPadsInSector()
static constexpr int getNumberOfPadsPerSide()
static constexpr unsigned int OFFSETCRUGLOBAL[PADROWS]
row offset in cru for given global pad row
static constexpr unsigned REGION[PADROWS]
region for global pad row
void endOfStream(EndOfStreamContext &eos) final
void init(framework::InitContext &ic) final
void run(ProcessingContext &pc) final
TPCIntegrateClusters(std::shared_ptr< o2::base::GRPGeomRequest > req, const bool disableWriter)
\constructor
void finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj) final
constexpr o2::header::DataOrigin gDataOriginTPC
constexpr int LHCMaxBunches
Defining PrimaryVertex explicitly as messageable.
std::vector< ConfigParamSpec > Options
constexpr int LHCBCPERTIMEBIN
constexpr int MAXGLOBALPADROW
uint32_t getCurrentTF(o2::framework::ProcessingContext &pc)
constexpr unsigned char SECTORSPERSIDE
o2::framework::DataProcessorSpec getTPCIntegrateClusterSpec(const bool disableWriter)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
static void fillTFIDInfo(o2::framework::ProcessingContext &pc, o2::dataformats::TFIDInfo &ti)
unsigned int nClusters[constants::MAXSECTOR][constants::MAXGLOBALPADROW]
unsigned int nClustersTotal
const ClusterNative * clusters[constants::MAXSECTOR][constants::MAXGLOBALPADROW]
std::vector< float > mINClA
integrated 1D-currents for NCl A-side
std::vector< float > mIQMaxC
integrated 1D-currents for QMax C-side
std::vector< float > mIQTotA
integrated 1D-currents for QTot A-side
void normalize(const float factor)
normalize currents
std::vector< float > mIQMaxA
integrated 1D-currents for QMax A-side
std::vector< float > mINClC
integrated 1D-currents for NCl A-side
std::vector< float > mIQTotC
integrated 1D-currents for QTot A-side
void resize(const unsigned int nTotal)
resize buffer for accumulated currents
std::vector< Cluster > clusters