]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - AliGeant3/AliGuiGeomMain.cxx
First version of AliGeant3
[u/mrichter/AliRoot.git] / AliGeant3 / AliGuiGeomMain.cxx
diff --git a/AliGeant3/AliGuiGeomMain.cxx b/AliGeant3/AliGuiGeomMain.cxx
new file mode 100644 (file)
index 0000000..4a5d5e5
--- /dev/null
@@ -0,0 +1,929 @@
+/* *************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictlSy for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/*
+$Log$
+Revision 1.5  2002/03/19 09:36:17  morsch
+Unnecessary includes removes, one included. (Jacek M. Holeczek)
+
+Revision 1.4  2001/07/18 14:59:13  morsch
+Unactive code in dialog removed (caused compiling problems with ROOT 3.01/06)
+
+Revision 1.3  2001/07/17 09:50:21  morsch
+Index on media and material arrays corrected
+
+Revision 1.2  2001/07/09 11:46:08  morsch
+Conversion code moved to AliG3toRoot
+
+Revision 1.1  2000/07/13 16:19:10  fca
+Mainly coding conventions + some small bug fixes
+
+Revision 1.8  2000/07/12 08:56:32  fca
+Coding convention correction and warning removal
+
+Revision 1.7  2000/06/28 21:27:45  morsch
+Most coding rule violations corrected.
+Still to do: Split the file (on file per class) ? Avoid the global variables.
+Copy constructors and assignment operators (dummy ?)
+
+Revision 1.6  2000/04/14 11:07:46  morsch
+Correct volume to medium assignment in case several media are asigned to the
+same material.
+
+Revision 1.5  2000/03/20 15:11:03  fca
+Mods to make the code compile on HP
+
+Revision 1.4  2000/01/18 16:12:08  morsch
+Bug in calculation of number of volume divisions and number of positionings corrected
+Browser for Material and Media properties added
+
+Revision 1.3  1999/11/14 14:31:14  fca
+Correct small error and remove compilation warnings on HP
+
+Revision 1.2  1999/11/10 16:53:35  fca
+The new geometry viewer from A.Morsch
+
+*/
+
+/* 
+ *  Version: 0
+ *  Written by Andreas Morsch
+ *  
+ * 
+ *
+ * For questions critics and suggestions to this part of the code
+ * contact andreas.morsch@cern.ch
+ * 
+ **************************************************************************/
+
+#include <stdlib.h>
+#include <TArrayF.h>
+#include <TGMsgBox.h>
+#include <TGMenu.h>
+#include <TGTab.h>
+#include <TGFrame.h>
+#include <TGTextBuffer.h>
+#include <TGTextEntry.h>
+#include <TGLabel.h>
+#include <TGButton.h>
+#include <TGraph.h>
+#include <TCanvas.h>
+#include <TH1.h>
+#include <TApplication.h>
+#include <TGFileDialog.h>
+#include <TGListTree.h>
+#include <TGeant3.h>
+#include <TShape.h>
+#include <TGeometry.h>
+#include <TBRIK.h>
+#include <TGeometry.h>
+#include <TList.h>
+#include <TFile.h>
+#include <TFolder.h>
+
+#include "AliGuiGeomMain.h"
+#include "AliGuiGeomDialog.h"
+#include "AliG3Volume.h"
+#include "AliG3Medium.h"
+#include "AliG3Material.h"
+#include "AliNode.h"
+
+
+ClassImp(AliGuiGeomMain)
+
+static Int_t           gCurrentParticle = 1;
+static Int_t           gCurrentProcess  = 1;
+
+ const Text_t* kLabelTextP[19]  = 
+{"PAIR  ", "COMP  ", "PHOT  ", "PFIS  ", "DRAY  ", "ANNI  ", "BREM  ", 
+ "HADR  ", "MUNU  ", "DCAY  ", "LOSS  ", "MULS  ", "GHCOR1", "BIRK1 ", 
+ "BIRK2 ", "BIRK3 ", "LABS  ", "SYNC  ", "STRA  "};
+
+
+ const Text_t* kLabelTextC[10]  = 
+ {"CUTGAM", "CUTELE", "CUTNEU", "CUTHAD", "CUTMUO", "BCUTE", "BCUTM",
+  "DCUTE ", "DCUTM ", "PPCUTM"};
+
+const Text_t* kLabelTextPart[24]  = 
+{"Photon", "Positron", "Electron", "Neutrino", "Muon+", "Muon-", 
+ "Pi0", "Pi+", "Pi-", "Kaon_L", "Kaon+", "Kaon-", "Neutron", "Proton", 
+ "Anti Proton", "Kaon_S", "Eta", "Lambda", "Sigma+", "Sigma0", "Sigma-",
+ "Xi0", "Xi-", "Omega-"};
+
+const Text_t* kLabelTextMechanism[24]  = 
+{"HADF", "INEF", "ELAF", "FISF", "CAPF",
+ "HADG", "INEG", "ELAG", "FISG", "CAPG",
+ "LOSS", "PHOT", "ANNI", "COMP", "BREM",
+ "PAIR", "DRAY", "PFIS", "RAYL", "HADG",
+ "MUNU", "RANG", "STEP", "MUON"};
+
+
+
+
+enum ETestCommandIdentifiers {
+   kFileOpen,
+   kFileSave,
+   kFileSaveAs,
+   kFileExit,
+
+   kTestDlg,
+
+   kHelpContents,
+   kHelpSearch,
+   kHelpAbout,
+
+
+   kVId1,
+   kHId1,
+   kVId2,
+   kHId2,
+
+   kVSId1,
+   kHSId1,
+   kVSId2,
+   kHSId2
+};
+
+
+Int_t mbButtonId[9] = { kMBYes, kMBNo, kMBOk, kMBApply,
+                          kMBRetry, kMBIgnore, kMBCancel,
+                          kMBClose, kMBDismiss };
+
+EMsgBoxIcon mbIcon[4] = { kMBIconStop, kMBIconQuestion,
+                           kMBIconExclamation, kMBIconAsterisk };
+
+const char *kFileTypes[] = { "All files",     "*",
+                            "ROOT files",    "*.root",
+                            "ROOT macros",   "*.C",
+                            0,               0 };
+
+
+
+
+TGListTreeItem*  AliGuiGeomMain::
+AddItem(TObject * obj, TGListTreeItem *parent, const char* name, const TGPicture *open, const TGPicture *closed)
+{
+// Add item to the list tree
+    return fLt->AddItem(parent, name, obj, open, closed);
+}
+
+AliGuiGeomMain::AliGuiGeomMain(const TGWindow *p, UInt_t w, UInt_t h)
+      : TGMainFrame(p, w, h)
+{
+    // Create test main frame. A TGMainFrame is a top level window.
+    // Create menubar and popup menus. The hint objects are used to place
+    // and group the different menu widgets with respect to eachother.
+    
+    fDialog=0;
+    fMenuBarLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX,
+                                      0, 0, 1, 1);
+    fMenuBarItemLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0);
+    fMenuBarHelpLayout = new TGLayoutHints(kLHintsTop | kLHintsRight);
+    
+    fMenuFile = new TGPopupMenu(gClient->GetRoot());
+    fMenuFile->AddEntry("&Open...", kFileOpen);
+    fMenuFile->AddEntry("&Save", kFileSave);
+    fMenuFile->AddEntry("S&ave as...", kFileSaveAs);
+    fMenuFile->AddEntry("&Close", -1);
+    fMenuFile->AddSeparator();
+    fMenuFile->AddEntry("E&xit", kFileExit);
+    
+    fMenuFile->DisableEntry(kFileSaveAs);
+    fMenuFile->DisableEntry(kFileOpen);
+    fMenuFile->DisableEntry(kFileSave);
+    
+
+
+   fMenuTest = new TGPopupMenu(this);
+   fMenuTest->AddLabel("Draw");
+   fMenuTest->AddSeparator();
+   fMenuTest->AddEntry("&Volume Draw Control", kTestDlg);
+   fMenuTest->AddSeparator();
+   fMenuTest->Associate(this);
+   
+   
+   fMenuHelp = new TGPopupMenu(gClient->GetRoot());
+   fMenuHelp->AddEntry("&Contents", kHelpContents);
+   fMenuHelp->AddEntry("&Search...", kHelpSearch);
+   fMenuHelp->AddSeparator();
+   fMenuHelp->AddEntry("&About", kHelpAbout);
+
+   fMenuFile->DisableEntry(kHelpContents);
+   fMenuFile->DisableEntry(kHelpSearch);
+   fMenuFile->DisableEntry(kHelpAbout);
+   // Menu button messages are handled by the main frame (i.e. "this")
+   // ProcessMessage() method.
+   fMenuFile->Associate(this);
+   fMenuTest->Associate(this);
+   fMenuHelp->Associate(this);
+
+   fMenuBar = new TGMenuBar(this, 1, 1, kHorizontalFrame);
+   fMenuBar->AddPopup("&File", fMenuFile, fMenuBarItemLayout);
+   fMenuBar->AddPopup("&Draw Control", fMenuTest, fMenuBarItemLayout);
+   fMenuBar->AddPopup("&Help", fMenuHelp, fMenuBarHelpLayout);
+
+   AddFrame(fMenuBar, fMenuBarLayout);
+
+// 
+// Volumes
+//
+   fTab = new TGTab(this, 400, 400);
+   TGCompositeFrame *tf = fTab->AddTab("Volumes");
+   TGLayoutHints *lTab = new TGLayoutHints(kLHintsBottom | kLHintsExpandX |
+                                          kLHintsExpandY, 2, 2, 5, 1);
+   AddFrame(fTab, lTab);
+
+// Create TGCanvas and a canvas container which uses a tile layout manager
+   fCanvasWindow = new TGCanvas(tf, 400, 240);
+// Create TreeList
+   fLt = new TGListTree(fCanvasWindow->GetViewPort(), 10, 10, kHorizontalFrame,
+                        fgWhitePixel);
+   fLt->Associate(this);
+   fCanvasWindow->SetContainer(fLt);
+
+    
+   TGLayoutHints *lo = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY);
+   tf->AddFrame(fCanvasWindow, lo);
+//
+// Materials
+//
+   tf = fTab->AddTab("Materials");
+   fF2 = new TGCompositeFrame(tf, 60, 20, kHorizontalFrame);
+   fL2 = new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5);
+// ComboBox for materials
+   fMaterialCombo = new TGComboBox(fF2, 1);
+   fF2->AddFrame(fMaterialCombo, fL2);
+// 
+// text labels with material properties 
+//
+   Text_t* labelText[6]  = 
+   {"Material Number  ", 
+    "Atomic Weight    ",
+    "Atomic Number    ", 
+    "Density          ",
+    "Radiation Length ", 
+    "Absorption Length"};
+
+   TGLayoutHints* bly   = 
+       new TGLayoutHints(kLHintsTop | kLHintsExpandY, 5, 5, 5, 5);
+   TGLayoutHints* bFly1 = 
+       new TGLayoutHints(kLHintsLeft | kLHintsExpandX );
+   fF21 = new TGCompositeFrame(fF2, 60, 20, kVerticalFrame);
+   fF2->AddFrame(fF21,fL2);
+   { //Begin local scope for i
+     for (Int_t i=0; i<6; i++) {
+       Int_t idT=i+1;       
+       fHframe[i] = new TGHorizontalFrame(fF21, 400, 100, kFixedWidth);
+       fF21->AddFrame(fHframe[i], bly);
+       fTbh[i] = new TGTextBuffer(10);
+       fTeh[i] = new TGTextEntry(fHframe[i], fTbh[i],idT);
+       fTeh[i]->Associate(this);
+       fLabel[i] = new TGLabel(fHframe[i], labelText[i]);
+       fHframe[i]->AddFrame(fLabel[i], bFly1);
+       fHframe[i]->AddFrame(fTeh[i], bFly1);
+     }
+   } //End local scope for i
+   tf->AddFrame(fF2, fL2);
+   fMaterialCombo->Resize(200, 20);
+   fMaterialCombo->Associate(this);
+   
+
+// Media Combo
+//   
+   tf = fTab->AddTab("Media");
+   fF3 = new TGCompositeFrame(tf, 60, 20, kHorizontalFrame);
+// ComboBox for tracking media
+   fMediaCombo = new TGComboBox(fF3, 2);
+   fF3->AddFrame(fMediaCombo, fL2);
+// 
+// text labels with material properties 
+//
+   Text_t* labelTextM[8]  = 
+   {"Sensitivity Flag      ", 
+    "Magnetic Field Flag   ",
+    "Maximum Field         ", 
+    "Max. Ang. Deviation   ",
+    "Maximum Step          ", 
+    "Max. Frac. Energy Loss",
+    "Crossing Precission   ",
+    "Minimum Step Size     "};
+
+   fF31 = new TGCompositeFrame(fF3, 60, 20, kVerticalFrame);
+   fF3->AddFrame(fF31,fL2);
+   { //Begin local scope for i
+     for (Int_t i=0; i<8; i++) {
+       Int_t idT=i+1;       
+       fHframeM[i] = new TGHorizontalFrame(fF31, 400, 100, kFixedWidth);
+       fF31->AddFrame(fHframeM[i], bly);
+       fTbhM[i] = new TGTextBuffer(10);
+       fTehM[i] = new TGTextEntry(fHframeM[i], fTbhM[i],idT);
+       fTehM[i]->Associate(this);
+       fLabelM[i] = new TGLabel(fHframeM[i], labelTextM[i]);
+       fHframeM[i]->AddFrame(fLabelM[i], bFly1);
+       fHframeM[i]->AddFrame(fTehM[i], bFly1);
+     }
+   } //End local scope for i
+   tf->AddFrame(fF3, fL2);
+   fMediaCombo->Resize(200, 20);
+   fMediaCombo->Associate(this);
+//
+// Processes
+   tf = fTab->AddTab("Processes");
+   fF4 = new TGCompositeFrame(tf, 60, 20, kHorizontalFrame);
+   fProcessLB = new TGListBox(fF4, 1);
+   fF4->AddFrame(fProcessLB, fL2);
+   tf->AddFrame(fF4, fL2);
+   fProcessLB->Resize(150, 350);
+   fProcessLB->Associate(this);
+   
+//
+// Cuts
+   tf = fTab->AddTab("Cuts");
+   fF5 = new TGCompositeFrame(tf, 60, 20, kHorizontalFrame);
+   fCutsLB = new TGListBox(fF5, 1);
+   fF5->AddFrame(fCutsLB, fL2);
+   tf->AddFrame(fF5, fL2);
+   fCutsLB->Resize(150, 350);
+
+//
+// de/dx and cross-sections
+   tf = fTab->AddTab("DE/DX and X-Sections");
+   fF6 = new TGCompositeFrame(tf, 60, 20, kHorizontalFrame);
+
+// ComboBox for particles
+   fF61 = new TGCompositeFrame(fF6, 60, 20, kVerticalFrame);
+   fF6->AddFrame(fF61, fL2);
+   fParticleCombo = new TGComboBox(fF61, 3);
+   fF61->AddFrame(fParticleCombo, fL2);
+   { //Begin local scope for i
+     for (Int_t i = 0; i < 24; i++) {
+       char tmp[20];
+       sprintf(tmp, "%s", kLabelTextPart[i]);
+       fParticleCombo->AddEntry(tmp, i+1);
+     }
+   } //End local scope for i
+   fParticleCombo->Select(1);
+   fParticleCombo->Resize(100, 20);
+   fParticleCombo->Associate(this);
+
+// ComboBox for mechanisms
+   fF63 = new TGCompositeFrame(fF6, 60, 20, kVerticalFrame);
+   fF6->AddFrame(fF63, fL2);
+   fMechanismCombo = new TGComboBox(fF63, 4);
+   fF63->AddFrame(fMechanismCombo, fL2);
+   { //Begin local scope for i
+     for (Int_t i = 0; i < 24; i++) {
+       char tmp[20];
+       sprintf(tmp, "%s", kLabelTextMechanism[i]);
+       fMechanismCombo->AddEntry(tmp, i+1);
+     }
+   } //End local scope for i
+   fMechanismCombo->Select(1);
+   fMechanismCombo->Resize(100, 20);
+   fMechanismCombo->Associate(this);
+
+//
+// Energy Range
+//
+   fTbh61 = new TGTextBuffer(10);
+   fTeh61 = new TGTextEntry(fF61, fTbh61,10);
+   fTbh61->AddText(0, "  100");
+   fTeh61->Associate(this);
+
+   fTbh62 = new TGTextBuffer(10);
+   fTeh62 = new TGTextEntry(fF61, fTbh62,11);
+   fTbh62->AddText(0, "0.001");
+   fTeh62->Associate(this);
+    
+   fTbh63 = new TGTextBuffer(10);
+   fTeh63 = new TGTextEntry(fF61, fTbh63,12);
+   fTbh63->AddText(0, "10.");
+   fTeh63->Associate(this);
+
+   fEmin=0.001;
+   fEmax=10.;
+   fNbins=100;
+   
+   fSLabel61 = new TGLabel(fF61, "Nbins-Emin-Emax");
+   bFly1 = new TGLayoutHints(kLHintsLeft | kLHintsExpandX );
+   fF61->AddFrame(fSLabel61, bFly1);
+   fF61->AddFrame(fTeh61, bFly1);
+   fF61->AddFrame(fTeh62, bFly1);
+   fF61->AddFrame(fTeh63, bFly1);
+//
+// Plot Button
+   fF62 = new TGCompositeFrame(fF6, 60, 20, kHorizontalFrame);
+   fF6->AddFrame(fF62, fL2);
+   fPlotButton = new TGTextButton(fF62, "Plot", 1);
+   fPlotButton -> Associate(this);
+   fF62->AddFrame(fPlotButton);
+
+   tf->AddFrame(fF6, fL2);
+// Window name and final mapping
+//
+   SetWindowName("AliRoot Geometry Browser");
+   MapSubwindows();
+   // We need to use GetDefault...() to initialize the layout algorithm...
+   Resize(GetDefaultSize());
+   MapWindow();
+}
+
+AliGuiGeomMain::~AliGuiGeomMain()
+{
+   // Delete all created widgets.
+
+   delete fCanvasWindow;
+
+   delete fMenuBarLayout;
+   delete fMenuBarItemLayout;
+   delete fMenuBarHelpLayout;
+
+   delete fMenuFile;
+   delete fMenuTest;
+   delete fMenuHelp;
+}
+
+void AliGuiGeomMain::Streamer(TBuffer &)
+{
+// Dummy streamer
+;
+}
+
+void AliGuiGeomMain::Plot()
+{
+// plot de/dx or cross-sections
+    const Float_t kAvo=0.60221367;
+    Float_t *tkin  = new Float_t[fNbins];
+    Float_t *value = new Float_t[fNbins];
+    Float_t *pcut  = new Float_t[fNbins];
+    Int_t ixst;
+    Int_t imate = gCurrentMaterial->Id();
+    Float_t z = gCurrentMaterial->GetZ();
+    Float_t a = gCurrentMaterial->GetA();
+    Float_t density = gCurrentMaterial->GetDensity();
+    
+    Int_t ipart=gCurrentParticle;
+    const char *kChMeca= kLabelTextMechanism[gCurrentProcess-1];
+    char* tmp;
+    tmp = new char[5];
+    strncpy(tmp, kChMeca, 4);
+    tmp[4]='\0';
+    Int_t kdim=fNbins;
+    Float_t de=(fEmax-fEmin)/fNbins;
+    { //Begin local scope for i
+      for (Int_t i=0; i<kdim; i++) {
+       tkin[i]=fEmin+Float_t(i)*de;
+       value[i]=0.;
+      }
+    } //End local scope for i
+    if (kChMeca!="MUON") {
+       ((TGeant3*) gMC)->Gftmat(imate, ipart, tmp, kdim, tkin, value, pcut, ixst);
+    } else {
+       for (Int_t i=0; i<kdim; i++) {
+           Float_t ekin=tkin[i];
+           value[i]+=((TGeant3*) gMC)->Gbrelm(z,ekin,1.e10);
+           value[i]+=((TGeant3*) gMC)->Gprelm(z,ekin,1.e10);
+           value[i]*=1000.*kAvo*density/a;
+       }
+    }
+
+    if (ixst) {
+       TGraph *graph = new TGraph(kdim,tkin,value);
+       TCanvas *c1 = new TCanvas("c1"," ",400,10,600,700);
+       c1->Divide(1,1);
+       c1->cd(1);
+       
+       graph->SetFillColor(42);
+       graph->SetMarkerColor(4);
+       graph->SetMarkerStyle(21);
+       graph->Draw("AC");
+       graph->GetHistogram()->SetXTitle("Energy (GeV)");
+       if (kChMeca == "RANG" || kChMeca == "STEP") {
+           graph->GetHistogram()->SetYTitle
+               ("Distance (cm)");   
+       } else if (kChMeca == "LOSS" || kChMeca == "MUON") {
+           graph->GetHistogram()->SetYTitle("dE/dx (MeV/cm)");   
+       } else {
+           graph->GetHistogram()->SetYTitle
+               ("Macroscopic X-Section (1/cm)"); 
+       }
+    }
+    
+    delete tkin;
+    delete value;
+    delete pcut;
+    
+    
+}
+
+void AliGuiGeomMain::Update()
+{
+// Update widgets
+    if (fDialog) {
+       fDialog->Update();
+    }
+
+    Int_t imat=gCurrentVolume->Material();
+    Int_t nmat=fComboMaterialEntries->GetEntriesFast();
+    Int_t i=0;
+    for (i=0; i<nmat; i++) {
+       gCurrentMaterial = (AliG3Material*) 
+           (fComboMaterialEntries->UncheckedAt(i));
+       if ((gCurrentMaterial->Id())==imat) break;
+    }
+    Int_t imed = gCurrentVolume->Medium();
+    Int_t nmed=fComboMediaEntries->GetEntriesFast();
+    for (i=0; i<nmed; i++) {
+       gCurrentMedium = (AliG3Medium*) 
+           (fComboMediaEntries->UncheckedAt(i));
+       if (gCurrentMedium->Id()==imed) break;
+    }
+
+    UpdateCombo();
+    UpdateListBox();
+    
+}
+
+void AliGuiGeomMain::UpdateCombo()
+{
+// Update combos
+
+    Int_t   imat = gCurrentMaterial->Id();
+    Float_t    a = gCurrentMaterial->GetA();
+    Float_t    z = gCurrentMaterial->GetZ();    
+    Float_t dens = gCurrentMaterial->GetDensity();
+    Float_t radl = gCurrentMaterial->GetRadLength();
+    Float_t absl = gCurrentMaterial->GetInterLength();
+    Int_t entry  = gCurrentMaterial->GetNumber();
+//    
+//
+    fMaterialCombo->Select(entry);
+    fMediaCombo->Select(entry);    
+    char buf[10];
+     
+    sprintf(buf, "%10i", imat);
+    fTbh[0]->Clear();
+    fTbh[0]->AddText(0, buf);
+    gClient->NeedRedraw(fTeh[0]);
+    sprintf(buf, "%10.2e", a);
+    fTbh[1]->Clear();
+    fTbh[1]->AddText(0, buf);
+    gClient->NeedRedraw(fTeh[1]);
+
+    sprintf(buf, "%10.2e", z);
+    fTbh[2]->Clear();
+    fTbh[2]->AddText(0, buf);
+    gClient->NeedRedraw(fTeh[2]);
+
+    sprintf(buf, "%10.2e", dens);
+    fTbh[3]->Clear();
+    fTbh[3]->AddText(0, buf);
+    gClient->NeedRedraw(fTeh[3]);
+
+    sprintf(buf, "%10.2e", radl);
+    fTbh[4]->Clear();
+    fTbh[4]->AddText(0, buf);
+    gClient->NeedRedraw(fTeh[4]);
+
+    sprintf(buf, "%10.2e", absl);
+    fTbh[5]->Clear();
+    fTbh[5]->AddText(0, buf);
+    gClient->NeedRedraw(fTeh[5]);
+
+//  Media Combo
+    sprintf(buf, "%10i", gCurrentMedium->Isvol());
+    fTbhM[0]->Clear();
+    fTbhM[0]->AddText(0, buf);
+    gClient->NeedRedraw(fTehM[0]);
+
+
+    sprintf(buf, "%10i", gCurrentMedium->Ifield());
+    fTbhM[1]->Clear();
+    fTbhM[1]->AddText(0, buf);
+    gClient->NeedRedraw(fTehM[1]);
+
+    sprintf(buf, "%10.2e", gCurrentMedium->Fieldm());
+    fTbhM[2]->Clear();
+    fTbhM[2]->AddText(0, buf);
+    gClient->NeedRedraw(fTehM[2]);
+
+    sprintf(buf, "%10.2e", gCurrentMedium->Tmaxfd());
+    fTbhM[3]->Clear();
+    fTbhM[3]->AddText(0, buf);
+    gClient->NeedRedraw(fTehM[3]);
+
+    sprintf(buf, "%10.2e", gCurrentMedium->Stemax());
+    fTbhM[4]->Clear();
+    fTbhM[4]->AddText(0, buf);
+    gClient->NeedRedraw(fTehM[4]);
+
+    sprintf(buf, "%10.2e", gCurrentMedium->Deemax());
+    fTbhM[5]->Clear();
+    fTbhM[5]->AddText(0, buf);
+    gClient->NeedRedraw(fTehM[5]);
+
+    sprintf(buf, "%10.2e", gCurrentMedium->Epsil());
+    fTbhM[6]->Clear();
+    fTbhM[6]->AddText(0, buf);
+    gClient->NeedRedraw(fTehM[6]);
+
+    sprintf(buf, "%10.2e", gCurrentMedium->Stmin());
+    fTbhM[7]->Clear();
+    fTbhM[7]->AddText(0, buf);
+    gClient->NeedRedraw(fTehM[7]);
+}
+
+void AliGuiGeomMain::UpdateListBox()
+{
+// Update the list box
+    Int_t i;
+    fProcessLB->RemoveEntries(1,19);
+    for (i=11; i < 30; i++) {
+       Float_t p=gCurrentMedium->GetPar(i);
+       char tmp[20];
+       sprintf(tmp, "%6s%5d", kLabelTextP[i-11], Int_t(p));
+       fProcessLB->AddEntry(tmp, i-10);
+    }
+    fProcessLB->MapSubwindows();
+    fProcessLB->Layout();
+
+    fCutsLB->RemoveEntries(1,10);
+    for (i=1; i < 11; i++) {
+       Float_t p=gCurrentMedium->GetPar(i);
+       char tmp[20];
+       sprintf(tmp, "%6s%10.3e", kLabelTextC[i-1], p);
+       fCutsLB->AddEntry(tmp,i);
+    }
+    fCutsLB->MapSubwindows();
+    fCutsLB->Layout();
+}
+
+
+void AliGuiGeomMain::CloseWindow()
+{
+   // Got close message for this MainFrame. Calls parent CloseWindow()
+   // (which destroys the window) and terminate the application.
+   // The close message is generated by the window manager when its close
+   // window menu item is selected.
+
+   TGMainFrame::CloseWindow();
+   gApplication->Terminate(0);
+}
+
+Bool_t AliGuiGeomMain::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
+{
+// Process messages to widgets
+    switch (GET_MSG(msg)) {
+//
+//  Text entries for binning of cross-section plots
+    case kC_TEXTENTRY:
+       switch (GET_SUBMSG(msg)) {
+       case kTE_TEXTCHANGED:
+           switch (parm1) {
+           case 10:
+               fNbins=(Int_t) atof(fTbh61->GetString());
+               break;
+           case 11:
+               fEmin= atof(fTbh62->GetString());
+               break;
+           case 12:
+               fEmax= atof(fTbh63->GetString());
+               break;
+           }
+       }
+       break;
+//
+// ListTree for volumes
+    case kC_LISTTREE:
+       switch (GET_SUBMSG(msg)) {
+//
+// Handle mouse click 
+       case kCT_ITEMCLICK:
+//
+// Button 1: Select volume
+           if (parm1 == kButton1) {
+             TGListTreeItem *item;
+             if ((item = fLt->GetSelected())) 
+               {
+                 gCurrentVolume=((AliG3Volume *) item->GetUserData());
+                 Update();
+               }
+           }
+//
+// Button 2: Draw volume specifications
+
+           if (parm1 == kButton2) {
+               TGListTreeItem *item;
+               if ((item = fLt->GetSelected())) 
+               {
+
+                   ((AliG3Volume *) item->GetUserData())->DrawSpec();
+
+                   gCurrentVolume=((AliG3Volume *) item->GetUserData());
+                   Update();
+               }
+           }
+//
+// Button 3: Draw Volume
+           if (parm1 == kButton3) {
+               TGListTreeItem *item;
+               if ((item = fLt->GetSelected())) 
+               {
+                   ((AliG3Volume *) item->GetUserData())->Draw();
+                   gCurrentVolume=((AliG3Volume *) item->GetUserData());
+                   Update();
+               }
+           }
+           
+           
+           break;
+       case kCT_ITEMDBLCLICK:
+           if (parm1 == kButton1) {
+               if (fLt->GetSelected() != 0) {
+                   gClient->NeedRedraw(fLt);
+               }
+           }
+           break;
+       default:
+           break;
+       }
+       break;
+    case kC_COMMAND:
+       switch (GET_SUBMSG(msg)) {
+       case kCM_BUTTON:
+           switch(parm1) {
+           case 1:
+               Plot();
+               break;
+           }
+           break;
+       case kCM_COMBOBOX:
+//
+// Combo box bindings
+           switch(parm1) {
+//
+// Material Combo
+           case 1:
+               gCurrentMaterial=(AliG3Material*) 
+                   (fComboMaterialEntries->UncheckedAt(Int_t(parm2-1)));
+               gCurrentMedium=(AliG3Medium*) 
+                   (fComboMediaEntries->UncheckedAt(Int_t(parm2-1)));
+               UpdateCombo();
+               UpdateListBox();
+               break;
+//
+// Media Combo
+           case 2:
+               gCurrentMedium=(AliG3Medium*) 
+                   (fComboMediaEntries->UncheckedAt(Int_t(parm2-1)));
+               gCurrentMaterial=(AliG3Material*) 
+                   (fComboMaterialEntries->UncheckedAt(Int_t(parm2-1)));
+               UpdateCombo();
+               UpdateListBox();
+               break;
+//
+// Particle Combo
+           case 3:
+               gCurrentParticle=Int_t(parm2);
+               break;
+//
+// Mechanism Combo
+           case 4:
+               gCurrentProcess=Int_t(parm2);
+               break;
+           }
+           break;
+       case kCM_MENUSELECT:
+           break;
+           
+       case kCM_MENU:
+           switch (parm1) {
+           case kFileOpen:
+           {
+               printf("kFileOpen not yet implemented \n");
+           }
+           break;
+           
+           case kTestDlg:
+               fDialog = new AliGuiGeomDialog
+                   (gClient->GetRoot(), this, 400, 200);
+               break;
+               
+           case kFileSave:
+               printf("kFileSave not yet implemented \n");
+               break;
+               
+           case kFileExit:
+//             printf("kFileExit not yet implemented \n");
+               CloseWindow();   // this also terminates theApp
+               break;
+           default:
+               break;
+           }
+       default:
+           break;
+       }
+    default:
+       break;
+    }
+    return kTRUE;
+}
+
+void AliGuiGeomMain::AddMaterial(AliG3Material *Material, Int_t i)
+{
+// Add material to material combo
+    const char* tmp;
+    tmp=Material->GetName();
+    char mName[21];
+    
+    strncpy(mName, tmp, 20);
+    mName[20]='\0';
+    
+//    Material->SetItemId(i);
+    fMaterialCombo->AddEntry(mName, i);
+    fMaterialCombo->Select(i);
+    fMaterialCombo->Resize(200, 20);
+}
+
+void AliGuiGeomMain::AddMedium(AliG3Medium *Medium, Int_t i)
+{
+// Add medium to medium combo
+    const char* tmp;
+    tmp=Medium->GetName();
+    char mName[21];
+    strncpy(mName, tmp, 20);
+    mName[20]='\0';
+    Medium->SetItemId(i);
+    fMediaCombo->AddEntry(mName, i);
+    fMediaCombo->Select(i);
+    fMediaCombo->Resize(200, 20);
+}
+
+void AliGuiGeomMain::SetMaterialComboEntries(TClonesArray *entries)
+{
+// Set the material combo entries
+//
+    fComboMaterialEntries = entries;
+    Int_t nent = fComboMaterialEntries->GetEntriesFast();
+    for (Int_t i=0; i < nent; i++)
+    {
+       AddMaterial((AliG3Material*)fComboMaterialEntries->At(i), i);
+       gCurrentMaterial = (AliG3Material*)fComboMaterialEntries->At(i);
+    }
+}
+
+
+void AliGuiGeomMain::SetMediaComboEntries(TClonesArray *entries)
+{
+// Set the media combo entries
+//
+    fComboMediaEntries = entries;
+    Int_t nent = fComboMediaEntries->GetEntriesFast();
+    for (Int_t i=0; i < nent; i++)
+    {
+       AddMedium((AliG3Medium*)fComboMediaEntries->At(i), i);
+       gCurrentMedium = (AliG3Medium*)fComboMediaEntries->At(i);
+    }
+}
+
+void AliGuiGeomMain::AddFoldersRecursively(TFolder* folder, TGListTreeItem* parent)
+{
+// Display geometry represented by TFolders in List Tree
+//
+    const TGPicture* kFolder     = gClient->GetPicture("folder_t.xpm");
+    const TGPicture* kOpenFolder = gClient->GetPicture("ofolder_t.xpm");
+    const TGPicture* kDocument   = gClient->GetPicture("doc_t.xpm");
+    
+    AliG3Volume* volume = ((AliG3Volume *) folder->FindObject(folder->GetName()));
+    volume->SetItem(folder);
+
+    TList* folders = (TList*) folder->GetListOfFolders();
+    TIter next(folders);
+    TObject* obj;
+    TGListTreeItem* nParent = 0;
+    if (folders->GetSize() > 1) {
+       nParent = fLt->AddItem(parent, folder->GetName(), volume, kOpenFolder, kFolder);
+    } else {
+       nParent = fLt->AddItem(parent, folder->GetName(), volume, kDocument, kDocument);
+    }
+    
+    while ((obj = next()))
+    {
+       if ((AliG3Volume*) obj == volume) continue;
+       TFolder* item = (TFolder*) obj;
+       AddFoldersRecursively(item, nParent);
+    }
+}
+