]>
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 | **************************************************************************/ | |
0b28fd57 | 15 | |
16 | /* $Id$ */ | |
17 | ||
57139bf5 | 18 | /// An analysis task to check the MUON data in simulated data |
19 | /// This class checks out the ESD tree, providing the matching with | |
20 | /// the trigger,trigger responses for Low and High Pt cuts | |
21 | /// (in Single, Unlike Sign and Like Sign) and gives Pt, Y, ITS vertex | |
22 | /// and multiplicity distributions. All results are in histogram form. | |
23 | /// The output is a root file and eps files in MUON.tar.gz. | |
24 | ||
25 | //*-- Frederic Yermia, yermia@to.infn.it | |
1dfe075f | 26 | ////////////////////////////////////////////////////////////////////////////// |
27 | ////////////////////////////////////////////////////////////////////////////// | |
28 | ||
0b28fd57 | 29 | #include <TCanvas.h> |
1dfe075f | 30 | #include <TChain.h> |
57139bf5 | 31 | #include <TFile.h> |
1dfe075f | 32 | #include <TH1F.h> |
0b28fd57 | 33 | #include <TROOT.h> |
57139bf5 | 34 | #include <TLorentzVector.h> |
1dfe075f | 35 | #include "AliMUONQATask.h" |
36 | #include "AliESD.h" | |
37 | #include "AliLog.h" | |
38 | #include "AliESDVertex.h" | |
39 | #include "AliESDMuonTrack.h" | |
57139bf5 | 40 | #include <TLorentzVector.h> |
1dfe075f | 41 | //______________________________________________________________________________ |
42 | AliMUONQATask::AliMUONQATask(const char *name) : | |
43 | AliAnalysisTask(name,""), | |
44 | fChain(0), | |
45 | fESD(0), | |
46 | fnTrackTrig(0), | |
47 | ftracktot(0), | |
48 | fnevents(0), | |
57139bf5 | 49 | fSLowpt(0), |
1dfe075f | 50 | fUSLowpt(0), |
51 | fUSHighpt(0), | |
1dfe075f | 52 | fLSLowpt(0), |
53 | fLSHighpt(0), | |
57139bf5 | 54 | fmuonMass(0.105658389), |
55 | fthetaX(0), | |
56 | fthetaY(0), | |
57 | fpYZ(0), | |
58 | fPxRec1(0), | |
59 | fPyRec1(0), | |
60 | fPzRec1(0), | |
61 | fE1(0), | |
62 | fZ1(0), | |
1dfe075f | 63 | fhMUONVertex(0), |
57139bf5 | 64 | fhMUONMult(0), |
65 | fhPt(0), | |
66 | fhY(0), | |
67 | fheffMatchT(0), | |
68 | fhSLowpt(0), | |
69 | fhUSLowpt(0), | |
70 | fhUSHighpt(0), | |
71 | fhLSLowpt(0), | |
72 | fhLSHighpt(0), | |
73 | fhChi2(0), | |
74 | fhChi2match(0) | |
1dfe075f | 75 | { |
76 | // Constructor. | |
77 | // Input slot #0 works with an Ntuple | |
78 | DefineInput(0, TChain::Class()); | |
79 | // Output slot #0 writes into a TH1 container | |
80 | DefineOutput(0, TObjArray::Class()) ; | |
57139bf5 | 81 | |
1dfe075f | 82 | } |
83 | ||
57139bf5 | 84 | |
1dfe075f | 85 | //______________________________________________________________________________ |
86 | AliMUONQATask::~AliMUONQATask() | |
87 | { | |
88 | // dtor | |
57139bf5 | 89 | fOutputContainer->Clear() ; |
90 | delete fOutputContainer ; | |
1dfe075f | 91 | |
57139bf5 | 92 | delete fhMUONVertex ; |
93 | delete fhMUONMult ; | |
94 | delete fhPt ; | |
95 | delete fhY ; | |
96 | delete fheffMatchT ; | |
97 | delete fhSLowpt ; | |
98 | delete fhUSLowpt ; | |
99 | delete fhUSHighpt; | |
100 | delete fhLSLowpt ; | |
101 | delete fhLSHighpt; | |
102 | delete fhChi2 ; | |
103 | delete fhChi2match ; | |
1dfe075f | 104 | } |
105 | ||
106 | //______________________________________________________________________________ | |
c52c2132 | 107 | void AliMUONQATask::ConnectInputData(const Option_t*) |
1dfe075f | 108 | { |
109 | // Initialisation of branch container and histograms | |
110 | ||
111 | AliInfo(Form("*** Initialization of %s", GetName())) ; | |
112 | ||
113 | // Get input data | |
114 | fChain = dynamic_cast<TChain *>(GetInputData(0)) ; | |
115 | if (!fChain) { | |
116 | AliError(Form("Input 0 for %s not found\n", GetName())); | |
117 | return ; | |
118 | } | |
119 | ||
c52c2132 | 120 | // One should first check if the branch address was taken by some other task |
121 | char ** address = (char **)GetBranchAddress(0, "ESD"); | |
122 | if (address) { | |
123 | fESD = (AliESD*)(*address); | |
124 | } else { | |
125 | fESD = new AliESD(); | |
126 | SetBranchAddress(0, "ESD", &fESD); | |
1dfe075f | 127 | } |
c52c2132 | 128 | } |
129 | ||
130 | //________________________________________________________________________ | |
131 | void AliMUONQATask::CreateOutputObjects() | |
132 | { | |
1dfe075f | 133 | // create histograms |
134 | fhMUONVertex = new TH1F("hMUONVertex","ITS Vertex" ,100, -25., 25.); | |
135 | fhMUONMult = new TH1F("hMUONMult" ,"Multiplicity of ESD tracks",10, -0.5, 9.5); | |
57139bf5 | 136 | fhPt = new TH1F("hPt","Pt",100, 0.,20.); |
137 | fhY = new TH1F("hY","Rapidity",100,-5.,-1.); | |
138 | fheffMatchT = new TH1F("heff_matchT","Trigger Matching Efficiency",100, 0.,100.); | |
139 | fhSLowpt = new TH1F("hSLowpt","Single Low Pt Response (%)",101, 0.,101.); | |
140 | fhUSLowpt = new TH1F("hUSLowpt","Unlike Sign Low Pt Response (%)",101, 0.,101.); | |
141 | fhUSHighpt = new TH1F("hUSHighpt","Unlike Sign High Pt Response (%)",101, 0.,101.); | |
142 | fhLSLowpt = new TH1F("hLSLowpt","Like Sign Low Pt Response (%)",101, 0.,101.); | |
143 | fhLSHighpt = new TH1F("hLSHighpt","Like Sign High Pt Response (%)",101, 0.,101.); | |
144 | fhChi2 = new TH1F("hChi2","Chi2 by d.o.f.",100, 0.,20.); | |
145 | fhChi2match = new TH1F("hChi2match","Chi2 of trig/track matching",100, 0.,20.); | |
1dfe075f | 146 | // create output container |
147 | ||
57139bf5 | 148 | fOutputContainer = new TObjArray(10) ; |
1dfe075f | 149 | fOutputContainer->SetName(GetName()) ; |
1dfe075f | 150 | fOutputContainer->AddAt(fhMUONVertex, 0) ; |
151 | fOutputContainer->AddAt(fhMUONMult, 1) ; | |
57139bf5 | 152 | fOutputContainer->AddAt(fhPt, 2) ; |
153 | fOutputContainer->AddAt(fhY, 3) ; | |
154 | fOutputContainer->AddAt(fheffMatchT, 4) ; | |
155 | fOutputContainer->AddAt(fhSLowpt, 5) ; | |
156 | fOutputContainer->AddAt(fhUSLowpt, 6) ; | |
157 | fOutputContainer->AddAt(fhUSHighpt, 7) ; | |
158 | fOutputContainer->AddAt(fhLSLowpt, 8) ; | |
159 | fOutputContainer->AddAt(fhLSHighpt, 9) ; | |
160 | fOutputContainer->AddAt(fhChi2, 10) ; | |
161 | fOutputContainer->AddAt( fhChi2match, 11) ; | |
1dfe075f | 162 | } |
163 | ||
164 | //______________________________________________________________________________ | |
165 | void AliMUONQATask::Exec(Option_t *) | |
166 | { | |
167 | // Processing of one event | |
168 | ||
169 | fnevents++ ; | |
170 | ||
171 | Long64_t entry = fChain->GetReadEntry() ; | |
172 | ||
173 | if (!fESD) { | |
174 | AliError("fESD is not connected to the input!") ; | |
175 | return ; | |
176 | } | |
177 | ||
178 | if ( !((entry-1)%100) ) | |
179 | AliInfo(Form("%s ----> Processing event # %lld", (dynamic_cast<TChain *>(fChain))->GetFile()->GetName(), entry)) ; | |
180 | ||
181 | // ************************ MUON ************************************* | |
182 | ||
183 | const AliESDVertex* vertex = dynamic_cast<const AliESDVertex*>(fESD->GetVertex()) ; | |
184 | ||
185 | Double_t zVertex = 0. ; | |
186 | if (vertex) | |
187 | zVertex = vertex->GetZv() ; | |
188 | ||
189 | Int_t nTracks = fESD->GetNumberOfMuonTracks() ; | |
190 | ||
191 | ULong64_t trigWord = fESD->GetTriggerMask() ; | |
192 | ||
57139bf5 | 193 | if (trigWord & 0x80) { |
194 | fSLowpt++; | |
195 | } | |
196 | if (trigWord & 0x100){ | |
1dfe075f | 197 | fLSLowpt++; |
57139bf5 | 198 | } |
199 | if (trigWord & 0x200){ | |
1dfe075f | 200 | fLSHighpt++; |
57139bf5 | 201 | } |
202 | if (trigWord & 0x400){ | |
203 | fUSLowpt++; | |
204 | } | |
205 | if (trigWord & 0x800){ | |
206 | fUSHighpt++; | |
207 | } | |
1dfe075f | 208 | |
209 | Int_t tracktrig = 0 ; | |
210 | Int_t iTrack1 ; | |
211 | ||
212 | for (iTrack1 = 0 ; iTrack1 < nTracks ; iTrack1++) { //1st loop | |
213 | AliESDMuonTrack* muonTrack = fESD->GetMuonTrack(iTrack1) ; | |
214 | ftracktot++ ; | |
57139bf5 | 215 | fthetaX = muonTrack->GetThetaX(); |
216 | fthetaY = muonTrack->GetThetaY(); | |
217 | fpYZ = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum()); | |
218 | fPzRec1 = - fpYZ / TMath::Sqrt(1.0 + TMath::Tan(fthetaY)*TMath::Tan(fthetaY)); | |
219 | fPxRec1 = fPzRec1 * TMath::Tan(fthetaX); | |
220 | fPyRec1 = fPzRec1 * TMath::Tan(fthetaY); | |
221 | fZ1 = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum())); | |
222 | fE1 = TMath::Sqrt(fmuonMass * fmuonMass + fPxRec1 * fPxRec1 + fPyRec1 * fPyRec1 + fPzRec1 * fPzRec1); | |
223 | fV1.SetPxPyPzE(fPxRec1, fPyRec1, fPzRec1, fE1); | |
224 | ||
225 | // -----------> transverse momentum | |
226 | Float_t pt1 = fV1.Pt(); | |
227 | // ----------->Rapidity | |
228 | Float_t y1 = fV1.Rapidity(); | |
229 | ||
1dfe075f | 230 | if(muonTrack->GetMatchTrigger()) { |
231 | fnTrackTrig++ ; | |
232 | tracktrig++ ; | |
57139bf5 | 233 | Float_t Chi2match = muonTrack->GetChi2MatchTrigger(); |
234 | fhChi2match->Fill(Chi2match); | |
1dfe075f | 235 | } |
1dfe075f | 236 | |
57139bf5 | 237 | Float_t fitfmin = muonTrack->GetChi2(); |
238 | Int_t ntrackhits = muonTrack->GetNHit(); | |
239 | Float_t Chi2= fitfmin / (2.0 * ntrackhits - 5); | |
240 | ||
241 | fhChi2->Fill(Chi2); | |
242 | fhPt->Fill(pt1); | |
243 | fhY->Fill(y1); | |
244 | } | |
245 | ||
1dfe075f | 246 | fhMUONVertex->Fill(zVertex) ; |
247 | fhMUONMult->Fill(Float_t(nTracks)) ; | |
57139bf5 | 248 | |
1dfe075f | 249 | PostData(0, fOutputContainer); |
250 | } | |
251 | ||
252 | //______________________________________________________________________________ | |
253 | void AliMUONQATask::Terminate(Option_t *) | |
254 | { | |
255 | // Processing when the event loop is ended | |
57139bf5 | 256 | Int_t fSLowPt = fSLowpt; |
257 | if(fnevents){ | |
258 | fSLowPt = 100 * fSLowpt / fnevents ; | |
259 | fhSLowpt->Fill(fSLowPt); } | |
260 | Int_t fUSLowPt = fUSLowpt; | |
261 | if(fnevents){ | |
262 | fUSLowPt = 100 * fUSLowpt / fnevents ; | |
263 | fhUSLowpt->Fill(fUSLowPt); } | |
264 | Int_t fUSHighPt = fUSHighpt; | |
265 | if(fnevents){ | |
266 | fUSHighPt = 100 * fUSHighpt / fnevents ; | |
267 | fhUSHighpt->Fill(fUSHighPt); } | |
268 | Int_t fLSLowPt = fLSLowpt; | |
269 | if(fnevents){ | |
270 | fLSLowPt = 100 * fLSLowpt / fnevents ; | |
271 | fhLSLowpt->Fill(fLSLowPt); } | |
272 | Int_t fLSHighPt = fLSHighpt; | |
273 | if(fnevents){ | |
274 | fLSHighPt = 100 * fLSHighpt / fnevents ; | |
275 | fhLSHighpt->Fill(fLSHighPt); } | |
276 | ||
277 | Int_t effMatch = -1 ; | |
278 | if (ftracktot){ | |
279 | effMatch = 100 * fnTrackTrig / ftracktot ; | |
280 | fheffMatchT->Fill(effMatch);} | |
1dfe075f | 281 | |
282 | AliInfo(Form("Terminate %s:", GetName())) ; | |
c52c2132 | 283 | fOutputContainer = (TObjArray*)GetOutputData(0); |
284 | fhMUONVertex = (TH1F*)fOutputContainer->At(0); | |
285 | fhMUONMult = (TH1F*)fOutputContainer->At(1); | |
57139bf5 | 286 | fhPt = (TH1F*)fOutputContainer->At(2); |
287 | fhY = (TH1F*)fOutputContainer->At(3); | |
288 | fheffMatchT=(TH1F*)fOutputContainer->At(4); | |
289 | fhSLowpt=(TH1F*)fOutputContainer->At(5); | |
290 | fhUSLowpt=(TH1F*)fOutputContainer->At(6); | |
291 | fhUSHighpt=(TH1F*)fOutputContainer->At(7); | |
292 | fhLSLowpt=(TH1F*)fOutputContainer->At(8); | |
293 | fhLSHighpt=(TH1F*)fOutputContainer->At(9); | |
294 | //______________________________________________________________________ | |
1dfe075f | 295 | printf("===================================================\n") ; |
296 | printf("================ %s ESD SUMMARY ==============\n", GetName()) ; | |
297 | printf(" \n") ; | |
298 | printf(" Total number of processed events %d \n", fnevents) ; | |
299 | printf("\n") ; | |
300 | printf("\n") ; | |
57139bf5 | 301 | printf("Table 1: \n") ; |
302 | printf("===================================================\n") ; | |
303 | printf(" Global Trigger output Low pt High pt \n") ; | |
304 | printf(" number of Single :\t"); | |
305 | printf("%i\t", fSLowpt) ; | |
1dfe075f | 306 | printf("\n"); |
307 | printf(" number of UnlikeSign pair :\t"); | |
57139bf5 | 308 | printf("%i\t%i\t", fUSLowpt, fUSHighpt) ; |
1dfe075f | 309 | printf("\n"); |
310 | printf(" number of LikeSign pair :\t"); | |
57139bf5 | 311 | printf("%i\t%i\t", fLSLowpt, fLSHighpt) ; |
1dfe075f | 312 | printf("\n"); |
313 | printf("===================================================\n") ; | |
314 | printf("\n") ; | |
57139bf5 | 315 | printf("matching efficiency with the trigger for single tracks = %2d %% \n", effMatch); |
316 | printf("\n") ; | |
317 | printf("===================================================\n") ; | |
1dfe075f | 318 | |
57139bf5 | 319 | TCanvas * cMUON1 = new TCanvas("cMUON1", "MUON ESD Vert & Mult", 400, 10, 600, 700) ; |
320 | cMUON1->Divide(1,2) ; | |
321 | cMUON1->cd(1) ; | |
322 | fhMUONVertex->SetXTitle("Vz (cm)"); | |
1dfe075f | 323 | fhMUONVertex->Draw() ; |
57139bf5 | 324 | cMUON1->cd(2) ; |
325 | fhMUONMult->SetXTitle(" Track Multiplicity"); | |
326 | fhMUONMult->Draw() ; | |
327 | cMUON1->Print("MUON1.eps") ; | |
1dfe075f | 328 | |
57139bf5 | 329 | TCanvas * cMUON2 = new TCanvas("cMUON2", "MUON ESD Pt & Y", 400, 10, 600, 700) ; |
330 | cMUON2->Divide(1,2) ; | |
331 | cMUON2->cd(1) ; | |
332 | fhPt->SetXTitle("Pt (GeV)"); | |
333 | fhPt->Draw() ; | |
334 | cMUON2->cd(2) ; | |
335 | fhY->SetXTitle("Y"); | |
336 | fhY->Draw() ; | |
337 | cMUON2->Print("MUON2.eps") ; | |
338 | ||
339 | TCanvas * cMUON3 = new TCanvas("cMUON3", "Track Chi2 by dof and Chi2 of trigger/track matching ", 400, 10, 600, 700) ; | |
340 | cMUON3->Divide(1,2) ; | |
341 | cMUON3->cd(1) ; | |
342 | fhChi2->SetXTitle("Chi2 by d.o.f."); | |
343 | fhChi2->Draw(); | |
344 | cMUON3->cd(2) ; | |
345 | fhChi2match->SetXTitle("Chi2 of trig/track matching"); | |
346 | fhChi2match->Draw(); | |
347 | cMUON3->Print("MUON3.eps") ; | |
348 | ||
349 | TCanvas * cMUON4 = new TCanvas("cMUON4", "Trigger Matching and Trigger Response (%)", 400, 10, 600, 700) ; | |
350 | cMUON4->Divide(2,3) ; | |
351 | cMUON4->cd(1) ; | |
352 | fheffMatchT->SetXTitle("%"); | |
353 | fheffMatchT->Draw() ; | |
354 | cMUON4->cd(2) ; | |
355 | fhSLowpt->SetXTitle("%"); | |
356 | fhSLowpt->Draw() ; | |
357 | cMUON4->cd(3) ; | |
358 | fhUSLowpt->SetXTitle("%"); | |
359 | fhUSLowpt->Draw() ; | |
360 | cMUON4->cd(4) ; | |
361 | fhUSHighpt->SetXTitle("%"); | |
362 | fhUSHighpt->Draw() ; | |
363 | cMUON4->cd(5) ; | |
364 | fhLSLowpt->SetXTitle("%"); | |
365 | fhLSLowpt->Draw() ; | |
366 | cMUON4->cd(6) ; | |
367 | fhLSHighpt->SetXTitle("%"); | |
368 | fhLSHighpt->Draw() ; | |
369 | cMUON4->Print("MUON4.eps") ; | |
370 | ||
1dfe075f | 371 | char line[1024] ; |
372 | sprintf(line, ".!tar -zcvf %s.tar.gz *.eps", GetName()) ; | |
373 | gROOT->ProcessLine(line); | |
374 | sprintf(line, ".!rm -fR *.eps"); | |
375 | gROOT->ProcessLine(line); | |
376 | ||
377 | AliInfo(Form("!!! All the eps files are in %s.tar.gz !!! \n", GetName())) ; | |
378 | } |