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>
@@ -52,7 +52,19 @@ struct CheckMFT {
5252 {" mMFTTrackPhi" , " Track #phi; #phi; # entries" , {HistType::kTH1F , {{100 , -3.2 , 3.2 }}}},
5353 {" mMFTTrackTanl" , " Track tan #lambda; tan #lambda; # entries" , {HistType::kTH1F , {{100 , -25 , 0 }}}},
5454 {" mMFTTrackInvQPt" , " Track q/p_{T}; q/p_{T} [1/GeV]; # entries" , {HistType::kTH1F , {{250 , -10 , 10 }}}}}};
55+ Configurable<bool > avClsPlots{" avClsPlots" , false , " Enable average cluster plots" };
5556
57+ void init (o2::framework::InitContext&)
58+ {
59+ if (avClsPlots) {
60+ registry.add (" mMFTTrackAvgClusters" , " Average number of clusters per track; p;# clusters; # entries" , {HistType::kTH2F , {{100 , 0 , 100 }, {100 , 0 , 100 }}});
61+ registry.add (" mMFTTrackAvgClustersTru" , " Average number of clusters per track; p;# clusters; # entries" , {HistType::kTH2F , {{100 , 0 , 100 }, {100 , 0 , 100 }}});
62+ if (doprocessMC) {
63+ registry.add (" mMFTTrackAvgClustersHe" , " Average number of clusters per track; p;# clusters; # entries" , {HistType::kTH2F , {{100 , 0 , 100 }, {100 , 0 , 100 }}});
64+ registry.add (" mMFTTrackAvgClustersTruHe" , " Average number of clusters per track; p;# clusters; # entries" , {HistType::kTH2F , {{100 , 0 , 100 }, {100 , 0 , 100 }}});
65+ }
66+ }
67+ }
5668 void process (aod::MFTTracks const & mfttracks)
5769 {
5870 for (auto & track : mfttracks) {
@@ -74,6 +86,35 @@ struct CheckMFT {
7486 }
7587 }
7688 }
89+ if (avClsPlots) {
90+ std::array<float , 10 > clsSize;
91+ for (unsigned int layer = 0 ; layer < 10 ; layer++) {
92+ clsSize[layer] = (track.mftClusterSizesAndTrackFlags () >> (layer * 6 )) & 0x3f ;
93+ // LOG(info) << "Layer " << layer << ": " << clsSize[layer];
94+ }
95+ float avgCls = 0 ;
96+ for (unsigned int layer = 0 ; layer < 10 ; layer++) {
97+ avgCls += clsSize[layer];
98+ }
99+ avgCls /= track.nClusters ();
100+
101+ std::sort (clsSize.begin (), clsSize.end ());
102+ float truncatedAvgCls = 0 ;
103+ int ncls = 0 ;
104+ for (unsigned int layer = 0 ; layer < 10 ; layer++) {
105+ if (clsSize[layer] > 0 ) {
106+ truncatedAvgCls += clsSize[layer];
107+ ncls++;
108+ if (ncls >= 3 ) {
109+ break ; // we take the average of the first 5 non-zero clusters
110+ }
111+ }
112+ }
113+ truncatedAvgCls /= ncls;
114+
115+ registry.fill (HIST (" mMFTTrackAvgClusters" ), track.p (), avgCls);
116+ registry.fill (HIST (" mMFTTrackAvgClustersTru" ), track.p (), truncatedAvgCls);
117+ }
77118 // 1d histograms
78119 registry.fill (HIST (" mMFTTrackEta" ), eta);
79120 registry.fill (HIST (" mMFTTrackNumberOfClusters" ), nCls);
@@ -82,6 +123,48 @@ struct CheckMFT {
82123 registry.fill (HIST (" mMFTTrackInvQPt" ), track.signed1Pt ());
83124 }
84125 }
126+
127+ void processMC (soa::Join<aod::MFTTracks, aod::McMFTTrackLabels> const & mfttracks,
128+ aod::McParticles const &)
129+ {
130+ for (auto & track : mfttracks) {
131+ if (avClsPlots) {
132+ std::array<float , 10 > clsSize;
133+ for (unsigned int layer = 0 ; layer < 10 ; layer++) {
134+ clsSize[layer] = (track.mftClusterSizesAndTrackFlags () >> (layer * 6 )) & 0x3f ;
135+ // LOG(info) << "Layer " << layer << ": " << clsSize[layer];
136+ }
137+ float avgCls = 0 ;
138+ for (unsigned int layer = 0 ; layer < 10 ; layer++) {
139+ avgCls += clsSize[layer];
140+ }
141+ avgCls /= track.nClusters ();
142+
143+ std::sort (clsSize.begin (), clsSize.end ());
144+ float truncatedAvgCls = 0 ;
145+ int ncls = 0 ;
146+ for (unsigned int layer = 0 ; layer < 10 ; layer++) {
147+ if (clsSize[layer] > 0 ) {
148+ truncatedAvgCls += clsSize[layer];
149+ ncls++;
150+ if (ncls >= 3 ) {
151+ break ; // we take the average of the first 5 non-zero clusters
152+ }
153+ }
154+ }
155+ truncatedAvgCls /= ncls;
156+
157+ if (track.has_mcParticle ()) {
158+ const auto & mcParticle = track.mcParticle ();
159+ if (std::abs (mcParticle.pdgCode ()) == 1000020040 ) { // He4
160+ registry.fill (HIST (" mMFTTrackAvgClustersHe" ), track.p (), avgCls);
161+ registry.fill (HIST (" mMFTTrackAvgClustersTruHe" ), track.p (), truncatedAvgCls);
162+ }
163+ }
164+ }
165+ }
166+ }
167+ PROCESS_SWITCH (CheckMFT, processMC, " Process MC" , false );
85168};
86169
87170WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments