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;
//=============================================//

//PID config
Bool_t kUseNSigmaPID = kTRUE;
Double_t nSigmaMax = 3.0;
Bool_t kUseBayesianPID = kFALSE;
Double_t gMinAcceptedProbability = 0.7;

//_________________________________________________________//
AliAnalysisTaskBF *AddTaskBalanceCentralityTrain(TString analysisType = "ESD",
						 Double_t centrMin=0.,
						 Double_t centrMax=80.,  //100.
						 Bool_t gRunShuffling=kFALSE,
						 TString centralityEstimator="V0M",
						 Double_t vertexZ=10.,
						 Double_t DCAxy=-1,
						 Double_t DCAz=-1,
						 Double_t ptMin=0.3,
						 Double_t ptMax=1.5,
						 Double_t etaMin=-0.8,
						 Double_t etaMax=0.8,
						 Double_t maxTPCchi2 = -1, 
						 Int_t minNClustersTPC = -1,
						 Bool_t kUsePID = kFALSE,
						 Int_t AODfilterBit = 128,
						 Bool_t bCentralTrigger = kFALSE,
						 Bool_t bHBTcut = kFALSE,
						 Bool_t bConversionCut = kFALSE,
						 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);
  centralityName+="_";
  centralityName+=Form("%s",centralityEstimator.Data());
  centralityName+="_";
  centralityName+=Form("vZ%.1f",vertexZ);
  centralityName+="_";
  centralityName+=Form("DCAxy%.1f",DCAxy);
  centralityName+="_";
  centralityName+=Form("DCAz%.1f",DCAz);
  centralityName+="_Pt";
  centralityName+=Form("%.1f",ptMin);
  centralityName+="-";
  centralityName+=Form("%.1f",ptMax);
  centralityName+="_Eta";
  centralityName+=Form("%.1f",etaMin);
  centralityName+="-";
  centralityName+=Form("%.1f",etaMax);
  centralityName+="_Chi";
  centralityName+=Form("%.1f",maxTPCchi2);
  centralityName+="_nClus";
  centralityName+=Form("%d",minNClustersTPC);
  centralityName+="_Bit";
  centralityName+=Form("%d",AODfilterBit);
  if(bCentralTrigger)   centralityName+="_withCentralTrigger";
  if(bHBTcut)           centralityName+="_withHBTcut";
  if(bConversionCut)    centralityName+="_withConversionCut";
  if(kUsePID)           centralityName+="_PID";





  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 = mgr->GetInputEventHandler()->GetDataType(); // can be "ESD" or "AOD" or "MC"
  if(dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler())) analysisType = "AOD";


  // 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 objects

  if (analysisType=="ESD"){
    bf  = GetBalanceFunctionObject("ESD",centralityEstimator,centrMin,centrMax,kFALSE,bHBTcut,bConversionCut,kUsePID);
    if(gRunShuffling) bfs = GetBalanceFunctionObject("ESD",centralityEstimator,centrMin,centrMax,kTRUE,bHBTcut,bConversionCut,kUsePID);
  }
  else if (analysisType=="MCESD"){
    bf  = GetBalanceFunctionObject("MCESD",centralityEstimator,centrMin,centrMax,kFALSE,bHBTcut,bConversionCut,kUsePID);
    if(gRunShuffling) bfs = GetBalanceFunctionObject("MCESD",centralityEstimator,centrMin,centrMax,kTRUE,bHBTcut,bConversionCut,kUsePID);
  }  
  else if (analysisType=="AOD"){
    bf  = GetBalanceFunctionObject("AOD",centralityEstimator,centrMin,centrMax,kFALSE,bHBTcut,bConversionCut,kUsePID);
    if(gRunShuffling) bfs = GetBalanceFunctionObject("AOD",centralityEstimator,centrMin,centrMax,kTRUE,bHBTcut,bConversionCut,kUsePID);
  }
  else if (analysisType=="MC"){
    bf  = GetBalanceFunctionObject("MC",centralityEstimator,centrMin,centrMax,kFALSE,bHBTcut,bConversionCut,kUsePID);
    if(gRunShuffling) bfs = GetBalanceFunctionObject("MC",centralityEstimator,centrMin,centrMax,kTRUE,bHBTcut,bConversionCut,kUsePID);
  }
  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);

  taskBF->SetCentralityPercentileRange(centrMin,centrMax);
  if((analysisType == "ESD")||(analysisType == "MCESD")) {
    AliESDtrackCuts *trackCuts = GetTrackCutsObject(ptMin,ptMax,etaMin,etaMax,maxTPCchi2,DCAxy,DCAz,minNClustersTPC);
    taskBF->SetAnalysisCutObject(trackCuts);
    if(kUsePID) {
      if(kUseBayesianPID)
	taskBF->SetUseBayesianPID(gMinAcceptedProbability);
      else if(kUseNSigmaPID)
	taskBF->SetUseNSigmaPID(nSigmaMax);
      taskBF->SetParticleOfInterest(AliAnalysisTaskBF::kPion);
      taskBF->SetDetectorUsedForPID(AliAnalysisTaskBF::kTPCpid);
    }
  }
  else if(analysisType == "AOD") {
    // pt and eta cut (pt_min, pt_max, eta_min, eta_max)
    taskBF->SetAODtrackCutBit(AODfilterBit);
    taskBF->SetKinematicsCutsAOD(ptMin,ptMax,etaMin,etaMax);

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

    // PID
    if(kUsePID) {
      if(kUseBayesianPID)
	taskBF->SetUseBayesianPID(gMinAcceptedProbability);
      else if(kUseNSigmaPID)
	taskBF->SetUseNSigmaPID(nSigmaMax);
      taskBF->SetParticleOfInterest(AliAnalysisTaskBF::kPion);
      taskBF->SetDetectorUsedForPID(AliAnalysisTaskBF::kTPCpid);
    }

    // set extra TPC chi2 / nr of clusters cut
    taskBF->SetExtraTPCCutsAOD(maxTPCchi2, minNClustersTPC);
    
  }
  else if(analysisType == "MC") {
    taskBF->SetKinematicsCutsAOD(ptMin,ptMax,etaMin,etaMax); 
  }

  // 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
  if(bCentralTrigger) taskBF->SelectCollisionCandidates(AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral);
  else                taskBF->SelectCollisionCandidates(AliVEvent::kMB);

  // centrality estimator (default = V0M)
  taskBF->SetCentralityEstimator(centralityEstimator);
  
  // 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());
  if(kUsePID) AliAnalysisDataContainer *coutQAPID = mgr->CreateContainer(Form("listQAPID_%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);
  if(kUsePID) mgr->ConnectOutput(taskBF, 4, coutQAPID);

  return taskBF;
}
 AddTaskBalanceCentralityTrain.C:1
 AddTaskBalanceCentralityTrain.C:2
 AddTaskBalanceCentralityTrain.C:3
 AddTaskBalanceCentralityTrain.C:4
 AddTaskBalanceCentralityTrain.C:5
 AddTaskBalanceCentralityTrain.C:6
 AddTaskBalanceCentralityTrain.C:7
 AddTaskBalanceCentralityTrain.C:8
 AddTaskBalanceCentralityTrain.C:9
 AddTaskBalanceCentralityTrain.C:10
 AddTaskBalanceCentralityTrain.C:11
 AddTaskBalanceCentralityTrain.C:12
 AddTaskBalanceCentralityTrain.C:13
 AddTaskBalanceCentralityTrain.C:14
 AddTaskBalanceCentralityTrain.C:15
 AddTaskBalanceCentralityTrain.C:16
 AddTaskBalanceCentralityTrain.C:17
 AddTaskBalanceCentralityTrain.C:18
 AddTaskBalanceCentralityTrain.C:19
 AddTaskBalanceCentralityTrain.C:20
 AddTaskBalanceCentralityTrain.C:21
 AddTaskBalanceCentralityTrain.C:22
 AddTaskBalanceCentralityTrain.C:23
 AddTaskBalanceCentralityTrain.C:24
 AddTaskBalanceCentralityTrain.C:25
 AddTaskBalanceCentralityTrain.C:26
 AddTaskBalanceCentralityTrain.C:27
 AddTaskBalanceCentralityTrain.C:28
 AddTaskBalanceCentralityTrain.C:29
 AddTaskBalanceCentralityTrain.C:30
 AddTaskBalanceCentralityTrain.C:31
 AddTaskBalanceCentralityTrain.C:32
 AddTaskBalanceCentralityTrain.C:33
 AddTaskBalanceCentralityTrain.C:34
 AddTaskBalanceCentralityTrain.C:35
 AddTaskBalanceCentralityTrain.C:36
 AddTaskBalanceCentralityTrain.C:37
 AddTaskBalanceCentralityTrain.C:38
 AddTaskBalanceCentralityTrain.C:39
 AddTaskBalanceCentralityTrain.C:40
 AddTaskBalanceCentralityTrain.C:41
 AddTaskBalanceCentralityTrain.C:42
 AddTaskBalanceCentralityTrain.C:43
 AddTaskBalanceCentralityTrain.C:44
 AddTaskBalanceCentralityTrain.C:45
 AddTaskBalanceCentralityTrain.C:46
 AddTaskBalanceCentralityTrain.C:47
 AddTaskBalanceCentralityTrain.C:48
 AddTaskBalanceCentralityTrain.C:49
 AddTaskBalanceCentralityTrain.C:50
 AddTaskBalanceCentralityTrain.C:51
 AddTaskBalanceCentralityTrain.C:52
 AddTaskBalanceCentralityTrain.C:53
 AddTaskBalanceCentralityTrain.C:54
 AddTaskBalanceCentralityTrain.C:55
 AddTaskBalanceCentralityTrain.C:56
 AddTaskBalanceCentralityTrain.C:57
 AddTaskBalanceCentralityTrain.C:58
 AddTaskBalanceCentralityTrain.C:59
 AddTaskBalanceCentralityTrain.C:60
 AddTaskBalanceCentralityTrain.C:61
 AddTaskBalanceCentralityTrain.C:62
 AddTaskBalanceCentralityTrain.C:63
 AddTaskBalanceCentralityTrain.C:64
 AddTaskBalanceCentralityTrain.C:65
 AddTaskBalanceCentralityTrain.C:66
 AddTaskBalanceCentralityTrain.C:67
 AddTaskBalanceCentralityTrain.C:68
 AddTaskBalanceCentralityTrain.C:69
 AddTaskBalanceCentralityTrain.C:70
 AddTaskBalanceCentralityTrain.C:71
 AddTaskBalanceCentralityTrain.C:72
 AddTaskBalanceCentralityTrain.C:73
 AddTaskBalanceCentralityTrain.C:74
 AddTaskBalanceCentralityTrain.C:75
 AddTaskBalanceCentralityTrain.C:76
 AddTaskBalanceCentralityTrain.C:77
 AddTaskBalanceCentralityTrain.C:78
 AddTaskBalanceCentralityTrain.C:79
 AddTaskBalanceCentralityTrain.C:80
 AddTaskBalanceCentralityTrain.C:81
 AddTaskBalanceCentralityTrain.C:82
 AddTaskBalanceCentralityTrain.C:83
 AddTaskBalanceCentralityTrain.C:84
 AddTaskBalanceCentralityTrain.C:85
 AddTaskBalanceCentralityTrain.C:86
 AddTaskBalanceCentralityTrain.C:87
 AddTaskBalanceCentralityTrain.C:88
 AddTaskBalanceCentralityTrain.C:89
 AddTaskBalanceCentralityTrain.C:90
 AddTaskBalanceCentralityTrain.C:91
 AddTaskBalanceCentralityTrain.C:92
 AddTaskBalanceCentralityTrain.C:93
 AddTaskBalanceCentralityTrain.C:94
 AddTaskBalanceCentralityTrain.C:95
 AddTaskBalanceCentralityTrain.C:96
 AddTaskBalanceCentralityTrain.C:97
 AddTaskBalanceCentralityTrain.C:98
 AddTaskBalanceCentralityTrain.C:99
 AddTaskBalanceCentralityTrain.C:100
 AddTaskBalanceCentralityTrain.C:101
 AddTaskBalanceCentralityTrain.C:102
 AddTaskBalanceCentralityTrain.C:103
 AddTaskBalanceCentralityTrain.C:104
 AddTaskBalanceCentralityTrain.C:105
 AddTaskBalanceCentralityTrain.C:106
 AddTaskBalanceCentralityTrain.C:107
 AddTaskBalanceCentralityTrain.C:108
 AddTaskBalanceCentralityTrain.C:109
 AddTaskBalanceCentralityTrain.C:110
 AddTaskBalanceCentralityTrain.C:111
 AddTaskBalanceCentralityTrain.C:112
 AddTaskBalanceCentralityTrain.C:113
 AddTaskBalanceCentralityTrain.C:114
 AddTaskBalanceCentralityTrain.C:115
 AddTaskBalanceCentralityTrain.C:116
 AddTaskBalanceCentralityTrain.C:117
 AddTaskBalanceCentralityTrain.C:118
 AddTaskBalanceCentralityTrain.C:119
 AddTaskBalanceCentralityTrain.C:120
 AddTaskBalanceCentralityTrain.C:121
 AddTaskBalanceCentralityTrain.C:122
 AddTaskBalanceCentralityTrain.C:123
 AddTaskBalanceCentralityTrain.C:124
 AddTaskBalanceCentralityTrain.C:125
 AddTaskBalanceCentralityTrain.C:126
 AddTaskBalanceCentralityTrain.C:127
 AddTaskBalanceCentralityTrain.C:128
 AddTaskBalanceCentralityTrain.C:129
 AddTaskBalanceCentralityTrain.C:130
 AddTaskBalanceCentralityTrain.C:131
 AddTaskBalanceCentralityTrain.C:132
 AddTaskBalanceCentralityTrain.C:133
 AddTaskBalanceCentralityTrain.C:134
 AddTaskBalanceCentralityTrain.C:135
 AddTaskBalanceCentralityTrain.C:136
 AddTaskBalanceCentralityTrain.C:137
 AddTaskBalanceCentralityTrain.C:138
 AddTaskBalanceCentralityTrain.C:139
 AddTaskBalanceCentralityTrain.C:140
 AddTaskBalanceCentralityTrain.C:141
 AddTaskBalanceCentralityTrain.C:142
 AddTaskBalanceCentralityTrain.C:143
 AddTaskBalanceCentralityTrain.C:144
 AddTaskBalanceCentralityTrain.C:145
 AddTaskBalanceCentralityTrain.C:146
 AddTaskBalanceCentralityTrain.C:147
 AddTaskBalanceCentralityTrain.C:148
 AddTaskBalanceCentralityTrain.C:149
 AddTaskBalanceCentralityTrain.C:150
 AddTaskBalanceCentralityTrain.C:151
 AddTaskBalanceCentralityTrain.C:152
 AddTaskBalanceCentralityTrain.C:153
 AddTaskBalanceCentralityTrain.C:154
 AddTaskBalanceCentralityTrain.C:155
 AddTaskBalanceCentralityTrain.C:156
 AddTaskBalanceCentralityTrain.C:157
 AddTaskBalanceCentralityTrain.C:158
 AddTaskBalanceCentralityTrain.C:159
 AddTaskBalanceCentralityTrain.C:160
 AddTaskBalanceCentralityTrain.C:161
 AddTaskBalanceCentralityTrain.C:162
 AddTaskBalanceCentralityTrain.C:163
 AddTaskBalanceCentralityTrain.C:164
 AddTaskBalanceCentralityTrain.C:165
 AddTaskBalanceCentralityTrain.C:166
 AddTaskBalanceCentralityTrain.C:167
 AddTaskBalanceCentralityTrain.C:168
 AddTaskBalanceCentralityTrain.C:169
 AddTaskBalanceCentralityTrain.C:170
 AddTaskBalanceCentralityTrain.C:171
 AddTaskBalanceCentralityTrain.C:172
 AddTaskBalanceCentralityTrain.C:173
 AddTaskBalanceCentralityTrain.C:174
 AddTaskBalanceCentralityTrain.C:175
 AddTaskBalanceCentralityTrain.C:176
 AddTaskBalanceCentralityTrain.C:177
 AddTaskBalanceCentralityTrain.C:178
 AddTaskBalanceCentralityTrain.C:179
 AddTaskBalanceCentralityTrain.C:180
 AddTaskBalanceCentralityTrain.C:181
 AddTaskBalanceCentralityTrain.C:182
 AddTaskBalanceCentralityTrain.C:183
 AddTaskBalanceCentralityTrain.C:184
 AddTaskBalanceCentralityTrain.C:185
 AddTaskBalanceCentralityTrain.C:186
 AddTaskBalanceCentralityTrain.C:187
 AddTaskBalanceCentralityTrain.C:188
 AddTaskBalanceCentralityTrain.C:189
 AddTaskBalanceCentralityTrain.C:190
 AddTaskBalanceCentralityTrain.C:191
 AddTaskBalanceCentralityTrain.C:192
 AddTaskBalanceCentralityTrain.C:193
 AddTaskBalanceCentralityTrain.C:194
 AddTaskBalanceCentralityTrain.C:195
 AddTaskBalanceCentralityTrain.C:196
 AddTaskBalanceCentralityTrain.C:197
 AddTaskBalanceCentralityTrain.C:198
 AddTaskBalanceCentralityTrain.C:199
 AddTaskBalanceCentralityTrain.C:200
 AddTaskBalanceCentralityTrain.C:201
 AddTaskBalanceCentralityTrain.C:202
 AddTaskBalanceCentralityTrain.C:203
 AddTaskBalanceCentralityTrain.C:204