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),
53 fRMSMapHighGainHistogramPtr(0),
54 fRMSMapLowGainHistogramPtr(0),
55 fFixedRMSHistogramPtr(0),
56 fFixedRMSMapHighGainHistogramPtr(0),
57 fFixedRMSMapLowGainHistogramPtr(0),
60 //see headerfile for documentation
61 fSanityInspector = new AliHLTPHOSSanityInspector();
65 for(UInt_t x = 0; x < N_XCOLUMNS_MOD; x++)
67 for(UInt_t z = 0; z < N_ZROWS_MOD; z++)
69 for(UInt_t gain = 0; gain < N_GAINS; gain++)
71 sprintf(histName, "sample_value_channel_x_col_%d_z_row_%d_gain_%d", x, z, gain);
72 sprintf(histTitle, "Distribution of Sample Values for Channel X: %d - Z: %d - Gain: %d", x, z, gain);
73 fChannelHistogramsPtr[x][z][gain] = new TH1F(histName, histTitle, 1024, 0, 1023);
74 sprintf(histName, "fixed_sample_value_channel_x_col_%d_z_row_%d_gain_%d", x, z, gain);
75 sprintf(histTitle, "Distribution of Corrected Sample Values for Channel X: %d - Z: %d - Gain: %d", x, z, gain);
76 fFixedChannelHistogramsPtr[x][z][gain] = new TH1F(histName, histTitle, 1024, 0, 1023);
81 fRMSHistogramPtr = new TH1F("RMSHist", "RMS Values for All Channels", 1023, 0, 1023);
82 fRMSMapHighGainHistogramPtr = new TH2F("RMSHGMapHist", "Map of RMS Values for High Gain Channels", 64, 0, 63, 56, 0, 55);
83 fRMSMapLowGainHistogramPtr = new TH2F("RMSLGMapHist", "Map of RMS Values for Low Gain Channels", 64, 0, 63, 56, 0, 55);
85 fFixedRMSHistogramPtr = new TH1F("fixedRMSHist", "Corrected RMS Values for All Channels", 1023, 0, 1023);
86 fFixedRMSMapHighGainHistogramPtr = new TH2F("fixedRMSHGMapHist", "Map of Corrected RMS Values for High Gain Channels", 64, 0, 63, 56, 0, 55);
87 fFixedRMSMapLowGainHistogramPtr = new TH2F("fixedRMSLGMapHist", "Map of Corrected RMS Values for Low Gain Channels", 64, 0, 63, 56, 0, 55);
90 ResetAccumulatedBaselines();
93 AliHLTPHOSBaselineAnalyzer::~AliHLTPHOSBaselineAnalyzer()
95 //see headerfile for documentation
100 AliHLTPHOSBaselineAnalyzer::CalculateRcuBaselines(AliHLTPHOSRcuCellEnergyDataStruct* rcuData)
102 //see headerfile for documentation
103 //Int_t xOff = rcuData->fRcuX * N_XCOLUMNS_RCU;
104 //Int_t zOff = rcuData->fRcuZ * N_ZROWS_RCU;
105 //Float_t baseline = 0;
107 //TODO: fix this to comply with new format
109 AliHLTPHOSValidCellDataStruct *data = rcuData->fValidData;
111 for(Int_t i = 0; i < rcuData->fCnt; i++)
113 baseline = CalculateChannelBaseline(&(data[i]), xOff, zOff);
116 CalculateAccumulatedChannelBaseline(data[i].fX + xOff, data[i].fZ + zOff, data[i].fGain, baseline);
124 AliHLTPHOSBaselineAnalyzer::CalculateChannelBaseline(AliHLTPHOSValidCellDataStruct *cellData, Int_t xOff, Int_t zOff)
126 //see headerfile for documentation
129 Int_t *data = cellData->fData;
130 for(Int_t i = fSampleStart; i < fNSamples; i++)
133 if(cellData->fGain == 0)
135 fChannelLowGainHistogramsPtr[cellData->fX + xOff][cellData->fZ + zOff]->Fill(data[i]);
139 fChannelHighGainHistogramsPtr[cellData->fX + xOff][cellData->fZ + zOff]->Fill(data[i]);
142 fChannelHistogramsPtr[cellData->fX + xOff][cellData->fZ + zOff][cellData->fGain]->Fill(data[i]);
145 if(cellData->fCrazyness == 0)
147 crazyness = fSanityInspector->CheckAndHealInsanity(data, fNSamples);
152 for(Int_t j = fSampleStart; j < fNSamples; j++)
154 if(data[j] > fMaxSignal)
157 fFixedChannelHistogramsPtr[cellData->fX + xOff][cellData->fZ + zOff][cellData->fGain]->Fill(data[j]);
160 fBaselines[cellData->fX + xOff][cellData->fZ + zOff][cellData->fGain] = (float)total / (fNSamples - fSampleStart);
162 return (float)total/(fNSamples - fSampleStart);
166 AliHLTPHOSBaselineAnalyzer::CalculateAccumulatedChannelBaseline(Int_t x, Int_t z, Int_t gain, Float_t baseline)
168 //see headerfile for documentation
169 Float_t oldBaseline = fAccumulatedBaselines[x][z][gain][0];
170 Float_t nEntries = fAccumulatedBaselines[x][z][gain][1];
172 Float_t total = nEntries * oldBaseline + baseline;
174 fAccumulatedBaselines[x][z][gain][0] = total / nEntries;
175 fAccumulatedBaselines[x][z][gain][1] = nEntries;
179 AliHLTPHOSBaselineAnalyzer::CalculateChannelsBaselineRMS()
182 //see headerfile for documentation
183 for(UInt_t x = 0; x < N_XCOLUMNS_MOD; x++)
185 for(UInt_t z = 0; z < N_ZROWS_MOD; z++)
187 for(UInt_t gain = 0; gain < N_GAINS; gain++)
189 fRMSHistogramPtr->Fill(fChannelHistogramsPtr[x][z][gain]->GetRMS());
191 fRMSMapHighGainHistogramPtr->SetBinContent(x, z, fChannelHistogramsPtr[x][z][gain]->GetRMS());
193 fRMSMapLowGainHistogramPtr->SetBinContent(x, z, fChannelHistogramsPtr[x][z][gain]->GetRMS());
195 fFixedRMSHistogramPtr->Fill(fFixedChannelHistogramsPtr[x][z][gain]->GetRMS());
197 fFixedRMSMapHighGainHistogramPtr->SetBinContent(x, z, fFixedChannelHistogramsPtr[x][z][gain]->GetRMS());
199 fFixedRMSMapLowGainHistogramPtr->SetBinContent(x, z, fFixedChannelHistogramsPtr[x][z][gain]->GetRMS());
207 AliHLTPHOSBaselineAnalyzer::SetRootObjects(TTree *tree, TClonesArray *baselineArray)
209 //see headerfile for documentation
211 fBaselineArrayPtr = baselineArray;
212 tree->Branch("Baselines", &fBaselineArrayPtr);
217 AliHLTPHOSBaselineAnalyzer::FillTree()
219 //see headerfile for documentation
220 AliHLTPHOSBaseline *baseline;
223 for(UInt_t x = 0; x < N_XCOLUMNS_MOD; x++)
225 for(UInt_t z = 0; z < N_ZROWS_MOD; z++)
227 for(UInt_t gain = 0; gain < N_GAINS; gain++)
229 baseline = (AliHLTPHOSBaseline*)fBaselineArrayPtr->New(n);
232 baseline->SetGain(gain);
233 baseline->SetBaseline(fAccumulatedBaselines[x][z][gain][0]);
234 baseline->SetEntries((Int_t)fAccumulatedBaselines[x][z][gain][1]);
240 fBaselineArrayPtr->Clear();
244 AliHLTPHOSBaselineAnalyzer::WriteAccumulatedBaselines(const Char_t* filename)
246 //see headerfile for documentation
247 TFile *baselineFile = TFile::Open(filename, "recreate");
249 baselineFile->Close();
253 AliHLTPHOSBaselineAnalyzer::WriteChannelHistograms(const Char_t* filename)
255 //see headerfile for documentation
256 TFile *file = TFile::Open(filename, "recreate");
258 for(UInt_t x = 0; x < N_XCOLUMNS_MOD; x++)
260 for(UInt_t z = 0; z < N_ZROWS_MOD; z++)
262 for(UInt_t gain = 0; gain < N_GAINS; gain++)
264 fChannelHistogramsPtr[x][z][gain]->Write();
273 AliHLTPHOSBaselineAnalyzer::WriteRMSHistogram(const Char_t* filename)
275 //see headerfile for documentation
276 TFile *file = TFile::Open(filename, "recreate");
277 fRMSHistogramPtr->Write();
278 fRMSMapHighGainHistogramPtr->Write();
279 fRMSMapLowGainHistogramPtr->Write();
281 fFixedRMSHistogramPtr->Write();
282 fFixedRMSMapHighGainHistogramPtr->Write();
283 fFixedRMSMapLowGainHistogramPtr->Write();
289 AliHLTPHOSBaselineAnalyzer::ResetBaselines()
291 //see headerfile for documentation
292 for(UInt_t x = 0; x < N_XCOLUMNS_MOD; x++)
294 for(UInt_t z = 0; z < N_ZROWS_MOD; z++)
296 for(UInt_t gain = 0; gain < N_GAINS; gain++)
298 fBaselines[x][z][gain] = 0;
305 AliHLTPHOSBaselineAnalyzer::ResetChannelCount()
307 //see headerfile for documentation
312 AliHLTPHOSBaselineAnalyzer::ResetAccumulatedBaselines()
314 for(UInt_t x = 0; x < N_XCOLUMNS_MOD; x++)
316 for(UInt_t z = 0; z < N_ZROWS_MOD; z++)
318 for(UInt_t gain = 0; gain < N_GAINS; gain++)
320 fAccumulatedBaselines[x][z][gain][0] = 0;
321 fAccumulatedBaselines[x][z][gain][1] = 0;
328 AliHLTPHOSBaselineAnalyzer::SetMaxCrazyDifference(Int_t diff)
330 //see headerfile for documentation
331 fMaxCrazyDifference = diff;
332 fSanityInspector->SetMaxDifference(diff);
339 AliHLTPHOSBaselineAnalyzer::SetChannelsHistograms(TH1F *channelLowGainHistArray[N_XCOLUMNS_MOD][N_ZROWS_MOD], TH1F *channelHighGainHistArray[N_XCOLUMNS_MOD][N_ZROWS_MOD])
341 for(UInt_t x = 0; x < N_XCOLUMNS_MOD; x++)
343 for(UInt_t z = 0; z < N_ZROWS_MOD; z++)
345 for(UInt_t gain = 0; gain < N_GAINS; gain++)
347 fChannelLowGainHistogramsPtr[x][z][gain] = channelLowGainHistArray[x][z][gain];
348 fChannelHighGainHistogramsPtr[x][z][gain] = channelHighGainHistArray[x][z][gain];