]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PMD/AliPMDClusterFinder.cxx
isolated cell serach included in AliPMDClusteringV1 and kept in recpoints for offline...
[u/mrichter/AliRoot.git] / PMD / AliPMDClusterFinder.cxx
index 75b1a38c6a09ce85f1ed438c6cd2c0a7f75cf10b..5a92759229e9343b8e47e25db4c22cdff7253449 100644 (file)
 #include "AliPMDcluster.h"
 #include "AliPMDrecpoint1.h"
 #include "AliPMDrechit.h"
+#include "AliPMDisocell.h"
 #include "AliPMDRawStream.h"
 #include "AliPMDCalibData.h"
+#include "AliPMDPedestal.h"
 #include "AliPMDddldata.h"
 
 #include "AliDAQ.h"
@@ -54,7 +56,8 @@ ClassImp(AliPMDClusterFinder)
 AliPMDClusterFinder::AliPMDClusterFinder():
   fRunLoader(0),
   fPMDLoader(0),
-  fCalibData(GetCalibData()),
+  fCalibGain(GetCalibGain()),
+  fCalibPed(GetCalibPed()),
   fTreeD(0),
   fTreeR(0),
   fDigits(new TClonesArray("AliPMDdigit", 1000)),
@@ -73,7 +76,8 @@ AliPMDClusterFinder::AliPMDClusterFinder():
 AliPMDClusterFinder::AliPMDClusterFinder(AliRunLoader* runLoader):
   fRunLoader(runLoader),
   fPMDLoader(runLoader->GetLoader("PMDLoader")),
-  fCalibData(GetCalibData()),
+  fCalibGain(GetCalibGain()),
+  fCalibPed(GetCalibPed()),
   fTreeD(0),
   fTreeR(0),
   fDigits(new TClonesArray("AliPMDdigit", 1000)),
@@ -93,7 +97,8 @@ AliPMDClusterFinder::AliPMDClusterFinder(const AliPMDClusterFinder & finder):
   TObject(finder),
   fRunLoader(0),
   fPMDLoader(0),
-  fCalibData(GetCalibData()),
+  fCalibGain(GetCalibGain()),
+  fCalibPed(GetCalibPed()),
   fTreeD(0),
   fTreeR(0),
   fDigits(NULL),
@@ -120,22 +125,17 @@ AliPMDClusterFinder::~AliPMDClusterFinder()
   // Destructor
   if (fDigits)
     {
-      fDigits->Delete();
-      delete fDigits;
-      fDigits=0;
+       fDigits->Clear();
     }
   if (fRecpoints)
     {
-      fRecpoints->Delete();
-      delete fRecpoints;
-      fRecpoints=0;
+      fRecpoints->Clear();
     }
   if (fRechits)
     {
-      fRechits->Delete();
-      delete fRechits;
-      fRechits=0;
+      fRechits->Clear();
     }
+
 }
 // ------------------------------------------------------------------------- //
 
@@ -152,7 +152,11 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt)
   Int_t    idet;
   Float_t  clusdata[6];
 
+  AliPMDisocell *pmdiso = 0x0;
+
   TObjArray *pmdcont = new TObjArray();
+  TObjArray *pmdisocell = new TObjArray();
+
   AliPMDClustering *pmdclust = new AliPMDClusteringV1();
 
   pmdclust->SetEdepCut(fEcut);
@@ -199,21 +203,30 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt)
          xpos   = pmddigit->GetRow();
          ypos   = pmddigit->GetColumn();
          adc    = pmddigit->GetADC();
-         
+         if(xpos < 0 || xpos > 48 || ypos < 0 || ypos > 96)
+           {
+             AliError(Form("*Row %d and Column NUMBER %d NOT Valid *",
+                             xpos, ypos));
+             continue; 
+           }
          // CALIBRATION
-         Float_t gain = fCalibData->GetGainFact(det,smn,xpos,ypos);
+         Float_t gain = fCalibGain->GetGainFact(det,smn,xpos,ypos);
          // printf("adc = %d gain = %f\n",adc,gain);
          
          adc = adc*gain;
 
          //Int_t trno   = pmddigit->GetTrackNumber();
