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(int x = 0; x < N_XCOLUMNS_MOD; x++)
67 for(int z = 0; z < N_ZROWS_MOD; z++)
69 for(int 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)
103 rcuData --; //shutting up rule checker
104 //see headerfile for documentation
105 //Int_t xOff = rcuData->fRcuX * N_XCOLUMNS_RCU;
106 //Int_t zOff = rcuData->fRcuZ * N_ZROWS_RCU;
107 //Float_t baseline = 0;
109 //TODO: fix this to comply with new format
111 AliHLTPHOSValidCellDataStruct *data = rcuData->fValidData;
113 for(Int_t i = 0; i < rcuData->fCnt; i++)
115 baseline = CalculateChannelBaseline(&(data[i]), xOff, zOff);
118 CalculateAccumulatedChannelBaseline(data[i].fX + xOff, data[i].fZ + zOff, data[i].fGain, baseline);
126 AliHLTPHOSBaselineAnalyzer::CalculateChannelBaseline(AliHLTPHOSValidCellDataStruct *cellData, Int_t xOff, Int_t zOff)
128 //see headerfile for documentation
131 Int_t *data = cellData->fData;
132 for(Int_t i = fSampleStart; i < fNSamples; i++)
135 if(cellData->fGain == 0)
137 fChannelLowGainHistogramsPtr[cellData->fX + xOff][cellData->fZ + zOff]->Fill(data[i]);
141 fChannelHighGainHistogramsPtr[cellData->fX + xOff][cellData->fZ + zOff]->Fill(data[i]);
144 fChannelHistogramsPtr[cellData->fX + xOff][cellData->fZ + zOff][cellData->fGain]->Fill(data[i]);
147 if(cellData->fCrazyness == 0)
149 crazyness = fSanityInspector->CheckAndHealInsanity(data, fNSamples);
154 for(Int_t j = fSampleStart; j < fNSamples; j++)
156 if(data[j] > fMaxSignal)
159 fFixedChannelHistogramsPtr[cellData->fX + xOff][cellData->fZ + zOff][cellData->fGain]->Fill(data[j]);
162 fBaselines[cellData->fX + xOff][cellData->fZ + zOff][cellData->fGain] = (float)total / (fNSamples - fSampleStart);
164 return (float)total/(fNSamples - fSampleStart);
168 AliHLTPHOSBaselineAnalyzer::CalculateAccumulatedChannelBaseline(Int_t x, Int_t z, Int_t gain, Float_t baseline)
170 //see headerfile for documentation
171 Float_t oldBaseline = fAccumulatedBaselines[x][z][gain][0];
172 Float_t nEntries = fAccumulatedBaselines[x][z][gain][1];
174 Float_t total = nEntries * oldBaseline + baseline;
176 fAccumulatedBaselines[x][z][gain][0] = total / nEntries;
177 fAccumulatedBaselines[x][z][gain][1] = nEntries;
181 AliHLTPHOSBaselineAnalyzer::CalculateChannelsBaselineRMS()
184 //see headerfile for documentation
185 for(int x = 0; x < N_XCOLUMNS_MOD; x++)
187 for(int z = 0; z < N_ZROWS_MOD; z++)
189 for(int gain = 0; gain < N_GAINS; gain++)
191 fRMSHistogramPtr->Fill(fChannelHistogramsPtr[x][z][gain]->GetRMS());
193 fRMSMapHighGainHistogramPtr->SetBinContent(x, z, fChannelHistogramsPtr[x][z][gain]->GetRMS());
195 fRMSMapLowGainHistogramPtr->SetBinContent(x, z, fChannelHistogramsPtr[x][z][gain]->GetRMS());
197 fFixedRMSHistogramPtr->Fill(fFixedChannelHistogramsPtr[x][z][gain]->GetRMS());
199 fFixedRMSMapHighGainHistogramPtr->SetBinContent(x, z, fFixedChannelHistogramsPtr[x][z][gain]->GetRMS());
201 fFixedRMSMapLowGainHistogramPtr->SetBinContent(x, z, fFixedChannelHistogramsPtr[x][z][gain]->GetRMS());
210 AliHLTPHOSBaselineAnalyzer::SetRootObjects(TTree *tree, TClonesArray *baselineArray)
212 //see headerfile for documentation
214 fBaselineArrayPtr = baselineArray;
215 tree->Branch("Baselines", &fBaselineArrayPtr);
220 AliHLTPHOSBaselineAnalyzer::FillTree()
222 //see headerfile for documentation
223 AliHLTPHOSBaseline *baseline;
226 for(int x = 0; x < N_XCOLUMNS_MOD; x++)
228 for(int z = 0; z < N_ZROWS_MOD; z++)
230 for(int gain = 0; gain < N_GAINS; gain++)
232 baseline = (AliHLTPHOSBaseline*)fBaselineArrayPtr->New(n);
235 baseline->SetGain(gain);
236 baseline->SetBaseline(fAccumulatedBaselines[x][z][gain][0]);
237 baseline->SetEntries((Int_t)fAccumulatedBaselines[x][z][gain][1]);
243 fBaselineArrayPtr->Clear();
247 AliHLTPHOSBaselineAnalyzer::WriteAccumulatedBaselines(const Char_t* filename)
249 //see headerfile for documentation
250 TFile *baselineFile = TFile::Open(filename, "recreate");
252 baselineFile->Close();
256 AliHLTPHOSBaselineAnalyzer::WriteChannelHistograms(const Char_t* filename)
258 //see headerfile for documentation
259 TFile *file = TFile::Open(filename, "recreate");
261 for(int x = 0; x < N_XCOLUMNS_MOD; x++)
263 for(int z = 0; z < N_ZROWS_MOD; z++)
265 for(int gain = 0; gain < N_GAINS; gain++)
267 fChannelHistogramsPtr[x][z][gain]->Write();
276 AliHLTPHOSBaselineAnalyzer::WriteRMSHistogram(const Char_t* filename)
278 //see headerfile for documentation
279 TFile *file = TFile::Open(filename, "recreate");
280 fRMSHistogramPtr->Write();
281 fRMSMapHighGainHistogramPtr->Write();
282 fRMSMapLowGainHistogramPtr->Write();
283 fFixedRMSHistogramPtr->Write();
284 fFixedRMSMapHighGainHistogramPtr->Write();
285 fFixedRMSMapLowGainHistogramPtr->Write();
291 AliHLTPHOSBaselineAnalyzer::ResetBaselines()
293 //see headerfile for documentation
294 for(int x = 0; x < N_XCOLUMNS_MOD; x++)
296 for(int z = 0; z < N_ZROWS_MOD; z++)
298 for(int gain = 0; gain < N_GAINS; gain++)
300 fBaselines[x][z][gain] = 0;
308 AliHLTPHOSBaselineAnalyzer::ResetChannelCount()
310 //see headerfile for documentation
315 AliHLTPHOSBaselineAnalyzer::ResetAccumulatedBaselines()
317 for(int x = 0; x < N_XCOLUMNS_MOD; x++)
319 for(int z = 0; z < N_ZROWS_MOD; z++)
321 for(int gain = 0; gain < N_GAINS; gain++)
323 fAccumulatedBaselines[x][z][gain][0] = 0;
324 fAccumulatedBaselines[x][z][gain][1] = 0;
331 AliHLTPHOSBaselineAnalyzer::SetMaxCrazyDifference(Int_t diff)
333 //see headerfile for documentation
334 fMaxCrazyDifference = diff;
335 fSanityInspector->SetMaxDifference(diff);
342 AliHLTPHOSBaselineAnalyzer::SetChannelsHistograms(TH1F *channelLowGainHistArray[N_XCOLUMNS_MOD][N_ZROWS_MOD], TH1F *channelHighGainHistArray[N_XCOLUMNS_MOD][N_ZROWS_MOD])
344 for(int x = 0; x < N_XCOLUMNS_MOD; x++)
346 for(int z = 0; z < N_ZROWS_MOD; z++)
348 for(int gain = 0; gain < N_GAINS; gain++)
350 fChannelLowGainHistogramsPtr[x][z][gain] = channelLowGainHistArray[x][z][gain];
351 fChannelHighGainHistogramsPtr[x][z][gain] = channelHighGainHistArray[x][z][gain];