From 4c96c83116e6535ca2e37a3d6e4d7bd5008a1edd Mon Sep 17 00:00:00 2001 From: Simon Neuhaus <sneuhaus@lxbuild07.gsi.de> Date: Wed, 26 Feb 2025 11:38:42 +0100 Subject: [PATCH 1/4] update Geometry of Rich detector to version v25a Redesign of the mirror holders Replace old MirrorSupportBelts by new MirrorFixing which looks like the CAD model and the prototype Add a small plate at end of mirror support studs to fit the weight Fixing all overlaps in the geometry Fixing newly discovered bug in implementation of exit window change of geometry hierarchy at exit window similar change at entrance window to avoid potential of similar bug Additionally small changes (small regarding physics impact) changes in the volume hierarchy to reduce the depth changes in code of creator file to make it more efficient replacing some hard coded numbers by variables replacing double definitions of same volumes by copying --- macro/rich/create_rich_geo.C | 10 +- sim/detectors/rich/geo/RichGeoCreator.cxx | 704 ++++++++++++++-------- sim/detectors/rich/geo/RichGeoCreator.h | 18 +- 3 files changed, 465 insertions(+), 267 deletions(-) diff --git a/macro/rich/create_rich_geo.C b/macro/rich/create_rich_geo.C index dc1a3fb6ca..d671999354 100644 --- a/macro/rich/create_rich_geo.C +++ b/macro/rich/create_rich_geo.C @@ -5,8 +5,14 @@ void create_rich_geo() { RichGeoCreator* geoCreator = new RichGeoCreator(); - geoCreator->SetGeoName("rich_v22b"); - geoCreator->SetAddShieldingBox(false); + //geoCreator->SetGeoName("rich_v25a"); + geoCreator->SetAddShieldingBox(true); geoCreator->SetVolumeColors(false); geoCreator->Create(); + + // Add (dummy) translation to geo file + TFile* geoFile = new TFile((geoCreator->GetGeoName() + ".geo.root").c_str(), "UPDATE"); + TGeoTranslation* translation = new TGeoTranslation("rich_trans", 0., 0., 0.); + translation->Write(); + geoFile->Close(); } diff --git a/sim/detectors/rich/geo/RichGeoCreator.cxx b/sim/detectors/rich/geo/RichGeoCreator.cxx index 4306d7c9a3..d48feb6fe0 100644 --- a/sim/detectors/rich/geo/RichGeoCreator.cxx +++ b/sim/detectors/rich/geo/RichGeoCreator.cxx @@ -24,7 +24,6 @@ using namespace std; -// using TMath::ACos; using TMath::ASin; using TMath::ATan; using TMath::Cos; @@ -43,10 +42,6 @@ void RichGeoCreator::Create() CalculateParams(); - // TGeoVolume* vol = CreateMirrorSupportBelts(); - // vol->Draw("ogl"); - // vol->Export("rich_volume.root"); - CreateRich(); } @@ -113,29 +108,43 @@ TGeoVolume* RichGeoCreator::CreatePmt() double xC = (x - 3.5) * fPixelSize; if (x == 0) xC = -edgePxPos; if (x == 7) xC = edgePxPos; + bool isXEdge = (x == 0 || x == fNofPixels - 1); + for (int y = 0; y < fNofPixels; y++) { double yC = (y - 3.5) * fPixelSize; if (y == 0) yC = edgePxPos; if (y == 7) yC = -edgePxPos; - bool isXEdge = (x == 0 || x == fNofPixels - 1); bool isYEdge = (y == 0 || y == fNofPixels - 1); - TGeoVolume* curPmtPixel = pixel; - if (isXEdge) curPmtPixel = pixelX; - if (isYEdge) curPmtPixel = pixelY; - if (isXEdge && isYEdge) curPmtPixel = pixelCorner; + TGeoVolume* curPmtPixel; + if (isXEdge) { + if (isYEdge) { + curPmtPixel = pixelCorner; + } + else { + curPmtPixel = pixelX; + } + } + else { + if (isYEdge) { + curPmtPixel = pixelY; + } + else { + curPmtPixel = pixel; + } + } pmt->AddNode(curPmtPixel, copyNum, MakeTrans(xC, yC, zC)); copyNum++; } } - TGeoBBox* pmtContPB = new TGeoBBox("pmt_cont_PB", pmtSizeHalf, pmtSizeHalf, pmtDepthHalf); - TGeoVolume* pmtCont = new TGeoVolume("pmt_cont", pmtContPB, fMaterials.GetMedium("RICHgas_CO2_dis")); - pmtCont->AddNode(pmt, 1, MakeTrans(0., 0., 0.)); + //TGeoBBox* pmtContPB = new TGeoBBox("pmt_cont_PB", pmtSizeHalf, pmtSizeHalf, pmtDepthHalf); + //TGeoVolume* pmtCont = new TGeoVolume("pmt_cont", pmtContPB, fMaterials.GetMedium("RICHgas_CO2_dis")); + //pmtCont->AddNode(pmt, 1, MakeTrans(0., 0., 0.)); //if (fSetVolumeColors) pmtCont->SetLineColor(kRed - 4); - return pmtCont; + return pmt; } @@ -292,7 +301,102 @@ TGeoVolumeAssembly* RichGeoCreator::CreateMirror() return mHalf; } -TGeoVolume* RichGeoCreator::CreateStuds(double ypos, double lenHalf, double angle) +TGeoVolumeAssembly* RichGeoCreator::CreateMirrorFixing(const string& sides) +{ + if (sides != "both" and sides != "left" and sides != "right" and sides != "none") { + cout << "unknown value " << sides << " for sides in function CreateMirrorFixing" << endl; + } + TGeoMedium* medGas = fMaterials.GetMedium("RICHgas_CO2_dis"); + TGeoMedium* medAl = fMaterials.GetMedium("aluminium"); + double distanceHalf = 19.414 / 2; + + double widthHalf = 28.0 / 2; + double lengthHalf = 25.017 / 2; + double heightHalf = 2.8 / 2; + double thicknessHalf = 0.3 / 2; + double neckHalf = 9.884 / 2; + double partwidthHalf = 3.0 / 2; + double sidelenghtHalf = 14.009 / 2; + double sidewidthHalf = 2.0 / 2; + + TGeoVolumeAssembly* mirrorFixing = new TGeoVolumeAssembly("mirrorfixing"); + TGeoBBox* triangleSurrounding = new TGeoBBox("mirrorfixingtrianglesurrounding", lengthHalf, widthHalf, heightHalf); + TGeoVolume* triangle = new TGeoVolume("mirrorfixingtriangle", triangleSurrounding, medGas); + + TGeoBBox* pbbase = new TGeoBBox(partwidthHalf, widthHalf, heightHalf); + TGeoBBox* pbbaseGas = new TGeoBBox(partwidthHalf - 2 * thicknessHalf, widthHalf - 3 - 1.897, heightHalf); + TGeoVolume* base = new TGeoVolume("base", pbbase, medAl); + TGeoVolume* baseGas = new TGeoVolume("baseGas", pbbaseGas, medGas); + base->AddNode(baseGas, 1); + triangle->AddNode(base, 1, MakeTrans(-lengthHalf + partwidthHalf, 0, 0)); + + // creating the sides of the diagonal part as thin boxes (avoid problem with the not 90° angles) + double lenleg1 = sidelenghtHalf - 2 * sidewidthHalf / Sin(60 * pi / 180); + double lenleg2 = sidelenghtHalf + (sidewidthHalf - thicknessHalf) / Sin(60 * pi / 180) - partwidthHalf; + TGeoBBox* pbleg1 = new TGeoBBox(lenleg1, thicknessHalf, heightHalf); + TGeoBBox* pbleg2 = new TGeoBBox(lenleg2, thicknessHalf, heightHalf); + TGeoVolume* leg1 = new TGeoVolume("leg1", pbleg1, medAl); + TGeoVolume* leg2 = new TGeoVolume("leg2", pbleg2, medAl); + triangle->AddNode(leg1, 1, + MakeCombiTrans(-neckHalf + partwidthHalf - sidewidthHalf / Sin(60 * pi / 180), + -lenleg1 * Sin(30 * pi / 180) - thicknessHalf * Cos(30 * pi / 180), 0, 0, 0, 30)); + triangle->AddNode(leg2, 1, + MakeCombiTrans(-neckHalf + partwidthHalf, + -2 * (sidewidthHalf - 2 * thicknessHalf) - lenleg2 * Sin(30 * pi / 180) + + thicknessHalf * Cos(30 * pi / 180), + 0, 0, 0, 30)); + triangle->AddNode(leg1, 2, + MakeCombiTrans(-neckHalf + partwidthHalf - sidewidthHalf / Sin(60 * pi / 180), + lenleg1 * Sin(30 * pi / 180) + thicknessHalf * Cos(30 * pi / 180), 0, 0, 0, -30)); + triangle->AddNode(leg2, 2, + MakeCombiTrans(-neckHalf + partwidthHalf, + 2 * (sidewidthHalf - 2 * thicknessHalf) + lenleg2 * Sin(30 * pi / 180) + - thicknessHalf * Cos(30 * pi / 180), + 0, 0, 0, -30)); + + TGeoBBox* pbneck = new TGeoBBox(neckHalf, partwidthHalf, heightHalf); + TGeoBBox* pbneckGas = new TGeoBBox(neckHalf - 4.7, partwidthHalf - 2 * thicknessHalf, heightHalf); + TGeoVolume* neck = new TGeoVolume("neck", pbneck, medAl); + TGeoVolume* neckGas = new TGeoVolume("neckGas", pbneckGas, medGas); + neck->AddNode(neckGas, 1, MakeTrans(-2.35, 0, 0)); + triangle->AddNode(neck, 1, MakeTrans(lengthHalf - neckHalf, 0, 0)); + + if (sides == "both" or sides == "right") { + mirrorFixing->AddNode(triangle, 1, MakeTrans(distanceHalf + lengthHalf, 0, 0)); + } + if (sides == "both" or sides == "left") { + mirrorFixing->AddNode(triangle, 2, MakeCombiTrans(-distanceHalf - lengthHalf, 0, 0, 0, 0, 180)); + } + if (sides == "left" or sides == "right") { + TGeoBBox* pbconnection = new TGeoBBox("connectionMirrorfixing", distanceHalf / 2, partwidthHalf, heightHalf); + TGeoBBox* pbconnectionGas = new TGeoBBox("connectionMirrorfixingGas", distanceHalf / 2, + partwidthHalf - 2 * thicknessHalf, heightHalf - 2 * thicknessHalf); + TGeoVolume* connection = new TGeoVolume("connectionMirrorfixing", pbconnection, medAl); + TGeoVolume* connectionGas = new TGeoVolume("connectionMirrorfixingGas", pbconnectionGas, medGas); + connection->AddNode(connectionGas, 1); + if (sides == "right") { + mirrorFixing->AddNode(connection, 1, MakeTrans(distanceHalf / 2, sidelenghtHalf + partwidthHalf, 0)); + mirrorFixing->AddNode(connection, 2, MakeTrans(distanceHalf / 2, -sidelenghtHalf - partwidthHalf, 0)); + } + else { + mirrorFixing->AddNode(connection, 1, MakeTrans(-distanceHalf / 2, sidelenghtHalf + partwidthHalf, 0)); + mirrorFixing->AddNode(connection, 2, MakeTrans(-distanceHalf / 2, -sidelenghtHalf - partwidthHalf, 0)); + } + } + else { + TGeoBBox* pbconnection = new TGeoBBox("connectionMirrorfixing", distanceHalf, partwidthHalf, heightHalf); + TGeoBBox* pbconnectionGas = new TGeoBBox("connectionMirrorfixingGas", distanceHalf, + partwidthHalf - 2 * thicknessHalf, heightHalf - 2 * thicknessHalf); + TGeoVolume* connection = new TGeoVolume("connectionMirrorfixing", pbconnection, medAl); + TGeoVolume* connectionGas = new TGeoVolume("connectionMirrorfixingGas", pbconnectionGas, medGas); + connection->AddNode(connectionGas, 1); + mirrorFixing->AddNode(connection, 1, MakeTrans(0, sidelenghtHalf + partwidthHalf, 0)); + mirrorFixing->AddNode(connection, 2, MakeTrans(0, -sidelenghtHalf - partwidthHalf, 0)); + } + return mirrorFixing; +} + +TGeoVolume* RichGeoCreator::CreateStuds(double ypos, double lenHalf, double angle, const string& mirrorfixing) { TGeoMedium* medGas = fMaterials.GetMedium("RICHgas_CO2_dis"); TGeoMedium* medAl = fMaterials.GetMedium("aluminium"); @@ -302,17 +406,31 @@ TGeoVolume* RichGeoCreator::CreateStuds(double ypos, double lenHalf, double angl double lenHalf1 = lenHalf + Tan(angle * pi / 180) * StudsSizeHalf / 2; double lenHalf2 = lenHalf - Tan(angle * pi / 180) * StudsSizeHalf / 2; double alpha1 = angle / 2; + double gaslencor = (StudsSizeHalf - StudsSizeHalfGas) * Tan(angle * pi / 180) / 2; - TGeoTrap* StudsGas = new TGeoTrap("StudsGas_Trap", StudsSizeHalfGas, 0, 0, StudsSizeHalfGas, lenHalf1, lenHalf2, - alpha1, StudsSizeHalfGas, lenHalf1, lenHalf2, alpha1); + TGeoTrap* StudsGas = + new TGeoTrap("StudsGas_Trap", StudsSizeHalfGas, 0, 0, StudsSizeHalfGas, lenHalf1 - gaslencor, lenHalf2 + gaslencor, + alpha1, StudsSizeHalfGas, lenHalf1 - gaslencor, lenHalf2 + gaslencor, alpha1); TGeoTrap* Studs = new TGeoTrap("Studs_Trap", StudsSizeHalf, 0, 0, StudsSizeHalf, lenHalf1, lenHalf2, alpha1, StudsSizeHalf, lenHalf1, lenHalf2, alpha1); TGeoVolume* volStudsGas = new TGeoVolume("StudsGas", StudsGas, medGas); TGeoVolume* volStuds = new TGeoVolume("Studs", Studs, medAl); volStuds->AddNode(volStudsGas, 1); - TGeoVolume* returnVol = new TGeoVolumeAssembly("Stud"); - returnVol->AddNode(volStuds, 1, MakeCombiTrans(0, ypos, lenHalf, 0, 90, 0)); + TGeoVolume* returnVol = new TGeoVolumeAssembly(("Stud" + std::to_string(lenHalf * 2)).c_str()); + returnVol->AddNode( + volStuds, 1, MakeCombiTrans(0, ypos, lenHalf + 5 / 2, 0, 90, 0)); // the 5 is the half thickness of the pillars + + double endPlatelenHalf = 7; + double endPlateWidthHalf = endPlatelenHalf; + double endPlateThicknessHalf = 0.79 / 2; + TGeoBBox* endPlate = new TGeoBBox("StudEndPlate", endPlatelenHalf, endPlateWidthHalf, endPlateThicknessHalf); + TGeoVolume* volendPlate = new TGeoVolume("StudEndPlate", endPlate, medAl); + returnVol->AddNode(volendPlate, 1, MakeCombiTrans(0, ypos, 2 * lenHalf + 5.0 / 2.0, -angle, 0, 0)); + + TGeoVolumeAssembly* mirrorFixing = CreateMirrorFixing(mirrorfixing); + returnVol->AddNode(mirrorFixing, 1, MakeCombiTrans(0, ypos, 2 * lenHalf + 5.0 / 2.0, -angle, 0, 0)); + return returnVol; } @@ -326,10 +444,12 @@ TGeoVolume* RichGeoCreator::CreatePillarConnection() double hightHalf = 1.25; double thickness = 0.2; double lendiff = widthHalf * Tan(8.5 * pi / 180); + double gaslencor = (thickness) * (lendiff) / (widthHalf); TGeoTrap* PillarConnectionGas = - new TGeoTrap("PillarConnectionGas_Trap", hightHalf - thickness, 0, 0, widthHalf - thickness, lenHalf + lendiff, - lenHalf - lendiff, 0, widthHalf - thickness, lenHalf + lendiff, lenHalf - lendiff, 0); + new TGeoTrap("PillarConnectionGas_Trap", hightHalf - thickness, 0, 0, widthHalf - thickness, + lenHalf + lendiff - gaslencor, lenHalf - lendiff + gaslencor, 0, widthHalf - thickness, + lenHalf + lendiff - gaslencor, lenHalf - lendiff + gaslencor, 0); TGeoTrap* PillarConnection = new TGeoTrap("PillarConnection_Trap", hightHalf, 0, 0, widthHalf, lenHalf + lendiff, lenHalf - lendiff, 0, widthHalf, lenHalf + lendiff, lenHalf - lendiff, 0); TGeoVolume* volPillarConnectionGas = new TGeoVolume("PillarConnectionGas", PillarConnectionGas, medGas); @@ -354,168 +474,228 @@ TGeoVolumeAssembly* RichGeoCreator::CreateMirrorSupportPillars() //if (fSetVolumeColors) vol->SetLineColor(kAzure + 5); vol->AddNode(volGas, 1); - TGeoVolumeAssembly* StudsHalf = new TGeoVolumeAssembly("Studs_Half"); - StudsHalf->AddNode(CreateStuds(16.4, 30.03 / 2., 24.2), 1); - StudsHalf->AddNode(CreateStuds(57.8, 14.86 / 2., 15.9), 2); - StudsHalf->AddNode(CreateStuds(101.05, 5.74 / 2., 7.7), 3); - StudsHalf->AddNode(CreateStuds(145.4, 2.9 / 2., -0.5), 4); - - vol->AddNode(StudsHalf, 1, MakeCombiTrans(0, 0., -5, 0, 180, 0)); - vol->AddNode(StudsHalf, 2, MakeCombiTrans(0, 0., -5, 0, 180, 180)); + TGeoVolume* Stud1b = CreateStuds(16.4, 30.03 / 2., 24.2, "both"); + TGeoVolume* Stud2b = CreateStuds(57.8, 14.86 / 2., 15.9, "both"); + TGeoVolume* Stud3b = CreateStuds(101.05, 5.74 / 2., 7.7, "both"); + TGeoVolume* Stud4b = CreateStuds(145.4, 2.9 / 2., -0.5, "both"); + TGeoVolume* Stud1l = CreateStuds(16.4, 30.03 / 2., 24.2, "left"); + TGeoVolume* Stud2l = CreateStuds(57.8, 14.86 / 2., 15.9, "left"); + TGeoVolume* Stud3l = CreateStuds(101.05, 5.74 / 2., 7.7, "left"); + TGeoVolume* Stud4l = CreateStuds(145.4, 2.9 / 2., -0.5, "left"); + TGeoVolume* Stud1r = CreateStuds(16.4, 30.03 / 2., 24.2, "right"); + TGeoVolume* Stud2r = CreateStuds(57.8, 14.86 / 2., 15.9, "right"); + TGeoVolume* Stud3r = CreateStuds(101.05, 5.74 / 2., 7.7, "right"); + TGeoVolume* Stud4r = CreateStuds(145.4, 2.9 / 2., -0.5, "right"); + + TGeoVolumeAssembly* Studs = new TGeoVolumeAssembly("Studs"); + Studs->AddNode(Stud1b, 1, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs->AddNode(Stud2b, 2, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs->AddNode(Stud3b, 3, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs->AddNode(Stud4b, 4, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs->AddNode(Stud1b, 5, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + Studs->AddNode(Stud2b, 6, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + Studs->AddNode(Stud3b, 7, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + Studs->AddNode(Stud4b, 8, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + + TGeoVolumeAssembly* Studs1 = new TGeoVolumeAssembly("Studs1"); + Studs1->AddNode(Stud1r, 1, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs1->AddNode(Stud2r, 2, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs1->AddNode(Stud3r, 3, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs1->AddNode(Stud4r, 4, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs1->AddNode(Stud1l, 5, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + Studs1->AddNode(Stud2l, 6, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + Studs1->AddNode(Stud3l, 7, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + Studs1->AddNode(Stud4l, 8, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + + TGeoVolumeAssembly* Studs6 = new TGeoVolumeAssembly("Studs6"); + Studs6->AddNode(Stud1l, 1, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs6->AddNode(Stud2l, 2, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs6->AddNode(Stud3l, 3, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs6->AddNode(Stud4l, 4, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs6->AddNode(Stud1r, 5, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + Studs6->AddNode(Stud2r, 6, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + Studs6->AddNode(Stud3r, 7, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + Studs6->AddNode(Stud4r, 8, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + + TGeoVolumeAssembly* Studs3 = new TGeoVolumeAssembly("Studs3"); + Studs3->AddNode(Stud1l, 1, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs3->AddNode(Stud2b, 2, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs3->AddNode(Stud3b, 3, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs3->AddNode(Stud4b, 4, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs3->AddNode(Stud1r, 5, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + Studs3->AddNode(Stud2b, 6, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + Studs3->AddNode(Stud3b, 7, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + Studs3->AddNode(Stud4b, 8, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + + TGeoVolumeAssembly* Studs4 = new TGeoVolumeAssembly("Studs4"); + Studs4->AddNode(Stud1r, 1, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs4->AddNode(Stud2b, 2, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs4->AddNode(Stud3b, 3, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs4->AddNode(Stud4b, 4, MakeCombiTrans(0, 0, -5, 0, 180, 0)); + Studs4->AddNode(Stud1l, 5, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + Studs4->AddNode(Stud2b, 6, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + Studs4->AddNode(Stud3b, 7, MakeCombiTrans(0, 0, -5, 0, 180, 180)); + Studs4->AddNode(Stud4b, 8, MakeCombiTrans(0, 0, -5, 0, 180, 180)); TGeoVolume* PillarConnection = CreatePillarConnection(); double dZ = 41.; TGeoVolumeAssembly* pillars = new TGeoVolumeAssembly("mirror_support_pillars"); pillars->AddNode(vol, 1, MakeCombiTrans(210.7759 - 2.035, 0., -29.5298 + dZ - 12.4346, 0., 42., 0.)); + pillars->AddNode(Studs1, 1, MakeCombiTrans(210.7759 - 2.035, 0., -29.5298 + dZ - 12.4346, 0., 42., 0.)); pillars->AddNode(PillarConnection, 1, MakeCombiTrans(170.7323, 0., -15.9069 + dZ, 0., 33.6, 0.)); pillars->AddNode(vol, 2, MakeCombiTrans(134.1222 - 1.3985, 0., 21.3989 + dZ - 11.2483, 0., 25.2, 0.)); + pillars->AddNode(Studs, 1, MakeCombiTrans(134.1222 - 1.3985, 0., 21.3989 + dZ - 11.2483, 0., 25.2, 0.)); pillars->AddNode(PillarConnection, 2, MakeCombiTrans(89.097, 0., 23.74 + dZ, 0., 16.8, 0.)); pillars->AddNode(vol, 3, MakeCombiTrans(46.015 - 0.545, 0., 48. + dZ - 10.6668, 0., 8.4, 0.)); + pillars->AddNode(Studs3, 1, MakeCombiTrans(46.015 - 0.545, 0., 48. + dZ - 10.6668, 0., 8.4, 0.)); pillars->AddNode(PillarConnection, 3, MakeCombiTrans(0., 38.75, 37.34 + dZ, 0., 0., 0.)); pillars->AddNode(PillarConnection, 4, MakeCombiTrans(0., -38.75, 37.34 + dZ, 0., 0., 0.)); pillars->AddNode(vol, 4, MakeCombiTrans(-46.015 + 0.545, 0., 48. + dZ - 10.6668, 0., -8.4, 0.)); + pillars->AddNode(Studs4, 1, MakeCombiTrans(-46.015 + 0.545, 0., 48. + dZ - 10.6668, 0., -8.4, 0.)); pillars->AddNode(PillarConnection, 5, MakeCombiTrans(-89.097, 0., 23.74 + dZ, 0., -16.8, 0.)); pillars->AddNode(vol, 5, MakeCombiTrans(-134.1222 + 1.3985, 0., 21.3989 + dZ - 11.2483, 0., -25.2, 0.)); + pillars->AddNode(Studs, 2, MakeCombiTrans(-134.1222 + 1.3985, 0., 21.3989 + dZ - 11.2483, 0., -25.2, 0.)); pillars->AddNode(PillarConnection, 6, MakeCombiTrans(-170.7323, 0., -15.9069 + dZ, 0., -33.6, 0.)); pillars->AddNode(vol, 6, MakeCombiTrans(-210.7759 + 2.035, 0., -29.5298 + dZ - 12.4346, 0., -42., 0.)); + pillars->AddNode(Studs6, 1, MakeCombiTrans(-210.7759 + 2.035, 0., -29.5298 + dZ - 12.4346, 0., -42., 0.)); return pillars; } -TGeoVolumeAssembly* RichGeoCreator::CreateBeltAssembly() -{ - TGeoMedium* medGas = fMaterials.GetMedium("RICHgas_CO2_dis"); - TGeoMedium* medAl = fMaterials.GetMedium("aluminium"); - - TGeoBBox* pbGas1 = new TGeoBBox("belt1_gas_PB", 1.25, 10.367, 1.167); - TGeoBBox* pb1 = new TGeoBBox("belt1_PB", 1.5, 10.6, 1.4); - TGeoVolume* volGas1 = new TGeoVolume("belt1_gas", pbGas1, medGas); - TGeoVolume* vol1 = new TGeoVolume("belt1", pb1, medAl); - //if (fSetVolumeColors) volGas1->SetLineColor(kViolet + 8); - //if (fSetVolumeColors) vol1->SetLineColor(kViolet + 8); - vol1->AddNode(volGas1, 1, MakeTrans(0., 0., 0.233)); - - TGeoBBox* pbGas2 = new TGeoBBox("belt2_gas_PB", 4.7835, 1.25, 1.167); - TGeoBBox* pb2 = new TGeoBBox("belt2_PB", 4.9, 1.5, 1.4); - TGeoVolume* volGas2 = new TGeoVolume("belt2_gas", pbGas2, medGas); - TGeoVolume* vol2 = new TGeoVolume("belt2", pb2, medAl); - //if (fSetVolumeColors) volGas2->SetLineColor(kViolet + 8); - //if (fSetVolumeColors) vol2->SetLineColor(kViolet + 8); - vol2->AddNode(volGas2, 1, MakeTrans(0.1165, 0., 0.233)); - - TGeoBBox* pbGas3 = new TGeoBBox("belt3_gas_PB", 11.6135, 1.25, 1.167); - TGeoBBox* pb3 = new TGeoBBox("belt3_PB", 11.73, 1.5, 1.4); - TGeoVolume* volGas3 = new TGeoVolume("belt3_gas", pbGas3, medGas); - TGeoVolume* vol3 = new TGeoVolume("belt3", pb3, medAl); - //if (fSetVolumeColors) volGas3->SetLineColor(kViolet + 8); - //if (fSetVolumeColors) vol3->SetLineColor(kViolet + 8); - vol3->AddNode(volGas3, 1, MakeTrans(0.1165, 0., 0.233)); - - TGeoTrap* pbGas4 = new TGeoTrap("belt4_gas_PB", 0.7, 16.22, 90., 10.97, 1.3, 1.3, 0., 9.5, 1.3, 1.3, 0.); - TGeoTrap* pb4 = new TGeoTrap("belt4_PB", 0.9, 16.22, 90., 11.378, 1.4, 1.4, 0., 9.5, 1.4, 1.4, 0.); - TGeoVolume* volGas4 = new TGeoVolume("belt4_gas", pbGas4, medGas); - TGeoVolume* vol4 = new TGeoVolume("belt4", pb4, medAl); - //if (fSetVolumeColors) volGas4->SetLineColor(kViolet + 8); - //if (fSetVolumeColors) vol4->SetLineColor(kViolet + 8); - vol4->AddNode(volGas4, 1, MakeTrans(0.1, 0., 0.)); - - TGeoVolumeAssembly* belt = new TGeoVolumeAssembly("belt"); - belt->AddNode(vol1, 1); - belt->AddNode(vol2, 1, MakeTrans(-6.4, 9.1, 0.)); - belt->AddNode(vol3, 1, MakeTrans(-13.23, -9.1, 0.)); - belt->AddNode(vol4, 1, MakeCombiTrans(-17.567, 0.75, 0., -127., -90., -90.)); - - return belt; -} - -TGeoVolumeAssembly* RichGeoCreator::CreateMirrorSupportBelts() -{ - double mRadius2 = fMirrorRadius + fMirrorThickness; - double mRadius3 = mRadius2 + fMirrorSupportAdd; - double phi1 = -fMirrorPhiSize / 2.; - double phi2 = fMirrorPhiSize / 2.; - double dTheta = fMirrorThetaSize; - double mRot90 = 90. + fMirrorRot; - double richWidthHalf = fRichWidth / 2.; - TGeoMedium* medGas = fMaterials.GetMedium("RICHgas_CO2_dis"); - - TGeoVolumeAssembly* beltAssembly = CreateBeltAssembly(); - - // Type 0 - double theta0 = mRot90 + fAlpha / 2. + fMirrorThetaGap * 3. / 4.; - TGeoSphere* sphere0 = new TGeoSphere("belt_type0_PB_op0", mRadius2, mRadius3, theta0, theta0 + dTheta, phi1, phi2); - TGeoBBox* box0 = new TGeoBBox("belt_type0_PB_op1", 500., richWidthHalf, 10.); - TGeoCompositeShape* pbType0 = - MakeSubtraction("belt_type0_PB", sphere0, box0, nullptr, MakeTrans(0., 0., -fMirrorOriginY - 10.)); - TGeoVolume* volType0 = new TGeoVolume("belt_type0", pbType0, medGas); - volType0->AddNode(beltAssembly, 1, MakeCombiTrans(275.5, -13.23, -124.7, 65., 0., -90.)); - //if (fSetVolumeColors) volType0->SetLineColor(kGreen); - - // Type 1 - double theta1 = mRot90 + fMirrorThetaGap / 2.; - TGeoSphere* pbType1 = new TGeoSphere("belt_type1_PB", mRadius2, mRadius3, theta1, theta1 + dTheta, phi1, phi2); - TGeoVolume* volType1 = new TGeoVolume("belt_type1", pbType1, medGas); - volType1->AddNode(beltAssembly, 1, MakeCombiTrans(290.4, -13.23, -84.0, 73., 0., -90.)); - //if (fSetVolumeColors) volType1->SetLineColor(kGreen - 1); - - // Type 2 - double theta2 = mRot90 - fAlpha / 2. + fMirrorThetaGap / 4.; - TGeoSphere* pbType2 = new TGeoSphere("belt_type2_PB", mRadius2, mRadius3, theta2, theta2 + dTheta, phi1, phi2); - TGeoVolume* volType2 = new TGeoVolume("belt_type2", pbType2, medGas); - volType2->AddNode(beltAssembly, 1, MakeCombiTrans(299.4, -13.23, -41.5, 82., 0., -90.)); - //if (fSetVolumeColors) volType2->SetLineColor(kGreen - 2); - - // Type 3 - double theta3 = mRot90 - fAlpha; - TGeoSphere* pbType3 = new TGeoSphere("belt_type3_PB", mRadius2, mRadius3, theta3, theta3 + dTheta, phi1, phi2); - TGeoVolume* volType3 = new TGeoVolume("belt_type3", pbType3, medGas); - volType3->AddNode(beltAssembly, 1, MakeCombiTrans(302.5, -13.23, 1.97, 91., 0., -90.)); - //if (fSetVolumeColors) volType3->SetLineColor(kGreen - 3); - - //// Type 4 - //double theta4 = mRot90 + fAlpha / 2. + fMirrorThetaGap * 3. / 4.; - //TGeoSphere* sphere4 = new TGeoSphere("belt_type4_PB_op0", mRadius2, mRadius3, theta4, theta4 + dTheta, phi1, phi2); - //TGeoTubeSeg* tube4 = new TGeoTubeSeg("belt_type4_PB_op1", 0., fPipeOuterRadiusExit, 400., 0., 360.); - //TGeoCompositeShape* sub4_1 = MakeSubtraction("belt_type4_PB_op01", sphere4, tube4, nullptr, MakeCombiTrans(0., 0., -fMirrorOriginY, 90., 0., 90. + fMirrorPhiStep * 0.5)); - //TGeoBBox* box4 = new TGeoBBox("belt_type4_PB_op2", 500., richWidthHalf, 10.); - //TGeoCompositeShape* pbType4 = MakeSubtraction("belt_type4_PB", sub4_1, box4, nullptr, MakeTrans(0., 0., -fMirrorOriginY - 10.)); - //TGeoVolume* volType4 = new TGeoVolume("belt_type4", pbType4, medGas); - //volType4->AddNode(beltAssembly, 1, MakeCombiTrans(281.0, 0., -113.0, 0., -66., 0.)); - ////if (fSetVolumeColors) volType4->SetLineColor(kGreen + 1); - // - //// Type 5 - //double theta5 = mRot90 + fAlpha / 2. + fMirrorThetaGap * 3. / 4.; - //TGeoSphere* sphere5 = new TGeoSphere("belt_type5_PB_op0", mRadius2, mRadius3, theta5, theta5 + dTheta, phi1, phi2); - //TGeoTubeSeg* tube5 = new TGeoTubeSeg("belt_type5_PB_op1", 0., fPipeOuterRadiusExit, 400., 0., 360.); - //TGeoCompositeShape* sub5_1 = MakeSubtraction("belt_type5_PB_op01", sphere5, tube5, nullptr, MakeCombiTrans(0., 0., -fMirrorOriginY, 90., 0., 90. - fMirrorPhiStep * 0.5)); - //TGeoBBox* box5 = new TGeoBBox("belt_type5_PB_op2", 500., richWidthHalf, 10.); - //TGeoCompositeShape* pbType5 = MakeSubtraction("belt_type5_PB", sub5_1, box5, nullptr, MakeTrans(0., 0., -fMirrorOriginY - 10.)); - //TGeoVolume* volType5 = new TGeoVolume("belt_type5", pbType5, medGas); - //volType5->AddNode(beltAssembly, 1, MakeCombiTrans(281., 0., -113., 0., -114., 180.)); - ////if (fSetVolumeColors) volType5->SetLineColor(kGreen + 2); - - TGeoVolumeAssembly* contHalf = new TGeoVolumeAssembly("mirror_support_belts_half"); - for (int t = 0; t < 4; t++) { - TGeoVolume* mVol = nullptr; - if (t == 1) mVol = volType1; - if (t == 2) mVol = volType2; - if (t == 3) mVol = volType3; - for (int i = 0; i < 10; i++) { - double rotZ = (i - 4.5) * fMirrorPhiStep; - int copyNum = i + 1; - if (t == 0) { - mVol = volType0; - if (i == 4 || i == 5) { // special case for the 2 middle belts - continue; //mVol = (i == 4) ? volType5 : volType4; - copyNum = 1; - } - } - contHalf->AddNode(mVol, copyNum, MakeRot(0., 0., rotZ)); - } - } - return contHalf; -} +//TGeoVolumeAssembly* RichGeoCreator::CreateBeltAssembly() +//{ +// TGeoMedium* medGas = fMaterials.GetMedium("RICHgas_CO2_dis"); +// TGeoMedium* medAl = fMaterials.GetMedium("aluminium"); +// +// TGeoBBox* pbGas1 = new TGeoBBox("belt1_gas_PB", 1.25, 10.367, 1.167); +// TGeoBBox* pb1 = new TGeoBBox("belt1_PB", 1.5, 10.6, 1.4); +// TGeoVolume* volGas1 = new TGeoVolume("belt1_gas", pbGas1, medGas); +// TGeoVolume* vol1 = new TGeoVolume("belt1", pb1, medAl); +// //if (fSetVolumeColors) volGas1->SetLineColor(kViolet + 8); +// //if (fSetVolumeColors) vol1->SetLineColor(kViolet + 8); +// vol1->AddNode(volGas1, 1, MakeTrans(0., 0., 0.233)); +// +// TGeoBBox* pbGas2 = new TGeoBBox("belt2_gas_PB", 4.7835, 1.25, 1.167); +// TGeoBBox* pb2 = new TGeoBBox("belt2_PB", 4.9, 1.5, 1.4); +// TGeoVolume* volGas2 = new TGeoVolume("belt2_gas", pbGas2, medGas); +// TGeoVolume* vol2 = new TGeoVolume("belt2", pb2, medAl); +// //if (fSetVolumeColors) volGas2->SetLineColor(kViolet + 8); +// //if (fSetVolumeColors) vol2->SetLineColor(kViolet + 8); +// vol2->AddNode(volGas2, 1, MakeTrans(0.1165, 0., 0.233)); +// +// TGeoBBox* pbGas3 = new TGeoBBox("belt3_gas_PB", 11.6135, 1.25, 1.167); +// TGeoBBox* pb3 = new TGeoBBox("belt3_PB", 11.73, 1.5, 1.4); +// TGeoVolume* volGas3 = new TGeoVolume("belt3_gas", pbGas3, medGas); +// TGeoVolume* vol3 = new TGeoVolume("belt3", pb3, medAl); +// //if (fSetVolumeColors) volGas3->SetLineColor(kViolet + 8); +// //if (fSetVolumeColors) vol3->SetLineColor(kViolet + 8); +// vol3->AddNode(volGas3, 1, MakeTrans(0.1165, 0., 0.233)); +// +// TGeoTrap* pbGas4 = new TGeoTrap("belt4_gas_PB", 0.7, 16.22, 90., 10.97, 1.3, 1.3, 0., 9.5, 1.3, 1.3, 0.); +// TGeoTrap* pb4 = new TGeoTrap("belt4_PB", 0.9, 16.22, 90., 11.378, 1.4, 1.4, 0., 9.5, 1.4, 1.4, 0.); +// TGeoVolume* volGas4 = new TGeoVolume("belt4_gas", pbGas4, medGas); +// TGeoVolume* vol4 = new TGeoVolume("belt4", pb4, medAl); +// //if (fSetVolumeColors) volGas4->SetLineColor(kViolet + 8); +// //if (fSetVolumeColors) vol4->SetLineColor(kViolet + 8); +// vol4->AddNode(volGas4, 1, MakeTrans(0.1, 0., 0.)); +// +// TGeoVolumeAssembly* belt = new TGeoVolumeAssembly("belt"); +// belt->AddNode(vol1, 1); +// belt->AddNode(vol2, 1, MakeTrans(-6.4, 9.1, 0.)); +// belt->AddNode(vol3, 1, MakeTrans(-13.23, -9.1, 0.)); +// belt->AddNode(vol4, 1, MakeCombiTrans(-17.567, 0.75, 0., -127., -90., -90.)); +// +// return belt; +//} + +//TGeoVolumeAssembly* RichGeoCreator::CreateMirrorSupportBelts() +//{ +// double mRadius2 = fMirrorRadius + fMirrorThickness; +// double mRadius3 = mRadius2 + fMirrorSupportAdd; +// double phi1 = -fMirrorPhiSize / 2.; +// double phi2 = fMirrorPhiSize / 2.; +// double dTheta = fMirrorThetaSize; +// double mRot90 = 90. + fMirrorRot; +// double richWidthHalf = fRichWidth / 2.; +// TGeoMedium* medGas = fMaterials.GetMedium("RICHgas_CO2_dis"); +// +// TGeoVolumeAssembly* beltAssembly = CreateBeltAssembly(); +// +// // Type 0 +// double theta0 = mRot90 + fAlpha / 2. + fMirrorThetaGap * 3. / 4.; +// TGeoSphere* sphere0 = new TGeoSphere("belt_type0_PB_op0", mRadius2, mRadius3, theta0, theta0 + dTheta, phi1, phi2); +// TGeoBBox* box0 = new TGeoBBox("belt_type0_PB_op1", 500., richWidthHalf, 10.); +// TGeoCompositeShape* pbType0 = +// MakeSubtraction("belt_type0_PB", sphere0, box0, nullptr, MakeTrans(0., 0., -fMirrorOriginY - 10.)); +// TGeoVolume* volType0 = new TGeoVolume("belt_type0", pbType0, medGas); +// volType0->AddNode(beltAssembly, 1, MakeCombiTrans(275.5, -13.23, -124.7, 65., 0., -90.)); +// //if (fSetVolumeColors) volType0->SetLineColor(kGreen); +// +// // Type 1 +// double theta1 = mRot90 + fMirrorThetaGap / 2.; +// TGeoSphere* pbType1 = new TGeoSphere("belt_type1_PB", mRadius2, mRadius3, theta1, theta1 + dTheta, phi1, phi2); +// TGeoVolume* volType1 = new TGeoVolume("belt_type1", pbType1, medGas); +// volType1->AddNode(beltAssembly, 1, MakeCombiTrans(290.4, -13.23, -84.0, 73., 0., -90.)); +// //if (fSetVolumeColors) volType1->SetLineColor(kGreen - 1); +// +// // Type 2 +// double theta2 = mRot90 - fAlpha / 2. + fMirrorThetaGap / 4.; +// TGeoSphere* pbType2 = new TGeoSphere("belt_type2_PB", mRadius2, mRadius3, theta2, theta2 + dTheta, phi1, phi2); +// TGeoVolume* volType2 = new TGeoVolume("belt_type2", pbType2, medGas); +// volType2->AddNode(beltAssembly, 1, MakeCombiTrans(299.4, -13.23, -41.5, 82., 0., -90.)); +// //if (fSetVolumeColors) volType2->SetLineColor(kGreen - 2); +// +// // Type 3 +// double theta3 = mRot90 - fAlpha; +// TGeoSphere* pbType3 = new TGeoSphere("belt_type3_PB", mRadius2, mRadius3, theta3, theta3 + dTheta, phi1, phi2); +// TGeoVolume* volType3 = new TGeoVolume("belt_type3", pbType3, medGas); +// volType3->AddNode(beltAssembly, 1, MakeCombiTrans(302.5, -13.23, 1.97, 91., 0., -90.)); +// //if (fSetVolumeColors) volType3->SetLineColor(kGreen - 3); +// +// //// Type 4 +// //double theta4 = mRot90 + fAlpha / 2. + fMirrorThetaGap * 3. / 4.; +// //TGeoSphere* sphere4 = new TGeoSphere("belt_type4_PB_op0", mRadius2, mRadius3, theta4, theta4 + dTheta, phi1, phi2); +// //TGeoTubeSeg* tube4 = new TGeoTubeSeg("belt_type4_PB_op1", 0., fPipeOuterRadiusExit, 400., 0., 360.); +// //TGeoCompositeShape* sub4_1 = MakeSubtraction("belt_type4_PB_op01", sphere4, tube4, nullptr, MakeCombiTrans(0., 0., -fMirrorOriginY, 90., 0., 90. + fMirrorPhiStep * 0.5)); +// //TGeoBBox* box4 = new TGeoBBox("belt_type4_PB_op2", 500., richWidthHalf, 10.); +// //TGeoCompositeShape* pbType4 = MakeSubtraction("belt_type4_PB", sub4_1, box4, nullptr, MakeTrans(0., 0., -fMirrorOriginY - 10.)); +// //TGeoVolume* volType4 = new TGeoVolume("belt_type4", pbType4, medGas); +// //volType4->AddNode(beltAssembly, 1, MakeCombiTrans(281.0, 0., -113.0, 0., -66., 0.)); +// ////if (fSetVolumeColors) volType4->SetLineColor(kGreen + 1); +// // +// //// Type 5 +// //double theta5 = mRot90 + fAlpha / 2. + fMirrorThetaGap * 3. / 4.; +// //TGeoSphere* sphere5 = new TGeoSphere("belt_type5_PB_op0", mRadius2, mRadius3, theta5, theta5 + dTheta, phi1, phi2); +// //TGeoTubeSeg* tube5 = new TGeoTubeSeg("belt_type5_PB_op1", 0., fPipeOuterRadiusExit, 400., 0., 360.); +// //TGeoCompositeShape* sub5_1 = MakeSubtraction("belt_type5_PB_op01", sphere5, tube5, nullptr, MakeCombiTrans(0., 0., -fMirrorOriginY, 90., 0., 90. - fMirrorPhiStep * 0.5)); +// //TGeoBBox* box5 = new TGeoBBox("belt_type5_PB_op2", 500., richWidthHalf, 10.); +// //TGeoCompositeShape* pbType5 = MakeSubtraction("belt_type5_PB", sub5_1, box5, nullptr, MakeTrans(0., 0., -fMirrorOriginY - 10.)); +// //TGeoVolume* volType5 = new TGeoVolume("belt_type5", pbType5, medGas); +// //volType5->AddNode(beltAssembly, 1, MakeCombiTrans(281., 0., -113., 0., -114., 180.)); +// ////if (fSetVolumeColors) volType5->SetLineColor(kGreen + 2); +// +// TGeoVolumeAssembly* contHalf = new TGeoVolumeAssembly("mirror_support_belts_half"); +// for (int t = 0; t < 4; t++) { +// TGeoVolume* mVol = nullptr; +// if (t == 1) mVol = volType1; +// if (t == 2) mVol = volType2; +// if (t == 3) mVol = volType3; +// for (int i = 0; i < 10; i++) { +// double rotZ = (i - 4.5) * fMirrorPhiStep; +// int copyNum = i + 1; +// if (t == 0) { +// mVol = volType0; +// if (i == 4 || i == 5) { // special case for the 2 middle belts +// continue; //mVol = (i == 4) ? volType5 : volType4; +// copyNum = 1; +// } +// } +// contHalf->AddNode(mVol, copyNum, MakeRot(0., 0., rotZ)); +// } +// } +// return contHalf; +//} TGeoVolumeAssembly* RichGeoCreator::CreateMainFrame() { @@ -533,20 +713,21 @@ TGeoVolumeAssembly* RichGeoCreator::CreateMainFrame() double rotX = 90 - fCameraFullRotX; double lenHalf2 = 23.2919390; double lenHalf3 = 20.; - double lenHalf5 = richHeightHalf - Tan(rotX * pi / 180.0) * lenHalf3 * 2.0; - double lenHalf6 = richLengthHalf - lenHalf2 - lenHalf3; - double lenHalf8 = (richWidthHalf - 229.3 / 2) / 2; // the 229.3 are the width of the shieldingbox + double lenHalf5 = richHeightHalf - Tan(rotX * pi / 180.0) * lenHalf3 * 2.0 - fRichCoveringThickness; + double lenHalf6 = richLengthHalf - lenHalf2 - lenHalf3 - fRichCoveringThickness - 2 * frameSizeHalf; + double lenHalf8 = + (richWidthHalf - fRichCoveringThickness - 229.3 / 2) / 2; // the 229.3 are the width of the shieldingbox double posY = richHeightHalf - coverThickness - frameSizeHalf; - double posY2 = 90; + double posY2 = fRichEntranceHeight / 2 + fRichFlangeThickness + frameSizeHalf; double posY3 = posY - Tan(rotX * pi / 180.0) * lenHalf3 * 2.0; double posZ1 = -147.779439; double posZ2 = posZ1 + lenHalf2 + 2 * lenHalf3; double posZ3 = posZ1 + 2 * lenHalf2 + 2 * lenHalf3; - double posZ4 = posZ1 + fRichLength; - double posX1 = 134.6; - double posX2 = (posX1 + richWidthHalf) / 2; - double posX3 = richWidthHalf - frameSizeHalf; + double posZ4 = posZ1 + fRichLength - fRichCoveringThickness; + double posX1 = fRichEntranceWidth / 2 + fRichFlangeThickness + frameSizeHalf; + double posX3 = richWidthHalf - frameSizeHalf - fRichCoveringThickness; + double posX2 = (posX1 + posX3) / 2; TGeoBBox* crossingbox = new TGeoBBox("crossing", frameSizeHalf, frameSizeHalf, @@ -555,9 +736,10 @@ TGeoVolumeAssembly* RichGeoCreator::CreateMainFrame() TGeoVolumeAssembly* mainFrame = new TGeoVolumeAssembly("mainframe"); // parts along x-axis - TGeoBBox* pbGas1 = - new TGeoBBox("mainframe1_gas_PB", richWidthHalf - frameSizeHalf * 2, frameSizeHalfGas, frameSizeHalfGas); - TGeoBBox* pb1 = new TGeoBBox("mainframe1_PB", richWidthHalf - frameSizeHalf * 2, frameSizeHalf, frameSizeHalf); + TGeoBBox* pbGas1 = new TGeoBBox("mainframe1_gas_PB", richWidthHalf - frameSizeHalf * 2 - fRichCoveringThickness, + frameSizeHalfGas, frameSizeHalfGas); + TGeoBBox* pb1 = new TGeoBBox("mainframe1_PB", richWidthHalf - frameSizeHalf * 2 - fRichCoveringThickness, + frameSizeHalf, frameSizeHalf); TGeoVolume* volGas1 = new TGeoVolume("mainframe1_gas", pbGas1, medGas); TGeoVolume* vol1 = new TGeoVolume("mainframe1", pb1, medAlum); //if (fSetVolumeColors) vol1->SetLineColor(kBlue); @@ -565,9 +747,9 @@ TGeoVolumeAssembly* RichGeoCreator::CreateMainFrame() vol1->AddNode(volGas1, 1); mainFrame->AddNode(vol1, 1, MakeTrans(0, posY2, posZ1)); mainFrame->AddNode(vol1, 2, MakeTrans(0, -posY2, posZ1)); - mainFrame->AddNode(vol1, 3, MakeTrans(0., posY, posZ4)); + mainFrame->AddNode(vol1, 3, MakeTrans(0., posY, posZ4 - frameSizeHalf)); mainFrame->AddNode(vol1, 4, MakeTrans(0., posY, posZ3)); - mainFrame->AddNode(vol1, 5, MakeTrans(0., -posY, posZ4)); + mainFrame->AddNode(vol1, 5, MakeTrans(0., -posY, posZ4 - frameSizeHalf)); mainFrame->AddNode(vol1, 6, MakeTrans(0., -posY, posZ3)); // first parts along z-axis (short) @@ -588,6 +770,7 @@ TGeoVolumeAssembly* RichGeoCreator::CreateMainFrame() mainFrame->AddNode(vol2, 8, MakeTrans(-posX3, -posY, posZ2 - frameSizeHalf / 2)); // diagonal parts (y-z) + //double gaslencor = (1 - frameSizeHalfGas / frameSizeHalf) * 3; TGeoTrap* pbGas3 = new TGeoTrap("mainframe3_gas_PB", frameSizeHalfGas, 0, 0, lenHalf3 - frameSizeHalf - coverThickness, 6.3, 9.3, rotX, lenHalf3 - frameSizeHalf - coverThickness, 6.3, 9.3, rotX); @@ -646,17 +829,19 @@ TGeoVolumeAssembly* RichGeoCreator::CreateMainFrame() //if (fSetVolumeColors) vol4->SetLineColor(kBlue + 3); //if (fSetVolumeColors) volGas4->SetLineColor(kBlue + 3); vol4->AddNode(volGas4, 1); - mainFrame->AddNode(vol4, 1, MakeTrans(-posX3, 0., posZ4)); - mainFrame->AddNode(vol4, 2, MakeTrans(posX3, 0., posZ4)); + mainFrame->AddNode(vol4, 1, MakeTrans(-posX3, 0., posZ4 - frameSizeHalf)); + mainFrame->AddNode(vol4, 2, MakeTrans(posX3, 0., posZ4 - frameSizeHalf)); mainFrame->AddNode(vol4, 3, MakeTrans(-posX3, 0, posZ3)); mainFrame->AddNode(vol4, 4, MakeTrans(posX3, 0, posZ3)); // small vertical parts - TGeoTrap* pbGas5 = new TGeoTrap("mainframe5_gas_PB", frameSizeHalfGas, 0, 0, frameSizeHalfGas, - lenHalf5 - 1 / Tan((90 - rotX) * pi / 180) * frameSizeHalf, - lenHalf5 + 1 / Tan((90 - rotX) * pi / 180) * frameSizeHalf, 0, frameSizeHalfGas, - lenHalf5 - 1 / Tan((90 - rotX) * pi / 180) * frameSizeHalf, - lenHalf5 + 1 / Tan((90 - rotX) * pi / 180) * frameSizeHalf, 0); + double gaslencor = (frameSizeHalf - frameSizeHalfGas) / Tan((90 - rotX) * pi / 180); + TGeoTrap* pbGas5 = + new TGeoTrap("mainframe5_gas_PB", frameSizeHalfGas, 0, 0, frameSizeHalfGas, + lenHalf5 - 1 / Tan((90 - rotX) * pi / 180) * frameSizeHalf + gaslencor, + lenHalf5 + 1 / Tan((90 - rotX) * pi / 180) * frameSizeHalf - gaslencor, 0, frameSizeHalfGas, + lenHalf5 - 1 / Tan((90 - rotX) * pi / 180) * frameSizeHalf + gaslencor, + lenHalf5 + 1 / Tan((90 - rotX) * pi / 180) * frameSizeHalf - gaslencor, 0); TGeoTrap* pb5 = new TGeoTrap("mainframe5_PB", frameSizeHalf, 0, 0, frameSizeHalf, lenHalf5 - 1 / Tan((90 - rotX) * pi / 180) * frameSizeHalf, lenHalf5 + 1 / Tan((90 - rotX) * pi / 180) * frameSizeHalf, 0, frameSizeHalf, @@ -684,24 +869,24 @@ TGeoVolumeAssembly* RichGeoCreator::CreateMainFrame() //if (fSetVolumeColors) vol6->SetLineColor(kBlue - 2); //if (fSetVolumeColors) volGas6->SetLineColor(kBlue - 2); vol6->AddNode(volGas6, 1); - mainFrame->AddNode(vol6, 1, MakeTrans(-posX2, posY, posZ4 - lenHalf6)); - mainFrame->AddNode(vol6, 2, MakeTrans(-posX2, -posY, posZ4 - lenHalf6)); - mainFrame->AddNode(vol6, 3, MakeTrans(posX2, posY, posZ4 - lenHalf6)); - mainFrame->AddNode(vol6, 4, MakeTrans(posX2, -posY, posZ4 - lenHalf6)); - mainFrame->AddNode(vol6, 5, MakeTrans(-posX1, posY, posZ4 - lenHalf6)); - mainFrame->AddNode(vol6, 6, MakeTrans(-posX1, -posY, posZ4 - lenHalf6)); - mainFrame->AddNode(vol6, 7, MakeTrans(posX1, posY, posZ4 - lenHalf6)); - mainFrame->AddNode(vol6, 8, MakeTrans(posX1, -posY, posZ4 - lenHalf6)); - mainFrame->AddNode(vol6, 9, MakeTrans(0., posY, posZ4 - lenHalf6)); - mainFrame->AddNode(vol6, 10, MakeTrans(0., -posY, posZ4 - lenHalf6)); - mainFrame->AddNode(vol6, 11, MakeTrans(posX3, posY2, posZ4 - lenHalf6)); - mainFrame->AddNode(vol6, 12, MakeTrans(posX3, -posY2, posZ4 - lenHalf6)); - mainFrame->AddNode(vol6, 13, MakeTrans(-posX3, posY2, posZ4 - lenHalf6)); - mainFrame->AddNode(vol6, 14, MakeTrans(-posX3, -posY2, posZ4 - lenHalf6)); - mainFrame->AddNode(vol6, 15, MakeTrans(-posX3, posY, posZ4 - lenHalf6)); - mainFrame->AddNode(vol6, 16, MakeTrans(-posX3, -posY, posZ4 - lenHalf6)); - mainFrame->AddNode(vol6, 17, MakeTrans(posX3, posY, posZ4 - lenHalf6)); - mainFrame->AddNode(vol6, 18, MakeTrans(posX3, -posY, posZ4 - lenHalf6)); + mainFrame->AddNode(vol6, 1, MakeTrans(-posX2, posY, posZ4 - lenHalf6 - frameSizeHalf)); + mainFrame->AddNode(vol6, 2, MakeTrans(-posX2, -posY, posZ4 - lenHalf6 - frameSizeHalf)); + mainFrame->AddNode(vol6, 3, MakeTrans(posX2, posY, posZ4 - lenHalf6 - frameSizeHalf)); + mainFrame->AddNode(vol6, 4, MakeTrans(posX2, -posY, posZ4 - lenHalf6 - frameSizeHalf)); + mainFrame->AddNode(vol6, 5, MakeTrans(-posX1, posY, posZ4 - lenHalf6 - frameSizeHalf)); + mainFrame->AddNode(vol6, 6, MakeTrans(-posX1, -posY, posZ4 - lenHalf6 - frameSizeHalf)); + mainFrame->AddNode(vol6, 7, MakeTrans(posX1, posY, posZ4 - lenHalf6 - frameSizeHalf)); + mainFrame->AddNode(vol6, 8, MakeTrans(posX1, -posY, posZ4 - lenHalf6 - frameSizeHalf)); + mainFrame->AddNode(vol6, 9, MakeTrans(0., posY, posZ4 - lenHalf6 - frameSizeHalf)); + mainFrame->AddNode(vol6, 10, MakeTrans(0., -posY, posZ4 - lenHalf6 - frameSizeHalf)); + mainFrame->AddNode(vol6, 11, MakeTrans(posX3, posY2, posZ4 - lenHalf6 - frameSizeHalf)); + mainFrame->AddNode(vol6, 12, MakeTrans(posX3, -posY2, posZ4 - lenHalf6 - frameSizeHalf)); + mainFrame->AddNode(vol6, 13, MakeTrans(-posX3, posY2, posZ4 - lenHalf6 - frameSizeHalf)); + mainFrame->AddNode(vol6, 14, MakeTrans(-posX3, -posY2, posZ4 - lenHalf6 - frameSizeHalf)); + mainFrame->AddNode(vol6, 15, MakeTrans(-posX3, posY, posZ4 - lenHalf6 - frameSizeHalf)); + mainFrame->AddNode(vol6, 16, MakeTrans(-posX3, -posY, posZ4 - lenHalf6 - frameSizeHalf)); + mainFrame->AddNode(vol6, 17, MakeTrans(posX3, posY, posZ4 - lenHalf6 - frameSizeHalf)); + mainFrame->AddNode(vol6, 18, MakeTrans(posX3, -posY, posZ4 - lenHalf6 - frameSizeHalf)); // first parts along z-axis (long) @@ -736,22 +921,20 @@ TGeoVolume* RichGeoCreator::CreateGas() double richHeightHalf = fRichHeight / 2.; double x1 = richWidthHalf - fRichCoveringThickness; - double y1 = ((2. * richHeightHalf - fRichEntranceHeight) / 2. - 2. * fRichCoveringThickness) / 2.; + double y1 = ((fRichHeight - fRichEntranceHeight) / 4. - fRichCoveringThickness); double z1 = fRichAddZ / 2. - fRichCoveringThickness / 2. + fRichEntranceThickness / 2.; double y2 = (richHeightHalf + fRichEntranceHeight / 2.) / 2.; double z2 = -richLenHalf - fRichAddZ / 2. + fRichCoveringThickness; - TGeoBBox* op0 = new TGeoBBox("rich_gas_PB_op0", x1, richHeightHalf - fRichCoveringThickness, - richLenHalf - fRichEntranceThickness / 2. - fRichExitThickness / 2.); + TGeoBBox* op0 = new TGeoBBox("rich_gas_PB_op0", x1, richHeightHalf - fRichCoveringThickness, richLenHalf + 2); TGeoBBox* op1 = new TGeoBBox("rich_gas_PB_op1", x1, y1, z1); TGeoCompositeShape* op01 = MakeUnion("rich_gas_PB_op01", op0, op1, nullptr, MakeTrans(0., y2, z2)); - TGeoBBox* op2 = new TGeoBBox("rich_gas_PB_op2", x1, y1, z1); - TGeoCompositeShape* op012 = MakeUnion("rich_gas_PB_op012", op01, op2, nullptr, MakeTrans(0., -y2, z2)); + //TGeoBBox* op2 = new TGeoBBox("rich_gas_PB_op2", x1, y1, z1); + TGeoCompositeShape* op012 = MakeUnion("rich_gas_PB_op012", op01, op1, nullptr, MakeTrans(0., -y2, z2)); TGeoConeSeg* op3 = new TGeoConeSeg("rich_gas_PB_op3", fPipeLength / 2., 0., fPipeOuterRadiusEntrance, 0., fPipeOuterRadiusExit, 0., 360.); - TGeoTranslation* tr = MakeTrans(0., 0., -(fRichEntranceThickness - fRichExitThickness) / 2.); - TGeoCompositeShape* gasPB = MakeSubtraction("rich_gas_PB", op012, op3, nullptr, tr); + TGeoCompositeShape* gasPB = MakeSubtraction("rich_gas_PB", op012, op3, nullptr, nullptr); TGeoVolume* gas = new TGeoVolume("rich_gas", gasPB, fMaterials.GetMedium("RICHgas_CO2_dis")); //if (fSetVolumeColors) gas->SetLineColor(kYellow - 10); return gas; @@ -762,16 +945,16 @@ TGeoVolume* RichGeoCreator::CreateRichContainer() double y1 = (fRichHeight / 2. + fRichEntranceHeight / 2.) / 2.; double z1 = -fRichLength / 2. - fRichAddZ / 2.; double y2 = (fRichHeight - fRichEntranceHeight) / 4.; - TGeoBBox* op0 = new TGeoBBox("rich_cont_PB_op0", fRichWidth / 2., fRichHeight / 2., fRichLength / 2.); + + TGeoBBox* op0 = new TGeoBBox("rich_cont_PB_op0", fRichWidth / 2., fRichHeight / 2., fRichLength / 2. + 2); TGeoBBox* op1 = new TGeoBBox("rich_cont_PB_op1", fRichWidth / 2., y2, fRichAddZ / 2.); TGeoCompositeShape* op01 = MakeUnion("rich_cont_PB_op01", op0, op1, nullptr, MakeTrans(0., y1, z1)); - TGeoBBox* op2 = new TGeoBBox("rich_cont_PB_op2", fRichWidth / 2., y2, fRichAddZ / 2.); - TGeoCompositeShape* pb = MakeUnion("rich_cont_PB", op01, op2, nullptr, MakeTrans(0., -y1, z1)); - //double richLenHalf = fRichLength / 2; + //TGeoBBox* op2 = new TGeoBBox("rich_cont_PB_op2", fRichWidth / 2., y2, fRichAddZ / 2.); + TGeoCompositeShape* pb = MakeUnion("rich_cont_PB", op01, op1, nullptr, MakeTrans(0., -y1, z1)); TGeoConeSeg* pipePB = new TGeoConeSeg("rich_pipe_subtract", fPipeLength / 2., 0, fPipeOuterRadiusEntrance - fPipeThicknessEntrance, 0, fPipeOuterRadiusExit - fPipeThicknessExit, 0., 360.); - TGeoCompositeShape* pb2 = MakeSubtraction("rich_cont_PB2", pb, pipePB, nullptr, MakeTrans(0, 0, 0)); + TGeoCompositeShape* pb2 = MakeSubtraction("rich_cont_PB2", pb, pipePB, nullptr, nullptr); TGeoVolume* richCont = new TGeoVolume("rich_cont", pb2, fMaterials.GetMedium("aluminium")); //if (fSetVolumeColors) richCont->SetLineColor(kBlue - 10); return richCont; @@ -779,9 +962,9 @@ TGeoVolume* RichGeoCreator::CreateRichContainer() TGeoVolume* RichGeoCreator::CreateSensitivePlane() { - double richLenHalf = fRichLength / 2.; TGeoBBox* op0 = new TGeoBBox("sens_plane_PB_op0", 170., 170., 0.05); - TGeoTube* op1 = new TGeoTube(0, (fPipeOuterRadiusExit + fPipeOuterRadiusEntrance) / 2, richLenHalf + 0.5); + TGeoConeSeg* op1 = new TGeoConeSeg("sens_plane_PB_op1", fPipeLength / 2., 0., fPipeOuterRadiusEntrance, 0., + fPipeOuterRadiusExit, 0., 360.); TGeoTranslation* tr = MakeTrans(0., 0., (-fSensPlaneZ + (fRichExitThickness - fRichEntranceThickness) / 2.)); TGeoCompositeShape* sensPlanePB = MakeSubtraction("sens_plane_PB", op0, op1, nullptr, tr); TGeoVolume* sensPlane = new TGeoVolume("sens_plane", sensPlanePB, fMaterials.GetMedium("RICHgas_CO2_dis+")); @@ -792,21 +975,24 @@ TGeoVolume* RichGeoCreator::CreateSensitivePlane() TGeoVolume* RichGeoCreator::CreateRichEntrance() { double richLenHalf = fRichLength / 2.; - double richFlangeHalfThickness = 5.; - TGeoBBox* op_flange = new TGeoBBox("rich_entrance_PB_flange_op0", fRichEntranceWidth / 2. + richFlangeHalfThickness, - fRichEntranceHeight / 2. + richFlangeHalfThickness, 1.); + TGeoBBox* op_flange = new TGeoBBox("rich_entrance_PB_flange_op0", fRichEntranceWidth / 2. + fRichFlangeThickness, + fRichEntranceHeight / 2. + fRichFlangeThickness, 1.); TGeoBBox* op1_flange = new TGeoBBox("rich_entrance_PB_flange_op1", fRichEntranceWidth / 2., fRichEntranceHeight / 2., 2.); TGeoBBox* op0 = new TGeoBBox("rich_entrance_PB_op0", fRichEntranceWidth / 2., fRichEntranceHeight / 2., fRichEntranceThickness / 2.); - TGeoTube* op1 = new TGeoTube(0, fPipeOuterRadiusEntrance, richLenHalf * 1.01); - TGeoTranslation* tr = MakeTrans(0., 0., richLenHalf - fRichEntranceThickness / 2.); + TGeoConeSeg* op1 = new TGeoConeSeg("rich_entrance_PB_op1", fPipeLength / 2., 0., fPipeOuterRadiusEntrance, 0., + fPipeOuterRadiusExit, 0., 360.); + TGeoTranslation* tr = MakeTrans(0., 0., richLenHalf - fRichEntranceThickness / 2. - fRichCoveringThickness); TGeoCompositeShape* pb_flange = MakeSubtraction("rich_entrance_PB_flange", op_flange, op1_flange, nullptr, nullptr); - TGeoCompositeShape* pb = MakeSubtraction("rich_entrance_PB", op0, op1, nullptr, tr); - TGeoVolume* entrance = new TGeoVolume("rich_entrance", pb_flange, fMaterials.GetMedium("aluminium")); - TGeoVolume* entrance_kapton = new TGeoVolume("rich_entrance_kapton", pb, fMaterials.GetMedium("kapton")); - entrance->AddNode(entrance_kapton, 1); + TGeoCompositeShape* pb_foil = MakeSubtraction("rich_entrance_PB", op0, op1, nullptr, tr); + TGeoCompositeShape* pb = MakeSubtraction("rich_entrance", op_flange, op1, nullptr, tr); + TGeoVolume* entrance = new TGeoVolume("rich_entrance", pb, fMaterials.GetMedium("RICHgas_CO2_dis")); + TGeoVolume* entrance_flange = new TGeoVolume("rich_entrance_flange", pb_flange, fMaterials.GetMedium("aluminium")); + TGeoVolume* entrance_foil = new TGeoVolume("rich_entrance_foil", pb_foil, fMaterials.GetMedium("kapton")); + entrance->AddNode(entrance_foil, 1); + entrance->AddNode(entrance_flange, 1); //if (fSetVolumeColors) entrance->SetLineColor(kGreen - 5); return entrance; } @@ -814,19 +1000,23 @@ TGeoVolume* RichGeoCreator::CreateRichEntrance() TGeoVolume* RichGeoCreator::CreateRichExit() { double richLenHalf = fRichLength / 2.; - double richFlangeHalfThickness = 5.; - TGeoBBox* op_flange = new TGeoBBox("rich_exit_PB_flange_op0", fRichExitWidth / 2. + richFlangeHalfThickness, - fRichExitHeight / 2. + richFlangeHalfThickness, 1.); + TGeoBBox* op_flange = new TGeoBBox("rich_exit_PB_flange_op0", fRichExitWidth / 2. + fRichFlangeThickness, + fRichExitHeight / 2. + fRichFlangeThickness, 1.); TGeoBBox* op1_flange = new TGeoBBox("rich_exit_PB_flange_op1", fRichExitWidth / 2., fRichExitHeight / 2., 2.); TGeoBBox* op0 = new TGeoBBox("rich_exit_PB_op0", fRichExitWidth / 2., fRichExitHeight / 2., fRichExitThickness / 2.); - TGeoTube* op1 = new TGeoTube(0, fPipeOuterRadiusExit, richLenHalf * 1.01); - TGeoTranslation* tr = MakeTrans(0., 0., -richLenHalf + fRichExitThickness / 2.); + TGeoConeSeg* op1 = new TGeoConeSeg("rich_exit_PB_op1", fPipeLength / 2., 0., fPipeOuterRadiusEntrance, 0., + fPipeOuterRadiusExit, 0., 360.); + TGeoTranslation* tr = MakeTrans(0., 0., -richLenHalf + fRichExitThickness / 2.); TGeoCompositeShape* pb_flange = MakeSubtraction("rich_exit_PB_flange", op_flange, op1_flange, nullptr, nullptr); - TGeoCompositeShape* pb = MakeSubtraction("rich_exit_PB", op0, op1, nullptr, tr); - TGeoVolume* exit = new TGeoVolume("rich_exit", pb_flange, fMaterials.GetMedium("aluminium")); - TGeoVolume* exit_innerpart = new TGeoVolume("rich_exit_innerpart", pb, fMaterials.GetMedium("Polycarbonat")); - exit->AddNode(exit_innerpart, 1); + TGeoCompositeShape* pb_innerpart = MakeSubtraction("rich_exit_PB_innerpart", op0, op1, nullptr, tr); + TGeoCompositeShape* pb = MakeSubtraction("rich_exit_PB", op_flange, op1, nullptr, tr); + TGeoVolume* exit = new TGeoVolume("rich_exit", pb, fMaterials.GetMedium("RICHgas_CO2_dis")); + TGeoVolume* exit_flange = new TGeoVolume("rich_exit_flange", pb_flange, fMaterials.GetMedium("aluminium")); + TGeoVolume* exit_innerpart = + new TGeoVolume("rich_exit_innerpart", pb_innerpart, fMaterials.GetMedium("Polycarbonat")); + exit->AddNode(exit_innerpart, 1, MakeTrans(0, 0, 0)); + exit->AddNode(exit_flange, 1); //if (fSetVolumeColors) exit->SetLineColor(kGreen - 5); return exit; } @@ -869,24 +1059,24 @@ void RichGeoCreator::CreateRich() rich_gas->AddNode(camCont, 2, MakeCombiTrans(0., -camY, camZ, -fCameraFullRotX, 0., 0.)); double mirrorZ = -fRichOrigZ - richLenHalf + fMirrorOriginZ; - double beltsGapZ = 0.5; // cm + //double beltsGapZ = 0.5; // cm TGeoVolumeAssembly* mirrorHalf = CreateMirror(); rich_gas->AddNode(mirrorHalf, 1, MakeCombiTrans(0., fMirrorOriginY + fMirrorGapY / 2., mirrorZ, 0., -90., -90.)); rich_gas->AddNode(mirrorHalf, 2, MakeCombiTrans(0., -fMirrorOriginY - fMirrorGapY / 2., mirrorZ, 0., -90., 90.)); - TGeoVolumeAssembly* belts_half_container = CreateMirrorSupportBelts(); + //TGeoVolumeAssembly* belts_half_container = CreateMirrorSupportBelts(); - rich_gas->AddNode(belts_half_container, 1, - MakeCombiTrans(0., fMirrorOriginY + fMirrorGapY, mirrorZ + beltsGapZ, 0., -90., -90.)); - rich_gas->AddNode(belts_half_container, 2, - MakeCombiTrans(0., -fMirrorOriginY - fMirrorGapY, mirrorZ + beltsGapZ, 0., -90., 90.)); + //rich_gas->AddNode(belts_half_container, 1, + // MakeCombiTrans(0., fMirrorOriginY + fMirrorGapY, mirrorZ + beltsGapZ, 0., -90., -90.)); + //rich_gas->AddNode(belts_half_container, 2, + // MakeCombiTrans(0., -fMirrorOriginY - fMirrorGapY, mirrorZ + beltsGapZ, 0., -90., 90.)); TGeoVolumeAssembly* pillars = CreateMirrorSupportPillars(); rich_gas->AddNode(pillars, 1); TGeoVolume* sensPlane = CreateSensitivePlane(); - rich_gas->AddNode(sensPlane, 1, MakeTrans(0., 0., fSensPlaneZ)); //-30.)); + rich_gas->AddNode(sensPlane, 1, MakeTrans(0., 0., fSensPlaneZ)); TGeoVolumeAssembly* mainFrame = CreateMainFrame(); rich_gas->AddNode(mainFrame, 1, MakeTrans(0., 0., 38.541939)); @@ -898,13 +1088,11 @@ void RichGeoCreator::CreateRich() rich_gas->AddNode(shieldingBox, 2, MakeCombiTrans(0., 0., shieldingBoxZ, 0., 0., 180.)); } - rich_gas->AddNode(CreateRichEntrance(), 1, MakeTrans(0., 0., -richLenHalf + fRichExitThickness / 2.)); - rich_gas->AddNode(CreateRichExit(), 1, MakeTrans(0., 0., richLenHalf - fRichEntranceThickness / 2.)); + rich_gas->AddNode(CreateRichEntrance(), 1, MakeTrans(0., 0., -richLenHalf + fRichEntranceThickness / 2.)); + rich_gas->AddNode(CreateRichExit(), 1, MakeTrans(0., 0., richLenHalf - fRichExitThickness / 2)); TGeoVolume* richCont = CreateRichContainer(); - richCont->AddNode(rich_gas, 1, MakeTrans(0., 0., (fRichEntranceThickness - fRichExitThickness) / 2.)); - //richCont->AddNode(CreateRichEntrance(), 1, MakeTrans(0., 0., -richLenHalf + fRichEntranceThickness / 2.)); - //richCont->AddNode(CreateRichExit(), 1, MakeTrans(0., 0., richLenHalf - fRichExitThickness / 2.)); + richCont->AddNode(rich_gas, 1, MakeTrans(0., 0., 0)); richCont->AddNode(CreatePipe(), 1); TGeoVolumeAssembly* rich = new TGeoVolumeAssembly(fGeoName.c_str()); @@ -913,20 +1101,20 @@ void RichGeoCreator::CreateRich() // See https://git.cbm.gsi.de/CbmSoft/cbmroot_geometry/-/merge_requests/184 //rich->AddNode(CreatePipeCyl(), 1, MakeTrans(0., 0., -40. + fRichOrigZ - fPipeCylPartLen / 2.)); - TGeoVolume* top = new TGeoVolumeAssembly(fGeoName.c_str()); + //TGeoVolume* top = new TGeoVolumeAssembly(fGeoName.c_str()); - gGeoManager->SetTopVolume(top); - top->AddNode(rich, 1); + gGeoManager->SetTopVolume(rich); + //top->AddNode(rich, 1); gGeoManager->CloseGeometry(); gGeoManager->CheckOverlaps(0.0001); gGeoManager->PrintOverlaps(); gGeoManager->Test(); string outputFile = fGeoName + ".geo.root"; - top->Export((outputFile + "?reproducible").c_str()); + rich->Export((outputFile + "?reproducible").c_str()); LOG(info) << "Geometry file: " << outputFile; - //top->Draw("ogl"); + //rich->Draw("ogl"); gGeoManager->SetVisLevel(7); } @@ -936,32 +1124,32 @@ TGeoVolumeAssembly* RichGeoCreator::CreateShieldingBox() // Shielding box is created using a number of boolean operations with shapes // All next shape is marked with increased number in name box1 to box 15 - TGeoEltu* box1 = new TGeoEltu("box1", 183.0, 183.0, 61.3); + TGeoEltu* box1 = new TGeoEltu("box1", 183.0, 183.0, 70); TGeoBBox* box2 = new TGeoBBox("box2", 229.3 / 2., 73.879 / 2., 113.3 / 2.); TGeoCompositeShape* box3 = MakeIntersection("box3", box1, box2, nullptr, MakeTrans(0., 146.068, -4.65)); TGeoBBox* box4 = new TGeoBBox("box4", 227.3 / 2., 71.937 / 2., 102.0 / 2.); TGeoCompositeShape* box5 = MakeSubtraction("box5", box3, box4, nullptr, MakeTrans(0., 147.097, 0.)); - TGeoEltu* box6 = new TGeoEltu("box6", 172.0, 172.0, 4.65); - TGeoCompositeShape* box7 = MakeSubtraction("box7", box5, box6, nullptr, MakeTrans(0., 0., -56.65)); + TGeoEltu* box6 = new TGeoEltu("box6", 172.0, 172.0, 6); + TGeoCompositeShape* box7 = MakeSubtraction("box7", box5, box6, nullptr, MakeTrans(0., 0., -58)); TGeoBBox* box8 = new TGeoBBox("box8", 75.0 / 2., 222.422 / 2., 104.0 / 2.); TGeoCompositeShape* box9 = MakeSubtraction("box9", box7, box8, nullptr, MakeTrans(0., -0.082, 0.)); TGeoBBox* box10 = new TGeoBBox("box10", 145.0 / 2., 10.3 / 2., 11.0 / 2.); TGeoCompositeShape* box11 = - MakeSubtraction("box11", box9, box10, nullptr, MakeCombiTrans(61.1525, 177.2736, -56.15, 0., 0., -31.26911)); + MakeSubtraction("box11", box9, box10, nullptr, MakeCombiTrans(-61.152, 177.274, -56.15, 0., 0., 31.27)); - TGeoBBox* box12 = new TGeoBBox("box12", 145.0 / 2., 10.3 / 2., 11.0 / 2.); + //TGeoBBox* box12 = new TGeoBBox("box12", 145.0 / 2., 10.3 / 2., 11.0 / 2.); TGeoCompositeShape* box13 = - MakeSubtraction("box13", box11, box12, nullptr, MakeCombiTrans(-61.152, 177.274, -56.15, 0., 0., 31.27)); + MakeSubtraction("box13", box11, box10, nullptr, MakeCombiTrans(61.152, 177.274, -56.15, 0., 0., -31.27)); TGeoBBox* box14 = new TGeoBBox("box14", 145.0 / 2., 10.3 / 2., 16.0 / 2.); TGeoCompositeShape* box15 = MakeSubtraction("box15", box13, box14, nullptr, MakeCombiTrans(0., 181.2639, -59.75, -41.3565, 0., 0.)); - TGeoVolume* shBox = new TGeoVolume("shielding_box", box15, fMaterials.GetMedium("iron")); + TGeoVolume* shBox = new TGeoVolume("shielding_box_part", box15, fMaterials.GetMedium("iron")); //if (fSetVolumeColors) shBox->SetLineColor(kBlue + 4); // Wing part @@ -970,9 +1158,9 @@ TGeoVolumeAssembly* RichGeoCreator::CreateShieldingBox() TGeoCompositeShape* wing3 = MakeSubtraction("wing3", wing1, wing2, nullptr, MakeCombiTrans(49.9989, 0., 3.206, 0., 18.90578, 0.)); - TGeoBBox* wing4 = new TGeoBBox("wing4", 117.0 / 2., 8.9571 / 2., 13.7221 / 2.); + //TGeoBBox* wing4 = new TGeoBBox("wing4", 117.0 / 2., 8.9571 / 2., 13.7221 / 2.); TGeoCompositeShape* wing5 = - MakeSubtraction("wing5", wing3, wing4, nullptr, MakeCombiTrans(-49.9989, 0., 3.206, 0., -18.90578, 0.)); + MakeSubtraction("wing5", wing3, wing2, nullptr, MakeCombiTrans(-49.9989, 0., 3.206, 0., -18.90578, 0.)); TGeoVolume* wing = new TGeoVolume("shieling_wing", wing5, fMaterials.GetMedium("iron")); //if (fSetVolumeColors) wing->SetLineColor(kBlue - 1); diff --git a/sim/detectors/rich/geo/RichGeoCreator.h b/sim/detectors/rich/geo/RichGeoCreator.h index ed8fa49d4a..8ff77a7955 100644 --- a/sim/detectors/rich/geo/RichGeoCreator.h +++ b/sim/detectors/rich/geo/RichGeoCreator.h @@ -4,7 +4,8 @@ /* to generate geometry version v22a use version of this file and RichGeoCreator.cxx from commit bed4c932 to generate geometry version v23a use version of this file and RichGeoCreator.cxx from commit c25124a0 - to generate geometry version v24a use version of this file and RichGeoCreator.cxx from commit current version (update at some point) + to generate geometry version v24a use version of this file and RichGeoCreator.cxx from commit eb21a51c + to generate geometry version v25a use version of this file and RichGeoCreator.cxx from commit current version (update at some point) */ #ifndef RICH_GEO_CREATOR @@ -34,13 +35,14 @@ public: void Create(); void SetGeoName(const std::string& geoName) { fGeoName = geoName; } + std::string GetGeoName() { return fGeoName; } void SetAddShieldingBox(bool addShildingBox) { fAddShieldingBox = addShildingBox; } void SetVolumeColors(bool setVolumeColors) { fSetVolumeColors = setVolumeColors; } private: RichGeoMaterials fMaterials; - std::string fGeoName = "rich_v24a"; + std::string fGeoName = "rich_v25a"; bool fAddShieldingBox = true; bool fSetVolumeColors = false; @@ -58,9 +60,10 @@ private: double fRichEntranceWidth = 260.; //cm double fRichEntranceHeight = 175.; //cm double fRichEntranceThickness = 0.025; //cm + double fRichFlangeThickness = 5.; //cm double fRichExitWidth = 569.; //cm double fRichExitHeight = 384.; //cm - double fRichExitThickness = 1; //cm + double fRichExitThickness = 1.0; //cm // Pipe parameters double fPipeOuterRadiusEntrance = 16.4; //cm @@ -68,7 +71,7 @@ private: double fPipeOuterRadiusExit = 29.9; //cm double fPipeThicknessExit = fPipeThicknessEntrance; //cm double fPipeCylPartLen = 10.0; //cm - double fPipeLength = fRichLength + 0.5; //cm + double fPipeLength = fRichLength + 4; //cm // Mirror parameters double fMirrorRadius = 300.; //cm @@ -127,10 +130,11 @@ private: TGeoVolume* CreatePipe(); TGeoVolume* CreatePipeCyl(); TGeoVolumeAssembly* CreateShieldingBox(); - TGeoVolumeAssembly* CreateBeltAssembly(); - TGeoVolumeAssembly* CreateMirrorSupportBelts(); + TGeoVolumeAssembly* CreateMirrorFixing(const std::string& sides = "both"); + //TGeoVolumeAssembly* CreateBeltAssembly(); + //TGeoVolumeAssembly* CreateMirrorSupportBelts(); TGeoVolumeAssembly* CreateMirrorSupportPillars(); - TGeoVolume* CreateStuds(double zpos, double lenHalf, double angle); + TGeoVolume* CreateStuds(double zpos, double lenHalf, double angle, const std::string& mirrorfixing = "both"); TGeoVolume* CreatePillarConnection(); void CreateRich(); -- GitLab From 2dbd3f1a1ecbdb8f2b4346e195d1855f447ec40d Mon Sep 17 00:00:00 2001 From: Simon Neuhaus <sneuhaus@lxbuild07.gsi.de> Date: Fri, 21 Mar 2025 13:57:40 +0100 Subject: [PATCH 2/4] small changes in coments and creation macro. --- macro/rich/create_rich_geo.C | 7 +++---- sim/detectors/rich/geo/RichGeoCreator.cxx | 4 ++-- sim/detectors/rich/geo/RichGeoCreator.h | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/macro/rich/create_rich_geo.C b/macro/rich/create_rich_geo.C index d671999354..4d6e277bed 100644 --- a/macro/rich/create_rich_geo.C +++ b/macro/rich/create_rich_geo.C @@ -1,17 +1,16 @@ -/* Copyright (C) 2022-2022 UGiessen/GSI, Giessen/Darmstadt +/* Copyright (C) 2022-2025 UGiessen/GSI, Giessen/Darmstadt SPDX-License-Identifier: GPL-3.0-only - Authors: Semen Lebedev [committer] */ + Authors: Semen Lebedev [committer], Simon Neuhaus */ void create_rich_geo() { RichGeoCreator* geoCreator = new RichGeoCreator(); //geoCreator->SetGeoName("rich_v25a"); - geoCreator->SetAddShieldingBox(true); geoCreator->SetVolumeColors(false); geoCreator->Create(); // Add (dummy) translation to geo file - TFile* geoFile = new TFile((geoCreator->GetGeoName() + ".geo.root").c_str(), "UPDATE"); + TFile* geoFile = new TFile((geoCreator->GetGeoName() + ".geo.root?reproducible").c_str(), "CREATE"); TGeoTranslation* translation = new TGeoTranslation("rich_trans", 0., 0., 0.); translation->Write(); geoFile->Close(); diff --git a/sim/detectors/rich/geo/RichGeoCreator.cxx b/sim/detectors/rich/geo/RichGeoCreator.cxx index d48feb6fe0..de8aa705e0 100644 --- a/sim/detectors/rich/geo/RichGeoCreator.cxx +++ b/sim/detectors/rich/geo/RichGeoCreator.cxx @@ -1,4 +1,4 @@ -/* Copyright (C) 2022-2024 UGiessen/GSI, Giessen/Darmstadt +/* Copyright (C) 2022-2025 UGiessen/GSI, Giessen/Darmstadt SPDX-License-Identifier: GPL-3.0-only Authors: Semen Lebedev [committer], Eoin Clerkin, Simon Neuhaus*/ @@ -330,7 +330,7 @@ TGeoVolumeAssembly* RichGeoCreator::CreateMirrorFixing(const string& sides) base->AddNode(baseGas, 1); triangle->AddNode(base, 1, MakeTrans(-lengthHalf + partwidthHalf, 0, 0)); - // creating the sides of the diagonal part as thin boxes (avoid problem with the not 90° angles) + // creating the sides of the diagonal part as thin boxes (avoid problem with the not 90degree angles) double lenleg1 = sidelenghtHalf - 2 * sidewidthHalf / Sin(60 * pi / 180); double lenleg2 = sidelenghtHalf + (sidewidthHalf - thicknessHalf) / Sin(60 * pi / 180) - partwidthHalf; TGeoBBox* pbleg1 = new TGeoBBox(lenleg1, thicknessHalf, heightHalf); diff --git a/sim/detectors/rich/geo/RichGeoCreator.h b/sim/detectors/rich/geo/RichGeoCreator.h index 8ff77a7955..d1baad3cee 100644 --- a/sim/detectors/rich/geo/RichGeoCreator.h +++ b/sim/detectors/rich/geo/RichGeoCreator.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2022-2024 UGiessen/GSI, Giessen/Darmstadt +/* Copyright (C) 2022-2025 UGiessen/GSI, Giessen/Darmstadt SPDX-License-Identifier: GPL-3.0-only Authors: Semen Lebedev [committer], Simon Neuhaus */ -- GitLab From 8e1ff7239eb1b7b68fc0c74b9c382afc7e54f769 Mon Sep 17 00:00:00 2001 From: Simon Neuhaus <sneuhaus@lxbuild07.gsi.de> Date: Mon, 24 Mar 2025 17:41:11 +0100 Subject: [PATCH 3/4] small changes reguested in merge request process. --- macro/rich/create_rich_geo.C | 2 +- sim/detectors/rich/geo/RichGeoCreator.cxx | 13 ++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/macro/rich/create_rich_geo.C b/macro/rich/create_rich_geo.C index 4d6e277bed..5f1e47b6e1 100644 --- a/macro/rich/create_rich_geo.C +++ b/macro/rich/create_rich_geo.C @@ -10,7 +10,7 @@ void create_rich_geo() geoCreator->Create(); // Add (dummy) translation to geo file - TFile* geoFile = new TFile((geoCreator->GetGeoName() + ".geo.root?reproducible").c_str(), "CREATE"); + TFile* geoFile = new TFile((geoCreator->GetGeoName() + ".geo.root?reproducible").c_str(), "UPDATE"); TGeoTranslation* translation = new TGeoTranslation("rich_trans", 0., 0., 0.); translation->Write(); geoFile->Close(); diff --git a/sim/detectors/rich/geo/RichGeoCreator.cxx b/sim/detectors/rich/geo/RichGeoCreator.cxx index de8aa705e0..d186526138 100644 --- a/sim/detectors/rich/geo/RichGeoCreator.cxx +++ b/sim/detectors/rich/geo/RichGeoCreator.cxx @@ -139,11 +139,6 @@ TGeoVolume* RichGeoCreator::CreatePmt() } } - //TGeoBBox* pmtContPB = new TGeoBBox("pmt_cont_PB", pmtSizeHalf, pmtSizeHalf, pmtDepthHalf); - //TGeoVolume* pmtCont = new TGeoVolume("pmt_cont", pmtContPB, fMaterials.GetMedium("RICHgas_CO2_dis")); - //pmtCont->AddNode(pmt, 1, MakeTrans(0., 0., 0.)); - //if (fSetVolumeColors) pmtCont->SetLineColor(kRed - 4); - return pmt; } @@ -303,7 +298,7 @@ TGeoVolumeAssembly* RichGeoCreator::CreateMirror() TGeoVolumeAssembly* RichGeoCreator::CreateMirrorFixing(const string& sides) { - if (sides != "both" and sides != "left" and sides != "right" and sides != "none") { + if (sides != "both" && sides != "left" && sides != "right" && sides != "none") { cout << "unknown value " << sides << " for sides in function CreateMirrorFixing" << endl; } TGeoMedium* medGas = fMaterials.GetMedium("RICHgas_CO2_dis"); @@ -361,13 +356,13 @@ TGeoVolumeAssembly* RichGeoCreator::CreateMirrorFixing(const string& sides) neck->AddNode(neckGas, 1, MakeTrans(-2.35, 0, 0)); triangle->AddNode(neck, 1, MakeTrans(lengthHalf - neckHalf, 0, 0)); - if (sides == "both" or sides == "right") { + if (sides == "both" || sides == "right") { mirrorFixing->AddNode(triangle, 1, MakeTrans(distanceHalf + lengthHalf, 0, 0)); } - if (sides == "both" or sides == "left") { + if (sides == "both" || sides == "left") { mirrorFixing->AddNode(triangle, 2, MakeCombiTrans(-distanceHalf - lengthHalf, 0, 0, 0, 0, 180)); } - if (sides == "left" or sides == "right") { + if (sides == "left" || sides == "right") { TGeoBBox* pbconnection = new TGeoBBox("connectionMirrorfixing", distanceHalf / 2, partwidthHalf, heightHalf); TGeoBBox* pbconnectionGas = new TGeoBBox("connectionMirrorfixingGas", distanceHalf / 2, partwidthHalf - 2 * thicknessHalf, heightHalf - 2 * thicknessHalf); -- GitLab From cfab40de4697155a284960c8622876152a66d359 Mon Sep 17 00:00:00 2001 From: Simon Neuhaus <sneuhaus@lxbuild07.gsi.de> Date: Wed, 16 Apr 2025 15:26:38 +0200 Subject: [PATCH 4/4] Fix small overlap in shieldingbox. --- sim/detectors/rich/geo/RichGeoCreator.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sim/detectors/rich/geo/RichGeoCreator.cxx b/sim/detectors/rich/geo/RichGeoCreator.cxx index d186526138..69dcb46fab 100644 --- a/sim/detectors/rich/geo/RichGeoCreator.cxx +++ b/sim/detectors/rich/geo/RichGeoCreator.cxx @@ -1149,7 +1149,7 @@ TGeoVolumeAssembly* RichGeoCreator::CreateShieldingBox() // Wing part TGeoBBox* wing1 = new TGeoBBox("wing1", 117.0 / 2., 8.9571 / 2., 13.7221 / 2.); - TGeoBBox* wing2 = new TGeoBBox("wing2", 117.0 / 2., 8.9571 / 2., 13.7221 / 2.); + TGeoBBox* wing2 = new TGeoBBox("wing2", 117.0 / 2., 9.0 / 2., 13.7221 / 2.); TGeoCompositeShape* wing3 = MakeSubtraction("wing3", wing1, wing2, nullptr, MakeCombiTrans(49.9989, 0., 3.206, 0., 18.90578, 0.)); @@ -1162,7 +1162,7 @@ TGeoVolumeAssembly* RichGeoCreator::CreateShieldingBox() TGeoVolumeAssembly* shBoxFinal = new TGeoVolumeAssembly("shielding_box"); shBoxFinal->AddNode(shBox, 1, MakeCombiTrans(0., 240.7246, 79.4162, 68.06551, 0., -180.0)); - shBoxFinal->AddNode(wing, 1, MakeCombiTrans(0., 118.3074, 225.1717, -26.70901, 0., 0.)); + shBoxFinal->AddNode(wing, 1, MakeCombiTrans(0., 118.30, 225.1717, -26.70901, 0., 0.)); return shBoxFinal; } -- GitLab