]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TOF/AliTOFcalib.cxx
fix in TOF calibration to deal with L0-L1 orbit-crossing (negative values)
[u/mrichter/AliRoot.git] / TOF / AliTOFcalib.cxx
index 5572055686a320ed40e5823c04ab480a4f446b93..e3b9dd6c1eafedf5dcbf3127c8d0c083df1d5d22 100644 (file)
@@ -84,6 +84,7 @@ author: Chiara Zampolli, zampolli@bo.infn.it
 #include "TF1.h"
 #include "TFile.h"
 #include "TH1F.h"
+#include "TH1C.h"
 #include "TH2F.h"
 //#include "TList.h"
 //#include "TROOT.h"
@@ -120,6 +121,7 @@ author: Chiara Zampolli, zampolli@bo.infn.it
 #include "AliTOFResponseParams.h"
 #include "AliESDEvent.h"
 #include "AliESDtrack.h"
+#include "TRandom.h"
 
 class TROOT;
 class TStyle;
@@ -153,6 +155,8 @@ AliTOFcalib::AliTOFcalib():
   fT0Fill(NULL),
   fRunParams(NULL),
   fResponseParams(NULL),
+  fReadoutEfficiency(NULL),
+  fProblematic(NULL),
   fInitFlag(kFALSE),
   fRemoveMeanT0(kTRUE),
   fCalibrateTOFsignal(kTRUE),
@@ -160,6 +164,8 @@ AliTOFcalib::AliTOFcalib():
 { 
   //TOF Calibration Class ctor
   fNChannels = AliTOFGeometry::NSectors()*(2*(AliTOFGeometry::NStripC()+AliTOFGeometry::NStripB())+AliTOFGeometry::NStripA())*AliTOFGeometry::NpadZ()*AliTOFGeometry::NpadX();
+
+  gRandom->SetSeed(123456789);
 }
 //____________________________________________________________________________ 
 
@@ -186,11 +192,25 @@ AliTOFcalib::AliTOFcalib(const AliTOFcalib & calib):
   fT0Fill(NULL),
   fRunParams(NULL),
   fResponseParams(NULL),
+  fReadoutEfficiency(NULL),
+  fProblematic(NULL),
   fInitFlag(calib.fInitFlag),
   fRemoveMeanT0(calib.fRemoveMeanT0),
   fCalibrateTOFsignal(calib.fCalibrateTOFsignal),
   fCorrectTExp(calib.fCorrectTExp)
 {
+
+  fTOFCalOnline = new TObjArray(fNChannels);
+  fTOFCalOnlinePulser = new TObjArray(fNChannels);
+  fTOFCalOnlineNoise = new TObjArray(fNChannels);
+  fTOFCalOnlineHW = new TObjArray(fNChannels);
+  fTOFCalOffline = new TObjArray(fNChannels);
+  fTOFCalOnline->SetOwner();
+  fTOFCalOnlinePulser->SetOwner();
+  fTOFCalOnlineNoise->SetOwner();
+  fTOFCalOnlineHW->SetOwner();
+  fTOFCalOffline->SetOwner();
+
   //TOF Calibration Class copy ctor
   for (Int_t iarray = 0; iarray<fNChannels; iarray++){
     AliTOFChannelOnline * calChOnline = (AliTOFChannelOnline*)calib.fTOFCalOnline->At(iarray);
@@ -210,6 +230,10 @@ AliTOFcalib::AliTOFcalib(const AliTOFcalib & calib):
   if (calib.fT0Fill) fT0Fill = new AliTOFT0Fill(*calib.fT0Fill);
   if (calib.fRunParams) fRunParams = new AliTOFRunParams(*calib.fRunParams);
   if (calib.fResponseParams) fResponseParams = new AliTOFResponseParams(*calib.fResponseParams);
+  if (calib.fReadoutEfficiency) fReadoutEfficiency = new TH1F(*calib.fReadoutEfficiency);
+  if (calib.fProblematic) fProblematic = new TH1C(*calib.fProblematic);
+
+  gRandom->SetSeed(123456789);
 }
 
 //____________________________________________________________________________ 
@@ -267,6 +291,14 @@ AliTOFcalib& AliTOFcalib::operator=(const AliTOFcalib &calib)
     if (fResponseParams) *fResponseParams = *calib.fResponseParams;
     else fResponseParams = new AliTOFResponseParams(*calib.fResponseParams);
   }
