]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TOF/AliTOFcalib.cxx
Fix for TOF new calib task for CPass
[u/mrichter/AliRoot.git] / TOF / AliTOFcalib.cxx
index 449c27729610acfcbd8a0953994b95ae7a86c133..e24882ed110b0c9a10b41f7028112f654ca68434 100644 (file)
@@ -118,6 +118,7 @@ author: Chiara Zampolli, zampolli@bo.infn.it
 #include "AliTOFCTPLatency.h"
 #include "AliTOFT0Fill.h"
 #include "AliTOFRunParams.h"
+#include "AliLHCClockPhase.h"
 #include "AliTOFResponseParams.h"
 #include "AliESDEvent.h"
 #include "AliESDtrack.h"
@@ -126,7 +127,7 @@ author: Chiara Zampolli, zampolli@bo.infn.it
 class TROOT;
 class TStyle;
 
-extern TROOT *gROOT;
+//extern TROOT *gROOT;
 extern TStyle *gStyle;
 
 ClassImp(AliTOFcalib)
@@ -154,13 +155,16 @@ AliTOFcalib::AliTOFcalib():
   fCTPLatency(NULL),
   fT0Fill(NULL),
   fRunParams(NULL),
+  fLHCClockPhase(NULL),
   fResponseParams(NULL),
   fReadoutEfficiency(NULL),
   fProblematic(NULL),
   fInitFlag(kFALSE),
   fRemoveMeanT0(kTRUE),
+  fUseLHCClockPhase(kFALSE),
   fCalibrateTOFsignal(kTRUE),
-  fCorrectTExp(kFALSE)
+  fCorrectTExp(kFALSE),
+  fRunParamsSpecificVersion(-1)
 { 
   //TOF Calibration Class ctor
   fNChannels = AliTOFGeometry::NSectors()*(2*(AliTOFGeometry::NStripC()+AliTOFGeometry::NStripB())+AliTOFGeometry::NStripA())*AliTOFGeometry::NpadZ()*AliTOFGeometry::NpadX();
@@ -191,13 +195,16 @@ AliTOFcalib::AliTOFcalib(const AliTOFcalib & calib):
   fCTPLatency(NULL),
   fT0Fill(NULL),
   fRunParams(NULL),
+  fLHCClockPhase(NULL),
   fResponseParams(NULL),
   fReadoutEfficiency(NULL),
   fProblematic(NULL),
   fInitFlag(calib.fInitFlag),
   fRemoveMeanT0(calib.fRemoveMeanT0),
+  fUseLHCClockPhase(calib.fUseLHCClockPhase),
   fCalibrateTOFsignal(calib.fCalibrateTOFsignal),
-  fCorrectTExp(calib.fCorrectTExp)
+  fCorrectTExp(calib.fCorrectTExp),
+  fRunParamsSpecificVersion(calib.fRunParamsSpecificVersion)
 {
 
   fTOFCalOnline = new TObjArray(fNChannels);
@@ -301,8 +308,10 @@ AliTOFcalib& AliTOFcalib::operator=(const AliTOFcalib &calib)
   }
   fInitFlag = calib.fInitFlag;
   fRemoveMeanT0 = calib.fRemoveMeanT0;
+  fUseLHCClockPhase = calib.fUseLHCClockPhase;
   fCalibrateTOFsignal = calib.fCalibrateTOFsignal;
   fCorrectTExp = calib.fCorrectTExp;
+  fRunParamsSpecificVersion = calib.fRunParamsSpecificVersion;
 
   return *this;
 }
@@ -1156,7 +1165,9 @@ Int_t AliTOFcalib::Calibrate(Int_t ichmin, Int_t ichmax, Option_t *optionSave, O
     }
   }
   nusefulbins = FindBins(hToT,&binsProfile[0]);
