]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TGeant3/AliGeant3GeometryGUI.cxx
Resolved merging conflicts
[u/mrichter/AliRoot.git] / TGeant3 / AliGeant3GeometryGUI.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 *
8 * documentation strictly 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$
18Revision 1.8 2000/07/12 08:56:32 fca
19Coding convention correction and warning removal
20
21Revision 1.7 2000/06/28 21:27:45 morsch
22Most coding rule violations corrected.
23Still to do: Split the file (on file per class) ? Avoid the global variables.
24Copy constructors and assignment operators (dummy ?)
25
26Revision 1.6 2000/04/14 11:07:46 morsch
27Correct volume to medium assignment in case several media are asigned to the
28same material.
29
30Revision 1.5 2000/03/20 15:11:03 fca
31Mods to make the code compile on HP
32
33Revision 1.4 2000/01/18 16:12:08 morsch
34Bug in calculation of number of volume divisions and number of positionings corrected
35Browser for Material and Media properties added
36
37Revision 1.3 1999/11/14 14:31:14 fca
38Correct small error and remove compilation warnings on HP
39
40Revision 1.2 1999/11/10 16:53:35 fca
41The new geometry viewer from A.Morsch
42
43*/
44
45/*
46 * Version: 0
47 * Written by Andreas Morsch
48 *
49 *
50 *
51 * For questions critics and suggestions to this part of the code
52 * contact andreas.morsch@cern.ch
53 *
54 **************************************************************************/
55
56
57#include "AliGeant3GeometryGUI.h"
58#include "AliDrawVolume.h"
59#include "AliGUIMaterial.h"
60#include "AliGUIMedium.h"
61#include "AliGuiGeomMain.h"
62
63AliDrawVolume *gCurrentVolume = new AliDrawVolume("NULL");
64AliGUIMaterial *gCurrentMaterial = new AliGUIMaterial();
65AliGUIMedium *gCurrentMedium = new AliGUIMedium();
66
67ClassImp(AliGeant3GeometryGUI)
68
69 AliGeant3GeometryGUI::AliGeant3GeometryGUI()
70{
71// Constructor
72 fPanel = new AliGuiGeomMain(gClient->GetRoot(), 500, 500);
73 fNstack = 0;
74 fVolumes = new TClonesArray("AliDrawVolume",1000);
75 fMaterials = new TClonesArray("AliGUIMaterial",1000);
76 fMedia = new TClonesArray("AliGUIMedium",1000);
77// Store local copy of zebra bank entries
78 TGeant3 *geant3 = (TGeant3*) gMC;
79 if (geant3) {
80 fZlq=geant3->Lq();
81 fZq=geant3->Q();
82 fZiq=geant3->Iq();
83 fGclink=geant3->Gclink();
84 fGcnum=geant3->Gcnum();
85//
86 ReadGeometryTree();
87 ReadMaterials();
88 }
89}
90void AliGeant3GeometryGUI::Streamer(TBuffer &)
91{
92// Dummy Streamer
93;
94}
95
96
97void AliGeant3GeometryGUI::ReadGeometryTree()
98{
99//
100// Copy zebra volume tree into ROOT LisTree
101//
102 char *vname;
103 char /* *namec, */ *tmp;
104 char namec[30];
105// Icons for
106// Closed folder (=volume containing children)
107 const TGPicture* kFolder = gClient->GetPicture("folder_t.xpm");
108// Open folder (=volume containing children)
109 const TGPicture* kOpenFolder = gClient->GetPicture("ofolder_t.xpm");
110// Empty object
111 const TGPicture* kDocument = gClient->GetPicture("doc_t.xpm");
112
113 AliDrawVolume *volume;
114
115 Int_t nst=0;
116 Int_t nlevel=1;
117 Int_t newlevel=nlevel;
118
119 volume = new AliDrawVolume("ALIC");
120 volume->SetIdVolume(((TGeant3*)gMC)->VolId("ALIC"));
121 volume->SetIdCopy(0);
122 volume->SetItem(NULL);
123 (*fVolumes)[0]=volume;
124//
125// Loop over volumes for which information has been collected
126 while(nlevel>nst) {
127 for (Int_t i=nst; i<nlevel; i++)
128 {
129 TGListTreeItem *itemi, *item2;
130// GEANT3 volume number
131 Int_t ivol=TMath::Abs(Volume(i)->GetIdVolume());
132// Copy number
133// icopy=1 normal positioning
134// icopy>1 positioning with parposp
135// icopy<0 division
136 Int_t icopy = Volume(i)->GetIdCopy();
137// Medium and material number, handle special case of divisions
138 Int_t imat, imed;
139
140 if (icopy <0) {
141 imed=Medium(-ivol);
142 imat=Material(-ivol);
143 } else {
144 imed=Medium(ivol);
145 imat=Material(ivol);
146 }
147//
148// Number of children
149 Int_t nch = NChildren(ivol);
150 strcpy(namec,((TGeant3*)gMC)->VolName(ivol));
151 if (nch >= 0) {
152 printf("\n %s has %d children \n ", namec, nch);
153 } else {
154 printf("\n %s has divisions \n ", namec);
155 }
156//
157// Name to be used in ListTree
158 vname = new char[5];
159 strncpy(vname,namec, 4);
160 vname[4]='\0';
161
162 if (icopy >1) {
163 sprintf(namec,"%s*%3dPos",namec,icopy);
164 } else if (icopy <0) {
165 sprintf(namec,"%s*%3dDiv",namec,-icopy);
166 }
167 if (i>0) {
168 itemi=Volume(i)->GetItem();
169 } else {
170 itemi=NULL;
171 }
172
173//
174// Add volume to list tree
175
176 if (nch!=0) {
177 item2 = fPanel->AddItem(new AliDrawVolume(vname),
178 itemi, namec, kOpenFolder, kFolder);
179 } else {
180 item2 = fPanel->AddItem(new AliDrawVolume(vname),
181 itemi, namec, kDocument, kDocument);
182 }
183//
184// Add medium information to list tree item
185 ((AliDrawVolume *) item2->GetUserData())->SetIdVolume(ivol);
186 ((AliDrawVolume *) item2->GetUserData())->SetIdMaterial(imat);
187 ((AliDrawVolume *) item2->GetUserData())->SetIdMedium(imed);
188//
189// Set current volume to first list tree entry
190 if (!i) gCurrentVolume= ((AliDrawVolume *) item2->GetUserData());
191
192//
193// Collect children information
194//
195// nch < 0: Children by division
196 if (nch < 0) {
197//
198// Geant volume number
199 Int_t icvol=Child(ivol,1);
200// Name
201 strcpy(namec,((TGeant3*)gMC)->VolName(-icvol));
202 tmp = new char[4];
203 strncpy(tmp,(char *) &namec, 4);
204 volume = new AliDrawVolume(namec);
205 volume->SetIdVolume(-icvol);
206// Number of divisions
207 Int_t jvo = fZlq[fGclink->jvolum-ivol];
208 Int_t jdiv = fZlq[jvo-1];
209 Int_t ndiv = Int_t (fZq[jdiv+3]);
210 volume->SetIdCopy(-ndiv);
211// Link to mother
212 volume->SetItem(item2);
213 (*fVolumes)[newlevel]=volume;
214 printf("\n volume %s %d %d %d", namec, icvol, nch, ndiv);
215 newlevel++;
216//
217// Children by positioning
218 } else {
219 Int_t nnew=0;
220// Loop over children
221 for (Int_t j=0; j<nch; j++)
222 {
223//
224// Find out if this volume was already positioned and count copies
225 Int_t icvol=Child(ivol,j+1);
226 icvol = TMath::Abs(icvol);
227 Bool_t inList=kFALSE;
228 for (Int_t k=0; k<nnew; k++) {
229 if (icvol==
230 Volume(newlevel-k-1)->GetIdVolume())
231 {
232 Volume(newlevel-k-1)->AddCopy();
233 inList=kTRUE;
234 }
235 }
236//
237// New child
238 if (!inList) {
239//
240// Name
241 strcpy(namec,((TGeant3*)gMC)->VolName(icvol));
242 tmp = new char[4];
243 strncpy(tmp,(char *) &namec, 4);
244 volume = new AliDrawVolume(namec);
245 volume->SetIdVolume(icvol);
246 volume->SetIdCopy(1);
247// Link to mother
248 volume->SetItem(item2);
249 (*fVolumes)[newlevel]=volume;
250 printf("\n volume %s %d %d", namec, icvol, nch);
251 newlevel++;
252 nnew++;
253 }
254 }
255 }
256 }
257// Move one level deaper
258 nst=nlevel;
259 nlevel=newlevel;
260 }
261}
262
263void AliGeant3GeometryGUI::ReadMaterials()
264{
265//
266// Puts media and material names into ComboBox and
267// collects material information
268//
269 Float_t a, z, dens, radl, absl;
270 a=z=dens=radl=absl=-1;
271 Int_t npar=0;
272 Int_t imat, isvol, ifield;
273 Float_t fieldm, tmaxfd, stemax, deemax, epsil, stmin;
274 Float_t par[50];
275 Float_t ubuf[50];
276 Int_t nwbuf;
277
278 char natmed[21], namate[21];
279//
280// Loop over media
281 Int_t nEntries=0;
282
283 for(Int_t itm=1;itm<=fGcnum->ntmed;itm++) {
284 Int_t jtm = fZlq[fGclink->jtmed-itm];
285 if (jtm > 0) {
286 nEntries++;
287//
288// Get medium parameters
289 ((TGeant3*)(gMC))->Gftmed(itm, natmed, imat, isvol, ifield, fieldm,
290 tmaxfd, stemax, deemax, epsil, stmin, ubuf, &nwbuf);
291 strncpy(natmed,(char*)&fZiq[jtm+1],20);
292 natmed[20]='\0';
293//
294// Create new medium object
295 AliGUIMedium * medium =
296 new AliGUIMedium(itm, imat, natmed, isvol, ifield, fieldm,
297 tmaxfd, stemax, deemax, epsil, stmin);
298 (*fMedia)[nEntries-1]=medium;
299 { //Begin local scope for j
300 for (Int_t j=1; j<=22; j++) {
301 medium->SetPar(j,Cut(itm,j));
302 }
303 } //End local scope for j
304 { //Begin local scope for j
305 for (Int_t j=23; j<=26; j++) {
306 medium->SetPar(j,Cut(itm,j+3));
307 }
308 } //End local scope for j
309 { //Begin local scope for j
310 for (Int_t j=27; j<=29; j++) {
311 medium->SetPar(j,Cut(itm,j+4));
312 }
313 } //End local scope for j
314//
315// Add to ComboBox
316 fPanel->AddMedium(medium, nEntries);
317//
318// Associated material
319 imat = Int_t (fZq[jtm+6]);
320 Int_t jma = Int_t (fZlq[fGclink->jmate-imat]);
321//
322// Get material parameters
323 ((TGeant3*)(gMC))->Gfmate (imat,namate,a,z,dens,radl,absl,par,npar);
324 strncpy(namate,(char *)&fZiq[jma+1],20);
325 namate[20]='\0';
326//
327// Create new material object
328 AliGUIMaterial * material =
329 new AliGUIMaterial(imat,namate,a,z,dens,radl,absl);
330 (*fMaterials)[nEntries-1]=material;
331 material->Dump();
332//
333// Add to combo box
334 fPanel->AddMaterial(material, nEntries);
335 gCurrentMaterial=material;
336 }
337 }
338 fPanel->SetComboEntries(fMaterials);
339 fPanel->SetMediaComboEntries(fMedia);
340 fPanel->Update();
341}
342
343Int_t AliGeant3GeometryGUI::NChildren(Int_t idvol)
344{
345//
346// Return number of children for volume idvol
347 Int_t jvo = fZlq[fGclink->jvolum-idvol];
348 Int_t nin = Int_t(fZq[jvo+3]);
349 return nin;
350}
351
352Int_t AliGeant3GeometryGUI::Child(Int_t idvol, Int_t idc)
353{
354//
355// Return GEANT id of child number idc of volume idvol
356 Int_t jvo = fZlq[fGclink->jvolum-idvol];
357 Int_t nin=idc;
358 Int_t jin = fZlq[jvo-nin];
359 Int_t numb = Int_t (fZq[jin +3]);
360 if (numb > 1) {
361 return -Int_t(fZq[jin+2]);
362 } else {
363 return Int_t(fZq[jin+2]);
364 }
365}
366
367Int_t AliGeant3GeometryGUI::Medium(Int_t idvol)
368{
369//
370// Return medium number for volume idvol.
371// If idvol is negative the volume results from a division.
372 Int_t imed;
373 if (idvol > 0) {
374 Int_t jvo = fZlq[fGclink->jvolum-idvol];
375 imed = Int_t(fZq[jvo+4]);
376 } else {
377 idvol=-idvol;
378 Int_t jdiv = fZlq[fGclink->jvolum-idvol];
379 Int_t ivin = Int_t ( fZq[jdiv+2]);
380 Int_t jvin = fZlq[fGclink->jvolum-ivin];
381 imed = Int_t (fZq[jvin+4]);
382 }
383 return imed;
384}
385
386Int_t AliGeant3GeometryGUI::Material(Int_t idvol)
387{
388// Return material number for volume idvol.
389// If idvol is negative the volume results from a division.
390
391 Int_t imed=Medium(idvol);
392 Int_t jtm = fZlq[fGclink->jtmed-imed];
393 return Int_t (fZq[jtm+6]);
394}
395
396
397Float_t AliGeant3GeometryGUI::Cut(Int_t imed, Int_t icut)
398{
399// Return cuts icut for medium idmed
400//
401 Int_t jtm = fZlq[fGclink->jtmed-imed];
402//
403// Have the defaults been modified ??
404 Int_t jtmn = fZlq[jtm];
405 if (jtmn >0) {
406 jtm=jtmn;
407
408 } else {
409 jtm=fGclink->jtmed;
410 }
411
412 return Float_t (fZq[jtm+icut]);
413}
414
415