ROOT logo
// @(#)root/eve:$Id: TEveJetCone.cxx 28214 2009-04-15 11:32:25Z matevz $
// Author: Matevz Tadel, Jochen Thaeder 2009

/*************************************************************************
 * 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.             *
 *************************************************************************/

#include "TEveJetCone.h"
#include "TEveTrans.h"

#include "TBuffer3D.h"
#include "TBuffer3DTypes.h"
#include "TVirtualPad.h"
#include "TVirtualViewer3D.h"

#include "TMath.h"

//______________________________________________________________________________
//
// Draws 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);

//______________________________________________________________________________
TEveJetCone::TEveJetCone(const Text_t* n, const Text_t* t) :
   TEveElementList(n, t, kTRUE),
   TAttBBox(),
   fApex( TEveVector(0.,0.,0.) ),
   fBasePoints(),
   fCylinderBorder( TEveVector(-1.,0.,-1.) ),
   fThetaC(0.)
{
   // Constructor.

   fColor = kGreen;
}


/******************************************************************************/

//______________________________________________________________________________
void TEveJetCone::ComputeBBox()
{
   // Compute bounding-box of the data.

   BBoxInit();
   BBoxCheckPoint(fApex);
   for (vTEveVector_ci i = fBasePoints.begin(); i != fBasePoints.end(); ++i)
   {
      BBoxCheckPoint(*i);
   }
}

//______________________________________________________________________________
void TEveJetCone::Paint(Option_t*)
{
   // Paint object.
   // This is for direct rendering (using TEveJetConeGL class).

   static const TEveException eh("TEveJetCone::Paint ");

   if (fRnrSelf == kFALSE) return;

   TBuffer3D buff(TBuffer3DTypes::kGeneric);

   // Section kCore
   buff.fID           = this;
   buff.fColor        = GetMainColor();
   buff.fTransparency = GetMainTransparency();
   if (HasMainTrans())
      RefMainTrans().SetBuffer3D(buff);
   buff.SetSectionsValid(TBuffer3D::kCore);

   Int_t reqSections = gPad->GetViewer3D()->AddObject(buff);
   if (reqSections != TBuffer3D::kNone)
      Error(eh, "only direct GL rendering supported.");
}

//______________________________________________________________________________
Int_t TEveJetCone::AddCone(Float_t eta, Float_t phi, Float_t coneRadius, 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;
}

