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