Skip to content

Commit bb91f20

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 bb91f20

File tree

4 files changed

+160
-20
lines changed

4 files changed

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

431-
template <typename TracksCursorType, typename TracksCovCursorType, typename TracksExtraCursorType, typename TracksQACursorType, typename AmbigTracksCursorType,
507+
template <typename TracksCursorType, typename TracksCovCursorType, typename TracksExtraCursorType, typename TracksQACursorType, typename TRDsExtraCursor, typename AmbigTracksCursorType,
432508
typename MFTTracksCursorType, typename MFTTracksCovCursorType, typename AmbigMFTTracksCursorType,
433509
typename FwdTracksCursorType, typename FwdTracksCovCursorType, typename AmbigFwdTracksCursorType, typename FwdTrkClsCursorType>
434510
void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
@@ -440,6 +516,7 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
440516
TracksCovCursorType& tracksCovCursor,
441517
TracksExtraCursorType& tracksExtraCursor,
442518
TracksQACursorType& tracksQACursor,
519+
TRDsExtraCursor& trdsExtraCursor,
443520
AmbigTracksCursorType& ambigTracksCursor,
444521
MFTTracksCursorType& mftTracksCursor,
445522
MFTTracksCovCursorType& mftTracksCovCursor,
@@ -538,6 +615,10 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
538615
}
539616
addToTracksExtraTable(tracksExtraCursor, extraInfoHolder);
540617

