ROOT logo
Double_t tofReso = 85.;

/**************************************************************/
/*** HISTOS AND BINNING ***************************************/
/**************************************************************/

/**************************************************************/
enum ECharge_t {
  kPositive,
  kNegative,
  kNCharges
};
const Char_t *chargeName[kNCharges] = {
  "positive",
  "negative",
};
/**************************************************************/
enum EHistoParam_t {
  kCentrality,
  kPt,
  kTPCsignal,
  kTOFsignal,
  kTPCTOFsignal,
  kNHistoParams
};
/**************************************************************/
const Int_t NcentralityBins = 10;
Double_t centralityBin[NcentralityBins + 1] = {0., 5., 10., 20., 30., 40., 50., 60., 70., 80., 90.};
/**************************************************************/
const Int_t NptBins = 46;
Double_t ptBin[NptBins + 1] = {0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0};
/**************************************************************/
const Int_t NsigmaBins = 200;
Double_t sigmaBin[NsigmaBins + 1];
Double_t sigmaMin = -10., sigmaMax = 10., sigmaStep = (sigmaMax - sigmaMin) / NsigmaBins;
/**************************************************************/
Int_t NparamsBins[kNHistoParams] = {NcentralityBins, NptBins, NsigmaBins, NsigmaBins, NsigmaBins};
Double_t *paramBin[kNHistoParams] = {centralityBin, ptBin, sigmaBin, sigmaBin, sigmaBin};
/**************************************************************/

/**************************************************************/


