diff --git a/Analysis/Tasks/PWGLF/lambdakzerofinder.cxx b/Analysis/Tasks/PWGLF/lambdakzerofinder.cxx index df5ed68c14f95..1e72a6f25ef20 100644 --- a/Analysis/Tasks/PWGLF/lambdakzerofinder.cxx +++ b/Analysis/Tasks/PWGLF/lambdakzerofinder.cxx @@ -44,6 +44,55 @@ using namespace o2::framework::expressions; using std::array; using namespace ROOT::Math; +namespace o2::aod +{ +namespace v0goodpostracks +{ +DECLARE_SOA_INDEX_COLUMN_FULL(GoodTrack, goodTrack, int, FullTracks, "fGoodTrackID"); +DECLARE_SOA_INDEX_COLUMN(Collision, collision); +DECLARE_SOA_COLUMN(DCAXY, dcaXY, float); +} // namespace v0goodpostracks +DECLARE_SOA_TABLE(V0GoodPosTracks, "AOD", "V0GOODPOSTRACKS", o2::soa::Index<>, v0goodpostracks::GoodTrackId, v0goodpostracks::CollisionId, v0goodpostracks::DCAXY); +namespace v0goodnegtracks +{ +DECLARE_SOA_INDEX_COLUMN_FULL(GoodTrack, goodTrack, int, FullTracks, "fGoodTrackID"); +DECLARE_SOA_INDEX_COLUMN(Collision, collision); +DECLARE_SOA_COLUMN(DCAXY, dcaXY, float); +} // namespace v0goodnegtracks +DECLARE_SOA_TABLE(V0GoodNegTracks, "AOD", "V0GOODNEGTRACKS", o2::soa::Index<>, v0goodnegtracks::GoodTrackId, v0goodnegtracks::CollisionId, v0goodnegtracks::DCAXY); +} // namespace o2::aod + +struct lambdakzeroprefilter { + Configurable dcanegtopv{"dcanegtopv", .1, "DCA Neg To PV"}; + Configurable dcapostopv{"dcapostopv", .1, "DCA Pos To PV"}; + Configurable mincrossedrows{"mincrossedrows", 70, "min crossed rows"}; + + Produces v0GoodPosTracks; + Produces v0GoodNegTracks; + + Partition> goodPosTracks = aod::track::signed1Pt > 0.0f && aod::track::dcaXY > dcapostopv; + Partition> goodNegTracks = aod::track::signed1Pt < 0.0f && aod::track::dcaXY < -dcanegtopv; + + void process(aod::Collision const& collision, + soa::Join const& tracks) + { + for (auto& t0 : goodPosTracks) { + if (!(t0.flags() & 0x40)) + continue; //TPC refit + if (t0.tpcNClsCrossedRows() < mincrossedrows) + continue; + v0GoodPosTracks(t0.globalIndex(), t0.collisionId(), t0.dcaXY()); + } + for (auto& t0 : goodNegTracks) { + if (!(t0.flags() & 0x40)) + continue; //TPC refit + if (t0.tpcNClsCrossedRows() < mincrossedrows) + continue; + v0GoodNegTracks(t0.globalIndex(), t0.collisionId(), -t0.dcaXY()); + } + } +}; + struct lambdakzerofinder { Produces v0data; Produces v0finderdata; @@ -57,32 +106,10 @@ struct lambdakzerofinder { //Selection criteria Configurable v0cospa{"v0cospa", 0.995, "V0 CosPA"}; //double -> N.B. dcos(x)/dx = 0 at x=0) Configurable dcav0dau{"dcav0dau", 1.0, "DCA V0 Daughters"}; - Configurable dcanegtopv{"dcanegtopv", .1, "DCA Neg To PV"}; - Configurable dcapostopv{"dcapostopv", .1, "DCA Pos To PV"}; Configurable v0radius{"v0radius", 5.0, "v0radius"}; - //using myTracks = soa::Filtered; - //using myTracks = soa::Filtered; - - Partition> goodPosTracks = aod::track::signed1Pt > 0.0f && aod::track::dcaXY > dcapostopv; - Partition> goodNegTracks = aod::track::signed1Pt < 0.0f && aod::track::dcaXY < -dcanegtopv; - - /// Extracts dca in the XY plane - /// \return dcaXY - template - auto getdcaXY(const T& track, const U& coll) - { - //Calculate DCAs - auto sinAlpha = sin(track.alpha()); - auto cosAlpha = cos(track.alpha()); - auto globalX = track.x() * cosAlpha - track.y() * sinAlpha; - auto globalY = track.x() * sinAlpha + track.y() * cosAlpha; - return sqrt(pow((globalX - coll[0]), 2) + - pow((globalY - coll[1]), 2)); - } - - void process(aod::Collision const& collision, - soa::Join const& tracks) + void process(aod::Collision const& collision, aod::FullTracks const& tracks, + aod::V0GoodPosTracks const& ptracks, aod::V0GoodNegTracks const& ntracks) { //Define o2 fitter, 2-prong o2::vertexing::DCAFitterN<2> fitter; @@ -99,14 +126,11 @@ struct lambdakzerofinder { std::array pVtx = {collision.posX(), collision.posY(), collision.posZ()}; - for (auto& t0 : goodPosTracks) { //FIXME: turn into combination(...) - if (t0.tpcNClsCrossedRows() < 70) - continue; //FIXME: turn into extra filter - for (auto& t1 : goodNegTracks) { - if (t1.tpcNClsCrossedRows() < 70) - continue; //FIXME: turn into extra filter - - auto Track1 = getTrackParCov(t0); + for (auto& t0id : ptracks) { //FIXME: turn into combination(...) + auto t0 = t0id.goodTrack(); + auto Track1 = getTrackParCov(t0); + for (auto& t1id : ntracks) { + auto t1 = t1id.goodTrack(); auto Track2 = getTrackParCov(t1); //Try to progate to dca @@ -144,7 +168,7 @@ struct lambdakzerofinder { pvec0[0], pvec0[1], pvec0[2], pvec1[0], pvec1[1], pvec1[2], fitter.getChi2AtPCACandidate(), - t0.dcaXY(), -t1.dcaXY()); + t0id.dcaXY(), t1id.dcaXY()); } } hCandPerEvent->Fill(lNCand); @@ -172,14 +196,15 @@ struct lambdakzerofinderQA { OutputObj h3dMassLambda{TH3F("h3dMassLambda", "", 20, 0, 100, 200, 0, 10, 200, 1.115 - 0.100, 1.115 + 0.100)}; OutputObj h3dMassAntiLambda{TH3F("h3dMassAntiLambda", "", 20, 0, 100, 200, 0, 10, 200, 1.115 - 0.100, 1.115 + 0.100)}; - OutputObj hTest{TH1F("hTest", "", 1000, 0, 1000)}; - - Filter preFilterV0 = aod::v0data::dcapostopv > dcapostopv&& - aod::v0data::dcanegtopv > dcanegtopv&& aod::v0data::dcaV0daughters < dcav0dau; + //FIXME: figure out why this does not work? + //Filter preFilter1 = aod::v0data::dcapostopv > dcapostopv; + //Filter preFilter2 = aod::v0data::dcanegtopv > dcanegtopv; + //Filter preFilter3 = aod::v0data::dcaV0daughters < dcav0dau; ///Connect to V0FinderData: newly indexed, note: V0DataExt table incompatible with standard V0 table! - void process(soa::Join::iterator const& collision, aod::FullTracks const& tracks, - soa::Filtered> const& fullV0s) + void process(soa::Join::iterator const& collision, + // soa::Filtered> const& fullV0s) + soa::Join const& fullV0s) { if (!collision.alias()[kINT7]) return; @@ -188,15 +213,13 @@ struct lambdakzerofinderQA { Long_t lNCand = 0; for (auto& v0 : fullV0s) { - if (v0.v0radius() > v0radius && v0.v0cosPA(collision.posX(), collision.posY(), collision.posZ()) > v0cospa) { + if (v0.v0radius() > v0radius && v0.v0cosPA(collision.posX(), collision.posY(), collision.posZ()) > v0cospa && v0.dcapostopv() > dcapostopv && v0.dcanegtopv() > dcanegtopv && v0.dcaV0daughters() > dcav0dau) { hV0Radius->Fill(v0.v0radius()); hV0CosPA->Fill(v0.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); hDCAPosToPV->Fill(v0.dcapostopv()); hDCANegToPV->Fill(v0.dcanegtopv()); hDCAV0Dau->Fill(v0.dcaV0daughters()); - hTest->Fill(v0.posTrack().pt()); - if (TMath::Abs(v0.yLambda()) < 0.5) { h3dMassLambda->Fill(collision.centV0M(), v0.pt(), v0.mLambda()); h3dMassAntiLambda->Fill(collision.centV0M(), v0.pt(), v0.mAntiLambda()); @@ -219,6 +242,7 @@ struct lambdakzeroinitializer { WorkflowSpec defineDataProcessing(ConfigContext const&) { return WorkflowSpec{ + adaptAnalysisTask("lf-lambdakzeroprefilter"), adaptAnalysisTask("lf-lambdakzerofinder"), adaptAnalysisTask("lf-lambdakzeroinitializer"), adaptAnalysisTask("lf-lambdakzerofinderQA")};