// @(#)root/eve:$Id$
// 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 "TEveProjectionManager.h"

#include "TMath.h"


//==============================================================================
// TEveJetCone
//==============================================================================

//______________________________________________________________________________
//
// 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);
//
//
// Implementation notes
//
// TEveVector fLimits encodes the following information:
//   fY, fZ:  barrel radius and endcap z-position;
//            if both are 0, fX encodes the spherical radius
//   fX    :  scaling for length of the cone

ClassImp(TEveJetCone);

//______________________________________________________________________________
TEveJetCone::TEveJetCone(const Text_t* n, const Text_t* t) :
   TEveShape(n, t),
   fApex(),
   fLimits(), fThetaC(10),
   fEta(0), fPhi(0), fDEta(0), fDPhi(0), fNDiv(72)
{
   // Constructor.

   fColor = kGreen;
}

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

   BBoxInit();
   BBoxCheckPoint(fApex);
   BBoxCheckPoint(CalcBaseVec(0));
   BBoxCheckPoint(CalcBaseVec(TMath::PiOver2()));
   BBoxCheckPoint(CalcBaseVec(TMath::Pi()));
   BBoxCheckPoint(CalcBaseVec(TMath::Pi() + TMath::PiOver2()));
}

//______________________________________________________________________________
TClass* TEveJetCone::ProjectedClass(const TEveProjection*) const
{
   // Virtual from TEveProjectable, returns TEveJetConeProjected class.

   return TEveJetConeProjected::Class();
}


//______________________________________________________________________________
Int_t TEveJetCone::AddCone(Float_t eta, Float_t phi, Float_t cone_r, Float_t length)
{
   // Add jet cone.
   // parameters are :
   // * (eta,phi)    : of the center/leading particle
   // * cone_r       : cone radius in eta-phi space
   // * length       : length of the cone
   //   * if cylinder is set and length is adapted to cylinder.
   //     - if length is given, it will be used as scalar factor
   //   * if cylinder is not set, length is used as length of the cone
   // Return 0 on sucess.

   return AddEllipticCone(eta, phi, cone_r, cone_r, length);
}

//______________________________________________________________________________
Int_t TEveJetCone::AddEllipticCone(Float_t eta, Float_t phi, Float_t reta, Float_t rphi, Float_t length)
{
   // Add jet cone.
   // parameters are :
   // * (eta,phi)    : of the center/leading particle
   // * (reta, rphi) : radius of cone in eta-phi space
   // * length       : length of the cone
   //   * if cylinder is set and length is adapted to cylinder.
   //     - if length is given, it will be used as scalar factor
   //   * if cylinder is not set, length is used as length of the cone
   // Returns 0 on sucess.

   using namespace TMath;

   if (length != 0) fLimits.fX = length;

   if (fLimits.IsZero())
      return -1;

   fEta = eta; fPhi = phi; fDEta = reta; fDPhi = rphi;

   return 0;
}

//______________________________________________________________________________
TEveVector TEveJetCone::CalcEtaPhiVec(Float_t eta, Float_t phi) const
{
   // Fill TEveVector with eta and phi, magnitude 1.

   using namespace TMath;

   return TEveVector(Cos(phi) / CosH(eta), Sin(phi) / CosH(eta), TanH(eta));
}

//______________________________________________________________________________
TEveVector TEveJetCone::CalcBaseVec(Float_t eta, Float_t phi) const
{
   // Returns point on the base of the cone with given eta and phi.

   using namespace TMath;

   TEveVector vec = CalcEtaPhiVec(eta, phi);

   // -- Set length of the contourPoint
   if (fLimits.fY != 0 && fLimits.fZ != 0)
   {
      Float_t theta = vec.Theta();
      if (theta < fThetaC)
         vec *= fLimits.fZ / Cos(theta);
      else if (theta > Pi() - fThetaC)
         vec *= fLimits.fZ / Cos(theta - Pi());
      else
         vec *= fLimits.fY / Sin(theta);

      if (fLimits.fX != 0) vec *= fLimits.fX;
   }
   else
   {
      vec *= fLimits.fX;
   }

   return vec;
}

