1 #include "AliTOFAnalysisTaskCalibTree.h"
2 #include "AliAnalysisManager.h"
3 #include "AliAODHandler.h"
5 #include "AliCDBManager.h"
6 #include "AliGRPManager.h"
7 #include "AliGRPObject.h"
8 #include "AliPhysicsSelection.h"
9 #include "AliESDtrack.h"
10 #include "AliESDEvent.h"
11 #include "AliESDpid.h"
12 #include "AliESDtrackCuts.h"
13 #include "AliTOFT0v1.h"
14 #include "AliTOFT0maker.h"
15 #include "AliTOFcalib.h"
17 ClassImp(AliTOFAnalysisTaskCalibTree)
19 //_______________________________________________________
21 AliTOFAnalysisTaskCalibTree::AliTOFAnalysisTaskCalibTree(const Char_t* name) :
22 AliAnalysisTaskSE(name),
24 fEventSelectionFlag(kFALSE),
25 fVertexSelectionFlag(kFALSE),
27 fDiscardPileupEventFlag(kFALSE),
28 fCalibrateTOFsignal(kFALSE),
29 fComputeT0TOF(kFALSE),
31 fUseLHCClockPhase(kFALSE),
32 fPrimaryDCASelectionFlag(kFALSE),
35 fEventCuts(new AliPhysicsSelection()),
36 fTrackCuts(new AliESDtrackCuts()),
37 fESDpid(new AliESDpid()),
41 fIsCollisionCandidate(kFALSE),
44 fGRPManager(new AliGRPManager()),
46 fSpecificStorageParOffline(),
47 fSpecificStorageRunParams(),
49 fTOFcalib(new AliTOFcalib()),
50 fTOFT0maker(new AliTOFT0maker(fESDpid, fTOFcalib)),
51 fTOFT0v1(new AliTOFT0v1(fESDpid))
60 //_______________________________________________________
62 AliTOFAnalysisTaskCalibTree::~AliTOFAnalysisTaskCalibTree()
76 //_______________________________________________________
79 AliTOFAnalysisTaskCalibTree::UserCreateOutputObjects()
82 * user create output objects
85 /* setup output tree */
86 OutputTree()->Branch("run", &fRunNumber, "run/I");
87 OutputTree()->Branch("timestamp", &ftimestamp, "timestamp/i");
88 OutputTree()->Branch("timezero", &ftimezero, "timezero/F");
89 OutputTree()->Branch("vertex", &fVertexZ, "vertex/F");
90 OutputTree()->Branch("nhits", &fnhits, "nhits/I");
91 OutputTree()->Branch("momentum", &fmomentum, "momentum[nhits]/F");
92 OutputTree()->Branch("length", &flength, "length[nhits]/F");
93 OutputTree()->Branch("index", &findex, "index[nhits]/I");
94 OutputTree()->Branch("time", &ftime, "time[nhits]/F");
95 OutputTree()->Branch("tot", &ftot, "tot[nhits]/F");
96 OutputTree()->Branch("texp", &ftexp, "texp[nhits]/F");
100 //_______________________________________________________
102 void AliTOFAnalysisTaskCalibTree::UserExec(Option_t *option) {
108 ((AliAODHandler*)(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()))->SetFillAOD(kFALSE);
111 if (!InitRun()) return;
114 if (!InitEvent()) return;
116 /*** ACCEPTED EVENT ***/
119 fVertexZ = fVertex->GetZ();
121 // compute T0-TOF using all availeble tracks
122 fTOFT0v1->DefineT0("all", 0.0, 0.5);
123 Float_t timeZeroTOF = -1000. * fTOFT0v1->GetResult(0);
124 Float_t timeZeroTOF_sigma = 1000. * fTOFT0v1->GetResult(1);
125 Int_t timeZeroTOF_tracks = fTOFT0v1->GetResult(3);
127 // check T0-TOF sigma
128 if (timeZeroTOF_sigma >= 250.) ftimezero = 999999.;
129 else ftimezero = timeZeroTOF;
134 // loop over ESD tracks
135 Int_t nTracks = fESDEvent->GetNumberOfTracks();
138 Double_t momentum, length, time, tot, timei[AliPID::kSPECIES];
139 for (Int_t itrk = 0; itrk < nTracks; itrk++) {
141 track = fESDEvent->GetTrack(itrk);
142 if (!track) continue;
143 // check accept track
144 if (!fTrackCuts->AcceptTrack(track)) continue;
146 if (fPrimaryDCASelectionFlag && !HasPrimaryDCA(track)) continue;
147 // check TOF measurement
148 if (!HasTOFMeasurement(track)) continue;
150 /*** ACCEPTED TRACK WITH TOF MEASUREMENT ***/
153 momentum = track->P();
154 length = track->GetIntegratedLength();
155 index = track->GetTOFCalChannel();
156 time = track->GetTOFsignal();
157 tot = track->GetTOFsignalToT();
158 track->GetIntegratedTimes(timei);
160 // add hit to array (if there is room)
161 if (fnhits > MAXHITS) continue;
162 fmomentum[fnhits] = momentum;
163 flength[fnhits] = length;
164 findex[fnhits] = index;
165 ftime[fnhits] = time;
167 ftexp[fnhits] = timei[AliPID::kPion];
170 } /* end of loop over ESD tracks */
172 // check number of hits and set fill output tree
174 ((AliAODHandler*)(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()))->SetFillAOD(kTRUE);
178 //_______________________________________________________
180 Bool_t AliTOFAnalysisTaskCalibTree::InitRun() {
187 fESDEvent = dynamic_cast<AliESDEvent *>(InputEvent());
189 AliError("cannot get ESD event");
194 Int_t runNb = fESDEvent->GetRunNumber();
196 // check run already initialized
197 if (fInitFlag && fRunNumber == runNb) return kTRUE;
201 AliCDBManager *cdb = AliCDBManager::Instance();
202 cdb->SetDefaultStorage("raw://");
203 if (!fSpecificStorageParOffline.IsNull())
204 cdb->SetSpecificStorage("TOF/Calib/ParOffline", fSpecificStorageParOffline.Data());
205 if (!fSpecificStorageRunParams.IsNull())
206 cdb->SetSpecificStorage("TOF/Calib/RunParams", fSpecificStorageRunParams.Data());
210 if (!fTOFcalib->Init()) {
211 AliError("cannot init TOF calib");
216 if (!fGRPManager->ReadGRPEntry()) {
217 AliError("error while reading \"GRPEntry\" from OCDB");
220 fGRPObject = fGRPManager->GetGRPData();
222 AliError("cannot get \"GRPData\" from GRP manager");
225 fStartTime = fGRPObject->GetTimeStart();
226 fEndTime = fGRPObject->GetTimeEnd();
227 AliInfo(Form("got \"GRPData\": startTime=%d, endTime=%d", fStartTime, fEndTime));
229 AliInfo(Form("initialized for run %d", runNb));
235 //_______________________________________________________
237 Bool_t AliTOFAnalysisTaskCalibTree::InitEvent() {
244 fESDEvent = dynamic_cast<AliESDEvent *>(InputEvent());
245 if (!fESDEvent) return kFALSE;
247 // set event time and elapsed time
248 ftimestamp = fESDEvent->GetTimeStamp();
249 fElapsedTime = fESDEvent->GetTimeStamp() - fStartTime;
252 fIsCollisionCandidate = fEventCuts->IsCollisionCandidate(fESDEvent);
253 if (fEventSelectionFlag && !fIsCollisionCandidate) return kFALSE;
256 fVertex = fESDEvent->GetPrimaryVertexTracks();
257 if (fVertex->GetNContributors() < 1) {
258 fVertex = fESDEvent->GetPrimaryVertexSPD();
259 if (fVertex->GetNContributors() < 1) fHasVertex = kFALSE;
260 else fHasVertex = kTRUE;
262 else fHasVertex = kTRUE;
263 if (fVertexSelectionFlag && (!fHasVertex || TMath::Abs(fVertex->GetZ()) > fVertexCut)) return kFALSE;
265 // discard pile-up event is requested
266 if (fDiscardPileupEventFlag) {
267 if (fESDEvent->IsPileupFromSPD()) {
268 printf("PILE-UP event, will be discarded\n");
274 fESDpid->GetTOFResponse().SetTimeResolution(fTimeResolution);
277 fTOFT0maker->SetTimeResolution(fTimeResolution);
279 // calibrate ESD if requested
280 if (fCalibrateTOFsignal)
281 fTOFcalib->CalibrateESD(fESDEvent);
283 // compute T0-TOF and apply it if requested
285 fTOFT0maker->ComputeT0TOF(fESDEvent);
287 fTOFT0maker->ApplyT0TOF(fESDEvent);
288 //fESDpid->MakePID(fESDEvent, kFALSE, 0.);
292 fTOFT0v1->Init(fESDEvent);
298 //_______________________________________________________
300 Bool_t AliTOFAnalysisTaskCalibTree::HasTOFMeasurement(AliESDtrack *track) {
303 // has TOF measurement
306 //check TOF status flags
307 if (!(track->GetStatus() & AliESDtrack::kTOFout) ||
308 !(track->GetStatus() & AliESDtrack::kTIME)) return kFALSE;
310 // check integrated length
311 if (track->GetIntegratedLength() < 350.) return kFALSE;
313 // TOF measurement ok
317 //_______________________________________________________
319 Bool_t AliTOFAnalysisTaskCalibTree::HasPrimaryDCA(AliESDtrack *track) {
325 // cut on transverse impact parameter
326 Float_t d0z0[2],covd0z0[3];
327 track->GetImpactParameters(d0z0, covd0z0);
328 Float_t sigma= 0.0050 + 0.0060 / TMath::Power(track->Pt(), 0.9);
329 Float_t d0max = 7. * sigma;
331 Float_t sigmaZ = 0.0146 + 0.0070 / TMath::Power(track->Pt(), 1.114758);
332 if (track->Pt() > 1.) sigmaZ = 0.0216;
333 Float_t d0maxZ = 5. * sigmaZ;
335 if(TMath::Abs(d0z0[0]) > d0max || TMath::Abs(d0z0[1]) > d0maxZ)