ROOT logo
//DEFINITION OF A FEW CONSTANTS
const Double_t   ymin  = -1.0 ;
const Double_t   ymax  =  1.0 ;
const Double_t   ptmin =  0.0 ;
const Double_t   ptmax =  8.0 ;
const Int_t      mintrackrefsTPC = 2 ;
const Int_t      mintrackrefsITS = 3 ;
const Int_t      charge  = 0 ;
const Int_t      PDG = 313; 
const Int_t      minclustersTPC = 50 ;
const Double32_t nsigmavtx = 3. ;       //max track sigma to PVertex
//----------------------------------------------------

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

  AliLog::SetGlobalDebugLevel(0);

  Load(useGrid) ; //load the required libraries

  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("AliCFRsnTask",Form("CHAIN HAS %d ENTRIES",(Int_t)analysisChain->GetEntries()));

  //CONTAINER DEFINITION
  Info("AliCFRsnTask","SETUP CONTAINER");
  //the sensitive variables (2 in this example), 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
  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]=(Double_t)ptmin + (ptmax-ptmin)/nbin1*(Double_t)i ; 
  for(Int_t i=0; i<=nbin2; i++) binLim2[i]=(Double_t)ymin  + (ymax-ymin)  /nbin2*(Double_t)i ;
  //one "container" for MC
  AliCFContainer* container = new AliCFContainer("container","container for tracks",nstep,nvar,iBin);
  //setting the bin limits
  container -> SetBinLimits(ipt,binLim1);
  container -> SetBinLimits(iy,binLim2);


  //CREATE THE  CUTS -----------------------------------------------
  //Particle-Level cuts:  

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

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

  //Acceptance Cuts
  AliCFPairAcceptanceCuts *mcAccCuts = new AliCFPairAcceptanceCuts("mcAccCuts","MC acceptance cuts");
  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","rec-level kine cuts");
  recKineCuts->SetPtRange(ptmin,ptmax);
  recKineCuts->SetRapidityRange(ymin,ymax);
  recKineCuts->SetChargeRec(charge);

  AliCFPairQualityCuts *recQualityCuts = new AliCFPairQualityCuts("recQualityCuts","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);


  AliCFPairIsPrimaryCuts *recIsPrimaryCuts = new AliCFPairIsPrimaryCuts("recIsPrimaryCuts","rec-level isPrimary cuts");
  if (readAOD) {
    recIsPrimaryCuts->GetNegCut()->SetAODType(AliAODTrack::kPrimary);
    recIsPrimaryCuts->GetPosCut()->SetAODType(AliAODTrack::kPrimary);
  }
  else {
    recIsPrimaryCuts->GetNegCut()->SetMaxNSigmaToVertex(nsigmavtx);
    recIsPrimaryCuts->GetPosCut()->SetMaxNSigmaToVertex(nsigmavtx);
  }

  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_pbpb);
  cutPID->GetPosCut()->SetPriors(prior_pbpb);
  cutPID->GetNegCut()->SetProbabilityCut(0);
  cutPID->GetPosCut()->SetProbabilityCut(0);
  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);
  }
  
  switch(PDG) {
  case  -313  : 
    cutPID->GetNegCut()->SetParticleType(AliPID::kKaon  ,kTRUE);
    cutPID->GetPosCut()->SetParticleType(AliPID::kPion  ,kTRUE);
    break;
  case   313  : 
    cutPID->GetNegCut()->SetParticleType(AliPID::kPion  ,kTRUE);
    cutPID->GetPosCut()->SetParticleType(AliPID::kKaon  ,kTRUE); 
    break;
  case   333  : 
    cutPID->GetNegCut()->SetParticleType(AliPID::kKaon  ,kTRUE);
    cutPID->GetPosCut()->SetParticleType(AliPID::kKaon  ,kTRUE); 
    break;
  case  3124  : 
    cutPID->GetNegCut()->SetParticleType(AliPID::kKaon  ,kTRUE);
    cutPID->GetPosCut()->SetParticleType(AliPID::kProton,kTRUE); 
    break;
  case -3124  : 
    cutPID->GetNegCut()->SetParticleType(AliPID::kProton,kTRUE);
    cutPID->GetPosCut()->SetParticleType(AliPID::kKaon  ,kTRUE); 
    break;
  default     : printf("UNDEFINED PID\n"); break;
  }
  //cutPID->SetQAOn(kTRUE);

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

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

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

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


  //CREATE THE INTERFACE TO CORRECTION FRAMEWORK USED IN THE TASK
  Info("AliCFRsnTask","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("AliCFRsnTask","CREATE TASK");
  // create the task
  AliCFRsnTask *task = new AliCFRsnTask("AliRsnTask");
  task->SetCFManager(man); //here is set the CF manager
  task->SetRsnPDG(PDG);


  //SETUP THE ANALYSIS MANAGER TO READ INPUT CHAIN AND WRITE DESIRED OUTPUTS
  Info("AliCFRsnTask","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,"output_rsn.root");

  // output histo (number of events processed)
  AliAnalysisDataContainer *coutput1 = mgr->CreateContainer("chist0", TH1I::Class(),AliAnalysisManager::kOutputContainer,"output_rsn.root");
  // output Correction Framework Container (for acceptance & efficiency calculations)
  AliAnalysisDataContainer *coutput2 = mgr->CreateContainer("ccontainer0", AliCFContainer::Class(),AliAnalysisManager::kOutputContainer,"output_rsn.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("AliCFRsnTask","READY TO RUN");
  //RUN !!!
  if (mgr->InitAnalysis()) {
    mgr->PrintStatus();
    mgr->StartAnalysis("local",analysisChain);
  }

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

void Load(Bool_t useGrid) {
  //load the required aliroot libraries
  gSystem->Load("libANALYSIS") ;
  gSystem->Load("libANALYSISalice") ;
  gSystem->Load("libPWG2resonances");
  gSystem->Load("libCORRFW");

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