ROOT logo
// @(#)root/eve:$Id: TEveProjections.h 26367 2008-11-21 18:08:30Z matevz $
// Authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

/*************************************************************************
 * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TEveProjections
#define ROOT_TEveProjections

#include "TEveVSDStructs.h"

#include <vector>

////////////////////////////////////////////////////////////////
//                                                            //
// TEveProjection                                             //
//                                                            //
////////////////////////////////////////////////////////////////

class TEveProjection
{
public:
   enum EPType_e   { kPT_Unknown, kPT_RPhi, kPT_RhoZ, kPT_End };// type
   enum EPProc_e   { kPP_Plane, kPP_Distort, kPP_Full };        // procedure
   enum EGeoMode_e { kGM_Unknown, kGM_Polygons, kGM_Segments }; // reconstruction of geometry

   struct PreScaleEntry_t
   {
      Float_t fMin, fMax;
      Float_t fOffset;
      Float_t fScale;

      PreScaleEntry_t() :
         fMin(0), fMax(0), fOffset(0), fScale(1) {}
      PreScaleEntry_t(Float_t min, Float_t max, Float_t off, Float_t scale) :
         fMin(min), fMax(max), fOffset(off), fScale(scale) {}

      virtual ~PreScaleEntry_t() {}

      ClassDef(PreScaleEntry_t, 0);
   };

   typedef std::vector<PreScaleEntry_t>           vPreScale_t;
   typedef std::vector<PreScaleEntry_t>::iterator vPreScale_i;

protected:
   EPType_e            fType;          // type
   EGeoMode_e          fGeoMode;       // strategy of polygon projection (what to try first)
   TString             fName;          // name

   TEveVector          fCenter;        // center of distortion
   TEveVector          fZeroPosVal;    // projected origin (0, 0, 0)

   Bool_t              fUsePreScale;   // use pre-scaling
   vPreScale_t         fPreScales[2];  // scaling before the distortion

   Float_t             fDistortion;    // distortion
   Float_t             fFixR;          // radius from which scaling remains constant
   Float_t             fFixZ;          // z-coordinate from which scaling remains constant
   Float_t             fPastFixRFac;   // relative scaling factor beyond fFixR as 10^x
   Float_t             fPastFixZFac;   // relative scaling factor beyond fFixZ as 10^x
   Float_t             fScaleR;        // scale factor to keep projected radius at fFixR fixed
   Float_t             fScaleZ;        // scale factor to keep projected z-coordinate at fFixZ fixed
   Float_t             fPastFixRScale; // relative scaling beyond fFixR
   Float_t             fPastFixZScale; // relative scaling beyond fFixZ
   Float_t             fMaxTrackStep;  // maximum distance between two points on a track

   TEveVector          fLowLimit;      // convergence of point +infinity
   TEveVector          fUpLimit;       // convergence of point -infinity

public:
   TEveProjection();
   virtual ~TEveProjection() {}

   virtual   void      ProjectPoint(Float_t&, Float_t&, Float_t&, EPProc_e p = kPP_Full ) = 0;
   virtual   void      ProjectPointFv(Float_t* v) { ProjectPoint(v[0], v[1], v[2]); }
   virtual   void      ProjectVector(TEveVector& v);

   const     char*     GetName() { return fName.Data(); }
   void                SetName(const char* txt) { fName = txt; }

   virtual void        SetCenter(TEveVector& v) { fCenter = v; UpdateLimit(); }
   virtual Float_t*    GetProjectedCenter() { return fCenter.Arr(); }

   void                SetType(EPType_e t) { fType = t; }
   EPType_e            GetType() { return fType; }

   void                SetGeoMode(EGeoMode_e m) { fGeoMode = m; }
   EGeoMode_e          GetGeoMode() { return fGeoMode; }

   virtual void        UpdateLimit();

   Bool_t   GetUsePreScale() const   { return fUsePreScale; }
   void     SetUsePreScale(Bool_t x) { fUsePreScale = x; }

   void     PreScalePoint(Float_t& x, Float_t& y);
   void     AddPreScaleEntry(Int_t coord, Float_t max_val, Float_t scale);
   void     ChangePreScaleEntry(Int_t coord, Int_t entry, Float_t new_scale);
   void     ClearPreScales();

   void     SetDistortion(Float_t d);
   Float_t  GetDistortion() const { return fDistortion; }
   Float_t  GetFixR() const { return fFixR; }
   Float_t  GetFixZ() const { return fFixZ; }
   void     SetFixR(Float_t x);
   void     SetFixZ(Float_t x);
   Float_t  GetPastFixRFac() const { return fPastFixRFac; }
   Float_t  GetPastFixZFac() const { return fPastFixZFac; }
   void     SetPastFixRFac(Float_t x);
   void     SetPastFixZFac(Float_t x);
   Float_t  GetMaxTrackStep() const    { return fMaxTrackStep; }
   void     SetMaxTrackStep(Float_t x) { fMaxTrackStep = TMath::Max(x, 1.0f); }

   virtual   Bool_t    AcceptSegment(TEveVector&, TEveVector&, Float_t /*tolerance*/) { return kTRUE; }
   virtual   void      SetDirectionalVector(Int_t screenAxis, TEveVector& vec);

   // utils to draw axis
   virtual Float_t     GetValForScreenPos(Int_t ax, Float_t value);
   virtual Float_t     GetScreenVal(Int_t ax, Float_t value);
   Float_t             GetLimit(Int_t i, Bool_t pos) { return pos ? fUpLimit[i] : fLowLimit[i]; }

   static   Float_t    fgEps;  // resolution of projected points

   ClassDef(TEveProjection, 0); // Base for specific classes that implement non-linear projections.
};


