]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PMD/AliPMDDigitizer.cxx
cables and girders, modular geometry easy to turn off
[u/mrichter/AliRoot.git] / PMD / AliPMDDigitizer.cxx
index 8862302ea11b2ead3b4603fca72ec6e05d0381ff..ff7143d2f3e9e349f1914758d07e6b316bc3cf59 100644 (file)
@@ -54,6 +54,7 @@
 #include "AliPMDsdigit.h"
 #include "AliPMDdigit.h"
 #include "AliPMDCalibData.h"
+#include "AliPMDPedestal.h"
 #include "AliPMDDigitizer.h"
 
 
@@ -64,9 +65,11 @@ AliPMDDigitizer::AliPMDDigitizer() :
   fPMDHit(0),
   fPMD(0),
   fPMDLoader(0),
-  fCalibData(GetCalibData()),
+  fCalibGain(GetCalibGain()),
+  fCalibPed(GetCalibPed()),
   fSDigits(0),
   fDigits(0),
+  fCPVCell(0),
   fCell(0),
   fNsdigit(0),
   fNdigit(0),
@@ -83,14 +86,14 @@ AliPMDDigitizer::AliPMDDigitizer() :
            {
              fCPV[i][j][k] = 0.;
              fPRE[i][j][k] = 0.;
+             fCPVCounter[i][j][k] =  0; 
              fPRECounter[i][j][k] =  0;
-             fPRETrackNo[i][j][k] = -1;
              fCPVTrackNo[i][j][k] = -1;
+             fPRETrackNo[i][j][k] = -1;
            }
        }
     }
 
-
 }
 //____________________________________________________________________________
 AliPMDDigitizer::AliPMDDigitizer(const AliPMDDigitizer& digitizer):
@@ -99,9 +102,11 @@ AliPMDDigitizer::AliPMDDigitizer(const AliPMDDigitizer& digitizer):
   fPMDHit(0),
   fPMD(0),
   fPMDLoader(0),
-  fCalibData(GetCalibData()),
+  fCalibGain(GetCalibGain()),
+  fCalibPed(GetCalibPed()),
   fSDigits(0),
   fDigits(0),
+  fCPVCell(0),
   fCell(0),
   fNsdigit(0),
   fNdigit(0),
@@ -127,9 +132,11 @@ AliPMDDigitizer::AliPMDDigitizer(AliRunDigitizer* manager):
   fPMDHit(0),
   fPMD(0),
   fPMDLoader(0),
-  fCalibData(GetCalibData()),
+  fCalibGain(GetCalibGain()),
+  fCalibPed(GetCalibPed()),
   fSDigits(new TClonesArray("AliPMDsdigit", 1000)),
   fDigits(new TClonesArray("AliPMDdigit", 1000)),
+  fCPVCell(0),
   fCell(0),
   fNsdigit(0),
   fNdigit(0),
@@ -147,9 +154,10 @@ AliPMDDigitizer::AliPMDDigitizer(AliRunDigitizer* manager):
            {
              fCPV[i][j][k] = 0.;
              fPRE[i][j][k] = 0.;
+             fCPVCounter[i][j][k] =  0; 
              fPRECounter[i][j][k] =  0;
-             fPRETrackNo[i][j][k] = -1;
              fCPVTrackNo[i][j][k] = -1;
+             fPRETrackNo[i][j][k] = -1;
            }
        }
     }
@@ -170,6 +178,7 @@ AliPMDDigitizer::~AliPMDDigitizer()
     delete fDigits;
     fDigits=0;
   }
+  fCPVCell.Delete();
   fCell.Delete();
 }
 //
