Bug fix (T. Virgili, D. Elia)
[u/mrichter/AliRoot.git] / ITS / AliITSMultReconstructor.cxx
CommitLineData
7ca4655f 1/**************************************************************************
eefb3acc 2 * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
7ca4655f 3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16/* $Id$ */
17
ac903f1b 18//____________________________________________________________________
19//
20// AliITSMultReconstructor - find clusters in the pixels (theta and
21// phi) and tracklets.
22//
23// These can be used to extract charged particles multiplcicity from the ITS.
24//
25// A tracklet consist of two ITS clusters, one in the first pixel
26// layer and one in the second. The clusters are associates if the
27// differencies in Phi (azimuth) and Zeta (longitudinal) are inside
28// a fiducial volume. In case of multiple candidates it is selected the
29// candidate with minimum distance in Phi.
de4c520e 30// The parameter AssociationChoice allows to control if two clusters
ac903f1b 31// in layer 2 can be associated to the same cluster in layer 1 or not.
02a95988 32// (TRUE means double associations exluded; default = TRUE)
ac903f1b 33//
968e8539 34// Two methods return the number of traklets and the number of clusters
35// in the first SPD layer (GetNTracklets GetNSingleClusters)
36//
ac903f1b 37// -----------------------------------------------------------------
38//
02a95988 39// NOTE: The cuts on phi and zeta depend on the interacting system (p-p
3ef75756 40// or Pb-Pb). Please, check the file AliITSMultReconstructor.h and be
41// sure that SetPhiWindow and SetZetaWindow are defined accordingly.
ac903f1b 42//
968e8539 43// Author : Tiziano Virgili
3ef75756 44//
f606f16a 45// Recent updates (D. Elia, INFN Bari):
46// - multiple association forbidden (fOnlyOneTrackletPerC2 = kTRUE)
47// - phi definition changed to ALICE convention (0,2*TMath::pi())
48// - cluster coordinates taken with GetGlobalXYZ()
ac903f1b 49//
f606f16a 50// fGeometry removed
ac903f1b 51//____________________________________________________________________
52
7ca4655f 53#include <TClonesArray.h>
54#include <TH1F.h>
55#include <TH2F.h>
56#include <TTree.h>
ac903f1b 57
7ca4655f 58#include "AliITSMultReconstructor.h"
b51872de 59#include "AliITSRecPoint.h"
ac903f1b 60#include "AliITSgeom.h"
61#include "AliLog.h"
62
63//____________________________________________________________________
0762f3a8 64ClassImp(AliITSMultReconstructor)
ac903f1b 65
3ef75756 66
ac903f1b 67//____________________________________________________________________
7537d03c 68AliITSMultReconstructor::AliITSMultReconstructor():
7537d03c 69fClustersLay1(0),
70fClustersLay2(0),
71fTracklets(0),
968e8539 72fSClusters(0),
7537d03c 73fAssociationFlag(0),
74fNClustersLay1(0),
75fNClustersLay2(0),
76fNTracklets(0),
968e8539 77fNSingleCluster(0),
7537d03c 78fPhiWindow(0),
79fZetaWindow(0),
80fOnlyOneTrackletPerC2(0),
81fHistOn(0),
82fhClustersDPhiAcc(0),
83fhClustersDThetaAcc(0),
84fhClustersDZetaAcc(0),
85fhClustersDPhiAll(0),
86fhClustersDThetaAll(0),
87fhClustersDZetaAll(0),
88fhDPhiVsDThetaAll(0),
89fhDPhiVsDThetaAcc(0),
90fhDPhiVsDZetaAll(0),
91fhDPhiVsDZetaAcc(0),
92fhetaTracklets(0),
93fhphiTracklets(0),
94fhetaClustersLay1(0),
95fhphiClustersLay1(0){
3ef75756 96 // Method to reconstruct the charged particles multiplicity with the
97 // SPD (tracklets).
ac903f1b 98
ac903f1b 99
100 SetHistOn();
101 SetPhiWindow();
102 SetZetaWindow();
103 SetOnlyOneTrackletPerC2();
104
105 fClustersLay1 = new Float_t*[300000];
106 fClustersLay2 = new Float_t*[300000];
107 fTracklets = new Float_t*[300000];
968e8539 108 fSClusters = new Float_t*[300000];
ac903f1b 109 fAssociationFlag = new Bool_t[300000];
110
111 for(Int_t i=0; i<300000; i++) {
de4c520e 112 fClustersLay1[i] = new Float_t[6];
113 fClustersLay2[i] = new Float_t[6];
0939e22a 114 fTracklets[i] = new Float_t[5];
968e8539 115 fSClusters[i] = new Float_t[2];
ac903f1b 116 fAssociationFlag[i] = kFALSE;
117 }
118
119 // definition of histograms
02a95988 120 fhClustersDPhiAcc = new TH1F("dphiacc", "dphi", 100,0.,0.1);
ddced3c8 121 fhClustersDPhiAcc->SetDirectory(0);
122 fhClustersDThetaAcc = new TH1F("dthetaacc","dtheta",100,-0.1,0.1);
123 fhClustersDThetaAcc->SetDirectory(0);
124 fhClustersDZetaAcc = new TH1F("dzetaacc","dzeta",100,-1.,1.);
125 fhClustersDZetaAcc->SetDirectory(0);
126
02a95988 127 fhDPhiVsDZetaAcc = new TH2F("dphiVsDzetaacc","",100,-1.,1.,100,0.,0.1);
ddced3c8 128 fhDPhiVsDZetaAcc->SetDirectory(0);
02a95988 129 fhDPhiVsDThetaAcc = new TH2F("dphiVsDthetaAcc","",100,-0.1,0.1,100,0.,0.1);
ac903f1b 130 fhDPhiVsDThetaAcc->SetDirectory(0);
131
02a95988 132 fhClustersDPhiAll = new TH1F("dphiall", "dphi", 100,0.0,0.5);
ddced3c8 133 fhClustersDPhiAll->SetDirectory(0);
134 fhClustersDThetaAll = new TH1F("dthetaall","dtheta",100,-0.5,0.5);
135 fhClustersDThetaAll->SetDirectory(0);
136 fhClustersDZetaAll = new TH1F("dzetaall","dzeta",100,-5.,5.);
137 fhClustersDZetaAll->SetDirectory(0);
138
02a95988 139 fhDPhiVsDZetaAll = new TH2F("dphiVsDzetaall","",100,-5.,5.,100,0.,0.5);
ddced3c8 140 fhDPhiVsDZetaAll->SetDirectory(0);
02a95988 141 fhDPhiVsDThetaAll = new TH2F("dphiVsDthetaAll","",100,-0.5,0.5,100,0.,0.5);
ddced3c8 142 fhDPhiVsDThetaAll->SetDirectory(0);
143
144 fhetaTracklets = new TH1F("etaTracklets", "eta", 100,-2.,2.);
96c2c35d 145 fhetaTracklets->SetDirectory(0);
f606f16a 146 fhphiTracklets = new TH1F("phiTracklets", "phi", 100, 0., 2*TMath::Pi());
96c2c35d 147 fhphiTracklets->SetDirectory(0);
ddced3c8 148 fhetaClustersLay1 = new TH1F("etaClustersLay1", "etaCl1", 100,-2.,2.);
96c2c35d 149 fhetaClustersLay1->SetDirectory(0);
f606f16a 150 fhphiClustersLay1 = new TH1F("phiClustersLay1", "phiCl1", 100, 0., 2*TMath::Pi());
96c2c35d 151 fhphiClustersLay1->SetDirectory(0);
ac903f1b 152}
ddced3c8 153
3ef75756 154//______________________________________________________________________
7537d03c 155AliITSMultReconstructor::AliITSMultReconstructor(const AliITSMultReconstructor &mr) : TObject(mr),
7537d03c 156fClustersLay1(mr.fClustersLay1),
157fClustersLay2(mr.fClustersLay2),
158fTracklets(mr.fTracklets),
968e8539 159fSClusters(mr.fSClusters),
7537d03c 160fAssociationFlag(mr.fAssociationFlag),
161fNClustersLay1(mr.fNClustersLay1),
162fNClustersLay2(mr.fNClustersLay2),
163fNTracklets(mr.fNTracklets),
968e8539 164fNSingleCluster(mr.fNSingleCluster),
7537d03c 165fPhiWindow(mr.fPhiWindow),
166fZetaWindow(mr.fZetaWindow),
167fOnlyOneTrackletPerC2(mr.fOnlyOneTrackletPerC2),
168fHistOn(mr.fHistOn),
169fhClustersDPhiAcc(mr.fhClustersDPhiAcc),
170fhClustersDThetaAcc(mr.fhClustersDThetaAcc),
171fhClustersDZetaAcc(mr.fhClustersDZetaAcc),
172fhClustersDPhiAll(mr.fhClustersDPhiAll),
173fhClustersDThetaAll(mr.fhClustersDThetaAll),
174fhClustersDZetaAll(mr.fhClustersDZetaAll),
175fhDPhiVsDThetaAll(mr.fhDPhiVsDThetaAll),
176fhDPhiVsDThetaAcc(mr.fhDPhiVsDThetaAcc),
177fhDPhiVsDZetaAll(mr.fhDPhiVsDZetaAll),
178fhDPhiVsDZetaAcc(mr.fhDPhiVsDZetaAcc),
179fhetaTracklets(mr.fhetaTracklets),
180fhphiTracklets(mr.fhphiTracklets),
181fhetaClustersLay1(mr.fhetaClustersLay1),
182fhphiClustersLay1(mr.fhphiClustersLay1) {
3ef75756 183 // Copy constructor
7537d03c 184
3ef75756 185}
186
187//______________________________________________________________________
7537d03c 188AliITSMultReconstructor& AliITSMultReconstructor::operator=(const AliITSMultReconstructor& mr){
3ef75756 189 // Assignment operator
7537d03c 190 this->~AliITSMultReconstructor();
191 new(this) AliITSMultReconstructor(mr);
3ef75756 192 return *this;
193}
194
195//______________________________________________________________________
196AliITSMultReconstructor::~AliITSMultReconstructor(){
197 // Destructor
1ba5b31c 198
199 // delete histograms
200 delete fhClustersDPhiAcc;
201 delete fhClustersDThetaAcc;
202 delete fhClustersDZetaAcc;
203 delete fhClustersDPhiAll;
204 delete fhClustersDThetaAll;
205 delete fhClustersDZetaAll;
206 delete fhDPhiVsDThetaAll;
207 delete fhDPhiVsDThetaAcc;
208 delete fhDPhiVsDZetaAll;
209 delete fhDPhiVsDZetaAcc;
210 delete fhetaTracklets;
211 delete fhphiTracklets;
212 delete fhetaClustersLay1;
213 delete fhphiClustersLay1;
214
215 // delete arrays
216 for(Int_t i=0; i<300000; i++) {
217 delete [] fClustersLay1[i];
218 delete [] fClustersLay2[i];
219 delete [] fTracklets[i];
968e8539 220 delete [] fSClusters[i];
ddced3c8 221 }
1ba5b31c 222 delete [] fClustersLay1;
223 delete [] fClustersLay2;
224 delete [] fTracklets;
968e8539 225 delete [] fSClusters;
1ba5b31c 226
227 delete [] fAssociationFlag;
ddced3c8 228}
ac903f1b 229
230//____________________________________________________________________
231void
232AliITSMultReconstructor::Reconstruct(TTree* clusterTree, Float_t* vtx, Float_t* /* vtxRes*/) {
233 //
234 // - calls LoadClusterArray that finds the position of the clusters
235 // (in global coord)
236 // - convert the cluster coordinates to theta, phi (seen from the
237 // interaction vertex). The third coordinate is used for ....
238 // - makes an array of tracklets
239 //
240 // After this method has been called, the clusters of the two layers
241 // and the tracklets can be retrieved by calling the Get'er methods.
242
ac903f1b 243 // reset counters
244 fNClustersLay1 = 0;
245 fNClustersLay2 = 0;
246 fNTracklets = 0;
968e8539 247 fNSingleCluster = 0;
ac903f1b 248 // loading the clusters
249 LoadClusterArrays(clusterTree);
3ef75756 250
ac903f1b 251 // find the tracklets
252 AliDebug(1,"Looking for tracklets... ");
253
254 //###########################################################
255 // Loop on layer 1 : finding theta, phi and z
256 for (Int_t iC1=0; iC1<fNClustersLay1; iC1++) {
257 Float_t x = fClustersLay1[iC1][0] - vtx[0];
258 Float_t y = fClustersLay1[iC1][1] - vtx[1];
259 Float_t z = fClustersLay1[iC1][2] - vtx[2];
ddced3c8 260
ac903f1b 261 Float_t r = TMath::Sqrt(TMath::Power(x,2) +
262 TMath::Power(y,2) +
263 TMath::Power(z,2));
264
eefb3acc 265 fClustersLay1[iC1][0] = TMath::ACos(z/r); // Store Theta
266 fClustersLay1[iC1][1] = TMath::Pi() + TMath::ATan2(-y,-x); // Store Phi
267 fClustersLay1[iC1][2] = z/r; // Store scaled z
ddced3c8 268 if (fHistOn) {
269 Float_t eta=fClustersLay1[iC1][0];
270 eta= TMath::Tan(eta/2.);
271 eta=-TMath::Log(eta);
272 fhetaClustersLay1->Fill(eta);
de4c520e 273 fhphiClustersLay1->Fill(fClustersLay1[iC1][1]);
ddced3c8 274 }
96c2c35d 275 }
ac903f1b 276
277 // Loop on layer 2 : finding theta, phi and r
278 for (Int_t iC2=0; iC2<fNClustersLay2; iC2++) {
279 Float_t x = fClustersLay2[iC2][0] - vtx[0];
280 Float_t y = fClustersLay2[iC2][1] - vtx[1];
281 Float_t z = fClustersLay2[iC2][2] - vtx[2];
ddced3c8 282
ac903f1b 283 Float_t r = TMath::Sqrt(TMath::Power(x,2) +
284 TMath::Power(y,2) +
285 TMath::Power(z,2));
286
eefb3acc 287 fClustersLay2[iC2][0] = TMath::ACos(z/r); // Store Theta
288 fClustersLay2[iC2][1] = TMath::Pi() + TMath::ATan2(-y,-x); // Store Phi
289 fClustersLay2[iC2][2] = z; // Store z
ac903f1b 290
ddced3c8 291 // this only needs to be initialized for the fNClustersLay2 first associations
ac903f1b 292 fAssociationFlag[iC2] = kFALSE;
293 }
294
295 //###########################################################
296 // Loop on layer 1
297 for (Int_t iC1=0; iC1<fNClustersLay1; iC1++) {
298
299 // reset of variables for multiple candidates
ddced3c8 300 Int_t iC2WithBestDist = 0; // reset
3ef75756 301 Float_t distmin = 100.; // just to put a huge number!
ddced3c8 302 Float_t dPhimin = 0.; // Used for histograms only!
303 Float_t dThetamin = 0.; // Used for histograms only!
304 Float_t dZetamin = 0.; // Used for histograms only!
ac903f1b 305
306 // Loop on layer 2
307 for (Int_t iC2=0; iC2<fNClustersLay2; iC2++) {
308
309 // The following excludes double associations
310 if (!fAssociationFlag[iC2]) {
311
312 // find the difference in angles
313 Float_t dTheta = fClustersLay2[iC2][0] - fClustersLay1[iC1][0];
02a95988 314 Float_t dPhi = TMath::Abs(fClustersLay2[iC2][1] - fClustersLay1[iC1][1]);
315 // take into account boundary condition
316 if (dPhi>TMath::Pi()) dPhi=2.*TMath::Pi()-dPhi;
317
ac903f1b 318 // find the difference in z (between linear projection from layer 1
319 // and the actual point: Dzeta= z1/r1*r2 -z2)
ddced3c8 320 Float_t r2 = fClustersLay2[iC2][2]/TMath::Cos(fClustersLay2[iC2][0]);
de4c520e 321 Float_t dZeta = fClustersLay1[iC1][2]*r2 - fClustersLay2[iC2][2];
ddced3c8 322
323 if (fHistOn) {
324 fhClustersDPhiAll->Fill(dPhi);
325 fhClustersDThetaAll->Fill(dTheta);
326 fhClustersDZetaAll->Fill(dZeta);
ac903f1b 327 fhDPhiVsDThetaAll->Fill(dTheta, dPhi);
ddced3c8 328 fhDPhiVsDZetaAll->Fill(dZeta, dPhi);
ac903f1b 329 }
330 // make "elliptical" cut in Phi and Zeta!
331 Float_t d = TMath::Sqrt(TMath::Power(dPhi/fPhiWindow,2) + TMath::Power(dZeta/fZetaWindow,2));
3ef75756 332
ac903f1b 333 if (d>1) continue;
334
ddced3c8 335 //look for the minimum distance: the minimum is in iC2WithBestDist
3ef75756 336 if (TMath::Sqrt(dZeta*dZeta+(r2*dPhi*r2*dPhi)) < distmin ) {
337 distmin=TMath::Sqrt(dZeta*dZeta + (r2*dPhi*r2*dPhi));
ddced3c8 338 dPhimin = dPhi;
339 dThetamin = dTheta;
340 dZetamin = dZeta;
341 iC2WithBestDist = iC2;
ac903f1b 342 }
343 }
344 } // end of loop over clusters in layer 2
345
3ef75756 346 if (distmin<100) { // This means that a cluster in layer 2 was found that mathes with iC1
347
348 if (fHistOn) {
de4c520e 349 fhClustersDPhiAcc->Fill(dPhimin);
3ef75756 350 fhClustersDThetaAcc->Fill(dThetamin);
351 fhClustersDZetaAcc->Fill(dZetamin);
352 fhDPhiVsDThetaAcc->Fill(dThetamin, dPhimin);
353 fhDPhiVsDZetaAcc->Fill(dZetamin, dPhimin);
354 }
ac903f1b 355
ddced3c8 356 if (fOnlyOneTrackletPerC2) fAssociationFlag[iC2WithBestDist] = kTRUE; // flag the association
ac903f1b 357
358 // store the tracklet
359
de4c520e 360 // use the theta from the clusters in the first layer
ddced3c8 361 fTracklets[fNTracklets][0] = fClustersLay1[iC1][0];
de4c520e 362 // use the phi from the clusters in the first layer
ac903f1b 363 fTracklets[fNTracklets][1] = fClustersLay1[iC1][1];
35e2e4eb 364 // store the difference between phi1 and phi2
de4c520e 365 fTracklets[fNTracklets][2] = fClustersLay1[iC1][1] - fClustersLay2[iC2WithBestDist][1];
366
35e2e4eb 367 // define dphi in the range [0,pi] with proper sign (track charge correlated)
368 if (fTracklets[fNTracklets][2] > TMath::Pi())
369 fTracklets[fNTracklets][2] = fTracklets[fNTracklets][2]-2.*TMath::Pi();
370 if (fTracklets[fNTracklets][2] < -TMath::Pi())
371 fTracklets[fNTracklets][2] = fTracklets[fNTracklets][2]+2.*TMath::Pi();
372
de4c520e 373 // find label
0939e22a 374 // if equal label in both clusters found this label is assigned
375 // if no equal label can be found the first labels of the L1 AND L2 cluster are assigned
de4c520e 376 Int_t label1 = 0;
377 Int_t label2 = 0;
378 while (label2 < 3)
379 {
380 if ((Int_t) fClustersLay1[iC1][3+label1] != -2 && (Int_t) fClustersLay1[iC1][3+label1] == (Int_t) fClustersLay2[iC2WithBestDist][3+label2])
381 break;
de4c520e 382 label1++;
383 if (label1 == 3)
384 {
385 label1 = 0;
386 label2++;
387 }
388 }
389
390 if (label2 < 3)
391 {
392 AliDebug(AliLog::kDebug, Form("Found label %d == %d for tracklet candidate %d\n", (Int_t) fClustersLay1[iC1][3+label1], (Int_t) fClustersLay2[iC2WithBestDist][3+label2], fNTracklets));
393 fTracklets[fNTracklets][3] = fClustersLay1[iC1][3+label1];
0939e22a 394 fTracklets[fNTracklets][4] = fClustersLay2[iC2WithBestDist][3+label2];
de4c520e 395 }
396 else
397 {
398 AliDebug(AliLog::kDebug, Form("Did not find label %d %d %d %d %d %d for tracklet candidate %d\n", (Int_t) fClustersLay1[iC1][3], (Int_t) fClustersLay1[iC1][4], (Int_t) fClustersLay1[iC1][5], (Int_t) fClustersLay2[iC2WithBestDist][3], (Int_t) fClustersLay2[iC2WithBestDist][4], (Int_t) fClustersLay2[iC2WithBestDist][5], fNTracklets));
0939e22a 399 fTracklets[fNTracklets][3] = fClustersLay1[iC1][3];
400 fTracklets[fNTracklets][4] = fClustersLay2[iC2WithBestDist][3];
de4c520e 401 }
402
3ef75756 403 if (fHistOn) {
404 Float_t eta=fTracklets[fNTracklets][0];
405 eta= TMath::Tan(eta/2.);
406 eta=-TMath::Log(eta);
407 fhetaTracklets->Fill(eta);
408 fhphiTracklets->Fill(fTracklets[fNTracklets][1]);
409 }
ac903f1b 410
3ef75756 411 AliDebug(1,Form(" Adding tracklet candidate %d ", fNTracklets));
412 AliDebug(1,Form(" Cl. %d of Layer 1 and %d of Layer 2", iC1,
413 iC2WithBestDist));
414 fNTracklets++;
ac903f1b 415 }
3ef75756 416
417 // Delete the following else if you do not want to save Clusters!
418
de4c520e 419 else { // This means that the cluster has not been associated
3ef75756 420
421 // store the cluster
422
968e8539 423 fSClusters[fNSingleCluster][0] = fClustersLay1[iC1][0];
424 fSClusters[fNSingleCluster][1] = fClustersLay1[iC1][1];
de4c520e 425 AliDebug(1,Form(" Adding a single cluster %d (cluster %d of layer 1)",
968e8539 426 fNSingleCluster, iC1));
427 fNSingleCluster++;
3ef75756 428 }
429
ac903f1b 430 } // end of loop over clusters in layer 1
431
432 AliDebug(1,Form("%d tracklets found", fNTracklets));
433}
434
435//____________________________________________________________________
436void
437AliITSMultReconstructor::LoadClusterArrays(TTree* itsClusterTree) {
438 // This method
439 // - gets the clusters from the cluster tree
440 // - convert them into global coordinates
441 // - store them in the internal arrays
442
443 AliDebug(1,"Loading clusters ...");
444
445 fNClustersLay1 = 0;
446 fNClustersLay2 = 0;
447
b51872de 448 TClonesArray* itsClusters = new TClonesArray("AliITSRecPoint");
449 TBranch* itsClusterBranch=itsClusterTree->GetBranch("ITSRecPoints");
ddced3c8 450
ac903f1b 451 itsClusterBranch->SetAddress(&itsClusters);
ddced3c8 452
ac903f1b 453 Int_t nItsSubs = (Int_t)itsClusterTree->GetEntries();
f606f16a 454 Float_t cluGlo[3]={0.,0.,0.};
ddced3c8 455
ac903f1b 456 // loop over the its subdetectors
457 for (Int_t iIts=0; iIts < nItsSubs; iIts++) {
458
459 if (!itsClusterTree->GetEvent(iIts))
460 continue;
461
462 Int_t nClusters = itsClusters->GetEntriesFast();
463
ac903f1b 464 // loop over clusters
465 while(nClusters--) {
de4c520e 466 AliITSRecPoint* cluster = (AliITSRecPoint*)itsClusters->UncheckedAt(nClusters);
ac903f1b 467
468 if (cluster->GetLayer()>1)
469 continue;
470
f606f16a 471 cluster->GetGlobalXYZ(cluGlo);
472 Float_t x = cluGlo[0];
473 Float_t y = cluGlo[1];
474 Float_t z = cluGlo[2];
ac903f1b 475
476 if (cluster->GetLayer()==0) {
477 fClustersLay1[fNClustersLay1][0] = x;
478 fClustersLay1[fNClustersLay1][1] = y;
479 fClustersLay1[fNClustersLay1][2] = z;
de4c520e 480 for (Int_t i=0; i<3; i++)
481 fClustersLay1[fNClustersLay1][3+i] = cluster->GetLabel(i);
ac903f1b 482 fNClustersLay1++;
483 }
de4c520e 484 if (cluster->GetLayer()==1) {
ac903f1b 485 fClustersLay2[fNClustersLay2][0] = x;
486 fClustersLay2[fNClustersLay2][1] = y;
487 fClustersLay2[fNClustersLay2][2] = z;
de4c520e 488 for (Int_t i=0; i<3; i++)
489 fClustersLay2[fNClustersLay2][3+i] = cluster->GetLabel(i);
ac903f1b 490 fNClustersLay2++;
491 }
492
493 }// end of cluster loop
494 } // end of its "subdetector" loop
495
cedf398d 496 if (itsClusters) {
497 itsClusters->Delete();
498 delete itsClusters;
499 itsClusters = 0;
500 }
ac903f1b 501 AliDebug(1,Form("(clusters in layer 1 : %d, layer 2: %d)",fNClustersLay1,fNClustersLay2));
502}
503//____________________________________________________________________
504void
505AliITSMultReconstructor::SaveHists() {
3ef75756 506 // This method save the histograms on the output file
507 // (only if fHistOn is TRUE).
ac903f1b 508
509 if (!fHistOn)
510 return;
511
ddced3c8 512 fhClustersDPhiAll->Write();
513 fhClustersDThetaAll->Write();
514 fhClustersDZetaAll->Write();
ac903f1b 515 fhDPhiVsDThetaAll->Write();
ddced3c8 516 fhDPhiVsDZetaAll->Write();
517
518 fhClustersDPhiAcc->Write();
519 fhClustersDThetaAcc->Write();
520 fhClustersDZetaAcc->Write();
ac903f1b 521 fhDPhiVsDThetaAcc->Write();
ddced3c8 522 fhDPhiVsDZetaAcc->Write();
523
524 fhetaTracklets->Write();
525 fhphiTracklets->Write();
526 fhetaClustersLay1->Write();
527 fhphiClustersLay1->Write();
ac903f1b 528}
de4c520e 529
eefb3acc 530