////////////////////////////////////////////////////////////////
//                                                            //
// TEveRhoZProjection                                         //
//                                                            //
////////////////////////////////////////////////////////////////

class TEveRhoZProjection: public TEveProjection
{
private:
   TEveVector   fProjectedCenter; // projected center of distortion.

public:
   TEveRhoZProjection();
   virtual ~TEveRhoZProjection() {}

   virtual   void      ProjectPoint(Float_t& x, Float_t& y, Float_t& z, EPProc_e proc = kPP_Full);

   virtual   void      SetCenter(TEveVector& center);
   virtual   Float_t*  GetProjectedCenter() { return fProjectedCenter.Arr(); }

   virtual   void      UpdateLimit();

   virtual   Bool_t    AcceptSegment(TEveVector& v1, TEveVector& v2, Float_t tolerance);
   virtual   void      SetDirectionalVector(Int_t screenAxis, TEveVector& vec);

   ClassDef(TEveRhoZProjection, 0); // Rho/Z non-linear projection.
};


////////////////////////////////////////////////////////////////
//                                                            //
// TEveRPhiProjection                                         //
//                                                            //
////////////////////////////////////////////////////////////////

class TEveRPhiProjection : public TEveProjection
{
public:
   TEveRPhiProjection();
   virtual ~TEveRPhiProjection() {}

   virtual void ProjectPoint(Float_t& x, Float_t& y, Float_t& z, EPProc_e proc = kPP_Full);

   ClassDef(TEveRPhiProjection, 0); // XY non-linear projection.
};

