1 /*************************************************************************
2 * Copyright(c) 2004, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 *************************************************************************
17 * @file AliFMDBaseDigit.cxx
18 * @author Christian Holm Christensen <cholm@nbi.dk>
19 * @date Mon Mar 27 12:37:41 2006
20 * @brief Digits for the FMD
23 //////////////////////////////////////////////////////////////////////
25 // Digits classes for the FMD
32 // - ADC count in this channel
39 // - Total energy deposited in the strip
40 // - ADC count in this channel
42 // As the Digits and SDigits have so much in common, the classes
43 // AliFMDDigit and AliFMDSDigit are implemented via a base
44 // class AliFMDBaseDigit.
46 // +-----------------+
47 // | AliFMDBaseDigit |
48 // +-----------------+
53 // +-------------+ +--------------+
54 // | AliFMDDigit | | AliFMDSDigit |
55 // +-------------+ +--------------+
57 // (Note, that I'd really would have liked to implement AliFMDHit as a
58 // derived class from some base class - say AliFMDStrip, and the Digit
59 // classes would (eventually) have derived from that as well.
60 // However, ROOT doesn't do well with multiple inheritance, so I chose
63 // Latest changes by Christian Holm Christensen
65 //////////////////////////////////////////////////////////////////////
67 #include "AliFMDBaseDigit.h" // ALIFMDDIGIT_H
68 #include "AliFMDStripIndex.h"
69 #include "Riostream.h" // ROOT_Riostream
70 // #include <TString.h>
71 // #include <AliLog.h>
72 #include "AliFMDDebug.h" // Better debug macros
74 //====================================================================
77 ClassImp(AliFMDBaseDigit)
79 ; // This is here to keep Emacs from indenting the next line
82 //____________________________________________________________________
83 AliFMDBaseDigit::AliFMDBaseDigit()
95 //____________________________________________________________________
96 AliFMDBaseDigit::AliFMDBaseDigit(UShort_t detector,
108 // Creates a base data digit object
112 // detector Detector # (1, 2, or 3)
113 // ring Ring ID ('I' or 'O')
114 // sector Sector # (For inner/outer rings: 0-19/0-39)
115 // strip Strip # (For inner/outer rings: 0-511/0-255)
118 //____________________________________________________________________
119 AliFMDBaseDigit::AliFMDBaseDigit(Int_t* tracks,
132 // Creates a base data digit object
136 // tracks Array of 3 track labels
137 // detector Detector # (1, 2, or 3)
138 // ring Ring ID ('I' or 'O')
139 // sector Sector # (For inner/outer rings: 0-19/0-39)
140 // strip Strip # (For inner/outer rings: 0-511/0-255)
143 //____________________________________________________________________
145 AliFMDBaseDigit::Print(Option_t* /* option*/) const
147 // Print digit to standard out
148 cout << ClassName() << ": FMD" << fDetector << fRing
149 << '[' << std::setw(2) << fSector
150 << ',' << std::setw(3) << fStrip << ']' << flush;
153 //____________________________________________________________________
155 AliFMDBaseDigit::GetName() const
157 // Get the name of a FMD digit.
159 fName = Form("FMD%d%c[%2d,%3d]", fDetector, fRing, fSector, fStrip);
162 #define fMaxStrips 512
163 #define fMaxSectors 40
166 //____________________________________________________________________
168 AliFMDBaseDigit::Hash() const
170 // Calculate a hash value based on the detector coordinates.
172 return AliFMDStripIndex::Pack(fDetector, fRing, fSector, fStrip);
174 size_t ringi = (fRing == 'I' || fRing == 'i' ? 0 : 1);
175 return fStrip + fMaxStrips *
176 (fSector + fMaxSectors * (ringi + fMaxRings * (fDetector - 1)));
181 //____________________________________________________________________
183 AliFMDBaseDigit::Compare(const TObject* o) const
185 // Compare to other digit. If the passed pointer to TObject does
186 // not point to an object of class AliFMDBaseDigit (or one of it's
187 // derived classes), then a fatal exception is made.
189 // Returns -1, if this object's detector coordinates are smaller
190 // than passed object's detector coordinates.
192 // Returns 0, if this object's detector coordinates is the same as
193 // passed object's detector coordinates.
195 // Returns 1, if this object's detector coordinates are larger
196 // than passed object's detector coordinates.
198 AliFatal("Can not compare to NULL!");
199 if (o->IsA() != AliFMDBaseDigit::Class())
200 AliFatal(Form("Cannot compare to a %s object", o->ClassName()));
201 // AliFMDBaseDigit* of = static_cast<AliFMDBaseDigit*>(o);
202 if (Hash() == o->Hash()) return 0;
203 if (Hash() < o->Hash()) return -1;
207 //____________________________________________________________________
209 AliFMDBaseDigit::AddTrack(Int_t track)
212 // Add a track referenc
215 // trackno The track number
217 if (fTracks[0] == -1) fTracks[0] = track;
218 else if (fTracks[1] == -1) fTracks[1] = track;
219 else if (fTracks[2] == -1) fTracks[2] = track;
221 AliFMDDebug(1, ("While adding track label to %s for %s: "
222 "All 3 track labels used, can't add "
223 "reference to track %d",
224 ClassName(), GetName(), track));
227 //____________________________________________________________________
229 AliFMDBaseDigit::GetNTrack() const
232 // Get the number of track references (max 3)
236 // Number of valid track references.
238 for (Int_t i = 3; i > 0; i--)
239 if (fTracks[i-1] != -1) return i;
244 //____________________________________________________________________