ROOT logo
//
// Configuration script for monitor task with 2010 runs
//
// It contains a class definition where the cuts for each object
// are defined separately, functions are initialized and so on.
// This is used in the main function (named after the file name),
// which is called by the 'AddTask' function.
//

#if !defined(__CINT__) || defined(__MAKECINT__)

   #include "TString.h"
   #include "AliAnalysisManager.h"
   #include "AliRsnValue.h"
   #include "AliRsnFunction.h"
   #include "AliRsnCutValue.h"
   #include "AliRsnCutPrimaryVertex.h"
   #include "AliRsnAnalysisTask.h"

#endif

Bool_t AddRsnEventComputations(Bool_t isMC, const char *options = "", const char *taskName = "RSNtask")
{
   // ==================================================================================================================
   // == PRELIMINARY OPERATIONS ========================================================================================
   // ==================================================================================================================
   
   // retrieve task from manager, using its name
   AliAnalysisManager *mgr  = AliAnalysisManager::GetAnalysisManager();
   AliRsnAnalysisTask *task = (AliRsnAnalysisTask*)mgr->GetTask(taskName);
   if (!task) {
      Error("RsnConfigMonitor", "Task not found");
      return kFALSE;
   }
   
   TString opt(options);
   opt.ToUpper();
   opt.ReplaceAll(" ", "");
   
   Bool_t central    = opt.Contains("CENT");
   Bool_t peripheral = opt.Contains("PERI");
   
   // ==================================================================================================================
   // == EVENT CUTS ====================================================================================================
   // ==================================================================================================================

   // event cuts are added directly to a cutSet in the task
   // we create all and then add thos which are needed
   
   // primary vertex:
   // - 2nd argument --> |Vz| range
   // - 3rd argument --> minimum required number of contributors
   // - 4th argument --> tells if TPC stand-alone vertexes must be accepted
   // we switch on the check for pileup
   AliRsnCutPrimaryVertex *cutVertex = new AliRsnCutPrimaryVertex("cutVertex", 10.0, 0, kFALSE);
   cutVertex->SetCheckPileUp(kTRUE);
      
   // centrality:
   // - 2nd      argument --> one of the centrality evaluation methods
   // - 3rd, 4th argument --> centrality ranges in percentile (0-10 for central, 60-70 for peripheral)
   AliRsnCutValue *cutCentrality = 0x0;
   if (central) 
      cutCentrality = new AliRsnCutValue("cutCentral", AliRsnValue::kEventCentralityV0,  0.0, 10.0);
   else if (peripheral)
      cutCentrality = new AliRsnCutValue("cutPeripheral", AliRsnValue::kEventCentralityV0, 60.0, 70.0);
   
   // primary vertex is always used
   task->GetEventCuts()->AddCut(cutVertex);
   
   // set cut scheme as AND of primary vertex and centrality, if initialized
   if (cutCentrality) {
      task->GetEventCuts()->AddCut(cutCentrality);
      task->GetEventCuts()->SetCutScheme(Form("%s & %s", cutVertex->GetName(), cutCentrality->GetName()));
   } else {
      task->GetEventCuts()->SetCutScheme(cutVertex->GetName());
   }
   ::Info("AddEventStuff", "Scheme for event cuts: %s", task->GetEventCuts()->GetCutScheme().Data());
   
   // ==================================================================================================================
   // == EVENT FUNCTIONS ===============================================================================================
   // ==================================================================================================================

   // we want to add an AliRsnFunction to compute multiplicity distribution
   // it is needed in order to know how many events we have in each multiplicity bin
   
   // axes
   AliRsnValue *axisEvMultSPD = new AliRsnValue("MultSPD", AliRsnValue::kEventMultSPD, 0.0, 150.0, 1.0);
   AliRsnValue *axisEvMultMC  = new AliRsnValue("MultMC" , AliRsnValue::kEventMultMC , 0.0, 150.0, 1.0);

   // create function and add axis
   AliRsnFunction *fcnEv = new AliRsnFunction;
   if (!fcnEv->AddAxis(axisEvMultSPD)) return kFALSE;
   if (isMC && !fcnEv->AddAxis(axisEvMultMC)) return kFALSE;

   // add functions to pairs
   task->GetInfo()->AddEventFunction(fcnEv);
   
   return kTRUE;
}
 AddRsnEventComputations.C:1
 AddRsnEventComputations.C:2
 AddRsnEventComputations.C:3
 AddRsnEventComputations.C:4
 AddRsnEventComputations.C:5
 AddRsnEventComputations.C:6
 AddRsnEventComputations.C:7
 AddRsnEventComputations.C:8
 AddRsnEventComputations.C:9
 AddRsnEventComputations.C:10
 AddRsnEventComputations.C:11
 AddRsnEventComputations.C:12
 AddRsnEventComputations.C:13
 AddRsnEventComputations.C:14
 AddRsnEventComputations.C:15
 AddRsnEventComputations.C:16
 AddRsnEventComputations.C:17
 AddRsnEventComputations.C:18
 AddRsnEventComputations.C:19
 AddRsnEventComputations.C:20
 AddRsnEventComputations.C:21
 AddRsnEventComputations.C:22
 AddRsnEventComputations.C:23
 AddRsnEventComputations.C:24
 AddRsnEventComputations.C:25
 AddRsnEventComputations.C:26
 AddRsnEventComputations.C:27
 AddRsnEventComputations.C:28
 AddRsnEventComputations.C:29
 AddRsnEventComputations.C:30
 AddRsnEventComputations.C:31
 AddRsnEventComputations.C:32
 AddRsnEventComputations.C:33
 AddRsnEventComputations.C:34
 AddRsnEventComputations.C:35
 AddRsnEventComputations.C:36
 AddRsnEventComputations.C:37
 AddRsnEventComputations.C:38
 AddRsnEventComputations.C:39
 AddRsnEventComputations.C:40
 AddRsnEventComputations.C:41
 AddRsnEventComputations.C:42
 AddRsnEventComputations.C:43
 AddRsnEventComputations.C:44
 AddRsnEventComputations.C:45
 AddRsnEventComputations.C:46
 AddRsnEventComputations.C:47
 AddRsnEventComputations.C:48
 AddRsnEventComputations.C:49
 AddRsnEventComputations.C:50
 AddRsnEventComputations.C:51
 AddRsnEventComputations.C:52
 AddRsnEventComputations.C:53
 AddRsnEventComputations.C:54
 AddRsnEventComputations.C:55
 AddRsnEventComputations.C:56
 AddRsnEventComputations.C:57
 AddRsnEventComputations.C:58
 AddRsnEventComputations.C:59
 AddRsnEventComputations.C:60
 AddRsnEventComputations.C:61
 AddRsnEventComputations.C:62
 AddRsnEventComputations.C:63
 AddRsnEventComputations.C:64
 AddRsnEventComputations.C:65
 AddRsnEventComputations.C:66
 AddRsnEventComputations.C:67
 AddRsnEventComputations.C:68
 AddRsnEventComputations.C:69
 AddRsnEventComputations.C:70
 AddRsnEventComputations.C:71
 AddRsnEventComputations.C:72
 AddRsnEventComputations.C:73
 AddRsnEventComputations.C:74
 AddRsnEventComputations.C:75
 AddRsnEventComputations.C:76
 AddRsnEventComputations.C:77
 AddRsnEventComputations.C:78
 AddRsnEventComputations.C:79
 AddRsnEventComputations.C:80
 AddRsnEventComputations.C:81
 AddRsnEventComputations.C:82
 AddRsnEventComputations.C:83
 AddRsnEventComputations.C:84
 AddRsnEventComputations.C:85
 AddRsnEventComputations.C:86
 AddRsnEventComputations.C:87
 AddRsnEventComputations.C:88
 AddRsnEventComputations.C:89
 AddRsnEventComputations.C:90
 AddRsnEventComputations.C:91
 AddRsnEventComputations.C:92
 AddRsnEventComputations.C:93
 AddRsnEventComputations.C:94
 AddRsnEventComputations.C:95
 AddRsnEventComputations.C:96
 AddRsnEventComputations.C:97
 AddRsnEventComputations.C:98
 AddRsnEventComputations.C:99
 AddRsnEventComputations.C:100