ROOT logo
#if !defined(__CINT__) || defined(__MAKECINT__)
#include <TGeoManager.h>
#include <TGeoShape.h>
#include <TGeoMatrix.h>
#include <TStyle.h>
#include <TEveRGBAPalette.h>
#include <TEveGeoShape.h>
#include <TEveStraightLineSet.h>
#include <TEveManager.h>
#include <TEveElement.h>

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

TEveRGBAPalette *g_zdc_palette = 0;
Float_t          g_zdc_scale   = 0.1;
Float_t          g_zdc_dist    = 11695;
Float_t          g_zdc_cross   = 20;

TEveGeoShape* zdc_make_shape(const Text_t* name, const Text_t* title_base,
			     Double_t signal,    const Text_t* path)
{
  if ( ! gGeoManager->cd(path))
  {
    Warning("zdc_make_shape", "Module name=%s, path='%s' not found.\n", name, path);
    return 0;
  }

  UChar_t rgb[3];
  g_zdc_palette->ColorFromValue(TMath::Nint(signal), rgb, kFALSE);

  TGeoShape *gs = (TGeoShape*) gGeoManager->GetCurrentVolume()->GetShape()->Clone();

  TEveGeoShape *s = new TEveGeoShape(name, Form("%s %s, E=%.3f", title_base, name, signal));
  s->SetPickable(kTRUE);
  s->SetMainColorRGB(rgb[0], rgb[1], rgb[2]);
  s->SetShape(gs);
  s->RefMainTrans().SetFrom(*gGeoManager->GetCurrentMatrix());

  // Scale z-dictance by 0.1
  Double_t* t = s->RefMainTrans().ArrT();
  t[2] *= g_zdc_scale;

  return s;
}

TEveStraightLineSet*
zdc_make_cross(const Text_t* name, const Text_t* title_base,
               Float_t x, Float_t y, Float_t z, Float_t dx, Float_t dy, Float_t dz)
{
  TEveStraightLineSet* ls = new TEveStraightLineSet(name, Form("%s, x=%.3f, y=%.3f", title_base, x, y));
  ls->SetMainColor(kYellow);
  ls->SetLineWidth(2);
  ls->RefMainTrans().SetPos(x, y, z);
  ls->AddLine(dx, 0,  0, -dx, 0,  0);
  ls->AddLine(0,  dy, 0,  0, -dy, 0);
  ls->AddLine(0,  0,  dz, 0,  0, -dz);

  return ls;
}

// ???? There are 5 towers in ESD, 4 in geom.
// Not sure about assignment A/C <-> 1/2