@@ -297,7 +306,7 @@ void AliPMDDigitizer::Hits2SDigits(Int_t ievt)
       if (fPMD)
        {
          npmd = hits->GetEntriesFast();
-         for (int ipmd = 0; ipmd < npmd; ipmd++)
+         for (Int_t ipmd = 0; ipmd < npmd; ipmd++)
            {
              fPMDHit = (AliPMDhit*) hits->UncheckedAt(ipmd);
              trackno = fPMDHit->GetTrack();
@@ -305,15 +314,10 @@ void AliPMDDigitizer::Hits2SDigits(Int_t ievt)
 
              TParticle* mparticle = gAlice->GetMCApp()->Particle(trackno);
              trackpid  = mparticle->GetPdgCode();
-
-             Int_t igatr = -999;
-             Int_t ichtr = -999;
-             Int_t igapid = -999;
+             Int_t  ks = mparticle->GetStatusCode();
              Int_t imo;
-             Int_t igen = 0;
-             Int_t idmo = -999;
-
              Int_t tracknoOld=0, trackpidOld=0, statusOld = 0;
+             
              if (mparticle->GetFirstMother() == -1)
                {
                  tracknoOld  = trackno;
@@ -321,51 +325,39 @@ void AliPMDDigitizer::Hits2SDigits(Int_t ievt)
                  statusOld   = -1;
                }
              Int_t igstatus = 0;
-             while((imo = mparticle->GetFirstMother()) >= 0)
+             //------------------modified by Mriganka ----------------------
+             if(ks==1||(imo = mparticle->GetFirstMother())<0 ){
+               vx = mparticle->Vx();
+               vy = mparticle->Vy();
+               vz = mparticle->Vz();
+               
+               if(trackpid==kGamma||trackpid==11||trackpid==-11||
+                  trackpid==kPi0)igstatus=1;
+             }
+             
+             
+             while(((imo = mparticle->GetFirstMother()) >= 0)&& 
+                   (ks = mparticle->GetStatusCode() <1) )
                {
-                 igen++;
-
                  mparticle =  gAlice->GetMCApp()->Particle(imo);
-                 idmo = mparticle->GetPdgCode();
-                 
+                 trackpid = mparticle->GetPdgCode();
+                 ks = mparticle->GetStatusCode();
                  vx = mparticle->Vx();
                  vy = mparticle->Vy();
                  vz = mparticle->Vz();
-               
-                 //printf("==> Mother ID %5d %5d %5d Vertex: %13.3f %13.3f %13.3f\n", igen, imo, idmo, vx, vy, vz);
-                 //fprintf(fpw1,"==> Mother ID %5d %5d %5d Vertex: %13.3f %13.3f %13.3f\n", igen, imo, idmo, vx, vy, vz);
-                 if ((idmo == kGamma || idmo == -11 || idmo == 11) && vx == 0. && vy == 0. && vz == 0.)
-                   {
-                     igatr = imo;
-                     igapid = idmo;
-                     igstatus = 1;
-                   }
-                 if(igstatus == 0)
-                   {
-                     if (idmo == kPi0 && vx == 0. && vy == 0. && vz == 0.)
-                       {
-                         igatr = imo;
-                         igapid = idmo;
-                       }
+                 
+                 trackno=imo;
+                               
                    }
-                 ichtr = imo;
-               }
-
-             if (idmo == kPi0 && vx == 0. && vy == 0. && vz == 0.)
-               {
-                 mtrackno = igatr;
-                 mtrackpid = igapid;
-               }
-             else
-               {
-                 mtrackno  = ichtr;
-                 mtrackpid = idmo;
-               }
-             if (statusOld == -1)
-               {
-                 mtrackno  = tracknoOld;
-                 mtrackpid = trackpidOld;
-               }
+        
+             if(trackpid==kGamma||trackpid==11||trackpid==-11||
+                trackpid==kPi0)igstatus=1;
+             mtrackpid=trackpid;
+             mtrackno=trackno;
+             trackpid=trackpidOld;
+             trackno=tracknoOld;
+             
+             //-----------------end of modification----------------
              xPos = fPMDHit->X();
              yPos = fPMDHit->Y();
              zPos = fPMDHit->Z();
@@ -373,8 +365,7 @@ void AliPMDDigitizer::Hits2SDigits(Int_t ievt)
              edep       = fPMDHit->GetEnergy();
              Int_t vol1 = fPMDHit->GetVolume(1); // Column
              Int_t vol2 = fPMDHit->GetVolume(2); // Row
-             Int_t vol7 = fPMDHit->GetVolume(7); // UnitModule
-             Int_t vol8 = fPMDHit->GetVolume(8); // SuperModule
+             Int_t vol7 = fPMDHit->GetVolume(4); // Serial Module No
 
 
              // -----------------------------------------//
@@ -385,9 +376,15 @@ void AliPMDDigitizer::Hits2SDigits(Int_t ievt)
              //  nrow = 96, ncol = 48                    //
              // -----------------------------------------//
 
-
-             
-             smnumber = (vol8-1)*6 + vol7;
+             if (vol7 < 24)
+               {
+                 smnumber = vol7;
+               }
+             else
+               {
+                 smnumber = vol7 - 24;
+               }
+             Int_t vol8 = smnumber/6 + 1;   // fake supermodule
 
              if (vol8 == 1 || vol8 == 2)
                {
@@ -412,7 +409,8 @@ void AliPMDDigitizer::Hits2SDigits(Int_t ievt)
                  // PMD
                  fDetNo = 0;
                }
-             Int_t smn = smnumber - 1;
+             //Int_t smn = smnumber - 1;
+             Int_t smn = smnumber;
              Int_t ixx = xpad     - 1;
              Int_t iyy = ypad     - 1;
              if (fDetNo == 0)
@@ -426,12 +424,14 @@ void AliPMDDigitizer::Hits2SDigits(Int_t ievt)
              else if(fDetNo == 1)
                {
                  fCPV[smn][ixx][iyy] += edep;
-                 fCPVTrackNo[smn][ixx][iyy] = mtrackno;
+                 fCPVCounter[smn][ixx][iyy]++;
+                 AliPMDcell* cpvcell = new AliPMDcell(mtrackno,smn,ixx,iyy,edep); 
+                 fCPVCell.Add(cpvcell);
                }
            }
        }
     } // Track Loop ended
