]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONVDigit.cxx
Temporary disable the raw version, it will be taken from FEE
[u/mrichter/AliRoot.git] / MUON / AliMUONVDigit.cxx
CommitLineData
d6c3334d 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
3d1463c8 18//-----------------------------------------------------------------------------
d6c3334d 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
3d1463c8 42//-----------------------------------------------------------------------------
d6c3334d 43
44#include "AliMUONVDigit.h"
45
46#include <Riostream.h>
47#include <TClass.h>
48
49/// \cond CLASSIMP
50ClassImp(AliMUONVDigit)
51/// \endcond
52
53//_____________________________________________________________________________
54AliMUONVDigit::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//_____________________________________________________________________________
63AliMUONVDigit::AliMUONVDigit()
64{
65 /// Default ctor
66}
67
68//_____________________________________________________________________________
69AliMUONVDigit::~AliMUONVDigit()
70{
71 /// dtor
72}
73
36a01415 74//_____________________________________________________________________________
75Bool_t
76AliMUONVDigit::IsEqual(const TObject* object) const
77{
22dce0e3 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
36a01415 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//_____________________________________________________________________________
91Int_t
92AliMUONVDigit::Compare(const TObject* object) const
93{
22dce0e3 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 ///
36a01415 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 {
be296517 119 if ( ManuId() > d->ManuId() )
36a01415 120 {
121 return 1;
122 }
be296517 123 else if ( ManuId() < d->ManuId() )
36a01415 124 {
125 return -1;
126 }
127 else
128 {
be296517 129 if ( ManuChannel() > d->ManuChannel() )
130 {
131 return 1;
132 }
133 else if ( ManuChannel() < d->ManuChannel() )
134 {
135 return -1;
136 }
36a01415 137 }
138 }
139 }
140 return 0;
141}
142
d6c3334d 143//_____________________________________________________________________________
144UInt_t
145AliMUONVDigit::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//_____________________________________________________________________________
154Int_t
155AliMUONVDigit::DetElemId(UInt_t uniqueID)
156{
157 /// Return detection element id part of the uniqueID
158 return uniqueID & 0xFFF;
159}
160
161//_____________________________________________________________________________
162Int_t
163AliMUONVDigit::ManuChannel(UInt_t uniqueID)
164{
165 /// Return manuChannel part of the uniqueID
166 return ( uniqueID & 0x3F000000 ) >> 24;
167}
168
169//_____________________________________________________________________________
170Int_t
171AliMUONVDigit::ManuId(UInt_t uniqueID)
172{
173 /// Return manuId part of the uniqueID
174 return ( uniqueID & 0xFFF000 ) >> 12;
175}
176
177//_____________________________________________________________________________
178Int_t
179AliMUONVDigit::Cathode(UInt_t uniqueID)
180{
181 /// Return the cathode part of the uniqueID
182 return ( uniqueID & 0x40000000 ) >> 30;
183}
184
185//_____________________________________________________________________________
186void
187AliMUONVDigit::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//_____________________________________________________________________________
199const char*
200AliMUONVDigit::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//_____________________________________________________________________________
208void
209AliMUONVDigit::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}