Bug fix
[u/mrichter/AliRoot.git] / T0 / AliT0Reconstructor.cxx
CommitLineData
73df58ab 1
dc7ca31d 2/**************************************************************************
3 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
7 * *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
16
17/* $Id$ */
72e48d95 18/*********************************************************************
19 * T0 reconstruction and filling ESD
20 * - reconstruct mean time (interation time)
21 * - vertex position
22 * - multiplicity
23 ********************************************************************/
dc7ca31d 24
af885e0f 25#include <AliESDEvent.h>
dc7ca31d 26#include "AliLog.h"
dc7ca31d 27#include "AliT0RecPoint.h"
28#include "AliRawReader.h"
29#include "AliT0RawReader.h"
dc7ca31d 30#include "AliT0digit.h"
31#include "AliT0Reconstructor.h"
32#include "AliT0Parameters.h"
c41ceaac 33#include "AliT0Calibrator.h"
58bd3a16 34#include "AliESDfriend.h"
73df58ab 35#include "AliESDTZEROfriend.h"
8f8d0732 36#include "AliLog.h"
dc7ca31d 37
38#include <TArrayI.h>
39#include <TGraph.h>
aad72f45 40#include <TMath.h>
b09247a2 41#include <Riostream.h>
dc7ca31d 42
43ClassImp(AliT0Reconstructor)
44
c41ceaac 45 AliT0Reconstructor:: AliT0Reconstructor(): AliReconstructor(),
f16935f7 46 fdZonA(0),
47 fdZonC(0),
48 fZposition(0),
49 fParam(NULL),
2e6a5ee0 50 fAmpLEDrec(),
c883fdf2 51 fQTC(0),
52 fAmpLED(0),
58bd3a16 53 fCalib(),
54 fLatencyHPTDC(9000),
55 fLatencyL1(0),
56 fLatencyL1A(0),
73df58ab 57 fLatencyL1C(0),
58 fESDTZEROfriend(NULL)
58bd3a16 59
e0bba6cc 60{
72e48d95 61 //constructor
62
74adb36a 63 fParam = AliT0Parameters::Instance();
64 fParam->Init();
c883fdf2 65
74adb36a 66 for (Int_t i=0; i<24; i++){
2e6a5ee0 67 TGraph* gr = fParam ->GetAmpLEDRec(i);
29ed1d0e 68 if (gr) fAmpLEDrec.AddAtAndExpand(gr,i) ;
c883fdf2 69 TGraph* gr1 = fParam ->GetAmpLED(i);
70 if (gr1) fAmpLED.AddAtAndExpand(gr1,i) ;
71 TGraph* gr2 = fParam ->GetQTC(i);
539b9cb9 72 if (gr2) fQTC.AddAtAndExpand(gr2,i) ;
c883fdf2 73 }
539b9cb9 74
58bd3a16 75 fLatencyL1 = fParam->GetLatencyL1();
76 fLatencyL1A = fParam->GetLatencyL1A();
77 fLatencyL1C = fParam->GetLatencyL1C();
78 fLatencyHPTDC = fParam->GetLatencyHPTDC();
79 AliDebug(10,Form(" LatencyL1 %f latencyL1A %f latencyL1C %f latencyHPTDC %f \n",fLatencyL1, fLatencyL1A, fLatencyL1C, fLatencyHPTDC));
29ed1d0e 80
adf36b9d 81 // fdZonC = TMath::Abs(fParam->GetZPositionShift("T0/C/PMT1"));
82 //fdZonA = TMath::Abs(fParam->GetZPositionShift("T0/A/PMT15"));
8f620945 83 //here real Z position
84 fdZonC = TMath::Abs(fParam->GetZPosition("T0/C/PMT1"));
85 fdZonA = TMath::Abs(fParam->GetZPosition("T0/A/PMT15"));
539b9cb9 86
12e9daf9 87 fCalib = new AliT0Calibrator();
73df58ab 88 fESDTZEROfriend = new AliESDTZEROfriend();
12e9daf9 89
c41ceaac 90}
c41ceaac 91
92//_____________________________________________________________________________
dc7ca31d 93void AliT0Reconstructor::Reconstruct(TTree*digitsTree, TTree*clustersTree) const
94c27e4f 94
dc7ca31d 95{
94c27e4f 96 // T0 digits reconstruction
38cbfa7c 97 Int_t refAmp = Int_t (GetRecoParam()->GetRefAmp());
776de217 98
c41ceaac 99 TArrayI * timeCFD = new TArrayI(24);
100 TArrayI * timeLED = new TArrayI(24);
101 TArrayI * chargeQT0 = new TArrayI(24);
102 TArrayI * chargeQT1 = new TArrayI(24);
74adb36a 103
d0bcd1fb 104
8955c6b4 105 Float_t channelWidth = fParam->GetChannelWidth() ;
b95e8d87 106 Float_t meanVertex = fParam->GetMeanVertex();
776de217 107 Float_t c = 0.0299792; // cm/ps
adf36b9d 108 Double32_t vertex = 9999999;
109 Double32_t timeDiff=999999, meanTime=999999, timeclock=999999;
776de217 110
94c27e4f 111
dc7ca31d 112 AliDebug(1,Form("Start DIGITS reconstruction "));
94c27e4f 113
2e6a5ee0 114
d0bcd1fb 115 TBranch *brDigits=digitsTree->GetBranch("T0");
e0bba6cc 116 AliT0digit *fDigits = new AliT0digit() ;
dc7ca31d 117 if (brDigits) {
118 brDigits->SetAddress(&fDigits);
119 }else{
f16935f7 120 AliError(Form("EXEC Branch T0 digits not found"));
121 return;
dc7ca31d 122 }
e0bba6cc 123
c41ceaac 124 digitsTree->GetEvent(0);
125 digitsTree->GetEntry(0);
126 brDigits->GetEntry(0);
127 fDigits->GetTimeCFD(*timeCFD);
128 fDigits->GetTimeLED(*timeLED);
129 fDigits->GetQT0(*chargeQT0);
130 fDigits->GetQT1(*chargeQT1);
446d6ec4 131 Int_t onlineMean = fDigits->MeanTime();
c883fdf2 132
adf36b9d 133 Bool_t tr[5];
134 for (Int_t i=0; i<5; i++) tr[i]=false;
c41ceaac 135
adf36b9d 136 Double32_t besttimeA=999999;
137 Double32_t besttimeC=999999;
c41ceaac 138 Int_t pmtBestA=99999;
139 Int_t pmtBestC=99999;
dc7ca31d 140
94c27e4f 141 AliT0RecPoint* frecpoints= new AliT0RecPoint ();
142 clustersTree->Branch( "T0", "AliT0RecPoint" ,&frecpoints, 405,1);
143
b95e8d87 144 Float_t time[24], adc[24];
dc7ca31d 145 for (Int_t ipmt=0; ipmt<24; ipmt++) {
c41ceaac 146 if(timeCFD->At(ipmt)>0 ){
d0bcd1fb 147 if(( chargeQT1->At(ipmt) - chargeQT0->At(ipmt))>0)
148 adc[ipmt] = chargeQT1->At(ipmt) - chargeQT0->At(ipmt);
a7027400 149 else
d0bcd1fb 150 adc[ipmt] = 0;
151
38cbfa7c 152 time[ipmt] = fCalib-> WalkCorrection(refAmp, ipmt, Int_t(adc[ipmt]), timeCFD->At(ipmt)) ;
d0bcd1fb 153
154 Double_t sl = Double_t(timeLED->At(ipmt) - timeCFD->At(ipmt));
8f620945 155 // time[ipmt] = fCalib-> WalkCorrection( refAmp,ipmt, Int_t(sl), timeCFD->At(ipmt) ) ;
d0bcd1fb 156 AliDebug(10,Form(" ipmt %i QTC %i , time in chann %i (led-cfd) %i ",
157 ipmt, Int_t(adc[ipmt]) ,Int_t(time[ipmt]),Int_t( sl)));
776de217 158
d0bcd1fb 159 Double_t ampMip =((TGraph*)fAmpLED.At(ipmt))->Eval(sl);
160 Double_t qtMip = ((TGraph*)fQTC.At(ipmt))->Eval(adc[ipmt]);
b5a9f753 161 AliDebug(10,Form(" Amlitude in MIPS LED %f , QTC %f in channels %f\n ",ampMip,qtMip, adc[ipmt]));
d0bcd1fb 162
163 frecpoints->SetTime(ipmt, Float_t(time[ipmt]) );
345f03db 164 frecpoints->SetAmpLED(ipmt, Float_t( ampMip)); //for cosmic &pp beam
165 frecpoints->SetAmp(ipmt, Float_t(qtMip));
d0bcd1fb 166
dc7ca31d 167 }
168 else {
169 time[ipmt] = 0;
170 adc[ipmt] = 0;
171 }
172 }
94c27e4f 173
dc7ca31d 174 for (Int_t ipmt=0; ipmt<12; ipmt++){
175 if(time[ipmt] > 1 ) {
c41ceaac 176 if(time[ipmt]<besttimeC){
177 besttimeC=time[ipmt]; //timeC
178 pmtBestC=ipmt;
dc7ca31d 179 }
180 }
181 }
182 for ( Int_t ipmt=12; ipmt<24; ipmt++){
183 if(time[ipmt] > 1) {
c41ceaac 184 if(time[ipmt]<besttimeA) {
185 besttimeA=time[ipmt]; //timeA
186 pmtBestA=ipmt;}
dc7ca31d 187 }
188 }
adf36b9d 189 if(besttimeA < 999999) {
8f620945 190 frecpoints->SetTimeBestA(Int_t(besttimeA *channelWidth - fdZonA/c));
adf36b9d 191 tr[1]=true;
192 }
193 if( besttimeC < 999999 ) {
8f620945 194 frecpoints->SetTimeBestC(Int_t(besttimeC *channelWidth - fdZonA/c));
adf36b9d 195 tr[2]=true;
196 }
d0bcd1fb 197 AliDebug(10,Form(" besttimeA %f ch, besttimeC %f ch",besttimeA, besttimeC));
adf36b9d 198 if(besttimeA <999999 && besttimeC < 999999 ){
9b83615d 199 // timeDiff = (besttimeC - besttimeA)*channelWidth;
200 timeDiff = (besttimeA - besttimeC)*channelWidth;
adf36b9d 201 meanTime = (besttimeA + besttimeC)/2;// * channelWidth);
8f620945 202 timeclock = meanTime *channelWidth -fdZonA/c ;
adf36b9d 203 vertex = meanVertex - c*(timeDiff)/2.;// + (fdZonA - fdZonC)/2;
204 tr[0]=true;
205 }
206 frecpoints->SetVertex(vertex);
207 frecpoints->SetMeanTime(meanTime);
208 frecpoints->SetT0clock(timeclock);
209 frecpoints->SetT0Trig(tr);
210
8f620945 211 AliDebug(10,Form("T0 triggers %d %d %d %d %d",tr[0],tr[1],tr[2],tr[3],tr[4]));
adf36b9d 212
213 //online mean
214 frecpoints->SetOnlineMean(Int_t(onlineMean));
b5a9f753 215 AliDebug(10,Form(" timeDiff %f #channel, meanTime %f #channel, vertex %f cm online mean %i timeclock %f ps",timeDiff, meanTime,vertex, Int_t(onlineMean), timeclock));
adf36b9d 216
217
218
219
b95e8d87 220
dc7ca31d 221 clustersTree->Fill();
bd375212 222
223 delete timeCFD;
224 delete timeLED;
225 delete chargeQT0;
226 delete chargeQT1;
dc7ca31d 227}
228
229
c41ceaac 230//_______________________________________________________________________
231
232void AliT0Reconstructor::Reconstruct(AliRawReader* rawReader, TTree*recTree) const
233{
94c27e4f 234 // T0 raw ->
539b9cb9 235 //
236 // reference amplitude and time ref. point from reco param
237
38cbfa7c 238 Float_t refAmp = GetRecoParam()->GetRefAmp();
239 Int_t refPoint = 0;
240 //Bad channel
241 Int_t badpmt = GetRecoParam()->GetRefPoint();
242
243 Int_t low[110], high[110];
58bd3a16 244
e8ed1cd0 245 Int_t allData[110][5];
2e6a5ee0 246
e8ed1cd0 247 Int_t timeCFD[24], timeLED[24], chargeQT0[24], chargeQT1[24];
adf36b9d 248 Double32_t timeDiff=999999, meanTime=999999, timeclock=999999;
249 Float_t c = 29.9792458; // cm/ns
250 Double32_t vertex = 9999999;
776de217 251 Int_t onlineMean=0;
9480f05f 252 // Float_t meanVertex = fParam->GetMeanVertex();
253 Float_t meanVertex = 0;
bce12dc5 254 for (Int_t i0=0; i0<105; i0++)
255 {
38cbfa7c 256 for (Int_t j0=0; j0<5; j0++) allData[i0][j0]=0;
257 low[i0] = Int_t (GetRecoParam()->GetLow(i0));
258 high[i0] = Int_t (GetRecoParam()->GetHigh(i0));
bce12dc5 259 }
2e6a5ee0 260
adf36b9d 261 Double32_t besttimeA=9999999;
262 Double32_t besttimeC=9999999;
bce12dc5 263 Int_t pmtBestA=99999;
264 Int_t pmtBestC=99999;
29a60970 265
bce12dc5 266 AliT0RecPoint* frecpoints= new AliT0RecPoint ();
267
268 recTree->Branch( "T0", "AliT0RecPoint" ,&frecpoints, 405,1);
2e6a5ee0 269
bce12dc5 270 AliDebug(10," before read data ");
271 AliT0RawReader myrawreader(rawReader);
776de217 272
273 UInt_t type =rawReader->GetType();
274
bce12dc5 275 if (!myrawreader.Next())
276 AliDebug(1,Form(" no raw data found!!"));
277 else
278 {
38cbfa7c 279 for (Int_t i=0; i<24; i++)
280 {
281 timeCFD[i]=0; timeLED[i]=0; chargeQT0[i]=0; chargeQT1[i]=0;
282 }
283 Int_t fBCID=Int_t (rawReader->GetBCID());
8f620945 284 Int_t trmbunch= myrawreader.GetTRMBunchID();
86fd0587 285 AliDebug(10,Form(" CDH BC ID %i, TRM BC ID %i \n", fBCID, trmbunch ));
286
38cbfa7c 287 if(type == 7 ) { //only physics
8f620945 288 for (Int_t i=0; i<105; i++) {
bce12dc5 289 for (Int_t iHit=0; iHit<5; iHit++)
290 {
291 allData[i][iHit] = myrawreader.GetData(i,iHit);
292 }
8f620945 293 }
294 Int_t ref=0;
295 if (refPoint>0)
296 ref = allData[refPoint][0]-5000;
297
298 Float_t channelWidth = fParam->GetChannelWidth() ;
299
300 // Int_t meanT0 = fParam->GetMeanT0();
301
38cbfa7c 302 for (Int_t in=0; in<12; in++)
303 {
304 for (Int_t iHit=0; iHit<5; iHit++)
305 {
306 if(allData[in+1][iHit] > low[in+1] &&
307 allData[in+1][iHit] < high[in+1])
308 {
309 timeCFD[in] = allData[in+1][iHit] ;
310 break;
311 }
312 }
313 for (Int_t iHit=0; iHit<5; iHit++)
314 {
315 if(allData[in+12+1][iHit] > low[in+12+1] &&
316 allData[in+1+12][iHit] < high[in+12+1])
317 {
318 timeLED[in] = allData[in+12+1][iHit] ;
319 break;
320 }
321 }
322 for (Int_t iHit=0; iHit<5; iHit++)
323 {
324 if(allData[in+1+56][iHit] > low[in+1+56] &&
325 allData[in+1+56][iHit] < high[in+1+56])
326 {
327 timeCFD[in+12] = allData[in+56+1][iHit] ;
328 break;
329 }
330 }
331
332 for (Int_t iHit=0; iHit<5; iHit++)
333 {
334 if(allData[in+1+68][iHit] > low[in+1+68] &&
335 allData[in+1+68][iHit] < high[in+1+68])
336 {
337 timeLED[in+12] = allData[in+68+1][iHit] ;
338 break;
339 }
340 }
341 AliDebug(10, Form(" readed i %i cfdC %i cfdA %i ledC %i ledA%i ",
342 in, timeCFD[in],timeCFD[in+12],timeLED[in],
343 timeLED[in+12]));
344
345 }
346
347
348 for (Int_t iHit=0; iHit<5; iHit++)
8f620945 349 {
38cbfa7c 350 for (Int_t in=0; in<12; in++)
351 {
352 if(allData[2*in+25][iHit] > low[2*in+25] &&
353 allData[2*in+25][iHit] < high[2*in+25])
354 chargeQT0[in]=allData[2*in+25][iHit];
355 if(allData[2*in+26][iHit] > low[2*in+26] &&
356 allData[2*in+26][iHit] < high[2*in+26])
357 chargeQT1[in]=allData[2*in+26][iHit];
358
359 }
360
361 for (Int_t in=12; in<24; in++)
362 {
363 if(allData[2*in+57][iHit] > low[2*in+57] &&
364 allData[2*in+57][iHit] < high[2*in+57])
365 chargeQT0[in]=allData[2*in+57][iHit];
366 if(allData[2*in+58][iHit] > low[2*in+58] &&
367 allData[2*in+58][iHit] < high[2*in+58])
368 chargeQT1[in]=allData[2*in+58][iHit];
369
370 }
8f620945 371 }
372
8f620945 373
8f620945 374 for (Int_t in=0; in<24; in++)
375 AliDebug(10, Form(" readed Raw %i %i %i %i %i",
376 in, timeLED[in],timeCFD[in],chargeQT0[in],chargeQT1[in]));
38cbfa7c 377 for (Int_t iHit=0; iHit<5; iHit++)
378 {
379 if(allData[49][iHit] > low[49] &&
380 allData[49][iHit] < high[49])
381 onlineMean = allData[49][iHit];
382 }
73df58ab 383 Double32_t time[24], adc[24], noncalibtime[24];
8f620945 384 for (Int_t ipmt=0; ipmt<24; ipmt++) {
38cbfa7c 385 if(timeCFD[ipmt]>0 ){
bce12dc5 386 //for simulated data
d0bcd1fb 387 //for physics data
73df58ab 388 if(( chargeQT0[ipmt] - chargeQT1[ipmt])>0) {
541b42c4 389 adc[ipmt] = chargeQT0[ipmt] - chargeQT1[ipmt];
73df58ab 390 }
d0bcd1fb 391 else
392 adc[ipmt] = 0;
38cbfa7c 393 time[ipmt] = fCalib-> WalkCorrection(Int_t (refAmp), ipmt, Int_t(adc[ipmt]), timeCFD[ipmt] ) ;
bce12dc5 394
d0bcd1fb 395 Double_t sl = timeLED[ipmt] - timeCFD[ipmt];
8f620945 396 // time[ipmt] = fCalib-> WalkCorrection( refAmp,ipmt, Int_t(sl), timeCFD[ipmt] ) ;
73df58ab 397 AliDebug(5,Form(" ipmt %i QTC %i , time in chann %i (led-cfd) %i ",
d0bcd1fb 398 ipmt, Int_t(adc[ipmt]) ,Int_t(time[ipmt]),Int_t( sl)));
399 Double_t ampMip =( (TGraph*)fAmpLED.At(ipmt))->Eval(sl);
400 Double_t qtMip = ((TGraph*)fQTC.At(ipmt))->Eval(adc[ipmt]);
345f03db 401 AliDebug(10,Form(" Amlitude in MIPS LED %f ; QTC %f; in channels %f\n ",ampMip,qtMip, adc[ipmt]));
73df58ab 402 //bad peak removing
8f620945 403 if(sl<550) {
73df58ab 404 frecpoints->SetTime(ipmt, Float_t(time[ipmt]) );
405 // frecpoints->SetTime(ipmt,Double32_t(timeCFD[ipmt]));
345f03db 406 frecpoints->SetAmp(ipmt, Double32_t( qtMip)); //for cosmic &pp beam
407 frecpoints->SetAmpLED(ipmt, Double32_t(ampMip));
73df58ab 408 noncalibtime[ipmt]= Double32_t (timeCFD[ipmt]);
409 }
2e6a5ee0 410 }
411 else {
412 time[ipmt] = 0;
413 adc[ipmt] = 0;
73df58ab 414 noncalibtime[ipmt] = 0;
2e6a5ee0 415 }
416 }
73df58ab 417 fESDTZEROfriend->SetT0timeCorr(noncalibtime) ;
2e6a5ee0 418 for (Int_t ipmt=0; ipmt<12; ipmt++){
38cbfa7c 419 if(time[ipmt] > 1 && ipmt != badpmt )
73df58ab 420 {
421 if(time[ipmt]<besttimeC){
422 besttimeC=time[ipmt]; //timeC
423 pmtBestC=ipmt;
424 }
2e6a5ee0 425 }
2e6a5ee0 426 }
73df58ab 427 for ( Int_t ipmt=12; ipmt<24; ipmt++)
428 {
38cbfa7c 429 if(time[ipmt] > 1 && ipmt != badpmt)
73df58ab 430 {
431 if(time[ipmt]<besttimeA) {
432 besttimeA=time[ipmt]; //timeA
433 pmtBestA=ipmt;
434 }
435 }
2e6a5ee0 436 }
adf36b9d 437 if(besttimeA < 999999)
73df58ab 438 frecpoints->SetTimeBestA(besttimeA * channelWidth - 1000.*fLatencyHPTDC + 1000.*fLatencyL1A);
adf36b9d 439 if( besttimeC < 999999 )
73df58ab 440 frecpoints->SetTimeBestC(besttimeC * channelWidth - 1000.*fLatencyHPTDC +1000.*fLatencyL1C);
adf36b9d 441 AliDebug(10,Form(" pmtA %i besttimeA %f ps, pmtC %i besttimeC %f ps",
d0bcd1fb 442 pmtBestA,besttimeA, pmtBestC, besttimeC));
adf36b9d 443 if(besttimeA <999999 && besttimeC < 999999 ){
73df58ab 444 timeDiff = ( besttimeA - besttimeC)* 0.001* channelWidth + fLatencyL1A - fLatencyL1C;
445 timeclock = channelWidth * Float_t( besttimeA+besttimeC)/2. - 1000.*fLatencyHPTDC + 1000.*fLatencyL1;
adf36b9d 446 meanTime = (besttimeA+besttimeC-2.*Float_t(ref))/2.;
9480f05f 447 vertex = meanVertex - c*(timeDiff)/2. ; //+ (fdZonA - fdZonC)/2;
adf36b9d 448 }
776de217 449 } //if phys event
adf36b9d 450 AliDebug(5,Form(" timeDiff %f #channel, meanTime %f #channel, TOFmean%f vertex %f cm meanVertex %f online mean %i \n",timeDiff, meanTime,timeclock, vertex,meanVertex, onlineMean));
776de217 451 frecpoints->SetT0clock(timeclock);
452 frecpoints->SetVertex(vertex);
adf36b9d 453 frecpoints->SetMeanTime(meanTime);
776de217 454 frecpoints->SetOnlineMean(Int_t(onlineMean));
adf36b9d 455 // Set triggers
456
457 Bool_t tr[5];
458 Int_t trchan[5]= {50,51,52,55,56};
459 for (Int_t i=0; i<5; i++) tr[i]=false;
460 for (Int_t itr=0; itr<5; itr++) {
38cbfa7c 461 for (Int_t iHit=0; iHit<5; iHit++)
462 {
463 Int_t trr=trchan[itr];
464 if(allData[trr][iHit] > low[trr] &&
465 allData[trr][iHit] < high[trr]&&
466 allData[trr][iHit] > 0) tr[itr]=true;
467 }
adf36b9d 468 }
38cbfa7c 469 frecpoints->SetT0Trig(tr);
470 } // if (else )raw data
58bd3a16 471 recTree->Fill();
472 if(frecpoints) delete frecpoints;
473}
adf36b9d 474
475
476 //____________________________________________________________
477
478 void AliT0Reconstructor::FillESD(TTree */*digitsTree*/, TTree *clustersTree, AliESDEvent *pESD) const
479 {
dc7ca31d 480
481 /***************************************************
482 Resonstruct digits to vertex position
483 ****************************************************/
484
dc7ca31d 485 AliDebug(1,Form("Start FillESD T0"));
58bd3a16 486 Float_t channelWidth = fParam->GetChannelWidth() ;
f7c2c2fc 487 Float_t c = 0.0299792458; // cm/ps
adf36b9d 488 Float_t currentVertex=0, shift=0;
489 Int_t ncont=0;
490 const AliESDVertex* vertex = pESD->GetPrimaryVertex();
491 if (!vertex) vertex = pESD->GetPrimaryVertexSPD();
492 if (!vertex) vertex = pESD->GetPrimaryVertexTPC();
493 if (!vertex) vertex = pESD->GetVertex();
494
495 if (vertex) {
496 AliDebug(2, Form("Got %s (%s) from ESD: %f",
497 vertex->GetName(), vertex->GetTitle(), vertex->GetZ()));
498 currentVertex = vertex->GetZ();
499
500 ncont = vertex->GetNContributors();
501 // cout<<" spdver "<<spdver<<" ncont "<<ncont<<endl;
58bd3a16 502 if(ncont>2 ) {
adf36b9d 503 shift = currentVertex/c;
504 // cout<<" vertex shif "<<shift<<" vertex "<<spdver<<" IsFromVertexer3D "<<fverSPD->IsFromVertexer3D()<<endl;
505 }
506 }
d76c31f4 507 TTree *treeR = clustersTree;
dc7ca31d 508
73df58ab 509 AliT0RecPoint* frecpoints= new AliT0RecPoint ();
510 if (!frecpoints) {
dc7ca31d 511 AliError("Reconstruct Fill ESD >> no recpoints found");
512 return;
513 }
514
515 AliDebug(1,Form("Start FillESD T0"));
516 TBranch *brRec = treeR->GetBranch("T0");
517 if (brRec) {
518 brRec->SetAddress(&frecpoints);
519 }else{
f16935f7 520 AliError(Form("EXEC Branch T0 rec not found"));
dc7ca31d 521 return;
522 }
73df58ab 523
524 brRec->GetEntry(0);
525 Double32_t amp[24], time[24], ampQTC[24], timecorr[24];
526 Double32_t* tcorr;
527 for(Int_t i=0; i<24; i++)
528 amp[i]=time[i]=ampQTC[i]=timecorr[i]=0;
529
530 Double32_t timeClock[3];
531 Double32_t zPosition = frecpoints -> GetVertex();
532 Double32_t timeStart = frecpoints -> GetMeanTime();
533 timeClock[0] = frecpoints -> GetT0clock() ;
534 timeClock[1] = frecpoints -> GetBestTimeA() + shift;
535 timeClock[2] = frecpoints -> GetBestTimeC() - shift;
536 for ( Int_t i=0; i<24; i++) {
537 time[i] = frecpoints -> GetTime(i); // ps to ns
538 if ( time[i] >1) {
345f03db 539 ampQTC[i] = frecpoints -> GetAmp(i);
540 amp[i] = frecpoints -> AmpLED(i);
dc7ca31d 541 }
73df58ab 542 }
543 Int_t trig= frecpoints ->GetT0Trig();
544 pESD->SetT0Trig(trig);
545
546 pESD->SetT0zVertex(zPosition); //vertex Z position
547 pESD->SetT0(timeStart); // interaction time
548 for(Int_t i=0; i<3; i++)
549 pESD->SetT0TOF(i,timeClock[i]); // interaction time (ns)
550 pESD->SetT0time(time); // best TOF on each PMT
345f03db 551 pESD->SetT0amplitude(ampQTC); // number of particles(MIPs) on each PMT
73df58ab 552
553 AliDebug(1,Form("T0: Vertex %f (T0A+T0C)/2 %f #channels T0signal %f ns OrA %f ns OrC %f T0trig %i\n",zPosition, timeStart, timeClock[0], timeClock[1], timeClock[2], trig));
554
555 if (pESD) {
adf36b9d 556
73df58ab 557 AliESDfriend *fr = (AliESDfriend*)pESD->FindListObject("AliESDfriend");
558 if (fr) {
559 AliDebug(1, Form("Writing TZERO friend data to ESD tree"));
560
561 if (ncont>2) {
562 tcorr = fESDTZEROfriend->GetT0timeCorr();
563 for ( Int_t i=0; i<24; i++) {
564 timecorr[i]=tcorr[i];
f7c2c2fc 565 if(i<12 && time[i]>1) timecorr[i] -= shift/channelWidth;
566 if(i>11 && time[i]>1) timecorr[i] += shift/channelWidth;
58bd3a16 567 }
73df58ab 568 fESDTZEROfriend->SetT0timeCorr( timecorr) ;
569 fESDTZEROfriend->SetT0ampLEDminCFD(amp);
570 fESDTZEROfriend->SetT0ampQTC(ampQTC);
571 fr->SetTZEROfriend(fESDTZEROfriend);
572 }//
58bd3a16 573 }
574 }
73df58ab 575
576
577
dc7ca31d 578} // vertex in 3 sigma
579
580
581
582
583
584