|
22 | 22 | #include "PWGHF/DataModel/CandidateReconstructionTables.h" |
23 | 23 | #include "PWGHF/DataModel/CandidateSelectionTables.h" |
24 | 24 | #include "PWGHF/DataModel/TrackIndexSkimmingTables.h" |
25 | | -#include "PWGHF/Utils/utilsPid.h" |
26 | 25 | #include "PWGMM/Mult/DataModel/bestCollisionTable.h" |
27 | 26 |
|
28 | 27 | #include "Common/CCDB/EventSelectionParams.h" |
29 | 28 | #include "Common/CCDB/RCTSelectionFlags.h" |
30 | 29 | #include "Common/Core/RecoDecay.h" |
| 30 | +#include "Common/Core/fwdtrackUtilities.h" |
| 31 | +#include "Common/DataModel/Centrality.h" |
31 | 32 | #include "Common/DataModel/EventSelection.h" |
| 33 | +#include "Common/DataModel/McCollisionExtra.h" |
32 | 34 | #include "Common/DataModel/Multiplicity.h" |
33 | 35 | #include "Common/DataModel/TrackSelectionTables.h" |
34 | 36 |
|
|
38 | 40 | #include <DataFormatsParameters/GRPMagField.h> |
39 | 41 | #include <DetectorsCommonDataFormats/AlignParam.h> |
40 | 42 | #include <FT0Base/Geometry.h> |
41 | | -#include <FV0Base/Geometry.h> |
42 | 43 | #include <Framework/ASoAHelpers.h> |
43 | 44 | #include <Framework/AnalysisDataModel.h> |
44 | 45 | #include <Framework/AnalysisHelpers.h> |
|
57 | 58 | #include <MathUtils/Utils.h> |
58 | 59 |
|
59 | 60 | #include <THn.h> |
60 | | -#include <TPDGCode.h> |
| 61 | +#include <TRandom.h> |
61 | 62 | #include <TString.h> |
62 | 63 |
|
63 | 64 | #include <sys/types.h> |
@@ -136,6 +137,7 @@ enum MftTrackSelectionStep { |
136 | 137 | Pt, |
137 | 138 | DCAxy, |
138 | 139 | DCAz, |
| 140 | + Chi2OverNdf, |
139 | 141 | IsLTF, |
140 | 142 | IsCA, |
141 | 143 | NMftTrackSelectionSteps |
@@ -298,11 +300,13 @@ struct HfTaskFlow { |
298 | 300 | Configurable<float> etaMftTrackMin{"etaMftTrackMin", -3.36f, "Minimum value for the eta of MFT tracks when used in cut function"}; |
299 | 301 | Configurable<float> etaMftTrackMaxFilter{"etaMftTrackMaxFilter", -2.0f, "Maximum value for the eta of MFT tracks when used in filter"}; |
300 | 302 | Configurable<float> etaMftTrackMinFilter{"etaMftTrackMinFilter", -3.9f, "Minimum value for the eta of MFT tracks when used in filter"}; |
| 303 | + Configurable<float> maxChi2OverNdf{"maxChi2OverNdf", 1000.f, "maximum chi2/ndf for MFT tracks"}; |
301 | 304 | Configurable<float> mftMaxDCAxy{"mftMaxDCAxy", 2.0f, "Cut on dcaXY for MFT tracks"}; |
302 | 305 | Configurable<float> mftMaxDCAz{"mftMaxDCAz", 2.0f, "Cut on dcaZ for MFT tracks"}; |
303 | 306 | Configurable<int> nClustersMftTrack{"nClustersMftTrack", 5, "Minimum number of clusters for the reconstruction of MFT tracks"}; |
304 | 307 | Configurable<float> ptMftTrackMax{"ptMftTrackMax", 10.0f, "max value of MFT tracks pT when used in cut function"}; |
305 | 308 | Configurable<float> ptMftTrackMin{"ptMftTrackMin", 0.f, "min value of MFT tracks pT when used in cut function"}; |
| 309 | + Configurable<bool> useMftChi2OverNdfCut{"useMftChi2OverNdfCut", false, "use mft track chi2/ndf cut"}; |
306 | 310 | Configurable<bool> useMftPtCut{"useMftPtCut", false, "if true, use the Mft pt function cut"}; |
307 | 311 | Configurable<bool> useOnlyCATracks{"useOnlyCATracks", false, "if true, use strictly MFT tracks reconstructed with CA algo."}; |
308 | 312 | Configurable<bool> useOnlyLTFTracks{"useOnlyLTFTracks", false, "if true, use strictly MFT tracks reconstructed with LTF algo."}; |
@@ -342,15 +346,18 @@ struct HfTaskFlow { |
342 | 346 | using HfCandidatesSelD0 = soa::Filtered<soa::Join<aod::HfCand2Prong, aod::HfSelD0>>; |
343 | 347 | using HfCandidatesSelLc = soa::Filtered<soa::Join<aod::HfCand3Prong, aod::HfSelLc>>; |
344 | 348 | using FilteredTracksWDcaSel = soa::Filtered<soa::Join<aod::TracksWDca, aod::TrackSelection, aod::TracksExtra>>; |
| 349 | + using FilteredTracksWDcaSelWLabels = soa::Filtered<soa::Join<aod::TracksWDca, aod::TrackSelection, aod::TracksExtra, aod::McTrackLabels>>; |
345 | 350 |
|
346 | 351 | using FilteredMftTracks = soa::Filtered<aod::MFTTracks>; |
| 352 | + using FilteredMftTracksWCollsMcLabels = soa::Filtered<soa::Join<aod::MFTTracks, aod::McMFTTrackLabels>>; |
347 | 353 |
|
348 | 354 | // ========================= |
349 | 355 | // using declarations : MC |
350 | 356 | // ========================= |
351 | 357 |
|
352 | 358 | using SmallGroupMcCollisions = soa::SmallGroups<soa::Join<aod::McCollisionLabels, aod::Collisions, aod::EvSel, aod::CentFT0Cs, aod::CentFT0CVariant1s, aod::CentFT0Ms, aod::CentFV0As, aod::Mults>>; |
353 | 359 | using FilteredMcCollisionsWMult = soa::Filtered<soa::Join<aod::McCollisions, aod::MultMCExtras>>; |
| 360 | + using FilteredMcCollisionsWMultWCollsExtra = soa::Filtered<soa::Join<aod::McCollisions, aod::McCollsExtra, aod::MultMCExtras>>; |
354 | 361 | using FilteredMcParticles = soa::Filtered<aod::McParticles>; |
355 | 362 |
|
356 | 363 | // ========================= |
@@ -498,6 +505,7 @@ struct HfTaskFlow { |
498 | 505 | labelsMftTracksSelection[MftTrackSelectionStep::Pt] = "MFT tracks after pT selection"; |
499 | 506 | labelsMftTracksSelection[MftTrackSelectionStep::DCAxy] = "MFT tracks after DCAxy selection"; |
500 | 507 | labelsMftTracksSelection[MftTrackSelectionStep::DCAz] = "MFT tracks after DCAz selection"; |
| 508 | + labelsMftTracksSelection[MftTrackSelectionStep::Chi2OverNdf] = "MFT tracks after Chi2OverNdf selection"; |
501 | 509 | labelsMftTracksSelection[MftTrackSelectionStep::IsLTF] = "Linear Track Finder MFT tracks"; |
502 | 510 | labelsMftTracksSelection[MftTrackSelectionStep::IsCA] = "Cellular Automaton MFT tracks"; |
503 | 511 | registry.get<TH1>(HIST("Data/Mft/hMftTracksSelection"))->SetMinimum(0); |
@@ -661,8 +669,7 @@ struct HfTaskFlow { |
661 | 669 | registry.add("Data/hEfficiencyTrigger", "", {HistType::kTH3D, {{configAxis.axisPtTrigger}, {configAxis.axisEtaTrigger}, {configAxis.axisVertex}}}); |
662 | 670 | registry.add("Data/hEfficiencyAssociated", "", {HistType::kTH3D, {{configAxis.axisPtAssoc}, {configAxis.axisEtaAssociated}, {configAxis.axisVertex}}}); |
663 | 671 |
|
664 | | - registry.add("Data/hMultiplicity_uncorrected", "", {HistType::kTH1D, {configAxis.axisMultiplicity}}); |
665 | | - registry.add("Data/hMultiplicity_corrected", "", {HistType::kTH1D, {configAxis.axisMultiplicity}}); |
| 672 | + registry.add("Data/hMultiplicity_uncorrected_vs_corrected", "", {HistType::kTH2D, {{configAxis.axisMultiplicity}, {configAxis.axisMultiplicity}}}); |
666 | 673 |
|
667 | 674 | if (!configTask.doEtaDependentFlow && !configTask.doVariationContainers) { |
668 | 675 | registry.add("Trig_hist_TPC_MFT", "", {HistType::kTHnSparseF, {{configAxis.axisSamples, configAxis.axisVertex, configAxis.axisPtTrigger}}}); |
@@ -918,6 +925,13 @@ struct HfTaskFlow { |
918 | 925 | } |
919 | 926 | } |
920 | 927 |
|
| 928 | + if (doprocessTrackEfficiencies) { |
| 929 | + registry.add("MC/hEfficiencyTrigger", "", {HistType::kTH3D, {{configAxis.axisPtTrigger}, {configAxis.axisEtaTrigger}, {configAxis.axisVertex}}}); |
| 930 | + registry.add("MC/hEfficiencyAssociated", "", {HistType::kTH3D, {{configAxis.axisPtTrigger}, {configAxis.axisEtaAssociated}, {configAxis.axisVertex}}}); |
| 931 | + registry.add("Data/hEfficiencyTrigger", "", {HistType::kTH3D, {{configAxis.axisPtTrigger}, {configAxis.axisEtaTrigger}, {configAxis.axisVertex}}}); |
| 932 | + registry.add("Data/hEfficiencyAssociated", "", {HistType::kTH3D, {{configAxis.axisPtAssoc}, {configAxis.axisEtaAssociated}, {configAxis.axisVertex}}}); |
| 933 | + } |
| 934 | + |
921 | 935 | } // End of init() function |
922 | 936 |
|
923 | 937 | // ========================= |
@@ -1434,6 +1448,17 @@ struct HfTaskFlow { |
1434 | 1448 | registry.fill(HIST("Data/Mft/hMftTracksSelection"), MftTrackSelectionStep::DCAz); |
1435 | 1449 | } |
1436 | 1450 |
|
| 1451 | + if (configMft.useMftChi2OverNdfCut) { |
| 1452 | + float ndfMftTrack = std::max(2.0f * mftTrack.nClusters() - 5.0f, 1.0f); |
| 1453 | + float mftChi2OverNdf = mftTrack.chi2() / ndfMftTrack; |
| 1454 | + if (mftChi2OverNdf > configMft.maxChi2OverNdf) { |
| 1455 | + return false; |
| 1456 | + } |
| 1457 | + } |
| 1458 | + if (fillHistograms) { |
| 1459 | + registry.fill(HIST("Data/Mft/hMftTracksSelection"), MftTrackSelectionStep::Chi2OverNdf); |
| 1460 | + } |
| 1461 | + |
1437 | 1462 | // cut on the track algorithm of MFT tracks |
1438 | 1463 | if (mftTrack.isCA()) { |
1439 | 1464 | if (fillHistograms) { |
@@ -1988,16 +2013,33 @@ struct HfTaskFlow { |
1988 | 2013 |
|
1989 | 2014 | if (configTask.doEtaDependentFlow) { |
1990 | 2015 | if (fitType == isFT0A) { |
1991 | | - registry.fill(HIST("Trig_hist_TPC_FT0A"), sampleIndex, posZ, track1.eta(), triggerWeight); // think about event weight in near future |
| 2016 | + if constexpr (std::is_same_v<FilteredMftTracks, TTracksTrig>) { |
| 2017 | + registry.fill(HIST("Trig_hist_MFT_FT0A"), sampleIndex, posZ, track1.eta(), triggerWeight); // think about event weight in near future |
| 2018 | + } else { |
| 2019 | + registry.fill(HIST("Trig_hist_TPC_FT0A"), sampleIndex, posZ, track1.eta(), triggerWeight); // think about event weight in near future |
| 2020 | + } |
1992 | 2021 | } else { |
1993 | | - registry.fill(HIST("Trig_hist_TPC_FT0C"), sampleIndex, posZ, track1.eta(), triggerWeight); // think about event weight in near future |
| 2022 | + if constexpr (std::is_same_v<FilteredMftTracks, TTracksTrig>) { |
| 2023 | + registry.fill(HIST("Trig_hist_MFT_FT0C"), sampleIndex, posZ, track1.eta(), triggerWeight); // think about event weight in near future |
| 2024 | + } else { |
| 2025 | + registry.fill(HIST("Trig_hist_TPC_FT0C"), sampleIndex, posZ, track1.eta(), triggerWeight); // think about event weight in near future |
| 2026 | + } |
1994 | 2027 | } |
1995 | 2028 | } |
1996 | 2029 | if (configTask.doVariationContainers) { |
1997 | 2030 | if (fitType == isFT0A) { |
1998 | | - registry.fill(HIST("Trig_hist_TPC_FT0A"), sampleIndex, posZ, track1.pt(), triggerWeight); // think about event weight in near future |
| 2031 | + |
| 2032 | + if constexpr (std::is_same_v<FilteredMftTracks, TTracksTrig>) { |
| 2033 | + registry.fill(HIST("Trig_hist_MFT_FT0A"), sampleIndex, posZ, track1.pt(), triggerWeight); // think about event weight in near future |
| 2034 | + } else { |
| 2035 | + registry.fill(HIST("Trig_hist_TPC_FT0A"), sampleIndex, posZ, track1.pt(), triggerWeight); // think about event weight in near future |
| 2036 | + } |
1999 | 2037 | } else { |
2000 | | - registry.fill(HIST("Trig_hist_TPC_FT0C"), sampleIndex, posZ, track1.pt(), triggerWeight); // think about event weight in near future |
| 2038 | + if constexpr (std::is_same_v<FilteredMftTracks, TTracksTrig>) { |
| 2039 | + registry.fill(HIST("Trig_hist_MFT_FT0C"), sampleIndex, posZ, track1.pt(), triggerWeight); // think about event weight in near future |
| 2040 | + } else { |
| 2041 | + registry.fill(HIST("Trig_hist_TPC_FT0C"), sampleIndex, posZ, track1.pt(), triggerWeight); // think about event weight in near future |
| 2042 | + } |
2001 | 2043 | } |
2002 | 2044 | } |
2003 | 2045 |
|
@@ -3019,10 +3061,10 @@ struct HfTaskFlow { |
3019 | 3061 | multiplicity = getMultiplicityEstimator(collision, true); |
3020 | 3062 | } |
3021 | 3063 |
|
3022 | | - registry.fill(HIST("Data/hMultiplicity_uncorrected"), multiplicity); |
| 3064 | + auto uncorrected_multiplicity = multiplicity; |
| 3065 | + registry.fill(HIST("Data/hMultiplicity_uncorrected_vs_corrected"), uncorrected_multiplicity, multiplicity); |
3023 | 3066 | if (configCollision.useMultiplicityFromTracksCorrected) { |
3024 | 3067 | multiplicity = getCorrectedMultiplicity(tracks); |
3025 | | - registry.fill(HIST("Data/hMultiplicity_corrected"), multiplicity); |
3026 | 3068 | } |
3027 | 3069 |
|
3028 | 3070 | if (multiplicity < configCollision.minMultiplicity || multiplicity >= configCollision.maxMultiplicity) { |
@@ -4274,6 +4316,152 @@ struct HfTaskFlow { |
4274 | 4316 | } |
4275 | 4317 | PROCESS_SWITCH(HfTaskFlow, processMixedMcGen, "MC Gen : Process mixed-event correlations", false); |
4276 | 4318 |
|
| 4319 | + void processTrackEfficiencies(FilteredMcCollisionsWMultWCollsExtra::iterator const& mcCollision, |
| 4320 | + SmallGroupMcCollisions const& reconstructedCollisions, |
| 4321 | + FilteredTracksWDcaSelWLabels const& tpcTracks, FilteredMftTracksWCollsMcLabels const& /*mftTracks*/, |
| 4322 | + soa::Filtered<soa::Join<aod::BestCollisionsFwd3d, aod::McMFTTrackLabels>> const& reassociated3dMftTracks, |
| 4323 | + FilteredMcParticles const& mcParticles) |
| 4324 | + { |
| 4325 | + if (std::abs(mcCollision.posZ()) >= configCollision.zVertexMax) { |
| 4326 | + return; |
| 4327 | + } |
| 4328 | + |
| 4329 | + // check whether we have a selected reconstructed collision corresponding to the MC collision |
| 4330 | + bool hasReconstructedCollision = false; |
| 4331 | + for (const auto& reconstructedCollision : reconstructedCollisions) { |
| 4332 | + if (!isAcceptedCollision(reconstructedCollision)) { |
| 4333 | + continue; |
| 4334 | + } |
| 4335 | + if (reconstructedCollision.globalIndex() != mcCollision.bestCollisionIndex()) { |
| 4336 | + continue; |
| 4337 | + } |
| 4338 | + // auto groupedTpcTracks = tpcTracks.sliceBy(perColTracks, reconstructedCollision.globalIndex()); |
| 4339 | + hasReconstructedCollision = true; |
| 4340 | + } |
| 4341 | + |
| 4342 | + // fill histogram for MC Gen TPC particles |
| 4343 | + for (const auto& particle : mcParticles) { |
| 4344 | + auto pdgParticle = pdg->GetParticle(particle.pdgCode()); |
| 4345 | + // check MC related properties of the particle |
| 4346 | + if (!particle.isPhysicalPrimary() || !particle.producedByGenerator()) { |
| 4347 | + continue; |
| 4348 | + } |
| 4349 | + // check charge of the particle |
| 4350 | + if (pdgParticle == nullptr || std::abs(pdgParticle->Charge()) == 0) { |
| 4351 | + continue; |
| 4352 | + } |
| 4353 | + // check kinematics of the particle for TPC |
| 4354 | + if (std::abs(particle.eta()) <= configTask.etaMcParticlesTriggerMax && |
| 4355 | + particle.pt() >= configTask.ptMcParticlesTriggerMin && |
| 4356 | + particle.pt() <= configTask.ptMcParticlesTriggerMax) { |
| 4357 | + if (hasReconstructedCollision) { |
| 4358 | + registry.fill(HIST("MC/hEfficiencyTrigger"), mcCollision.posZ(), particle.eta(), particle.pt()); |
| 4359 | + } |
| 4360 | + } |
| 4361 | + // check kinematics of the particle for MFT |
| 4362 | + if (particle.eta() <= configTask.etaMcParticlesAssocMax && |
| 4363 | + particle.eta() >= configTask.etaMcParticlesAssocMin && |
| 4364 | + particle.pt() >= configTask.ptMcParticlesAssocMin && |
| 4365 | + particle.pt() <= configTask.ptMcParticlesAssocMax) { |
| 4366 | + if (hasReconstructedCollision) { |
| 4367 | + registry.fill(HIST("MC/hEfficiencyAssociated"), mcCollision.posZ(), particle.eta(), particle.pt()); |
| 4368 | + } |
| 4369 | + } |
| 4370 | + } |
| 4371 | + |
| 4372 | + // // fill histogram for MC Gen TPC particles |
| 4373 | + // for (const auto& tpcParticle : mcParticles) { |
| 4374 | + // auto pdgTpcParticle = pdg->GetParticle(tpcParticle.pdgCode()); |
| 4375 | + // // check MC related properties of the particle |
| 4376 | + // if (!tpcParticle.isPhysicalPrimary() || !tpcParticle.producedByGenerator()) { |
| 4377 | + // continue; |
| 4378 | + // } |
| 4379 | + // // check charge of the particle |
| 4380 | + // if (pdgTpcParticle == nullptr || std::abs(pdgTpcParticle->Charge()) == 0) { |
| 4381 | + // continue; |
| 4382 | + // } |
| 4383 | + // // check kinematics of the particle |
| 4384 | + // if (std::abs(tpcParticle.eta()) > configTask.etaMcParticlesTriggerMax || |
| 4385 | + // tpcParticle.pt() < configTask.ptMcParticlesTriggerMin || |
| 4386 | + // tpcParticle.pt() > configTask.ptMcParticlesTriggerMax) { |
| 4387 | + // continue; |
| 4388 | + // } |
| 4389 | + // if (hasReconstructedCollision) { |
| 4390 | + // registry.fill(HIST("MC/hEfficiencyTrigger"), mcCollision.posZ(), tpcParticle.eta(), tpcParticle.pt()); |
| 4391 | + // } |
| 4392 | + // } |
| 4393 | + |
| 4394 | + // // fill histogram for MC Gen MFT particles |
| 4395 | + // for (const auto& mftParticle : mcParticles) { |
| 4396 | + // auto pdgMftParticle = pdg->GetParticle(mftParticle.pdgCode()); |
| 4397 | + // // check MC related properties of the particle |
| 4398 | + // if (!mftParticle.isPhysicalPrimary() || !mftParticle.producedByGenerator()) { |
| 4399 | + // continue; |
| 4400 | + // } |
| 4401 | + // // check charge of the particle |
| 4402 | + // if (pdgMftParticle == nullptr || std::abs(pdgMftParticle->Charge()) == 0) { |
| 4403 | + // continue; |
| 4404 | + // } |
| 4405 | + // // check kinematics of the particle |
| 4406 | + // if (mftParticle.eta() > configTask.etaMcParticlesAssocMax || |
| 4407 | + // mftParticle.eta() < configTask.etaMcParticlesAssocMin || |
| 4408 | + // mftParticle.pt() < configTask.ptMcParticlesAssocMin || |
| 4409 | + // mftParticle.pt() > configTask.ptMcParticlesAssocMax) { |
| 4410 | + // continue; |
| 4411 | + // } |
| 4412 | + |
| 4413 | + // if (hasReconstructedCollision) { |
| 4414 | + // registry.fill(HIST("MC/hEfficiencyAssociated"), mcCollision.posZ(), mftParticle.eta(), mftParticle.pt()); |
| 4415 | + // } |
| 4416 | + // } |
| 4417 | + |
| 4418 | + // fill histogram for reconstructed TPC tracks |
| 4419 | + for (const auto& reconstructedCollision : reconstructedCollisions) { |
| 4420 | + if (!isAcceptedCollision(reconstructedCollision)) { |
| 4421 | + continue; |
| 4422 | + } |
| 4423 | + if (reconstructedCollision.globalIndex() != mcCollision.bestCollisionIndex()) { |
| 4424 | + continue; |
| 4425 | + } |
| 4426 | + |
| 4427 | + auto groupedTpcTracks = tpcTracks.sliceBy(perColTracks, reconstructedCollision.globalIndex()); |
| 4428 | + for (const auto& tpcTrack : groupedTpcTracks) { |
| 4429 | + if (!isAcceptedCentralTrack(tpcTrack)) { |
| 4430 | + continue; |
| 4431 | + } |
| 4432 | + if (!tpcTrack.has_mcParticle()) { |
| 4433 | + continue; |
| 4434 | + } |
| 4435 | + auto tpcParticle = tpcTrack.template mcParticle_as<FilteredMcParticles>(); |
| 4436 | + if (reconstructedCollision.mcCollisionId() != tpcParticle.mcCollisionId()) { |
| 4437 | + continue; |
| 4438 | + } |
| 4439 | + if (tpcParticle.isPhysicalPrimary()) { |
| 4440 | + registry.fill(HIST("Data/hEfficiencyTrigger"), mcCollision.posZ(), tpcParticle.eta(), tpcParticle.pt()); |
| 4441 | + } |
| 4442 | + } |
| 4443 | + |
| 4444 | + auto groupedreassociated3dMftTracks = reassociated3dMftTracks.sliceBy(perColReassociated3dTracks, reconstructedCollision.globalIndex()); |
| 4445 | + for (const auto& reassociated3dMftTrack : reassociated3dMftTracks) { |
| 4446 | + if (!reassociated3dMftTrack.has_mcParticle()) { |
| 4447 | + continue; |
| 4448 | + } |
| 4449 | + auto templatedMftTrack = reassociated3dMftTrack.template mfttrack_as<FilteredMftTracksWCollsMcLabels>(); |
| 4450 | + if (!isAcceptedMftTrack(templatedMftTrack, reassociated3dMftTrack.bestDCAXY(), reassociated3dMftTrack.bestDCAZ(), false)) { |
| 4451 | + continue; |
| 4452 | + } |
| 4453 | + auto mftParticle = templatedMftTrack.template mcParticle_as<FilteredMcParticles>(); |
| 4454 | + if (reconstructedCollision.mcCollisionId() != mftParticle.mcCollisionId()) { |
| 4455 | + continue; |
| 4456 | + } |
| 4457 | + if (mftParticle.isPhysicalPrimary()) { |
| 4458 | + registry.fill(HIST("Data/hEfficiencyAssociated"), mcCollision.posZ(), mftParticle.eta(), mftParticle.pt()); |
| 4459 | + } |
| 4460 | + } |
| 4461 | + } |
| 4462 | + } |
| 4463 | + PROCESS_SWITCH(HfTaskFlow, processTrackEfficiencies, "process track efficiencies for TPC and MFT", false); |
| 4464 | + |
4277 | 4465 | }; // End of struct |
4278 | 4466 |
|
4279 | 4467 | WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) |
|
0 commit comments