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 **************************************************************************/
16 * @file AliHLTPHOSClusterizer.cxx
17 * @author Oystein Djuvsland
19 * @brief Digit maker for PHOS HLT
25 // see header file for class documentation
27 // refer to README to build package
29 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
31 #include "AliHLTPHOSDigitMaker.h"
32 #include "AliHLTPHOSDigit.h"
33 #include "AliHLTPHOSConstants.h"
34 #include "AliHLTPHOSBaseline.h"
35 #include "AliHLTPHOSMapper.h"
38 #include "TClonesArray.h"
42 #include "AliHLTPHOSValidCellDataStruct.h"
43 #include "AliHLTPHOSRcuCellEnergyDataStruct.h"
44 #include "AliHLTPHOSChannelDataStruct.h"
45 #include "AliHLTPHOSChannelDataHeaderStruct.h"
46 #include "AliHLTPHOSDigitDataStruct.h"
47 #include "AliHLTPHOSDigitContainerDataStruct.h"
48 #include "AliHLTPHOSSharedMemoryInterfacev2.h" // added by PTH
51 ClassImp(AliHLTPHOSDigitMaker);
53 using namespace PhosHLTConst;
55 AliHLTPHOSDigitMaker::AliHLTPHOSDigitMaker() :
58 fDigitContainerStructPtr(0),
65 // See header file for documentation
67 fShmPtr = new AliHLTPHOSSharedMemoryInterfacev2();
69 for(int x = 0; x < N_XCOLUMNS_MOD; x++)
71 for(int z = 0; z < N_ZROWS_MOD; z++)
73 fHighGainFactors[x][z] = 0.005;
74 fLowGainFactors[x][z] = 0.08;
75 fDigitThresholds[x][z][HIGH_GAIN] = 2;
76 fDigitThresholds[x][z][LOW_GAIN] = 2;
77 fBadChannelMask[x][z][HIGH_GAIN] = 1;
78 fBadChannelMask[x][z][LOW_GAIN] = 1;
82 for(int x = 0; x < N_XCOLUMNS_RCU; x++)
84 for(int z = 0; z < N_ZROWS_RCU; z++)
86 for(int gain = 0; gain < N_GAINS; gain++)
88 fEnergyArray[x][z][gain] = 0;
96 AliHLTPHOSDigitMaker::~AliHLTPHOSDigitMaker()
98 //See header file for documentation
102 AliHLTPHOSDigitMaker::MakeDigits(AliHLTPHOSChannelDataHeaderStruct* channelDataHeader)
104 //See header file for documentation
107 Float_t tmpEnergy = 0;
112 AliHLTPHOSMapper mapper;
117 AliHLTPHOSChannelDataStruct* currentchannel = 0;
118 AliHLTPHOSChannelDataStruct* currentchannelLG = 0;
119 AliHLTPHOSChannelDataStruct* tmpchannel = 0;
123 fShmPtr->SetMemory(channelDataHeader);
124 currentchannel = fShmPtr->NextChannel();
126 // while(currentchannel != 0)
128 // fEnergyArray[currentchannel->fX][currentchannel->fZ][currentchannel->fGain] = currentchannel->fEnergy;
129 // currentchannel = fShmPtr->NextChannel();
133 while(currentchannel != 0)
135 AliHLTPHOSMapper::GetChannelCoord(currentchannel->fChannelID, coord1);
138 tmpchannel = currentchannel;
139 if(coord1[2] == HIGH_GAIN)
142 if(currentchannel->fEnergy < MAX_BIN_VALUE)
144 fDigitStructPtr = &(fDigitContainerStructPtr->fDigitDataStruct[j+fDigitCount]);
145 fDigitStructPtr->fX = coord1[0];
146 fDigitStructPtr->fZ = coord1[1];
147 fDigitStructPtr->fAmplitude = currentchannel->fEnergy;
148 fDigitStructPtr->fEnergy = currentchannel->fEnergy * fHighGainFactors[coord1[0]][coord1[1]];
149 //TODO: fix time //CRAP
150 fDigitStructPtr->fTime = currentchannel->fTime * 0.0000001;
151 fDigitStructPtr->fCrazyness = currentchannel->fCrazyness;
152 fDigitStructPtr->fModule = coord1[3];
154 currentchannel = fShmPtr->NextChannel();
155 AliHLTPHOSMapper::GetChannelCoord(currentchannel->fChannelID, coord2);
156 if(coord1[0] == coord2[0] && coord1[1] == coord2[1])
158 fShmPtr->NextChannel();
163 currentchannel = fShmPtr->NextChannel();
164 AliHLTPHOSMapper::GetChannelCoord(currentchannel->fChannelID, coord2);
165 if(coord2[2] == LOW_GAIN)
167 fDigitStructPtr = &(fDigitContainerStructPtr->fDigitDataStruct[j+fDigitCount]);
168 fDigitStructPtr->fX = coord2[0];
169 fDigitStructPtr->fZ = coord2[1];
170 fDigitStructPtr->fAmplitude = currentchannel->fEnergy;
171 fDigitStructPtr->fEnergy = currentchannel->fEnergy * fHighGainFactors[coord2[0]][coord2[1]];
172 //TODO: fix time //CRAP
173 fDigitStructPtr->fTime = currentchannel->fTime * 0.0000001;
174 fDigitStructPtr->fCrazyness = currentchannel->fCrazyness;
175 fDigitStructPtr->fModule = coord2[3];
177 currentchannel = fShmPtr->NextChannel();
181 fDigitStructPtr = &(fDigitContainerStructPtr->fDigitDataStruct[j+fDigitCount]);
182 fDigitStructPtr->fX = coord1[0];
183 fDigitStructPtr->fZ = coord1[1];
184 fDigitStructPtr->fAmplitude = tmpchannel->fEnergy;
185 fDigitStructPtr->fEnergy = tmpchannel->fEnergy * fHighGainFactors[coord1[0]][coord1[1]];
186 //TODO: fix time //CRAP
187 fDigitStructPtr->fTime = tmpchannel->fTime * 0.0000001;
188 fDigitStructPtr->fCrazyness = 100;
189 fDigitStructPtr->fModule = coord1[3];
197 fDigitStructPtr = &(fDigitContainerStructPtr->fDigitDataStruct[j+fDigitCount]);
198 fDigitStructPtr->fX = coord1[0];
199 fDigitStructPtr->fZ = coord1[1];
200 fDigitStructPtr->fAmplitude = tmpchannel->fEnergy;
201 fDigitStructPtr->fEnergy = tmpchannel->fEnergy * fHighGainFactors[coord1[0]][coord1[1]];
202 //TODO: fix time //CRAP
203 fDigitStructPtr->fTime = tmpchannel->fTime * 0.0000001;
204 fDigitStructPtr->fCrazyness = 100;
205 fDigitStructPtr->fModule = coord1[3];
207 currentchannel = fShmPtr->NextChannel();
213 if(coord1[2] == LOW_GAIN)
215 currentchannelLG = currentchannel;
216 currentchannel = fShmPtr->NextChannel();
217 AliHLTPHOSMapper::GetChannelCoord(currentchannel->fChannelID, coord2);
219 if(coord1[0] == coord2[0] && coord1[1] == coord2[1])
221 if(currentchannel->fEnergy < MAX_BIN_VALUE)
223 fDigitStructPtr = &(fDigitContainerStructPtr->fDigitDataStruct[j+fDigitCount]);
224 fDigitStructPtr->fX = coord2[0];
225 fDigitStructPtr->fZ = coord2[1];
226 fDigitStructPtr->fAmplitude = currentchannel->fEnergy;
227 fDigitStructPtr->fEnergy = currentchannel->fEnergy * fHighGainFactors[coord2[0]][coord2[1]];
228 //TODO: fix time //CRAP
229 fDigitStructPtr->fTime = currentchannel->fTime * 0.0000001;
230 fDigitStructPtr->fCrazyness = currentchannel->fCrazyness;
231 fDigitStructPtr->fModule = coord2[3];
233 currentchannel = fShmPtr->NextChannel();
237 fDigitStructPtr = &(fDigitContainerStructPtr->fDigitDataStruct[j+fDigitCount]);
238 fDigitStructPtr->fX = coord1[0];
239 fDigitStructPtr->fZ = coord1[1];
240 fDigitStructPtr->fAmplitude = currentchannelLG->fEnergy;
241 fDigitStructPtr->fEnergy = currentchannelLG->fEnergy * fHighGainFactors[coord1[0]][coord1[1]];
242 //TODO: fix time //CRAP
243 fDigitStructPtr->fTime = currentchannelLG->fTime * 0.0000001;
244 fDigitStructPtr->fCrazyness = currentchannel->fCrazyness;
245 fDigitStructPtr->fModule = coord1[3];
247 currentchannel = fShmPtr->NextChannel();
252 fDigitStructPtr = &(fDigitContainerStructPtr->fDigitDataStruct[j+fDigitCount]);
253 fDigitStructPtr->fX = coord1[0];
254 fDigitStructPtr->fZ = coord1[1];
255 fDigitStructPtr->fAmplitude = currentchannelLG->fEnergy;
256 fDigitStructPtr->fEnergy = currentchannelLG->fEnergy * fHighGainFactors[coord1[0]][coord1[1]];
257 //TODO: fix time //CRAP
258 fDigitStructPtr->fTime = currentchannelLG->fTime * 0.0000001;
259 fDigitStructPtr->fCrazyness = currentchannel->fCrazyness;
260 fDigitStructPtr->fModule = coord1[3];
266 fDigitStructPtr = &(fDigitContainerStructPtr->fDigitDataStruct[j+fDigitCount]);
267 fDigitStructPtr->fX = coord1[0];
268 fDigitStructPtr->fZ = coord1[1];
269 fDigitStructPtr->fAmplitude = currentchannel->fEnergy;
270 fDigitStructPtr->fEnergy = currentchannel->fEnergy * fHighGainFactors[coord1[0]][coord1[1]];
271 //TODO: fix time //CRAP
272 fDigitStructPtr->fTime = currentchannel->fTime * 0.0000001;
273 fDigitStructPtr->fCrazyness = currentchannel->fCrazyness;
274 fDigitStructPtr->fModule = coord2[3];
276 fShmPtr->NextChannel();
284 // for(int x = 0; x < N_XCOLUMNS_RCU; x++)
286 // for(int z = 0; z < N_ZROWS_RCU; z++)
288 // xMod = x + rcuData->fRcuX * N_XCOLUMNS_RCU;
289 // zMod = z + rcuData->fRcuZ * N_ZROWS_RCU;
291 // if(fEnergyArray[x][z][HIGH_GAIN] > fDigitThresholds[xMod][zMod][HIGH_GAIN] && fEnergyArray[x][z][HIGH_GAIN] < MAX_BIN_VALUE && fBadChannelMask[xMod][zMod][HIGH_GAIN])
293 // fDigitStructPtr = &(fDigitContainerStructPtr->fDigitDataStruct[j+fDigitCount]);
294 // fDigitStructPtr->fX = xMod;
295 // fDigitStructPtr->fZ = zMod;
296 // fDigitStructPtr->fAmplitude = fEnergyArray[x][z][HIGH_GAIN];
297 // fDigitStructPtr->fEnergy = fEnergyArray[x][z][HIGH_GAIN] * fHighGainFactors[xMod][zMod];
298 // //TODO: fix time //CRAP
299 // fDigitStructPtr->fTime = fCellDataPtr->fTime * 0.0000001;
300 // fDigitStructPtr->fCrazyness = fCellDataPtr->fCrazyness;
301 // fDigitStructPtr->fModule = rcuData->fModuleID;
304 // else if(fEnergyArray[x][z][LOW_GAIN] >= MAX_BIN_VALUE && fBadChannelMask[xMod][zMod][LOW_GAIN])
306 // if(fEnergyArray[x][z][LOW_GAIN] > fDigitThresholds[xMod][zMod][LOW_GAIN])
308 // fDigitStructPtr = &(fDigitContainerStructPtr->fDigitDataStruct[j+fDigitCount]);
309 // fDigitStructPtr->fX = xMod;
310 // fDigitStructPtr->fZ = zMod;
311 // fDigitStructPtr->fAmplitude = fEnergyArray[x][z][LOW_GAIN];
312 // fDigitStructPtr->fEnergy = fEnergyArray[x][z][LOW_GAIN] * fLowGainFactors[xMod][zMod];
313 // //TODO: fix time //CRAP
314 // fDigitStructPtr->fTime = fCellDataPtr->fTime * 0.0000001;;
315 // fDigitStructPtr->fCrazyness = fCellDataPtr->fCrazyness;
316 // fDigitStructPtr->fModule = rcuData->fModuleID;
324 fDigitContainerStructPtr->fNDigits = fDigitCount;
330 AliHLTPHOSDigitMaker::Reset()
332 //See header file for documentation
334 for(int x = 0; x < N_XCOLUMNS_RCU; x++)
336 for(int z = 0; z < N_ZROWS_RCU; z++)
338 for(int gain = 0; gain < N_GAINS; gain++)
340 fEnergyArray[x][z][gain] = 0;
349 AliHLTPHOSDigitMaker::SetGlobalHighGainFactor(Float_t factor)
351 //See header file for documentation
352 for(int x = 0; x < N_XCOLUMNS_MOD; x++)
354 for(int z = 0; z < N_ZROWS_MOD; z++)
356 fHighGainFactors[x][z] = factor;
362 AliHLTPHOSDigitMaker::SetGlobalLowGainFactor(Float_t factor)
364 //See header file for documentation
365 for(int x = 0; x < N_XCOLUMNS_MOD; x++)
367 for(int z = 0; z < N_ZROWS_MOD; z++)
369 fLowGainFactors[x][z] = factor;
375 AliHLTPHOSDigitMaker::SetDigitThresholds(const char* filepath, Int_t nSigmas)
377 //See header file for documentation
378 TFile *histFile = new TFile(filepath);
380 TH2F *lgHist = (TH2F*)histFile->Get("RMSLGMapHist");
381 TH2F *hgHist = (TH2F*)histFile->Get("RMSHGMapHist");
383 for(int x = 0; x < N_XCOLUMNS_MOD; x++)
385 for(int z = 0; z < N_ZROWS_MOD; z++)
387 fDigitThresholds[x][z][LOW_GAIN] = lgHist->GetBinContent(x, z) * nSigmas;
388 fDigitThresholds[x][z][HIGH_GAIN] = hgHist->GetBinContent(x, z) * nSigmas;
394 AliHLTPHOSDigitMaker::SetDigitThresholds(const Float_t thresholdHG, const Float_t thresholdLG)
396 //See header file for documentation
397 for(int x = 0; x < N_XCOLUMNS_MOD; x++)
399 for(int z = 0; z < N_ZROWS_MOD; z++)
401 fDigitThresholds[x][z][LOW_GAIN] = thresholdHG;
402 fDigitThresholds[x][z][HIGH_GAIN] = thresholdLG;
409 AliHLTPHOSDigitMaker::SetBadChannelMask(TH2F* badChannelHGHist, TH2F* badChannelLGHist, Float_t qCut)
411 for(int x = 0; x < N_XCOLUMNS_MOD; x++)
413 for(int z = 0; z < N_ZROWS_MOD; z++)
415 if(badChannelHGHist->GetBinContent(x, z) < qCut && badChannelHGHist->GetBinContent(x, z) > 0)
417 fBadChannelMask[x][z][HIGH_GAIN] = 1;
421 fBadChannelMask[x][z][HIGH_GAIN] = 0;
423 if(badChannelLGHist->GetBinContent(x, z) < qCut && badChannelLGHist->GetBinContent(x, z) > 0)
425 fBadChannelMask[x][z][LOW_GAIN] = 0;
429 fBadChannelMask[x][z][LOW_GAIN] = 0;