ROOT logo
Bool_t runProtonCorrection(Int_t stats = 0, const char* dataset = 0x0) {
  //macro used to extract the correction maps
  //using the official correction framework of ALICE
  //for protons and antiprotons
  //Author: Panos.Christakoglou@cern.ch

  //________________________________________//
  //Connect to proof  
  //TProof::Reset("alicecaf.cern.ch");
  TProof::Open("alicecaf.cern.ch");

  // Enable the STEERBase Package
  gProof->UploadPackage("STEERBase.par");
  gProof->EnablePackage("STEERBase");
  // Enable the ESD Package
  gProof->UploadPackage("ESD.par");
  gProof->EnablePackage("ESD");
  // Enable the AOD Package
  gProof->UploadPackage("AOD.par");
  gProof->EnablePackage("AOD");
  // Enable the Analysis Package
  gProof->UploadPackage("ANALYSIS.par");
  gProof->EnablePackage("ANALYSIS");
  gProof->UploadPackage("ANALYSISalice.par");
  gProof->EnablePackage("ANALYSISalice");
  // Enable the CORRFW Package
  gProof->UploadPackage("CORRFW.par");
  gProof->EnablePackage("CORRFW");

  gProof->Load("./AliProtonCorrectionTask.cxx+g");

  //________________________________________//
  //Container definition
  //Variables of the GRID
  //For the time being: y-pT
  //Next step: add Vz
  //Setting up the container grid...
  //===============//
  //Global tracking//
  //===============//
  const Double_t ymin  = -1.0;
  const Double_t ymax  =  1.0;
  const Int_t nbin1 = 20; //bins in y
  const Double_t ptmin =  0.4;
  const Double_t ptmax =  3.1;
  const Int_t nbin2 = 27; //bins in pT 
  //===============//
  //  TPC tracking //
  //===============//
  /*const Double_t ymin  = -0.5;
  const Double_t ymax  =  0.5;
  const Int_t nbin1 = 10; //bins in y
  const Double_t ptmin =  0.4;
  const Double_t ptmax =  0.9;
  const Int_t nbin2 = 15;*/ //bins in pT 
  
  //Setting up the container grid... 
  UInt_t nstep = 4; //number of selection steps MC 
  UInt_t iy  = 0;
  UInt_t ipT = 1;
  const Int_t nvar = 2; //number of variables on the grid:y-pT
    //arrays for the number of bins in each dimension
  Int_t iBin[nvar];
  iBin[0]=nbin1;
  iBin[1]=nbin2;
  //arrays for lower bounds :
  Double_t *binLim1=new Double_t[nbin1+1];
  Double_t *binLim2=new Double_t[nbin2+1];
  //values for bin lower bounds
  for(Int_t i=0; i<=nbin1; i++) binLim1[i]=(Double_t)ymin  + (ymax-ymin)  /nbin1*(Double_t)i;
  for(Int_t i=0; i<=nbin2; i++) binLim2[i]=(Double_t)ptmin + (ptmax-ptmin)/nbin2*(Double_t)i; 
  //CF container for protons
  AliCFContainer* containerProtons = new AliCFContainer("containerProtons","container for protons",nstep,nvar,iBin);
  //setting the bin limits
  containerProtons->SetBinLimits(iy,binLim1);
  containerProtons->SetBinLimits(ipT,binLim2);
 //CF container for antiprotons
  AliCFContainer* containerAntiProtons = new AliCFContainer("containerAntiProtons","container for antiprotons",nstep,nvar,iBin);
  //setting the bin limits
  containerAntiProtons->SetBinLimits(iy,binLim1);
  containerAntiProtons->SetBinLimits(ipT,binLim2);

  //________________________________________//
  // SET TLIST FOR QA HISTOS
  TList* qaList = new TList();
  //Cuts
  const Int_t    mintrackrefsTPC = 2;
  const Int_t    mintrackrefsITS = 3;
  const Int_t    chargeProtons  = 1;
  const Int_t    PDGProtons = 2212; 
  const Int_t    chargeAntiProtons  = -1;
  const Int_t    PDGAntiProtons = -2212; 

  const Int_t    minclustersTPC = 50;
  const Float_t  maxChi2PerTPCCluster = 3.5;
  const Float_t  maxCov11 = 2.0;
  const Float_t  maxCov22 = 2.0;
  const Float_t  maxCov33 = 0.5;
  const Float_t  maxCov44 = 0.5;
  const Float_t  maxCov55 = 2.0;
  const Float_t  maxSigmaToVertexTPC = 2.5;

  const Int_t    minclustersITS = 5;
  const Float_t  maxSigmaToVertex = 2.5;

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

  AliCFTrackKineCuts *mcKineCutsAntiProtons = new AliCFTrackKineCuts("mcKineCutsAntiProtons",
								     "MC-level kinematic cuts");
  mcKineCutsAntiProtons->SetPtRange(ptmin,ptmax);
  mcKineCutsAntiProtons->SetRapidityRange(ymin,ymax);
  mcKineCutsAntiProtons->SetChargeMC(chargeAntiProtons);
  mcKineCutsAntiProtons->SetQAOn(qaList);

  //Particle-Level cuts:  
  AliCFParticleGenCuts* mcGenCuts = new AliCFParticleGenCuts("mcGenCuts",
							     "MC particle generation cuts");
  mcGenCuts->SetRequireIsPrimary();
  mcGenCuts->SetRequirePdgCode(PDGProtons);
  mcGenCuts->SetQAOn(qaList);

  //Acceptance Cuts
  AliCFAcceptanceCuts *mcAccCuts = new AliCFAcceptanceCuts("mcAccCuts",
							   "MC acceptance cuts");
  mcAccCuts->SetMinNHitITS(mintrackrefsITS);
  mcAccCuts->SetMinNHitTPC(mintrackrefsTPC);
  mcAccCuts->SetQAOn(qaList);

  // Rec-Level kinematic cuts
  AliCFTrackKineCuts *recKineCutsProtons = new AliCFTrackKineCuts("recKineCutsProtons",
								  "rec-level kine cuts");
  recKineCutsProtons->SetPtRange(ptmin,ptmax);
  recKineCutsProtons->SetRapidityRange(ymin,ymax);
  recKineCutsProtons->SetChargeRec(chargeProtons);
  recKineCutsProtons->SetQAOn(qaList);

  AliCFTrackKineCuts *recKineCutsAntiProtons = new AliCFTrackKineCuts("recKineCutsAntiProtons",
								      "rec-level kine cuts");
  recKineCutsAntiProtons->SetPtRange(ptmin,ptmax);
  recKineCutsAntiProtons->SetRapidityRange(ymin,ymax);
  recKineCutsAntiProtons->SetChargeRec(chargeAntiProtons);
  recKineCutsAntiProtons->SetQAOn(qaList);

  AliCFTrackQualityCuts *recQualityCuts = new AliCFTrackQualityCuts("recQualityCuts",
								    "rec-level quality cuts");
  recQualityCuts->SetMinNClusterTPC(minclustersTPC);
  recQualityCuts->SetMaxChi2PerClusterTPC(maxChi2PerTPCCluster);
  recQualityCuts->SetMaxCovDiagonalElements(maxCov11,maxCov22,maxCov33,maxCov44,maxCov55);
  recQualityCuts->SetRequireTPCRefit(kTRUE);
  
  //recQualityCuts->SetRequireITSRefit(kTRUE);
  recQualityCuts->SetQAOn(qaList);

  AliCFTrackIsPrimaryCuts *recIsPrimaryCuts = new AliCFTrackIsPrimaryCuts("recIsPrimaryCuts",
									  "rec-level isPrimary cuts");
  recIsPrimaryCuts->SetMaxNSigmaToVertex(maxSigmaToVertex);
  recIsPrimaryCuts->SetQAOn(qaList);

  AliCFTrackCutPid* cutPID = new AliCFTrackCutPid("cutPID","ESD_PID");
  int n_species = AliPID::kSPECIES;
  Double_t* prior = new Double_t[n_species];
  
  prior[0] = 0.0244519;
  prior[1] = 0.0143988;
  prior[2] = 0.805747 ;
  prior[3] = 0.0928785;
  prior[4] = 0.0625243;
  
  cutPID->SetPriors(prior);
  cutPID->SetProbabilityCut(0.0);
  cutPID->SetDetectors("ITS TPC TOF");
  cutPID->SetParticleType(AliPID::kProton  , kTRUE); 
  cutPID->SetQAOn(qaList);

  //________________________________________// 
  TObjArray* mcListProtons = new TObjArray(0);
  mcListProtons->AddLast(mcKineCutsProtons);
  mcListProtons->AddLast(mcGenCuts);
  TObjArray* mcListAntiProtons = new TObjArray(0);
  mcListAntiProtons->AddLast(mcKineCutsAntiProtons);
  mcListAntiProtons->AddLast(mcGenCuts);

  printf("CREATE ACCEPTANCE CUTS\n");
  TObjArray* accList = new TObjArray(0);
  accList->AddLast(mcAccCuts);

  printf("CREATE RECONSTRUCTION CUTS\n");
  TObjArray* recListProtons = new TObjArray(0);
  recListProtons->AddLast(recKineCutsProtons);
  recListProtons->AddLast(recQualityCuts);
  recListProtons->AddLast(recIsPrimaryCuts);
  TObjArray* recListAntiProtons = new TObjArray(0);
  recListAntiProtons->AddLast(recKineCutsAntiProtons);
  recListAntiProtons->AddLast(recQualityCuts);
  recListAntiProtons->AddLast(recIsPrimaryCuts);

  printf("CREATE PID CUTS\n");
  TObjArray* fPIDCutList = new TObjArray(0);
  fPIDCutList->AddLast(cutPID);

  //________________________________________// 
  //CREATE THE INTERFACE TO CORRECTION FRAMEWORK USED IN THE TASK
  AliCFManager* manProtons = new AliCFManager();
  manProtons->SetParticleContainer(containerProtons);
  manProtons->SetParticleCutsList(AliCFManager::kPartGenCuts,mcListProtons);
  manProtons->SetParticleCutsList(AliCFManager::kPartAccCuts,accList);
  manProtons->SetParticleCutsList(AliCFManager::kPartRecCuts,recListProtons);
  manProtons->SetParticleCutsList(AliCFManager::kPartSelCuts,fPIDCutList);

  AliCFManager* manAntiProtons = new AliCFManager();
  manAntiProtons->SetParticleContainer(containerAntiProtons);
  manAntiProtons->SetParticleCutsList(AliCFManager::kPartGenCuts,mcListAntiProtons);
  manAntiProtons->SetParticleCutsList(AliCFManager::kPartAccCuts,accList);
  manAntiProtons->SetParticleCutsList(AliCFManager::kPartRecCuts,recListAntiProtons);
  manAntiProtons->SetParticleCutsList(AliCFManager::kPartSelCuts,fPIDCutList);

  //________________________________________// 
  //CREATE THE TASK
  AliProtonCorrectionTask *task = new AliProtonCorrectionTask("AliProtonCorrectionTask");
  task->SetCFManagerProtons(manProtons); //here is set the CF manager
  task->SetCFManagerAntiProtons(manAntiProtons); //here is set the CF manager
  task->SetQAList(qaList);

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

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

  //------ input data ------
  AliAnalysisDataContainer *cinput0  = mgr->GetCommonInputContainer();

  // ----- output data -----
  //slot 0 : default output tree (by default handled by AliAnalysisTaskSE)
  AliAnalysisDataContainer *coutput0 = mgr->CreateContainer("ctree0", TTree::Class(),
							    AliAnalysisManager::kOutputContainer,"corrections.root");
  // output TH1I for event counting
  AliAnalysisDataContainer *coutput1 = mgr->CreateContainer("chist0", TH1I::Class(),
							    AliAnalysisManager::kOutputContainer,"corrections.root");
  // output Correction Framework Container (for acceptance & efficiency calculations)
  AliAnalysisDataContainer *coutput2 = mgr->CreateContainer("ccontainer0", 
							    AliCFContainer::Class(),
							    AliAnalysisManager::kOutputContainer,"corrections.root");
  // output Correction Framework Container (for acceptance & efficiency calculations)
  AliAnalysisDataContainer *coutput3 = mgr->CreateContainer("ccontainer1", 
							    AliCFContainer::Class(),
							    AliAnalysisManager::kOutputContainer,"corrections.root");
  // output QA histograms 
  AliAnalysisDataContainer *coutput4 = mgr->CreateContainer("clist0", 
							    TList::Class(),
							    AliAnalysisManager::kOutputContainer,"corrections.root");
  
  mgr->AddTask(task);
  mgr->ConnectInput(task,0,cinput0);
  mgr->ConnectOutput(task,0,coutput0);
  mgr->ConnectOutput(task,1,coutput1);
  mgr->ConnectOutput(task,2,coutput2);
  mgr->ConnectOutput(task,3,coutput3);
  mgr->ConnectOutput(task,4,coutput4);

  //________________________________________// 
  if (mgr->InitAnalysis()) {
    if(dataset)
      mgr->StartAnalysis("proof",dataset,stats);
    else {
      // You should get this macro and the txt file from:
      // http://aliceinfo.cern.ch/Offline/Analysis/CAF/
      gROOT->LoadMacro("CreateESDChain.C");
      TChain* chain = 0x0;
      chain = CreateESDChain("ESD82XX_30K.txt",stats);
      chain->SetBranchStatus("*Calo*",0);

      mgr->StartAnalysis("proof",chain);
    }
  }

  return kTRUE;
}

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