]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPC.cxx
update to the runGrid Macro
[u/mrichter/AliRoot.git] / TPC / AliTPC.cxx
index a2948ae7139e4c31c9bc5afb01846d2b4121f7fc..b7aa8998cdd3b9277f01948c68a08500adc14092 100644 (file)
@@ -52,6 +52,7 @@
 #include <TTree.h>
 #include <TVector.h>
 #include <TVirtualMC.h>
+#include <TParameter.h>
 
 #include "AliDigits.h"
 #include "AliMagF.h"
@@ -78,7 +79,7 @@
 #include "AliTPCCalROC.h"
 #include "AliTPCExB.h"
 #include "AliRawReader.h"
-#include "AliTPCRawStream.h"
+#include "AliTPCRawStreamV3.h"
 #include "TTreeStream.h"
 
 ClassImp(AliTPC) 
@@ -99,13 +100,16 @@ ClassImp(AliTPC)
                   fCurrentNoise(0),
                   fActiveSectors(0),
                    fGainFactor(1.),
-    fDebugStreamer(0)
+                   fDebugStreamer(0),
+                   fLHCclockPhaseSw(0),
+                  fIsGEM(0)
 
 {
   //
   // Default constructor
   //
   fIshunt   = 0;
+  for(Int_t i=0;i<4;i++) fCurrentIndex[i]=0;
  
   //  fTrackHitsOld = 0;   
 #if ROOT_VERSION_CODE >= ROOT_VERSION(4,0,1)
@@ -132,8 +136,10 @@ AliTPC::AliTPC(const char *name, const char *title)
                   fNoiseTable(0),
                   fCurrentNoise(0),
                    fActiveSectors(0),
-    fGainFactor(1.),
-     fDebugStreamer(0)
+                   fGainFactor(1.),
+                   fDebugStreamer(0),
+    fLHCclockPhaseSw(0),
+    fIsGEM(0)
                   
 {
   //
@@ -162,7 +168,7 @@ AliTPC::AliTPC(const char *name, const char *title)
   fHitType = 2;
 #endif
 
-
+  for(Int_t i=0;i<4;i++) fCurrentIndex[i]=0;
 
   //
   fIshunt     =  0;
@@ -184,7 +190,12 @@ AliTPC::AliTPC(const char *name, const char *title)
   }
 
 }
