9#include <arich/geometry/GeoARICHCreator.h>
10#include <arich/dbobjects/tessellatedSolidStr.h>
12#include <geometry/Materials.h>
13#include <geometry/CreatorFactory.h>
14#include <geometry/utilities.h>
15#include <framework/gearbox/Unit.h>
16#include <framework/logging/Logger.h>
17#include <arich/simulation/SensitiveDetector.h>
18#include <arich/simulation/SensitiveAero.h>
19#include <simulation/background/BkgSensitiveDetector.h>
20#include <arich/dbobjects/ARICHPositionElement.h>
25#include <G4LogicalVolume.hh>
26#include <G4PVPlacement.hh>
27#include <G4AssemblyVolume.hh>
28#include <G4UnionSolid.hh>
29#include <G4LogicalSkinSurface.hh>
30#include <G4OpticalSurface.hh>
37#include <G4TessellatedSolid.hh>
38#include <G4TriangularFacet.hh>
40#include <G4SubtractionSolid.hh>
42#include <G4Material.hh>
53 using namespace geometry;
61 geometry::CreatorFactory<GeoARICHCreator> GeoARICHFactory(
"ARICHCreator");
77 G4LogicalSkinSurface::CleanSurfaceTable();
98 if (!material) { B2FATAL(
"Material ARICH_Air required for ARICH master volume could not be found");}
100 B2WARNING(
"Material ARICH_Air required by ARICH master volume has no specified refractive index. Continuing, but no photons in ARICH will be propagated.");
103 G4LogicalVolume* masterLV =
new G4LogicalVolume(envelopeTube, material,
"ARICH.masterVolume");
107 G4Region* aRegion =
new G4Region(
"ARICHEnvelope");
108 masterLV->SetRegion(aRegion);
109 aRegion->AddRootLogicalVolume(masterLV);
111 G4RotationMatrix rotMaster;
126 B2WARNING(
"ARICH global displacement parameters from DB will be taken into account.");
128 rotMaster.rotateX(rot_x);
129 rotMaster.rotateY(rot_y);
130 rotMaster.rotateZ(rot_z);
132 G4ThreeVector transMaster(tr_x, tr_y, tr_z);
134 new G4PVPlacement(G4Transform3D(rotMaster, transMaster), masterLV,
"ARICH.MasterVolume", &topVolume,
false, 1);
155 G4LogicalVolume* aeroPlaneLV;
159 B2INFO(
"GeoARICHCreator: using simple cosmic test geometry.");
163 G4RotationMatrix rotDetPlane;
171 G4RotationMatrix rotMergerPlane;
172 rotMergerPlane.rotateX(0.0);
173 rotMergerPlane.rotateY(0.0);
174 rotMergerPlane.rotateZ(0.0);
179 G4RotationMatrix rotCablesPlane;
180 rotCablesPlane.rotateX(0.0);
181 rotCablesPlane.rotateY(0.0);
182 rotCablesPlane.rotateZ(0.0);
184 G4RotationMatrix rotCoolingPlane;
185 rotCoolingPlane.rotateX(0.0);
186 rotCoolingPlane.rotateY(0.0);
187 rotCoolingPlane.rotateZ(0.0);
189 G4RotationMatrix rotAeroPlane;
217 new G4PVPlacement(G4Transform3D(rotDetPlane, transDetPlane), detPlaneLV,
"ARICH.detPlane", masterLV,
false, 1);
218 new G4PVPlacement(G4Transform3D(rotDetPlane, transDetSupportPlate), detSupportPlateLV,
"ARICH.detSupportPlane", masterLV,
false, 1);
219 if (mergerLV)
new G4PVPlacement(G4Transform3D(rotMergerPlane, transMergerPlate), mergerLV,
"ARICH.mergerPlane", masterLV,
false, 1);
220 new G4PVPlacement(G4Transform3D(rotCablesPlane, transCablesPlate), cablesLV,
"ARICH.cablesPlane", masterLV,
false, 1);
222 new G4PVPlacement(G4Transform3D(rotAeroPlane, transAeroPlane), aeroPlaneLV,
"ARICH.aeroPlane", masterLV,
false, 1);
249 double angl = mirStart;
250 double dphi = 2 * M_PI / nMirrors;
252 for (
int i = 1; i < nMirrors + 1; i++) {
255 double mrot_z = angl;
256 double mtr_x = mirRad * cos(angl);
257 double mtr_y = mirRad * sin(angl);
258 double mtr_z = mirZPos + zShift;
261 mrot_x += displ.getAlpha();
262 mrot_y += displ.getBeta();
263 mrot_z += displ.getGamma();
264 mtr_x += displ.getX();
265 mtr_y += displ.getY();
266 mtr_z += displ.getZ();
268 G4RotationMatrix rotMirror;
269 rotMirror.rotateX(mrot_x);
270 rotMirror.rotateY(mrot_y);
271 rotMirror.rotateZ(mrot_z);
272 G4ThreeVector transMirror(mtr_x, mtr_y, mtr_z);
273 new G4PVPlacement(G4Transform3D(rotMirror, transMirror), mirrorLV,
"ARICH.mirrorPlate", masterLV,
false, i);
280 std::vector<G4LogicalVolume*> shieldLV(2);
281 std::vector<double> shieldZ(2);
283 for (
int i = 0; i < nTubes; i++) {
288 if (supportPar.
getTubeName(i) ==
"ARICH.NeutronShield1") {
289 shieldLV[0] =
new G4LogicalVolume(tube, tubeMaterial, supportPar.
getTubeName(i));
292 }
else if (supportPar.
getTubeName(i) ==
"ARICH.NeutronShield2") {
293 shieldLV[1] =
new G4LogicalVolume(tube, tubeMaterial, supportPar.
getTubeName(i));
298 G4LogicalVolume* tubeLV =
new G4LogicalVolume(tube, tubeMaterial, supportPar.
getTubeName(i));
300 new G4PVPlacement(G4Transform3D(G4RotationMatrix(), G4ThreeVector(0, 0,
305 const std::vector<double> wedge1 = supportPar.
getWedge(1);
306 const std::vector<double> wedge2 = supportPar.
getWedge(2);
309 G4AssemblyVolume* assemblyWedge1 =
new G4AssemblyVolume();
310 G4AssemblyVolume* assemblyWedge2 =
new G4AssemblyVolume();
311 makeJoint(wedge1Material, wedge1, assemblyWedge1);
312 makeJoint(wedge2Material, wedge2, assemblyWedge2);
316 for (
int i = 0; i < nWedge; i++) {
323 G4ThreeVector Tb(r * cos(phi), r * sin(phi), z);
328 Tr = G4Transform3D(Rx, Tb);
329 if (wgtype == 1) assemblyWedge1->MakeImprint(shieldLV[0], Tr);
330 else if (wgtype == 2) assemblyWedge2->MakeImprint(shieldLV[0], Tr);
334 Tr = G4Transform3D(Rx, Tb);
335 if (wgtype == 1) assemblyWedge1->MakeImprint(masterLV, Tr);
336 else if (wgtype == 2) assemblyWedge2->MakeImprint(masterLV, Tr);
337 else B2ERROR(
"GeoARICHCreator: invalid support wedge type!");
342 new G4PVPlacement(G4Transform3D(G4RotationMatrix(), G4ThreeVector(0, 0, shieldZ[0])), shieldLV[0],
"ARICH.NeutronShield1", masterLV,
345 new G4PVPlacement(G4Transform3D(G4RotationMatrix(), G4ThreeVector(0, 0, shieldZ[1])), shieldLV[1],
"ARICH.NeutronShield2", masterLV,
409 for (
int i = 0; i < nBoxes; i++) {
411 G4Box* scintBox =
new G4Box(
"scintBox", box.
size[0] * 10. / 2., box.
size[1] * 10. / 2., box.
size[2] * 10. / 2.);
413 G4LogicalVolume* scintLV =
new G4LogicalVolume(scintBox, scintMaterial, box.
name);
415 G4RotationMatrix rotScint;
421 B2INFO(
"GeoARICHCreator: Scintilator " << box.
name <<
" placed at global: " << transScintTV.X() <<
" " << transScintTV.Y() <<
" " <<
424 new G4PVPlacement(G4Transform3D(rotScint, transScint), scintLV,
"scintilator", masterLV,
false, 1);
430 delete assemblyWedge1;
431 delete assemblyWedge2;
455 G4Tubs* aerogelTube =
new G4Tubs(
"aerogelTube", rin, rout, (thick + wallHeight) / 2., 0, 2 * M_PI);
456 G4LogicalVolume* aerogelPlaneLV =
new G4LogicalVolume(aerogelTube, gapMaterial,
"ARICH.AaerogelPlane");
459 G4Tubs* supportTube =
new G4Tubs(
"aeroSupportTube", rin, rout, thick / 2., 0, 2 * M_PI);
460 G4LogicalVolume* supportTubeLV =
new G4LogicalVolume(supportTube, supportMaterial,
"ARICH.AerogelSupportPlate");
467 for (
unsigned iLayer = 1; iLayer < nLayer + 1; iLayer++) {
469 std::stringstream tileName;
470 tileName <<
"aerogelTile_" << iLayer;
472 G4Box* tileShape =
new G4Box(tileName.str(), params[0] * 10. / 2., params[1] * 10. / 2., layerThick / 2.);
476 G4LogicalVolume* tileLV =
new G4LogicalVolume(tileShape, aeroMaterial,
string(
"ARICH.") + tileName.str());
478 G4ThreeVector transTile(params[2] * 10., params[3] * 10., (thick + layerThick - wallHeight) / 2. + zLayer);
480 Ra.rotateZ(params[4]);
481 new G4PVPlacement(G4Transform3D(Ra, transTile), tileLV,
string(
"ARICH.") + tileName.str(), aerogelPlaneLV,
false, iLayer);
483 zLayer += layerThick;
486 new G4PVPlacement(G4Translate3D(0., 0., -wallHeight / 2.), supportTubeLV,
"ARICH.AerogelSupportPlate", aerogelPlaneLV,
false, 1);
488 return aerogelPlaneLV;
498 B2ERROR(
"GeoARICHCreator::buildAerogelPlane --> getFullAerogelMaterialDescriptionKey() is wrong");
523 G4Tubs* aerogelTube =
new G4Tubs(
"aerogelTube", rin, rout, (thick + wallHeight + imgTubeLen) / 2., 0, 2 * M_PI);
524 G4LogicalVolume* aerogelPlaneLV =
new G4LogicalVolume(aerogelTube, gapMaterial,
"ARICH.AaerogelPlane");
527 G4Tubs* supportTube =
new G4Tubs(
"aeroSupportTube", rin, rout, thick / 2., 0, 2 * M_PI);
528 G4LogicalVolume* supportTubeLV =
new G4LogicalVolume(supportTube, supportMaterial,
"ARICH.AerogelSupportPlate");
532 G4Tubs* imgTube =
new G4Tubs(
"imgTube", rin, rout, imgTubeLen / 2., 0, 2 * M_PI);
533 G4LogicalVolume* imgTubeLV =
new G4LogicalVolume(imgTube, imgMaterial,
"ARICH.AerogelImgPlate");
538 std::vector<double> wallR;
540 for (
unsigned iRing = 1; iRing < nRing + 1; iRing++) {
546 G4Transform3D transform = G4Translate3D(0., 0., (thick - imgTubeLen) / 2.);
548 for (
unsigned iRing = 0; iRing < nRing; iRing++) {
551 std::stringstream wallName;
552 wallName <<
"supportWallR_" << iRing + 1;
553 G4Tubs* supportWall =
new G4Tubs(wallName.str().c_str(), wallR[iRing], wallR[iRing] + wallThick, wallHeight / 2., 0, 2 * M_PI);
554 G4LogicalVolume* supportWallLV =
new G4LogicalVolume(supportWall, supportMaterial,
string(
"ARICH.") + wallName.str().c_str());
556 new G4PVPlacement(transform, supportWallLV,
string(
"ARICH.") + wallName.str().c_str(), aerogelPlaneLV,
false, 0);
558 if (iRing == 0)
continue;
564 wallName <<
"supportWallPhi_" << iRing + 1;
565 G4Box* wall =
new G4Box(wallName.str(), (wallR[iRing] - wallR[iRing - 1] - wallThick) / 2. - 1., thick / 2., wallHeight / 2.);
566 G4LogicalVolume* wallLV =
new G4LogicalVolume(wall, supportMaterial,
string(
"ARICH.") + wallName.str());
567 double r = (wallR[iRing - 1] + wallThick + wallR[iRing]) / 2.;
572 for (
unsigned iLayer = 1; iLayer < nLayer + 1; iLayer++) {
576 std::stringstream tileName;
577 tileName <<
"aerogelTile_" << iRing <<
"_" << iLayer;
579 G4Tubs* tileShape =
new G4Tubs(tileName.str(), wallR[iRing - 1] + wallThick + tileGap, wallR[iRing] - tileGap, layerThick / 2.,
580 (tileGap + wallThick / 2.) / wallR[iRing], dphi - (2.*tileGap + wallThick) / wallR[iRing]);
583 G4LogicalVolume* tileLV =
new G4LogicalVolume(tileShape, aeroMaterial,
string(
"ARICH.") + tileName.str());
585 while (iphi < 2 * M_PI - 0.0001) {
586 G4ThreeVector trans(r * cos(iphi), r * sin(iphi), (thick - imgTubeLen) / 2.);
590 if (iLayer == 1)
new G4PVPlacement(G4Transform3D(Ra, trans), wallLV,
string(
"ARICH.") + wallName.str(), aerogelPlaneLV,
false,
593 G4ThreeVector transTile(0, 0, (thick + layerThick - wallHeight - imgTubeLen) / 2. + zLayer);
594 new G4PVPlacement(G4Transform3D(Ra, transTile), tileLV,
string(
"ARICH.") + tileName.str(), aerogelPlaneLV,
false, iSlot);
598 zLayer += layerThick;
602 new G4PVPlacement(G4Translate3D(0., 0., -(wallHeight + imgTubeLen) / 2.), supportTubeLV,
"ARICH.AerogelSupportPlate",
606 new G4PVPlacement(G4Translate3D(0., 0., (wallHeight + thick) / 2.), imgTubeLV,
"ARICH.AerogelImgPlate", aerogelPlaneLV,
false, 1);
608 return aerogelPlaneLV;
633 double wallHeight = maxTotalAerogelThick + compensationARICHairVolumeThick_min;
638 G4Material* gapMaterial =
644 G4Tubs* aerogelTube =
new G4Tubs(
"aerogelTube", rin, rout, (thick + wallHeight + imgTubeLen) / 2., 0, 2 * M_PI);
645 G4LogicalVolume* aerogelPlaneLV =
new G4LogicalVolume(aerogelTube, gapMaterial,
"ARICH.AaerogelPlane");
648 G4Tubs* supportTube =
new G4Tubs(
"aeroSupportTube", rin, rout, thick / 2., 0, 2 * M_PI);
649 G4LogicalVolume* supportTubeLV =
new G4LogicalVolume(supportTube, supportMaterial,
"ARICH.AerogelSupportPlate");
653 G4Tubs* imgTube =
new G4Tubs(
"imgTube", rin, rout, imgTubeLen / 2., 0, 2 * M_PI);
654 G4LogicalVolume* imgTubeLV =
new G4LogicalVolume(imgTube, imgMaterial,
"ARICH.AerogelImgPlate");
658 std::vector<double> wallR;
660 for (
unsigned iRing = 1; iRing < nRing + 1; iRing++) {
666 G4Transform3D transform = G4Translate3D(0., 0., (thick - imgTubeLen) / 2.);
668 for (
unsigned iRing = 0; iRing < nRing; iRing++) {
671 std::stringstream wallName;
672 wallName <<
"supportWallR_" << iRing + 1;
674 G4Tubs* supportWall =
new G4Tubs(wallName.str().c_str(), wallR[iRing], wallR[iRing] + wallThick, wallHeight / 2., 0, 2 * M_PI);
675 G4LogicalVolume* supportWallLV =
new G4LogicalVolume(supportWall, supportMaterial,
string(
"ARICH.") + wallName.str().c_str());
676 new G4PVPlacement(transform, supportWallLV,
string(
"ARICH.") + wallName.str().c_str(), aerogelPlaneLV,
false, 0);
680 if (iRing == 0)
continue;
687 wallName <<
"supportWallPhi_" << iRing + 1;
688 G4Box* wall =
new G4Box(wallName.str(), (wallR[iRing] - wallR[iRing - 1] - wallThick) / 2. - 1., thick / 2., wallHeight / 2.);
689 G4LogicalVolume* wallLV =
new G4LogicalVolume(wall, supportMaterial,
string(
"ARICH.") + wallName.str());
690 double r = (wallR[iRing - 1] + wallThick + wallR[iRing]) / 2.;
695 for (
unsigned iLayer = 1; iLayer < nLayer + 1; iLayer++) {
701 while (iphi < 2 * M_PI - 0.0001) {
705 double layerThick = -1.0;
706 double tileUpThick = -1.0;
707 double tileDownThick = -1.0;
711 G4Material* aeroMaterial = NULL;
712 int ati_ring = iRing;
713 int ati_column = iicolumn + 1;
714 int ati_layerN = iLayer - 1;
720 B2ERROR(
"GeoARICHCreator::buildAerogelPlaneWithIndividualTilesProp --> getFullAerogelMaterialDescriptionKey() is wrong");
734 G4ThreeVector trans(r * cos(iphi), r * sin(iphi), (thick - imgTubeLen) / 2.);
738 new G4PVPlacement(G4Transform3D(Ra, trans),
740 string(
"ARICH.") + wallName.str(),
754 double compTileUpThick = wallHeight - tileUpThick - tileDownThick;
755 std::stringstream compTileName;
764 compTileName <<
"aerogelCompTile_" << iLayer <<
"_" << ati_ring <<
"_" << ati_column;
766 G4Tubs* compTileShape =
new G4Tubs(compTileName.str(),
767 wallR[iRing - 1] + wallThick + tileGap,
768 wallR[iRing] - tileGap,
769 compTileUpThick / 2.0,
770 (tileGap + wallThick / 2.0) / wallR[iRing],
771 dphi - (2.0 * tileGap + wallThick) / wallR[iRing]);
774 G4LogicalVolume* compTileLV =
new G4LogicalVolume(compTileShape,
776 string(
"ARICH.") + compTileName.str());
779 G4ThreeVector transCompTile(0, 0, (thick + wallHeight - compTileUpThick - imgTubeLen) / 2.0);
780 G4RotationMatrix compRa;
781 compRa.rotateZ(iphi);
782 new G4PVPlacement(G4Transform3D(compRa, transCompTile),
784 string(
"ARICH.") + compTileName.str(),
791 std::stringstream tileName;
792 tileName <<
"aerogelTile_" << iLayer <<
"_" << ati_ring <<
"_" << ati_column;
794 G4Tubs* tileShape =
new G4Tubs(tileName.str(),
795 wallR[iRing - 1] + wallThick + tileGap,
796 wallR[iRing] - tileGap,
798 (tileGap + wallThick / 2.0) / wallR[iRing],
799 dphi - (2.0 * tileGap + wallThick) / wallR[iRing]);
802 G4LogicalVolume* tileLV =
new G4LogicalVolume(tileShape,
804 string(
"ARICH.") + tileName.str());
809 zLayer = tileUpThick;
810 G4ThreeVector transTile(0, 0, (thick + layerThick - wallHeight - imgTubeLen) / 2.0 + zLayer);
811 new G4PVPlacement(G4Transform3D(Ra, transTile),
813 string(
"ARICH.") + tileName.str(),
828 new G4PVPlacement(G4Translate3D(0., 0., -(wallHeight + imgTubeLen) / 2.),
830 "ARICH.AerogelSupportPlate",
836 new G4PVPlacement(G4Translate3D(0., 0., (wallHeight + thick) / 2.),
838 "ARICH.AerogelImgPlate",
843 return aerogelPlaneLV;
865 if (!wref) B2WARNING(
"Material '" << winMat <<
866 "', required for ARICH photon detector window as no specified refractive index. Continuing, but no photons in ARICH will be detected.");
869 const double hapdSizeX = hapdGeo.
getSizeX();
870 const double hapdSizeY = hapdGeo.
getSizeY();
871 const double hapdSizeZ = hapdGeo.
getSizeZ();
877 const double botThick = wallThick;
881 G4Box* moduleBox =
new G4Box(
"moduleBox", hapdSizeX / 2., hapdSizeY / 2., modHeight / 2.);
882 G4LogicalVolume* lmoduleBox =
new G4LogicalVolume(moduleBox, moduleFill,
"ARICH.HAPDModule");
885 G4Box* hapdBox =
new G4Box(
"hapdBox", hapdSizeX / 2., hapdSizeY / 2., hapdSizeZ / 2.);
886 G4LogicalVolume* lhapdBox =
new G4LogicalVolume(hapdBox, fillMaterial,
"ARICH.HAPD");
889 G4Box* tempBox2 =
new G4Box(
"tempBox2", hapdSizeX / 2. - wallThick, hapdSizeY / 2. - wallThick,
890 hapdSizeZ / 2. + 0.1);
891 G4SubtractionSolid* moduleWall =
new G4SubtractionSolid(
"Box-tempBox", hapdBox, tempBox2);
892 G4LogicalVolume* lmoduleWall =
new G4LogicalVolume(moduleWall, wallMaterial,
"ARICH.HAPDWall");
893 setColor(*lmoduleWall,
"rgb(1.0,0.0,0.0,1.0)");
894 new G4PVPlacement(G4Transform3D(), lmoduleWall,
"ARICH.HAPDWall", lhapdBox,
false, 1);
897 G4Box* winBox =
new G4Box(
"winBox", hapdSizeX / 2. - wallThick, hapdSizeY / 2. - wallThick, winThick / 2.);
898 G4LogicalVolume* lmoduleWin =
new G4LogicalVolume(winBox, windowMaterial,
"ARICH.HAPDWindow");
899 setColor(*lmoduleWin,
"rgb(0.7,0.7,0.7,1.0)");
901 G4Transform3D transform = G4Translate3D(0., 0., (-hapdSizeZ + winThick) / 2.);
902 new G4PVPlacement(transform, lmoduleWin,
"ARICH.HAPDWindow", lhapdBox,
false, 1);
905 G4Box* botBox =
new G4Box(
"botBox", hapdSizeX / 2. - wallThick, hapdSizeY / 2. - wallThick, botThick / 2.);
906 G4LogicalVolume* lmoduleBot =
new G4LogicalVolume(botBox, wallMaterial,
"ARICH.HAPDBottom");
907 setColor(*lmoduleBot,
"rgb(0.0,1.0,0.0,1.0)");
908 G4Transform3D transform1 = G4Translate3D(0., 0., (hapdSizeZ - botThick) / 2.);
909 new G4PVPlacement(transform1, lmoduleBot,
"ARICH.HAPDBottom", lhapdBox,
false, 1);
912 G4Box* apdBox =
new G4Box(
"apdBox", apdSizeX / 2., apdSizeY / 2., apdSizeZ / 2.);
913 G4LogicalVolume* lApd =
new G4LogicalVolume(apdBox, apdMaterial,
"ARICH.HAPDApd");
921 new G4LogicalSkinSurface(
"apdSurface", lApd, optSurf);
922 G4Transform3D transform2 = G4Translate3D(0., 0., (hapdSizeZ - apdSizeZ) / 2. - botThick);
923 new G4PVPlacement(transform2, lApd,
"ARICH.HAPDApd", lhapdBox,
false, 1);
929 G4Box* febBox =
new G4Box(
"febBox", febSizeX / 2., febSizeY / 2., febSizeZ / 2.);
930 G4LogicalVolume* lfeb =
new G4LogicalVolume(febBox, febMaterial,
"ARICH.HAPDFeb");
932 setColor(*lfeb,
"rgb(0.0,0.6,0.0,1.0)");
933 G4Transform3D transform3 = G4Translate3D(0., 0., (modHeight - febSizeZ) / 2.);
934 new G4PVPlacement(transform3, lfeb,
"ARICH.HAPDFeb", lmoduleBox,
false, 1);
935 G4Transform3D transform4 = G4Translate3D(0., 0., - (modHeight - hapdSizeZ) / 2.);
936 new G4PVPlacement(transform4, lhapdBox,
"ARICH.HAPD", lmoduleBox,
false, 1);
946 G4LogicalVolume* hapdLV =
buildHAPD(hapdGeo);
950 G4Tubs* detTube =
new G4Tubs(
"detTube", detGeo.
getRingR(1) - hapdGeo.
getSizeX() * 1.4 / 2.,
952 G4LogicalVolume* detPlaneLV =
new G4LogicalVolume(detTube,
Materials::get(
"ARICH_Air"),
"ARICH.detectorPlane");
956 for (
unsigned iSlot = 1; iSlot < nSlots + 1; iSlot++) {
957 if (!
m_modInfo->isInstalled(iSlot))
continue;
960 G4ThreeVector trans(r * cos(phi), r * sin(phi), 0);
963 G4ThreeVector trans1(r * cos(phi), r * sin(phi), 0.0);
964 new G4PVPlacement(G4Transform3D(Ra, trans1), hapdLV,
"ARICH.HAPDModule", detPlaneLV,
false, iSlot);
983 G4VSolid* screwHoleTubeSubtracted_solid =
new G4Tubs(
"screwHoleTubeSubtracted_solid",
990 G4Box* merger_solid =
new G4Box(
"merger_solid",
995 G4RotationMatrix Ra_sub;
996 G4ThreeVector Ta_sub;
997 G4Transform3D Tr_sub;
998 Ta_sub.setX(-mergerGeo.
getSizeW() * mm / 2.0 + screwholedX1);
999 Ta_sub.setY(mergerGeo.
getSizeL() * mm / 2.0 - screwholedY);
1001 Tr_sub = G4Transform3D(Ra_sub, Ta_sub);
1002 G4SubtractionSolid* substraction_solid =
new G4SubtractionSolid(
"substraction_solid", merger_solid, screwHoleTubeSubtracted_solid,
1004 Ta_sub.setX(mergerGeo.
getSizeW() * mm / 2.0 - screwholedX2);
1005 Ta_sub.setY(mergerGeo.
getSizeL() * mm / 2.0 - screwholedY);
1007 Tr_sub = G4Transform3D(Ra_sub, Ta_sub);
1008 substraction_solid =
new G4SubtractionSolid(
"substraction_solid", substraction_solid, screwHoleTubeSubtracted_solid, Tr_sub);
1009 Ta_sub.setX(mergerGeo.
getSizeW() * mm / 2.0 - screwholedX2);
1010 Ta_sub.setY(-mergerGeo.
getSizeL() * mm / 2.0 + screwholedY);
1012 Tr_sub = G4Transform3D(Ra_sub, Ta_sub);
1013 substraction_solid =
new G4SubtractionSolid(
"substraction_solid", substraction_solid, screwHoleTubeSubtracted_solid, Tr_sub);
1014 Ta_sub.setX(-mergerGeo.
getSizeW() * mm / 2.0 + screwholedX1);
1015 Ta_sub.setY(-mergerGeo.
getSizeL() * mm / 2.0 + screwholedY);
1017 Tr_sub = G4Transform3D(Ra_sub, Ta_sub);
1018 substraction_solid =
new G4SubtractionSolid(
"substraction_solid", substraction_solid, screwHoleTubeSubtracted_solid, Tr_sub);
1028 B2WARNING(
"ARICH geometry: no data available for merger " << iType <<
" cooling body geometry. Cooling body will not be placed.");
1032 std::stringstream shpName;
1033 shpName <<
"TessellatedSolid_" << + iType;
1035 G4TessellatedSolid* volume_solid =
new G4TessellatedSolid(shpName.str().c_str());
1037 G4ThreeVector point_1;
1038 G4ThreeVector point_2;
1039 G4ThreeVector point_3;
1043 if (mergerCoolingStr.
nCells == 0) {
1044 B2WARNING(
"ARICH geometry: no data available for merger " << iType <<
" cooling body geometry. Cooling body will not be placed.");
1048 for (
unsigned int i = 0; i < mergerCoolingStr.
nCells; i++) {
1050 point_1.setX(mergerCoolingStr.
posV1[0][i]);
1051 point_1.setY(mergerCoolingStr.
posV1[1][i]);
1052 point_1.setZ(mergerCoolingStr.
posV1[2][i]);
1054 point_2.setX(mergerCoolingStr.
posV2[0][i]);
1055 point_2.setY(mergerCoolingStr.
posV2[1][i]);
1056 point_2.setZ(mergerCoolingStr.
posV2[2][i]);
1058 point_3.setX(mergerCoolingStr.
posV3[0][i]);
1059 point_3.setY(mergerCoolingStr.
posV3[1][i]);
1060 point_3.setZ(mergerCoolingStr.
posV3[2][i]);
1062 G4TriangularFacet* facet =
new G4TriangularFacet(point_1, point_2, point_3, ABSOLUTE);
1063 volume_solid->AddFacet((G4VFacet*) facet);
1067 volume_solid->SetSolidClosed(
true);
1068 std::stringstream volName;
1069 volName <<
"ARICH.mergerCooling_" << + iType;
1070 G4LogicalVolume* volume_logical =
new G4LogicalVolume(volume_solid,
1073 setColor(*volume_logical,
"rgb(0.6,0.0,0.2,1.0)");
1075 return volume_logical;
1081 G4Box* singlemergerenvelope_solid =
new G4Box(
"singlemergerenvelope_solid",
1085 std::stringstream volName;
1086 volName <<
"ARICH.singleMergerEnvelope_" << + iType;
1087 return new G4LogicalVolume(singlemergerenvelope_solid,
Materials::get(
"ARICH_Air"), volName.str().c_str());
1096 B2WARNING(
"GeoARICHCreator: Merger and merger cooling geometry will not be build as it is not available in geometry configuration (ARICHGeometryConfig with ClasDef>4 is needed).");
1103 G4LogicalVolume* envelope_logical =
new G4LogicalVolume(envelope_solid,
Materials::get(
"ARICH_Air"),
"ARICH.mergerEnvelope");
1106 G4LogicalVolume* merger_logical =
buildMerger(mergerGeo);
1107 G4LogicalVolume* mergerCooling_logical[12] = {NULL};
1108 G4LogicalVolume* mergerEnvelope_logical[12] = {NULL};
1111 G4RotationMatrix RaPCB;
1114 G4RotationMatrix RaMergerCooling;
1115 RaMergerCooling.rotateY(180 * deg);
1116 RaMergerCooling.rotateZ(-90 * deg);
1119 for (
int iType = 1; iType < 13; iType++) {
1122 setColor(*mergerEnvelope_logical[iType - 1],
"rgb(0.0,0.0,1.0,1.0)");
1124 new G4PVPlacement(G4Transform3D(RaPCB, TaPCB),
1127 mergerEnvelope_logical[iType - 1],
1131 if (mergerCooling_logical[iType - 1] == NULL)
continue;
1133 new G4PVPlacement(G4Transform3D(RaMergerCooling, TaMergerCooling),
1134 mergerCooling_logical[iType - 1],
1135 "ARICH.mergerCooling",
1136 mergerEnvelope_logical[iType - 1],
1142 for (
unsigned iSlot = 0; iSlot < mergerGeo.
getMergerSlotID().size(); iSlot++) {
1151 G4RotationMatrix Ra;
1153 new G4PVPlacement(G4Transform3D(Ra, Ta),
1154 mergerEnvelope_logical[type - 1],
1155 "ARICH.singleMergerEnvelope",
1161 return envelope_logical;
1168 G4Tubs* cablesEnvelope_solid =
new G4Tubs(
"cablesEnvelope_solid",
1174 G4LogicalVolume* cablesEnvelope_logical =
new G4LogicalVolume(cablesEnvelope_solid,
1176 "ARICH.cablesEnvelope");
1178 return cablesEnvelope_logical;
1188 double feb_alcooling_singleObjectEnvelope_sizeY = feb_alcooling_singleObjectEnvelope_sizeX * mm;
1193 double feb_alcooling_box1_sizeY = feb_alcooling_box1_sizeX;
1197 double feb_alcooling_box2_sizeY = feb_alcooling_box2_sizeX;
1200 double feb_alcooling_box3_sizeX = coolingv2Geo.
getRectangleW() * mm;
1201 double feb_alcooling_box3_sizeY = coolingv2Geo.
getRectangleL() * mm;
1204 double feb_alcooling_box1_X0 = feb_alcooling_box2_sizeX / 2.0 + feb_alcooling_box1_sizeX / 2.0;
1205 double feb_alcooling_box1_Y0 = feb_alcooling_box2_sizeY / 2.0 + feb_alcooling_box1_sizeY / 2.0;
1206 double feb_alcooling_box1_Z0 = 0.0 * mm;
1213 double feb_alcooling_box3_Y0 = feb_alcooling_box3_X0;
1214 double feb_alcooling_box3_Z0 = feb_alcooling_box1_sizeZ / 2.0 + feb_alcooling_box3_sizeZ / 2.0;
1215 double feb_alcooling_box3_angle = 45.0 * deg;
1217 G4RotationMatrix Ra;
1224 G4VSolid* feb_alcoolingEnvelope_solid =
new G4Box(
"feb_alcoolingEnvelope_solid",
1225 feb_alcooling_singleObjectEnvelope_sizeX / 2.0,
1226 feb_alcooling_singleObjectEnvelope_sizeY / 2.0,
1227 feb_alcooling_singleObjectEnvelope_sizeZ / 2.0);
1228 G4LogicalVolume* feb_alcoolingEnvelope_logical =
new G4LogicalVolume(feb_alcoolingEnvelope_solid,
Materials::get(
"Air"),
1229 "feb_alcoolingEnvelope_logical");
1231 G4VSolid* feb_alcooling_box1_solid =
new G4Box(
"feb_alcooling_box1_solid", feb_alcooling_box1_sizeX / 2.0,
1232 feb_alcooling_box1_sizeY / 2.0, feb_alcooling_box1_sizeZ / 2.0);
1233 G4VSolid* feb_alcooling_box2_solid =
new G4Box(
"feb_alcooling_box2_solid", feb_alcooling_box2_sizeX / 2.0,
1234 feb_alcooling_box2_sizeY / 2.0, feb_alcooling_box2_sizeZ / 2.0);
1235 G4VSolid* feb_alcooling_box3_solid =
new G4Box(
"feb_alcooling_box3_solid", feb_alcooling_box3_sizeX / 2.0,
1236 feb_alcooling_box3_sizeY / 2.0, feb_alcooling_box3_sizeZ / 2.0);
1241 Ta.setX(feb_alcooling_box1_X0);
1242 Ta.setY(feb_alcooling_box1_Y0);
1243 Ta.setZ(feb_alcooling_box1_Z0);
1244 Tr = G4Transform3D(Ra, Ta);
1245 G4UnionSolid* feb_alcooling_assembly01_solid =
new G4UnionSolid(
"feb_alcooling_assembly01_solid", feb_alcooling_box2_solid,
1246 feb_alcooling_box1_solid, Tr);
1250 Ta.setX(-feb_alcooling_box1_X0);
1251 Ta.setY(-feb_alcooling_box1_Y0);
1252 Ta.setZ(feb_alcooling_box1_Z0);
1253 Tr = G4Transform3D(Ra, Ta);
1254 G4UnionSolid* feb_alcooling_assembly02_solid =
new G4UnionSolid(
"feb_alcooling_assembly02_solid", feb_alcooling_assembly01_solid,
1255 feb_alcooling_box1_solid, Tr);
1259 Ta.setX(feb_alcooling_box3_X0);
1260 Ta.setY(feb_alcooling_box3_Y0);
1261 Ta.setZ(feb_alcooling_box3_Z0);
1262 Ra.rotateZ(-feb_alcooling_box3_angle);
1263 Tr = G4Transform3D(Ra, Ta);
1264 G4UnionSolid* feb_alcooling_assembly03_solid =
new G4UnionSolid(
"feb_alcooling_assembly03_solid", feb_alcooling_assembly02_solid,
1265 feb_alcooling_box3_solid, Tr);
1266 Ra.rotateZ(feb_alcooling_box3_angle);
1270 Ta.setX(-feb_alcooling_box3_X0);
1271 Ta.setY(-feb_alcooling_box3_Y0);
1272 Ta.setZ(feb_alcooling_box3_Z0);
1273 Ra.rotateZ(-feb_alcooling_box3_angle);
1274 Tr = G4Transform3D(Ra, Ta);
1275 G4UnionSolid* feb_alcooling_assembly_solid =
new G4UnionSolid(
"feb_alcooling_assembly_solid", feb_alcooling_assembly03_solid,
1276 feb_alcooling_box3_solid, Tr);
1277 Ra.rotateZ(feb_alcooling_box3_angle);
1279 G4LogicalVolume* feb_alcooling_assembly_logical =
new G4LogicalVolume(feb_alcooling_assembly_solid,
Materials::get(
"Al"),
1280 "feb_alcooling_assembly_logical");
1283 Ta.setZ(-feb_alcooling_box3_sizeZ / 2.0);
1285 Tr = G4Transform3D(Ra, Ta);
1286 new G4PVPlacement(Tr,
1287 feb_alcooling_assembly_logical,
1288 "feb_alcooling_assembly",
1289 feb_alcoolingEnvelope_logical,
1293 return feb_alcoolingEnvelope_logical;
1299 B2ASSERT(
"ARICH cooling geometry ID (G4Tube) is wrong : coolingGeo.getCoolingGeometryID.at(i_volumeID) != 1",
1301 G4Tubs* coolingTube_solid =
new G4Tubs(
"coolingTube_solid",
1304 coolingGeo.
getCoolingL().at(i_volumeID) * mm / 2.0,
1314 B2ASSERT(
"ARICH cooling geometry ID (G4Torus) is wrong : coolingGeo.getCoolingGeometryID.at(i_volumeID) != 2",
1322 G4Torus* coolingTorus_solid =
new G4Torus(
"coolingTorus_solid",
1336 G4Tubs* coolingEnvelope_solid =
new G4Tubs(
"coolingEnvelope_solid",
1342 G4LogicalVolume* coolingEnvelope_logical =
new G4LogicalVolume(coolingEnvelope_solid,
1344 "ARICH.coolingEnvelope");
1348 for (
unsigned i = 0; i < nComponents; i++) {
1352 G4RotationMatrix Ra;
1353 G4LogicalVolume* coolingComponentLV;
1356 Ta.set(r * cos(phi), r * sin(phi), 0);
1359 Ra.rotateY(90.0 * deg);
1366 B2FATAL(
"ARICH cooling geometry component ID is wrong");
1368 new G4PVPlacement(G4Transform3D(Ra, Ta),
1371 coolingEnvelope_logical,
1376 return coolingEnvelope_logical;
1383 G4Box* coolingTestPlateEnvelop_solid =
new G4Box(
"coolingTestPlateEnvelop_solid",
1387 G4LogicalVolume* coolingTestPlateEnvelop_logical =
new G4LogicalVolume(coolingTestPlateEnvelop_solid,
Materials::get(
"Air"),
1388 "ARICH.coolingTestPlateEnvelop");
1390 G4Box* coolingTestPlate_solid =
new G4Box(
"coolingTestPlate_solid",
1396 G4VSolid* coldTubeSubtracted_solid =
new G4Tubs(
"coldTubeSubtracted_solid",
1403 G4VSolid* coldTube_solid =
new G4Tubs(
"coldTube_solid",
1411 G4RotationMatrix Ra_sub;
1412 G4ThreeVector Ta_sub;
1413 G4Transform3D Tr_sub;
1417 Ra_sub.rotateY(90.0 * deg);
1418 Tr_sub = G4Transform3D(Ra_sub, Ta_sub);
1419 G4SubtractionSolid* substraction_solid =
new G4SubtractionSolid(
"substraction_solid", coolingTestPlate_solid,
1420 coldTubeSubtracted_solid, Tr_sub);
1426 Tr_sub = G4Transform3D(Ra_sub, Ta_sub);
1427 substraction_solid =
new G4SubtractionSolid(
"substraction_solid", substraction_solid, coldTubeSubtracted_solid, Tr_sub);
1430 G4LogicalVolume* coolingTestPlate_logical =
new G4LogicalVolume(substraction_solid,
1433 new G4PVPlacement(G4Transform3D(),
1434 coolingTestPlate_logical,
1435 "ARICH.coolingTestPlate",
1436 coolingTestPlateEnvelop_logical,
1440 G4RotationMatrix Ra;
1443 Ra.rotateY(90.0 * deg);
1449 Tr = G4Transform3D(Ra, Ta);
1450 new G4PVPlacement(Tr,
1453 coolingTestPlateEnvelop_logical,
1458 return coolingTestPlateEnvelop_logical;
1470 G4LogicalVolume* detSupportLV =
new G4LogicalVolume(supportTube, supportMaterial,
"ARICH.detectorSupportPlate");
1477 G4LogicalVolume* holeLV =
new G4LogicalVolume(hole,
Materials::get(
"Air"),
"ARICH.detectorSupportHole");
1480 std::vector<G4LogicalVolume*> hapdBackRadialWallLV;
1484 G4LogicalVolume* hapdSupportPlateLV =
new G4LogicalVolume(supportPlate, supportMaterial,
"hapdSupport");
1486 std::vector<double> wallR;
1487 wallR.assign(nRings + 1, 0);
1488 std::vector<double> thickR;
1489 thickR.assign(nRings + 1, 0);
1491 for (
int i = 1; i < nRings; i++) {
1493 double rp1 = detGeo.
getRingR(i + 1);
1494 wallR[i] = (rp1 + rm1) / 2.;
1496 wallR[0] = rm1 - (rp1 - rm1) / 2.;
1498 if (i == nRings - 1) {
1499 wallR[i + 1] = rp1 + (rp1 - rm1) / 2.;
1503 for (
int i = 0; i < nRings + 1; i++) {
1504 std::stringstream ringName1;
1505 ringName1 <<
"backWall_" << i;
1506 thickR[i] = backWallThick;
1508 thickR[i] = 2.*backWallThick;
1511 G4Tubs* backTube =
new G4Tubs(
"hapdBackRing", wallR[i] - thickR[i] / 2., wallR[i] + thickR[i] / 2., backWallHeight / 2., 0,
1513 G4LogicalVolume* hapdBackTubeLV =
new G4LogicalVolume(backTube, supportMaterial,
"backTube");
1515 new G4PVPlacement(transform3, hapdBackTubeLV,
"backTube", detSupportLV,
false, 1);
1516 if (i == 0)
continue;
1518 G4Box* backRadial =
new G4Box(
"backRadialBox", (wallR[i] - wallR[i - 1] - thickR[i] / 2. - thickR[i - 1] / 2.) / 2. - 1.,
1519 backWallThick / 2., backWallHeight / 2.);
1520 hapdBackRadialWallLV.push_back(
new G4LogicalVolume(backRadial, supportMaterial, ringName1.str().c_str()));
1523 G4SubtractionSolid* substraction = NULL;
1527 B2WARNING(
"GeoARICHCreator: No FEB colling body geometry available so they will not be placed (ARICHGeometryConfig with ClasDef>4 is needed).");
1528 return detSupportLV;
1533 for (
unsigned iSlot = 1; iSlot < nSlots + 1; iSlot++) {
1535 double r = (wallR[iRing] + wallR[iRing - 1]) / 2. - (thickR[iRing] - thickR[iRing - 1]) / 2.;
1538 G4ThreeVector trans(r * cos(phi), r * sin(phi), 0);
1539 G4RotationMatrix Ra;
1542 new G4PVPlacement(G4Transform3D(Ra, trans), holeLV,
"hole", hapdSupportPlateLV,
false, iSlot);
1543 if (substraction) substraction =
new G4SubtractionSolid(
"Box+CylinderMoved", substraction, hole, G4Transform3D(Ra, trans));
1544 else substraction =
new G4SubtractionSolid(
"Box+CylinderMoved", supportPlate, hole, G4Transform3D(Ra, trans));
1548 G4RotationMatrix RaBack;
1549 RaBack.rotateZ(phi);
1550 new G4PVPlacement(G4Transform3D(RaBack, transBack), hapdBackRadialWallLV[iRing - 1],
"hapdBack", detSupportLV,
false, iSlot);
1553 G4ThreeVector febCoolingTa;
1554 G4Transform3D febCoolingTr;
1555 febCoolingTa.setX(r * cos(detGeo.
getSlotPhi(iSlot)));
1556 febCoolingTa.setY(r * sin(detGeo.
getSlotPhi(iSlot)));
1561 double febCooling_envelope_Z0 = -supportTube_envelope_dZ / 2.0 + febCooling_envelope_dZ / 2.0 + detGeo.
getSupportThickness();
1562 febCoolingTa.setZ(febCooling_envelope_Z0);
1566 if (febcoolingv2GeometryID == 2) Ra.rotateZ(90.0 * deg);
1568 febCoolingTr = G4Transform3D(Ra, febCoolingTa);
1570 if (febcoolingv2GeometryID != 0) {
1573 new G4PVPlacement(febCoolingTr,
1584 G4Transform3D transform3 = G4Translate3D(0., 0., - backWallHeight / 2.);
1585 new G4PVPlacement(transform3, hapdSupportPlateLV,
"supportPlate", detSupportLV,
false, 1);
1588 G4Box* shieldBox1 =
new G4Box(
"shieldBox1", 20. / 2., 75. / 2., backWallHeight / 2.);
1589 G4Box* shieldBox2 =
new G4Box(
"shieldBox2", 55. / 2., 40. / 2., backWallHeight / 2.);
1590 G4LogicalVolume* shield1 =
new G4LogicalVolume(shieldBox1,
Materials::get(
"BoratedPoly"),
"ARICH.FWDShield1");
1591 G4LogicalVolume* shield2 =
new G4LogicalVolume(shieldBox2,
Materials::get(
"BoratedPoly"),
"ARICH.FWDShield2");
1592 double dphi = 2 * M_PI / 36.;
1593 double r1 = wallR[0] - 15.;
1594 double r2 = wallR[0] - 15. - 20. / 2. - 55. / 2.;
1595 for (
int i = 0; i < 36; i++) {
1596 double phi = (i + 0.5) * dphi;
1597 G4RotationMatrix rot;
1601 new G4PVPlacement(G4Transform3D(rot, trans), shield1,
"ARICH.FWDShield1", detSupportLV,
false, i);
1602 new G4PVPlacement(G4Transform3D(rot, trans1), shield2,
"ARICH.FWDShield2", detSupportLV,
false, i);
1605 return detSupportLV;
1622 G4Box* mirrPlate =
new G4Box(
"mirrPlate", mThick / 2., mLength / 2., mWidth / 2.);
1624 G4LogicalVolume* lmirror =
new G4LogicalVolume(mirrPlate, mirrorMaterial,
"ARICH.mirrorPlate");
1629 new G4LogicalSkinSurface(
"mirrorSurface", lmirror, optSurf);
1637 G4MaterialPropertiesTable* mTable = material->GetMaterialPropertiesTable();
1638 if (!mTable)
return 0;
1639 G4MaterialPropertyVector* mVector = mTable->GetProperty(
"RINDEX");
1640 if (!mVector)
return 0;
1648 int size = par.size();
1649 if (size < 4 || size > 8) B2ERROR(
"GeoARICHCreator::makeJoint: invalid number of joint wedge parameters");
1650 double lenx = par.at(0);
1651 double leny = par.at(1);
1652 double lenz = par.at(2);
1653 double thick = par.at(3);
1655 G4Box* wedgeBox1 =
new G4Box(
"wedgeBox1", thick / 2., lenx / 2., leny / 2.);
1656 G4Box* wedgeBox2 =
new G4Box(
"wedgeBox2", lenz / 2., lenx / 2., thick / 2.);
1658 G4LogicalVolume* wedgeBox1LV =
new G4LogicalVolume(wedgeBox1, supportMaterial,
"ARICH.supportWedge");
1659 G4LogicalVolume* wedgeBox2LV =
new G4LogicalVolume(wedgeBox2, supportMaterial,
"ARICH.supportWedge");
1661 G4RotationMatrix Rm;
1662 G4ThreeVector Ta(0, 0, 0);
1664 Tr = G4Transform3D(Rm, Ta);
1666 assemblyWedge->AddPlacedVolume(wedgeBox1LV, Tr);
1668 Ta.setX(lenz / 2. + thick / 2.);
1669 Ta.setZ(leny / 2. - thick / 2.);
1670 Tr = G4Transform3D(Rm, Ta);
1671 assemblyWedge->AddPlacedVolume(wedgeBox2LV, Tr);
1673 if (size == 4)
return;
1674 double edge = par.at(4);
1676 G4Box* wedgeBox3 =
new G4Box(
"wedgeBox3", lenz / 2., edge / 2., thick / 2.);
1677 G4LogicalVolume* wedgeBox3LV =
new G4LogicalVolume(wedgeBox3, supportMaterial,
"ARICH.supportWedge");
1679 Ta.setZ(leny / 2. - thick - thick / 2.);
1680 Tr = G4Transform3D(Rm, Ta);
1681 assemblyWedge->AddPlacedVolume(wedgeBox3LV, Tr);
1683 G4Trap* wedgeBoxTmp =
new G4Trap(
"wedgeBoxTmp", thick, leny - 2 * thick, lenz, edge);
1684 G4LogicalVolume* wedgeBox4LV;
1686 G4Tubs* wedgeBoxTmp1 =
new G4Tubs(
"wedgeBoxTmp1", 0.0, par.at(5), thick, 0, 2.*M_PI);
1687 G4RotationMatrix rotHole;
1688 G4ThreeVector transHole(par.at(6), par.at(7), 0);
1689 G4SubtractionSolid* wedgeBox4 =
new G4SubtractionSolid(
"wedgeBox4", wedgeBoxTmp, wedgeBoxTmp1, G4Transform3D(rotHole, transHole));
1690 wedgeBox4LV =
new G4LogicalVolume(wedgeBox4, supportMaterial,
"ARICH.supportWedge");
1691 }
else wedgeBox4LV =
new G4LogicalVolume(wedgeBoxTmp, supportMaterial,
"ARICH.supportWedge");
1693 Rm.rotateX(-M_PI / 2.);
1694 Ta.setX(thick / 2. + edge / 4. + lenz / 4.);
1695 Ta.setZ(-thick / 2. - edge / 2.);
1696 Tr = G4Transform3D(Rm, Ta);
1697 assemblyWedge->AddPlacedVolume(wedgeBox4LV, Tr);
Geometry parameters of HAPD.
const std::vector< double > & getSimpleParams() const
Get parameters of simple aerogel configuration.
bool isSimple() const
Use simple aerogel configuration.
double getLayerThickness(unsigned iLayer) const
Get thickness of tiles in i-th aerogel layer.
double getSupportThickness() const
Get support-plate thickness.
unsigned getNRings() const
Get number of aluminum wall rings (should be number of tile rings + 1).
double getSupportOuterR() const
Get support-plate outer radius.
double getCompensationARICHairVolumeThick_min() const
Get minimum thickness of the compensation volume with ARICH air.
double getImgTubeThickness() const
Get imaginary tube thickness just after aerogel layers used as volume to which tracks are extrapolate...
double getWallHeight() const
Get height of aluminum walls between aerogel tiles.
double getRingDPhi(unsigned iRing) const
Get phi (angle) distance between "phi" aluminum wall between aerogel tiles in i-th tile ring.
double getRotationY() const
Get angle of rotation around Y axis.
double getRotationZ() const
Get angle of rotation around Z axis.
double getTileThickness(int ring, int column, int layerN) const
Get thickness of individual tile.
const std::string & getLayerMaterial(unsigned iLayer) const
Get material name of tiles in i-th aerogel layer.
const std::string & getSupportMaterial() const
Get material of support plate.
double getWallThickness() const
Get thickness of aluminum walls between aerogel tiles.
double getRingRadius(unsigned iRing) const
Get radius of i-th aluminum ring between aerogel tiles (inner radius of ring).
unsigned getNLayers() const
Get number of aerogel layers.
ROOT::Math::XYZVector getPosition() const
Get position vector of aerogel plane in ARICH local frame.
double getSupportInnerR() const
Get support-plate inner radius.
int getFullAerogelMaterialDescriptionKey() const
Get full aerogel material description key.
std::string getTileMaterialName(int ring, int column, int layerN) const
Get material name of individual tile.
double getMaximumTotalTileThickness() const
Get maximum total thickness of the aerogel tiles tile_up + tile_down for all the slots.
double getTileGap() const
Get gap between aerogel tile and aluminum wall.
double getRotationX() const
Get angle of rotation around X axis.
Geometry parameters of cable envelope.
const std::string & getCablesEffectiveMaterialName() const
Returns Effective material name describing cables.
double getEnvelopeOuterRadius() const
Returns Outer radius of cables envelop.
ROOT::Math::XYZVector getEnvelopeCenterPosition() const
Returns position vector (ROOT::Math::XYZVector) of cables envelop.
double getEnvelopeInnerRadius() const
Returns Inner radius of cables envelop.
double getEnvelopeThickness() const
Returns Thickness of cables envelop.
Geometry parameters of cooling system.
double getColdTubeWallThickness() const
Get cold tube wall thickness.
const std::vector< double > & getCoolinRotationAngle() const
Get vector of azimuthal angle of rotation around Z - axis of the cooling system object in polar coord...
const std::vector< double > & getCoolingPosPhi() const
Get vector of azimuthal angle of the cooling system object center in polar coordinate system in deg.
double getEnvelopeOuterRadius() const
Get outer radius of cooling system assembly envelope.
const std::vector< double > & getCoolingGeometryID() const
Get vector of cooling system object geometry ID.
double getColdTubeSpacing() const
Get distance from center of the cold tube to edge of cooling plate.
const std::string & getCoolingPipeMaterialName() const
Get material name of cooling pipe.
double getColdTubeR() const
Get radius of cold tubes.
const std::vector< double > & getCoolingL() const
Get vector of lengs of the cooling system object with given geometry ID.
const std::vector< double > & getCoolingPosR() const
Get vector of radial distance (r, pho) of the cooling system object center in polar coordinate system...
const std::string & getColdTubeMaterialName() const
Get material name of cold tube.
const std::string & getCoolingTestPlateMaterialName() const
Get material name of cooling test plates.
ROOT::Math::XYZVector getEnvelopeCenterPosition() const
Get position vector (ROOT::Math::XYZVector) of cooling system assembly envelope.
double getRmax() const
Get size of cooling system pipe : outer radius in mm.
double getEnvelopeInnerRadius() const
Get inner radius of cooling system assembly envelope.
ROOT::Math::XYZVector getCoolingTestPlateslengths() const
Get sizes vector (ROOT::Math::XYZVector) of cooling test plates.
double getRmin() const
Get size of cooling system pipe : inner radius in mm.
double getDepthColdTubeInPlate() const
Get depth of the cold tube in the cooling plate.
double getEnvelopeThickness() const
Get thickness of cooling system assembly envelope.
double getColdTubeSubtractedR() const
Get outer radius of subtracted tubes for cold tube.
int getColdTubeNumber() const
Get number of cold tubes in one plate.
Geometry parameters of ARICH photon detector plane.
unsigned getNSlots() const
Get total number of module slots.
unsigned getSlotRing(unsigned slotID) const
Get ring number of slot with slot ID.
double getSupportBackWallHeight() const
Get height of the aluminum walls between modules on the electronics side of aluminum support plate.
double getSlotR(unsigned modID) const
Get radial position of module with given module ID number.
double getSupportBackWallThickness() const
Get thickness of aluminum walls between modules on the electronics side of aluminum support plate.
double getSupportThickness() const
Get support plate thickness.
unsigned getNRings() const
Get number of module slot rings.
double getSupportOuterR() const
Get support plate outer radius.
double getSupportZPosition() const
Get Z position of support plate (start point in Z).
double getRingDPhi(unsigned iRing) const
Get phi (angle) distance between module slots in i-th ring.
double getRotationY() const
Get angle of rotation around Y axis.
double getRotationZ() const
Get angle of rotation around Z axis.
double getSlotPhi(unsigned modID) const
Get phi (angle) position of module with given module ID number.
double getModuleHoleSize() const
Get size of module hole in support plate.
const std::string & getSupportMaterial() const
Get material of support plate.
ROOT::Math::XYZVector getPosition() const
Get center point.
double getSupportInnerR() const
Get support plate inner radius.
double getRingR(unsigned iRing) const
Get radius of i-th module slot ring (radius of center point).
double getRotationX() const
Get angle of rotation around X axis.
Geometry parameters of Cooling System - version2 (v2).
double getBigSquareThickness() const
Returns thickness of the big square in mm.
double getBigSquareSize() const
Returns size of the big square in mm.
double getSmallSquareSize() const
Returns size of the small square in mm.
double getRectangleThickness() const
Returns thickness of the rectangle in mm.
double getSmallSquareThickness() const
Returns thickness of the small square in mm.
const std::vector< double > & getFebcoolingv2GeometryID() const
Returns vector of feb cooling configuration/geometry ID.
double getRectangleW() const
Returns width of the rectangle in mm.
double getRectangleL() const
Returns length of the rectangle in mm.
double getRectangleDistanceFromCenter() const
Returns distance from center of the rectangle in mm.
double getGamma() const
Returns rotation angle around z.
double getX() const
Returns translation in x.
double getAlpha() const
Returns rotation angle around x.
double getZ() const
Returns translation in z.
double getY() const
Returns translation in y.
double getBeta() const
Returns rotation angle around y.
Geometry parameters of HAPD.
double getSizeZ() const
Returns HAPD size in z.
const std::string & getFEBMaterial() const
Returns FEB material name.
double getAPDSizeZ() const
Returns APD size in z.
double getWinThickness() const
Returns window thickness.
const std::string & getAPDMaterial() const
Returns APD material name.
const GeoOpticalSurface & getAPDSurface() const
Returns APD reflective optical surface.
const std::string & getWallMaterial() const
Returns wall (casing) material name.
const std::string & getFillMaterial() const
Returns fill (inside) material name.
double getSizeX() const
Returns HAPD size in x.
double getSizeY() const
Returns HAPD size in y.
double getFEBSizeY() const
Returns FEB size in y.
double getWallThickness() const
Returns wall thickness.
double getFEBSizeZ() const
Returns FEB size in z.
const std::string & getWinMaterial() const
Returns window material name.
double getModuleSizeZ() const
Returns module size in z (HAPD + FEB height)
double getAPDSizeY() const
Returns APD size in y.
double getFEBSizeX() const
Returns FEB size in x.
double getAPDSizeX() const
Returns APD size in x.
ROOT::Math::XYZVector pointToGlobal(const ROOT::Math::XYZVector &point) const
Transform local point into global Belle II coordinate system via rotation and translation.
double getRotationY() const
Get angle of rotation around Y axis.
double getRotationZ() const
Get angle of rotation around Z axis.
double getOuterRadius() const
Get ARICH master volume outer radius.
double getInnerRadius() const
Get ARICH master volume inner radius.
const std::string & getMaterial() const
Get material of ARICH master volume.
ROOT::Math::XYZVector getPosition() const
Get position of ARICH master volume center point in global Belle II coordinates.
double getLength() const
Get ARICH master volume length.
double getRotationX() const
Get angle of rotation around X axis.
Geometry parameters of Merger PCB.
const std::vector< double > & getSingleMergerenvelopeDeltaZ() const
Returns vector of Z position of the single merger and merger cooling body envelope inside global merg...
double getMergerPCBscrewholeR() const
Returns merger PCB screw hole radius.
double getSingleMergerEnvelopeThickness() const
Returns single merger PCB and merger cooling envelop thickness.
double getSizeW() const
Returns merger PCB width.
double getMergerPCBscrewholePosdX1() const
Returns merger PCB screw hole position from the bottom edge.
double getEnvelopeOuterRadius() const
Returns Outer radius of merger PCB assembly envelope.
const std::vector< double > & getMergerSlotID() const
Returns vector of merger boards slot numbers.
double getMergerPCBscrewholePosdX2() const
Returns merger PCB screw hole position from the top edge.
const std::vector< double > & getMergerAngle() const
Returns vector of merger boarts azimuthal angles in polar coordinate system in deg.
double getThickness() const
Returns merger PCB thickness.
ROOT::Math::XYZVector getSingleMergeEnvelopePosition() const
Returns position vector (ROOT::Math::XYZVector) of merger PCB inside the single merger envelope.
ROOT::Math::XYZVector getEnvelopeCenterPosition() const
Returns position vector (ROOT::Math::XYZVector) of merger PCB assembly envelope.
const std::vector< double > & getMergerOrientation() const
Returns vector of merger boarts orientations in deg.
const std::vector< double > & getMergerPosR() const
Returns vector of merger boards distances from the center in mm.
const std::string & getMergerPCBMaterialName() const
Returns merger PCB material name.
double getSingleMergerEnvelopeSizeW() const
Returns single merger PCB and merger cooling envelop width.
double getEnvelopeInnerRadius() const
Returns Inner radius of merger PCB assembly envelope.
double getSingleMergerEnvelopeSizeL() const
Returns single merger PCB and merger cooling envelop length.
double getSizeL() const
Returns merger PCB length.
double getEnvelopeThickness() const
Returns Thickness of merger PCB assembly envelope.
double getMergerPCBscrewholePosdY() const
Returns merger PCB screw hole position from the left and right sides.
const ARICHPositionElement & getDisplacementElement(int mirrorID) const
Returns displacement parameters for given mirror plate.
Geometry parameters of HAPD.
const GeoOpticalSurface & getMirrorSurface() const
Returns mirror reflective optical surface.
double getZPosition() const
Get nominal Z position of mirror plates (center point in ARICH local frame)
unsigned getNMirrors() const
Get number of mirror plates.
double getPlateWidth() const
Get width of mirror plate.
const std::string & getMaterial() const
Get material name of mirror plates.
double getPlateLength() const
Get length of mirror plate.
double getRadius() const
Get nominal radius at which mirror plates are placed (center of plate)
double getStartAngle() const
Get phi angle of position of the first mirror plate.
double getPlateThickness() const
Get thickness of mirror plate.
Geometry parameters of ARICH support structures and neutron shield.
double getWedgeR(unsigned i) const
Get radius at which i-th wedge is placed.
double getWedgePhi(unsigned i) const
Get phi angle at which i-th wedge is placed.
const std::vector< double > getWedge(unsigned i) const
Get parameters of wedge.
double getTubeInnerR(unsigned i) const
Get tube inner radius.
double getTubeLength(unsigned i) const
Get tube length.
double getTubeOuterR(unsigned i) const
Get tube outer radius.
double getWedgeZ(unsigned i) const
Get Z position of i-th wedge.
unsigned getNTubes() const
Get number of tube volumes to be placed.
const std::string & getTubeMaterial(unsigned i) const
Get material of i-th tube.
int getWedgeType(unsigned i) const
Get type of i-th wedge.
unsigned getNWedges() const
Get number of wedges to be placed.
double getTubeZPosition(unsigned i) const
Get tube Z position.
const std::string & getWedgeMaterial(unsigned i) const
Get material of i-th wedge.
box getBox(unsigned i) const
Get box parameters.
const std::string & getTubeName(unsigned i) const
Get name of i-th tube.
unsigned getNBoxes() const
Get number of box volumes.
The Class for ARICH Geometry Parameters.
const ARICHGeoAerogelPlane & getAerogelPlane() const
Get geometry configuration of aerogel plane.
const ARICHGeoMerger & getMergerGeometry() const
Get Merger PCB geometry parameters.
static void useGeantUnits()
Use Geant4 units when returning geometry parameters.
const ARICHGeoGlobalDisplacement & getGlobalDisplacement() const
Get global displacement parameters.
const ARICHGeoFEBCooling & getFEBCoolingGeometry() const
Get ARICH FEB cooling system (v2) geometry parameters.
bool useMirrorDisplacement() const
Get whether mirror displacement is used.
const ARICHGeoMasterVolume & getMasterVolume() const
Get ARICH master volume geometry configuration.
const ARICHGeoCooling & getCoolingGeometry() const
Get ARICH cooling system geometry parameters.
const ARICHGeoMirrors & getMirrors() const
Get mirrors geometry configuration.
const ARICHGeoCablesEnvelope & getCablesEnvelope() const
Get ARICH cables envelop geometry parameters.
static void useBasf2Units()
Use basf2 units when returning geometry parameters.
const ARICHGeoHAPD & getHAPDGeometry() const
Get HAPD geometry parameters.
bool useGlobalDisplacement() const
Get whether global displacement is used.
const ARICHGeoDetectorPlane & getDetectorPlane() const
Get geometry configuration of HAPD plane.
const ARICHGeoMirrorDisplacement & getMirrorDisplacement() const
Get mirror displacement parameters.
const ARICHGeoSupport & getSupportStructure() const
Get ARICH support structure geometry configuration.
Position element for ARICH.
The Class for BeamBackground Sensitive Detector.
static const double eV
[electronvolt]
static const double MeV
[megaelectronvolt]
G4LogicalVolume * buildSimpleAerogelPlane(const ARICHGeometryConfig &detectorGeo)
build simple aerogel plane (for cosmic test)
G4LogicalVolume * buildHAPD(const ARICHGeoHAPD &hapdPar)
build the HAPD modules
void makeJoint(G4Material *supportMaterial, const std::vector< double > &pars, G4AssemblyVolume *assemblyWedge)
build joints of the ARICH support structure
virtual ~GeoARICHCreator()
The destructor of the GeoARICHreator class.
OptionalDBObjPtr< ARICHGeoMergerCooling > m_mergerCooling
merger cooling bodies geometry from the DB
G4LogicalVolume * buildMergerPCBEnvelopePlane(const ARICHGeometryConfig &detectorGeo)
build merger PCB assembly envelope plane
G4LogicalVolume * buildFEBCoolingBody(const ARICHGeoFEBCooling &coolingv2Geo)
build FEB cooling bodies (cooling system update after phase 2)
G4LogicalVolume * buildCoolingTorus(const unsigned i_volumeID, const ARICHGeoCooling &coolingGeo)
build cooling tube (G4Torus)
G4LogicalVolume * buildAerogelPlaneAveragedOverLayers(const ARICHGeometryConfig &detectorGeo)
build aerogel plane with average properties of aerogel per layer
G4LogicalVolume * buildCables(const ARICHGeoCablesEnvelope &cablesGeo)
build the cables envelop with effective material describing cables
G4LogicalVolume * buildMergerCooling(unsigned iType)
build merger cooling bodies (cooling system update after phase 2)
double getAvgRINDEX(G4Material *material)
get refractive index of the material
G4LogicalVolume * buildCoolingTube(const unsigned i_volumeID, const ARICHGeoCooling &coolingGeo)
build cooling tube (G4Tubs)
void createGeometry(G4LogicalVolume &topVolume, geometry::GeometryTypes type)
Create detector geometry.
G4LogicalVolume * buildDetectorSupportPlate(const ARICHGeometryConfig &detectorGeo)
build detector support plate
DBObjPtr< ARICHModulesInfo > m_modInfo
information on installed modules from the DB
G4LogicalVolume * buildAerogelPlane(const ARICHGeometryConfig &detectorGeo)
build aerogel plane
GeoARICHCreator()
Constructor of the GeoARICHCreator class.
SensitiveAero * m_sensitiveAero
pointer to sensitive aerogel - used instead of tracking
G4LogicalVolume * buildDetectorPlane(const ARICHGeometryConfig &detectorGeo)
build detector plane
ARICHGeometryConfig m_config
geometry configuration
G4LogicalVolume * buildCoolingEnvelopePlane(const ARICHGeoCooling &coolingGeo)
build cooling system assembly envelope plane
int m_isBeamBkgStudy
flag the beam background study
G4LogicalVolume * buildMergerEnvelope(const ARICHGeoMerger &mergerGeo, int type)
build single merger and merger cooling body envelope logical volume
G4LogicalVolume * buildMerger(const ARICHGeoMerger &mergerGeo)
build the merger PCB logical volume
SensitiveDetector * m_sensitive
pointer to sensitive detector
G4LogicalVolume * buildAerogelPlaneWithIndividualTilesProp(const ARICHGeometryConfig &detectorGeo)
with individual properties of aerogel tiles
G4LogicalVolume * buildMirror(const ARICHGeometryConfig &detectorGeo)
build mirrors
G4LogicalVolume * buildCoolingTestPlate(const ARICHGeoCooling &coolingGeo)
build cooling test plates
This is optional (temporary) class that provides information on track parameters on aerogel plane,...
The Class for ARICH Sensitive Detector.
Thin wrapper around the Geant4 Material system.
static G4Material * get(const std::string &name)
Find given material.
static Materials & getInstance()
Get a reference to the singleton instance.
G4OpticalSurface * createOpticalSurface(const gearbox::Interface ¶meters)
Create an optical surface from parameters, will abort on error.
int doBeamBackgroundStudy() const
returns 1 if beam background study (to add additional sensitive modules, detect neutrons,...
double sqrt(double a)
sqrt for double
void setVisibility(G4LogicalVolume &volume, bool visible)
Helper function to quickly set the visibility of a given volume.
void setColor(G4LogicalVolume &volume, const std::string &color)
Set the color of a logical volume.
GeometryTypes
Flag indiciating the type of geometry to be used.
Abstract base class for different kinds of events.
Struct to hold parameters of box volumes (examples, scintilators for cosmic test)
std::string material
material
double rotation[3]
rotation coordinates
double position[3]
position coordinates
double size[3]
size coordinates
Structure which holds apexes of the tessellation volumes.
std::vector< std::vector< double > > posV1
x, y, z of apex1.
std::vector< std::vector< double > > posV3
x, y, z of apex3.
std::vector< std::vector< double > > posV2
x, y, z of apex2.
unsigned int nCells
number of cells