-
+  TrackAssignment2CPVCell();
   TrackAssignment2Cell();
   ResetCell();
 
@@ -537,7 +537,7 @@ void AliPMDDigitizer::Hits2Digits(Int_t ievt)
       if (fPMD)
        {
          npmd = hits->GetEntriesFast();
-         for (int ipmd = 0; ipmd < npmd; ipmd++)
+         for (Int_t ipmd = 0; ipmd < npmd; ipmd++)
            {
              fPMDHit = (AliPMDhit*) hits->UncheckedAt(ipmd);
              trackno = fPMDHit->GetTrack();
@@ -546,14 +546,8 @@ void AliPMDDigitizer::Hits2Digits(Int_t ievt)
              
              TParticle* mparticle = gAlice->GetMCApp()->Particle(trackno);
              trackpid  = mparticle->GetPdgCode();
-
-             Int_t igatr = -999;
-             Int_t ichtr = -999;
-             Int_t igapid = -999;
+             Int_t  ks = mparticle->GetStatusCode();
              Int_t imo;
-             Int_t igen = 0;
-             Int_t idmo = -999;
-
              Int_t tracknoOld=0, trackpidOld=0, statusOld = 0;
              if (mparticle->GetFirstMother() == -1)
                {
@@ -563,61 +557,46 @@ void AliPMDDigitizer::Hits2Digits(Int_t ievt)
                }
 
              Int_t igstatus = 0;
-             while((imo = mparticle->GetFirstMother()) >= 0)
+             //-----------------------modified by Mriganka ------------------
+             if(ks==1||(imo = mparticle->GetFirstMother())<0 ){
+               vx = mparticle->Vx();
+               vy = mparticle->Vy();
+               vz = mparticle->Vz();
+               
+               if(trackpid==kGamma||trackpid==11||trackpid==-11||trackpid==kPi0)
+                 igstatus=1;
+             }
+             
+             
+             while(((imo = mparticle->GetFirstMother()) >= 0)&& 
+                   (ks = mparticle->GetStatusCode() <1) )
                {
-                 igen++;
-
                  mparticle =  gAlice->GetMCApp()->Particle(imo);
-                 idmo = mparticle->GetPdgCode();
-                 
+                 trackpid = mparticle->GetPdgCode();
+                 ks = mparticle->GetStatusCode();
                  vx = mparticle->Vx();
                  vy = mparticle->Vy();
                  vz = mparticle->Vz();
-               
-                 //printf("==> Mother ID %5d %5d %5d Vertex: %13.3f %13.3f %13.3f\n", igen, imo, idmo, vx, vy, vz);
-                 //fprintf(fpw1,"==> Mother ID %5d %5d %5d Vertex: %13.3f %13.3f %13.3f\n", igen, imo, idmo, vx, vy, vz);
-                 if ((idmo == kGamma || idmo == -11 || idmo == 11) && vx == 0. && vy == 0. && vz == 0.)
-                   {
-                     igatr = imo;
-                     igapid = idmo;
-                     igstatus = 1;
-                   }
-                 if(igstatus == 0)
-                   {
-                     if (idmo == kPi0 && vx == 0. && vy == 0. && vz == 0.)
-                       {
-                         igatr = imo;
-                         igapid = idmo;
-                       }
+                 
+                 trackno=imo;
+                               
                    }
-                 ichtr = imo;
-               }
-
-             if (idmo == kPi0 && vx == 0. && vy == 0. && vz == 0.)
-               {
-                 mtrackno = igatr;
-                 mtrackpid = igapid;
-               }
-             else
-               {
-                 mtrackno  = ichtr;
-                 mtrackpid = idmo;
-               }
-             if (statusOld == -1)
-               {
-                 mtrackno  = tracknoOld;
-                 mtrackpid = trackpidOld;
-               }
+        
+             if(trackpid==kGamma||trackpid==11||trackpid==-11||trackpid==kPi0)
+               igstatus=1;
+             mtrackpid=trackpid;
+             mtrackno=trackno;
+             trackpid=trackpidOld;
+             trackno=tracknoOld;
              
+             //-----------------end of modification----------------
              xPos = fPMDHit->X();
              yPos = fPMDHit->Y();
              zPos = fPMDHit->Z();
              edep       = fPMDHit->GetEnergy();
              Int_t vol1 = fPMDHit->GetVolume(1); // Column
              Int_t vol2 = fPMDHit->GetVolume(2); // Row
-             Int_t vol7 = fPMDHit->GetVolume(7); // UnitModule
-             Int_t vol8 = fPMDHit->GetVolume(8); // SuperModule
-
+             Int_t vol7 = fPMDHit->GetVolume(4); // Serial Module No
 
              // -----------------------------------------//
              // In new geometry after adding electronics //
@@ -627,7 +606,15 @@ void AliPMDDigitizer::Hits2Digits(Int_t ievt)
              //  nrow = 96, ncol = 48                    //
              // -----------------------------------------//
              
-             smnumber = (vol8-1)*6 + vol7;
+             if (vol7 < 24)
+               {
+                 smnumber = vol7;
+               }
+             else
+               {
+                 smnumber = vol7 - 24;
+               }
+             Int_t vol8 = smnumber/6 + 1;    // fake supermodule
 
              if (vol8 == 1 || vol8 == 2)
                {
@@ -654,7 +641,8 @@ void AliPMDDigitizer::Hits2Digits(Int_t ievt)
                  fDetNo = 0;
                }
 
-             Int_t smn = smnumber - 1;
+             //Int_t smn = smnumber - 1;
+             Int_t smn = smnumber;
              Int_t ixx = xpad     - 1;
              Int_t iyy = ypad     - 1;
              if (fDetNo == 0)
@@ -669,12 +657,14 @@ void AliPMDDigitizer::Hits2Digits(Int_t ievt)
              else if(fDetNo == 1)
                {
                  fCPV[smn][ixx][iyy] += edep;
-                 fCPVTrackNo[smn][ixx][iyy] = mtrackno;
+                 fCPVCounter[smn][ixx][iyy]++;
+                 AliPMDcell* cpvcell = new AliPMDcell(mtrackno,smn,ixx,iyy,edep); 
+                 fCPVCell.Add(cpvcell);
                }
            }
        }
     } // Track Loop ended
