ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

// This class derives from AliEMCALClustrerizer but also keeps the API of AliEMCALClusterizerv1
// Algorithm:
// 1. peek the most energetic cell
// 2. assign it as a center of the cluster and add cells surrounding it: 3x3, 5x5...
// 3. remove the cells contributing to the cluster
// 4. start from 1 for the remaining clusters
// 5. cluster splitting (not implemented yet) - use the shape analysis to resolve the energy sharing
// - for high energy clusters check the surrounding of the 3x3 clusters for extra energy 
// (merge 3x3 clusters and resolve the internal energy sharing - case for 2 clusters merged)
// Use Case:
//  root [0] AliEMCALClusterizerNxN * cl = new AliEMCALClusterizerNxN("galice.root")  
//  Warning in <TDatabasePDG::TDatabasePDG>: object already instantiated
//               //reads gAlice from header file "..."                      
//  root [1] cl->ExecuteTask()  
//               //finds RecPoints in all events stored in galice.root
//  root [2] cl->SetDigitsBranch("digits2") 
//               //sets another title for Digitis (input) branch
//  root [3] cl->SetRecPointsBranch("recp2")  
//               //sets another title four output branches
//  root [4] cl->SetTowerLocalMaxCut(0.03)  
//               //set clusterization parameters
//  root [5] cl->ExecuteTask("deb all time")  
//               //once more finds RecPoints options are 
//               // deb - print number of found rec points
//               // deb all - print number of found RecPoints and some their characteristics 
//               // time - print benchmarking results

// --- ROOT system ---
#include <TMath.h> 
#include <TMinuit.h>
#include <TTree.h> 
#include <TBenchmark.h>
#include <TBrowser.h>
#include <TROOT.h>
#include <TClonesArray.h>

// --- Standard library ---
#include <cassert>

// --- AliRoot header files ---
#include "AliLog.h"
#include "AliEMCALClusterizerNxN.h"
#include "AliEMCALRecPoint.h"
#include "AliEMCALDigit.h"
#include "AliEMCALGeometry.h"
#include "AliCaloCalibPedestal.h"
#include "AliEMCALCalibData.h"
#include "AliESDCaloCluster.h"
#include "AliEMCALUnfolding.h"

ClassImp(AliEMCALClusterizerNxN)

//____________________________________________________________________________
AliEMCALClusterizerNxN::AliEMCALClusterizerNxN()
  : AliEMCALClusterizer(), fNRowDiff(1), fNColDiff(1), fEnergyGrad(0)
{
  // ctor with the indication of the file where header Tree and digits Tree are stored
}

//____________________________________________________________________________
AliEMCALClusterizerNxN::AliEMCALClusterizerNxN(AliEMCALGeometry* geometry)
  : AliEMCALClusterizer(geometry), fNRowDiff(1), fNColDiff(1), fEnergyGrad(0)
{
  // ctor with the indication of the file where header Tree and digits Tree are stored
  // use this contructor to avoid usage of Init() which uses runloader
  // change needed by HLT - MP
}

//____________________________________________________________________________
AliEMCALClusterizerNxN::AliEMCALClusterizerNxN(AliEMCALGeometry* geometry, AliEMCALCalibData * calib, AliCaloCalibPedestal * caloped)
: AliEMCALClusterizer(geometry, calib, caloped), fNRowDiff(1), fNColDiff(1), fEnergyGrad(0)
{
  // ctor, geometry and calibration are initialized elsewhere.
}

//____________________________________________________________________________
AliEMCALClusterizerNxN::~AliEMCALClusterizerNxN()
{
  // dtor
}

