- synchronized the overlay macro to the changes of the drawing one
[u/mrichter/AliRoot.git] / HLT / MUON / AliHLTMUONRecHit.cxx
CommitLineData
753896cd 1/**************************************************************************
1d8ae082 2 * This file is property of and copyright by the ALICE HLT Project *
753896cd 3 * All rights reserved. *
4 * *
5 * Primary Authors: *
6 * Artur Szostak <artursz@iafrica.com> *
7 * *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
1d8ae082 13 * about the suitability of this software for any purpose. It is *
753896cd 14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
16
1d8ae082 17// $Id$
753896cd 18
450e0b36 19///
20/// @file AliHLTMUONRecHit.cxx
21/// @author Artur Szostak <artursz@iafrica.com>
22/// @date 29 Sep 2007
23/// @brief Implementation of the AliHLTMUONRecHit class.
24///
25/// The AliHLTMUONRecHit object is used to store 3D hit coordinates translated
26/// from dHLT raw data.
27///
753896cd 28
29#include "AliHLTMUONRecHit.h"
30#include "AliLog.h"
31#include "mapping/AliMpDEManager.h"
32#include <cstring>
33#include <iostream>
34#include <iomanip>
753896cd 35
36ClassImp(AliHLTMUONRecHit);
450e0b36 37ClassImp(AliHLTMUONRecHit::AliChannel);
753896cd 38
39
40std::ostream& operator << (std::ostream& stream, const AliHLTMUONRecHit& hit)
41{
450e0b36 42/// Stream operator for std::ostream classes.
43/// \param stream The output stream object being written to.
44/// \param track The hit object to print to the stream.
45/// \returns Returns 'stream'.
753896cd 46
47 stream << "(" << hit.X() << ", " << hit.Y() << ", " << hit.Z() << ")";
48 return stream;
49}
50
51
52void AliHLTMUONRecHit::SetDebugInfo(
66622a82 53 Int_t detElemId, Int_t clusterId,
54 UShort_t nChExpB, UShort_t nChExpNB,
55 Float_t chargeB, Float_t chargeNB,
56 Int_t sourceDDL
753896cd 57 )
58{
66622a82 59/// Sets the extra debugging information.
450e0b36 60/// @param detElemId The detector element ID.
61/// @param clusterId Cluster ID of the hit's cluster.
66622a82 62/// @param nChExpB Number of expected channels in the bending plane forming the cluster.
63/// @param nChExpNB Number of expected channels in the non-bending plane forming the cluster.
64/// @param chargeB The charge of the cluster in the bending plane.
65/// @param chargeNB The charge of the cluster in the non-bending plane.
450e0b36 66/// @param sourceDDL The source DDL of this hit.
753896cd 67
68 fSourceDDL = sourceDDL;
69 fDetElemId = detElemId;
70 fClusterId = clusterId;
66622a82 71 fNchExpB = nChExpB;
72 fNchExpNB = nChExpNB;
73 fChargeB = chargeB;
74 fChargeNB = chargeNB;
753896cd 75}
76
77
78Int_t AliHLTMUONRecHit::Chamber(bool warn) const
79{
450e0b36 80/// Returns the chamber ID for this hit.
81/// \param warn Indicates if any warning should be printed in case of problems.
82/// \returns The chamber number of this hit in the range [1..14] or -1 if not known.
753896cd 83
00d81682 84 //FIXME: 16 March 2010 AliMpDEManager::GetChamberId is not behaving as the
85 // documentation indicates anymore and now causes a segfault.
86 //if (fDetElemId != -1) return AliMpDEManager::GetChamberId(fDetElemId, warn);
87 if (fDetElemId != -1) return fDetElemId/100;
753896cd 88
89 if (warn)
90 {
91 AliWarning("Neither the DDL source nor the detector element ID was not set,"
92 " so we do not know on which chamber this hit was reconstructed."
93 );
94 }
95 return -1;
96}
97
98
99void AliHLTMUONRecHit::AddChannel(
462e3880 100 Short_t buspatch, Short_t manu, Short_t channel, Short_t signal,
753896cd 101 UInt_t rawDataWord
102 )
103{
450e0b36 104/// Adds a new channel to the channels list forming this hit's cluster.
462e3880 105/// @param buspatch The bus patch ID of the channel.
450e0b36 106/// @param manu The MANU number
107/// @param channel The MANU channel address.
108/// @param signal The ADC signal value measured on the channel.
109/// @param rawDataWord This is the raw data word as read from the DDL.
753896cd 110
111 Int_t index = fChannels.GetEntriesFast();
462e3880 112 new (fChannels[index]) AliChannel(buspatch, manu, channel, signal, rawDataWord);
753896cd 113}
114
115
116void AliHLTMUONRecHit::Print(Option_t* option) const
117{
450e0b36 118/// Prints the coordinates of this hit to standard output (screen).
119/// \param option Can be one of the following:
120/// - "compact" - prints in a compact format.
121/// - "detail" - prints hit information in a more detailed format.
122/// - "all" - prints a full dump of the hit object.
123
124 using namespace std;
753896cd 125
126 if ( option == NULL or strcmp(option, "") == 0 or
127 strcmp(option, "compact") == 0
128 )
129 {
130 cout << *this << endl;
131 }
132 else if (strcmp(option, "detail") == 0)
133 {
134 cout << "(x = " << X() << " cm, y = " << Y()
135 << " cm, z = " << Z()
136 << " cm); source DDL = " << fSourceDDL
137 << "; DetElemID = " << fDetElemId
138 << "; cluster ID = " << fClusterId
66622a82 139 << "; total charge = " << fChargeB + fChargeNB
140 << "; expected #ch = " << fNchExpB + fNchExpNB << endl;
753896cd 141 }
142 else if (strcmp(option, "all") == 0)
143 {
462e3880 144 streamsize w = cout.width();
145 ios::fmtflags f = cout.flags();
146 cout << "RecHit: (x = " << X() << " cm, y = " << Y()
753896cd 147 << " cm, z = " << Z()
148 << " cm); source DDL = " << fSourceDDL
149 << "; DetElemID = " << fDetElemId
150 << "; cluster ID = " << fClusterId
462e3880 151 << endl;
152 cout << setw(0) << " Plane:" << setw(14) << "Bending" << setw(14) << "Non-bending" << endl;
153 cout << setw(0) << " Charge:" << setw(14) << fChargeB << setw(14) << fChargeNB << endl;
154 cout << setw(0) << "Expected channels #:" << setw(14) << fNchExpB << setw(14) << fNchExpNB << setw(0) << endl;
753896cd 155 if (fChannels.GetEntriesFast() == 0)
156 {
157 cout << "No channels found for this hit." << endl;
158 }
159 else
160 {
753896cd 161 cout << setw(12) << "MANU"
162 << setw(12) << "Channel"
163 << setw(12) << "Signal"
164 << setw(15) << "Raw data word" << endl;
165 cout << showbase;
166 for (Int_t i = 0; i < fChannels.GetEntriesFast(); i++)
167 {
450e0b36 168 const AliHLTMUONRecHit::AliChannel* c =
169 static_cast<const AliHLTMUONRecHit::AliChannel*>(fChannels[i]);
753896cd 170 cout << dec << setw(12) << c->Manu()
171 << setw(12) << c->Address()
172 << setw(12) << c->Signal()
173 << " " << hex << setw(10) << internal;
174 ios::char_type fc = cout.fill('0');
175 cout << c->RawDataWord() << right << endl;
176 cout.fill(fc);
177 }
753896cd 178 }
462e3880 179 cout.width(w); // reset the field width to previous value.
180 cout.flags(f); // reset the flags to previous values.
753896cd 181 }
182 else
183 {
184 AliError("Unknown option specified. Can only be one of 'compact',"
185 " 'detail' or 'all'."
186 );
187 }
188}
189
190
191Int_t AliHLTMUONRecHit::Compare(const TObject* obj) const
192{
450e0b36 193/// We compare this object with 'obj' first by X, then Y, then Z.
194/// \param obj This is the object to compare to. It must be of type AliHLTMUONRecHit.
195/// \returns -1 if 'this' is smaller than 'obj', 1 if greater and zero if both
196/// objects are the same.
753896cd 197
198 if (obj->IsA() == AliHLTMUONRecHit::Class())
199 {
200 const AliHLTMUONRecHit* h = static_cast<const AliHLTMUONRecHit*>(obj);
201 if (X() < h->X()) return -1;
202 if (X() > h->X()) return 1;
203 if (Y() < h->Y()) return -1;
204 if (Y() > h->Y()) return 1;
205 if (Z() < h->Z()) return -1;
206 if (Z() > h->Z()) return 1;
207 return 0;
208 }
209 else
210 {
211 AliError(Form("Do not know how to compare %s to %s.",
212 this->ClassName(),
213 obj->ClassName()
214 ));
215 return -999;
216 }
217}
218
219
450e0b36 220std::ostream& operator << (std::ostream& stream, const AliHLTMUONRecHit::AliChannel& c)
753896cd 221{
450e0b36 222/// Stream operator for std::ostream classes.
223/// \param stream The output stream object being written to.
224/// \param c The channel object to print to the stream.
225/// \returns Returns 'stream'.
753896cd 226
227 stream << "Channel: " << c.fManu << " , " << c.fAddress
228 << "; ADC: " << c.fSignal;
229 return stream;
230}
231
232
450e0b36 233void AliHLTMUONRecHit::AliChannel::Print(Option_t* option) const
753896cd 234{
450e0b36 235/// Prints the details of this channel to standard output (screen).
236/// \param option Can be one of the following:
237/// - "compact" - prints in a compact format.
238/// - "detail" - prints channel information in a more detailed format.
753896cd 239
450e0b36 240 using namespace std;
241
753896cd 242 if ( option == NULL or strcmp(option, "") == 0 or
243 strcmp(option, "compact") == 0
244 )
245 {
246 cout << *this << endl;
247 }
248 else if (strcmp(option, "detail") == 0)
249 {
250 streamsize w = cout.width();
251 ios::fmtflags f = cout.flags();
252 cout << "MANU = " << fManu << ", Channel address = " << fAddress
253 << ", Signal = " << fSignal
254 << "; Raw data word = " << hex << setw(10) << internal;
255 ios::char_type fc = cout.fill('0');
256 cout << fRawDataWord << endl;
257 cout.fill(fc); // reset fill character
258 cout.width(w); // reset the field width to previous value.
259 cout.flags(f); // reset the flags to previous values.
260 }
261 else
262 {
263 AliError("Unknown option specified. Can only be one of"
264 " 'compact' or 'detail'."
265 );
266 }
267}
268
269
450e0b36 270Int_t AliHLTMUONRecHit::AliChannel::Compare(const TObject* obj) const
753896cd 271{
450e0b36 272/// We compare this object with 'obj' first by MANU number, then by MANU channel
273/// address, then ADC signal.
274/// \param obj This is the object to compare to. It must be of type AliHLTMUONRecHit::Channel.
275/// \returns -1 if 'this' is smaller than 'obj', 1 if greater and zero if both
276/// objects are the same.
753896cd 277
450e0b36 278 if (obj->IsA() == AliChannel::Class())
753896cd 279 {
450e0b36 280 const AliChannel* c = static_cast<const AliChannel*>(obj);
753896cd 281 if (fManu < c->Manu()) return -1;
282 if (fManu > c->Manu()) return 1;
283 if (fAddress < c->Address()) return -1;
284 if (fAddress > c->Address()) return 1;
285 if (fSignal < c->Signal()) return -1;
286 if (fSignal > c->Signal()) return 1;
287 return 0;
288 }
289 else
290 {
291 AliError(Form("Do not know how to compare %s to %s.",
292 this->ClassName(),
293 obj->ClassName()
294 ));
295 return -999;
296 }
297}