void esd_zdc() 
{
  AliEveEventManager::AssertGeometry();

  AliESDZDC *esd = AliEveEventManager::AssertESD()->GetESDZDC();

  if (g_zdc_palette == 0)
  {
    // Map values from 0, 50 on a spectrum palette.
    g_zdc_palette = new TEveRGBAPalette(0, 50, kTRUE, kFALSE);
    g_zdc_palette->IncRefCount();
    gStyle->SetPalette(1, 0);
    g_zdc_palette->SetupColorArray();
  }

  TEveElementList* l = new TEveElementList("ZDC Data", "");
  gEve->AddElement(l);

  TEveElementList *c  = 0;
  const Double_t  *te = 0;
  const Text_t    *tb = 0;

  // ZNC geometry ------------------------------------
  tb = "ZNC";
  c = new TEveElementList(tb);
  l->AddElement(c);

  te = esd->GetZN1TowerEnergy();

  c->AddElement(zdc_make_shape("Tower 1", tb, te[1],
			       "ALIC_1/ZDCC_1/ZNEU_1/ZNTX_1/ZN1_1"));

  c->AddElement(zdc_make_shape("Tower 2", tb, te[2],
			       "ALIC_1/ZDCC_1/ZNEU_1/ZNTX_1/ZN1_2"));

  c->AddElement(zdc_make_shape("Tower 3", tb, te[3],
			       "ALIC_1/ZDCC_1/ZNEU_1/ZNTX_2/ZN1_1"));

  c->AddElement(zdc_make_shape("Tower 4", tb, te[4],
			       "ALIC_1/ZDCC_1/ZNEU_1/ZNTX_2/ZN1_2"));

  // ZNA geometry
  tb = "ZNA";
  c = new TEveElementList(tb);
  l->AddElement(c);

  te = esd->GetZN2TowerEnergy();

  c->AddElement(zdc_make_shape("Tower 1", tb, te[1],
			       "ALIC_1/ZDCA_1/ZNEU_2/ZNTX_1/ZN1_1"));

  c->AddElement(zdc_make_shape("Tower 2", tb, te[2],
			       "ALIC_1/ZDCA_1/ZNEU_2/ZNTX_1/ZN1_2"));

  c->AddElement(zdc_make_shape("Tower 3", tb, te[3],
			       "ALIC_1/ZDCA_1/ZNEU_2/ZNTX_2/ZN1_1"));

  c->AddElement(zdc_make_shape("Tower 4", tb, te[4],
			       "ALIC_1/ZDCA_1/ZNEU_2/ZNTX_2/ZN1_2"));


  // ZPC geometry ------------------------------------
  tb = "ZPC";
  c = new TEveElementList(tb);
  l->AddElement(c);

  te = esd->GetZP1TowerEnergy();

  c->AddElement(zdc_make_shape("Tower 1", tb, te[1],
			       "ALIC_1/ZDCC_1/ZPRO_1/ZPTX_1/ZP1_1"));

  c->AddElement(zdc_make_shape("Tower 2", tb, te[2],
			       "ALIC_1/ZDCC_1/ZPRO_1/ZPTX_2/ZP1_1"));

  c->AddElement(zdc_make_shape("Tower 3", tb, te[3],
			       "ALIC_1/ZDCC_1/ZPRO_1/ZPTX_3/ZP1_1"));

  c->AddElement(zdc_make_shape("Tower 4", tb, te[4],
			       "ALIC_1/ZDCC_1/ZPRO_1/ZPTX_4/ZP1_1"));

  // ZPA geometry
  tb = "ZPA";
  c = new TEveElementList(tb);
  l->AddElement(c);

  te = esd->GetZP2TowerEnergy();

  c->AddElement(zdc_make_shape("Tower 1", tb, te[1],
			       "ALIC_1/ZDCA_1/ZPRO_2/ZPTX_1/ZP1_1"));

  c->AddElement(zdc_make_shape("Tower 2", tb, te[2],
			       "ALIC_1/ZDCA_1/ZPRO_2/ZPTX_2/ZP1_1"));

  c->AddElement(zdc_make_shape("Tower 3", tb, te[3],
			       "ALIC_1/ZDCA_1/ZPRO_2/ZPTX_3/ZP1_1"));

  c->AddElement(zdc_make_shape("Tower 4", tb, te[4],
			       "ALIC_1/ZDCA_1/ZPRO_2/ZPTX_4/ZP1_1"));


  // Centroids
  /*
  TEveStraightLineSet *ls = 0;

  const Double32_t *cNA = esd->GetZNACentroid();
  ls = zdc_make_cross("ZNA Centroid", "ZNA",
                      cNA[0], cNA[1],  g_zdc_dist * g_zdc_scale,
                      g_zdc_cross, g_zdc_cross, g_zdc_cross);
  l->AddElement(ls);

  const Double32_t *cNC = esd->GetZNCCentroid();
  ls = zdc_make_cross("ZNA Centroid", "ZNA",
                      cNC[0], cNC[1], -g_zdc_dist * g_zdc_scale,
                      g_zdc_cross, g_zdc_cross, g_zdc_cross);
  l->AddElement(ls);
  */

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