ROOT logo
// $Id$
// Main authors: Adam Jacholkowski & Matevz Tadel: 2009

/**************************************************************************
 * 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 <TGLViewer.h>
#include <TGLCameraOverlay.h>
#include <TEveManager.h>
#include <TEveBrowser.h>
#include <TEveViewer.h>
#include <TEveScene.h>
#include <TEvePointSet.h>

#include <AliCluster.h>
#include <AliESDEvent.h>
#include <AliESDVertex.h>
#include <AliRunLoader.h>
#include <AliTPCClustersRow.h>
#include <AliEveEventManager.h>
#endif

TEveViewer *gVPTPCView   = 0;
TEveScene  *gVPTPCScene  = 0;

TEvePointSet* vplot_tpc(TEveElement* cont=0, Float_t maxR=270)
{
  if (gVPTPCView == 0)
  {
    TEveWindowSlot *slot    = 0;
    TEveBrowser    *browser = gEve->GetBrowser();

    slot = TEveWindow::CreateWindowInTab(browser->GetTabRight());
    slot->MakeCurrent();
    gVPTPCView  = gEve->SpawnNewViewer("V-Plot", "");
    gVPTPCScene = gEve->SpawnNewScene("V-Plot", "Scene holding elements for the V-Plot TPC.");
    gVPTPCView->AddScene(gVPTPCScene);

    TGLViewer *glv = gVPTPCView->GetGLViewer();
    glv->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
    glv->ResetCamerasAfterNextUpdate();

    TGLCameraOverlay* co = glv->GetCameraOverlay();
    co->SetShowOrthographic(true); //(false);
    co->SetOrthographicMode(TGLCameraOverlay::kAxis); // ::kPlaneIntersect or ::kBar
  }

  const Int_t kMaxCl=100*160;

  AliEveEventManager::AssertGeometry();

  Double_t pvert[3] = { 0, 0, 0 };
  if (AliEveEventManager::HasESD())
  {
    AliESDEvent  *esd  = AliEveEventManager::AssertESD();
    const AliESDVertex *tpcv = esd->GetPrimaryVertexTPC();
    if (tpcv->GetStatus())
      tpcv->GetXYZ(pvert);
    else
      Info("vplot_tpc", "Primary vertex TPC not available, using 0.");
  }
  else
  {
      Info("vplot_tpc", "ESD not available, using 0 for primary vertex.");
  }

  AliRunLoader* rl = AliEveEventManager::AssertRunLoader();
  rl->LoadRecPoints("TPC");

  TTree *cTree = rl->GetTreeR("TPC", false);
  if (cTree == 0)
    return 0;

  AliTPCClustersRow *clrow = new AliTPCClustersRow();
  clrow->SetClass("AliTPCclusterMI");
  clrow->SetArray(kMaxCl);
  cTree->SetBranchAddress("Segment", &clrow);

  TEvePointSet* vplot = new TEvePointSet(kMaxCl);
  vplot->SetOwnIds(kTRUE);

  const Float_t phimin = -3.15;
  const Float_t phimax =  3.15;
  const Float_t etamin = -1.2;
  const Float_t etamax =  1.2;
  const Float_t vconst =  0.0003;

  Float_t rhomax = 246.6;
  Float_t rholim, rhoup;
  Float_t zmax = 250.0;
  Float_t rho, eta, phi, theta;
  Float_t r3d, r3dmax, r3d1, r3d2;
  //
  Float_t maxRsqr = maxR*maxR;

  Int_t nentr = (Int_t) cTree->GetEntries();
  for (Int_t i = 0; i < nentr; ++i)
  {
    if (!cTree->GetEvent(i)) continue;

    TClonesArray *cl = clrow->GetArray();
    Int_t ncl = cl->GetEntriesFast();

    while (ncl--)
    {
      AliCluster *c = (AliCluster*) cl->UncheckedAt(ncl);
      Float_t g[3]; //global coordinates
      c->GetGlobalXYZ(g);
      g[0] -= pvert[0];
      g[1] -= pvert[1];
      g[2] -= pvert[2];
      if (g[0]*g[0] + g[1]*g[1] < maxRsqr)
      {
        phi    =  TMath::ATan2(g[1], g[0]);
        rho    =  TMath::Sqrt(g[0]*g[0] + g[1]*g[1]);
        theta  =  TMath::ATan2(rho, g[2]);
        eta    = -1.0*TMath::Log(TMath::Tan(0.5*theta));
        rhoup  =  zmax*rho / TMath::Abs(g[2]);
        rholim =  TMath::Min(rhoup,rhomax);
	// a version using rather r3d
        r3d    =  TMath::Sqrt(rho*rho + g[2]*g[2]);
        r3d1   =  rhomax / TMath::Sin(theta);
        r3d2   =  TMath::Abs(zmax/TMath::Cos(theta));
        r3dmax =  TMath::Min(r3d1, r3d2);

        if (eta>etamin && eta<etamax && phi>phimin && phi<phimax)
	{
	  Float_t deta = vconst*(r3dmax - r3d);

	  vplot->SetNextPoint(eta + deta, phi, 0);
	  vplot->SetNextPoint(eta - deta, phi, 0);
        }
      }
    }
    cl->Clear();
  }

  delete clrow;

  rl->UnloadRecPoints("TPC");

  if (vplot->Size() == 0 && gEve->GetKeepEmptyCont() == kFALSE)
  {
    Warning("vplot_tpc.C", "No TPC clusters were found.");
    delete vplot;
    return 0;
  }

  vplot->SetName("V=Plot TPC");
  vplot->SetTitle(Form("N=%d", vplot->Size() / 2));

  vplot->SetMainColor (kOrange);
  vplot->SetMarkerSize(0.2);
  vplot->SetMarkerStyle(1);
  // vplot->ApplyVizTag("V-Plot TPC", "V-Plot");

  if (cont)
  {
    cont->AddElement(vplot);
  }
  else
  {
    gVPTPCScene->AddElement(vplot);
  }
  AliEveEventManager::RegisterTransient(vplot);

  gEve->Redraw3D();

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