Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
363 changes: 363 additions & 0 deletions PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@
using std::array;
using namespace o2::aod::rctsel;

using dauTracks = soa::Join<aod::DauTrackExtras, aod::DauTrackTPCPIDs>;
using v0Candidates = soa::Join<aod::V0CollRefs, aod::V0Cores, aod::V0Extras>;

struct LfTaskLambdaSpinCorr {

Service<o2::ccdb::BasicCCDBManager> ccdb;
Expand Down Expand Up @@ -295,7 +298,7 @@
cosThetaDiff = cosTheta1 * cosTheta2;
}
double deltaPhi = RecoDecay::constrainAngle(particle1.Phi() - particle2.Phi(), 0.0);
double deltaR = TMath::Sqrt(TMath::Power(particle1.Eta() - particle2.Eta(), 2.0) + TMath::Power(deltaPhi, 2.0));

Check failure on line 301 in PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[root/entity]

Replace ROOT entities with equivalents from standard C++ or from O2.
if (datatype == 0) {
if (tag1 && tag3) {
histos.fill(HIST("hSparseLambdaLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, deltaR);
Expand Down Expand Up @@ -375,6 +378,32 @@
return {lambdaTag, aLambdaTag, true}; // Valid candidate
}

std::tuple<int, int, bool> getLambdaTagsDD(const auto& v0, const auto& collision)
{
auto postrack = v0.template posTrackExtra_as<dauTracks>();
auto negtrack = v0.template negTrackExtra_as<dauTracks>();

int lambdaTag = 0;
int aLambdaTag = 0;

if (isSelectedV0Daughter(v0, postrack, 0) && isSelectedV0Daughter(v0, negtrack, 1)) {
lambdaTag = 1;
}
if (isSelectedV0Daughter(v0, negtrack, 0) && isSelectedV0Daughter(v0, postrack, 1)) {
aLambdaTag = 1;
}

if (!lambdaTag && !aLambdaTag) {
return {0, 0, false}; // No valid tags
}

if (!selectionV0(collision, v0)) {
return {0, 0, false}; // Fails selection
}

return {lambdaTag, aLambdaTag, true}; // Valid candidate
}

std::tuple<int, int, bool> getLambdaTagsMC(const auto& v0, const auto& collision)
{
auto postrack = v0.template posTrack_as<TrackMCRecTable>();
Expand Down Expand Up @@ -545,7 +574,7 @@
Preslice<aod::V0Datas> tracksPerCollisionV0 = aod::v0data::collisionId;
void processME(EventCandidates const& collisions, AllTrackCandidates const&, ResoV0s const& V0s)
{
for (auto& [collision1, collision2] : selfCombinations(colBinning, nMix, -1, collisions, collisions)) {

Check failure on line 577 in PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
// LOGF(info, "Mixed event collisions: (%d, %d)", collision1.index(), collision2.index());
if (rctCut.requireRCTFlagChecker && !rctChecker(collision1)) {
continue;
Expand Down Expand Up @@ -612,7 +641,7 @@
size_t cols = groupV01.size() + 20;
std::vector<std::vector<bool>> pairStatus(rows, std::vector<bool>(cols, false));
histos.fill(HIST("hv0Mult"), groupV01.size());
for (auto& [t1, t2] : soa::combinations(o2::soa::CombinationsFullIndexPolicy(groupV01, groupV02))) {

Check failure on line 644 in PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
bool pairfound = false;
if (t2.index() <= t1.index()) {
continue;
Expand Down Expand Up @@ -644,7 +673,7 @@
}
// auto samePairSumPt = t1.pt() + t2.pt();
double deltaPhiSame = RecoDecay::constrainAngle(t1.phi() - t2.phi(), 0.0);
auto samePairR = TMath::Sqrt(TMath::Power(deltaPhiSame, 2.0) + TMath::Power(t1.eta() - t2.eta(), 2.0));

Check failure on line 676 in PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[root/entity]

Replace ROOT entities with equivalents from standard C++ or from O2.

if (lambdaTag1) {
proton0 = ROOT::Math::PxPyPzMVector(t1.pxpos(), t1.pypos(), t1.pzpos(), o2::constants::physics::MassProton);
Expand Down Expand Up @@ -717,7 +746,7 @@
continue;
}
double deltaPhiMix = RecoDecay::constrainAngle(t3.phi() - t2.phi(), 0.0);
auto mixPairR = TMath::Sqrt(TMath::Power(deltaPhiMix, 2.0) + TMath::Power(t3.eta() - t2.eta(), 2.0));

Check failure on line 749 in PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[root/entity]

Replace ROOT entities with equivalents from standard C++ or from O2.
auto etaDiff = t1.eta() - t3.eta();
auto phiDiff = RecoDecay::constrainAngle(t1.phi() - t3.phi(), 0.0);

Expand Down Expand Up @@ -766,6 +795,340 @@
}
PROCESS_SWITCH(LfTaskLambdaSpinCorr, processME, "Process data ME", true);

void processDerivedData(soa::Join<aod::StraCollisions, aod::StraCents, aod::StraEvSels, aod::StraStamps>::iterator const& collision, v0Candidates const& V0s, dauTracks const&)
{
histos.fill(HIST("hEvtSelInfo"), 0.5);
if (rctCut.requireRCTFlagChecker && !rctChecker(collision)) {
return;
}
histos.fill(HIST("hEvtSelInfo"), 1.5);
if (!collision.sel8()) {
return;
}
histos.fill(HIST("hEvtSelInfo"), 2.5);
auto centrality = collision.centFT0C();
int occupancy = collision.trackOccupancyInTimeRange();
if (additionalEvSel && (!collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) {
return;
}
histos.fill(HIST("hEvtSelInfo"), 3.5);
if (additionalEvSel3 && (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder))) {
return;
}
histos.fill(HIST("hEvtSelInfo"), 4.5);
if (additionalEvSel4 && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) {
return;
}
histos.fill(HIST("hEvtSelInfo"), 5.5);
if (additionalEvSel5 && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) {
return;
}
histos.fill(HIST("hEvtSelInfo"), 6.5);
if (occupancy > cfgCutOccupancy) {
return;
}
histos.fill(HIST("hEvtSelInfo"), 7.5);
histos.fill(HIST("hCentrality"), centrality);

for (const auto& v0 : V0s) {
auto [lambdaTag, aLambdaTag, isValid] = getLambdaTagsDD(v0, collision);
if (!isValid) {
continue;
}

if (lambdaTag && aLambdaTag) {
continue;
}

if (lambdaTag) {
proton = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), o2::constants::physics::MassProton);
antiPion = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), o2::constants::physics::MassPionCharged);
lambda = proton + antiPion;
}
if (aLambdaTag) {
antiProton = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), o2::constants::physics::MassProton);
pion = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), o2::constants::physics::MassPionCharged);
antiLambda = antiProton + pion;
}

if (lambdaTag && (lambda.M() < lbinIM || lambda.M() > hbinIM)) {
continue;
}
if (aLambdaTag && (antiLambda.M() < lbinIM || antiLambda.M() > hbinIM)) {
continue;
}

// auto postrack1 = v0.template posTrackExtra_as<dauTracks>();
// auto negtrack1 = v0.template negTrackExtra_as<dauTracks>();

// 2nd loop for combination of lambda lambda
for (const auto& v02 : V0s) {
if (v02.index() <= v0.index()) {
continue;
}
auto [lambdaTag2, aLambdaTag2, isValid2] = getLambdaTagsDD(v02, collision);
if (!isValid2) {
continue;
}
if (lambdaTag2 && aLambdaTag2) {
continue;
}
if (lambdaTag2) {
proton2 = ROOT::Math::PxPyPzMVector(v02.pxpos(), v02.pypos(), v02.pzpos(), o2::constants::physics::MassProton);
antiPion2 = ROOT::Math::PxPyPzMVector(v02.pxneg(), v02.pyneg(), v02.pzneg(), o2::constants::physics::MassPionCharged);
lambda2 = proton2 + antiPion2;
}
if (aLambdaTag2) {
antiProton2 = ROOT::Math::PxPyPzMVector(v02.pxneg(), v02.pyneg(), v02.pzneg(), o2::constants::physics::MassProton);
pion2 = ROOT::Math::PxPyPzMVector(v02.pxpos(), v02.pypos(), v02.pzpos(), o2::constants::physics::MassPionCharged);
antiLambda2 = antiProton2 + pion2;
}

if (lambdaTag2 && (lambda2.M() < lbinIM || lambda2.M() > hbinIM)) {
continue;
}
if (aLambdaTag2 && (antiLambda2.M() < lbinIM || antiLambda2.M() > hbinIM)) {
continue;
}

// auto postrack2 = v02.template posTrackExtra_as<dauTracks>();
// auto negtrack2 = v02.template negTrackExtra_as<dauTracks>();
if (v0.posTrackExtraId() == v02.posTrackExtraId() || v0.negTrackExtraId() == v02.negTrackExtraId()) {
continue;
}

if (lambdaTag && lambdaTag2) {
fillHistograms(1, 0, 1, 0, lambda, lambda2, proton, proton2, centrality, 0);
}
if (aLambdaTag && aLambdaTag2) {
fillHistograms(0, 1, 0, 1, antiLambda, antiLambda2, antiProton, antiProton2, centrality, 0);
}
if (lambdaTag && aLambdaTag2) {
fillHistograms(1, 0, 0, 1, lambda, antiLambda2, proton, antiProton2, centrality, 0);
}
if (aLambdaTag && lambdaTag2) {
fillHistograms(0, 1, 1, 0, antiLambda, lambda2, antiProton, proton2, centrality, 0);
}
}
}
}
PROCESS_SWITCH(LfTaskLambdaSpinCorr, processDerivedData, "Process derived data", true);

