3 /**************************************************************************
\r
4 * This file is property of and copyright by the ALICE HLT Project *
\r
5 * All rights reserved. *
\r
7 * Primary Authors: Oystein Djuvsland *
\r
9 * Permission to use, copy, modify and distribute this software and its *
\r
10 * documentation strictly for non-commercial purposes is hereby granted *
\r
11 * without fee, provided that the above copyright notice appears in all *
\r
12 * copies and that both the copyright notice and this permission notice *
\r
13 * appear in the supporting documentation. The authors make no claims *
\r
14 * about the suitability of this software for any purpose. It is *
\r
15 * provided "as is" without express or implied warranty. *
\r
16 **************************************************************************/
\r
18 * @file AliHLTCALOClusterizer.cxx
\r
19 * @author Oystein Djuvsland
\r
21 * @brief Digit maker for CALO HLT
\r
27 // see header file for class documentation
\r
29 // refer to README to build package
\r
31 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
\r
33 #include "AliHLTCaloDigitMaker.h"
\r
34 #include "AliHLTCaloConstantsHandler.h"
\r
35 #include "AliHLTCaloMapper.h"
\r
36 #include "AliHLTCaloChannelDataStruct.h"
\r
37 #include "AliHLTCaloChannelDataHeaderStruct.h"
\r
38 #include "AliHLTCaloDigitDataStruct.h"
\r
39 #include "AliHLTCaloCoordinate.h"
\r
40 #include "AliHLTCaloSharedMemoryInterfacev2.h" // added by PTH
\r
41 //#include "AliPHOSEMCAGeometry.h"
\r
43 #include "AliHLTCaloConstants.h"
\r
44 #include "AliHLTLogging.h"
\r
46 ClassImp(AliHLTCaloDigitMaker);
\r
48 //using namespace CaloHLTConst;
\r
50 AliHLTCaloDigitMaker::AliHLTCaloDigitMaker(TString det) :
\r
51 AliHLTCaloConstantsHandler(det),
\r
57 fHighGainFactors(0),
\r
65 // See header file for documentation
\r
67 fShmPtr = new AliHLTCaloSharedMemoryInterfacev2(det);
\r
69 fHighGainFactors = new Float_t*[fCaloConstants->GetNXCOLUMNSMOD()];
\r
70 fLowGainFactors = new Float_t*[fCaloConstants->GetNXCOLUMNSMOD()];
\r
72 fBadChannelMask = new Bool_t**[fCaloConstants->GetNXCOLUMNSMOD()];
\r
74 fChannelBook= new AliHLTCaloDigitDataStruct**[fCaloConstants->GetNXCOLUMNSMOD()];
\r
76 for(int x = 0; x < fCaloConstants->GetNXCOLUMNSMOD(); x++)
\r
78 fHighGainFactors[x] = new Float_t[fCaloConstants->GetNZROWSMOD()];
\r
79 fLowGainFactors[x] = new Float_t[fCaloConstants->GetNZROWSMOD()];
\r
81 fBadChannelMask[x] = new Bool_t*[fCaloConstants->GetNZROWSMOD()];
\r
83 fChannelBook[x] = new AliHLTCaloDigitDataStruct*[fCaloConstants->GetNZROWSMOD()];
\r
85 for(int z = 0; z < fCaloConstants->GetNZROWSMOD(); z++)
\r
88 fHighGainFactors[x][z] = 0.0153;
\r
89 fLowGainFactors[x][z] = 0.245;
\r
91 fBadChannelMask[x][z] = new Bool_t[fCaloConstants->GetNGAINS()];
\r
92 fBadChannelMask[x][z][fCaloConstants->GetHIGHGAIN()] = false;
\r
93 fBadChannelMask[x][z][fCaloConstants->GetLOWGAIN()] = false;
\r
95 fChannelBook[x][z] = 0;
\r
101 AliHLTCaloDigitMaker::~AliHLTCaloDigitMaker()
\r
103 //See header file for documentation
\r
107 AliHLTCaloDigitMaker::MakeDigits(AliHLTCaloChannelDataHeaderStruct* channelDataHeader, AliHLTUInt32_t availableSize)
\r
109 //See header file for documentation
\r
113 UInt_t totSize = sizeof(AliHLTCaloDigitDataStruct);
\r
115 // Int_t xMod = -1;
\r
116 // Int_t zMod = -1;
\r
119 AliHLTCaloCoordinate coord;
\r
122 AliHLTCaloChannelDataStruct* currentchannel = 0;
\r
124 fShmPtr->SetMemory(channelDataHeader);
\r
125 currentchannel = fShmPtr->NextChannel();
\r
127 while(currentchannel != 0)
\r
129 if(availableSize < totSize) return -1;
\r
131 fMapperPtr->ChannelId2Coordinate(currentchannel->fChannelID, coord);
\r
133 // fMapperPtr->GetLocalCoord(currentchannel->fChannelID, locCoord);
\r
134 if(UseDigit(coord, currentchannel))
\r
136 AddDigit(currentchannel, coord);
\r
138 totSize += sizeof(AliHLTCaloDigitDataStruct);
\r
140 currentchannel = fShmPtr->NextChannel(); // Get the next channel
\r
142 // if(currentchannel)
\r
144 // fMapperPtr->GetLocalCoord(currentchannel->fChannelID, locCoord);
\r
145 // if(UseDigit(coord1, currentchannel))
\r
147 // AddDigit(currentchannel, coord1, locCoord);
\r
149 // totSize += sizeof(AliHLTCaloDigitDataStruct);
\r
151 // currentchannel = fShmPtr->NextChannel(); // Get the next channel
\r
155 // fDigitCount += j;
\r
156 return fDigitCount;
\r
160 AliHLTCaloDigitMaker::SetGlobalHighGainFactor(Float_t factor)
\r
162 //See header file for documentation
\r
163 for(int x = 0; x < fCaloConstants->GetNXCOLUMNSMOD(); x++)
\r
165 for(int z = 0; z < fCaloConstants->GetNZROWSMOD(); z++)
\r
167 fHighGainFactors[x][z] = factor;
\r
174 AliHLTCaloDigitMaker::SetGlobalLowGainFactor(Float_t factor)
\r
176 //See header file for documentation
\r
177 for(int x = 0; x < fCaloConstants->GetNXCOLUMNSMOD(); x++)
\r
179 for(int z = 0; z < fCaloConstants->GetNZROWSMOD(); z++)
\r
181 fLowGainFactors[x][z] = factor;
\r
188 AliHLTCaloDigitMaker::SetBadChannelMask(TH2F* badChannelHGHist, TH2F* badChannelLGHist, Float_t qCut)
\r
190 for(int x = 0; x < fCaloConstants->GetNXCOLUMNSMOD(); x++)
\r
192 for(int z = 0; z < fCaloConstants->GetNZROWSMOD(); z++)
\r
194 if(badChannelHGHist->GetBinContent(x, z) < qCut && badChannelHGHist->GetBinContent(x, z) > 0)
\r
196 fBadChannelMask[x][z][fCaloConstants->GetHIGHGAIN()] = true;
\r
200 fBadChannelMask[x][z][fCaloConstants->GetHIGHGAIN()] = false;
\r
202 if(badChannelLGHist->GetBinContent(x, z) < qCut && badChannelLGHist->GetBinContent(x, z) > 0)
\r
204 fBadChannelMask[x][z][fCaloConstants->GetLOWGAIN()] = false;
\r
208 fBadChannelMask[x][z][fCaloConstants->GetLOWGAIN()] = false;
\r
215 AliHLTCaloDigitMaker::Reset()
\r
218 for(int x = 0; x < fCaloConstants->GetNXCOLUMNSMOD(); x++)
\r
220 for(int z = 0; z < fCaloConstants->GetNZROWSMOD(); z++)
\r
222 fChannelBook[x][z] = 0;
\r
229 void AliHLTCaloDigitMaker::AddDigit(AliHLTCaloChannelDataStruct* channelData, AliHLTCaloCoordinate &coord)
\r
232 AliHLTCaloDigitDataStruct *tmpDigit = fDigitStructPtr + 1;
\r
234 if(fChannelBook[coord.fX][coord.fZ])
\r
236 tmpDigit = fDigitStructPtr;
\r
237 fDigitStructPtr = fChannelBook[coord.fX][coord.fZ];
\r
239 // printf("Going to overwrite digit: x = %d, z = %d, gain = %d, energy = %f\n", fDigitStructPtr->fX, fDigitStructPtr->fZ, fDigitStructPtr->fGain, fDigitStructPtr->fEnergy);
\r
242 fChannelBook[coord.fX][coord.fZ] = fDigitStructPtr;
\r
245 fDigitStructPtr->fX = coord.fX;
\r
246 fDigitStructPtr->fZ = coord.fZ;
\r
247 fDigitStructPtr->fGain = coord.fGain;
\r
248 fDigitStructPtr->fOverflow = false;
\r
250 fDigitStructPtr->fID = fDigitStructPtr->fZ * fCaloConstants->GetNXCOLUMNSMOD() + fDigitStructPtr->fX;
\r
252 if(coord.fGain == fCaloConstants->GetHIGHGAIN() )
\r
254 fDigitStructPtr->fEnergy = channelData->fEnergy*fHighGainFactors[coord.fX][coord.fZ];
\r
255 if(channelData->fEnergy >= fMaxEnergy)
\r
257 fDigitStructPtr->fOverflow = true;
\r
259 HLTDebug("HG channel (x = %d, z = %d) with amplitude: %f --> Digit with energy: %f \n", coord.fX, coord.fZ, channelData->fEnergy, fDigitStructPtr->fEnergy);
\r
263 fDigitStructPtr->fEnergy = channelData->fEnergy*fLowGainFactors[coord.fX][coord.fZ];
\r
264 if(channelData->fEnergy >= fMaxEnergy)
\r
266 fDigitStructPtr->fOverflow = true;
\r
268 HLTDebug("LG channel (x = %d, z = %d) with amplitude: %f --> Digit with energy: %f\n", coord.fX, coord.fZ, channelData->fEnergy, fDigitStructPtr->fEnergy);
\r
270 fDigitStructPtr->fTime = channelData->fTime * 0.0000001; //TODO
\r
271 fDigitStructPtr->fCrazyness = channelData->fCrazyness;
\r
272 fDigitStructPtr->fModule = coord.fModuleId;
\r
273 fDigitStructPtr = tmpDigit;
\r
274 // fDigitStructPtr++;
\r
278 bool AliHLTCaloDigitMaker::UseDigit(AliHLTCaloCoordinate &channelCoordinates, AliHLTCaloChannelDataStruct *channel)
\r
281 if(fBadChannelMask[channelCoordinates.fX][channelCoordinates.fZ][0] == true) return false;
\r
282 if(channel->fTime < fMinTime || channel->fTime > fMaxTime) return false;
\r
284 AliHLTCaloDigitDataStruct *tmpDigit = fChannelBook[channelCoordinates.fX][channelCoordinates.fZ];
\r
285 //printf("UseDigit: Got digit, x: %d, z: %d, gain: %d, amp: %f\n", channelCoordinates.fX, channelCoordinates.fZ, channelCoordinates.fGain, channel->fEnergy);
\r
288 if(channelCoordinates.fGain == fCaloConstants->GetLOWGAIN())
\r
290 //printf("UseDigit: Already have digit with, x: %d, z: %d, with high gain \n", channelCoordinates.fX, channelCoordinates.fZ);
\r
291 if(tmpDigit->fOverflow)
\r
293 // printf("But it was in overflow! Let's use this low gain!\n");
\r
300 //printf("UseDigit: Already have digit with, x: %d, z: %d, with low gain: %d\n", channelCoordinates.fX, channelCoordinates.fZ);
\r
301 if(channel->fEnergy > fMaxEnergy )
\r
311 void AliHLTCaloDigitMaker::SetBadChannel(Int_t x, Int_t z, Bool_t bad)
\r
313 // See header file for class documentation
\r
314 fBadChannelMask[x][z][0] = bad;
\r
315 fBadChannelMask[x][z][1] = bad;
\r
318 void AliHLTCaloDigitMaker::SetGain(Int_t x, Int_t z, Float_t ratio, Float_t gain)
\r
320 // See header file for class documentation
\r
322 fHighGainFactors[x][z] = gain;
\r
323 fLowGainFactors[x][z] = gain * ratio;
\r