1 /**************************************************************************
\r
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\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
9 * withount fee, provided that the abov copyright notice appears in all *
\r
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
13 * provided "as is without express or implied warranty. *
\r
14 **************************************************************************/
\r
16 /* $Id: AliTRDqaBlackEvents.cxx 23387 2008-01-17 17:25:16Z cblume $ */
\r
18 ////////////////////////////////////////////////////////////////////////////
\r
20 // QA of black events //
\r
23 // Sylwester Radomski (radomski@physi.uni-heidelberg.de) //
\r
25 ////////////////////////////////////////////////////////////////////////////
\r
33 #include "TCanvas.h"
\r
41 #include "AliTRDgeometry.h"
\r
42 #include "AliTRDrawStreamTB.h"
\r
43 #include "AliTRDqaBlackEvents.h"
\r
45 ClassImp(AliTRDqaBlackEvents)
\r
47 ///////////////////////////////////////////////////////////////////////////////////////////////////
\r
49 AliTRDqaBlackEvents::AliTRDqaBlackEvents()
\r
80 // ,fRefFileName("")
\r
84 // to create the histograms call Init()
\r
87 strcpy(fRefFileName, "");
\r
90 ///////////////////////////////////////////////////////////////////////////////////////////////////
\r
92 AliTRDqaBlackEvents::AliTRDqaBlackEvents(const AliTRDqaBlackEvents &qa)
\r
123 //,fRefFileName("")
\r
126 // Copy constructor
\r
127 // to create the histograms call Init()
\r
130 strcpy(fRefFileName, "");
\r
133 ///////////////////////////////////////////////////////////////////////////////////////////////////
\r
135 void AliTRDqaBlackEvents::Init()
\r
138 // creates histograms
\r
141 //TFile *file = new
\r
142 //Info("Init", "Statring");
\r
146 // histograms for chambers
\r
147 for(Int_t det=0; det<kDET; det++) {
\r
149 fNPoint[det] = new TH2D(Form("entries_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5);
\r
150 fData[det] = new TH3F(Form("data_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5, 50, -0.5, 49.5);
\r
152 // pedestal noise maps using RMS and Fit
\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
156 //fChPed[det] = new TH2D(Form("ped_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5);
\r
157 //fChNoise[det] = new TH2D(Form("noise_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5);
\r
159 // distribution per detector
\r
160 fPed[det] = new TH1D(Form("pedDist_%d", det), ";pedestals (ADC counts)", 100, 5, 15);
\r
161 fNoise[det] = new TH1D(Form("noiseDist_%d", det), ";noise (ADC counts)", 100, 0, 5);
\r
162 fSignal[det] = new TH1D(Form("signal_%d", det), ";signal (ADC counts)", 100, -0.5, 99.5);
\r
163 fChPP[det] = new TH1D(Form("pp_%d", det), ";pp (ADC)", 200, -0.5, 199.5);
\r
165 fnEntriesRM[det] = new TH2D(Form("entriesRM_%d", det), ";ROB,MCM", 8, -0.5, 7.5, 16, -0.5, 15.5);
\r
167 // histograms after reference subtraction
\r
168 fChPedRes[det] = new TH2D(Form("pedRef_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5);
\r
169 fChNoiseRes[det] = new TH2D(Form("noiseRef_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5);
\r
173 fErrorLocMCM[det] = new TH2D(Form("errorLocMCM_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5);
\r
174 fErrorLocADC[det] = new TH2D(Form("errorLocADC_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5);
\r
175 fErrorLocHC[det] = new TH2D(Form("errorLocHC_%d", det), "", 16, -0.5, 15.5, 144, -0.5, 143.5);
\r
178 // histogram for each MCM
\r
179 for(Int_t i=0; i < kDET * kROB * kMCM; i++)
\r
180 fFullCounter[i] = 0;
\r
182 // histograms from the whole detector
\r
183 fOccupancy = new TH1D("occupancy", "", 20, -0.5, 19.5);
\r
184 fDetRob = new TH2D("DetRob", ";detector;ROB", kDET, -0.5, 539.5, 8, -0.5, 7.5);
\r
185 fTBEvent = new TH2D("tbEvent", ";event ID;time bin", 100, -0.5, 99.5, 30, -0.5, 29.5);
\r
187 // errors statistics and location
\r
188 fErrorHC = new TH1D("errorHC", ";error ID;", 7, -0.5, 6.5);
\r
189 fErrorMCM = new TH1D("errorMCM", ";error ID;", 7, -0.5, 6.5);
\r
190 fErrorADC = new TH1D("errorADC", ";error ID;", 7, -0.5, 6.5);
\r
192 fErrorSMHC = new TH1D("errorSM_HC", ";SM id", 18, -0.5, 17.5);
\r
193 fErrorSMMCM = new TH1D("errorSM_MCM", ";SM id", 18, -0.5, 17.5);
\r
194 fErrorSMADC = new TH1D("errorSM_ADC", ";SM id", 18, -0.5, 17.5);
\r
197 fErrorGraphHC = new TGraph();
\r
198 fErrorGraphMCM = new TGraph();
\r
199 fErrorGraphADC = new TGraph();
\r
201 fGraphMCM = new TGraph();
\r
203 fMapMCM = new TH2D("mapMCM", ";det;mcm", 540, -0.5, 539.5, kROB*kMCM, -0.5, kROB*kMCM-0.5);
\r
204 fFracMCM = new TH1D("fracMCM", ";frequency", 100, 0, 1);
\r
207 fErrorGraphHC->GetHistogram()->SetTitle("Error HC;event number;fraction with error (%)");
\r
208 fErrorGraphMCM->GetHistogram()->SetTitle("Error MCM;event number;fraction with error (%)");
\r
209 fErrorGraphADC->GetHistogram()->SetTitle("Error ADC;event number;fraction with error (%)");
\r
212 fSMHCped = new TH2D("smHcPed", ";super module;half chamber", 18, -0.5, 17.5, 60, -0.5, 59.5);
\r
215 //Info("Init", "Done");
\r
217 // number of ADC channels fired per SM and in total
\r
218 for(Int_t sm=0; sm<kSM+1; sm++)
\r
219 fNumberADC[sm] = new TGraph();
\r
222 fNoiseTotal = new TH1D("noiseTotal", "noise (ADC)", 250, 0, 10);
\r
223 fPP = new TH1D("peakPeak", "p-p (ADC)", 200, -0.5, 199.5);
\r
225 for(Int_t sm=0; sm<kSM; sm++) {
\r
226 fSmNoiseRms[sm] = new TH1D(Form("noiseRms_sm%d", sm), ";noise from RMS (ADC)", 100, 0, 10);
\r
227 fSmNoiseFit[sm] = new TH1D(Form("noiseFit_sm%d", sm), ";noise frim Fit (ADC)", 100, 0, 10);
\r
228 fSmPP[sm] = new TH1D(Form("peakPeak_sm%d", sm), ";peak-peak (ADC)", 200, -0.5, 199.5);
\r
231 fMcmTracks = new TObjArray();
\r
235 ///////////////////////////////////////////////////////////////////////////////////////////////////
\r
237 void AliTRDqaBlackEvents::Reset()
\r
240 // Resets the histograms
\r
243 for(Int_t i=0; i<kDET; i++) {
\r
245 fChPed[i]->Reset();
\r
246 fChNoise[i]->Reset();
\r
251 ///////////////////////////////////////////////////////////////////////////////////////////////////
\r
253 void AliTRDqaBlackEvents::SetRefFile(const char *filename) {
\r
255 strcpy(fRefFileName, filename);
\r
258 ///////////////////////////////////////////////////////////////////////////////////////////////////
\r
260 void AliTRDqaBlackEvents::ReadRefHists(Int_t det) {
\r
266 if (fRefFileName) TFile::Open(fRefFileName);
\r
269 fRefHistPed = (TH2D*)file->Get(Form("ped_%d",det));
\r
270 fRefHistNoise = (TH2D*)file->Get(Form("noise_%d", det));
\r
272 if (file) file->Close();
\r
275 ///////////////////////////////////////////////////////////////////////////////////////////////////
\r
277 Int_t AliTRDqaBlackEvents::AddEvent(AliTRDrawStreamTB *data)
\r
283 // structure to keep track if particular chanel is used
\r
284 Char_t isUsed[kDET][kCOL][kPAD];
\r
285 for(Int_t i=0; i<kDET; i++)
\r
286 for(Int_t j=0; j<kCOL; j++)
\r
287 for(Int_t k=0; k<kPAD; k++)
\r
288 isUsed[i][j][k] = 0;
\r
291 // clear the mcm data
\r
292 for(Int_t i=0; i < kDET * kROB * kMCM; i++) {
\r
293 if (fFullSignal[i]) fFullSignal[i]->Reset();
\r
294 fFullCounter[i] = 0;
\r
299 Int_t lastdet = -1;
\r
300 Int_t lastside = -1;
\r
301 Int_t lastmcm = -1;
\r
303 Int_t rob_last = -1;
\r
304 Int_t mcm_last = -1;
\r
307 Int_t nGoodMCM = 0;
\r
308 Int_t nGoodADC = 0;
\r
310 Int_t nErrorHC = 0;
\r
311 Int_t nErrorMCM = 0;
\r
312 Int_t nErrorADC = 0;
\r
315 //Int_t adc_last = -1;
\r
316 // Int_t sm_01 = -1;
\r
318 // number of ADCs per SM
\r
319 Int_t nADCinSM[kSM+1];
\r
320 for(Int_t sm=0; sm<kSM+1; sm++) nADCinSM[sm] = 0;
\r
324 while (data->Next()) {
\r
326 Int_t sm = data->GetSM();
\r
327 Int_t layer = data->GetLayer();
\r
328 Int_t stack = data->GetStack();
\r
330 Int_t det = data->GetDet();
\r
331 Int_t side = data->GetSide();
\r
333 Int_t row = data->GetRow();
\r
334 Int_t col = data->GetCol();
\r
336 Int_t rob = data->GetROB();
\r
337 Int_t mcm = data->GetMCM();
\r
338 Int_t adc = data->GetADC();
\r
341 Int_t *sig = data->GetSignals();
\r
347 // memory coruption protection
\r
348 if (det<0 || det>=kDET) continue;
\r
353 //fErrorHC->Fill(data->GetHCErrorCode());
\r
354 if (data->GetMCMErrorCode() > 0) fErrorLocMCM[det]->Fill(row, col);
\r
355 if (data->GetADCErrorCode() > 0) fErrorLocADC[det]->Fill(row, col);
\r
358 if ((det + side*kDET) != (lastdet + lastside*kDET)) {
\r
359 Int_t code = data->GetHCErrorCode();
\r
361 fErrorHC->Fill(code);
\r
363 if (code) fErrorSMHC->Fill(sm);
\r
364 if (code) nErrorHC++;
\r
368 //for(Int_t cc = 0; cc < 3; cc++) {
\r
369 // if (code & mask) fErrorHC->Fill(cc);
\r
378 if (mcm != lastmcm){
\r
379 Int_t code = data->GetMCMErrorCode();
\r
380 fErrorMCM->Fill(code);
\r
382 if (code) fErrorSMMCM->Fill(sm);
\r
383 if (code) nErrorMCM++;
\r
388 // new ADC channel found
\r
389 Int_t code = data->GetADCErrorCode();
\r
390 fErrorADC->Fill(code);
\r
391 if (code) fErrorSMADC->Fill(sm);
\r
392 if (code) nErrorADC++;
\r
395 // end of error checking
\r
398 fDetRob->Fill(det, rob, 1./(kMCM*18));
\r
399 isUsed[det][row][col]++;
\r
401 // check if mcm signal is continuus
\r
402 if ((rob_last != rob) || (mcm_last != mcm)) {
\r
405 fnEntriesRM[det]->Fill(rob,mcm);
\r
408 // number of entries for each channels
\r
409 fNPoint[det]->Fill(row, col);
\r
412 // create a structure for an MCM if needed
\r
413 Int_t mcmIndex = det * (kMCM * kROB) + rob * kMCM + mcm;
\r
414 if (fCreateFull && !fFullSignal[mcmIndex])
\r
415 fFullSignal[mcmIndex] = new TH2S(Form("mcm_%d_%d_%d_%d_%d", sm, stack, layer, rob, mcm),
\r
416 Form("mcm-%d-%d-%d-%d-%d;ADC;time bin", sm, stack, layer, rob, mcm),
\r
417 21, -0.5, 20.5, 30, -0.5, 29.5);
\r
420 // loop over Time Bins and fill histograms
\r
424 for(Int_t k=0; k<kTB; k++) { /// to be corrected
\r
426 //if (data->GetADCErrorCode() > 0) continue;
\r
428 //if (col == 0 || col == 143)
\r
429 //AliInfo(Form("TB: %d %d %d\n", row, col, sig[k]));
\r
432 //AliInfo(Form("det = %d rob = %d mcm = %d adc = %d k = %d S = %d\n", det, rob, mcm, adc, k, sig[k]));
\r
434 fSignal[det]->Fill(sig[k]);
\r
435 fData[det]->Fill(row, col, sig[k]);
\r
437 minV = (minV < sig[k]) ? minV : sig[k];
\r
438 maxV = (maxV > sig[k]) ? maxV : sig[k];
\r
441 // check if data strange enought
\r
442 if (fCreateFull && fFullSignal[mcmIndex]) {
\r
443 //if (sm == 17 && )
\r
445 if (sig[k] > fThresh || sig[k] < 1) fFullCounter[mcmIndex]++;
\r
446 //if (sig[k] < 1) fFullCounter[mcmIndex] = 0; // remove austrian flag
\r
448 fFullSignal[mcmIndex]->Fill(adc, k, sig[k]);
\r
452 if (det == 29 && col > 7) {
\r
453 fTBEvent->Fill(fnEvents, k, sig[k]);
\r
457 fPP->Fill(maxV-minV);
\r
458 fChPP[det]->Fill(maxV-minV);
\r
459 fSmPP[sm]->Fill(maxV-minV);
\r
462 // is the dead-alive status changing during the run
\r
463 for(Int_t i=0; i<kDET; i++) {
\r
464 for(Int_t j=0; j<kCOL; j++)
\r
465 for(Int_t k=0; k<kPAD; k++)
\r
466 fOccupancy->Fill(isUsed[i][j][k]);
\r
469 // save interesting histos
\r
470 Int_t mcmTrackCandidate = 0;
\r
471 for(Int_t i = 0; i < kDET * kROB * kMCM; i++) {
\r
472 if (fFullCounter[i] && fFullSignal[i] && CheckMCM(i) ) {
\r
474 fMcmTracks->AddLast(fFullSignal[i]->Clone(Form("event_%d_%s", fnEvents, fFullSignal[i]->GetName())));
\r
475 mcmTrackCandidate++;
\r
477 Int_t mcmTrackletDet = i/(kROB * kMCM);
\r
478 Int_t mcmTrackletMcm = i%(kROB * kMCM);
\r
479 fMapMCM->Fill(mcmTrackletDet, mcmTrackletMcm);
\r
483 fGraphMCM->SetPoint(fnEvents, fnEvents, mcmTrackCandidate);
\r
484 AliInfo(Form("Number of MCM track candidates = %d\n", mcmTrackCandidate));
\r
487 // update fraction of error graphs
\r
490 err = (nGoodHC > 0)? 100.*nErrorHC/nGoodHC : -1;
\r
491 fErrorGraphHC->SetPoint(fnEvents, fnEvents, err);
\r
493 err = (nGoodMCM > 0)? 100.*nErrorMCM/nGoodMCM : -1;
\r
494 fErrorGraphMCM->SetPoint(fnEvents, fnEvents, err);
\r
496 err = (nGoodADC > 0)? 100.*nErrorADC/nGoodADC : -1;
\r
497 fErrorGraphADC->SetPoint(fnEvents, fnEvents, err);
\r
499 // number of fired ADC per SM
\r
500 for(Int_t sm=0; sm<kSM+1; sm++)
\r
501 fNumberADC[sm]->SetPoint(fnEvents, fnEvents, nADCinSM[sm]);
\r
508 ///////////////////////////////////////////////////////////////////////////////////////////////////
\r
510 void AliTRDqaBlackEvents::Process(const char *filename)
\r
513 // Process something
\r
517 strcpy(fn, filename);
\r
519 //AliInfo(Form("FILENAME = %s (%s)\n", filename, fn));
\r
523 TH1D *hist = new TH1D("fitSignal", "", 50, -0.5, 49.5);
\r
524 TF1 *fit = new TF1("fit", "gaus(0)", 0, 20);
\r
525 fit->SetParameters(1e3, 10, 1);
\r
527 for(Int_t det=0; det<kDET; det++) {
\r
529 //AliInfo(Form("processing chamber %d\n", det));
\r
532 if (fData[det]->GetSum() < 10) continue;
\r
535 // read reference distributions
\r
538 for(Int_t row=0; row<fData[det]->GetXaxis()->GetNbins(); row++) {
\r
539 for(Int_t pad=0; pad<fData[det]->GetYaxis()->GetNbins(); pad++) {
\r
541 // project the histogramm
\r
543 for(Int_t bb=0; bb<50; bb++) {
\r
544 Int_t dataBin = fData[det]->FindBin(row, pad, bb);
\r
545 Double_t v = fData[det]->GetBinContent(dataBin);
\r
546 hist->SetBinContent(bb+1, v);
\r
549 Int_t bin = fChPed[det]->FindBin(row, pad);
\r
551 if (hist->GetSum() > 1) {
\r
553 Double_t ped = 0, noise = 0;
\r
555 if (fFitType == 0) {
\r
556 fit->SetParameters(1e3, 10, 1);
\r
557 hist->Fit(fit, "q0", "goff", 0, 20);
\r
558 TF1 *f = hist->GetFunction("fit");
\r
559 ped = TMath::Abs(f->GetParameter(1));
\r
560 noise = TMath::Abs(f->GetParameter(2));
\r
561 fSmNoiseFit[det/30]->Fill(noise);
\r
563 ped = hist->GetMean();
\r
564 noise = hist->GetRMS();
\r
565 fSmNoiseRms[det/30]->Fill(noise);
\r
567 // AliInfo(Form("data %f %f %f\n", hist->GetSum(), ped, noise));
\r
570 fChPed[det]->SetBinContent(bin, ped);
\r
571 fChNoise[det]->SetBinContent(bin, noise);
\r
572 fNoiseTotal->Fill(noise);
\r
574 // subtract reference values
\r
575 Double_t refped = 0;
\r
576 Double_t refnoise = 0;
\r
578 if (fRefHistPed) refped = fRefHistPed->GetBinContent(bin);
\r
579 if (fRefHistNoise) refnoise = fRefHistPed->GetBinContent(bin);
\r
581 fChPedRes[det]->SetBinContent(bin, ped-refped);
\r
582 fChNoiseRes[det]->SetBinContent(bin, noise-refnoise);
\r
584 fPed[det]->Fill(ped);
\r
585 fNoise[det]->Fill(noise);
\r
588 Int_t sm = det / 30;
\r
589 Int_t hc = (pad < kPAD/2) ? 2* (det % 30) : 2* (det % 30) + 1;
\r
590 if (ped > 9. && ped < 11) fSMHCped->Fill(sm, hc, 1./1152.); // number of pads in HC
\r
594 // not enought data found
\r
595 fChPed[det]->SetBinContent(bin, 0);
\r
596 fChNoise[det]->SetBinContent(bin, 0);
\r
597 fChPedRes[det]->SetBinContent(bin, 0);
\r
598 fChNoiseRes[det]->SetBinContent(bin, 0);
\r
607 //AliInfo(Form("Number of events = %d\n", fnEvents));
\r
609 // normalize number of entries histos
\r
611 for(Int_t i=0; i<kDET; i++) {
\r
612 if (!map[i]) continue;
\r
613 for(Int_t j=0; j<fNPoint[i]->GetXaxis()->GetNbins(); j++) {
\r
614 for(Int_t k=0; k<fNPoint[i]->GetYaxis()->GetNbins(); k++) {
\r
615 Int_t dataBin = fNPoint[i]->FindBin(j, k);
\r
616 Double_t v = fNPoint[i]->GetBinContent(dataBin);
\r
617 if (v > max) max = (Int_t)v;
\r
622 char entriesDistName[100];
\r
624 for(Int_t i=0; i<kDET; i++) {
\r
626 if (!map[i]) continue;
\r
628 sprintf(entriesDistName, "entriesDist_%d", i);
\r
629 fNPointDist[i] = new TH1D(entriesDistName, ";number of events", max+2, -0.5, max+1.5);
\r
631 for(Int_t j=0; j<fNPoint[i]->GetXaxis()->GetNbins(); j++) {
\r
632 for(Int_t k=0; k<fNPoint[i]->GetYaxis()->GetNbins(); k++) {
\r
633 Int_t dataBin = fNPoint[i]->FindBin(j, k);
\r
634 Double_t v = fNPoint[i]->GetBinContent(dataBin);
\r
635 //if (v > fnEvents) AliInfo(Form("N = %d V = %lf\n", fnEvents, v));
\r
636 fNPointDist[i]->Fill(v);
\r
640 fNPoint[i]->Scale(1./fnEvents);
\r
644 for(Int_t i=0; i<kDET; i++) {
\r
645 fnEntriesRM[i]->SetMaximum(fnEvents * 1.5);
\r
650 //AliInfo(Form("FILENAME 2 = %s (%d)\n", fn, fn));
\r
651 TFile *file = new TFile(fn, "recreate");
\r
652 for(Int_t det = 0; det < kDET; det++) {
\r
653 if (!map[det]) continue;
\r
654 fChPed[det]->Write();
\r
655 fChNoise[det]->Write();
\r
656 fNPoint[det]->Write();
\r
657 fNPointDist[det]->Write();
\r
658 fPed[det]->Write();
\r
659 fNoise[det]->Write();
\r
660 fSignal[det]->Write();
\r
661 fnEntriesRM[det]->Write();
\r
662 fChPP[det]->Write();
\r
664 fChPedRes[det]->Write();
\r
665 fChNoiseRes[det]->Write();
\r
667 // save error hists
\r
668 fErrorLocMCM[det]->SetMinimum(0);
\r
669 fErrorLocMCM[det]->SetMaximum(fnEvents);
\r
670 fErrorLocMCM[det]->Write();
\r
672 fErrorLocADC[det]->SetMinimum(0);
\r
673 fErrorLocADC[det]->SetMaximum(fnEvents);
\r
674 fErrorLocADC[det]->Write();
\r
677 for(Int_t sm=0; sm<kSM; sm++) {
\r
678 fSmNoiseRms[sm]->Write();
\r
679 fSmNoiseFit[sm]->Write();
\r
680 fSmPP[sm]->Write();
\r
686 for(Int_t i=0; i < kDET * kROB * kMCM; i++) {
\r
687 if (fFullSignal[i] && fFullCounter[i] > fCount) {
\r
688 fFullSignal[i]->Write();
\r
693 AliInfo(Form("Number of saved MCMs = %d\n", nMcm));
\r
695 fMcmTracks->Write();
\r
696 AliInfo(Form("Number of tracks = %d\n", fMcmTracks->GetEntries()));
\r
698 // permanently problematic MCMs
\r
699 for(Int_t det=0; det<kDET; det++) {
\r
700 for(Int_t mcm=0; mcm<kROB*kMCM; mcm++) {
\r
702 Int_t mRob = mcm / kMCM;
\r
703 Int_t mMcm = mcm % kMCM;
\r
704 Int_t bin = fMapMCM->FindBin(det, mcm);
\r
705 Double_t frac = 1. * fMapMCM->GetBinContent(bin) / fnEvents;
\r
706 fFracMCM->Fill(frac);
\r
709 AliInfo(Form("{%d, %d, %d, %f}, \n", det, mRob, mMcm, frac));
\r
716 fOccupancy->Write();
\r
722 fErrorMCM->Write();
\r
723 fErrorADC->Write();
\r
725 fErrorSMHC->Write();
\r
726 fErrorSMMCM->Write();
\r
727 fErrorSMADC->Write();
\r
730 fErrorGraphHC->Write("trendErrorHC");
\r
731 fErrorGraphMCM->Write("trendErrorMCM");
\r
732 fErrorGraphADC->Write("trendErrorADC");
\r
734 fGraphMCM->Write("trendMCM");
\r
736 fMapMCM->SetMaximum(fnEvents);
\r
742 for(Int_t sm=0; sm<kSM; sm++)
\r
743 fNumberADC[sm]->Write(Form("nADCinSM%d",sm));
\r
745 fNumberADC[kSM]->Write("nADCinEvent");
\r
747 fNoiseTotal->Write();
\r
754 ///////////////////////////////////////////////////////////////////////////////////////////////////
\r
756 Int_t AliTRDqaBlackEvents::CheckMCM(Int_t index) {
\r
760 static Int_t data[21][3] = {
\r
784 for(Int_t i=0; i<21; i++) {
\r
785 Int_t wIndex = data[i][0] * kROB*kMCM + data[i][1] * kMCM + data[i][2];
\r
786 if (index == wIndex) return 0;
\r
792 ///////////////////////////////////////////////////////////////////////////////////////////////////
\r
800 void AliTRDqaBlackEvents::DrawChamber(const char *filename, Int_t det, Int_t w, Int_t h)
\r
803 // Draw raport for one chamber:
\r
804 // pedestal map, noise map, distribution of pedestal and noise
\r
807 // name of the file with histograms (created with Process())
\r
808 // detector Id (0 - 539)
\r
811 // setup global style
\r
812 gStyle->SetPalette(1);
\r
813 gStyle->SetOptStat(0);
\r
814 gStyle->SetPadTopMargin(0.02);
\r
815 gStyle->SetPadBottomMargin(0.05);
\r
817 TFile *file = new TFile(filename, "READ");
\r
819 TCanvas *c = new TCanvas("blackEvents",Form("blackEvents %d",det), w, h);
\r
820 c->SetVertical(kFALSE);
\r
821 c->Divide(3,1, 0.01, 0.01);
\r
824 TPad *mPad = (TPad*) gPad;
\r
825 mPad->Divide(1,2,0.01,0.01);
\r
828 TH2D *h2 = (TH2D*)file->Get(Form("ped_%d",det));
\r
830 h2->SetMaximum(15);
\r
831 h2->SetTitle(";Z direction;#phi direction");
\r
835 h2 = (TH2D*)file->Get(Form("noise_%d",det));
\r
836 h2->SetMinimum(fMinNoise);
\r
837 h2->SetMaximum(fMaxNoise);
\r
838 h2->SetTitle(";Z direction;#phi direction");
\r
843 TH1D *h1 = (TH1D*)file->Get(Form("pedDist_%d", det));
\r
848 h1 = (TH1D*)file->Get(Form("noiseDist_%d", det));
\r
852 TF1 *f = h1->GetFunction("gaus");
\r
853 const char *tt = Form("#mu = %.2f #sigma = %0.2f ", f->GetParameter(1),f->GetParameter(2));
\r
854 TLatex *ll = new TLatex(2, 100, tt);
\r
855 ll->SetTextSize(0.06);
\r
859 ///////////////////////////////////////////////////////////////////////////////////////////////////
\r
861 void AliTRDqaBlackEvents::DrawSm(const char *filename, Int_t sm, Int_t w, Int_t h)
\r
867 gStyle->SetPalette(1);
\r
868 gStyle->SetOptStat(0);
\r
870 gStyle->SetPadTopMargin(0.02);
\r
871 //gStyle->SetPadBottomMargin(0.05);
\r
872 //gStyle->SetPadLeftMargin(0.02);
\r
873 //gStyle->SetPadRightMargin(0.02);
\r
875 TFile *file = new TFile(filename, "READ");
\r
877 TCanvas *c = new TCanvas("blackEventsSM",Form("blackEvents SM %d",sm), w, h);
\r
878 c->SetVertical(kFALSE);
\r
879 c->Divide(5, 6, 0.001, 0.01);
\r
881 for(Int_t i=0; i<30; i++) {
\r
883 TH2D *h2 = (TH2D*)file->Get(Form("noise_%d",i+30*sm));
\r
885 h2->SetMinimum(fMinNoise);
\r
886 h2->SetMaximum(fMaxNoise);
\r
888 // to be replaced by the official calculation
\r
891 Int_t index = (5-layer)*5 + stack + 1;
\r
892 //AliInfo(Form("%d %d %d %d\n", i, stack, layer, index));
\r
894 gPad->SetBottomMargin(0.02);
\r
895 gPad->SetTopMargin(0.02);
\r
901 ///////////////////////////////////////////////////////////////////////////////////////////////////
\r