4 // Class AliMpZonePainter
5 // ----------------------
6 // Class for drawing a zone into canvas
8 // Authors: David Guez, IPN Orsay
10 #include <TVirtualX.h>
13 #include "AliMpZonePainter.h"
14 #include "AliMpGraphContext.h"
15 #include "AliMpZone.h"
16 #include "AliMpSubZone.h"
17 #include "AliMpVRowSegment.h"
19 ClassImp(AliMpZonePainter)
21 //_______________________________________________________________________
22 AliMpZonePainter::AliMpZonePainter()
26 // default dummy constructor
29 //_______________________________________________________________________
30 AliMpZonePainter::AliMpZonePainter(AliMpZone *zone)
38 //_______________________________________________________________________
39 AliMpZonePainter::~AliMpZonePainter()
45 //_______________________________________________________________________
46 Int_t AliMpZonePainter::DistancetoPrimitive(Int_t x, Int_t y)
48 // dist to the nearest segment center if (x,y) is inside the zone
50 if (fZone->GetNofSubZones()<1) return 9999;
51 AliMpGraphContext *gr = AliMpGraphContext::Instance();
56 TVector2 point = TVector2(gPad->AbsPixeltoX(x), gPad->AbsPixeltoY(y));
59 for (Int_t isub=0;isub<fZone->GetNofSubZones();++isub){
61 AliMpSubZone* sub = fZone->GetSubZone(isub);
62 for (Int_t iseg=0;iseg<sub->GetNofRowSegments();++iseg){
63 //for each row segments
64 AliMpVRowSegment* seg = sub->GetRowSegment(iseg);
67 gr->RealToPad(seg->Position(),seg->Dimensions(),pos,dim);
69 if ( IsInside(point,pos,dim) ){
70 Double_t value = (point-pos).Mod();
71 if (value<res) res=value;
79 //_______________________________________________________________________
80 void AliMpZonePainter::DumpObject()
82 // Draw the owned object
87 //_______________________________________________________________________
88 TVector2 AliMpZonePainter::GetPosition() const
90 // Get the owned object's position
92 if (fZone->GetNofSubZones()<1) return TVector2(0.,0.);
94 TVector2 bl(9999,9999),ur(-9999,-9999);
96 for (Int_t isub=0;isub<fZone->GetNofSubZones();++isub){
98 AliMpSubZone* sub = fZone->GetSubZone(isub);
99 for (Int_t iseg=0;iseg<sub->GetNofRowSegments();++iseg){
100 //for each row segments
101 AliMpVRowSegment* seg = sub->GetRowSegment(iseg);
103 // update the bottom-left corner
104 if (bl.X()>seg->Position().X()-seg->Dimensions().X())
105 bl.Set(seg->Position().X()-seg->Dimensions().X(),bl.Y());
106 if (bl.Y()>seg->Position().Y()-seg->Dimensions().Y())
107 bl.Set(bl.X(),seg->Position().Y()-seg->Dimensions().Y());
108 // update the upper-right corner
109 if (ur.X()<seg->Position().X()+seg->Dimensions().X())
110 ur.Set(seg->Position().X()+seg->Dimensions().X(),ur.Y());
111 if (ur.Y()<seg->Position().Y()+seg->Dimensions().Y())
112 ur.Set(ur.X(),seg->Position().Y()+seg->Dimensions().Y());
118 //_______________________________________________________________________
119 TVector2 AliMpZonePainter::GetDimensions() const
121 // Get the owned object's dimensions
123 if (fZone->GetNofSubZones()<1) return TVector2(0.,0.);
125 TVector2 bl(9999,9999),ur(-9999,-9999);
127 for (Int_t isub=0;isub<fZone->GetNofSubZones();++isub){
128 // for each sub-zones
129 AliMpSubZone* sub = fZone->GetSubZone(isub);
130 for (Int_t iseg=0;iseg<sub->GetNofRowSegments();++iseg){
131 //for each row segments
132 AliMpVRowSegment* seg = sub->GetRowSegment(iseg);
134 // update the bottom-left corner
135 if (bl.X()>seg->Position().X()-seg->Dimensions().X())
136 bl.Set(seg->Position().X()-seg->Dimensions().X(),bl.Y());
137 if (bl.Y()>seg->Position().Y()-seg->Dimensions().Y())
138 bl.Set(bl.X(),seg->Position().Y()-seg->Dimensions().Y());
139 // update the upper-right corner
140 if (ur.X()<seg->Position().X()+seg->Dimensions().X())
141 ur.Set(seg->Position().X()+seg->Dimensions().X(),ur.Y());
142 if (ur.Y()<seg->Position().Y()+seg->Dimensions().Y())
143 ur.Set(ur.X(),seg->Position().Y()+seg->Dimensions().Y());
149 //_______________________________________________________________________
150 void AliMpZonePainter::Draw(Option_t *option)
152 // Draw the sector on the current pad
153 // The first letter of <option> is treated as follows:
154 // case "S" : each sub zones are drawn separately
155 // case "" : the whole zone is drawn at once
156 // in both cases, the rest of the option is passed
157 // as argument to the Draw function of respectively
158 // zone or row objects.
161 AliMpGraphContext *gr = AliMpGraphContext::Instance();
169 for (Int_t iSubZone=0;iSubZone<fZone->GetNofSubZones();++iSubZone){
170 AliMpSubZone *subZone = fZone->GetSubZone(iSubZone);
173 Double_t blx= 9999, bly= 9999;
174 Double_t urx= -9999, ury= -9999;
176 for (Int_t iRowSeg=0;iRowSeg<subZone->GetNofRowSegments();++iRowSeg){
177 AliMpVRowSegment *rowSegment = subZone->GetRowSegment(iRowSeg);
179 TVector2 bl = rowSegment->Position();
180 bl-=rowSegment->Dimensions();
181 TVector2 ur = rowSegment->Position();
182 ur+=rowSegment->Dimensions();
184 if (bl.X()<blx) blx=bl.X();
185 if (bl.Y()<bly) bly=bl.Y();
186 if (ur.X()>urx) urx=ur.X();
187 if (ur.Y()>ury) ury=ur.Y();
189 TVector2 position ( (urx+blx)/2.,(ury+bly)/2. );
190 TVector2 dimensions( (urx-blx)/2.,(ury-bly)/2. );
192 gr->SetPadPosForReal(position,dimensions);
193 gr->SetColor((fZone->GetID()-1)*5+iSubZone+2);
194 DrawObject(subZone,option+1);
200 default: AppendPad(option);
205 //_______________________________________________________________________
206 void AliMpZonePainter::Paint(Option_t *option)
209 AliMpGraphContext *gr = AliMpGraphContext::Instance();
211 if (fZone->GetNofSubZones()<1) return;
213 gPad->Range(0.,0.,1.,1.);
215 Int_t col=gVirtualX->GetFillColor();
218 gVirtualX->SetFillColor(GetColor());
219 Float_t textSize = gVirtualX->GetTextSize();
220 for (Int_t iSubZone=0;iSubZone<fZone->GetNofSubZones();++iSubZone){
221 AliMpSubZone *subZone = fZone->GetSubZone(iSubZone);
222 for (Int_t iRowSeg=0;iRowSeg<subZone->GetNofRowSegments();++iRowSeg){
223 AliMpVRowSegment *rowSegment = subZone->GetRowSegment(iRowSeg);
225 gr->RealToPad(rowSegment->Position(),rowSegment->Dimensions(),
227 gPad->PaintBox(pos.X()-dim.X(),pos.Y()-dim.Y(),
228 pos.X()+dim.X(),pos.Y()+dim.Y());
230 gVirtualX->SetTextSize(15);
231 gPad->PaintText(pos.X()-0.01,pos.Y()-0.01,
232 Form("%d",fZone->GetID()));
236 gVirtualX->SetTextSize(textSize);
237 gVirtualX->SetFillColor(col);