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)),
63 for (Int_t i = 0; i < MAXHITS; i++){
64 fmomentum[i] = 999999;
72 DefineOutput(1, TTree::Class());
76 //_______________________________________________________
78 AliTOFAnalysisTaskCalibTree::~AliTOFAnalysisTaskCalibTree()
96 //_______________________________________________________
99 AliTOFAnalysisTaskCalibTree::UserCreateOutputObjects()
102 * user create output objects
105 fOutputTree = new TTree("aodTree", "Tree with TOF calib output");
107 /* setup output tree */
108 fOutputTree->Branch("run", &fRunNumber, "run/I");
109 fOutputTree->Branch("timestamp", &ftimestamp, "timestamp/i");
110 fOutputTree->Branch("timezero", &ftimezero, "timezero/F");
111 fOutputTree->Branch("vertex", &fVertexZ, "vertex/F");
112 fOutputTree->Branch("nhits", &fnhits, "nhits/I");
113 fOutputTree->Branch("momentum", &fmomentum, "momentum[nhits]/F");
114 fOutputTree->Branch("length", &flength, "length[nhits]/F");
115 fOutputTree->Branch("index", &findex, "index[nhits]/I");
116 fOutputTree->Branch("time", &ftime, "time[nhits]/F");
117 fOutputTree->Branch("tot", &ftot, "tot[nhits]/F");
118 fOutputTree->Branch("texp", &ftexp, "texp[nhits]/F");
120 PostData(1, fOutputTree);
124 //_______________________________________________________
126 void AliTOFAnalysisTaskCalibTree::UserExec(Option_t *) {
132 ((AliAODHandler*)(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()))->SetFillAOD(kFALSE);
135 if (!InitRun()) return;
138 if (!InitEvent()) return;
140 /*** ACCEPTED EVENT ***/
143 fVertexZ = fVertex->GetZ();
145 // compute T0-TOF using all availeble tracks
146 fTOFT0v1->DefineT0("all", 0.0, 0.5);
147 Float_t timeZeroTOF = -1000. * fTOFT0v1->GetResult(0);
148 Float_t timeZeroTOF_sigma = 1000. * fTOFT0v1->GetResult(1);
149 //Int_t timeZeroTOF_tracks = fTOFT0v1->GetResult(3); // not used for the time being
151 // check T0-TOF sigma
152 if (timeZeroTOF_sigma >= 250.) ftimezero = 999999.;
153 else ftimezero = timeZeroTOF;
158 // loop over ESD tracks
159 Int_t nTracks = fESDEvent->GetNumberOfTracks();
162 Double_t momentum, length, time, tot, timei[AliPID::kSPECIES];
163 for (Int_t itrk = 0; itrk < nTracks; itrk++) {
165 track = fESDEvent->GetTrack(itrk);
166 if (!track) continue;
167 // check accept track
168 if (!fTrackCuts->AcceptTrack(track)) continue;
170 if (fPrimaryDCASelectionFlag && !HasPrimaryDCA(track)) continue;
171 // check TOF measurement
172 if (!HasTOFMeasurement(track)) continue;
174 /*** ACCEPTED TRACK WITH TOF MEASUREMENT ***/
177 momentum = track->P();
178 length = track->GetIntegratedLength();
179 index = track->GetTOFCalChannel();
180 time = track->GetTOFsignal();
181 tot = track->GetTOFsignalToT();
182 track->GetIntegratedTimes(timei);
184 // add hit to array (if there is room)
185 if (fnhits > MAXHITS) continue;
186 fmomentum[fnhits] = momentum;
187 flength[fnhits] = length;
188 findex[fnhits] = index;
189 ftime[fnhits] = time;
191 ftexp[fnhits] = timei[AliPID::kPion];
194 } /* end of loop over ESD tracks */
196 // check number of hits and set fill output tree
200 PostData(1, fOutputTree);
204 //_______________________________________________________
206 Bool_t AliTOFAnalysisTaskCalibTree::InitRun() {
213 fESDEvent = dynamic_cast<AliESDEvent *>(InputEvent());
215 AliError("cannot get ESD event");
220 Int_t runNb = fESDEvent->GetRunNumber();
222 // check run already initialized
223 if (fInitFlag && fRunNumber == runNb) return kTRUE;
227 AliCDBManager *cdb = AliCDBManager::Instance();
228 cdb->SetDefaultStorage("raw://");
229 if (!fSpecificStorageParOffline.IsNull())
230 cdb->SetSpecificStorage("TOF/Calib/ParOffline", fSpecificStorageParOffline.Data());
231 if (!fSpecificStorageRunParams.IsNull())
232 cdb->SetSpecificStorage("TOF/Calib/RunParams", fSpecificStorageRunParams.Data());
236 if (!fTOFcalib->Init()) {
237 AliError("cannot init TOF calib");
242 if (!fGRPManager->ReadGRPEntry()) {
243 AliError("error while reading \"GRPEntry\" from OCDB");
246 fGRPObject = fGRPManager->GetGRPData();
248 AliError("cannot get \"GRPData\" from GRP manager");
251 fStartTime = fGRPObject->GetTimeStart();
252 fEndTime = fGRPObject->GetTimeEnd();
253 AliInfo(Form("got \"GRPData\": startTime=%d, endTime=%d", fStartTime, fEndTime));
255 AliInfo(Form("initialized for run %d", runNb));
261 //_______________________________________________________
263 Bool_t AliTOFAnalysisTaskCalibTree::InitEvent() {
270 fESDEvent = dynamic_cast<AliESDEvent *>(InputEvent());
271 if (!fESDEvent) return kFALSE;
273 // set event time and elapsed time
274 ftimestamp = fESDEvent->GetTimeStamp();
275 fElapsedTime = fESDEvent->GetTimeStamp() - fStartTime;
278 if (fEventSelectionFlag){
279 fIsCollisionCandidate = fEventCuts->IsCollisionCandidate(fESDEvent);
280 if (!fIsCollisionCandidate) return kFALSE;
284 fVertex = fESDEvent->GetPrimaryVertexTracks();
285 if (fVertex->GetNContributors() < 1) {
286 fVertex = fESDEvent->GetPrimaryVertexSPD();
287 if (fVertex->GetNContributors() < 1) fHasVertex = kFALSE;
288 else fHasVertex = kTRUE;
290 else fHasVertex = kTRUE;
291 if (fVertexSelectionFlag && (!fHasVertex || TMath::Abs(fVertex->GetZ()) > fVertexCut)) return kFALSE;
293 // discard pile-up event is requested
294 if (fDiscardPileupEventFlag) {
295 if (fESDEvent->IsPileupFromSPD()) {
296 printf("PILE-UP event, will be discarded\n");
302 fESDpid->GetTOFResponse().SetTimeResolution(fTimeResolution);
305 fTOFT0maker->SetTimeResolution(fTimeResolution);
307 // calibrate ESD if requested
308 if (fCalibrateTOFsignal)
309 fTOFcalib->CalibrateESD(fESDEvent);
311 // compute T0-TOF and apply it if requested
313 fTOFT0maker->ComputeT0TOF(fESDEvent);
315 fTOFT0maker->ApplyT0TOF(fESDEvent);
316 //fESDpid->MakePID(fESDEvent, kFALSE, 0.);
320 fTOFT0v1->Init(fESDEvent);
326 //_______________________________________________________
328 Bool_t AliTOFAnalysisTaskCalibTree::HasTOFMeasurement(AliESDtrack *track) {
331 // has TOF measurement
334 //check TOF status flags
335 if (!(track->GetStatus() & AliESDtrack::kTOFout) ||
336 !(track->GetStatus() & AliESDtrack::kTIME)) return kFALSE;
338 // check integrated length
339 if (track->GetIntegratedLength() < 350.) return kFALSE;
341 // TOF measurement ok
345 //_______________________________________________________
347 Bool_t AliTOFAnalysisTaskCalibTree::HasPrimaryDCA(AliESDtrack *track) {
353 // cut on transverse impact parameter
354 Float_t d0z0[2],covd0z0[3];
355 track->GetImpactParameters(d0z0, covd0z0);
356 Float_t sigma= 0.0050 + 0.0060 / TMath::Power(track->Pt(), 0.9);
357 Float_t d0max = 7. * sigma;
359 Float_t sigmaZ = 0.0146 + 0.0070 / TMath::Power(track->Pt(), 1.114758);
360 if (track->Pt() > 1.) sigmaZ = 0.0216;
361 Float_t d0maxZ = 5. * sigmaZ;
363 if(TMath::Abs(d0z0[0]) > d0max || TMath::Abs(d0z0[1]) > d0maxZ)