]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG3/muondep/AliAnalysisTaskMuonTrackingEff.cxx
set arrays to 0 after delete to avoid crash in Pb reconstruction - Ruben
[u/mrichter/AliRoot.git] / PWG3 / muondep / AliAnalysisTaskMuonTrackingEff.cxx
index a43111c2e1775843df8a7cec373320ac6e93cb8c..808f33603f7df924b6e3857b65f288ca0d70034d 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
+/* $Id$ */
+
 //Class to calculate the intrinsic efficiency of the detection elements of the
 //MUON tracking chambers in function of the position in the detection element.
+//WOrk on ESD only
 //Author:  Nicolas LE BRIS - SUBATECH Nantes
+// Modified by Matthieu LENHARDT - SUBATECH Nantes
+// Modified by Antoine LARDEUX - SUBATECH Nantes
 
-
-//ROOT includes
-#include <TROOT.h>
-#include <TSystem.h>
-#include <TChain.h>
-#include <TFile.h>
+// ROOT includes
 #include <TList.h>
-#include <TClonesArray.h>
-#include <TH2F.h>
-#include <TH1F.h>
-#include <TMath.h>
-#include "Riostream.h"
-
-//ANALYSIS includes
-#include "AliAnalysisManager.h"
-#include "AliAnalysisTask.h"
+#include <TH3F.h>
+#include <THnSparse.h>
+#include <TObjArray.h>
+#include <TGeoGlobalMagField.h>
+#include <TVector3.h>
 
-//STEER includes
+// STEER includes
 #include "AliESDEvent.h"
 #include "AliESDMuonTrack.h"
-#include "AliESDInputHandler.h"
-#include "AliMagF.h"
-#include "AliTracker.h"
-#include "AliAnalysisManager.h"
+#include "AliGeomManager.h"
+#include "AliCDBManager.h"
+#include "AliESDVZERO.h"
 
-//PWG3/muon includes
+// ANALYSIS includes
+#include "AliInputEventHandler.h"
+#include "AliAnalysisManager.h"
 #include "AliAnalysisTaskMuonTrackingEff.h"
-#include "AliCheckMuonDetEltResponse.h"
+#include "AliCentrality.h"
+#include "AliVVertex.h"
 
 //MUON includes
+#include "AliMUONCDB.h"
+#include "AliMUONESDInterface.h"
 #include "AliMUONGeometryTransformer.h"
+#include "AliMUONTrack.h"
+#include "AliMUONTrackParam.h"
 #include "AliMUONTrackExtrap.h"
+#include "AliMUONVCluster.h"
+#include "AliMUONConstants.h"
+
+//include MUON/mapping:
+#include "AliMpDEManager.h"
+#include "AliMpSegmentation.h"
+#include "AliMpVSegmentation.h"
+#include "AliMpPad.h"
 
 ClassImp(AliAnalysisTaskMuonTrackingEff)
 
-const Int_t AliAnalysisTaskMuonTrackingEff::fTotNbrOfDetectionElt  = 156;
-const Int_t AliAnalysisTaskMuonTrackingEff::fTotNbrOfChamber  = 10;
+const Int_t AliAnalysisTaskMuonTrackingEff::fgkNbrOfDetectionElt[10] = {4, 4, 4, 4, 18, 18, 26, 26, 26, 26};
+const Int_t AliAnalysisTaskMuonTrackingEff::fgkOffset = 100;
 
 //________________________________________________________________________
-AliAnalysisTaskMuonTrackingEff::AliAnalysisTaskMuonTrackingEff()
-  :
-  AliAnalysisTask(),
+AliAnalysisTaskMuonTrackingEff::AliAnalysisTaskMuonTrackingEff() :
+  AliAnalysisTaskSE(),
+  fOCDBLoaded(kFALSE),
+  fOCDBpath(""),
+  fMatchTrig(kFALSE),
+  fApplyAccCut(kFALSE),
+  fPDCACut(-1.),
+  fChi2Cut(-1.),
+  fPtCut(-1.),
+  fUseMCLabel(kFALSE),
+  fCurrentCentrality(0.),
+  fCurrentTrack(0x0),
   fTransformer(0x0),
-  fESD(0x0),
-  fDetEltEffHistList(0x0),
   fDetEltTDHistList(0x0),
   fDetEltTTHistList(0x0),
-  fChamberEffHistList(0x0),
+  fDetEltSDHistList(0x0),
   fChamberTDHistList(0x0),
   fChamberTTHistList(0x0),
-  fChamberEff(0x0),
-  fIsCosmicData(kFALSE)
+  fChamberSDHistList(0x0),
+  fExtraHistList(0x0)
 {
-/// Default constructor
+  /// Default constructor
 }
+
 //________________________________________________________________________
-AliAnalysisTaskMuonTrackingEff::AliAnalysisTaskMuonTrackingEff(const AliAnalysisTaskMuonTrackingEff& src)
-  :
-  AliAnalysisTask(src),
+AliAnalysisTaskMuonTrackingEff::AliAnalysisTaskMuonTrackingEff(TString name) :
+  AliAnalysisTaskSE(name),
+  fOCDBLoaded(kFALSE),
+  fOCDBpath("raw://"),
+  fMatchTrig(kFALSE),
+  fApplyAccCut(kFALSE),
+  fPDCACut(-1.),
+  fChi2Cut(-1.),
+  fPtCut(-1.),
+  fUseMCLabel(kFALSE),
+  fCurrentCentrality(100.),
+  fCurrentTrack(0x0),
   fTransformer(0x0),
-  fESD(0x0),
-  fDetEltEffHistList(0x0),
   fDetEltTDHistList(0x0),
   fDetEltTTHistList(0x0),
-  fChamberEffHistList(0x0),
+  fDetEltSDHistList(0x0),
   fChamberTDHistList(0x0),
   fChamberTTHistList(0x0),
-  fChamberEff(0x0),
-  fIsCosmicData(kFALSE)
+  fChamberSDHistList(0x0),
+  fExtraHistList(0x0)
 {
-  /// copy ctor
-  src.Copy(*this);
+  /// Constructor
+  
+  // Output slots 0 to 5 writes into a TClonesArray:
+  DefineOutput(1, TList::Class());
+  DefineOutput(2, TList::Class());
+  DefineOutput(3, TList::Class());
+  DefineOutput(4, TList::Class());
+  DefineOutput(5, TList::Class());
+  DefineOutput(6, TList::Class());
+  DefineOutput(7, TList::Class());
 }