#endif
 TEveProjections.h:1
 TEveProjections.h:2
 TEveProjections.h:3
 TEveProjections.h:4
 TEveProjections.h:5
 TEveProjections.h:6
 TEveProjections.h:7
 TEveProjections.h:8
 TEveProjections.h:9
 TEveProjections.h:10
 TEveProjections.h:11
 TEveProjections.h:12
 TEveProjections.h:13
 TEveProjections.h:14
 TEveProjections.h:15
 TEveProjections.h:16
 TEveProjections.h:17
 TEveProjections.h:18
 TEveProjections.h:19
 TEveProjections.h:20
 TEveProjections.h:21
 TEveProjections.h:22
 TEveProjections.h:23
 TEveProjections.h:24
 TEveProjections.h:25
 TEveProjections.h:26
 TEveProjections.h:27
 TEveProjections.h:28
 TEveProjections.h:29
 TEveProjections.h:30
 TEveProjections.h:31
 TEveProjections.h:32
 TEveProjections.h:33
 TEveProjections.h:34
 TEveProjections.h:35
 TEveProjections.h:36
 TEveProjections.h:37
 TEveProjections.h:38
 TEveProjections.h:39
 TEveProjections.h:40
 TEveProjections.h:41
 TEveProjections.h:42
 TEveProjections.h:43
 TEveProjections.h:44
 TEveProjections.h:45
 TEveProjections.h:46
 TEveProjections.h:47
 TEveProjections.h:48
 TEveProjections.h:49
 TEveProjections.h:50
 TEveProjections.h:51
 TEveProjections.h:52
 TEveProjections.h:53
 TEveProjections.h:54
 TEveProjections.h:55
 TEveProjections.h:56
 TEveProjections.h:57
 TEveProjections.h:58
 TEveProjections.h:59
 TEveProjections.h:60
 TEveProjections.h:61
 TEveProjections.h:62
 TEveProjections.h:63
 TEveProjections.h:64
 TEveProjections.h:65
 TEveProjections.h:66
 TEveProjections.h:67
 TEveProjections.h:68
 TEveProjections.h:69
 TEveProjections.h:70
 TEveProjections.h:71
 TEveProjections.h:72
 TEveProjections.h:73
 TEveProjections.h:74
 TEveProjections.h:75
 TEveProjections.h:76
 TEveProjections.h:77
 TEveProjections.h:78
 TEveProjections.h:79
 TEveProjections.h:80
 TEveProjections.h:81
 TEveProjections.h:82
 TEveProjections.h:83
 TEveProjections.h:84
 TEveProjections.h:85
 TEveProjections.h:86
 TEveProjections.h:87
 TEveProjections.h:88
 TEveProjections.h:89
 TEveProjections.h:90
 TEveProjections.h:91
 TEveProjections.h:92
 TEveProjections.h:93
 TEveProjections.h:94
 TEveProjections.h:95
 TEveProjections.h:96
 TEveProjections.h:97
 TEveProjections.h:98
 TEveProjections.h:99
 TEveProjections.h:100
 TEveProjections.h:101
 TEveProjections.h:102
 TEveProjections.h:103
 TEveProjections.h:104
 TEveProjections.h:105
 TEveProjections.h:106
 TEveProjections.h:107
 TEveProjections.h:108
 TEveProjections.h:109
 TEveProjections.h:110
 TEveProjections.h:111
 TEveProjections.h:112
 TEveProjections.h:113
 TEveProjections.h:114
 TEveProjections.h:115
 TEveProjections.h:116
 TEveProjections.h:117
 TEveProjections.h:118
 TEveProjections.h:119
 TEveProjections.h:120
 TEveProjections.h:121
 TEveProjections.h:122
 TEveProjections.h:123
 TEveProjections.h:124
 TEveProjections.h:125
 TEveProjections.h:126
 TEveProjections.h:127
 TEveProjections.h:128
 TEveProjections.h:129
 TEveProjections.h:130
 TEveProjections.h:131
 TEveProjections.h:132
 TEveProjections.h:133
 TEveProjections.h:134
 TEveProjections.h:135
 TEveProjections.h:136
 TEveProjections.h:137
 TEveProjections.h:138
 TEveProjections.h:139
 TEveProjections.h:140
 TEveProjections.h:141
 TEveProjections.h:142
 TEveProjections.h:143
 TEveProjections.h:144
 TEveProjections.h:145
 TEveProjections.h:146
 TEveProjections.h:147
 TEveProjections.h:148
 TEveProjections.h:149
 TEveProjections.h:150
 TEveProjections.h:151
 TEveProjections.h:152
 TEveProjections.h:153
 TEveProjections.h:154
 TEveProjections.h:155
 TEveProjections.h:156
 TEveProjections.h:157
 TEveProjections.h:158
 TEveProjections.h:159
 TEveProjections.h:160
 TEveProjections.h:161
 TEveProjections.h:162
 TEveProjections.h:163
 TEveProjections.h:164
 TEveProjections.h:165
 TEveProjections.h:166
 TEveProjections.h:167
 TEveProjections.h:168
 TEveProjections.h:169
 TEveProjections.h:170
 TEveProjections.h:171
 TEveProjections.h:172
 TEveProjections.h:173
 TEveProjections.h:174
 TEveProjections.h:175
 TEveProjections.h:176
 TEveProjections.h:177
 TEveProjections.h:178
 TEveProjections.h:179