TPCTOFpid(const Char_t *filename, Int_t evMax = kMaxInt, Int_t startEv = 0)
{
  
  /* include path for ACLic */
  gSystem->AddIncludePath("-I$ALICE_ROOT/include");
  gSystem->AddIncludePath("-I$ALICE_ROOT/TOF");
  /* load libraries */
  gSystem->Load("libANALYSIS");
  gSystem->Load("libANALYSISalice");
  /* build analysis task class */
  gROOT->LoadMacro("AliAnalysisParticle.cxx+g");
  gROOT->LoadMacro("AliAnalysisEvent.cxx+g");
  gROOT->LoadMacro("AliAnalysisTrack.cxx+g");

  /* open file, get tree and connect */
  TFile *filein = TFile::Open(filename);
  TTree *treein = (TTree *)filein->Get("aodTree");
  printf("got \"aodTree\": %d entries\n", treein->GetEntries());
  AliAnalysisEvent *analysisEvent = new AliAnalysisEvent();
  TClonesArray *analysisTrackArray = new TClonesArray("AliAnalysisTrack");
  AliAnalysisTrack *analysisTrack = NULL;
  treein->SetBranchAddress("AnalysisEvent", &analysisEvent);
  treein->SetBranchAddress("AnalysisTrack", &analysisTrackArray);

  /**************************************************************/
  /*** HISTOS ***************************************************/
  /**************************************************************/

  /* run-time binning */
  for (Int_t ibin = 0; ibin < NsigmaBins + 1; ibin++)
    sigmaBin[ibin] = sigmaMin + ibin * sigmaStep;

  /* THnSparse */
  THnSparse *hTPCTOFpid[AliPID::kSPECIES][kNCharges];
  for (Int_t ipart = 0; ipart < AliPID::kSPECIES; ipart++) {
    for (Int_t icharge = 0; icharge< kNCharges; icharge++) {
      hTPCTOFpid[ipart][icharge] = new THnSparseF(Form("hTPCTOFpid_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", kNHistoParams, NparamsBins);
      for (Int_t iparam = 0; iparam < kNHistoParams; iparam++) {
	hTPCTOFpid[ipart][icharge]->SetBinEdges(iparam, paramBin[iparam]);
      }
    }
  }

  /**************************************************************/
  /**************************************************************/
  /**************************************************************/

  /* TOF PID response */
  AliTOFPIDResponse tofResponse;
  tofResponse.SetTimeResolution(tofReso);
  /* TPC PID response */
  AliTPCPIDResponse *tpcResponse = AliAnalysisTrack::GetTPCResponse();

  /* start stopwatch */
  TStopwatch timer;
  timer.Start();

  /* loop over events */
  Bool_t hastofpid;
  Int_t charge, index;
  UShort_t dedxN;
  Double_t ptpc, dedx, bethe, deltadedx, dedx_sigma, tpcsignal;
  Double_t p, time, time_sigma, timezero, timezero_sigma, tof, tof_sigma, texp, texp_sigma, deltat, deltat_sigma, tofsignal;
  Double_t tpctofsignal;
  Double_t param[kNHistoParams];
  for (Int_t iev = startEv; iev < treein->GetEntries() && iev < evMax; iev++) {
    /* get event */
    treein->GetEvent(iev);
    if (iev % 100 == 0) printf("iev = %d\n", iev);
    /* check vertex */
    if (!analysisEvent->AcceptVertex()) continue;
    /* check collision candidate */
    if (!analysisEvent->IsCollisionCandidate()) continue;
    /* check centrality quality */
    if (analysisEvent->GetCentralityQuality() != 0.) continue;

    /*** ACCEPTED EVENT ***/

    /* apply time-zero TOF correction */
    analysisEvent->ApplyTimeZeroTOFCorrection();

    /* get centrality */
    param[kCentrality] = analysisEvent->GetCentralityPercentile(AliAnalysisEvent::kCentEst_V0M);

    /* loop over tracks */
    for (Int_t itrk = 0; itrk < analysisTrackArray->GetEntries(); itrk++) {
      /* get track */
      analysisTrack = (AliAnalysisTrack *)analysisTrackArray->At(itrk);
      if (!analysisTrack) continue;
      /* check accepted track */
      if (!analysisTrack->AcceptTrack()) continue;
      /* get charge */
      charge = analysisTrack->GetSign() > 0. ? kPositive : kNegative;

      /*** ACCEPTED TRACK ***/
      
      /* check TOF pid */
      if (!analysisTrack->HasTOFPID() || !analysisTrack->HasTPCPID()) continue;
      
      /*** ACCEPTED TRACK WITH TPC+TOF PID ***/

      /* apply expected time correction */
      analysisTrack->ApplyTOFExpectedTimeCorrection();
      
      /* get track info */
      p = analysisTrack->GetP();
      param[kPt] = analysisTrack->GetPt();

      /* get TPC info */
      dedx = analysisTrack->GetTPCdEdx();
      dedxN = analysisTrack->GetTPCdEdxN();
      ptpc = analysisTrack->GetTPCmomentum();
      
      /* get TOF info */
      time = analysisTrack->GetTOFTime();
      time_sigma = tofReso;
      timezero = analysisEvent->GetTimeZeroTOF(p);
      timezero_sigma = analysisEvent->GetTimeZeroTOFSigma(p);
      tof = time - timezero;
      tof_sigma = TMath::Sqrt(time_sigma * time_sigma + timezero_sigma * timezero_sigma);

      /* loop over particle IDs */
      for (Int_t ipart = 0; ipart < AliPID::kSPECIES; ipart++) {
	
	/* check rapidity */
	if (TMath::Abs(analysisTrack->GetY(AliPID::ParticleMass(ipart))) > 0.5) continue;

	/*** ACCEPTED TRACK WITHIN CORRECT RAPIDITY ***/
	
	/* TPC signal */
	bethe = tpcResponse->GetExpectedSignal(ptpc, ipart);
	deltadedx = dedx - bethe;
	dedx_sigma = tpcResponse->GetExpectedSigma(ptpc, dedxN, ipart);
	tpcsignal = deltadedx / dedx_sigma;
	param[kTPCsignal] = tpcsignal;
	
	/* TOF expected time */
	texp = analysisTrack->GetTOFExpTime(ipart);
	texp_sigma = analysisTrack->GetTOFExpTimeSigma(ipart);
	
	/* TOF signal */
	deltat = tof - texp;
	deltat_sigma = TMath::Sqrt(tof_sigma * tof_sigma + texp_sigma * texp_sigma);
	tofsignal = deltat / deltat_sigma;
	param[kTOFsignal] = tofsignal;

	/* TPC+TOF signal */
	tpctofsignal = TMath::Sqrt(tpcsignal * tpcsignal + tofsignal * tofsignal);
	param[kTPCTOFsignal] = tpctofsignal;

	/* fill histo */
	hTPCTOFpid[ipart][charge]->Fill(param);

      } /* end of loop over particle IDs */      
    } /* end of loop over tracks */
  } /* end of loop over events */
  
  /* start stopwatch */
  timer.Stop();
  timer.Print();
  
  /* output */
  TFile *fileout = TFile::Open(Form("TPCTOFpid.%s", filename), "RECREATE");
  for (Int_t ipart = 0; ipart < AliPID::kSPECIES; ipart++) {
    for (Int_t icharge = 0; icharge < kNCharges; icharge++) {
      hTPCTOFpid[ipart][icharge]->Write();
    }
  }
  fileout->Close();
  
}

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