+
 //________________________________________________________________________
-AliAnalysisTaskMuonTrackingEff& AliAnalysisTaskMuonTrackingEff::operator=(const AliAnalysisTaskMuonTrackingEff& src)
+AliAnalysisTaskMuonTrackingEff::~AliAnalysisTaskMuonTrackingEff()
 {
-  /// assignement operator
-  if ( this != &src ) 
-  {
-    src.Copy(*this);
+  /// Destructor
+  if (!AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
+    delete fDetEltTDHistList;
+    delete fDetEltTTHistList;
+    delete fDetEltSDHistList;
+    delete fChamberTDHistList;
+    delete fChamberTTHistList;
+    delete fChamberSDHistList;
+    delete fExtraHistList;
   }
-  return *this;
+  delete fTransformer;
 }
 
 //________________________________________________________________________
-AliAnalysisTaskMuonTrackingEff::AliAnalysisTaskMuonTrackingEff(const char* name,
-                                                              const AliMUONGeometryTransformer* transformer,
-                                                              Bool_t isCosmic)
-  :
-  AliAnalysisTask(name, "AnalysisTaskESD"),
-  fTransformer(0x0),
-  fESD(0x0),
-  fDetEltEffHistList(0x0),
-  fDetEltTDHistList(0x0),
-  fDetEltTTHistList(0x0),
-  fChamberEffHistList(0x0),
-  fChamberTDHistList(0x0),
-  fChamberTTHistList(0x0),
-  fChamberEff(0x0),
-  fIsCosmicData(kFALSE)
+void AliAnalysisTaskMuonTrackingEff::NotifyRun()
 {
-//Constructor
-//-----------
-    
-  fIsCosmicData = isCosmic;
-  fTransformer = transformer;
-
-//Define detection element efficiency histograms
-//----------------------------------------------
-
-    fDetEltEffHistList = new TClonesArray("TH2F",fTotNbrOfDetectionElt + 3); //!<+3 for: 1.the total efficiency chamber by chamber histogram.
-                                                                //!<        2.the total number of tracks detected by the tracking system.
-                                                                //!<        3.the number of track used for the efficiency calculation chamber by chamber
-    fDetEltTDHistList  = new TClonesArray("TH2F",fTotNbrOfDetectionElt + 1);
-    fDetEltTTHistList  = new TClonesArray("TH2F",fTotNbrOfDetectionElt + 1);
-
-
-    fChamberEffHistList = new TClonesArray("TH1F", fTotNbrOfChamber + 3);
-    fChamberTDHistList = new TClonesArray("TH1F", fTotNbrOfChamber + 1);
-    fChamberTTHistList = new TClonesArray("TH1F", fTotNbrOfChamber + 1);
-
-
+  /// Load the OCDB and the Geometry
+  
+  // Load it only once
+  if (fOCDBLoaded) return;
+  
+  // OCDB
+  AliCDBManager* man = AliCDBManager::Instance();
+  if (man->IsDefaultStorageSet()) printf("EfficiencyTask: CDB default storage already set!\n");
+  else man->SetDefaultStorage(fOCDBpath.Data());
+  if (man->GetRun() > -1) printf("EfficiencyTask: run number already set!\n");
+  else man->SetRun(fCurrentRunNumber);
+  
+  // Geometry
+  if (!AliGeomManager::GetGeometry()) {
+    AliGeomManager::LoadGeometry();
+    if (!AliGeomManager::GetGeometry()) return;  
+    if (!AliGeomManager::ApplyAlignObjsFromCDB("MUON")) return;
+  }
+  fTransformer = new AliMUONGeometryTransformer();
+  fTransformer->LoadGeometryData();
+  
+  // Magnetic field for track extrapolation
+  if (!TGeoGlobalMagField::Instance()->GetField()) {
+    if (!AliMUONCDB::LoadField()) return;
+  }
+  
+  // Mapping
+  if (!AliMpSegmentation::Instance(kFALSE)) {
+    if (!AliMUONCDB::LoadMapping(kTRUE)) return;
+  }
+  
+  // RecoParam for refitting
+  if (!AliMUONESDInterface::GetTracker()) {
+    AliMUONRecoParam* recoParam = AliMUONCDB::LoadRecoParam();
+    if (!recoParam) return;
+    AliMUONESDInterface::ResetTracker(recoParam);
+  }
+  
+  fOCDBLoaded = kTRUE;
+}
 
-    for (Int_t i = 0; i<fTotNbrOfDetectionElt; ++i)
+//________________________________________________________________________
+void AliAnalysisTaskMuonTrackingEff::UserCreateOutputObjects()
+{
+  /// Define efficiency histograms
+  
+  fDetEltTDHistList  = new TList();
+  fDetEltTDHistList->SetOwner();
+  fDetEltTTHistList  = new TList();
+  fDetEltTTHistList->SetOwner();
+  fDetEltSDHistList  = new TList();
+  fDetEltSDHistList->SetOwner();
+  fChamberTDHistList = new TList();
+  fChamberTDHistList->SetOwner();
+  fChamberTTHistList = new TList();
+  fChamberTTHistList->SetOwner();
+  fChamberSDHistList = new TList();
+  fChamberSDHistList->SetOwner();
+  fExtraHistList = new TList();
+  fExtraHistList->SetOwner();
+  
+  THnSparse *hn = 0x0;
+  TH3F *h3 = 0x0;
+  TString histName, histTitle;
+  
+  // centrality bins
+  Int_t nCentBins = 22;
+  Double_t centRange[2] = {-5., 105.};
+  
+  // prepare binning for THnSparse
+  // 1: Ch or DE Id
+  // 2: centrality
+  // 3: pt
+  // 4: y
+  // 5: sign
+  const Int_t nDims = 5;
+  Int_t nBins[nDims] = {0., nCentBins, 20, 15, 2};
+  Double_t xMin[nDims] = {0., centRange[0], 0., -4., -2.};
+  Double_t xMax[nDims] = {0., centRange[1], 20., -2.5, 2.};
+  
+  // global index of DE in the lists
+  Int_t iDEGlobal = 0;
+  
+  for (Int_t iCh = 0; iCh < 10; iCh++)
+  {
+    // histograms per chamber
+    nBins[0] = fgkNbrOfDetectionElt[iCh];
+    xMin[0] = 0.; xMax[0] = static_cast<Double_t>(fgkNbrOfDetectionElt[iCh]);
+    histTitle.Form("ChamberNbr %d", iCh+1);
+    histName.Form("TD_ChamberNbr%d", iCh+1);
+    hn = new THnSparseT<TArrayF>(histName, histTitle, nDims, nBins, xMin, xMax);
+    fChamberTDHistList->AddAt(hn, iCh);
+    histName.Form("TT_ChamberNbr%d",iCh+1);
+    hn = new THnSparseT<TArrayF>(histName, histTitle, nDims, nBins, xMin, xMax);
+    fChamberTTHistList->AddAt(hn, iCh);
+    histName.Form("SD_ChamberNbr%d", iCh+1);
+    hn = new THnSparseT<TArrayF>(histName, histTitle, nDims, nBins, xMin, xMax);
+    fChamberSDHistList->AddAt(hn, iCh);
+    
+    // histograms per DE
+    for (Int_t iDE = 0; iDE < fgkNbrOfDetectionElt[iCh]; iDE++)
     {
-      Int_t iDetElt = 0;
-      if      (i<16) iDetElt = 100*(i/4+1)       + i -  int(i/4)*4;
-      else if (i<52) iDetElt = 100*((i-16)/18+5) + i - (int((i-16)/18)*18 + 16);
-      if      (i>51) iDetElt = 100*((i-52)/26+7) + i - (int((i-52)/26)*26 + 52); 
-
-      Char_t histName[255]; 
-      Char_t histTitle[255];
-
-      sprintf(histName,"Eff_detEltNbr%d",iDetElt);
-      sprintf(histTitle,"detEltNbr %d",iDetElt);
-      if(i<16) new((*fDetEltEffHistList)[i]) TH2F(histName,histTitle,12,-10,110,12,-10,110);//!<Stations 1 & 2.
-      else     new((*fDetEltEffHistList)[i]) TH2F(histName,histTitle,28,-140,140,8,-40,40); //!<Stations 3 -> 5.
-      
-      sprintf(histName,"TD_detEltNbr%d",iDetElt);
-      if(i<16) new((*fDetEltTDHistList)[i]) TH2F(histName,histTitle,12,-10,110,12,-10,110);//!<Stations 1 & 2.
-      else     new((*fDetEltTDHistList)[i]) TH2F(histName,histTitle,28,-140,140,8,-40,40); //!<Stations 3 -> 5.
-
-      sprintf(histName,"TT_detEltNbr%d",iDetElt);
-      if(i<16) new((*fDetEltTTHistList)[i]) TH2F(histName,histTitle,12,-10,110,12,-10,110); //!<Stations 1 & 2.
-      else     new((*fDetEltTTHistList)[i]) TH2F(histName,histTitle,28,-140,140,8,-40,40);  //!<Stations 3 -> 5.
-      
-      ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetXaxis() -> SetTitle("X (cm)");
-      ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetYaxis() -> SetTitle("Y (cm)");
-      ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetZaxis() -> SetTitle("Efficiency (%)");  
-      ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetXaxis() -> SetTitleOffset(1.8);
-      ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetYaxis() -> SetTitleOffset(1.8); 
-      ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetZaxis() -> SetTitleOffset(1.2); 
-      ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> SetOption("LEGO");
-    }
-
-    for (Int_t j = 0; j < fTotNbrOfChamber; j++)
-      {
-       Char_t histName[255]; 
-       Char_t histTitle[255];
-
-
-       sprintf(histName,"Eff_ChamberNbr%d",j+1);
-       sprintf(histTitle,"ChamberNbr %d",j+1);
-       if (j<4) new ((*fChamberEffHistList)[j]) TH1F(histName, histTitle, 4, 0.0, 4.0);
-       else if (j<6) new ((*fChamberEffHistList)[j]) TH1F(histName, histTitle, 18, 0.0, 18.0);
-       if (j>=6) new ((*fChamberEffHistList)[j]) TH1F(histName, histTitle, 26, 0.0, 26.0);
-
-       sprintf(histName,"TD_ChamberNbr%d",j+1);
-       if (j<4) new ((*fChamberTDHistList)[j]) TH1F(histName, histTitle, 4, 0.0, 4.0);
-       else if (j<6) new ((*fChamberTDHistList)[j]) TH1F(histName, histTitle, 18, 0.0, 18.0);
-       if (j>=6) new ((*fChamberTDHistList)[j]) TH1F(histName, histTitle, 26, 0.0, 26.0);
-
-       sprintf(histName,"TT_ChamberNbr%d",j+1);
-       if (j<4) new ((*fChamberTTHistList)[j]) TH1F(histName, histTitle, 4, 0.0, 4.0);
-       else if (j<6) new ((*fChamberTTHistList)[j]) TH1F(histName, histTitle, 18, 0.0, 18.0);
-       if (j>=6) new ((*fChamberTTHistList)[j]) TH1F(histName, histTitle, 26, 0.0, 26.0);
-
-       ((TH1F*) fChamberEffHistList->UncheckedAt(j)) -> GetXaxis() -> SetTitle("DetElement");
-       ((TH1F*) fChamberEffHistList->UncheckedAt(j)) -> GetYaxis() -> SetTitle("Efficiency (%)");
-       ((TH1F*) fChamberEffHistList->UncheckedAt(j)) -> GetXaxis() -> SetTitleOffset(1.8);
-       ((TH1F*) fChamberEffHistList->UncheckedAt(j)) -> GetYaxis() -> SetTitleOffset(1.8); 
-       ((TH1F*) fChamberEffHistList->UncheckedAt(j)) -> Sumw2();       
+      Int_t deId = FromLocalId2DetElt(iCh, iDE);
+      histTitle.Form("detEltNbr %d",deId);
+      if(iCh < 4)
+      {// chambers 1 -> 4
+       histName.Form("TD_detEltNbr%d",deId);
+       h3 = new TH3F(histName, histTitle, 12, -10.0 , 110.0, 12, -10.0, 110.0, nCentBins, centRange[0], centRange[1]);
+       fDetEltTDHistList->AddAt(h3, iDEGlobal);
+       histName.Form("TT_detEltNbr%d",deId);
+       h3 = new TH3F(histName, histTitle, 12, -10.0 , 110.0, 12, -10.0, 110.0, nCentBins, centRange[0], centRange[1]);
+       fDetEltTTHistList->AddAt(h3, iDEGlobal);
+       histName.Form("SD_detEltNbr%d",deId);
+       h3 = new TH3F(histName, histTitle, 12, -10.0 , 110.0, 12, -10.0, 110.0, nCentBins, centRange[0], centRange[1]);
+       fDetEltSDHistList->AddAt(h3, iDEGlobal);
       }
-
-
-    new((*fDetEltTDHistList )[fTotNbrOfDetectionElt]) TH2F("TD_Chamber" ,"TD_Chamber" ,10,0,10,1,0,1); //!<Detected tracks.
-    new((*fDetEltTTHistList )[fTotNbrOfDetectionElt]) TH2F("TT_Chamber" ,"TT_Chamber" ,10,0,10,1,0,1); //!<Tracks total number.
-    new((*fDetEltEffHistList)[fTotNbrOfDetectionElt]) TH2F("fChamberEff","fChamberEff",10,0,10,1,0,1); //!<Chamber efficiency.
-
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetXaxis() -> SetTitle("Chamber number");
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetYaxis() -> SetTitle("");
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetZaxis() -> SetTitle("Efficiency (%)");  
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetXaxis() -> SetTitleOffset(1.8);
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetYaxis() -> SetTitleOffset(1.8); 
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetZaxis() -> SetTitleOffset(1.2); 
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> SetOption("LEGO");
+      else 
+      {// chambers 5 -> 10
+       histName.Form("TD_detEltNbr%d",deId);
+       h3 = new TH3F(histName, histTitle, 28, -140.0, 140.0, 8, -40.0, 40.0, nCentBins, centRange[0], centRange[1]);
+       fDetEltTDHistList->AddAt(h3, iDEGlobal);          
+       histName.Form("TT_detEltNbr%d",deId);
+       h3 = new TH3F(histName, histTitle, 28, -140.0, 140.0, 8, -40.0, 40.0, nCentBins, centRange[0], centRange[1]);
+       fDetEltTTHistList->AddAt(h3, iDEGlobal);
+       histName.Form("SD_detEltNbr%d",deId);
+       h3 = new TH3F(histName, histTitle, 28, -140.0, 140.0, 8, -40.0, 40.0, nCentBins, centRange[0], centRange[1]);
+       fDetEltSDHistList->AddAt(h3, iDEGlobal);
+      }
+      iDEGlobal++;
+    }
+  }
   
-    new((*fDetEltEffHistList)[157]) TH2F("TT_Chamber" ,"TT_Chamber" ,10,0,10,1,0,1); //!<Tracks total number by chamber.
-
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetXaxis() -> SetTitle("Chamber number");
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetYaxis() -> SetTitle("");
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetZaxis() -> SetTitle("Number of tracks");  
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetXaxis() -> SetTitleOffset(1.8);
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetYaxis() -> SetTitleOffset(1.8); 
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetZaxis() -> SetTitleOffset(1.2); 
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> SetOption("LEGO");
-
-    new((*fDetEltEffHistList)[158]) TH2F("Total_Number_of_Tracks" ,"Total_Number_of_Tracks" ,1,0,1,1,0,1); //!<Tracks total number.
-
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetXaxis() -> SetTitle("");
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetYaxis() -> SetTitle("");
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetZaxis() -> SetTitle("Number of tracks");  
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetXaxis() -> SetTitleOffset(1.8);
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetYaxis() -> SetTitleOffset(1.8); 
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetZaxis() -> SetTitleOffset(1.2); 
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> SetOption("LEGO");    
-
-
-    new((*fChamberTDHistList )[fTotNbrOfChamber]) TH1F("TD_Chamber_2" ,"TD_Chamber_2" ,10,0,10); //!<Detected tracks.
-    new((*fChamberTTHistList )[fTotNbrOfChamber]) TH1F("TT_Chamber_2" ,"TT_Chamber_2" ,10,0,10); //!<Tracks total number.
-    new((*fChamberEffHistList)[fTotNbrOfChamber]) TH1F("fChamberEff_2","fChamberEff_2",10,0,10); //!<Chamber efficiency.
-
-    ((TH1F*) fChamberTDHistList->UncheckedAt(fTotNbrOfChamber)) -> Sumw2();
-    ((TH1F*) fChamberTTHistList->UncheckedAt(fTotNbrOfChamber)) -> Sumw2();
-
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> GetXaxis() -> SetTitle("Chamber number");
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> GetYaxis() -> SetTitle("");
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> GetXaxis() -> SetTitleOffset(1.8);
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> GetYaxis() -> SetTitleOffset(1.8); 
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> Sumw2();
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> SetOption("");
+  // global histograms per chamber
+  nBins[0] = 10;
+  xMin[0] = 0.5; xMax[0] = 10.5;
+  hn = new THnSparseT<TArrayF>("TD_Chambers 11", "Chambers 11", nDims, nBins, xMin, xMax);
+  fChamberTDHistList->AddAt(hn, 10);
+  hn = new THnSparseT<TArrayF>("TT_Chambers 11", "Chambers 11", nDims, nBins, xMin, xMax);
+  fChamberTTHistList->AddAt(hn, 10);
+  hn = new THnSparseT<TArrayF>("SD_Chambers 11", "Chambers 11", nDims, nBins, xMin, xMax);
+  fChamberSDHistList->AddAt(hn, 10);
+
+  //Extra histograms
+  TH1F *fHistCent = new TH1F("fHistCent", "centrality distribution", nCentBins, centRange[0], centRange[1]);
+  fExtraHistList->AddAt(fHistCent,0);
+  TH1F *fHistPt = new TH1F("fHistPt", "pt distribution", 250, 0., 50.);
+  fExtraHistList->AddAt(fHistPt,1);
+  TH1F *fHistY = new TH1F("fHistY", "y distribution", 60, -4., -2.5);
+  fExtraHistList->AddAt(fHistY,2);
+  TH1F *fHistTheta = new TH1F("fHistTheta", "theta distribution", 120, 2.8, 3.2);
+  fExtraHistList->AddAt(fHistTheta,3);
+  TH1F *fHistP = new TH1F("fHistP", "momentum distribution", 250, 0., 500.);
+  fExtraHistList->AddAt(fHistP,4);
   
-    new((*fChamberEffHistList)[11]) TH1F("TT_Chamber_2" ,"TT_Chamber_2" ,10,0,10); //!<Tracks total number by chamber.
-
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> GetXaxis() -> SetTitle("Chamber number");
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> GetYaxis() -> SetTitle("");
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> GetXaxis() -> SetTitleOffset(1.8);
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> GetYaxis() -> SetTitleOffset(1.8); 
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> Sumw2();
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> SetOption("");
-
-    new((*fChamberEffHistList)[12]) TH1F("Total_Number_of_Tracks_2" ,"Total_Number_of_Tracks_2" ,1,0,1); //!<Tracks total number.
-
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> GetXaxis() -> SetTitle("");
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> GetYaxis() -> SetTitle("");
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> GetXaxis() -> SetTitleOffset(1.8);
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> GetYaxis() -> SetTitleOffset(1.8); 
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> Sumw2();    
-    ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> SetOption("");    
-
-
-
-    //fChamberEff = new AliCheckMuonDetEltResponse(fTransformer, fESD, fDetEltTDHistList, fDetEltTTHistList, fChamberTDHistList, fChamberTTHistList);
-
-
-
-//Define input & output
-//---------------------
-
-// -Input slot 0 works with a TChain:
-    DefineInput(0, TChain::Class());
-
-// -Output slots 0 to 5 writes into a TClonesArray:
-    DefineOutput(0, TClonesArray::Class());
-    DefineOutput(1, TClonesArray::Class());
-    DefineOutput(2, TClonesArray::Class());
-    DefineOutput(3, TClonesArray::Class());
-    DefineOutput(4, TClonesArray::Class());
-    DefineOutput(5, TClonesArray::Class());
+  // post the output data at least once
+  PostData(1, fDetEltTDHistList);  
+  PostData(2, fDetEltTTHistList); 
+  PostData(3, fDetEltSDHistList);
+  PostData(4, fChamberTDHistList);
+  PostData(5, fChamberTTHistList);
+  PostData(6, fChamberSDHistList);
+  PostData(7, fExtraHistList);
 }
 
-
-
-//______________________________________________________________________________
-AliAnalysisTaskMuonTrackingEff::~AliAnalysisTaskMuonTrackingEff()
+//________________________________________________________________________
+void AliAnalysisTaskMuonTrackingEff::UserExec(Option_t *)
 {
-// Destructor.
-    delete fDetEltEffHistList;
-    delete fDetEltTDHistList;
-    delete fDetEltTTHistList;
-    delete fChamberEffHistList;
-    delete fChamberTDHistList;
-    delete fChamberTTHistList;
-    delete fChamberEff;
+  /// Main event loop
+  
+  // check the OCDB has been loaded properly
+  if (!fOCDBLoaded) return;
+  
+  // get the current event
+  AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
+  if (!esd) return;
+  
+  // get the centrality
+  fCurrentCentrality = esd->GetCentrality()->GetCentralityPercentileUnchecked("V0M");
+  static_cast<TH1F*>(fExtraHistList->At(0))->Fill(fCurrentCentrality);
+  
+  // loop over tracks
+  AliMUONTrack track;
+  Int_t nTracks = (Int_t)esd->GetNumberOfMuonTracks();
+  for (Int_t iTrack = 0; iTrack < nTracks; iTrack++)
+  {
+    AliESDMuonTrack* esdTrack = esd->GetMuonTrack(iTrack);
+    
+    if(!esdTrack->ContainTrackerData()) continue;
+    
+    if(fMatchTrig && !esdTrack->ContainTriggerData()) continue;
+    
+    Double_t thetaTrackAbsEnd = TMath::ATan(esdTrack->GetRAtAbsorberEnd()/505.) * TMath::RadToDeg();
+    Double_t eta = esdTrack->Eta();
+    if(fApplyAccCut && !(thetaTrackAbsEnd >= 2. && thetaTrackAbsEnd <= 10. && eta >= -4. && eta <= -2.5)) continue;
+    
+    if (fPDCACut > 0.) {
+      const AliVVertex* primaryVertex = esd->GetPrimaryVertexSPD();
+      TVector3 trackDcaAtVz(esdTrack->GetNonBendingCoorAtDCA(), esdTrack->GetBendingCoorAtDCA(), primaryVertex->GetZ());
+      TVector3 vertex(primaryVertex->GetX(), primaryVertex->GetY(), primaryVertex->GetZ());
+      TVector3 meanDca(-0.46, -0.92, 0.); // LHC10h1
+      TVector3 dcaAtVz = trackDcaAtVz - vertex - meanDca;
+      Double_t correctedDca = dcaAtVz.Mag(); // it should also be equal to dcaAtVz.Pt().
+      Double_t pMean = 0.5 * (esdTrack->P() + esdTrack->PUncorrected());
+      Double_t cutVariable = pMean * correctedDca;
+      Double_t cutValue = (thetaTrackAbsEnd > 3.) ? 63. : 120.;
+      cutValue = TMath::Sqrt(cutValue*cutValue + 0.4*0.4*esdTrack->P()*esdTrack->P());
+      if ( cutVariable > fPDCACut*cutValue ) continue;
+    }
+    
+    if (fChi2Cut > 0. && esdTrack->GetNormalizedChi2() > fChi2Cut) continue;
+    
+    if (fPtCut > 0. && esdTrack->Pt() < fPtCut) continue;
+    
+    if (fUseMCLabel && esdTrack->GetLabel() < 0) continue;
+    
+    fCurrentTrack = esdTrack;
+    static_cast<TH1F*>(fExtraHistList->At(1))->Fill(esdTrack->Pt());
+    static_cast<TH1F*>(fExtraHistList->At(2))->Fill(esdTrack->Y());
+    static_cast<TH1F*>(fExtraHistList->At(3))->Fill(esdTrack->Theta());
+    static_cast<TH1F*>(fExtraHistList->At(4))->Fill(esdTrack->P());
+    
+    AliMUONESDInterface::ESDToMUON(*esdTrack, track);
+    
+    TrackParamLoop(track.GetTrackParamAtCluster());
+  }
+  
+  // post the output data:
+  PostData(1, fDetEltTDHistList);  
+  PostData(2, fDetEltTTHistList);  
+  PostData(3, fDetEltSDHistList);  
+  PostData(4, fChamberTDHistList);
+  PostData(5, fChamberTTHistList);
+  PostData(6, fChamberSDHistList);
+  PostData(7, fExtraHistList);
 }
-
-
-
+    
 //________________________________________________________________________
-void AliAnalysisTaskMuonTrackingEff::CreateOutputObjects()
+void AliAnalysisTaskMuonTrackingEff::Terminate(Option_t *)
 {
-    OpenFile(0);
+  /// final plots
 }
 
-
-
 //________________________________________________________________________
-void AliAnalysisTaskMuonTrackingEff::ConnectInputData(Option_t */*option*/)
-
+void AliAnalysisTaskMuonTrackingEff::TrackParamLoop(const TObjArray* trackParams)
 {
-  //Set Field Map for track extrapolation
-  AliMUONTrackExtrap::SetField();
+  /// Loop on all the track params and fill the histos
+  
+  Bool_t trackFilter[10];
+  memset(trackFilter, kFALSE, 10*sizeof(Bool_t));
+  Bool_t chamberResponse[10];
+  memset(chamberResponse, kFALSE, 10*sizeof(Bool_t));
+  
+  // check if the chamber responds
+  Int_t nTrackParams = (Int_t) trackParams->GetEntriesFast();
+  for (Int_t iTrackParam = 0; iTrackParam < nTrackParams; ++iTrackParam)
+  { 
+    Int_t chamberId = static_cast<AliMUONTrackParam*>(trackParams->UncheckedAt(iTrackParam))->GetClusterPtr()->GetChamberId();
+    trackFilter[chamberId] = kTRUE;
+    chamberResponse[chamberId] = kTRUE;
+  }
+  
+  // To make sure the calculation of the efficiency of a given chamber (DE) is not biased by the tracking algorithm
+  // we must make sure the track would have been reconstructed whatever this chamber (DE) has responded or not.
+  // If the track is valid for a given chamber, the following code set trackFilter[chamberId] to kTRUE.
+  for (Int_t station = 0; station < 4; ++station)
+  {
+    Int_t filter;
+    Int_t ch1 = 2*station;
+    Int_t ch2 = 2*station + 1;
+    Int_t ch3 = 2*station + 2;
+    Int_t ch4 = 2*station + 3;
+    if (station < 3 )
+    {
+      filter           = trackFilter[ch1];
+      trackFilter[ch1] = trackFilter[ch2];
+      trackFilter[ch2] = filter;
+    }
+    else
+    {
+      if (chamberResponse[ch3] && chamberResponse[ch4])
+      {
+       filter           = trackFilter[ch1];
+       trackFilter[ch1] = trackFilter[ch2];
+       trackFilter[ch2] = filter;
+      }
+      else
+      {
+       trackFilter[ch1] = kFALSE;
+       trackFilter[ch2] = kFALSE;
+      }
+      
+      if (chamberResponse[ch1] && chamberResponse[ch2])
+      {
+       filter           = trackFilter[ch3];
+       trackFilter[ch3] = trackFilter[ch4];
+       trackFilter[ch4] = filter;
+      }
+      else
+      {
+       trackFilter[ch3] = kFALSE;
+       trackFilter[ch4] = kFALSE;
+      }
+    }
+  }
+  
+  // loop over track parameters
+  Int_t oldChamber = -1;
+  for (Int_t iTrackParam = 0; iTrackParam < nTrackParams; ++iTrackParam)
+  {
+    AliMUONTrackParam* trackParam = static_cast<AliMUONTrackParam*>(trackParams->UncheckedAt(iTrackParam));
+    AliMUONVCluster* cluster = trackParam->GetClusterPtr();
+    
+    Int_t newChamber = cluster->GetChamberId();
+    
+    Int_t detElt = cluster->GetDetElemId();
+    
+    ///track position in the global coordinate system
+    Double_t posXG = trackParam->GetNonBendingCoor(); 
+    Double_t posYG = trackParam->GetBendingCoor(); 
+    Double_t posZG = trackParam->GetZ(); 
+    
+    ///track position in the coordinate system of the DE
+    Double_t posXL, posYL, posZL;
+    fTransformer->Global2Local(detElt, posXG, posYG, posZG, posXL, posYL, posZL);
+    
+    // fill histograms if the track is valid for this chamber
+    if(trackFilter[newChamber])
+    {
+      
+      // fill histograms of the cluster positions on the detection element of the TRACKS DETECTED (TD)
+      FillTDHistos(newChamber, detElt, posXL, posYL);
+      
+      // fill histograms of the cluster positions on the detection element of ALL THE TRACKS (TT)
+      FillTTHistos(newChamber, detElt, posXL, posYL);
+      
+    } else {
 
-  //Connect input
-    AliESDInputHandler* esdHandler = (AliESDInputHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
-    if (!esdHandler)
+     FillSDHistos(newChamber, detElt, posXL, posYL);
+    
+    }
+    
+    // look for missing cluster(s) if any
+    if (newChamber != oldChamber) 
     {
-      Printf("ERROR: Could not get ESDInputHandler");
-    } 
-    else fESD = esdHandler->GetEvent();
+      if (newChamber > oldChamber + 1)
+      {
+       Int_t nbrMissChamber = newChamber - (oldChamber + 1);
+       
+       // find the DE(s) that should have been fired and fill the corresponding histograms
+       FindAndFillMissedDetElt(trackParam, trackFilter, oldChamber+1, nbrMissChamber);
+      }
+      
+      // in case the last chamber has not responded
+      if ( iTrackParam == nTrackParams-1 && newChamber != 9) FindAndFillMissedDetElt(trackParam, trackFilter, 9, 1);
+    }
+    
+    oldChamber = newChamber; 
+  } 
 }
 
-
 //________________________________________________________________________
-void AliAnalysisTaskMuonTrackingEff::Exec(Option_t */*option*/)
+void AliAnalysisTaskMuonTrackingEff::FindAndFillMissedDetElt(const AliMUONTrackParam* trackParam,
+                                                            const Bool_t* trackFilter,
+                                                            Int_t firstMissCh, Int_t nbrMissCh)
 {
-//Execute analysis for current event
+  /// Find which detection elements should have been hit but were missed, and fill the TT histos appropriately
+  
+  // copy track parameters for extrapolation
+  AliMUONTrackParam extrapTrackParam(*trackParam);
+  
+  // loop over missing chambers
+  for (Int_t iCh = 0; iCh < nbrMissCh; ++iCh)
+  {
+    Int_t chamber = firstMissCh + iCh;
     
-  if (fChamberEff == 0x0)
-    fChamberEff = new AliCheckMuonDetEltResponse(fTransformer, fESD, fDetEltTDHistList, fDetEltTTHistList, fChamberTDHistList, fChamberTTHistList);
-  fChamberEff->CheckDetEltResponse();
-
-
-    for( Int_t i = 0; i<156; ++i)
+    // skip this chamber if the track is not valid for it
+    if(!trackFilter[chamber]) continue;
+    
+    Int_t nbrOfDetElt =  AliMpDEManager::GetNofDEInChamber(chamber, kTRUE);
+    
+    Double_t pos1[6] = {0, 0, 0, 0, 0, 0};
+    Double_t pos2[6] = {0, 0, 0, 0, 0, 0};
+    Double_t posMiss[2] = {0, 0};
+    
+    // track position at the chamber z
+    pos1[2] = AliMUONConstants::DefaultChamberZ(chamber);
+    AliMUONTrackExtrap::ExtrapToZ(&extrapTrackParam, pos1[2]);
+    pos1[0] = extrapTrackParam.GetNonBendingCoor();
+    pos1[1] = extrapTrackParam.GetBendingCoor();
+    
+    // track position at the chamber z + dz (where dz = distance between the 2 chamber in the station)
+    pos2[2] = AliMUONConstants::DefaultChamberZ(chamber) + AliMUONConstants::DzCh();
+    AliMUONTrackExtrap::ExtrapToZ(&extrapTrackParam, pos2[2]);
+    pos2[0] = extrapTrackParam.GetNonBendingCoor();
+    pos2[1] = extrapTrackParam.GetBendingCoor();
+    
+    // loop over all the detection element of the chamber
+    for (Int_t iDE = 0; iDE < nbrOfDetElt; iDE++)
     {
-      ((TH2F*) fDetEltEffHistList->UncheckedAt(i))-> Divide( (TH2F*) fDetEltTDHistList->UncheckedAt(i),
-                                                            (TH2F*) fDetEltTTHistList->UncheckedAt(i), 100., 1.); 
+      Int_t deId = (chamber + 1)*fgkOffset + iDE;
+      
+      // track positions (at chamber z and chamber z + dz) in the local coordinate system of the DE
+      fTransformer->Global2Local(deId, pos1[0], pos1[1], pos1[2], pos1[3], pos1[4], pos1[5]);
+      fTransformer->Global2Local(deId, pos2[0], pos2[1], pos2[2], pos2[3], pos2[4], pos2[5]);
+      
+      // track position at z=0 in the local coordinate system of the DE
+      CoordinatesOfMissingCluster(pos1[3], pos1[4], pos1[5], pos2[3], pos2[4], pos2[5], posMiss[0], posMiss[1]);
+      
+      // check if the track cross this DE and fill the corresponding histogram
+      if (CoordinatesInDetElt(deId, posMiss[0], posMiss[1])) FillTTHistos(chamber, deId, posMiss[0], posMiss[1]);
     }
-
-    for (Int_t j = 0; j < 10; j++)
-      {
-       ((TH1F*) fChamberEffHistList->UncheckedAt(j))-> Divide( (TH1F*) fChamberTDHistList->UncheckedAt(j),
-                                                               (TH1F*) fChamberTTHistList->UncheckedAt(j), 100., 1.);  
-      }
-
-
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(156))-> Divide( (TH2F*) fDetEltTDHistList->UncheckedAt(156),
-                                                            (TH2F*) fDetEltTTHistList->UncheckedAt(156), 100., 1.); 
-
-
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(157))-> Add   ( (TH2F*) fDetEltTTHistList ->UncheckedAt(156),
-                                                            (TH2F*) fDetEltEffHistList->UncheckedAt(157), 1., 0.); 
-
-
-    ((TH2F*) fDetEltEffHistList->UncheckedAt(158))-> Fill(0., 0., ((Double_t)fESD -> GetNumberOfMuonTracks()));
-
-
-    ((TH1F*) fChamberEffHistList->UncheckedAt(10))-> Divide( (TH1F*) fChamberTDHistList->UncheckedAt(10),
-                                                            (TH1F*) fChamberTTHistList->UncheckedAt(10), 100., 1.); 
-
-
-    ((TH1F*) fChamberEffHistList->UncheckedAt(11))-> Add   ( (TH1F*) fChamberTTHistList ->UncheckedAt(10),
-                                                            (TH1F*) fChamberEffHistList->UncheckedAt(11), 1., 0.); 
-
-
-    ((TH1F*) fChamberEffHistList->UncheckedAt(12))-> Fill(0., ((Double_t)fESD -> GetNumberOfMuonTracks()));
-
-    ComputeErrors();
-
-//Post the output data:
-    PostData(0, fDetEltTDHistList);  
-    PostData(1, fDetEltTTHistList);  
-    PostData(2, fDetEltEffHistList);  
-    PostData(3, fChamberTDHistList);
-    PostData(4, fChamberTTHistList);
-    PostData(5, fChamberEffHistList);
+  }
 }
 
