]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONVDigit.cxx
whoops
[u/mrichter/AliRoot.git] / MUON / AliMUONVDigit.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
16 // $Id$
17
18 //-----------------------------------------------------------------------------
19 /// \class AliMUONVDigit
20 ///
21 /// This is the base class of a MUON digit that most client code should deal with.
22 /// There should be no reason to have to use a concrete class in most cases.
23 ///
24 /// All digits have basic features, like :
25 ///
26 /// - a way to identify it : detection element, electronics card and
27 ///   channel, cathode. Note that some static methods exists to compact 
28 ///   those 4 informations into a single 4 bytes integer (stored in the
29 ///   fUniqueID data member present in all TObjects). 
30 ///
31 /// - its charge
32 ///
33 /// - a set of boolean methods to indicate whether the digit has been calibrated, etc...
34 ///
35 /// In addition, if HasMCInformation is true, the digit store also the list
36 /// of MC tracks that contributed to its charge
37 ///
38 /// Also, if HasGeometryInformation is true, the digit knows the position and
39 /// the (half) dimensions (in cm) of the pad it corresponds to.
40 ///
41 /// \author Laurent Aphecetche, Subatech
42 //-----------------------------------------------------------------------------
43
44 #include "AliMUONVDigit.h"
45
46 #include <Riostream.h>
47 #include <TClass.h>
48
49 /// \cond CLASSIMP
50 ClassImp(AliMUONVDigit)
51 /// \endcond
52
53 //_____________________________________________________________________________
54 AliMUONVDigit::AliMUONVDigit(Int_t detElemId, Int_t eCardId,
55                              Int_t eCardChannel, Int_t cathode)
56 : TObject() 
57 {
58   /// Normal constructor for trigger digits
59   SetUniqueID(BuildUniqueID(detElemId,eCardId,eCardChannel,cathode));
60 }
61
62 //_____________________________________________________________________________
63 AliMUONVDigit::AliMUONVDigit()
64 {
65   /// Default ctor
66 }
67
68 //_____________________________________________________________________________
69 AliMUONVDigit::~AliMUONVDigit()
70 {
71   /// dtor
72 }
73
74 //_____________________________________________________________________________
75 Bool_t 
76 AliMUONVDigit::IsEqual(const TObject* object) const
77 {
78   /// Whether we're equal to object. 
79   /// WARNING : only based on our identifiers (de,manu,channel,cathode), not our
80   /// content (i.e. charge, status...)
81   
82   const AliMUONVDigit* d = static_cast<const AliMUONVDigit*>(object);
83     
84   return ( DetElemId() == d->DetElemId() &&
85            Cathode() == d->Cathode() &&
86            ManuId() == d->ManuId() &&
87            ManuChannel() == d->ManuChannel() );
88 }
89
90 //_____________________________________________________________________________
91 Int_t 
92 AliMUONVDigit::Compare(const TObject* object) const
93 {
94   /// Compare two digits, trying to get as complete an order as possible.
95   /// We sort by DE, then by charge, then by manu, etc...
96   ///
97   const AliMUONVDigit* d = static_cast<const AliMUONVDigit*>(object);
98   
99   if ( DetElemId() > d->DetElemId() ) 
100   {
101     return 1;
102   }
103   else if ( DetElemId() < d->DetElemId() )
104   {
105     return -1;
106   }
107   else
108   {
109     if ( Charge() > d->Charge() )
110     {
111       return 1;
112     }
113     else if ( Charge() < d->Charge() )
114     {
115       return -1;
116     }
117     else
118     {
119       if ( ManuId() > d->ManuId() )
120       {
121         return 1;
122       }
123       else if ( ManuId() < d->ManuId() )
124       {
125         return -1;
126       }
127       else
128       {
129         if ( ManuChannel() > d->ManuChannel() )
130         {
131           return 1;
132         }
133         else if ( ManuChannel() < d->ManuChannel() )
134         {
135           return -1;
136         }
137       }
138     }
139   }
140   return 0;
141 }
142
143 //_____________________________________________________________________________
144 UInt_t 
145 AliMUONVDigit::BuildUniqueID(Int_t detElemId, Int_t manuId, 
146                              Int_t manuChannel, Int_t cathode)
147 {
148   /// Build a single integer with id information
149   return ( ( detElemId ) | ( manuId << 12 ) | ( manuChannel << 24 )
150                 | ( cathode << 30 ) );
151 }
152
153 //_____________________________________________________________________________
154 Int_t
155 AliMUONVDigit::DetElemId(UInt_t uniqueID)
156 {
157   /// Return detection element id part of the uniqueID
158   return uniqueID & 0xFFF;
159 }
160
161 //_____________________________________________________________________________
162 Int_t
163 AliMUONVDigit::ManuChannel(UInt_t uniqueID)
164 {
165   /// Return manuChannel part of the uniqueID
166   return ( uniqueID & 0x3F000000 ) >> 24;
167 }
168
169 //_____________________________________________________________________________
170 Int_t
171 AliMUONVDigit::ManuId(UInt_t uniqueID)
172 {
173   /// Return manuId part of the uniqueID
174   return ( uniqueID & 0xFFF000 ) >> 12;
175 }
176
177 //_____________________________________________________________________________
178 Int_t
179 AliMUONVDigit::Cathode(UInt_t uniqueID)
180 {
181   /// Return the cathode part of the uniqueID
182   return ( uniqueID & 0x40000000 ) >> 30;
183 }
184
185 //_____________________________________________________________________________
186 void
187 AliMUONVDigit::DecodeUniqueID(UInt_t uniqueID,
188                               Int_t& detElemId, Int_t& manuId, 
189                               Int_t& manuChannel, Int_t& cathode)
190 {
191   /// Unpack uniqueID into 4 elements
192   detElemId = DetElemId(uniqueID);
193   manuId = ManuId(uniqueID);
194   manuChannel = ManuChannel(uniqueID);
195   cathode = Cathode(uniqueID);
196 }
197
198 //_____________________________________________________________________________
199 const char*
200 AliMUONVDigit::GetName() const
201 {
202   /// Return the name of this digit, composed of its id parts.
203   return Form("DE%04d-%04d-%02d-%d",
204               DetElemId(),ManuId(),ManuChannel(),Cathode());
205 }
206
207 //_____________________________________________________________________________
208 void
209 AliMUONVDigit::Print(Option_t* opt) const
210 {
211   /// Dump to screen.
212   /// If opt=="tracks", info on tracks are printed too.
213   
214   cout << Form("<%s>: ID %12u DE %4d Cath %d (Ix,Iy)=(%3d,%3d) (Manu,Channel)=(%4d,%2d)"
215                ", Charge=%7.2f",
216                ClassName(),GetUniqueID(),
217                DetElemId(),Cathode(),PadX(),PadY(),ManuId(),ManuChannel(),Charge());  
218   if ( IsSaturated() ) 
219   {
220     cout << "(S)";
221   }
222   else
223   {
224     cout << "   ";
225   }
226   
227   if ( IsCalibrated() )
228   {
229     cout << "(C)";
230   }
231   else
232   {
233     cout << "   ";
234   }
235
236   if ( IsUsed() )
237   {
238     cout << "(U)";
239   }
240   else
241   {
242     cout << "   ";
243   }
244   
245   cout << Form(" ADC=%4d StatusMap=%04x",ADC(),StatusMap());
246
247   TString options(opt);
248   options.ToLower();
249   if ( options.Contains("tracks") && HasMCInformation() )
250   {
251     cout << " Hit " << setw(3) << Hit();
252     Int_t ntracks = Ntracks();
253     if (ntracks) 
254     {
255       cout << " Tracks : " << setw(2) << ntracks;
256       for ( Int_t i = 0; i < ntracks; ++i )
257       {
258         cout << " Track(" << i << ")=" << setw(3) << Track(i)
259         << " Charge(" << i << ")=" << setw(5) << TrackCharge(i);
260       }
261     }
262     else
263     {
264       cout << " no track info.";
265     }
266   }
267   cout << endl;  
268 }