ROOT logo
#ifndef __CINT__
#include <TString.h>
#include <AliAnalysisManager.h>
#include <AliRsnAnalysisTask.h>
#include <AliRsnDaughterSelector.h>
#include <AliRsnMiniAnalysisTask.h>
#endif
AliAnalysisTaskSE *AddRsnTask(TString rsnPart,TString rsnCut,TString postfix="")
{
   // Analysis Manager
   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
   if (!mgr) { Printf("Error [AddRsnTaskTrain%s] : mgr is null !!!",postfix.Data()); return 0;}

   // initialize task with all available slots, even if not all of them will be used:
   AliAnalysisTaskSE *task = 0;

   Bool_t valid;
   Int_t useMC = AliRsnTrainManager::GetGlobalInt("IsMC",valid);
   Int_t isRsnMini = AliRsnTrainManager::GetGlobalInt("IsRsnMini",valid);
   Int_t physSelBit = AliRsnTrainManager::GetGlobalInt("RsnPhysSelFilterBit",valid);
   Int_t isMixing = AliRsnTrainManager::GetGlobalInt("IsMixing",valid);
   Int_t collisionType = AliRsnTrainManager::GetGlobalInt("IsCollisionType",valid);
   Int_t isAOD049 = AliRsnTrainManager::GetGlobalInt("RsnUseAOD049Patch",valid);

   if (isRsnMini) {
      postfix.Prepend("Mini");
      AliRsnMiniAnalysisTask *taskRsnMini = new AliRsnMiniAnalysisTask(TString::Format("Rsn%s",postfix.Data()).Data(),useMC);
      Int_t refreshPrint = AliRsnTrainManager::GetGlobalInt("RsnMixPrintRefresh",valid);
      if (valid) taskRsnMini->SetMixPrintRefresh(refreshPrint);
      task = (AliAnalysisTaskSE *) taskRsnMini;
   }
   else {
      AliRsnAnalysisTask *taskRsn = new AliRsnAnalysisTask(TString::Format("Rsn%s",postfix.Data()).Data());
      task = (AliAnalysisTaskSE *) taskRsn;
   }

   postfix.Append(TString::Format("_%s_%s",rsnPart.Data(),rsnCut.Data()).Data());

   if (physSelBit>=0) task->SelectCollisionCandidates((AliVEvent::EOfflineTriggerTypes)physSelBit);

   AliRsnInputHandler *rsnIH=0;
   // TODO this is tmp hack
   if (!rsnIH) rsnIH = new AliRsnInputHandler();


   TList *listRsn = new TList();
   listRsn->Add(new TNamed(rsnPart.Data(),rsnCut.Data()));

   if (!RsnLoadMacroTask("RsnConfig.C")) return 0;
   if (!RsnConfig(task,rsnIH,listRsn)) {
      Printf("Error in RsnConfig.C");
      return 0;
   }

   // setup Event Mixing
   if (isMixing) AddEventMixingSettings(task);

   if (isAOD049 && (!useMC) && (collisionType==1)) {
      if (isRsnMini) taskRsnMini->SetUseCentralityPatch(kTRUE);
   }

   // add the task to manager
   mgr->AddTask(task);

   AliRsnDaughterSelector *sel = 0;

   if (!isRsnMini) {
      sel = rsnIH->GetSelector();
      sel->Init();
   }

   // connect input container according to source choice
   mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());

   // create paths for the output in the common file
   TString commonPath = AliAnalysisManager::GetCommonFileName();

   //just small fix to replace ':' by '_' (easier to read)
   postfix.ReplaceAll(":","_");
   // create containers for output
   AliAnalysisDataContainer *output = mgr->CreateContainer(TString::Format("RsnHist%s", postfix.Data()).Data(), TList::Class(), AliAnalysisManager::kOutputContainer, commonPath.Data());

