finalized drawing schema for eta-phi Jet cones in alieve
authorjthaeder <jthaeder@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 16 Jan 2009 14:40:11 +0000 (14:40 +0000)
committerjthaeder <jthaeder@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 16 Jan 2009 14:40:11 +0000 (14:40 +0000)
class ready to use

EVE/EveBase/TEveJetCone.cxx
EVE/EveBase/TEveJetCone.h

index 657866e..f1f2fe1 100644 (file)
 #include "TVirtualPad.h"
 #include "TVirtualViewer3D.h"
 
+#include "TMath.h"
+
 //______________________________________________________________________________
 // Description of TEveJetCone
 //
-// The base must have at least three points.
+// Draw a jet cone with leading particle is specified in (eta,phi) and cone radius is given
+// If Apex is not set, default is (0.,0.,0.)
+// In case of cylinder was set, cone is cut at the cylinder edges
+// example :
+//
+//  Float_t coneEta    = r.Uniform(-0.9, 0.9);
+//  Float_t conePhi    = r.Uniform(0.0, TwoPi() );
+//  Float_t coneRadius = 0.4;
+//
+//  TEveJetCone* jetCone = new TEveJetCone("JetCone");
+//  jetCone->SetCylinder( 250., 250. );
+//  if ( (jetCone->AddCone( coneEta, conePhi, coneRadius   ) ) != -1)
+//    gEve->AddElement( jetCone );
+//
 
 ClassImp(TEveJetCone)
 
@@ -28,12 +43,14 @@ ClassImp(TEveJetCone)
 TEveJetCone::TEveJetCone(const Text_t* n, const Text_t* t) :
    TEveElementList(n, t, kTRUE),
    TAttBBox(),
-   fApex(),
-   fBasePoints()
+   fApex( TEveVector(0.,0.,0.) ),
+   fBasePoints(),
+   fCylinderBorder( TEveVector(-1.,0.,-1.) ),
+   fThetaC(0.)
 {
-   // Constructor.
+  // Constructor.
 
-   fColor = kYellow;
+   fColor = kGreen;
 }
 
 
@@ -76,3 +93,80 @@ void TEveJetCone::Paint(Option_t*)
    if (reqSections != TBuffer3D::kNone)
       Error(eh, "only direct GL rendering supported.");
 }
