ROOT logo
// $Id$
// Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

/**************************************************************************
 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
 * full copyright notice.                                                 *
 **************************************************************************/

#if !defined(__CINT__) || defined(__MAKECINT__)
#include <TEveManager.h>
#include <TEveCompound.h>
#include <TEveStraightLineSet.h>

#include <AliESDEvent.h>
#include <AliESDVertex.h>
#include <AliEveEventManager.h>
#endif

//==============================================================================
// Utilities
//==============================================================================

TEveCompound* assert_vertex_parent(const TString& name, Color_t col)
{
  // !!! TEveCompound should have viz-db support ... add in root, then fix here,
  // that is, remove the color var and pass viz-db tag.

  TEveCompound* parent = dynamic_cast<TEveCompound*>
    (AliEveEventManager::GetCurrent()->FindChild(name));
  if (parent == 0)
  {
    parent = new TEveCompound(name);
    parent->OpenCompound();
    parent->SetMainColor(col);
    AliEveEventManager::GetMaster()->AddElement(parent);
  }
  return parent;
}


//==============================================================================
// Functions to make a cross / ellipse / box
//==============================================================================

TEveStraightLineSet*
make_vertex_cross(const AliESDVertex* v, Bool_t use_sigma, Float_t fx, Float_t fy, Float_t fz)
{
  Double_t x[3], e[3];
  v->GetXYZ(x); v->GetSigmaXYZ(e);

  TEveStraightLineSet* ls = new TEveStraightLineSet("Cross");
  TString title;
  if (use_sigma)
  {
    e[0] *= fx; e[1] *= fy; e[2] *= fz;
    title += Form("+- %.1f*sigma_x, %.1f*sigma_y, %.1f*sigma_z", fx, fy, fz);
  }
  else
  {
    e[0] = fx; e[1] = fy; e[2] = fz;
    title += Form("+- %.1f cm x %.1f cm x %.1f cm", fx, fy, fz);
  }
  title += Form("\nx=%.5f, y=%.5f, z=%.5f\nsx=%.5f, sy=%.5f, sz=%.5f",
		x[0], x[1], x[2], e[0], e[1], e[2]);
  ls->SetTitle(title);

  ls->AddLine(e[0], 0,    0,   -e[0], 0,    0);
  ls->AddLine(0,    e[1], 0,    0,   -e[1], 0);
  ls->AddLine(0,    0,    e[2], 0,    0,   -e[2]);

  ls->RefMainTrans().SetPos(x);
  return ls;
}

TEveStraightLineSet*
make_vertex_ellipse(const AliESDVertex* v, Bool_t use_sigma, Float_t fx, Float_t fy, Float_t fz)
{
  Double_t x[3], e[3];
  v->GetXYZ(x); v->GetSigmaXYZ(e);

  TEveStraightLineSet* ls = new TEveStraightLineSet("Ellipse");
  TString title;
  if (use_sigma)
  {
    e[0] *= fx; e[1] *= fy; e[2] *= fz;
    title += Form("+- %.1f*sigma_x, %.1f*sigma_y, %.1f sigma_z", fx, fy, fz);
  }
  else
  {
    e[0] = fx; e[1] = fy; e[2] = fz;
    title += Form("+- %.1f cm x %.1f cm x %.1f cm", fx, fy, fz);
  }
  title += Form("\nx=%.5f, y=%.5f, z=%.5f\nsx=%.5f, sy=%.5f, sz=%.5f",
		x[0], x[1], x[2], e[0], e[1], e[2]);
  ls->SetTitle(title);

  const Int_t   N = 32;
  const Float_t S = 2*TMath::Pi()/N;

  Float_t a = e[0], b = e[1];
  for (Int_t i = 0; i<N; i++)
    ls->AddLine(a*TMath::Cos(i*S)  , b*TMath::Sin(i*S)  , 0,
		a*TMath::Cos(i*S+S), b*TMath::Sin(i*S+S), 0);

  a = e[0]; b = e[2];
  for (Int_t i = 0; i<N; i++)
    ls->AddLine(a*TMath::Cos(i*S)  , 0, b*TMath::Sin(i*S),
		a*TMath::Cos(i*S+S), 0, b*TMath::Sin(i*S+S));

  a = e[1]; b = e[2];
  for (Int_t i = 0; i<N; i++)
    ls->AddLine(0, a*TMath::Cos(i*S)  ,  b*TMath::Sin(i*S),
		0, a*TMath::Cos(i*S+S),  b*TMath::Sin(i*S+S));

  ls->RefMainTrans().SetPos(x);
  return ls;
}

