3 // Authors: David Guez, IPN Orsay
8 #include "AliMpSectorPainter.h"
9 #include "AliMpGraphContext.h"
10 #include "AliMpSector.h"
11 #include "AliMpZone.h"
12 #include "AliMpSubZone.h"
14 #include "AliMpVRowSegment.h"
16 ClassImp(AliMpSectorPainter)
18 //_______________________________________________________________________
19 AliMpSectorPainter::AliMpSectorPainter()
23 // default dummy constructor
25 //_______________________________________________________________________
26 AliMpSectorPainter::AliMpSectorPainter(AliMpSector *sector)
33 //_______________________________________________________________________
34 AliMpSectorPainter::~AliMpSectorPainter()
38 //_______________________________________________________________________
39 void AliMpSectorPainter::DumpObject()
41 // Draw the owned object
45 //_______________________________________________________________________
46 TVector2 AliMpSectorPainter::GetPosition() const
48 // Get the owned object's position
50 if (fSector->GetNofRows()<1) return TVector2(0.,0.);
51 AliMpRow* row = fSector->GetRow(0);
53 // bl = bottom left position;
54 TVector2 bl = row->Position()-row->Dimensions();
55 // ur = upper right position
56 TVector2 ur = row->Position()+row->Dimensions();;
58 for (Int_t irow=1;irow<fSector->GetNofRows();++irow){
59 row = fSector->GetRow(irow);
60 // update the bottom-left corner
61 if (bl.X()>row->Position().X()-row->Dimensions().X())
62 bl.Set(row->Position().X()-row->Position().X(),bl.Y());
63 if (bl.Y()>row->Position().Y()-row->Dimensions().Y())
64 bl.Set(bl.X(),row->Position().Y()-row->Dimensions().Y());
65 // update the upper-right corner
66 if (ur.X()<row->Position().X()+row->Dimensions().X())
67 ur.Set(row->Position().X()+row->Dimensions().X(),ur.Y());
68 if (ur.Y()<row->Position().Y()+row->Dimensions().Y())
69 ur.Set(ur.X(),row->Position().Y()+row->Dimensions().Y());
73 //_______________________________________________________________________
74 TVector2 AliMpSectorPainter::GetDimensions() const
76 // Get the owned object's dimensions
77 if (fSector->GetNofRows()<1) return TVector2(0.,0.);
78 AliMpRow* row = fSector->GetRow(0);
81 // bl = bottom left position
82 TVector2 bl = row->Position()-row->Dimensions();
83 // ur = upper right position
84 TVector2 ur = row->Position()+row->Dimensions();
86 for (Int_t irow=1;irow<fSector->GetNofRows();++irow){
87 row = fSector->GetRow(irow);
88 // update the bottom-left corner
89 if (bl.X()>row->Position().X()-row->Dimensions().X())
90 bl.Set(row->Position().X()-row->Dimensions().X(),bl.Y());
91 if (bl.Y()>row->Position().Y()-row->Dimensions().Y())
92 bl.Set(bl.X(),row->Position().Y()-row->Dimensions().Y());
93 // update the upper-right corner
94 if (ur.X()<row->Position().X()+row->Dimensions().X())
95 ur.Set(row->Position().X()+row->Dimensions().X(),ur.Y());
96 if (ur.Y()<row->Position().Y()+row->Dimensions().Y())
97 ur.Set(ur.X(),row->Position().Y()+row->Dimensions().Y());
102 //_______________________________________________________________________
103 void AliMpSectorPainter::Draw(Option_t *option)
105 // Draw the sector on the current pad
106 // The first letter of <option> is treated as follows:
107 // case "Z" : each zones are drawn separately
108 // case "R" : each rows are drawn separately
109 // case "" : the whole sector is drawn at once
110 // in both cases, the rest of the option is passed
111 // as argument to the Draw function of respectively
112 // zone or row objects.
115 AliMpGraphContext *gr = AliMpGraphContext::Instance();
116 if (!fSector) return;
123 for (Int_t iZone=1;iZone<=fSector->GetNofZones();++iZone){
124 AliMpZone *zone = fSector->GetZone(iZone);
127 Double_t blx= 9999, bly= 9999;
128 Double_t urx= -9999, ury= -9999;
130 for (Int_t iSubZone=0;iSubZone<zone->GetNofSubZones();++iSubZone){
131 AliMpSubZone *subZone = zone->GetSubZone(iSubZone);
132 for (Int_t iRowSeg=0;iRowSeg<subZone->GetNofRowSegments();++iRowSeg){
133 AliMpVRowSegment *rowSegment = subZone->GetRowSegment(iRowSeg);
135 TVector2 bl = rowSegment->Position()-rowSegment->Dimensions();
136 TVector2 ur = rowSegment->Position()+rowSegment->Dimensions();
138 if (bl.X()<blx) blx=bl.X();
139 if (bl.Y()<bly) bly=bl.Y();
140 if (ur.X()>urx) urx=ur.X();
141 if (ur.Y()>ury) ury=ur.Y();
144 TVector2 position ( (urx+blx)/2.,(ury+bly)/2. );
145 TVector2 dimensions( (urx-blx)/2.,(ury-bly)/2. );
147 gr->SetPadPosForReal(position,dimensions);
148 gr->SetColor(iZone+3);
149 DrawObject(zone,option+1);
157 for (Int_t iRow=0;iRow<fSector->GetNofRows();++iRow){
158 AliMpRow *row = fSector->GetRow(iRow);
160 gr->SetPadPosForReal(row->Position(),row->Dimensions());
161 DrawObject(row,option+1);
166 default: AppendPad(option);
173 //_______________________________________________________________________
174 void AliMpSectorPainter::Paint(Option_t* /*option*/)
177 AliMpGraphContext *gr = AliMpGraphContext::Instance();
178 if (!fSector) return;
179 if (fSector->GetNofRows()<1) return;
180 Int_t col=gVirtualX->GetFillColor();
183 gPad->Range(0.,0.,1.,1.);
189 for (iRow=0;iRow<fSector->GetNofRows();++iRow){
190 AliMpRow *row = fSector->GetRow(iRow);
192 gr->RealToPad(row->Position(),row->Dimensions(),pos,dim);
193 gPad->PaintBox(pos.X()-dim.X(),pos.Y()-dim.Y(),
194 pos.X()+dim.X(),pos.Y()+dim.Y());
195 gPad->PaintLine(pos.X()-dim.X(),pos.Y()-dim.Y(),
196 pos.X()-dim.X(),pos.Y()+dim.Y());
197 gPad->PaintLine(pos.X()+dim.X(),pos.Y()-dim.Y(),
198 pos.X()+dim.X(),pos.Y()+dim.Y());
201 gPad->DrawLine(pos.X()-dim.X(),pos.Y()-dim.Y(),lx1,pos.Y()-dim.Y());
202 gPad->DrawLine(pos.X()+dim.X(),pos.Y()-dim.Y(),lx2,pos.Y()-dim.Y());
208 // now we draw the lower and upper horizontal lines
210 AliMpRow *row = fSector->GetRow(0);
212 gr->RealToPad(row->Position(),row->Dimensions(),pos,dim);
213 gPad->DrawLine(pos.X()-dim.X(),pos.Y()-dim.Y(),
214 pos.X()+dim.X(),pos.Y()-dim.Y());
216 row = fSector->GetRow(fSector->GetNofRows()-1);
217 gr->RealToPad(row->Position(),row->Dimensions(),pos,dim);
218 gPad->DrawLine(pos.X()-dim.X(),pos.Y()+dim.Y(),
219 pos.X()+dim.X(),pos.Y()+dim.Y());
222 gVirtualX->SetFillColor(col);