1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
19 example: fill pedestal with gausschen noise
20 AliTRDCalibPadStatus ped;
21 ped.TestEvent(numberofevent);
22 // Method without histo
23 //////////////////////////
25 //Create the histo of the AliTRDCalROC
26 TH2F * histo2dm = ped.GetCalRocMean(0,kFALSE)->MakeHisto2D();
27 histo2dm->Scale(10.0);
28 TH1F * histo1dm = ped.GetCalRocMean(0,kFALSE)->MakeHisto1D();
29 histo1dm->Scale(10.0);
30 TH2F * histo2ds = ped.GetCalRocSquares(0,kFALSE)->MakeHisto2D();
31 histo2ds->Scale(10.0);
32 TH1F * histo1ds = ped.GetCalRocSquares(0,kFALSE)->MakeHisto1D();
35 TCanvas* c1 = new TCanvas;
38 histo2dm->Draw("colz");
42 histo2ds->Draw("colz");
46 /////////////////////////
49 TH1F * histo = ped.GetHisto(31);
56 #include <TObjArray.h>
63 #include <TDirectory.h>
65 #include <AliMathBase.h>
66 #include "TTreeStream.h"
68 #include "AliRawReader.h"
69 #include "AliRawReaderRoot.h"
70 #include "AliRawReaderDate.h"
71 #include "AliTRDRawStream.h"
72 #include "./Cal/AliTRDCalROC.h"
73 #include "./Cal/AliTRDCalPadStatus.h"
74 #include "./Cal/AliTRDCalSingleChamberStatus.h"
75 #include "AliTRDarrayF.h"
76 #include "AliTRDCommonParam.h"
84 #include "AliTRDCalibPadStatus.h"
88 ClassImp(AliTRDCalibPadStatus) /*FOLD00*/
90 //_____________________________________________________________________
91 AliTRDCalibPadStatus::AliTRDCalibPadStatus() : /*FOLD00*/
97 fCalArrayEntries(540),
99 fCalArraySquares(540),
100 fCalRocArrayMean(540),
101 fCalRocArrayRMS(540),
108 // default constructor
112 //_____________________________________________________________________
113 AliTRDCalibPadStatus::AliTRDCalibPadStatus(const AliTRDCalibPadStatus &ped) : /*FOLD00*/
115 fAdcMin(ped.GetAdcMin()),
116 fAdcMax(ped.GetAdcMax()),
117 fDetector(ped.fDetector),
118 fNumberOfTimeBins(ped.fNumberOfTimeBins),
119 fCalArrayEntries(540),
121 fCalArraySquares(540),
122 fCalRocArrayMean(540),
123 fCalRocArrayRMS(540),
132 for (Int_t idet = 0; idet < 540; idet++){
133 const AliTRDarrayF *calEntries = (AliTRDarrayF*)ped.fCalArrayEntries.UncheckedAt(idet);
134 const AliTRDarrayF *calMean = (AliTRDarrayF*)ped.fCalArrayMean.UncheckedAt(idet);
135 const AliTRDarrayF *calSquares = (AliTRDarrayF*)ped.fCalArraySquares.UncheckedAt(idet);
136 const AliTRDCalROC *calRocMean = (AliTRDCalROC*)ped.fCalRocArrayMean.UncheckedAt(idet);
137 const AliTRDCalROC *calRocRMS = (AliTRDCalROC*)ped.fCalRocArrayRMS.UncheckedAt(idet);
138 const TH2F *hped = (TH2F*)ped.fHistoArray.UncheckedAt(idet);
140 if ( calEntries != 0x0 ) fCalArrayEntries.AddAt(new AliTRDarrayF(*calEntries), idet);
141 if ( calMean != 0x0 ) fCalArrayMean.AddAt(new AliTRDarrayF(*calMean), idet);
142 if ( calSquares != 0x0 ) fCalArraySquares.AddAt(new AliTRDarrayF(*calSquares), idet);
143 if ( calRocMean != 0x0 ) fCalRocArrayMean.AddAt(new AliTRDCalROC(*calRocMean), idet);
144 if ( calRocRMS != 0x0 ) fCalRocArrayRMS.AddAt(new AliTRDCalROC(*calRocRMS), idet);
147 TH2F *hNew = new TH2F(*hped);
148 hNew->SetDirectory(0);
149 fHistoArray.AddAt(hNew,idet);
154 //_____________________________________________________________________
155 AliTRDCalibPadStatus& AliTRDCalibPadStatus::operator = (const AliTRDCalibPadStatus &source)
158 // assignment operator
160 if (&source == this) return *this;
161 new (this) AliTRDCalibPadStatus(source);
165 //_____________________________________________________________________
166 AliTRDCalibPadStatus::~AliTRDCalibPadStatus() /*FOLD00*/
172 //_____________________________________________________________________
173 Int_t AliTRDCalibPadStatus::Update(const Int_t icdet, /*FOLD00*/
180 // Signal filling methode
182 if ( (csignal>fAdcMax) || (csignal<fAdcMin) ) return 0;
184 if(fDetector != icdet){
185 fCalEntries = ((AliTRDarrayF *)GetCalEntries(icdet,kTRUE));
186 fCalMean = ((AliTRDarrayF *)GetCalMean(icdet,kTRUE));
187 fCalSquares = ((AliTRDarrayF *)GetCalSquares(icdet,kTRUE));
190 Float_t entries = fCalEntries->At(icRow+icCol*crowMax);
191 Float_t mean = fCalMean->At(icRow+icCol*crowMax);
192 Float_t squares = fCalSquares->At(icRow+icCol*crowMax);
194 Float_t entriesn = entries+1.0;
195 fCalEntries->AddAt(entriesn,(icRow+icCol*crowMax));
196 Float_t meann = (mean*entries+((Float_t)(csignal+0.5)))/entriesn;
197 fCalMean->AddAt(meann,icRow+icCol*crowMax);
198 Float_t squaresn = ((squares*entries)+(((Float_t)(csignal+0.5))*((Float_t)(csignal+0.5))))/entriesn;
199 fCalSquares->AddAt(squaresn,icRow+icCol*crowMax);
201 //printf("icdet %d, icRow %d, icCol %d, csignal %d, crowMax %d\n",icdet,icRow,icCol,csignal,crowMax);
202 //printf("entries %f, mean %f, squares %f\n",entriesn,meann,squaresn);
208 //_____________________________________________________________________
209 Int_t AliTRDCalibPadStatus::UpdateHisto(const Int_t icdet, /*FOLD00*/
216 // Signal filling methode
218 Int_t nbchannel = icRow+icCol*crowMax;
220 // fast filling methode.
221 // Attention: the entry counter of the histogram is not increased
222 // this means that e.g. the colz draw option gives an empty plot
224 if ( !(((Int_t)csignal>fAdcMax ) || ((Int_t)csignal<fAdcMin)) )
225 bin = (nbchannel+1)*(fAdcMax-fAdcMin+2)+((Int_t)csignal-fAdcMin+1);
227 GetHisto(icdet,kTRUE)->GetArray()[bin]++;
231 //_____________________________________________________________________
232 Bool_t AliTRDCalibPadStatus::ProcessEvent(AliTRDRawStream *rawStream, Bool_t nocheck)
235 // Event Processing loop - AliTRDRawStream
239 Bool_t withInput = kFALSE;
242 while (rawStream->Next()) {
243 Int_t rawversion = rawStream->GetRawVersion(); // current raw version
244 if(rawversion != 2) return kFALSE;
245 Int_t idetector = rawStream->GetDet(); // current detector
246 Int_t iRow = rawStream->GetRow(); // current row
247 Int_t iRowMax = rawStream->GetMaxRow(); // current rowmax
248 Int_t iCol = rawStream->GetCol(); // current col
249 Int_t iTimeBin = rawStream->GetTimeBin(); // current time bin
250 Int_t *signal = rawStream->GetSignals(); // current ADC signal
251 Int_t nbtimebin = rawStream->GetNumberOfTimeBins(); // number of time bins read from data
253 if((fDetector != -1) && (nbtimebin != fNumberOfTimeBins)) return kFALSE;
254 fNumberOfTimeBins = nbtimebin;
256 Int_t fin = TMath::Min(nbtimebin,(iTimeBin+3));
259 for(Int_t k = iTimeBin; k < fin; k++){
260 if(signal[n]>0) UpdateHisto(idetector,iRow,iCol,signal[n],iRowMax);
268 while (rawStream->Next()) {
269 Int_t idetector = rawStream->GetDet(); // current detector
270 Int_t iRow = rawStream->GetRow(); // current row
271 Int_t iRowMax = rawStream->GetMaxRow(); // current rowmax
272 Int_t iCol = rawStream->GetCol(); // current col
273 Int_t iTimeBin = rawStream->GetTimeBin(); // current time bin
274 Int_t *signal = rawStream->GetSignals(); // current ADC signal
275 Int_t nbtimebin = rawStream->GetNumberOfTimeBins(); // number of time bins read from data
277 Int_t fin = TMath::Min(nbtimebin,(iTimeBin+3));
280 for(Int_t k = iTimeBin; k < fin; k++){
281 if(signal[n]>0) UpdateHisto(idetector,iRow,iCol,signal[n],iRowMax);
291 //_____________________________________________________________________
292 Bool_t AliTRDCalibPadStatus::ProcessEvent(AliRawReader *rawReader, Bool_t nocheck)
295 // Event processing loop - AliRawReader
299 AliTRDRawStream rawStream(rawReader);
301 rawReader->Select("TRD");
303 return ProcessEvent(&rawStream, nocheck);
305 //_________________________________________________________________________
306 Bool_t AliTRDCalibPadStatus::ProcessEvent(
308 eventHeaderStruct *event,
311 eventHeaderStruct* /*event*/,
318 // process date event
321 AliRawReader *rawReader = new AliRawReaderDate((void*)event);
322 Bool_t result=ProcessEvent(rawReader, nocheck);
326 Fatal("AliTRDCalibPadStatus", "this class was compiled without DATE");
331 //_____________________________________________________________________
332 Bool_t AliTRDCalibPadStatus::TestEvent(Int_t nevent) /*FOLD00*/
336 // fill one oroc and one iroc with random gaus
339 AliTRDCommonParam *comParam = AliTRDCommonParam::Instance();
345 for (Int_t ism=0; ism<18; ism++){
346 for (Int_t ich=0; ich < 5; ich++){
347 for (Int_t ipl=0; ipl < 6; ipl++){
348 for(Int_t irow = 0; irow < comParam->GetRowMax(ipl,ich,ism); irow++){
349 for(Int_t icol = 0; icol < comParam->GetColMax(ipl); icol++){
350 for (Int_t iTimeBin=0; iTimeBin<(30*nevent); iTimeBin++){
351 Int_t signal=(Int_t)(ich+8+gRandom->Gaus(0,1.2));
352 if ( signal>0 )Update((ipl+ich*6+ism*6*5),irow,icol,signal,comParam->GetRowMax(ipl,ich,ism));
361 //_____________________________________________________________________
362 Bool_t AliTRDCalibPadStatus::TestEventHisto(Int_t nevent) /*FOLD00*/
366 // fill one oroc and one iroc with random gaus
369 AliTRDCommonParam *comParam = AliTRDCommonParam::Instance();
375 for (Int_t ism=0; ism<18; ism++){
376 for (Int_t ich=0; ich < 5; ich++){
377 for (Int_t ipl=0; ipl < 6; ipl++){
378 for(Int_t irow = 0; irow < comParam->GetRowMax(ipl,ich,ism); irow++){
379 for(Int_t icol = 0; icol < comParam->GetColMax(ipl); icol++){
380 for (Int_t iTimeBin=0; iTimeBin<(30*nevent); iTimeBin++){
381 Int_t signal=(Int_t)(ich+8+gRandom->Gaus(0,1.2));
382 if ( signal>0 )UpdateHisto((ipl+ich*6+ism*6*5),irow,icol,signal,comParam->GetRowMax(ipl,ich,ism));
391 //_____________________________________________________________________
392 TH2F* AliTRDCalibPadStatus::GetHisto(Int_t det, TObjArray *arr, /*FOLD00*/
393 Int_t nbinsY, Float_t ymin, Float_t ymax,
394 Char_t *type, Bool_t force)
397 // return pointer to histogram
398 // if force is true create a new histogram if it doesn't exist allready
400 if ( !force || arr->UncheckedAt(det) )
401 return (TH2F*)arr->UncheckedAt(det);
403 // if we are forced and histogram doesn't yes exist create it
404 Char_t name[255], title[255];
406 sprintf(name,"hCalib%s%.2d",type,det);
407 sprintf(title,"%s calibration histogram detector %.2d;ADC channel;Channel (pad)",type,det);
409 AliTRDCommonParam *comParam = AliTRDCommonParam::Instance();
413 Int_t nbchannels = comParam->GetRowMax(GetPlane(det),GetChamber(det),GetSector(det))*comParam->GetColMax(GetPlane(det));
415 // new histogram with calib information. One value for each pad!
416 TH2F* hist = new TH2F(name,title,
418 nbchannels,0,nbchannels
420 hist->SetDirectory(0);
421 arr->AddAt(hist,det);
424 //_____________________________________________________________________
425 TH2F* AliTRDCalibPadStatus::GetHisto(Int_t det, Bool_t force) /*FOLD00*/
428 // return pointer to histogram
429 // if force is true create a new histogram if it doesn't exist allready
431 TObjArray *arr = &fHistoArray;
432 return GetHisto(det, arr, fAdcMax-fAdcMin, fAdcMin, fAdcMax, "Pedestal", force);
434 //_____________________________________________________________________
435 AliTRDarrayF* AliTRDCalibPadStatus::GetCal(Int_t det, TObjArray* arr, Bool_t force) /*FOLD00*/
438 // return pointer to ROC Calibration
439 // if force is true create a new AliTRDarrayF if it doesn't exist allready
441 if ( !force || arr->UncheckedAt(det) )
442 return (AliTRDarrayF*)arr->UncheckedAt(det);
444 // if we are forced and histogram doesn't yes exist create it
445 AliTRDarrayF *croc = new AliTRDarrayF();
446 AliTRDCommonParam *comParam = AliTRDCommonParam::Instance();
450 Int_t nbpad = comParam->GetRowMax(GetPlane(det),GetChamber(det),GetSector(det))*comParam->GetColMax(GetPlane(det));
452 // new AliTRDCalROC. One value for each pad!
454 for(Int_t k = 0; k < nbpad; k++){
457 arr->AddAt(croc,det);
460 //_____________________________________________________________________
461 AliTRDCalROC* AliTRDCalibPadStatus::GetCalRoc(Int_t det, TObjArray* arr, Bool_t force) /*FOLD00*/
464 // return pointer to ROC Calibration
465 // if force is true create a new AliTRDCalROC if it doesn't exist allready
467 if ( !force || arr->UncheckedAt(det) )
468 return (AliTRDCalROC*)arr->UncheckedAt(det);
470 // if we are forced and histogram doesn't yes exist create it
472 // new AliTRDCalROC. One value for each pad!
473 AliTRDCalROC *croc = new AliTRDCalROC(GetPlane(det),GetChamber(det));
474 arr->AddAt(croc,det);
477 //_____________________________________________________________________
478 AliTRDarrayF* AliTRDCalibPadStatus::GetCalEntries(Int_t det, Bool_t force) /*FOLD00*/
481 // return pointer to Carge ROC Calibration
482 // if force is true create a new histogram if it doesn't exist allready
484 TObjArray *arr = &fCalArrayEntries;
485 return GetCal(det, arr, force);
487 //_____________________________________________________________________
488 AliTRDarrayF* AliTRDCalibPadStatus::GetCalMean(Int_t det, Bool_t force) /*FOLD00*/
491 // return pointer to Carge ROC Calibration
492 // if force is true create a new histogram if it doesn't exist allready
494 TObjArray *arr = &fCalArrayMean;
495 return GetCal(det, arr, force);
497 //_____________________________________________________________________
498 AliTRDarrayF* AliTRDCalibPadStatus::GetCalSquares(Int_t det, Bool_t force) /*FOLD00*/
501 // return pointer to Carge ROC Calibration
502 // if force is true create a new histogram if it doesn't exist allready
504 TObjArray *arr = &fCalArraySquares;
505 return GetCal(det, arr, force);
507 //_____________________________________________________________________
508 AliTRDCalROC* AliTRDCalibPadStatus::GetCalRocMean(Int_t det, Bool_t force) /*FOLD00*/
511 // return pointer to Carge ROC Calibration
512 // if force is true create a new histogram if it doesn't exist allready
514 TObjArray *arr = &fCalRocArrayMean;
515 return GetCalRoc(det, arr, force);
517 //_____________________________________________________________________
518 AliTRDCalROC* AliTRDCalibPadStatus::GetCalRocRMS(Int_t det, Bool_t force) /*FOLD00*/
521 // return pointer to Carge ROC Calibration
522 // if force is true create a new histogram if it doesn't exist allready
524 TObjArray *arr = &fCalRocArrayRMS;
525 return GetCalRoc(det, arr, force);
527 //_________________________________________________________________________
528 void AliTRDCalibPadStatus::Analyse() /*FOLD00*/
531 // Calcul the rms properly
534 for(Int_t idet = 0; idet < 540; idet++){
537 fCalEntries = ((AliTRDarrayF *)GetCalEntries(idet));
538 fCalMean = ((AliTRDarrayF *)GetCalMean(idet));
539 fCalSquares = ((AliTRDarrayF *)GetCalSquares(idet));
541 if(!fCalEntries) continue;
543 AliTRDCalROC *calRocMean = ((AliTRDCalROC *)GetCalRocMean(idet,kTRUE));
544 AliTRDCalROC *calRocRMS = ((AliTRDCalROC *)GetCalRocRMS(idet,kTRUE));
547 Int_t channels = calRocMean->GetNchannels();
549 for(Int_t ichannels = 0 ; ichannels < channels; ichannels++){
551 Float_t entries = fCalEntries->At(ichannels);
552 Float_t mean = fCalMean->At(ichannels);
553 Float_t squares = fCalSquares->At(ichannels);
557 Double_t rm = TMath::Abs(squares-(mean*mean));
558 rms = TMath::Sqrt(rm);
559 calRocRMS->SetValue(ichannels,rms/10.0);
560 calRocMean->SetValue(ichannels,mean/10.0);
565 //_____________________________________________________________________
566 void AliTRDCalibPadStatus::AnalyseHisto() /*FOLD00*/
569 // Calculate calibration constants
572 Int_t nbinsAdc = fAdcMax-fAdcMin;
580 for (Int_t idet=0; idet<540; idet++){
581 TH2F *hP = GetHisto(idet);
586 AliTRDCalROC *rocMean = GetCalRocMean(idet,kTRUE);
587 AliTRDCalROC *rocRMS = GetCalRocRMS(idet,kTRUE);
589 array_hP = hP->GetArray();
590 Int_t nChannels = rocMean->GetNchannels();
592 for (Int_t iChannel=0; iChannel<nChannels; iChannel++){
593 Int_t offset = (nbinsAdc+2)*(iChannel+1)+1;
594 Double_t ret = AliMathBase::FitGaus(array_hP+offset,nbinsAdc,fAdcMin,fAdcMax,¶m,&dummy);
595 // if the fitting failed set noise and pedestal to 0
596 if ((ret == -4) || (ret == -1)) {
600 if((param[1]/10.0) > 65534.0) param[1] = 0.0;
601 if((param[2]/10.0) > 65534.0) param[2] = 0.0;
602 rocMean->SetValue(iChannel,param[1]/10.0);
603 rocRMS->SetValue(iChannel,param[2]/10.0);
608 //_______________________________________________________________________________________
609 AliTRDCalPadStatus* AliTRDCalibPadStatus::CreateCalPadStatus()
615 AliTRDCalPadStatus* obj = new AliTRDCalPadStatus("padstatus", "padstatus");
617 for (Int_t idet=0; idet<540; ++idet)
619 AliTRDCalSingleChamberStatus *calROC = obj->GetCalROC(idet);
622 fCalEntries = ((AliTRDarrayF *)GetCalEntries(idet));
623 AliTRDCalROC *calRocMean = ((AliTRDCalROC *)GetCalRocMean(idet));
624 AliTRDCalROC *calRocRMS = ((AliTRDCalROC *)GetCalRocRMS(idet));
627 for(Int_t k = 0; k < calROC->GetNchannels(); k++){
628 calROC->SetStatus(k,AliTRDCalPadStatus::kMasked);
630 //printf("no fCalRocMean for %d\n",idet);
635 Int_t channels = calROC->GetNchannels();
639 Float_t meanentries = 0.0;
642 meanentries = GetHisto(idet)->GetEntries()/(channels);
645 else meanentries = TMath::Mean(channels,((TArrayF *)fCalEntries)->GetArray());
646 //Double_t meanmean = calRocMean->GetMean()*10.0;
647 //Double_t meansquares = calRocRMS->GetMean()*10.0;
650 for(Int_t ich = 0; ich < channels; ich++){
652 Float_t entries = 0.0;
655 for(Int_t bin = 0; bin < (fAdcMax-fAdcMin); bin++){
656 entries += GetHisto(idet)->GetArray()[(ich+1)*(fAdcMax-fAdcMin+2)+(bin+1)];
660 else entries = fCalEntries->At(ich);
661 //Float_t mean = calRocMean->GetValue(ich)*10.0;
662 Float_t rms = calRocRMS->GetValue(ich)*10.0;
663 if(ich > 1720) printf("rms %f\n",rms);
665 //if((entries < 0.3*meanentries) || (TMath::Abs(rms-meansquares) > ((Float_t)(fAdcMax-fAdcMin)/2.0)) || (rms == 0.0)) calROC->SetStatus(ich, AliTRDCalPadStatus::kMasked);
666 if(rms <= 0.01) calROC->SetStatus(ich, AliTRDCalPadStatus::kMasked);
673 //_____________________________________________________________________
674 void AliTRDCalibPadStatus::DumpToFile(const Char_t *filename, const Char_t *dir, Bool_t append) /*FOLD00*/
677 // Write class to file
688 TDirectory *backup = gDirectory;
689 TFile f(filename,option.Data());
691 if ( !sDir.IsNull() ){
692 f.mkdir(sDir.Data());
698 if ( backup ) backup->cd();
699 }//_____________________________________________________________________________
700 Int_t AliTRDCalibPadStatus::GetPlane(Int_t d) const
703 // Reconstruct the plane number from the detector number
706 return ((Int_t) (d % 6));
710 //_____________________________________________________________________________
711 Int_t AliTRDCalibPadStatus::GetChamber(Int_t d) const
714 // Reconstruct the chamber number from the detector number
717 return ((Int_t) (d % 30) / 6);
720 //_____________________________________________________________________________
721 Int_t AliTRDCalibPadStatus::GetSector(Int_t d) const
724 // Reconstruct the sector number from the detector number
727 return ((Int_t) (d / 30));