#include "AliBaseESDTask.h"
#include "AliFMDEventInspector.h"
#include "AliForwardCorrectionManager.h"
#include "AliForwardUtil.h"
#include "AliFMDCorrELossFit.h"
#include <AliAnalysisManager.h>
#include <AliAODHandler.h>
#include <AliLog.h>
#include <AliESDEvent.h>
#include <TROOT.h>
#include <TSystem.h>
#include <TInterpreter.h>
#include <iostream>
#include <iomanip>
AliBaseESDTask::AliBaseESDTask()
: AliAnalysisTaskSE(),
fFirstEvent(true),
fList(0),
fResults(0),
fNeededCorrections(0),
fExtraCorrections(0),
fCloneList(false),
fCorrManager(0)
{}
AliBaseESDTask::AliBaseESDTask(const char* name, const char* title,
AliCorrectionManagerBase* manager)
: AliAnalysisTaskSE(name),
fFirstEvent(true),
fList(0),
fResults(0),
fNeededCorrections(0),
fExtraCorrections(0),
fCloneList(false),
fCorrManager(0)
{
SetTitle(title && title[0] != '\0' ? title : "");
fCorrManager = manager;
fBranchNames =
"ESD:AliESDRun.,AliESDHeader.,AliMultiplicity.,"
"AliESDFMD.,SPDVertex.,PrimaryVertex.";
DefineOutput(1, TList::Class());
DefineOutput(2, TList::Class());
}
Bool_t
AliBaseESDTask::Connect(const char* sumFile,
const char* resFile,
Bool_t old)
{
AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
if (!mgr) {
Error("AddTaskForwardMult", "No analysis manager to connect to.");
return false;
}
mgr->AddTask(this);
TString sumOut;
TString resOut;
if (sumFile && sumFile[0] != '\0') sumOut = sumFile;
if (resFile && resFile[0] != '\0') resOut = resFile;
else if (sumFile && sumFile[0] != '\0') resOut = sumFile;
if (sumOut.IsNull() || sumOut.EqualTo("default", TString::kIgnoreCase))
sumOut = AliAnalysisManager::GetCommonFileName();
if (resOut.IsNull() || resOut.EqualTo("default", TString::kIgnoreCase))
resOut = AliAnalysisManager::GetCommonFileName();
mgr->ConnectInput(this, 0, mgr->GetCommonInputContainer());
if (!sumOut.EqualTo("none", TString::kIgnoreCase)) {
TString sumName(Form("%s%s", old ? "Forward" : GetName(), old ? "" : "Sums"));
AliAnalysisDataContainer* sumCon =
mgr->CreateContainer(sumName, TList::Class(),
AliAnalysisManager::kOutputContainer, sumOut);
mgr->ConnectOutput(this, 1, sumCon);
}
if (!resOut.EqualTo("none", TString::kIgnoreCase)) {
TString resName(Form("%sResults", GetName()));
AliAnalysisDataContainer* resCon =
mgr->CreateContainer(resName, TList::Class(),
AliAnalysisManager::kParamContainer, resOut);
mgr->ConnectOutput(this, 2, resCon);
}
return true;
}
TAxis*
AliBaseESDTask::DefaultEtaAxis() const
{
static TAxis* a = new TAxis(200, -4, 6);
return a;
}
TAxis*
AliBaseESDTask::DefaultVertexAxis() const
{
static TAxis* a = AliForwardUtil::MakeFullIpZAxis(20);
return a;
}
void
AliBaseESDTask::SetDebug(Int_t dbg)
{
GetEventInspector().SetDebug(dbg);
}
Bool_t
AliBaseESDTask::Configure(const char* macro)
{
TString macroPath(gROOT->GetMacroPath());
if (!macroPath.Contains("$(ALICE_ROOT)/PWGLF/FORWARD/analysis2")) {
macroPath.Append(":$(ALICE_ROOT)/PWGLF/FORWARD/analysis2");
gROOT->SetMacroPath(macroPath);
}
TString mac(macro);
if (mac.EqualTo("-default-")) mac = DefaultConfig();
const char* config = gSystem->Which(gROOT->GetMacroPath(), mac.Data());
if (!config) {
AliWarningF("%s not found in %s", mac.Data(), gROOT->GetMacroPath());
return false;
}
if (fTitle.IsNull()) fTitle = this->ClassName();
AliInfoF("Loading configuration of '%s' from %s", ClassName(), config);
gROOT->Macro(Form("%s((%s*)%p)", config, GetTitle(), this));
Info("Configure", "Unloading configuration script");
gInterpreter->UnloadFile(config);
delete config;
return true;
}
void
AliBaseESDTask::LocalInit()
{
fFirstEvent = true;
DGUARD(fDebug,1,"Doing local initialization");
Setup();
}
void
AliBaseESDTask::UserCreateOutputObjects()
{
DGUARD(fDebug,1,"Create user ouput");
fList = new TList;
fList->SetName(Form("%sSums", GetName()));
fList->SetOwner();
AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
AliAODHandler* ah =
dynamic_cast<AliAODHandler*>(am->GetOutputEventHandler());
if (ah) CreateBranches(ah);
GetEventInspector().CreateOutputObjects(fList);
if (!Book()) AliFatalF("Failed to book output objects for %s", GetName());
PostData(1, fList);
}
void
AliBaseESDTask::UserExec(Option_t*)
{
PreEvent();
LoadBranches();
AliESDEvent* esd = GetESDEvent();
if (!esd) return;
Event(*esd);
PostData(1, fList);
PostEvent();
}
void
AliBaseESDTask::Terminate(Option_t*)
{
TList* list = dynamic_cast<TList*>(GetOutputData(1));
if (!list) {
AliError(Form("No output list defined (%p)", GetOutputData(1)));
if (GetOutputData(1)) GetOutputData(1)->Print();
return;
}
fList = list;
TString resName(Form("%sResults", GetName()));
if (fCloneList)
fResults = static_cast<TList*>(fList->Clone(resName));
else {
fResults = new TList;
fResults->SetName(resName);
}
fResults->SetOwner();
if (!Finalize()) {
AliErrorF("Failed to finalize this task (%s)", GetName());
return;
}
PostData(2, fResults);
}
Bool_t
AliBaseESDTask::PreData(const TAxis&, const TAxis&)
{
return true;
}
Bool_t
AliBaseESDTask::CheckCorrections(UInt_t what) const
{
DGUARD(fDebug,1,"Checking corrections 0x%x", what);
if (what == 0) return true;
AliCorrectionManagerBase* cm = GetManager();
if (!cm) {
AliErrorF("Check corrections=0x%x not null, "
"but no correction manager defined!",
what);
return false;
}
Bool_t ret = cm->CheckCorrections(what);
return ret;
}
Bool_t
AliBaseESDTask::ReadCorrections(const TAxis*& pe,
const TAxis*& pv,
Bool_t mc,
Bool_t sat)
{
UInt_t what = fNeededCorrections|fExtraCorrections;
DGUARD(fDebug,1,"Read corrections 0x%x", what);
AliCorrectionManagerBase* cm = GetManager();
if (!cm && fNeededCorrections) {
AliErrorF("Needed/extra corrections=0x%x/0x%x not null, "
"but no correction manager defined!",
fNeededCorrections, fExtraCorrections);
return false;
}
if (!cm || !what) {
if (!pe) pe = DefaultEtaAxis();
if (!pv) pv = DefaultVertexAxis();
return true;
}
cm->EnableCorrections(what);
if (!cm->InitCorrections(GetEventInspector().GetRunNumber(),
GetEventInspector().GetCollisionSystem(),
GetEventInspector().GetEnergy(),
GetEventInspector().GetField(),
mc,
sat,
false)) {
AliWarning("Failed to read in some corrections, making task zombie");
return false;
}
if (!CheckCorrections(fNeededCorrections)) return false;
if (!pe) {
pe = cm->GetEtaAxis();
if (!pe) pe = DefaultEtaAxis();
}
if (!pv) {
pv = cm->GetVertexAxis();
if (!pv) pv = DefaultVertexAxis();
}
return true;
}
AliESDEvent*
AliBaseESDTask::GetESDEvent()
{
DGUARD(fDebug,1,"Get the ESD event");
if (IsZombie()) return 0;
AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
if (!esd) {
AliWarning("No ESD event found for input event");
return 0;
}
LoadBranches();
if (!fFirstEvent || !esd->GetESDRun()) return esd;
GetEventInspector().SetMC(MCEvent());
GetEventInspector().ReadRunDetails(esd);
AliInfoF("Initializing with parameters from the ESD:\n"
" AliESDEvent::GetBeamEnergy() ->%f\n"
" AliESDEvent::GetBeamType() ->%s\n"
" AliESDEvent::GetCurrentL3() ->%f\n"
" AliESDEvent::GetMagneticField()->%f\n"
" AliESDEvent::GetRunNumber() ->%d",
esd->GetBeamEnergy(),
esd->GetBeamType(),
esd->GetCurrentL3(),
esd->GetMagneticField(),
esd->GetRunNumber());
PreCorrections(esd);
fFirstEvent = false;
const TAxis* pe = 0;
const TAxis* pv = 0;
Bool_t mc = IsMC();
Bool_t sat = false;
Bool_t ret = ReadCorrections(pe, pv, mc, sat);
if (!ret) {
AliError("Failed to read corrections, making this a zombie");
SetZombie(true);
return 0;
}
Printf("Vertex axis: %p Eta axis: %p", pv, pe);
if (!pv) AliFatal("No vertex axis defined");
if (!pe) AliFatal("No eta axis defined");
GetEventInspector().SetupForData(*pv);
if (!PreData(*pv, *pe)) {
AliError("Failed to initialize sub-algorithms, making this a zombie");
SetZombie(true);
return 0;
}
this->Print("R");
return esd;
}
void
AliBaseESDTask::MarkEventForStore() const
{
DGUARD(fDebug,3,"Mark AOD event for storage");
AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
AliAODHandler* ah =
dynamic_cast<AliAODHandler*>(am->GetOutputEventHandler());
if (ah) ah->SetFillAOD(kTRUE);
}
#define PF(N,V,...) \
AliForwardUtil::PrintField(N,V, ## __VA_ARGS__)
#define PFB(N,FLAG) \
do { \
AliForwardUtil::PrintName(N); \
std::cout << std::boolalpha << (FLAG) << std::noboolalpha << std::endl; \
} while(false)
#define PFV(N,VALUE) \
do { \
AliForwardUtil::PrintName(N); \
std::cout << (VALUE) << std::endl; } while(false)
void
AliBaseESDTask::Print(Option_t* option) const
{
std::cout << std::setfill('=') << std::setw(75) << "="
<< std::setfill(' ') << std::endl;
AliForwardUtil::PrintTask(*this);
gROOT->IncreaseDirLevel();
PF("Off-line trigger mask", "0x%0x", fOfflineTriggerMask);
if (GetManager()) GetManager()->Print(option);
else PF("No correction manager","");
GetEventInspector().Print(option);
gROOT->DecreaseDirLevel();
}