public method requested by AMORE
[u/mrichter/AliRoot.git] / TOF / AliTOFtrackerV1.cxx
CommitLineData
d686d062 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
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//--------------------------------------------------------------------//
17// //
3a646035 18// AliTOFtrackerV1 Class //
d686d062 19// Task: Perform association of the ESD tracks to TOF Clusters //
20// and Update ESD track with associated TOF Cluster parameters //
21// //
22// -- Authors : S. Arcelli, C. Zampolli (Bologna University and INFN) //
23// -- Contacts: Annalisa.De.Caro@cern.ch //
24// -- : Chiara.Zampolli@bo.infn.it //
25// -- : Silvia.Arcelli@bo.infn.it //
26// //
27//--------------------------------------------------------------------//
28
29#include <Rtypes.h>
30#include <TROOT.h>
31
32#include <TClonesArray.h>
33#include <TTree.h>
34#include <TFile.h>
35#include <TH1F.h>
36#include <TH2F.h>
5c7c93fa 37#include <TSeqCollection.h>
d686d062 38
d686d062 39#include "AliESDtrack.h"
40#include "AliESDEvent.h"
41#include "AliLog.h"
42#include "AliTrackPointArray.h"
5c7c93fa 43#include "AliGeomManager.h"
44#include "AliCDBManager.h"
d686d062 45
d686d062 46#include "AliTOFRecoParam.h"
3a646035 47#include "AliTOFReconstructor.h"
d686d062 48#include "AliTOFcluster.h"
ca270b6d 49#include "AliTOFGeometry.h"
d686d062 50#include "AliTOFtrackerV1.h"
51#include "AliTOFtrack.h"
5c7c93fa 52#include "AliTOFpidESD.h"
d0c2872c 53
d686d062 54extern TROOT *gROOT;
55
56ClassImp(AliTOFtrackerV1)
57
58//_____________________________________________________________________________
59AliTOFtrackerV1::AliTOFtrackerV1():
60 fRecoParam(0x0),
d686d062 61 fPid(0x0),
62 fN(0),
63 fNseeds(0),
64 fNseedsTOF(0),
65 fngoodmatch(0),
66 fnbadmatch(0),
67 fnunmatch(0),
68 fnmatch(0),
b42a5ea1 69 fTracks(new TClonesArray("AliTOFtrack")),
70 fSeeds(new TClonesArray("AliESDtrack")),
d686d062 71 fHDigClusMap(0x0),
72 fHDigNClus(0x0),
73 fHDigClusTime(0x0),
74 fHDigClusToT(0x0),
75 fHRecNClus(0x0),
76 fHRecChi2(0x0),
77 fHRecDistZ(0x0),
78 fHRecSigYVsP(0x0),
79 fHRecSigZVsP(0x0),
80 fHRecSigYVsPWin(0x0),
81 fHRecSigZVsPWin(0x0)
82 {
83 //AliTOFtrackerV1 main Ctor
3a646035 84
d686d062 85 InitCheckHists();
86
87}
88//_____________________________________________________________________________
d686d062 89AliTOFtrackerV1::~AliTOFtrackerV1() {
90 //
91 // Dtor
92 //
93
94 SaveCheckHists();
95
5d456bcd 96 if(!(AliCDBManager::Instance()->GetCacheFlag())){
97 delete fRecoParam;
98 }
d686d062 99 delete fPid;
100 delete fHDigClusMap;
101 delete fHDigNClus;
102 delete fHDigClusTime;
103 delete fHDigClusToT;
104 delete fHRecNClus;
105 delete fHRecChi2;
106 delete fHRecDistZ;
107 delete fHRecSigYVsP;
108 delete fHRecSigZVsP;
109 delete fHRecSigYVsPWin;
110 delete fHRecSigZVsPWin;
b42a5ea1 111 if (fTracks){
112 fTracks->Delete();
113 delete fTracks;
114 fTracks=0x0;
115 }
116 if (fSeeds){
117 fSeeds->Delete();
118 delete fSeeds;
119 fSeeds=0x0;
120 }
d686d062 121}
122//_____________________________________________________________________________
123Int_t AliTOFtrackerV1::PropagateBack(AliESDEvent* event) {
124 //
125 // Gets seeds from ESD event and Match with TOF Clusters
126 //
127
3a646035 128 // initialize RecoParam for current event
129
130 AliInfo("Initializing params for TOF... ");
131
132 fRecoParam = AliTOFReconstructor::GetRecoParam(); // instantiate reco param from STEER...
90b234fe 133
3a646035 134 if (fRecoParam == 0x0) {
135 AliFatal("No Reco Param found for TOF!!!");
136 }
137 //fRecoParam->Dump();
a825d829 138 //if(fRecoParam->GetApplyPbPbCuts())fRecoParam=fRecoParam->GetPbPbparam();
90b234fe 139 //fRecoParam->PrintParameters();
140
3a646035 141 Double_t parPID[2];
142 parPID[0]=fRecoParam->GetTimeResolution();
143 parPID[1]=fRecoParam->GetTimeNSigma();
144 fPid=new AliTOFpidESD(parPID);
d686d062 145
146 //Initialise some counters
147
148 fNseeds=0;
149 fNseedsTOF=0;
150 fngoodmatch=0;
151 fnbadmatch=0;
152 fnunmatch=0;
153 fnmatch=0;
154
155 Int_t ntrk=event->GetNumberOfTracks();
156 fNseeds = ntrk;
d686d062 157 TClonesArray &aESDTrack = *fSeeds;
158
159
160 //Load ESD tracks into a local Array of ESD Seeds
161
162 for (Int_t i=0; i<fNseeds; i++) {
163 AliESDtrack *t=event->GetTrack(i);
164 new(aESDTrack[i]) AliESDtrack(*t);
165 }
166
167 //Prepare ESD tracks candidates for TOF Matching
168 CollectESD();
169
170 //Matching Step
171 MatchTracks();
172
173 AliInfo(Form("Number of matched tracks: %d",fnmatch));
174 AliInfo(Form("Number of good matched tracks: %d",fngoodmatch));
175 AliInfo(Form("Number of bad matched tracks: %d",fnbadmatch));
176
177 //Update the matched ESD tracks
178
179 for (Int_t i=0; i<ntrk; i++) {
180 AliESDtrack *t=event->GetTrack(i);
181 AliESDtrack *seed =(AliESDtrack*)fSeeds->UncheckedAt(i);
6819758a 182
af61c656 183 if ( (seed->GetStatus()&AliESDtrack::kTOFin)!=0 ) {
184 t->SetStatus(AliESDtrack::kTOFin);
185 //if(seed->GetTOFsignal()>0){
186 if ( (seed->GetStatus()&AliESDtrack::kTOFout)!=0 ) {
187 t->SetStatus(AliESDtrack::kTOFout);
188 t->SetTOFsignal(seed->GetTOFsignal());
189 t->SetTOFcluster(seed->GetTOFcluster());
190 t->SetTOFsignalToT(seed->GetTOFsignalToT());
191 t->SetTOFsignalRaw(seed->GetTOFsignalRaw());
192 t->SetTOFsignalDz(seed->GetTOFsignalDz());
193 t->SetTOFCalChannel(seed->GetTOFCalChannel());
194 Int_t tlab[3]; seed->GetTOFLabel(tlab);
195 t->SetTOFLabel(tlab);
196 AliTOFtrack *track = new AliTOFtrack(*seed);
197 t->UpdateTrackParams(track,AliESDtrack::kTOFout); // to be checked - AdC
198 delete track;
199
200 Double_t time[10]; t->GetIntegratedTimes(time);
53884c34 201 AliDebug(2,Form(" %6d %f %f %f %f %6d %3d %f %f %f %f %f %f",
af61c656 202 i,
203 t->GetTOFsignalRaw(),
204 t->GetTOFsignal(),
205 t->GetTOFsignalToT(),
206 t->GetTOFsignalDz(),
207 t->GetTOFCalChannel(),
208 t->GetTOFcluster(),
209 t->GetIntegratedLength(),
210 time[0], time[1], time[2], time[3], time[4]
211 )
212 );
213 }
d686d062 214 }
215 }
216
217 //Handle Time Zero information
218
219 Double_t timeZero=0.;
220 Double_t timeZeroMax=99999.;
221 Bool_t usetimeZero = fRecoParam->UseTimeZero();
222 Bool_t timeZeroFromT0 = fRecoParam->GetTimeZerofromT0();
223 Bool_t timeZeroFromTOF = fRecoParam->GetTimeZerofromTOF();
224
53884c34 225 AliDebug(2,Form("Use Time Zero?: %d",usetimeZero));
226 AliDebug(2,Form("Time Zero from T0? : %d",timeZeroFromT0));
227 AliDebug(2,Form("Time Zero From TOF? : %d",timeZeroFromTOF));
d686d062 228
229 if(usetimeZero){
230 if(timeZeroFromT0){
231 timeZero=GetTimeZerofromT0(event);
232 }
233 if(timeZeroFromTOF && (timeZero>timeZeroMax || !timeZeroFromT0)){
234 timeZero=GetTimeZerofromTOF(event);
235 }
236 }
237 AliDebug(2,Form("time Zero used in PID: %f",timeZero));
238 //Make TOF PID
239 fPid->MakePID(event,timeZero);
240
b42a5ea1 241 fSeeds->Clear();
242 fTracks->Clear();
d686d062 243 return 0;
244
245}
246//_________________________________________________________________________
247void AliTOFtrackerV1::CollectESD() {
248 //prepare the set of ESD tracks to be matched to clusters in TOF
249
250 Int_t seedsTOF1=0;
251 Int_t seedsTOF2=0;
252
d686d062 253 TClonesArray &aTOFTrack = *fTracks;
254 for (Int_t i=0; i<fNseeds; i++) {
255
256 AliESDtrack *t =(AliESDtrack*)fSeeds->UncheckedAt(i);
257 if ((t->GetStatus()&AliESDtrack::kTPCout)==0)continue;
258
d686d062 259 AliTOFtrack *track = new AliTOFtrack(*t); // New
af61c656 260 Float_t x = (Float_t)track->GetX(); //New
261
262 // TRD 'good' tracks, already propagated at 371 cm
263 if ( ( (t->GetStatus()&AliESDtrack::kTRDout)!=0 ) &&
264 ( x >= AliTOFGeometry::Rmin() ) ) {
265 if ( track->PropagateToInnerTOF() ) {
266
267 AliDebug(1,Form(" TRD propagated track till rho = %fcm."
268 " And then the track has been propagated till rho = %fcm.",
269 x, (Float_t)track->GetX()));
270
271 track->SetSeedIndex(i);
272 t->UpdateTrackParams(track,AliESDtrack::kTOFin);
273 new(aTOFTrack[fNseedsTOF]) AliTOFtrack(*track);
274 fNseedsTOF++;
275 seedsTOF1++;
276 }
d686d062 277 delete track;
278 }
279
af61c656 280 // Propagate the rest of TPCbp
d686d062 281 else {
af61c656 282 if ( track->PropagateToInnerTOF() ) {
283
284 AliDebug(1,Form(" TRD propagated track till rho = %fcm."
285 " And then the track has been propagated till rho = %fcm.",
286 x, (Float_t)track->GetX()));
287
d686d062 288 track->SetSeedIndex(i);
af61c656 289 t->UpdateTrackParams(track,AliESDtrack::kTOFin);
d686d062 290 new(aTOFTrack[fNseedsTOF]) AliTOFtrack(*track);
291 fNseedsTOF++;
292 seedsTOF2++;
293 }
294 delete track;
295 }
296 }
297
6819758a 298 AliInfo(Form("Number of TOF seeds %d",fNseedsTOF));
299 AliInfo(Form("Number of TOF seeds Type 1 %d",seedsTOF1));
300 AliInfo(Form("Number of TOF seeds Type 2 %d",seedsTOF2));
d686d062 301
302 // Sort according uncertainties on track position
303 fTracks->Sort();
304
305}
306//_________________________________________________________________________
307void AliTOFtrackerV1::MatchTracks( ){
308 //
309 //Match ESD tracks to clusters in TOF
310 //
311
312
313 // Parameters regulating the reconstruction
ca270b6d 314 Float_t dY=AliTOFGeometry::XPad();
315 Float_t dZ=AliTOFGeometry::ZPad();
d686d062 316
6819758a 317 const Float_t kTimeOffset = 32.; // time offset for tracking algorithm [ps]
318
3da9d64f 319 const Int_t kncmax = 100;
d686d062 320 Float_t sensRadius = fRecoParam->GetSensRadius();
321 Float_t scaleFact = fRecoParam->GetWindowScaleFact();
322 Float_t dyMax=fRecoParam->GetWindowSizeMaxY();
323 Float_t dzMax=fRecoParam->GetWindowSizeMaxZ();
324 Double_t maxChi2=fRecoParam->GetMaxChi2();
325 Bool_t timeWalkCorr = fRecoParam->GetTimeWalkCorr();
326 AliDebug(1,"++++++++++++++TOF Reconstruction Parameters:++++++++++++ \n");
327 AliDebug(1,Form("TOF sens radius: %f",sensRadius));
328 AliDebug(1,Form("TOF Window scale factor: %f",scaleFact));
329 AliDebug(1,Form("TOF Window max dy: %f",dyMax));
330 AliDebug(1,Form("TOF Window max dz: %f",dzMax));
331 AliDebug(1,Form("TOF Max Chi2: %f",maxChi2));
332 AliDebug(1,Form("Time Walk Correction? : %d",timeWalkCorr));
333
334
335 //The matching loop
d686d062 336 for (Int_t iseed=0; iseed<fNseedsTOF; iseed++) {
337
338 AliTOFtrack *track =(AliTOFtrack*)fTracks->UncheckedAt(iseed);
339 AliESDtrack *t =(AliESDtrack*)fSeeds->UncheckedAt(track->GetSeedIndex());
af61c656 340 //if ( t->GetTOFsignal()>0. ) continue;
341 if ( (t->GetStatus()&AliESDtrack::kTOFout)!=0 ) continue;
d686d062 342 AliTOFtrack *trackTOFin =new AliTOFtrack(*track);
343
344 // Determine a window around the track
345 Double_t x,par[5]; trackTOFin->GetExternalParameters(x,par);
346 Double_t cov[15]; trackTOFin->GetExternalCovariance(cov);
347
53884c34 348 if (cov[0]<0. || cov[2]<0.) {
349 AliWarning(Form("Very strange track (%d)! At least one of its covariance matrix diagonal elements is negative!",iseed));
350 delete trackTOFin;
351 continue;
352 }
353
d686d062 354 Double_t z = par[1];
3a646035 355 Double_t dz = scaleFact*3.*TMath::Sqrt(cov[2]+dZ*dZ/12.);
d686d062 356 Double_t dphi = scaleFact*3.*TMath::Sqrt(cov[0]+dY*dY/12.)/sensRadius;
357
358 Double_t phi=TMath::ATan2(par[0],x) + trackTOFin->GetAlpha();
359 if (phi<-TMath::Pi())phi+=2*TMath::Pi();
360 if (phi>=TMath::Pi())phi-=2*TMath::Pi();
361
362 //upper limit on window's size.
363 if(dz> dzMax) dz=dzMax;
364 if(dphi*sensRadius> dyMax) dphi=dyMax/sensRadius;
365
d686d062 366 // find the clusters inside the selected window
367 Int_t nc=0;
3da9d64f 368 AliTOFcluster *clusters[kncmax]; // pointers to the clusters in the window
369 Int_t index[kncmax];//to keep track of the cluster index
d686d062 370 for (Int_t k=FindClusterIndex(z-dz); k<fN; k++) {
371 AliTOFcluster *c=fClusters[k];
c0b60ae7 372 // if(nc>kncmax)break; /* R+ fix (buffer overflow) */
53884c34 373 if (nc>=kncmax) {
374 AliWarning("No more matchable clusters can be stored! Please, increase the corresponding vectors size.");
375 break; /* R+ fix (buffer overflow protection) */
376 }
d686d062 377 if(c->GetZ() > z+dz) break;
378 if(c->IsUsed()) continue;
17149e6b 379 if(!c->GetStatus()) {
53884c34 380 AliDebug(1,"Cluster in channel declared bad!");
381 continue; // skip bad channels as declared in OCDB
17149e6b 382 }
d686d062 383 Float_t xyz[3]; c->GetGlobalXYZ(xyz);
384 Double_t clPhi=TMath::ATan2(xyz[1],xyz[0]);
385 Double_t dph=TMath::Abs(clPhi-phi);
386 if (dph>TMath::Pi()) dph-=2.*TMath::Pi();
387 if (TMath::Abs(dph)>dphi) continue;
388 clusters[nc]=c;
389 index[nc] = k;
390 nc++;
391 }
392
53884c34 393 AliDebug(1,Form(" Number of matchable TOF clusters for the track number %d: %d",iseed,nc));
394
8dacd1bb 395 //start propagation: go to the average TOF pad middle plane at ~379.5 cm
d686d062 396
397 Float_t xTOF = sensRadius;
ca270b6d 398 Double_t ymax = xTOF*TMath::Tan(0.5*AliTOFGeometry::GetAlpha());
d686d062 399 Bool_t skip = kFALSE;
400 Double_t ysect = trackTOFin->GetYat(xTOF,skip);
401 if (skip) break;
402 if (ysect > ymax) {
ca270b6d 403 if (!trackTOFin->Rotate(AliTOFGeometry::GetAlpha())) {
d686d062 404 break;
405 }
406 } else if (ysect <-ymax) {
13c769b4 407 if (!trackTOFin->Rotate(-AliTOFGeometry::GetAlpha())) {
d686d062 408 break;
409 }
410 }
411 if(!trackTOFin->PropagateTo(xTOF)) {
412 break;
413 }
414
415
416 AliTOFcluster *bestCluster=0;
417 Double_t bestChi2=maxChi2;
418 Int_t idclus=-1;
c0b60ae7 419 // for (Int_t i=0; i<nc; i++){ /* R+ fix (unsafe) */
420 for (Int_t i=0; i<nc && i<kncmax; i++){ /* R+ fix (buffer overflow protection) */
d686d062 421 AliTOFcluster *c=clusters[i]; // one of the preselected clusters
422 Double_t chi2=trackTOFin->GetPredictedChi2((AliCluster3D*)c);
423 if (chi2 >= bestChi2) continue;
424 bestChi2=chi2;
425 bestCluster=c;
426 idclus=index[i];
427 }
428
429 if (!bestCluster) { // no matching , go to the next track
430 fnunmatch++;
431 delete trackTOFin;
432 continue;
433 }
434
435 fnmatch++;
32ead898 436
3a646035 437 AliDebug(2, Form("%7i %7i %10i %10i %10i %10i %7i",
32ead898 438 iseed,
3a646035 439 fnmatch-1,
32ead898 440 TMath::Abs(trackTOFin->GetLabel()),
441 bestCluster->GetLabel(0),
442 bestCluster->GetLabel(1),
3a646035 443 bestCluster->GetLabel(2),
444 idclus)); // AdC
32ead898 445
d686d062 446 bestCluster->Use();
447 if (
448 (bestCluster->GetLabel(0)==TMath::Abs(trackTOFin->GetLabel()))
449 ||
450 (bestCluster->GetLabel(1)==TMath::Abs(trackTOFin->GetLabel()))
451 ||
452 (bestCluster->GetLabel(2)==TMath::Abs(trackTOFin->GetLabel()))
453 ) {
454 fngoodmatch++;
6819758a 455 AliDebug(2,Form(" track label good %5d",trackTOFin->GetLabel()));
d686d062 456
457 }
458 else{
459 fnbadmatch++;
6819758a 460 AliDebug(2,Form(" track label bad %5d",trackTOFin->GetLabel()));
d686d062 461 }
462
463 //Propagate the track to the best matched cluster
464 trackTOFin->PropagateTo(bestCluster);
465
77a9ea9a 466 // Fill the track residual histograms.
467 FillResiduals(trackTOFin,bestCluster,kFALSE);
d686d062 468
469 //now take the local distance in Z from the pad center for time walk correction
ca270b6d 470 Float_t tiltangle = AliTOFGeometry::GetAngles(bestCluster->GetDetInd(1),bestCluster->GetDetInd(2))*TMath::DegToRad();
6819758a 471 Double_t dzTW=trackTOFin->GetZ()-bestCluster->GetZ(); // in cm - in the ALICE RF -
472 dzTW/=TMath::Cos(tiltangle); // from ALICE/tracking RF to pad RF (1)
473 dzTW=-dzTW; // from ALICE/tracking RF to pad RF (2)
474 if (tiltangle!=0.) AliDebug(2,Form(" rho_track = %f --- rho_cluster = %f ",trackTOFin->GetX(),bestCluster->GetX()));
d686d062 475
476 //update the ESD track and delete the TOFtrack
af61c656 477 t->UpdateTrackParams(trackTOFin,AliESDtrack::kTOFout);
d686d062 478
479 // Store quantities to be used in the TOF Calibration
ca270b6d 480 Float_t tToT=AliTOFGeometry::ToTBinWidth()*bestCluster->GetToT()*1E-3; // in ns
d686d062 481 t->SetTOFsignalToT(tToT);
6819758a 482 Float_t rawTime=AliTOFGeometry::TdcBinWidth()*bestCluster->GetTDCRAW()+kTimeOffset; // RAW time,in ps
d686d062 483 t->SetTOFsignalRaw(rawTime);
484 t->SetTOFsignalDz(dzTW);
6819758a 485
d686d062 486 Int_t ind[5];
487 ind[0]=bestCluster->GetDetInd(0);
488 ind[1]=bestCluster->GetDetInd(1);
489 ind[2]=bestCluster->GetDetInd(2);
490 ind[3]=bestCluster->GetDetInd(3);
491 ind[4]=bestCluster->GetDetInd(4);
ca270b6d 492 Int_t calindex = AliTOFGeometry::GetIndex(ind);
d686d062 493 t->SetTOFCalChannel(calindex);
494
495 // keep track of the track labels in the matched cluster
496 Int_t tlab[3];
497 tlab[0]=bestCluster->GetLabel(0);
498 tlab[1]=bestCluster->GetLabel(1);
499 tlab[2]=bestCluster->GetLabel(2);
6819758a 500 AliDebug(2,Form(" tdc time of the matched track %6d = ",bestCluster->GetTDC()));
501 Double_t tof=AliTOFGeometry::TdcBinWidth()*bestCluster->GetTDC()+kTimeOffset; // in ps
502 AliDebug(2,Form(" tof time of the matched track: %f = ",tof));
d686d062 503 Double_t tofcorr=tof;
504 if(timeWalkCorr)tofcorr=CorrectTimeWalk(dzTW,tof);
505 AliDebug(2,Form(" tof time of the matched track, after TW corr: %f = ",tofcorr));
506 //Set TOF time signal and pointer to the matched cluster
507 t->SetTOFsignal(tofcorr);
508 t->SetTOFcluster(idclus); // pointing to the recPoints tree
509 t->SetTOFLabel(tlab);
510
6819758a 511 AliDebug(2,Form(" Setting TOF raw time: %f z distance: %f corrected time: %f",rawTime,dzTW,tofcorr));
512
d686d062 513 Double_t mom=t->GetP();
53884c34 514 AliDebug(2,Form(" Momentum for track %d -> %f", iseed,mom));
d686d062 515 // Fill Reco-QA histos for Reconstruction
516 fHRecNClus->Fill(nc);
517 fHRecChi2->Fill(bestChi2);
518 fHRecDistZ->Fill(dzTW);
519 fHRecSigYVsP->Fill(mom,TMath::Sqrt(cov[0]));
520 fHRecSigZVsP->Fill(mom,TMath::Sqrt(cov[2]));
521 fHRecSigYVsPWin->Fill(mom,dphi*sensRadius);
522 fHRecSigZVsPWin->Fill(mom,dz);
523
524 // Fill Tree for on-the-fly offline Calibration
525 // no longer there - all info is in the ESDs now
526
af61c656 527 delete trackTOFin;
d686d062 528 }
d686d062 529
530}
531//_________________________________________________________________________
532Int_t AliTOFtrackerV1::LoadClusters(TTree *cTree) {
533 //--------------------------------------------------------------------
534 //This function loads the TOF clusters
535 //--------------------------------------------------------------------
536
ca270b6d 537 Int_t npadX = AliTOFGeometry::NpadX();
538 Int_t npadZ = AliTOFGeometry::NpadZ();
539 Int_t nStripA = AliTOFGeometry::NStripA();
540 Int_t nStripB = AliTOFGeometry::NStripB();
541 Int_t nStripC = AliTOFGeometry::NStripC();
d686d062 542
543 TBranch *branch=cTree->GetBranch("TOF");
544 if (!branch) {
545 AliError("can't get the branch with the TOF clusters !");
546 return 1;
547 }
548
b42a5ea1 549 static TClonesArray dummy("AliTOFcluster",10000);
550 dummy.Clear();
551 TClonesArray *clusters=&dummy;
d686d062 552 branch->SetAddress(&clusters);
553
554 cTree->GetEvent(0);
555 Int_t nc=clusters->GetEntriesFast();
556 fHDigNClus->Fill(nc);
557
b42a5ea1 558 AliInfo(Form("Number of clusters: %d",nc));
559
d686d062 560 for (Int_t i=0; i<nc; i++) {
561 AliTOFcluster *c=(AliTOFcluster*)clusters->UncheckedAt(i);
562 fClusters[i]=new AliTOFcluster(*c); fN++;
563
564 // Fill Digits QA histos
565
566 Int_t isector = c->GetDetInd(0);
567 Int_t iplate = c->GetDetInd(1);
568 Int_t istrip = c->GetDetInd(2);
569 Int_t ipadX = c->GetDetInd(4);
570 Int_t ipadZ = c->GetDetInd(3);
571
ca270b6d 572 Float_t time =(AliTOFGeometry::TdcBinWidth()*c->GetTDC())*1E-3; // in ns
573 Float_t tot = (AliTOFGeometry::TdcBinWidth()*c->GetToT())*1E-3;//in ns
d686d062 574
575 Int_t stripOffset = 0;
576 switch (iplate) {
577 case 0:
578 stripOffset = 0;
579 break;
580 case 1:
581 stripOffset = nStripC;
582 break;
583 case 2:
584 stripOffset = nStripC+nStripB;
585 break;
586 case 3:
587 stripOffset = nStripC+nStripB+nStripA;
588 break;
589 case 4:
590 stripOffset = nStripC+nStripB+nStripA+nStripB;
591 break;
592 default:
593 AliError(Form("Wrong plate number in TOF (%d) !",iplate));
594 break;
595 };
596 Int_t zindex=npadZ*(istrip+stripOffset)+(ipadZ+1);
597 Int_t phiindex=npadX*isector+ipadX+1;
598 fHDigClusMap->Fill(zindex,phiindex);
599 fHDigClusTime->Fill(time);
600 fHDigClusToT->Fill(tot);
601 }
602
603
604 return 0;
605}
606//_________________________________________________________________________
607void AliTOFtrackerV1::UnloadClusters() {
608 //--------------------------------------------------------------------
609 //This function unloads TOF clusters
610 //--------------------------------------------------------------------
611 for (Int_t i=0; i<fN; i++) {
612 delete fClusters[i];
613 fClusters[i] = 0x0;
614 }
615 fN=0;
616}
617
618//_________________________________________________________________________
619Int_t AliTOFtrackerV1::FindClusterIndex(Double_t z) const {
620 //--------------------------------------------------------------------
621 // This function returns the index of the nearest cluster
622 //--------------------------------------------------------------------
623 //MOD
624 //Here we need to get the Z in the tracking system
625
626 if (fN==0) return 0;
627 if (z <= fClusters[0]->GetZ()) return 0;
628 if (z > fClusters[fN-1]->GetZ()) return fN;
629 Int_t b=0, e=fN-1, m=(b+e)/2;
630 for (; b<e; m=(b+e)/2) {
631 if (z > fClusters[m]->GetZ()) b=m+1;
632 else e=m;
633 }
634 return m;
635}
636
637//_________________________________________________________________________
638Bool_t AliTOFtrackerV1::GetTrackPoint(Int_t index, AliTrackPoint& p) const
639{
640 // Get track space point with index i
641 // Coordinates are in the global system
642 AliTOFcluster *cl = fClusters[index];
643 Float_t xyz[3];
644 cl->GetGlobalXYZ(xyz);
645 Float_t phi=TMath::ATan2(xyz[1],xyz[0]);
646 Float_t phiangle = (Int_t(phi*TMath::RadToDeg()/20.)+0.5)*20.*TMath::DegToRad();
647 Float_t sinphi = TMath::Sin(phiangle), cosphi = TMath::Cos(phiangle);
ca270b6d 648 Float_t tiltangle = AliTOFGeometry::GetAngles(cl->GetDetInd(1),cl->GetDetInd(2))*TMath::DegToRad();
d686d062 649 Float_t sinth = TMath::Sin(tiltangle), costh = TMath::Cos(tiltangle);
ca270b6d 650 Float_t sigmay2 = AliTOFGeometry::XPad()*AliTOFGeometry::XPad()/12.;
651 Float_t sigmaz2 = AliTOFGeometry::ZPad()*AliTOFGeometry::ZPad()/12.;
d686d062 652 Float_t cov[6];
653 cov[0] = sinphi*sinphi*sigmay2 + cosphi*cosphi*sinth*sinth*sigmaz2;
654 cov[1] = -sinphi*cosphi*sigmay2 + sinphi*cosphi*sinth*sinth*sigmaz2;
655 cov[2] = -cosphi*sinth*costh*sigmaz2;
656 cov[3] = cosphi*cosphi*sigmay2 + sinphi*sinphi*sinth*sinth*sigmaz2;
657 cov[4] = -sinphi*sinth*costh*sigmaz2;
658 cov[5] = costh*costh*sigmaz2;
659 p.SetXYZ(xyz[0],xyz[1],xyz[2],cov);
660
661 // Detector numbering scheme
ca270b6d 662 Int_t nSector = AliTOFGeometry::NSectors();
663 Int_t nPlate = AliTOFGeometry::NPlates();
664 Int_t nStripA = AliTOFGeometry::NStripA();
665 Int_t nStripB = AliTOFGeometry::NStripB();
666 Int_t nStripC = AliTOFGeometry::NStripC();
d686d062 667
668 Int_t isector = cl->GetDetInd(0);
669 if (isector >= nSector)
670 AliError(Form("Wrong sector number in TOF (%d) !",isector));
671 Int_t iplate = cl->GetDetInd(1);
672 if (iplate >= nPlate)
673 AliError(Form("Wrong plate number in TOF (%d) !",iplate));
674 Int_t istrip = cl->GetDetInd(2);
675
676 Int_t stripOffset = 0;
677 switch (iplate) {
678 case 0:
679 stripOffset = 0;
680 break;
681 case 1:
682 stripOffset = nStripC;
683 break;
684 case 2:
685 stripOffset = nStripC+nStripB;
686 break;
687 case 3:
688 stripOffset = nStripC+nStripB+nStripA;
689 break;
690 case 4:
691 stripOffset = nStripC+nStripB+nStripA+nStripB;
692 break;
693 default:
694 AliError(Form("Wrong plate number in TOF (%d) !",iplate));
695 break;
696 };
697
698 Int_t idet = (2*(nStripC+nStripB)+nStripA)*isector +
699 stripOffset +
700 istrip;
701 UShort_t volid = AliGeomManager::LayerToVolUID(AliGeomManager::kTOF,idet);
702 p.SetVolumeID((UShort_t)volid);
703 return kTRUE;
704}
705//_________________________________________________________________________
706void AliTOFtrackerV1::InitCheckHists() {
707
708 //Init histos for Digits/Reco QA and Calibration
709
3a646035 710 TDirectory *dir = gDirectory;
711 TFile *logFileTOF = 0;
712
713 TSeqCollection *list = gROOT->GetListOfFiles();
714 int n = list->GetEntries();
715 Bool_t isThere=kFALSE;
716 for(int i=0; i<n; i++) {
717 logFileTOF = (TFile*)list->At(i);
718 if (strstr(logFileTOF->GetName(), "TOFQA.root")){
719 isThere=kTRUE;
720 break;
721 }
722 }
723
724 if(!isThere)logFileTOF = new TFile( "TOFQA.root","RECREATE");
725 logFileTOF->cd();
726
d686d062 727 //Digits "QA"
728 fHDigClusMap = new TH2F("TOFDig_ClusMap", "",182,0.5,182.5,864, 0.5,864.5);
729 fHDigNClus = new TH1F("TOFDig_NClus", "",200,0.5,200.5);
730 fHDigClusTime = new TH1F("TOFDig_ClusTime", "",2000,0.,200.);
731 fHDigClusToT = new TH1F("TOFDig_ClusToT", "",500,0.,100);
732
733 //Reco "QA"
734 fHRecNClus =new TH1F("TOFRec_NClusW", "",50,0.5,50.5);
735 fHRecDistZ=new TH1F("TOFRec_DistZ", "",50,0.5,10.5);
736 fHRecChi2=new TH1F("TOFRec_Chi2", "",100,0.,10.);
737 fHRecSigYVsP=new TH2F("TOFDig_SigYVsP", "",40,0.,4.,100, 0.,5.);
738 fHRecSigZVsP=new TH2F("TOFDig_SigZVsP", "",40,0.,4.,100, 0.,5.);
739 fHRecSigYVsPWin=new TH2F("TOFDig_SigYVsPWin", "",40,0.,4.,100, 0.,50.);
740 fHRecSigZVsPWin=new TH2F("TOFDig_SigZVsPWin", "",40,0.,4.,100, 0.,50.);
3a646035 741
742 dir->cd();
743
d686d062 744}
745
746//_________________________________________________________________________
747void AliTOFtrackerV1::SaveCheckHists() {
748
749 //write histos for Digits/Reco QA and Calibration
750
751 TDirectory *dir = gDirectory;
752 TFile *logFile = 0;
753 TFile *logFileTOF = 0;
754
755 TSeqCollection *list = gROOT->GetListOfFiles();
756 int n = list->GetEntries();
757 for(int i=0; i<n; i++) {
758 logFile = (TFile*)list->At(i);
759 if (strstr(logFile->GetName(), "AliESDs.root")) break;
760 }
761
762 Bool_t isThere=kFALSE;
763 for(int i=0; i<n; i++) {
764 logFileTOF = (TFile*)list->At(i);
765 if (strstr(logFileTOF->GetName(), "TOFQA.root")){
766 isThere=kTRUE;
767 break;
768 }
769 }
770
3a646035 771 if(!isThere) {
772 AliError(Form("File TOFQA.root not found!! not wring histograms...."));
773 return;
774 }
d686d062 775 logFile->cd();
776 fHDigClusMap->Write(fHDigClusMap->GetName(), TObject::kOverwrite);
777 fHDigNClus->Write(fHDigNClus->GetName(), TObject::kOverwrite);
778 fHDigClusTime->Write(fHDigClusTime->GetName(), TObject::kOverwrite);
779 fHDigClusToT->Write(fHDigClusToT->GetName(), TObject::kOverwrite);
780 fHRecNClus->Write(fHRecNClus->GetName(), TObject::kOverwrite);
781 fHRecChi2->Write(fHRecChi2->GetName(), TObject::kOverwrite);
782 fHRecDistZ->Write(fHRecDistZ->GetName(), TObject::kOverwrite);
783 fHRecSigYVsP->Write(fHRecSigYVsP->GetName(), TObject::kOverwrite);
784 fHRecSigZVsP->Write(fHRecSigZVsP->GetName(), TObject::kOverwrite);
785 fHRecSigYVsPWin->Write(fHRecSigYVsPWin->GetName(), TObject::kOverwrite);
786 fHRecSigZVsPWin->Write(fHRecSigZVsPWin->GetName(), TObject::kOverwrite);
787 logFile->Flush();
788
d686d062 789 dir->cd();
3a646035 790
d686d062 791 }
792//_________________________________________________________________________
793Float_t AliTOFtrackerV1::CorrectTimeWalk( Float_t dist, Float_t tof) {
794
795 //dummy, for the moment
796 Float_t tofcorr=0.;
ca270b6d 797 if(dist<AliTOFGeometry::ZPad()*0.5){
d686d062 798 tofcorr=tof;
799 //place here the actual correction
800 }else{
801 tofcorr=tof;
802 }
803 return tofcorr;
804}
805//_________________________________________________________________________
806Float_t AliTOFtrackerV1::GetTimeZerofromT0(AliESDEvent *event) const {
807
808 //Returns TimeZero as measured by T0 detector
809
810 return event->GetT0();
811}
812//_________________________________________________________________________
813Float_t AliTOFtrackerV1::GetTimeZerofromTOF(AliESDEvent * /*event*/) const {
814
815 //dummy, for the moment. T0 algorithm using tracks on TOF
816 {
817 //place T0 algo here...
818 }
819 return 0.;
820}
128563f6 821//_________________________________________________________________________
822
823void AliTOFtrackerV1::FillClusterArray(TObjArray* arr) const
824{
825 //
826 // Returns the TOF cluster array
827 //
828
829 if (fN==0)
830 arr = 0x0;
831 else
832 for (Int_t i=0; i<fN; ++i) arr->Add(fClusters[i]);
833
834}