d022b617106e3b483a4b5917b276a9c205bad2d4
[u/mrichter/AliRoot.git] / TGeant3 / AliGuiGeomMain.cxx
1 /* *************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictlSy for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /*
17 $Log$
18 Revision 1.1  2000/07/13 16:19:10  fca
19 Mainly coding conventions + some small bug fixes
20
21 Revision 1.8  2000/07/12 08:56:32  fca
22 Coding convention correction and warning removal
23
24 Revision 1.7  2000/06/28 21:27:45  morsch
25 Most coding rule violations corrected.
26 Still to do: Split the file (on file per class) ? Avoid the global variables.
27 Copy constructors and assignment operators (dummy ?)
28
29 Revision 1.6  2000/04/14 11:07:46  morsch
30 Correct volume to medium assignment in case several media are asigned to the
31 same material.
32
33 Revision 1.5  2000/03/20 15:11:03  fca
34 Mods to make the code compile on HP
35
36 Revision 1.4  2000/01/18 16:12:08  morsch
37 Bug in calculation of number of volume divisions and number of positionings corrected
38 Browser for Material and Media properties added
39
40 Revision 1.3  1999/11/14 14:31:14  fca
41 Correct small error and remove compilation warnings on HP
42
43 Revision 1.2  1999/11/10 16:53:35  fca
44 The new geometry viewer from A.Morsch
45
46 */
47
48 /* 
49  *  Version: 0
50  *  Written by Andreas Morsch
51  *  
52  * 
53  *
54  * For questions critics and suggestions to this part of the code
55  * contact andreas.morsch@cern.ch
56  * 
57  **************************************************************************/
58
59 #include <stdlib.h>
60 #include <TArrayF.h>
61 #include <TGMsgBox.h>
62 #include <TGMenu.h>
63 #include <TGTab.h>
64 #include <TGFrame.h>
65 #include <TGTextBuffer.h>
66 #include <TGTextEntry.h>
67 #include <TGLabel.h>
68 #include <TGButton.h>
69 #include <TGraph.h>
70 #include <TCanvas.h>
71 #include <TH1.h>
72 #include <TApplication.h>
73 #include <TGFileDialog.h>
74 #include <TGListTree.h>
75 #include <TGeant3.h>
76 #include <TShape.h>
77 #include <TGeometry.h>
78 #include <TBRIK.h>
79 #include <TGeometry.h>
80 #include <TList.h>
81 #include <TFile.h>
82 #include <TFolder.h>
83
84 #include "AliGuiGeomMain.h"
85 #include "AliGuiGeomDialog.h"
86 #include "AliG3Volume.h"
87 #include "AliG3Medium.h"
88 #include "AliRun.h"
89 #include "AliG3Material.h"
90 #include "AliNode.h"
91
92
93 ClassImp(AliGuiGeomMain)
94
95 static Int_t           gCurrentParticle = 1;
96 static Int_t           gCurrentProcess  = 1;
97
98  const Text_t* kLabelTextP[19]  = 
99 {"PAIR  ", "COMP  ", "PHOT  ", "PFIS  ", "DRAY  ", "ANNI  ", "BREM  ", 
100  "HADR  ", "MUNU  ", "DCAY  ", "LOSS  ", "MULS  ", "GHCOR1", "BIRK1 ", 
101  "BIRK2 ", "BIRK3 ", "LABS  ", "SYNC  ", "STRA  "};
102
103
104  const Text_t* kLabelTextC[10]  = 
105  {"CUTGAM", "CUTELE", "CUTNEU", "CUTHAD", "CUTMUO", "BCUTE", "BCUTM",
106   "DCUTE ", "DCUTM ", "PPCUTM"};
107
108 const Text_t* kLabelTextPart[24]  = 
109 {"Photon", "Positron", "Electron", "Neutrino", "Muon+", "Muon-", 
110  "Pi0", "Pi+", "Pi-", "Kaon_L", "Kaon+", "Kaon-", "Neutron", "Proton", 
111  "Anti Proton", "Kaon_S", "Eta", "Lambda", "Sigma+", "Sigma0", "Sigma-",
112  "Xi0", "Xi-", "Omega-"};
113
114 const Text_t* kLabelTextMechanism[24]  = 
115 {"HADF", "INEF", "ELAF", "FISF", "CAPF",
116  "HADG", "INEG", "ELAG", "FISG", "CAPG",
117  "LOSS", "PHOT", "ANNI", "COMP", "BREM",
118  "PAIR", "DRAY", "PFIS", "RAYL", "HADG",
119  "MUNU", "RANG", "STEP", "MUON"};
120
121
122
123
124 enum ETestCommandIdentifiers {
125    kFileOpen,
126    kFileSave,
127    kFileSaveAs,
128    kFileExit,
129
130    kTestDlg,
131
132    kHelpContents,
133    kHelpSearch,
134    kHelpAbout,
135
136
137    kVId1,
138    kHId1,
139    kVId2,
140    kHId2,
141
142    kVSId1,
143    kHSId1,
144    kVSId2,
145    kHSId2
146 };
147
148
149 Int_t mbButtonId[9] = { kMBYes, kMBNo, kMBOk, kMBApply,
150                           kMBRetry, kMBIgnore, kMBCancel,
151                           kMBClose, kMBDismiss };
152
153 EMsgBoxIcon mbIcon[4] = { kMBIconStop, kMBIconQuestion,
154                            kMBIconExclamation, kMBIconAsterisk };
155
156 const char *kFileTypes[] = { "All files",     "*",
157                             "ROOT files",    "*.root",
158                             "ROOT macros",   "*.C",
159                             0,               0 };
160
161
162
163
164 TGListTreeItem*  AliGuiGeomMain::
165 AddItem(TObject * obj, TGListTreeItem *parent, const char* name, const TGPicture *open, const TGPicture *closed)
166 {
167 // Add item to the list tree
168     return fLt->AddItem(parent, name, obj, open, closed);
169 }
170
171 AliGuiGeomMain::AliGuiGeomMain(const TGWindow *p, UInt_t w, UInt_t h)
172       : TGMainFrame(p, w, h)
173 {
174     // Create test main frame. A TGMainFrame is a top level window.
175     // Create menubar and popup menus. The hint objects are used to place
176     // and group the different menu widgets with respect to eachother.
177     
178     fDialog=0;
179     fMenuBarLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX,
180                                        0, 0, 1, 1);
181     fMenuBarItemLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0);
182     fMenuBarHelpLayout = new TGLayoutHints(kLHintsTop | kLHintsRight);
183     
184     fMenuFile = new TGPopupMenu(gClient->GetRoot());
185     fMenuFile->AddEntry("&Open...", kFileOpen);
186     fMenuFile->AddEntry("&Save", kFileSave);
187     fMenuFile->AddEntry("S&ave as...", kFileSaveAs);
188     fMenuFile->AddEntry("&Close", -1);
189     fMenuFile->AddSeparator();
190     fMenuFile->AddEntry("E&xit", kFileExit);
191     
192     fMenuFile->DisableEntry(kFileSaveAs);
193     fMenuFile->DisableEntry(kFileOpen);
194     fMenuFile->DisableEntry(kFileSave);
195     
196
197
198    fMenuTest = new TGPopupMenu(this);
199    fMenuTest->AddLabel("Draw");
200    fMenuTest->AddSeparator();
201    fMenuTest->AddEntry("&Volume Draw Control", kTestDlg);
202    fMenuTest->AddSeparator();
203    fMenuTest->Associate(this);
204    
205    
206    fMenuHelp = new TGPopupMenu(gClient->GetRoot());
207    fMenuHelp->AddEntry("&Contents", kHelpContents);
208    fMenuHelp->AddEntry("&Search...", kHelpSearch);
209    fMenuHelp->AddSeparator();
210    fMenuHelp->AddEntry("&About", kHelpAbout);
211
212    fMenuFile->DisableEntry(kHelpContents);
213    fMenuFile->DisableEntry(kHelpSearch);
214    fMenuFile->DisableEntry(kHelpAbout);
215    // Menu button messages are handled by the main frame (i.e. "this")
216    // ProcessMessage() method.
217    fMenuFile->Associate(this);
218    fMenuTest->Associate(this);
219    fMenuHelp->Associate(this);
220
221    fMenuBar = new TGMenuBar(this, 1, 1, kHorizontalFrame);
222    fMenuBar->AddPopup("&File", fMenuFile, fMenuBarItemLayout);
223    fMenuBar->AddPopup("&Draw Control", fMenuTest, fMenuBarItemLayout);
224    fMenuBar->AddPopup("&Help", fMenuHelp, fMenuBarHelpLayout);
225
226    AddFrame(fMenuBar, fMenuBarLayout);
227
228 // 
229 // Volumes
230 //
231    fTab = new TGTab(this, 400, 400);
232    TGCompositeFrame *tf = fTab->AddTab("Volumes");
233    TGLayoutHints *lTab = new TGLayoutHints(kLHintsBottom | kLHintsExpandX |
234                                           kLHintsExpandY, 2, 2, 5, 1);
235    AddFrame(fTab, lTab);
236
237 // Create TGCanvas and a canvas container which uses a tile layout manager
238    fCanvasWindow = new TGCanvas(tf, 400, 240);
239 // Create TreeList
240    fLt = new TGListTree(fCanvasWindow->GetViewPort(), 10, 10, kHorizontalFrame,
241                         fgWhitePixel);
242    fLt->Associate(this);
243    fCanvasWindow->SetContainer(fLt);
244
245     
246    TGLayoutHints *lo = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY);
247    tf->AddFrame(fCanvasWindow, lo);
248 //
249 // Materials
250 //
251    tf = fTab->AddTab("Materials");
252    fF2 = new TGCompositeFrame(tf, 60, 20, kHorizontalFrame);
253    fL2 = new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5);
254 // ComboBox for materials
255    fMaterialCombo = new TGComboBox(fF2, 1);
256    fF2->AddFrame(fMaterialCombo, fL2);
257 // 
258 // text labels with material properties 
259 //
260    Text_t* labelText[6]  = 
261    {"Material Number  ", 
262     "Atomic Weight    ",
263     "Atomic Number    ", 
264     "Density          ",
265     "Radiation Length ", 
266     "Absorption Length"};
267
268    TGLayoutHints* bly   = 
269        new TGLayoutHints(kLHintsTop | kLHintsExpandY, 5, 5, 5, 5);
270    TGLayoutHints* bFly1 = 
271        new TGLayoutHints(kLHintsLeft | kLHintsExpandX );
272    fF21 = new TGCompositeFrame(fF2, 60, 20, kVerticalFrame);
273    fF2->AddFrame(fF21,fL2);
274    { //Begin local scope for i
275      for (Int_t i=0; i<6; i++) {
276        Int_t idT=i+1;       
277        fHframe[i] = new TGHorizontalFrame(fF21, 400, 100, kFixedWidth);
278        fF21->AddFrame(fHframe[i], bly);
279        fTbh[i] = new TGTextBuffer(10);
280        fTeh[i] = new TGTextEntry(fHframe[i], fTbh[i],idT);
281        fTeh[i]->Associate(this);
282        fLabel[i] = new TGLabel(fHframe[i], labelText[i]);
283        fHframe[i]->AddFrame(fLabel[i], bFly1);
284        fHframe[i]->AddFrame(fTeh[i], bFly1);
285      }
286    } //End local scope for i
287    tf->AddFrame(fF2, fL2);
288    fMaterialCombo->Resize(200, 20);
289    fMaterialCombo->Associate(this);
290    
291
292 // Media Combo
293 //   
294    tf = fTab->AddTab("Media");
295    fF3 = new TGCompositeFrame(tf, 60, 20, kHorizontalFrame);
296 // ComboBox for tracking media
297    fMediaCombo = new TGComboBox(fF3, 2);
298    fF3->AddFrame(fMediaCombo, fL2);
299 // 
300 // text labels with material properties 
301 //
302    Text_t* labelTextM[8]  = 
303    {"Sensitivity Flag      ", 
304     "Magnetic Field Flag   ",
305     "Maximum Field         ", 
306     "Max. Ang. Deviation   ",
307     "Maximum Step          ", 
308     "Max. Frac. Energy Loss",
309     "Crossing Precission   ",
310     "Minimum Step Size     "};
311
312    fF31 = new TGCompositeFrame(fF3, 60, 20, kVerticalFrame);
313    fF3->AddFrame(fF31,fL2);
314    { //Begin local scope for i
315      for (Int_t i=0; i<8; i++) {
316        Int_t idT=i+1;       
317        fHframeM[i] = new TGHorizontalFrame(fF31, 400, 100, kFixedWidth);
318        fF31->AddFrame(fHframeM[i], bly);
319        fTbhM[i] = new TGTextBuffer(10);
320        fTehM[i] = new TGTextEntry(fHframeM[i], fTbhM[i],idT);
321        fTehM[i]->Associate(this);
322        fLabelM[i] = new TGLabel(fHframeM[i], labelTextM[i]);
323        fHframeM[i]->AddFrame(fLabelM[i], bFly1);
324        fHframeM[i]->AddFrame(fTehM[i], bFly1);
325      }
326    } //End local scope for i
327    tf->AddFrame(fF3, fL2);
328    fMediaCombo->Resize(200, 20);
329    fMediaCombo->Associate(this);
330 //
331 // Processes
332    tf = fTab->AddTab("Processes");
333    fF4 = new TGCompositeFrame(tf, 60, 20, kHorizontalFrame);
334    fProcessLB = new TGListBox(fF4, 1);
335    fF4->AddFrame(fProcessLB, fL2);
336    tf->AddFrame(fF4, fL2);
337    fProcessLB->Resize(150, 350);
338    fProcessLB->Associate(this);
339    
340 //
341 // Cuts
342    tf = fTab->AddTab("Cuts");
343    fF5 = new TGCompositeFrame(tf, 60, 20, kHorizontalFrame);
344    fCutsLB = new TGListBox(fF5, 1);
345    fF5->AddFrame(fCutsLB, fL2);
346    tf->AddFrame(fF5, fL2);
347    fCutsLB->Resize(150, 350);
348
349 //
350 // de/dx and cross-sections
351    tf = fTab->AddTab("DE/DX and X-Sections");
352    fF6 = new TGCompositeFrame(tf, 60, 20, kHorizontalFrame);
353
354 // ComboBox for particles
355    fF61 = new TGCompositeFrame(fF6, 60, 20, kVerticalFrame);
356    fF6->AddFrame(fF61, fL2);
357    fParticleCombo = new TGComboBox(fF61, 3);
358    fF61->AddFrame(fParticleCombo, fL2);
359    { //Begin local scope for i
360      for (Int_t i = 0; i < 24; i++) {
361        char tmp[20];
362        sprintf(tmp, "%s", kLabelTextPart[i]);
363        fParticleCombo->AddEntry(tmp, i+1);
364      }
365    } //End local scope for i
366    fParticleCombo->Select(1);
367    fParticleCombo->Resize(100, 20);
368    fParticleCombo->Associate(this);
369
370 // ComboBox for mechanisms
371    fF63 = new TGCompositeFrame(fF6, 60, 20, kVerticalFrame);
372    fF6->AddFrame(fF63, fL2);
373    fMechanismCombo = new TGComboBox(fF63, 4);
374    fF63->AddFrame(fMechanismCombo, fL2);
375    { //Begin local scope for i
376      for (Int_t i = 0; i < 24; i++) {
377        char tmp[20];
378        sprintf(tmp, "%s", kLabelTextMechanism[i]);
379        fMechanismCombo->AddEntry(tmp, i+1);
380      }
381    } //End local scope for i
382    fMechanismCombo->Select(1);
383    fMechanismCombo->Resize(100, 20);
384    fMechanismCombo->Associate(this);
385
386 //
387 // Energy Range
388 //
389    fTbh61 = new TGTextBuffer(10);
390    fTeh61 = new TGTextEntry(fF61, fTbh61,10);
391    fTbh61->AddText(0, "  100");
392    fTeh61->Associate(this);
393
394    fTbh62 = new TGTextBuffer(10);
395    fTeh62 = new TGTextEntry(fF61, fTbh62,11);
396    fTbh62->AddText(0, "0.001");
397    fTeh62->Associate(this);
398     
399    fTbh63 = new TGTextBuffer(10);
400    fTeh63 = new TGTextEntry(fF61, fTbh63,12);
401    fTbh63->AddText(0, "10.");
402    fTeh63->Associate(this);
403
404    fEmin=0.001;
405    fEmax=10.;
406    fNbins=100;
407    
408    fSLabel61 = new TGLabel(fF61, "Nbins-Emin-Emax");
409    bFly1 = new TGLayoutHints(kLHintsLeft | kLHintsExpandX );
410    fF61->AddFrame(fSLabel61, bFly1);
411    fF61->AddFrame(fTeh61, bFly1);
412    fF61->AddFrame(fTeh62, bFly1);
413    fF61->AddFrame(fTeh63, bFly1);
414 //
415 // Plot Button
416    fF62 = new TGCompositeFrame(fF6, 60, 20, kHorizontalFrame);
417    fF6->AddFrame(fF62, fL2);
418    fPlotButton = new TGTextButton(fF62, "Plot", 1);
419    fPlotButton -> Associate(this);
420    fF62->AddFrame(fPlotButton);
421
422    tf->AddFrame(fF6, fL2);
423 // Window name and final mapping
424 //
425    SetWindowName("AliRoot Geometry Browser");
426    MapSubwindows();
427    // We need to use GetDefault...() to initialize the layout algorithm...
428    Resize(GetDefaultSize());
429    MapWindow();
430 }
431
432 AliGuiGeomMain::~AliGuiGeomMain()
433 {
434    // Delete all created widgets.
435
436    delete fCanvasWindow;
437
438    delete fMenuBarLayout;
439    delete fMenuBarItemLayout;
440    delete fMenuBarHelpLayout;
441
442    delete fMenuFile;
443    delete fMenuTest;
444    delete fMenuHelp;
445 }
446
447 void AliGuiGeomMain::Streamer(TBuffer &)
448 {
449 // Dummy streamer
450 ;
451 }
452
453 void AliGuiGeomMain::Plot()
454 {
455 // plot de/dx or cross-sections
456     const Float_t kAvo=0.60221367;
457     Float_t *tkin  = new Float_t[fNbins];
458     Float_t *value = new Float_t[fNbins];
459     Float_t *pcut  = new Float_t[fNbins];
460     Int_t ixst;
461     Int_t imate = gCurrentMaterial->Id();
462     Float_t z = gCurrentMaterial->GetZ();
463     Float_t a = gCurrentMaterial->GetA();
464     Float_t density = gCurrentMaterial->GetDensity();
465     
466     Int_t ipart=gCurrentParticle;
467     const char *kChMeca= kLabelTextMechanism[gCurrentProcess-1];
468     char* tmp;
469     tmp = new char[5];
470     strncpy(tmp, kChMeca, 4);
471     tmp[4]='\0';
472     Int_t kdim=fNbins;
473     Float_t de=(fEmax-fEmin)/fNbins;
474     { //Begin local scope for i
475       for (Int_t i=0; i<kdim; i++) {
476         tkin[i]=fEmin+Float_t(i)*de;
477         value[i]=0.;
478       }
479     } //End local scope for i
480     if (kChMeca!="MUON") {
481         ((TGeant3*) gMC)->Gftmat(imate, ipart, tmp, kdim, tkin, value, pcut, ixst);
482     } else {
483         for (Int_t i=0; i<kdim; i++) {
484             Float_t ekin=tkin[i];
485             value[i]+=((TGeant3*) gMC)->Gbrelm(z,ekin,1.e10);
486             value[i]+=((TGeant3*) gMC)->Gprelm(z,ekin,1.e10);
487             value[i]*=1000.*kAvo*density/a;
488         }
489     }
490
491     if (ixst) {
492         TGraph *graph = new TGraph(kdim,tkin,value);
493         TCanvas *c1 = new TCanvas("c1"," ",400,10,600,700);
494         c1->Divide(1,1);
495         c1->cd(1);
496         
497         graph->SetFillColor(42);
498         graph->SetMarkerColor(4);
499         graph->SetMarkerStyle(21);
500         graph->Draw("AC");
501         graph->GetHistogram()->SetXTitle("Energy (GeV)");
502         if (kChMeca == "RANG" || kChMeca == "STEP") {
503             graph->GetHistogram()->SetYTitle
504                 ("Distance (cm)");   
505         } else if (kChMeca == "LOSS" || kChMeca == "MUON") {
506             graph->GetHistogram()->SetYTitle("dE/dx (MeV/cm)");   
507         } else {
508             graph->GetHistogram()->SetYTitle
509                 ("Macroscopic X-Section (1/cm)"); 
510         }
511     }
512     
513     delete tkin;
514     delete value;
515     delete pcut;
516     
517     
518 }
519
520 void AliGuiGeomMain::Update()
521 {
522 // Update widgets
523     if (fDialog) {
524         fDialog->Update();
525     }
526
527     Int_t imat=gCurrentVolume->Material();
528     Int_t nmat=fComboMaterialEntries->GetEntriesFast();
529     Int_t i=0;
530     for (i=0; i<nmat; i++) {
531         gCurrentMaterial = (AliG3Material*) 
532             (fComboMaterialEntries->UncheckedAt(i));
533         if ((gCurrentMaterial->Id())==imat) break;
534     }
535     Int_t imed = gCurrentVolume->Medium();
536     Int_t nmed=fComboMediaEntries->GetEntriesFast();
537     for (i=0; i<nmed; i++) {
538         gCurrentMedium = (AliG3Medium*) 
539             (fComboMediaEntries->UncheckedAt(i));
540         if (gCurrentMedium->Id()==imed) break;
541     }
542
543     UpdateCombo();
544     UpdateListBox();
545     
546 }
547
548 void AliGuiGeomMain::UpdateCombo()
549 {
550 // Update combos
551
552     Int_t   imat = gCurrentMaterial->Id();
553     Float_t    a = gCurrentMaterial->GetA();
554     Float_t    z = gCurrentMaterial->GetZ();    
555     Float_t dens = gCurrentMaterial->GetDensity();
556     Float_t radl = gCurrentMaterial->GetRadLength();
557     Float_t absl = gCurrentMaterial->GetInterLength();
558     Int_t entry  = gCurrentMaterial->GetNumber();
559 //    
560 //
561     fMaterialCombo->Select(entry);
562     fMediaCombo->Select(entry);    
563     char buf[10];
564      
565     sprintf(buf, "%10i", imat);
566     fTbh[0]->Clear();
567     fTbh[0]->AddText(0, buf);
568     gClient->NeedRedraw(fTeh[0]);
569     sprintf(buf, "%10.2e", a);
570     fTbh[1]->Clear();
571     fTbh[1]->AddText(0, buf);
572     gClient->NeedRedraw(fTeh[1]);
573
574     sprintf(buf, "%10.2e", z);
575     fTbh[2]->Clear();
576     fTbh[2]->AddText(0, buf);
577     gClient->NeedRedraw(fTeh[2]);
578
579     sprintf(buf, "%10.2e", dens);
580     fTbh[3]->Clear();
581     fTbh[3]->AddText(0, buf);
582     gClient->NeedRedraw(fTeh[3]);
583
584     sprintf(buf, "%10.2e", radl);
585     fTbh[4]->Clear();
586     fTbh[4]->AddText(0, buf);
587     gClient->NeedRedraw(fTeh[4]);
588
589     sprintf(buf, "%10.2e", absl);
590     fTbh[5]->Clear();
591     fTbh[5]->AddText(0, buf);
592     gClient->NeedRedraw(fTeh[5]);
593
594 //  Media Combo
595     sprintf(buf, "%10i", gCurrentMedium->Isvol());
596     fTbhM[0]->Clear();
597     fTbhM[0]->AddText(0, buf);
598     gClient->NeedRedraw(fTehM[0]);
599
600
601     sprintf(buf, "%10i", gCurrentMedium->Ifield());
602     fTbhM[1]->Clear();
603     fTbhM[1]->AddText(0, buf);
604     gClient->NeedRedraw(fTehM[1]);
605
606     sprintf(buf, "%10.2e", gCurrentMedium->Fieldm());
607     fTbhM[2]->Clear();
608     fTbhM[2]->AddText(0, buf);
609     gClient->NeedRedraw(fTehM[2]);
610
611     sprintf(buf, "%10.2e", gCurrentMedium->Tmaxfd());
612     fTbhM[3]->Clear();
613     fTbhM[3]->AddText(0, buf);
614     gClient->NeedRedraw(fTehM[3]);
615
616     sprintf(buf, "%10.2e", gCurrentMedium->Stemax());
617     fTbhM[4]->Clear();
618     fTbhM[4]->AddText(0, buf);
619     gClient->NeedRedraw(fTehM[4]);
620
621     sprintf(buf, "%10.2e", gCurrentMedium->Deemax());
622     fTbhM[5]->Clear();
623     fTbhM[5]->AddText(0, buf);
624     gClient->NeedRedraw(fTehM[5]);
625
626     sprintf(buf, "%10.2e", gCurrentMedium->Epsil());
627     fTbhM[6]->Clear();
628     fTbhM[6]->AddText(0, buf);
629     gClient->NeedRedraw(fTehM[6]);
630
631     sprintf(buf, "%10.2e", gCurrentMedium->Stmin());
632     fTbhM[7]->Clear();
633     fTbhM[7]->AddText(0, buf);
634     gClient->NeedRedraw(fTehM[7]);
635 }
636
637 void AliGuiGeomMain::UpdateListBox()
638 {
639 // Update the list box
640     Int_t i;
641     fProcessLB->RemoveEntries(1,19);
642     for (i=11; i < 30; i++) {
643         Float_t p=gCurrentMedium->GetPar(i);
644         char tmp[20];
645         sprintf(tmp, "%6s%5d", kLabelTextP[i-11], Int_t(p));
646         fProcessLB->AddEntry(tmp, i-10);
647     }
648     fProcessLB->MapSubwindows();
649     fProcessLB->Layout();
650
651     fCutsLB->RemoveEntries(1,10);
652     for (i=1; i < 11; i++) {
653         Float_t p=gCurrentMedium->GetPar(i);
654         char tmp[20];
655         sprintf(tmp, "%6s%10.3e", kLabelTextC[i-1], p);
656         fCutsLB->AddEntry(tmp,i);
657     }
658     fCutsLB->MapSubwindows();
659     fCutsLB->Layout();
660 }
661
662
663 void AliGuiGeomMain::CloseWindow()
664 {
665    // Got close message for this MainFrame. Calls parent CloseWindow()
666    // (which destroys the window) and terminate the application.
667    // The close message is generated by the window manager when its close
668    // window menu item is selected.
669
670    TGMainFrame::CloseWindow();
671    gApplication->Terminate(0);
672 }
673
674 Bool_t AliGuiGeomMain::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
675 {
676 // Process messages to widgets
677     switch (GET_MSG(msg)) {
678 //
679 //  Text entries for binning of cross-section plots
680     case kC_TEXTENTRY:
681         switch (GET_SUBMSG(msg)) {
682         case kTE_TEXTCHANGED:
683             switch (parm1) {
684             case 10:
685                 fNbins=(Int_t) atof(fTbh61->GetString());
686                 break;
687             case 11:
688                 fEmin= atof(fTbh62->GetString());
689                 break;
690             case 12:
691                 fEmax= atof(fTbh63->GetString());
692                 break;
693             }
694         }
695         break;
696 //
697 // ListTree for volumes
698     case kC_LISTTREE:
699         switch (GET_SUBMSG(msg)) {
700 //
701 // Handle mouse click 
702         case kCT_ITEMCLICK:
703 //
704 // Button 1: Select volume
705             if (parm1 == kButton1) {
706               TGListTreeItem *item;
707               if ((item = fLt->GetSelected())) 
708                 {
709                   gCurrentVolume=((AliG3Volume *) item->GetUserData());
710                   Update();
711                 }
712             }
713 //
714 // Button 2: Draw volume specifications
715
716             if (parm1 == kButton2) {
717                 TGListTreeItem *item;
718                 if ((item = fLt->GetSelected())) 
719                 {
720
721                     ((AliG3Volume *) item->GetUserData())->DrawSpec();
722
723                     gCurrentVolume=((AliG3Volume *) item->GetUserData());
724                     Update();
725                 }
726             }
727 //
728 // Button 3: Draw Volume
729             if (parm1 == kButton3) {
730                 TGListTreeItem *item;
731                 if ((item = fLt->GetSelected())) 
732                 {
733                     ((AliG3Volume *) item->GetUserData())->Draw();
734                     gCurrentVolume=((AliG3Volume *) item->GetUserData());
735                     Update();
736                 }
737             }
738             
739             
740             break;
741         case kCT_ITEMDBLCLICK:
742             if (parm1 == kButton1) {
743                 if (fLt->GetSelected() != 0) {
744                     gClient->NeedRedraw(fLt);
745                 }
746             }
747             break;
748         default:
749             break;
750         }
751         break;
752     case kC_COMMAND:
753         switch (GET_SUBMSG(msg)) {
754         case kCM_BUTTON:
755             switch(parm1) {
756             case 1:
757                 Plot();
758                 break;
759             }
760             break;
761         case kCM_COMBOBOX:
762 //
763 // Combo box bindings
764             switch(parm1) {
765 //
766 // Material Combo
767             case 1:
768                 gCurrentMaterial=(AliG3Material*) 
769                     (fComboMaterialEntries->UncheckedAt(Int_t(parm2-1)));
770                 gCurrentMedium=(AliG3Medium*) 
771                     (fComboMediaEntries->UncheckedAt(Int_t(parm2-1)));
772                 UpdateCombo();
773                 UpdateListBox();
774                 break;
775 //
776 // Media Combo
777             case 2:
778                 gCurrentMedium=(AliG3Medium*) 
779                     (fComboMediaEntries->UncheckedAt(Int_t(parm2-1)));
780                 gCurrentMaterial=(AliG3Material*) 
781                     (fComboMaterialEntries->UncheckedAt(Int_t(parm2-1)));
782                 UpdateCombo();
783                 UpdateListBox();
784                 break;
785 //
786 // Particle Combo
787             case 3:
788                 gCurrentParticle=Int_t(parm2);
789                 break;
790 //
791 // Mechanism Combo
792             case 4:
793                 gCurrentProcess=Int_t(parm2);
794                 break;
795             }
796             break;
797         case kCM_MENUSELECT:
798             break;
799             
800         case kCM_MENU:
801             switch (parm1) {
802                 
803             case kFileOpen:
804             {
805                 TGFileInfo fi;
806                 fi.fFileTypes = (char **)kFileTypes;
807                 new TGFileDialog(gClient->GetRoot(), this, kFDOpen,&fi);
808             }
809             break;
810             
811             case kTestDlg:
812                 fDialog = new AliGuiGeomDialog
813                     (gClient->GetRoot(), this, 400, 200);
814                 break;
815                 
816             case kFileSave:
817                 printf("kFileSave\n");
818                 break;
819                 
820             case kFileExit:
821                 CloseWindow();   // this also terminates theApp
822                 break;
823             default:
824                 break;
825             }
826         default:
827             break;
828         }
829     default:
830         break;
831     }
832     return kTRUE;
833 }
834
835 void AliGuiGeomMain::AddMaterial(AliG3Material *Material, Int_t i)
836 {
837 // Add material to material combo
838     const char* tmp;
839     tmp=Material->GetName();
840     char mName[21];
841     
842     strncpy(mName, tmp, 20);
843     mName[20]='\0';
844     
845 //    Material->SetItemId(i);
846     fMaterialCombo->AddEntry(mName, i);
847     fMaterialCombo->Select(i);
848     fMaterialCombo->Resize(200, 20);
849 }
850
851 void AliGuiGeomMain::AddMedium(AliG3Medium *Medium, Int_t i)
852 {
853 // Add medium to medium combo
854     const char* tmp;
855     tmp=Medium->GetName();
856     char mName[21];
857     strncpy(mName, tmp, 20);
858     mName[20]='\0';
859     Medium->SetItemId(i);
860     fMediaCombo->AddEntry(mName, i);
861     fMediaCombo->Select(i);
862     fMediaCombo->Resize(200, 20);
863 }
864
865 void AliGuiGeomMain::SetMaterialComboEntries(TClonesArray *entries)
866 {
867 // Set the material combo entries
868 //
869     fComboMaterialEntries = entries;
870     Int_t nent = fComboMaterialEntries->GetEntriesFast();
871     for (Int_t i=0; i < nent; i++)
872     {
873         AddMaterial((AliG3Material*)fComboMaterialEntries->At(i), i+1);
874         gCurrentMaterial = (AliG3Material*)fComboMaterialEntries->At(i);
875     }
876 }
877
878
879 void AliGuiGeomMain::SetMediaComboEntries(TClonesArray *entries)
880 {
881 // Set the media combo entries
882 //
883     fComboMediaEntries = entries;
884     Int_t nent = fComboMediaEntries->GetEntriesFast();
885     for (Int_t i=0; i < nent; i++)
886     {
887         AddMedium((AliG3Medium*)fComboMediaEntries->At(i), i+1);
888         gCurrentMedium = (AliG3Medium*)fComboMediaEntries->At(i);
889     }
890 }
891
892 void AliGuiGeomMain::AddFoldersRecursively(TFolder* folder, TGListTreeItem* parent)
893 {
894 // Display geometry represented by TFolders in List Tree
895 //
896     const TGPicture* kFolder     = gClient->GetPicture("folder_t.xpm");
897     const TGPicture* kOpenFolder = gClient->GetPicture("ofolder_t.xpm");
898     const TGPicture* kDocument   = gClient->GetPicture("doc_t.xpm");
899     
900     AliG3Volume* volume = ((AliG3Volume *) folder->FindObject(folder->GetName()));
901     volume->SetItem(folder);
902
903     TList* folders = (TList*) folder->GetListOfFolders();
904     TIter next(folders);
905     TObject* obj;
906     TGListTreeItem* nParent = 0;
907     if (folders->GetSize() > 1) {
908         nParent = fLt->AddItem(parent, folder->GetName(), volume, kOpenFolder, kFolder);
909     } else {
910         nParent = fLt->AddItem(parent, folder->GetName(), volume, kDocument, kDocument);
911     }
912     
913     while ((obj = next()))
914     {
915         if ((AliG3Volume*) obj == volume) continue;
916         TFolder* item = (TFolder*) obj;
917         AddFoldersRecursively(item, nParent);
918     }
919 }
920