ROOT logo
// $Id$
//
// Emcal physics selection task.
//
// Author: C.Loizides

#include <TFile.h>
#include <TH1F.h>
#include <TH2F.h>
#include <TROOT.h>
#include "AliAnalysisDataContainer.h"
#include "AliAnalysisDataSlot.h"
#include "AliAnalysisManager.h"
#include "AliEmcalPhysicsSelection.h"
#include "AliEmcalPhysicsSelectionTask.h"
#include "AliESDEvent.h"
#include "AliInputEventHandler.h"
#include "AliLog.h"

ClassImp(AliEmcalPhysicsSelectionTask)

//__________________________________________________________________________________________________
AliEmcalPhysicsSelectionTask::AliEmcalPhysicsSelectionTask() :
  AliPhysicsSelectionTask(),
  fDoWriteHistos(1),
  fNCalled(0),
  fNAccepted(0),
  fHAcc(0),
  fHEvtTypes(0)
{
  // Default constructor.
}

//__________________________________________________________________________________________________
AliEmcalPhysicsSelectionTask::AliEmcalPhysicsSelectionTask(const char* opt) : 
  AliPhysicsSelectionTask(),
  fDoWriteHistos(1),
  fNCalled(0),
  fNAccepted(0),
  fHAcc(0),
  fHEvtTypes(0)
{
  // Constructor.

  fOption = opt;
  fPhysicsSelection = new AliEmcalPhysicsSelection;

  AliInputEventHandler* handler = dynamic_cast<AliInputEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
  if (handler) {
    handler->SetEventSelection(fPhysicsSelection);
    AliInfo("Physics Event Selection enabled.");
  } else {
    AliError("No input event handler connected to analysis manager. No Physics Event Selection.");
  }
  // Define input and output slots here
  DefineOutput(1, TList::Class());
  fBranchNames = "ESD:AliESDRun.,AliESDHeader.,AliMultiplicity.,AliESDVZERO.,"
                 "AliESDZDC.,SPDVertex.,PrimaryVertex.,TPCVertex.,Tracks,SPDPileupVertices";
  
  AliLog::SetClassDebugLevel("AliEmcalPhysicsSelectionTask", AliLog::kWarning);
}

//__________________________________________________________________________________________________
void AliEmcalPhysicsSelectionTask::UserCreateOutputObjects()
{
  // User create outputs.

  AliPhysicsSelectionTask::UserCreateOutputObjects();
  fHAcc = new TH1D("hEvCount",";0=rej/1=acc;#",2,-0.5,1.5);
  fOutput->Add(fHAcc);
  fHEvtTypes = new TH1D("hEvtTypes",";#",12,-0.5,11.5);
  fHEvtTypes->GetXaxis()->SetBinLabel(1,  "All");
  fHEvtTypes->GetXaxis()->SetBinLabel(2,  "MB");
  fHEvtTypes->GetXaxis()->SetBinLabel(3,  "FO");
  fHEvtTypes->GetXaxis()->SetBinLabel(4,  "SC");
  fHEvtTypes->GetXaxis()->SetBinLabel(5,  "CE");
  fHEvtTypes->GetXaxis()->SetBinLabel(6,  "EMC");
  fHEvtTypes->GetXaxis()->SetBinLabel(7,  "EJE");
  fHEvtTypes->GetXaxis()->SetBinLabel(8,  "EGA");
  fHEvtTypes->GetXaxis()->SetBinLabel(9,  "Good");
  fHEvtTypes->GetXaxis()->SetBinLabel(10, "HC");
  fHEvtTypes->GetXaxis()->SetBinLabel(11, "HT");
  fHEvtTypes->GetXaxis()->SetBinLabel(12, "LED");
  fOutput->Add(fHEvtTypes);
  if (!fDoWriteHistos) {
    fOutput->Remove(fPhysicsSelection);
  }
}

