ROOT logo
#ifndef ALIMUONVPAINTER_H
#define ALIMUONVPAINTER_H

/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
* See cxx source for full Copyright notice                               */

// $Id$

/// \ingroup graphics
/// \class AliMUONVPainter
/// \brief Base class for a graphical object representing some part of the
/// MUON tracking system
/// 
// Author Laurent Aphecetche, Subatech

#ifndef ALIMUONATTPAINTER_H
#  include "AliMUONAttPainter.h"
#endif
#ifndef ROOT_TQObject
#  include <TQObject.h>
#endif
#ifndef ROOT_TString
#  include "TString.h"
#endif
#ifndef ROOT_TObject
#  include "TObject.h"
#endif
#ifndef AL_MP_AREA_H
#  include "AliMpArea.h"
#endif
#include <float.h>

class AliMUONContour;
class AliMUONPainterGroup;
class AliMUONVTrackerData;
class AliMpArea;
class TCollection;
class TH1;
class TList;
class TMap;
class TObjArray;
class TVirtualPad;

class AliMUONVPainter : public TObject, public TQObject
{
public:  

  AliMUONVPainter(TRootIOCtor*);
  AliMUONVPainter(const char* type="");
  AliMUONVPainter(const AliMUONVPainter& rhs);
  AliMUONVPainter& operator=(const AliMUONVPainter& rhs);
  virtual ~AliMUONVPainter();

  /// Add a painter to our list of children. We adopt this painter (i.e. we become owner).
  void Add(AliMUONVPainter* painter);
  
  /// Return the area containing this painter
  AliMpArea Area() const;
  
  virtual void SetAttributes(const AliMUONAttPainter& attributes);
  
  /// Convert attributes so they are valid ones for us.
  virtual AliMUONAttPainter Validate(const AliMUONAttPainter& attributes) const { return attributes; }
  
  /// Get our attributes
  const AliMUONAttPainter& Attributes() const { return fAttributes; }
  
  virtual void ComputeDataRange(const AliMUONVTrackerData& data, Int_t dataIndex, 
                                Double_t& dataMin, Double_t& dataMax) const;
  
  virtual void Copy(TObject& object) const;
  
  AliMUONVPainter* Detach() const;
  
  /// Whether this painter can be detached from the current view.
  virtual Bool_t CanBeDetached() const { return kTRUE; }
  
  /// Whether we are valid or not
  virtual Bool_t IsValid() const { return fIsValid; }
  
  /// Mark us as not valid
  void Invalidate() { fIsValid = kFALSE; }
  
  Int_t Depth() const;
  
  virtual Int_t	DistancetoPrimitive(Int_t px, Int_t py);
  
  virtual void Draw(Option_t* opt="");
  
  virtual void ExecuteEvent(Int_t event, Int_t px, Int_t py);
  
  /// Return the contour representing the outline of this object
  AliMUONContour* Contour() const { return fContour; }

  /// Get our name
  virtual const char* GetName() const { return Name().Data(); }
  
  /// Get our name
  virtual TString Name() const { return fName; }
  
  /// Get our path name (aka fullname)
  virtual TString PathName() const { return fPathName; }
  
  virtual TString ContourName() const;

  virtual char*	GetObjectInfo(Int_t px, Int_t py) const;
  
  void GetTypes(TObjArray& types) const;

  /// Return our mother group
  AliMUONPainterGroup* MotherGroup() const { return fGroup; }
  
  /// Return specific name at a given position, if needed.
  virtual TString NameAtPosition(Double_t /*x*/, Double_t /*y*/) const { return GetName(); }
  
  AliMUONPainterGroup* Group(const char* type) const;
  
  AliMUONPainterGroup* Group(Int_t depth) const;
  
  /// Whether we handle mouse motion or not
  virtual Bool_t HandleMouseMotion() const { return kFALSE; }
  
  Bool_t IsResponder() const;
  
