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