ROOT logo
// $Id$
//
// Cluster maker task.
//
// Author: C.Loizides

#include <TChain.h>
#include <TClonesArray.h>
#include "AliAODCaloCluster.h"
#include "AliAODEvent.h"
#include "AliAnalysisManager.h"
#include "AliEMCALRecoUtils.h"
#include "AliESDCaloCluster.h"
#include "AliESDEvent.h"
#include "AliEmcalClusterMaker.h"

ClassImp(AliEmcalClusterMaker)

//________________________________________________________________________
AliEmcalClusterMaker::AliEmcalClusterMaker() : 
  AliAnalysisTaskEmcal("AliEmcalClusterMaker", kFALSE),
  fOutCaloName(),
  fRecoUtils(0),
  fEsdMode(kTRUE),
  fOutClusters(0),
  fEnergyDistBefore(0),
  fEtaPhiDistBefore(0),
  fEnergyTimeHistBefore(0),
  fEnergyDistAfter(0),
  fEtaPhiDistAfter(0),
  fEnergyTimeHistAfter(0),
  fEnergyExoticClusters(0)
{
  // Default constructor.
}

//________________________________________________________________________
AliEmcalClusterMaker::AliEmcalClusterMaker(const char *name, Bool_t histo) : 
  AliAnalysisTaskEmcal(name, histo),
  fOutCaloName("EmcClusters"),
  fRecoUtils(0),
  fEsdMode(kTRUE),
  fOutClusters(0),
  fEnergyDistBefore(0),
  fEtaPhiDistBefore(0),
  fEnergyTimeHistBefore(0),
  fEnergyDistAfter(0),
  fEtaPhiDistAfter(0),
  fEnergyTimeHistAfter(0),
  fEnergyExoticClusters(0)
{
  // Standard constructor.
  
  SetMakeGeneralHistograms(histo);

  fBranchNames="ESD:AliESDRun.,AliESDHeader.,PrimaryVertex.";
}

//________________________________________________________________________
AliEmcalClusterMaker::~AliEmcalClusterMaker()
{
  // Destructor
}

//________________________________________________________________________
void AliEmcalClusterMaker::UserCreateOutputObjects()
{
  // Create my user objects.

  AliAnalysisTaskEmcal::UserCreateOutputObjects();

  if (fRecoUtils) {
    fRecoUtils->InitNonLinearityParam();
    fRecoUtils->Print("");
  }

  if (!fCreateHisto) return;

  fEnergyDistBefore = new TH1F("hEnergyDistBefore","hEnergyDistBefore;E_{clus} (GeV)",1500,0,150);
  fOutput->Add(fEnergyDistBefore);
  fEtaPhiDistBefore = new TH2F("hEtaPhiDistBefore","hEtaPhiDistBefore;#eta;#phi",280,-0.7,0.7,800,1.3,3.3);
  fOutput->Add(fEtaPhiDistBefore);
  fEnergyTimeHistBefore = new TH2F("hEnergyTimeDistBefore","hEnergyTimeDistBefore;E_{clus} (GeV);time",60,0,30,500,0,1e-6);
  fOutput->Add(fEnergyTimeHistBefore);
  fEnergyDistAfter = new TH1F("hEnergyDistAfter","hEnergyDistAfter;E_{clus} (GeV)",1500,0,150);
  fOutput->Add(fEnergyDistAfter);
  fEtaPhiDistAfter = new TH2F("hEtaPhiDistAfter","hEtaPhiDistAfter;#eta;#phi",280,-0.7,0.7,800,1.3,3.3);
  fOutput->Add(fEtaPhiDistAfter);
  fEnergyTimeHistAfter = new TH2F("hEnergyTimeDistAfter","hEnergyTimeDistAfter;E_{clus} (GeV);time",60,0,30,500,0,1e-6);
  fOutput->Add(fEnergyTimeHistAfter);
  fEnergyExoticClusters = new TH1F("fEnergyExoticClusters","fEnergyExoticClusters;E_{ex clus} (GeV)",60,0,30);
  fOutput->Add(fEnergyExoticClusters);
  PostData(1, fOutput);
}