-
+//________________________________________________________________________
+void AliAnalysisTaskMuonTrackingEff::CoordinatesOfMissingCluster(Double_t x1, Double_t y1, Double_t z1,
+                                                                Double_t x2, Double_t y2, Double_t z2,
+                                                                Double_t& x, Double_t& y) const
+{
+  /// Compute the coordinates of the missing cluster. They are defined by the intersection between
+  /// the straigth line joining two extrapolated points (1 and 2) and the detection element plane.
+  /// In the local coordinates, this means Z=0 in the parametric equation of the line.
+  Double_t t = - z1 / (z2 - z1);
+  x = t * (x2 - x1) + x1;
+  y = t * (y2 - y1) + y1;
+}
 
 //________________________________________________________________________
-void AliAnalysisTaskMuonTrackingEff::Terminate(Option_t */*option*/)
+Bool_t AliAnalysisTaskMuonTrackingEff::CoordinatesInDetElt(Int_t DeId, Double_t x, Double_t y) const
 {
-//Terminate analysis
+  /// Return kTRUE if the coordinates are in the Detection Element.
+  /// This is done by checking if a pad correspond to the (x, y) position.
+  const AliMpVSegmentation* seg1 = AliMpSegmentation::Instance()->GetMpSegmentation(DeId, AliMp::kCath0);
+  const AliMpVSegmentation* seg2 = AliMpSegmentation::Instance()->GetMpSegmentation(DeId, AliMp::kCath1);
+  if (!seg1 || !seg2) return kFALSE;
+  AliMpPad pad1 = seg1->PadByPosition(x, y, kFALSE);
+  AliMpPad pad2 = seg2->PadByPosition(x, y, kFALSE);
+  return (pad1.IsValid() && pad2.IsValid());
+}
 
