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>
23#include <boost/format.hpp>
24#include <boost/foreach.hpp>
25#include <boost/algorithm/string.hpp>
28#include <G4LogicalVolume.hh>
29#include <G4PVPlacement.hh>
30#include <G4AssemblyVolume.hh>
31#include <G4UnionSolid.hh>
32#include <G4LogicalSkinSurface.hh>
33#include <G4OpticalSurface.hh>
40#include <G4TessellatedSolid.hh>
41#include <G4TriangularFacet.hh>
43#include <G4SubtractionSolid.hh>
45#include <G4Material.hh>
57 using namespace geometry;
65 geometry::CreatorFactory<GeoARICHCreator> GeoARICHFactory(
"ARICHCreator");
81 G4LogicalSkinSurface::CleanSurfaceTable();
102 if (!material) { B2FATAL(
"Material ARICH_Air required for ARICH master volume could not be found");}
104 B2WARNING(
"Material ARICH_Air required by ARICH master volume has no specified refractive index. Continuing, but no photons in ARICH will be propagated.");
107 G4LogicalVolume* masterLV =
new G4LogicalVolume(envelopeTube, material,
"ARICH.masterVolume");
111 G4Region* aRegion =
new G4Region(
"ARICHEnvelope");
112 masterLV->SetRegion(aRegion);
113 aRegion->AddRootLogicalVolume(masterLV);
115 G4RotationMatrix rotMaster;
130 B2WARNING(
"ARICH global displacement parameters from DB will be taken into account.");
132 rotMaster.rotateX(rot_x);
133 rotMaster.rotateY(rot_y);
134 rotMaster.rotateZ(rot_z);
136 G4ThreeVector transMaster(tr_x, tr_y, tr_z);
138 new G4PVPlacement(G4Transform3D(rotMaster, transMaster), masterLV,
"ARICH.MasterVolume", &topVolume,
false, 1);
159 G4LogicalVolume* aeroPlaneLV;
163 B2INFO(
"GeoARICHCreator: using simple cosmic test geometry.");
167 G4RotationMatrix rotDetPlane;
175 G4RotationMatrix rotMergerPlane;
176 rotMergerPlane.rotateX(0.0);
177 rotMergerPlane.rotateY(0.0);
178 rotMergerPlane.rotateZ(0.0);
183 G4RotationMatrix rotCablesPlane;
184 rotCablesPlane.rotateX(0.0);
185 rotCablesPlane.rotateY(0.0);
186 rotCablesPlane.rotateZ(0.0);
188 G4RotationMatrix rotCoolingPlane;
189 rotCoolingPlane.rotateX(0.0);
190 rotCoolingPlane.rotateY(0.0);
191 rotCoolingPlane.rotateZ(0.0);
193 G4RotationMatrix rotAeroPlane;
221 new G4PVPlacement(G4Transform3D(rotDetPlane, transDetPlane), detPlaneLV,
"ARICH.detPlane", masterLV,
false, 1);
222 new G4PVPlacement(G4Transform3D(rotDetPlane, transDetSupportPlate), detSupportPlateLV,
"ARICH.detSupportPlane", masterLV,
false, 1);
223 if (mergerLV)
new G4PVPlacement(G4Transform3D(rotMergerPlane, transMergerPlate), mergerLV,
"ARICH.mergerPlane", masterLV,
false, 1);
224 new G4PVPlacement(G4Transform3D(rotCablesPlane, transCablesPlate), cablesLV,
"ARICH.cablesPlane", masterLV,
false, 1);
226 new G4PVPlacement(G4Transform3D(rotAeroPlane, transAeroPlane), aeroPlaneLV,
"ARICH.aeroPlane", masterLV,
false, 1);
253 double angl = mirStart;
254 double dphi = 2 * M_PI / nMirrors;
256 for (
int i = 1; i < nMirrors + 1; i++) {
259 double mrot_z = angl;
260 double mtr_x = mirRad * cos(angl);
261 double mtr_y = mirRad * sin(angl);
262 double mtr_z = mirZPos + zShift;
265 mrot_x += displ.getAlpha();
266 mrot_y += displ.getBeta();
267 mrot_z += displ.getGamma();
268 mtr_x += displ.getX();
269 mtr_y += displ.getY();
270 mtr_z += displ.getZ();
272 G4RotationMatrix rotMirror;
273 rotMirror.rotateX(mrot_x);
274 rotMirror.rotateY(mrot_y);
275 rotMirror.rotateZ(mrot_z);
276 G4ThreeVector transMirror(mtr_x, mtr_y, mtr_z);
277 new G4PVPlacement(G4Transform3D(rotMirror, transMirror), mirrorLV,
"ARICH.mirrorPlate", masterLV,
false, i);
284 std::vector<G4LogicalVolume*> shieldLV(2);
285 std::vector<double> shieldZ(2);
287 for (
int i = 0; i < nTubes; i++) {
292 if (supportPar.
getTubeName(i) ==
"ARICH.NeutronShield1") {
293 shieldLV[0] =
new G4LogicalVolume(tube, tubeMaterial, supportPar.
getTubeName(i));
296 }
else if (supportPar.
getTubeName(i) ==
"ARICH.NeutronShield2") {
297 shieldLV[1] =
new G4LogicalVolume(tube, tubeMaterial, supportPar.
getTubeName(i));
302 G4LogicalVolume* tubeLV =
new G4LogicalVolume(tube, tubeMaterial, supportPar.
getTubeName(i));
304 new G4PVPlacement(G4Transform3D(G4RotationMatrix(), G4ThreeVector(0, 0,
309 const std::vector<double> wedge1 = supportPar.
getWedge(1);
310 const std::vector<double> wedge2 = supportPar.
getWedge(2);
313 G4AssemblyVolume* assemblyWedge1 =
new G4AssemblyVolume();
314 G4AssemblyVolume* assemblyWedge2 =
new G4AssemblyVolume();
315 makeJoint(wedge1Material, wedge1, assemblyWedge1);
316 makeJoint(wedge2Material, wedge2, assemblyWedge2);
320 for (
int i = 0; i < nWedge; i++) {
327 G4ThreeVector Tb(r * cos(phi), r * sin(phi), z);
332 Tr = G4Transform3D(Rx, Tb);
333 if (wgtype == 1) assemblyWedge1->MakeImprint(shieldLV[0], Tr);
334 else if (wgtype == 2) assemblyWedge2->MakeImprint(shieldLV[0], Tr);
338 Tr = G4Transform3D(Rx, Tb);
339 if (wgtype == 1) assemblyWedge1->MakeImprint(masterLV, Tr);
340 else if (wgtype == 2) assemblyWedge2->MakeImprint(masterLV, Tr);
341 else B2ERROR(
"GeoARICHCreator: invalid support wedge type!");
346 new G4PVPlacement(G4Transform3D(G4RotationMatrix(), G4ThreeVector(0, 0, shieldZ[0])), shieldLV[0],
"ARICH.NeutronShield1", masterLV,
349 new G4PVPlacement(G4Transform3D(G4RotationMatrix(), G4ThreeVector(0, 0, shieldZ[1])), shieldLV[1],
"ARICH.NeutronShield2", masterLV,
413 for (
int i = 0; i < nBoxes; i++) {
415 G4Box* scintBox =
new G4Box(
"scintBox", box.
size[0] * 10. / 2., box.
size[1] * 10. / 2., box.
size[2] * 10. / 2.);
417 G4LogicalVolume* scintLV =
new G4LogicalVolume(scintBox, scintMaterial, box.
name);
419 G4RotationMatrix rotScint;
425 B2INFO(
"GeoARICHCreator: Scintilator " << box.
name <<
" placed at global: " << transScintTV.X() <<
" " << transScintTV.Y() <<
" " <<
428 new G4PVPlacement(G4Transform3D(rotScint, transScint), scintLV,
"scintilator", masterLV,
false, 1);
434 delete assemblyWedge1;
435 delete assemblyWedge2;
459 G4Tubs* aerogelTube =
new G4Tubs(
"aerogelTube", rin, rout, (thick + wallHeight) / 2., 0, 2 * M_PI);
460 G4LogicalVolume* aerogelPlaneLV =
new G4LogicalVolume(aerogelTube, gapMaterial,
"ARICH.AaerogelPlane");
463 G4Tubs* supportTube =
new G4Tubs(
"aeroSupportTube", rin, rout, thick / 2., 0, 2 * M_PI);
464 G4LogicalVolume* supportTubeLV =
new G4LogicalVolume(supportTube, supportMaterial,
"ARICH.AerogelSupportPlate");
471 for (
unsigned iLayer = 1; iLayer < nLayer + 1; iLayer++) {
473 std::stringstream tileName;
474 tileName <<
"aerogelTile_" << iLayer;
476 G4Box* tileShape =
new G4Box(tileName.str(), params[0] * 10. / 2., params[1] * 10. / 2., layerThick / 2.);
480 G4LogicalVolume* tileLV =
new G4LogicalVolume(tileShape, aeroMaterial,
string(
"ARICH.") + tileName.str());
482 G4ThreeVector transTile(params[2] * 10., params[3] * 10., (thick + layerThick - wallHeight) / 2. + zLayer);
484 Ra.rotateZ(params[4]);
485 new G4PVPlacement(G4Transform3D(Ra, transTile), tileLV,
string(
"ARICH.") + tileName.str(), aerogelPlaneLV,
false, iLayer);
487 zLayer += layerThick;
490 new G4PVPlacement(G4Translate3D(0., 0., -wallHeight / 2.), supportTubeLV,
"ARICH.AerogelSupportPlate", aerogelPlaneLV,
false, 1);
492 return aerogelPlaneLV;
502 B2ERROR(
"GeoARICHCreator::buildAerogelPlane --> getFullAerogelMaterialDescriptionKey() is wrong");
527 G4Tubs* aerogelTube =
new G4Tubs(
"aerogelTube", rin, rout, (thick + wallHeight + imgTubeLen) / 2., 0, 2 * M_PI);
528 G4LogicalVolume* aerogelPlaneLV =
new G4LogicalVolume(aerogelTube, gapMaterial,
"ARICH.AaerogelPlane");
531 G4Tubs* supportTube =
new G4Tubs(
"aeroSupportTube", rin, rout, thick / 2., 0, 2 * M_PI);
532 G4LogicalVolume* supportTubeLV =
new G4LogicalVolume(supportTube, supportMaterial,
"ARICH.AerogelSupportPlate");
536 G4Tubs* imgTube =
new G4Tubs(
"imgTube", rin, rout, imgTubeLen / 2., 0, 2 * M_PI);
537 G4LogicalVolume* imgTubeLV =
new G4LogicalVolume(imgTube, imgMaterial,
"ARICH.AerogelImgPlate");
542 std::vector<double> wallR;
544 for (
unsigned iRing = 1; iRing < nRing + 1; iRing++) {
550 G4Transform3D transform = G4Translate3D(0., 0., (thick - imgTubeLen) / 2.);
552 for (
unsigned iRing = 0; iRing < nRing; iRing++) {
555 std::stringstream wallName;
556 wallName <<
"supportWallR_" << iRing + 1;
557 G4Tubs* supportWall =
new G4Tubs(wallName.str().c_str(), wallR[iRing], wallR[iRing] + wallThick, wallHeight / 2., 0, 2 * M_PI);
558 G4LogicalVolume* supportWallLV =
new G4LogicalVolume(supportWall, supportMaterial,
string(
"ARICH.") + wallName.str().c_str());
560 new G4PVPlacement(transform, supportWallLV,
string(
"ARICH.") + wallName.str().c_str(), aerogelPlaneLV,
false, 0);
562 if (iRing == 0)
continue;
568 wallName <<
"supportWallPhi_" << iRing + 1;
569 G4Box* wall =
new G4Box(wallName.str(), (wallR[iRing] - wallR[iRing - 1] - wallThick) / 2. - 1., thick / 2., wallHeight / 2.);
570 G4LogicalVolume* wallLV =
new G4LogicalVolume(wall, supportMaterial,
string(
"ARICH.") + wallName.str());
571 double r = (wallR[iRing - 1] + wallThick + wallR[iRing]) / 2.;
576 for (
unsigned iLayer = 1; iLayer < nLayer + 1; iLayer++) {
580 std::stringstream tileName;
581 tileName <<
"aerogelTile_" << iRing <<
"_" << iLayer;
583 G4Tubs* tileShape =
new G4Tubs(tileName.str(), wallR[iRing - 1] + wallThick + tileGap, wallR[iRing] - tileGap, layerThick / 2.,
584 (tileGap + wallThick / 2.) / wallR[iRing], dphi - (2.*tileGap + wallThick) / wallR[iRing]);
587 G4LogicalVolume* tileLV =
new G4LogicalVolume(tileShape, aeroMaterial,
string(
"ARICH.") + tileName.str());
589 while (iphi < 2 * M_PI - 0.0001) {
590 G4ThreeVector trans(r * cos(iphi), r * sin(iphi), (thick - imgTubeLen) / 2.);
594 if (iLayer == 1)
new G4PVPlacement(G4Transform3D(Ra, trans), wallLV,
string(
"ARICH.") + wallName.str(), aerogelPlaneLV,
false,
597 G4ThreeVector transTile(0, 0, (thick + layerThick - wallHeight - imgTubeLen) / 2. + zLayer);
598 new G4PVPlacement(G4Transform3D(Ra, transTile), tileLV,
string(
"ARICH.") + tileName.str(), aerogelPlaneLV,
false, iSlot);
602 zLayer += layerThick;
606 new G4PVPlacement(G4Translate3D(0., 0., -(wallHeight + imgTubeLen) / 2.), supportTubeLV,
"ARICH.AerogelSupportPlate",
610 new G4PVPlacement(G4Translate3D(0., 0., (wallHeight + thick) / 2.), imgTubeLV,
"ARICH.AerogelImgPlate", aerogelPlaneLV,
false, 1);
612 return aerogelPlaneLV;
637 double wallHeight = maxTotalAerogelThick + compensationARICHairVolumeThick_min;
642 G4Material* gapMaterial =
648 G4Tubs* aerogelTube =
new G4Tubs(
"aerogelTube", rin, rout, (thick + wallHeight + imgTubeLen) / 2., 0, 2 * M_PI);
649 G4LogicalVolume* aerogelPlaneLV =
new G4LogicalVolume(aerogelTube, gapMaterial,
"ARICH.AaerogelPlane");
652 G4Tubs* supportTube =
new G4Tubs(
"aeroSupportTube", rin, rout, thick / 2., 0, 2 * M_PI);
653 G4LogicalVolume* supportTubeLV =
new G4LogicalVolume(supportTube, supportMaterial,
"ARICH.AerogelSupportPlate");
657 G4Tubs* imgTube =
new G4Tubs(
"imgTube", rin, rout, imgTubeLen / 2., 0, 2 * M_PI);
658 G4LogicalVolume* imgTubeLV =
new G4LogicalVolume(imgTube, imgMaterial,
"ARICH.AerogelImgPlate");
662 std::vector<double> wallR;
664 for (
unsigned iRing = 1; iRing < nRing + 1; iRing++) {
670 G4Transform3D transform = G4Translate3D(0., 0., (thick - imgTubeLen) / 2.);
672 for (
unsigned iRing = 0; iRing < nRing; iRing++) {
675 std::stringstream wallName;
676 wallName <<
"supportWallR_" << iRing + 1;
678 G4Tubs* supportWall =
new G4Tubs(wallName.str().c_str(), wallR[iRing], wallR[iRing] + wallThick, wallHeight / 2., 0, 2 * M_PI);
679 G4LogicalVolume* supportWallLV =
new G4LogicalVolume(supportWall, supportMaterial,
string(
"ARICH.") + wallName.str().c_str());
680 new G4PVPlacement(transform, supportWallLV,
string(
"ARICH.") + wallName.str().c_str(), aerogelPlaneLV,
false, 0);
684 if (iRing == 0)
continue;
691 wallName <<
"supportWallPhi_" << iRing + 1;
692 G4Box* wall =
new G4Box(wallName.str(), (wallR[iRing] - wallR[iRing - 1] - wallThick) / 2. - 1., thick / 2., wallHeight / 2.);
693 G4LogicalVolume* wallLV =
new G4LogicalVolume(wall, supportMaterial,
string(
"ARICH.") + wallName.str());
694 double r = (wallR[iRing - 1] + wallThick + wallR[iRing]) / 2.;
699 for (
unsigned iLayer = 1; iLayer < nLayer + 1; iLayer++) {
705 while (iphi < 2 * M_PI - 0.0001) {
709 double layerThick = -1.0;
710 double tileUpThick = -1.0;
711 double tileDownThick = -1.0;
715 G4Material* aeroMaterial = NULL;
716 int ati_ring = iRing;
717 int ati_column = iicolumn + 1;
718 int ati_layerN = iLayer - 1;
724 B2ERROR(
"GeoARICHCreator::buildAerogelPlaneWithIndividualTilesProp --> getFullAerogelMaterialDescriptionKey() is wrong");
738 G4ThreeVector trans(r * cos(iphi), r * sin(iphi), (thick - imgTubeLen) / 2.);
742 new G4PVPlacement(G4Transform3D(Ra, trans),
744 string(
"ARICH.") + wallName.str(),
758 double compTileUpThick = wallHeight - tileUpThick - tileDownThick;
759 std::stringstream compTileName;
768 compTileName <<
"aerogelCompTile_" << iLayer <<
"_" << ati_ring <<
"_" << ati_column;
770 G4Tubs* compTileShape =
new G4Tubs(compTileName.str(),
771 wallR[iRing - 1] + wallThick + tileGap,
772 wallR[iRing] - tileGap,
773 compTileUpThick / 2.0,
774 (tileGap + wallThick / 2.0) / wallR[iRing],
775 dphi - (2.0 * tileGap + wallThick) / wallR[iRing]);
778 G4LogicalVolume* compTileLV =
new G4LogicalVolume(compTileShape,
780 string(
"ARICH.") + compTileName.str());
783 G4ThreeVector transCompTile(0, 0, (thick + wallHeight - compTileUpThick - imgTubeLen) / 2.0);
784 G4RotationMatrix compRa;
785 compRa.rotateZ(iphi);
786 new G4PVPlacement(G4Transform3D(compRa, transCompTile),
788 string(
"ARICH.") + compTileName.str(),
795 std::stringstream tileName;
796 tileName <<
"aerogelTile_" << iLayer <<
"_" << ati_ring <<
"_" << ati_column;
798 G4Tubs* tileShape =
new G4Tubs(tileName.str(),
799 wallR[iRing - 1] + wallThick + tileGap,
800 wallR[iRing] - tileGap,
802 (tileGap + wallThick / 2.0) / wallR[iRing],
803 dphi - (2.0 * tileGap + wallThick) / wallR[iRing]);
806 G4LogicalVolume* tileLV =
new G4LogicalVolume(tileShape,
808 string(
"ARICH.") + tileName.str());
813 zLayer = tileUpThick;
814 G4ThreeVector transTile(0, 0, (thick + layerThick - wallHeight - imgTubeLen) / 2.0 + zLayer);
815 new G4PVPlacement(G4Transform3D(Ra, transTile),
817 string(
"ARICH.") + tileName.str(),
832 new G4PVPlacement(G4Translate3D(0., 0., -(wallHeight + imgTubeLen) / 2.),
834 "ARICH.AerogelSupportPlate",
840 new G4PVPlacement(G4Translate3D(0., 0., (wallHeight + thick) / 2.),
842 "ARICH.AerogelImgPlate",
847 return aerogelPlaneLV;
869 if (!wref) B2WARNING(
"Material '" << winMat <<
870 "', required for ARICH photon detector window as no specified refractive index. Continuing, but no photons in ARICH will be detected.");
873 const double hapdSizeX = hapdGeo.
getSizeX();
874 const double hapdSizeY = hapdGeo.
getSizeY();
875 const double hapdSizeZ = hapdGeo.
getSizeZ();
881 const double botThick = wallThick;
885 G4Box* moduleBox =
new G4Box(
"moduleBox", hapdSizeX / 2., hapdSizeY / 2., modHeight / 2.);
886 G4LogicalVolume* lmoduleBox =
new G4LogicalVolume(moduleBox, moduleFill,
"ARICH.HAPDModule");
889 G4Box* hapdBox =
new G4Box(
"hapdBox", hapdSizeX / 2., hapdSizeY / 2., hapdSizeZ / 2.);
890 G4LogicalVolume* lhapdBox =
new G4LogicalVolume(hapdBox, fillMaterial,
"ARICH.HAPD");
893 G4Box* tempBox2 =
new G4Box(
"tempBox2", hapdSizeX / 2. - wallThick, hapdSizeY / 2. - wallThick,
894 hapdSizeZ / 2. + 0.1);
895 G4SubtractionSolid* moduleWall =
new G4SubtractionSolid(
"Box-tempBox", hapdBox, tempBox2);
896 G4LogicalVolume* lmoduleWall =
new G4LogicalVolume(moduleWall, wallMaterial,
"ARICH.HAPDWall");
897 setColor(*lmoduleWall,
"rgb(1.0,0.0,0.0,1.0)");
898 new G4PVPlacement(G4Transform3D(), lmoduleWall,
"ARICH.HAPDWall", lhapdBox,
false, 1);
901 G4Box* winBox =
new G4Box(
"winBox", hapdSizeX / 2. - wallThick, hapdSizeY / 2. - wallThick, winThick / 2.);
902 G4LogicalVolume* lmoduleWin =
new G4LogicalVolume(winBox, windowMaterial,
"ARICH.HAPDWindow");
903 setColor(*lmoduleWin,
"rgb(0.7,0.7,0.7,1.0)");
905 G4Transform3D transform = G4Translate3D(0., 0., (-hapdSizeZ + winThick) / 2.);
906 new G4PVPlacement(transform, lmoduleWin,
"ARICH.HAPDWindow", lhapdBox,
false, 1);
909 G4Box* botBox =
new G4Box(
"botBox", hapdSizeX / 2. - wallThick, hapdSizeY / 2. - wallThick, botThick / 2.);
910 G4LogicalVolume* lmoduleBot =
new G4LogicalVolume(botBox, wallMaterial,
"ARICH.HAPDBottom");
911 setColor(*lmoduleBot,
"rgb(0.0,1.0,0.0,1.0)");
912 G4Transform3D transform1 = G4Translate3D(0., 0., (hapdSizeZ - botThick) / 2.);
913 new G4PVPlacement(transform1, lmoduleBot,
"ARICH.HAPDBottom", lhapdBox,
false, 1);
916 G4Box* apdBox =
new G4Box(
"apdBox", apdSizeX / 2., apdSizeY / 2., apdSizeZ / 2.);
917 G4LogicalVolume* lApd =
new G4LogicalVolume(apdBox, apdMaterial,
"ARICH.HAPDApd");
925 new G4LogicalSkinSurface(
"apdSurface", lApd, optSurf);
926 G4Transform3D transform2 = G4Translate3D(0., 0., (hapdSizeZ - apdSizeZ) / 2. - botThick);
927 new G4PVPlacement(transform2, lApd,
"ARICH.HAPDApd", lhapdBox,
false, 1);
933 G4Box* febBox =
new G4Box(
"febBox", febSizeX / 2., febSizeY / 2., febSizeZ / 2.);
934 G4LogicalVolume* lfeb =
new G4LogicalVolume(febBox, febMaterial,
"ARICH.HAPDFeb");
936 setColor(*lfeb,
"rgb(0.0,0.6,0.0,1.0)");
937 G4Transform3D transform3 = G4Translate3D(0., 0., (modHeight - febSizeZ) / 2.);
938 new G4PVPlacement(transform3, lfeb,
"ARICH.HAPDFeb", lmoduleBox,
false, 1);
939 G4Transform3D transform4 = G4Translate3D(0., 0., - (modHeight - hapdSizeZ) / 2.);
940 new G4PVPlacement(transform4, lhapdBox,
"ARICH.HAPD", lmoduleBox,
false, 1);
950 G4LogicalVolume* hapdLV =
buildHAPD(hapdGeo);
954 G4Tubs* detTube =
new G4Tubs(
"detTube", detGeo.
getRingR(1) - hapdGeo.
getSizeX() * 1.4 / 2.,
956 G4LogicalVolume* detPlaneLV =
new G4LogicalVolume(detTube,
Materials::get(
"ARICH_Air"),
"ARICH.detectorPlane");
960 for (
unsigned iSlot = 1; iSlot < nSlots + 1; iSlot++) {
961 if (!
m_modInfo->isInstalled(iSlot))
continue;
964 G4ThreeVector trans(r * cos(phi), r * sin(phi), 0);
967 G4ThreeVector trans1(r * cos(phi), r * sin(phi), 0.0);
968 new G4PVPlacement(G4Transform3D(Ra, trans1), hapdLV,
"ARICH.HAPDModule", detPlaneLV,
false, iSlot);
987 G4VSolid* screwHoleTubeSubtracted_solid =
new G4Tubs(
"screwHoleTubeSubtracted_solid",
994 G4Box* merger_solid =
new G4Box(
"merger_solid",
999 G4RotationMatrix Ra_sub;
1000 G4ThreeVector Ta_sub;
1001 G4Transform3D Tr_sub;
1002 Ta_sub.setX(-mergerGeo.
getSizeW() * mm / 2.0 + screwholedX1);
1003 Ta_sub.setY(mergerGeo.
getSizeL() * mm / 2.0 - screwholedY);
1005 Tr_sub = G4Transform3D(Ra_sub, Ta_sub);
1006 G4SubtractionSolid* substraction_solid =
new G4SubtractionSolid(
"substraction_solid", merger_solid, screwHoleTubeSubtracted_solid,
1008 Ta_sub.setX(mergerGeo.
getSizeW() * mm / 2.0 - screwholedX2);
1009 Ta_sub.setY(mergerGeo.
getSizeL() * mm / 2.0 - screwholedY);
1011 Tr_sub = G4Transform3D(Ra_sub, Ta_sub);
1012 substraction_solid =
new G4SubtractionSolid(
"substraction_solid", substraction_solid, screwHoleTubeSubtracted_solid, Tr_sub);
1013 Ta_sub.setX(mergerGeo.
getSizeW() * mm / 2.0 - screwholedX2);
1014 Ta_sub.setY(-mergerGeo.
getSizeL() * mm / 2.0 + screwholedY);
1016 Tr_sub = G4Transform3D(Ra_sub, Ta_sub);
1017 substraction_solid =
new G4SubtractionSolid(
"substraction_solid", substraction_solid, screwHoleTubeSubtracted_solid, Tr_sub);
1018 Ta_sub.setX(-mergerGeo.
getSizeW() * mm / 2.0 + screwholedX1);
1019 Ta_sub.setY(-mergerGeo.
getSizeL() * mm / 2.0 + screwholedY);
1021 Tr_sub = G4Transform3D(Ra_sub, Ta_sub);
1022 substraction_solid =
new G4SubtractionSolid(
"substraction_solid", substraction_solid, screwHoleTubeSubtracted_solid, Tr_sub);
1032 B2WARNING(
"ARICH geometry: no data available for merger " << iType <<
" cooling body geometry. Cooling body will not be placed.");
1036 std::stringstream shpName;
1037 shpName <<
"TessellatedSolid_" << + iType;
1039 G4TessellatedSolid* volume_solid =
new G4TessellatedSolid(shpName.str().c_str());
1041 G4ThreeVector point_1;
1042 G4ThreeVector point_2;
1043 G4ThreeVector point_3;
1047 if (mergerCoolingStr.
nCells == 0) {
1048 B2WARNING(
"ARICH geometry: no data available for merger " << iType <<
" cooling body geometry. Cooling body will not be placed.");
1052 for (
unsigned int i = 0; i < mergerCoolingStr.
nCells; i++) {
1054 point_1.setX(mergerCoolingStr.
posV1[0][i]);
1055 point_1.setY(mergerCoolingStr.
posV1[1][i]);
1056 point_1.setZ(mergerCoolingStr.
posV1[2][i]);
1058 point_2.setX(mergerCoolingStr.
posV2[0][i]);
1059 point_2.setY(mergerCoolingStr.
posV2[1][i]);
1060 point_2.setZ(mergerCoolingStr.
posV2[2][i]);
1062 point_3.setX(mergerCoolingStr.
posV3[0][i]);
1063 point_3.setY(mergerCoolingStr.
posV3[1][i]);
1064 point_3.setZ(mergerCoolingStr.
posV3[2][i]);
1066 G4TriangularFacet* facet =
new G4TriangularFacet(point_1, point_2, point_3, ABSOLUTE);
1067 volume_solid->AddFacet((G4VFacet*) facet);
1071 volume_solid->SetSolidClosed(
true);
1072 std::stringstream volName;
1073 volName <<
"ARICH.mergerCooling_" << + iType;
1074 G4LogicalVolume* volume_logical =
new G4LogicalVolume(volume_solid,
1077 setColor(*volume_logical,
"rgb(0.6,0.0,0.2,1.0)");
1079 return volume_logical;
1085 G4Box* singlemergerenvelope_solid =
new G4Box(
"singlemergerenvelope_solid",
1089 std::stringstream volName;
1090 volName <<
"ARICH.singleMergerEnvelope_" << + iType;
1091 return new G4LogicalVolume(singlemergerenvelope_solid,
Materials::get(
"ARICH_Air"), volName.str().c_str());
1100 B2WARNING(
"GeoARICHCreator: Merger and merger cooling geometry will not be build as it is not availible in geometry configuration (ARICHGeometryConfig with ClasDef>4 is needed).");
1107 G4LogicalVolume* envelope_logical =
new G4LogicalVolume(envelope_solid,
Materials::get(
"ARICH_Air"),
"ARICH.mergerEnvelope");
1110 G4LogicalVolume* merger_logical =
buildMerger(mergerGeo);
1111 G4LogicalVolume* mergerCooling_logical[12] = {NULL};
1112 G4LogicalVolume* mergerEnvelope_logical[12] = {NULL};
1115 G4RotationMatrix RaPCB;
1118 G4RotationMatrix RaMergerCooling;
1119 RaMergerCooling.rotateY(180 * deg);
1120 RaMergerCooling.rotateZ(-90 * deg);
1123 for (
int iType = 1; iType < 13; iType++) {
1126 setColor(*mergerEnvelope_logical[iType - 1],
"rgb(0.0,0.0,1.0,1.0)");
1128 new G4PVPlacement(G4Transform3D(RaPCB, TaPCB),
1131 mergerEnvelope_logical[iType - 1],
1135 if (mergerCooling_logical[iType - 1] == NULL)
continue;
1137 new G4PVPlacement(G4Transform3D(RaMergerCooling, TaMergerCooling),
1138 mergerCooling_logical[iType - 1],
1139 "ARICH.mergerCooling",
1140 mergerEnvelope_logical[iType - 1],
1146 for (
unsigned iSlot = 0; iSlot < mergerGeo.
getMergerSlotID().size(); iSlot++) {
1155 G4RotationMatrix Ra;
1157 new G4PVPlacement(G4Transform3D(Ra, Ta),
1158 mergerEnvelope_logical[type - 1],
1159 "ARICH.singleMergerEnvelope",
1165 return envelope_logical;
1172 G4Tubs* cablesEnvelope_solid =
new G4Tubs(
"cablesEnvelope_solid",
1178 G4LogicalVolume* cablesEnvelope_logical =
new G4LogicalVolume(cablesEnvelope_solid,
1180 "ARICH.cablesEnvelope");
1182 return cablesEnvelope_logical;
1192 double feb_alcooling_singleObjectEnvelope_sizeY = feb_alcooling_singleObjectEnvelope_sizeX * mm;
1197 double feb_alcooling_box1_sizeY = feb_alcooling_box1_sizeX;
1201 double feb_alcooling_box2_sizeY = feb_alcooling_box2_sizeX;
1204 double feb_alcooling_box3_sizeX = coolingv2Geo.
getRectangleW() * mm;
1205 double feb_alcooling_box3_sizeY = coolingv2Geo.
getRectangleL() * mm;
1208 double feb_alcooling_box1_X0 = feb_alcooling_box2_sizeX / 2.0 + feb_alcooling_box1_sizeX / 2.0;
1209 double feb_alcooling_box1_Y0 = feb_alcooling_box2_sizeY / 2.0 + feb_alcooling_box1_sizeY / 2.0;
1210 double feb_alcooling_box1_Z0 = 0.0 * mm;
1217 double feb_alcooling_box3_Y0 = feb_alcooling_box3_X0;
1218 double feb_alcooling_box3_Z0 = feb_alcooling_box1_sizeZ / 2.0 + feb_alcooling_box3_sizeZ / 2.0;
1219 double feb_alcooling_box3_angle = 45.0 * deg;
1221 G4RotationMatrix Ra;
1228 G4VSolid* feb_alcoolingEnvelope_solid =
new G4Box(
"feb_alcoolingEnvelope_solid",
1229 feb_alcooling_singleObjectEnvelope_sizeX / 2.0,
1230 feb_alcooling_singleObjectEnvelope_sizeY / 2.0,
1231 feb_alcooling_singleObjectEnvelope_sizeZ / 2.0);
1232 G4LogicalVolume* feb_alcoolingEnvelope_logical =
new G4LogicalVolume(feb_alcoolingEnvelope_solid,
Materials::get(
"Air"),
1233 "feb_alcoolingEnvelope_logical");
1235 G4VSolid* feb_alcooling_box1_solid =
new G4Box(
"feb_alcooling_box1_solid", feb_alcooling_box1_sizeX / 2.0,
1236 feb_alcooling_box1_sizeY / 2.0, feb_alcooling_box1_sizeZ / 2.0);
1237 G4VSolid* feb_alcooling_box2_solid =
new G4Box(
"feb_alcooling_box2_solid", feb_alcooling_box2_sizeX / 2.0,
1238 feb_alcooling_box2_sizeY / 2.0, feb_alcooling_box2_sizeZ / 2.0);
1239 G4VSolid* feb_alcooling_box3_solid =
new G4Box(
"feb_alcooling_box3_solid", feb_alcooling_box3_sizeX / 2.0,
1240 feb_alcooling_box3_sizeY / 2.0, feb_alcooling_box3_sizeZ / 2.0);
1245 Ta.setX(feb_alcooling_box1_X0);
1246 Ta.setY(feb_alcooling_box1_Y0);
1247 Ta.setZ(feb_alcooling_box1_Z0);
1248 Tr = G4Transform3D(Ra, Ta);
1249 G4UnionSolid* feb_alcooling_assembly01_solid =
new G4UnionSolid(
"feb_alcooling_assembly01_solid", feb_alcooling_box2_solid,
1250 feb_alcooling_box1_solid, Tr);
1254 Ta.setX(-feb_alcooling_box1_X0);
1255 Ta.setY(-feb_alcooling_box1_Y0);
1256 Ta.setZ(feb_alcooling_box1_Z0);
1257 Tr = G4Transform3D(Ra, Ta);
1258 G4UnionSolid* feb_alcooling_assembly02_solid =
new G4UnionSolid(
"feb_alcooling_assembly02_solid", feb_alcooling_assembly01_solid,
1259 feb_alcooling_box1_solid, Tr);
1263 Ta.setX(feb_alcooling_box3_X0);
1264 Ta.setY(feb_alcooling_box3_Y0);
1265 Ta.setZ(feb_alcooling_box3_Z0);
1266 Ra.rotateZ(-feb_alcooling_box3_angle);
1267 Tr = G4Transform3D(Ra, Ta);
1268 G4UnionSolid* feb_alcooling_assembly03_solid =
new G4UnionSolid(
"feb_alcooling_assembly03_solid", feb_alcooling_assembly02_solid,
1269 feb_alcooling_box3_solid, Tr);
1270 Ra.rotateZ(feb_alcooling_box3_angle);
1274 Ta.setX(-feb_alcooling_box3_X0);
1275 Ta.setY(-feb_alcooling_box3_Y0);
1276 Ta.setZ(feb_alcooling_box3_Z0);
1277 Ra.rotateZ(-feb_alcooling_box3_angle);
1278 Tr = G4Transform3D(Ra, Ta);
1279 G4UnionSolid* feb_alcooling_assembly_solid =
new G4UnionSolid(
"feb_alcooling_assembly_solid", feb_alcooling_assembly03_solid,
1280 feb_alcooling_box3_solid, Tr);
1281 Ra.rotateZ(feb_alcooling_box3_angle);
1283 G4LogicalVolume* feb_alcooling_assembly_logical =
new G4LogicalVolume(feb_alcooling_assembly_solid,
Materials::get(
"Al"),
1284 "feb_alcooling_assembly_logical");
1287 Ta.setZ(-feb_alcooling_box3_sizeZ / 2.0);
1289 Tr = G4Transform3D(Ra, Ta);
1290 new G4PVPlacement(Tr,
1291 feb_alcooling_assembly_logical,
1292 "feb_alcooling_assembly",
1293 feb_alcoolingEnvelope_logical,
1297 return feb_alcoolingEnvelope_logical;
1303 B2ASSERT(
"ARICH cooling geometry ID (G4Tube) is wrong : coolingGeo.getCoolingGeometryID.at(i_volumeID) != 1",
1305 G4Tubs* coolingTube_solid =
new G4Tubs(
"coolingTube_solid",
1308 coolingGeo.
getCoolingL().at(i_volumeID) * mm / 2.0,
1318 B2ASSERT(
"ARICH cooling geometry ID (G4Torus) is wrong : coolingGeo.getCoolingGeometryID.at(i_volumeID) != 2",
1326 G4Torus* coolingTorus_solid =
new G4Torus(
"coolingTorus_solid",
1340 G4Tubs* coolingEnvelope_solid =
new G4Tubs(
"coolingEnvelope_solid",
1346 G4LogicalVolume* coolingEnvelope_logical =
new G4LogicalVolume(coolingEnvelope_solid,
1348 "ARICH.coolingEnvelope");
1352 for (
unsigned i = 0; i < nComponents; i++) {
1356 G4RotationMatrix Ra;
1357 G4LogicalVolume* coolingComponentLV;
1360 Ta.set(r * cos(phi), r * sin(phi), 0);
1363 Ra.rotateY(90.0 * deg);
1370 B2FATAL(
"ARICH cooling geometry component ID is wrong");
1372 new G4PVPlacement(G4Transform3D(Ra, Ta),
1375 coolingEnvelope_logical,
1380 return coolingEnvelope_logical;
1387 G4Box* coolingTestPlateEnvelop_solid =
new G4Box(
"coolingTestPlateEnvelop_solid",
1391 G4LogicalVolume* coolingTestPlateEnvelop_logical =
new G4LogicalVolume(coolingTestPlateEnvelop_solid,
Materials::get(
"Air"),
1392 "ARICH.coolingTestPlateEnvelop");
1394 G4Box* coolingTestPlate_solid =
new G4Box(
"coolingTestPlate_solid",
1400 G4VSolid* coldTubeSubtracted_solid =
new G4Tubs(
"coldTubeSubtracted_solid",
1407 G4VSolid* coldTube_solid =
new G4Tubs(
"coldTube_solid",
1415 G4RotationMatrix Ra_sub;
1416 G4ThreeVector Ta_sub;
1417 G4Transform3D Tr_sub;
1421 Ra_sub.rotateY(90.0 * deg);
1422 Tr_sub = G4Transform3D(Ra_sub, Ta_sub);
1423 G4SubtractionSolid* substraction_solid =
new G4SubtractionSolid(
"substraction_solid", coolingTestPlate_solid,
1424 coldTubeSubtracted_solid, Tr_sub);
1430 Tr_sub = G4Transform3D(Ra_sub, Ta_sub);
1431 substraction_solid =
new G4SubtractionSolid(
"substraction_solid", substraction_solid, coldTubeSubtracted_solid, Tr_sub);
1434 G4LogicalVolume* coolingTestPlate_logical =
new G4LogicalVolume(substraction_solid,
1437 new G4PVPlacement(G4Transform3D(),
1438 coolingTestPlate_logical,
1439 "ARICH.coolingTestPlate",
1440 coolingTestPlateEnvelop_logical,
1444 G4RotationMatrix Ra;
1447 Ra.rotateY(90.0 * deg);
1453 Tr = G4Transform3D(Ra, Ta);
1454 new G4PVPlacement(Tr,
1457 coolingTestPlateEnvelop_logical,
1462 return coolingTestPlateEnvelop_logical;
1474 G4LogicalVolume* detSupportLV =
new G4LogicalVolume(supportTube, supportMaterial,
"ARICH.detectorSupportPlate");
1481 G4LogicalVolume* holeLV =
new G4LogicalVolume(hole,
Materials::get(
"Air"),
"ARICH.detectorSupportHole");
1484 std::vector<G4LogicalVolume*> hapdBackRadialWallLV;
1488 G4LogicalVolume* hapdSupportPlateLV =
new G4LogicalVolume(supportPlate, supportMaterial,
"hapdSupport");
1490 std::vector<double> wallR;
1491 wallR.assign(nRings + 1, 0);
1492 std::vector<double> thickR;
1493 thickR.assign(nRings + 1, 0);
1495 for (
int i = 1; i < nRings; i++) {
1497 double rp1 = detGeo.
getRingR(i + 1);
1498 wallR[i] = (rp1 + rm1) / 2.;
1500 wallR[0] = rm1 - (rp1 - rm1) / 2.;
1502 if (i == nRings - 1) {
1503 wallR[i + 1] = rp1 + (rp1 - rm1) / 2.;
1507 for (
int i = 0; i < nRings + 1; i++) {
1508 std::stringstream ringName1;
1509 ringName1 <<
"backWall_" << i;
1510 thickR[i] = backWallThick;
1512 thickR[i] = 2.*backWallThick;
1515 G4Tubs* backTube =
new G4Tubs(
"hapdBackRing", wallR[i] - thickR[i] / 2., wallR[i] + thickR[i] / 2., backWallHeight / 2., 0,
1517 G4LogicalVolume* hapdBackTubeLV =
new G4LogicalVolume(backTube, supportMaterial,
"backTube");
1519 new G4PVPlacement(transform3, hapdBackTubeLV,
"backTube", detSupportLV,
false, 1);
1520 if (i == 0)
continue;
1522 G4Box* backRadial =
new G4Box(
"backRadialBox", (wallR[i] - wallR[i - 1] - thickR[i] / 2. - thickR[i - 1] / 2.) / 2. - 1.,
1523 backWallThick / 2., backWallHeight / 2.);
1524 hapdBackRadialWallLV.push_back(
new G4LogicalVolume(backRadial, supportMaterial, ringName1.str().c_str()));
1527 G4SubtractionSolid* substraction = NULL;
1531 B2WARNING(
"GeoARICHCreator: No FEB colling body geometry available so they will not be placed (ARICHGeometryConfig with ClasDef>4 is needed).");
1532 return detSupportLV;
1537 for (
unsigned iSlot = 1; iSlot < nSlots + 1; iSlot++) {
1539 double r = (wallR[iRing] + wallR[iRing - 1]) / 2. - (thickR[iRing] - thickR[iRing - 1]) / 2.;
1542 G4ThreeVector trans(r * cos(phi), r * sin(phi), 0);
1543 G4RotationMatrix Ra;
1546 new G4PVPlacement(G4Transform3D(Ra, trans), holeLV,
"hole", hapdSupportPlateLV,
false, iSlot);
1547 if (substraction) substraction =
new G4SubtractionSolid(
"Box+CylinderMoved", substraction, hole, G4Transform3D(Ra, trans));
1548 else substraction =
new G4SubtractionSolid(
"Box+CylinderMoved", supportPlate, hole, G4Transform3D(Ra, trans));
1552 G4RotationMatrix RaBack;
1553 RaBack.rotateZ(phi);
1554 new G4PVPlacement(G4Transform3D(RaBack, transBack), hapdBackRadialWallLV[iRing - 1],
"hapdBack", detSupportLV,
false, iSlot);
1557 G4ThreeVector febCoolingTa;
1558 G4Transform3D febCoolingTr;
1559 febCoolingTa.setX(r * cos(detGeo.
getSlotPhi(iSlot)));
1560 febCoolingTa.setY(r * sin(detGeo.
getSlotPhi(iSlot)));
1565 double febCooling_envelope_Z0 = -supportTube_envelope_dZ / 2.0 + febCooling_envelope_dZ / 2.0 + detGeo.
getSupportThickness();
1566 febCoolingTa.setZ(febCooling_envelope_Z0);
1570 if (febcoolingv2GeometryID == 2) Ra.rotateZ(90.0 * deg);
1572 febCoolingTr = G4Transform3D(Ra, febCoolingTa);
1574 if (febcoolingv2GeometryID != 0) {
1577 new G4PVPlacement(febCoolingTr,
1588 G4Transform3D transform3 = G4Translate3D(0., 0., - backWallHeight / 2.);
1589 new G4PVPlacement(transform3, hapdSupportPlateLV,
"supportPlate", detSupportLV,
false, 1);
1592 G4Box* shieldBox1 =
new G4Box(
"shieldBox1", 20. / 2., 75. / 2., backWallHeight / 2.);
1593 G4Box* shieldBox2 =
new G4Box(
"shieldBox2", 55. / 2., 40. / 2., backWallHeight / 2.);
1594 G4LogicalVolume* shield1 =
new G4LogicalVolume(shieldBox1,
Materials::get(
"BoratedPoly"),
"ARICH.FWDShield1");
1595 G4LogicalVolume* shield2 =
new G4LogicalVolume(shieldBox2,
Materials::get(
"BoratedPoly"),
"ARICH.FWDShield2");
1596 double dphi = 2 * M_PI / 36.;
1597 double r1 = wallR[0] - 15.;
1598 double r2 = wallR[0] - 15. - 20. / 2. - 55. / 2.;
1599 for (
int i = 0; i < 36; i++) {
1600 double phi = (i + 0.5) * dphi;
1601 G4RotationMatrix rot;
1605 new G4PVPlacement(G4Transform3D(rot, trans), shield1,
"ARICH.FWDShield1", detSupportLV,
false, i);
1606 new G4PVPlacement(G4Transform3D(rot, trans1), shield2,
"ARICH.FWDShield2", detSupportLV,
false, i);
1609 return detSupportLV;
1626 G4Box* mirrPlate =
new G4Box(
"mirrPlate", mThick / 2., mLength / 2., mWidth / 2.);
1628 G4LogicalVolume* lmirror =
new G4LogicalVolume(mirrPlate, mirrorMaterial,
"ARICH.mirrorPlate");
1633 new G4LogicalSkinSurface(
"mirrorSurface", lmirror, optSurf);
1641 G4MaterialPropertiesTable* mTable = material->GetMaterialPropertiesTable();
1642 if (!mTable)
return 0;
1643 G4MaterialPropertyVector* mVector = mTable->GetProperty(
"RINDEX");
1644 if (!mVector)
return 0;
1652 int size = par.size();
1653 if (size < 4 || size > 8) B2ERROR(
"GeoARICHCreator::makeJoint: invalid number of joint wedge parameters");
1654 double lenx = par.at(0);
1655 double leny = par.at(1);
1656 double lenz = par.at(2);
1657 double thick = par.at(3);
1659 G4Box* wedgeBox1 =
new G4Box(
"wedgeBox1", thick / 2., lenx / 2., leny / 2.);
1660 G4Box* wedgeBox2 =
new G4Box(
"wedgeBox2", lenz / 2., lenx / 2., thick / 2.);
1662 G4LogicalVolume* wedgeBox1LV =
new G4LogicalVolume(wedgeBox1, supportMaterial,
"ARICH.supportWedge");
1663 G4LogicalVolume* wedgeBox2LV =
new G4LogicalVolume(wedgeBox2, supportMaterial,
"ARICH.supportWedge");
1665 G4RotationMatrix Rm;
1666 G4ThreeVector Ta(0, 0, 0);
1668 Tr = G4Transform3D(Rm, Ta);
1670 assemblyWedge->AddPlacedVolume(wedgeBox1LV, Tr);
1672 Ta.setX(lenz / 2. + thick / 2.);
1673 Ta.setZ(leny / 2. - thick / 2.);
1674 Tr = G4Transform3D(Rm, Ta);
1675 assemblyWedge->AddPlacedVolume(wedgeBox2LV, Tr);
1677 if (size == 4)
return;
1678 double edge = par.at(4);
1680 G4Box* wedgeBox3 =
new G4Box(
"wedgeBox3", lenz / 2., edge / 2., thick / 2.);
1681 G4LogicalVolume* wedgeBox3LV =
new G4LogicalVolume(wedgeBox3, supportMaterial,
"ARICH.supportWedge");
1683 Ta.setZ(leny / 2. - thick - thick / 2.);
1684 Tr = G4Transform3D(Rm, Ta);
1685 assemblyWedge->AddPlacedVolume(wedgeBox3LV, Tr);
1687 G4Trap* wedgeBoxTmp =
new G4Trap(
"wedgeBoxTmp", thick, leny - 2 * thick, lenz, edge);
1688 G4LogicalVolume* wedgeBox4LV;
1690 G4Tubs* wedgeBoxTmp1 =
new G4Tubs(
"wedgeBoxTmp1", 0.0, par.at(5), thick, 0, 2.*M_PI);
1691 G4RotationMatrix rotHole;
1692 G4ThreeVector transHole(par.at(6), par.at(7), 0);
1693 G4SubtractionSolid* wedgeBox4 =
new G4SubtractionSolid(
"wedgeBox4", wedgeBoxTmp, wedgeBoxTmp1, G4Transform3D(rotHole, transHole));
1694 wedgeBox4LV =
new G4LogicalVolume(wedgeBox4, supportMaterial,
"ARICH.supportWedge");
1695 }
else wedgeBox4LV =
new G4LogicalVolume(wedgeBoxTmp, supportMaterial,
"ARICH.supportWedge");
1697 Rm.rotateX(-M_PI / 2.);
1698 Ta.setX(thick / 2. + edge / 4. + lenz / 4.);
1699 Ta.setZ(-thick / 2. - edge / 2.);
1700 Tr = G4Transform3D(Rm, Ta);
1701 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 thikness just after aerogel layers used as volume to which tracks are extrapolated...
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 aroud Z - axis of the cooling system object in polar coordi...
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 lenght.
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 paramaters.
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