Skip to content

Commit ed71320

Browse files
authored
Merge branch 'AliceO2Group:master' into master
2 parents dd0bf2c + d3895b9 commit ed71320

File tree

64 files changed

+3234
-1216
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+3234
-1216
lines changed

ALICE3/DataModel/OTFStrangeness.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,37 @@ DECLARE_SOA_TABLE(UpgradeCascades, "AOD", "UPGRADECASCADES",
6565

6666
using UpgradeCascade = UpgradeCascades::iterator;
6767

68+
namespace otfv0
69+
{
70+
DECLARE_SOA_INDEX_COLUMN(Collision, collision); //!
71+
DECLARE_SOA_INDEX_COLUMN_FULL(PosTrack, posTrack, int, Tracks, "_Pos"); //!
72+
DECLARE_SOA_INDEX_COLUMN_FULL(NegTrack, negTrack, int, Tracks, "_Neg"); //!
73+
DECLARE_SOA_INDEX_COLUMN(V0, v0); //!
74+
75+
// topo vars
76+
DECLARE_SOA_COLUMN(DCAV0Daughters, dcaV0Daughters, float);
77+
DECLARE_SOA_COLUMN(V0Radius, v0Radius, float);
78+
DECLARE_SOA_COLUMN(MLambda, mLambda, float);
79+
DECLARE_SOA_COLUMN(MAntiLambda, mAntiLambda, float);
80+
DECLARE_SOA_COLUMN(MK0, mK0, float);
81+
82+
// kinematics
83+
DECLARE_SOA_COLUMN(Pt, pt, float);
84+
85+
} // namespace otfv0
86+
DECLARE_SOA_TABLE(UpgradeV0s, "AOD", "UPGRADEV0S",
87+
o2::soa::Index<>,
88+
otfv0::CollisionId,
89+
otfv0::PosTrackId,
90+
otfv0::NegTrackId,
91+
otfv0::DCAV0Daughters,
92+
otfv0::V0Radius,
93+
otfv0::MLambda,
94+
otfv0::MAntiLambda,
95+
otfv0::MK0,
96+
otfv0::Pt);
97+
98+
using UpgradeV0 = UpgradeV0s::iterator;
6899
} // namespace o2::aod
69100

70101
#endif // ALICE3_DATAMODEL_OTFSTRANGENESS_H_

ALICE3/TableProducer/OTF/onTheFlyTracker.cxx

Lines changed: 316 additions & 6 deletions
Large diffs are not rendered by default.

ALICE3/Tasks/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,8 @@ o2physics_add_dpl_workflow(alice3-pid-evaluation
7878
SOURCES alice3PidEvaluation.cxx
7979
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore
8080
COMPONENT_NAME Analysis)
81+
82+
o2physics_add_dpl_workflow(alice3-strangeness
83+
SOURCES alice3-strangeness.cxx
84+
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore
85+
COMPONENT_NAME Analysis)

ALICE3/Tasks/alice3-dilepton.cxx

Lines changed: 94 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,21 @@
1414
/// \author s.scheid@cern.ch, daiki.sekihata@cern.ch
1515
///
1616

17-
#include "Math/Vector4D.h"
18-
// O2 includes
19-
#include "Framework/AnalysisTask.h"
20-
#include "Framework/ASoAHelpers.h"
21-
#include "Framework/runDataProcessing.h"
22-
#include "Framework/HistogramRegistry.h"
23-
#include "CommonConstants/PhysicsConstants.h"
24-
#include "Common/DataModel/TrackSelectionTables.h"
25-
#include "Framework/AnalysisDataModel.h"
26-
#include "ALICE3/DataModel/OTFTOF.h"
2717
#include "ALICE3/DataModel/OTFRICH.h"
18+
#include "ALICE3/DataModel/OTFTOF.h"
2819
#include "ALICE3/DataModel/tracksAlice3.h"
20+
#include "Common/DataModel/TrackSelectionTables.h"
21+
22+
#include <CommonConstants/PhysicsConstants.h>
23+
#include <Framework/ASoAHelpers.h>
24+
#include <Framework/AnalysisDataModel.h>
25+
#include <Framework/AnalysisTask.h>
26+
#include <Framework/HistogramRegistry.h>
27+
#include <Framework/runDataProcessing.h>
28+
29+
#include <Math/Vector4D.h>
30+
31+
#include <vector>
2932