-         fCellADC[xpos][ypos] = (Double_t) adc;
+         fCellTrack[xpos][ypos] = pmddigit->GetTrackNumber();
+         fCellPid[xpos][ypos]   = pmddigit->GetTrackPid();
+         fCellADC[xpos][ypos]   = (Double_t) adc;
        }
 
       idet = det;
       ismn = smn;
-      pmdclust->DoClust(idet,ismn,fCellADC,pmdcont);
-      
+      //pmdclust->DoClust(idet,ismn,fCellADC,pmdisocell,pmdcont);
+      pmdclust->DoClust(idet,ismn,fCellTrack,fCellPid,fCellADC,
+                       pmdisocell,pmdcont);
+
       Int_t nentries1 = pmdcont->GetEntries();
 
       AliDebug(1,Form("Total number of clusters/module = %d",nentries1));
@@ -237,12 +250,35 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt)
            {
              Int_t celldataX = pmdcl->GetClusCellX(ihit);
              Int_t celldataY = pmdcl->GetClusCellY(ihit);
-             AddRecHit(celldataX, celldataY);
+             Int_t celldataTr = pmdcl->GetClusCellTrack(ihit);
+             Int_t celldataPid   = pmdcl->GetClusCellPid(ihit);
+             AddRecHit(celldataX, celldataY, celldataTr, celldataPid);
+             //AddRecHit(celldataX, celldataY);
            }
          branch2->Fill();
          ResetRechit();
        }
-      pmdcont->Clear();
+      pmdcont->Delete();
+
+         // Added single isolated cell for offline gain calibration
+         nentries1 = pmdisocell->GetEntries();
+         AliDebug(1,Form("Total number of isolated single cell clusters = %d",nentries1));
+         
+         for (Int_t ient1 = 0; ient1 < nentries1; ient1++)
+           {
+             pmdiso = (AliPMDisocell*)pmdisocell->UncheckedAt(ient1);
+             idet = pmdiso->GetDetector();
+             ismn = pmdiso->GetSmn();
+             clusdata[0] = (Float_t) pmdiso->GetRow();
+             clusdata[1] = (Float_t) pmdiso->GetCol();
+             clusdata[2] = pmdiso->GetADC();
+             clusdata[3] = 1.;
+             clusdata[4] = -99.;
+             clusdata[5] = -99.;
+      
+             AddRecPoint(idet,ismn,clusdata);
+           }
+         pmdisocell->Delete();
       
       branch1->Fill();
       ResetRecpoint();
@@ -256,23 +292,189 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt)
   //   delete the pointers
   delete pmdclust;
   delete pmdcont;
+  delete pmdisocell;
     
 }
 // ------------------------------------------------------------------------- //
 
