Add preliminary implementation of split-views for visual scanning
[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 TPolyMarker3D* make_vertex_marker(AliESDVertex* v, const Text_t* name )
11 {
12   Double_t x[3], e[3];
13   v->GetXYZ(x);
14   v->GetSigmaXYZ(e);
15
16   printf("%16s: %f %f %f   -   %f %f %f\n", name,
17          x[0], x[1], x[2], e[0], e[1], e[2]);
18
19   TPolyMarker3D* m = new TPolyMarker3D(1);
20   m->SetName(name);
21   m->SetPoint(0, x[0], x[1], x[2]);
22
23   return m;
24 }
25
26 TEveBoxSet* make_vertex_boxes(AliESDVertex* v)
27 {
28   Double_t x[3], e[3];
29   v->GetXYZ(x);
30   v->GetSigmaXYZ(e);
31
32   TEveBoxSet* bs;
33
34   bs = new TEveBoxSet("+- 10 x 10 x 20mm");
35   bs->SetRenderMode(TEveBoxSet::RM_TEveLine);
36   bs->AddBox(Box(-1, x[0], x[1], x[2], 1, 1, 2));
37   bs->SetMainColor((Color_t) 2);
38   gEve->AddElement(bs);
39
40   bs = new TEveBoxSet("+- 30 sigma_r x 10 sigma_z");
41   bs->SetRenderMode(TEveBoxSet::RM_TEveLine);
42   bs->AddBox(Box(-1, x[0], x[1], x[2], 30*e[0], 30*e[1], 10*e[2]));
43   bs->SetMainColor((Color_t) 3);
44   gEve->AddElement(bs);
45
46   gEve->Redraw3D();
47 }
48
49 void register_vertex_marker(TPolyMarker3D* m)
50 {
51   Color_t* colp = TEveUtil::FindColorVar(m, "fMarkerColor");
52   TEveElementObjectPtr* rnrEl = new TEveElementObjectPtr(m, *colp);
53   gEve->AddElement(rnrEl);
54   gEve->Redraw3D();
55 }
56
57 void primary_vertex_primitive(Bool_t showSPD=kTRUE, Bool_t showBoxes=kFALSE)
58 {
59   AliESDEvent* esd = AliEveEventManager::AssertESD();
60
61   AliESDVertex*  pv  = esd->GetPrimaryVertexSPD();
62   TPolyMarker3D* pvm = make_vertex_marker(pv, "Primary Vertex");
63   pvm->SetMarkerStyle(5);
64   pvm->SetMarkerColor(5);
65   pvm->SetMarkerSize(1.4);
66   register_vertex_marker(pvm);
67
68   if (showSPD) {
69     AliESDVertex*  spdv  = esd->GetPrimaryVertexSPD();
70     TPolyMarker3D* spdvm = make_vertex_marker(spdv, "SPD Vertex");
71     spdvm->SetMarkerStyle(2);
72     spdvm->SetMarkerColor(6);
73     register_vertex_marker(spdvm);
74   }
75
76   if (showBoxes)
77     make_vertex_boxes(pv);
78 }
79
80 /******************************************************************************/
81
82 TEveStraightLineSet* make_vertex_lineset(AliESDVertex* v, const Text_t* name)
83 {
84   Double_t x[3], e[3];
85   v->GetXYZ(x); v->GetSigmaXYZ(e);
86   printf("%16s: %f %f %f   -   %f %f %f\n", name,
87          x[0], x[1], x[2], e[0], e[1], e[2]);
88
89   // dimensions
90   TEveStraightLineSet* ls = new TEveStraightLineSet();
91   ls->SetName(name);
92   ls->AddLine(e[0], 0,    0,   -e[0], 0,    0);
93   ls->AddLine(0,    e[1], 0,    0,   -e[1], 0);
94   ls->AddLine(0,    0,    e[2], 0,    0,   -e[2]);
95
96   ls->RefMainTrans().SetPos(x);
97   return ls;
98 }
99
100 void make_vertex_ellipses(TEveStraightLineSet* ls, AliESDVertex* v, Bool_t ellipseUseSigma)
101 {
102   Double_t x[3], e[3];
103   v->GetXYZ(x); v->GetSigmaXYZ(e);
104
105   if (ellipseUseSigma)
106   {
107     e[0] *= 30; e[1] *= 30; e[2] *= 10;
108     ls->SetMarkerStyle(5);
109     ls->SetMarkerColor(5);
110     ls->SetMarkerSize(1.4);
111     ls->SetLineColor(7);
112     ls->SetTitle("+- 30 sigma_r x 10 sigma_z");
113   }
114   else
115   {
116     e[0] = 1; e[1] = 1; e[2] = 2;
117     ls->SetMarkerStyle(2);
118     ls->SetMarkerColor(6);
119     ls->SetLineColor(6);
120     ls->SetTitle("+- 10 x 10 x 20mm");
121   }
122
123   Int_t N = 32;
124   Float_t S = 2*TMath::Pi()/N;
125   Float_t b, a, phi;
126
127   a = e[0]; b = e[1];
128   for (Int_t i = 0; i<N; i++)
129     ls->AddLine(a*TMath::Cos(i*S)  , b*TMath::Sin(i*S)  , 0,
130                 a*TMath::Cos(i*S+S), b*TMath::Sin(i*S+S), 0);
131
132   a = e[0]; b = e[2];
133   for (Int_t i = 0; i<N; i++)
134     ls->AddLine(a*TMath::Cos(i*S)  , 0, b*TMath::Sin(i*S),
135                 a*TMath::Cos(i*S+S), 0, b*TMath::Sin(i*S+S));
136
137   a = e[1]; b = e[2];
138   for (Int_t i = 0; i<N; i++)
139     ls->AddLine(0, a*TMath::Cos(i*S)  ,  b*TMath::Sin(i*S),
140                 0, a*TMath::Cos(i*S+S),  b*TMath::Sin(i*S+S));
141 }
142
143 void primary_vertex(Bool_t showSPD=kTRUE, Bool_t rnrEllipse=kTRUE)
144 {
145   AliESDEvent* esd = AliEveEventManager::AssertESD();
146   TEveStraightLineSet* ls;
147
148   AliESDVertex* PV  =  esd->GetPrimaryVertex();
149   ls = make_vertex_lineset(PV, "Primary Vertex");
150   if (rnrEllipse) make_vertex_ellipses(ls, PV, kTRUE);
151   gEve->AddElement(ls);
152
153   if (showSPD)
154   {
155     AliESDVertex*  SPDV  = esd->GetPrimaryVertexSPD();
156     ls = make_vertex_lineset(SPDV, "SPD Vertex");
157     if (rnrEllipse) make_vertex_ellipses(ls, SPDV, kFALSE);
158     gEve->AddElement(ls);
159   }
160 }