//   // big outout (expert only)
//   Int_t useBigOutput = 0;
//   if (useBigOutput) {
//      Printf("Using Big output ...");
//      task->UseBigOutput();
//      output->SetSpecialOutput();
//      mgr->SetSpecialOutputLocation("root://lx000.saske.sk:21094//tmp/mvala/");
//   }

   mgr->ConnectOutput(task, 1, output);

   return task;
}

void AddEventMixingSettings(AliAnalysisTaskSE *task) {

   Bool_t valid = kTRUE;
   Int_t collisionType = AliRsnTrainManager::GetGlobalInt("IsCollisionType",valid);
   Int_t isRsnMini = AliRsnTrainManager::GetGlobalInt("IsRsnMini",valid);
   Int_t mixNum = AliRsnTrainManager::GetGlobalInt("RsnNumMix",valid);

   Double_t mixDiffMult = AliRsnTrainManager::GetGlobalInt("RsnMixDiffMult",valid);
   Double_t mixDiffVz = AliRsnTrainManager::GetGlobalInt("RsnMixDiffVz",valid);
   Double_t mixDiffAngle = AliRsnTrainManager::GetGlobalInt("RsnMixDiffAngle",valid);

   if (isRsnMini) {
      AliRsnMiniAnalysisTask *taskRsn = (AliRsnMiniAnalysisTask *) task;
      if (collisionType == 0) {
         //         taskRsn->UseMultiplicity("TRACKS");
         taskRsn->UseMultiplicity("QUALITY");
      } else {
         taskRsn->UseCentrality("V0M");
      }
      if (mixDiffMult>0.0) taskRsn->SetMaxDiffMult(mixDiffMult);

      // set mixing
      taskRsn->UseContinuousMix();
      //task->UseBinnedMix();
      taskRsn->SetNMix(mixNum);

      if (mixDiffVz>0.0) taskRsn->SetMaxDiffVz(mixDiffVz);
      if (mixDiffAngle>0.0) taskRsn->SetMaxDiffAngle(mixDiffAngle);
      // 30.0 * TMath::DegToRad()
   }
   // TODO RSN non Mini

}