//__________________________________________________________________________________________________
void AliEmcalPhysicsSelectionTask::UserExec(const Option_t *opt)
{
  // User exec.

  AliPhysicsSelectionTask::UserExec(opt);

  ++fNCalled;

  UInt_t res = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
  if (res>0) {
    ++fNAccepted;
    fHAcc->Fill(1);
  } else {
    fHAcc->Fill(0);
  }

  AliEmcalPhysicsSelection *ps=static_cast<AliEmcalPhysicsSelection *>(fPhysicsSelection);
  fHEvtTypes->Fill(0);
  if (res&AliVEvent::kAnyINT)
    fHEvtTypes->Fill(1);
  if (ps->IsFastOnly())
    fHEvtTypes->Fill(2);
  if (res&AliVEvent::kCentral)
    fHEvtTypes->Fill(3);
  if (res&AliVEvent::kSemiCentral)
    fHEvtTypes->Fill(4);
  if ((res&AliVEvent::kEMC1) || (res&AliVEvent::kEMC7))
    fHEvtTypes->Fill(5);
  if (res&AliVEvent::kEMCEJE)
    fHEvtTypes->Fill(6);
  if (res&AliVEvent::kEMCEGA)
    fHEvtTypes->Fill(7);
  if (res&AliEmcalPhysicsSelection::kEmcalOk)
    fHEvtTypes->Fill(8);
  if (res&AliEmcalPhysicsSelection::kEmcalHC)
    fHEvtTypes->Fill(9);
  if (res&AliEmcalPhysicsSelection::kEmcalHT)
    fHEvtTypes->Fill(10);
  if (ps->IsLedEvent())
    fHEvtTypes->Fill(11);
}

