Skip to content

Commit bee1b25

Browse files
KangkanGoswamiglegras
authored andcommitted
Implement TRD extra data processing in AODProducerWorkflowSpec.cxx
This commit enables the workflow to generate TRD-specific extra tables in the AOD, applying calibration and noise corrections to improve reconstruction fidelity for TRD tracks.
1 parent 264c2a9 commit bee1b25

File tree

1 file changed

+116
-11
lines changed

1 file changed

+116
-11
lines changed

Detectors/AOD/src/AODProducerWorkflowSpec.cxx

Lines changed: 116 additions & 11 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,9 @@
4544
#include "CommonDataFormat/InteractionRecord.h"
4645
#include "DataFormatsTRD/TrackTRD.h"
4746
#include "DataFormatsTRD/TrackTriggerRecord.h"
47+
#include "DataFormatsTRD/CalibratedTracklet.h"
48+
#include "DataFormatsTRD/TriggerRecord.h"
49+
#include "DataFormatsTRD/Tracklet64.h"
4850
#include "DataFormatsGlobalTracking/RecoContainer.h"
4951
#include "Framework/AnalysisDataModel.h"
5052
#include "Framework/ConfigParamRegistry.h"
@@ -390,6 +392,79 @@ void AODProducerWorkflowDPL::addToTracksQATable(TracksQACursorType& tracksQACurs
390392
mTrackQCRetainOnlydEdx ? std::numeric_limits<int8_t>::min() : trackQAInfoHolder.dTofdZ);
391393
}
392394