-
+  TrackAssignment2CPVCell();
   TrackAssignment2Cell();
   ResetCell();
 
@@ -719,7 +709,19 @@ void AliPMDDigitizer::Hits2Digits(Int_t ievt)
                      {
                          adc = 0.;
                      }
-                     AddDigit(trno,detno,ism,jrow,kcol,adc);
+
+                     // Pedestal Decalibration
+                     Int_t   pedmeanrms = 
+                         fCalibPed->GetPedMeanRms(idet,ism,jrow,kcol);
+                     Int_t   pedrms1    = (Int_t) pedmeanrms%100;
+                     Float_t pedrms     = (Float_t)pedrms1/10.;
+                     Float_t pedmean    = 
+                         (Float_t) (pedmeanrms - pedrms1)/1000.0;
+                     if (adc > 0.)
+                     {
+                         adc += (pedmean + 3.0*pedrms);
+                         AddDigit(trno,detno,ism,jrow,kcol,adc);
+                     }
                  }
              } // column loop
          } // row    loop
@@ -793,15 +795,24 @@ void AliPMDDigitizer::SDigits2Digits(Int_t ievt)
          Float_t gain1 = Gain(det,smn,irow,icol);
          if (gain1 != 0.)
          {
-             Int_t adcDecalib = (Int_t)(adc/gain1);
-             adc = (Float_t) adcDecalib;
+           Int_t adcDecalib = (Int_t)(adc/gain1);
+           adc = (Float_t) adcDecalib;
          }
          else if(gain1 == 0.)
          {
              adc = 0.;
          }
