3 // Authors: David Guez, IPN Orsay
9 #include "AliMpSectorPainter.h"
10 #include "AliMpGraphContext.h"
11 #include "AliMpSector.h"
12 #include "AliMpZone.h"
13 #include "AliMpSubZone.h"
15 #include "AliMpVRowSegment.h"
17 ClassImp(AliMpSectorPainter)
19 //_______________________________________________________________________
20 AliMpSectorPainter::AliMpSectorPainter()
24 // default dummy constructor
26 //_______________________________________________________________________
27 AliMpSectorPainter::AliMpSectorPainter(AliMpSector *sector)
35 //_____________________________________________________________________________
36 AliMpSectorPainter::AliMpSectorPainter(const AliMpSectorPainter& right)
37 : AliMpVPainter(right)
39 // copy constructor (not implemented)
41 Fatal("AliMpSectorPainter", "Copy constructor not provided.");
44 //_______________________________________________________________________
45 AliMpSectorPainter::~AliMpSectorPainter()
50 //_____________________________________________________________________________
52 AliMpSectorPainter::operator=(const AliMpSectorPainter& right)
54 // assignement operator (not implemented)
56 // check assignement to self
57 if (this == &right) return *this;
59 Fatal("operator =", "Assignement operator not provided.");
64 //_______________________________________________________________________
65 void AliMpSectorPainter::DumpObject()
67 // Draw the owned object
71 //_______________________________________________________________________
72 TVector2 AliMpSectorPainter::GetPosition() const
74 // Get the owned object's position
76 if (fSector->GetNofRows()<1) return TVector2(0.,0.);
77 AliMpRow* row = fSector->GetRow(0);
79 // bl = bottom left position;
80 TVector2 bl = row->Position()-row->Dimensions();
81 // ur = upper right position
82 TVector2 ur = row->Position()+row->Dimensions();;
84 for (Int_t irow=1;irow<fSector->GetNofRows();++irow){
85 row = fSector->GetRow(irow);
86 // update the bottom-left corner
87 if (bl.X()>row->Position().X()-row->Dimensions().X())
88 bl.Set(row->Position().X()-row->Position().X(),bl.Y());
89 if (bl.Y()>row->Position().Y()-row->Dimensions().Y())
90 bl.Set(bl.X(),row->Position().Y()-row->Dimensions().Y());
91 // update the upper-right corner
92 if (ur.X()<row->Position().X()+row->Dimensions().X())
93 ur.Set(row->Position().X()+row->Dimensions().X(),ur.Y());
94 if (ur.Y()<row->Position().Y()+row->Dimensions().Y())
95 ur.Set(ur.X(),row->Position().Y()+row->Dimensions().Y());
99 //_______________________________________________________________________
100 TVector2 AliMpSectorPainter::GetDimensions() const
102 // Get the owned object's dimensions
103 if (fSector->GetNofRows()<1) return TVector2(0.,0.);
104 AliMpRow* row = fSector->GetRow(0);
107 // bl = bottom left position
108 TVector2 bl = row->Position()-row->Dimensions();
109 // ur = upper right position
110 TVector2 ur = row->Position()+row->Dimensions();
112 for (Int_t irow=1;irow<fSector->GetNofRows();++irow){
113 row = fSector->GetRow(irow);
114 // update the bottom-left corner
115 if (bl.X()>row->Position().X()-row->Dimensions().X())
116 bl.Set(row->Position().X()-row->Dimensions().X(),bl.Y());
117 if (bl.Y()>row->Position().Y()-row->Dimensions().Y())
118 bl.Set(bl.X(),row->Position().Y()-row->Dimensions().Y());
119 // update the upper-right corner
120 if (ur.X()<row->Position().X()+row->Dimensions().X())
121 ur.Set(row->Position().X()+row->Dimensions().X(),ur.Y());
122 if (ur.Y()<row->Position().Y()+row->Dimensions().Y())
123 ur.Set(ur.X(),row->Position().Y()+row->Dimensions().Y());
128 //_______________________________________________________________________
129 void AliMpSectorPainter::Draw(Option_t *option)
131 // Draw the sector on the current pad
132 // The first letter of <option> is treated as follows:
133 // case "Z" : each zones are drawn separately
134 // case "R" : each rows are drawn separately
135 // case "" : the whole sector is drawn at once
136 // in both cases, the rest of the option is passed
137 // as argument to the Draw function of respectively
138 // zone or row objects.
141 AliMpGraphContext *gr = AliMpGraphContext::Instance();
142 if (!fSector) return;
149 for (Int_t iZone=1;iZone<=fSector->GetNofZones();++iZone){
150 AliMpZone *zone = fSector->GetZone(iZone);
153 Double_t blx= 9999, bly= 9999;
154 Double_t urx= -9999, ury= -9999;
156 for (Int_t iSubZone=0;iSubZone<zone->GetNofSubZones();++iSubZone){
157 AliMpSubZone *subZone = zone->GetSubZone(iSubZone);
158 for (Int_t iRowSeg=0;iRowSeg<subZone->GetNofRowSegments();++iRowSeg){
159 AliMpVRowSegment *rowSegment = subZone->GetRowSegment(iRowSeg);
161 TVector2 bl = rowSegment->Position()-rowSegment->Dimensions();
162 TVector2 ur = rowSegment->Position()+rowSegment->Dimensions();
164 if (bl.X()<blx) blx=bl.X();
165 if (bl.Y()<bly) bly=bl.Y();
166 if (ur.X()>urx) urx=ur.X();
167 if (ur.Y()>ury) ury=ur.Y();
170 TVector2 position ( (urx+blx)/2.,(ury+bly)/2. );
171 TVector2 dimensions( (urx-blx)/2.,(ury-bly)/2. );
173 gr->SetPadPosForReal(position,dimensions);
174 gr->SetColor(iZone+3);
175 DrawObject(zone,option+1);
183 for (Int_t iRow=0;iRow<fSector->GetNofRows();++iRow){
184 AliMpRow *row = fSector->GetRow(iRow);
186 gr->SetPadPosForReal(row->Position(),row->Dimensions());
187 DrawObject(row,option+1);
192 default: AppendPad(option);
199 //_______________________________________________________________________
200 void AliMpSectorPainter::Paint(Option_t* /*option*/)
203 AliMpGraphContext *gr = AliMpGraphContext::Instance();
204 if (!fSector) return;
205 if (fSector->GetNofRows()<1) return;
206 Int_t col=gVirtualX->GetFillColor();
209 gPad->Range(0.,0.,1.,1.);
215 for (iRow=0;iRow<fSector->GetNofRows();++iRow){
216 AliMpRow *row = fSector->GetRow(iRow);
218 gr->RealToPad(row->Position(),row->Dimensions(),pos,dim);
219 gPad->PaintBox(pos.X()-dim.X(),pos.Y()-dim.Y(),
220 pos.X()+dim.X(),pos.Y()+dim.Y());
221 gPad->PaintLine(pos.X()-dim.X(),pos.Y()-dim.Y(),
222 pos.X()-dim.X(),pos.Y()+dim.Y());
223 gPad->PaintLine(pos.X()+dim.X(),pos.Y()-dim.Y(),
224 pos.X()+dim.X(),pos.Y()+dim.Y());
227 gPad->DrawLine(pos.X()-dim.X(),pos.Y()-dim.Y(),lx1,pos.Y()-dim.Y());
228 gPad->DrawLine(pos.X()+dim.X(),pos.Y()-dim.Y(),lx2,pos.Y()-dim.Y());
234 // now we draw the lower and upper horizontal lines
236 AliMpRow *row = fSector->GetRow(0);
238 gr->RealToPad(row->Position(),row->Dimensions(),pos,dim);
239 gPad->DrawLine(pos.X()-dim.X(),pos.Y()-dim.Y(),
240 pos.X()+dim.X(),pos.Y()-dim.Y());
242 row = fSector->GetRow(fSector->GetNofRows()-1);
243 gr->RealToPad(row->Position(),row->Dimensions(),pos,dim);
244 gPad->DrawLine(pos.X()-dim.X(),pos.Y()+dim.Y(),
245 pos.X()+dim.X(),pos.Y()+dim.Y());
248 gVirtualX->SetFillColor(col);