]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG/CaloTrackCorrBase/AliAnaCaloTrackCorrMaker.cxx
Converting PWGCaloTrackCorrBase to native cmake
[u/mrichter/AliRoot.git] / PWG / CaloTrackCorrBase / AliAnaCaloTrackCorrMaker.cxx
index ff5768b5f62816853aabc14a4c21a4a4344bec97..fbb5498a0bc78baa083009b8af2950def766c75e 100755 (executable)
  **************************************************************************/
 
 //_____________________________________________________________________________
-// Steering class for particle (gamma, hadron) identification and correlation 
-// analysis. It is called by the task class AliAnalysisTaskCaloTrackCorrelation 
-// and it connects the input (ESD/AOD/MonteCarlo) got with AliCaloTrackReader 
-// (produces TClonesArrays of AODs (TParticles in MC case if requested)), with 
+// Steering class for particle (gamma, hadron) identification and correlation
+// analysis. It is called by the task class AliAnalysisTaskCaloTrackCorrelation
+// and it connects the input (ESD/AOD/MonteCarlo) got with AliCaloTrackReader
+// (produces TClonesArrays of AODs (TParticles in MC case if requested)), with
 // the analysis classes that derive from AliAnaCaloTrackCorrBaseClass
 //
 // -- Author: Gustavo Conesa (INFN-LNF, LPSC-Grenoble)
 #include <cstdlib>
 
 // --- ROOT system ---
-#include "TClonesArray.h"
-#include "TList.h"
-#include "TH1I.h"
-//#include "Riostream.h"
+#include <TClonesArray.h>
+#include <TList.h>
+#include <TH1F.h>
 //#include <TObjectTable.h>
+#include <TGeoGlobalMagField.h>
 
-//---- AliRoot system ---- 
+//---- AliRoot system ----
 #include "AliAnalysisManager.h"
-#include "AliVEventHandler.h"
-#include "AliAnaCaloTrackCorrBaseClass.h" 
-#include "AliAnaCaloTrackCorrMaker.h" 
+#include "AliInputEventHandler.h"
+#include "AliESDEvent.h"
+#include "AliAODEvent.h"
+#include "AliAnaCaloTrackCorrBaseClass.h"
+#include "AliAnaCaloTrackCorrMaker.h"
+#include "AliLog.h"
 
 ClassImp(AliAnaCaloTrackCorrMaker)
 
 
 //__________________________________________________
-AliAnaCaloTrackCorrMaker::AliAnaCaloTrackCorrMaker() : 
+AliAnaCaloTrackCorrMaker::AliAnaCaloTrackCorrMaker() :
 TObject(),
+fReader(0),                   fCaloUtils(0),
 fOutputContainer(new TList ), fAnalysisContainer(new TList ),
-fMakeHisto(kFALSE),           fMakeAOD(kFALSE), 
-fAnaDebug(0),                 fReader(0), 
-fCaloUtils(0),                fCuts(new TList), 
-fhNEvents(0x0),               fhTrackMult(0x0)
+fMakeHisto(kFALSE),           fMakeAOD(kFALSE),
+fAnaDebug(0),                 fCuts(new TList),
+fScaleFactor(-1),
+fFillDataControlHisto(kTRUE),
+// Control histograms
+fhNEventsIn(0),               fhNEvents(0),
+fhNExoticEvents(0),           fhNEventsNoTriggerFound(0),
+fhNPileUpEvents(0),           fhNPileUpEventsTriggerBC0(0),
+fhXVertex(0),                 fhYVertex(0),                       fhZVertex(0),
+fhXVertexExotic(0),           fhYVertexExotic(0),                 fhZVertexExotic(0),
+fhPileUpClusterMult(0),       fhPileUpClusterMultAndSPDPileUp(0),
+fhTrackMult(0),
+fhCentrality(0),              fhEventPlaneAngle(0),
+fhNMergedFiles(0),            fhScaleFactor(0),
+fhEMCalBCEvent(0),            fhEMCalBCEventCut(0),
+fhTrackBCEvent(0),            fhTrackBCEventCut(0),
+fhPrimaryVertexBC(0),         fhTimeStampFraction(0),
+fhNPileUpVertSPD(0),          fhNPileUpVertTracks(0),
+
+fhClusterTriggerBC(0),                  fhClusterTriggerBCExotic(0),
+fhClusterTriggerBCBadCell(0),           fhClusterTriggerBCBadCellExotic(0),
+fhClusterTriggerBCBadCluster(0),        fhClusterTriggerBCBadClusterExotic(0),
+fhClusterTriggerBCUnMatch(0),           fhClusterTriggerBCExoticUnMatch(0),
+fhClusterTriggerBCBadCellUnMatch(0),    fhClusterTriggerBCBadCellExoticUnMatch(0),
+fhClusterTriggerBCBadClusterUnMatch(0), fhClusterTriggerBCBadClusterExoticUnMatch(0),
+fhClusterTriggerBCEventBC(0),           fhClusterTriggerBCEventBCUnMatch(0),
+fhClusterTriggerBCExoticEventBC(0),     fhClusterTriggerBCExoticEventBCUnMatch(0)
 {
   //Default Ctor
-  if(fAnaDebug > 1 ) printf("*** Analysis Maker Constructor *** \n");
+  AliDebug(1,"*** Analysis Maker Constructor ***");
+  
+  for(Int_t i = 0; i < 3; i++)
+  {
+    fhClusterTriggerBCUnMatchReMatch      [0] = 0;
+    fhClusterTriggerBCExoticUnMatchReMatch[0] = 0;
+  }
   
   //Initialize parameters, pointers and histograms
   InitParameters();
 }
 
 //________________________________________________________________________________________
-AliAnaCaloTrackCorrMaker::AliAnaCaloTrackCorrMaker(const AliAnaCaloTrackCorrMaker & maker) :   
+AliAnaCaloTrackCorrMaker::AliAnaCaloTrackCorrMaker(const AliAnaCaloTrackCorrMaker & maker) :
 TObject(),
-fOutputContainer(new TList()), fAnalysisContainer(new TList()), 
-fMakeHisto(maker.fMakeHisto),  fMakeAOD(maker.fMakeAOD),
-fAnaDebug(maker.fAnaDebug),    fReader(),//new AliCaloTrackReader(*maker.fReader)), 
+fReader(),   //(new AliCaloTrackReader(*maker.fReader)),
 fCaloUtils(),//(new AliCalorimeterUtils(*maker.fCaloUtils)),
