diff --git a/Analysis/Tasks/PWGHF/CMakeLists.txt b/Analysis/Tasks/PWGHF/CMakeLists.txt index 37517c72640bf..05b2d4a433527 100644 --- a/Analysis/Tasks/PWGHF/CMakeLists.txt +++ b/Analysis/Tasks/PWGHF/CMakeLists.txt @@ -8,7 +8,7 @@ # granted to it by virtue of its status as an Intergovernmental Organization or # submit itself to any jurisdiction. -o2_add_dpl_workflow(qatask +o2_add_dpl_workflow(qa-event-track SOURCES qaTask.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2::AnalysisDataModel O2::AnalysisCore COMPONENT_NAME Analysis) @@ -18,11 +18,6 @@ o2_add_dpl_workflow(qa-efficiency PUBLIC_LINK_LIBRARIES O2::Framework O2::AnalysisDataModel O2::AnalysisCore COMPONENT_NAME Analysis) -o2_add_dpl_workflow(qa-simple - SOURCES qaTaskSimple.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2::AnalysisDataModel O2::AnalysisCore - COMPONENT_NAME Analysis) - o2_add_dpl_workflow(hf-track-index-skims-creator SOURCES HFTrackIndexSkimsCreator.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2::AnalysisDataModel O2::AnalysisCore O2::DetectorsVertexing O2::AnalysisTasksUtils ROOT::EG @@ -80,9 +75,9 @@ o2_add_dpl_workflow(hf-xic-topkpi-candidate-selector o2_add_dpl_workflow(hf-lc-tok0sp-candidate-selector SOURCES HFLcK0sPCandidateSelector.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2::AnalysisDataModel O2::AnalysisCore O2::DetectorsVertexing O2::AnalysisTasksUtils + PUBLIC_LINK_LIBRARIES O2::Framework O2::AnalysisDataModel O2::AnalysisCore O2::DetectorsVertexing O2::AnalysisTasksUtils COMPONENT_NAME Analysis) - + o2_add_dpl_workflow(hf-task-d0 SOURCES taskD0.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2::AnalysisDataModel O2::AnalysisCore O2::DetectorsVertexing @@ -125,6 +120,6 @@ o2_add_dpl_workflow(hf-mc-validation o2_add_dpl_workflow(hf-task-lc-tok0sp SOURCES taskLcK0sP.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2::AnalysisDataModel O2::AnalysisCore O2::DetectorsVertexing O2::AnalysisTasksUtils + PUBLIC_LINK_LIBRARIES O2::Framework O2::AnalysisDataModel O2::AnalysisCore O2::DetectorsVertexing O2::AnalysisTasksUtils COMPONENT_NAME Analysis) diff --git a/Analysis/Tasks/PWGHF/qaTask.cxx b/Analysis/Tasks/PWGHF/qaTask.cxx index b123954eb572c..349ae36885660 100644 --- a/Analysis/Tasks/PWGHF/qaTask.cxx +++ b/Analysis/Tasks/PWGHF/qaTask.cxx @@ -12,252 +12,113 @@ /// \author Henrique J C Zanoli , Utrecht University /// \author Nicolo' Jacazio , CERN -#include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" +#include "Framework/runDataProcessing.h" #include "Framework/HistogramRegistry.h" -#include "AnalysisCore/trackUtilities.h" #include "ReconstructionDataFormats/DCA.h" -#include "AnalysisDataModel/TrackSelectionTables.h" +#include "AnalysisCore/trackUtilities.h" #include "AnalysisCore/MC.h" -#include "TPDGCode.h" - -#include "TH1D.h" - -#include -#include -#include -#include "boost/algorithm/string.hpp" - -namespace o2fw = o2::framework; -namespace o2exp = o2::framework::expressions; -namespace o2df = o2::dataformats; +#include "AnalysisDataModel/TrackSelectionTables.h" -namespace track_utils -{ -/// Converts a angle phi to the -pi to pi range. -double ConvertPhiRange(double phi) -{ - if (phi > M_PI) { - phi -= 2 * M_PI; - } else if (phi < -M_PI) { - phi += 2 * M_PI; - } +using namespace o2::framework; +using namespace o2::dataformats; - return phi; -} +/// Task to QA global observables of the event +struct QaGlobalObservables { + // Cuts + Configurable numberOfContributorsMin{"numberOfContributorsMin", 0, "Minimum required number of contributors to the vertex"}; + Configurable etaMin{"etaMin", -0.8f, "Minimum eta in range to count the track multiplicity"}; + Configurable etaMax{"etaMax", 0.8f, "Maximum eta in range to count the track multiplicity"}; + + // Binning + Configurable numberOfTracksBins{"numberOfTracksBins", 2000, "Number of bins for the Number of Tracks"}; + Configurable numberOfTracksMin{"numberOfTracksMin", 0, "Lower limit in the Number of Tracks plot"}; + Configurable numberOfTracksMax{"numberOfTracksMax", 2000, "Upper limit in the Number of Tracks plot"}; + + Configurable vertexPositionBins{"vertexPositionBins", 100, "Number of bins for the Vertex Position"}; + Configurable vetexPositionZMin{"vetexPositionZMin", -20.f, "Lower limit in the Vertex Position Z"}; + Configurable vetexPositionZMax{"vetexPositionZMax", 20.f, "Upper limit in the Vertex Position Z"}; + Configurable vetexPositionXYMin{"vetexPositionXYMin", -0.01f, "Lower limit in the Vertex Position XY"}; + Configurable vetexPositionXYMax{"vetexPositionXYMax", 0.01f, "Upper limit in the Vertex Position XY"}; + + Configurable vertexPositionDeltaBins{"vertexPositionDeltaBins", 100, "Number of bins for the histograms of the difference between reconstructed and generated vertex positions"}; + Configurable vetexPositionXYDeltaPtRange{"vetexPositionXYDeltaPtRange", 0.5, "Range of the resolution of the vertex position plot in X and Y"}; + Configurable vetexPositionZDeltaPtRange{"vetexPositionZDeltaPtRange", 0.5, "Range of the resolution of the vertex position plot in Z"}; + + Configurable numbersOfContributorsToPVBins{"numbersOfContributorsToPVBins", 200, "Number bins for the number of contributors to the primary vertex"}; + Configurable numbersOfContributorsToPVMax{"numbersOfContributorsToPVMax", 200, "Maximum value for the Number of contributors to the primary vertex"}; + + Configurable vertexCovarianceMatrixBins{"vertexCovarianceMatrixBins", 100, "Number bins for the vertex covariance matrix"}; + Configurable vertexCovarianceMatrixMin{"vertexCovarianceMatrixMin", -0.01f, "Lower limit in the Vertex Covariance matrix XY"}; + Configurable vertexCovarianceMatrixMax{"vertexCovarianceMatrixMax", 0.01f, "Upper limit in the Vertex Covariance matrix XY"}; + + HistogramRegistry histograms{"HistogramsGlobalQA"}; + void init(InitContext&) + { -/// Determines the impact parameter and its error for a given track. -/// \param track the track to get the impact parameter from. -/// \param primaryVertex the primary vertex of th collision. -/// \param impactParameterRPhi variable to save the impact parameter (in r phi) in micrometers. -/// \param impactParameterRPhiError variable to save the impact parameter (in r phi) error in micrometers. -/// \param impactParameterZ variable to save the impact parameter (in Z) in micrometers. -/// \param impactParameterZError variable to save the impact parameter (in Z) error in micrometers. -template -bool GetImpactParameterAndError(const Track& track, const o2df::VertexBase& primaryVertex, double& impactParameterRPhi, - double& impactParameterRPhiError, double& impactParameterZ, - double& impactParameterErrorZ) -{ - impactParameterRPhi = -999.; - impactParameterRPhiError = -999.; - impactParameterZ = -999; - impactParameterErrorZ = -999; - - o2df::DCA dca; - // FIXME: get this from CCDB - constexpr float magneticField{5.0}; // in kG - auto trackParameter = getTrackParCov(track); - bool propagate = trackParameter.propagateToDCA(primaryVertex, magneticField, &dca); - - constexpr float conversion_to_micrometer = 1000; - if (propagate) { - impactParameterRPhi = conversion_to_micrometer * dca.getY(); - impactParameterRPhiError = conversion_to_micrometer * std::sqrt(dca.getSigmaY2()); - impactParameterZ = conversion_to_micrometer * dca.getZ(); - impactParameterErrorZ = conversion_to_micrometer * std::sqrt(dca.getSigmaZ2()); + AxisSpec numberOfTrackAxis{numberOfTracksBins, numberOfTracksMin, numberOfTracksMax}; + AxisSpec collisionXYAxis{vertexPositionBins, vetexPositionXYMin, vetexPositionXYMax}; + AxisSpec collisionZAxis{vertexPositionBins, vetexPositionZMin, vetexPositionZMax}; + AxisSpec numberOfContributorsAxis{numbersOfContributorsToPVBins, 0, numbersOfContributorsToPVMax}; + AxisSpec vertexCovarianceMatrixAxis{vertexCovarianceMatrixBins, vertexCovarianceMatrixMin, vertexCovarianceMatrixMax}; + AxisSpec collisionXYDeltaAxis{vertexPositionDeltaBins, -vetexPositionXYDeltaPtRange, vetexPositionXYDeltaPtRange}; + AxisSpec collisionZDeltaAxis{vertexPositionDeltaBins, -vetexPositionZDeltaPtRange, vetexPositionZDeltaPtRange}; + + // Global + histograms.add("eventCount", ";Selected Events", kTH1D, {{2, 0, 2}}); + + // Collision + histograms.add("collision/X", ";X [cm]", kTH1D, {collisionXYAxis}); + histograms.add("collision/Y", ";Y [cm]", kTH1D, {collisionXYAxis}); + histograms.add("collision/Z", ";Z [cm]", kTH1D, {collisionZAxis}); + histograms.add("collision/XvsNContrib", ";X [cm];Number Of contributors to the PV", kTH2D, {collisionXYAxis, numberOfContributorsAxis}); + histograms.add("collision/YvsNContrib", ";Y [cm];Number Of contributors to the PV", kTH2D, {collisionXYAxis, numberOfContributorsAxis}); + histograms.add("collision/ZvsNContrib", ";Z [cm];Number Of contributors to the PV", kTH2D, {collisionZAxis, numberOfContributorsAxis}); + histograms.add("collision/numberOfContributors", ";Number Of contributors to the PV", kTH1D, {numberOfContributorsAxis}); + histograms.add("collision/numberOfContributorsVsMult", ";Number Of contributors to the PV;Track Multiplicity", kTH2D, {numberOfContributorsAxis, numberOfTrackAxis}); + histograms.add("collision/vertexChi2", ";#chi^{2}", kTH1D, {{100, 0, 10}}); + + // Covariance + histograms.add("covariance/xx", ";Cov_{xx} [cm^{2}]", kTH1D, {vertexCovarianceMatrixAxis}); + histograms.add("covariance/xy", ";Cov_{xy} [cm^{2}]", kTH1D, {vertexCovarianceMatrixAxis}); + histograms.add("covariance/xz", ";Cov_{xz} [cm^{2}]", kTH1D, {vertexCovarianceMatrixAxis}); + histograms.add("covariance/yy", ";Cov_{yy} [cm^{2}]", kTH1D, {vertexCovarianceMatrixAxis}); + histograms.add("covariance/yz", ";Cov_{yz} [cm^{2}]", kTH1D, {vertexCovarianceMatrixAxis}); + histograms.add("covariance/zz", ";Cov_{zz} [cm^{2}]", kTH1D, {vertexCovarianceMatrixAxis}); + // Multiplicity + histograms.add("multiplicity/numberOfTracks", ";Track Multiplicity", kTH1D, {numberOfTrackAxis}); + // Resolution + histograms.add("resolution/X", ";X_{Rec} - X_{Gen} [cm];Track Multiplicity", kTH2D, {collisionXYDeltaAxis, numberOfContributorsAxis}); + histograms.add("resolution/Y", ";Y_{Rec} - Y_{Gen} [cm];Track Multiplicity", kTH2D, {collisionXYDeltaAxis, numberOfContributorsAxis}); + histograms.add("resolution/Z", ";Z_{Rec} - Z_{Gen} [cm];Track Multiplicity", kTH2D, {collisionZDeltaAxis, numberOfContributorsAxis}); } - return propagate; -} - -} // namespace track_utils - -namespace o2::qa::features -{ - -/// Class to abstract the naming of a particular feature. It can help you to build the histogram -/// labels in a consistent way and generate the titles. -class Feature -{ - public: - Feature() = default; - Feature(std::string name, std::string unit = "") : mName(std::move(name)), mUnit(std::move(unit)){}; - - /// Returns the feature tagged as MC with no unit. Example: p_{T}^{MC}. - std::string MCRaw() const { return mName + "^{MC}"; }; - - /// Returns the feature tagged as Reconstructed with no unit. Example: p_{T}^{Rec}. - std::string RecRaw() const { return mName + "^{Rec}"; }; - /// Returns the unit with no brackets. Example: GeV/c. - std::string UnitRaw() const { return mUnit; }; - - /// Returns the name with no units. Example: p_{T}. - std::string NameRaw() const { return mName; }; - - /// Returns the name with the unit. Example: p_{T} [Gev/c]. - std::string Name() const { return mName + Unit(); }; - - /// Returns the name tagged as MC with the unit. Example: p_{T}^{MC} [Gev/c]. - std::string MC() const { return MCRaw() + Unit(); }; - - /// Returns the name tagged as Reconstructed with the unit. Example: p_{T}^{Rec} [Gev/c] - std::string Rec() const { return RecRaw() + Unit(); }; - - /// Returns the name difference between the MC and reconstructed with the unit. - /// Example: p_{T}^{MC} - p_{T}^{Rec} [Gev/c] - std::string MCRecDiff() const { return MCRaw() + " - " + RecRaw() + Unit(); }; - - /// Returns the name difference between the MC and reconstructed divided by the reconstructed. - /// For example: (p_{T}^{MC} - p_{T}^{Rec})/p_{T}^{Rec} - std::string RelativeMCRecDiff() const { return "(" + MCRaw() + " - " + RecRaw() + ")/" + RecRaw(); }; - - /// Returns the unit formatted to be used in the axis. If no unit is present, returns an empty value. - /// Example: [GeV/c] - std::string Unit() const + void process(const o2::soa::Join::iterator& collision, + const o2::aod::McCollisions&, + const o2::aod::Tracks& tracks) { - if (UnitRaw().empty()) { - return ""; + if (collision.numContrib() < numberOfContributorsMin) { + return; } - return " [" + UnitRaw() + "]"; - }; - - operator std::string() { return Name(); } - - private: - const std::string mName; - const std::string mUnit; -}; - -/// Makes a title for an histogram -std::string MakeTitle(std::vector axisTitles, const std::string& counts = "Counts") -{ - axisTitles.push_back(counts); - return "; " + boost::algorithm::join(axisTitles, "; "); -} - -Feature Eta("#eta"); -Feature TrackMultiplicity("Track Multiplicity"); -Feature Phi{"#varphi", "rad"}; -Feature Pt("p_{T}", "GeV/c"); -Feature VertexX("X", "cm"); -Feature VertexY("Y", "cm"); -Feature VertexZ("Z", "cm"); -Feature ImpactParameterRPhi("Impact Parameter r#varphi", "#mum"); -Feature ImpactParameterRPhiError("Impact Parameter Error r#varphi", "#mum"); -Feature ImpactParameterZ("Impact Parameter Z", "#mum"); -Feature ImpactParameterZError("Impact Parameter Z Error", "#mum"); -Feature NumberOfContributors("Number Of contributors to the PV."); -Feature CovarianceXX("Cov_{xx}", "cm^{2}"); -Feature CovarianceXY("Cov_{xy}", "cm^{2}"); -Feature CovarianceXZ("Cov_{xz}", "cm^{2}"); -Feature CovarianceYY("Cov_{yy}", "cm^{2}"); -Feature CovarianceYZ("Cov_{yz}", "cm^{2}"); -Feature CovarianceZZ("Cov_{zz}", "cm^{2}"); -Feature VertexChi2("#Chi^{2}"); - -std::vector PtBins = { - 0.01, 0.0101, 0.0102, 0.0103, 0.0104, 0.0105, 0.0106, 0.0107, 0.0108, 0.0109, 0.011, - 0.0111, 0.0112, 0.0113, 0.0114, 0.0115, 0.0116, 0.0117, 0.0118, 0.0119, 0.012, - 0.0121, 0.0122, 0.0123, 0.0124, 0.0125, 0.0126, 0.0127, 0.0128, 0.0129, 0.013, - 0.0131, 0.0132, 0.0133, 0.0134, 0.0135, 0.0136, 0.0137, 0.0138, 0.0139, 0.014, - 0.0141, 0.0142, 0.0143, 0.0144, 0.0145, 0.0146, 0.0147, 0.0148, 0.0149, 0.015, - 0.0151, 0.0152, 0.0153, 0.0154, 0.0155, 0.0156, 0.0157, 0.0158, 0.0159, 0.016, - 0.0161, 0.0162, 0.0163, 0.0164, 0.0165, 0.0166, 0.0167, 0.0168, 0.0169, 0.017, - 0.0171, 0.0172, 0.0173, 0.0174, 0.0175, 0.0176, 0.0177, 0.0178, 0.0179, 0.018, - 0.0181, 0.0182, 0.0183, 0.0184, 0.0185, 0.0186, 0.0187, 0.0188, 0.0189, 0.019, - 0.0191, 0.0192, 0.0193, 0.0194, 0.0195, 0.0196, 0.0197, 0.0198, 0.0199, 0.02, - 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.12, 0.14, 0.155, 0.16, 0.165, - 0.175, 0.18, 0.185, 0.2, 0.225, 0.25, 0.275, 0.3, 0.35, 0.4, 0.45, 0.5, 0.6, - 0.7, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.5, 3.0, 3.5, 4.0, 5.0, 6.0, - 8.0, 10.0, 15.0, 20.0, 30.0, 50.0, 100.0}; - -} // namespace o2::qa::features - -namespace qafeat = o2::qa::features; - -/// Task to QA global observables of the event -struct QAGlobalObservables { - o2fw::Configurable nBinsNumberOfTracks{"nBinsNumberOfTracks", 2000, "Number of bins for the Number of Tracks"}; - - o2fw::Configurable nBinsVertexPosition{"nBinsVertexPosition", 100, "Number of bins for the Vertex Position"}; - - o2fw::Configurable nBinsNumberOfContributorsVertex{ - "nBinsNumberOfContributorsVertex", 200, "Number bins for the number of contributors to the primary vertex"}; - - o2fw::Configurable numberOfContributorsVertexMax{ - "numberOfContributorsVertexMax", 200, "Maximum value for the Number of contributors to the primary vertex"}; - - o2fw::Configurable nBinsVertexCovarianceMatrix{"nBinsVertexCovarianceMatrix", 100, - "Number bins for the vertex covariance matrix"}; - - std::array collisionZRange = {-20., 20.}; - std::array collisionXYRange = {-0.01, 0.01}; - std::array numberOfTracksRange = {0, 400}; - std::array vertexCovarianceMatrixRange = {-0.1, 0.1}; - - o2fw::OutputObj eventCount{TH1D("eventCount", qafeat::MakeTitle({"Selected Events"}).c_str(), 2, 0, 2)}; - o2fw::HistogramRegistry histograms{"HistogramsGlobalQA"}; - - void init(o2fw::InitContext&) - { - o2fw::AxisSpec collisionXAxis{nBinsVertexPosition, collisionXYRange[0], collisionXYRange[1]}; - o2fw::AxisSpec collisionYAxis{nBinsVertexPosition, collisionXYRange[0], collisionXYRange[1]}; - o2fw::AxisSpec collisionZAxis{nBinsVertexPosition, collisionZRange[0], collisionZRange[1]}; - - o2fw::AxisSpec numberOfContributorsAxis{nBinsNumberOfContributorsVertex, 0, float(numberOfContributorsVertexMax)}; - o2fw::AxisSpec numberOfTrackAxis{nBinsNumberOfTracks, numberOfTracksRange[0], numberOfTracksRange[1]}; - - o2fw::AxisSpec vertexCovarianceMatrixAxis{nBinsVertexCovarianceMatrix, vertexCovarianceMatrixRange[0], - vertexCovarianceMatrixRange[1]}; - - histograms.add("collision/collisionX", qafeat::MakeTitle({qafeat::VertexX}).c_str(), o2fw::kTH1D, {collisionXAxis}); - - histograms.add("collision/collisionY", qafeat::MakeTitle({qafeat::VertexY}).c_str(), o2fw::kTH1D, {collisionYAxis}); - - histograms.add("collision/collisionZ", qafeat::MakeTitle({qafeat::VertexZ}).c_str(), o2fw::kTH1D, {collisionZAxis}); - - histograms.add("collision/numberOfContributors", qafeat::MakeTitle({qafeat::NumberOfContributors}).c_str(), - o2fw::kTH1D, {numberOfContributorsAxis}); - - histograms.add("collision/vertexChi2", qafeat::MakeTitle({qafeat::VertexChi2}).c_str(), - o2fw::kTH1D, {{100, 0, 10}}); - - histograms.add("multiplicity/numberOfTracks", qafeat::MakeTitle({qafeat::TrackMultiplicity}).c_str(), o2fw::kTH1D, - {numberOfTrackAxis}); + int nTracks = 0; + for (const auto& track : tracks) { + if (track.eta() < etaMin || track.eta() > etaMax) { + continue; + } + nTracks++; + } + histograms.fill(HIST("eventCount"), 0); - histograms.add("covariance/xx", qafeat::MakeTitle({qafeat::CovarianceXX}).c_str(), o2fw::kTH1D, - {vertexCovarianceMatrixAxis}); - histograms.add("covariance/xy", qafeat::MakeTitle({qafeat::CovarianceXY}).c_str(), o2fw::kTH1D, - {vertexCovarianceMatrixAxis}); - histograms.add("covariance/xz", qafeat::MakeTitle({qafeat::CovarianceXZ}).c_str(), o2fw::kTH1D, - {vertexCovarianceMatrixAxis}); - histograms.add("covariance/yy", qafeat::MakeTitle({qafeat::CovarianceYY}).c_str(), o2fw::kTH1D, - {vertexCovarianceMatrixAxis}); - histograms.add("covariance/yz", qafeat::MakeTitle({qafeat::CovarianceYZ}).c_str(), o2fw::kTH1D, - {vertexCovarianceMatrixAxis}); - histograms.add("covariance/zz", qafeat::MakeTitle({qafeat::CovarianceZZ}).c_str(), o2fw::kTH1D, - {vertexCovarianceMatrixAxis}); - } + histograms.fill(HIST("collision/X"), collision.posX()); + histograms.fill(HIST("collision/Y"), collision.posY()); + histograms.fill(HIST("collision/Z"), collision.posZ()); - void process(const o2::aod::Collision& collision, const o2::aod::Tracks& tracks) - { - eventCount->Fill(0); - histograms.fill(HIST("collision/collisionX"), collision.posX()); - histograms.fill(HIST("collision/collisionY"), collision.posY()); - histograms.fill(HIST("collision/collisionZ"), collision.posZ()); + histograms.fill(HIST("collision/XvsNContrib"), collision.posX(), collision.numContrib()); + histograms.fill(HIST("collision/YvsNContrib"), collision.posY(), collision.numContrib()); + histograms.fill(HIST("collision/ZvsNContrib"), collision.posZ(), collision.numContrib()); histograms.fill(HIST("collision/numberOfContributors"), collision.numContrib()); + histograms.fill(HIST("collision/numberOfContributorsVsMult"), collision.numContrib(), nTracks); histograms.fill(HIST("collision/vertexChi2"), collision.chi2()); histograms.fill(HIST("covariance/xx"), collision.covXX()); @@ -267,208 +128,279 @@ struct QAGlobalObservables { histograms.fill(HIST("covariance/yz"), collision.covYZ()); histograms.fill(HIST("covariance/zz"), collision.covZZ()); - int nTracks(0); - for (const auto& track : tracks) { - nTracks++; - } - histograms.fill(HIST("multiplicity/numberOfTracks"), nTracks); + + const auto mcColl = collision.mcCollision(); + histograms.fill(HIST("resolution/X"), collision.posX() - mcColl.posX(), collision.numContrib()); + histograms.fill(HIST("resolution/Y"), collision.posY() - mcColl.posY(), collision.numContrib()); + histograms.fill(HIST("resolution/Z"), collision.posZ() - mcColl.posZ(), collision.numContrib()); } }; /// Task to QA the kinematic properties of the tracks -struct QATrackingKine { - o2fw::Configurable nBinsPhi{"nBinsPhi", 100, "Number of bins for Phi"}; +struct QaTrackingKine { + Configurable pdgCodeSel{"pdgCodeSel", 0, "PDG code of the particle to select in absolute value, 0 selects every particle"}; - o2fw::Configurable nBinsEta{"nBinsEta", 100, "Number of bins for the eta histogram."}; - std::array etaRange = {-6, 6}; + Configurable ptBins{"ptBins", 100, "Number of pT bins"}; + Configurable ptMin{"ptMin", 0.f, "Lower limit in pT"}; + Configurable ptMax{"ptMax", 5.f, "Upper limit in pT"}; - o2fw::HistogramRegistry histos{"HistogramsKineQA"}; + Configurable etaBins{"etaBins", 100, "Number of eta bins"}; + Configurable etaMin{"etaMin", -3.f, "Lower limit in eta"}; + Configurable etaMax{"etaMax", 3.f, "Upper limit in eta"}; - void init(o2fw::InitContext&) - { - histos.add("tracking/pt", qafeat::MakeTitle({qafeat::Pt}).c_str(), o2fw::kTH1D, - {qafeat::PtBins}); - histos.add("tracking/eta", qafeat::MakeTitle({qafeat::Eta.NameRaw()}).c_str(), o2fw::kTH1D, - {{nBinsEta, etaRange[0], etaRange[1]}}); - histos.add("tracking/phi", qafeat::MakeTitle({qafeat::Phi}).c_str(), o2fw::kTH1D, {{nBinsPhi, 0, 2 * M_PI}}); - } + Configurable phiBins{"phiBins", 100, "Number of phi bins"}; + Configurable phiMin{"phiMin", 0.f, "Lower limit in phi"}; + Configurable phiMax{"phiMax", TMath::TwoPi(), "Upper limit in phi"}; - void process(const o2::aod::Track& track) + HistogramRegistry histos{"HistogramsKineQA"}; + void init(InitContext&) { - histos.fill(HIST("tracking/eta"), track.eta()); - histos.fill(HIST("tracking/pt"), track.pt()); - histos.fill(HIST("tracking/phi"), track.phi()); - } -}; - -/// Task to evaluate the tracking resolution (Pt, Eta, Phi and impact parameter) -struct QATrackingResolution { - o2fw::Configurable useOnlyPhysicsPrimary{"useOnlyPhysicsPrimary", true, - "Whether to use only physical primary particles for the resolution."}; + AxisSpec ptAxis{ptBins, ptMin, ptMax}; + AxisSpec etaAxis{etaBins, etaMin, etaMax}; + AxisSpec phiAxis{phiBins, phiMin, phiMax}; - o2fw::Configurable nBinsEta{"nBinsEta", 60, "Number of bins for the pseudorapidity"}; - std::array etaRange = {-3, 3}; + TString commonTitle = ""; + if (pdgCodeSel != 0) { + commonTitle += Form("PDG %i", pdgCodeSel.value); + } - o2fw::Configurable nBinsPhi{"nBinsPhi", 50, "Number of bins for Phi"}; - std::array phiRange = {0, 2 * M_PI}; + const TString pt = "#it{p}_{T} [GeV/#it{c}]"; + const TString eta = "#it{#eta}"; + const TString phi = "#it{#varphi} [rad]"; - o2fw::Configurable nBinsDeltaPt{"nBinsDeltaPt", 100, "Number of bins for the transverse momentum differences"}; - std::array deltaPtRange = {-0.5, 0.5}; + histos.add("tracking/pt", commonTitle + ";" + pt, kTH1D, {ptAxis}); + histos.add("tracking/eta", commonTitle + ";" + eta, kTH1D, {etaAxis}); + histos.add("tracking/phi", commonTitle + ";" + phi, kTH1D, {phiAxis}); - o2fw::Configurable nBinsDeltaPhi{"nBinsDeltaPhi", 100, "Number of bins for the azimuthal angle differences"}; - std::array deltaPhiRange = {-0.1, 0.1}; + histos.add("trackingPrm/pt", commonTitle + " Primary;" + pt, kTH1D, {ptAxis}); + histos.add("trackingPrm/eta", commonTitle + " Primary;" + eta, kTH1D, {etaAxis}); + histos.add("trackingPrm/phi", commonTitle + " Primary;" + phi, kTH1D, {phiAxis}); - o2fw::Configurable nBinsDeltaEta{"nBinsDeltaEta", 100, "Number of bins for the pseudorapidity differences"}; - std::array deltaEtaRange = {-0.1, 0.1}; + histos.add("trackingSec/pt", commonTitle + " Secondary;" + pt, kTH1D, {ptAxis}); + histos.add("trackingSec/eta", commonTitle + " Secondary;" + eta, kTH1D, {etaAxis}); + histos.add("trackingSec/phi", commonTitle + " Secondary;" + phi, kTH1D, {phiAxis}); - o2fw::Configurable nBinsImpactParameter{"nBinsImpactParameter", 2000, "Number of bins for the Impact parameter"}; + histos.add("particle/pt", commonTitle + ";" + pt, kTH1D, {ptAxis}); + histos.add("particle/eta", commonTitle + ";" + eta, kTH1D, {etaAxis}); + histos.add("particle/phi", commonTitle + ";" + phi, kTH1D, {phiAxis}); - std::array impactParameterRange = {-500, 500}; // micrometer - std::array impactParameterResolutionRange = {0, 1000}; // micrometer + histos.add("particlePrm/pt", commonTitle + " Primary;" + pt, kTH1D, {ptAxis}); + histos.add("particlePrm/eta", commonTitle + " Primary;" + eta, kTH1D, {etaAxis}); + histos.add("particlePrm/phi", commonTitle + " Primary;" + phi, kTH1D, {phiAxis}); - // Registry of histograms - o2fw::HistogramRegistry histos{"HistogramsTrackingResolutionQA"}; + histos.add("particleSec/pt", commonTitle + " Secondary;" + pt, kTH1D, {ptAxis}); + histos.add("particleSec/eta", commonTitle + " Secondary;" + eta, kTH1D, {etaAxis}); + histos.add("particleSec/phi", commonTitle + " Secondary;" + phi, kTH1D, {phiAxis}); + } - void init(o2fw::InitContext&) + void process(const o2::soa::Join& tracks, + const o2::aod::McParticles& mcParticles) { - // Histogram axis definitions + for (const auto& t : tracks) { + const auto particle = t.mcParticle(); + if (pdgCodeSel != 0 && particle.pdgCode() != pdgCodeSel) { // Checking PDG code + continue; + } + if (MC::isPhysicalPrimary(mcParticles, particle)) { + histos.fill(HIST("trackingPrm/pt"), t.pt()); + histos.fill(HIST("trackingPrm/eta"), t.eta()); + histos.fill(HIST("trackingPrm/phi"), t.phi()); + } else { + histos.fill(HIST("trackingSec/pt"), t.pt()); + histos.fill(HIST("trackingSec/eta"), t.eta()); + histos.fill(HIST("trackingSec/phi"), t.phi()); + } + histos.fill(HIST("tracking/pt"), t.pt()); + histos.fill(HIST("tracking/eta"), t.eta()); + histos.fill(HIST("tracking/phi"), t.phi()); + } + for (const auto& particle : mcParticles) { + if (pdgCodeSel != 0 && particle.pdgCode() != pdgCodeSel) { // Checking PDG code + continue; + } + histos.fill(HIST("particle/pt"), particle.pt()); + histos.fill(HIST("particle/eta"), particle.eta()); + histos.fill(HIST("particle/phi"), particle.phi()); + if (MC::isPhysicalPrimary(mcParticles, particle)) { + histos.fill(HIST("particlePrm/pt"), particle.pt()); + histos.fill(HIST("particlePrm/eta"), particle.eta()); + histos.fill(HIST("particlePrm/phi"), particle.phi()); + } else { + histos.fill(HIST("particleSec/pt"), particle.pt()); + histos.fill(HIST("particleSec/eta"), particle.eta()); + histos.fill(HIST("particleSec/phi"), particle.phi()); + } + } + } +}; - o2fw::AxisSpec ptAxis{qafeat::PtBins}; - o2fw::AxisSpec deltaPtAxis{nBinsDeltaPt, deltaPtRange[0], deltaPtRange[1]}; - o2fw::AxisSpec deltaPtRelativeAxis{nBinsDeltaPt, deltaPtRange[0], deltaPtRange[1]}; - o2fw::AxisSpec deltaPtAbsoluteRelativeAxis{nBinsDeltaPt, 0., deltaPtRange[1]}; +/// Task to evaluate the tracking resolution (Pt, Eta, Phi and impact parameter) +struct QaTrackingResolution { - o2fw::AxisSpec etaAxis{nBinsEta, etaRange[0], etaRange[1]}; - o2fw::AxisSpec deltaEtaAxis{nBinsDeltaEta, deltaEtaRange[0], deltaEtaRange[1]}; + Configurable useOnlyPhysicsPrimary{"useOnlyPhysicsPrimary", 1, + "Whether to use only physical primary particles for the resolution."}; - o2fw::AxisSpec phiAxis{nBinsPhi, phiRange[0], phiRange[1]}; - o2fw::AxisSpec deltaPhiAxis{nBinsDeltaPhi, deltaPhiRange[0], deltaPhiRange[1]}; + Configurable pdgCodeSel{"pdgCodeSel", 0, "PDG code of the particle to select in absolute value, 0 selects every particle"}; - o2fw::AxisSpec impactParRPhiAxis{nBinsImpactParameter, impactParameterRange[0], impactParameterRange[1]}; - o2fw::AxisSpec impactParRPhiErrorAxis{nBinsImpactParameter, impactParameterResolutionRange[0], - impactParameterResolutionRange[1]}; + Configurable ptBins{"ptBins", 100, "Number of bins for the transverse momentum"}; + Configurable ptMin{"ptMin", 0.f, "Lower limit in pT"}; + Configurable ptMax{"ptMax", 5.f, "Upper limit in pT"}; - o2fw::AxisSpec impactParZAxis{nBinsImpactParameter, impactParameterRange[0], impactParameterRange[1]}; - o2fw::AxisSpec impactParZErrorAxis{nBinsImpactParameter, impactParameterResolutionRange[0], - impactParameterResolutionRange[1]}; + Configurable etaBins{"etaBins", 100, "Number of eta bins"}; + Configurable etaMin{"etaMin", -3.f, "Lower limit in eta"}; + Configurable etaMax{"etaMax", 3.f, "Upper limit in eta"}; - // Eta - histos.add("eta/etaDiffMCReco", qafeat::MakeTitle({qafeat::Eta.MCRecDiff()}).c_str(), o2fw::kTH1D, {deltaEtaAxis}); + Configurable phiBins{"phiBins", 100, "Number of phi bins"}; + Configurable phiMin{"phiMin", 0.f, "Lower limit in phi"}; + Configurable phiMax{"phiMax", TMath::TwoPi(), "Upper limit in phi"}; - histos.add("eta/etaDiffMCRecoVsEtaMC", qafeat::MakeTitle({qafeat::Eta.MCRecDiff(), qafeat::Eta.MC()}).c_str(), - o2fw::kTH2D, {deltaEtaAxis, etaAxis}); + Configurable deltaPtBins{"deltaPtBins", 100, "Number of bins for the transverse momentum differences"}; + Configurable deltaPtMin{"deltaPtMin", -0.5, "Lower limit in delta pT"}; + Configurable deltaPtMax{"deltaPtMax", 0.5, "Upper limit in delta pT"}; - histos.add("eta/etaDiffMCRecoVsEtaReco", qafeat::MakeTitle({qafeat::Eta.MCRecDiff(), qafeat::Eta.Rec()}).c_str(), - o2fw::kTH2D, {deltaEtaAxis, etaAxis}); + Configurable deltaEtaBins{"deltaEtaBins", 100, "Number of bins for the pseudorapidity differences"}; + Configurable deltaEtaMin{"deltaEtaMin", -0.1, "Lower limit in delta eta"}; + Configurable deltaEtaMax{"deltaEtaMax", 0.1, "Upper limit in delta eta"}; - // Phi - histos.add("phi/phiDiffMCRec", qafeat::MakeTitle({qafeat::Phi.MCRecDiff()}).c_str(), o2fw::kTH1D, {deltaPhiAxis}); + Configurable deltaPhiBins{"deltaPhiBins", 100, "Number of bins for the azimuthal angle differences"}; + Configurable deltaPhiMin{"deltaPhiMin", -0.1, "Lower limit in delta phi"}; + Configurable deltaPhiMax{"deltaPhiMax", 0.1, "Upper limit in delta phi"}; - // Pt - histos.add("pt/ptDiffMCRec", qafeat::MakeTitle({qafeat::Pt.MCRecDiff()}).c_str(), o2fw::kTH1D, {deltaPtAxis}); + Configurable impactParameterBins{"impactParameterBins", 2000, "Number of bins for the Impact parameter"}; + Configurable impactParameterMin{"impactParameterMin", -500, "Lower limit in impact parameter (micrometers)"}; + Configurable impactParameterMax{"impactParameterMax", 500, "Upper limit in impact parameter (micrometers)"}; + Configurable impactParameterResoMin{"impactParameterResoMin", 0, "Lower limit in impact parameter resolution (micrometers)"}; + Configurable impactParameterResoMax{"impactParameterResoMax", 1000, "Upper limit in impact parameter resolution (micrometers)"}; - histos.add("pt/ptResolution", qafeat::MakeTitle({qafeat::Pt.RelativeMCRecDiff()}).c_str(), o2fw::kTH1D, - {deltaPtRelativeAxis}); + HistogramRegistry histos{"HistogramsTrackingResolutionQA"}; + void init(InitContext&) + { + // Histogram axis definitions - histos.add("pt/ptResolutionVsPt", qafeat::MakeTitle({qafeat::Pt.Rec(), qafeat::Pt.RelativeMCRecDiff()}).c_str(), - o2fw::kTH2D, {ptAxis, deltaPtAbsoluteRelativeAxis}); + AxisSpec ptAxis{ptBins, ptMin, ptMax}; + AxisSpec deltaPtAxis{deltaPtBins, deltaPtMin, deltaPtMax}; + AxisSpec deltaPtRelativeAxis{deltaPtBins, deltaPtMin, deltaPtMax}; - histos.add("pt/ptResolutionVsEta", qafeat::MakeTitle({qafeat::Eta.Rec(), qafeat::Pt.RelativeMCRecDiff()}).c_str(), - o2fw::kTH2D, {etaAxis, deltaPtAbsoluteRelativeAxis}); + AxisSpec etaAxis{etaBins, etaMin, etaMax}; + AxisSpec deltaEtaAxis{deltaEtaBins, deltaEtaMin, deltaEtaMax}; - histos.add("pt/ptResolutionVsPhi", qafeat::MakeTitle({qafeat::Phi.Rec(), qafeat::Pt.RelativeMCRecDiff()}).c_str(), - o2fw::kTH2D, {phiAxis, deltaPtAbsoluteRelativeAxis}); + AxisSpec phiAxis{phiBins, phiMin, phiMax}; + AxisSpec deltaPhiAxis{deltaPhiBins, deltaPhiMin, deltaPhiMax}; - // Impact parameters - histos.add("impactParameter/impactParameterRPhiVsPt", - qafeat::MakeTitle({qafeat::Pt.Rec(), qafeat::ImpactParameterRPhi}).c_str(), o2fw::kTH2D, - {ptAxis, impactParRPhiAxis}); + AxisSpec impactParRPhiAxis{impactParameterBins, impactParameterMin, impactParameterMax}; + AxisSpec impactParRPhiErrorAxis{impactParameterBins, impactParameterResoMin, impactParameterResoMax}; + + AxisSpec impactParZAxis{impactParameterBins, impactParameterMin, impactParameterMax}; + AxisSpec impactParZErrorAxis{impactParameterBins, impactParameterResoMin, impactParameterResoMax}; - histos.add("impactParameter/impactParameterRPhiVsEta", - qafeat::MakeTitle({qafeat::Eta.Rec(), qafeat::ImpactParameterRPhi}).c_str(), o2fw::kTH2D, - {etaAxis, impactParRPhiAxis}); + TString commonTitle = ""; + if (pdgCodeSel != 0) { + commonTitle += Form("PDG %i", pdgCodeSel.value); + } + if (useOnlyPhysicsPrimary == 1) { + commonTitle += " Primary"; + } + const TString pt = "#it{p}_{T} [GeV/#it{c}]"; + const TString eta = "#it{#eta}"; + const TString phi = "#it{#varphi} [rad]"; + + const TString ptRec = "#it{p}_{T}_{Rec} [GeV/#it{c}]"; + const TString etaRec = "#it{#eta}_{Rec}"; + const TString phiRec = "#it{#varphi}_{Rec} [rad]"; + + const TString ptGen = "#it{p}_{T}_{Gen} [GeV/#it{c}]"; + const TString etaGen = "#it{#eta}_{Gen}"; - histos.add("impactParameter/impactParameterRPhiVsPhi", - qafeat::MakeTitle({qafeat::Phi.Rec(), qafeat::ImpactParameterRPhi}).c_str(), o2fw::kTH2D, - {phiAxis, impactParRPhiAxis}); + const TString ptDelta = "#it{p}_{T}_{Rec} - #it{p}_{T}_{Gen} [GeV/#it{c}]"; + const TString ptReso = "(#it{p}_{T}_{Rec} - #it{p}_{T}_{Gen})/(#it{p}_{T}_{Gen})"; + const TString etaDelta = "#it{#eta}_{Rec} - #it{#eta}_{Gen}"; - histos.add("impactParameter/impactParameterErrorRPhiVsPt", - qafeat::MakeTitle({qafeat::Pt.Rec(), qafeat::ImpactParameterRPhiError}).c_str(), o2fw::kTH2D, - {ptAxis, impactParRPhiErrorAxis}); + // Eta + histos.add("eta/etaDiffRecGen", commonTitle + ";" + etaDelta, kTH1D, {deltaEtaAxis}); + histos.add("eta/etaDiffRecGenVsEtaGen", commonTitle + ";" + etaDelta + ";" + etaGen, kTH2D, {deltaEtaAxis, etaAxis}); + histos.add("eta/etaDiffRecGenVsEtaRec", commonTitle + ";" + etaDelta + ";" + etaRec, kTH2D, {deltaEtaAxis, etaAxis}); - histos.add("impactParameter/impactParameterErrorRPhiVsEta", - qafeat::MakeTitle({qafeat::Eta.Rec(), qafeat::ImpactParameterRPhiError}).c_str(), o2fw::kTH2D, - {etaAxis, impactParRPhiErrorAxis}); + // Phi + histos.add("phi/phiDiffRecGen", commonTitle + ";#it{#varphi}_{Gen} - #it{#varphi}_{Rec} [rad]", kTH1D, {deltaPhiAxis}); - histos.add("impactParameter/impactParameterErrorRPhiVsPhi", - qafeat::MakeTitle({qafeat::Phi.Rec(), qafeat::ImpactParameterRPhiError}).c_str(), o2fw::kTH2D, - {phiAxis, impactParRPhiErrorAxis}); + // Pt + histos.add("pt/ptDiffRecGen", commonTitle + ";" + ptDelta, kTH1D, {deltaPtAxis}); + histos.add("pt/ptResolution", commonTitle + ";" + ptReso, kTH1D, {deltaPtRelativeAxis}); + histos.add("pt/ptResolutionVsPt", commonTitle + ";" + ptRec + ";" + ptReso, kTH2D, {ptAxis, deltaPtRelativeAxis}); + histos.add("pt/ptResolutionVsEta", commonTitle + ";" + eta + ";" + ptReso, kTH2D, {etaAxis, deltaPtRelativeAxis}); + histos.add("pt/ptResolutionVsPhi", commonTitle + ";" + phi + ";" + ptReso, kTH2D, {phiAxis, deltaPtRelativeAxis}); - histos.add("impactParameter/impactParameterZVsPt", - qafeat::MakeTitle({qafeat::Pt.Rec(), qafeat::ImpactParameterZ}).c_str(), o2fw::kTH2D, - {ptAxis, impactParZAxis}); + // Impact parameters + const TString impRPhi = "Impact Parameter r#it{#varphi} [#mum]"; + const TString impRPhiErr = "Impact Parameter Error r#it{#varphi} [#mum]"; - histos.add("impactParameter/impactParameterZVsEta", - qafeat::MakeTitle({qafeat::Eta.Rec(), qafeat::ImpactParameterZ}).c_str(), o2fw::kTH2D, - {etaAxis, impactParZAxis}); + histos.add("impactParameter/impactParameterRPhiVsPt", commonTitle + ";" + ptRec + ";" + impRPhi, kTH2D, {ptAxis, impactParRPhiAxis}); + histos.add("impactParameter/impactParameterRPhiVsEta", commonTitle + ";" + etaRec + ";" + impRPhi, kTH2D, {etaAxis, impactParRPhiAxis}); + histos.add("impactParameter/impactParameterRPhiVsPhi", commonTitle + ";" + phiRec + ";" + impRPhi, kTH2D, {phiAxis, impactParRPhiAxis}); - histos.add("impactParameter/impactParameterZVsPhi", - qafeat::MakeTitle({qafeat::Phi.Rec(), qafeat::ImpactParameterZ}).c_str(), o2fw::kTH2D, - {phiAxis, impactParZAxis}); + histos.add("impactParameter/impactParameterErrorRPhiVsPt", commonTitle + ";" + ptRec + ";" + impRPhiErr, kTH2D, {ptAxis, impactParRPhiErrorAxis}); + histos.add("impactParameter/impactParameterErrorRPhiVsEta", commonTitle + ";" + etaRec + ";" + impRPhiErr, kTH2D, {etaAxis, impactParRPhiErrorAxis}); + histos.add("impactParameter/impactParameterErrorRPhiVsPhi", commonTitle + ";" + phiRec + ";" + impRPhiErr, kTH2D, {phiAxis, impactParRPhiErrorAxis}); - histos.add("impactParameter/impactParameterErrorZVsPt", - qafeat::MakeTitle({qafeat::Pt.Rec(), qafeat::ImpactParameterZError}).c_str(), o2fw::kTH2D, - {ptAxis, impactParZErrorAxis}); + const TString impZ = "Impact Parameter Z [#mum]"; + const TString impZErr = "Impact Parameter Error Z [#mum]"; - histos.add("impactParameter/impactParameterErrorZVsEta", - qafeat::MakeTitle({qafeat::Eta.Rec(), qafeat::ImpactParameterZError}).c_str(), o2fw::kTH2D, - {etaAxis, impactParZErrorAxis}); + histos.add("impactParameter/impactParameterZVsPt", commonTitle + ";" + ptRec + ";" + impZ, kTH2D, {ptAxis, impactParZAxis}); + histos.add("impactParameter/impactParameterZVsEta", commonTitle + ";" + etaRec + ";" + impZ, kTH2D, {etaAxis, impactParZAxis}); + histos.add("impactParameter/impactParameterZVsPhi", commonTitle + ";" + phiRec + ";" + impZ, kTH2D, {phiAxis, impactParZAxis}); - histos.add("impactParameter/impactParameterErrorZVsPhi", - qafeat::MakeTitle({qafeat::Phi.Rec(), qafeat::ImpactParameterZError}).c_str(), o2fw::kTH2D, - {phiAxis, impactParZErrorAxis}); + histos.add("impactParameter/impactParameterErrorZVsPt", commonTitle + ";" + ptRec + ";" + impZErr, kTH2D, {ptAxis, impactParZErrorAxis}); + histos.add("impactParameter/impactParameterErrorZVsEta", commonTitle + ";" + etaRec + ";" + impZErr, kTH2D, {etaAxis, impactParZErrorAxis}); + histos.add("impactParameter/impactParameterErrorZVsPhi", commonTitle + ";" + phiRec + ";" + impZErr, kTH2D, {phiAxis, impactParZErrorAxis}); } void process(const o2::soa::Join::iterator& collision, const o2::soa::Join& tracks, const o2::aod::McParticles& mcParticles, const o2::aod::McCollisions& mcCollisions) { - const o2df::VertexBase primaryVertex = getPrimaryVertex(collision); + const VertexBase primaryVertex = getPrimaryVertex(collision); + DCA dca; + // FIXME: get this from CCDB + constexpr float magneticField{5.0}; // in kG + constexpr float toMicrometers = 10000.f; // Conversion from [cm] to [mum] + float impactParameterRPhi = -999.f; + float impactParameterRPhiError = -999.f; + float impactParameterZ = -999.f; + float impactParameterErrorZ = -999.f; for (const auto& track : tracks) { - if (useOnlyPhysicsPrimary) { - const auto mcParticle = track.mcParticle(); - if (!MC::isPhysicalPrimary(mcParticles, mcParticle)) { - continue; - } + const auto particle = track.mcParticle(); + if (pdgCodeSel != 0 && particle.pdgCode() != pdgCodeSel) { + continue; } - const double deltaPt = track.mcParticle().pt() - track.pt(); - histos.fill(HIST("pt/ptDiffMCRec"), deltaPt); + if (useOnlyPhysicsPrimary && !MC::isPhysicalPrimary(mcParticles, particle)) { + continue; + } + const double deltaPt = track.pt() - particle.pt(); + histos.fill(HIST("pt/ptDiffRecGen"), deltaPt); - const double deltaPtOverPt = deltaPt / track.pt(); + const double deltaPtOverPt = deltaPt / particle.pt(); histos.fill(HIST("pt/ptResolution"), deltaPtOverPt); - histos.fill(HIST("pt/ptResolutionVsPt"), track.pt(), std::abs(deltaPtOverPt)); - histos.fill(HIST("pt/ptResolutionVsEta"), track.eta(), std::abs(deltaPtOverPt)); - histos.fill(HIST("pt/ptResolutionVsPhi"), track.phi(), std::abs(deltaPtOverPt)); - - const double deltaEta = track.mcParticle().eta() - track.eta(); - histos.fill(HIST("eta/etaDiffMCReco"), deltaEta); - histos.fill(HIST("eta/etaDiffMCRecoVsEtaMC"), deltaEta, track.mcParticle().eta()); - histos.fill(HIST("eta/etaDiffMCRecoVsEtaReco"), deltaEta, track.eta()); + histos.fill(HIST("pt/ptResolutionVsPt"), track.pt(), deltaPtOverPt); + histos.fill(HIST("pt/ptResolutionVsEta"), track.eta(), deltaPtOverPt); + histos.fill(HIST("pt/ptResolutionVsPhi"), track.phi(), deltaPtOverPt); - const double deltaPhi = track_utils::ConvertPhiRange(track.mcParticle().phi() - track.phi()); - histos.fill(HIST("phi/phiDiffMCRec"), deltaPhi); + const double deltaEta = track.eta() - particle.eta(); + histos.fill(HIST("eta/etaDiffRecGen"), deltaEta); + histos.fill(HIST("eta/etaDiffRecGenVsEtaGen"), deltaEta, particle.eta()); + histos.fill(HIST("eta/etaDiffRecGenVsEtaRec"), deltaEta, track.eta()); - double impactParameterRPhi{-999.}, impactParameterRPhiError{-999.}; - double impactParameterZ{-999.}, impactParameterErrorZ{-999.}; + histos.fill(HIST("phi/phiDiffRecGen"), track.phi() - particle.phi()); - const bool propagate = track_utils::GetImpactParameterAndError( - track, primaryVertex, impactParameterRPhi, impactParameterRPhiError, impactParameterZ, impactParameterErrorZ); + if (getTrackParCov(track).propagateToDCA(primaryVertex, magneticField, &dca, 100.)) { // Check that the propagation is successfull + impactParameterRPhi = toMicrometers * dca.getY(); + impactParameterRPhiError = toMicrometers * sqrt(dca.getSigmaY2()); + impactParameterZ = toMicrometers * dca.getZ(); + impactParameterErrorZ = toMicrometers * sqrt(dca.getSigmaZ2()); - if (propagate) { histos.fill(HIST("impactParameter/impactParameterRPhiVsPt"), track.pt(), impactParameterRPhi); histos.fill(HIST("impactParameter/impactParameterRPhiVsEta"), track.eta(), impactParameterRPhi); histos.fill(HIST("impactParameter/impactParameterRPhiVsPhi"), track.phi(), impactParameterRPhi); @@ -489,60 +421,9 @@ struct QATrackingResolution { } }; -/// Task to QA the efficiency of a particular particle defined by particlePDG -template -struct QATrackingEfficiency { - o2fw::Configurable nBinsEta{"nBinsEta", 30, "Number of bins for the pseudorapidity"}; - std::array etaRange = {-3, 3}; - - o2fw::Configurable nBinsPhi{"nBinsPhi", 20, "Number of bins for Phi"}; - std::array phiRange = {0, 2 * M_PI}; - - o2fw::HistogramRegistry histos{"histogramsTrackingEfficiencyQA"}; - - void init(o2fw::InitContext&) - { - o2fw::AxisSpec ptAxis{qafeat::PtBins}; - o2fw::AxisSpec phiAxis{nBinsPhi, phiRange[0], phiRange[1]}; - o2fw::AxisSpec etaAxis{nBinsEta, etaRange[0], etaRange[1]}; - - histos.add("reconstructedKinematics", - qafeat::MakeTitle({qafeat::Pt.MC(), qafeat::Eta.MC(), qafeat::Phi.MC()}).c_str(), - o2fw::kTH3D, {ptAxis, etaAxis, phiAxis}); - - histos.add("generatedKinematics", - qafeat::MakeTitle({qafeat::Pt.MC(), qafeat::Eta.MC(), qafeat::Phi.MC()}).c_str(), - o2fw::kTH3D, {ptAxis, etaAxis, phiAxis}); - } - - void process(const o2::soa::Join& tracks, - const o2::aod::McParticles& mcParticles) - { - for (const auto& track : tracks) { - const auto mcParticle = track.mcParticle(); - if (MC::isPhysicalPrimary(mcParticles, mcParticle) && - abs(mcParticle.pdgCode()) == particlePDG) { - histos.fill(HIST("reconstructedKinematics"), mcParticle.pt(), mcParticle.eta(), mcParticle.phi()); - } - } - - for (const auto& mcParticle : mcParticles) { - if (MC::isPhysicalPrimary(mcParticles, mcParticle) && - abs(mcParticle.pdgCode()) == particlePDG) { - histos.fill(HIST("generatedKinematics"), mcParticle.pt(), mcParticle.eta(), mcParticle.phi()); - } - } - } -}; - -o2fw::WorkflowSpec defineDataProcessing(o2fw::ConfigContext const& cfgc) +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return o2fw::WorkflowSpec{o2fw::adaptAnalysisTask(cfgc, o2fw::TaskName{"qa-global-observables"}), - o2fw::adaptAnalysisTask(cfgc, o2fw::TaskName{"qa-tracking-kine"}), - o2fw::adaptAnalysisTask(cfgc, o2fw::TaskName{"qa-tracking-resolution"}), - o2fw::adaptAnalysisTask>(cfgc, o2fw::TaskName{"qa-tracking-efficiency-pion"}), - o2fw::adaptAnalysisTask>(cfgc, o2fw::TaskName{"qa-tracking-efficiency-proton"}), - o2fw::adaptAnalysisTask>(cfgc, o2fw::TaskName{"qa-tracking-efficiency-electron"}), - o2fw::adaptAnalysisTask>(cfgc, o2fw::TaskName{"qa-tracking-efficiency-muon"}), - o2fw::adaptAnalysisTask>(cfgc, o2fw::TaskName{"qa-tracking-efficiency-kaon"})}; -}; + return WorkflowSpec{adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc)}; +} diff --git a/Analysis/Tasks/PWGHF/qaTaskSimple.cxx b/Analysis/Tasks/PWGHF/qaTaskSimple.cxx deleted file mode 100644 index 5ff40c3b86a18..0000000000000 --- a/Analysis/Tasks/PWGHF/qaTaskSimple.cxx +++ /dev/null @@ -1,346 +0,0 @@ -// Copyright CERN and copyright holders of ALICE O2. This software is -// distributed under the terms of the GNU General Public License v3 (GPL -// Version 3), copied verbatim in the file "COPYING". -// -// See http://alice-o2.web.cern.ch/license for full licensing information. -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. -/// \author Peter Hristov , CERN -/// \author Gian Michele Innocenti , CERN -/// \author Henrique J C Zanoli , Utrecht University -/// \author Nicolo' Jacazio , CERN - -// O2 inlcudes -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/HistogramRegistry.h" -#include "ReconstructionDataFormats/DCA.h" -#include "AnalysisCore/trackUtilities.h" -#include "AnalysisCore/MC.h" -#include "AnalysisDataModel/TrackSelectionTables.h" - -namespace o2fw = o2::framework; -namespace o2exp = o2::framework::expressions; -namespace o2df = o2::dataformats; - -/// Determines the impact parameter and its error for a given track. -/// \param track the track to get the impact parameter from. -/// \param primaryVertex the primary vertex of th collision. -/// \param impactParameterRPhi variable to save the impact parameter (in r phi) in micrometers. -/// \param impactParameterRPhiError variable to save the impact parameter (in r phi) error in micrometers. -/// \param impactParameterZ variable to save the impact parameter (in Z) in micrometers. -/// \param impactParameterZError variable to save the impact parameter (in Z) error in micrometers. -template -bool GetImpactParameterAndError(const Track& track, const o2df::VertexBase& primaryVertex, double& impactParameterRPhi, - double& impactParameterRPhiError, double& impactParameterZ, - double& impactParameterErrorZ) -{ - impactParameterRPhi = -999.; - impactParameterRPhiError = -999.; - impactParameterZ = -999.; - impactParameterErrorZ = -999.; - - o2df::DCA dca; - // FIXME: get this from CCDB - constexpr float magneticField{5.0}; // in kG - auto trackParameter = getTrackParCov(track); - bool propagate = trackParameter.propagateToDCA(primaryVertex, magneticField, &dca); - - constexpr float conversion_to_micrometer = 10000.f; // From [cm] to [mum] - if (propagate) { - impactParameterRPhi = conversion_to_micrometer * dca.getY(); - impactParameterRPhiError = conversion_to_micrometer * std::sqrt(dca.getSigmaY2()); - impactParameterZ = conversion_to_micrometer * dca.getZ(); - impactParameterErrorZ = conversion_to_micrometer * std::sqrt(dca.getSigmaZ2()); - } - return propagate; -} - -/// Task to QA global observables of the event -struct QAGlobalObservables { - // Cuts - o2fw::Configurable nMinNumberOfContributors{"nMinNumberOfContributors", 0, "Minimum required number of contributors to the vertex"}; - - // // Binning - o2fw::Configurable nBinsNumberOfTracks{"nBinsNumberOfTracks", 2000, "Number of bins for the Number of Tracks"}; - o2fw::Configurable RangeMinNumberOfTracks{"RangeMinNumberOfTracks", 0, "Lower limit in the Number of Tracks plot"}; - o2fw::Configurable RangeMaxNumberOfTracks{"RangeMaxNumberOfTracks", 2000, "Upper limit in the Number of Tracks plot"}; - - o2fw::Configurable nBinsVertexPosition{"nBinsVertexPosition", 100, "Number of bins for the Vertex Position"}; - o2fw::Configurable RangeMinVertexPositionZ{"RangeMinVertexPositionZ", -20.f, "Lower limit in the Vertex Position Z"}; - o2fw::Configurable RangeMaxVertexPositionZ{"RangeMaxVertexPositionZ", 20.f, "Upper limit in the Vertex Position Z"}; - o2fw::Configurable RangeMinVertexPositionXY{"RangeMinVertexPositionXY", -0.01f, "Lower limit in the Vertex Position XY"}; - o2fw::Configurable RangeMaxVertexPositionXY{"RangeMaxVertexPositionXY", 0.01f, "Upper limit in the Vertex Position XY"}; - - o2fw::Configurable nBinsNumberOfContributorsVertex{"nBinsNumberOfContributorsVertex", 200, "Number bins for the number of contributors to the primary vertex"}; - o2fw::Configurable RangeMaxNumberOfContributorsVertex{"RangeMaxNumberOfContributorsVertex", 200, "Maximum value for the Number of contributors to the primary vertex"}; - - o2fw::Configurable nBinsVertexCovarianceMatrix{"nBinsVertexCovarianceMatrix", 100, "Number bins for the vertex covariance matrix"}; - o2fw::Configurable RangeMinVertexCovarianceMatrix{"RangeMinVertexCovarianceMatrix", -0.01f, "Lower limit in the Vertex Covariance matrix XY"}; - o2fw::Configurable RangeMaxVertexCovarianceMatrix{"RangeMaxVertexCovarianceMatrix", 0.01f, "Upper limit in the Vertex Covariance matrix XY"}; - - o2fw::HistogramRegistry histograms{"HistogramsGlobalQA"}; - void init(o2fw::InitContext&) - { - - o2fw::AxisSpec numberOfTrackAxis{nBinsNumberOfTracks.value, RangeMinNumberOfTracks.value, RangeMaxNumberOfTracks.value}; - - o2fw::AxisSpec collisionXYAxis{nBinsVertexPosition.value, RangeMinVertexPositionXY.value, RangeMaxVertexPositionXY.value}; - o2fw::AxisSpec collisionZAxis{nBinsVertexPosition.value, RangeMinVertexPositionZ.value, RangeMaxVertexPositionZ.value}; - - o2fw::AxisSpec numberOfContributorsAxis{nBinsNumberOfContributorsVertex.value, 0, RangeMaxNumberOfContributorsVertex.value}; - - o2fw::AxisSpec vertexCovarianceMatrixAxis{nBinsVertexCovarianceMatrix.value, RangeMinVertexCovarianceMatrix.value, RangeMaxVertexCovarianceMatrix.value}; - - // Global - histograms.add("eventCount", ";Selected Events", o2fw::kTH1D, {{2, 0, 2}}); - - // Collision - histograms.add("collision/X", ";X [cm]", o2fw::kTH1D, {collisionXYAxis}); - histograms.add("collision/Y", ";Y [cm]", o2fw::kTH1D, {collisionXYAxis}); - histograms.add("collision/Z", ";Z [cm]", o2fw::kTH1D, {collisionZAxis}); - histograms.add("collision/XvsNContrib", ";X [cm];Number Of contributors to the PV", o2fw::kTH2D, {collisionXYAxis, numberOfContributorsAxis}); - histograms.add("collision/YvsNContrib", ";Y [cm];Number Of contributors to the PV", o2fw::kTH2D, {collisionXYAxis, numberOfContributorsAxis}); - histograms.add("collision/ZvsNContrib", ";Z [cm];Number Of contributors to the PV", o2fw::kTH2D, {collisionZAxis, numberOfContributorsAxis}); - histograms.add("collision/numberOfContributors", ";Number Of contributors to the PV", o2fw::kTH1D, {numberOfContributorsAxis}); - histograms.add("collision/vertexChi2", ";#chi^{2}", o2fw::kTH1D, {{100, 0, 10}}); - - // Covariance - histograms.add("covariance/xx", ";Cov_{xx} [cm^{2}]", o2fw::kTH1D, {vertexCovarianceMatrixAxis}); - histograms.add("covariance/xy", ";Cov_{xy} [cm^{2}]", o2fw::kTH1D, {vertexCovarianceMatrixAxis}); - histograms.add("covariance/xz", ";Cov_{xz} [cm^{2}]", o2fw::kTH1D, {vertexCovarianceMatrixAxis}); - histograms.add("covariance/yy", ";Cov_{yy} [cm^{2}]", o2fw::kTH1D, {vertexCovarianceMatrixAxis}); - histograms.add("covariance/yz", ";Cov_{yz} [cm^{2}]", o2fw::kTH1D, {vertexCovarianceMatrixAxis}); - histograms.add("covariance/zz", ";Cov_{zz} [cm^{2}]", o2fw::kTH1D, {vertexCovarianceMatrixAxis}); - // Multiplicity - histograms.add("multiplicity/numberOfTracks", ";Track Multiplicity", o2fw::kTH1D, {numberOfTrackAxis}); - } - - void process(const o2::aod::Collision& collision, const o2::aod::Tracks& tracks) - { - if (collision.numContrib() < nMinNumberOfContributors.value) { - return; - } - histograms.fill(HIST("eventCount"), 0); - - histograms.fill(HIST("collision/X"), collision.posX()); - histograms.fill(HIST("collision/Y"), collision.posY()); - histograms.fill(HIST("collision/Z"), collision.posZ()); - - histograms.fill(HIST("collision/XvsNContrib"), collision.posX(), collision.numContrib()); - histograms.fill(HIST("collision/YvsNContrib"), collision.posY(), collision.numContrib()); - histograms.fill(HIST("collision/ZvsNContrib"), collision.posZ(), collision.numContrib()); - - histograms.fill(HIST("collision/numberOfContributors"), collision.numContrib()); - histograms.fill(HIST("collision/vertexChi2"), collision.chi2()); - - histograms.fill(HIST("covariance/xx"), collision.covXX()); - histograms.fill(HIST("covariance/xy"), collision.covXY()); - histograms.fill(HIST("covariance/xz"), collision.covXZ()); - histograms.fill(HIST("covariance/yy"), collision.covYY()); - histograms.fill(HIST("covariance/yz"), collision.covYZ()); - histograms.fill(HIST("covariance/zz"), collision.covZZ()); - - int nTracks(0); - for (const auto& track : tracks) { - nTracks++; - } - - histograms.fill(HIST("multiplicity/numberOfTracks"), nTracks); - } -}; - -/// Task to QA the kinematic properties of the tracks -struct QATrackingKine { - o2fw::Configurable nBinsPt{"nBinsPt", 100, "Number of bins for Pt"}; - std::array ptRange = {0, 10.}; - std::array invptRange = {-1.e2, 1.e2}; - o2fw::Configurable nBinsEta{"nBinsEta", 100, "Number of bins for the eta histogram."}; - std::array etaRange = {-6, 6}; - o2fw::Configurable nBinsPhi{"nBinsPhi", 100, "Number of bins for Phi"}; - - o2fw::HistogramRegistry histos{"HistogramsKineQA"}; - void init(o2fw::InitContext&) - { - histos.add("tracking/pt", ";#it{p}_{T} [GeV/c]", o2fw::kTH1D, {{nBinsPt, ptRange[0], ptRange[1]}}); - histos.add("tracking/invpt", ";1/#it{p}_{T} [GeV/c]^{-1}", o2fw::kTH1D, {{nBinsPt, invptRange[0], invptRange[1]}}); - histos.add("tracking/eta", ";#eta", o2fw::kTH1D, {{nBinsEta, etaRange[0], etaRange[1]}}); - histos.add("tracking/phi", ";#varphi [rad]", o2fw::kTH1D, {{nBinsPhi, 0, 2 * M_PI}}); - } - - void process(const o2::aod::Track& track) - { - histos.fill(HIST("tracking/pt"), track.pt()); - histos.fill(HIST("tracking/invpt"), track.signed1Pt()); - histos.fill(HIST("tracking/eta"), track.eta()); - histos.fill(HIST("tracking/phi"), track.phi()); - } -}; - -/// Task to evaluate the tracking resolution (Pt, Eta, Phi and impact parameter) -struct QATrackingResolution { - - o2fw::Configurable useOnlyPhysicsPrimary{"useOnlyPhysicsPrimary", 1, - "Whether to use only physical primary particles for the resolution."}; - o2fw::Configurable pdgCode{"pdgCode", 0, "PDG code of the particle to select in absolute value, 0 selects every particle"}; - - o2fw::Configurable nBinsPt{"nBinsPt", 100, "Number of bins for the transverse momentum"}; - std::array ptRange = {0, 10.}; - - o2fw::Configurable nBinsEta{"nBinsEta", 60, "Number of bins for the pseudorapidity"}; - std::array etaRange = {-3, 3}; - - o2fw::Configurable nBinsPhi{"nBinsPhi", 50, "Number of bins for Phi"}; - std::array phiRange = {0, 2 * M_PI}; - - o2fw::Configurable nBinsDeltaPt{"nBinsDeltaPt", 100, "Number of bins for the transverse momentum differences"}; - std::array deltaPtRange = {-0.5, 0.5}; - - o2fw::Configurable nBinsDeltaPhi{"nBinsDeltaPhi", 100, "Number of bins for the azimuthal angle differences"}; - std::array deltaPhiRange = {-0.1, 0.1}; - - o2fw::Configurable nBinsDeltaEta{"nBinsDeltaEta", 100, "Number of bins for the pseudorapidity differences"}; - std::array deltaEtaRange = {-0.1, 0.1}; - - o2fw::Configurable nBinsImpactParameter{"nBinsImpactParameter", 2000, "Number of bins for the Impact parameter"}; - - std::array impactParameterRange = {-500, 500}; // micrometer - std::array impactParameterResolutionRange = {0, 1000}; // micrometer - - o2fw::HistogramRegistry histos{"HistogramsTrackingResolutionQA"}; - void init(o2fw::InitContext&) - { - // Histogram axis definitions - - o2fw::AxisSpec ptAxis{nBinsPt, ptRange[0], ptRange[1]}; - o2fw::AxisSpec deltaPtAxis{nBinsDeltaPt, deltaPtRange[0], deltaPtRange[1]}; - o2fw::AxisSpec deltaPtRelativeAxis{nBinsDeltaPt, deltaPtRange[0], deltaPtRange[1]}; - o2fw::AxisSpec deltaPtAbsoluteRelativeAxis{nBinsDeltaPt, 0., deltaPtRange[1]}; - - o2fw::AxisSpec etaAxis{nBinsEta, etaRange[0], etaRange[1]}; - o2fw::AxisSpec deltaEtaAxis{nBinsDeltaEta, deltaEtaRange[0], deltaEtaRange[1]}; - - o2fw::AxisSpec phiAxis{nBinsPhi, phiRange[0], phiRange[1]}; - o2fw::AxisSpec deltaPhiAxis{nBinsDeltaPhi, deltaPhiRange[0], deltaPhiRange[1]}; - - o2fw::AxisSpec impactParRPhiAxis{nBinsImpactParameter, impactParameterRange[0], impactParameterRange[1]}; - o2fw::AxisSpec impactParRPhiErrorAxis{nBinsImpactParameter, impactParameterResolutionRange[0], - impactParameterResolutionRange[1]}; - - o2fw::AxisSpec impactParZAxis{nBinsImpactParameter, impactParameterRange[0], impactParameterRange[1]}; - o2fw::AxisSpec impactParZErrorAxis{nBinsImpactParameter, impactParameterResolutionRange[0], - impactParameterResolutionRange[1]}; - - // Eta - histos.add("eta/etaDiffMCReco", ";#eta_{MC} - #eta_{Rec}", o2fw::kTH1D, {deltaEtaAxis}); - histos.add("eta/etaDiffMCRecoVsEtaMC", ";#eta_{MC} - #eta_{Rec};#eta_{MC}", o2fw::kTH2D, {deltaEtaAxis, etaAxis}); - histos.add("eta/etaDiffMCRecoVsEtaReco", ";#eta_{MC} - #eta_{Rec};#eta_{Rec}", o2fw::kTH2D, {deltaEtaAxis, etaAxis}); - - // Phi - histos.add("phi/phiDiffMCRec", ";#varphi_{MC} - #varphi_{Rec} [rad]", o2fw::kTH1D, {deltaPhiAxis}); - - // Pt - histos.add("pt/ptDiffMCRec", ";p_{T}_{MC} - p_{T}_{Rec} [GeV/c]", o2fw::kTH1D, {deltaPtAxis}); - histos.add("pt/ptResolution", ";(p_{T}_{MC} - p_{T}_{Rec})/(p_{T}_{Rec})", o2fw::kTH1D, {deltaPtRelativeAxis}); - histos.add("pt/ptResolutionVsPt", ";p_{T} [GeV/c];(p_{T}_{MC} - p_{T}_{Rec})/(p_{T}_{Rec})", o2fw::kTH2D, {ptAxis, deltaPtAbsoluteRelativeAxis}); - histos.add("pt/ptResolutionVsEta", ";#eta;(p_{T}_{MC} - p_{T}_{Rec})/(p_{T}_{Rec})", o2fw::kTH2D, {etaAxis, deltaPtAbsoluteRelativeAxis}); - histos.add("pt/ptResolutionVsPhi", ";#varphi;(p_{T}_{MC} - p_{T}_{Rec})/(p_{T}_{Rec})", o2fw::kTH2D, {phiAxis, deltaPtAbsoluteRelativeAxis}); - - // Impact parameters - const TString imp_rphi = "Impact Parameter r#varphi [#mum]"; - const TString imp_rphi_err = "Impact Parameter Error r#varphi [#mum]"; - const TString pt = "#it{p}_{T} [GeV/c]"; - const TString pt_rec = "#it{p}_{T}_{Rec} [GeV/c]"; - const TString eta_rec = "#eta_{Rec}"; - const TString phi_rec = "#varphi_{Rec} [rad]"; - - histos.add("impactParameter/impactParameterRPhiVsPt", ";" + pt_rec + ";" + imp_rphi, o2fw::kTH2D, {ptAxis, impactParRPhiAxis}); - histos.add("impactParameter/impactParameterRPhiVsEta", ";" + eta_rec + ";" + imp_rphi, o2fw::kTH2D, {etaAxis, impactParRPhiAxis}); - histos.add("impactParameter/impactParameterRPhiVsPhi", ";" + phi_rec + ";" + imp_rphi, o2fw::kTH2D, {phiAxis, impactParRPhiAxis}); - - histos.add("impactParameter/impactParameterErrorRPhiVsPt", ";" + pt_rec + ";" + imp_rphi_err, o2fw::kTH2D, {ptAxis, impactParRPhiErrorAxis}); - histos.add("impactParameter/impactParameterErrorRPhiVsEta", ";" + eta_rec + ";" + imp_rphi_err, o2fw::kTH2D, {etaAxis, impactParRPhiErrorAxis}); - histos.add("impactParameter/impactParameterErrorRPhiVsPhi", ";" + phi_rec + ";" + imp_rphi_err, o2fw::kTH2D, {phiAxis, impactParRPhiErrorAxis}); - - const TString imp_z = "Impact Parameter Z [#mum]"; - const TString imp_z_err = "Impact Parameter Error Z [#mum]"; - - histos.add("impactParameter/impactParameterZVsPt", ";" + pt_rec + ";" + imp_z, o2fw::kTH2D, {ptAxis, impactParZAxis}); - histos.add("impactParameter/impactParameterZVsEta", ";" + eta_rec + ";" + imp_z, o2fw::kTH2D, {etaAxis, impactParZAxis}); - histos.add("impactParameter/impactParameterZVsPhi", ";" + phi_rec + ";" + imp_z, o2fw::kTH2D, {phiAxis, impactParZAxis}); - - histos.add("impactParameter/impactParameterErrorZVsPt", ";" + pt_rec + ";" + imp_z_err, o2fw::kTH2D, {ptAxis, impactParZErrorAxis}); - histos.add("impactParameter/impactParameterErrorZVsEta", ";" + eta_rec + ";" + imp_z_err, o2fw::kTH2D, {etaAxis, impactParZErrorAxis}); - histos.add("impactParameter/impactParameterErrorZVsPhi", ";" + phi_rec + ";" + imp_z_err, o2fw::kTH2D, {phiAxis, impactParZErrorAxis}); - } - - void process(const o2::soa::Join::iterator& collision, - const o2::soa::Join& tracks, - const o2::aod::McParticles& mcParticles, const o2::aod::McCollisions& mcCollisions) - { - const o2df::VertexBase primaryVertex = getPrimaryVertex(collision); - - for (const auto& track : tracks) { - - const auto mcParticle = track.mcParticle(); - if (pdgCode.value != 0 && abs(mcParticle.pdgCode()) != abs(pdgCode.value)) { - continue; - } - if (useOnlyPhysicsPrimary.value && !MC::isPhysicalPrimary(mcParticles, mcParticle)) { - continue; - } - const double deltaPt = mcParticle.pt() - track.pt(); - histos.fill(HIST("pt/ptDiffMCRec"), deltaPt); - - const double deltaPtOverPt = deltaPt / track.pt(); - - histos.fill(HIST("pt/ptResolution"), deltaPtOverPt); - histos.fill(HIST("pt/ptResolutionVsPt"), track.pt(), std::abs(deltaPtOverPt)); - histos.fill(HIST("pt/ptResolutionVsEta"), track.eta(), std::abs(deltaPtOverPt)); - histos.fill(HIST("pt/ptResolutionVsPhi"), track.phi(), std::abs(deltaPtOverPt)); - - const double deltaEta = mcParticle.eta() - track.eta(); - histos.fill(HIST("eta/etaDiffMCReco"), deltaEta); - histos.fill(HIST("eta/etaDiffMCRecoVsEtaMC"), deltaEta, mcParticle.eta()); - histos.fill(HIST("eta/etaDiffMCRecoVsEtaReco"), deltaEta, track.eta()); - - histos.fill(HIST("phi/phiDiffMCRec"), mcParticle.phi() - track.phi()); - - double impactParameterRPhi{-999.}, impactParameterRPhiError{-999.}; - double impactParameterZ{-999.}, impactParameterErrorZ{-999.}; - - const bool propagate = GetImpactParameterAndError( - track, primaryVertex, impactParameterRPhi, impactParameterRPhiError, impactParameterZ, impactParameterErrorZ); - - if (propagate) { - histos.fill(HIST("impactParameter/impactParameterRPhiVsPt"), track.pt(), impactParameterRPhi); - histos.fill(HIST("impactParameter/impactParameterRPhiVsEta"), track.eta(), impactParameterRPhi); - histos.fill(HIST("impactParameter/impactParameterRPhiVsPhi"), track.phi(), impactParameterRPhi); - - histos.fill(HIST("impactParameter/impactParameterZVsPt"), track.pt(), impactParameterZ); - histos.fill(HIST("impactParameter/impactParameterZVsEta"), track.eta(), impactParameterZ); - histos.fill(HIST("impactParameter/impactParameterZVsPhi"), track.phi(), impactParameterZ); - - histos.fill(HIST("impactParameter/impactParameterErrorRPhiVsPt"), track.pt(), impactParameterRPhiError); - histos.fill(HIST("impactParameter/impactParameterErrorRPhiVsEta"), track.eta(), impactParameterRPhiError); - histos.fill(HIST("impactParameter/impactParameterErrorRPhiVsPhi"), track.phi(), impactParameterRPhiError); - - histos.fill(HIST("impactParameter/impactParameterErrorZVsPt"), track.pt(), impactParameterErrorZ); - histos.fill(HIST("impactParameter/impactParameterErrorZVsEta"), track.eta(), impactParameterErrorZ); - histos.fill(HIST("impactParameter/impactParameterErrorZVsPhi"), track.phi(), impactParameterErrorZ); - } - } - } -}; - -o2fw::WorkflowSpec defineDataProcessing(o2fw::ConfigContext const& cfgc) -{ - o2fw::WorkflowSpec w; - w.push_back(o2fw::adaptAnalysisTask(cfgc, o2fw::TaskName{"qa-global-observables"})); - w.push_back(o2fw::adaptAnalysisTask(cfgc, o2fw::TaskName{"qa-tracking-kine"})); - w.push_back(o2fw::adaptAnalysisTask(cfgc, o2fw::TaskName{"qa-tracking-resolution"})); - return w; -}