From a36974015e6ba3c60717f289c203456eafd601f8 Mon Sep 17 00:00:00 2001
From: David Emschermann <d.emschermann@gsi.de>
Date: Wed, 27 Nov 2024 12:38:29 +0100
Subject: [PATCH 1/4] Add mMVD v25a geometry, 2 sensors back to back for the
 Feb 2025 run

---
 .../mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C  | 424 ++++++++++++++++++
 1 file changed, 424 insertions(+)
 create mode 100644 macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C

diff --git a/macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C b/macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C
new file mode 100644
index 0000000..c56f251
--- /dev/null
+++ b/macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C
@@ -0,0 +1,424 @@
+/* Copyright (C) 2020 Institut fuer Kernphysik, Goethe-Universitaet Frankfurt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Phillip Klaus [committer] */
+
+// 2024-11-27 - DE - Stripped down variant mMVD 2025 with 2 sensors back to back based on MVD v20c by Phillip Klaus 
+
+/*
+ * ROOT Macro to create the geometry of the Micro Vertex Detector
+ * of the CBM experiment at FAIR. It is used within the CbmRoot
+ * framework to simulate the detector response.
+ *
+ * The main output of this script is a .root file containing the
+ * the volumes of the detector. The media those volumes are
+ * filled with / made of are referenced in this script only by name
+ * and defined in a separate ASCII file named media.geo.
+ *
+ * For some components, their medium is a surrogate with equivalent
+ * material budget to simplify the design and speed-up simulation or
+ * because we depend on educated estimates regarding their material
+ * composition for the time being.
+ */
+
+/*
+ * Parameters defining the MVD
+ */
+
+// DE static const int numStations = 4;
+static const int numStations = 1;
+// all units are in cm
+// Float_t quadrantBeamOffset[4] = {0.54, 0.54, 0.82, 1.04};
+Float_t carrierClampOverlap = 0.0;
+// Float_t heatsinkWidth[4] = {23.1, 31.1, 34.34, 37.7};
+Float_t heatsinkHeight = 37.7;
+// Heatsink actual thickness: 1.0cm
+// The additional contributionof 0.7cm is a surrogate
+// for FEBs incl. FR-4, copper, connectors:
+Float_t heatsinkThickness = 1.0 + 0.7;
+Float_t topPlateThickness = 1.0;
+Float_t fpcWidth = 1.9;
+Float_t fpcThickness = 0.0009;
+Float_t glueThickness = 0.0008;
+
+/* MIMOSIS dimensions
+   https://indico.gsi.de/contributionDisplay.py?contribId=8&sessionId=6&confId=4759
+   30.97 x 16.55 mm2 (of which the lower 3mm inactive) */
+Float_t sensorDimensionsActive[3] = {3.097, 1.355, 0.005};
+Float_t sensorDimensionsPassive[3] = {3.097, 0.300, 0.005};
+
+// Formula for the carrier dimensions height ([1]):
+// nrows * sensorDimensionsActive[1] + (nrows - 1) * sensorActiveOverlap +
+// sensorDimensionsPassive[1] + fpcWidth + 0.1 eg. for nrows=2:
+// 2*1.355-(2-1)*0.05+0.3+1.9+0.1
+
+/* MIMOSIS-based tr (tracking) variant (general purpose tracking variant) */
+Float_t stationPosition[4] = {4.0, 8.0, 12.0, 16.0};
+// int sensorRows[4] = {4, 4, 7, 7};
+int sensorRows[4] = {2, 4, 7, 7}; // only 2 sensors
+// DE int sensorCols[4] = {2, 2, 4, 4};
+int sensorCols[4] = {1, 2, 4, 4}; // only 1 sensor
+Float_t heatsinkWidth[4] = {31.1, 31.1, 37.7, 37.7};
+Float_t quadrantBeamOffset[4] = {0.54, 0.54, 1.04, 1.04};
+// 0.5 - 0.005 - 2 * 0.0008 = 
+Float_t carrierDimensions[4][3] = {{3.097, 1.355, 0.4934}, // 0.5 cm gap
+                                   {7.19, 7.57, 0.038},
+                                   {13.39, 11.485, 0.038},
+                                   {13.39, 11.485, 0.038}};
+// DE Float_t carrierDimensions[4][3] = {{7.19, 7.57, 0.038},
+// DE                                    {7.19, 7.57, 0.038},
+// DE                                    {13.39, 11.485, 0.038},
+// DE                                    {13.39, 11.485, 0.038}};
+int carrierMaterials[4] = {1, 1, 1, 1}; // 0 = diamond, 1 = TPG
+
+/* MIMOSIS-based vx (vertexing) variant (dedicated vertexing variant) */
+/*
+Float_t stationPosition[4] = {1.0, 6.0, 11.0, 16.0};
+int sensorRows[4] = {2, 4, 7, 7};
+int sensorCols[4] = {1, 2, 4, 4};
+Float_t heatsinkWidth[4] = {23.1, 31.1, 37.7, 37.7};
+Float_t quadrantBeamOffset[4] = {0.54, 0.54, 1.04, 1.04};
+Float_t carrierDimensions[4][3] = {{4.10, 4.96, 0.015},
+                                   {7.19, 7.57, 0.038},
+                                   {13.39, 11.485, 0.038},
+                                   {13.39, 11.485, 0.038}};
+int carrierMaterials[4] = {0, 1, 1, 1}; // 0 = diamond, 1 = TPG
+*/
+
+Float_t sensorActiveOverlap = 0.05;
+Float_t sensorPitch = sensorDimensionsActive[1] - sensorActiveOverlap;
+Float_t sensorSpacing = 0.0; // realistically: 0.01 (100um)
+
+// if an artificially exploded view is desired, adjust this parameter:
+Float_t explosion =
+    1.0; // set to 1. for no explosion, and 3. for a heavy explosion
+
+/*
+ * Procedural code assemblying the MVD
+ */
+
+void Create_MVD_geometry_v25a_mcbm() {
+  TGeoVolume *top;
+  TGeoVolume *stations[numStations];
+  TGeoVolume *quadrant;
+
+  TCanvas *c3D = new TCanvas("c3D", "MVD Layout", 1600, 1200);
+
+  TGeoManager *manager = new TGeoManager("Chamber Layout", "Chamber Layout");
+  TGeoMaterial *mat = new TGeoMaterial("vacuum", 0., 0., 0.);
+  TGeoMaterial *matAl = new TGeoMaterial("aluminium", 0., 0., 0.);
+  TGeoMaterial *matSilicon = new TGeoMaterial("silicon", 0, 0, 0);
+  TGeoMaterial *matGlue = new TGeoMaterial("MVD_glue", 0, 0, 0);
+  TGeoMaterial *matTPG = new TGeoMaterial("MVD_tpg", 0, 0, 0);
+  TGeoMaterial *matDiamond = new TGeoMaterial("MVD_cvd_diamond", 0, 0, 0);
+  TGeoMaterial *matFPC = new TGeoMaterial("MVD_fpc", 0, 0, 0);
+  TGeoMedium *vac = new TGeoMedium("vacuumMed", 0, mat);
+  TGeoMedium *Al = new TGeoMedium("AlMed", 2, matAl);
+  TGeoMedium *silicon = new TGeoMedium("siliconMed", 2, matSilicon);
+  TGeoMedium *glue = new TGeoMedium("glueMed", 2, matGlue);
+  TGeoMedium *tpg = new TGeoMedium("tpgMed", 2, matTPG);
+  TGeoMedium *diamond = new TGeoMedium("diamondMed", 2, matDiamond);
+  TGeoMedium *FPC = new TGeoMedium("FPCMed", 2, matFPC);
+  top = manager->MakeBox("Top", vac, 300., 300., 300.);
+
+  manager->SetTopVolume(top);
+
+  TGeoVolume *mvd = new TGeoVolumeAssembly("MVDscripted");
+
+  TGeoVolume *sensorActive = manager->MakeBox(
+      "sensorActive", silicon, sensorDimensionsActive[0] / 2,
+      sensorDimensionsActive[1] / 2, sensorDimensionsActive[2] / 2);
+  TGeoVolume *sensorPassive = manager->MakeBox(
+      "sensorPassive", silicon, sensorDimensionsPassive[0] / 2,
+      sensorDimensionsPassive[1] / 2, sensorDimensionsPassive[2] / 2);
+  TGeoVolume *sensorGlue = manager->MakeBox(
+      "sensorGlue", glue, sensorDimensionsActive[0] / 2,
+      (sensorDimensionsActive[1] + sensorDimensionsPassive[1]) / 2,
+      glueThickness / 2);
+  sensorActive->SetTransparency(0);
+  sensorActive->SetLineColor(kAzure + 3);
+  sensorPassive->SetTransparency(0);
+  sensorPassive->SetLineColor(kCyan + 1);
+  sensorGlue->SetTransparency(0);
+  sensorGlue->SetLineColor(kCyan - 10);
+
+  Float_t fpcGlueDimensions[2] = {sensorDimensionsActive[0],
+                                  sensorPitch - sensorActiveOverlap};
+  TGeoVolume *fpcGlue =
+      manager->MakeBox("fpcGlue", glue, fpcGlueDimensions[0] / 2,
+                       fpcGlueDimensions[1] / 2, glueThickness / 2);
+  fpcGlue->SetTransparency(0);
+  fpcGlue->SetLineColor(kCyan - 10);
+
+  TGeoTranslation T;
+  TGeoRotation R;
+  TGeoCombiTrans *M;
+  char station_name[30], quadrant_name[30], carrier_name[30], heatsink_name[30],
+      heatsinkpart_name[30], cable_name[30];
+  int heatsinkpartno = 0, cablepartno = 0;
+
+  // --- Sensor Assembly
+  TGeoVolume *sensor = new TGeoVolumeAssembly("sensor");
+  // Glue
+  Float_t x_offset = -sensorDimensionsActive[0] / 2;
+  Float_t y_offset =
+      -(sensorDimensionsActive[1] + sensorDimensionsPassive[1]) / 2;
+  Float_t z_offset = glueThickness / 2;
+  T.SetTranslation(x_offset, y_offset, -z_offset);
+  R.SetAngles(0., 0., 0.);
+  M = new TGeoCombiTrans(T, R);
+  sensor->AddNode(sensorGlue, 1, M);
+  // Active
+  x_offset = -sensorDimensionsActive[0] / 2;
+  y_offset = -sensorDimensionsActive[1] / 2;
+  z_offset = sensorDimensionsActive[2] / 2 + glueThickness;
+  T.SetTranslation(x_offset, y_offset, -z_offset);
+  M = new TGeoCombiTrans(T, R);
+  sensor->AddNode(sensorActive, 1, M);
+  // Passive
+  y_offset = -sensorDimensionsPassive[1] / 2 - sensorDimensionsActive[1];
+  T.SetTranslation(x_offset, y_offset, -z_offset);
+  M = new TGeoCombiTrans(T, R);
+  sensor->AddNode(sensorPassive, 1, M);
+
+  for (int i = 0; i < numStations; i++) {
+    // --- Station Assembly
+    cout << "Station " << i << endl;
+    sprintf(station_name, "station_S%i", i);
+    TGeoVolume *station = new TGeoVolumeAssembly(station_name);
+    // --- Quadrant Assembly
+    sprintf(quadrant_name, "quadrant_S%i", i);
+    quadrant = new TGeoVolumeAssembly(quadrant_name);
+    // --- Heatsink Assembly
+    sprintf(heatsink_name, "heatsink_S%i", i);
+    TGeoVolume *heatsink = new TGeoVolumeAssembly(heatsink_name);
+    // --- Carrier
+    sprintf(carrier_name, "carrier_S%i", i);
+    Float_t cd[3] = {carrierDimensions[i][0], carrierDimensions[i][1],
+                     carrierDimensions[i][2]};
+    TGeoMedium *carrierMedium;
+    int carrierColor;
+    switch (carrierMaterials[i]) {
+    case 0:
+      carrierMedium = diamond;
+      carrierColor = kGray;
+      break;
+    case 1:
+      carrierMedium = tpg;
+      carrierColor = kGray + 3;
+      break;
+    default:
+      printf("Carrier material index not found: %i\n", carrierMaterials[i]);
+      exit(1);
+    }
+     TGeoVolume *carrier =
+         manager->MakeBox(carrier_name, carrierMedium, cd[0] / 2, cd[1] / 2, cd[2] / 2);
+     carrier->SetTransparency(0);
+     carrier->SetLineColor(carrierColor);
+     T.SetTranslation(-cd[0] / 2, -cd[1] / 2, 0);
+     R.SetAngles(0., 0., 0.);
+     M = new TGeoCombiTrans(T, R);
+     quadrant->AddNode(carrier, 1, M);
+// DE     // --- Heatsink
+// DE     R.SetAngles(0., 0., 0.);
+// DE     // first part next to carrier
+// DE     sprintf(heatsinkpart_name, "heatsinkpart_%i", heatsinkpartno++);
+// DE     Float_t height_1 = heatsinkWidth[i] / 2 - cd[1] + carrierClampOverlap -
+// DE                        quadrantBeamOffset[i];
+// DE     Float_t width_1 = heatsinkWidth[i] / 2 + quadrantBeamOffset[i];
+// DE     Float_t thickness = heatsinkThickness;
+// DE     TGeoVolume *hs_part1 = manager->MakeBox(heatsinkpart_name, Al, width_1 / 2.,
+// DE                                             height_1 / 2., thickness / 2.);
+// DE     hs_part1->SetTransparency(10);
+// DE     hs_part1->SetLineColor(kGray);
+// DE     T.SetTranslation(-width_1 / 2, -height_1 / 2 - cd[1] + carrierClampOverlap,
+// DE                      0);
+// DE     M = new TGeoCombiTrans(T, R);
+// DE     quadrant->AddNode(hs_part1, 1, M);
+// DE     // second part next to carrier
+// DE     sprintf(heatsinkpart_name, "heatsinkpart_%i", heatsinkpartno++);
+// DE     Float_t height_2 = heatsinkWidth[i] - height_1 - width_1;
+// DE     Float_t width_2 = heatsinkWidth[i] / 2 - cd[0] + carrierClampOverlap +
+// DE                       quadrantBeamOffset[i];
+// DE     TGeoVolume *hs_part2 = manager->MakeBox(heatsinkpart_name, Al, width_2 / 2,
+// DE                                             height_2 / 2, thickness / 2);
+// DE     hs_part2->SetTransparency(10);
+// DE     hs_part2->SetLineColor(kGray);
+// DE     T.SetTranslation(-width_2 / 2 - cd[0] + carrierClampOverlap, -height_2 / 2,
+// DE                      0);
+// DE     M = new TGeoCombiTrans(T, R);
+// DE     quadrant->AddNode(hs_part2, 1, M);
+// DE     // element to fill top and bottom if needed
+// DE     sprintf(heatsinkpart_name, "heatsinkpart_%i", heatsinkpartno++);
+// DE     Float_t height = (heatsinkHeight - heatsinkWidth[i]) / 2;
+// DE     if (height > 0.1) {
+// DE       TGeoVolume *hs_part3 =
+// DE           manager->MakeBox(heatsinkpart_name, Al, heatsinkWidth[i] / 2,
+// DE                            height / 2, heatsinkThickness / 2);
+// DE       hs_part3->SetTransparency(10);
+// DE       hs_part3->SetLineColor(kGray);
+// DE       T.SetTranslation(0, height / 2 + heatsinkWidth[i] / 2, 0);
+// DE       M = new TGeoCombiTrans(T, R);
+// DE       heatsink->AddNode(hs_part3, 1, M);
+// DE       T.SetTranslation(0, -(height / 2 + heatsinkWidth[i] / 2), 0);
+// DE       M = new TGeoCombiTrans(T, R);
+// DE       heatsink->AddNode(hs_part3, 2, M);
+// DE       T.SetTranslation(0, 0, 0);
+// DE       M = new TGeoCombiTrans(T, R);
+// DE       station->AddNode(heatsink, 1, M);
+// DE     }
+    // --- Sensors
+    cout << "  # of sensors per quadrant: " << sensorCols[i] * sensorRows[i]
+         << endl;
+    R.SetAngles(0., 0., 0.);
+    TGeoVolume *cable;
+    Float_t cableDimensions[2] = {0.0, 0.0};
+    for (int k = 0; k < sensorCols[i]; k++) {
+      if (k % 2 == 0) {
+        // Make new cable with correct dimensions
+        sprintf(cable_name, "cable_%i", cablepartno++);
+        cableDimensions[0] = cd[0] - sensorDimensionsActive[0] * k;
+        cableDimensions[1] = fpcWidth;
+        cable = manager->MakeBox(cable_name, FPC, cableDimensions[0] / 2,
+                                 cableDimensions[1] / 2, fpcThickness / 2);
+        cable->SetTransparency(0);
+        cable->SetLineColor(kSpring - 1);
+      }
+      for (int l = 0; l < sensorRows[i]; l++) {
+// DE       Float_t y_offset = -sensorPitch * l;
+        Float_t y_offset = 0;
+        Float_t z_offset = cd[2] / 2;
+        R.SetAngles(0., 0., 0.);
+        Float_t x_offset = -sensorDimensionsActive[0] * k;
+        if (l % 2 == 0) // front side
+          z_offset = -z_offset;
+        if (l % 2 == 1) // back side
+        {
+          R.SetAngles(0., 180., 180.);
+          x_offset -= sensorDimensionsActive[0];
+        }
+        T.SetTranslation(x_offset, y_offset, z_offset);
+        M = new TGeoCombiTrans(T, R);
+        quadrant->AddNode(sensor, k * sensorRows[i] + l, M);
+// DE         if (k % 2 == 0) {
+// DE           // add FPC and glue for the cable
+// DE           Float_t directional_z_offset = 0.0;
+// DE           directional_z_offset += glueThickness;             // sensor glue
+// DE           directional_z_offset += sensorDimensionsActive[2]; // sensor
+// DE           directional_z_offset +=
+// DE               (fpcThickness + glueThickness) * (k / 2); // fpcAssembly pitch
+// DE           // fpcGlue
+// DE           Float_t fpcGlue_x_offset =
+// DE               -fpcGlueDimensions[0] / 2 - sensorDimensionsActive[0] * k;
+// DE           Float_t fpcGlue_y_offset = -fpcGlueDimensions[1] / 2 -
+// DE                                      sensorPitch * (l + 1) -
+// DE                                      sensorDimensionsPassive[1];
+// DE           Float_t fpcGlue_z_offset = z_offset;
+// DE           directional_z_offset += glueThickness / 2;
+// DE           if (l % 2 == 0) // front side
+// DE             fpcGlue_z_offset -= directional_z_offset;
+// DE           if (l % 2 == 1) // back side
+// DE             fpcGlue_z_offset += directional_z_offset;
+// DE           T.SetTranslation(fpcGlue_x_offset, fpcGlue_y_offset,
+// DE                            fpcGlue_z_offset);
+// DE           R.SetAngles(0., 0., 0.);
+// DE           M = new TGeoCombiTrans(T, R);
+// DE           quadrant->AddNode(fpcGlue, 1, M);
+// DE           if (k != sensorCols[i] - 1) {
+// DE             T.SetTranslation(fpcGlue_x_offset - fpcGlueDimensions[0],
+// DE                              fpcGlue_y_offset, fpcGlue_z_offset);
+// DE             R.SetAngles(0., 0., 0.);
+// DE             M = new TGeoCombiTrans(T, R);
+// DE             quadrant->AddNode(fpcGlue, 1, M);
+// DE           }
+// DE           // cable
+// DE           Float_t fpc_x_offset =
+// DE               -cableDimensions[0] / 2 - sensorDimensionsActive[0] * k;
+// DE           Float_t fpc_y_offset = -cableDimensions[1] / 2 -
+// DE                                  sensorPitch * (l + 1) -
+// DE                                  sensorDimensionsPassive[1];
+// DE           Float_t fpc_z_offset = z_offset;
+// DE           directional_z_offset += glueThickness / 2;
+// DE           directional_z_offset += fpcThickness / 2;
+// DE           if (l % 2 == 0) // front side
+// DE             fpc_z_offset -= directional_z_offset;
+// DE           if (l % 2 == 1) // back side
+// DE             fpc_z_offset += directional_z_offset;
+// DE           T.SetTranslation(fpc_x_offset, fpc_y_offset, fpc_z_offset);
+// DE           R.SetAngles(0., 0., 0.);
+// DE           M = new TGeoCombiTrans(T, R);
+// DE           quadrant->AddNode(cable, l + 1, M);
+// DE         }
+      }
+    }
+    for (int j = 0; j < 1; j++) { // only 1 quadrant
+// DE   for (int j = 0; j < 4; j++) {
+      cout << " Quadrant " << j << endl;
+      Float_t x_sign = (j == 0 || j == 3) ? 1. : -1.;
+      Float_t y_sign = (j == 0 || j == 1) ? -1. : 1.;
+      T.SetTranslation(0, 0, 0.505 / 2);
+// DE     T.SetTranslation(x_sign * quadrantBeamOffset[i],
+// DE                      y_sign * quadrantBeamOffset[i], 0);
+      R.SetAngles(0., 0., -90. * j);
+      M = new TGeoCombiTrans(T, R);
+      station->AddNode(quadrant, j, M);
+    }
+// DE    T.SetTranslation(0, 0, explosion * stationPosition[i]);
+    T.SetTranslation(0, 0, 0);
+    R.SetAngles(0., 0., 0.);
+    M = new TGeoCombiTrans(T, R);
+    mvd->AddNode(station, 1, M);
+    station->Draw("");
+    gPad->GetView()->RotateView(90, 180);
+// DE   char filename[30];
+// DE   sprintf(filename, "mvd.root.S%i.pdf", i);
+// DE   c3D->SaveAs(filename);
+    stations[i] = station;
+  }
+
+// DE   // Add top and bottom mounting plates
+// DE   double depth =
+// DE       stationPosition[numStations - 1] - stationPosition[0] + heatsinkThickness;
+// DE   TGeoVolume *top_bottom_plate = manager->MakeBox(
+// DE       "top_bottom_plate", Al, heatsinkWidth[numStations - 1] / 2,
+// DE       topPlateThickness / 2, depth / 2);
+// DE   top_bottom_plate->SetTransparency(10);
+// DE   top_bottom_plate->SetLineColor(kGray);
+// DE   T.SetTranslation(0, +heatsinkHeight / 2 + topPlateThickness / 2,
+// DE                    depth / 2 + stationPosition[0] - heatsinkThickness / 2);
+// DE   M = new TGeoCombiTrans(T, R);
+// DE   mvd->AddNode(top_bottom_plate, 1, M);
+// DE   T.SetTranslation(0, -heatsinkHeight / 2 - topPlateThickness / 2,
+// DE                    depth / 2 + stationPosition[0] - heatsinkThickness / 2);
+// DE   M = new TGeoCombiTrans(T, R);
+// DE   mvd->AddNode(top_bottom_plate, 2, M);
+
+  // Demonstration target:
+  // TGeoVolume *target = manager->MakeBox("target", silicon, 0.5, 0.5, 0.05);
+  // mvd->AddNode(target, 1);
+
+  top->AddNode(mvd, 1);
+  // Standard checks, to be executed at least before submitting a new geo
+  manager->CloseGeometry();
+  manager->CheckOverlaps(0.001, "s");
+  top->CheckOverlaps(0.001, "s");
+  top->FindOverlaps();
+  quadrant->CheckOverlaps(0.001, "s");
+  manager->CheckGeometryFull();
+  // done with standard checks
+  top->Export("mvd_v25a_mcbm.geo.root");
+  // Also add transformation matrix to place in space:
+  TGeoTranslation *mvd_trans = new TGeoTranslation("", 0., 0., 0);
+  TGeoRotation *mvd_rot = new TGeoRotation();
+  TGeoCombiTrans *mvd_combi_trans = new TGeoCombiTrans(*mvd_trans, *mvd_rot);
+  TFile *outfile = new TFile("mvd_v25a_mcbm.geo.root", "UPDATE");
+  mvd_combi_trans->Write();
+  outfile->Close();
+  mvd->Draw("ogl");
+  // station->Draw("ogl");
+  // quadrant->Draw("ogl");
+  // quadrant->Draw("");
+  // quadrant->Raytrace();
+  // top->Draw("");
+  // gPad->GetView()->ShowAxis();
+  // top->Raytrace();
+}
-- 
GitLab


