63 std::shared_ptr<o2::steer::MCKinematicsReader> kineReader,
64 std::shared_ptr<o2::base::GRPGeomRequest> gr) : mDataRequest(dr), mTracksSrc(
src), mUseMC(useMC), mKineReader(kineReader), mGGCCDBRequest(gr){};
72 void stileEfficiencyGraph(
std::unique_ptr<TEfficiency>& eff, const
char*
name, const
char* title,
bool bidimensional, const
int markerStyle, const
double markersize, const
int markercolor, const
int linercolor);
85 bool mVerboseOutput =
false;
87 std::string mOutFileName;
89 std::shared_ptr<o2::steer::MCKinematicsReader> mKineReader;
92 float mrangesPt[
NLAYERS][2] = {{0., 0.5}, {0.5, 2.}, {2., 7.5}};
95 gsl::span<const o2::itsmft::ROFRecord> mTracksROFRecords;
96 gsl::span<const o2::itsmft::ROFRecord> mClustersROFRecords;
97 gsl::span<const o2::its::TrackITS> mTracks;
98 gsl::span<const o2::MCCompLabel> mTracksMCLabels;
99 gsl::span<const o2::itsmft::CompClusterExt> mClusters;
100 gsl::span<const unsigned char> mClusPatterns;
101 gsl::span<const int> mInputITSidxs;
103 std::vector<o2::BaseCluster<float>> mITSClustersArray;
107 std::shared_ptr<DataRequest> mDataRequest;
108 unsigned short mMask = 0x7f;
111 std::shared_ptr<o2::base::GRPGeomRequest> mGGCCDBRequest;
112 std::unique_ptr<TFile> mOutFile;
113 int mDuplicated_layer[
NLAYERS] = {0};
118 std::unique_ptr<TH1D> mDistanceClustersX[
NLAYERS];
119 std::unique_ptr<TH1D> mDistanceClustersY[
NLAYERS];
120 std::unique_ptr<TH1D> mDistanceClustersZ[
NLAYERS];
121 std::unique_ptr<TH1D> mDistanceClusters[
NLAYERS];
123 std::unique_ptr<TH1D> mDCAxyOriginal[
NLAYERS];
124 std::unique_ptr<TH1D> mDCAzOriginal[
NLAYERS];
126 std::unique_ptr<TH1D> mDCAxyDuplicated;
127 std::unique_ptr<TH1D> mDCAzDuplicated;
130 std::unique_ptr<TH1D> mDCAxyDuplicated_layer[
NLAYERS];
131 std::unique_ptr<TH1D> mDCAzDuplicated_layer[
NLAYERS];
134 std::unique_ptr<TH1D> mPhiOriginal[
NLAYERS];
135 std::unique_ptr<TH1D> mPhiTrackOriginal[
NLAYERS];
136 std::unique_ptr<TH1D> mEtaOriginal[
NLAYERS];
137 std::unique_ptr<TH1D> mPtOriginal[
NLAYERS];
141 TH1D* mPhiTrackDuplicated[
NLAYERS];
142 TH2D* mPhiTrackDuplicatedvsphiDuplicated[
NLAYERS];
143 TH2D* mPhiTrackoriginalvsphioriginal[
NLAYERS];
144 TH1D* mPhiOriginalIfDuplicated[
NLAYERS];
146 std::unique_ptr<TH2D> mZvsPhiDUplicated[
NLAYERS];
149 std::unique_ptr<TH3D> m3DClusterPositions;
150 std::unique_ptr<TH3D> m3DDuplicatedClusterPositions;
151 std::unique_ptr<TH2D> m2DClusterOriginalPositions;
152 std::unique_ptr<TH2D> m2DClusterDuplicatedPositions;
154 std::unique_ptr<TH1D> mXoriginal;
155 std::unique_ptr<TH1D> mYoriginal;
156 std::unique_ptr<TH1D> mZoriginal;
157 std::unique_ptr<TH1D> mXduplicated;
158 std::unique_ptr<TH1D> mYduplicated;
159 std::unique_ptr<TH1D> mZduplicated;
162 std::unique_ptr<TH1D> mEfficiencyGoodMatch;
163 std::unique_ptr<TH1D> mEfficiencyFakeMatch;
164 std::unique_ptr<TH1D> mEfficiencyTotal;
165 std::unique_ptr<TH1D> mEfficiencyGoodMatch_layer[
NLAYERS];
166 std::unique_ptr<TH1D> mEfficiencyFakeMatch_layer[
NLAYERS];
167 std::unique_ptr<TH1D> mEfficiencyTotal_layer[
NLAYERS];
168 TH2D* mEfficiencyGoodMatchPt_layer[
NLAYERS];
169 TH2D* mEfficiencyFakeMatchPt_layer[
NLAYERS];
170 TH2D* mEfficiencyGoodMatchEta_layer[
NLAYERS];
171 TH2D* mEfficiencyFakeMatchEta_layer[
NLAYERS];
172 TH2D* mEfficiencyGoodMatchPhi_layer[
NLAYERS];
173 TH2D* mEfficiencyGoodMatchPhiTrack_layer[
NLAYERS];
174 TH2D* mEfficiencyGoodMatchPhiOriginal_layer[
NLAYERS];
175 TH2D* mEfficiencyFakeMatchPhi_layer[
NLAYERS];
176 TH2D* mEfficiencyFakeMatchPhiTrack_layer[
NLAYERS];
182 std::unique_ptr<TH1D> mDuplicatedEtaAllPt[
NLAYERS];
183 std::unique_ptr<TH1D> mDuplicatedEta[
NLAYERS][3];
184 std::unique_ptr<TH1D> mDuplicatedPhiAllPt[
NLAYERS];
185 std::unique_ptr<TH1D> mDuplicatedPhi[
NLAYERS][3];
188 TH2D* mDuplicatedPtEta[
NLAYERS];
189 TH2D* mDuplicatedPtPhi[
NLAYERS];
190 TH2D* mDuplicatedEtaPhi[
NLAYERS];
193 std::unique_ptr<TH1D> mNGoodMatchesEtaAllPt[
NLAYERS];
194 std::unique_ptr<TH1D> mNGoodMatchesEta[
NLAYERS][3];
195 std::unique_ptr<TH1D> mNGoodMatchesPhiAllPt[
NLAYERS];
196 std::unique_ptr<TH1D> mNGoodMatchesPhi[
NLAYERS][3];
198 std::unique_ptr<TH1D> mNFakeMatchesEtaAllPt[
NLAYERS];
199 std::unique_ptr<TH1D> mNFakeMatchesEta[
NLAYERS][3];
200 std::unique_ptr<TH1D> mNFakeMatchesPhiAllPt[
NLAYERS];
201 std::unique_ptr<TH1D> mNFakeMatchesPhi[
NLAYERS][3];
203 TH1D* mNGoodMatchesPt[
NLAYERS];
204 TH1D* mNFakeMatchesPt[
NLAYERS];
206 TH1D* mNGoodMatchesRow[
NLAYERS];
207 TH1D* mNFakeMatchesRow[
NLAYERS];
209 TH2D* mNGoodMatchesPtEta[
NLAYERS];
210 TH2D* mNFakeMatchesPtEta[
NLAYERS];
212 TH2D* mNGoodMatchesPtPhi[
NLAYERS];
213 TH2D* mNFakeMatchesPtPhi[
NLAYERS];
215 TH2D* mNGoodMatchesEtaPhi[
NLAYERS];
216 TH2D* mNFakeMatchesEtaPhi[
NLAYERS];
219 std::unique_ptr<TEfficiency> mEffPtGood[
NLAYERS];
220 std::unique_ptr<TEfficiency> mEffPtFake[
NLAYERS];
221 std::unique_ptr<TEfficiency> mEffRowGood[
NLAYERS];
222 std::unique_ptr<TEfficiency> mEffRowFake[
NLAYERS];
223 std::unique_ptr<TEfficiency> mEffPtEtaGood[
NLAYERS];
224 std::unique_ptr<TEfficiency> mEffPtEtaFake[
NLAYERS];
225 std::unique_ptr<TEfficiency> mEffPtPhiGood[
NLAYERS];
226 std::unique_ptr<TEfficiency> mEffPtPhiFake[
NLAYERS];
227 std::unique_ptr<TEfficiency> mEffEtaPhiGood[
NLAYERS];
228 std::unique_ptr<TEfficiency> mEffEtaPhiFake[
NLAYERS];
230 std::unique_ptr<TEfficiency> mEffEtaGoodAllPt[
NLAYERS];
231 std::unique_ptr<TEfficiency> mEffEtaGood[
NLAYERS][3];
232 std::unique_ptr<TEfficiency> mEffEtaFakeAllPt[
NLAYERS];
233 std::unique_ptr<TEfficiency> mEffEtaFake[
NLAYERS][3];
235 std::unique_ptr<TEfficiency> mEffPhiGoodAllPt[
NLAYERS];
236 std::unique_ptr<TEfficiency> mEffPhiGood[
NLAYERS][3];
237 std::unique_ptr<TEfficiency> mEffPhiFakeAllPt[
NLAYERS];
238 std::unique_ptr<TEfficiency> mEffPhiFake[
NLAYERS][3];
240 TH2D* mnGoodMatchesPt_layer[
NLAYERS];
241 TH2D* mnFakeMatchesPt_layer[
NLAYERS];
243 TH2D* mnGoodMatchesEta_layer[
NLAYERS];
244 TH2D* mnFakeMatchesEta_layer[
NLAYERS];
246 TH2D* mnGoodMatchesPhi_layer[
NLAYERS];
247 TH2D* mnGoodMatchesPhiTrack_layer[
NLAYERS];
248 TH2D* mnGoodMatchesPhiOriginal_layer[
NLAYERS];
249 TH2D* mnFakeMatchesPhi_layer[
NLAYERS];
250 TH2D* mnFakeMatchesPhiTrack_layer[
NLAYERS];
252 std::unique_ptr<TH1D> DCAxyData[
NLAYERS];
253 std::unique_ptr<TH1D> DCAzData[
NLAYERS];
255 std::unique_ptr<TH1D> DCAxyRejected[
NLAYERS];
256 std::unique_ptr<TH1D> DCAzRejected[
NLAYERS];
258 std::unique_ptr<TH1D> DistanceClustersX[
NLAYERS];
259 std::unique_ptr<TH1D> DistanceClustersY[
NLAYERS];
260 std::unique_ptr<TH1D> DistanceClustersZ[
NLAYERS];
261 std::unique_ptr<TH1D> DistanceClustersXAftercuts[
NLAYERS];
262 std::unique_ptr<TH1D> DistanceClustersYAftercuts[
NLAYERS];
263 std::unique_ptr<TH1D> DistanceClustersZAftercuts[
NLAYERS];
280 int nDuplicatedClusters[
NLAYERS] = {0};
281 int nTracksSelected[
NLAYERS] = {0};
287 TH1D* thetaOriginalCalc[
NLAYERS];
288 TH1D* thetaDuplicated[
NLAYERS];
289 TH1D* thetaOriginalCalcWhenDuplicated[
NLAYERS];
290 TH1D* thetaOriginalWhenDuplicated[
NLAYERS];
292 std::unique_ptr<TH1D> IPOriginalxy[
NLAYERS];
293 std::unique_ptr<TH1D> IPOriginalz[
NLAYERS];
294 std::unique_ptr<TH1D> IPOriginalifDuplicatedxy[
NLAYERS];
295 std::unique_ptr<TH1D> IPOriginalifDuplicatedz[
NLAYERS];
297 std::unique_ptr<TH1D> chipRowDuplicated[
NLAYERS];
298 std::unique_ptr<TH1D> chipRowOriginalIfDuplicated[
NLAYERS];
300 std::unique_ptr<TH1D> chi2track;
301 std::unique_ptr<TH1D> chi2trackAccepted;
306 LOGP(info,
"--------------- init");
311 mOutFileName = pars.outFileName;
315 double xbins[nbPt + 1], ptcutl = 0.05, ptcuth = 7.5;
316 double a = std::log(ptcuth / ptcutl) / nbPt;
317 for (
int i = 0;
i <= nbPt;
i++) {
318 xbins[
i] = ptcutl * std::exp(
i *
a);
321 mOutFile = std::make_unique<TFile>(mOutFileName.c_str(),
"recreate");
323 mXoriginal = std::make_unique<TH1D>(
"xoriginal",
"x original ;x (cm); ", 200, 0, 0);
324 mYoriginal = std::make_unique<TH1D>(
"yoriginal",
"y original ;y (cm); ", 200, 0, 0);
325 mZoriginal = std::make_unique<TH1D>(
"zoriginal",
"z original ;z (cm); ", 300, 0, 0);
326 mXduplicated = std::make_unique<TH1D>(
"xduplicated",
"x duplicated ;x (cm); ", 200, -10, 10);
327 mYduplicated = std::make_unique<TH1D>(
"yduplicated",
"y duplicated ;y (cm); ", 200, -10, 10);
328 mZduplicated = std::make_unique<TH1D>(
"zduplicated",
"z duplicated ;z (cm); ", 300, -30, 30);
330 mDCAxyDuplicated = std::make_unique<TH1D>(
"dcaXYDuplicated",
"Distance between track and duplicated cluster ;DCA xy (cm); ", 400, -0.2, 0.2);
331 mDCAzDuplicated = std::make_unique<TH1D>(
"dcaZDuplicated",
"Distance between track and duplicated cluster ;DCA z (cm); ", 400, -0.2, 0.2);
333 m3DClusterPositions = std::make_unique<TH3D>(
"3DClusterPositions",
";x (cm);y (cm);z (cm)", 200, -10, 10, 200, -10, 10, 400, -20, 20);
334 m3DDuplicatedClusterPositions = std::make_unique<TH3D>(
"3DDuplicatedClusterPositions",
";x (cm);y (cm);z (cm)", 200, -10, 10, 200, -10, 10, 500, -30, 30);
335 m2DClusterOriginalPositions = std::make_unique<TH2D>(
"m2DClusterOriginalPositions",
";x (cm);y (cm)", 400, -10, 10, 400, -6, 6);
336 m2DClusterDuplicatedPositions = std::make_unique<TH2D>(
"m2DClusterDuplicatedPositions",
";x (cm);y (cm)", 400, -10, 10, 400, -6, 6);
338 mEfficiencyGoodMatch = std::make_unique<TH1D>(
"mEfficiencyGoodMatch",
";#sigma(DCA) cut;Efficiency;", 20, 0.5, 20.5);
339 mEfficiencyFakeMatch = std::make_unique<TH1D>(
"mEfficiencyFakeMatch",
";#sigma(DCA) cut;Efficiency;", 20, 0.5, 20.5);
340 mEfficiencyTotal = std::make_unique<TH1D>(
"mEfficiencyTotal",
";#sigma(DCA) cut;Efficiency;", 20, 0.5, 20.5);
342 chi2track = std::make_unique<TH1D>(
"chi2track",
"; $chi^{2}", 500, 0, 100);
343 chi2trackAccepted = std::make_unique<TH1D>(
"chi2trackAccepted",
"; $chi^{2}", 500, 0, 100);
347 chipRowDuplicated[
i] = std::make_unique<TH1D>(Form(
"chipPosDuplicated_L%d",
i), Form(
"L%d; row",
i), 512, -0.5, 511.5);
348 chipRowOriginalIfDuplicated[
i] = std::make_unique<TH1D>(Form(
"chipPosOriginalIfDuplicated%d",
i), Form(
"L%d; row",
i), 512, -0.5, 511.5);
350 DCAxyData[
i] = std::make_unique<TH1D>(Form(
"dcaXYData_L%d",
i),
"Distance between track and original cluster ;DCA xy (cm); ", 4000, -2, 2);
351 DCAzData[
i] = std::make_unique<TH1D>(Form(
"dcaZData_L%d",
i),
"Distance between track and original cluster ;DCA z (cm); ", 4000, -2, 2);
352 DCAxyRejected[
i] = std::make_unique<TH1D>(Form(
"DCAxyRejected%d",
i),
"Distance between track and original cluster (rejected) ;DCA xy (cm); ", 30000, -30, 30);
353 DCAzRejected[
i] = std::make_unique<TH1D>(Form(
"DCAzRejected%d",
i),
"Distance between track and original cluster (rejected) ;DCA z (cm); ", 30000, -30, 30);
355 DistanceClustersX[
i] = std::make_unique<TH1D>(Form(
"distanceClustersX_L%d",
i),
";Distance x (cm); ", 100, 0, 1);
356 DistanceClustersY[
i] = std::make_unique<TH1D>(Form(
"distanceClustersY_L%d",
i),
";Distance y (cm); ", 100, 0, 1);
357 DistanceClustersZ[
i] = std::make_unique<TH1D>(Form(
"distanceClustersZ_L%d",
i),
";Distance z (cm); ", 100, 0, 1);
358 DistanceClustersXAftercuts[
i] = std::make_unique<TH1D>(Form(
"distanceClustersXAftercuts_L%d",
i),
";Distance x (cm); ", 100, 0, 1);
359 DistanceClustersYAftercuts[
i] = std::make_unique<TH1D>(Form(
"distanceClustersYAftercuts_L%d",
i),
";Distance y (cm); ", 100, 0, 1);
360 DistanceClustersZAftercuts[
i] = std::make_unique<TH1D>(Form(
"distanceClustersZAftercuts_L%d",
i),
";Distance z (cm); ", 100, 0, 1);
362 mDistanceClustersX[
i] = std::make_unique<TH1D>(Form(
"distanceClustersX_L%d",
i),
";Distance x (cm); ", 100, 0, 1);
363 mDistanceClustersY[
i] = std::make_unique<TH1D>(Form(
"distanceClustersY_L%d",
i),
";Distance y (cm); ", 100, 0, 1);
364 mDistanceClustersZ[
i] = std::make_unique<TH1D>(Form(
"distanceClustersZ_L%d",
i),
";Distance z (cm); ", 100, 0, 1);
365 mDistanceClusters[
i] = std::make_unique<TH1D>(Form(
"distanceClusters_L%d",
i),
";Distance (cm); ", 100, 0, 1);
367 mDCAxyOriginal[
i] = std::make_unique<TH1D>(Form(
"dcaXYOriginal_L%d",
i),
"Distance between track and original cluster ;DCA xy (cm); ", 400, -0.2, 0.2);
368 mDCAzOriginal[
i] = std::make_unique<TH1D>(Form(
"dcaZOriginal_L%d",
i),
"Distance between track and original cluster ;DCA z (cm); ", 400, -0.2, 0.2);
370 mPhiOriginal[
i] = std::make_unique<TH1D>(Form(
"phiOriginal_L%d",
i),
";phi (deg); ", 1440, -180, 180);
371 mPhiTrackOriginal[
i] = std::make_unique<TH1D>(Form(
"phiTrackOriginal_L%d",
i),
";phi Track (deg); ", 1440, 0, 360);
372 mEtaOriginal[
i] = std::make_unique<TH1D>(Form(
"etaOriginal_L%d",
i),
";eta (deg); ", 100, -2, 2);
373 mPtOriginal[
i] = std::make_unique<TH1D>(Form(
"ptOriginal_L%d",
i),
";pt (GeV/c); ", 100, 0, 10);
375 mZvsPhiDUplicated[
i] = std::make_unique<TH2D>(Form(
"zvsphiDuplicated_L%d",
i),
";z (cm);phi (deg)", 400, -20, 20, 1440, -180, 180);
377 mPtDuplicated[
i] =
new TH1D(Form(
"ptDuplicated_L%d",
i),
";pt (GeV/c); ", nbPt, 0, 7.5);
378 mEtaDuplicated[
i] =
new TH1D(Form(
"etaDuplicated_L%d",
i),
";eta; ", 40, -2, 2);
379 mPhiDuplicated[
i] =
new TH1D(Form(
"phiDuplicated_L%d",
i),
";phi (deg); ", 1440, -180, 180);
380 mPhiTrackDuplicated[
i] =
new TH1D(Form(
"phiTrackDuplicated_L%d",
i),
";phi Track (deg); ", 1440, 0, 360);
381 mPhiOriginalIfDuplicated[
i] =
new TH1D(Form(
"phiOriginalIfDuplicated_L%d",
i),
";phi (deg); ", 1440, -180, 180);
382 mPhiTrackDuplicatedvsphiDuplicated[
i] =
new TH2D(Form(
"phiTrackDuplicatedvsphiDuplicated_L%d",
i),
";phi track (deg);phi oridinal if duplicated (deg); ", 1440, 0, 360, 1440, -180, 180);
383 mPhiTrackoriginalvsphioriginal[
i] =
new TH2D(Form(
"phiTrackoriginalvsphioriginal_L%d",
i),
";phi track (deg);phi original (deg); ", 1440, 0, 360, 1440, -180, 180);
384 mDCAxyDuplicated_layer[
i] = std::make_unique<TH1D>(Form(
"dcaXYDuplicated_layer_L%d",
i),
"Distance between track and duplicated cluster ;DCA xy (cm); ", 400, -0.2, 0.2);
385 mDCAzDuplicated_layer[
i] = std::make_unique<TH1D>(Form(
"dcaZDuplicated_layer_L%d",
i),
"Distance between track and duplicated cluster ;DCA z (cm); ", 400, -0.2, 0.2);
387 mEfficiencyGoodMatch_layer[
i] = std::make_unique<TH1D>(Form(
"mEfficiencyGoodMatch_layer_L%d",
i),
";#sigma(DCA) cut;Efficiency;", 20, 0.5, 20.5);
388 mEfficiencyFakeMatch_layer[
i] = std::make_unique<TH1D>(Form(
"mEfficiencyFakeMatch_layer_L%d",
i),
";#sigma(DCA) cut;Efficiency;", 20, 0.5, 20.5);
389 mEfficiencyTotal_layer[
i] = std::make_unique<TH1D>(Form(
"mEfficiencyTotal_layer_L%d",
i),
";#sigma(DCA) cut;Efficiency;", 20, 0.5, 20.5);
391 mEfficiencyGoodMatchPt_layer[
i] =
new TH2D(Form(
"mEfficiencyGoodMatchPt_layer_L%d",
i),
";#it{p}_{T} (GeV/c);#sigma(DCA) cut;Efficiency;", nbPt, 0, 7.5, 20, 0.5, 20.5);
392 mEfficiencyFakeMatchPt_layer[
i] =
new TH2D(Form(
"mEfficiencyFakeMatchPt_layer_L%d",
i),
";#it{p}_{T} (GeV/c);#sigma(DCA) cut;Efficiency;", nbPt, 0, 7.5, 20, 0.5, 20.5);
394 mEfficiencyGoodMatchEta_layer[
i] =
new TH2D(Form(
"mEfficiencyGoodMatchEta_layer_L%d",
i),
";#eta;#sigma(DCA) cut;Efficiency;", 40, -2, 2, 20, 0.5, 20.5);
395 mEfficiencyFakeMatchEta_layer[
i] =
new TH2D(Form(
"mEfficiencyFakeMatchEta_layer_L%d",
i),
";#eta;#sigma(DCA) cut;Efficiency;", 40, -2, 2, 20, 0.5, 20.5);
397 mEfficiencyGoodMatchPhi_layer[
i] =
new TH2D(Form(
"mEfficiencyGoodMatchPhi_layer_L%d",
i),
";#phi;#sigma(DCA) cut;Efficiency;", 1440, -180, 180, 20, 0.5, 20.5);
398 mEfficiencyGoodMatchPhiTrack_layer[
i] =
new TH2D(Form(
"mEfficiencyGoodMatchPhiTrack_layer_L%d",
i),
";#phi track;#sigma(DCA) cut;Efficiency;", 1440, 0, 360, 20, 0.5, 20.5);
399 mEfficiencyGoodMatchPhiOriginal_layer[
i] =
new TH2D(Form(
"mEfficiencyGoodMatchPhiOriginal_layer_L%d",
i),
";#phi Original;#sigma(DCA) cut;Efficiency;", 1440, -180, 180, 20, 0.5, 20.5);
400 mEfficiencyFakeMatchPhi_layer[
i] =
new TH2D(Form(
"mEfficiencyFakeMatchPhi_layer_L%d",
i),
";#phi;#sigma(DCA) cut;Efficiency;", 1440, -180, 180, 20, 0.5, 20.5);
401 mEfficiencyFakeMatchPhiTrack_layer[
i] =
new TH2D(Form(
"mEfficiencyFakeMatchPhiTrack_layer_L%d",
i),
";#phi Track;#sigma(DCA) cut;Efficiency;", 1440, 0, 360, 20, 0.5, 20.5);
403 mPt_EtaDupl[
i] =
new TH2D(Form(
"mPt_EtaDupl_L%d",
i),
";#it{p}_{T} (GeV/c);#eta; ", 100, 0, 10, 100, -2, 2);
405 mDuplicatedPt[
i] =
new TH1D(Form(
"mDuplicatedPt_log_L%d",
i), Form(
"; #it{p}_{T} (GeV/c); Number of duplciated clusters L%d",
i), nbPt, 0, 7.5 );
406 mDuplicatedPt[
i]->Sumw2();
407 mNGoodMatchesPt[
i] =
new TH1D(Form(
"mNGoodMatchesPt_L%d",
i), Form(
"; #it{p}_{T} (GeV/c); Number of good matches L%d",
i), nbPt, 0, 7.5 );
408 mNGoodMatchesPt[
i]->Sumw2();
409 mNFakeMatchesPt[
i] =
new TH1D(Form(
"mNFakeMatchesPt_L%d",
i), Form(
"; #it{p}_{T} (GeV/c); Number of fake matches L%d",
i), nbPt, 0, 7.5 );
410 mNFakeMatchesPt[
i]->Sumw2();
412 mDuplicatedRow[
i] =
new TH1D(Form(
"mDuplicatedRow_L%d",
i), Form(
"; Row; Number of duplciated clusters L%d",
i), 512, -0.5, 511.5);
413 mDuplicatedRow[
i]->Sumw2();
414 mNGoodMatchesRow[
i] =
new TH1D(Form(
"mNGoodMatchesRow_L%d",
i), Form(
"; Row; Number of good matches L%d",
i), 512, -0.5, 511.5);
415 mNGoodMatchesRow[
i]->Sumw2();
416 mNFakeMatchesRow[
i] =
new TH1D(Form(
"mNFakeMatchesRow_L%d",
i), Form(
";Row; Number of fake matches L%d",
i), 512, -0.5, 511.5);
417 mNFakeMatchesRow[
i]->Sumw2();
419 mDuplicatedPtEta[
i] =
new TH2D(Form(
"mDuplicatedPtEta_log_L%d",
i), Form(
"; #it{p}_{T} (GeV/c);#eta; Number of duplciated clusters L%d",
i), nbPt, 0, 7.5 , 40, -2, 2);
420 mDuplicatedPtEta[
i]->Sumw2();
421 mNGoodMatchesPtEta[
i] =
new TH2D(Form(
"mNGoodMatchesPtEta_L%d",
i), Form(
"; #it{p}_{T} (GeV/c);#eta; Number of good matches L%d",
i), nbPt, 0, 7.5 , 40, -2, 2);
422 mNGoodMatchesPtEta[
i]->Sumw2();
423 mNFakeMatchesPtEta[
i] =
new TH2D(Form(
"mNFakeMatchesPtEta_L%d",
i), Form(
"; #it{p}_{T} (GeV/c);#eta; Number of good matches L%d",
i), nbPt, 0, 7.5 , 40, -2, 2);
424 mNFakeMatchesPtEta[
i]->Sumw2();
426 mDuplicatedPtPhi[
i] =
new TH2D(Form(
"mDuplicatedPtPhi_log_L%d",
i), Form(
"; #it{p}_{T} (GeV/c);#phi (deg); Number of duplciated clusters L%d",
i), nbPt, 0, 7.5 , 1440, -180, 180);
427 mDuplicatedPtPhi[
i]->Sumw2();
428 mNGoodMatchesPtPhi[
i] =
new TH2D(Form(
"mNGoodMatchesPtPhi_L%d",
i), Form(
"; #it{p}_{T} (GeV/c);#phi (deg); Number of good matches L%d",
i), nbPt, 0, 7.5 , 1440, -180, 180);
429 mNGoodMatchesPtPhi[
i]->Sumw2();
430 mNFakeMatchesPtPhi[
i] =
new TH2D(Form(
"mNFakeMatchesPtPhi_L%d",
i), Form(
"; #it{p}_{T} (GeV/c);#phi (deg); Number of good matches L%d",
i), nbPt, 0, 7.5 , 1440, -180, 180);
431 mNFakeMatchesPtPhi[
i]->Sumw2();
433 mDuplicatedEtaPhi[
i] =
new TH2D(Form(
"mDuplicatedEtaPhi_L%d",
i), Form(
"; #eta;#phi (deg); Number of duplciated clusters L%d",
i), 40, -2, 2, 1440, -180, 180);
434 mDuplicatedEtaPhi[
i]->Sumw2();
435 mNGoodMatchesEtaPhi[
i] =
new TH2D(Form(
"mNGoodMatchesEtaPhi_L%d",
i), Form(
"; #eta;#phi (deg); Number of good matches L%d",
i), 40, -2, 2, 1440, -180, 180);
436 mNGoodMatchesEtaPhi[
i]->Sumw2();
437 mNFakeMatchesEtaPhi[
i] =
new TH2D(Form(
"mNFakeMatchesEtaPhi_L%d",
i), Form(
"; #eta;#phi (deg); Number of good matches L%d",
i), 40, -2, 2, 1440, -180, 180);
438 mNFakeMatchesEtaPhi[
i]->Sumw2();
440 mDuplicatedEtaAllPt[
i] = std::make_unique<TH1D>(Form(
"mDuplicatedEtaAllPt_L%d",
i), Form(
"; #eta; Number of duplicated clusters L%d",
i), 40, -2, 2);
441 mNGoodMatchesEtaAllPt[
i] = std::make_unique<TH1D>(Form(
"mNGoodMatchesEtaAllPt_L%d",
i), Form(
"; #eta; Number of good matches L%d",
i), 40, -2, 2);
442 mNFakeMatchesEtaAllPt[
i] = std::make_unique<TH1D>(Form(
"mNFakeMatchesEtaAllPt_L%d",
i), Form(
"; #eta; Number of fake matches L%d",
i), 40, -2, 2);
444 mDuplicatedPhiAllPt[
i] = std::make_unique<TH1D>(Form(
"mDuplicatedPhiAllPt_L%d",
i), Form(
"; #phi (deg); Number of duplicated clusters L%d",
i), 1440, -180, 180);
445 mNGoodMatchesPhiAllPt[
i] = std::make_unique<TH1D>(Form(
"mNGoodMatchesPhiAllPt_L%d",
i), Form(
"; #phi (deg); Number of good matches L%d",
i), 1440, -180, 180);
446 mNFakeMatchesPhiAllPt[
i] = std::make_unique<TH1D>(Form(
"mNFakeMatchesPhiAllPt_L%d",
i), Form(
"; #phi (deg); Number of fake matches L%d",
i), 1440, -180, 180);
448 mnGoodMatchesPt_layer[
i] =
new TH2D(Form(
"mnGoodMatchesPt_layer_L%d",
i),
";pt; nGoodMatches", nbPt, 0, 7.5 , 20, 0.5, 20.5);
449 mnFakeMatchesPt_layer[
i] =
new TH2D(Form(
"mnFakeMatchesPt_layer_L%d",
i),
";pt; nFakeMatches", nbPt, 0, 7.5 , 20, 0.5, 20.5);
450 mnGoodMatchesEta_layer[
i] =
new TH2D(Form(
"mnGoodMatchesEta_layer_L%d",
i),
";#eta; nGoodMatches", 40, -2, 2, 20, 0.5, 20.5);
451 mnFakeMatchesEta_layer[
i] =
new TH2D(Form(
"mnFakeMatchesEta_layer_L%d",
i),
";#eta; nFakeMatches", 40, -2, 2, 20, 0.5, 20.5);
452 mnGoodMatchesPhi_layer[
i] =
new TH2D(Form(
"mnGoodMatchesPhi_layer_L%d",
i),
";#Phi; nGoodMatches", 1440, -180, 180, 20, 0.5, 20.5);
453 mnGoodMatchesPhiTrack_layer[
i] =
new TH2D(Form(
"mnGoodMatchesPhiTrack_layer_L%d",
i),
";#Phi track; nGoodMatches", 1440, 0, 360, 20, 0.5, 20.5);
454 mnGoodMatchesPhiOriginal_layer[
i] =
new TH2D(Form(
"mnGoodMatchesPhiOriginal_layer_L%d",
i),
";#Phi of the original Cluster; nGoodMatches", 1440, -180, 180, 20, 0.5, 20.5);
455 mnFakeMatchesPhi_layer[
i] =
new TH2D(Form(
"mnFakeMatchesPhi_layer_L%d",
i),
";#Phi; nFakeMatches", 1440, -180, 180, 20, 0.5, 20.5);
456 mnFakeMatchesPhiTrack_layer[
i] =
new TH2D(Form(
"mnFakeMatchesPhiTrack_layer_L%d",
i),
";#Phi track; nFakeMatches", 1440, 0, 360, 20, 0.5, 20.5);
458 denPt[
i] =
new TH1D(Form(
"denPt_L%d",
i), Form(
"denPt_L%d",
i), nbPt, 0, 7.5 );
459 numPt[
i] =
new TH1D(Form(
"numPt_L%d",
i), Form(
"numPt_L%d",
i), nbPt, 0, 7.5 );
460 numPtGood[
i] =
new TH1D(Form(
"numPtGood_L%d",
i), Form(
"numPtGood_L%d",
i), nbPt, 0, 7.5 );
461 numPtFake[
i] =
new TH1D(Form(
"numPtFake_L%d",
i), Form(
"numPtFake_L%d",
i), nbPt, 0, 7.5 );
463 denPhi[
i] =
new TH1D(Form(
"denPhi_L%d",
i), Form(
"denPhi_L%d",
i), 1440, -180, 180);
464 numPhi[
i] =
new TH1D(Form(
"numPhi_L%d",
i), Form(
"numPhi_L%d",
i), 1440, -180, 180);
465 numPhiGood[
i] =
new TH1D(Form(
"numPhiGood_L%d",
i), Form(
"numPhiGood_L%d",
i), 1440, -180, 180);
466 numPhiFake[
i] =
new TH1D(Form(
"numPhiFake_L%d",
i), Form(
"numPhiFake_L%d",
i), 1440, -180, 180);
468 denEta[
i] =
new TH1D(Form(
"denEta_L%d",
i), Form(
"denEta_L%d",
i), 200, -2, 2);
469 numEta[
i] =
new TH1D(Form(
"numEta_L%d",
i), Form(
"numEta_L%d",
i), 200, -2, 2);
470 numEtaGood[
i] =
new TH1D(Form(
"numEtaGood_L%d",
i), Form(
"numEtaGood_L%d",
i), 200, -2, 2);
471 numEtaFake[
i] =
new TH1D(Form(
"numEtaFake_L%d",
i), Form(
"numEtaFake_L%d",
i), 200, -2, 2);
473 diffPhivsPt[
i] =
new TH2D(Form(
"diffPhivsPt_L%d",
i), Form(
"diffPhivsPt_L%d",
i), nbPt, 0, 7.5 , 50, 0, 5);
475 IPOriginalxy[
i] = std::make_unique<TH1D>(Form(
"IPOriginalxy_L%d",
i), Form(
"IPOriginalxy_L%d",
i), 500, -0.002, 0.002);
476 IPOriginalz[
i] = std::make_unique<TH1D>(Form(
"IPOriginalz_L%d",
i), Form(
"IPOriginalz_L%d",
i), 200, -10, 10);
477 IPOriginalifDuplicatedxy[
i] = std::make_unique<TH1D>(Form(
"IPOriginalifDuplicatedxy_L%d",
i), Form(
"IPOriginalifDuplicatedxy_L%d",
i), 1000, -0.005, 0.005);
478 IPOriginalifDuplicatedz[
i] = std::make_unique<TH1D>(Form(
"IPOriginalifDuplicatedz_L%d",
i), Form(
"IPOriginalifDuplicatedz_L%d",
i), 200, -10, 10);
480 for (
int j = 0;
j < 3;
j++) {
481 mDuplicatedEta[
i][
j] = std::make_unique<TH1D>(Form(
"mDuplicatedEta_L%d_pt%d",
i,
j), Form(
"%f < #it{p}_{T} < %f GeV/c; #eta; Number of duplicated clusters L%d", mrangesPt[
j][0], mrangesPt[
j][1],
i), 40, -2, 2);
482 mNGoodMatchesEta[
i][
j] = std::make_unique<TH1D>(Form(
"mNGoodMatchesEta_L%d_pt%d",
i,
j), Form(
"%f < #it{p}_{T} < %f GeV/c; #eta; Number of good matches L%d", mrangesPt[
j][0], mrangesPt[
j][1],
i), 40, -2, 2);
483 mNFakeMatchesEta[
i][
j] = std::make_unique<TH1D>(Form(
"mNFakeMatchesEta_L%d_pt%d",
i,
j), Form(
"%f < #it{p}_{T} < %f GeV/c; #eta; Number of fake matches L%d", mrangesPt[
j][0], mrangesPt[
j][1],
i), 40, -2, 2);
485 mDuplicatedPhi[
i][
j] = std::make_unique<TH1D>(Form(
"mDuplicatedPhi_L%d_pt%d",
i,
j), Form(
"%f < #it{p}_{T} < %f GeV/c; #phi; Number of duplicated clusters L%d", mrangesPt[
j][0], mrangesPt[
j][1],
i), 1440, -180, 180);
486 mNGoodMatchesPhi[
i][
j] = std::make_unique<TH1D>(Form(
"mNGoodMatchesPhi_L%d_pt%d",
i,
j), Form(
"%f < #it{p}_{T} < %f GeV/c; #phi; Number of good matches L%d", mrangesPt[
j][0], mrangesPt[
j][1],
i), 1440, -180, 180);
487 mNFakeMatchesPhi[
i][
j] = std::make_unique<TH1D>(Form(
"mNFakeMatchesPhi_L%d_pt%d",
i,
j), Form(
"%f < #it{p}_{T} < %f GeV/c; #phi; Number of fake matches L%d", mrangesPt[
j][0], mrangesPt[
j][1],
i), 1440, -180, 180);
490 gStyle->SetPalette(55);
540 LOGP(info,
"--------------- getDCAClusterTrackMC");
547 LOG(info) <<
">>>>>>>>>>>> Magnetic field: " << bz;
549 unsigned int rofIndexTrack = 0;
550 unsigned int rofNEntriesTrack = 0;
551 unsigned int rofIndexClus = 0;
552 unsigned int rofNEntriesClus = 0;
554 unsigned int totClus = 0;
558 std::unordered_map<o2::MCCompLabel, std::vector<int>> label_vecClus[mClustersROFRecords.size()][
NLAYERS];
560 for (
unsigned int iROF = 0; iROF < mTracksROFRecords.size(); iROF++) {
561 rofIndexTrack = mTracksROFRecords[iROF].getFirstEntry();
562 rofNEntriesTrack = mTracksROFRecords[iROF].getNEntries();
564 rofIndexClus = mClustersROFRecords[iROF].getFirstEntry();
565 rofNEntriesClus = mClustersROFRecords[iROF].getNEntries();
567 for (
unsigned int iTrack = rofIndexTrack; iTrack < rofIndexTrack + rofNEntriesTrack; iTrack++) {
568 auto track = mTracks[iTrack];
570 int firstClus = track.getFirstClusterEntry();
571 int ncl = track.getNumberOfClusters();
578 track.getImpactParams(0, 0, 0, 0, ip);
582 auto& tracklab = mTracksMCLabels[iTrack];
583 if (tracklab.isFake()) {
587 auto pt = trackParCov.getPt();
588 auto eta = trackParCov.getEta();
590 float phiTrack = trackParCov.getPhi() * 180 / M_PI;
599 float phioriginal = 0;
600 float phiduplicated = 0;
602 for (
int iclTrack = firstClus; iclTrack < firstClus + ncl; iclTrack++) {
603 auto& clusOriginal = mClusters[mInputITSidxs[iclTrack]];
604 auto clusOriginalPoint = mITSClustersArray[mInputITSidxs[iclTrack]];
605 auto staveOriginal = mGeometry->
getStave(clusOriginal.getSensorID());
606 auto chipOriginal = mGeometry->
getChipIdInStave(clusOriginal.getSensorID());
608 UShort_t rowOriginal = clusOriginal.getRow();
609 UShort_t colOriginal = clusOriginal.getCol();
611 auto layer = mGeometry->
getLayer(clusOriginal.getSensorID());
615 auto labsTrack = mClustersMCLCont->
getLabels(mInputITSidxs[iclTrack]);
620 phioriginal = clusOriginalPointGlob.phi() * 180 / M_PI;
621 mPhiTrackoriginalvsphioriginal[
layer]->Fill(phiTrack, phioriginal);
623 mPhiOriginal[
layer]->Fill(phioriginal);
624 mPtOriginal[
layer]->Fill(pt);
625 mEtaOriginal[
layer]->Fill(eta);
626 m3DClusterPositions->Fill(clusOriginalPointGlob.x(), clusOriginalPointGlob.y(), clusOriginalPointGlob.z());
627 m2DClusterOriginalPositions->Fill(clusOriginalPointGlob.x(), clusOriginalPointGlob.y());
629 for (
auto& labT : labsTrack) {
630 if (labT != tracklab) {
634 if (labT.isValid()) {
635 for (
unsigned int iClus = rofIndexClus; iClus < rofIndexClus + rofNEntriesClus; iClus++) {
637 auto clusDuplicated = mClusters[iClus];
638 auto clusDuplicatedPoint = mITSClustersArray[iClus];
640 auto layerClus = mGeometry->
getLayer(clusDuplicated.getSensorID());
641 if (layerClus !=
layer) {
648 phiduplicated = clusDuplicatedPointGlob.phi() * 180 / M_PI;
650 auto labsClus = mClustersMCLCont->
getLabels(iClus);
651 for (
auto labC : labsClus) {
653 label_vecClus[iROF][layerClus][labT].push_back(iClus);
659 if (clusDuplicated.getSensorID() == clusOriginal.getSensorID()) {
662 auto layerDuplicated = mGeometry->
getLayer(clusDuplicated.getSensorID());
663 if (layerDuplicated != layerClus) {
666 auto staveDuplicated = mGeometry->
getStave(clusDuplicated.getSensorID());
667 if (abs(staveDuplicated - staveOriginal) != 1) {
670 auto chipDuplicated = mGeometry->
getChipIdInStave(clusDuplicated.getSensorID());
671 if (abs(chipDuplicated - chipOriginal) > 1) {
677 if (countDuplicated == 0) {
678 UShort_t rowDuplicated = clusDuplicated.getRow();
679 UShort_t colDuplicated = clusDuplicated.getCol();
681 chipRowDuplicated[layerDuplicated]->Fill(rowDuplicated);
682 chipRowOriginalIfDuplicated[layerDuplicated]->Fill(rowOriginal);
684 mDuplicated_layer[layerDuplicated]++;
685 mPtDuplicated[layerClus]->Fill(pt);
686 mEtaDuplicated[layerClus]->Fill(eta);
687 mPhiDuplicated[layerClus]->Fill(phiduplicated);
688 mZvsPhiDUplicated[layerClus]->Fill(clusDuplicatedPointGlob.Z(), phiduplicated);
689 mPhiTrackDuplicated[layerClus]->Fill(phiTrack);
690 mPhiTrackDuplicatedvsphiDuplicated[layerClus]->Fill(phiTrack, phioriginal);
691 mPhiOriginalIfDuplicated[layerClus]->Fill(phioriginal);
694 if (countDuplicated == 1) {
695 for (
int ipt = 0; ipt < 3; ipt++) {
696 if (pt >= mrangesPt[ipt][0] && pt < mrangesPt[ipt][1]) {
697 mDuplicatedEta[layerDuplicated][ipt]->Fill(eta);
698 mDuplicatedPhi[layerDuplicated][ipt]->Fill(phiduplicated);
701 UShort_t rowDuplicated = clusDuplicated.getRow();
702 mDuplicatedRow[layerDuplicated]->Fill(rowOriginal);
703 mDuplicatedPt[layerDuplicated]->Fill(pt);
704 mDuplicatedPtEta[layerDuplicated]->Fill(pt, eta);
705 mDuplicatedPtPhi[layerDuplicated]->Fill(pt, phiduplicated);
706 mDuplicatedEtaPhi[layerDuplicated]->Fill(eta, phiduplicated);
708 mDuplicatedEtaAllPt[layerDuplicated]->Fill(eta);
709 mDuplicatedPhiAllPt[layerDuplicated]->Fill(phiduplicated);
710 mPt_EtaDupl[layerClus]->Fill(pt, eta);
713 m3DClusterPositions->Fill(clusDuplicatedPointGlob.x(), clusDuplicatedPointGlob.y(), clusDuplicatedPointGlob.z());
714 m2DClusterDuplicatedPositions->Fill(clusDuplicatedPointGlob.x(), clusDuplicatedPointGlob.y());
717 mDistanceClustersX[layerClus]->Fill(abs(clusOriginalPointGlob.x() - clusDuplicatedPointGlob.x()));
718 mDistanceClustersY[layerClus]->Fill(abs(clusOriginalPointGlob.y() - clusDuplicatedPointGlob.y()));
719 mDistanceClustersZ[layerClus]->Fill(abs(clusOriginalPointGlob.z() - clusDuplicatedPointGlob.z()));
720 mDistanceClusters[layerClus]->Fill(std::hypot(clusOriginalPointGlob.x() - clusDuplicatedPointGlob.x(), clusOriginalPointGlob.y() - clusDuplicatedPointGlob.y(), clusOriginalPointGlob.z() - clusDuplicatedPointGlob.z()));
727 if (propagator->propagateToDCA(clusOriginalPointGlob, trackParCov,
b, 2.f, matCorr, &clusOriginalDCA)) {
728 mDCAxyOriginal[layerClus]->Fill(clusOriginalDCA[0]);
729 mDCAzOriginal[layerClus]->Fill(clusOriginalDCA[1]);
733 if (propagator->propagateToDCA(clusDuplicatedPointGlob, trackParCov,
b, 2.f, matCorr, &clusDuplicatedDCA)) {
734 mDCAxyDuplicated->Fill(clusDuplicatedDCA[0]);
735 mDCAzDuplicated->Fill(clusDuplicatedDCA[1]);
736 mDCAxyDuplicated_layer[layerDuplicated]->Fill(clusDuplicatedDCA[0]);
737 mDCAzDuplicated_layer[layerDuplicated]->Fill(clusDuplicatedDCA[1]);
749 LOGP(info,
"Total number of clusters: {} ", totClus);
750 LOGP(info,
"total nLabels: {}", nLabels);
751 LOGP(info,
"Number of duplicated clusters: {}", duplicated);
753 if (mVerboseOutput && mUseMC) {
755 for (
unsigned int iROF = 0; iROF < mClustersROFRecords.size(); iROF++) {
756 LOGP(info,
"°°°°°°°°°°°°°°°°°°°°°°°° ROF {} °°°°°°°°°°°°°°°°°°°°°°°°", iROF);
757 for (
unsigned int lay = 0; lay <
NLAYERS; lay++) {
758 LOGP(info,
"°°°°°°°°°°°°°°°°°°°°°°°° LAYER {} °°°°°°°°°°°°°°°°°°°°°°°°", lay);
759 for (
auto& it : label_vecClus[iROF][lay]) {
760 if (it.second.size() <= 1) {
763 std::cout <<
" \n++++++++++++ Label: ";
764 auto label = it.first;
766 for (
auto iClus : it.second) {
768 auto chipid = mClusters[iClus].getChipID();
769 auto clus = mClusters[iClus];
770 auto clusPoint = mITSClustersArray[iClus];
774 std::cout <<
"ROF: " << iROF <<
", iClus: " << iClus <<
" -> chip: " << chipid <<
" = " <<
name << std::endl;
775 LOGP(info,
"LOCtrack: {} {} {}", clusPointTrack.x(), clusPointTrack.y(), clusPointTrack.z());
776 LOGP(info,
"LOCglob {} {} {}", clusPointGlob.x(), clusPointGlob.y(), clusPointGlob.z());
968 LOGP(info,
"--------------- studyDCAcutsMC");
972 double meanDCAxyDuplicated[
NLAYERS] = {0};
973 double meanDCAzDuplicated[
NLAYERS] = {0};
974 double sigmaDCAxyDuplicated[
NLAYERS] = {0};
975 double sigmaDCAzDuplicated[
NLAYERS] = {0};
977 std::ofstream ofs(
"dcaValues.csv", std::ofstream::out);
978 ofs <<
"layer,dcaXY,dcaZ,sigmaDcaXY,sigmaDcaZ" << std::endl;
980 for (
int l = 0; l <
NLAYERS; l++) {
981 meanDCAxyDuplicated[l] = mDCAxyDuplicated_layer[l]->GetMean();
982 meanDCAzDuplicated[l] = mDCAzDuplicated_layer[l]->GetMean();
983 sigmaDCAxyDuplicated[l] = mDCAxyDuplicated_layer[l]->GetRMS();
984 sigmaDCAzDuplicated[l] = mDCAzDuplicated_layer[l]->GetRMS();
985 ofs << l <<
"," << meanDCAxyDuplicated[l] <<
"," << meanDCAzDuplicated[l] <<
"," << sigmaDCAxyDuplicated[l] <<
"," << sigmaDCAzDuplicated[l] << std::endl;
988 for (
int l = 0; l <
NLAYERS; l++) {
989 LOGP(info,
"meanDCAxyDuplicated L{}: {}, meanDCAzDuplicated: {}, sigmaDCAxyDuplicated: {}, sigmaDCAzDuplicated: {}", l, meanDCAxyDuplicated[l], meanDCAzDuplicated[l], sigmaDCAxyDuplicated[l], sigmaDCAzDuplicated[l]);
1001 unsigned int rofIndexTrack = 0;
1002 unsigned int rofNEntriesTrack = 0;
1003 unsigned int rofIndexClus = 0;
1004 unsigned int rofNEntriesClus = 0;
1006 unsigned int totClus = 0;
1008 unsigned int nDCAMatches[20] = {0};
1009 unsigned int nGoodMatches[20] = {0};
1010 unsigned int nFakeMatches[20] = {0};
1012 unsigned int nGoodMatches_layer[
NLAYERS][20] = {0};
1013 unsigned int nFakeMatches_layer[
NLAYERS][20] = {0};
1016 double xbins[nbPt + 1], ptcutl = 0.05, ptcuth = 7.5;
1017 double a = std::log(ptcuth / ptcutl) / nbPt;
1018 for (
int i = 0;
i <= nbPt;
i++) {
1019 xbins[
i] = ptcutl * std::exp(
i *
a);
1022 for (
unsigned int iROF = 0; iROF < mTracksROFRecords.size(); iROF++) {
1023 rofIndexTrack = mTracksROFRecords[iROF].getFirstEntry();
1024 rofNEntriesTrack = mTracksROFRecords[iROF].getNEntries();
1026 rofIndexClus = mClustersROFRecords[iROF].getFirstEntry();
1027 rofNEntriesClus = mClustersROFRecords[iROF].getNEntries();
1029 for (
unsigned int iTrack = rofIndexTrack; iTrack < rofIndexTrack + rofNEntriesTrack; iTrack++) {
1030 auto track = mTracks[iTrack];
1032 auto pt = trackParCov.getPt();
1033 auto eta = trackParCov.getEta();
1036 track.getImpactParams(0, 0, 0, 0, ip);
1045 float phiTrack = trackParCov.getPhi() * 180 / M_PI;
1048 float phiOriginal = -999.;
1049 int firstClus = track.getFirstClusterEntry();
1050 int ncl = track.getNumberOfClusters();
1056 auto& tracklab = mTracksMCLabels[iTrack];
1057 if (tracklab.isFake()) {
1061 if (mVerboseOutput) {
1062 LOGP(info,
"--------- track Label: ");
1066 for (
int iclTrack = firstClus; iclTrack < firstClus + ncl; iclTrack++) {
1067 auto& clusOriginal = mClusters[mInputITSidxs[iclTrack]];
1068 auto clusOriginalPoint = mITSClustersArray[mInputITSidxs[iclTrack]];
1069 auto layerOriginal = mGeometry->
getLayer(clusOriginal.getSensorID());
1070 if (layerOriginal >=
NLAYERS) {
1073 auto labsOriginal = mClustersMCLCont->
getLabels(mInputITSidxs[iclTrack]);
1074 auto staveOriginal = mGeometry->
getStave(clusOriginal.getSensorID());
1075 auto chipOriginal = mGeometry->
getChipIdInStave(clusOriginal.getSensorID());
1080 phiOriginal = clusOriginalPointGlob.phi() * 180 / M_PI;
1082 for (
auto& labT : labsOriginal) {
1083 if (labT != tracklab) {
1086 if (!labT.isValid()) {
1091 for (
unsigned int iClus = rofIndexClus; iClus < rofIndexClus + rofNEntriesClus; iClus++) {
1092 auto clusDuplicated = mClusters[iClus];
1094 if (clusDuplicated.getSensorID() == clusOriginal.getSensorID()) {
1097 auto layerDuplicated = mGeometry->
getLayer(clusDuplicated.getSensorID());
1098 if (layerDuplicated != layerOriginal) {
1101 auto staveDuplicated = mGeometry->
getStave(clusDuplicated.getSensorID());
1102 if (abs(staveDuplicated - staveOriginal) != 1) {
1105 auto chipDuplicated = mGeometry->
getChipIdInStave(clusDuplicated.getSensorID());
1106 if (abs(chipDuplicated - chipOriginal) > 1) {
1110 auto labsDuplicated = mClustersMCLCont->
getLabels(iClus);
1113 auto clusDuplicatedPoint = mITSClustersArray[iClus];
1117 phi = clusDuplicatedPointGlob.phi() * 180 / M_PI;
1121 if (propagator->propagateToDCA(clusDuplicatedPointGlob, trackParCov,
b, 2.f, matCorr, &clusDuplicatedDCA)) {
1122 if (mVerboseOutput) {
1123 LOGP(info,
"Propagation ok");
1126 for (
int i = 0;
i < 20;
i++) {
1127 if (abs(
dcaXY[layerDuplicated] - clusDuplicatedDCA[0]) < (
i + 1) *
sigmaDcaXY[layerDuplicated] && abs(
dcaZ[layerDuplicated] - clusDuplicatedDCA[1]) < (
i + 1) *
sigmaDcaZ[layerDuplicated]) {
1129 if (mVerboseOutput) {
1130 LOGP(info,
"Check DCA ok: {} < {}; {} < {}", abs(meanDCAxyDuplicated[layerDuplicated] - clusDuplicatedDCA[0]), (
i + 1) * sigmaDCAxyDuplicated[layerDuplicated], abs(meanDCAzDuplicated[layerDuplicated] - clusDuplicatedDCA[1]), (
i + 1) * sigmaDCAzDuplicated[layerDuplicated]);
1133 bool isGoodMatch =
false;
1135 for (
auto labD : labsDuplicated) {
1136 if (mVerboseOutput) {
1137 LOGP(info,
"tracklab, labD:");
1141 if (labD == tracklab) {
1149 nGoodMatches_layer[layerDuplicated][
i]++;
1150 mnGoodMatchesPt_layer[layerDuplicated]->Fill(pt,
i);
1151 mnGoodMatchesEta_layer[layerDuplicated]->Fill(eta,
i);
1152 mnGoodMatchesPhi_layer[layerDuplicated]->Fill(phi,
i);
1153 mnGoodMatchesPhiTrack_layer[layerDuplicated]->Fill(phiTrack,
i);
1154 mnGoodMatchesPhiOriginal_layer[layerDuplicated]->Fill(phiOriginal,
i);
1158 nFakeMatches_layer[layerDuplicated][
i]++;
1159 mnFakeMatchesPt_layer[layerDuplicated]->Fill(pt,
i);
1160 mnFakeMatchesEta_layer[layerDuplicated]->Fill(eta,
i);
1161 mnFakeMatchesPhi_layer[layerDuplicated]->Fill(phi,
i);
1162 mnFakeMatchesPhiTrack_layer[layerDuplicated]->Fill(phiTrack,
i);
1164 }
else if (mVerboseOutput) {
1165 LOGP(info,
"Check DCA failed");
1168 }
else if (mVerboseOutput) {
1169 LOGP(info,
"Propagation failed");
1177 for (
int i = 0;
i < 20;
i++) {
1178 LOGP(info,
"Cut: {} sigma -> number of duplicated clusters: {} nDCAMatches: {} nGoodMatches: {} nFakeMatches: {}",
i + 1, duplicated, nDCAMatches[
i], nGoodMatches[
i], nFakeMatches[
i]);
1179 mEfficiencyGoodMatch->SetBinContent(
i + 1, nGoodMatches[
i]);
1180 mEfficiencyFakeMatch->SetBinContent(
i + 1, nFakeMatches[
i]);
1181 mEfficiencyTotal->SetBinContent(
i + 1,
double(nGoodMatches[
i] + nFakeMatches[
i]));
1183 for (
int l = 0; l <
NLAYERS; l++) {
1184 mEfficiencyGoodMatch_layer[l]->SetBinContent(
i + 1, nGoodMatches_layer[l][
i]);
1185 mEfficiencyFakeMatch_layer[l]->SetBinContent(
i + 1, nFakeMatches_layer[l][
i]);
1186 mEfficiencyTotal_layer[l]->SetBinContent(
i + 1,
double(nGoodMatches_layer[l][
i] + nFakeMatches_layer[l][
i]));
1188 for (
int ipt = 0; ipt < mPtDuplicated[l]->GetNbinsX(); ipt++) {
1189 if (mPtDuplicated[l]->GetBinContent(ipt + 1) != 0) {
1190 mEfficiencyGoodMatchPt_layer[l]->SetBinContent(ipt + 1,
i + 1, mnGoodMatchesPt_layer[l]->GetBinContent(ipt + 1,
i + 1) / mPtDuplicated[l]->GetBinContent(ipt + 1));
1192 mEfficiencyFakeMatchPt_layer[l]->SetBinContent(ipt + 1,
i + 1, mnFakeMatchesPt_layer[l]->GetBinContent(ipt + 1,
i + 1) / mPtDuplicated[l]->GetBinContent(ipt + 1));
1195 for (
int ieta = 0; ieta < mEtaDuplicated[l]->GetNbinsX(); ieta++) {
1196 if (mEtaDuplicated[l]->GetBinContent(ieta + 1) != 0) {
1197 mEfficiencyGoodMatchEta_layer[l]->SetBinContent(ieta + 1,
i + 1, mnGoodMatchesEta_layer[l]->GetBinContent(ieta + 1,
i + 1) / mEtaDuplicated[l]->GetBinContent(ieta + 1));
1199 mEfficiencyFakeMatchEta_layer[l]->SetBinContent(ieta + 1,
i + 1, mnFakeMatchesEta_layer[l]->GetBinContent(ieta + 1,
i + 1) / mEtaDuplicated[l]->GetBinContent(ieta + 1));
1202 for (
int iphi = 0; iphi < mPhiDuplicated[l]->GetNbinsX(); iphi++) {
1203 if (mPhiDuplicated[l]->GetBinContent(iphi + 1) != 0) {
1204 mEfficiencyGoodMatchPhi_layer[l]->SetBinContent(iphi + 1,
i + 1, mnGoodMatchesPhi_layer[l]->GetBinContent(iphi + 1,
i + 1) / mPhiDuplicated[l]->GetBinContent(iphi + 1));
1206 mEfficiencyFakeMatchPhi_layer[l]->SetBinContent(iphi + 1,
i + 1, mnFakeMatchesPhi_layer[l]->GetBinContent(iphi + 1,
i + 1) / mPhiDuplicated[l]->GetBinContent(iphi + 1));
1209 for (
int iphi = 0; iphi < mPhiOriginalIfDuplicated[l]->GetNbinsX(); iphi++) {
1210 if (mPhiOriginalIfDuplicated[l]->GetBinContent(iphi + 1) != 0) {
1211 mEfficiencyGoodMatchPhiOriginal_layer[l]->SetBinContent(iphi + 1,
i + 1, mnGoodMatchesPhiOriginal_layer[l]->GetBinContent(iphi + 1,
i + 1) / mPhiOriginalIfDuplicated[l]->GetBinContent(iphi + 1));
1215 for (
int iphi = 0; iphi < mPhiTrackDuplicated[l]->GetNbinsX(); iphi++) {
1216 if (mPhiTrackDuplicated[l]->GetBinContent(iphi + 1) != 0) {
1217 mEfficiencyGoodMatchPhiTrack_layer[l]->SetBinContent(iphi + 1,
i + 1, mnGoodMatchesPhiTrack_layer[l]->GetBinContent(iphi + 1,
i + 1) / mPhiTrackDuplicated[l]->GetBinContent(iphi + 1));
1219 mEfficiencyFakeMatchPhiTrack_layer[l]->SetBinContent(iphi + 1,
i + 1, mnFakeMatchesPhiTrack_layer[l]->GetBinContent(iphi + 1,
i + 1) / mPhiTrackDuplicated[l]->GetBinContent(iphi + 1));
1224 std::cout <<
"+++++++++ Duplicated in layer L" <<
i <<
": " << mDuplicated_layer[
i] << std::endl;
1227 for (
int l = 0; l <
NLAYERS; l++) {
1228 mEfficiencyGoodMatch_layer[l]->Scale(1. /
double(mDuplicated_layer[l]),
"b");
1229 mEfficiencyFakeMatch_layer[l]->Scale(1. /
double(mDuplicated_layer[l]),
"b");
1230 mEfficiencyTotal_layer[l]->Scale(1. /
double(mDuplicated_layer[l]),
"b");
1233 mEfficiencyGoodMatch->Scale(1. /
double(duplicated),
"b");
1234 mEfficiencyFakeMatch->Scale(1. /
double(duplicated),
"b");
1235 mEfficiencyTotal->Scale(1. /
double(duplicated),
"b");
1237 mOutFile->mkdir(
"EffVsDCA2D/");
1238 mOutFile->cd(
"EffVsDCA2D/");
1239 for (
int l = 0; l <
NLAYERS; l++) {
1240 mEfficiencyGoodMatchPt_layer[l]->GetZaxis()->SetRangeUser(0, 1);
1241 mEfficiencyGoodMatchPt_layer[l]->Write();
1242 mEfficiencyGoodMatchEta_layer[l]->GetZaxis()->SetRangeUser(0, 1);
1243 mEfficiencyGoodMatchEta_layer[l]->Write();
1244 mEfficiencyGoodMatchPhi_layer[l]->GetZaxis()->SetRangeUser(0, 1);
1245 mEfficiencyGoodMatchPhi_layer[l]->Write();
1246 mEfficiencyGoodMatchPhiTrack_layer[l]->GetZaxis()->SetRangeUser(0, 1);
1247 mEfficiencyGoodMatchPhiTrack_layer[l]->Write();
1248 mEfficiencyGoodMatchPhiOriginal_layer[l]->GetZaxis()->SetRangeUser(0, 1);
1249 mEfficiencyGoodMatchPhiOriginal_layer[l]->Write();
1250 mEfficiencyFakeMatchPt_layer[l]->GetZaxis()->SetRangeUser(0, 1);
1251 mEfficiencyFakeMatchPt_layer[l]->Write();
1252 mEfficiencyFakeMatchEta_layer[l]->GetZaxis()->SetRangeUser(0, 1);
1253 mEfficiencyFakeMatchEta_layer[l]->Write();
1254 mEfficiencyFakeMatchPhi_layer[l]->GetZaxis()->SetRangeUser(0, 1);
1255 mEfficiencyFakeMatchPhi_layer[l]->Write();
1256 mEfficiencyFakeMatchPhiTrack_layer[l]->GetZaxis()->SetRangeUser(0, 1);
1257 mEfficiencyFakeMatchPhiTrack_layer[l]->Write();
1260 mOutFile->mkdir(
"Efficiency/");
1261 mOutFile->cd(
"Efficiency/");
1262 mEfficiencyGoodMatch->Write();
1263 mEfficiencyFakeMatch->Write();
1264 mEfficiencyTotal->Write();
1265 for (
int l = 0; l <
NLAYERS; l++) {
1267 mEfficiencyGoodMatch_layer[l]->Write();
1268 mEfficiencyFakeMatch_layer[l]->Write();
1269 mEfficiencyTotal_layer[l]->Write();
1271 mEfficiencyGoodMatch_layer[l]->GetYaxis()->SetRangeUser(-0.1, 1.1);
1272 mEfficiencyFakeMatch_layer[l]->GetYaxis()->SetRangeUser(-0.1, 1.1);
1273 mEfficiencyTotal_layer[l]->GetYaxis()->SetRangeUser(-0.1, 1.1);
1276 mEfficiencyGoodMatch->GetYaxis()->SetRangeUser(-0.1, 1.1);
1277 mEfficiencyFakeMatch->GetYaxis()->SetRangeUser(-0.1, 1.1);
1278 mEfficiencyTotal->GetYaxis()->SetRangeUser(-0.1, 1.1);
1281 c.SetName(
"EffVsDCA_allLayers");
1282 auto leg = std::make_unique<TLegend>(0.75, 0.45, 0.89, 0.65);
1283 leg->AddEntry(mEfficiencyGoodMatch.get(),
"#frac{# good matches}{# tot duplicated clusters}",
"p");
1284 leg->AddEntry(mEfficiencyFakeMatch.get(),
"#frac{# fake matches}{# tot duplicated clusters}",
"p");
1285 leg->AddEntry(mEfficiencyTotal.get(),
"#frac{# tot matches}{# tot duplicated clusters}",
"p");
1287 mEfficiencyGoodMatch->Draw(
"P l E1_NOSTAT PLC PMC ");
1288 mEfficiencyFakeMatch->Draw(
"same P l E1_NOSTAT PLC PMC");
1289 mEfficiencyTotal->Draw(
"same P l E1_NOSTAT PLC PMC");
1292 c.SaveAs(
"prova.png");
1295 for (
int l = 0; l <
NLAYERS; l++) {
1297 cc[l].SetName(Form(
"EffVsDCA_layer_L%d", l));
1299 auto leg = std::make_unique<TLegend>(0.75, 0.45, 0.89, 0.65);
1300 leg->AddEntry(mEfficiencyGoodMatch_layer[l].
get(),
"#frac{# good matches}{# tot duplicated clusters}",
"p");
1301 leg->AddEntry(mEfficiencyFakeMatch_layer[l].
get(),
"#frac{# fake matches}{# tot duplicated clusters}",
"p");
1302 leg->AddEntry(mEfficiencyTotal_layer[l].
get(),
"#frac{# tot matches}{# tot duplicated clusters}",
"p");
1304 mEfficiencyGoodMatch_layer[l]->SetLineColor(kBlue + 3);
1305 mEfficiencyGoodMatch_layer[l]->SetMarkerColor(kBlue + 3);
1306 mEfficiencyGoodMatch_layer[l]->Draw(
"P l E1_NOSTAT");
1307 mEfficiencyFakeMatch_layer[l]->SetLineColor(kAzure + 7);
1308 mEfficiencyFakeMatch_layer[l]->SetMarkerColor(kAzure + 7);
1309 mEfficiencyFakeMatch_layer[l]->Draw(
"same P l E1_NOSTAT");
1310 mEfficiencyTotal_layer[l]->SetLineColor(kGreen + 1);
1311 mEfficiencyTotal_layer[l]->SetMarkerColor(kGreen + 1);
1312 mEfficiencyTotal_layer[l]->Draw(
"same P l E1_NOSTAT");
1315 cc[l].SaveAs(Form(
"provaLayer%d.png", l));
1325 LOGP(info,
"--------------- studyClusterSelection");
1329 std::cout <<
"duplicated: " << duplicated << std::endl;
1331 double meanDCAxyDuplicated[
NLAYERS] = {0};
1332 double meanDCAzDuplicated[
NLAYERS] = {0};
1333 double sigmaDCAxyDuplicated[
NLAYERS] = {0};
1334 double sigmaDCAzDuplicated[
NLAYERS] = {0};
1336 for (
int l = 0; l <
NLAYERS; l++) {
1337 meanDCAxyDuplicated[l] = mDCAxyDuplicated_layer[l]->GetMean();
1338 meanDCAzDuplicated[l] = mDCAzDuplicated_layer[l]->GetMean();
1339 sigmaDCAxyDuplicated[l] = mDCAxyDuplicated_layer[l]->GetRMS();
1340 sigmaDCAzDuplicated[l] = mDCAzDuplicated_layer[l]->GetRMS();
1343 for (
int l = 0; l <
NLAYERS; l++) {
1344 LOGP(info,
"meanDCAxyDuplicated L{}: {}, meanDCAzDuplicated: {}, sigmaDCAxyDuplicated: {}, sigmaDCAzDuplicated: {}", l, meanDCAxyDuplicated[l], meanDCAzDuplicated[l], sigmaDCAxyDuplicated[l], sigmaDCAzDuplicated[l]);
1351 unsigned int rofIndexTrack = 0;
1352 unsigned int rofNEntriesTrack = 0;
1353 unsigned int rofIndexClus = 0;
1354 unsigned int rofNEntriesClus = 0;
1356 unsigned int totClus = 0;
1358 unsigned int nDCAMatches[15] = {0};
1359 unsigned int nGoodMatches[15] = {0};
1360 unsigned int nFakeMatches[15] = {0};
1362 std::map<std::tuple<int, double, o2::MCCompLabel>,
bool> clusterMatchesPtEta[100][100] = {};
1364 for (
unsigned int iROF = 0; iROF < mTracksROFRecords.size(); iROF++) {
1365 rofIndexTrack = mTracksROFRecords[iROF].getFirstEntry();
1366 rofNEntriesTrack = mTracksROFRecords[iROF].getNEntries();
1368 rofIndexClus = mClustersROFRecords[iROF].getFirstEntry();
1369 rofNEntriesClus = mClustersROFRecords[iROF].getNEntries();
1372 for (
unsigned int iTrack = rofIndexTrack; iTrack < rofIndexTrack + rofNEntriesTrack; iTrack++) {
1373 auto track = mTracks[iTrack];
1378 track.getImpactParams(0, 0, 0, 0, ip);
1380 int firstClus = track.getFirstClusterEntry();
1381 int ncl = track.getNumberOfClusters();
1387 auto& tracklab = mTracksMCLabels[iTrack];
1388 if (tracklab.isFake()) {
1392 auto pt = trackParCov.getPt();
1393 auto eta = trackParCov.getEta();
1404 float phiOriginal = -999.;
1405 float phiDuplicated = -999.;
1406 UShort_t
row = -999;
1408 if (mVerboseOutput) {
1409 LOGP(info,
"--------- track Label: ");
1412 for (
int iclTrack = firstClus; iclTrack < firstClus + ncl; iclTrack++) {
1414 auto& clusOriginal = mClusters[mInputITSidxs[iclTrack]];
1415 auto layerOriginal = mGeometry->
getLayer(clusOriginal.getSensorID());
1416 if (layerOriginal >=
NLAYERS) {
1420 IPOriginalxy[layerOriginal]->Fill(ip[0]);
1421 IPOriginalz[layerOriginal]->Fill(ip[1]);
1423 UShort_t rowOriginal = clusOriginal.getRow();
1425 auto clusOriginalPoint = mITSClustersArray[mInputITSidxs[iclTrack]];
1429 auto phiOriginal = clusOriginalPointGlob.phi() * 180 / M_PI;
1431 auto labsOriginal = mClustersMCLCont->
getLabels(mInputITSidxs[iclTrack]);
1432 auto staveOriginal = mGeometry->
getStave(clusOriginal.getSensorID());
1433 auto chipOriginal = mGeometry->
getChipIdInStave(clusOriginal.getSensorID());
1435 std::tuple<int, double, gsl::span<const o2::MCCompLabel>> clusID_rDCA_label = {0, 999., gsl::span<const o2::MCCompLabel>()};
1437 bool adjacentFound = 0;
1439 for (
unsigned int iClus = rofIndexClus; iClus < rofIndexClus + rofNEntriesClus; iClus++) {
1440 auto clusDuplicated = mClusters[iClus];
1443 if (clusDuplicated.getSensorID() == clusOriginal.getSensorID()) {
1446 auto layerDuplicated = mGeometry->
getLayer(clusDuplicated.getSensorID());
1447 if (layerDuplicated != layerOriginal) {
1450 auto staveDuplicated = mGeometry->
getStave(clusDuplicated.getSensorID());
1451 if (abs(staveDuplicated - staveOriginal) != 1) {
1454 auto chipDuplicated = mGeometry->
getChipIdInStave(clusDuplicated.getSensorID());
1455 if (abs(chipDuplicated - chipOriginal) > 1) {
1459 auto labsDuplicated = mClustersMCLCont->
getLabels(iClus);
1462 auto clusDuplicatedPoint = mITSClustersArray[iClus];
1467 auto phiDuplicated = clusDuplicatedPointGlob.phi() * 180 / M_PI;
1471 if (!propagator->propagateToDCA(clusDuplicatedPointGlob, trackParCov,
b, 2.f, matCorr, &clusDuplicatedDCA)) {
1476 if (!(abs(meanDCAxyDuplicated[layerDuplicated] - clusDuplicatedDCA[0]) < 8 * sigmaDCAxyDuplicated[layerDuplicated] && abs(meanDCAzDuplicated[layerDuplicated] - clusDuplicatedDCA[1]) < 8 * sigmaDCAzDuplicated[layerDuplicated])) {
1480 if (mVerboseOutput) {
1481 LOGP(info,
"Propagation ok");
1483 double rDCA = std::hypot(clusDuplicatedDCA[0], clusDuplicatedDCA[1]);
1486 if (rDCA < std::get<1>(clusID_rDCA_label)) {
1487 clusID_rDCA_label = {iClus, rDCA, labsDuplicated};
1488 phi = phiDuplicated;
1498 if (!adjacentFound) {
1502 bool isGood =
false;
1503 for (
auto lab : std::get<2>(clusID_rDCA_label)) {
1504 if (lab == tracklab) {
1506 diffPhivsPt[layerOriginal]->Fill(pt, abs(phi - phiOriginal));
1507 IPOriginalifDuplicatedxy[layerOriginal]->Fill(ip[0]);
1508 IPOriginalifDuplicatedz[layerOriginal]->Fill(ip[1]);
1510 mNGoodMatchesPt[layerOriginal]->Fill(pt);
1511 mNGoodMatchesRow[layerOriginal]->Fill(
row);
1512 mNGoodMatchesPtEta[layerOriginal]->Fill(pt, eta);
1513 mNGoodMatchesPtPhi[layerOriginal]->Fill(pt, phi);
1514 mNGoodMatchesEtaPhi[layerOriginal]->Fill(eta, phi);
1516 mNGoodMatchesEtaAllPt[layerOriginal]->Fill(eta);
1517 mNGoodMatchesPhiAllPt[layerOriginal]->Fill(phi);
1518 for (
int ipt = 0; ipt < 3; ipt++) {
1519 if (pt >= mrangesPt[ipt][0] && pt < mrangesPt[ipt][1]) {
1520 mNGoodMatchesEta[layerOriginal][ipt]->Fill(eta);
1521 mNGoodMatchesPhi[layerOriginal][ipt]->Fill(phi);
1530 mNFakeMatchesPt[layerOriginal]->Fill(pt);
1531 mNFakeMatchesRow[layerOriginal]->Fill(
row);
1532 mNFakeMatchesPtEta[layerOriginal]->Fill(pt, eta);
1533 mNFakeMatchesPtPhi[layerOriginal]->Fill(pt, phi);
1534 mNFakeMatchesEtaPhi[layerOriginal]->Fill(eta, phi);
1535 mNFakeMatchesEtaAllPt[layerOriginal]->Fill(eta);
1536 mNFakeMatchesPhiAllPt[layerOriginal]->Fill(phi);
1538 for (
int ipt = 0; ipt < 3; ipt++) {
1539 if (pt >= mrangesPt[ipt][0] && pt < mrangesPt[ipt][1]) {
1540 mNFakeMatchesEta[layerOriginal][ipt]->Fill(eta);
1541 mNFakeMatchesPhi[layerOriginal][ipt]->Fill(phi);
1549 mOutFile->mkdir(
"EfficiencyCuts/");
1550 mOutFile->cd(
"EfficiencyCuts/");
1552 std::cout <<
"------Calculatin efficiency..." << std::endl;
1553 TH1D* axpt =
new TH1D(
"axpt",
"", 1, 0.05, 7.5);
1554 TH1D* axRow =
new TH1D(
"axRow",
"", 1, -0.5, 511.5);
1555 TH2D* axptetaGood =
new TH2D(
"axptetaGood",
"", 1, 0.05, 7.5, 1, -2, 2);
1556 TH2D* axptetaFake =
new TH2D(
"axptetaFake",
"", 1, 0.05, 7.5, 1, -2, 2);
1557 TH2D* axptphiGood =
new TH2D(
"axptphiGood",
"", 1, 0.05, 7.5, 1, -180, 180);
1558 TH2D* axptphiFake =
new TH2D(
"axptphiFake",
"", 1, 0.05, 7.5, 1, -180, 180);
1559 TH2D* axetaphiGood =
new TH2D(
"axetaphiGood",
"", 1, -2, 2, 1, -180, 180);
1560 TH2D* axetaphiFake =
new TH2D(
"axetaphiFake",
"", 1, -2, 2, 1, -180, 180);
1561 TH1D* axetaAllPt =
new TH1D(
"axetaAllPt",
"", 1, -2, 2);
1564 for (
int ipt = 0; ipt < 3; ipt++) {
1565 axeta[ipt] =
new TH1D(Form(
"axeta%d", ipt), Form(
"axeta%d", ipt), 1, -2, 2);
1566 axphi[ipt] =
new TH1D(Form(
"axphi%d", ipt), Form(
"axphi%d", ipt), 1, -180, 180);
1568 TH1D* axphiAllPt =
new TH1D(
"axphi",
"", 1, -180, 180);
1572 TCanvas* effPtEta[
NLAYERS][2];
1573 TCanvas* effPtPhi[
NLAYERS][2];
1574 TCanvas* effEtaPhi[
NLAYERS][2];
1575 TCanvas* effEtaAllPt[
NLAYERS];
1577 TCanvas* effPhiAllPt[
NLAYERS];
1581 for (
int l = 0; l < 3; l++) {
1582 if (mVerboseOutput) {
1583 std::cout <<
"Pt L" << l <<
"\n\n";
1586 diffPhivsPt[l]->Write();
1587 IPOriginalifDuplicatedxy[l]->Write();
1588 IPOriginalifDuplicatedz[l]->Write();
1591 effPt[l] =
new TCanvas(Form(
"effPt_L%d", l));
1593 mEffPtGood[l] = std::make_unique<TEfficiency>(*mNGoodMatchesPt[l], *mDuplicatedPt[l]);
1594 stileEfficiencyGraph(mEffPtGood[l], Form(
"mEffPtGood_L%d", l), Form(
"L%d;#it{p}_{T} (GeV/#it{c});Efficiency", l),
false, kFullDiamond, 1, kGreen + 3, kGreen + 3);
1596 for (
int ibin = 1; ibin <= mNFakeMatchesPt[l]->GetNbinsX(); ibin++) {
1597 if (mNFakeMatchesPt[l]->GetBinContent(ibin) > mDuplicatedPt[l]->GetBinContent(ibin)) {
1598 std::cout <<
"--- Pt: Npass = " << mNFakeMatchesPt[l]->GetBinContent(ibin) <<
", Nall = " << mDuplicatedPt[l]->GetBinContent(ibin) <<
" for ibin = " << ibin << std::endl;
1599 mNFakeMatchesPt[l]->SetBinContent(ibin, mDuplicatedPt[l]->GetBinContent(ibin));
1602 mEffPtFake[l] = std::make_unique<TEfficiency>(*mNFakeMatchesPt[l], *mDuplicatedPt[l]);
1603 stileEfficiencyGraph(mEffPtFake[l], Form(
"mEffPtFake_L%d", l), Form(
"L%d;#it{p}_{T} (GeV/#it{c});Efficiency", l),
false, kFullDiamond, 1, kRed + 1, kRed + 1);
1605 axpt->SetTitle(Form(
"L%d;#it{p}_{T} (GeV/#it{c});Efficiency", l));
1606 axpt->GetYaxis()->SetRangeUser(-0.1, 1.1);
1607 axpt->GetXaxis()->SetRangeUser(0.05, 7.5);
1609 mEffPtGood[l]->Draw(
"same p");
1610 mEffPtFake[l]->Draw(
"same p");
1612 auto legpt = std::make_unique<TLegend>(0.70, 0.15, 0.89, 0.35);
1613 legpt->AddEntry(mEffPtGood[l].
get(),
"#frac{# good matches}{# tot duplicated clusters}",
"pl");
1614 legpt->AddEntry(mEffPtFake[l].
get(),
"#frac{# fake matches}{# tot duplicated clusters}",
"pl");
1615 legpt->Draw(
"same");
1619 effPtEta[l][0] =
new TCanvas(Form(
"effPtEtaGood_L%d", l));
1621 mEffPtEtaGood[l] = std::make_unique<TEfficiency>(*mNGoodMatchesPtEta[l], *mDuplicatedPtEta[l]);
1622 stileEfficiencyGraph(mEffPtEtaGood[l], Form(
"mEffPtEtaGood_L%d", l), Form(
"L%d;#it{p}_{T} (GeV/#it{c});#eta;Efficiency", l),
true);
1624 axptetaGood->SetTitle(Form(
"L%d;#it{p}_{T} (GeV/#it{c});#eta;Efficiency", l));
1625 axptetaGood->GetZaxis()->SetRangeUser(-0.1, 1.1);
1626 axptetaGood->GetYaxis()->SetRangeUser(-2., 2.);
1627 axptetaGood->GetXaxis()->SetRangeUser(0.05, 7.5);
1628 axptetaGood->Draw();
1629 mEffPtEtaGood[l]->Draw(
"same colz");
1630 effPtEta[l][0]->Update();
1631 effPtEta[l][0]->Write();
1633 if (mVerboseOutput) {
1634 std::cout <<
"Underflow (bin 0,0): " << mNFakeMatchesPtEta[l]->GetBinContent(0, 0) <<
" " << mDuplicatedPtEta[l]->GetBinContent(0, 0) << std::endl;
1635 std::cout <<
"Overflow (bin nbinsx,nbinsy): " << mNFakeMatchesPtEta[l]->GetNbinsX() <<
" " << mNFakeMatchesPtEta[l]->GetNbinsY() <<
" -> " << mNFakeMatchesPtEta[l]->GetBinContent(mNFakeMatchesPtEta[l]->GetNbinsX(), mNFakeMatchesPtEta[l]->GetNbinsY()) <<
" " << mDuplicatedPtEta[l]->GetBinContent(mNFakeMatchesPtEta[l]->GetNbinsX(), mNFakeMatchesPtEta[l]->GetNbinsY()) << std::endl;
1638 for (
int ibin = 1; ibin <= mNFakeMatchesPtEta[l]->GetNbinsX(); ibin++) {
1639 for (
int jbin = 1; jbin <= mNFakeMatchesPtEta[l]->GetNbinsY(); jbin++) {
1640 if (mNFakeMatchesPtEta[l]->GetBinContent(ibin, jbin) > mDuplicatedPtEta[l]->GetBinContent(ibin, jbin)) {
1641 if (mVerboseOutput) {
1642 std::cout <<
"--- PtEta fakematches : Npass = " << mNFakeMatchesPtEta[l]->GetBinContent(ibin, jbin) <<
", Nall = " << mDuplicatedPtEta[l]->GetBinContent(ibin, jbin) <<
" for ibin = " << ibin <<
", jbin = " << jbin << std::endl;
1644 mNFakeMatchesPtEta[l]->SetBinContent(ibin, jbin, mDuplicatedPtEta[l]->GetBinContent(ibin, jbin));
1650 effRow[l] =
new TCanvas(Form(
"effRow_L%d", l));
1652 for (
int ibin = 1; ibin <= mNGoodMatchesRow[l]->GetNbinsX(); ibin++) {
1653 std::cout <<
"--- Good Row: Npass = " << mNGoodMatchesRow[l]->GetBinContent(ibin) <<
", Nall = " << mDuplicatedRow[l]->GetBinContent(ibin) <<
" for ibin = " << ibin << std::endl;
1656 mEffRowGood[l] = std::make_unique<TEfficiency>(*mNGoodMatchesRow[l], *mDuplicatedRow[l]);
1657 stileEfficiencyGraph(mEffRowGood[l], Form(
"mEffRowGood_L%d", l), Form(
"L%d;Row;Efficiency", l),
false, kFullDiamond, 1, kGreen + 3, kGreen + 3);
1659 for (
int ibin = 1; ibin <= mNFakeMatchesRow[l]->GetNbinsX(); ibin++) {
1660 if (mNFakeMatchesRow[l]->GetBinContent(ibin) > mDuplicatedRow[l]->GetBinContent(ibin)) {
1661 std::cout <<
"--- Row: Npass = " << mNFakeMatchesRow[l]->GetBinContent(ibin) <<
", Nall = " << mDuplicatedRow[l]->GetBinContent(ibin) <<
" for ibin = " << ibin << std::endl;
1662 mNFakeMatchesRow[l]->SetBinContent(ibin, mDuplicatedRow[l]->GetBinContent(ibin));
1665 mEffRowFake[l] = std::make_unique<TEfficiency>(*mNFakeMatchesRow[l], *mDuplicatedRow[l]);
1666 stileEfficiencyGraph(mEffRowFake[l], Form(
"mEffRowFake_L%d", l), Form(
"L%d;Row;Efficiency", l),
false, kFullDiamond, 1, kRed + 1, kRed + 1);
1668 axRow->SetTitle(Form(
"L%d;Row;Efficiency", l));
1669 axRow->GetYaxis()->SetRangeUser(-0.1, 1.1);
1670 axRow->GetXaxis()->SetRangeUser(0.05, 7.5);
1672 mEffRowGood[l]->Draw(
"same p");
1673 mEffRowFake[l]->Draw(
"same p");
1675 auto legRow = std::make_unique<TLegend>(0.70, 0.15, 0.89, 0.35);
1676 legRow->AddEntry(mEffRowGood[l].
get(),
"#frac{# good matches}{# tot duplicated clusters}",
"pl");
1677 legRow->AddEntry(mEffRowFake[l].
get(),
"#frac{# fake matches}{# tot duplicated clusters}",
"pl");
1678 legRow->Draw(
"same");
1682 effPtEta[l][0] =
new TCanvas(Form(
"effPtEtaGood_L%d", l));
1684 mEffPtEtaGood[l] = std::make_unique<TEfficiency>(*mNGoodMatchesPtEta[l], *mDuplicatedPtEta[l]);
1685 stileEfficiencyGraph(mEffPtEtaGood[l], Form(
"mEffPtEtaGood_L%d", l), Form(
"L%d;#it{p}_{T} (GeV/#it{c});#eta;Efficiency", l),
true);
1687 axptetaGood->SetTitle(Form(
"L%d;#it{p}_{T} (GeV/#it{c});#eta;Efficiency", l));
1688 axptetaGood->GetZaxis()->SetRangeUser(-0.1, 1.1);
1689 axptetaGood->GetYaxis()->SetRangeUser(-2., 2.);
1690 axptetaGood->GetXaxis()->SetRangeUser(0.05, 7.5);
1691 axptetaGood->Draw();
1692 mEffPtEtaGood[l]->Draw(
"same colz");
1693 effPtEta[l][0]->Update();
1694 effPtEta[l][0]->Write();
1696 if (mVerboseOutput) {
1697 std::cout <<
"Underflow (bin 0,0): " << mNFakeMatchesPtEta[l]->GetBinContent(0, 0) <<
" " << mDuplicatedPtEta[l]->GetBinContent(0, 0) << std::endl;
1698 std::cout <<
"Overflow (bin nbinsx,nbinsy): " << mNFakeMatchesPtEta[l]->GetNbinsX() <<
" " << mNFakeMatchesPtEta[l]->GetNbinsY() <<
" -> " << mNFakeMatchesPtEta[l]->GetBinContent(mNFakeMatchesPtEta[l]->GetNbinsX(), mNFakeMatchesPtEta[l]->GetNbinsY()) <<
" " << mDuplicatedPtEta[l]->GetBinContent(mNFakeMatchesPtEta[l]->GetNbinsX(), mNFakeMatchesPtEta[l]->GetNbinsY()) << std::endl;
1701 for (
int ibin = 1; ibin <= mNFakeMatchesPtEta[l]->GetNbinsX(); ibin++) {
1702 for (
int jbin = 1; jbin <= mNFakeMatchesPtEta[l]->GetNbinsY(); jbin++) {
1703 if (mNFakeMatchesPtEta[l]->GetBinContent(ibin, jbin) > mDuplicatedPtEta[l]->GetBinContent(ibin, jbin)) {
1704 if (mVerboseOutput) {
1705 std::cout <<
"--- PtEta fakematches : Npass = " << mNFakeMatchesPtEta[l]->GetBinContent(ibin, jbin) <<
", Nall = " << mDuplicatedPtEta[l]->GetBinContent(ibin, jbin) <<
" for ibin = " << ibin <<
", jbin = " << jbin << std::endl;
1707 mNFakeMatchesPtEta[l]->SetBinContent(ibin, jbin, mDuplicatedPtEta[l]->GetBinContent(ibin, jbin));
1713 effPtEta[l][1] =
new TCanvas(Form(
"effPtEtaFake_L%d", l));
1715 mEffPtEtaFake[l] = std::make_unique<TEfficiency>(*mNFakeMatchesPtEta[l], *mDuplicatedPtEta[l]);
1716 stileEfficiencyGraph(mEffPtEtaFake[l], Form(
"mEffPtEtaFake_L%d", l), Form(
"L%d;#it{p}_{T} (GeV/#it{c});#eta;Efficiency", l),
true);
1717 axptetaFake->SetTitle(Form(
"L%d;#it{p}_{T} (GeV/#it{c});#eta;Efficiency", l));
1718 axptetaFake->GetZaxis()->SetRangeUser(-0.1, 1.1);
1719 axptetaFake->GetYaxis()->SetRangeUser(-2., 2.);
1720 axptetaFake->GetXaxis()->SetRangeUser(0.05, 7.5);
1721 axptetaFake->Draw();
1722 mEffPtEtaFake[l]->Draw(
"same colz");
1723 effPtEta[l][1]->Update();
1724 effPtEta[l][1]->Write();
1727 effPtPhi[l][0] =
new TCanvas(Form(
"effPtPhiGood_L%d", l));
1729 mEffPtPhiGood[l] = std::make_unique<TEfficiency>(*mNGoodMatchesPtPhi[l], *mDuplicatedPtPhi[l]);
1730 stileEfficiencyGraph(mEffPtPhiGood[l], Form(
"mEffPtPhiGood_L%d", l), Form(
"L%d;#it{p}_{T} (GeV/#it{c});#phi (deg);Efficiency", l),
true);
1732 axptphiGood->SetTitle(Form(
"L%d;#it{p}_{T} (GeV/#it{c});#phi (deg);Efficiency", l));
1733 axptphiGood->GetZaxis()->SetRangeUser(-0.1, 1.1);
1734 axptphiGood->GetYaxis()->SetRangeUser(-180, 180);
1735 axptphiGood->GetXaxis()->SetRangeUser(0.05, 7.5);
1736 axptphiGood->Draw();
1737 mEffPtPhiGood[l]->Draw(
"same colz");
1738 effPtPhi[l][0]->Update();
1739 effPtPhi[l][0]->Write();
1741 for (
int ibin = 1; ibin <= mNFakeMatchesPtPhi[l]->GetNbinsX(); ibin++) {
1742 for (
int jbin = 1; jbin <= mNFakeMatchesPtPhi[l]->GetNbinsY(); jbin++) {
1743 if (mNFakeMatchesPtPhi[l]->GetBinContent(ibin, jbin) > mDuplicatedPtPhi[l]->GetBinContent(ibin, jbin)) {
1744 if (mVerboseOutput) {
1745 std::cout <<
"--- Pt: Npass = " << mNFakeMatchesPtPhi[l]->GetBinContent(ibin, jbin) <<
", Nall = " << mDuplicatedPtPhi[l]->GetBinContent(ibin, jbin) <<
" for ibin = " << ibin <<
", jbin = " << jbin << std::endl;
1747 mNFakeMatchesPtPhi[l]->SetBinContent(ibin, jbin, mDuplicatedPtPhi[l]->GetBinContent(ibin, jbin));
1753 effPtPhi[l][1] =
new TCanvas(Form(
"effPtPhiFake_L%d", l));
1755 mEffPtPhiFake[l] = std::make_unique<TEfficiency>(*mNFakeMatchesPtPhi[l], *mDuplicatedPtPhi[l]);
1756 stileEfficiencyGraph(mEffPtPhiFake[l], Form(
"mEffPtPhiFake_L%d", l), Form(
"L%d;#it{p}_{T} (GeV/#it{c});#phi (deg);Efficiency", l),
true);
1757 axptphiFake->SetTitle(Form(
"L%d;#it{p}_{T} (GeV/#it{c});#phi (deg);Efficiency", l));
1758 axptphiFake->GetZaxis()->SetRangeUser(-0.1, 1.1);
1759 axptphiFake->GetYaxis()->SetRangeUser(-180, 180);
1760 axptphiFake->GetXaxis()->SetRangeUser(0.05, 7.5);
1761 axptphiFake->Draw();
1762 mEffPtPhiFake[l]->Draw(
"same colz");
1763 effPtPhi[l][1]->Update();
1764 effPtPhi[l][1]->Write();
1767 effEtaPhi[l][0] =
new TCanvas(Form(
"effEtaPhiGood_L%d", l));
1769 mEffEtaPhiGood[l] = std::make_unique<TEfficiency>(*mNGoodMatchesEtaPhi[l], *mDuplicatedEtaPhi[l]);
1770 stileEfficiencyGraph(mEffEtaPhiGood[l], Form(
"mEffEtaPhiGood_L%d", l), Form(
"L%d;#eta;#phi (deg);Efficiency", l),
true);
1772 axetaphiGood->SetTitle(Form(
"L%d;#eta;#phi (deg);Efficiency", l));
1773 axetaphiGood->GetZaxis()->SetRangeUser(-0.1, 1.1);
1774 axetaphiGood->GetYaxis()->SetRangeUser(-180, 180);
1775 axetaphiGood->GetXaxis()->SetRangeUser(-2, 2);
1776 axetaphiGood->Draw();
1777 mEffEtaPhiGood[l]->Draw(
"same colz");
1778 effEtaPhi[l][0]->Update();
1779 effEtaPhi[l][0]->Write();
1781 for (
int ibin = 1; ibin <= mNFakeMatchesEtaPhi[l]->GetNbinsX(); ibin++) {
1782 for (
int jbin = 1; jbin <= mNFakeMatchesEtaPhi[l]->GetNbinsY(); jbin++) {
1783 if (mNFakeMatchesEtaPhi[l]->GetBinContent(ibin, jbin) > mDuplicatedEtaPhi[l]->GetBinContent(ibin, jbin)) {
1784 if (mVerboseOutput) {
1785 std::cout <<
"--- Eta: Npass = " << mNFakeMatchesEtaPhi[l]->GetBinContent(ibin, jbin) <<
", Nall = " << mDuplicatedEtaPhi[l]->GetBinContent(ibin, jbin) <<
" for ibin = " << ibin <<
", jbin = " << jbin << std::endl;
1787 mNFakeMatchesEtaPhi[l]->SetBinContent(ibin, jbin, mDuplicatedEtaPhi[l]->GetBinContent(ibin, jbin));
1793 effEtaPhi[l][1] =
new TCanvas(Form(
"effEtaPhiFake_L%d", l));
1795 mEffEtaPhiFake[l] = std::make_unique<TEfficiency>(*mNFakeMatchesEtaPhi[l], *mDuplicatedEtaPhi[l]);
1796 stileEfficiencyGraph(mEffEtaPhiFake[l], Form(
"mEffEtaPhiFake_L%d", l), Form(
"L%d;#eta;#phi (deg);Efficiency", l),
true);
1797 axetaphiFake->SetTitle(Form(
"L%d;#eta;#phi (deg);Efficiency", l));
1798 axetaphiFake->GetZaxis()->SetRangeUser(-0.1, 1.1);
1799 axetaphiFake->GetYaxis()->SetRangeUser(-180, 180);
1800 axetaphiFake->GetXaxis()->SetRangeUser(-2, 2);
1801 axetaphiFake->Draw();
1802 mEffEtaPhiFake[l]->Draw(
"same colz");
1803 effEtaPhi[l][1]->Update();
1804 effEtaPhi[l][1]->Write();
1807 if (mVerboseOutput) {
1808 std::cout <<
"Eta L" << l <<
"\n\n";
1811 effEtaAllPt[l] =
new TCanvas(Form(
"effEtaAllPt_L%d", l));
1813 mEffEtaGoodAllPt[l] = std::make_unique<TEfficiency>(*mNGoodMatchesEtaAllPt[l], *mDuplicatedEtaAllPt[l]);
1814 stileEfficiencyGraph(mEffEtaGoodAllPt[l], Form(
"mEffEtaGoodAllPt_L%d", l), Form(
"L%d;#eta;Efficiency", l),
false, kFullDiamond, 1, kGreen + 3, kGreen + 3);
1816 for (
int ibin = 1; ibin <= mNFakeMatchesEtaAllPt[l]->GetNbinsX(); ibin++) {
1817 if (mNFakeMatchesEtaAllPt[l]->GetBinContent(ibin) > mDuplicatedEtaAllPt[l]->GetBinContent(ibin)) {
1818 if (mVerboseOutput) {
1819 std::cout <<
"--- EtaAllPt: Npass = " << mNFakeMatchesEtaAllPt[l]->GetBinContent(ibin) <<
", Nall = " << mDuplicatedEtaAllPt[l]->GetBinContent(ibin) <<
" for ibin = " << ibin << std::endl;
1821 mNFakeMatchesEtaAllPt[l]->SetBinContent(ibin, mDuplicatedEtaAllPt[l]->GetBinContent(ibin));
1824 mEffEtaFakeAllPt[l] = std::make_unique<TEfficiency>(*mNFakeMatchesEtaAllPt[l], *mDuplicatedEtaAllPt[l]);
1825 stileEfficiencyGraph(mEffEtaFakeAllPt[l], Form(
"mEffEtaFakeAllPt_L%d", l), Form(
"L%d;#eta;Efficiency", l),
false, kFullDiamond, 1, kRed + 1, kRed + 1);
1827 axetaAllPt->SetTitle(Form(
"L%d;#eta;Efficiency", l));
1828 axetaAllPt->GetYaxis()->SetRangeUser(-0.1, 1.1);
1831 mEffEtaGoodAllPt[l]->Draw(
"same p");
1832 mEffEtaFakeAllPt[l]->Draw(
"same p");
1834 auto legEta = std::make_unique<TLegend>(0.70, 0.15, 0.89, 0.35);
1835 legEta->AddEntry(mEffEtaGoodAllPt[l].
get(),
"#frac{# good matches}{# tot duplicated clusters}",
"pl");
1836 legEta->AddEntry(mEffEtaFakeAllPt[l].
get(),
"#frac{# fake matches}{# tot duplicated clusters}",
"pl");
1837 legEta->Draw(
"same");
1838 effEtaAllPt[l]->Write();
1841 for (
int ipt = 0; ipt < 3; ipt++) {
1843 effEta[l][ipt] =
new TCanvas(Form(
"effEta_L%d_pt%d", l, ipt));
1845 mEffEtaGood[l][ipt] = std::make_unique<TEfficiency>(*mNGoodMatchesEta[l][ipt], *mDuplicatedEta[l][ipt]);
1846 stileEfficiencyGraph(mEffEtaGood[l][ipt], Form(
"mEffEtaGood_L%d_pt%d", l, ipt), Form(
"L%d %.1f #leq #it{p}_{T} < %.1f GeV/#it{c};#eta;Efficiency", l, mrangesPt[ipt][0], mrangesPt[ipt][1]),
false, kFullDiamond, 1, kGreen + 3, kGreen + 3);
1848 for (
int ibin = 1; ibin <= mNFakeMatchesEta[l][ipt]->GetNbinsX(); ibin++) {
1849 if (mNFakeMatchesEta[l][ipt]->GetBinContent(ibin) > mDuplicatedEta[l][ipt]->GetBinContent(ibin)) {
1850 if (mVerboseOutput) {
1851 std::cout <<
"--- Eta : Npass = " << mNFakeMatchesEta[l][ipt]->GetBinContent(ibin) <<
", Nall = " << mDuplicatedEta[l][ipt]->GetBinContent(ibin) <<
" for ibin = " << ibin << std::endl;
1853 mNFakeMatchesEta[l][ipt]->SetBinContent(ibin, mDuplicatedEta[l][ipt]->GetBinContent(ibin));
1857 mEffEtaFake[l][ipt] = std::make_unique<TEfficiency>(*mNFakeMatchesEta[l][ipt], *mDuplicatedEta[l][ipt]);
1858 stileEfficiencyGraph(mEffEtaFake[l][ipt], Form(
"mEffEtaFake_L%d_pt%d", l, ipt), Form(
"L%d %.1f #leq #it{p}_{T} < %.1f GeV/#it{c};#eta;Efficiency", l, mrangesPt[ipt][0], mrangesPt[ipt][1]),
false, kFullDiamond, 1, kRed + 1, kRed + 1);
1860 axeta[ipt]->SetTitle(Form(
"L%d %.1f #leq #it{p}_{T} < %.1f GeV/#it{c};#eta;Efficiency", l, mrangesPt[ipt][0], mrangesPt[ipt][1]));
1861 axeta[ipt]->GetYaxis()->SetRangeUser(-0.1, 1.1);
1864 mEffEtaGood[l][ipt]->Draw(
"same p");
1865 mEffEtaFake[l][ipt]->Draw(
"same p");
1867 auto legEta = std::make_unique<TLegend>(0.70, 0.15, 0.89, 0.35);
1868 legEta->AddEntry(mEffEtaGood[l][ipt].
get(),
"#frac{# good matches}{# tot duplicated clusters}",
"pl");
1869 legEta->AddEntry(mEffEtaFake[l][ipt].
get(),
"#frac{# fake matches}{# tot duplicated clusters}",
"pl");
1870 legEta->Draw(
"same");
1871 effEta[l][ipt]->Write();
1874 effPhi[l][ipt] =
new TCanvas(Form(
"effPhi_L%d_pt%d", l, ipt));
1876 for (
int ibin = 1; ibin <= mNGoodMatchesPhi[l][ipt]->GetNbinsX(); ibin++) {
1877 if (mNGoodMatchesPhi[l][ipt]->GetBinContent(ibin) > mDuplicatedPhi[l][ipt]->GetBinContent(ibin)) {
1878 if (mVerboseOutput) {
1879 std::cout <<
"--- Phi L: Npass = " << mNGoodMatchesPhi[l][ipt]->GetBinContent(ibin) <<
", Nall = " << mDuplicatedPhi[l][ipt]->GetBinContent(ibin) <<
" for ibin = " << ibin << std::endl;
1881 mNGoodMatchesPhi[l][ipt]->SetBinContent(ibin, 0);
1885 mEffPhiGood[l][ipt] = std::make_unique<TEfficiency>(*mNGoodMatchesPhi[l][ipt], *mDuplicatedPhi[l][ipt]);
1886 stileEfficiencyGraph(mEffPhiGood[l][ipt], Form(
"mEffPhiGood_L%d_pt%d", l, ipt), Form(
"L%d %.1f #leq #it{p}_{T} < %.1f GeV/#it{c};#phi (deg);Efficiency", l, mrangesPt[ipt][0], mrangesPt[ipt][1]),
false, kFullDiamond, 1, kGreen + 3, kGreen + 3);
1888 for (
int ibin = 1; ibin <= mNFakeMatchesPhi[l][ipt]->GetNbinsX(); ibin++) {
1889 if (mNFakeMatchesPhi[l][ipt]->GetBinContent(ibin) > mDuplicatedPhi[l][ipt]->GetBinContent(ibin)) {
1890 if (mVerboseOutput) {
1891 std::cout <<
"--- Phi L: Npass = " << mNFakeMatchesPhi[l][ipt]->GetBinContent(ibin) <<
", Nall = " << mDuplicatedPhi[l][ipt]->GetBinContent(ibin) <<
" for ibin = " << ibin << std::endl;
1893 mNFakeMatchesPhi[l][ipt]->SetBinContent(ibin, mDuplicatedPhi[l][ipt]->GetBinContent(ibin));
1897 mEffPhiFake[l][ipt] = std::make_unique<TEfficiency>(*mNFakeMatchesPhi[l][ipt], *mDuplicatedPhi[l][ipt]);
1898 stileEfficiencyGraph(mEffPhiFake[l][ipt], Form(
"mEffPhiFake_L%d_pt%d", l, ipt), Form(
"L%d %.1f #leq #it{p}_{T} < %.1f GeV/#it{c};#phi (deg);Efficiency", l, mrangesPt[ipt][0], mrangesPt[ipt][1]),
false, kFullDiamond, 1, kRed + 1, kRed + 1);
1900 axphi[ipt]->SetTitle(Form(
"L%d %.1f #leq #it{p}_{T} < %.1f GeV/#it{c};#phi (deg);Efficiency", l, mrangesPt[ipt][0], mrangesPt[ipt][1]));
1901 axphi[ipt]->GetYaxis()->SetRangeUser(-0.1, 1.1);
1904 mEffPhiGood[l][ipt]->Draw(
"same p");
1905 mEffPhiFake[l][ipt]->Draw(
"same p");
1907 auto legPhi = std::make_unique<TLegend>(0.70, 0.15, 0.89, 0.35);
1908 legPhi->AddEntry(mEffPhiGood[l][ipt].
get(),
"#frac{# good matches}{# tot duplicated clusters}",
"pl");
1909 legPhi->AddEntry(mEffPhiFake[l][ipt].
get(),
"#frac{# fake matches}{# tot duplicated clusters}",
"pl");
1910 legPhi->Draw(
"same");
1911 effPhi[l][ipt]->Write();
1915 if (mVerboseOutput) {
1916 std::cout <<
"Phi L" << l <<
"\n\n";
1919 effPhiAllPt[l] =
new TCanvas(Form(
"effPhiAllPt_L%d", l));
1921 for (
int ibin = 1; ibin <= mNGoodMatchesPhiAllPt[l]->GetNbinsX(); ibin++) {
1922 if (mNGoodMatchesPhiAllPt[l]->GetBinContent(ibin) > mDuplicatedPhiAllPt[l]->GetBinContent(ibin)) {
1923 if (mVerboseOutput) {
1924 std::cout <<
"--- phi all good Npass = " << mNGoodMatchesPhiAllPt[l]->GetBinContent(ibin) <<
", Nall = " << mDuplicatedPhiAllPt[l]->GetBinContent(ibin) <<
" for ibin = " << ibin << std::endl;
1926 mNGoodMatchesPhiAllPt[l]->SetBinContent(ibin, 0);
1930 mEffPhiGoodAllPt[l] = std::make_unique<TEfficiency>(*mNGoodMatchesPhiAllPt[l], *mDuplicatedPhiAllPt[l]);
1931 stileEfficiencyGraph(mEffPhiGoodAllPt[l], Form(
"mEffPhiGoodAllPt_L%d", l), Form(
"L%d;#phi;Efficiency", l),
false, kFullDiamond, 1, kGreen + 3, kGreen + 3);
1933 for (
int ibin = 1; ibin <= mNFakeMatchesPhiAllPt[l]->GetNbinsX(); ibin++) {
1934 if (mNFakeMatchesPhiAllPt[l]->GetBinContent(ibin) > mDuplicatedPhiAllPt[l]->GetBinContent(ibin)) {
1935 if (mVerboseOutput) {
1936 std::cout <<
"--- phi all fake Npass = " << mNFakeMatchesPhiAllPt[l]->GetBinContent(ibin) <<
", Nall = " << mDuplicatedPhiAllPt[l]->GetBinContent(ibin) <<
" for ibin = " << ibin << std::endl;
1938 mNFakeMatchesPhiAllPt[l]->SetBinContent(ibin, mDuplicatedPhiAllPt[l]->GetBinContent(ibin));
1941 mEffPhiFakeAllPt[l] = std::make_unique<TEfficiency>(*mNFakeMatchesPhiAllPt[l], *mDuplicatedPhiAllPt[l]);
1942 stileEfficiencyGraph(mEffPhiFakeAllPt[l], Form(
"mEffPhiFakeAllPt_L%d", l), Form(
"L%d;#phi;Efficiency", l),
false, kFullDiamond, 1, kRed + 1, kRed + 1);
1944 axphiAllPt->SetTitle(Form(
"L%d;#phi;Efficiency", l));
1945 axphiAllPt->GetYaxis()->SetRangeUser(-0.1, 1.1);
1947 mEffPhiGoodAllPt[l]->Draw(
"same p");
1948 mEffPhiFakeAllPt[l]->Draw(
"same p");
1950 auto legPhi = std::make_unique<TLegend>(0.70, 0.15, 0.89, 0.35);
1951 legPhi->AddEntry(mEffPhiGoodAllPt[l].
get(),
"#frac{# good matches}{# tot duplicated clusters}",
"pl");
1952 legPhi->AddEntry(mEffPhiFakeAllPt[l].
get(),
"#frac{# fake matches}{# tot duplicated clusters}",
"pl");
1953 legPhi->Draw(
"same");
1954 effPhiAllPt[l]->Write();
2034 LOGP(info,
"--------------- getEfficiency");
2040 unsigned int rofIndexTrack = 0;
2041 unsigned int rofNEntriesTrack = 0;
2042 unsigned int rofIndexClus = 0;
2043 unsigned int rofNEntriesClus = 0;
2045 unsigned int totClus = 0;
2048 double xbins[nbPt + 1], ptcutl = 0.05, ptcuth = 7.5;
2049 double a = std::log(ptcuth / ptcutl) / nbPt;
2050 for (
int i = 0;
i <= nbPt;
i++) {
2051 xbins[
i] = ptcutl * std::exp(
i *
a);
2058 for (
unsigned int iROF = 0; iROF < mTracksROFRecords.size(); iROF++) {
2060 rofIndexTrack = mTracksROFRecords[iROF].getFirstEntry();
2061 rofNEntriesTrack = mTracksROFRecords[iROF].getNEntries();
2063 rofIndexClus = mClustersROFRecords[iROF].getFirstEntry();
2064 rofNEntriesClus = mClustersROFRecords[iROF].getNEntries();
2067 for (
unsigned int iTrack = rofIndexTrack; iTrack < rofIndexTrack + rofNEntriesTrack; iTrack++) {
2068 auto track = mTracks[iTrack];
2071 auto pt = trackParCov.getPt();
2072 auto eta = trackParCov.getEta();
2074 float phiOriginal = -999.;
2076 float chi2 = track.getChi2();
2079 track.getImpactParams(0, 0, 0, 0, ip);
2081 float phiTrack = trackParCov.getPhi() * 180 / M_PI;
2096 int firstClus = track.getFirstClusterEntry();
2097 int ncl = track.getNumberOfClusters();
2105 tracklab = mTracksMCLabels[iTrack];
2111 if (mVerboseOutput && isMC) {
2112 LOGP(info,
"--------- track Label: ");
2116 for (
int iclTrack = firstClus; iclTrack < firstClus + ncl; iclTrack++) {
2117 auto& clusOriginal = mClusters[mInputITSidxs[iclTrack]];
2118 auto clusOriginalPoint = mITSClustersArray[mInputITSidxs[iclTrack]];
2119 auto layerOriginal = mGeometry->
getLayer(clusOriginal.getSensorID());
2121 UShort_t rowOriginal = clusOriginal.getRow();
2123 if (layerOriginal >=
NLAYERS) {
2127 IPOriginalxy[layerOriginal]->Fill(ip[0]);
2128 IPOriginalz[layerOriginal]->Fill(ip[1]);
2133 phiOriginal = clusOriginalPointGlob.phi() * 180 / M_PI;
2135 mXoriginal->Fill(clusOriginalPointGlob.x());
2136 mYoriginal->Fill(clusOriginalPointGlob.y());
2137 mZoriginal->Fill(clusOriginalPointGlob.z());
2141 m2DClusterOriginalPositions->Fill(clusOriginalPointGlob.x(), clusOriginalPointGlob.y());
2142 m3DClusterPositions->Fill(clusOriginalPointGlob.x(), clusOriginalPointGlob.y(), clusOriginalPointGlob.z());
2145 bool keepTrack =
false;
2146 if (layerOriginal == 0) {
2148 for (
int i = 0;
i < 10;
i++) {
2154 if (layerOriginal == 1) {
2155 for (
int i = 0;
i < 12;
i++) {
2161 if (layerOriginal == 2) {
2162 for (
int i = 0;
i < 17;
i++) {
2173 chi2trackAccepted->Fill(chi2);
2174 denPt[layerOriginal]->Fill(pt);
2175 denPhi[layerOriginal]->Fill(phiOriginal);
2176 denEta[layerOriginal]->Fill(eta);
2177 nTracksSelected[layerOriginal]++;
2181 gsl::span<const o2::MCCompLabel> labsOriginal = {};
2183 labsOriginal = mClustersMCLCont->
getLabels(mInputITSidxs[iclTrack]);
2186 auto staveOriginal = mGeometry->
getStave(clusOriginal.getSensorID());
2187 auto chipOriginal = mGeometry->
getChipIdInStave(clusOriginal.getSensorID());
2189 std::tuple<int, double, gsl::span<const o2::MCCompLabel>> clusID_rDCA_label = {0, 999., gsl::span<const o2::MCCompLabel>()};
2191 bool adjacentFound = 0;
2192 float phiDuplicated = -999.;
2193 float ptDuplicated = -999.;
2194 float etaDuplicated = -999.;
2195 float clusZ = -999.;
2199 for (
unsigned int iClus = rofIndexClus; iClus < rofIndexClus + rofNEntriesClus; iClus++) {
2200 auto clusDuplicated = mClusters[iClus];
2202 auto clusDuplicatedPoint = mITSClustersArray[iClus];
2206 phi = clusDuplicatedPointGlob.phi() * 180 / M_PI;
2209 if (clusDuplicated.getSensorID() == clusOriginal.getSensorID()) {
2212 auto layerDuplicated = mGeometry->
getLayer(clusDuplicated.getSensorID());
2213 if (layerDuplicated != layerOriginal) {
2216 auto staveDuplicated = mGeometry->
getStave(clusDuplicated.getSensorID());
2217 if (abs(staveDuplicated - staveOriginal) != 1) {
2220 auto chipDuplicated = mGeometry->
getChipIdInStave(clusDuplicated.getSensorID());
2221 if (abs(chipDuplicated - chipOriginal) > 1) {
2225 gsl::span<const o2::MCCompLabel> labsDuplicated = {};
2227 labsDuplicated = mClustersMCLCont->
getLabels(iClus);
2233 if (!propagator->propagateToDCA(clusDuplicatedPointGlob, trackParCov,
b, 2.f, matCorr, &clusDuplicatedDCA)) {
2237 DCAxyData[layerDuplicated]->Fill(clusDuplicatedDCA[0]);
2238 DCAzData[layerDuplicated]->Fill(clusDuplicatedDCA[1]);
2244 DistanceClustersX[layerDuplicated]->Fill(abs(clusDuplicatedPointGlob.x() - clusOriginalPointGlob.x()));
2245 DistanceClustersY[layerDuplicated]->Fill(abs(clusDuplicatedPointGlob.y() - clusOriginalPointGlob.y()));
2246 DistanceClustersZ[layerDuplicated]->Fill(abs(clusDuplicatedPointGlob.z() - clusOriginalPointGlob.z()));
2249 if (!(clusDuplicatedDCA[0] >
mDCACutsXY[layerDuplicated][0] && clusDuplicatedDCA[0] <
mDCACutsXY[layerDuplicated][1] && clusDuplicatedDCA[1] >
mDCACutsZ[layerDuplicated][0] && clusDuplicatedDCA[1] <
mDCACutsZ[layerDuplicated][1])) {
2250 DCAxyRejected[layerDuplicated]->Fill(clusDuplicatedDCA[0]);
2251 DCAzRejected[layerDuplicated]->Fill(clusDuplicatedDCA[1]);
2255 m2DClusterDuplicatedPositions->Fill(clusDuplicatedPointGlob.x(), clusDuplicatedPointGlob.y());
2256 m3DDuplicatedClusterPositions->Fill(clusDuplicatedPointGlob.x(), clusDuplicatedPointGlob.y(), clusDuplicatedPointGlob.z());
2258 mXduplicated->Fill(clusDuplicatedPointGlob.x());
2259 mYduplicated->Fill(clusDuplicatedPointGlob.y());
2260 mZduplicated->Fill(clusDuplicatedPointGlob.z());
2262 IPOriginalifDuplicatedxy[layerOriginal]->Fill(ip[0]);
2263 IPOriginalifDuplicatedz[layerOriginal]->Fill(ip[1]);
2265 DistanceClustersXAftercuts[layerDuplicated]->Fill(abs(clusDuplicatedPointGlob.x() - clusOriginalPointGlob.x()));
2266 DistanceClustersYAftercuts[layerDuplicated]->Fill(abs(clusDuplicatedPointGlob.y() - clusOriginalPointGlob.y()));
2267 DistanceClustersZAftercuts[layerDuplicated]->Fill(abs(clusDuplicatedPointGlob.z() - clusOriginalPointGlob.z()));
2269 if (mVerboseOutput) {
2270 LOGP(info,
"Propagation ok");
2272 double rDCA = std::hypot(clusDuplicatedDCA[0], clusDuplicatedDCA[1]);
2275 if (rDCA < std::get<1>(clusID_rDCA_label)) {
2277 clusID_rDCA_label = {iClus, rDCA, labsDuplicated};
2279 clusID_rDCA_label = {iClus, rDCA, gsl::span<const o2::MCCompLabel>()};
2281 phiDuplicated = phiOriginal;
2283 etaDuplicated = eta;
2284 clusZ = clusOriginalPointGlob.z();
2291 if (!adjacentFound) {
2295 nDuplicatedClusters[layerOriginal]++;
2296 numPt[layerOriginal]->Fill(ptDuplicated);
2297 numPhi[layerOriginal]->Fill(phiDuplicated);
2298 numEta[layerOriginal]->Fill(etaDuplicated);
2299 mZvsPhiDUplicated[layerOriginal]->Fill(clusZ, phiDuplicated);
2303 bool isGood =
false;
2304 for (
auto lab : std::get<2>(clusID_rDCA_label)) {
2305 if (lab == tracklab) {
2307 numPtGood[layerOriginal]->Fill(ptDuplicated);
2308 numPhiGood[layerOriginal]->Fill(phiDuplicated);
2309 numEtaGood[layerOriginal]->Fill(etaDuplicated);
2314 numPtFake[layerOriginal]->Fill(ptDuplicated);
2315 numPhiFake[layerOriginal]->Fill(phiDuplicated);
2316 numEtaFake[layerOriginal]->Fill(etaDuplicated);
2324 std::cout <<
" Num of duplicated clusters L0: " << nDuplicatedClusters[0] <<
" N tracks selected: " << nTracksSelected[0] << std::endl;
2325 std::cout <<
" Num of duplicated clusters L1: " << nDuplicatedClusters[1] <<
" N tracks selected: " << nTracksSelected[1] << std::endl;
2326 std::cout <<
" Num of duplicated clusters L2: " << nDuplicatedClusters[2] <<
" N tracks selected: " << nTracksSelected[2] << std::endl;
2328 std::cout <<
" --------- N total clusters: " << totNClusters << std::endl;
2329 std::cout <<
" --------- N duplicated clusters: " << nDuplClusters << std::endl;
2339 LOGP(info,
"--------------- getEfficiency");
2345 unsigned int rofIndexTrack = 0;
2346 unsigned int rofNEntriesTrack = 0;
2347 unsigned int rofIndexClus = 0;
2348 unsigned int rofNEntriesClus = 0;
2350 unsigned int totClus = 0;
2353 double xbins[nbPt + 1], ptcutl = 0.05, ptcuth = 7.5;
2354 double a = std::log(ptcuth / ptcutl) / nbPt;
2355 for (
int i = 0;
i <= nbPt;
i++) {
2356 xbins[
i] = ptcutl * std::exp(
i *
a);
2363 for (
unsigned int iROF = 0; iROF < mTracksROFRecords.size(); iROF++) {
2365 rofIndexTrack = mTracksROFRecords[iROF].getFirstEntry();
2366 rofNEntriesTrack = mTracksROFRecords[iROF].getNEntries();
2368 rofIndexClus = mClustersROFRecords[iROF].getFirstEntry();
2369 rofNEntriesClus = mClustersROFRecords[iROF].getNEntries();
2372 for (
unsigned int iTrack = rofIndexTrack; iTrack < rofIndexTrack + rofNEntriesTrack; iTrack++) {
2373 auto track = mTracks[iTrack];
2376 auto pt = trackParCov.getPt();
2377 auto eta = trackParCov.getEta();
2379 float phiOriginal = -999.;
2381 float chi2 = track.getChi2();
2383 chi2track->Fill(chi2);
2385 float phiTrack = trackParCov.getPhi() * 180 / M_PI;
2399 int firstClus = track.getFirstClusterEntry();
2400 int ncl = track.getNumberOfClusters();
2408 tracklab = mTracksMCLabels[iTrack];
2414 if (mVerboseOutput && isMC) {
2415 LOGP(info,
"--------- track Label: ");
2419 for (
int iclTrack = firstClus; iclTrack < firstClus + ncl; iclTrack++) {
2420 auto& clusOriginal = mClusters[mInputITSidxs[iclTrack]];
2421 auto clusOriginalPoint = mITSClustersArray[mInputITSidxs[iclTrack]];
2422 auto layerOriginal = mGeometry->
getLayer(clusOriginal.getSensorID());
2424 UShort_t rowOriginal = clusOriginal.getRow();
2426 if (layerOriginal >=
NLAYERS) {
2432 phiOriginal = clusOriginalPointGlob.phi() * 180 / M_PI;
2434 mXoriginal->Fill(clusOriginalPointGlob.x());
2435 mYoriginal->Fill(clusOriginalPointGlob.y());
2436 mZoriginal->Fill(clusOriginalPointGlob.z());
2438 m2DClusterOriginalPositions->Fill(clusOriginalPointGlob.x(), clusOriginalPointGlob.y());
2439 m3DClusterPositions->Fill(clusOriginalPointGlob.x(), clusOriginalPointGlob.y(), clusOriginalPointGlob.z());
2442 bool keepTrack =
false;
2444 if (layerOriginal == 0) {
2445 for (
int i = 0;
i < 10;
i++) {
2451 if (layerOriginal == 1) {
2452 for (
int i = 0;
i < 12;
i++) {
2458 if (layerOriginal == 2) {
2459 for (
int i = 0;
i < 17;
i++) {
2468 chi2trackAccepted->Fill(chi2);
2469 denPt[layerOriginal]->Fill(pt);
2470 denPhi[layerOriginal]->Fill(phiOriginal);
2471 denEta[layerOriginal]->Fill(eta);
2472 nTracksSelected[layerOriginal]++;
2474 gsl::span<const o2::MCCompLabel> labsOriginal = {};
2476 labsOriginal = mClustersMCLCont->
getLabels(mInputITSidxs[iclTrack]);
2479 auto staveOriginal = mGeometry->
getStave(clusOriginal.getSensorID());
2480 auto chipOriginal = mGeometry->
getChipIdInStave(clusOriginal.getSensorID());
2482 std::tuple<int, double, gsl::span<const o2::MCCompLabel>> clusID_rDCA_label = {0, 999., gsl::span<const o2::MCCompLabel>()};
2484 bool adjacentFound = 0;
2485 float phiDuplicated = -999.;
2486 float ptDuplicated = -999.;
2487 float etaDuplicated = -999.;
2488 float clusZ = -999.;
2491 bool duplExists =
false;
2495 for (
unsigned int iClus = rofIndexClus; iClus < rofIndexClus + rofNEntriesClus; iClus++) {
2496 auto clusDuplicated = mClusters[iClus];
2498 auto clusDuplicatedPoint = mITSClustersArray[iClus];
2502 phi = clusDuplicatedPointGlob.phi() * 180 / M_PI;
2505 if (clusDuplicated.getSensorID() == clusOriginal.getSensorID()) {
2508 auto layerDuplicated = mGeometry->
getLayer(clusDuplicated.getSensorID());
2509 if (layerDuplicated != layerOriginal) {
2512 labelCandidateDuplicated = mClustersMCLCont->
getLabels(iClus)[0];
2513 if (labelCandidateDuplicated == tracklab) {
2515 std::cout <<
"Duplicated should exist with label: " << labelCandidateDuplicated.
asString() <<
" , phi = " << phi <<
" and be: ";
2516 clusDuplicated.print();
2518 auto staveDuplicated = mGeometry->
getStave(clusDuplicated.getSensorID());
2519 if (abs(staveDuplicated - staveOriginal) != 1) {
2522 auto chipDuplicated = mGeometry->
getChipIdInStave(clusDuplicated.getSensorID());
2523 if (abs(chipDuplicated - chipOriginal) > 1) {
2527 std::cout <<
"checks passed" << std::endl;
2529 gsl::span<const o2::MCCompLabel> labsDuplicated = {};
2531 labsDuplicated = mClustersMCLCont->
getLabels(iClus);
2537 if (!propagator->propagateToDCA(clusDuplicatedPointGlob, trackParCov,
b, 2.f, matCorr, &clusDuplicatedDCA)) {
2541 std::cout <<
"dca calculated: " << clusDuplicatedDCA[0] <<
" " << clusDuplicatedDCA[1] << std::endl;
2543 DCAxyData[layerDuplicated]->Fill(clusDuplicatedDCA[0]);
2544 DCAzData[layerDuplicated]->Fill(clusDuplicatedDCA[1]);
2545 DistanceClustersX[layerDuplicated]->Fill(abs(clusDuplicatedPointGlob.x() - clusOriginalPointGlob.x()));
2546 DistanceClustersY[layerDuplicated]->Fill(abs(clusDuplicatedPointGlob.y() - clusOriginalPointGlob.y()));
2547 DistanceClustersZ[layerDuplicated]->Fill(abs(clusDuplicatedPointGlob.z() - clusOriginalPointGlob.z()));
2550 if (!(clusDuplicatedDCA[0] >
mDCACutsXY[layerDuplicated][0] && clusDuplicatedDCA[0] <
mDCACutsXY[layerDuplicated][1] && clusDuplicatedDCA[1] >
mDCACutsZ[layerDuplicated][0] && clusDuplicatedDCA[1] <
mDCACutsZ[layerDuplicated][1])) {
2551 DCAxyRejected[layerDuplicated]->Fill(clusDuplicatedDCA[0]);
2552 DCAzRejected[layerDuplicated]->Fill(clusDuplicatedDCA[1]);
2555 m2DClusterDuplicatedPositions->Fill(clusDuplicatedPointGlob.x(), clusDuplicatedPointGlob.y());
2556 m3DDuplicatedClusterPositions->Fill(clusDuplicatedPointGlob.x(), clusDuplicatedPointGlob.y(), clusDuplicatedPointGlob.z());
2557 mXduplicated->Fill(clusDuplicatedPointGlob.x());
2558 mYduplicated->Fill(clusDuplicatedPointGlob.y());
2559 mZduplicated->Fill(clusDuplicatedPointGlob.z());
2561 DistanceClustersXAftercuts[layerDuplicated]->Fill(abs(clusDuplicatedPointGlob.x() - clusOriginalPointGlob.x()));
2562 DistanceClustersYAftercuts[layerDuplicated]->Fill(abs(clusDuplicatedPointGlob.y() - clusOriginalPointGlob.y()));
2563 DistanceClustersZAftercuts[layerDuplicated]->Fill(abs(clusDuplicatedPointGlob.z() - clusOriginalPointGlob.z()));
2565 if (mVerboseOutput) {
2566 LOGP(info,
"Propagation ok");
2568 double rDCA = std::hypot(clusDuplicatedDCA[0], clusDuplicatedDCA[1]);
2571 if (rDCA < std::get<1>(clusID_rDCA_label)) {
2573 clusID_rDCA_label = {iClus, rDCA, labsDuplicated};
2575 clusID_rDCA_label = {iClus, rDCA, gsl::span<const o2::MCCompLabel>()};
2577 phiDuplicated = phiOriginal;
2579 etaDuplicated = eta;
2580 clusZ = clusOriginalPointGlob.z();
2583 std::cout <<
"Duplicated found with label: " << labsDuplicated[0] <<
" and phi: " << phiDuplicated << std::endl;
2584 clusDuplicated.print();
2585 std::cout <<
"-----" << std::endl;
2590 if (!adjacentFound) {
2592 std::cout <<
"No duplicated found but should exist" << std::endl;
2593 std::cout <<
"DCA cuts were: xy-> " <<
mDCACutsXY[layerOriginal][0] <<
" to " <<
mDCACutsXY[layerOriginal][1] <<
" and z-> " <<
mDCACutsZ[layerOriginal][0] <<
" to " <<
mDCACutsZ[layerOriginal][1] <<
"\n-----" << std::endl;
2595 std::cout <<
"No duplicated found and does not exist" << std::endl;
2599 std::cout <<
"-----" << std::endl;
2601 nDuplicatedClusters[layerOriginal]++;
2602 numPt[layerOriginal]->Fill(ptDuplicated);
2603 numPhi[layerOriginal]->Fill(phiDuplicated);
2604 numEta[layerOriginal]->Fill(etaDuplicated);
2605 mZvsPhiDUplicated[layerOriginal]->Fill(clusZ, phiDuplicated);
2608 bool isGood =
false;
2609 for (
auto lab : std::get<2>(clusID_rDCA_label)) {
2610 if (lab == tracklab) {
2612 numPtGood[layerOriginal]->Fill(ptDuplicated);
2613 numPhiGood[layerOriginal]->Fill(phiDuplicated);
2614 numEtaGood[layerOriginal]->Fill(etaDuplicated);
2619 numPtFake[layerOriginal]->Fill(ptDuplicated);
2620 numPhiFake[layerOriginal]->Fill(phiDuplicated);
2621 numEtaFake[layerOriginal]->Fill(etaDuplicated);
2629 std::cout <<
" Num of duplicated clusters L0: " << nDuplicatedClusters[0] <<
" N tracks selected: " << nTracksSelected[0] << std::endl;
2630 std::cout <<
" Num of duplicated clusters L1: " << nDuplicatedClusters[1] <<
" N tracks selected: " << nTracksSelected[1] << std::endl;
2631 std::cout <<
" Num of duplicated clusters L2: " << nDuplicatedClusters[2] <<
" N tracks selected: " << nTracksSelected[2] << std::endl;
2633 std::cout <<
" --------- N total clusters: " << totNClusters << std::endl;
2634 std::cout <<
" --------- N duplicated clusters: " << nDuplClusters << std::endl;