//__________________________________________________________________________________________________
void AliEmcalPhysicsSelectionTask::Terminate(Option_t *)
{
  // The Terminate() function is the last function to be called during
  // a query. It always runs on the client, it can be used to present
  // the results graphically or save the results to file.

  AliInfo(Form("Called %d times, accepted %d events", fNCalled, fNAccepted));

  if (!fDoWriteHistos)
    return;

  fOutput = dynamic_cast<TList*> (GetOutputData(1));
  if (!fOutput) {
    AliError("fOutput not available");
    return;
  }

  AliAnalysisDataSlot *oslot = GetOutputSlot(1);
  if (!oslot)
    return;

  AliAnalysisDataContainer *ocont = oslot->GetContainer();
  if (!ocont)
    return;

  TFile *file = OpenFile(1);
  if (!file)
    return;

  TDirectory::TContext context(file); 
  if (AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
    fPhysicsSelection = dynamic_cast<AliPhysicsSelection*> (fOutput->FindObject("AliPhysicsSelection"));
  }
  if (fPhysicsSelection) {
    //fPhysicsSelection->Print();
    fPhysicsSelection->SaveHistograms(Form("%sHists",ocont->GetName()));
    AliInfo(Form("Writing result to %s",file->GetName()));
  }
  fOutput->Remove(fPhysicsSelection);
}
 AliEmcalPhysicsSelectionTask.cxx:1
 AliEmcalPhysicsSelectionTask.cxx:2
 AliEmcalPhysicsSelectionTask.cxx:3
 AliEmcalPhysicsSelectionTask.cxx:4
 AliEmcalPhysicsSelectionTask.cxx:5
 AliEmcalPhysicsSelectionTask.cxx:6
 AliEmcalPhysicsSelectionTask.cxx:7
 AliEmcalPhysicsSelectionTask.cxx:8
 AliEmcalPhysicsSelectionTask.cxx:9
 AliEmcalPhysicsSelectionTask.cxx:10
 AliEmcalPhysicsSelectionTask.cxx:11
 AliEmcalPhysicsSelectionTask.cxx:12
 AliEmcalPhysicsSelectionTask.cxx:13
 AliEmcalPhysicsSelectionTask.cxx:14
 AliEmcalPhysicsSelectionTask.cxx:15
 AliEmcalPhysicsSelectionTask.cxx:16
 AliEmcalPhysicsSelectionTask.cxx:17
 AliEmcalPhysicsSelectionTask.cxx:18
 AliEmcalPhysicsSelectionTask.cxx:19
 AliEmcalPhysicsSelectionTask.cxx:20
 AliEmcalPhysicsSelectionTask.cxx:21
 AliEmcalPhysicsSelectionTask.cxx:22
 AliEmcalPhysicsSelectionTask.cxx:23
 AliEmcalPhysicsSelectionTask.cxx:24
 AliEmcalPhysicsSelectionTask.cxx:25
 AliEmcalPhysicsSelectionTask.cxx:26
 AliEmcalPhysicsSelectionTask.cxx:27
 AliEmcalPhysicsSelectionTask.cxx:28
 AliEmcalPhysicsSelectionTask.cxx:29
 AliEmcalPhysicsSelectionTask.cxx:30
 AliEmcalPhysicsSelectionTask.cxx:31
 AliEmcalPhysicsSelectionTask.cxx:32
 AliEmcalPhysicsSelectionTask.cxx:33
 AliEmcalPhysicsSelectionTask.cxx:34
 AliEmcalPhysicsSelectionTask.cxx:35
 AliEmcalPhysicsSelectionTask.cxx:36
 AliEmcalPhysicsSelectionTask.cxx:37
 AliEmcalPhysicsSelectionTask.cxx:38
 AliEmcalPhysicsSelectionTask.cxx:39
 AliEmcalPhysicsSelectionTask.cxx:40
 AliEmcalPhysicsSelectionTask.cxx:41
 AliEmcalPhysicsSelectionTask.cxx:42
 AliEmcalPhysicsSelectionTask.cxx:43
 AliEmcalPhysicsSelectionTask.cxx:44
 AliEmcalPhysicsSelectionTask.cxx:45
 AliEmcalPhysicsSelectionTask.cxx:46
 AliEmcalPhysicsSelectionTask.cxx:47
 AliEmcalPhysicsSelectionTask.cxx:48
 AliEmcalPhysicsSelectionTask.cxx:49
 AliEmcalPhysicsSelectionTask.cxx:50
 AliEmcalPhysicsSelectionTask.cxx:51
 AliEmcalPhysicsSelectionTask.cxx:52
 AliEmcalPhysicsSelectionTask.cxx:53
 AliEmcalPhysicsSelectionTask.cxx:54
 AliEmcalPhysicsSelectionTask.cxx:55
 AliEmcalPhysicsSelectionTask.cxx:56
 AliEmcalPhysicsSelectionTask.cxx:57
 AliEmcalPhysicsSelectionTask.cxx:58
 AliEmcalPhysicsSelectionTask.cxx:59
 AliEmcalPhysicsSelectionTask.cxx:60
 AliEmcalPhysicsSelectionTask.cxx:61
 AliEmcalPhysicsSelectionTask.cxx:62
 AliEmcalPhysicsSelectionTask.cxx:63
 AliEmcalPhysicsSelectionTask.cxx:64
 AliEmcalPhysicsSelectionTask.cxx:65
 AliEmcalPhysicsSelectionTask.cxx:66
 AliEmcalPhysicsSelectionTask.cxx:67
 AliEmcalPhysicsSelectionTask.cxx:68
 AliEmcalPhysicsSelectionTask.cxx:69
 AliEmcalPhysicsSelectionTask.cxx:70
 AliEmcalPhysicsSelectionTask.cxx:71
 AliEmcalPhysicsSelectionTask.cxx:72
 AliEmcalPhysicsSelectionTask.cxx:73
 AliEmcalPhysicsSelectionTask.cxx:74
 AliEmcalPhysicsSelectionTask.cxx:75
 AliEmcalPhysicsSelectionTask.cxx:76
 AliEmcalPhysicsSelectionTask.cxx:77
 AliEmcalPhysicsSelectionTask.cxx:78
 AliEmcalPhysicsSelectionTask.cxx:79
 AliEmcalPhysicsSelectionTask.cxx:80
 AliEmcalPhysicsSelectionTask.cxx:81
 AliEmcalPhysicsSelectionTask.cxx:82
 AliEmcalPhysicsSelectionTask.cxx:83
 AliEmcalPhysicsSelectionTask.cxx:84
 AliEmcalPhysicsSelectionTask.cxx:85
 AliEmcalPhysicsSelectionTask.cxx:86
 AliEmcalPhysicsSelectionTask.cxx:87
 AliEmcalPhysicsSelectionTask.cxx:88
 AliEmcalPhysicsSelectionTask.cxx:89
 AliEmcalPhysicsSelectionTask.cxx:90
 AliEmcalPhysicsSelectionTask.cxx:91
 AliEmcalPhysicsSelectionTask.cxx:92
 AliEmcalPhysicsSelectionTask.cxx:93
 AliEmcalPhysicsSelectionTask.cxx:94
 AliEmcalPhysicsSelectionTask.cxx:95
 AliEmcalPhysicsSelectionTask.cxx:96
 AliEmcalPhysicsSelectionTask.cxx:97
 AliEmcalPhysicsSelectionTask.cxx:98
 AliEmcalPhysicsSelectionTask.cxx:99
 AliEmcalPhysicsSelectionTask.cxx:100
 AliEmcalPhysicsSelectionTask.cxx:101
 AliEmcalPhysicsSelectionTask.cxx:102
 AliEmcalPhysicsSelectionTask.cxx:103
 AliEmcalPhysicsSelectionTask.cxx:104
 AliEmcalPhysicsSelectionTask.cxx:105
 AliEmcalPhysicsSelectionTask.cxx:106
 AliEmcalPhysicsSelectionTask.cxx:107
 AliEmcalPhysicsSelectionTask.cxx:108
 AliEmcalPhysicsSelectionTask.cxx:109
 AliEmcalPhysicsSelectionTask.cxx:110
 AliEmcalPhysicsSelectionTask.cxx:111
 AliEmcalPhysicsSelectionTask.cxx:112
 AliEmcalPhysicsSelectionTask.cxx:113
 AliEmcalPhysicsSelectionTask.cxx:114
 AliEmcalPhysicsSelectionTask.cxx:115
 AliEmcalPhysicsSelectionTask.cxx:116
 AliEmcalPhysicsSelectionTask.cxx:117
 AliEmcalPhysicsSelectionTask.cxx:118
 AliEmcalPhysicsSelectionTask.cxx:119
 AliEmcalPhysicsSelectionTask.cxx:120
 AliEmcalPhysicsSelectionTask.cxx:121
 AliEmcalPhysicsSelectionTask.cxx:122
 AliEmcalPhysicsSelectionTask.cxx:123
 AliEmcalPhysicsSelectionTask.cxx:124
 AliEmcalPhysicsSelectionTask.cxx:125
 AliEmcalPhysicsSelectionTask.cxx:126
 AliEmcalPhysicsSelectionTask.cxx:127
 AliEmcalPhysicsSelectionTask.cxx:128
 AliEmcalPhysicsSelectionTask.cxx:129
 AliEmcalPhysicsSelectionTask.cxx:130
 AliEmcalPhysicsSelectionTask.cxx:131
 AliEmcalPhysicsSelectionTask.cxx:132
 AliEmcalPhysicsSelectionTask.cxx:133
 AliEmcalPhysicsSelectionTask.cxx:134
 AliEmcalPhysicsSelectionTask.cxx:135
 AliEmcalPhysicsSelectionTask.cxx:136
 AliEmcalPhysicsSelectionTask.cxx:137
 AliEmcalPhysicsSelectionTask.cxx:138
 AliEmcalPhysicsSelectionTask.cxx:139
 AliEmcalPhysicsSelectionTask.cxx:140
 AliEmcalPhysicsSelectionTask.cxx:141
 AliEmcalPhysicsSelectionTask.cxx:142
 AliEmcalPhysicsSelectionTask.cxx:143
 AliEmcalPhysicsSelectionTask.cxx:144
 AliEmcalPhysicsSelectionTask.cxx:145
 AliEmcalPhysicsSelectionTask.cxx:146
 AliEmcalPhysicsSelectionTask.cxx:147
 AliEmcalPhysicsSelectionTask.cxx:148
 AliEmcalPhysicsSelectionTask.cxx:149
 AliEmcalPhysicsSelectionTask.cxx:150
 AliEmcalPhysicsSelectionTask.cxx:151
 AliEmcalPhysicsSelectionTask.cxx:152
 AliEmcalPhysicsSelectionTask.cxx:153
 AliEmcalPhysicsSelectionTask.cxx:154
 AliEmcalPhysicsSelectionTask.cxx:155
 AliEmcalPhysicsSelectionTask.cxx:156
 AliEmcalPhysicsSelectionTask.cxx:157
 AliEmcalPhysicsSelectionTask.cxx:158
 AliEmcalPhysicsSelectionTask.cxx:159
 AliEmcalPhysicsSelectionTask.cxx:160
 AliEmcalPhysicsSelectionTask.cxx:161
 AliEmcalPhysicsSelectionTask.cxx:162
 AliEmcalPhysicsSelectionTask.cxx:163
 AliEmcalPhysicsSelectionTask.cxx:164
 AliEmcalPhysicsSelectionTask.cxx:165
 AliEmcalPhysicsSelectionTask.cxx:166
 AliEmcalPhysicsSelectionTask.cxx:167
 AliEmcalPhysicsSelectionTask.cxx:168
 AliEmcalPhysicsSelectionTask.cxx:169
 AliEmcalPhysicsSelectionTask.cxx:170
 AliEmcalPhysicsSelectionTask.cxx:171
 AliEmcalPhysicsSelectionTask.cxx:172
 AliEmcalPhysicsSelectionTask.cxx:173