+         // Pedestal Decalibration
+         Int_t   pedmeanrms = fCalibPed->GetPedMeanRms(det,smn,irow,icol);
+         Int_t   pedrms1    = (Int_t) pedmeanrms%100;
+         Float_t pedrms     = (Float_t)pedrms1/10.;
+         Float_t pedmean    = (Float_t) (pedmeanrms - pedrms1)/1000.0;
+         if(adc > 0.)
+         {
+             adc += (pedmean + 3.0*pedrms);
+             AddDigit(trno,det,smn,irow,icol,adc);
+         }
 
-         AddDigit(trno,det,smn,irow,icol,adc);
        }
       treeD->Fill();
       ResetDigit();
@@ -875,10 +886,12 @@ void AliPMDDigitizer::Exec(Option_t *option)
                  if (deltaE > 0.)
                    {
                      MeV2ADC(deltaE,adc);
+
                       //
-                     // To decalibrte the adc values
+                     // Gain decalibration
                      //
                      Float_t gain1 = Gain(idet,ism,jrow,kcol);
+
                      if (gain1 != 0.)
                      {
                          Int_t adcDecalib = (Int_t)(adc/gain1);
@@ -888,8 +901,19 @@ void AliPMDDigitizer::Exec(Option_t *option)
                      {
                          adc = 0.;
                      }
+                     // Pedestal Decalibration
+                     Int_t   pedmeanrms = 
+                         fCalibPed->GetPedMeanRms(idet,ism,jrow,kcol);
+                     Int_t   pedrms1    = (Int_t) pedmeanrms%100;
+                     Float_t pedrms     = (Float_t)pedrms1/10.;
+                     Float_t pedmean    = 
+                         (Float_t) (pedmeanrms - pedrms1)/1000.0;
+                     if (adc > 0.)
+                     {
+                         adc += (pedmean + 3.0*pedrms);
+                         AddDigit(trno,detno,ism,jrow,kcol,adc);
+                     }
 
-                     AddDigit(trno,detno,ism,jrow,kcol,adc);
                    }
                } // column loop
            } // row    loop
