ROOT logo
//DEFINITION OF A FEW CONSTANTS
const Double_t ymin  = -2.0 ;
const Double_t ymax  =  2.0 ;
const Double_t ptmin =  0.0 ;
const Double_t ptmax =  8.0 ;
const Double_t phimin =   0 ;
const Double_t phimax = 360 ;
const Int_t    mintrackrefsTPC = 2 ;
const Int_t    mintrackrefsITS = 3 ;
const Int_t    PDG = 310; 
const Int_t    minclustersTPC = 10 ;
const Int_t    chargeV0 = 0 ;
//----------------------------------------------------

Bool_t AliCFV0Task(
		   const Bool_t useGrid = 1,
		   const Bool_t readAOD = 0,
		   const char * kTagXMLFile="wn.xml", // XML file containing tags
		   )
{
  
  TBenchmark benchmark;
  benchmark.Start("AliSingleTrackTask");

  AliLog::SetGlobalDebugLevel(0);

  Load(useGrid) ; //load the required libraries

  AliLog::SetGlobalDebugLevel(0);

  TChain * analysisChain ;

  if (useGrid) { //data located on AliEn
    TGrid::Connect("alien://") ;
    //  Create an AliRunTagCuts and an AliEventTagCuts Object and impose some selection criteria
    AliRunTagCuts      *runCuts   = new AliRunTagCuts(); 
    AliEventTagCuts    *eventCuts = new AliEventTagCuts(); 
    AliLHCTagCuts      *lhcCuts   = new AliLHCTagCuts(); 
    AliDetectorTagCuts *detCuts   = new AliDetectorTagCuts(); 
    eventCuts->SetMultiplicityRange(0,20000);
    //  Create an AliTagAnalysis Object and chain the tags
    AliTagAnalysis   *tagAna = new AliTagAnalysis(); 
    tagAna->SetType("ESD");  //for aliroot > v4-05
    TAlienCollection *coll   = TAlienCollection::Open(kTagXMLFile); 
    TGridResult      *tagResult = coll->GetGridResult("",0,0);
    tagResult->Print();
    tagAna->ChainGridTags(tagResult);
    //  Create a new esd chain and assign the chain that is returned by querying the tags
    analysisChain = tagAna->QueryTags(runCuts,lhcCuts,detCuts,eventCuts); 
  }
  else {// local data
    //here put your input data path
    if (readAOD) {
      analysisChain = new TChain("aodTree");
      analysisChain->Add("your_data_path/001/AliAOD.root");
      analysisChain->Add("your_data_path/002/AliAOD.root");
    }
    else {
      analysisChain = new TChain("esdTree");
      analysisChain->Add("your_data_path/001/AliESDs.root");
      analysisChain->Add("your_data_path/002/AliESDs.root");
    }
  }
  
  
  Info("AliCFV0Task",Form("CHAIN HAS %d ENTRIES",(Int_t)analysisChain->GetEntries()));

  //CONTAINER DEFINITION
  Info("AliCFV0Task","SETUP CONTAINER");
  //the sensitive variables, their indices
  Int_t ipt = 0;
  Int_t iy  = 1;
  //Setting up the container grid... 
  Int_t nstep = 4 ; //number of selection steps MC 
  const Int_t nvar   = 2 ; //number of variables on the grid:pt,y,phi,vtx
  const Int_t nbin1  = 8 ; //bins in pt
  const Int_t nbin2  = 8 ; //bins in y 
  //arrays for the number of bins in each dimension
  const Int_t iBin[nvar] ={nbin1,nbin2};
  //arrays for lower bounds :
  Double_t binLim1[nbin1+1];
  Double_t binLim2[nbin2+1];
  //values for bin lower bounds
  for(Int_t i=0; i<=nbin1; i++) binLim1[i]=ptmin + (ptmax-ptmin)/nbin1*(Double_t)i ; 
  for(Int_t i=0; i<=nbin2; i++) binLim2[i]=ymin  + (ymax-ymin)  /nbin2*(Double_t)i ;
  //one "container" for MC
  AliCFContainer* container = new AliCFContainer("container","container for V0s",nstep,nvar,iBin);
  //setting the bin limits
  container -> SetBinLimits(ipt,binLim1);
  container -> SetBinLimits(iy,binLim2);


  //CREATE THE  CUTS -----------------------------------------------
  
  // Gen-Level kinematic cuts
  AliCFTrackKineCuts *mcKineCuts = new AliCFTrackKineCuts("mcKineCuts","MC-level kinematic cuts");
  mcKineCuts->SetPtRange(ptmin,ptmax);
  mcKineCuts->SetRapidityRange(ymin,ymax);
  mcKineCuts->SetChargeMC(0);

  AliCFParticleGenCuts* mcGenCuts = new AliCFParticleGenCuts("mcGenCuts","MC particle generation cuts");
  //mcGenCuts->SetRequireIsPrimary(); //problem with some particles...
  mcGenCuts->SetRequirePdgCode(PDG);

  //Acceptance Cuts
  AliCFPairAcceptanceCuts *mcAccCuts = new AliCFPairAcceptanceCuts("mcAccCuts","MC acceptance cuts for V0");
  mcAccCuts->GetNegCut()->SetMinNHitITS(mintrackrefsITS);
  mcAccCuts->GetPosCut()->SetMinNHitITS(mintrackrefsITS);
  mcAccCuts->GetNegCut()->SetMinNHitTPC(mintrackrefsTPC);
  mcAccCuts->GetPosCut()->SetMinNHitTPC(mintrackrefsTPC);

  // Rec-Level kinematic cuts
  AliCFTrackKineCuts *recKineCuts = new AliCFTrackKineCuts("recKineCuts","V0 rec-level kine cuts");
  recKineCuts->SetPtRange(ptmin,ptmax);
  recKineCuts->SetRapidityRange(ymin,ymax);
  recKineCuts->SetChargeRec(0);

  AliCFPairQualityCuts *recQualityCuts = new AliCFPairQualityCuts("recQualityCuts","V0 rec-level quality cuts");
  if (!readAOD) {
    recQualityCuts->GetNegCut()->SetMinNClusterTPC(minclustersTPC);
    recQualityCuts->GetPosCut()->SetMinNClusterTPC(minclustersTPC);
  }
  recQualityCuts->GetNegCut()->SetStatus(AliESDtrack::kTPCrefit & AliESDtrack::kITSrefit);
  recQualityCuts->GetPosCut()->SetStatus(AliESDtrack::kTPCrefit & AliESDtrack::kITSrefit);

  AliCFV0TopoCuts *recTopoCuts = new AliCFV0TopoCuts("recTopoCuts","V0 Topological Cuts");
  recTopoCuts->SetMaxDcaDaughters(0.1);
  recTopoCuts->SetMinCosPointAngle(0.995);
  recTopoCuts->SetMinDcaNeg(0.1);
  recTopoCuts->SetMinDcaPos(0.1);


  AliCFPairPidCut* cutPID = new AliCFPairPidCut("cutPID","ESD_PID") ;
  Double_t prior_pp[AliPID::kSPECIES] = {0.0244519,
					 0.0143988,
					 0.805747 ,
					 0.0928785,
					 0.0625243 };

  Double_t prior_pbpb[AliPID::kSPECIES] = {0.0609,
					   0.1064,
					   0.7152 ,
					   0.0442,
					   0.0733 };
  cutPID->GetNegCut()->SetPriors(prior_pp);
  cutPID->GetPosCut()->SetPriors(prior_pp);
  cutPID->GetNegCut()->SetDetectors("ITS TPC TRD");
  cutPID->GetPosCut()->SetDetectors("ITS TPC TRD");

  if (readAOD) {
    cutPID->GetNegCut()->SetAODmode(kTRUE);
    cutPID->GetPosCut()->SetAODmode(kTRUE);
  }
  else {
    cutPID->GetNegCut()->SetAODmode(kFALSE);
    cutPID->GetPosCut()->SetAODmode(kFALSE);
  }

  cutPID->GetNegCut()->SetProbabilityCut(0);
  cutPID->GetPosCut()->SetProbabilityCut(0);

  switch(TMath::Abs(PDG)) {
  case  310    : 
    cutPID->GetNegCut()->SetParticleType(AliPID::kPion  , kTRUE);
    cutPID->GetPosCut()->SetParticleType(AliPID::kPion  , kTRUE);
    break;
  case  3122   : 
    cutPID->GetNegCut()->SetParticleType(AliPID::kPion  , kTRUE);
    cutPID->GetPosCut()->SetParticleType(AliPID::kProton, kTRUE);
    break;
  case -3122   : 
    cutPID->GetNegCut()->SetParticleType(AliPID::kProton, kTRUE);
    cutPID->GetPosCut()->SetParticleType(AliPID::kPion  , kTRUE);
    break;
  default      : printf("UNDEFINED PID\n"); break;
  }

  Info("AliCFV0Task","CREATE MC KINE CUTS");
  TObjArray* mcList = new TObjArray(0) ;
  mcList->AddLast(mcKineCuts);
  mcList->AddLast(mcGenCuts);

  Info("AliCFV0Task","CREATE ACCEPTANCE CUTS");
  TObjArray* accList = new TObjArray(0) ;
  accList->AddLast(mcAccCuts);

  Info("AliCFV0Task","CREATE RECONSTRUCTION CUTS");
  TObjArray* recList = new TObjArray(0) ;
  recList->AddLast(recKineCuts);
  recList->AddLast(recQualityCuts);
  recList->AddLast(recTopoCuts);

  Info("AliCFV0Task","CREATE PID CUTS");
  TObjArray* fPIDCutList = new TObjArray(0) ;
  fPIDCutList->AddLast(cutPID);


  //CREATE THE INTERFACE TO CORRECTION FRAMEWORK USED IN THE TASK
  Info("AliCFV0Task","CREATE INTERFACE AND CUTS");
  AliCFManager* man = new AliCFManager() ;
  man->SetParticleContainer(container);
  man->SetParticleCutsList (AliCFManager::kPartGenCuts,mcList);
  man->SetParticleCutsList (AliCFManager::kPartAccCuts,accList);
  man->SetParticleCutsList (AliCFManager::kPartRecCuts,recList);
  man->SetParticleCutsList (AliCFManager::kPartSelCuts,fPIDCutList);

  //CREATE THE TASK
  Info("AliCFV0Task","CREATE TASK");
  // create the task
  AliCFV0Task *task = new AliCFV0Task("AliCFV0Task");
  task->SetCFManager(man); //here is set the CF manager
  if (!readAOD)      task->SetRebuildV0s(kTRUE);
  task->SetV0PDG(PDG);

  //SETUP THE ANALYSIS MANAGER TO READ INPUT CHAIN AND WRITE DESIRED OUTPUTS
  Info("AliCFV0Task","CREATE ANALYSIS MANAGER");
  // Make the analysis manager
  AliAnalysisManager *mgr = new AliAnalysisManager("TestManager");

  if (useGrid) mgr->SetAnalysisType(AliAnalysisManager::kGridAnalysis);
  else mgr->SetAnalysisType(AliAnalysisManager::kLocalAnalysis);

  AliMCEventHandler* mcHandler = new AliMCEventHandler();
  mgr->SetMCtruthEventHandler(mcHandler);

  AliInputEventHandler* dataHandler ;

  if   (readAOD) dataHandler = new AliAODInputHandler();
  else           dataHandler = new AliESDInputHandler();
  mgr->SetInputEventHandler(dataHandler);

  // Create and connect containers for input/output

  //input data
  AliAnalysisDataContainer *cinput0  = 
    mgr->CreateContainer("cchain0",TChain::Class(),AliAnalysisManager::kInputContainer);
  //slot 0 : default output tree (by default handled by AliAnalysisTaskSE)
  AliAnalysisDataContainer *coutput0 = mgr->CreateContainer("ctree0", TTree::Class(),AliAnalysisManager::kOutputContainer,"outputV0.root");
  // output histo (number of events processed)
  AliAnalysisDataContainer *coutput1 = 
    mgr->CreateContainer("chist0", TH1I::Class(),AliAnalysisManager::kOutputContainer,"outputV0.root");
  // output Correction Framework Container (for acceptance & efficiency calculations)
  AliAnalysisDataContainer *coutput2 = 
    mgr->CreateContainer("ccontainer0", AliCFContainer::Class(),AliAnalysisManager::kOutputContainer,"outputV0.root");

  cinput0->SetData(analysisChain);

  mgr->AddTask(task);
  mgr->ConnectInput (task,0,mgr->GetCommonInputContainer());
  mgr->ConnectOutput(task,0,coutput0);
  mgr->ConnectOutput(task,1,coutput1);
  mgr->ConnectOutput(task,2,coutput2);

 
  Info("AliCFV0Task","READY TO RUN");
  //RUN !!!
  if (mgr->InitAnalysis()) {
    mgr->PrintStatus();
    mgr->StartAnalysis("local",analysisChain);
  }

  benchmark.Stop("AliCFV0Task");
  benchmark.Show("AliCFV0Task");
  
  return kTRUE ;
}

