1 /* created by fbellini@cern.ch on 14/09/2010 */
2 /* last modified by fbellini on 21/10/2010 */
5 #ifndef ALIANALYSISTASKTOFQA_CXX
6 #define ALIANALYSISTASKTOFQA_CXX
13 #include "AliAnalysisTaskSE.h"
14 #include "AliAnalysisManager.h"
15 #include "AliESDEvent.h"
16 #include "AliESDInputHandler.h"
17 #include "AliAnalysisTaskTOFqa.h"
18 #include "AliAnalysisFilter.h"
19 #include "AliESDtrackCuts.h"
21 #include "AliTOFRawStream.h"
22 #include "AliTOFGeometry.h"
24 ClassImp(AliAnalysisTaskTOFqa)
26 //________________________________________________________________________
27 AliAnalysisTaskTOFqa::AliAnalysisTaskTOFqa() :
38 // Default constructor
40 //________________________________________________________________________
41 AliAnalysisTaskTOFqa::AliAnalysisTaskTOFqa(const char *name) :
42 AliAnalysisTaskSE(name),
54 // Define input and output slots here
55 Info("AliAnalysisTaskTOFqa","Calling Constructor");
57 // Input slot #0 works with a TChain
58 DefineInput(0, TChain::Class());
60 // Output slot #0 writes into a TH1 container
61 // Output slot #1 writes into a user defined container
62 DefineOutput(1, TList::Class());
63 DefineOutput(2, TList::Class());
66 //________________________________________________________________________
67 AliAnalysisTaskTOFqa::AliAnalysisTaskTOFqa(const AliAnalysisTaskTOFqa& copy)
68 : AliAnalysisTaskSE(),
69 fRunNumber(copy.fRunNumber),
71 fTrackFilter(copy.fTrackFilter),
72 fVertex(copy.fVertex),
73 fNTOFtracks(copy.fNTOFtracks),
74 fNPrimaryTracks(copy.fNPrimaryTracks),
77 fHlistExperts(copy.fHlistExperts)
82 //___________________________________________________________________________
83 AliAnalysisTaskTOFqa& AliAnalysisTaskTOFqa::operator=(const AliAnalysisTaskTOFqa& copy)
86 // Assignment operator
89 AliAnalysisTaskSE::operator=(copy) ;
90 fRunNumber=copy.fRunNumber;
92 fTrackFilter=copy.fTrackFilter;
94 fNTOFtracks=copy.fNTOFtracks;
95 fNPrimaryTracks=copy.fNPrimaryTracks;
98 fHlistExperts=copy.fHlistExperts;
103 //___________________________________________________________________________
104 AliAnalysisTaskTOFqa::~AliAnalysisTaskTOFqa() {
109 Info("~AliAnalysisTaskTOFqa","Calling Destructor");
110 if (fVertex) delete fVertex;
111 if (fTrackFilter) delete fTrackFilter;
117 delete fHlistExperts;
122 //________________________________________________________________________
123 void AliAnalysisTaskTOFqa::UserCreateOutputObjects()
125 //Defines output objects and histograms
126 Info("CreateOutputObjects","CreateOutputObjects (TList) of task %s", GetName());
128 if (!fHlist) fHlist = new TList();
129 fHlist->SetOwner(kTRUE);
130 if (!fHlistExperts) fHlistExperts = new TList();
131 fHlistExperts->SetOwner(kTRUE);
133 TH1I* hTOFmatchedESDperEvt = new TH1I("hTOFmatchedPerEvt", "Number of matched TOF tracks per event;Number of TOF matched ESD tracks;Counts", 100, 0, 100) ;
134 hTOFmatchedESDperEvt->SetLineWidth(2);
135 hTOFmatchedESDperEvt->SetLineColor(kBlue);
136 fHlist->AddLast(hTOFmatchedESDperEvt) ;
138 TH1F* hTOFmatchedESDtime = new TH1F("hTOFmatchedESDtime", "Matched ESDs tracks: TOF Time spectrum; t [ns];Counts", 250, 0., 610. ) ;
139 hTOFmatchedESDtime->SetLineWidth(2);
140 hTOFmatchedESDtime->SetLineColor(kBlue);
141 hTOFmatchedESDtime->SetFillColor(kBlue);
142 fHlist->AddLast(hTOFmatchedESDtime) ;
144 TH1F* hTOFmatchedESDrawTime = new TH1F("hTOFmatchedESDrawTime", "Matched ESDs tracks: TOF raw Time spectrum;t_{raw} [ns];Counts", 250, 0., 610.) ;
145 hTOFmatchedESDrawTime->SetLineWidth(2);
146 hTOFmatchedESDrawTime->SetLineColor(kGreen+2);
147 hTOFmatchedESDrawTime->SetFillColor(kGreen+2);
148 fHlist->AddLast(hTOFmatchedESDrawTime) ;
150 TH1F* hTOFmatchedESDToT = new TH1F("hTOFmatchedESDToT", "Matched ESDs tracks: TOF ToT spectrum; ToT [ns];Counts",100, 0., 48.8) ;
151 hTOFmatchedESDToT->SetLineWidth(2);
152 hTOFmatchedESDToT->SetLineColor(kBlue);
153 hTOFmatchedESDToT->SetFillColor(kBlue);
154 fHlist->AddLast(hTOFmatchedESDToT) ;
156 TH1F* hTOFmatchedESDP = new TH1F("hTOFmatchedESDP", "TPC-TOF matched tracks momentum distribution (GeV/c); P(GeV/c);tracks", 500,0.,5.) ;
157 hTOFmatchedESDP->SetLineWidth(1);
158 hTOFmatchedESDP->SetLineColor(kBlue);
159 hTOFmatchedESDP->SetMarkerStyle(21);
160 hTOFmatchedESDP->SetMarkerSize(0.6);
161 hTOFmatchedESDP->SetMarkerColor(kBlue);
162 fHlist->AddLast(hTOFmatchedESDP) ;
164 TH1F* hTOFmatchedESDPt = new TH1F("hTOFmatchedESDPt", "TPC-TOF matched tracks p_{T} distribution (GeV/c); p_{T}(GeV/c);tracks", 500,0.,5.) ;
165 hTOFmatchedESDPt->SetLineWidth(1);
166 hTOFmatchedESDPt->SetLineColor(kBlue);
167 hTOFmatchedESDPt->SetMarkerStyle(4);
168 hTOFmatchedESDPt->SetMarkerSize(0.6);
169 hTOFmatchedESDPt->SetMarkerColor(kBlue);
170 fHlist->AddLast(hTOFmatchedESDPt) ;
172 TH1F* hTOFmatchedESDtrkLength = new TH1F("hTOFmatchedESDtrkLength", "Matched ESDs tracks length; Track length [cm];Counts", 1600, -800., 800) ;
173 hTOFmatchedESDtrkLength->SetLineWidth(1);
174 hTOFmatchedESDtrkLength->SetLineColor(kBlue);
175 fHlist->AddLast(hTOFmatchedESDtrkLength) ;
177 TH2F* hTOFmatchedESDpVsBeta = new TH2F("hTOFmatchedESDpVsBeta", "Matched ESDs tracks p vs. beta; p(GeV/c); beta", 500, 0., 5.,500, 0., 5.) ;
178 fHlist->AddLast(hTOFmatchedESDpVsBeta);
181 TH1F* hESDprimaryTrackP = new TH1F("hESDprimaryTrackP", "All ESDs tracks Pt distribution (GeV/c); p_{T}(GeV/c);tracks", 500, 0., 5.0) ;
182 hESDprimaryTrackP->SetLineWidth(1);
183 hESDprimaryTrackP->SetMarkerStyle(8);
184 hESDprimaryTrackP->SetMarkerSize(0.6);
185 hESDprimaryTrackP->SetLineColor(kGray+1);
186 fHlist->AddLast(hESDprimaryTrackP);
188 TH1F* hESDprimaryTrackPt = new TH1F("hESDprimaryTrackPt", "ESDs primary tracks Pt distribution (GeV/c); p_{T}(GeV/c);tracks", 500, 0.0, 5.0) ;
189 hESDprimaryTrackPt->SetLineWidth(1);
190 hESDprimaryTrackPt->SetMarkerStyle(4);
191 hESDprimaryTrackPt->SetMarkerSize(0.6);
192 hESDprimaryTrackPt->SetLineColor(kBlack);
193 fHlist->AddLast(hESDprimaryTrackPt);
195 TH1F* hTOFmatchedESDeta = new TH1F("hTOFmatchedESDeta", "Matched ESDtracks eta; eta;Counts", 500, -2.5, 2.5) ;
196 fHlist->AddLast(hTOFmatchedESDeta) ;
198 TH1F* hTOFprimaryESDeta = new TH1F("hTOFprimaryESDeta", "Primary ESDtracks eta; eta;Counts", 500, -2.5, 2.5) ;
199 fHlist->AddLast(hTOFprimaryESDeta) ;
201 TH1F* hTOFmatchedESDphi = new TH1F("hTOFmatchedESDphi", "Matched ESDtracks Phi; Phi (rad);Counts", 65, 0., 6.5) ;
202 fHlist->AddLast(hTOFmatchedESDphi) ;
204 TH1F* hTOFprimaryESDphi = new TH1F("hTOFprimaryESDphi", "Primary ESDtracks Phi;Phi (rad);Counts", 65, 0., 6.5) ;
205 fHlist->AddLast(hTOFprimaryESDphi) ;
208 TH1F* hTOFESDsMatchingProb = new TH1F("hTOFESDsMatchingProb", "TPC-TOF track-matching probability per event(|eta|<0.9 && pt>0.5GeV/c);TPC-TOF track-matching probability (%) ;Counts",21, 0., 110.) ;
209 hTOFESDsMatchingProb->SetLineColor(kRed);
210 fHlistExperts->AddLast(hTOFESDsMatchingProb) ;
213 TH1F* hTOFmatchedESDdiffTime = new TH1F("hTOFmatchedESDdiffTime", "ESDs t_{TOF}-t_{pi,exp} spectrum in TOF (ps); t_{TOF}-t_{pi,exp} [ps];Counts", 4000, -50000., 50000.) ;
214 hTOFmatchedESDdiffTime->SetLineWidth(1);
215 hTOFmatchedESDdiffTime->SetLineColor(kBlack);
216 hTOFmatchedESDdiffTime->SetMarkerStyle(8);
217 hTOFmatchedESDdiffTime->SetMarkerSize(0.8);
218 hTOFmatchedESDdiffTime->SetMarkerColor(kAzure+7);
219 hTOFmatchedESDdiffTime->SetFillColor(kAzure-2);
220 fHlistExperts->AddLast(hTOFmatchedESDdiffTime) ;
223 TH2F* hTOFmatchedESDdiffTimeVsStrip = new TH2F("hTOFmatchedESDdiffTimeVsStrip", "ESDs t_{TOF}-t_{pi,exp} vs strip number; strip (Eta); t_{TOF}-t_{pi,exp} [ps]", 92,0.,92,400, -5000., 5000.) ;
224 fHlistExperts->AddLast(hTOFmatchedESDdiffTimeVsStrip) ;
227 TH2F* hTOFmatchedESDdxVsEta = new TH2F("hTOFmatchedESDdxVsEta", "Matched ESD tracks Dx vs eta; strip(eta); Dx (cm)", 92,0.,92., 200,-10.,10.) ;
228 fHlistExperts->AddLast(hTOFmatchedESDdxVsEta) ;
231 TH2F* hTOFmatchedESDdzVsEta = new TH2F("hTOFmatchedESDdzVsEta", "Matched ESDtracks Dz vs eta; strip(eta); Dz (cm)", 92,0.,92., 200,-10.,10.) ;
232 fHlistExperts->AddLast(hTOFmatchedESDdzVsEta) ;
235 TH1F* hTOFmatchedMass= new TH1F("hTOFmatchedMass","Matched ESD tracks mass distribution; M (GeV/c^{2}); entries", 500,0., 5. );
236 hTOFmatchedMass->SetLineWidth(2);
237 hTOFmatchedMass->SetLineColor(kBlue);
238 hTOFmatchedMass->SetLineColor(kBlue);
239 fHlistExperts->AddLast(hTOFmatchedMass);
242 TH1D* hEventT0DetAND = new TH1D("hEventT0DetAND", "Event T0 from T0 detector (A&C); t [ps];Counts", 4000, -50000., 50000. ) ;
243 hEventT0DetAND->SetLineWidth(2);
244 hEventT0DetAND->SetLineColor(kRed);
245 hEventT0DetAND->SetFillColor(kRed);
246 fHlistExperts->AddLast(hEventT0DetAND) ;
249 TH1D* hEventT0DetA = new TH1D("hEventT0DetA", "Event T0 from T0 detector (A side); t [ps];Counts", 4000, -50000., 50000. ) ;
250 hEventT0DetA->SetLineWidth(2);
251 hEventT0DetA->SetLineColor(kBlue);
252 hEventT0DetA->SetFillColor(kBlue);
253 fHlistExperts->AddLast(hEventT0DetA) ;
256 TH1D* hEventT0DetC = new TH1D("hEventT0DetC", "Event T0 from T0 detector (C side); t [ps];Counts", 4000, -50000., 50000. ) ;
257 hEventT0DetC->SetLineWidth(2);
258 hEventT0DetC->SetLineColor(kGreen);
259 hEventT0DetC->SetFillColor(kGreen);
260 fHlistExperts->AddLast(hEventT0DetC);
263 TH1F* hTOFmatchedExpTime = new TH1F("hTOFmatchedExpTime", "Matched ESDs tracks - pions expected time; t [ns];Counts", 4000, -50000., 50000. ) ;
264 hTOFmatchedExpTime->SetLineWidth(1);
265 hTOFmatchedExpTime->SetLineColor(kBlack);
266 hTOFmatchedExpTime->SetMarkerStyle(8);
267 hTOFmatchedExpTime->SetMarkerSize(0.8);
268 hTOFmatchedExpTime->SetMarkerColor(kRed);
269 fHlistExperts->AddLast(hTOFmatchedExpTime) ;
273 PostData(2, fHlistExperts);
275 //________________________________________________________________________
276 void AliAnalysisTaskTOFqa::UserExec(Option_t *)
278 /* Main - executed for each event.
279 It extracts event information and track information after selecting
280 primary tracks via standard cuts. */
281 const Double_t speedOfLight = TMath::C()*1E2*1E-12; // cm/ps
283 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
285 Printf("ERROR: Could not get ESDInputHandler");
288 fESD = (AliESDEvent*) esdH->GetEvent();
292 Printf("ERROR: fESD not available");
296 // loop over ESD tracks
300 //info from To detector
301 fT0= fESD->GetT0TOF(0);//ps
302 ((TH1D*)fHlistExperts->At(6))->Fill(fT0);//ps
303 ((TH1D*)fHlistExperts->At(7))->Fill((Double_t)fESD->GetT0TOF(1)); //ps
304 ((TH1D*)fHlistExperts->At(8))->Fill((Double_t)fESD->GetT0TOF(2));//ps
306 for (Int_t iTracks = 0; iTracks < fESD->GetNumberOfTracks(); iTracks++) {
307 AliESDtrack* track = fESD->GetTrack(iTracks);
309 Printf("ERROR: Could not receive track %d", iTracks);
313 //primary tracks selection: kTPCrefit and std cuts
314 if(!fTrackFilter->IsSelected(track)) continue;
316 Double_t tofTime=track->GetTOFsignal();//in ps
317 Double_t tofTimeRaw=track->GetTOFsignalRaw();//in ps
318 Double_t tofToT=track->GetTOFsignalToT(); //in ps
319 Double_t expTimes[5];
320 track->GetIntegratedTimes(expTimes);
321 Double_t length =track->GetIntegratedLength();
323 track->GetConstrainedPxPyPz(ptot);
324 Double_t pT = TMath::Sqrt(ptot[0]*ptot[0] + ptot[1]*ptot[1]);
325 Double_t P2 = pT*pT + ptot[2]*ptot[2];
326 Double_t eta=track->Eta();
327 Int_t channel=track->GetTOFCalChannel();
328 Int_t volId[5]; //(sector, plate,strip,padZ,padX)
329 AliTOFGeometry::GetVolumeIndices(channel,volId);
331 if (TMath::Abs(eta)<0.9) { //cut for acceptance
333 ((TH1F*)fHlist->At(8))->Fill(TMath::Sqrt(P2));
334 ((TH1F*)fHlist->At(9))->Fill(track->Pt()); //all esd tracks within acceptance
335 ((TH1F*)fHlist->At(11))->Fill(eta);
336 ((TH1F*)fHlist->At(13))->Fill(track->Phi());
337 if ((TMath::Abs(track->Eta())<0.9)&&(track->Pt()>0.5)) fNPrimaryTracks++;
339 //matched tracks selection: kTOFout and kTIME
340 if ((track->GetStatus() & AliESDtrack::kTOFout) &&
341 (track->GetStatus() & AliESDtrack::kTIME)) {
343 if ((TMath::Abs(track->Eta())<0.9)&&(track->Pt()>0.5)) fNTOFtracks++; //matched counter
345 ((TH1F*)fHlist->At(1))->Fill(tofTime*1E-3); //ns
346 ((TH1F*)fHlist->At(2))->Fill(tofTimeRaw*1E-3); //ns
347 ((TH1F*)fHlist->At(3))->Fill(tofToT);
349 ((TH1F*)fHlist->At(4))->Fill(TMath::Sqrt(P2));
350 ((TH1F*)fHlist->At(5))->Fill(track->Pt());
351 ((TH1F*)fHlist->At(6))->Fill(length);
352 ((TH1F*)fHlist->At(10))->Fill(eta);
353 ((TH1F*)fHlist->At(12))->Fill(track->Phi());
355 ((TH1F*)fHlistExperts->At(1))->Fill(tofTime-expTimes[2]);//ps
356 ((TH1F*)fHlistExperts->At(2))->Fill((Int_t)GetStripIndex(volId),tofTime-expTimes[2]); //ps
357 ((TH1F*)fHlistExperts->At(3))->Fill((Int_t)GetStripIndex(volId),track->GetTOFsignalDx());
358 ((TH1F*)fHlistExperts->At(4))->Fill((Int_t)GetStripIndex(volId),track->GetTOFsignalDz());
359 ((TH1F*)fHlistExperts->At(9))->Fill(expTimes[2]);//ps
361 //basic PID performance check
362 Double_t tof= tofTime; //average T0 fill subtracted, no info from T0detector
364 Double_t beta= length/(tof*speedOfLight);
365 //Double_t mass2=P2*((tof/length)*(tof/length)-(1/(speedOfLight*speedOfLight)));
366 ((TH1F*)fHlist->At(7))->Fill(TMath::Sqrt(P2),beta);
367 //if (mass2>=0)((TH1F*)fHlistExperts->At(5))->Fill(TMath::Sqrt(mass2));
371 }//end loop on tracks
372 ((TH1F*)fHlist->At(0))->Fill(fNTOFtracks) ;
373 //if (fNTOFtracks>fNPrimaryTracks) printf("Something strange!!!\n");
374 if(fNPrimaryTracks>0){
375 ((TH1F*)fHlistExperts->At(0))->Fill((fNTOFtracks/(Float_t)fNPrimaryTracks)*100) ;
380 PostData(2, fHlistExperts);
384 //________________________________________________________________________
385 void AliAnalysisTaskTOFqa::Terminate(Option_t *)
387 //check on output validity
388 fHlist = dynamic_cast<TList*> (GetOutputData(1));
389 if (!fHlist || !fHlistExperts) {
390 Printf("ERROR: lists not available");
396 //---------------------------------------------------------------
397 Int_t AliAnalysisTaskTOFqa::GetStripIndex(const Int_t * const in)
399 /* return tof strip index between 0 and 91 */
401 Int_t nStripA = AliTOFGeometry::NStripA();
402 Int_t nStripB = AliTOFGeometry::NStripB();
403 Int_t nStripC = AliTOFGeometry::NStripC();
405 Int_t iplate = in[1];
406 Int_t istrip = in[2];
408 Int_t stripOffset = 0;
414 stripOffset = nStripC;
417 stripOffset = nStripC+nStripB;
420 stripOffset = nStripC+nStripB+nStripA;
423 stripOffset = nStripC+nStripB+nStripA+nStripB;
430 if (stripOffset<0 || stripOffset>92) return -1;
432 return (stripOffset+istrip);