Skip to content

Commit ea35977

Browse files
matthias-kleinerwiechula
authored andcommitted
TPC: Merging SAC CCDB files into one object
- adding option to enable/disable writing of FFT coefficients to the CCDB
1 parent 2abc6f4 commit ea35977

File tree

5 files changed

+38
-38
lines changed

5 files changed

+38
-38
lines changed

Detectors/TPC/base/include/TPCBase/CDBTypes.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ enum class CDBType {
6666
CalSAC1, ///< I_1(t) = <I(r,\phi,t) / I_0(r,\phi)>_{r,\phi}
6767
CalSACDelta, ///< \Delta I(r,\phi,t) = I(r,\phi,t) / ( I_0(r,\phi) * I_1(t) )
6868
CalSACFourier, ///< Fourier coefficients of CalSAC1
69+
CalSAC, ///< CalSAC0, CalSAC1 and CalSACDelta
6970
///
7071
CalITPC0, ///< 2D average TPC clusters for longer time interval
7172
CalITPC1, ///< 1D integrated TPC clusters
@@ -133,6 +134,7 @@ const std::unordered_map<CDBType, const std::string> CDBTypeMap{
133134
{CDBType::CalSAC0, "TPC/Calib/SAC_0"},
134135
{CDBType::CalSAC1, "TPC/Calib/SAC_1"},
135136
{CDBType::CalSACDelta, "TPC/Calib/SAC_DELTA"},
137+
{CDBType::CalSAC, "TPC/Calib/SAC"},
136138
{CDBType::CalSACFourier, "TPC/Calib/SAC_FOURIER"},
137139
// ITPCCs
138140
{CDBType::CalITPC0, "TPC/Calib/ITPCC_0"},

Detectors/TPC/calibration/include/TPCCalibration/IDCContainer.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,14 @@ struct SACDelta {
402402
std::array<IDCDelta<DataT>, SIDES> mSACDelta{};
403403
};
404404

405+
/// container to be written to CCDB
406+
template <typename DataT>
407+
struct SAC {
408+
SACZero mSACZero{};
409+
SACOne mSACOne{};
410+
SACDelta<DataT> mSACDelta{};
411+
};
412+
405413
struct FourierCoeffSAC {
406414
std::array<FourierCoeff, SIDES> mCoeff{};
407415
};

Detectors/TPC/calibration/src/TPCCalibrationLinkDef.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@
9696
#pragma link C++ struct o2::tpc::SACDelta < float> + ;
9797
#pragma link C++ struct o2::tpc::SACDelta < unsigned short> + ;
9898
#pragma link C++ struct o2::tpc::SACDelta < unsigned char> + ;
99+
#pragma link C++ struct o2::tpc::SAC < float> + ;
100+
#pragma link C++ struct o2::tpc::SAC < unsigned short> + ;
101+
#pragma link C++ struct o2::tpc::SAC < unsigned char> + ;
99102
#pragma link C++ struct o2::tpc::SACZero + ;
100103
#pragma link C++ struct o2::tpc::SACOne + ;
101104
#pragma link C++ struct o2::tpc::FourierCoeffSAC + ;

Detectors/TPC/workflow/include/TPCWorkflow/TPCFactorizeSACSpec.h

Lines changed: 13 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,7 @@ class TPCFactorizeSACSpec : public o2::framework::Task
8282
static constexpr header::DataDescription getDataDescriptionLane() { return header::DataDescription{"SACLANE"}; }
8383

8484
// for CCDB
85-
static constexpr header::DataDescription getDataDescriptionCCDBSAC0() { return header::DataDescription{"TPC_CalibSAC0"}; }
86-
static constexpr header::DataDescription getDataDescriptionCCDBSAC1() { return header::DataDescription{"TPC_CalibSAC1"}; }
87-
static constexpr header::DataDescription getDataDescriptionCCDBSACDelta() { return header::DataDescription{"TPC_SACDelta"}; }
85+
static constexpr header::DataDescription getDataDescriptionCCDBSAC() { return header::DataDescription{"TPC_CalibSAC"}; }
8886

8987
private:
9088
SACFactorization mSACFactorization; ///< object for performing the factorization of the SACs
@@ -106,42 +104,30 @@ class TPCFactorizeSACSpec : public o2::framework::Task
106104
output.snapshot(Output{gDataOriginTPC, getDataDescriptionTimeStamp()}, std::vector<uint64_t>{timeStampStart, timeStampEnd});
107105
output.snapshot(Output{gDataOriginTPC, getDataDescriptionLane()}, mLaneId);
108106

109-
o2::ccdb::CcdbObjectInfo ccdbInfoSAC0(CDBTypeMap.at(CDBType::CalSAC0), std::string{}, std::string{}, std::map<std::string, std::string>{}, timeStampStart, timeStampEnd);
110-
auto imageSAC0 = o2::ccdb::CcdbApi::createObjectImage(&mSACFactorization.getSACZero(), &ccdbInfoSAC0);
111-
LOGP(info, "Sending object {} / {} of size {} bytes, valid for {} : {} ", ccdbInfoSAC0.getPath(), ccdbInfoSAC0.getFileName(), imageSAC0->size(), ccdbInfoSAC0.getStartValidityTimestamp(), ccdbInfoSAC0.getEndValidityTimestamp());
112-
output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, getDataDescriptionCCDBSAC0(), 0}, *imageSAC0.get());
113-
output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, getDataDescriptionCCDBSAC0(), 0}, ccdbInfoSAC0);
114-
115-
o2::ccdb::CcdbObjectInfo ccdbInfoSAC1(CDBTypeMap.at(CDBType::CalSAC1), std::string{}, std::string{}, std::map<std::string, std::string>{}, timeStampStart, timeStampEnd);
116-
auto imageSAC1 = o2::ccdb::CcdbApi::createObjectImage(&mSACFactorization.getSACOne(), &ccdbInfoSAC1);
117-
LOGP(info, "Sending object {} / {} of size {} bytes, valid for {} : {} ", ccdbInfoSAC1.getPath(), ccdbInfoSAC1.getFileName(), imageSAC1->size(), ccdbInfoSAC1.getStartValidityTimestamp(), ccdbInfoSAC1.getEndValidityTimestamp());
118-
output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, getDataDescriptionCCDBSAC1(), 0}, *imageSAC1.get());
119-
output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, getDataDescriptionCCDBSAC1(), 0}, ccdbInfoSAC1);
120-
121-
o2::ccdb::CcdbObjectInfo ccdbInfoSACDelta(CDBTypeMap.at(CDBType::CalSACDelta), std::string{}, std::string{}, std::map<std::string, std::string>{}, timeStampStart, timeStampEnd);
107+
o2::ccdb::CcdbObjectInfo ccdbInfoSAC(CDBTypeMap.at(CDBType::CalSAC), std::string{}, std::string{}, std::map<std::string, std::string>{}, timeStampStart, timeStampEnd);
122108

