X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=T0%2FAliT0Reconstructor.cxx;h=dd19241ead1a22a9570f00620562f44bcbbdec98;hb=b7fd8e8054c49f593407cedbbbc6f5a8535da08b;hp=f2ba2b215c2aaea6c17970b44fddb5ccda78a2c8;hpb=d3e04608f7b477e3fa94793569e2e27366b921e1;p=u%2Fmrichter%2FAliRoot.git diff --git a/T0/AliT0Reconstructor.cxx b/T0/AliT0Reconstructor.cxx index f2ba2b215c2..dd19241ead1 100644 --- a/T0/AliT0Reconstructor.cxx +++ b/T0/AliT0Reconstructor.cxx @@ -31,6 +31,7 @@ #include "AliT0Parameters.h" #include "AliT0Calibrator.h" #include "AliESDfriend.h" +#include "AliESDTZERO.h" #include "AliESDTZEROfriend.h" #include "AliLog.h" #include "AliCDBEntry.h" @@ -63,10 +64,11 @@ ClassImp(AliT0Reconstructor) fGRPdelays(0), fTimeMeanShift(0x0), fTimeSigmaShift(0x0), - fESDTZEROfriend(NULL) + fESDTZEROfriend(NULL), + fESDTZERO(NULL) { - + for (Int_t i=0; i<24; i++) fTime0vertex[i] =0; //constructor AliCDBEntry *entry = AliCDBManager::Instance()->Get("GRP/CTP/CTPtiming"); @@ -93,7 +95,7 @@ ClassImp(AliT0Reconstructor) } else AliWarning("Time Adjust is not found in OCDB !"); - + fParam = AliT0Parameters::Instance(); fParam->Init(); @@ -104,30 +106,35 @@ ClassImp(AliT0Reconstructor) if (gr1) fAmpLED.AddAtAndExpand(gr1,i) ; TGraph* gr2 = fParam ->GetQTC(i); if (gr2) fQTC.AddAtAndExpand(gr2,i) ; - } - + fTime0vertex[i] = fParam->GetCFD(i); + AliDebug(2,Form("OCDB mean CFD time %i %f \n",i, fTime0vertex[i])); + } fLatencyL1 = fParam->GetLatencyL1(); - fLatencyL1A = fParam->GetLatencyL1A(); + fLatencyL1A = fParam->GetLatencyL1A(); fLatencyL1C = fParam->GetLatencyL1C(); fLatencyHPTDC = fParam->GetLatencyHPTDC(); AliDebug(2,Form(" LatencyL1 %f latencyL1A %f latencyL1C %f latencyHPTDC %f \n",fLatencyL1, fLatencyL1A, fLatencyL1C, fLatencyHPTDC)); - - // fdZonC = TMath::Abs(fParam->GetZPositionShift("T0/C/PMT1")); - //fdZonA = TMath::Abs(fParam->GetZPositionShift("T0/A/PMT15")); + + for (Int_t i=0; i<24; i++) { + if( fTime0vertex[i] < 500 || fTime0vertex[i] > 50000) fTime0vertex[i] =( 1000.*fLatencyHPTDC - 1000.*fLatencyL1 + 1000.*fGRPdelays)/24.4; + // printf(" calulated mean %i %f \n",i, fTime0vertex[i]); + } //here real Z position fdZonC = TMath::Abs(fParam->GetZPosition("T0/C/PMT1")); fdZonA = TMath::Abs(fParam->GetZPosition("T0/A/PMT15")); - + // printf(" !!!! fdZonC %f fdZonA %f \n", fdZonC/29.9792458, fdZonA/29.9792458); fCalib = new AliT0Calibrator(); fESDTZEROfriend = new AliESDTZEROfriend(); + fESDTZERO = new AliESDTZERO(); + } //_____________________________________________________________________________ void AliT0Reconstructor::Reconstruct(TTree*digitsTree, TTree*clustersTree) const { // T0 digits reconstruction - Int_t refAmp = Int_t (GetRecoParam()->GetRefAmp()); + Int_t refAmp = 0 ; /*Int_t (GetRecoParam()->GetRefAmp());*/ TArrayI * timeCFD = new TArrayI(24); TArrayI * timeLED = new TArrayI(24); @@ -135,26 +142,35 @@ void AliT0Reconstructor::Reconstruct(TTree*digitsTree, TTree*clustersTree) const TArrayI * chargeQT1 = new TArrayI(24); + Float_t c = 29.9792458; // cm/ns Float_t channelWidth = fParam->GetChannelWidth() ; - Float_t meanVertex = fParam->GetMeanVertex(); - Float_t c = 0.0299792; // cm/ps - Double32_t vertex = 9999999; + Double32_t vertex = 9999999, meanVertex = 0 ; Double32_t timeDiff=999999, meanTime=999999, timeclock=999999; - + AliDebug(1,Form("Start DIGITS reconstruction ")); - Float_t lowAmpThreshold = GetRecoParam()->GetLow(200); - Float_t highAmpThreshold = GetRecoParam()->GetHigh(200); - Int_t badpmt = GetRecoParam()->GetRefPoint(); - + Float_t lowAmpThreshold = GetRecoParam()->GetAmpLowThreshold(); + Float_t highAmpThreshold = GetRecoParam()->GetAmpHighThreshold(); + printf( "AliT0Reconstructor::Reconstruct::: RecoParam amplitude %f %f \n",lowAmpThreshold, highAmpThreshold); + + Double32_t besttimeA=9999999; Double32_t besttimeA_best=9999999; + Double32_t besttimeC=9999999; Double32_t besttimeC_best=9999999; + Int_t timeDelayCFD[24]; + Int_t badpmt[24]; + //Bad channel + for (Int_t i=0; i<24; i++) { + badpmt[i] = GetRecoParam() -> GetBadChannels(i); + timeDelayCFD[i] = Int_t (fParam->GetTimeDelayCFD(i)); + } + fCalib->SetEq(0); TBranch *brDigits=digitsTree->GetBranch("T0"); AliT0digit *fDigits = new AliT0digit() ; if (brDigits) { brDigits->SetAddress(&fDigits); }else{ AliError(Form("EXEC Branch T0 digits not found")); - return; + return; } digitsTree->GetEvent(0); @@ -165,97 +181,115 @@ void AliT0Reconstructor::Reconstruct(TTree*digitsTree, TTree*clustersTree) const fDigits->GetQT0(*chargeQT0); fDigits->GetQT1(*chargeQT1); Int_t onlineMean = fDigits->MeanTime(); - + Bool_t tr[5]; for (Int_t i=0; i<5; i++) tr[i]=false; - Double32_t besttimeA=999999; - Double32_t besttimeC=999999; - Int_t pmtBestA=99999; - Int_t pmtBestC=99999; - AliT0RecPoint* frecpoints= new AliT0RecPoint (); - clustersTree->Branch( "T0", "AliT0RecPoint" ,&frecpoints); + AliT0RecPoint frecpoints; + AliT0RecPoint * pfrecpoints = &frecpoints; + clustersTree->Branch( "T0", "AliT0RecPoint" ,&pfrecpoints); - Float_t time[24], adc[24]; + Float_t time[24], adc[24], adcmip[24]; for (Int_t ipmt=0; ipmt<24; ipmt++) { - if(timeCFD->At(ipmt)>0 && ipmt != badpmt) { - if(( chargeQT1->At(ipmt) - chargeQT0->At(ipmt))>0) + if(timeCFD->At(ipmt)>0 ) { + Float_t timefull = 0.001*( timeCFD->At(ipmt) - 513 - timeDelayCFD[ipmt]) * channelWidth; + frecpoints.SetTimeFull(ipmt, 0 ,timefull) ; + if(( chargeQT1->At(ipmt) - chargeQT0->At(ipmt))>0) adc[ipmt] = chargeQT1->At(ipmt) - chargeQT0->At(ipmt); else adc[ipmt] = 0; - time[ipmt] = fCalib-> WalkCorrection(refAmp, ipmt, Int_t(adc[ipmt]), timeCFD->At(ipmt)) ; - + time[ipmt] = fCalib-> WalkCorrection(refAmp, ipmt, Int_t(adc[ipmt]), timeCFD->At(ipmt)) ; + time[ipmt] = time[ipmt] - 513; Double_t sl = Double_t(timeLED->At(ipmt) - timeCFD->At(ipmt)); // time[ipmt] = fCalib-> WalkCorrection( refAmp,ipmt, Int_t(sl), timeCFD->At(ipmt) ) ; - AliDebug(5,Form(" ipmt %i QTC %i , time in chann %i (led-cfd) %i ", - ipmt, Int_t(adc[ipmt]) ,Int_t(time[ipmt]),Int_t( sl))); - - Double_t ampMip =((TGraph*)fAmpLED.At(ipmt))->Eval(sl); - Double_t qtMip = ((TGraph*)fQTC.At(ipmt))->Eval(adc[ipmt]); - AliDebug(5,Form(" Amlitude in MIPS LED %f , QTC %f in channels %f\n ",ampMip,qtMip, adc[ipmt])); + AliDebug(5,Form(" ipmt %i QTC %i , time in chann %i (led-cfd) %i ", + ipmt, Int_t(adc[ipmt]) ,Int_t(time[ipmt]),Int_t( sl))); - frecpoints->SetTime(ipmt, Float_t(time[ipmt]) ); - frecpoints->SetAmpLED(ipmt, Float_t( ampMip)); //for cosmic &pp beam - frecpoints->SetAmp(ipmt, Float_t(qtMip)); + Double_t ampMip = 0; + TGraph* ampGraph = (TGraph*)fAmpLED.At(ipmt); + if (ampGraph) ampMip = ampGraph->Eval(sl); + Double_t qtMip = 0; + TGraph* qtGraph = (TGraph*)fQTC.At(ipmt); + if (qtGraph) qtMip = qtGraph->Eval(adc[ipmt]); + AliDebug(5,Form(" Amlitude in MIPS LED %f , QTC %f in channels %f\n ",ampMip,qtMip, adc[ipmt])); + frecpoints.SetTime(ipmt, Float_t(time[ipmt]) ); + frecpoints.SetAmpLED(ipmt, Float_t( ampMip)); + frecpoints.SetAmp(ipmt, Float_t(qtMip)); + adcmip[ipmt]=qtMip; } else { - time[ipmt] = 0; + time[ipmt] = -99999; adc[ipmt] = 0; + adcmip[ipmt] = 0; + } } for (Int_t ipmt=0; ipmt<12; ipmt++){ - if(time[ipmt] > 1 && ipmt != badpmt && adc[ipmt]>lowAmpThreshold && adc[ipmt] -9000 + && adcmip[ipmt]>lowAmpThreshold && adcmip[ipmt] 1 && ipmt != badpmt && adc[ipmt]>lowAmpThreshold && adc[ipmt] -9000 + && adcmip[ipmt]>lowAmpThreshold && adcmip[ipmt]SetTimeBestA(Int_t(besttimeA *channelWidth - fdZonA/c)); + + if( besttimeA < 999999 && besttimeA!=0) { + frecpoints.SetTimeBestA((besttimeA_best * channelWidth - fdZonA/c) ); + frecpoints.SetTime1stA((besttimeA * channelWidth - fdZonA/c ) ); tr[1]=true; } - if( besttimeC < 999999 ) { - frecpoints->SetTimeBestC(Int_t(besttimeC *channelWidth - fdZonA/c)); + + if( besttimeC < 999999 && besttimeC!=0) { + frecpoints.SetTimeBestC((besttimeC_best * channelWidth - fdZonC/c) ); + frecpoints.SetTime1stC((besttimeC * channelWidth - fdZonC/c ) ); tr[2]=true; } - AliDebug(5,Form(" besttimeA %f ch, besttimeC %f ch",besttimeA, besttimeC)); + + AliDebug(5,Form("1stimeA %f , besttimeA %f 1sttimeC %f besttimeC %f ", + besttimeA, besttimeA_best, + besttimeC, besttimeC_best) ); + if(besttimeA <999999 && besttimeC < 999999 ){ // timeDiff = (besttimeC - besttimeA)*channelWidth; timeDiff = (besttimeA - besttimeC)*channelWidth; - meanTime = (besttimeA + besttimeC)/2;// * channelWidth); - timeclock = meanTime *channelWidth -fdZonA/c ; - vertex = meanVertex - c*(timeDiff)/2.;// + (fdZonA - fdZonC)/2; + meanTime = channelWidth * (besttimeA_best + besttimeC_best)/2. ; + timeclock = channelWidth * (besttimeA + besttimeC)/2. ; + vertex = meanVertex - 0.001* c*(timeDiff)/2.;// + (fdZonA - fdZonC)/2; tr[0]=true; } - frecpoints->SetVertex(vertex); - frecpoints->SetMeanTime(meanTime); - frecpoints->SetT0clock(timeclock); - frecpoints->SetT0Trig(tr); - + frecpoints.SetVertex(vertex); + frecpoints.SetMeanTime(meanTime ); + frecpoints.SetT0clock(timeclock ); + frecpoints.SetT0Trig(tr); + + AliDebug(5,Form("fRecPoints::: 1stimeA %f , besttimeA %f 1sttimeC %f besttimeC %f vertex %f", + frecpoints.Get1stTimeA(), frecpoints.GetBestTimeA(), + frecpoints.Get1stTimeC(), frecpoints.GetBestTimeC(), + vertex ) ); + AliDebug(5,Form("T0 triggers %d %d %d %d %d",tr[0],tr[1],tr[2],tr[3],tr[4])); - + //online mean - frecpoints->SetOnlineMean(Int_t(onlineMean)); + frecpoints.SetOnlineMean(Int_t(onlineMean)); 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)); - - - - clustersTree->Fill(); - + delete timeCFD; delete timeLED; delete chargeQT0; @@ -269,43 +303,61 @@ void AliT0Reconstructor::Reconstruct(AliRawReader* rawReader, TTree*recTree) con { // T0 raw -> // - // reference amplitude and time ref. point from reco param - Float_t refAmp = GetRecoParam()->GetRefAmp(); - - // Int_t refPoint = 0; + Float_t meanOrA = fTime0vertex[0] + 587; + Float_t meanOrC = fTime0vertex[0] + 678; + Float_t meanTVDC = fTime0vertex[0] + 2564; + Int_t timeDelayCFD[24]; + + Int_t badpmt[24]; //Bad channel - Int_t badpmt = GetRecoParam()->GetRefPoint(); - + for (Int_t i=0; i<24; i++) { + badpmt[i] = GetRecoParam() -> GetBadChannels(i); + timeDelayCFD[i] = Int_t (fParam->GetTimeDelayCFD(i)); + } + Int_t equalize = GetRecoParam() -> GetEq(); + // printf( "AliT0Reconstructor::Reconstruct::: RecoParam %i \n",equalize); + fCalib->SetEq(equalize); Int_t low[500], high[500]; + Float_t timefull=-9999;; + Float_t tvdc = -9999; Float_t ora = -9999; Float_t orc = -9999; Int_t allData[110][5]; Int_t timeCFD[24], timeLED[24], chargeQT0[24], chargeQT1[24]; - Double32_t timeDiff=999999, meanTime=999999, timeclock=9999999; + Float_t time2zero[24]; + Double32_t timeDiff, meanTime, timeclock; + timeDiff = meanTime = timeclock = 9999999; Float_t c = 29.9792458; // cm/ns Double32_t vertex = 9999999; Int_t onlineMean=0; - // Float_t meanVertex = fParam->GetMeanVertex(); Float_t meanVertex = 0; + Int_t pedestal[24]; + for (Int_t i0=0; i0<24; i0++) { + low[i0] = Int_t(fTime0vertex[i0]) - 50; + high[i0] = Int_t(fTime0vertex[i0]) + 50; + time2zero[i0] = 999999; + pedestal[i0]=GetRecoParam()->GetLow(i0+100); + // printf("pmt %i pedestal %i\n", i0,pedestal[i0]); + } + for (Int_t i0=0; i0<110; i0++) - { - for (Int_t j0=0; j0<5; j0++) allData[i0][j0]=0; - low[i0] = Int_t (GetRecoParam()->GetLow(i0)); - high[i0] = Int_t (GetRecoParam()->GetHigh(i0)); - } - Float_t lowAmpThreshold = GetRecoParam()->GetLow(200); - Float_t highAmpThreshold = GetRecoParam()->GetHigh(200); + for (Int_t j0=0; j0<5; j0++) allData[i0][j0]=0; - Double32_t besttimeA=9999999; - Double32_t besttimeC=9999999; - Int_t pmtBestA=99999; - Int_t pmtBestC=99999; - - AliT0RecPoint* frecpoints= new AliT0RecPoint (); + Float_t lowAmpThreshold = GetRecoParam()->GetAmpLowThreshold(); + Float_t highAmpThreshold = GetRecoParam()->GetAmpHighThreshold(); + // printf( "AliT0Reconstructor::Reconstruct::: RecoParam amplitude %f %f \n",lowAmpThreshold, highAmpThreshold); + + Double32_t besttimeA=9999999; Double32_t besttimeA_best=9999999; + Double32_t besttimeC=9999999; Double32_t besttimeC_best=9999999; + + Float_t channelWidth = fParam->GetChannelWidth() ; + + AliT0RecPoint frecpoints; + AliT0RecPoint * pfrecpoints = &frecpoints; - recTree->Branch( "T0", "AliT0RecPoint" ,&frecpoints); + recTree->Branch( "T0", "AliT0RecPoint" ,&pfrecpoints); AliDebug(10," before read data "); AliT0RawReader myrawreader(rawReader); @@ -331,22 +383,13 @@ void AliT0Reconstructor::Reconstruct(AliRawReader* rawReader, TTree*recTree) con allData[i][iHit] = myrawreader.GetData(i,iHit); } } - Int_t ref=0; - - // if (refPoint>0) - // ref = allData[refPoint][0]-5000; - - - Float_t channelWidth = fParam->GetChannelWidth() ; - - // Int_t meanT0 = fParam->GetMeanT0(); for (Int_t in=0; in<12; in++) { for (Int_t iHit=0; iHit<5; iHit++) { - if(allData[in+1][iHit] > low[in+1] && - allData[in+1][iHit] < high[in+1]) + if(allData[in+1][iHit] > low[in] && + allData[in+1][iHit] < high[in]) { timeCFD[in] = allData[in+1][iHit] ; break; @@ -354,36 +397,18 @@ void AliT0Reconstructor::Reconstruct(AliRawReader* rawReader, TTree*recTree) con } for (Int_t iHit=0; iHit<5; iHit++) { - if(allData[in+12+1][iHit] > low[in+12+1] && - allData[in+1+12][iHit] < high[in+12+1]) - { - timeLED[in] = allData[in+12+1][iHit] ; - break; - } - } - for (Int_t iHit=0; iHit<5; iHit++) - { - if(allData[in+1+56][iHit] > low[in+1+56] && - allData[in+1+56][iHit] < high[in+1+56]) + if(allData[in+1+56][iHit] > low[in] && + allData[in+1+56][iHit] < high[in]) { timeCFD[in+12] = allData[in+56+1][iHit] ; break; } } - - for (Int_t iHit=0; iHit<5; iHit++) - { - if(allData[in+1+68][iHit] > low[in+1+68] && - allData[in+1+68][iHit] < high[in+1+68]) - { - - timeLED[in+12] = allData[in+68+1][iHit] ; - break; - } - } - AliDebug(5, Form(" readed i %i cfdC %i cfdA %i ledC %i ledA%i ", + timeLED[in+12] = allData[in+68+1][0] ; + timeLED[in] = allData[in+12+1][0] ; + AliDebug(50, Form(" readed i %i cfdC %i cfdA %i ledC %i ledA%i ", in, timeCFD[in],timeCFD[in+12],timeLED[in], - timeLED[in+12])); + timeLED[in+12])); } @@ -392,127 +417,208 @@ void AliT0Reconstructor::Reconstruct(AliRawReader* rawReader, TTree*recTree) con { chargeQT0[in]=allData[2*in+25][0]; chargeQT1[in]=allData[2*in+26][0]; - AliDebug(10, Form(" readed Raw %i %i %i", + AliDebug(25, Form(" readed Raw %i %i %i", in, chargeQT0[in],chargeQT1[in])); } for (Int_t in=12; in<24; in++) { chargeQT0[in]=allData[2*in+57][0]; chargeQT1[in]=allData[2*in+58][0]; - AliDebug(10, Form(" readed Raw %i %i %i", + AliDebug(25, Form(" readed Raw %i %i %i", in, chargeQT0[in],chargeQT1[in])); - } - for (Int_t iHit=0; iHit<5; iHit++) - { - if(allData[49][iHit] > low[49] && - allData[49][iHit] < high[49]){ - onlineMean = allData[49][iHit]; - break; - } - } - Double32_t time[24], adc[24], noncalibtime[24]; + onlineMean = allData[49][0]; + + Double32_t time[24], adc[24], adcmip[24], noncalibtime[24]; for (Int_t ipmt=0; ipmt<24; ipmt++) { - if(timeCFD[ipmt]>0 && ipmt != badpmt ){ - //for simulated data + if(timeCFD[ipmt] > 0 &&( chargeQT0[ipmt] - chargeQT1[ipmt])>pedestal[ipmt] /* && badpmt[ipmt]==0*/ ) { //for physics data - if(( chargeQT0[ipmt] - chargeQT1[ipmt])>0) { + if(( chargeQT0[ipmt] - chargeQT1[ipmt])>pedestal[ipmt]) { adc[ipmt] = chargeQT0[ipmt] - chargeQT1[ipmt]; } else adc[ipmt] = 0; - time[ipmt] = fCalib-> WalkCorrection(Int_t (refAmp), ipmt, Int_t(adc[ipmt]), timeCFD[ipmt] ) ; - + // time[ipmt] = fCalib-> WalkCorrection(refAmp, ipmt, Int_t(adc[ipmt]), timeCFD[ipmt] ) ; + Int_t refAmp = Int_t (fTime0vertex[ipmt]); + time[ipmt] = fCalib-> WalkCorrection( refAmp, ipmt, Int_t(adc[ipmt]), timeCFD[ipmt] ) ; Double_t sl = timeLED[ipmt] - timeCFD[ipmt]; // time[ipmt] = fCalib-> WalkCorrection( refAmp,ipmt, Int_t(sl), timeCFD[ipmt] ) ; AliDebug(5,Form(" ipmt %i QTC %i , time in chann %i (led-cfd) %i ", ipmt, Int_t(adc[ipmt]) ,Int_t(time[ipmt]),Int_t( sl))); - Double_t ampMip =( (TGraph*)fAmpLED.At(ipmt))->Eval(sl); - Double_t qtMip = ((TGraph*)fQTC.At(ipmt))->Eval(adc[ipmt]); + Double_t ampMip = 0; + TGraph * ampGraph = (TGraph*)fAmpLED.At(ipmt); + if (ampGraph) ampMip = ampGraph->Eval(sl); + Double_t qtMip = 0; + TGraph * qtGraph = (TGraph*)fQTC.At(ipmt); + if (qtGraph) qtMip = qtGraph->Eval(adc[ipmt]); AliDebug(10,Form(" Amlitude in MIPS LED %f ; QTC %f; in channels %f\n ",ampMip,qtMip, adc[ipmt])); - //bad peak removing - frecpoints->SetTime(ipmt, Float_t(time[ipmt]) ); - // frecpoints->SetTime(ipmt,Double32_t(timeCFD[ipmt])); - frecpoints->SetAmp(ipmt, Double32_t( qtMip)); //for cosmic &pp beam - frecpoints->SetAmpLED(ipmt, Double32_t(ampMip)); - noncalibtime[ipmt]= Double32_t (timeCFD[ipmt]); + if( qtMip>lowAmpThreshold && qtMipSetT0timeCorr(noncalibtime) ; + fESDTZEROfriend->SetT0timeCorr(noncalibtime) ; + for (Int_t ipmt=0; ipmt<12; ipmt++){ - if(time[ipmt] > 1 && ipmt != badpmt && adc[ipmt]>lowAmpThreshold && adc[ipmt] -9000 + /*&& badpmt[ipmt]==0 */ + && adcmip[ipmt]>lowAmpThreshold && adcmip[ipmt] 1 && ipmt != badpmt && adc[ipmt]>lowAmpThreshold && adc[ipmt] -9000 + /* && badpmt[ipmt]==0*/ + && adcmip[ipmt]>lowAmpThreshold && adcmip[ipmt]<40) + // && adcmip[ipmt]>lowAmpThreshold && adcmip[ipmt]SetTimeBestA(besttimeA * channelWidth - 1000.*fLatencyHPTDC + 1000.*fLatencyL1A - 1000.*fGRPdelays - fTimeMeanShift[1]); - - if( besttimeC < 999999 ) - frecpoints->SetTimeBestC(besttimeC * channelWidth - 1000.*fLatencyHPTDC +1000.*fLatencyL1C - 1000.*fGRPdelays - fTimeMeanShift[2]); - AliDebug(5,Form(" pmtA %i besttimeA %f shift A %f ps, pmtC %i besttimeC %f shiftC %f ps", - pmtBestA,besttimeA, fTimeMeanShift[1], - - pmtBestC, besttimeC,fTimeMeanShift[2])); - if(besttimeA <999999 && besttimeC < 999999 ){ - timeDiff = ( besttimeA - besttimeC)* 0.001* channelWidth + fLatencyL1A - fLatencyL1C; - timeclock = channelWidth * Float_t( besttimeA+besttimeC)/2. - 1000.*fLatencyHPTDC + 1000.*fLatencyL1 - 1000.*fGRPdelays - fTimeMeanShift[0]; - meanTime = (besttimeA+besttimeC-2.*Float_t(ref))/2.; + + if(besttimeA < 999999 && besttimeA!=0 ) { + if( equalize ==0 ) + frecpoints.SetTime1stA((besttimeA * channelWidth)- 1000.*fLatencyHPTDC + 1000.*fLatencyL1A - 1000.*fGRPdelays - fTimeMeanShift[1] ); + else + { + frecpoints.SetTimeBestA((besttimeA_best * channelWidth )); + frecpoints.SetTime1stA((besttimeA * channelWidth - fTimeMeanShift[1])); + } + } + if( besttimeC < 999999 && besttimeC!=0) { + if( equalize ==0 ) + frecpoints.SetTime1stC((besttimeC * channelWidth)- 1000.*fLatencyHPTDC +1000.*fLatencyL1C - 1000.*fGRPdelays - fTimeMeanShift[2]); + else + { + frecpoints.SetTimeBestC((besttimeC_best * channelWidth )); + frecpoints.SetTime1stC((besttimeC * channelWidth - fTimeMeanShift[2])); + } + } + AliDebug(5,Form("1stimeA %f , besttimeA %f 1sttimeC %f besttimeC %f ", + besttimeA, besttimeA_best, + besttimeC, besttimeC_best) ); + AliDebug(5,Form("fRecPoints::: 1stimeA %f , besttimeA %f 1sttimeC %f besttimeC %f shiftA %f shiftC %f ", + frecpoints.Get1stTimeA(), frecpoints.GetBestTimeA(), + frecpoints.Get1stTimeC(), frecpoints.GetBestTimeC(), + fTimeMeanShift[1],fTimeMeanShift[2] ) ); + if( besttimeC < 999999 && besttimeA < 999999) { + if(equalize ==0 ) + timeclock = ((besttimeC * channelWidth)- 1000.*fLatencyHPTDC +1000.*fLatencyL1 - 1000.*fGRPdelays - fTimeMeanShift[0]); + else + { + timeclock = channelWidth * Float_t( besttimeA+besttimeC)/2. - fTimeMeanShift[0]; + meanTime = channelWidth * Float_t(besttimeA_best + besttimeC_best )/2.; + } + timeDiff = ( besttimeA - besttimeC)* 0.001* channelWidth ; vertex = meanVertex - c*(timeDiff)/2. ; //+ (fdZonA - fdZonC)/2; - } + } + } //if phys event - AliDebug(10,Form(" timeDiff %f #channel, meanTime %f #channel, TOFmean%f vertex %f cm meanVertex %f online mean %i \n",timeDiff, meanTime,timeclock, vertex,meanVertex, onlineMean)); - frecpoints->SetT0clock(timeclock); - frecpoints->SetVertex(vertex); - frecpoints->SetMeanTime(meanTime); - frecpoints->SetOnlineMean(Int_t(onlineMean)); - // Set triggers + AliDebug(1,Form(" timeDiff %f #channel, meanTime %f #ps, TOFmean%f vertex %f cm meanVertex %f \n",timeDiff, meanTime,timeclock, vertex,meanVertex)); + frecpoints.SetT0clock(timeclock); + frecpoints.SetVertex(vertex); + frecpoints.SetMeanTime(meanTime); + frecpoints.SetOnlineMean(Int_t(onlineMean)); + // Set triggers Bool_t tr[5]; - Int_t trchan[5]= {50,51,52,55,56}; - for (Int_t i=0; i<5; i++) tr[i]=false; + Int_t trchan[5] = {50,51,52,55,56}; + Float_t lowtr[5] = {meanTVDC-700, meanOrA-700, meanOrC-700, meanOrC-1000, meanOrC-1000 }; + Float_t hightr[5] = {meanTVDC+700, meanOrA+700, meanOrC+700, meanOrC+1000, meanOrC+1000}; + + for (Int_t i=0; i<5; i++) tr[i] = false; for (Int_t itr=0; itr<5; itr++) { - for (Int_t iHit=0; iHit<5; iHit++) + for (Int_t iHit=0; iHit<1; iHit++) { Int_t trr=trchan[itr]; - if( allData[trr][iHit] > 0) tr[itr]=true; - } + if( allData[trr][iHit] > lowtr[itr] && allData[trr][iHit] < hightr[itr]) tr[itr]=true; + + AliDebug(15,Form("Reconstruct ::: T0 triggers iHit %i tvdc %d orA %d orC %d centr %d semicentral %d",iHit, tr[0],tr[1],tr[2],tr[3],tr[4])); + } } - frecpoints->SetT0Trig(tr); - + frecpoints.SetT0Trig(tr); + + // all times with amplitude correction + Float_t timecent; + for (Int_t iHit=0; iHit<5; iHit++) + { + timefull = timecent = -9999; + tvdc = ora = orc = -9999; + if(allData[50][iHit]>0) + tvdc = (Float_t(allData[50][iHit]) - meanTVDC) * channelWidth* 0.001; + if(allData[51][iHit]>0) + ora = (Float_t(allData[51][iHit]) - meanOrA) * channelWidth* 0.001; + + if(allData[52][iHit]>0) + orc = (Float_t(allData[52][iHit]) - meanOrC) * channelWidth* 0.001; + + frecpoints.SetOrC( iHit, orc); + frecpoints.SetOrA( iHit, ora); + frecpoints.SetTVDC( iHit, tvdc); + for (Int_t i0=0; i0<12; i0++) { + if (equalize ==0 ) + timecent = fTime0vertex[i0] + timeDelayCFD[i0]; + else + timecent = fTime0vertex[i0]; + timefull = -9999; + if(allData[i0+1][iHit]>1) + timefull = (Float_t(allData[i0+1][iHit]) - timecent)* channelWidth* 0.001; + frecpoints.SetTimeFull(i0, iHit,timefull) ; + // if(allData[i0+1][iHit]>1) printf("i0 %d iHit %d data %d fTime0vertex %f timefull %f \n",i0, iHit, allData[i0+1][iHit], fTime0vertex[i0], timefull); + + } + + for (Int_t i0=12; i0<24; i0++) { + timefull = -9999; + if (equalize ==0 ) + timecent = fTime0vertex[i0] + timeDelayCFD[i0]; + else + timecent = fTime0vertex[i0]; + if(allData[i0+45][iHit]>1) { + timefull = (Float_t(allData[i0+45][iHit]) - timecent)* channelWidth* 0.001; + } + // if(allData[i0+45][iHit]>1) printf("i0 %d iHit %d data %d fTime0vertex %f timefull %f \n",i0, iHit, allData[i0+45][iHit], fTime0vertex[i0], timefull); + frecpoints.SetTimeFull(i0, iHit, timefull) ; + } + } + + //Set MPD if(allData[53][0]>0 && allData[54][0]) - frecpoints->SetMultA(allData[53][0]-allData[54][0]); - if(allData[105][0]>0 && allData[106][0]) - frecpoints->SetMultC(allData[105][0]-allData[106][0]); - - + frecpoints.SetMultA(allData[53][0]-allData[54][0]); + if(allData[105][0]>0 && allData[106][0]) + frecpoints.SetMultC(allData[105][0]-allData[106][0]); + + } // if (else )raw data recTree->Fill(); - if(frecpoints) delete frecpoints; } - //____________________________________________________________ +//____________________________________________________________ void AliT0Reconstructor::FillESD(TTree */*digitsTree*/, TTree *clustersTree, AliESDEvent *pESD) const { @@ -522,6 +628,10 @@ void AliT0Reconstructor::Reconstruct(AliRawReader* rawReader, TTree*recTree) con ****************************************************/ AliDebug(1,Form("Start FillESD T0")); + if(!pESD) { + AliError("No ESD Event"); + return; + } pESD ->SetT0spread(fTimeSigmaShift); @@ -540,23 +650,19 @@ void AliT0Reconstructor::Reconstruct(AliRawReader* rawReader, TTree*recTree) con currentVertex = vertex->GetZ(); ncont = vertex->GetNContributors(); - // cout<<"@@ spdver "<0 ) { shift = currentVertex/c; } } TTree *treeR = clustersTree; - AliT0RecPoint* frecpoints= new AliT0RecPoint (); - if (!frecpoints) { - AliError("Reconstruct Fill ESD >> no recpoints found"); - return; - } + AliT0RecPoint frecpoints; + AliT0RecPoint * pfrecpoints = &frecpoints; AliDebug(1,Form("Start FillESD T0")); TBranch *brRec = treeR->GetBranch("T0"); if (brRec) { - brRec->SetAddress(&frecpoints); + brRec->SetAddress(&pfrecpoints); }else{ AliError(Form("EXEC Branch T0 rec not found")); return; @@ -568,52 +674,91 @@ void AliT0Reconstructor::Reconstruct(AliRawReader* rawReader, TTree*recTree) con for(Int_t i=0; i<24; i++) amp[i]=time[i]=ampQTC[i]=timecorr[i]=0; - + //1st time Double32_t timeClock[3]; - Double32_t zPosition = frecpoints -> GetVertex(); - Double32_t timeStart = frecpoints -> GetMeanTime(); - timeClock[0] = frecpoints -> GetT0clock() ; - timeClock[1] = frecpoints -> GetBestTimeA() + shift; - timeClock[2] = frecpoints -> GetBestTimeC() - shift; + Double32_t zPosition = frecpoints.GetVertex(); + + timeClock[0] = frecpoints.GetT0clock() ; + timeClock[1] = frecpoints.Get1stTimeA() + shift; + timeClock[2] = frecpoints.Get1stTimeC() - shift; + //best time + Double32_t timemean[3]; + timemean[0] = frecpoints.GetMeanTime(); + timemean[1] = frecpoints.GetBestTimeA() + shift; + timemean[2] = frecpoints.GetBestTimeC() - shift; + + for(Int_t i=0; i<3; i++) { + fESDTZERO->SetT0TOF(i,timeClock[i]); // interaction time (ns) + fESDTZERO->SetT0TOFbest(i,timemean[i]); // interaction time (ns) + } for ( Int_t i=0; i<24; i++) { - time[i] = frecpoints -> GetTime(i); // ps to ns - if ( time[i] >1) { - ampQTC[i] = frecpoints -> GetAmp(i); - amp[i] = frecpoints -> AmpLED(i); - AliDebug(1,Form("T0: time %f ampQTC %f ampLED %f \n", time[i], ampQTC[i], amp[i])); + time[i] = frecpoints.GetTime(i); // ps to ns + if ( time[i] != 0 && time[i]>-9999) { + ampQTC[i] = frecpoints.GetAmp(i); + amp[i] = frecpoints.AmpLED(i); + AliDebug(1,Form("T0: %i time %f ampQTC %f ampLED %f \n", i, time[i], ampQTC[i], amp[i])); } } - Int_t trig= frecpoints ->GetT0Trig(); - pESD->SetT0Trig(trig); - - pESD->SetT0zVertex(zPosition); //vertex Z position - - Double32_t multA=frecpoints ->GetMultA(); - Double32_t multC=frecpoints ->GetMultC(); - // pESD->SetT0MultC(multC); // multiplicity Cside - // pESD->SetT0MultA(multA); // multiplicity Aside - pESD->SetT0(multA); // for backward compatubility - pESD->SetT0clock(multC); // for backward compatubility - - for(Int_t i=0; i<3; i++) - pESD->SetT0TOF(i,timeClock[i]); // interaction time (ns) - pESD->SetT0time(time); // best TOF on each PMT - pESD->SetT0amplitude(ampQTC); // number of particles(MIPs) on each PMT + fESDTZERO->SetT0time(time); // best TOF on each PMT + fESDTZERO->SetT0amplitude(ampQTC); // number of particles(MIPs) on each PMT + Int_t trig= frecpoints.GetT0Trig(); + frecpoints.PrintTriggerSignals( trig); + // printf(" !!!!! FillESD trigger %i \n",trig); + fESDTZERO->SetT0Trig(trig); + fESDTZERO->SetT0zVertex(zPosition); //vertex Z position + + Double32_t multA=frecpoints.GetMultA(); + Double32_t multC=frecpoints.GetMultC(); + fESDTZERO->SetMultA(multA); // for backward compatubility + fESDTZERO->SetMultC(multC); // for backward compatubility + + + for (Int_t iHit =0; iHit<5; iHit++ ) { + AliDebug(10,Form("FillESD ::: iHit %i tvdc %f orA %f orC %f\n", iHit, + frecpoints.GetTVDC(iHit), + frecpoints.GetOrA(iHit), + frecpoints.GetOrC(iHit) )); + fESDTZERO->SetTVDC(iHit,frecpoints.GetTVDC(iHit)); + fESDTZERO->SetOrA(iHit,frecpoints.GetOrA(iHit)); + fESDTZERO->SetOrC(iHit,frecpoints.GetOrC(iHit)); + + for (Int_t i0=0; i0<24; i0++) { + // if(frecpoints.GetTimeFull(i0,iHit)>0){ + // printf("FillESD ::: iHit %i cfd %i time %f \n", iHit, i0, frecpoints.GetTimeFull(i0,iHit)); + fESDTZERO->SetTimeFull(i0, iHit,frecpoints.GetTimeFull(i0,iHit)); + // } + + } + } - 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)); + AliDebug(1,Form("T0: SPDshift %f Vertex %f (T0A+T0C)/2 best %f #ps T0signal %f ps OrA %f ps OrC %f ps T0trig %i\n",shift, zPosition, timemean[0], timeClock[0], timeClock[1], timeClock[2], trig)); + + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // background flags + Bool_t background = BackgroundFlag(); + fESDTZERO->SetBackgroundFlag(background); + Bool_t pileup = PileupFlag(); + fESDTZERO->SetPileupFlag(pileup); + for (Int_t i=0; i<5; i++) { + fESDTZERO->SetPileupTime(i, frecpoints.GetTVDC(i) ) ; + // printf("!!!!!! FillESD :: pileup %i %f %f \n", i,fESDTZERO->GetPileupTime(i), frecpoints.GetTVDC(i)); + } + Bool_t sat = SatelliteFlag(); + fESDTZERO->SetSatelliteFlag(sat); + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (pESD) { AliESDfriend *fr = (AliESDfriend*)pESD->FindListObject("AliESDfriend"); if (fr) { - AliDebug(1, Form("Writing TZERO friend data to ESD tree")); + AliDebug(10, Form("Writing TZERO friend data to ESD tree")); // if (ncont>2) { tcorr = fESDTZEROfriend->GetT0timeCorr(); for ( Int_t i=0; i<24; i++) { if(i<12 && time[i]>1) timecorr[i] = tcorr[i] - shift/channelWidth; if(i>11 && time[i]>1) timecorr[i] = tcorr[i] + shift/channelWidth; - if(time[i]>1) AliDebug(10,Form("T0 friend : time %f ampQTC %f ampLED %f \n", timecorr[i], ampQTC[i], amp[i])); + if(time[i]>1) AliDebug(10,Form("T0 friend : %i time %f ampQTC %f ampLED %f \n", i, timecorr[i], ampQTC[i], amp[i])); } fESDTZEROfriend->SetT0timeCorr( timecorr) ; fESDTZEROfriend->SetT0ampLEDminCFD(amp); @@ -621,14 +766,68 @@ void AliT0Reconstructor::Reconstruct(AliRawReader* rawReader, TTree*recTree) con fr->SetTZEROfriend(fESDTZEROfriend); // }// } - } - + pESD->SetTZEROData(fESDTZERO); + } } // vertex in 3 sigma +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + //____________________________________________________________ + +Bool_t AliT0Reconstructor::PileupFlag() const +{ + // + Bool_t pileup = false; + Float_t tvdc[5]; + for (Int_t ih=0; ih<5; ih++) + { + tvdc[ih] = fESDTZERO->GetTVDC(ih); + + if( tvdc[0] !=0 && tvdc[0]> -10 && tvdc[0]< 10 ) + if(ih>0 && tvdc[ih]>20 ) pileup = true; + if( tvdc[0] >20 || (tvdc[0] < -20 && tvdc[0] > -9000) ) pileup =true; + // if (pileup) printf(" !!!!! pile up %i tvdc %f \n",ih, tvdc[ih]); + } + + + return pileup; + +} + + //____________________________________________________________ + +Bool_t AliT0Reconstructor::BackgroundFlag() const +{ + Bool_t background = false; + + Float_t orA = fESDTZERO->GetOrA(0); + Float_t orC = fESDTZERO->GetOrC(0); + Float_t tvdc = fESDTZERO->GetTVDC(0); + + if ( (orA > -5 && orA <5) && (orC > -5 && orC <5) && (tvdc < -5 || tvdc > 5)) { + background = true; + // printf(" orA %f orC %f tvdc %f\n", orA, orC, tvdc); + } + return background; +} + //____________________________________________________________ + +Bool_t AliT0Reconstructor::SatelliteFlag() const +{ + Float_t satelliteLow = GetRecoParam() -> GetLowSatelliteThreshold(); + Float_t satelliteHigh = GetRecoParam() -> GetHighSatelliteThreshold(); + Bool_t satellite = false; + for (Int_t i0=0; i0<24; i0++) { + Float_t timefull = fESDTZERO -> GetTimeFull(i0,0); + if( timefull > satelliteLow && timefull < satelliteHigh) satellite=true; + } + + return satellite; + +}