]> git.uio.no Git - u/mrichter/AliRoot.git/blob - AliGeant3/AliNode.cxx
Bugfix in AliPoints2Memory
[u/mrichter/AliRoot.git] / AliGeant3 / AliNode.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 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$
18 Revision 1.1  2001/07/09 11:44:01  morsch
19 Node class derived from TNode to allow expansion of volume divisions.
20
21 */
22
23
24 #include "AliNode.h"
25 #include "TShape.h"
26 #include "TTUBE.h"
27 #include "TBRIK.h"
28 #include "TTRD1.h"
29 #include "TTRD2.h"
30 #include "TTRAP.h"
31 #include "TTUBS.h"
32 #include "TCONE.h"
33 #include "TCONS.h"
34 #include "TSPHE.h"
35 #include "TPARA.h"
36 #include "TPGON.h"
37 #include "TPCON.h"
38 #include "TTUBS.h"
39 #include "TELTU.h"
40 #include "THYPE.h"
41 #include "TGTRA.h"
42 #include "TCTUB.h"
43
44 ClassImp(AliNode)
45     AliNode::AliNode(const char* name, const char* title, const char* shapename,
46                      Double_t x, Double_t y, Double_t z, const char* matrixname,
47                      Option_t* option) : 
48         TNode(name, title, shapename, x, y, z, matrixname, option)
49 {
50     fNDivision   = -1;
51     fAxis   =  0;
52     fStartC = 0.;
53     fStep   = 0.;
54 }
55
56   AliNode::AliNode(const char* name, const char* title, TShape* shape,
57                      Double_t x, Double_t y, Double_t z, TRotMatrix* matrix,
58                      Option_t* option) : 
59         TNode(name, title, shape, x, y, z, matrix, option)
60 {
61     fNDivision   = -1;
62     fAxis   =  0;
63     fStartC = 0.;
64     fStep   = 0.;
65 }
66
67 void   AliNode::SetDivision(Int_t ndiv, Int_t axis, Float_t start, Float_t step)
68 {
69     fNDivision   = ndiv;
70     fAxis   = axis;
71     fStartC = start;
72     fStep   = step;
73 }
74
75 void AliNode::ExpandDivisions()
76 {
77     Int_t i;
78     char vName[20];
79     char nName[20];
80     
81     char tmp[4];
82     AliNode* node;
83     TShape*  parent =  fParent->GetShape();
84     TShape*  newsh;
85     
86     strcpy(tmp, parent->GetTitle());
87     Int_t ndiv = fNDivision;
88
89 //                                      TUBE
90     
91     if (strcmp(tmp, "TUBE")==0) {
92         TTUBE * shape = (TTUBE*) parent;
93
94         Float_t dZ   = shape->GetDz();
95         Float_t rMin = shape->GetRmin();
96         Float_t rMax = shape->GetRmax();
97         
98         if (fAxis == 1) {
99 //  radial-division
100             Float_t dr = (rMax-rMin)/Float_t(fNDivision);
101             Float_t r1, r2;
102             for (i=0; i<ndiv; i++) {
103                 r1 = rMin+Float_t(i)*dr;
104                 r2 = r1+dr;
105                 sprintf(vName, "%sD%d", fShape->GetName(), i);
106                 sprintf(nName, "%sD%d", GetName(), i);
107                 newsh = new TTUBE(vName, "TUBE", "void", r1, r2, dZ);
108                 fParent->cd();
109                 node = new AliNode(nName,"", newsh, 0., 0., 0.);
110                 node->AddSons(fNodes);
111                 cd();
112             }
113     
114         } else if (fAxis == 2) {
115 //  phi-division
116             Float_t dPhi = 360./Float_t(fNDivision);
117             Float_t phi1, phi2;
118             for (i=0; i<ndiv; i++) {
119                 phi1 = Float_t(i)*dPhi;
120                 phi2 = phi1+dPhi;
121                 sprintf(vName, "%sD%d", fShape->GetName(), i);
122                 sprintf(nName, "%sD%d", GetName(), i);
123                 newsh = new TTUBS(vName, "TUBS", "void", rMin, rMax, dZ, phi1, phi2);
124                 fParent->cd();
125                 node = new AliNode(nName, "", newsh, 0., 0., 0.);
126                 node->AddSons(fNodes);
127                 cd();
128             }
129         } else {
130 //  z-division
131             Float_t delZ = dZ/Float_t(fNDivision);
132             for (i=0; i<ndiv; i++) {
133                 sprintf(vName, "%sD%d", fShape->GetName(), i);
134                 sprintf(nName, "%sD%d", GetName(), i);
135                 newsh = new TTUBE(vName, "TUBE", "void", rMin, rMax, delZ);
136                 fParent->cd();
137                 Float_t zpos = -dZ+delZ*(2.*Float_t(i)+1.);
138                 node = new AliNode(nName, "",newsh, 0., 0., zpos);
139                 node->AddSons(fNodes);
140                 cd();
141             }
142         }
143 //
144 //                            TUBS
145 //
146     } else if (strcmp(tmp, "TUBS")==0) {
147         TTUBS * shape = (TTUBS*) parent;
148         Float_t dZ   = shape->GetDz();
149         Float_t rMin = shape->GetRmin();
150         Float_t rMax = shape->GetRmax();
151         Float_t phi1 = shape->GetPhi1();
152         Float_t phi2 = shape->GetPhi2();
153         
154         if (fAxis == 1) {
155 //  radial-division
156             Float_t dr = (rMax-rMin)/Float_t(fNDivision);
157             Float_t r1, r2;
158             Int_t ndiv = fNDivision;
159             for (i=0; i<ndiv; i++) {
160                 r1 = rMin+Float_t(i)*dr;
161                 r2 = r1+dr;
162                 sprintf(vName, "%sD%d", fShape->GetName(), i);
163                 sprintf(nName, "%sD%d", GetName(), i);
164                 newsh = new TTUBS(vName, "TUBS", "void", r1, r2, dZ, phi1, phi2);
165                 fParent->cd();
166                 node = new AliNode(nName,"", newsh, 0., 0., 0.);
167                 node->AddSons(fNodes);
168                 cd();
169             }
170             
171         } else if (fAxis == 2) {
172 //  phi-division
173             Float_t dPhi = (phi2-phi1)/Float_t(fNDivision);
174             Float_t nphi1, nphi2;
175             
176             for (i=0; i<fNDivision; i++) {
177                 nphi1 = phi1+Float_t(i)*dPhi;
178                 nphi2 = nphi1+dPhi;
179                 sprintf(vName, "%sD%d", fShape->GetName(), i);
180                 sprintf(nName, "%sD%d", GetName(), i);
181
182                 newsh = new TTUBS(vName, "TUBS", "void", rMin, rMax, dZ, nphi1, nphi2);
183                 fParent->cd();
184                 node = new AliNode(nName, "", newsh, 0., 0., 0.);
185                 node->AddSons(fNodes);
186                 cd();
187             }
188         } else {
189 //  z-division
190             Float_t delZ = dZ/Float_t(fNDivision);
191             for (i=0; i<ndiv; i++) {
192                 sprintf(vName, "%sD%d", fShape->GetName(), i);
193                 sprintf(nName, "%sD%d", GetName(), i);
194                 newsh = new TTUBS(vName, "TUBS", "void", rMin, rMax, delZ, phi1, phi2);
195                 fParent->cd();
196                 Float_t zpos = -dZ+delZ*(2.*Float_t(i)+1.);
197                 node = new AliNode(nName, "",newsh, 0., 0., zpos);
198                 node->AddSons(fNodes);
199                 cd();
200             }
201         }
202         
203     } else if (strcmp(tmp, "CONE")==0) {
204         TCONE * shape = (TCONE*) parent;
205
206         Float_t dZ   = shape->GetDz();
207         Float_t rMin1 = shape->GetRmin();
208         Float_t rMax1 = shape->GetRmax();
209         Float_t rMin2 = shape->GetRmin2();
210         Float_t rMax2 = shape->GetRmax2();
211         
212         if (fAxis == 1) {
213 //  radial-division
214             Float_t dr1 = (rMax1-rMin1)/Float_t(fNDivision);
215             Float_t dr2 = (rMax2-rMin2)/Float_t(fNDivision);
216             Float_t r11, r12, r21, r22;
217             for (i=0; i<ndiv; i++) {
218                 r11 = rMin1+Float_t(i)*dr1;
219                 r12 = r11+dr1;
220                 r21 = rMin2+Float_t(i)*dr2;
221                 r22 = r21+dr2;
222
223                 sprintf(vName, "%sD%d", fShape->GetName(), i);
224                 sprintf(nName, "%sD%d", GetName(), i);
225                 newsh = new TCONE(vName, "CONE", "void", dZ, r11, r12, r21, r22);
226                 fParent->cd();
227                 node = new AliNode(nName,"", newsh, 0., 0., 0.);
228                 node->AddSons(fNodes);
229                 cd();
230             }
231         } else if (fAxis == 2) {
232 //  phi-division
233             Float_t dPhi = 360./Float_t(fNDivision);
234             Float_t phi1, phi2;
235             for (i=0; i<ndiv; i++) {
236                 phi1 = Float_t(i)*dPhi;
237                 phi2 = phi1+dPhi;
238                 sprintf(vName, "%sD%d", fShape->GetName(), i);
239                 sprintf(nName, "%sD%d", GetName(), i);
240                 newsh = new TCONS(vName, "CONS", "void", dZ, rMin1, rMax1, 
241                           rMin2, rMax2, phi1, phi2);
242                 fParent->cd();
243                 node = new AliNode(nName, "",newsh, 0., 0., 0.);
244                 node->AddSons(fNodes);
245                 cd();
246             }
247         } else {
248 //  z-division
249             Float_t delZ = dZ/Float_t(fNDivision);
250             for (i=0; i<ndiv; i++) {
251                 sprintf(vName, "%sD%d", fShape->GetName(), i);
252                 sprintf(nName, "%sD%d", GetName(), i);
253                 newsh = new TCONE(vName, "CONE", "void", delZ, rMin1, rMax1, rMin2, rMax2);
254                 fParent->cd();
255                 Float_t zpos = -dZ+delZ*(2.*Float_t(i)+1.);
256                 node = new AliNode(nName, "",newsh, 0., 0., zpos);
257                 node->AddSons(fNodes);
258                 cd();
259             }
260         }
261         
262     } else if (strcmp(tmp, "CONS")==0) {
263         TCONS * shape = (TCONS*) parent;
264         Float_t dZ   = shape->GetDz();
265         Float_t rMin1 = shape->GetRmin();
266         Float_t rMax1 = shape->GetRmax();
267         Float_t rMin2 = shape->GetRmin2();
268         Float_t rMax2 = shape->GetRmax2();
269         Float_t phi1 = shape->GetPhi1();
270         Float_t phi2 = shape->GetPhi2();
271         if (fAxis == 1) {
272 //  radial-division
273             Float_t dr1 = (rMax1-rMin1)/Float_t(fNDivision);
274             Float_t dr2 = (rMax2-rMin2)/Float_t(fNDivision);
275             Float_t r11, r12, r21, r22;
276             for (i=0; i<ndiv; i++) {
277                 r11 = rMin1+Float_t(i)*dr1;
278                 r12 = r11+dr1;
279                 r21 = rMin2+Float_t(i)*dr2;
280                 r22 = r21+dr2;
281
282                 sprintf(vName, "%sD%d", fShape->GetName(), i);
283                 sprintf(nName, "%sD%d", GetName(), i);
284                 newsh = new TCONS(vName, "CONS", "void", dZ, r11, r12, r21, r22, phi1, phi2);
285                 fParent->cd();
286                 node = new AliNode(nName,"", newsh, 0., 0., 0.);
287                 node->AddSons(fNodes);
288                 cd();
289             }
290             
291         } else if (fAxis == 2) {
292 //  phi-division
293             Float_t dPhi = (phi2-phi1)/Float_t(fNDivision);
294             Float_t nphi1, nphi2;
295             
296             for (i=0; i<fNDivision; i++) {
297                 nphi1 = phi1+Float_t(i)*dPhi;
298                 nphi2 = nphi1+dPhi;
299                 sprintf(vName, "%sD%d", fShape->GetName(), i);
300                 sprintf(nName, "%sD%d", GetName(), i);
301
302                 newsh = new TCONS(vName, "CONS", "void", dZ, rMin1, rMax1, rMin2, rMax2, nphi1, nphi2);
303                 fParent->cd();
304                 node = new AliNode(nName, "", newsh, 0., 0., 0.);
305                 node->AddSons(fNodes);
306                 cd();
307             }
308         } else {
309 //  z-division
310             Float_t delZ = dZ/Float_t(fNDivision);
311             for (i=0; i<ndiv; i++) {
312                 sprintf(vName, "%sD%d", fShape->GetName(), i);
313                 sprintf(nName, "%sD%d", GetName(), i);
314                 newsh = new TCONS(vName, "CONS", "void", delZ, rMin1, rMax1, rMin2, rMax2, phi1, phi2);
315                 fParent->cd();
316                 Float_t zpos = -dZ+delZ*(2.*Float_t(i)+1.);
317                 node = new AliNode(nName,"",newsh, 0., 0., zpos);
318                 node->AddSons(fNodes);
319                 cd();
320             }
321         }
322     } else if (strcmp(tmp, "BRIK")==0) {
323 //
324 //                          BRIK
325 //
326         TBRIK * shape = (TBRIK*) parent;
327         Float_t dX   = shape->GetDx();
328         Float_t dY   = shape->GetDy();
329         Float_t dZ   = shape->GetDz();
330
331         if (fAxis == 1) {
332 // division in x
333             Float_t delX = dX/Float_t(fNDivision);
334             for (i=0; i<ndiv; i++) {
335                 sprintf(vName, "%sD%d", fShape->GetName(), i);
336                 sprintf(nName, "%sD%d", GetName(), i);
337                 newsh = new TBRIK(vName, "BRIK", "void", delX, dY, dZ);
338                 fParent->cd();
339                 Float_t xpos = -dX+delX*(2.*Float_t(i)+1.);
340                 node = new AliNode(nName,"",newsh, xpos, 0., 0.);
341                 node->AddSons(fNodes);
342                 cd();
343             }
344         } else if (fAxis == 2) {
345 // division in y
346             Float_t delY = dY/Float_t(fNDivision);
347             for (i=0; i<ndiv; i++) {
348                 sprintf(vName, "%sD%d", fShape->GetName(), i);
349                 sprintf(nName, "%sD%d", GetName(), i);
350                 newsh = new TBRIK(vName, "BRIK", "void", dX, delY, dZ);
351                 fParent->cd();
352                 Float_t ypos = -dY+delY*(2.*Float_t(i)+1.);
353                 node = new AliNode(nName,"",newsh, 0., ypos, 0.);
354                 node->AddSons(fNodes);
355                 cd();
356             }
357         } else {
358 // division in z
359             Float_t delZ = dZ/Float_t(fNDivision);
360             for (i=0; i<ndiv; i++) {
361                 sprintf(vName, "%sD%d", fShape->GetName(), i);
362                 sprintf(nName, "%sD%d", GetName(), i);
363                 newsh = new TBRIK(vName, "BRIK", "void", dX, dY, delZ);
364                 fParent->cd();
365                 Float_t zpos = -dZ+delZ*(2.*Float_t(i)+1.);
366                 node = new AliNode(nName,"",newsh, 0., 0., zpos);
367                 node->AddSons(fNodes);
368                 cd();
369             }
370         }
371     }
372 }
373
374 void AliNode::AddSons(TList* list)
375 {
376     if (!list) return;
377     if (!fNodes) fNodes = new TList();
378     
379     TIter next(list);
380     AliNode* node;
381     
382     while((node = (AliNode*)next())) {
383         AliNode* newNode = new AliNode(*node, this);
384         fNodes->Add(newNode);
385         newNode->SetParent(this);
386         newNode->AddSons(node->GetListOfNodes());
387     }
388 }
389
390
391 AliNode::AliNode(const AliNode &node, AliNode* parent)
392 {
393     fNDivision   = node.Ndiv();
394     fAxis        = node.Axis();
395     fStartC      = node.StartC();
396     fStep        = node.Step();
397     fName        = node.GetName();
398     fTitle       = node.GetTitle();
399     fX           = node.GetX();
400     fY           = node.GetY();
401     fZ           = node.GetZ();
402     fMatrix      = node.GetMatrix();
403     fNodes       = 0;
404     fParent      = parent;
405     
406     
407     if (fNDivision > 0) {
408         fShape = new TShape(*node.GetShape());
409     } else {
410         fShape = (TShape*) node.GetShape()->Clone();
411     }
412     
413     
414 //    fShape = (TShape*) shape->Clone();
415 /*
416     char tmp[4];        
417     strcpy(tmp, shape->ClassName());
418
419     if (strcmp(tmp, "TTUBE")==0) 
420         fShape =  (TTUBE*)shape->Clone();
421     else if (strcmp(tmp, "TBRIK")==0) 
422         fShape =  (TBRIK*)shape->Clone();
423     else if (strcmp(tmp, "TCONE")==0) 
424         fShape =  (TCONE*)shape->Clone();
425     else if (strcmp(tmp, "TCONS")==0) 
426         fShape =  (TCONS*)shape->Clone();
427     else if (strcmp(tmp, "TTUBS")==0) 
428         fShape =  (TTUBS*)shape->Clone();
429     else if (strcmp(tmp, "TTRAP")==0) 
430         fShape =  (TTRAP*)shape->Clone();
431     else if (strcmp(tmp, "TTRD1")==0) 
432         fShape =  (TTRD1*)shape->Clone();
433     else if (strcmp(tmp, "TTRD2")==0)
434         fShape =  (TTRD2*)shape->Clone();
435     else if (strcmp(tmp, "TSPHE")==0) 
436         fShape =  (TSPHE*)shape->Clone();
437     else if (strcmp(tmp, "TPGON")==0) 
438         fShape =  (TPGON*)shape->Clone();
439     else if (strcmp(tmp, "TPCON")==0) 
440         fShape =  (TPCON*)shape->Clone();
441 */
442 }
443
444 void AliNode::AddSon(AliNode* node)
445 {
446     fNodes->Add(node);
447 }
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462