]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/TenderSupplies/AliEMCALTenderSupply.cxx
Merge branch 'flatdev' of https://git.cern.ch/reps/AliRoot into flatdev
[u/mrichter/AliRoot.git] / ANALYSIS / TenderSupplies / AliEMCALTenderSupply.cxx
index 8f17c44cad7f3030c63d41b4ed78f1910d229ed7..4c4d6143e2534d7e3db0a6e049f63921801677cc 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-
 ///////////////////////////////////////////////////////////////////////////////
 //                                                                           //
-//  EMCAL tender, apply corrections to EMCAl clusters                        //
-//  and do track matching.                                                   //
+//  EMCAL tender, apply corrections to EMCAL clusters and do track matching. //
+//                                                                           //
 //  Author: Deepa Thomas (Utrecht University)                                // 
+//  Later mods/rewrite: Jiri Kral (University of Jyvaskyla)                  //
+//  S. Aiola, C. Loizides : Make it work for AODs                            //
 //                                                                           //
 ///////////////////////////////////////////////////////////////////////////////
 
-#include <TROOT.h>
+#include <TClonesArray.h>
 #include <TFile.h>
-#include <TTree.h>
+#include <TGeoGlobalMagField.h>
 #include <TInterpreter.h>
 #include <TObjArray.h>
-#include <TClonesArray.h>
-#include <TGeoGlobalMagField.h>
-#include <AliLog.h>
-#include <AliESDEvent.h>
-#include <AliAnalysisManager.h>
-#include <AliTender.h>
-#include "AliOADBContainer.h"
-#include "AliCDBManager.h"
-#include "AliCDBStorage.h"
-#include "AliCDBEntry.h"
-#include "AliMagF.h"
-#include "AliESDCaloCluster.h"
-#include "AliEMCALTenderSupply.h"
-#include "AliEMCALGeometry.h"
-#include "AliEMCALRecoUtils.h"
-#include "AliEMCALClusterizer.h"
-#include "AliEMCALRecParam.h"
-#include "AliEMCALRecPoint.h"
+#include <TROOT.h>
+#include <TTree.h>
+#include "AliAODEvent.h"
+#include "AliAODMCParticle.h"
+#include "AliAnalysisManager.h"
 #include "AliEMCALAfterBurnerUF.h"
+#include "AliEMCALClusterizer.h"
 #include "AliEMCALClusterizerNxN.h"
 #include "AliEMCALClusterizerv1.h"
 #include "AliEMCALClusterizerv2.h"
 #include "AliEMCALDigit.h"
+#include "AliEMCALGeometry.h"
+#include "AliEMCALRecParam.h"
 #include "AliEMCALRecParam.h"
+#include "AliEMCALRecPoint.h"
+#include "AliEMCALRecoUtils.h"
+#include "AliESDCaloCluster.h"
+#include "AliESDEvent.h"
+#include "AliLog.h"
+#include "AliMagF.h"
+#include "AliOADBContainer.h"
+#include "AliTender.h"
+#include "AliEMCALTenderSupply.h"
 
 ClassImp(AliEMCALTenderSupply)
 
 AliEMCALTenderSupply::AliEMCALTenderSupply() :
-AliTenderSupply()
-,fEMCALGeo(0x0)
-,fEMCALGeoName("EMCAL_COMPLETEV1")
-,fEMCALRecoUtils(0)
-,fConfigName("")
-,fDebugLevel(0)
-,fNonLinearFunc(-1) 
-,fNonLinearThreshold(-1)
-,fReCalibCluster(kFALSE)
-,fUpdateCell(kFALSE)  
-,fCalibrateEnergy(kFALSE)
-,fCalibrateTime(kFALSE)
-,fDoNonLinearity(kFALSE)
-,fBadCellRemove(kFALSE)
-,fRejectExoticCells(kFALSE)
-,fRejectExoticClusters(kFALSE)
-,fClusterBadChannelCheck(kFALSE)
-,fRecalClusPos(kFALSE)
-,fFiducial(kFALSE) 
-,fNCellsFromEMCALBorder(-1)
-,fRecalDistToBadChannels(kFALSE)
-,fRecalShowerShape(kFALSE)
-,fInputTree(0)
-,fInputFile(0)
-,fFilepass(0) 
-,fMass(-1)
-,fStep(-1)
-,fCutEtaPhiSum(kTRUE)
-,fCutEtaPhiSeparate(kFALSE)
-,fRcut(-1)
-,fEtacut(-1)
-,fPhicut(-1)
-,fBasePath("")
-,fReClusterize(kFALSE)
-,fClusterizer(0)
-,fGeomMatrixSet(kFALSE)
-,fLoadGeomMatrices(kFALSE)
-,fRecParam(0x0)
-,fDoTrackMatch(kFALSE)
-,fDoUpdateOnly(kFALSE)
-,fUnfolder(0)
-,fDigitsArr(0)
-,fClusterArr(0)
-,fMisalignSurvey(kdefault)  
-,fExoticCellFraction(-1)
-,fExoticCellDiffTime(-1)
-,fExoticCellMinAmplitude(-1)
+  AliTenderSupply()
+  ,fTask(0)
+  ,fRun(0)
+  ,fEMCALGeo(0x0)
+  ,fEMCALGeoName("")
+  ,fEMCALRecoUtils(0)
+  ,fConfigName("")
+  ,fDebugLevel(0)
+  ,fNonLinearFunc(-1) 
+  ,fNonLinearThreshold(-1)
+  ,fReCalibCluster(kFALSE)
+  ,fUpdateCell(kFALSE)  
+  ,fCalibrateEnergy(kFALSE)
+  ,fCalibrateTime(kFALSE)
+  ,fCalibrateTimeParamAvailable(kFALSE)
+  ,fDoNonLinearity(kFALSE)
+  ,fBadCellRemove(kFALSE)
+  ,fRejectExoticCells(kFALSE)
+  ,fRejectExoticClusters(kFALSE)
+  ,fClusterBadChannelCheck(kFALSE)
+  ,fRecalClusPos(kFALSE)
+  ,fFiducial(kFALSE) 
+  ,fNCellsFromEMCALBorder(-1)
+  ,fRecalDistToBadChannels(kFALSE)
+  ,fRecalShowerShape(kFALSE)
+  ,fInputTree(0)
+  ,fInputFile(0)
+  ,fGetPassFromFileName(kTRUE)
+  ,fFilepass(0) 
+  ,fMass(-1)
+  ,fStep(-1)
+  ,fCutEtaPhiSum(kTRUE)
+  ,fCutEtaPhiSeparate(kFALSE)
+  ,fRcut(-1)
+  ,fEtacut(-1)
+  ,fPhicut(-1)
+  ,fBasePath("")
+  ,fReClusterize(kFALSE)
+  ,fClusterizer(0)
+  ,fGeomMatrixSet(kFALSE)
+  ,fLoadGeomMatrices(kFALSE)
+  ,fRecParam(0x0)
+  ,fDoTrackMatch(kFALSE)
+  ,fDoUpdateOnly(kFALSE)
+  ,fUnfolder(0)
+  ,fDigitsArr(0)
+  ,fClusterArr(0)
+  ,fMisalignSurvey(kdefault)  
+  ,fExoticCellFraction(-1)
+  ,fExoticCellDiffTime(-1)
+  ,fExoticCellMinAmplitude(-1)
+  ,fSetCellMCLabelFromCluster(0)
+  ,fTempClusterArr(0)
+  ,fRemapMCLabelForAODs(0)
+  ,fUseAutomaticRecalib(1)
+  ,fUseAutomaticRunDepRecalib(1)
+  ,fUseAutomaticTimeCalib(1)
+  ,fUseAutomaticRecParam(1)
 {
   // Default constructor.
-  for(Int_t i = 0; i < 10; i++) fEMCALMatrix[i] = 0 ;
+
+  for(Int_t i = 0; i < 12;    i++) fEMCALMatrix[i]      = 0 ;
+  for(Int_t j = 0; j < 12672; j++) fOrgClusterCellId[j] = -1;
 }
 
 //_____________________________________________________
 AliEMCALTenderSupply::AliEMCALTenderSupply(const char *name, const AliTender *tender) :