+  if (calib.fReadoutEfficiency) {
+    if (fReadoutEfficiency) *fReadoutEfficiency = *calib.fReadoutEfficiency;
+    else fReadoutEfficiency = new TH1F(*calib.fReadoutEfficiency);
+  }
+  if (calib.fProblematic) {
+    if (fProblematic) *fProblematic = *calib.fProblematic;
+    else fProblematic = new TH1C(*calib.fProblematic);
+  }
   fInitFlag = calib.fInitFlag;
   fRemoveMeanT0 = calib.fRemoveMeanT0;
   fCalibrateTOFsignal = calib.fCalibrateTOFsignal;
@@ -309,6 +341,9 @@ AliTOFcalib::~AliTOFcalib()
     if (fCTPLatency) delete fCTPLatency;
     if (fT0Fill) delete fT0Fill;
     if (fRunParams) delete fRunParams;
+    if (fResponseParams) delete fResponseParams;
+    if (fReadoutEfficiency) delete fReadoutEfficiency;
+    if (fProblematic) delete fProblematic;
   }
   if (fTree!=0x0) delete fTree;
   if (fChain!=0x0) delete fChain;
@@ -366,8 +401,7 @@ void AliTOFcalib::WriteConfigMapOnCDB(const Char_t *sel, Int_t minrun, Int_t max
   SetLastRun(maxrun);
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "Config" ;  // to be consistent with TOFPreprocessor
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliDebug(2,Form("Writing TOF configuration map for online calib on CDB with run range [%i, %i] ",fFirstRun,fLastRun));
   AliCDBId id(out,fFirstRun,fLastRun);
   AliCDBMetaData *md = new AliCDBMetaData();
@@ -385,8 +419,7 @@ void AliTOFcalib::WriteConfigMapOnCDB(const Char_t *sel)
   //Write calibration parameters to the CDB with infinite validity
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "Config" ;  // to be consistent with TOFPreprocessor
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBRunRange runrange(fFirstRun,fLastRun);
   AliDebug(2,Form("Writing TOF config map for online calib on CDB with run range [%i, %i] ",runrange.GetFirstRun(),runrange.GetLastRun()));
   AliCDBId id(out,runrange);
@@ -406,8 +439,7 @@ void AliTOFcalib::WriteParOnlineDelayOnCDB(const Char_t *sel, Int_t minrun, Int_
   SetLastRun(maxrun);
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "ParOnlineDelay" ;  // to be consistent with TOFPreprocessor
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliDebug(2,Form("Writing TOF online calib obj on CDB with run range [%i, %i] ",fFirstRun,fLastRun));
   AliCDBId id(out,fFirstRun,fLastRun);
   AliCDBMetaData *md = new AliCDBMetaData();
@@ -426,8 +458,7 @@ void AliTOFcalib::WriteParOnlineStatusOnCDB(const Char_t *sel, Int_t minrun, Int
   SetLastRun(maxrun);
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "Status" ;  // to be consistent with TOFPreprocessor
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliDebug(2,Form("Writing TOF online status calib obj on CDB with run range [%i, %i] ",fFirstRun,fLastRun));
   AliCDBId id(out,fFirstRun,fLastRun);
   AliCDBMetaData *md = new AliCDBMetaData();
@@ -445,8 +476,7 @@ void AliTOFcalib::WriteParOnlineDelayOnCDB(const Char_t *sel)
   //Write calibration parameters to the CDB with infinite validity -------> new calib objs!!!!!
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "ParOnlineDelay" ;  // to be consistent with TOFPreprocessor
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBRunRange runrange(fFirstRun,fLastRun);
   AliDebug(2,Form("Writing TOF online calib obj on CDB with run range [%i, %i] ",runrange.GetFirstRun(),runrange.GetLastRun()));
   AliCDBId id(out,runrange);
@@ -465,8 +495,7 @@ void AliTOFcalib::WriteParOnlineStatusOnCDB(const Char_t *sel)
   //Write calibration parameters to the CDB with infinite validity -------> new calib objs!!!!!
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "Status" ;  // to be consistent with TOFPreprocessor
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBRunRange runrange(fFirstRun,fLastRun);
   AliDebug(2,Form("Writing TOF online status calib obj on CDB with run range [%i, %i] ",runrange.GetFirstRun(),runrange.GetLastRun()));
   AliCDBId id(out,runrange);
@@ -486,8 +515,7 @@ void AliTOFcalib::WriteParOnlineOnCDB(const Char_t *sel, Int_t minrun, Int_t max
   SetLastRun(maxrun);
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "ParOnline" ;  // to be consistent with TOFPreprocessor
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliDebug(2,Form("Writing TOF online calib obj on CDB with run range [%i, %i] ",fFirstRun,fLastRun));
   AliCDBId id(out,fFirstRun,fLastRun);
   AliCDBMetaData *md = new AliCDBMetaData();
@@ -506,8 +534,7 @@ void AliTOFcalib::WriteParOnlinePulserOnCDB(const Char_t *sel, Int_t minrun, Int
   SetLastRun(maxrun);
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "Pulser" ;  // to be consistent with TOFPreprocessor
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliDebug(2,Form("Writing TOF online calib obj from pulser on CDB with run range [%i, %i] ",fFirstRun,fLastRun));
   AliCDBId id(out,fFirstRun,fLastRun);
   AliCDBMetaData *md = new AliCDBMetaData();
@@ -526,8 +553,7 @@ void AliTOFcalib::WriteParOnlineNoiseOnCDB(const Char_t *sel, Int_t minrun, Int_
   SetLastRun(maxrun);
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "Noise" ;  // to be consistent with TOFPreprocessor
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliDebug(2,Form("Writing TOF online calib obj from noise on CDB with run range [%i, %i] ",fFirstRun,fLastRun));
   AliCDBId id(out,fFirstRun,fLastRun);
   AliCDBMetaData *md = new AliCDBMetaData();
@@ -546,8 +572,7 @@ void AliTOFcalib::WriteParOnlineHWOnCDB(const Char_t *sel, Int_t minrun, Int_t m
   SetLastRun(maxrun);
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "HW" ;  // to be consistent with TOFPreprocessor
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliDebug(2,Form("Writing TOF online calib obj from hardware on CDB with run range [%i, %i] ",fFirstRun,fLastRun));
   AliCDBId id(out,fFirstRun,fLastRun);
   AliCDBMetaData *md = new AliCDBMetaData();
@@ -565,8 +590,7 @@ void AliTOFcalib::WriteParOnlineOnCDB(const Char_t *sel)
   //Write calibration parameters to the CDB with infinite validity
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "ParOnline" ;  // to be consistent with TOFPreprocessor
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBRunRange runrange(fFirstRun,fLastRun);
   AliDebug(2,Form("Writing TOF online calib obj on CDB with run range [%i, %i] ",runrange.GetFirstRun(),runrange.GetLastRun()));
   AliCDBId id(out,runrange);
@@ -585,8 +609,7 @@ void AliTOFcalib::WriteParOnlinePulserOnCDB(const Char_t *sel)
   //Write calibration parameters from pulser to the CDB with infinite validity
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "Pulser" ;  // to be consistent with TOFPreprocessor
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBRunRange runrange(fFirstRun,fLastRun);
   AliDebug(2,Form("Writing TOF online calib obj from pulser on CDB with run range [%i, %i] ",runrange.GetFirstRun(),runrange.GetLastRun()));
   AliCDBId id(out,runrange);
@@ -605,8 +628,7 @@ void AliTOFcalib::WriteParOnlineNoiseOnCDB(const Char_t *sel)
   //Write calibration parameters from noise to the CDB with infinite validity
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "Noise" ;  // to be consistent with TOFPreprocessor
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBRunRange runrange(fFirstRun,fLastRun);
   AliDebug(2,Form("Writing TOF online calib obj from noise on CDB with run range [%i, %i] ",runrange.GetFirstRun(),runrange.GetLastRun()));
   AliCDBId id(out,runrange);
@@ -625,8 +647,7 @@ void AliTOFcalib::WriteParOnlineHWOnCDB(const Char_t *sel)
   //Write calibration parameters from hardware to the CDB with infinite validity
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "HW" ;  // to be consistent with TOFPreprocessor
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBRunRange runrange(fFirstRun,fLastRun);
   AliDebug(2,Form("Writing TOF online calib obj from harware on CDB with run range [%i, %i] ",runrange.GetFirstRun(),runrange.GetLastRun()));
   AliCDBId id(out,runrange);
@@ -647,8 +668,7 @@ void AliTOFcalib::WriteParOfflineOnCDB(const Char_t *sel, const Char_t *validity
   SetLastRun(maxrun);
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "ParOffline" ;
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliDebug(2,Form("Writing TOF offline calib obj on CDB with run range [%i, %i] ",fFirstRun,fLastRun));
   AliCDBId id(out,fFirstRun,fLastRun);
   AliCDBMetaData *md = new AliCDBMetaData();
@@ -664,8 +684,7 @@ void AliTOFcalib::WriteParOfflineOnCDB(const Char_t *sel, const Char_t *validity
   //Write calibration parameters to the CDB with infinite validity
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "ParOffline" ;
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBRunRange runrange(fFirstRun,fLastRun);
   AliDebug(2,Form("Writing TOF offline calib obj on CDB with run range [%i, %i] ",runrange.GetFirstRun(),runrange.GetLastRun()));
   AliCDBId id(out,runrange);
@@ -682,8 +701,7 @@ Bool_t AliTOFcalib::ReadConfigMapFromCDB(const Char_t *sel, Int_t nrun)
   //Read calibration parameters from the CDB
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "Config" ;
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBEntry *entry = man->Get(out,nrun);
   if (!entry) { 
     AliFatal("Exiting, no CDB object (ConfigMap) found!!!");
@@ -706,8 +724,7 @@ Bool_t AliTOFcalib::ReadParOnlineDelayFromCDB(const Char_t *sel, Int_t nrun)
   //Read calibration parameters from the CDB -------> new calib objs!!!!!
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "ParOnlineDelay" ;
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBEntry *entry = man->Get(out,nrun);
   if (!entry) { 
     AliFatal("Exiting, no CDB object (ParOnlineDelay) found!!!");
@@ -730,8 +747,7 @@ Bool_t AliTOFcalib::ReadParOnlineStatusFromCDB(const Char_t *sel, Int_t nrun)
   //Read calibration parameters from the CDB -------> new calib objs!!!!!
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "Status" ;
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBEntry *entry = man->Get(out,nrun);
   if (!entry) { 
     AliFatal("Exiting, no CDB object (Status) found!!!");
@@ -754,8 +770,7 @@ Bool_t AliTOFcalib::ReadParOnlineFromCDB(const Char_t *sel, Int_t nrun)
   //Read calibration parameters from the CDB
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "ParOnline" ;
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBEntry *entry = man->Get(out,nrun);
   if (!entry) { 
     AliFatal("Exiting, no CDB object (ParOnline) found!!!");
@@ -778,8 +793,7 @@ Bool_t AliTOFcalib::ReadParOnlinePulserFromCDB(const Char_t *sel, Int_t nrun)
   //Read calibration parameters from pulser from the CDB
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "Pulser" ;
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBEntry *entry = man->Get(out,nrun);
   if (!entry) { 
     AliFatal("Exiting, no CDB object (Pulser) found!!!");
@@ -802,8 +816,7 @@ Bool_t AliTOFcalib::ReadParOnlineNoiseFromCDB(const Char_t *sel, Int_t nrun)
   //Read calibration parameters from noise from the CDB
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "Noise" ;
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBEntry *entry = man->Get(out,nrun);
   if (!entry) { 
     AliFatal("Exiting, no CDB object (Noise) found!!!");
@@ -826,8 +839,7 @@ Bool_t AliTOFcalib::ReadParOnlineHWFromCDB(const Char_t *sel, Int_t nrun)
   //Read calibration parameters from hardware from the CDB
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "HW" ;
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBEntry *entry = man->Get(out,nrun);
   if (!entry) { 
     AliFatal("Exiting, no CDB object (HW map) found!!!");
@@ -850,8 +862,7 @@ Bool_t AliTOFcalib::ReadParOfflineFromCDB(const Char_t *sel, Int_t nrun)
   //Read calibration parameters from the CDB
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "ParOffline" ;
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBEntry *entry = man->Get(out,nrun);
   if (!entry) { 
     AliFatal("Exiting, no CDB object (ParOffline) found!!!");
@@ -875,8 +886,7 @@ void AliTOFcalib::WriteSimHistoOnCDB(const Char_t *sel, Int_t minrun, Int_t maxr
   fTOFSimToT=histo;
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "SimHisto" ;
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBMetaData *mdhisto = new AliCDBMetaData();
   mdhisto->SetResponsible("Chiara Zampolli");
   AliCDBId id(out,minrun,maxrun);
@@ -892,8 +902,7 @@ Bool_t AliTOFcalib::ReadSimHistoFromCDB(const Char_t *sel, Int_t nrun)
   // The Tot Histo
 
   const Char_t *sel1 = "SimHisto" ;
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBEntry *entry = man->Get(out,nrun);
   if (!entry) { 
     AliFatal("Exiting, no CDB object (SimHisto) found!!!");
@@ -915,20 +924,35 @@ void AliTOFcalib::WriteRecParOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun
   AliCDBMetaData *md = new AliCDBMetaData();
   md->SetResponsible("Silvia Arcelli");
   const Char_t *sel1 = "RecoParam" ;
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBId id(out,minrun,maxrun);
-  man->Put(param,id,md);
+
+  TObjArray *arr=new TObjArray(1);
+  arr->AddLast(param);
+  man->Put(arr,id,md);
+  //man->Put(param,id,md);
   delete md;
 }
 //_____________________________________________________________________________
-AliTOFRecoParam * AliTOFcalib::ReadRecParFromCDB(const Char_t *sel, Int_t nrun)
+void AliTOFcalib::WriteRecParOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun, TObjArray *arr){
+  //Write reconstruction parameters to the CDB
+
+  AliCDBManager *man = AliCDBManager::Instance();
+  AliCDBMetaData *md = new AliCDBMetaData();
+  md->SetResponsible("Silvia Arcelli");
+  const Char_t *sel1 = "RecoParam" ;
+  TString out(Form("%s/%s",sel,sel1));
+  AliCDBId id(out,minrun,maxrun);
+  man->Put(arr,id,md);
+  delete md;
+}
+//_____________________________________________________________________________
+AliTOFRecoParam * AliTOFcalib::ReadRecParFromCDB(const Char_t *sel, Int_t nrun, Int_t eventType)
 {
   //Read reconstruction parameters from the CDB
   AliCDBManager *man = AliCDBManager::Instance();
   const Char_t *sel1 = "RecoParam" ;
-  Char_t  out[100];
-  sprintf(out,"%s/%s",sel,sel1); 
+  TString out(Form("%s/%s",sel,sel1));
   AliCDBEntry *entry = man->Get(out,nrun);
   if (!entry) { 
     AliFatal("Exiting, no CDB object (RecoParam) found!!!");
@@ -939,8 +963,12 @@ AliTOFRecoParam * AliTOFcalib::ReadRecParFromCDB(const Char_t *sel, Int_t nrun)
     exit(0);  
   }  
 
-  AliTOFRecoParam *param=(AliTOFRecoParam*)entry->GetObject();
+  TObjArray *array = (TObjArray*)entry->GetObject();
+  AliTOFRecoParam *param=0x0;
+  if (eventType>=0 || eventType<array->GetEntries())
+    param=(AliTOFRecoParam*)array->At(eventType);
   return param;
+
 }
 //-----------------------------------------------------------------------------
 // Calibration methods
@@ -964,12 +992,10 @@ void AliTOFcalib::CreateTreeFromCDB(Int_t minrun, Int_t maxrun){
       AliInfo(Form("No entry found for run %i",irun));
     }
     else{
-      TTree *tree = new TTree();
-      tree = (TTree*)entry->GetObject();
+      TTree *tree = (TTree*)entry->GetObject();
       tree->SetBranchAddress("nentries",&nentries);
       tree->SetBranchAddress("TOFentries",p);      
       fTree->CopyEntries(tree);
-      delete tree;
       fNruns++;
     }
   }
@@ -991,10 +1017,10 @@ void AliTOFcalib::CreateTreeFromGrid(Int_t minrun, Int_t maxrun){
   AliInfo("connected to alien");
   TGrid::Connect("alien://");
   
-  Char_t filename[100];
+  TString filename;
   for (Int_t irun = minrun;irun<=maxrun;irun++){
-    sprintf(filename,"alien:///alice/cern.ch/user/c/czampolli/TOFCalibReference_%i.root",irun);
-    TFile *filegrid = TFile::Open(filename,"READ");
+    filename = Form("alien:///alice/cern.ch/user/c/czampolli/TOFCalibReference_%i.root",irun);
+    TFile *filegrid = TFile::Open(filename.Data(),"READ");
     TTree *tree = (TTree*)filegrid->Get("T");
     tree->SetBranchAddress("nentries",&nentries);
     tree->SetBranchAddress("TOFentries",p);      
@@ -1018,10 +1044,10 @@ void AliTOFcalib::CreateTreeFromFile(Int_t minrun, Int_t maxrun){
   fTree->SetDirectory(0);
   fTree->Branch("nentries",&nentries,"nentries/I");
   fTree->Branch("TOFentries",p,"TOFentries[nentries]/F");
-  Char_t filename[100];
+  TString filename;
   for (Int_t irun = minrun;irun<=maxrun;irun++){
-    sprintf(filename,"$ALICE_ROOT/TOF/RefData/TreeForCalib/fileout_%i.root",irun);
-    TFile *file = new TFile(filename,"READ");
+    filename = Form("$ALICE_ROOT/TOF/RefData/TreeForCalib/fileout_%i.root",irun);
+    TFile *file = new TFile(filename.Data(),"READ");
     TTree *tree = (TTree*)file->Get("T");
     tree->SetBranchAddress("nentries",&nentries);
     tree->SetBranchAddress("TOFentries",p);      
@@ -1045,10 +1071,10 @@ void AliTOFcalib::CreateChainFromGrid(Int_t minrun, Int_t maxrun){
   AliInfo("connected to alien");
   TGrid::Connect("alien://");
   
-  Char_t filename[100];
+  TString filename;
   for (Int_t irun = minrun;irun<=maxrun;irun++){
-    sprintf(filename,"alien:///alice/cern.ch/user/c/czampolli/TOFCalibReference_%i.root",irun);
-    fChain->Add(filename);
+    filename = Form("alien:///alice/cern.ch/user/c/czampolli/TOFCalibReference_%i.root",irun);
+    fChain->Add(filename.Data());
     fNruns++;    
   }
   
@@ -1406,7 +1432,7 @@ Int_t AliTOFcalib::Calibrate(Int_t nch, Int_t *ch, Option_t *optionSave, Option_
       ntracksTotal+=nentries/3;
     }
     if (ntracksTotal < MEANENTRIES) {
-      AliInfo(Form(" Too small mean number of entires in channel %i (number of tracks = %f), not calibrating channel and continuing.....",i,ntracksTotal));
+      AliInfo(Form(" Too small mean number of entires in channel %i (number of tracks = %d), not calibrating channel and continuing.....",i,ntracksTotal));
       continue;
     }
   
@@ -1522,12 +1548,11 @@ Int_t AliTOFcalib::CalibrateFromProfile(Int_t ich, Option_t *optionSave, Option_
   }
 
   if (ntracksTotal < MEANENTRIES) {  
-    AliInfo(Form(" Too small mean number of entires per channel (mean number = %f) not calibrating and exiting.....",ntracksTotal));
+    AliInfo(Form(" Too small mean number of entires per channel (mean number = %d) not calibrating and exiting.....",ntracksTotal));
     return 2;
   }
 
-  TH1F * hProf = new TH1F();
-  hProf = Profile(ich);
+  TH1F * hProf = Profile(ich);
   hProf->Fit("pol5",optionFit,"",0,4);
   TF1 * calibfunc = (TF1*)hProf->GetFunction("pol5");
   Float_t par[6];    
@@ -1621,7 +1646,7 @@ Int_t AliTOFcalib::Calibrate(Option_t *optionSave, Option_t *optionFit){
       ntracksTotal+=nentries/3;
     }
     if (ntracksTotal < MEANENTRIES) {
-      AliInfo(Form(" Too small mean number of entires in channel %i (number of tracks = %f), not calibrating channel and continuing.....",ii,ntracksTotal));
+      AliInfo(Form(" Too small mean number of entires in channel %i (number of tracks = %d), not calibrating channel and continuing.....",ii,ntracksTotal));
       continue;
     }
     Float_t meantime=0;
@@ -2001,6 +2026,44 @@ AliTOFcalib::WriteRunParamsOnCDB(const Char_t *sel , Int_t minrun, Int_t maxrun)
 
 //----------------------------------------------------------------------------
 
+void
+AliTOFcalib::WriteReadoutEfficiencyOnCDB(const Char_t *sel , Int_t minrun, Int_t maxrun)
+{
+  /*
+   * write readout efficiency on CDB 
+   */
+  
+  if (!fReadoutEfficiency) return;
+  AliCDBId id(Form("%s/ReadoutEfficiency", sel), minrun, maxrun);
+  AliCDBMetaData *md = new AliCDBMetaData();
+  md->SetResponsible("Roberto Preghenella");
+  AliCDBManager *man = AliCDBManager::Instance();
+  man->Put(fReadoutEfficiency, id, md);
+  AliDebug(2,Form("ReadoutEfficiency written on CDB with run range [%i, %i] ",minrun ,maxrun));
+  delete md;
+}
+
+//----------------------------------------------------------------------------
+
+void
+AliTOFcalib::WriteProblematicOnCDB(const Char_t *sel , Int_t minrun, Int_t maxrun)
+{
+  /*
+   * write problematic on CDB 
+   */
+  
+  if (!fProblematic) return;
+  AliCDBId id(Form("%s/Problematic", sel), minrun, maxrun);
+  AliCDBMetaData *md = new AliCDBMetaData();
+  md->SetResponsible("Roberto Preghenella");
+  AliCDBManager *man = AliCDBManager::Instance();
+  man->Put(fProblematic, id, md);
+  AliDebug(2,Form("Problematic written on CDB with run range [%i, %i] ",minrun ,maxrun));
+  delete md;
+}
+
+//----------------------------------------------------------------------------
+
 Bool_t
 AliTOFcalib::ReadDeltaBCOffsetFromCDB(const Char_t *sel , Int_t nrun)
 {
@@ -2093,6 +2156,52 @@ AliTOFcalib::ReadRunParamsFromCDB(const Char_t *sel , Int_t nrun)
 
 //----------------------------------------------------------------------------
 
+Bool_t
+AliTOFcalib::ReadReadoutEfficiencyFromCDB(const Char_t *sel , Int_t nrun)
+{
+  /*
+   * read readout efficiency from CDB
+   */
+  
+  AliCDBManager *man = AliCDBManager::Instance();
+  AliCDBEntry *entry = man->Get(Form("%s/ReadoutEfficiency", sel),nrun);
+  if (!entry) { 
+    AliFatal("No ReadoutEfficiency entry found in CDB");
+    exit(0);  
+  }
+  fReadoutEfficiency = (TH1F *)entry->GetObject();
+  if(!fReadoutEfficiency){
+    AliFatal("No ReadoutEfficiency object found in CDB entry");
+    exit(0);  
+  }  
+  return kTRUE; 
+}
+
+//----------------------------------------------------------------------------
+
+Bool_t
+AliTOFcalib::ReadProblematicFromCDB(const Char_t *sel , Int_t nrun)
+{
+  /*
+   * read problematic from CDB
+   */
+  
+  AliCDBManager *man = AliCDBManager::Instance();
+  AliCDBEntry *entry = man->Get(Form("%s/Problematic", sel),nrun);
+  if (!entry) { 
+    AliFatal("No Problematic entry found in CDB");
+    exit(0);  
+  }
+  fProblematic = (TH1C *)entry->GetObject();
+  if(!fProblematic){
+    AliFatal("No Problematic object found in CDB entry");
+    exit(0);  
+  }  
+  return kTRUE; 
+}
+
+//----------------------------------------------------------------------------
+
 Bool_t 
 AliTOFcalib::Init(Int_t run)
 {
@@ -2130,20 +2239,28 @@ AliTOFcalib::Init(Int_t run)
     AliError("cannot get \"RunParams\" object from OCDB");
     return kFALSE;
   }
+  /* get readout efficiency obj */
+  if (!ReadReadoutEfficiencyFromCDB("TOF/Calib", run)) {
+    AliError("cannot get \"ReadoutEfficiency\" object from OCDB");
+    return kFALSE;
+  }
+  /* get readout efficiency obj */
+  if (!ReadProblematicFromCDB("TOF/Calib", run)) {
+    AliError("cannot get \"Problematic\" object from OCDB");
+    return kFALSE;
+  }
   /* get response params */
-  if (fCorrectTExp) {
-    TFile *responseFile = TFile::Open("$ALICE_ROOT/TOF/data/AliTOFresponsePar.root");
-    if (!responseFile || !responseFile->IsOpen()) {
-      AliError("cannot open \"ResponseParams\" local file");
-      return kFALSE;
-    }
-    fResponseParams = (AliTOFResponseParams *)responseFile->Get("ResponseParams");
-    if (!fResponseParams) {
-      AliError("cannot get \"ResponseParams\" object from local file");
-      return kFALSE;
-    }
-    responseFile->Close();
+  TFile *responseFile = TFile::Open("$ALICE_ROOT/TOF/data/AliTOFresponsePar.root");
+  if (!responseFile || !responseFile->IsOpen()) {
+    AliError("cannot open \"ResponseParams\" local file");
+    return kFALSE;
   }
+  fResponseParams = (AliTOFResponseParams *)responseFile->Get("ResponseParams");
+  if (!fResponseParams) {
+    AliError("cannot get \"ResponseParams\" object from local file");
+    return kFALSE;
+  }
+  responseFile->Close();
 
   /* all done */
   fInitFlag = kTRUE;
@@ -2165,6 +2282,9 @@ AliTOFcalib::GetTimeCorrection(Int_t index, Double_t tot, Int_t deltaBC, Int_t l
     return 0.;
   }
 
+  /* deal with L0-L1 orbit crossing (negative values) */
+  if (l0l1 < 0) l0l1 += 3564;
+
   /* get calibration params */
   AliTOFChannelOffline *parOffline = (AliTOFChannelOffline *)fTOFCalOffline->At(index);
   Int_t deltaBCOffset = fDeltaBCOffset->GetDeltaBCOffset();
@@ -2259,7 +2379,7 @@ AliTOFcalib::CalibrateESD(AliESDEvent *event)
 //----------------------------------------------------------------------------
 
 Bool_t
-AliTOFcalib::IsChannelEnabled(Int_t index)
+AliTOFcalib::IsChannelEnabled(Int_t index, Bool_t checkEfficiency, Bool_t checkProblematic)
 {
   /*
    * is channel enabled
@@ -2274,8 +2394,133 @@ AliTOFcalib::IsChannelEnabled(Int_t index)
   if (fStatus->GetPulserStatus(index) == AliTOFChannelOnlineStatusArray::kTOFPulserBad) return kFALSE;
   if (fStatus->GetNoiseStatus(index) == AliTOFChannelOnlineStatusArray::kTOFNoiseBad) return kFALSE;
   if (fStatus->GetHWStatus(index) == AliTOFChannelOnlineStatusArray::kTOFHWBad) return kFALSE;
+  if (checkEfficiency && !IsChannelEfficient(index)) return kFALSE;
+  if (checkProblematic && IsChannelProblematic(index)) return kFALSE;
   
   /* good status */
   return kTRUE;
 
 }
+
+//----------------------------------------------------------------------------
+
+Bool_t
+AliTOFcalib::IsChannelEfficient(Int_t index)
+{
+  /*
+   * is channel efficient
+   */
+
+  if (!fInitFlag) {
+    AliError("class not yet initialized. Initialize it before.");
+    return kTRUE;
+  }
+
+  /* check efficiency */
+  if (fReadoutEfficiency->GetBinContent(index + 1) < 0.95) return kFALSE;
+  return kTRUE;
+
+}
+
+//----------------------------------------------------------------------------
+
+Bool_t
+AliTOFcalib::IsChannelProblematic(Int_t index)
+{
+  /*
+   * is channel problematic
+   */
+
+  if (!fInitFlag) {
+    AliError("class not yet initialized. Initialize it before.");
+    return kTRUE;
+  }
+
+  /* check problematic */
+  if (fProblematic->GetBinContent(index + 1) != 0) return kTRUE;
+  return kFALSE;
+
+}
+
+//----------------------------------------------------------------------------
+
+void
+AliTOFcalib::CalibrateTExp(AliESDEvent *event) const
+{
+  /*
+   * calibrate TExp
+   */
+
+  if (!fInitFlag) {
+    AliError("class not yet initialized. Initialize it before.");
+    return;
+  }
+
+  /* loop over tracks */
+  AliESDtrack *track = NULL;
+  Double_t texp[AliPID::kSPECIES];
+  for (Int_t itrk = 0; itrk < event->GetNumberOfTracks(); itrk++) {
+
+    /* get track */
+    track = event->GetTrack(itrk);
+    if (!track || !(track->GetStatus() & AliESDtrack::kTOFout)) continue;
+
+    /* get integrated times */
+    track->GetIntegratedTimes(texp);
+    /* loop over particle types and correct expected time */
+    for (Int_t ipart = 0; ipart < AliPID::kSPECIES; ipart++)
+      texp[ipart] += fResponseParams->EvalTExpCorr(ipart, track->P());
+    /* set integrated times */
+    track->SetIntegratedTimes(texp);
+
+  }
+
+}
+
+//----------------------------------------------------------------------------
+
+Double_t
+AliTOFcalib::TuneForMC(AliESDEvent *event, Double_t resolution)
+{
+  /*
+   * tune for MC
+   */
+
+  /* get vertex spread and define T0-spread */
+  Double_t diamond2 = TMath::Abs(event->GetSigma2DiamondZ());
+  Double_t t0spread = TMath::Sqrt(diamond2) / 2.99792457999999984e-02;
+  /* generate random startTime */
+  Double_t startTime = gRandom->Gaus(0., t0spread);
+  /* define extra smearing for resolution */
+  Double_t defaultResolution = 80.;
+  Double_t extraSmearing = 0.;
+  if (resolution > defaultResolution)
+    extraSmearing = TMath::Sqrt(resolution * resolution - defaultResolution * defaultResolution);
+
+  /* loop over tracks */
+  AliESDtrack *track = NULL;
+  Double_t time;
+  for (Int_t itrk = 0; itrk < event->GetNumberOfTracks(); itrk++) {
+    /* get track */
+    track = event->GetTrack(itrk);
+    if (!track) continue;
+    /* check TOF match */
+    if (!track->IsOn(AliESDtrack::kTOFout)) continue;
+    /* check if channel is enabled */
+    if (!IsChannelEnabled(track->GetTOFCalChannel())) {
+      /* reset TOF status */
+      track->ResetStatus(AliESDtrack::kTOFin);
+      track->ResetStatus(AliESDtrack::kTOFout);
+      track->ResetStatus(AliESDtrack::kTOFmismatch);
+      track->ResetStatus(AliESDtrack::kTOFpid);
+    }
+    /* get original time and manipulate it */
+    time = track->GetTOFsignal();
+    time += startTime; /* add start time */
+    time += gRandom->Gaus(0., extraSmearing); /* extra smearing */
+    time -= 25.; /* remove 25 ps to center the signal */
+    track->SetTOFsignal(time);
+  }
+
+  return startTime;
+}