AddTaskFemto for train update
[u/mrichter/AliRoot.git] / ITS / AliITSClusterFinderV2SDD.cxx
index b588b01..02b91c5 100644 (file)
@@ -28,6 +28,7 @@
 #include <TBits.h>
 #include "AliITSClusterFinderV2SDD.h"
 #include "AliITSRecPoint.h"
+#include "AliITSRecPointContainer.h"
 #include "AliITSDetTypeRec.h"
 #include "AliRawReader.h"
 #include "AliITSRawStreamSDD.h"
@@ -46,7 +47,10 @@ AliITSClusterFinderV2SDD::AliITSClusterFinderV2SDD(AliITSDetTypeRec* dettyp):Ali
   fNAnodes(0),
   fNTimeBins(0),
   fNZbins(0),
-  fNXbins(0)
+  fNXbins(0),
+  fCutOnPeakLoose(0.),
+  fCutOnPeakTight(0.),
+  fMaxDrTimeForTightCut(0.)
 {
   //Default constructor
 
@@ -59,6 +63,7 @@ AliITSClusterFinderV2SDD::AliITSClusterFinderV2SDD(AliITSDetTypeRec* dettyp):Ali
   for(Int_t iHyb=0;iHyb<kHybridsPerDDL;iHyb++){
    fDDLBins[iHyb]=new AliBin[kMaxBin];
   }
+  SetPeakSelection(15.,30.,2000.);
 }
  
 
