|
14 | 14 | /// \author s.scheid@cern.ch, daiki.sekihata@cern.ch |
15 | 15 | /// |
16 | 16 |
|
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" |
27 | 17 | #include "ALICE3/DataModel/OTFRICH.h" |
| 18 | +#include "ALICE3/DataModel/OTFTOF.h" |
28 | 19 | #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> |
29 | 32 |
|
30 | 33 | using namespace o2; |
31 | 34 | using namespace o2::aod; |
@@ -128,6 +131,15 @@ struct Alice3Dilepton { |
128 | 131 | registry.addClone("Reconstructed/Pair/ULS/", "Reconstructed/Pair/LSpp/"); |
129 | 132 | registry.addClone("Reconstructed/Pair/ULS/", "Reconstructed/Pair/LSnn/"); |
130 | 133 |
|
| 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 | + |
131 | 143 | HistogramConfigSpec hs_rec{HistType::kTHnSparseF, {axisM, axisPt, axisDCAxy}, 3}; |
132 | 144 | registry.add("Reconstructed/Pair/ULS/hs_rec", "", hs_rec); |
133 | 145 | registry.add("Reconstructed/Pair/LSpp/hs_rec", "", hs_rec); |
@@ -287,6 +299,69 @@ struct Alice3Dilepton { |
287 | 299 | return HFllType::kUndef; |
288 | 300 | } |
289 | 301 |
|
| 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 | + |
290 | 365 | template <PairType pairtype, typename TTracks, typename TMCTracks> |
291 | 366 | void FillPairRec(TTracks const& tracks1, TTracks const& tracks2, TMCTracks const& mcParticles) |
292 | 367 | { |
@@ -314,15 +389,8 @@ struct Alice3Dilepton { |
314 | 389 | } |
315 | 390 | // auto mother = mcparticles.iteratorAt(motherid); |
316 | 391 |
|
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); |
326 | 394 |
|
327 | 395 | registry.fill(HIST("Reconstructed/Pair/ULS/Mass"), v12.M()); |
328 | 396 | registry.fill(HIST("Reconstructed/Pair/ULS/Pt"), v12.Pt()); |
@@ -356,15 +424,8 @@ struct Alice3Dilepton { |
356 | 424 | } |
357 | 425 | // auto mother = mcparticles.iteratorAt(motherid); |
358 | 426 |
|
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); |
368 | 429 |
|
369 | 430 | if constexpr (pairtype == PairType::kLSpp) { |
370 | 431 | registry.fill(HIST("Reconstructed/Pair/LSpp/Mass"), v12.M()); |
@@ -464,6 +525,7 @@ struct Alice3Dilepton { |
464 | 525 | } // end of like-sign pair loop |
465 | 526 | } |
466 | 527 | } |
| 528 | + |
467 | 529 | // Functions for pid |
468 | 530 | template <typename TTrack> |
469 | 531 | bool electronIDTOF(TTrack const& track) |
@@ -545,11 +607,10 @@ struct Alice3Dilepton { |
545 | 607 | Partition<MyFilteredTracksMC> posTracks = o2::aod::track::signed1Pt > 0.f; |
546 | 608 | Partition<MyFilteredTracksMC> negTracks = o2::aod::track::signed1Pt < 0.f; |
547 | 609 |
|
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) |
553 | 614 | { |
554 | 615 | for (const auto& collision : collisions) { |
555 | 616 | registry.fill(HIST("Reconstructed/Event/VtxX"), collision.posX()); |
|
0 commit comments