diff --git a/compact/materials.xml b/compact/materials.xml
index 7cafe677e..2f5757490 100644
--- a/compact/materials.xml
+++ b/compact/materials.xml
@@ -571,4 +571,12 @@
+
+
+
+
+
+
+
+
diff --git a/compact/tracking/support_service_craterlake.xml b/compact/tracking/support_service_craterlake.xml
index 89a6af051..3f9e51818 100644
--- a/compact/tracking/support_service_craterlake.xml
+++ b/compact/tracking/support_service_craterlake.xml
@@ -34,6 +34,644 @@
+ PST thermal membrane
+ Specifications are from SVT PST Drawing PACKET SEP 2025.pdf
+
+
+
+
+
+
+
+
+
+ (Negative) SVT PST Fingure
+ Specifications are from SVT PST Drawing PACKET SEP 2025.pdf
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (Positive) SVT PST Fingure
+ Specifications are from SVT PST Drawing PACKET SEP 2025.pdf
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SVT PST Feet
+ Specifications are from SVT PST Drawing PACKET SEP 2025.pdf
+
+
+
+
+ 190.9 mm per drawing. But modifying to avoid conflict!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ From the STP file.
+
+
+ From the STP file.
+
+
+
+
+ (Negative) Service Passthrough Plate
+
+ Specifications are from SVT PST Drawing PACKET SEP 2025.pdf
+ General dimensions (we assume hole-specs are the same for top and bottom half)
+
+
+ Gap between two holes
+
+
+
+
+
+
+
+
+
+
+
+ half-width of beampipe support plate cutout
+ Top half ring holes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Bottom half ring holes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ rectangular cutout in the middle
+
+
+
+
+
+ (Positive) Service Passthrough Plate
+
+ Specifications are from SVT PST Drawing PACKET SEP 2025.pdf
+ General dimensions (we assume hole-specs are the same for top and bottom half)
+
+
+ Gap between two holes
+
+
+
+
+
+
+
+
+
+
+
+ half-width of beampipe support plate cutout
+ Top half ring holes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Bottom half ring holes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ rectangular cutout in the middle
+
+
+
+
+
+ (Negative) beampipe Support Plate
+
+ Specifications are from SVT PST Drawing PACKET SEP 2025.pdf
+ General dimensions
+
+
+ Absolute value
+
+
+ dimensions of the ring shaped sheet in the middle
+
+
+
+ dimensions of the rectangular sheet
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (Positive) beampipe Support Plate
+
+ Specifications are from SVT PST Drawing PACKET SEP 2025.pdf
+ General dimensions
+
+
+
+
+
+ dimensions of the ring shaped sheet in the middle
+
+
+
+
+ dimensions of the rectangular sheet
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (Positive) beampipe support mechanism
+
+ Specifications are from SVT PST Drawing PACKET SEP 2025.pdf
+ central ring
+
+
+
+
+
+
+
+ From SVT PST Drawing PACKET SEP 2025 STP File
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ peripheral half-central ring
+
+
+
+
+ from SVT PST Drawing PACKET SEP 2025 STP file
+
+
+
+
+ beampipe support clamp
+
+
+
+
+ an approximation
+
+
+
+
+
+ (Negative) beampipe support mechanism
+
+ Specifications are from SVT PST Drawing PACKET SEP 2025.pdf
+ central ring
+
+
+
+
+
+
+
+ From SVT PST Drawing PACKET SEP 2025 STP File
+
+
+
+
+
+
+
+
+ From SVT PST Drawing PACKET SEP 2025 STP File
+ From SVT PST Drawing PACKET SEP 2025 STP File
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ peripheral half-central ring
+
+
+
+
+ No info! Assuming same as the positive side!
+
+
+
+ beampipe support clamp
+
+
+
+
+ No info! Assuming same as the positive side!
+
+
+
+
Inner tracker service/support cones, symmetric
Effective Aluminum for services for now
@@ -67,17 +705,21 @@
+
- Ref: SVT PST Drawing PACKET SEP 2025.pdf
+ Ref: SVT PST Drawing PACKET SEP 2025.pdf
+ Ref: SVT PST Drawing PACKET SEP 2025.pdf. Crude measure to avoid overlap!
+
+
Ref: WP9: 20251003 - services by E. Sichtermann
Ref: WP9: 20251003 - services by E. Sichtermann
@@ -90,18 +732,22 @@
+
- Ref: SVT PST Drawing PACKET SEP 2025.pdf
+ Ref: SVT PST Drawing PACKET SEP 2025.pdf
+ Ref: SVT PST Drawing PACKET SEP 2025.pdf. Crude measure to avoid overlap!
+
+
Ref: WP9: 20251003 - services by E. Sichtermann
Ref: WP9: 20251003 - services by E. Sichtermann
@@ -110,6 +756,43 @@
+ Services Routing Flange (WIP) for SVT : 1 Cylinder + 1 Cone
+ Specifications are from SVT PST Drawing PACKET SEP 2025.pdf
+ Cylinder dimensions
+
+
+
+
+
+
+ Cone dimensions
+
+
+
+
+
+ From SVT PST Drawing PACKET SEP 2025.pdf
+
+
+ SVT Support Tube Joints
+ Specifications are from SVT PST Drawing PACKET SEP 2025.pdf
+ INPORTANT NOTEs:
+ 1. Putting the joint outside of PST instead of inside to avoid re-writing existing support-service code.
+ 2. On the negative side, extending it up to the service routing flange to avoid operlap.
+ 3. On the positive side, extending it up to the base of PST fingure to avoid operlap with PST feet.
+
+
+
+
+
+
+
+
+
+
+
+
Outer tracker service/support cones, asymmetric
@@ -324,6 +1007,1950 @@
id="TrackerSupport_0_ID"
>
+ PST thermal membrane implementation
+
+
+
+
+
+
+
+
+
+
+ (Positive) Service passthrough plate implementation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Making holes in the bottom half-ring
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Making rectangular cut in the center
+
+
+
+
+
+
+ (Positive) Beampipe Support Plate
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (Positive) Beampipe Support Mechanism Implemeantion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (Negative) Beampipe Support Plate
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (Negative) Beampipe Support Mechanism Implemeantion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (Negative) Service passthrough plate implementation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Making holes in the bottom half-ring
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Making rectangular cut in the center
+
+
+
+
+
+
+ Support routing flange
+
+
+
+
+
+
+
+
+
+
+ SVT Support Tube Joint Implementation
+ INPORTANT NOTEs:
+ 1. Putting the joint outside of PST instead of inside to avoid re-writing existing support-service code.
+ 2. On the negative side, extending it up to the service routing flange to avoid operlap.
+
+
+
+
+
+
+
+
+
+ PST Feet implementation
+ Positive left side (while looking downstream)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Positive right side (while looking downstream)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Negative left side (while looking downstream)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Negative right side (while looking downstream)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (Negative) SVT PST 2452plementation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (Positive) SVT PST Fingure implementation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -372,27 +2999,45 @@
-
+ -->
+
+
+
+
+
+
+
@@ -402,25 +3047,44 @@
-
+ -->
+
+
+
+
+
+
+
-
-
- -->
+
outer barrel
build_shape(const Detector& descr, const xml_det_
return {vol, tr};
}
-// Function to create a subtraction of two shapes
+// Function to create a subtraction of multiple shapes
std::pair build_subtraction(const Detector& descr, const xml_det_t& x_det,
const xml_comp_t& x_subtraction) {
- // Get the two shapes to subtract
- xml_comp_t x_shape1 = x_subtraction.child(_Unicode(shape1));
- xml_comp_t x_shape2 = x_subtraction.child(_Unicode(shape2));
-
- // Build the primary shape (without transformation)
- auto [vol1, tr1_unused] = build_shape(descr, x_det, x_shape1, x_shape1);
- Solid solid1 = vol1.solid();
-
- // Build the shape to subtract (without transformation)
- auto [vol2, tr2_unused] = build_shape(descr, x_det, x_shape2, x_shape2);
- Solid solid2 = vol2.solid();
-
- // Get relative transformation for shape2 (relative to shape1's center)
- xml_dim_t x_pos2(x_shape2.child(_U(position), false));
- xml_dim_t x_rot2(x_shape2.child(_U(rotation), false));
- Position pos2{0, 0, 0};
- Rotation3D rot2;
-
- if (x_rot2) {
- rot2 = RotationZYX(x_rot2.z(0), x_rot2.y(0), x_rot2.x(0));
+
+ // Try generic multi-shape schema: + N x
+ Solid baseSolid;
+ bool baseSet = false;
+ bool haveGenericShapes = false;
+ std::vector> holes;
+
+ for (xml_coll_t s{x_subtraction, _U(shape)}; s; ++s) {
+ haveGenericShapes = true;
+ xml_comp_t x_s = s;
+
+ // Build solid for this child
+ auto [v, tr_unused] = build_shape(descr, x_det, x_s, x_s);
+ Solid sld = v.solid();
+
+ // Relative transform (default identity) for this child
+ xml_dim_t x_pos(x_s.child(_U(position), false));
+ xml_dim_t x_rot(x_s.child(_U(rotation), false));
+ Position pos{0, 0, 0};
+ Rotation3D rot;
+ if (x_rot)
+ rot = RotationZYX(x_rot.z(0), x_rot.y(0), x_rot.x(0));
+ if (x_pos)
+ pos = Position(x_pos.x(0), x_pos.y(0), x_pos.z(0));
+ Transform3D tr_rel(rot, pos);
+
+ const std::string role = getAttrOrDefault(x_s, _Unicode(role), "hole");
+ if (role == "base" || role == "primary") {
+ baseSolid = sld;
+ baseSet = true;
+ } else {
+ holes.emplace_back(sld, tr_rel);
+ }
+ }
+
+ // Backward compatibility: if no generic elements, use /
+ if (!haveGenericShapes) {
+ xml_comp_t x_shape1 = x_subtraction.child(_Unicode(shape1));
+ xml_comp_t x_shape2 = x_subtraction.child(_Unicode(shape2));
+ if (!x_shape1 || !x_shape2) {
+ printout(ERROR, x_det.nameStr(),
+ "Subtraction %s: expected shape1/shape2 or generic children.",
+ x_subtraction.nameStr().c_str());
+ std::exit(1);
+ }
+ auto [vol1, tr1_unused] = build_shape(descr, x_det, x_shape1, x_shape1);
+ auto [vol2, tr2_unused] = build_shape(descr, x_det, x_shape2, x_shape2);
+ baseSolid = vol1.solid();
+ baseSet = true;
+
+ // Relative transform for shape2
+ xml_dim_t x_pos2(x_shape2.child(_U(position), false));
+ xml_dim_t x_rot2(x_shape2.child(_U(rotation), false));
+ Position pos2{0, 0, 0};
+ Rotation3D rot2;
+ if (x_rot2)
+ rot2 = RotationZYX(x_rot2.z(0), x_rot2.y(0), x_rot2.x(0));
+ if (x_pos2)
+ pos2 = Position(x_pos2.x(0), x_pos2.y(0), x_pos2.z(0));
+ holes.emplace_back(vol2.solid(), Transform3D(rot2, pos2));
}
- if (x_pos2) {
- pos2 = Position(x_pos2.x(0), x_pos2.y(0), x_pos2.z(0));
+
+ if (!baseSet) {
+ printout(ERROR, x_det.nameStr(), "Subtraction %s: no base shape found (role=\"base\").",
+ x_subtraction.nameStr().c_str());
+ std::exit(1);
}
- // Create the subtraction solid
- Transform3D tr_relative(rot2, pos2);
- SubtractionSolid subtracted_solid(solid1, solid2, tr_relative);
+ // Chain subtractions: base − hole1 − hole2 − ...
+ Solid current = baseSolid;
+ for (auto& h : holes) {
+ current = SubtractionSolid(current, h.first, h.second);
+ }
- // Create volume with the subtracted solid
- Material mat = descr.material(getAttrOrDefault(x_subtraction, _U(material), "Air"));
- std::string vol_name = getAttrOrDefault(x_subtraction, _U(name), "subtraction_vol");
- Volume vol{vol_name, subtracted_solid, mat};
+ // Create the resulting volume
+ Material mat =
+ descr.material(getAttrOrDefault(x_subtraction, _Unicode(material), "Air"));
+ std::string vol_name =
+ getAttrOrDefault(x_subtraction, _Unicode(name), "subtraction_vol");
+ Volume vol{vol_name, current, mat};
- // Get overall position/rotation for the subtracted volume
+ // Overall placement of the resulting volume
xml_dim_t x_pos(x_subtraction.child(_U(position), false));
xml_dim_t x_rot(x_subtraction.child(_U(rotation), false));
Position pos3D{0, 0, 0};
Rotation3D rot3D;
-
- if (x_rot) {
+ if (x_rot)
rot3D = RotationZYX(x_rot.z(0), x_rot.y(0), x_rot.x(0));
- }
- if (x_pos) {
+ if (x_pos)
pos3D = Position(x_pos.x(0), x_pos.y(0), x_pos.z(0));
- }
-
Transform3D tr(rot3D, pos3D);
// Set visualization if specified
@@ -219,7 +262,8 @@ std::pair build_subtraction(const Detector& descr, const xm
}
// Debug output
- printout(DEBUG, "SupportServiceMaterial", "Created subtraction volume: %s", vol_name.c_str());
+ printout(DEBUG, "SupportServiceMaterial", "Created subtraction volume: %s (holes=%d)",
+ vol_name.c_str(), int(holes.size()));
return {vol, tr};
}