Adds a custom block of OuterWall+InnerWall+LiSc+Support ribs for a given distance along z. Ensures consistency in implementation throughout the z.
372 {
373 TString blockName = "block";
374 blockName += blockNr;
375
376 int ribColor = 15;
377
378 double wz = (z2 - z1);
379 double slX = (
wx(z2) -
wx(z1)) / 2 / wz;
380 double slY = (
wy(z2) -
wy(z1)) / 2 / wz;
381
382 double dZ = (cell_thickness_z - ribThick) / 2;
383
384 double tX = 0;
385 double tY = 0;
386 double tZ = 0;
388
390 TString nameInnerWall = (TString)tInnerWall->GetName() + "_" + blockName;
391 TGeoVolume* TIW =
394 tInnerWall->AddNode(TIW, 0, new TGeoTranslation(0, 0, Zshift));
395
397 TString nameDecayVacuum = (TString)tDecayVacuum->GetName() + "_" + blockName;
400 TDV->SetVisibility(kFALSE);
401 tDecayVacuum->AddNode(TDV, 0, new TGeoTranslation(0, 0, Zshift));
402
404 TString nameOuterWall = (TString)tOuterWall->GetName() + "_" + blockName;
406 nameOuterWall, wallThick, wz,
wx(z1) + 2 * (wallThick + liscThick1),
407 wx(z2) + 2 * (wallThick + liscThick2),
408 wy(z1) + 2 * (wallThick + liscThick1),
410 tOuterWall->AddNode(TOW, 0, new TGeoTranslation(0, 0, Zshift));
411
413
414 std::vector<TGeoVolume*> vLongitRibX(nx);
415 std::vector<TGeoVolume*> vLongitRibY(ny);
416
417 double z1_x_thickness_1 =
wx(z1 + ribThick) + 2 * (wallThick + liscThick1);
418 double z1_x_thickness_2 =
419 wx(z1 + cell_thickness_z) + 2 * (wallThick + liscThick1);
420
421 double z1_x1_Step = (z1_x_thickness_1 -
nx * ribThick) / (nx + 1);
422 double z1_x2_Step = (z1_x_thickness_2 -
nx * ribThick) / (nx + 1);
423
424 double z1_y_thickness_1 =
wy(z1 + ribThick) + 2 * (wallThick + liscThick1);
425 double z1_y_thickness_2 =
426 wy(z1 + cell_thickness_z) + 2 * (wallThick + liscThick1);
427
428 double z1_y1_Step = (z1_y_thickness_1 -
ny * ribThick) / (ny + 1);
429 double z1_y2_Step = (z1_y_thickness_2 -
ny * ribThick) / (ny + 1);
430
431 double z1_x1, z1_x2, z1_y1, z1_y2;
432
433 z1_x1 = z1_x_thickness_1 / 2;
434 z1_x2 = z1_x_thickness_2 / 2;
435
436 z1_y1 = z1_y_thickness_1 / 2 - liscThick1;
437 z1_y2 = z1_y_thickness_2 / 2 - liscThick2;
438
439 for (
int i = 0;
i <
nx;
i++) {
440 z1_x1 = z1_x1 - z1_x1_Step;
441 z1_x2 = z1_x2 - z1_x2_Step;
442
444 name.Form(
"vLongitRibX_%s_phi%d", blockName.Data(),
446 vLongitRibX.at(i) =
447 GeoSideObj(name, dZ, ribThick, liscThick1, ribThick, liscThick2,
449
450 z1_x1 = z1_x1 - ribThick;
451 z1_x2 = z1_x2 - ribThick;
452 }
453
454 z1_y1 = z1_y_thickness_1 / 2;
455 z1_y2 = z1_y_thickness_2 / 2;
456
457 z1_x1 = z1_x_thickness_1 / 2 - liscThick1;
458 z1_x2 = z1_x_thickness_2 / 2 - liscThick2;
459
460 for (
int i = 0;
i <
ny;
i++) {
461 z1_y1 = z1_y1 - z1_y1_Step;
462 z1_y2 = z1_y2 - z1_y2_Step;
463
465 name.Form(
"vLongitRibY_%s_phi%d", blockName.Data(),
467 vLongitRibY.at(i) =
468 GeoSideObj(name, dZ, liscThick1, ribThick, liscThick2, ribThick,
470 z1_y1 = z1_y1 - ribThick;
471 z1_y2 = z1_y2 - ribThick;
472 }
473
475
476 name =
"CornerRib_L_" + blockName +
"_id";
477 TGeoVolumeAssembly* CornerRib_L =
478 GeoCornerRib(name, ribThick, liscThick1, liscThick2, dZ, slX, slY,
480 name =
"CornerRib_R_" + blockName +
"_id";
481 TGeoVolumeAssembly* CornerRib_R =
482 GeoCornerRib(name, ribThick, liscThick1, liscThick2, dZ, slY, slX,
484
485 for (double zi = z1; zi < z2; zi += cell_thickness_z) {
486 int Zlayer = static_cast<int>(zi) / cell_thickness_z + 1;
487
489 TString nameVR("");
490 nameVR.Form("VetoVerticalRib_z%d", static_cast<int>(zi));
492 nameVR, liscThick1, ribThick,
wx(zi) + 2 * wallThick,
493 wx(zi + ribThick) + 2 * wallThick,
wy(zi) + 2 * wallThick,
495 tZ = Zshift - wz / 2 + zi - z1 + ribThick / 2;
496
497 tVerticalRib->AddNode(TVR, 0, new TGeoTranslation(0, 0, tZ));
498
499 if (z2 - zi < cell_thickness_z) continue;
500
501 tX =
wx(zi + ribThick) / 2 + wallThick;
502 tY =
wy(zi + ribThick) / 2 + wallThick;
503 tZ = tZ + cell_thickness_z / 2;
504
506 tLongitRib->AddNode(
507 CornerRib_L,
makeId(zi, tX, tY),
508 new TGeoCombiTrans(tX, tY, tZ, new TGeoRotation("r", 0, 0, 0)));
509 tLongitRib->AddNode(
510 CornerRib_L,
makeId(zi, -tX, -tY),
511 new TGeoCombiTrans(-tX, -tY, tZ, new TGeoRotation("r", 0, 0, 180)));
512 tLongitRib->AddNode(
513 CornerRib_R,
makeId(zi, -tX, tY),
514 new TGeoCombiTrans(-tX, tY, tZ, new TGeoRotation("r", 0, 0, 90)));
515 tLongitRib->AddNode(
516 CornerRib_R,
makeId(zi, tX, -tY),
517 new TGeoCombiTrans(tX, -tY, tZ, new TGeoRotation("r", 0, 0, 270)));
518
519 double zi_x_thickness_1 =
wx(zi + ribThick) + 2 * (wallThick + liscThick1);
520 double zi_x_thickness_2 =
521 wx(zi + cell_thickness_z) + 2 * (wallThick + liscThick1);
522
523 double zi_x1_Step = (zi_x_thickness_1 -
nx * ribThick) / (nx + 1);
524 double zi_x2_Step = (zi_x_thickness_2 -
nx * ribThick) / (nx + 1);
525
526 double zi_y_thickness_1 =
wy(zi + ribThick) + 2 * (wallThick + liscThick1);
527 double zi_y_thickness_2 =
528 wy(zi + cell_thickness_z) + 2 * (wallThick + liscThick1);
529
530 double zi_y1_Step = (zi_y_thickness_1 -
ny * ribThick) / (ny + 1);
531 double zi_y2_Step = (zi_y_thickness_2 -
ny * ribThick) / (ny + 1);
532
533 double zi_x1, zi_x2, zi_y1, zi_y2;
534
535 zi_x1 = zi_x_thickness_1 / 2 - liscThick1;
536 zi_x2 = zi_x_thickness_2 / 2 - liscThick1;
537
538 zi_y1 = zi_y_thickness_1 / 2;
539 zi_y2 = zi_y_thickness_2 / 2;
540
542 name.Form(
"LiSc_S4_%d",
liscId(
"LiSc_S4", blockNr, Zlayer, 0, 0));
544 name, dZ, 0, zi_y1_Step - liscThick1, zi_y2_Step - liscThick2,
545 liscThick1, liscThick2, zi_y2_Step - zi_y1_Step, zi_x2 - zi_x1,
547 ttLiSc->AddNode(LiSc_S4,
liscId(
"LiSc_S4", blockNr, Zlayer, 0, 1),
548 new TGeoCombiTrans(zi_x1, -(zi_y1 - zi_y1_Step), tZ,
549 new TGeoRotation("r", 0, 0, 0)));
550 ttLiSc->AddNode(LiSc_S4,
liscId(
"LiSc_S4", blockNr, Zlayer, 0, 2),
551 new TGeoCombiTrans(-zi_x1, (zi_y1 - zi_y1_Step), tZ,
552 new TGeoRotation("r", 0, 0, 180)));
553
555 name.Form(
"LiSc_S6_%d",
liscId(
"LiSc_S6", blockNr, Zlayer, ny, 0));
557 name, dZ, 1, zi_y1_Step - liscThick1, zi_y2_Step - liscThick2,
558 liscThick1, liscThick2, zi_y2_Step - zi_y1_Step, zi_x2 - zi_x1,
560 ttLiSc->AddNode(LiSc_S6,
liscId(
"LiSc_S6", blockNr, Zlayer, ny, 1),
561 new TGeoCombiTrans(zi_x1, (zi_y1 - zi_y1_Step), tZ,
562 new TGeoRotation("r", 0, 0, 0)));
563 ttLiSc->AddNode(LiSc_S6,
liscId(
"LiSc_S6", blockNr, Zlayer, ny, 2),
564 new TGeoCombiTrans(-zi_x1, -(zi_y1 - zi_y1_Step), tZ,
565 new TGeoRotation("r", 0, 0, 180)));
566
567 for (
int i = 0;
i <
ny;
i++) {
568 zi_y1 = zi_y1 - zi_y1_Step;
569 zi_y2 = zi_y2 - zi_y2_Step;
570
571 tLongitRib->AddNode(vLongitRibY.at(i),
makeId(zi, zi_x1, zi_y1),
572 new TGeoCombiTrans(zi_x1, (zi_y1 - ribThick), tZ,
573 new TGeoRotation("r", 0, 0, 0)));
574 tLongitRib->AddNode(vLongitRibY.at(i),
makeId(zi, -zi_x1, -zi_y1),
575 new TGeoCombiTrans(-zi_x1, -(zi_y1 - ribThick), tZ,
576 new TGeoRotation("r", 0, 0, 180)));
577
578 if (i > 0) {
580 name.Form(
"LiScY_%d",
liscId(
"LiScY", blockNr, Zlayer, i, 0));
582 name, dZ, liscThick1, zi_y1_Step, liscThick2, zi_y2_Step,
583 zi_x2 - zi_x1, zi_y2 - zi_y1, kMagenta - 10,
vetoMed,
true);
584 ttLiSc->AddNode(LiScY,
liscId(
"LiScY", blockNr, Zlayer, i, 1),
585 new TGeoCombiTrans(zi_x1, zi_y1, tZ,
586 new TGeoRotation("r", 0, 0, 0)));
587 ttLiSc->AddNode(LiScY,
liscId(
"LiScY", blockNr, Zlayer, i, 2),
588 new TGeoCombiTrans(-zi_x1, -zi_y1, tZ,
589 new TGeoRotation("r", 0, 0, 180)));
590 }
591
592 zi_y1 = zi_y1 - ribThick;
593 zi_y2 = zi_y2 - ribThick;
594 }
595
596 zi_x1 = zi_x_thickness_1 / 2;
597 zi_x2 = zi_x_thickness_2 / 2;
598
599 zi_y1 = zi_y_thickness_1 / 2 - liscThick1;
600 zi_y2 = zi_y_thickness_2 / 2 - liscThick1;
601
603 name.Form(
"LiSc_S3_%d",
liscId(
"LiSc_S3", blockNr, Zlayer, 0, 0));
604
606 name, dZ, 0, zi_x1_Step - liscThick1 - ribThick / sqrt(2),
607 zi_x2_Step - liscThick2 - ribThick / sqrt(2), liscThick1, liscThick2,
608 zi_x2_Step - zi_x1_Step - ribThick / 2, zi_y2 - zi_y1, kMagenta - 10,
610 ttLiSc->AddNode(LiSc_S3,
liscId(
"LiSc_S3", blockNr, Zlayer, 0, 1),
611 new TGeoCombiTrans(-(zi_x1 - zi_x1_Step), zi_y1, tZ,
612 new TGeoRotation("r", 0, 0, 0)));
613 ttLiSc->AddNode(LiSc_S3,
liscId(
"LiSc_S3", blockNr, Zlayer, 0, 2),
614 new TGeoCombiTrans((zi_x1 - zi_x1_Step), -zi_y1, tZ,
615 new TGeoRotation("r", 0, 0, 180)));
616
618 name.Form(
"LiSc_S5_%d",
liscId(
"LiSc_S5", blockNr, Zlayer, nx, 0));
619
621 name, dZ, 1, zi_x1_Step - liscThick1 - ribThick / sqrt(2),
622 zi_x2_Step - liscThick2 - ribThick / sqrt(2), liscThick1, liscThick2,
623 zi_x2_Step - zi_x1_Step - ribThick / 2, zi_y2 - zi_y1, kMagenta - 10,
625 ttLiSc->AddNode(LiSc_S5,
liscId(
"LiSc_S5", blockNr, Zlayer, nx, 1),
626 new TGeoCombiTrans((zi_x1 - zi_x1_Step), zi_y1, tZ,
627 new TGeoRotation("r", 0, 0, 0)));
628 ttLiSc->AddNode(LiSc_S5,
liscId(
"LiSc_S5", blockNr, Zlayer, nx, 2),
629 new TGeoCombiTrans(-(zi_x1 - zi_x1_Step), -zi_y1, tZ,
630 new TGeoRotation("r", 0, 0, 180)));
631
632 for (
int i = 0;
i <
nx;
i++) {
633 zi_x1 = zi_x1 - zi_x1_Step;
634 zi_x2 = zi_x2 - zi_x2_Step;
635
636 tLongitRib->AddNode(vLongitRibX.at(i),
makeId(zi, zi_x1, zi_y1),
637 new TGeoCombiTrans((zi_x1 - ribThick), zi_y1, tZ,
638 new TGeoRotation("r", 0, 0, 0)));
639 tLongitRib->AddNode(vLongitRibX.at(i),
makeId(zi, -zi_x1, -zi_y1),
640 new TGeoCombiTrans(-(zi_x1 - ribThick), -zi_y1, tZ,
641 new TGeoRotation("r", 0, 0, 180)));
642
643 if (i > 0) {
645 name.Form(
"LiScX_%d",
liscId(
"LiScX", blockNr, Zlayer, i, 0));
647 name, dZ, zi_x1_Step, liscThick1, zi_x2_Step, liscThick2,
648 zi_x2 - zi_x1, zi_y2 - zi_y1, kMagenta - 10,
vetoMed,
true);
649 ttLiSc->AddNode(LiScX,
liscId(
"LiScX", blockNr, Zlayer, i, 1),
650 new TGeoCombiTrans(zi_x1, zi_y1, tZ,
651 new TGeoRotation("r", 0, 0, 0)));
652 ttLiSc->AddNode(LiScX,
liscId(
"LiScX", blockNr, Zlayer, i, 2),
653 new TGeoCombiTrans(-zi_x1, -zi_y1, tZ,
654 new TGeoRotation("r", 0, 0, 180)));
655 }
656
657 zi_x1 = zi_x1 - ribThick;
658 zi_x2 = zi_x2 - ribThick;
659 }
660 }
661}
TGeoVolume * GeoTrapezoidHollow(TString xname, Double_t thick, Double_t wz, Double_t wX_start, Double_t wX_end, Double_t wY_start, Double_t wY_end, Int_t color, TGeoMedium *material, Bool_t sens)
int liscId(TString ShapeTypeName, int blockNr, int Zlayer, int number, int position)
int makeId(double z, double x, double y)
TGeoMedium * decayVolumeMed
TGeoVolume * GeoCornerLiSc2(TString xname, double dz, bool isClockwise, double a1, double a2, double b1, double b2, double dA, double dB, Int_t color, TGeoMedium *material, Bool_t sens)
double wy(double z)
slope along the length (y)
TGeoVolume * GeoSideObj(TString xname, double dz, double a1, double b1, double a2, double b2, double dA, double dB, Int_t color, TGeoMedium *material, Bool_t sens)
TGeoVolumeAssembly * GeoCornerRib(TString xname, double ribThick, double lt1, double lt2, double dz, double slopeX, double slopeY, Int_t color, TGeoMedium *material, Bool_t sens)
TGeoVolume * GeoCornerLiSc1(TString xname, double dz, bool isClockwise, double a1, double a2, double b1, double b2, double dA, double dB, Int_t color, TGeoMedium *material, Bool_t sens)
TGeoMedium * supportMedIn
TGeoVolume * GeoTrapezoid(TString xname, Double_t wz, Double_t wX_start, Double_t wX_end, Double_t wY_start, Double_t wY_end, Int_t color, TGeoMedium *material, Bool_t sens)
double wx(double z)
slope along the width (x)