Skip to content

Commit d9cd434

Browse files
authored
Merge branch 'AliceO2Group:master' into jethadronBranch
2 parents c278d7a + dbbe3fa commit d9cd434

File tree

2 files changed

+157
-34
lines changed

2 files changed

+157
-34
lines changed

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());

PWGDQ/Core/MCSignalLibrary.cxx

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name)
234234
return signal;
235235
}
236236
if (!nameStr.compare("nonPromptPsi2S")) {
237-
MCProng prong(2, {100443, 503}, {true, true}, {false, true}, {0, 0}, {0, 0}, {false, false});
237+
MCProng prong(1, {100443}, {true}, {false}, {0}, {0}, {false}, false, {503}, {false});
238238
signal = new MCSignal(name, "Non-prompt psi2s", {prong}, {-1});
239239
return signal;
240240
}
@@ -1858,18 +1858,54 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name)
18581858
return signal;
18591859
}
18601860

1861+
if (!nameStr.compare("JpsiFromPromptPsi2S")) {
1862+
MCProng prong(2, {443, 100443}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {503}, {true});
1863+
signal = new MCSignal(name, "Jpsi from prompt Psi2S", {prong}, {-1});
1864+
return signal;
1865+
}
1866+
1867+
if (!nameStr.compare("JpsiFromNonpromptPsi2S")) {
1868+
MCProng prong(2, {443, 100443}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {503}, {false});
1869+
signal = new MCSignal(name, "Jpsi from non-prompt Psi2S", {prong}, {-1});
1870+
return signal;
1871+
}
1872+
18611873
if (!nameStr.compare("eFromJpsiFromPsi2S")) {
18621874
MCProng prong(3, {11, 443, 100443}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false});
18631875
signal = new MCSignal(name, "Electron from Jpsi from Psi2S", {prong}, {1});
18641876
return signal;
18651877
}
18661878

1879+
if (!nameStr.compare("eFromJpsiFromPromptPsi2S")) {
1880+
MCProng prong(3, {11, 443, 100443}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}, false, {503}, {true});
1881+
signal = new MCSignal(name, "Electron from Jpsi from prompt Psi2S", {prong}, {1});
1882+
return signal;
1883+
}
1884+
1885+
if (!nameStr.compare("eFromJpsiFromNonpromptPsi2S")) {
1886+
MCProng prong(3, {11, 443, 100443}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}, false, {503}, {false});
1887+
signal = new MCSignal(name, "Electron from Jpsi from non-prompt Psi2S", {prong}, {1});
1888+
return signal;
1889+
}
1890+
18671891
if (!nameStr.compare("PionFromPsi2S")) {
18681892
MCProng prong(1, {211}, {true}, {false}, {0}, {0}, {false}, false, {100443}, {false});
18691893
signal = new MCSignal(name, "Pion from Jpsi from Psi2S", {prong}, {-1});
18701894
return signal;
18711895
}
18721896

1897+
if (!nameStr.compare("PionFromPromptPsi2S")) {
1898+
MCProng prong(2, {211, 100443}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {503}, {true});
1899+
signal = new MCSignal(name, "Pion from prompt Psi2S", {prong}, {-1});
1900+
return signal;
1901+
}
1902+
1903+
if (!nameStr.compare("PionFromNonpromptPsi2S")) {
1904+
MCProng prong(2, {211, 100443}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {503}, {false});
1905+
signal = new MCSignal(name, "Pion from non-prompt Psi2S", {prong}, {-1});
1906+
return signal;
1907+
}
1908+
18731909
if (!nameStr.compare("eeFromJpsiFromX3872")) {
18741910
MCProng prong(2, {11, 443}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {9920443}, {false});
18751911
signal = new MCSignal(name, "Electron pair from Jpsi from X3872", {prong, prong}, {1, 1});
@@ -1896,6 +1932,18 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name)
18961932
return signal;
18971933
}
18981934

1935+
if (!nameStr.compare("eeFromJpsiFromPromptPsi2S")) {
1936+
MCProng prong(3, {11, 443, 100443}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}, false, {503}, {true});
1937+
signal = new MCSignal(name, "Electron pair from Jpsi from prompt Psi2S", {prong, prong}, {1, 1});
1938+
return signal;
1939+
}
1940+
1941+
if (!nameStr.compare("eeFromJpsiFromNonpromptPsi2S")) {
1942+
MCProng prong(3, {11, 443, 100443}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}, false, {503}, {false});
1943+
signal = new MCSignal(name, "Electron pair from Jpsi from non-prompt Psi2S", {prong, prong}, {1, 1});
1944+
return signal;
1945+
}
1946+
18991947
if (!nameStr.compare("JpsiPiPiFromPsi2S")) {
19001948
MCProng prongJpsi(2, {443, 100443}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false});
19011949
MCProng prongPi(2, {211, 100443}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false});
@@ -1910,6 +1958,20 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name)
19101958
return signal;
19111959
}
19121960

1961+
if (!nameStr.compare("eePiPiFromPromptPsi2S")) {
1962+
MCProng pronge(3, {11, 443, 100443}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}, false, {503}, {true});
1963+
MCProng prongPi(2, {211, 100443}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {503}, {true});
1964+
signal = new MCSignal(name, "Electron pair and pion pair from prompt Psi2S", {pronge, pronge, prongPi, prongPi}, {2, 2, 1, 1});
1965+
return signal;
1966+
}
1967+
1968+
if (!nameStr.compare("eePiPiFromNonpromptPsi2S")) {
1969+
MCProng pronge(3, {11, 443, 100443}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}, false, {503}, {false});
1970+
MCProng prongPi(2, {211, 100443}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {503}, {false});
1971+
signal = new MCSignal(name, "Electron pair and pion pair from non-prompt Psi2S", {pronge, pronge, prongPi, prongPi}, {2, 2, 1, 1});
1972+
return signal;
1973+
}
1974+
19131975
if (!nameStr.compare("eeFromPromptJpsiAnyPrimary")) {
19141976
MCProng pronge(2, {11, 443}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {503}, {true});
19151977
pronge.SetSourceBit(0, MCProng::kPhysicalPrimary);

0 commit comments

Comments
 (0)