- }
-
- // fill fBins with digits data
- if (input.GetSignal() <= zeroSup) continue;
- Int_t i = input.GetPad() + 3;
- Int_t j = input.GetTime() + 3;
- fBins[i*fMaxTime+j] = input.GetSignal();
- }
-
- // find clusters in split rows that were skipped until now.
- // this can happen if the rows were not splitted
- for (fSector = 0; fSector < kNS; fSector++)
- for (Int_t iSplit = 0; iSplit < 2; iSplit++)
- if (splitRows[fSector + kNS*iSplit]) {
-
- Int_t iRow = -1;
- if (fSector < kNIS) {
- iRow = 30;
- fMaxPad = fParam->GetNPadsLow(iRow);
- fSign = (fSector < kNIS/2) ? 1 : -1;
- } else {
- if (iSplit == 0) iRow = 27; else iRow = 76;
- fMaxPad = fParam->GetNPadsUp(iRow);
- fSign = ((fSector-kNIS) < kNOS/2) ? 1 : -1;
+ if (iPad!=lastPad){
+ gain = gainROC->GetValue(iRow,iPad);
+ lastPad = iPad;
+ }
+ iPad+=3;
+ //time
+ Int_t iTimeBin = input.GetTime();
+ if ( iTimeBin < fRecoParam->GetFirstBin() || iTimeBin >= fRecoParam->GetLastBin()){
+ continue;
+ AliFatal(Form("Timebin index (%d) outside the range (%d -> %d) !",
+ iTimeBin, 0, iTimeBin -1));
+ }
+ iTimeBin+=3;
+
+ //signal
+ Float_t signal = input.GetSignal();
+ if (!calcPedestal && signal <= zeroSup) continue;
+ if (!calcPedestal) {
+ Int_t bin = iPad*fMaxTime+iTimeBin;
+ allBins[iRow][bin] = signal/gain;
+ allSigBins[iRow][allNSigBins[iRow]++] = bin;
+ }else{
+ allBins[iRow][iPad*fMaxTime+iTimeBin] = signal;
+ }
+ allBins[iRow][iPad*fMaxTime+0]+=1.; // pad with signal
+
+ // Temporary
+ digCounter++;
+ } // End of the loop over altro data
+ //
+ //
+ //
+ //
+ // Now loop over rows and perform pedestal subtraction
+ if (digCounter==0) continue;
+ // if (calcPedestal) {
+ if (kTRUE) {
+ for (Int_t iRow = 0; iRow < nRows; iRow++) {
+ Int_t maxPad;
+ if (fSector < kNIS)
+ maxPad = fParam->GetNPadsLow(iRow);
+ else
+ maxPad = fParam->GetNPadsUp(iRow);
+
+ for (Int_t iPad = 3; iPad < maxPad + 3; iPad++) {
+ //
+ // Temporary fix for data production - !!!! MARIAN
+ // The noise calibration should take mean and RMS - currently the Gaussian fit used
+ // In case of double peak - the pad should be rejected
+ //
+ // Line mean - if more than given digits over threshold - make a noise calculation
+ // and pedestal substration
+ if (!calcPedestal && allBins[iRow][iPad*fMaxTime+0]<50) continue;
+ //
+ if (allBins[iRow][iPad*fMaxTime+0] <1 ) continue; // no data
+ Float_t *p = &allBins[iRow][iPad*fMaxTime+3];
+ //Float_t pedestal = TMath::Median(fMaxTime, p);
+ Int_t id[3] = {fSector, iRow, iPad-3};
+ // calib values
+ Double_t rmsCalib= noiseROC->GetValue(iRow,iPad-3);
+ Double_t pedestalCalib = pedestalROC->GetValue(iRow,iPad-3);
+ Double_t rmsEvent = rmsCalib;
+ Double_t pedestalEvent = pedestalCalib;
+ ProcesSignal(p, fMaxTime, id, rmsEvent, pedestalEvent);
+ if (rmsEvent<rmsCalib) rmsEvent = rmsCalib; // take worst scenario
+ if (TMath::Abs(pedestalEvent-pedestalCalib)<1.0) pedestalEvent = pedestalCalib;
+
+ //
+ for (Int_t iTimeBin = 0; iTimeBin < fMaxTime; iTimeBin++) {
+ Int_t bin = iPad*fMaxTime+iTimeBin;
+ allBins[iRow][bin] -= pedestalEvent;
+ if (iTimeBin < AliTPCReconstructor::GetRecoParam()->GetFirstBin())
+ allBins[iRow][bin] = 0;
+ if (iTimeBin > AliTPCReconstructor::GetRecoParam()->GetLastBin())
+ allBins[iRow][bin] = 0;
+ if (allBins[iRow][iPad*fMaxTime+iTimeBin] < zeroSup)
+ allBins[iRow][bin] = 0;
+ if (allBins[iRow][bin] < 3.0*rmsEvent) // 3 sigma cut on RMS
+ allBins[iRow][bin] = 0;
+ if (allBins[iRow][bin]) allSigBins[iRow][allNSigBins[iRow]++] = bin;
+ }