Restored compilation on Windows/Cygwin
[u/mrichter/AliRoot.git] / RAW / AliCaloAltroMapping.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15 /* $Id$ */
16
17 // This class handles the mapping of the Altro channels in the PHOS/EMCAL
18 // The mapping is read from an external mapping files
19 // Author: C.Cheshkov
20
21 /// Exported from PHOS to be used also by EMCAL
22 /// November 2006 Gustavo Conesa Balbastre
23
24 #include "AliCaloAltroMapping.h"
25 #include "AliLog.h"
26 #include <Riostream.h>
27 //#include <stdlib.h>
28
29
30 ClassImp(AliCaloAltroMapping)
31
32 //_____________________________________________________________________________
33 AliCaloAltroMapping::AliCaloAltroMapping():
34   AliAltroMapping(),
35   fMinRow(0),
36   fMaxRow(0),
37   fMinCol(0),
38   fMaxCol(0),
39   fInvMappingLow(NULL),
40   fInvMappingHigh(NULL)
41 {
42   // Default constructor
43 }
44
45 //_____________________________________________________________________________
46 AliCaloAltroMapping::AliCaloAltroMapping(const char *mappingFile):
47   AliAltroMapping(mappingFile),
48   fMinRow(0),
49   fMaxRow(0),
50   fMinCol(0),
51   fMaxCol(0),
52   fInvMappingLow(NULL),
53   fInvMappingHigh(NULL)
54 {
55   // Constructor
56   ReadMapping();
57   CloseMappingFile();
58 }
59
60 //_____________________________________________________________________________
61 AliCaloAltroMapping::~AliCaloAltroMapping()
62 {
63   // destructor
64   // Deletes the arrays which have been
65   // allocated during the reading of the
66   // mapping file
67   if (fInvMappingLow) delete [] fInvMappingLow;
68
69   if (fInvMappingHigh) delete [] fInvMappingHigh;
70 }
71
72 //_____________________________________________________________________________
73 Bool_t AliCaloAltroMapping::ReadMapping()
74 {
75   // Initalizes the ALTRO mapping from a file
76   // Look at the Calo module for the format of
77   // the mapping file
78   if (!fIn) {
79     AliFatal("Mapping file has not been opened !");
80     return kFALSE;
81   }
82
83   fMinRow = 0x7fffffff;
84   fMaxRow = 0;
85   fMinCol = 0x7fffffff;
86   fMaxCol = 0;
87   fMappingSize = 3*(fMaxHWAddress+1);
88   fMapping = new Short_t[fMappingSize];
89   for (Int_t i = 0; i <= fMaxHWAddress; i++) {
90     fMapping[3*i] = fMapping[3*i+1] = fMapping[3*i+2] = -1;
91   }
92  
93   for(Int_t i = 0; i < fNumberOfChannels ; i++) { // 1792 = 2*896 channels connected to each RCU
94     Int_t hwAddress;
95     if (!(*fIn >> hwAddress)) {
96       AliFatal("Syntax of the mapping file is wrong !");
97       return kFALSE;
98     }
99     if (hwAddress > fMaxHWAddress) {
100       AliFatal(Form("Hardware (ALTRO) adress (%d) outside the range (0 -> %d) !",hwAddress,fMaxHWAddress));
101       return kFALSE;
102     }
103     Int_t row,col,gain;
104     if (!(*fIn >> row >> col >> gain)) {
105       AliFatal("Syntax of the mapping file is wrong !");
106       return kFALSE;
107     }
108
109     if (gain < 0 || gain > 1) {
110       AliFatal(Form("Wrong gain value found (%d)! Should be 0 or 1 !",gain));
111       return kFALSE;
112     }
113  
114     fMapping[3*hwAddress] = row;
115     fMapping[3*hwAddress+1] = col;
116     fMapping[3*hwAddress+2] = gain;
117
118     if (row > fMaxRow) fMaxRow = row;
119     if (row < fMinRow) fMinRow = row;
120     if (col > fMaxCol) fMaxCol = col;
121     if (col < fMinCol) fMinCol = col;
122
123   }
124
125   return kTRUE;
126 }
127
128 //_____________________________________________________________________________
129 Bool_t AliCaloAltroMapping::CreateInvMapping()
130 {
131   // Create the inverse mapping
132   // needed for the simulation of
133   // raw data
134   if (fInvMappingLow) return kTRUE;
135
136   if (!fMapping) {
137     AliWarning("Mapping array was not initalized correctly ! Impossible to create the inverse mapping !");
138     return kFALSE;
139   }
140
141   Int_t nRows = fMaxRow - fMinRow + 1;
142   Int_t nCols = fMaxCol - fMinCol + 1;
143   Int_t invMappingSize = nRows*nCols;
144
145   fInvMappingLow  = new Short_t[invMappingSize];
146   fInvMappingHigh = new Short_t[invMappingSize];
147   for (Int_t i = 0; i < nRows; i++) {
148     for (Int_t j = 0; j < nCols; j++) {
149       fInvMappingLow[nCols*i+j]  = -1;
150       fInvMappingHigh[nCols*i+j] = -1;
151     }
152   }
153
154   for(Int_t i = 0; i <= fMaxHWAddress; i++) {
155     Int_t row = fMapping[3*i];
156     Int_t col = fMapping[3*i+1];
157     Int_t gain = fMapping[3*i+2];
158     if(row != -1 && col != -1) {
159       if (gain == 0)
160         fInvMappingLow[nCols*(row-fMinRow)+(col-fMinCol)] = i;
161       if (gain == 1)
162         fInvMappingHigh[nCols*(row-fMinRow)+(col-fMinCol)] = i;
163     }
164   }
165
166   return kTRUE;
167 }
168
169 //_____________________________________________________________________________
170 Int_t AliCaloAltroMapping::GetHWAddress(Int_t row, Int_t col, Int_t gain)
171 {
172   // Get the content of the mapping array
173   // return -1 in case there is no hardware
174   // adress defined for these row-column-gain
175   if (!fInvMappingLow || !fInvMappingHigh) {
176     if (!CreateInvMapping()) return -1;
177   }
178   if (row < fMinRow || row > fMaxRow) {
179     AliWarning(Form("Index of row (%d) outside the range (%d -> %d) !",row,fMinRow,fMaxRow));
180     return -1;
181   }
182   if (col < fMinCol || col > fMaxCol) {
183     AliWarning(Form("Index of column (%d) outside the range (0 -> %d) !",col,fMinCol,fMaxCol));
184     return -1;
185   }
186   if (gain < 0 || gain > 1) {
187     AliWarning(Form("Invalid gain (%d)! Should be 0 or 1 !",gain));
188     return -1;
189   }
190   Int_t hwAddress = -1;
191   if (gain == 0)
192     hwAddress = fInvMappingLow[(fMaxCol - fMinCol + 1)*(row-fMinRow)+(col-fMinCol)];
193   if (gain == 1)
194     hwAddress = fInvMappingHigh[(fMaxCol - fMinCol + 1)*(row-fMinRow)+(col-fMinCol)];
195
196   if (hwAddress == -1)
197     AliWarning(Form("Hardware (ALTRO) adress is not defined for these row (%d), column (%d) and gain (%d) !",row,col,gain));
198
199   return hwAddress;
200 }
201
202 //_____________________________________________________________________________
203 Int_t AliCaloAltroMapping::GetPadRow(Int_t hwAddress) const
204 {
205   // Return the row index
206   // Note the difference w.r.t to the base class notation
207   if (!fMapping) {
208     AliWarning("Mapping array was not initalized correctly !");
209     return -1;
210   }
211   if (hwAddress > fMaxHWAddress) {
212     AliWarning(Form("Hardware (ALTRO) adress (%d) outside the range (0 -> %d) !",hwAddress,fMaxHWAddress));
213     return -1;
214   }
215   Int_t row = fMapping[3*hwAddress];
216   if (row == -1)
217     AliWarning(Form("Hardware (ALTRO) adress (%d) is not defined !",hwAddress));
218
219   return row;
220 }
221
222 //_____________________________________________________________________________
223 Int_t AliCaloAltroMapping::GetPad(Int_t hwAddress) const
224 {
225   // Return the column index
226   // Note the difference w.r.t to the base class notation
227   if (!fMapping) {
228     AliWarning("Mapping array was not initalized correctly !");
229     return -1;
230   }
231   if (hwAddress > fMaxHWAddress) {
232     AliWarning(Form("Hardware (ALTRO) adress (%d) outside the range (0 -> %d) !",hwAddress,fMaxHWAddress));
233     return -1;
234   }
235   Int_t col = fMapping[3*hwAddress+1];
236   if (col == -1)
237     AliWarning(Form("Hardware (ALTRO) adress (%d) is not defined !",hwAddress));
238
239   return col;
240 }
241
242 //_____________________________________________________________________________
243 Int_t AliCaloAltroMapping::GetSector(Int_t hwAddress) const
244 {
245   // Return the gain factor (0/1)
246   // Note the difference w.r.t to the base class notation
247   if (!fMapping) {
248     AliWarning("Mapping array was not initalized correctly !");
249     return -1;
250   }
251   if (hwAddress > fMaxHWAddress) {
252     AliWarning(Form("Hardware (ALTRO) adress (%d) outside the range (0 -> %d) !",hwAddress,fMaxHWAddress));
253     return -1;
254   }
255   Int_t gain = fMapping[3*hwAddress+2];
256   if (gain == -1)
257     AliWarning(Form("Hardware (ALTRO) adress (%d) is not defined !",hwAddress));
258
259   return gain;
260 }