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"
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+
390470template <typename mftTracksCursorType, typename AmbigMFTTracksCursorType>
391471void 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>
434514void 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