- fixing compilation warnings
[u/mrichter/AliRoot.git] / HLT / CALO / AliHLTCaloDigitMaker.cxx
1 // $Id$\r
2 \r
3 /**************************************************************************\r
4  * This file is property of and copyright by the ALICE HLT Project        * \r
5  * All rights reserved.                                                   *\r
6  *                                                                        *\r
7  * Primary Authors: Oystein Djuvsland                                     *\r
8  *                                                                        *\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
17  /** \r
18  * @file   AliHLTCALOClusterizer.cxx\r
19  * @author Oystein Djuvsland\r
20  * @date \r
21  * @brief  Digit maker for CALO HLT  \r
22  */\r
23   \r
24 \r
25     \r
26 \r
27 // see header file for class documentation\r
28 // or\r
29 // refer to README to build package\r
30 // or\r
31 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt\r
32 \r
33 #include "AliHLTCaloDigitMaker.h"\r
34 \r
35 #include "AliHLTCaloConstants.h"\r
36 #include "AliHLTCaloMapper.h"\r
37 \r
38 #include "AliHLTCaloChannelDataStruct.h"\r
39 #include "AliHLTCaloChannelDataHeaderStruct.h"\r
40 #include "AliHLTCaloDigitDataStruct.h"\r
41 #include "AliHLTCaloSharedMemoryInterfacev2.h" // added by PTH\r
42 //#include "AliPHOSEMCAGeometry.h"\r
43 #include "TH2F.h"\r
44 #include "AliHLTCaloConstants.h"\r
45 \r
46 ClassImp(AliHLTCaloDigitMaker);\r
47 \r
48 //using namespace CaloHLTConst;\r
49 \r
50 AliHLTCaloDigitMaker::AliHLTCaloDigitMaker(TString det) :\r
51   fShmPtr(0),\r
52   fDigitStructPtr(0),\r
53   fDigitCount(0),\r
54   fOrdered(true),\r
55   fMapperPtr(0),\r
56   fHighGainFactors(0),\r
57   fLowGainFactors(0),\r
58   fBadChannelMask(0),\r
59   fChannelBook(0),\r
60   fCaloConstants(NULL)\r
61 {\r
62   // See header file for documentation\r
63 \r
64   fShmPtr = new AliHLTCaloSharedMemoryInterfacev2();\r
65 \r
66   fHighGainFactors = new Float_t*[fCaloConstants->GetNXCOLUMNSMOD()];\r
67   fLowGainFactors = new Float_t*[fCaloConstants->GetNXCOLUMNSMOD()];\r
68 \r
69   fBadChannelMask = new Float_t**[fCaloConstants->GetNXCOLUMNSMOD()];\r
70 \r
71   fChannelBook= new AliHLTCaloDigitDataStruct**[fCaloConstants->GetNXCOLUMNSMOD()];\r
72 \r
73   for(int x = 0; x < fCaloConstants->GetNXCOLUMNSMOD(); x++)\r
74     {\r
75       fHighGainFactors[x] = new Float_t[fCaloConstants->GetNZROWSMOD()];\r
76       fLowGainFactors[x] = new Float_t[fCaloConstants->GetNZROWSMOD()];\r
77 \r
78       fBadChannelMask[x] = new Float_t*[fCaloConstants->GetNZROWSMOD()];\r
79 \r
80       fChannelBook[x] = new AliHLTCaloDigitDataStruct*[fCaloConstants->GetNZROWSMOD()];\r
81 \r
82       for(int z = 0; z < fCaloConstants->GetNZROWSMOD(); z++)\r
83         {\r
84 \r
85           fHighGainFactors[x][z] = 0.005;\r
86           fLowGainFactors[x][z] = 0.08;\r
87          \r
88           fBadChannelMask[x][z] = new Float_t[fCaloConstants->GetNGAINS()];\r
89           fBadChannelMask[x][z][fCaloConstants->GetHIGHGAIN()] = 1;\r
90           fBadChannelMask[x][z][fCaloConstants->GetLOWGAIN()] = 1; \r
91           \r
92           fChannelBook[x][z] = 0;\r
93           \r
94         }\r
95     }     \r
96   \r
97   //Must be set in child instance\r
98   //fMapperPtr = new AliHLTCaloMapper(det);\r
99   fCaloConstants = new AliHLTCaloConstants(det);\r
100 \r
101 }\r
102 \r
103 AliHLTCaloDigitMaker::AliHLTCaloDigitMaker(const AliHLTCaloDigitMaker &) :\r
104   fShmPtr(0),\r
105   fDigitStructPtr(0),\r
106   fDigitCount(0),\r
107   fOrdered(true),\r
108   fMapperPtr(0),\r
109   fHighGainFactors(0),\r
110   fLowGainFactors(0),\r
111   fBadChannelMask(0),\r
112   fChannelBook(0),\r
113   fCaloConstants(NULL)\r
114 {\r
115   // Dummy copy constructor\r
116 \r
117 }\r
118 \r
119 AliHLTCaloDigitMaker::~AliHLTCaloDigitMaker() \r
120 {\r
121   //See header file for documentation\r
122 }\r
123 \r
124 Int_t\r
125 AliHLTCaloDigitMaker::MakeDigits(AliHLTCaloChannelDataHeaderStruct* channelDataHeader, AliHLTUInt32_t availableSize)\r
126 {\r
127   //See header file for documentation\r
128   \r
129   Int_t j = 0;\r
130   UInt_t totSize = sizeof(AliHLTCaloDigitDataStruct);\r
131   \r
132 //   Int_t xMod = -1;\r
133 //   Int_t zMod = -1;\r
134   \r
135   UShort_t coord1[4];\r
136   //  UShort_t coord2[4];\r
137   Float_t locCoord[3];\r
138   \r
139   \r
140   AliHLTCaloChannelDataStruct* currentchannel = 0;\r
141   //  AliHLTCaloChannelDataStruct* currentchannelLG = 0;  \r
142   AliHLTCaloChannelDataStruct* tmpchannel = 0;\r
143   \r
144   fShmPtr->SetMemory(channelDataHeader);\r
145   currentchannel = fShmPtr->NextChannel();\r
146 \r
147   while(currentchannel != 0)\r
148     {\r
149       if(availableSize < totSize) return -1;\r
150 \r
151       fMapperPtr->GetChannelCoord(currentchannel->fChannelID, coord1);\r
152       \r
153       tmpchannel = currentchannel;\r
154           \r
155       if(coord1[2] == fCaloConstants->GetHIGHGAIN()) // We got a completely new crystal\r
156         {\r
157           fMapperPtr->GetLocalCoord(currentchannel->fChannelID, locCoord);\r
158           if(UseDigit(coord1, currentchannel))\r
159             {\r
160               AddDigit(currentchannel, coord1, locCoord);\r
161               j++;            \r
162               totSize += sizeof(AliHLTCaloDigitDataStruct);\r
163             }\r
164           currentchannel = fShmPtr->NextChannel(); // Get the next channel\r
165         }\r
166       else if(coord1[2] == fCaloConstants->GetLOWGAIN())\r
167         {\r
168           fMapperPtr->GetLocalCoord(currentchannel->fChannelID, locCoord);\r
169           if(UseDigit(coord1, currentchannel))\r
170             {\r
171               AddDigit(currentchannel, coord1, locCoord);\r
172               j++;            \r
173               totSize += sizeof(AliHLTCaloDigitDataStruct);\r
174             }\r
175           currentchannel = fShmPtr->NextChannel(); // Get the next channel\r
176         }\r
177     }\r
178 \r
179   fDigitCount += j;\r
180   return fDigitCount; \r
181 }\r
182 \r
183 void \r
184 AliHLTCaloDigitMaker::SetGlobalHighGainFactor(Float_t factor)\r
185 {\r
186   //See header file for documentation\r
187   for(int x = 0; x < fCaloConstants->GetNXCOLUMNSMOD(); x++)\r
188     {\r
189       for(int z = 0; z < fCaloConstants->GetNZROWSMOD(); z++)\r
190         {\r
191           fHighGainFactors[x][z] = factor;\r
192         }\r
193     }\r
194 }\r
195 \r
196 void\r
197 AliHLTCaloDigitMaker::SetGlobalLowGainFactor(Float_t factor)\r
198 {\r
199   //See header file for documentation\r
200   for(int x = 0; x < fCaloConstants->GetNXCOLUMNSMOD(); x++)\r
201     {\r
202       for(int z = 0; z < fCaloConstants->GetNZROWSMOD(); z++)\r
203         {\r
204           fLowGainFactors[x][z] = factor;\r
205         }\r
206     }\r
207 }\r
208 \r
209 void\r
210 AliHLTCaloDigitMaker::SetBadChannelMask(TH2F* badChannelHGHist, TH2F* badChannelLGHist, Float_t qCut)\r
211 {\r
212  for(int x = 0; x < fCaloConstants->GetNXCOLUMNSMOD(); x++)\r
213     {\r
214       for(int z = 0; z < fCaloConstants->GetNZROWSMOD(); z++)\r
215         {\r
216           if(badChannelHGHist->GetBinContent(x, z) < qCut && badChannelHGHist->GetBinContent(x, z) > 0)\r
217             {\r
218               fBadChannelMask[x][z][fCaloConstants->GetHIGHGAIN()] = 1;\r
219             }\r
220           else\r
221             {\r
222               fBadChannelMask[x][z][fCaloConstants->GetHIGHGAIN()] = 0;\r
223             }\r
224           if(badChannelLGHist->GetBinContent(x, z) < qCut && badChannelLGHist->GetBinContent(x, z) > 0)\r
225             {\r
226               fBadChannelMask[x][z][fCaloConstants->GetLOWGAIN()] = 0;\r
227             }\r
228           else\r
229             {\r
230               fBadChannelMask[x][z][fCaloConstants->GetLOWGAIN()] = 0;\r
231             }\r
232         }\r
233     }\r
234 }\r
235 \r
236 void\r
237 AliHLTCaloDigitMaker::Reset()\r
238 {\r
239   fDigitCount = 0;\r
240   for(int x = 0; x < fCaloConstants->GetNXCOLUMNSMOD(); x++)\r
241     {\r
242       for(int z = 0; z < fCaloConstants->GetNZROWSMOD(); z++)\r
243         {\r
244           fChannelBook[x][z] = 0;\r
245         }\r
246     }     \r
247 \r
248 }\r
249 \r
250 \r
251 void AliHLTCaloDigitMaker::AddDigit(AliHLTCaloChannelDataStruct* channelData, UShort_t* channelCoordinates, Float_t* localCoordinates)\r
252 {\r
253 \r
254   fChannelBook[channelCoordinates[0]][channelCoordinates[0]] = fDigitStructPtr;\r
255 \r
256   fDigitStructPtr->fX = channelCoordinates[0];\r
257   fDigitStructPtr->fZ = channelCoordinates[1];\r
258 \r
259   fDigitStructPtr->fLocX = localCoordinates[0];\r
260   fDigitStructPtr->fLocZ = localCoordinates[1];\r
261 \r
262   if(channelCoordinates[2] == fCaloConstants->GetHIGHGAIN() )\r
263     {\r
264       fDigitStructPtr->fEnergy = channelData->fEnergy*fHighGainFactors[channelCoordinates[0]][channelCoordinates[1]];\r
265       if(channelData->fEnergy >= 1023)\r
266         {\r
267           fDigitStructPtr->fOverflow = true;\r
268         }\r
269       //        printf("HG channel (x = %d, z = %d) with amplitude: %f --> Digit with energy: %f \n", channelCoordinates[0], channelCoordinates[1], channelData->fEnergy, fDigitStructPtr->fEnergy);\r
270     }\r
271   else\r
272     {\r
273       fDigitStructPtr->fEnergy = channelData->fEnergy*fLowGainFactors[channelCoordinates[0]][channelCoordinates[1]];\r
274       if(channelData->fEnergy >= 1023)\r
275         {\r
276           fDigitStructPtr->fOverflow = true;\r
277         }\r
278       //        printf("LG channel (x = %d, z = %d) with amplitude: %f --> Digit with energy: %f\n", channelCoordinates[0], channelCoordinates[1], channelData->fEnergy, fDigitStructPtr->fEnergy); \r
279     }\r
280   fDigitStructPtr->fTime = channelData->fTime * 0.0000001; //TODO\r
281   fDigitStructPtr->fCrazyness = channelData->fCrazyness;\r
282   fDigitStructPtr->fModule = channelCoordinates[3];\r
283   fDigitStructPtr++;\r
284 }\r
285 \r
286 bool AliHLTCaloDigitMaker::UseDigit(UShort_t *channelCoordinates, AliHLTCaloChannelDataStruct *channel) \r
287 {\r
288   AliHLTCaloDigitDataStruct *tmpDigit = fChannelBook[channelCoordinates[0]][channelCoordinates[1]];\r
289   if(tmpDigit)\r
290     {\r
291       if(channelCoordinates[2] == fCaloConstants->GetLOWGAIN())\r
292         {\r
293           if(tmpDigit->fOverflow)\r
294             {\r
295               return true;\r
296             }\r
297           return false;\r
298         }\r
299       else\r
300         {\r
301           if(channel->fEnergy >= fCaloConstants->GetMAXBINVALUE() )\r
302             {\r
303               return false;\r
304             }\r
305           return true;\r
306         }\r
307     }\r
308   return true;\r
309 }\r