4 // Class AliMpZonePainter
5 // ----------------------
6 // Class for drawing a zone into canvas
8 // Authors: David Guez, IPN Orsay
10 #include "AliMpZonePainter.h"
11 #include "AliMpGraphContext.h"
12 #include "AliMpZone.h"
13 #include "AliMpSubZone.h"
14 #include "AliMpVRowSegment.h"
15 //#include "AliMpSubZonePainter.h"
17 ClassImp(AliMpZonePainter)
19 //_______________________________________________________________________
20 AliMpZonePainter::AliMpZonePainter()
24 // default dummy constructor
27 //_______________________________________________________________________
28 AliMpZonePainter::AliMpZonePainter(AliMpZone *zone)
36 //_______________________________________________________________________
37 Int_t AliMpZonePainter::DistancetoPrimitive(Int_t x, Int_t y)
39 // dist to the nearest segment center if (x,y) is inside the zone
41 if (fZone->GetNofSubZones()<1) return 9999;
42 AliMpGraphContext *gr = AliMpGraphContext::Instance();
47 TVector2 point = TVector2(gPad->AbsPixeltoX(x), gPad->AbsPixeltoY(y));
50 for (Int_t isub=0;isub<fZone->GetNofSubZones();++isub){
52 AliMpSubZone* sub = fZone->GetSubZone(isub);
53 for (Int_t iseg=0;iseg<sub->GetNofRowSegments();++iseg){
54 //for each row segments
55 AliMpVRowSegment* seg = sub->GetRowSegment(iseg);
58 gr->RealToPad(seg->Position(),seg->Dimensions(),pos,dim);
60 if ( IsInside(point,pos,dim) ){
61 Double_t value = (point-pos).Mod();
62 if (value<res) res=value;
70 //_______________________________________________________________________
71 void AliMpZonePainter::DumpObject()
73 // Draw the owned object
78 //_______________________________________________________________________
79 TVector2 AliMpZonePainter::GetPosition() const
81 // Get the owned object's position
83 if (fZone->GetNofSubZones()<1) return TVector2(0.,0.);
85 TVector2 bl(9999,9999),ur(-9999,-9999);
87 for (Int_t isub=0;isub<fZone->GetNofSubZones();++isub){
89 AliMpSubZone* sub = fZone->GetSubZone(isub);
90 for (Int_t iseg=0;iseg<sub->GetNofRowSegments();++iseg){
91 //for each row segments
92 AliMpVRowSegment* seg = sub->GetRowSegment(iseg);
94 // update the bottom-left corner
95 if (bl.X()>seg->Position().X()-seg->Dimensions().X())
96 bl.Set(seg->Position().X()-seg->Dimensions().X(),bl.Y());
97 if (bl.Y()>seg->Position().Y()-seg->Dimensions().Y())
98 bl.Set(bl.X(),seg->Position().Y()-seg->Dimensions().Y());
99 // update the upper-right corner
100 if (ur.X()<seg->Position().X()+seg->Dimensions().X())
101 ur.Set(seg->Position().X()+seg->Dimensions().X(),ur.Y());
102 if (ur.Y()<seg->Position().Y()+seg->Dimensions().Y())
103 ur.Set(ur.X(),seg->Position().Y()+seg->Dimensions().Y());
109 //_______________________________________________________________________
110 TVector2 AliMpZonePainter::GetDimensions() const
112 // Get the owned object's dimensions
114 if (fZone->GetNofSubZones()<1) return TVector2(0.,0.);
116 TVector2 bl(9999,9999),ur(-9999,-9999);
118 for (Int_t isub=0;isub<fZone->GetNofSubZones();++isub){
119 // for each sub-zones
120 AliMpSubZone* sub = fZone->GetSubZone(isub);
121 for (Int_t iseg=0;iseg<sub->GetNofRowSegments();++iseg){
122 //for each row segments
123 AliMpVRowSegment* seg = sub->GetRowSegment(iseg);
125 // update the bottom-left corner
126 if (bl.X()>seg->Position().X()-seg->Dimensions().X())
127 bl.Set(seg->Position().X()-seg->Dimensions().X(),bl.Y());
128 if (bl.Y()>seg->Position().Y()-seg->Dimensions().Y())
129 bl.Set(bl.X(),seg->Position().Y()-seg->Dimensions().Y());
130 // update the upper-right corner
131 if (ur.X()<seg->Position().X()+seg->Dimensions().X())
132 ur.Set(seg->Position().X()+seg->Dimensions().X(),ur.Y());
133 if (ur.Y()<seg->Position().Y()+seg->Dimensions().Y())
134 ur.Set(ur.X(),seg->Position().Y()+seg->Dimensions().Y());
140 //_______________________________________________________________________
141 void AliMpZonePainter::Draw(Option_t *option)
143 // Draw the sector on the current pad
144 // The first letter of <option> is treated as follows:
145 // case "S" : each sub zones are drawn separately
146 // case "" : the whole zone is drawn at once
147 // in both cases, the rest of the option is passed
148 // as argument to the Draw function of respectively
149 // zone or row objects.
152 AliMpGraphContext *gr = AliMpGraphContext::Instance();
160 for (Int_t iSubZone=0;iSubZone<fZone->GetNofSubZones();++iSubZone){
161 AliMpSubZone *subZone = fZone->GetSubZone(iSubZone);
164 Double_t blx= 9999, bly= 9999;
165 Double_t urx= -9999, ury= -9999;
167 for (Int_t iRowSeg=0;iRowSeg<subZone->GetNofRowSegments();++iRowSeg){
168 AliMpVRowSegment *rowSegment = subZone->GetRowSegment(iRowSeg);
170 TVector2 bl = rowSegment->Position();
171 bl-=rowSegment->Dimensions();
172 TVector2 ur = rowSegment->Position();
173 ur+=rowSegment->Dimensions();
175 if (bl.X()<blx) blx=bl.X();
176 if (bl.Y()<bly) bly=bl.Y();
177 if (ur.X()>urx) urx=ur.X();
178 if (ur.Y()>ury) ury=ur.Y();
180 TVector2 position ( (urx+blx)/2.,(ury+bly)/2. );
181 TVector2 dimensions( (urx-blx)/2.,(ury-bly)/2. );
183 gr->SetPadPosForReal(position,dimensions);
184 gr->SetColor((fZone->GetID()-1)*5+iSubZone+2);
185 DrawObject(subZone,option+1);
191 default: AppendPad(option);
196 //_______________________________________________________________________
197 void AliMpZonePainter::Paint(Option_t *option)
200 AliMpGraphContext *gr = AliMpGraphContext::Instance();
202 if (fZone->GetNofSubZones()<1) return;
204 gPad->Range(0.,0.,1.,1.);
206 Int_t col=gVirtualX->GetFillColor();
209 gVirtualX->SetFillColor(GetColor());
210 Float_t textSize = gVirtualX->GetTextSize();
211 for (Int_t iSubZone=0;iSubZone<fZone->GetNofSubZones();++iSubZone){
212 AliMpSubZone *subZone = fZone->GetSubZone(iSubZone);
213 for (Int_t iRowSeg=0;iRowSeg<subZone->GetNofRowSegments();++iRowSeg){
214 AliMpVRowSegment *rowSegment = subZone->GetRowSegment(iRowSeg);
216 gr->RealToPad(rowSegment->Position(),rowSegment->Dimensions(),
218 gPad->PaintBox(pos.X()-dim.X(),pos.Y()-dim.Y(),
219 pos.X()+dim.X(),pos.Y()+dim.Y());
221 gVirtualX->SetTextSize(15);
222 gPad->PaintText(pos.X()-0.01,pos.Y()-0.01,
223 Form("%d",fZone->GetID()));
227 gVirtualX->SetTextSize(textSize);
228 gVirtualX->SetFillColor(col);