MultiView.C: Multi-view (3d, rphi, rhoz) service class using EVE Window Manager. | Event Display | alice_esd.C: Complex example showing ALICE ESD track visualization. |
// @(#)root/eve:$Id: SplitGLView.C 28380 2009-04-29 07:19:13Z bellenot $ // Author: Bertrand Bellenot // Helper classes for the alice_esd_split.C demo. #include "TApplication.h" #include "TSystem.h" #include "TGFrame.h" #include "TGLayout.h" #include "TGSplitter.h" #include "TGLWidget.h" #include "TEvePad.h" #include "TGeoManager.h" #include "TString.h" #include "TGMenu.h" #include "TGStatusBar.h" #include "TGFileDialog.h" #include "TGMsgBox.h" #include "TGLPhysicalShape.h" #include "TGLLogicalShape.h" #include "HelpText.h" #include "TClass.h" #include "Riostream.h" #include "TEnv.h" #include "TGListTree.h" #include "TOrdCollection.h" #include "TArrayF.h" #include "TGHtml.h" #include "TPRegexp.h" #include "TEveManager.h" #include "TEveViewer.h" #include "TEveBrowser.h" #include "TEveProjectionManager.h" #include "TEveProjectionAxes.h" #include "TEveScene.h" #include "TEveGeoNode.h" #include "TEveEventManager.h" #include "TEveTrack.h" #include "TEveSelection.h" #include "TRootEmbeddedCanvas.h" #include "TGSplitFrame.h" #include "TGLOverlayButton.h" #include "TGLEmbeddedViewer.h" #include "TGDockableFrame.h" #include "TGShapedFrame.h" #include "TGButton.h" #include "TGTab.h" #include "TEnv.h" #include "TCanvas.h" #include "TFormula.h" #include "TF1.h" #include "TH1F.h" #ifdef WIN32 #include <TWin32SplashThread.h> #endif const char *filetypes[] = { "ROOT files", "*.root", "All files", "*", 0, 0 }; const char *rcfiletypes[] = { "All files", "*", 0, 0 }; //////////////////////////////////////////////////////////////////////////////// class TGShapedToolTip : public TGShapedFrame { private: TGShapedToolTip(const TGShapedToolTip&); // Not implemented TGShapedToolTip& operator=(const TGShapedToolTip&); // Not implemented protected: Int_t fTextX, fTextY, fTextH; TString fTextCol; TRootEmbeddedCanvas *fEc; // embedded canvas for histogram TH1 *fHist; // user histogram TString fText; // info (as tool tip) text virtual void DoRedraw() {} public: TGShapedToolTip(const char *picname, Int_t cx=0, Int_t cy=0, Int_t cw=0, Int_t ch=0, Int_t tx=0, Int_t ty=0, Int_t th=0, const char *col="#ffffff"); virtual ~TGShapedToolTip(); virtual void CloseWindow(); void CreateCanvas(Int_t cx, Int_t cy, Int_t cw, Int_t ch); void CreateCanvas(Int_t cw, Int_t ch, TGLayoutHints *hints); TH1 *GetHisto() const { return fHist; } const char *GetText() const { return fText.Data(); } void Refresh(); void SetHisto(TH1 *hist); void SetText(const char *text); void SetTextColor(const char *col); void SetTextAttributes(Int_t tx, Int_t ty, Int_t th, const char *col=0); void Show(Int_t x, Int_t y, const char *text = 0, TH1 *hist = 0); ClassDef(TGShapedToolTip, 0) // Shaped composite frame }; //////////////////////////////////////////////////////////////////////////////// class HtmlObjTable : public TObject { public: // make them public for shorter code TString fName; Int_t fNValues; // number of values Int_t fNFields; // number of fields TArrayF *fValues; TString *fLabels; Bool_t fExpand; TString fHtml; // HTML output code void Build(); void BuildTitle(); void BuildLabels(); void BuildTable(); public: HtmlObjTable(const char *name, Int_t nfields, Int_t nvals, Bool_t exp=kTRUE); virtual ~HtmlObjTable(); void SetLabel(Int_t col, const char *label) { fLabels[col] = label; } void SetValue(Int_t col, Int_t row, Float_t val) { fValues[col].SetAt(val, row); } TString Html() const { return fHtml; } ClassDef(HtmlObjTable, 0); }; //////////////////////////////////////////////////////////////////////////////// class HtmlSummary { public: // make them public for shorter code Int_t fNTables; TOrdCollection *fObjTables; // ->array of object tables TString fHtml; // output HTML string TString fTitle; // page title TString fHeader; // HTML header TString fFooter; // HTML footer void MakeHeader(); void MakeFooter(); public: HtmlSummary(const char *title); virtual ~HtmlSummary(); HtmlObjTable *AddTable(const char *name, Int_t nfields, Int_t nvals, Bool_t exp=kTRUE, Option_t *opt=""); HtmlObjTable *GetTable(Int_t at) const { return (HtmlObjTable *)fObjTables->At(at); } void Build(); void Clear(Option_t *option=""); void Reset(Option_t *option=""); TString Html() const { return fHtml; } ClassDef(HtmlSummary, 0); }; //////////////////////////////////////////////////////////////////////////////// class SplitGLView : public TGMainFrame { public: enum EMyCommands { kFileOpen, kFileExit, kFileLoadConfig, kFileSaveConfig, kHelpAbout, kGLPerspYOZ, kGLPerspXOZ, kGLPerspXOY, kGLXOY, kGLXOZ, kGLZOY, kGLOrthoRotate, kGLOrthoDolly, kSceneUpdate, kSceneUpdateAll, kSummaryUpdate }; private: TEvePad *fPad; // pad used as geometry container TGSplitFrame *fSplitFrame; // main (first) split frame TGLEmbeddedViewer *fViewer0; // main GL viewer TGLEmbeddedViewer *fViewer1; // first GL viewer TGLEmbeddedViewer *fViewer2; // second GL viewer TGLEmbeddedViewer *fActViewer; // actual (active) GL viewer static HtmlSummary *fgHtmlSummary; // summary HTML table static TGHtml *fgHtml; TGMenuBar *fMenuBar; // main menu bar TGPopupMenu *fMenuFile; // 'File' popup menu TGPopupMenu *fMenuHelp; // 'Help' popup menu TGPopupMenu *fMenuCamera; // 'Camera' popup menu TGPopupMenu *fMenuScene; // 'Scene' popup menu TGStatusBar *fStatusBar; // status bar TGShapedToolTip *fShapedToolTip; // shaped tooltip Bool_t fIsEmbedded; TEveViewer *fViewer[3]; TEveProjectionManager *fRPhiMgr; TEveProjectionManager *fRhoZMgr; public: SplitGLView(const TGWindow *p=0, UInt_t w=800, UInt_t h=600, Bool_t embed=kFALSE); virtual ~SplitGLView(); void ItemClicked(TGListTreeItem *item, Int_t btn, Int_t x, Int_t y); void HandleMenu(Int_t id); void OnClicked(TObject *obj); void OnMouseIdle(TGLPhysicalShape *shape, UInt_t posx, UInt_t posy); void OnMouseOver(TGLPhysicalShape *shape); void OnViewerActivated(); void OpenFile(const char *fname); void SwapToMainView(TGLViewerBase *viewer); void ToggleOrthoRotate(); void ToggleOrthoDolly(); void UnDock(TGLViewerBase *viewer); void LoadConfig(const char *fname); void SaveConfig(const char *fname); static void UpdateSummary(); TEveProjectionManager *GetRPhiMgr() const { return fRPhiMgr; } TEveProjectionManager *GetRhoZMgr() const { return fRhoZMgr; } ClassDef(SplitGLView, 0) }; TEveProjectionManager *gRPhiMgr = 0; TEveProjectionManager *gRhoZMgr = 0; ClassImp(TGShapedToolTip) ClassImp(HtmlObjTable) ClassImp(HtmlSummary) ClassImp(SplitGLView) HtmlSummary *SplitGLView::fgHtmlSummary = 0; TGHtml *SplitGLView::fgHtml = 0; //______________________________________________________________________________ TGShapedToolTip::TGShapedToolTip(const char *pname, Int_t cx, Int_t cy, Int_t cw, Int_t ch, Int_t tx, Int_t ty, Int_t th, const char *col) : TGShapedFrame(pname, gClient->GetDefaultRoot(), 400, 300, kTempFrame | kHorizontalFrame), fEc(0), fHist(0) { // Shaped window constructor fTextX = tx; fTextY = ty; fTextH = th; if (col) fTextCol = col; else fTextCol = "0x000000"; // create the embedded canvas if ((cx > 0) && (cy > 0) && (cw > 0) && (ch > 0)) { Int_t lhRight = fWidth-cx-cw; Int_t lhBottom = fHeight-cy-ch; fEc = new TRootEmbeddedCanvas("ec", this, cw, ch, 0); AddFrame(fEc, new TGLayoutHints(kLHintsTop | kLHintsLeft, cx, lhRight, cy, lhBottom)); } MapSubwindows(); Resize(); Resize(fBgnd->GetWidth(), fBgnd->GetHeight()); } //______________________________________________________________________________ TGShapedToolTip::~TGShapedToolTip() { // Destructor. if (fHist) delete fHist; if (fEc) delete fEc; } //______________________________________________________________________________ void TGShapedToolTip::CloseWindow() { // Close shaped window. DeleteWindow(); } //______________________________________________________________________________ void TGShapedToolTip::Refresh() { // Redraw the window with current attributes. const char *str = fText.Data(); char *string = strdup(str); Int_t nlines = 0, size = fTextH; TString fp = gEnv->GetValue("Root.TTFontPath", ""); TString ar = fp + "/arial.ttf"; char *s = strtok((char *)string, "\n"); TImage *img = (TImage*)fImage->Clone("img"); img->DrawText(fTextX, fTextY+(nlines*size), s, size, fTextCol, ar); while ((s = strtok(0, "\n"))) { nlines++; img->DrawText(fTextX, fTextY+(nlines*size), s, size, fTextCol, ar); } img->PaintImage(fId, 0, 0, 0, 0, 0, 0, "opaque"); free(string); delete img; gVirtualX->Update(); } //______________________________________________________________________________ void TGShapedToolTip::CreateCanvas(Int_t cx, Int_t cy, Int_t cw, Int_t ch) { // create the embedded canvas Int_t lhRight = fWidth-cx-cw; Int_t lhBottom = fHeight-cy-ch; fEc = new TRootEmbeddedCanvas("ec", this, cw, ch, 0); AddFrame(fEc, new TGLayoutHints(kLHintsTop | kLHintsLeft, cx, lhRight, cy, lhBottom)); MapSubwindows(); Resize(); Resize(fBgnd->GetWidth(), fBgnd->GetHeight()); if (IsMapped()) { Refresh(); } } //______________________________________________________________________________ void TGShapedToolTip::CreateCanvas(Int_t cw, Int_t ch, TGLayoutHints *hints) { // Create the embedded canvas. fEc = new TRootEmbeddedCanvas("ec", this, cw, ch, 0); AddFrame(fEc, hints); MapSubwindows(); Resize(); Resize(fBgnd->GetWidth(), fBgnd->GetHeight()); if (IsMapped()) { Refresh(); } } //______________________________________________________________________________ void TGShapedToolTip::SetHisto(TH1 *hist) { // Set which histogram has to be displayed in the embedded canvas. if (hist) { if (fHist) { delete fHist; if (fEc) fEc->GetCanvas()->Clear(); } fHist = (TH1 *)hist->Clone(); if (fEc) { fEc->GetCanvas()->SetBorderMode(0); fEc->GetCanvas()->SetFillColor(10); fEc->GetCanvas()->cd(); fHist->Draw(); fEc->GetCanvas()->Update(); } } } //______________________________________________________________________________ void TGShapedToolTip::SetText(const char *text) { // Set which text has to be displayed. if (text) { fText = text; } if (IsMapped()) Refresh(); } //______________________________________________________________________________ void TGShapedToolTip::SetTextColor(const char *col) { // Set text color. fTextCol = col; if (IsMapped()) Refresh(); } //______________________________________________________________________________ void TGShapedToolTip::SetTextAttributes(Int_t tx, Int_t ty, Int_t th, const char *col) { // Set text attributes (position, size and color). fTextX = tx; fTextY = ty; fTextH = th; if (col) fTextCol = col; if (IsMapped()) Refresh(); } //______________________________________________________________________________ void TGShapedToolTip::Show(Int_t x, Int_t y, const char *text, TH1 *hist) { // Show (popup) the shaped window at location x,y and possibly // set the text and histogram to be displayed. Move(x, y); MapWindow(); if (text) SetText(text); if (hist) SetHisto(hist); // end of demo code ------------------------------------------- if (fHist) { fEc->GetCanvas()->SetBorderMode(0); fEc->GetCanvas()->SetFillColor(10); fEc->GetCanvas()->cd(); fHist->Draw(); fEc->GetCanvas()->Update(); } Refresh(); } //______________________________________________________________________________ HtmlObjTable::HtmlObjTable(const char *name, Int_t nfields, Int_t nvals, Bool_t exp) : fName(name), fNValues(nvals), fNFields(nfields), fExpand(exp) { // Constructor. fValues = new TArrayF[fNFields]; for (int i=0;i<fNFields;i++) fValues[i].Set(nvals); fLabels = new TString[fNFields]; } //______________________________________________________________________________ HtmlObjTable::~HtmlObjTable() { // Destructor. delete [] fValues; delete [] fLabels; } //______________________________________________________________________________ void HtmlObjTable::Build() { // Build HTML code. fHtml = "<table width=100% border=1 cellspacing=0 cellpadding=0 bgcolor=f0f0f0> ", BuildTitle(); if (fExpand && (fNFields > 0) && (fNValues > 0)) { BuildLabels(); BuildTable(); } fHtml += "</table>"; } //______________________________________________________________________________ void HtmlObjTable::BuildTitle() { // Build table title. fHtml += "<tr><td colspan="; fHtml += Form("%d>", fNFields+1); fHtml += "<table width=100% border=0 cellspacing=2 cellpadding=0 bgcolor=6e6ea0>"; fHtml += "<tr><td align=left>"; fHtml += "<font face=Verdana size=3 color=ffffff><b><i>"; fHtml += fName; fHtml += "</i></b></font></td>"; fHtml += "<td>"; fHtml += "<td align=right> "; fHtml += "<font face=Verdana size=3 color=ffffff><b><i>"; fHtml += Form("Size = %d", fNValues); fHtml += "</i></b></font></td></tr>"; fHtml += "</table>"; fHtml += "</td></tr>"; } //______________________________________________________________________________ void HtmlObjTable::BuildLabels() { // Build table labels. Int_t i; fHtml += "<tr bgcolor=c0c0ff>"; fHtml += "<th> </th>"; // for the check boxes for (i=0;i<fNFields;i++) { fHtml += "<th> "; fHtml += fLabels[i]; fHtml += " </th>"; // for the check boxes } fHtml += "</tr>"; } //______________________________________________________________________________ void HtmlObjTable::BuildTable() { // Build part of table with values. for (int i = 0; i < fNValues; i++) { if (i%2) fHtml += "<tr bgcolor=e0e0ff>"; else fHtml += "<tr bgcolor=ffffff>"; TString name = fName; name.ReplaceAll(" ", "_"); // checkboxes fHtml += "<td bgcolor=d0d0ff align=\"center\">"; fHtml += "<input type=\"checkbox\" name=\""; fHtml += name; fHtml += Form("[%d]\">",i); fHtml += "</td>"; for (int j = 0; j < fNFields; j++) { fHtml += "<td width="; fHtml += Form("%d%%", 100/fNFields); fHtml += " align=\"center\""; fHtml += ">"; fHtml += Form("%1.4f", fValues[j][i]); fHtml += "</td>"; } fHtml += "</tr> "; } } //______________________________________________________________________________ HtmlSummary::HtmlSummary(const char *title) : fNTables(0), fTitle(title) { // Constructor. fObjTables = new TOrdCollection(); } //______________________________________________________________________________ HtmlSummary::~HtmlSummary() { // Destructor. Reset(); } //______________________________________________________________________________ HtmlObjTable *HtmlSummary::AddTable(const char *name, Int_t nfields, Int_t nvals, Bool_t exp, Option_t *option) { // Add a new table in our list of tables. TString opt = option; opt.ToLower(); HtmlObjTable *table = new HtmlObjTable(name, nfields, nvals, exp); fNTables++; if (opt.Contains("first")) fObjTables->AddFirst(table); else fObjTables->Add(table); return table; } //______________________________________________________________________________ void HtmlSummary::Clear(Option_t *option) { // Clear the table list. if (option && option[0] == 'D') fObjTables->Delete(option); else fObjTables->Clear(option); fNTables = 0; } //______________________________________________________________________________ void HtmlSummary::Reset(Option_t *) { // Reset (delete) the table list; delete fObjTables; fObjTables = 0; fNTables = 0; } //______________________________________________________________________________ void HtmlSummary::Build() { // Build the summary. MakeHeader(); for (int i=0;i<fNTables;i++) { GetTable(i)->Build(); fHtml += GetTable(i)->Html(); } MakeFooter(); } //______________________________________________________________________________ void HtmlSummary::MakeHeader() { // Make HTML header. fHeader = "<html><head><title>"; fHeader += fTitle; fHeader += "</title></head><body>"; fHeader += "<center><h2><font color=#2222ee><i>"; fHeader += fTitle; fHeader += "</i></font></h2></center>"; fHtml = fHeader; } //______________________________________________________________________________ void HtmlSummary::MakeFooter() { // Make HTML footer. fFooter = "<br><p><br><center><strong><font size=2 color=#2222ee>"; fFooter += "Example of using Html widget to display tabular data"; fFooter += "<br>"; fFooter += "© 2007-2008 Bertrand Bellenot"; fFooter += "</font></strong></center></body></html>"; fHtml += fFooter; } //______________________________________________________________________________ SplitGLView::SplitGLView(const TGWindow *p, UInt_t w, UInt_t h, Bool_t embed) : TGMainFrame(p, w, h), fActViewer(0), fShapedToolTip(0), fIsEmbedded(embed) { // Main frame constructor. TGSplitFrame *frm; TEveScene *s = 0; TGHorizontalFrame *hfrm; TGDockableFrame *dfrm; TGPictureButton *button; // create the "file" popup menu fMenuFile = new TGPopupMenu(gClient->GetRoot()); fMenuFile->AddEntry("&Open...", kFileOpen); fMenuFile->AddSeparator(); fMenuFile->AddEntry( "&Update Summary", kSummaryUpdate); fMenuFile->AddSeparator(); fMenuFile->AddEntry("&Load Config...", kFileLoadConfig); fMenuFile->AddEntry("&Save Config...", kFileSaveConfig); fMenuFile->AddSeparator(); fMenuFile->AddEntry("E&xit", kFileExit); // create the "camera" popup menu fMenuCamera = new TGPopupMenu(gClient->GetRoot()); fMenuCamera->AddEntry("Perspective (Floor XOZ)", kGLPerspXOZ); fMenuCamera->AddEntry("Perspective (Floor YOZ)", kGLPerspYOZ); fMenuCamera->AddEntry("Perspective (Floor XOY)", kGLPerspXOY); fMenuCamera->AddEntry("Orthographic (XOY)", kGLXOY); fMenuCamera->AddEntry("Orthographic (XOZ)", kGLXOZ); fMenuCamera->AddEntry("Orthographic (ZOY)", kGLZOY); fMenuCamera->AddSeparator(); fMenuCamera->AddEntry("Ortho allow rotate", kGLOrthoRotate); fMenuCamera->AddEntry("Ortho allow dolly", kGLOrthoDolly); fMenuScene = new TGPopupMenu(gClient->GetRoot()); fMenuScene->AddEntry("&Update Current", kSceneUpdate); fMenuScene->AddEntry("Update &All", kSceneUpdateAll); // create the "help" popup menu fMenuHelp = new TGPopupMenu(gClient->GetRoot()); fMenuHelp->AddEntry("&About", kHelpAbout); // create the main menu bar fMenuBar = new TGMenuBar(this, 1, 1, kHorizontalFrame); fMenuBar->AddPopup("&File", fMenuFile, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0)); fMenuBar->AddPopup("&Camera", fMenuCamera, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0)); fMenuBar->AddPopup("&Scene", fMenuScene, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0)); fMenuBar->AddPopup("&Help", fMenuHelp, new TGLayoutHints(kLHintsTop | kLHintsRight)); AddFrame(fMenuBar, new TGLayoutHints(kLHintsTop | kLHintsExpandX)); // connect menu signals to our menu handler slot fMenuFile->Connect("Activated(Int_t)", "SplitGLView", this, "HandleMenu(Int_t)"); fMenuCamera->Connect("Activated(Int_t)", "SplitGLView", this, "HandleMenu(Int_t)"); fMenuScene->Connect("Activated(Int_t)", "SplitGLView", this, "HandleMenu(Int_t)"); fMenuHelp->Connect("Activated(Int_t)", "SplitGLView", this, "HandleMenu(Int_t)"); if (fIsEmbedded && gEve) { // use status bar from the browser fStatusBar = gEve->GetBrowser()->GetStatusBar(); } else { // create the status bar Int_t parts[] = {45, 15, 10, 30}; fStatusBar = new TGStatusBar(this, 50, 10); fStatusBar->SetParts(parts, 4); AddFrame(fStatusBar, new TGLayoutHints(kLHintsBottom | kLHintsExpandX, 0, 0, 10, 0)); } // create eve pad (our geometry container) fPad = new TEvePad(); fPad->SetFillColor(kBlack); // create the split frames fSplitFrame = new TGSplitFrame(this, 800, 600); AddFrame(fSplitFrame, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY)); // split it once fSplitFrame->HSplit(434); // then split each part again (this will make four parts) fSplitFrame->GetSecond()->VSplit(266); fSplitFrame->GetSecond()->GetSecond()->VSplit(266); TGLOverlayButton *but1, *but2, *but3, *but4, *but5, *but6; // get top (main) split frame frm = fSplitFrame->GetFirst(); frm->SetName("Main_View"); // create (embed) a GL viewer inside fViewer0 = new TGLEmbeddedViewer(frm, fPad); but1 = new TGLOverlayButton(fViewer0, "Swap", 10.0, -10.0, 55.0, 16.0); but1->Connect("Clicked(TGLViewerBase*)", "SplitGLView", this, "SwapToMainView(TGLViewerBase*)"); but2 = new TGLOverlayButton(fViewer0, "Undock", 70.0, -10.0, 55.0, 16.0); but2->Connect("Clicked(TGLViewerBase*)", "SplitGLView", this, "UnDock(TGLViewerBase*)"); frm->AddFrame(fViewer0->GetFrame(), new TGLayoutHints(kLHintsExpandX | kLHintsExpandY)); // set the camera to perspective (XOZ) for this viewer fViewer0->SetCurrentCamera(TGLViewer::kCameraPerspXOZ); // connect signal we are interested to fViewer0->Connect("MouseOver(TGLPhysicalShape*)", "SplitGLView", this, "OnMouseOver(TGLPhysicalShape*)"); fViewer0->Connect("Activated()", "SplitGLView", this, "OnViewerActivated()"); fViewer0->Connect("MouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)", "SplitGLView", this, "OnMouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)"); fViewer0->Connect("Clicked(TObject*)", "SplitGLView", this, "OnClicked(TObject*)"); fViewer[0] = new TEveViewer("SplitGLViewer[0]"); fViewer[0]->SetGLViewer(fViewer0, fViewer0->GetFrame()); fViewer[0]->IncDenyDestroy(); if (fIsEmbedded && gEve) { fViewer[0]->AddScene(gEve->GetGlobalScene()); fViewer[0]->AddScene(gEve->GetEventScene()); gEve->AddElement(fViewer[0], gEve->GetViewers()); s = gEve->SpawnNewScene("Rho-Z Projection"); // projections fRhoZMgr = new TEveProjectionManager(); gEve->AddElement(fRhoZMgr, (TEveElement *)s); gEve->AddToListTree(fRhoZMgr, kTRUE); TEveProjectionAxes* a = new TEveProjectionAxes(fRhoZMgr); s->AddElement(a); } // get bottom left split frame frm = fSplitFrame->GetSecond()->GetFirst(); frm->SetName("Bottom_Left"); // create (embed) a GL viewer inside fViewer1 = new TGLEmbeddedViewer(frm, fPad); but3 = new TGLOverlayButton(fViewer1, "Swap", 10.0, -10.0, 55.0, 16.0); but3->Connect("Clicked(TGLViewerBase*)", "SplitGLView", this, "SwapToMainView(TGLViewerBase*)"); but4 = new TGLOverlayButton(fViewer1, "Undock", 70.0, -10.0, 55.0, 16.0); but4->Connect("Clicked(TGLViewerBase*)", "SplitGLView", this, "UnDock(TGLViewerBase*)"); frm->AddFrame(fViewer1->GetFrame(), new TGLayoutHints(kLHintsExpandX | kLHintsExpandY)); // set the camera to orthographic (XOY) for this viewer fViewer1->SetCurrentCamera(TGLViewer::kCameraOrthoXOY); // connect signal we are interested to fViewer1->Connect("MouseOver(TGLPhysicalShape*)", "SplitGLView", this, "OnMouseOver(TGLPhysicalShape*)"); fViewer1->Connect("Activated()", "SplitGLView", this, "OnViewerActivated()"); fViewer1->Connect("MouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)", "SplitGLView", this, "OnMouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)"); fViewer1->Connect("Clicked(TObject*)", "SplitGLView", this, "OnClicked(TObject*)"); fViewer[1] = new TEveViewer("SplitGLViewer[1]"); fViewer[1]->SetGLViewer(fViewer1, fViewer1->GetFrame()); fViewer[1]->IncDenyDestroy(); if (fIsEmbedded && gEve) { fRhoZMgr->ImportElements((TEveElement *)gEve->GetGlobalScene()); fRhoZMgr->ImportElements((TEveElement *)gEve->GetEventScene()); fRhoZMgr->SetProjection(TEveProjection::kPT_RhoZ); fViewer[1]->AddScene(s); gEve->AddElement(fViewer[1], gEve->GetViewers()); gRhoZMgr = fRhoZMgr; s = gEve->SpawnNewScene("R-Phi Projection"); // projections fRPhiMgr = new TEveProjectionManager(); gEve->AddElement(fRPhiMgr, (TEveElement *)s); gEve->AddToListTree(fRPhiMgr, kTRUE); TEveProjectionAxes* a = new TEveProjectionAxes(fRPhiMgr); s->AddElement(a); } // get bottom center split frame frm = fSplitFrame->GetSecond()->GetSecond()->GetFirst(); frm->SetName("Bottom_Center"); // create (embed) a GL viewer inside fViewer2 = new TGLEmbeddedViewer(frm, fPad); but5 = new TGLOverlayButton(fViewer2, "Swap", 10.0, -10.0, 55.0, 16.0); but5->Connect("Clicked(TGLViewerBase*)", "SplitGLView", this, "SwapToMainView(TGLViewerBase*)"); but6 = new TGLOverlayButton(fViewer2, "Undock", 70.0, -10.0, 55.0, 16.0); but6->Connect("Clicked(TGLViewerBase*)", "SplitGLView", this, "UnDock(TGLViewerBase*)"); frm->AddFrame(fViewer2->GetFrame(), new TGLayoutHints(kLHintsExpandX | kLHintsExpandY)); // set the camera to orthographic (XOY) for this viewer fViewer2->SetCurrentCamera(TGLViewer::kCameraOrthoXOY); // connect signal we are interested to fViewer2->Connect("MouseOver(TGLPhysicalShape*)", "SplitGLView", this, "OnMouseOver(TGLPhysicalShape*)"); fViewer2->Connect("Activated()", "SplitGLView", this, "OnViewerActivated()"); fViewer2->Connect("MouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)", "SplitGLView", this, "OnMouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)"); fViewer2->Connect("Clicked(TObject*)", "SplitGLView", this, "OnClicked(TObject*)"); fViewer[2] = new TEveViewer("SplitGLViewer[2]"); fViewer[2]->SetGLViewer(fViewer2, fViewer2->GetFrame()); fViewer[2]->IncDenyDestroy(); if (fIsEmbedded && gEve) { fRPhiMgr->ImportElements((TEveElement *)gEve->GetGlobalScene()); fRPhiMgr->ImportElements((TEveElement *)gEve->GetEventScene()); fRPhiMgr->SetProjection(TEveProjection::kPT_RPhi); fViewer[2]->AddScene(s); gEve->AddElement(fViewer[2], gEve->GetViewers()); gRPhiMgr = fRPhiMgr; } // get bottom right split frame frm = fSplitFrame->GetSecond()->GetSecond()->GetSecond(); frm->SetName("Bottom_Right"); dfrm = new TGDockableFrame(frm); dfrm->SetFixedSize(kFALSE); dfrm->EnableHide(kFALSE); hfrm = new TGHorizontalFrame(dfrm); button= new TGPictureButton(hfrm, gClient->GetPicture("swap.png")); button->SetToolTipText("Swap to big view"); hfrm->AddFrame(button); button->Connect("Clicked()","SplitGLView",this,"SwapToMainView(TGLViewerBase*=0)"); fgHtmlSummary = new HtmlSummary("Alice Event Display Summary Table"); fgHtml = new TGHtml(hfrm, 100, 100, -1); hfrm->AddFrame(fgHtml, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY)); dfrm->AddFrame(hfrm, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY)); frm->AddFrame(dfrm, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY)); if (fIsEmbedded && gEve) { gEve->GetListTree()->Connect("Clicked(TGListTreeItem*, Int_t, Int_t, Int_t)", "SplitGLView", this, "ItemClicked(TGListTreeItem*, Int_t, Int_t, Int_t)"); } fShapedToolTip = new TGShapedToolTip("Default.png", 120, 22, 160, 110, 23, 115, 12, "#ffff80"); Resize(GetDefaultSize()); MapSubwindows(); MapWindow(); LoadConfig(".everc"); } //______________________________________________________________________________ SplitGLView::~SplitGLView() { // Clean up main frame... //Cleanup(); fMenuFile->Disconnect("Activated(Int_t)", this, "HandleMenu(Int_t)"); fMenuCamera->Disconnect("Activated(Int_t)", this, "HandleMenu(Int_t)"); fMenuScene->Disconnect("Activated(Int_t)", this, "HandleMenu(Int_t)"); fMenuHelp->Disconnect("Activated(Int_t)", this, "HandleMenu(Int_t)"); fViewer0->Disconnect("MouseOver(TGLPhysicalShape*)", this, "OnMouseOver(TGLPhysicalShape*)"); fViewer0->Disconnect("Activated()", this, "OnViewerActivated()"); fViewer0->Disconnect("MouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)", this, "OnMouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)"); fViewer1->Disconnect("MouseOver(TGLPhysicalShape*)", this, "OnMouseOver(TGLPhysicalShape*)"); fViewer1->Disconnect("Activated()", this, "OnViewerActivated()"); fViewer1->Disconnect("MouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)", this, "OnMouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)"); fViewer2->Disconnect("MouseOver(TGLPhysicalShape*)", this, "OnMouseOver(TGLPhysicalShape*)"); fViewer2->Disconnect("Activated()", this, "OnViewerActivated()"); fViewer2->Disconnect("MouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)", this, "OnMouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)"); if (!fIsEmbedded) { delete fViewer[0]; delete fViewer[1]; delete fViewer[2]; } delete fShapedToolTip; delete fMenuFile; delete fMenuScene; delete fMenuCamera; delete fMenuHelp; if (!fIsEmbedded) delete fMenuBar; delete fViewer0; delete fViewer1; delete fViewer2; delete fSplitFrame; delete fPad; if (!fIsEmbedded) { delete fStatusBar; gApplication->Terminate(0); } } //______________________________________________________________________________ void SplitGLView::HandleMenu(Int_t id) { // Handle menu items. static TString rcdir("."); static TString rcfile(".everc"); switch (id) { case kFileOpen: { static TString dir("."); TGFileInfo fi; fi.fFileTypes = filetypes; fi.fIniDir = StrDup(dir); new TGFileDialog(gClient->GetRoot(), this, kFDOpen, &fi); if (fi.fFilename) OpenFile(fi.fFilename); dir = fi.fIniDir; } break; case kFileLoadConfig: { TGFileInfo fi; fi.fFileTypes = rcfiletypes; fi.fIniDir = StrDup(rcdir); fi.fFilename = StrDup(rcfile); new TGFileDialog(gClient->GetRoot(), this, kFDOpen, &fi); if (fi.fFilename) { rcfile = fi.fFilename; LoadConfig(fi.fFilename); } rcdir = fi.fIniDir; } break; case kFileSaveConfig: { TGFileInfo fi; fi.fFileTypes = rcfiletypes; fi.fIniDir = StrDup(rcdir); fi.fFilename = StrDup(rcfile); new TGFileDialog(gClient->GetRoot(), this, kFDSave, &fi); if (fi.fFilename) { rcfile = fi.fFilename; SaveConfig(fi.fFilename); } rcdir = fi.fIniDir; } break; case kFileExit: CloseWindow(); break; case kGLPerspYOZ: if (fActViewer) fActViewer->SetCurrentCamera(TGLViewer::kCameraPerspYOZ); break; case kGLPerspXOZ: if (fActViewer) fActViewer->SetCurrentCamera(TGLViewer::kCameraPerspXOZ); break; case kGLPerspXOY: if (fActViewer) fActViewer->SetCurrentCamera(TGLViewer::kCameraPerspXOY); break; case kGLXOY: if (fActViewer) fActViewer->SetCurrentCamera(TGLViewer::kCameraOrthoXOY); break; case kGLXOZ: if (fActViewer) fActViewer->SetCurrentCamera(TGLViewer::kCameraOrthoXOZ); break; case kGLZOY: if (fActViewer) fActViewer->SetCurrentCamera(TGLViewer::kCameraOrthoZOY); break; case kGLOrthoRotate: ToggleOrthoRotate(); break; case kGLOrthoDolly: ToggleOrthoDolly(); break; case kSceneUpdate: if (fActViewer) fActViewer->UpdateScene(); UpdateSummary(); break; case kSceneUpdateAll: fViewer0->UpdateScene(); fViewer1->UpdateScene(); fViewer2->UpdateScene(); UpdateSummary(); break; case kSummaryUpdate: UpdateSummary(); break; case kHelpAbout: { #ifdef R__UNIX TString rootx; # ifdef ROOTBINDIR rootx = ROOTBINDIR; # else rootx = gSystem->Getenv("ROOTSYS"); if (!rootx.IsNull()) rootx += "/bin"; # endif rootx += "/root -a &"; gSystem->Exec(rootx); #else #ifdef WIN32 new TWin32SplashThread(kTRUE); #else char str[32]; sprintf(str, "About ROOT %s...", gROOT->GetVersion()); hd = new TRootHelpDialog(this, str, 600, 400); hd->SetText(gHelpAbout); hd->Popup(); #endif #endif } break; default: break; } } //______________________________________________________________________________ void SplitGLView::OnClicked(TObject *obj) { // Handle click events in GL viewer if (obj) fStatusBar->SetText(Form("User clicked on: \"%s\"", obj->GetName()), 1); else fStatusBar->SetText("", 1); } //______________________________________________________________________________ void SplitGLView::OnMouseIdle(TGLPhysicalShape *shape, UInt_t posx, UInt_t posy) { // Slot used to handle "OnMouseIdle" signal coming from any GL viewer. // We receive a pointer on the physical shape in which the mouse cursor is // and the actual cursor position (x,y) Window_t wtarget; Int_t x = 0, y = 0; static TH1F *h1f = 0; TFormula *form1 = new TFormula("form1","abs(sin(x)/x)"); form1->Update(); // silent warning about unused variable... TF1 *sqroot = new TF1("sqroot","x*gaus(0) + [3]*form1",0,10); sqroot->SetParameters(10,4,1,20); if (h1f == 0) h1f = new TH1F("h1f","",50,0,10); h1f->Reset(); h1f->SetFillColor(45); h1f->SetStats(0); h1f->FillRandom("sqroot",200); if (fShapedToolTip) { fShapedToolTip->UnmapWindow(); } if (shape && shape->GetLogical() && shape->GetLogical()->GetExternal()) { // get the actual viewer who actually emitted the signal TGLEmbeddedViewer *actViewer = dynamic_cast<TGLEmbeddedViewer*>((TQObject*)gTQSender); // then translate coordinates from the root (screen) coordinates // to the actual frame (viewer) ones gVirtualX->TranslateCoordinates(actViewer->GetFrame()->GetId(), gClient->GetDefaultRoot()->GetId(), posx, posy, x, y, wtarget); // Then display our tooltip at this x,y location if (fShapedToolTip) { fShapedToolTip->Show(x+5, y+5, Form("%s\n \n%s", shape->GetLogical()->GetExternal()->IsA()->GetName(), shape->GetLogical()->GetExternal()->GetName()), h1f); } } } //______________________________________________________________________________ void SplitGLView::OnMouseOver(TGLPhysicalShape *shape) { // Slot used to handle "OnMouseOver" signal coming from any GL viewer. // We receive a pointer on the physical shape in which the mouse cursor is. // display informations on the physical shape in the status bar if (shape && shape->GetLogical() && shape->GetLogical()->GetExternal()) fStatusBar->SetText(Form("Mouse Over: \"%s\"", shape->GetLogical()->GetExternal()->GetName()), 0); else fStatusBar->SetText("", 0); } //______________________________________________________________________________ void SplitGLView::OnViewerActivated() { // Slot used to handle "Activated" signal coming from any GL viewer. // Used to know which GL viewer is active. static Pixel_t green = 0; // set the actual GL viewer frame to default color if (fActViewer && fActViewer->GetFrame()) fActViewer->GetFrame()->ChangeBackground(GetDefaultFrameBackground()); // change the actual GL viewer to the one who emitted the signal // fActViewer = (TGLEmbeddedViewer *)gTQSender; fActViewer = dynamic_cast<TGLEmbeddedViewer*>((TQObject*)gTQSender); if (fActViewer == 0) { printf ("dyncast failed ...\n"); return; } // get the highlight color (only once) if (green == 0) { gClient->GetColorByName("green", green); } // set the new actual GL viewer frame to highlight color if (fActViewer->GetFrame()) fActViewer->GetFrame()->ChangeBackground(green); // update menu entries to match actual viewer's options if (fActViewer->GetOrthoXOYCamera()->GetDollyToZoom() && fActViewer->GetOrthoXOZCamera()->GetDollyToZoom() && fActViewer->GetOrthoZOYCamera()->GetDollyToZoom()) fMenuCamera->UnCheckEntry(kGLOrthoDolly); else fMenuCamera->CheckEntry(kGLOrthoDolly); if (fActViewer->GetOrthoXOYCamera()->GetEnableRotate() && fActViewer->GetOrthoXOYCamera()->GetEnableRotate() && fActViewer->GetOrthoXOYCamera()->GetEnableRotate()) fMenuCamera->CheckEntry(kGLOrthoRotate); else fMenuCamera->UnCheckEntry(kGLOrthoRotate); } //______________________________________________________________________________ void SplitGLView::OpenFile(const char *fname) { // Open a Root file to display a geometry in the GL viewers. TString filename = fname; // check if the file type is correct if (!filename.EndsWith(".root")) { new TGMsgBox(gClient->GetRoot(), this, "OpenFile", Form("The file \"%s\" is not a root file!", fname), kMBIconExclamation, kMBOk); return; } // check if the root file contains a geometry if (TGeoManager::Import(fname) == 0) { new TGMsgBox(gClient->GetRoot(), this, "OpenFile", Form("The file \"%s\" does't contain a geometry", fname), kMBIconExclamation, kMBOk); return; } gGeoManager->DefaultColors(); // delete previous primitives (if any) fPad->GetListOfPrimitives()->Delete(); // and add the geometry to eve pad (container) fPad->GetListOfPrimitives()->Add(gGeoManager->GetTopVolume()); // paint the geometry in each GL viewer fViewer0->PadPaint(fPad); fViewer1->PadPaint(fPad); fViewer2->PadPaint(fPad); } //______________________________________________________________________________ void SplitGLView::ToggleOrthoRotate() { // Toggle state of the 'Ortho allow rotate' menu entry. if (fMenuCamera->IsEntryChecked(kGLOrthoRotate)) fMenuCamera->UnCheckEntry(kGLOrthoRotate); else fMenuCamera->CheckEntry(kGLOrthoRotate); Bool_t state = fMenuCamera->IsEntryChecked(kGLOrthoRotate); if (fActViewer) { fActViewer->GetOrthoXOYCamera()->SetEnableRotate(state); fActViewer->GetOrthoXOYCamera()->SetEnableRotate(state); fActViewer->GetOrthoXOYCamera()->SetEnableRotate(state); } } //______________________________________________________________________________ void SplitGLView::ToggleOrthoDolly() { // Toggle state of the 'Ortho allow dolly' menu entry. if (fMenuCamera->IsEntryChecked(kGLOrthoDolly)) fMenuCamera->UnCheckEntry(kGLOrthoDolly); else fMenuCamera->CheckEntry(kGLOrthoDolly); Bool_t state = ! fMenuCamera->IsEntryChecked(kGLOrthoDolly); if (fActViewer) { fActViewer->GetOrthoXOYCamera()->SetDollyToZoom(state); fActViewer->GetOrthoXOZCamera()->SetDollyToZoom(state); fActViewer->GetOrthoZOYCamera()->SetDollyToZoom(state); } } //______________________________________________________________________________ void SplitGLView::ItemClicked(TGListTreeItem *item, Int_t, Int_t, Int_t) { // Item has been clicked, based on mouse button do: static const TEveException eh("SplitGLView::ItemClicked "); TEveElement* re = (TEveElement*)item->GetUserData(); if(re == 0) return; TObject* obj = re->GetObject(eh); if (obj->InheritsFrom("TEveViewer")) { TGLViewer *v = ((TEveViewer *)obj)->GetGLViewer(); //v->Activated(); if (v->InheritsFrom("TGLEmbeddedViewer")) { TGLEmbeddedViewer *ev = (TGLEmbeddedViewer *)v; gVirtualX->SetInputFocus(ev->GetGLWidget()->GetId()); } } } //______________________________________________________________________________ void SplitGLView::LoadConfig(const char *fname) { Int_t height, width; TEnv *env = new TEnv(fname); Int_t mainheight = env->GetValue("MainView.Height", 434); Int_t blwidth = env->GetValue("Bottom.Left.Width", 266); Int_t bcwidth = env->GetValue("Bottom.Center.Width", 266); Int_t brwidth = env->GetValue("Bottom.Right.Width", 266); Int_t top_height = env->GetValue("Right.Tab.Height", 0); Int_t bottom_height = env->GetValue("Bottom.Tab.Height", 0); if (fIsEmbedded && gEve) { Int_t sel = env->GetValue("Eve.Selection", gEve->GetSelection()->GetPickToSelect()); Int_t hi = env->GetValue("Eve.Highlight", gEve->GetHighlight()->GetPickToSelect()); gEve->GetBrowser()->EveMenu(9+sel); gEve->GetBrowser()->EveMenu(13+hi); width = env->GetValue("Eve.Width", (Int_t)gEve->GetBrowser()->GetWidth()); height = env->GetValue("Eve.Height", (Int_t)gEve->GetBrowser()->GetHeight()); gEve->GetBrowser()->Resize(width, height); } // top (main) split frame width = fSplitFrame->GetFirst()->GetWidth(); fSplitFrame->GetFirst()->Resize(width, mainheight); // bottom left split frame height = fSplitFrame->GetSecond()->GetFirst()->GetHeight(); fSplitFrame->GetSecond()->GetFirst()->Resize(blwidth, height); // bottom center split frame height = fSplitFrame->GetSecond()->GetSecond()->GetFirst()->GetHeight(); fSplitFrame->GetSecond()->GetSecond()->GetFirst()->Resize(bcwidth, height); // bottom right split frame height = fSplitFrame->GetSecond()->GetSecond()->GetSecond()->GetHeight(); fSplitFrame->GetSecond()->GetSecond()->GetSecond()->Resize(brwidth, height); fSplitFrame->Layout(); if (fIsEmbedded && gEve) { width = ((TGCompositeFrame *)gEve->GetBrowser()->GetTabBottom()->GetParent())->GetWidth(); ((TGCompositeFrame *)gEve->GetBrowser()->GetTabBottom()->GetParent())->Resize(width, bottom_height); width = ((TGCompositeFrame *)gEve->GetBrowser()->GetTabRight()->GetParent())->GetWidth(); ((TGCompositeFrame *)gEve->GetBrowser()->GetTabRight()->GetParent())->Resize(width, top_height); } } //______________________________________________________________________________ void SplitGLView::SaveConfig(const char *fname) { Int_t bottom_height = 0; Int_t top_height = 0; TGSplitFrame *frm; TEnv *env = new TEnv(fname); if (fIsEmbedded && gEve) { env->SetValue("Eve.Width", (Int_t)gEve->GetBrowser()->GetWidth()); env->SetValue("Eve.Height", (Int_t)gEve->GetBrowser()->GetHeight()); } // get top (main) split frame frm = fSplitFrame->GetFirst(); env->SetValue("MainView.Height", (Int_t)frm->GetHeight()); // get bottom left split frame frm = fSplitFrame->GetSecond()->GetFirst(); env->SetValue("Bottom.Left.Width", (Int_t)frm->GetWidth()); // get bottom center split frame frm = fSplitFrame->GetSecond()->GetSecond()->GetFirst(); env->SetValue("Bottom.Center.Width", (Int_t)frm->GetWidth()); // get bottom right split frame frm = fSplitFrame->GetSecond()->GetSecond()->GetSecond(); env->SetValue("Bottom.Right.Width", (Int_t)frm->GetWidth()); if (fIsEmbedded && gEve) { top_height = (Int_t)((TGCompositeFrame *)gEve->GetBrowser()->GetTabRight()->GetParent())->GetHeight(); env->SetValue("Right.Tab.Height", top_height); bottom_height = (Int_t)((TGCompositeFrame *)gEve->GetBrowser()->GetTabBottom()->GetParent())->GetHeight(); env->SetValue("Bottom.Tab.Height", bottom_height); env->SetValue("Eve.Selection", gEve->GetSelection()->GetPickToSelect()); env->SetValue("Eve.Highlight", gEve->GetHighlight()->GetPickToSelect()); } env->SaveLevel(kEnvLocal); #ifdef R__WIN32 if (!gSystem->AccessPathName(Form("%s.new", fname))) { gSystem->Exec(Form("del %s", fname)); gSystem->Rename(Form("%s.new", fname), fname); } #endif } //______________________________________________________________________________ void SplitGLView::SwapToMainView(TGLViewerBase *viewer) { // Swap frame embedded in a splitframe to the main view (slot method). TGCompositeFrame *parent = 0; if (!fSplitFrame->GetFirst()->GetFrame()) return; if (viewer == 0) { TGPictureButton *src = (TGPictureButton*)gTQSender; parent = (TGCompositeFrame *)src->GetParent(); while (parent && !parent->InheritsFrom("TGSplitFrame")) { parent = (TGCompositeFrame *)parent->GetParent(); } } else { TGCompositeFrame *src = ((TGLEmbeddedViewer *)viewer)->GetFrame(); if (!src) return; TGLOverlayButton *but = (TGLOverlayButton *)((TQObject *)gTQSender); but->ResetState(); parent = (TGCompositeFrame *)src->GetParent(); } if (parent && parent->InheritsFrom("TGSplitFrame")) ((TGSplitFrame *)parent)->SwitchToMain(); } //______________________________________________________________________________ void SplitGLView::UnDock(TGLViewerBase *viewer) { // Undock frame embedded in a splitframe (slot method). TGCompositeFrame *src = ((TGLEmbeddedViewer *)viewer)->GetFrame(); if (!src) return; TGLOverlayButton *but = (TGLOverlayButton *)((TQObject *)gTQSender); but->ResetState(); TGCompositeFrame *parent = (TGCompositeFrame *)src->GetParent(); if (parent && parent->InheritsFrom("TGSplitFrame")) ((TGSplitFrame *)parent)->ExtractFrame(); } //______________________________________________________________________________ void SplitGLView::UpdateSummary() { // Update summary of current event. TEveElement::List_i i; TEveElement::List_i j; Int_t k; TEveElement *el; HtmlObjTable *table; TEveEventManager *mgr = gEve ? gEve->GetCurrentEvent() : 0; if (mgr) { fgHtmlSummary->Clear("D"); for (i=mgr->BeginChildren(); i!=mgr->EndChildren(); ++i) { el = ((TEveElement*)(*i)); if (el->IsA() == TEvePointSet::Class()) { TEvePointSet *ps = (TEvePointSet *)el; TString ename = ps->GetElementName(); TString etitle = ps->GetElementTitle(); if (ename.First('\'') != kNPOS) ename.Remove(ename.First('\'')); etitle.Remove(0, 2); Int_t nel = atoi(etitle.Data()); table = fgHtmlSummary->AddTable(ename, 0, nel); } else if (el->IsA() == TEveTrackList::Class()) { TEveTrackList *tracks = (TEveTrackList *)el; TString ename = tracks->GetElementName(); if (ename.First('\'') != kNPOS) ename.Remove(ename.First('\'')); table = fgHtmlSummary->AddTable(ename.Data(), 5, tracks->NumChildren(), kTRUE, "first"); table->SetLabel(0, "Momentum"); table->SetLabel(1, "P_t"); table->SetLabel(2, "Phi"); table->SetLabel(3, "Theta"); table->SetLabel(4, "Eta"); k=0; for (j=tracks->BeginChildren(); j!=tracks->EndChildren(); ++j) { Float_t p = ((TEveTrack*)(*j))->GetMomentum().Mag(); table->SetValue(0, k, p); Float_t pt = ((TEveTrack*)(*j))->GetMomentum().Perp(); table->SetValue(1, k, pt); Float_t phi = ((TEveTrack*)(*j))->GetMomentum().Phi(); table->SetValue(2, k, phi); Float_t theta = ((TEveTrack*)(*j))->GetMomentum().Theta(); table->SetValue(3, k, theta); Float_t eta = ((TEveTrack*)(*j))->GetMomentum().Eta(); table->SetValue(4, k, eta); ++k; } } } fgHtmlSummary->Build(); fgHtml->Clear(); fgHtml->ParseText((char*)fgHtmlSummary->Html().Data()); fgHtml->Layout(); } } // Linkdef #ifdef __CINT__ #pragma link C++ class SplitGLView; #endif #ifdef __CINT__ void SplitGLView() { printf("This script is used via ACLiC by the macro \"alice_esd_split.C\"\n"); printf("To see it in action, just run \".x alice_esd_split.C\"\n"); return; } #endif SplitGLView.C:1 SplitGLView.C:2 SplitGLView.C:3 SplitGLView.C:4 SplitGLView.C:5 SplitGLView.C:6 SplitGLView.C:7 SplitGLView.C:8 SplitGLView.C:9 SplitGLView.C:10 SplitGLView.C:11 SplitGLView.C:12 SplitGLView.C:13 SplitGLView.C:14 SplitGLView.C:15 SplitGLView.C:16 SplitGLView.C:17 SplitGLView.C:18 SplitGLView.C:19 SplitGLView.C:20 SplitGLView.C:21 SplitGLView.C:22 SplitGLView.C:23 SplitGLView.C:24 SplitGLView.C:25 SplitGLView.C:26 SplitGLView.C:27 SplitGLView.C:28 SplitGLView.C:29 SplitGLView.C:30 SplitGLView.C:31 SplitGLView.C:32 SplitGLView.C:33 SplitGLView.C:34 SplitGLView.C:35 SplitGLView.C:36 SplitGLView.C:37 SplitGLView.C:38 SplitGLView.C:39 SplitGLView.C:40 SplitGLView.C:41 SplitGLView.C:42 SplitGLView.C:43 SplitGLView.C:44 SplitGLView.C:45 SplitGLView.C:46 SplitGLView.C:47 SplitGLView.C:48 SplitGLView.C:49 SplitGLView.C:50 SplitGLView.C:51 SplitGLView.C:52 SplitGLView.C:53 SplitGLView.C:54 SplitGLView.C:55 SplitGLView.C:56 SplitGLView.C:57 SplitGLView.C:58 SplitGLView.C:59 SplitGLView.C:60 SplitGLView.C:61 SplitGLView.C:62 SplitGLView.C:63 SplitGLView.C:64 SplitGLView.C:65 SplitGLView.C:66 SplitGLView.C:67 SplitGLView.C:68 SplitGLView.C:69 SplitGLView.C:70 SplitGLView.C:71 SplitGLView.C:72 SplitGLView.C:73 SplitGLView.C:74 SplitGLView.C:75 SplitGLView.C:76 SplitGLView.C:77 SplitGLView.C:78 SplitGLView.C:79 SplitGLView.C:80 SplitGLView.C:81 SplitGLView.C:82 SplitGLView.C:83 SplitGLView.C:84 SplitGLView.C:85 SplitGLView.C:86 SplitGLView.C:87 SplitGLView.C:88 SplitGLView.C:89 SplitGLView.C:90 SplitGLView.C:91 SplitGLView.C:92 SplitGLView.C:93 SplitGLView.C:94 SplitGLView.C:95 SplitGLView.C:96 SplitGLView.C:97 SplitGLView.C:98 SplitGLView.C:99 SplitGLView.C:100 SplitGLView.C:101 SplitGLView.C:102 SplitGLView.C:103 SplitGLView.C:104 SplitGLView.C:105 SplitGLView.C:106 SplitGLView.C:107 SplitGLView.C:108 SplitGLView.C:109 SplitGLView.C:110 SplitGLView.C:111 SplitGLView.C:112 SplitGLView.C:113 SplitGLView.C:114 SplitGLView.C:115 SplitGLView.C:116 SplitGLView.C:117 SplitGLView.C:118 SplitGLView.C:119 SplitGLView.C:120 SplitGLView.C:121 SplitGLView.C:122 SplitGLView.C:123 SplitGLView.C:124 SplitGLView.C:125 SplitGLView.C:126 SplitGLView.C:127 SplitGLView.C:128 SplitGLView.C:129 SplitGLView.C:130 SplitGLView.C:131 SplitGLView.C:132 SplitGLView.C:133 SplitGLView.C:134 SplitGLView.C:135 SplitGLView.C:136 SplitGLView.C:137 SplitGLView.C:138 SplitGLView.C:139 SplitGLView.C:140 SplitGLView.C:141 SplitGLView.C:142 SplitGLView.C:143 SplitGLView.C:144 SplitGLView.C:145 SplitGLView.C:146 SplitGLView.C:147 SplitGLView.C:148 SplitGLView.C:149 SplitGLView.C:150 SplitGLView.C:151 SplitGLView.C:152 SplitGLView.C:153 SplitGLView.C:154 SplitGLView.C:155 SplitGLView.C:156 SplitGLView.C:157 SplitGLView.C:158 SplitGLView.C:159 SplitGLView.C:160 SplitGLView.C:161 SplitGLView.C:162 SplitGLView.C:163 SplitGLView.C:164 SplitGLView.C:165 SplitGLView.C:166 SplitGLView.C:167 SplitGLView.C:168 SplitGLView.C:169 SplitGLView.C:170 SplitGLView.C:171 SplitGLView.C:172 SplitGLView.C:173 SplitGLView.C:174 SplitGLView.C:175 SplitGLView.C:176 SplitGLView.C:177 SplitGLView.C:178 SplitGLView.C:179 SplitGLView.C:180 SplitGLView.C:181 SplitGLView.C:182 SplitGLView.C:183 SplitGLView.C:184 SplitGLView.C:185 SplitGLView.C:186 SplitGLView.C:187 SplitGLView.C:188 SplitGLView.C:189 SplitGLView.C:190 SplitGLView.C:191 SplitGLView.C:192 SplitGLView.C:193 SplitGLView.C:194 SplitGLView.C:195 SplitGLView.C:196 SplitGLView.C:197 SplitGLView.C:198 SplitGLView.C:199 SplitGLView.C:200 SplitGLView.C:201 SplitGLView.C:202 SplitGLView.C:203 SplitGLView.C:204 SplitGLView.C:205 SplitGLView.C:206 SplitGLView.C:207 SplitGLView.C:208 SplitGLView.C:209 SplitGLView.C:210 SplitGLView.C:211 SplitGLView.C:212 SplitGLView.C:213 SplitGLView.C:214 SplitGLView.C:215 SplitGLView.C:216 SplitGLView.C:217 SplitGLView.C:218 SplitGLView.C:219 SplitGLView.C:220 SplitGLView.C:221 SplitGLView.C:222 SplitGLView.C:223 SplitGLView.C:224 SplitGLView.C:225 SplitGLView.C:226 SplitGLView.C:227 SplitGLView.C:228 SplitGLView.C:229 SplitGLView.C:230 SplitGLView.C:231 SplitGLView.C:232 SplitGLView.C:233 SplitGLView.C:234 SplitGLView.C:235 SplitGLView.C:236 SplitGLView.C:237 SplitGLView.C:238 SplitGLView.C:239 SplitGLView.C:240 SplitGLView.C:241 SplitGLView.C:242 SplitGLView.C:243 SplitGLView.C:244 SplitGLView.C:245 SplitGLView.C:246 SplitGLView.C:247 SplitGLView.C:248 SplitGLView.C:249 SplitGLView.C:250 SplitGLView.C:251 SplitGLView.C:252 SplitGLView.C:253 SplitGLView.C:254 SplitGLView.C:255 SplitGLView.C:256 SplitGLView.C:257 SplitGLView.C:258 SplitGLView.C:259 SplitGLView.C:260 SplitGLView.C:261 SplitGLView.C:262 SplitGLView.C:263 SplitGLView.C:264 SplitGLView.C:265 SplitGLView.C:266 SplitGLView.C:267 SplitGLView.C:268 SplitGLView.C:269 SplitGLView.C:270 SplitGLView.C:271 SplitGLView.C:272 SplitGLView.C:273 SplitGLView.C:274 SplitGLView.C:275 SplitGLView.C:276 SplitGLView.C:277 SplitGLView.C:278 SplitGLView.C:279 SplitGLView.C:280 SplitGLView.C:281 SplitGLView.C:282 SplitGLView.C:283 SplitGLView.C:284 SplitGLView.C:285 SplitGLView.C:286 SplitGLView.C:287 SplitGLView.C:288 SplitGLView.C:289 SplitGLView.C:290 SplitGLView.C:291 SplitGLView.C:292 SplitGLView.C:293 SplitGLView.C:294 SplitGLView.C:295 SplitGLView.C:296 SplitGLView.C:297 SplitGLView.C:298 SplitGLView.C:299 SplitGLView.C:300 SplitGLView.C:301 SplitGLView.C:302 SplitGLView.C:303 SplitGLView.C:304 SplitGLView.C:305 SplitGLView.C:306 SplitGLView.C:307 SplitGLView.C:308 SplitGLView.C:309 SplitGLView.C:310 SplitGLView.C:311 SplitGLView.C:312 SplitGLView.C:313 SplitGLView.C:314 SplitGLView.C:315 SplitGLView.C:316 SplitGLView.C:317 SplitGLView.C:318 SplitGLView.C:319 SplitGLView.C:320 SplitGLView.C:321 SplitGLView.C:322 SplitGLView.C:323 SplitGLView.C:324 SplitGLView.C:325 SplitGLView.C:326 SplitGLView.C:327 SplitGLView.C:328 SplitGLView.C:329 SplitGLView.C:330 SplitGLView.C:331 SplitGLView.C:332 SplitGLView.C:333 SplitGLView.C:334 SplitGLView.C:335 SplitGLView.C:336 SplitGLView.C:337 SplitGLView.C:338 SplitGLView.C:339 SplitGLView.C:340 SplitGLView.C:341 SplitGLView.C:342 SplitGLView.C:343 SplitGLView.C:344 SplitGLView.C:345 SplitGLView.C:346 SplitGLView.C:347 SplitGLView.C:348 SplitGLView.C:349 SplitGLView.C:350 SplitGLView.C:351 SplitGLView.C:352 SplitGLView.C:353 SplitGLView.C:354 SplitGLView.C:355 SplitGLView.C:356 SplitGLView.C:357 SplitGLView.C:358 SplitGLView.C:359 SplitGLView.C:360 SplitGLView.C:361 SplitGLView.C:362 SplitGLView.C:363 SplitGLView.C:364 SplitGLView.C:365 SplitGLView.C:366 SplitGLView.C:367 SplitGLView.C:368 SplitGLView.C:369 SplitGLView.C:370 SplitGLView.C:371 SplitGLView.C:372 SplitGLView.C:373 SplitGLView.C:374 SplitGLView.C:375 SplitGLView.C:376 SplitGLView.C:377 SplitGLView.C:378 SplitGLView.C:379 SplitGLView.C:380 SplitGLView.C:381 SplitGLView.C:382 SplitGLView.C:383 SplitGLView.C:384 SplitGLView.C:385 SplitGLView.C:386 SplitGLView.C:387 SplitGLView.C:388 SplitGLView.C:389 SplitGLView.C:390 SplitGLView.C:391 SplitGLView.C:392 SplitGLView.C:393 SplitGLView.C:394 SplitGLView.C:395 SplitGLView.C:396 SplitGLView.C:397 SplitGLView.C:398 SplitGLView.C:399 SplitGLView.C:400 SplitGLView.C:401 SplitGLView.C:402 SplitGLView.C:403 SplitGLView.C:404 SplitGLView.C:405 SplitGLView.C:406 SplitGLView.C:407 SplitGLView.C:408 SplitGLView.C:409 SplitGLView.C:410 SplitGLView.C:411 SplitGLView.C:412 SplitGLView.C:413 SplitGLView.C:414 SplitGLView.C:415 SplitGLView.C:416 SplitGLView.C:417 SplitGLView.C:418 SplitGLView.C:419 SplitGLView.C:420 SplitGLView.C:421 SplitGLView.C:422 SplitGLView.C:423 SplitGLView.C:424 SplitGLView.C:425 SplitGLView.C:426 SplitGLView.C:427 SplitGLView.C:428 SplitGLView.C:429 SplitGLView.C:430 SplitGLView.C:431 SplitGLView.C:432 SplitGLView.C:433 SplitGLView.C:434 SplitGLView.C:435 SplitGLView.C:436 SplitGLView.C:437 SplitGLView.C:438 SplitGLView.C:439 SplitGLView.C:440 SplitGLView.C:441 SplitGLView.C:442 SplitGLView.C:443 SplitGLView.C:444 SplitGLView.C:445 SplitGLView.C:446 SplitGLView.C:447 SplitGLView.C:448 SplitGLView.C:449 SplitGLView.C:450 SplitGLView.C:451 SplitGLView.C:452 SplitGLView.C:453 SplitGLView.C:454 SplitGLView.C:455 SplitGLView.C:456 SplitGLView.C:457 SplitGLView.C:458 SplitGLView.C:459 SplitGLView.C:460 SplitGLView.C:461 SplitGLView.C:462 SplitGLView.C:463 SplitGLView.C:464 SplitGLView.C:465 SplitGLView.C:466 SplitGLView.C:467 SplitGLView.C:468 SplitGLView.C:469 SplitGLView.C:470 SplitGLView.C:471 SplitGLView.C:472 SplitGLView.C:473 SplitGLView.C:474 SplitGLView.C:475 SplitGLView.C:476 SplitGLView.C:477 SplitGLView.C:478 SplitGLView.C:479 SplitGLView.C:480 SplitGLView.C:481 SplitGLView.C:482 SplitGLView.C:483 SplitGLView.C:484 SplitGLView.C:485 SplitGLView.C:486 SplitGLView.C:487 SplitGLView.C:488 SplitGLView.C:489 SplitGLView.C:490 SplitGLView.C:491 SplitGLView.C:492 SplitGLView.C:493 SplitGLView.C:494 SplitGLView.C:495 SplitGLView.C:496 SplitGLView.C:497 SplitGLView.C:498 SplitGLView.C:499 SplitGLView.C:500 SplitGLView.C:501 SplitGLView.C:502 SplitGLView.C:503 SplitGLView.C:504 SplitGLView.C:505 SplitGLView.C:506 SplitGLView.C:507 SplitGLView.C:508 SplitGLView.C:509 SplitGLView.C:510 SplitGLView.C:511 SplitGLView.C:512 SplitGLView.C:513 SplitGLView.C:514 SplitGLView.C:515 SplitGLView.C:516 SplitGLView.C:517 SplitGLView.C:518 SplitGLView.C:519 SplitGLView.C:520 SplitGLView.C:521 SplitGLView.C:522 SplitGLView.C:523 SplitGLView.C:524 SplitGLView.C:525 SplitGLView.C:526 SplitGLView.C:527 SplitGLView.C:528 SplitGLView.C:529 SplitGLView.C:530 SplitGLView.C:531 SplitGLView.C:532 SplitGLView.C:533 SplitGLView.C:534 SplitGLView.C:535 SplitGLView.C:536 SplitGLView.C:537 SplitGLView.C:538 SplitGLView.C:539 SplitGLView.C:540 SplitGLView.C:541 SplitGLView.C:542 SplitGLView.C:543 SplitGLView.C:544 SplitGLView.C:545 SplitGLView.C:546 SplitGLView.C:547 SplitGLView.C:548 SplitGLView.C:549 SplitGLView.C:550 SplitGLView.C:551 SplitGLView.C:552 SplitGLView.C:553 SplitGLView.C:554 SplitGLView.C:555 SplitGLView.C:556 SplitGLView.C:557 SplitGLView.C:558 SplitGLView.C:559 SplitGLView.C:560 SplitGLView.C:561 SplitGLView.C:562 SplitGLView.C:563 SplitGLView.C:564 SplitGLView.C:565 SplitGLView.C:566 SplitGLView.C:567 SplitGLView.C:568 SplitGLView.C:569 SplitGLView.C:570 SplitGLView.C:571 SplitGLView.C:572 SplitGLView.C:573 SplitGLView.C:574 SplitGLView.C:575 SplitGLView.C:576 SplitGLView.C:577 SplitGLView.C:578 SplitGLView.C:579 SplitGLView.C:580 SplitGLView.C:581 SplitGLView.C:582 SplitGLView.C:583 SplitGLView.C:584 SplitGLView.C:585 SplitGLView.C:586 SplitGLView.C:587 SplitGLView.C:588 SplitGLView.C:589 SplitGLView.C:590 SplitGLView.C:591 SplitGLView.C:592 SplitGLView.C:593 SplitGLView.C:594 SplitGLView.C:595 SplitGLView.C:596 SplitGLView.C:597 SplitGLView.C:598 SplitGLView.C:599 SplitGLView.C:600 SplitGLView.C:601 SplitGLView.C:602 SplitGLView.C:603 SplitGLView.C:604 SplitGLView.C:605 SplitGLView.C:606 SplitGLView.C:607 SplitGLView.C:608 SplitGLView.C:609 SplitGLView.C:610 SplitGLView.C:611 SplitGLView.C:612 SplitGLView.C:613 SplitGLView.C:614 SplitGLView.C:615 SplitGLView.C:616 SplitGLView.C:617 SplitGLView.C:618 SplitGLView.C:619 SplitGLView.C:620 SplitGLView.C:621 SplitGLView.C:622 SplitGLView.C:623 SplitGLView.C:624 SplitGLView.C:625 SplitGLView.C:626 SplitGLView.C:627 SplitGLView.C:628 SplitGLView.C:629 SplitGLView.C:630 SplitGLView.C:631 SplitGLView.C:632 SplitGLView.C:633 SplitGLView.C:634 SplitGLView.C:635 SplitGLView.C:636 SplitGLView.C:637 SplitGLView.C:638 SplitGLView.C:639 SplitGLView.C:640 SplitGLView.C:641 SplitGLView.C:642 SplitGLView.C:643 SplitGLView.C:644 SplitGLView.C:645 SplitGLView.C:646 SplitGLView.C:647 SplitGLView.C:648 SplitGLView.C:649 SplitGLView.C:650 SplitGLView.C:651 SplitGLView.C:652 SplitGLView.C:653 SplitGLView.C:654 SplitGLView.C:655 SplitGLView.C:656 SplitGLView.C:657 SplitGLView.C:658 SplitGLView.C:659 SplitGLView.C:660 SplitGLView.C:661 SplitGLView.C:662 SplitGLView.C:663 SplitGLView.C:664 SplitGLView.C:665 SplitGLView.C:666 SplitGLView.C:667 SplitGLView.C:668 SplitGLView.C:669 SplitGLView.C:670 SplitGLView.C:671 SplitGLView.C:672 SplitGLView.C:673 SplitGLView.C:674 SplitGLView.C:675 SplitGLView.C:676 SplitGLView.C:677 SplitGLView.C:678 SplitGLView.C:679 SplitGLView.C:680 SplitGLView.C:681 SplitGLView.C:682 SplitGLView.C:683 SplitGLView.C:684 SplitGLView.C:685 SplitGLView.C:686 SplitGLView.C:687 SplitGLView.C:688 SplitGLView.C:689 SplitGLView.C:690 SplitGLView.C:691 SplitGLView.C:692 SplitGLView.C:693 SplitGLView.C:694 SplitGLView.C:695 SplitGLView.C:696 SplitGLView.C:697 SplitGLView.C:698 SplitGLView.C:699 SplitGLView.C:700 SplitGLView.C:701 SplitGLView.C:702 SplitGLView.C:703 SplitGLView.C:704 SplitGLView.C:705 SplitGLView.C:706 SplitGLView.C:707 SplitGLView.C:708 SplitGLView.C:709 SplitGLView.C:710 SplitGLView.C:711 SplitGLView.C:712 SplitGLView.C:713 SplitGLView.C:714 SplitGLView.C:715 SplitGLView.C:716 SplitGLView.C:717 SplitGLView.C:718 SplitGLView.C:719 SplitGLView.C:720 SplitGLView.C:721 SplitGLView.C:722 SplitGLView.C:723 SplitGLView.C:724 SplitGLView.C:725 SplitGLView.C:726 SplitGLView.C:727 SplitGLView.C:728 SplitGLView.C:729 SplitGLView.C:730 SplitGLView.C:731 SplitGLView.C:732 SplitGLView.C:733 SplitGLView.C:734 SplitGLView.C:735 SplitGLView.C:736 SplitGLView.C:737 SplitGLView.C:738 SplitGLView.C:739 SplitGLView.C:740 SplitGLView.C:741 SplitGLView.C:742 SplitGLView.C:743 SplitGLView.C:744 SplitGLView.C:745 SplitGLView.C:746 SplitGLView.C:747 SplitGLView.C:748 SplitGLView.C:749 SplitGLView.C:750 SplitGLView.C:751 SplitGLView.C:752 SplitGLView.C:753 SplitGLView.C:754 SplitGLView.C:755 SplitGLView.C:756 SplitGLView.C:757 SplitGLView.C:758 SplitGLView.C:759 SplitGLView.C:760 SplitGLView.C:761 SplitGLView.C:762 SplitGLView.C:763 SplitGLView.C:764 SplitGLView.C:765 SplitGLView.C:766 SplitGLView.C:767 SplitGLView.C:768 SplitGLView.C:769 SplitGLView.C:770 SplitGLView.C:771 SplitGLView.C:772 SplitGLView.C:773 SplitGLView.C:774 SplitGLView.C:775 SplitGLView.C:776 SplitGLView.C:777 SplitGLView.C:778 SplitGLView.C:779 SplitGLView.C:780 SplitGLView.C:781 SplitGLView.C:782 SplitGLView.C:783 SplitGLView.C:784 SplitGLView.C:785 SplitGLView.C:786 SplitGLView.C:787 SplitGLView.C:788 SplitGLView.C:789 SplitGLView.C:790 SplitGLView.C:791 SplitGLView.C:792 SplitGLView.C:793 SplitGLView.C:794 SplitGLView.C:795 SplitGLView.C:796 SplitGLView.C:797 SplitGLView.C:798 SplitGLView.C:799 SplitGLView.C:800 SplitGLView.C:801 SplitGLView.C:802 SplitGLView.C:803 SplitGLView.C:804 SplitGLView.C:805 SplitGLView.C:806 SplitGLView.C:807 SplitGLView.C:808 SplitGLView.C:809 SplitGLView.C:810 SplitGLView.C:811 SplitGLView.C:812 SplitGLView.C:813 SplitGLView.C:814 SplitGLView.C:815 SplitGLView.C:816 SplitGLView.C:817 SplitGLView.C:818 SplitGLView.C:819 SplitGLView.C:820 SplitGLView.C:821 SplitGLView.C:822 SplitGLView.C:823 SplitGLView.C:824 SplitGLView.C:825 SplitGLView.C:826 SplitGLView.C:827 SplitGLView.C:828 SplitGLView.C:829 SplitGLView.C:830 SplitGLView.C:831 SplitGLView.C:832 SplitGLView.C:833 SplitGLView.C:834 SplitGLView.C:835 SplitGLView.C:836 SplitGLView.C:837 SplitGLView.C:838 SplitGLView.C:839 SplitGLView.C:840 SplitGLView.C:841 SplitGLView.C:842 SplitGLView.C:843 SplitGLView.C:844 SplitGLView.C:845 SplitGLView.C:846 SplitGLView.C:847 SplitGLView.C:848 SplitGLView.C:849 SplitGLView.C:850 SplitGLView.C:851 SplitGLView.C:852 SplitGLView.C:853 SplitGLView.C:854 SplitGLView.C:855 SplitGLView.C:856 SplitGLView.C:857 SplitGLView.C:858 SplitGLView.C:859 SplitGLView.C:860 SplitGLView.C:861 SplitGLView.C:862 SplitGLView.C:863 SplitGLView.C:864 SplitGLView.C:865 SplitGLView.C:866 SplitGLView.C:867 SplitGLView.C:868 SplitGLView.C:869 SplitGLView.C:870 SplitGLView.C:871 SplitGLView.C:872 SplitGLView.C:873 SplitGLView.C:874 SplitGLView.C:875 SplitGLView.C:876 SplitGLView.C:877 SplitGLView.C:878 SplitGLView.C:879 SplitGLView.C:880 SplitGLView.C:881 SplitGLView.C:882 SplitGLView.C:883 SplitGLView.C:884 SplitGLView.C:885 SplitGLView.C:886 SplitGLView.C:887 SplitGLView.C:888 SplitGLView.C:889 SplitGLView.C:890 SplitGLView.C:891 SplitGLView.C:892 SplitGLView.C:893 SplitGLView.C:894 SplitGLView.C:895 SplitGLView.C:896 SplitGLView.C:897 SplitGLView.C:898 SplitGLView.C:899 SplitGLView.C:900 SplitGLView.C:901 SplitGLView.C:902 SplitGLView.C:903 SplitGLView.C:904 SplitGLView.C:905 SplitGLView.C:906 SplitGLView.C:907 SplitGLView.C:908 SplitGLView.C:909 SplitGLView.C:910 SplitGLView.C:911 SplitGLView.C:912 SplitGLView.C:913 SplitGLView.C:914 SplitGLView.C:915 SplitGLView.C:916 SplitGLView.C:917 SplitGLView.C:918 SplitGLView.C:919 SplitGLView.C:920 SplitGLView.C:921 SplitGLView.C:922 SplitGLView.C:923 SplitGLView.C:924 SplitGLView.C:925 SplitGLView.C:926 SplitGLView.C:927 SplitGLView.C:928 SplitGLView.C:929 SplitGLView.C:930 SplitGLView.C:931 SplitGLView.C:932 SplitGLView.C:933 SplitGLView.C:934 SplitGLView.C:935 SplitGLView.C:936 SplitGLView.C:937 SplitGLView.C:938 SplitGLView.C:939 SplitGLView.C:940 SplitGLView.C:941 SplitGLView.C:942 SplitGLView.C:943 SplitGLView.C:944 SplitGLView.C:945 SplitGLView.C:946 SplitGLView.C:947 SplitGLView.C:948 SplitGLView.C:949 SplitGLView.C:950 SplitGLView.C:951 SplitGLView.C:952 SplitGLView.C:953 SplitGLView.C:954 SplitGLView.C:955 SplitGLView.C:956 SplitGLView.C:957 SplitGLView.C:958 SplitGLView.C:959 SplitGLView.C:960 SplitGLView.C:961 SplitGLView.C:962 SplitGLView.C:963 SplitGLView.C:964 SplitGLView.C:965 SplitGLView.C:966 SplitGLView.C:967 SplitGLView.C:968 SplitGLView.C:969 SplitGLView.C:970 SplitGLView.C:971 SplitGLView.C:972 SplitGLView.C:973 SplitGLView.C:974 SplitGLView.C:975 SplitGLView.C:976 SplitGLView.C:977 SplitGLView.C:978 SplitGLView.C:979 SplitGLView.C:980 SplitGLView.C:981 SplitGLView.C:982 SplitGLView.C:983 SplitGLView.C:984 SplitGLView.C:985 SplitGLView.C:986 SplitGLView.C:987 SplitGLView.C:988 SplitGLView.C:989 SplitGLView.C:990 SplitGLView.C:991 SplitGLView.C:992 SplitGLView.C:993 SplitGLView.C:994 SplitGLView.C:995 SplitGLView.C:996 SplitGLView.C:997 SplitGLView.C:998 SplitGLView.C:999 SplitGLView.C:1000 SplitGLView.C:1001 SplitGLView.C:1002 SplitGLView.C:1003 SplitGLView.C:1004 SplitGLView.C:1005 SplitGLView.C:1006 SplitGLView.C:1007 SplitGLView.C:1008 SplitGLView.C:1009 SplitGLView.C:1010 SplitGLView.C:1011 SplitGLView.C:1012 SplitGLView.C:1013 SplitGLView.C:1014 SplitGLView.C:1015 SplitGLView.C:1016 SplitGLView.C:1017 SplitGLView.C:1018 SplitGLView.C:1019 SplitGLView.C:1020 SplitGLView.C:1021 SplitGLView.C:1022 SplitGLView.C:1023 SplitGLView.C:1024 SplitGLView.C:1025 SplitGLView.C:1026 SplitGLView.C:1027 SplitGLView.C:1028 SplitGLView.C:1029 SplitGLView.C:1030 SplitGLView.C:1031 SplitGLView.C:1032 SplitGLView.C:1033 SplitGLView.C:1034 SplitGLView.C:1035 SplitGLView.C:1036 SplitGLView.C:1037 SplitGLView.C:1038 SplitGLView.C:1039 SplitGLView.C:1040 SplitGLView.C:1041 SplitGLView.C:1042 SplitGLView.C:1043 SplitGLView.C:1044 SplitGLView.C:1045 SplitGLView.C:1046 SplitGLView.C:1047 SplitGLView.C:1048 SplitGLView.C:1049 SplitGLView.C:1050 SplitGLView.C:1051 SplitGLView.C:1052 SplitGLView.C:1053 SplitGLView.C:1054 SplitGLView.C:1055 SplitGLView.C:1056 SplitGLView.C:1057 SplitGLView.C:1058 SplitGLView.C:1059 SplitGLView.C:1060 SplitGLView.C:1061 SplitGLView.C:1062 SplitGLView.C:1063 SplitGLView.C:1064 SplitGLView.C:1065 SplitGLView.C:1066 SplitGLView.C:1067 SplitGLView.C:1068 SplitGLView.C:1069 SplitGLView.C:1070 SplitGLView.C:1071 SplitGLView.C:1072 SplitGLView.C:1073 SplitGLView.C:1074 SplitGLView.C:1075 SplitGLView.C:1076 SplitGLView.C:1077 SplitGLView.C:1078 SplitGLView.C:1079 SplitGLView.C:1080 SplitGLView.C:1081 SplitGLView.C:1082 SplitGLView.C:1083 SplitGLView.C:1084 SplitGLView.C:1085 SplitGLView.C:1086 SplitGLView.C:1087 SplitGLView.C:1088 SplitGLView.C:1089 SplitGLView.C:1090 SplitGLView.C:1091 SplitGLView.C:1092 SplitGLView.C:1093 SplitGLView.C:1094 SplitGLView.C:1095 SplitGLView.C:1096 SplitGLView.C:1097 SplitGLView.C:1098 SplitGLView.C:1099 SplitGLView.C:1100 SplitGLView.C:1101 SplitGLView.C:1102 SplitGLView.C:1103 SplitGLView.C:1104 SplitGLView.C:1105 SplitGLView.C:1106 SplitGLView.C:1107 SplitGLView.C:1108 SplitGLView.C:1109 SplitGLView.C:1110 SplitGLView.C:1111 SplitGLView.C:1112 SplitGLView.C:1113 SplitGLView.C:1114 SplitGLView.C:1115 SplitGLView.C:1116 SplitGLView.C:1117 SplitGLView.C:1118 SplitGLView.C:1119 SplitGLView.C:1120 SplitGLView.C:1121 SplitGLView.C:1122 SplitGLView.C:1123 SplitGLView.C:1124 SplitGLView.C:1125 SplitGLView.C:1126 SplitGLView.C:1127 SplitGLView.C:1128 SplitGLView.C:1129 SplitGLView.C:1130 SplitGLView.C:1131 SplitGLView.C:1132 SplitGLView.C:1133 SplitGLView.C:1134 SplitGLView.C:1135 SplitGLView.C:1136 SplitGLView.C:1137 SplitGLView.C:1138 SplitGLView.C:1139 SplitGLView.C:1140 SplitGLView.C:1141 SplitGLView.C:1142 SplitGLView.C:1143 SplitGLView.C:1144 SplitGLView.C:1145 SplitGLView.C:1146 SplitGLView.C:1147 SplitGLView.C:1148 SplitGLView.C:1149 SplitGLView.C:1150 SplitGLView.C:1151 SplitGLView.C:1152 SplitGLView.C:1153 SplitGLView.C:1154 SplitGLView.C:1155 SplitGLView.C:1156 SplitGLView.C:1157 SplitGLView.C:1158 SplitGLView.C:1159 SplitGLView.C:1160 SplitGLView.C:1161 SplitGLView.C:1162 SplitGLView.C:1163 SplitGLView.C:1164 SplitGLView.C:1165 SplitGLView.C:1166 SplitGLView.C:1167 SplitGLView.C:1168 SplitGLView.C:1169 SplitGLView.C:1170 SplitGLView.C:1171 SplitGLView.C:1172 SplitGLView.C:1173 SplitGLView.C:1174 SplitGLView.C:1175 SplitGLView.C:1176 SplitGLView.C:1177 SplitGLView.C:1178 SplitGLView.C:1179 SplitGLView.C:1180 SplitGLView.C:1181 SplitGLView.C:1182 SplitGLView.C:1183 SplitGLView.C:1184 SplitGLView.C:1185 SplitGLView.C:1186 SplitGLView.C:1187 SplitGLView.C:1188 SplitGLView.C:1189 SplitGLView.C:1190 SplitGLView.C:1191 SplitGLView.C:1192 SplitGLView.C:1193 SplitGLView.C:1194 SplitGLView.C:1195 SplitGLView.C:1196 SplitGLView.C:1197 SplitGLView.C:1198 SplitGLView.C:1199 SplitGLView.C:1200 SplitGLView.C:1201 SplitGLView.C:1202 SplitGLView.C:1203 SplitGLView.C:1204 SplitGLView.C:1205 SplitGLView.C:1206 SplitGLView.C:1207 SplitGLView.C:1208 SplitGLView.C:1209 SplitGLView.C:1210 SplitGLView.C:1211 SplitGLView.C:1212 SplitGLView.C:1213 SplitGLView.C:1214 SplitGLView.C:1215 SplitGLView.C:1216 SplitGLView.C:1217 SplitGLView.C:1218 SplitGLView.C:1219 SplitGLView.C:1220 SplitGLView.C:1221 SplitGLView.C:1222 SplitGLView.C:1223 SplitGLView.C:1224 SplitGLView.C:1225 SplitGLView.C:1226 SplitGLView.C:1227 SplitGLView.C:1228 SplitGLView.C:1229 SplitGLView.C:1230 SplitGLView.C:1231 SplitGLView.C:1232 SplitGLView.C:1233 SplitGLView.C:1234 SplitGLView.C:1235 SplitGLView.C:1236 SplitGLView.C:1237 SplitGLView.C:1238 SplitGLView.C:1239 SplitGLView.C:1240 SplitGLView.C:1241 SplitGLView.C:1242 SplitGLView.C:1243 SplitGLView.C:1244 SplitGLView.C:1245 SplitGLView.C:1246 SplitGLView.C:1247 SplitGLView.C:1248 SplitGLView.C:1249 SplitGLView.C:1250 SplitGLView.C:1251 SplitGLView.C:1252 SplitGLView.C:1253 SplitGLView.C:1254 SplitGLView.C:1255 SplitGLView.C:1256 SplitGLView.C:1257 SplitGLView.C:1258 SplitGLView.C:1259 SplitGLView.C:1260 SplitGLView.C:1261 SplitGLView.C:1262 SplitGLView.C:1263 SplitGLView.C:1264 SplitGLView.C:1265 SplitGLView.C:1266 SplitGLView.C:1267 SplitGLView.C:1268 SplitGLView.C:1269 SplitGLView.C:1270 SplitGLView.C:1271 SplitGLView.C:1272 SplitGLView.C:1273 SplitGLView.C:1274 SplitGLView.C:1275 SplitGLView.C:1276 SplitGLView.C:1277 SplitGLView.C:1278 SplitGLView.C:1279 SplitGLView.C:1280 SplitGLView.C:1281 SplitGLView.C:1282 SplitGLView.C:1283 SplitGLView.C:1284 SplitGLView.C:1285 SplitGLView.C:1286 SplitGLView.C:1287 SplitGLView.C:1288 SplitGLView.C:1289 SplitGLView.C:1290 SplitGLView.C:1291 SplitGLView.C:1292 SplitGLView.C:1293 SplitGLView.C:1294 SplitGLView.C:1295 SplitGLView.C:1296 SplitGLView.C:1297 SplitGLView.C:1298 SplitGLView.C:1299 SplitGLView.C:1300 SplitGLView.C:1301 SplitGLView.C:1302 SplitGLView.C:1303 SplitGLView.C:1304 SplitGLView.C:1305 SplitGLView.C:1306 SplitGLView.C:1307 SplitGLView.C:1308 SplitGLView.C:1309 SplitGLView.C:1310 SplitGLView.C:1311 SplitGLView.C:1312 SplitGLView.C:1313 SplitGLView.C:1314 SplitGLView.C:1315 SplitGLView.C:1316 SplitGLView.C:1317 SplitGLView.C:1318 SplitGLView.C:1319 SplitGLView.C:1320 SplitGLView.C:1321 SplitGLView.C:1322 SplitGLView.C:1323 SplitGLView.C:1324 SplitGLView.C:1325 SplitGLView.C:1326 SplitGLView.C:1327 SplitGLView.C:1328 SplitGLView.C:1329 SplitGLView.C:1330 SplitGLView.C:1331 SplitGLView.C:1332 SplitGLView.C:1333 SplitGLView.C:1334 SplitGLView.C:1335 SplitGLView.C:1336 SplitGLView.C:1337 SplitGLView.C:1338 SplitGLView.C:1339 SplitGLView.C:1340 SplitGLView.C:1341 SplitGLView.C:1342 SplitGLView.C:1343 SplitGLView.C:1344 SplitGLView.C:1345 SplitGLView.C:1346 SplitGLView.C:1347 SplitGLView.C:1348 SplitGLView.C:1349 SplitGLView.C:1350 SplitGLView.C:1351 SplitGLView.C:1352 SplitGLView.C:1353 SplitGLView.C:1354 SplitGLView.C:1355 SplitGLView.C:1356 SplitGLView.C:1357 SplitGLView.C:1358 SplitGLView.C:1359 SplitGLView.C:1360 SplitGLView.C:1361 SplitGLView.C:1362 SplitGLView.C:1363 SplitGLView.C:1364 SplitGLView.C:1365 SplitGLView.C:1366 SplitGLView.C:1367 SplitGLView.C:1368 SplitGLView.C:1369 SplitGLView.C:1370 SplitGLView.C:1371 SplitGLView.C:1372 SplitGLView.C:1373 SplitGLView.C:1374 SplitGLView.C:1375 SplitGLView.C:1376 SplitGLView.C:1377 SplitGLView.C:1378 SplitGLView.C:1379 SplitGLView.C:1380 SplitGLView.C:1381 SplitGLView.C:1382 SplitGLView.C:1383 SplitGLView.C:1384 SplitGLView.C:1385 SplitGLView.C:1386 SplitGLView.C:1387 SplitGLView.C:1388 SplitGLView.C:1389 SplitGLView.C:1390 SplitGLView.C:1391 SplitGLView.C:1392 SplitGLView.C:1393 SplitGLView.C:1394 SplitGLView.C:1395 SplitGLView.C:1396 SplitGLView.C:1397 SplitGLView.C:1398 SplitGLView.C:1399 SplitGLView.C:1400 SplitGLView.C:1401 SplitGLView.C:1402 SplitGLView.C:1403 SplitGLView.C:1404 SplitGLView.C:1405 SplitGLView.C:1406 SplitGLView.C:1407 SplitGLView.C:1408 SplitGLView.C:1409 SplitGLView.C:1410 SplitGLView.C:1411 SplitGLView.C:1412 SplitGLView.C:1413 SplitGLView.C:1414 SplitGLView.C:1415 SplitGLView.C:1416 SplitGLView.C:1417 SplitGLView.C:1418 SplitGLView.C:1419 SplitGLView.C:1420 SplitGLView.C:1421 SplitGLView.C:1422 SplitGLView.C:1423 SplitGLView.C:1424 SplitGLView.C:1425 SplitGLView.C:1426 SplitGLView.C:1427 SplitGLView.C:1428 SplitGLView.C:1429 SplitGLView.C:1430 SplitGLView.C:1431 SplitGLView.C:1432 SplitGLView.C:1433 SplitGLView.C:1434 SplitGLView.C:1435 SplitGLView.C:1436 SplitGLView.C:1437 SplitGLView.C:1438 SplitGLView.C:1439 SplitGLView.C:1440 SplitGLView.C:1441 SplitGLView.C:1442 SplitGLView.C:1443 SplitGLView.C:1444 SplitGLView.C:1445 SplitGLView.C:1446 SplitGLView.C:1447 SplitGLView.C:1448 SplitGLView.C:1449 SplitGLView.C:1450 SplitGLView.C:1451 SplitGLView.C:1452 SplitGLView.C:1453 SplitGLView.C:1454 |
|