-  meantime/=ntracksTotal;
+  if (ntracksTotal != 0){
+         meantime/=ntracksTotal;
+  }
   AliDebug(2, Form("meantime = %f",meantime));
   
   for (Int_t j=1;j<=nusefulbins;j++) {
@@ -1748,9 +1759,9 @@ TH1F* AliTOFcalib::Profile(Int_t ich)
   Float_t minToT = 0; //ns
   Float_t maxToT = 5.; //ns
   Float_t deltaToT = (maxToT-minToT)/knbinToT;
-  Double_t mTime[knbinToT+1],mToT[knbinToT+1],meanTime[knbinToT+1], meanTime2[knbinToT+1],vToT[knbinToT+1], vToT2[knbinToT+1],meanToT[knbinToT+1],meanToT2[knbinToT+1],vTime[knbinToT+1],vTime2[knbinToT+1],xlow[knbinToT+1],sigmaTime[knbinToT+1];
+  Double_t mTime[knbinToT+1],mToT[knbinToT+1],meanTime[knbinToT+1], meanTime2[knbinToT+1],vToT[knbinToT+1], vToT2[knbinToT+1],meanToT[knbinToT+1],meanToT2[knbinToT+1],vTime[knbinToT+1],vTime2[knbinToT+1],sigmaTime[knbinToT+1];
   Int_t n[knbinToT+1], nentrx[knbinToT+1];
-  Double_t sigmaToT[knbinToT+1];
+  //Double_t xlow[knbinToT+1],sigmaToT[knbinToT+1];  // not used for the time being
   for (Int_t i = 0; i < knbinToT+1 ; i++){
     mTime[i]=0;
     mToT[i]=0;
@@ -1763,9 +1774,9 @@ TH1F* AliTOFcalib::Profile(Int_t ich)
     meanToT2[i]=0;
     vTime[i]=0;
     vTime2[i]=0;
-    xlow[i]=0;
+    //xlow[i]=0;
     sigmaTime[i]=0;
-    sigmaToT[i]=0;
+    //sigmaToT[i]=0;
     n[i]=0;
     nentrx[i]=0;
   }
@@ -1821,12 +1832,12 @@ TH1F* AliTOFcalib::Profile(Int_t ich)
           *(meanToT2[usefulBins]-meanToT[usefulBins]
             *meanToT[usefulBins]/n[usefulBins]))< 0) {
        AliError(" too small radical" );
-       sigmaToT[usefulBins]=0;
+       //sigmaToT[usefulBins]=0;
       }
       else{       
-       sigmaToT[usefulBins]=TMath::Sqrt(1./n[usefulBins]/n[usefulBins]
-                            *(meanToT2[usefulBins]-meanToT[usefulBins]
-                            *meanToT[usefulBins]/n[usefulBins]));
+       //sigmaToT[usefulBins]=TMath::Sqrt(1./n[usefulBins]/n[usefulBins]
+       //                   *(meanToT2[usefulBins]-meanToT[usefulBins]
+       //                   *meanToT[usefulBins]/n[usefulBins]));
       }
       usefulBins++;
     }
@@ -2141,7 +2152,7 @@ AliTOFcalib::ReadRunParamsFromCDB(const Char_t *sel , Int_t nrun)
    */
   
   AliCDBManager *man = AliCDBManager::Instance();
