1818#include < vector>
1919#include < algorithm>
2020#include < utility>
21+ #include < string>
22+ #include < memory>
2123
2224#include " CommonConstants/PhysicsConstants.h"
2325#include " DCAFitter/DCAFitterN.h"
2426#include " Framework/AnalysisTask.h"
2527#include " Framework/O2DatabasePDGPlugin.h"
2628#include " Framework/runDataProcessing.h"
2729#include " ReconstructionDataFormats/DCA.h"
30+ #include " ReconstructionDataFormats/V0.h"
2831
2932#include " Common/Core/trackUtilities.h"
3033#include " Common/Core/TrackSelection.h"
@@ -53,9 +56,6 @@ namespace o2::aod
5356namespace full
5457{
5558DECLARE_SOA_INDEX_COLUMN (Collision, collision);
56- DECLARE_SOA_COLUMN (PtD1, ptD1, float );
57- DECLARE_SOA_COLUMN (PtD2, ptD2, float );
58- DECLARE_SOA_COLUMN (PtPi, ptPi, float );
5959DECLARE_SOA_COLUMN (PxProng0D1, pxProng0D1, float );
6060DECLARE_SOA_COLUMN (PxProng1D1, pxProng1D1, float );
6161DECLARE_SOA_COLUMN (PyProng0D1, pyProng0D1, float );
@@ -95,10 +95,12 @@ DECLARE_SOA_COLUMN(NSigTpcSoftPi, nSigTpcSoftPi, float);
9595DECLARE_SOA_COLUMN (NSigTofSoftPi, nSigTofSoftPi, float );
9696DECLARE_SOA_COLUMN (MlScoreD1, mlScoreD1, float );
9797DECLARE_SOA_COLUMN (MlScoreD2, mlScoreD2, float );
98- DECLARE_SOA_COLUMN (DecayLengthD1, decayLengthD1, float );
99- DECLARE_SOA_COLUMN (DecayLengthD2, decayLengthD2, float );
98+ DECLARE_SOA_COLUMN (ImpactParameterD1, impactParameterD1, float );
99+ DECLARE_SOA_COLUMN (ImpactParameterD2, impactParameterD2, float );
100+ DECLARE_SOA_COLUMN (ImpactParameterSoftPi, impactParameterSoftPi, float );
100101DECLARE_SOA_COLUMN (CpaD1, cpaD1, float );
101102DECLARE_SOA_COLUMN (CpaD2, cpaD2, float );
103+ DECLARE_SOA_COLUMN (Chi2PCA, chi2PCA, float );
102104DECLARE_SOA_COLUMN (SignSoftPi, signSoftPi, float );
103105DECLARE_SOA_COLUMN (DcaXYSoftPi, dcaXYSoftPi, float );
104106DECLARE_SOA_COLUMN (DcaZSoftPi, dcaZSoftPi, float );
@@ -112,9 +114,6 @@ DECLARE_SOA_COLUMN(RunNumber, runNumber, int);
112114} // namespace full
113115
114116DECLARE_SOA_TABLE (HfCandTccLites, " AOD" , " HFCANDTCCLITE" ,
115- full::PtD1,
116- full::PtD2,
117- full::PtPi,
118117 full::PxProng0D1,
119118 full::PxProng1D1,
120119 full::PyProng0D1,
@@ -154,10 +153,12 @@ DECLARE_SOA_TABLE(HfCandTccLites, "AOD", "HFCANDTCCLITE",
154153 full::NSigTofSoftPi,
155154 full::MlScoreD1,
156155 full::MlScoreD2,
157- full::DecayLengthD1,
158- full::DecayLengthD2,
156+ full::ImpactParameterD1,
157+ full::ImpactParameterD2,
158+ full::ImpactParameterSoftPi,
159159 full::CpaD1,
160160 full::CpaD2,
161+ full::Chi2PCA,
161162 full::SignSoftPi,
162163 full::DcaXYSoftPi,
163164 full::DcaZSoftPi,
@@ -184,16 +185,37 @@ struct HfTreeCreatorTccToD0D0Pi {
184185 Configurable<float > ptMinSoftPion{" ptMinSoftPion" , 0.0 , " Min pt for the soft pion" };
185186 Configurable<bool > usePionIsGlobalTrackWoDCA{" usePionIsGlobalTrackWoDCA" , true , " check isGlobalTrackWoDCA status for pions" };
186187
187- // Configurable<float> softPiEtaMax{"softPiEtaMax", 0.9f, "Soft pion max value for pseudorapidity (abs vale)"};
188- // Configurable<float> softPiChi2Max{"softPiChi2Max", 36.f, "Soft pion max value for chi2 ITS"};
189- // Configurable<int> softPiItsHitMap{"softPiItsHitMap", 127, "Soft pion ITS hitmap"};
190- // Configurable<int> softPiItsHitsMin{"softPiItsHitsMin", 1, "Minimum number of ITS layers crossed by the soft pion among those in \"softPiItsHitMap\""};
188+ // vertexing
189+ Configurable<bool > propagateToPCA{" propagateToPCA" , true , " create tracks version propagated to PCA" };
190+ Configurable<bool > useAbsDCA{" useAbsDCA" , false , " Minimise abs. distance rather than chi2" };
191+ Configurable<bool > useWeightedFinalPCA{" useWeightedFinalPCA" , false , " Recalculate vertex position using track covariances, effective only if useAbsDCA is true" };
192+ Configurable<float > maxR{" maxR" , 200 ., " reject PCA's above this radius" };
193+ Configurable<float > maxDZIni{" maxDZIni" , 4 ., " reject (if>0) PCA candidate if tracks DZ exceeds threshold" };
194+ Configurable<float > minParamChange{" minParamChange" , 1 .e -3 , " stop iterations if largest change of any Lb is smaller than this" };
195+ Configurable<float > minRelChi2Change{" minRelChi2Change" , 0.9 , " stop iterations is chi2/chi2old > this" };
196+
191197 Configurable<float > softPiDcaXYMax{" softPiDcaXYMax" , 0.065 , " Soft pion max dcaXY (cm)" };
192198 Configurable<float > softPiDcaZMax{" softPiDcaZMax" , 0.065 , " Soft pion max dcaZ (cm)" };
193199 Configurable<float > deltaMassCanMax{" deltaMassCanMax" , 2 , " delta candidate max mass (DDPi-D0D0) ((GeV/c2)" };
194200 Configurable<float > massCanMax{" massCanMax" , 4.0 , " candidate max mass (DDPi) ((GeV/c2)" };
195201
202+ // magnetic field setting from CCDB
203+ Configurable<bool > isRun2{" isRun2" , false , " enable Run 2 or Run 3 GRP objects for magnetic field" };
204+ Configurable<std::string> ccdbUrl{" ccdbUrl" , " http://alice-ccdb.cern.ch" , " url of the ccdb repository" };
205+ Configurable<std::string> ccdbPathLut{" ccdbPathLut" , " GLO/Param/MatLUT" , " Path for LUT parametrization" };
206+ Configurable<std::string> ccdbPathGrp{" ccdbPathGrp" , " GLO/GRP/GRP" , " Path of the grp file (Run 2)" };
207+ Configurable<std::string> ccdbPathGrpMag{" ccdbPathGrpMag" , " GLO/Config/GRPMagField" , " CCDB path of the GRPMagField object (Run 3)" };
208+
209+ o2::vertexing::DCAFitterN<3 > dfTcc; // Tcc vertex fitter
210+ o2::vertexing::DCAFitterN<2 > dfD1; // 2-prong vertex fitter (to rebuild D01 vertex)
211+ o2::vertexing::DCAFitterN<2 > dfD2; // 2-prong vertex fitter (to rebuild D02 vertex)
212+
196213 HfHelper hfHelper;
214+ Service<o2::ccdb::BasicCCDBManager> ccdb;
215+ o2::base::MatLayerCylSet* lut;
216+ o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT;
217+ int runNumber;
218+ double bz{0 .};
197219
198220 using TracksPid = soa::Join<aod::pidTPCFullPi, aod::pidTOFFullPi, aod::pidTPCFullKa, aod::pidTOFFullKa>;
199221 using TracksWPid = soa::Join<aod::TracksWCovDcaExtra, TracksPid, aod::TrackSelection>;
@@ -209,14 +231,47 @@ struct HfTreeCreatorTccToD0D0Pi {
209231 Preslice<SelectedCandidatesMl> candsD0PerCollisionWithMl = aod::track_association::collisionId;
210232 Preslice<aod::TrackAssoc> trackIndicesPerCollision = aod::track_association::collisionId;
211233 // Partition<SelectedCandidatesMl> candidatesMlAll = aod::hf_sel_candidate_d0::isSelD0 >= 0;
212-
234+ std::shared_ptr<TH1> hCandidatesD1, hCandidatesD2, hCandidatesTcc;
235+ OutputObj<TH1F> hCovPVXX{TH1F (" hCovPVXX" , " Tcc candidates;XX element of cov. matrix of prim. vtx. position (cm^{2});entries" , 100 , 0 ., 1 .e -4 )};
236+ OutputObj<TH1F> hCovSVXX{TH1F (" hCovSVXX" , " Tcc candidates;XX element of cov. matrix of sec. vtx. position (cm^{2});entries" , 100 , 0 ., 0.2 )};
213237 void init (InitContext const &)
214238 {
215239
216240 std::array<bool , 3 > doprocess{doprocessDataWithMl, doprocessDataWithMlWithFT0C, doprocessDataWithMlWithFT0M};
217241 if (std::accumulate (doprocess.begin (), doprocess.end (), 0 ) != 1 ) {
218242 LOGP (fatal, " Only one process function can be enabled at a time." );
219243 }
244+
245+ dfD1.setPropagateToPCA (propagateToPCA);
246+ dfD1.setMaxR (maxR);
247+ dfD1.setMaxDZIni (maxDZIni);
248+ dfD1.setMinParamChange (minParamChange);
249+ dfD1.setMinRelChi2Change (minRelChi2Change);
250+ dfD1.setUseAbsDCA (useAbsDCA);
251+ dfD1.setWeightedFinalPCA (useWeightedFinalPCA);
252+
253+ dfD2.setPropagateToPCA (propagateToPCA);
254+ dfD2.setMaxR (maxR);
255+ dfD2.setMaxDZIni (maxDZIni);
256+ dfD2.setMinParamChange (minParamChange);
257+ dfD2.setMinRelChi2Change (minRelChi2Change);
258+ dfD2.setUseAbsDCA (useAbsDCA);
259+ dfD2.setWeightedFinalPCA (useWeightedFinalPCA);
260+
261+ dfTcc.setPropagateToPCA (propagateToPCA);
262+ dfTcc.setMaxR (maxR);
263+ dfTcc.setMaxDZIni (maxDZIni);
264+ dfTcc.setMinParamChange (minParamChange);
265+ dfTcc.setMinRelChi2Change (minRelChi2Change);
266+ dfTcc.setUseAbsDCA (useAbsDCA);
267+ dfTcc.setWeightedFinalPCA (useWeightedFinalPCA);
268+
269+ // Configure CCDB access
270+ ccdb->setURL (ccdbUrl);
271+ ccdb->setCaching (true );
272+ ccdb->setLocalObjectValidityChecking ();
273+ lut = o2::base::MatLayerCylSet::rectifyPtrFromFile (ccdb->get <o2::base::MatLayerCylSet>(ccdbPathLut));
274+ runNumber = 0 ;
220275 }
221276
222277 template <typename T>
@@ -245,10 +300,86 @@ struct HfTreeCreatorTccToD0D0Pi {
245300 void runCandCreatorData (CollType const & collision,
246301 CandType const & candidates,
247302 aod::TrackAssoc const & trackIndices,
248- TrkType const & track, aod::BCs const &)
303+ TrkType const &,
304+ aod::BCs const &)
249305 {
306+
307+ auto primaryVertex = getPrimaryVertex (collision);
308+ auto bc = collision.template bc_as <aod::BCsWithTimestamps>();
309+ if (runNumber != bc.runNumber ()) {
310+ LOG (info) << " >>>>>>>>>>>> Current run number: " << runNumber;
311+ initCCDB (bc, runNumber, ccdb, isRun2 ? ccdbPathGrp : ccdbPathGrpMag, lut, isRun2);
312+ bz = o2::base::Propagator::Instance ()->getNominalBz ();
313+ LOG (info) << " >>>>>>>>>>>> Magnetic field: " << bz;
314+ }
315+ dfTcc.setBz (bz);
316+ dfD1.setBz (bz);
317+ dfD2.setBz (bz);
318+
250319 for (const auto & candidateD1 : candidates) {
320+
321+ auto trackD1Prong0 = candidateD1.template prong0_as <TrkType>();
322+ auto trackD1Prong1 = candidateD1.template prong1_as <TrkType>();
323+ auto trackParVarD1Prong0 = getTrackParCov (trackD1Prong0);
324+ auto trackParVarD1Prong1 = getTrackParCov (trackD1Prong1);
325+ // reconstruct the 2-prong secondary vertex
326+ hCandidatesD1->Fill (SVFitting::BeforeFit);
327+ try {
328+ if (dfD1.process (trackParVarD1Prong0, trackParVarD1Prong1) == 0 ) {
329+ continue ;
330+ }
331+ } catch (const std::runtime_error& error) {
332+ LOG (info) << " Run time error found: " << error.what () << " . DCAFitterN for first D0 cannot work, skipping the candidate." ;
333+ hCandidatesD1->Fill (SVFitting::Fail);
334+ continue ;
335+ }
336+ hCandidatesD1->Fill (SVFitting::FitOk);
337+ const auto & vertexD1 = dfD1.getPCACandidatePos ();
338+ trackParVarD1Prong0.propagateTo (vertexD1[0 ], bz);
339+ trackParVarD1Prong1.propagateTo (vertexD1[0 ], bz);
340+ // Get pVec of tracks of D1
341+ std::array<float , 3 > pVecD1Prong0 = {0 };
342+ std::array<float , 3 > pVecD1Prong1 = {0 };
343+ dfD1.getTrack (0 ).getPxPyPzGlo (pVecD1Prong0);
344+ dfD1.getTrack (1 ).getPxPyPzGlo (pVecD1Prong1);
345+ // Get D1 momentum
346+ std::array<float , 3 > pVecD1 = RecoDecay::pVec (pVecD1Prong0, pVecD1Prong1);
347+
348+ // build a D1 neutral track
349+ auto trackD1 = o2::dataformats::V0 (vertexD1, pVecD1, dfD1.calcPCACovMatrixFlat (), trackParVarD1Prong0, trackParVarD1Prong1);
350+
251351 for (auto candidateD2 = candidateD1 + 1 ; candidateD2 != candidates.end (); ++candidateD2) {
352+
353+ auto trackD2Prong0 = candidateD2.template prong0_as <TrkType>();
354+ auto trackD2Prong1 = candidateD2.template prong1_as <TrkType>();
355+ auto trackParVarD2Prong0 = getTrackParCov (trackD2Prong0);
356+ auto trackParVarD2Prong1 = getTrackParCov (trackD2Prong1);
357+ // reconstruct the 2-prong secondary vertex
358+ hCandidatesD2->Fill (SVFitting::BeforeFit);
359+ try {
360+ if (dfD2.process (trackParVarD2Prong0, trackParVarD2Prong1) == 0 ) {
361+ continue ;
362+ }
363+ } catch (const std::runtime_error& error) {
364+ LOG (info) << " Run time error found: " << error.what () << " . DCAFitterN for second D0 cannot work, skipping the candidate." ;
365+ hCandidatesD2->Fill (SVFitting::Fail);
366+ continue ;
367+ }
368+ hCandidatesD2->Fill (SVFitting::FitOk);
369+ const auto & vertexD2 = dfD2.getPCACandidatePos ();
370+ trackParVarD2Prong0.propagateTo (vertexD2[0 ], bz);
371+ trackParVarD2Prong1.propagateTo (vertexD2[0 ], bz);
372+ // Get pVec of tracks of D2
373+ std::array<float , 3 > pVecD2Prong0 = {0 };
374+ std::array<float , 3 > pVecD2Prong1 = {0 };
375+ dfD2.getTrack (0 ).getPxPyPzGlo (pVecD2Prong0);
376+ dfD2.getTrack (1 ).getPxPyPzGlo (pVecD2Prong1);
377+ // Get D2 momentum
378+ std::array<float , 3 > pVecD2 = RecoDecay::pVec (pVecD2Prong0, pVecD2Prong1);
379+
380+ // build a D2 neutral track
381+ auto trackD2 = o2::dataformats::V0 (vertexD2, pVecD2, dfD2.calcPCACovMatrixFlat (), trackParVarD2Prong0, trackParVarD2Prong1);
382+
252383 for (const auto & trackId : trackIndices) {
253384 auto trackPion = trackId.template track_as <TrkType>();
254385 if (usePionIsGlobalTrackWoDCA && !trackPion.isGlobalTrackWoDCA ()) {
@@ -273,6 +404,46 @@ struct HfTreeCreatorTccToD0D0Pi {
273404 (candidateD2.prong1Id () == trackPion.globalIndex ())) {
274405 continue ;
275406 }
407+
408+ auto trackParCovPi = getTrackParCov (trackPion);
409+ std::array<float , 3 > pVecD1New = {0 ., 0 ., 0 .};
410+ std::array<float , 3 > pVecD2New = {0 ., 0 ., 0 .};
411+ std::array<float , 3 > pVecSoftPi = {0 ., 0 ., 0 .};
412+
413+ // find the DCA between the D01, D02 and the bachelor track, for Tcc
414+ hCandidatesTcc->Fill (SVFitting::BeforeFit);
415+ try {
416+ if (dfTcc.process (trackD1, trackD2, trackParCovPi) == 0 ) {
417+ continue ;
418+ }
419+ } catch (const std::runtime_error& error) {
420+ LOG (info) << " Run time error found: " << error.what () << " . DCAFitterN for Tcc cannot work, skipping the candidate." ;
421+ hCandidatesTcc->Fill (SVFitting::Fail);
422+ continue ;
423+ }
424+ hCandidatesTcc->Fill (SVFitting::FitOk);
425+
426+ dfTcc.propagateTracksToVertex (); // propagate the softpi and D0 pair to the Tcc vertex
427+ trackD1.getPxPyPzGlo (pVecD1New); // momentum of D1 at the Tcc vertex
428+ trackD2.getPxPyPzGlo (pVecD2New); // momentum of D2 at the Tcc vertex
429+ trackParCovPi.getPxPyPzGlo (pVecSoftPi); // momentum of pi at the Tcc vertex
430+
431+ auto chi2PCA = dfTcc.getChi2AtPCACandidate ();
432+ auto covMatrixPCA = dfTcc.calcPCACovMatrixFlat ();
433+ hCovSVXX->Fill (covMatrixPCA[0 ]);
434+
435+ // get track impact parameters
436+ // This modifies track momenta!
437+ auto covMatrixPV = primaryVertex.getCov ();
438+ hCovPVXX->Fill (covMatrixPV[0 ]);
439+ o2::dataformats::DCA impactParameterD1;
440+ o2::dataformats::DCA impactParameterD2;
441+ o2::dataformats::DCA impactParameterSoftPi;
442+
443+ trackD1.propagateToDCA (primaryVertex, bz, &impactParameterD1);
444+ trackD2.propagateToDCA (primaryVertex, bz, &impactParameterD2);
445+ trackParCovPi.propagateToDCA (primaryVertex, bz, &impactParameterSoftPi);
446+
276447 // Retrieve properties of the two D0 candidates
277448 float yD1 = hfHelper.yD0 (candidateD1);
278449 float yD2 = hfHelper.yD0 (candidateD2);
@@ -292,7 +463,7 @@ struct HfTreeCreatorTccToD0D0Pi {
292463 std::copy (candidateD1.mlProbD0 ().begin (), candidateD1.mlProbD0 ().end (), std::back_inserter (mlScoresD1));
293464 massD01 = hfHelper.invMassD0ToPiK (candidateD1);
294465 }
295- if (candidateD1.isSelD0bar ()) {
466+ if (candidateD1.isSelD0bar () && !candidateD1. isSelD0 () ) {
296467 candFlagD1 = 2 ;
297468 std::copy (candidateD1.mlProbD0bar ().begin (), candidateD1.mlProbD0bar ().end (), std::back_inserter (mlScoresD1));
298469 massD01 = hfHelper.invMassD0barToKPi (candidateD1);
@@ -303,25 +474,14 @@ struct HfTreeCreatorTccToD0D0Pi {
303474 std::copy (candidateD2.mlProbD0 ().begin (), candidateD2.mlProbD0 ().end (), std::back_inserter (mlScoresD2));
304475 massD02 = hfHelper.invMassD0ToPiK (candidateD2);
305476 }
306- if (candidateD2.isSelD0bar ()) {
477+ if (candidateD2.isSelD0bar () && !candidateD2. isSelD0 () ) {
307478 candFlagD2 = 2 ;
308479 std::copy (candidateD2.mlProbD0bar ().begin (), candidateD2.mlProbD0bar ().end (), std::back_inserter (mlScoresD2));
309480 massD02 = hfHelper.invMassD0barToKPi (candidateD2);
310481 }
311482
312483 // LOG(info) << " candidateD1.collisionId() " << candidateD1.collisionId()<<" massD01 "<<massD01<<" massD02 "<<massD02 <<" trackPion.pt() "<< trackPion.pt();
313484
314- auto trackPosD1Dau = track.rawIteratorAt (candidateD1.prong0Id ()); // positive daughter D01
315- auto trackNegD1Dau = track.rawIteratorAt (candidateD1.prong1Id ()); // negative daughter D01
316-
317- auto trackPosD2Dau = track.rawIteratorAt (candidateD2.prong0Id ()); // positive daughter D02
318- auto trackNegD2Dau = track.rawIteratorAt (candidateD2.prong1Id ()); // negative daughter D02
319-
320- std::array<float , 3 > pVecPosD1Dau{trackPosD1Dau.pVector ()};
321- std::array<float , 3 > pVecNegD1Dau{trackNegD1Dau.pVector ()};
322- std::array<float , 3 > pVecPosD2Dau{trackPosD2Dau.pVector ()};
323- std::array<float , 3 > pVecNegD2Dau{trackNegD2Dau.pVector ()};
324- std::array<float , 3 > pVecSoftPion = {trackPion.pVector ()};
325485 std::array<double , 2 > massD1Daus{MassPiPlus, MassKPlus};
326486 std::array<double , 2 > massD2Daus{MassPiPlus, MassKPlus};
327487
@@ -335,27 +495,22 @@ struct HfTreeCreatorTccToD0D0Pi {
335495 massD2Daus[1 ] = MassPiPlus;
336496 }
337497
338- auto massKpipi1 = RecoDecay::m (std::array{pVecPosD1Dau, pVecNegD1Dau, pVecSoftPion }, std::array{massD1Daus[0 ], massD1Daus[1 ], MassPiPlus});
339- auto massKpipi2 = RecoDecay::m (std::array{pVecPosD2Dau, pVecNegD2Dau, pVecSoftPion }, std::array{massD2Daus[0 ], massD2Daus[1 ], MassPiPlus});
498+ auto massKpipi1 = RecoDecay::m (std::array{pVecD1Prong0, pVecD1Prong1, pVecSoftPi }, std::array{massD1Daus[0 ], massD1Daus[1 ], MassPiPlus});
499+ auto massKpipi2 = RecoDecay::m (std::array{pVecD2Prong0, pVecD2Prong1, pVecSoftPi }, std::array{massD2Daus[0 ], massD2Daus[1 ], MassPiPlus});
340500
341501 deltaMassD01 = massKpipi1 - massD01;
342502 deltaMassD02 = massKpipi2 - massD02;
343503
344- std::array<float , 3 > pVecD1{candidateD1.px (), candidateD1.py (), candidateD1.pz ()};
345- std::array<float , 3 > pVecD2{candidateD2.px (), candidateD2.py (), candidateD2.pz ()};
346- auto arrayMomentaDDpi = std::array{pVecD1, pVecD2, pVecSoftPion};
504+ auto arrayMomentaDDpi = std::array{pVecD1New, pVecD2New, pVecSoftPi};
347505 const auto massD0D0Pi = RecoDecay::m (std::move (arrayMomentaDDpi), std::array{MassD0, MassD0, MassPiPlus});
348506 const auto deltaMassD0D0Pi = massD0D0Pi - (massD01 + massD02);
349- const auto massD0D0Pair = RecoDecay::m (std::array{pVecD1, pVecD2 }, std::array{MassD0, MassD0});
507+ const auto massD0D0Pair = RecoDecay::m (std::array{pVecD1New, pVecD2New }, std::array{MassD0, MassD0});
350508
351509 if (deltaMassD0D0Pi > deltaMassCanMax || massD0D0Pi > massCanMax) {
352510 continue ;
353511 }
354512
355513 rowCandidateLite (
356- candidateD1.pt (),
357- candidateD2.pt (),
358- trackPion.pt (),
359514 candidateD1.pxProng0 (),
360515 candidateD1.pxProng1 (),
361516 candidateD1.pyProng0 (),
@@ -395,10 +550,12 @@ struct HfTreeCreatorTccToD0D0Pi {
395550 trackPion.tofNSigmaPi (),
396551 mlScoresD1[0 ],
397552 mlScoresD2[0 ],
398- candidateD1.decayLength (),
399- candidateD2.decayLength (),
553+ impactParameterD1.getY (),
554+ impactParameterD2.getY (),
555+ impactParameterSoftPi.getY (),
400556 candidateD1.cpa (),
401557 candidateD2.cpa (),
558+ chi2PCA,
402559 trackPion.sign (),
403560 trackPion.dcaXY (),
404561 trackPion.dcaZ (),
0 commit comments