]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/alice-macros/primary_vertex.C
a41cae3cf08a8ed419710767d1a8d99e52d92b08
[u/mrichter/AliRoot.git] / EVE / alice-macros / primary_vertex.C
1 // $Id$
2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
3
4 /**************************************************************************
5  * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6  * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
7  * full copyright notice.                                                 *
8  **************************************************************************/
9
10
11 //==============================================================================
12 // Utilities
13 //==============================================================================
14
15 TEveCompound* assert_vertex_parent(const TString& name, Color_t col)
16 {
17   // !!! TEveCompound should have viz-db support ... add in root, then fix here,
18   // that is, remove the color var and pass viz-db tag.
19
20   TEveCompound* parent = dynamic_cast<TEveCompound*>
21     (AliEveEventManager::GetCurrent()->FindChild(name));
22   if (parent == 0)
23   {
24     parent = new TEveCompound(name);
25     parent->OpenCompound();
26     parent->SetMainColor(col);
27     AliEveEventManager::GetMaster()->AddElement(parent);
28   }
29   return parent;
30 }
31
32
33 //==============================================================================
34 // Functions to make a cross / ellipse / box
35 //==============================================================================
36
37 TEveStraightLineSet*
38 make_vertex_cross(AliESDVertex* v, Bool_t use_sigma, Float_t fx, Float_t fy, Float_t fz)
39 {
40   Double_t x[3], e[3];
41   v->GetXYZ(x); v->GetSigmaXYZ(e);
42
43   TEveStraightLineSet* ls = new TEveStraightLineSet("Cross");
44   TString title;
45   if (use_sigma)
46   {
47     e[0] *= fx; e[1] *= fy; e[2] *= fz;
48     title += Form("+- %.1f*sigma_x, %.1f*sigma_y, %.1f*sigma_z", fx, fy, fz);
49   }
50   else
51   {
52     e[0] = fx; e[1] = fy; e[2] = fz;
53     title += Form("+- %.1f cm x %.1f cm x %.1f cm", fx, fy, fz);
54   }
55   title += Form("\nx=%.5f, y=%.5f, z=%.5f\nsx=%.5f, sy=%.5f, sz=%.5f",
56                 x[0], x[1], x[2], e[0], e[1], e[2]);
57   ls.SetTitle(title);
58
59   ls->AddLine(e[0], 0,    0,   -e[0], 0,    0);
60   ls->AddLine(0,    e[1], 0,    0,   -e[1], 0);
61   ls->AddLine(0,    0,    e[2], 0,    0,   -e[2]);
62
63   ls->RefMainTrans().SetPos(x);
64   return ls;
65 }
66
67 TEveStraightLineSet*
68 make_vertex_ellipse(AliESDVertex* v, Bool_t use_sigma, Float_t fx, Float_t fy, Float_t fz)
69 {
70   Double_t x[3], e[3];
71   v->GetXYZ(x); v->GetSigmaXYZ(e);
72
73   TEveStraightLineSet* ls = new TEveStraightLineSet("Ellipse");
74   TString title;
75   if (use_sigma)
76   {
77     e[0] *= fx; e[1] *= fy; e[2] *= fz;
78     title += Form("+- %.1f*sigma_x, %.1f*sigma_y, %.1f sigma_z", fx, fy, fz);
79   }
80   else
81   {
82     e[0] = fx; e[1] = fy; e[2] = fz;
83     title += Form("+- %.1f cm x %.1f cm x %.1f cm", fx, fy, fz);
84   }
85   title += Form("\nx=%.5f, y=%.5f, z=%.5f\nsx=%.5f, sy=%.5f, sz=%.5f",
86                 x[0], x[1], x[2], e[0], e[1], e[2]);
87   ls.SetTitle(title);
88
89   const Int_t   N = 32;
90   const Float_t S = 2*TMath::Pi()/N;
91
92   Float_t a = e[0], b = e[1];
93   for (Int_t i = 0; i<N; i++)
94     ls->AddLine(a*TMath::Cos(i*S)  , b*TMath::Sin(i*S)  , 0,
95                 a*TMath::Cos(i*S+S), b*TMath::Sin(i*S+S), 0);
96
97   a = e[0]; b = e[2];
98   for (Int_t i = 0; i<N; i++)
99     ls->AddLine(a*TMath::Cos(i*S)  , 0, b*TMath::Sin(i*S),
100                 a*TMath::Cos(i*S+S), 0, b*TMath::Sin(i*S+S));
101
102   a = e[1]; b = e[2];
103   for (Int_t i = 0; i<N; i++)
104     ls->AddLine(0, a*TMath::Cos(i*S)  ,  b*TMath::Sin(i*S),
105                 0, a*TMath::Cos(i*S+S),  b*TMath::Sin(i*S+S));
106
107   ls->RefMainTrans().SetPos(x);
108   return ls;
109 }
110
111 TEveStraightLineSet*
112 make_vertex_box(AliESDVertex* v, Bool_t use_sigma, Float_t fx, Float_t fy, Float_t fz)
113 {
114   Double_t x[3], e[3];
115   v->GetXYZ(x); v->GetSigmaXYZ(e);
116
117   TEveStraightLineSet* ls = new TEveStraightLineSet("Box");
118   TString title;
119   if (use_sigma)
120   {
121     e[0] *= fx; e[1] *= fy; e[2] *= fz;
122     title += Form("+- %.1f*sigma_x, %.1f*sigma_y, %.1f*sigma_z", fx, fy, fz);
123   }
124   else
125   {
126     e[0] = fx; e[1] = fy; e[2] = fz;
127     title += Form("+- %.1f cm x %.1f cm x %.1f cm", fx, fy, fz);
128   }
129   title += Form("\nx=%.5f, y=%.5f, z=%.5f\nsx=%.5f, sy=%.5f, sz=%.5f",
130                 x[0], x[1], x[2], e[0], e[1], e[2]);
131   ls.SetTitle(title);
132
133   // pos z
134   ls->AddLine( e[0],  e[1],  e[2],  e[0], -e[1],  e[2]);
135   ls->AddLine( e[0], -e[1],  e[2], -e[0], -e[1],  e[2]);
136   ls->AddLine(-e[0], -e[1],  e[2], -e[0],  e[1],  e[2]);
137   ls->AddLine(-e[0],  e[1],  e[2],  e[0],  e[1],  e[2]);
138   // lines along z
139   ls->AddLine( e[0],  e[1],  e[2],  e[0],  e[1], -e[2]);
140   ls->AddLine( e[0], -e[1],  e[2],  e[0], -e[1], -e[2]);
141   ls->AddLine(-e[0], -e[1],  e[2], -e[0], -e[1], -e[2]);
142   ls->AddLine(-e[0],  e[1],  e[2], -e[0],  e[1], -e[2]);
143   // neg z
144   ls->AddLine( e[0],  e[1], -e[2],  e[0], -e[1], -e[2]);
145   ls->AddLine( e[0], -e[1], -e[2], -e[0], -e[1], -e[2]);
146   ls->AddLine(-e[0], -e[1], -e[2], -e[0],  e[1], -e[2]);
147   ls->AddLine(-e[0],  e[1], -e[2],  e[0],  e[1], -e[2]);
148
149   ls->RefMainTrans().SetPos(x);
150   return ls;
151 }
152
153
154 //==============================================================================
155 // Element making functions
156 //==============================================================================
157
158 TEveStraightLineSet*
159 primary_vertex(Bool_t use_sigma=kTRUE, Float_t fx=1, Float_t fy=1, Float_t fz=1)
160 {
161   AliESDEvent  *esd = AliEveEventManager::AssertESD();
162   AliESDVertex *pv  = esd->GetPrimaryVertex();
163   if ( ! pv->GetStatus()) {
164     Info("primary_vertex", "Primary vertex not available.");
165     return 0;
166   }
167
168   TEveStraightLineSet* ls = make_vertex_cross(pv, use_sigma, fx, fy, fz);
169   ls->ApplyVizTag("PVTX");
170   assert_vertex_parent("Primary Vertex", 7)->AddElement(ls);
171   gEve->Redraw3D();
172   return ls;
173 }
174
175 TEveStraightLineSet*
176 primary_vertex_spd(Bool_t use_sigma=kTRUE, Float_t fx=1, Float_t fy=1, Float_t fz=1)
177 {
178   AliESDEvent  *esd  = AliEveEventManager::AssertESD();
179   AliESDVertex *spdv = esd->GetPrimaryVertexSPD();
180   if ( ! spdv->GetStatus()) {
181     Info("primary_vertex_spd", "Primary vertex SPD not available.");
182     return 0;
183   }
184
185   TEveStraightLineSet* ls = make_vertex_cross(spdv, use_sigma, fx, fy, fz);
186   ls->ApplyVizTag("PVTX SPD");
187   assert_vertex_parent("Primary Vertex SPD", 6)->AddElement(ls);
188   gEve->Redraw3D();
189   return ls;
190 }
191
192 TEveStraightLineSet*
193 primary_vertex_tpc(Bool_t use_sigma=kTRUE, Float_t fx=1, Float_t fy=1, Float_t fz=1)
194 {
195   AliESDEvent  *esd  = AliEveEventManager::AssertESD();
196   AliESDVertex *tpcv = esd->GetPrimaryVertexTPC();
197   if ( ! tpcv->GetStatus()) {
198     Info("primary_vertex_tpc", "Primary vertex TPC not available.");
199     return 0;
200   }
201
202   TEveStraightLineSet* ls = make_vertex_cross(tpcv, use_sigma, fx, fy, fz);
203   ls->ApplyVizTag("PVTX TPC");
204   assert_vertex_parent("Primary Vertex TPC", 5)->AddElement(ls);
205   gEve->Redraw3D();
206   return ls;
207 }
208
209 //------------------------------------------------------------------------------
210 // Ellipse
211 //------------------------------------------------------------------------------
212
213 TEveStraightLineSet*
214 primary_vertex_ellipse(Bool_t use_sigma=kTRUE, Float_t fx=30, Float_t fy=30, Float_t fz=10)
215 {
216   AliESDEvent  *esd = AliEveEventManager::AssertESD();
217   AliESDVertex *pv  = esd->GetPrimaryVertex();
218   if ( ! pv->GetStatus()) {
219     Info("primary_vertex_ellipse", "Primary vertex not available.");
220     return 0;
221   }
222
223   TEveStraightLineSet* ls = make_vertex_ellipse(pv, use_sigma, fx, fy, fz);
224   ls->ApplyVizTag("PVTX Ellipse");
225   assert_vertex_parent("Primary Vertex", 7)->AddElement(ls);
226   gEve->Redraw3D();
227   return ls;
228 }
229
230 TEveStraightLineSet*
231 primary_vertex_ellipse_spd(Bool_t use_sigma=kTRUE, Float_t fx=30, Float_t fy=30, Float_t fz=10)
232 {
233   AliESDEvent  *esd  = AliEveEventManager::AssertESD();
234   AliESDVertex *spdv = esd->GetPrimaryVertexSPD();
235   if ( ! spdv->GetStatus()) {
236     Info("primary_vertex_ellipse_spd", "Primary vertex SPD not available.");
237     return 0;
238   }
239
240   TEveStraightLineSet* ls = make_vertex_ellipse(spdv, use_sigma, fx, fy, fz);
241   ls->ApplyVizTag("PVTX Ellipse SPD");
242   assert_vertex_parent("Primary Vertex SPD", 6)->AddElement(ls);
243   gEve->Redraw3D();
244   return ls;
245 }
246
247 TEveStraightLineSet*
248 primary_vertex_ellipse_tpc(Bool_t use_sigma=kTRUE, Float_t fx=30, Float_t fy=30, Float_t fz=10)
249 {
250   AliESDEvent  *esd  = AliEveEventManager::AssertESD();
251   AliESDVertex *tpcv = esd->GetPrimaryVertexTPC();
252   if ( ! tpcv->GetStatus()) {
253     Info("primary_vertex_ellipse_tpc", "Primary vertex TPC not available.");
254     return 0;
255   }
256
257   TEveStraightLineSet* ls = make_vertex_ellipse(tpcv, use_sigma, fx, fy, fz);
258   ls->ApplyVizTag("PVTX Ellipse TPC");
259   assert_vertex_parent("Primary Vertex TPC", 5)->AddElement(ls);
260   gEve->Redraw3D();
261   return ls;
262 }
263
264 //------------------------------------------------------------------------------
265 // Box
266 //------------------------------------------------------------------------------
267
268 TEveStraightLineSet*
269 primary_vertex_box(Bool_t use_sigma=kTRUE, Float_t fx=30, Float_t fy=30, Float_t fz=10)
270 {
271   AliESDEvent  *esd = AliEveEventManager::AssertESD();
272   AliESDVertex *pv  = esd->GetPrimaryVertex();
273   if ( ! pv->GetStatus()) {
274     Info("primary_vertex_box", "Primary vertex not available.");
275     return 0;
276   }
277
278   TEveStraightLineSet* ls = make_vertex_box(pv, use_sigma, fx, fy, fz);
279   ls->ApplyVizTag("PVTX Box");
280   assert_vertex_parent("Primary Vertex", 7)->AddElement(ls);
281   gEve->Redraw3D();
282   return ls;
283 }
284
285 TEveStraightLineSet*
286 primary_vertex_box_spd(Bool_t use_sigma=kTRUE, Float_t fx=30, Float_t fy=30, Float_t fz=10)
287 {
288   AliESDEvent  *esd  = AliEveEventManager::AssertESD();
289   AliESDVertex *spdv = esd->GetPrimaryVertexSPD();
290   if ( ! spdv->GetStatus()) {
291     Info("primary_vertex_box_spd", "Primary vertex SPD not available.");
292     return 0;
293   }
294
295   TEveStraightLineSet* ls = make_vertex_box(spdv, use_sigma, fx, fy, fz);
296   ls->ApplyVizTag("PVTX Box SPD");
297   assert_vertex_parent("Primary Vertex SPD", 6)->AddElement(ls);
298   gEve->Redraw3D();
299   return ls;
300 }
301
302 TEveStraightLineSet*
303 primary_vertex_box_tpc(Bool_t use_sigma=kTRUE, Float_t fx=30, Float_t fy=30, Float_t fz=10)
304 {
305   AliESDEvent  *esd  = AliEveEventManager::AssertESD();
306   AliESDVertex *tpcv = esd->GetPrimaryVertexTPC();
307   if ( ! tpcv->GetStatus()) {
308     Info("primary_vertex_box_tpc", "Primary vertex TPC not available.");
309     return 0;
310   }
311
312   TEveStraightLineSet* ls = make_vertex_box(tpcv, use_sigma, fx, fy, fz);
313   ls->ApplyVizTag("PVTX Box TPC");
314   assert_vertex_parent("Primary Vertex TPC", 5)->AddElement(ls);
315   gEve->Redraw3D();
316   return ls;
317 }