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