]>
Commit | Line | Data |
---|---|---|
0145e89a | 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 | #include "AliMUONPainterGroup.h" | |
19 | ||
20 | #include "AliMUONVPainter.h" | |
21 | #include "AliMUONVTrackerData.h" | |
22 | #include "AliLog.h" | |
23 | #include <Riostream.h> | |
24 | #include <TObjArray.h> | |
25 | #include <float.h> | |
26 | ||
27 | ///\class AliMUONPainterGroup | |
28 | /// | |
29 | /// A group of AliMUONVPainter | |
30 | /// | |
31 | ///\author Laurent Aphecetche, Subatech | |
32 | ||
b80faac0 | 33 | using std::cout; |
34 | using std::endl; | |
0145e89a | 35 | ///\cond CLASSIMP |
36 | ClassImp(AliMUONPainterGroup) | |
37 | ///\endcond | |
38 | ||
39 | //_____________________________________________________________________________ | |
40 | AliMUONPainterGroup::AliMUONPainterGroup() | |
41 | : TObject(), | |
42 | fType(""), | |
43 | fIsResponder(kFALSE), | |
44 | fIsVisible(kTRUE), | |
45 | fData(0x0), | |
46 | fDataIndex(-1), | |
47 | fDataMin(FLT_MAX), | |
48 | fDataMax(-FLT_MAX), | |
49 | fPainters(0x0), | |
50 | fDepth(-1), | |
51 | fIsOutlined(kTRUE) | |
52 | { | |
53 | /// ctor | |
54 | } | |
55 | ||
56 | //_____________________________________________________________________________ | |
57 | AliMUONPainterGroup::AliMUONPainterGroup(const char* type, Int_t depth) | |
58 | : TObject(), | |
59 | fType(type), | |
60 | fIsResponder(kFALSE), | |
61 | fIsVisible(kTRUE), | |
62 | fData(0x0), | |
63 | fDataIndex(-1), | |
64 | fDataMin(FLT_MAX), | |
65 | fDataMax(-FLT_MAX), | |
66 | fPainters(0x0), | |
67 | fDepth(depth), | |
68 | fIsOutlined(kTRUE) | |
69 | { | |
70 | /// ctor | |
71 | if ( fType == "" || fDepth < 0 ) | |
72 | { | |
fc2293be | 73 | AliFatal("Sorry guy."); |
0145e89a | 74 | } |
75 | } | |
76 | ||
77 | //_____________________________________________________________________________ | |
78 | AliMUONPainterGroup::~AliMUONPainterGroup() | |
79 | { | |
80 | /// dtor | |
81 | delete fPainters; | |
82 | } | |
83 | ||
84 | //_____________________________________________________________________________ | |
85 | Bool_t | |
86 | AliMUONPainterGroup::Add(AliMUONVPainter* painter) | |
87 | { | |
88 | /// Add a painter to this group (must be of the correct type) | |
89 | ||
90 | if ( fType != painter->Type() ) | |
91 | { | |
92 | AliError(Form("Cannot add painter of type %s to this = %s", | |
93 | painter->Type(), fType.Data())); | |
94 | return kFALSE; | |
95 | } | |
96 | ||
97 | if ( fDepth != painter->Depth() ) | |
98 | { | |
99 | AliError(Form("Cannot add painter of depth %d to this = %d", | |
100 | painter->Depth(), fDepth)); | |
101 | return kFALSE; | |
102 | } | |
103 | ||
104 | if (!fPainters) | |
105 | { | |
106 | fPainters = new TObjArray; | |
107 | } | |
108 | ||
109 | painter->SetMotherGroup(this); | |
110 | ||
111 | fPainters->Add(painter); | |
112 | ||
113 | return kTRUE; | |
114 | } | |
115 | ||
116 | //_____________________________________________________________________________ | |
117 | Int_t | |
118 | AliMUONPainterGroup::Compare(const TObject* obj) const | |
119 | { | |
120 | /// Compare with another group (based on type) | |
121 | ||
122 | const AliMUONPainterGroup* group = static_cast<const AliMUONPainterGroup*>(obj); | |
123 | return fType.CompareTo(group->Type()); | |
124 | } | |
125 | ||
126 | //_____________________________________________________________________________ | |
127 | void | |
128 | AliMUONPainterGroup::ComputeDataRange(Double_t& dataMin, Double_t& dataMax) | |
129 | { | |
130 | /// Compute the data range spanned by this group | |
131 | dataMin = FLT_MAX; | |
132 | dataMax = -FLT_MAX; | |
133 | ||
134 | if ( !fData || fDataIndex < 0 ) return; | |
135 | ||
136 | TIter next(fPainters); | |
137 | AliMUONVPainter* p; | |
138 | ||
139 | while ( ( p = static_cast<AliMUONVPainter*>(next()) ) ) | |
140 | { | |
141 | Double_t min, max; | |
142 | p->ComputeDataRange(*fData,fDataIndex,min,max); | |
143 | dataMin = TMath::Min(min,dataMin); | |
144 | dataMax = TMath::Max(max,dataMax); | |
145 | } | |
146 | } | |
147 | ||
148 | //_____________________________________________________________________________ | |
149 | void | |
150 | AliMUONPainterGroup::Draw(Option_t* opt) | |
151 | { | |
152 | /// Draw our painters | |
153 | TIter next(fPainters); | |
154 | TObject* o; | |
155 | while ( ( o = next() ) ) | |
156 | { | |
157 | o->Draw(opt); | |
158 | } | |
159 | } | |
160 | ||
161 | //_____________________________________________________________________________ | |
162 | AliMUONVPainter* | |
163 | AliMUONPainterGroup::First() const | |
164 | { | |
165 | /// Get the first painter in group | |
166 | if ( fPainters ) | |
167 | { | |
168 | return static_cast<AliMUONVPainter*>(fPainters->First()); | |
169 | } | |
170 | return 0x0; | |
171 | } | |
172 | ||
173 | //_____________________________________________________________________________ | |
174 | Int_t | |
175 | AliMUONPainterGroup::GetLineColor() const | |
176 | { | |
177 | /// Get line color of this group's painters | |
178 | if ( fPainters ) | |
179 | { | |
180 | return static_cast<AliMUONVPainter*>(fPainters->First())->GetLineColor(); | |
181 | } | |
182 | return 1; | |
183 | } | |
184 | ||
185 | //_____________________________________________________________________________ | |
186 | Int_t | |
187 | AliMUONPainterGroup::GetLineWidth() const | |
188 | { | |
189 | /// Get line width of this group's painters | |
190 | if ( fPainters ) | |
191 | { | |
192 | return static_cast<AliMUONVPainter*>(fPainters->First())->GetLineWidth(); | |
193 | } | |
194 | return 1; | |
195 | } | |
196 | ||
197 | //_____________________________________________________________________________ | |
198 | Bool_t | |
199 | AliMUONPainterGroup::Matches(const char* pattern) const | |
200 | { | |
201 | /// Whether our type matches "pattern" | |
202 | TString spattern(pattern); | |
203 | ||
204 | if ( spattern == "*" || fType.Contains(pattern) ) | |
205 | { | |
206 | return kTRUE; | |
207 | } | |
208 | return kFALSE; | |
209 | } | |
210 | ||
211 | //_____________________________________________________________________________ | |
212 | void | |
213 | AliMUONPainterGroup::Print(Option_t* opt) const | |
214 | { | |
215 | /// Printout | |
216 | cout << "Type " << fType.Data() << " Depth " << fDepth; | |
217 | if ( IsResponder() ) cout << " is responder "; | |
218 | if ( IsVisible() ) cout << " is visible "; | |
219 | if ( IsPlotter() ) | |
220 | { | |
221 | cout << Form(" is plotter for data %p %s dimension %d %s plot range = %e, %e", | |
222 | fData,(fData ? fData->Name() : ""), | |
223 | fDataIndex,( (fData && fDataIndex>=0 ) ? | |
224 | fData->DimensionName(fDataIndex).Data() : ""), | |
225 | DataMin(),DataMax()); | |
226 | } | |
227 | if ( IsOutlined() ) | |
228 | { | |
229 | cout << " is outlined"; | |
230 | } | |
231 | if ( fPainters ) | |
232 | { | |
233 | cout << " contains " << fPainters->GetLast()+1 << " painters"; | |
234 | } | |
235 | ||
236 | cout << endl; | |
237 | ||
238 | TString sopt(opt); | |
239 | sopt.ToUpper(); | |
240 | if ( sopt == "FULL" ) | |
241 | { | |
242 | TIter next(fPainters); | |
243 | AliMUONVPainter* painter; | |
244 | while ( ( painter = static_cast<AliMUONVPainter*>(next()) ) ) | |
245 | { | |
246 | cout << " "; | |
247 | painter->Print(); | |
248 | } | |
249 | } | |
250 | } | |
251 | ||
252 | //_____________________________________________________________________________ | |
253 | void | |
254 | AliMUONPainterGroup::SetData(AliMUONVTrackerData* data, Int_t dataIndex) | |
255 | { | |
256 | /// Set the data to be plotted | |
257 | fData = data; | |
258 | fDataIndex = dataIndex; | |
259 | fDataMax = -FLT_MAX; | |
260 | fDataMin = FLT_MAX; | |
261 | } | |
262 | ||
263 | //_____________________________________________________________________________ | |
264 | void | |
265 | AliMUONPainterGroup::SetLine(Int_t lineColor, Int_t lineWidth) | |
266 | { | |
267 | /// Set our outline attributes | |
268 | TIter next(fPainters); | |
269 | AliMUONVPainter* painter; | |
270 | while ( ( painter = static_cast<AliMUONVPainter*>(next()) ) ) | |
271 | { | |
272 | painter->SetLineColor(lineColor); | |
273 | painter->SetLineWidth(lineWidth); | |
274 | } | |
275 | } | |
276 |