-  AliCDBEntry *entry = man->Get(Form("%s/RunParams", sel),nrun);
+  AliCDBEntry *entry = man->Get(Form("%s/RunParams", sel),nrun, fRunParamsSpecificVersion);
   if (!entry) { 
     AliFatal("No RunParams entry found in CDB");
     exit(0);  
@@ -2156,6 +2167,29 @@ AliTOFcalib::ReadRunParamsFromCDB(const Char_t *sel , Int_t nrun)
 
 //----------------------------------------------------------------------------
 
+Bool_t
+AliTOFcalib::ReadLHCClockPhaseFromCDB(const Char_t *sel , Int_t nrun)
+{
+  /*
+   * read LHC clock-phase from CDB
+   */
+  
+  AliCDBManager *man = AliCDBManager::Instance();
+  AliCDBEntry *entry = man->Get(Form("%s/LHCClockPhase", sel),nrun);
+  if (!entry) { 
+    AliFatal("No LHCClockPhase entry found in CDB");
+    exit(0);  
+  }
+  fLHCClockPhase =(AliLHCClockPhase *)entry->GetObject();
+  if(!fRunParams){
+    AliFatal("No LHCClockPhase object found in CDB entry");
+    exit(0);  
+  }  
+  return kTRUE; 
+}
+
+//----------------------------------------------------------------------------
+
 Bool_t
 AliTOFcalib::ReadReadoutEfficiencyFromCDB(const Char_t *sel , Int_t nrun)
 {
@@ -2239,6 +2273,11 @@ AliTOFcalib::Init(Int_t run)
     AliError("cannot get \"RunParams\" object from OCDB");
     return kFALSE;
   }
+  /* get LHC clock-phase obj */
+  if (!ReadLHCClockPhaseFromCDB("GRP/Calib", run)) {
+    AliError("cannot get \"LHCClockPhase\" object from OCDB");
+    return kFALSE;
+  }
   /* get readout efficiency obj */
   if (!ReadReadoutEfficiencyFromCDB("TOF/Calib", run)) {
     AliError("cannot get \"ReadoutEfficiency\" object from OCDB");
@@ -2262,6 +2301,13 @@ AliTOFcalib::Init(Int_t run)
   }
   responseFile->Close();
 
+  /* check whether to use the clock phase */
+  if (fRunParams->GetUseLHCClockPhase())
+    fUseLHCClockPhase = kTRUE;
+  if (fUseLHCClockPhase)
+    AliInfo("calibration using BPTX LHC clock-phase");
+
   /* all done */
   fInitFlag = kTRUE;
   return kTRUE;
@@ -2282,15 +2328,21 @@ 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();
   Float_t ctpLatency = fCTPLatency->GetCTPLatency();
   Float_t tdcLatencyWindow = fStatus->GetLatencyWindow(index) * 1.e3;
   Float_t timezero = fRunParams->EvalT0(timestamp);
+  Float_t clockphase = fLHCClockPhase->GetPhase(timestamp);
   /* check whether to remove mean T0.
    * useful when one wants to compute mean T0 */
   if (!fRemoveMeanT0) timezero = 0.;
+  /* check whether to use the clock phase */
+  if (fUseLHCClockPhase) timezero -= 1.e3 * clockphase;
 
   /* compute correction */
   Double_t corr = 0.;
@@ -2331,46 +2383,70 @@ AliTOFcalib::CalibrateESD(AliESDEvent *event)
     return;
   }
 
-  /* loop over tracks */
-  AliESDtrack *track = NULL;
   Int_t index, l0l1, deltaBC;
-  Double_t time, tot, corr, texp[AliPID::kSPECIES];
+  Double_t time, tot, corr;
   UInt_t timestamp = event->GetTimeStamp();