+void AliPMDClusterFinder::Digits2RecPoints(TTree *digitsTree,
+                                          TTree *clustersTree)
+{
+  // Converts digits to recpoints after running clustering
+  // algorithm on CPV plane and PREshower plane
+  //
+  // This algorithm is called during the reconstruction from digits
+
+  Int_t    det = 0,smn = 0;
+  Int_t    xpos,ypos;
+  Float_t  adc;
+  Int_t    ismn;
+  Int_t    idet;
+  Float_t  clusdata[6];
+
+  AliPMDcluster *pmdcl = 0x0;
+  AliPMDisocell *pmdiso = 0x0;
+
+  TObjArray *pmdcont = new TObjArray();
+  TObjArray *pmdisocell = new TObjArray();
+  AliPMDClustering *pmdclust = new AliPMDClusteringV1();
+
+  pmdclust->SetEdepCut(fEcut);
+
+  AliPMDdigit  *pmddigit;
+  TBranch *branch = digitsTree->GetBranch("PMDDigit");
+  branch->SetAddress(&fDigits);
+
+  ResetRecpoint();
+
+  Int_t bufsize = 16000;
+  TBranch * branch1 = clustersTree->Branch("PMDRecpoint", &fRecpoints, bufsize); 
+  TBranch * branch2 = clustersTree->Branch("PMDRechit", &fRechits, bufsize); 
+
+  Int_t nmodules = (Int_t) digitsTree->GetEntries();
+
+  for (Int_t imodule = 0; imodule < nmodules; imodule++)
+    {
+
+      Int_t totADCMod = 0;
+      ResetCellADC();
+      digitsTree->GetEntry(imodule); 
+      Int_t nentries = fDigits->GetLast();
+      for (Int_t ient = 0; ient < nentries+1; ient++)
+       {
+         pmddigit = (AliPMDdigit*)fDigits->UncheckedAt(ient);
+         
+         det    = pmddigit->GetDetector();
+         smn    = pmddigit->GetSMNumber();
+         xpos   = pmddigit->GetRow();
+         ypos   = pmddigit->GetColumn();
+         adc    = pmddigit->GetADC();
+         if(xpos < 0 || xpos > 48 || ypos < 0 || ypos > 96)
+           {
+             AliError(Form("*Row %d and Column NUMBER %d NOT Valid *",
+                           xpos, ypos));
+             continue; 
+           }
+         
+         // Pedestal Subtraction
+         Int_t   pedmeanrms = fCalibPed->GetPedMeanRms(det,smn,xpos,ypos);
+         Int_t   pedrms1    = (Int_t) pedmeanrms%100;
+         Float_t pedrms     = (Float_t)pedrms1/10.;
+         Float_t pedmean    = (Float_t) (pedmeanrms - pedrms1)/1000.0;
+         //printf("%f %f\n",pedmean, pedrms);
+
+         Float_t adc1 = adc - (pedmean + 3.0*pedrms);
+
+         // CALIBRATION
+         Float_t gain = fCalibGain->GetGainFact(det,smn,xpos,ypos);
+         // printf("adc = %d gain = %f\n",adc,gain);
+
+         adc = adc1*gain;
+
+         //Int_t trno   = pmddigit->GetTrackNumber();
+         fCellTrack[xpos][ypos] = pmddigit->GetTrackNumber();
+         fCellPid[xpos][ypos] = pmddigit->GetTrackPid();
+         fCellADC[xpos][ypos] = (Double_t) adc;
+
+         totADCMod += (Int_t) adc;
+
+       }
+
+      idet = det;
+      ismn = smn;
+
+      if (totADCMod <= 0) continue;
+
+      pmdclust->DoClust(idet,ismn,fCellTrack,fCellPid,fCellADC,
+                       pmdisocell,pmdcont);
+      
+      Int_t nentries1 = pmdcont->GetEntries();
+
+      AliDebug(1,Form("Total number of clusters/module = %d",nentries1));
+
+      for (Int_t ient1 = 0; ient1 < nentries1; ient1++)
+       {
+         pmdcl = (AliPMDcluster*)pmdcont->UncheckedAt(ient1);
+         idet        = pmdcl->GetDetector();
+         ismn        = pmdcl->GetSMN();
+         clusdata[0] = pmdcl->GetClusX();
+         clusdata[1] = pmdcl->GetClusY();
+         clusdata[2] = pmdcl->GetClusADC();
+         clusdata[3] = pmdcl->GetClusCells();
+         clusdata[4] = pmdcl->GetClusSigmaX();
+         clusdata[5] = pmdcl->GetClusSigmaY();
+
+         AddRecPoint(idet,ismn,clusdata);
+
+         Int_t ncell = (Int_t) clusdata[3];
+         for(Int_t ihit = 0; ihit < ncell; ihit++)
+           {
+             Int_t celldataX = pmdcl->GetClusCellX(ihit);
+             Int_t celldataY = pmdcl->GetClusCellY(ihit);
+             Int_t celldataTr = pmdcl->GetClusCellTrack(ihit);
+             Int_t celldataPid   = pmdcl->GetClusCellPid(ihit);
+             AddRecHit(celldataX, celldataY, celldataTr, celldataPid);
+           }
+         branch2->Fill();
+         ResetRechit();
+       }
+      pmdcont->Delete();
+
+      // Added single isolated cell for offline gain calibration
+      nentries1 = pmdisocell->GetEntries();
+      AliDebug(1,Form("Total number of isolated single cell clusters = %d",nentries1));
+      
+      for (Int_t ient1 = 0; ient1 < nentries1; ient1++)
+       {
+         pmdiso = (AliPMDisocell*)pmdisocell->UncheckedAt(ient1);
+         idet = pmdiso->GetDetector();
+         ismn = pmdiso->GetSmn();
+         clusdata[0] = (Float_t) pmdiso->GetRow();
+         clusdata[1] = (Float_t) pmdiso->GetCol();
+         clusdata[2] = pmdiso->GetADC();
+         clusdata[3] = 1.;
+         clusdata[4] = -99.;
+         clusdata[5] = -99.;
+         
+         AddRecPoint(idet,ismn,clusdata);
+       }
+      pmdisocell->Delete();
+      
+      branch1->Fill();
+      ResetRecpoint();
+
+    } // modules
+
+
+  ResetCellADC();
+
+  //   delete the pointers
+  delete pmdclust;
+  delete pmdcont;
+  delete pmdisocell;
+}
+// ------------------------------------------------------------------------- //
+
 void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader,
                                           TTree *clustersTree)
 {
   // Converts RAW data to recpoints after running clustering
   // algorithm on CPV and PREshower plane
   //
-  // This method is called at the time of reconstruction
+  // This method is called at the time of reconstruction from RAW data
+
+
+  AliPMDddldata *pmdddl = 0x0;
+  AliPMDcluster *pmdcl  = 0x0;
+  AliPMDisocell *pmdiso = 0x0;
 
 
   Float_t  clusdata[6];
   TObjArray pmdddlcont;
 
   TObjArray *pmdcont = new TObjArray();
+  TObjArray *pmdisocell = new TObjArray();
+
   AliPMDClustering *pmdclust = new AliPMDClusteringV1();
 
   pmdclust->SetEdepCut(fEcut);
@@ -284,16 +486,17 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader,
 
   TBranch * branch2 = clustersTree->Branch("PMDRechit", &fRechits, bufsize); 
 
-  const Int_t kDDL = AliDAQ::NumberOfDdls("PMD");
   const Int_t kRow = 48;
   const Int_t kCol = 96;
 
   Int_t idet = 0;
   Int_t iSMN = 0;
 
-  
-  for (Int_t indexDDL = 0; indexDDL < kDDL; indexDDL++)
-    {
+  Int_t indexDDL = -1;
+  AliPMDRawStream pmdinput(rawReader);
+
+  while ((indexDDL = pmdinput.DdlData(&pmdddlcont)) >=0)
+  {
       if (indexDDL < 4)
        {
          iSMN = 6;
@@ -320,18 +523,12 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader,
            }
        }
       ResetCellADC();
-      rawReader->Reset();
-      AliPMDRawStream pmdinput(rawReader);
-
-      rawReader->Select("PMD", indexDDL, indexDDL);
-
-      pmdinput.DdlData(indexDDL,&pmdddlcont);
 
       Int_t indexsmn = 0;
       Int_t ientries = pmdddlcont.GetEntries();
       for (Int_t ient = 0; ient < ientries; ient++)
        {
-         AliPMDddldata *pmdddl = (AliPMDddldata*)pmdddlcont.UncheckedAt(ient);
+         pmdddl = (AliPMDddldata*)pmdddlcont.UncheckedAt(ient);
          
          Int_t det = pmdddl->GetDetector();
          Int_t smn = pmdddl->GetSMN();
@@ -341,9 +538,31 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader,
          Int_t col = pmdddl->GetColumn();
          Int_t sig = pmdddl->GetSignal();
 
-         Float_t sig1 = (Float_t) sig;
+         if(smn == -1)
+           {
+             AliError(Form("*MODULE NUMBER WRONG %d *",smn));
+             continue; 
+           }
+         if(row < 0 || row > 48 || col < 0 || col > 96)
+           {
+             AliError(Form("*Row %d and Column NUMBER %d NOT Valid *",
+                           row, col));
+             continue; 
+           }
+
+         // Pedestal Subtraction
+         Int_t   pedmeanrms = fCalibPed->GetPedMeanRms(det,smn,row,col);
+         Int_t   pedrms1    = (Int_t) pedmeanrms%100;
+         Float_t pedrms     = (Float_t)pedrms1/10.;
+         Float_t pedmean    = (Float_t) (pedmeanrms - pedrms1)/1000.0;
+
+         //printf("%f %f\n",pedmean, pedrms);
+
+         // Float_t sig1 = (Float_t) sig;
+         Float_t sig1 = (Float_t) sig - (pedmean + 3.0*pedrms);
+
          // CALIBRATION
-         Float_t gain = fCalibData->GetGainFact(det,smn,row,col);
+         Float_t gain = fCalibGain->GetGainFact(det,smn,row,col);
          //printf("sig = %d gain = %f\n",sig,gain);
          sig = (Int_t) (sig1*gain);
 
@@ -385,18 +604,25 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader,
          precpvADC[indexsmn][row][col] = sig;
        }
       
-      pmdddlcont.Clear();
+      pmdddlcont.Delete();
+
+      Int_t totAdcMod = 0;
 
       Int_t ismn = 0;
-      for (Int_t indexsmn = 0; indexsmn < iSMN; indexsmn++)
+      for (indexsmn = 0; indexsmn < iSMN; indexsmn++)
        {
          ResetCellADC();
+         totAdcMod = 0;
          for (Int_t irow = 0; irow < kRow; irow++)
            {
              for (Int_t icol = 0; icol < kCol; icol++)
                {
+                 fCellTrack[irow][icol] = -1;
+                 fCellPid[irow][icol]   = -1;
+
                  fCellADC[irow][icol] = 
                    (Double_t) precpvADC[indexsmn][irow][icol];
+                 totAdcMod += precpvADC[indexsmn][irow][icol];
                } // row
            }     // col
          
@@ -430,15 +656,20 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader,
              idet = 1;
            }
 
-         pmdclust->DoClust(idet,ismn,fCellADC,pmdcont);
+         if (totAdcMod <= 0) continue;
+
+
+         //pmdclust->DoClust(idet,ismn,fCellADC,pmdisocell,pmdcont);
+         pmdclust->DoClust(idet,ismn,fCellTrack,fCellPid,fCellADC,
+                           pmdisocell,pmdcont);
+
          Int_t nentries1 = pmdcont->GetEntries();
 
          AliDebug(1,Form("Total number of clusters/module = %d",nentries1));
 
          for (Int_t ient1 = 0; ient1 < nentries1; ient1++)
            {
-             AliPMDcluster *pmdcl = 
-               (AliPMDcluster*)pmdcont->UncheckedAt(ient1);
+             pmdcl = (AliPMDcluster*)pmdcont->UncheckedAt(ient1);
              idet        = pmdcl->GetDetector();
              ismn        = pmdcl->GetSMN();
              clusdata[0] = pmdcl->GetClusX();
@@ -455,13 +686,37 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader,
                {
                  Int_t celldataX = pmdcl->GetClusCellX(ihit);
                  Int_t celldataY = pmdcl->GetClusCellY(ihit);
-                 AddRecHit(celldataX, celldataY);
+                 Int_t celldataTr = pmdcl->GetClusCellTrack(ihit);
+                 Int_t celldataPid   = pmdcl->GetClusCellPid(ihit);
+                 AddRecHit(celldataX, celldataY, celldataTr, celldataPid);
+                 //AddRecHit(celldataX, celldataY);
                }
              branch2->Fill();
              ResetRechit();
 
            }
-         pmdcont->Clear();
+         pmdcont->Delete();
+
+
+         // Added single isolated cell for offline gain calibration
+         nentries1 = pmdisocell->GetEntries();
+         AliDebug(1,Form("Total number of isolated single cell clusters = %d",nentries1));
+         
+         for (Int_t ient1 = 0; ient1 < nentries1; ient1++)
+           {
+             pmdiso = (AliPMDisocell*)pmdisocell->UncheckedAt(ient1);
+             idet = pmdiso->GetDetector();
+             ismn = pmdiso->GetSmn();
+             clusdata[0] = (Float_t) pmdiso->GetRow();
+             clusdata[1] = (Float_t) pmdiso->GetCol();
+             clusdata[2] = pmdiso->GetADC();
+             clusdata[3] = 1.;
+             clusdata[4] = -99.;
+             clusdata[5] = -99.;
+      
+             AddRecPoint(idet,ismn,clusdata);
+           }
+         pmdisocell->Delete();
          
          branch1->Fill();
          ResetRecpoint();
@@ -474,14 +729,17 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader,
          for (Int_t j=0; j<kRow; j++) delete [] precpvADC[i][j];
        }
       for (Int_t i=0; i<iSMN; i++) delete [] precpvADC[i];
-      delete precpvADC;
+      delete [] precpvADC;
+
     } // DDL Loop
