]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSClusterFinderV2SPD.cxx
Fixing a little overlap. Adding flags to perform material budget studies (Mario)
[u/mrichter/AliRoot.git] / ITS / AliITSClusterFinderV2SPD.cxx
index db5d7e4bd2fa2c61ee0bca0aae2b73326b238d6c..135e11574fcfbccea40911d2bfea591c887a2558 100644 (file)
@@ -21,6 +21,7 @@
 ////////////////////////////////////////////////////////////////////////////
 
 
+#include <TGeoGlobalMagField.h>
 #include "AliITSCalibrationSPD.h"
 #include "AliITSClusterFinderV2SPD.h"
 #include "AliITSRecPoint.h"
@@ -32,6 +33,9 @@
 #include <TClonesArray.h>
 #include "AliITSdigitSPD.h"
 #include "AliITSFOSignalsSPD.h"
+#include "AliITSRecPointContainer.h"
+#include "AliMagF.h"
+#include "AliITSsegmentationSPD.h"
 
 ClassImp(AliITSClusterFinderV2SPD)
 
@@ -73,19 +77,22 @@ void AliITSClusterFinderV2SPD::FindRawClusters(Int_t mod){
 
 }
 //__________________________________________________________________________
-void AliITSClusterFinderV2SPD::RawdataToClusters(AliRawReader* rawReader, TClonesArray** clusters){
+void AliITSClusterFinderV2SPD::RawdataToClusters(AliRawReader* rawReader){
   //------------------------------------------------------------
   // This function creates ITS clusters from raw data
   //------------------------------------------------------------
   rawReader->Reset();
+  fNClusters = 0; //RS
   AliITSRawStreamSPD inputSPD(rawReader);
-  FindClustersSPD(&inputSPD, clusters);
+  FindClustersSPD(&inputSPD);
 
 }
 //__________________________________________________________________________
 Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,TClonesArray* clusters,Int_t maxBins,Int_t nzbins,Int_t iModule,Bool_t rawdata){
   
   //Cluster finder for SPD (from digits and from rawdata)
+  const Double_t kmictocm = 1.0e-4; // convert microns to cm.
+  const Double_t defaultField = 5.0; // default Bz value at which Tan(theta_Lorentz) is given in RecoParam
 
   static AliITSRecoParam *repa = NULL;
   if(!repa){
@@ -97,6 +104,23 @@ Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,T
   }
   const TGeoHMatrix *mT2L=AliITSgeomTGeo::GetTracking2LocalMatrix(iModule);
 
+  // Lorentz angle correction
+  Double_t tanLorentzAngle=0; 
+  AliITSsegmentationSPD *seg = (AliITSsegmentationSPD*)(GetDetTypeRec()->GetSegmentationModel(0));
+  Double_t thick = 0.5*kmictocm*seg->Dy();  // Half Thickness in cm
+  if(repa->GetCorrectLorentzAngleSPD()) { // only if CorrectLorentzAngleSPD required
+    // here retrieve the value of the field
+    AliMagF* field = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
+    if (field == 0) {
+      AliError("Cannot get magnetic field from TGeoGlobalMagField");
+    }
+    else {
+      Float_t magField = field->SolenoidField();
+      tanLorentzAngle=repa->GetTanLorentzAngleHolesSPD() * magField / defaultField ;
+    }
+  }
+  //
+
    if (repa->GetSPDRemoveNoisyFlag()) {
     // Loop on noisy pixels and reset them
     AliITSCalibrationSPD *cal =  
@@ -124,12 +148,21 @@ Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,T
       bins[index].SetQ(0);
       bins[index].SetMask(0xFFFFFFFE);
     }
+    AliITSCalibrationSPD *calSparse = (AliITSCalibrationSPD*) fDetTypeRec->GetSPDSparseDeadModel(iModule);
+    for(Int_t ipix = 0; ipix<calSparse->GetNrBad(); ipix++){
+      Int_t row, col;
+      calSparse->GetBadPixel(ipix,row,col);
+      Int_t index = (row+1) * nzbins + (col+1);
+      bins[index].SetQ(0);
+      bins[index].SetMask(0xFFFFFFFE);
+    }
+
   }
   
   Int_t nclu=0;
   for(Int_t iBin =0; iBin < maxBins;iBin++){
     if(bins[iBin].IsUsed()) continue;
-    Int_t nBins = 0;
+    Int_t nBins = 0; 
     Int_t idxBins[200];
     FindCluster(iBin,nzbins,bins,nBins,idxBins);
     if (nBins == 200){
@@ -200,7 +233,7 @@ Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,T
       idy=ymax-ymin+1;
       idz=zmax-zmin+1;
     }
+    //
     for(Int_t iiz=zmin; iiz<=zmax;iiz+=idz){
       for(Int_t iiy=ymin;iiy<=ymax;iiy+=idy){
 
@@ -224,7 +257,14 @@ Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,T
          }
          ndigits++;
          Float_t qBin=0.;
-         if(rawdata) qBin = bins[idxBins[idx]].GetQ();
+         if(rawdata) {
+           qBin = bins[idxBins[idx]].GetQ();
+           if (fRawID2ClusID) { // RS: Register cluster id in raw words list
+             int rwid = bins[idxBins[idx]].GetRawID();
+             if (fRawID2ClusID->GetSize()<=rwid) fRawID2ClusID->Set( (rwid+10)<<1 );         
+             (*fRawID2ClusID)[rwid] = milab[0] = fNClusters+1; // RS: store clID+1 as a reference to the cluster
+           }
+         }
          if(!rawdata){
            AliITSdigitSPD* dig = (AliITSdigitSPD*)digits->UncheckedAt(idxBins[idx]);
            qBin = (Float_t)dig->GetSignal();
@@ -234,12 +274,17 @@ Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,T
          q+= qBin;     
        }// for idx
        if(ndigits==0) continue;
+         
        y /= q;
        z /= q;
        y -= fHwSPD;
        z -= fHlSPD;
 
-       Float_t hit[5]; //y,z,sigma(y)^2, sigma(z)^2, charge
+        // Lorentz drift effect in local y
+        y -= tanLorentzAngle*thick;
+        //
+
+       Float_t hit[6]; //y,z,sigma(y)^2, sigma(z)^2, charge
         {
         Double_t loc[3]={y,0.,z},trk[3]={0.,0.,0.};
         mT2L->MasterToLocal(loc,trk);
@@ -249,19 +294,24 @@ Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,T
        hit[2] = fYpitchSPD*fYpitchSPD/12.;
        hit[3] = fZ1pitchSPD*fZ1pitchSPD/12.;
        hit[4] = 1.;
+       hit[5] = 0.;
 
        if(!rawdata) milab[3]=fNdet[iModule];
        Int_t info[3] = {ymax-ymin+1,zmax-zmin+1,fNlayer[iModule]};
        if(!rawdata){
         AliITSRecPoint cl(milab,hit,info);
+         cl.SetType(nBins);
         fDetTypeRec->AddRecPoint(cl);
        }
         else{
          Int_t label[4]={milab[0],milab[1],milab[2],milab[3]};
+          AliITSRecPoint cl(label, hit,info);
+          cl.SetType(nBins);
          new (clusters->AddrAt(nclu)) 
-               AliITSRecPoint(label, hit,info);
+         AliITSRecPoint(cl);
        } 
        nclu++;
+       fNClusters++;
       }// for iiy
     }// for iiz
   }//end for iBin
