]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EMCAL/AliEMCALClusterizerv1.cxx
Test beam raw data reading
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALClusterizerv1.cxx
index a298ffefbcf4637037d7f4722407fb025323c8cb..c92a95a51d6f18e560c04bbae0c09caddf29f2ce 100644 (file)
 
 /* $Id$ */
 
-//*-- Author: Yves Schutz (SUBATECH)  & Dmitri Peressounko (SUBATECH & Kurchatov Institute)
+//-- Author: Yves Schutz (SUBATECH)  & Dmitri Peressounko (SUBATECH & Kurchatov Institute)
 //  August 2002 Yves Schutz: clone PHOS as closely as possible and intoduction
 //                           of new  IO (à la PHOS)
+//  Mar 2007, Aleksei Pavlinov - new algoritmh of pseudo clusters
 //////////////////////////////////////////////////////////////////////////////
 //  Clusterization class. Performs clusterization (collects neighbouring active cells) and 
 //  unfolds the clusters having several local maxima.  
@@ -45,6 +46,7 @@
 //               // time - print benchmarking results
 
 // --- ROOT system ---
+#include <cassert>
 
 class TROOT;
 #include <TH1.h>
@@ -56,6 +58,7 @@ class TFolder;
 class TSystem; 
 #include <TBenchmark.h>
 #include <TBrowser.h>
+#include <TROOT.h>
 
 // --- Standard library ---
 
@@ -64,7 +67,6 @@ class TSystem;
 #include "AliRunLoader.h"
 #include "AliRun.h"
 #include "AliESD.h"
-#include "AliEMCALLoader.h"
 #include "AliEMCALClusterizerv1.h"
 #include "AliEMCALRecPoint.h"
 #include "AliEMCALDigit.h"
@@ -72,6 +74,8 @@ class TSystem;
 #include "AliEMCAL.h"
 #include "AliEMCALGeometry.h"
 #include "AliEMCALHistoUtilities.h"
+#include "AliEMCALRecParam.h"
+#include "AliEMCALReconstructor.h"
 #include "AliCDBManager.h"
 
 class AliCDBStorage;
@@ -80,27 +84,8 @@ class AliCDBStorage;
 ClassImp(AliEMCALClusterizerv1)
 
 //____________________________________________________________________________
-AliEMCALClusterizerv1::AliEMCALClusterizerv1() 
+AliEMCALClusterizerv1::AliEMCALClusterizerv1()
   : AliEMCALClusterizer(),
-    fHists(0),fPointE(0),fPointL1(0),fPointL2(0),
-    fPointDis(0),fPointMult(0),fDigitAmp(0),fMaxE(0),
-    fMaxL1(0),fMaxL2(0),fMaxDis(0),fGeom(0),
-    fDefaultInit(kTRUE),
-    fToUnfold(kFALSE),
-    fNumberOfECAClusters(0),fNTowerInGroup(0),fCalibData(0),
-    fADCchannelECA(0.),fADCpedestalECA(0.),fECAClusteringThreshold(0.),fECALocMaxCut(0.),
-    fECAW0(0.),fRecPointsInRun(0),fTimeGate(0.),fMinECut(0.)
-{
-  // default ctor (to be used mainly by Streamer)
-  
-  InitParameters() ; 
-  fGeom = AliEMCALGeometry::GetInstance();
-  fGeom->GetTransformationForSM(); // Global <-> Local
-}
-
-//____________________________________________________________________________
-AliEMCALClusterizerv1::AliEMCALClusterizerv1(const TString alirunFileName, const TString eventFolderName)
-  : AliEMCALClusterizer(alirunFileName, eventFolderName),
     fHists(0),fPointE(0),fPointL1(0),fPointL2(0),
     fPointDis(0),fPointMult(0),fDigitAmp(0),fMaxE(0),
     fMaxL1(0),fMaxL2(0),fMaxDis(0),fGeom(0),
