enum ECharge_t { kPositive, kNegative, kNCharges }; const Char_t *chargeName[kNCharges] = { "positive", "negative", }; TOFcalibMC_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("TOFcalibMC_centrality.%s", filename), "RECREATE"); hTOFcalib_centrality->Write(); fileout->Close(); } TOFcalibMC_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; /* check charged primary with defined PID */ Int_t ipart = analysisTrack->GetMCPID(); if (!analysisTrack->IsMCPrimary() || ipart < 0 || analysisTrack->GetSign() == 0.) continue; /* check mismatch */ if (analysisTrack->IsMismatchMC()) 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(ipart); deltat = tof - texp; hTOFcalib_texp[ipart][charge]->Fill(p, deltat); hTOFcalib_texpr[ipart][charge]->Fill(p, tof / texp); } /* end of loop over tracks */ } /* end of loop over events */ /* output */ TFile *fileout = TFile::Open(Form("TOFcalibMC_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(); }