11 #include "GeoModelKernel/GeoPcon.h"
12 #include "GeoModelKernel/GeoTubs.h"
13 #include "GeoModelKernel/GeoTube.h"
14 #include "GeoModelKernel/GeoTrd.h"
15 #include "GeoModelKernel/GeoTrap.h"
16 #include "GeoModelKernel/GeoBox.h"
17 #include "GeoModelKernel/GeoMaterial.h"
18 #include "GeoModelKernel/GeoLogVol.h"
19 #include "GeoModelKernel/GeoPhysVol.h"
20 #include "GeoModelKernel/GeoNameTag.h"
21 #include "GeoModelKernel/GeoTransform.h"
22 #include "GeoModelKernel/GeoSerialIdentifier.h"
23 #include "GeoModelKernel/GeoIdentifierTag.h"
24 #include "GeoModelKernel/GeoDefinitions.h"
25 #include "GeoModelKernel/Units.h"
27 #include "GeoModelKernel/GeoShapeUnion.h"
28 #include "GeoModelKernel/GeoShapeShift.h"
29 #include "GeoModelKernel/GeoShapeSubtraction.h"
30 #include "GeoModelKernel/GeoCutVolAction.h"
32 #include "GeoGenericFunctions/AbsFunction.h"
33 #include "GeoGenericFunctions/Variable.h"
34 #include "GeoModelKernel/GeoXF.h"
35 #include "GeoModelKernel/GeoSerialTransformer.h"
38 #include "GaudiKernel/MsgStream.h"
39 #include "GaudiKernel/SystemOfUnits.h"
45 #define MLOG(x) if (m_log->level()<=MSG::x) *m_log << MSG::x
48 using namespace GeoXF;
55 : m_theMaterialManager(matManager)
56 , m_dbManager(pDbManager)
58 , m_switches(switches)
59 , m_barrelPeriodThickness(0.)
61 , m_extendedPeriodThickness(0.)
64 , m_matIronHalfDens(0)
65 , m_additionalIronLayer(0.027)
83 (*m_log) <<
MSG::DEBUG <<
" TileGeoSectionBuilder::fillSection ModuleNcp= "<<ModuleNcp<<
endmsg;
93 const GeoMaterial* matAluminium{
nullptr};
98 double dX1 =0., dX2 =0., dY1 =0., dY2 =0., dZ1 =0., dZ2 =0.;
99 std::string volname =
"";
102 float PosXcut =0., PosYcut =0., PosY =0., Rmore =0.;
103 float Radius =0., YcorA =0., YcorB =0., lenPla =0., Blia =0.;
110 if (ModuleNcp>=35 && ModuleNcp<=37) SideFl = -1;
116 GeoIntrusivePtr<const GeoShapeUnion> CutA{
nullptr};
117 GeoIntrusivePtr<GeoShape> CutB{
nullptr};
120 if (sec_number==2 &&
m_dbManager->
BoolCuts() && ((ModuleNcp>=35 && ModuleNcp<=37) || (ModuleNcp>=60 && ModuleNcp<=62))) {
133 checking(
"CutB1",
false, 1, dX1,dX2,dY1,dY2,dZ1);
134 GeoTrd* CutB1 =
new GeoTrd(dX1,dX2,dY1,dY2,dZ1);
148 checking(
"Cut1up",
false, 1, dX1,dX2,dY1,dY2,dZ1);
149 GeoTrd* Cut1up =
new GeoTrd(dX1,dX2,dY1,dY2,dZ1);
158 checking(
"Cut2down",
false, 1, dX1,dX2,dY1,dY2,dZ2);
159 GeoTrd* Cut1down =
new GeoTrd(dX1,dX2,dY1,dY2,dZ2);
161 GeoTrf::Translate3D yPosA(0.,0.,-dZ1-dZ2);
163 const GeoShapeUnion& CutA1 = Cut1up->add(*Cut1down<<yPosA);
172 TransCut2 = GeoTrf::TranslateZ3D(-Radius)
180 TransCut2 = GeoTrf::TranslateX3D(2*ptTmp.x())*GeoTrf::RotateZ3D(180*
Gaudi::Units::deg)*TransCut2;
183 if (ModuleNcp>=60 && ModuleNcp<=62) {
184 TransCutL = GeoTrf::TranslateZ3D(-Radius)
191 TransCutL = GeoTrf::TranslateX3D(2*ptTmp.x())*GeoTrf::RotateZ3D(180*
Gaudi::Units::deg)*TransCutL;
194 }
else if (ModuleNcp>=35 && ModuleNcp<=37) {
195 TransCutR = GeoTrf::TranslateZ3D(-Radius)
202 TransCutR = GeoTrf::TranslateX3D(2*ptTmp.x())*GeoTrf::RotateZ3D(180*
Gaudi::Units::deg)*TransCutR;
213 double thicknessGirderMother = 0.0;
214 double specialModuleZShift = 0.0;
220 if ((Id4 == 7) && (sec_number == 3))
230 if ((Id4 == 7) && (sec_number == 3)) {
235 thicknessGirderMother/2,thicknessGirderMother/2,dy1GirderMother,dy2GirderMother,heightGirderMother/2);
237 GeoTrd* girderMother =
new GeoTrd(thicknessGirderMother/2,
238 thicknessGirderMother/2,
241 heightGirderMother/2);
243 GeoLogVol* lvGirderMother =
new GeoLogVol(
"GirderMother",girderMother,matAir);
244 PVLink pvGirderMother =
new GeoPhysVol(lvGirderMother);
252 GeoTransform* tfGirderMother{
nullptr};
261 mother->add(tfGirderMother);
262 mother->add(pvGirderMother);
270 double thicknessFrontPlate, heightFrontPlate, dy1FrontPlate, dy2FrontPlate;
279 if (thicknessFrontPlate > rless) {
285 (*
m_log) <<
MSG::DEBUG <<
" FrontPlateSh dX1,dX2= "<<thicknessFrontPlate/2<<
", "<<thicknessFrontPlate/2
286 <<
" dY1,dY2= "<<dy1FrontPlate<<
" "<<dy2FrontPlate<<
" dZ= "<<heightFrontPlate/2
289 GeoTrd* frontPlateSh =
new GeoTrd(thicknessFrontPlate/2,
290 thicknessFrontPlate/2,
295 GeoLogVol* lvFrontPlateSh =
new GeoLogVol(
"FrontPlateSh",frontPlateSh,matIron);
296 PVLink pvFrontPlateSh =
new GeoPhysVol(lvFrontPlateSh);
297 GeoTransform* tfFrontPlateSh =
new GeoTransform(GeoTrf::Translate3D(
301 mother->add(tfFrontPlateSh);
302 mother->add(pvFrontPlateSh);
310 ((ModuleNcp>=35 && ModuleNcp<=37)||(ModuleNcp>=60 && ModuleNcp<=62)) )) {
312 std::string volname =
"";
313 double dXCutA = 0, dXCutB = 0;
326 GeoTrd* frontPlate =
new GeoTrd(thicknessFrontPlate/2 -(dXCutA+dXCutB),
327 thicknessFrontPlate/2 -(dXCutA+dXCutB),
342 GeoLogVol* lvFrontPlate =
new GeoLogVol(
"FrontPlate",frontPlate,matIron);
343 PVLink pvFrontPlate =
new GeoPhysVol(lvFrontPlate);
344 GeoTransform* tfFrontPlate =
new GeoTransform(GeoTrf::Translate3D(
348 mother->add(tfFrontPlate);
349 mother->add(pvFrontPlate);
361 GeoTrd* frontPlate =
new GeoTrd(thicknessFrontPlate/2,
362 thicknessFrontPlate/2,
367 GeoLogVol* lvFrontPlate =
new GeoLogVol(
"FrontPlate",frontPlate,matIron);
368 PVLink pvFrontPlate =
new GeoPhysVol(lvFrontPlate);
369 GeoTransform* tfFrontPlate =
new GeoTransform(GeoTrf::Translate3D(
373 mother->add(tfFrontPlate);
374 mother->add(pvFrontPlate);
379 double dy1EndPlate, dy2EndPlate, thicknessEndPlate, heightEndPlate;
388 GeoIntrusivePtr<GeoTransform> tfEndPlateSh{
nullptr};
402 GeoTrd* endPlateSh =
new GeoTrd(thicknessEndPlate/2,
407 GeoLogVol* lvEndPlateSh{
nullptr};
410 if (sec_number==2 && ((ModuleNcp>=35 && ModuleNcp<=37)||(ModuleNcp>=60 && ModuleNcp<=62)) ) {
415 GeoTrd* endPlateShCut =
new GeoTrd(thicknessEndPlate,
422 double rotationAngle ;
423 double shiftCutPlate ;
424 int rotationSign = 1;
425 if (ModuleNcp > 50) rotationSign *= -1;
426 if ( neg ) rotationSign *= -1;
429 if ( ( ModuleNcp == 37 ) || ( ModuleNcp == 60 ) ) {
433 cutOutTransformation =
434 GeoTrf::Translate3D(0,0, -heightEndPlate/2.) *
436 GeoTrf::Translate3D(0.,0., -rotationSign * (dy2EndPlate + shiftCutPlate ) ) *
437 GeoTrf::RotateX3D( rotationSign * rotationAngle ) ;
439 const GeoShape & endPlateShCutted3760 = (endPlateSh->subtract( (*endPlateShCut)<< cutOutTransformation ) ) ;
440 lvEndPlateSh =
new GeoLogVol(
"EndPlateSh", &(endPlateShCutted3760) , matIron);
442 }
else if ( ( ModuleNcp == 36 ) || ( ModuleNcp == 61 ) ) {
446 cutOutTransformation =
447 GeoTrf::Translate3D( 0, 0, -heightEndPlate/2. ) *
448 GeoTrf::Translate3D( 0, 0, - (dy2EndPlate - shiftCutPlate + 0.5*dy2EndPlate*(1.-
std::cos(rotationAngle*
Gaudi::Units::rad))) ) *
449 GeoTrf::RotateX3D( rotationSign * rotationAngle ) ;
451 const GeoShape & endPlateShCutted3661 = (endPlateSh->subtract( (*endPlateShCut)<< cutOutTransformation ) ) ;
452 lvEndPlateSh =
new GeoLogVol(
"EndPlateSh", &(endPlateShCutted3661) , matIron);
454 }
else if ( ( ModuleNcp == 35 ) || ( ModuleNcp == 62 ) ) {
458 cutOutTransformation =
459 GeoTrf::Translate3D( 0, 0, -heightEndPlate/2. ) *
460 GeoTrf::Translate3D( 0, 0, - (dy2EndPlate - shiftCutPlate) ) *
461 GeoTrf::RotateX3D( rotationSign * rotationAngle ) ;
463 const GeoShape & endPlateShCutted3562 = (endPlateSh->subtract( (*endPlateShCut)<< cutOutTransformation ) ) ;
464 lvEndPlateSh =
new GeoLogVol(
"EndPlateSh", &(endPlateShCutted3562) , matIron);
467 (*m_log) << MSG::ERROR <<
" TileGeoSectionBuilder::fillSection . Wrong Module in cut-out region. ModuleNcp= "<<ModuleNcp<<
endmsg;
468 lvEndPlateSh =
new GeoLogVol(
"EndPlateSh", endPlateSh , matIron);
472 lvEndPlateSh =
new GeoLogVol(
"EndPlateSh", endPlateSh , matIron);
481 PVLink pvEndPlateSh =
new GeoPhysVol(lvEndPlateSh);
483 tfEndPlateSh =
new GeoTransform(GeoTrf::Translate3D(
484 specialModuleZShift +
488 mother->add(tfEndPlateSh);
489 mother->add(pvEndPlateSh);
492 (*m_log) <<
MSG::DEBUG <<
" _fillSection: ext.barrel EndPlateSh Ok "<<
endmsg;
501 GeoTrd* endPlate1 =
new GeoTrd(thicknessEndPlate/2,
507 GeoLogVol* lvEndPlate1 =
new GeoLogVol(
"EndPlate1",endPlate1,matIron);
508 PVLink pvEndPlate1 =
new GeoPhysVol(lvEndPlate1);
512 GeoTrd* epHole1 =
new GeoTrd (thicknessEndPlate/2,
518 GeoLogVol* lvEPHole1 =
new GeoLogVol(
"EPHole1",epHole1,matAir);
519 PVLink pvEPHole1 =
new GeoPhysVol(lvEPHole1);
520 GeoTransform* tfEPHole1 =
new GeoTransform(GeoTrf::Translate3D(0.,0.,
522 pvEndPlate1->add(tfEPHole1);
523 pvEndPlate1->add(pvEPHole1);
526 GeoTransform* tfEndPlate1 =
new GeoTransform(GeoTrf::Translate3D(
528 mother->add(tfEndPlate1);
529 mother->add(pvEndPlate1);
537 GeoIntrusivePtr<GeoTransform> tfEndPlate2{
nullptr};
541 double radShift =lenPla;
542 double rminbT=rminb + radShift;
550 GeoLogVol* lvEndPlate2{
nullptr};
551 GeoTrd* endPlate2 =
new GeoTrd(thicknessEndPlate/2,
557 tfEndPlate2 =
new GeoTransform(GeoTrf::Translate3D(
560 if (sec_number==2 && ((ModuleNcp>=35 && ModuleNcp<=37)||(ModuleNcp>=60 && ModuleNcp<=62)) ) {
562 GeoTrd* endPlate2Cut =
new GeoTrd(thicknessEndPlate,
567 double rotationAngle ;
568 double shiftCutPlate ;
569 int rotationSign = 1;
570 if (ModuleNcp > 50) rotationSign *= -1;
571 if ( neg ) rotationSign *= -1;
573 if ( ( ModuleNcp == 37 ) || ( ModuleNcp == 60 ) ) {
577 cutOutTransformation =
578 GeoTrf::Translate3D( 0, 0, -heightEndPlate/2. ) *
579 GeoTrf::Translate3D( 0, 0, - (dy2EndPlate - shiftCutPlate) ) *
580 GeoTrf::RotateX3D( rotationSign * rotationAngle ) ;
582 const GeoShape & endPlate2Cutted3760 = (endPlate2->subtract( (*endPlate2Cut)<< cutOutTransformation ) ) ;
583 lvEndPlate2 =
new GeoLogVol(
"EndPlate2", &(endPlate2Cutted3760) , matIron);
585 }
else if ( ( ModuleNcp == 36 ) || ( ModuleNcp == 61 ) ) {
589 cutOutTransformation =
590 GeoTrf::Translate3D( 0, 0, -heightEndPlate/2. ) *
591 GeoTrf::Translate3D( 0, 0, - (dy2EndPlate - shiftCutPlate) ) *
592 GeoTrf::RotateX3D( rotationSign * rotationAngle ) ;
594 const GeoShape & endPlate2Cutted3661 = (endPlate2->subtract( (*endPlate2Cut)<< cutOutTransformation ) ) ;
595 lvEndPlate2 =
new GeoLogVol(
"EndPlate2", &(endPlate2Cutted3661) , matIron);
597 }
else if ( ( ModuleNcp == 35 ) || ( ModuleNcp == 62 ) ) {
601 cutOutTransformation =
602 GeoTrf::Translate3D( 0, 0, -heightEndPlate/2. ) *
603 GeoTrf::Translate3D( 0, 0, - (dy2EndPlate - shiftCutPlate) ) *
604 GeoTrf::RotateX3D( rotationSign * rotationAngle ) ;
606 const GeoShape & endPlate2Cutted3562 = (endPlate2->subtract( (*endPlate2Cut)<< cutOutTransformation ) ) ;
607 lvEndPlate2 =
new GeoLogVol(
"EndPlate2", &(endPlate2Cutted3562) , matIron);
619 lvEndPlate2 =
new GeoLogVol(
"EndPlate2",endPlate2,matIron);
622 PVLink pvEndPlate2 =
new GeoPhysVol(lvEndPlate2);
628 GeoTrd* epHole2 =
new GeoTrd (thicknessEndPlate/2,
634 GeoLogVol* lvEPHole2 =
new GeoLogVol(
"EPHole2",epHole2,matAir);
635 PVLink pvEPHole2 =
new GeoPhysVol(lvEPHole2);
636 GeoTransform* tfEPHole2 =
new GeoTransform(GeoTrf::Translate3D(0.,0.,
638 pvEndPlate2->add(tfEPHole2);
639 pvEndPlate2->add(pvEPHole2);
642 mother->add(tfEndPlate2);
643 mother->add(pvEndPlate2);
657 thicknessAbsorber/2,thicknessAbsorber/2,dy1Absorber,dy2Absorber,heightAbsorber/2);
660 double thicknessPeriod =0, thicknessAbsorber1 =0, thicknessAbsorber2 =0, thicknessAbsorber3 =0;
661 double PosAbsor1 =0, PosAbsor2 =0, PosAbsor3 =0;
662 int nA1 =32, nA2 = 0, nA3 =16;
664 GeoTrd *absorber{
nullptr}, *absorber1{
nullptr}, *absorber3{
nullptr};
665 GeoLogVol *lvAbsorber{
nullptr}, *lvAbsorber1{
nullptr}, *lvAbsorber3{
nullptr};
666 PVLink pvAbsorber{
nullptr}, pvAbsorber1{
nullptr}, pvAbsorber3{
nullptr},
667 pvTmp_Absorber1{
nullptr}, pvTmp_Absorber3{
nullptr};
670 switch (sec_number) {
679 thicknessAbsorber1 = nA1*thicknessPeriod;
680 PosAbsor1 = thicknessAbsorber/2 - thicknessAbsorber1/2;
682 thicknessAbsorber2 = nA2*thicknessPeriod;
683 PosAbsor2 = thicknessAbsorber/2 - thicknessAbsorber1 - thicknessAbsorber2/2;
685 thicknessAbsorber3 = nA3*thicknessPeriod;
686 PosAbsor3 = thicknessAbsorber/2 - thicknessAbsorber1 - thicknessAbsorber2 - thicknessAbsorber3/2;
689 (*
m_log) <<
MSG::DEBUG <<
" Number of periods per Module: N= "<<nA1+nA2+nA3
690 <<
" Middle absorber, numbers of periods = "<<nA2
694 absorber1 =
new GeoTrd(thicknessAbsorber1/2, thicknessAbsorber1/2,
695 dy1Absorber, dy2Absorber,
698 lvAbsorber1 =
new GeoLogVol(
"Absorber",absorber1,matIron);
699 pvAbsorber1 =
new GeoPhysVol(lvAbsorber1);
702 absorber =
new GeoTrd(thicknessAbsorber2/2, thicknessAbsorber2/2,
703 dy1Absorber, dy2Absorber,
706 lvAbsorber =
new GeoLogVol(
"Absorber",absorber,matIron);
707 pvAbsorber =
new GeoPhysVol(lvAbsorber);
711 absorber3 =
new GeoTrd(thicknessAbsorber3/2, thicknessAbsorber3/2,
712 dy1Absorber, dy2Absorber,
715 lvAbsorber3 =
new GeoLogVol(
"Absorber",absorber3,matIron);
716 pvAbsorber3 =
new GeoPhysVol(lvAbsorber3);
720 (*m_log) <<
MSG::DEBUG <<
" _fillSection: Ex.Barrel pvAbsorber 1,3 Ok "<<
endmsg;
726 absorber =
new GeoTrd(thicknessAbsorber/2, thicknessAbsorber/2,
727 dy1Absorber, dy2Absorber,
731 lvAbsorber =
new GeoLogVol(
"Absorber",absorber,matIron);
734 lvAbsorber =
new GeoLogVol(
"Absorber",absorber,matAir);
736 pvAbsorber =
new GeoPhysVol(lvAbsorber);
742 (*m_log) <<
MSG::DEBUG <<
" _fillSection: special pvAbsorber made from Air Ok "<<
endmsg;
750 double thicknessAbsorberChild;
754 GeoLogVol* lvPeriod{
nullptr};
755 PVLink pvPeriod{
nullptr};
756 GeoTransform* tfPeriod{
nullptr};
757 GeoSerialTransformer* stPeriod{
nullptr};
759 GeoTrd* absorberChild{
nullptr};
760 GeoLogVol* lvAbsorberChild{
nullptr};
761 PVLink pvAbsorberChild{
nullptr};
762 GeoTransform* tfAbsorberChild{
nullptr};
765 switch (sec_number) {
775 <<
", dzglue: " << dzglue <<
" ==> thicknessPeriod: " << thicknessPeriod <<
endmsg;
781 thicknessPeriod/2,thicknessPeriod/2,dy1Absorber,dy2Absorber,heightAbsorber/2);
783 period =
new GeoTrd(thicknessPeriod/2,
789 lvPeriod =
new GeoLogVol(
"Period",
period,matIron);
790 pvPeriod =
new GeoPhysVol(lvPeriod);
800 absorberChild =
new GeoTrd(thicknessAbsorberChild/2,
801 thicknessAbsorberChild/2,
805 lvAbsorberChild =
new GeoLogVol(
"AbsorberChild",absorberChild,matAir);
806 pvAbsorberChild =
new GeoPhysVol(lvAbsorberChild);
809 GENFUNCTION periodPos1 = (thicknessPeriod*(2*periodInd+1)-thicknessAbsorberChild)/2;
810 TRANSFUNCTION xfReplica1 = Pow(GeoTrf::TranslateX3D(1.),periodPos1);
812 (thicknessAbsorberChild - thicknessAbsorber)/2);
814 stPeriod =
new GeoSerialTransformer(pvPeriod,
818 pvAbsorberChild->add(
new GeoSerialIdentifier(0));
819 pvAbsorberChild->add(stPeriod);
822 tfAbsorberChild =
new GeoTransform(GeoTrf::Translate3D((thicknessAbsorberChild - thicknessAbsorber)/2,0.,0.));
823 pvAbsorber->add(tfAbsorberChild);
824 pvAbsorber->add(pvAbsorberChild);
830 thicknessPeriod/2,thicknessPeriod/2,dy1Absorber,dy2Absorber,heightAbsorber/2);
832 period =
new GeoTrd(thicknessPeriod/2,
837 lvPeriod =
new GeoLogVol(
"Period",
period,matIron);
838 pvPeriod =
new GeoPhysVol(lvPeriod);
847 thicknessAbsorberChild = thicknessPeriod;
848 absorberChild =
new GeoTrd(thicknessAbsorberChild/2,
849 thicknessAbsorberChild/2,
853 lvAbsorberChild =
new GeoLogVol(
"AbsorberChild",absorberChild,matAir);
854 pvAbsorberChild =
new GeoPhysVol(lvAbsorberChild);
857 (-thicknessAbsorberChild + thicknessAbsorber)/2);
860 tfPeriod =
new GeoTransform(GeoTrf::Translate3D(0.,0.,0.));
863 pvAbsorberChild->add(tfPeriod);
864 pvAbsorberChild->add(pvPeriod);
867 tfAbsorberChild =
new GeoTransform(GeoTrf::Translate3D((-thicknessAbsorberChild + thicknessAbsorber)/2,0.,0.));
868 pvAbsorber->add(tfAbsorberChild);
869 pvAbsorber->add(pvAbsorberChild);
878 <<
", dzglue: " << dzglue <<
" ==> thicknessPeriod: " << thicknessPeriod <<
endmsg;
881 thicknessPeriod/2,thicknessPeriod/2,dy1Absorber,dy2Absorber,heightAbsorber/2);
883 period =
new GeoTrd(thicknessPeriod/2,
888 lvPeriod =
new GeoLogVol(
"Period",
period,matIron);
889 pvPeriod =
new GeoPhysVol(lvPeriod);
902 GENFUNCTION periodPos1 = (thicknessPeriod*(2*periodInd+1)-thicknessAbsorber1)/2;
903 TRANSFUNCTION xfReplica1 = Pow(GeoTrf::TranslateX3D(1.),periodPos1);
905 (-thicknessAbsorber+thicknessAbsorber1)/2.);
907 stPeriod =
new GeoSerialTransformer(pvPeriod,&xfReplica1,nA1);
909 pvAbsorber1->add(
new GeoSerialIdentifier(0));
910 pvAbsorber1->add(stPeriod);
914 if ((ModuleNcp>=35 && ModuleNcp<=37) || (ModuleNcp>=60 && ModuleNcp<=62)) {
916 GeoCutVolAction action1(*CutA, TransCut2);
917 pvAbsorber1->apply(&action1);
918 pvTmp_Absorber1 = action1.getPV();
928 GENFUNCTION periodPos2 = (thicknessPeriod*(2*periodInd+1)-thicknessAbsorber2)/2;
929 TRANSFUNCTION xfReplica2 = Pow(GeoTrf::TranslateX3D(1.),periodPos2);
931 (-thicknessAbsorber+thicknessAbsorber2)/2.+thicknessAbsorber1);
933 stPeriod =
new GeoSerialTransformer(pvPeriod,&xfReplica2,nA2);
935 pvAbsorber->add(
new GeoSerialIdentifier(nA1));
936 pvAbsorber->add(stPeriod);
943 GENFUNCTION periodPos3 = (thicknessPeriod*(2*periodInd+1)-thicknessAbsorber3)/2;
944 TRANSFUNCTION xfReplica3 = Pow(GeoTrf::TranslateX3D(1.),periodPos3);
946 (-thicknessAbsorber+thicknessAbsorber3)/2.+thicknessAbsorber2+thicknessAbsorber1);
948 stPeriod =
new GeoSerialTransformer(pvPeriod,&xfReplica3,nA3);
950 pvAbsorber3->add(
new GeoSerialIdentifier(nA1+nA2));
951 pvAbsorber3->add(stPeriod);
954 if (ModuleNcp>=60 && ModuleNcp<=62) {
957 GeoCutVolAction action2(*CutB, TransCutL);
958 pvAbsorber3->apply(&action2);
959 pvTmp_Absorber3 = action2.getPV();
963 }
else if (ModuleNcp>=35 && ModuleNcp<=37) {
966 GeoCutVolAction action3(*CutB, TransCutR);
967 pvAbsorber3->apply(&action3);
968 pvTmp_Absorber3 = action3.getPV();
990 <<
", dzglue: " << dzglue <<
" ==> thicknessPeriod: " << thicknessPeriod <<
endmsg;
992 checking(
"Period 3 (ITC1 special)",
true, 4,
993 thicknessPeriod/2,thicknessPeriod/2,dy1Absorber,dy2Absorber,heightAbsorber/2);
995 period =
new GeoTrd(thicknessPeriod/2,
1000 lvPeriod =
new GeoLogVol(
"Period",
period,matIron);
1001 pvPeriod =
new GeoPhysVol(lvPeriod);
1011 absorberChild =
new GeoTrd(thicknessAbsorberChild/2,
1012 thicknessAbsorberChild/2,
1016 lvAbsorberChild =
new GeoLogVol(
"AbsorberChild",absorberChild,matAir);
1017 pvAbsorberChild =
new GeoPhysVol(lvAbsorberChild);
1020 GENFUNCTION periodPosITC1sp = (thicknessPeriod*(2*periodInd+1)-thicknessAbsorberChild)/2;
1021 TRANSFUNCTION xfReplicaITC1sp = Pow(GeoTrf::TranslateX3D(1.),periodPosITC1sp);
1023 (thicknessAbsorberChild - thicknessAbsorber)/2);
1025 stPeriod =
new GeoSerialTransformer(pvPeriod,
1029 pvAbsorberChild->add(
new GeoSerialIdentifier(0));
1030 pvAbsorberChild->add(stPeriod);
1033 tfAbsorberChild =
new GeoTransform(GeoTrf::Translate3D((thicknessAbsorberChild - thicknessAbsorber)/2,0.,0.));
1034 pvAbsorber->add(tfAbsorberChild);
1035 pvAbsorber->add(pvAbsorberChild);
1041 checking(
"Period 5 (ITC1 special)",
true, 4,
1042 thicknessPeriod/2,thicknessPeriod/2,dy1Absorber,dy2Absorber,heightAbsorber/2);
1044 period =
new GeoTrd(thicknessPeriod/2,
1049 lvPeriod =
new GeoLogVol(
"Period",
period,matIron);
1050 pvPeriod =
new GeoPhysVol(lvPeriod);
1058 thicknessAbsorberChild = thicknessPeriod;
1059 absorberChild =
new GeoTrd(thicknessAbsorberChild/2,
1060 thicknessAbsorberChild/2,
1064 lvAbsorberChild =
new GeoLogVol(
"AbsorberChild",absorberChild,matAir);
1065 pvAbsorberChild =
new GeoPhysVol(lvAbsorberChild);
1068 (-thicknessAbsorberChild + thicknessAbsorber)/2);
1071 tfPeriod =
new GeoTransform(GeoTrf::Translate3D(0.,0.,0.));
1073 pvAbsorberChild->add(tfPeriod);
1074 pvAbsorberChild->add(pvPeriod);
1077 tfAbsorberChild =
new GeoTransform(GeoTrf::Translate3D((-thicknessAbsorberChild + thicknessAbsorber)/2,0.,0.));
1078 pvAbsorber->add(tfAbsorberChild);
1079 pvAbsorber->add(pvAbsorberChild);
1082 (*m_log) <<
MSG::DEBUG <<
" _fillSection: Absorber (ITC plug special) Ok "<<
endmsg;
1088 thicknessPeriod/2,thicknessPeriod/2,dy1Absorber,dy2Absorber,heightAbsorber/2);
1090 period =
new GeoTrd(thicknessPeriod/2,
1095 lvPeriod =
new GeoLogVol(
"Period",
period,matIron);
1096 pvPeriod =
new GeoPhysVol(lvPeriod);
1105 GENFUNCTION periodPos3 = (thicknessPeriod*(2*periodInd+1)-thicknessAbsorber)/2;
1106 TRANSFUNCTION xfReplica3 = Pow(GeoTrf::TranslateX3D(1.),periodPos3);
1117 stPeriod =
new GeoSerialTransformer(pvPeriod,
1121 pvAbsorber->add(
new GeoSerialIdentifier(0));
1122 pvAbsorber->add(stPeriod);
1137 <<
", dzglue: " << dzglue <<
" ==> thicknessPeriod: " << thicknessPeriod <<
endmsg;
1140 thicknessPeriod/2,thicknessPeriod/2,dy1Absorber,dy2Absorber,heightAbsorber/2);
1142 period =
new GeoTrd(thicknessPeriod/2,
1147 lvPeriod =
new GeoLogVol(
"Period",
period,matIron);
1148 pvPeriod =
new GeoPhysVol(lvPeriod);
1158 absorberChild =
new GeoTrd(thicknessAbsorberChild/2,
1159 thicknessAbsorberChild/2,
1163 lvAbsorberChild =
new GeoLogVol(
"AbsorberChild",absorberChild,matAir);
1164 pvAbsorberChild =
new GeoPhysVol(lvAbsorberChild);
1167 GENFUNCTION periodPos1 = (thicknessPeriod*(2*periodInd+1)-thicknessAbsorberChild)/2;
1168 TRANSFUNCTION xfReplica1 = Pow(GeoTrf::TranslateX3D(1.),periodPos1);
1170 (thicknessAbsorberChild - thicknessAbsorber)/2);
1172 stPeriod =
new GeoSerialTransformer(pvPeriod,
1176 pvAbsorberChild->add(
new GeoSerialIdentifier(0));
1177 pvAbsorberChild->add(stPeriod);
1180 tfAbsorberChild =
new GeoTransform(GeoTrf::Translate3D((thicknessAbsorberChild - thicknessAbsorber)/2,0.,0.));
1181 pvAbsorber->add(tfAbsorberChild);
1182 pvAbsorber->add(pvAbsorberChild);
1188 thicknessPeriod/2,thicknessPeriod/2,dy1Absorber,dy2Absorber,heightAbsorber/2);
1190 period =
new GeoTrd(thicknessPeriod/2,
1195 lvPeriod =
new GeoLogVol(
"Period",
period,matIron);
1196 pvPeriod =
new GeoPhysVol(lvPeriod);
1204 thicknessAbsorberChild = thicknessPeriod;
1205 absorberChild =
new GeoTrd(thicknessAbsorberChild/2,
1206 thicknessAbsorberChild/2,
1210 lvAbsorberChild =
new GeoLogVol(
"AbsorberChild",absorberChild,matAir);
1211 pvAbsorberChild =
new GeoPhysVol(lvAbsorberChild);
1214 (-thicknessAbsorberChild + thicknessAbsorber)/2);
1217 tfPeriod =
new GeoTransform(GeoTrf::Translate3D(0.,0.,0.));
1219 pvAbsorberChild->add(tfPeriod);
1220 pvAbsorberChild->add(pvPeriod);
1223 tfAbsorberChild =
new GeoTransform(GeoTrf::Translate3D((-thicknessAbsorberChild + thicknessAbsorber)/2,0.,0.));
1224 pvAbsorber->add(tfAbsorberChild);
1225 pvAbsorber->add(pvAbsorberChild);
1242 (*m_log) << MSG::ERROR <<
"TileGeoSectionBuilder::fillSection: Unexpected section = "
1247 thicknessPeriod = thicknessAbsorber;
1248 MLOG(
DEBUG) <<
"DEFAULT Section -- thicknessAbsorber: " << thicknessAbsorber <<
" ==> thicknessPeriod: " << thicknessPeriod <<
endmsg;
1251 thicknessPeriod/2,thicknessPeriod/2,dy1Absorber,dy2Absorber,heightAbsorber/2);
1255 if (dy1Period <= 0.0 || dy2Period <= 0.0 || dy1Period > dy1Absorber || dy2Period > dy2Absorber || dy1Period >= dy2Period ) {
1256 dy1Period = dy1Absorber;
1257 dy2Period = dy2Absorber;
1260 period =
new GeoTrd(thicknessPeriod/2,
1266 lvPeriod =
new GeoLogVol(
"Period",
period,matAluminium);
1267 pvPeriod =
new GeoPhysVol(lvPeriod);
1278 tfPeriod =
new GeoTransform(GeoTrf::Translate3D(0.,0.,0.));
1279 pvAbsorber->add(
new GeoIdentifierTag(0));
1280 pvAbsorber->add(tfPeriod);
1281 pvAbsorber->add(pvPeriod);
1284 (*m_log) <<
MSG::DEBUG <<
" _fillSection: Absorber (case default) Ok "<<
endmsg;
1290 GeoTransform *tfAbsorber{
nullptr}, *tfAbsorber1{
nullptr}, *tfAbsorber3{
nullptr};
1295 if (sec_number==3) {
1298 mother->add(tfAbsorber);
1299 mother->add(pvAbsorber);
1301 }
else if (sec_number==2) {
1305 tfAbsorber1 =
new GeoTransform(GeoTrf::Translate3D(dXAbsorber*
Gaudi::Units::cm/2 - PosAbsor1, 0.,
1307 mother->add(tfAbsorber1);
1308 if (
m_dbManager->
BoolCuts() && ((ModuleNcp>=35 && ModuleNcp<=37) || (ModuleNcp>=60 && ModuleNcp<=62)) ) {
1309 mother->add(pvTmp_Absorber1);
1311 mother->add(pvAbsorber1);
1315 (*m_log) <<
MSG::DEBUG <<
" _fillsection ext.barrel pvAbsorber1 Ok"<<
endmsg;
1317 tfAbsorber =
new GeoTransform(GeoTrf::Translate3D(dXAbsorber*
Gaudi::Units::cm/2 - PosAbsor2, 0.,
1319 mother->add(tfAbsorber);
1320 mother->add(pvAbsorber);
1323 (*m_log) <<
MSG::DEBUG <<
" _fillsection ext.barrel pvAbsorber Ok"<<
endmsg;
1325 tfAbsorber3 =
new GeoTransform(GeoTrf::Translate3D(dXAbsorber*
Gaudi::Units::cm/2 - PosAbsor3, 0.,
1327 mother->add(tfAbsorber3);
1328 if (
m_dbManager->
BoolCuts() && ((ModuleNcp>=35 && ModuleNcp<=37) || (ModuleNcp>=60 && ModuleNcp<=62)) ) {
1329 mother->add(pvTmp_Absorber3);
1331 mother->add(pvAbsorber3);
1335 (*m_log) <<
MSG::DEBUG <<
" _fillsection ext.barrel pvAbsorber3 Ok"<<
endmsg;
1338 tfAbsorber =
new GeoTransform(GeoTrf::Translate3D(dXAbsorber*
Gaudi::Units::cm/2, 0.,
1340 mother->add(tfAbsorber);
1341 mother->add(pvAbsorber);
1353 double tan_delta_phi_2,
1366 GeoTrd* girderElement{
nullptr};
1367 GeoLogVol* lvGirderElement{
nullptr};
1368 PVLink pvGirderElement{
nullptr};
1369 GeoTransform* tfGirderElement{
nullptr};
1371 int CurrentGird = 1;
1385 double dy1GirderElement, dy2GirderElement;
1386 if (elementSizeInY >0) {
1387 dy1GirderElement = elementSizeInY/2;
1388 dy2GirderElement = elementSizeInY/2;
1390 dy1GirderElement = (elementRC - elementSizeInR/2) * tan_delta_phi_2;
1391 dy2GirderElement = (elementRC + elementSizeInR/2) * tan_delta_phi_2;
1403 lvGirderElement =
new GeoLogVol(
"GirderIron",girderElement,matIron);
1408 lvGirderElement =
new GeoLogVol(
"GirderAluminium",girderElement,matAluminium);
1413 lvGirderElement =
new GeoLogVol(
"GirderElectronics",girderElement,matElBoard);
1418 (*m_log) << MSG::ERROR <<
"TileGeoSectionBuilder::FillGirder: unknown material = "
1424 pvGirderElement =
new GeoPhysVol(lvGirderElement);
1425 tfGirderElement =
new GeoTransform(GeoTrf::Translate3D(0.,
1428 mother->add(tfGirderElement);
1429 mother->add(pvGirderElement);
1441 double corrected_dz)
1443 bool boolNeg =
false;
1445 if (ModuleNcp > 99) {
1446 ModuleNcp = ModuleNcp/100;
1492 GeoTrd* fingerElementTrd{
nullptr};
1493 GeoTrap* fingerElementTrap{
nullptr};
1495 GeoBox *fingerCablesL{
nullptr}, *fingerCablesR{
nullptr};
1496 PVLink pvFingerElement{
nullptr}, pvFingerCablesL{
nullptr}, pvFingerCablesR{
nullptr};
1497 GeoLogVol *lvFingerElement{
nullptr}, *lvFingerCablesL{
nullptr}, *lvFingerCablesR{
nullptr};
1498 GeoTransform* tfFingerElement{
nullptr}, *tfFingerCables{
nullptr};
1500 GeoTransform* ZrotateMod{
nullptr};
1501 GeoTransform* yrotateMod{
nullptr};
1502 GeoTransform* zrotateMod{
nullptr};
1504 const GeoMaterial *currentMaterial{
nullptr}, *leftMaterial{
nullptr}, *rightMaterial{
nullptr};
1505 std::string currentName, leftName, rightName;
1507 int CurrentTicg = 100*sec_number + 1;
1509 double AirVolumeShift = 0.0;
1510 double AirVolumeSize = corrected_dz;
1522 if (corrected_dz > 0.) {
1523 if (j-CurrentTicg==0) {
1524 AirVolumeShift = (elementDz-corrected_dz)/2 - elementZPozition;
1525 AirVolumeSize = elementDz;
1527 (*m_log) <<
MSG::DEBUG <<
"TileFinger: OldAirVolumeCenter ="<<elementZPozition <<
endmsg;
1528 (*m_log) <<
MSG::DEBUG <<
"TileFinger: NewAirVolumeCenter ="<<elementZPozition+AirVolumeShift <<
endmsg;
1529 (*m_log) <<
MSG::DEBUG <<
"TileFinger: AirVolumeShift ="<< AirVolumeShift <<
endmsg;
1530 (*m_log) <<
MSG::DEBUG <<
"TileFinger: AirVolumeSize ="<< AirVolumeSize <<
endmsg;
1534 if (elementZPozition*2-AirVolumeSize<-0.01) {
1535 elementZPozition += AirVolumeShift;
1540 elementDz = corrected_dz - AirVolumeSize;
1542 (*m_log) <<
MSG::DEBUG <<
"TileFinger: NewCoverThickness ="<<elementDz <<
endmsg;
1543 (*m_log) <<
MSG::DEBUG <<
"TileFinger: OldCoverCenter ="<<elementZPozition <<
endmsg;
1545 elementZPozition = (corrected_dz-elementDz)/2;
1554 currentMaterial = matIron;
1555 currentName =
"FingerIron";
1560 currentMaterial = matAluminium;
1561 currentName =
"FingerAluminum";
1566 currentMaterial = matElBoard;
1567 currentName =
"FingerElectronics";
1572 (*m_log) << MSG::ERROR <<
"TileGeoSectionBuilder::fillFinger: unexpected material = "
1584 lvFingerElement =
new GeoLogVol(currentName,fingerElementTrd,currentMaterial);
1594 std::atan((elementDy1-elementDy2)/(2.*elementHeight)),
1598 std::atan((elementDy1-elementDy2)/(2.*elementHeight)));
1600 lvFingerElement =
new GeoLogVol(currentName,fingerElementTrap,currentMaterial);
1603 (*m_log) << MSG::ERROR <<
"TileGeoSectionBuilder::fillFinger: unexpected shape = "
1609 pvFingerElement =
new GeoPhysVol(lvFingerElement);
1610 tfFingerElement =
new GeoTransform(GeoTrf::Translate3D(elementZPozition*
Gaudi::Units::cm,
1614 mother->add(tfFingerElement);
1616 if (elementOffset<0) {
1618 mother->add(ZrotateMod);
1623 mother->add(yrotateMod);
1624 mother->add(zrotateMod);
1627 mother->add(
new GeoIdentifierTag(ModuleNcp));
1628 mother->add(pvFingerElement);
1631 if (testbeam)
return;
1635 int Isector =0, LRflag =0;
1637 if ((ModuleNcp/4 - (
float)ModuleNcp/4) != 0) {
1638 Isector = (
int)ModuleNcp/4;
1640 Isector = (
int)ModuleNcp/4-1;
1642 LRflag = ModuleNcp-4*Isector;
1651 double dXleft =35., dXright = 35.;
1652 double dZleft = elementDz/2, dZright = dZleft;
1653 double dZsaddleL = elementDz/4, dZsaddleR = dZsaddleL;
1657 rightName = leftName =
"LArCables";
1660 dZright = elementDz, dXright = 35;
1663 rightName =
"LArService";
1665 }
else if (LRflag == 4) {
1666 dZleft = elementDz, dXleft = 35;
1669 leftName =
"LArService";
1672 if (sec_number == 1) {
1673 if ( (ModuleNcp >=40 && ModuleNcp <=41) || (ModuleNcp >=56 && ModuleNcp <=57) ) {
1674 dZright = dZleft = 8.5;
1675 dZsaddleL = dZsaddleR = 13.7;
1676 rightMaterial = leftMaterial = iron;
1677 rightName = leftName =
"BarrelSaddleSupport";
1681 if ( (ModuleNcp >=39 && ModuleNcp <=42) || (ModuleNcp >=55 && ModuleNcp <=58) ) {
1682 dZright = dZleft = 8.5;
1683 dZsaddleR = dZsaddleL = 13.7;
1684 rightMaterial = leftMaterial = iron;
1685 rightName = leftName =
"ExtBarrelSaddleSupport";
1690 (*
m_log) <<
MSG::DEBUG <<
" Finger : number= "<<sec_number<<
" ModuleNcp = " <<ModuleNcp<<
" Sector= "<< Isector
1691 <<
" LRflag= " << LRflag <<
" Neg "<< boolNeg
1694 GeoTransform *rotateY =
new GeoTransform(GeoTrf::RotateY3D(90*
Gaudi::Units::deg));
1695 GeoTransform *rotateZ =
new GeoTransform(GeoTrf::RotateZ3D(3*
Gaudi::Units::deg));
1696 GeoTransform *rotateZm =
new GeoTransform(GeoTrf::RotateZ3D(-3*
Gaudi::Units::deg));
1700 lvFingerCablesL =
new GeoLogVol(leftName,fingerCablesL,leftMaterial);
1701 pvFingerCablesL =
new GeoPhysVol(lvFingerCablesL);
1705 lvFingerCablesR =
new GeoLogVol(rightName,fingerCablesR,rightMaterial);
1706 pvFingerCablesR =
new GeoPhysVol(lvFingerCablesR);
1708 double YpoFinger =0;
1711 YpoFinger = -elementOffset+5.4;
1713 YpoFinger = elementOffset-5.4;
1719 mother->add(tfFingerCables);
1723 mother->add(rotateY);
1724 mother->add(rotateZm);
1726 mother->add(rotateY);
1727 mother->add(rotateZ);
1730 mother->add(
new GeoIdentifierTag(ModuleNcp));
1731 mother->add(pvFingerCablesL);
1734 YpoFinger = elementOffset-5.4;
1736 YpoFinger = -elementOffset+5.4;
1742 mother->add(tfFingerCables);
1746 mother->add(rotateY);
1747 mother->add(rotateZ);
1749 mother->add(rotateY);
1750 mother->add(rotateZm);
1753 mother->add(
new GeoIdentifierTag(ModuleNcp));
1754 mother->add(pvFingerCablesR);
1761 double tan_delta_phi_2,
1766 int CurrentScin = 0;
1767 const GeoShape* glue{
nullptr};
1768 GeoLogVol* lvGlue{
nullptr};
1769 PVLink pvGlue{
nullptr};
1770 GeoTransform* tfGlue{
nullptr};
1772 double scintiWrapInZ, scintiWrapInR, scintiThickness, scintiDeltaInPhi;
1773 double scintiHeight, scintiRC, scintiZPos, dy1Scintillator, dy2Scintillator;
1774 const GeoShape* scintillator{
nullptr};
1775 GeoLogVol* lvScintillator{
nullptr};
1776 PVLink pvScintillator{
nullptr};
1777 GeoTransform* tfScintillator{
nullptr};
1779 double thicknessWrapper, heightWrapper, dy1Wrapper, dy2Wrapper;
1780 const GeoShape* wrapper{
nullptr};
1781 GeoLogVol* lvWrapper{
nullptr};
1782 PVLink pvWrapper{
nullptr};
1783 GeoTransform* tfWrapper{
nullptr};
1785 GeoIdentifierTag* idTag{
nullptr};
1805 CurrentScin = 100*2 + 1;
1824 const GeoMaterial* matScin =
nullptr;
1831 if (matScin !=
nullptr) {
1852 if (dzglue>0.0 && period_type<4 && !removeGlue) {
1856 dzglue2 = floor(dzglue2*1.0
e+10)*1.0e-10;
1869 dzglue2,dzglue2,dy1Glue,dy2Glue,heightGlue2);
1871 glue =
new GeoTrd(dzglue2,dzglue2,dy1Glue,dy2Glue,heightGlue2);
1876 idTag =
new GeoIdentifierTag(j-CurrentScin);
1886 GeoShape *air1 =
new GeoTubs(csTubeOuterR, csHoleR, thicknessMother2, 0.,360.0 *
Gaudi::Units::deg);
1887 GeoShape *air2 =
new GeoTubs(csTubeOuterR, csHoleR, thicknessMother2, 0.,360.0 *
Gaudi::Units::deg);
1888 GeoShape *air3 =
new GeoTubs(0., csTubeInnerR, thicknessMother2, 0.,360.0 *
Gaudi::Units::deg);
1890 GeoLogVol * lvAir1 =
new GeoLogVol(
"CsTubeAir1",air1,matAir);
1891 GeoLogVol * lvAir2 =
new GeoLogVol(
"CsTubeAir2",air2,matAir);
1892 GeoLogVol * lvAir3 =
new GeoLogVol(
"CsTubeAir3",air3,matAir);
1893 GeoPhysVol * pvAir1 =
new GeoPhysVol(lvAir1);
1894 GeoPhysVol * pvAir2 =
new GeoPhysVol(lvAir2);
1895 GeoPhysVol * pvAir3 =
new GeoPhysVol(lvAir3);
1897 GeoTransform* tftube1 =
new GeoTransform(tfHole1);
1898 GeoTransform* tftube2 =
new GeoTransform(tfHole2);
1899 GeoTransform* tftube3 =
new GeoTransform(tfHole2);
1901 mother->add(tftube1);
1902 mother->add(pvAir1);
1903 mother->add(tftube2);
1904 mother->add(pvAir2);
1905 mother->add(tftube3);
1906 mother->add(pvAir3);
1910 glue =
makeHoles(glue, csHoleR, dzglue2, off, off0);
1914 lvGlue =
new GeoLogVol(
"Glue",glue,matGlue);
1915 pvGlue =
new GeoPhysVol(lvGlue);
1918 switch(period_type) {
1928 mother->add(tfGlue);
1929 mother->add(pvGlue);
1933 tfGlue =
new GeoTransform(GeoTrf::Translate3D(-dzglue/2*
Gaudi::Units::cm,0.,0.));
1934 mother->add(tfGlue);
1935 mother->add(pvGlue);
1940 mother->add(tfGlue);
1941 mother->add(pvGlue);
1945 tfGlue =
new GeoTransform(GeoTrf::Translate3D((thickness-dzglue)/2*
Gaudi::Units::cm,0.,0.));
1946 mother->add(tfGlue);
1947 mother->add(pvGlue);
1951 idTag =
new GeoIdentifierTag(j-CurrentScin);
1974 thicknessWrapper/2,thicknessWrapper/2,dy1Wrapper,dy2Wrapper,heightWrapper/2);
1976 wrapper =
new GeoTrd(thicknessWrapper/2,
1985 lvWrapper =
new GeoLogVol(
"Wrapper",wrapper,matAir);
1986 pvWrapper =
new GeoPhysVol(lvWrapper);
1994 checking(
"Scintillator 0",
true, 6,
2006 lvScintillator =
new GeoLogVol(
"Scintillator",scintillator,matScin);
2007 pvScintillator =
new GeoPhysVol(lvScintillator);
2010 tfScintillator =
new GeoTransform(GeoTrf::Translate3D(0.,0.,0.));
2011 pvWrapper->add(idTag);
2012 pvWrapper->add(tfScintillator);
2013 pvWrapper->add(pvScintillator);
2017 (*m_log) <<
MSG::VERBOSE <<
" X scintiZPos= "<<scintiZPos;
2026 mother->add(tfWrapper);
2027 mother->add(pvWrapper);
2040 mother->add(tfGlue);
2041 mother->add(pvGlue);
2046 mother->add(tfGlue);
2047 mother->add(pvGlue);
2051 idTag =
new GeoIdentifierTag(j-CurrentScin);
2074 thicknessWrapper/2,thicknessWrapper/2,dy1Wrapper,dy2Wrapper,heightWrapper/2);
2076 wrapper =
new GeoTrd(thicknessWrapper/2,
2085 lvWrapper =
new GeoLogVol(
"Wrapper",wrapper,matAir);
2086 pvWrapper =
new GeoPhysVol(lvWrapper);
2094 checking(
"Scintillator 1",
true, 6,
2106 lvScintillator =
new GeoLogVol(
"Scintillator",scintillator,matScin);
2107 pvScintillator =
new GeoPhysVol(lvScintillator);
2110 tfScintillator =
new GeoTransform(GeoTrf::Translate3D(0.,0.,0.));
2111 pvWrapper->add(idTag);
2112 pvWrapper->add(tfScintillator);
2113 pvWrapper->add(pvScintillator);
2117 (*m_log) <<
MSG::VERBOSE <<
" X scintiZPos= "<<scintiZPos;
2126 mother->add(tfWrapper);
2127 mother->add(pvWrapper);
2139 tfGlue =
new GeoTransform(GeoTrf::Translate3D((-thickness + dzglue)*
Gaudi::Units::cm/2,0.,0.));
2140 mother->add(tfGlue);
2141 mother->add(pvGlue);
2146 mother->add(tfGlue);
2147 mother->add(pvGlue);
2151 tfGlue =
new GeoTransform(GeoTrf::Translate3D(dzglue/2*
Gaudi::Units::cm,0.,0.));
2152 mother->add(tfGlue);
2153 mother->add(pvGlue);
2158 mother->add(tfGlue);
2159 mother->add(pvGlue);
2163 idTag =
new GeoIdentifierTag(j-CurrentScin);
2187 thicknessWrapper/2,thicknessWrapper/2,dy1Wrapper,dy2Wrapper,heightWrapper/2);
2189 wrapper =
new GeoTrd(thicknessWrapper/2,
2198 lvWrapper =
new GeoLogVol(
"Wrapper",wrapper,matAir);
2199 pvWrapper =
new GeoPhysVol(lvWrapper);
2207 checking(
"Scintillator 2",
true, 6,
2219 lvScintillator =
new GeoLogVol(
"Scintillator",scintillator,matScin);
2220 pvScintillator =
new GeoPhysVol(lvScintillator);
2223 tfScintillator =
new GeoTransform(GeoTrf::Translate3D(0.,0.,0.));
2224 pvWrapper->add(idTag);
2225 pvWrapper->add(tfScintillator);
2226 pvWrapper->add(pvScintillator);
2230 (*m_log) <<
MSG::VERBOSE <<
" X scintiZPos= "<<scintiZPos;
2239 mother->add(tfWrapper);
2240 mother->add(pvWrapper);
2264 idTag =
new GeoIdentifierTag(j-CurrentScin);
2273 thicknessWrapper/2,thicknessWrapper/2,dy1Wrapper,dy2Wrapper,heightWrapper/2);
2275 wrapper =
new GeoTrd(thicknessWrapper/2,
2284 lvWrapper =
new GeoLogVol(
"Wrapper",wrapper,matAir);
2285 pvWrapper =
new GeoPhysVol(lvWrapper);
2293 checking(
"Scintillator 3",
true, 6,
2305 lvScintillator =
new GeoLogVol(
"Scintillator",scintillator,matScin);
2306 pvScintillator =
new GeoPhysVol(lvScintillator);
2309 tfScintillator =
new GeoTransform(GeoTrf::Translate3D(0.,0.,0.));
2310 pvWrapper->add(idTag);
2311 pvWrapper->add(tfScintillator);
2312 pvWrapper->add(pvScintillator);
2320 tfWrapper =
new GeoTransform(GeoTrf::Translate3D(0.,
2324 mother->add(tfWrapper);
2325 mother->add(pvWrapper);
2335 double dy1Period =
period->getYHalfLength1();
2336 double tanphi = (
period->getYHalfLength2()-dy1Period)/
period->getZHalfLength()/2.;
2338 if (std::abs(tanphi-tan_delta_phi_2) > 1.e-5)
2342 idTag =
new GeoIdentifierTag(j-CurrentScin);
2359 dy1Wrapper = dy1Period - thicknessEnvelope + ((scintiRC - scintiHeight/2. - scintiWrapInR)*tanphi)*
Gaudi::Units::cm;
2360 dy2Wrapper = dy1Period - thicknessEnvelope + ((scintiRC + scintiHeight/2. + scintiWrapInR)*tanphi)*
Gaudi::Units::cm;
2365 thicknessWrapper/2,thicknessWrapper/2,dy1Wrapper,dy2Wrapper,heightWrapper/2);
2367 wrapper =
new GeoTrd(thicknessWrapper/2,
2372 lvWrapper =
new GeoLogVol(
"Wrapper",wrapper,matAir);
2373 pvWrapper =
new GeoPhysVol(lvWrapper);
2376 dy1Scintillator = dy1Period - thicknessEnvelope + ((scintiRC - scintiHeight/2.)*tanphi - scintiDeltaInPhi)*
Gaudi::Units::cm;
2377 dy2Scintillator = dy1Period - thicknessEnvelope + ((scintiRC + scintiHeight/2.)*tanphi - scintiDeltaInPhi)*
Gaudi::Units::cm;
2379 checking(
"Scintillator 4",
true, 6,
2387 lvScintillator =
new GeoLogVol(
"Scintillator",scintillator,matScin);
2388 pvScintillator =
new GeoPhysVol(lvScintillator);
2391 tfScintillator =
new GeoTransform(GeoTrf::Translate3D(0.,0.,0.));
2392 pvWrapper->add(idTag);
2393 pvWrapper->add(tfScintillator);
2394 pvWrapper->add(pvScintillator);
2402 tfWrapper =
new GeoTransform(GeoTrf::Translate3D(0.,
2406 mother->add(tfWrapper);
2407 mother->add(pvWrapper);
2418 double X1,
double X2,
double Y1,
double Y2,
double Z)
2420 double rless = .005;
2421 std::string Step[8] = {
" ",
2432 << std::setiosflags(std::ios::fixed) << std::setw(9) << std::setprecision(4)
2433 <<
" dX1,dX2= "<<X1<<
" "<<X2
2434 <<
" dY1,dY2= "<<Y1<<
" "<<Y2
2436 << std::resetiosflags(std::ios::fixed)
2439 if (X1 < rless && X2 < rless) {
2440 (*m_log) << MSG::WARNING <<
" volume "<<
Name<<
" is empty, X1 or X2<0 "<<
endmsg;
2442 if (Y1 < rless && Y2 < rless) {
2443 (*m_log) << MSG::WARNING <<
" volume "<<
Name<<
" is empty, Y1 or Y2<0 "<<
endmsg;
2446 (*m_log) << MSG::WARNING <<
" volume "<<
Name<<
" is empty, Z<0 "<<
endmsg;
2463 int currentSample, etaIndex, nsamp;
2464 std::vector<int> samples;
2465 std::vector<int> firstScin;
2466 std::vector<int> lastScin;
2470 float phi_min, phi_max;
2471 float dphi = 2.0f*
M_PI/64;
2474 phi_max = nphi*dphi/2;
2478 phi_max = nphi * dphi;
2482 float rBarrel[] = {2450., 3020., 3630.};
2483 float drBarrel[] = {300., 840., 380.};
2485 float rExtended[] = {2450., 2870., 3480.};
2486 float drExtended[] = {300., 540., 680.};
2488 float rGap[] = {3215., 3630., 2802.5, 2475.5, 2066., 1646.};
2489 float drGap[] = {450., 380., 313., 341., 478., 362.};
2504 int indHardcoded = 0;
2521 int sign_eta = (
side>0) ? 1 : -1;
2534 (*m_log) << MSG::ERROR <<
"TileGeoSectionBuilder::fillDescriptor: No TICL structures for detector: "
2552 if (currentSample==samples[
index])
break;
2553 if (
index==samples.size()) {
2554 samples.push_back(currentSample);
2562 (*m_log) << MSG::ERROR <<
"TileGeoSectionBuilder::fillDescriptor: No TICL structures for the detector: "
2569 etaIndex = samples[
index];
2570 if (etaIndex > nsamp) nsamp = etaIndex;
2574 eta_min[etaIndex-1],
2575 eta_max[etaIndex-1],
2582 zcenter[etaIndex-1],
2587 rcenter[etaIndex-1] = rBarrel[indHardcoded];
2588 dr[etaIndex-1] = drBarrel[indHardcoded];
2590 rcenter[etaIndex-1] = rExtended[indHardcoded];
2591 dr[etaIndex-1] = drExtended[indHardcoded];
2598 rcenter[etaIndex-1],
2619 if (etaIndex > nsamp) nsamp = etaIndex;
2621 neta[etaIndex-1] = 1;
2629 zcenter[etaIndex-1],
2633 rcenter[etaIndex-1] = rGap[indHardcoded];
2634 dr[etaIndex-1] = drGap[indHardcoded];
2641 rcenter[etaIndex-1],
2656 float rMB[] = { 676., 254. };
2657 float drMB[] = { 306., 116. };
2661 for (
int ind=0; ind<2; ++ind) {
2664 eta_min[ind] = 2. + ind;
2665 eta_max[ind] = 3. + ind;
2668 rcenter[ind] = rMB[ind];
2669 dr[ind] = drMB[ind];
2675 phi_max = nphi * dphi + phi_min;
2678 descriptor->
set(&*eta_min.begin(),
2697 descriptor->
print();
2714 MLOG(
DEBUG) <<
"TileGeoSectionBuilder::computeCellDim for detector="
2718 std::vector<double> rmins;
2719 std::vector<double> rmaxs;
2720 std::vector<double> zmins;
2721 std::vector<double> zmaxs;
2725 std::vector<int> samples;
2729 unsigned int CurrentScin;
2731 int nSide, nTower, nSample=0;
2732 unsigned int nFirstRow, nLastRow,
nRows;
2734 double dzCell, dzPeriod;
2736 double zEnd1 =0,zEnd2 =0,zEnd1Lim =0,zEnd2Lim =0;
2739 float minTilesInRow;
2779 tileSize=
round(tileSize);
2783 rmins.push_back(rMin);
2784 rmaxs.push_back(rMax);
2804 zmaxs.push_back(0.);
2816 if (currentSample==samples[
index])
break;
2817 if (
index==samples.size()) samples.push_back(currentSample);
2821 (*m_log) << MSG::ERROR <<
"TileGeoSectionBuilder::computeCellDim: No TICL structures for the detector: "
2828 currentSample = samples[
index];
2834 nLastRow = nFirstRow + 2;
2838 nRows = nLastRow - nFirstRow + 1;
2843 for (
unsigned int jj=1; jj<
nRows; jj++) {
2851 dzCell = minTilesInRow * dzPeriod;
2853 dzCell = (minTilesInRow + 0.5) * dzPeriod;
2855 MLOG(
DEBUG) <<
"dzCell: " << dzCell <<
" minTilesInRow: " << minTilesInRow <<
" isSquare: " << isSquare <<
" dzPeriod: " << dzPeriod <<
endmsg;
2857 for (
unsigned int jj=nFirstRow; jj<=nLastRow; jj++)
2858 zmaxs[jj-1] = zmins[jj-1] + dzCell;
2865 int firstC = nLastRow + 1;
2870 for (
unsigned int jj=firstC-nFirstRow+1; jj<=nLastRow-nFirstRow; jj++) {
2878 dzCell = minTilesInRow*dzPeriod;
2880 dzCell = (minTilesInRow + 0.5)*dzPeriod;
2883 MLOG(
DEBUG) <<
"BC - dzCell: " << dzCell <<
" minTilesInRow: " << minTilesInRow <<
" isSquare: " << isSquare <<
endmsg;
2885 for (
unsigned int jj=firstC; jj<=nLastRow; jj++)
2886 zmaxs[jj-1] = zmins[jj-1] + dzCell;
2898 for (
unsigned int jj=nFirstRow; jj<=nLastRow; jj++) {
2899 double Zmin=zmins[jj-1];
2900 double Zmax=zmaxs[jj-1];
2903 else if (
Zmin>zEnd2Lim)
Zmin=zEnd2;
2905 else if (
Zmax>zEnd2Lim)
Zmax=zEnd2;
2908 cellDim->
addRMin(rmins[jj-1]);
2909 cellDim->
addRMax(rmaxs[jj-1]);
2914 cellDimNeg->addRMin(rmins[jj-1]);
2915 cellDimNeg->addRMax(rmaxs[jj-1]);
2916 cellDimNeg->addZMin(-
Zmax-zShiftNeg);
2917 cellDimNeg->addZMax(-
Zmin-zShiftNeg);
2918 if (jj==nFirstRow || (BCcell && jj==nLastRow))
2919 MLOG(
DEBUG) <<
"Zmin: " <<
Zmin <<
" Zmax: " <<
Zmax <<
" zShiftPos: " << zShiftPos <<
" zShiftNeg: " << zShiftNeg <<
endmsg;
2922 if (jj==nFirstRow || (BCcell && jj==nLastRow))
2927 for (
unsigned int jj=nFirstRow; jj<=nLastRow; jj++)
2928 zmins[jj-1] = zmaxs[jj-1];
2936 nSample = currentSample - 1;
2944 cellDimNeg->computeVolume();
2954 std::cout << std::setiosflags(std::ios::fixed)
2955 << std::setw(9) << std::setprecision(2);
2956 std::cout <<
"\n **** Cell dimensions computed for : ";
2957 std::cout <<
"(" <<
detector <<
", "
2960 << nSample <<
")\n";
2961 std::cout <<
" >> CellDim contains " << cellDim->
getNRows() <<
" rows\n";
2962 for (
unsigned int jj=0; jj<cellDim->
getNRows(); jj++)
2963 std::cout << cellDim->
getRMin(jj) <<
" "
2964 << cellDim->
getRMax(jj) <<
" "
2965 << cellDim->
getZMin(jj) <<
" "
2966 << cellDim->
getZMax(jj) <<
"\n";
2970 std::cout <<
" >> CellDimNeg contains " << cellDimNeg->getNRows() <<
" rows\n";
2971 for (
unsigned int jj=0; jj<cellDimNeg->getNRows(); jj++)
2972 std::cout << cellDimNeg->getRMin(jj) <<
" "
2973 << cellDimNeg->getRMax(jj) <<
" "
2974 << cellDimNeg->getZMin(jj) <<
" "
2975 << cellDimNeg->getZMax(jj) <<
"\n";
2976 std::cout <<
" >> CellNeg Volume is " << cellDimNeg->getVolume()*(1./
Gaudi::Units::cm3) <<
" cm^3\n";
2978 std::cout <<
"\n" << std::resetiosflags(std::ios::fixed);
2985 (*m_log) << MSG::ERROR <<
"TileGeoSectionBuilder::computeCellDim: No TICL structures in detector: "
2995 for (
unsigned int sec=0; sec<2; sec++) {
3021 if (addPlates && sec)
3028 tileSize=
round(tileSize);
3032 rmins.push_back(rMin);
3033 rmaxs.push_back(rMax);
3052 (*m_log) << MSG::ERROR <<
"TileGeoSectionBuilder::computeCellDim: Bad return from TILBnscin" <<
endmsg;
3059 for (
unsigned int jj=0; jj<nscin; jj++) {
3062 cellDim->
addZMin(zmins[jj]+zShiftPos);
3063 cellDim->
addZMax(zmaxs[jj]+zShiftPos);
3065 cellDimNeg->addRMin(rmins[jj]);
3066 cellDimNeg->addRMax(rmaxs[jj]);
3067 cellDimNeg->addZMin(-zmaxs[jj]-zShiftNeg);
3068 cellDimNeg->addZMax(-zmins[jj]-zShiftNeg);
3070 MLOG(
DEBUG) <<
"Zmin: " << zmins[0] <<
" Zmax: " << zmaxs[0] <<
" zShiftPos: " << zShiftPos <<
" zShiftNeg: " << zShiftNeg <<
endmsg;
3076 cellDimNeg->computeVolume();
3082 std::cout << std::setiosflags(std::ios::fixed)
3083 << std::setw(9) << std::setprecision(2);
3084 std::cout <<
"\n **** Cell dimension computed for : ";
3085 std::cout <<
"(" <<
detector <<
", "
3088 << nSample <<
")\n";
3089 std::cout <<
" >> CellDim contains " << cellDim->
getNRows() <<
" rows\n";
3090 for (
unsigned int jj=0; jj<cellDim->
getNRows(); jj++)
3091 std::cout << cellDim->
getRMin(jj) <<
" "
3092 << cellDim->
getRMax(jj) <<
" "
3093 << cellDim->
getZMin(jj) <<
" "
3094 << cellDim->
getZMax(jj) <<
"\n";
3097 std::cout <<
" >> CellDimNeg contains " << cellDimNeg->getNRows() <<
" rows\n";
3098 for (
unsigned int jj=0; jj<cellDimNeg->getNRows(); jj++)
3099 std::cout << cellDimNeg->getRMin(jj) <<
" "
3100 << cellDimNeg->getRMax(jj) <<
" "
3101 << cellDimNeg->getZMin(jj) <<
" "
3102 << cellDimNeg->getZMax(jj) <<
"\n";
3103 std::cout <<
" >> CellNeg Volume is " << cellDimNeg->getVolume()*(1./
Gaudi::Units::cm3) <<
" cm^3\n";
3104 std::cout <<
"\n" << std::resetiosflags(std::ios::fixed);
3109 for (
unsigned int sec=0; sec<2; sec++) {
3133 if (j==CurrentScin) {
3135 rMax = rCenter + dR2;
3137 rMin = rCenter - dR2;
3141 rMin = rCenter - dR2;
3142 rMax = rCenter + dR2;
3145 rmins.push_back(rMin);
3146 rmaxs.push_back(rMax);
3154 if (sec==0 && jj==0)
3179 cellDimNeg->computeVolume();
3185 std::cout << std::setiosflags(std::ios::fixed)
3186 << std::setw(9) << std::setprecision(2);
3187 std::cout <<
"\n **** Cell dimension computed for : ";
3188 std::cout <<
"(" <<
detector <<
", "
3191 << nSample <<
")\n";
3192 std::cout <<
" >> CellDim contains " << cellDim->
getNRows() <<
" rows\n";
3193 for (
unsigned int jj=0; jj<cellDim->
getNRows(); jj++)
3194 std::cout << cellDim->
getRMin(jj) <<
" "
3195 << cellDim->
getRMax(jj) <<
" "
3196 << cellDim->
getZMin(jj) <<
" "
3197 << cellDim->
getZMax(jj) <<
"\n";
3200 std::cout <<
" >> CellDimNeg contains " << cellDimNeg->getNRows() <<
" rows\n";
3201 for (
unsigned int jj=0; jj<cellDimNeg->getNRows(); jj++)
3202 std::cout << cellDimNeg->getRMin(jj) <<
" "
3203 << cellDimNeg->getRMax(jj) <<
" "
3204 << cellDimNeg->getZMin(jj) <<
" "
3205 << cellDimNeg->getZMax(jj) <<
"\n";
3206 std::cout <<
" >> CellNeg Volume is " << cellDimNeg->getVolume()*(1./
Gaudi::Units::cm3) <<
" cm^3\n";
3207 std::cout <<
"\n" << std::resetiosflags(std::ios::fixed);
3242 (*m_log) << MSG::ERROR <<
"TileGeoSectionBuilder::calculateZ: Unexpected detector: "
3276 if (
side<1) zcenter *= -1;
3307 cell = firstScin - 2;
3314 (*m_log) << MSG::ERROR <<
"TileGeoSectionBuilder::calculateR: Unexpected detector: "
3319 float oldrc = rcenter;
3331 rMax = rcenter +
dr * 0.5;
3333 rMin = rcenter -
dr * 0.5;
3335 rcenter = (rMax+rMin) * 0.5;
3350 }
else if (
cell == -2) {
3352 }
else if (firstScin == 1) {
3373 rcenter = (rMax+rMin)*0.5;
3382 std::cout << std::setiosflags(std::ios::fixed) << std::setw(9) << std::setprecision(2);
3383 std::cout <<
"Detector " <<
detector <<
" sample " <<
sample <<
" old r/dr " << oldrc <<
" " << olddr << std::endl;
3384 std::cout <<
"Detector " <<
detector <<
" sample " <<
sample <<
" new r/dr " << rcenter <<
" " <<
dr <<
" delta r/dr " << rcenter-oldrc <<
" " <<
dr-olddr << std::endl;
3385 std::cout << std::resetiosflags(std::ios::fixed);
3420 (*m_log) << MSG::ERROR <<
"TileGeoSectionBuilder::calculateEta: No TICL structures of positive side "
3421 <<
"in Central Barrel for sample: " <<
sample <<
endmsg;
3443 (*m_log) << MSG::ERROR <<
"TileGeoSectionBuilder::calculateEta: No TICL structures in detector: "
3451 (*m_log) << MSG::ERROR <<
"TileGeoSectionBuilder::calculateEta: Unexpected detector: "
3480 (*m_log) << MSG::WARNING <<
"TileGeoSectionBuilder::checktransfunc: np is negative!"<<
endmsg;
3484 << std::setprecision (std::numeric_limits<double>::digits10 + 1)
3485 <<
" Absorber center = " << center
3486 <<
" length = " << absorber
3487 <<
" period = " <<
period
3488 <<
" nperiods = " <<
np
3490 double zC,dZ,z1,z2=-absorber/2.+center;
3491 for (
int i=0;
i<
np; ++
i) {
3492 zC = (
period*(2*
i+1)-absorber)/2. + center;
3497 <<
i <<
" z1= " << z1 <<
" z2= " << z2
3498 <<
" dist from previous= " << dZ <<
endmsg;
3505 (*m_log) <<
MSG::VERBOSE << std::setprecision (std::numeric_limits<double>::digits10 + 1)
3512 const GeoShapeUnion& scintUnion =
hole->add( *
hole << GeoTrf::Translate3D((off0-off*2.0),0.,0.));
3514 const GeoShape & motherWithHoles = (mother->subtract(scintUnion<<tfHole));
3515 return &motherWithHoles;
3524 const GeoShape & motherWithHoles = (mother->subtract((*hole1)<<tfHole1).subtract((*hole2)<<tfHole2));
3525 return &motherWithHoles;