+
   
   ResetCellADC();
   
   //   delete the pointers
   delete pmdclust;
   delete pmdcont;
+  delete pmdisocell;
 
 }
 // ------------------------------------------------------------------------- //
@@ -493,8 +751,15 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader)
   //
 
   Float_t  clusdata[6];
+
   TObjArray pmdddlcont;
+
+  //AliPMDcluster *pmdcl  = 0x0;
+  AliPMDisocell *pmdiso  = 0x0;
+
+
   TObjArray *pmdcont = new TObjArray();
+  TObjArray *pmdisocell = new TObjArray();
 
   AliPMDClustering *pmdclust = new AliPMDClusteringV1();
 
@@ -514,15 +779,17 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader)
   TBranch *branch1 = fTreeR->Branch("PMDRecpoint", &fRecpoints, bufsize); 
   TBranch *branch2 = fTreeR->Branch("PMDRechit", &fRechits, bufsize); 
 
-  const Int_t kDDL = AliDAQ::NumberOfDdls("PMD");
   const Int_t kRow = 48;
   const Int_t kCol = 96;
 
   Int_t idet = 0;
   Int_t iSMN = 0;
-  
-  for (Int_t indexDDL = 0; indexDDL < kDDL; indexDDL++)
-    {
+
+  AliPMDRawStream pmdinput(rawReader);
+  Int_t indexDDL = -1;
+
+  while ((indexDDL = pmdinput.DdlData(&pmdddlcont)) >=0) {
+
       if (indexDDL < 4)
        {
          iSMN = 6;
@@ -549,11 +816,7 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader)
            }
        }
       ResetCellADC();