  Bool_t IsInside(Double_t x, Double_t y) const;

  /// Return our mother (0 if we're the top node)
  AliMUONVPainter* Mother() const { return fMother; }

  virtual void Paint(Option_t* opt="");

  virtual void Print(Option_t* opt="") const;

  /// Return the plotter group
  AliMUONPainterGroup* PlotterGroup() const { return fPlotterGroup; }
  
  /// Return the responder group
  AliMUONPainterGroup* ResponderGroup() const { return fResponderGroup; }

  /// Set out contour
  void SetContour(AliMUONContour* contour);
  
  void SetData(const char* pattern, AliMUONVTrackerData* data, Int_t dataIndex);

  void SetLine(Int_t depth, Int_t lineColor, Int_t lineWidth);
  
  /// Set our mother group
  void SetMotherGroup(AliMUONPainterGroup* group) { fGroup = group; }
  
  void SetMother(AliMUONVPainter* painter);
  
  void SetOutlined(const char* pattern, Bool_t flag);
  
  virtual void SetResponder(const char* pattern);
  
  virtual void SetResponder(Int_t depth);
  
  void SetVisible(const char* pattern, Bool_t flag);
  
  /// Return our type (e.g. PCB, Chamber, DE, MANU, etc...)
  const char* Type() const { return fType.Data(); }

  // SIGNALS
  
  void Clicked(AliMUONVPainter* painter, Double_t* pos); // *SIGNAL*

  void ShiftClicked(AliMUONVPainter* painter, Double_t* pos); // *SIGNAL*

  void DoubleClicked(AliMUONVPainter* painter, Double_t* pos); // *SIGNAL*
    
  static void PixelToPad(Int_t px, Int_t py, Double_t& x, Double_t& y);

  virtual void PaintOutline(Int_t color=-1, Int_t width=-1, Double_t x=FLT_MAX, Double_t y=FLT_MAX);

  virtual void PaintArea(Int_t fillColor);
  
  virtual void PaintArea(const AliMUONVTrackerData& data, Int_t dataIndex,
                         Double_t min, Double_t max);
    
  /// Get the pad in which we are plotted
  TVirtualPad* Pad() const { return fPad; }
  
  /// Get our line color
  Int_t GetLineColor() const { return fLineColor; }
  
  /// Get our line width
  Int_t GetLineWidth() const { return fLineWidth; }
  
  /// Set our line color
  void SetLineColor(Int_t lineColor) { fLineColor = lineColor; }
  
  /// Set our line width
  void SetLineWidth(Int_t lineWidth) { fLineWidth = lineWidth; }
  
  /// Set our name
  void SetName(const char* name) { fName = name; }
  
  /// Set our path name (aka fullname)
  void SetPathName(const char* pathName) { fPathName = pathName; }
  
  static AliMUONVPainter* CreatePainter(const char* className, 
                                        const AliMUONAttPainter& att,
                                        Int_t id1, Int_t id2);
    
  /// Get our first ID
  Int_t ID0() const { return fID[0]; }
  /// Get our second ID
  Int_t ID1() const { return fID[1]; }
  
  /// Set our IDs
  void SetID(Int_t id0, Int_t id1) { fID[0] = id0; fID[1] = id1; }
  
  virtual TString Describe(const AliMUONVTrackerData& data, Int_t dataIndex,
                           Double_t x=FLT_MAX, Double_t y=FLT_MAX);

  void UpdateGroupsFrom(const AliMUONVPainter& painter);

  AliMUONVPainter* Master() const;
  
  virtual void DrawHistogram(Double_t* values=0x0) const;

  /// To avoid getting a popup asking for the parameter in the GUI...
  void DrawHistogram0() const { DrawHistogram(0x0); }
  /// To avoid getting a popup asking for the parameter in the GUI...
  void DrawHistogramClone0() const { DrawHistogramClone(0x0); }

  virtual void DrawHistogramClone(Double_t* values=0x0) const;
  