-
+void AliTPC::CreateDebugStremer(){
+  //
+  // Create Debug streamer to check simulation
+  // 
+  fDebugStreamer = new TTreeSRedirector("TPCSimdebug.root");
+}
 //_____________________________________________________________________________
 AliTPC::~AliTPC()
 {
@@ -259,7 +270,7 @@ void AliTPC::CreateMaterials()
   wmat[0]=0.2729;
   wmat[1]=0.7271;
 
-  density=0.0018872;
+  density=0.001754609;
 
 
   AliMixture(10,"CO2",amat,zmat,density,2,wmat);
@@ -285,30 +296,33 @@ void AliTPC::CreateMaterials()
 
   //
   // Drift gases 1 - nonsensitive, 2 - sensitive
-  // Ne-CO2-N2 (90-10-5) (volume) values at 20deg and 1 atm.
-  // rho(Ne) = 0.839 g/cm^3, rho(CO2) = 1.842 g/cm^3, rho(N2) = 1.165 g/cm^3
-  // for the calculation - everything is normalized to 1
+  // Ne-CO2 (90-10) (volume) values at 20deg and 1 atm.
+  // rho(Ne) = 0.839 g/cm^3, rho(CO2) = 1.842 g/cm^3
+  
 
   amat[0]= 20.18;
   amat[1]=12.011;
   amat[2]=15.9994;
-  amat[3]=14.007;
+  // amat[3]=14.007;
 
   zmat[0]= 10.; 
   zmat[1]=6.;
   zmat[2]=8.;
-  zmat[3]=7.;
-
-  wmat[0]=0.756992632;
-  wmat[1]=0.056235789;
-  wmat[2]=0.128469474;
-  wmat[3]=0.058395789;
+  // zmat[3]=7.;
+
+  //wmat[0]=0.756992632;
+  wmat[0]=0.8038965;
+  //wmat[1]=0.056235789;
+  wmat[1]= 0.053519;
+  //wmat[2]=0.128469474;
+  wmat[2]= 0.1425743;
+  // wmat[3]=0.058395789;
  
-  density=0.0009733;
+  density=0.0009393;
 
-  AliMixture(12,"Ne-CO2-N-1",amat,zmat,density,4,wmat);
-  AliMixture(13,"Ne-CO2-N-2",amat,zmat,density,4,wmat);
-  AliMixture(30,"Ne-CO2-N-3",amat,zmat,density,4,wmat);
+  AliMixture(12,"Ne-CO2-1",amat,zmat,density,3,wmat);
+  AliMixture(13,"Ne-CO2-2",amat,zmat,density,3,wmat);
+  AliMixture(35,"Ne-CO2-3",amat,zmat,density,3,wmat);
   //----------------------------------------------------------------------
   //               solid materials
   //----------------------------------------------------------------------
@@ -671,10 +685,10 @@ void AliTPC::CreateMaterials()
   //----------------------------------------------------------
 
   AliMedium(0, "Air", 11, 0, iSXFLD, sXMGMX, 10., 999., .1, .01, .1);
-  AliMedium(1, "Ne-CO2-N-1", 12, 0, iSXFLD, sXMGMX, 10., 999.,.1,.001, .001);
-  AliMedium(2, "Ne-CO2-N-2", 13, 1, iSXFLD, sXMGMX, 10., 999.,.1,.001, .001);
+  AliMedium(1, "Ne-CO2-1", 12, 0, iSXFLD, sXMGMX, 10., 999.,.1,.001, .001);
+  AliMedium(2, "Ne-CO2-2", 13, 1, iSXFLD, sXMGMX, 10., 999.,.1,.001, .001);
   AliMedium(3,"CO2",10,0, iSXFLD, sXMGMX, 10., 999.,.1, .001, .001); 
-  AliMedium(20, "Ne-CO2-N-3", 30, 1, iSXFLD, sXMGMX, 10., 999.,.1,.001, .001);
+  AliMedium(20, "Ne-CO2-3", 35, 1, iSXFLD, sXMGMX, 10., 999.,.1,.001, .001);
   //-----------------------------------------------------------  
   // tracking media for solids
   //-----------------------------------------------------------
@@ -765,17 +779,19 @@ void    AliTPC::SetActiveSectors(Int_t flag)
     return;
   }
   for (Int_t i=0;i<fTPCParam->GetNSector();i++) fActiveSectors[i]=kFALSE;
-  TBranch * branch=0;
+  //TBranch * branch=0;
   if (fLoader->TreeH() == 0x0)
    {
      AliFatal("Can not find TreeH in folder");
      return;
    }
-  if (fHitType>1) branch = fLoader->TreeH()->GetBranch("TPC2");
-  else branch = fLoader->TreeH()->GetBranch("TPC");
+  //if (fHitType>1) branch = fLoader->TreeH()->GetBranch("TPC2");
+  if (fHitType>1) fLoader->TreeH()->GetBranch("TPC2");
+  //else branch = fLoader->TreeH()->GetBranch("TPC");
+  else fLoader->TreeH()->GetBranch("TPC");
   Stat_t ntracks = fLoader->TreeH()->GetEntries();
   // loop over all hits
-  AliDebug(1,Form("Got %d tracks",ntracks));
+  AliDebug(1,Form("Got %d tracks", (Int_t) ntracks));
   
   for(Int_t track=0;track<ntracks;track++) {
     ResetHits();
@@ -828,6 +844,7 @@ void AliTPC::Digits2Raw()
     return;
   }
 
+  //
   AliSimDigits digarr;
   AliSimDigits* digrow = &digarr;
   digits->GetBranch("Segment")->SetAddress(&digrow);
