12#ifndef O2_FITINTEGRATECLUSTERSPEC_SPEC
13#define O2_FITINTEGRATECLUSTERSPEC_SPEC
46template <
typename DataT>
52 std::string
static getName() {
return "fv0"; }
53 std::string
static getCCDBPath() {
return "FV0/Calib/IFV0C"; }
63 std::string
static getName() {
return "ft0"; }
64 std::string
static getCCDBPath() {
return "FT0/Calib/IFT0C"; }
74 std::string
static getName() {
return "fdd"; }
75 std::string
static getCCDBPath() {
return "FDD/Calib/IFDDC"; }
82template <
typename DataT>
87 FITIntegrateClusters(std::shared_ptr<o2::base::GRPGeomRequest> req,
const bool disableWriter,
const int minNChan,
const int minAmpl) : mCCDBRequest(req), mDisableWriter(disableWriter), mMinNChan(minNChan), mMinAmpl(minAmpl){};
92 mNSlicesTF = ic.options().get<
int>(
"nSlicesTF");
93 mBufferCurrents.resize(mNSlicesTF);
102 const float bunchesPerSlice = nBunchesPerTF / float(mNSlicesTF);
103 const float bunchesPerSliceInv = 1.f / bunchesPerSlice;
106 mBufferCurrents.reset();
109 const auto clusters = pc.inputs().get<gsl::span<DataT>>(
"recpoints");
110 for (
const auto& cluster :
clusters) {
111 const unsigned int orbit = cluster.getInteractionRecord().orbit;
112 const uint32_t relOrbit =
orbit - firstTFOrbit;
114 const unsigned int sliceInTF = bunchInSlice / bunchesPerSlice;
115 if (sliceInTF < mNSlicesTF) {
116 const float nChanA =
static_cast<float>(cluster.getTrigger().getNChanA());
117 const float amplA =
static_cast<float>(cluster.getTrigger().getAmplA());
120 mBufferCurrents.mINChanA[sliceInTF] +=
nChanA;
121 mBufferCurrents.mIAmplA[sliceInTF] +=
amplA;
124 if constexpr (std::is_same_v<DataT, o2::ft0::RecPoints> || std::is_same_v<DataT, o2::fdd::RecPoint>) {
125 const float nChanC =
static_cast<float>(cluster.getTrigger().getNChanC());
126 const float amplC =
static_cast<float>(cluster.getTrigger().getAmplC());
128 mBufferCurrents.mINChanC[sliceInTF] +=
nChanC;
129 mBufferCurrents.mIAmplC[sliceInTF] +=
amplC;
133 LOGP(info,
"slice in TF {} is larger than max expected slice {} with relOrbit {} and {} orbits per slice", sliceInTF, mNSlicesTF, relOrbit, bunchesPerSlice);
138 mBufferCurrents.normalize(bunchesPerSliceInv);
148 const int mMinNChan = 2;
149 const int mMinAmpl = 2;
150 const bool mDisableWriter{
false};
151 typename DataDescriptionFITCurrents<DataT>::DataTStruct mBufferCurrents;
152 std::shared_ptr<o2::base::GRPGeomRequest> mCCDBRequest;
156 using FitType = DataDescriptionFITCurrents<DataT>;
157 pc.
outputs().
snapshot(
Output{FitType::getDataOrigin(), FitType::getDataDescriptionFITC()}, mBufferCurrents);
159 if (!mDisableWriter) {
162 pc.
outputs().
snapshot(
Output{FitType::getDataOrigin(), FitType::getDataDescriptionFITTFId()}, tfinfo);
167template <
typename DataT>
172 std::vector<InputSpec> inputs;
173 inputs.emplace_back(
"recpoints", FitType::getDataOrigin(),
"RECPOINTS", 0, Lifetime::Timeframe);
174 auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,
182 std::vector<OutputSpec> outputs;
183 outputs.emplace_back(FitType::getDataOrigin(), FitType::getDataDescriptionFITC(), 0, Lifetime::Timeframe);
184 if (!disableWriter) {
185 outputs.emplace_back(FitType::getDataOrigin(), FitType::getDataDescriptionFITTFId(), 0, Lifetime::Timeframe);
189 fmt::format(
"{}-integrate-clusters", FitType::getName()),
192 AlgorithmSpec{adaptFromTask<FITIntegrateClusters<DataT>>(ccdbRequest, disableWriter, minNChan, minAmpl)},
194 {
"nSlicesTF", VariantType::Int, 11, {
"number of slices into which a TF is divided"}}}};
Helper for geometry and GRP related CCDB requests.
calibrator class for accumulating integrated clusters
void checkUpdates(o2::framework::ProcessingContext &pc)
bool finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj)
static int getNHBFPerTF()
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
void endOfStream(EndOfStreamContext &eos) final
This is invoked whenever we have an EndOfStream event.
void finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj) final
void init(framework::InitContext &ic) final
FITIntegrateClusters(std::shared_ptr< o2::base::GRPGeomRequest > req, const bool disableWriter, const int minNChan, const int minAmpl)
\constructor
void run(ProcessingContext &pc) final
void snapshot(const Output &spec, T const &object)
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.
constexpr o2::header::DataOrigin gDataOriginFDD
constexpr o2::header::DataOrigin gDataOriginFT0
constexpr o2::header::DataOrigin gDataOriginFV0
constexpr int LHCMaxBunches
o2::framework::DataProcessorSpec getFITIntegrateClusterSpec(const bool disableWriter, const int minNChan, const int minAmpl)
Defining PrimaryVertex explicitly as messageable.
std::vector< ConfigParamSpec > Options
TFitResultPtr fit(const size_t nBins, const T *arr, const T xMin, const T xMax, TF1 &func, std::string_view option="")
struct o2::upgrades_utils::@459 fdd
Collision labels.
struct o2::upgrades_utils::@462 ft0
structure to keep V0C information
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)
static constexpr header::DataDescription getDataDescriptionFITTFId()
static constexpr header::DataOrigin getDataOrigin()
static std::string getCCDBPath()
static constexpr header::DataDescription getDataDescriptionFITC()
static std::string getName()
static constexpr header::DataDescription getDataDescriptionCCDB()
static std::string getCCDBPath()
static constexpr header::DataOrigin getDataOrigin()
static constexpr header::DataDescription getDataDescriptionCCDB()
static std::string getName()
static constexpr header::DataDescription getDataDescriptionFITC()
static constexpr header::DataDescription getDataDescriptionFITTFId()
static constexpr header::DataDescription getDataDescriptionCCDB()
static constexpr header::DataDescription getDataDescriptionFITTFId()
static constexpr header::DataDescription getDataDescriptionFITC()
static constexpr header::DataOrigin getDataOrigin()
static std::string getName()
static std::string getCCDBPath()
struct containing the integrated FDD currents
struct containing the integrated FT0 currents
struct containing the integrated FV0 currents
std::vector< Cluster > clusters