+
+//______________________________________________________________________________
+Int_t TEveJetCone::AddCone( const Float_t& eta, const Float_t& phi, const Float_t& coneRadius, const Float_t& height )
+{
+  // Add jet cone
+  // parameters are : 
+  // * (eta,phi)    : of the center/leading particle 
+  // * coneRadius   : in eta-phi space
+  // * height       : height of the cone
+  //                  * if cylinder is set and length is adapted to cylinder.
+  //                    - if height is given, it will be used as scalar factor
+  //                  * if cylinder is not set, height is used as height of the cone
+  // Return 0 on sucess
+  
+  if ( fCylinderBorder.fZ == -1. && fCylinderBorder.fX == -1. && height == -1 ) 
+    return -1;
+
+  TEveVector coneAxis;
+  FillTEveVectorFromEtaPhi( coneAxis, eta, phi ); 
+  
+  Float_t angleRad = 0.;
+  for ( Float_t angle = 0.; angle < 360. ; angle+=5. , angleRad=angle*TMath::Pi()/180 ) {
+
+    // -- Get Contour point
+    TEveVector contourPoint;
+    FillTEveVectorFromEtaPhi( contourPoint, 
+                             eta + coneRadius * TMath::Cos(angleRad),
+                             phi + coneRadius * TMath::Sin(angleRad) );
+    
+    // -- Set length of the contourPoint
+    if ( fCylinderBorder.fZ != -1. && fCylinderBorder.fX != -1. ) {
+      if ( contourPoint.Theta() < fThetaC )
+       contourPoint *= fCylinderBorder.fZ / TMath::Cos( contourPoint.Theta() ) ;
+      else if ( contourPoint.Theta() > ( TMath::Pi() - fThetaC ) )
+       contourPoint *= fCylinderBorder.fZ / TMath::Cos( contourPoint.Theta() - TMath::Pi() ) ;
+      else
+       contourPoint *= fCylinderBorder.fX / TMath::Sin( contourPoint.Theta() ) ;
+      
+      if ( height != -1 ) contourPoint *= height;
+    }
+    else {
+      contourPoint *= height / GetArcCosConeOpeningAngle( coneAxis, contourPoint );
+    }
+    
+    // -- Add contourPoint
+    fBasePoints.push_back( contourPoint );
+  }
+  
+  return 0;
+}
+
+//______________________________________________________________________________
+void TEveJetCone::FillTEveVectorFromEtaPhi( TEveVector &vec, const Float_t& eta, const Float_t& phi ) 
+{
+  // Fill TEveVector with eta and phi, with magnitude 1.
+  
+  vec.Set( TMath::Cos(phi) / TMath::CosH(eta), 
+          TMath::Sin(phi) / TMath::CosH(eta), 
+          TMath::TanH(eta) );
+  return;
+}
+
+//______________________________________________________________________________
+Float_t TEveJetCone::GetArcCosConeOpeningAngle( const TEveVector& axis, const TEveVector& contour ) {
+  // Return the arccos of the opening angle between two eve vectors
+
+  Float_t arcCos = 0.;
+  
+  Float_t tot2 = axis.Mag2() * contour.Mag2();
+  if( tot2 > 0. ) {
+    arcCos = axis.Dot( contour )/ TMath::Sqrt( tot2 );
+    if (arcCos >  1.0) arcCos =  1.0;
+    if (arcCos < -1.0) arcCos = -1.0;
+  }
+  
+  return arcCos;
+}
index d312653..80c05cc 100644 (file)
@@ -25,22 +25,28 @@ private:
    TEveJetCone(const TEveJetCone&);            // Not implemented
    TEveJetCone& operator=(const TEveJetCone&); // Not implemented
 
+   void    FillTEveVectorFromEtaPhi( TEveVector &vec, const Float_t& eta, const Float_t& phi ); 
+   Float_t GetArcCosConeOpeningAngle( const TEveVector& axis, const TEveVector& contour );
+
 protected:
    typedef std::vector<TEveVector>        vTEveVector_t;
    typedef vTEveVector_t::iterator        vTEveVector_i;
    typedef vTEveVector_t::const_iterator  vTEveVector_ci;
 
-   TEveVector      fApex;
-   vTEveVector_t   fBasePoints;
+   TEveVector      fApex;             // Apex of the cone, initialized to ( 0., 0., 0. )
+   vTEveVector_t   fBasePoints;       // List of contour points
+   TEveVector      fCylinderBorder;   // Border of Barrel/Cylinder to cut the cone 
+   Float_t         fThetaC;           // Angle between axis and  the edge of top-side of cylinder
 
 public:
    TEveJetCone(const Text_t* n="TEveJetCone", const Text_t* t="");
    virtual ~TEveJetCone() {}
 
-   void SetApex(const TEveVector& a)      { fApex = a; }
-   void AddBasePoint(const TEveVector& p) { fBasePoints.push_back(p); }
-
-   // void SetBaseFromEtaPhi(radius, eta, phi, deta, dphi);
+   void SetApex(const TEveVector& a)                      { fApex = a; }  // Sets apex of cone
+   void SetCylinder( const Float_t& r, const Float_t& z ) { 
+     fCylinderBorder.Set( r, 0.f, z ); fThetaC = fCylinderBorder.Theta(); } // Set border cylinder
+   
+   Int_t AddCone( const Float_t& eta, const Float_t& phi, const Float_t& coneRadius, const Float_t& height = -1. );
 
    virtual Bool_t  CanEditMainTransparency() const { return kTRUE; }