@@ -938,8 +955,17 @@ Bool_t AliTPC::Raw2SDigits(AliRawReader* rawReader){
   const Int_t kNOS = fTPCParam->GetNOuterSector();
   const Int_t kNS = kNIS + kNOS;
 
-  Short_t** allBins = NULL; //array which contains the data for one sector
-  
+  // Setup storage
+  AliTPCROC * roc = AliTPCROC::Instance();
+  Int_t nRowsMax = roc->GetNRows(roc->GetNSector()-1);
+  Int_t nPadsMax = roc->GetNPads(roc->GetNSector()-1,nRowsMax-1);
+  Short_t** allBins = new Short_t*[nRowsMax];
+  for (Int_t iRow = 0; iRow < nRowsMax; iRow++) {
+    Int_t maxBin = kmaxTime*nPadsMax;
+    allBins[iRow] = new Short_t[maxBin];
+    memset(allBins[iRow],0,sizeof(Short_t)*maxBin);
+  }
+
   for(Int_t iSector = 0; iSector < kNS; iSector++) {
     
     Int_t nRows = fTPCParam->GetNRow(iSector);
@@ -953,55 +979,65 @@ Bool_t AliTPC::Raw2SDigits(AliRawReader* rawReader){
       indexDDL = (iSector-kNIS) * 4 + kNIS * 2;
     }
 
-    // Loas the raw data for corresponding DDLs
+    // Load the raw data for corresponding DDLs
     rawReader->Reset();
-    AliTPCRawStream input(rawReader);
+
+    AliTPCAltroMapping** mapping =AliTPCcalibDB::Instance()->GetMapping();
+    AliTPCRawStreamV3 input(rawReader,(AliAltroMapping**)mapping);
     rawReader->Select("TPC",indexDDL,indexDDL+nDDLs-1);
 
-    // Alocate and init the array with the sector data
-    allBins = new Short_t*[nRows];
-    for (Int_t iRow = 0; iRow < nRows; iRow++) {
-      Int_t maxPad = fTPCParam->GetNPads(iSector,iRow);
-      Int_t maxBin = kmaxTime*maxPad;
-      allBins[iRow] = new Short_t[maxBin];
+    // Clean storage
+    for (Int_t iRow = 0; iRow < nRowsMax; iRow++) {
+      Int_t maxBin = kmaxTime*nPadsMax;
       memset(allBins[iRow],0,sizeof(Short_t)*maxBin);
     }
 
     // Begin loop over altro data
-    while (input.Next()) {
+    while (input.NextDDL()) {
 
       if (input.GetSector() != iSector)
        AliFatal(Form("Sector index mismatch ! Expected (%d), but got (%d) !",iSector,input.GetSector()));
 
-      Int_t iRow = input.GetRow();
-      if (iRow < 0 || iRow >= nRows)
-       AliFatal(Form("Pad-row index (%d) outside the range (%d -> %d) !",
-                     iRow, 0, nRows -1));
-      Int_t iPad = input.GetPad();
-
-      Int_t maxPad = fTPCParam->GetNPads(iSector,iRow);
-
-      if (iPad < 0 || iPad >= maxPad)
-       AliFatal(Form("Pad index (%d) outside the range (%d -> %d) !",
-                     iPad, 0, maxPad -1));
-
-      Int_t iTimeBin = input.GetTime();
-      if ( iTimeBin < 0 || iTimeBin >= kmaxTime)
-       AliFatal(Form("Timebin index (%d) outside the range (%d -> %d) !",
-                     iTimeBin, 0, kmaxTime -1));
-      
-      Int_t maxBin = kmaxTime*maxPad;
-
-      if (((iPad*kmaxTime+iTimeBin) >= maxBin) ||
-         ((iPad*kmaxTime+iTimeBin) < 0))
-       AliFatal(Form("Index outside the allowed range"
-                     " Sector=%d Row=%d Pad=%d Timebin=%d"
-                     " (Max.index=%d)",iSector,iRow,iPad,iTimeBin,maxBin));
-
-      allBins[iRow][iPad*kmaxTime+iTimeBin] = input.GetSignal();
+      //loop over pads
+      while ( input.NextChannel() ) {
+
+        Int_t iRow = input.GetRow();
+        if (iRow < 0 || iRow >= nRows)
+          AliFatal(Form("Pad-row index (%d) outside the range (%d -> %d) !",
+                        iRow, 0, nRows -1));
+        Int_t iPad = input.GetPad();
+
+        Int_t maxPad = fTPCParam->GetNPads(iSector,iRow);
+
+        if (iPad < 0 || iPad >= maxPad)
+          AliFatal(Form("Pad index (%d) outside the range (%d -> %d) !",
+                        iPad, 0, maxPad -1));
+
+        //loop over bunches
+        while ( input.NextBunch() ){
+          Int_t  startTbin    = (Int_t)input.GetStartTimeBin();
+          Int_t  bunchlength  = (Int_t)input.GetBunchLength();
+          const UShort_t *sig = input.GetSignals();
+          for (Int_t iTime = 0; iTime<bunchlength; iTime++){
+            Int_t iTimeBin=startTbin-iTime;
+            if ( iTimeBin < 0 || iTimeBin >= kmaxTime) {
+              continue;
+              //AliFatal(Form("Timebin index (%d) outside the range (%d -> %d) !",
+              //               iTimeBin, 0, kmaxTime -1));
+            }
+
+            Int_t maxBin = kmaxTime*maxPad;
+            if (((iPad*kmaxTime+iTimeBin) >= maxBin) ||
+                ((iPad*kmaxTime+iTimeBin) < 0))
+              AliFatal(Form("Index outside the allowed range"
+                            " Sector=%d Row=%d Pad=%d Timebin=%d"
+                            " (Max.index=%d)",iSector,iRow,iPad,iTimeBin,maxBin));
+            allBins[iRow][iPad*kmaxTime+iTimeBin] = sig[iTime];
+          }
+        }
+      } // End loop over altro data
+    }
 
-    } // End loop over altro data
-    
     // Now fill the digits array
     if (fDigitsArray->GetTree()==0) {
       AliFatal("Tree not set in fDigitsArray");
@@ -1009,7 +1045,6 @@ Bool_t AliTPC::Raw2SDigits(AliRawReader* rawReader){
 
     for (Int_t iRow = 0; iRow < nRows; iRow++) {
       AliDigits * dig = fDigitsArray->CreateRow(iSector,iRow);
-
       Int_t maxPad = fTPCParam->GetNPads(iSector,iRow);
       for(Int_t iPad = 0; iPad < maxPad; iPad++) {
        for(Int_t iTimeBin = 0; iTimeBin < kmaxTime; iTimeBin++) {
@@ -1017,6 +1052,7 @@ Bool_t AliTPC::Raw2SDigits(AliRawReader* rawReader){
          if (q <= 0) continue;
          q *= 16;
          dig->SetDigitFast((Short_t)q,iTimeBin,iPad);
+         ((AliSimDigits*)dig)->SetTrackIDFast( 3141593, iTimeBin,iPad,0); 
        }
       }
       fDigitsArray->StoreRow(iSector,iRow);
@@ -1029,26 +1065,42 @@ Bool_t AliTPC::Raw2SDigits(AliRawReader* rawReader){
       fDigitsArray->ClearRow(iSector,iRow);  
 
     } // end of the sector digitization
-
-    for (Int_t iRow = 0; iRow < nRows; iRow++)
-      delete [] allBins[iRow];
-
-    delete [] allBins;
-
   }
+  // get LHC clock phase from the digits tree
 
-  fLoader->WriteSDigits("OVERWRITE");
+  TParameter<float> *ph; 
+  Float_t phase;
+  TTree *digtree = fLoader->TreeD();
+  //
+  if(digtree){ // if TreeD exists
+    ph = (TParameter<float>*)digtree->GetUserInfo()->FindObject("lhcphase0");
+    phase = ph->GetVal();
+  }
+  else{ //TreeD does not exist
+    phase = 0.; 
+  }
+    //
+    // store lhc clock phase in S-digits tree
+    //
+    fLoader->TreeS()->GetUserInfo()->Add(new TParameter<float>("lhcphase0",phase));
+   //
+   fLoader->WriteSDigits("OVERWRITE");
 
   if(GetDigitsArray()) delete GetDigitsArray();
   SetDigitsArray(0x0);
 
+  // cleanup storage
+  for (Int_t iRow = 0; iRow < nRowsMax; iRow++)
+    delete [] allBins[iRow];
+  delete [] allBins;
+
   return kTRUE;
 }
 
 //______________________________________________________________________
-AliDigitizer* AliTPC::CreateDigitizer(AliRunDigitizer* manager) const
+AliDigitizer* AliTPC::CreateDigitizer(AliDigitizationInput* digInput) const
 {
-  return new AliTPCDigitizer(manager);
+  return new AliTPCDigitizer(digInput);
 }
 //__
 void AliTPC::SDigits2Digits2(Int_t /*eventnumber*/)  
@@ -1165,25 +1217,20 @@ void AliTPC::SetDefaults(){
   //
   AliRunLoader* rl = (AliRunLoader*)fLoader->GetEventFolder()->FindObject(AliRunLoader::GetRunLoaderName());
   rl->CdGAFile();
-  AliTPCParamSR *param=(AliTPCParamSR*)gDirectory->Get("75x40_100x60");
-  // if(param){
-//     AliInfo("You are using 2 pad-length geom hits with 3 pad-lenght geom digits...");
-//     delete param;
-//     param = new AliTPCParamSR();
-//   }
-//   else {
-//     param=(AliTPCParamSR*)gDirectory->Get("75x40_100x60_150x60");
-//   }
-  param = (AliTPCParamSR*)AliTPCcalibDB::Instance()->GetParameters();
+  //AliTPCParamSR *param=(AliTPCParamSR*)gDirectory->Get("75x40_100x60");
+  //gDirectory->Get("75x40_100x60");
+  AliTPCParamSR *param = (AliTPCParamSR*)AliTPCcalibDB::Instance()->GetParameters();
+  if(!param){
+    AliFatal("No TPC parameters found");
+    return;
+  }
   if (!param->IsGeoRead()){
       //
       // read transformation matrices for gGeoManager
       //
       param->ReadGeoMatrices();
     }
-  if(!param){
-    AliFatal("No TPC parameters found");
-  }
+
 
 
   AliTPCPRF2D    * prfinner   = new AliTPCPRF2D;
@@ -1199,37 +1246,65 @@ void AliTPC::SetDefaults(){
   // Use gamma 4
   //
   char  strgamma4[1000];
-  sprintf(strgamma4,"AliTPCRF1D::Gamma4((x-0.135+%f)*%f,55,160)",3*param->GetZSigma(), 1000000000*param->GetTSample()/param->GetZWidth());
+  //sprintf(strgamma4,"AliTPCRF1D::Gamma4((x-0.135+%f)*%f,55,160)",3*param->GetZSigma(), 1000000000*param->GetTSample()/param->GetZWidth());
   
+  snprintf(strgamma4,1000,"AliTPCRF1D::Gamma4((x-0.135+%f)*%f,55,160)",3*param->GetZSigma(), 1000000000*param->GetTSample()/param->GetZWidth());
   TF1 * fgamma4 = new TF1("fgamma4",strgamma4, -1,1);
   AliTPCRF1D     * rf    = new AliTPCRF1D(kTRUE,1000);
   rf->SetParam(fgamma4,param->GetZWidth(), 1,0.2);
   rf->SetOffset(3*param->GetZSigma()); 
   rf->Update();
-
   TDirectory *savedir=gDirectory;
-  TFile *f=TFile::Open("$ALICE_ROOT/TPC/AliTPCprf2d.root");
-  if (!f->IsOpen()) 
-    AliFatal("Can't open $ALICE_ROOT/TPC/AliTPCprf2d.root !");
-
-  TString s;
-  prfinner->Read("prf_07504_Gati_056068_d02");
-  //PH Set different names
-  s=prfinner->GetGRF()->GetName();
-  s+="in";
-  prfinner->GetGRF()->SetName(s.Data());
-
-  prfouter1->Read("prf_10006_Gati_047051_d03");
-  s=prfouter1->GetGRF()->GetName();
-  s+="out1";
-  prfouter1->GetGRF()->SetName(s.Data());
-
-  prfouter2->Read("prf_15006_Gati_047051_d03");  
-  s=prfouter2->GetGRF()->GetName();
-  s+="out2";
-  prfouter2->GetGRF()->SetName(s.Data());
-
-  f->Close();
+
+  if (fIsGEM==0){
+    printf ("TPC MWPC readout\n");
+    TFile *f=TFile::Open("$ALICE_ROOT/TPC/AliTPCprf2d.root");
+    if (!f->IsOpen()) 
+      AliFatal("Can't open $ALICE_ROOT/TPC/AliTPCprf2d.root !");
+    
+    TString s;
+    prfinner->Read("prf_07504_Gati_056068_d02");
+    //PH Set different names
+    s=prfinner->GetGRF()->GetName();
+    s+="in";
+    prfinner->GetGRF()->SetName(s.Data());
+    
+    prfouter1->Read("prf_10006_Gati_047051_d03");
+    s=prfouter1->GetGRF()->GetName();
+    s+="out1";
+    prfouter1->GetGRF()->SetName(s.Data());
+    
+    prfouter2->Read("prf_15006_Gati_047051_d03");  
+    s=prfouter2->GetGRF()->GetName();
+    s+="out2";
+    prfouter2->GetGRF()->SetName(s.Data());    
+    f->Close();
+  }
+
+  if (fIsGEM==1){
+    printf ("TPC GEM readout\n");
+    TFile *f=TFile::Open("$ALICE_ROOT/TPC/AliTPCprf2dGEM.root");
+    if (!f->IsOpen()) 
+      AliFatal("Can't open $ALICE_ROOT/TPC/AliTPCprf2dGEM.root !");
+    
+    TString s;
+    prfinner->Read("prf0");
+    //PH Set different names
+    s=prfinner->GetGRF()->GetName();
+    s+="in";
+    prfinner->GetGRF()->SetName(s.Data());
+    
+    prfouter1->Read("prf1");
+    s=prfouter1->GetGRF()->GetName();
+    s+="out1";
+    prfouter1->GetGRF()->SetName(s.Data());
+    
+    prfouter2->Read("prf2");  
+    s=prfouter2->GetGRF()->GetName();
+    s+="out2";
+    prfouter2->GetGRF()->SetName(s.Data());    
+    f->Close();
+  }
   savedir->cd();
 
   param->SetInnerPRF(prfinner);
@@ -1309,14 +1384,32 @@ void AliTPC::Hits2Digits(Int_t eventnumber)
   SetDigitsArray(arr);
 
   fDigitsSwitch=0; // standard digits
-
+  // here LHC clock phase
+  Float_t lhcph = 0.;
+  switch (fLHCclockPhaseSw){
+  case 0: 
+    // no phase
+    lhcph=0.;
+    break;
+  case 1:
+    // random phase
+    lhcph = (Int_t)(gRandom->Rndm()/0.25);    
+    break;
+  case 2:
+    lhcph=0.;
+    // not implemented yet
+    break;
+  }
+  // adding phase to the TreeD user info 
+  fLoader->TreeD()->GetUserInfo()->Add(new TParameter<float>("lhcphase0",lhcph));
+  //
   for(Int_t isec=0;isec<fTPCParam->GetNSector();isec++) 
     if (IsSectorActive(isec)) {
-      AliDebug(1,Form("Hits2Digits","Sector %d is active.",isec));
+      AliDebug(1,Form("Hits2DigitsSector %d is active.",isec));
       Hits2DigitsSector(isec);
     }
     else {
-      AliDebug(1,Form("Hits2Digits","Sector %d is NOT active.",isec));
+      AliDebug(1,Form("Hits2DigitsSector %d is NOT active.",isec));
     }
   
   fLoader->WriteDigits("OVERWRITE"); 
@@ -1376,6 +1469,25 @@ void AliTPC::Hits2SDigits2(Int_t eventnumber)
   fDigitsSwitch=1; // summable digits
   
     // set zero suppression to "0"
+  // here LHC clock phase
+  Float_t lhcph = 0.;
+  switch (fLHCclockPhaseSw){
+  case 0: 
+    // no phase
+    lhcph=0.;
+    break;
+  case 1:
+    // random phase
+    lhcph = (Int_t)(gRandom->Rndm()/0.25);    
+    break;
+  case 2:
+    lhcph=0.;
+    // not implemented yet
+    break;
+  }
+  // adding phase to the TreeS user info 
+  
+  fLoader->TreeS()->GetUserInfo()->Add(new TParameter<float>("lhcphase0",lhcph));
 
   fTPCParam->SetZeroSup(0);
 
@@ -1401,7 +1513,6 @@ void AliTPC::Hits2SDigits()
   //-----------------------------------------------------------
   //   summable digits - 16 bit "ADC", no noise, no saturation
   //-----------------------------------------------------------
-  if (0) fDebugStreamer = new TTreeSRedirector("TPCSimdebug.root");
 
   if (!fTPCParam->IsGeoRead()){
     //
@@ -1420,7 +1531,7 @@ void AliTPC::Hits2SDigits()
     SetActiveSectors();
     Hits2SDigits2(iEvent);
   }
-
+  
   fLoader->UnloadHits();
   fLoader->UnloadSDigits();
   if (fDebugStreamer) {
@@ -1457,13 +1568,10 @@ void AliTPC::Hits2DigitsSector(Int_t isec)
 
   Stat_t ntracks = tH->GetEntries();
 
-
-
-    TObjArray **row;
-    
     Int_t nrows =fTPCParam->GetNRow(isec);
 
-    row= new TObjArray* [nrows+2]; // 2 extra rows for cross talk
+    TObjArray **row=new TObjArray* [nrows+2]; // 2 extra rows for cross talk
+    for(Int_t j=0;j<nrows+2;j++) row[j]=0;
     
     MakeSector(isec,nrows,tH,ntracks,row);
 
@@ -1681,6 +1789,15 @@ Float_t AliTPC::GetSignal(TObjArray *p1, Int_t ntr,
   TMatrixF &signal = *m1;
   TMatrixF &total = *m2;
   //
+  // Get LHC clock phase
+  //
+  TParameter<float> *ph;
+  if(fDigitsSwitch){// s-digits
+    ph = (TParameter<float>*)fLoader->TreeS()->GetUserInfo()->FindObject("lhcphase0");  
+  }
+  else{ // normal digits
+    ph = (TParameter<float>*)fLoader->TreeD()->GetUserInfo()->FindObject("lhcphase0");
+  } 
   //  Loop over all electrons
   //
   for(Int_t nel=0; nel<nElectrons; nel++){
@@ -1688,7 +1805,8 @@ Float_t AliTPC::GetSignal(TObjArray *p1, Int_t ntr,
     Float_t aval =  v(idx+4);
     Float_t eltoadcfac=aval*fTPCParam->GetTotalNormFac(); 
     Float_t xyz[4]={v(idx+1),v(idx+2),v(idx+3),v(idx+5)};
-    Int_t n = ((AliTPCParamSR*)fTPCParam)->CalcResponseFast(xyz,fCurrentIndex,fCurrentIndex[3]);
+    Int_t n = ((AliTPCParamSR*)fTPCParam)->CalcResponseFast(xyz,fCurrentIndex,
+                                                           fCurrentIndex[3],ph->GetVal());
 
     Int_t *index = fTPCParam->GetResBin(0);  
     Float_t *weight = & (fTPCParam->GetResWeight(0));
@@ -2233,7 +2351,8 @@ void AliTPC::MakeBranch(Option_t *option)
   AliDebug(1,"");
   if (fHitType<2) return;
   char branchname[10];
-  sprintf(branchname,"%s2",GetName());  
+  //sprintf(branchname,"%s2",GetName()); 
+  snprintf(branchname,10,"%s2",GetName()); 
   //
   // Get the pointer to the header
   const char *cH = strstr(option,"H");
@@ -2270,7 +2389,8 @@ void AliTPC::SetTreeAddress2()
   
   TBranch *branch;
   char branchname[20];
-  sprintf(branchname,"%s2",GetName());
+  //sprintf(branchname,"%s2",GetName());
+  snprintf(branchname,20,"%s2",GetName());
   //
   // Branch address for hit tree
   TTree *treeH = fLoader->TreeH();
@@ -2482,7 +2602,8 @@ AliTPCParam* AliTPC::LoadTPCParam(TFile *file) {
 // and one has to decide where to store the TPC parameters
 // M.Kowalski
   char paramName[50];
-  sprintf(paramName,"75x40_100x60_150x60");
+  //sprintf(paramName,"75x40_100x60_150x60");
+  snprintf(paramName,50,"75x40_100x60_150x60");
   AliTPCParam *paramTPC=(AliTPCParam*)file->Get(paramName);
   if (paramTPC) {
     AliDebugClass(1,Form("TPC parameters %s found.",paramName));