-AliTenderSupply(name,tender)
-,fEMCALGeo(0x0)
-,fEMCALGeoName("EMCAL_COMPLETEV1")
-,fEMCALRecoUtils(0)
-,fConfigName("")
-,fDebugLevel(0)
-,fNonLinearFunc(-1) 
-,fNonLinearThreshold(-1)        
-,fReCalibCluster(kFALSE)  
-,fUpdateCell(kFALSE)  
-,fCalibrateEnergy(kFALSE)
-,fCalibrateTime(kFALSE)
-,fDoNonLinearity(kFALSE)
-,fBadCellRemove(kFALSE)
-,fRejectExoticCells(kFALSE)
-,fRejectExoticClusters(kFALSE)
-,fClusterBadChannelCheck(kFALSE)
-,fRecalClusPos(kFALSE)
-,fFiducial(kFALSE) 
-,fNCellsFromEMCALBorder(-1)  
-,fRecalDistToBadChannels(kFALSE)  
-,fRecalShowerShape(kFALSE)
-,fInputTree(0)  
-,fInputFile(0)
-,fFilepass(0) 
-,fMass(-1)
-,fStep(-1)
-,fCutEtaPhiSum(kTRUE)
-,fCutEtaPhiSeparate(kFALSE)
-,fRcut(-1)  
-,fEtacut(-1)  
-,fPhicut(-1)  
-,fBasePath("")
-,fReClusterize(kFALSE)
-,fClusterizer(0)
-,fGeomMatrixSet(kFALSE)
-,fLoadGeomMatrices(kFALSE)
-,fRecParam(0x0)
-,fDoTrackMatch(kFALSE)
-,fDoUpdateOnly(kFALSE)
-,fUnfolder(0)
-,fDigitsArr(0)
-,fClusterArr(0)
-,fMisalignSurvey(kdefault)  
-,fExoticCellFraction(-1)
-,fExoticCellDiffTime(-1)
-,fExoticCellMinAmplitude(-1)
+  AliTenderSupply(name,tender)
+  ,fTask(0)
+  ,fRun(0)
+  ,fEMCALGeo(0x0)
+  ,fEMCALGeoName("")
+  ,fEMCALRecoUtils(0)
+  ,fConfigName("")
+  ,fDebugLevel(0)
+  ,fNonLinearFunc(-1) 
+  ,fNonLinearThreshold(-1)        
+  ,fReCalibCluster(kFALSE)  
+  ,fUpdateCell(kFALSE)  
+  ,fCalibrateEnergy(kFALSE)
+  ,fCalibrateTime(kFALSE)
+  ,fCalibrateTimeParamAvailable(kFALSE)
+  ,fDoNonLinearity(kFALSE)
+  ,fBadCellRemove(kFALSE)
+  ,fRejectExoticCells(kFALSE)
+  ,fRejectExoticClusters(kFALSE)
+  ,fClusterBadChannelCheck(kFALSE)
+  ,fRecalClusPos(kFALSE)
+  ,fFiducial(kFALSE) 
+  ,fNCellsFromEMCALBorder(-1)  
+  ,fRecalDistToBadChannels(kFALSE)  
+  ,fRecalShowerShape(kFALSE)
+  ,fInputTree(0)  
+  ,fInputFile(0)
+  ,fGetPassFromFileName(kTRUE)
+  ,fFilepass("") 
+  ,fMass(-1)
+  ,fStep(-1)
+  ,fCutEtaPhiSum(kTRUE)
+  ,fCutEtaPhiSeparate(kFALSE)
+  ,fRcut(-1)  
+  ,fEtacut(-1)  
+  ,fPhicut(-1)  
+  ,fBasePath("")
+  ,fReClusterize(kFALSE)
+  ,fClusterizer(0)
+  ,fGeomMatrixSet(kFALSE)
+  ,fLoadGeomMatrices(kFALSE)
+  ,fRecParam(0x0)
+  ,fDoTrackMatch(kFALSE)
+  ,fDoUpdateOnly(kFALSE)
+  ,fUnfolder(0)
+  ,fDigitsArr(0)
+  ,fClusterArr(0)
+  ,fMisalignSurvey(kdefault)  
+  ,fExoticCellFraction(-1)
+  ,fExoticCellDiffTime(-1)
+  ,fExoticCellMinAmplitude(-1)
+  ,fSetCellMCLabelFromCluster(0)
+  ,fTempClusterArr(0)
+  ,fRemapMCLabelForAODs(0)
+  ,fUseAutomaticRecalib(1)
+  ,fUseAutomaticRunDepRecalib(1)
+  ,fUseAutomaticTimeCalib(1)
+  ,fUseAutomaticRecParam(1)
 {
   // Named constructor
   
-  for(Int_t i = 0; i < 10; i++) fEMCALMatrix[i] = 0 ;
-  fEMCALRecoUtils  = new AliEMCALRecoUtils;
-  fDigitsArr       = new TClonesArray("AliEMCALDigit",1000);
+  for(Int_t i = 0; i < 12;    i++) fEMCALMatrix[i]      = 0 ;
+  for(Int_t j = 0; j < 12672; j++) fOrgClusterCellId[j] = -1;
+}
+
+//_____________________________________________________
+AliEMCALTenderSupply::AliEMCALTenderSupply(const char *name, AliAnalysisTaskSE *task) :
+  AliTenderSupply(name)
+  ,fTask(task)
+  ,fRun(0)
+  ,fEMCALGeo(0x0)
+  ,fEMCALGeoName("")
+  ,fEMCALRecoUtils(0)
+  ,fConfigName("")
+  ,fDebugLevel(0)
+  ,fNonLinearFunc(-1) 
+  ,fNonLinearThreshold(-1)        
+  ,fReCalibCluster(kFALSE)  
+  ,fUpdateCell(kFALSE)  
+  ,fCalibrateEnergy(kFALSE)
+  ,fCalibrateTime(kFALSE)
+  ,fCalibrateTimeParamAvailable(kFALSE)
+  ,fDoNonLinearity(kFALSE)
+  ,fBadCellRemove(kFALSE)
+  ,fRejectExoticCells(kFALSE)
+  ,fRejectExoticClusters(kFALSE)
+  ,fClusterBadChannelCheck(kFALSE)
+  ,fRecalClusPos(kFALSE)
+  ,fFiducial(kFALSE) 
+  ,fNCellsFromEMCALBorder(-1)  
+  ,fRecalDistToBadChannels(kFALSE)  
+  ,fRecalShowerShape(kFALSE)
+  ,fInputTree(0)  
+  ,fInputFile(0)
+  ,fGetPassFromFileName(kTRUE)
+  ,fFilepass("") 
+  ,fMass(-1)
+  ,fStep(-1)
+  ,fCutEtaPhiSum(kTRUE)
+  ,fCutEtaPhiSeparate(kFALSE)
+  ,fRcut(-1)  
+  ,fEtacut(-1)  
+  ,fPhicut(-1)  
+  ,fBasePath("")
+  ,fReClusterize(kFALSE)
+  ,fClusterizer(0)
+  ,fGeomMatrixSet(kFALSE)
+  ,fLoadGeomMatrices(kFALSE)
+  ,fRecParam(0x0)
+  ,fDoTrackMatch(kFALSE)
+  ,fDoUpdateOnly(kFALSE)
+  ,fUnfolder(0)
+  ,fDigitsArr(0)
+  ,fClusterArr(0)
+  ,fMisalignSurvey(kdefault)  
+  ,fExoticCellFraction(-1)
+  ,fExoticCellDiffTime(-1)
+  ,fExoticCellMinAmplitude(-1)
+  ,fSetCellMCLabelFromCluster(0)
+  ,fTempClusterArr(0)
+  ,fRemapMCLabelForAODs(0)
+  ,fUseAutomaticRecalib(1)
+  ,fUseAutomaticRunDepRecalib(1)
+  ,fUseAutomaticTimeCalib(1)
+  ,fUseAutomaticRecParam(1)
+{
+  // Named constructor.
+  
+  for(Int_t i = 0; i < 12;    i++) fEMCALMatrix[i]      = 0 ;
+  for(Int_t j = 0; j < 12672; j++) fOrgClusterCellId[j] = -1;
 }
 
 //_____________________________________________________
 AliEMCALTenderSupply::~AliEMCALTenderSupply()
 {
   //Destructor
-  
-  delete fEMCALRecoUtils;
-  delete fRecParam;
-  delete fUnfolder;
-  if (!fClusterizer) {
-    fDigitsArr->Clear("C");
-    delete fDigitsArr; 
-  } else {
-    delete fClusterizer;
-    fDigitsArr = 0;
+
+  if (!AliAnalysisManager::GetAnalysisManager())  return;  
+
+  if (!AliAnalysisManager::GetAnalysisManager()->IsProofMode()) 
+  {
+    delete fEMCALRecoUtils;
+    delete fRecParam;
+    delete fUnfolder;
+    
+    if (!fClusterizer) 
+    {
+      if (fDigitsArr) 
+      { 
+       fDigitsArr->Clear("C");
+       delete fDigitsArr; 
+      }
+    } 
+    else 
+    {
+      delete fClusterizer;
+      fDigitsArr = 0;
+    }
   }
 }
 
+//_____________________________________________________
+void AliEMCALTenderSupply::SetDefaults()
+{
+  // Set default settings.
+
+  SwitchOnReclustering();
+  SwitchOnTrackMatch();
+}
+
+//_____________________________________________________
+Bool_t AliEMCALTenderSupply::RunChanged() const
+{
+  // Get run number.
+
+  return (fTender && fTender->RunChanged()) || (fTask && fRun != fTask->InputEvent()->GetRunNumber()); 
+}
+
 //_____________________________________________________
 void AliEMCALTenderSupply::Init()
 {
   // Initialise EMCAL tender.
 
   if (fDebugLevel>0) 
-    AliInfo("Init EMCAL Tender supply"); 
+    AliWarning("Init EMCAL Tender supply"); 
   
   if (fConfigName.Length()>0 && gROOT->LoadMacro(fConfigName) >=0) {
     AliDebug(1, Form("Loading settings from macro %s", fConfigName.Data()));
@@ -203,6 +322,7 @@ void AliEMCALTenderSupply::Init()
     fRecalClusPos           = tender->fRecalClusPos;
     fCalibrateEnergy        = tender->fCalibrateEnergy;
     fCalibrateTime          = tender->fCalibrateTime;
+    fCalibrateTimeParamAvailable = tender->fCalibrateTimeParamAvailable;
     fFiducial               = tender->fFiducial;
     fNCellsFromEMCALBorder  = tender->fNCellsFromEMCALBorder;
     fRecalDistToBadChannels = tender->fRecalDistToBadChannels;    
@@ -229,17 +349,65 @@ void AliEMCALTenderSupply::Init()
     fExoticCellDiffTime     = tender->fExoticCellDiffTime;
     fExoticCellMinAmplitude = tender->fExoticCellMinAmplitude;
 
-    for(Int_t i = 0; i < 10; i++) 
+    for(Int_t i = 0; i < 12; i++) 
       fEMCALMatrix[i] = tender->fEMCALMatrix[i] ;
   }
+  
+  if (fDebugLevel>0){
+    AliInfo("Emcal Tender settings: ======================================"); 
+    AliInfo("------------ Switches --------------------------"); 
+    AliInfo(Form("BadCellRemove : %d", fBadCellRemove)); 
+    AliInfo(Form("ExoticCellRemove : %d", fRejectExoticCells)); 
+    AliInfo(Form("CalibrateEnergy : %d", fCalibrateEnergy)); 
+    AliInfo(Form("CalibrateTime : %d", fCalibrateTime)); 
+    AliInfo(Form("UpdateCell : %d", fUpdateCell)); 
+    AliInfo(Form("DoUpdateOnly : %d", fDoUpdateOnly)); 
+    AliInfo(Form("Reclustering : %d", fReClusterize)); 
+    AliInfo(Form("ClusterBadChannelCheck : %d", fClusterBadChannelCheck)); 
+    AliInfo(Form("ClusterExoticChannelCheck : %d", fRejectExoticClusters)); 
+    AliInfo(Form("CellFiducialRegion : %d", fFiducial)); 
+    AliInfo(Form("ReCalibrateCluster : %d", fReCalibCluster)); 
+    AliInfo(Form("RecalculateClusPos : %d", fRecalClusPos)); 
+    AliInfo(Form("RecalShowerShape : %d", fRecalShowerShape)); 
+    AliInfo(Form("NonLinearityCorrection : %d", fDoNonLinearity)); 
+    AliInfo(Form("RecalDistBadChannel : %d", fRecalDistToBadChannels)); 
+    AliInfo(Form("TrackMatch : %d", fDoTrackMatch)); 
+    AliInfo("------------ Variables -------------------------"); 
+    AliInfo(Form("DebugLevel : %d", fDebugLevel)); 
+    AliInfo(Form("BasePath : %s", fBasePath.Data())); 
+    AliInfo(Form("ConfigFileName : %s", fConfigName.Data())); 
+    AliInfo(Form("EMCALGeometryName : %s", fEMCALGeoName.Data())); 
+    AliInfo(Form("NonLinearityFunction : %d", fNonLinearFunc)); 
+    AliInfo(Form("NonLinearityThreshold : %d", fNonLinearThreshold)); 
+    AliInfo(Form("MisalignmentMatrixSurvey : %d", fMisalignSurvey)); 
+    AliInfo(Form("NumberOfCellsFromEMCALBorder : %d", fNCellsFromEMCALBorder)); 
+    AliInfo(Form("RCut : %f", fRcut)); 
+    AliInfo(Form("Mass : %f", fMass)); 
+    AliInfo(Form("Step : %f", fStep)); 
+    AliInfo(Form("EtaCut : %f", fEtacut)); 
+    AliInfo(Form("PhiCut : %f", fPhicut)); 
+    AliInfo(Form("ExoticCellFraction : %f", fExoticCellFraction)); 
+    AliInfo(Form("ExoticCellDiffTime : %f", fExoticCellDiffTime)); 
+    AliInfo(Form("ExoticCellMinAmplitude : %f", fExoticCellMinAmplitude)); 
+    AliInfo("============================================================="); 
+  }
 
-  // Init geometry  
-  fEMCALGeo = AliEMCALGeometry::GetInstance(fEMCALGeoName) ;
+  // init reco utils
   
-  // Initialising non-linearity parameters
-  if( fNonLinearThreshold != -1 )
+  if (!fEMCALRecoUtils)
+    fEMCALRecoUtils  = new AliEMCALRecoUtils;
+
+  // init geometry if requested
+  if (fEMCALGeoName.Length()>0) 
+    fEMCALGeo = AliEMCALGeometry::GetInstance(fEMCALGeoName) ;
+
+  // digits array
+  fDigitsArr       = new TClonesArray("AliEMCALDigit",1000);
+
+  // initialising non-linearity parameters
+  if (fNonLinearThreshold != -1)
     fEMCALRecoUtils->SetNonLinearityThreshold(fNonLinearThreshold);
-  if( fNonLinearFunc != -1 )
+  if (fNonLinearFunc != -1)
     fEMCALRecoUtils->SetNonLinearityFunction(fNonLinearFunc);
 
   // missalignment function
@@ -247,150 +415,181 @@ void AliEMCALTenderSupply::Init()
 
   // fiducial cut
   // do not do the eta0 fiducial cut
-  if( fNCellsFromEMCALBorder != -1 )
+  if (fNCellsFromEMCALBorder != -1)
     fEMCALRecoUtils->SetNumberOfCellsFromEMCALBorder(fNCellsFromEMCALBorder);
   fEMCALRecoUtils->SwitchOnNoFiducialBorderInEMCALEta0();
     
   // exotic cell rejection
-  if( fExoticCellFraction != -1 )
-    fEMCALRecoUtils->SetExoticCellFractionCut( fExoticCellFraction );
-  if( fExoticCellDiffTime != -1 )
-    fEMCALRecoUtils->SetExoticCellDiffTimeCut( fExoticCellDiffTime );
-  if( fExoticCellMinAmplitude != -1 )
-    fEMCALRecoUtils->SetExoticCellMinAmplitudeCut( fExoticCellMinAmplitude );
-
-  // Setting track matching parameters ... mass, step size and residual cut
-  if( fMass != -1 )
+  if (fExoticCellFraction != -1)
+    fEMCALRecoUtils->SetExoticCellFractionCut(fExoticCellFraction);
+  if (fExoticCellDiffTime != -1)
+    fEMCALRecoUtils->SetExoticCellDiffTimeCut(fExoticCellDiffTime);
+  if (fExoticCellMinAmplitude != -1)
+    fEMCALRecoUtils->SetExoticCellMinAmplitudeCut(fExoticCellMinAmplitude);
+
+  // setting track matching parameters ... mass, step size and residual cut
+  if (fMass != -1)
     fEMCALRecoUtils->SetMass(fMass);
-  if( fStep != -1 )
+  if (fStep != -1)
     fEMCALRecoUtils->SetStep(fStep);
   
   // spatial cut based on separate eta/phi or common processing
-  if(fCutEtaPhiSum)
+  if (fCutEtaPhiSum) 
     fEMCALRecoUtils->SwitchOnCutEtaPhiSum(); 
-    if( fRcut != -1 )
+    if (fRcut != -1)
       fEMCALRecoUtils->SetCutR(fRcut);
   } else if (fCutEtaPhiSeparate) {
     fEMCALRecoUtils->SwitchOnCutEtaPhiSeparate();
-    if( fEtacut != -1 )
+    if (fEtacut != -1)
       fEMCALRecoUtils->SetCutEta(fEtacut);
-    if( fPhicut != -1 )
+    if (fPhicut != -1)
       fEMCALRecoUtils->SetCutPhi(fPhicut);
   }
 }
 
