diff --git a/macro/rich/create_rich_geo.C b/macro/rich/create_rich_geo.C index dc1a3fb6ca9c44eaf222e4b64176ed9a7d8686f3..5f1e47b6e1d1b6c21cb1c84c4834659d5dff3028 100644 --- a/macro/rich/create_rich_geo.C +++ b/macro/rich/create_rich_geo.C @@ -1,12 +1,17 @@ -/* 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_v22b"); - geoCreator->SetAddShieldingBox(false); + //geoCreator->SetGeoName("rich_v25a"); geoCreator->SetVolumeColors(false); geoCreator->Create(); + + // Add (dummy) translation to geo file + 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 4306d7c9a328d7feeb68739b0bf78eb46131ea3b..69dcb46fab2f9bb9db47bb6a61ae462bd3edf00d 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*/ @@ -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,38 @@ 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.)); - //if (fSetVolumeColors) pmtCont->SetLineColor(kRed - 4); - - return pmtCont; + return pmt; } @@ -292,7 +296,102 @@ TGeoVolumeAssembly* RichGeoCreator::CreateMirror() return mHalf; } -TGeoVolume* RichGeoCreator::CreateStuds(double ypos, double lenHalf, double angle) +TGeoVolumeAssembly* RichGeoCreator::CreateMirrorFixing(const string& sides) +{ + 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"); + 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 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); + 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" || sides == "right") { + mirrorFixing->AddNode(triangle, 1, MakeTrans(distanceHalf + lengthHalf, 0, 0)); + } + if (sides == "both" || sides == "left") { + mirrorFixing->AddNode(triangle, 2, MakeCombiTrans(-distanceHalf - lengthHalf, 0, 0, 0, 0, 180)); + } + 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); + 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 +401,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 +439,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 +469,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 +708,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 +731,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 +742,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 +765,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 +824,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 +864,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 +916,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 +940,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 +957,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 +970,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 +995,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 +1054,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 +1083,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 +1096,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,50 +1119,50 @@ 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 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.)); - 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); 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; } diff --git a/sim/detectors/rich/geo/RichGeoCreator.h b/sim/detectors/rich/geo/RichGeoCreator.h index ed8fa49d4af4be1c8d00dd19954fb84254a742ca..d1baad3cee8298a7388bc698682b9245607a8a73 100644 --- a/sim/detectors/rich/geo/RichGeoCreator.h +++ b/sim/detectors/rich/geo/RichGeoCreator.h @@ -1,10 +1,11 @@ -/* 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 */ /* 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();