Skip to content

Commit 221cacb

Browse files
committed
TRD: add optional(default=off) extra table for PID studies
Signed-off-by: Felix Schlepper <felix.schlepper@cern.ch>
1 parent 5a7fba3 commit 221cacb

File tree

4 files changed

+159
-17
lines changed

4 files changed

+159
-17
lines changed

Detectors/AOD/include/AODProducerWorkflow/AODProducerWorkflowSpec.h

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#include "DataFormatsGlobalTracking/RecoContainer.h"
2020
#include "DataFormatsPHOS/Cell.h"
2121
#include "DataFormatsTRD/TrackTRD.h"
22+
#include "TRDBase/PadCalibrationsAliases.h"
23+
#include "DataFormatsTRD/NoiseCalibration.h"
2224
#include "DetectorsBase/GRPGeomHelper.h"
2325
#include "DetectorsBase/Propagator.h"
2426
#include "Framework/DataProcessorSpec.h"
@@ -215,7 +217,7 @@ enum struct AODProducerStreamerFlags : uint8_t {
215217
class AODProducerWorkflowDPL : public Task
216218
{
217219
public:
218-
AODProducerWorkflowDPL(GID::mask_t src, std::shared_ptr<DataRequest> dataRequest, std::shared_ptr<o2::base::GRPGeomRequest> gr, bool enableSV, bool useMC = true, bool enableFITextra = false) : mUseMC(useMC), mEnableSV(enableSV), mEnableFITextra(enableFITextra), mInputSources(src), mDataRequest(dataRequest), mGGCCDBRequest(gr) {}
220+
AODProducerWorkflowDPL(GID::mask_t src, std::shared_ptr<DataRequest> dataRequest, std::shared_ptr<o2::base::GRPGeomRequest> gr, bool enableSV, bool useMC = true, bool enableFITextra = false, bool enableTRDextra = false) : mUseMC(useMC), mEnableSV(enableSV), mEnableFITextra(enableFITextra), mEnableTRDextra(enableTRDextra), mInputSources(src), mDataRequest(dataRequest), mGGCCDBRequest(gr) {}
219221
~AODProducerWorkflowDPL() override = default;
220222
void init(InitContext& ic) final;
221223
void run(ProcessingContext& pc) final;
@@ -245,6 +247,9 @@ class AODProducerWorkflowDPL : public Task
245247
o2::dataformats::MeanVertexObject mVtx;
246248
float mMinPropR{o2::constants::geom::XTPCInnerRef + 0.1f};
247249

250+
const o2::trd::LocalGainFactor* mTRDLocalGain; // TRD local gain factors from krypton calibration
251+
const o2::trd::NoiseStatusMCM* mTRDNoiseMap; // TRD noise map
252+
248253
std::unordered_set<GIndex> mGIDUsedBySVtx;
249254
std::unordered_set<GIndex> mGIDUsedByStr;
250255

@@ -255,6 +260,7 @@ class AODProducerWorkflowDPL : public Task
255260
bool mUseMC = true;
256261
bool mEnableSV = true; // enable secondary vertices
257262
bool mEnableFITextra = false;
263+
bool mEnableTRDextra = false;
258264
bool mFieldON = false;
259265
const float cSpeed = 0.029979246f; // speed of light in TOF units
260266

@@ -517,6 +523,9 @@ class AODProducerWorkflowDPL : public Task
517523
template <typename TracksQACursorType>
518524
void addToTracksQATable(TracksQACursorType& tracksQACursor, TrackQA& trackQAInfoHolder);
519525

526+
template <typename TRDsExtraCursorType>
527+
void addToTRDsExtra(const o2::globaltracking::RecoContainer& recoData, TRDsExtraCursorType& trdExtraCursor, const GIndex& trkIdx, int trkTableIdx);
528+
520529
template <typename mftTracksCursorType, typename AmbigMFTTracksCursorType>
521530
void addToMFTTracksTable(mftTracksCursorType& mftTracksCursor, AmbigMFTTracksCursorType& ambigMFTTracksCursor,
522531
GIndex trackID, const o2::globaltracking::RecoContainer& data, int collisionID,
@@ -536,7 +545,7 @@ class AODProducerWorkflowDPL : public Task
536545
// helper for track tables
537546
// * fills tables collision by collision
538547
// * interaction time is for TOF information
539-
template <typename TracksCursorType, typename TracksCovCursorType, typename TracksExtraCursorType, typename TracksQACursorType, typename AmbigTracksCursorType,
548+
template <typename TracksCursorType, typename TracksCovCursorType, typename TracksExtraCursorType, typename TracksQACursorType, typename TRDsExtraCursorType, typename AmbigTracksCursorType,
540549
typename MFTTracksCursorType, typename MFTTracksCovCursorType, typename AmbigMFTTracksCursorType,
541550
typename FwdTracksCursorType, typename FwdTracksCovCursorType, typename AmbigFwdTracksCursorType, typename FwdTrkClsCursorType>
542551
void fillTrackTablesPerCollision(int collisionID,
@@ -548,6 +557,7 @@ class AODProducerWorkflowDPL : public Task
548557
TracksCovCursorType& tracksCovCursor,
549558
TracksExtraCursorType& tracksExtraCursor,
550559
TracksQACursorType& tracksQACursor,
560+
TRDsExtraCursorType& trdsExtraCursor,
551561
AmbigTracksCursorType& ambigTracksCursor,
552562
MFTTracksCursorType& mftTracksCursor,
553563
MFTTracksCovCursorType& mftTracksCovCursor,
@@ -672,7 +682,7 @@ class AODProducerWorkflowDPL : public Task
672682
};
673683

674684
/// create a processor spec
675-
framework::DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, bool enableST, bool useMC, bool CTPConfigPerRun, bool enableFITextra);
685+
framework::DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, bool enableST, bool useMC, bool CTPConfigPerRun, bool enableFITextra, bool enableTRDextra);
676686

677687
// helper interface for calo cells to "befriend" emcal and phos cells
678688
class CellHelper

Detectors/AOD/src/AODProducerWorkflowSpec.cxx

Lines changed: 122 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
#include "DataFormatsPHOS/TriggerRecord.h"
3434
#include "DataFormatsPHOS/EventHandler.h"
3535
#include "DataFormatsTPC/TrackTPC.h"
36-
#include "DataFormatsTRD/TriggerRecord.h"
3736
#include "DataFormatsZDC/BCRecData.h"
3837
#include "DataFormatsZDC/ZDCEnergy.h"
3938
#include "DataFormatsZDC/ZDCTDCData.h"
@@ -45,6 +44,10 @@
4544
#include "CommonDataFormat/InteractionRecord.h"
4645
#include "DataFormatsTRD/TrackTRD.h"
4746
#include "DataFormatsTRD/TrackTriggerRecord.h"
47+
#include "DataFormatsTRD/Tracklet64.h"
48+
#include "DataFormatsTRD/CalibratedTracklet.h"
49+
#include "DataFormatsTRD/TriggerRecord.h"
50+
#include "DataFormatsTRD/Tracklet64.h"
4851
#include "DataFormatsGlobalTracking/RecoContainer.h"
4952
#include "Framework/AnalysisDataModel.h"
5053
#include "Framework/ConfigParamRegistry.h"
@@ -387,6 +390,83 @@ void AODProducerWorkflowDPL::addToTracksQATable(TracksQACursorType& tracksQACurs
387390
trackQAInfoHolder.dTofdZ);
388391
}
389392