123109
std::unique_ptr<std::vector<char>> imageSACDelta{};
124110
switch (mCompressionDeltaSAC) {
125111
case SACFactorization::SACDeltaCompression::MEDIUM:
126112
default: {
127-
const SACDelta<unsigned short> sacDelta = mSACFactorization.getSACDeltaMediumCompressed();
128-
imageSACDelta = o2::ccdb::CcdbApi::createObjectImage(&sacDelta, &ccdbInfoSACDelta);
113+
SAC<unsigned short> sacContainer{mSACFactorization.getSACZero(), mSACFactorization.getSACOne(), mSACFactorization.getSACDeltaMediumCompressed()};
114+
imageSACDelta = o2::ccdb::CcdbApi::createObjectImage(&sacContainer, &ccdbInfoSAC);
129115
break;
130116
}
131117
case SACFactorization::SACDeltaCompression::HIGH: {
132-
const SACDelta<unsigned char> sacDelta = mSACFactorization.getSACDeltaHighCompressed();
133-
imageSACDelta = o2::ccdb::CcdbApi::createObjectImage(&sacDelta, &ccdbInfoSACDelta);
118+
SAC<unsigned char> sacContainer{mSACFactorization.getSACZero(), mSACFactorization.getSACOne(), mSACFactorization.getSACDeltaHighCompressed()};
119+
imageSACDelta = o2::ccdb::CcdbApi::createObjectImage(&sacContainer, &ccdbInfoSAC);
134120
break;
135121
}
136122
case SACFactorization::SACDeltaCompression::NO:
137-
SACDelta<float> sacDelta = std::move(mSACFactorization).getSACDeltaUncompressed();
138-
imageSACDelta = o2::ccdb::CcdbApi::createObjectImage(&sacDelta, &ccdbInfoSACDelta);
123+
SAC<float> sacContainer{mSACFactorization.getSACZero(), mSACFactorization.getSACOne(), std::move(mSACFactorization).getSACDeltaUncompressed()};
124+
imageSACDelta = o2::ccdb::CcdbApi::createObjectImage(&sacContainer, &ccdbInfoSAC);
139125
break;
140126
}
141127

