- // simple ITS cluster finder -- online zero-suppression conditions
-
- Int_t db,tl,th;
- Double_t tmp1,tmp2;
- AliITSCalibrationSDD* res = (AliITSCalibrationSDD*)GetCalibrationModel(fModule);
-
- res->Thresholds(tmp1,tmp2);
- Int_t minval = static_cast<Int_t>(tmp1);
- Bool_t write = res->OutputOption();
- Bool_t do10to8 = res->Do10to8();
- Int_t nz, nl, nh, low, i, j;
- SetCompressParam();
- for (i=0; i<fNofMaps; i++) {
- CompressionParam(i,db,tl,th);
- nz = 0;
- nl = 0;
- nh = 0;
- low = 0;
- for (j=0; j<fMaxNofSamples; j++) {
- Int_t signal=(Int_t)(fHitMap2->GetSignal(i,j));
- signal -= db; // if baseline eq. is done here
- if (signal <= 0) {nz++; continue;}
- if ((signal - tl) < minval) low++;
- if ((signal - th) >= minval) {
- nh++;
- Bool_t cond=kTRUE;
- FindCluster(i,j,signal,minval,cond);
- if(cond && j &&
- ((TMath::Abs(fHitMap2->GetSignal(i,j-1))-th)>=minval)){
- if(do10to8) signal = Convert10to8(signal);
- AddDigit(i,j,signal);
- } // end if cond&&j&&()
- } else if ((signal - tl) >= minval) nl++;
- } // end for j loop time samples
- if (write) TreeB()->Fill(nz,nl,nh,low,i+1);
- } //end for i loop anodes
-
- char hname[30];
- if (write) {
- sprintf(hname,"TNtuple%d_%d",fModule,fEvent);
- TreeB()->Write(hname);
- // reset tree
- TreeB()->Reset();
- } // end if write
-}
-//______________________________________________________________________
-void AliITSsimulationSDD::FindCluster(Int_t i,Int_t j,Int_t signal,
- Int_t minval,Bool_t &cond){
- // Find clusters according to the online 2D zero-suppression algorithm
- AliITSCalibrationSDD* res = (AliITSCalibrationSDD*)GetCalibrationModel(fModule);
- AliITSsegmentationSDD* seg = (AliITSsegmentationSDD*)GetSegmentationModel(1);
-
- Bool_t do10to8 = res->Do10to8();
- Bool_t high = kFALSE;
-
- fHitMap2->FlagHit(i,j);
- //
- // check the online zero-suppression conditions
- //
- const Int_t kMaxNeighbours = 4;
- Int_t nn;
- Int_t dbx,tlx,thx;
- Int_t xList[kMaxNeighbours], yList[kMaxNeighbours];
- seg->Neighbours(i,j,&nn,xList,yList);
- Int_t in,ix,iy,qns;
- for (in=0; in<nn; in++) {
- ix=xList[in];
- iy=yList[in];
- if (fHitMap2->TestHit(ix,iy)==kUnused) {
- CompressionParam(ix,dbx,tlx,thx);
- Int_t qn = (Int_t)(fHitMap2->GetSignal(ix,iy));
- qn -= dbx; // if baseline eq. is done here
- if ((qn-tlx) < minval) {
- fHitMap2->FlagHit(ix,iy);
- continue;
- } else {
- if ((qn - thx) >= minval) high=kTRUE;
- if (cond) {
- if(do10to8) signal = Convert10to8(signal);
- AddDigit(i,j,signal);
- } // end if cond
- if(do10to8) qns = Convert10to8(qn);
- else qns=qn;
- if (!high) AddDigit(ix,iy,qns);
- cond=kFALSE;
- if(!high) fHitMap2->FlagHit(ix,iy);
- } // end if qn-tlx < minval
- } // end if TestHit
- } // end for in loop over neighbours
+ // 2D zero-suppression algorithm as described in ALICE-INT-1999-28 V10
+ AliITSCalibrationSDD* res = (AliITSCalibrationSDD*)GetCalibrationModel(fModule);
+ for (Int_t iWing=0; iWing<2; iWing++) {
+ Int_t tL=res->GetZSLowThreshold(iWing);
+ Int_t tH=res->GetZSHighThreshold(iWing);
+ for (Int_t i=0; i<fNofMaps/2; i++) {
+ Int_t ian=i+iWing*fNofMaps/2;
+ if( !fAnodeFire[ian] ) continue;
+ for (Int_t itb=0; itb<fMaxNofSamples; itb++) {
+ Int_t nLow=0, nHigh=0;
+ Float_t cC=fHitMap2->GetSignal(ian,itb);
+ if(cC<=tL) continue;
+ nLow++; // cC is greater than tL
+ if(cC>tH) nHigh++;
+ // N
+ // Get "quintuple": WCE
+ // S
+ Float_t wW=0.;
+ if(itb>0) wW=fHitMap2->GetSignal(ian,itb-1);
+ if(wW>tL) nLow++;
+ if(wW>tH) nHigh++;
+ Float_t eE=0.;
+ if(itb<fMaxNofSamples-1) eE=fHitMap2->GetSignal(ian,itb+1);
+ if(eE>tL) nLow++;
+ if(eE>tH) nHigh++;
+ Float_t nN=0.;
+ if(i<(fNofMaps/2-1)) nN=fHitMap2->GetSignal(ian+1,itb);
+ if(nN>tL) nLow++;
+ if(nN>tH) nHigh++;
+ Float_t sS=0.;
+ if(i>0) sS=fHitMap2->GetSignal(ian-1,itb);
+ if(sS>tL) nLow++;
+ if(sS>tH) nHigh++;
+
+ if(nLow>=3 && nHigh>=1){
+ Int_t signal=(Int_t)cC;
+ Int_t signalc = Convert10to8(signal);
+ Int_t signale = Convert8to10(signalc);
+ signalc-=tL; // subtract low threshold after 10 to 8 bit compression
+ AddDigit(ian,itb,signalc,signale); // store C
+ }
+ }
+ }
+ }