]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/alice-macros/clusters.C
AliEveMacro
[u/mrichter/AliRoot.git] / EVE / alice-macros / clusters.C
1 #ifndef __CINT__
2 #include <TEveManager.h>
3 #include <TEvePointSet.h>
4 #include <TGeoManager.h>
5 #include <EveBase/AliEveEventManager.h>
6
7 #include "AliRunLoader.h"
8 #include "AliCluster.h"
9 #include "AliTracker.h"
10 #include "AliReconstruction.h"
11 #include "AliESDEvent.h"
12 #include "AliESDtrack.h"
13 #include "AliESDfriend.h"
14
15 #include "ITS/AliITSRecoParam.h"
16 #endif
17
18 void clusters()
19 {
20   AliEveEventManager::AssertGeometry();
21
22   AliRunLoader *rl        = AliEveEventManager::AssertRunLoader();
23   AliESDEvent  *esd       = AliEveEventManager::AssertESD();
24   AliESDfriend *esdfriend = AliEveEventManager::AssertESDfriend();
25   AliMagF      *magfield  = AliEveEventManager::AssertMagField();
26
27   AliTracker::SetFieldMap(magfield, kFALSE);
28
29   const char* detNames[] = { "ITS", "TPC", "TRD", "TOF", "HMPID" };
30   const Int_t detIds[]   = {   0,     1,     2,     3,     5   };
31   const Int_t detN       = sizeof(detNames)/sizeof(char*);
32
33   // Hack - AliReconstruction does wonders with gGeoManager.
34   TGeoManager* xxx = gGeoManager; gGeoManager = 0;
35   AliReconstruction* reco = new AliReconstruction;
36   gGeoManager = xxx;
37
38   // Hack for ITS - it requires RecoParams outside event-loop!
39   reco->SetRecoParam("ITS", AliITSRecoParam::GetLowFluxParam());
40
41   reco->ImportRunLoader(rl);
42   {
43     TString alldets;
44     for (Int_t i = 0; i < detN; ++i) {
45       alldets += detNames[i];
46       alldets += " ";
47     }
48     reco->CreateTrackers(alldets);
49   }
50
51   TObjArray* clarr = new TObjArray();
52
53   // Load clusters, fill them into clarr.
54
55   for (Int_t i = 0; i < detN; ++i)
56   {
57     Int_t det = detIds[i];
58     rl->LoadRecPoints(detNames[i]);
59
60     TTree *cTree = rl->GetTreeR(detNames[i], false);
61     if (cTree == 0)
62       continue;
63
64     AliTracker* tracker = reco->GetTracker(det);
65     if (tracker == 0) continue;
66     tracker->LoadClusters(cTree);
67     tracker->FillClusterArray(clarr);
68   }
69
70   // Loop over tracks and friends, tag used clusters.
71
72   for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
73   {
74     AliESDtrack* at = esd->GetTrack(n);
75
76     Int_t idx[200];
77     for (Int_t i = 0; i < detN; ++i)
78     {
79       Int_t det = detIds[i];
80       AliTracker* tracker = reco->GetTracker(det);
81       if (tracker == 0) continue;
82       Int_t nclusters = at->GetClusters(det, idx);
83       Int_t p=0;
84       for (Int_t c = 0; c < nclusters; )
85       {
86         Int_t index = idx[p++];
87         if (index < 0) continue;
88         c++;
89         AliCluster* cluster = tracker->GetCluster(index);
90         if (cluster) cluster->IncreaseClusterUsage();
91         //else printf("Zero cluster pointer for detector: %s\n",detNames[i]);
92       }
93     }
94   }
95
96   for (Int_t i = 0; i < detN; ++i)
97     rl->UnloadRecPoints(detNames[i]);
98
99   // Fill visualization structs
100
101   TEveElementList* list = new TEveElementList("Clusters");
102   gEve->AddElement(list);
103
104   TEvePointSet* shared = new TEvePointSet("Shared Clusters");
105   shared->SetMainColor(2);
106   shared->SetMarkerSize(0.4);
107   shared->SetMarkerStyle(2);
108   list->AddElement(shared);
109
110   TEvePointSet* used = new TEvePointSet("Single-used Clusters");
111   used->SetMainColor(3);
112   used->SetMarkerSize(0.4);
113   used->SetMarkerStyle(2);
114   list->AddElement(used);
115
116   TEvePointSet* nonused = new TEvePointSet("Not-used Clusters");
117   nonused->SetMainColor(4);
118   nonused->SetMarkerSize(0.4);
119   nonused->SetMarkerStyle(2);
120   list->AddElement(nonused);
121
122   // Loop over all clusters, fill appropriate container based
123   // on shared/used information.
124
125   Int_t ncl = clarr->GetEntriesFast();
126   for (Int_t i = 0; i < ncl; ++i)
127   {
128     AliCluster   *cluster = (AliCluster*) clarr->UncheckedAt(i);
129     TEvePointSet *dest    = 0;
130     if (cluster->IsClusterShared())
131       dest = shared;
132     else if (cluster->IsClusterUsed())
133       dest = used;
134     else
135       dest = nonused;
136
137     Float_t g[3]; //global coordinates
138     cluster->GetGlobalXYZ(g);
139     dest->SetNextPoint(g[0], g[1], g[2]);
140     dest->SetPointId(cluster);
141   }
142
143   delete clarr;
144
145   // ??? What to do with trackers ???
146   // I'd propose: have global reconstruction that owns them.
147   // AliEveEventManager::AssertAliReconstruction();
148   // do we have bit-field for detectors, like
149   // enum AliDetectors_e {
150   //    kITS = BIT(0),
151   //    kTPC = BIT(1),
152   //    ...
153   //    kCentralTracking = kITS | kTPC | kTRD | kTOF,
154   //    ...
155   //  };
156
157   gEve->Redraw3D();
158 }