ROOT logo
// $Id: GravPlotter.cxx 2360 2010-03-29 18:34:39Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#include "GravPlotter.h"

#include <Glasses/ParaSurf.h>

#include <Stones/TringTvor.h>
#include <Glasses/TriMesh.h>

#include <Glasses/Tringula.h>

#include <TMath.h>
#include <Math/ParamFunctor.h>
#include <TF2.h>
#include <TH1.h>
#include <TCanvas.h>

// GravPlotter

//______________________________________________________________________________
//
//

ClassImp(GravPlotter);

//==============================================================================

void GravPlotter::_init()
{
  fNDiv = 100;
  fMag = fH = fAngle = fXDir = fZDir = fGrad = 0;
  fDrawOpt = "glsurf2";
}


GravPlotter::GravPlotter(const Text_t* n, const Text_t* t) :
  TNamed(n, t)
{
  _init();
}

GravPlotter::GravPlotter(ParaSurf* ps, Float_t fac, Int_t n_div) :
  TNamed("GravPlotter", "Foo"),
  fNDiv (n_div)
{
  _init();

  fPS = ps;

  Float_t l = fac * ps->CharacteristicLength();

  fXm = fZm = -l;
  fXM = fZM =  l;

  fMag   = make_tf2("grav_mag",   "Magnitude", &GravPlotter::grav_mag);
  fH     = make_tf2("grav_h",     "h",         &GravPlotter::grav_h);
  fAngle = make_tf2("grav_angle", "Down-Grav angle", &GravPlotter::grav_angle);
  fXDir  = make_tf2("grav_xdir",  "x-dir",     &GravPlotter::grav_xdir);
  fZDir  = make_tf2("grav_zdir",  "z-dir",     &GravPlotter::grav_zdir);
  fGrad  = make_tf2("grav_grad",   "gradient", &GravPlotter::grav_grad);
}

GravPlotter::~GravPlotter()
{}

//==============================================================================

TF2* GravPlotter::make_tf2(const Text_t* n, const Text_t* t, tf2_foo foo)
{
  TF2* f = new TF2(n, ROOT::Math::ParamFunctor(this, foo), fXm, fXM, fZm, fZM, 0);
  f->SetTitle(t);
  f->SetNpx(fNDiv);
  f->SetNpy(fNDiv);
  return f;
}

void GravPlotter::draw_tf2(TF2* f)
{
  f->Draw(fDrawOpt);

  gPad->Update();

  TH1* h = f->GetHistogram();
  h->GetXaxis()->SetTitle("X");
  h->GetYaxis()->SetTitle("Z");
  h->GetZaxis()->SetTitle(f->GetTitle());
  h->GetXaxis()->SetTitleOffset(1.5);
  h->GetYaxis()->SetTitleOffset(1.5);
  h->GetZaxis()->SetTitleOffset(1.5);

  gPad->Modified();
}

//==============================================================================

void GravPlotter::fill_gd(Double_t *x)
{
  Float_t pos[3] = { x[0], 0, x[1] };
  fPS->pos2grav(pos, fGD);
}

Double_t GravPlotter::grav_mag(Double_t *x, Double_t *params)
{
  fill_gd(x);
  return fGD.fMag;
}

Double_t GravPlotter::grav_h(Double_t *x, Double_t *params)
{
  fill_gd(x);
  return fGD.fH;
}

Double_t GravPlotter::grav_angle(Double_t *x, Double_t *params)
{
  fill_gd(x);
  return TMath::RadToDeg() * TMath::ACos(fGD.Dir() | fGD.Down());
}

Double_t GravPlotter::grav_xdir(Double_t *x, Double_t *params)
{
  fill_gd(x);
  return fGD.fDir[0];
}

Double_t GravPlotter::grav_zdir(Double_t *x, Double_t *params)
{
  fill_gd(x);
  return fGD.fDir[2];
}

Double_t GravPlotter::grav_grad(Double_t *x, Double_t *params)
{
  fill_gd(x);
  return sqrtf(fGD.fLDer*fGD.fLDer + fGD.fTDer*fGD.fTDer);
}

//==============================================================================

TCanvas* GravPlotter::StandardCanvas()
{
  // This would best be called from ROOT prompt.

  TCanvas* c = new TCanvas(GForm("gl%s", fPS->GetName()),
                           GForm("Grav plots for %s", fPS->GetName()));
  c->Divide(3, 2);

  Int_t i = 1;
  c->cd(i++); draw_tf2(fMag);
  c->cd(i++); draw_tf2(fH);
  c->cd(i++); draw_tf2(fAngle);
  c->cd(i++); draw_tf2(fXDir);
  c->cd(i++); draw_tf2(fZDir);
  c->cd(i++); draw_tf2(fGrad);

  c->Modified();
  c->Update();

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