//______________________________________________________________________________
TEveVector TEveJetCone::CalcBaseVec(Float_t alpha) const
{
   // Returns point on the base of the cone with internal angle alpha:
   // alpha = 0 -> max eta,  alpha = pi/2 -> max phi, ...

   using namespace TMath;

   return CalcBaseVec(fEta + fDEta * Cos(alpha), fPhi + fDPhi * Sin(alpha));
}

//______________________________________________________________________________
Bool_t TEveJetCone::IsInTransitionRegion() const
{
   // Returns true if the cone is in barrel / endcap transition region.

   using namespace TMath;

   Float_t tm = CalcBaseVec(0).Theta();
   Float_t tM = CalcBaseVec(Pi()).Theta();

   return (tM > fThetaC        && tm < fThetaC) ||
          (tM > Pi() - fThetaC && tm < Pi() - fThetaC);
}

//==============================================================================
// TEveJetConeProjected
//==============================================================================

//______________________________________________________________________________
//
// Projection of TEveJetCone.

//______________________________________________________________________________
TEveJetConeProjected::TEveJetConeProjected(const char* n, const char* t) :
   TEveShape(n, t)
{
   // Constructor.
}

//______________________________________________________________________________
TEveJetConeProjected::~TEveJetConeProjected()
{
   // Destructor.
}

//______________________________________________________________________________
void TEveJetConeProjected::ComputeBBox()
{
   // Compute bounding-box, virtual from TAttBBox.

   BBoxInit();

   TEveJetCone    *cone = dynamic_cast<TEveJetCone*>(fProjectable);
//______________________________________________________________________________
   TEveProjection *proj = GetManager()->GetProjection();
   TEveVector v;
   v = cone->fApex;                                       proj->ProjectVector(v, fDepth); BBoxCheckPoint(v);
   v = cone->CalcBaseVec(0);                              proj->ProjectVector(v, fDepth); BBoxCheckPoint(v);
   v = cone->CalcBaseVec(TMath::PiOver2());               proj->ProjectVector(v, fDepth); BBoxCheckPoint(v);
   v = cone->CalcBaseVec(TMath::Pi());                    proj->ProjectVector(v, fDepth); BBoxCheckPoint(v);
   v = cone->CalcBaseVec(TMath::Pi() + TMath::PiOver2()); proj->ProjectVector(v, fDepth); BBoxCheckPoint(v);
}

//______________________________________________________________________________
void TEveJetConeProjected::SetDepthLocal(Float_t d)
{
   // This is virtual method from base-class TEveProjected.

   SetDepthCommon(d, this, fBBox);
}

//______________________________________________________________________________
void TEveJetConeProjected::SetProjection(TEveProjectionManager* mng, TEveProjectable* model)
{
   // This is virtual method from base-class TEveProjected.

   TEveProjected::SetProjection(mng, model);
   CopyVizParams(dynamic_cast<TEveElement*>(model));
}

//______________________________________________________________________________
void TEveJetConeProjected::UpdateProjection()
{
   // Re-project the jet-cone.

}
 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
 TEveJetCone.cxx:225
 TEveJetCone.cxx:226
 TEveJetCone.cxx:227
 TEveJetCone.cxx:228
 TEveJetCone.cxx:229
 TEveJetCone.cxx:230
 TEveJetCone.cxx:231
 TEveJetCone.cxx:232
 TEveJetCone.cxx:233
 TEveJetCone.cxx:234
 TEveJetCone.cxx:235
 TEveJetCone.cxx:236
 TEveJetCone.cxx:237
 TEveJetCone.cxx:238
 TEveJetCone.cxx:239
 TEveJetCone.cxx:240
 TEveJetCone.cxx:241
 TEveJetCone.cxx:242
 TEveJetCone.cxx:243
 TEveJetCone.cxx:244
 TEveJetCone.cxx:245
 TEveJetCone.cxx:246
 TEveJetCone.cxx:247
 TEveJetCone.cxx:248
 TEveJetCone.cxx:249
 TEveJetCone.cxx:250
 TEveJetCone.cxx:251
 TEveJetCone.cxx:252
 TEveJetCone.cxx:253