TEveStraightLineSet*
make_vertex_box(const AliESDVertex* v, Bool_t use_sigma, Float_t fx, Float_t fy, Float_t fz)
{
  Double_t x[3], e[3];
  v->GetXYZ(x); v->GetSigmaXYZ(e);

  TEveStraightLineSet* ls = new TEveStraightLineSet("Box");
  TString title;
  if (use_sigma)
  {
    e[0] *= fx; e[1] *= fy; e[2] *= fz;
    title += Form("+- %.1f*sigma_x, %.1f*sigma_y, %.1f*sigma_z", fx, fy, fz);
  }
  else
  {
    e[0] = fx; e[1] = fy; e[2] = fz;
    title += Form("+- %.1f cm x %.1f cm x %.1f cm", fx, fy, fz);
  }
  title += Form("\nx=%.5f, y=%.5f, z=%.5f\nsx=%.5f, sy=%.5f, sz=%.5f",
		x[0], x[1], x[2], e[0], e[1], e[2]);
  ls->SetTitle(title);

  // pos z
  ls->AddLine( e[0],  e[1],  e[2],  e[0], -e[1],  e[2]);
  ls->AddLine( e[0], -e[1],  e[2], -e[0], -e[1],  e[2]);
  ls->AddLine(-e[0], -e[1],  e[2], -e[0],  e[1],  e[2]);
  ls->AddLine(-e[0],  e[1],  e[2],  e[0],  e[1],  e[2]);
  // lines along z
  ls->AddLine( e[0],  e[1],  e[2],  e[0],  e[1], -e[2]);
  ls->AddLine( e[0], -e[1],  e[2],  e[0], -e[1], -e[2]);
  ls->AddLine(-e[0], -e[1],  e[2], -e[0], -e[1], -e[2]);
  ls->AddLine(-e[0],  e[1],  e[2], -e[0],  e[1], -e[2]);
  // neg z
  ls->AddLine( e[0],  e[1], -e[2],  e[0], -e[1], -e[2]);
  ls->AddLine( e[0], -e[1], -e[2], -e[0], -e[1], -e[2]);
  ls->AddLine(-e[0], -e[1], -e[2], -e[0],  e[1], -e[2]);
  ls->AddLine(-e[0],  e[1], -e[2],  e[0],  e[1], -e[2]);

  ls->RefMainTrans().SetPos(x);
  return ls;
}


//==============================================================================
// Element making functions
//==============================================================================

TEveStraightLineSet*
primary_vertex(Bool_t use_sigma=kTRUE, Float_t fx=1, Float_t fy=1, Float_t fz=1)
{
  AliESDEvent  *esd = AliEveEventManager::AssertESD();
  const AliESDVertex *pv  = esd->GetPrimaryVertex();
  if ( ! pv->GetStatus()) {
    Info("primary_vertex", "Primary vertex not available.");
    return 0;
  }

  TEveStraightLineSet* ls = make_vertex_cross(pv, use_sigma, fx, fy, fz);
  ls->ApplyVizTag("REC PVTX");
  assert_vertex_parent("Primary Vertex", 7)->AddElement(ls);
  gEve->Redraw3D();
  return ls;
}