3033
using namespace o2;
3134
using namespace o2::aod;
@@ -128,6 +131,15 @@ struct Alice3Dilepton {
128131
registry.addClone("Reconstructed/Pair/ULS/", "Reconstructed/Pair/LSpp/");
129132
registry.addClone("Reconstructed/Pair/ULS/", "Reconstructed/Pair/LSnn/");
130133

134+
registry.add("ReconstructedFiltered/Pair/ULS/Mass", "Pair Mass", kTH1F, {axisM});
135+
registry.add("ReconstructedFiltered/Pair/ULS/Pt", "Pair Pt", kTH1F, {axisPt});
136+
registry.add("ReconstructedFiltered/Pair/ULS/Eta", "Pair Eta", kTH1F, {axisEta});
137+
registry.add("ReconstructedFiltered/Pair/ULS/Phi", "Pair Phi", kTH1F, {axisPhi});
138+
registry.add("ReconstructedFiltered/Pair/ULS/Mass_Pt", "Pair Mass vs. Pt", kTH2F, {axisM, axisPt}, true);
139+
140+
registry.addClone("ReconstructedFiltered/Pair/ULS/", "ReconstructedFiltered/Pair/LSpp/");
141+
registry.addClone("ReconstructedFiltered/Pair/ULS/", "ReconstructedFiltered/Pair/LSnn/");
142+
131143
HistogramConfigSpec hs_rec{HistType::kTHnSparseF, {axisM, axisPt, axisDCAxy}, 3};
132144
registry.add("Reconstructed/Pair/ULS/hs_rec", "", hs_rec);
133145
registry.add("Reconstructed/Pair/LSpp/hs_rec", "", hs_rec);
@@ -287,6 +299,69 @@ struct Alice3Dilepton {
287299
return HFllType::kUndef;
288300
}
289301

302+
template <typename T1, typename T2>
303+
ROOT::Math::PtEtaPhiMVector buildPairDCA(T1 const& t1, T2 const& t2, float& pair_dca_xy)
304+
{
305+
306+
const float dcaXY_t1 = t1.dcaXY();
307+
const float dcaXY_t2 = t2.dcaXY();
308+
const float dcaXY_res_t1 = sqrt(t1.cYY());
309+
const float dcaXY_res_t2 = sqrt(t2.cYY());
310+
311+
pair_dca_xy = sqrt((dcaXY_t2 * dcaXY_t2 / dcaXY_res_t2 + dcaXY_t1 * dcaXY_t1 / dcaXY_res_t1) / 2.);
312+
ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), std::abs(pdg) == 11 ? o2::constants::physics::MassElectron : o2::constants::physics::MassMuon); // reconstructed pt/eta/phi
313+
ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), std::abs(pdg) == 11 ? o2::constants::physics::MassElectron : o2::constants::physics::MassMuon); // reconstructed pt/eta/phi
314+
ROOT::Math::PtEtaPhiMVector v12 = v1 + v2;
315+
return v12;
316+
}
317+
318+
template <PairType pairtype, typename TTracks, typename TMCTracks>
319+
void FillPairRecWithPrefilter(TTracks const& tracks1, TTracks const& tracks2, TMCTracks const& /*mcParticles*/)
320+
{
321+
std::vector<uint64_t> prefilteredTracks;
322+
if constexpr (pairtype == PairType::kULS) {
323+
for (auto& [t1, t2] : combinations(soa::CombinationsFullIndexPolicy(tracks1, tracks2))) {
324+
if (!t1.has_mcParticle() || !t2.has_mcParticle()) {
325+
continue;
326+
}
327+
328+
float pair_dca_xy = 999.f;
329+
ROOT::Math::PtEtaPhiMVector v12 = buildPairDCA(t1, t2, pair_dca_xy);
330+
// prefilter for low-mass pairs
331+
if (v12.M() > 0.10) {
332+
continue;
333+
}
334+
// prefilter small opening angle pairs
335+
if (std::cos(t1.phi() - t2.phi()) < 0.99) {
336+
continue;
337+
}
338+
prefilteredTracks.push_back(t1.globalIndex());
339+
prefilteredTracks.push_back(t2.globalIndex());
340+
341+
} // end of unlike-sign pair loop
342+
343+
for (auto& [t1, t2] : combinations(soa::CombinationsFullIndexPolicy(tracks1, tracks2))) {
344+
// Skipping tracks that are in the prefiltered list
345+
if (std::find(prefilteredTracks.begin(), prefilteredTracks.end(), t1.globalIndex()) != prefilteredTracks.end()) {
346+
continue;
347+
}
348+
if (std::find(prefilteredTracks.begin(), prefilteredTracks.end(), t2.globalIndex()) != prefilteredTracks.end()) {
349+
continue;
350+
}
351+
352+
float pair_dca_xy = 999.f;
353+
ROOT::Math::PtEtaPhiMVector v12 = buildPairDCA(t1, t2, pair_dca_xy);
354+
355+
registry.fill(HIST("ReconstructedFiltered/Pair/ULS/Mass"), v12.M());
356+
registry.fill(HIST("ReconstructedFiltered/Pair/ULS/Pt"), v12.Pt());
357+
registry.fill(HIST("ReconstructedFiltered/Pair/ULS/Eta"), v12.Eta());
358+
registry.fill(HIST("ReconstructedFiltered/Pair/ULS/Phi"), v12.Phi() < 0.f ? v12.Phi() + TMath::TwoPi() : v12.Phi());
359+
registry.fill(HIST("ReconstructedFiltered/Pair/ULS/Mass_Pt"), v12.M(), v12.Pt());
360+
registry.fill(HIST("ReconstructedFiltered/Pair/ULS/hs_rec"), v12.M(), v12.Pt(), pair_dca_xy);
361+
}
362+
}
363+
}
364+
290365
template <PairType pairtype, typename TTracks, typename TMCTracks>
291366
void FillPairRec(TTracks const& tracks1, TTracks const& tracks2, TMCTracks const& mcParticles)
292367
{
@@ -314,15 +389,8 @@ struct Alice3Dilepton {
314389
}
315390
// auto mother = mcparticles.iteratorAt(motherid);
316391

317-
// float dcaXY_t1 = t1.dcaXY();
318-
// float dcaXY_t2 = t2.dcaXY();
319-
// float dcaXY_res_t1 = sqrt(t1.cYY());
320-
// float dcaXY_res_t2 = sqrt(t2.cYY());
321-
322-
float pair_dca_xy = sqrt((pow(t2.dcaXY() / sqrt(t2.cYY()), 2) + pow(t1.dcaXY() / sqrt(t1.cYY()), 2)) / 2.);
323-
ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), std::abs(pdg) == 11 ? o2::constants::physics::MassElectron : o2::constants::physics::MassMuon); // reconstructed pt/eta/phi
324-
ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), std::abs(pdg) == 11 ? o2::constants::physics::MassElectron : o2::constants::physics::MassMuon); // reconstructed pt/eta/phi
325-
ROOT::Math::PtEtaPhiMVector v12 = v1 + v2;
392+
float pair_dca_xy = 999.f;
393+
ROOT::Math::PtEtaPhiMVector v12 = buildPairDCA(t1, t2, pair_dca_xy);
326394

