1616// / \author David Grund
1717// / \since
1818
19+ #include " Common/DataModel/Centrality.h"
20+ #include " Common/DataModel/EventSelection.h"
21+ #include " Common/DataModel/Multiplicity.h"
22+
1923#include " CCDB/BasicCCDBManager.h"
20- #include " Framework/runDataProcessing.h"
21- #include " Framework/AnalysisTask.h"
22- #include " Framework/AnalysisDataModel.h"
24+ #include " CommonConstants/LHCConstants.h"
25+ #include " DataFormatsITSMFT/ROFRecord.h"
2326#include " Framework/ASoAHelpers.h"
24-
27+ #include " Framework/AnalysisDataModel.h"
28+ #include " Framework/AnalysisTask.h"
2529#include " Framework/DataTypes.h"
26- #include " Common/DataModel/Multiplicity.h"
27- #include " Common/DataModel/EventSelection.h"
28- #include " Common/DataModel/Centrality.h"
29- #include " CommonConstants/LHCConstants.h"
3030#include " Framework/TimingInfo.h"
31- #include " DataFormatsITSMFT/ROFRecord .h"
31+ #include " Framework/runDataProcessing .h"
3232
3333#include < TH1F.h>
3434#include < TH2F.h>
3535
36+ #include < algorithm>
37+
3638using namespace o2 ;
3739using namespace o2 ::framework;
3840using namespace o2 ::aod;
3941
4042struct CheckMFT {
41- HistogramRegistry registry{" registry" ,
42- {// 2d histograms
43- {" mMFTTrackEtaPhi_5_MinClusters" , " Track #eta , #phi (NCls >= 5); #eta; #phi" , {HistType::kTH2F , {{50 , -4 , -2 }, {100 , -3.2 , 3.2 }}}},
44- {" mMFTTrackXY_5_MinClusters" , " Track Position (NCls >= 5); x; y" , {HistType::kTH2F , {{320 , -16 , 16 }, {320 , -16 , 16 }}}},
45- {" mMFTTrackEtaPhi_7_MinClusters" , " Track #eta , #phi (NCls >= 7); #eta; #phi" , {HistType::kTH2F , {{50 , -4 , -2 }, {100 , -3.2 , 3.2 }}}},
46- {" mMFTTrackXY_7_MinClusters" , " Track Position (NCls >= 7); x; y" , {HistType::kTH2F , {{320 , -16 , 16 }, {320 , -16 , 16 }}}},
47- {" mMFTTrackEtaPhi_8_MinClusters" , " Track #eta , #phi (NCls >= 8); #eta; #phi" , {HistType::kTH2F , {{50 , -4 , -2 }, {100 , -3.2 , 3.2 }}}},
48- {" mMFTTrackXY_8_MinClusters" , " Track Position (NCls >= 8); x; y" , {HistType::kTH2F , {{320 , -16 , 16 }, {320 , -16 , 16 }}}},
49- // 1d histograms
50- {" mMFTTrackEta" , " Track #eta; #eta; # entries" , {HistType::kTH1F , {{50 , -4 , -2 }}}},
51- {" mMFTTrackNumberOfClusters" , " Number Of Clusters Per Track; # clusters; # entries" , {HistType::kTH1F , {{10 , 0.5 , 10.5 }}}},
52- {" mMFTTrackPhi" , " Track #phi; #phi; # entries" , {HistType::kTH1F , {{100 , -3.2 , 3.2 }}}},
53- {" mMFTTrackTanl" , " Track tan #lambda; tan #lambda; # entries" , {HistType::kTH1F , {{100 , -25 , 0 }}}},
54- {" mMFTTrackInvQPt" , " Track q/p_{T}; q/p_{T} [1/GeV]; # entries" , {HistType::kTH1F , {{250 , -10 , 10 }}}}}};
43+ HistogramRegistry registry{" registry" };
44+ Configurable<bool > avClsPlots{" avClsPlots" , false , " Enable average cluster plots" };
45+
46+ void init (o2::framework::InitContext&)
47+ {
48+
49+ const AxisSpec etaAxis{50 , -4 , -2 , " #eta" };
50+ const AxisSpec phiAxis{100 , -3.2 , 3.2 , " #phi" };
51+ const AxisSpec xAxis{320 , -16 , 16 , " x" };
52+ const AxisSpec clsAxis{10 , 0.5 , 10.5 , " # clusters" };
53+ const AxisSpec yAxis{320 , -16 , 16 , " y" };
54+ const AxisSpec tanLamAxis{100 , -25 , 0 , " tan #lambda" };
55+ const AxisSpec invQPtAxis{250 , -10 , 10 , " q/p_{T} [1/GeV]" };
56+
57+ registry.add (" mMFTTrackPhi" , " Track #phi" , {HistType::kTH1F , {phiAxis}});
58+ registry.add (" mMFTTrackTanl" , " Track tan #lambda" , {HistType::kTH1F , {tanLamAxis}});
59+ registry.add (" mMFTTrackInvQPt" , " Track q/p_{T}" , {HistType::kTH1F , {invQPtAxis}});
60+ registry.add (" mMFTTrackEta" , " Track #eta" , {HistType::kTH1F , {etaAxis}});
61+
62+ registry.add (" mMFTTrackEtaPhi_5_MinClusters" , " Track Position (NCls >= 5)" , {HistType::kTH2F , {etaAxis, phiAxis}});
63+ registry.add (" mMFTTrackEtaPhi_6_MinClusters" , " Track Position (NCls >= 6)" , {HistType::kTH2F , {etaAxis, phiAxis}});
64+ registry.add (" mMFTTrackEtaPhi_7_MinClusters" , " Track Position (NCls >= 7)" , {HistType::kTH2F , {etaAxis, phiAxis}});
65+ registry.add (" mMFTTrackEtaPhi_8_MinClusters" , " Track Position (NCls >= 8)" , {HistType::kTH2F , {etaAxis, phiAxis}});
66+
67+ registry.add (" mMFTTrackXY_5_MinClusters" , " Track Position (NCls >= 5)" , {HistType::kTH2F , {xAxis, yAxis}});
68+ registry.add (" mMFTTrackXY_6_MinClusters" , " Track Position (NCls >= 6)" , {HistType::kTH2F , {xAxis, yAxis}});
69+ registry.add (" mMFTTrackXY_7_MinClusters" , " Track Position (NCls >= 7)" , {HistType::kTH2F , {xAxis, yAxis}});
70+ registry.add (" mMFTTrackXY_8_MinClusters" , " Track Position (NCls >= 8)" , {HistType::kTH2F , {xAxis, yAxis}});
5571
72+ registry.add (" mMFTTrackNumberOfClusters" , " Number Of Clusters Per Track" , {HistType::kTH1F , {clsAxis}});
73+
74+ if (avClsPlots) {
75+ registry.add (" mMFTTrackAvgClusters" , " Average number of clusters per track; p;# clusters; # entries" , {HistType::kTH2F , {{100 , 0 , 100 }, {100 , 0 , 100 }}});
76+ registry.add (" mMFTTrackAvgClustersTru" , " Average number of clusters per track; p;# clusters; # entries" , {HistType::kTH2F , {{100 , 0 , 100 }, {100 , 0 , 100 }}});
77+ if (doprocessMC) {
78+ registry.add (" mMFTTrackAvgClustersHe" , " Average number of clusters per track; p;# clusters; # entries" , {HistType::kTH2F , {{100 , 0 , 100 }, {100 , 0 , 100 }}});
79+ registry.add (" mMFTTrackAvgClustersTruHe" , " Average number of clusters per track; p;# clusters; # entries" , {HistType::kTH2F , {{100 , 0 , 100 }, {100 , 0 , 100 }}});
80+ }
81+ }
82+ }
5683 void process (aod::MFTTracks const & mfttracks)
5784 {
58- for (auto & track : mfttracks) {
85+ for (const auto & track : mfttracks) {
5986 // 2d histograms
6087 float x = track.x ();
6188 float y = track.y ();
@@ -65,14 +92,48 @@ struct CheckMFT {
6592 if (nCls >= 5 ) {
6693 registry.fill (HIST (" mMFTTrackXY_5_MinClusters" ), x, y);
6794 registry.fill (HIST (" mMFTTrackEtaPhi_5_MinClusters" ), eta, phi);
68- if (nCls >= 7 ) {
69- registry.fill (HIST (" mMFTTrackXY_7_MinClusters" ), x, y);
70- registry.fill (HIST (" mMFTTrackEtaPhi_7_MinClusters" ), eta, phi);
71- if (nCls >= 8 ) {
72- registry.fill (HIST (" mMFTTrackXY_8_MinClusters" ), x, y);
73- registry.fill (HIST (" mMFTTrackEtaPhi_8_MinClusters" ), eta, phi);
95+ if (nCls >= 6 ) {
96+ registry.fill (HIST (" mMFTTrackXY_6_MinClusters" ), x, y);
97+ registry.fill (HIST (" mMFTTrackEtaPhi_6_MinClusters" ), eta, phi);
98+ if (nCls >= 7 ) {
99+ registry.fill (HIST (" mMFTTrackXY_7_MinClusters" ), x, y);
100+ registry.fill (HIST (" mMFTTrackEtaPhi_7_MinClusters" ), eta, phi);
101+ if (nCls >= 8 ) {
102+ registry.fill (HIST (" mMFTTrackXY_8_MinClusters" ), x, y);
103+ registry.fill (HIST (" mMFTTrackEtaPhi_8_MinClusters" ), eta, phi);
104+ }
105+ }
106+ }
107+ }
108+ if (avClsPlots) {
109+ static constexpr int kNcls = 10 ;
110+ std::array<float , kNcls > clsSize;
111+ for (unsigned int layer = 0 ; layer < kNcls ; layer++) {
112+ clsSize[layer] = (track.mftClusterSizesAndTrackFlags () >> (layer * 6 )) & 0x3f ;
113+ // LOG(info) << "Layer " << layer << ": " << clsSize[layer];
114+ }
115+ float avgCls = 0 ;
116+ for (unsigned int layer = 0 ; layer < kNcls ; layer++) {
117+ avgCls += clsSize[layer];
118+ }
119+ avgCls /= track.nClusters ();
120+
121+ std::sort (clsSize.begin (), clsSize.end ());
122+ float truncatedAvgCls = 0 ;
123+ int ncls = 0 ;
124+ for (unsigned int layer = 0 ; layer < kNcls ; layer++) {
125+ if (clsSize[layer] > 0 ) {
126+ truncatedAvgCls += clsSize[layer];
127+ ncls++;
128+ if (ncls >= 3 ) {
129+ break ; // we take the average of the first 5 non-zero clusters
130+ }
74131 }
75132 }
133+ truncatedAvgCls /= ncls;
134+
135+ registry.fill (HIST (" mMFTTrackAvgClusters" ), track.p (), avgCls);
136+ registry.fill (HIST (" mMFTTrackAvgClustersTru" ), track.p (), truncatedAvgCls);
76137 }
77138 // 1d histograms
78139 registry.fill (HIST (" mMFTTrackEta" ), eta);
@@ -82,6 +143,49 @@ struct CheckMFT {
82143 registry.fill (HIST (" mMFTTrackInvQPt" ), track.signed1Pt ());
83144 }
84145 }
146+
147+ void processMC (soa::Join<aod::MFTTracks, aod::McMFTTrackLabels> const & mfttracks,
148+ aod::McParticles const &)
149+ {
150+ static constexpr int kNcls = 10 ;
151+ for (const auto & track : mfttracks) {
152+ if (avClsPlots) {
153+ std::array<float , kNcls > clsSize;
154+ for (unsigned int layer = 0 ; layer < kNcls ; layer++) {
155+ clsSize[layer] = (track.mftClusterSizesAndTrackFlags () >> (layer * 6 )) & 0x3f ;
156+ // LOG(info) << "Layer " << layer << ": " << clsSize[layer];
157+ }
158+ float avgCls = 0 ;
159+ for (unsigned int layer = 0 ; layer < kNcls ; layer++) {
160+ avgCls += clsSize[layer];
161+ }
162+ avgCls /= track.nClusters ();
163+
164+ std::sort (clsSize.begin (), clsSize.end ());
165+ float truncatedAvgCls = 0 ;
166+ int ncls = 0 ;
167+ for (unsigned int layer = 0 ; layer < kNcls ; layer++) {
168+ if (clsSize[layer] > 0 ) {
169+ truncatedAvgCls += clsSize[layer];
170+ ncls++;
171+ if (ncls >= 3 ) {
172+ break ; // we take the average of the first 5 non-zero clusters
173+ }
174+ }
175+ }
176+ truncatedAvgCls /= ncls;
177+
178+ if (track.has_mcParticle ()) {
179+ const auto & mcParticle = track.mcParticle ();
180+ if (std::abs (mcParticle.pdgCode ()) == 1000020040 ) { // He4
181+ registry.fill (HIST (" mMFTTrackAvgClustersHe" ), track.p (), avgCls);
182+ registry.fill (HIST (" mMFTTrackAvgClustersTruHe" ), track.p (), truncatedAvgCls);
183+ }
184+ }
185+ }
186+ }
187+ }
188+ PROCESS_SWITCH (CheckMFT, processMC, " Process MC" , false );
85189};
86190
87191WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments