1313#include < cmath>
1414#include < string>
1515
16+ #include " Math/Vector4D.h"
17+ #include " Math/GenVector/Boost.h"
1618#include " Common/DataModel/EventSelection.h"
1719#include " Common/DataModel/PIDResponse.h"
1820#include " Common/DataModel/TrackSelectionTables.h"
@@ -56,7 +58,7 @@ static constexpr std::array<int, nNuclei> charges{1, 1, 2};
5658static const std::vector<std::string> matterOrNot{" Matter" , " Antimatter" };
5759static const std::vector<std::string> nucleiNames{" H2" , " H3" , " Helium" };
5860static const std::vector<std::string> hypernucleiNames{" H3L" }; // 3-body decay case
59- static const std::vector<std::string> columnsNames{o2::aod::filtering::H2::columnLabel (), o2::aod::filtering::He::columnLabel (), o2::aod::filtering::HeV0::columnLabel (), o2::aod::filtering::H3L3Body::columnLabel (), o2::aod::filtering::Tracked3Body::columnLabel (), o2::aod::filtering::ITSmildIonisation::columnLabel (), o2::aod::filtering::ITSextremeIonisation::columnLabel ()};
61+ static const std::vector<std::string> columnsNames{o2::aod::filtering::H2::columnLabel (), o2::aod::filtering::He::columnLabel (), o2::aod::filtering::HeV0::columnLabel (), o2::aod::filtering::TritonFemto::columnLabel (), o2::aod::filtering:: H3L3Body::columnLabel (), o2::aod::filtering::Tracked3Body::columnLabel (), o2::aod::filtering::ITSmildIonisation::columnLabel (), o2::aod::filtering::ITSextremeIonisation::columnLabel ()};
6062static const std::vector<std::string> cutsNames{
6163 " TPCnSigmaMin" , " TPCnSigmaMax" , " TOFnSigmaMin" , " TOFnSigmaMax" , " TOFpidStartPt" };
6264constexpr double betheBlochDefault[nNuclei][6 ]{
@@ -99,6 +101,7 @@ struct nucleiFilter {
99101 Configurable<float > cfgCutNclusTPC{" cfgCutNclusTPC" , 80 , " Minimum number of TPC clusters" };
100102 Configurable<float > cfgCutDCAxy{" cfgCutDCAxy" , 3 , " Max DCAxy" };
101103 Configurable<float > cfgCutDCAz{" cfgCutDCAz" , 10 , " Max DCAz" };
104+ Configurable<float > cfgCutKstar{" cfgCutKstar" , 1 .f , " Kstar cut for triton femto trigger" };
102105
103106 Configurable<LabeledArray<double >> cfgBetheBlochParams{" cfgBetheBlochParams" , {betheBlochDefault[0 ], nNuclei, 6 , nucleiNames, betheBlochParNames}, " TPC Bethe-Bloch parameterisation for light nuclei" };
104107 Configurable<LabeledArray<double >> cfgMomentumScalingBetheBloch{" cfgMomentumScalingBetheBloch" , {bbMomScalingDefault[0 ], nNuclei, 2 , nucleiNames, matterOrNot}, " TPC Bethe-Bloch momentum scaling for light nuclei" };
@@ -316,6 +319,7 @@ struct nucleiFilter {
316319 kH2 = 0 ,
317320 kHe ,
318321 kHeV0 ,
322+ kTritonFemto ,
319323 kH3L3Body ,
320324 kTracked3Body ,
321325 kITSmildIonisation ,
@@ -333,7 +337,7 @@ struct nucleiFilter {
333337 hProcessedEvents->Fill (0 );
334338 //
335339 if (!collision.selection_bit (aod::evsel::kNoTimeFrameBorder )) {
336- tags (keepEvent[kH2 ], keepEvent[kHe ], keepEvent[kHeV0 ], keepEvent[kH3L3Body ], keepEvent[kTracked3Body ], keepEvent[kITSmildIonisation ], keepEvent[kITSextremeIonisation ]);
340+ tags (keepEvent[kH2 ], keepEvent[kHe ], keepEvent[kHeV0 ], keepEvent[kTritonFemto ], keepEvent[ kH3L3Body ], keepEvent[kTracked3Body ], keepEvent[kITSmildIonisation ], keepEvent[kITSextremeIonisation ]);
337341 return ;
338342 }
339343
@@ -344,7 +348,8 @@ struct nucleiFilter {
344348 {charges[2 ] * cfgMomentumScalingBetheBloch->get (2u , 0u ) / masses[2 ], charges[2 ] * cfgMomentumScalingBetheBloch->get (2u , 1u ) / masses[2 ]}};
345349
346350 constexpr int nucleusIndex[nNuclei]{kH2 , -1 , kHe }; // / remap for nuclei triggers
347- std::vector<int > he3indices;
351+ std::vector<int > h3indices, he3indices;
352+ std::vector<ROOT::Math::PtEtaPhiMVector> h3vectors;
348353 for (auto & track : tracks) { // start loop over tracks
349354 if (track.itsNCls () >= cfgCutNclusExtremeIonisationITS) {
350355 double avgClsSize{0 .};
@@ -398,15 +403,44 @@ struct nucleiFilter {
398403 if (track.p () > cfgCutsPID->get (iN, 4u ) && (nSigmaTOF[iN] < cfgCutsPID->get (iN, 2u ) || nSigmaTOF[iN] > cfgCutsPID->get (iN, 3u ))) {
399404 continue ;
400405 }
406+ if (iN == 1 && passesDCAselection) {
407+ h3indices.push_back (track.globalIndex ());
408+ h3vectors.emplace_back (track.pt (), track.eta (), track.phi (), masses[iN]);
409+ }
410+ if (iN == 2 ) {
411+ he3indices.push_back (track.globalIndex ());
412+ }
401413 if (nucleusIndex[iN] < 0 ) {
402414 continue ;
403415 }
404416 keepEvent[nucleusIndex[iN]] = passesDCAselection;
405417 if (keepEvent[nucleusIndex[iN]]) {
406418 h2TPCsignal[iN]->Fill (track.sign () * track.tpcInnerParam () * fixTPCrigidity, track.tpcSignal ());
407419 }
408- if (iN == 2 ) {
409- he3indices.push_back (track.globalIndex ());
420+ }
421+
422+ for (const auto & track : tracks) {
423+ if (track.itsNCls () < cfgCutNclusITS ||
424+ track.tpcNClsFound () < cfgCutNclusTPC ||
425+ std::abs (track.dcaXY ()) > cfgCutDCAxy ||
426+ std::abs (track.dcaZ ()) > cfgCutDCAz ||
427+ std::abs (track.eta ()) > 0.9 ) {
428+ continue ;
429+ }
430+ const ROOT::Math::PtEtaPhiMVector trackVector (track.pt (), track.eta (), track.phi (), constants::physics::MassPiMinus);
431+ for (size_t iH3{0 }; iH3 < h3vectors.size (); ++iH3) {
432+ if (h3indices[iH3] == track.globalIndex ()) {
433+ continue ;
434+ }
435+ const auto & h3vector = h3vectors[iH3];
436+ auto pivector = trackVector;
437+ auto cm = h3vector + trackVector;
438+ const ROOT::Math::Boost boost (cm.BoostToCM ());
439+ boost (pivector);
440+ if (pivector.P () < cfgCutKstar) {
441+ keepEvent[kTritonFemto ] = true ;
442+ break ;
443+ }
410444 }
411445 }
412446
@@ -582,7 +616,7 @@ struct nucleiFilter {
582616 }
583617 }
584618
585- tags (keepEvent[kH2 ], keepEvent[kHe ], keepEvent[kHeV0 ], keepEvent[kH3L3Body ], keepEvent[kTracked3Body ], keepEvent[kITSmildIonisation ], keepEvent[kITSextremeIonisation ]);
619+ tags (keepEvent[kH2 ], keepEvent[kHe ], keepEvent[kHeV0 ], keepEvent[kTritonFemto ], keepEvent[ kH3L3Body ], keepEvent[kTracked3Body ], keepEvent[kITSmildIonisation ], keepEvent[kITSextremeIonisation ]);
586620 }
587621};
588622
0 commit comments