]>
Commit | Line | Data |
---|---|---|
ffb5de4c | 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 | Produces the data needed to calculate the quality assurance. | |
18 | All data must be mergeable objects. | |
19 | S.Radomski Uni-Heidelberg October 2007 | |
20 | */ | |
21 | ||
22 | // --- ROOT system --- | |
23 | #include <TClonesArray.h> | |
24 | #include <TFile.h> | |
25 | #include <TH1D.h> | |
26 | ||
27 | // --- Standard library --- | |
28 | ||
29 | // --- AliRoot header files --- | |
30 | #include "AliESDEvent.h" | |
31 | #include "AliLog.h" | |
32 | #include "AliTRDdigit.h" | |
33 | #include "AliTRDhit.h" | |
34 | #include "AliTRDcluster.h" | |
35 | #include "AliTRDQADataMaker.h" | |
36 | ||
37 | #include "AliTRDRawStreamV2.h" | |
38 | ||
39 | ClassImp(AliTRDQADataMaker) | |
40 | ||
41 | //____________________________________________________________________________ | |
42 | AliTRDQADataMaker::AliTRDQADataMaker() : | |
43 | AliQADataMaker(AliQA::GetDetName(AliQA::kTRD), "TRD Quality Assurance Data Maker") | |
44 | { | |
45 | // ctor | |
46 | } | |
47 | ||
48 | //____________________________________________________________________________ | |
49 | AliTRDQADataMaker::AliTRDQADataMaker(const AliTRDQADataMaker& qadm) : | |
50 | AliQADataMaker() | |
51 | { | |
52 | //copy ctor | |
53 | SetName((const char*)qadm.GetName()) ; | |
54 | SetTitle((const char*)qadm.GetTitle()); | |
55 | } | |
56 | ||
57 | //__________________________________________________________________ | |
58 | AliTRDQADataMaker& AliTRDQADataMaker::operator = (const AliTRDQADataMaker& qadm ) | |
59 | { | |
60 | // Equal operator. | |
61 | this->~AliTRDQADataMaker(); | |
62 | new(this) AliTRDQADataMaker(qadm); | |
63 | return *this; | |
64 | } | |
65 | ||
66 | //____________________________________________________________________________ | |
67 | void AliTRDQADataMaker::EndOfDetectorCycle() | |
68 | { | |
69 | //Detector specific actions at end of cycle | |
70 | } | |
71 | ||
72 | //____________________________________________________________________________ | |
73 | void AliTRDQADataMaker::InitESDs() | |
74 | { | |
75 | //create ESDs histograms in ESDs subdir | |
76 | const Int_t nhist = 1; | |
77 | TH1D *hist[nhist]; | |
78 | ||
79 | hist[0] = new TH1D("qaTRD_esd_bits", ";Bits", 64, -0.5, 63.5); | |
80 | ||
81 | for(Int_t i=0; i<nhist; i++) { | |
82 | //hist[i]->Sumw2(); | |
83 | Add2ESDsList(hist[i], i); | |
84 | } | |
85 | } | |
86 | ||
87 | //____________________________________________________________________________ | |
88 | void AliTRDQADataMaker::InitHits() | |
89 | { | |
90 | // create Hits histograms in Hits subdir | |
91 | const Int_t nhist = 4; | |
92 | TH1D *hist[nhist]; | |
93 | ||
94 | hist[0] = new TH1D("qaTRD_hits_det", ";Detector Id of the hit", 540, -0.5, 539.5) ; | |
95 | ||
96 | hist[1] = new TH1D("qaTRD_hist_Qdrift", ";Charge from tracks", 100, 0, 100); | |
97 | hist[2] = new TH1D("qaTRD_hist_Qamp", ";Charge from TRD photon", 100, 0, 100); | |
98 | hist[3] = new TH1D("qaTRD_hist_Qphoton", ";Charge from TRD photon", 100, 0, 100); | |
99 | ||
100 | for(Int_t i=0; i<nhist; i++) { | |
101 | //hist[i]->Sumw2(); | |
102 | Add2HitsList(hist[i], i); | |
103 | } | |
104 | } | |
105 | ||
106 | //____________________________________________________________________________ | |
107 | void AliTRDQADataMaker::InitDigits() | |
108 | { | |
109 | // create Digits histograms in Digits subdir | |
110 | ||
111 | const Int_t nhist = 3; | |
112 | TH1D *hist[nhist]; | |
113 | ||
114 | hist[0] = new TH1D("qaTRD_digits_det", ";Detector Id of the digit", 540, -0.5, 539.5); | |
115 | hist[1] = new TH1D("qaTRD_digits_time", ";Time bin", 40, -0.5, 39.5); | |
116 | hist[2] = new TH1D("qaTRD_digits_amp", ";Amplitude", 100, 0, 100.); | |
117 | ||
118 | for(Int_t i=0; i<nhist; i++) { | |
119 | hist[i]->Sumw2(); | |
120 | Add2DigitsList(hist[i], i); | |
121 | } | |
122 | ||
123 | } | |
124 | ||
125 | //____________________________________________________________________________ | |
126 | void AliTRDQADataMaker::InitRecPoints() | |
127 | { | |
128 | // create Reconstructed Points histograms in RecPoints subdir | |
129 | const Int_t nhist = 7; | |
130 | TH1D *hist[nhist]; | |
131 | ||
132 | hist[0] = new TH1D("qaTRD_recPoints_det", ";Detector ID of the cluster", 540, -0.5, 539.5); | |
133 | hist[1] = new TH1D("qaTRD_recPoints_amp", ";Amplitude", 200, -0.5, 199.5); | |
134 | hist[2] = new TH1D("qaTRD_recPoints_npad", ";Number of Pads", 12, -0.5, 11.5); | |
135 | hist[3] = new TH1D("qaTRD_recPoints_dist2", ";residuals [2pad]", 100, -1, 1); | |
136 | hist[4] = new TH1D("qaTRD_recPoints_dist3", ";residuals [3pad]", 100, -1, 1); | |
137 | hist[5] = new TH1D("qaTRD_recPoints_dist4", ";residuals [4pad]", 100, -1, 1); | |
138 | hist[6] = new TH1D("qaTRD_recPoints_dist5", ";residuals [5pad]", 100, -1, 1); | |
139 | ||
140 | for(Int_t i=0; i<nhist; i++) { | |
141 | //hist[i]->Sumw2(); | |
142 | Add2RecPointsList(hist[i], i); | |
143 | } | |
144 | } | |
145 | ||
146 | //____________________________________________________________________________ | |
147 | void AliTRDQADataMaker::InitRaws() | |
148 | { | |
149 | // create Raws histograms in Raws subdir | |
150 | const Int_t kSM = 18; | |
151 | const Int_t nhist = 6+kSM; | |
152 | TH1D *hist[nhist]; | |
153 | ||
154 | hist[0] = new TH1D("qaTRD_raws_det", ";detector", 540, -0.5, 539.5); | |
155 | hist[1] = new TH1D("qaTRD_raws_sig", ";signal", 100, -0.5, 99.5); | |
156 | hist[2] = new TH1D("qaTRD_raws_sigCentral", "; signal central bin", 100, -0.5, 99.5); | |
157 | hist[3] = new TH1D("qaTRD_raws_sigTail", ";signal cluster", 100, -0.5, 99.5); | |
158 | hist[4] = new TH1D("qaTRD_raws_tiemBin", ";time bin", 40, -0.5, 39.5); | |
159 | hist[5] = new TH1D("qaTRD_rows_smId", ";supermodule", 18, -0.5, 17.5); | |
160 | ||
161 | // one char per ADC chanell | |
162 | const Int_t nADC = 30 * 8 * 16 * 22; | |
163 | for(Int_t i=0; i<kSM; i++) | |
164 | hist[6+i] = new TH1D(Form("qaTRD_raws_sm%d",i),"",nADC, -0.5, nADC-0.5); | |
165 | ||
166 | for(Int_t i=0; i<nhist; i++) { | |
167 | //hist[i]->Sumw2(); | |
168 | Add2RawsList(hist[i], i); | |
169 | } | |
170 | } | |
171 | ||
172 | //____________________________________________________________________________ | |
173 | void AliTRDQADataMaker::InitSDigits() | |
174 | { | |
175 | // create SDigits histograms in SDigits subdir | |
176 | ||
177 | const Int_t nhist = 2; | |
178 | TH1D *hist[nhist]; | |
179 | ||
180 | hist[0] = new TH1D("qaTRD_digits_det", ";Detector Id of the digit", 540, -0.5, 539.5); | |
181 | hist[1] = new TH1D("qaTRD_digits_amp", ";Amplitude", 100, -0.5, 99.5); | |
182 | ||
183 | for(Int_t i=0; i<nhist; i++) { | |
184 | hist[i]->Sumw2(); | |
185 | Add2SDigitsList(hist[i], i); | |
186 | } | |
187 | } | |
188 | ||
189 | //____________________________________________________________________________ | |
190 | void AliTRDQADataMaker::MakeESDs(AliESDEvent * esd) | |
191 | { | |
192 | // make QA data from ESDs | |
193 | ||
194 | Int_t nTracks = esd->GetNumberOfTracks(); | |
195 | ||
196 | for(Int_t i=0; i<nTracks; i++) { | |
197 | ||
198 | AliESDtrack *track = esd->GetTrack(i); | |
199 | UInt_t status = track->GetStatus(); | |
200 | UInt_t u = 1; | |
201 | for(Int_t bit=0; bit<64; bit++) | |
202 | if (u<<bit & status) GetESDsData(0)->Fill(bit); | |
203 | } | |
204 | } | |
205 | ||
206 | //____________________________________________________________________________ | |
207 | void AliTRDQADataMaker::MakeHits(TClonesArray * hits) | |
208 | { | |
209 | //make QA data from Hits | |
210 | //printf("making QA for TRD hits from an array %d\n", hits->GetEntriesFast()); | |
211 | ||
212 | TIter next(hits); | |
213 | AliTRDhit * hit; | |
214 | ||
215 | while ( (hit = dynamic_cast<AliTRDhit *>(next())) ) { | |
216 | GetHitsData(0)->Fill(hit->GetDetector()); | |
217 | Double_t q = TMath::Abs(hit->GetCharge()); | |
218 | ||
219 | if (hit->FromDrift()) GetHitsData(1)->Fill(q); | |
220 | if (hit->FromAmplification()) GetHitsData(2)->Fill(q); | |
221 | if (hit->FromTRphoton()) GetHitsData(3)->Fill(q); | |
222 | } | |
223 | ||
224 | } | |
225 | //____________________________________________________________________________ | |
226 | void AliTRDQADataMaker::MakeHits(TTree * hitTree) | |
227 | { | |
228 | //make QA data from Hits | |
229 | //printf("making QA for TRD hits from a tree\n"); | |
230 | ||
231 | if (!CheckPointer(hitTree, "TRD hits tree")) return; | |
232 | ||
233 | TBranch *branch = hitTree->GetBranch("TRD"); | |
234 | if (!CheckPointer(branch, "TRD hits branch")) return; | |
235 | ||
236 | Int_t nhits = (Int_t)(hitTree->GetTotBytes()/sizeof(AliTRDhit)); | |
237 | TClonesArray *hits = new TClonesArray("AliTRDhit", nhits+1000); | |
238 | TClonesArray *tmp = new TClonesArray("AliTRDhit", 1000); | |
239 | branch->SetAddress(&tmp); | |
240 | ||
241 | Int_t index = 0; | |
242 | Int_t nEntries = (Int_t)branch->GetEntries(); | |
243 | for(Int_t i = 0; i < nEntries; i++) { | |
244 | branch->GetEntry(i); | |
245 | Int_t nHits = (Int_t)tmp->GetEntries(); | |
246 | for(Int_t j=0; j<nHits; j++) { | |
247 | AliTRDhit *hit = (AliTRDhit*)tmp->At(j); | |
248 | new((*hits)[index++]) AliTRDhit(*hit); | |
249 | } | |
250 | } | |
251 | ||
252 | tmp->Delete(); | |
253 | delete tmp; | |
254 | MakeHits(hits); | |
255 | } | |
256 | //____________________________________________________________________________ | |
257 | void AliTRDQADataMaker::MakeDigits(TClonesArray * digits) | |
258 | { | |
259 | // makes data from Digits | |
260 | ||
261 | TIter next(digits) ; | |
262 | AliTRDdigit * digit ; | |
263 | while ( (digit = dynamic_cast<AliTRDdigit *>(next())) ) { | |
264 | GetDigitsData(0)->Fill(digit->GetDetector()); | |
265 | GetDigitsData(1)->Fill(digit->GetTime()); | |
266 | GetDigitsData(2)->Fill(digit->GetAmp()); | |
267 | } | |
268 | } | |
269 | ||
270 | //____________________________________________________________________________ | |
271 | void AliTRDQADataMaker::MakeSDigits(TClonesArray * sdigits) | |
272 | { | |
273 | // makes data from Digits | |
274 | ||
275 | TIter next(sdigits) ; | |
276 | AliTRDdigit * digit ; | |
277 | while ( (digit = dynamic_cast<AliTRDdigit *>(next())) ) { | |
278 | GetDigitsData(0)->Fill(digit->GetDetector()); | |
279 | GetDigitsData(1)->Fill(digit->GetAmp()); | |
280 | } | |
281 | } | |
282 | ||
283 | //____________________________________________________________________________ | |
284 | void AliTRDQADataMaker::MakeRaws(AliRawReader* rawReader) | |
285 | { | |
286 | // 157 | |
287 | // T9 -- T10 | |
288 | ||
289 | //const Int_t kSM = 18; | |
290 | //const Int_t kROC = 30; | |
291 | const Int_t kROB = 8; | |
292 | //const Int_t kLayer = 6; | |
293 | //const Int_t kStack = 5; | |
294 | const Int_t kMCM = 16; | |
295 | const Int_t kADC = 22; | |
296 | ||
297 | AliTRDRawStreamV2 *raw = new AliTRDRawStreamV2(rawReader); | |
298 | ||
299 | raw->SetRawVersion(3); | |
300 | raw->Init(); | |
301 | ||
302 | while (raw->Next()) { | |
303 | ||
304 | GetRawsData(0)->Fill(raw->GetDet()); | |
305 | ||
306 | Int_t *sig = raw->GetSignals(); | |
307 | for(Int_t i=0; i<3; i++) GetRawsData(1)->Fill(sig[i]); | |
308 | ||
309 | GetRawsData(2)->Fill(sig[1]); | |
310 | GetRawsData(3)->Fill(sig[0]); | |
311 | GetRawsData(3)->Fill(sig[2]); | |
312 | ||
313 | GetRawsData(4)->Fill(raw->GetTimeBin()); | |
314 | ||
315 | // calculate the index; | |
316 | Int_t sm = raw->GetSM(); | |
317 | Int_t roc = raw->GetROC(); | |
318 | Int_t rob = raw->GetROB(); | |
319 | Int_t mcm = raw->GetMCM(); | |
320 | Int_t adc = raw->GetADC(); | |
321 | ||
322 | Int_t index = roc * (kROB*kMCM*kADC) + rob * (kMCM*kADC) + mcm * kADC + adc; | |
323 | GetRawsData(5)->Fill(sm); | |
324 | //printf("SM = %d\n", sm); | |
325 | GetRawsData(6+sm)->Fill(index); | |
326 | } | |
327 | } | |
328 | ||
329 | //____________________________________________________________________________ | |
330 | void AliTRDQADataMaker::MakeRecPoints(TTree * clustersTree) | |
331 | { | |
332 | ||
333 | // makes data from RecPoints | |
334 | // | |
335 | ||
336 | Int_t nsize = Int_t(clustersTree->GetTotBytes() / (sizeof(AliTRDcluster))); | |
337 | TObjArray *clusterArray = new TObjArray(nsize+1000); | |
338 | ||
339 | TBranch *branch = clustersTree->GetBranch("TRDcluster"); | |
340 | if (!branch) { | |
341 | AliError("Can't get the branch !"); | |
342 | return; | |
343 | } | |
344 | branch->SetAddress(&clusterArray); | |
345 | ||
346 | // Loop through all entries in the tree | |
347 | Int_t nEntries = (Int_t) clustersTree->GetEntries(); | |
348 | Int_t nbytes = 0; | |
349 | AliTRDcluster *c = 0; | |
350 | ||
351 | for (Int_t iEntry = 0; iEntry < nEntries; iEntry++) { | |
352 | ||
353 | // Import the tree | |
354 | nbytes += clustersTree->GetEvent(iEntry); | |
355 | ||
356 | // Get the number of points in the detector | |
357 | Int_t nCluster = clusterArray->GetEntriesFast(); | |
358 | ||
359 | // Loop through all TRD digits | |
360 | for (Int_t iCluster = 0; iCluster < nCluster; iCluster++) { | |
361 | c = (AliTRDcluster *) clusterArray->UncheckedAt(iCluster); | |
362 | ||
363 | GetRecPointsData(0)->Fill(c->GetDetector()); | |
364 | GetRecPointsData(1)->Fill(c->GetQ()); | |
365 | GetRecPointsData(2)->Fill(c->GetNPads()); | |
366 | if (c->GetNPads() < 6) | |
367 | GetRecPointsData(1+c->GetNPads())->Fill(c->GetCenter()); | |
368 | } | |
369 | } | |
370 | ||
371 | delete clusterArray; | |
372 | } | |
373 | ||
374 | //____________________________________________________________________________ | |
375 | void AliTRDQADataMaker::StartOfDetectorCycle() | |
376 | { | |
377 | //Detector specific actions at start of cycle | |
378 | ||
379 | } | |
380 | //__________________________________________________________________________ | |
381 | Int_t AliTRDQADataMaker::CheckPointer(TObject *obj, const char *name) { | |
382 | ||
383 | if (!obj) AliWarning(Form("null pointer: %s", name)); | |
384 | return !!obj; | |
385 | } | |
386 | //__________________________________________________________________________ |