From 9d2b85f717c3679cef25654983a2086589ae3274 Mon Sep 17 00:00:00 2001
From: David Emschermann <d.emschermann@gsi.de>
Date: Wed, 27 Nov 2024 15:24:55 +0100
Subject: [PATCH 2/4] Extend length of carrier volume

---
 macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C b/macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C
index c56f251..01bf61b 100644
--- a/macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C
+++ b/macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C
@@ -53,14 +53,15 @@ Float_t sensorDimensionsPassive[3] = {3.097, 0.300, 0.005};
 
 /* MIMOSIS-based tr (tracking) variant (general purpose tracking variant) */
 Float_t stationPosition[4] = {4.0, 8.0, 12.0, 16.0};
-// int sensorRows[4] = {4, 4, 7, 7};
+// DE int sensorRows[4] = {4, 4, 7, 7};
 int sensorRows[4] = {2, 4, 7, 7}; // only 2 sensors
 // DE int sensorCols[4] = {2, 2, 4, 4};
 int sensorCols[4] = {1, 2, 4, 4}; // only 1 sensor
 Float_t heatsinkWidth[4] = {31.1, 31.1, 37.7, 37.7};
 Float_t quadrantBeamOffset[4] = {0.54, 0.54, 1.04, 1.04};
 // 0.5 - 0.005 - 2 * 0.0008 = 