@@ -108,7 +93,7 @@ AliEMCALClusterizerv1::AliEMCALClusterizerv1(const TString alirunFileName, const
     fToUnfold(kFALSE),
     fNumberOfECAClusters(0),fNTowerInGroup(0),fCalibData(0),
     fADCchannelECA(0.),fADCpedestalECA(0.),fECAClusteringThreshold(0.),fECALocMaxCut(0.),
-    fECAW0(0.),fRecPointsInRun(0),fTimeGate(0.),fMinECut(0.)
+    fECAW0(0.),fTimeCut(0.),fMinECut(0.)
 {
   // ctor with the indication of the file where header Tree and digits Tree are stored
   
@@ -116,50 +101,12 @@ AliEMCALClusterizerv1::AliEMCALClusterizerv1(const TString alirunFileName, const
   Init() ;
 }
 
-//____________________________________________________________________________
-AliEMCALClusterizerv1::AliEMCALClusterizerv1(const AliEMCALClusterizerv1& clus)
-  : AliEMCALClusterizer(clus),
-    fHists(clus.fHists),
-    fPointE(clus.fPointE),
-    fPointL1(clus.fPointL1),
-    fPointL2(clus.fPointL2),
-    fPointDis(clus.fPointDis),
-    fPointMult(clus.fPointMult),
-    fDigitAmp(clus.fDigitAmp),
-    fMaxE(clus.fMaxE),
-    fMaxL1(clus.fMaxL1),
-    fMaxL2(clus.fMaxL2),
-    fMaxDis(clus.fMaxDis),
-    fGeom(clus.fGeom),
-    fDefaultInit(clus.fDefaultInit),
-    fToUnfold(clus.fToUnfold),
-    fNumberOfECAClusters(clus.fNumberOfECAClusters),
-    fNTowerInGroup(clus.fNTowerInGroup),
-    fCalibData(clus.fCalibData),
-    fADCchannelECA(clus.fADCchannelECA),
-    fADCpedestalECA(clus.fADCpedestalECA),
-    fECAClusteringThreshold(clus.fECAClusteringThreshold),
-    fECALocMaxCut(clus.fECALocMaxCut),
-    fECAW0(clus.fECAW0),
-    fRecPointsInRun(clus.fRecPointsInRun),
-    fTimeGate(clus.fTimeGate),
-    fMinECut(clus.fMinECut)
-{
-  //copy ctor
-}
-
 //____________________________________________________________________________
   AliEMCALClusterizerv1::~AliEMCALClusterizerv1()
 {
   // dtor
 }
 
-//____________________________________________________________________________
-const TString AliEMCALClusterizerv1::BranchName() const 
-{ 
-   return GetName();
-}
-
 //____________________________________________________________________________
 Float_t  AliEMCALClusterizerv1::Calibrate(Int_t amp, Int_t AbsId) 
 {
@@ -169,18 +116,6 @@ Float_t  AliEMCALClusterizerv1::Calibrate(Int_t amp, Int_t AbsId)
   // or from digitizer parameters for simulated data.
 
   if(fCalibData){
-
-    //JLK 13-Mar-2006
-    //We now get geometry at a higher level
-    //
-    // Loader
-    //    AliRunLoader *rl = AliRunLoader::GetRunLoader();
-    
-    // Load EMCAL Geomtry
-    //    rl->LoadgAlice(); 
-    //AliRun   * gAlice = rl->GetAliRun(); 
-    //AliEMCAL * emcal  = (AliEMCAL*)gAlice->GetDetector("EMCAL");
-    //AliEMCALGeometry * geom = emcal->GetGeometry();
     
     if (fGeom==0)
       AliFatal("Did not get geometry from EMCALLoader") ;
@@ -198,11 +133,13 @@ Float_t  AliEMCALClusterizerv1::Calibrate(Int_t amp, Int_t AbsId)
       Error("Calibrate()"," Wrong cell id number : %i", AbsId);
       assert(0);
     }
+
     fGeom->GetCellPhiEtaIndexInSModule(iSupMod,nModule,nIphi, nIeta,iphi,ieta);
 
     fADCchannelECA  = fCalibData->GetADCchannel (iSupMod,ieta,iphi);
     fADCpedestalECA = fCalibData->GetADCpedestal(iSupMod,ieta,iphi);
-    return -fADCpedestalECA + amp * fADCchannelECA ;        
+  
+   return -fADCpedestalECA + amp * fADCchannelECA ;        
  
   }
   else //Return energy with default parameters if calibration is not available
@@ -211,61 +148,58 @@ Float_t  AliEMCALClusterizerv1::Calibrate(Int_t amp, Int_t AbsId)
 }
 
 //____________________________________________________________________________
-void AliEMCALClusterizerv1::Exec(Option_t * option)
+void AliEMCALClusterizerv1::Digits2Clusters(Option_t * option)
 {
-  // Steering method to perform clusterization for events
-  // in the range from fFirstEvent to fLastEvent.
-  // This range is optionally set by SetEventRange().
-  // if fLastEvent=-1 (by default), then process events until the end.
+  // Steering method to perform clusterization for the current event 
+  // in AliEMCALLoader
 
   if(strstr(option,"tim"))
     gBenchmark->Start("EMCALClusterizer"); 
   
   if(strstr(option,"print"))
     Print("") ; 
-
-  AliRunLoader *rl = AliRunLoader::GetRunLoader();
-  AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(rl->GetDetectorLoader("EMCAL"));
-
   //Get calibration parameters from file or digitizer default values.
   GetCalibrationParameters() ;
 
-  if (fLastEvent == -1) 
-    fLastEvent = rl->GetNumberOfEvents() - 1;
-  Int_t nEvents   = fLastEvent - fFirstEvent + 1;
 
-  Int_t ievent ;
-  rl->LoadDigits("EMCAL");
-  for (ievent = fFirstEvent; ievent <= fLastEvent; ievent++) {
-    rl->GetEvent(ievent);
+  fNumberOfECAClusters = 0;
 
-    fNumberOfECAClusters = 0;
+  if(strstr(option,"pseudo"))
+    MakeClusters("pseudo") ;  //both types
+  else
+    MakeClusters("") ;  //only the real clusters
 
-    if(strstr(option,"pseudo"))
-      MakeClusters("pseudo") ;  //both types
-    else
-      MakeClusters("") ;  //only the real clusters
+  if(fToUnfold)
+    MakeUnfolding() ;
 
-    if(fToUnfold)
-      MakeUnfolding() ;
+  Int_t index ;
 
-    WriteRecPoints() ;
+  //Evaluate position, dispersion and other RecPoint properties for EC section                      
+  for(index = 0; index < fRecPoints->GetEntries(); index++) {
+    if (dynamic_cast<AliEMCALRecPoint *>(fRecPoints->At(index))->GetClusterType() != AliESDCaloCluster::kEMCALPseudoCluster)
+      dynamic_cast<AliEMCALRecPoint *>(fRecPoints->At(index))->EvalAll(fECAW0,fDigitsArr) ;
+  }
 
-    if(strstr(option,"deb") || strstr(option,"all"))  
-      PrintRecPoints(option) ;
+  fRecPoints->Sort() ;
 
-    //increment the total number of recpoints per run   
-    fRecPointsInRun += emcalLoader->RecPoints()->GetEntriesFast() ;  
+  for(index = 0; index < fRecPoints->GetEntries(); index++) {
+    (dynamic_cast<AliEMCALRecPoint *>(fRecPoints->At(index)))->SetIndexInList(index) ;
+    (dynamic_cast<AliEMCALRecPoint *>(fRecPoints->At(index)))->Print();
   }
+
+  fTreeR->Fill();
   
-  Unload();
+  if(strstr(option,"deb") || strstr(option,"all"))  
+    PrintRecPoints(option) ;
+
+  AliDebug(1,Form("EMCAL Clusterizer found %d Rec Points",fRecPoints->GetEntriesFast()));
 
   if(strstr(option,"tim")){
     gBenchmark->Stop("EMCALClusterizer");
-    printf("Exec took %f seconds for Clusterizing %f seconds per event", 
-        gBenchmark->GetCpuTime("EMCALClusterizer"), gBenchmark->GetCpuTime("EMCALClusterizer")/nEvents );
-  }
-
+    printf("Exec took %f seconds for Clusterizing", 
+          gBenchmark->GetCpuTime("EMCALClusterizer"));
+  }    
 }
 
 //____________________________________________________________________________
@@ -276,16 +210,13 @@ Bool_t AliEMCALClusterizerv1::FindFit(AliEMCALRecPoint * emcRP, AliEMCALDigit **
   // The initial values for fitting procedure are set equal to the positions of local maxima.
   // Cluster will be fitted as a superposition of nPar/3 electromagnetic showers
 
-  AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
-  TClonesArray *digits = emcalLoader->Digits();
-
   gMinuit->mncler();                     // Reset Minuit's list of paramters
   gMinuit->SetPrintLevel(-1) ;           // No Printout
   gMinuit->SetFCN(AliEMCALClusterizerv1::UnfoldingChiSquare) ;  
                                          // To set the address of the minimization function 
   TList * toMinuit = new TList();
   toMinuit->AddAt(emcRP,0) ;
-  toMinuit->AddAt(digits,1) ;
+  toMinuit->AddAt(fDigitsArr,1) ;
   
   gMinuit->SetObjectFit(toMinuit) ;         // To tranfer pointer to UnfoldingChiSquare
 
@@ -370,24 +301,29 @@ void AliEMCALClusterizerv1::GetCalibrationParameters()
   // AliCDBStorage* storage = AliCDBManager::Instance()->GetStorage("local://CalibDB");
 
   //Check if calibration is stored in data base
-   if(AliCDBManager::Instance()->IsDefaultStorageSet()){
-     AliCDBEntry *entry = (AliCDBEntry*) 
-     AliCDBManager::Instance()->Get("EMCAL/Calib/Data");
-     if (entry) fCalibData = (AliEMCALCalibData*) entry->GetObject();
-   }
-   if(!fCalibData)
-     {
-       //If calibration is not available use default parameters
-       //Loader
-       AliEMCALLoader *emcalLoader = 
-        dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
-       if ( !emcalLoader->Digitizer() ) 
-        emcalLoader->LoadDigitizer();
-       AliEMCALDigitizer * dig = dynamic_cast<AliEMCALDigitizer*>(emcalLoader->Digitizer());
+
+  if(!fCalibData && (AliCDBManager::Instance()->IsDefaultStorageSet()))
+    {
+      AliCDBEntry *entry = (AliCDBEntry*) 
+       AliCDBManager::Instance()->Get("EMCAL/Calib/Data");
+      if (entry) fCalibData =  (AliEMCALCalibData*) entry->GetObject();
+    }
+  
+  if(!fCalibData)
+    AliFatal("Calibration parameters not found in CDB!");
+  //  Please fix it!! Or better just remove it...
+//    if(!fCalibData)
+//      {
+//        //If calibration is not available use default parameters
+//        //Loader
+//        if ( !emcalLoader->Digitizer() ) 
+//      emcalLoader->LoadDigitizer();
+//        AliEMCALDigitizer * dig = dynamic_cast<AliEMCALDigitizer*>(emcalLoader->Digitizer());
        
-       fADCchannelECA   = dig->GetECAchannel() ;
-       fADCpedestalECA  = dig->GetECApedestal();
-     }
+//        fADCchannelECA   = dig->GetECAchannel() ;
+//        fADCpedestalECA  = dig->GetECApedestal();
+//      }
 }
 
 //____________________________________________________________________________
@@ -397,8 +333,11 @@ void AliEMCALClusterizerv1::Init()
   // Attach the Clusterizer task to the list of EMCAL tasks
   
   AliRunLoader *rl = AliRunLoader::GetRunLoader();
-  fGeom = dynamic_cast<AliEMCAL*>(rl->GetAliRun()->GetDetector("EMCAL"))->GetGeometry();
-  fGeom->GetTransformationForSM(); // Global <-> Local
+  if (rl->GetAliRun() && rl->GetAliRun()->GetDetector("EMCAL"))
+    fGeom = dynamic_cast<AliEMCAL*>(rl->GetAliRun()->GetDetector("EMCAL"))->GetGeometry();
+  else 
+    fGeom =  AliEMCALGeometry::GetInstance(AliEMCALGeometry::GetDefaulGeometryName());
+
   AliInfo(Form("geom 0x%x",fGeom));
 
   if(!gMinuit) 
@@ -415,16 +354,25 @@ void AliEMCALClusterizerv1::InitParameters()
 
   fNTowerInGroup = 36;  //Produces maximum of 80 pseudoclusters per event
 
-  fECAClusteringThreshold   = 0.1;  // value obtained from Aleksei
   fECALocMaxCut = 0.03; // ??
 
-  fECAW0    = 4.5;
-  fTimeGate = 1.e-8 ; 
+  fTimeCut = 300e-9 ; // 300 ns time cut (to be tuned) 
   fToUnfold = kFALSE ;
-  fRecPointsInRun  = 0 ;
-  fMinECut = 0.01; // have to be tune
 
   fCalibData               = 0 ;
+
+  const AliEMCALRecParam* recParam = AliEMCALReconstructor::GetRecParam();
+  if(!recParam) {
+    AliFatal("Reconstruction parameters for EMCAL not set!");
+  }
+  else {
+    fECAClusteringThreshold = recParam->GetClusteringThreshold();
+    fECAW0                  = recParam->GetW0();
+    fMinECut                = recParam->GetMinECut();
+    AliDebug(1,Form("Reconstruction parameters: fECAClusteringThreshold=%.3f, fECAW=%.3f, fMinECut=%.3f",
+                fECAClusteringThreshold,fECAW0,fMinECut));
+  }
+
 }
 
 //____________________________________________________________________________