-  for (Int_t itrk = 0; itrk < event->GetNumberOfTracks(); itrk++) {
 
-    /* get track */
-    track = event->GetTrack(itrk);
-    if (!track || !(track->GetStatus() & AliESDtrack::kTOFout)) continue;
-
-    /* calibrate TOF signal */
-    if (fCalibrateTOFsignal) {
-      /* get info */
-      index = track->GetTOFCalChannel();
-      time = track->GetTOFsignalRaw();
-      tot = track->GetTOFsignalToT();
-      l0l1 = track->GetTOFL0L1();
-      deltaBC = track->GetTOFDeltaBC();
-      /* get correction */
-      corr = GetTimeCorrection(index, tot, deltaBC, l0l1, timestamp);
-      /* apply correction */
-      time -= corr;
-      /* set new TOF signal */
-      track->SetTOFsignal(time);
+  // calibrating TOF hits
+
+  AliESDTOFHit* hit = NULL;
+  AliESDtrack* track = NULL;
+  TClonesArray* esdTOFhits = event->GetESDTOFHits();
+  if (esdTOFhits) { // new TOF data structure
+    for (Int_t ihit = 0; ihit < esdTOFhits->GetEntriesFast(); ihit++) {
+      
+      /* get track */
+      hit = (AliESDTOFHit*)esdTOFhits->At(ihit);
+      //if (!track || !(track->GetStatus() & AliESDtrack::kTOFout)) continue;
+      if (!hit) continue;
+      
+      /* calibrate TOF signal */
+      if (fCalibrateTOFsignal) {
+       /* get info */
+       index = hit->GetTOFchannel();
+       time = hit->GetTimeRaw();
+       tot = hit->GetTOT();
+       l0l1 = hit->GetL0L1Latency();
+       deltaBC = hit->GetDeltaBC();
+       /* get correction */
+       corr = GetTimeCorrection(index, tot, deltaBC, l0l1, timestamp);
+       /* apply correction */
+       time -= corr;
+       /* set new TOF signal */
+       hit->SetTime(time);
+      }
+      
     }
+  }
+  else { // old TOF data structure
 
-    /* correct expected time */
-    if (fCorrectTExp) {
-      /* 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);
+    for (Int_t itrk = 0; itrk < event->GetNumberOfTracks(); itrk++) {
+   
+      /* get track */
+      track = event->GetTrack(itrk);
+      if (!track || !(track->GetStatus() & AliESDtrack::kTOFout)) continue;
+      
+      /* calibrate TOF signal */
+      if (fCalibrateTOFsignal) {
+       /* get info */
+       index = track->GetTOFCalChannel();
+       time = track->GetTOFsignalRaw();
+       tot = track->GetTOFsignalToT();
+       l0l1 = track->GetTOFL0L1();
+       deltaBC = track->GetTOFDeltaBC();
+       /* get correction */
+       corr = GetTimeCorrection(index, tot, deltaBC, l0l1, timestamp);
+       /* apply correction */
+       time -= corr;
+       /* set new TOF signal */
+       track->SetTOFsignal(time);
+      }
     }
-
+    
+    if (fCorrectTExp) 
+      CalibrateTExp(event);
   }
-
+  
 }
 
 //----------------------------------------------------------------------------
@@ -2448,6 +2524,13 @@ AliTOFcalib::CalibrateTExp(AliESDEvent *event) const
    * calibrate TExp
    */
 
+  /* check if new TOF data structure, crash in case */
+  TClonesArray* esdTOFhits = event->GetESDTOFHits();
+  if (esdTOFhits) { 
+    AliFatal("This method is DEPRECATED, doing NOTHING");
+    return ;
+  }
+
   if (!fInitFlag) {
     AliError("class not yet initialized. Initialize it before.");
     return;
@@ -2455,7 +2538,7 @@ AliTOFcalib::CalibrateTExp(AliESDEvent *event) const
 
   /* loop over tracks */
   AliESDtrack *track = NULL;
-  Double_t texp[AliPID::kSPECIES];
+  Double_t texp[AliPID::kSPECIESC];
   for (Int_t itrk = 0; itrk < event->GetNumberOfTracks(); itrk++) {
 
     /* get track */
@@ -2463,7 +2546,7 @@ AliTOFcalib::CalibrateTExp(AliESDEvent *event) const
     if (!track || !(track->GetStatus() & AliESDtrack::kTOFout)) continue;
 
     /* get integrated times */
-    track->GetIntegratedTimes(texp);
+    track->GetIntegratedTimes(texp,AliPID::kSPECIESC);
     /* loop over particle types and correct expected time */
     for (Int_t ipart = 0; ipart < AliPID::kSPECIES; ipart++)
       texp[ipart] += fResponseParams->EvalTExpCorr(ipart, track->P());
@@ -2483,6 +2566,13 @@ AliTOFcalib::TuneForMC(AliESDEvent *event, Double_t resolution)
    * tune for MC
    */
 
+  /* check if new TOF data structure, crash in case */
+  TClonesArray* esdTOFhits = event->GetESDTOFHits();
+  if (esdTOFhits) { 
+    AliFatal("This method is DEPRECATED, doing NOTHING");
+    return 0.;
+  }
+
   /* get vertex spread and define T0-spread */
   Double_t diamond2 = TMath::Abs(event->GetSigma2DiamondZ());
   Double_t t0spread = TMath::Sqrt(diamond2) / 2.99792457999999984e-02;