ROOT logo
enum ECharge_t {
  kPositive,
  kNegative,
  kNCharges
};
const Char_t *chargeName[kNCharges] = {
  "positive",
  "negative",
};

TOFcalib_centrality(const Char_t *filename, Int_t evMax = kMaxInt)
{

  /* 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 */
  TH2F *hTOFcalib_centrality = new TH2F("hTOFcalib_centrality", "", 18, 0., 90., 200, -2440., 2440.);

  /* loop over events */
  Double_t cent, p, time, t0, tof, texp, deltat, timezerocorr, texpcorr;
  for (Int_t iev = 0; iev < treein->GetEntries() && iev < evMax; iev++) {
    /* get event */
    treein->GetEvent(iev);
    if (iev % 1000 == 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 */
    cent = 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 TOF PID */
      if (!analysisTrack->HasTOFPID()) continue;

      /*** ACCEPTED TRACK WITH TOF PID ***/

      /* apply expected time correction */
      analysisTrack->ApplyTOFExpectedTimeCorrection();

      p = analysisTrack->GetP();
      time = analysisTrack->GetTOFTime();
      t0 = analysisEvent->GetTimeZeroTOF(p);
      tof = time - t0;
      texp = analysisTrack->GetTOFExpTime(AliPID::kPion);
      deltat = tof - texp;

      hTOFcalib_centrality->Fill(cent, deltat);

      } /* end of loop over particles */
  } /* end of loop over events */

  /* output */
  TFile *fileout = TFile::Open(Form("TOFcalib_centrality.%s", filename), "RECREATE");
  hTOFcalib_centrality->Write();
  fileout->Close();

}

TOFcalib_texp(const Char_t *filename, Int_t evMax = kMaxInt)
{

  /* 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 */
  TH2F *hTOFcalib_texp[AliPID::kSPECIES][kNCharges];
  TH2F *hTOFcalib_texpr[AliPID::kSPECIES][kNCharges];
  for (Int_t ipart = 0; ipart < AliPID::kSPECIES; ipart++) {
    for (Int_t icharge = 0; icharge < kNCharges; icharge++) {
      hTOFcalib_texp[ipart][icharge] = new TH2F(Form("hTOFcalib_texp_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 100., 0., 5., 400, -4880., 4880.);
      hTOFcalib_texpr[ipart][icharge] = new TH2F(Form("hTOFcalib_texpr_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 100., 0., 5., 400, 0.8, 1.2);
    }
  }

  /* loop over events */
  Int_t charge;
  Double_t cent, p, pt, time, t0, tof, texp, deltat, timezerocorr, texpcorr;
  for (Int_t iev = 0; iev < treein->GetEntries() && iev < evMax; iev++) {
    /* get event */
    treein->GetEvent(iev);
    if (iev % 1000 == 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 */
    cent = analysisEvent->GetCentralityPercentile(AliAnalysisEvent::kCentEst_V0M);
    //    if (cent > 90.) continue;

    /* loop over tracks */
    for (Int_t itrk = 0; itrk < analysisTrackArray->GetEntries(); itrk++) {
      /* get track */
      analysisTrack = (AliAnalysisTrack *)analysisTrackArray->At(itrk);
      if (!analysisTrack) continue;
      /* check eta */
      if (TMath::Abs(analysisTrack->GetEta()) > 0.8) continue;
      /* check TOF PID */
      if (!analysisTrack->HasTOFPID()) continue;
      /* get charge */
      charge = analysisTrack->GetSign() > 0. ? kPositive : kNegative;
      
      /*** ACCEPTED TRACK WITH TOF PID ***/

      /* apply expected time correction */
      analysisTrack->ApplyTOFExpectedTimeCorrection();

      p = analysisTrack->GetP();
      time = analysisTrack->GetTOFTime();
      t0 = analysisEvent->GetTimeZeroTOF(p);
      tof = time - t0;

      /* loop over species */
      for (Int_t ipart = 0; ipart < AliPID::kSPECIES; ipart++) {
	
	texp = analysisTrack->GetTOFExpTime(ipart);
	deltat = tof - texp;

	hTOFcalib_texp[ipart][charge]->Fill(p, deltat);
	hTOFcalib_texpr[ipart][charge]->Fill(p, tof / texp);

      }/* end of loop over species */
    } /* end of loop over tracks */
  } /* end of loop over events */

  /* output */
  TFile *fileout = TFile::Open(Form("TOFcalib_texp.%s", filename), "RECREATE");
  for (Int_t ipart = 0; ipart < AliPID::kSPECIES; ipart++) {
    for (Int_t icharge = 0; icharge < kNCharges; icharge++) {
      hTOFcalib_texp[ipart][icharge]->Write();
      hTOFcalib_texpr[ipart][icharge]->Write();
    }
  }
  fileout->Close();

}

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