-      rawReader->Reset();
-      rawReader->Select("PMD", indexDDL, indexDDL);
 
-      AliPMDRawStream pmdinput(rawReader);
-      pmdinput.DdlData(indexDDL,&pmdddlcont);
     
       Int_t indexsmn = 0;
       Int_t ientries = pmdddlcont.GetEntries();
@@ -568,10 +831,24 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader)
          Int_t row = pmdddl->GetRow();
          Int_t col = pmdddl->GetColumn();
          Int_t sig = pmdddl->GetSignal();
+         if(row < 0 || row > 48 || col < 0 || col > 96)
+           {
+             AliError(Form("*Row %d and Column NUMBER %d NOT Valid *",
+                             row, col));
+             continue; 
+           }
+         // Pedestal Subtraction
+         Int_t   pedmeanrms = fCalibPed->GetPedMeanRms(det,smn,row,col);
+         Int_t   pedrms1    = (Int_t) pedmeanrms%100;
+         Float_t pedrms     = (Float_t)pedrms1/10.;
+         Float_t pedmean    = (Float_t) (pedmeanrms - pedrms1)/1000.0;
 
-         Float_t sig1 = (Float_t) sig;
+         //printf("%f %f\n",pedmean, pedrms);
+
+         //Float_t sig1 = (Float_t) sig;
+         Float_t sig1 = (Float_t) sig - (pedmean + 3.0*pedrms);
          // CALIBRATION
