@@ -60,9 +60,11 @@ struct decay3bodyCandidate {
6060 std::array<float , 3 > posProton = {0 .0f , 0 .0f , 0 .0f };
6161 std::array<float , 3 > posPion = {0 .0f , 0 .0f , 0 .0f };
6262 std::array<float , 3 > posDeuteron = {0 .0f , 0 .0f , 0 .0f };
63- std::array<float , 3 > trackDCAxyToPV = {0 .0f , 0 .0f , 0 .0f }; // 0 - proton, 1 - pion, 2 - deuteron
64- std::array<float , 3 > trackDCAzToPV = {0 .0f , 0 .0f , 0 .0f }; // 0 - proton, 1 - pion, 2 - deuteron
65- std::array<float , 4 > tpcNsigma = {0 .0f , 0 .0f , 0 .0f , 0 .0f }; // 0 - proton, 1 - pion, 2 - deuteron, 3 - bach with pion hyp
63+ std::array<float , 3 > trackDCAxyToPV = {0 .0f , 0 .0f , 0 .0f }; // 0 - proton, 1 - pion, 2 - deuteron
64+ std::array<float , 3 > trackDCAToPV = {0 .0f , 0 .0f , 0 .0f }; // 0 - proton, 1 - pion, 2 - deuteron
65+ std::array<float , 3 > trackDCAxyToPVprop = {0 .0f , 0 .0f , 0 .0f }; // 0 - proton, 1 - pion, 2 - deuteron
66+ std::array<float , 3 > trackDCAToPVprop = {0 .0f , 0 .0f , 0 .0f }; // 0 - proton, 1 - pion, 2 - deuteron
67+ std::array<float , 4 > tpcNsigma = {0 .0f , 0 .0f , 0 .0f , 0 .0f }; // 0 - proton, 1 - pion, 2 - deuteron, 3 - bach with pion hyp
6668 double tofNsigmaDeuteron = 0 .0f ;
6769 std::array<float , 3 > averageITSClSize = {0 .0f , 0 .0f , 0 .0f }; // 0 - proton, 1 - pion, 2 - deuteron
6870 std::array<float , 3 > tpcNCl = {0 .0f , 0 .0f , 0 .0f }; // 0 - proton, 1 - pion, 2 - deuteron
@@ -134,6 +136,9 @@ class decay3bodyBuilderHelper
134136 float minDCAProtonToPV;
135137 float minDCAPionToPV;
136138 float minDCADeuteronToPV;
139+ float minDCAProtonToPVprop;
140+ float minDCAPionToPVprop;
141+ float minDCADeuteronToPVprop;
137142 float minPtProton;
138143 float minPtPion;
139144 float minPtDeuteron;
@@ -281,44 +286,80 @@ class decay3bodyBuilderHelper
281286 } // end of selections
282287
283288 // _______________________________________________________________________
284- // daughter track DCA to PV associated with decay3body
285- o2::dataformats::VertexBase mPV ;
286- o2::dataformats::DCA mDcaInfoCov ;
289+ // daughter track DCA to PV associated with decay3body --> computed with KFParticle
290+ float pvXY[ 2 ] = {pvX, pvY} ;
291+ float pv[ 3 ] = {pvX, pvY, pvZ} ;
287292 auto trackParCovProtonCopy = trackParCovProton;
288293 auto trackParCovPionCopy = trackParCovPion;
289294 auto trackParCovDeuteronCopy = trackParCovDeuteron;
295+ KFParticle kfproton = createKFParticleFromTrackParCov (trackParCovProtonCopy, trackProton.sign (), constants::physics::MassProton);
296+ KFParticle kfpion = createKFParticleFromTrackParCov (trackParCovPionCopy, trackPion.sign (), constants::physics::MassPionCharged);
297+ KFParticle kfdeuteron = createKFParticleFromTrackParCov (trackParCovDeuteronCopy, trackDeuteron.sign (), constants::physics::MassDeuteron);
298+
299+ // proton DCA to PV
300+ decay3body.trackDCAxyToPV [0 ] = kfproton.GetDistanceFromVertexXY (pvXY);
301+ decay3body.trackDCAToPV [0 ] = kfproton.GetDistanceFromVertex (pv);
302+ // pion DCA to PV
303+ decay3body.trackDCAxyToPV [1 ] = kfpion.GetDistanceFromVertexXY (pvXY);
304+ decay3body.trackDCAToPV [1 ] = kfpion.GetDistanceFromVertex (pv);
305+ // deuteron DCA to PV
306+ decay3body.trackDCAxyToPV [2 ] = kfdeuteron.GetDistanceFromVertexXY (pvXY);
307+ decay3body.trackDCAToPV [2 ] = kfdeuteron.GetDistanceFromVertex (pv);
308+ // selection
309+ if (useSelections) {
310+ if (decay3body.trackDCAToPV [0 ] < decay3bodyselections.minDCAProtonToPV ) {
311+ decay3body = {};
312+ return false ;
313+ }
314+ if (decay3body.trackDCAToPV [1 ] < decay3bodyselections.minDCAPionToPV ) {
315+ decay3body = {};
316+ return false ;
317+ }
318+ if (decay3body.trackDCAToPV [2 ] < decay3bodyselections.minDCADeuteronToPV ) {
319+ decay3body = {};
320+ return false ;
321+ }
322+ }
323+
324+ // _______________________________________________________________________
325+ // daughter track DCA to PV associated with decay3body --> with O2 Propagator
326+ o2::dataformats::VertexBase mPV ;
327+ o2::dataformats::DCA mDcaInfoCov ;
328+ auto trackParCovProtonCopyProp = trackParCovProton;
329+ auto trackParCovPionCopyProp = trackParCovPion;
330+ auto trackParCovDeuteronCopyProp = trackParCovDeuteron;
290331 mPV .setPos ({pvX, pvY, pvZ});
291332 mPV .setCov (collision.covXX (), collision.covXY (), collision.covYY (), collision.covXZ (), collision.covYZ (), collision.covZZ ());
292333
293334 // proton track
294- o2::base::Propagator::Instance ()->propagateToDCABxByBz (mPV , trackParCovProtonCopy , 2 .f , fitter3body.getMatCorrType (), &mDcaInfoCov );
295- decay3body.trackDCAxyToPV [0 ] = mDcaInfoCov .getY ();
296- decay3body. trackDCAzToPV [ 0 ] = mDcaInfoCov .getZ ();
297- auto trackProtonDCAToPV = std::sqrt (decay3body.trackDCAxyToPV [0 ] * decay3body.trackDCAxyToPV [0 ] + decay3body. trackDCAzToPV [ 0 ] * decay3body. trackDCAzToPV [ 0 ] );
335+ o2::base::Propagator::Instance ()->propagateToDCABxByBz (mPV , trackParCovProtonCopyProp , 2 .f , fitter3body.getMatCorrType (), &mDcaInfoCov );
336+ decay3body.trackDCAxyToPVprop [0 ] = mDcaInfoCov .getY ();
337+ auto trackProtonDCAzToPVprop = mDcaInfoCov .getZ ();
338+ decay3body. trackDCAToPVprop [ 0 ] = std::sqrt (decay3body.trackDCAxyToPVprop [0 ] * decay3body.trackDCAxyToPVprop [0 ] + trackProtonDCAzToPVprop * trackProtonDCAzToPVprop );
298339 if (useSelections) {
299- if (trackProtonDCAToPV < decay3bodyselections.minDCAProtonToPV ) {
340+ if (decay3body. trackDCAToPVprop [ 0 ] < decay3bodyselections.minDCAProtonToPVprop ) {
300341 decay3body = {};
301342 return false ;
302343 }
303344 }
304345 // pion track
305- o2::base::Propagator::Instance ()->propagateToDCABxByBz (mPV , trackParCovPionCopy , 2 .f , fitter3body.getMatCorrType (), &mDcaInfoCov );
306- decay3body.trackDCAxyToPV [1 ] = mDcaInfoCov .getY ();
307- decay3body. trackDCAzToPV [ 1 ] = mDcaInfoCov .getZ ();
308- auto trackPionDCAToPV = std::sqrt (decay3body.trackDCAxyToPV [1 ] * decay3body.trackDCAxyToPV [1 ] + decay3body. trackDCAzToPV [ 1 ] * decay3body. trackDCAzToPV [ 1 ] );
346+ o2::base::Propagator::Instance ()->propagateToDCABxByBz (mPV , trackParCovPionCopyProp , 2 .f , fitter3body.getMatCorrType (), &mDcaInfoCov );
347+ decay3body.trackDCAxyToPVprop [1 ] = mDcaInfoCov .getY ();
348+ auto trackPionDCAzToPVprop = mDcaInfoCov .getZ ();
349+ decay3body. trackDCAToPVprop [ 1 ] = std::sqrt (decay3body.trackDCAxyToPVprop [1 ] * decay3body.trackDCAxyToPVprop [1 ] + trackPionDCAzToPVprop * trackPionDCAzToPVprop );
309350 if (useSelections) {
310- if (trackPionDCAToPV < decay3bodyselections.minDCAPionToPV ) {
351+ if (decay3body. trackDCAToPVprop [ 1 ] < decay3bodyselections.minDCAPionToPVprop ) {
311352 decay3body = {};
312353 return false ;
313354 }
314355 }
315356 // deuteron track
316- o2::base::Propagator::Instance ()->propagateToDCABxByBz (mPV , trackParCovDeuteronCopy , 2 .f , fitter3body.getMatCorrType (), &mDcaInfoCov );
317- decay3body.trackDCAxyToPV [2 ] = mDcaInfoCov .getY ();
318- decay3body. trackDCAzToPV [ 2 ] = mDcaInfoCov .getZ ();
319- auto trackDeuteronDCAToPV = std::sqrt (decay3body.trackDCAxyToPV [2 ] * decay3body.trackDCAxyToPV [2 ] + decay3body. trackDCAzToPV [ 2 ] * decay3body. trackDCAzToPV [ 2 ] );
357+ o2::base::Propagator::Instance ()->propagateToDCABxByBz (mPV , trackParCovDeuteronCopyProp , 2 .f , fitter3body.getMatCorrType (), &mDcaInfoCov );
358+ decay3body.trackDCAxyToPVprop [2 ] = mDcaInfoCov .getY ();
359+ auto trackDeuteronDCAzToPVprop = mDcaInfoCov .getZ ();
360+ decay3body. trackDCAToPVprop [ 2 ] = std::sqrt (decay3body.trackDCAxyToPVprop [2 ] * decay3body.trackDCAxyToPVprop [2 ] + trackDeuteronDCAzToPVprop * trackDeuteronDCAzToPVprop );
320361 if (useSelections) {
321- if (trackDeuteronDCAToPV < decay3bodyselections.minDCADeuteronToPV ) {
362+ if (decay3body. trackDCAToPVprop [ 2 ] < decay3bodyselections.minDCADeuteronToPVprop ) {
322363 decay3body = {};
323364 return false ;
324365 }
0 commit comments