void Load(Bool_t useGrid) {

  //load the required aliroot libraries
  gSystem->Load("libANALYSIS") ;
  gSystem->Load("libANALYSISalice") ;
  gSystem->Load("libCORRFW.so") ;

  //compile online the task class
  gSystem->SetIncludePath("-I. -I$ALICE_ROOT/include -I$ROOTSYS/include");
  gROOT->LoadMacro("./AliCFV0Task.cxx+");
}
 AliCFV0Task.C:1
 AliCFV0Task.C:2
 AliCFV0Task.C:3
 AliCFV0Task.C:4
 AliCFV0Task.C:5
 AliCFV0Task.C:6
 AliCFV0Task.C:7
 AliCFV0Task.C:8
 AliCFV0Task.C:9
 AliCFV0Task.C:10
 AliCFV0Task.C:11
 AliCFV0Task.C:12
 AliCFV0Task.C:13
 AliCFV0Task.C:14
 AliCFV0Task.C:15
 AliCFV0Task.C:16
 AliCFV0Task.C:17
 AliCFV0Task.C:18
 AliCFV0Task.C:19
 AliCFV0Task.C:20
 AliCFV0Task.C:21
 AliCFV0Task.C:22
 AliCFV0Task.C:23
 AliCFV0Task.C:24
 AliCFV0Task.C:25
 AliCFV0Task.C:26
 AliCFV0Task.C:27
 AliCFV0Task.C:28
 AliCFV0Task.C:29
 AliCFV0Task.C:30
 AliCFV0Task.C:31
 AliCFV0Task.C:32
 AliCFV0Task.C:33
 AliCFV0Task.C:34
 AliCFV0Task.C:35
 AliCFV0Task.C:36
 AliCFV0Task.C:37
 AliCFV0Task.C:38
 AliCFV0Task.C:39
 AliCFV0Task.C:40
 AliCFV0Task.C:41
 AliCFV0Task.C:42
 AliCFV0Task.C:43
 AliCFV0Task.C:44
 AliCFV0Task.C:45
 AliCFV0Task.C:46
 AliCFV0Task.C:47
 AliCFV0Task.C:48
 AliCFV0Task.C:49
 AliCFV0Task.C:50
 AliCFV0Task.C:51
 AliCFV0Task.C:52
 AliCFV0Task.C:53
 AliCFV0Task.C:54
 AliCFV0Task.C:55
 AliCFV0Task.C:56
 AliCFV0Task.C:57
 AliCFV0Task.C:58
 AliCFV0Task.C:59
 AliCFV0Task.C:60
 AliCFV0Task.C:61
 AliCFV0Task.C:62
 AliCFV0Task.C:63
 AliCFV0Task.C:64
 AliCFV0Task.C:65
 AliCFV0Task.C:66
 AliCFV0Task.C:67
 AliCFV0Task.C:68
 AliCFV0Task.C:69
 AliCFV0Task.C:70
 AliCFV0Task.C:71
 AliCFV0Task.C:72
 AliCFV0Task.C:73
 AliCFV0Task.C:74
 AliCFV0Task.C:75
 AliCFV0Task.C:76
 AliCFV0Task.C:77
 AliCFV0Task.C:78
 AliCFV0Task.C:79
 AliCFV0Task.C:80
 AliCFV0Task.C:81
 AliCFV0Task.C:82
 AliCFV0Task.C:83
 AliCFV0Task.C:84
 AliCFV0Task.C:85
 AliCFV0Task.C:86
 AliCFV0Task.C:87
 AliCFV0Task.C:88
 AliCFV0Task.C:89
 AliCFV0Task.C:90
 AliCFV0Task.C:91
 AliCFV0Task.C:92
 AliCFV0Task.C:93
 AliCFV0Task.C:94
 AliCFV0Task.C:95
 AliCFV0Task.C:96
 AliCFV0Task.C:97
 AliCFV0Task.C:98
 AliCFV0Task.C:99
 AliCFV0Task.C:100
 AliCFV0Task.C:101
 AliCFV0Task.C:102
 AliCFV0Task.C:103
 AliCFV0Task.C:104
 AliCFV0Task.C:105
 AliCFV0Task.C:106
 AliCFV0Task.C:107
 AliCFV0Task.C:108
 AliCFV0Task.C:109
 AliCFV0Task.C:110
 AliCFV0Task.C:111
 AliCFV0Task.C:112
 AliCFV0Task.C:113
 AliCFV0Task.C:114
 AliCFV0Task.C:115
 AliCFV0Task.C:116
 AliCFV0Task.C:117
 AliCFV0Task.C:118
 AliCFV0Task.C:119
 AliCFV0Task.C:120
 AliCFV0Task.C:121
 AliCFV0Task.C:122
 AliCFV0Task.C:123
 AliCFV0Task.C:124
 AliCFV0Task.C:125
 AliCFV0Task.C:126
 AliCFV0Task.C:127
 AliCFV0Task.C:128
 AliCFV0Task.C:129
 AliCFV0Task.C:130
 AliCFV0Task.C:131
 AliCFV0Task.C:132
 AliCFV0Task.C:133
 AliCFV0Task.C:134
 AliCFV0Task.C:135
 AliCFV0Task.C:136
 AliCFV0Task.C:137
 AliCFV0Task.C:138
 AliCFV0Task.C:139
 AliCFV0Task.C:140
 AliCFV0Task.C:141
 AliCFV0Task.C:142
 AliCFV0Task.C:143
 AliCFV0Task.C:144
 AliCFV0Task.C:145
 AliCFV0Task.C:146
 AliCFV0Task.C:147
 AliCFV0Task.C:148
 AliCFV0Task.C:149
 AliCFV0Task.C:150
 AliCFV0Task.C:151
 AliCFV0Task.C:152
 AliCFV0Task.C:153
 AliCFV0Task.C:154
 AliCFV0Task.C:155
 AliCFV0Task.C:156
 AliCFV0Task.C:157
 AliCFV0Task.C:158
 AliCFV0Task.C:159
 AliCFV0Task.C:160
 AliCFV0Task.C:161
 AliCFV0Task.C:162
 AliCFV0Task.C:163
 AliCFV0Task.C:164
 AliCFV0Task.C:165
 AliCFV0Task.C:166
 AliCFV0Task.C:167
 AliCFV0Task.C:168
 AliCFV0Task.C:169
 AliCFV0Task.C:170
 AliCFV0Task.C:171
 AliCFV0Task.C:172
 AliCFV0Task.C:173
 AliCFV0Task.C:174
 AliCFV0Task.C:175
 AliCFV0Task.C:176
 AliCFV0Task.C:177
 AliCFV0Task.C:178
 AliCFV0Task.C:179
 AliCFV0Task.C:180
 AliCFV0Task.C:181
 AliCFV0Task.C:182
 AliCFV0Task.C:183
 AliCFV0Task.C:184
 AliCFV0Task.C:185
 AliCFV0Task.C:186
 AliCFV0Task.C:187
 AliCFV0Task.C:188
 AliCFV0Task.C:189
 AliCFV0Task.C:190
 AliCFV0Task.C:191
 AliCFV0Task.C:192
 AliCFV0Task.C:193
 AliCFV0Task.C:194
 AliCFV0Task.C:195
 AliCFV0Task.C:196
 AliCFV0Task.C:197
 AliCFV0Task.C:198
 AliCFV0Task.C:199
 AliCFV0Task.C:200
 AliCFV0Task.C:201
 AliCFV0Task.C:202
 AliCFV0Task.C:203
 AliCFV0Task.C:204
 AliCFV0Task.C:205
 AliCFV0Task.C:206
 AliCFV0Task.C:207
 AliCFV0Task.C:208
 AliCFV0Task.C:209
 AliCFV0Task.C:210
 AliCFV0Task.C:211
 AliCFV0Task.C:212
 AliCFV0Task.C:213
 AliCFV0Task.C:214
 AliCFV0Task.C:215
 AliCFV0Task.C:216
 AliCFV0Task.C:217
 AliCFV0Task.C:218
 AliCFV0Task.C:219
 AliCFV0Task.C:220
 AliCFV0Task.C:221
 AliCFV0Task.C:222
 AliCFV0Task.C:223
 AliCFV0Task.C:224
 AliCFV0Task.C:225
 AliCFV0Task.C:226
 AliCFV0Task.C:227
 AliCFV0Task.C:228
 AliCFV0Task.C:229
 AliCFV0Task.C:230
 AliCFV0Task.C:231
 AliCFV0Task.C:232
 AliCFV0Task.C:233
 AliCFV0Task.C:234
 AliCFV0Task.C:235
 AliCFV0Task.C:236
 AliCFV0Task.C:237
 AliCFV0Task.C:238
 AliCFV0Task.C:239
 AliCFV0Task.C:240
 AliCFV0Task.C:241
 AliCFV0Task.C:242
 AliCFV0Task.C:243
 AliCFV0Task.C:244
 AliCFV0Task.C:245
 AliCFV0Task.C:246
 AliCFV0Task.C:247
 AliCFV0Task.C:248
 AliCFV0Task.C:249
 AliCFV0Task.C:250
 AliCFV0Task.C:251
 AliCFV0Task.C:252
 AliCFV0Task.C:253
 AliCFV0Task.C:254
 AliCFV0Task.C:255
 AliCFV0Task.C:256
 AliCFV0Task.C:257
 AliCFV0Task.C:258
 AliCFV0Task.C:259
 AliCFV0Task.C:260
 AliCFV0Task.C:261
 AliCFV0Task.C:262
 AliCFV0Task.C:263
 AliCFV0Task.C:264
 AliCFV0Task.C:265
 AliCFV0Task.C:266
 AliCFV0Task.C:267
 AliCFV0Task.C:268
 AliCFV0Task.C:269
 AliCFV0Task.C:270
 AliCFV0Task.C:271
 AliCFV0Task.C:272
 AliCFV0Task.C:273
 AliCFV0Task.C:274
 AliCFV0Task.C:275
 AliCFV0Task.C:276
 AliCFV0Task.C:277
 AliCFV0Task.C:278
 AliCFV0Task.C:279