+//_____________________________________________________
+AliVEvent* AliEMCALTenderSupply::GetEvent()
+{
+  // Return the event pointer.
+  
+  if (fTender) {
+    return fTender->GetEvent();
+  } else if (fTask) {
+    return fTask->InputEvent();
+  }
+  
+  return 0;
+}
+
 //_____________________________________________________
 void AliEMCALTenderSupply::ProcessEvent()
 {
   // Event loop.
   
-  AliESDEvent *event = fTender->GetEvent();
+  AliVEvent *event = GetEvent();
+
   if (!event) {
-    AliError("ESD event ptr = 0, returning");
+    AliError("Event ptr = 0, returning");
     return;
   }
   
   // Initialising parameters once per run number
-  if (fTender->RunChanged()){ 
+  if (RunChanged()) { 
+
+    fRun = event->GetRunNumber();
+    AliWarning(Form("Run changed, initializing parameters for %d", fRun));
+    if (dynamic_cast<AliAODEvent*>(event)) {
+      AliWarning("============================================================="); 
+      AliWarning("===  Running on AOD is not equivalent to running on ESD!  ===");
+      AliWarning("============================================================="); 
+    }
 
-    // initiate default reco params if not supplied by user
-    if (!fRecParam)
-      InitRecParam();
+    // init geometry if not already done
+    if (fEMCALGeoName.Length()==0) {
+      fEMCALGeoName = "EMCAL_FIRSTYEARV1";
+      if (fRun>139517) {
+        fEMCALGeoName = "EMCAL_COMPLETEV1";
+      } 
+      if (fRun>170593) {
+        fEMCALGeoName = "EMCAL_COMPLETE12SMV1";
+      }
+      fEMCALGeo = AliEMCALGeometry::GetInstance(fEMCALGeoName);
+      if (!fEMCALGeo) {
+        AliFatal(Form("Can not create geometry: %s", fEMCALGeoName.Data()));
+        return;
+      }
+    } 
 
     // get pass
-    GetPass();
+    if (fGetPassFromFileName)
+      GetPass();
 
     // define what recalib parameters are needed for various switches
     // this is based on implementation in AliEMCALRecoUtils
+    Bool_t needRecoParam   = fReClusterize;
     Bool_t needBadChannels = fBadCellRemove   | fClusterBadChannelCheck | fRecalDistToBadChannels | fReClusterize;
     Bool_t needRecalib     = fCalibrateEnergy | fReClusterize;
     Bool_t needTimecalib   = fCalibrateTime   | fReClusterize;
     Bool_t needMisalign    = fRecalClusPos    | fReClusterize;
     Bool_t needClusterizer = fReClusterize;
 
-    // Init bad channels
-    if( needBadChannels )
-    {
+    // init bad channels
+    if (needBadChannels) {
       Int_t fInitBC = InitBadChannels();
       if (fInitBC==0)
-      {
         AliError("InitBadChannels returned false, returning");
-        return;
-      }
       if (fInitBC==1)
-      {
-        AliInfo("InitBadChannels OK");
-      }
+        AliWarning("InitBadChannels OK");
       if (fInitBC>1)
-      {
-        AliInfo(Form("No external hot channel set: %d - %s", event->GetRunNumber(), fFilepass.Data()));
-      }
+        AliWarning(Form("No external hot channel set: %d - %s", event->GetRunNumber(), fFilepass.Data()));
     }
 
     // init recalibration factors
-    if( needRecalib ) 
-    { 
-      Int_t fInitRecalib = InitRecalib();
-      if (fInitRecalib==0)
+    if (needRecalib) {
+      if(fUseAutomaticRecalib)
       {
-        AliError("InitRecalib returned false, returning");
-        return;
+        Int_t fInitRecalib = InitRecalib();
+        if (fInitRecalib==0)
+          AliError("InitRecalib returned false, returning");
+        if (fInitRecalib==1)
+          AliWarning("InitRecalib OK");
+        if (fInitRecalib>1)
+          AliWarning(Form("No recalibration available: %d - %s", event->GetRunNumber(), fFilepass.Data()));
       }
-      if (fInitRecalib==1)
-      {
-        AliInfo("InitRecalib OK");
-      }
-      if (fInitRecalib>1)
+      
+      if(fUseAutomaticRunDepRecalib)
       {
-        AliInfo(Form("No recalibration available: %d - %s", event->GetRunNumber(), fFilepass.Data()));
-        fReCalibCluster = kFALSE;
+        Int_t fInitRunDepRecalib = InitRunDepRecalib();
+        if (fInitRunDepRecalib==0)
+          AliError("InitrunDepRecalib returned false, returning");
+        if (fInitRunDepRecalib==1)
+          AliWarning("InitRecalib OK");
+        if (fInitRunDepRecalib>1)
+          AliWarning(Form("No Temperature recalibration available: %d - %s", event->GetRunNumber(), fFilepass.Data()));
       }
     }
     
     // init time calibration
-    if( needTimecalib )
-    {
+    if (needTimecalib && fUseAutomaticTimeCalib) {
       Int_t initTC = InitTimeCalibration();
-      if ( !initTC ) 
-      {
+      if (!initTC) 
         AliError("InitTimeCalibration returned false, returning");
-        return;
-      }
-      if (initTC==1)
-      {
-        AliInfo("InitTimeCalib OK");
-      }
-      if( initTC > 1 )
-      {
-        AliInfo(Form("No external time calibration set: %d - %s", event->GetRunNumber(), fFilepass.Data()));
+      if (initTC==1) {
+        fCalibrateTimeParamAvailable = kTRUE;
+        AliWarning("InitTimeCalib OK");
       }
+      if (initTC > 1)
+        AliWarning(Form("No external time calibration available: %d - %s", event->GetRunNumber(), fFilepass.Data()));
     }
 
     // init misalignment matrix
-    if( needMisalign ) 
-    { 
-      if (!InitMisalignMatrix()) {
-        
+    if (needMisalign) {
+      if (!InitMisalignMatrix())
         AliError("InitMisalignmentMatrix returned false, returning");
-        return;
-      }
       else
-        AliInfo("InitMisalignMatrix OK");
+        AliWarning("InitMisalignMatrix OK");
+    }
+    
+    // initiate reco params with some defaults
+    // will not overwrite, if those have been provided by user
+    if (needRecoParam && fUseAutomaticRecParam) {
+      Int_t initRC = InitRecParam();
+      
+      if (initRC == 0)
+        AliInfo("Defaults reco params loaded.");
+      if (initRC > 1)
+        AliWarning("User defined reco params.");
     }
     
     // init clusterizer
-    if( needClusterizer ) 
-    {
+    if (needClusterizer) {
       if (!InitClusterization()) 
-      {
         AliError("InitClusterization returned false, returning");
-        return;
-      }
       else
-        AliInfo("InitClusterization OK");
+        AliWarning("InitClusterization OK");
     }
     
-    if(fDebugLevel>1) 
+    if (fDebugLevel>1) 
       fEMCALRecoUtils->Print("");
   }
   
@@ -401,8 +600,7 @@ void AliEMCALTenderSupply::ProcessEvent()
     
   // clusterizer does cluster energy recalibration, position recomputation
   // and shower shape
-  if( fReClusterize )
-  {
+  if (fReClusterize) {
     fReCalibCluster   = kFALSE;
     fRecalClusPos     = kFALSE;
     fRecalShowerShape = kFALSE;
@@ -411,37 +609,37 @@ void AliEMCALTenderSupply::ProcessEvent()
   // CONFIGURE THE RECO UTILS -------------------------------------------------
   // configure the reco utils
   // this option does energy recalibration
-  if( fCalibrateEnergy )
+  if (fCalibrateEnergy)
     fEMCALRecoUtils->SwitchOnRecalibration();
   else
     fEMCALRecoUtils->SwitchOffRecalibration();
   
   // allows time calibration
-  if( fCalibrateTime )
+  if (fCalibrateTime)
     fEMCALRecoUtils->SwitchOnTimeRecalibration();
   else
     fEMCALRecoUtils->SwitchOffTimeRecalibration();
 
   // allows to zero bad cells
-  if( fBadCellRemove )
+  if (fBadCellRemove)
     fEMCALRecoUtils->SwitchOnBadChannelsRemoval();
   else
     fEMCALRecoUtils->SwitchOffBadChannelsRemoval();
   
   // distance to bad channel recalibration
-  if( fRecalDistToBadChannels )
+  if (fRecalDistToBadChannels)
     fEMCALRecoUtils->SwitchOnDistToBadChannelRecalculation();
   else
     fEMCALRecoUtils->SwitchOffDistToBadChannelRecalculation();
 
   // exclude exotic cells
-  if( fRejectExoticCells )
+  if (fRejectExoticCells)
     fEMCALRecoUtils->SwitchOnRejectExoticCell();
   else
     fEMCALRecoUtils->SwitchOffRejectExoticCell();
   
   // exclude clusters with exotic cells
-  if( fRejectExoticClusters )
+  if (fRejectExoticClusters)
     fEMCALRecoUtils->SwitchOnRejectExoticCluster();
   else
     fEMCALRecoUtils->SwitchOffRejectExoticCluster();
@@ -452,10 +650,10 @@ void AliEMCALTenderSupply::ProcessEvent()
 
   // START PROCESSING ---------------------------------------------------------
   // Test if cells present
-  AliESDCaloCells *cells= event->GetEMCALCells();
+  AliVCaloCells *cells= event->GetEMCALCells();
   if (cells->GetNumberOfCells()<=0) 
   {
-    if(fDebugLevel>1) 
+    if (fDebugLevel>1) 
       AliWarning(Form("Number of EMCAL cells = %d, returning", cells->GetNumberOfCells()));
     return;
   }
@@ -465,15 +663,14 @@ void AliEMCALTenderSupply::ProcessEvent()
 
   // mark the cells not recalibrated in case of selected
   // time, energy recalibration or bad channel removal
-  if( fCalibrateEnergy || fCalibrateTime || fBadCellRemove )
+  if (fCalibrateEnergy || fCalibrateTime || fBadCellRemove)
     fEMCALRecoUtils->ResetCellsCalibrated();
   
 // CELL RECALIBRATION -------------------------------------------------------
+ // CELL RECALIBRATION -------------------------------------------------------
   // cell objects will be updated
   // the cell calibrations are also processed locally any time those are needed
   // in case that the cell objects are not to be updated here for later use
-  if( fUpdateCell )
-  {
+  if (fUpdateCell) {
     // do the update
     // includes exotic cell check in the UpdateCells function - is not provided
     // by the reco utils
@@ -496,7 +693,7 @@ void AliEMCALTenderSupply::ProcessEvent()
     Clusterize();
     UpdateClusters();
   }
-  
+
   // Store good clusters
   TClonesArray *clusArr = dynamic_cast<TClonesArray*>(event->FindListObject("caloClusters"));
   if (!clusArr) 
@@ -519,8 +716,7 @@ void AliEMCALTenderSupply::ProcessEvent()
       continue;
 
     // REMOVE CLUSTERS WITH BAD CELLS -----------------------------
-    if( fClusterBadChannelCheck )
-    {
+    if (fClusterBadChannelCheck) {
       // careful, the the ClusterContainsBadChannel is dependent on
       // SwitchOnBadChannelsRemoval, switching it ON automatically
       // and returning to original value after processing
@@ -530,10 +726,10 @@ void AliEMCALTenderSupply::ProcessEvent()
       Bool_t badResult = fEMCALRecoUtils->ClusterContainsBadChannel(fEMCALGeo, clust->GetCellsAbsId(), clust->GetNCells());
 
       // switch the bad channels removal back
-      if( ! badRemoval )
+      if (!badRemoval)
         fEMCALRecoUtils->SwitchOffBadChannelsRemoval();
       
-      if( badResult )
+      if (badResult)
       {
         delete clusArr->RemoveAt(icluster);
         continue; //TODO is it really needed to remove it? Or should we flag it?
@@ -543,7 +739,7 @@ void AliEMCALTenderSupply::ProcessEvent()
     // REMOVE EXOTIC CLUSTERS -------------------------------------
     // does process local cell recalibration energy and time without replacing
     // the global cell values, in case of no cell recalib done yet
-    if( fRejectExoticClusters )
+    if (fRejectExoticClusters)
     {
       // careful, the IsExoticCluster is dependent on
       // SwitchOnRejectExoticCell, switching it ON automatically
@@ -552,24 +748,22 @@ void AliEMCALTenderSupply::ProcessEvent()
       fEMCALRecoUtils->SwitchOnRejectExoticCell();
 
       // get bunch crossing
-      Int_t bunchCrossNo = fTender->GetEvent()->GetBunchCrossNumber();
+      Int_t bunchCrossNo = event->GetBunchCrossNumber();
 
-      Bool_t exResult = fEMCALRecoUtils->IsExoticCluster(clust, cells, bunchCrossNo );
+      Bool_t exResult = fEMCALRecoUtils->IsExoticCluster(clust, cells, bunchCrossNo);
 
       // switch the exotic channels removal back
-      if( ! exRemoval )
+      if (!exRemoval)
         fEMCALRecoUtils->SwitchOffRejectExoticCell();
       
-      if( exResult )
-      {
+      if (exResult) {
         delete clusArr->RemoveAt(icluster);
         continue; //TODO is it really needed to remove it? Or should we flag it?
       }
     }
     
     // FIDUCIAL CUT -----------------------------------------------
-    if (fFiducial)
-    {
+    if (fFiducial) {
       // depends on SetNumberOfCellsFromEMCALBorder
       // SwitchOnNoFiducialBorderInEMCALEta0
       if (!fEMCALRecoUtils->CheckCellFiducialRegion(fEMCALGeo, clust, cells)){
@@ -581,28 +775,32 @@ void AliEMCALTenderSupply::ProcessEvent()
     // CLUSTER ENERGY ---------------------------------------------
     // does process local cell recalibration energy and time without replacing
     // the global cell values, in case of no cell recalib done yet
-    if( fReCalibCluster ) 
+    if (fReCalibCluster) {
       fEMCALRecoUtils->RecalibrateClusterEnergy(fEMCALGeo, clust, cells);
-
+      if (clust->E() < 1e-9) {
+        delete clusArr->RemoveAt(icluster);
+        continue;
+      }
+    }
+    
     // CLUSTER POSITION -------------------------------------------
     // does process local cell energy recalibration, if enabled and cells
-    // not calibratied yet
-    if( fRecalClusPos 
+    // not calibrated yet
+    if (fRecalClusPos
       fEMCALRecoUtils->RecalculateClusterPosition(fEMCALGeo, cells, clust);
     
     // SHOWER SHAPE -----------------------------------------------
-    if( fRecalShowerShape )
+    if (fRecalShowerShape)
       fEMCALRecoUtils->RecalculateClusterShowerShapeParameters(fEMCALGeo, cells, clust);  
 
     // NONLINEARITY -----------------------------------------------
-    if( fDoNonLinearity )
-    {
+    if (fDoNonLinearity) {
       Float_t correctedEnergy = fEMCALRecoUtils->CorrectClusterEnergyLinearity(clust);
       clust->SetE(correctedEnergy);
     }
 
     // DISTANCE TO BAD CHANNELS -----------------------------------
-    if( fRecalDistToBadChannels )
+    if (fRecalDistToBadChannels)
       fEMCALRecoUtils->RecalculateClusterDistanceToBadChannel(fEMCALGeo, cells, clust);  
   }
 
@@ -612,11 +810,10 @@ void AliEMCALTenderSupply::ProcessEvent()
     return;
 
   // TRACK MATCHING -----------------------------------------------------------
-  if (!TGeoGlobalMagField::Instance()->GetField()) 
-  {
+  if (!TGeoGlobalMagField::Instance()->GetField()) {
     event->InitMagneticField();
   }
-  
+
   fEMCALRecoUtils->FindMatches(event,0x0,fEMCALGeo);
   fEMCALRecoUtils->SetClusterMatchedToTrack(event);
   fEMCALRecoUtils->SetTracksMatchedToCluster(event);
@@ -626,8 +823,9 @@ void AliEMCALTenderSupply::ProcessEvent()
 Bool_t AliEMCALTenderSupply::InitMisalignMatrix()
 {
   // Initialising misalignment matrices
+
+  AliVEvent *event = GetEvent();
   
-  AliESDEvent *event = fTender->GetEvent();
   if (!event) 
     return kFALSE;
   
@@ -644,7 +842,7 @@ Bool_t AliEMCALTenderSupply::InitMisalignMatrix()
     for(Int_t mod=0; mod < fEMCALGeo->GetNumberOfSuperModules(); ++mod)
     {
       if (fEMCALMatrix[mod]){
-        if(fDebugLevel > 2) 
+        if (fDebugLevel > 2) 
           fEMCALMatrix[mod]->Print();
         fEMCALGeo->SetMisalMatrix(fEMCALMatrix[mod],mod);  
       }
@@ -656,55 +854,54 @@ Bool_t AliEMCALTenderSupply::InitMisalignMatrix()
   Int_t runGM = event->GetRunNumber();
   TObjArray *mobj = 0;
 
if(fMisalignSurvey == kdefault)
- { //take default alignment corresponding to run no
 if (fMisalignSurvey == kdefault)
 { //take default alignment corresponding to run no
     AliOADBContainer emcalgeoCont(Form("emcal"));
     emcalgeoCont.InitFromFile("$ALICE_ROOT/OADB/EMCAL/EMCALlocal2master.root",Form("AliEMCALgeo"));
     mobj=(TObjArray*)emcalgeoCont.GetObject(runGM,"EmcalMatrices");
- }
-
- if(fMisalignSurvey == kSurveybyS)
- { //take alignment at sector level
-  if (runGM <= 140000) { //2010 data
-    AliOADBContainer emcalgeoCont(Form("emcal2010"));
-    emcalgeoCont.InitFromFile("$ALICE_ROOT/OADB/EMCAL/EMCALlocal2master.root",Form("AliEMCALgeo"));
-    mobj=(TObjArray*)emcalgeoCont.GetObject(100,"survey10");
-    
-  } else if (runGM>140000)
-  { // 2011 LHC11a pass1 data
-    AliOADBContainer emcalgeoCont(Form("emcal2011"));
-    emcalgeoCont.InitFromFile("$ALICE_ROOT/OADB/EMCAL/EMCALlocal2master.root",Form("AliEMCALgeo"));
-    mobj=(TObjArray*)emcalgeoCont.GetObject(100,"survey11byS");      
   }
- }
+  
+  if (fMisalignSurvey == kSurveybyS)
+  { //take alignment at sector level
+    if (runGM <= 140000) { //2010 data
+      AliOADBContainer emcalgeoCont(Form("emcal2010"));
+      emcalgeoCont.InitFromFile("$ALICE_ROOT/OADB/EMCAL/EMCALlocal2master.root",Form("AliEMCALgeo"));
+      mobj=(TObjArray*)emcalgeoCont.GetObject(100,"survey10");
+    } 
+    else if (runGM>140000)
+    { // 2011 LHC11a pass1 data
+      AliOADBContainer emcalgeoCont(Form("emcal2011"));
+      emcalgeoCont.InitFromFile("$ALICE_ROOT/OADB/EMCAL/EMCALlocal2master.root",Form("AliEMCALgeo"));
+      mobj=(TObjArray*)emcalgeoCont.GetObject(100,"survey11byS");      
+    }
+  }
 
- if(fMisalignSurvey == kSurveybyM)
- { //take alignment at module level
-  if (runGM <= 140000) { //2010 data
-    AliOADBContainer emcalgeoCont(Form("emcal2010"));
-    emcalgeoCont.InitFromFile("$ALICE_ROOT/OADB/EMCAL/EMCALlocal2master.root",Form("AliEMCALgeo"));
-    mobj=(TObjArray*)emcalgeoCont.GetObject(100,"survey10");
-    
-  } else if (runGM>140000) 
-  { // 2011 LHC11a pass1 data
-    AliOADBContainer emcalgeoCont(Form("emcal2011"));
-    emcalgeoCont.InitFromFile("$ALICE_ROOT/OADB/EMCAL/EMCALlocal2master.root",Form("AliEMCALgeo"));
-    mobj=(TObjArray*)emcalgeoCont.GetObject(100,"survey11byM");      
+  if (fMisalignSurvey == kSurveybyM)
+  { //take alignment at module level
+    if (runGM <= 140000) { //2010 data
+      AliOADBContainer emcalgeoCont(Form("emcal2010"));
+      emcalgeoCont.InitFromFile("$ALICE_ROOT/OADB/EMCAL/EMCALlocal2master.root",Form("AliEMCALgeo"));
+      mobj=(TObjArray*)emcalgeoCont.GetObject(100,"survey10");
+    } 
+    else if (runGM>140000) 
+    { // 2011 LHC11a pass1 data
+      AliOADBContainer emcalgeoCont(Form("emcal2011"));
+      emcalgeoCont.InitFromFile("$ALICE_ROOT/OADB/EMCAL/EMCALlocal2master.root",Form("AliEMCALgeo"));
+      mobj=(TObjArray*)emcalgeoCont.GetObject(100,"survey11byM");      
+    }
   }
- }
 
-  if(!mobj)
-  {
+  if (!mobj) {
     AliFatal("Geometry matrix array not found");
     return kFALSE;
   }
   
- for(Int_t mod=0; mod < (fEMCALGeo->GetEMCGeometry())->GetNumberOfSuperModules(); mod++)
- {
-   fEMCALMatrix[mod] = (TGeoHMatrix*) mobj->At(mod);
-   fEMCALGeo->SetMisalMatrix(fEMCALMatrix[mod],mod); 
-   fEMCALMatrix[mod]->Print();
- }
 for(Int_t mod=0; mod < (fEMCALGeo->GetEMCGeometry())->GetNumberOfSuperModules(); mod++)
 {
+    fEMCALMatrix[mod] = (TGeoHMatrix*) mobj->At(mod);
+    fEMCALGeo->SetMisalMatrix(fEMCALMatrix[mod],mod); 
+    fEMCALMatrix[mod]->Print();
 }
   
   return kTRUE;
 }
@@ -713,7 +910,9 @@ Bool_t AliEMCALTenderSupply::InitMisalignMatrix()
 Int_t AliEMCALTenderSupply::InitBadChannels()
 {
   // Initialising bad channel maps
-  AliESDEvent *event = fTender->GetEvent();
+
+  AliVEvent *event = GetEvent();
+
   if (!event) 
     return 0;
   
@@ -721,7 +920,7 @@ Int_t AliEMCALTenderSupply::InitBadChannels()
     AliInfo("Initialising Bad channel map");
   
   // init default maps first
-  if( !fEMCALRecoUtils->GetEMCALBadChannelStatusMapArray() )
+  if (!fEMCALRecoUtils->GetEMCALBadChannelStatusMapArray())
     fEMCALRecoUtils->InitEMCALBadChannelStatusMap() ;
   
   Int_t runBC = event->GetRunNumber();
@@ -764,15 +963,6 @@ Int_t AliEMCALTenderSupply::InitBadChannels()
     AliError(Form("No external hot channel set for run number: %d", runBC));
     return 2; 
   }
-  
-  TObjArray *arrayBCpass=(TObjArray*)arrayBC->FindObject(fFilepass); // Here, it looks for a specific pass
-  if (!arrayBCpass)
-  {
-    AliError(Form("No external hot channel set for: %d -%s", runBC,fFilepass.Data()));
-    return 2; 
-  }
-
-  if (fDebugLevel>0) arrayBCpass->Print();
 
   Int_t sms = fEMCALGeo->GetEMCGeometry()->GetNumberOfSuperModules();
   for (Int_t i=0; i<sms; ++i) 
@@ -780,7 +970,7 @@ Int_t AliEMCALTenderSupply::InitBadChannels()
     TH2I *h = fEMCALRecoUtils->GetEMCALChannelStatusMap(i);
     if (h)
       delete h;
-    h=(TH2I*)arrayBCpass->FindObject(Form("EMCALBadChannelMap_Mod%d",i));
+    h=(TH2I*)arrayBC->FindObject(Form("EMCALBadChannelMap_Mod%d",i));
 
     if (!h) 
     {
@@ -798,7 +988,8 @@ Int_t AliEMCALTenderSupply::InitRecalib()
 {
   // Initialising recalibration factors.
   
-  AliESDEvent *event = fTender->GetEvent();
+  AliVEvent *event = GetEvent();
+
   if (!event) 
     return 0;
   
@@ -806,7 +997,7 @@ Int_t AliEMCALTenderSupply::InitRecalib()
     AliInfo("Initialising recalibration factors");
   
   // init default maps first
-  if( !fEMCALRecoUtils->GetEMCALRecalibrationFactorsArray() )
+  if (!fEMCALRecoUtils->GetEMCALRecalibrationFactorsArray())
     fEMCALRecoUtils->InitEMCALRecalibrationFactors() ;
 
   Int_t runRC = event->GetRunNumber();
@@ -827,23 +1018,23 @@ Int_t AliEMCALTenderSupply::InitRecalib()
     
     contRF->InitFromFile(Form("%s/EMCALRecalib.root",fBasePath.Data()),"AliEMCALRecalib");
   }
-    else
-    { // Else choose the one in the $ALICE_ROOT directory
-      if (fDebugLevel>0)  AliInfo("Loading Recalib OADB from $ALICE_ROOT/OADB/EMCAL");
-      
-      TFile *fRecalib= new TFile("$ALICE_ROOT/OADB/EMCAL/EMCALRecalib.root","read");
-      if (!fRecalib || fRecalib->IsZombie()) 
-      {
-        AliFatal("$ALICE_ROOT/OADB/EMCAL/EMCALRecalib.root was not found");
-        return 0;
-      }
-      
-      if (fRecalib) delete fRecalib;
-      
-      contRF->InitFromFile("$ALICE_ROOT/OADB/EMCAL/EMCALRecalib.root","AliEMCALRecalib");     
+  else
+  { // Else choose the one in the $ALICE_ROOT directory
+    if (fDebugLevel>0)  AliInfo("Loading Recalib OADB from $ALICE_ROOT/OADB/EMCAL");
+    
+    TFile *fRecalib= new TFile("$ALICE_ROOT/OADB/EMCAL/EMCALRecalib.root","read");
+    if (!fRecalib || fRecalib->IsZombie()) 
+    {
+      AliFatal("$ALICE_ROOT/OADB/EMCAL/EMCALRecalib.root was not found");
+      return 0;
     }
+    
+    if (fRecalib) delete fRecalib;
+      
+    contRF->InitFromFile("$ALICE_ROOT/OADB/EMCAL/EMCALRecalib.root","AliEMCALRecalib");     
+  }
 
-  TObjArray *recal=(TObjArray*)contRF->GetObject(runRC); //GetObject(int runnumber)
+  TObjArray *recal=(TObjArray*)contRF->GetObject(runRC);
   if (!recal)
   {
     AliError(Form("No Objects for run: %d",runRC));
@@ -884,11 +1075,111 @@ Int_t AliEMCALTenderSupply::InitRecalib()
   return 1;
 }
 
+//_____________________________________________________
+Int_t AliEMCALTenderSupply::InitRunDepRecalib()
+{
+  // Initialising recalibration factors.
+  
+  AliVEvent *event = GetEvent();
+  
+  if (!event) 
+    return 0;
+  
+  if (fDebugLevel>0) 
+    AliInfo("Initialising recalibration factors");
+  
+  // init default maps first
+  if (!fEMCALRecoUtils->GetEMCALRecalibrationFactorsArray())
+    fEMCALRecoUtils->InitEMCALRecalibrationFactors() ;
+  
+  Int_t runRC = event->GetRunNumber();
+  
+  AliOADBContainer *contRF=new AliOADBContainer("");
+  if (fBasePath!="") 
+  { //if fBasePath specified in the ->SetBasePath()
+    if (fDebugLevel>0)  AliInfo(Form("Loading Recalib OADB from given path %s",fBasePath.Data()));
+    
+    TFile *fRunDepRecalib= new TFile(Form("%s/EMCALTemperatureCorrCalib.root",fBasePath.Data()),"read");
+    if (!fRunDepRecalib || fRunDepRecalib->IsZombie()) 
+    {
+      AliFatal(Form("EMCALTemperatureCorrCalib.root not found in %s",fBasePath.Data()));
+      return 0;
+    }
+    
+    if (fRunDepRecalib) delete fRunDepRecalib;
+    
+    contRF->InitFromFile(Form("%s/EMCALTemperatureCorrCalib.root",fBasePath.Data()),"AliEMCALRunDepTempCalibCorrections");
+  }
+  else
+  { // Else choose the one in the $ALICE_ROOT directory
+    if (fDebugLevel>0)  AliInfo("Loading Recalib OADB from $ALICE_ROOT/OADB/EMCAL");
+    
+    TFile *fRunDepRecalib= new TFile("$ALICE_ROOT/OADB/EMCAL/EMCALTemperatureCorrCalib.root","read");
+    if (!fRunDepRecalib || fRunDepRecalib->IsZombie()) 
+    {
+      AliFatal("$ALICE_ROOT/OADB/EMCAL/EMCALTemperatureCorrCalib.root was not found");
+      return 0;
+    }
+    
+    if (fRunDepRecalib) delete fRunDepRecalib;
+    
+    contRF->InitFromFile("$ALICE_ROOT/OADB/EMCAL/EMCALTemperatureCorrCalib.root","AliEMCALRunDepTempCalibCorrections");     
+  }
+  
+  TH1S *rundeprecal=(TH1S*)contRF->GetObject(runRC);
+  if (!rundeprecal)
+  {
+    AliWarning(Form("No TemperatureCorrCalib Objects for run: %d",runRC));
+    // let's get the closest runnumber instead then..
+    Int_t lower = 0;
+    Int_t ic = 0;
+    Int_t maxEntry = contRF->GetNumberOfEntries();
+
+    while ((ic < maxEntry) && (contRF->UpperLimit(ic) < runRC)) {
+      lower = ic;
+      ic++; 
+    }
+
+    Int_t closest = lower;
+    if ((ic<maxEntry) && 
+        (contRF->LowerLimit(ic)-runRC) < (runRC - contRF->UpperLimit(lower))) {
+        closest = ic;
+    }
+
+    AliWarning(Form("TemperatureCorrCalib Objects found closest id %d from run: %d", closest, contRF->LowerLimit(closest)));
+    rundeprecal = (TH1S*) contRF->GetObjectByIndex(closest);  
+  } 
+  
+  if (fDebugLevel>0) rundeprecal->Print();
+  
+  Int_t nSM = fEMCALGeo->GetEMCGeometry()->GetNumberOfSuperModules();
+  
+  for (Int_t ism=0; ism<nSM; ++ism) 
+  {        
+    for (Int_t icol=0; icol<48; ++icol) 
+    {        
+      for (Int_t irow=0; irow<24; ++irow) 
+      {
+        Float_t factor = fEMCALRecoUtils->GetEMCALChannelRecalibrationFactor(ism,icol,irow);
+        
+        Int_t absID = fEMCALGeo->GetAbsCellIdFromCellIndexes(ism, irow, icol); // original calibration factor
+        factor *= rundeprecal->GetBinContent(absID) / 10000. ; // correction dependent on T
+
+        fEMCALRecoUtils->SetEMCALChannelRecalibrationFactor(ism,icol,irow,factor);
+      } // columns
+    } // rows 
+  } // SM loop
+  
+  return 1;
+}
+
+
 //_____________________________________________________
 Int_t AliEMCALTenderSupply::InitTimeCalibration()
 {
   // Initialising bad channel maps
-  AliESDEvent *event = fTender->GetEvent();
+  AliVEvent *event = GetEvent();
+
   if (!event) 
     return 0;
   
@@ -896,7 +1187,7 @@ Int_t AliEMCALTenderSupply::InitTimeCalibration()
     AliInfo("Initialising time calibration map");
   
   // init default maps first
-  if( !fEMCALRecoUtils->GetEMCALTimeRecalibrationFactorsArray() )
+  if (!fEMCALRecoUtils->GetEMCALTimeRecalibrationFactorsArray())
     fEMCALRecoUtils->InitEMCALTimeRecalibrationFactors() ;
 
   Int_t runBC = event->GetRunNumber();
@@ -940,19 +1231,22 @@ Int_t AliEMCALTenderSupply::InitTimeCalibration()
     return 2; 
   }
   
-  TObjArray *arrayBCpass=(TObjArray*)arrayBC->FindObject(fFilepass); // Here, it looks for a specific pass
+  // Here, it looks for a specific pass
+  TString pass = fFilepass;
+  if (fFilepass=="calo_spc") pass ="pass1";
+  TObjArray *arrayBCpass=(TObjArray*)arrayBC->FindObject(pass);
   if (!arrayBCpass)
   {
-    AliError(Form("No external time calibration set for: %d -%s", runBC,fFilepass.Data()));
+    AliError(Form("No external time calibration set for: %d -%s", runBC,pass.Data()));
     return 2; 
   }
 
   if (fDebugLevel>0) arrayBCpass->Print();
 
-  for( Int_t i = 0; i < 4; i++ )
+  for(Int_t i = 0; i < 4; i++)
   {
-    TH1F *h = fEMCALRecoUtils->GetEMCALChannelTimeRecalibrationFactors( i );
-    if( h )
+    TH1F *h = fEMCALRecoUtils->GetEMCALChannelTimeRecalibrationFactors(i);
+    if (h)
       delete h;
     
     h = (TH1F*)arrayBCpass->FindObject(Form("hAllTimeAvBC%d",i));
@@ -975,28 +1269,36 @@ void AliEMCALTenderSupply::UpdateCells()
   //Recalibrate energy and time cells 
   //This is required for later reclusterization
 
-  AliESDCaloCells *cells = fTender->GetEvent()->GetEMCALCells();
-  Int_t bunchCrossNo = fTender->GetEvent()->GetBunchCrossNumber();
+  AliVEvent *event = GetEvent();
+
+  if (!event) return ;
+  
+  AliVCaloCells *cells = event->GetEMCALCells();
+  Int_t bunchCrossNo = event->GetBunchCrossNumber();
 
   fEMCALRecoUtils->RecalibrateCells(cells, bunchCrossNo); 
   
   // remove exotic cells - loop through cells and zero the exotic ones
   // just like with bad cell rejection in reco utils (inside RecalibrateCells)
-  if( fRejectExoticCells )
+  if (fRejectExoticCells)
   {
-    Int_t    absId  =-1;
+    Short_t  absId  =-1;
+    Double_t ecell = 0;
+    Double_t tcell = 0;
+    Double_t efrac = 0;
+    Int_t  mclabel = -1;
     Bool_t   isExot = kFALSE;
   
     // loop through cells
     Int_t nEMcell  = cells->GetNumberOfCells() ;  
     for (Int_t iCell = 0; iCell < nEMcell; iCell++) 
     { 
-      absId  = cells->GetCellNumber(iCell);
+      cells->GetCell(iCell, absId, ecell, tcell, mclabel, efrac);
     
-      isExot = fEMCALRecoUtils->IsExoticCell( absId, cells, bunchCrossNo ); 
+      isExot = fEMCALRecoUtils->IsExoticCell(absId, cells, bunchCrossNo); 
       // zero if exotic
-      if( isExot )
-        cells->SetCell( iCell, absId, 0.0, 0.0 );
+      if (isExot)
+        cells->SetCell(iCell, absId, 0.0, -1.0, mclabel, efrac);
     } // cell loop
   } // reject exotic cells
 
@@ -1004,29 +1306,74 @@ void AliEMCALTenderSupply::UpdateCells()
 }
 
 //_____________________________________________________
-void AliEMCALTenderSupply::InitRecParam()
+TString AliEMCALTenderSupply::GetBeamType()
 {
-  // Initalize the reconstructor parameters
-  // Depending on the data type, different type of clusterizer
+  // Get beam type : pp-AA-pA
+  // ESDs have it directly, AODs get it from hardcoded run number ranges
   
-  if (fDebugLevel>0) 
-    AliInfo("Initialize the recParam");
+  AliVEvent *event = GetEvent();
 
-  fRecParam = new AliEMCALRecParam;
-  const AliESDRun *run = fTender->GetEvent()->GetESDRun();
-  TString bt(run->GetBeamType());
-  if (bt=="A-A") 
+  if (!event) { 
+    AliError("Couldn't retrieve event!");
+    return "";
+  }
+
+  TString beamType;
+
+  AliESDEvent *esd = dynamic_cast<AliESDEvent*>(event);
+  if (esd) {
+    const AliESDRun *run = esd->GetESDRun();
+    beamType = run->GetBeamType();
+  }
+  else
   {
+    Int_t runNumber = event->GetRunNumber();
+    if ((runNumber >= 136851 && runNumber <= 139517)  // LHC10h
+  || (runNumber >= 166529 && runNumber <= 170593))  // LHC11h
+    {
+      beamType = "A-A";
+    }
+    else 
+    {
+      beamType = "p-p";
+    }
+  }
+
+  return beamType;    
+}
+
+//_____________________________________________________
+Int_t AliEMCALTenderSupply::InitRecParam()
+{
+  // Init reco params if not yet exist (probably shipped by the user already)
+
+  if (fRecParam != 0)
+    return 2;
+
+  TString beamType = GetBeamType();
+
+  // set some default reco params
+  fRecParam = new AliEMCALRecParam();
+  fRecParam->SetClusteringThreshold(0.100);
+  fRecParam->SetMinECut(0.050);
+  
+  if (!fCalibrateTimeParamAvailable) {
+    fRecParam->SetTimeCut(250*1.e-9);
+    fRecParam->SetTimeMin(425*1.e-9);
+    fRecParam->SetTimeMax(825*1.e-9);
+  } else {
+    fRecParam->SetTimeCut(100*1.e-9);
+    fRecParam->SetTimeMin(-50*1.e-9);
+    fRecParam->SetTimeMax(50*1.e-9);
+  }
+  
+  if (beamType == "A-A") {
     fRecParam->SetClusterizerFlag(AliEMCALRecParam::kClusterizerv2);
-    fRecParam->SetClusteringThreshold(0.100);
-    fRecParam->SetMinECut(0.050);
-  } 
-  else 
-  {
+  } else {
     fRecParam->SetClusterizerFlag(AliEMCALRecParam::kClusterizerv1);
-    fRecParam->SetClusteringThreshold(0.100);
-    fRecParam->SetMinECut(0.050);
   }
+
+  return 0;
 }
 
 //_____________________________________________________
@@ -1034,7 +1381,8 @@ Bool_t AliEMCALTenderSupply::InitClusterization()
 {
   // Initialing clusterization/unfolding algorithm and set all the needed parameters.
   
-  AliESDEvent *event = fTender->GetEvent();
+  AliVEvent *event = GetEvent();
+
   if (!event) 
     return kFALSE;
   
@@ -1042,7 +1390,12 @@ Bool_t AliEMCALTenderSupply::InitClusterization()
     AliInfo(Form("Initialising reclustering parameters: Clusterizer type: %d",fRecParam->GetClusterizerFlag()));
   
   //---setup clusterizer
-  delete fClusterizer;
+  if (fClusterizer) {
+    // avoid deleting fDigitsArr
+    fClusterizer->SetDigitsArr(0);
+    delete fClusterizer;
+    fClusterizer = 0;
+  }
   if     (fRecParam->GetClusterizerFlag() == AliEMCALRecParam::kClusterizerv1)
     fClusterizer = new AliEMCALClusterizerv1 (fEMCALGeo);
   else if (fRecParam->GetClusterizerFlag() == AliEMCALRecParam::kClusterizerv2) 
@@ -1061,16 +1414,16 @@ Bool_t AliEMCALTenderSupply::InitClusterization()
   }
   
   // Set the clustering parameters
-  fClusterizer->SetECAClusteringThreshold( fRecParam->GetClusteringThreshold() );
-  fClusterizer->SetECALogWeight          ( fRecParam->GetW0()                  );
-  fClusterizer->SetMinECut               ( fRecParam->GetMinECut()             );    
-  fClusterizer->SetUnfolding             ( fRecParam->GetUnfold()              );
-  fClusterizer->SetECALocalMaxCut        ( fRecParam->GetLocMaxCut()           );
-  fClusterizer->SetTimeCut               ( fRecParam->GetTimeCut()             );
-  fClusterizer->SetTimeMin               ( fRecParam->GetTimeMin()             );
-  fClusterizer->SetTimeMax               ( fRecParam->GetTimeMax()             );
-  fClusterizer->SetInputCalibrated       ( kTRUE                               );
-  fClusterizer->SetJustClusters          ( kTRUE                               );  
+  fClusterizer->SetECAClusteringThreshold(fRecParam->GetClusteringThreshold());
+  fClusterizer->SetECALogWeight          (fRecParam->GetW0()                 );
+  fClusterizer->SetMinECut               (fRecParam->GetMinECut()            );    
+  fClusterizer->SetUnfolding             (fRecParam->GetUnfold()             );
+  fClusterizer->SetECALocalMaxCut        (fRecParam->GetLocMaxCut()          );
+  fClusterizer->SetTimeCut               (fRecParam->GetTimeCut()            );
+  fClusterizer->SetTimeMin               (fRecParam->GetTimeMin()            );
+  fClusterizer->SetTimeMax               (fRecParam->GetTimeMax()            );
+  fClusterizer->SetInputCalibrated       (kTRUE                              );
+  fClusterizer->SetJustClusters          (kTRUE                              );  
   
   // In case of unfolding after clusterization is requested, set the corresponding parameters
   if (fRecParam->GetUnfold()) 
@@ -1098,36 +1451,71 @@ void AliEMCALTenderSupply::FillDigitsArray()
 {
   // Fill digits from cells to a TClonesArray.
   
-  AliESDEvent *event = fTender->GetEvent();
-  if (!event)
+  AliVEvent *event = GetEvent();
+
+ if (!event)
     return;
-  
+    
+  // In case of MC productions done before aliroot tag v5-02-Rev09
+  // assing the cluster label to all the cells belonging to this cluster
+  // very rough
+  Int_t cellLabels[12672];
+  if (fSetCellMCLabelFromCluster)
+  {
+    for (Int_t i = 0; i < 12672; i++)
+    {
+      cellLabels       [i] = 0 ;
+      fOrgClusterCellId[i] =-1 ;
+    }
+    
+    Int_t nClusters = event->GetNumberOfCaloClusters();
+    for (Int_t i = 0; i < nClusters; i++)
+    {
+      AliVCluster *clus =  event->GetCaloCluster(i);
+      
+      if (!clus) continue;
+      
+      if (!clus->IsEMCAL()) continue ;
+      
+      Int_t      label = clus->GetLabel();
+      UShort_t * index = clus->GetCellsAbsId() ;
+      
+      for(Int_t icell=0; icell < clus->GetNCells(); icell++)
+      {
+        cellLabels       [index[icell]] = label;
+        fOrgClusterCellId[index[icell]] = i ; // index of the original cluster
+      }
+    }// cluster loop
+  }
+
   fDigitsArr->Clear("C");
-  AliESDCaloCells *cells = event->GetEMCALCells();
+  AliVCaloCells *cells = event->GetEMCALCells();
   Int_t ncells = cells->GetNumberOfCells();
   for (Int_t icell = 0, idigit = 0; icell < ncells; ++icell) 
   {
-    Double_t cellAmplitude=0, cellTime=0;
+    Double_t cellAmplitude=0, cellTime=0, efrac = 0;
     Short_t  cellNumber=0;
+    Int_t mcLabel=-1;
 
-    if (cells->GetCell(icell, cellNumber, cellAmplitude, cellTime) != kTRUE)
+    if (cells->GetCell(icell, cellNumber, cellAmplitude, cellTime, mcLabel, efrac) != kTRUE)
       break;
 
-    // Do not add if already too low (some cells set to 0 if bad channels)
-    if (cellAmplitude < fRecParam->GetMinECut() ) 
+    // Do not add if energy already too low (some cells set to 0 if bad channels)
+    if (cellAmplitude < fRecParam->GetMinECut())
       continue;
 
     // If requested, do not include exotic cells
    if (fEMCALRecoUtils->IsExoticCell(cellNumber,cells,event->GetBunchCrossNumber())) 
       continue;
-        
-    AliEMCALDigit *digit = static_cast<AliEMCALDigit*>(fDigitsArr->New(idigit));
-    digit->SetId(cellNumber);
-    digit->SetTime(cellTime);
-    digit->SetTimeR(cellTime);
-    digit->SetIndexInList(idigit);
-    digit->SetType(AliEMCALDigit::kHG);
-    digit->SetAmplitude(cellAmplitude);
+    
+    if      (fSetCellMCLabelFromCluster) mcLabel = cellLabels[cellNumber];
+    else if (fRemapMCLabelForAODs     ) RemapMCLabelForAODs(mcLabel);
+    
+    if (mcLabel > 0 && efrac < 1e-6) efrac = 1;
+    
+    new((*fDigitsArr)[idigit]) AliEMCALDigit(mcLabel, mcLabel, cellNumber,
+                                             (Float_t)cellAmplitude, (Float_t)cellTime,
+                                             AliEMCALDigit::kHG,idigit, 0, 0, efrac*cellAmplitude);
     idigit++;
   }
 }
@@ -1145,7 +1533,8 @@ void AliEMCALTenderSupply::UpdateClusters()
 {
   // Update ESD cluster list.
   
-  AliESDEvent *event = fTender->GetEvent();
+  AliVEvent *event = GetEvent();
+
   if (!event)
     return;
   
@@ -1157,30 +1546,37 @@ void AliEMCALTenderSupply::UpdateClusters()
     AliError(" Null pointer to calo clusters array, returning");
     return;
   }
-  
+    
+  // Before destroying the orignal list, assign to the rec points the MC labels
+  // of the original clusters, if requested
+  if (fSetCellMCLabelFromCluster == 2) 
+    SetClustersMCLabelFromOriginalClusters() ;
+
   Int_t nents = clus->GetEntriesFast();
   for (Int_t i=0; i < nents; ++i) 
   {
-    AliESDCaloCluster *c = static_cast<AliESDCaloCluster*>(clus->At(i));
+    AliVCluster *c = dynamic_cast<AliVCluster*>(clus->At(i));
     if (!c)
       continue;
     if (c->IsEMCAL())
+    {
       delete clus->RemoveAt(i);
+    }
   }
   
   clus->Compress();
   
   RecPoints2Clusters(clus);
-  
 }
 
 //_____________________________________________________
 void AliEMCALTenderSupply::RecPoints2Clusters(TClonesArray *clus)
 {
-  // Convert AliEMCALRecoPoints to AliESDCaloClusters.
+  // Convert AliEMCALRecoPoints to AliESDCaloClusters/AliAODCaloClusters.
   // Cluster energy, global position, cells and their amplitude fractions are restored.
   
-  AliESDEvent *event = fTender->GetEvent();
+  AliVEvent *event = GetEvent();
+
   if (!event)
     return;
 
@@ -1217,7 +1613,7 @@ void AliEMCALTenderSupply::RecPoints2Clusters(TClonesArray *clus)
     Float_t g[3];
     gpos.GetXYZ(g);
     
-    AliESDCaloCluster *c = static_cast<AliESDCaloCluster*>(clus->New(nout++));
+    AliVCluster *c = static_cast<AliVCluster*>(clus->New(nout++));
     c->SetID(nout-1); 
     c->SetType(AliVCluster::kEMCALClusterv1);
     c->SetE(recpoint->GetEnergy());
@@ -1232,16 +1628,166 @@ void AliEMCALTenderSupply::RecPoints2Clusters(TClonesArray *clus)
     recpoint->GetElipsAxis(elipAxis);
     c->SetM02(elipAxis[0]*elipAxis[0]) ;
     c->SetM20(elipAxis[1]*elipAxis[1]) ;
-    AliESDCaloCluster *cesd = static_cast<AliESDCaloCluster*>(c);
-    cesd->SetCellsAbsId(absIds);
-    cesd->SetCellsAmplitudeFraction(ratios);
+    c->SetCellsAbsId(absIds);
+    c->SetCellsAmplitudeFraction(ratios);
+
+    //MC labels
+    Int_t  parentMult = 0;
+    Int_t *parentList = recpoint->GetParents(parentMult);
+    if (parentMult > 0) c->SetLabel(parentList, parentMult);
+
+  }
+}
+
+//___________________________________________________________
+void AliEMCALTenderSupply::RemapMCLabelForAODs(Int_t & label)
+{
+  // MC label for Cells not remapped after ESD filtering, do it here.
+  
+  if (label < 0) return;
+  
+  AliAODEvent  * evt = dynamic_cast<AliAODEvent*> (GetEvent()) ;
+  if (!evt) return ;
+  
+  TClonesArray * arr = dynamic_cast<TClonesArray*>(evt->FindListObject("mcparticles")) ;
+  if (!arr) return ;
+  
+  if (label < arr->GetEntriesFast())
+  {
+    AliAODMCParticle * particle = dynamic_cast<AliAODMCParticle *>(arr->At(label));
+    if (!particle) return ;
+    
+    if (label == particle->Label()) return ; // label already OK
+  }
+  
+  // loop on the particles list and check if there is one with the same label
+  for (Int_t ind = 0; ind < arr->GetEntriesFast(); ind++)
+  {
+    AliAODMCParticle * particle = dynamic_cast<AliAODMCParticle *>(arr->At(ind));
+    if (!particle) continue ;
+    
+    if (label == particle->Label())
+    {
+      label = ind;
+      return;
+    }
   }
+  
+  label = -1;
+}
+
+//_____________________________________________________________________________________________
+void AliEMCALTenderSupply::SetClustersMCLabelFromOriginalClusters()
+{
+  // Get the original clusters that contribute to the new rec point cluster,
+  // assign the labels of such clusters to the new rec point cluster.
+  // Only approximatedly valid  when output are V1 clusters, or input/output clusterizer
+  // are the same handle with care
+  // Copy from same method in AliAnalysisTaskEMCALClusterize, but here modify the recpoint and
+  // not the output calocluster
+  
+  Int_t ncls = fClusterArr->GetEntriesFast();
+  for(Int_t irp=0; irp < ncls; ++irp)
+  {
+    TArrayI clArray(300) ; //Weird if more than a few clusters are in the origin ...
+    clArray.Reset();
+    Int_t nClu = 0;
+    Int_t nLabTotOrg = 0;
+    Float_t emax = -1;
+    Int_t idMax = -1;
+    
+    AliEMCALRecPoint *clus = static_cast<AliEMCALRecPoint*>(fClusterArr->At(irp));
+    
+    //Find the clusters that originally had the cells
+    const Int_t ncells = clus->GetMultiplicity();
+    Int_t *digList     = clus->GetDigitsList();
+    
+    for (Int_t iLoopCell = 0 ; iLoopCell < ncells ; iLoopCell++)
+    {
+      AliEMCALDigit *digit = static_cast<AliEMCALDigit*>(fDigitsArr->At(digList[iLoopCell]));
+      Int_t idCell = digit->GetId();
+
+      if (idCell>=0)
+      {
+        Int_t idCluster = fOrgClusterCellId[idCell];
+        Bool_t set = kTRUE;
+        for (Int_t icl =0; icl < nClu; icl++)
+        {
+          if (((Int_t)clArray.GetAt(icl))==-1) continue;
+          if (idCluster == ((Int_t)clArray.GetAt(icl))) set = kFALSE;
+        }
+        if (set && idCluster >= 0)
+        {
+          clArray.SetAt(idCluster,nClu++);
+          nLabTotOrg+=(GetEvent()->GetCaloCluster(idCluster))->GetNLabels();
+                    
+          //Search highest E cluster
+          AliVCluster * clOrg = GetEvent()->GetCaloCluster(idCluster);
+          if (emax < clOrg->E())
+          {
+            emax  = clOrg->E();
+            idMax = idCluster;
+          }
+        }
+      }
+    }// cell loop
+        
+    // Put the first in the list the cluster with highest energy
+    if (idMax != ((Int_t)clArray.GetAt(0))) // Max not at first position
+    {
+      Int_t maxIndex = -1;
+      Int_t firstCluster = ((Int_t)clArray.GetAt(0));
+      for (Int_t iLoopCluster = 0 ; iLoopCluster < nClu ; iLoopCluster++)
+      {
+        if (idMax == ((Int_t)clArray.GetAt(iLoopCluster))) maxIndex = iLoopCluster;
+      }
+      
+      if (firstCluster >=0 && idMax >=0)
+      {
+        clArray.SetAt(idMax,0);
+        clArray.SetAt(firstCluster,maxIndex);
+      }
+    }
+    
+    // Get the labels list in the original clusters, assign all to the new cluster
+    TArrayI clMCArray(nLabTotOrg) ;
+    clMCArray.Reset();
+    
+    Int_t nLabTot = 0;
+    for (Int_t iLoopCluster = 0 ; iLoopCluster < nClu ; iLoopCluster++)
+    {
+      Int_t idCluster = (Int_t) clArray.GetAt(iLoopCluster);
+      AliVCluster * clOrg = GetEvent()->GetCaloCluster(idCluster);
+      Int_t nLab = clOrg->GetNLabels();
+      
+      for (Int_t iLab = 0 ; iLab < nLab ; iLab++)
+      {
+        Int_t lab = clOrg->GetLabelAt(iLab) ;
+        if (lab>=0)
+        {
+          Bool_t set = kTRUE;
+          for(Int_t iLabTot =0; iLabTot < nLabTot; iLabTot++)
+          {
+            if (lab == ((Int_t)clMCArray.GetAt(iLabTot))) set = kFALSE;
+          }
+          if (set) clMCArray.SetAt(lab,nLabTot++);
+        }
+      }
+    }// cluster loop
+    
+    // Set the final list of labels to rec point
+    
+    Int_t *labels = new Int_t[nLabTot];
+    for(Int_t il = 0; il < nLabTot; il++) labels[il] = clMCArray.GetArray()[il];
+    clus->SetParents(nLabTot,labels);
+    
+  } // rec point array
 }
 
 //_____________________________________________________
 void AliEMCALTenderSupply::GetPass()
 {
-  // Get passx from filename.
+  // Get passx from filename
   
   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
   fInputTree = mgr->GetTree();
@@ -1262,10 +1808,20 @@ void AliEMCALTenderSupply::GetPass()
   if      (fname.Contains("pass1")) fFilepass = TString("pass1");
   else if (fname.Contains("pass2")) fFilepass = TString("pass2");
   else if (fname.Contains("pass3")) fFilepass = TString("pass3");
-  else 
+  else if (fname.Contains("pass4")) fFilepass = TString("pass4");
+  else if (fname.Contains("pass5")) fFilepass = TString("pass5");
+  else if (fname.Contains("LHC11c") &&
+           fname.Contains("spc_calo")) fFilepass = TString("spc_calo");
+  else if (fname.Contains("calo") || fname.Contains("high_lumi"))
+
+  {
+    //printf("AliEMCALTenderSupply::GetPass() - Path contains <calo> or <high-lumi>, set as <pass1>\n");
+    fFilepass = TString("pass1");
+  }
+  else if (fname.Contains("LHC14a1a")) fFilepass = TString("LHC14a1a");
+  else
   {
     AliError(Form("Pass number string not found: %s", fname.Data()));
     return;            
   }
 }
-