+//________________________________________________________________________
+void AliAnalysisTaskMuonTrackingEff::FillTDHistos(Int_t chamber, Int_t detElt, Double_t posXL, Double_t posYL)
+{
+  /// Fill the histo for detected tracks
+  static_cast<TH3F*>(fDetEltTDHistList->At(FromDetElt2iDet(chamber, detElt)))->Fill(posXL, posYL, fCurrentCentrality);
+  Double_t x[5] = {0., fCurrentCentrality, fCurrentTrack->Pt(), fCurrentTrack->Y(), fCurrentTrack->Charge()};
+  x[0] = static_cast<Double_t>(FromDetElt2LocalId(chamber, detElt));
+  static_cast<THnSparse*>(fChamberTDHistList->At(chamber))->Fill(x);
+  x[0] = static_cast<Double_t>(chamber+1);
+  static_cast<THnSparse*>(fChamberTDHistList->At(10))->Fill(x);
 }
 
+//________________________________________________________________________
+void AliAnalysisTaskMuonTrackingEff::FillTTHistos(Int_t chamber, Int_t detElt, Double_t posXL, Double_t posYL)
+{
+  /// Fill the histo for all tracks
+  static_cast<TH3F*>(fDetEltTTHistList->At(FromDetElt2iDet(chamber, detElt)))->Fill(posXL, posYL, fCurrentCentrality);
+  Double_t x[5] = {0., fCurrentCentrality, fCurrentTrack->Pt(), fCurrentTrack->Y(), fCurrentTrack->Charge()};
+  x[0] = static_cast<Double_t>(FromDetElt2LocalId(chamber, detElt));
+  static_cast<THnSparse*>(fChamberTTHistList->At(chamber))->Fill(x);
+  x[0] = static_cast<Double_t>(chamber+1);
+  static_cast<THnSparse*>(fChamberTTHistList->At(10))->Fill(x);
+}
 
 //________________________________________________________________________
