Addeded code to encode/decode dE/dx to/from track references
[u/mrichter/AliRoot.git] / FMD / AliFMDStripIndex.h
1 #ifndef ALIFMDSTRIPINDEX_H
2 #define ALIFMDSTRIPINDEX_H
3 /**************************************************************************
4  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5  *                                                                        *
6  * Author: The ALICE Off-line Project.                                    *
7  * Contributors are mentioned in the code where appropriate.              *
8  *                                                                        *
9  * Permission to use, copy, modify and distribute this software and its   *
10  * documentation strictly for non-commercial purposes is hereby granted   *
11  * without fee, provided that the above copyright notice appears in all   *
12  * copies and that both the copyright notice and this permission notice   *
13  * appear in the supporting documentation. The authors make no claims     *
14  * about the suitability of this software for any purpose. It is          *
15  * provided "as is" without express or implied warranty.                  *
16  **************************************************************************/
17
18 // Struct to encode a strip address into one integer
19 // developed by Christian Holm Christensen (cholm@nbi.dk).
20 // 
21 // The functions are static to ensure applicability from
22 // anywhere. This is needed to smoothly store strip addresses in track
23 // references. 
24 //
25 // Added by Hans H. Dalsgaard (hans.dalsgaard@cern.ch) 
26
27
28 class AliFMDStripIndex
29 {
30 public:
31   enum { 
32     // Mask of ID
33     kIdMask = 0x0007FFFF,
34     // Mask of energy 
35     kEMask  = 0xFFF80000,
36     // Offset of energy 
37     kEOffset = 19
38   };
39   /** 
40    * Constructor
41    * 
42    */  
43   AliFMDStripIndex() {}
44   /** 
45    * Destructor 
46    * 
47    */
48   virtual ~AliFMDStripIndex() {}
49   /** 
50    * Pack an identifier from detector coordinates
51    * 
52    * @param det  Detector
53    * @param rng  Ring
54    * @param sec  Sector
55    * @param str  Strip
56    * 
57    * @return Packed identifier 
58    */
59   static UInt_t Pack(UShort_t det, Char_t rng, UShort_t sec, UShort_t str) 
60   {
61     UInt_t irg  = (rng == 'I' || rng == 'i' ? 0 : 1);
62     UInt_t id   = (((str & 0x1FF) <<  0) | 
63                    ((sec & 0x03F) <<  9) | 
64                    ((irg & 0x001) << 16) | 
65                    ((det & 0x003) << 17));
66     return (id & kIdMask);
67   }
68   /** 
69    * Unpack an identifier to detector coordinates
70    * 
71    * @param id   Identifier to unpack
72    * @param det  On return, the detector
73    * @param rng  On return, the ring
74    * @param sec  On return, the sector
75    * @param str  On return, the strip
76    */  
77   static void Unpack(UInt_t id, 
78                      UShort_t& det, Char_t& rng, UShort_t& sec, UShort_t& str)
79   {
80     UInt_t tmp = (kIdMask & id);
81     str = ((tmp >>  0) & 0x1FF);
82     sec = ((tmp >>  9) & 0x03F);
83     rng = ((tmp >> 16) & 0x001) ? 'O' : 'I';
84     det = ((tmp >> 17) & 0x003);
85   }
86   ClassDef(AliFMDStripIndex,1)
87 };
88 #endif
89 //
90 // Local Variables:
91 //   mode: C++
92 // End:
93 //