//____________________________________________________________________________
void AliEMCALClusterizerNxN::Digits2Clusters(Option_t * option)
{
  // Steering method to perform clusterization for the current event 
  // in AliEMCALLoader
  
  if (strstr(option,"tim"))
    gBenchmark->Start("EMCALClusterizer"); 
  
  if (strstr(option,"print"))
    Print(""); 
  
  //Get calibration parameters from file or digitizer default values.
  GetCalibrationParameters();
  
  //Get dead channel map from file or digitizer default values.
  GetCaloCalibPedestal();
	
  MakeClusters();  //only the real clusters
  
  if (fToUnfold) {
    fClusterUnfolding->SetInput(fNumberOfECAClusters,fRecPoints,fDigitsArr);
    fClusterUnfolding->MakeUnfolding();
  }
  
  //Evaluate position, dispersion and other RecPoint properties for EC section 
  for (Int_t index = 0; index < fRecPoints->GetEntries(); index++) { 
    AliEMCALRecPoint * rp = dynamic_cast<AliEMCALRecPoint *>(fRecPoints->At(index));
    if (rp) {
      rp->EvalAll(fECAW0,fDigitsArr,fJustClusters);
      AliDebug(5, Form("MAX INDEX %d ", rp->GetMaximalEnergyIndex()));
      //For each rec.point set the distance to the nearest bad crystal
      if (fCaloPed)
        rp->EvalDistanceToBadChannels(fCaloPed);
    }
  }
  
  fRecPoints->Sort();
  
  for (Int_t index = 0; index < fRecPoints->GetEntries(); index++) {
    AliEMCALRecPoint *rp = dynamic_cast<AliEMCALRecPoint *>(fRecPoints->At(index));
    if (rp) {
      rp->SetIndexInList(index);
    }
    else AliFatal("RecPoint NULL!!");
  }
  
  if (fTreeR)
    fTreeR->Fill();
  
  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", 
           gBenchmark->GetCpuTime("EMCALClusterizer"));
  }    
}

//____________________________________________________________________________
Int_t AliEMCALClusterizerNxN::AreNeighbours(AliEMCALDigit * d1, AliEMCALDigit * d2, Bool_t & shared) const
{
  // Gives the neighbourness of two digits = 0 are not neighbour ; continue searching 
  //                                       = 1 are neighbour
  //                                       = 2 is in different SM; continue searching 
  // In case it is in different SM, but same phi rack, check if neigbours at eta=0
  // neighbours are defined as digits having at least a common side 
  // The order of d1 and d2 is important: first (d1) should be a digit already in a cluster 
  //                                      which is compared to a digit (d2)  not yet in a cluster  
  
  if (fEnergyGrad) { //false by default
    if (d2->GetCalibAmp()>d1->GetCalibAmp())
      return 3; // energy of neighboring cell should be smaller in order to become a neighbor
  }

  Int_t nSupMod1=0, nModule1=0, nIphi1=0, nIeta1=0, iphi1=0, ieta1=0;
  Int_t nSupMod2=0, nModule2=0, nIphi2=0, nIeta2=0, iphi2=0, ieta2=0;
  Int_t rowdiff=0, coldiff=0;
  
  shared = kFALSE;
  
  fGeom->GetCellIndex(d1->GetId(), nSupMod1,nModule1,nIphi1,nIeta1);
  fGeom->GetCellIndex(d2->GetId(), nSupMod2,nModule2,nIphi2,nIeta2);
  fGeom->GetCellPhiEtaIndexInSModule(nSupMod1,nModule1,nIphi1,nIeta1, iphi1,ieta1);
  fGeom->GetCellPhiEtaIndexInSModule(nSupMod2,nModule2,nIphi2,nIeta2, iphi2,ieta2);
  
  //If different SM, check if they are in the same phi, then consider cells close to eta=0 as neighbours; May 2010
  if (nSupMod1 != nSupMod2 ) 
    {
      //Check if the 2 SM are in the same PHI position (0,1), (2,3), ...
      Float_t smPhi1 = fGeom->GetEMCGeometry()->GetPhiCenterOfSM(nSupMod1);
      Float_t smPhi2 = fGeom->GetEMCGeometry()->GetPhiCenterOfSM(nSupMod2);
      
      if (!TMath::AreEqualAbs(smPhi1, smPhi2, 1e-3)) return 2; //Not phi rack equal, not neighbours
      
      // In case of a shared cluster, index of SM in C side, columns start at 48 and ends at 48*2
      // C Side impair SM, nSupMod%2=1; A side pair SM nSupMod%2=0
      if (nSupMod1%2) ieta1+=AliEMCALGeoParams::fgkEMCALCols;
      else           ieta2+=AliEMCALGeoParams::fgkEMCALCols;
      
      shared = kTRUE; // maybe a shared cluster, we know this later, set it for the moment.
      
    }//Different SM, same phi
  
  rowdiff = TMath::Abs(iphi1 - iphi2);  
  coldiff = TMath::Abs(ieta1 - ieta2);  
  
  // neighbours +-1 in col and row
  if ( TMath::Abs(coldiff) <= fNColDiff && TMath::Abs(rowdiff) <= fNRowDiff)
    {
      
      AliDebug(9, Form("AliEMCALClusterizerNxN::AreNeighbours(): id1=%d, (row %d, col %d) ; id2=%d, (row %d, col %d), shared %d \n",
		       d1->GetId(), iphi1,ieta1, d2->GetId(), iphi2,ieta2, shared));
      
      return 1;
    }//Neighbours
  else 
    {
      AliDebug(9, Form("NOT AliEMCALClusterizerNxN::AreNeighbours(): id1=%d, (row %d, col %d) ; id2=%d, (row %d, col %d), shared %d \n",
		       d1->GetId(), iphi1,ieta1, d2->GetId(), iphi2,ieta2, shared));
      shared = kFALSE;
      return 2; 
    }//Not neighbours
}

