diff --git a/Analysis/PWGDQ/include/PWGDQCore/HistogramsLibrary.h b/Analysis/PWGDQ/include/PWGDQCore/HistogramsLibrary.h index 361bb3fea9edc..7dd854393c666 100644 --- a/Analysis/PWGDQ/include/PWGDQCore/HistogramsLibrary.h +++ b/Analysis/PWGDQ/include/PWGDQCore/HistogramsLibrary.h @@ -10,6 +10,7 @@ // // Contact: iarsene@cern.ch, i.c.arsene@fys.uio.no // +#include #include "PWGDQCore/HistogramManager.h" #include "PWGDQCore/VarManager.h" @@ -82,7 +83,7 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h } if (subGroupStr.Contains("tpc")) { hm->AddHistogram(histClass, "TPCncls", "Number of cluster in TPC", false, 160, -0.5, 159.5, VarManager::kTPCncls); - hm->AddHistogram(histClass, "TPCncls_Run", "Number of cluster in TPC", true, VarManager::GetNRuns(), 0.5, 0.5 + VarManager::GetNRuns(), VarManager::kRunId, + hm->AddHistogram(histClass, "TPCncls_Run", "Number of cluster in TPC", true, (VarManager::GetNRuns() > 0 ? VarManager::GetNRuns() : 1), 0.5, 0.5 + VarManager::GetNRuns(), VarManager::kRunId, 10, -0.5, 159.5, VarManager::kTPCncls, 10, 0., 1., VarManager::kNothing, VarManager::GetRunStr().Data()); hm->AddHistogram(histClass, "IsTPCrefit", "", false, 2, -0.5, 1.5, VarManager::kIsTPCrefit); hm->AddHistogram(histClass, "TPCchi2", "TPC chi2", false, 100, 0.0, 10.0, VarManager::kTPCchi2); diff --git a/Analysis/PWGDQ/include/PWGDQCore/VarManager.h b/Analysis/PWGDQ/include/PWGDQCore/VarManager.h index 412d11d79f9f3..743ea9a8ba856 100644 --- a/Analysis/PWGDQ/include/PWGDQCore/VarManager.h +++ b/Analysis/PWGDQ/include/PWGDQCore/VarManager.h @@ -215,6 +215,7 @@ class VarManager : public TObject } static void SetRunNumbers(int n, int* runs); + static void SetRunNumbers(std::vector runs); static int GetNRuns() { return fgRunMap.size(); diff --git a/Analysis/PWGDQ/src/VarManager.cxx b/Analysis/PWGDQ/src/VarManager.cxx index adfb2face737c..18c86af74fc0f 100644 --- a/Analysis/PWGDQ/src/VarManager.cxx +++ b/Analysis/PWGDQ/src/VarManager.cxx @@ -71,6 +71,18 @@ void VarManager::SetRunNumbers(int n, int* runs) } } +//__________________________________________________________________ +void VarManager::SetRunNumbers(std::vector runs) +{ + // + // maps the list of runs such that one can plot the list of runs nicely in a histogram axis + // + for (int i = 0; i < runs.size(); ++i) { + fgRunMap[runs.at(i)] = i + 1; + fgRunStr += Form("%d;", runs.at(i)); + } +} + //__________________________________________________________________ void VarManager::FillEventDerived(float* values) { diff --git a/Analysis/Tasks/PWGDQ/tableMaker.cxx b/Analysis/Tasks/PWGDQ/tableMaker.cxx index 03f6a2a6eaffb..59b30494727fd 100644 --- a/Analysis/Tasks/PWGDQ/tableMaker.cxx +++ b/Analysis/Tasks/PWGDQ/tableMaker.cxx @@ -10,10 +10,10 @@ // // Contact: iarsene@cern.ch, i.c.arsene@fys.uio.no // -#include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/ASoAHelpers.h" +#include "Framework/DataTypes.h" #include "AnalysisDataModel/Multiplicity.h" #include "AnalysisDataModel/EventSelection.h" #include "AnalysisDataModel/Centrality.h" @@ -23,6 +23,8 @@ #include "PWGDQCore/HistogramManager.h" #include "PWGDQCore/AnalysisCut.h" #include "PWGDQCore/AnalysisCompositeCut.h" +#include "PWGDQCore/HistogramsLibrary.h" +#include "PWGDQCore/CutsLibrary.h" #include "AnalysisDataModel/PID/PIDResponse.h" #include "AnalysisDataModel/TrackSelectionTables.h" #include @@ -32,11 +34,19 @@ using std::endl; using namespace o2; using namespace o2::framework; -//using namespace o2::framework::expressions; using namespace o2::aod; -using MyEvents = soa::Join; +void customize(std::vector& workflowOptions) +{ + ConfigParamSpec optionDataType{"isPbPb", VariantType::Bool, false, {"Data type"}}; + workflowOptions.push_back(optionDataType); +} + +#include "Framework/runDataProcessing.h" + using MyBarrelTracks = soa::Join; +using MyEvents = soa::Join; +using MyEventsNoCent = soa::Join; // HACK: In order to be able to deduce which kind of aod object is transmitted to the templated VarManager::Fill functions // a constexpr static bit map must be defined and sent as template argument @@ -46,10 +56,14 @@ using MyBarrelTracks = soa::Join struct TableMaker { + using MyEvent = typename T::iterator; + Produces event; Produces eventExtended; Produces eventVtxCov; @@ -65,6 +79,10 @@ struct TableMaker { OutputObj fOutputList{"output"}; HistogramManager* fHistMan; + Configurable fConfigEventCuts{"cfgEventCuts", "eventStandard", "Event selection"}; + Configurable fConfigTrackCuts{"cfgBarrelTrackCuts", "jpsiPID1", "Comma separated list of barrel track cuts"}; + Configurable fConfigBarrelTrackPtLow{"cfgBarrelLowPt", 1.0f, "Low pt cut for tracks in the barrel"}; + // TODO: Filters should be used to make lowest level selection. The additional more restrictive cuts should be defined via the AnalysisCuts // TODO: Multiple event selections can be applied and decisions stored in the reducedevent::tag AnalysisCompositeCut* fEventCut; @@ -74,7 +92,7 @@ struct TableMaker { // Partition will select fast a group of tracks with basic requirements // If some of the cuts cannot be included in the Partition expression, add them via AnalysisCut(s) - Partition barrelSelectedTracks = o2::aod::track::pt >= 1.0f && nabs(o2::aod::track::eta) <= 0.9f && o2::aod::track::tpcSignal >= 70.0f && o2::aod::track::tpcSignal <= 100.0f && o2::aod::track::tpcChi2NCl < 4.0f && o2::aod::track::itsChi2NCl < 36.0f; + Partition barrelSelectedTracks = o2::aod::track::pt >= fConfigBarrelTrackPtLow && nabs(o2::aod::track::eta) <= 0.9f && o2::aod::track::tpcSignal >= 70.0f && o2::aod::track::tpcSignal <= 100.0f && o2::aod::track::tpcChi2NCl < 4.0f && o2::aod::track::itsChi2NCl < 36.0f; // TODO a few of the important muon variables in the central data model are dynamic columns so not usable in expressions (e.g. eta, phi) // Update the data model to have them as expression columns @@ -97,34 +115,21 @@ struct TableMaker { void DefineCuts() { fEventCut = new AnalysisCompositeCut(true); - AnalysisCut* eventVarCut = new AnalysisCut(); - eventVarCut->AddCut(VarManager::kVtxZ, -10.0, 10.0); - eventVarCut->AddCut(VarManager::kIsINT7, 0.5, 1.5); // require kINT7 - fEventCut->AddCut(eventVarCut); + TString eventCutStr = fConfigEventCuts.value; + fEventCut->AddCut(dqcuts::GetAnalysisCut(eventCutStr.Data())); + // available cuts: jpsiKineAndQuality, jpsiPID1, jpsiPID2 + // NOTE: for now, the model of this task is that just one track cut is applied; multiple parallel cuts should be enabled in the future fTrackCut = new AnalysisCompositeCut(true); - AnalysisCut* trackVarCut = new AnalysisCut(); - //trackVarCut->AddCut(VarManager::kPt, 1.0, 1000.0); - //trackVarCut->AddCut(VarManager::kEta, -0.9, 0.9); - //trackVarCut->AddCut(VarManager::kTPCsignal, 70.0, 100.0); - trackVarCut->AddCut(VarManager::kIsITSrefit, 0.5, 1.5); - trackVarCut->AddCut(VarManager::kIsTPCrefit, 0.5, 1.5); - //trackVarCut->AddCut(VarManager::kTPCchi2, 0.0, 4.0); - //trackVarCut->AddCut(VarManager::kITSchi2, 0.1, 36.0); - trackVarCut->AddCut(VarManager::kTPCncls, 100.0, 161.); - - AnalysisCut* pidCut1 = new AnalysisCut(); - TF1* cutLow1 = new TF1("cutLow1", "pol1", 0., 10.); - cutLow1->SetParameters(130., -40.0); - pidCut1->AddCut(VarManager::kTPCsignal, cutLow1, 100.0, false, VarManager::kPin, 0.5, 3.0); - - fTrackCut->AddCut(trackVarCut); - fTrackCut->AddCut(pidCut1); + TString trackCutStr = fConfigTrackCuts.value; + fTrackCut->AddCut(dqcuts::GetCompositeCut(trackCutStr.Data())); + + // NOTE: Additional cuts to those specified via the Configurable may still be added VarManager::SetUseVars(AnalysisCut::fgUsedVars); // provide the list of required variables so that VarManager knows what to fill } - void process(MyEvents::iterator const& collision, aod::MuonClusters const& clustersMuon, aod::Muons const& tracksMuon, aod::BCs const& bcs, MyBarrelTracks const& tracksBarrel) + void process(MyEvent const& collision, aod::MuonClusters const& clustersMuon, aod::Muons const& tracksMuon, aod::BCs const& bcs, MyBarrelTracks const& tracksBarrel) { uint64_t tag = 0; uint32_t triggerAliases = 0; @@ -135,7 +140,7 @@ struct TableMaker { } VarManager::ResetValues(0, VarManager::kNEventWiseVariables, fValues); - VarManager::FillEvent(collision, fValues); // extract event information and place it in the fgValues array + VarManager::FillEvent(collision, fValues); // extract event information and place it in the fgValues array fHistMan->FillHistClass("Event_BeforeCuts", fValues); // automatically fill all the histograms in the class Event if (!fEventCut->IsSelected(fValues)) { @@ -145,7 +150,7 @@ struct TableMaker { fHistMan->FillHistClass("Event_AfterCuts", fValues); event(tag, collision.bc().runNumber(), collision.posX(), collision.posY(), collision.posZ(), collision.numContrib()); - eventExtended(collision.bc().globalBC(), collision.bc().triggerMask(), triggerAliases, collision.centV0M()); + eventExtended(collision.bc().globalBC(), collision.bc().triggerMask(), triggerAliases, fValues[VarManager::kCentVZERO]); eventVtxCov(collision.covXX(), collision.covXY(), collision.covXZ(), collision.covYY(), collision.covYZ(), collision.covZZ(), collision.chi2()); uint64_t trackFilteringTag = 0; @@ -202,51 +207,32 @@ struct TableMaker { void DefineHistograms(TString histClasses) { - const int kNRuns = 2; - int runs[kNRuns] = {244918, 244919}; - TString runsStr; - for (int i = 0; i < kNRuns; i++) { - runsStr += Form("%d;", runs[i]); - } - VarManager::SetRunNumbers(kNRuns, runs); - - std::unique_ptr arr(histClasses.Tokenize(";")); - for (Int_t iclass = 0; iclass < arr->GetEntries(); ++iclass) { - TString classStr = arr->At(iclass)->GetName(); + std::unique_ptr objArray(histClasses.Tokenize(";")); + for (Int_t iclass = 0; iclass < objArray->GetEntries(); ++iclass) { + TString classStr = objArray->At(iclass)->GetName(); + fHistMan->AddHistClass(classStr.Data()); + // NOTE: The level of detail for histogramming can be controlled via configurables if (classStr.Contains("Event")) { - fHistMan->AddHistClass(classStr.Data()); - fHistMan->AddHistogram(classStr.Data(), "VtxZ", "Vtx Z", false, 60, -15.0, 15.0, VarManager::kVtxZ); // TH1F histogram - fHistMan->AddHistogram(classStr.Data(), "VtxZ_Run", "Vtx Z", true, - kNRuns, 0.5, 0.5 + kNRuns, VarManager::kRunId, 60, -15.0, 15.0, VarManager::kVtxZ, 10, 0., 0., VarManager::kNothing, runsStr.Data()); - fHistMan->AddHistogram(classStr.Data(), "CentVZERO", "Centrality VZERO", false, 100, 0.0, 100.0, VarManager::kCentVZERO); // TH1F histogram + dqhistograms::DefineHistograms(fHistMan, objArray->At(iclass)->GetName(), "event", "trigger,cent"); } if (classStr.Contains("Track")) { - fHistMan->AddHistClass(classStr.Data()); - fHistMan->AddHistogram(classStr.Data(), "Pt", "p_{T} distribution", false, 200, 0.0, 20.0, VarManager::kPt); // TH1F histogram - fHistMan->AddHistogram(classStr.Data(), "Eta", "#eta distribution", false, 500, -5.0, 5.0, VarManager::kEta); // TH1F histogram - fHistMan->AddHistogram(classStr.Data(), "Phi_Eta", "#phi vs #eta distribution", false, 200, -5.0, 5.0, VarManager::kEta, 200, -6.3, 6.3, VarManager::kPhi); // TH2F histogram - - if (classStr.Contains("Barrel")) { - fHistMan->AddHistogram(classStr.Data(), "TPCncls", "Number of cluster in TPC", false, 160, -0.5, 159.5, VarManager::kTPCncls); // TH1F histogram - fHistMan->AddHistogram(classStr.Data(), "TPCncls_Run", "Number of cluster in TPC", true, kNRuns, 0.5, 0.5 + kNRuns, VarManager::kRunId, - 10, -0.5, 159.5, VarManager::kTPCncls, 10, 0., 1., VarManager::kNothing, runsStr.Data()); // TH1F histogram - fHistMan->AddHistogram(classStr.Data(), "ITSncls", "Number of cluster in ITS", false, 8, -0.5, 7.5, VarManager::kITSncls); // TH1F histogram - //for TPC PID - fHistMan->AddHistogram(classStr.Data(), "TPCdedx_pIN", "TPC dE/dx vs pIN", false, 200, 0.0, 20.0, VarManager::kPin, 200, 0.0, 200., VarManager::kTPCsignal); // TH2F histogram - fHistMan->AddHistogram(classStr.Data(), "DCAxy", "DCAxy", false, 100, -3.0, 3.0, VarManager::kTrackDCAxy); // TH1F histogram - fHistMan->AddHistogram(classStr.Data(), "DCAz", "DCAz", false, 100, -5.0, 5.0, VarManager::kTrackDCAz); // TH1F histogram - fHistMan->AddHistogram(classStr.Data(), "IsGlobalTrack", "IsGlobalTrack", false, 2, -0.5, 1.5, VarManager::kIsGlobalTrack); // TH1F histogram - fHistMan->AddHistogram(classStr.Data(), "IsGlobalTrackSDD", "IsGlobalTrackSDD", false, 2, -0.5, 1.5, VarManager::kIsGlobalTrackSDD); // TH1F histogram - } + dqhistograms::DefineHistograms(fHistMan, objArray->At(iclass)->GetName(), "track", "tpcpid"); } - } // end loop over histogram classes + } } }; -WorkflowSpec defineDataProcessing(ConfigContext const&) +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{ - adaptAnalysisTask("table-maker")}; + WorkflowSpec workflow; + const bool isPbPb = cfgc.options().get("isPbPb"); + if (isPbPb) { + workflow.push_back(adaptAnalysisTask>("table-maker")); + } else { + workflow.push_back(adaptAnalysisTask>("table-maker")); + } + + return workflow; }