]>
Commit | Line | Data |
---|---|---|
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 | |
36 | ClassImp(AliHLTMUONRecHit); | |
450e0b36 | 37 | ClassImp(AliHLTMUONRecHit::AliChannel); |
753896cd | 38 | |
39 | ||
40 | std::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 | ||
52 | void 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 | ||
78 | Int_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 | ||
99 | void 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 | ||
116 | void 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 | ||
191 | Int_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 | 220 | std::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 | 233 | void 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 | 270 | Int_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 | } |