@@ -269,14 +319,14 @@ Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,T
   
 }
 //__________________________________________________________________________
-void AliITSClusterFinderV2SPD::FindClustersSPD(AliITSRawStreamSPD* input, 
-                                       TClonesArray** clusters) 
+void AliITSClusterFinderV2SPD::FindClustersSPD(AliITSRawStreamSPD* input) 
 {
   //------------------------------------------------------------
   // SPD cluster finder for raw data (this method is called once per event)
   // Now also fills fast-or fired map
   //------------------------------------------------------------
-  
+
+  AliITSRecPointContainer* rpc = AliITSRecPointContainer::Instance();  
   Int_t nClustersSPD = 0;
   Int_t kNzBins = fNzSPD + 2;
   Int_t kNyBins = fNySPD + 2;
@@ -286,6 +336,9 @@ void AliITSClusterFinderV2SPD::FindClustersSPD(AliITSRawStreamSPD* input,
   AliBin* bins = NULL;
 
   // 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 (kTRUE) {
     Bool_t next = input->Next();
     if (!next || input->IsNewModule()) {
@@ -293,8 +346,8 @@ void AliITSClusterFinderV2SPD::FindClustersSPD(AliITSRawStreamSPD* input,
 
       // when all data from a module was read, search for clusters
       if (bins) { 
-       clusters[iModule] = new TClonesArray("AliITSRecPoint");
-       Int_t nClusters = ClustersSPD(bins,0,clusters[iModule],kMaxBin,kNzBins,iModule,kTRUE);
+       TClonesArray* clusters = rpc->UncheckedGetClusters(iModule);
+       Int_t nClusters = ClustersSPD(bins,0,clusters,kMaxBin,kNzBins,iModule,kTRUE);
        nClustersSPD += nClusters;
        bins = NULL;
       }
@@ -304,20 +357,22 @@ void AliITSClusterFinderV2SPD::FindClustersSPD(AliITSRawStreamSPD* input,
       memcpy(binsSPD,binsSPDInit,sizeof(AliBin)*kMaxBin);
     }
 
-    if (next && bins) {
+    if (next && bins) {      
       // fill the current digit into the bins array
       Int_t index = (input->GetCoord2()+1) * kNzBins + (input->GetCoord1()+1);
       bins[index].SetIndex(index);
       bins[index].SetQ(1);
       bins[index].SetMask(1);
+      bins[index].SetRawID(countRW); //RS register raw id
     }
+    countRW++; //RS
   }
 
   delete [] binsSPDInit;
   delete [] binsSPD;
   
-  // AliDebug(1,Form("found clusters in ITS SPD: %d", nClustersSPD));
-  Info("FindClustersSPD", "found clusters in ITS SPD: %d", nClustersSPD);
+  AliDebug(1,Form("found clusters in ITS SPD: %d", nClustersSPD));
+  
  
     // Fill the FastOr fired map
   for (UInt_t eq=0; eq<20; eq++) {