15#include <TAffineConverter.h>
17#include <TTimingChargeData.h>
29const TString kNoConversion =
"no_conversion";
33constexpr int kReflectionThreshold = 8;
37 : fInData(nullptr), fOutData(nullptr),
38 fTimingConverterArray(nullptr), fChargeConverterArray(nullptr),
39 fPositionConverterArray(nullptr) {
40 RegisterInputCollection(
"InputCollection",
"Array of TMUXData objects",
42 RegisterOutputCollection(
"OutputCollection",
"Output array of TTimingChargeData objects",
45 RegisterProcessorParameter(
"TimingConverterArray",
46 "Timing parameter object of TAffineConverter",
48 RegisterProcessorParameter(
"ChargeConverterArray",
49 "Energy parameter object of TAffineConverter",
51 RegisterProcessorParameter(
"PositionConverterArray",
52 "Position parameter object of TMUXPositionConverter",
55 RegisterProcessorParameter(
"HasReflection",
"Reverse strip order (0--7) if true",
57 RegisterProcessorParameter(
"InputIsDigital",
"Add randomness if true",
78 auto initConverterArray = [
this, col](
const TString &name, TClonesArray *&array,
const char *paramName) {
79 if (name == kNoConversion) {
80 Warning(
"Init",
"Parameter '%s' is not set. Using no conversion.", paramName);
85 col, name,
"TClonesArray",
"art::TConverterBase");
86 if (std::holds_alternative<TString>(result)) {
87 Warning(
"Init", std::get<TString>(result));
90 array = std::get<TClonesArray *>(result);
98 if (std::holds_alternative<TString>(result)) {
99 SetStateError(std::get<TString>(result));
102 fInData = std::get<TClonesArray **>(result);
109 SetStateError(
"Position parameters are required");
113 fOutData =
new TClonesArray(
"art::TTimingChargeData");
134 Warning(
"Process",
"No Input Data object");
138 const int nData = (*fInData)->GetEntriesFast();
141 else if (nData > 1) {
142 Warning(
"Process",
"It doesn't support multi-data currently");
146 const auto *data =
dynamic_cast<const TMUXData *
>((*fInData)->At(0));
154 if (!IsValid(hit1_detid))
157 if (
fHasReflection && hit1_detid >= 0 && hit1_detid < kReflectionThreshold) {
158 hit1_detid = kReflectionThreshold - 1 - hit1_detid;
161 auto *outData =
static_cast<TTimingChargeData *
>(
fOutData->ConstructedAt(0));
162 outData->SetID(hit1_detid);
176 return converter ? converter->
Convert(pos) : kInvalidD;
189 auto *converter =
static_cast<TAffineConverter *
>(converterArray->At(
id));
190 return converter ? converter->Convert(raw) : raw;
ClassImp(art::crib::TMUXCalibrationProcessor)
ROOT macro for class implementation.
Processor for calibrating timing, charge, and position data in the MUX system.
Header file for the TMUXData class.
Utility functions for handling input and parameter objects in TEventCollection.
Handles the calibration of timing, charge, and position data in the MUX system.
~TMUXCalibrationProcessor() override
Destructor.
Bool_t fHasReflection
Indicates whether to apply reflection to the detector ID.
TClonesArray * fChargeConverterArray
! Pointer to the charge converter array.
TClonesArray * fTimingConverterArray
! Pointer to the timing converter array.
double CalibrateValue(double raw, int id, const TClonesArray *converterArray) const
Calibrates a raw value (e.g., timing or charge) using the specified converter array.
Bool_t fInputIsDigital
Indicates whether the input data is digital.
TMUXCalibrationProcessor()
Constructor.
TClonesArray * fOutData
! Pointer to the output data collection.
TString fPositionConverterArrayName
Name of the position converter array parameter.
TClonesArray ** fInData
! Pointer to the input data collection.
TString fChargeConverterArrayName
Name of the charge converter array parameter.
TString fTimingConverterArrayName
Name of the timing converter array parameter.
void Process() override
Processes the input data, applies calibration, and stores the results.
TString fInputColName
Name of the input collection.
double ConvertPosition(double pos, int id) const
Converts a raw position value to a detector ID using the position converter array.
TString fOutputColName
Name of the output collection.
void Init(TEventCollection *col) override
Initializes the processor by setting up input and output collections.
TClonesArray * fPositionConverterArray
! Pointer to the position converter array.
Represents data from the MUX module (E1, E2, P1, P2, T).
A class for loading and converting MUX position parameters.
Double_t Convert(Double_t val) const override
Converts a value based on the loaded parameters.
std::enable_if_t< std::is_base_of_v< TObject, T >, std::variant< T **, TString > > GetInputObject(TEventCollection *col, const TString &name, const TString &expectedTypeName, const TString &elementTypeName="TObject")
Retrieve an object from TEventCollection with type validation.
std::enable_if_t< std::is_base_of_v< TObject, T >, std::variant< T *, TString > > GetParameterObject(TEventCollection *col, const TString &name, const TString &expectedTypeName, const TString &elementTypeName="art::TParameterObject")
Retrieves a parameter object from a TEventCollection.