  virtual void DrawInternalHistogram(Int_t dim) const;

  virtual void DrawInternalHistogramClone(Int_t dim) const;

  /// Append (i.e. don't have the right to clear the array !) our list of manus to manuList
  virtual void FillManuList(TObjArray& manuList) const;
  
  /// following kind of stupid lines (SL), because I don't know how to
  /// pass parameters to TClassMenuItem for context menu (don't even
  /// know if that's possible at all)
  /// SL
  void DrawInternalHistogramClone0() { DrawInternalHistogramClone(0); }
  /// SL
  void DrawInternalHistogramClone1() { DrawInternalHistogramClone(1); }
  /// SL
  void DrawInternalHistogramClone2() { DrawInternalHistogramClone(2); }
  /// SL
  void DrawInternalHistogramClone3() { DrawInternalHistogramClone(3); }
  /// SL
  void DrawInternalHistogramClone4() { DrawInternalHistogramClone(4); }
  /// SL
  void DrawInternalHistogramClone5() { DrawInternalHistogramClone(5); }
  /// SL
  void DrawInternalHistogramClone6() { DrawInternalHistogramClone(6); }
  /// SL
  void DrawInternalHistogramClone7() { DrawInternalHistogramClone(7); }
  /// SL
  void DrawInternalHistogramClone8() { DrawInternalHistogramClone(8); }
  /// SL
  void DrawInternalHistogramClone9() { DrawInternalHistogramClone(9); }
  
  /// Whether or not the part of the detector represented by this painter should be included in readout.
  virtual Bool_t IsIncluded() const = 0;
  
  /// Whether or not the part of the detector represented by this painter should be excluded from readout.
  Bool_t IsExcluded() const { return ! IsIncluded(); }

  virtual void Include();
  
  virtual void Exclude();

protected:
    
  virtual TCollection* Children() const;

  void CreateGroups();

  AliMUONVTrackerData* InteractiveReadOutConfig() const;
  
  mutable TH1* fHistogram; //!< histogram
  
  TMap* fPainterGroups; ///< map of groups
  AliMUONPainterGroup* fResponderGroup; ///< the responder group

private:
  
  void FlatList(TList& list);

  AliMUONPainterGroup* CreateGroup(const char* type, Int_t depth);
  
  void GetBoundingBox(Double_t& x1, Double_t& y1, 
                      Double_t& x2, Double_t& y2) const;
  
  AliMUONVPainter* GetPainter(Int_t px, Int_t py, Double_t& x, Double_t& y) const;
  
  void WriteIROC(Double_t value);
  
  void GetIROCManuList(TObjArray& manuList);

  TString fName; ///< our (short) name
  TString fPathName; ///< our long name
  TString fType; ///< our type (DE, Chamber, MANU, etc...)
  AliMUONVPainter* fMother;  ///< our mother
  AliMUONPainterGroup* fGroup; ///< our group
  AliMUONContour* fContour;  ///< our contour
  TObjArray* fChildren; ///< our children
  AliMUONPainterGroup* fPlotterGroup; ///< the plotter group
  Double_t fBorderFactor; ///< border factor for visu 
  TVirtualPad* fPad; ///< the pad we're drawn in
  AliMUONAttPainter fAttributes; ///< our attributes (e.g. view type)
  Int_t fLineColor; ///< our outline color
  Int_t fLineWidth; ///< our outline width
  Int_t fID[2]; ///< our ids
  Bool_t fIsValid; ///< whether we were properly initialized
  
  ClassDef(AliMUONVPainter,3) // Base class of a graphical object for MUON spectrometer
};

