From Boris: Proper detailed-view for V0s with two GL views and details in a canvas.
[u/mrichter/AliRoot.git] / EVE / EveBase / AliEveV0Editor.cxx
CommitLineData
ca8a6926 1// @(#)root/eve:$Id$
2// Author: Matevz Tadel 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#include "AliEveV0Editor.h"
11#include "AliEveV0.h"
12
13#include "TVirtualPad.h"
14#include "TColor.h"
15
16// Cleanup these includes:
17#include "TGLabel.h"
18#include "TGButton.h"
19#include "TGNumberEntry.h"
20#include "TGColorSelect.h"
21#include "TGDoubleSlider.h"
22
23
24//______________________________________________________________________________
25// GUI editor for AliEveV0.
26//
27
28ClassImp(AliEveV0Editor)
29
30//______________________________________________________________________________
31AliEveV0Editor::AliEveV0Editor(const TGWindow *p, Int_t width, Int_t height,
32 UInt_t options, Pixel_t back) :
33 TGedFrame(p, width, height, options | kVerticalFrame, back),
34 fM(0),
35 fInfoLabel0(0),
36 fInfoLabel1(0),
2c7d7ac0 37 fInfoLabelNegDaughter(0),
38 fInfoLabelPosDaughter(0),
ca8a6926 39 fXButton(0)
40 // Initialize widget pointers to 0
41{
42 // Constructor.
43
44 MakeTitle("AliEveV0");
45
46 fInfoLabel0 = new TGLabel(this);
47 fInfoLabel0->SetTextJustify(kTextLeft);
48 AddFrame(fInfoLabel0, new TGLayoutHints(kLHintsLeft|kLHintsExpandX,
49 8, 0, 2, 0));
50
51 fInfoLabel1 = new TGLabel(this);
52 fInfoLabel1->SetTextJustify(kTextLeft);
53 AddFrame(fInfoLabel1, new TGLayoutHints(kLHintsLeft|kLHintsExpandX,
54 8, 0, 2, 0));
55
2c7d7ac0 56 fInfoLabelNegDaughter = new TGLabel(this);
57 fInfoLabelNegDaughter->SetTextJustify(kTextLeft);
58 AddFrame(fInfoLabelNegDaughter, new TGLayoutHints(kLHintsLeft|kLHintsExpandX,
59 8, 0, 2, 0));
60
61 fInfoLabelPosDaughter = new TGLabel(this);
62 fInfoLabelPosDaughter->SetTextJustify(kTextLeft);
63 AddFrame(fInfoLabelPosDaughter, new TGLayoutHints(kLHintsLeft|kLHintsExpandX,
64 8, 0, 2, 0));
65
ca8a6926 66 fXButton = new TGTextButton(this, "Detailed View");
67 AddFrame(fXButton, new TGLayoutHints(kLHintsLeft|kLHintsExpandX, 1, 1, 0, 0));
68 fXButton->Connect("Clicked()", "AliEveV0Editor", this, "DisplayDetailed()");
69}
70
71/******************************************************************************/
72
73//______________________________________________________________________________
74void AliEveV0Editor::SetModel(TObject* obj)
75{
76 // Set model object.
77
78 fM = dynamic_cast<AliEveV0*>(obj);
79
80 // Set values of widgets
e1bb28b4 81 fInfoLabel0->SetText(Form("Radius = %f, DCA = %f", fM->GetRadius(), fM->GetDaughterDCA()));
82 fInfoLabel1->SetText(Form("Pt = %f", fM->GetPt()));
2c7d7ac0 83 fInfoLabelNegDaughter->SetText(Form("Neg. Daughter Prob= %.2f for Pdg= %d", fM->GetNegMaxProbPid(), fM->GetNegMaxProbPdg()));
84 fInfoLabelPosDaughter->SetText(Form("Pos. Daughter Prob= %.2f for Pdg= %d", fM->GetPosMaxProbPid(), fM->GetPosMaxProbPdg()));
85
ca8a6926 86}
87
88/******************************************************************************/
89
90// Implements callback/slot methods
91
92//______________________________________________________________________________
93// void AliEveV0Editor::DoXYZZ()
94// {
95// // Slot for XYZZ.
96//
97// fM->SetXYZZ(fXYZZ->GetValue());
98// Update();
99// }
100
68ca2fe7 101#include <TEveManager.h>
102#include <TEveWindow.h>
103#include <TEveViewer.h>
104#include <TEveScene.h>
105
106#include <TGLCamera.h>
107#include <TGLViewer.h>
108
109#include <TLatex.h>
110#include <TRootEmbeddedCanvas.h>
111
ca8a6926 112void AliEveV0Editor::DisplayDetailed()
113{
68ca2fe7 114 TEveWindowSlot *slot = TEveWindow::CreateWindowMainFrame();
115 TEveWindowPack *pack = slot->MakePack();
116 pack->SetShowTitleBar(kFALSE);
e7c12214 117 pack->SetHorizontal();
68ca2fe7 118
e7c12214 119 //
120 // This part is for the bending plane view
121 //
122 pack->NewSlot()->MakeCurrent();
123 TEveViewer *bpViewer = gEve->SpawnNewViewer("V0 bending plane View");
124 TEveScene *bpScene = gEve->SpawnNewScene("V0 bending plane Scene");
125 bpViewer->AddScene(bpScene);
126 bpScene->AddElement(fM);
127 // This is the to-do list for the bending plane:
128 // 1. fix the view to orthographic XOY (no rotation allowed but moving the center ok) --tbu
129 // 2. show axis and tickles along X and Y
130 // 3. show the center, the main vertex and the detectors for this view;
131 // 4. show V0 direction in the bending plane with arrow length proportional to pT;
132 // 5. show angles with respect to axis (phi angle).
133 bpViewer->GetGLViewer()->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
134 // bpViewer->GetGLViewer()->GetOrthoXOYCamera()->SetEnableRotate(kFALSE);
135 bpViewer->GetGLViewer()->ResetCamerasAfterNextUpdate();
136 // bpViewer->GetGLViewer()->ResetCamerasAfterNextUpdate();
137 TGLCamera& bpCam = bpViewer->GetGLViewer()->CurrentCamera();
138 bpCam.SetExternalCenter(kTRUE);
139 // bpCam.SetEnableRotate(kFALSE);
140 bpCam.SetCenterVec(fM->fRecDecayV.fX, fM->fRecDecayV.fY, fM->fRecDecayV.fZ);
141 // end of the bending plane part
142
143 //
144 // This part is for the decay plane view
145 //
146 pack->NewSlot()->MakeCurrent();
147 TEveViewer *dpViewer = gEve->SpawnNewViewer("V0 decay plane View");
148 TEveScene *dpScene = gEve->SpawnNewScene("V0 decay plane Scene");
149 dpViewer->AddScene(dpScene);
150 dpScene->AddElement(fM);
151 // This is the to-do list for the decay plane:
152 // 1. fix the view to decay plane (no rotation allowed but moving the center ok)
153 // 2. show V0 direction with a vertical arrow length proportional to pT;
154 // 3. show the center, the main vertex and the detectors for this view;
155 // 4. show the x,y and z axis and the different angles;
156 // 5. draw the dca between daughters and the extrapolation to the main vertex.
157 dpViewer->GetGLViewer()->ResetCamerasAfterNextUpdate();
158 TGLCamera& dpCam = dpViewer->GetGLViewer()->CurrentCamera();
159 dpCam.SetExternalCenter(kTRUE);
160 dpCam.SetCenterVec(fM->fRecDecayV.fX, fM->fRecDecayV.fY, fM->fRecDecayV.fZ);
161 // end of the decay plane part
162
163
164 // This part is for displaying the information
68ca2fe7 165 slot = pack->NewSlot();
166
167 TEveWindowFrame *frame = slot->MakeFrame(new TRootEmbeddedCanvas());
168 frame->SetElementName("Details");
169
e7c12214 170 // Print and show detailed information about the V0
171 // Calculation of the invariant mass with the max prob PID hypothesis first
172 // pseudorapidity, phi angle, pt, radius, dcas
173 char info[100] = {0};
174 sprintf(info,"#phi = %.3f",fM->GetPhi());
175 TLatex* ltx = new TLatex(0.1, 0.9, info);
d4dbbb43 176 ltx->SetTextSize(0.08);
68ca2fe7 177 ltx->Draw();
178
e7c12214 179 sprintf(info,"radius = %.3f [cm]",fM->GetRadius());
180 ltx->DrawLatex(0.1, 0.8, info);
181
182 sprintf(info,"daughters dca = %.3f [cm]",fM->GetDaughterDCA());
183 ltx->DrawLatex(0.1, 0.7, info);
184
185 sprintf(info,"#eta = #frac{1}{2} #times Ln(#frac{E+p_{z}}{E-p_{z}} ) = %.3f",fM->GetEta());
186 ltx->DrawLatex(0.1, 0.6, info);
187
188 sprintf(info,"mass_{K^{0}_{s}} = %.3f [GeV/c^{2}]",fM->GetK0sInvMass());
189 ltx->DrawLatex(0.1, 0.3, info);
190
191 sprintf(info,"mass_{#Lambda} = %.3f [GeV/c^{2}]",fM->GetLambdaInvMass());
192 ltx->DrawLatex(0.1, 0.2, info);
193
194 sprintf(info,"mass_{#bar{#Lambda}} = %.3f [GeV/c^{2}]",fM->GetAntiLambdaInvMass());
195 ltx->DrawLatex(0.1, 0.1, info);
196
68ca2fe7 197 gEve->Redraw3D();
ca8a6926 198}