88// In applying this license CERN does not waive the privileges and immunities
99// granted to it by virtue of its status as an Intergovernmental Organization
1010// or submit itself to any jurisdiction.
11-
12- #include " Framework/AnalysisDataModel.h"
13- #include " Framework/AnalysisTask.h"
14- #include " Framework/Configurable.h"
15- #include " Framework/O2DatabasePDGPlugin.h"
11+ #include " Selections.h"
12+
13+ #include < Framework/AnalysisDataModel.h>
14+ #include < Framework/AnalysisTask.h>
15+ #include < Framework/Configurable.h>
16+ #include < Common/DataModel/EventSelection.h>
17+ #include < Common/DataModel/TrackSelectionTables.h>
18+ #include < Framework/O2DatabasePDGPlugin.h>
1619#include < CCDB/BasicCCDBManager.h>
17- #include " Framework/runDataProcessing.h"
20+ #include < Framework/runDataProcessing.h>
1821
1922#include " Gencentralities.h"
2023
2124using namespace o2 ;
2225using namespace o2 ::framework;
2326using namespace o2 ::framework::expressions;
2427
28+ using namespace pwgmm ::mult;
29+
2530constexpr float FT0Alo = -3.3 ;
2631constexpr float FT0Ahi = -2.1 ;
2732constexpr float FT0Clo = 3.5 ;
@@ -34,8 +39,10 @@ struct Binner {
3439
3540 using Particles = soa::Filtered<aod::McParticles>;
3641 Preslice<Particles> perMcCol = aod::mcparticle::mcCollisionId;
42+ Preslice<aod::Tracks> perCol = aod::track::collisionId;
3743
3844 ConfigurableAxis multBinning{" multBinning" , {301 , -0.5 , 300.5 }, " " };
45+ AxisSpec SmallMultAxis = {100 , 0.5 , 100.5 };
3946
4047 // The objects are uploaded with https://alimonitor.cern.ch/ccdb/upload.jsp
4148 Service<ccdb::BasicCCDBManager> ccdb;
@@ -51,6 +58,15 @@ struct Binner {
5158 return std::abs (p->Charge ()) >= 3 .;
5259 }
5360
61+ template <typename C>
62+ inline bool isCollisionSelectedMC (C const & collision)
63+ {
64+ return collision.selection_bit (aod::evsel::kIsTriggerTVX ) &&
65+ collision.selection_bit (aod::evsel::kIsGoodZvtxFT0vsPV ) &&
66+ collision.selection_bit (aod::evsel::kIsVertexITSTPC ) &&
67+ collision.selection_bit (aod::evsel::kIsVertexTOFmatched );
68+ }
69+
5470 TH1F* multFT0C = nullptr ;
5571 TH1F* multFT0M = nullptr ;
5672
@@ -63,9 +79,11 @@ struct Binner {
6379 ccdb->setURL (url.value );
6480 ccdb->setCaching (true );
6581 ccdb->setLocalObjectValidityChecking ();
66- } else if (docalibrate) {
67- } else {
68- LOGP (fatal, " Need to have either calibration or binning enabled" );
82+ }
83+ if (docalibrate) {
84+ }
85+ if (docalibrateAdvanced) {
86+ h.add ({" hCorrelate" , " ; N_{part}^{FT0M}; N_{part}^{FT0C}; dN/d#eta|_{#eta = 0}" , {HistType::kTHnSparseF , {MultAxis, MultAxis, SmallMultAxis}}});
6987 }
7088 }
7189
@@ -95,7 +113,56 @@ struct Binner {
95113 }
96114 }
97115
98- PROCESS_SWITCH (Binner, calibrate, " Create binnings" , false );
116+ PROCESS_SWITCH (Binner, calibrate, " Create binnings" , true );
117+
118+ using ExCols = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels>;
119+ using Trks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TrackSelection, aod::TracksDCA>;
120+ // require a mix of ITS+TPC and ITS-only tracks (filters on the same table are automatically combined with &&)
121+ Filter fTrackSelectionITS = ncheckbit(aod::track::v001::detectorMap, (uint8_t )o2::aod::track::ITS) &&
122+ ncheckbit (aod::track::trackCutFlag, trackSelectionITS);
123+ Filter fTrackSelectionTPC = ifnode(ncheckbit(aod::track::v001::detectorMap, (uint8_t )o2::aod::track::TPC),
124+ ncheckbit (aod::track::trackCutFlag, trackSelectionTPC), true );
125+ Filter fTrackSelectionDCA = nabs(aod::track::dcaZ) <= 0 .2f && ncheckbit(aod::track::trackCutFlag, trackSelectionDCAXYonly);
126+ Filter fTracksEta = nabs(aod::track::eta) < 0 .5f ;
127+
128+ void calibrateAdvanced (aod::McCollision const & mcc,
129+ soa::SmallGroups<ExCols> const & collisions,
130+ Particles const &,
131+ soa::Filtered<Trks> const & tracks)
132+ {
133+ auto pcFT0M = pFT0M.sliceBy (perMcCol, mcc.globalIndex ());
134+ auto pcFT0C = pFT0C.sliceBy (perMcCol, mcc.globalIndex ());
135+ int nFT0M = 0 ;
136+ int nFT0C = 0 ;
137+ int nTrkAt0 = 0 ;
138+ for (auto & p : pcFT0M) {
139+ if (isChargedParticle (p.pdgCode ())) {
140+ ++nFT0M;
141+ }
142+ }
143+ h.fill (HIST (" hFT0M" ), nFT0M);
144+ for (auto & p : pcFT0C) {
145+ if (isChargedParticle (p.pdgCode ())) {
146+ ++nFT0C;
147+ }
148+ }
149+ h.fill (HIST (" hFT0C" ), nFT0C);
150+
151+ bool selected = false ;
152+ for (auto & c : collisions) {
153+ if (isCollisionSelectedMC (c)) {
154+ selected = true ;
155+ auto sample = tracks.sliceBy (perCol, c.globalIndex ());
156+ nTrkAt0 += sample.size ();
157+ }
158+ }
159+ if (!selected) {
160+ return ;
161+ }
162+ h.fill (HIST (" hCorrelate" ), nFT0M, nFT0C, nTrkAt0);
163+ }
164+
165+ PROCESS_SWITCH (Binner, calibrateAdvanced, " Create binning matched to dN/deta" , false );
99166
100167 void bin (aod::BCsWithTimestamps const & bcs, aod::McCollisions const & mccollisions, Particles const &)
101168 {
0 commit comments