393+
template <typename TRDsExtraCursorType>
394+
void AODProducerWorkflowDPL::addToTRDsExtra(const o2::globaltracking::RecoContainer& recoData, TRDsExtraCursorType& trdExtraCursor, const GIndex& trkIdx, int trkTableIdx)
395+
{
396+
static int q0s[6] = {-1}, q1s[6] = {-1}, q2s[6] = {-1};
397+
static float q0sCor[6] = {-1}, q1sCor[6] = {-1}, q2sCor[6] = {-1};
398+
static float ttgls[6] = {-999}, tphis[6] = {-999};
399+
bool isDynamic = false;
400+
401+
auto contributorsGID = recoData.getSingleDetectorRefs(trkIdx);
402+
if (!contributorsGID[GIndex::Source::TRD].isIndexSet()) { // should be redunant
403+
return;
404+
}
405+
const auto& trk = recoData.getTrack<o2::trd::TrackTRD>(contributorsGID[GIndex::Source::TRD]);
406+
auto trkC = trk;
407+
const auto& trklets = recoData.getTRDTracklets();
408+
const auto& ctrklets = recoData.getTRDCalibratedTracklets();
409+
for (int iLay{0}; iLay < 6; ++iLay) {
410+
q0s[iLay] = q1s[iLay] = q2s[iLay] = -1;
411+
q0sCor[iLay] = q1sCor[iLay] = q2sCor[iLay] = -1;
412+
tphis[iLay] = ttgls[iLay] = -999;
413+
auto trkltId = trk.getTrackletIndex(iLay);
414+
if (trkltId < 0) {
415+
continue;
416+
}
417+
const auto& tracklet = trklets[trkltId];
418+
if (mTRDNoiseMap->isTrackletFromNoisyMCM(tracklet)) {
419+
continue;
420+
}
421+
// we need to propagate into TRD local system
422+
int trkltDet = tracklet.getDetector();
423+
int trkltSec = trkltDet / 30;
424+
if (trkltSec != o2::math_utils::angle2Sector(trkC.getAlpha())) {
425+
if (!trkC.rotate(o2::math_utils::sector2Angle(trkltSec))) {
426+
break;
427+
}
428+
}
429+
if (!o2::base::Propagator::Instance()->PropagateToXBxByBz(trkC, ctrklets[trkltId].getX(), o2::base::Propagator::MAX_SIN_PHI, o2::base::Propagator::MAX_STEP, mMatCorr)) {
430+
break;
431+
}
432+
if (!isDynamic && (tracklet.getFormat() & 0x1) != 0) {
433+
isDynamic = true;
434+
}
435+
436+
auto tphi = trkC.getSnp() / std::sqrt((1.f - trkC.getSnp()) * (1.f + trkC.getSnp()));
437+
auto trackletLength = std::sqrt(1.f + tphi * tphi + trkC.getTgl() * trkC.getTgl());
438+
float cor = mTRDLocalGain->getValue(tracklet.getHCID() / 2, tracklet.getPadCol(), tracklet.getPadRow()) * trackletLength;
439+
q0s[iLay] = tracklet.getQ0();
440+
q1s[iLay] = tracklet.getQ1();
441+
q2s[iLay] = tracklet.getQ2();
442+
q0sCor[iLay] = (float)tracklet.getQ0() / cor;
443+
q1sCor[iLay] = (float)tracklet.getQ1() / cor;
444+
q2sCor[iLay] = (float)tracklet.getQ2() / cor;
445+
ttgls[iLay] = trkC.getTgl();
446+
tphis[iLay] = tphi;
447+
448+
// z-row merging
449+
if (trk.getIsCrossingNeighbor(iLay) && trk.getHasNeighbor()) {
450+
for (const auto& trklt : trklets) {
451+
if (tracklet.getTrackletWord() == trklt.getTrackletWord()) {
452+
continue;
453+
}
454+
if (std::abs(tracklet.getPadCol() - trklt.getPadCol()) <= 1 && std::abs(tracklet.getPadRow() - trklt.getPadRow()) == 1) {
455+
cor = mTRDLocalGain->getValue(trklt.getHCID() / 2, trklt.getPadCol(), trklt.getPadRow()) * trackletLength;
456+
q0s[iLay] += trklt.getQ0();
457+
q1s[iLay] += trklt.getQ1();
458+
q2s[iLay] += trklt.getQ2();
459+
q0sCor[iLay] += (float)trklt.getQ0() / cor;
460+
q1sCor[iLay] += (float)trklt.getQ1() / cor;
461+
q2sCor[iLay] += (float)trklt.getQ2() / cor;
462+
}
463+
}
464+
}
465+
}
466+
467+
trdExtraCursor(trkTableIdx, isDynamic, q0s, q1s, q2s, q0sCor, q1sCor, q2sCor, ttgls, tphis);
468+
}
469+
390470
template <typename mftTracksCursorType, typename AmbigMFTTracksCursorType>
391471
void AODProducerWorkflowDPL::addToMFTTracksTable(mftTracksCursorType& mftTracksCursor, AmbigMFTTracksCursorType& ambigMFTTracksCursor,
392472
GIndex trackID, const o2::globaltracking::RecoContainer& data, int collisionID,
@@ -428,7 +508,7 @@ void AODProducerWorkflowDPL::addToMFTTracksTable(mftTracksCursorType& mftTracksC
428508
}
429509
}
430510

