- AliVZEROdigit* digit = (AliVZEROdigit*)digitsArray->At(d);
- Int_t pmNumber = digit->PMNumber();
- // Pedestal retrieval and suppression:
- Int_t pedestal = int(fCalibData->GetPedestal(d));
- adc[pmNumber] = (Short_t) digit->ADC() - pedestal;
- time[pmNumber] = (Short_t) digit->Time();
- width[pmNumber] = (Short_t) digit->Width();
- BBFlag[pmNumber]= digit->BBFlag();
- BGFlag[pmNumber]= digit->BGFlag();
- // printf("PM = %d, MIP per ADC channel = %f \n",pmNumber, fCalibData->GetMIPperADC(pmNumber));
- // cut of ADC at 1MIP/2
- if(fCollisionMode >0) {
- Float_t MIP = 2.0;
- if (adc[pmNumber] > (int(MIP) /2) ) mult[pmNumber] += float(adc[pmNumber])*(1.0/MIP) ;
- }
- else{
- if (adc[pmNumber] > (int(1.0/fCalibData->GetMIPperADC(pmNumber)) /2) )
- mult[pmNumber] += float(adc[pmNumber])*fCalibData->GetMIPperADC(pmNumber);
- }
+ AliVZEROdigit* digit = (AliVZEROdigit*) fDigitsArray->At(d);
+ Int_t pmNumber = digit->PMNumber();
+
+ // Pedestal retrieval and suppression
+ Bool_t integrator = digit->Integrator();
+ Float_t maxadc = 0;
+ Int_t imax = -1;
+ Float_t adcPedSub[AliVZEROdigit::kNClocks];
+ for(Int_t iClock=0; iClock < AliVZEROdigit::kNClocks; ++iClock) {
+ Short_t charge = digit->ChargeADC(iClock);
+ Bool_t iIntegrator = (iClock%2 == 0) ? integrator : !integrator;
+ Int_t k = pmNumber + 64*iIntegrator;
+ adcPedSub[iClock] = (Float_t)charge - fCalibData->GetPedestal(k);
+ if(adcPedSub[iClock] <= GetRecoParam()->GetNSigmaPed()*fCalibData->GetSigma(k)) {
+ adcPedSub[iClock] = 0;
+ continue;
+ }
+ if(iClock < GetRecoParam()->GetStartClock() || iClock > GetRecoParam()->GetEndClock()) continue;
+ if(adcPedSub[iClock] > maxadc) {
+ maxadc = adcPedSub[iClock];
+ imax = iClock;
+ }
+ }
+
+ if (imax != -1) {
+ Int_t start = imax - GetRecoParam()->GetNPreClocks();
+ if (start < 0) start = 0;
+ Int_t end = imax + GetRecoParam()->GetNPostClocks();
+ if (end > 20) end = 20;
+ for(Int_t iClock = start; iClock <= end; iClock++) {
+ adc[pmNumber] += adcPedSub[iClock];
+ }
+ }
+
+ // HPTDC leading time and width
+ // Correction for slewing and various time delays
+ time[pmNumber] = CorrectLeadingTime(pmNumber,digit->Time(),adc[pmNumber]);
+ width[pmNumber] = digit->Width();
+
+ if (adc[pmNumber] > 0) {
+ AliDebug(1,Form("PM = %d ADC = %f TDC %f (%f) Int %d (%d %d %d %d %d) %f %f %f %f %d %d",pmNumber, adc[pmNumber],
+ digit->Time(),time[pmNumber],
+ integrator,
+ digit->ChargeADC(8),digit->ChargeADC(9),digit->ChargeADC(10),
+ digit->ChargeADC(11),digit->ChargeADC(12),
+ fCalibData->GetPedestal(pmNumber),fCalibData->GetSigma(pmNumber),
+ fCalibData->GetPedestal(pmNumber+64),fCalibData->GetSigma(pmNumber+64),
+ aBBflag[pmNumber],aBGflag[pmNumber]));
+ };
+
+ TF1 *saturationFunc = (TF1*)fSaturationCorr->UncheckedAt(pmNumber);
+ if (!saturationFunc) AliFatal(Form("Saturation correction for channel %d is not found!",pmNumber));
+ AliDebug(1,Form("Saturation PM=%d %f %f",pmNumber,adc[pmNumber],saturationFunc->Eval(adc[pmNumber])));
+ mult[pmNumber] = saturationFunc->Eval(adc[pmNumber])*fCalibData->GetMIPperADC(pmNumber);
+
+ // Fill ESD friend object
+ for (Int_t iEv = 0; iEv < AliESDVZEROfriend::kNEvOfInt; iEv++) {
+ fESDVZEROfriend->SetPedestal(pmNumber,iEv,(Float_t)digit->ChargeADC(iEv));
+ fESDVZEROfriend->SetIntegratorFlag(pmNumber,iEv,(iEv%2 == 0) ? integrator : !integrator);
+ }
+ fESDVZEROfriend->SetTime(pmNumber,digit->Time());
+ fESDVZEROfriend->SetWidth(pmNumber,digit->Width());
+