@@ -185,32 +190,40 @@ FindClustersSDD(AliBin* bins[2], TBits* anodeFired[2],
        if (npeaks==0) continue;
 
        Int_t k,l;
-       for (k=0; k<npeaks-1; k++){//mark adjacent peaks
-         if (idx[k] < 0) continue; //this peak is already removed
-         for (l=k+1; l<npeaks; l++) {
-           if (idx[l] < 0) continue; //this peak is already removed
-           Int_t ki=idx[k]/fNZbins, kj=idx[k] - ki*fNZbins;
-           Int_t li=idx[l]/fNZbins, lj=idx[l] - li*fNZbins;
-           Int_t di=TMath::Abs(ki - li);
-           Int_t dj=TMath::Abs(kj - lj);
-           if (di>1 || dj>1) continue;
-           if (bins[s][idx[k]].GetQ() > bins[s][idx[l]].GetQ()) {
-             msk[l]=msk[k];
-             idx[l]*=-1;
-           } else {
-             msk[k]=msk[l];
-             idx[k]*=-1;
-             break;
-           } 
+       Int_t nClust;
+       if(repa->GetUseUnfoldingInClusterFinderSDD()){
+         for (k=0; k<npeaks-1; k++){//mark adjacent peaks          
+           if (idx[k] < 0) continue; //this peak is already removed
+           for (l=k+1; l<npeaks; l++) {
+             if (idx[l] < 0) continue; //this peak is already removed
+             Int_t ki=idx[k]/fNZbins, kj=idx[k] - ki*fNZbins;
+             Int_t li=idx[l]/fNZbins, lj=idx[l] - li*fNZbins;
+             Int_t di=TMath::Abs(ki - li);
+             Int_t dj=TMath::Abs(kj - lj);
+             if (di>1 || dj>1) continue;
+             if (bins[s][idx[k]].GetQ() > bins[s][idx[l]].GetQ()) {
+               msk[l]=msk[k];
+               idx[l]*=-1;
+             } else {
+               msk[k]=msk[l];
+               idx[k]*=-1;
+               break;
+             } 
+           }
          }
+         nClust=npeaks;
+       }else{
+         for (k=1; k<npeaks; k++) msk[k]=msk[0];
+         nClust=1;
        }
-
+       Float_t maxADC=0;
        for (k=0; k<npeaks; k++) {
-         if(repa->GetUseUnfoldingInClusterFinderSDD()==kFALSE) msk[k]=msk[0];
+         if(idx[k]>0. && bins[s][idx[k]].GetQ() > maxADC) maxADC=bins[s][idx[k]].GetQ();
          MarkPeak(TMath::Abs(idx[k]), fNZbins, bins[s], msk[k]);
        }
-        
-       for (k=0; k<npeaks; k++) {
+       if(maxADC<fCutOnPeakLoose) continue;
+
+       for (k=0; k<nClust; k++) {
          if (idx[k] < 0) continue; //removed peak
          AliITSRecPoint c;
          MakeCluster(idx[k], fNZbins, bins[s], msk[k], c);
@@ -219,42 +232,37 @@ FindClustersSDD(AliBin* bins[2], TBits* anodeFired[2],
          for (Int_t ilab=0;ilab<10;ilab++){
            milab[ilab]=-2;
          }
-         Int_t maxi=0,mini=0,maxj=0,minj=0;
          
-         for (Int_t di=-5; di<=5;di++){
-           for (Int_t dj=-10;dj<=10;dj++){
-             Int_t index = idx[k]+di+dj*fNZbins;
-             if (index<0) continue;
-             if (index>=kMaxBin) continue;
-             AliBin *b=&bins[s][index];
-             Int_t iAnode=index%fNZbins-1;
-             Int_t adcSignal=b->GetQ();
-             if(adcSignal>cal->GetThresholdAnode(iAnode)){
-               if (di>maxi) maxi=di;
-               if (di<mini) mini=di;
-               if (dj>maxj) maxj=dj;
-               if (dj<minj) minj=dj;
-             }
-             //
-             if(digits) {
-               if (TMath::Abs(di)<2&&TMath::Abs(dj)<2){
-                 AliITSdigitSDD* d=(AliITSdigitSDD*)digits->UncheckedAt(b->GetIndex());
-                 for (Int_t itrack=0;itrack<10;itrack++){
-                   Int_t track = (d->GetTracks())[itrack];
-                   if (track>=0) {
-                     AddLabel(milab, track); 
-                   }
+         if(digits) {
+           for (Int_t di=-2; di<=2;di++){
+             for (Int_t dj=-2;dj<=2;dj++){
+               index = idx[k]+di+dj*fNZbins;
+               if (index<0) continue;
+               if (index>=kMaxBin) continue;
+               AliBin *b=&bins[s][index];
+               if(b->GetQ()<0.1) continue;
+               AliITSdigitSDD* d=(AliITSdigitSDD*)digits->UncheckedAt(b->GetIndex());
+               for (Int_t itrack=0;itrack<10;itrack++){
+                 Int_t track = (d->GetTracks())[itrack];
+                 if (track>=0) {
+                   AddLabel(milab, track); 
                  }
                }
              }
            }
+         } 
+         else { // raw data
+           if (fRawID2ClusID) milab[0] = fNClusters+1; // RS: store clID+1 as a reference to the cluster
          }
-         Int_t clSizAnode=maxi-mini+1;
-         Int_t clSizTb=maxj-minj+1;
+         
+
+         Int_t clSizAnode=fZmax-fZmin+1;
+         Int_t clSizTb=fXmax-fXmin+1;    
          if(repa->GetUseSDDClusterSizeSelection()){
            if(clSizTb==1) continue; // cut common mode noise spikes
-           if(clSizAnode>3)  continue; // cut common mode noise spikes
+           if(clSizAnode>5)  continue; // cut common mode noise spikes
            if(clSizTb>10)  continue; // cut clusters on noisy anodes
+           if(cal-> IsAMAt20MHz() && clSizTb>8)  continue; // cut clusters on noisy anodes
          }
          
          AliITSresponseSDD* rsdd = fDetTypeRec->GetResponseSDD();
@@ -266,7 +274,9 @@ FindClustersSDD(AliBin* bins[2], TBits* anodeFired[2],
          Float_t zdet = GetSeg()->GetLocalZFromAnode(zAnode);
          Float_t driftTimeUncorr = GetSeg()->GetDriftTimeFromTb(timebin)+jitter*rsdd->GetCarlosRXClockPeriod();
          Float_t driftTime=driftTimeUncorr-rsdd->GetTimeZero(fModule);
-         Float_t driftSpeed = cal->GetDriftSpeedAtAnode(zAnode) + rsdd->GetDeltaVDrift(fModule);
+         if(driftTime<fMaxDrTimeForTightCut && maxADC<fCutOnPeakTight) continue;
+
+         Float_t driftSpeed = cal->GetDriftSpeedAtAnode(zAnode) + rsdd->GetDeltaVDrift(fModule,zAnode>255);
          Float_t driftPathMicron = driftTime*driftSpeed;
          const Double_t kMicronTocm = 1.0e-4; 
          Float_t xdet=(driftPathMicron-GetSeg()->Dx())*kMicronTocm; // xdet is negative
@@ -284,35 +294,39 @@ FindClustersSDD(AliBin* bins[2], TBits* anodeFired[2],
          y=trk[1];
          z=trk[2]; 
          
-         q/=rsdd->GetADC2keV();
-         q+=(driftTime*rsdd->GetChargevsTime()); // correction for zero supp.
+         q+=(driftTime*rsdd->GetADCvsDriftTime(fModule)); // correction for zero supp.
+         q/=rsdd->GetADCtokeV(fModule);
          if(cal-> IsAMAt20MHz()) q*=2.; // account for 1/2 sampling freq.
          if(q<repa->GetMinClusterChargeSDD()) continue; // remove noise clusters
          
-         Float_t hit[5] = {y, z, 0.0030*0.0030, 0.0020*0.0020, q};
+         Float_t hit[6] = {y, z, 0.0030*0.0030, 0.0020*0.0020, q, 0.};
          Int_t  info[3] = {clSizTb, clSizAnode, fNlayer[fModule]};
          if (digits) CheckLabels2(milab);
          milab[3]=fNdet[fModule];
          AliITSRecPoint cc(milab,hit,info);
-         cc.SetType(npeaks);
+         cc.SetType(nClust*100+npeaks);
          cc.SetDriftTime(driftTimeUncorr);
+         cc.SetDriftSide(s);
+         cc.SetChargeRatio(maxADC);
          if(clusters) new (cl[ncl]) AliITSRecPoint(cc); 
          else {
            fDetTypeRec->AddRecPoint(cc);
          }
+         fNClusters++; // RS
          ncl++;
        }
       }
     }
   }
-  
-}
+  AliDebug(2,Form("Clusters found on SDD module %d (unfolding %d) = %d\n",fModule,repa->GetUseUnfoldingInClusterFinderSDD(),ncl));
+
+} 
 //______________________________________________________________________
-void AliITSClusterFinderV2SDD::RawdataToClusters(AliRawReader* rawReader,TClonesArray** clusters){
+void AliITSClusterFinderV2SDD::RawdataToClusters(AliRawReader* rawReader){
     //------------------------------------------------------------
   // This function creates ITS clusters from raw data
   //------------------------------------------------------------
-
+  fNClusters = 0; //RS
   AliITSRawStream* inputSDD=AliITSRawStreamSDD::CreateRawStreamSDD(rawReader);
   AliDebug(1,Form("%s is used",inputSDD->ClassName()));
 
@@ -335,16 +349,16 @@ void AliITSClusterFinderV2SDD::RawdataToClusters(AliRawReader* rawReader,TClones
       }
     }
   }
-  FindClustersSDD(inputSDD,clusters);
+  FindClustersSDD(inputSDD);
   delete inputSDD;
 }
 
-void AliITSClusterFinderV2SDD::FindClustersSDD(AliITSRawStream* input, 
-                                       TClonesArray** clusters) 
+void AliITSClusterFinderV2SDD::FindClustersSDD(AliITSRawStream* input) 
 {
   //------------------------------------------------------------
   // Actual SDD cluster finder for raw data
   //------------------------------------------------------------
+  AliITSRecPointContainer* rpc = AliITSRecPointContainer::Instance();
   Int_t nClustersSDD = 0;
   AliBin *bins[2];
   TBits* anodeFired[2];
@@ -357,6 +371,9 @@ void AliITSClusterFinderV2SDD::FindClustersSDD(AliITSRawStream* input,
   for(Int_t iMod=0; iMod<kModulesPerDDL; iMod++) vectModId[iMod]=-1;
 
   // read raw data input stream
+  int countRW = 0; //RS
+  if (fRawID2ClusID) fRawID2ClusID->Reset(); //RS if array was provided, we shall store the rawID -> ClusterID
+  //
   while (input->Next()) {
     Int_t iModule = input->GetModuleID();
     if(iModule<0){
@@ -377,13 +394,13 @@ void AliITSClusterFinderV2SDD::FindClustersSDD(AliITSRawStream* input,
       for(Int_t iMod=0; iMod<kModulesPerDDL; iMod++){
        if(vectModId[iMod]>=0){
          fModule = vectModId[iMod];
-         clusters[fModule] = new TClonesArray("AliITSRecPoint");
+         TClonesArray* clusters = rpc->UncheckedGetClusters(fModule);
          bins[0]=fDDLBins[iMod*2];   // first hybrid of the module
          bins[1]=fDDLBins[iMod*2+1]; // second hybrid of the module
          anodeFired[0]=ddlAnodeFired[iMod*2];
          anodeFired[1]=ddlAnodeFired[iMod*2+1];
-         FindClustersSDD(bins, anodeFired, NULL, clusters[fModule],jitter);
-         Int_t nClusters = clusters[fModule]->GetEntriesFast();
+         FindClustersSDD(bins, anodeFired, NULL, clusters,jitter);
+         Int_t nClusters = clusters->GetEntriesFast();
          nClustersSDD += nClusters;
          vectModId[iMod]=-1;
        }
@@ -428,6 +445,7 @@ void AliITSClusterFinderV2SDD::FindClustersSDD(AliITSRawStream* input,
            fDDLBins[iHybrid][index].SetQ(q);
            fDDLBins[iHybrid][index].SetMask(1);
            fDDLBins[iHybrid][index].SetIndex(index);
+           fDDLBins[iHybrid][index].SetRawID(countRW); //RS register raw id
            ddlAnodeFired[iHybrid]->SetBitNumber(iz);
          }else{
            AliWarning(Form("Invalid SDD cell: Anode=%d   TimeBin=%d",iz,itb));   
@@ -435,11 +453,12 @@ void AliITSClusterFinderV2SDD::FindClustersSDD(AliITSRawStream* input,
        }
       }
     }
+    countRW++; //RS
   }
   for(Int_t iHyb=0;iHyb<kHybridsPerDDL;iHyb++){ 
    delete ddlAnodeFired[iHyb];
   }
-  Info("FindClustersSDD", "found clusters in ITS SDD: %d", nClustersSDD); 
+  AliDebug(1,Form("found clusters in ITS SDD: %d", nClustersSDD));
 }
 
 //______________________________________________________________________
@@ -486,7 +505,7 @@ Bool_t AliITSClusterFinderV2SDD::NoiseSuppress(Int_t k, Int_t sid, AliBin* bins,
   Int_t wW=bins[k+fNZbins].GetQ();
   if(wW>tL) nLow++;
   if(wW>tH) nHigh++;
-  if(nLow<3 || nHigh<1) return kTRUE;
+  if(nLow<2 || nHigh<1) return kTRUE;
   else return kFALSE;
 }