Added log outputs
[u/mrichter/AliRoot.git] / ESDCheck / AliMUONQATask.cxx
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
16 /* $Id$ */
17
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
26 //////////////////////////////////////////////////////////////////////////////
27 //////////////////////////////////////////////////////////////////////////////
28
29 #include <TCanvas.h>
30 #include <TChain.h>
31 #include <TFile.h>
32 #include <TH1F.h>
33 #include <TROOT.h>
34 #include <TLorentzVector.h>
35 #include "AliMUONQATask.h" 
36 #include "AliESD.h" 
37 #include "AliLog.h"
38 #include "AliESDVertex.h" 
39 #include "AliESDMuonTrack.h"
40 #include <TLorentzVector.h>
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),
49   fSLowpt(0),
50   fUSLowpt(0),
51   fUSHighpt(0),
52   fLSLowpt(0),
53   fLSHighpt(0),
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),
63   fhMUONVertex(0),
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)  
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()) ; 
81
82 }
83
84
85 //______________________________________________________________________________
86 AliMUONQATask::~AliMUONQATask()
87
88   // dtor
89    fOutputContainer->Clear() ; 
90    delete fOutputContainer ; 
91   
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 ;
104 }
105
106 //______________________________________________________________________________
107 void AliMUONQATask::ConnectInputData(const Option_t*)
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   
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);
127   }
128 }
129
130 //________________________________________________________________________
131 void AliMUONQATask::CreateOutputObjects()
132 {  
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);
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.);
146   // create output container
147   
148   fOutputContainer = new TObjArray(12) ; 
149   fOutputContainer->SetName(GetName()) ; 
150   fOutputContainer->AddAt(fhMUONVertex,             0) ; 
151   fOutputContainer->AddAt(fhMUONMult,               1) ; 
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) ;
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
193   if (trigWord & 0x80) {
194         fSLowpt++;
195   }
196   if (trigWord & 0x100){
197     fLSLowpt++;
198   } 
199   if (trigWord & 0x200){
200     fLSHighpt++;
201   }  
202   if (trigWord & 0x400){
203     fUSLowpt++;
204   }
205   if (trigWord & 0x800){
206     fUSHighpt++;
207   }
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++ ;
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   
230     if(muonTrack->GetMatchTrigger()) {
231       fnTrackTrig++ ;
232       tracktrig++ ;
233       Float_t  Chi2match = muonTrack->GetChi2MatchTrigger();
234       fhChi2match->Fill(Chi2match);
235     }
236
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   
246   fhMUONVertex->Fill(zVertex) ;
247   fhMUONMult->Fill(Float_t(nTracks)) ;
248   
249   PostData(0, fOutputContainer);  
250 }
251
252 //______________________________________________________________________________
253 void AliMUONQATask::Terminate(Option_t *)
254 {
255   // Processing when the event loop is ended
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);}
281
282     Bool_t problem = kFALSE ; 
283     AliInfo(Form(" *** %s Report:", GetName())) ; 
284
285     fOutputContainer = (TObjArray*)GetOutputData(0);
286     fhMUONVertex = (TH1F*)fOutputContainer->At(0);
287     fhMUONMult   = (TH1F*)fOutputContainer->At(1); 
288     fhPt  = (TH1F*)fOutputContainer->At(2); 
289     fhY  = (TH1F*)fOutputContainer->At(3); 
290     fheffMatchT=(TH1F*)fOutputContainer->At(4); 
291     fhSLowpt=(TH1F*)fOutputContainer->At(5); 
292     fhUSLowpt=(TH1F*)fOutputContainer->At(6); 
293     fhUSHighpt=(TH1F*)fOutputContainer->At(7);
294     fhLSLowpt=(TH1F*)fOutputContainer->At(8); 
295     fhLSHighpt=(TH1F*)fOutputContainer->At(9);
296     
297     printf("         Total number of processed events  %d      \n", fnevents) ;
298     printf("     \n")  ;
299     printf("     \n")  ;
300     printf("     Table 1:                                         \n") ;
301     printf("    ===================================================\n") ;
302     printf("      Global Trigger output       Low pt  High pt \n") ;
303     printf("     number of Single      :\t");
304     printf("     %i\t", fSLowpt) ;
305     printf("\n");
306     printf("     number of UnlikeSign pair  :\t"); 
307     printf("     %i\t%i\t", fUSLowpt, fUSHighpt) ;
308     printf("\n");
309     printf("     number of LikeSign pair    :\t");  
310     printf("     %i\t%i\t", fLSLowpt, fLSHighpt) ;
311     printf("\n");
312     printf("     matching efficiency with the trigger for single tracks = %2d %% \n", effMatch);
313     printf("\n") ;
314     
315     TCanvas * cMUON1 = new TCanvas("cMUON1", "MUON ESD Vert & Mult", 400, 10, 600, 700) ;
316     cMUON1->Divide(1,2) ;
317     cMUON1->cd(1) ;
318     fhMUONVertex->SetXTitle("Vz (cm)");
319     fhMUONVertex->Draw() ;
320     cMUON1->cd(2) ;
321     fhMUONMult->SetXTitle(" Track Multiplicity");
322     fhMUONMult->Draw() ;
323     cMUON1->Print("MUON1.eps") ; 
324     
325     TCanvas * cMUON2 = new TCanvas("cMUON2", "MUON ESD Pt & Y", 400, 10, 600, 700) ;
326     cMUON2->Divide(1,2) ;
327     cMUON2->cd(1) ;
328     fhPt->SetXTitle("Pt (GeV)");
329     fhPt->Draw() ;
330     cMUON2->cd(2) ;
331     fhY->SetXTitle("Y");
332     fhY->Draw() ;
333     cMUON2->Print("MUON2.eps") ;
334     
335     TCanvas * cMUON3 = new TCanvas("cMUON3", "Track Chi2 by dof and Chi2 of trigger/track matching ", 400, 10, 600, 700) ;
336     cMUON3->Divide(1,2) ;
337     cMUON3->cd(1) ;
338     fhChi2->SetXTitle("Chi2 by d.o.f.");
339     fhChi2->Draw();
340     cMUON3->cd(2) ;
341     fhChi2match->SetXTitle("Chi2 of trig/track matching");
342     fhChi2match->Draw();
343     cMUON3->Print("MUON3.eps") ;
344     
345     TCanvas * cMUON4 = new TCanvas("cMUON4", "Trigger Matching and Trigger Response (%)", 400, 10, 600, 700) ;
346     cMUON4->Divide(2,3) ;
347     cMUON4->cd(1) ;
348     fheffMatchT->SetXTitle("%");
349     fheffMatchT->Draw() ;
350     cMUON4->cd(2) ;
351     fhSLowpt->SetXTitle("%");
352     fhSLowpt->Draw() ;
353     cMUON4->cd(3) ;
354     fhUSLowpt->SetXTitle("%");
355     fhUSLowpt->Draw() ;
356     cMUON4->cd(4) ;
357     fhUSHighpt->SetXTitle("%");
358     fhUSHighpt->Draw() ;
359     cMUON4->cd(5) ;
360     fhLSLowpt->SetXTitle("%");
361     fhLSLowpt->Draw() ;
362     cMUON4->cd(6) ;
363     fhLSHighpt->SetXTitle("%");
364     fhLSHighpt->Draw() ;
365     cMUON4->Print("MUON4.eps") ;
366     
367     char line[1024] ; 
368     sprintf(line, ".!tar -zcf %s.tar.gz *.eps", GetName()) ; 
369     gROOT->ProcessLine(line);
370     sprintf(line, ".!rm -fR *.eps"); 
371     gROOT->ProcessLine(line);
372     
373     AliInfo(Form("!!! All the eps files are in %s.tar.gz !!!", GetName())) ;
374  
375    char * report ; 
376    if(problem)
377       report="Problems found, please check!!!";  
378     else 
379       report="OK";
380     
381     AliInfo(Form("*** %s Summary Report: %s \n",GetName(), report)) ; 
382 }