-void AliAnalysisTaskMuonTrackingEff::ComputeErrors()
+void AliAnalysisTaskMuonTrackingEff::FillSDHistos(Int_t chamber, Int_t detElt, Double_t posXL, Double_t posYL)
 {
-  // Compute error on the efficiency
-  // eff = Ntd/Ntt
-  // error = max {1/Ntt, sqrt(eff*(1-eff)/Ntt)}
+  /// Fill the histo for single detected tracks
+  static_cast<TH3F*>(fDetEltSDHistList->At(FromDetElt2iDet(chamber, detElt)))->Fill(posXL, posYL, fCurrentCentrality);
+  Double_t x[5] = {0., fCurrentCentrality, fCurrentTrack->Pt(), fCurrentTrack->Y(), fCurrentTrack->Charge()};
+  x[0] = static_cast<Double_t>(FromDetElt2LocalId(chamber, detElt));
+  static_cast<THnSparse*>(fChamberSDHistList->At(chamber))->Fill(x);
+  x[0] = static_cast<Double_t>(chamber+1);
+  static_cast<THnSparse*>(fChamberSDHistList->At(10))->Fill(x);
+}
 
-  for (Int_t ii = 0; ii < 10; ii++)
-    {
-      Int_t NumberOfBins = ((TH1F*) fChamberEffHistList->UncheckedAt(ii))->GetNbinsX();
-      for (Int_t jj = 0; jj < NumberOfBins; jj++)
-       {
-         Double_t Ntd = ((TH1F*) fChamberTDHistList->UncheckedAt(ii))->GetBinContent(jj);
-         Double_t Ntt = ((TH1F*) fChamberTTHistList->UncheckedAt(ii))->GetBinContent(jj);
+//________________________________________________________________________
+Int_t AliAnalysisTaskMuonTrackingEff::FromDetElt2iDet(Int_t chamber, Int_t detElt) const
+{
+  /// Connexion between the detection element Id and its position in the list of histograms
+  Int_t iDet = FromDetElt2LocalId(chamber, detElt);
+  for (Int_t iCh = chamber-1; iCh >=0; iCh--) iDet += fgkNbrOfDetectionElt[iCh];
+  return iDet;
+}
 
-         if (Ntt > 0.0 && Ntd > 0.0)
-           {
-             Double_t eff = ((TH1F*) fChamberEffHistList->UncheckedAt(ii))->GetBinContent(jj)/100.0;
-             Double_t err1 = 1.0/Ntt;
-             Double_t err2 = TMath::Sqrt(eff*(1.0 - eff)/Ntt);
-             Double_t error = TMath::Max(err1, err2);
+//________________________________________________________________________
+Int_t AliAnalysisTaskMuonTrackingEff::FromDetElt2LocalId(Int_t chamber, Int_t detElt) const
+{
+  /// Connexion between the detection element Id and its number in the chamber
+  return detElt - fgkOffset*(chamber+1);    
+}
 
-             ((TH1F*) fChamberEffHistList->UncheckedAt(ii))->SetBinError(jj, error*100.0);
-           }
-       }
-    }
+//________________________________________________________________________
+Int_t AliAnalysisTaskMuonTrackingEff::FromLocalId2DetElt(Int_t chamber, Int_t iDet) const
+{
+  /// Connexion between the number of the detection element in the chamber and its Id
+  return iDet + fgkOffset*(chamber+1);    
 }
+