327395
registry.fill(HIST("Reconstructed/Pair/ULS/Mass"), v12.M());
328396
registry.fill(HIST("Reconstructed/Pair/ULS/Pt"), v12.Pt());
@@ -356,15 +424,8 @@ struct Alice3Dilepton {
356424
}
357425
// auto mother = mcparticles.iteratorAt(motherid);
358426

359-
// float dcaXY_t1 = t1.dcaXY();
360-
// float dcaXY_t2 = t2.dcaXY();
361-
// float dcaXY_res_t1 = sqrt(t1.cYY());
362-
// float dcaXY_res_t2 = sqrt(t2.cYY());
363-
364-
float pair_dca_xy = sqrt((pow(t2.dcaXY() / sqrt(t2.cYY()), 2) + pow(t1.dcaXY() / sqrt(t1.cYY()), 2)) / 2.);
365-
ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), std::abs(pdg) == 11 ? o2::constants::physics::MassElectron : o2::constants::physics::MassMuon); // reconstructed pt/eta/phi
366-
ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), std::abs(pdg) == 11 ? o2::constants::physics::MassElectron : o2::constants::physics::MassMuon); // reconstructed pt/eta/phi
367-
ROOT::Math::PtEtaPhiMVector v12 = v1 + v2;
427+
float pair_dca_xy = 999.f;
428+
ROOT::Math::PtEtaPhiMVector v12 = buildPairDCA(t1, t2, pair_dca_xy);
368429

