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 = kFALSE;
Double_t nSigmaMax = 3.0;
Bool_t kUseBayesianPID = kTRUE;
Double_t gMinAcceptedProbability = 0.7;

//_________________________________________________________//
AliAnalysisTaskEventMixingBF *AddTaskBalanceEventMixing(Double_t centrMin=0.,
							Double_t centrMax=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";





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

  //===========================================================================
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  if (!mgr) {
    ::Error("AddTaskEventMixingBF", "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("AddTaskEventMixingBF", "This task requires an input event handler");
    return NULL;
  }
  TString analysisType = mgr->GetInputEventHandler()->GetDataType(); // can be "ESD" or "AOD"
  if(dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler())) analysisType = "MC";

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

  if (analysisType=="ESD"){
    bf  = GetBalanceFunctionObject("ESD",centralityEstimator,centrMin,centrMax,kFALSE,bHBTcut,bConversionCut);
    if(gRunShuffling) bfs = GetBalanceFunctionObject("ESD",centralityEstimator,centrMin,centrMax,kTRUE,bHBTcut,bConversionCut);
  }
  else if (analysisType=="AOD"){
    bf  = GetBalanceFunctionObject("AOD",centralityEstimator,centrMin,centrMax,kFALSE,bHBTcut,bConversionCut);
    if(gRunShuffling) bfs = GetBalanceFunctionObject("AOD",centralityEstimator,centrMin,centrMax,kTRUE,bHBTcut,bConversionCut);
  }
  else if (analysisType=="MC"){
    bf  = GetBalanceFunctionObject("MC",centralityEstimator,centrMin,centrMax,kFALSE,bHBTcut,bConversionCut);
    if(gRunShuffling) bfs = GetBalanceFunctionObject("MC",centralityEstimator,centrMin,centrMax,kTRUE,bHBTcut,bConversionCut);
  }
  else{
    ::Error("AddTaskEventMixingBF", "analysis type NOT known.");
    return NULL;
  }

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

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

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

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

  // offline trigger selection (AliVEvent.h)
  // taskEventMixingBF->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) taskEventMixingBF->SelectCollisionCandidates(AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral);
  else                taskEventMixingBF->SelectCollisionCandidates(AliVEvent::kMB);

  // centrality estimator (default = V0M)
  taskEventMixingBF->SetCentralityEstimator(centralityEstimator);
  
  // vertex cut (x,y,z)
  taskEventMixingBF->SetVertexDiamond(.3,.3,vertexZ);
  


  //bf->PrintAnalysisSettings();
  mgr->AddTask(taskEventMixingBF);
  
  // 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 *coutEventMixingBF = mgr->CreateContainer(Form("listEventMixingBF_%s",centralityName.Data()), TList::Class(),AliAnalysisManager::kOutputContainer,outputFileName.Data());
  if(gRunShuffling) AliAnalysisDataContainer *coutEventMixingBFS = mgr->CreateContainer(Form("listEventMixingBFShuffled_%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(taskEventMixingBF, 0, mgr->GetCommonInputContainer());
  mgr->ConnectOutput(taskEventMixingBF, 1, coutQA);
  mgr->ConnectOutput(taskEventMixingBF, 2, coutEventMixingBF);
  if(gRunShuffling) mgr->ConnectOutput(taskEventMixingBF, 3, coutEventMixingBFS);
  if(kUsePID && analysisType == "ESD") mgr->ConnectOutput(taskEventMixingBF, 4, coutQAPID);

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