]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/AliTRDqaBlackEvents.cxx
QA update by Sylwester
[u/mrichter/AliRoot.git] / TRD / AliTRDqaBlackEvents.cxx
CommitLineData
0f772b9f 1/**************************************************************************\r
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r
3 * *\r
4 * Author: The ALICE Off-line Project. *\r
5 * Contributors are mentioned in the code where appropriate. *\r
6 * *\r
7 * Permission to use, copy, modify and distribute this software and its *\r
8 * documentation strictly for non-commercial purposes is hereby granted *\r
f5fd37e8 9 * withount fee, provided that the abov copyright notice appears in all *\r
0f772b9f 10 * copies and that both the copyright notice and this permission notice *\r
11 * appear in the supporting documentation. The authors make no claims *\r
12 * about the suitability of this software for any purpose. It is *\r
e508dc19 13 * provided "as is without express or implied warranty. *\r
0f772b9f 14 **************************************************************************/\r
15\r
16/* $Id: AliTRDqaBlackEvents.cxx 23387 2008-01-17 17:25:16Z cblume $ */\r
17\r
18////////////////////////////////////////////////////////////////////////////\r
19// //\r
20// QA of black events //\r
21// //\r
22// Author: //\r
23// Sylwester Radomski (radomski@physi.uni-heidelberg.de) //\r
24// //\r
25////////////////////////////////////////////////////////////////////////////\r
26\r
27#include "TH1D.h"\r
28#include "TH2D.h"\r
27fe785b 29#include "TH2S.h"\r
30#include "TH3F.h"\r
0f772b9f 31#include "TF1.h"\r
32#include "TFile.h"\r
33#include "TCanvas.h"\r
34#include "TPad.h"\r
35#include "TLatex.h"\r
36#include "TStyle.h"\r
e508dc19 37#include "TGraph.h"\r
0f772b9f 38\r
39#include "AliTRDgeometry.h"\r
40#include "AliTRDrawStreamTB.h"\r
41#include "AliTRDqaBlackEvents.h"\r
42\r
43ClassImp(AliTRDqaBlackEvents)\r
44\r
0f772b9f 45///////////////////////////////////////////////////////////////////////////////////////////////////\r
46\r
47AliTRDqaBlackEvents::AliTRDqaBlackEvents() \r
48 :TObject() \r
c29b11ff 49 ,fnEvents(0)\r
27fe785b 50 ,fCreateFull(0)\r
51 ,fThresh(0)\r
52 ,fCount(0)\r
c29b11ff 53 ,fOccupancy(0)\r
27fe785b 54 ,fDetRob(0)\r
55 ,fTBEvent(0)\r
e508dc19 56 ,fRefHistPed(0)\r
57 ,fRefHistNoise(0)\r
58 ,fErrorHC(0)\r
59 ,fErrorMCM(0)\r
60 ,fErrorADC(0)\r
61 ,fErrorSMHC(0)\r
62 ,fErrorSMMCM(0)\r
63 ,fErrorSMADC(0)\r
64 ,fErrorGraphHC(0)\r
65 ,fErrorGraphMCM(0)\r
66 ,fErrorGraphADC(0)\r
67 ,fGraphMCM(0)\r
68 ,fMcmTracks(0)\r
69 ,fMapMCM(0)\r
70 ,fFracMCM(0)\r
71 ,fSMHCped(0)\r
72 ,fSMHCerr(0)\r
73 ,fNoiseTotal(0)\r
74 ,fPP(0)\r
0f772b9f 75 ,fMinNoise(0.5)\r
e508dc19 76 ,fMaxNoise(2)\r
77 ,fFitType(0) \r
78 // ,fRefFileName("")\r
0f772b9f 79{\r
80 //\r
81 // Constructor \r
82 // to create the histograms call Init()\r
83 //\r
e508dc19 84\r
85 strcpy(fRefFileName, "");\r
0f772b9f 86}\r
87\r
88///////////////////////////////////////////////////////////////////////////////////////////////////\r
89\r
90AliTRDqaBlackEvents::AliTRDqaBlackEvents(const AliTRDqaBlackEvents &qa) \r
91 :TObject(qa) \r
c29b11ff 92 ,fnEvents(0)\r
27fe785b 93 ,fCreateFull(0)\r
94 ,fThresh(0)\r
95 ,fCount(0)\r
c29b11ff 96 ,fOccupancy(0)\r
27fe785b 97 ,fDetRob(0)\r
98 ,fTBEvent(0)\r
e508dc19 99 ,fRefHistNoise(0)\r
100 ,fErrorHC(0)\r
101 ,fErrorMCM(0)\r
102 ,fErrorADC(0)\r
103 ,fErrorSMHC(0)\r
104 ,fErrorSMMCM(0)\r
105 ,fErrorSMADC(0)\r
106 ,fErrorGraphHC(0)\r
107 ,fErrorGraphMCM(0)\r
108 ,fErrorGraphADC(0)\r
109 ,fGraphMCM(0)\r
110 ,fMcmTracks(0)\r
111 ,fMapMCM(0)\r
112 ,fFracMCM(0)\r
113 ,fSMHCped(0)\r
114 ,fSMHCerr(0)\r
115 ,fNoiseTotal(0)\r
116 ,fPP(0)\r
0f772b9f 117 ,fMinNoise(0.5)\r
118 ,fMaxNoise(2) \r
e508dc19 119 ,fFitType(0)\r
120 //,fRefFileName("")\r
0f772b9f 121{\r
122 //\r
123 // Copy constructor \r
124 // to create the histograms call Init()\r
125 //\r
e508dc19 126 \r
127 strcpy(fRefFileName, "");\r
0f772b9f 128}\r
129\r
130///////////////////////////////////////////////////////////////////////////////////////////////////\r
131\r
132void AliTRDqaBlackEvents::Init() \r
133{\r
134 //\r
135 // creates histograms \r
136 // \r
137\r
138 //TFile *file = new \r
139 //Info("Init", "Statring");\r
140\r
9b99c029 141 fnEvents = 0;\r
142\r
27fe785b 143 // histograms for chambers\r
e508dc19 144 for(Int_t det=0; det<kDET; det++) {\r
145\r
146 fNPoint[det] = new TH2D(Form("entries_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5);\r
147 fData[det] = new TH3F(Form("data_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5, 50, -0.5, 49.5);\r
148\r
149 // pedestal noise maps using RMS and Fit\r
150 fChPed[det] = new TH2D(Form("ped_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5);\r
151 fChNoise[det] = new TH2D(Form("noise_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5);\r
152 \r
153 //fChPed[det] = new TH2D(Form("ped_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5);\r
154 //fChNoise[det] = new TH2D(Form("noise_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5); \r
155\r
156 // distribution per detector\r
157 fPed[det] = new TH1D(Form("pedDist_%d", det), ";pedestals (ADC counts)", 100, 5, 15);\r
158 fNoise[det] = new TH1D(Form("noiseDist_%d", det), ";noise (ADC counts)", 100, 0, 5); \r
159 fSignal[det] = new TH1D(Form("signal_%d", det), ";signal (ADC counts)", 100, -0.5, 99.5);\r
160 fChPP[det] = new TH1D(Form("pp_%d", det), ";pp (ADC)", 200, -0.5, 199.5);\r
f5fd37e8 161\r
e508dc19 162 fnEntriesRM[det] = new TH2D(Form("entriesRM_%d", det), ";ROB,MCM", 8, -0.5, 7.5, 16, -0.5, 15.5);\r
163 \r
164 // histograms after reference subtraction\r
165 fChPedRes[det] = new TH2D(Form("pedRef_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5);\r
166 fChNoiseRes[det] = new TH2D(Form("noiseRef_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5);\r
f5fd37e8 167\r
e508dc19 168\r
169 // error codes\r
170 fErrorLocMCM[det] = new TH2D(Form("errorLocMCM_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5);\r
171 fErrorLocADC[det] = new TH2D(Form("errorLocADC_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5); \r
172 fErrorLocHC[det] = new TH2D(Form("errorLocHC_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5);\r
0f772b9f 173 }\r
174\r
27fe785b 175 // histogram for each MCM\r
176 for(Int_t i=0; i < kDET * kROB * kMCM; i++)\r
177 fFullCounter[i] = 0;\r
178\r
179 // histograms from the whole detector\r
9b99c029 180 fOccupancy = new TH1D("occupancy", "", 20, -0.5, 19.5);\r
27fe785b 181 fDetRob = new TH2D("DetRob", ";detector;ROB", kDET, -0.5, 539.5, 8, -0.5, 7.5);\r
182 fTBEvent = new TH2D("tbEvent", ";event ID;time bin", 100, -0.5, 99.5, 30, -0.5, 29.5);\r
9b99c029 183\r
e508dc19 184 // errors statistics and location\r
185 fErrorHC = new TH1D("errorHC", ";error ID;", 7, -0.5, 6.5);\r
186 fErrorMCM = new TH1D("errorMCM", ";error ID;", 7, -0.5, 6.5);\r
187 fErrorADC = new TH1D("errorADC", ";error ID;", 7, -0.5, 6.5);\r
188 \r
189 fErrorSMHC = new TH1D("errorSM_HC", ";SM id", 18, -0.5, 17.5);\r
190 fErrorSMMCM = new TH1D("errorSM_MCM", ";SM id", 18, -0.5, 17.5);\r
191 fErrorSMADC = new TH1D("errorSM_ADC", ";SM id", 18, -0.5, 17.5);\r
192\r
193\r
194 fErrorGraphHC = new TGraph();\r
195 fErrorGraphMCM = new TGraph();\r
196 fErrorGraphADC = new TGraph();\r
197\r
198 fGraphMCM = new TGraph();\r
199 \r
200 fMapMCM = new TH2D("mapMCM", ";det;mcm", 540, -0.5, 539.5, kROB*kMCM, -0.5, kROB*kMCM-0.5);\r
201 fFracMCM = new TH1D("fracMCM", ";frequency", 100, 0, 1);\r
202 \r
203\r
204 fErrorGraphHC->GetHistogram()->SetTitle("Error HC;event number;fraction with error (%)");\r
205 fErrorGraphMCM->GetHistogram()->SetTitle("Error MCM;event number;fraction with error (%)");\r
206 fErrorGraphADC->GetHistogram()->SetTitle("Error ADC;event number;fraction with error (%)"); \r
207\r
208\r
209 fSMHCped = new TH2D("smHcPed", ";super module;half chamber", 18, -0.5, 17.5, 60, -0.5, 59.5);\r
210 //fSMHCerr = 0;\r
211\r
0f772b9f 212 //Info("Init", "Done");\r
e508dc19 213\r
214 // number of ADC channels fired per SM and in total\r
215 for(Int_t sm=0; sm<kSM+1; sm++)\r
216 fNumberADC[sm] = new TGraph();\r
217\r
218 //\r
219 fNoiseTotal = new TH1D("noiseTotal", "noise (ADC)", 250, 0, 10);\r
220 fPP = new TH1D("peakPeak", "p-p (ADC)", 200, -0.5, 199.5);\r
221\r
222 for(Int_t sm=0; sm<kSM; sm++) {\r
223 fSmNoiseRms[sm] = new TH1D(Form("noiseRms_sm%d", sm), ";noise from RMS (ADC)", 100, 0, 10);\r
224 fSmNoiseFit[sm] = new TH1D(Form("noiseFit_sm%d", sm), ";noise frim Fit (ADC)", 100, 0, 10);\r
225 fSmPP[sm] = new TH1D(Form("peakPeak_sm%d", sm), ";peak-peak (ADC)", 200, -0.5, 199.5); \r
226 }\r
227\r
228 fMcmTracks = new TObjArray();\r
0f772b9f 229}\r
230\r
231\r
232///////////////////////////////////////////////////////////////////////////////////////////////////\r
233\r
234void AliTRDqaBlackEvents::Reset() \r
235{\r
236 //\r
237 // Resets the histograms\r
238 //\r
239\r
27fe785b 240 for(Int_t i=0; i<kDET; i++) {\r
0f772b9f 241 fData[i]->Reset();\r
242 fChPed[i]->Reset();\r
243 fChNoise[i]->Reset();\r
244 }\r
245}\r
246\r
e508dc19 247\r
248///////////////////////////////////////////////////////////////////////////////////////////////////\r
249\r
250void AliTRDqaBlackEvents::SetRefFile(const char *filename) {\r
251 \r
252 strcpy(fRefFileName, filename);\r
253}\r
254\r
255///////////////////////////////////////////////////////////////////////////////////////////////////\r
256\r
257void AliTRDqaBlackEvents::ReadRefHists(Int_t det) {\r
258 \r
259 fRefHistPed = 0;\r
260 fRefHistNoise = 0;\r
261 \r
262 TFile *file = 0;\r
263 if (fRefFileName) TFile::Open(fRefFileName);\r
264 if (!file) return;\r
265\r
266 fRefHistPed = (TH2D*)file->Get(Form("ped_%d",det));\r
267 fRefHistNoise = (TH2D*)file->Get(Form("noise_%d", det));\r
268\r
269 if (file) file->Close();\r
270}\r
271\r
0f772b9f 272///////////////////////////////////////////////////////////////////////////////////////////////////\r
273\r
274Int_t AliTRDqaBlackEvents::AddEvent(AliTRDrawStreamTB *data) \r
275{\r
276 //\r
277 // Add an event\r
278 //\r
279\r
27fe785b 280 // structure to keep track if particular chanel is used\r
281 Char_t isUsed[kDET][kCOL][kPAD]; \r
282 for(Int_t i=0; i<kDET; i++)\r
283 for(Int_t j=0; j<kCOL; j++)\r
284 for(Int_t k=0; k<kPAD; k++)\r
285 isUsed[i][j][k] = 0;\r
9b99c029 286 \r
e508dc19 287\r
288 // clear the mcm data\r
289 for(Int_t i=0; i < kDET * kROB * kMCM; i++) {\r
290 if (fFullSignal[i]) fFullSignal[i]->Reset();\r
291 fFullCounter[i] = 0;\r
292 }\r
293\r
0f772b9f 294 Int_t nb = 0;\r
e508dc19 295 \r
296 Int_t lastdet = -1;\r
297 Int_t lastside = -1;\r
298 Int_t lastmcm = -1;\r
299\r
300 Int_t rob_last = -1;\r
301 Int_t mcm_last = -1;\r
302\r
303 Int_t nGoodHC = 0;\r
304 Int_t nGoodMCM = 0;\r
305 Int_t nGoodADC = 0;\r
306\r
307 Int_t nErrorHC = 0;\r
308 Int_t nErrorMCM = 0;\r
309 Int_t nErrorADC = 0;\r
310 \r
311\r
312 //Int_t adc_last = -1;\r
313 // Int_t sm_01 = -1;\r
314 \r
315 // number of ADCs per SM\r
316 Int_t nADCinSM[kSM+1];\r
317 for(Int_t sm=0; sm<kSM+1; sm++) nADCinSM[sm] = 0;\r
318\r
319\r
c29b11ff 320\r
0f772b9f 321 while (data->Next()) {\r
322\r
e508dc19 323 Int_t sm = data->GetSM();\r
324 Int_t layer = data->GetLayer();\r
325 Int_t stack = data->GetStack();\r
326\r
0f772b9f 327 Int_t det = data->GetDet();\r
e508dc19 328 Int_t side = data->GetSide();\r
f5fd37e8 329\r
9b99c029 330 Int_t row = data->GetRow();\r
331 Int_t col = data->GetCol();\r
f5fd37e8 332\r
c29b11ff 333 Int_t rob = data->GetROB();\r
334 Int_t mcm = data->GetMCM();\r
27fe785b 335 Int_t adc = data->GetADC();\r
f5fd37e8 336\r
e508dc19 337 \r
0f772b9f 338 Int_t *sig = data->GetSignals();\r
339 nb++;\r
340\r
e508dc19 341 nADCinSM[sm]++;\r
342 nADCinSM[kSM]++;\r
343 \r
27fe785b 344 // memory coruption protection\r
345 if (det<0 || det>=kDET) continue;\r
9b99c029 346 \r
e508dc19 347 // check errors\r
348 \r
349 // tests\r
350 //fErrorHC->Fill(data->GetHCErrorCode());\r
351 if (data->GetMCMErrorCode() > 0) fErrorLocMCM[det]->Fill(row, col);\r
352 if (data->GetADCErrorCode() > 0) fErrorLocADC[det]->Fill(row, col); \r
353\r
354 // new HC found\r
355 if ((det + side*kDET) != (lastdet + lastside*kDET)) {\r
356 Int_t code = data->GetHCErrorCode();\r
357 // if (code) { \r
358 fErrorHC->Fill(code);\r
359 \r
360 if (code) fErrorSMHC->Fill(sm);\r
361 if (code) nErrorHC++;\r
362 nGoodHC++;\r
363\r
364 //Int_t mask = 1;\r
365 //for(Int_t cc = 0; cc < 3; cc++) {\r
366 // if (code & mask) fErrorHC->Fill(cc);\r
367 // cc *= 2;\r
368 // }\r
369 //}\r
370 }\r
371 lastdet = det;\r
372 lastside = side;\r
373 \r
374 // new MCM found \r
375 if (mcm != lastmcm){\r
376 Int_t code = data->GetMCMErrorCode();\r
377 fErrorMCM->Fill(code);\r
378\r
379 if (code) fErrorSMMCM->Fill(sm);\r
380 if (code) nErrorMCM++;\r
381 nGoodMCM++;\r
382 }\r
383 lastmcm = mcm;\r
384 \r
385 // new ADC channel found\r
386 Int_t code = data->GetADCErrorCode();\r
387 fErrorADC->Fill(code);\r
388 if (code) fErrorSMADC->Fill(sm);\r
389 if (code) nErrorADC++;\r
390 nGoodADC++;\r
391\r
392 // end of error checking\r
393 \r
27fe785b 394 // check the ROBs\r
395 fDetRob->Fill(det, rob, 1./(kMCM*18));\r
9b99c029 396 isUsed[det][row][col]++;\r
397\r
27fe785b 398 // check if mcm signal is continuus\r
c29b11ff 399 if ((rob_last != rob) || (mcm_last != mcm)) {\r
400 rob_last = rob;\r
401 mcm_last = mcm;\r
402 fnEntriesRM[det]->Fill(rob,mcm);\r
403 }\r
27fe785b 404 \r
405 // number of entries for each channels\r
9b99c029 406 fNPoint[det]->Fill(row, col);\r
0f772b9f 407 \r
27fe785b 408\r
409 // create a structure for an MCM if needed\r
410 Int_t mcmIndex = det * (kMCM * kROB) + rob * kMCM + mcm;\r
411 if (fCreateFull && !fFullSignal[mcmIndex])\r
e508dc19 412 fFullSignal[mcmIndex] = new TH2S(Form("mcm_%d_%d_%d_%d_%d", sm, stack, layer, rob, mcm), \r
413 Form("mcm-%d-%d-%d-%d-%d;ADC;time bin", sm, stack, layer, rob, mcm),\r
27fe785b 414 21, -0.5, 20.5, 30, -0.5, 29.5);\r
415 \r
416\r
417 // loop over Time Bins and fill histograms\r
e508dc19 418 Int_t minV = 1024;\r
419 Int_t maxV = 0;\r
420\r
27fe785b 421 for(Int_t k=0; k<kTB; k++) { /// to be corrected\r
422\r
e508dc19 423 //if (data->GetADCErrorCode() > 0) continue;\r
424\r
425 //if (col == 0 || col == 143)\r
426 //printf("TB: %d %d %d\n", row, col, sig[k]);\r
427\r
27fe785b 428 //if (sig[k] < 1) \r
429 //printf("det = %d rob = %d mcm = %d adc = %d k = %d S = %d\n", det, rob, mcm, adc, k, sig[k]);\r
430 \r
0f772b9f 431 fSignal[det]->Fill(sig[k]);\r
9b99c029 432 fData[det]->Fill(row, col, sig[k]);\r
27fe785b 433 \r
e508dc19 434 minV = (minV < sig[k]) ? minV : sig[k];\r
435 maxV = (maxV > sig[k]) ? maxV : sig[k];\r
436\r
437\r
27fe785b 438 // check if data strange enought\r
439 if (fCreateFull && fFullSignal[mcmIndex]) {\r
e508dc19 440 //if (sm == 17 && )\r
441 //if (det != 29) {\r
27fe785b 442 if (sig[k] > fThresh || sig[k] < 1) fFullCounter[mcmIndex]++;\r
e508dc19 443 //if (sig[k] < 1) fFullCounter[mcmIndex] = 0; // remove austrian flag \r
444 //}\r
27fe785b 445 fFullSignal[mcmIndex]->Fill(adc, k, sig[k]);\r
446 }\r
447 \r
448 // noisy chamber\r
e508dc19 449 if (det == 29 && col > 7) {\r
27fe785b 450 fTBEvent->Fill(fnEvents, k, sig[k]);\r
451 }\r
0f772b9f 452 }\r
e508dc19 453 \r
454 fPP->Fill(maxV-minV);\r
455 fChPP[det]->Fill(maxV-minV);\r
456 fSmPP[sm]->Fill(maxV-minV);\r
0f772b9f 457 }\r
9b99c029 458 \r
27fe785b 459 // is the dead-alive status changing during the run\r
460 for(Int_t i=0; i<kDET; i++) {\r
461 for(Int_t j=0; j<kCOL; j++)\r
462 for(Int_t k=0; k<kPAD; k++)\r
9b99c029 463 fOccupancy->Fill(isUsed[i][j][k]);\r
464 }\r
0f772b9f 465\r
e508dc19 466 // save interesting histos\r
467 Int_t mcmTrackCandidate = 0;\r
468 for(Int_t i = 0; i < kDET * kROB * kMCM; i++) { \r
469 if (fFullCounter[i] && fFullSignal[i] && CheckMCM(i) ) {\r
470 \r
471 fMcmTracks->AddLast(fFullSignal[i]->Clone(Form("event_%d_%s", fnEvents, fFullSignal[i]->GetName())));\r
472 mcmTrackCandidate++;\r
473 \r
474 Int_t mcmTrackletDet = i/(kROB * kMCM); \r
475 Int_t mcmTrackletMcm = i%(kROB * kMCM);\r
476 fMapMCM->Fill(mcmTrackletDet, mcmTrackletMcm);\r
477 }\r
478 }\r
479 \r
480 fGraphMCM->SetPoint(fnEvents, fnEvents, mcmTrackCandidate);\r
481 printf("Number of MCM track candidates = %d\n", mcmTrackCandidate);\r
482 \r
483\r
484 // update fraction of error graphs\r
485 Double_t err;\r
486\r
487 err = (nGoodHC > 0)? 100.*nErrorHC/nGoodHC : -1;\r
488 fErrorGraphHC->SetPoint(fnEvents, fnEvents, err);\r
489 \r
490 err = (nGoodMCM > 0)? 100.*nErrorMCM/nGoodMCM : -1;\r
491 fErrorGraphMCM->SetPoint(fnEvents, fnEvents, err);\r
492 \r
493 err = (nGoodADC > 0)? 100.*nErrorADC/nGoodADC : -1;\r
494 fErrorGraphADC->SetPoint(fnEvents, fnEvents, err);\r
495\r
496 // number of fired ADC per SM\r
497 for(Int_t sm=0; sm<kSM+1; sm++) \r
498 fNumberADC[sm]->SetPoint(fnEvents, fnEvents, nADCinSM[sm]);\r
499\r
500\r
9b99c029 501 fnEvents++;\r
0f772b9f 502 return nb;\r
503}\r
504\r
505///////////////////////////////////////////////////////////////////////////////////////////////////\r
506\r
507void AliTRDqaBlackEvents::Process(const char *filename) \r
508{\r
509 //\r
510 // Process something\r
511 //\r
e508dc19 512 \r
513 char fn[256];\r
514 strcpy(fn, filename);\r
515 \r
516 //printf("FILENAME = %s (%s)\n", filename, fn);\r
0f772b9f 517\r
27fe785b 518 Int_t map[kDET];\r
0f772b9f 519 \r
520 TH1D *hist = new TH1D("fitSignal", "", 50, -0.5, 49.5);\r
521 TF1 *fit = new TF1("fit", "gaus(0)", 0, 20);\r
522 fit->SetParameters(1e3, 10, 1);\r
523 \r
e508dc19 524 for(Int_t det=0; det<kDET; det++) {\r
525\r
526 //printf("processing chamber %d\n", det); \r
0f772b9f 527\r
e508dc19 528 map[det] = 0;\r
529 if (fData[det]->GetSum() < 10) continue;\r
530 map[det] = 1;\r
0f772b9f 531\r
e508dc19 532 // read reference distributions\r
533 ReadRefHists(det);\r
534\r
535 for(Int_t row=0; row<fData[det]->GetXaxis()->GetNbins(); row++) {\r
536 for(Int_t pad=0; pad<fData[det]->GetYaxis()->GetNbins(); pad++) {\r
0f772b9f 537 \r
538 // project the histogramm\r
539 hist->Reset();\r
540 for(Int_t bb=0; bb<50; bb++) {\r
e508dc19 541 Int_t dataBin = fData[det]->FindBin(row, pad, bb);\r
542 Double_t v = fData[det]->GetBinContent(dataBin);\r
0f772b9f 543 hist->SetBinContent(bb+1, v);\r
544 }\r
545\r
e508dc19 546 Int_t bin = fChPed[det]->FindBin(row, pad);\r
0f772b9f 547\r
9b99c029 548 if (hist->GetSum() > 1) {\r
549 \r
550 Double_t ped = 0, noise = 0;\r
551\r
552 if (fFitType == 0) {\r
553 fit->SetParameters(1e3, 10, 1);\r
554 hist->Fit(fit, "q0", "goff", 0, 20);\r
555 TF1 *f = hist->GetFunction("fit");\r
556 ped = TMath::Abs(f->GetParameter(1));\r
557 noise = TMath::Abs(f->GetParameter(2));\r
e508dc19 558 fSmNoiseFit[det/30]->Fill(noise);\r
9b99c029 559 } else {\r
560 ped = hist->GetMean();\r
561 noise = hist->GetRMS();\r
e508dc19 562 fSmNoiseRms[det/30]->Fill(noise);\r
563 //if (pad == 0)\r
564 // printf("data %f %f %f\n", hist->GetSum(), ped, noise);\r
9b99c029 565 }\r
0f772b9f 566\r
e508dc19 567 fChPed[det]->SetBinContent(bin, ped);\r
568 fChNoise[det]->SetBinContent(bin, noise);\r
569 fNoiseTotal->Fill(noise);\r
570\r
571 // subtract reference values\r
572 Double_t refped = 0;\r
573 Double_t refnoise = 0;\r
0f772b9f 574 \r
e508dc19 575 if (fRefHistPed) refped = fRefHistPed->GetBinContent(bin);\r
576 if (fRefHistNoise) refnoise = fRefHistPed->GetBinContent(bin);\r
577\r
578 fChPedRes[det]->SetBinContent(bin, ped-refped);\r
579 fChNoiseRes[det]->SetBinContent(bin, noise-refnoise);\r
580 \r
581 fPed[det]->Fill(ped);\r
582 fNoise[det]->Fill(noise);\r
583\r
584 // fill SM-HC plot\r
585 Int_t sm = det / 30;\r
586 Int_t hc = (pad < kPAD/2) ? 2* (det % 30) : 2* (det % 30) + 1;\r
587 if (ped > 9. && ped < 11) fSMHCped->Fill(sm, hc, 1./1152.); // number of pads in HC\r
0f772b9f 588\r
589 } else {\r
e508dc19 590 \r
591 // not enought data found \r
592 fChPed[det]->SetBinContent(bin, 0);\r
593 fChNoise[det]->SetBinContent(bin, 0);\r
594 fChPedRes[det]->SetBinContent(bin, 0);\r
595 fChNoiseRes[det]->SetBinContent(bin, 0);\r
0f772b9f 596 }\r
597 \r
598 //delete hist;\r
599 }\r
600 }\r
601 }\r
602\r
e508dc19 603\r
604 //printf("Number of events = %d\n", fnEvents);\r
9b99c029 605\r
c29b11ff 606 // normalize number of entries histos\r
9b99c029 607 Int_t max = 0;\r
27fe785b 608 for(Int_t i=0; i<kDET; i++) { \r
9b99c029 609 if (!map[i]) continue;\r
610 for(Int_t j=0; j<fNPoint[i]->GetXaxis()->GetNbins(); j++) {\r
611 for(Int_t k=0; k<fNPoint[i]->GetYaxis()->GetNbins(); k++) {\r
612 Int_t dataBin = fNPoint[i]->FindBin(j, k);\r
613 Double_t v = fNPoint[i]->GetBinContent(dataBin);\r
614 if (v > max) max = (Int_t)v;\r
615 }\r
616 }\r
617 }\r
618 \r
27fe785b 619 char entriesDistName[100];\r
e508dc19 620\r
27fe785b 621 for(Int_t i=0; i<kDET; i++) {\r
9b99c029 622 \r
623 if (!map[i]) continue;\r
624 \r
27fe785b 625 sprintf(entriesDistName, "entriesDist_%d", i);\r
626 fNPointDist[i] = new TH1D(entriesDistName, ";number of events", max+2, -0.5, max+1.5);\r
9b99c029 627 \r
628 for(Int_t j=0; j<fNPoint[i]->GetXaxis()->GetNbins(); j++) {\r
629 for(Int_t k=0; k<fNPoint[i]->GetYaxis()->GetNbins(); k++) {\r
630 Int_t dataBin = fNPoint[i]->FindBin(j, k);\r
631 Double_t v = fNPoint[i]->GetBinContent(dataBin);\r
632 //if (v > fnEvents) printf("N = %d V = %lf\n", fnEvents, v);\r
633 fNPointDist[i]->Fill(v); \r
634 }\r
635 }\r
636 \r
637 fNPoint[i]->Scale(1./fnEvents);\r
638 }\r
639 \r
f5fd37e8 640\r
27fe785b 641 for(Int_t i=0; i<kDET; i++) {\r
c29b11ff 642 fnEntriesRM[i]->SetMaximum(fnEvents * 1.5);\r
643 }\r
644\r
27fe785b 645 // save histograms\r
646\r
e508dc19 647 //printf("FILENAME 2 = %s (%d)\n", fn, fn);\r
648 TFile *file = new TFile(fn, "recreate");\r
649 for(Int_t det = 0; det < kDET; det++) {\r
650 if (!map[det]) continue; \r
651 fChPed[det]->Write();\r
652 fChNoise[det]->Write();\r
653 fNPoint[det]->Write();\r
654 fNPointDist[det]->Write();\r
655 fPed[det]->Write();\r
656 fNoise[det]->Write();\r
657 fSignal[det]->Write();\r
658 fnEntriesRM[det]->Write();\r
659 fChPP[det]->Write();\r
660\r
661 fChPedRes[det]->Write();\r
662 fChNoiseRes[det]->Write();\r
663\r
664 // save error hists\r
665 fErrorLocMCM[det]->SetMinimum(0);\r
666 fErrorLocMCM[det]->SetMaximum(fnEvents);\r
667 fErrorLocMCM[det]->Write();\r
668\r
669 fErrorLocADC[det]->SetMinimum(0);\r
670 fErrorLocADC[det]->SetMaximum(fnEvents);\r
671 fErrorLocADC[det]->Write();\r
672 }\r
673\r
674 for(Int_t sm=0; sm<kSM; sm++) {\r
675 fSmNoiseRms[sm]->Write();\r
676 fSmNoiseFit[sm]->Write();\r
677 fSmPP[sm]->Write();\r
0f772b9f 678 }\r
27fe785b 679\r
e508dc19 680\r
681\r
27fe785b 682 Int_t nMcm = 0;\r
683 for(Int_t i=0; i < kDET * kROB * kMCM; i++) {\r
684 if (fFullSignal[i] && fFullCounter[i] > fCount) {\r
685 fFullSignal[i]->Write();\r
686 nMcm++;\r
687 }\r
688 }\r
689\r
690 printf("Number of saved MCMs = %d\n", nMcm);\r
e508dc19 691 \r
692 fMcmTracks->Write();\r
693 printf("Number of tracks = %d\n", fMcmTracks->GetEntries());\r
694 \r
695 // permanently problematic MCMs\r
696 for(Int_t det=0; det<kDET; det++) {\r
697 for(Int_t mcm=0; mcm<kROB*kMCM; mcm++) {\r
698 \r
699 Int_t mRob = mcm / kMCM;\r
700 Int_t mMcm = mcm % kMCM;\r
701 Int_t bin = fMapMCM->FindBin(det, mcm);\r
702 Double_t frac = 1. * fMapMCM->GetBinContent(bin) / fnEvents; \r
703 fFracMCM->Fill(frac);\r
704 \r
705 if (frac > 0.7) {\r
706 printf("{%d, %d, %d}, \n", det, mRob, mMcm, frac);\r
707 } \r
708 }\r
709 }\r
710\r
711\r
27fe785b 712\r
9b99c029 713 fOccupancy->Write();\r
27fe785b 714 fDetRob->Write();\r
715 fTBEvent->Write();\r
e508dc19 716 \r
717 // error hists\r
718 fErrorHC->Write();\r
719 fErrorMCM->Write();\r
720 fErrorADC->Write();\r
721\r
722 fErrorSMHC->Write();\r
723 fErrorSMMCM->Write();\r
724 fErrorSMADC->Write(); \r
725 \r
726 // write graphs\r
727 fErrorGraphHC->Write("trendErrorHC");\r
728 fErrorGraphMCM->Write("trendErrorMCM");\r
729 fErrorGraphADC->Write("trendErrorADC");\r
730 \r
731 fGraphMCM->Write("trendMCM");\r
732\r
733 fMapMCM->SetMaximum(fnEvents);\r
734 fMapMCM->Write();\r
735 fFracMCM->Write();\r
736 \r
737 fSMHCped->Write();\r
738\r
739 for(Int_t sm=0; sm<kSM; sm++)\r
740 fNumberADC[sm]->Write(Form("nADCinSM%d",sm));\r
741 \r
742 fNumberADC[kSM]->Write("nADCinEvent");\r
743\r
744 fNoiseTotal->Write();\r
745 fPP->Write();\r
746\r
0f772b9f 747 file->Close();\r
748 delete file;\r
749}\r
750\r
751///////////////////////////////////////////////////////////////////////////////////////////////////\r
752\r
e508dc19 753Int_t AliTRDqaBlackEvents::CheckMCM(Int_t index) {\r
754 \r
755 return 1;\r
756 \r
757 static Int_t data[21][3] = {\r
758 {1, 0, 1}, \r
759 {242, 0, 0}, \r
760 {242, 0, 1}, \r
761 {242, 0, 2}, \r
762 {242, 0, 4}, \r
763 {242, 0, 5}, \r
764 {242, 0, 6}, \r
765 {242, 0, 8}, \r
766 {242, 0, 12}, \r
767 {251, 7, 7}, \r
768 {254, 3, 11}, \r
769 {259, 3, 14}, \r
770 {260, 1, 9}, \r
771 {260, 3, 15}, \r
772 {273, 1, 7}, \r
773 {273, 1, 15}, \r
774 {276, 5, 11}, \r
775 {280, 6, 2}, \r
776 {299, 6, 4}, \r
777 {511, 2, 9}, \r
778 {517, 7, 15}\r
779 };\r
780 \r
781 for(Int_t i=0; i<21; i++) {\r
782 Int_t wIndex = data[i][0] * kROB*kMCM + data[i][1] * kMCM + data[i][2];\r
783 if (index == wIndex) return 0;\r
784 }\r
785\r
786 return 1;\r
787}\r
788\r
789///////////////////////////////////////////////////////////////////////////////////////////////////\r
790\r
791\r
792\r
793\r
794\r
795\r
796\r
0f772b9f 797void AliTRDqaBlackEvents::DrawChamber(const char *filename, Int_t det, Int_t w, Int_t h) \r
798{\r
799 //\r
800 // Draw raport for one chamber: \r
801 // pedestal map, noise map, distribution of pedestal and noise\r
802 // \r
803 // input:\r
804 // name of the file with histograms (created with Process())\r
805 // detector Id (0 - 539)\r
806 // \r
807\r
808 // setup global style\r
809 gStyle->SetPalette(1);\r
810 gStyle->SetOptStat(0);\r
811 gStyle->SetPadTopMargin(0.02);\r
812 gStyle->SetPadBottomMargin(0.05);\r
813\r
814 TFile *file = new TFile(filename, "READ");\r
815\r
816 TCanvas *c = new TCanvas("blackEvents",Form("blackEvents %d",det), w, h);\r
817 c->SetVertical(kFALSE);\r
818 c->Divide(3,1, 0.01, 0.01);\r
819 c->cd(3);\r
820 \r
821 TPad *mPad = (TPad*) gPad;\r
822 mPad->Divide(1,2,0.01,0.01);\r
823 \r
824 c->cd(1);\r
825 TH2D *h2 = (TH2D*)file->Get(Form("ped_%d",det));\r
826 h2->SetMinimum(5);\r
827 h2->SetMaximum(15);\r
828 h2->SetTitle(";Z direction;#phi direction");\r
829 h2->Draw("colz");\r
830 \r
831 c->cd(2);\r
832 h2 = (TH2D*)file->Get(Form("noise_%d",det));\r
833 h2->SetMinimum(fMinNoise);\r
834 h2->SetMaximum(fMaxNoise);\r
835 h2->SetTitle(";Z direction;#phi direction");\r
836 h2->Draw("colz");\r
837 \r
838 mPad->cd(1);\r
839 //gPad->SetLogy();\r
840 TH1D *h1 = (TH1D*)file->Get(Form("pedDist_%d", det));\r
841 h1->Draw();\r
842 \r
843 mPad->cd(2);\r
844 gPad->SetLogy();\r
845 h1 = (TH1D*)file->Get(Form("noiseDist_%d", det));\r
846 h1->Draw(); \r
847 \r
848 h1->Fit("gaus");\r
849 TF1 *f = h1->GetFunction("gaus");\r
850 const char *tt = Form("#mu = %.2f #sigma = %0.2f ", f->GetParameter(1),f->GetParameter(2));\r
851 TLatex *ll = new TLatex(2, 100, tt);\r
852 ll->SetTextSize(0.06);\r
853 ll->Draw();\r
854}\r
855\r
856///////////////////////////////////////////////////////////////////////////////////////////////////\r
857\r
858void AliTRDqaBlackEvents::DrawSm(const char *filename, Int_t sm, Int_t w, Int_t h) \r
859{\r
860 //\r
861 // ????????????\r
862 //\r
863 \r
864 gStyle->SetPalette(1);\r
865 gStyle->SetOptStat(0);\r
866 \r
867 gStyle->SetPadTopMargin(0.02);\r
868 //gStyle->SetPadBottomMargin(0.05); \r
869 //gStyle->SetPadLeftMargin(0.02); \r
870 //gStyle->SetPadRightMargin(0.02);\r
871\r
872 TFile *file = new TFile(filename, "READ");\r
873\r
874 TCanvas *c = new TCanvas("blackEventsSM",Form("blackEvents SM %d",sm), w, h);\r
875 c->SetVertical(kFALSE);\r
876 c->Divide(5, 6, 0.001, 0.01);\r
877 \r
878 for(Int_t i=0; i<30; i++) {\r
879 \r
880 TH2D *h2 = (TH2D*)file->Get(Form("noise_%d",i+30*sm));\r
881 if (!h2) continue;\r
882 h2->SetMinimum(fMinNoise);\r
883 h2->SetMaximum(fMaxNoise);\r
884\r
885 // to be replaced by the official calculation\r
886 Int_t stack = i/6;\r
887 Int_t layer = i%6;\r
888 Int_t index = (5-layer)*5 + stack + 1;\r
889 //printf("%d %d %d %d\n", i, stack, layer, index);\r
890 c->cd(index);\r
891 gPad->SetBottomMargin(0.02);\r
892 gPad->SetTopMargin(0.02);\r
893\r
894 h2->Draw("col");\r
895 }\r
896}\r
897\r
898///////////////////////////////////////////////////////////////////////////////////////////////////\r