1 //____________________________________________________________________
6 // Script I used for rapid prototyping of the FMD3 geometry - in
7 // particular the support cone
9 /** @defgroup geo_geom Simple geometry
13 # ifndef ROOT_TGeoVolume
14 # include <TGeoVolume.h>
16 # ifndef ROOT_TGeoMaterial
17 # include <TGeoMaterial.h>
19 # ifndef ROOT_TGeoMedium
20 # include <TGeoMedium.h>
22 # ifndef ROOT_TGeoMatrix
23 # include <TGeoMatrix.h>
25 # ifndef ROOT_TGeoXtru
26 # include <TGeoXtru.h>
28 # ifndef ROOT_TGeoPcon
29 # include <TGeoPcon.h>
31 # ifndef ROOT_TGeoTube
32 # include <TGeoTube.h>
34 # ifndef ROOT_TGeoManager
35 # include <TGeoManager.h>
37 # ifndef ROOT_TGeoPhysicalNode
38 # include <TGeoPhysicalNode.h>
40 # ifndef ROOT_TVector3
41 # include <TVector3.h>
49 # ifndef ROOT_TBrowser
50 # include <TBrowser.h>
63 //____________________________________________________________________
64 /** @brief Simple geometry
67 gSystem->Load("libPhysics.so");
68 gSystem->Load("libGeom.so");
69 gROOT->LoadMacro("GeoGeometry.C+");
80 virtual ~Geometry() {}
82 virtual void Initialize();
84 virtual void Register();
85 /** @e Do-It member function */
89 /** Convert detector coordinates to spatial coordinates
90 @param sector Sector number
91 @param strip Strip number
92 @param xyz Spatial coordinates
94 virtual void Detector2XYZ(UInt_t sector, UInt_t strip, TVector3& xyz);
97 /** Print debugging messages
98 @param lvl Acceptance level
99 @param where Where it happened
100 @param format Message format. */
101 static void Debug(Int_t lvl, const char* where, const char* format, ...)
103 if (lvl > fgDebug) return;
104 static char buf[2048];
106 va_start(ap, format);
107 vsnprintf(buf, 2048, format, ap);
108 std::cout << "D: " << where << ": " << buf << std::endl;
112 /** List of translations */
113 TObjArray* fMatricies;
114 /** Shape parameter */
116 /** Shape parameter */
118 /** Shape parameter */
120 /** Spacing between sensor and hybrid */
122 /** Thickness of aluminum plates in honey comb */
123 Double_t fAlThickness;
124 /** Width of bonding pads */
125 Double_t fBondingWidth;
126 /** chip layer thickenss */
127 Double_t fChipThickness;
128 /** Copper layer thickness */
129 Double_t fCopperThickness;
132 /** Thickness of honey comb */
133 Double_t fHoneycombThickness;
134 /** Inner honey comb inner radius */
135 Double_t fInnerHoneyHighR;
136 /** Inner honey comb outer radius */
137 Double_t fInnerHoneyLowR;
138 /** Z coordinate of inner ring */
140 /** Length of support legs */
142 /** Offset from edge of legs */
144 /** Radius of support legs */
148 /** Spacing between modules */
149 Double_t fModuleSpacing;
150 /** Number of strps */
152 /** Outer honey comb inner radius */
153 Double_t fOuterHoneyHighR;
154 /** Outer honey comb outer radius */
155 Double_t fOuterHoneyLowR;
156 /** Z coordinate of outer */
158 /** Thickness of print board */
159 Double_t fPrintboardThickness;
160 /** Cache of ring depth */
162 /** Thickness of silicon sensor */
163 Double_t fSiThickness;
165 Double_t fSpacerHeight;
166 /** Opening angle of sensor */
168 /** Radius of wafer the sensor is cut out of */
169 Double_t fWaferRadius;
170 /** Air tracking medium */
172 /** Aluminum tracking medium */
174 /** Carbon tracking medium */
176 /** Chip tracking medium */
178 /** Copper tracking medium */
180 /** Kapton tracking medium */
182 /** PCB tracking medium */
184 /** Plastic tracking medium */
185 TGeoMedium* fPlastic;
186 /** Active silicon tracking medium */
188 /** Vacuum tracking medium */
190 /** Use assemblies */
191 Bool_t fDoubleAssembly;
192 /** Make a detailed geometry */
193 void MakeDetailed(TGeoVolume* mother);
196 //____________________________________________________________________
197 Int_t Geometry::fgDebug = 10;
199 //____________________________________________________________________
206 fBondingWidth = 0.5000;
207 fWaferRadius = 6.7000;
208 fSiThickness = 0.0300;
217 fModuleSpacing = 1.0000;
218 fPrintboardThickness = 0.1000;
219 fSpacerHeight = 0.0300;
223 fHoneycombThickness = 1.0000;
224 fAlThickness = 0.1000;
225 fInnerHoneyLowR = 5.3000;
226 fInnerHoneyHighR = 18.2000;
227 fOuterHoneyLowR = 16.6000;
228 fOuterHoneyHighR = 29.0000;
230 fCopperThickness = 0.01;
231 fChipThickness = 0.01;
233 fHoneycombThickness = 1.00;
238 //____________________________________________________________________
244 // gGeoManager->DefaultColors();
245 gGeoManager->ViewLeaves(kFALSE);
246 TCanvas* c = new TCanvas;
248 gGeoManager->GetTopVolume()->Draw();
249 new TBrowser("b", "Browser");
252 //____________________________________________________________________
254 Geometry::Initialize()
260 Double_t pAir[] = { 0., mType, mMax, 1., .001, 1., .001, .001 };
261 TGeoMixture* fmdAir = new TGeoMixture("FMD air", 4, .00120479);
262 fmdAir->DefineElement(0, 12.0107, 6., 0.000124);
263 fmdAir->DefineElement(1, 14.0067, 7., 0.755267);
264 fmdAir->DefineElement(2, 15.9994, 8., 0.231781);
265 fmdAir->DefineElement(3, 39.948, 18., 0.012827);
266 fmdAir->SetTransparency('0');
267 fAir = new TGeoMedium("FMD Air", 1, fmdAir, pAir);
270 Double_t pSi[] = { 1., mType, mMax, 1., .001, 1., .001, .001 };
271 TGeoMaterial* fmdSi = new TGeoMaterial("FMD Si", 28.0855, 14, 2.33);
272 fmdSi->SetFillColor(2);
273 fSi = new TGeoMedium("FMD Si", 1, fmdSi, pSi);
276 Double_t pVacuum[] = { 0., mType, mMax, 10, .01, .1, .003, .003 };
277 TGeoMaterial* fmdVacuum = new TGeoMaterial("FMD Vacuum",1e-16,1e-16,1e-16);
278 fmdVacuum->SetTransparency('0');
279 fVacuum = new TGeoMedium("FMD Vacuum", 1, fmdVacuum,pVacuum);
283 Double_t pPCB[] = { 0., mType, mMax, 1., .001, 1., .001, .001 };
284 TGeoMixture* fmdPCB = new TGeoMixture("FMD PCB", 14, 1.8);
285 fmdPCB->DefineElement(0, 28.0855, 14, 0.15144894);
286 fmdPCB->DefineElement(1, 40.078, 20, 0.08147477);
287 fmdPCB->DefineElement(2, 26.981538, 13, 0.04128158);
288 fmdPCB->DefineElement(3, 24.305, 12, 0.00904554);
289 fmdPCB->DefineElement(4, 10.811, 5, 0.01397570);
290 fmdPCB->DefineElement(5, 47.867, 22, 0.00287685);
291 fmdPCB->DefineElement(6, 22.98977, 11, 0.00445114);
292 fmdPCB->DefineElement(7, 39.0983, 19, 0.00498089);
293 fmdPCB->DefineElement(8, 55.845, 26, 0.00209828);
294 fmdPCB->DefineElement(9, 18.9984, 9, 0.00420000);
295 fmdPCB->DefineElement(10, 15.9994, 8, 0.36043788);
296 fmdPCB->DefineElement(11, 12.0107, 6, 0.27529425);
297 fmdPCB->DefineElement(12, 14.0067, 7, 0.01415852);
298 fmdPCB->DefineElement(13, 1.00794, 1, 0.03427566);
299 fmdPCB->SetFillColor(7);
300 fPCB = new TGeoMedium("FMD PCB", 1, fmdPCB, pPCB);
303 Double_t pChip[] = { 0., mType, mMax, 10., .01, 1., .003, .003 };
304 TGeoMixture* fmdChip = new TGeoMixture("FMD Chip", 6, 2.36436);
305 fmdChip->DefineElement(0, 12.0107, 6, 0.039730642);
306 fmdChip->DefineElement(1, 14.0067, 7, 0.001396798);
307 fmdChip->DefineElement(2, 15.9994, 8, 0.01169634);
308 fmdChip->DefineElement(3, 1.00794, 1, 0.004367771);
309 fmdChip->DefineElement(4, 28.0855, 14, 0.844665);
310 fmdChip->DefineElement(5, 107.8682, 47, 0.0981434490);
311 fmdChip->SetFillColor(4);
312 fChip = new TGeoMedium("FMD Chip", 1, fmdChip, pChip);
315 Double_t pC[] = { 0., mType, mMax, 10., .01, 1., .003, .003 };
316 TGeoMaterial* fmdC = new TGeoMaterial("FMD C", 12.011, 6, 2.265);
317 fmdC->SetFillColor(6);
318 fCarbon = new TGeoMedium("FMD C", 1, fmdC, pC);
320 // Kapton (inside of Honeycombs)
321 Double_t pKapton[] = { 0., mType, mMax, 1., .001, 1., .001, .001 };
322 TGeoMaterial* fmdKapton = new TGeoMaterial("FMD Kapton", 12.011, 6.,0.01);
323 fmdKapton->SetFillColor(3);
324 fKapton = new TGeoMedium("FMD Kapton",1,fmdKapton,pKapton);
327 Double_t pPlastic[] = { 0., mType, mMax, 10., .01, 1., .003, .003 };
328 TGeoMixture* fmdPlastic = new TGeoMixture("FMD Plastic", 2, 1.03);
329 fmdPlastic->DefineElement(0, 1.01, 1, .5);
330 fmdPlastic->DefineElement(1, 12.01, 6, .5);
331 fmdPlastic->SetFillColor(4);
332 fPlastic = new TGeoMedium("FMD Plastic", 1, fmdPlastic, pPlastic);
335 Double_t pAl[] = { 0., mType, mMax, 10., .001, -1., .003, .003 };
336 TGeoMaterial* fmdAl = new TGeoMaterial("FMD Al", 26.981539, 13, 2.7);
337 fmdAl->SetFillColor(3);
338 fAl = new TGeoMedium("FMD Al", 1, fmdAl, pAl);
341 Double_t pCopper[] = { 0., mType, mMax, 10., .01, 1., .003, .003 };
342 TGeoMaterial* fmdCopper = new TGeoMaterial("FMD Copper", 63.546, 29.,8.96);
343 fmdCopper->SetFillColor(3);
344 fCopper = new TGeoMedium("FMD Copper", 1, fmdCopper, pCopper);
347 #define DEGRAD TMath::Pi()/180.
348 //____________________________________________________________________
350 Geometry::Detector2XYZ(UInt_t sector, UInt_t strip, TVector3& xyz)
352 UInt_t mod = sector / 2;
354 Warning("Detector2XYZ", "No matricies");
357 TGeoMatrix* m = static_cast<TGeoMatrix*>(fMatricies->At(mod));
359 Warning("Detector2XYZ", "No matrix found for module %d", mod);
362 Debug(10, "Detector2XYZ", "Transforming (%2d,%3d)", sector, strip);
363 Double_t rmax = fB.Mod();
364 Double_t stripoff = fA.Mod();
365 Double_t dstrip = (rmax - stripoff) / fNStrips;
366 Double_t r = (strip + .5) * dstrip + stripoff; // fLowR
367 Double_t theta = ((sector % 2) - .5) * fTheta;
368 Double_t modThick = (fSiThickness
369 + fPrintboardThickness
373 Debug(10,"Detector2XYZ", "Radius %7.3f, angle %7.3f (%f, %f)", r, theta,
376 r * TMath::Cos(theta * DEGRAD),
377 r * TMath::Sin(theta * DEGRAD),
378 -modThick + fSiThickness / 2
381 Debug(10, "Detector2XYZ", "Local (%7.3f,%7.3f,%7.3f)",
382 local[0], local[1], local[2]);
383 m->LocalToMaster(local, master);
384 Debug(10, "Detector2XYZ", "Master (%7.3f,%7.3f,%7.3f)",
385 master[0], master[1], master[2]);
386 xyz.SetXYZ(master[0], master[1], master[2]);
388 //____________________________________________________________________
390 Geometry::MakeDetailed(TGeoVolume* caveVolume)
392 Info("MakeSimple", "Using a detailed geometry");
393 Double_t xv[6] = { fA.X(), fC.X(), fB.X(), fB.X(), fC.X(), fA.X() };
394 Double_t yv[6] = { fA.Y(), fC.Y(), fB.Y(), -fB.Y(), -fC.Y(), -fA.Y() };
395 Double_t rmax = fB.Mod();
396 Double_t stripoff = fA.Mod();
397 Double_t dstrip = (rmax - stripoff) / fNStrips;
399 // Double_t hybridThick = (fPrintboardThickness + fCopperThickness
400 // + fChipThickness);
401 // Double_t modThick = fSiThickness + fSpacer + hybridThick;
402 // Double_t fmdWidth = (modThick + fHoneycombThickness + fModuleSpacing
403 // + fLegLength + fSpacer);
406 // TGeoTube* fmdShape = new TGeoTube(fLowR-.1,fHighR+.1,fmdWidth/2+.1);
407 // TGeoPcon* fmdShape = new TGeoPcon(0, 360, 2);
408 // fmdShape->DefineSection(0, -fmdWidth / 2 - .1, fLowR-.1, fHighR+.1);
409 // fmdShape->DefineSection(1, fmdWidth / 2 + .1, fLowR-.1, fHighR+.1);
410 // TGeoVolume* fmdVolume = new TGeoVolume("FMD1", fmdShape, fVacuum);
414 TGeoXtru* sensorShape = new TGeoXtru(2);
415 sensorShape->DefinePolygon(6, xv, yv);
416 sensorShape->DefineSection(0, - fSiThickness/2);
417 sensorShape->DefineSection(1, fSiThickness/2);
418 TGeoVolume* sensorVolume= new TGeoVolume("FISE",sensorShape,fSi);
419 sensorVolume->SetLineColor(2);
420 // sensorVolume->VisibleDaughters(kFALSE);
421 // sensorVolume->SetVisibility(kTRUE);
423 // Virtual volume shape to divide
424 TGeoTubeSeg* activeShape = new TGeoTubeSeg(fLowR, rmax, fSiThickness/2,
426 TGeoVolume* activeVolume = new TGeoVolume("FIAC", activeShape,fSi);
427 activeVolume->SetLineColor(3);
428 sensorVolume->AddNodeOverlap(activeVolume, 0);
429 // activeVolume->SetTransparency(0x3f);
430 TGeoVolume* sectorVolume = activeVolume->Divide("FISC",2,2,-fTheta,
432 TGeoVolume* stripVolume = sectorVolume->Divide("FIST",1,fNStrips,
433 stripoff,dstrip,0,"SX");
440 for (Int_t i = 0; i < 3; i++) yv[i] -= fBondingWidth;
441 for (Int_t i = 3; i < 6; i++) yv[i] += fBondingWidth;
442 Double_t off = (TMath::Tan(TMath::Pi() * fTheta / 180) * fBondingWidth);
445 TGeoXtru* pcbShape = new TGeoXtru(2);
446 pcbShape->DefinePolygon(6, xv, yv);
447 pcbShape->DefineSection(0, - fPrintboardThickness/2);
448 pcbShape->DefineSection(1, fPrintboardThickness/2);
449 TGeoVolume* pcbVolume = new TGeoVolume("FPCB",pcbShape,fPCB);
450 pcbVolume->SetLineColor(4);
453 TGeoXtru* cuShape = new TGeoXtru(2);
454 cuShape->DefinePolygon(6, xv, yv);
455 cuShape->DefineSection(0, - fCopperThickness/2);
456 cuShape->DefineSection(1, fCopperThickness/2);
457 TGeoVolume* cuVolume = new TGeoVolume("FCOP",cuShape,fCopper);
458 cuVolume->SetLineColor(4);
461 TGeoXtru* chipShape = new TGeoXtru(2);
462 chipShape->DefinePolygon(6, xv, yv);
463 chipShape->DefineSection(0, - fChipThickness/2);
464 chipShape->DefineSection(1, fChipThickness/2);
465 TGeoVolume* chipVolume = new TGeoVolume("FCHI",chipShape,fChip);
466 chipVolume->SetLineColor(4);
469 TGeoTube* shortLegShape = new TGeoTube(0, fLegRadius, fLegLength / 2);
470 TGeoVolume* shortLegVolume = new TGeoVolume("FISL", shortLegShape, fPlastic);
471 shortLegVolume->SetLineColor(2);
473 TGeoTube* longLegShape = new TGeoTube(0, fLegRadius,
474 (fLegLength + fModuleSpacing) / 2);
475 TGeoVolume* longLegVolume = new TGeoVolume("FILL", longLegShape, fPlastic);
476 longLegVolume->SetLineColor(2);
478 // Make a front volume
479 TGeoVolume* frontVolume = new TGeoVolumeAssembly("FIFV");
480 z = fPrintboardThickness / 2;
481 frontVolume->AddNode(pcbVolume, 0, new TGeoTranslation(0, 0, z));
482 z += (fPrintboardThickness + fCopperThickness) / 2;
483 frontVolume->AddNode(cuVolume, 0, new TGeoTranslation(0, 0, z));
484 z += (fCopperThickness + fChipThickness) / 2;
485 frontVolume->AddNode(chipVolume, 0, new TGeoTranslation(0, 0, z));
486 z += (fChipThickness + fModuleSpacing
488 x = fA.X() + fLegOffset + fLegRadius;
490 frontVolume->AddNode(longLegVolume, 0, new TGeoTranslation(x, y, z));
492 y = fC.Y() - fLegOffset - fLegRadius - off;
493 frontVolume->AddNode(longLegVolume, 1, new TGeoTranslation(x,y,z));
495 frontVolume->AddNode(longLegVolume, 2, new TGeoTranslation(x,y,z));
497 // Make a back volume
498 TGeoVolume* backVolume = new TGeoVolumeAssembly("FIBV");
499 z = fPrintboardThickness / 2;
500 backVolume->AddNode(pcbVolume, 0, new TGeoTranslation(0, 0, z));
501 z += (fPrintboardThickness + fCopperThickness) / 2;
502 backVolume->AddNode(cuVolume, 0, new TGeoTranslation(0, 0, z));
503 z += (fCopperThickness + fChipThickness) / 2;
504 backVolume->AddNode(chipVolume, 0, new TGeoTranslation(0, 0, z));
505 z += (fChipThickness + fLegLength) / 2;
506 x = fA.X() + fLegOffset + fLegRadius;
508 backVolume->AddNode(shortLegVolume, 0, new TGeoTranslation(x, y, z));
510 y = fC.Y() - fLegOffset - fLegRadius - off;
511 backVolume->AddNode(shortLegVolume, 1, new TGeoTranslation(x,y,z));
513 backVolume->AddNode(shortLegVolume, 2, new TGeoTranslation(x,y,z));
516 TGeoVolume* ringTopVolume = new TGeoVolumeAssembly("FITV");
517 TGeoVolume* ringBotVolume = new TGeoVolumeAssembly("FIBV");
520 Double_t dz = (fSiThickness + fSpacer + fModuleSpacing +
521 fPrintboardThickness + fCopperThickness +
522 fChipThickness + fLegLength);
523 TGeoTubeSeg* topRingShape = new TGeoTubeSeg(fA.X(), rmax, dz/2, 0, 180);
524 TGeoTubeSeg* botRingShape = new TGeoTubeSeg(fA.X(), rmax, dz/2, 180, 360);
525 TGeoVolume* ringTopVolume = new TGeoVolume("FITV", topRingShape, fAir);
526 TGeoVolume* ringBotVolume = new TGeoVolume("FIBV", botRingShape, fAir);
529 TGeoVolume* half = ringTopVolume;
531 for (Int_t i = 0; i < 10; i++) {
532 if (i > 4) half = ringBotVolume;
533 Bool_t front = ((i % 2) == 0);
534 z = -dz/2 + fSiThickness / 2 + (i % 2) * fModuleSpacing;
535 TGeoMatrix* m1 = new TGeoCombiTrans(0,0,z,0);
536 m1->RotateZ((2 * i + 1) * fTheta);
537 half->AddNode(sensorVolume, i, m1);
538 TGeoVolume* vol = (front ? frontVolume : backVolume);
539 z += fSpacer + fSiThickness / 2;
540 TGeoMatrix* m2 = new TGeoCombiTrans(0,0,z,0);
541 m2->RotateZ((2 * i + 1) * fTheta);
542 half->AddNode(vol, i, m2);
545 TGeoVolume* fmdTopVolume = new TGeoVolumeAssembly("FMT1");
546 TGeoVolume* fmdBotVolume = new TGeoVolumeAssembly("FMB1");
547 fmdTopVolume->AddNode(ringTopVolume, 0, new TGeoTranslation(0,0,dz/2));
548 fmdBotVolume->AddNode(ringBotVolume, 0, new TGeoTranslation(0,0,dz/2));
551 TGeoTubeSeg* hcShape = new TGeoTubeSeg(fLowR, fHighR,
552 fHoneycombThickness / 2,
554 TGeoVolume* hcVolume = new TGeoVolume("F1II", hcShape, fAl);
555 hcVolume->VisibleDaughters(kFALSE);
556 hcVolume->SetLineColor(5);
557 // Air in top of honeycomb
558 TGeoTubeSeg* ihcShape = new TGeoTubeSeg(fLowR + fAlThickness,
559 fHighR - fAlThickness,
563 TGeoVolume* ihcVolume = new TGeoVolume("F1IK", ihcShape, fKapton);
564 hcVolume->AddNode(ihcVolume, 0);
566 // Add honey comb to mothers.
567 z = (fSiThickness + fSpacer + fPrintboardThickness + fCopperThickness
568 + fChipThickness + fModuleSpacing + fLegLength + fHoneycombThickness/2);
569 fmdTopVolume->AddNode(hcVolume, 0, new TGeoTranslation(0,0,z));
570 TGeoMatrix* r = new TGeoCombiTrans(0,0,z, 0); r->RotateZ(180);
571 fmdBotVolume->AddNode(hcVolume, 1, r);
574 caveVolume->AddNode(fmdTopVolume, 1, new TGeoTranslation(0,0,z));
575 caveVolume->AddNode(fmdBotVolume, 1, new TGeoTranslation(0,0,z));
578 //____________________________________________________________________
582 // Framework::Task::Register(option);
583 TGeoShape* caveShape = new TGeoBBox(fHighR+10, fHighR+10, fHighR+10);
584 TGeoVolume* caveVolume = new TGeoVolume("Cave", caveShape, fVacuum);
585 gGeoManager->SetTopVolume(caveVolume);
587 if (!gGeoManager->GetVolume("FM1T")) MakeDetailed(caveVolume);
588 gGeoManager->CloseGeometry();
591 //____________________________________________________________________
595 if (!gGeoManager) return;
596 if (!gGeoManager->GetTopVolume()) return;
597 if (!gGeoManager->IsClosed()) return;
599 if (!fMatricies) fMatricies = new TObjArray;
600 TGeoIterator next(gGeoManager->GetTopVolume());
603 while ((node = static_cast<TGeoNode*>(next()))) {
605 if (node->GetName()[0] == 'F' && node->GetName()[2] == 'S' &&
606 node->GetName()[3] == 'E') {
607 // We go an FMD module
609 path.Append(gGeoManager->GetNode(0)->GetName());
610 Int_t nlevel = next.GetLevel();
611 Debug(10, "Exec", "Level is %d", nlevel);
612 for (int lvl = 0; lvl <= nlevel; lvl++) {
613 TGeoNode* p = next.GetNode(lvl);
615 Debug(10, "Exec", "Adding '%s' to path '%s'",
616 p->GetName(), path.Data());
617 if (!path.IsNull()) path.Append("/");
618 path.Append(p->GetName());
620 TGeoPhysicalNode* pnode = gGeoManager->MakePhysicalNode(path.Data());
621 TGeoHMatrix* matrix = new TGeoHMatrix(*node->GetMatrix());
623 Double_t angles[] = { gRandom->Uniform(0, 3),
624 gRandom->Uniform(0, 3),
625 gRandom->Uniform(0, 3) };
626 pertub.RotateX(angles[0]);
627 pertub.RotateY(angles[1]);
628 pertub.RotateZ(angles[1]);
630 Debug(5, "Exec", "Aliging %s (%f,%f,%f)",
631 pnode->GetName(), angles[0], angles[1], angles[2]);
632 pnode->Align(matrix);
637 //____________________________________________________________________