-Float_t carrierDimensions[4][3] = {{3.097, 1.355, 0.4934}, // 0.5 cm gap
+// DE Float_t carrierDimensions[4][3] = {{3.097, 1.355, 0.4934}, // 0.5 cm gap
+Float_t carrierDimensions[4][3] = {{3.097, 1.655, 0.4934}, // 0.5 cm gap
                                    {7.19, 7.57, 0.038},
                                    {13.39, 11.485, 0.038},
                                    {13.39, 11.485, 0.038}};
@@ -101,7 +102,8 @@ void Create_MVD_geometry_v25a_mcbm() {
   TGeoVolume *stations[numStations];
   TGeoVolume *quadrant;
 
-  TCanvas *c3D = new TCanvas("c3D", "MVD Layout", 1600, 1200);
+// DE  TCanvas *c3D = new TCanvas("c3D", "MVD Layout", 1600, 1200);
+  TCanvas *c3D = new TCanvas("c3D", "MVD Layout", 800, 600);
 
   TGeoManager *manager = new TGeoManager("Chamber Layout", "Chamber Layout");
   TGeoMaterial *mat = new TGeoMaterial("vacuum", 0., 0., 0.);
@@ -204,7 +206,8 @@ void Create_MVD_geometry_v25a_mcbm() {
       break;
     case 1:
       carrierMedium = tpg;
-      carrierColor = kGray + 3;
+// DE      carrierColor = kGray + 3;
+      carrierColor = kGray;
       break;
     default:
       printf("Carrier material index not found: %i\n", carrierMaterials[i]);
@@ -367,6 +370,7 @@ void Create_MVD_geometry_v25a_mcbm() {
     R.SetAngles(0., 0., 0.);
     M = new TGeoCombiTrans(T, R);
     mvd->AddNode(station, 1, M);
+// DE   station->Draw("ogl");
     station->Draw("");
     gPad->GetView()->RotateView(90, 180);
 // DE   char filename[30];
@@ -413,6 +417,7 @@ void Create_MVD_geometry_v25a_mcbm() {
   TFile *outfile = new TFile("mvd_v25a_mcbm.geo.root", "UPDATE");
   mvd_combi_trans->Write();
   outfile->Close();
+
   mvd->Draw("ogl");
   // station->Draw("ogl");
   // quadrant->Draw("ogl");
-- 
GitLab


From 1b68b82c17121ae4439859c23944b300f3640fa5 Mon Sep 17 00:00:00 2001
From: David Emschermann <d.emschermann@gsi.de>
Date: Thu, 28 Nov 2024 18:42:54 +0100
Subject: [PATCH 3/4] Set sensor separation front-to-front to 0.5233 cm

---
 macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C b/macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C
index 01bf61b..95e7a7d 100644
--- a/macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C
+++ b/macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C
@@ -59,9 +59,11 @@ int sensorRows[4] = {2, 4, 7, 7}; // only 2 sensors
 int sensorCols[4] = {1, 2, 4, 4}; // only 1 sensor
 Float_t heatsinkWidth[4] = {31.1, 31.1, 37.7, 37.7};
 Float_t quadrantBeamOffset[4] = {0.54, 0.54, 1.04, 1.04};
-// 0.5 - 0.005 - 2 * 0.0008 = 
+// 0.5 - 0.005 - 2 * 0.0008 = 0.4934
+// 0.5233 - 0.005 - 2 * 0.0008 = 0.5167
 // DE Float_t carrierDimensions[4][3] = {{3.097, 1.355, 0.4934}, // 0.5 cm gap
-Float_t carrierDimensions[4][3] = {{3.097, 1.655, 0.4934}, // 0.5 cm gap
+//Float_t carrierDimensions[4][3] = {{3.097, 1.655, 0.4934}, // 0.5 cm gap
+Float_t carrierDimensions[4][3] = {{3.097, 1.655, 0.5167}, // 0.5 cm gap
                                    {7.19, 7.57, 0.038},
                                    {13.39, 11.485, 0.038},
                                    {13.39, 11.485, 0.038}};
@@ -358,7 +360,7 @@ void Create_MVD_geometry_v25a_mcbm() {
       cout << " Quadrant " << j << endl;
       Float_t x_sign = (j == 0 || j == 3) ? 1. : -1.;
       Float_t y_sign = (j == 0 || j == 1) ? -1. : 1.;
-      T.SetTranslation(0, 0, 0.505 / 2);
+      T.SetTranslation(0, 0, (0.5233+0.005) / 2);
 // DE     T.SetTranslation(x_sign * quadrantBeamOffset[i],
 // DE                      y_sign * quadrantBeamOffset[i], 0);
       R.SetAngles(0., 0., -90. * j);
-- 
GitLab


From 180fa008126daf8127a6d88421f34c90ef8caa76 Mon Sep 17 00:00:00 2001
From: David Emschermann <d.emschermann@gsi.de>
Date: Wed, 22 Jan 2025 11:36:49 +0100
Subject: [PATCH 4/4] Remove MVD quadrant carrier material, as sensors are
 mounten on PCBs

---
 macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C b/macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C
index 95e7a7d..5c60dee 100644
--- a/macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C
+++ b/macro/mvd/mcbm/Create_MVD_geometry_v25a_mcbm.C
@@ -170,7 +170,7 @@ void Create_MVD_geometry_v25a_mcbm() {
   T.SetTranslation(x_offset, y_offset, -z_offset);
   R.SetAngles(0., 0., 0.);
   M = new TGeoCombiTrans(T, R);
-  sensor->AddNode(sensorGlue, 1, M);
+// DE  sensor->AddNode(sensorGlue, 1, M);
   // Active
   x_offset = -sensorDimensionsActive[0] / 2;
   y_offset = -sensorDimensionsActive[1] / 2;
@@ -222,7 +222,7 @@ void Create_MVD_geometry_v25a_mcbm() {
      T.SetTranslation(-cd[0] / 2, -cd[1] / 2, 0);
      R.SetAngles(0., 0., 0.);
      M = new TGeoCombiTrans(T, R);
-     quadrant->AddNode(carrier, 1, M);
+// DE     quadrant->AddNode(carrier, 1, M);
 // DE     // --- Heatsink
 // DE     R.SetAngles(0., 0., 0.);
 // DE     // first part next to carrier
@@ -373,7 +373,7 @@ void Create_MVD_geometry_v25a_mcbm() {
     M = new TGeoCombiTrans(T, R);
     mvd->AddNode(station, 1, M);
 // DE   station->Draw("ogl");
-    station->Draw("");
+   station->Draw("");
     gPad->GetView()->RotateView(90, 180);
 // DE   char filename[30];
 // DE   sprintf(filename, "mvd.root.S%i.pdf", i);
@@ -420,7 +420,7 @@ void Create_MVD_geometry_v25a_mcbm() {
   mvd_combi_trans->Write();
   outfile->Close();
 
-  mvd->Draw("ogl");
+  //  mvd->Draw("ogl");
   // station->Draw("ogl");
   // quadrant->Draw("ogl");
   // quadrant->Draw("");
-- 
GitLab