-fCuts(new TList()),
-fhNEvents(maker.fhNEvents),    fhTrackMult(maker.fhTrackMult)
+fOutputContainer(new TList()), fAnalysisContainer(new TList()),
+fMakeHisto(maker.fMakeHisto),  fMakeAOD(maker.fMakeAOD),
+fAnaDebug(maker.fAnaDebug),    fCuts(new TList()),
+fScaleFactor(maker.fScaleFactor),
+fFillDataControlHisto(maker.fFillDataControlHisto),
+fhNEventsIn(maker.fhNEventsIn),
+fhNEvents(maker.fhNEvents),
+fhNExoticEvents(maker.fhNExoticEvents),
+fhNEventsNoTriggerFound(maker.fhNEventsNoTriggerFound),
+fhNPileUpEvents(maker.fhNPileUpEvents),
+fhNPileUpEventsTriggerBC0(maker.fhNPileUpEventsTriggerBC0),
+fhXVertex(maker.fhXVertex),
+fhYVertex(maker.fhYVertex),
+fhZVertex(maker.fhZVertex),
+fhXVertexExotic(maker.fhXVertexExotic),
+fhYVertexExotic(maker.fhYVertexExotic),
+fhZVertexExotic(maker.fhZVertexExotic),
+fhPileUpClusterMult(maker.fhPileUpClusterMult),
+fhPileUpClusterMultAndSPDPileUp(maker.fhPileUpClusterMultAndSPDPileUp),
+fhTrackMult(maker.fhTrackMult),
+fhCentrality(maker.fhCentrality),
+fhEventPlaneAngle(maker.fhEventPlaneAngle),
+fhNMergedFiles(maker.fhNMergedFiles),
+fhScaleFactor(maker.fhScaleFactor),
+fhEMCalBCEvent(maker.fhEMCalBCEvent),
+fhEMCalBCEventCut(maker.fhEMCalBCEventCut),
+fhTrackBCEvent(maker.fhTrackBCEvent),
+fhTrackBCEventCut(maker.fhTrackBCEventCut),
+fhPrimaryVertexBC(maker.fhPrimaryVertexBC),
+fhTimeStampFraction(maker.fhTimeStampFraction),
+fhNPileUpVertSPD(maker.fhNPileUpVertSPD),
+fhNPileUpVertTracks(maker.fhNPileUpVertTracks),
+fhClusterTriggerBC(maker.fhClusterTriggerBC),
+fhClusterTriggerBCExotic(maker.fhClusterTriggerBCExotic),
+fhClusterTriggerBCBadCell(maker.fhClusterTriggerBCBadCell),
+fhClusterTriggerBCBadCellExotic(maker.fhClusterTriggerBCBadCellExotic),
+fhClusterTriggerBCBadCluster(maker.fhClusterTriggerBCBadCluster),
+fhClusterTriggerBCBadClusterExotic(maker.fhClusterTriggerBCBadClusterExotic),
+fhClusterTriggerBCUnMatch(maker.fhClusterTriggerBCUnMatch),
+fhClusterTriggerBCExoticUnMatch(maker.fhClusterTriggerBCExoticUnMatch),
+fhClusterTriggerBCBadCellUnMatch(maker.fhClusterTriggerBCBadCellUnMatch),
+fhClusterTriggerBCBadCellExoticUnMatch(maker.fhClusterTriggerBCBadCellExoticUnMatch),
+fhClusterTriggerBCBadClusterUnMatch(maker.fhClusterTriggerBCBadClusterUnMatch),
+fhClusterTriggerBCBadClusterExoticUnMatch(maker.fhClusterTriggerBCBadClusterExoticUnMatch),
+fhClusterTriggerBCEventBC(maker.fhClusterTriggerBCEventBC),
+fhClusterTriggerBCEventBCUnMatch(maker.fhClusterTriggerBCEventBCUnMatch),
+fhClusterTriggerBCExoticEventBC(maker.fhClusterTriggerBCExoticEventBC),
+fhClusterTriggerBCExoticEventBCUnMatch(maker.fhClusterTriggerBCExoticEventBCUnMatch)
+
 {
+  for(Int_t i = 0; i < 3; i++)
+  {
+    fhClusterTriggerBCUnMatchReMatch      [i] = maker.fhClusterTriggerBCUnMatchReMatch      [i];
+    fhClusterTriggerBCExoticUnMatchReMatch[i] = maker.fhClusterTriggerBCExoticUnMatchReMatch[i];
+  }
   // cpy ctor
 }
 
 //___________________________________________________