@@ -902,6 +926,206 @@ void AliPMDDigitizer::Exec(Option_t *option)
   ResetCellADC();
 }
 //____________________________________________________________________________
+void AliPMDDigitizer::TrackAssignment2CPVCell()
+{
+  // This block assigns the cell id when there are
+  // multiple tracks in a cell according to the
+  // energy deposition
+  // This method added by Ajay
+  Bool_t jsort = false;
+
+  Int_t i, j, k;
+
+  Int_t   *status1;
+  Int_t   *status2;
+  Int_t   *trnarray;  
+  Float_t *fracEdp;
+  Float_t *trEdp;
+  
+  Int_t   ****cpvTrack;
+  Float_t ****cpvEdep;
+
+  cpvTrack = new Int_t ***[fgkTotUM];
+  cpvEdep  = new Float_t ***[fgkTotUM];
+  for (i=0; i<fgkTotUM; i++)
+    {
+      cpvTrack[i] = new Int_t **[fgkRow];
+      cpvEdep[i]  = new Float_t **[fgkRow];
+    }
+
+  for (i = 0; i < fgkTotUM; i++)
+    {
+      for (j = 0; j < fgkRow; j++)
+       {
+         cpvTrack[i][j] = new Int_t *[fgkCol];
+         cpvEdep[i][j]  = new Float_t *[fgkCol];
+       }
+    }
+  for (i = 0; i < fgkTotUM; i++)
+    {
+      for (j = 0; j < fgkRow; j++)
+       {
+         for (k = 0; k < fgkCol; k++)
+           {
+             Int_t nn = fCPVCounter[i][j][k];
+             if(nn > 0)
+               {
+                 cpvTrack[i][j][k] = new Int_t[nn];
+                 cpvEdep[i][j][k] = new Float_t[nn];
+               }
+             else
+               {
+                 nn = 1;
+                 cpvTrack[i][j][k] = new Int_t[nn];
+                 cpvEdep[i][j][k] = new Float_t[nn];
+               }                     
+             fCPVCounter[i][j][k] = 0;
+           }
+       }
+    }
+
+
+  Int_t nentries = fCPVCell.GetEntries();
+  Int_t   mtrackno, ism, ixp, iyp;
+  Float_t edep;
+  for (i = 0; i < nentries; i++)
+    {
+      AliPMDcell* cpvcell = (AliPMDcell*)fCPVCell.UncheckedAt(i);
+      
+      mtrackno = cpvcell->GetTrackNumber();
+      ism      = cpvcell->GetSMNumber();
+      ixp      = cpvcell->GetX();
+      iyp      = cpvcell->GetY();
+      edep     = cpvcell->GetEdep();
+      Int_t nn = fCPVCounter[ism][ixp][iyp];
+      cpvTrack[ism][ixp][iyp][nn] = (Int_t) mtrackno;
+      cpvEdep[ism][ixp][iyp][nn] = edep;
+      fCPVCounter[ism][ixp][iyp]++;
+    }
+  
+  Int_t iz, il;
+  Int_t im, ix, iy;
+  Int_t nn;
+  for (im=0; im<fgkTotUM; im++)
+    {
+      for (ix=0; ix<fgkRow; ix++)
+       {
+         for (iy=0; iy<fgkCol; iy++)
+           {
+             nn = fCPVCounter[im][ix][iy];
+             if (nn > 1)
+               {
+                 // This block handles if a cell is fired
+                 // many times by many tracks
+                 status1  = new Int_t[nn];
+                 status2  = new Int_t[nn];
+                 trnarray = new Int_t[nn];
+                 for (iz = 0; iz < nn; iz++)
+                   {
+                     status1[iz] = cpvTrack[im][ix][iy][iz];
+                   }
+                 TMath::Sort(nn,status1,status2,jsort);
+                 Int_t trackOld = -99999;
+                 Int_t track, trCount = 0;
+                 for (iz = 0; iz < nn; iz++)
+                   {
+                     track = status1[status2[iz]];
+                     if (trackOld != track)
+                       {
+                         trnarray[trCount] = track;
+                         trCount++;
+                       }                             
+                     trackOld = track;
+                   }
+                 delete [] status1;
+                 delete [] status2;
+                 Float_t totEdp = 0.;
+                 trEdp = new Float_t[trCount];
+                 fracEdp = new Float_t[trCount];
+                 for (il = 0; il < trCount; il++)
+                   {
+                     trEdp[il] = 0.;
+                     track = trnarray[il];
+                     for (iz = 0; iz < nn; iz++)
+                       {
+                         if (track == cpvTrack[im][ix][iy][iz])
+                           {
+                             trEdp[il] += cpvEdep[im][ix][iy][iz];
+                           }
+                       }
+                     totEdp += trEdp[il];
+                   }
+                 Int_t ilOld = 0;
+                 Float_t fracOld = 0.;
+                 
+                 for (il = 0; il < trCount; il++)
+                   {
+                     fracEdp[il] = trEdp[il]/totEdp;
+                     if (fracOld < fracEdp[il])
+                       {
+                         fracOld = fracEdp[il];
+                         ilOld = il;
+                       }
+                   }
+                 fCPVTrackNo[im][ix][iy] = trnarray[ilOld];
+                 delete [] fracEdp;
+                 delete [] trEdp;
+                 delete [] trnarray;
+               }
+             else if (nn == 1)
+               {
+                 // This only handles if a cell is fired
+                 // by only one track
+                 
+                 fCPVTrackNo[im][ix][iy] = cpvTrack[im][ix][iy][0];
+                 
+               }
+             else if (nn ==0)
+               {
+                 // This is if no cell is fired
+                 fCPVTrackNo[im][ix][iy] = -999;
+               }
+           } // end of iy
+       } // end of ix
+    } // end of im
+  
+  // Delete all the pointers
+  
+ for (i = 0; i < fgkTotUM; i++)
+    {
+      for (j = 0; j < fgkRow; j++)
+       {
+         for (k = 0; k < fgkCol; k++)
+           {
+             delete []cpvTrack[i][j][k];
+             delete []cpvEdep[i][j][k];
+           }
+       }
+    }
+  for (i = 0; i < fgkTotUM; i++)
+    {
+      for (j = 0; j < fgkRow; j++)
+       {
+         delete [] cpvTrack[i][j];
+         delete [] cpvEdep[i][j];
+       }
+    }
+  
+  for (i = 0; i < fgkTotUM; i++)
+    {
+      delete [] cpvTrack[i];
+      delete [] cpvEdep[i];
+    }
+  delete [] cpvTrack;
+  delete [] cpvEdep;
+  
+  // 
+  // End of the cell id assignment
+  //
+}
+//____________________________________________________________________________
 
 void AliPMDDigitizer::MergeSDigits(Int_t filenumber, Int_t troffset)
 {
@@ -967,11 +1191,12 @@ void AliPMDDigitizer::TrackAssignment2Cell()
 
   Int_t i, j, k;
 
+  Int_t   *status1;
+  Int_t   *status2;
+  Int_t   *trnarray;
   Float_t *fracEdp;
   Float_t *trEdp;
-  Int_t *status1;
-  Int_t *status2;
-  Int_t *trnarray;
+  
   Int_t   ****pmdTrack;
   Float_t ****pmdEdep;
 
@@ -1162,37 +1387,29 @@ void AliPMDDigitizer::MeV2ADC(Float_t mev, Float_t & adc) const
 {
   // This converts the simulated edep to ADC according to the
   // Test Beam Data
-  // To be done
-  //
-
-  // PS Test in September 2003
-  // MeV - ADC conversion for 10bit ADC
-
-  const Float_t kConstant   = 7.181;
-  const Float_t kErConstant = 0.6899;
-  const Float_t kSlope      = 35.93;
-  const Float_t kErSlope    = 0.306;
-
-  //gRandom->SetSeed();
-
+  //PS Test in September 2003 and 2006
+  // KeV - ADC conversion for 12bit ADC
+  // Modified by Ajay
+  const Float_t kConstant   =  0.07;
+  const Float_t kErConstant =  0.1;
+  const Float_t kSlope      = 76.0;
+  const Float_t kErSlope    =  5.0;
+  
   Float_t cons   = gRandom->Gaus(kConstant,kErConstant);
   Float_t slop   = gRandom->Gaus(kSlope,kErSlope);
-
-  Float_t adc10bit = slop*mev*0.001 + cons;
-
-  // 12 bit adc
-
-  Int_t adc12bit = (Int_t) (4.0*adc10bit);
-
-  if(adc12bit < 3000)
+  
+  Float_t adc12bit = slop*mev*0.001 + cons;
+  
+                          
+  if(adc12bit < 1600.0)
     {
       adc = (Float_t) adc12bit;
     }
-  else if (adc12bit >= 3000)
+  else if (adc12bit >= 1600.0)
     {
-      adc = 3000.0;
+      adc = 1600.0;
     }
-
 }
 //____________________________________________________________________________
 void AliPMDDigitizer::AddSDigit(Int_t trnumber, Int_t det, Int_t smnumber,
@@ -1233,6 +1450,7 @@ void AliPMDDigitizer::ResetCell()
   // clears the cell array and also the counter
   //  for each cell
   //
+  fCPVCell.Delete();
   fCell.Delete();
   for (Int_t i = 0; i < fgkTotUM; i++)
     {
@@ -1240,6 +1458,7 @@ void AliPMDDigitizer::ResetCell()
        {
          for (Int_t k = 0; k < fgkCol; k++)
            {
+             fCPVCounter[i][j][k] = 0; 
              fPRECounter[i][j][k] = 0;
            }
        }
@@ -1272,8 +1491,8 @@ void AliPMDDigitizer::ResetCellADC()
            {
              fCPV[i][j][k] = 0.;
              fPRE[i][j][k] = 0.;
-             fPRETrackNo[i][j][k] = 0;
              fCPVTrackNo[i][j][k] = 0;
+             fPRETrackNo[i][j][k] = 0;
            }
        }
     }
@@ -1311,40 +1530,47 @@ Float_t AliPMDDigitizer::Gain(Int_t det, Int_t smn, Int_t row, Int_t col) const
   //cout<<" I am here in gain "<<fCalibData<< "smn,row, col "<<smn
   //<<" "<<row<<" "<<col<<endl;
 
-  if(!fCalibData) {
+  if(!fCalibGain) {
     AliError("No calibration data loaded from CDB!!!");
     return 1;
   }
 
   Float_t GainFact;
-  GainFact = fCalibData->GetGainFact(det,smn,row,col);
+  GainFact = fCalibGain->GetGainFact(det,smn,row,col);
   return GainFact;
 }
 //----------------------------------------------------------------------
-AliPMDCalibData* AliPMDDigitizer::GetCalibData() const
+AliPMDCalibData* AliPMDDigitizer::GetCalibGain() const
 {
   // The run number will be centralized in AliCDBManager,
   // you don't need to set it here!
   // Added this method by ZA
-  AliCDBEntry  *entry = AliCDBManager::Instance()->Get("PMD/Calib/Data");
+  // Cleaned up by Alberto
+  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* AliPMDDigitizer::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 calibration database !");
+  
+  return pedestal;
+}