TList replaced by TObjArray as QA data container. Introducing OCDB for the reference...
[u/mrichter/AliRoot.git] / HMPID / AliHMPIDQADataMaker.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
17 /* $Id$ */
18
19 //---
20 //  Produces the data needed to calculate the quality assurance. 
21 //  All data must be mergeable objects.
22 //  A. Mastroserio
23 //---
24
25 // --- ROOT system ---
26 #include <TClonesArray.h>
27 #include <TFile.h> 
28 #include <TH1F.h> 
29 #include <TH2F.h>
30 #include <TH1I.h> 
31 #include <TDirectory.h>
32 #include <Riostream.h>
33 // --- Standard library ---
34
35 // --- AliRoot header files ---
36 #include "AliESDCaloCluster.h"
37 #include "AliESDEvent.h"
38 #include "AliLog.h"
39 #include "AliHMPIDDigit.h"
40 #include "AliHMPIDHit.h"
41 #include "AliHMPIDCluster.h"
42 #include "AliHMPIDQADataMaker.h"
43
44 ClassImp(AliHMPIDQADataMaker)
45            
46 //____________________________________________________________________________ 
47   AliHMPIDQADataMaker::AliHMPIDQADataMaker() : 
48   AliQADataMaker(AliQA::GetDetName(AliQA::kHMPID), "HMPID Quality Assurance Data Maker"),
49   fhHitQdc(0x0), 
50   fhSDigits(0x0),
51   fhDigPcEvt(0x0),
52   fhDigChEvt(0x0),
53   fhDigQ(0x0),
54   fhCluEvt(0x0),
55   fhCluChi2(0x0),
56   fhCluQ(0x0),
57   fhCluFlg(0x0), 
58   fhCluSize(0x0),  
59   fhMipCluSize(0x0),
60   fhCkovP(0x0),
61   fhSigP(0x0),
62   fhMipXY(0x0),
63   fhDifXY(0x0)
64 {
65   // ctor
66   for(Int_t i=0; i<7; i++) fhHitMap[i]=0x0;
67   for(Int_t j=0; j<5; j++) fhPid[j]=0x0;
68 //   fDetectorDir = fOutput->GetDirectory(GetName()) ;  
69 //   if (!fDetectorDir) 
70 //     fDetectorDir = fOutput->mkdir(GetName()) ;  
71 }
72
73 //____________________________________________________________________________ 
74 AliHMPIDQADataMaker::AliHMPIDQADataMaker(const AliHMPIDQADataMaker& qadm) :
75   AliQADataMaker(), 
76   fhHitQdc(qadm.fhHitQdc), 
77   fhSDigits(qadm.fhSDigits),
78   fhDigPcEvt(qadm.fhDigPcEvt),
79   fhDigChEvt(qadm.fhDigChEvt),
80   fhDigQ(qadm.fhDigQ),
81   fhCluEvt(qadm.fhCluEvt),
82   fhCluChi2(qadm.fhCluChi2),
83   fhCluQ(qadm.fhCluQ),
84   fhCluFlg(qadm.fhCluFlg),
85   fhCluSize(qadm.fhCluSize),
86   fhMipCluSize(qadm.fhMipCluSize),
87   fhCkovP(qadm.fhCkovP),
88   fhSigP(qadm.fhSigP),
89   fhMipXY(qadm.fhMipXY),
90   fhDifXY(qadm.fhDifXY)
91 {
92   //copy ctor 
93   for(Int_t i=0; i<7; i++) fhHitMap[i]=qadm.fhHitMap[i];
94   for(Int_t j=0; j<5; j++) fhPid[j]=qadm.fhPid[j];
95
96   SetName((const char*)qadm.GetName()) ; 
97   SetTitle((const char*)qadm.GetTitle()); 
98 }
99
100 //__________________________________________________________________
101 AliHMPIDQADataMaker& AliHMPIDQADataMaker::operator = (const AliHMPIDQADataMaker& qadm )
102 {
103   // Equal operator.
104   this->~AliHMPIDQADataMaker();
105   new(this) AliHMPIDQADataMaker(qadm);
106   return *this;
107 }
108  
109 //____________________________________________________________________________ 
110 void AliHMPIDQADataMaker::InitHits()
111 {
112   // create Hits histograms in Hits subdir
113      fhHitQdc=new TH1F("HitQdc","HMPID Hit Qdc all chamber;QDC",500,0,4000);
114      for(Int_t iCh=0;iCh<7;iCh++) 
115                  fhHitMap[iCh]=new TH2F(Form("HMPID HitMap%i",iCh),Form("Ch%i;x_{Hit};y_{Hit}",iCh),162,-1,161,146,-1,145);   
116 }
117
118 //____________________________________________________________________________ 
119 void AliHMPIDQADataMaker::InitDigits()
120 {
121   // create Digits histograms in Digits subdir
122       fhDigPcEvt=new TH1F("hDigPcEvt","PC occupancy",156,-1,77);
123       fhDigChEvt=new TH1F("hDigChEvt","Chamber occupancy",32,-1,7);
124       fhDigQ  =new TH1F("Q        "," digit charge               ",3000,0,3000);
125 }
126
127 //____________________________________________________________________________ 
128 void AliHMPIDQADataMaker::InitSDigits()
129 {
130   // create SDigits histograms in SDigits subdir
131       fhSDigits     = new TH1F("hHmpidSDigits",    "SDigits Q  distribution in HMPID",  500, 0., 5000.) ; 
132 }
133
134 //____________________________________________________________________________ 
135
136 void AliHMPIDQADataMaker::InitRecPoints()
137 {
138   // create cluster histograms in RecPoint subdir
139       fhCluEvt=new TH1F("CluPerEvt","# clusters per chamber",16,-1,7);
140       fhCluChi2  =new TH1F("CluChi2"  ,"Chi2 "               ,1000,0,100);
141       fhCluQ   =new TH1F("CluQ"   ,"Cluster charge"        ,3000,0,3000);
142       fhCluFlg   =new TH1F("CluFlg"   ,"Cluster flag"        ,14,-1.5,12.5);
143       fhCluSize  =new TH1F("CluSize"  ,"Raw cluster size    ",100,0,100);
144       fhMipCluSize =new TH1F("MipCluSize"  ,"Mip cluster size    ",100,0,100);
145 }
146 //____________________________________________________________________________
147 void AliHMPIDQADataMaker::InitESDs()
148 {
149   //create ESDs histograms in ESDs subdir
150      fhCkovP  = new TH2F("CkovP" , "#theta_{c}, [rad];P, [GeV]"   , 150,   0,  7  ,100, 0, 1)   ;
151      fhSigP   = new TH2F("SigP"  ,"#sigma_{#theta_c} [mrad];[GeV]", 150,   0,  7  ,100, 0, 1)   ;
152      fhMipXY  = new TH2F("MipXY" ,"mip position"                  , 260,   0,130  ,252, 0,126)  ;
153      fhDifXY  = new TH2F("DifXY" ,"diff"                          , 200, -10, 10  ,200,-10,10)  ;
154      fhPid[0] = new TH1F("PidE" ,"PID: e yellow #mu magenta"  ,100,0,1)                         ;
155      fhPid[1] = new TH1F("PidMu","pid of #mu"                 ,100,0,1)                         ;
156      fhPid[2] = new TH1F("PidPi","PID: #pi red K green p blue",100,0,1)                         ;
157      fhPid[3] = new TH1F("PidK" ,"pid of K"                   ,100,0,1)                         ;
158      fhPid[4] = new TH1F("PidP" ,"pid of p"                   ,100,0,1)                         ;
159 }
160
161 //____________________________________________________________________________
162 void AliHMPIDQADataMaker::MakeHits(TObject * data)
163 {
164   //fills QA histos for Hits
165   TClonesArray * hits = dynamic_cast<TClonesArray *>(data) ; 
166   if (!hits){
167     AliError("Wrong type of hits container") ; 
168   } else {
169     TIter next(hits); 
170     AliHMPIDHit * hit ; 
171     while ( (hit = dynamic_cast<AliHMPIDHit *>(next())) ) {
172       if(hit->Pid()<500000) fhHitQdc->Fill(hit->Q()) ;
173       if(hit->Pid()<500000) fhHitMap[hit->Ch()]->Fill(hit->LorsX(),hit->LorsY());
174     }
175   } 
176 }
177
178 //____________________________________________________________________________
179 void AliHMPIDQADataMaker::MakeDigits( TObject * data)
180 {
181   //fills QA histos for Digits
182   TObjArray *chambers = dynamic_cast<TObjArray*>(data);
183   if ( !chambers) {
184     AliError("Wrong type of digits container") ; 
185   } else {
186     for(Int_t i =0; i< chambers->GetEntries(); i++)
187       {
188         TClonesArray * digits = dynamic_cast<TClonesArray*>(chambers->At(i)); 
189         fhDigChEvt->Fill(i,digits->GetEntriesFast()/(48.*80.*6.));
190         TIter next(digits); 
191         AliHMPIDDigit * digit; 
192         while ( (digit = dynamic_cast<AliHMPIDDigit *>(next())) ) {
193           fhDigPcEvt->Fill(10.*i+digit->Pc(),1./(48.*80.));
194           fhDigQ->Fill(digit->Q());
195         }  
196       }
197   }
198 }
199
200 //____________________________________________________________________________
201 void AliHMPIDQADataMaker::MakeSDigits( TObject * data)
202 {
203   //fills QA histos for SDigits
204   TClonesArray * sdigits = dynamic_cast<TClonesArray *>(data) ; 
205   if (!sdigits) {
206     AliError("Wrong type of sdigits container") ; 
207   } else {
208     AliHMPIDDigit *ref = (AliHMPIDDigit *)sdigits->At(0);
209     Float_t zero = ref->GetTrack(0); 
210     TIter next(sdigits) ; 
211     AliHMPIDDigit * sdigit ; 
212     while ( (sdigit = dynamic_cast<AliHMPIDDigit *>(next())) ) {
213       fhSDigits->Fill(sdigit->Q()) ;
214       if(zero == sdigit->GetTrack(0)) continue;
215       else zero = sdigit->GetTrack(0);
216     } 
217   }
218 }
219
220 //____________________________________________________________________________
221 void AliHMPIDQADataMaker::MakeRecPoints(TTree * clustersTree)
222 {
223   //fills QA histos for clusters
224
225   TClonesArray *clusters = new TClonesArray("AliHMPIDCluster");
226   for(int i=AliHMPIDParam::kMinCh;i<=AliHMPIDParam::kMaxCh;i++){
227     TBranch *branch = clustersTree->GetBranch(Form("HMPID%d",i));
228     branch->SetAddress(&clusters);
229     branch->GetEntry(0);
230
231     fhCluEvt->Fill(i,clusters->GetEntries());
232     TIter next(clusters);
233     AliHMPIDCluster *clu;
234     while ( (clu = dynamic_cast<AliHMPIDCluster *>(next())) ) {;
235       fhCluFlg->Fill(clu->Status());  fhCluChi2->Fill(clu->Chi2());  fhCluSize->Fill(clu->Size());
236       fhCluQ->Fill(clu->Q()); 
237       Int_t qCut=100;
238       if(clu->Q()>qCut) {
239         fhMipCluSize->SetTitle(Form("Mip cluster size at a Qcut = %i ADC",qCut));
240         fhMipCluSize->Fill(clu->Size());
241       }
242     }
243   }
244
245   clusters->Delete();
246   delete clusters;
247 }
248
249 //____________________________________________________________________________
250 void AliHMPIDQADataMaker::MakeESDs(AliESDEvent * esd)
251 {
252   //fills QA histos for ESD
253   for(Int_t iTrk = 0 ; iTrk < esd->GetNumberOfTracks() ; iTrk++){
254     AliESDtrack *pTrk = esd->GetTrack(iTrk) ;
255     fhCkovP->Fill(pTrk->GetP(),pTrk->GetHMPIDsignal());
256     fhSigP->Fill( pTrk->GetP(),TMath::Sqrt(pTrk->GetHMPIDchi2()));
257     Float_t xm,ym; Int_t q,np;  
258     pTrk->GetHMPIDmip(xm,ym,q,np);                       //mip info
259     fhMipXY->Fill(xm,ym);
260     Float_t xRad,yRad,th,ph;        
261     pTrk->GetHMPIDtrk(xRad,yRad,th,ph);              //track info at the middle of the radiator
262     Float_t xPc = xRad+9.25*TMath::Tan(th)*TMath::Cos(ph); // temporar: linear extrapol (B=0!)
263     Float_t yPc = yRad+9.25*TMath::Tan(th)*TMath::Sin(ph); // temporar:          "
264     fhDifXY->Fill(xm-xPc,ym-yPc); //track info
265     Double_t pid[5] ;      pTrk->GetHMPIDpid(pid) ;
266     for(Int_t i = 0 ; i < 5 ; i++) fhPid[i]->Fill(pid[i]) ;
267   }
268 }
269