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