TEveStraightLineSet*
primary_vertex_spd(Bool_t use_sigma=kTRUE, Float_t fx=1, Float_t fy=1, Float_t fz=1)
{
  AliESDEvent  *esd  = AliEveEventManager::AssertESD();
  const AliESDVertex *spdv = esd->GetPrimaryVertexSPD();
  if ( ! spdv->GetStatus()) {
    Info("primary_vertex_spd", "Primary vertex SPD not available.");
    return 0;
  }

  TEveStraightLineSet* ls = make_vertex_cross(spdv, use_sigma, fx, fy, fz);
  ls->ApplyVizTag("REC PVTX SPD");
  assert_vertex_parent("Primary Vertex SPD", 6)->AddElement(ls);
  gEve->Redraw3D();
  return ls;
}

TEveStraightLineSet*
primary_vertex_tpc(Bool_t use_sigma=kTRUE, Float_t fx=1, Float_t fy=1, Float_t fz=1)
{
  AliESDEvent  *esd  = AliEveEventManager::AssertESD();
  const AliESDVertex *tpcv = esd->GetPrimaryVertexTPC();
  if ( ! tpcv->GetStatus()) {
    Info("primary_vertex_tpc", "Primary vertex TPC not available.");
    return 0;
  }

  TEveStraightLineSet* ls = make_vertex_cross(tpcv, use_sigma, fx, fy, fz);
  ls->ApplyVizTag("REC PVTX TPC");
  assert_vertex_parent("Primary Vertex TPC", 5)->AddElement(ls);
  gEve->Redraw3D();
  return ls;
}

//------------------------------------------------------------------------------
// Ellipse
//------------------------------------------------------------------------------

TEveStraightLineSet*
primary_vertex_ellipse(Bool_t use_sigma=kTRUE, Float_t fx=30, Float_t fy=30, Float_t fz=10)
{
  AliESDEvent  *esd = AliEveEventManager::AssertESD();
  const AliESDVertex *pv  = esd->GetPrimaryVertex();
  if ( ! pv->GetStatus()) {
    Info("primary_vertex_ellipse", "Primary vertex not available.");
    return 0;
  }

  TEveStraightLineSet* ls = make_vertex_ellipse(pv, use_sigma, fx, fy, fz);
  ls->ApplyVizTag("REC PVTX Ellipse");
  assert_vertex_parent("Primary Vertex", 7)->AddElement(ls);
  gEve->Redraw3D();
  return ls;
}

TEveStraightLineSet*
primary_vertex_ellipse_spd(Bool_t use_sigma=kTRUE, Float_t fx=30, Float_t fy=30, Float_t fz=10)
{
  AliESDEvent  *esd  = AliEveEventManager::AssertESD();
  const AliESDVertex *spdv = esd->GetPrimaryVertexSPD();
  if ( ! spdv->GetStatus()) {
    Info("primary_vertex_ellipse_spd", "Primary vertex SPD not available.");
    return 0;
  }

  TEveStraightLineSet* ls = make_vertex_ellipse(spdv, use_sigma, fx, fy, fz);
  ls->ApplyVizTag("REC PVTX Ellipse SPD");
  assert_vertex_parent("Primary Vertex SPD", 6)->AddElement(ls);
  gEve->Redraw3D();
  return ls;
}

TEveStraightLineSet*
primary_vertex_ellipse_tpc(Bool_t use_sigma=kTRUE, Float_t fx=30, Float_t fy=30, Float_t fz=10)
{
  AliESDEvent  *esd  = AliEveEventManager::AssertESD();
  const AliESDVertex *tpcv = esd->GetPrimaryVertexTPC();
  if ( ! tpcv->GetStatus()) {
    Info("primary_vertex_ellipse_tpc", "Primary vertex TPC not available.");
    return 0;
  }

  TEveStraightLineSet* ls = make_vertex_ellipse(tpcv, use_sigma, fx, fy, fz);
  ls->ApplyVizTag("REC PVTX Ellipse TPC");
  assert_vertex_parent("Primary Vertex TPC", 5)->AddElement(ls);
  gEve->Redraw3D();
  return ls;
}

//------------------------------------------------------------------------------
// Box
//------------------------------------------------------------------------------