369430
if constexpr (pairtype == PairType::kLSpp) {
370431
registry.fill(HIST("Reconstructed/Pair/LSpp/Mass"), v12.M());
@@ -464,6 +525,7 @@ struct Alice3Dilepton {
464525
} // end of like-sign pair loop
465526
}
466527
}
528+
467529
// Functions for pid
468530
template <typename TTrack>
469531
bool electronIDTOF(TTrack const& track)
@@ -545,11 +607,10 @@ struct Alice3Dilepton {
545607
Partition<MyFilteredTracksMC> posTracks = o2::aod::track::signed1Pt > 0.f;
546608
Partition<MyFilteredTracksMC> negTracks = o2::aod::track::signed1Pt < 0.f;
547609

548-
void processRec(
549-
const o2::aod::Collisions& collisions,
550-
MyFilteredTracksMC const& tracks,
551-
const o2::aod::McCollisions&,
552-
const aod::McParticles& mcParticles)
610+
void processRec(const o2::aod::Collisions& collisions,
611+
MyFilteredTracksMC const& tracks,
612+
const o2::aod::McCollisions&,
613+
const aod::McParticles& mcParticles)
553614
{
554615
for (const auto& collision : collisions) {
555616
registry.fill(HIST("Reconstructed/Event/VtxX"), collision.posX());
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
///
12+
/// \file alice3-strangeness.cxx
13+
///
14+
/// \brief This task produces invariant mass distributions for strange hadrons
15+
///
16+
/// \author Lucia Anna Tarasovičová, Pavol Jozef Šafárik University (SK)
17+
/// \since November 20, 2025
18+
///
19+
20+
#include "ALICE3/DataModel/OTFStrangeness.h"
21+
#include "ALICE3/DataModel/tracksAlice3.h"
22+
#include "Common/DataModel/TrackSelectionTables.h"
23+
24+
#include "Framework/AnalysisDataModel.h"
25+
#include "Framework/AnalysisTask.h"
26+
#include "Framework/runDataProcessing.h"
27+
#include <CommonConstants/MathConstants.h>
28+
#include <CommonConstants/PhysicsConstants.h>
29+
#include <DCAFitter/DCAFitterN.h>
30+
#include <DataFormatsParameters/GRPMagField.h>
31+
#include <DetectorsBase/Propagator.h>
32+
#include <DetectorsVertexing/PVertexer.h>
33+
#include <DetectorsVertexing/PVertexerHelpers.h>
34+
#include <Field/MagneticField.h>
35+
#include <Framework/AnalysisDataModel.h>
36+
#include <Framework/AnalysisTask.h>
37+
#include <Framework/HistogramRegistry.h>
38+
#include <Framework/O2DatabasePDGPlugin.h>
39+
#include <Framework/runDataProcessing.h>
40+
#include <ReconstructionDataFormats/DCA.h>
41+
#include <SimulationDataFormat/InteractionSampler.h>
42+
43+
#include <TGenPhaseSpace.h>
44+
#include <TGeoGlobalMagField.h>
45+
#include <TLorentzVector.h>
46+
#include <TPDGCode.h>
47+
#include <TRandom3.h>
48+
49+
#include <string>
50+
#include <vector>
51+
52+
using namespace o2;
53+
using namespace o2::framework;
54+
55+
using alice3tracks = soa::Join<aod::Tracks, aod::TracksCov, aod::McTrackLabels, aod::TracksDCA, aod::TracksExtraA3>;
56+
57+
struct alice3strangeness {
58+
HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject};
59+
ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for QA histograms"};
60+
ConfigurableAxis axisK0Mass{"axisK0Mass", {200, 0.4f, 0.6f}, ""};
61+
ConfigurableAxis axisVertexZ{"axisVertexZ", {40, -20, 20}, "vertex Z (cm)"};
62+
63+
void init(InitContext&)
64+
{
65+
histos.add("K0/hMassAllCandidates", "", kTH2D, {axisK0Mass, axisPt});
66+
histos.add("K0/hMassSelected", "", kTH2D, {axisK0Mass, axisPt});
67+
histos.add("K0/hSelections", "", kTH1D, {{10, 0, 10}});
68+
histos.add("K0/hDCANegDaughter", "", kTH1D, {{200, -5, 5}});
69+
histos.add("K0/hDCAPosDaughter", "", kTH1D, {{200, -5, 5}});
70+
histos.add("hPVz", "hPVz", kTH1F, {axisVertexZ});
71+
}
72+
long int nEvents = 0;
73+
void process(aod::Collisions const& collisions, aod::McCollisions const& mcCollisions, aod::UpgradeV0s const& v0Recos, alice3tracks const&)
74+
{
75+
LOG(info) << "Event processed " << nEvents++ << " :" << collisions.size() << " " << mcCollisions.size();
76+
for (const auto& collision : collisions) {
77+
float collisionZ = collision.posZ();
78+
// std::cout << "______ process V0_______" << collision.size() << std::endl;
79+
histos.fill(HIST("hPVz"), collisionZ);
80+
for (const auto& v0Cand : v0Recos) {
81+
82+
auto negV0Daughter = v0Cand.negTrack_as<alice3tracks>(); // de-reference neg track
83+
auto posV0Daughter = v0Cand.posTrack_as<alice3tracks>(); // de-reference pos track
84+
85+
bool isK0 = v0Cand.mK0() > 0;
86+
if (isK0) {
87+
histos.fill(HIST("K0/hMassAllCandidates"), v0Cand.mK0(), v0Cand.pt());
88+
histos.fill(HIST("K0/hSelections"), 0); // all candidates
89+
histos.fill(HIST("K0/hDCANegDaughter"), negV0Daughter.dcaXY());
90+
histos.fill(HIST("K0/hDCAPosDaughter"), posV0Daughter.dcaXY());
91+
if (std::abs(negV0Daughter.dcaXY()) < 0.05)
92+
continue;
93+
histos.fill(HIST("K0/hSelections"), 1); // dcaXY cut
94+
if (std::abs(posV0Daughter.dcaXY()) < 0.05)
95+
continue;
96+
histos.fill(HIST("K0/hSelections"), 2); // dcaXY cut
97+
if (v0Cand.dcaV0Daughters() > 1.0)
98+
continue;
99+
histos.fill(HIST("K0/hSelections"), 3); // dca between daughters
100+
if (v0Cand.v0Radius() < 0.5)
101+
continue;
102+
histos.fill(HIST("K0/hSelections"), 4); // radius cut
103+
if (std::abs(negV0Daughter.eta()) > 0.8 || std::abs(posV0Daughter.eta()) > 0.8)
104+
continue;
105+
histos.fill(HIST("K0/hSelections"), 5); // eta cut
106+
histos.fill(HIST("K0/hMassSelected"), v0Cand.mK0(), v0Cand.pt());
107+
}
108+
}
109+
}
110+
}
111+
PROCESS_SWITCH(alice3strangeness, process, "", true);
112+
};
113+
114+
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
115+
{
116+
return WorkflowSpec{
117+
adaptAnalysisTask<alice3strangeness>(cfgc)};
118+
}

Common/Core/FFitWeights.cxx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,12 @@ void FFitWeights::fillWeights(float centrality, float qn, int nh, const char* pf
104104
th2->Fill(centrality, qn);
105105
};
106106

107-
void FFitWeights::fillPt(float centrality, float pt, bool first)
107+
void FFitWeights::fillPt(float centrality, float pt, float weight, bool first)
108108
{
109109
if (first) {
110-
ptProfCent->Fill(centrality, pt);
110+
ptProfCent->Fill(centrality, pt, weight);
111111
} else {
112-
h2ptCent->Fill(centrality, pt);
112+
h2ptCent->Fill(centrality, pt, weight);
113113
}
114114
};
115115
float FFitWeights::getPtMult(float centrality)

Common/Core/FFitWeights.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class FFitWeights : public TNamed
4141

4242
void init();
4343
void fillWeights(float centrality, float qn, int nh, const char* pf = "");
44-
void fillPt(float centrality, float pt, bool first);
44+
void fillPt(float centrality, float pt, float weight, bool first);
4545
float getPtMult(float centrality);
4646
TObjArray* getDataArray() { return fW_data; }
4747

0 commit comments

Comments
 (0)