//______________________________________________________________________________
Int_t TEveJetCone::AddEllipticCone(Float_t eta, Float_t phi, Float_t reta, Float_t rphi, Float_t height)
{
   // Add jet cone
   // parameters are :
   // * (eta,phi)    : of the center/leading particle
   // * (reta, rphi) : radius of cone 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 + reta * TMath::Cos(angleRad),
                                phi + rphi * 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;
}
 TEveJetCone.cxx:1
 TEveJetCone.cxx:2
 TEveJetCone.cxx:3
 TEveJetCone.cxx:4
 TEveJetCone.cxx:5
 TEveJetCone.cxx:6
 TEveJetCone.cxx:7
 TEveJetCone.cxx:8
 TEveJetCone.cxx:9
 TEveJetCone.cxx:10
 TEveJetCone.cxx:11
 TEveJetCone.cxx:12
 TEveJetCone.cxx:13
 TEveJetCone.cxx:14
 TEveJetCone.cxx:15
 TEveJetCone.cxx:16
 TEveJetCone.cxx:17
 TEveJetCone.cxx:18
 TEveJetCone.cxx:19
 TEveJetCone.cxx:20
 TEveJetCone.cxx:21
 TEveJetCone.cxx:22
 TEveJetCone.cxx:23
 TEveJetCone.cxx:24
 TEveJetCone.cxx:25
 TEveJetCone.cxx:26
 TEveJetCone.cxx:27
 TEveJetCone.cxx:28
 TEveJetCone.cxx:29
 TEveJetCone.cxx:30
 TEveJetCone.cxx:31
 TEveJetCone.cxx:32
 TEveJetCone.cxx:33
 TEveJetCone.cxx:34
 TEveJetCone.cxx:35
 TEveJetCone.cxx:36
 TEveJetCone.cxx:37
 TEveJetCone.cxx:38
 TEveJetCone.cxx:39
 TEveJetCone.cxx:40
 TEveJetCone.cxx:41
 TEveJetCone.cxx:42
 TEveJetCone.cxx:43
 TEveJetCone.cxx:44
 TEveJetCone.cxx:45
 TEveJetCone.cxx:46
 TEveJetCone.cxx:47
 TEveJetCone.cxx:48
 TEveJetCone.cxx:49
 TEveJetCone.cxx:50
 TEveJetCone.cxx:51
 TEveJetCone.cxx:52
 TEveJetCone.cxx:53
 TEveJetCone.cxx:54
 TEveJetCone.cxx:55
 TEveJetCone.cxx:56
 TEveJetCone.cxx:57
 TEveJetCone.cxx:58
 TEveJetCone.cxx:59
 TEveJetCone.cxx:60
 TEveJetCone.cxx:61
 TEveJetCone.cxx:62
 TEveJetCone.cxx:63
 TEveJetCone.cxx:64
 TEveJetCone.cxx:65
 TEveJetCone.cxx:66
 TEveJetCone.cxx:67
 TEveJetCone.cxx:68
 TEveJetCone.cxx:69
 TEveJetCone.cxx:70
 TEveJetCone.cxx:71
 TEveJetCone.cxx:72
 TEveJetCone.cxx:73
 TEveJetCone.cxx:74
 TEveJetCone.cxx:75
 TEveJetCone.cxx:76
 TEveJetCone.cxx:77
 TEveJetCone.cxx:78
 TEveJetCone.cxx:79
 TEveJetCone.cxx:80
 TEveJetCone.cxx:81
 TEveJetCone.cxx:82
 TEveJetCone.cxx:83
 TEveJetCone.cxx:84
 TEveJetCone.cxx:85
 TEveJetCone.cxx:86
 TEveJetCone.cxx:87
 TEveJetCone.cxx:88
 TEveJetCone.cxx:89
 TEveJetCone.cxx:90
 TEveJetCone.cxx:91
 TEveJetCone.cxx:92
 TEveJetCone.cxx:93
 TEveJetCone.cxx:94
 TEveJetCone.cxx:95
 TEveJetCone.cxx:96
 TEveJetCone.cxx:97
 TEveJetCone.cxx:98
 TEveJetCone.cxx:99
 TEveJetCone.cxx:100
 TEveJetCone.cxx:101
 TEveJetCone.cxx:102
 TEveJetCone.cxx:103
 TEveJetCone.cxx:104
 TEveJetCone.cxx:105
 TEveJetCone.cxx:106
 TEveJetCone.cxx:107
 TEveJetCone.cxx:108
 TEveJetCone.cxx:109
 TEveJetCone.cxx:110
 TEveJetCone.cxx:111
 TEveJetCone.cxx:112
 TEveJetCone.cxx:113
 TEveJetCone.cxx:114
 TEveJetCone.cxx:115
 TEveJetCone.cxx:116
 TEveJetCone.cxx:117
 TEveJetCone.cxx:118
 TEveJetCone.cxx:119
 TEveJetCone.cxx:120
 TEveJetCone.cxx:121
 TEveJetCone.cxx:122
 TEveJetCone.cxx:123
 TEveJetCone.cxx:124
 TEveJetCone.cxx:125
 TEveJetCone.cxx:126
 TEveJetCone.cxx:127
 TEveJetCone.cxx:128
 TEveJetCone.cxx:129
 TEveJetCone.cxx:130
 TEveJetCone.cxx:131
 TEveJetCone.cxx:132
 TEveJetCone.cxx:133
 TEveJetCone.cxx:134
 TEveJetCone.cxx:135
 TEveJetCone.cxx:136
 TEveJetCone.cxx:137
 TEveJetCone.cxx:138
 TEveJetCone.cxx:139
 TEveJetCone.cxx:140
 TEveJetCone.cxx:141
 TEveJetCone.cxx:142
 TEveJetCone.cxx:143
 TEveJetCone.cxx:144
 TEveJetCone.cxx:145
 TEveJetCone.cxx:146
 TEveJetCone.cxx:147
 TEveJetCone.cxx:148
 TEveJetCone.cxx:149
 TEveJetCone.cxx:150
 TEveJetCone.cxx:151
 TEveJetCone.cxx:152
 TEveJetCone.cxx:153
 TEveJetCone.cxx:154
 TEveJetCone.cxx:155
 TEveJetCone.cxx:156
 TEveJetCone.cxx:157
 TEveJetCone.cxx:158
 TEveJetCone.cxx:159
 TEveJetCone.cxx:160
 TEveJetCone.cxx:161
 TEveJetCone.cxx:162
 TEveJetCone.cxx:163
 TEveJetCone.cxx:164
 TEveJetCone.cxx:165
 TEveJetCone.cxx:166
 TEveJetCone.cxx:167
 TEveJetCone.cxx:168
 TEveJetCone.cxx:169
 TEveJetCone.cxx:170
 TEveJetCone.cxx:171
 TEveJetCone.cxx:172
 TEveJetCone.cxx:173
 TEveJetCone.cxx:174
 TEveJetCone.cxx:175
 TEveJetCone.cxx:176
 TEveJetCone.cxx:177
 TEveJetCone.cxx:178
 TEveJetCone.cxx:179
 TEveJetCone.cxx:180
 TEveJetCone.cxx:181
 TEveJetCone.cxx:182
 TEveJetCone.cxx:183
 TEveJetCone.cxx:184
 TEveJetCone.cxx:185
 TEveJetCone.cxx:186
 TEveJetCone.cxx:187
 TEveJetCone.cxx:188
 TEveJetCone.cxx:189
 TEveJetCone.cxx:190
 TEveJetCone.cxx:191
 TEveJetCone.cxx:192
 TEveJetCone.cxx:193
 TEveJetCone.cxx:194
 TEveJetCone.cxx:195
 TEveJetCone.cxx:196
 TEveJetCone.cxx:197
 TEveJetCone.cxx:198
 TEveJetCone.cxx:199
 TEveJetCone.cxx:200
 TEveJetCone.cxx:201
 TEveJetCone.cxx:202
 TEveJetCone.cxx:203
 TEveJetCone.cxx:204
 TEveJetCone.cxx:205
 TEveJetCone.cxx:206
 TEveJetCone.cxx:207
 TEveJetCone.cxx:208
 TEveJetCone.cxx:209
 TEveJetCone.cxx:210
 TEveJetCone.cxx:211
 TEveJetCone.cxx:212
 TEveJetCone.cxx:213
 TEveJetCone.cxx:214
 TEveJetCone.cxx:215
 TEveJetCone.cxx:216
 TEveJetCone.cxx:217
 TEveJetCone.cxx:218
 TEveJetCone.cxx:219
 TEveJetCone.cxx:220
 TEveJetCone.cxx:221
 TEveJetCone.cxx:222
 TEveJetCone.cxx:223
 TEveJetCone.cxx:224