-         Float_t gain = fCalibData->GetGainFact(det,smn,row,col);
+         Float_t gain = fCalibGain->GetGainFact(det,smn,row,col);
 
          //printf("sig = %d gain = %f\n",sig,gain);
          sig = (Int_t) (sig1*gain);
@@ -616,16 +893,18 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader)
 
        }
       
-      pmdddlcont.Clear();
+      pmdddlcont.Delete();
 
       Int_t ismn = 0;
-      for (Int_t indexsmn = 0; indexsmn < iSMN; indexsmn++)
+      for (indexsmn = 0; indexsmn < iSMN; indexsmn++)
        {
          ResetCellADC();
          for (Int_t irow = 0; irow < kRow; irow++)
            {
              for (Int_t icol = 0; icol < kCol; icol++)
                {
+                 fCellTrack[irow][icol] = -1;
+                 fCellPid[irow][icol]   = -1;
                  fCellADC[irow][icol] = 
                    (Double_t) precpvADC[indexsmn][irow][icol];
                } // row
@@ -662,7 +941,10 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader)
              idet = 1;
            }
 
-         pmdclust->DoClust(idet,ismn,fCellADC,pmdcont);
+         //pmdclust->DoClust(idet,ismn,fCellADC,pmdisocell,pmdcont);
+         pmdclust->DoClust(idet,ismn,fCellTrack,fCellPid,fCellADC,
+                           pmdisocell,pmdcont);
+
          Int_t nentries1 = pmdcont->GetEntries();
 
          AliDebug(1,Form("Total number of clusters/module = %d",nentries1));
