ROOT logo
// now in options

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

//_________________________________________________________//
AliAnalysisTaskTriggeredBF *AddTaskBalanceTriggered(Double_t centrMin=0.,
						 Double_t centrMax=80.,
						 Bool_t gRunShuffling=kFALSE,
						 Bool_t gRunMixing=kFALSE,
						 Bool_t gRunV0=kFALSE,
						 TString centralityEstimator="V0M",
						 Double_t vertexZ=10.,
						 Double_t DCAxy=-1,
						 Double_t DCAz=-1,
						 Double_t ptMin=0.15,
						 Double_t ptMax=20,
						 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,
						 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(gRunV0)   centralityName+="_V0";



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

  //===========================================================================
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  if (!mgr) {
    ::Error("AddTaskTriggeredBF", "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("AddTaskTriggeredBF", "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";

  // setup the balance function objects
  AliBalanceTriggered *bf  = 0;  // Balance Function object
  AliBalanceTriggered *bfs = 0;  // shuffled Balance function object
  AliBalanceTriggered *bfm = 0;  // mixing Balance function object
  
  if (analysisType=="AOD"){
    
    bf = new AliBalanceTriggered();
    bf->SetAnalysisLevel(analysisType);
    bf->InitHistograms();
    
    if(gRunShuffling){
      bfs = new AliBalanceTriggered();
      bfs->SetAnalysisLevel(analysisType);
      bfs->InitHistograms();
    }
    if(gRunMixing){
      bfm = new AliBalanceTriggered();
      bfm->SetAnalysisLevel(analysisType);
      bfm->InitHistograms();
    }
  }
  else{
    ::Error("AddTaskTriggeredBF", "analysis type NOT supported.");
    return NULL;
  }

  // Create the task, add it to manager and configure it.
  //===========================================================================
  AliAnalysisTaskTriggeredBF *taskTriggeredBF = new AliAnalysisTaskTriggeredBF("TaskTriggeredBF");
  taskTriggeredBF->SetAnalysisObject(bf);
  if(gRunShuffling) taskTriggeredBF->SetShufflingObject(bfs);
  if(gRunMixing){
    taskTriggeredBF->SetMixingObject(bfm);
    taskTriggeredBF->SetMixingTracks(50000);
  }
  if(gRunV0){
    taskTriggeredBF->SetRunV0(kTRUE);
  }

  taskTriggeredBF->SetCentralityPercentileRange(centrMin,centrMax);
  if(analysisType == "AOD") {
    // pt and eta cut (pt_min, pt_max, eta_min, eta_max)
    taskTriggeredBF->SetAODtrackCutBit(AODfilterBit);
    taskTriggeredBF->SetKinematicsCutsAOD(ptMin,ptMax,etaMin,etaMax);
    
    // set extra DCA cuts (-1 no extra cut)
    taskTriggeredBF->SetExtraDCACutsAOD(DCAxy,DCAz);
    
    // set extra TPC chi2 / nr of clusters cut
    taskTriggeredBF->SetExtraTPCCutsAOD(maxTPCchi2, minNClustersTPC);
    
  }

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

  // centrality estimator (default = V0M)
  taskTriggeredBF->SetCentralityEstimator(centralityEstimator);
  
  // vertex cut (x,y,z)
  taskTriggeredBF->SetVertexDiamond(.3,.3,vertexZ);
  
  //bf->PrintAnalysisSettings();
  mgr->AddTask(taskTriggeredBF);
  
  // 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.outputBalanceFunctionTriggeredAnalysis";
  AliAnalysisDataContainer *coutQA = mgr->CreateContainer(Form("listQA_%s",centralityName.Data()), TList::Class(),AliAnalysisManager::kOutputContainer,outputFileName.Data());
  AliAnalysisDataContainer *coutTriggeredBF = mgr->CreateContainer(Form("listTriggeredBF_%s",centralityName.Data()), TList::Class(),AliAnalysisManager::kOutputContainer,outputFileName.Data());
  if(gRunShuffling) AliAnalysisDataContainer *coutTriggeredBFS = mgr->CreateContainer(Form("listTriggeredBFShuffled_%s",centralityName.Data()), TList::Class(),AliAnalysisManager::kOutputContainer,outputFileName.Data());
  if(gRunMixing) AliAnalysisDataContainer *coutTriggeredBFM = mgr->CreateContainer(Form("listTriggeredBFMixed_%s",centralityName.Data()), TList::Class(),AliAnalysisManager::kOutputContainer,outputFileName.Data());
  if(gRunV0) AliAnalysisDataContainer *coutQAV0 = mgr->CreateContainer(Form("listQAV0_%s",centralityName.Data()), TList::Class(),AliAnalysisManager::kOutputContainer,outputFileName.Data());

  mgr->ConnectInput(taskTriggeredBF, 0, mgr->GetCommonInputContainer());
  mgr->ConnectOutput(taskTriggeredBF, 1, coutQA);
  mgr->ConnectOutput(taskTriggeredBF, 2, coutTriggeredBF);
  if(gRunShuffling) mgr->ConnectOutput(taskTriggeredBF, 3, coutTriggeredBFS);
  if(gRunMixing) mgr->ConnectOutput(taskTriggeredBF, 4, coutTriggeredBFM);
  if(gRunV0) mgr->ConnectOutput(taskTriggeredBF, 5, coutQAV0);

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