1 /**************************************************************************
2 * This file is property of and copyright by the ALICE HLT Project *
3 * All rights reserved. *
5 * Primary Authors: Oystein Djuvsland *
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 **************************************************************************/
18 * Measures the baselines and calculates relevant values
20 * @file AliHLTPHOSBaselineAnalyzer.cxx
21 * @author Oystein Djuvsland
23 * @brief Baseline analyzer for PHOS HLT
26 #include "AliHLTPHOSBaselineAnalyzer.h"
27 #include "AliHLTPHOSBase.h"
28 #include "AliHLTPHOSBaseline.h"
29 #include "AliHLTPHOSValidCellDataStruct.h"
30 #include "AliHLTPHOSSanityInspector.h"
31 #include "AliHLTPHOSConstants.h"
33 #include "AliHLTPHOSRcuCellEnergyDataStruct.h"
35 #include "TClonesArray.h"
40 using namespace PhosHLTConst;
42 ClassImp(AliHLTPHOSBaselineAnalyzer);
44 AliHLTPHOSBaselineAnalyzer::AliHLTPHOSBaselineAnalyzer() :
47 fMaxCrazyDifference(0),
52 //see headerfile for documentation
53 fSanityInspector = new AliHLTPHOSSanityInspector();
57 for(UInt_t x = 0; x < N_XCOLUMNS_MOD; x++)
59 for(UInt_t z = 0; z < N_ZROWS_MOD; z++)
61 for(UInt_t gain = 0; gain < N_GAINS; gain++)
63 sprintf(histName, "sample_value_channel_x_col_%d_z_row_%d_gain_%d", x, z, gain);
64 sprintf(histTitle, "Distribution of Sample Values for Channel X: %d - Z: %d - Gain: %d", x, z, gain);
65 fChannelHistogramsPtr[x][z][gain] = new TH1F(histName, histTitle, 1024, 0, 1023);
66 sprintf(histName, "fixed_sample_value_channel_x_col_%d_z_row_%d_gain_%d", x, z, gain);
67 sprintf(histTitle, "Distribution of Corrected Sample Values for Channel X: %d - Z: %d - Gain: %d", x, z, gain);
68 fFixedChannelHistogramsPtr[x][z][gain] = new TH1F(histName, histTitle, 1024, 0, 1023);
73 fRMSHistogramPtr = new TH1F("RMSHist", "RMS Values for All Channels", 1023, 0, 1023);
74 fRMSMapHighGainHistogramPtr = new TH2F("RMSHGMapHist", "Map of RMS Values for High Gain Channels", 64, 0, 63, 56, 0, 55);
75 fRMSMapLowGainHistogramPtr = new TH2F("RMSLGMapHist", "Map of RMS Values for Low Gain Channels", 64, 0, 63, 56, 0, 55);
77 fFixedRMSHistogramPtr = new TH1F("fixedRMSHist", "Corrected RMS Values for All Channels", 1023, 0, 1023);
78 fFixedRMSMapHighGainHistogramPtr = new TH2F("fixedRMSHGMapHist", "Map of Corrected RMS Values for High Gain Channels", 64, 0, 63, 56, 0, 55);
79 fFixedRMSMapLowGainHistogramPtr = new TH2F("fixedRMSLGMapHist", "Map of Corrected RMS Values for Low Gain Channels", 64, 0, 63, 56, 0, 55);
82 ResetAccumulatedBaselines();
85 AliHLTPHOSBaselineAnalyzer::~AliHLTPHOSBaselineAnalyzer()
87 //see headerfile for documentation
92 AliHLTPHOSBaselineAnalyzer::CalculateRcuBaselines(AliHLTPHOSRcuCellEnergyDataStruct* rcuData)
94 //see headerfile for documentation
95 Int_t xOff = rcuData->fRcuX * N_XCOLUMNS_RCU;
96 Int_t zOff = rcuData->fRcuZ * N_ZROWS_RCU;
99 AliHLTPHOSValidCellDataStruct *data = rcuData->fValidData;
101 for(Int_t i = 0; i < rcuData->fCnt; i++)
103 baseline = CalculateChannelBaseline(&(data[i]), xOff, zOff);
106 CalculateAccumulatedChannelBaseline(data[i].fX + xOff, data[i].fZ + zOff, data[i].fGain, baseline);
114 AliHLTPHOSBaselineAnalyzer::CalculateChannelBaseline(AliHLTPHOSValidCellDataStruct *cellData, Int_t xOff, Int_t zOff)
116 //see headerfile for documentation
119 Int_t *data = cellData->fData;
120 for(Int_t i = fSampleStart; i < fNSamples; i++)
123 if(cellData->fGain == 0)
125 fChannelLowGainHistogramsPtr[cellData->fX + xOff][cellData->fZ + zOff]->Fill(data[i]);
129 fChannelHighGainHistogramsPtr[cellData->fX + xOff][cellData->fZ + zOff]->Fill(data[i]);
132 fChannelHistogramsPtr[cellData->fX + xOff][cellData->fZ + zOff][cellData->fGain]->Fill(data[i]);
135 if(cellData->fCrazyness == 0)
137 crazyness = fSanityInspector->CheckAndHealInsanity(data, fNSamples);
142 for(Int_t j = fSampleStart; j < fNSamples; j++)
144 if(data[j] > fMaxSignal)
147 fFixedChannelHistogramsPtr[cellData->fX + xOff][cellData->fZ + zOff][cellData->fGain]->Fill(data[j]);
150 fBaselines[cellData->fX + xOff][cellData->fZ + zOff][cellData->fGain] = (float)total / (fNSamples - fSampleStart);
152 return (float)total/(fNSamples - fSampleStart);
156 AliHLTPHOSBaselineAnalyzer::CalculateAccumulatedChannelBaseline(Int_t x, Int_t z, Int_t gain, Float_t baseline)
158 //see headerfile for documentation
159 Float_t oldBaseline = fAccumulatedBaselines[x][z][gain][0];
160 Float_t nEntries = fAccumulatedBaselines[x][z][gain][1];
162 Float_t total = nEntries * oldBaseline + baseline;
164 fAccumulatedBaselines[x][z][gain][0] = total / nEntries;
165 fAccumulatedBaselines[x][z][gain][1] = nEntries;
169 AliHLTPHOSBaselineAnalyzer::CalculateChannelsBaselineRMS()
172 //see headerfile for documentation
173 for(UInt_t x = 0; x < N_XCOLUMNS_MOD; x++)
175 for(UInt_t z = 0; z < N_ZROWS_MOD; z++)
177 for(UInt_t gain = 0; gain < N_GAINS; gain++)
179 fRMSHistogramPtr->Fill(fChannelHistogramsPtr[x][z][gain]->GetRMS());
181 fRMSMapHighGainHistogramPtr->SetBinContent(x, z, fChannelHistogramsPtr[x][z][gain]->GetRMS());
183 fRMSMapLowGainHistogramPtr->SetBinContent(x, z, fChannelHistogramsPtr[x][z][gain]->GetRMS());
185 fFixedRMSHistogramPtr->Fill(fFixedChannelHistogramsPtr[x][z][gain]->GetRMS());
187 fFixedRMSMapHighGainHistogramPtr->SetBinContent(x, z, fFixedChannelHistogramsPtr[x][z][gain]->GetRMS());
189 fFixedRMSMapLowGainHistogramPtr->SetBinContent(x, z, fFixedChannelHistogramsPtr[x][z][gain]->GetRMS());
197 AliHLTPHOSBaselineAnalyzer::SetRootObjects(TTree *tree, TClonesArray *baselineArray)
199 //see headerfile for documentation
201 fBaselineArrayPtr = baselineArray;
202 tree->Branch("Baselines", &fBaselineArrayPtr);
207 AliHLTPHOSBaselineAnalyzer::FillTree()
209 //see headerfile for documentation
210 AliHLTPHOSBaseline *baseline;
213 for(UInt_t x = 0; x < N_XCOLUMNS_MOD; x++)
215 for(UInt_t z = 0; z < N_ZROWS_MOD; z++)
217 for(UInt_t gain = 0; gain < N_GAINS; gain++)
219 baseline = (AliHLTPHOSBaseline*)fBaselineArrayPtr->New(n);
222 baseline->SetGain(gain);
223 baseline->SetBaseline(fAccumulatedBaselines[x][z][gain][0]);
224 baseline->SetEntries((Int_t)fAccumulatedBaselines[x][z][gain][1]);
230 fBaselineArrayPtr->Clear();
234 AliHLTPHOSBaselineAnalyzer::WriteAccumulatedBaselines(const Char_t* filename)
236 //see headerfile for documentation
237 TFile *baselineFile = TFile::Open(filename, "recreate");
239 baselineFile->Close();
243 AliHLTPHOSBaselineAnalyzer::WriteChannelHistograms(const Char_t* filename)
245 //see headerfile for documentation
246 TFile *file = TFile::Open(filename, "recreate");
248 for(UInt_t x = 0; x < N_XCOLUMNS_MOD; x++)
250 for(UInt_t z = 0; z < N_ZROWS_MOD; z++)
252 for(UInt_t gain = 0; gain < N_GAINS; gain++)
254 fChannelHistogramsPtr[x][z][gain]->Write();
263 AliHLTPHOSBaselineAnalyzer::WriteRMSHistogram(const Char_t* filename)
265 //see headerfile for documentation
266 TFile *file = TFile::Open(filename, "recreate");
267 fRMSHistogramPtr->Write();
268 fRMSMapHighGainHistogramPtr->Write();
269 fRMSMapLowGainHistogramPtr->Write();
271 fFixedRMSHistogramPtr->Write();
272 fFixedRMSMapHighGainHistogramPtr->Write();
273 fFixedRMSMapLowGainHistogramPtr->Write();
279 AliHLTPHOSBaselineAnalyzer::ResetBaselines()
281 //see headerfile for documentation
282 for(UInt_t x = 0; x < N_XCOLUMNS_MOD; x++)
284 for(UInt_t z = 0; z < N_ZROWS_MOD; z++)
286 for(UInt_t gain = 0; gain < N_GAINS; gain++)
288 fBaselines[x][z][gain] = 0;
295 AliHLTPHOSBaselineAnalyzer::ResetChannelCount()
297 //see headerfile for documentation
302 AliHLTPHOSBaselineAnalyzer::ResetAccumulatedBaselines()
304 for(UInt_t x = 0; x < N_XCOLUMNS_MOD; x++)
306 for(UInt_t z = 0; z < N_ZROWS_MOD; z++)
308 for(UInt_t gain = 0; gain < N_GAINS; gain++)
310 fAccumulatedBaselines[x][z][gain][0] = 0;
311 fAccumulatedBaselines[x][z][gain][1] = 0;
318 AliHLTPHOSBaselineAnalyzer::SetMaxCrazyDifference(Int_t diff)
320 //see headerfile for documentation
321 fMaxCrazyDifference = diff;
322 fSanityInspector->SetMaxDifference(diff);
329 AliHLTPHOSBaselineAnalyzer::SetChannelsHistograms(TH1F *channelLowGainHistArray[N_XCOLUMNS_MOD][N_ZROWS_MOD], TH1F *channelHighGainHistArray[N_XCOLUMNS_MOD][N_ZROWS_MOD])
331 for(UInt_t x = 0; x < N_XCOLUMNS_MOD; x++)
333 for(UInt_t z = 0; z < N_ZROWS_MOD; z++)
335 for(UInt_t gain = 0; gain < N_GAINS; gain++)
337 fChannelLowGainHistogramsPtr[x][z][gain] = channelLowGainHistArray[x][z][gain];
338 fChannelHighGainHistogramsPtr[x][z][gain] = channelHighGainHistArray[x][z][gain];