@@ -687,13 +969,36 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader)
                {
                  Int_t celldataX = pmdcl->GetClusCellX(ihit);
                  Int_t celldataY = pmdcl->GetClusCellY(ihit);
-                 AddRecHit(celldataX, celldataY);
+                 Int_t celldataTr = pmdcl->GetClusCellTrack(ihit);
+                 Int_t celldataPid = pmdcl->GetClusCellPid(ihit);
+                 AddRecHit(celldataX, celldataY, celldataTr, celldataPid);
+                 //AddRecHit(celldataX, celldataY);
                }
              branch2->Fill();
              ResetRechit();
 
            }
-         pmdcont->Clear();
+         pmdcont->Delete();
+
+         // Added single isolated cell for offline gain calibration
+         nentries1 = pmdisocell->GetEntries();
+         AliDebug(1,Form("Total number of isolated single cell clusters = %d",nentries1));
+         
+         for (Int_t ient1 = 0; ient1 < nentries1; ient1++)
+           {
+             pmdiso = (AliPMDisocell*)pmdisocell->UncheckedAt(ient1);
+             idet = pmdiso->GetDetector();
+             ismn = pmdiso->GetSmn();
+             clusdata[0] = (Float_t) pmdiso->GetRow();
+             clusdata[1] = (Float_t) pmdiso->GetCol();
+             clusdata[2] = pmdiso->GetADC();
+             clusdata[3] = 1.;
+             clusdata[4] = -99.;
+             clusdata[5] = -99.;
+      
+             AddRecPoint(idet,ismn,clusdata);
+           }
+         pmdisocell->Delete();
          
          branch1->Fill();
          ResetRecpoint();
@@ -708,7 +1013,8 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader)
       for (Int_t i=0; i<iSMN; i++) delete [] precpvADC[i];
       delete precpvADC;
     } // DDL Loop
-  
+
+
   ResetCellADC();
   
   fPMDLoader = fRunLoader->GetLoader("PMDLoader");  
@@ -717,7 +1023,7 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader)
   //   delete the pointers
   delete pmdclust;
   delete pmdcont;