TEveStraightLineSet*
primary_vertex_box(Bool_t use_sigma=kTRUE, Float_t fx=30, Float_t fy=30, Float_t fz=10)
{
  AliESDEvent  *esd = AliEveEventManager::AssertESD();
  const AliESDVertex *pv  = esd->GetPrimaryVertex();
  if ( ! pv->GetStatus()) {
    Info("primary_vertex_box", "Primary vertex not available.");
    return 0;
  }

  TEveStraightLineSet* ls = make_vertex_box(pv, use_sigma, fx, fy, fz);
  ls->ApplyVizTag("REC PVTX Box");
  assert_vertex_parent("Primary Vertex", 7)->AddElement(ls);
  gEve->Redraw3D();
  return ls;
}

TEveStraightLineSet*
primary_vertex_box_spd(Bool_t use_sigma=kTRUE, Float_t fx=30, Float_t fy=30, Float_t fz=10)
{
  AliESDEvent  *esd  = AliEveEventManager::AssertESD();
  const AliESDVertex *spdv = esd->GetPrimaryVertexSPD();
  if ( ! spdv->GetStatus()) {
    Info("primary_vertex_box_spd", "Primary vertex SPD not available.");
    return 0;
  }

  TEveStraightLineSet* ls = make_vertex_box(spdv, use_sigma, fx, fy, fz);
  ls->ApplyVizTag("REC PVTX Box SPD");
  assert_vertex_parent("Primary Vertex SPD", 6)->AddElement(ls);
  gEve->Redraw3D();
  return ls;
}