395+
template <typename TRDsExtraCursorType>
396+
void AODProducerWorkflowDPL::addToTRDsExtra(const o2::globaltracking::RecoContainer& recoData, TRDsExtraCursorType& trdExtraCursor, const GIndex& trkIdx, int trkTableIdx)
397+
{
398+
static int q0s[6] = {-1}, q1s[6] = {-1}, q2s[6] = {-1};
399+
static float q0sCor[6] = {-1}, q1sCor[6] = {-1}, q2sCor[6] = {-1};
400+
static float ttgls[6] = {-999}, tphis[6] = {-999};
401+
402+
auto contributorsGID = recoData.getSingleDetectorRefs(trkIdx);
403+
if (!contributorsGID[GIndex::Source::TRD].isIndexSet()) { // should be redunant
404+
return;
405+
}
406+
const auto& trk = recoData.getTrack<o2::trd::TrackTRD>(contributorsGID[GIndex::Source::TRD]);
407+
auto trkC = trk;
408+
const auto& trklets = recoData.getTRDTracklets();
409+
const auto& ctrklets = recoData.getTRDCalibratedTracklets();
410+
for (int iLay{0}; iLay < 6; ++iLay) {
411+
q0s[iLay] = q1s[iLay] = q2s[iLay] = -1;
412+
q0sCor[iLay] = q1sCor[iLay] = q2sCor[iLay] = -1;
413+
tphis[iLay] = ttgls[iLay] = -999;
414+
auto trkltId = trk.getTrackletIndex(iLay);
415+
if (trkltId < 0) {
416+
continue;
417+
}
418+
const auto& tracklet = trklets[trkltId];
419+
if (mTRDNoiseMap->isTrackletFromNoisyMCM(tracklet)) {
420+
continue;
421+
}
422+
// we need to propagate into TRD local system
423+
int trkltDet = tracklet.getDetector();
424+
int trkltSec = trkltDet / 30;
425+
if (trkltSec != o2::math_utils::angle2Sector(trkC.getAlpha())) {
426+
if (!trkC.rotate(o2::math_utils::sector2Angle(trkltSec))) {
427+
break;
428+
}
429+
}
430+
if (!o2::base::Propagator::Instance()->PropagateToXBxByBz(trkC, ctrklets[trkltId].getX(), o2::base::Propagator::MAX_SIN_PHI, o2::base::Propagator::MAX_STEP, mMatCorr)) {
431+
break;
432+
}
433+
434+
auto tphi = trkC.getSnp() / std::sqrt((1.f - trkC.getSnp()) * (1.f + trkC.getSnp()));
435+
auto trackletLength = std::sqrt(1.f + tphi * tphi + trkC.getTgl() * trkC.getTgl());
436+
float cor = mTRDLocalGain->getValue(tracklet.getHCID() / 2, tracklet.getPadCol(), tracklet.getPadRow()) * trackletLength;
437+
q0s[iLay] = tracklet.getQ0();
438+
q1s[iLay] = tracklet.getQ1();
439+
q2s[iLay] = tracklet.getQ2();
440+
q0sCor[iLay] = (float)tracklet.getQ0() / cor;
441+
q1sCor[iLay] = (float)tracklet.getQ1() / cor;
442+
q2sCor[iLay] = (float)tracklet.getQ2() / cor;
443+
ttgls[iLay] = trkC.getTgl();
444+
tphis[iLay] = tphi;
445+
446+
// z-row merging
447+
if (trk.getIsCrossingNeighbor(iLay) && trk.getHasNeighbor()) {
448+
for (const auto& trklt : trklets) {
449+
if (tracklet.getTrackletWord() == trklt.getTrackletWord()) {
450+
continue;
451+
}
452+
if (std::abs(tracklet.getPadCol() - trklt.getPadCol()) <= 1 && std::abs(tracklet.getPadRow() - trklt.getPadRow()) == 1) {
453+
cor = mTRDLocalGain->getValue(trklt.getHCID() / 2, trklt.getPadCol(), trklt.getPadRow()) * trackletLength;
454+
q0s[iLay] += trklt.getQ0();
455+
q1s[iLay] += trklt.getQ1();
456+
q2s[iLay] += trklt.getQ2();
457+
q0sCor[iLay] += (float)trklt.getQ0() / cor;
458+
q1sCor[iLay] += (float)trklt.getQ1() / cor;
459+
q2sCor[iLay] += (float)trklt.getQ2() / cor;
460+
}
461+
}
462+
}
463+
}
464+
465+
trdExtraCursor(trkTableIdx, q0s, q1s, q2s, q0sCor, q1sCor, q2sCor, ttgls, tphis);
466+
}
467+
393468
template <typename mftTracksCursorType, typename AmbigMFTTracksCursorType>
394469
void AODProducerWorkflowDPL::addToMFTTracksTable(mftTracksCursorType& mftTracksCursor, AmbigMFTTracksCursorType& ambigMFTTracksCursor,
395470
GIndex trackID, const o2::globaltracking::RecoContainer& data, int collisionID,
@@ -430,8 +505,7 @@ void AODProducerWorkflowDPL::addToMFTTracksTable(mftTracksCursorType& mftTracksC
430505
ambigMFTTracksCursor(mTableTrMFTID, bcSlice);
431506
}
432507
}
433-
434-
template <typename TracksCursorType, typename TracksCovCursorType, typename TracksExtraCursorType, typename TracksQACursorType, typename AmbigTracksCursorType,
508+
template <typename TracksCursorType, typename TracksCovCursorType, typename TracksExtraCursorType, typename TracksQACursorType, typename TRDsExtraCursor, typename AmbigTracksCursorType,
435509
typename MFTTracksCursorType, typename MFTTracksCovCursorType, typename AmbigMFTTracksCursorType,
436510
typename FwdTracksCursorType, typename FwdTracksCovCursorType, typename AmbigFwdTracksCursorType, typename FwdTrkClsCursorType>
437511
void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
@@ -443,6 +517,7 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
443517
TracksCovCursorType& tracksCovCursor,
444518
TracksExtraCursorType& tracksExtraCursor,
445519
TracksQACursorType& tracksQACursor,
520+
TRDsExtraCursor& trdsExtraCursor,
446521
AmbigTracksCursorType& ambigTracksCursor,
447522
MFTTracksCursorType& mftTracksCursor,
448523
MFTTracksCovCursorType& mftTracksCovCursor,
@@ -553,7 +628,9 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
553628
addToTracksTable(tracksCursor, tracksCovCursor, trOrig, collisionID, aod::track::TrackIU);
554629
}
555630
addToTracksExtraTable(tracksExtraCursor, extraInfoHolder);
556-
631+
if (mEnableTRDextra && trackIndex.includesDet(GIndex::Source::TRD)) {
632+
addToTRDsExtra(data, trdsExtraCursor, trackIndex, mTableTrID);
633+
}
557634
// collecting table indices of barrel tracks for V0s table
558635
if (extraInfoHolder.bcSlice[0] >= 0 && collisionID < 0) {
559636
ambigTracksCursor(mTableTrID, extraInfoHolder.bcSlice);
@@ -1909,11 +1986,8 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
19091986
auto trackedV0Cursor = createTableCursor<o2::aod::TrackedV0s>(pc);
19101987
auto tracked3BodyCurs = createTableCursor<o2::aod::Tracked3Bodys>(pc);
19111988
auto fddCursor = createTableCursor<o2::aod::FDDs>(pc);
1912-
auto fddExtraCursor = createTableCursor<o2::aod::FDDsExtra>(pc);
19131989
auto ft0Cursor = createTableCursor<o2::aod::FT0s>(pc);
1914-
auto ft0ExtraCursor = createTableCursor<o2::aod::FT0sExtra>(pc);
19151990
auto fv0aCursor = createTableCursor<o2::aod::FV0As>(pc);
1916-
auto fv0aExtraCursor = createTableCursor<o2::aod::FV0AsExtra>(pc);
19171991
auto fwdTracksCursor = createTableCursor<o2::aod::StoredFwdTracks>(pc);
19181992
auto fwdTracksCovCursor = createTableCursor<o2::aod::StoredFwdTracksCov>(pc);
19191993
auto fwdTrkClsCursor = createTableCursor<o2::aod::FwdTrkCls>(pc);
@@ -1934,6 +2008,21 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
19342008
auto cpvClustersCursor = createTableCursor<o2::aod::CPVClusters>(pc);
19352009
auto originCursor = createTableCursor<o2::aod::Origins>(pc);
19362010

2011+
/// Extra tables
2012+
o2::framework::Produces<o2::aod::FT0sExtra> ft0ExtraCursor;
2013+
o2::framework::Produces<o2::aod::FDDsExtra> fddExtraCursor;
2014+
o2::framework::Produces<o2::aod::FV0AsExtra> fv0aExtraCursor;
2015+
2016+
if (mEnableFITextra) {
2017+
ft0ExtraCursor = createTableCursor<o2::aod::FT0sExtra>(pc);
2018+
fddExtraCursor = createTableCursor<o2::aod::FDDsExtra>(pc);
2019+
fv0aExtraCursor = createTableCursor<o2::aod::FV0AsExtra>(pc);
2020+
}
2021+
o2::framework::Produces<o2::aod::TRDsExtra> trdExtraCursor;
2022+
if (mEnableTRDextra) {
2023+
trdExtraCursor = createTableCursor<o2::aod::TRDsExtra>(pc);
2024+
}
2025+
19372026
// Declare MC cursors type without adding the output for a table
19382027
o2::framework::Produces<o2::aod::McCollisionLabels> mcColLabelsCursor;
19392028
o2::framework::Produces<o2::aod::McCollisions> mcCollisionsCursor;
@@ -2298,7 +2387,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
22982387
// so that all unassigned tracks are stored in the beginning of the table together
22992388
auto& trackRef = primVer2TRefs.back(); // references to unassigned tracks are at the end
23002389
// fixme: interaction time is undefined for unassigned tracks (?)
2301-
fillTrackTablesPerCollision(-1, std::uint64_t(-1), trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor,
2390+
fillTrackTablesPerCollision(-1, std::uint64_t(-1), trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor, trdExtraCursor,
23022391
ambigTracksCursor, mftTracksCursor, mftTracksCovCursor, ambigMFTTracksCursor,
23032392
fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, fwdTrkClsCursor, bcsMap);
23042393

@@ -2340,7 +2429,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc)
23402429

23412430
auto& trackRef = primVer2TRefs[collisionID];
23422431
// passing interaction time in [ps]
2343-
fillTrackTablesPerCollision(collisionID, globalBC, trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor, ambigTracksCursor,
2432+
fillTrackTablesPerCollision(collisionID, globalBC, trackRef, primVerGIs, recoData, tracksCursor, tracksCovCursor, tracksExtraCursor, tracksQACursor, trdExtraCursor, ambigTracksCursor,
23442433
mftTracksCursor, mftTracksCovCursor, ambigMFTTracksCursor,
23452434
fwdTracksCursor, fwdTracksCovCursor, ambigFwdTracksCursor, fwdTrkClsCursor, bcsMap);
23462435
collisionID++;
@@ -3011,6 +3100,10 @@ void AODProducerWorkflowDPL::updateTimeDependentParams(ProcessingContext& pc)
30113100
mFieldON = std::abs(o2::base::Propagator::Instance()->getNominalBz()) > 0.01;
30123101

30133102
pc.inputs().get<o2::ctp::CTPConfiguration*>("ctpconfig");
3103+
if (mEnableTRDextra) {
3104+
mTRDLocalGain = pc.inputs().get<o2::trd::LocalGainFactor*>("trdlocalgainfactors").get();
3105+
mTRDNoiseMap = pc.inputs().get<o2::trd::NoiseStatusMCM*>("trdnoisemap").get();
3106+
}
30143107
}
30153108
if (mPropTracks) {
30163109
pc.inputs().get<o2::dataformats::MeanVertexObject*>("meanvtx");
@@ -3222,7 +3315,7 @@ void AODProducerWorkflowDPL::endOfStream(EndOfStreamContext& /*ec*/)
32223315
mStreamer.reset();
32233316
}
32243317

3225-
DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, bool enableStrangenessTracking, bool useMC, bool CTPConfigPerRun, bool enableFITextra)
3318+
DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, bool enableStrangenessTracking, bool useMC, bool CTPConfigPerRun, bool enableFITextra, bool enableTRDextra)
32263319
{
32273320
auto dataRequest = std::make_shared<DataRequest>();
32283321
dataRequest->inputs.emplace_back("ctpconfig", "CTP", "CTPCONFIG", 0, Lifetime::Condition, ccdbParamSpec("CTP/Config/Config", CTPConfigPerRun));
@@ -3313,6 +3406,18 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
33133406
OutputSpec{"TFF", "TFFilename"},
33143407
OutputSpec{"AMD", "AODMetadataKeys"},
33153408
OutputSpec{"AMD", "AODMetadataVals"}};
3409+
/// Extra tables
3410+
if (enableFITextra) {
3411+
outputs.insert(outputs.end(),
3412+
{OutputForTable<FDDsExtra>::spec(),
3413+
OutputForTable<FT0sExtra>::spec(),
3414+
OutputForTable<FV0AsExtra>::spec()});
3415+
}
3416+
if (enableTRDextra) {
3417+
outputs.push_back(OutputForTable<TRDsExtra>::spec());
3418+
dataRequest->inputs.emplace_back("trdlocalgainfactors", "TRD", "LOCALGAINFACTORS", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/LocalGainFactor"));
3419+
dataRequest->inputs.emplace_back("trdnoisemap", "TRD", "NOISEMAP", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/NoiseMapMCM"));
3420+
}
33163421

33173422
if (useMC) {
33183423
outputs.insert(outputs.end(),
@@ -3336,7 +3441,7 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
33363441
"aod-producer-workflow",
33373442
dataRequest->inputs,
33383443
outputs,
3339-
AlgorithmSpec{adaptFromTask<AODProducerWorkflowDPL>(src, dataRequest, ggRequest, enableSV, useMC, enableFITextra)},
3444+
AlgorithmSpec{adaptFromTask<AODProducerWorkflowDPL>(src, dataRequest, ggRequest, enableSV, useMC, enableFITextra, enableTRDextra)},
33403445
Options{
33413446
ConfigParamSpec{"run-number", VariantType::Int64, -1L, {"The run-number. If left default we try to get it from DPL header."}},
33423447
ConfigParamSpec{"aod-timeframe-id", VariantType::Int64, -1L, {"Set timeframe number"}},

0 commit comments

Comments
 (0)