First big commit of the mchview program and its accompanying library,
[u/mrichter/AliRoot.git] / MUON / AliMUONManuPadPainter.cxx
CommitLineData
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 "AliMUONManuPadPainter.h"
19
20#include "AliMUONPainterHelper.h"
21#include "AliMUONPainterPadStore.h"
22#include "AliMUONVCalibParam.h"
23#include "AliMUONVDigit.h"
24#include "AliMUONVTrackerData.h"
25#include "AliMpConnection.h"
26#include "AliMpConstants.h"
27#include "AliMpDDLStore.h"
28#include "AliMpDetElement.h"
29#include "AliMpPad.h"
30#include "AliMpSegmentation.h"
31#include "AliMpVSegmentation.h"
32#include "AliLog.h"
33#include <float.h>
34#include <TVirtualPad.h>
35#include <TVirtualX.h>
36
37///\class AliMUONManuPadPainter
38///
39/// Painter for the pads of one manu
40///
41///\author Laurent Aphecetche, Subatech
42
43///\cond CLASSIMP
44ClassImp(AliMUONManuPadPainter)
45///\endcond
46
47//_____________________________________________________________________________
48AliMUONManuPadPainter::AliMUONManuPadPainter()
49: AliMUONVPainter(),
50fDetElemId(-1),
51fManuId(-1),
52fLineColorBck(-1),
53fLineWidthBck(-1),
54fFillColorBck(-1),
55fFillStyleBck(-1)
56{
57 /// ctor
58}
59
60//_____________________________________________________________________________
61AliMUONManuPadPainter::AliMUONManuPadPainter(const AliMUONVPainter& mother,
62 Int_t detElemId,
63 Int_t manuId)
64: AliMUONVPainter("PAD"),
65fDetElemId(detElemId),
66fManuId(manuId),
67fLineColorBck(-1),
68fLineWidthBck(-1),
69fFillColorBck(-1),
70fFillStyleBck(-1)
71{
72 /// ctor
73 SetID(detElemId,manuId);
74 SetName(Form("%s/PAD",mother.GetName()));
75 SetPathName(Form("%s/PAD",mother.PathName().Data()));
76 SetContour(mother.Contour());
77}
78
79//_____________________________________________________________________________
80AliMUONManuPadPainter::~AliMUONManuPadPainter()
81{
82 /// dtor
83}
84
85//_____________________________________________________________________________
86void
87AliMUONManuPadPainter::BackupStyle()
88{
89 /// Remember line and fill style values
90
91 fFillStyleBck = gVirtualX->GetFillStyle();
92 fFillColorBck = gVirtualX->GetFillColor();
93 fLineColorBck = gVirtualX->GetLineColor();
94 fLineWidthBck = gVirtualX->GetLineWidth();
95}
96
97//_____________________________________________________________________________
98void
99AliMUONManuPadPainter::ComputeDataRange(const AliMUONVTrackerData& data,
100 Int_t dataIndex,
101 Double_t& dataMin, Double_t& dataMax) const
102{
103 /// Compute data range spanned by this manu pads
104 AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(fDetElemId);
105
106 dataMin = FLT_MAX;
107 dataMax = -FLT_MAX;
108
109 for ( Int_t manuChannel = 0; manuChannel < AliMpConstants::ManuNofChannels();
110 ++manuChannel )
111 {
112 if ( de->IsConnectedChannel(fManuId,manuChannel) )
113 {
114 Double_t value = data.Channel(fDetElemId, fManuId, manuChannel, dataIndex);
115 dataMin = TMath::Min(value,dataMin);
116 dataMax = TMath::Max(value,dataMax);
117 }
118 }
119}
120
121//_____________________________________________________________________________
122char*
123AliMUONManuPadPainter::GetObjectInfo(Int_t px, Int_t py) const
124{
125 /// Get object info
126 return const_cast<char*>(Form("%s:%d:%d",GetName(),px,py));
127}
128
129//_____________________________________________________________________________
130TString
131AliMUONManuPadPainter::NameAtPosition(Double_t x, Double_t y) const
132{
133 /// Specific name, dependent on the position within this painter
134
135 TString name("invalid");
136
137 AliMpPad pad = PadByPosition(x,y);
138
139 if ( pad.IsValid() )
140 {
141 name = Form("%s%d",PathName().Data(),pad.GetLocation().GetSecond());
142 }
143
144 return name;
145}
146
147//_____________________________________________________________________________
148TString
149AliMUONManuPadPainter::Describe(const AliMUONVTrackerData& data, Int_t dataIndex,
150 Double_t x, Double_t y)
151{
152 /// Describe data at given location
153
154 if ( ! data.HasManu(fDetElemId,fManuId) ) return "";
155
156 AliMpPad pad = PadByPosition(x,y);
157
158 if ( pad.IsValid() )
159 {
160 Double_t value = data.Channel(fDetElemId,fManuId,pad.GetLocation().GetSecond(),dataIndex);
161
162 return AliMUONPainterHelper::Instance()->FormatValue(data.DimensionName(dataIndex).Data(),value);
163 }
164 else
165 {
166 return "invalid";
167 }
168}
169
170//_____________________________________________________________________________
171void
172AliMUONManuPadPainter::PaintArea(const AliMUONVTrackerData& data,
173 Int_t dataIndex,
174 Double_t min,
175 Double_t max)
176{
177 /// Paint area of this manu pads according to the data
178
179 if ( !gPad ) return;
180
181 if ( ! data.HasManu(fDetElemId,fManuId) ) return;
182
183 AliMUONPainterHelper* h = AliMUONPainterHelper::Instance();
184
185 BackupStyle();
186
187 Int_t cathode = h->GetCathodeType(fDetElemId,fManuId);
188
189 gVirtualX->SetLineColor(-1);
190 gVirtualX->SetFillStyle(1);
191
192 for ( Int_t i = 0; i < AliMpConstants::ManuNofChannels(); ++i )
193 {
194 Int_t id = AliMUONVDigit::BuildUniqueID(fDetElemId,fManuId,i,cathode);
195
196 TVector2 position;
197 TVector2 dimensions;
198
199 h->PadStore().GetPadGeometry(id,position,dimensions);
200
201 if ( dimensions.X() > 0 )
202 {
203 Double_t value = data.Channel(fDetElemId,fManuId,i,dataIndex);
204
205 if ( value >= AliMUONVCalibParam::InvalidFloatValue() ) continue;
206
207 Int_t color = h->ColorFromValue(value,min,max);
208
209 if ( value > 0 )
210 {
211 AliDebug(1,Form("DE %d manuId %d channel %d value %e min %e max %e color %d",
212 fDetElemId,fManuId,i,value,min,max,
213 color));
214 }
215
216 gVirtualX->SetFillColor(color);
217
218 TVector2 bl(position-dimensions);
219 TVector2 ur(position+dimensions);
220
221 gPad->PaintBox(bl.X(),bl.Y(),ur.X(),ur.Y());
222 }
223 }
224
225 RestoreStyle();
226}
227
228//_____________________________________________________________________________
229void
230AliMUONManuPadPainter::PaintPad(Int_t padId) const
231{
232 /// Paint a single pad
233
234 TVector2 position;
235 TVector2 dimensions;
236
237 AliMUONPainterHelper::Instance()->PadStore().GetPadGeometry(padId,position,dimensions);
238
239 if ( dimensions.X() > 0 )
240 {
241 TVector2 bl(position-dimensions);
242 TVector2 ur(position+dimensions);
243
244 gPad->PaintBox(bl.X(),bl.Y(),ur.X(),ur.Y());
245 }
246}
247
248//_____________________________________________________________________________
249void
250AliMUONManuPadPainter::PaintOutline(Int_t color, Int_t, Double_t x, Double_t y)
251{
252 /// Paint the outline of our pads
253
254 if ( !gPad ) return;
255
256 Int_t lineColor = color >= 0 ? color : GetLineColor();
257
258 AliMUONPainterHelper* h = AliMUONPainterHelper::Instance();
259
260 AliDebug(1,Form("color=%d lineColor=%d x=%7.3f y=%7.3f",color,lineColor,x,y));
261
262 if ( lineColor > 0 )
263 {
264 BackupStyle();
265
266 Int_t cathode = h->GetCathodeType(fDetElemId,fManuId);
267
268 gVirtualX->SetLineColor(lineColor);
269 gVirtualX->SetFillStyle(0);
270
271 if ( x < FLT_MAX && y < FLT_MAX )
272 {
273 // find pad to be drawn
274 AliMpPad pad = PadByPosition(x,y);
275
276 Int_t id = AliMUONVDigit::BuildUniqueID(fDetElemId,fManuId,pad.GetLocation().GetSecond(),cathode);
277
278 PaintPad(id);
279 }
280 else
281 {
282 for ( Int_t i = 0; i < AliMpConstants::ManuNofChannels(); ++i )
283 {
284 Int_t id = AliMUONVDigit::BuildUniqueID(fDetElemId,fManuId,i,cathode);
285
286 PaintPad(id);
287 }
288 }
289 RestoreStyle();
290 }
291
292}
293
294//_____________________________________________________________________________
295AliMpPad
296AliMUONManuPadPainter::PadByPosition(Double_t x, Double_t y) const
297{
298 /// Find the pad at given exploded-position (x,y)
299
300 const AliMpVSegmentation* seg = AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(fDetElemId,fManuId);
301
302 Double_t xg,yg,zg;
303 Double_t xl,yl,zl;
304
305 AliMUONPainterHelper::Instance()->Local2Global(fDetElemId,0.0,0.0,0.0,xg,yg,zg); // to get zg
306
307 AliMUONPainterHelper::Instance()->Global2Local(fDetElemId,x,y,zg,xl,yl,zl);
308
309 return seg->PadByPosition(TVector2(xl,yl));
310}
311
312//_____________________________________________________________________________
313void
314AliMUONManuPadPainter::RestoreStyle()
315{
316 /// Restore line and fill style values
317
318 gVirtualX->SetFillStyle(fFillStyleBck);
319 gVirtualX->SetFillColor(fFillColorBck);
320 gVirtualX->SetLineColor(fLineColorBck);
321 gVirtualX->SetLineWidth(fLineWidthBck);
322}
323
324