ROOT logo
Bool_t ReadContaminationFunctions(TString filename, TF1 **functions, double sigma){
  TFile *in = TFile::Open(Form("$ALICE_ROOT/PWGHF/hfe/macros/configs/pPb/%s", filename.Data()));
  gROOT->cd();
  int isig = static_cast<int>(sigma * 100.);
  printf("Getting hadron background for the sigma cut: %d\n", isig);
  bool status = kTRUE;
  for(int icent = 0; icent < 12; icent++){
    functions[icent] = dynamic_cast<TF1 *>(in->Get(Form("hback_%d_%d", isig, icent)));
    if(functions[icent]) printf("Config for centrality class %d found\n", icent);
    else{
      printf("Config for the centrality class %d not found\n", icent);
      status = kFALSE;
    }
  }
  delete in;
  return status;
}

AliAnalysisTaskHFE* ConfigHFEpPb(Bool_t useMC, Bool_t isAOD, TString appendix, 
				 UChar_t TPCcl=70, UChar_t TPCclPID = 80, 
				 UChar_t ITScl=3, Double_t DCAxy=1000., Double_t DCAz=1000.,
				 Double_t* tpcdEdxcutlow=NULL,Double_t* tpcdEdxcuthigh=NULL,
				 Double_t TOFs=3., Int_t TOFmis=0,
				 Int_t itshitpixel = 0, Int_t icent=1,
				 Double_t etami=-0.8, Double_t etama=0.8, Bool_t esdPreselection = kFALSE){
  
  Bool_t kAnalyseTaggedTracks = kTRUE;
  Bool_t kApplyPreselection = isAOD ? kFALSE : esdPreselection;

  //***************************************//
  //        Setting up the HFE cuts        //
  //***************************************//

  AliHFEcuts *hfecuts = new AliHFEcuts(appendix,"HFE cuts for pPb");
  //hfecuts->SetQAOn();
  hfecuts->CreateStandardCuts();
  hfecuts->SetMinNClustersTPC(TPCcl);
  hfecuts->SetMinNClustersTPCPID(TPCclPID);
  hfecuts->SetMinNClustersITS(ITScl);
  hfecuts->SetMinRatioTPCclusters(0.6);
  hfecuts->SetTPCmodes(AliHFEextraCuts::kFound, AliHFEextraCuts::kFoundOverFindable);
  hfecuts->SetCutITSpixel(itshitpixel);
  hfecuts->SetCheckITSLayerStatus(kFALSE);
  hfecuts->SetEtaRange(etami,etama);
  hfecuts->SetRejectKinkDaughters();
  hfecuts->SetAcceptKinkMothers();
  if(isAOD) hfecuts->SetAODFilterBit(4);
  
  //if((iPixelAny==AliHFEextraCuts::kAny) || (iPixelAny==AliHFEextraCuts::kSecond))     
  //hfecuts->SetProductionVertex(0,7,0,7);
 
  hfecuts->SetMaxImpactParam(DCAxy,DCAz);
  hfecuts->SetUseMixedVertex(kTRUE);
  hfecuts->SetVertexRange(10.);
  // New pPb cuts (February 2013)
  hfecuts->SetUseCorrelationVertex();
  hfecuts->SetSPDVtxResolutionCut();
  hfecuts->SetpApileupCut();

  // TOF settings:
  Int_t usetof=0;
  Bool_t kTOFmis=kFALSE;
  if (TOFs>0.){
    usetof = 1;
    printf("CONFIGURATION FILE: TOF is used \n");
    hfecuts->SetTOFPIDStep(kTRUE);
    printf("CONFIGURATION FILE: TOF PID step is requested !!!! \n");
    if (TOFmis>0){
      kTOFmis = kTRUE;
      printf("CONFIGURATION FILE: TOF mismatch rejection is set ON \n");
    }
  }

  //***************************************//
  //        Setting up the task            //
  //***************************************//

  AliAnalysisTaskHFE *task = new AliAnalysisTaskHFE(Form("HFEtask%s",appendix.Data()));
  printf("task %p\n", task);
  task->SetpPbAnalysis();
  if(!isAOD) task->SetRemoveFirstEventInChunk();
  task->SetRemovePileUp(kFALSE);
  task->SetHFECuts(hfecuts);
  task->GetPIDQAManager()->SetHighResolutionHistos();
  task->SetRejectKinkMother(kFALSE);

  // Determine the centrality estimator
  task->SetCentralityEstimator("V0A");
  if (icent == 2) task->SetCentralityEstimator("V0M");
  else if (icent == 3) task->SetCentralityEstimator("CL1");
  else if (icent == 4) task->SetCentralityEstimator("ZNA");

  //***************************************//
  //        Prepare preselection           //
  // This mimics the ESD->AOD filter in    //
  // case of the ESD analysis and selects  //
  // only tracks which will be selected in //
  // the AOD analysis with the given filter//
  // bit. Not to be applied for AODS.      //
  // For pPb the cuts used are (bit 4)     //
  // esdTrackCutsHG0 from file $ALICE_ROOT///
  // ANALYSIS/macros/AddTaskESDFilter.C    //
  //***************************************//
  
  if(kApplyPreselection){
    AliESDtrackCuts* esdfilter = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE);
    esdfilter->SetMaxDCAToVertexXY(2.4);
    esdfilter->SetMaxDCAToVertexZ(3.2);
    esdfilter->SetDCAToVertex2D(kTRUE);

    task->SetHFECutsPreselect(esdfilter);
    printf("Put a preselection cut\n");
    task->SetFillNoCuts(kTRUE);
  }

  //***************************************//
  //          Variable manager             //
  //***************************************//
  // Define Variables
  Double_t ptbinning[36] = {0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1., 1.1, 1.2, 1.3, 1.4, 1.5, 1.75, 2., 2.25, 2.5, 2.75, 3., 3.5, 4., 4.5, 5., 5.5, 6., 7., 8., 10., 12., 14., 16., 18., 20.};
  Double_t etabinning[17] = {-0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8};

  Int_t sizept=(sizeof(ptbinning)/sizeof(double))-1;
  Int_t sizeeta=(sizeof(etabinning)/sizeof(double))-1;

  AliHFEvarManager *vm = task->GetVarManager();
  vm->AddVariable("pt", sizept, ptbinning);
  vm->AddVariable("eta", sizeeta, -0.8,0.8);
  vm->AddVariable("phi",21, -0, 2*TMath::Pi());
  vm->AddVariable("charge");
  vm->AddVariable("source");
  vm->AddVariable("centrality");

  // For the moment, remove the part dedicated to the background subtraction.
  // It will be implemented in a different way, reading it from a root file.

  //***************************************//
  //          Configure the PID            //
  //***************************************//

  // Define PID
  AliHFEpid *pid = task->GetPID();
  if(useMC) pid->SetHasMCData(kTRUE);

  if (usetof){
    pid->AddDetector("TOF", 0);
    pid->AddDetector("TPC", 1);
  } else {
    pid->AddDetector("TPC", 0);
  }
  
  // Configure TPC PID
  // do the identical thing in data and MC
  Double_t paramsTPCdEdxcutlow[12] ={0.0, 0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
  if(tpcdEdxcutlow) memcpy(paramsTPCdEdxcutlow,tpcdEdxcutlow,sizeof(paramsTPCdEdxcutlow));

  Double_t paramsTPCdEdxcuthigh[12] ={3.0, 3.0, 3.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0};
  if(tpcdEdxcuthigh) memcpy(paramsTPCdEdxcuthigh,tpcdEdxcuthigh,sizeof(paramsTPCdEdxcuthigh));

  char *cutmodel;
  cutmodel="pol0";

  for(Int_t a=0;a<11;a++){
    // Not necessary anymore, since the pPb case is handled similarly to the pp case
    //   cout << a << " " << paramsTPCdEdxcut[a] << endl;
    Double_t tpcparamlow[1]={paramsTPCdEdxcutlow[a]};
    Float_t tpcparamhigh=paramsTPCdEdxcuthigh[a];
    pid->ConfigureTPCcentralityCut(a,cutmodel,tpcparamlow,tpcparamhigh);
  }
  pid->ConfigureTPCdefaultCut(cutmodel,paramsTPCdEdxcutlow,paramsTPCdEdxcuthigh[0]); // After introducing the pPb flag, pPb is merged with pp and this line defines the cut

  // Configure TOF PID
  if (usetof){
    pid->ConfigureTOF(TOFs);
    AliHFEpidTOF *tofpid = pid->GetDetPID(AliHFEpid::kTOFpid);
    if (kTOFmis){
      tofpid->SetRejectTOFmismatch();
    }
  }

  // To make different upper TOF cut to see contamination effect
  // The below two lines should be removed after this check
  //AliHFEpidTOF *tofpid = pid->GetDetPID(AliHFEpid::kTOFpid);
  //if(TOFs<3.) tofpid->SetTOFnSigmaBand(-3,TOFs); //only to check the assymmetric tof cut

  // Load hadron background
  if(!useMC){
    Bool_t status = kTRUE;
    TF1 *hBackground[12];
    status = ReadContaminationFunctions("hadroncontamination_TOFTPC_pPb_eta06_newsplines_try3.root", hBackground, tpcdEdxcutlow[0]);
    for(Int_t a=0;a<12;a++) {
      //printf("back %f \n",hBackground[a]);
      if(status) task->SetBackGroundFactorsFunction(hBackground[a],a);
      else printf("not all background functions found\n");
    }
  }

  //***************************************//
  //          V0 tagged tracks             //
  //***************************************//

  if(kAnalyseTaggedTracks){
    AliHFEcuts *v0trackCuts = new AliHFEcuts("V0trackCuts", "Track Cuts for tagged track Analysis");
    v0trackCuts->CreateStandardCuts();
    v0trackCuts->SetMinNClustersTPC(TPCcl);
    v0trackCuts->SetMinNClustersTPCPID(TPCclPID);
    v0trackCuts->SetMinRatioTPCclusters(0.6);
    v0trackCuts->SetTPCmodes(AliHFEextraCuts::kFound, AliHFEextraCuts::kFoundOverFindable);
    v0trackCuts->SetMinNClustersITS(1);
    v0trackCuts->SetCutITSpixel(AliHFEextraCuts::kFirst);
    v0trackCuts->SetCheckITSLayerStatus(kFALSE);
    v0trackCuts->UnsetVertexRequirement();
    //hfecuts->SetSigmaToVertex(10);
    if(usetof) v0trackCuts->SetTOFPIDStep(kTRUE);
    v0trackCuts->SetQAOn();

    task->SwitchOnPlugin(AliAnalysisTaskHFE::kTaggedTrackAnalysis);
    task->SetTaggedTrackCuts(v0trackCuts);
    task->SetCleanTaggedTrack(kTRUE);
  }

  // QA
  printf("task %p\n", task);
  task->SetQAOn(AliAnalysisTaskHFE::kPIDqa);
  task->SetQAOn(AliAnalysisTaskHFE::kMCqa);
  task->SwitchOnPlugin(AliAnalysisTaskHFE::kDEstep);

  printf("*************************************\n");
  printf("Configuring standard Task:\n");
  task->PrintStatus();
  pid->PrintStatus();
  printf("*************************************\n");
  return task;
}
 ConfigHFEpPb.C:1
 ConfigHFEpPb.C:2
 ConfigHFEpPb.C:3
 ConfigHFEpPb.C:4
 ConfigHFEpPb.C:5
 ConfigHFEpPb.C:6
 ConfigHFEpPb.C:7
 ConfigHFEpPb.C:8
 ConfigHFEpPb.C:9
 ConfigHFEpPb.C:10
 ConfigHFEpPb.C:11
 ConfigHFEpPb.C:12
 ConfigHFEpPb.C:13
 ConfigHFEpPb.C:14
 ConfigHFEpPb.C:15
 ConfigHFEpPb.C:16
 ConfigHFEpPb.C:17
 ConfigHFEpPb.C:18
 ConfigHFEpPb.C:19
 ConfigHFEpPb.C:20
 ConfigHFEpPb.C:21
 ConfigHFEpPb.C:22
 ConfigHFEpPb.C:23
 ConfigHFEpPb.C:24
 ConfigHFEpPb.C:25
 ConfigHFEpPb.C:26
 ConfigHFEpPb.C:27
 ConfigHFEpPb.C:28
 ConfigHFEpPb.C:29
 ConfigHFEpPb.C:30
 ConfigHFEpPb.C:31
 ConfigHFEpPb.C:32
 ConfigHFEpPb.C:33
 ConfigHFEpPb.C:34
 ConfigHFEpPb.C:35
 ConfigHFEpPb.C:36
 ConfigHFEpPb.C:37
 ConfigHFEpPb.C:38
 ConfigHFEpPb.C:39
 ConfigHFEpPb.C:40
 ConfigHFEpPb.C:41
 ConfigHFEpPb.C:42
 ConfigHFEpPb.C:43
 ConfigHFEpPb.C:44
 ConfigHFEpPb.C:45
 ConfigHFEpPb.C:46
 ConfigHFEpPb.C:47
 ConfigHFEpPb.C:48
 ConfigHFEpPb.C:49
 ConfigHFEpPb.C:50
 ConfigHFEpPb.C:51
 ConfigHFEpPb.C:52
 ConfigHFEpPb.C:53
 ConfigHFEpPb.C:54
 ConfigHFEpPb.C:55
 ConfigHFEpPb.C:56
 ConfigHFEpPb.C:57
 ConfigHFEpPb.C:58
 ConfigHFEpPb.C:59
 ConfigHFEpPb.C:60
 ConfigHFEpPb.C:61
 ConfigHFEpPb.C:62
 ConfigHFEpPb.C:63
 ConfigHFEpPb.C:64
 ConfigHFEpPb.C:65
 ConfigHFEpPb.C:66
 ConfigHFEpPb.C:67
 ConfigHFEpPb.C:68
 ConfigHFEpPb.C:69
 ConfigHFEpPb.C:70
 ConfigHFEpPb.C:71
 ConfigHFEpPb.C:72
 ConfigHFEpPb.C:73
 ConfigHFEpPb.C:74
 ConfigHFEpPb.C:75
 ConfigHFEpPb.C:76
 ConfigHFEpPb.C:77
 ConfigHFEpPb.C:78
 ConfigHFEpPb.C:79
 ConfigHFEpPb.C:80
 ConfigHFEpPb.C:81
 ConfigHFEpPb.C:82
 ConfigHFEpPb.C:83
 ConfigHFEpPb.C:84
 ConfigHFEpPb.C:85
 ConfigHFEpPb.C:86
 ConfigHFEpPb.C:87
 ConfigHFEpPb.C:88
 ConfigHFEpPb.C:89
 ConfigHFEpPb.C:90
 ConfigHFEpPb.C:91
 ConfigHFEpPb.C:92
 ConfigHFEpPb.C:93
 ConfigHFEpPb.C:94
 ConfigHFEpPb.C:95
 ConfigHFEpPb.C:96
 ConfigHFEpPb.C:97
 ConfigHFEpPb.C:98
 ConfigHFEpPb.C:99
 ConfigHFEpPb.C:100
 ConfigHFEpPb.C:101
 ConfigHFEpPb.C:102
 ConfigHFEpPb.C:103
 ConfigHFEpPb.C:104
 ConfigHFEpPb.C:105
 ConfigHFEpPb.C:106
 ConfigHFEpPb.C:107
 ConfigHFEpPb.C:108
 ConfigHFEpPb.C:109
 ConfigHFEpPb.C:110
 ConfigHFEpPb.C:111
 ConfigHFEpPb.C:112
 ConfigHFEpPb.C:113
 ConfigHFEpPb.C:114
 ConfigHFEpPb.C:115
 ConfigHFEpPb.C:116
 ConfigHFEpPb.C:117
 ConfigHFEpPb.C:118
 ConfigHFEpPb.C:119
 ConfigHFEpPb.C:120
 ConfigHFEpPb.C:121
 ConfigHFEpPb.C:122
 ConfigHFEpPb.C:123
 ConfigHFEpPb.C:124
 ConfigHFEpPb.C:125
 ConfigHFEpPb.C:126
 ConfigHFEpPb.C:127
 ConfigHFEpPb.C:128
 ConfigHFEpPb.C:129
 ConfigHFEpPb.C:130
 ConfigHFEpPb.C:131
 ConfigHFEpPb.C:132
 ConfigHFEpPb.C:133
 ConfigHFEpPb.C:134
 ConfigHFEpPb.C:135
 ConfigHFEpPb.C:136
 ConfigHFEpPb.C:137
 ConfigHFEpPb.C:138
 ConfigHFEpPb.C:139
 ConfigHFEpPb.C:140
 ConfigHFEpPb.C:141
 ConfigHFEpPb.C:142
 ConfigHFEpPb.C:143
 ConfigHFEpPb.C:144
 ConfigHFEpPb.C:145
 ConfigHFEpPb.C:146
 ConfigHFEpPb.C:147
 ConfigHFEpPb.C:148
 ConfigHFEpPb.C:149
 ConfigHFEpPb.C:150
 ConfigHFEpPb.C:151
 ConfigHFEpPb.C:152
 ConfigHFEpPb.C:153
 ConfigHFEpPb.C:154
 ConfigHFEpPb.C:155
 ConfigHFEpPb.C:156
 ConfigHFEpPb.C:157
 ConfigHFEpPb.C:158
 ConfigHFEpPb.C:159
 ConfigHFEpPb.C:160
 ConfigHFEpPb.C:161
 ConfigHFEpPb.C:162
 ConfigHFEpPb.C:163
 ConfigHFEpPb.C:164
 ConfigHFEpPb.C:165
 ConfigHFEpPb.C:166
 ConfigHFEpPb.C:167
 ConfigHFEpPb.C:168
 ConfigHFEpPb.C:169
 ConfigHFEpPb.C:170
 ConfigHFEpPb.C:171
 ConfigHFEpPb.C:172
 ConfigHFEpPb.C:173
 ConfigHFEpPb.C:174
 ConfigHFEpPb.C:175
 ConfigHFEpPb.C:176
 ConfigHFEpPb.C:177
 ConfigHFEpPb.C:178
 ConfigHFEpPb.C:179
 ConfigHFEpPb.C:180
 ConfigHFEpPb.C:181
 ConfigHFEpPb.C:182
 ConfigHFEpPb.C:183
 ConfigHFEpPb.C:184
 ConfigHFEpPb.C:185
 ConfigHFEpPb.C:186
 ConfigHFEpPb.C:187
 ConfigHFEpPb.C:188
 ConfigHFEpPb.C:189
 ConfigHFEpPb.C:190
 ConfigHFEpPb.C:191
 ConfigHFEpPb.C:192
 ConfigHFEpPb.C:193
 ConfigHFEpPb.C:194
 ConfigHFEpPb.C:195
 ConfigHFEpPb.C:196
 ConfigHFEpPb.C:197
 ConfigHFEpPb.C:198
 ConfigHFEpPb.C:199
 ConfigHFEpPb.C:200
 ConfigHFEpPb.C:201
 ConfigHFEpPb.C:202
 ConfigHFEpPb.C:203
 ConfigHFEpPb.C:204
 ConfigHFEpPb.C:205
 ConfigHFEpPb.C:206
 ConfigHFEpPb.C:207
 ConfigHFEpPb.C:208
 ConfigHFEpPb.C:209
 ConfigHFEpPb.C:210
 ConfigHFEpPb.C:211
 ConfigHFEpPb.C:212
 ConfigHFEpPb.C:213
 ConfigHFEpPb.C:214
 ConfigHFEpPb.C:215
 ConfigHFEpPb.C:216
 ConfigHFEpPb.C:217
 ConfigHFEpPb.C:218
 ConfigHFEpPb.C:219
 ConfigHFEpPb.C:220
 ConfigHFEpPb.C:221
 ConfigHFEpPb.C:222
 ConfigHFEpPb.C:223
 ConfigHFEpPb.C:224
 ConfigHFEpPb.C:225
 ConfigHFEpPb.C:226
 ConfigHFEpPb.C:227
 ConfigHFEpPb.C:228
 ConfigHFEpPb.C:229
 ConfigHFEpPb.C:230
 ConfigHFEpPb.C:231
 ConfigHFEpPb.C:232
 ConfigHFEpPb.C:233
 ConfigHFEpPb.C:234
 ConfigHFEpPb.C:235