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 **************************************************************************/
27 #include <TDirectory.h>
30 #include "AliRawReader.h"
31 #include "AliRawReaderRoot.h"
32 #include "AliRawReaderDate.h"
33 #include "AliTPCRawStream.h"
34 #include "AliTPCCalROC.h"
35 #include "AliTPCROC.h"
36 #include "AliMathBase.h"
37 #include "TTreeStream.h"
43 #include "AliTPCCalibPedestal.h"
46 ///////////////////////////////////////////////////////////////////////////////////////
47 // Implementation of the TPC pedestal and noise calibration
49 // Origin: Jens Wiechula, Marian Ivanov J.Wiechula@gsi.de, Marian.Ivanov@cern.ch
52 // *************************************************************************************
53 // * Class Description *
54 // *************************************************************************************
58 // Raw pedestal data is processed by calling one of the ProcessEvent(...) functions
59 // (see below). These in the end call the Update(...) function, where the data is filled
62 // For each ROC one TH2F histo (ROC channel vs. ADC channel) is created when
63 // it is filled for the first time (GetHistoPedestal(ROC,kTRUE)). All histos are stored in the
64 // TObjArray fHistoPedestalArray.
66 // For a fast filling of the histogram the corresponding bin number of the channel and ADC channel
67 // is computed by hand and the histogram array is accessed directly via its pointer.
68 // ATTENTION: Doing so the the entry counter of the histogram is not increased
69 // this means that e.g. the colz draw option gives an empty plot unless
70 // calling 'histo->SetEntries(1)' before drawing.
72 // After accumulating the desired statistics the Analyse() function has to be called.
73 // Whithin this function the pedestal and noise values are calculated for each pad, using
74 // the fast gaus fit function AliMathBase::FitGaus(...), and the calibration
75 // storage classes (AliTPCCalROC) are filled for each ROC.
76 // The calibration information is stored in the TObjArrays fCalRocArrayPedestal and fCalRocArrayRMS;
80 // User interface for filling data:
81 // --------------------------------
83 // To Fill information one of the following functions can be used:
85 // Bool_t ProcessEvent(eventHeaderStruct *event);
86 // - process Date event
87 // - use AliTPCRawReaderDate and call ProcessEvent(AliRawReader *rawReader)
89 // Bool_t ProcessEvent(AliRawReader *rawReader);
90 // - process AliRawReader event
91 // - use AliTPCRawStream to loop over data and call ProcessEvent(AliTPCRawStream *rawStream)
93 // Bool_t ProcessEvent(AliTPCRawStream *rawStream);
94 // - process event from AliTPCRawStream
95 // - call Update function for signal filling
97 // Int_t Update(const Int_t isector, const Int_t iRow, const Int_t
98 // iPad, const Int_t iTimeBin, const Float_t signal);
99 // - directly fill signal information (sector, row, pad, time bin, pad)
100 // to the reference histograms
102 // It is also possible to merge two independently taken calibrations using the function
104 // void Merge(AliTPCCalibPedestal *ped)
105 // - copy histograms in 'ped' if the do not exist in this instance
106 // - Add histograms in 'ped' to the histograms in this instance if the allready exist
107 // - After merging call Analyse again!
111 // -- example: filling data using root raw data:
112 // void fillPedestal(Char_t *filename)
114 // rawReader = new AliRawReaderRoot(fileName);
115 // if ( !rawReader ) return;
116 // AliTPCCalibPedestal *calib = new AliTPCCalibPedestal;
117 // while (rawReader->NextEvent()){
118 // calib->ProcessEvent(rawReader);
121 // calib->DumpToFile("PedestalData.root");
127 // What kind of information is stored and how to retrieve them:
128 // ------------------------------------------------------------
130 // - Accessing the 'Reference Histograms' (pedestal distribution histograms):
132 // TH2F *GetHistoPedestal(Int_t sector);
134 // - Accessing the calibration storage objects:
136 // AliTPCCalROC *GetCalRocPedestal(Int_t sector); - for the pedestal values
137 // AliTPCCalROC *GetCalRocNoise(Int_t sector); - for the Noise values
139 // example for visualisation:
140 // if the file "PedestalData.root" was created using the above example one could do the following:
142 // TFile filePedestal("PedestalData.root")
143 // AliTPCCalibPedestal *ped = (AliTPCCalibPedestal*)filePedestal->Get("AliTPCCalibPedestal");
144 // ped->GetCalRocPedestal(0)->Draw("colz");
145 // ped->GetCalRocRMS(0)->Draw("colz");
147 // or use the AliTPCCalPad functionality:
148 // AliTPCCalPad padPedestal(ped->GetCalPadPedestal());
149 // AliTPCCalPad padNoise(ped->GetCalPadRMS());
150 // padPedestal->MakeHisto2D()->Draw("colz"); //Draw A-Side Pedestal Information
151 // padNoise->MakeHisto2D()->Draw("colz"); //Draw A-Side Noise Information
154 example: fill pedestal with gausschen noise
155 AliTPCCalibPedestal ped;
159 TCanvas* c1 = new TCanvas;
162 ped.GetHistoPedestal(0)->SetEntries(1); //needed in order for colz to work, reason: fast filling does not increase the entries counter
163 ped.GetHistoPedestal(0)->Draw("colz");
165 ped.GetHistoPedestal(36)->SetEntries(1); //needed in order for colz to work, reason: fast filling does not increase the entries counter
166 ped.GetHistoPedestal(36)->Draw("colz");
167 TCanvas* c2 = new TCanvas;
170 ped.GetCalRocPedestal(0)->Draw("colz");
172 ped.GetCalRocRMS(0)->Draw("colz");
174 ped.GetCalRocPedestal(36)->Draw("colz");
176 ped.GetCalRocRMS(36)->Draw("colz");
183 ClassImp(AliTPCCalibPedestal)
185 AliTPCCalibPedestal::AliTPCCalibPedestal() : /*FOLD00*/
191 fOldRCUformat(kTRUE),
192 fROC(AliTPCROC::Instance()),
193 fCalRocArrayPedestal(72),
195 fHistoPedestalArray(72)
198 // default constructor
201 //_____________________________________________________________________
202 AliTPCCalibPedestal::AliTPCCalibPedestal(const AliTPCCalibPedestal &ped) : /*FOLD00*/
204 fFirstTimeBin(ped.GetFirstTimeBin()),
205 fLastTimeBin(ped.GetLastTimeBin()),
206 fAdcMin(ped.GetAdcMin()),
207 fAdcMax(ped.GetAdcMax()),
208 fOldRCUformat(kTRUE),
209 fROC(AliTPCROC::Instance()),
210 fCalRocArrayPedestal(72),
212 fHistoPedestalArray(72)
217 for (Int_t iSec = 0; iSec < 72; ++iSec){
218 const AliTPCCalROC *calPed = (AliTPCCalROC*)ped.fCalRocArrayPedestal.UncheckedAt(iSec);
219 const AliTPCCalROC *calRMS = (AliTPCCalROC*)ped.fCalRocArrayRMS.UncheckedAt(iSec);
220 const TH2F *hPed = (TH2F*)ped.fHistoPedestalArray.UncheckedAt(iSec);
222 if ( calPed != 0x0 ) fCalRocArrayPedestal.AddAt(new AliTPCCalROC(*calPed), iSec);
223 if ( calRMS != 0x0 ) fCalRocArrayRMS.AddAt(new AliTPCCalROC(*calRMS), iSec);
226 TH2F *hNew = new TH2F(*hPed);
227 hNew->SetDirectory(0);
228 fHistoPedestalArray.AddAt(hNew,iSec);
232 //_____________________________________________________________________
233 AliTPCCalibPedestal& AliTPCCalibPedestal::operator = (const AliTPCCalibPedestal &source)
236 // assignment operator
238 if (&source == this) return *this;
239 new (this) AliTPCCalibPedestal(source);
243 //_____________________________________________________________________
244 AliTPCCalibPedestal::~AliTPCCalibPedestal() /*FOLD00*/
250 fCalRocArrayPedestal.Delete();
251 fCalRocArrayRMS.Delete();
252 fHistoPedestalArray.Delete();
255 //_____________________________________________________________________
256 Int_t AliTPCCalibPedestal::Update(const Int_t icsector, /*FOLD00*/
259 const Int_t icTimeBin,
260 const Float_t csignal)
263 // Signal filling methode
266 //return if we are out of the specified time bin or adc range
267 if ( (icTimeBin>fLastTimeBin) || (icTimeBin<fFirstTimeBin) ) return 0;
268 if ( ((Int_t)csignal>fAdcMax) || ((Int_t)csignal<fAdcMin) ) return 0;
270 Int_t iChannel = fROC->GetRowIndexes(icsector)[icRow]+icPad; // global pad position in sector
272 // fast filling methode.
273 // Attention: the entry counter of the histogram is not increased
274 // this means that e.g. the colz draw option gives an empty plot
275 Int_t bin = (iChannel+1)*(fAdcMax-fAdcMin+2)+((Int_t)csignal-fAdcMin+1);
277 GetHistoPedestal(icsector,kTRUE)->GetArray()[bin]++;
281 //_____________________________________________________________________
282 Bool_t AliTPCCalibPedestal::ProcessEvent(AliTPCRawStream *rawStream)
285 // Event Processing loop - AliTPCRawStream
288 rawStream->SetOldRCUFormat(fOldRCUformat);
290 Bool_t withInput = kFALSE;
292 while (rawStream->Next()) {
294 Int_t isector = rawStream->GetSector(); // current sector
295 Int_t iRow = rawStream->GetRow(); // current row
296 Int_t iPad = rawStream->GetPad(); // current pad
297 Int_t iTimeBin = rawStream->GetTime(); // current time bin
298 Float_t signal = rawStream->GetSignal(); // current ADC signal
300 Update(isector,iRow,iPad,iTimeBin,signal);
306 //_____________________________________________________________________
307 Bool_t AliTPCCalibPedestal::ProcessEvent(AliRawReader *rawReader)
310 // Event processing loop - AliRawReader
314 AliTPCRawStream rawStream(rawReader);
316 rawReader->Select("TPC");
318 return ProcessEvent(&rawStream);
320 //_____________________________________________________________________
321 Bool_t AliTPCCalibPedestal::ProcessEvent(eventHeaderStruct *event)
324 // process date event
326 AliRawReader *rawReader = new AliRawReaderDate((void*)event);
327 Bool_t result=ProcessEvent(rawReader);
331 //_____________________________________________________________________
332 Bool_t AliTPCCalibPedestal::TestEvent() /*FOLD00*/
336 // fill one oroc and one iroc with random gaus
341 for (UInt_t iSec=0; iSec<72; ++iSec){
342 if (iSec%36>0) continue;
343 for (UInt_t iRow=0; iRow < fROC->GetNRows(iSec); ++iRow){
344 for (UInt_t iPad=0; iPad < fROC->GetNPads(iSec,iRow); ++iPad){
345 for (UInt_t iTimeBin=0; iTimeBin<1024; ++iTimeBin){
346 Float_t signal=(Int_t)(iRow+3+gRandom->Gaus(0,.7));
347 if ( signal>0 )Update(iSec,iRow,iPad,iTimeBin,signal);
354 //_____________________________________________________________________
355 TH2F* AliTPCCalibPedestal::GetHisto(Int_t sector, TObjArray *arr, /*FOLD00*/
356 Int_t nbinsY, Float_t ymin, Float_t ymax,
357 Char_t *type, Bool_t force)
360 // return pointer to Q histogram
361 // if force is true create a new histogram if it doesn't exist allready
363 if ( !force || arr->UncheckedAt(sector) )
364 return (TH2F*)arr->UncheckedAt(sector);
366 // if we are forced and histogram doesn't yes exist create it
367 Char_t name[255], title[255];
369 sprintf(name,"hCalib%s%.2d",type,sector);
370 sprintf(title,"%s calibration histogram sector %.2d;ADC channel;Channel (pad)",type,sector);
372 // new histogram with Q calib information. One value for each pad!
373 TH2F* hist = new TH2F(name,title,
375 fROC->GetNChannels(sector),0,fROC->GetNChannels(sector)
377 hist->SetDirectory(0);
378 arr->AddAt(hist,sector);
381 //_____________________________________________________________________
382 TH2F* AliTPCCalibPedestal::GetHistoPedestal(Int_t sector, Bool_t force) /*FOLD00*/
385 // return pointer to T0 histogram
386 // if force is true create a new histogram if it doesn't exist allready
388 TObjArray *arr = &fHistoPedestalArray;
389 return GetHisto(sector, arr, fAdcMax-fAdcMin, fAdcMin, fAdcMax, "Pedestal", force);
391 //_____________________________________________________________________
392 AliTPCCalROC* AliTPCCalibPedestal::GetCalRoc(Int_t sector, TObjArray* arr, Bool_t force) /*FOLD00*/
395 // return pointer to ROC Calibration
396 // if force is true create a new histogram if it doesn't exist allready
398 if ( !force || arr->UncheckedAt(sector) )
399 return (AliTPCCalROC*)arr->UncheckedAt(sector);
401 // if we are forced and the histogram doesn't yet exist create it
403 // new AliTPCCalROC for T0 information. One value for each pad!
404 AliTPCCalROC *croc = new AliTPCCalROC(sector);
405 arr->AddAt(croc,sector);
408 //_____________________________________________________________________
409 AliTPCCalROC* AliTPCCalibPedestal::GetCalRocPedestal(Int_t sector, Bool_t force) /*FOLD00*/
412 // return pointer to Carge ROC Calibration
413 // if force is true create a new histogram if it doesn't exist allready
415 TObjArray *arr = &fCalRocArrayPedestal;
416 return GetCalRoc(sector, arr, force);
418 //_____________________________________________________________________
419 AliTPCCalROC* AliTPCCalibPedestal::GetCalRocRMS(Int_t sector, Bool_t force) /*FOLD00*/
422 // return pointer to signal width ROC Calibration
423 // if force is true create a new histogram if it doesn't exist allready
425 TObjArray *arr = &fCalRocArrayRMS;
426 return GetCalRoc(sector, arr, force);
428 //_____________________________________________________________________
429 void AliTPCCalibPedestal::Merge(AliTPCCalibPedestal *ped)
432 // Merge reference histograms of sig to the current AliTPCCalibSignal
436 for (Int_t iSec=0; iSec<72; ++iSec){
437 TH2F *hRefPedMerge = ped->GetHistoPedestal(iSec);
441 TDirectory *dir = hRefPedMerge->GetDirectory(); hRefPedMerge->SetDirectory(0);
442 TH2F *hRefPed = GetHistoPedestal(iSec);
443 if ( hRefPed ) hRefPed->Add(hRefPedMerge);
445 TH2F *hist = new TH2F(*hRefPedMerge);
446 hist->SetDirectory(0);
447 fHistoPedestalArray.AddAt(hist, iSec);
449 hRefPedMerge->SetDirectory(dir);
453 //_____________________________________________________________________
454 void AliTPCCalibPedestal::Analyse() /*FOLD00*/
457 // Calculate calibration constants
460 Int_t nbinsAdc = fAdcMax-fAdcMin;
468 for (Int_t iSec=0; iSec<72; ++iSec){
469 TH2F *hP = GetHistoPedestal(iSec);
472 AliTPCCalROC *rocPedestal = GetCalRocPedestal(iSec,kTRUE);
473 AliTPCCalROC *rocRMS = GetCalRocRMS(iSec,kTRUE);
475 array_hP = hP->GetArray();
476 UInt_t nChannels = fROC->GetNChannels(iSec);
478 for (UInt_t iChannel=0; iChannel<nChannels; ++iChannel){
479 Int_t offset = (nbinsAdc+2)*(iChannel+1)+1;
480 Double_t ret = AliMathBase::FitGaus(array_hP+offset,nbinsAdc,fAdcMin,fAdcMax,¶m,&dummy);
481 // if the fitting failed set noise and pedestal to 0
486 rocPedestal->SetValue(iChannel,param[1]);
487 rocRMS->SetValue(iChannel,param[2]);
491 //_____________________________________________________________________
492 void AliTPCCalibPedestal::DumpToFile(const Char_t *filename, const Char_t *dir, Bool_t append) /*FOLD00*/
495 // Write class to file
506 TDirectory *backup = gDirectory;
507 TFile f(filename,option.Data());
509 if ( !sDir.IsNull() ){
510 f.mkdir(sDir.Data());
516 if ( backup ) backup->cd();