TEveStraightLineSet*
primary_vertex_box_tpc(Bool_t use_sigma=kTRUE, Float_t fx=30, Float_t fy=30, Float_t fz=10)
{
  AliESDEvent  *esd  = AliEveEventManager::AssertESD();
  const AliESDVertex *tpcv = esd->GetPrimaryVertexTPC();
  if ( ! tpcv->GetStatus()) {
    Info("primary_vertex_box_tpc", "Primary vertex TPC not available.");
    return 0;
  }

  TEveStraightLineSet* ls = make_vertex_box(tpcv, use_sigma, fx, fy, fz);
  ls->ApplyVizTag("REC PVTX Box TPC");
  assert_vertex_parent("Primary Vertex TPC", 5)->AddElement(ls);
  gEve->Redraw3D();
  return ls;
}
 primary_vertex.C:1
 primary_vertex.C:2
 primary_vertex.C:3
 primary_vertex.C:4
 primary_vertex.C:5
 primary_vertex.C:6
 primary_vertex.C:7
 primary_vertex.C:8
 primary_vertex.C:9
 primary_vertex.C:10
 primary_vertex.C:11
 primary_vertex.C:12
 primary_vertex.C:13
 primary_vertex.C:14
 primary_vertex.C:15
 primary_vertex.C:16
 primary_vertex.C:17
 primary_vertex.C:18
 primary_vertex.C:19
 primary_vertex.C:20
 primary_vertex.C:21
 primary_vertex.C:22
 primary_vertex.C:23
 primary_vertex.C:24
 primary_vertex.C:25
 primary_vertex.C:26
 primary_vertex.C:27
 primary_vertex.C:28
 primary_vertex.C:29
 primary_vertex.C:30
 primary_vertex.C:31
 primary_vertex.C:32
 primary_vertex.C:33
 primary_vertex.C:34
 primary_vertex.C:35
 primary_vertex.C:36
 primary_vertex.C:37
 primary_vertex.C:38
 primary_vertex.C:39
 primary_vertex.C:40
 primary_vertex.C:41
 primary_vertex.C:42
 primary_vertex.C:43
 primary_vertex.C:44
 primary_vertex.C:45
 primary_vertex.C:46
 primary_vertex.C:47
 primary_vertex.C:48
 primary_vertex.C:49
 primary_vertex.C:50
 primary_vertex.C:51
 primary_vertex.C:52
 primary_vertex.C:53
 primary_vertex.C:54
 primary_vertex.C:55
 primary_vertex.C:56
 primary_vertex.C:57
 primary_vertex.C:58
 primary_vertex.C:59
 primary_vertex.C:60
 primary_vertex.C:61
 primary_vertex.C:62
 primary_vertex.C:63
 primary_vertex.C:64
 primary_vertex.C:65
 primary_vertex.C:66
 primary_vertex.C:67
 primary_vertex.C:68
 primary_vertex.C:69
 primary_vertex.C:70
 primary_vertex.C:71
 primary_vertex.C:72
 primary_vertex.C:73
 primary_vertex.C:74
 primary_vertex.C:75
 primary_vertex.C:76
 primary_vertex.C:77
 primary_vertex.C:78
 primary_vertex.C:79
 primary_vertex.C:80
 primary_vertex.C:81
 primary_vertex.C:82
 primary_vertex.C:83
 primary_vertex.C:84
 primary_vertex.C:85
 primary_vertex.C:86
 primary_vertex.C:87
 primary_vertex.C:88
 primary_vertex.C:89
 primary_vertex.C:90
 primary_vertex.C:91
 primary_vertex.C:92
 primary_vertex.C:93
 primary_vertex.C:94
 primary_vertex.C:95
 primary_vertex.C:96
 primary_vertex.C:97
 primary_vertex.C:98
 primary_vertex.C:99
 primary_vertex.C:100
 primary_vertex.C:101
 primary_vertex.C:102
 primary_vertex.C:103
 primary_vertex.C:104
 primary_vertex.C:105
 primary_vertex.C:106
 primary_vertex.C:107
 primary_vertex.C:108
 primary_vertex.C:109
 primary_vertex.C:110
 primary_vertex.C:111
 primary_vertex.C:112
 primary_vertex.C:113
 primary_vertex.C:114
 primary_vertex.C:115
 primary_vertex.C:116
 primary_vertex.C:117
 primary_vertex.C:118
 primary_vertex.C:119
 primary_vertex.C:120
 primary_vertex.C:121
 primary_vertex.C:122
 primary_vertex.C:123
 primary_vertex.C:124
 primary_vertex.C:125
 primary_vertex.C:126
 primary_vertex.C:127
 primary_vertex.C:128
 primary_vertex.C:129
 primary_vertex.C:130
 primary_vertex.C:131
 primary_vertex.C:132
 primary_vertex.C:133
 primary_vertex.C:134
 primary_vertex.C:135
 primary_vertex.C:136
 primary_vertex.C:137
 primary_vertex.C:138
 primary_vertex.C:139
 primary_vertex.C:140
 primary_vertex.C:141
 primary_vertex.C:142
 primary_vertex.C:143
 primary_vertex.C:144
 primary_vertex.C:145
 primary_vertex.C:146
 primary_vertex.C:147
 primary_vertex.C:148
 primary_vertex.C:149
 primary_vertex.C:150
 primary_vertex.C:151
 primary_vertex.C:152
 primary_vertex.C:153
 primary_vertex.C:154
 primary_vertex.C:155
 primary_vertex.C:156
 primary_vertex.C:157
 primary_vertex.C:158
 primary_vertex.C:159
 primary_vertex.C:160
 primary_vertex.C:161
 primary_vertex.C:162
 primary_vertex.C:163
 primary_vertex.C:164
 primary_vertex.C:165
 primary_vertex.C:166
 primary_vertex.C:167
 primary_vertex.C:168
 primary_vertex.C:169
 primary_vertex.C:170
 primary_vertex.C:171
 primary_vertex.C:172
 primary_vertex.C:173
 primary_vertex.C:174
 primary_vertex.C:175
 primary_vertex.C:176
 primary_vertex.C:177
 primary_vertex.C:178
 primary_vertex.C:179
 primary_vertex.C:180
 primary_vertex.C:181
 primary_vertex.C:182
 primary_vertex.C:183
 primary_vertex.C:184
 primary_vertex.C:185
 primary_vertex.C:186
 primary_vertex.C:187
 primary_vertex.C:188
 primary_vertex.C:189
 primary_vertex.C:190
 primary_vertex.C:191
 primary_vertex.C:192
 primary_vertex.C:193
 primary_vertex.C:194
 primary_vertex.C:195
 primary_vertex.C:196
 primary_vertex.C:197
 primary_vertex.C:198
 primary_vertex.C:199
 primary_vertex.C:200
 primary_vertex.C:201
 primary_vertex.C:202
 primary_vertex.C:203
 primary_vertex.C:204
 primary_vertex.C:205
 primary_vertex.C:206
 primary_vertex.C:207
 primary_vertex.C:208
 primary_vertex.C:209
 primary_vertex.C:210
 primary_vertex.C:211
 primary_vertex.C:212
 primary_vertex.C:213
 primary_vertex.C:214
 primary_vertex.C:215
 primary_vertex.C:216
 primary_vertex.C:217
 primary_vertex.C:218
 primary_vertex.C:219
 primary_vertex.C:220
 primary_vertex.C:221
 primary_vertex.C:222
 primary_vertex.C:223
 primary_vertex.C:224
 primary_vertex.C:225
 primary_vertex.C:226
 primary_vertex.C:227
 primary_vertex.C:228
 primary_vertex.C:229
 primary_vertex.C:230
 primary_vertex.C:231
 primary_vertex.C:232
 primary_vertex.C:233
 primary_vertex.C:234
 primary_vertex.C:235
 primary_vertex.C:236
 primary_vertex.C:237
 primary_vertex.C:238
 primary_vertex.C:239
 primary_vertex.C:240
 primary_vertex.C:241
 primary_vertex.C:242
 primary_vertex.C:243
 primary_vertex.C:244
 primary_vertex.C:245
 primary_vertex.C:246
 primary_vertex.C:247
 primary_vertex.C:248
 primary_vertex.C:249
 primary_vertex.C:250
 primary_vertex.C:251
 primary_vertex.C:252
 primary_vertex.C:253
 primary_vertex.C:254
 primary_vertex.C:255
 primary_vertex.C:256
 primary_vertex.C:257
 primary_vertex.C:258
 primary_vertex.C:259
 primary_vertex.C:260
 primary_vertex.C:261
 primary_vertex.C:262
 primary_vertex.C:263
 primary_vertex.C:264
 primary_vertex.C:265
 primary_vertex.C:266
 primary_vertex.C:267
 primary_vertex.C:268
 primary_vertex.C:269
 primary_vertex.C:270
 primary_vertex.C:271
 primary_vertex.C:272
 primary_vertex.C:273
 primary_vertex.C:274
 primary_vertex.C:275
 primary_vertex.C:276
 primary_vertex.C:277
 primary_vertex.C:278
 primary_vertex.C:279
 primary_vertex.C:280
 primary_vertex.C:281
 primary_vertex.C:282
 primary_vertex.C:283
 primary_vertex.C:284
 primary_vertex.C:285
 primary_vertex.C:286
 primary_vertex.C:287
 primary_vertex.C:288
 primary_vertex.C:289
 primary_vertex.C:290
 primary_vertex.C:291
 primary_vertex.C:292
 primary_vertex.C:293
 primary_vertex.C:294
 primary_vertex.C:295
 primary_vertex.C:296
 primary_vertex.C:297
 primary_vertex.C:298
 primary_vertex.C:299
 primary_vertex.C:300
 primary_vertex.C:301
 primary_vertex.C:302
 primary_vertex.C:303
 primary_vertex.C:304
 primary_vertex.C:305
 primary_vertex.C:306
 primary_vertex.C:307
 primary_vertex.C:308
 primary_vertex.C:309
 primary_vertex.C:310
 primary_vertex.C:311
 primary_vertex.C:312
 primary_vertex.C:313
 primary_vertex.C:314
 primary_vertex.C:315
 primary_vertex.C:316
 primary_vertex.C:317
 primary_vertex.C:318
 primary_vertex.C:319
 primary_vertex.C:320
 primary_vertex.C:321
 primary_vertex.C:322
 primary_vertex.C:323
 primary_vertex.C:324
 primary_vertex.C:325
 primary_vertex.C:326
 primary_vertex.C:327