46f5416b7144238b99952a7d9c846433f3a0438f
[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 #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
42 #include "TH2F.h"\r
43 #include "AliHLTCaloConstants.h"\r
44 \r
45 ClassImp(AliHLTCaloDigitMaker);\r
46 \r
47 //using namespace CaloHLTConst;\r
48 \r
49 AliHLTCaloDigitMaker::AliHLTCaloDigitMaker(TString det) :\r
50   AliHLTCaloConstantsHandler(det),\r
51   fShmPtr(0),\r
52   fDigitStructPtr(0),\r
53   fDigitCount(0),\r
54   fMapperPtr(0),\r
55   fHighGainFactors(0),\r
56   fLowGainFactors(0),\r
57   fBadChannelMask(0),\r
58   fChannelBook(0),\r
59   fMaxEnergy(900)\r
60 {\r
61   // See header file for documentation\r
62 \r
63   fShmPtr = new AliHLTCaloSharedMemoryInterfacev2(det);\r
64 \r
65   fHighGainFactors = new Float_t*[fCaloConstants->GetNXCOLUMNSMOD()];\r
66   fLowGainFactors = new Float_t*[fCaloConstants->GetNXCOLUMNSMOD()];\r
67   \r
68   fBadChannelMask = new Float_t**[fCaloConstants->GetNXCOLUMNSMOD()];\r
69   \r
70   fChannelBook= new AliHLTCaloDigitDataStruct**[fCaloConstants->GetNXCOLUMNSMOD()];\r
71   \r
72   for(int x = 0; x < fCaloConstants->GetNXCOLUMNSMOD(); x++)\r
73     {\r
74       fHighGainFactors[x] = new Float_t[fCaloConstants->GetNZROWSMOD()];\r
75       fLowGainFactors[x] = new Float_t[fCaloConstants->GetNZROWSMOD()];\r
76 \r
77       fBadChannelMask[x] = new Float_t*[fCaloConstants->GetNZROWSMOD()];\r
78 \r
79       fChannelBook[x] = new AliHLTCaloDigitDataStruct*[fCaloConstants->GetNZROWSMOD()];\r
80 \r
81       for(int z = 0; z < fCaloConstants->GetNZROWSMOD(); z++)\r
82         {\r
83 \r
84           fHighGainFactors[x][z] = 0.005;\r
85           fLowGainFactors[x][z] = 0.08;\r
86          \r
87           fBadChannelMask[x][z] = new Float_t[fCaloConstants->GetNGAINS()];\r
88           fBadChannelMask[x][z][fCaloConstants->GetHIGHGAIN()] = 1;\r
89           fBadChannelMask[x][z][fCaloConstants->GetLOWGAIN()] = 1; \r
90           \r
91           fChannelBook[x][z] = 0;\r
92           \r
93         }\r
94     }     \r
95 }\r
96 \r
97 AliHLTCaloDigitMaker::~AliHLTCaloDigitMaker() \r
98 {\r
99   //See header file for documentation\r
100 }\r
101 \r
102 Int_t\r
103 AliHLTCaloDigitMaker::MakeDigits(AliHLTCaloChannelDataHeaderStruct* channelDataHeader, AliHLTUInt32_t availableSize)\r
104 {\r
105   //See header file for documentation\r
106   \r
107   Reset();\r
108 \r
109   UInt_t totSize = sizeof(AliHLTCaloDigitDataStruct);\r
110   \r
111 //   Int_t xMod = -1;\r
112 //   Int_t zMod = -1;\r
113   \r
114 \r
115   AliHLTCaloCoordinate coord;\r
116   \r
117   \r
118   AliHLTCaloChannelDataStruct* currentchannel = 0;\r
119   \r
120   fShmPtr->SetMemory(channelDataHeader);\r
121   currentchannel = fShmPtr->NextChannel();\r
122 \r
123   while(currentchannel != 0)\r
124     {\r
125       if(availableSize < totSize) return -1;\r
126 \r
127       fMapperPtr->ChannelId2Coordinate(currentchannel->fChannelID, coord);\r
128       \r
129       //      fMapperPtr->GetLocalCoord(currentchannel->fChannelID, locCoord);\r
130       if(UseDigit(coord, currentchannel))\r
131       {\r
132         AddDigit(currentchannel, coord);\r
133         //      j++;          \r
134         totSize += sizeof(AliHLTCaloDigitDataStruct);\r
135       }\r
136       currentchannel = fShmPtr->NextChannel(); // Get the next channel\r
137     }\r
138 //       if(currentchannel)\r
139 //      {\r
140 //        fMapperPtr->GetLocalCoord(currentchannel->fChannelID, locCoord);\r
141 //        if(UseDigit(coord1, currentchannel))\r
142 //          {\r
143 //            AddDigit(currentchannel, coord1, locCoord);\r
144 //            j++;            \r
145 //            totSize += sizeof(AliHLTCaloDigitDataStruct);\r
146 //          }\r
147 //        currentchannel = fShmPtr->NextChannel(); // Get the next channel\r
148 //      }\r
149 //     }\r
150    \r
151 //   fDigitCount += j;\r
152    return fDigitCount; \r
153 }\r
154 \r
155 void \r
156 AliHLTCaloDigitMaker::SetGlobalHighGainFactor(Float_t factor)\r
157 {\r
158   //See header file for documentation\r
159   for(int x = 0; x < fCaloConstants->GetNXCOLUMNSMOD(); x++)\r
160     {\r
161       for(int z = 0; z < fCaloConstants->GetNZROWSMOD(); z++)\r
162         {\r
163           fHighGainFactors[x][z] = factor;\r
164         }\r
165     }\r
166 }\r
167 \r
168 void\r
169 AliHLTCaloDigitMaker::SetGlobalLowGainFactor(Float_t factor)\r
170 {\r
171   //See header file for documentation\r
172   for(int x = 0; x < fCaloConstants->GetNXCOLUMNSMOD(); x++)\r
173     {\r
174       for(int z = 0; z < fCaloConstants->GetNZROWSMOD(); z++)\r
175         {\r
176           fLowGainFactors[x][z] = factor;\r
177         }\r
178     }\r
179 }\r
180 \r
181 void\r
182 AliHLTCaloDigitMaker::SetBadChannelMask(TH2F* badChannelHGHist, TH2F* badChannelLGHist, Float_t qCut)\r
183 {\r
184  for(int x = 0; x < fCaloConstants->GetNXCOLUMNSMOD(); x++)\r
185     {\r
186       for(int z = 0; z < fCaloConstants->GetNZROWSMOD(); z++)\r
187         {\r
188           if(badChannelHGHist->GetBinContent(x, z) < qCut && badChannelHGHist->GetBinContent(x, z) > 0)\r
189             {\r
190               fBadChannelMask[x][z][fCaloConstants->GetHIGHGAIN()] = 1;\r
191             }\r
192           else\r
193             {\r
194               fBadChannelMask[x][z][fCaloConstants->GetHIGHGAIN()] = 0;\r
195             }\r
196           if(badChannelLGHist->GetBinContent(x, z) < qCut && badChannelLGHist->GetBinContent(x, z) > 0)\r
197             {\r
198               fBadChannelMask[x][z][fCaloConstants->GetLOWGAIN()] = 0;\r
199             }\r
200           else\r
201             {\r
202               fBadChannelMask[x][z][fCaloConstants->GetLOWGAIN()] = 0;\r
203             }\r
204         }\r
205     }\r
206 }\r
207 \r
208 void\r
209 AliHLTCaloDigitMaker::Reset()\r
210 {\r
211   fDigitCount = 0;\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           fChannelBook[x][z] = 0;\r
217         }\r
218     }     \r
219 \r
220 }\r
221 \r
222 \r
223 void AliHLTCaloDigitMaker::AddDigit(AliHLTCaloChannelDataStruct* channelData, AliHLTCaloCoordinate &coord)\r
224 {\r
225 \r
226   AliHLTCaloDigitDataStruct *tmpDigit = fDigitStructPtr + 1;\r
227 \r
228   if(fChannelBook[coord.fX][coord.fZ])\r
229     {\r
230       tmpDigit = fDigitStructPtr;\r
231       fDigitStructPtr = fChannelBook[coord.fX][coord.fZ];\r
232       fDigitCount--;\r
233       //      printf("Going to overwrite digit: x = %d, z = %d, gain = %d, energy = %f\n", fDigitStructPtr->fX, fDigitStructPtr->fZ, fDigitStructPtr->fGain, fDigitStructPtr->fEnergy);\r
234     }\r
235   \r
236   fChannelBook[coord.fX][coord.fZ] = fDigitStructPtr;\r
237 \r
238   fDigitStructPtr->fID = fDigitStructPtr->fZ * fCaloConstants->GetNXCOLUMNSMOD() + fDigitStructPtr->fX;\r
239 \r
240   fDigitStructPtr->fX = coord.fX;\r
241   fDigitStructPtr->fZ = coord.fZ;\r
242   fDigitStructPtr->fGain = coord.fGain;\r
243   fDigitStructPtr->fOverflow = false;\r
244   if(coord.fGain == fCaloConstants->GetHIGHGAIN() )\r
245     {\r
246       fDigitStructPtr->fEnergy = channelData->fEnergy*fHighGainFactors[coord.fX][coord.fZ];\r
247       if(channelData->fEnergy >= fMaxEnergy)\r
248         {\r
249           fDigitStructPtr->fOverflow = true;\r
250         }\r
251       //      printf("HG channel (x = %d, z = %d) with amplitude: %f --> Digit with energy: %f \n", coord.fX, coord.fZ, channelData->fEnergy, fDigitStructPtr->fEnergy);\r
252     }\r
253   else\r
254     {\r
255       fDigitStructPtr->fEnergy = channelData->fEnergy*fLowGainFactors[coord.fX][coord.fZ];\r
256       if(channelData->fEnergy >= 1023)\r
257         {\r
258           fDigitStructPtr->fOverflow = true;\r
259         }\r
260       //      printf("LG channel (x = %d, z = %d) with amplitude: %f --> Digit with energy: %f\n", coord.fX, coord.fZ, channelData->fEnergy, fDigitStructPtr->fEnergy); \r
261     }\r
262   fDigitStructPtr->fTime = channelData->fTime * 0.0000001; //TODO\r
263   fDigitStructPtr->fCrazyness = channelData->fCrazyness;\r
264   fDigitStructPtr->fModule = coord.fModuleId;\r
265   fDigitStructPtr = tmpDigit;\r
266   //  fDigitStructPtr++;\r
267   fDigitCount++;\r
268 }\r
269 \r
270 bool AliHLTCaloDigitMaker::UseDigit(AliHLTCaloCoordinate &channelCoordinates, AliHLTCaloChannelDataStruct *channel) \r
271 {\r
272   AliHLTCaloDigitDataStruct *tmpDigit = fChannelBook[channelCoordinates.fX][channelCoordinates.fZ];\r
273   //  printf("UseDigit: Got digit, x: %d, z: %d, gain: %d, amp: %f\n", channelCoordinates.fX, channelCoordinates.fZ, channelCoordinates.fGain, channel->fEnergy);\r
274   if(tmpDigit)\r
275     {\r
276       if(channelCoordinates.fGain == fCaloConstants->GetLOWGAIN())\r
277         {\r
278           //      printf("UseDigit: Already have digit with, x: %d, z: %d, with high gain \n", channelCoordinates.fX, channelCoordinates.fZ);\r
279           if(tmpDigit->fOverflow)\r
280             {\r
281               //              printf("But it was in overflow! Let's use this low gain!\n");\r
282               return true;\r
283             }\r
284           return false;\r
285         }\r
286       else\r
287         {\r
288           //      printf("UseDigit: Already have digit with, x: %d, z: %d, with low gain: %d\n", channelCoordinates.fX, channelCoordinates.fZ);\r
289           if(channel->fEnergy > fMaxEnergy )\r
290             {\r
291               return false;\r
292             }\r
293           return true;\r
294         }\r
295     }\r
296   return true;\r
297 }\r