Preslice<v0Candidates> tracksPerCollisionV0Mixed = o2::aod::v0data::straCollisionId; // for derived data only
void processDerivedDataMixed(soa::Join<aod::StraCollisions, aod::StraCents, aod::StraEvSels, aod::StraStamps> const& collisions, v0Candidates const& V0s, dauTracks const&)

{

for (auto& [collision1, collision2] : selfCombinations(colBinning, nMix, -1, collisions, collisions)) {

Check failure on line 922 in PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
// LOGF(info, "Mixed event collisions: (%d, %d)", collision1.index(), collision2.index());
if (rctCut.requireRCTFlagChecker && !rctChecker(collision1)) {
continue;
}
if (rctCut.requireRCTFlagChecker && !rctChecker(collision2)) {
continue;
}
int occupancy1 = collision1.trackOccupancyInTimeRange();
int occupancy2 = collision2.trackOccupancyInTimeRange();

if (collision1.index() == collision2.index()) {
continue;
}
if (!collision1.sel8() || !collision2.sel8()) {
continue;
}
if (additionalEvSel && (!collision1.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision1.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) {
continue;
}
if (occupancy1 > cfgCutOccupancy) {
continue;
}
if (additionalEvSel && (!collision2.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision2.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) {
continue;
}
if (occupancy2 > cfgCutOccupancy) {
continue;
}
if (additionalEvSel3 && (!collision1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision1.selection_bit(aod::evsel::kNoITSROFrameBorder))) {
continue;
}
if (additionalEvSel4 && !collision1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) {
continue;
}
if (mixingEvSel && additionalEvSel5 && !collision1.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) {
continue;
}

if (additionalEvSel3 && (!collision2.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision2.selection_bit(aod::evsel::kNoITSROFrameBorder))) {
continue;
}
if (additionalEvSel4 && !collision2.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) {
continue;
}
if (mixingEvSel && additionalEvSel5 && !collision2.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) {
continue;
}
auto centrality = collision1.centFT0C();
auto groupV01 = V0s.sliceBy(tracksPerCollisionV0Mixed, collision1.globalIndex());
auto groupV02 = V0s.sliceBy(tracksPerCollisionV0Mixed, collision1.globalIndex());
auto groupV03 = V0s.sliceBy(tracksPerCollisionV0Mixed, collision2.globalIndex());

size_t rows = groupV03.size() + 20;
size_t cols = groupV01.size() + 20;
std::vector<std::vector<bool>> pairStatus(rows, std::vector<bool>(cols, false));
histos.fill(HIST("hv0Mult"), groupV01.size());
for (auto& [t1, t2] : soa::combinations(o2::soa::CombinationsFullIndexPolicy(groupV01, groupV02))) {

Check failure on line 979 in PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
bool pairfound = false;
if (t2.index() <= t1.index()) {
continue;
}
if (t1.straCollisionId() != t2.straCollisionId()) {
continue;
}

auto [lambdaTag1, aLambdaTag1, isValid1] = getLambdaTagsDD(t1, collision1);
auto [lambdaTag2, aLambdaTag2, isValid2] = getLambdaTagsDD(t2, collision1);
if (!isValid1) {
continue;
}
if (!isValid2) {
continue;
}
if (lambdaTag1 && aLambdaTag1) {
continue;
}
if (lambdaTag2 && aLambdaTag2) {
continue;
}
// auto postrack1 = t1.template posTrackExtra_as<dauTracks>();
// auto negtrack1 = t1.template negTrackExtra_as<dauTracks>();
// auto postrack2 = t2.template posTrackExtra_as<dauTracks>();
// auto negtrack2 = t2.template negTrackExtra_as<dauTracks>();
if (t1.posTrackExtraId() == t2.posTrackExtraId() || t1.negTrackExtraId() == t2.negTrackExtraId()) {
continue;
}
// auto samePairSumPt = t1.pt() + t2.pt();
// auto samePairR = TMath::Sqrt(TMath::Power(t1.phi() - t2.phi(), 2.0) + TMath::Power(t1.eta() - t2.eta(), 2.0));

double deltaPhiSame = RecoDecay::constrainAngle(t1.phi() - t2.phi(), 0.0);
auto samePairR = TMath::Sqrt(TMath::Power(deltaPhiSame, 2.0) + TMath::Power(t1.eta() - t2.eta(), 2.0));

Check failure on line 1013 in PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[root/entity]

Replace ROOT entities with equivalents from standard C++ or from O2.

if (lambdaTag1) {
proton0 = ROOT::Math::PxPyPzMVector(t1.pxpos(), t1.pypos(), t1.pzpos(), o2::constants::physics::MassProton);
antiPion0 = ROOT::Math::PxPyPzMVector(t1.pxneg(), t1.pyneg(), t1.pzneg(), o2::constants::physics::MassPionCharged);
lambda0 = proton0 + antiPion0;
}
if (aLambdaTag1) {
antiProton0 = ROOT::Math::PxPyPzMVector(t1.pxneg(), t1.pyneg(), t1.pzneg(), o2::constants::physics::MassProton);
pion0 = ROOT::Math::PxPyPzMVector(t1.pxpos(), t1.pypos(), t1.pzpos(), o2::constants::physics::MassPionCharged);
antiLambda0 = antiProton0 + pion0;
}
if (lambdaTag1 && (lambda0.M() < lbinIM || lambda0.M() > hbinIM)) {
continue;
}
if (aLambdaTag1 && (antiLambda0.M() < lbinIM || antiLambda0.M() > hbinIM)) {
continue;
}
if (lambdaTag2) {
proton = ROOT::Math::PxPyPzMVector(t2.pxpos(), t2.pypos(), t2.pzpos(), o2::constants::physics::MassProton);
antiPion = ROOT::Math::PxPyPzMVector(t2.pxneg(), t2.pyneg(), t2.pzneg(), o2::constants::physics::MassPionCharged);
lambda = proton + antiPion;
}
if (aLambdaTag2) {
antiProton = ROOT::Math::PxPyPzMVector(t2.pxneg(), t2.pyneg(), t2.pzneg(), o2::constants::physics::MassProton);
pion = ROOT::Math::PxPyPzMVector(t2.pxpos(), t2.pypos(), t2.pzpos(), o2::constants::physics::MassPionCharged);
antiLambda = antiProton + pion;
}
if (lambdaTag2 && (lambda.M() < lbinIM || lambda.M() > hbinIM)) {
continue;
}
if (aLambdaTag2 && (antiLambda.M() < lbinIM || antiLambda.M() > hbinIM)) {
continue;
}

for (const auto& t3 : groupV03) {
if (pairStatus[t3.index()][t2.index()]) {
continue;
}
if (t1.straCollisionId() == t3.straCollisionId()) {
continue;
}
auto [lambdaTag3, aLambdaTag3, isValid3] = getLambdaTagsDD(t3, collision2);
if (!isValid3) {
continue;
}
if (lambdaTag3 && aLambdaTag3) {
continue;
}
if (lambdaTag1 != lambdaTag3 || aLambdaTag1 != aLambdaTag3) {
continue;
}

if (lambdaTag3) {
proton2 = ROOT::Math::PxPyPzMVector(t3.pxpos(), t3.pypos(), t3.pzpos(), o2::constants::physics::MassProton);
antiPion2 = ROOT::Math::PxPyPzMVector(t3.pxneg(), t3.pyneg(), t3.pzneg(), o2::constants::physics::MassPionCharged);
lambda2 = proton2 + antiPion2;
}
if (aLambdaTag3) {
antiProton2 = ROOT::Math::PxPyPzMVector(t3.pxneg(), t3.pyneg(), t3.pzneg(), o2::constants::physics::MassProton);
pion2 = ROOT::Math::PxPyPzMVector(t3.pxpos(), t3.pypos(), t3.pzpos(), o2::constants::physics::MassPionCharged);
antiLambda2 = antiProton2 + pion2;
}
if (lambdaTag3 && (lambda2.M() < lbinIM || lambda2.M() > hbinIM)) {
continue;
}

if (aLambdaTag3 && (antiLambda2.M() < lbinIM || antiLambda2.M() > hbinIM)) {
continue;
}

double deltaPhiMix = RecoDecay::constrainAngle(t3.phi() - t2.phi(), 0.0);
auto mixPairR = TMath::Sqrt(TMath::Power(deltaPhiMix, 2.0) + TMath::Power(t3.eta() - t2.eta(), 2.0));

Check failure on line 1085 in PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[root/entity]

Replace ROOT entities with equivalents from standard C++ or from O2.

auto etaDiff = t1.eta() - t3.eta();
auto phiDiff = RecoDecay::constrainAngle(t1.phi() - t3.phi(), 0.0);

histos.fill(HIST("hPtDiff"), t1.pt() - t3.pt());
histos.fill(HIST("hPhiDiff"), phiDiff);
histos.fill(HIST("hRDiff"), etaDiff);

if (mixingCombination == 0 && std::abs(t1.pt() - t3.pt()) > ptMix) {
continue;
}
if (mixingCombination == 0 && t1.eta() * t3.eta() > 0 && std::abs(etaDiff) > etaMix) {
continue;
}
if (mixingCombination == 0 && phiDiff > phiMix) {
continue;
}
if (mixingCombination == 1 && std::abs(t1.pt() - t3.pt()) > ptMix) {
continue;
}
if (mixingCombination == 1 && std::abs(mixPairR - samePairR) > etaMix) {
continue;
}
if (lambdaTag2 && lambdaTag3) {
fillHistograms(1, 0, 1, 0, lambda, lambda2, proton, proton2, centrality, 2);
} else if (aLambdaTag2 && aLambdaTag3) {
fillHistograms(0, 1, 0, 1, antiLambda, antiLambda2, antiProton, antiProton2, centrality, 2);
} else if (lambdaTag2 && aLambdaTag3) {
fillHistograms(1, 0, 0, 1, lambda, antiLambda2, proton, antiProton2, centrality, 2);
} else if (aLambdaTag2 && lambdaTag3) {
fillHistograms(0, 1, 1, 0, antiLambda, lambda2, antiProton, proton2, centrality, 2);
} else {
continue;
}
pairfound = true;
pairStatus[t3.index()][t2.index()] = true;
if (pairfound) {
break;
}
}
}
}
}

PROCESS_SWITCH(LfTaskLambdaSpinCorr, processDerivedDataMixed, "Process mixed derived data", true);

using CollisionMCRecTableCentFT0C = soa::Join<aod::Collisions, aod::CentFT0Cs, aod::EvSels>;
using TrackMCRecTable = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::TrackSelection, aod::pidTPCFullPi, aod::pidTPCFullPr>;
using V0TrackCandidatesMC = soa::Join<aod::V0Datas, aod::McV0Labels>;
Expand Down Expand Up @@ -849,7 +1212,7 @@
// Processing Event Mixing MC
void processMEMC(CollisionMCRecTableCentFT0C const& collisions, TrackMCRecTable const&, V0TrackCandidatesMC const& V0s)
{
for (auto& [collision1, collision2] : selfCombinations(colBinning, nMix, -1, collisions, collisions)) {

Check failure on line 1215 in PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
// LOGF(info, "Mixed event collisions: (%d, %d)", collision1.index(), collision2.index());

if (collision1.index() == collision2.index()) {
Expand Down
Loading