TEveProjections.cxx

Go to the documentation of this file.
00001 // @(#)root/eve:$Id: TEveProjections.cxx 35221 2010-09-10 11:46:37Z matevz $
00002 // Authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 #include "TEveProjections.h"
00013 #include "TEveTrans.h"
00014 #include "TEveUtil.h"
00015 
00016 #include <limits>
00017 
00018 //==============================================================================
00019 //==============================================================================
00020 // TEveProjection
00021 //==============================================================================
00022 
00023 //______________________________________________________________________________
00024 //
00025 // Base-class for non-linear projections.
00026 //
00027 // Enables to define an external center of distortion and a scale to
00028 // fixate a bounding box of a projected point.
00029 
00030 ClassImp(TEveProjection);
00031 
00032 Float_t TEveProjection::fgEps    = 0.005f;
00033 Float_t TEveProjection::fgEpsSqr = 0.000025f;
00034 
00035 //______________________________________________________________________________
00036 TEveProjection::TEveProjection() :
00037    fType          (kPT_Unknown),
00038    fGeoMode       (kGM_Unknown),
00039    fName          (0),
00040    fCenter        (),
00041    fUsePreScale   (kFALSE),
00042    fDistortion    (0.0f),
00043    fFixR          (300), fFixZ          (400),
00044    fPastFixRFac   (0),   fPastFixZFac   (0),
00045    fScaleR        (1),   fScaleZ        (1),
00046    fPastFixRScale (1),   fPastFixZScale (1),
00047    fMaxTrackStep  (5),
00048    fLowLimit(-std::numeric_limits<Float_t>::infinity(),
00049              -std::numeric_limits<Float_t>::infinity(),
00050              -std::numeric_limits<Float_t>::infinity()),
00051    fUpLimit ( std::numeric_limits<Float_t>::infinity(),
00052               std::numeric_limits<Float_t>::infinity(),
00053               std::numeric_limits<Float_t>::infinity())
00054 
00055 {
00056    // Constructor.
00057 }
00058 
00059 //______________________________________________________________________________
00060 void TEveProjection::ProjectPointfv(Float_t* v, Float_t d)
00061 {
00062    // Project float array.
00063 
00064    ProjectPoint(v[0], v[1], v[2], d);
00065 }
00066 
00067 //______________________________________________________________________________
00068 void TEveProjection::ProjectPointdv(Double_t* v, Float_t d)
00069 {
00070    // Project double array.
00071    // This is a bit piggish as we convert the doubles to floats and back.
00072 
00073    Float_t x = v[0], y = v[1], z = v[2];
00074    ProjectPoint(x, y, z, d);
00075    v[0] = x; v[1] = y; v[2] = z;
00076 }
00077 
00078 //______________________________________________________________________________
00079 void TEveProjection::ProjectVector(TEveVector& v, Float_t d)
00080 {
00081    // Project TEveVector.
00082 
00083    ProjectPoint(v.fX, v.fY, v.fZ, d);
00084 }
00085 
00086 //______________________________________________________________________________
00087 void TEveProjection::ProjectPointfv(const TEveTrans* t, const Float_t* p, Float_t* v, Float_t d)
00088 {
00089    // Project float array, converting it to global coordinate system first if
00090    // transformation matrix is set.
00091 
00092    v[0] = p[0]; v[1] = p[1]; v[2] = p[2];
00093    if (t)
00094    {
00095       t->MultiplyIP(v);
00096    }
00097    ProjectPoint(v[0], v[1], v[2], d);
00098 }
00099 
00100 //______________________________________________________________________________
00101 void TEveProjection::ProjectPointdv(const TEveTrans* t, const Double_t* p, Double_t* v, Float_t d)
00102 {
00103    // Project double array, converting it to global coordinate system first if
00104    // transformation matrix is set.
00105    // This is a bit piggish as we convert the doubles to floats and back.
00106 
00107    Float_t x, y, z;
00108    if (t)
00109    {
00110       t->Multiply(p, v);
00111       x = v[0]; y = v[1]; z = v[2];
00112    }
00113    else
00114    {
00115       x = p[0]; y = p[1]; z = p[2];
00116    }
00117    ProjectPoint(x, y, z, d);
00118    v[0] = x; v[1] = y; v[2] = z;
00119 }
00120 
00121 //______________________________________________________________________________
00122 void TEveProjection::ProjectVector(const TEveTrans* t, TEveVector& v, Float_t d)
00123 {
00124    // Project TEveVector, converting it to global coordinate system first if
00125    // transformation matrix is set.
00126 
00127    if (t)
00128    {
00129       t->MultiplyIP(v);
00130    }
00131    ProjectPoint(v.fX, v.fY, v.fZ, d);
00132 }
00133 
00134 //______________________________________________________________________________
00135 void TEveProjection::PreScaleVariable(Int_t dim, Float_t& v)
00136 {
00137    // Pre-scale single variable with pre-scale entry dim.
00138 
00139    if (!fPreScales[dim].empty())
00140    {
00141       Bool_t invp = kFALSE;
00142       if (v < 0) {
00143          v    = -v;
00144          invp = kTRUE;
00145       }
00146       vPreScale_i i = fPreScales[dim].begin();
00147       while (v > i->fMax)
00148          ++i;
00149       v = i->fOffset + (v - i->fMin)*i->fScale;
00150       if (invp)
00151          v = -v;
00152    }
00153 }
00154 
00155 //______________________________________________________________________________
00156 void TEveProjection::PreScalePoint(Float_t& x, Float_t& y)
00157 {
00158    // Pre-scale point (x, y) in projected coordinates for 2D projections:
00159    //   RhoZ ~ (rho, z)
00160    //   RPhi ~ (r, phi), scaling phi doesn't make much sense.
00161 
00162    PreScaleVariable(0, x);
00163    PreScaleVariable(1, y);
00164 }
00165 
00166 //______________________________________________________________________________
00167 void TEveProjection::PreScalePoint(Float_t& x, Float_t& y, Float_t& z)
00168 {
00169    // Pre-scale point (x, y, z) in projected coordinates for 3D projection.
00170 
00171    PreScaleVariable(0, x);
00172    PreScaleVariable(1, y);
00173    PreScaleVariable(2, z);
00174 }
00175 
00176 //______________________________________________________________________________
00177 void TEveProjection::AddPreScaleEntry(Int_t coord, Float_t value, Float_t scale)
00178 {
00179    // Add new scaling range for given coordinate.
00180    // Arguments:
00181    //  coord    0 ~ x, 1 ~ y, 2 ~ z
00182    //  value    value of input coordinate from which to apply this scale;
00183    //  scale    the scale to apply from value onwards.
00184    //
00185    // NOTE: If pre-scaling is combined with center-displaced then
00186    // the scale of the central region should be 1. This limitation
00187    // can be removed but will cost CPU.
00188 
00189    static const TEveException eh("TEveProjection::AddPreScaleEntry ");
00190 
00191    if (coord < 0 || coord > 2)
00192       throw (eh + "coordinate out of range.");
00193 
00194    const Float_t infty  = std::numeric_limits<Float_t>::infinity();
00195 
00196    vPreScale_t& vec = fPreScales[coord];
00197 
00198    if (vec.empty())
00199    {
00200       if (value == 0)
00201       {
00202          vec.push_back(PreScaleEntry_t(0, infty, 0, scale));
00203       }
00204       else
00205       {
00206          vec.push_back(PreScaleEntry_t(0, value, 0, 1));
00207          vec.push_back(PreScaleEntry_t(value, infty, value, scale));
00208       }
00209    }
00210    else
00211    {
00212       PreScaleEntry_t& prev = vec.back();
00213       if (value <= prev.fMin)
00214          throw (eh + "minimum value not larger than previous one.");
00215 
00216       prev.fMax = value;
00217       Float_t offset =  prev.fOffset + (prev.fMax - prev.fMin)*prev.fScale;
00218       vec.push_back(PreScaleEntry_t(value, infty, offset, scale));
00219    }
00220 }
00221 
00222 //______________________________________________________________________________
00223 void TEveProjection::ChangePreScaleEntry(Int_t   coord, Int_t entry,
00224                                          Float_t new_scale)
00225 {
00226    // Change scale for given entry and coordinate.
00227    //
00228    // NOTE: If the first entry you created used other value than 0,
00229    // one entry (covering range from 0 to this value) was created
00230    // automatically.
00231 
00232    static const TEveException eh("TEveProjection::ChangePreScaleEntry ");
00233 
00234    if (coord < 0 || coord > 2)
00235       throw (eh + "coordinate out of range.");
00236 
00237    vPreScale_t& vec = fPreScales[coord];
00238    Int_t        vs  = vec.size();
00239    if (entry < 0 || entry >= vs)
00240       throw (eh + "entry out of range.");
00241 
00242    vec[entry].fScale = new_scale;
00243    Int_t i0 = entry, i1 = entry + 1;
00244    while (i1 < vs)
00245    {
00246       PreScaleEntry_t e0 = vec[i0];
00247       vec[i1].fOffset = e0.fOffset + (e0.fMax - e0.fMin)*e0.fScale;
00248       i0 = i1++;
00249    }
00250 }
00251 
00252 //______________________________________________________________________________
00253 void TEveProjection::ClearPreScales()
00254 {
00255    // Clear all pre-scaling information.
00256 
00257    fPreScales[0].clear();
00258    fPreScales[1].clear();
00259    fPreScales[2].clear();
00260 }
00261 
00262 //______________________________________________________________________________
00263 void TEveProjection::UpdateLimit()
00264 {
00265    // Update convergence in +inf and -inf.
00266 
00267    if (fDistortion == 0.0f)
00268       return;
00269 
00270    Float_t lim = 1.0f/fDistortion + fFixR;
00271    Float_t *c  = GetProjectedCenter();
00272    fUpLimit .Set( lim + c[0],  lim + c[1], c[2]);
00273    fLowLimit.Set(-lim + c[0], -lim + c[1], c[2]);
00274 }
00275 
00276 //______________________________________________________________________________
00277 void TEveProjection::SetDistortion(Float_t d)
00278 {
00279    // Set distortion.
00280 
00281    fDistortion    = d;
00282    fScaleR        = 1.0f + fFixR*fDistortion;
00283    fScaleZ        = 1.0f + fFixZ*fDistortion;
00284    fPastFixRScale = TMath::Power(10.0f, fPastFixRFac) / fScaleR;
00285    fPastFixZScale = TMath::Power(10.0f, fPastFixZFac) / fScaleZ;
00286    UpdateLimit();
00287 }
00288 
00289 //______________________________________________________________________________
00290 void TEveProjection::SetFixR(Float_t r)
00291 {
00292    // Set fixed radius.
00293 
00294    fFixR          = r;
00295    fScaleR        = 1 + fFixR*fDistortion;
00296    fPastFixRScale = TMath::Power(10.0f, fPastFixRFac) / fScaleR;
00297    UpdateLimit();
00298 }
00299 
00300 //______________________________________________________________________________
00301 void TEveProjection::SetFixZ(Float_t z)
00302 {
00303    // Set fixed radius.
00304 
00305    fFixZ          = z;
00306    fScaleZ        = 1 + fFixZ*fDistortion;
00307    fPastFixZScale = TMath::Power(10.0f, fPastFixZFac) / fScaleZ;
00308    UpdateLimit();
00309 }
00310 
00311 //______________________________________________________________________________
00312 void TEveProjection::SetPastFixRFac(Float_t x)
00313 {
00314    // Set 2's-exponent for relative scaling beyond FixR.
00315 
00316    fPastFixRFac   = x;
00317    fPastFixRScale = TMath::Power(10.0f, fPastFixRFac) / fScaleR;
00318 }
00319 
00320 //______________________________________________________________________________
00321 void TEveProjection::SetPastFixZFac(Float_t x)
00322 {
00323    // Set 2's-exponent for relative scaling beyond FixZ.
00324 
00325    fPastFixZFac   = x;
00326    fPastFixZScale = TMath::Power(10.0f, fPastFixZFac) / fScaleZ;
00327 }
00328 
00329 //______________________________________________________________________________
00330 void TEveProjection::BisectBreakPoint(TEveVector& vL, TEveVector& vR, Float_t eps_sqr)
00331 {
00332    // Find break-point on both sides of the discontinuity.
00333    // They still need to be projected.
00334 
00335    TEveVector vM, vLP, vMP;
00336    while ((vL-vR).Mag2() > eps_sqr)
00337    {
00338       vM.Mult(vL+vR, 0.5f);
00339       vLP.Set(vL); ProjectPoint(vLP.fX, vLP.fY, vLP.fZ, 0);
00340       vMP.Set(vM); ProjectPoint(vMP.fX, vMP.fY, vMP.fZ, 0);
00341 
00342       if (IsOnSubSpaceBoundrary(vMP))
00343       {
00344          vL.Set(vM);
00345          vR.Set(vM);
00346          return;
00347       }
00348 
00349       if (AcceptSegment(vLP, vMP, 0.0f))
00350          vL.Set(vM);
00351       else
00352          vR.Set(vM);
00353    }
00354 }
00355 
00356 //______________________________________________________________________________
00357 void TEveProjection::SetDirectionalVector(Int_t screenAxis, TEveVector& vec)
00358 {
00359    // Get vector for axis in a projected space.
00360 
00361    for (Int_t i=0; i<3; i++)
00362    {
00363       vec[i] = (i==screenAxis) ? 1.0f : 0.0f;
00364    }
00365 }
00366 
00367 //______________________________________________________________________________
00368 Float_t TEveProjection::GetValForScreenPos(Int_t i, Float_t sv)
00369 {
00370    // Inverse projection.
00371 
00372    static const TEveException eH("TEveProjection::GetValForScreenPos ");
00373 
00374    Float_t xL, xM, xR;
00375    TEveVector vec;
00376    TEveVector dirVec;
00377    SetDirectionalVector(i, dirVec);
00378    if (fDistortion > 0.0f && ((sv > 0 && sv > fUpLimit[i]) || (sv < 0 && sv < fLowLimit[i])))
00379       throw(eH + Form("screen value '%f' out of limit '%f'.", sv, sv > 0 ? fUpLimit[i] : fLowLimit[i]));
00380 
00381    TEveVector zero; ProjectVector(zero, 0);
00382    // search from -/+ infinity according to sign of screen value
00383    if (sv > zero[i])
00384    {
00385       xL = 0; xR = 1000;
00386       while (1)
00387       {
00388          vec.Mult(dirVec, xR); ProjectVector(vec, 0);
00389          // printf("positive projected %f, value %f,xL, xR ( %f, %f)\n", vec[i], sv, xL, xR);
00390          if (vec[i] > sv || vec[i] == sv) break;
00391          xL = xR; xR *= 2;
00392       }
00393    }
00394    else if (sv < zero[i])
00395    {
00396       xR = 0; xL = -1000;
00397       while (1)
00398       {
00399          vec.Mult(dirVec, xL); ProjectVector(vec, 0);
00400          // printf("negative projected %f, value %f,xL, xR ( %f, %f)\n", vec[i], sv, xL, xR);
00401          if (vec[i] < sv || vec[i] == sv) break;
00402          xR = xL; xL *= 2;
00403       }
00404    }
00405    else
00406    {
00407       return 0.0f;
00408    }
00409 
00410    do
00411    {
00412       xM = 0.5f * (xL + xR);
00413       vec.Mult(dirVec, xM);
00414       ProjectVector(vec, 0);
00415       // printf("safr xL=%f, xR=%f; vec[i]=%f, sv=%f\n", xL, xR, vec[i], sv);
00416       if (vec[i] > sv)
00417          xR = xM;
00418       else
00419          xL = xM;
00420    } while (TMath::Abs(vec[i] - sv) >= fgEps);
00421 
00422    return xM;
00423 }
00424 
00425 //______________________________________________________________________________
00426 Float_t TEveProjection::GetScreenVal(Int_t i, Float_t x)
00427 {
00428    // Project point on given axis and return projected value.
00429 
00430    TEveVector dv;
00431    SetDirectionalVector(i, dv); dv = dv*x;
00432    ProjectVector(dv, 0);
00433    return dv[i];
00434 }
00435 
00436 
00437 //==============================================================================
00438 //==============================================================================
00439 // TEveRhoZProjection
00440 //==============================================================================
00441 
00442 //______________________________________________________________________________
00443 //
00444 // Transformation from 3D to 2D. X axis represent Z coordinate. Y axis have value of
00445 // radius with a sign of Y coordinate.
00446 
00447 ClassImp(TEveRhoZProjection);
00448 
00449 //______________________________________________________________________________
00450 TEveRhoZProjection::TEveRhoZProjection() :
00451    TEveProjection()
00452 {
00453    // Constructor.
00454 
00455    fType = kPT_RhoZ;
00456    fName = "RhoZ";
00457 }
00458 
00459 //______________________________________________________________________________
00460 void TEveRhoZProjection::ProjectPoint(Float_t& x, Float_t& y, Float_t& z,
00461                                       Float_t  d, EPProc_e proc)
00462 {
00463    // Project point.
00464 
00465    using namespace TMath;
00466 
00467    if (proc == kPP_Plane || proc == kPP_Full)
00468    {
00469       // project
00470       y = Sign((Float_t)Sqrt(x*x+y*y), y);
00471       x = z;
00472    }
00473    if (proc == kPP_Distort || proc == kPP_Full)
00474    {
00475       if (fUsePreScale)
00476          PreScalePoint(y, x);
00477 
00478       // move to center
00479       x -= fProjectedCenter.fX;
00480       y -= fProjectedCenter.fY;
00481 
00482       // distort
00483       if (x > fFixZ)
00484          x =  fFixZ + fPastFixZScale*(x - fFixZ);
00485       else if (x < -fFixZ)
00486          x = -fFixZ + fPastFixZScale*(x + fFixZ);
00487       else
00488          x =  x * fScaleZ / (1.0f + Abs(x)*fDistortion);
00489 
00490       if (y > fFixR)
00491          y =  fFixR + fPastFixRScale*(y - fFixR);
00492       else if (y < -fFixR)
00493          y = -fFixR + fPastFixRScale*(y + fFixR);
00494       else
00495          y =  y * fScaleR / (1.0f + Abs(y)*fDistortion);
00496 
00497       // move back from center
00498       x += fProjectedCenter.fX;
00499       y += fProjectedCenter.fY;
00500    }
00501    z = d;
00502 }
00503 
00504 //______________________________________________________________________________
00505 void TEveRhoZProjection::SetCenter(TEveVector& v)
00506 {
00507    // Set center of distortion (virtual method).
00508 
00509    fCenter = v;
00510 
00511    Float_t r = TMath::Sqrt(v.fX*v.fX + v.fY*v.fY);
00512    fProjectedCenter.fX = fCenter.fZ;
00513    fProjectedCenter.fY = TMath::Sign(r, fCenter.fY);
00514    fProjectedCenter.fZ = 0;
00515    UpdateLimit();
00516 }
00517 
00518 //______________________________________________________________________________
00519 void TEveRhoZProjection::UpdateLimit()
00520 {
00521    // Update convergence in +inf and -inf.
00522 
00523    if (fDistortion == 0.0f)
00524       return;
00525 
00526    Float_t limR = 1.0f/fDistortion + fFixR;
00527    Float_t limZ = 1.0f/fDistortion + fFixZ;
00528    Float_t *c   = GetProjectedCenter();
00529    fUpLimit .Set( limZ + c[0],  limR + c[1], c[2]);
00530    fLowLimit.Set(-limZ + c[0], -limR + c[1], c[2]);
00531 }
00532 
00533 //______________________________________________________________________________
00534 void TEveRhoZProjection::SetDirectionalVector(Int_t screenAxis, TEveVector& vec)
00535 {
00536    // Get direction in the unprojected space for axis index in the
00537    // projected space.
00538    // This is virtual method from base-class TEveProjection.
00539 
00540    if (screenAxis == 0)
00541       vec.Set(0.0f, 0.0f, 1.0f);
00542    else if (screenAxis == 1)
00543       vec.Set(0.0f, 1.0f, 0.0f);
00544 
00545 }
00546 //______________________________________________________________________________
00547 Bool_t TEveRhoZProjection::AcceptSegment(TEveVector& v1, TEveVector& v2,
00548                                          Float_t tolerance) const
00549 {
00550    // Check if segment of two projected points is valid.
00551    //
00552    // Move slightly one of the points if by shifting it by no more than
00553    // tolearance the segment can become acceptable.
00554 
00555    Float_t a = fProjectedCenter.fY;
00556    Bool_t val = kTRUE;
00557    if ((v1.fY <  a && v2.fY > a) || (v1.fY > a && v2.fY < a))
00558    {
00559       val = kFALSE;
00560       if (tolerance > 0)
00561       {
00562          Float_t a1 = TMath::Abs(v1.fY - a), a2 = TMath::Abs(v2.fY - a);
00563          if (a1 < a2)
00564          {
00565             if (a1 < tolerance) { v1.fY = a; val = kTRUE; }
00566          }
00567          else
00568          {
00569             if (a2 < tolerance) { v2.fY = a; val = kTRUE; }
00570          }
00571       }
00572    }
00573    return val;
00574 }
00575 
00576 //______________________________________________________________________________
00577 Int_t TEveRhoZProjection::SubSpaceId(const TEveVector& v) const
00578 {
00579    // Return sub-space id for the point.
00580    // 0 - upper half-space
00581    // 1 - lowwer half-space
00582 
00583    return v.fY > fProjectedCenter.fY ? 0 : 1;
00584 }
00585 
00586 //______________________________________________________________________________
00587 Bool_t TEveRhoZProjection::IsOnSubSpaceBoundrary(const TEveVector& v) const
00588 {
00589    // Checks if point is on sub-space boundrary.
00590 
00591    return v.fY == fProjectedCenter.fY;
00592 }
00593 
00594 //==============================================================================
00595 //==============================================================================
00596 // TEveRPhiProjection
00597 //==============================================================================
00598 
00599 //______________________________________________________________________________
00600 //
00601 // XY projection with distortion around given center.
00602 
00603 ClassImp(TEveRPhiProjection);
00604 
00605 //______________________________________________________________________________
00606 TEveRPhiProjection::TEveRPhiProjection() :
00607    TEveProjection()
00608 {
00609    // Constructor.
00610 
00611    fType    = kPT_RPhi;
00612    fGeoMode = kGM_Polygons;
00613    fName    = "RhoPhi";
00614 }
00615 
00616 //______________________________________________________________________________
00617 void TEveRPhiProjection::ProjectPoint(Float_t& x, Float_t& y, Float_t& z,
00618                                       Float_t d, EPProc_e proc)
00619 {
00620    // Project point.
00621 
00622    using namespace TMath;
00623 
00624    if (proc != kPP_Plane)
00625    {
00626       Float_t r, phi;
00627       if (fUsePreScale)
00628       {
00629          r   = Sqrt(x*x + y*y);
00630          phi = (x == 0.0f && y == 0.0f) ? 0.0f : ATan2(y, x);
00631          PreScalePoint(r, phi);
00632          x = r*Cos(phi);
00633          y = r*Sin(phi);
00634       }
00635 
00636       x  -= fCenter.fX;
00637       y  -= fCenter.fY;
00638       r   = Sqrt(x*x + y*y);
00639       phi = (x == 0.0f && y == 0.0f) ? 0.0f : ATan2(y, x);
00640 
00641       if (r > fFixR)
00642          r =  fFixR + fPastFixRScale*(r - fFixR);
00643       else if (r < -fFixR)
00644          r = -fFixR + fPastFixRScale*(r + fFixR);
00645       else
00646          r =  r * fScaleR / (1.0f + r*fDistortion);
00647 
00648       x = r*Cos(phi) + fCenter.fX;
00649       y = r*Sin(phi) + fCenter.fY;
00650    }
00651    z = d;
00652 }
00653 
00654 
00655 //==============================================================================
00656 //==============================================================================
00657 // TEve3DProjection
00658 //==============================================================================
00659 
00660 //______________________________________________________________________________
00661 //
00662 // 3D scaling projection. One has to use pre-scaling to make any ise of this.
00663 
00664 ClassImp(TEve3DProjection);
00665 
00666 //______________________________________________________________________________
00667 TEve3DProjection::TEve3DProjection() :
00668    TEveProjection()
00669 {
00670    // Constructor.
00671 
00672    fType    = kPT_3D;
00673    fGeoMode = kGM_Unknown;
00674    fName    = "3D";
00675 }
00676 
00677 //______________________________________________________________________________
00678 void TEve3DProjection::ProjectPoint(Float_t& x, Float_t& y, Float_t& z,
00679                                     Float_t /*d*/, EPProc_e proc)
00680 {
00681    // Project point.
00682 
00683    using namespace TMath;
00684 
00685    if (proc != kPP_Plane)
00686    {
00687       if (fUsePreScale)
00688       {
00689          PreScalePoint(x, y, z);
00690       }
00691 
00692       x -= fCenter.fX;
00693       y -= fCenter.fY;
00694       z -= fCenter.fZ;
00695    }
00696 }

Generated on Tue Jul 5 14:16:13 2011 for ROOT_528-00b_version by  doxygen 1.5.1