#endif
 AliMUONVPainter.h:1
 AliMUONVPainter.h:2
 AliMUONVPainter.h:3
 AliMUONVPainter.h:4
 AliMUONVPainter.h:5
 AliMUONVPainter.h:6
 AliMUONVPainter.h:7
 AliMUONVPainter.h:8
 AliMUONVPainter.h:9
 AliMUONVPainter.h:10
 AliMUONVPainter.h:11
 AliMUONVPainter.h:12
 AliMUONVPainter.h:13
 AliMUONVPainter.h:14
 AliMUONVPainter.h:15
 AliMUONVPainter.h:16
 AliMUONVPainter.h:17
 AliMUONVPainter.h:18
 AliMUONVPainter.h:19
 AliMUONVPainter.h:20
 AliMUONVPainter.h:21
 AliMUONVPainter.h:22
 AliMUONVPainter.h:23
 AliMUONVPainter.h:24
 AliMUONVPainter.h:25
 AliMUONVPainter.h:26
 AliMUONVPainter.h:27
 AliMUONVPainter.h:28
 AliMUONVPainter.h:29
 AliMUONVPainter.h:30
 AliMUONVPainter.h:31
 AliMUONVPainter.h:32
 AliMUONVPainter.h:33
 AliMUONVPainter.h:34
 AliMUONVPainter.h:35
 AliMUONVPainter.h:36
 AliMUONVPainter.h:37
 AliMUONVPainter.h:38
 AliMUONVPainter.h:39
 AliMUONVPainter.h:40
 AliMUONVPainter.h:41
 AliMUONVPainter.h:42
 AliMUONVPainter.h:43
 AliMUONVPainter.h:44
 AliMUONVPainter.h:45
 AliMUONVPainter.h:46
 AliMUONVPainter.h:47
 AliMUONVPainter.h:48
 AliMUONVPainter.h:49
 AliMUONVPainter.h:50
 AliMUONVPainter.h:51
 AliMUONVPainter.h:52
 AliMUONVPainter.h:53
 AliMUONVPainter.h:54
 AliMUONVPainter.h:55
 AliMUONVPainter.h:56
 AliMUONVPainter.h:57
 AliMUONVPainter.h:58
 AliMUONVPainter.h:59
 AliMUONVPainter.h:60
 AliMUONVPainter.h:61
 AliMUONVPainter.h:62
 AliMUONVPainter.h:63
 AliMUONVPainter.h:64
 AliMUONVPainter.h:65
 AliMUONVPainter.h:66
 AliMUONVPainter.h:67
 AliMUONVPainter.h:68
 AliMUONVPainter.h:69
 AliMUONVPainter.h:70
 AliMUONVPainter.h:71
 AliMUONVPainter.h:72
 AliMUONVPainter.h:73
 AliMUONVPainter.h:74
 AliMUONVPainter.h:75
 AliMUONVPainter.h:76
 AliMUONVPainter.h:77
 AliMUONVPainter.h:78
 AliMUONVPainter.h:79
 AliMUONVPainter.h:80
 AliMUONVPainter.h:81
 AliMUONVPainter.h:82
 AliMUONVPainter.h:83
 AliMUONVPainter.h:84
 AliMUONVPainter.h:85
 AliMUONVPainter.h:86
 AliMUONVPainter.h:87
 AliMUONVPainter.h:88
 AliMUONVPainter.h:89
 AliMUONVPainter.h:90
 AliMUONVPainter.h:91
 AliMUONVPainter.h:92
 AliMUONVPainter.h:93
 AliMUONVPainter.h:94
 AliMUONVPainter.h:95
 AliMUONVPainter.h:96
 AliMUONVPainter.h:97
 AliMUONVPainter.h:98
 AliMUONVPainter.h:99
 AliMUONVPainter.h:100
 AliMUONVPainter.h:101
 AliMUONVPainter.h:102
 AliMUONVPainter.h:103
 AliMUONVPainter.h:104
 AliMUONVPainter.h:105
 AliMUONVPainter.h:106
 AliMUONVPainter.h:107
 AliMUONVPainter.h:108
 AliMUONVPainter.h:109
 AliMUONVPainter.h:110
 AliMUONVPainter.h:111
 AliMUONVPainter.h:112
 AliMUONVPainter.h:113
 AliMUONVPainter.h:114
 AliMUONVPainter.h:115
 AliMUONVPainter.h:116
 AliMUONVPainter.h:117
 AliMUONVPainter.h:118
 AliMUONVPainter.h:119
 AliMUONVPainter.h:120
 AliMUONVPainter.h:121
 AliMUONVPainter.h:122
 AliMUONVPainter.h:123
 AliMUONVPainter.h:124
 AliMUONVPainter.h:125
 AliMUONVPainter.h:126
 AliMUONVPainter.h:127
 AliMUONVPainter.h:128
 AliMUONVPainter.h:129
 AliMUONVPainter.h:130
 AliMUONVPainter.h:131
 AliMUONVPainter.h:132
 AliMUONVPainter.h:133
 AliMUONVPainter.h:134
 AliMUONVPainter.h:135
 AliMUONVPainter.h:136
 AliMUONVPainter.h:137
 AliMUONVPainter.h:138
 AliMUONVPainter.h:139
 AliMUONVPainter.h:140
 AliMUONVPainter.h:141
 AliMUONVPainter.h:142
 AliMUONVPainter.h:143
 AliMUONVPainter.h:144
 AliMUONVPainter.h:145
 AliMUONVPainter.h:146
 AliMUONVPainter.h:147
 AliMUONVPainter.h:148
 AliMUONVPainter.h:149
 AliMUONVPainter.h:150
 AliMUONVPainter.h:151
 AliMUONVPainter.h:152
 AliMUONVPainter.h:153
 AliMUONVPainter.h:154
 AliMUONVPainter.h:155
 AliMUONVPainter.h:156
 AliMUONVPainter.h:157
 AliMUONVPainter.h:158
 AliMUONVPainter.h:159
 AliMUONVPainter.h:160
 AliMUONVPainter.h:161
 AliMUONVPainter.h:162
 AliMUONVPainter.h:163
 AliMUONVPainter.h:164
 AliMUONVPainter.h:165
 AliMUONVPainter.h:166
 AliMUONVPainter.h:167
 AliMUONVPainter.h:168
 AliMUONVPainter.h:169
 AliMUONVPainter.h:170
 AliMUONVPainter.h:171
 AliMUONVPainter.h:172
 AliMUONVPainter.h:173
 AliMUONVPainter.h:174
 AliMUONVPainter.h:175
 AliMUONVPainter.h:176
 AliMUONVPainter.h:177
 AliMUONVPainter.h:178
 AliMUONVPainter.h:179
 AliMUONVPainter.h:180
 AliMUONVPainter.h:181
 AliMUONVPainter.h:182
 AliMUONVPainter.h:183
 AliMUONVPainter.h:184
 AliMUONVPainter.h:185
 AliMUONVPainter.h:186
 AliMUONVPainter.h:187
 AliMUONVPainter.h:188
 AliMUONVPainter.h:189
 AliMUONVPainter.h:190
 AliMUONVPainter.h:191
 AliMUONVPainter.h:192
 AliMUONVPainter.h:193
 AliMUONVPainter.h:194
 AliMUONVPainter.h:195
 AliMUONVPainter.h:196
 AliMUONVPainter.h:197
 AliMUONVPainter.h:198
 AliMUONVPainter.h:199
 AliMUONVPainter.h:200
 AliMUONVPainter.h:201
 AliMUONVPainter.h:202
 AliMUONVPainter.h:203
 AliMUONVPainter.h:204
 AliMUONVPainter.h:205
 AliMUONVPainter.h:206
 AliMUONVPainter.h:207
 AliMUONVPainter.h:208
 AliMUONVPainter.h:209
 AliMUONVPainter.h:210
 AliMUONVPainter.h:211
 AliMUONVPainter.h:212
 AliMUONVPainter.h:213
 AliMUONVPainter.h:214
 AliMUONVPainter.h:215
 AliMUONVPainter.h:216
 AliMUONVPainter.h:217
 AliMUONVPainter.h:218
 AliMUONVPainter.h:219
 AliMUONVPainter.h:220
 AliMUONVPainter.h:221
 AliMUONVPainter.h:222
 AliMUONVPainter.h:223
 AliMUONVPainter.h:224
 AliMUONVPainter.h:225
 AliMUONVPainter.h:226
 AliMUONVPainter.h:227
 AliMUONVPainter.h:228
 AliMUONVPainter.h:229
 AliMUONVPainter.h:230
 AliMUONVPainter.h:231
 AliMUONVPainter.h:232
 AliMUONVPainter.h:233
 AliMUONVPainter.h:234
 AliMUONVPainter.h:235
 AliMUONVPainter.h:236
 AliMUONVPainter.h:237
 AliMUONVPainter.h:238
 AliMUONVPainter.h:239
 AliMUONVPainter.h:240
 AliMUONVPainter.h:241
 AliMUONVPainter.h:242
 AliMUONVPainter.h:243
 AliMUONVPainter.h:244
 AliMUONVPainter.h:245
 AliMUONVPainter.h:246
 AliMUONVPainter.h:247
 AliMUONVPainter.h:248
 AliMUONVPainter.h:249
 AliMUONVPainter.h:250
 AliMUONVPainter.h:251
 AliMUONVPainter.h:252
 AliMUONVPainter.h:253
 AliMUONVPainter.h:254
 AliMUONVPainter.h:255
 AliMUONVPainter.h:256
 AliMUONVPainter.h:257
 AliMUONVPainter.h:258
 AliMUONVPainter.h:259
 AliMUONVPainter.h:260
 AliMUONVPainter.h:261
 AliMUONVPainter.h:262
 AliMUONVPainter.h:263
 AliMUONVPainter.h:264
 AliMUONVPainter.h:265
 AliMUONVPainter.h:266
 AliMUONVPainter.h:267
 AliMUONVPainter.h:268
 AliMUONVPainter.h:269
 AliMUONVPainter.h:270
 AliMUONVPainter.h:271
 AliMUONVPainter.h:272
 AliMUONVPainter.h:273
 AliMUONVPainter.h:274
 AliMUONVPainter.h:275
 AliMUONVPainter.h:276
 AliMUONVPainter.h:277
 AliMUONVPainter.h:278
 AliMUONVPainter.h:279
 AliMUONVPainter.h:280
 AliMUONVPainter.h:281
 AliMUONVPainter.h:282
 AliMUONVPainter.h:283
 AliMUONVPainter.h:284
 AliMUONVPainter.h:285
 AliMUONVPainter.h:286
 AliMUONVPainter.h:287
 AliMUONVPainter.h:288
 AliMUONVPainter.h:289
 AliMUONVPainter.h:290
 AliMUONVPainter.h:291
 AliMUONVPainter.h:292
 AliMUONVPainter.h:293
 AliMUONVPainter.h:294
 AliMUONVPainter.h:295
 AliMUONVPainter.h:296
 AliMUONVPainter.h:297
 AliMUONVPainter.h:298
 AliMUONVPainter.h:299
 AliMUONVPainter.h:300
 AliMUONVPainter.h:301
 AliMUONVPainter.h:302
 AliMUONVPainter.h:303
 AliMUONVPainter.h:304
 AliMUONVPainter.h:305
 AliMUONVPainter.h:306
 AliMUONVPainter.h:307
 AliMUONVPainter.h:308
 AliMUONVPainter.h:309
 AliMUONVPainter.h:310
 AliMUONVPainter.h:311
 AliMUONVPainter.h:312
 AliMUONVPainter.h:313
 AliMUONVPainter.h:314
 AliMUONVPainter.h:315
 AliMUONVPainter.h:316
 AliMUONVPainter.h:317