//____________________________________________________________________________
void AliEMCALClusterizerNxN::MakeClusters()
{
  // Make clusters
  
  if (fGeom==0) 
    AliFatal("Did not get geometry from EMCALLoader");
  
  fNumberOfECAClusters = 0;
  fRecPoints->Delete();
  
  // Set up TObjArray with pointers to digits to work on, calibrate digits 
  TObjArray digitsC;
  TIter nextdigit(fDigitsArr);
  AliEMCALDigit *digit = 0;
  while ( (digit = static_cast<AliEMCALDigit*>(nextdigit())) ) {
    Float_t dEnergyCalibrated = digit->GetAmplitude();
    Float_t time              = digit->GetTime();
    Calibrate(dEnergyCalibrated,time ,digit->GetId());
    digit->SetCalibAmp(dEnergyCalibrated);
    digit->SetTime(time);    
    digitsC.AddLast(digit);
  }
  
  TIter nextdigitC(&digitsC);
  
  AliDebug(1,Form("MakeClusters: Number of digits %d  -> (e %f)\n",
                  fDigitsArr->GetEntries(),fMinECut));
  
  Bool_t bDone = kFALSE;
  while ( bDone != kTRUE )
  {
    //first sort the digits:
    Int_t iMaxEnergyDigit = -1;
    Float_t dMaxEnergyDigit = -1;
    AliEMCALDigit *pMaxEnergyDigit = 0;
    nextdigitC.Reset();
    while ( (digit = static_cast<AliEMCALDigit *>(nextdigitC())) ) 
    { // scan over the list of digitsC
      Float_t dEnergyCalibrated = digit->GetCalibAmp();
      Float_t time              = digit->GetTime();
      if (fGeom->CheckAbsCellId(digit->GetId()) &&
          dEnergyCalibrated > fMinECut          &&
          time              < fTimeMax          &&
          time              > fTimeMin             ) // no threshold by default!
      {                                              // needs to be set in OCDB!
        if (dEnergyCalibrated > dMaxEnergyDigit) 
        {
          dMaxEnergyDigit = dEnergyCalibrated;
          iMaxEnergyDigit = digit->GetId();
          pMaxEnergyDigit = digit;
        }
      }
    }
    if (iMaxEnergyDigit < 0 || digitsC.GetEntries() <= 0) 
    {
      bDone = kTRUE;
      continue;
    }
    
    AliDebug (2, Form("Max digit found: %1.5f AbsId: %d", dMaxEnergyDigit, iMaxEnergyDigit));
    
    // keep the candidate digits in a list
    TList clusterDigitList;
    clusterDigitList.SetOwner(kFALSE);
    clusterDigitList.AddLast(pMaxEnergyDigit);	 
    
    Double_t clusterCandidateEnergy = dMaxEnergyDigit;
    
    // now loop over the rest of the digits and cluster into NxN cluster 
    // we do not actually cluster yet: we keep them in the list clusterDigitList
    nextdigitC.Reset();
    while ( (digit = static_cast<AliEMCALDigit *>(nextdigitC())) ) 
    { // scan over the list of digitsC
      if (digit == pMaxEnergyDigit) continue;
      Float_t dEnergyCalibrated = digit->GetCalibAmp();
      AliDebug(5, Form("-> Digit ENERGY: %1.5f", dEnergyCalibrated));
      if (fGeom->CheckAbsCellId(digit->GetId()) && dEnergyCalibrated > 0.0  )
      {
        Float_t time = pMaxEnergyDigit->GetTime(); //Time or TimeR?
        if (TMath::Abs(time - digit->GetTime()) > fTimeCut ) continue; //Time or TimeR?
        Bool_t shared = kFALSE; //cluster shared by 2 SuperModules?
        if (AreNeighbours(pMaxEnergyDigit, digit, shared) == 1) // call (digit,digitN) in THAT order !!!!! 
        {      
          clusterDigitList.AddLast(digit);
          clusterCandidateEnergy += dEnergyCalibrated;
        }
      }
    }// loop over the next digits
    
    // start a cluster here only if a cluster energy is larger than clustering threshold
    AliDebug(5, Form("Clusterization threshold is %f MeV", fECAClusteringThreshold));
    if (clusterCandidateEnergy > fECAClusteringThreshold)
    {
      if (fNumberOfECAClusters >= fRecPoints->GetSize()) 
        fRecPoints->Expand(2*fNumberOfECAClusters+1);
      
      (*fRecPoints)[fNumberOfECAClusters] = new AliEMCALRecPoint("") ;
      AliEMCALRecPoint *recPoint = dynamic_cast<AliEMCALRecPoint *>( fRecPoints->At(fNumberOfECAClusters) ) ;
      // AliEMCALRecPoint *recPoint = new  AliEMCALRecPoint(""); 
      // fRecPoints->AddAt(recPoint, fNumberOfECAClusters);
      // recPoint = static_cast<AliEMCALRecPoint *>(fRecPoints->At(fNumberOfECAClusters)); 
      if (recPoint) {
        fNumberOfECAClusters++;       
        recPoint->SetClusterType(AliVCluster::kEMCALClusterv1);
        
        AliDebug(9, Form("Number of cells per cluster (max is 9!): %d", clusterDigitList.GetEntries()));
        for (Int_t idig = 0; idig < clusterDigitList.GetEntries(); idig++)
        {
          digit = (AliEMCALDigit*)clusterDigitList.At(idig);
          AliDebug(5, Form(" Adding digit %d", digit->GetId()));
          // note: this way the sharing info is lost!
          recPoint->AddDigit(*digit, digit->GetCalibAmp(), kFALSE); //Time or TimeR?
          digitsC.Remove(digit); 		  
        }
      }// recpoint
    }
    else
    {
      // we do not want to start clustering in the same spot!
      // but in this case we may NOT reuse this seed for another cluster!
      // need a better bookeeping?
      digitsC.Remove(pMaxEnergyDigit);
    }
    
    AliDebug (2, Form("Number of digits left: %d", digitsC.GetEntries()));      
  } // while ! done 
  
  AliDebug(1,Form("total no of clusters %d from %d digits",fNumberOfECAClusters,fDigitsArr->GetEntriesFast())); 
}
 AliEMCALClusterizerNxN.cxx:1
 AliEMCALClusterizerNxN.cxx:2
 AliEMCALClusterizerNxN.cxx:3
 AliEMCALClusterizerNxN.cxx:4
 AliEMCALClusterizerNxN.cxx:5
 AliEMCALClusterizerNxN.cxx:6
 AliEMCALClusterizerNxN.cxx:7
 AliEMCALClusterizerNxN.cxx:8
 AliEMCALClusterizerNxN.cxx:9
 AliEMCALClusterizerNxN.cxx:10
 AliEMCALClusterizerNxN.cxx:11
 AliEMCALClusterizerNxN.cxx:12
 AliEMCALClusterizerNxN.cxx:13
 AliEMCALClusterizerNxN.cxx:14
 AliEMCALClusterizerNxN.cxx:15
 AliEMCALClusterizerNxN.cxx:16
 AliEMCALClusterizerNxN.cxx:17
 AliEMCALClusterizerNxN.cxx:18
 AliEMCALClusterizerNxN.cxx:19
 AliEMCALClusterizerNxN.cxx:20
 AliEMCALClusterizerNxN.cxx:21
 AliEMCALClusterizerNxN.cxx:22
 AliEMCALClusterizerNxN.cxx:23
 AliEMCALClusterizerNxN.cxx:24
 AliEMCALClusterizerNxN.cxx:25
 AliEMCALClusterizerNxN.cxx:26
 AliEMCALClusterizerNxN.cxx:27
 AliEMCALClusterizerNxN.cxx:28
 AliEMCALClusterizerNxN.cxx:29
 AliEMCALClusterizerNxN.cxx:30
 AliEMCALClusterizerNxN.cxx:31
 AliEMCALClusterizerNxN.cxx:32
 AliEMCALClusterizerNxN.cxx:33
 AliEMCALClusterizerNxN.cxx:34
 AliEMCALClusterizerNxN.cxx:35
 AliEMCALClusterizerNxN.cxx:36
 AliEMCALClusterizerNxN.cxx:37
 AliEMCALClusterizerNxN.cxx:38
 AliEMCALClusterizerNxN.cxx:39
 AliEMCALClusterizerNxN.cxx:40
 AliEMCALClusterizerNxN.cxx:41
 AliEMCALClusterizerNxN.cxx:42
 AliEMCALClusterizerNxN.cxx:43
 AliEMCALClusterizerNxN.cxx:44
 AliEMCALClusterizerNxN.cxx:45
 AliEMCALClusterizerNxN.cxx:46
 AliEMCALClusterizerNxN.cxx:47
 AliEMCALClusterizerNxN.cxx:48
 AliEMCALClusterizerNxN.cxx:49
 AliEMCALClusterizerNxN.cxx:50
 AliEMCALClusterizerNxN.cxx:51
 AliEMCALClusterizerNxN.cxx:52
 AliEMCALClusterizerNxN.cxx:53
 AliEMCALClusterizerNxN.cxx:54
 AliEMCALClusterizerNxN.cxx:55
 AliEMCALClusterizerNxN.cxx:56
 AliEMCALClusterizerNxN.cxx:57
 AliEMCALClusterizerNxN.cxx:58
 AliEMCALClusterizerNxN.cxx:59
 AliEMCALClusterizerNxN.cxx:60
 AliEMCALClusterizerNxN.cxx:61
 AliEMCALClusterizerNxN.cxx:62
 AliEMCALClusterizerNxN.cxx:63
 AliEMCALClusterizerNxN.cxx:64
 AliEMCALClusterizerNxN.cxx:65
 AliEMCALClusterizerNxN.cxx:66
 AliEMCALClusterizerNxN.cxx:67
 AliEMCALClusterizerNxN.cxx:68
 AliEMCALClusterizerNxN.cxx:69
 AliEMCALClusterizerNxN.cxx:70
 AliEMCALClusterizerNxN.cxx:71
 AliEMCALClusterizerNxN.cxx:72
 AliEMCALClusterizerNxN.cxx:73
 AliEMCALClusterizerNxN.cxx:74
 AliEMCALClusterizerNxN.cxx:75
 AliEMCALClusterizerNxN.cxx:76
 AliEMCALClusterizerNxN.cxx:77
 AliEMCALClusterizerNxN.cxx:78
 AliEMCALClusterizerNxN.cxx:79
 AliEMCALClusterizerNxN.cxx:80
 AliEMCALClusterizerNxN.cxx:81
 AliEMCALClusterizerNxN.cxx:82
 AliEMCALClusterizerNxN.cxx:83
 AliEMCALClusterizerNxN.cxx:84
 AliEMCALClusterizerNxN.cxx:85
 AliEMCALClusterizerNxN.cxx:86
 AliEMCALClusterizerNxN.cxx:87
 AliEMCALClusterizerNxN.cxx:88
 AliEMCALClusterizerNxN.cxx:89
 AliEMCALClusterizerNxN.cxx:90
 AliEMCALClusterizerNxN.cxx:91
 AliEMCALClusterizerNxN.cxx:92
 AliEMCALClusterizerNxN.cxx:93
 AliEMCALClusterizerNxN.cxx:94
 AliEMCALClusterizerNxN.cxx:95
 AliEMCALClusterizerNxN.cxx:96
 AliEMCALClusterizerNxN.cxx:97
 AliEMCALClusterizerNxN.cxx:98
 AliEMCALClusterizerNxN.cxx:99
 AliEMCALClusterizerNxN.cxx:100
 AliEMCALClusterizerNxN.cxx:101
 AliEMCALClusterizerNxN.cxx:102
 AliEMCALClusterizerNxN.cxx:103
 AliEMCALClusterizerNxN.cxx:104
 AliEMCALClusterizerNxN.cxx:105
 AliEMCALClusterizerNxN.cxx:106
 AliEMCALClusterizerNxN.cxx:107
 AliEMCALClusterizerNxN.cxx:108
 AliEMCALClusterizerNxN.cxx:109
 AliEMCALClusterizerNxN.cxx:110
 AliEMCALClusterizerNxN.cxx:111
 AliEMCALClusterizerNxN.cxx:112
 AliEMCALClusterizerNxN.cxx:113
 AliEMCALClusterizerNxN.cxx:114
 AliEMCALClusterizerNxN.cxx:115
 AliEMCALClusterizerNxN.cxx:116
 AliEMCALClusterizerNxN.cxx:117
 AliEMCALClusterizerNxN.cxx:118
 AliEMCALClusterizerNxN.cxx:119
 AliEMCALClusterizerNxN.cxx:120
 AliEMCALClusterizerNxN.cxx:121
 AliEMCALClusterizerNxN.cxx:122
 AliEMCALClusterizerNxN.cxx:123
 AliEMCALClusterizerNxN.cxx:124
 AliEMCALClusterizerNxN.cxx:125
 AliEMCALClusterizerNxN.cxx:126
 AliEMCALClusterizerNxN.cxx:127
 AliEMCALClusterizerNxN.cxx:128
 AliEMCALClusterizerNxN.cxx:129
 AliEMCALClusterizerNxN.cxx:130
 AliEMCALClusterizerNxN.cxx:131
 AliEMCALClusterizerNxN.cxx:132
 AliEMCALClusterizerNxN.cxx:133
 AliEMCALClusterizerNxN.cxx:134
 AliEMCALClusterizerNxN.cxx:135
 AliEMCALClusterizerNxN.cxx:136
 AliEMCALClusterizerNxN.cxx:137
 AliEMCALClusterizerNxN.cxx:138
 AliEMCALClusterizerNxN.cxx:139
 AliEMCALClusterizerNxN.cxx:140
 AliEMCALClusterizerNxN.cxx:141
 AliEMCALClusterizerNxN.cxx:142
 AliEMCALClusterizerNxN.cxx:143
 AliEMCALClusterizerNxN.cxx:144
 AliEMCALClusterizerNxN.cxx:145
 AliEMCALClusterizerNxN.cxx:146
 AliEMCALClusterizerNxN.cxx:147
 AliEMCALClusterizerNxN.cxx:148
 AliEMCALClusterizerNxN.cxx:149
 AliEMCALClusterizerNxN.cxx:150
 AliEMCALClusterizerNxN.cxx:151
 AliEMCALClusterizerNxN.cxx:152
 AliEMCALClusterizerNxN.cxx:153
 AliEMCALClusterizerNxN.cxx:154
 AliEMCALClusterizerNxN.cxx:155
 AliEMCALClusterizerNxN.cxx:156
 AliEMCALClusterizerNxN.cxx:157
 AliEMCALClusterizerNxN.cxx:158
 AliEMCALClusterizerNxN.cxx:159
 AliEMCALClusterizerNxN.cxx:160
 AliEMCALClusterizerNxN.cxx:161
 AliEMCALClusterizerNxN.cxx:162
 AliEMCALClusterizerNxN.cxx:163
 AliEMCALClusterizerNxN.cxx:164
 AliEMCALClusterizerNxN.cxx:165
 AliEMCALClusterizerNxN.cxx:166
 AliEMCALClusterizerNxN.cxx:167
 AliEMCALClusterizerNxN.cxx:168
 AliEMCALClusterizerNxN.cxx:169
 AliEMCALClusterizerNxN.cxx:170
 AliEMCALClusterizerNxN.cxx:171
 AliEMCALClusterizerNxN.cxx:172
 AliEMCALClusterizerNxN.cxx:173
 AliEMCALClusterizerNxN.cxx:174
 AliEMCALClusterizerNxN.cxx:175
 AliEMCALClusterizerNxN.cxx:176
 AliEMCALClusterizerNxN.cxx:177
 AliEMCALClusterizerNxN.cxx:178
 AliEMCALClusterizerNxN.cxx:179
 AliEMCALClusterizerNxN.cxx:180
 AliEMCALClusterizerNxN.cxx:181
 AliEMCALClusterizerNxN.cxx:182
 AliEMCALClusterizerNxN.cxx:183
 AliEMCALClusterizerNxN.cxx:184
 AliEMCALClusterizerNxN.cxx:185
 AliEMCALClusterizerNxN.cxx:186
 AliEMCALClusterizerNxN.cxx:187
 AliEMCALClusterizerNxN.cxx:188
 AliEMCALClusterizerNxN.cxx:189
 AliEMCALClusterizerNxN.cxx:190
 AliEMCALClusterizerNxN.cxx:191
 AliEMCALClusterizerNxN.cxx:192
 AliEMCALClusterizerNxN.cxx:193
 AliEMCALClusterizerNxN.cxx:194
 AliEMCALClusterizerNxN.cxx:195
 AliEMCALClusterizerNxN.cxx:196
 AliEMCALClusterizerNxN.cxx:197
 AliEMCALClusterizerNxN.cxx:198
 AliEMCALClusterizerNxN.cxx:199
 AliEMCALClusterizerNxN.cxx:200
 AliEMCALClusterizerNxN.cxx:201
 AliEMCALClusterizerNxN.cxx:202
 AliEMCALClusterizerNxN.cxx:203
 AliEMCALClusterizerNxN.cxx:204
 AliEMCALClusterizerNxN.cxx:205
 AliEMCALClusterizerNxN.cxx:206
 AliEMCALClusterizerNxN.cxx:207
 AliEMCALClusterizerNxN.cxx:208
 AliEMCALClusterizerNxN.cxx:209
 AliEMCALClusterizerNxN.cxx:210
 AliEMCALClusterizerNxN.cxx:211
 AliEMCALClusterizerNxN.cxx:212
 AliEMCALClusterizerNxN.cxx:213
 AliEMCALClusterizerNxN.cxx:214
 AliEMCALClusterizerNxN.cxx:215
 AliEMCALClusterizerNxN.cxx:216
 AliEMCALClusterizerNxN.cxx:217
 AliEMCALClusterizerNxN.cxx:218
 AliEMCALClusterizerNxN.cxx:219
 AliEMCALClusterizerNxN.cxx:220
 AliEMCALClusterizerNxN.cxx:221
 AliEMCALClusterizerNxN.cxx:222
 AliEMCALClusterizerNxN.cxx:223
 AliEMCALClusterizerNxN.cxx:224
 AliEMCALClusterizerNxN.cxx:225
 AliEMCALClusterizerNxN.cxx:226
 AliEMCALClusterizerNxN.cxx:227
 AliEMCALClusterizerNxN.cxx:228
 AliEMCALClusterizerNxN.cxx:229
 AliEMCALClusterizerNxN.cxx:230
 AliEMCALClusterizerNxN.cxx:231
 AliEMCALClusterizerNxN.cxx:232
 AliEMCALClusterizerNxN.cxx:233
 AliEMCALClusterizerNxN.cxx:234
 AliEMCALClusterizerNxN.cxx:235
 AliEMCALClusterizerNxN.cxx:236
 AliEMCALClusterizerNxN.cxx:237
 AliEMCALClusterizerNxN.cxx:238
 AliEMCALClusterizerNxN.cxx:239
 AliEMCALClusterizerNxN.cxx:240
 AliEMCALClusterizerNxN.cxx:241
 AliEMCALClusterizerNxN.cxx:242
 AliEMCALClusterizerNxN.cxx:243
 AliEMCALClusterizerNxN.cxx:244
 AliEMCALClusterizerNxN.cxx:245
 AliEMCALClusterizerNxN.cxx:246
 AliEMCALClusterizerNxN.cxx:247
 AliEMCALClusterizerNxN.cxx:248
 AliEMCALClusterizerNxN.cxx:249
 AliEMCALClusterizerNxN.cxx:250
 AliEMCALClusterizerNxN.cxx:251
 AliEMCALClusterizerNxN.cxx:252
 AliEMCALClusterizerNxN.cxx:253
 AliEMCALClusterizerNxN.cxx:254
 AliEMCALClusterizerNxN.cxx:255
 AliEMCALClusterizerNxN.cxx:256
 AliEMCALClusterizerNxN.cxx:257
 AliEMCALClusterizerNxN.cxx:258
 AliEMCALClusterizerNxN.cxx:259
 AliEMCALClusterizerNxN.cxx:260
 AliEMCALClusterizerNxN.cxx:261
 AliEMCALClusterizerNxN.cxx:262
 AliEMCALClusterizerNxN.cxx:263
 AliEMCALClusterizerNxN.cxx:264
 AliEMCALClusterizerNxN.cxx:265
 AliEMCALClusterizerNxN.cxx:266
 AliEMCALClusterizerNxN.cxx:267
 AliEMCALClusterizerNxN.cxx:268
 AliEMCALClusterizerNxN.cxx:269
 AliEMCALClusterizerNxN.cxx:270
 AliEMCALClusterizerNxN.cxx:271
 AliEMCALClusterizerNxN.cxx:272
 AliEMCALClusterizerNxN.cxx:273
 AliEMCALClusterizerNxN.cxx:274
 AliEMCALClusterizerNxN.cxx:275
 AliEMCALClusterizerNxN.cxx:276
 AliEMCALClusterizerNxN.cxx:277
 AliEMCALClusterizerNxN.cxx:278
 AliEMCALClusterizerNxN.cxx:279
 AliEMCALClusterizerNxN.cxx:280
 AliEMCALClusterizerNxN.cxx:281
 AliEMCALClusterizerNxN.cxx:282
 AliEMCALClusterizerNxN.cxx:283
 AliEMCALClusterizerNxN.cxx:284
 AliEMCALClusterizerNxN.cxx:285
 AliEMCALClusterizerNxN.cxx:286
 AliEMCALClusterizerNxN.cxx:287
 AliEMCALClusterizerNxN.cxx:288
 AliEMCALClusterizerNxN.cxx:289
 AliEMCALClusterizerNxN.cxx:290
 AliEMCALClusterizerNxN.cxx:291
 AliEMCALClusterizerNxN.cxx:292
 AliEMCALClusterizerNxN.cxx:293
 AliEMCALClusterizerNxN.cxx:294
 AliEMCALClusterizerNxN.cxx:295
 AliEMCALClusterizerNxN.cxx:296
 AliEMCALClusterizerNxN.cxx:297
 AliEMCALClusterizerNxN.cxx:298
 AliEMCALClusterizerNxN.cxx:299
 AliEMCALClusterizerNxN.cxx:300
 AliEMCALClusterizerNxN.cxx:301
 AliEMCALClusterizerNxN.cxx:302
 AliEMCALClusterizerNxN.cxx:303
 AliEMCALClusterizerNxN.cxx:304
 AliEMCALClusterizerNxN.cxx:305
 AliEMCALClusterizerNxN.cxx:306
 AliEMCALClusterizerNxN.cxx:307
 AliEMCALClusterizerNxN.cxx:308
 AliEMCALClusterizerNxN.cxx:309
 AliEMCALClusterizerNxN.cxx:310
 AliEMCALClusterizerNxN.cxx:311
 AliEMCALClusterizerNxN.cxx:312
 AliEMCALClusterizerNxN.cxx:313
 AliEMCALClusterizerNxN.cxx:314
 AliEMCALClusterizerNxN.cxx:315
 AliEMCALClusterizerNxN.cxx:316
 AliEMCALClusterizerNxN.cxx:317
 AliEMCALClusterizerNxN.cxx:318
 AliEMCALClusterizerNxN.cxx:319
 AliEMCALClusterizerNxN.cxx:320
 AliEMCALClusterizerNxN.cxx:321
 AliEMCALClusterizerNxN.cxx:322
 AliEMCALClusterizerNxN.cxx:323
 AliEMCALClusterizerNxN.cxx:324
 AliEMCALClusterizerNxN.cxx:325
 AliEMCALClusterizerNxN.cxx:326
 AliEMCALClusterizerNxN.cxx:327
 AliEMCALClusterizerNxN.cxx:328
 AliEMCALClusterizerNxN.cxx:329
 AliEMCALClusterizerNxN.cxx:330
 AliEMCALClusterizerNxN.cxx:331
 AliEMCALClusterizerNxN.cxx:332
 AliEMCALClusterizerNxN.cxx:333
 AliEMCALClusterizerNxN.cxx:334
 AliEMCALClusterizerNxN.cxx:335
 AliEMCALClusterizerNxN.cxx:336
 AliEMCALClusterizerNxN.cxx:337
 AliEMCALClusterizerNxN.cxx:338
 AliEMCALClusterizerNxN.cxx:339
 AliEMCALClusterizerNxN.cxx:340
 AliEMCALClusterizerNxN.cxx:341
 AliEMCALClusterizerNxN.cxx:342
 AliEMCALClusterizerNxN.cxx:343
 AliEMCALClusterizerNxN.cxx:344
 AliEMCALClusterizerNxN.cxx:345
 AliEMCALClusterizerNxN.cxx:346
 AliEMCALClusterizerNxN.cxx:347
 AliEMCALClusterizerNxN.cxx:348
 AliEMCALClusterizerNxN.cxx:349
 AliEMCALClusterizerNxN.cxx:350
 AliEMCALClusterizerNxN.cxx:351
 AliEMCALClusterizerNxN.cxx:352
 AliEMCALClusterizerNxN.cxx:353
 AliEMCALClusterizerNxN.cxx:354