]>
Commit | Line | Data |
---|---|---|
1dfe075f | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | //_________________________________________________________________________ | |
1137ac22 | 16 | // An analysis task to check the TOF in simulated data |
1dfe075f | 17 | // |
18 | //*-- Silvia Arcelli | |
1137ac22 | 19 | //-Distributions of the matching performance |
20 | //-TOF Time info and (TOF - expected time) plots | |
21 | //-Summary Plots on TOF Pid | |
1dfe075f | 22 | ////////////////////////////////////////////////////////////////////////////// |
1dfe075f | 23 | #include <TChain.h> |
1dfe075f | 24 | #include <TFile.h> |
1137ac22 | 25 | #include <TObject.h> |
26 | #include <TCanvas.h> | |
27 | #include <TStyle.h> | |
28 | #include <TGaxis.h> | |
29 | #include <TLatex.h> | |
30 | #include <TPad.h> | |
2704006a | 31 | #include <TSpectrum.h> |
32 | #include <TF1.h> | |
4f3b72d4 | 33 | #include <TROOT.h> |
1dfe075f | 34 | |
35 | #include "AliTOFQATask.h" | |
36 | #include "AliESD.h" | |
1137ac22 | 37 | #include "AliESDtrack.h" |
1dfe075f | 38 | #include "AliLog.h" |
39 | ||
40 | //______________________________________________________________________________ | |
41 | AliTOFQATask::AliTOFQATask(const char *name) : | |
42 | AliAnalysisTask(name,""), | |
43 | fChain(0), | |
44 | fESD(0), | |
1137ac22 | 45 | fOutputContainer(0), |
46 | fhTOFMatch(0), | |
47 | fhESDeffPhi(0), | |
48 | fhESDeffTheta(0), | |
49 | fhESDeffMom(0), | |
50 | fhTOFeffPhi(0), | |
51 | fhTOFeffTheta(0), | |
52 | fhTOFeffMom(0), | |
53 | fhTOFeffPhiMT(0), | |
54 | fhTOFeffThetaMT(0), | |
55 | fhTOFeffMomMT(0), | |
56 | fhTOFsector(0), | |
57 | fhTOFsectorMT(0), | |
58 | fhTOFTime(0), | |
59 | fhTOFDeltaTime(0), | |
60 | fhTOFDeltaTimeMT(0), | |
61 | fhTOFIDSpecies(0), | |
62 | fhTOFMassVsMom(0), | |
2704006a | 63 | fhTOFMass(0), |
64 | fmatchFracMin(0.15), | |
65 | fmatchEffMin(0.28), | |
66 | ftimePeakMax(0.05), | |
67 | fmassPeakMax(0.05) | |
1dfe075f | 68 | { |
69 | // Constructor. | |
70 | // Input slot #0 works with an Ntuple | |
71 | DefineInput(0, TChain::Class()); | |
72 | // Output slot #0 writes into a TH1 container | |
73 | DefineOutput(0, TObjArray::Class()) ; | |
74 | } | |
75 | ||
1137ac22 | 76 | //______________________________________________________________________________ |
77 | AliTOFQATask::AliTOFQATask(const AliTOFQATask &qatask) : | |
78 | AliAnalysisTask("AliTOFQATask",""), | |
79 | fChain(0), | |
80 | fESD(0), | |
81 | fOutputContainer(0), | |
82 | fhTOFMatch(0), | |
83 | fhESDeffPhi(0), | |
84 | fhESDeffTheta(0), | |
85 | fhESDeffMom(0), | |
86 | fhTOFeffPhi(0), | |
87 | fhTOFeffTheta(0), | |
88 | fhTOFeffMom(0), | |
89 | fhTOFeffPhiMT(0), | |
90 | fhTOFeffThetaMT(0), | |
91 | fhTOFeffMomMT(0), | |
92 | fhTOFsector(0), | |
93 | fhTOFsectorMT(0), | |
94 | fhTOFTime(0), | |
95 | fhTOFDeltaTime(0), | |
96 | fhTOFDeltaTimeMT(0), | |
97 | fhTOFIDSpecies(0), | |
98 | fhTOFMassVsMom(0), | |
2704006a | 99 | fhTOFMass(0), |
100 | fmatchFracMin(0.15), | |
101 | fmatchEffMin(0.28), | |
102 | ftimePeakMax(0.05), | |
103 | fmassPeakMax(0.05) | |
1137ac22 | 104 | { |
105 | // Copy Constructor. | |
106 | fChain=qatask.fChain; | |
107 | fESD=qatask.fESD; | |
108 | fOutputContainer=qatask.fOutputContainer; | |
109 | fhTOFMatch=qatask.fhTOFMatch; | |
110 | fhESDeffPhi=qatask.fhESDeffPhi; | |
111 | fhESDeffTheta=qatask.fhESDeffTheta; | |
112 | fhESDeffMom=qatask.fhESDeffMom; | |
113 | fhTOFeffPhi=qatask.fhTOFeffPhi; | |
114 | fhTOFeffTheta=qatask.fhTOFeffTheta; | |
115 | fhTOFeffMom=qatask.fhTOFeffMom; | |
116 | fhTOFeffPhiMT=qatask.fhTOFeffPhiMT; | |
117 | fhTOFeffThetaMT=qatask.fhTOFeffThetaMT; | |
118 | fhTOFeffMomMT=qatask.fhTOFeffMomMT; | |
119 | fhTOFsector=qatask.fhTOFsector; | |
120 | fhTOFsectorMT=qatask.fhTOFsectorMT; | |
121 | fhTOFTime=qatask.fhTOFTime; | |
122 | fhTOFDeltaTime=qatask.fhTOFDeltaTime; | |
123 | fhTOFDeltaTimeMT=qatask.fhTOFDeltaTimeMT; | |
124 | fhTOFIDSpecies=qatask.fhTOFIDSpecies; | |
125 | fhTOFMassVsMom=qatask.fhTOFMassVsMom; | |
126 | fhTOFMass=qatask.fhTOFMass; | |
2704006a | 127 | fmatchFracMin=qatask.fmatchFracMin; |
128 | fmatchEffMin=qatask.fmatchEffMin; | |
129 | ftimePeakMax=qatask.ftimePeakMax; | |
130 | fmassPeakMax=qatask.fmassPeakMax; | |
1137ac22 | 131 | } |
132 | //______________________________________________________________________________ | |
133 | AliTOFQATask:: ~AliTOFQATask() | |
134 | { | |
135 | delete fOutputContainer; | |
136 | delete fhTOFMatch; | |
137 | delete fhESDeffPhi; | |
138 | delete fhESDeffTheta; | |
139 | delete fhESDeffMom; | |
140 | delete fhTOFeffPhi; | |
141 | delete fhTOFeffTheta; | |
142 | delete fhTOFeffMom; | |
143 | delete fhTOFeffPhiMT; | |
144 | delete fhTOFeffThetaMT; | |
145 | delete fhTOFeffMomMT; | |
146 | delete fhTOFsector; | |
147 | delete fhTOFsectorMT; | |
148 | delete fhTOFTime; | |
149 | delete fhTOFDeltaTime; | |
150 | delete fhTOFDeltaTimeMT; | |
151 | delete fhTOFIDSpecies; | |
152 | delete fhTOFMassVsMom; | |
153 | delete fhTOFMass; | |
154 | } | |
155 | //______________________________________________________________________________ | |
156 | AliTOFQATask& AliTOFQATask::operator=(const AliTOFQATask &qatask) | |
157 | { | |
158 | //assignment operator | |
159 | this->fChain=qatask.fChain; | |
160 | this->fESD=qatask.fESD; | |
161 | this->fOutputContainer=qatask.fOutputContainer; | |
162 | this->fhTOFMatch=qatask.fhTOFMatch; | |
163 | this->fhESDeffPhi=qatask.fhESDeffPhi; | |
164 | this->fhESDeffTheta=qatask.fhESDeffTheta; | |
165 | this->fhESDeffMom=qatask.fhESDeffMom; | |
166 | this->fhTOFeffPhi=qatask.fhTOFeffPhi; | |
167 | this->fhTOFeffTheta=qatask.fhTOFeffTheta; | |
168 | this->fhTOFeffMom=qatask.fhTOFeffMom; | |
169 | this->fhTOFeffPhiMT=qatask.fhTOFeffPhiMT; | |
170 | this->fhTOFeffThetaMT=qatask.fhTOFeffThetaMT; | |
171 | this->fhTOFeffMomMT=qatask.fhTOFeffMomMT; | |
172 | this->fhTOFsector=qatask.fhTOFsector; | |
173 | this->fhTOFsectorMT=qatask.fhTOFsectorMT; | |
174 | this->fhTOFTime=qatask.fhTOFTime; | |
175 | this->fhTOFDeltaTime=qatask.fhTOFDeltaTime; | |
176 | this->fhTOFDeltaTimeMT=qatask.fhTOFDeltaTimeMT; | |
177 | this->fhTOFIDSpecies=qatask.fhTOFIDSpecies; | |
178 | this->fhTOFMassVsMom=qatask.fhTOFMassVsMom; | |
179 | this->fhTOFMass=qatask.fhTOFMass; | |
2704006a | 180 | this->fmatchFracMin=qatask.fmatchFracMin; |
181 | this->fmatchEffMin=qatask.fmatchEffMin; | |
182 | this->ftimePeakMax=qatask.ftimePeakMax; | |
183 | this->fmassPeakMax=qatask.fmassPeakMax; | |
1137ac22 | 184 | return *this; |
185 | } | |
1dfe075f | 186 | //______________________________________________________________________________ |
c52c2132 | 187 | void AliTOFQATask::ConnectInputData(const Option_t*) |
1dfe075f | 188 | { |
189 | // Initialisation of branch container and histograms | |
190 | ||
191 | AliInfo(Form("*** Initialization of %s", GetName())) ; | |
192 | ||
193 | // Get input data | |
194 | fChain = dynamic_cast<TChain *>(GetInputData(0)) ; | |
195 | if (!fChain) { | |
196 | AliError(Form("Input 0 for %s not found\n", GetName())); | |
197 | return ; | |
198 | } | |
199 | ||
c52c2132 | 200 | // One should first check if the branch address was taken by some other task |
2704006a | 201 | char ** address = (char **)GetBranchAddress(0, "ESD") ; |
202 | if (address) | |
203 | fESD = (AliESD *)(*address) ; | |
204 | else { | |
205 | fESD = new AliESD() ; | |
206 | SetBranchAddress(0, "ESD", &fESD) ; | |
1dfe075f | 207 | } |
c52c2132 | 208 | } |
209 | ||
1dfe075f | 210 | //______________________________________________________________________________ |
211 | void AliTOFQATask::Exec(Option_t *) | |
212 | { | |
1137ac22 | 213 | |
214 | //******* The loop over events -------------------------------------------------- | |
215 | ||
216 | Int_t nselESD=0; | |
217 | Int_t nmatchTOF=0; | |
218 | Int_t npidok=0; | |
219 | Int_t pisel=0,kasel=0,prsel=0,elsel=0,musel=0; | |
220 | //Set equal a-priori weights (just charged hadrions) | |
2704006a | 221 | const Int_t nCalinSec=8736; |
1137ac22 | 222 | Double_t c[5]={0, 0, 1, 1, 1}; |
1dfe075f | 223 | // Processing of one event |
1137ac22 | 224 | Long64_t entry = fChain->GetReadEntry() ; |
1dfe075f | 225 | if (!fESD) { |
226 | AliError("fESD is not connected to the input!") ; | |
227 | return ; | |
228 | } | |
229 | ||
230 | if ( !((entry-1)%100) ) | |
231 | AliInfo(Form("%s ----> Processing event # %lld", (dynamic_cast<TChain *>(fChain))->GetFile()->GetName(), entry)) ; | |
232 | ||
233 | // ************************ TOF ************************************* | |
1137ac22 | 234 | |
235 | ||
1dfe075f | 236 | Int_t ntrk = fESD->GetNumberOfTracks() ; |
1137ac22 | 237 | |
1dfe075f | 238 | while ( ntrk-- ) { |
1137ac22 | 239 | |
1dfe075f | 240 | AliESDtrack * t = fESD->GetTrack(ntrk) ; |
1137ac22 | 241 | if ( (t->GetStatus() & AliESDtrack::kTIME)==0 )continue; |
242 | ||
243 | nselESD++; | |
244 | ||
245 | Double_t mom = t->GetP() ; | |
246 | Double_t phi = TMath::ATan2(t->GetX(),t->GetY()) ; | |
247 | Double_t theta = TMath::ACos(t->GetZ()/ | |
248 | TMath::Sqrt(t->GetX()*t->GetX()+t->GetY()*t->GetY()+t->GetZ()*t->GetZ())); | |
249 | phi*=180/TMath::Pi(); | |
250 | theta*=180/TMath::Pi(); | |
251 | ||
252 | fhESDeffPhi->Fill(phi); | |
253 | fhESDeffTheta->Fill(theta); | |
254 | fhESDeffMom->Fill(mom); | |
255 | ||
256 | ||
257 | if(t->GetTOFsignal()<0)continue; | |
258 | ||
259 | nmatchTOF++; | |
260 | ||
261 | Double_t time=t->GetTOFsignal();//TOF time in ps | |
262 | Int_t detid=t->GetTOFCalChannel();//which pad was hit | |
263 | Int_t sector = detid/nCalinSec; | |
264 | fhTOFTime->Fill(time*1.E-3); | |
265 | fhTOFeffPhi->Fill(phi); | |
266 | fhTOFeffTheta->Fill(theta); | |
267 | fhTOFeffMom->Fill(mom); | |
268 | fhTOFsector->Fill(sector); | |
269 | //Well matched | |
270 | ||
271 | Int_t label=TMath::Abs(t->GetLabel()); | |
272 | Int_t clab[3]; t->GetTOFLabel(clab); | |
273 | if(label==clab[0] || label==clab[1] || label==clab[2]) { | |
274 | fhTOFeffPhiMT->Fill(phi); | |
275 | fhTOFeffThetaMT->Fill(theta); | |
276 | fhTOFeffMomMT->Fill(mom); | |
277 | fhTOFsectorMT->Fill(sector); | |
278 | } | |
279 | ||
280 | //Look at TOF PID | |
281 | ||
282 | UInt_t status=AliESDtrack::kESDpid;status|=AliESDtrack::kTOFpid; | |
283 | if (!((t->GetStatus()&status) == status))continue; | |
284 | npidok++; | |
285 | Double_t times[10]; | |
286 | t->GetIntegratedTimes(times);//ps | |
287 | Double_t l =t->GetIntegratedLength()/100.; // (m) | |
288 | Double_t mass= -1.; | |
289 | Double_t invBetaGamma= (0.299*time*1.E-3/l)*(0.299*time*1.E-3/l) -1.; | |
290 | if(invBetaGamma<0){mass = -mom*TMath::Sqrt(-invBetaGamma);} | |
291 | else{mass = mom*TMath::Sqrt(invBetaGamma);} | |
292 | ||
293 | //The Mass/ vs Momentum Plot: | |
294 | fhTOFMassVsMom->Fill(mass,mom); | |
295 | fhTOFMass->Fill(mass); | |
1dfe075f | 296 | |
1137ac22 | 297 | //PID weights |
298 | Double_t r[10]; t->GetTOFpid(r); | |
299 | Double_t rcc=0.; | |
300 | Int_t i; | |
301 | for (i=0; i<AliPID::kSPECIES; i++) rcc+=(c[i]*r[i]); | |
302 | if (rcc==0.) continue; | |
303 | Double_t w[10]; | |
304 | for (i=0; i<AliPID::kSPECIES; i++) w[i]=c[i]*r[i]/rcc; | |
1dfe075f | 305 | |
1137ac22 | 306 | fhTOFDeltaTime->Fill((time-times[2])*1.E-3); |
307 | ||
308 | if(label==clab[0] || label==clab[1] || label==clab[2]) { | |
309 | fhTOFDeltaTimeMT->Fill((time-times[2])*1.E-3); | |
310 | } | |
311 | ||
312 | if (w[4]>w[0] && w[4]>w[1] && w[4]>w[2] && w[4]>w[3]){ | |
313 | prsel++; | |
314 | fhTOFIDSpecies->Fill(4); | |
315 | } | |
316 | if (w[3]>w[0] && w[3]>w[1] && w[3]>w[2] && w[3]>w[4]){ | |
317 | kasel++; | |
318 | fhTOFIDSpecies->Fill(3); | |
319 | } | |
320 | if (w[2]>w[0] && w[2]>w[1] && w[2]>w[3] && w[2]>w[4]){ | |
321 | pisel++; | |
322 | fhTOFIDSpecies->Fill(2); | |
323 | } | |
324 | if (w[1]>w[0] && w[1]>w[2] && w[1]>w[3] && w[1]>w[4]){ | |
325 | musel++; | |
326 | fhTOFIDSpecies->Fill(1); | |
327 | } | |
328 | if (w[0]>w[1] && w[0]>w[2] && w[0]>w[3] && w[0]>w[4]){ | |
329 | elsel++; | |
330 | fhTOFIDSpecies->Fill(0); | |
1dfe075f | 331 | } |
332 | } | |
1137ac22 | 333 | |
334 | Float_t fracM= -1; | |
335 | if(nselESD>10)fracM=((Float_t) nmatchTOF)/((Float_t) nselESD); | |
336 | fhTOFMatch->Fill(fracM); | |
337 | ||
338 | PostData(0, fOutputContainer); | |
1137ac22 | 339 | |
340 | } | |
341 | //______________________________________________________________________________ | |
2704006a | 342 | void AliTOFQATask::CreateOutputObjects() |
c52c2132 | 343 | { |
1137ac22 | 344 | // Construct histograms: |
345 | ||
346 | fhTOFMatch= | |
347 | new TH1F("hTOFMatch","Fraction of Matched TOF tracks",101,-0.005,1.005); | |
348 | fhESDeffPhi= | |
349 | new TH1F("hESDeffPhi","ESD tracks Phi(vtx)", 180, -180., 180.) ; | |
350 | fhESDeffTheta= | |
351 | new TH1F("hESDeffTheta","ESD tracks Theta (vtx)",90, 45., 135.) ; | |
352 | fhESDeffMom= | |
353 | new TH1F("hESDeffMom","ESD tracks Momentum (vtx)",40, 0., 6.) ; | |
354 | fhTOFeffPhi = | |
355 | new TH1F("hTOFeffPhi","TOF, Matched vs Phi(vtx)", 180,-180, 180.); | |
356 | fhTOFeffPhiMT= | |
357 | new TH1F("hTOFeffPhiMT","TOF, Well Matched vs Phi(vtx)",180,-180,180.); | |
358 | fhTOFeffTheta= | |
359 | new TH1F("hTOFeffTheta","TOF, Matched vs Theta(vtx)",90,45.,135.); | |
360 | fhTOFeffThetaMT= | |
361 | new TH1F("hTOFeffThetaMT","TOF, Well Matched vs Theta(vtx)",90,45.,135.); | |
362 | fhTOFeffMom = | |
363 | new TH1F("hTOFeffMom","TOF, Matched vs Momentum ", 40, 0.,6.); | |
364 | fhTOFeffMomMT = | |
365 | new TH1F("hTOFeffMomMT","TOF, Well Matched vs Momentum ", 40, 0.,6.); | |
366 | fhTOFsector = | |
367 | new TH1F("hTOFsector","TOF, Matched vs Sector ", 18,0.,18.); | |
368 | fhTOFsectorMT = | |
369 | new TH1F("hTOFsectorMT","TOF, Well Matched vs Sector", 18, 0.,18.); | |
370 | ||
371 | fhESDeffMom->Sumw2(); fhTOFeffMom->Sumw2(); fhTOFeffMomMT->Sumw2(); | |
372 | fhESDeffTheta->Sumw2(); fhTOFeffTheta->Sumw2(); fhTOFeffThetaMT->Sumw2(); | |
373 | fhESDeffPhi->Sumw2(); fhTOFeffPhi->Sumw2(); fhTOFeffPhiMT->Sumw2(); | |
374 | fhTOFsector->Sumw2(); fhTOFsectorMT->Sumw2(); | |
375 | ||
376 | fhTOFTime = | |
377 | new TH1F("hTOFTime","TOF, t(TOF)in ns ",1000,0,100.); | |
378 | fhTOFDeltaTime = | |
379 | new TH1F("hTOFDeltaTime","TOF,t(TOF)-t(exp,pion), ns ",1000,-4.4,20.); | |
380 | fhTOFDeltaTimeMT = | |
381 | new TH1F("hTOFDeltaTimeMT","TOF, t(TOF)-t(exp,pion) for Well Matched, ns ",1000,-4.4,20.); | |
382 | fhTOFIDSpecies = | |
383 | new TH1F("hTOFIDSpecies","TOF, ID Sample Composition ",5,-0.5,4.5); | |
384 | fhTOFMassVsMom = | |
385 | new TH2F("hTOFMassVsMom","TOF, Mass Vs Momentum ",280,-0.2,1.2,600,0.,6.); | |
386 | fhTOFMass = | |
387 | new TH1F("hTOFMass","TOF, reconstructed mass ",280,-0.2,1.2); | |
388 | ||
389 | ||
390 | // create the output container | |
391 | ||
392 | fOutputContainer = new TObjArray(18) ; | |
393 | fOutputContainer->SetName(GetName()) ; | |
394 | ||
395 | fOutputContainer->AddAt(fhTOFMatch, 0) ; | |
396 | fOutputContainer->AddAt(fhESDeffPhi, 1) ; | |
397 | fOutputContainer->AddAt(fhESDeffTheta, 2) ; | |
398 | fOutputContainer->AddAt(fhESDeffMom, 3) ; | |
399 | fOutputContainer->AddAt(fhTOFeffPhi, 4) ; | |
400 | fOutputContainer->AddAt(fhTOFeffPhiMT, 5) ; | |
401 | fOutputContainer->AddAt(fhTOFeffTheta, 6) ; | |
402 | fOutputContainer->AddAt(fhTOFeffThetaMT, 7) ; | |
403 | fOutputContainer->AddAt(fhTOFeffMom, 8) ; | |
404 | fOutputContainer->AddAt(fhTOFeffMomMT, 9) ; | |
405 | fOutputContainer->AddAt(fhTOFsector, 10) ; | |
406 | fOutputContainer->AddAt(fhTOFsectorMT, 11) ; | |
407 | fOutputContainer->AddAt(fhTOFTime, 12) ; | |
408 | fOutputContainer->AddAt(fhTOFDeltaTime , 13) ; | |
409 | fOutputContainer->AddAt(fhTOFDeltaTimeMT, 14) ; | |
410 | fOutputContainer->AddAt(fhTOFIDSpecies, 15) ; | |
411 | fOutputContainer->AddAt(fhTOFMassVsMom, 16) ; | |
412 | fOutputContainer->AddAt(fhTOFMass, 17) ; | |
413 | ||
414 | } | |
415 | //______________________________________________________________________________ | |
416 | void AliTOFQATask::GetEfficiency() | |
417 | { | |
418 | // calculates the efficiency | |
419 | ||
420 | ||
421 | fhTOFeffPhiMT->Divide(fhTOFeffPhiMT,fhTOFeffPhi,1,1,"B"); | |
422 | fhTOFeffThetaMT->Divide(fhTOFeffThetaMT,fhTOFeffTheta,1,1,"B"); | |
423 | fhTOFeffMomMT->Divide(fhTOFeffMomMT,fhTOFeffMom,1,1,"B"); | |
424 | ||
425 | fhTOFeffPhi->Divide(fhTOFeffPhi,fhESDeffPhi,1,1,"B"); | |
426 | fhTOFeffTheta->Divide(fhTOFeffTheta,fhESDeffTheta,1,1,"B"); | |
427 | fhTOFeffMom->Divide(fhTOFeffMom,fhESDeffMom,1,1,"B"); | |
428 | ||
429 | } | |
430 | ||
431 | //______________________________________________________________________________ | |
2704006a | 432 | Bool_t AliTOFQATask::DrawHistos() |
1137ac22 | 433 | { |
1137ac22 | 434 | |
2704006a | 435 | |
436 | Int_t TOFsectors[18]={0,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1};//TOF sectors which are supposed to be present | |
437 | const char* part[3]={"pions","kaons","protons"};// pi,ka,pr | |
438 | const Float_t masses[3]={0.1396,0.494,0.938};// particle masses pi,ka,pr | |
439 | // Makes a few plots | |
1137ac22 | 440 | |
441 | gROOT->SetStyle("Plain"); | |
442 | gStyle->SetPalette(1); | |
2704006a | 443 | gStyle->SetOptStat(111110); |
1137ac22 | 444 | gStyle->SetPalette(1); |
445 | gStyle->SetCanvasColor(0); | |
446 | gStyle->SetFrameFillColor(0); | |
447 | // | |
448 | TGaxis::SetMaxDigits(3); | |
449 | gStyle->SetLabelFont(52, "XYZ"); | |
450 | gStyle->SetTitleFont(62, "XYZ"); | |
451 | gStyle->SetPadRightMargin(0.02); | |
452 | ||
453 | ||
454 | TCanvas * cTOFeff = new TCanvas("cTOFeff", "TOF ESD General", 400, 30, 550, 630) ; | |
455 | ||
456 | cTOFeff->Divide(1,2) ; | |
457 | cTOFeff->cd(1); | |
458 | fhTOFMatch->GetXaxis()->SetTitle("Fraction of matched ESD tracks/event"); | |
459 | fhTOFMatch->GetYaxis()->SetTitle("Events"); | |
460 | fhTOFMatch->SetFillColor(4); | |
461 | fhTOFMatch->Draw(); | |
462 | cTOFeff->cd(2); | |
463 | TPad *b = (TPad*)gPad; | |
464 | b->Divide(2,1); | |
465 | b->cd(1) ; | |
466 | fhTOFsector->GetXaxis()->SetTitle("Sector index of matched TOF Cluster"); | |
467 | fhTOFsector->GetYaxis()->SetTitle("Entries"); | |
468 | fhTOFsector->SetFillColor(4); | |
469 | fhTOFsector->SetMinimum(0.); | |
470 | fhTOFsector->GetYaxis()->SetNdivisions(205); | |
471 | fhTOFsector->GetYaxis()->SetTitleOffset(1.2); | |
472 | fhTOFsector->Draw("histo"); | |
473 | b->cd(2) ; | |
474 | fhTOFeffMom->SetMaximum(1.2); | |
475 | fhTOFeffMom->GetXaxis()->SetTitle("Track momentum (GeV/c)"); | |
476 | fhTOFeffMom->GetYaxis()->SetNdivisions(205); | |
477 | fhTOFeffMom->GetYaxis()->SetTitleOffset(1.2); | |
478 | fhTOFeffMom->GetYaxis()->SetTitle("Fraction of matched ESD tracks"); | |
479 | fhTOFeffMom->SetFillColor(4); | |
480 | fhTOFeffMom->Draw(); | |
2704006a | 481 | fhTOFeffMom->Fit("pol0","Q","",0.5,3.); |
482 | TF1 *fitMom = fhTOFeffMom->GetFunction("pol0"); | |
1137ac22 | 483 | fhTOFeffMom->Draw("histo,same"); |
484 | ||
1137ac22 | 485 | cTOFeff->Print("TOF_eff.eps"); |
486 | ||
487 | ||
488 | ||
489 | TCanvas * cTOFtime = new TCanvas("cTOFtime", "TOF measured Times ", 400, 30, 550, 630) ; | |
490 | cTOFtime->Divide(1,2) ; | |
491 | cTOFtime->cd(1); | |
2704006a | 492 | if ( fhTOFTime->GetMaximum() > 0 ) |
84eb42a1 | 493 | cTOFtime->GetPad(1)->SetLogy(1); |
1137ac22 | 494 | fhTOFTime->GetXaxis()->SetTitle("TOF time (ns)"); |
495 | fhTOFTime->GetYaxis()->SetTitle("Entries"); | |
496 | fhTOFTime->SetFillColor(4); | |
497 | fhTOFTime->Draw(); | |
498 | cTOFtime->cd(2); | |
2704006a | 499 | if ( fhTOFDeltaTime->GetMaximum() > 0 ) |
84eb42a1 | 500 | cTOFtime->GetPad(2)->SetLogy(1); |
1137ac22 | 501 | fhTOFDeltaTime->GetXaxis()->SetTitle("t^{TOF}-t^{exp}_{#pi} (ns)"); |
502 | fhTOFDeltaTime->GetYaxis()->SetTitle("Entries"); | |
503 | fhTOFDeltaTime->SetFillColor(4); | |
2704006a | 504 | Int_t ntimepeak=1; |
505 | TSpectrum *timeDiff = new TSpectrum(2*ntimepeak); | |
506 | Int_t ntime = timeDiff->Search(fhTOFDeltaTime,ntimepeak," ",0.1); | |
1137ac22 | 507 | fhTOFDeltaTime->Draw(); |
508 | ||
1137ac22 | 509 | cTOFtime->Print("TOF_time.eps"); |
510 | ||
511 | ||
512 | TCanvas * cTOFpid = new TCanvas("cTOFpid", "TOF PID ", 400, 30, 550, 630) ; | |
513 | cTOFpid->Divide(1,3) ; | |
514 | cTOFpid->cd(1); | |
2704006a | 515 | if ( fhTOFMass->GetMaximum() > 0 ) |
84eb42a1 | 516 | cTOFpid->SetLogy(1); |
1137ac22 | 517 | fhTOFMass->GetXaxis()->SetTitle("Reconstructed Mass (GeV/c^{2})"); |
518 | fhTOFMass->GetYaxis()->SetTitle("Entries"); | |
519 | fhTOFMass->SetFillColor(4); | |
2704006a | 520 | Int_t npmass=1; |
521 | if(fhTOFMass->GetEntries()>1000)npmass=3; | |
522 | TSpectrum *mass = new TSpectrum(2*npmass); | |
523 | Int_t nmass = mass->Search(fhTOFMass,npmass," ",0.02); | |
1137ac22 | 524 | fhTOFMass->Draw(); |
2704006a | 525 | if ( fhTOFMassVsMom->GetMaximum() > 0 ) |
84eb42a1 | 526 | cTOFpid->SetLogy(0); |
1137ac22 | 527 | cTOFpid->cd(2); |
528 | fhTOFMassVsMom->GetYaxis()->SetRange(0,400); | |
529 | fhTOFMassVsMom->GetXaxis()->SetTitle("Reconstructed Mass (GeV/c^{2})"); | |
530 | fhTOFMassVsMom->GetYaxis()->SetTitle("Track Momentum (GeV/c)"); | |
531 | fhTOFMassVsMom->GetXaxis()->SetTitleSize(0.05); | |
532 | fhTOFMassVsMom->GetYaxis()->SetTitleSize(0.05); | |
533 | fhTOFMassVsMom->SetMarkerStyle(20); | |
534 | fhTOFMassVsMom->SetMarkerSize(0.05); | |
535 | fhTOFMassVsMom->SetMarkerColor(2); | |
536 | fhTOFMassVsMom->Draw(); | |
537 | cTOFpid->cd(3); | |
538 | ||
539 | TLatex * tex = new TLatex(1., 1.25, "Bayesian PID: a-priori concentrations: [0,0,1,1,1]"); | |
540 | tex->SetTextColor(1); | |
541 | tex->SetTextSize(0.045); | |
542 | tex->SetLineWidth(2); | |
543 | ||
544 | Float_t norm=1./fhTOFIDSpecies->GetEntries(); | |
545 | fhTOFIDSpecies->Scale(norm); | |
546 | fhTOFIDSpecies->SetMaximum(1.2); | |
547 | fhTOFIDSpecies->GetXaxis()->SetTitle("Particle Type"); | |
548 | fhTOFIDSpecies->GetYaxis()->SetTitle("ID Fractions"); | |
549 | fhTOFIDSpecies->GetXaxis()->SetTitleSize(0.05); | |
550 | fhTOFIDSpecies->GetYaxis()->SetTitleSize(0.05); | |
551 | fhTOFIDSpecies->SetFillColor(4); | |
552 | fhTOFIDSpecies->Draw(); | |
553 | tex->Draw(); | |
1dfe075f | 554 | |
1137ac22 | 555 | char ch[10]; |
556 | ||
557 | Float_t pifrac=fhTOFIDSpecies->GetBinContent(3); | |
558 | Float_t kafrac=fhTOFIDSpecies->GetBinContent(4); | |
559 | Float_t prfrac=fhTOFIDSpecies->GetBinContent(5); | |
560 | ||
2704006a | 561 | sprintf(ch,"[2]:pion fraction = %5.3f",pifrac); |
1137ac22 | 562 | TLatex * texpi = new TLatex(-0.3, 0.9, ch); |
563 | texpi->SetTextColor(1); | |
564 | texpi->SetTextSize(0.05); | |
565 | texpi->SetLineWidth(2); | |
566 | texpi->Draw(); | |
2704006a | 567 | sprintf(ch,"[3]:kaon fraction = %5.3f",kafrac); |
1137ac22 | 568 | TLatex * texka = new TLatex(-0.3, 0.8, ch); |
569 | texka->SetTextColor(1); | |
570 | texka->SetTextSize(0.05); | |
571 | texka->SetLineWidth(2); | |
572 | texka->Draw(); | |
2704006a | 573 | sprintf(ch,"[4]:proton fraction = %5.3f",prfrac); |
1137ac22 | 574 | TLatex * texpr = new TLatex(-0.3, 0.7, ch); |
575 | texpr->SetTextColor(1); | |
576 | texpr->SetTextSize(0.05); | |
577 | texpr->SetLineWidth(2); | |
578 | texpr->Draw(); | |
1dfe075f | 579 | |
1137ac22 | 580 | |
1137ac22 | 581 | cTOFpid->Print("TOF_pid.eps"); |
582 | ||
2704006a | 583 | char line[1024] ; |
584 | sprintf(line, ".!tar -zcf %s.tar.gz *.eps", GetName()) ; | |
585 | gROOT->ProcessLine(line); | |
586 | sprintf(line, ".!rm -fR *.eps"); | |
587 | gROOT->ProcessLine(line); | |
588 | AliInfo(Form("*** TOF QA plots saved in %s.tar.gz...", GetName())) ; | |
589 | ||
590 | Bool_t problem=kFALSE; | |
591 | //------------------------------Matching Efficiency | |
592 | ||
593 | //Overall Fraction: | |
594 | Float_t matchFrac= fhTOFMatch->GetMean(); | |
595 | if(matchFrac<fmatchFracMin){ | |
596 | AliWarning(Form("*** Overall Fraction of matched tracks too low! Fraction = %f", matchFrac)) ; | |
597 | problem=kTRUE; | |
598 | }else{ | |
599 | AliInfo(Form("*** Fraction of matched tracks = %f", matchFrac)) ; | |
600 | } | |
601 | ||
602 | if(fhTOFeffMom->GetEntries()<1.){ | |
603 | AliWarning(Form("*** No tracks matching with TOF! Fraction is = %f", matchFrac)) ; | |
604 | problem=kTRUE; | |
605 | } | |
606 | ||
1dfe075f | 607 | |
2704006a | 608 | //The efficiency as a function of momentum: |
609 | Float_t eff= fitMom->GetParameter(0); | |
610 | Float_t deff= fitMom->GetParError(0); | |
611 | if(eff+3*deff<fmatchEffMin){ | |
612 | AliWarning(Form("*** Fraction of matched tracks vs Momentum is too low! Fraction= %f", eff)) ; | |
613 | problem=kTRUE; | |
614 | }else{ | |
615 | AliInfo(Form("*** Fraction of matched tracks for p>0.5 GeV is = %f", eff)) ; | |
616 | } | |
617 | ||
618 | //Matched tracks vs TOF Sector: | |
619 | for(Int_t isec=1;isec<=18;isec++){ | |
620 | if(fhTOFsector->GetBinContent(isec)<1 && TOFsectors[isec-1]>0){ | |
621 | AliWarning(Form("*** Missing Entries in sector %i", isec)); | |
622 | problem=kTRUE; | |
623 | } | |
624 | if(fhTOFsector->GetBinContent(isec)>0 && TOFsectors[isec-1]==0){ | |
625 | AliWarning(Form("*** Unexpected Entries in sector %i", isec)); | |
626 | problem=kTRUE; | |
627 | } | |
628 | } | |
629 | ||
630 | //-----------------------------Pid Quality | |
631 | ||
632 | // Look at the time - expected time: | |
633 | if(ntime==0)AliWarning("*** No peak was found in time difference spectrum!"); | |
634 | Float_t *timePos = timeDiff->GetPositionX(); | |
635 | if(TMath::Abs(timePos[0])>ftimePeakMax){ | |
636 | AliWarning(Form("*** Main Peak position in tTOF-TEXP spectrum is sitting far from where expected! Tpeak = %f ps",timePos[0]*1.E3)); | |
637 | problem=kTRUE; | |
638 | }else{ | |
639 | AliInfo(Form("*** Main Peak position in tTOF-TEXP found at = %f ps",timePos[0]*1.E3)); | |
640 | } | |
641 | // Look at the Mass Spectrum: | |
642 | if(nmass==0)AliWarning("*** No peak was found in Mass difference spectrum!"); | |
643 | Float_t *massPos = mass->GetPositionX(); | |
644 | for(Int_t imass=0;imass<nmass;imass++){ | |
645 | AliInfo(Form("*** the Mass peak for %s found at = %f GeV/c^2",part[imass],massPos[imass])); | |
646 | if(TMath::Abs( massPos[imass]-masses[imass])> fmassPeakMax){ | |
647 | AliWarning(Form("*** the Mass peak position for %s is not in the right place, found at = %f GeV/c^2",part[imass],massPos[imass])); | |
648 | problem=kTRUE; | |
649 | } | |
650 | } | |
1137ac22 | 651 | |
2704006a | 652 | // Look at the ID Species: |
653 | ||
654 | if(fhTOFIDSpecies->GetEntries()>1000){ | |
655 | if(pifrac<0.8 || (kafrac<0.01 || kafrac>0.2) || (prfrac<0.01 || prfrac>0.2)){ | |
656 | AliWarning(Form("*** Unexpected Id fractions: pions = %f, kaons = %f, protons %f", pifrac,kafrac,prfrac)); | |
657 | problem=kTRUE; | |
658 | } | |
659 | } | |
660 | ||
661 | delete mass; | |
662 | delete timeDiff; | |
663 | return problem ; | |
1dfe075f | 664 | } |
665 | ||
666 | //______________________________________________________________________________ | |
667 | void AliTOFQATask::Terminate(Option_t *) | |
668 | { | |
2704006a | 669 | // Processing when the event loop is ended, some plots+checks |
1dfe075f | 670 | |
2704006a | 671 | AliInfo(Form("*** %s Report:", GetName())) ; |
1137ac22 | 672 | GetEfficiency(); |
2704006a | 673 | Bool_t problem = DrawHistos() ; |
84eb42a1 | 674 | |
2704006a | 675 | char * report ; |
676 | if(problem) | |
677 | report="Problems found, please check!!!"; | |
678 | else | |
679 | report="OK"; | |
680 | ||
681 | AliInfo(Form("*** %s Summary Report: %s\n",GetName(), report)) ; | |
84eb42a1 | 682 | |
1dfe075f | 683 | } |