ROOT logo
#ifndef __CINT__
#include <TEveManager.h>
#include <TEvePointSet.h>
#include <TGeoManager.h>
#include <EveBase/AliEveEventManager.h>

#include "AliRunLoader.h"
#include "AliCluster.h"
#include "AliTracker.h"
#include "AliReconstruction.h"
#include "AliESDEvent.h"
#include "AliESDtrack.h"
#include "AliESDfriend.h"

#include "AliITSRecoParam.h"
#endif

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

  AliRunLoader *rl        = AliEveEventManager::AssertRunLoader();
  AliESDEvent  *esd       = AliEveEventManager::AssertESD();
  AliEveEventManager::AssertESDfriend();
  AliEveEventManager::AssertMagField();

  const char* detNames[] = { "ITS", "TPC", /*"TRD",*/ "TOF", "HMPID" };
  const Int_t detIds[]   = {   0,     1,   /*  2,  */   3,     5   };
  const Int_t detN       = sizeof(detNames)/sizeof(char*);

  // Hack - AliReconstruction does wonders with gGeoManager.
  TGeoManager* xxx = gGeoManager; gGeoManager = 0;
  AliReconstruction* reco = new AliReconstruction;
  gGeoManager = xxx;

  // Hack for ITS - it requires RecoParams outside event-loop!
  reco->SetRecoParam("ITS", AliITSRecoParam::GetLowFluxParam());

  reco->ImportRunLoader(rl);
  {
    TString alldets;
    for (Int_t i = 0; i < detN; ++i) {
      alldets += detNames[i];
      alldets += " ";
    }
    reco->CreateTrackers(alldets);
  }

  TObjArray* clarr = new TObjArray();

  // Load clusters, fill them into clarr.

  for (Int_t i = 0; i < detN; ++i)
  {
    Int_t det = detIds[i];
    rl->LoadRecPoints(detNames[i]);

    TTree *cTree = rl->GetTreeR(detNames[i], false);
    if (cTree == 0)
      continue;

    AliTracker* tracker = reco->GetTracker(det);
    if (tracker == 0) continue;
    tracker->LoadClusters(cTree);
    tracker->FillClusterArray(clarr);
  }

  // Loop over tracks and friends, tag used clusters.

  for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
  {
    AliESDtrack* at = esd->GetTrack(n);

    Int_t idx[200];
    for (Int_t i = 0; i < detN; ++i)
    {
      Int_t det = detIds[i];
      AliTracker* tracker = reco->GetTracker(det);
      if (tracker == 0) continue;
      Int_t nclusters = at->GetClusters(det, idx);
      Int_t p=0;
      for (Int_t c = 0; c < nclusters; )
      {
        Int_t index = idx[p++];
        if (index < 0) continue;
        c++;
        AliCluster* cluster = tracker->GetCluster(index);
        if (cluster) cluster->IncreaseClusterUsage();
        //else printf("Zero cluster pointer for detector: %s\n",detNames[i]);
      }
    }
  }

  for (Int_t i = 0; i < detN; ++i)
    rl->UnloadRecPoints(detNames[i]);

  // Fill visualization structs

  TEveElementList* list = new TEveElementList("Clusters");
  gEve->AddElement(list);

  TEvePointSet* shared = new TEvePointSet("Shared Clusters");
  shared->SetMainColor(2);
  shared->SetMarkerSize(0.4);
  shared->SetMarkerStyle(2);
  list->AddElement(shared);

  TEvePointSet* used = new TEvePointSet("Single-used Clusters");
  used->SetMainColor(3);
  used->SetMarkerSize(0.4);
  used->SetMarkerStyle(2);
  list->AddElement(used);

  TEvePointSet* nonused = new TEvePointSet("Not-used Clusters");
  nonused->SetMainColor(4);
  nonused->SetMarkerSize(0.4);
  nonused->SetMarkerStyle(2);
  list->AddElement(nonused);

  // Loop over all clusters, fill appropriate container based
  // on shared/used information.

  Int_t ncl = clarr->GetEntriesFast();
  for (Int_t i = 0; i < ncl; ++i)
  {
    AliCluster   *cluster = (AliCluster*) clarr->UncheckedAt(i);
    TEvePointSet *dest    = 0;
    if (cluster->IsClusterShared())
      dest = shared;
    else if (cluster->IsClusterUsed())
      dest = used;
    else
      dest = nonused;

    Float_t g[3]; //global coordinates
    cluster->GetGlobalXYZ(g);
    dest->SetNextPoint(g[0], g[1], g[2]);
    dest->SetPointId(cluster);
  }

  delete clarr;

  // ??? What to do with trackers ???
  // I'd propose: have global reconstruction that owns them.
  // AliEveEventManager::AssertAliReconstruction();
  // do we have bit-field for detectors, like
  // enum AliDetectors_e {
  //    kITS = BIT(0),
  //    kTPC = BIT(1),
  //    ...
  //    kCentralTracking = kITS | kTPC | kTRD | kTOF,
  //    ...
  //  };

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