]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/mapping/AliMpMotifPainter.cxx
Adding the option to draw a bold line to sketch the outline of the motif (Laurent)
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpMotifPainter.cxx
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 // $MpId: AliMpMotifPainter.cxx,v 1.9 2006/05/24 13:58:32 ivana Exp $
18 // Category: graphics
19 //
20 // Class AliMpMotifPainter
21 // -----------------------
22 // Class for drawing a motif into canvas
23 // Included in AliRoot: 2003/05/02
24 // Authors: David Guez, IPN Orsay
25
26 #include "AliMpMotifPainter.h"
27 #include "AliMpGraphContext.h"
28 #include "AliMpMotifPosition.h"
29 #include "AliMpMotifType.h"
30 #include "AliMpMotif.h"
31 #include "AliMpConnection.h"
32 #include "AliMpIntPair.h"
33 #include "AliLog.h"
34
35 #include <TVirtualX.h>
36 #include <TPad.h>
37  
38 /// \cond CLASSIMP
39 ClassImp(AliMpMotifPainter)
40 /// \endcond
41
42 //_______________________________________________________________________
43 AliMpMotifPainter::AliMpMotifPainter()
44   : AliMpVPainter(),
45     fMotifPos(0)
46 {
47   /// Default constructor
48 }
49
50 //_______________________________________________________________________
51 AliMpMotifPainter::AliMpMotifPainter(AliMpMotifPosition *motifPos)
52   : AliMpVPainter(),
53     fMotifPos(motifPos)
54 {
55   /// Standard constructor 
56       AliDebug(1,"Default ctor");
57 }
58
59 //_______________________________________________________________________
60 AliMpMotifPainter::AliMpMotifPainter(AliMpMotifType* motifType)
61 : AliMpVPainter(),
62 fMotifPos(0x0)
63 {
64   /// Constructor from a motif Type. We hereby create a MotifPosition
65   /// object from it, using arbitrary pad sizes, as this is just a way
66   /// to visualize the *shape* of the motif.
67   
68   AliDebug(1,"Ctor from motifType");
69   
70   const Double_t kdx = 5;
71   const Double_t kdy = 5; // cm but arbitrary anyway
72   
73   AliMpVMotif* motif = new AliMpMotif(motifType->GetID(),
74                                       motifType,
75                                       TVector2(kdx,kdy));
76
77   fMotifPos = new AliMpMotifPosition(-1,motif,motif->Dimensions());
78 }
79
80 //_______________________________________________________________________
81 AliMpMotifPainter::~AliMpMotifPainter()
82 {
83   /// Default constructor
84 }
85
86 //_______________________________________________________________________
87 void AliMpMotifPainter::DumpObject()
88 {
89 /// Dump the owned object
90
91   fMotifPos->Dump();
92 }
93
94 //_______________________________________________________________________
95 TVector2 AliMpMotifPainter::GetPosition() const
96 {
97 /// Get the owned object's position
98
99   return fMotifPos->Position();
100 }
101
102 //_______________________________________________________________________
103 TVector2 AliMpMotifPainter::GetDimensions() const
104 {
105 /// Get the owned object's dimensions
106
107   return fMotifPos->Dimensions();
108 }
109
110 //_______________________________________________________________________
111 void AliMpMotifPainter::Paint(Option_t *option)
112 {
113 /// Paint the object
114
115   AliMpGraphContext *gr = AliMpGraphContext::Instance();
116   if (!fMotifPos) return;
117   Int_t col=gVirtualX->GetFillColor();
118   gr->Push();
119   gPad->Range(0.,0.,1.,1.);
120   InitGraphContext();
121
122   gVirtualX->SetLineWidth(1);
123   
124   switch (option[0]){
125     case 'T':
126     case 'I':
127     case 'X':
128     {
129       PaintWholeBox();
130       Float_t textSize =   gVirtualX->GetTextSize();
131       gVirtualX->SetTextSize(10);
132       TString str;
133       switch (option[0]) {
134         case 'T' : 
135           str = Form("%d",fMotifPos->GetID());
136           break;
137         case 'I':{
138           switch (option[1]){
139             case '+' :
140               str = Form("(%d,%d)",fMotifPos->GetHighIndicesLimit().GetFirst(),
141                          fMotifPos->GetHighIndicesLimit().GetSecond());
142               break;
143             default:
144               str = Form("(%d,%d)",fMotifPos->GetLowIndicesLimit().GetFirst(),
145                          fMotifPos->GetLowIndicesLimit().GetSecond());
146           }
147         }
148           break;
149         case 'X' :
150           str = Form("(%f,%f)",(GetPosition()-GetDimensions()).X(),
151                      (GetPosition()-GetDimensions()).Y());
152           break;
153       }
154       gPad->PaintText(GetPadPosition().X()-0.01,GetPadPosition().Y()-0.01,str);
155       
156       gVirtualX->SetTextSize(textSize);
157     }
158       break;
159     case 'P':
160     case 'Z':
161     {
162       //PaintWholeBox(kFALSE);
163       AliMpMotifType *motifType = fMotifPos->GetMotif()->GetMotifType();
164 //      StdoutToAliDebug(1,motifType->Print("G"););
165       for (Int_t j=motifType->GetNofPadsY()-1;j>=0;j--){
166         for (Int_t i=0;i<motifType->GetNofPadsX();i++){
167           AliMpIntPair indices(i,j);
168           AliMpConnection* connect = 
169             motifType->FindConnectionByLocalIndices(indices);
170           if (connect){
171             TVector2 realPadPos = 
172             GetPosition()+fMotifPos->GetMotif()->PadPositionLocal(indices);
173             TVector2 padPadPos,padPadDim;
174             gr->RealToPad(realPadPos,
175                           fMotifPos->GetMotif()->GetPadDimensions(indices),
176                           padPadPos,padPadDim);
177             TVector2 bl = padPadPos - padPadDim;
178             TVector2 ur = padPadPos + padPadDim;
179             
180             
181             Style_t sty = gVirtualX->GetFillStyle();
182             gVirtualX->SetFillStyle(1);
183             gPad->PaintBox(bl.X(),bl.Y(),ur.X(),ur.Y());
184             gVirtualX->SetFillStyle(0);
185             gPad->PaintBox(bl.X(),bl.Y(),ur.X(),ur.Y());
186             gVirtualX->SetFillStyle(sty);
187             if (option[1]=='T'){
188               Float_t textSize =   gVirtualX->GetTextSize();
189               gVirtualX->SetTextSize(10);
190               gVirtualX->SetTextAlign(22);
191               //                 gPad->PaintText(padPadPos.X()-0.01,padPadPos.Y()-0.01,
192               gPad->PaintText((bl.X()+ur.X())/2.0,(bl.Y()+ur.Y())/2.0,
193                               Form("%d",connect->GetGassiNum()));
194               
195               gVirtualX->SetTextSize(textSize);
196                  }
197             }
198           }
199       }
200       if ( option[0]=='Z' )
201       {
202         PaintContour(option,kFALSE);
203       }
204     }
205       break;
206       
207     case 'C':
208       PaintContour(option,kTRUE);
209       break;
210       
211     default:
212       PaintWholeBox(kFALSE);
213   }
214   gr->Pop();
215   gVirtualX->SetFillColor(col);
216 }
217
218 //_______________________________________________________________________
219 void AliMpMotifPainter::PaintContour(Option_t* option, Bool_t fill)
220 {
221   AliMpGraphContext *gr = AliMpGraphContext::Instance();
222   
223   // drawing real motif (not envelop) the real contour
224   Float_t xl = 0;
225   Float_t yl = 0;
226   Int_t manuId = 0;
227   TVector2 bl0 = TVector2(999, 999);
228   TVector2 ur0 = TVector2(0,0); 
229   TVector2 padPadPos,padPadDim;
230   
231   AliMpMotifType *motifType = fMotifPos->GetMotif()->GetMotifType();
232   manuId = fMotifPos->GetID();
233   
234   if ( fill )
235   {
236     if (manuId % 5 == 0) 
237       gVirtualX->SetFillColor(0);
238     if (manuId % 5 == 1) 
239       gVirtualX->SetFillColor(38);
240     if (manuId % 5 == 2) 
241       gVirtualX->SetFillColor(33);
242     if (manuId % 5 == 3) 
243       gVirtualX->SetFillColor(16);
244     if (manuId % 5 == 4) 
245       gVirtualX->SetFillColor(44);
246   }
247   
248   Width_t lineW = gPad->GetLineWidth();
249   Width_t lw = lineW*4;
250   Double_t xlw = gPad->AbsPixeltoX(lw/2);
251   
252   gVirtualX->SetLineWidth(lw);
253     
254     for (Int_t i = 0; i < motifType->GetNofPadsX(); i++){
255       
256       for (Int_t j = 0; j < motifType->GetNofPadsY(); j++){
257         
258         AliMpIntPair indices = AliMpIntPair(i,j);
259         AliMpConnection* connect =  motifType->FindConnectionByLocalIndices(indices);
260         if (connect){
261           TVector2 realPadPos = 
262           GetPosition()+fMotifPos->GetMotif()->PadPositionLocal(indices);
263           gr->RealToPad(realPadPos, fMotifPos->GetMotif()->GetPadDimensions(indices),
264                         padPadPos, padPadDim);
265           
266           TVector2 bl = padPadPos - padPadDim;
267           TVector2 ur = padPadPos + padPadDim;
268           if (bl0.X() > bl.X())
269             bl0 = bl;
270           
271           if (ur0.Y() < ur.Y())
272             ur0 = ur;
273           
274           
275           if ( fill )
276           {
277             Style_t sty = gVirtualX->GetFillStyle();
278             gVirtualX->SetFillStyle(1);
279             gPad->PaintBox(bl.X(),bl.Y(),ur.X(),ur.Y());
280             gVirtualX->SetFillStyle(0);
281             gVirtualX->SetFillStyle(sty);
282           }
283           
284           if (!motifType->FindConnectionByLocalIndices(AliMpIntPair(i,j-1)))
285           {
286             gPad->PaintLine(bl.X()-xlw, bl.Y(), bl.X()+ padPadDim.X()*2 + xlw, bl.Y());
287           }
288           
289           if (!motifType->FindConnectionByLocalIndices(AliMpIntPair(i,j+1)))
290           {
291             gPad->PaintLine(bl.X()-xlw, bl.Y() + padPadDim.Y()*2, bl.X()+ padPadDim.X()*2+xlw, bl.Y() +  padPadDim.Y()*2);
292           }
293           
294           if (!motifType->FindConnectionByLocalIndices(AliMpIntPair(i-1,j)))
295           {
296             gPad->PaintLine(bl.X(), bl.Y(), bl.X(), bl.Y()+ padPadDim.Y()*2);                  
297           }          
298
299           if (!motifType->FindConnectionByLocalIndices(AliMpIntPair(i+1,j)))
300           {
301             gPad->PaintLine(bl.X()+padPadDim.X()*2, bl.Y(), bl.X()+padPadDim.X()*2, bl.Y()+ padPadDim.Y()*2);                  
302           }          
303           
304         }
305       }
306     }
307     
308     switch (option[1]) {
309       // add manudId indexes
310       case 'I' :
311         xl = bl0.X()+ padPadDim.X()/2.;
312         
313         yl = bl0.Y() + 1.5*padPadDim.Y();
314         
315         Float_t textSize =   gVirtualX->GetTextSize();
316         gVirtualX->SetTextSize(12);
317         gVirtualX->SetTextAlign(13);
318         gVirtualX->SetTextAngle(90.);
319         
320         gPad->PaintText(xl, yl, Form("%d", manuId));
321         
322         gVirtualX->SetTextAngle(0.);
323         gVirtualX->SetTextSize(textSize);
324         break;
325     }
326
327     gVirtualX->SetLineWidth(lineW);
328
329 }