Bool_t RsnLoadMacroTask(TString macro,TString path="") {

   Bool_t valid;
   TString lego_path = AliAnalysisManager::GetGlobalStr("RsnLegoTrainPath",valid);
   if (!valid) lego_path = "$ALICE_ROOT/PWGLF/RESONANCES/macros/lego_train";

   if (!gSystem->AccessPathName(macro.Data())) {
      gROOT->LoadMacro(macro.Data());
      Printf("Macro loaded from %s/%s ...",gSystem->pwd(),macro.Data());
      return kTRUE;
   }

   if (!gSystem->AccessPathName(gSystem->ExpandPathName(Form("%s/%s",lego_path.Data(),macro.Data())))) {
      gROOT->LoadMacro(gSystem->ExpandPathName(Form("%s/%s",lego_path.Data(),macro.Data())));
      Printf("Macro loaded from %s ...",gSystem->ExpandPathName(Form("%s/%s",lego_path.Data(),macro.Data())));
      return kTRUE;
   }

   Printf("Error loading %s",macro.Data());

   return kFALSE;
 AddRsnTask.C:1
 AddRsnTask.C:2
 AddRsnTask.C:3
 AddRsnTask.C:4
 AddRsnTask.C:5
 AddRsnTask.C:6
 AddRsnTask.C:7
 AddRsnTask.C:8
 AddRsnTask.C:9
 AddRsnTask.C:10
 AddRsnTask.C:11
 AddRsnTask.C:12
 AddRsnTask.C:13
 AddRsnTask.C:14
 AddRsnTask.C:15
 AddRsnTask.C:16
 AddRsnTask.C:17
 AddRsnTask.C:18
 AddRsnTask.C:19
 AddRsnTask.C:20
 AddRsnTask.C:21
 AddRsnTask.C:22
 AddRsnTask.C:23
 AddRsnTask.C:24
 AddRsnTask.C:25
 AddRsnTask.C:26
 AddRsnTask.C:27
 AddRsnTask.C:28
 AddRsnTask.C:29
 AddRsnTask.C:30
 AddRsnTask.C:31
 AddRsnTask.C:32
 AddRsnTask.C:33
 AddRsnTask.C:34
 AddRsnTask.C:35
 AddRsnTask.C:36
 AddRsnTask.C:37
 AddRsnTask.C:38
 AddRsnTask.C:39
 AddRsnTask.C:40
 AddRsnTask.C:41
 AddRsnTask.C:42
 AddRsnTask.C:43
 AddRsnTask.C:44
 AddRsnTask.C:45
 AddRsnTask.C:46
 AddRsnTask.C:47
 AddRsnTask.C:48
 AddRsnTask.C:49
 AddRsnTask.C:50
 AddRsnTask.C:51
 AddRsnTask.C:52
 AddRsnTask.C:53
 AddRsnTask.C:54
 AddRsnTask.C:55
 AddRsnTask.C:56
 AddRsnTask.C:57
 AddRsnTask.C:58
 AddRsnTask.C:59
 AddRsnTask.C:60
 AddRsnTask.C:61
 AddRsnTask.C:62
 AddRsnTask.C:63
 AddRsnTask.C:64
 AddRsnTask.C:65
 AddRsnTask.C:66
 AddRsnTask.C:67
 AddRsnTask.C:68
 AddRsnTask.C:69
 AddRsnTask.C:70
 AddRsnTask.C:71
 AddRsnTask.C:72
 AddRsnTask.C:73
 AddRsnTask.C:74
 AddRsnTask.C:75
 AddRsnTask.C:76
 AddRsnTask.C:77
 AddRsnTask.C:78
 AddRsnTask.C:79
 AddRsnTask.C:80
 AddRsnTask.C:81
 AddRsnTask.C:82
 AddRsnTask.C:83
 AddRsnTask.C:84
 AddRsnTask.C:85
 AddRsnTask.C:86
 AddRsnTask.C:87
 AddRsnTask.C:88
 AddRsnTask.C:89
 AddRsnTask.C:90
 AddRsnTask.C:91
 AddRsnTask.C:92
 AddRsnTask.C:93
 AddRsnTask.C:94
 AddRsnTask.C:95
 AddRsnTask.C:96
 AddRsnTask.C:97
 AddRsnTask.C:98
 AddRsnTask.C:99
 AddRsnTask.C:100
 AddRsnTask.C:101
 AddRsnTask.C:102
 AddRsnTask.C:103
 AddRsnTask.C:104
 AddRsnTask.C:105
 AddRsnTask.C:106
 AddRsnTask.C:107
 AddRsnTask.C:108
 AddRsnTask.C:109
 AddRsnTask.C:110
 AddRsnTask.C:111
 AddRsnTask.C:112
 AddRsnTask.C:113
 AddRsnTask.C:114
 AddRsnTask.C:115
 AddRsnTask.C:116
 AddRsnTask.C:117
 AddRsnTask.C:118
 AddRsnTask.C:119
 AddRsnTask.C:120
 AddRsnTask.C:121
 AddRsnTask.C:122
 AddRsnTask.C:123
 AddRsnTask.C:124
 AddRsnTask.C:125
 AddRsnTask.C:126
 AddRsnTask.C:127
 AddRsnTask.C:128
 AddRsnTask.C:129
 AddRsnTask.C:130
 AddRsnTask.C:131
 AddRsnTask.C:132
 AddRsnTask.C:133
 AddRsnTask.C:134
 AddRsnTask.C:135
 AddRsnTask.C:136
 AddRsnTask.C:137
 AddRsnTask.C:138
 AddRsnTask.C:139
 AddRsnTask.C:140
 AddRsnTask.C:141
 AddRsnTask.C:142
 AddRsnTask.C:143
 AddRsnTask.C:144
 AddRsnTask.C:145
 AddRsnTask.C:146
 AddRsnTask.C:147
 AddRsnTask.C:148
 AddRsnTask.C:149
 AddRsnTask.C:150
 AddRsnTask.C:151
 AddRsnTask.C:152