618+
if (mEnableTRDextra && trackIndex.includesDet(GIndex::Source::TRD)) {
619+
addToTRDsExtra(data, trdsExtraCursor, trackIndex, mTableTrID);
620+
}
621+
541622
// collecting table indices of barrel tracks for V0s table
542623
if (extraInfoHolder.bcSlice[0] >= 0 && collisionID < 0) {
543624
ambigTracksCursor(mTableTrID, extraInfoHolder.bcSlice);
@@ -1110,7 +1191,7 @@ void AODProducerWorkflowDPL::fillMCTrackLabelsTable(MCTrackLabelCursorType& mcTr
11101191
if (!needToStore(mGIDToTableID)) {
11111192
continue;
11121193
}
1113-
if (mcTruth.isValid()) { // if not set, -1 will be stored
1194+
if (mcTruth.isValid()) { // if not set, -1 will be stored
11141195
labelHolder.labelID = (mToStore[mcTruth.getSourceID()][mcTruth.getEventID()])[mcTruth.getTrackID()]; // defined by TPC if it contributes, otherwise: by ITS
11151196
if (mcTruth.isFake()) {
11161197
labelHolder.labelMask |= (0x1 << 15);
@@ -1832,11 +1913,8 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
18321913
auto trackedV0Cursor = createTableCursor<o2::aod::TrackedV0s>(pc);
18331914
auto tracked3BodyCurs = createTableCursor<o2::aod::Tracked3Bodys>(pc);
18341915
auto fddCursor = createTableCursor<o2::aod::FDDs>(pc);
1835-
auto fddExtraCursor = createTableCursor<o2::aod::FDDsExtra>(pc);
18361916
auto ft0Cursor = createTableCursor<o2::aod::FT0s>(pc);
1837-
auto ft0ExtraCursor = createTableCursor<o2::aod::FT0sExtra>(pc);
18381917
auto fv0aCursor = createTableCursor<o2::aod::FV0As>(pc);
1839-
auto fv0aExtraCursor = createTableCursor<o2::aod::FV0AsExtra>(pc);
18401918
auto fwdTracksCursor = createTableCursor<o2::aod::StoredFwdTracks>(pc);
18411919
auto fwdTracksCovCursor = createTableCursor<o2::aod::StoredFwdTracksCov>(pc);
18421920
auto fwdTrkClsCursor = createTableCursor<o2::aod::FwdTrkCls>(pc);
@@ -1857,6 +1935,19 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
18571935
auto cpvClustersCursor = createTableCursor<o2::aod::CPVClusters>(pc);
18581936
auto originCursor = createTableCursor<o2::aod::Origins>(pc);
18591937

1938+
/// Extra tables
1939+
o2::framework::Produces<o2::aod::FT0sExtra> ft0ExtraCursor;
1940+
o2::framework::Produces<o2::aod::FDDsExtra> fddExtraCursor;
1941+
o2::framework::Produces<o2::aod::FV0AsExtra> fv0aExtraCursor;
1942+
if (mEnableFITextra) {
1943+
ft0ExtraCursor = createTableCursor<o2::aod::FT0sExtra>(pc);
1944+
fddExtraCursor = createTableCursor<o2::aod::FDDsExtra>(pc);
1945+
fv0aExtraCursor = createTableCursor<o2::aod::FV0AsExtra>(pc);
1946+
}
1947+
o2::framework::Produces<o2::aod::TRDsExtra> trdExtraCursor;
1948+
if (mEnableTRDextra) {
1949+
trdExtraCursor = createTableCursor<o2::aod::TRDsExtra>(pc);
1950+
}
18601951
// Declare MC cursors type without adding the output for a table
18611952
o2::framework::Produces<o2::aod::McCollisionLabels> mcColLabelsCursor;
18621953
o2::framework::Produces<o2::aod::McCollisions> mcCollisionsCursor;
@@ -2199,7 +2290,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
21992290
// so that all unassigned tracks are stored in the beginning of the table together
22002291
auto& trackRef = primVer2TRefs.back(); // references to unassigned tracks are at the end
22012292
// fixme: interaction time is undefined for unassigned tracks (?)
2202-
fillTrackTablesPerCollision(-1, std::uint64_t(-1), trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor,
2293+
fillTrackTablesPerCollision(-1, std::uint64_t(-1), trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor, trdExtraCursor,
22032294
ambigTracksCursor, mftTracksCursor, mftTracksCovCursor, ambigMFTTracksCursor,
22042295
fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, fwdTrkClsCursor, bcsMap);
22052296

@@ -2241,7 +2332,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
22412332

22422333
auto& trackRef = primVer2TRefs[collisionID];
22432334
// passing interaction time in [ps]
2244-
fillTrackTablesPerCollision(collisionID, globalBC, trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor, ambigTracksCursor,
2335+
fillTrackTablesPerCollision(collisionID, globalBC, trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor, trdExtraCursor, ambigTracksCursor,
22452336
mftTracksCursor, mftTracksCovCursor, ambigMFTTracksCursor,
22462337
fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, fwdTrkClsCursor, bcsMap);
22472338
collisionID++;
@@ -2892,6 +2983,11 @@ void AODProducerWorkflowDPL::updateTimeDependentParams(ProcessingContext& pc)
28922983
mFieldON = std::abs(o2::base::Propagator::Instance()->getNominalBz()) > 0.01;
28932984

28942985
pc.inputs().get<o2::ctp::CTPConfiguration*>("ctpconfig");
2986+
2987+
if (mEnableTRDextra) {
2988+
mTRDLocalGain = pc.inputs().get<o2::trd::LocalGainFactor*>("trdlocalgainfactors").get();
2989+
mTRDNoiseMap = pc.inputs().get<o2::trd::NoiseStatusMCM*>("trdnoisemap").get();
2990+
}
28952991
}
28962992
if (mPropTracks) {
28972993
pc.inputs().get<o2::dataformats::MeanVertexObject*>("meanvtx");
@@ -3103,7 +3199,7 @@ void AODProducerWorkflowDPL::endOfStream(EndOfStreamContext& /*ec*/)
31033199
mStreamer.reset();
31043200
}
31053201

3106-
DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, bool enableStrangenessTracking, bool useMC, bool CTPConfigPerRun, bool enableFITextra)
3202+
DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, bool enableStrangenessTracking, bool useMC, bool CTPConfigPerRun, bool enableFITextra, bool enableTRDextra)
31073203
{
31083204
auto dataRequest = std::make_shared<DataRequest>();
31093205
dataRequest->inputs.emplace_back("ctpconfig", "CTP", "CTPCONFIG", 0, Lifetime::Condition, ccdbParamSpec("CTP/Config/Config", CTPConfigPerRun));
@@ -3163,11 +3259,8 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
31633259
OutputForTable<Collisions>::spec(),
31643260
OutputForTable<Decay3Bodys>::spec(),
31653261
OutputForTable<FDDs>::spec(),
3166-
OutputForTable<FDDsExtra>::spec(),
31673262
OutputForTable<FT0s>::spec(),
3168-
OutputForTable<FT0sExtra>::spec(),
31693263
OutputForTable<FV0As>::spec(),
3170-
OutputForTable<FV0AsExtra>::spec(),
31713264
OutputForTable<StoredFwdTracks>::spec(),
31723265
OutputForTable<StoredFwdTracksCov>::spec(),
31733266
OutputForTable<StoredMFTTracks>::spec(),
@@ -3195,6 +3288,18 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
31953288
OutputSpec{"AMD", "AODMetadataKeys"},
31963289
OutputSpec{"AMD", "AODMetadataVals"}};
31973290

3291+
/// Extra tables
3292+
if (enableFITextra) {
3293+
outputs.insert(outputs.end(),
3294+
{OutputForTable<FDDsExtra>::spec(),
3295+
OutputForTable<FT0sExtra>::spec(),
3296+
OutputForTable<FV0AsExtra>::spec()});
3297+
}
3298+
if (enableTRDextra) {
3299+
outputs.push_back(OutputForTable<TRDsExtra>::spec());
3300+
dataRequest->inputs.emplace_back("trdlocalgainfactors", "TRD", "LOCALGAINFACTORS", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/LocalGainFactor"));
3301+
dataRequest->inputs.emplace_back("trdnoisemap", "TRD", "NOISEMAP", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/NoiseMapMCM"));
3302+
}
31983303
if (useMC) {
31993304
outputs.insert(outputs.end(),
32003305
{OutputForTable<McCollisions>::spec(),
@@ -3217,7 +3322,7 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
32173322
"aod-producer-workflow",
32183323
dataRequest->inputs,
32193324
outputs,
3220-
AlgorithmSpec{adaptFromTask<AODProducerWorkflowDPL>(src, dataRequest, ggRequest, enableSV, useMC, enableFITextra)},
3325+
AlgorithmSpec{adaptFromTask<AODProducerWorkflowDPL>(src, dataRequest, ggRequest, enableSV, useMC, enableFITextra, enableTRDextra)},
32213326
Options{
32223327
ConfigParamSpec{"run-number", VariantType::Int64, -1L, {"The run-number. If left default we try to get it from DPL header."}},
32233328
ConfigParamSpec{"aod-timeframe-id", VariantType::Int64, -1L, {"Set timeframe number"}},

0 commit comments

Comments
 (0)