]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AliFMDMap.h
Removing semaphore .done files.
[u/mrichter/AliRoot.git] / STEER / AliFMDMap.h
1 #ifndef ALIFMDMAP_H
2 #define ALIFMDMAP_H
3 /* Copyright(c) 1998-2000, ALICE Experiment at CERN, All rights
4  * reserved. 
5  *
6  * See cxx source for full Copyright notice                               
7  */
8 #ifndef ROOT_TObject
9 # include <TObject.h>
10 #endif 
11 //____________________________________________________________________
12 //
13 // Base class for caches of per-strip information.
14 // This is used to index a strip. 
15 // Data stored depends on derived class. 
16 //
17 class AliFMDMap : public TObject 
18 {
19 public:
20   enum { 
21     kMaxDetectors = 3, 
22     kMaxRings     = 2, 
23     kMaxSectors   = 40, 
24     kMaxStrips    = 512
25   };
26   AliFMDMap(UShort_t maxDet = kMaxDetectors, 
27             UShort_t maxRing= kMaxRings, 
28             UShort_t maxSec = kMaxSectors, 
29             UShort_t maxStr = kMaxStrips);
30   virtual ~AliFMDMap() {}
31   UShort_t MaxDetectors() const { return fMaxDetectors; }
32   UShort_t MaxRings()     const { return fMaxRings; }
33   UShort_t MaxSectors()   const { return fMaxSectors; }
34   UShort_t MaxStrips()    const { return fMaxStrips; }
35   Int_t  CheckIndex(UShort_t det, Char_t ring, 
36                     UShort_t sec, UShort_t str) const;
37 protected:
38   Int_t CalcIndex(UShort_t det, Char_t ring, 
39                    UShort_t sec, UShort_t str) const;
40   UShort_t fMaxDetectors;             // Maximum # of detectors
41   UShort_t fMaxRings;                 // Maximum # of rings
42   UShort_t fMaxSectors;               // Maximum # of sectors
43   UShort_t fMaxStrips;                // Maximum # of strips
44   ClassDef(AliFMDMap, 2) // Cache of per strip information
45 };
46
47 #ifdef  MAY_USE_TEMPLATES
48 #ifndef __VECTOR__
49 # include <vector>
50 #endif 
51 //____________________________________________________________________
52 //
53 // Class template for classes that cache per strip information.  
54 // Access to the data goes via 
55 //
56 //   Type& AliFMDMap<Type>::operator()(UShort_t detector,
57 //                                     Char_t ring, 
58 //                                     UShort_t sector,
59 //                                     UShort_t strip);
60 // 
61 // (as well as a const version of this member function). 
62 // The elements can be reset to the default value by calling 
63 // AliFMDMap<Type>::Clear().  This resets the values to `Type()'. 
64 //
65 template <typename Type> 
66 class AliFMDMap : public TObject 
67 {
68 public:
69   AliFMDMap(UShort_t maxDet=3, UShort_t maxRing=2, UShort_t maxSec=40, 
70             UShort_t maxStr=512);
71   virtual ~AliFMDMap() {}
72   void Clear(const Type& val=Type());
73   Type& operator()(UShort_t det, Char_t ring, UShort_t sec, UShort_t str);
74   const Type& operator()(UShort_t det, Char_t ring, 
75                          UShort_t sec, UShort_t str)const;
76 private:
77   typedef std::vector<Type> ValueVector; // Type of container
78   ValueVector fValues;                   // Contained values
79   UShort_t      fMaxDetectors;             // Maximum # of detectors
80   UShort_t      fMaxRings;                 // Maximum # of rings
81   UShort_t      fMaxSectors;               // Maximum # of sectors
82   UShort_t      fMaxStrips;                // Maximum # of strips
83   
84   UShort_t CalcIndex(UShort_t det, Char_t ring, 
85                      UShort_t sec, UShort_t str) const;
86   ClassDef(AliFMDMap, 0); // Map of FMD index's to values 
87 };
88
89
90 //____________________________________________________________________
91 template <typename Type>
92 inline 
93 AliFMDMap<Type>::AliFMDMap(UShort_t maxDet, 
94                            UShort_t maxRing, 
95                            UShort_t maxSec, 
96                            UShort_t maxStr)
97   : fValues(maxDet * maxRing * maxSec * maxStr), 
98     fMaxDetectors(maxDet), 
99     fMaxRings(maxRing), 
100     fMaxSectors(maxSec), 
101     fMaxStrips(maxStr)
102 {
103   // Construct a map
104   //
105   // Parameters:
106   //     maxDet       Maximum # of detectors
107   //     maxRinf      Maximum # of rings
108   //     maxSec       Maximum # of sectors
109   //     maxStr       Maximum # of strips
110 }
111
112
113 //____________________________________________________________________
114 template <typename Type>
115 inline UShort_t 
116 AliFMDMap<Type>::CalcIndex(UShort_t det, Char_t ring, 
117                            UShort_t sec, UShort_t str) const
118 {
119   // Calculate index into storage from arguments. 
120   // 
121   // Parameters: 
122   //     det       Detector #
123   //     ring      Ring ID
124   //     sec       Sector # 
125   //     str       Strip # 
126   //
127   // Returns appropriate index into storage 
128   //
129   UShort_t ringi = (ring == 'I' ||  ring == 'i' ? 0 : 1);
130   UShort_t idx = 
131     (det + fMaxDetectors * (ringi + fMaxRings * (sec + fMaxSectors * str)));
132   if (idx >= fMaxDetectors * fMaxRings * fMaxSectors * fMaxStrips) {
133     Fatal("CalcIndex", "Index (%d,'%c',%d,%d) out of bounds, "
134           "in particular the %s index", 
135           det, ring, sec, str, 
136           (det >= fMaxDetectors ? "Detector" : 
137            (ringi >= fMaxRings ? "Ring" : 
138             (sec >= fMaxSectors ? "Sector" : "Strip"))));
139     return 0;
140   }
141   return idx;
142 }
143
144 //____________________________________________________________________
145 template <typename Type>
146 inline void
147 AliFMDMap<Type>::Clear(const Type& val) 
148 {
149   // Resets stored values to the default value for that type 
150   for (UShort_t i = 0; i < fValues.size(); ++i) fValues[i] = val;
151 }
152
153 //____________________________________________________________________
154 template <typename Type>
155 inline Type& 
156 AliFMDMap<Type>::operator()(UShort_t det, Char_t ring, 
157                             UShort_t sec, UShort_t str)
158 {
159   // Parameters: 
160   //     det       Detector #
161   //     ring      Ring ID
162   //     sec       Sector # 
163   //     str       Strip # 
164   //
165   // Returns data[det][ring][sec][str]
166   return fValues[CalcIndex(det, ring, sec, str)];
167 }
168
169 //____________________________________________________________________
170 template <typename Type>
171 inline const Type& 
172 AliFMDMap<Type>::operator()(UShort_t det, 
173                             Char_t ring, 
174                             UShort_t sec, 
175                             UShort_t str) const
176 {
177   // Parameters: 
178   //     det       Detector #
179   //     ring      Ring ID
180   //     sec       Sector # 
181   //     str       Strip # 
182   //
183   // Returns data[det][ring][sec][str]
184   return fValues[CalcIndex(det, ring, sec, str)];
185 }
186
187
188 //____________________________________________________________________
189 // 
190 // Some specialisations 
191 //
192 typedef AliFMDMap<UShort_t> AliFMDAdcMap;
193 typedef AliFMDMap<std::pair<Float_t, UShort_t> > AliFMDEdepMap;
194
195 #endif
196 #endif 
197 //____________________________________________________________________
198 //
199 // Local Variables:
200 //   mode: C++
201 // End:
202 //
203 // EOF
204 //
205
206