431-
template <typename TracksCursorType, typename TracksCovCursorType, typename TracksExtraCursorType, typename TracksQACursorType, typename AmbigTracksCursorType,
511+
template <typename TracksCursorType, typename TracksCovCursorType, typename TracksExtraCursorType, typename TracksQACursorType, typename TRDsExtraCursor, typename AmbigTracksCursorType,
432512
typename MFTTracksCursorType, typename MFTTracksCovCursorType, typename AmbigMFTTracksCursorType,
433513
typename FwdTracksCursorType, typename FwdTracksCovCursorType, typename AmbigFwdTracksCursorType, typename FwdTrkClsCursorType>
434514
void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
@@ -440,6 +520,7 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
440520
TracksCovCursorType& tracksCovCursor,
441521
TracksExtraCursorType& tracksExtraCursor,
442522
TracksQACursorType& tracksQACursor,
523+
TRDsExtraCursor& trdsExtraCursor,
443524
AmbigTracksCursorType& ambigTracksCursor,
444525
MFTTracksCursorType& mftTracksCursor,
445526
MFTTracksCovCursorType& mftTracksCovCursor,
@@ -538,6 +619,10 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
538619
}
539620
addToTracksExtraTable(tracksExtraCursor, extraInfoHolder);
540621

622+
if (mEnableTRDextra && trackIndex.includesDet(GIndex::Source::TRD)) {
623+
addToTRDsExtra(data, trdsExtraCursor, trackIndex, mTableTrID);
624+
}
625+
541626
// collecting table indices of barrel tracks for V0s table
542627
if (extraInfoHolder.bcSlice[0] >= 0 && collisionID < 0) {
543628
ambigTracksCursor(mTableTrID, extraInfoHolder.bcSlice);
@@ -1110,7 +1195,7 @@ void AODProducerWorkflowDPL::fillMCTrackLabelsTable(MCTrackLabelCursorType& mcTr
11101195
if (!needToStore(mGIDToTableID)) {
11111196
continue;
11121197
}
1113-
if (mcTruth.isValid()) { // if not set, -1 will be stored
1198+
if (mcTruth.isValid()) { // if not set, -1 will be stored
11141199
labelHolder.labelID = (mToStore[mcTruth.getSourceID()][mcTruth.getEventID()])[mcTruth.getTrackID()]; // defined by TPC if it contributes, otherwise: by ITS
11151200
if (mcTruth.isFake()) {
11161201
labelHolder.labelMask |= (0x1 << 15);
@@ -1832,11 +1917,8 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
18321917
auto trackedV0Cursor = createTableCursor<o2::aod::TrackedV0s>(pc);
18331918
auto tracked3BodyCurs = createTableCursor<o2::aod::Tracked3Bodys>(pc);
18341919
auto fddCursor = createTableCursor<o2::aod::FDDs>(pc);
1835-
auto fddExtraCursor = createTableCursor<o2::aod::FDDsExtra>(pc);
18361920
auto ft0Cursor = createTableCursor<o2::aod::FT0s>(pc);
1837-
auto ft0ExtraCursor = createTableCursor<o2::aod::FT0sExtra>(pc);
18381921
auto fv0aCursor = createTableCursor<o2::aod::FV0As>(pc);
1839-
auto fv0aExtraCursor = createTableCursor<o2::aod::FV0AsExtra>(pc);
18401922
auto fwdTracksCursor = createTableCursor<o2::aod::StoredFwdTracks>(pc);
18411923
auto fwdTracksCovCursor = createTableCursor<o2::aod::StoredFwdTracksCov>(pc);
18421924
auto fwdTrkClsCursor = createTableCursor<o2::aod::FwdTrkCls>(pc);
@@ -1857,6 +1939,19 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
18571939
auto cpvClustersCursor = createTableCursor<o2::aod::CPVClusters>(pc);
18581940
auto originCursor = createTableCursor<o2::aod::Origins>(pc);
18591941

1942+
/// Extra tables
1943+
o2::framework::Produces<o2::aod::FT0sExtra> ft0ExtraCursor;
1944+
o2::framework::Produces<o2::aod::FDDsExtra> fddExtraCursor;
1945+
o2::framework::Produces<o2::aod::FV0AsExtra> fv0aExtraCursor;
1946+
if (mEnableFITextra) {
1947+
ft0ExtraCursor = createTableCursor<o2::aod::FT0sExtra>(pc);
1948+
fddExtraCursor = createTableCursor<o2::aod::FDDsExtra>(pc);
1949+
fv0aExtraCursor = createTableCursor<o2::aod::FV0AsExtra>(pc);
1950+
}
1951+
o2::framework::Produces<o2::aod::TRDsExtra> trdExtraCursor;
1952+
if (mEnableTRDextra) {
1953+
trdExtraCursor = createTableCursor<o2::aod::TRDsExtra>(pc);
1954+
}
18601955
// Declare MC cursors type without adding the output for a table
18611956
o2::framework::Produces<o2::aod::McCollisionLabels> mcColLabelsCursor;
18621957
o2::framework::Produces<o2::aod::McCollisions> mcCollisionsCursor;
@@ -2199,7 +2294,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
21992294
// so that all unassigned tracks are stored in the beginning of the table together
22002295
auto& trackRef = primVer2TRefs.back(); // references to unassigned tracks are at the end
22012296
// fixme: interaction time is undefined for unassigned tracks (?)
2202-
fillTrackTablesPerCollision(-1, std::uint64_t(-1), trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor,
2297+
fillTrackTablesPerCollision(-1, std::uint64_t(-1), trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor, trdExtraCursor,
22032298
ambigTracksCursor, mftTracksCursor, mftTracksCovCursor, ambigMFTTracksCursor,
22042299
fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, fwdTrkClsCursor, bcsMap);
22052300

@@ -2241,7 +2336,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
22412336

22422337
auto& trackRef = primVer2TRefs[collisionID];
22432338
// passing interaction time in [ps]
2244-
fillTrackTablesPerCollision(collisionID, globalBC, trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor, ambigTracksCursor,
2339+
fillTrackTablesPerCollision(collisionID, globalBC, trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor, trdExtraCursor, ambigTracksCursor,
22452340
mftTracksCursor, mftTracksCovCursor, ambigMFTTracksCursor,
22462341
fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, fwdTrkClsCursor, bcsMap);
22472342
collisionID++;
@@ -2892,6 +2987,11 @@ void AODProducerWorkflowDPL::updateTimeDependentParams(ProcessingContext& pc)
28922987
mFieldON = std::abs(o2::base::Propagator::Instance()->getNominalBz()) > 0.01;
28932988

28942989
pc.inputs().get<o2::ctp::CTPConfiguration*>("ctpconfig");
2990+
2991+
if (mEnableTRDextra) {
2992+
mTRDLocalGain = pc.inputs().get<o2::trd::LocalGainFactor*>("trdlocalgainfactors").get();
2993+
mTRDNoiseMap = pc.inputs().get<o2::trd::NoiseStatusMCM*>("trdnoisemap").get();
2994+
}
28952995
}
28962996
if (mPropTracks) {
28972997
pc.inputs().get<o2::dataformats::MeanVertexObject*>("meanvtx");
@@ -3103,7 +3203,7 @@ void AODProducerWorkflowDPL::endOfStream(EndOfStreamContext& /*ec*/)
31033203
mStreamer.reset();
31043204
}
31053205

3106-
DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, bool enableStrangenessTracking, bool useMC, bool CTPConfigPerRun, bool enableFITextra)
3206+
DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, bool enableStrangenessTracking, bool useMC, bool CTPConfigPerRun, bool enableFITextra, bool enableTRDextra)
31073207
{
31083208
auto dataRequest = std::make_shared<DataRequest>();
31093209
dataRequest->inputs.emplace_back("ctpconfig", "CTP", "CTPCONFIG", 0, Lifetime::Condition, ccdbParamSpec("CTP/Config/Config", CTPConfigPerRun));
@@ -3163,11 +3263,8 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
31633263
OutputForTable<Collisions>::spec(),
31643264
OutputForTable<Decay3Bodys>::spec(),
31653265
OutputForTable<FDDs>::spec(),
3166-
OutputForTable<FDDsExtra>::spec(),
31673266
OutputForTable<FT0s>::spec(),
3168-
OutputForTable<FT0sExtra>::spec(),
31693267
OutputForTable<FV0As>::spec(),
3170-
OutputForTable<FV0AsExtra>::spec(),
31713268
OutputForTable<StoredFwdTracks>::spec(),
31723269
OutputForTable<StoredFwdTracksCov>::spec(),
31733270
OutputForTable<StoredMFTTracks>::spec(),
@@ -3195,6 +3292,18 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
31953292
OutputSpec{"AMD", "AODMetadataKeys"},
31963293
OutputSpec{"AMD", "AODMetadataVals"}};
31973294

3295+
/// Extra tables
3296+
if (enableFITextra) {
3297+
outputs.insert(outputs.end(),
3298+
{OutputForTable<FDDsExtra>::spec(),
3299+
OutputForTable<FT0sExtra>::spec(),
3300+
OutputForTable<FV0AsExtra>::spec()});
3301+
}
3302+
if (enableTRDextra) {
3303+
outputs.push_back(OutputForTable<TRDsExtra>::spec());
3304+
dataRequest->inputs.emplace_back("trdlocalgainfactors", "TRD", "LOCALGAINFACTORS", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/LocalGainFactor"));
3305+
dataRequest->inputs.emplace_back("trdnoisemap", "TRD", "NOISEMAP", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/NoiseMapMCM"));
3306+
}
31983307
if (useMC) {
31993308
outputs.insert(outputs.end(),
32003309
{OutputForTable<McCollisions>::spec(),
@@ -3217,7 +3326,7 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
32173326
"aod-producer-workflow",
32183327
dataRequest->inputs,
32193328
outputs,
3220-
AlgorithmSpec{adaptFromTask<AODProducerWorkflowDPL>(src, dataRequest, ggRequest, enableSV, useMC, enableFITextra)},
3329+
AlgorithmSpec{adaptFromTask<AODProducerWorkflowDPL>(src, dataRequest, ggRequest, enableSV, useMC, enableFITextra, enableTRDextra)},
32213330
Options{
32223331
ConfigParamSpec{"run-number", VariantType::Int64, -1L, {"The run-number. If left default we try to get it from DPL header."}},
32233332
ConfigParamSpec{"aod-timeframe-id", VariantType::Int64, -1L, {"Set timeframe number"}},

0 commit comments

Comments
 (0)