-AliAnaCaloTrackCorrMaker::~AliAnaCaloTrackCorrMaker() 
+AliAnaCaloTrackCorrMaker::~AliAnaCaloTrackCorrMaker()
 {
   // Remove all owned pointers.
   
-  //  Do not delete it here, already done somewhere else, need to understand where.    
+  //  Do not delete it here, already done somewhere else, need to understand where.
   //  if (fOutputContainer) {
   //    fOutputContainer->Clear();
   //    delete fOutputContainer ;
-  //  }   
+  //  }
   
-  if (fAnalysisContainer) {
+  if (fAnalysisContainer)
+  {
     fAnalysisContainer->Delete();
     delete fAnalysisContainer ;
-  }   
+  }
   
   if (fReader)    delete fReader ;
   if (fCaloUtils) delete fCaloUtils ;
   
-  if(fCuts){
+  if(fCuts)
+  {
          fCuts->Delete();
          delete fCuts;
   }
        
 }
 
-//_______________________________________________________
-void    AliAnaCaloTrackCorrMaker::AddAnalysis(TObject* ana, Int_t n) 
+//__________________________________________________________________
+void    AliAnaCaloTrackCorrMaker::AddAnalysis(TObject* ana, Int_t n)
 {
   // Add analysis depending on AliAnaCaloTrackCorrBaseClass to list
   
   if ( fAnalysisContainer)
-  { 
-    fAnalysisContainer->AddAt(ana,n); 
+  {
+    fAnalysisContainer->AddAt(ana,n);
   }
   else
-  { 
-    printf("AliAnaCaloTrackCorrMaker::AddAnalysis() - AnalysisContainer not initialized\n");
-    abort();
+  {
+    AliFatal("AnalysisContainer not initialized");
   }
-}  
+}
 
 //_________________________________________________________
 TList * AliAnaCaloTrackCorrMaker::FillAndGetAODBranchList()
-{ 
+{
        
-       // Get any new output AOD branches from analysis and put them in a list
-       // The list is filled in the maker, and new branch passed to the analysis frame
-       // AliAnalysisTaskCaloTrackCorrelation
+  // Get any new output AOD branches from analysis and put them in a list
+  // The list is filled in the maker, and new branch passed to the analysis frame
+  // AliAnalysisTaskCaloTrackCorrelation
   
-       TList *aodBranchList = fReader->GetAODBranchList() ;
+  TList *aodBranchList = fReader->GetAODBranchList() ;
+  
+  for(Int_t iana = 0; iana <  fAnalysisContainer->GetEntries(); iana++)
+  {
+    AliAnaCaloTrackCorrBaseClass * ana =  ((AliAnaCaloTrackCorrBaseClass *) fAnalysisContainer->At(iana)) ;
+    if(ana->NewOutputAOD()) aodBranchList->Add(ana->GetCreateOutputAODBranch());
+  }
+  
+  return aodBranchList ;
   
-       for(Int_t iana = 0; iana <  fAnalysisContainer->GetEntries(); iana++){
-               
-               AliAnaCaloTrackCorrBaseClass * ana =  ((AliAnaCaloTrackCorrBaseClass *) fAnalysisContainer->At(iana)) ;
-               if(ana->NewOutputAOD()) aodBranchList->Add(ana->GetCreateOutputAODBranch());
-    
-       }
-       
-       return aodBranchList ;
-       
 }
 
-//_______________________________________________________
-TList * AliAnaCaloTrackCorrMaker::GetListOfAnalysisCuts()
-{ 
+//____________________________________________________
+void AliAnaCaloTrackCorrMaker::FillControlHistograms()
+{
+  // Event control histograms
+  
+  AliVEvent* event =  fReader->GetInputEvent();
+  AliESDEvent* esdevent = dynamic_cast<AliESDEvent*> (event);
+  AliAODEvent* aodevent = dynamic_cast<AliAODEvent*> (event);
+  
+  fhNEvents        ->Fill(0); // Number of events analyzed
+  
+  Double_t v[3];
+  event->GetPrimaryVertex()->GetXYZ(v) ;
+  fhXVertex->Fill(v[0]);
+  fhYVertex->Fill(v[1]);
+  fhZVertex->Fill(v[2]);
   
-       // Get the list of the cuts used for the analysis
-       // The list is filled in the maker, called by the task in LocalInit() and posted there
+  fhTrackMult         ->Fill(fReader->GetTrackMultiplicity());
+  fhCentrality        ->Fill(fReader->GetEventCentrality  ());
+  fhEventPlaneAngle   ->Fill(fReader->GetEventPlaneAngle  ());
+  
+  if(fFillDataControlHisto)
+  {
+    if( fReader->IsPileUpFromSPD())
+      fhNPileUpEvents->Fill(0.5);
+    //if( event->IsPileupFromSPDInMultBins())
+    //  fhNPileUpEvents->Fill(1.5);
+    if( fReader->IsPileUpFromEMCal())
+      fhNPileUpEvents->Fill(2.5);
+    if( fReader->IsPileUpFromSPDOrEMCal() )
+      fhNPileUpEvents->Fill(3.5);
+    if( fReader->IsPileUpFromSPDAndEMCal() )
+      fhNPileUpEvents->Fill(4.5);
+    if( fReader->IsPileUpFromSPDAndNotEMCal() )
+      fhNPileUpEvents->Fill(5.5);
+    if( fReader->IsPileUpFromEMCalAndNotSPD() )
+      fhNPileUpEvents->Fill(6.5);
+    if( fReader->IsPileUpFromNotSPDAndNotEMCal() )
+      fhNPileUpEvents->Fill(7.5);
+    
+    Int_t triggerBC = fReader->GetTriggerClusterBC() ;
+    if( triggerBC == 0            &&
+       !fReader->IsExoticEvent()  &&
+       !fReader->IsBadCellTriggerEvent())
+    {
+      if( fReader->IsPileUpFromSPD())
+        fhNPileUpEventsTriggerBC0->Fill(0.5);
+      //if( event->IsPileupFromSPDInMultBins())
+      //  fhNPileUpEventsTriggerBC0->Fill(1.5);
+      if( fReader->IsPileUpFromEMCal())
+        fhNPileUpEventsTriggerBC0->Fill(2.5);
+      if( fReader->IsPileUpFromSPDOrEMCal() )
+        fhNPileUpEventsTriggerBC0->Fill(3.5);
+      if( fReader->IsPileUpFromSPDAndEMCal() )
+        fhNPileUpEventsTriggerBC0->Fill(4.5);
+      if( fReader->IsPileUpFromSPDAndNotEMCal() )
+        fhNPileUpEventsTriggerBC0->Fill(5.5);
+      if( fReader->IsPileUpFromEMCalAndNotSPD() )
+        fhNPileUpEventsTriggerBC0->Fill(6.5);
+      if( fReader->IsPileUpFromNotSPDAndNotEMCal() )
+        fhNPileUpEventsTriggerBC0->Fill(7.5);
+    }
+    
+    if(fReader->IsPileUpFromSPD())
+      fhPileUpClusterMultAndSPDPileUp ->Fill(fReader->GetNPileUpClusters());
+    
+    fhPileUpClusterMult ->Fill(fReader->GetNPileUpClusters  ());
+    
+    for(Int_t i = 0; i < 19; i++)
+    {
+      if(fReader->IsAccessToTrackTimeOn())
+      {
+        if(fReader->GetTrackEventBC(i))   fhTrackBCEvent   ->Fill(i);
+        if(fReader->GetTrackEventBCcut(i))fhTrackBCEventCut->Fill(i);
+      }
+      if(fReader->GetEMCalEventBC(i))   fhEMCalBCEvent   ->Fill(i);
+      if(fReader->GetEMCalEventBCcut(i))fhEMCalBCEventCut->Fill(i);
+    }
+    
+    Int_t bc = fReader->GetVertexBC();
+    if(bc!=AliVTrack::kTOFBCNA) fhPrimaryVertexBC->Fill(bc);
+    
+    // N pile up vertices
+    Int_t nVerticesSPD    = -1;
+    Int_t nVerticesTracks = -1;
+    
+    if      (esdevent)
+    {
+      nVerticesSPD    = esdevent->GetNumberOfPileupVerticesSPD();
+      nVerticesTracks = esdevent->GetNumberOfPileupVerticesTracks();
+      
+    }//ESD
+    else if (aodevent)
+    {
+      nVerticesSPD    = aodevent->GetNumberOfPileupVerticesSPD();
+      nVerticesTracks = aodevent->GetNumberOfPileupVerticesTracks();
+    }//AOD
+    
+    fhNPileUpVertSPD   ->Fill(nVerticesSPD);
+    fhNPileUpVertTracks->Fill(nVerticesTracks);
+    
+    // Time stamp
+    if(fReader->IsSelectEventTimeStampOn() && esdevent)
+    {
+      Int_t timeStamp = esdevent->GetTimeStamp();
+      Float_t timeStampFrac = 1.*(timeStamp-fReader->GetRunTimeStampMin()) /
+      (fReader->GetRunTimeStampMax()-fReader->GetRunTimeStampMin());
+      
+      //printf("stamp %d, min %d, max %d, frac %f\n", timeStamp, fReader->GetRunTimeStampMin(), fReader->GetRunTimeStampMax(), timeStampFrac);
+      
+      fhTimeStampFraction->Fill(timeStampFrac);
+    }
+  }
+}
 
+//___________________________________________________________
+void AliAnaCaloTrackCorrMaker::FillTriggerControlHistograms()
+{
+  if(!fFillDataControlHisto) return;
+  
+  Int_t  triggerBC   = fReader->GetTriggerClusterBC() ;
+  Bool_t exotic      = fReader->IsExoticEvent();
+  Bool_t badCluster  = fReader->IsBadCellTriggerEvent();
+  Bool_t badCell     = fReader->IsBadMaxCellTriggerEvent();
+  Bool_t triggerMatch= fReader->IsTriggerMatched();
+  Bool_t triggerBCOK = kTRUE;
+  Int_t  triggerId   = fReader->GetTriggerClusterId() ;
+  
+  Bool_t reMatchOpenTime = fReader->IsTriggerMatchedOpenCuts(0);
+  Bool_t reMatchNeigbour = fReader->IsTriggerMatchedOpenCuts(1);
+  Bool_t reMatchBoth     = fReader->IsTriggerMatchedOpenCuts(2);
+  
+  if(triggerId < 0)
+  {
+    //printf("Trigger id %d\n",triggerId);
+    if(triggerId == -2) fhNEventsNoTriggerFound->Fill(0);
+    triggerBCOK = kFALSE;
+  }
+  
+  if(exotic)
+  {
+    fhNExoticEvents->Fill(0) ;
+    Double_t v[3];
+    fReader->GetInputEvent()->GetPrimaryVertex()->GetXYZ(v) ;
+    fhXVertexExotic->Fill(v[0]);
+    fhYVertexExotic->Fill(v[1]);
+    fhZVertexExotic->Fill(v[2]);
+  }
+  //if(fReader->IsExoticEvent()) printf("Maker: EXOTIC Cluster trigger\n");
+  
+  if(!triggerBCOK) return;
   
-       for(Int_t iana = 0; iana <  fAnalysisContainer->GetEntries(); iana++){
-               AliAnaCaloTrackCorrBaseClass * ana =  ((AliAnaCaloTrackCorrBaseClass *) fAnalysisContainer->At(iana)) ;
-               TObjString * objstring = ana->GetAnalysisCuts();
+  Int_t eventBC = fReader->GetInputEvent()->GetBunchCrossNumber();
+  if(eventBC%4 < 0 || eventBC%4 > 3 )
+    AliWarning(Form("STRANGE: Trigger BC %d - Event BC %d, modulo4 %d",triggerBC,eventBC,eventBC%4));
+  
+  if(triggerMatch)
+  {
+    if     (!exotic     && !badCluster) fhClusterTriggerBC->Fill(triggerBC);
+    else if( exotic     &&  badCluster)
+    {
+      fhClusterTriggerBCBadClusterExotic->Fill(triggerBC);
+      if(badCell) fhClusterTriggerBCBadCellExotic->Fill(triggerBC);
+    }
+    else if( exotic     && !badCluster) fhClusterTriggerBCExotic->Fill(triggerBC);
+    else if( badCluster && !exotic    )
+    {
+      fhClusterTriggerBCBadCluster ->Fill(triggerBC);
+      if(badCell) fhClusterTriggerBCBadCell->Fill(triggerBC);
+    }
+    
+    if(!exotic) fhClusterTriggerBCEventBC      ->Fill(triggerBC,eventBC%4);
+    else        fhClusterTriggerBCExoticEventBC->Fill(triggerBC,eventBC%4);
+  }
+  else
+  {
+    if     (!exotic     && !badCluster)
+    {
+      fhClusterTriggerBCUnMatch->Fill(triggerBC);
+      if(reMatchOpenTime) fhClusterTriggerBCUnMatchReMatch[0]->Fill(triggerBC);
+      if(reMatchNeigbour) fhClusterTriggerBCUnMatchReMatch[1]->Fill(triggerBC);
+      if(reMatchBoth)     fhClusterTriggerBCUnMatchReMatch[2]->Fill(triggerBC);
+    }
+    else if( exotic     &&  badCluster)
+    {
+      fhClusterTriggerBCBadClusterExoticUnMatch->Fill(triggerBC);
+      if(badCell)   fhClusterTriggerBCBadCellExoticUnMatch   ->Fill(triggerBC);
+    }
+    else if( exotic     && !badCluster)
+    {
+      fhClusterTriggerBCExoticUnMatch->Fill(triggerBC);
+      if(reMatchOpenTime) fhClusterTriggerBCExoticUnMatchReMatch[0]->Fill(triggerBC);
+      if(reMatchNeigbour) fhClusterTriggerBCExoticUnMatchReMatch[1]->Fill(triggerBC);
+      if(reMatchBoth)     fhClusterTriggerBCExoticUnMatchReMatch[2]->Fill(triggerBC);
+    }
+    else if( badCluster && !exotic )
+    {
+      fhClusterTriggerBCBadClusterUnMatch->Fill(triggerBC);
+      if(badCell)fhClusterTriggerBCBadCellUnMatch->Fill(triggerBC);
+    }
+    
+    if(!exotic) fhClusterTriggerBCEventBCUnMatch      ->Fill(triggerBC,eventBC%4);
+    else        fhClusterTriggerBCExoticEventBCUnMatch->Fill(triggerBC,eventBC%4);
+  }
+  
+}
 
-               if(objstring)fCuts->Add(objstring);
-       }
 
-       return fCuts ;
+//_______________________________________________________
+TList * AliAnaCaloTrackCorrMaker::GetListOfAnalysisCuts()
+{
+  
+  // Get the list of the cuts used for the analysis
+  // The list is filled in the maker, called by the task in LocalInit() and posted there
+  
+  for(Int_t iana = 0; iana <  fAnalysisContainer->GetEntries(); iana++)
+  {
+    AliAnaCaloTrackCorrBaseClass * ana =  ((AliAnaCaloTrackCorrBaseClass *) fAnalysisContainer->At(iana)) ;
+    TObjString * objstring = ana->GetAnalysisCuts();
+    
+    if(objstring)fCuts->Add(objstring);
+  }
+  
+  return fCuts ;
   
 }
 
@@ -157,43 +448,375 @@ TList *AliAnaCaloTrackCorrMaker::GetOutputContainer()
   // Fill the output list of histograms during the CreateOutputObjects stage.
   
   //Initialize calorimeters  geometry pointers
-  GetCaloUtils()->InitPHOSGeometry();
-  GetCaloUtils()->InitEMCALGeometry();
-  
-  if(!fAnalysisContainer || fAnalysisContainer->GetEntries()==0){
-    printf("AliAnaCaloTrackCorrMaker::GetOutputContainer() - Analysis job list not initialized!!!\n");
-    //abort();
-  }
-  else{
-    const Int_t buffersize = 255;
-    char newname[255];
-    for(Int_t iana = 0; iana <  fAnalysisContainer->GetEntries(); iana++){
-      AliAnaCaloTrackCorrBaseClass * ana =  ((AliAnaCaloTrackCorrBaseClass *) fAnalysisContainer->At(iana)) ;
-      if(fMakeHisto){// Analysis with histograms as output on
-        //Fill container with appropriate histograms                   
-        TList * templist =  ana ->GetCreateOutputObjects(); 
-        templist->SetOwner(kFALSE); //Owner is fOutputContainer.
-        for(Int_t i = 0; i < templist->GetEntries(); i++){
-          
-          //Add only  to the histogram name the name of the task
-          if(   strcmp((templist->At(i))->ClassName(),"TObjString")   ) {
-            snprintf(newname,buffersize, "%s%s", (ana->GetAddedHistogramsStringToName()).Data(), (templist->At(i))->GetName());  
-            ((TH1*) templist->At(i))->SetName(newname);
-          }
-          //Add histogram to general container
-          fOutputContainer->Add(templist->At(i)) ;
-        }
-        delete templist;
-      }// Analysis with histograms as output on
-    }//Loop on analysis defined
-  }//Analysis list available
+  //GetCaloUtils()->InitPHOSGeometry();
+  //GetCaloUtils()->InitEMCALGeometry();
   
   //General event histograms
+
+  fhNEventsIn      = new TH1F("hNEventsIn",   "Number of input events"     , 1 , 0 , 1  ) ;
+  fhNEventsIn->SetYTitle("# events");
+  fOutputContainer->Add(fhNEventsIn);
   
-  fhNEvents        = new TH1I("hNEvents",   "Number of analyzed events"     , 1 , 0 , 1  ) ;
+  fhNEvents      = new TH1F("hNEvents",   "Number of analyzed events"     , 1 , 0 , 1  ) ;
+  fhNEvents->SetYTitle("# events");
   fOutputContainer->Add(fhNEvents);
-  fhTrackMult      = new TH1I("hTrackMult", "Number of tracks per events"   , 2000 , 0 , 2000  ) ;
+  
+  fhXVertex      = new TH1F("hXVertex", " X vertex distribution"   , 200 , -4 , 4  ) ;
+  fhXVertex->SetXTitle("v_{x} (cm)");
+  fOutputContainer->Add(fhXVertex);
+  
+  fhYVertex      = new TH1F("hYVertex", " Y vertex distribution"   , 200 , -4 , 4  ) ;
+  fhYVertex->SetXTitle("v_{y} (cm)");
+  fOutputContainer->Add(fhYVertex);
+  
+  fhZVertex      = new TH1F("hZVertex", " Z vertex distribution"   , 200 , -50 , 50  ) ;
+  fhZVertex->SetXTitle("v_{z} (cm)");
+  fOutputContainer->Add(fhZVertex);
+
+  fhCentrality   = new TH1F("hCentrality","Number of events in centrality bin",100,0.,100) ;
+  fhCentrality->SetXTitle("Centrality bin");
+  fOutputContainer->Add(fhCentrality) ;
+  
+  fhEventPlaneAngle=new TH1F("hEventPlaneAngle","Number of events in event plane",100,0.,TMath::Pi()) ;
+  fhEventPlaneAngle->SetXTitle("EP angle (rad)");
+  fOutputContainer->Add(fhEventPlaneAngle) ;
+
+  fhTrackMult    = new TH1F("hTrackMult", "Number of tracks per events"   , 2000 , 0 , 2000  ) ;
+  fhTrackMult->SetXTitle("# tracks");
   fOutputContainer->Add(fhTrackMult);
+
+  if(fFillDataControlHisto)
+  {
+    fhNExoticEvents      = new TH1F("hNExoticEvents",   "Number of analyzed events triggered by exotic cluster"     , 1 , 0 , 1  ) ;
+    fhNExoticEvents->SetYTitle("# exotic events");
+    fOutputContainer->Add(fhNExoticEvents);
+    
+    fhNEventsNoTriggerFound      = new TH1F("hNEventsNoTriggerFound",   "Number of analyzed events triggered but no trigger found"     , 1 , 0 , 1  ) ;
+    fhNEventsNoTriggerFound->SetYTitle("# exotic events");
+    fOutputContainer->Add(fhNEventsNoTriggerFound);
+    
+    
+    Int_t   nbin   = 11;
+    Float_t minbin =-5.5;
+    Float_t maxbin = 5.5;
+    Int_t  labelshift = 6;
+    
+    fhClusterTriggerBCEventBC      = new TH2F("hClusterTriggerBCEventBC", "Found trigger BC and  Event BC",
+                                              nbin , minbin ,maxbin,4,0, 4) ;
+    fhClusterTriggerBCEventBC->SetXTitle("cluster trigger BC");
+    for(Int_t i = 0; i < 4; i++)
+      fhClusterTriggerBCEventBC->GetYaxis()->SetBinLabel(i+1 ,Form("BC/4=%d",i));
+    fhClusterTriggerBCEventBC->SetXTitle("cluster trigger BC");
+    for(Int_t i = 1; i < 12; i++)
+      fhClusterTriggerBCEventBC->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+    fhClusterTriggerBCEventBC->SetYTitle("Event BC%4");
+    fOutputContainer->Add(fhClusterTriggerBCEventBC);
+    
+    fhClusterTriggerBCExoticEventBC      = new TH2F("hClusterTriggerBCExoticEventBC", "Found exotic trigger BC and  Event BC",
+                                                    nbin , minbin ,maxbin,4,1, 4) ;
+    for(Int_t i = 0; i < 4; i++)
+      fhClusterTriggerBCExoticEventBC->GetYaxis()->SetBinLabel(i+1 ,Form("BC/4=%d",i));
+    fhClusterTriggerBCExoticEventBC->SetXTitle("cluster trigger BC");
+    for(Int_t i = 1; i < 12; i++)
+      fhClusterTriggerBCExoticEventBC->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+    fhClusterTriggerBCExoticEventBC->SetYTitle("Event BC%4");
+    fOutputContainer->Add(fhClusterTriggerBCExoticEventBC);
+    
+    fhClusterTriggerBCEventBCUnMatch      = new TH2F("hClusterTriggerBCEventBCUnMatch", "Found unmatched trigger BC and  Event BC",
+                                                     nbin , minbin ,maxbin,4,1, 4) ;
+    for(Int_t i = 0; i < 4; i++)
+      fhClusterTriggerBCEventBCUnMatch->GetYaxis()->SetBinLabel(i+1 ,Form("BC/4=%d",i));
+    fhClusterTriggerBCEventBCUnMatch->SetXTitle("cluster trigger BC");
+    for(Int_t i = 1; i < 12; i++)
+      fhClusterTriggerBCEventBCUnMatch->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+    fhClusterTriggerBCEventBCUnMatch->SetYTitle("Event BC%4");
+    fOutputContainer->Add(fhClusterTriggerBCEventBCUnMatch);
+    
+    fhClusterTriggerBCExoticEventBCUnMatch      = new TH2F("hClusterTriggerExoticBCEventBCUnMatch", "Found unmatched trigger BC and  Event BC",
+                                                           nbin , minbin ,maxbin,4,1, 4) ;
+    for(Int_t i = 0; i < 4; i++)
+      fhClusterTriggerBCExoticEventBCUnMatch->GetYaxis()->SetBinLabel(i+1 ,Form("BC/4=%d",i));
+    fhClusterTriggerBCExoticEventBCUnMatch->SetXTitle("cluster trigger BC");
+    for(Int_t i = 1; i < 12; i++)
+      fhClusterTriggerBCExoticEventBCUnMatch->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+    fhClusterTriggerBCExoticEventBCUnMatch->SetYTitle("Event BC%4");
+    fOutputContainer->Add(fhClusterTriggerBCExoticEventBCUnMatch);
+    
+    fhClusterTriggerBC              = new TH1F("hClusterTriggerBC",
+                                               "Number of analyzed events triggered by a cluster in a given BC",
+                                               nbin , minbin ,maxbin) ;
+    fhClusterTriggerBC->SetYTitle("# events");
+    for(Int_t i = 1; i < 12; i++)
+      fhClusterTriggerBC->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+    fOutputContainer->Add(fhClusterTriggerBC);
+    
+    fhClusterTriggerBCExotic        = new TH1F("hClusterTriggerBCExotic",
+                                               "Number of analyzed events triggered by a exotic cluster in a given BC",
+                                               nbin , minbin ,maxbin) ;
+    fhClusterTriggerBCExotic->SetYTitle("# events");
+    for(Int_t i = 1; i < 12; i++)
+      fhClusterTriggerBCExotic->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+    fOutputContainer->Add(fhClusterTriggerBCExotic);
+    
+    
+    fhClusterTriggerBCBadCell         = new TH1F("hClusterTriggerBCBadCell",
+                                                 "Number of analyzed events triggered by a bad cell in a given BC",
+                                                 nbin , minbin ,maxbin) ;
+    
+    fhClusterTriggerBCBadCell->SetYTitle("# events");
+    for(Int_t i = 1; i < 12; i++)
+      fhClusterTriggerBCBadCell->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+    fOutputContainer->Add(fhClusterTriggerBCBadCell);
+    
+    fhClusterTriggerBCBadCellExotic    = new TH1F("hClusterTriggerBCBadCellExotic",
+                                                  "Number of analyzed events triggered by a bad cell & exotic cluster in a given BC",
+                                                  nbin , minbin ,maxbin) ;
+    fhClusterTriggerBCBadCellExotic->SetYTitle("# events");
+    for(Int_t i = 1; i < 12; i++)
+      fhClusterTriggerBCBadCellExotic->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+    fOutputContainer->Add(fhClusterTriggerBCBadCellExotic);
+    
+    fhClusterTriggerBCBadCluster           = new TH1F("hClusterTriggerBCBadCluster",
+                                                      "Number of analyzed events triggered by a bad cluster in a given BC",
+                                                      nbin , minbin ,maxbin) ;
+    
+    fhClusterTriggerBCBadCluster->SetYTitle("# events");
+    for(Int_t i = 1; i < 12; i++)
+      fhClusterTriggerBCBadCluster->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+    fOutputContainer->Add(fhClusterTriggerBCBadCluster);
+    
+    
+    fhClusterTriggerBCBadClusterExotic    = new TH1F("hClusterTriggerBCBadClusterExotic",
+                                                     "Number of analyzed events triggered by a bad cluster & exotic cluster in a given BC",
+                                                     nbin , minbin ,maxbin) ;
+    
+    fhClusterTriggerBCBadClusterExotic->SetYTitle("# events");
+    for(Int_t i = 1; i < 12; i++)
+      fhClusterTriggerBCBadClusterExotic->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+    fOutputContainer->Add(fhClusterTriggerBCBadClusterExotic);
+    
+    fhClusterTriggerBCUnMatch       = new TH1F("hClusterTriggerBCUnMatch",
+                                               "Number of analyzed events triggered by a cluster (no trigger patch match) in a given BC",
+                                               nbin , minbin ,maxbin) ;
+    fhClusterTriggerBCUnMatch->SetYTitle("# events");
+    for(Int_t i = 1; i < 12; i++)
+      fhClusterTriggerBCUnMatch->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+    fOutputContainer->Add(fhClusterTriggerBCUnMatch);
+    
+    fhClusterTriggerBCExoticUnMatch = new TH1F("hClusterTriggerBCExoticUnMatch",
+                                               "Number of analyzed events triggered by a exotic cluster (no trigger patch match) in a given BC",
+                                               nbin , minbin ,maxbin) ;
+    fhClusterTriggerBCExoticUnMatch->SetYTitle("# events");
+    for(Int_t i = 1; i < 12; i++)
+      fhClusterTriggerBCExoticUnMatch->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+    fOutputContainer->Add(fhClusterTriggerBCExoticUnMatch);
+    
+    
+    fhClusterTriggerBCBadCellUnMatch    = new TH1F("hClusterTriggerBCBadCellUnMatch",
+                                                   "Number of analyzed events triggered by a bad cluster  (no trigger patch match) in a given BC",
+                                                   nbin , minbin ,maxbin) ;
+    fhClusterTriggerBCBadCellUnMatch->SetYTitle("# events");
+    for(Int_t i = 1; i < 12; i++)
+      fhClusterTriggerBCBadCellUnMatch->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+    fOutputContainer->Add(fhClusterTriggerBCBadCellUnMatch);
+    
+    
+    fhClusterTriggerBCBadCellExoticUnMatch = new TH1F("hClusterTriggerBCBadCellExoticUnMatch",
+                                                      "Number of analyzed events triggered by a bad&exotic cluster  (no trigger patch match) in a given BC",
+                                                      nbin , minbin ,maxbin) ;
+    fhClusterTriggerBCBadCellExoticUnMatch->SetYTitle("# events");
+    for(Int_t i = 1; i < 12; i++)
+      fhClusterTriggerBCBadCellExoticUnMatch->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+    fOutputContainer->Add(fhClusterTriggerBCBadCellExoticUnMatch);
+    
+    
+    fhClusterTriggerBCBadClusterUnMatch    = new TH1F("hClusterTriggerBCBadClusterUnMatch",
+                                                      "Number of analyzed events triggered by a bad cluster  (no trigger patch match) in a given BC",
+                                                      nbin , minbin ,maxbin) ;
+    fhClusterTriggerBCBadClusterUnMatch->SetYTitle("# events");
+    for(Int_t i = 1; i < 12; i++)
+      fhClusterTriggerBCBadClusterUnMatch->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+    fOutputContainer->Add(fhClusterTriggerBCBadClusterUnMatch);
+    
+    
+    fhClusterTriggerBCBadClusterExoticUnMatch = new TH1F("hClusterTriggerBCBadClusterExoticUnMatch",
+                                                         "Number of analyzed events triggered by a bad&exotic cluster  (no trigger patch match) in a given BC",
+                                                         nbin , minbin ,maxbin) ;
+    fhClusterTriggerBCBadClusterExoticUnMatch->SetYTitle("# events");
+    for(Int_t i = 1; i < 12; i++)
+      fhClusterTriggerBCBadClusterExoticUnMatch->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+    fOutputContainer->Add(fhClusterTriggerBCBadClusterExoticUnMatch);
+    
+    TString rematch[] = {"OpenTime","CheckNeighbours","Both"};
+    for(Int_t j = 0; j < 3; j++)
+    {
+      fhClusterTriggerBCUnMatchReMatch[j]       = new TH1F(Form("hClusterTriggerBCUnMatch_ReMatch_%s",rematch[j].Data()),
+                                                           Form("Number of analyzed events triggered by a cluster (no trigger patch match) in a given BC, re-match %s",rematch[j].Data()),
+                                                           nbin , minbin ,maxbin) ;
+      fhClusterTriggerBCUnMatchReMatch[j]->SetYTitle("# events");
+      for(Int_t i = 1; i < 12; i++)
+        fhClusterTriggerBCUnMatchReMatch[j]->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+      fOutputContainer->Add(fhClusterTriggerBCUnMatchReMatch[j]);
+      
+      fhClusterTriggerBCExoticUnMatchReMatch[j] = new TH1F(Form("hClusterTriggerBCExoticUnMatch_ReMatch_%s",rematch[j].Data()),
+                                                           Form("Number of analyzed events triggered by a exotic cluster (no trigger patch match) in a given BC, re-match %s",rematch[j].Data()),
+                                                           nbin , minbin ,maxbin) ;
+      fhClusterTriggerBCExoticUnMatchReMatch[j]->SetYTitle("# events");
+      for(Int_t i = 1; i < 12; i++)
+        fhClusterTriggerBCExoticUnMatchReMatch[j]->GetXaxis()->SetBinLabel(i ,Form("BC%d",i-labelshift));
+      fOutputContainer->Add(fhClusterTriggerBCExoticUnMatchReMatch[j]);
+    }
+    
+    fhNPileUpEvents      = new TH1F("hNPileUpEvents",   "Number of events considered as pile-up", 8 , 0 , 8 ) ;
+    fhNPileUpEvents->SetYTitle("# events");
+    fhNPileUpEvents->GetXaxis()->SetBinLabel(1 ,"SPD");
+    fhNPileUpEvents->GetXaxis()->SetBinLabel(2 ,"Multi SPD");
+    fhNPileUpEvents->GetXaxis()->SetBinLabel(3 ,"EMCal");
+    fhNPileUpEvents->GetXaxis()->SetBinLabel(4 ,"EMCal || SPD");
+    fhNPileUpEvents->GetXaxis()->SetBinLabel(5 ,"EMCal && SPD");
+    fhNPileUpEvents->GetXaxis()->SetBinLabel(6 ,"!EMCal && SPD");
+    fhNPileUpEvents->GetXaxis()->SetBinLabel(7 ,"EMCal && !SPD");
+    fhNPileUpEvents->GetXaxis()->SetBinLabel(8 ,"!EMCal && !SPD");
+    fOutputContainer->Add(fhNPileUpEvents);
+    
+    fhNPileUpEventsTriggerBC0      = new TH1F("hNPileUpEventsTriggerBC0","Number of events considered as pile-up, trigger cluster in BC=0", 8 , 0 , 8 ) ;
+    fhNPileUpEventsTriggerBC0->SetYTitle("# events");
+    fhNPileUpEventsTriggerBC0->GetXaxis()->SetBinLabel(1 ,"SPD");
+    fhNPileUpEventsTriggerBC0->GetXaxis()->SetBinLabel(2 ,"Multi SPD");
+    fhNPileUpEventsTriggerBC0->GetXaxis()->SetBinLabel(3 ,"EMCal");
+    fhNPileUpEventsTriggerBC0->GetXaxis()->SetBinLabel(4 ,"EMCal || SPD");
+    fhNPileUpEventsTriggerBC0->GetXaxis()->SetBinLabel(5 ,"EMCal && SPD");
+    fhNPileUpEventsTriggerBC0->GetXaxis()->SetBinLabel(6 ,"!EMCal && SPD");
+    fhNPileUpEventsTriggerBC0->GetXaxis()->SetBinLabel(7 ,"EMCal && !SPD");
+    fhNPileUpEventsTriggerBC0->GetXaxis()->SetBinLabel(8 ,"!EMCal && !SPD");
+    fOutputContainer->Add(fhNPileUpEventsTriggerBC0);
+    
+    if(fReader->IsAccessToTrackTimeOn())
+    {
+      fhTrackBCEvent      = new TH1F("hTrackBCEvent",   "Number of events with at least 1 track in a bunch crossing ", 19 , 0 , 19 ) ;
+      fhTrackBCEvent->SetYTitle("# events");
+      fhTrackBCEvent->SetXTitle("Bunch crossing");
+      for(Int_t i = 1; i < 20; i++)
+        fhTrackBCEvent->GetXaxis()->SetBinLabel(i ,Form("%d",i-10));
+      fOutputContainer->Add(fhTrackBCEvent);
+      
+      fhTrackBCEventCut      = new TH1F("hTrackBCEventCut",   "Number of events with at least 1 track in a bunch crossing ", 19 , 0 , 19 ) ;
+      fhTrackBCEventCut->SetYTitle("# events");
+      fhTrackBCEventCut->SetXTitle("Bunch crossing");
+      for(Int_t i = 1; i < 20; i++)
+        fhTrackBCEventCut->GetXaxis()->SetBinLabel(i ,Form("%d",i-10));
+      fOutputContainer->Add(fhTrackBCEventCut);
+    }
+    
+    fhPrimaryVertexBC      = new TH1F("hPrimaryVertexBC", "Number of primary vertex per bunch crossing ", 41 , -20 , 20  ) ;
+    fhPrimaryVertexBC->SetYTitle("# events");
+    fhPrimaryVertexBC->SetXTitle("Bunch crossing");
+    fOutputContainer->Add(fhPrimaryVertexBC);
+    
+    fhEMCalBCEvent      = new TH1F("hEMCalBCEvent",   "Number of events with at least 1 cluster in a bunch crossing ", 19 , 0 , 19 ) ;
+    fhEMCalBCEvent->SetYTitle("# events");
+    fhEMCalBCEvent->SetXTitle("Bunch crossing");
+    for(Int_t i = 1; i < 20; i++)
+      fhEMCalBCEvent->GetXaxis()->SetBinLabel(i ,Form("%d",i-10));
+    fOutputContainer->Add(fhEMCalBCEvent);
+    
+    fhEMCalBCEventCut      = new TH1F("hEMCalBCEventCut",   "Number of events with at least 1 cluster in a bunch crossing", 19 , 0 , 19 ) ;
+    fhEMCalBCEventCut->SetYTitle("# events");
+    fhEMCalBCEventCut->SetXTitle("Bunch crossing");
+    for(Int_t i = 1; i < 20; i++)
+      fhEMCalBCEventCut->GetXaxis()->SetBinLabel(i ,Form("%d",i-10));
+    fOutputContainer->Add(fhEMCalBCEventCut);
+    
+    fhXVertexExotic      = new TH1F("hXVertexExotic", " X vertex distribution in exotic events"   , 200 , -4 , 4  ) ;
+    fhXVertexExotic->SetXTitle("v_{x} (cm)");
+    fOutputContainer->Add(fhXVertexExotic);
+    
+    fhYVertexExotic      = new TH1F("hYVertexExotic", " Y vertex distribution in exotic events"   , 200 , -4 , 4  ) ;
+    fhYVertexExotic->SetXTitle("v_{y} (cm)");
+    fOutputContainer->Add(fhYVertexExotic);
+    
+    fhZVertexExotic      = new TH1F("hZVertexExotic", " Z vertex distribution in exotic events"   , 200 , -50 , 50  ) ;
+    fhZVertexExotic->SetXTitle("v_{z} (cm)");
+    fOutputContainer->Add(fhZVertexExotic);
+    
+    fhPileUpClusterMult    = new TH1F("hPileUpClusterMult", "Number of clusters per event with large time (|t| > 20 ns)" , 100 , 0 , 100  ) ;
+    fhPileUpClusterMult->SetXTitle("# clusters");
+    fOutputContainer->Add(fhPileUpClusterMult);
+    
+    fhPileUpClusterMultAndSPDPileUp = new TH1F("hPileUpClusterMultAndSPDPileUp", "Number of clusters per event with large time (|t| > 20 ns, events tagged as pile-up by SPD)" , 100 , 0 , 100 ) ;
+    fhPileUpClusterMultAndSPDPileUp->SetXTitle("# clusters");
+    fOutputContainer->Add(fhPileUpClusterMultAndSPDPileUp);
+    
+    fhNPileUpVertSPD  = new TH1F ("hNPileUpVertSPD","N pile-up SPD vertex", 50,0,50);
+    fhNPileUpVertSPD->SetYTitle("# vertex ");
+    fOutputContainer->Add(fhNPileUpVertSPD);
+    
+    fhNPileUpVertTracks  = new TH1F ("hNPileUpVertTracks","N pile-up Tracks vertex", 50,0,50);
+    fhNPileUpVertTracks->SetYTitle("# vertex ");
+    fOutputContainer->Add(fhNPileUpVertTracks);
+    
+    if(fReader->IsSelectEventTimeStampOn())
+    {
+      fhTimeStampFraction = new TH1F("hTimeStampFraction","Fraction of events within a given time stamp range",150, -1, 2) ;
+      fhTimeStampFraction->SetXTitle("fraction");
+      fOutputContainer->Add(fhTimeStampFraction) ;
+    }
+  }
+  
+  if(fScaleFactor > 0)
+  {
+    fhNMergedFiles = new TH1F("hNMergedFiles",   "Number of merged output files"     , 1 , 0 , 1  ) ;
+    fhNMergedFiles->SetYTitle("# files");
+    fhNMergedFiles->Fill(1); // Fill here with one entry, while merging it will count the rest
+    fOutputContainer->Add(fhNMergedFiles);
+    
+    fhScaleFactor = new TH1F("hScaleFactor",   "Number of merged output files"     , 1 , 0 , 1  ) ;
+    fhScaleFactor->SetYTitle("scale factor");
+    fhScaleFactor->SetBinContent(1,fScaleFactor); // Fill here
+    fOutputContainer->Add(fhScaleFactor);
+  }
+  
+  if(!fAnalysisContainer || fAnalysisContainer->GetEntries()==0)
+  {
+    AliWarning("Analysis job list not initialized!!!");
+    return fOutputContainer;
+  }
+  
+  const Int_t buffersize = 255;
+  char newname[buffersize];
+  for(Int_t iana = 0; iana <  fAnalysisContainer->GetEntries(); iana++)
+  {
+    
+    AliAnaCaloTrackCorrBaseClass * ana =  ((AliAnaCaloTrackCorrBaseClass *) fAnalysisContainer->At(iana)) ;
+    
+    if(fMakeHisto) // Analysis with histograms as output on
+    {
+      
+      //Fill container with appropriate histograms
+      TList * templist =  ana ->GetCreateOutputObjects();
+      templist->SetOwner(kFALSE); //Owner is fOutputContainer.
+      
+      for(Int_t i = 0; i < templist->GetEntries(); i++)
+      {
+        
+        //Add only  to the histogram name the name of the task
+        if(   strcmp((templist->At(i))->ClassName(),"TObjString")   )
+        {
+          snprintf(newname,buffersize, "%s%s", (ana->GetAddedHistogramsStringToName()).Data(), (templist->At(i))->GetName());
+          //printf("name %s, new name %s\n",(templist->At(i))->GetName(),newname);
+          ((TH1*) templist->At(i))->SetName(newname);
+        }
+        
+        //Add histogram to general container
+        fOutputContainer->Add(templist->At(i)) ;
+        
+      }
+      
+      delete templist;
+      
+    }// Analysis with histograms as output on
+    
+  }//Loop on analysis defined
   
   return fOutputContainer;
   
@@ -201,155 +824,223 @@ TList *AliAnaCaloTrackCorrMaker::GetOutputContainer()
 
 //___________________________________
 void AliAnaCaloTrackCorrMaker::Init()
-{  
+{
   //Init container histograms and other common variables
   // Fill the output list of histograms during the CreateOutputObjects stage.
   
+  // Activate debug level in maker
+  if( fAnaDebug >= 0 )
+    (AliAnalysisManager::GetAnalysisManager())->AddClassDebug(this->ClassName(),fAnaDebug);
+  
   //Initialize reader
   GetReader()->Init();
   GetReader()->SetCaloUtils(GetCaloUtils()); // pass the calo utils pointer to the reader
-       
+
+  // Activate debug level in reader
+  if( fReader->GetDebug() >= 0 )
+    (AliAnalysisManager::GetAnalysisManager())->AddClassDebug(fReader->ClassName(), fReader->GetDebug());
   
-  if(!fAnalysisContainer || fAnalysisContainer->GetEntries()==0){
-    printf("AliAnaCaloTrackCorrMaker::GetOutputInit() - Analysis job list not initialized!!!\n");
-    //abort();
+  // Activate debug level in calo utils
+  if( fCaloUtils->GetDebug() >= 0 )
+    (AliAnalysisManager::GetAnalysisManager())->AddClassDebug(fCaloUtils->ClassName(), fCaloUtils->GetDebug());
+  
+  if(!fAnalysisContainer || fAnalysisContainer->GetEntries()==0)
+  {
+    AliWarning("Analysis job list not initialized");
+    return;
   }
-       else{
+  
+  for(Int_t iana = 0; iana <  fAnalysisContainer->GetEntries(); iana++)
+  {
+    AliAnaCaloTrackCorrBaseClass * ana =  ((AliAnaCaloTrackCorrBaseClass *) fAnalysisContainer->At(iana)) ;
     
-    for(Int_t iana = 0; iana <  fAnalysisContainer->GetEntries(); iana++){
-      
-      AliAnaCaloTrackCorrBaseClass * ana =  ((AliAnaCaloTrackCorrBaseClass *) fAnalysisContainer->At(iana)) ;
-      ana->SetReader(fReader); //SetReader for each analysis
-      ana->SetCaloUtils(fCaloUtils); //Set CaloUtils for each analysis
-      
-      ana->Init();
-      
-    }//Loop on analysis defined
-  }//Analysis list available
+    ana->SetReader(fReader);       // Set Reader for each analysis
+    ana->SetCaloUtils(fCaloUtils); // Set CaloUtils for each analysis
+    
+    ana->Init();
+    ana->InitDebug();
+    
+//    // Activate debug level in analysis
+//    if( ana->GetDebug() >= 0 )
+//      (AliAnalysisManager::GetAnalysisManager())->AddClassDebug(ana->ClassName(),ana->GetDebug());
+
+  }//Loop on analysis defined
+  
 }
 
 //_____________________________________________
 void AliAnaCaloTrackCorrMaker::InitParameters()
-{      
+{
   //Init data members
   
   fMakeHisto  = kTRUE;
-  fMakeAOD    = kTRUE; 
+  fMakeAOD    = kTRUE;
   fAnaDebug   = 0; // No debugging info displayed by default
        
 }
 
 //______________________________________________________________
 void AliAnaCaloTrackCorrMaker::Print(const Option_t * opt) const
-{      
+{
   //Print some relevant parameters set for the analysis
        
   if(! opt)
     return;
   
   printf("***** Print: %s %s ******\n", GetName(), GetTitle() ) ;
-  printf("Debug level                =     %d\n", fAnaDebug) ;
-  printf("Produce Histo              =     %d\n", fMakeHisto) ;
-  printf("Produce AOD                =     %d\n", fMakeAOD) ;
+  printf("Debug level                =     %d\n", fAnaDebug   ) ;
+  printf("Produce Histo              =     %d\n", fMakeHisto  ) ;
+  printf("Produce AOD                =     %d\n", fMakeAOD    ) ;
   printf("Number of analysis tasks   =     %d\n", fAnalysisContainer->GetEntries()) ;
   
-  if(!strcmp("all",opt)){
-         printf("Print analysis Tasks settings :\n") ;
-         for(Int_t iana = 0; iana<fAnalysisContainer->GetEntries(); iana++){
-                 ((AliAnaCaloTrackCorrBaseClass *) fAnalysisContainer->At(iana))->Print("");
-         }
+  if(!strcmp("all",opt))
+  {
+    printf("Print analysis Tasks settings :\n") ;
+    for(Int_t iana = 0; iana<fAnalysisContainer->GetEntries(); iana++)
+    {
+      ((AliAnaCaloTrackCorrBaseClass *) fAnalysisContainer->At(iana))->Print("");
+    }
+    
+    printf("Print analysis Reader settings :\n") ;
+    fReader->Print("");
+    printf("Print analysis Calorimeter Utils settings :\n") ;
+    fCaloUtils->Print("");
     
-         printf("Print analysis Reader settings :\n") ;
-         fReader->Print("");
-         printf("Print analysis Calorimeter Utils settings :\n") ;
-         fCaloUtils->Print("");
   }
-} 
+  
+}
 
-//_______________________________________________________________________
-void AliAnaCaloTrackCorrMaker::ProcessEvent(const Int_t iEntry, 
-                                            const char * currentFileName)
+//_____________________________________________________________________________________
+void AliAnaCaloTrackCorrMaker::ProcessEvent(Int_t iEntry, const char * currentFileName)
 {
   //Process analysis for this event
   
-  if(fMakeHisto && !fOutputContainer){
-    printf("AliAnaCaloTrackCorrMaker::ProcessEvent() - Histograms not initialized\n");
-    abort();
-  }
-       
-  if(fAnaDebug >= 0 ){ 
-               printf("***  AliAnaCaloTrackCorrMaker::ProcessEvent() Event %d   ***  \n",iEntry);
-         if(fAnaDebug > 1 ) {
-                 printf("AliAnaCaloTrackCorrMaker::ProcessEvent() - Current File Name : %s\n", currentFileName);
-                 //printf("fAODBranchList %p, entries %d\n",fAODBranchList,fAODBranchList->GetEntries());
-         }
-  }
+  if(fMakeHisto && !fOutputContainer)
+    AliFatal("Histograms not initialized");
+  
+  AliDebug(1,Form("***  AliAnaCaloTrackCorrMaker::ProcessEvent() Event %d   ***",iEntry));
+  AliDebug(2,Form("Current File Name : %s", currentFileName));
+  //printf("fAODBranchList %p, entries %d\n",fAODBranchList,fAODBranchList->GetEntries());
   
   //Each event needs an empty branch
   TList * aodList = fReader->GetAODBranchList();
   Int_t nAODBranches = aodList->GetEntries();
-  for(Int_t iaod = 0; iaod < nAODBranches; iaod++){
+  for(Int_t iaod = 0; iaod < nAODBranches; iaod++)
+  {
          TClonesArray *tca = dynamic_cast<TClonesArray*> (aodList->At(iaod));
          if(tca) tca->Clear("C");
   }
   
   //Set geometry matrices before filling arrays, in case recalibration/position calculation etc is needed
-  fCaloUtils->SetGeometryTransformationMatrices(fReader->GetInputEvent());     
+  fCaloUtils->AccessGeometry(fReader->GetInputEvent());
+  
+  //Set the AODB calibration, bad channels etc. parameters at least once
+  fCaloUtils->AccessOADB(fReader->GetInputEvent());
   
   //Tell the reader to fill the data in the 3 detector lists
   Bool_t ok = fReader->FillInputEvent(iEntry, currentFileName);
-  if(!ok){
-         if(fAnaDebug >= 1 )printf("*** Skip event *** %d \n",iEntry);
-         return ;
+  
+  //Access pointers, and trigger mask check needed in mixing case
+  AliAnalysisManager   *manager      = AliAnalysisManager::GetAnalysisManager();
+  AliInputEventHandler *inputHandler = dynamic_cast<AliInputEventHandler*>(manager->GetInputEventHandler());
+  
+  UInt_t isMBTrigger = kFALSE;
+  UInt_t isTrigger   = kFALSE;
+  if(inputHandler)
+  {
+    isMBTrigger = inputHandler->IsEventSelected() & fReader->GetMixEventTriggerMask();
+    isTrigger   = inputHandler->IsEventSelected() & fReader->GetEventTriggerMask();
   }
-       
+  
+  //Fill trigger control histograms, make sure it is only for triggered events and
+  // not the MB events used for mixing
+  if(fReader->IsEventTriggerAtSEOn() || isTrigger)
+  {
+    fhNEventsIn->Fill(0);
+    FillTriggerControlHistograms();
+  }
+  
+  if(!ok)
+  {
+    AliDebug(1,Form("*** Skip event *** %d",iEntry));
+    fReader->ResetLists();
+    return ;
+  }
+  
   //Magic line to write events to file
   if(fReader->WriteDeltaAODToFile())AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillAOD(kTRUE);
   
   //printf(">>>>>>>>>> BEFORE >>>>>>>>>>>\n");
   //gObjectTable->Print();
+  
+  // Init mag field for tracks in case of ESDs, not really necessary
+  if ( !TGeoGlobalMagField::Instance()->GetField() && fReader->GetInputEvent() )
+      (fReader->GetInputEvent())->InitMagneticField();
+  
   //Loop on analysis algorithms
-  if(fAnaDebug > 0 ) printf("*** Begin analysis *** \n");
+  
+  AliDebug(1,"*** Begin analysis ***");
+  
   Int_t nana = fAnalysisContainer->GetEntries() ;
-  for(Int_t iana = 0; iana <  nana; iana++){
-    AliAnaCaloTrackCorrBaseClass * ana =  ((AliAnaCaloTrackCorrBaseClass *) fAnalysisContainer->At(iana)) ; 
+  for(Int_t iana = 0; iana <  nana; iana++)
+  {
+    AliAnaCaloTrackCorrBaseClass * ana = ((AliAnaCaloTrackCorrBaseClass *) fAnalysisContainer->At(iana)) ;
+    
+    ana->ConnectInputOutputAODBranches(); // Sets branches for each analysis
+    
+    //Fill pool for mixed event for the analysis that need it
+    if(!fReader->IsEventTriggerAtSEOn() && isMBTrigger)
+    {
+      ana->FillEventMixPool();
+      if(!isTrigger) continue; // pool filled do not try to fill AODs or histograms if trigger is not MB
+    }
     
-    ana->ConnectInputOutputAODBranches(); //Sets branches for each analysis
-    //Make analysis, create aods in aod branch or AODCaloClusters
+    //Make analysis, create aods in aod branch and in some cases fill histograms
     if(fMakeAOD  )  ana->MakeAnalysisFillAOD()  ;
+    
     //Make further analysis with aod branch and fill histograms
     if(fMakeHisto)  ana->MakeAnalysisFillHistograms()  ;
     
   }
        
-  fhNEvents->Fill(0); //Event analyzed
-  fhTrackMult->Fill(fReader->GetTrackMultiplicity()); 
-  
   fReader->ResetLists();
   
+  // In case of mixing analysis, non triggered events are used,
+  // do not fill control histograms for a non requested triggered event
+  if(!fReader->IsEventTriggerAtSEOn() && !isTrigger)
+  {
+    AliDebug(1,"*** End analysis, MB for mixing ***");
+    return;
+  }
+  
+  FillControlHistograms();
+  
   //printf(">>>>>>>>>> AFTER >>>>>>>>>>>\n");
   //gObjectTable->Print();
        
-  if(fAnaDebug > 0 ) printf("*** End analysis *** \n");
+  AliDebug(1,"*** End analysis ***");
   
 }
 
 //__________________________________________________________
 void AliAnaCaloTrackCorrMaker::Terminate(TList * outputList)
-{  
+{
   //Execute Terminate of analysis
   //Do some final plots.
   
-  if (!outputList) {
-         Error("Terminate", "No output list");
-         return;
+  if (!outputList)
+  {
+    AliError("No output list");
+    return;
   }
-       
-  for(Int_t iana = 0; iana <  fAnalysisContainer->GetEntries(); iana++){
+  
+  for(Int_t iana = 0; iana <  fAnalysisContainer->GetEntries(); iana++)
+  {
     
     AliAnaCaloTrackCorrBaseClass * ana =  ((AliAnaCaloTrackCorrBaseClass *) fAnalysisContainer->At(iana)) ;
     if(ana->MakePlotsOn())ana->Terminate(outputList);
     
   }//Loop on analysis defined
+  
 }