3 /**************************************************************************
4 * This file is property of and copyright by the ALICE HLT Project *
5 * All rights reserved. *
7 * Primary Authors: Oystein Djuvsland *
9 * Permission to use, copy, modify and distribute this software and its *
10 * documentation strictly for non-commercial purposes is hereby granted *
11 * without fee, provided that the above copyright notice appears in all *
12 * copies and that both the copyright notice and this permission notice *
13 * appear in the supporting documentation. The authors make no claims *
14 * about the suitability of this software for any purpose. It is *
15 * provided "as is" without express or implied warranty. *
16 **************************************************************************/
18 * @file AliHLTPHOSClusterizer.cxx
19 * @author Oystein Djuvsland
21 * @brief Digit maker for PHOS HLT
27 // see header file for class documentation
29 // refer to README to build package
31 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
33 #include "AliHLTPHOSDigitMaker.h"
35 #include "AliHLTPHOSConstants.h"
36 #include "AliHLTPHOSMapper.h"
38 #include "AliHLTPHOSChannelDataStruct.h"
39 #include "AliHLTPHOSChannelDataHeaderStruct.h"
40 #include "AliHLTPHOSDigitDataStruct.h"
41 #include "AliHLTPHOSSharedMemoryInterfacev2.h" // added by PTH
45 ClassImp(AliHLTPHOSDigitMaker);
47 using namespace PhosHLTConst;
49 AliHLTPHOSDigitMaker::AliHLTPHOSDigitMaker() :
57 // See header file for documentation
59 fShmPtr = new AliHLTPHOSSharedMemoryInterfacev2();
61 for(int x = 0; x < NXCOLUMNSMOD; x++)
63 for(int z = 0; z < NZROWSMOD; z++)
65 fHighGainFactors[x][z] = 0.005;
66 fLowGainFactors[x][z] = 0.08;
67 fBadChannelMask[x][z][HIGHGAIN] = 1;
68 fBadChannelMask[x][z][LOWGAIN] = 1;
71 fMapperPtr = new AliHLTPHOSMapper();
75 AliHLTPHOSDigitMaker::~AliHLTPHOSDigitMaker()
77 //See header file for documentation
81 AliHLTPHOSDigitMaker::MakeDigits(AliHLTPHOSChannelDataHeaderStruct* channelDataHeader, AliHLTUInt32_t availableSize)
83 //See header file for documentation
86 UInt_t totSize = sizeof(AliHLTPHOSDigitDataStruct);
95 AliHLTPHOSChannelDataStruct* currentchannel = 0;
96 AliHLTPHOSChannelDataStruct* currentchannelLG = 0;
97 AliHLTPHOSChannelDataStruct* tmpchannel = 0;
99 fShmPtr->SetMemory(channelDataHeader);
100 currentchannel = fShmPtr->NextChannel();
102 while(currentchannel != 0)
104 if(availableSize < totSize) return -1;
106 AliHLTPHOSMapper::GetChannelCoord(currentchannel->fChannelID, coord1);
108 if(fOrdered) // High gain comes before low gain
110 tmpchannel = currentchannel;
112 if(coord1[2] == HIGHGAIN) // We got a completely new crystal
115 if(currentchannel->fEnergy < MAXBINVALUE) // Make sure we don't have signal overflow
118 AddDigit(currentchannel, coord1);
120 totSize += sizeof(AliHLTPHOSDigitDataStruct);
122 currentchannel = fShmPtr->NextChannel(); // Get the next channel
124 if(currentchannel != 0) // There was a next channel!
126 AliHLTPHOSMapper::GetChannelCoord(currentchannel->fChannelID, coord2);
127 if(coord1[0] == coord2[0] && coord1[1] == coord2[1]) // Did we get the low gain channel for this crystal?
129 currentchannel = fShmPtr->NextChannel(); // In that case, jump to next channel
134 else // Ooops, overflow, we try the next channel...
136 currentchannel = fShmPtr->NextChannel();
137 if(currentchannel != 0) // There was a next channel
139 AliHLTPHOSMapper::GetChannelCoord(currentchannel->fChannelID, coord2);
140 if(coord2[0] == coord1[0] && coord2[1] == coord1[1]) // It is a low gain channel with the same coordinates, we may use it
143 AddDigit(currentchannel, coord2);
145 totSize += sizeof(AliHLTPHOSDigitDataStruct);
146 currentchannel = fShmPtr->NextChannel();
149 else // No low gain channel with information about the overflow channel so we just use the overflowed one...
151 AddDigit(tmpchannel, coord1);
153 totSize += sizeof(AliHLTPHOSDigitDataStruct);
154 // no need to get the next channel here, we already did...
160 else // Well, there seem to be missing a high gain channel for this crystal, let's use the low gain one
162 AddDigit(tmpchannel, coord1);
164 totSize += sizeof(AliHLTPHOSDigitDataStruct);
165 currentchannel = fShmPtr->NextChannel();
169 else //Reversed ordered (low gain before high gain)
171 if(coord1[2] == LOWGAIN) // We got a new channel!
173 currentchannelLG = currentchannel; // Ok, let's back up the low gain channel and look for the fancy high gain one
174 currentchannel = fShmPtr->NextChannel();
176 if(currentchannel != 0) //There was another channel in the event
178 AliHLTPHOSMapper::GetChannelCoord(currentchannel->fChannelID, coord2);
180 if(coord1[0] == coord2[0] && coord1[1] == coord2[1]) // Aha! Found the high gain channel
182 if(currentchannel->fEnergy < MAXBINVALUE) // To overflow or not to overflow?
185 AddDigit(currentchannel, coord2);
187 totSize += sizeof(AliHLTPHOSDigitDataStruct);
188 currentchannel = fShmPtr->NextChannel();
190 else // Oh well, better use the low gain channel then
192 AddDigit(currentchannelLG, coord1);
194 totSize += sizeof(AliHLTPHOSDigitDataStruct);
195 currentchannel = fShmPtr->NextChannel();
198 else // No available high gain channel for this crystal, adding the low gain one
200 AddDigit(currentchannelLG, coord1);
202 totSize += sizeof(AliHLTPHOSDigitDataStruct);
205 else //Fine, no more channels, better add this one...
207 AddDigit(currentchannelLG, coord1);
209 totSize += sizeof(AliHLTPHOSDigitDataStruct);
212 else // Cool, no annoying low gain channel for this channel
214 AddDigit(currentchannel, coord1);
216 currentchannel = fShmPtr->NextChannel();
226 AliHLTPHOSDigitMaker::SetGlobalHighGainFactor(Float_t factor)
228 //See header file for documentation
229 for(int x = 0; x < NXCOLUMNSMOD; x++)
231 for(int z = 0; z < NZROWSMOD; z++)
233 fHighGainFactors[x][z] = factor;
239 AliHLTPHOSDigitMaker::SetGlobalLowGainFactor(Float_t factor)
241 //See header file for documentation
242 for(int x = 0; x < NXCOLUMNSMOD; x++)
244 for(int z = 0; z < NZROWSMOD; z++)
246 fLowGainFactors[x][z] = factor;
252 AliHLTPHOSDigitMaker::SetBadChannelMask(TH2F* badChannelHGHist, TH2F* badChannelLGHist, Float_t qCut)
254 for(int x = 0; x < NXCOLUMNSMOD; x++)
256 for(int z = 0; z < NZROWSMOD; z++)
258 if(badChannelHGHist->GetBinContent(x, z) < qCut && badChannelHGHist->GetBinContent(x, z) > 0)
260 fBadChannelMask[x][z][HIGHGAIN] = 1;
264 fBadChannelMask[x][z][HIGHGAIN] = 0;
266 if(badChannelLGHist->GetBinContent(x, z) < qCut && badChannelLGHist->GetBinContent(x, z) > 0)
268 fBadChannelMask[x][z][LOWGAIN] = 0;
272 fBadChannelMask[x][z][LOWGAIN] = 0;