ROOT logo
// now in options
//=============================================//
//const char* centralityEstimator = "V0M";
//const char* centralityEstimator = "CL1";
//const char* centralityEstimator = "TRK";
//=============================================//
//Bool_t gRunShuffling = kFALSE;
//Bool_t gRunShuffling = kTRUE;
//=============================================//
//_________________________________________________________//
AliAnalysisTaskBF *AddTaskBalanceMCCentralityTrain(Double_t centrMin=0.,
						   Double_t centrMax=100.,
						   Double_t impactParameterMin=0.,
						   Double_t impactParameterMax=20.,
						   Bool_t gRunShuffling=kFALSE,
						   Double_t vertexZ=10.,
						   Double_t ptMin=0.3,
						   Double_t ptMax=1.5,
						   Double_t etaMin=-0.8,
						   Double_t etaMax=0.8,
						   TF1* gAcceptanceParameterization = 0x0,
						   Int_t gPdgCode = -1,
						   TString fileNameBase="AnalysisResults") {

  // Creates a balance function analysis task and adds it to the analysis manager.
  // Get the pointer to the existing analysis manager via the static access method.
  TString centralityName("");
  centralityName+=Form("%.0f",centrMin);
  centralityName+="-";
  centralityName+=Form("%.0f",centrMax);

  TString outputFileName(fileNameBase);
  outputFileName.Append(".root");

  //===========================================================================
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  if (!mgr) {
    ::Error("AddTaskBF", "No analysis manager to connect to.");
    return NULL;
  }

  // Check the analysis type using the event handlers connected to the analysis manager.
  //===========================================================================
  if (!mgr->GetInputEventHandler()) {
    ::Error("AddTaskBF", "This task requires an input event handler");
    return NULL;
  }
  TString analysisType = "MC";

  // for local changed BF configuration
  gROOT->LoadMacro("./configBalanceFunctionAnalysis.C");
  //gROOT->LoadMacro("$ALICE_ROOT/PWGCF/EBYE/macros/configBalanceFunctionAnalysis.C");
  AliBalance *bf  = 0;  // Balance Function object
  AliBalance *bfs = 0;  // shuffled Balance function object

  if (analysisType=="ESD"){
    bf  = GetBalanceFunctionObject("ESD",centralityName.Data());
    if(gRunShuffling) bfs = GetBalanceFunctionObject("ESD",centralityName.Data(),kTRUE);
  }
  else if (analysisType=="AOD"){
    bf  = GetBalanceFunctionObject("AOD",centralityName.Data());
    if(gRunShuffling) bfs = GetBalanceFunctionObject("AOD",centralityName.Data(),kTRUE);
  }
  else if (analysisType=="MC"){
    bf  = GetBalanceFunctionObject("MC",centralityName.Data());
    if(gRunShuffling) bfs = GetBalanceFunctionObject("MC",centralityName.Data(),kTRUE);
  }
  else{
    ::Error("AddTaskBF", "analysis type NOT known.");
    return NULL;
  }

  // Create the task, add it to manager and configure it.
  //===========================================================================
  AliAnalysisTaskBF *taskBF = new AliAnalysisTaskBF("TaskBF");
  taskBF->SetAnalysisObject(bf);
  if(gRunShuffling) taskBF->SetShufflingObject(bfs);

  if(analysisType == "ESD") {
    AliESDtrackCuts *trackCuts = GetTrackCutsObject(ptMin,ptMax,etaMin,etaMax,maxTPCchi2,DCAxy,DCAz,minNClustersTPC);
    taskBF->SetAnalysisCutObject(trackCuts);
    // centrality estimator (default = V0M)
    taskBF->SetCentralityEstimator(centralityEstimator);
    taskBF->SetCentralityPercentileRange(impactParameterMin,
					 impactParameterMax);
  }
  else if(analysisType == "AOD") {
    // pt and eta cut (pt_min, pt_max, eta_min, eta_max)
    taskBF->SetAODtrackCutBit(128);
    taskBF->SetKinematicsCutsAOD(ptMin,ptMax,etaMin,etaMax);
    taskBF->SetCentralityEstimator(centralityEstimator);
    taskBF->SetCentralityPercentileRange(impactParameterMin,
					 impactParameterMax);

    // set extra DCA cuts (-1 no extra cut)
    taskBF->SetExtraDCACutsAOD(DCAxy,DCAz);

    // set extra TPC chi2 / nr of clusters cut
    taskBF->SetExtraTPCCutsAOD(maxTPCchi2, minNClustersTPC);
    taskBF->SetCentralityEstimator(centralityEstimator);    
  }
  else if(analysisType == "MC") {
    Printf("********************ANALYSIS TYPE MC********************************");
    if(gAcceptanceParameterization)
      taskBF->SetAcceptanceParameterization(gAcceptanceParameterization);
    if(gPdgCode != -1)
      taskBF->SetPDGCode(gPdgCode);
    taskBF->SetKinematicsCutsAOD(ptMin,ptMax,etaMin,etaMax); 
    taskBF->SetImpactParameterRange(impactParameterMin,
				    impactParameterMax);
  }

  // offline trigger selection (AliVEvent.h)
  // taskBF->UseOfflineTrigger(); // NOT used (selection is done with the AliAnalysisTaskSE::SelectCollisionCandidates()) 
  // with this only selected events are analyzed (first 2 bins in event QA histogram are the same))
  // documentation in https://twiki.cern.ch/twiki/bin/viewauth/ALICE/PWG1EvSelDocumentation
  //taskBF->SelectCollisionCandidates(AliVEvent::kMB);
    
  // vertex cut (x,y,z)
  taskBF->SetVertexDiamond(.3,.3,vertexZ);
  


  //bf->PrintAnalysisSettings();
  mgr->AddTask(taskBF);
  
  // Create ONLY the output containers for the data produced by the task.
  // Get and connect other common input/output containers via the manager as below
  //==============================================================================
  TString outputFileName = AliAnalysisManager::GetCommonFileName();
  outputFileName += ":PWGCFEbyE.outputBalanceFunctionAnalysis";
  AliAnalysisDataContainer *coutQA = mgr->CreateContainer(Form("listQA_%s",centralityName.Data()), TList::Class(),AliAnalysisManager::kOutputContainer,outputFileName.Data());
  AliAnalysisDataContainer *coutBF = mgr->CreateContainer(Form("listBF_%s",centralityName.Data()), TList::Class(),AliAnalysisManager::kOutputContainer,outputFileName.Data());
  if(gRunShuffling) AliAnalysisDataContainer *coutBFS= mgr->CreateContainer(Form("listBFShuffled_%s",centralityName.Data()), TList::Class(),AliAnalysisManager::kOutputContainer,outputFileName.Data());
  mgr->ConnectInput(taskBF, 0, mgr->GetCommonInputContainer());
  mgr->ConnectOutput(taskBF, 1, coutQA);
  mgr->ConnectOutput(taskBF, 2, coutBF);
  if(gRunShuffling) mgr->ConnectOutput(taskBF, 3, coutBFS);

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