-
+  delete pmdisocell;
 }
 // ------------------------------------------------------------------------- //
 void AliPMDClusterFinder::SetCellEdepCut(Float_t ecut)
@@ -736,13 +1042,14 @@ void AliPMDClusterFinder::AddRecPoint(Int_t idet,Int_t ismn,Float_t *clusdata)
   delete newrecpoint;
 }
 // ------------------------------------------------------------------------- //
-void AliPMDClusterFinder::AddRecHit(Int_t celldataX,Int_t celldataY)
+void AliPMDClusterFinder::AddRecHit(Int_t celldataX,Int_t celldataY,
+                                   Int_t celldataTr, Int_t celldataPid)
 {
   // Add associated cell hits to the Reconstructed points
   //
   TClonesArray &lrechits = *fRechits;
   AliPMDrechit *newrechit;
-  newrechit = new AliPMDrechit(celldataX, celldataY);
+  newrechit = new AliPMDrechit(celldataX, celldataY, celldataTr, celldataPid);
   new(lrechits[fNhit++]) AliPMDrechit(newrechit);
   delete newrechit;
 }
@@ -755,12 +1062,13 @@ void AliPMDClusterFinder::ResetCellADC()
     {
       for(Int_t icol = 0; icol < fgkCol; icol++)
        {
-         fCellADC[irow][icol] = 0.;
+         fCellTrack[irow][icol] = -1;
+         fCellPid[irow][icol]   = -1;
+         fCellADC[irow][icol]   = 0.;
        }
     }
 }
 // ------------------------------------------------------------------------- //
-
 void AliPMDClusterFinder::ResetRecpoint()
 {
   // Clear the list of reconstructed points
@@ -805,31 +1113,35 @@ void AliPMDClusterFinder::UnLoadClusters()
   fPMDLoader->UnloadRecPoints();
 }
 // ------------------------------------------------------------------------- //
-
-AliPMDCalibData* AliPMDClusterFinder::GetCalibData() const
+AliPMDCalibData* AliPMDClusterFinder::GetCalibGain() const
 {
   // The run number will be centralized in AliCDBManager,
   // you don't need to set it here!
   // Added by ZA
-  AliCDBEntry  *entry = AliCDBManager::Instance()->Get("PMD/Calib/Data");
+  AliCDBEntry  *entry = AliCDBManager::Instance()->Get("PMD/Calib/Gain");
   
-  if(!entry){
-    AliWarning("Calibration object retrieval failed! Dummy calibration will be used.");
-    
-    // this just remembers the actual default storage. No problem if it is null.
-    AliCDBStorage *origStorage = AliCDBManager::Instance()->GetDefaultStorage();
-    AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT");
-    
-    entry = AliCDBManager::Instance()->Get("PMD/Calib/Data");
-    
-    // now reset the original default storage to AliCDBManager...
-    AliCDBManager::Instance()->SetDefaultStorage(origStorage);  
-  }
+  if(!entry)  AliFatal("Calibration object retrieval failed! ");
   
   AliPMDCalibData *calibdata=0;
   if (entry) calibdata = (AliPMDCalibData*) entry->GetObject();
   
-  if (!calibdata)  AliError("No calibration data from calibration database !");
+  if (!calibdata)  AliFatal("No calibration data from calibration database !");
   
   return calibdata;
 }
+// ------------------------------------------------------------------------- //
+AliPMDPedestal* AliPMDClusterFinder::GetCalibPed() const
+{
+  // The run number will be centralized in AliCDBManager,
+  // you don't need to set it here!
+  AliCDBEntry  *entry = AliCDBManager::Instance()->Get("PMD/Calib/Ped");
+  
+  if(!entry) AliFatal("Pedestal object retrieval failed!");
+    
+  AliPMDPedestal *pedestal = 0;
+  if (entry) pedestal = (AliPMDPedestal*) entry->GetObject();
+  
+  if (!pedestal)  AliFatal("No pedestal data from pedestal database !");
+  
+  return pedestal;
+}