142-
LOGP(info, "Sending object {} / {} of size {} bytes, valid for {} : {} ", ccdbInfoSACDelta.getPath(), ccdbInfoSACDelta.getFileName(), imageSACDelta->size(), ccdbInfoSACDelta.getStartValidityTimestamp(), ccdbInfoSACDelta.getEndValidityTimestamp());
143-
output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, getDataDescriptionCCDBSACDelta(), 0}, *imageSACDelta.get());
144-
output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, getDataDescriptionCCDBSACDelta(), 0}, ccdbInfoSACDelta);
128+
LOGP(info, "Sending object {} / {} of size {} bytes, valid for {} : {} ", ccdbInfoSAC.getPath(), ccdbInfoSAC.getFileName(), imageSACDelta->size(), ccdbInfoSAC.getStartValidityTimestamp(), ccdbInfoSAC.getEndValidityTimestamp());
129+
output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, getDataDescriptionCCDBSAC(), 0}, *imageSACDelta.get());
130+
output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, getDataDescriptionCCDBSAC(), 0}, ccdbInfoSAC);
145131
} else {
146132
LOGP(warning, "Received empty data for SACs! SACs will not be stored for the current aggregation interval!");
147133
}
@@ -153,12 +139,8 @@ class TPCFactorizeSACSpec : public o2::framework::Task
153139
DataProcessorSpec getTPCFactorizeSACSpec(const int lane, const unsigned int timeframes, const SACFactorization::SACFactorization::SACDeltaCompression compression, const bool debug)
154140
{
155141
std::vector<OutputSpec> outputSpecs;
156-
outputSpecs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, TPCFactorizeSACSpec::getDataDescriptionCCDBSAC0()}, Lifetime::Sporadic);
157-
outputSpecs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, TPCFactorizeSACSpec::getDataDescriptionCCDBSAC0()}, Lifetime::Sporadic);
158-
outputSpecs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, TPCFactorizeSACSpec::getDataDescriptionCCDBSAC1()}, Lifetime::Sporadic);
159-
outputSpecs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, TPCFactorizeSACSpec::getDataDescriptionCCDBSAC1()}, Lifetime::Sporadic);
160-
outputSpecs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, TPCFactorizeSACSpec::getDataDescriptionCCDBSACDelta()}, Lifetime::Sporadic);
161-
outputSpecs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, TPCFactorizeSACSpec::getDataDescriptionCCDBSACDelta()}, Lifetime::Sporadic);
142+
outputSpecs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, TPCFactorizeSACSpec::getDataDescriptionCCDBSAC()}, Lifetime::Sporadic);
143+
outputSpecs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, TPCFactorizeSACSpec::getDataDescriptionCCDBSAC()}, Lifetime::Sporadic);
162144

163145
outputSpecs.emplace_back(ConcreteDataMatcher{gDataOriginTPC, TPCFactorizeSACSpec::getDataDescriptionSAC1(), header::DataHeader::SubSpecificationType{Side::A}}, Lifetime::Sporadic);
164146
outputSpecs.emplace_back(ConcreteDataMatcher{gDataOriginTPC, TPCFactorizeSACSpec::getDataDescriptionSAC1(), header::DataHeader::SubSpecificationType{Side::C}}, Lifetime::Sporadic);

Detectors/TPC/workflow/include/TPCWorkflow/TPCFourierTransformAggregatorSpec.h

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class TPCFourierTransformAggregatorSpec : public o2::framework::Task
6363
mIntervalsSACs = ic.options().get<int>("intervalsSACs");
6464
mLengthIDCScalerSeconds = ic.options().get<float>("tpcScalerLengthS");
6565
mDisableScaler = ic.options().get<bool>("disable-scaler");
66+
mEnableFFTCCDB = ic.options().get<bool>("enable-fft-CCDB");
6667
resizeBuffer(mInputLanes);
6768
}
6869

@@ -173,11 +174,13 @@ class TPCFourierTransformAggregatorSpec : public o2::framework::Task
173174
mIDCFourierTransform[side].calcFourierCoefficients(mIntervalsBuffer[mExpectedInputLane].size());
174175