@@ -453,8 +401,8 @@ Int_t AliEMCALClusterizerv1::AreNeighbours(AliEMCALDigit * d1, AliEMCALDigit * d
   rowdiff = TMath::Abs(iphi1 - iphi2);  
   coldiff = TMath::Abs(ieta1 - ieta2) ;  
   
-  //  if (( coldiff <= 1 )  && ( rowdiff <= 1 )) rv = 1;  // neighbours with at least commom vertex
-  if(coldiff + rowdiff <= 1) rv = 1;  // neighbours with at least commom side; Nov 6,2006
+  // neighbours with at least commom side; May 11, 2007
+  if ((coldiff==0 && abs(rowdiff)==1) || (rowdiff==0 && abs(coldiff)==1)) rv = 1;  
  
   if (gDebug == 2 && rv==1) 
   printf("AreNeighbours: neighbours=%d, id1=%d, relid1=%d,%d \n id2=%d, relid2=%d,%d \n", 
@@ -510,237 +458,124 @@ Int_t AliEMCALClusterizerv1::AreInGroup(AliEMCALDigit * d1, AliEMCALDigit * d2)
 
   return rv ;
 }
-
-//____________________________________________________________________________
-void AliEMCALClusterizerv1::Unload() 
-{
-  // Unloads the Digits and RecPoints
-  AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
-    
-  emcalLoader->UnloadDigits() ; 
-  emcalLoader->UnloadRecPoints() ; 
-}
  
-//____________________________________________________________________________
-void AliEMCALClusterizerv1::WriteRecPoints()
-{
-
-  // Creates new branches with given title
-  // fills and writes into TreeR.
-
-  AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
-
-  TObjArray * aECARecPoints = emcalLoader->RecPoints() ; 
-
-  TClonesArray * digits = emcalLoader->Digits() ; 
-  TTree * treeR = emcalLoader->TreeR();  
-  if ( treeR==0 ) {
-    emcalLoader->MakeRecPointsContainer();
-    treeR = emcalLoader->TreeR();  
-  }
-  Int_t index ;
-
-  //Evaluate position, dispersion and other RecPoint properties for EC section
-  for(index = 0; index < aECARecPoints->GetEntries(); index++)
-    (dynamic_cast<AliEMCALRecPoint *>(aECARecPoints->At(index)))->EvalAll(fECAW0,digits) ;
-  
-  aECARecPoints->Sort() ;
-
-  for(index = 0; index < aECARecPoints->GetEntries(); index++) {
-    (dynamic_cast<AliEMCALRecPoint *>(aECARecPoints->At(index)))->SetIndexInList(index) ;
-    (dynamic_cast<AliEMCALRecPoint *>(aECARecPoints->At(index)))->Print();
-  }
-
-  Int_t bufferSize = 32000 ;    
-  Int_t splitlevel = 0 ; 
-
-  //EC section branch
-  
-  TBranch * branchECA = 0;
-  if ((branchECA = treeR->GetBranch("EMCALECARP")))
-    branchECA->SetAddress(&aECARecPoints);
-  else
-    treeR->Branch("EMCALECARP","TObjArray",&aECARecPoints,bufferSize,splitlevel);
-  treeR->Fill() ;
-
-  emcalLoader->WriteRecPoints("OVERWRITE");
-
-}
-
 //____________________________________________________________________________
 void AliEMCALClusterizerv1::MakeClusters(char* option)
 {
   // Steering method to construct the clusters stored in a list of Reconstructed Points
   // A cluster is defined as a list of neighbour digits
+  // Mar 03, 2007 by PAI
 
-  AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
+  if (fGeom==0) AliFatal("Did not get geometry from EMCALLoader");
 
-  TObjArray * aECARecPoints = emcalLoader->RecPoints() ; 
-    
-  if (fGeom==0) 
-     AliFatal("Did not get geometry from EMCALLoader");
+  fRecPoints->Clear();
 
-  aECARecPoints->Clear();
+  // Set up TObjArray with pointers to digits to work on 
+  TObjArray *digitsC = new TObjArray();
+  TIter nextdigit(fDigitsArr);
+  AliEMCALDigit *digit;
+  while ( (digit = dynamic_cast<AliEMCALDigit*>(nextdigit())) ) {
+    digitsC->AddLast(digit);
+  }
 
   //Start with pseudoclusters, if option
-  if(strstr(option,"pseudo")) { // ?? Nov 3, 2006 
-    TClonesArray * digits  = emcalLoader->Digits() ; 
-    TClonesArray * digitsC =  dynamic_cast<TClonesArray*>(digits->Clone());
-
-    TIter nextdigit(digitsC) ;
-    AliEMCALDigit * digit;
+  if(strstr(option,"pseudo")) { 
+    //
+    // New algorithm : will be created one pseudo cluster per module  
+    //
+    AliDebug(1,Form("Pseudo clustering #digits : %i ",fDigitsArr->GetEntries()));
 
-    AliEMCALRecPoint * recPoint = 0 ; 
-    int ineb=0;
-    nextdigit.Reset();
+    AliEMCALRecPoint *recPoints[12]; // max size is 12 : see fGeom->GetNumberOfSuperModules();
+    for(int i=0; i<12; i++) recPoints[i] = 0;
+    TIter nextdigitC(digitsC) ;
 
     // PseudoClusterization starts  
-    while ( (digit = dynamic_cast<AliEMCALDigit *>(nextdigit())) ) { // scan over the list of digitsC
-      recPoint = 0 ; 
-      TArrayI clusterECAdigitslist(1000); // what is this   
-
+    int nSM = 0; // # of SM
+    while ( (digit = dynamic_cast<AliEMCALDigit *>(nextdigitC())) ) { // scan over the list of digitsC
       if(fGeom->CheckAbsCellId(digit->GetId()) ) { //Is this an EMCAL digit? Just maing sure...
-       Int_t iDigitInECACluster = 0; // start a new Tower RecPoint
-       if(fNumberOfECAClusters >= aECARecPoints->GetSize()) aECARecPoints->Expand(2*fNumberOfECAClusters+1) ;
-       AliEMCALRecPoint * rp = new  AliEMCALRecPoint("") ; 
-       aECARecPoints->AddAt(rp, fNumberOfECAClusters) ;
-       recPoint = dynamic_cast<AliEMCALRecPoint *>(aECARecPoints->At(fNumberOfECAClusters)) ; 
-       fNumberOfECAClusters++ ; 
-
-       recPoint->SetClusterType(AliESDCaloCluster::kPseudoCluster);
-
-       recPoint->AddDigit(*digit, digit->GetAmp()) ; 
-       clusterECAdigitslist[iDigitInECACluster] = digit->GetIndexInList() ;    
-       iDigitInECACluster++ ; 
-       digitsC->Remove(digit) ; 
-       AliDebug(1,Form("MakePseudoClusters: OK id = %d, adc = %f \n", digit->GetId(), digit->GetAmp()));
-       nextdigit.Reset(); // will start from beggining
-      
-       AliEMCALDigit * digitN = 0; // digi neighbor
-       Int_t index = 0 ;
-
-       // Find the neighbours
-       while (index < iDigitInECACluster){ // scan over digits already in cluster 
-         digit =  (AliEMCALDigit*)digits->At(clusterECAdigitslist[index]);
-         index++ ; 
-         while ( (digitN = (AliEMCALDigit *)nextdigit())) { // scan over the reduced list of digits 
-           ineb = AreInGroup(digit, digitN);       // call (digit,digitN) in THAT oder !!!!! 
-           switch (ineb ) {
-              case 0 :   // not a neighbour
-              break ;
-             case 1 :   // are neighbours 
-              recPoint->AddDigit(*digitN, digitN->GetAmp() ) ;
-              clusterECAdigitslist[iDigitInECACluster] = digitN->GetIndexInList() ; 
-              iDigitInECACluster++ ; 
-              digitsC->Remove(digitN) ;
-              break ;
-             case 2 :   // different SM
-              break ;
-              case 3 :   // different Tower group
-              break ;
-           } // switch
-         } // scan over the reduced list of digits
-       } // scan over digits already in cluster
-       nextdigit.Reset() ;  // will start from beggining
+        nSM = fGeom->GetSuperModuleNumber(digit->GetId());
+        if(recPoints[nSM] == 0) {
+          recPoints[nSM] = new AliEMCALRecPoint(Form("PC%2.2i", nSM));
+          recPoints[nSM]->SetClusterType(AliESDCaloCluster::kEMCALPseudoCluster);
+       }
+        recPoints[nSM]->AddDigit(*digit, Calibrate(digit->GetAmp(), digit->GetId()));
       }
     }
-    if(recPoint)
-      AliDebug(1,Form("MakeClusters: cl.e %f \n", recPoint->GetEnergy())); 
-    //if(recPoint) cout << "cl.e " << recPoint->GetEnergy() << endl; 
-    delete digitsC ;
+    fNumberOfECAClusters = 0;
+    for(int i=0; i<fGeom->GetNumberOfSuperModules(); i++) { // put non empty rec.points to container
+      if(recPoints[i]) fRecPoints->AddAt(recPoints[i], fNumberOfECAClusters++);
+    }
+    AliDebug(1,Form(" Number of PC %d ", fNumberOfECAClusters));
   }
 
-  //Now do real clusters
-  TClonesArray * digits  = emcalLoader->Digits() ; 
-  TClonesArray * digitsC =  dynamic_cast<TClonesArray*>(digits->Clone()); // will work with thic copy
-
-  TIter nextdigitC(digitsC) ;
-  AliEMCALDigit * digit;
-
-  AliEMCALRecPoint * recPoint = 0 ; 
-  int ineb=0;
-  nextdigitC.Reset();
+  //
+  // Now do real clusters
+  //
 
   double e = 0.0, ehs = 0.0;
+  TIter nextdigitC(digitsC);
+
   while ( (digit = dynamic_cast<AliEMCALDigit *>(nextdigitC())) ) { // clean up digits
     e = Calibrate(digit->GetAmp(), digit->GetId());
     AliEMCALHistoUtilities::FillH1(fHists, 10, digit->GetAmp());
     AliEMCALHistoUtilities::FillH1(fHists, 11, e);
-    if(e < fMinECut ) digitsC->Remove(digit);
-    else              ehs += e;
+    if ( e < fMinECut || digit->GetTimeR() > fTimeCut ) 
+      digitsC->Remove(digit);
+    else    
+      ehs += e;
   } 
   AliDebug(1,Form("MakeClusters: Number of digits %d  -> (e %f), ehs %d\n",
-                 digits->GetEntries(),fMinECut,ehs));
-  //cout << " Number of digits " << digits->GetEntries() << " -> (e>" <<fMinECut <<")";
-  //cout << digitsC->GetEntries()<< " ehs "<<ehs<<endl; 
+                 fDigitsArr->GetEntries(),fMinECut,ehs));
 
-  // Clusterization starts    
-  //  cout << "Outer Loop" << endl;
-  ineb=0;
   nextdigitC.Reset();
-  recPoint = 0 ; 
+
   while ( (digit = dynamic_cast<AliEMCALDigit *>(nextdigitC())) ) { // scan over the list of digitsC
-    recPoint = 0 ; 
-    TArrayI clusterECAdigitslist(1000); // what is this   
+    TArrayI clusterECAdigitslist(fDigitsArr->GetEntries());
 
     if(fGeom->CheckAbsCellId(digit->GetId()) && (Calibrate(digit->GetAmp(), digit->GetId()) > fECAClusteringThreshold  ) ){
-      Int_t iDigitInECACluster = 0; // start a new Tower RecPoint
-      if(fNumberOfECAClusters >= aECARecPoints->GetSize()) aECARecPoints->Expand(2*fNumberOfECAClusters+1) ;
-      AliEMCALRecPoint * rp = new  AliEMCALRecPoint("") ; 
-      aECARecPoints->AddAt(rp, fNumberOfECAClusters) ;
-      recPoint = dynamic_cast<AliEMCALRecPoint *>(aECARecPoints->At(fNumberOfECAClusters)) ; 
+      // start a new Tower RecPoint
+      if(fNumberOfECAClusters >= fRecPoints->GetSize()) fRecPoints->Expand(2*fNumberOfECAClusters+1) ;
+      AliEMCALRecPoint *recPoint = new  AliEMCALRecPoint("") ; 
+      fRecPoints->AddAt(recPoint, fNumberOfECAClusters) ;
+      recPoint = dynamic_cast<AliEMCALRecPoint *>(fRecPoints->At(fNumberOfECAClusters)) ; 
       fNumberOfECAClusters++ ; 
 
-      recPoint->SetClusterType(AliESDCaloCluster::kClusterv1);
+      recPoint->SetClusterType(AliESDCaloCluster::kEMCALClusterv1);
 
       recPoint->AddDigit(*digit, Calibrate(digit->GetAmp(), digit->GetId())) ; 
-      clusterECAdigitslist[iDigitInECACluster] = digit->GetIndexInList() ;     
-      iDigitInECACluster++ ; 
+      TObjArray clusterDigits;
+      clusterDigits.AddLast(digit);    
       digitsC->Remove(digit) ; 
-      AliDebug(1,Form("MakeClusters: OK id = %d, ene = %f , thre = %f \n", digit->GetId(),
+
+      AliDebug(1,Form("MakeClusters: OK id = %d, ene = %f , cell.th. = %f \n", digit->GetId(),
       Calibrate(digit->GetAmp(),digit->GetId()), fECAClusteringThreshold));  
-      nextdigitC.Reset(); // will start from beggining
       
-      AliEMCALDigit * digitN = 0; // digi neighbor
-      Int_t index = 0 ;
-
-      // Find the neighbours
-    NEIGHBOURS:
-      while (index < iDigitInECACluster){ // scan over digits already in cluster 
-       digit =  (AliEMCALDigit*)digits->At(clusterECAdigitslist[index]);
-       index++ ; 
-        while ( (digitN = (AliEMCALDigit *)nextdigitC())) { // scan over the reduced list of digits 
-
-         ineb = AreNeighbours(digit, digitN);       // call (digit,digitN) in THAT oder !!!!! 
-          if(ineb==1) {
+      // Grow cluster by finding neighbours
+      TIter nextClusterDigit(&clusterDigits);
+      while ( (digit = dynamic_cast<AliEMCALDigit*>(nextClusterDigit())) ) { // scan over digits in cluster 
+       TIter nextdigitN(digitsC); 
+        AliEMCALDigit *digitN = 0; // digi neighbor
+        while ( (digitN = (AliEMCALDigit *)nextdigitN()) ) { // scan over all digits to look for neighbours
+         if (AreNeighbours(digit, digitN)==1) {      // call (digit,digitN) in THAT oder !!!!! 
            recPoint->AddDigit(*digitN, Calibrate(digitN->GetAmp(),digitN->GetId()) ) ;
-           clusterECAdigitslist[iDigitInECACluster] = digitN->GetIndexInList() ; 
-           iDigitInECACluster++ ; 
+           clusterDigits.AddLast(digitN) ; 
            digitsC->Remove(digitN) ; 
-      // Have to start from begining for clusters digits too ; Nov 3,2006
-            index = 0;
-            nextdigitC.Reset() ; 
-            goto NEIGHBOURS;
          } // if(ineb==1)
-
-        } // scan over the reduced list of digits
-        nextdigitC.Reset() ;  // will start from beginning
+        } // scan over digits
       } // scan over digits already in cluster
-    }
+      if(recPoint)
+        AliDebug(2,Form("MakeClusters: %d digitd, energy %f \n", clusterDigits.GetEntries(), recPoint->GetEnergy())); 
+    } // If seed found
   } // while digit 
-  if(recPoint)
-    AliDebug(1,Form("MakeClusters: cl.e %f \n", recPoint->GetEnergy())); 
-  //if(recPoint) cout << "cl.e " << recPoint->GetEnergy() << endl; 
+
   delete digitsC ;
 
-  AliDebug(1,Form("total no of clusters %d from %d digits",fNumberOfECAClusters,digits->GetEntriesFast())); 
+  AliDebug(1,Form("total no of clusters %d from %d digits",fNumberOfECAClusters,fDigitsArr->GetEntriesFast())); 
 }
 
-//____________________________________________________________________________
 void AliEMCALClusterizerv1::MakeUnfolding() const
 {
   Fatal("AliEMCALClusterizerv1::MakeUnfolding", "--> Unfolding not implemented") ;
 }
 
 //____________________________________________________________________________
@@ -788,18 +623,12 @@ void AliEMCALClusterizerv1::Print(Option_t * /*option*/)const
     
     // Print parameters
  
-    TString taskName(GetName()) ;
-    taskName.ReplaceAll(Version(), "") ;
+    TString taskName(Version()) ;
     
     printf("--------------- "); 
     printf(taskName.Data()) ; 
     printf(" "); 
-    printf(GetTitle()) ; 
-    printf("-----------\n");  
-    printf("Clusterizing digits from the file: "); 
-    printf(taskName.Data());  
-    printf("\n                           Branch: "); 
-    printf(GetName()); 
+    printf("Clusterizing digits: "); 
     printf("\n                       ECA Local Maximum cut    = %f", fECALocMaxCut); 
     printf("\n                       ECA Logarithmic weight   = %f", fECAW0); 
     if(fToUnfold)
@@ -817,19 +646,13 @@ void AliEMCALClusterizerv1::Print(Option_t * /*option*/)const
 void AliEMCALClusterizerv1::PrintRecPoints(Option_t * option)
 {
   // Prints list of RecPoints produced at the current pass of AliEMCALClusterizer
-  AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
-  TObjArray * aECARecPoints = emcalLoader->RecPoints() ; 
-    
   if(strstr(option,"deb")) {
     printf("PrintRecPoints: Clusterization result:") ; 
   
-    printf("event # %d\n", emcalLoader->GetRunLoader()->GetEventNumber() ) ;
     printf("           Found %d ECA Rec Points\n ", 
-        aECARecPoints->GetEntriesFast()) ; 
+        fRecPoints->GetEntriesFast()) ; 
   }
 
-  fRecPointsInRun +=  aECARecPoints->GetEntriesFast() ; 
-  
   if(strstr(option,"all")) {
     if(strstr(option,"deb")) {
       printf("\n-----------------------------------------------------------------------\n") ;
@@ -842,10 +665,10 @@ void AliEMCALClusterizerv1::PrintRecPoints(Option_t * option)
    Float_t maxL2=0; 
    Float_t maxDis=0; 
 
-    AliEMCALHistoUtilities::FillH1(fHists, 12, double(aECARecPoints->GetEntries()));
+    AliEMCALHistoUtilities::FillH1(fHists, 12, double(fRecPoints->GetEntries()));
 
-    for (index = 0 ; index < aECARecPoints->GetEntries() ; index++) {
-      AliEMCALRecPoint * rp = dynamic_cast<AliEMCALRecPoint * >(aECARecPoints->At(index)) ; 
+    for (index = 0 ; index < fRecPoints->GetEntries() ; index++) {
+      AliEMCALRecPoint * rp = dynamic_cast<AliEMCALRecPoint * >(fRecPoints->At(index)) ; 
       TVector3  globalpos;  
       //rp->GetGlobalPosition(globalpos);
       TVector3  localpos;  
@@ -942,10 +765,3 @@ void AliEMCALClusterizerv1::DrawLambdasHists()
     }
   }
 }
-
-void AliEMCALClusterizerv1::Browse(TBrowser* b)
-{
-  if(fHists) b->Add(fHists);
-  if(fGeom)  b->Add(fGeom);
-  TTask::Browse(b);
-}