]>
Commit | Line | Data |
---|---|---|
51504028 | 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 | ||
18 | //--- | |
19 | // Produces the data needed to calculate the quality assurance. | |
20 | // ACORDE QA for Hits, Digits, RAW and ESD's | |
21 | // | |
22 | // Authors: | |
23 | // | |
24 | // Luciano Diaz Gonzalez <luciano.diaz@nucleares.unam.mx> (ICN-UNAM) | |
25 | // Mario Rodriguez Cahuantzi <mrodrigu@mail.cern.ch> (FCFM-BUAP) | |
26 | // Arturo Fernandez Tellez <afernan@mail.cern.ch (FCFM-BUAP) | |
27 | // | |
28 | // Created: June 13th 2008 | |
29 | //--- | |
30 | ||
31 | // --- ROOT system --- | |
32 | #include <TClonesArray.h> | |
33 | #include <TFile.h> | |
34 | #include <TH1F.h> | |
35 | #include <TH2F.h> | |
36 | #include <TDirectory.h> | |
37 | #include <TObject.h> | |
38 | // --- Standard library --- | |
39 | ||
40 | // --- AliRoot header files --- | |
41 | #include "AliESDEvent.h" | |
42 | #include "AliLog.h" | |
43 | #include "AliACORDEdigit.h" | |
44 | #include "AliACORDEhit.h" | |
45 | #include "AliACORDERecPoint.h" | |
46 | #include "AliACORDEQADataMaker.h" | |
47 | #include "AliQAChecker.h" | |
48 | #include "AliACORDERawReader.h" | |
49 | #include "AliACORDERawStream.h" | |
50 | ||
51 | ClassImp(AliACORDEQADataMaker) | |
52 | ||
53 | //____________________________________________________________________________ | |
4e25ac79 | 54 | AliACORDEQADataMaker::AliACORDEQADataMaker():AliQADataMaker(AliQAv1::GetDetName(AliQAv1::kACORDE), "ACORDE Quality Assurance Data Maker") |
51504028 | 55 | { |
56 | // Acorde QA Data Maker | |
57 | } | |
58 | ||
59 | //____________________________________________________________________________ | |
60 | AliACORDEQADataMaker::AliACORDEQADataMaker(const AliACORDEQADataMaker& qadm):AliQADataMaker() | |
61 | { | |
62 | SetName((const char*)qadm.GetName()) ; | |
63 | SetTitle((const char*)qadm.GetTitle()); | |
64 | } | |
65 | //__________________________________________________________________ | |
66 | AliACORDEQADataMaker& AliACORDEQADataMaker::operator = (const AliACORDEQADataMaker& qadm ) | |
67 | { | |
68 | // Equal operator. | |
69 | this->~AliACORDEQADataMaker(); | |
70 | new(this) AliACORDEQADataMaker(qadm); | |
71 | return *this; | |
72 | } | |
73 | //____________________________________________________________________________ | |
74 | void AliACORDEQADataMaker::StartOfDetectorCycle() | |
75 | { | |
76 | //Detector specific actions at start of cycle | |
77 | ||
78 | } | |
79 | ||
80 | //____________________________________________________________________________ | |
81 | void AliACORDEQADataMaker::InitHits() | |
82 | { | |
83 | ||
84 | // create Hits histograms in Hits subdir | |
85 | TH1F *fAHitsACORDE[8]; | |
86 | ||
87 | fAHitsACORDE[0] = new TH1F("hACORDEloss" ,"Energy Loss ",1000,0.,1500.); | |
88 | fAHitsACORDE[1] = new TH1F("hACORDEPolar" ," Polar Angle ",90,0.,90.); | |
89 | fAHitsACORDE[2] = new TH1F("hACORDEAzimuth" ,"Azimuth Angle ",360,-180.,180.); | |
90 | fAHitsACORDE[3] = new TH1F("hACORDEPx" ,"Px Distribution ",60,-30.,30.); | |
91 | fAHitsACORDE[4] = new TH1F("hACORDEPy" ,"Py Distribution ",60,-30.,30.); | |
92 | fAHitsACORDE[5] = new TH1F("hACORDEPz" ,"Pz Distribution ",60,-30.,30.); | |
93 | fAHitsACORDE[6] = new TH1F("hACORDEPt" ,"Pt Distribution ",60,0.,50.); | |
94 | fAHitsACORDE[7] = new TH1F("hACORDEpxpz" ,"Pt Distribution ",100,-50.,50.); | |
95 | ||
96 | TH2F *hACORDExy = new TH2F("hACORDExy" ,"Dist. xy",2800,-2400.,1400.,200,-4805.,4825.); | |
97 | TH2F *hACORDExz = new TH2F("hACORDExz" ,"Dist.xz ",900,-1500.,2850.,1200,-1000.,4000.); | |
98 | TH2F *hACORDEyz = new TH2F("hACORDEyz" ,"Dist.yz ",5,817.,819.,1200,-600.,600.); | |
99 | TH2F *hACORDEAzimPol = new TH2F("hACORDEAzimPol" ,"Azimuth vs Polar ",360,-180.,180.,180,0.,180.); | |
100 | ||
101 | for(Int_t i=0; i<8; i++) | |
102 | Add2HitsList(fAHitsACORDE[i],i); | |
103 | ||
104 | Add2HitsList(hACORDExy,8); | |
105 | Add2HitsList(hACORDExz,9); | |
106 | Add2HitsList(hACORDEyz,10); | |
107 | Add2HitsList(hACORDEAzimPol,11); | |
108 | ||
109 | } | |
110 | //____________________________________________________________________________ | |
111 | void AliACORDEQADataMaker::InitDigits() | |
112 | { | |
113 | // create Digits histograms in Digits subdir | |
114 | ||
115 | TH1F * fhDigitsModule; | |
116 | TString modulename; | |
117 | modulename = "hDigitsModule"; | |
118 | fhDigitsModule = new TH1F(modulename.Data(),"hDigitsModuleSingle",60,0,60); | |
119 | Add2DigitsList( fhDigitsModule,0); | |
120 | ||
121 | ||
122 | } | |
123 | ||
124 | //____________________________________________________________________________ | |
125 | void AliACORDEQADataMaker::InitRaws() | |
126 | { | |
127 | // create Raw histograms in Raw subdir | |
128 | TH1D *fhACORDEBitPattern[4]; | |
129 | fhACORDEBitPattern[0] = new TH1D("ACORDERawDataSM","ACORDE-SingleMuon",60,1,60);//AcordeSingleMuon BitPattern | |
130 | fhACORDEBitPattern[1] = new TH1D("ACORDERawDataMM","ACORDE-MultiMuon",60,1,60);//AcordeMultiMuon BitPattern | |
131 | fhACORDEBitPattern[2] = new TH1D("ACORDERawDataSMM","ACORDE-SingleMuonMultiplicity",60,1,60);//AcordeSingleMuon Multiplicity | |
132 | fhACORDEBitPattern[3] = new TH1D("ACORDERawDataMMM","ACORDE-MultiMuonMultiplicity",60,1,60);//AcordeMultiMuon Multiplicity | |
133 | for(Int_t i=0;i<4;i++) | |
134 | { | |
135 | Add2RawsList(fhACORDEBitPattern[i],i); | |
136 | } | |
137 | } | |
138 | ||
139 | //____________________________________________________________________________ | |
140 | ||
141 | void AliACORDEQADataMaker::InitRecPoints() | |
142 | { | |
143 | // create cluster histograms in RecPoint subdir | |
144 | // Not needed for ACORDE by now !!! | |
145 | } | |
146 | //____________________________________________________________________________ | |
147 | void AliACORDEQADataMaker::InitESDs() | |
148 | { | |
149 | //create ESDs histograms in ESDs subdir | |
150 | ||
151 | TH1F * fhESDsSingle; | |
152 | TH1F * fhESDsMulti; | |
153 | ||
154 | TString name; | |
155 | ||
156 | name = "hESDsSingle"; | |
157 | fhESDsSingle = new TH1F(name.Data(),"hESDsSingle",60,0,60); | |
158 | Add2ESDsList( fhESDsSingle,0); | |
159 | ||
160 | name = "hESDsMulti"; | |
161 | fhESDsMulti = new TH1F(name.Data(),"hESDsMulti",60,0,60); | |
162 | Add2ESDsList( fhESDsMulti,1); | |
163 | ||
164 | ||
165 | ||
166 | } | |
167 | //____________________________________________________________________________ | |
168 | ||
169 | void AliACORDEQADataMaker::MakeHits(TTree *hitTree) | |
170 | { | |
171 | ||
172 | // Here we fill the QA histos for Hits declared above | |
173 | ||
174 | printf("Estamos en make Hits"); | |
175 | TClonesArray * hits = new TClonesArray("AliACORDEhit",1000); | |
176 | TBranch * branch = hitTree->GetBranch("ACORDE"); | |
177 | if (!branch) | |
178 | { | |
179 | AliWarning("ACORDE branch in Hit Tree not found"); | |
180 | }else | |
181 | { | |
182 | if (branch) | |
183 | { | |
184 | branch->SetAddress(&hits); | |
185 | }else | |
186 | { | |
187 | AliError("Branch ACORDE hit not found"); | |
188 | exit(111); | |
189 | } | |
190 | Int_t ntracks = (Int_t)hitTree->GetEntries(); | |
191 | if (ntracks<=0) return; | |
192 | for(Int_t track=0;track<ntracks;track++) | |
193 | { | |
194 | branch->GetEntry(track); | |
195 | Int_t nhits = hits->GetEntriesFast(); | |
196 | for(Int_t ihit=0;ihit<nhits;ihit++) | |
197 | { | |
198 | AliACORDEhit *AcoHit = (AliACORDEhit*) hits->UncheckedAt(ihit); | |
199 | if (!AcoHit) | |
200 | { | |
201 | AliError("The unchecked hit doesn't exist"); | |
202 | break; | |
203 | } | |
204 | GetHitsData(0)->Fill(AcoHit->Eloss()); | |
205 | GetHitsData(1)->Fill(AcoHit->PolarAngle()); | |
206 | GetHitsData(2)->Fill(AcoHit->AzimuthAngle()); | |
207 | GetHitsData(3)->Fill(AcoHit->Px()); | |
208 | GetHitsData(4)->Fill(AcoHit->Py()); | |
209 | GetHitsData(5)->Fill(AcoHit->Pz()); | |
210 | GetHitsData(6)->Fill(TMath::Sqrt( (AcoHit->Px())*(AcoHit->Px())+ | |
211 | (AcoHit->Py())*(AcoHit->Py()))); | |
212 | if((AcoHit->Py()) != 0.0 ) GetHitsData(7)->Fill(TMath::ATan(AcoHit->Px()/AcoHit->Py())); | |
213 | GetHitsData(8)->Fill( (Float_t)(AcoHit->X()),(Float_t)(AcoHit->Y()) ); | |
214 | GetHitsData(9)->Fill( (Float_t)(AcoHit->X()),(Float_t)(AcoHit->Z()) ); | |
215 | GetHitsData(10)->Fill( (Float_t)(AcoHit->Y()),(Float_t)(AcoHit->Z()) ); | |
216 | GetHitsData(11)->Fill( (Float_t)(AcoHit->AzimuthAngle()), | |
217 | (Float_t)(AcoHit->PolarAngle())); | |
218 | } | |
219 | } | |
220 | } | |
221 | ||
222 | ||
223 | ||
224 | } | |
225 | ||
226 | //____________________________________________________________________________ | |
227 | void AliACORDEQADataMaker::MakeDigits( TTree *digitsTree) | |
228 | { | |
229 | //fills QA histos for Digits | |
230 | ||
231 | ||
232 | TClonesArray * digits = new TClonesArray("AliACORDEdigit",1000); | |
233 | TBranch * branch = digitsTree->GetBranch("ACORDEdigit"); | |
234 | if (!branch) | |
235 | { | |
236 | AliWarning("ACORDE branch in Digits Tree not found"); | |
237 | }else | |
238 | { | |
239 | if (branch) | |
240 | { | |
241 | branch->SetAddress(&digits); | |
242 | }else | |
243 | { | |
244 | AliError("Branch ACORDE digit not found"); | |
245 | exit(111); | |
246 | } | |
247 | Int_t ntracks = (Int_t)digitsTree->GetEntries(); | |
248 | if (ntracks<=0) return; | |
249 | printf("Entries in DigitsTree:%d\n",ntracks); | |
250 | for(Int_t track=0;track<ntracks;track++) | |
251 | { | |
252 | branch->GetEntry(track); | |
253 | Int_t ndigits = digits->GetEntriesFast(); | |
254 | for(Int_t idigit=0;idigit<ndigits;idigit++) | |
255 | { | |
256 | AliACORDEdigit *AcoDigit = (AliACORDEdigit*) digits->UncheckedAt(idigit); | |
257 | if (!AcoDigit) | |
258 | { | |
259 | AliError("The unchecked digit doesn't exist"); | |
260 | break; | |
261 | } | |
262 | GetDigitsData(0)->Fill(AcoDigit->GetModule()-1); | |
263 | } | |
264 | } | |
265 | ||
266 | ||
267 | } | |
268 | ||
269 | ||
270 | } | |
271 | ||
272 | ||
273 | //____________________________________________________________________________ | |
274 | void AliACORDEQADataMaker::MakeRaws( AliRawReader* rawReader) | |
275 | { | |
276 | ||
277 | //fills QA histos for RAW | |
278 | rawReader->Reset(); | |
279 | AliACORDERawStream rawStream(rawReader); | |
280 | size_t contSingle=0; | |
281 | size_t contMulti=0; | |
282 | UInt_t dy[4]; | |
283 | ||
284 | bool kroSingle[60],kroMulti[60]; | |
285 | UInt_t tmpDy; | |
286 | ||
287 | for(Int_t m=0;m<60;m++) {kroSingle[m]=0;kroMulti[m]=0;} | |
288 | ||
289 | if(rawStream.Next()) | |
290 | { | |
291 | rawReader->NextEvent(); | |
292 | rawStream.Reset(); | |
293 | dy[0]=rawStream.GetWord(0); | |
294 | dy[1]=rawStream.GetWord(1); | |
295 | dy[2]=rawStream.GetWord(2); | |
296 | dy[3]=rawStream.GetWord(3); | |
297 | tmpDy=dy[0]; | |
298 | for(Int_t r=0;r<30;++r) | |
299 | { | |
300 | kroSingle[r] = tmpDy & 1; | |
301 | tmpDy>>=1; | |
302 | } | |
303 | tmpDy=dy[1]; | |
304 | for(Int_t r=30;r<60;++r) | |
305 | { | |
306 | kroSingle[r] = tmpDy & 1; | |
307 | tmpDy>>=1; | |
308 | } | |
309 | tmpDy=dy[2]; | |
310 | for(Int_t r=0;r<30;++r) | |
311 | { | |
312 | kroMulti[r] = tmpDy & 1; | |
313 | tmpDy>>=1; | |
314 | } | |
315 | tmpDy=dy[3]; | |
316 | for(Int_t r=30;r<60;++r) | |
317 | { | |
318 | kroMulti[r] = tmpDy & 1; | |
319 | tmpDy>>=1; | |
320 | } | |
321 | contSingle=0; | |
322 | contMulti=0; | |
323 | for(Int_t r=0;r<60;++r) | |
324 | { | |
325 | if(kroSingle[r]==1) | |
326 | { | |
327 | GetRawsData(0)->Fill(r+1); | |
328 | contSingle=contSingle+1; | |
329 | } | |
330 | if(kroMulti[r]==1) | |
331 | { | |
332 | GetRawsData(1)->Fill(r+1); | |
333 | contMulti++; | |
334 | } | |
335 | ||
336 | }GetRawsData(2)->Fill(contSingle);GetRawsData(3)->Fill(contMulti); | |
337 | } | |
338 | ||
339 | ||
340 | ||
341 | } | |
342 | //____________________________________________________________________________ | |
343 | void AliACORDEQADataMaker::MakeRecPoints(TTree * clustersTree) | |
344 | { | |
345 | //fills QA histos for clusters | |
346 | // Not needed for ACORDE by now!!! | |
347 | } | |
348 | ||
349 | //____________________________________________________________________________ | |
350 | void AliACORDEQADataMaker::MakeESDs(AliESDEvent * esd) | |
351 | { | |
352 | //fills QA histos for ESD | |
353 | ||
354 | AliESDACORDE * fESDACORDE= esd->GetACORDEData(); | |
355 | Int_t *fACORDEMultiMuon =fESDACORDE->GetACORDEMultiMuon(); | |
356 | Int_t *fACORDESingleMuon=fESDACORDE->GetACORDESingleMuon(); | |
357 | ||
358 | for(int i=0;i<60;i++){ | |
359 | if(fACORDESingleMuon[i]==1) | |
360 | GetESDsData(0) -> Fill(i); | |
361 | if(fACORDEMultiMuon[i]==1) | |
362 | GetESDsData(1) -> Fill(i); | |
363 | } | |
364 | ||
365 | ||
366 | ||
367 | } | |
368 |