175176
if (!mProcessSACs) {
176-
o2::ccdb::CcdbObjectInfo ccdbInfo(CDBTypeMap.at(((side == 0) ? CDBType::CalIDCFourierA : CDBType::CalIDCFourierC)), std::string{}, std::string{}, std::map<std::string, std::string>{}, mCCDBBuffer[mExpectedInputLane].front(), mCCDBBuffer[mExpectedInputLane].back());
177-
auto imageFFT = o2::ccdb::CcdbApi::createObjectImage(&mIDCFourierTransform[side].getFourierCoefficients(), &ccdbInfo);
178-
LOGP(info, "Sending object {} / {} of size {} bytes, valid for {} : {} ", ccdbInfo.getPath(), ccdbInfo.getFileName(), imageFFT->size(), ccdbInfo.getStartValidityTimestamp(), ccdbInfo.getEndValidityTimestamp());
179-
pc.outputs().snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, getDataDescriptionCCDBFourier(), 0}, *imageFFT.get());
180-
pc.outputs().snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, getDataDescriptionCCDBFourier(), 0}, ccdbInfo);
177+
if (mEnableFFTCCDB) {
178+
o2::ccdb::CcdbObjectInfo ccdbInfo(CDBTypeMap.at(((side == 0) ? CDBType::CalIDCFourierA : CDBType::CalIDCFourierC)), std::string{}, std::string{}, std::map<std::string, std::string>{}, mCCDBBuffer[mExpectedInputLane].front(), mCCDBBuffer[mExpectedInputLane].back());
179+
auto imageFFT = o2::ccdb::CcdbApi::createObjectImage(&mIDCFourierTransform[side].getFourierCoefficients(), &ccdbInfo);
180+
LOGP(info, "Sending object {} / {} of size {} bytes, valid for {} : {} ", ccdbInfo.getPath(), ccdbInfo.getFileName(), imageFFT->size(), ccdbInfo.getStartValidityTimestamp(), ccdbInfo.getEndValidityTimestamp());
181+
pc.outputs().snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, getDataDescriptionCCDBFourier(), 0}, *imageFFT.get());
182+
pc.outputs().snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, getDataDescriptionCCDBFourier(), 0}, ccdbInfo);
183+
}
181184
} else {
182185
coeffSAC.mCoeff[side] = mIDCFourierTransform[side].getFourierCoefficients();
183186
}
@@ -192,7 +195,7 @@ class TPCFourierTransformAggregatorSpec : public o2::framework::Task
192195
}
193196
}
194197

195-
if (mProcessSACs) {
198+
if (mProcessSACs && mEnableFFTCCDB) {
196199
o2::ccdb::CcdbObjectInfo ccdbInfo(CDBTypeMap.at(CDBType::CalSACFourier), std::string{}, std::string{}, std::map<std::string, std::string>{}, mCCDBBuffer[mExpectedInputLane].front(), mCCDBBuffer[mExpectedInputLane].back());
197200
auto imageFFT = o2::ccdb::CcdbApi::createObjectImage(&coeffSAC, &ccdbInfo);
198201
LOGP(info, "Sending object {} / {} of size {} bytes, valid for {} : {} ", ccdbInfo.getPath(), ccdbInfo.getFileName(), imageFFT->size(), ccdbInfo.getStartValidityTimestamp(), ccdbInfo.getEndValidityTimestamp());
@@ -233,6 +236,7 @@ class TPCFourierTransformAggregatorSpec : public o2::framework::Task
233236
long mIDCSCalerEndTSLast = 0; ///< end time stamp of last TPC IDC scaler object to ensure no gapps
234237
o2::tpc::TPCScaler mScalerLast; ///< buffer last scaler to easily add internal overlap for the beginning
235238
bool mDisableScaler{false}; ///< disable the creation of TPC IDC scalers
239+
bool mEnableFFTCCDB{false}; ///< write FFT coefficients to CCDB
236240
int mRun{};
237241
const std::array<std::vector<InputSpec>, 2> mFilter = {std::vector<InputSpec>{{"idcone", ConcreteDataTypeMatcher{o2::header::gDataOriginTPC, TPCFactorizeIDCSpec::getDataDescriptionIDC1()}, Lifetime::Sporadic}},
238242
std::vector<InputSpec>{{"sacone", ConcreteDataTypeMatcher{o2::header::gDataOriginTPC, TPCFactorizeSACSpec::getDataDescriptionSAC1()}, Lifetime::Sporadic}}}; ///< filter for looping over input data
@@ -438,7 +442,8 @@ DataProcessorSpec getTPCFourierTransformAggregatorSpec(const unsigned int rangeI
438442
Options{{"intervalsSACs", VariantType::Int, 11, {"Number of integration intervals which will be sampled for the fourier coefficients"}},
439443
{"dump-coefficients-agg", VariantType::Bool, false, {"Dump fourier coefficients to file"}},
440444
{"tpcScalerLengthS", VariantType::Float, 300.f, {"Length of the TPC scalers in seconds"}},
441-
{"disable-scaler", VariantType::Bool, false, {"Disable creation of IDC scaler"}}}};
445+
{"disable-scaler", VariantType::Bool, false, {"Disable creation of IDC scaler"}},
446+
{"enable-fft-CCDB", VariantType::Bool, false, {"Enable writing of FFT coefficients to CCDB"}}}};
442447
}
443448

444449
} // namespace o2::tpc

0 commit comments

Comments
 (0)