//________________________________________________________________________
void AliEmcalClusterMaker::ExecOnce() 
{
  // Initialize the analysis.

  // Do base class initializations and if it fails -> bail out
  AliAnalysisTaskEmcal::ExecOnce();
  if (!fInitialized) 
    return;

  if (dynamic_cast<AliAODEvent*>(InputEvent())) 
    fEsdMode = kFALSE;

  if (fEsdMode) 
    fOutClusters = new TClonesArray("AliESDCaloCluster");
  else 
    fOutClusters = new TClonesArray("AliAODCaloCluster");

  fOutClusters->SetName(fOutCaloName);

  // post output in event if not yet present
  if (!(InputEvent()->FindListObject(fOutCaloName))) {
    InputEvent()->AddObject(fOutClusters);
  } else {
    fInitialized = kFALSE;
    AliFatal(Form("%s: Container with same name %s already present. Aborting", GetName(), fOutCaloName.Data()));
    return;
  }
}

//________________________________________________________________________
Bool_t AliEmcalClusterMaker::Run() 
{
  // Run the cluster maker

  // delete output
  fOutClusters->Delete();

  // loop over clusters
  Int_t clusCount = 0;
  Int_t entries   = fCaloClusters->GetEntries();
  for (Int_t i=0; i<entries; ++i) {
    AliVCluster *clus = static_cast<AliVCluster*>(fCaloClusters->At(i));
    if (!clus || !clus->IsEMCAL())
      continue;

    if (fCreateHisto) {
      fEnergyDistBefore->Fill(clus->E());
      Float_t pos[3] ={0,0,0};
      clus->GetPosition(pos);
      TVector3 vec(pos);
      fEtaPhiDistBefore->Fill(vec.Eta(),vec.Phi());
      fEnergyTimeHistBefore->Fill(clus->E(),clus->GetTOF());
    }

    AliVCluster *oc = 0;
    if (fEsdMode) {
      AliESDCaloCluster *ec = dynamic_cast<AliESDCaloCluster*>(clus);
      if (!ec) continue;
      oc = new ((*fOutClusters)[clusCount]) AliESDCaloCluster(*ec);
    } else { 
      AliAODCaloCluster *ac = dynamic_cast<AliAODCaloCluster*>(clus);
      if (!ac) continue;
      oc = new ((*fOutClusters)[clusCount]) AliAODCaloCluster(*ac);
    }
    if (fRecoUtils) {
      if (fRecoUtils->IsRejectExoticCluster()) {
	Bool_t exRemoval = fRecoUtils->IsRejectExoticCell();
	fRecoUtils->SwitchOnRejectExoticCell();                  //switch on temporarily
	Bool_t exResult = fRecoUtils->IsExoticCluster(oc,fCaloCells);
	if (!exRemoval) fRecoUtils->SwitchOffRejectExoticCell(); //switch back off
	if(exResult) {
	  fEnergyExoticClusters->Fill(oc->E());
	  continue;
	}
      }
      if (fRecoUtils->GetNonLinearityFunction()!=AliEMCALRecoUtils::kNoCorrection) {
	Double_t energy = fRecoUtils->CorrectClusterEnergyLinearity(oc);
	oc->SetE(energy);
      }
    }
    if (!AcceptCluster(oc))
      continue;
    clusCount++;

    if (fCreateHisto) {
      fEnergyDistAfter->Fill(oc->E());
      Float_t pos[3] ={0,0,0};
      oc->GetPosition(pos);
      TVector3 vec(pos);
      fEtaPhiDistAfter->Fill(vec.Eta(),vec.Phi());
      fEnergyTimeHistAfter->Fill(oc->E(),oc->GetTOF());
    }

  }
  if ((clusCount>0) && (clusCount==fOutClusters->GetEntries()))
    fOutClusters->RemoveAt(clusCount);
  return kTRUE;
}
 AliEmcalClusterMaker.cxx:1
 AliEmcalClusterMaker.cxx:2
 AliEmcalClusterMaker.cxx:3
 AliEmcalClusterMaker.cxx:4
 AliEmcalClusterMaker.cxx:5
 AliEmcalClusterMaker.cxx:6
 AliEmcalClusterMaker.cxx:7
 AliEmcalClusterMaker.cxx:8
 AliEmcalClusterMaker.cxx:9
 AliEmcalClusterMaker.cxx:10
 AliEmcalClusterMaker.cxx:11
 AliEmcalClusterMaker.cxx:12
 AliEmcalClusterMaker.cxx:13
 AliEmcalClusterMaker.cxx:14
 AliEmcalClusterMaker.cxx:15
 AliEmcalClusterMaker.cxx:16
 AliEmcalClusterMaker.cxx:17
 AliEmcalClusterMaker.cxx:18
 AliEmcalClusterMaker.cxx:19
 AliEmcalClusterMaker.cxx:20
 AliEmcalClusterMaker.cxx:21
 AliEmcalClusterMaker.cxx:22
 AliEmcalClusterMaker.cxx:23
 AliEmcalClusterMaker.cxx:24
 AliEmcalClusterMaker.cxx:25
 AliEmcalClusterMaker.cxx:26
 AliEmcalClusterMaker.cxx:27
 AliEmcalClusterMaker.cxx:28
 AliEmcalClusterMaker.cxx:29
 AliEmcalClusterMaker.cxx:30
 AliEmcalClusterMaker.cxx:31
 AliEmcalClusterMaker.cxx:32
 AliEmcalClusterMaker.cxx:33
 AliEmcalClusterMaker.cxx:34
 AliEmcalClusterMaker.cxx:35
 AliEmcalClusterMaker.cxx:36
 AliEmcalClusterMaker.cxx:37
 AliEmcalClusterMaker.cxx:38
 AliEmcalClusterMaker.cxx:39
 AliEmcalClusterMaker.cxx:40
 AliEmcalClusterMaker.cxx:41
 AliEmcalClusterMaker.cxx:42
 AliEmcalClusterMaker.cxx:43
 AliEmcalClusterMaker.cxx:44
 AliEmcalClusterMaker.cxx:45
 AliEmcalClusterMaker.cxx:46
 AliEmcalClusterMaker.cxx:47
 AliEmcalClusterMaker.cxx:48
 AliEmcalClusterMaker.cxx:49
 AliEmcalClusterMaker.cxx:50
 AliEmcalClusterMaker.cxx:51
 AliEmcalClusterMaker.cxx:52
 AliEmcalClusterMaker.cxx:53
 AliEmcalClusterMaker.cxx:54
 AliEmcalClusterMaker.cxx:55
 AliEmcalClusterMaker.cxx:56
 AliEmcalClusterMaker.cxx:57
 AliEmcalClusterMaker.cxx:58
 AliEmcalClusterMaker.cxx:59
 AliEmcalClusterMaker.cxx:60
 AliEmcalClusterMaker.cxx:61
 AliEmcalClusterMaker.cxx:62
 AliEmcalClusterMaker.cxx:63
 AliEmcalClusterMaker.cxx:64
 AliEmcalClusterMaker.cxx:65
 AliEmcalClusterMaker.cxx:66
 AliEmcalClusterMaker.cxx:67
 AliEmcalClusterMaker.cxx:68
 AliEmcalClusterMaker.cxx:69
 AliEmcalClusterMaker.cxx:70
 AliEmcalClusterMaker.cxx:71
 AliEmcalClusterMaker.cxx:72
 AliEmcalClusterMaker.cxx:73
 AliEmcalClusterMaker.cxx:74
 AliEmcalClusterMaker.cxx:75
 AliEmcalClusterMaker.cxx:76
 AliEmcalClusterMaker.cxx:77
 AliEmcalClusterMaker.cxx:78
 AliEmcalClusterMaker.cxx:79
 AliEmcalClusterMaker.cxx:80
 AliEmcalClusterMaker.cxx:81
 AliEmcalClusterMaker.cxx:82
 AliEmcalClusterMaker.cxx:83
 AliEmcalClusterMaker.cxx:84
 AliEmcalClusterMaker.cxx:85
 AliEmcalClusterMaker.cxx:86
 AliEmcalClusterMaker.cxx:87
 AliEmcalClusterMaker.cxx:88
 AliEmcalClusterMaker.cxx:89
 AliEmcalClusterMaker.cxx:90
 AliEmcalClusterMaker.cxx:91
 AliEmcalClusterMaker.cxx:92
 AliEmcalClusterMaker.cxx:93
 AliEmcalClusterMaker.cxx:94
 AliEmcalClusterMaker.cxx:95
 AliEmcalClusterMaker.cxx:96
 AliEmcalClusterMaker.cxx:97
 AliEmcalClusterMaker.cxx:98
 AliEmcalClusterMaker.cxx:99
 AliEmcalClusterMaker.cxx:100
 AliEmcalClusterMaker.cxx:101
 AliEmcalClusterMaker.cxx:102
 AliEmcalClusterMaker.cxx:103
 AliEmcalClusterMaker.cxx:104
 AliEmcalClusterMaker.cxx:105
 AliEmcalClusterMaker.cxx:106
 AliEmcalClusterMaker.cxx:107
 AliEmcalClusterMaker.cxx:108
 AliEmcalClusterMaker.cxx:109
 AliEmcalClusterMaker.cxx:110
 AliEmcalClusterMaker.cxx:111
 AliEmcalClusterMaker.cxx:112
 AliEmcalClusterMaker.cxx:113
 AliEmcalClusterMaker.cxx:114
 AliEmcalClusterMaker.cxx:115
 AliEmcalClusterMaker.cxx:116
 AliEmcalClusterMaker.cxx:117
 AliEmcalClusterMaker.cxx:118
 AliEmcalClusterMaker.cxx:119
 AliEmcalClusterMaker.cxx:120
 AliEmcalClusterMaker.cxx:121
 AliEmcalClusterMaker.cxx:122
 AliEmcalClusterMaker.cxx:123
 AliEmcalClusterMaker.cxx:124
 AliEmcalClusterMaker.cxx:125
 AliEmcalClusterMaker.cxx:126
 AliEmcalClusterMaker.cxx:127
 AliEmcalClusterMaker.cxx:128
 AliEmcalClusterMaker.cxx:129
 AliEmcalClusterMaker.cxx:130
 AliEmcalClusterMaker.cxx:131
 AliEmcalClusterMaker.cxx:132
 AliEmcalClusterMaker.cxx:133
 AliEmcalClusterMaker.cxx:134
 AliEmcalClusterMaker.cxx:135
 AliEmcalClusterMaker.cxx:136
 AliEmcalClusterMaker.cxx:137
 AliEmcalClusterMaker.cxx:138
 AliEmcalClusterMaker.cxx:139
 AliEmcalClusterMaker.cxx:140
 AliEmcalClusterMaker.cxx:141
 AliEmcalClusterMaker.cxx:142
 AliEmcalClusterMaker.cxx:143
 AliEmcalClusterMaker.cxx:144
 AliEmcalClusterMaker.cxx:145
 AliEmcalClusterMaker.cxx:146
 AliEmcalClusterMaker.cxx:147
 AliEmcalClusterMaker.cxx:148
 AliEmcalClusterMaker.cxx:149
 AliEmcalClusterMaker.cxx:150
 AliEmcalClusterMaker.cxx:151
 AliEmcalClusterMaker.cxx:152
 AliEmcalClusterMaker.cxx:153
 AliEmcalClusterMaker.cxx:154
 AliEmcalClusterMaker.cxx:155
 AliEmcalClusterMaker.cxx:156
 AliEmcalClusterMaker.cxx:157
 AliEmcalClusterMaker.cxx:158
 AliEmcalClusterMaker.cxx:159
 AliEmcalClusterMaker.cxx:160
 AliEmcalClusterMaker.cxx:161
 AliEmcalClusterMaker.cxx:162
 AliEmcalClusterMaker.cxx:163
 AliEmcalClusterMaker.cxx:164
 AliEmcalClusterMaker.cxx:165
 AliEmcalClusterMaker.cxx:166
 AliEmcalClusterMaker.cxx:167
 AliEmcalClusterMaker.cxx:168
 AliEmcalClusterMaker.cxx:169
 AliEmcalClusterMaker.cxx:170
 AliEmcalClusterMaker.cxx:171
 AliEmcalClusterMaker.cxx:172
 AliEmcalClusterMaker.cxx:173
 AliEmcalClusterMaker.cxx:174
 AliEmcalClusterMaker.cxx:175
 AliEmcalClusterMaker.cxx:176
 AliEmcalClusterMaker.cxx:177
 AliEmcalClusterMaker.cxx:178
 AliEmcalClusterMaker.cxx:179
 AliEmcalClusterMaker.cxx:180
 AliEmcalClusterMaker.cxx:181
 AliEmcalClusterMaker.cxx:182
 AliEmcalClusterMaker.cxx:183
 AliEmcalClusterMaker.cxx:184
 AliEmcalClusterMaker.cxx:185
 AliEmcalClusterMaker.cxx:186
 AliEmcalClusterMaker.cxx:187
 AliEmcalClusterMaker.cxx:188
 AliEmcalClusterMaker.cxx:189
 AliEmcalClusterMaker.cxx:190
 AliEmcalClusterMaker.cxx:191
 AliEmcalClusterMaker.cxx:192
 AliEmcalClusterMaker.cxx:193
 AliEmcalClusterMaker.cxx:194