]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TOF/AliTOFT0maker.cxx
84a0ad1fee8c02b09834f0a90d0070a6977ab66a
[u/mrichter/AliRoot.git] / TOF / AliTOFT0maker.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 /* $Id: AliTOFT0maker.cxx,v 1.8 2010/01/19 16:32:20 noferini Exp $ */
16
17 /////////////////////////////////////////////////////////////////////////////
18 //                                                                         //
19 //  This class contains the basic functions for the time zero              //
20 //  evaluation with TOF detector informations.                             //
21 // Use case in an analysis task:                                           //
22 //                                                                         //
23 // Create the object in the task constructor (fTOFmaker is a private var)  //
24 // AliESDpid *extPID=new AliESDpid();                                      //
25 // fTOFmaker = new AliTOFT0maker(extPID);                                  //
26 // fTOFmaker->SetTimeResolution(100.0); // if you want set the TOF res     //
27 // 115 ps is the TOF default resolution value                              //
28 //                                                                         //
29 // Use the RemakePID method in the task::Exec                              //
30 // Double_t* calcolot0;                                                    //
31 // calcolot0=fTOFmaker->RemakePID(fESD);                                   //
32 // //calcolot0[0] = calculated event time                                  // 
33 // //calcolot0[1] = event time time resolution                             //
34 // //calcolot0[2] = average event time for the current fill                //
35 // //calcolot0[3] = tracks at TOF                                          // 
36 // //calcolot0[4] = calculated event time (only TOF)                       //
37 // //calcolot0[5] = event time time resolution (only TOF)                  //
38 // //calcolot0[6] = sigma t0 fill                                          //
39 // //calcolot0[7] = tracks at TOF really used in tht algorithm             // 
40 //                                                                         //
41 // Let consider that:                                                      //
42 // - the PIF is automatically recalculated with the event time subtrction  //
43 //                                                                         //
44 /////////////////////////////////////////////////////////////////////////////
45
46 #include "AliTOFT0v1.h"
47 #include "AliTOFT0maker.h"
48 #include "AliPID.h"
49 #include "AliLog.h"
50 #include "AliESDpid.h"
51 #include "AliESDEvent.h"
52 #include "TFile.h"
53 #include "TH1F.h"
54 #include "AliTOFcalib.h"
55 #include "AliTOFRunParams.h"
56 #include "TRandom.h"
57 #include "AliTOFHeader.h"
58
59 ClassImp(AliTOFT0maker)
60            
61 //____________________________________________________________________________ 
62 AliTOFT0maker::AliTOFT0maker():
63   TObject(),
64   fT0TOF(NULL),
65   fPIDesd(NULL),
66   fExternalPIDFlag(kFALSE),
67   fTOFcalib(NULL),
68   fNoTOFT0(0),
69   fNmomBins(0),
70   fTimeResolution(100),
71   fT0sigma(1000),
72   fHmapChannel(0),
73   fKmask(0),
74   fT0width(150.),
75   fT0spreadExt(-1.),
76   fT0fillExt(0)
77 {
78   // ctr
79   fCalculated[0] = 0;
80   fCalculated[1] = 0;
81   fCalculated[2] = 0;
82   fCalculated[3] = 0;
83
84   if(AliPID::ParticleMass(0) == 0) new AliPID();
85
86   fPIDesd = new AliESDpid();
87
88   fNmomBins = fPIDesd->GetTOFResponse().GetNmomBins();
89   SetTOFResponse();
90
91   fT0TOF = new AliTOFT0v1(fPIDesd);
92
93 }
94 //____________________________________________________________________________ 
95 AliTOFT0maker::AliTOFT0maker(AliESDpid *externalPID, AliTOFcalib *tofCalib):
96     TObject(),
97     fT0TOF(NULL),
98     fPIDesd(externalPID),
99     fExternalPIDFlag(kTRUE),
100     fTOFcalib(tofCalib),
101     fNoTOFT0(0),
102     fNmomBins(0),
103     fTimeResolution(100),
104     fT0sigma(1000),
105     fHmapChannel(0),
106     fKmask(0),
107     fT0width(150.),
108     fT0spreadExt(-1.),
109     fT0fillExt(0)
110 {
111   // ctr
112   fCalculated[0] = 0;
113   fCalculated[1] = 0;
114   fCalculated[2] = 0;
115   fCalculated[3] = 0;
116
117   if(AliPID::ParticleMass(0) == 0) new AliPID();
118
119   if(!fPIDesd){
120     fPIDesd = new AliESDpid();
121     fExternalPIDFlag = kFALSE;
122   }
123
124   fNmomBins = fPIDesd->GetTOFResponse().GetNmomBins();
125   SetTOFResponse();
126
127   fT0TOF = new AliTOFT0v1(fPIDesd);
128
129 }
130
131 //____________________________________________________________________________ 
132 AliTOFT0maker::~AliTOFT0maker()
133 {
134   // dtor
135
136   delete fT0TOF;
137   if (!fExternalPIDFlag) delete fPIDesd;
138 }
139 //____________________________________________________________________________ 
140 Double_t* AliTOFT0maker::ComputeT0TOF(AliESDEvent *esd,Double_t t0time,Double_t t0sigma){
141   //
142   // Remake TOF PID probabilities
143   //
144
145   Double_t t0tof[6];
146
147   if(fKmask) ApplyMask(esd);
148
149   Double_t t0fill = 0.;
150
151   fPIDesd->GetTOFResponse().ResetT0info();
152
153   /* get T0 spread from TOFcalib if available otherwise use default value */
154   if (fTOFcalib && esd) {
155     AliTOFRunParams *runParams = fTOFcalib->GetRunParams();
156     if (runParams && runParams->GetTimestamp(0) != 0) {
157       Float_t t0spread = runParams->EvalT0Spread(esd->GetTimeStamp());
158       if(fT0spreadExt > 0) SetT0FillWidth(fT0spreadExt);
159       else{
160         SetT0FillWidth(t0spread);
161         t0fill = fT0fillExt;
162       }
163     }
164     else{
165       if(fT0spreadExt > 0) SetT0FillWidth(fT0spreadExt);
166       t0fill = fT0fillExt;
167     }
168   }
169
170   Float_t thrGood = TMath::Max(Float_t(500.),fT0width*3);
171
172   fT0TOF->Init(esd);
173   AliTOFT0v1* t0maker= fT0TOF;
174
175   t0maker->DefineT0("all",1.5,3.0);
176   t0tof[0] = t0maker->GetResult(0);
177   t0tof[1] = t0maker->GetResult(1);
178   t0tof[2] = t0maker->GetResult(2);
179   t0tof[3] = t0maker->GetResult(3);
180   t0tof[4] = t0maker->GetResult(4);
181   t0tof[5] = t0maker->GetResult(5);
182
183   Float_t lT0Current=0.;
184   fT0sigma=1000;
185
186 //   Int_t nrun = esd->GetRunNumber();
187
188   t0time += t0fill;
189
190   Float_t sigmaFill = fT0width;
191
192   if(sigmaFill < 20) sigmaFill = 140;
193
194   fCalculated[0]=-1000*t0tof[0]; // best t0
195   fCalculated[1]=1000*t0tof[1]; // sigma best t0
196   fCalculated[2] = t0fill;    //t0 fill
197   fCalculated[3] = t0tof[2];  // n TOF tracks
198   fCalculated[4]=-1000*t0tof[0]; // TOF t0
199   fCalculated[5]=1000*t0tof[1]; // TOF t0 sigma
200   fCalculated[6]=sigmaFill; // sigma t0 fill
201   fCalculated[7] = t0tof[3];  // n TOF tracks used for T0
202
203   if(fCalculated[7] > 30) thrGood = 10000000;
204
205   //statistics
206   fCalculated[8] = t0tof[4]; // real time in s
207   fCalculated[9] = t0tof[5]; // cpu time in s
208
209   if(fCalculated[1] < sigmaFill && TMath::Abs(fCalculated[0] - t0fill) < thrGood && fCalculated[1] < fTimeResolution*1.2){
210     fT0sigma=fCalculated[1];
211     lT0Current=fCalculated[0];
212   }
213   else{
214     fCalculated[4] = t0fill;
215     fCalculated[5] = sigmaFill;
216   }
217
218   if(fCalculated[1] < 1 || fT0sigma > sigmaFill || fCalculated[1] > fTimeResolution* 1.2){
219     fT0sigma =1000;
220     fCalculated[4] = t0fill;
221     fCalculated[5] = sigmaFill;
222   }
223
224   if(t0sigma < 1000){
225     if(fT0sigma < 1000){
226       Double_t w1 = 1./t0sigma/t0sigma;
227       Double_t w2 = 1./fCalculated[1]/fCalculated[1];
228
229       Double_t wtot = w1+w2;
230
231       lT0Current = (w1*t0time + w2*fCalculated[0]) / wtot;
232       fT0sigma = TMath::Sqrt(1./wtot);
233     }
234     else{
235       lT0Current=t0time;
236       fT0sigma=t0sigma;
237     }
238   }
239
240   if(fT0sigma < sigmaFill && TMath::Abs(lT0Current - t0fill) < thrGood){
241     fCalculated[1]=fT0sigma;
242     fCalculated[0]=lT0Current;
243   }
244
245   if(fT0sigma >= 1000 || fNoTOFT0){
246     lT0Current = t0fill;
247     fT0sigma = sigmaFill;
248
249     fCalculated[0] = t0fill;
250     fCalculated[1] = sigmaFill;
251   }
252
253   // T0 pt bin
254   if(fCalculated[7] < 100){
255     for(Int_t i=0;i<fNmomBins;i++){
256       t0maker->DefineT0("all",fPIDesd->GetTOFResponse().GetMinMom(i),fPIDesd->GetTOFResponse().GetMaxMom(i));
257       t0tof[0] = t0maker->GetResult(0);
258       t0tof[1] = t0maker->GetResult(1);
259       t0tof[2] = t0maker->GetResult(2);
260       t0tof[3] = t0maker->GetResult(3);
261  
262
263       Float_t t0bin =-1000*t0tof[0]; // best t0
264       Float_t t0binRes =1000*t0tof[1]; // sigma best t0
265       
266       if(t0binRes < sigmaFill  && t0binRes < fTimeResolution * 1.2 && TMath::Abs(t0bin - t0fill) < thrGood){
267         // Ok T0
268         if(t0sigma < 1000){
269           Double_t w1 = 1./t0sigma/t0sigma;
270           Double_t w2 = 1./t0binRes/t0binRes;
271           
272           Double_t wtot = w1+w2;
273           
274           t0bin = (w1*t0time + w2*t0bin) / wtot;
275           t0binRes = TMath::Sqrt(1./wtot);
276         }
277       }
278       else{
279         t0bin = t0fill;
280         t0binRes = sigmaFill;
281         if(t0sigma < 1000){
282           t0bin = t0time;
283            t0binRes= t0sigma;     
284         }
285       }
286       fPIDesd->GetTOFResponse().SetT0bin(i,t0bin);
287       fPIDesd->GetTOFResponse().SetT0binRes(i,t0binRes);
288     }
289   }
290   else{
291     for(Int_t i=0;i<fNmomBins;i++){
292       fPIDesd->GetTOFResponse().SetT0bin(i,lT0Current);
293       fPIDesd->GetTOFResponse().SetT0binRes(i,fT0sigma);
294     }
295   }
296
297   return fCalculated;
298 }
299 //____________________________________________________________________________ 
300 Double_t  *AliTOFT0maker::GetT0p(Float_t p){// [0]=to -- [1] = sigma T0
301   Int_t i=fPIDesd->GetTOFResponse().GetMomBin(p);
302   
303   fT0cur[0] = fPIDesd->GetTOFResponse().GetT0bin(i);
304   fT0cur[1] = fPIDesd->GetTOFResponse().GetT0binRes(i);
305
306   return fT0cur;
307 }
308 //____________________________________________________________________________ 
309 void AliTOFT0maker::SetTOFResponse(){
310   fPIDesd->GetTOFResponse().SetTimeResolution(fTimeResolution);
311 }
312 //____________________________________________________________________________ 
313 Float_t AliTOFT0maker::GetExpectedSigma(Float_t mom, Float_t tof, Float_t mass){
314   Float_t sigma = fPIDesd->GetTOFResponse().GetExpectedSigma(mom,tof,mass);
315
316   return sigma;
317 }
318 //____________________________________________________________________________ 
319 void AliTOFT0maker::ApplyT0TOF(AliESDEvent *esd){
320   //
321   // Recalculate TOF PID probabilities
322   //
323
324 // subtruct t0 for each track
325    Int_t ntracks = esd->GetNumberOfTracks();
326   
327    while (ntracks--) {
328        AliESDtrack *t=esd->GetTrack(ntracks);
329     
330        if ((t->GetStatus()&AliESDtrack::kTOFout)==0) continue;
331     
332        Double_t time=t->GetTOFsignal();
333        Float_t p = t->GetP();
334
335        Double_t *t0=GetT0p(p);
336        time -= t0[0];
337        t->SetTOFsignal(time);
338    }
339
340    for(Int_t i=0;i<fNmomBins;i++){
341        fPIDesd->GetTOFResponse().SetT0bin(i,0.0);
342    }
343    
344   //
345 }
346 //____________________________________________________________________________ 
347 void  AliTOFT0maker::LoadChannelMap(char *filename){
348   // Load the histo with the channel off map
349   TFile *f= new TFile(filename);
350   if(!f){
351     printf("Cannot open the channel map file (%s)\n",filename);
352     return;
353   }
354   
355   fHmapChannel = (TH1F *) f->Get("hChEnabled");
356   
357   if(!fHmapChannel){
358     printf("Cannot laod the channel map histo (from %s)\n",filename);
359     return;
360   }
361     
362 }
363 //____________________________________________________________________________ 
364 void AliTOFT0maker::ApplyMask(AliESDEvent * const esd){
365   // Switch off the disable channel
366   if(!fHmapChannel){
367     printf("Channel Map is not available\n");
368     return;
369   }
370   
371   Int_t ntracks = esd->GetNumberOfTracks();
372   
373   while (ntracks--) {
374     AliESDtrack *t=esd->GetTrack(ntracks);    
375
376     if ((t->GetStatus()&AliESDtrack::kTOFout)==0) continue;
377
378     Int_t chan = t->GetTOFCalChannel();
379  
380     if(fHmapChannel->GetBinContent(chan) < 0.01){
381       t->ResetStatus(AliESDtrack::kTOFout);
382     }
383   }
384 }
385
386 Float_t  
387 AliTOFT0maker::TuneForMC(AliESDEvent *esd){ // return true T0 event
388   //
389   // tune for MC data
390   //
391
392   Float_t TOFtimeResolutionDefault=80;
393
394   Float_t t0 = gRandom->Gaus(0.,fT0width); 
395
396   Float_t extraSmearing = 0;
397
398   if(fTimeResolution > TOFtimeResolutionDefault){
399     extraSmearing = TMath::Sqrt(fTimeResolution*fTimeResolution - TOFtimeResolutionDefault*TOFtimeResolutionDefault);
400   }
401
402   // subtruct t0 for each track
403   Int_t ntracks = esd->GetNumberOfTracks();
404   
405   while (ntracks--) {
406     AliESDtrack *t=esd->GetTrack(ntracks);
407     
408     if ((t->GetStatus()&AliESDtrack::kTOFout)==0) continue;
409     
410     /* check if channel is enabled */
411     if (fTOFcalib && !fTOFcalib->IsChannelEnabled(t->GetTOFCalChannel())) {
412       /* reset TOF status */
413       t->ResetStatus(AliESDtrack::kTOFin);
414       t->ResetStatus(AliESDtrack::kTOFout);
415       t->ResetStatus(AliESDtrack::kTOFmismatch);
416       t->ResetStatus(AliESDtrack::kTOFpid);
417     }
418
419     Double_t time=t->GetTOFsignal();
420
421     time += t0;
422
423     if(extraSmearing>0){
424       Float_t smearing = gRandom->Gaus(0.,extraSmearing);
425       time += smearing;
426     }
427
428     t->SetTOFsignal(time);
429   }
430   //
431   return t0;
432 }
433 //_________________________________________________________________________
434 void     AliTOFT0maker::WriteInESD(AliESDEvent *esd){
435   //
436   // Write t0Gen, t0ResGen, nt0;
437   //       t0resESD[0:nt0], it0ESD[0:nt0]
438   // in the AliESDEvent
439   //
440     Int_t nMomBins = fPIDesd->GetTOFResponse().GetNmomBins();
441
442     Int_t nt0=0;
443     Float_t *t0 = new Float_t[nMomBins];
444     Float_t *t0res = new Float_t[nMomBins];
445     Int_t *multT0 = new Int_t[nMomBins];
446
447     for(Int_t i=0;i<nMomBins;i++){
448 //      printf("START %i) %f %f\n",i,fT0event[i],fT0resolution[i]);
449         multT0[i]=0;
450         Bool_t kNewT0=kTRUE;
451         for(Int_t j=0;j < nt0;j++){
452             if(TMath::Abs(fPIDesd->GetTOFResponse().GetT0bin(i) - t0[j])<0.1){
453                 kNewT0=kFALSE;
454                 multT0[j]++;
455                 j=nMomBins*10;
456             }
457         }
458         if(kNewT0){
459             t0[nt0]=fPIDesd->GetTOFResponse().GetT0bin(i);
460             t0res[nt0]=fPIDesd->GetTOFResponse().GetT0binRes(i);
461             nt0++;
462         }
463     }
464
465     Int_t iMultT0=0,nmult=0;
466     for(Int_t j=0;j < nt0;j++){ // find the most frequent
467         if(multT0[j] > nmult){
468             iMultT0 = j;
469             nmult = multT0[j];
470         }
471     }
472
473     Float_t *t0ESD = new Float_t[nMomBins];
474     Float_t *t0resESD = new Float_t[nMomBins];
475     Int_t *it0ESD = new Int_t[nMomBins];
476     
477     Float_t t0Gen,t0ResGen;
478     t0Gen = t0[iMultT0];
479     t0ResGen = t0res[iMultT0];
480     nt0=0;
481     //  printf("T0 to ESD\n%f %f\n",t0Gen,t0ResGen);
482     for(Int_t i=0;i<nMomBins;i++){
483         if(TMath::Abs(fPIDesd->GetTOFResponse().GetT0bin(i) - t0Gen)>0.1){
484             t0ESD[nt0]=fPIDesd->GetTOFResponse().GetT0bin(i);
485             t0resESD[nt0]=fPIDesd->GetTOFResponse().GetT0binRes(i);
486             it0ESD[nt0]=i;
487 //          printf("%i) %f %f %i\n",nt0,t0ESD[nt0],t0resESD[nt0],it0ESD[nt0]);
488             nt0++;
489         }
490     }
491
492     // Write  t0Gen,t0ResGen; nt0; t0resESD[0:nt0],it0ESD[0:nt0] in the AliESDEvent
493
494    AliTOFHeader *tofHeader =
495         new AliTOFHeader(t0Gen,t0ResGen,nt0,
496                          t0ESD,t0resESD,it0ESD,fTimeResolution,fT0width);
497   
498     esd->SetTOFHeader(tofHeader);
499
500     AliDebug(1,Form("resTOF=%f T0spread=%f t0Gen=%f t0resGen=%f",fTimeResolution,fT0width,t0Gen,t0ResGen));
501     AliDebug(1,Form("%d ",nt0));
502     for (Int_t ii=0; ii<nt0; ii++)
503       AliDebug(1,Form("pBin=%d t0val=%f t0res=%f",it0ESD[ii],t0ESD[ii],t0resESD[ii]));
504     
505     delete[] t0;
506     t0 = NULL;
507     delete[] t0res;
508     t0res = NULL;
509     delete[] multT0;
510     multT0 = NULL;
511     delete[] t0ESD;
512     t0ESD = NULL;
513     delete[] t0resESD;
514     t0resESD = NULL;
515     delete[] it0ESD;
516     it0ESD = NULL;
517
518 }