From 84e62054e1f22c9e002566ce3994cb879f7dc448 Mon Sep 17 00:00:00 2001
From: Axel Puntke <axel.puntke@uni-muenster.de>
Date: Wed, 28 Jun 2023 14:59:20 +0000
Subject: [PATCH] Add the TRD Day-1 Geometry (v20b without grayed out modules
 in linked presentation) as requested in redmine issue
 https://redmine.cbm.gsi.de/issues/2888.

---
 .../fair/trd.v23/Create_TRD_Geometry_v23a.C   | 3836 +++++++++++++++++
 trd/trd_v23a_1e.geo.info                      |  126 +
 trd/trd_v23a_1e.geo.root                      |  Bin 0 -> 22876 bytes
 trd/trd_v23a_1h.geo.info                      |  126 +
 trd/trd_v23a_1h.geo.root                      |  Bin 0 -> 22876 bytes
 trd/trd_v23a_1m.geo.info                      |  126 +
 trd/trd_v23a_1m.geo.root                      |  Bin 0 -> 22875 bytes
 7 files changed, 4214 insertions(+)
 create mode 100644 macro/trd/fair/trd.v23/Create_TRD_Geometry_v23a.C
 create mode 100644 trd/trd_v23a_1e.geo.info
 create mode 100644 trd/trd_v23a_1e.geo.root
 create mode 100644 trd/trd_v23a_1h.geo.info
 create mode 100644 trd/trd_v23a_1h.geo.root
 create mode 100644 trd/trd_v23a_1m.geo.info
 create mode 100644 trd/trd_v23a_1m.geo.root

diff --git a/macro/trd/fair/trd.v23/Create_TRD_Geometry_v23a.C b/macro/trd/fair/trd.v23/Create_TRD_Geometry_v23a.C
new file mode 100644
index 00000000..c6f258a2
--- /dev/null
+++ b/macro/trd/fair/trd.v23/Create_TRD_Geometry_v23a.C
@@ -0,0 +1,3836 @@
+/* Copyright (C) 2020 Institut für Kernphysik, Goethe-Universitaet Frankfurt, Frankfurt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Pascal Raisig [committer] */
+
+///
+/// \file Create_TRD_Geometry_v23a.C
+/// \brief Generates TRD geometry in Root format.
+///
+
+// 2023-06-21 - AP - v23a    - based on v20b, removing modules requested for removal in redmine issue 2888 to create TRD "day-1" geometry
+// 2020-10-20 - PR - v20b    - put TRD layers at z-startposition according to 17n/18a, only sis100_hadron at 410 instead of 260 (260 should not be possible due to rail construction)
+// 2020-10-12 - DE - v20a    - put TRD layers at z-positions according to proposed CAD frame design
+// 2017-06-02 - DE - v17n    - increase pad granularity wrt v17l: type 6 = 24 rows, type 8 = 8 rows
+// 2017-05-31 - DE - v17l    - increase large module size to 96/99 cm
+// 2017-05-25 - DE - v17k    - use only 4 module types: 1, 3, 6, 8
+// 2017-05-25 - DE - v17j    - re-arrange inner zone to allow for a 2x1 hole
+// 2017-04-28 - DE - v17     - implement power bus bars as defined in the TDR
+// 2017-04-26 - DE - v17     - add aluminium ledge around backpanel
+// 2017-04-25 - DE - v17c_3e - reduce the number of FEBs on the small modules from 10, 6, 4 to 8, 4 and 2
+// 2017-02-14 - DE - v17b_3e - build TRD from ROB-3 only, optimise layout
+// 2017-01-10 - DE - v17a_3e - replace 6 ultimate density by 9 super density FEBs for TRD type 1 modules
+// 2016-07-05 - FU - v16a_3e - identical to v15a, change the way the trd volume is exported to resolve a bug with TGeoShape destructor
+// 2015-01-08 - DE - v15a_3e - reduce frame thickness in large modules to 15 mm instead of 20 mm
+// 2014-06-25 - DE - v14a_3e - consists of only 3 small and 3 large modules types (was 4+4 before)
+// 2014-06-25 - DE - v14a_3e - inner part of all 3 stations is now identical
+// 2014-05-02 - DE - v14a_3e - redesign inner part of station 3, now with 5x5-1 small modules, like in station 1 and station 2
+// 2014-05-02 - DE - v14a_3e - include optional GBTX readout boards on each module
+// 2014-05-02 - DE - v14a_3e - introduce 3x5=15 Spadic FEBs for ultimate density on module type 1
+//
+// 2013-11-14 - DE - v13q_3e - generate information about pad plane layout (CbmTrdPads_v14a.h) for all module types in this macro
+//
+// 2013-11-04 - DE - v13p4 - adapt the number of front-end boards to the pad layout of the 540 mm modules
+// 2013-11-04 - DE - v13p4 - use 8 module types (4x S + 4x L) to better match the occupancy
+// 2013-10-31 - DE - v13p4 - modify the support structure of station 1 to match with the MUCH/RICH platform
+// 2013-10-29 - DE - v13p4 - build lattice grid as TGeoBBox instead of VolumeAssembly - in run_sim.C save  9% of time compared to v13p7
+// 2013-10-29 - DE - v13p4 - build lattice grid as TGeoBBox instead of CompositeShape - in run_sim.C save 18% of time compared to v13p6
+//
+// 2013-10-28 - DE - introduce new geometry naming scheme: v13p1 - SIS 100 hadron
+// 2013-10-28 - DE - introduce new geometry naming scheme: v13p2 - SIS 100 electron
+// 2013-10-28 - DE - introduce new geometry naming scheme: v13p3 - SIS 100 muon
+// 2013-10-28 - DE - introduce new geometry naming scheme: v13p4 - SIS 300 electron
+// 2013-10-28 - DE - introduce new geometry naming scheme: v13p5 - SIS 300 muon
+// 2013-10-28 - DE - add option to draw the magnetic field vector in the magnet
+// 2013-09-27 - DE - do not use TGeoXtru to build the supports, use TGeoBBox instead
+//
+// 2013-06-25 - DE - v13g trd300_rich             (10 layers, z = 4100 ) - TRD right behind SIS300 RICH
+// 2013-06-25 - DE - v13h trd100_sts              ( 4 layers, z = 2600 ) - TRD completely on RICH/MUCH platform to allow TOF to move upstream
+// 2013-06-25 - DE - v13i trd100_rich             ( 2 layers, z = 4100 ) - TRD right behind RICH
+// 2013-06-25 - DE - v13j trd100_rich             ( 3 layers, z = 4100 ) - TRD right behind RICH
+// 2013-06-25 - DE - v13k trd100_rich             ( 4 layers, z = 4100 ) - TRD right behind RICH
+// 2013-06-25 - DE - ---  trd100_much_2_absorbers ( 4 layers, z = 4300 ) - same as version at z = 4600
+// 2013-06-25 - DE - v13l trd100_much_3_absorbers ( 4 layers, z = 4600 ) - TRD right behind SIS100 MUCH
+// 2013-06-25 - DE - v13m trd300_much_6_absorbers (10 layers, z = 5500 ) - TRD right behind SIS300 MUCH
+// 2013-06-25 - DE - v13n trd300_rich_stretched   (10 layers, z = 4600 ) - TRD stretched behind SIS300 RICH
+//
+// 2013-06-19 - DE - add TRD (I, II, III) labels on support structure
+// 2013-05-29 - DE - allow for flexible TRD z-positions defined by position of layer01
+// 2013-05-23 - DE - remove "trd_" prefix from node names (except top node)
+// 2013-05-22 - DE - radiators G30 (z=240 mm)
+// 2013-05-22 - DE - radiators H (z=275 mm - 125 * 2.2mm), (H++ z=335 mm)
+// 2013-05-22 - DE - radiators B++ (z=254 mm - 350 * 0.724 mm), K++ (z=254 mm - 350 * 0.724 mm)
+// 2013-04-17 - DE - introduce volume assembly for layers, e.g. trd_layer03
+// 2013-03-26 - DE - use Air as ASIC material
+// 2013-03-26 - DE - put support structure into its own assembly
+// 2013-03-26 - DE - move TRD upstream to z=400m
+// 2013-03-26 - DE - RICH will probably end at z=380 cm, TRD can move to 400 cm
+// 2013-03-25 - DE - shrink active area from 570 to 540 mm and 960 to 910 mm
+// 2013-03-06 - DE - add ASICs on FEBs
+// 2013-03-05 - DE - introduce supports for SIS100 and SIS300
+// 2013-03-05 - DE - replace all Float_t by Double_t
+// 2013-01-21 - DE - introduce TRD media, use TRDG10 as material for pad plane and FEBs
+// 2013-01-21 - DE - put backpanel into the geometry
+// 2013-01-11 - DE - allow for misalignment of TRD modules
+// 2012-11-04 - DE - add kapton foil, add FR4 padplane
+// 2012-11-03 - DE - add lattice grid on entrance window as CompositeShape
+
+// TODO:
+// - use Silicon as ASIC material
+
+// in root all sizes are given in cm
+
+#include "TDatime.h"
+#include "TFile.h"
+#include "TGeoArb8.h"
+#include "TGeoCompositeShape.h"
+#include "TGeoCone.h"
+#include "TGeoManager.h"
+#include "TGeoMaterial.h"
+#include "TGeoMatrix.h"
+#include "TGeoMedium.h"
+#include "TGeoPgon.h"
+#include "TGeoTube.h"
+#include "TGeoVolume.h"
+#include "TGeoXtru.h"
+#include "TList.h"
+#include "TRandom3.h"
+#include "TString.h"
+#include "TSystem.h"
+
+#include <iostream>
+
+// Name of output file with geometry
+const TString tagVersion = "v23a";
+//const TString subVersion   = "_1h";
+//const TString subVersion   = "_1e";
+//const TString subVersion   = "_1m";
+//const TString subVersion   = "_3e";
+//const TString subVersion   = "_3m";
+
+const Int_t setupid = 1;  // 1e is the default
+//const Double_t zfront[5]  = { 260., 410., 360., 410., 550. };  // original
+const Double_t zfront[5]  = {410.,         // SIS100 hadron
+                            410.,         // SIS100 electron
+                            490.,         // SIS100 muon
+                            410., 550.};  // muon_jpsi and muon_lmvm
+const TString setupVer[5] = {"_1h", "_1e", "_1m", "_3e", "_3m"};
+const TString subVersion  = setupVer[setupid];
+
+const TString geoVersion   = "trd_" + tagVersion + subVersion;
+const TString FileNameSim  = geoVersion + ".geo.root";
+const TString FileNameGeo  = geoVersion + "_geo.root";
+const TString FileNameInfo = geoVersion + ".geo.info";
+const TString FileNamePads = "CbmTrdPads_" + tagVersion + ".h";
+
+// display switches
+const Bool_t IncludeRadiator = true;  // false;  // true, if radiator is included in geometry
+const Bool_t IncludeLattice  = true;  // false;  // true, if lattice grid is included in geometry
+
+const Bool_t IncludeKaptonFoil = true;  // false;  // true, if entrance window is included in geometry
+const Bool_t IncludeGasFrame   = true;  // false;  // true, if frame around gas volume is included in geometry
+const Bool_t IncludePadplane   = true;  // false;  // true, if padplane is included in geometry
+const Bool_t IncludeBackpanel  = true;  // false;  // true, if backpanel is included in geometry
+const Bool_t IncludeAluLedge   = true;  // false;  // true, if Al-ledge around the backpanel is included in geometry
+const Bool_t IncludePowerbars  = true;  // false;  // true, if LV copper bus bars to be drawn
+
+const Bool_t IncludeFebs        = true;   // false;  // true, if FEBs are included in geometry
+const Bool_t IncludeRobs        = true;   // false;  // true, if ROBs are included in geometry
+const Bool_t IncludeAsics       = true;   // false;  // true, if ASICs are included in geometry
+const Bool_t IncludeSupports    = true;   // false;  // true, if support structure is included in geometry
+const Bool_t IncludeLabels      = true;   // false;  // true, if TRD (I, II, III) labels are plotted in (VisLevel 5)
+const Bool_t IncludeFieldVector = false;  // true, if magnetic field vector to be shown (in the magnet)
+
+// positioning switches
+const Bool_t DisplaceRandom = false;  // true; // false;  // add random displacement of modules for alignment study
+const Bool_t RotateRandom   = false;  // true; // false;  // add random rotation of modules for alignment study
+const Bool_t DoExplode      = false;  // true, // false;  // add random displacement of modules for alignment study
+
+// positioning parameters
+const Double_t maxdx = 0.2;  // max +- 0.1 cm shift in x
+const Double_t maxdy = 0.2;  // max +- 0.1 cm shift in y
+const Double_t maxdz = 1.0;  // max +- 1.0 cm shift in z
+
+const Double_t maxdrotx = 2.0;  // 20.0; // max rotation around x
+const Double_t maxdroty = 2.0;  // 20.0; // max rotation around y
+const Double_t maxdrotz = 2.0;  // 20.0; // max rotation around z
+
+const Double_t ExplodeFactor = 1.02;  // 1.02; // Factor by which modules are exploded in the x/y plane
+
+// initialise random numbers
+TRandom3 r3(0);
+
+// Parameters defining the layout of the complete detector build out of different detector layers.
+const Int_t MaxLayers = 10;  // max layers
+
+// select layers to display
+//
+//const Int_t    ShowLayer[MaxLayers] = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 };  //  1st layer only
+//const Int_t    ShowLayer[MaxLayers] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 };  //  2nd layer only
+//const Int_t    ShowLayer[MaxLayers] = { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 };  //  5th layer only
+//const Int_t    ShowLayer[MaxLayers] = { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 };  //  6th layer only
+//const Int_t    ShowLayer[MaxLayers] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 };  //  9th layer only
+//const Int_t    ShowLayer[MaxLayers] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };  // 10th layer only
+//
+//const Int_t    ShowLayer[MaxLayers] = { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 };  // Station 1, layer 1, 2
+//const Int_t    ShowLayer[MaxLayers] = { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 };  // Station 2, layer 5, 6
+//const Int_t    ShowLayer[MaxLayers] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 };  // Station 3, layer 9,10
+//const Int_t    ShowLayer[MaxLayers] = { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0 };  // Station 1 and 2
+//const Int_t    ShowLayer[MaxLayers] = { 1, 1, 0, 0, 1, 1, 1, 0, 1, 1 };  // Station 1, 2 and 3
+//
+//const Int_t    ShowLayer[MaxLayers] = { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 };  // SIS100-2l  // 1: plot, 0: hide
+//const Int_t    ShowLayer[MaxLayers] = { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };  // SIS100-3l  // 1: plot, 0: hide
+//
+//const Int_t    ShowLayer[MaxLayers] = { 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 };  // SIS100-4l  // 1: plot, 0: hide
+//const Int_t    ShowLayer[MaxLayers] = { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 };  // SIS300-mu  // 1: plot, 0: hide
+//const Int_t    ShowLayer[MaxLayers] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };  // SIS300-e   // 1: plot, 0: hide
+Int_t ShowLayer[MaxLayers] = {1, 1, 1, 1, 0, 0, 0, 0, 0, 0};  // SIS100-4l is default
+
+Int_t BusBarOrientation[MaxLayers] = {1, 1, 1, 1, 0, 0, 0, 0, 0, 0};  // 1 = vertical
+
+Int_t PlaneId[MaxLayers];  // automatically filled with layer ID
+
+const Int_t LayerType[MaxLayers] = {10, 11, 10, 11, 20, 21,
+                                    20, 21, 30, 31};  // ab: a [1-3] - layer type, b [0,1] - vertical/horizontal pads
+// ### Layer Type 11 is Layer Type 1 with detector modules rotated by 90°
+// ### Layer Type 21 is Layer Type 2 with detector modules rotated by 90°
+// ### Layer Type 31 is Layer Type 3 with detector modules rotated by 90°
+// In the subroutine creating the layers this is recognized automatically
+
+const Int_t LayerNrInStation[MaxLayers] = {1, 2, 3, 4, 1, 2, 3, 4, 1, 2};
+
+Double_t LayerPosition[MaxLayers] = {0.};  // start position = 0 - 2016-07-12 - DE
+
+// 5x z-positions from 260 till 550 cm
+//Double_t LayerPosition[MaxLayers] = { 260. }; // start position - 2013-10-28 - DE - v14_1h - SIS 100 hadron         ( 4 layers, z = 2600 )
+//Double_t LayerPosition[MaxLayers] = { 410. }; // start position - 2013-10-28 - DE - v14_1e - SIS 100 electron       ( 4 layers, z = 4100 )
+//Double_t LayerPosition[MaxLayers] = { 360. }; // start position - 2014-06-16 - DE - v14_1m - SIS 100 muon           ( 4 layers, z = 3600 ) was 460.
+//Double_t LayerPosition[MaxLayers] = { 410. }; // start position - 2013-10-28 - DE - v14_3e - SIS 300 electron       (10 layers, z = 4100 )
+//Double_t LayerPosition[MaxLayers] = { 550. }; // start position - 2013-10-28 - DE - v14_3m - SIS 300 muon     6_abs (10 layers, z = 5500 )
+//
+// obsolete variants
+//Double_t LayerPosition[MaxLayers] = { 460. }; // start position - 2013-10-28 - DE - v13x3 - SIS 100 muon         ( 4 layers, z = 4600 )
+//Double_t LayerPosition[MaxLayers] = { 410. }; // start position - 2013-06-25 - DE - v13i trd100_rich             ( 2 layers, z = 4100 )
+//Double_t LayerPosition[MaxLayers] = { 410. }; // start position - 2013-06-25 - DE - v13j trd100_rich             ( 3 layers, z = 4100 )
+//Double_t LayerPosition[MaxLayers] = { 430. }; // start position - 2013-06-25 - DE - ---  trd100_much_2_absorbers ( 4 layers, z = 4300 )
+//Double_t LayerPosition[MaxLayers] = { 460. }; // start position - 2013-06-25 - DE - v13n trd300_rich_stretched   (10 layers, z = 4600 )
+
+
+const Double_t LayerThickness = 71.0;  // 45.0;  // Thickness of one TRD layer in cm
+
+const Double_t LayerOffset[MaxLayers] = {0., 0., 0., 0., 5.,
+                                         0., 0., 0., 5., 0.};  // v13x[4,5] - z offset in addition to LayerThickness
+//const Double_t LayerOffset[MaxLayers] = {   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0. };  // SIS100 - z offset in addition to LayerThickness
+//const Double_t LayerOffset[MaxLayers] = {   0.,   0.,   0.,   0.,  95.,   0.,   0.,   0.,   5.,   0. };  // v13n       - z offset in addition to LayerThickness
+
+const Int_t LayerArraySize[3][4] = {{9, 4, 9, 11},  // for layer[1-3][i,o] below
+                                    {5, 5, 9, 11},
+                                    {5, 5, 9, 11}};
+
+
+// ### Layer Type 1
+// v14x - module types in the inner sector of layer type 1 - looking upstream
+const Int_t layer1i[9][4] = {
+  {0, 0, 0, 0},  // abc: a module type - b orientation (x90 deg) in odd - c even layers
+  {323, 323, 321, 321}, {323, 323, 321, 321}, {123, 123, 121, 121}, {103, 0, 0, 101},
+  {103, 103, 101, 101}, {303, 303, 301, 301}, {303, 303, 301, 301}, {0, 0, 0, 0}};
+// number of modules: 24
+
+// v14x - module types in the outer sector of layer type 1 - looking upstream
+const Int_t layer1o[9][11] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},         {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+                              {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 523, 0, 0, 0, 521, 0, 0, 0},
+                              {0, 0, 503, 503, 0, 0, 0, 501, 501, 0, 0}, {0, 0, 0, 503, 0, 0, 0, 501, 0, 0, 0},
+                              {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+                              {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+// number of modules: 26
+// Layer1 =  24 + 26;   // v14a
+
+
+// ### Layer Type 2
+// v14x - module types in the inner sector of layer type 2 - looking upstream
+const Int_t layer2i[5][5] = {
+  {323, 323, 321, 321, 321},  // abc: a module type - b orientation (x90 deg) in odd - c even layers
+  {223, 123, 121, 121, 221},
+  {203, 103, 0, 101, 201},
+  {203, 103, 101, 101, 201},
+  {303, 303, 301, 301, 301}};
+// number of modules: 24
+
+// v14x - module types in the outer sector of layer type 2 - looking upstream
+const Int_t layer2o[9][11] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+                              {0, 823, 823, 823, 823, 821, 821, 821, 821, 821, 0},
+                              {0, 823, 823, 823, 723, 721, 721, 821, 821, 821, 0},
+                              {0, 823, 723, 623, 0, 0, 0, 621, 721, 821, 0},
+                              {0, 803, 703, 603, 0, 0, 0, 601, 701, 801, 0},
+                              {0, 803, 703, 603, 0, 0, 0, 601, 701, 801, 0},
+                              {0, 803, 803, 803, 703, 701, 701, 801, 801, 801, 0},
+                              {0, 803, 803, 803, 803, 801, 801, 801, 801, 801, 0},
+                              {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+// number of modules: 54
+// Layer2 =  24 + 54;   // v14a
+
+
+// ### Layer Type 3
+// v14x - module types in the inner sector of layer type 3 - looking upstream
+const Int_t layer3i[5][5] = {
+  {323, 323, 321, 321, 321},  // abc: a module type - b orientation (x90 deg) in odd - c even layers
+  {223, 123, 121, 121, 221},
+  {203, 103, 0, 101, 201},
+  {203, 103, 101, 101, 201},
+  {303, 303, 301, 301, 301}};
+// number of modules: 24
+
+// v14x - module types in the outer sector of layer type 3 - looking upstream
+const Int_t layer3o[9][11] = {
+  {823, 823, 823, 823, 823, 821, 821, 821, 821, 821, 821}, {823, 823, 823, 823, 823, 821, 821, 821, 821, 821, 821},
+  {823, 823, 823, 723, 623, 621, 621, 721, 821, 821, 821}, {823, 823, 723, 623, 0, 0, 0, 621, 721, 821, 821},
+  {803, 803, 703, 603, 0, 0, 0, 601, 701, 801, 801},       {803, 803, 703, 603, 0, 0, 0, 601, 701, 801, 801},
+  {803, 803, 803, 703, 603, 601, 601, 701, 801, 801, 801}, {803, 803, 803, 803, 803, 801, 801, 801, 801, 801, 801},
+  {803, 803, 803, 803, 803, 801, 801, 801, 801, 801, 801}};
+// number of modules: 90
+// Layer2 =  24 + 90;   // v14a
+
+
+// Parameters defining the layout of the different detector modules
+const Int_t NofModuleTypes             = 8;
+const Int_t ModuleType[NofModuleTypes] = {0, 0, 0, 0, 1, 1, 1, 1};  // 0 = small module, 1 = large module
+
+// FEB inclination angle
+const Double_t feb_rotation_angle[NofModuleTypes] = {
+  60, 90, 90, 80, 60, 60, 90, 90};  // rotation around x-axis, 0 = vertical, 90 = horizontal
+//const Double_t feb_rotation_angle[NofModuleTypes] = { 60,  90,  90,  80,  80,  90,  90,  90 }; // rotation around x-axis, 0 = vertical, 90 = horizontal
+//const Double_t feb_rotation_angle[NofModuleTypes] = { 45,  45,  45,  45,  45,  45,  45,  45 }; // rotation around x-axis, 0 = vertical, 90 = horizontal
+
+// GBTx ROB definitions
+//// v17d
+//const Int_t RobsPerModule[NofModuleTypes] = {  4,  2,  2,  1,  2,  3,  2,  1 }; // number of GBTx ROBs on module
+//const Int_t GbtxPerRob[NofModuleTypes]    = {103,103,103,103,107,103,103,103 }; // number of GBTx ASICs on ROB
+//
+//const Int_t GbtxPerModule[NofModuleTypes] = {   12,  6,  6,  0,  0,  9,  6,  3 }; // for .geo.info - TODO: merge with above GbtxPerRob
+//const Int_t RobTypeOnModule[NofModuleTypes]={ 3333, 33, 33,  0,  0,333, 33,  3 }; // for .geo.info - TODO: merge with above GbtxPerRob
+//
+// v17l - 96 cm
+const Int_t RobsPerModule[NofModuleTypes] = {4, 2, 1, 1, 6, 6, 2, 2};                  // number of GBTx ROBs on module
+const Int_t GbtxPerRob[NofModuleTypes]    = {103, 103, 103, 103, 103, 103, 103, 103};  // number of GBTx ASICs on ROB
+
+const Int_t GbtxPerModule[NofModuleTypes]   = {12, 6,  3, 0,
+                                             18, 18, 6, 6};  // for .geo.info - TODO: merge with above GbtxPerRob
+const Int_t RobTypeOnModule[NofModuleTypes] = {3333,   33, 3, 0, 333333,
+                                               333333, 33, 33};  // for .geo.info - TODO: merge with above GbtxPerRob
+
+//// v17c
+//const Int_t RobsPerModule[NofModuleTypes] = {  4,  2,  1,  1,  2,  3,  2,  1 }; // number of GBTx ROBs on module
+//const Int_t GbtxPerRob[NofModuleTypes]    = {103,103,103,103,107,103,103,103 }; // number of GBTx ASICs on ROB
+//
+//const Int_t GbtxPerModule[NofModuleTypes] = {   12,  6,  3,  0,  0,  9,  6,  3 }; // for .geo.info - TODO: merge with above GbtxPerRob
+//const Int_t RobTypeOnModule[NofModuleTypes]={ 3333, 33,  3,  0,  0,333, 33,  3 }; // for .geo.info - TODO: merge with above GbtxPerRob
+
+//// v17b
+//const Int_t RobsPerModule[NofModuleTypes] = {  5,  3,  2,  1,  2,  3,  2,  1 }; // number of GBTx ROBs on module
+//const Int_t GbtxPerRob[NofModuleTypes]    = {103,103,103,103,107,103,103,103 }; // number of GBTx ASICs on ROB
+//
+//const Int_t GbtxPerModule[NofModuleTypes] = {   15,  9,  6,  0,  0,  9,  6,  3 }; // for .geo.info - TODO: merge with above GbtxPerRob
+//const Int_t RobTypeOnModule[NofModuleTypes]={33333,333, 33,  0,  0,333, 33,  3 }; // for .geo.info - TODO: merge with above GbtxPerRob
+
+//v17a // GBTx ROB definitions
+//v17a const Int_t RobsPerModule[NofModuleTypes] = {  3,  2,  1,  1,  2,  2,  1,  1 }; // number of GBTx ROBs on module
+//v17a const Int_t GbtxPerRob[NofModuleTypes]    = {105,105,105,103,107,105,105,103 }; // number of GBTx ASICs on ROB
+//v17a
+//v17a const Int_t GbtxPerModule[NofModuleTypes] = { 15, 10,  5,  0,  0, 10,  5,  3 }; // for .geo.info - TODO: merge with above GbtxPerRob
+//v17a const Int_t RobTypeOnModule[NofModuleTypes]={555, 55,  5,  0,  0, 55,  5,  3 }; // for .geo.info - TODO: merge with above GbtxPerRob
+
+//const Int_t RobsPerModule[NofModuleTypes] = {  2,  2,  1,  1,  2,  2,  1,  1 }; // number of GBTx ROBs on module
+//const Int_t GbtxPerRob[NofModuleTypes]    = {107,105,105,103,107,105,105,103 }; // number of GBTx ASICs on ROB
+//const Int_t GbtxPerModule[NofModuleTypes] = { 14,  8,  5,  0,  0, 10,  5,  3 }; // for .geo.info - TODO: merge with above GbtxPerRob
+//const Int_t RobTypeOnModule[NofModuleTypes] = { 77, 53,  5,  0,  0, 55,  5,  3 }; // for .geo.info - TODO: merge with above GbtxPerRob
+
+// super density for type 1 modules - 2017 - 540 mm
+//// v17d
+//const Int_t FebsPerModule[NofModuleTypes] = {  8,  4,  4,  4, 12,  9,  6,  3 }; // number of FEBs on backside
+//const Int_t AsicsPerFeb[NofModuleTypes]   = {210,210,210,105,108,107,107,107 }; // %100 gives number of ASICs on FEB, /100 gives grouping
+
+// v17l - 96 cm
+//const Int_t FebsPerModule[NofModuleTypes] = {  8,  4,  2,  4, 12,  8,  6,  4 }; // number of FEBs on backside
+//const Int_t FebsPerModule[NofModuleTypes] = {  8,  4,  2,  4, 12,  8,  6,  2 }; // number of FEBs on backside
+const Int_t FebsPerModule[NofModuleTypes] = {8, 4, 2, 4, 12, 12, 4, 4};  // number of FEBs on backside
+const Int_t AsicsPerFeb[NofModuleTypes]   = {210, 210, 210, 105, 109,
+                                           109, 109, 109};  // %100 gives number of ASICs on FEB, /100 gives grouping
+
+//// v17c
+//const Int_t FebsPerModule[NofModuleTypes] = {  8,  4,  2,  4, 12,  9,  6,  3 }; // number of FEBs on backside
+//const Int_t AsicsPerFeb[NofModuleTypes]   = {210,210,210,105,108,107,107,107 }; // %100 gives number of ASICs on FEB, /100 gives grouping
+
+//// v17b
+//const Int_t FebsPerModule[NofModuleTypes] = {  10,  6,  4,  4, 12,  9,  6,  3 }; // number of FEBs on backside
+//const Int_t AsicsPerFeb[NofModuleTypes]   = {210,210,210,105,108,107,107,107 }; // %100 gives number of ASICs on FEB, /100 gives grouping
+// v17a // super density for type 1 modules - 2017 - 540 mm
+// v17a //const Int_t FebsPerModule[NofModuleTypes] = {  9,  5,  6,  4, 12,  8,  4,  3 }; // number of FEBs on backside
+// v17a const Int_t FebsPerModule[NofModuleTypes] = {  9,  6,  3,  4, 12,  8,  4,  3 }; // number of FEBs on backside
+// v17a const Int_t AsicsPerFeb[NofModuleTypes]   = {210,210,210,105,108,108,108,108 }; // %100 gives number of ASICs on FEB, /100 gives grouping
+//// ultimate density - 540 mm
+//const Int_t FebsPerModule[NofModuleTypes] = {  6,  5,  6,  4, 12,  8,  4,  3 }; // number of FEBs on backside - reduced FEBs (64 ch ASICs)
+//const Int_t AsicsPerFeb[NofModuleTypes]   = {315,210,105,105,108,108,108,108 }; //  %100 gives number of ASICs on FEB, /100 gives grouping
+////const Int_t FebsPerModule[NofModuleTypes] = {  6,  5,  3,  2,  6,  3,  4,  3 }; // min number of FEBs // number of FEBs on backside - reduced FEBs (64 ch ASICs)
+////const Int_t AsicsPerFeb[NofModuleTypes]   = {315,210,210,210,216,216,108,108 }; //  %100 gives number of ASICs on FEB, /100 gives grouping
+////const Int_t AsicsPerFeb[NofModuleTypes]   = {216,210,210,210,216,216,108,108 }; //  %100 gives number of ASICs on FEB, /100 gives grouping
+//
+////// super density - 540 mm
+//const Int_t FebsPerModule[NofModuleTypes] = {  9,  5,  6,  4, 12,  6,  4,  3 }; // light // number of FEBs on backside - reduced FEBs (64 ch ASICs)
+//const Int_t AsicsPerFeb[NofModuleTypes]   = {210,210,105,105,108,108,108,108 }; // %100 gives number of ASICs on FEB, /100 gives grouping
+//
+//// normal density - 540 mm
+//const Int_t FebsPerModule[NofModuleTypes] = { 18, 10,  6,  4, 12,  6,  4,  3 }; // number of FEBs on backside (linked to pad layout) - mod4 = mod3, therefore same
+//const Int_t AsicsPerFeb[NofModuleTypes]   = {105,105,105,105,108,108,108,108 }; // %100 gives number of ASICs on FEB, /100 gives grouping
+
+// ultimate density - 570 mm
+//const Int_t FebsPerModule[NofModuleTypes] = {  6,  5,  3,  2,  5,  3,  2,  1 }; // min number of FEBs // number of FEBs on backside - reduced FEBs (64 ch ASICs)
+//const Int_t AsicsPerFeb[NofModuleTypes]   = {216,210,210,210,216,216,216,216 }; //  %100 gives number of ASICs on FEB, /100 gives grouping
+//
+//const Int_t FebsPerModule[NofModuleTypes] = {  6,  5,  3,  3, 10,  5,  3,  3 }; // min (6) module types // number of FEBs on backside - reduced FEBs (64 ch ASICs)
+//const Int_t AsicsPerFeb[NofModuleTypes]   = {216,210,210,210,108,108,108,108 }; //  %100 gives number of ASICs on FEB, /100 gives grouping
+//// super density - 570 mm
+//const Int_t FebsPerModule[NofModuleTypes] = { 10,  5,  5,  5, 12,  6,  4,  3 }; // light // number of FEBs on backside - reduced FEBs (64 ch ASICs)
+//const Int_t AsicsPerFeb[NofModuleTypes]   = {210,210,105,105,108,108,108,108 }; // %100 gives number of ASICs on FEB, /100 gives grouping
+//
+//// normal density - 570 mm
+//const Int_t FebsPerModule[NofModuleTypes] = { 19, 10,  5,  5, 12,  6,  4,  3 }; // number of FEBs on backside (linked to pad layout) - mod4 = mod3, therefore same
+//const Int_t AsicsPerFeb[NofModuleTypes]   = {105,105,105,105,108,108,108,108 }; // %100 gives number of ASICs on FEB, /100 gives grouping
+
+
+/* TODO: activate connector grouping info below
+// ultimate - grouping of pads to connectors
+const Int_t RowsPerConnector[NofModuleTypes]  = {  6,  4,  2,  2,  2,  2,  2,  2 };
+const Int_t ColsPerConnector[NofModuleTypes]  = { 16, 16, 16, 16, 16, 16, 16, 16 };
+// super    - grouping of pads to connectors
+const Int_t RowsPerConnector[NofModuleTypes]  = {  4,  4,  2,  2,  2,  2,  2,  2 };
+const Int_t ColsPerConnector[NofModuleTypes]  = { 16, 16, 16, 16, 16, 16, 16, 16 };
+// normal   - grouping of pads to connectors
+const Int_t RowsPerConnector[NofModuleTypes]  = {  2,  2,  2,  2,  2,  2,  2,  2 };
+const Int_t ColsPerConnector[NofModuleTypes]  = { 16, 16, 16, 16, 16, 16, 16, 16 };
+*/
+
+
+const Double_t feb_z_offset = 0.1;  // 1 mm - offset in z of FEBs to backpanel
+const Double_t asic_offset  = 0.1;  // 1 mm - offset of ASICs to FEBs to avoid overlaps
+
+// ASIC parameters
+Double_t asic_distance;
+
+//const Double_t FrameWidth[2]    = { 1.5, 2.0 };   // Width of detector frames in cm
+const Double_t FrameWidth[2] = {1.5, 1.5};  // Width of detector frames in cm
+// mini - production
+const Double_t DetectorSizeX[2] = {57., 99.};  // => 54 x 54 cm2 & 96 x 96 cm2 active area
+const Double_t DetectorSizeY[2] = {57., 99.};  // quadratic modules
+// 108 cm const Double_t DetectorSizeX[2] = { 57., 111.};   // => 54 x 54 cm2 & 108 x 108 cm2 active area
+// 108 cm const Double_t DetectorSizeY[2] = { 57., 111.};   // quadratic modules
+//// default
+//const Double_t DetectorSizeX[2] = { 60., 100.};   // => 57 x 57 cm2 & 96 x 96 cm2 active area
+//const Double_t DetectorSizeY[2] = { 60., 100.};   // quadratic modules
+
+// Parameters tor the lattice grid reinforcing the entrance window
+//const Double_t lattice_o_width[2] = { 1.5, 2.0 };   // Width of outer lattice frame in cm
+const Double_t lattice_o_width[2] = {1.5, 1.5};  // Width of outer lattice frame in cm
+const Double_t lattice_i_width[2] = {0.2, 0.2};  // { 0.4, 0.4 };   // Width of inner lattice frame in cm
+// Thickness (in z) of lattice frames in cm - see below
+
+// statistics
+Int_t ModuleStats[MaxLayers][NofModuleTypes] = {0};
+
+// z - geometry of TRD modules
+//const Double_t radiator_thickness     =  35.0;    // 35 cm thickness of radiator
+const Double_t radiator_thickness = 30.0;  // 30 cm thickness of radiator + shift pad plane to integer multiple of 1 mm
+const Double_t radiator_position  = -LayerThickness / 2. + radiator_thickness / 2.;
+
+//const Double_t lattice_thickness      =   1.0;  // 1.0;  // 10 mm thick lattice frames
+const Double_t lattice_thickness = 1.0 - 0.0025;  // 0.9975;  // 1.0;  // 10 mm thick lattice frames
+const Double_t lattice_position  = radiator_position + radiator_thickness / 2. + lattice_thickness / 2.;
+
+const Double_t kapton_thickness = 0.0025;  //  25 micron thickness of kapton
+const Double_t kapton_position  = lattice_position + lattice_thickness / 2. + kapton_thickness / 2.;
+
+const Double_t gas_thickness = 1.2;  //  12 mm thickness of gas
+const Double_t gas_position  = kapton_position + kapton_thickness / 2. + gas_thickness / 2.;
+
+// frame thickness
+const Double_t frame_thickness = gas_thickness;  // frame covers gas volume: from kapton foil to pad plane
+const Double_t frame_position =
+  -LayerThickness / 2. + radiator_thickness + lattice_thickness + kapton_thickness + frame_thickness / 2.;
+
+// pad plane
+const Double_t padcopper_thickness = 0.0025;  //  25 micron thickness of copper pads
+const Double_t padcopper_position  = gas_position + gas_thickness / 2. + padcopper_thickness / 2.;
+
+const Double_t padplane_thickness = 0.0360;  // 360 micron thickness of padplane
+const Double_t padplane_position  = padcopper_position + padcopper_thickness / 2. + padplane_thickness / 2.;
+
+// backpanel components
+const Double_t carbon_thickness = 0.0190 * 2;  // use 2 layers!!   // 190 micron thickness for 1 layer of carbon fibers
+const Double_t honeycomb_thickness = 2.3 - kapton_thickness - padcopper_thickness - padplane_thickness
+                                     - carbon_thickness;  //  ~ 2.3 mm thickness of honeycomb
+const Double_t honeycomb_position = padplane_position + padplane_thickness / 2. + honeycomb_thickness / 2.;
+const Double_t carbon_position    = honeycomb_position + honeycomb_thickness / 2. + carbon_thickness / 2.;
+
+// aluminium thickness
+const Double_t aluminium_thickness = 0.4;  // crossbar of 1 x 1 cm at every module edge
+const Double_t aluminium_width     = 1.0;  // crossbar of 1 x 1 cm at every module edge
+const Double_t aluminium_position  = carbon_position + carbon_thickness / 2. + aluminium_thickness / 2.;
+
+// power bus bars
+const Double_t powerbar_thickness = 1.0;  // 1 cm in z direction
+const Double_t powerbar_width     = 2.0;  // 2 cm in x/y direction
+const Double_t powerbar_position  = aluminium_position + aluminium_thickness / 2. + powerbar_thickness / 2.;
+
+// readout boards
+//const  Double_t feb_width           =  10.0;    // width of FEBs in cm
+const Double_t feb_width          = 8.5;   // width of FEBs in cm
+const Double_t feb_thickness      = 0.25;  // light //  2.5 mm thickness of FEBs
+const Double_t febvolume_position = aluminium_position + aluminium_thickness / 2. + feb_width / 2.;
+
+// ASIC parameters
+const Double_t asic_thickness = 0.25;  // 2.5 mm asic_thickness
+const Double_t asic_width     = 3.0;   // 2.0;  1.0;   // 1 cm
+
+
+// Names of the different used materials which are used to build the modules
+// The materials are defined in the global media.geo file
+const TString KeepingVolumeMedium   = "air";
+const TString RadiatorVolumeMedium  = "TRDpefoam20";
+const TString LatticeVolumeMedium   = "TRDG10";
+const TString KaptonVolumeMedium    = "TRDkapton";
+const TString GasVolumeMedium       = "TRDgas";
+const TString PadCopperVolumeMedium = "TRDcopper";
+const TString PadPcbVolumeMedium    = "TRDG10";  // todo - put correct FEB material here
+const TString HoneycombVolumeMedium = "TRDaramide";
+const TString CarbonVolumeMedium    = "TRDcarbon";
+const TString FebVolumeMedium       = "TRDG10";  // todo - put correct FEB material here
+const TString AsicVolumeMedium      = "air";     // todo - put correct ASIC material here
+const TString TextVolumeMedium      = "air";     // leave as air
+const TString FrameVolumeMedium     = "TRDG10";
+const TString PowerBusVolumeMedium  = "TRDcopper";  // power bus bars
+const TString AluLegdeVolumeMedium  = "aluminium";  // aluminium frame around backpanel
+const TString AluminiumVolumeMedium = "aluminium";
+//const TString MylarVolumeMedium       = "mylar";
+//const TString RadiatorVolumeMedium    = "polypropylene";
+//const TString ElectronicsVolumeMedium = "goldcoatedcopper";
+
+
+// some global variables
+TGeoManager* gGeoMan = NULL;           // Pointer to TGeoManager instance
+TGeoVolume* gModules[NofModuleTypes];  // Global storage for module types
+
+// Forward declarations
+void create_materials_from_media_file();
+TGeoVolume* create_trd_module_type(Int_t moduleType);
+void create_detector_layers(Int_t layer);
+void create_power_bars_vertical();
+void create_power_bars_horizontal();
+void create_xtru_supports();
+void create_box_supports();
+void add_trd_labels(TGeoVolume*, TGeoVolume*, TGeoVolume*);
+void create_mag_field_vector();
+void dump_info_file();
+void dump_digi_file();
+
+
+//void Create_TRD_Geometry_v23a(const Int_t setupid = 1) {
+void Create_TRD_Geometry_v23a()
+{
+  // Load FairRunSim to ensure the correct unit system
+  FairRunSim* sim = new FairRunSim();
+
+  // declare TRD layer layout
+  if (setupid > 2)
+    for (Int_t i = 0; i < MaxLayers; i++)
+      ShowLayer[i] = 1;  // show all layers
+
+  // Load needed material definition from media.geo file
+  create_materials_from_media_file();
+
+  // Position the layers in z
+  for (Int_t iLayer = 1; iLayer < MaxLayers; iLayer++)
+    LayerPosition[iLayer] =
+      LayerPosition[iLayer - 1] + LayerThickness + LayerOffset[iLayer];  // add offset for extra gaps
+
+  // Get the GeoManager for later usage
+  gGeoMan = (TGeoManager*) gROOT->FindObject("FAIRGeom");
+  gGeoMan->SetVisLevel(10);
+
+  // Create the top volume
+  TGeoBBox* topbox = new TGeoBBox("", 1000., 1000., 2000.);
+  TGeoVolume* top  = new TGeoVolume("top", topbox, gGeoMan->GetMedium("air"));
+  gGeoMan->SetTopVolume(top);
+
+  TGeoVolume* trd = new TGeoVolumeAssembly(geoVersion);
+  top->AddNode(trd, 1);
+
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    Int_t moduleType  = iModule + 1;
+    gModules[iModule] = create_trd_module_type(moduleType);
+  }
+
+  Int_t nLayer = 0;  // active layer counter
+  for (Int_t iLayer = 0; iLayer < MaxLayers; iLayer++) {
+    //    if ((iLayer != 0) && (iLayer != 3))  continue;  // first layer only - comment later on
+    //    if (iLayer != 0) continue;  // first layer only - comment later on
+    if (ShowLayer[iLayer]) {
+      PlaneId[iLayer] = ++nLayer;
+      create_detector_layers(iLayer);
+      //      printf("calling layer %2d\n",iLayer);
+    }
+  }
+
+  // TODO: remove or comment out
+  // test PlaneId
+  printf("generated TRD layers: ");
+  for (Int_t iLayer = 0; iLayer < MaxLayers; iLayer++)
+    if (ShowLayer[iLayer]) printf(" %2d", PlaneId[iLayer]);
+  printf("\n");
+
+  if (IncludeSupports) { create_box_supports(); }
+
+  if (IncludePowerbars) {
+    create_power_bars_vertical();
+    create_power_bars_horizontal();
+  }
+
+  if (IncludeFieldVector) create_mag_field_vector();
+
+  gGeoMan->CloseGeometry();
+  //  gGeoMan->CheckOverlaps(0.001);
+  //  gGeoMan->PrintOverlaps();
+  gGeoMan->Test();
+
+  trd->Export(FileNameSim);  // an alternative way of writing the trd volume
+
+  TFile* outfile = new TFile(FileNameSim, "UPDATE");
+  //  TGeoTranslation* trd_placement = new TGeoTranslation("trd_trans", 0., 0., 0.);
+  TGeoTranslation* trd_placement = new TGeoTranslation("trd_trans", 0., 0., zfront[setupid]);
+  trd_placement->Write();
+  outfile->Close();
+
+  outfile = new TFile(FileNameGeo, "RECREATE");
+  gGeoMan->Write();  // use this is you want GeoManager format in the output
+  outfile->Close();
+
+  dump_info_file();
+  dump_digi_file();
+
+  top->Draw("ogl");
+
+  //top->Raytrace();
+
+  //  cout << "Press Return to exit" << endl;
+  //  cin.get();
+  //  exit();
+}
+
+
+//==============================================================
+void dump_digi_file()
+{
+  TDatime datetime;  // used to get timestamp
+
+  const Double_t ActiveAreaX[2] = {DetectorSizeX[0] - 2 * FrameWidth[0], DetectorSizeX[1] - 2 * FrameWidth[1]};
+  const Int_t NofSectors        = 3;
+  // v17b
+  //  const Int_t NofPadsInRow[2]  = { 80, 112 };  //  7 // number of pads in rows
+  //  const Int_t NofPadsInRow[2]  = { 80, 128 };  //  8 // number of pads in rows
+  const Int_t NofPadsInRow[2] = {80, 144};  //  9 // number of pads in rows
+  //  const Int_t NofPadsInRow[2]  = { 80, 160 };  // 10 // number of pads in rows
+  Int_t nrow = 0;  // number of rows in module
+
+  const Double_t PadHeightInSector[NofModuleTypes][NofSectors] =  // pad height
+    {//v17b {  1.25,  1.50,  1.25 },   // module type 1 -  1.01 cm2
+     //v17b {  2.25,  2.25,  2.25 },   // module type 2 -  1.52 cm2
+     //v17b {  3.25,  3.50,  3.25 },   // module type 3 -  2.36 cm2
+
+     {1.50, 1.75, 1.50},  // module type 1 -  1.18 cm2
+     {3.25, 3.50, 3.25},  // module type 2 -  2.36 cm2
+     {6.75, 6.75, 6.75},  // module type 3 -  4.56 cm2
+     {6.75, 6.75, 6.75},  // module type 4 -
+
+     // 108 cm          {  2.25,  2.25,  2.25 },   // module type 5 -
+     // 108 cm          {  4.50,  4.50,  4.50 },   // module type 6 -  4.52 cm2
+     // 108 cm          {  9.00,  9.00,  9.00 },   // module type 7 -  6.37 cm2
+     // 108 cm          { 18.00, 18.00, 18.00 } }; // module type 8 - 12.73 cm2
+
+     {4.00, 4.00, 4.00},      // module type 5 -  2.67 cm2
+     {6.00, 6.00, 6.00},      // module type 6 -  4.00 cm2
+     {12.00, 12.00, 12.00},   // module type 7 -  8.00 cm2
+     {24.00, 24.00, 24.00}};  // module type 8 - 16.00 cm2
+
+  //          {  3.75,  4.00,  3.75 },   // module type 5 -
+  //          {  5.00,  5.50,  5.00 },   // module type 6 -  4.52 cm2
+  //          {  7.50,  7.75,  7.50 },   // module type 7 -  6.37 cm2
+  //          { 15.25, 15.50, 15.25 } }; // module type 8 - 12.73 cm2
+
+  const Int_t NofRowsInSector[NofModuleTypes][NofSectors] =
+    // number of rows per sector
+    {//v17b {  12,  16,  12 },         // module type 1
+     //v17b {   8,   8,   8 },         // module type 2
+     //v17b {   4,   8,   4 },         // module type 3
+
+     {4, 24, 4},  // module type 1
+     {4, 8, 4},   // module type 2
+     {2, 4, 2},   // module type 3
+     {2, 4, 2},   // module type 4
+
+     {8, 8, 8},   // module type 5
+     {6, 4, 6},   // module type 6
+     {2, 4, 2},   // module type 7
+     {1, 2, 1}};  // module type 8
+
+  //          {   8,   8,   8 },         // module type 5
+  //          {   4,   8,   4 },         // module type 6
+  //          {   2,   8,   2 },         // module type 7
+  //          {   2,   2,   2 } };       // module type 8
+
+  // v17a   const Int_t NofPadsInRow[2]  = { 80, 128 };  // number of pads in rows
+  // v17a   Int_t nrow = 0;   // number of rows in module
+  // v17a
+  // v17a   const Double_t PadHeightInSector[NofModuleTypes][NofSectors] =  // pad height
+  // v17a         { {  1.50,  1.50,  1.50 },   // module type 1 -  1.01 cm2
+  // v17a           {  2.25,  2.25,  2.25 },   // module type 2 -  1.52 cm2
+  // v17a //          {  2.75,  2.50,  2.75 },   // module type 2 -  1.86 cm2
+  // v17a           {  4.50,  4.50,  4.50 },   // module type 3 -  3.04 cm2
+  // v17a           {  6.75,  6.75,  6.75 },   // module type 4 -  4.56 cm2
+  // v17a
+  // v17a           {  3.75,  4.00,  3.75 },   // module type 5 -  2.84 cm2
+  // v17a           {  5.75,  5.75,  5.75 },   // module type 6 -  4.13 cm2
+  // v17a           { 11.50, 11.50, 11.50 },   // module type 7 -  8.26 cm2
+  // v17a           { 15.25, 15.50, 15.25 } }; // module type 8 - 11.14 cm2
+  // v17a //          {  7.50,  7.75,  7.50 },   // module type 6 -  5.51 cm2
+  // v17a //          {  5.50,  5.75,  5.50 },   // module type 6 -  4.09 cm2
+  // v17a //          { 11.25, 11.50, 11.25 },   // module type 7 -  8.18 cm2
+  // v17a
+  // v17a   const Int_t NofRowsInSector[NofModuleTypes][NofSectors] =   // number of rows per sector
+  // v17a         { {  12,  12,  12 },         // module type 1
+  // v17a           {   8,   8,   8 },         // module type 2
+  // v17a //          {   8,   4,   8 },         // module type 2
+  // v17a           {   4,   4,   4 },         // module type 3
+  // v17a           {   2,   4,   2 },         // module type 4
+  // v17a
+  // v17a           {   8,   8,   8 },         // module type 5
+  // v17a           {   4,   8,   4 },         // module type 6
+  // v17a           {   2,   4,   2 },         // module type 7
+  // v17a           {   2,   2,   2 } };       // module type 8
+  // v17a //          {  10,   4,  10 },         // module type 5
+  // v17a //          {   4,   4,   4 },         // module type 6
+  // v17a //          {   2,  12,   2 },         // module type 6
+  // v17a //          {   2,   4,   2 },         // module type 7
+  // v17a //          {   2,   2,   2 } };       // module type 8
+  // v17a
+
+  Double_t HeightOfSector[NofModuleTypes][NofSectors];
+  Double_t PadWidth[NofModuleTypes];
+
+  // calculate pad width
+  for (Int_t im = 0; im < NofModuleTypes; im++)
+    PadWidth[im] = ActiveAreaX[ModuleType[im]] / NofPadsInRow[ModuleType[im]];
+
+  // calculate height of sectors
+  for (Int_t im = 0; im < NofModuleTypes; im++)
+    for (Int_t is = 0; is < NofSectors; is++)
+      HeightOfSector[im][is] = NofRowsInSector[im][is] * PadHeightInSector[im][is];
+
+  // check, if the entire module size is covered by pads
+  for (Int_t im = 0; im < NofModuleTypes; im++)
+    if (ActiveAreaX[ModuleType[im]] - (HeightOfSector[im][0] + HeightOfSector[im][1] + HeightOfSector[im][2]) != 0) {
+      printf("WARNING: sector size does not add up to module size for module "
+             "type %d\n",
+             im + 1);
+      printf("%.2f = %.2f + %.2f + %.2f\n", ActiveAreaX[ModuleType[im]], HeightOfSector[im][0], HeightOfSector[im][1],
+             HeightOfSector[im][2]);
+      exit(1);
+    }
+
+  //==============================================================
+
+  printf("writing trd pad information file: %s\n", FileNamePads.Data());
+
+  FILE* ifile;
+  ifile = fopen(FileNamePads.Data(), "w");
+
+  if (ifile == NULL) {
+    printf("error opening %s\n", FileNamePads.Data());
+    exit(1);
+  }
+
+  fprintf(ifile, "//\n");
+  fprintf(ifile, "//   TRD pad layout for geometry %s\n", tagVersion.Data());
+  fprintf(ifile, "//\n");
+  fprintf(ifile, "// automatically generated by Create_TRD_Geometry_%s%s.C\n", tagVersion.Data(), subVersion.Data());
+  fprintf(ifile, "// created %d\n", datetime.GetDate());
+  fprintf(ifile, "//\n");
+
+  fprintf(ifile, "\n");
+  fprintf(ifile, "#ifndef CBMTRDPADS_H\n");
+  fprintf(ifile, "#define CBMTRDPADS_H\n");
+  fprintf(ifile, "\n");
+  fprintf(ifile, "Int_t fst1_sect_count = 3;\n");
+  fprintf(ifile, "// array of pad geometries in the TRD (trd1mod[1-8])\n");
+  fprintf(ifile, "// 8 modules  // 3 sectors  // 4 values \n");
+  fprintf(ifile, "Float_t fst1_pad_type[8][3][4] =        \n");
+  //fprintf(ifile,"Double_t fst1_pad_type[8][3][4] =       \n");
+  fprintf(ifile, "			 		 \n");
+
+  for (Int_t im = 0; im < NofModuleTypes; im++) {
+    if (im + 1 == 5) fprintf(ifile, "//---\n\n");
+    fprintf(ifile, "// module type %d\n", im + 1);
+
+    // number of pads
+    nrow = 0;  // reset number of pad rows to 0
+    for (Int_t is = 0; is < NofSectors; is++)
+      nrow += HeightOfSector[im][is] / PadHeightInSector[im][is];  // add number of rows in this sector
+    fprintf(ifile, "// number of pads: %3d x %2d = %4d\n", NofPadsInRow[ModuleType[im]], nrow,
+            NofPadsInRow[ModuleType[im]] * nrow);
+
+    // pad size
+    fprintf(ifile, "// pad size sector 1: %5.2f cm x %5.2f cm = %5.2f cm2\n", PadWidth[im], PadHeightInSector[im][1],
+            PadWidth[im] * PadHeightInSector[im][1]);
+    fprintf(ifile, "// pad size sector 0: %5.2f cm x %5.2f cm = %5.2f cm2\n", PadWidth[im], PadHeightInSector[im][0],
+            PadWidth[im] * PadHeightInSector[im][0]);
+
+    for (Int_t is = 0; is < NofSectors; is++) {
+      if ((im == 0) && (is == 0)) fprintf(ifile, "  { { ");
+      else if (is == 0)
+        fprintf(ifile, "    { ");
+      else
+        fprintf(ifile, "      ");
+
+      fprintf(ifile, "{ %.1f, %5.2f, %.1f/%3d, %5.2f }", ActiveAreaX[ModuleType[im]], HeightOfSector[im][is],
+              ActiveAreaX[ModuleType[im]], NofPadsInRow[ModuleType[im]], PadHeightInSector[im][is]);
+
+      if ((im == NofModuleTypes - 1) && (is == 2)) fprintf(ifile, " } };");
+      else if (is == 2)
+        fprintf(ifile, " },");
+      else
+        fprintf(ifile, ",");
+
+      fprintf(ifile, "\n");
+    }
+
+    fprintf(ifile, "\n");
+  }
+
+  fprintf(ifile, "#endif\n");
+
+  //  Int_t im = 0;
+  //  fprintf(ifile,"// module type %d	 		   \n", im+1);
+  //  fprintf(ifile,"  { { { %.1f, %5.2f, %.1f/%3d, %5.2f },    \n", ActiveAreaX[ModuleType[im]], HeightOfSector[im][0], ActiveAreaX[ModuleType[im]], NofPadsInRow[ModuleType[im]], PadHeightInSector[im][0]);
+  //  fprintf(ifile,"      { %.1f, %5.2f, %.1f/%3d, %5.2f },    \n", ActiveAreaX[ModuleType[im]], HeightOfSector[im][1], ActiveAreaX[ModuleType[im]], NofPadsInRow[ModuleType[im]], PadHeightInSector[im][1]);
+  //  fprintf(ifile,"      { %.1f, %5.2f, %.1f/%3d, %5.2f } },  \n", ActiveAreaX[ModuleType[im]], HeightOfSector[im][2], ActiveAreaX[ModuleType[im]], NofPadsInRow[ModuleType[im]], PadHeightInSector[im][2]);
+  //  fprintf(ifile,"\n");
+  //
+  //  for (Int_t im = 1; im < NofModuleTypes-1; im++)
+  //  {
+  //    fprintf(ifile,"// module type %d	 		     \n", im+1);
+  //    fprintf(ifile,"    { { %.1f, %5.2f, %.1f/%3d, %5.2f },    \n", ActiveAreaX[ModuleType[im]], HeightOfSector[im][0], ActiveAreaX[ModuleType[im]], NofPadsInRow[ModuleType[im]], PadHeightInSector[im][0]);
+  //    fprintf(ifile,"      { %.1f, %5.2f, %.1f/%3d, %5.2f },    \n", ActiveAreaX[ModuleType[im]], HeightOfSector[im][1], ActiveAreaX[ModuleType[im]], NofPadsInRow[ModuleType[im]], PadHeightInSector[im][1]);
+  //    fprintf(ifile,"      { %.1f, %5.2f, %.1f/%3d, %5.2f } },  \n", ActiveAreaX[ModuleType[im]], HeightOfSector[im][2], ActiveAreaX[ModuleType[im]], NofPadsInRow[ModuleType[im]], PadHeightInSector[im][2]);
+  //    fprintf(ifile,"\n");
+  //  }
+  //
+  //  Int_t im = 7;
+  //  fprintf(ifile,"// module type %d	 		   \n", im+1);
+  //  fprintf(ifile,"    { { %.1f, %5.2f, %.1f/%3d, %5.2f },    \n", ActiveAreaX[ModuleType[im]], HeightOfSector[im][0], ActiveAreaX[ModuleType[im]], NofPadsInRow[ModuleType[im]], PadHeightInSector[im][0]);
+  //  fprintf(ifile,"      { %.1f, %5.2f, %.1f/%3d, %5.2f },    \n", ActiveAreaX[ModuleType[im]], HeightOfSector[im][1], ActiveAreaX[ModuleType[im]], NofPadsInRow[ModuleType[im]], PadHeightInSector[im][1]);
+  //  fprintf(ifile,"      { %.1f, %5.2f, %.1f/%3d, %5.2f } } };\n", ActiveAreaX[ModuleType[im]], HeightOfSector[im][2], ActiveAreaX[ModuleType[im]], NofPadsInRow[ModuleType[im]], PadHeightInSector[im][2]);
+  //  fprintf(ifile,"\n");
+
+  fclose(ifile);
+}
+
+
+void dump_info_file()
+{
+  TDatime datetime;  // used to get timestamp
+
+  Double_t z_first_layer = 2000;  // z position of first layer (front)
+  Double_t z_last_layer  = 0;     // z position of last  layer (front)
+
+  Double_t xangle;   // horizontal angle
+  Double_t yangle;   // vertical   angle for inner modules
+  Double_t yangleo;  // vertical   angle for outer modules
+
+  Double_t total_surface = 0;  // total surface
+  Double_t total_actarea = 0;  // total active area
+
+  Int_t channels_per_module[NofModuleTypes + 1] = {0};  // number of channels per module
+  Int_t channels_per_feb[NofModuleTypes + 1]    = {0};  // number of channels per feb
+  Int_t asics_per_module[NofModuleTypes + 1]    = {0};  // number of asics per module
+
+  Int_t total_modules[NofModuleTypes + 1]  = {0};  // total number of modules
+  Int_t total_febs[NofModuleTypes + 1]     = {0};  // total number of febs
+  Int_t total_asics[NofModuleTypes + 1]    = {0};  // total number of asics
+  Int_t total_gbtx[NofModuleTypes + 1]     = {0};  // total number of gbtx
+  Int_t total_rob3[NofModuleTypes + 1]     = {0};  // total number of gbtx rob3
+  Int_t total_rob5[NofModuleTypes + 1]     = {0};  // total number of gbtx rob5
+  Int_t total_rob7[NofModuleTypes + 1]     = {0};  // total number of gbtx rob7
+  Int_t total_channels[NofModuleTypes + 1] = {0};  // total number of channels
+
+  Int_t total_channels_u = 0;  // total number of ultimate channels
+  Int_t total_channels_s = 0;  // total number of super    channels
+  Int_t total_channels_r = 0;  // total number of regular  channels
+
+  printf("writing summary information file: %s\n", FileNameInfo.Data());
+
+  FILE* ifile;
+  ifile = fopen(FileNameInfo.Data(), "w");
+
+  if (ifile == NULL) {
+    printf("error opening %s\n", FileNameInfo.Data());
+    exit(1);
+  }
+
+  fprintf(ifile, "#\n##   %s information file\n#\n\n", geoVersion.Data());
+
+  fprintf(ifile, "# created %d\n\n", datetime.GetDate());
+
+  // determine first and last TRD layer
+  for (Int_t iLayer = 0; iLayer < MaxLayers; iLayer++) {
+    if (ShowLayer[iLayer]) {
+      if (z_first_layer > LayerPosition[iLayer]) z_first_layer = LayerPosition[iLayer];
+      if (z_last_layer < LayerPosition[iLayer]) z_last_layer = LayerPosition[iLayer];
+    }
+  }
+
+  fprintf(ifile, "# position\n");
+  // Show position of TRD
+  fprintf(ifile, "%4f cm z-front position of TRD in hadron   setup\n", zfront[0]);
+  fprintf(ifile, "%4f cm z-front position of TRD in electron setup\n", zfront[1]);
+  fprintf(ifile, "%4f cm z-front position of TRD in muon     setup\n", zfront[2]);
+  fprintf(ifile, "\n");
+
+  //  fprintf(ifile, "# envelope\n");
+  fprintf(ifile, "# detector thickness\n");
+  // Show extension of TRD
+  //  fprintf(ifile, "%4f cm   start of TRD (z)\n", z_first_layer);
+  fprintf(ifile, "%4f cm   end   of TRD (z)\n", z_last_layer + LayerThickness);
+  fprintf(ifile, "\n");
+
+  // Layer thickness
+  fprintf(ifile, "# layer thickness\n");
+  fprintf(ifile, "%4f cm   per single layer (z)\n", LayerThickness);
+  fprintf(ifile, "\n");
+
+  // Show extra gaps
+  fprintf(ifile, "# extra gaps\n ");
+  for (Int_t iLayer = 0; iLayer < MaxLayers; iLayer++)
+    if (ShowLayer[iLayer]) fprintf(ifile, "%3f ", LayerOffset[iLayer]);
+  fprintf(ifile, "   extra gaps in z (cm)\n");
+  fprintf(ifile, "\n");
+
+  // Show layer flags
+  fprintf(ifile, "# generated TRD layers\n ");
+  for (Int_t iLayer = 0; iLayer < MaxLayers; iLayer++)
+    if (ShowLayer[iLayer]) fprintf(ifile, "%2d ", PlaneId[iLayer]);
+  fprintf(ifile, "   planeID\n");
+  fprintf(ifile, "\n");
+
+  // Dimensions in x
+  fprintf(ifile, "# dimensions in x\n");
+  for (Int_t iLayer = 0; iLayer < MaxLayers; iLayer++)
+    if (ShowLayer[iLayer]) {
+      if (PlaneId[iLayer] < 5)
+        fprintf(ifile, "%5f cm to %5f cm x-dimension of layer %2d\n",
+                -(2.0 * DetectorSizeX[0] + 2.0 * DetectorSizeX[1]), 2.0 * DetectorSizeX[0] + 2.0 * DetectorSizeX[1],
+                PlaneId[iLayer]);
+      else {
+        if (PlaneId[iLayer] < 9)
+          fprintf(ifile, "%5f cm to %5f cm x-dimension of layer %2d\n", -4.5 * DetectorSizeX[1], 4.5 * DetectorSizeX[1],
+                  PlaneId[iLayer]);
+        else
+          fprintf(ifile, "%5f cm to %5f cm x-dimension of layer %2d\n", -5.5 * DetectorSizeX[1], 5.5 * DetectorSizeX[1],
+                  PlaneId[iLayer]);
+      }
+    }
+  fprintf(ifile, "\n");
+
+  // Dimensions in y
+  fprintf(ifile, "# dimensions in y inner modules\n");
+  for (Int_t iLayer = 0; iLayer < MaxLayers; iLayer++)
+    if (ShowLayer[iLayer]) {
+      if (PlaneId[iLayer] < 5)
+        fprintf(ifile, "%5f cm to %5f cm y-dimension of layer %2d\n", -4.5 * DetectorSizeY[0], 4.5 * DetectorSizeY[0],
+                PlaneId[iLayer]);
+      else {
+        if (PlaneId[iLayer] < 9)
+          fprintf(ifile, "%5f cm to %5f cm y-dimension of layer %2d\n", -3.5 * DetectorSizeY[1], 3.5 * DetectorSizeY[1],
+                  PlaneId[iLayer]);
+        else
+          fprintf(ifile, "%5f cm to %5f cm y-dimension of layer %2d\n", -4.5 * DetectorSizeY[1], 4.5 * DetectorSizeY[1],
+                  PlaneId[iLayer]);
+      }
+    }
+  fprintf(ifile, "\n");
+
+  // Dimensions in y
+  fprintf(ifile, "# dimensions in y outer modules\n");
+  for (Int_t iLayer = 0; iLayer < MaxLayers; iLayer++)
+    if (ShowLayer[iLayer]) {
+      if (PlaneId[iLayer] < 5)
+        fprintf(ifile, "%5f cm to %5f cm y-dimension of layer %2d\n", -2.5 * DetectorSizeY[1], 2.5 * DetectorSizeY[1],
+                PlaneId[iLayer]);
+    }
+  fprintf(ifile, "\n");
+
+  // angles
+  fprintf(ifile, "# angles of acceptance for inner + outer modules\n");
+
+  for (Int_t iLayer = 0; iLayer < MaxLayers; iLayer++)
+    if (ShowLayer[iLayer]) {
+      if (iLayer < 4) {
+        //        fprintf(ifile,"y %10.4f cm   x %10.4f cm\n", 2.5 * DetectorSizeY[1], 3.5 * DetectorSizeX[1]);
+        yangle = atan(4.5 * DetectorSizeY[0]
+                      / (zfront[setupid] + LayerPosition[iLayer] + LayerThickness / 2. + padplane_position))
+                 * 180. / acos(-1.);
+        yangleo = atan(2.5 * DetectorSizeY[1]
+                       / (zfront[setupid] + LayerPosition[iLayer] + LayerThickness / 2. + padplane_position))
+                  * 180. / acos(-1.);
+        xangle = atan((2.0 * DetectorSizeX[0] + 2.0 * DetectorSizeX[1])
+                      / (zfront[setupid] + LayerPosition[iLayer] + LayerThickness / 2. + padplane_position))
+                 * 180. / acos(-1.);
+      }
+      if ((iLayer >= 4) && (iLayer < 8)) {
+        //        fprintf(ifile,"y %10.4f cm   x %10.4f cm\n", 3.5 * DetectorSizeY[1], 4.5 * DetectorSizeX[1]);
+        yangle = atan(3.5 * DetectorSizeY[1] / (LayerPosition[iLayer] + LayerThickness / 2. + padplane_position)) * 180.
+                 / acos(-1.);
+        xangle = atan(4.5 * DetectorSizeX[1] / (LayerPosition[iLayer] + LayerThickness / 2. + padplane_position)) * 180.
+                 / acos(-1.);
+      }
+      if ((iLayer >= 8) && (iLayer < 10)) {
+        //        fprintf(ifile,"y %10.4f cm   x %10.4f cm\n", 4.5 * DetectorSizeY[1], 5.5 * DetectorSizeX[1]);
+        yangle = atan(4.5 * DetectorSizeY[1] / (LayerPosition[iLayer] + LayerThickness / 2. + padplane_position)) * 180.
+                 / acos(-1.);
+        xangle = atan(5.5 * DetectorSizeX[1] / (LayerPosition[iLayer] + LayerThickness / 2. + padplane_position)) * 180.
+                 / acos(-1.);
+      }
+      fprintf(ifile,
+              "vi: %5.2f deg, vo: %5.2f deg, h: %5.2f deg - "
+              "vertical/horizontal - layer %2d\n",
+              yangle, yangleo, xangle, PlaneId[iLayer]);
+    }
+  fprintf(ifile, "\n");
+
+  // aperture
+  fprintf(ifile, "# inner aperture\n");
+
+  for (Int_t iLayer = 0; iLayer < MaxLayers; iLayer++)
+    if (ShowLayer[iLayer]) {
+      if (iLayer < 4) {
+        //        fprintf(ifile,"y %10.4f cm   x %10.4f cm\n", 2.5 * DetectorSizeY[1], 3.5 * DetectorSizeX[1]);
+        yangle = atan(0.5 * DetectorSizeY[0]
+                      / (zfront[setupid] + LayerPosition[iLayer] + LayerThickness / 2. + padplane_position))
+                 * 180. / acos(-1.);
+        xangle = atan(1.0 * DetectorSizeX[0]
+                      / (zfront[setupid] + LayerPosition[iLayer] + LayerThickness / 2. + padplane_position))
+                 * 180. / acos(-1.);
+      }
+      if ((iLayer >= 4) && (iLayer < 8)) {
+        //        fprintf(ifile,"y %10.4f cm   x %10.4f cm\n", 3.5 * DetectorSizeY[1], 4.5 * DetectorSizeX[1]);
+        yangle = atan(0.5 * DetectorSizeY[0]
+                      / (zfront[setupid] + LayerPosition[iLayer] + LayerThickness / 2. + padplane_position))
+                 * 180. / acos(-1.);
+        xangle = atan(0.5 * DetectorSizeX[0]
+                      / (zfront[setupid] + LayerPosition[iLayer] + LayerThickness / 2. + padplane_position))
+                 * 180. / acos(-1.);
+      }
+      if ((iLayer >= 8) && (iLayer < 10)) {
+        //        fprintf(ifile,"y %10.4f cm   x %10.4f cm\n", 4.5 * DetectorSizeY[1], 5.5 * DetectorSizeX[1]);
+        yangle = atan(0.5 * DetectorSizeY[0]
+                      / (zfront[setupid] + LayerPosition[iLayer] + LayerThickness / 2. + padplane_position))
+                 * 180. / acos(-1.);
+        xangle = atan(0.5 * DetectorSizeX[0]
+                      / (zfront[setupid] + LayerPosition[iLayer] + LayerThickness / 2. + padplane_position))
+                 * 180. / acos(-1.);
+      }
+      fprintf(ifile, "v: %5.2f deg, h: %5.2f deg - vertical/horizontal - layer %2d\n", yangle, xangle, PlaneId[iLayer]);
+    }
+  fprintf(ifile, "\n");
+
+  // Show layer positions
+  fprintf(ifile, "# z-positions of layer front\n");
+  for (Int_t iLayer = 0; iLayer < MaxLayers; iLayer++) {
+    if (ShowLayer[iLayer])
+      fprintf(ifile, "%7.2f cm   z-position of layer %2d\n", LayerPosition[iLayer], PlaneId[iLayer]);
+  }
+  fprintf(ifile, "\n");
+
+  // flags
+  fprintf(ifile, "# flags\n");
+
+  fprintf(ifile, "support structure is    : ");
+  if (!IncludeSupports) fprintf(ifile, "NOT ");
+  fprintf(ifile, "included\n");
+
+  fprintf(ifile, "radiator is             : ");
+  if (!IncludeRadiator) fprintf(ifile, "NOT ");
+  fprintf(ifile, "included\n");
+
+  fprintf(ifile, "lattice grid is         : ");
+  if (!IncludeLattice) fprintf(ifile, "NOT ");
+  fprintf(ifile, "included\n");
+
+  fprintf(ifile, "kapton window is        : ");
+  if (!IncludeKaptonFoil) fprintf(ifile, "NOT ");
+  fprintf(ifile, "included\n");
+
+  fprintf(ifile, "gas frame is            : ");
+  if (!IncludeGasFrame) fprintf(ifile, "NOT ");
+  fprintf(ifile, "included\n");
+
+  fprintf(ifile, "padplane is             : ");
+  if (!IncludePadplane) fprintf(ifile, "NOT ");
+  fprintf(ifile, "included\n");
+
+  fprintf(ifile, "backpanel is            : ");
+  if (!IncludeBackpanel) fprintf(ifile, "NOT ");
+  fprintf(ifile, "included\n");
+
+  fprintf(ifile, "Aluminium ledge is      : ");
+  if (!IncludeAluLedge) fprintf(ifile, "NOT ");
+  fprintf(ifile, "included\n");
+
+  fprintf(ifile, "Power bus bars are      : ");
+  if (!IncludePowerbars) fprintf(ifile, "NOT ");
+  fprintf(ifile, "included\n");
+
+  fprintf(ifile, "asics are               : ");
+  if (!IncludeAsics) fprintf(ifile, "NOT ");
+  fprintf(ifile, "included\n");
+
+  fprintf(ifile, "front-end boards are    : ");
+  if (!IncludeFebs) fprintf(ifile, "NOT ");
+  fprintf(ifile, "included\n");
+
+  fprintf(ifile, "GBTX readout boards are : ");
+  if (!IncludeRobs) fprintf(ifile, "NOT ");
+  fprintf(ifile, "included\n");
+
+  fprintf(ifile, "\n");
+
+
+  // module statistics
+  //  fprintf(ifile,"#\n##   modules\n#\n\n");
+  //  fprintf(ifile,"number of modules per type and layer:\n");
+  fprintf(ifile, "# modules\n");
+
+  for (Int_t iModule = 1; iModule <= NofModuleTypes; iModule++)
+    fprintf(ifile, "     mod%1d", iModule);
+  fprintf(ifile, "    total");
+
+  fprintf(ifile, "\n------------------------------------------------------------------"
+                 "---------------\n");
+  for (Int_t iLayer = 0; iLayer < MaxLayers; iLayer++)
+    if (ShowLayer[iLayer]) {
+      for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+        fprintf(ifile, " %8d", ModuleStats[iLayer][iModule]);
+        total_modules[iModule] += ModuleStats[iLayer][iModule];  // sum up modules across layers
+      }
+      fprintf(ifile, "            layer %2d\n", PlaneId[iLayer]);
+    }
+  fprintf(ifile, "\n------------------------------------------------------------------"
+                 "---------------\n");
+
+  // total statistics
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    fprintf(ifile, " %8d", total_modules[iModule]);
+    total_modules[NofModuleTypes] += total_modules[iModule];
+  }
+  fprintf(ifile, " %8d", total_modules[NofModuleTypes]);
+  fprintf(ifile, "   number of modules\n");
+
+  //------------------------------------------------------------------------------
+
+  // number of FEBs
+  //  fprintf(ifile,"\n#\n##   febs\n#\n\n");
+  fprintf(ifile, "# febs\n");
+
+  fprintf(ifile, " ");
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    if ((AsicsPerFeb[iModule] / 100) == 3) fprintf(ifile, "%8du", FebsPerModule[iModule]);
+    else if ((AsicsPerFeb[iModule] / 100) == 2)
+      fprintf(ifile, "%8ds", FebsPerModule[iModule]);
+    else
+      fprintf(ifile, "%8d ", FebsPerModule[iModule]);
+  }
+  fprintf(ifile, "           FEBs per module\n");
+
+  // FEB total per type
+  total_febs[NofModuleTypes] = 0;  // reset sum to 0
+  fprintf(ifile, " ");
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    if ((AsicsPerFeb[iModule] / 100) == 3) {
+      total_febs[iModule] = total_modules[iModule] * FebsPerModule[iModule];
+      fprintf(ifile, "%8du", total_febs[iModule]);
+      total_febs[NofModuleTypes] += total_febs[iModule];
+    }
+    else
+      fprintf(ifile, "         ");
+  }
+  fprintf(ifile, "%8d", total_febs[NofModuleTypes]);
+  fprintf(ifile, "   ultimate  FEBs\n");
+
+  // FEB total per type
+  total_febs[NofModuleTypes] = 0;  // reset sum to 0
+  fprintf(ifile, " ");
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    if ((AsicsPerFeb[iModule] / 100) == 2) {
+      total_febs[iModule] = total_modules[iModule] * FebsPerModule[iModule];
+      fprintf(ifile, "%8ds", total_febs[iModule]);
+      total_febs[NofModuleTypes] += total_febs[iModule];
+    }
+    else
+      fprintf(ifile, "         ");
+  }
+  fprintf(ifile, "%8d", total_febs[NofModuleTypes]);
+  fprintf(ifile, "   super     FEBs\n");
+
+  // FEB total per type
+  total_febs[NofModuleTypes] = 0;  // reset sum to 0
+  fprintf(ifile, " ");
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    if ((AsicsPerFeb[iModule] / 100) == 1) {
+      total_febs[iModule] = total_modules[iModule] * FebsPerModule[iModule];
+      fprintf(ifile, "%8d ", total_febs[iModule]);
+      total_febs[NofModuleTypes] += total_febs[iModule];
+    }
+    else
+      fprintf(ifile, "         ");
+  }
+  fprintf(ifile, "%8d", total_febs[NofModuleTypes]);
+  fprintf(ifile, "   regular   FEBs\n");
+
+  // FEB total over all types
+  total_febs[NofModuleTypes] = 0;  // reset sum to 0
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    total_febs[iModule] = total_modules[iModule] * FebsPerModule[iModule];
+    fprintf(ifile, " %8d", total_febs[iModule]);
+    total_febs[NofModuleTypes] += total_febs[iModule];
+  }
+  fprintf(ifile, " %8d", total_febs[NofModuleTypes]);
+  fprintf(ifile, "   number of FEBs\n");
+
+  //------------------------------------------------------------------------------
+
+  // number of ASICs
+  //  fprintf(ifile,"\n#\n##   asics\n#\n\n");
+  fprintf(ifile, "# asics\n");
+
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    fprintf(ifile, " %8d", AsicsPerFeb[iModule] % 100);
+  }
+  fprintf(ifile, "            ASICs per FEB\n");
+
+  // ASICs per module
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    asics_per_module[iModule] = FebsPerModule[iModule] * (AsicsPerFeb[iModule] % 100);
+    fprintf(ifile, " %8d", asics_per_module[iModule]);
+  }
+  fprintf(ifile, "            ASICs per module\n");
+
+  // ASICs per module type
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    total_asics[iModule] = total_febs[iModule] * (AsicsPerFeb[iModule] % 100);
+    fprintf(ifile, " %8d", total_asics[iModule]);
+    total_asics[NofModuleTypes] += total_asics[iModule];
+  }
+  fprintf(ifile, " %8d", total_asics[NofModuleTypes]);
+  fprintf(ifile, "   number of ASICs\n");
+
+  //------------------------------------------------------------------------------
+
+  // number of GBTXs
+  //  fprintf(ifile,"\n#\n##   asics\n#\n\n");
+  fprintf(ifile, "# gbtx\n");
+
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    fprintf(ifile, " %8d", GbtxPerModule[iModule]);
+  }
+  fprintf(ifile, "            GBTXs per module\n");
+
+  // GBTXs per module type
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    total_gbtx[iModule] = total_modules[iModule] * GbtxPerModule[iModule];
+    fprintf(ifile, " %8d", total_gbtx[iModule]);
+    total_gbtx[NofModuleTypes] += total_gbtx[iModule];
+  }
+  fprintf(ifile, " %8d", total_gbtx[NofModuleTypes]);
+  fprintf(ifile, "   number of GBTXs\n");
+
+  // GBTX ROB types per module type
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    fprintf(ifile, " %8d", RobTypeOnModule[iModule]);
+  }
+  fprintf(ifile, "            GBTX ROB types on module\n");
+
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    if ((RobTypeOnModule[iModule] % 10) == 7) total_rob7[iModule]++;
+    if ((RobTypeOnModule[iModule] / 10 % 10) == 7) total_rob7[iModule]++;
+    if ((RobTypeOnModule[iModule] / 100) == 7) total_rob7[iModule]++;
+
+    if ((RobTypeOnModule[iModule] % 10) == 5) total_rob5[iModule]++;
+    if ((RobTypeOnModule[iModule] / 10 % 10) == 5) total_rob5[iModule]++;
+    if ((RobTypeOnModule[iModule] / 100) == 5) total_rob5[iModule]++;
+
+    if ((RobTypeOnModule[iModule] % 10) == 3) total_rob3[iModule]++;
+    if ((RobTypeOnModule[iModule] / 10 % 10) == 3) total_rob3[iModule]++;
+    if ((RobTypeOnModule[iModule] / 100 % 10) == 3) total_rob3[iModule]++;
+    if ((RobTypeOnModule[iModule] / 1000 % 10) == 3) total_rob3[iModule]++;
+    if ((RobTypeOnModule[iModule] / 10000 % 10) == 3) total_rob3[iModule]++;
+    if ((RobTypeOnModule[iModule] / 100000 % 10) == 3) total_rob3[iModule]++;
+  }
+
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    total_rob7[iModule] *= total_modules[iModule];
+    fprintf(ifile, " %8d", total_rob7[iModule]);
+    total_rob7[NofModuleTypes] += total_rob7[iModule];
+  }
+  fprintf(ifile, " %8d", total_rob7[NofModuleTypes]);
+  fprintf(ifile, "   number of GBTX ROB7\n");
+
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    total_rob5[iModule] *= total_modules[iModule];
+    fprintf(ifile, " %8d", total_rob5[iModule]);
+    total_rob5[NofModuleTypes] += total_rob5[iModule];
+  }
+  fprintf(ifile, " %8d", total_rob5[NofModuleTypes]);
+  fprintf(ifile, "   number of GBTX ROB5\n");
+
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    total_rob3[iModule] *= total_modules[iModule];
+    fprintf(ifile, " %8d", total_rob3[iModule]);
+    total_rob3[NofModuleTypes] += total_rob3[iModule];
+  }
+  fprintf(ifile, " %8d", total_rob3[NofModuleTypes]);
+  fprintf(ifile, "   number of GBTX ROB3\n");
+
+  //------------------------------------------------------------------------------
+  fprintf(ifile, "# e-links\n");
+
+  // e-links used
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++)
+    fprintf(ifile, " %8d", asics_per_module[iModule] * 2);
+  fprintf(ifile, " %8d", total_asics[NofModuleTypes] * 2);
+  fprintf(ifile, "   e-links used\n");
+
+  // e-links available
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++)
+    fprintf(ifile, " %8d", GbtxPerModule[iModule] * 14);
+  fprintf(ifile, " %8d", total_gbtx[NofModuleTypes] * 14);
+  fprintf(ifile, "   e-links available\n");
+
+  // e-link efficiency
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    if (total_gbtx[iModule] != 0)
+      fprintf(ifile, " %7.1f%%", (float) total_asics[iModule] * 2 / (total_gbtx[iModule] * 14) * 100);
+    else
+      fprintf(ifile, "        -");
+  }
+  if (total_gbtx[NofModuleTypes] != 0)
+    fprintf(ifile, " %7.1f%%", (float) total_asics[NofModuleTypes] * 2 / (total_gbtx[NofModuleTypes] * 14) * 100);
+  fprintf(ifile, "   e-link efficiency\n\n");
+
+  //------------------------------------------------------------------------------
+
+  // number of channels
+  fprintf(ifile, "# channels\n");
+
+  // channels per module
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    if ((AsicsPerFeb[iModule] % 100) == 16) {
+      channels_per_feb[iModule]    = 80 * 6;  // rows  // 84, if 63 of 64 ch used
+      channels_per_module[iModule] = channels_per_feb[iModule] * FebsPerModule[iModule];
+    }
+    if ((AsicsPerFeb[iModule] % 100) == 15) {
+      channels_per_feb[iModule]    = 80 * 6;  // rows
+      channels_per_module[iModule] = channels_per_feb[iModule] * FebsPerModule[iModule];
+    }
+    if ((AsicsPerFeb[iModule] % 100) == 10) {
+      channels_per_feb[iModule]    = 80 * 4;  // rows
+      channels_per_module[iModule] = channels_per_feb[iModule] * FebsPerModule[iModule];
+    }
+    if ((AsicsPerFeb[iModule] % 100) == 5) {
+      channels_per_feb[iModule]    = 80 * 2;  // rows
+      channels_per_module[iModule] = channels_per_feb[iModule] * FebsPerModule[iModule];
+    }
+
+    if ((AsicsPerFeb[iModule] % 100) == 9) {
+      channels_per_feb[iModule]    = 144 * 2;  // rows
+      channels_per_module[iModule] = channels_per_feb[iModule] * FebsPerModule[iModule];
+    }
+    if ((AsicsPerFeb[iModule] % 100) == 8) {
+      channels_per_feb[iModule]    = 128 * 2;  // rows
+      channels_per_module[iModule] = channels_per_feb[iModule] * FebsPerModule[iModule];
+    }
+    if ((AsicsPerFeb[iModule] % 100) == 7) {
+      channels_per_feb[iModule]    = 112 * 2;  // rows
+      channels_per_module[iModule] = channels_per_feb[iModule] * FebsPerModule[iModule];
+    }
+  }
+
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++)
+    fprintf(ifile, " %8d", channels_per_module[iModule]);
+  fprintf(ifile, "            channels per module\n");
+
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++)
+    fprintf(ifile, " %8d", channels_per_feb[iModule]);
+  fprintf(ifile, "            channels per feb\n");
+
+  // channels used
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    total_channels[iModule] = channels_per_module[iModule] * total_modules[iModule];
+    fprintf(ifile, " %8d", total_channels[iModule]);
+    total_channels[NofModuleTypes] += total_channels[iModule];
+  }
+  fprintf(ifile, " %8d", total_channels[NofModuleTypes]);
+  fprintf(ifile, "   channels used\n");
+
+  // channels available
+  fprintf(ifile, " ");
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++) {
+    if ((AsicsPerFeb[iModule] / 100) == 3) {
+      fprintf(ifile, "%8du", total_asics[iModule] * 32);
+      total_channels_u += total_asics[iModule] * 32;
+    }
+    else if ((AsicsPerFeb[iModule] / 100) == 2) {
+      fprintf(ifile, "%8ds", total_asics[iModule] * 32);
+      total_channels_s += total_asics[iModule] * 32;
+    }
+    else {
+      fprintf(ifile, "%8d ", total_asics[iModule] * 32);
+      total_channels_r += total_asics[iModule] * 32;
+    }
+  }
+  fprintf(ifile, "%8d", total_asics[NofModuleTypes] * 32);
+  fprintf(ifile, "   channels available\n");
+
+  // channel ratio for u,s,r density
+  fprintf(ifile, " ");
+  fprintf(ifile, "%7.1f%%u", (float) total_channels_u / (total_asics[NofModuleTypes] * 32) * 100);
+  fprintf(ifile, "%7.1f%%s", (float) total_channels_s / (total_asics[NofModuleTypes] * 32) * 100);
+  fprintf(ifile, "%7.1f%%r", (float) total_channels_r / (total_asics[NofModuleTypes] * 32) * 100);
+  fprintf(ifile, "                                                        channel ratio\n");
+
+  fprintf(ifile, "\n");
+  fprintf(ifile, "%8.1f%%   channel efficiency\n",
+          1. * total_channels[NofModuleTypes] / (total_asics[NofModuleTypes] * 32) * 100);
+
+  //------------------------------------------------------------------------------
+
+  // total surface of TRD
+  for (Int_t iModule = 0; iModule < NofModuleTypes; iModule++)
+    if (iModule <= 3) {
+      total_surface += total_modules[iModule] * DetectorSizeX[0] / 100 * DetectorSizeY[0] / 100;
+      total_actarea += total_modules[iModule] * (DetectorSizeX[0] - 2 * FrameWidth[0]) / 100
+                       * (DetectorSizeY[0] - 2 * FrameWidth[0]) / 100;
+    }
+    else {
+      total_surface += total_modules[iModule] * DetectorSizeX[1] / 100 * DetectorSizeY[1] / 100;
+      total_actarea += total_modules[iModule] * (DetectorSizeX[1] - 2 * FrameWidth[1]) / 100
+                       * (DetectorSizeY[1] - 2 * FrameWidth[1]) / 100;
+    }
+  fprintf(ifile, "\n");
+
+  // summary
+  fprintf(ifile, "%7.2f m2      total surface    \n", total_surface);
+  fprintf(ifile, "%7.2f m2      total active area\n", total_actarea);
+  fprintf(ifile, "%7.2f m3      total gas volume \n",
+          total_actarea * gas_thickness / 100);  // convert cm to m for thickness
+
+  fprintf(ifile, "%7.2f cm2/ch  average channel size\n", 100. * 100 * total_actarea / total_channels[NofModuleTypes]);
+  fprintf(ifile, "%7.2f ch/m2   channels per m2 active area\n", 1. * total_channels[NofModuleTypes] / total_actarea);
+  fprintf(ifile, "\n");
+
+  // gas volume position
+  fprintf(ifile, "# gas volume position\n");
+  for (Int_t iLayer = 0; iLayer < MaxLayers; iLayer++)
+    if (ShowLayer[iLayer])
+      fprintf(ifile, "%10.4f cm   position of gas volume - layer %2d\n",
+              LayerPosition[iLayer] + LayerThickness / 2. + gas_position, PlaneId[iLayer]);
+  fprintf(ifile, "\n");
+
+  fclose(ifile);
+}
+
+
+void create_materials_from_media_file()
+{
+  // Use the FairRoot geometry interface to load the media which are already defined
+  FairGeoLoader* geoLoad    = new FairGeoLoader("TGeo", "FairGeoLoader");
+  FairGeoInterface* geoFace = geoLoad->getGeoInterface();
+  TString geoPath           = gSystem->Getenv("VMCWORKDIR");
+  TString medFile           = geoPath + "/geometry/media.geo";
+  geoFace->setMediaFile(medFile);
+  geoFace->readMedia();
+
+  // Read the required media and create them in the GeoManager
+  FairGeoMedia* geoMedia   = geoFace->getMedia();
+  FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
+
+  FairGeoMedium* air       = geoMedia->getMedium(KeepingVolumeMedium);
+  FairGeoMedium* pefoam20  = geoMedia->getMedium(RadiatorVolumeMedium);
+  FairGeoMedium* G10       = geoMedia->getMedium(LatticeVolumeMedium);
+  FairGeoMedium* kapton    = geoMedia->getMedium(KaptonVolumeMedium);
+  FairGeoMedium* trdGas    = geoMedia->getMedium(GasVolumeMedium);
+  FairGeoMedium* copper    = geoMedia->getMedium(PadCopperVolumeMedium);
+  FairGeoMedium* carbon    = geoMedia->getMedium(CarbonVolumeMedium);
+  FairGeoMedium* honeycomb = geoMedia->getMedium(HoneycombVolumeMedium);
+  FairGeoMedium* aluminium = geoMedia->getMedium(AluminiumVolumeMedium);
+
+  //  FairGeoMedium* goldCoatedCopper = geoMedia->getMedium("goldcoatedcopper");
+  //  FairGeoMedium* polypropylene    = geoMedia->getMedium("polypropylene");
+  //  FairGeoMedium* mylar            = geoMedia->getMedium("mylar");
+
+  geoBuild->createMedium(air);
+  geoBuild->createMedium(pefoam20);
+  geoBuild->createMedium(trdGas);
+  geoBuild->createMedium(honeycomb);
+  geoBuild->createMedium(carbon);
+  geoBuild->createMedium(G10);
+  geoBuild->createMedium(copper);
+  geoBuild->createMedium(kapton);
+  geoBuild->createMedium(aluminium);
+
+  //  geoBuild->createMedium(goldCoatedCopper);
+  //  geoBuild->createMedium(polypropylene);
+  //  geoBuild->createMedium(mylar);
+}
+
+TGeoVolume* create_trd_module_type(Int_t moduleType)
+{
+  Int_t type           = ModuleType[moduleType - 1];
+  Double_t sizeX       = DetectorSizeX[type];
+  Double_t sizeY       = DetectorSizeY[type];
+  Double_t frameWidth  = FrameWidth[type];
+  Double_t activeAreaX = sizeX - 2 * frameWidth;
+  Double_t activeAreaY = sizeY - 2 * frameWidth;
+
+  TGeoMedium* keepVolMed      = gGeoMan->GetMedium(KeepingVolumeMedium);
+  TGeoMedium* radVolMed       = gGeoMan->GetMedium(RadiatorVolumeMedium);
+  TGeoMedium* latticeVolMed   = gGeoMan->GetMedium(LatticeVolumeMedium);
+  TGeoMedium* kaptonVolMed    = gGeoMan->GetMedium(KaptonVolumeMedium);
+  TGeoMedium* gasVolMed       = gGeoMan->GetMedium(GasVolumeMedium);
+  TGeoMedium* padcopperVolMed = gGeoMan->GetMedium(PadCopperVolumeMedium);
+  TGeoMedium* padpcbVolMed    = gGeoMan->GetMedium(PadPcbVolumeMedium);
+  TGeoMedium* honeycombVolMed = gGeoMan->GetMedium(HoneycombVolumeMedium);
+  TGeoMedium* carbonVolMed    = gGeoMan->GetMedium(CarbonVolumeMedium);
+  //  TGeoMedium* mylarVolMed       = gGeoMan->GetMedium(MylarVolumeMedium);
+  //  TGeoMedium* electronicsVolMed = gGeoMan->GetMedium(ElectronicsVolumeMedium);
+  TGeoMedium* frameVolMed    = gGeoMan->GetMedium(FrameVolumeMedium);
+  TGeoMedium* aluledgeVolMed = gGeoMan->GetMedium(AluLegdeVolumeMedium);
+  TGeoMedium* febVolMed      = gGeoMan->GetMedium(FebVolumeMedium);
+  TGeoMedium* asicVolMed     = gGeoMan->GetMedium(AsicVolumeMedium);
+  //  TGeoMedium* aluminiumVolMed   = gGeoMan->GetMedium(AluminiumVolumeMedium);
+
+  TString name       = Form("module%d", moduleType);
+  TGeoVolume* module = new TGeoVolumeAssembly(name);
+
+
+  if (IncludeRadiator) {
+    // Radiator
+    //   TGeoBBox* trd_radiator = new TGeoBBox("", activeAreaX /2., activeAreaY /2., radiator_thickness /2.);
+    TGeoBBox* trd_radiator     = new TGeoBBox("trd_radiator", sizeX / 2., sizeY / 2., radiator_thickness / 2.);
+    TGeoVolume* trdmod1_radvol = new TGeoVolume("radiator", trd_radiator, radVolMed);
+    //     TGeoVolume* trdmod1_radvol = new TGeoVolume(Form("module%d_radiator", moduleType), trd_radiator, radVolMed);
+    //     TGeoVolume* trdmod1_radvol = new TGeoVolume(Form("trd1mod%dradiator", moduleType), trd_radiator, radVolMed);
+    trdmod1_radvol->SetLineColor(kBlue);
+    trdmod1_radvol->SetTransparency(70);  // (60);  // (70);  // set transparency for the TRD radiator
+    TGeoTranslation* trd_radiator_trans = new TGeoTranslation("", 0., 0., radiator_position);
+    module->AddNode(trdmod1_radvol, 1, trd_radiator_trans);
+  }
+
+  // Lattice grid
+  if (IncludeLattice) {
+
+    if (type == 0)  // inner modules
+    {
+      //     printf("lattice type %d\n", type);
+      // drift window - lattice grid - sprossenfenster
+      TGeoBBox* trd_lattice_mod0_ho = new TGeoBBox("trd_lattice_mod0_ho", sizeX / 2., lattice_o_width[type] / 2.,
+                                                   lattice_thickness / 2.);  // horizontal outer
+      TGeoBBox* trd_lattice_mod0_hi =
+        new TGeoBBox("trd_lattice_mod0_hi", sizeX / 2. - lattice_o_width[type], lattice_i_width[type] / 2.,
+                     lattice_thickness / 2.);  // horizontal inner
+      TGeoBBox* trd_lattice_mod0_vo =
+        new TGeoBBox("trd_lattice_mod0_vo", lattice_o_width[type] / 2., sizeX / 2. - lattice_o_width[type],
+                     lattice_thickness / 2.);  // vertical outer
+      TGeoBBox* trd_lattice_mod0_vi = new TGeoBBox("trd_lattice_mod0_vi", lattice_i_width[type] / 2.,
+                                                   0.20 * activeAreaY / 2. - lattice_i_width[type] / 2.,
+                                                   lattice_thickness / 2.);  // vertical inner
+      TGeoBBox* trd_lattice_mod0_vb = new TGeoBBox("trd_lattice_mod0_vb", lattice_i_width[type] / 2.,
+                                                   0.20 * activeAreaY / 2. - lattice_i_width[type] / 4.,
+                                                   lattice_thickness / 2.);  // vertical border
+
+      TGeoVolume* trd_lattice_mod0_vol_ho = new TGeoVolume("lattice0ho", trd_lattice_mod0_ho, latticeVolMed);
+      TGeoVolume* trd_lattice_mod0_vol_hi = new TGeoVolume("lattice0hi", trd_lattice_mod0_hi, latticeVolMed);
+      TGeoVolume* trd_lattice_mod0_vol_vo = new TGeoVolume("lattice0vo", trd_lattice_mod0_vo, latticeVolMed);
+      TGeoVolume* trd_lattice_mod0_vol_vi = new TGeoVolume("lattice0vi", trd_lattice_mod0_vi, latticeVolMed);
+      TGeoVolume* trd_lattice_mod0_vol_vb = new TGeoVolume("lattice0vb", trd_lattice_mod0_vb, latticeVolMed);
+
+      trd_lattice_mod0_vol_ho->SetLineColor(kYellow);  // kBlue);
+      trd_lattice_mod0_vol_vo->SetLineColor(kYellow);  // kOrange);
+      trd_lattice_mod0_vol_hi->SetLineColor(kYellow);  // kRed);
+      trd_lattice_mod0_vol_vi->SetLineColor(kYellow);  // kWhite);
+      trd_lattice_mod0_vol_vb->SetLineColor(kYellow);
+
+      TGeoTranslation* tv010 =
+        new TGeoTranslation("tv010", 0., (1.00 * activeAreaY / 2. + lattice_o_width[type] / 2.), 0);
+      TGeoTranslation* tv015 =
+        new TGeoTranslation("tv015", 0., -(1.00 * activeAreaY / 2. + lattice_o_width[type] / 2.), 0);
+
+      TGeoTranslation* th020 =
+        new TGeoTranslation("th020", (1.00 * activeAreaX / 2. + lattice_o_width[type] / 2.), 0., 0);
+      TGeoTranslation* th025 =
+        new TGeoTranslation("th025", -(1.00 * activeAreaX / 2. + lattice_o_width[type] / 2.), 0., 0);
+
+      Double_t hypos0[4] = {(0.60 * activeAreaY / 2.), (0.20 * activeAreaY / 2.), -(0.20 * activeAreaY / 2.),
+                            -(0.60 * activeAreaY / 2.)};
+
+      Double_t vxpos0[4] = {(0.60 * activeAreaX / 2.), (0.20 * activeAreaX / 2.), -(0.20 * activeAreaX / 2.),
+                            -(0.60 * activeAreaX / 2.)};
+
+      Double_t vypos0[5] = {(0.80 * activeAreaY / 2. + lattice_i_width[type] / 4.), (0.40 * activeAreaY / 2.),
+                            (0.00 * activeAreaY / 2.), -(0.40 * activeAreaY / 2.),
+                            -(0.80 * activeAreaY / 2. + lattice_i_width[type] / 4.)};
+
+      //       TGeoVolumeAssembly* trdmod0_lattice = new TGeoVolumeAssembly("mod0lattice"); // volume for lattice grid
+
+      TGeoBBox* trd_lattice_mod0  = new TGeoBBox("trd_lattice_mod0", sizeX / 2., sizeY / 2., lattice_thickness / 2.);
+      TGeoVolume* trdmod0_lattice = new TGeoVolume("lat_grid_mod0", trd_lattice_mod0, keepVolMed);
+
+      //       trdmod0_lattice->SetLineColor(kGreen);  // set color for keeping volume
+
+      // outer frame
+      trdmod0_lattice->AddNode(trd_lattice_mod0_vol_ho, 1, tv010);
+      trdmod0_lattice->AddNode(trd_lattice_mod0_vol_ho, 2, tv015);
+
+      trdmod0_lattice->AddNode(trd_lattice_mod0_vol_vo, 3, th020);
+      trdmod0_lattice->AddNode(trd_lattice_mod0_vol_vo, 4, th025);
+
+      // lattice piece number
+      Int_t lat0_no = 5;
+
+      // horizontal bars
+      for (Int_t y = 0; y < 4; y++) {
+        TGeoTranslation* t0xy = new TGeoTranslation("", 0, hypos0[y], 0);
+        trdmod0_lattice->AddNode(trd_lattice_mod0_vol_hi, lat0_no, t0xy);
+        lat0_no++;
+      }
+
+      // vertical bars
+      for (Int_t x = 0; x < 4; x++)
+        for (Int_t y = 0; y < 5; y++) {
+          TGeoTranslation* t0xy = new TGeoTranslation("", vxpos0[x], vypos0[y], 0);
+          if ((y == 0) || (y == 4)) trdmod0_lattice->AddNode(trd_lattice_mod0_vol_vb, lat0_no, t0xy);  // border piece
+          else
+            trdmod0_lattice->AddNode(trd_lattice_mod0_vol_vi, lat0_no, t0xy);  // middle piece
+          lat0_no++;
+        }
+
+      // add lattice to module
+      TGeoTranslation* trd_lattice_trans = new TGeoTranslation("", 0., 0., lattice_position);
+      module->AddNode(trdmod0_lattice, 1, trd_lattice_trans);
+    }
+
+    else if (type == 1)  // outer modules
+    {
+      //     printf("lattice type %d\n", type);
+      // drift window - lattice grid - sprossenfenster
+      TGeoBBox* trd_lattice_mod1_ho = new TGeoBBox("trd_lattice_mod1_ho", sizeX / 2., lattice_o_width[type] / 2.,
+                                                   lattice_thickness / 2.);  // horizontal outer
+      TGeoBBox* trd_lattice_mod1_hi =
+        new TGeoBBox("trd_lattice_mod1_hi", sizeX / 2. - lattice_o_width[type], lattice_i_width[type] / 2.,
+                     lattice_thickness / 2.);  // horizontal inner
+      TGeoBBox* trd_lattice_mod1_vo =
+        new TGeoBBox("trd_lattice_mod1_vo", lattice_o_width[type] / 2., sizeX / 2. - lattice_o_width[type],
+                     lattice_thickness / 2.);  // vertical outer
+      TGeoBBox* trd_lattice_mod1_vi = new TGeoBBox("trd_lattice_mod1_vi", lattice_i_width[type] / 2.,
+                                                   0.125 * activeAreaY / 2. - lattice_i_width[type] / 2.,
+                                                   lattice_thickness / 2.);  // vertical inner
+      TGeoBBox* trd_lattice_mod1_vb = new TGeoBBox("trd_lattice_mod1_vb", lattice_i_width[type] / 2.,
+                                                   0.125 * activeAreaY / 2. - lattice_i_width[type] / 4.,
+                                                   lattice_thickness / 2.);  // vertical border
+
+      TGeoVolume* trd_lattice_mod1_vol_ho = new TGeoVolume("lattice1ho", trd_lattice_mod1_ho, latticeVolMed);
+      TGeoVolume* trd_lattice_mod1_vol_hi = new TGeoVolume("lattice1hi", trd_lattice_mod1_hi, latticeVolMed);
+      TGeoVolume* trd_lattice_mod1_vol_vo = new TGeoVolume("lattice1vo", trd_lattice_mod1_vo, latticeVolMed);
+      TGeoVolume* trd_lattice_mod1_vol_vi = new TGeoVolume("lattice1vi", trd_lattice_mod1_vi, latticeVolMed);
+      TGeoVolume* trd_lattice_mod1_vol_vb = new TGeoVolume("lattice1vb", trd_lattice_mod1_vb, latticeVolMed);
+
+      trd_lattice_mod1_vol_ho->SetLineColor(kYellow);  // kBlue);
+      trd_lattice_mod1_vol_vo->SetLineColor(kYellow);  // kOrange);
+      trd_lattice_mod1_vol_hi->SetLineColor(kYellow);  // kRed);
+      trd_lattice_mod1_vol_vi->SetLineColor(kYellow);  // kWhite);
+      trd_lattice_mod1_vol_vb->SetLineColor(kYellow);
+
+      TGeoTranslation* tv110 =
+        new TGeoTranslation("tv110", 0., (1.00 * activeAreaY / 2. + lattice_o_width[type] / 2.), 0);
+      TGeoTranslation* tv118 =
+        new TGeoTranslation("tv118", 0., -(1.00 * activeAreaY / 2. + lattice_o_width[type] / 2.), 0);
+
+      TGeoTranslation* th120 =
+        new TGeoTranslation("th120", (1.00 * activeAreaX / 2. + lattice_o_width[type] / 2.), 0., 0);
+      TGeoTranslation* th128 =
+        new TGeoTranslation("th128", -(1.00 * activeAreaX / 2. + lattice_o_width[type] / 2.), 0., 0);
+
+      Double_t hypos1[7] = {(0.75 * activeAreaY / 2.), (0.50 * activeAreaY / 2.),  (0.25 * activeAreaY / 2.),
+                            (0.00 * activeAreaY / 2.), -(0.25 * activeAreaY / 2.), -(0.50 * activeAreaY / 2.),
+                            -(0.75 * activeAreaY / 2.)};
+
+      Double_t vxpos1[7] = {(0.75 * activeAreaX / 2.), (0.50 * activeAreaX / 2.),  (0.25 * activeAreaX / 2.),
+                            (0.00 * activeAreaX / 2.), -(0.25 * activeAreaX / 2.), -(0.50 * activeAreaX / 2.),
+                            -(0.75 * activeAreaX / 2.)};
+
+      Double_t vypos1[8] = {(0.875 * activeAreaY / 2. + lattice_i_width[type] / 4.),
+                            (0.625 * activeAreaY / 2.),
+                            (0.375 * activeAreaY / 2.),
+                            (0.125 * activeAreaY / 2.),
+                            -(0.125 * activeAreaY / 2.),
+                            -(0.375 * activeAreaY / 2.),
+                            -(0.625 * activeAreaY / 2.),
+                            -(0.875 * activeAreaY / 2. + lattice_i_width[type] / 4.)};
+
+      //       TGeoVolumeAssembly* trdmod1_lattice = new TGeoVolumeAssembly("mod1lattice"); // volume for lattice grid
+
+      TGeoBBox* trd_lattice_mod1  = new TGeoBBox("trd_lattice_mod1", sizeX / 2., sizeY / 2., lattice_thickness / 2.);
+      TGeoVolume* trdmod1_lattice = new TGeoVolume("lat_grid_mod1", trd_lattice_mod1, keepVolMed);
+
+      //       trdmod1_lattice->SetLineColor(kGreen);  // set color for keeping volume
+
+      // outer frame
+      trdmod1_lattice->AddNode(trd_lattice_mod1_vol_ho, 1, tv110);
+      trdmod1_lattice->AddNode(trd_lattice_mod1_vol_ho, 2, tv118);
+
+      trdmod1_lattice->AddNode(trd_lattice_mod1_vol_vo, 3, th120);
+      trdmod1_lattice->AddNode(trd_lattice_mod1_vol_vo, 4, th128);
+
+      // lattice piece number
+      Int_t lat1_no = 5;
+
+      // horizontal bars
+      for (Int_t y = 0; y < 7; y++) {
+        TGeoTranslation* t1xy = new TGeoTranslation("", 0, hypos1[y], 0);
+        trdmod1_lattice->AddNode(trd_lattice_mod1_vol_hi, lat1_no, t1xy);
+        lat1_no++;
+      }
+
+      // vertical bars
+      for (Int_t x = 0; x < 7; x++)
+        for (Int_t y = 0; y < 8; y++) {
+          TGeoTranslation* t1xy = new TGeoTranslation("", vxpos1[x], vypos1[y], 0);
+          if ((y == 0) || (y == 7)) trdmod1_lattice->AddNode(trd_lattice_mod1_vol_vb, lat1_no, t1xy);  // border piece
+          else
+            trdmod1_lattice->AddNode(trd_lattice_mod1_vol_vi, lat1_no, t1xy);  // middle piece
+          lat1_no++;
+        }
+
+      // add lattice to module
+      TGeoTranslation* trd_lattice_trans = new TGeoTranslation("", 0., 0., lattice_position);
+      module->AddNode(trdmod1_lattice, 1, trd_lattice_trans);
+    }
+
+  }  // with lattice grid
+
+  if (IncludeKaptonFoil) {
+    // Kapton Foil
+    TGeoBBox* trd_kapton          = new TGeoBBox("trd_kapton", sizeX / 2., sizeY / 2., kapton_thickness / 2.);
+    TGeoVolume* trdmod1_kaptonvol = new TGeoVolume("kaptonfoil", trd_kapton, kaptonVolMed);
+    //   TGeoVolume* trdmod1_kaptonvol = new TGeoVolume(Form("module%d_kaptonfoil", moduleType), trd_kapton, kaptonVolMed);
+    //   TGeoVolume* trdmod1_kaptonvol = new TGeoVolume(Form("trd1mod%dkapton", moduleType), trd_kapton, kaptonVolMed);
+    trdmod1_kaptonvol->SetLineColor(kGreen);
+    TGeoTranslation* trd_kapton_trans = new TGeoTranslation("", 0., 0., kapton_position);
+    module->AddNode(trdmod1_kaptonvol, 1, trd_kapton_trans);
+  }
+
+  // start of Frame in z
+  // Gas
+  TGeoBBox* trd_gas          = new TGeoBBox("trd_gas", activeAreaX / 2., activeAreaY / 2., gas_thickness / 2.);
+  TGeoVolume* trdmod1_gasvol = new TGeoVolume("gas", trd_gas, gasVolMed);
+  //   TGeoVolume* trdmod1_gasvol = new TGeoVolume(Form("module%d_gas", moduleType), trd_gas, gasVolMed);
+  //   TGeoVolume* trdmod1_gasvol = new TGeoVolume(Form("trd1mod%dgas", moduleType), trd_gas, gasVolMed);
+  //   trdmod1_gasvol->SetLineColor(kBlue);
+  trdmod1_gasvol->SetLineColor(kGreen);  // to avoid blue overlaps in the screenshots
+  trdmod1_gasvol->SetTransparency(40);   // set transparency for the TRD gas
+  TGeoTranslation* trd_gas_trans = new TGeoTranslation("", 0., 0., gas_position);
+  module->AddNode(trdmod1_gasvol, 1, trd_gas_trans);
+  // end of Frame in z
+
+  if (IncludeGasFrame) {
+    // frame1
+    TGeoBBox* trd_frame1          = new TGeoBBox("trd_frame1", sizeX / 2., frameWidth / 2., frame_thickness / 2.);
+    TGeoVolume* trdmod1_frame1vol = new TGeoVolume("frame1", trd_frame1, frameVolMed);
+    trdmod1_frame1vol->SetLineColor(kRed);
+
+    // translations
+    TGeoTranslation* trd_frame1_trans = new TGeoTranslation("", 0., activeAreaY / 2. + frameWidth / 2., frame_position);
+    module->AddNode(trdmod1_frame1vol, 1, trd_frame1_trans);
+    trd_frame1_trans = new TGeoTranslation("", 0., -(activeAreaY / 2. + frameWidth / 2.), frame_position);
+    module->AddNode(trdmod1_frame1vol, 2, trd_frame1_trans);
+
+
+    // frame2
+    TGeoBBox* trd_frame2          = new TGeoBBox("trd_frame2", frameWidth / 2., activeAreaY / 2., frame_thickness / 2.);
+    TGeoVolume* trdmod1_frame2vol = new TGeoVolume("frame2", trd_frame2, frameVolMed);
+    trdmod1_frame2vol->SetLineColor(kRed);
+
+    // translations
+    TGeoTranslation* trd_frame2_trans = new TGeoTranslation("", activeAreaX / 2. + frameWidth / 2., 0., frame_position);
+    module->AddNode(trdmod1_frame2vol, 1, trd_frame2_trans);
+    trd_frame2_trans = new TGeoTranslation("", -(activeAreaX / 2. + frameWidth / 2.), 0., frame_position);
+    module->AddNode(trdmod1_frame2vol, 2, trd_frame2_trans);
+  }
+
+  if (IncludePadplane) {
+    // Pad Copper
+    TGeoBBox* trd_padcopper          = new TGeoBBox("trd_padcopper", sizeX / 2., sizeY / 2., padcopper_thickness / 2.);
+    TGeoVolume* trdmod1_padcoppervol = new TGeoVolume("padcopper", trd_padcopper, padcopperVolMed);
+    //   TGeoVolume* trdmod1_padcoppervol = new TGeoVolume(Form("module%d_padcopper", moduleType), trd_padcopper, padcopperVolMed);
+    //   TGeoVolume* trdmod1_padcoppervol = new TGeoVolume(Form("trd1mod%dpadcopper", moduleType), trd_padcopper, padcopperVolMed);
+    trdmod1_padcoppervol->SetLineColor(kOrange);
+    TGeoTranslation* trd_padcopper_trans = new TGeoTranslation("", 0., 0., padcopper_position);
+    module->AddNode(trdmod1_padcoppervol, 1, trd_padcopper_trans);
+
+    // Pad Plane
+    TGeoBBox* trd_padpcb          = new TGeoBBox("trd_padpcb", sizeX / 2., sizeY / 2., padplane_thickness / 2.);
+    TGeoVolume* trdmod1_padpcbvol = new TGeoVolume("padplane", trd_padpcb, padpcbVolMed);
+    //   TGeoVolume* trdmod1_padpcbvol = new TGeoVolume(Form("module%d_padplane", moduleType), trd_padpcb, padpcbVolMed);
+    //   TGeoVolume* trdmod1_padpcbvol = new TGeoVolume(Form("trd1mod%dpadplane", moduleType), trd_padpcb, padpcbVolMed);
+    trdmod1_padpcbvol->SetLineColor(kBlue);
+    TGeoTranslation* trd_padpcb_trans = new TGeoTranslation("", 0., 0., padplane_position);
+    module->AddNode(trdmod1_padpcbvol, 1, trd_padpcb_trans);
+  }
+
+  if (IncludeBackpanel) {
+    // Honeycomb
+    TGeoBBox* trd_honeycomb          = new TGeoBBox("trd_honeycomb", sizeX / 2., sizeY / 2., honeycomb_thickness / 2.);
+    TGeoVolume* trdmod1_honeycombvol = new TGeoVolume("honeycomb", trd_honeycomb, honeycombVolMed);
+    //   TGeoVolume* trdmod1_honeycombvol = new TGeoVolume(Form("module%d_honeycomb", moduleType), trd_honeycomb, honeycombVolMed);
+    //   TGeoVolume* trdmod1_honeycombvol = new TGeoVolume(Form("trd1mod%dhoneycomb", moduleType), trd_honeycomb, honeycombVolMed);
+    trdmod1_honeycombvol->SetLineColor(kOrange);
+    TGeoTranslation* trd_honeycomb_trans = new TGeoTranslation("", 0., 0., honeycomb_position);
+    module->AddNode(trdmod1_honeycombvol, 1, trd_honeycomb_trans);
+
+    // Carbon fiber layers
+    TGeoBBox* trd_carbon          = new TGeoBBox("trd_carbon", sizeX / 2., sizeY / 2., carbon_thickness / 2.);
+    TGeoVolume* trdmod1_carbonvol = new TGeoVolume("carbonsheet", trd_carbon, carbonVolMed);
+    //   TGeoVolume* trdmod1_carbonvol = new TGeoVolume(Form("module%d_carbonsheet", moduleType), trd_carbon, carbonVolMed);
+    //   TGeoVolume* trdmod1_carbonvol = new TGeoVolume(Form("trd1mod%dcarbon", moduleType), trd_carbon, carbonVolMed);
+    trdmod1_carbonvol->SetLineColor(kGreen);
+    TGeoTranslation* trd_carbon_trans = new TGeoTranslation("", 0., 0., carbon_position);
+    module->AddNode(trdmod1_carbonvol, 1, trd_carbon_trans);
+  }
+
+  if (IncludeAluLedge) {
+    // Al-ledge
+    TGeoBBox* trd_aluledge1 = new TGeoBBox("trd_aluledge1", sizeY / 2., aluminium_width / 2., aluminium_thickness / 2.);
+    TGeoVolume* trdmod1_aluledge1vol = new TGeoVolume("aluledge1", trd_aluledge1, aluledgeVolMed);
+    trdmod1_aluledge1vol->SetLineColor(kRed);
+
+    // translations
+    TGeoTranslation* trd_aluledge1_trans =
+      new TGeoTranslation("", 0., sizeY / 2. - aluminium_width / 2., aluminium_position);
+    module->AddNode(trdmod1_aluledge1vol, 1, trd_aluledge1_trans);
+    trd_aluledge1_trans = new TGeoTranslation("", 0., -(sizeY / 2. - aluminium_width / 2.), aluminium_position);
+    module->AddNode(trdmod1_aluledge1vol, 2, trd_aluledge1_trans);
+
+
+    // Al-ledge
+    TGeoBBox* trd_aluledge2 =
+      new TGeoBBox("trd_aluledge2", aluminium_width / 2., sizeY / 2. - aluminium_width, aluminium_thickness / 2.);
+    TGeoVolume* trdmod1_aluledge2vol = new TGeoVolume("aluledge2", trd_aluledge2, aluledgeVolMed);
+    trdmod1_aluledge2vol->SetLineColor(kRed);
+
+    // translations
+    TGeoTranslation* trd_aluledge2_trans =
+      new TGeoTranslation("", sizeX / 2. - aluminium_width / 2., 0., aluminium_position);
+    module->AddNode(trdmod1_aluledge2vol, 1, trd_aluledge2_trans);
+    trd_aluledge2_trans = new TGeoTranslation("", -(sizeX / 2. - aluminium_width / 2.), 0., aluminium_position);
+    module->AddNode(trdmod1_aluledge2vol, 2, trd_aluledge2_trans);
+  }
+
+  // FEBs
+  if (IncludeFebs) {
+    // assemblies
+    TGeoVolumeAssembly* trd_feb_vol = new TGeoVolumeAssembly("febvol");  // the mother volume of all FEBs
+    TGeoVolumeAssembly* trd_feb_box =
+      new TGeoVolumeAssembly("febbox");  // volume for inclined FEBs, then shifted along y
+    //TGeoVolumeAssembly* trd_feb_vol = new TGeoVolumeAssembly(Form("module%d_febvol", moduleType));  // the mother volume of all FEBs
+    //TGeoVolumeAssembly* trd_feb_box = new TGeoVolumeAssembly(Form("module%d_febbox", moduleType));  // volume for inclined FEBs, then shifted along y
+    //TGeoVolumeAssembly* trd_feb_vol = new TGeoVolumeAssembly(Form("trd1mod%dfebvol", moduleType));  // the mother volume of all FEBs
+    //TGeoVolumeAssembly* trd_feb_box = new TGeoVolumeAssembly(Form("trd1mod%dfebbox", moduleType));  // volume for inclined FEBs, then shifted along y
+
+    // translations + rotations
+    TGeoTranslation* trd_feb_trans1;      // center to corner
+    TGeoTranslation* trd_feb_trans2;      // corner back
+    TGeoRotation* trd_feb_rotation;       // rotation around x axis
+    TGeoTranslation* trd_feb_y_position;  // shift to y position on TRD
+    //      TGeoTranslation *trd_feb_null;       // no displacement
+
+    // replaced by matrix operation (see below)
+    //  //      Double_t yback, zback;
+    //  //      TGeoCombiTrans  *trd_feb_placement;
+    //  //      // fix Z back offset 0.3 at some point
+    //  //      yback = -    sin(feb_rotation_angle/180*3.141)  * feb_width /2.;
+    //  //      zback = - (1-cos(feb_rotation_angle/180*3.141)) * feb_width /2. + 0.3;
+    //  //      trd_feb_placement = new TGeoCombiTrans(0, feb_pos_y + yback, zback, trd_feb_rotation);
+    //  //      trd_feb_box->AddNode(trdmod1_feb, iFeb+1, trd_feb_placement);
+
+    //      trd_feb_null       = new TGeoTranslation("", 0., 0., 0.);  // empty operation
+    trd_feb_trans1   = new TGeoTranslation("", 0., -feb_thickness / 2.,
+                                         -feb_width / 2.);  // move bottom right corner to center
+    trd_feb_trans2   = new TGeoTranslation("", 0., feb_thickness / 2.,
+                                         feb_width / 2.);  // move bottom right corner back
+    trd_feb_rotation = new TGeoRotation();
+    trd_feb_rotation->RotateX(feb_rotation_angle[moduleType - 1]);
+
+    TGeoHMatrix* incline_feb = new TGeoHMatrix("");
+
+    //        (*incline_feb) = (*trd_feb_null);        // OK
+    //        (*incline_feb) = (*trd_feb_y_position);  // OK
+    //        (*incline_feb) = (*trd_feb_trans1);      // OK
+    //        (*incline_feb) = (*trd_feb_trans1) * (*trd_feb_y_position);  // OK
+    //        (*incline_feb) = (*trd_feb_trans1) * (*trd_feb_trans2);      // OK
+    //        (*incline_feb) = (*trd_feb_trans1) * (*trd_feb_rotation);    // OK
+    //        (*incline_feb) =  (*trd_feb_trans1) * (*trd_feb_rotation) * (*trd_feb_trans2) * (*trd_feb_y_position);  // not OK
+    // trd_feb_y_position is displaced in rotated coordinate system
+
+    // matrix operation to rotate FEB PCB around its corner on the backanel
+    (*incline_feb) = (*trd_feb_trans1) * (*trd_feb_rotation) * (*trd_feb_trans2);  // OK
+
+    // Create all FEBs and place them in an assembly which will be added to the TRD module
+    TGeoBBox* trd_feb       = new TGeoBBox("trd_feb", activeAreaX / 2., feb_thickness / 2.,
+                                     feb_width / 2.);               // the FEB itself - as a cuboid
+    TGeoVolume* trdmod1_feb = new TGeoVolume("feb", trd_feb, febVolMed);  // the FEB made of a certain medium
+    //      TGeoVolume* trdmod1_feb = new TGeoVolume(Form("module%d_feb", moduleType), trd_feb, febVolMed);  // the FEB made of a certain medium
+    //      TGeoVolume* trdmod1_feb = new TGeoVolume(Form("trd1mod%dfeb", moduleType), trd_feb, febVolMed);  // the FEB made of a certain medium
+    trdmod1_feb->SetLineColor(kYellow);  // set yellow color
+    trd_feb_box->AddNode(trdmod1_feb, 1, incline_feb);
+    // now we have an inclined FEB
+
+    // ASICs
+    if (IncludeAsics) {
+      Double_t asic_pos;
+      Double_t asic_pos_x;
+      TGeoTranslation* trd_asic_trans0;  // ASIC on FEB x position
+      TGeoTranslation* trd_asic_trans1;  // center to corner
+      TGeoTranslation* trd_asic_trans2;  // corner back
+      TGeoRotation* trd_asic_rotation;   // rotation around x axis
+
+      trd_asic_trans1   = new TGeoTranslation("", 0., -(feb_thickness + asic_offset + asic_thickness / 2.),
+                                            -feb_width / 2.);  // move ASIC center to FEB corner
+      trd_asic_trans2   = new TGeoTranslation("", 0., feb_thickness + asic_offset + asic_thickness / 2.,
+                                            feb_width / 2.);  // move FEB corner back to asic center
+      trd_asic_rotation = new TGeoRotation();
+      trd_asic_rotation->RotateX(feb_rotation_angle[moduleType - 1]);
+
+      TGeoHMatrix* incline_asic;
+
+      // put many ASICs on each inclined FEB
+      TGeoBBox* trd_asic = new TGeoBBox("trd_asic", asic_width / 2., asic_thickness / 2.,
+                                        asic_width / 2.);  // ASIC dimensions
+      // TODO: use Silicon as ASICs material
+      TGeoVolume* trdmod1_asic = new TGeoVolume("asic", trd_asic, asicVolMed);  // the ASIC made of a certain medium
+      //        TGeoVolume* trdmod1_asic = new TGeoVolume(Form("module%d_asic", moduleType), trd_asic, asicVolMed);   // the ASIC made of a certain medium
+      //        TGeoVolume* trdmod1_asic = new TGeoVolume(Form("trd1mod%dasic", moduleType), trd_asic, asicVolMed);   // the ASIC made of a certain medium
+      trdmod1_asic->SetLineColor(kBlue);  // set blue color for ASICs
+
+      Int_t nofAsics   = AsicsPerFeb[moduleType - 1] % 100;
+      Int_t groupAsics = AsicsPerFeb[moduleType - 1] / 100;  // either 1 or 2 or 3 (new ultimate)
+
+      if ((nofAsics == 16) && (activeAreaX < 60)) asic_distance = 0.0;  // for 57 cm  // 0.1;  // for 60 cm
+      else
+        asic_distance = 0.4;
+
+      for (Int_t iAsic = 0; iAsic < (nofAsics / groupAsics); iAsic++) {
+        if (groupAsics == 1)  // single ASICs
+        {
+          asic_pos =
+            (iAsic + 0.5) / nofAsics - 0.5;  // equal spacing of ASICs on the FEB, e.g. for no=3 : -1/3, 0, +1/3
+
+          // ASIC 1
+          asic_pos_x      = asic_pos * activeAreaX;
+          trd_asic_trans0 = new TGeoTranslation("", asic_pos_x, feb_thickness / 2. + asic_thickness / 2. + asic_offset,
+                                                0.);  // move asic on top of FEB
+          incline_asic    = new TGeoHMatrix("");
+          (*incline_asic) = (*trd_asic_trans0) * (*trd_asic_trans1) * (*trd_asic_rotation) * (*trd_asic_trans2);  // OK
+          trd_feb_box->AddNode(trdmod1_asic, iAsic + 1,
+                               incline_asic);  // now we have ASICs on the inclined FEB
+        }
+
+        if (groupAsics == 2)  // pairs of ASICs
+        {
+          asic_pos = (iAsic + 0.5) / (nofAsics / groupAsics)
+                     - 0.5;  // equal spacing of ASICs on the FEB, e.g. for no=3 : -1/3, 0, +1/3
+
+          // ASIC 1
+          asic_pos_x      = asic_pos * activeAreaX + (0.5 + asic_distance / 2.) * asic_width;
+          trd_asic_trans0 = new TGeoTranslation("", asic_pos_x, feb_thickness / 2. + asic_thickness / 2. + asic_offset,
+                                                0.);  // move asic on top of FEB);
+          incline_asic    = new TGeoHMatrix("");
+          (*incline_asic) = (*trd_asic_trans0) * (*trd_asic_trans1) * (*trd_asic_rotation) * (*trd_asic_trans2);  // OK
+          trd_feb_box->AddNode(trdmod1_asic, 2 * iAsic + 1,
+                               incline_asic);  // now we have ASICs on the inclined FEB
+
+          // ASIC 2
+          asic_pos_x      = asic_pos * activeAreaX - (0.5 + asic_distance / 2.) * asic_width;
+          trd_asic_trans0 = new TGeoTranslation("", asic_pos_x, feb_thickness / 2. + asic_thickness / 2. + asic_offset,
+                                                0.);  // move asic on top of FEB
+          incline_asic    = new TGeoHMatrix("");
+          (*incline_asic) = (*trd_asic_trans0) * (*trd_asic_trans1) * (*trd_asic_rotation) * (*trd_asic_trans2);  // OK
+          trd_feb_box->AddNode(trdmod1_asic, 2 * iAsic + 2,
+                               incline_asic);  // now we have ASICs on the inclined FEB
+        }
+
+        if (groupAsics == 3)  // triplets of ASICs
+        {
+          asic_pos = (iAsic + 0.5) / (nofAsics / groupAsics)
+                     - 0.5;  // equal spacing of ASICs on the FEB, e.g. for no=3 : -1/3, 0, +1/3
+
+          // ASIC 1
+          asic_pos_x      = asic_pos * activeAreaX + 1.1 * asic_width;  // (0.5 + asic_distance/2.) * asic_width;
+          trd_asic_trans0 = new TGeoTranslation("", asic_pos_x, feb_thickness / 2. + asic_thickness / 2. + asic_offset,
+                                                0.);  // move asic on top of FEB);
+          incline_asic    = new TGeoHMatrix("");
+          (*incline_asic) = (*trd_asic_trans0) * (*trd_asic_trans1) * (*trd_asic_rotation) * (*trd_asic_trans2);  // OK
+          trd_feb_box->AddNode(trdmod1_asic, 3 * iAsic + 1,
+                               incline_asic);  // now we have ASICs on the inclined FEB
+
+          // ASIC 2
+          asic_pos_x      = asic_pos * activeAreaX;
+          trd_asic_trans0 = new TGeoTranslation("", asic_pos_x, feb_thickness / 2. + asic_thickness / 2. + asic_offset,
+                                                0.);  // move asic on top of FEB
+          incline_asic    = new TGeoHMatrix("");
+          (*incline_asic) = (*trd_asic_trans0) * (*trd_asic_trans1) * (*trd_asic_rotation) * (*trd_asic_trans2);  // OK
+          trd_feb_box->AddNode(trdmod1_asic, 3 * iAsic + 2,
+                               incline_asic);  // now we have ASICs on the inclined FEB
+
+          // ASIC 3
+          asic_pos_x      = asic_pos * activeAreaX - 1.1 * asic_width;  // (0.5 + asic_distance/2.) * asic_width;
+          trd_asic_trans0 = new TGeoTranslation("", asic_pos_x, feb_thickness / 2. + asic_thickness / 2. + asic_offset,
+                                                0.);  // move asic on top of FEB
+          incline_asic    = new TGeoHMatrix("");
+          (*incline_asic) = (*trd_asic_trans0) * (*trd_asic_trans1) * (*trd_asic_rotation) * (*trd_asic_trans2);  // OK
+          trd_feb_box->AddNode(trdmod1_asic, 3 * iAsic + 3,
+                               incline_asic);  // now we have ASICs on the inclined FEB
+        }
+      }
+      // now we have an inclined FEB with ASICs
+    }
+
+
+    // now go on with FEB placement
+    Double_t feb_pos;
+    Double_t feb_pos_y;
+
+    Int_t nofFebs = FebsPerModule[moduleType - 1];
+    for (Int_t iFeb = 0; iFeb < nofFebs; iFeb++) {
+      feb_pos = (iFeb + 0.5) / nofFebs - 0.5;  // equal spacing of FEBs on the backpanel
+      // cout << "feb_pos " << iFeb << ": " << feb_pos << endl;
+      feb_pos_y = feb_pos * activeAreaY;
+      feb_pos_y += feb_width / 2. * sin(feb_rotation_angle[moduleType - 1] * acos(-1.) / 180.);
+
+      // shift inclined FEB in y to its final position
+      trd_feb_y_position = new TGeoTranslation("", 0., feb_pos_y,
+                                               feb_z_offset);  // with additional fixed offset in z direction
+      //        trd_feb_y_position = new TGeoTranslation("", 0., feb_pos_y, 0.0);  // touching the backpanel with the corner
+      trd_feb_vol->AddNode(trd_feb_box, iFeb + 1, trd_feb_y_position);  // position FEB in y
+    }
+
+    if (IncludeRobs) {
+      // GBTx ROBs
+      Double_t rob_size_x    = 20.0;  // 13.0; // 130 mm
+      Double_t rob_size_y    = 9.0;   //  4.5; //  45 mm
+      Double_t rob_offset    = 1.2;
+      Double_t rob_thickness = feb_thickness;
+
+      TGeoVolumeAssembly* trd_rob_box =
+        new TGeoVolumeAssembly("robbox");  // volume for inclined FEBs, then shifted along y
+      TGeoBBox* trd_rob       = new TGeoBBox("trd_rob", rob_size_x / 2., rob_size_y / 2.,
+                                       rob_thickness / 2.);           // the ROB itself
+      TGeoVolume* trdmod1_rob = new TGeoVolume("rob", trd_rob, febVolMed);  // the ROB made of a certain medium
+      trdmod1_rob->SetLineColor(kRed);                                      // set color
+
+      //      TGeoHMatrix *incline_rob = new TGeoHMatrix("");
+      trd_rob_box->AddNode(trdmod1_rob, 1);
+
+      // GBTXs
+      Double_t gbtx_pos;
+      Double_t gbtx_pos_x;
+      Double_t gbtx_pos_y;
+      TGeoTranslation* trd_gbtx_trans1;  // center to corner
+
+      // GBTX parameters
+      const Double_t gbtx_thickness = 0.25;  // 2.5 mm
+      const Double_t gbtx_width     = 3.0;   // 2.0;  1.0;   // 1 cm
+
+      // put many GBTXs on each inclined FEB
+      TGeoBBox* trd_gbtx       = new TGeoBBox("trd_gbtx", gbtx_width / 2., gbtx_width / 2.,
+                                        gbtx_thickness / 2.);             // GBTX dimensions
+      TGeoVolume* trdmod1_gbtx = new TGeoVolume("gbtx", trd_gbtx, asicVolMed);  // the GBTX made of a certain medium
+      trdmod1_gbtx->SetLineColor(kGreen);                                       // set color for GBTXs
+
+      Int_t nofGbtxs   = GbtxPerRob[moduleType - 1] % 100;
+      Int_t groupGbtxs = GbtxPerRob[moduleType - 1] / 100;  // usually 1
+
+      //      nofGbtxs   = 7;
+      //      groupGbtxs = 1;
+
+      Int_t nofGbtxX = (nofGbtxs - 1) / 2. + 1;  // +1 is for GBTx master
+      Int_t nofGbtxY = 2;
+
+      Double_t gbtx_distance = 0.4;
+      Int_t iGbtx            = 1;
+
+      for (Int_t iGbtxX = 0; iGbtxX < nofGbtxX; iGbtxX++) {
+        gbtx_pos = (iGbtxX + 0.5) / nofGbtxX - 0.5;  // equal spacing of GBTXs on the FEB, e.g. for no=3 : -1/3, 0, +1/3
+        gbtx_pos_x = -gbtx_pos * rob_size_x;
+
+        if (iGbtxX > 0)
+          for (Int_t iGbtxY = 0; iGbtxY < nofGbtxY; iGbtxY++) {
+            gbtx_pos =
+              (iGbtxY + 0.5) / nofGbtxY - 0.5;  // equal spacing of GBTXs on the FEB, e.g. for no=3 : -1/3, 0, +1/3
+            gbtx_pos_y = gbtx_pos * rob_size_y;
+
+            trd_gbtx_trans1 = new TGeoTranslation("", gbtx_pos_x, gbtx_pos_y,
+                                                  rob_thickness / 2. + gbtx_thickness / 2.);  // move gbtx on top of ROB
+            trd_rob_box->AddNode(trdmod1_gbtx, iGbtx++,
+                                 trd_gbtx_trans1);  // now we have GBTXs on the ROB
+          }
+        else {
+          gbtx_pos_y = 0;
+
+          trd_gbtx_trans1 = new TGeoTranslation("", gbtx_pos_x, gbtx_pos_y,
+                                                rob_thickness / 2. + gbtx_thickness / 2.);  // move gbtx on top of ROB
+          trd_rob_box->AddNode(trdmod1_gbtx, iGbtx++,
+                               trd_gbtx_trans1);  // now we have GBTXs on the ROB
+        }
+      }
+
+      // now go on with ROB placement
+      Double_t rob_pos;
+      Double_t rob_pos_y;
+      TGeoTranslation* trd_rob_y_position;  // shift to y position on TRD
+
+      Int_t nofRobs = RobsPerModule[moduleType - 1];
+      for (Int_t iRob = 0; iRob < nofRobs; iRob++) {
+        rob_pos   = (iRob + 0.5) / nofRobs - 0.5;  // equal spacing of ROBs on the backpanel
+        rob_pos_y = rob_pos * activeAreaY;
+
+        // shift inclined ROB in y to its final position
+        if (feb_rotation_angle[moduleType - 1] == 90)  // if FEB parallel to backpanel
+          trd_rob_y_position = new TGeoTranslation("", 0., rob_pos_y,
+                                                   -feb_width / 2. + rob_offset);  // place ROBs close to FEBs
+        else {
+          //	    Int_t rob_z_pos = 0.;  // test where ROB is placed by default
+          Int_t rob_z_pos =
+            -feb_width / 2. + feb_width * cos(feb_rotation_angle[moduleType - 1] * acos(-1.) / 180.) + rob_offset;
+          if (rob_z_pos > feb_width / 2.)  // if the rob is too far out
+          {
+            rob_z_pos = feb_width / 2. - rob_thickness;  // place ROBs at end of feb volume
+            std::cout << "GBTx ROB was outside of the FEB volume, check "
+                         "overlap with FEB"
+                      << std::endl;
+          }
+          trd_rob_y_position = new TGeoTranslation("", 0., rob_pos_y, rob_z_pos);
+        }
+        trd_feb_vol->AddNode(trd_rob_box, iRob + 1, trd_rob_y_position);  // position FEB in y
+      }
+
+    }  // IncludeGbtx
+
+    // put FEB box on module
+    TGeoTranslation* trd_febvolume_trans = new TGeoTranslation("", 0., 0., febvolume_position);
+    gGeoMan->GetVolume(name)->AddNode(trd_feb_vol, 1,
+                                      trd_febvolume_trans);  // put febvolume at correct z position wrt to the module
+  }
+
+  return module;
+}
+
+Int_t copy_nr(Int_t stationNr, Int_t copyNr, Int_t isRotated, Int_t planeNr, Int_t modinplaneNr)
+{
+  if (modinplaneNr > 128)
+    printf("Warning: too many modules in this layer %02d (max 128 according to "
+           "CbmTrdAddress)\n",
+           planeNr);
+
+  return (stationNr * 100000000  // 1 digit
+          + copyNr * 1000000     // 2 digit
+          + isRotated * 100000   // 1 digit
+          + planeNr * 1000       // 2 digit
+          + modinplaneNr * 1);   // 3 digit
+}
+
+void create_detector_layers(Int_t layerId)
+{
+  Int_t module_id               = 0;
+  Int_t layerType               = LayerType[layerId] / 10;  // this is also a station number
+  Int_t isRotated               = LayerType[layerId] % 10;  // is 1 for layers 2,4, ...
+  TGeoRotation* module_rotation = new TGeoRotation();
+
+  Int_t stationNr = layerType;
+
+  // rotation is now done in the for loop for each module individually
+  //  if ( isRotated == 1 ) {
+  //    module_rotation = new TGeoRotation();
+  //    module_rotation->RotateZ(90.);
+  //  } else {
+  //    module_rotation = new TGeoRotation();
+  //    module_rotation->RotateZ( 0.);
+  //  }
+
+  Int_t innerarray_size1 = LayerArraySize[layerType - 1][0];
+  Int_t innerarray_size2 = LayerArraySize[layerType - 1][1];
+  const Int_t* innerLayer;
+
+  Int_t outerarray_size1 = LayerArraySize[layerType - 1][2];
+  Int_t outerarray_size2 = LayerArraySize[layerType - 1][3];
+  const Int_t* outerLayer;
+
+  if (1 == layerType) {
+    innerLayer = (Int_t*) layer1i;
+    outerLayer = (Int_t*) layer1o;
+  }
+  else if (2 == layerType) {
+    innerLayer = (Int_t*) layer2i;
+    outerLayer = (Int_t*) layer2o;
+  }
+  else if (3 == layerType) {
+    innerLayer = (Int_t*) layer3i;
+    outerLayer = (Int_t*) layer3o;
+  }
+  else {
+    std::cout << "Type of layer not known" << std::endl;
+  }
+
+  // add layer keeping volume
+  TString layername = Form("layer%02d", PlaneId[layerId]);
+  TGeoVolume* layer = new TGeoVolumeAssembly(layername);
+
+  // compute layer copy number
+  Int_t i = LayerType[layerId] / 10 * 10000    // 1 digit  // fStation
+            + LayerType[layerId] % 10 * 1000   // 1 digit  // isRotated
+            + LayerNrInStation[layerId] * 100  // 1 digit  // fLayer
+            + PlaneId[layerId];
+  // 2 digits // fPlane   // layer type as leading digit in copy number of layer
+  gGeoMan->GetVolume(geoVersion)->AddNode(layer, i);
+
+  //  Int_t i = 100 + PlaneId[layerId];
+  //  gGeoMan->GetVolume(geoVersion)->AddNode(layer, 1);
+  //  cout << layername << endl;
+
+  Double_t ExplodeScale = 1.00;
+  if (DoExplode)  // if explosion, set scale
+    ExplodeScale = ExplodeFactor;
+
+  Int_t modId = 0;  // module id, only within this layer
+
+  Int_t copyNrIn[4] = {0, 0, 0, 0};  // copy number for each module type
+  for (Int_t type = 1; type <= 4; type++) {
+    for (Int_t j = (innerarray_size1 - 1); j >= 0; j--) {  // start from the bottom
+      for (Int_t i = 0; i < innerarray_size2; i++) {
+        module_id = *(innerLayer + (j * innerarray_size2 + i));
+        if (module_id / 100 == type) {
+          Float_t y = -(j - 4);
+          Float_t x = i - 1.5;
+
+          // displacement
+          Double_t dx = 0;
+          Double_t dy = 0;
+          Double_t dz = 0;
+
+          if (DisplaceRandom) {
+            dx = (r3.Rndm() - .5) * 2 * maxdx;  // max +- 0.1 cm shift
+            dy = (r3.Rndm() - .5) * 2 * maxdy;  // max +- 0.1 cm shift
+            dz = (r3.Rndm() - .5) * 2 * maxdz;  // max +- 1.0 cm shift
+          }
+
+          Double_t xPos = DetectorSizeX[0] * x * ExplodeScale + dx;
+          Double_t yPos = DetectorSizeY[0] * y * ExplodeScale + dy;
+          copyNrIn[type - 1]++;
+          modId++;
+
+          // statistics per layer and module type
+          ModuleStats[layerId][type - 1]++;
+
+          //          Int_t copy = copy_nr_modid(stationNr, layerNrInStation, copyNrIn[type - 1], PlaneId[layerId], modId);  // with modID
+          //          Int_t copy = copy_nr(stationNr, copyNrIn[type - 1], isRotated, PlaneId[layerId], modId);
+
+          // take care of FEB orientation - away from beam
+          Int_t copy      = 0;
+          module_rotation = new TGeoRotation();  // need to renew rotation to start from 0 degree angle
+          if (isRotated == 0)                    // layer 1,3 ...
+          {
+            copy = copy_nr(stationNr, copyNrIn[type - 1], module_id / 10 % 10, PlaneId[layerId], modId);
+            module_rotation->RotateZ(
+              (module_id / 10 % 10) * 90.);  // rotate module by   0 or 180 degrees, see layer[1-3][i,o] - vertical pads
+          }
+          else  // layer 2,4 ...
+          {
+            copy = copy_nr(stationNr, copyNrIn[type - 1], module_id % 10, PlaneId[layerId], modId);
+            module_rotation->RotateZ(
+              (module_id % 10) * 90.);  // rotate module by  90 or 270 degrees, see layer[1-3][i,o] - horizontal pads
+          }
+
+          // rotation
+          Double_t drotx = 0;
+          Double_t droty = 0;
+          Double_t drotz = 0;
+
+          if (RotateRandom) {
+            drotx = (r3.Rndm() - .5) * 2 * maxdrotx;
+            droty = (r3.Rndm() - .5) * 2 * maxdroty;
+            drotz = (r3.Rndm() - .5) * 2 * maxdrotz;
+
+            module_rotation->RotateZ(drotz);
+            module_rotation->RotateY(droty);
+            module_rotation->RotateX(drotx);
+          }
+
+          TGeoCombiTrans* module_placement =
+            new TGeoCombiTrans(xPos, yPos, LayerPosition[layerId] + LayerThickness / 2 + dz,
+                               module_rotation);  // shift by half layer thickness
+          //          gGeoMan->GetVolume(geoVersion)->AddNode(gModules[type - 1], copy, module_placement);
+          // add module to layer
+          gGeoMan->GetVolume(layername)->AddNode(gModules[type - 1], copy, module_placement);
+          //
+        }
+      }
+    }
+  }
+
+  Int_t copyNrOut[4] = {0, 0, 0, 0};  // copy number for each module type
+  for (Int_t type = 5; type <= 8; type++) {
+    for (Int_t j = (outerarray_size1 - 1); j >= 0; j--) {  // start from the bottom
+      for (Int_t i = 0; i < outerarray_size2; i++) {
+        module_id = *(outerLayer + (j * outerarray_size2 + i));
+        if (module_id / 100 == type) {
+          Float_t y = -(j - 4);
+          Float_t x = i - 5;
+
+          // displacement
+          Double_t dx = 0;
+          Double_t dy = 0;
+          Double_t dz = 0;
+
+          if (DisplaceRandom) {
+            dx = (r3.Rndm() - .5) * 2 * maxdx;  // max +- 0.1 cm shift
+            dy = (r3.Rndm() - .5) * 2 * maxdy;  // max +- 0.1 cm shift
+            dz = (r3.Rndm() - .5) * 2 * maxdz;  // max +- 1.0 cm shift
+          }
+
+          //          Double_t xPos = DetectorSizeX[1] * x * ExplodeScale + dx;
+          Double_t xPos = 0;
+
+          cout << "x before: " << x;
+          if (x > 0) {
+            x += -2 + 0.5;
+            xPos = 2 * DetectorSizeX[0] + DetectorSizeX[1] * x * ExplodeScale + dx;
+          }
+          else {
+            x += +2 - 0.5;
+            xPos = -2 * DetectorSizeX[0] + DetectorSizeX[1] * x * ExplodeScale + dx;
+          }
+          cout << " x after: " << x << endl;
+          Double_t yPos = DetectorSizeY[1] * y * ExplodeScale + dy;
+          copyNrOut[type - 5]++;
+          modId++;
+
+          // statistics per layer and module type
+          ModuleStats[layerId][type - 1]++;
+
+          //          Int_t copy = copy_nr_modid(stationNr, layerNrInStation, copyNrOut[type - 5],  PlaneId[layerId], modId);  // with modID
+          //          Int_t copy = copy_nr(stationNr, copyNrOut[type - 5], isRotated, PlaneId[layerId], modId);
+
+          // take care of FEB orientation - away from beam
+          Int_t copy      = 0;
+          module_rotation = new TGeoRotation();  // need to renew rotation to start from 0 degree angle
+          if (isRotated == 0)                    // layer 1,3 ...
+          {
+            copy = copy_nr(stationNr, copyNrOut[type - 5], module_id / 10 % 10, PlaneId[layerId], modId);
+            module_rotation->RotateZ(
+              (module_id / 10 % 10) * 90.);  // rotate module by   0 or 180 degrees, see layer[1-3][i,o] - vertical pads
+          }
+          else  // layer 2,4 ...
+          {
+            copy = copy_nr(stationNr, copyNrOut[type - 5], module_id % 10, PlaneId[layerId], modId);
+            module_rotation->RotateZ(
+              (module_id % 10) * 90.);  // rotate module by  90 or 270 degrees, see layer[1-3][i,o] - horizontal pads
+          }
+
+          // rotation
+          Double_t drotx = 0;
+          Double_t droty = 0;
+          Double_t drotz = 0;
+
+          if (RotateRandom) {
+            drotx = (r3.Rndm() - .5) * 2 * maxdrotx;
+            droty = (r3.Rndm() - .5) * 2 * maxdroty;
+            drotz = (r3.Rndm() - .5) * 2 * maxdrotz;
+
+            module_rotation->RotateZ(drotz);
+            module_rotation->RotateY(droty);
+            module_rotation->RotateX(drotx);
+          }
+
+          TGeoCombiTrans* module_placement =
+            new TGeoCombiTrans(xPos, yPos, LayerPosition[layerId] + LayerThickness / 2 + dz,
+                               module_rotation);  // shift by half layer thickness
+          //          gGeoMan->GetVolume(geoVersion)->AddNode(gModules[type - 1], copy, module_placement);
+          // add module to layer
+          gGeoMan->GetVolume(layername)->AddNode(gModules[type - 1], copy, module_placement);
+          //
+        }
+      }
+    }
+  }
+}
+
+
+void create_mag_field_vector()
+{
+  const TString cbmfield_01 = "cbm_field";
+  TGeoVolume* cbmfield_1    = new TGeoVolumeAssembly(cbmfield_01);
+
+  TGeoMedium* copperVolMed = gGeoMan->GetMedium(PadCopperVolumeMedium);  // define Volume Medium
+
+  TGeoRotation* rotx090 = new TGeoRotation("rotx090");
+  rotx090->RotateX(90.);  // rotate  90 deg around x-axis
+  TGeoRotation* rotx270 = new TGeoRotation("rotx270");
+  rotx270->RotateX(270.);  // rotate 270 deg around x-axis
+
+  Int_t tube_length = 500;
+  Int_t cone_length = 120;
+  Int_t cone_width  = 280;
+
+  // field tube
+  TGeoTube* trd_field          = new TGeoTube("", 0., 100 / 2., tube_length / 2.);
+  TGeoVolume* trdmod1_fieldvol = new TGeoVolume("tube", trd_field, copperVolMed);
+  trdmod1_fieldvol->SetLineColor(kRed);
+  trdmod1_fieldvol->SetTransparency(30);                                   // transparency for the TRD
+  TGeoTranslation* trd_field_trans = new TGeoTranslation("", 0., 0., 0.);  // tube position
+  cbmfield_1->AddNode(trdmod1_fieldvol, 1, trd_field_trans);
+
+  // field cone
+  TGeoCone* trd_cone          = new TGeoCone("", cone_length / 2., 0., cone_width / 2., 0., 0.);
+  TGeoVolume* trdmod1_conevol = new TGeoVolume("cone", trd_cone, copperVolMed);
+  trdmod1_conevol->SetLineColor(kRed);
+  trdmod1_conevol->SetTransparency(30);  // transparency for the TRD
+  TGeoTranslation* trd_cone_trans = new TGeoTranslation("", 0., 0., (tube_length + cone_length) / 2.);  // cone position
+  cbmfield_1->AddNode(trdmod1_conevol, 1, trd_cone_trans);
+
+  TGeoCombiTrans* field_combi01 = new TGeoCombiTrans(0., 0., 40., rotx270);  // point in +y direction
+  gGeoMan->GetVolume(geoVersion)->AddNode(cbmfield_1, 1, field_combi01);
+
+  //   TGeoCombiTrans* field_combi02 = new TGeoCombiTrans( 200., 0., 0., rotx090);   // point in -y direction
+  //   gGeoMan->GetVolume(geoVersion)->AddNode(cbmfield_1, 2, field_combi02);
+}
+
+
+void create_power_bars_vertical()
+{
+  const TString power_01 = "power_bars_trd1";
+  TGeoVolume* power_1    = new TGeoVolumeAssembly(power_01);
+
+  TGeoBBox* power1;
+  TGeoBBox* power2;
+
+  TGeoVolume* power1_vol;
+  TGeoVolume* power2_vol;
+
+  TGeoTranslation* power1_trans;
+  TGeoTranslation* power2_trans;
+
+  const Int_t kColor = kBlue;  // bus bar color
+
+  TGeoMedium* powerBusVolMed = gGeoMan->GetMedium(PowerBusVolumeMedium);
+
+  //  // powerbus - horizontal short
+  //  power1     = new TGeoBBox("power1", (DetectorSizeX[1] - DetectorSizeX[0] - powerbar_width)/2., powerbar_width /2., powerbar_thickness /2.);
+  //  power1_vol = new TGeoVolume("powerbus1", power1, powerBusVolMed);
+  //  power1_vol->SetLineColor(kColor);
+  //
+  //  // translations
+  //  power1_trans = new TGeoTranslation("",  1 * (DetectorSizeX[1] - DetectorSizeY[0]/2.),  1.5 * DetectorSizeY[1], 0.);
+  //  power_1->AddNode(power1_vol, 1, power1_trans);
+  //
+  //  power1_trans = new TGeoTranslation("", -1 * (DetectorSizeX[1] - DetectorSizeY[0]/2.), -1.5 * DetectorSizeY[1], 0.);
+  //  power_1->AddNode(power1_vol, 2, power1_trans);
+  //
+  //  // powerbus - horizontal long
+  //  power1     = new TGeoBBox("power1", (DetectorSizeX[0] - powerbar_width)/2., powerbar_width /2., powerbar_thickness /2.);
+  //  power1_vol = new TGeoVolume("powerbus1", power1, powerBusVolMed);
+  //  power1_vol->SetLineColor(kColor);
+  //
+  //  // translations
+  //  power1_trans = new TGeoTranslation("", -1 * DetectorSizeX[0],  1.5 * DetectorSizeY[1], 0.);
+  //  power_1->AddNode(power1_vol, 3, power1_trans);
+  //
+  //  power1_trans = new TGeoTranslation("",  1 * DetectorSizeX[0], -1.5 * DetectorSizeY[1], 0.);
+  //  power_1->AddNode(power1_vol, 4, power1_trans);
+
+
+  // powerbus - vertical long
+  power2 =
+    new TGeoBBox("power2", powerbar_width / 2., (9 * DetectorSizeY[0] + powerbar_width) / 2., powerbar_thickness / 2.);
+  power2_vol = new TGeoVolume("powerbus2", power2, powerBusVolMed);
+  power2_vol->SetLineColor(kColor);
+
+  // translations
+  power2_trans = new TGeoTranslation("", -(2.0 * DetectorSizeX[0] + 1.0 * DetectorSizeX[1]), 0., 0.);
+  power_1->AddNode(power2_vol, 1, power2_trans);
+  power2_trans = new TGeoTranslation("", 2.0 * DetectorSizeX[0] + 1.0 * DetectorSizeX[1], 0., 0.);
+  power_1->AddNode(power2_vol, 2, power2_trans);
+
+  power2_trans = new TGeoTranslation("", -1.0 * DetectorSizeX[0], 0., 0.);
+  power_1->AddNode(power2_vol, 3, power2_trans);
+  power2_trans = new TGeoTranslation("", 1.0 * DetectorSizeX[0], 0., 0.);
+  power_1->AddNode(power2_vol, 4, power2_trans);
+
+  //  // powerbus - vertical middle
+  //  power2     = new TGeoBBox("power2", powerbar_width /2., (3 * DetectorSizeY[1] + powerbar_width) /2., powerbar_thickness /2.);
+  //  power2_vol = new TGeoVolume("powerbus2", power2, powerBusVolMed);
+  //  power2_vol->SetLineColor(kColor);
+  //
+  //  // translations
+  //  power2_trans = new TGeoTranslation("", -1.5 * DetectorSizeX[0],  0., 0.);
+  //  power_1->AddNode(power2_vol, 7, power2_trans);
+  //  power2_trans = new TGeoTranslation("",  1.5 * DetectorSizeX[0],  0., 0.);
+  //  power_1->AddNode(power2_vol, 8, power2_trans);
+  //
+  //  // powerbus - vertical short 1
+  //  power2     = new TGeoBBox("power2", powerbar_width /2., 1 * DetectorSizeY[1] /2., powerbar_thickness /2.);
+  //  power2_vol = new TGeoVolume("powerbus2", power2, powerBusVolMed);
+  //  power2_vol->SetLineColor(kColor);
+  //  //  power2_vol->SetLineColor(kRed);
+  //
+  //  // translations
+  //  power2_trans = new TGeoTranslation("", -0.5 * DetectorSizeX[1],  (2.0 * DetectorSizeY[1] + powerbar_width/2.), 0.);
+  //  power_1->AddNode(power2_vol, 9, power2_trans);
+  //  power2_trans = new TGeoTranslation("",  0.5 * DetectorSizeX[1], -(2.0 * DetectorSizeY[1] + powerbar_width/2.), 0.);
+  //  power_1->AddNode(power2_vol,10, power2_trans);
+  //
+  //  // powerbus - vertical short 2
+  //  power2     = new TGeoBBox("power2", powerbar_width /2., (1 * DetectorSizeY[1] + powerbar_width) /2., powerbar_thickness /2.);
+  //  power2_vol = new TGeoVolume("powerbus2", power2, powerBusVolMed);
+  //  power2_vol->SetLineColor(kColor);
+  //
+  //  // translations
+  //  power2_trans = new TGeoTranslation("", -0.5 * DetectorSizeX[1], -2.0 * DetectorSizeY[1], 0.);
+  //  power_1->AddNode(power2_vol,11, power2_trans);
+  //  power2_trans = new TGeoTranslation("",  0.5 * DetectorSizeX[1],  2.0 * DetectorSizeY[1], 0.);
+  //  power_1->AddNode(power2_vol,12, power2_trans);
+  //
+  //  // powerbus - vertical short 3
+  //  power2     = new TGeoBBox("power2", powerbar_width /2., (2 * DetectorSizeY[0] + powerbar_width/2.) /2., powerbar_thickness /2.);
+  //  power2_vol = new TGeoVolume("powerbus2", power2, powerBusVolMed);
+  //  power2_vol->SetLineColor(kColor);
+  //
+  //  // translations
+  //  power2_trans = new TGeoTranslation("", -0.5 * DetectorSizeX[0],  (1.5 * DetectorSizeY[0] + powerbar_width/4.), 0.);
+  //  power_1->AddNode(power2_vol,11, power2_trans);
+  //  power2_trans = new TGeoTranslation("",  0.5 * DetectorSizeX[0], -(1.5 * DetectorSizeY[0] + powerbar_width/4.), 0.);
+  //  power_1->AddNode(power2_vol,12, power2_trans);
+
+  Int_t l;
+  for (l = 0; l < 4; l++)
+    if ((ShowLayer[l]) && (BusBarOrientation[l] == 1))  // if geometry contains layer l
+    {
+      TString layername = Form("layer%02d", l + 1);
+      TGeoTranslation* power_placement =
+        new TGeoTranslation(0, 0, LayerPosition[l] + LayerThickness / 2. + powerbar_position);
+      gGeoMan->GetVolume(layername)->AddNode(power_1, l, power_placement);
+    }
+}
+
+
+void create_power_bars_horizontal()
+{
+  const TString power_01 = "power_bars_trd1";
+  TGeoVolume* power_1    = new TGeoVolumeAssembly(power_01);
+
+  TGeoBBox* power1;
+  TGeoBBox* power2;
+
+  TGeoVolume* power1_vol;
+  TGeoVolume* power2_vol;
+
+  TGeoTranslation* power1_trans;
+  TGeoTranslation* power2_trans;
+
+  const Int_t kColor = kBlue;  // bus bar color
+
+  TGeoMedium* powerBusVolMed = gGeoMan->GetMedium(PowerBusVolumeMedium);
+
+  // powerbus - vertical short
+  power1     = new TGeoBBox("power1", powerbar_width / 2., (DetectorSizeY[1] - DetectorSizeY[0] - powerbar_width) / 2.,
+                        powerbar_thickness / 2.);
+  power1_vol = new TGeoVolume("powerbus1", power1, powerBusVolMed);
+  power1_vol->SetLineColor(kColor);
+
+  // translations
+  power1_trans = new TGeoTranslation("", 1.5 * DetectorSizeX[1], -1 * (DetectorSizeY[1] - DetectorSizeY[0] / 2.), 0.);
+  power_1->AddNode(power1_vol, 1, power1_trans);
+
+  power1_trans = new TGeoTranslation("", -1.5 * DetectorSizeX[1], 1 * (DetectorSizeY[1] - DetectorSizeY[0] / 2.), 0.);
+  power_1->AddNode(power1_vol, 2, power1_trans);
+
+  // powerbus - vertical long
+  power1 =
+    new TGeoBBox("power1", powerbar_width / 2., (DetectorSizeY[0] - powerbar_width) / 2., powerbar_thickness / 2.);
+  power1_vol = new TGeoVolume("powerbus1", power1, powerBusVolMed);
+  power1_vol->SetLineColor(kColor);
+
+  // translations
+  power1_trans = new TGeoTranslation("", 1.5 * DetectorSizeX[1], 1 * DetectorSizeY[0], 0.);
+  power_1->AddNode(power1_vol, 3, power1_trans);
+
+  power1_trans = new TGeoTranslation("", -1.5 * DetectorSizeX[1], -1 * DetectorSizeY[0], 0.);
+  power_1->AddNode(power1_vol, 4, power1_trans);
+
+
+  // powerbus - horizontal long
+  power2 =
+    new TGeoBBox("power2", (7 * DetectorSizeX[1] + powerbar_width) / 2., powerbar_width / 2., powerbar_thickness / 2.);
+  power2_vol = new TGeoVolume("powerbus2", power2, powerBusVolMed);
+  power2_vol->SetLineColor(kColor);
+
+  // translations
+  power2_trans = new TGeoTranslation("", 0., -2.5 * DetectorSizeY[1], 0.);
+  power_1->AddNode(power2_vol, 1, power2_trans);
+  power2_trans = new TGeoTranslation("", 0., 2.5 * DetectorSizeY[1], 0.);
+  power_1->AddNode(power2_vol, 2, power2_trans);
+
+  power2_trans = new TGeoTranslation("", 0., -1.5 * DetectorSizeY[1], 0.);
+  power_1->AddNode(power2_vol, 3, power2_trans);
+  power2_trans = new TGeoTranslation("", 0., 1.5 * DetectorSizeY[1], 0.);
+  power_1->AddNode(power2_vol, 4, power2_trans);
+
+  // powerbus - horizontal middle
+  power2 =
+    new TGeoBBox("power2", (3 * DetectorSizeX[1] + powerbar_width) / 2., powerbar_width / 2., powerbar_thickness / 2.);
+  power2_vol = new TGeoVolume("powerbus2", power2, powerBusVolMed);
+  power2_vol->SetLineColor(kColor);
+
+  // translations
+  power2_trans = new TGeoTranslation("", 0., -1.5 * DetectorSizeY[0], 0.);
+  power_1->AddNode(power2_vol, 7, power2_trans);
+  power2_trans = new TGeoTranslation("", 0., 1.5 * DetectorSizeY[0], 0.);
+  power_1->AddNode(power2_vol, 8, power2_trans);
+
+  // powerbus - horizontal short 1
+  power2     = new TGeoBBox("power2", 2 * DetectorSizeX[1] / 2., powerbar_width / 2., powerbar_thickness / 2.);
+  power2_vol = new TGeoVolume("powerbus2", power2, powerBusVolMed);
+  power2_vol->SetLineColor(kColor);
+  //  power2_vol->SetLineColor(kRed);
+
+  // translations
+  power2_trans = new TGeoTranslation("", (2.5 * DetectorSizeX[1] + powerbar_width / 2.), 0.5 * DetectorSizeY[1], 0.);
+  power_1->AddNode(power2_vol, 9, power2_trans);
+  power2_trans = new TGeoTranslation("", -(2.5 * DetectorSizeX[1] + powerbar_width / 2.), -0.5 * DetectorSizeY[1], 0.);
+  power_1->AddNode(power2_vol, 10, power2_trans);
+
+  // powerbus - horizontal short 2
+  power2 =
+    new TGeoBBox("power2", (2 * DetectorSizeX[1] + powerbar_width) / 2., powerbar_width / 2., powerbar_thickness / 2.);
+  power2_vol = new TGeoVolume("powerbus2", power2, powerBusVolMed);
+  power2_vol->SetLineColor(kColor);
+
+  // translations
+  power2_trans = new TGeoTranslation("", -2.5 * DetectorSizeX[1], 0.5 * DetectorSizeY[1], 0.);
+  power_1->AddNode(power2_vol, 11, power2_trans);
+  power2_trans = new TGeoTranslation("", 2.5 * DetectorSizeX[1], -0.5 * DetectorSizeY[1], 0.);
+  power_1->AddNode(power2_vol, 12, power2_trans);
+
+  // powerbus - horizontal short 3
+  power2     = new TGeoBBox("power2", (2 * DetectorSizeX[0] + powerbar_width / 2.) / 2., powerbar_width / 2.,
+                        powerbar_thickness / 2.);
+  power2_vol = new TGeoVolume("powerbus2", power2, powerBusVolMed);
+  power2_vol->SetLineColor(kColor);
+
+  // translations
+  power2_trans = new TGeoTranslation("", (1.5 * DetectorSizeX[0] + powerbar_width / 4.), 0.5 * DetectorSizeY[0], 0.);
+  power_1->AddNode(power2_vol, 11, power2_trans);
+  power2_trans = new TGeoTranslation("", -(1.5 * DetectorSizeX[0] + powerbar_width / 4.), -0.5 * DetectorSizeY[0], 0.);
+  power_1->AddNode(power2_vol, 12, power2_trans);
+
+  Int_t l;
+  for (l = 0; l < 4; l++)
+    if ((ShowLayer[l]) && (BusBarOrientation[l] == 0))  // if geometry contains layer l
+    {
+      TString layername = Form("layer%02d", l + 1);
+      TGeoTranslation* power_placement =
+        new TGeoTranslation(0, 0, LayerPosition[l] + LayerThickness / 2. + powerbar_position);
+      gGeoMan->GetVolume(layername)->AddNode(power_1, l, power_placement);
+    }
+}
+
+
+void create_xtru_supports()
+{
+  const TString trd_01 = "support_trd1";
+  TGeoVolume* trd_1    = new TGeoVolumeAssembly(trd_01);
+
+  const TString trd_02 = "support_trd2";
+  TGeoVolume* trd_2    = new TGeoVolumeAssembly(trd_02);
+
+  const TString trd_03 = "support_trd3";
+  TGeoVolume* trd_3    = new TGeoVolumeAssembly(trd_03);
+
+  //  const TString trdSupport = "supportframe";
+  //  TGeoVolume* trdsupport = new TGeoVolumeAssembly(trdSupport);
+  //
+  //  trdsupport->AddNode(trd_1, 1);
+  //  trdsupport->AddNode(trd_2, 2);
+  //  trdsupport->AddNode(trd_3, 3);
+
+  TGeoMedium* aluminiumVolMed = gGeoMan->GetMedium(AluminiumVolumeMedium);  // define Volume Medium
+
+  const Double_t x[12] = {-15, -15, -1, -1, -15, -15, 15, 15, 1, 1, 15, 15};  // IPB 400
+  const Double_t y[12] = {-20, -18, -18, 18,  18,  20,
+                          20,  18,  18,  -18, -18, -20};  // 30 x 40 cm in size, 2 cm wall thickness
+  const Double_t Hwid  = -2 * x[0];                       // 30
+  const Double_t Hhei  = -2 * y[0];                       // 40
+
+  Double_t AperX[3] = {450., 550., 600.};  // inner aperture in X of support structure for stations 1,2,3
+  Double_t AperY[3] = {350., 450., 500.};  // inner aperture in Y of support structure for stations 1,2,3
+  Double_t PilPosX;
+  Double_t BarPosY;
+
+  const Double_t BeamHeight = 570;  // beamline is at 5.7m above floor
+
+  Double_t PilPosZ[6];  // PilPosZ
+                        //  PilPosZ[0] = LayerPosition[0] + LayerThickness/2.;
+                        //  PilPosZ[1] = LayerPosition[3] + LayerThickness/2.;
+                        //  PilPosZ[2] = LayerPosition[4] + LayerThickness/2.;
+                        //  PilPosZ[3] = LayerPosition[7] + LayerThickness/2.;
+                        //  PilPosZ[4] = LayerPosition[8] + LayerThickness/2.;
+                        //  PilPosZ[5] = LayerPosition[9] + LayerThickness/2.;
+
+  PilPosZ[0] = LayerPosition[0] + 15;
+  PilPosZ[1] = LayerPosition[3] - 15 + LayerThickness;
+  PilPosZ[2] = LayerPosition[4] + 15;
+  PilPosZ[3] = LayerPosition[7] - 15 + LayerThickness;
+  PilPosZ[4] = LayerPosition[8] + 15;
+  PilPosZ[5] = LayerPosition[9] - 15 + LayerThickness;
+
+  //  cout << "PilPosZ[0]: " << PilPosZ[0] << endl;
+  //  cout << "PilPosZ[1]: " << PilPosZ[1] << endl;
+
+  TGeoRotation* rotx090 = new TGeoRotation("rotx090");
+  rotx090->RotateX(90.);  // rotate  90 deg around x-axis
+  TGeoRotation* roty090 = new TGeoRotation("roty090");
+  roty090->RotateY(90.);  // rotate  90 deg around y-axis
+  TGeoRotation* rotz090 = new TGeoRotation("rotz090");
+  rotz090->RotateZ(90.);  // rotate  90 deg around y-axis
+  TGeoRotation* roty270 = new TGeoRotation("roty270");
+  roty270->RotateY(270.);  // rotate 270 deg around y-axis
+
+  TGeoRotation* rotzx01 = new TGeoRotation("rotzx01");
+  rotzx01->RotateZ(90.);  // rotate  90 deg around z-axis
+  rotzx01->RotateX(90.);  // rotate  90 deg around x-axis
+
+  //  TGeoRotation  *rotxz01 = new TGeoRotation("rotxz01");
+  //  rotxz01->RotateX(  90.); // rotate  90 deg around x-axis
+  //  rotxz01->RotateZ(  90.); // rotate  90 deg around z-axis
+
+  Double_t ang1 = atan(3. / 4.) * 180. / acos(-1.);
+  //  cout << "DEDE " << ang1 << endl;
+  //  Double_t sin1 = acos(-1.);
+  //  cout << "DEDE " << sin1 << endl;
+  TGeoRotation* rotx080 = new TGeoRotation("rotx080");
+  rotx080->RotateX(90. - ang1);  // rotate  80 deg around x-axis
+  TGeoRotation* rotx100 = new TGeoRotation("rotx100");
+  rotx100->RotateX(90. + ang1);  // rotate 100 deg around x-axis
+
+  TGeoRotation* rotxy01 = new TGeoRotation("rotxy01");
+  rotxy01->RotateX(90.);    // rotate  90 deg around x-axis
+  rotxy01->RotateZ(-ang1);  // rotate  ang1   around rotated y-axis
+
+  TGeoRotation* rotxy02 = new TGeoRotation("rotxy02");
+  rotxy02->RotateX(90.);   // rotate  90 deg around x-axis
+  rotxy02->RotateZ(ang1);  // rotate  ang1   around rotated y-axis
+
+
+  //-------------------
+  // vertical pillars (Y)
+  //-------------------
+
+  // station 1
+  if (ShowLayer[0])  // if geometry contains layer 1 (1st layer of station 1)
+  {
+    TGeoXtru* trd_H_vert1 = new TGeoXtru(2);  // define Xtrusion of 2 planes
+    trd_H_vert1->DefinePolygon(12, x, y);
+    trd_H_vert1->DefineSection(0, -(AperY[0] + Hhei), 0, 0, 1.0);
+    trd_H_vert1->DefineSection(1, BeamHeight, 0, 0, 1.0);
+    TGeoVolume* trd_H_vert_vol1 = new TGeoVolume("trd_H_y_01", trd_H_vert1, aluminiumVolMed);
+    trd_H_vert_vol1->SetLineColor(kYellow);
+    PilPosX = AperX[0];
+
+    TGeoCombiTrans* trd_H_vert_combi01 = new TGeoCombiTrans((PilPosX + Hhei / 2.), 0., PilPosZ[0], rotzx01);
+    trd_1->AddNode(trd_H_vert_vol1, 11, trd_H_vert_combi01);
+    TGeoCombiTrans* trd_H_vert_combi02 = new TGeoCombiTrans(-(PilPosX + Hhei / 2.), 0., PilPosZ[0], rotzx01);
+    trd_1->AddNode(trd_H_vert_vol1, 12, trd_H_vert_combi02);
+    TGeoCombiTrans* trd_H_vert_combi03 = new TGeoCombiTrans((PilPosX + Hhei / 2.), 0., PilPosZ[1], rotzx01);
+    trd_1->AddNode(trd_H_vert_vol1, 13, trd_H_vert_combi03);
+    TGeoCombiTrans* trd_H_vert_combi04 = new TGeoCombiTrans(-(PilPosX + Hhei / 2.), 0., PilPosZ[1], rotzx01);
+    trd_1->AddNode(trd_H_vert_vol1, 14, trd_H_vert_combi04);
+  }
+
+  // station 2
+  if (ShowLayer[4])  // if geometry contains layer 5 (1st layer of station 2)
+  {
+    TGeoXtru* trd_H_vert1 = new TGeoXtru(2);  // define Xtrusion of 2 planes
+    trd_H_vert1->DefinePolygon(12, x, y);
+    trd_H_vert1->DefineSection(0, -(AperY[1] + Hhei), 0, 0, 1.0);
+    trd_H_vert1->DefineSection(1, BeamHeight, 0, 0, 1.0);
+    TGeoVolume* trd_H_vert_vol1 = new TGeoVolume("trd_H_y_02", trd_H_vert1, aluminiumVolMed);
+    trd_H_vert_vol1->SetLineColor(kYellow);
+    PilPosX = AperX[1];
+
+    TGeoCombiTrans* trd_H_vert_combi01 = new TGeoCombiTrans((PilPosX + Hhei / 2.), 0., PilPosZ[2], rotzx01);
+    trd_2->AddNode(trd_H_vert_vol1, 21, trd_H_vert_combi01);
+    TGeoCombiTrans* trd_H_vert_combi02 = new TGeoCombiTrans(-(PilPosX + Hhei / 2.), 0., PilPosZ[2], rotzx01);
+    trd_2->AddNode(trd_H_vert_vol1, 22, trd_H_vert_combi02);
+    TGeoCombiTrans* trd_H_vert_combi03 = new TGeoCombiTrans((PilPosX + Hhei / 2.), 0., PilPosZ[3], rotzx01);
+    trd_2->AddNode(trd_H_vert_vol1, 23, trd_H_vert_combi03);
+    TGeoCombiTrans* trd_H_vert_combi04 = new TGeoCombiTrans(-(PilPosX + Hhei / 2.), 0., PilPosZ[3], rotzx01);
+    trd_2->AddNode(trd_H_vert_vol1, 24, trd_H_vert_combi04);
+  }
+
+  // station 3
+  if (ShowLayer[8])  // if geometry contains layer 9 (1st layer of station 3)
+  {
+    TGeoXtru* trd_H_vert1 = new TGeoXtru(2);  // define Xtrusion of 2 planes
+    trd_H_vert1->DefinePolygon(12, x, y);
+    trd_H_vert1->DefineSection(0, -(AperY[2] + Hhei), 0, 0, 1.0);
+    trd_H_vert1->DefineSection(1, BeamHeight, 0, 0, 1.0);
+    TGeoVolume* trd_H_vert_vol1 = new TGeoVolume("trd_H_y_03", trd_H_vert1, aluminiumVolMed);
+    trd_H_vert_vol1->SetLineColor(kYellow);
+    PilPosX = AperX[2];
+
+    TGeoCombiTrans* trd_H_vert_combi01 = new TGeoCombiTrans((PilPosX + Hhei / 2.), 0., PilPosZ[4], rotzx01);
+    trd_3->AddNode(trd_H_vert_vol1, 31, trd_H_vert_combi01);
+    TGeoCombiTrans* trd_H_vert_combi02 = new TGeoCombiTrans(-(PilPosX + Hhei / 2.), 0., PilPosZ[4], rotzx01);
+    trd_3->AddNode(trd_H_vert_vol1, 32, trd_H_vert_combi02);
+    TGeoCombiTrans* trd_H_vert_combi03 = new TGeoCombiTrans((PilPosX + Hhei / 2.), 0., PilPosZ[5], rotzx01);
+    trd_3->AddNode(trd_H_vert_vol1, 33, trd_H_vert_combi03);
+    TGeoCombiTrans* trd_H_vert_combi04 = new TGeoCombiTrans(-(PilPosX + Hhei / 2.), 0., PilPosZ[5], rotzx01);
+    trd_3->AddNode(trd_H_vert_vol1, 34, trd_H_vert_combi04);
+  }
+
+
+  //-------------------
+  // horizontal supports (X)
+  //-------------------
+
+  // station 1
+  if (ShowLayer[0])  // if geometry contains layer 1 (1st layer of station 1)
+  {
+    TGeoXtru* trd_H_hori1 = new TGeoXtru(2);  // define Xtrusion of 2 planes
+    trd_H_hori1->DefinePolygon(12, x, y);
+    trd_H_hori1->DefineSection(0, -AperX[0], 0, 0, 1.0);
+    trd_H_hori1->DefineSection(1, AperX[0], 0, 0, 1.0);
+    TGeoVolume* trd_H_hori_vol1 = new TGeoVolume("trd_H_x_01", trd_H_hori1, aluminiumVolMed);
+    trd_H_hori_vol1->SetLineColor(kRed);
+    BarPosY = AperY[0];
+
+    TGeoCombiTrans* trd_H_hori_combi01 = new TGeoCombiTrans(0., (BarPosY + Hhei / 2.), PilPosZ[0], roty090);
+    trd_1->AddNode(trd_H_hori_vol1, 11, trd_H_hori_combi01);
+    TGeoCombiTrans* trd_H_hori_combi02 = new TGeoCombiTrans(0., -(BarPosY + Hhei / 2.), PilPosZ[0], roty090);
+    trd_1->AddNode(trd_H_hori_vol1, 12, trd_H_hori_combi02);
+    TGeoCombiTrans* trd_H_hori_combi03 = new TGeoCombiTrans(0., (BarPosY + Hhei / 2.), PilPosZ[1], roty090);
+    trd_1->AddNode(trd_H_hori_vol1, 13, trd_H_hori_combi03);
+    TGeoCombiTrans* trd_H_hori_combi04 = new TGeoCombiTrans(0., -(BarPosY + Hhei / 2.), PilPosZ[1], roty090);
+    trd_1->AddNode(trd_H_hori_vol1, 14, trd_H_hori_combi04);
+  }
+
+  // station 2
+  if (ShowLayer[4])  // if geometry contains layer 5 (1st layer of station 2)
+  {
+    TGeoXtru* trd_H_hori1 = new TGeoXtru(2);  // define Xtrusion of 2 planes
+    trd_H_hori1->DefinePolygon(12, x, y);
+    trd_H_hori1->DefineSection(0, -AperX[1], 0, 0, 1.0);
+    trd_H_hori1->DefineSection(1, AperX[1], 0, 0, 1.0);
+    TGeoVolume* trd_H_hori_vol1 = new TGeoVolume("trd_H_x_02", trd_H_hori1, aluminiumVolMed);
+    trd_H_hori_vol1->SetLineColor(kRed);
+    BarPosY = AperY[1];
+
+    TGeoCombiTrans* trd_H_hori_combi01 = new TGeoCombiTrans(0., (BarPosY + Hhei / 2.), PilPosZ[2], roty090);
+    trd_2->AddNode(trd_H_hori_vol1, 21, trd_H_hori_combi01);
+    TGeoCombiTrans* trd_H_hori_combi02 = new TGeoCombiTrans(0., -(BarPosY + Hhei / 2.), PilPosZ[2], roty090);
+    trd_2->AddNode(trd_H_hori_vol1, 22, trd_H_hori_combi02);
+    TGeoCombiTrans* trd_H_hori_combi03 = new TGeoCombiTrans(0., (BarPosY + Hhei / 2.), PilPosZ[3], roty090);
+    trd_2->AddNode(trd_H_hori_vol1, 23, trd_H_hori_combi03);
+    TGeoCombiTrans* trd_H_hori_combi04 = new TGeoCombiTrans(0., -(BarPosY + Hhei / 2.), PilPosZ[3], roty090);
+    trd_2->AddNode(trd_H_hori_vol1, 24, trd_H_hori_combi04);
+  }
+
+  // station 3
+  if (ShowLayer[8])  // if geometry contains layer 9 (1st layer of station 3)
+  {
+    TGeoXtru* trd_H_hori1 = new TGeoXtru(2);  // define Xtrusion of 2 planes
+    trd_H_hori1->DefinePolygon(12, x, y);
+    trd_H_hori1->DefineSection(0, -AperX[2], 0, 0, 1.0);
+    trd_H_hori1->DefineSection(1, AperX[2], 0, 0, 1.0);
+    TGeoVolume* trd_H_hori_vol1 = new TGeoVolume("trd_H_x_03", trd_H_hori1, aluminiumVolMed);
+    trd_H_hori_vol1->SetLineColor(kRed);
+    BarPosY = AperY[2];
+
+    TGeoCombiTrans* trd_H_hori_combi01 = new TGeoCombiTrans(0., (BarPosY + Hhei / 2.), PilPosZ[4], roty090);
+    trd_3->AddNode(trd_H_hori_vol1, 31, trd_H_hori_combi01);
+    TGeoCombiTrans* trd_H_hori_combi02 = new TGeoCombiTrans(0., -(BarPosY + Hhei / 2.), PilPosZ[4], roty090);
+    trd_3->AddNode(trd_H_hori_vol1, 32, trd_H_hori_combi02);
+    TGeoCombiTrans* trd_H_hori_combi03 = new TGeoCombiTrans(0., (BarPosY + Hhei / 2.), PilPosZ[5], roty090);
+    trd_3->AddNode(trd_H_hori_vol1, 33, trd_H_hori_combi03);
+    TGeoCombiTrans* trd_H_hori_combi04 = new TGeoCombiTrans(0., -(BarPosY + Hhei / 2.), PilPosZ[5], roty090);
+    trd_3->AddNode(trd_H_hori_vol1, 34, trd_H_hori_combi04);
+  }
+
+
+  //-------------------
+  // horizontal supports (Z)
+  //-------------------
+
+  // station 1
+  if (ShowLayer[0])  // if geometry contains layer 1 (1st layer of station 1)
+  {
+    TGeoXtru* trd_H_slope1 = new TGeoXtru(2);  // define Xtrusion of 2 planes
+    trd_H_slope1->DefinePolygon(12, x, y);
+    trd_H_slope1->DefineSection(0, -(PilPosZ[1] - PilPosZ[0] - Hwid) / 2., 0, 0, 1.0);
+    trd_H_slope1->DefineSection(1, +(PilPosZ[1] - PilPosZ[0] - Hwid) / 2., 0, 0, 1.0);
+    TGeoVolume* trd_H_slope_vol1 = new TGeoVolume("trd_H_z_01", trd_H_slope1, aluminiumVolMed);
+    trd_H_slope_vol1->SetLineColor(kGreen);
+    PilPosX = AperX[0];
+    BarPosY = AperY[0];
+
+    TGeoCombiTrans* trd_H_slope_combi01 =
+      new TGeoCombiTrans((PilPosX + Hhei / 2.), (BarPosY + Hhei - Hwid / 2.), (PilPosZ[0] + PilPosZ[1]) / 2., rotz090);
+    trd_1->AddNode(trd_H_slope_vol1, 11, trd_H_slope_combi01);
+    TGeoCombiTrans* trd_H_slope_combi02 =
+      new TGeoCombiTrans(-(PilPosX + Hhei / 2.), (BarPosY + Hhei - Hwid / 2.), (PilPosZ[0] + PilPosZ[1]) / 2., rotz090);
+    trd_1->AddNode(trd_H_slope_vol1, 12, trd_H_slope_combi02);
+    TGeoCombiTrans* trd_H_slope_combi03 =
+      new TGeoCombiTrans((PilPosX + Hhei / 2.), -(BarPosY + Hhei - Hwid / 2.), (PilPosZ[0] + PilPosZ[1]) / 2., rotz090);
+    trd_1->AddNode(trd_H_slope_vol1, 13, trd_H_slope_combi03);
+    TGeoCombiTrans* trd_H_slope_combi04 = new TGeoCombiTrans(-(PilPosX + Hhei / 2.), -(BarPosY + Hhei - Hwid / 2.),
+                                                             (PilPosZ[0] + PilPosZ[1]) / 2., rotz090);
+    trd_1->AddNode(trd_H_slope_vol1, 14, trd_H_slope_combi04);
+  }
+
+  // station 2
+  if (ShowLayer[4])  // if geometry contains layer 5 (1st layer of station 2)
+  {
+    TGeoXtru* trd_H_slope1 = new TGeoXtru(2);  // define Xtrusion of 2 planes
+    trd_H_slope1->DefinePolygon(12, x, y);
+    trd_H_slope1->DefineSection(0, -(PilPosZ[3] - PilPosZ[2] - Hwid) / 2., 0, 0, 1.0);
+    trd_H_slope1->DefineSection(1, +(PilPosZ[3] - PilPosZ[2] - Hwid) / 2., 0, 0, 1.0);
+    TGeoVolume* trd_H_slope_vol1 = new TGeoVolume("trd_H_z_02", trd_H_slope1, aluminiumVolMed);
+    trd_H_slope_vol1->SetLineColor(kGreen);
+    PilPosX = AperX[1];
+    BarPosY = AperY[1];
+
+    TGeoCombiTrans* trd_H_slope_combi01 =
+      new TGeoCombiTrans((PilPosX + Hhei / 2.), (BarPosY + Hhei - Hwid / 2.), (PilPosZ[2] + PilPosZ[3]) / 2., rotz090);
+    trd_2->AddNode(trd_H_slope_vol1, 21, trd_H_slope_combi01);
+    TGeoCombiTrans* trd_H_slope_combi02 =
+      new TGeoCombiTrans(-(PilPosX + Hhei / 2.), (BarPosY + Hhei - Hwid / 2.), (PilPosZ[2] + PilPosZ[3]) / 2., rotz090);
+    trd_2->AddNode(trd_H_slope_vol1, 22, trd_H_slope_combi02);
+    TGeoCombiTrans* trd_H_slope_combi03 =
+      new TGeoCombiTrans((PilPosX + Hhei / 2.), -(BarPosY + Hhei - Hwid / 2.), (PilPosZ[2] + PilPosZ[3]) / 2., rotz090);
+    trd_2->AddNode(trd_H_slope_vol1, 23, trd_H_slope_combi03);
+    TGeoCombiTrans* trd_H_slope_combi04 = new TGeoCombiTrans(-(PilPosX + Hhei / 2.), -(BarPosY + Hhei - Hwid / 2.),
+                                                             (PilPosZ[2] + PilPosZ[3]) / 2., rotz090);
+    trd_2->AddNode(trd_H_slope_vol1, 24, trd_H_slope_combi04);
+  }
+
+  // station 3
+  if (ShowLayer[8])  // if geometry contains layer 9 (1st layer of station 3)
+  {
+    TGeoXtru* trd_H_slope1 = new TGeoXtru(2);  // define Xtrusion of 2 planes
+    trd_H_slope1->DefinePolygon(12, x, y);
+    trd_H_slope1->DefineSection(0, -(PilPosZ[5] - PilPosZ[4] - Hwid) / 2., 0, 0, 1.0);
+    trd_H_slope1->DefineSection(1, +(PilPosZ[5] - PilPosZ[4] - Hwid) / 2., 0, 0, 1.0);
+    TGeoVolume* trd_H_slope_vol1 = new TGeoVolume("trd_H_z_03", trd_H_slope1, aluminiumVolMed);
+    trd_H_slope_vol1->SetLineColor(kGreen);
+    PilPosX = AperX[2];
+    BarPosY = AperY[2];
+
+    TGeoCombiTrans* trd_H_slope_combi01 =
+      new TGeoCombiTrans((PilPosX + Hhei / 2.), (BarPosY + Hhei - Hwid / 2.), (PilPosZ[4] + PilPosZ[5]) / 2., rotz090);
+    trd_3->AddNode(trd_H_slope_vol1, 31, trd_H_slope_combi01);
+    TGeoCombiTrans* trd_H_slope_combi02 =
+      new TGeoCombiTrans(-(PilPosX + Hhei / 2.), (BarPosY + Hhei - Hwid / 2.), (PilPosZ[4] + PilPosZ[5]) / 2., rotz090);
+    trd_3->AddNode(trd_H_slope_vol1, 32, trd_H_slope_combi02);
+    TGeoCombiTrans* trd_H_slope_combi03 =
+      new TGeoCombiTrans((PilPosX + Hhei / 2.), -(BarPosY + Hhei - Hwid / 2.), (PilPosZ[4] + PilPosZ[5]) / 2., rotz090);
+    trd_3->AddNode(trd_H_slope_vol1, 33, trd_H_slope_combi03);
+    TGeoCombiTrans* trd_H_slope_combi04 = new TGeoCombiTrans(-(PilPosX + Hhei / 2.), -(BarPosY + Hhei - Hwid / 2.),
+                                                             (PilPosZ[4] + PilPosZ[5]) / 2., rotz090);
+    trd_3->AddNode(trd_H_slope_vol1, 34, trd_H_slope_combi04);
+  }
+
+  if (IncludeLabels) {
+
+    Int_t text_height    = 40;
+    Int_t text_thickness = 8;
+
+    TGeoTranslation* tr200 =
+      new TGeoTranslation(0., (AperY[0] + Hhei + text_height / 2.), PilPosZ[0] - 15 + text_thickness / 2.);
+    TGeoTranslation* tr201 =
+      new TGeoTranslation(0., (AperY[1] + Hhei + text_height / 2.), PilPosZ[2] - 15 + text_thickness / 2.);
+    TGeoTranslation* tr202 =
+      new TGeoTranslation(0., (AperY[2] + Hhei + text_height / 2.), PilPosZ[4] - 15 + text_thickness / 2.);
+
+    TGeoCombiTrans* tr203 =
+      new TGeoCombiTrans(-(AperX[0] + Hhei + text_thickness / 2.), (AperY[0] + Hhei - Hwid - text_height / 2.),
+                         (PilPosZ[0] + PilPosZ[1]) / 2., roty090);
+    TGeoCombiTrans* tr204 =
+      new TGeoCombiTrans(-(AperX[1] + Hhei + text_thickness / 2.), (AperY[1] + Hhei - Hwid - text_height / 2.),
+                         (PilPosZ[2] + PilPosZ[3]) / 2., roty090);
+    TGeoCombiTrans* tr205 =
+      new TGeoCombiTrans(-(AperX[2] + Hhei + text_thickness / 2.), (AperY[2] + Hhei - Hwid - text_height / 2.),
+                         (PilPosZ[4] + PilPosZ[5]) / 2., roty090);
+
+    TGeoCombiTrans* tr206 =
+      new TGeoCombiTrans((AperX[0] + Hhei + text_thickness / 2.), (AperY[0] + Hhei - Hwid - text_height / 2.),
+                         (PilPosZ[0] + PilPosZ[1]) / 2., roty270);
+    TGeoCombiTrans* tr207 =
+      new TGeoCombiTrans((AperX[1] + Hhei + text_thickness / 2.), (AperY[1] + Hhei - Hwid - text_height / 2.),
+                         (PilPosZ[2] + PilPosZ[3]) / 2., roty270);
+    TGeoCombiTrans* tr208 =
+      new TGeoCombiTrans((AperX[2] + Hhei + text_thickness / 2.), (AperY[2] + Hhei - Hwid - text_height / 2.),
+                         (PilPosZ[4] + PilPosZ[5]) / 2., roty270);
+
+    TGeoVolume* trdbox1 = new TGeoVolumeAssembly("trdbox1");  // volume for TRD text (108, 40, 8)
+    TGeoVolume* trdbox2 = new TGeoVolumeAssembly("trdbox2");  // volume for TRD text (108, 40, 8)
+    TGeoVolume* trdbox3 = new TGeoVolumeAssembly("trdbox3");  // volume for TRD text (108, 40, 8)
+    add_trd_labels(trdbox1, trdbox2, trdbox3);
+
+    // final placement
+    if (ShowLayer[0])  // if geometry contains layer 1 (1st layer of station 1)
+    {
+      //    trd_1->AddNode(trdbox1, 1, tr200);
+      trd_1->AddNode(trdbox1, 4, tr203);
+      trd_1->AddNode(trdbox1, 7, tr206);
+    }
+    if (ShowLayer[4])  // if geometry contains layer 5 (1st layer of station 2)
+    {
+      //    trd_2->AddNode(trdbox2, 2, tr201);
+      trd_2->AddNode(trdbox2, 5, tr204);
+      trd_2->AddNode(trdbox2, 8, tr207);
+    }
+    if (ShowLayer[8])  // if geometry contains layer 9 (1st layer of station 3)
+    {
+      //    trd_3->AddNode(trdbox3, 3, tr202);
+      trd_3->AddNode(trdbox3, 6, tr205);
+      trd_3->AddNode(trdbox3, 9, tr208);
+    }
+  }
+
+  //  gGeoMan->GetVolume(geoVersion)->AddNode(trdsupport,1);
+
+  if (ShowLayer[0])  // if geometry contains layer 1 (1st layer of station 1)
+    gGeoMan->GetVolume(geoVersion)->AddNode(trd_1, 1);
+  if (ShowLayer[4])  // if geometry contains layer 5 (1st layer of station 2)
+    gGeoMan->GetVolume(geoVersion)->AddNode(trd_2, 2);
+  if (ShowLayer[8])  // if geometry contains layer 9 (1st layer of station 3)
+    gGeoMan->GetVolume(geoVersion)->AddNode(trd_3, 3);
+}
+
+
+void add_trd_labels(TGeoVolume* trdbox1, TGeoVolume* trdbox2, TGeoVolume* trdbox3)
+{
+  // write TRD (the 3 characters) in a simple geometry
+  TGeoMedium* textVolMed = gGeoMan->GetMedium(TextVolumeMedium);
+
+  Int_t Tcolor = kBlue;  // kRed;
+  Int_t Rcolor = kBlue;  // kRed;  // kRed;
+  Int_t Dcolor = kBlue;  // kRed;  // kYellow;
+  Int_t Icolor = kBlue;  // kRed;
+
+  // define transformations for letter pieces
+  // T
+  TGeoTranslation* tr01 = new TGeoTranslation(0., -4., 0.);
+  TGeoTranslation* tr02 = new TGeoTranslation(0., 16., 0.);
+
+  // R
+  TGeoTranslation* tr11 = new TGeoTranslation(10, 0., 0.);
+  TGeoTranslation* tr12 = new TGeoTranslation(2, 0., 0.);
+  TGeoTranslation* tr13 = new TGeoTranslation(2, 16., 0.);
+  TGeoTranslation* tr14 = new TGeoTranslation(-2, 8., 0.);
+  TGeoTranslation* tr15 = new TGeoTranslation(-6, 0., 0.);
+
+  // D
+  TGeoTranslation* tr21 = new TGeoTranslation(12., 0., 0.);
+  TGeoTranslation* tr22 = new TGeoTranslation(6., 16., 0.);
+  TGeoTranslation* tr23 = new TGeoTranslation(6., -16., 0.);
+  TGeoTranslation* tr24 = new TGeoTranslation(4., 0., 0.);
+
+  // I
+  TGeoTranslation* tr31 = new TGeoTranslation(0., 0., 0.);
+  TGeoTranslation* tr32 = new TGeoTranslation(0., 16., 0.);
+  TGeoTranslation* tr33 = new TGeoTranslation(0., -16., 0.);
+
+  // make letter T
+  //   TGeoVolume *T = geom->MakeBox("T", Vacuum, 25., 25., 5.);
+  //   T->SetVisibility(kFALSE);
+  TGeoVolume* T = new TGeoVolumeAssembly("Tbox");  // volume for T
+
+  TGeoBBox* Tbar1b  = new TGeoBBox("trd_Tbar1b", 4., 16., 4.);  // | vertical
+  TGeoVolume* Tbar1 = new TGeoVolume("Tbar1", Tbar1b, textVolMed);
+  Tbar1->SetLineColor(Tcolor);
+  T->AddNode(Tbar1, 1, tr01);
+  TGeoBBox* Tbar2b  = new TGeoBBox("trd_Tbar2b", 16, 4., 4.);  // - top
+  TGeoVolume* Tbar2 = new TGeoVolume("Tbar2", Tbar2b, textVolMed);
+  Tbar2->SetLineColor(Tcolor);
+  T->AddNode(Tbar2, 1, tr02);
+
+  // make letter R
+  //   TGeoVolume *R = geom->MakeBox("R", Vacuum, 25., 25., 5.);
+  //   R->SetVisibility(kFALSE);
+  TGeoVolume* R = new TGeoVolumeAssembly("Rbox");  // volume for R
+
+  TGeoBBox* Rbar1b  = new TGeoBBox("trd_Rbar1b", 4., 20, 4.);
+  TGeoVolume* Rbar1 = new TGeoVolume("Rbar1", Rbar1b, textVolMed);
+  Rbar1->SetLineColor(Rcolor);
+  R->AddNode(Rbar1, 1, tr11);
+  TGeoBBox* Rbar2b  = new TGeoBBox("trd_Rbar2b", 4., 4., 4.);
+  TGeoVolume* Rbar2 = new TGeoVolume("Rbar2", Rbar2b, textVolMed);
+  Rbar2->SetLineColor(Rcolor);
+  R->AddNode(Rbar2, 1, tr12);
+  R->AddNode(Rbar2, 2, tr13);
+  TGeoTubeSeg* Rtub1b = new TGeoTubeSeg("trd_Rtub1b", 4., 12, 4., 90., 270.);
+  TGeoVolume* Rtub1   = new TGeoVolume("Rtub1", (TGeoShape*) Rtub1b, textVolMed);
+  Rtub1->SetLineColor(Rcolor);
+  R->AddNode(Rtub1, 1, tr14);
+  TGeoArb8* Rbar3b  = new TGeoArb8("trd_Rbar3b", 4.);
+  TGeoVolume* Rbar3 = new TGeoVolume("Rbar3", Rbar3b, textVolMed);
+  Rbar3->SetLineColor(Rcolor);
+  TGeoArb8* arb = (TGeoArb8*) Rbar3->GetShape();
+  arb->SetVertex(0, 12., -4.);
+  arb->SetVertex(1, 0., -20.);
+  arb->SetVertex(2, -8., -20.);
+  arb->SetVertex(3, 4., -4.);
+  arb->SetVertex(4, 12., -4.);
+  arb->SetVertex(5, 0., -20.);
+  arb->SetVertex(6, -8., -20.);
+  arb->SetVertex(7, 4., -4.);
+  R->AddNode(Rbar3, 1, tr15);
+
+  // make letter D
+  //   TGeoVolume *D = geom->MakeBox("D", Vacuum, 25., 25., 5.);
+  //   D->SetVisibility(kFALSE);
+  TGeoVolume* D = new TGeoVolumeAssembly("Dbox");  // volume for D
+
+  TGeoBBox* Dbar1b  = new TGeoBBox("trd_Dbar1b", 4., 20, 4.);
+  TGeoVolume* Dbar1 = new TGeoVolume("Dbar1", Dbar1b, textVolMed);
+  Dbar1->SetLineColor(Dcolor);
+  D->AddNode(Dbar1, 1, tr21);
+  TGeoBBox* Dbar2b  = new TGeoBBox("trd_Dbar2b", 2., 4., 4.);
+  TGeoVolume* Dbar2 = new TGeoVolume("Dbar2", Dbar2b, textVolMed);
+  Dbar2->SetLineColor(Dcolor);
+  D->AddNode(Dbar2, 1, tr22);
+  D->AddNode(Dbar2, 2, tr23);
+  TGeoTubeSeg* Dtub1b = new TGeoTubeSeg("trd_Dtub1b", 12, 20, 4., 90., 270.);
+  TGeoVolume* Dtub1   = new TGeoVolume("Dtub1", (TGeoShape*) Dtub1b, textVolMed);
+  Dtub1->SetLineColor(Dcolor);
+  D->AddNode(Dtub1, 1, tr24);
+
+  // make letter I
+  TGeoVolume* I = new TGeoVolumeAssembly("Ibox");  // volume for I
+
+  TGeoBBox* Ibar1b  = new TGeoBBox("trd_Ibar1b", 4., 12., 4.);  // | vertical
+  TGeoVolume* Ibar1 = new TGeoVolume("Ibar1", Ibar1b, textVolMed);
+  Ibar1->SetLineColor(Icolor);
+  I->AddNode(Ibar1, 1, tr31);
+  TGeoBBox* Ibar2b  = new TGeoBBox("trd_Ibar2b", 10., 4., 4.);  // - top
+  TGeoVolume* Ibar2 = new TGeoVolume("Ibar2", Ibar2b, textVolMed);
+  Ibar2->SetLineColor(Icolor);
+  I->AddNode(Ibar2, 1, tr32);
+  I->AddNode(Ibar2, 2, tr33);
+
+
+  // build text block "TRD"  <32> + 8 + <28> + 8 + <32> = 108
+
+  //  TGeoBBox *trdboxb = new TGeoBBox("", 108./2, 40./2, 8./2);
+  //  TGeoVolume *trdbox = new TGeoVolume("trdboxb", trdboxb, textVolMed);
+  //  trdbox->SetVisibility(kFALSE);
+
+  //  TGeoVolume* trdbox[0] = new TGeoVolumeAssembly("trdbox1"); // volume for TRD text (108, 40, 8)
+  //  TGeoVolume* trdbox[1] = new TGeoVolumeAssembly("trdbox2"); // volume for TRD text (108, 40, 8)
+  //  TGeoVolume* trdbox[2] = new TGeoVolumeAssembly("trdbox3"); // volume for TRD text (108, 40, 8)
+
+  TGeoTranslation* tr100 = new TGeoTranslation(38., 0., 0.);
+  TGeoTranslation* tr101 = new TGeoTranslation(0., 0., 0.);
+  TGeoTranslation* tr102 = new TGeoTranslation(-38., 0., 0.);
+
+  //  TGeoTranslation *tr103 = new TGeoTranslation( -70., 0., 0.);  // on the same line
+  //  TGeoTranslation *tr104 = new TGeoTranslation( -86., 0., 0.);  // on the same line
+  //  TGeoTranslation *tr105 = new TGeoTranslation(-102., 0., 0.);  // on the same line
+
+  TGeoTranslation* tr110 = new TGeoTranslation(0., -50., 0.);
+  TGeoTranslation* tr111 = new TGeoTranslation(8., -50., 0.);
+  TGeoTranslation* tr112 = new TGeoTranslation(-8., -50., 0.);
+  TGeoTranslation* tr113 = new TGeoTranslation(16., -50., 0.);
+  TGeoTranslation* tr114 = new TGeoTranslation(-16., -50., 0.);
+
+  TGeoTranslation* tr200 = new TGeoTranslation(0., 0., 0.);
+  TGeoTranslation* tr201 = new TGeoTranslation(0., -50., 0.);
+  TGeoTranslation* tr202 = new TGeoTranslation(0., -100., 0.);
+
+  TGeoTranslation* tr210 = new TGeoTranslation(0., -150., 0.);
+  TGeoTranslation* tr213 = new TGeoTranslation(16., -150., 0.);
+  TGeoTranslation* tr214 = new TGeoTranslation(-16., -150., 0.);
+
+  // station 1
+  trdbox1->AddNode(T, 1, tr100);
+  trdbox1->AddNode(R, 1, tr101);
+  trdbox1->AddNode(D, 1, tr102);
+
+  trdbox1->AddNode(I, 1, tr110);
+
+  // station 2
+  trdbox2->AddNode(T, 1, tr100);
+  trdbox2->AddNode(R, 1, tr101);
+  trdbox2->AddNode(D, 1, tr102);
+
+  trdbox2->AddNode(I, 1, tr111);
+  trdbox2->AddNode(I, 2, tr112);
+
+  //// station 3
+  //  trdbox3->AddNode(T, 1, tr100);
+  //  trdbox3->AddNode(R, 1, tr101);
+  //  trdbox3->AddNode(D, 1, tr102);
+  //
+  //  trdbox3->AddNode(I, 1, tr110);
+  //  trdbox3->AddNode(I, 2, tr113);
+  //  trdbox3->AddNode(I, 3, tr114);
+
+  // station 3
+  trdbox3->AddNode(T, 1, tr200);
+  trdbox3->AddNode(R, 1, tr201);
+  trdbox3->AddNode(D, 1, tr202);
+
+  trdbox3->AddNode(I, 1, tr210);
+  trdbox3->AddNode(I, 2, tr213);
+  trdbox3->AddNode(I, 3, tr214);
+
+  //  TGeoScale *sc100 = new TGeoScale( 36./50., 36./50., 1.);  // text is vertical 50 cm, H-bar opening is 36 cm
+  //
+  //  // scale text
+  //  TGeoHMatrix *mat100 = new TGeoHMatrix("");
+  //  TGeoHMatrix *mat101 = new TGeoHMatrix("");
+  //  TGeoHMatrix *mat102 = new TGeoHMatrix("");
+  //  (*mat100) = (*tr100) * (*sc100);
+  //  (*mat101) = (*tr101) * (*sc100);
+  //  (*mat102) = (*tr102) * (*sc100);
+  //
+  //  trdbox->AddNode(T, 1, mat100);
+  //  trdbox->AddNode(R, 1, mat101);
+  //  trdbox->AddNode(D, 1, mat102);
+
+  //   // final placement
+  //   //   TGeoTranslation *tr103 = new TGeoTranslation(0., 400., 500.);
+  //   gGeoMan->GetVolume(geoVersion)->AddNode(trdbox, 1, new TGeoTranslation(0., 400., 500.));
+  //   gGeoMan->GetVolume(geoVersion)->AddNode(trdbox, 2, new TGeoTranslation(0., 500., 600.));
+  //   gGeoMan->GetVolume(geoVersion)->AddNode(trdbox, 3, new TGeoTranslation(0., 600., 700.));
+
+  //  return trdbox;
+}
+
+
+void create_box_supports()
+{
+  const TString trd_01 = "support_trd1";
+  TGeoVolume* trd_1    = new TGeoVolumeAssembly(trd_01);
+
+  const TString trd_02 = "support_trd2";
+  TGeoVolume* trd_2    = new TGeoVolumeAssembly(trd_02);
+
+  const TString trd_03 = "support_trd3";
+  TGeoVolume* trd_3    = new TGeoVolumeAssembly(trd_03);
+
+  //  const TString trdSupport = "supportframe";
+  //  TGeoVolume* trdsupport = new TGeoVolumeAssembly(trdSupport);
+  //
+  //  trdsupport->AddNode(trd_1, 1);
+  //  trdsupport->AddNode(trd_2, 2);
+  //  trdsupport->AddNode(trd_3, 3);
+
+  TGeoMedium* keepVolMed      = gGeoMan->GetMedium(KeepingVolumeMedium);
+  TGeoMedium* aluminiumVolMed = gGeoMan->GetMedium(AluminiumVolumeMedium);  // define Volume Medium
+
+  const Int_t I_height = 40;  // cm // I profile properties
+  const Int_t I_width  = 30;  // cm // I profile properties
+  const Int_t I_thick  = 2;   // cm // I profile properties
+
+  const Double_t BeamHeight     = 570;  // beamline is at 5.7m above the floor
+  const Double_t PlatformHeight = 234;  // platform is   2.34m above the floor
+  const Double_t PlatformOffset = 1;    // distance to platform
+
+  //  Double_t AperX[3] = { 450., 550., 600.};  // 100 cm modules  // inner aperture in X of support structure for stations 1,2,3
+  //  Double_t AperY[3] = { 350., 450., 500.};  // 100 cm modules  // inner aperture in Y of support structure for stations 1,2,3
+
+  const Double_t AperX[3] = {4.5 * DetectorSizeX[1], 5.5 * DetectorSizeX[1], 6 * DetectorSizeX[1]};
+  // inner aperture in X of support structure for stations 1,2,3
+  const Double_t AperY[3] = {3.5 * DetectorSizeY[1], 4.5 * DetectorSizeY[1], 5 * DetectorSizeY[1]};
+  // inner aperture in Y of support structure for stations 1,2,3
+  // platform
+  const Double_t AperYbot[3] = {BeamHeight - (PlatformHeight + PlatformOffset + I_height), 4.5 * DetectorSizeY[1],
+                                5 * DetectorSizeY[1]};  // inner aperture for station1
+
+  const Double_t xBarPosYtop[3] = {AperY[0] + I_height / 2., AperY[1] + I_height / 2., AperY[2] + I_height / 2.};
+  const Double_t xBarPosYbot[3] = {AperYbot[0] + I_height / 2., xBarPosYtop[1], xBarPosYtop[2]};
+
+  const Double_t zBarPosYtop[3] = {AperY[0] + I_height - I_width / 2., AperY[1] + I_height - I_width / 2.,
+                                   AperY[2] + I_height - I_width / 2.};
+  const Double_t zBarPosYbot[3] = {AperYbot[0] + I_height - I_width / 2., zBarPosYtop[1], zBarPosYtop[2]};
+
+  Double_t PilPosX;
+  Double_t PilPosZ[6];  // PilPosZ
+
+  PilPosZ[0] = LayerPosition[0] + I_width / 2.;
+  PilPosZ[1] = LayerPosition[3] - I_width / 2. + LayerThickness;
+  PilPosZ[2] = LayerPosition[4] + I_width / 2.;
+  PilPosZ[3] = LayerPosition[7] - I_width / 2. + LayerThickness;
+  PilPosZ[4] = LayerPosition[8] + I_width / 2.;
+  PilPosZ[5] = LayerPosition[9] - I_width / 2. + LayerThickness;
+
+  //  cout << "PilPosZ[0]: " << PilPosZ[0] << endl;
+  //  cout << "PilPosZ[1]: " << PilPosZ[1] << endl;
+
+  TGeoRotation* rotx090 = new TGeoRotation("rotx090");
+  rotx090->RotateX(90.);  // rotate  90 deg around x-axis
+  TGeoRotation* roty090 = new TGeoRotation("roty090");
+  roty090->RotateY(90.);  // rotate  90 deg around y-axis
+  TGeoRotation* rotz090 = new TGeoRotation("rotz090");
+  rotz090->RotateZ(90.);  // rotate  90 deg around y-axis
+  TGeoRotation* roty270 = new TGeoRotation("roty270");
+  roty270->RotateY(270.);  // rotate 270 deg around y-axis
+
+  TGeoRotation* rotzx01 = new TGeoRotation("rotzx01");
+  rotzx01->RotateZ(90.);  // rotate  90 deg around z-axis
+  rotzx01->RotateX(90.);  // rotate  90 deg around x-axis
+
+  TGeoRotation* rotzx02 = new TGeoRotation("rotzx02");
+  rotzx02->RotateZ(270.);  // rotate 270 deg around z-axis
+  rotzx02->RotateX(90.);   // rotate  90 deg around x-axis
+
+  Double_t ang1 = atan(3. / 4.) * 180. / acos(-1.);
+  //  cout << "DEDE " << ang1 << endl;
+  //  Double_t sin1 = acos(-1.);
+  //  cout << "DEDE " << sin1 << endl;
+  TGeoRotation* rotx080 = new TGeoRotation("rotx080");
+  rotx080->RotateX(90. - ang1);  // rotate  80 deg around x-axis
+  TGeoRotation* rotx100 = new TGeoRotation("rotx100");
+  rotx100->RotateX(90. + ang1);  // rotate 100 deg around x-axis
+
+  TGeoRotation* rotxy01 = new TGeoRotation("rotxy01");
+  rotxy01->RotateX(90.);    // rotate  90 deg around x-axis
+  rotxy01->RotateZ(-ang1);  // rotate  ang1   around rotated y-axis
+
+  TGeoRotation* rotxy02 = new TGeoRotation("rotxy02");
+  rotxy02->RotateX(90.);   // rotate  90 deg around x-axis
+  rotxy02->RotateZ(ang1);  // rotate  ang1   around rotated y-axis
+
+
+  //-------------------
+  // vertical pillars (Y)
+  //-------------------
+
+  // station 1
+  if (ShowLayer[0])  // if geometry contains layer 1 (1st layer of station 1)
+  {
+    //      TGeoBBox* trd_I_vert1_keep  = new TGeoBBox("", I_thick /2., I_height /2. - I_thick, (BeamHeight + (AperY[0]+I_height) ) /2.);
+    TGeoBBox* trd_I_vert1_keep = new TGeoBBox("trd_I_vert1_keep", I_thick / 2., I_height / 2. - I_thick,
+                                              ((AperYbot[0] + I_height) + (AperY[0] + I_height)) / 2.);
+    TGeoVolume* trd_I_vert1    = new TGeoVolume("trd_I_y11", trd_I_vert1_keep, aluminiumVolMed);
+    //      TGeoBBox* trd_I_vert2_keep  = new TGeoBBox("", I_width /2.,            I_thick /2., (BeamHeight + (AperY[0]+I_height) ) /2.);
+    TGeoBBox* trd_I_vert2_keep = new TGeoBBox("trd_I_vert2_keep", I_width / 2., I_thick / 2.,
+                                              ((AperYbot[0] + I_height) + (AperY[0] + I_height)) / 2.);
+    TGeoVolume* trd_I_vert2    = new TGeoVolume("trd_I_y12", trd_I_vert2_keep, aluminiumVolMed);
+
+    trd_I_vert1->SetLineColor(kGreen);  // kBlue);  // Yellow);  // kOrange);
+    trd_I_vert2->SetLineColor(kGreen);  // kBlue);  // Yellow);  // kOrange);
+
+    TGeoTranslation* ty01 = new TGeoTranslation("ty01", 0., 0., 0.);
+    TGeoTranslation* ty02 = new TGeoTranslation("ty02", 0., (I_height - I_thick) / 2., 0.);
+    TGeoTranslation* ty03 = new TGeoTranslation("ty03", 0., -(I_height - I_thick) / 2., 0.);
+
+    //      TGeoBBox* trd_I_vert_vol1_keep = new TGeoBBox("", I_width /2., I_height /2., (BeamHeight + (AperY[0]+I_height) ) /2.);
+    TGeoBBox* trd_I_vert_vol1_keep = new TGeoBBox("trd_I_vert_vol1_keep", I_width / 2., I_height / 2.,
+                                                  ((AperYbot[0] + I_height) + (AperY[0] + I_height)) / 2.);
+    TGeoVolume* trd_I_vert_vol1    = new TGeoVolume("trd_I_y10", trd_I_vert_vol1_keep, keepVolMed);
+
+    // set green color for keeping volume of I profile, seen with gGeoManager->SetVisLevel(2)
+    trd_I_vert_vol1->SetLineColor(kGreen);
+
+    // build I-bar trd_I_vert_vol1
+    trd_I_vert_vol1->AddNode(trd_I_vert1, 1, ty01);
+    trd_I_vert_vol1->AddNode(trd_I_vert2, 2, ty02);
+    trd_I_vert_vol1->AddNode(trd_I_vert2, 3, ty03);
+
+    // close gap to horizontal z-bars
+    TGeoBBox* trd_I_vert3_keep =
+      new TGeoBBox("trd_I_vert3_keep", (I_width - I_thick) / 2. / 2., I_height / 2. - I_thick, I_thick / 2.);
+    TGeoVolume* trd_I_vert3 = new TGeoVolume("trd_I_y13", trd_I_vert3_keep, aluminiumVolMed);
+    trd_I_vert3->SetLineColor(kGreen);
+    //      TGeoTranslation *ty04 = new TGeoTranslation("ty04",  (I_thick/2. + (I_width-I_thick)/2./2.), 0., -( (AperYbot[0]+I_height) + (AperY[0]+I_height) - I_width) /2.);  // top
+    //      TGeoTranslation *ty05 = new TGeoTranslation("ty05",  (I_thick/2. + (I_width-I_thick)/2./2.), 0.,  ( (AperYbot[0]+I_height) + (AperY[0]+I_height) - I_width) /2.);  // bottom
+    TGeoTranslation* ty04 = new TGeoTranslation("ty04", (I_thick / 2. + (I_width - I_thick) / 2. / 2.), 0.,
+                                                -(zBarPosYbot[0] + zBarPosYtop[0]) / 2.);  // top
+    TGeoTranslation* ty05 = new TGeoTranslation("ty05", (I_thick / 2. + (I_width - I_thick) / 2. / 2.), 0.,
+                                                (zBarPosYbot[0] + zBarPosYtop[0]) / 2.);  // bottom
+    trd_I_vert_vol1->AddNode(trd_I_vert3, 4, ty04);
+    trd_I_vert_vol1->AddNode(trd_I_vert3, 5, ty05);
+
+    PilPosX = AperX[0];
+
+    TGeoCombiTrans* trd_I_vert_combi01 = new TGeoCombiTrans(
+      (PilPosX + I_height / 2.), -((AperYbot[0] + I_height) - (AperY[0] + I_height)) / 2., PilPosZ[0], rotzx01);
+    trd_1->AddNode(trd_I_vert_vol1, 11, trd_I_vert_combi01);
+    TGeoCombiTrans* trd_I_vert_combi02 = new TGeoCombiTrans(
+      -(PilPosX + I_height / 2.), -((AperYbot[0] + I_height) - (AperY[0] + I_height)) / 2., PilPosZ[0], rotzx01);
+    trd_1->AddNode(trd_I_vert_vol1, 12, trd_I_vert_combi02);
+    TGeoCombiTrans* trd_I_vert_combi03 = new TGeoCombiTrans(
+      (PilPosX + I_height / 2.), -((AperYbot[0] + I_height) - (AperY[0] + I_height)) / 2., PilPosZ[1], rotzx02);
+    trd_1->AddNode(trd_I_vert_vol1, 13, trd_I_vert_combi03);
+    TGeoCombiTrans* trd_I_vert_combi04 = new TGeoCombiTrans(
+      -(PilPosX + I_height / 2.), -((AperYbot[0] + I_height) - (AperY[0] + I_height)) / 2., PilPosZ[1], rotzx02);
+    trd_1->AddNode(trd_I_vert_vol1, 14, trd_I_vert_combi04);
+  }
+
+  // station 2
+  if (ShowLayer[4])  // if geometry contains layer 5 (1st layer of station 2)
+  {
+    TGeoBBox* trd_I_vert1_keep = new TGeoBBox("trd_I_vert1_keep", I_thick / 2., I_height / 2. - I_thick,
+                                              (BeamHeight + (AperY[1] + I_height)) / 2.);
+    TGeoVolume* trd_I_vert1    = new TGeoVolume("trd_I_y21", trd_I_vert1_keep, aluminiumVolMed);
+    TGeoBBox* trd_I_vert2_keep =
+      new TGeoBBox("trd_I_vert2_keep", I_width / 2., I_thick / 2., (BeamHeight + (AperY[1] + I_height)) / 2.);
+    TGeoVolume* trd_I_vert2 = new TGeoVolume("trd_I_y22", trd_I_vert2_keep, aluminiumVolMed);
+
+    trd_I_vert1->SetLineColor(kGreen);
+    trd_I_vert2->SetLineColor(kGreen);
+
+    TGeoTranslation* ty01 = new TGeoTranslation("ty01", 0., 0., 0.);
+    TGeoTranslation* ty02 = new TGeoTranslation("ty02", 0., (I_height - I_thick) / 2., 0.);
+    TGeoTranslation* ty03 = new TGeoTranslation("ty03", 0., -(I_height - I_thick) / 2., 0.);
+
+    TGeoBBox* trd_I_vert_vol1_keep =
+      new TGeoBBox("trd_I_vert_vol1_keep", I_width / 2., I_height / 2., (BeamHeight + (AperY[1] + I_height)) / 2.);
+    TGeoVolume* trd_I_vert_vol1 = new TGeoVolume("trd_I_y20", trd_I_vert_vol1_keep, keepVolMed);
+
+    // set green color for keeping volume of I profile, seen with gGeoManager->SetVisLevel(2)
+    trd_I_vert_vol1->SetLineColor(kGreen);
+
+    // build I-bar trd_I_vert_vol1
+    trd_I_vert_vol1->AddNode(trd_I_vert1, 1, ty01);
+    trd_I_vert_vol1->AddNode(trd_I_vert2, 2, ty02);
+    trd_I_vert_vol1->AddNode(trd_I_vert2, 3, ty03);
+
+    // close gap to horizontal z-bars
+    TGeoBBox* trd_I_vert3_keep =
+      new TGeoBBox("trd_I_vert3_keep", (I_width - I_thick) / 2. / 2., I_height / 2. - I_thick, I_thick / 2.);
+    TGeoVolume* trd_I_vert3 = new TGeoVolume("trd_I_y23", trd_I_vert3_keep, aluminiumVolMed);
+    trd_I_vert3->SetLineColor(kGreen);
+    TGeoTranslation* ty04 = new TGeoTranslation("ty04", (I_thick / 2. + (I_width - I_thick) / 2. / 2.), 0.,
+                                                -(BeamHeight + (AperY[1] + I_height) - I_width) / 2.);  // top
+    TGeoTranslation* ty05 = new TGeoTranslation("ty05", (I_thick / 2. + (I_width - I_thick) / 2. / 2.), 0.,
+                                                -(BeamHeight - (AperY[1] + I_height)) / 2. + zBarPosYbot[1]);  // bottom
+    trd_I_vert_vol1->AddNode(trd_I_vert3, 4, ty04);
+    trd_I_vert_vol1->AddNode(trd_I_vert3, 5, ty05);
+
+    PilPosX = AperX[1];
+
+    TGeoCombiTrans* trd_I_vert_combi01 =
+      new TGeoCombiTrans((PilPosX + I_height / 2.), -(BeamHeight - (AperY[1] + I_height)) / 2., PilPosZ[2], rotzx01);
+    trd_2->AddNode(trd_I_vert_vol1, 21, trd_I_vert_combi01);
+    TGeoCombiTrans* trd_I_vert_combi02 =
+      new TGeoCombiTrans(-(PilPosX + I_height / 2.), -(BeamHeight - (AperY[1] + I_height)) / 2., PilPosZ[2], rotzx01);
+    trd_2->AddNode(trd_I_vert_vol1, 22, trd_I_vert_combi02);
+    TGeoCombiTrans* trd_I_vert_combi03 =
+      new TGeoCombiTrans((PilPosX + I_height / 2.), -(BeamHeight - (AperY[1] + I_height)) / 2., PilPosZ[3], rotzx02);
+    trd_2->AddNode(trd_I_vert_vol1, 23, trd_I_vert_combi03);
+    TGeoCombiTrans* trd_I_vert_combi04 =
+      new TGeoCombiTrans(-(PilPosX + I_height / 2.), -(BeamHeight - (AperY[1] + I_height)) / 2., PilPosZ[3], rotzx02);
+    trd_2->AddNode(trd_I_vert_vol1, 24, trd_I_vert_combi04);
+  }
+
+  // station 3
+  if (ShowLayer[8])  // if geometry contains layer 9 (1st layer of station 3)
+  {
+    TGeoBBox* trd_I_vert1_keep = new TGeoBBox("trd_I_vert1_keep", I_thick / 2., I_height / 2. - I_thick,
+                                              (BeamHeight + (AperY[2] + I_height)) / 2.);
+    TGeoVolume* trd_I_vert1    = new TGeoVolume("trd_I_y31", trd_I_vert1_keep, aluminiumVolMed);
+    TGeoBBox* trd_I_vert2_keep =
+      new TGeoBBox("trd_I_vert2_keep", I_width / 2., I_thick / 2., (BeamHeight + (AperY[2] + I_height)) / 2.);
+    TGeoVolume* trd_I_vert2 = new TGeoVolume("trd_I_y32", trd_I_vert2_keep, aluminiumVolMed);
+
+    trd_I_vert1->SetLineColor(kGreen);
+    trd_I_vert2->SetLineColor(kGreen);
+
+    TGeoTranslation* ty01 = new TGeoTranslation("ty01", 0., 0., 0.);
+    TGeoTranslation* ty02 = new TGeoTranslation("ty02", 0., (I_height - I_thick) / 2., 0.);
+    TGeoTranslation* ty03 = new TGeoTranslation("ty03", 0., -(I_height - I_thick) / 2., 0.);
+
+    TGeoBBox* trd_I_vert_vol1_keep =
+      new TGeoBBox("trd_I_vert_vol1_keep", I_width / 2., I_height / 2., (BeamHeight + (AperY[2] + I_height)) / 2.);
+    TGeoVolume* trd_I_vert_vol1 = new TGeoVolume("trd_I_y30", trd_I_vert_vol1_keep, keepVolMed);
+
+    // set green color for keeping volume of I profile, seen with gGeoManager->SetVisLevel(2)
+    trd_I_vert_vol1->SetLineColor(kGreen);
+
+    // build I-bar trd_I_vert_vol1
+    trd_I_vert_vol1->AddNode(trd_I_vert1, 1, ty01);
+    trd_I_vert_vol1->AddNode(trd_I_vert2, 2, ty02);
+    trd_I_vert_vol1->AddNode(trd_I_vert2, 3, ty03);
+
+    // close gap to horizontal z-bars
+    TGeoBBox* trd_I_vert3_keep =
+      new TGeoBBox("trd_I_vert3_keep", (I_width - I_thick) / 2. / 2., I_height / 2. - I_thick, I_thick / 2.);
+    TGeoVolume* trd_I_vert3 = new TGeoVolume("trd_I_y33", trd_I_vert3_keep, aluminiumVolMed);
+    trd_I_vert3->SetLineColor(kGreen);
+    TGeoTranslation* ty04 = new TGeoTranslation("ty04", (I_thick / 2. + (I_width - I_thick) / 2. / 2.), 0.,
+                                                -(BeamHeight + (AperY[2] + I_height) - I_width) / 2.);  // top
+    TGeoTranslation* ty05 = new TGeoTranslation("ty05", (I_thick / 2. + (I_width - I_thick) / 2. / 2.), 0.,
+                                                -(BeamHeight - (AperY[2] + I_height)) / 2. + zBarPosYbot[2]);  // bottom
+    trd_I_vert_vol1->AddNode(trd_I_vert3, 4, ty04);
+    trd_I_vert_vol1->AddNode(trd_I_vert3, 5, ty05);
+
+    PilPosX = AperX[2];
+
+    TGeoCombiTrans* trd_I_vert_combi01 =
+      new TGeoCombiTrans((PilPosX + I_height / 2.), -(BeamHeight - (AperY[2] + I_height)) / 2., PilPosZ[4], rotzx01);
+    trd_3->AddNode(trd_I_vert_vol1, 31, trd_I_vert_combi01);
+    TGeoCombiTrans* trd_I_vert_combi02 =
+      new TGeoCombiTrans(-(PilPosX + I_height / 2.), -(BeamHeight - (AperY[2] + I_height)) / 2., PilPosZ[4], rotzx01);
+    trd_3->AddNode(trd_I_vert_vol1, 32, trd_I_vert_combi02);
+    TGeoCombiTrans* trd_I_vert_combi03 =
+      new TGeoCombiTrans((PilPosX + I_height / 2.), -(BeamHeight - (AperY[2] + I_height)) / 2., PilPosZ[5], rotzx02);
+    trd_3->AddNode(trd_I_vert_vol1, 33, trd_I_vert_combi03);
+    TGeoCombiTrans* trd_I_vert_combi04 =
+      new TGeoCombiTrans(-(PilPosX + I_height / 2.), -(BeamHeight - (AperY[2] + I_height)) / 2., PilPosZ[5], rotzx02);
+    trd_3->AddNode(trd_I_vert_vol1, 34, trd_I_vert_combi04);
+  }
+
+
+  //-------------------
+  // horizontal supports (X)
+  //-------------------
+
+  // station 1
+  if (ShowLayer[0])  // if geometry contains layer 1 (1st layer of station 1)
+  {
+    TGeoBBox* trd_I_hori1_keep = new TGeoBBox("trd_I_hori1_keep", I_thick / 2., I_height / 2. - I_thick, AperX[0]);
+    TGeoVolume* trd_I_hori1    = new TGeoVolume("trd_I_x11", trd_I_hori1_keep, aluminiumVolMed);
+    TGeoBBox* trd_I_hori2_keep = new TGeoBBox("trd_I_hori2_keep", I_width / 2., I_thick / 2., AperX[0]);
+    TGeoVolume* trd_I_hori2    = new TGeoVolume("trd_I_x12", trd_I_hori2_keep, aluminiumVolMed);
+
+    trd_I_hori1->SetLineColor(kRed);  // Yellow);
+    trd_I_hori2->SetLineColor(kRed);  // Yellow);
+
+    TGeoTranslation* tx01 = new TGeoTranslation("tx01", 0., 0., 0.);
+    TGeoTranslation* tx02 = new TGeoTranslation("tx02", 0., (I_height - I_thick) / 2., 0.);
+    TGeoTranslation* tx03 = new TGeoTranslation("tx03", 0., -(I_height - I_thick) / 2., 0.);
+
+    TGeoBBox* trd_I_hori_vol1_keep = new TGeoBBox("trd_I_hori_vol1_keep", I_width / 2., I_height / 2., AperX[0]);
+    TGeoVolume* trd_I_hori_vol1    = new TGeoVolume("trd_I_x10", trd_I_hori_vol1_keep, keepVolMed);
+
+    // set red color for keeping volume of I profile, seen with gGeoManager->SetVisLevel(2)
+    trd_I_hori_vol1->SetLineColor(kRed);
+
+    // build I-bar trd_I_hori_vol1
+    trd_I_hori_vol1->AddNode(trd_I_hori1, 1, tx01);
+    trd_I_hori_vol1->AddNode(trd_I_hori2, 2, tx02);
+    trd_I_hori_vol1->AddNode(trd_I_hori2, 3, tx03);
+
+    TGeoCombiTrans* trd_I_hori_combi01 = new TGeoCombiTrans(0., xBarPosYtop[0], PilPosZ[0], roty090);
+    trd_1->AddNode(trd_I_hori_vol1, 11, trd_I_hori_combi01);
+    TGeoCombiTrans* trd_I_hori_combi02 = new TGeoCombiTrans(0., -xBarPosYbot[0], PilPosZ[0], roty090);
+    trd_1->AddNode(trd_I_hori_vol1, 12, trd_I_hori_combi02);
+    TGeoCombiTrans* trd_I_hori_combi03 = new TGeoCombiTrans(0., xBarPosYtop[0], PilPosZ[1], roty090);
+    trd_1->AddNode(trd_I_hori_vol1, 13, trd_I_hori_combi03);
+    TGeoCombiTrans* trd_I_hori_combi04 = new TGeoCombiTrans(0., -xBarPosYbot[0], PilPosZ[1], roty090);
+    trd_1->AddNode(trd_I_hori_vol1, 14, trd_I_hori_combi04);
+  }
+
+  // station 2
+  if (ShowLayer[4])  // if geometry contains layer 5 (1st layer of station 2)
+  {
+    TGeoBBox* trd_I_hori1_keep = new TGeoBBox("trd_I_hori1_keep", I_thick / 2., I_height / 2. - I_thick, AperX[1]);
+    TGeoVolume* trd_I_hori1    = new TGeoVolume("trd_I_x21", trd_I_hori1_keep, aluminiumVolMed);
+    TGeoBBox* trd_I_hori2_keep = new TGeoBBox("trd_I_hori2_keep", I_width / 2., I_thick / 2., AperX[1]);
+    TGeoVolume* trd_I_hori2    = new TGeoVolume("trd_I_x22", trd_I_hori2_keep, aluminiumVolMed);
+
+    trd_I_hori1->SetLineColor(kRed);
+    trd_I_hori2->SetLineColor(kRed);
+
+    TGeoTranslation* tx01 = new TGeoTranslation("tx01", 0., 0., 0.);
+    TGeoTranslation* tx02 = new TGeoTranslation("tx02", 0., (I_height - I_thick) / 2., 0.);
+    TGeoTranslation* tx03 = new TGeoTranslation("tx03", 0., -(I_height - I_thick) / 2., 0.);
+
+    TGeoBBox* trd_I_hori_vol1_keep = new TGeoBBox("trd_I_hori_vol1_keep", I_width / 2., I_height / 2., AperX[1]);
+    TGeoVolume* trd_I_hori_vol1    = new TGeoVolume("trd_I_x20", trd_I_hori_vol1_keep, keepVolMed);
+
+    // set red color for keeping volume of I profile, seen with gGeoManager->SetVisLevel(2)
+    trd_I_hori_vol1->SetLineColor(kRed);
+
+    // build I-bar trd_I_hori_vol1
+    trd_I_hori_vol1->AddNode(trd_I_hori1, 1, tx01);
+    trd_I_hori_vol1->AddNode(trd_I_hori2, 2, tx02);
+    trd_I_hori_vol1->AddNode(trd_I_hori2, 3, tx03);
+
+    TGeoCombiTrans* trd_I_hori_combi01 = new TGeoCombiTrans(0., xBarPosYtop[1], PilPosZ[2], roty090);
+    trd_2->AddNode(trd_I_hori_vol1, 21, trd_I_hori_combi01);
+    TGeoCombiTrans* trd_I_hori_combi02 = new TGeoCombiTrans(0., -xBarPosYbot[1], PilPosZ[2], roty090);
+    trd_2->AddNode(trd_I_hori_vol1, 22, trd_I_hori_combi02);
+    TGeoCombiTrans* trd_I_hori_combi03 = new TGeoCombiTrans(0., xBarPosYtop[1], PilPosZ[3], roty090);
+    trd_2->AddNode(trd_I_hori_vol1, 23, trd_I_hori_combi03);
+    TGeoCombiTrans* trd_I_hori_combi04 = new TGeoCombiTrans(0., -xBarPosYbot[1], PilPosZ[3], roty090);
+    trd_2->AddNode(trd_I_hori_vol1, 24, trd_I_hori_combi04);
+  }
+
+  // station 3
+  if (ShowLayer[8])  // if geometry contains layer 9 (1st layer of station 3)
+  {
+    TGeoBBox* trd_I_hori1_keep = new TGeoBBox("trd_I_hori1_keep", I_thick / 2., I_height / 2. - I_thick, AperX[2]);
+    TGeoVolume* trd_I_hori1    = new TGeoVolume("trd_I_x31", trd_I_hori1_keep, aluminiumVolMed);
+    TGeoBBox* trd_I_hori2_keep = new TGeoBBox("trd_I_hori2_keep", I_width / 2., I_thick / 2., AperX[2]);
+    TGeoVolume* trd_I_hori2    = new TGeoVolume("trd_I_x32", trd_I_hori2_keep, aluminiumVolMed);
+
+    trd_I_hori1->SetLineColor(kRed);
+    trd_I_hori2->SetLineColor(kRed);
+
+    TGeoTranslation* tx01 = new TGeoTranslation("tx01", 0., 0., 0.);
+    TGeoTranslation* tx02 = new TGeoTranslation("tx02", 0., (I_height - I_thick) / 2., 0.);
+    TGeoTranslation* tx03 = new TGeoTranslation("tx03", 0., -(I_height - I_thick) / 2., 0.);
+
+    TGeoBBox* trd_I_hori_vol1_keep = new TGeoBBox("trd_I_hori_vol1_keep", I_width / 2., I_height / 2., AperX[2]);
+    TGeoVolume* trd_I_hori_vol1    = new TGeoVolume("trd_I_x30", trd_I_hori_vol1_keep, keepVolMed);
+
+    // set red color for keeping volume of I profile, seen with gGeoManager->SetVisLevel(2)
+    trd_I_hori_vol1->SetLineColor(kRed);
+
+    // build I-bar trd_I_hori_vol1
+    trd_I_hori_vol1->AddNode(trd_I_hori1, 1, tx01);
+    trd_I_hori_vol1->AddNode(trd_I_hori2, 2, tx02);
+    trd_I_hori_vol1->AddNode(trd_I_hori2, 3, tx03);
+
+    TGeoCombiTrans* trd_I_hori_combi01 = new TGeoCombiTrans(0., xBarPosYtop[2], PilPosZ[4], roty090);
+    trd_3->AddNode(trd_I_hori_vol1, 31, trd_I_hori_combi01);
+    TGeoCombiTrans* trd_I_hori_combi02 = new TGeoCombiTrans(0., -xBarPosYbot[2], PilPosZ[4], roty090);
+    trd_3->AddNode(trd_I_hori_vol1, 32, trd_I_hori_combi02);
+    TGeoCombiTrans* trd_I_hori_combi03 = new TGeoCombiTrans(0., xBarPosYtop[2], PilPosZ[5], roty090);
+    trd_3->AddNode(trd_I_hori_vol1, 33, trd_I_hori_combi03);
+    TGeoCombiTrans* trd_I_hori_combi04 = new TGeoCombiTrans(0., -xBarPosYbot[2], PilPosZ[5], roty090);
+    trd_3->AddNode(trd_I_hori_vol1, 34, trd_I_hori_combi04);
+  }
+
+
+  //-------------------
+  // horizontal supports (Z)
+  //-------------------
+
+  // station 1
+  if (ShowLayer[0])  // if geometry contains layer 1 (1st layer of station 1)
+  {
+    TGeoBBox* trd_I_slope1_keep = new TGeoBBox("trd_I_slope1_keep", I_thick / 2., I_height / 2. - I_thick,
+                                               (PilPosZ[1] - PilPosZ[0] - I_width) / 2.);
+    TGeoVolume* trd_I_slope1    = new TGeoVolume("trd_I_z11", trd_I_slope1_keep, aluminiumVolMed);
+    TGeoBBox* trd_I_slope2_keep =
+      new TGeoBBox("trd_I_slope2_keep", I_width / 2., I_thick / 2., (PilPosZ[1] - PilPosZ[0] - I_width) / 2.);
+    TGeoVolume* trd_I_slope2 = new TGeoVolume("trd_I_z12", trd_I_slope2_keep, aluminiumVolMed);
+
+    trd_I_slope1->SetLineColor(kYellow);
+    trd_I_slope2->SetLineColor(kYellow);
+
+    TGeoTranslation* tz01 = new TGeoTranslation("tz01", 0., 0., 0.);
+    TGeoTranslation* tz02 = new TGeoTranslation("tz02", 0., (I_height - I_thick) / 2., 0.);
+    TGeoTranslation* tz03 = new TGeoTranslation("tz03", 0., -(I_height - I_thick) / 2., 0.);
+
+    TGeoBBox* trd_I_slope_vol1_keep =
+      new TGeoBBox("trd_I_slope_vol1_keep", I_width / 2., I_height / 2., (PilPosZ[1] - PilPosZ[0] - I_width) / 2.);
+    TGeoVolume* trd_I_slope_vol1 = new TGeoVolume("trd_I_z10", trd_I_slope_vol1_keep, keepVolMed);
+
+    // set yellow color for keeping volume of I profile, seen with gGeoManager->SetVisLevel(2)
+    trd_I_slope_vol1->SetLineColor(kYellow);
+
+    // build I-bar trd_I_slope_vol1
+    trd_I_slope_vol1->AddNode(trd_I_slope1, 1, tz01);
+    trd_I_slope_vol1->AddNode(trd_I_slope2, 2, tz02);
+    trd_I_slope_vol1->AddNode(trd_I_slope2, 3, tz03);
+
+    PilPosX = AperX[0];
+
+    TGeoCombiTrans* trd_I_slope_combi01 =
+      new TGeoCombiTrans((PilPosX + I_height / 2.), zBarPosYtop[0], (PilPosZ[0] + PilPosZ[1]) / 2., rotz090);
+    trd_1->AddNode(trd_I_slope_vol1, 11, trd_I_slope_combi01);
+    TGeoCombiTrans* trd_I_slope_combi02 =
+      new TGeoCombiTrans(-(PilPosX + I_height / 2.), zBarPosYtop[0], (PilPosZ[0] + PilPosZ[1]) / 2., rotz090);
+    trd_1->AddNode(trd_I_slope_vol1, 12, trd_I_slope_combi02);
+    TGeoCombiTrans* trd_I_slope_combi03 =
+      new TGeoCombiTrans((PilPosX + I_height / 2.), -zBarPosYbot[0], (PilPosZ[0] + PilPosZ[1]) / 2., rotz090);
+    trd_1->AddNode(trd_I_slope_vol1, 13, trd_I_slope_combi03);
+    TGeoCombiTrans* trd_I_slope_combi04 =
+      new TGeoCombiTrans(-(PilPosX + I_height / 2.), -zBarPosYbot[0], (PilPosZ[0] + PilPosZ[1]) / 2., rotz090);
+    trd_1->AddNode(trd_I_slope_vol1, 14, trd_I_slope_combi04);
+  }
+
+  // station 2
+  if (ShowLayer[4])  // if geometry contains layer 5 (1st layer of station 2)
+  {
+    TGeoBBox* trd_I_slope1_keep = new TGeoBBox("trd_I_slope1_keep", I_thick / 2., I_height / 2. - I_thick,
+                                               (PilPosZ[3] - PilPosZ[2] - I_width) / 2.);
+    TGeoVolume* trd_I_slope1    = new TGeoVolume("trd_I_z21", trd_I_slope1_keep, aluminiumVolMed);
+    TGeoBBox* trd_I_slope2_keep =
+      new TGeoBBox("trd_I_slope2_keep", I_width / 2., I_thick / 2., (PilPosZ[3] - PilPosZ[2] - I_width) / 2.);
+    TGeoVolume* trd_I_slope2 = new TGeoVolume("trd_I_z22", trd_I_slope2_keep, aluminiumVolMed);
+
+    trd_I_slope1->SetLineColor(kYellow);
+    trd_I_slope2->SetLineColor(kYellow);
+
+    TGeoTranslation* tz01 = new TGeoTranslation("tz01", 0., 0., 0.);
+    TGeoTranslation* tz02 = new TGeoTranslation("tz02", 0., (I_height - I_thick) / 2., 0.);
+    TGeoTranslation* tz03 = new TGeoTranslation("tz03", 0., -(I_height - I_thick) / 2., 0.);
+
+    TGeoBBox* trd_I_slope_vol1_keep =
+      new TGeoBBox("trd_I_slope_vol1_keep", I_width / 2., I_height / 2., (PilPosZ[3] - PilPosZ[2] - I_width) / 2.);
+    TGeoVolume* trd_I_slope_vol1 = new TGeoVolume("trd_I_z20", trd_I_slope_vol1_keep, keepVolMed);
+
+    // set yellow color for keeping volume of I profile, seen with gGeoManager->SetVisLevel(2)
+    trd_I_slope_vol1->SetLineColor(kYellow);
+
+    // build I-bar trd_I_slope_vol1
+    trd_I_slope_vol1->AddNode(trd_I_slope1, 1, tz01);
+    trd_I_slope_vol1->AddNode(trd_I_slope2, 2, tz02);
+    trd_I_slope_vol1->AddNode(trd_I_slope2, 3, tz03);
+
+    PilPosX = AperX[1];
+
+    TGeoCombiTrans* trd_I_slope_combi01 =
+      new TGeoCombiTrans((PilPosX + I_height / 2.), zBarPosYtop[1], (PilPosZ[2] + PilPosZ[3]) / 2., rotz090);
+    trd_2->AddNode(trd_I_slope_vol1, 21, trd_I_slope_combi01);
+    TGeoCombiTrans* trd_I_slope_combi02 =
+      new TGeoCombiTrans(-(PilPosX + I_height / 2.), zBarPosYtop[1], (PilPosZ[2] + PilPosZ[3]) / 2., rotz090);
+    trd_2->AddNode(trd_I_slope_vol1, 22, trd_I_slope_combi02);
+    TGeoCombiTrans* trd_I_slope_combi03 =
+      new TGeoCombiTrans((PilPosX + I_height / 2.), -zBarPosYbot[1], (PilPosZ[2] + PilPosZ[3]) / 2., rotz090);
+    trd_2->AddNode(trd_I_slope_vol1, 23, trd_I_slope_combi03);
+    TGeoCombiTrans* trd_I_slope_combi04 =
+      new TGeoCombiTrans(-(PilPosX + I_height / 2.), -zBarPosYbot[1], (PilPosZ[2] + PilPosZ[3]) / 2., rotz090);
+    trd_2->AddNode(trd_I_slope_vol1, 24, trd_I_slope_combi04);
+  }
+
+  // station 3
+  if (ShowLayer[8])  // if geometry contains layer 9 (1st layer of station 3)
+  {
+    TGeoBBox* trd_I_slope1_keep = new TGeoBBox("trd_I_slope1_keep", I_thick / 2., I_height / 2. - I_thick,
+                                               (PilPosZ[5] - PilPosZ[4] - I_width) / 2.);
+    TGeoVolume* trd_I_slope1    = new TGeoVolume("trd_I_z31", trd_I_slope1_keep, aluminiumVolMed);
+    TGeoBBox* trd_I_slope2_keep =
+      new TGeoBBox("trd_I_slope2_keep", I_width / 2., I_thick / 2., (PilPosZ[5] - PilPosZ[4] - I_width) / 2.);
+    TGeoVolume* trd_I_slope2 = new TGeoVolume("trd_I_z32", trd_I_slope2_keep, aluminiumVolMed);
+
+    trd_I_slope1->SetLineColor(kYellow);
+    trd_I_slope2->SetLineColor(kYellow);
+
+    TGeoTranslation* tz01 = new TGeoTranslation("tz01", 0., 0., 0.);
+    TGeoTranslation* tz02 = new TGeoTranslation("tz02", 0., (I_height - I_thick) / 2., 0.);
+    TGeoTranslation* tz03 = new TGeoTranslation("tz03", 0., -(I_height - I_thick) / 2., 0.);
+
+    TGeoBBox* trd_I_slope_vol1_keep =
+      new TGeoBBox("trd_I_slope_vol1_keep", I_width / 2., I_height / 2., (PilPosZ[5] - PilPosZ[4] - I_width) / 2.);
+    TGeoVolume* trd_I_slope_vol1 = new TGeoVolume("trd_I_z30", trd_I_slope_vol1_keep, keepVolMed);
+
+    // set yellow color for keeping volume of I profile, seen with gGeoManager->SetVisLevel(2)
+    trd_I_slope_vol1->SetLineColor(kYellow);
+
+    // build I-bar trd_I_slope_vol1
+    trd_I_slope_vol1->AddNode(trd_I_slope1, 1, tz01);
+    trd_I_slope_vol1->AddNode(trd_I_slope2, 2, tz02);
+    trd_I_slope_vol1->AddNode(trd_I_slope2, 3, tz03);
+
+    PilPosX = AperX[2];
+
+    TGeoCombiTrans* trd_I_slope_combi01 =
+      new TGeoCombiTrans((PilPosX + I_height / 2.), zBarPosYtop[2], (PilPosZ[4] + PilPosZ[5]) / 2., rotz090);
+    trd_3->AddNode(trd_I_slope_vol1, 31, trd_I_slope_combi01);
+    TGeoCombiTrans* trd_I_slope_combi02 =
+      new TGeoCombiTrans(-(PilPosX + I_height / 2.), zBarPosYtop[2], (PilPosZ[4] + PilPosZ[5]) / 2., rotz090);
+    trd_3->AddNode(trd_I_slope_vol1, 32, trd_I_slope_combi02);
+    TGeoCombiTrans* trd_I_slope_combi03 =
+      new TGeoCombiTrans((PilPosX + I_height / 2.), -zBarPosYbot[2], (PilPosZ[4] + PilPosZ[5]) / 2., rotz090);
+    trd_3->AddNode(trd_I_slope_vol1, 33, trd_I_slope_combi03);
+    TGeoCombiTrans* trd_I_slope_combi04 =
+      new TGeoCombiTrans(-(PilPosX + I_height / 2.), -zBarPosYbot[2], (PilPosZ[4] + PilPosZ[5]) / 2., rotz090);
+    trd_3->AddNode(trd_I_slope_vol1, 34, trd_I_slope_combi04);
+  }
+
+  if (IncludeLabels) {
+
+    Int_t text_height    = 40;
+    Int_t text_thickness = 8;
+
+    TGeoTranslation* tr200 = new TGeoTranslation(0., (AperY[0] + I_height + text_height / 2.),
+                                                 PilPosZ[0] - I_width / 2. + text_thickness / 2.);
+    TGeoTranslation* tr201 = new TGeoTranslation(0., (AperY[1] + I_height + text_height / 2.),
+                                                 PilPosZ[2] - I_width / 2. + text_thickness / 2.);
+    TGeoTranslation* tr202 = new TGeoTranslation(0., (AperY[2] + I_height + text_height / 2.),
+                                                 PilPosZ[4] - I_width / 2. + text_thickness / 2.);
+
+    TGeoCombiTrans* tr203 =
+      new TGeoCombiTrans(-(AperX[0] + I_height + text_thickness / 2.),
+                         (AperY[0] + I_height - I_width - text_height / 2.), (PilPosZ[0] + PilPosZ[1]) / 2., roty090);
+    TGeoCombiTrans* tr204 =
+      new TGeoCombiTrans(-(AperX[1] + I_height + text_thickness / 2.),
+                         (AperY[1] + I_height - I_width - text_height / 2.), (PilPosZ[2] + PilPosZ[3]) / 2., roty090);
+    TGeoCombiTrans* tr205 =
+      new TGeoCombiTrans(-(AperX[2] + I_height + text_thickness / 2.),
+                         (AperY[2] + I_height - I_width - text_height / 2.), (PilPosZ[4] + PilPosZ[5]) / 2., roty090);
+
+    TGeoCombiTrans* tr206 =
+      new TGeoCombiTrans((AperX[0] + I_height + text_thickness / 2.),
+                         (AperY[0] + I_height - I_width - text_height / 2.), (PilPosZ[0] + PilPosZ[1]) / 2., roty270);
+    TGeoCombiTrans* tr207 =
+      new TGeoCombiTrans((AperX[1] + I_height + text_thickness / 2.),
+                         (AperY[1] + I_height - I_width - text_height / 2.), (PilPosZ[2] + PilPosZ[3]) / 2., roty270);
+    TGeoCombiTrans* tr208 =
+      new TGeoCombiTrans((AperX[2] + I_height + text_thickness / 2.),
+                         (AperY[2] + I_height - I_width - text_height / 2.), (PilPosZ[4] + PilPosZ[5]) / 2., roty270);
+
+    TGeoVolume* trdbox1 = new TGeoVolumeAssembly("trdbox1");  // volume for TRD text (108, 40, 8)
+    TGeoVolume* trdbox2 = new TGeoVolumeAssembly("trdbox2");  // volume for TRD text (108, 40, 8)
+    TGeoVolume* trdbox3 = new TGeoVolumeAssembly("trdbox3");  // volume for TRD text (108, 40, 8)
+    add_trd_labels(trdbox1, trdbox2, trdbox3);
+
+    // final placement
+    if (ShowLayer[0])  // if geometry contains layer 1 (1st layer of station 1)
+    {
+      //    trd_1->AddNode(trdbox1, 1, tr200);
+      trd_1->AddNode(trdbox1, 4, tr203);
+      trd_1->AddNode(trdbox1, 7, tr206);
+    }
+    if (ShowLayer[4])  // if geometry contains layer 5 (1st layer of station 2)
+    {
+      //    trd_2->AddNode(trdbox2, 2, tr201);
+      trd_2->AddNode(trdbox2, 5, tr204);
+      trd_2->AddNode(trdbox2, 8, tr207);
+    }
+    if (ShowLayer[8])  // if geometry contains layer 9 (1st layer of station 3)
+    {
+      //    trd_3->AddNode(trdbox3, 3, tr202);
+      trd_3->AddNode(trdbox3, 6, tr205);
+      trd_3->AddNode(trdbox3, 9, tr208);
+    }
+  }
+
+  if (ShowLayer[0])  // if geometry contains layer 1 (1st layer of station 1)
+    gGeoMan->GetVolume(geoVersion)->AddNode(trd_1, 1);
+  if (ShowLayer[4])  // if geometry contains layer 5 (1st layer of station 2)
+    gGeoMan->GetVolume(geoVersion)->AddNode(trd_2, 2);
+  if (ShowLayer[8])  // if geometry contains layer 9 (1st layer of station 3)
+    gGeoMan->GetVolume(geoVersion)->AddNode(trd_3, 3);
+}
diff --git a/trd/trd_v23a_1e.geo.info b/trd/trd_v23a_1e.geo.info
new file mode 100644
index 00000000..827212cd
--- /dev/null
+++ b/trd/trd_v23a_1e.geo.info
@@ -0,0 +1,126 @@
+#
+##   trd_v23a_1e information file
+#
+
+# created 20230621
+
+# position
+410.000000 cm z-front position of TRD in hadron   setup
+410.000000 cm z-front position of TRD in electron setup
+490.000000 cm z-front position of TRD in muon     setup
+
+# detector thickness
+284.000000 cm   end   of TRD (z)
+
+# layer thickness
+71.000000 cm   per single layer (z)
+
+# extra gaps
+ 0.000000 0.000000 0.000000 0.000000    extra gaps in z (cm)
+
+# generated TRD layers
+  1  2  3  4    planeID
+
+# dimensions in x
+-312.000000 cm to 312.000000 cm x-dimension of layer  1
+-312.000000 cm to 312.000000 cm x-dimension of layer  2
+-312.000000 cm to 312.000000 cm x-dimension of layer  3
+-312.000000 cm to 312.000000 cm x-dimension of layer  4
+
+# dimensions in y inner modules
+-256.500000 cm to 256.500000 cm y-dimension of layer  1
+-256.500000 cm to 256.500000 cm y-dimension of layer  2
+-256.500000 cm to 256.500000 cm y-dimension of layer  3
+-256.500000 cm to 256.500000 cm y-dimension of layer  4
+
+# dimensions in y outer modules
+-247.500000 cm to 247.500000 cm y-dimension of layer  1
+-247.500000 cm to 247.500000 cm y-dimension of layer  2
+-247.500000 cm to 247.500000 cm y-dimension of layer  3
+-247.500000 cm to 247.500000 cm y-dimension of layer  4
+
+# angles of acceptance for inner + outer modules
+vi: 30.11 deg, vo: 29.23 deg, h: 35.20 deg - vertical/horizontal - layer  1
+vi: 26.56 deg, vo: 25.75 deg, h: 31.30 deg - vertical/horizontal - layer  2
+vi: 23.70 deg, vo: 22.96 deg, h: 28.10 deg - vertical/horizontal - layer  3
+vi: 21.38 deg, vo: 20.69 deg, h: 25.46 deg - vertical/horizontal - layer  4
+
+# inner aperture
+v:  3.69 deg, h:  7.34 deg - vertical/horizontal - layer  1
+v:  3.18 deg, h:  6.34 deg - vertical/horizontal - layer  2
+v:  2.79 deg, h:  5.57 deg - vertical/horizontal - layer  3
+v:  2.49 deg, h:  4.97 deg - vertical/horizontal - layer  4
+
+# z-positions of layer front
+   0.00 cm   z-position of layer  1
+  71.00 cm   z-position of layer  2
+ 142.00 cm   z-position of layer  3
+ 213.00 cm   z-position of layer  4
+
+# flags
+support structure is    : included
+radiator is             : included
+lattice grid is         : included
+kapton window is        : included
+gas frame is            : included
+padplane is             : included
+backpanel is            : included
+Aluminium ledge is      : included
+Power bus bars are      : included
+asics are               : included
+front-end boards are    : included
+GBTX readout boards are : included
+
+# modules
+     mod1     mod2     mod3     mod4     mod5     mod6     mod7     mod8    total
+---------------------------------------------------------------------------------
+       10        0       16        0        8        0        0        0            layer  1
+       10        0       16        0        8        0        0        0            layer  2
+       10        0       16        0        8        0        0        0            layer  3
+       10        0       16        0        8        0        0        0            layer  4
+
+---------------------------------------------------------------------------------
+       40        0       64        0       32        0        0        0      136   number of modules
+# febs
+        8s       4s       2s       4       12       12        4        4            FEBs per module
+                                                                                0   ultimate  FEBs
+      320s       0s     128s                                                  448   super     FEBs
+                                   0      384        0        0        0      384   regular   FEBs
+      320        0      128        0      384        0        0        0      832   number of FEBs
+# asics
+       10       10       10        5        9        9        9        9            ASICs per FEB
+       80       40       20       20      108      108       36       36            ASICs per module
+     3200        0     1280        0     3456        0        0        0     7936   number of ASICs
+# gbtx
+       12        6        3        0       18       18        6        6            GBTXs per module
+      480        0      192        0      576        0        0        0     1248   number of GBTXs
+     3333       33        3        0   333333   333333       33       33            GBTX ROB types on module
+        0        0        0        0        0        0        0        0        0   number of GBTX ROB7
+        0        0        0        0        0        0        0        0        0   number of GBTX ROB5
+      160        0       64        0      192        0        0        0      416   number of GBTX ROB3
+# e-links
+      160       80       40       40      216      216       72       72    15872   e-links used
+      168       84       42        0      252      252       84       84    17472   e-links available
+    95.2%        -    95.2%        -    85.7%        -        -        -    90.8%   e-link efficiency
+
+# channels
+     2560     1280      640      640     3456     3456     1152     1152            channels per module
+      320      320      320      160      288      288      288      288            channels per feb
+   102400        0    40960        0   110592        0        0        0   253952   channels used
+   102400s       0s   40960s       0   110592        0        0        0   253952   channels available
+     0.0%u   56.5%s   43.5%r                                                        channel ratio
+
+   100.0%   channel efficiency
+
+  65.15 m2      total surface    
+  59.82 m2      total active area
+   0.72 m3      total gas volume 
+   2.36 cm2/ch  average channel size
+4245.44 ch/m2   channels per m2 active area
+
+# gas volume position
+   31.6000 cm   position of gas volume - layer  1
+  102.6000 cm   position of gas volume - layer  2
+  173.6000 cm   position of gas volume - layer  3
+  244.6000 cm   position of gas volume - layer  4
+
diff --git a/trd/trd_v23a_1e.geo.root b/trd/trd_v23a_1e.geo.root
new file mode 100644
index 0000000000000000000000000000000000000000..5650e7c143af654a81cf27d5ac518f3703fff49e
GIT binary patch
literal 22876
zcma%jbyS@()91w<io1JpcPZ{(q_|6Q_W~{M?(XjHZpA5F+@ZL;?WOPg?b$!}oZWlQ
zg=CUvGD&8hnf#JmM>{)b0N@$``j`L!S~>uLMmQ)f1Nwr4zH*SDKc)bH@CX2a)eite
zjCKq9B!zmGW&jI`0pE2FD*gZZgaAGmsW_BlH2^pPV4yUpH2?rgO~TUJ6vNrkMBkN_
z%}}4kl+oPOj?wW$sQ)_^0QJG+A0Ggq6vRUAe|P}^n)UxL0fkmUa)1>L|9hVIpByJ2
z&!eeHn%b$`S-aSnesOX#wK1~xK=?m|0(_H$O%(zR7lFBho%+D}Vg5<{>+uIcJG^3+
zL>YW+Q>L1|{2V+lhbEw9z#z@mA_vvN8V}OBVH-_;K7<!Ne+P%4TfvBGh#?dWJqs_{
zAVPbH@~CBhIAUgof_H=RGTZ6w>S&>SQMXyo_?`{R`D^F>(K_!l&;7b;vDi`3b1!;n
zx-aw|xB*4M1+gvV3IN)<fyr)FO?72na}E5#nCDeZ+27o!cLzcBr4mL|_RY`yAyaDY
z;Xu(|yCcWr_V?Xg5rf}G2RLP!YK%56p;*~Da@WmBQj_sYQZvEa{LFe=YFC&4)1eoK
zJGg;e7mA)<zz?qq%jMZwy{~JUx`FQjB!y2|WzW2|HWNdQ3~XH17FsJEL1!CoSR?^H
z#cTon@;^chi2vx<6f49Y*N?)q$Q3+QAmp<n_x9UHX$N7S^z0;~!f4vlg81t@DFSdh
znrt42I2h1i#QKLIun2ZU;dyEekU4Z?kRcdyqK`-zr|nO$vi*XL6;U7raJG7FW%jqA
zV4X+hz?Z!c_`#HLA=`d<&0Q@NMK#??gdc6LS*jB9U00dM+_O&9o_Do*Apc$;btYV|
zA}Ab|Lfs77Xgr)WpRf|`1w6p(^Mdj76PwxsXc8z&_o@7Zz!Cyd&UR4SXNN@}jn^~%
z=69Zwh8yVZ)>^Ra(w=ZP*voN%-aXsm!PRzJGYbt(MPZ)TeY#=1j}wz_dC`YEY0(~6
zYv(={KTw*_&!)gPeST^k??*+RR!momz`b1&{{8t(9}p55Nb)waihIE&JQntvCA8B#
zCHNG8BWPBAl+9m9{;H_0&vTVzXdZTK-jzk<GF!O4&xW1hb^rb*ogrufWy5yvb(g<W
zW9W`v0<Scb5rFn;yqo-xpNy7xmDZ4FAtOh#a!?g$rx)XE{+sD-Z)g##c-F4!;fZ(%
zrB%pBf4p8_&*LE5C3{~p%$x$}A$hrQQfo45wm@rjy}`CWtte`t$%Vp}<M*Rs2XV+m
z2}?pmp^y9c{Nqca-&p$vVq)o)x|K#NG(Xq{)Epk*Zh()y%GyqMJtR#BbGBqm)aPQd
zFK9<AvTolFKfPO6G=MouJZS5ExBd;K8xoGeL72t@U!HINx!<SseGbm#d}=ea#+P)2
zuyXucnR;X3=ItllfW`L2t%+|)`oizl<pc(*D<Kr_*))Ut;XZ=F-HjKR=)L{dOwiKY
z2{*d8jHNAQNEB}MR@uG~-F*zNv+3A5B`?apV`~Ufox7r=-u#07Tw+n?hiXx6z9uf1
z9CRqnr#@C$cxR%A?gJ($G^l{Z8Y}b5%TI8DC~sv_(VB^&5atUC&kHEBgC)V|8ID&u
z`!|w}9idNYJV^O=LK45zeD}Xb2FsnRS29k_Sg}C+_sSE{NArAROhI+;y+M67ujt-N
zReQRm<2%#xxeGp|Uet9t3`j02Bz}IR5+Usj_dOF5y+a48o_vw<E1;>b5MB<hO9jvI
zHw8?PW}$GzF=H{E1Ao2YrH{$WjsH~@g!hy6ULfbr##e+u>8^iOQzys!4$kY}0W916
z(qi8qbh%l2Fm9PV>QDV=n~lFz6)tO@`9e(4owJc+0eZ9dI4j;0NzplPF@5=j69>z+
zS#O7dqFd(6aeYdV{?<aGp0RgwlEzgR%Gu8drY$>hdXeff5lLb*?&e`aSJdoFslRQ2
z8Nd^hN(A*iM)D=Bq7QO^tAJbVw<FmhW9L6mI~t9g3ox6gmpI*Je{AdVaiW{2Be)Q|
zpRJaw98CCAZH)NQQaG|Ci6P(B^sT%Rg_z0;1O{x~(E->`Doay`-<GuTsiFP`ZXM0Q
zV;m~iuwg3&$$n-gXz5>2$YB@zDRR`C$>SGC`zc{`Cg(;TTn70kL4tv*(@p|_hAa!s
z+Nx>g1e&r(+hR$6gJFp=$VszvRvGT8G%BX40`i83vAyvk{3-qKI$bMmvjWHC?6h|%
z(uDnm*jbFOL{$1Whk09c`lRrs*CaF5g;|r(-$!}}QYL6Rb?lg7Bd?dMsUyz^CHLZ8
z4eWy2X@{GklOY5Ixe$m?u>q!l=^zH<zs+XcTyQ5fjrjDg5yl2zo;HIzd3xe#Ll`F_
z|MWgU!x#?Jww=U6CJ~6+=OXkO1p}ay{26O#R?^E87;AD=px1r~>)pwL%YNY((X{5W
z+%;7K*KCnCpw=;6yo-m%%3=$rYY&rz8m~H~iR?g>7EYGSt;4@b029DF0)$85!zb#(
zk6Ge`b2fw9gl)~#P}E@1v~zfzoLxZH*vI!MaF5x_6ScQ%fNR1huBGw2x{0A_!Y6#B
zG$t9y5{)17BjDK)lGZ>a1qizA^nqixMD2W^!RS{hYS63d(udE^G66{erd-i$dmeKs
zg2Lmnzt(gsi+Iv`s`zmD3;qaN{HFN@nU;lvk+nZ?zALprZ&^|pSq1(Ttkmld!NHn$
zb8qi+0()cAoWSFdbDsH<*9IiDHw`uSmZB0FplTa#lAe_aEh?rryRJT+1ljUsjj5aY
zgyRxQr?h7;?B-I4___TZuS>S$A^-H}kN0Glf%f65_T$6z&gIJbbV^#%J;(tZ3R>Gd
z2_n^PgH~5VGdA-d!e8DwN^kJb*W8xk;LeNPX41wMG-eOR2QilzYl>qBv3IjOlTiBu
zpxU<Pe%D}Z$O*$qqgUxB%*RH!pZihwp$8RnRGwRCH|JHl$h(tnN;>vUKYwxW`*hG!
zR|$@c|6D|R?HVV>AN>thvx?mWPM?K{zk{)T003mO3^^eb+M9_S^au%Iut1M_%AAeF
zeiS5!C3^~Vt|6XGPRA$d$*sJ%lqyqU07DEw1G}iMAk|7x5(TH(g3=N=BuCctn8!?B
z{EbGwXt%=q`m9*IQH<H-bA~pj;p46F?6!_A+5I}{Vk()rQt25`4)~^6Ks@;^n<Wld
z!bB-*@A=NHbKUN%vEM=JIiYy0_}S;V6T91a;D;~A>yK{x`<3_W>7yHt?BDAyr)i6`
z?L@XdzU#zqRL^iHmh5u$L*0G1<{>lL0^X%UEmfgUPE77(EkOY8U7e){(hBb6&x5Ug
znAG3Ly)lG4R^^TDMS_wi-9?~>{HXzTJScun+XXE1l@tKR<kCZDAGvNbMVIZs1uBx;
z7?tGA3dW^9%8sa{WRr8Hyv`8Y^}?!%w40;!d~@QuYr-|7dm^YF{X{O0Xcx*U$5cb`
zA{s<@T*E6d;|Y24Gat*66u05L_to3g5$E8Pizi8qS2Z2&x~uhLy(|j7F3(kj_qOv*
z+pieTG%{ZXa3I0C{I5qEW>|6Qf>ItXwUeu@y1&xfn8s(x=r7psG{KyoWxolbbi1C$
z>~yF2dd()H3oSox)ae>1s<N&Xee#ll6Oq>19DnR3msU}s+=TP9wt~%p(VSUtNUAfm
zW_eGXhkJlJ7E|x@2HUF(^bz1ivtuLkbDM!in&OuTt<tHQ&vTN@^Gr$z(Udw9VG}`6
zV6PXWxV<o_WaoXb=-f|;rKprpo4nq$-b{_KhH!t-rI0@TvgsR5$NY(4wI&t<$J2%d
zK|*J8f!m1_mQ!RYGNbS!90#p7;qQ=ETCwby)`ap&Kr_Acj$;#5gERlzK4iupf(fX8
zuOV}=Ya(*6Yer~A$oijv`kxD24EhUAzCN-Fyg(7P`uds~e)SdW=`G`FL%i4%tx!5j
z<CwHZb~j4bM}j7cT{>g{%2d4;i=P(D?sQ$|cdUbmn6@bJDP`MJ#ICPco*i(3a%iS6
z0LRLR$@zss^XHrEPTNIk`4o+%+4bdypph(U9JQ1!s3n6M9eQ^^^ojw*(1M3NxqRvF
z_jNWGE}vul!2!X;cC6^GTy39>JnHEar{>oDw{d1vlUF2gmEq@ELPB{0g<CMiU&H7$
zQpbzzmEYmgEA?eZgJ87k>hG}lPRdtyVO@)tBF7UA+|J@k&P^v`G|H-DEScQDWKE3u
z=Y-yzkssguG5>M#qUrCSHD$tJNm5t#!XlTmrTqnN-KnRn$%R2Xsj+gf5hYw^eJ!qP
z-3Aq_pS><EMv?|sv=f26+CAy^mJZX9uNh})@_P18SB9Sd?Va=`Hr;RjJaN!H)W24;
z$buz}xye#@U8K^~RWc`g-JDg0{7;Vqa{{d2vHNDq;AsDhD}cI#>^r^8fd8WI<%sBT
zC$+?@_pB-te~p`GyPQ3y#*6czjfT&K`K29`pr)_rX@@NbRw1oG-w0g9pAa-Aoa?>c
zCDPTV5W9-D&sWmHKE#p<$H<+h*o~z(Ht5x!J|3gPht$x~S(g{8@3Fp5#dZw5e{=HZ
z6kmO(i-dmaa3Iwn#jCd~2ddm2)-xMO7J3XME8P34=Q{PE8*(*Qly<h-tOb2#U?4Q4
zOsh<=z@t-Ezpj}A^EczMnn!YCs`DBt7tP4L@4a^avKz!ZU*&AUajaCeXxdQfkb2f@
z-+6DUweh##-z)SbN}cQ{wuwve{74ben#YOTJtoIJvG3M#zCJ43Ise|h*VJQywu|Ik
zT+*lZaq<&y7&b|kYQjN}WTwGKL9B!NUi2-TI!h!$s9JB+$>}LR9k_aLJ#spfE<fKQ
z<tQ3A-ly;b)Vj>zLY`OFi=?;0%yiQ3iL>??vyR^71(zF5Fk4nI7{xHPwEB^d9QJ!m
zRiT6_2m&e1ZQ**kSvhYORR@_l6s*vtW4vZN@AH**@wDJ=B<Zvn4N781Md}(b*Ejz~
zcw1C}{<T)xmNlocYH$B}ojTU^7~T?G<b)NGatw)B3tY3Z8!|;{yiX8?3&EGTG60HK
zL=c7f=4-(`9S}3B0o-$s`_6T)yyxQCbW>jL`Vp9@2R84k+q5aba8A8fr^NnejdI)3
z9a7Lz2b|ITN<`(cW=f~(_ormKDR9MIxyuH2J1YdHUbV@~$EDga-1)pZf85MWzLg-)
zwt$sbf^X#Z6y{?53<i+A=AO>h16HsCydu|uK>5LE_g-ZFF8LhwRm7|iKx3<o6OBnJ
zkmO4xcjPy<hF@PW5kEJDBOUqKJs}?XRR@0A!%+}Ea_s<okzbR`=?mW65=`Gj!7(6l
z5wY+4Df8WT^3!tswYvwhd**)kaC%0utv?h$A5Zq=rbY`~sxO6**jeQz5v3N*x!@zG
z%cS~WDgi!b4Ix)Jd#E|6J#l~uu^S$7hpbt&oBr!UxT5v%9^fOoFXs;4X?wsT<W%C0
z+^P5Vu=WPG$J@kHbHh``kHyzt(Ib`Tk8$4@*>rwDDFRGP@swiHIU5)e>XA4?sPahq
zt?~P=A{Ub$z-11f2)bN&)$E4WEs&2ef((T&F8KMN0NhZ*PD-oQW;##rTZ=80Lx)pW
zD<!Xg9sKR+E;DcziF?deIRxb@(KA`;RF92i2RgU6>&qs&Z8j&P6;`g7XHSX0Z(l{D
z@=ZkS{tnRaHpAi{{#6E}D8@?n*9=g!RRKwU2xbGMK#oIln<f+0Jr|#y^kS7tY9V<P
zPd#4qifuqILyU85BB!E8dBC)ZzSE;Pm1Fo>KoC77ssbQ?EME^V$OJcwVOJ~}m>JcJ
zF38k2i%GbCWZ|J5yp3HSm*%saAfZ*&Fe0NxQk4DRF2X4_rtBg|;WZi9aU?7BsC^e7
z-y<4wN{@s)4}6?}mW_b7@8@JmP`S}zw+}*Qjn@CuAgB}zv8i_P=}A1|)k1IzIwNMS
z?y_3RzgVi%eVDEOOgpz44yFJ@T4@zy^{x+vU8i@{f7E1h_q@-BM(_FTRS0M|iM|h(
zt9g9EFu{IRn@<?#jDv`NDtBuv6qLeazZ6*fyYnH4!T@*~0@go3&S((fZLyh|9L-Gz
zhvPb6(8G-S69VV3m=XVOr<v)^7LD0D+qQ>Ua19KR#q+9Nvf9g75=5*1-ovc72o>?O
zYR!8`kyk+;Jm?e~31^6@%}@D$;xIgGgM|eSr|E#z0B33se5k=#)F1)rZs~8*EqT4_
z6Tsa9{6tyD3!ko{Q%oxi9YHO&_~!e3-h6aQS<LAO$#B|N+Q-r<RZL1ZVGH%ZMqy!i
zY-jf}BRuVql2Z5%Q}^G`2GpvU{}fyybvV5&$F}f`xN0YH);5)eG#Hn_RbqDD-GUmF
z!1tV@&-)C@2PZpt4cMv89j3aH-(ixR!EwrUU>sR{`dPTqP;?U04rEy;cgyqlk<~ff
zeiawx)VD&k2?ocMp0aoQ#gvE>@{d<Za1E#NZTfOh-s<@CnB{~|r11gqnW$v)Oq*$O
zMSXsGJCCh0Mrs*1!1+}_v6?OQl}JRMrlvGC^LciG_vP!Aq~i#iV0^+|f?f5m@yP@O
zr`<;UH3F447~Eeip|&l_V)#c%&D0*ey<+UQHd%hcNi_LoLI*lt|E@CP1i@C3dBDY-
zN7t^^o3)7Ls)#Zooca|_5CujvXeKi_3|j2f*9ih^0n8^fLw>z?d_@WP%#Nwsj0STi
zc1Ft@BgcfF$0TRVRydxB_<l%9+@J#=1?AKJETCTZflHu#wjJmenD#vB%YV@wnAPl9
zT^=9`o^|4EhOOAzt)QRtIUA?A_%pE$C4LP3K<e~Yo$*q1GsuC|;eqQVJwV8F&-C3M
zz=Z|qo}M(}+$U>v>|`=pL;)6wEBKfzXpTj)UHb@zrQ&)(GVi2|+YlC6XgZl_SOXe5
zoSs8;S2v)l^d3}f-Ur;!H@DoL<FLV3VV{Lld+{n*G{2gzm~Jzxm}wqcSqW1-RG}cC
z4DH-WJq*u%#T`tARjC+S(5`Vg@9#>gZJr3~^Ig5~R<sx#&>J^aHq;*mt}MtH>R&Gq
z>()$FLw6?M-$rx_%&P*Y%6JFBylfy_;H2diU~lwJs9EmrU{wvfK@$UUCvw?UQe#&_
zT5gVFjd?eI_DT$M!f`HM1rgHwoOv!)w&wIIzw<qq;c$nJOhF_2_WbBL<L4b*-^9M6
z*~#f;L!YmxCFTZ{mvhadc;G9>(0Ue`IxyR7;1C)3JzZZ8s9{{mTNW*6JCQJ?1l0GP
zIb{UWb)H+E6qgeCS!O^m-~Q+kozKh5{KkkV4_r~@R{in!8e?+)M{$v=Y2fyW_cLd1
z_-B}Y$PO5@G$*;lKBw>2Oa^1uf>T>^9`OAP=q_Nk8M&k+F5r4K5YfX*!ih&PS+GLi
za}cnCsU3+l(0Nd<)l^->;Q8b<r9A@EegP+-5?F3B5SAh(M8)u4p0B!&GV&{NoB&ID
zyIM^>XBRTraD3jMP+fu5J?M;3uEAT*M1?_!&v>d_&onbl10c#9ENPou&ouEbQ$zO6
zpjEqG1SzaG#(`8-11@z^g$iG~h^8G}c-!JosqcyW-n>w*qEq6t^w6P!!E7`zrA}Dk
z4c}n5hNWmKQCUW*EFuRVqt~?jZ|4s%`C+kb-Ot@G=CAh}5QJ0@1|GVr;VXVWpcQ3=
zi2q&F^l!Z63cEDBqk`TMs_t3Vl0J<YI{vCb!OWIL5BQ$)lN@%DLaerRIys)?pr-I|
z!>VHo`1iSd_yjRJ8>l3KMi@%y1VJ&3IzD8znZ)^)QtMMOOs`)C!oAXFOQ{Gn*%}6>
zWl*jQ;Mj#lF)O0Wb!aJSi8$;Fec9U1C)e;5Sh3Rfp(FnQ2mUGrTrzA;`3XF4K!t@;
zjXja4-0MOO^Mik;eMOPFjp8$&W{hBqp&fFch6P8X64b(;;^%(=12`R6(B~RFP3X3s
zIxkRy=r#bp0y^mn+}}QVaK5e2?M>P2H5UNBs*|%U_zDR<lPU-!EXnAPC4ZGbt*Jq7
z@W%F0LlnLvVVL&qrV^BTKY42aaWo@z68NcY33$1GAQq?Y;Xht9?YSSUJ6jY_7=k)1
z+Ayr#L@_lZJEr@;R5^#17<t4p<=bcHUnrEvb8-C>>a(uF%vVK(+580w@4z7Dcq%X<
z`Bbdh!#qP;HP=&9JaVSa98eRc=a9~{ny#l{VX@d*n&F2KtYMO<b>RryF9yjvP3x7I
znwK`(J1KsSlK!QiH?<yCOK3M!c}J7cBN3!<RUvxNYZ2T71Wq#;Ui@|M&cL%;aAJZ^
zBpf&+L5pnr*|g=TQgUzU<$mC#_@0STX3vG%+fT<j+&m&;4pS&prC0Tdc~?k$EpsL=
z5>|?1d6{qB0~#k$%TXzswAew1QLNv)R%jkQl!ZaA*)^m<53G;2$g~C~!;Z0q#$fmy
z0|yq_mP}ozFL_%*(apT~p@W7bjuOtCLlVg{lLwzsy2jERe9|gvKL9oV;umc%c9Xy2
zXZ#dZcku9>6bTA1^(*hu6b1S%8B;j?CA71yJU;-;@0o!f<DAdBTUmS8WzK1J?5)!_
zwng1lGT5Rf@<`m+u^f@E!6RmT$rQcApVejy1&i8CWMJ$^aMNns3r6E?^DAjJlAhw2
ze&z-i_&wAqD-JMeKr7PxypYxNA9m3T`V`J~^W<m>_$m~5B2h22CcbKYS%DLf&cJ0t
z-6pK3jZbrhZZ-SWf6cvVLAXFF4s-QpJkB6W+}DD$d{fx6t-~dcOz2OpB+=whBUIDV
z-%ST}+gcT53S^zPXPUj;6J<A9+G3}5g`T~a!i=Ex!}?r;Ct?$t;3{yGJ*xB>s1^bm
zS=K=Q>1nHMwuK-^Yc^+{hg?y_B$IXm>VXA}bJJ)ND8$FGDQOu|g<nd2-{3_2*VOpK
zu?^x>26rH>1}Qf~VU@^bcntIK1&FmA5F1OlSrN<Znf9EkrgD&hc+iQ-(~t$WeF&fC
z=UpI=HgrMKOo7KR#<%>4+%Od<>BwmQZJ<vCGn%i!xX(oHI>(eOJ-$U@x~A}6B@`Sz
zl6$_D8KRoe2B#ct;5#(V#ltq9U^n|4Z)D2)kJYxsMQHczZ{TB;PoQn_kHzeMNwCo|
zuFQ8F0QupiPi;C5TB>Es&zdqew58)1#3FDA9Ev5)A+`1h#*O*!JeEQ@CNb=x_72>o
z<6O7jC{9g@eilfJg!>oJf{J4s7NZg4s5%*-<8XDmN*Bp2sUdMF<hOMYDFQzpk8RNC
z0F_fRA;-0Ot5%E8Di|_LrDe2mOWkE4c>FoYfnFWs!ljp2`9?tR@>rypoyah$Xsfsb
z+k-(XFC;FQmBpEy?r`Td7B`K-HT_AbML7VHvUrPkR3p0w<iA^xnuec%XmexdN%yD@
zV+5P_pPMz&2RRUfLT!qMm=-9?*dWCL5wjal^xTDtvn_=;>6@V!pJcyk*Bn^LIA|ry
zPSfXL6<(e4E|Hb2*w;|6C>t0}<Q?E6C1spne=6UtxcC(ABLsbd=?(^UR_GC|={`PP
z(l}?;`Vo%lnV+A8HLpsq$*>$wqOm7;7Vr*25Zv<58fGyavcw;va>P7FEXKjbhz+O=
zpH)#hJvJ+wgfcOX0oNK$5I>obeCj8&Ao=x+UvqkBZR9K%qh}&P%Tvb}`Fsxdb;6V>
zFp}PsTlpdUM`&clnZR7~_xY+%(lS04!MO~3=Sv3q<<IM>vF52@*R5jo{`f<t+<J8=
zZ@FuZSzi)5&F|N~H5HigcDr(}wDXUvO$~9CF}{$4ss*A2L=ANZT1=N%OEYkxUJ}g<
z8q(@#TE-6R>F4<oE$q!w<Px}SlO<Cf8hDHGpA<iPyC@q@6-tX}UBW**Y`n)p+<Ds6
zl++x6D)M^=`b=n_w;Sk3#DS`motDA{zS38G`;s0){fPHWDadj3S|}}b-pVfBC}5sj
zqYv!T+D1k3s=Ock<pY6fR@y|(hH)o*-mwDal@Fr5nt&pRJtbgs=X)-~-5|}QPFlfo
z)|=8tNRf&ROs``Pb+5*T6CA8#FS)N{m;RfI8u+@0y|xq3IqRhi3O7^@lcrTa!#|(4
zza9B?E<ES;bp_QnXG^L9H`;~`KY|aY&nMq;y}XpA4ZEFsd60qlor)L-_c7~>ps>g)
zzVB@@*<7b)(GwKAEVA9j)~<(l#~KTx(k-)mkQ9wh$c;Oj@6z^qymW&UZkX?=Rr9uy
z!Ki)2RQ;(ZAQZ)t^UD_ZN~{8Ei8v1ruAR@MX{|iBB{NvizeatgVResI7*o#FJiqon
z3l08t-~<C<%l*RxT+dG!+l8mB6;}lMmmtv?G2hZ2outbS18~GbF9NsYLZEK11X*W?
z%@9RLVb*>V=R(YUucS;=bswhVbG#wS1B2|BH%GO*Fk$mLdq5a=Vm>bkW>VmiAO4sy
zf}U{Qv?)*7k=R~I4JMLaWnjn|gXGt>kmeYI0j(dD$cJ1PbgQ#Wqu77O6_vfpO$Kl}
z0>pYD9_|T`GD<MYU(kaZfMT{rXDU8pl3@0sQ@?_)r8#rr;W@-C_}HJ$te{Z(0`WN&
z%L|Jq$Be&fDDMB;<{9?C3>{PcYPb9vF|2Jd^gSrN70q07DEccQsekGv<!U%6qWOw5
zp1;YkN452zEgTCz#x{@CfMAVnBUYlV)Qo<6By6iE6@9ChQHqdKLy+M*<$h1&<^7i2
zs8(%dgV>sRP!JeE4HSXOLcp9BS_uQJb>eNnr(FhZS@|!<Uh1n68m_~#t($=JaD%fT
z@WEO4<q}}d0HcE6j6=Z-Guj6xb%aODI&6J%nNAgw6Ki1;4D7)TgjuvW7<1$dV1Fxc
zs|;pgvgX|EA=lPVe!=Ze-di&KPF)66WrxOy&z<F=G5)D!;#i8-ZUN3hqc;Ah$LLB*
z$6yo_i%T=WK}z@=G;^Pn3AU!AGmS4t`H_5z_otf__harLD^*)G5w~C}cLbXfIp{H1
z-`Ab|s30q$KQqFngfuKcqW(By3(zvZX%C>j*^X7}hD7vXXViaU30;ME-?P1iPOn=h
zku^y@+mYIJkirOiM^+PChnUI?^~T|1<=awXEb>H0TS5l2U92T$CE_}n2;AaW9XY9S
z@kXN73^*h1=@CKc=IvJ*jr^_9(r45z4KYq~hU(>%BU_}TX)R=Fum#pc9?cqfHR758
zjaBTZR!^bL3N_03&2U9^J!l3)^6L#CyS&51F(NVi#K?oR{ixO7GzEcvOmrVl0b8@C
zBj%JADVoNRk`uI519b^&2<JKGr*NJKnFMair4}_dZThjjGk>VW^BE%iM17#1DNHhO
zIr$@tK>59OOg8tfkSco3g;tW1T^Bx1ciwX43@>w?4^9`pk*R5oqb9=DUpx{TzUd=#
zB_eH7yC>eS@+tZo{&$=9?*>cMaP&~i$;<q%*mGm6hblQfr4z<(!xVmnO3y0zh`SJi
zerBRNd!Ssv6eKL0Fl-MiC+LY$TPNd6!gIXLA_spqUHAs3#*e0^g_#-Yy=irIKhc-W
zfe5^vLL0&ZSCP<30q(zQfUb)@tb%a#AnEyC?}_7jJ{lW0b}Q6!+ffGff-!ncfCTJA
zY!{Cc#;8jNbcH(YzYisoP3;oJC^De^G~TsUP4g99i1A+Jn!iiGMNVZiZQLRih~q$m
z^)HP?A57(6DEzFFJbb1A+JVcxql{il49_A<BC_<L1$OP$w*P_qt5V`qI%Vuec}#ey
z5_7`IwXov4__x8s-Nb4!njVh`(?b8~V`yTd{e}v{@wl+8{^gz9*2VSyO_7G$M{#Px
zzgB&S+P@R=hLAI*F@nbN3A734dQQaz>LV!WCIe1{X{~<+Tq~6}pp|l+=>m<x-v)2j
zsaQ!+W$BMGlXJ@rPrGNF?~<!Kt(rN+1yu}@Op!MLbu;{glPVfCsSQl=AQsMOZ5S5%
zRC~4UQmCu;#KQ};pdkHUo-Mvdg(mt6s2f^F4pM=&{h<%eyaFH{a6BEi`mN`Q%o3)%
zoxLsn4P}xFD-E)r5gnlt?VVlOvE_x1f8(ZJefx(kH0{sNB~gciFEux*FQ&VU`l0WA
z(%QR}ZwE4tsTnPcEq}uz-pFZFs|S8;CA?H5JS>Vl1{LVH$;N$y8%z)ufgXU6l2gh2
zmR4Dba`4Dnd@eUhX$w&N^?kU)!tUD&8l(1edNAfkKn<h`n%a?dC{_)rH}IB_d7&$G
z*gX-ZkX8Xj(s;92I@|AuKV*BfCT4V)jW8%U|2&DJu<SDNtwB(}WeUi4p}mJDE>7Ro
zt8EL(Ezm9e+l${NQ6je{WJs5S(=On7SVS^;tw?-8nd5W-b;9y_iSCk^>MW7)zC!T%
z=K+IOqu?&xr9QKRkQe0}rp+9aEI1X@Wp+xFQPtG_SrXbiQ&(zFzRWzWI=m=afBw-T
z6^3}|duxD$%P#Al9u-O&h5Tbzi|oMOMR}~ACmC2Whno{AZX<-@DyhNzDMm{4H<+vu
zxZm1oT#c1*Q1bbB-oEhe^I}#kM*!cpF~+06n%h5i9kYpF2wEXUDBpqsw&2h&a7@BV
zFfUyGyqi=PVvr@Rly5K%(n>HD1y~SieL3(4Xz#Dpx483f?-<aHLYq`!4Flao>L##o
zVxs#&<0!FSbW(YUnwS)w%O#T@1Fn(8-2?AL=Uq>g*xA4o|JrNn7waL8wlS~WwM$vk
zHdVfjm&*k%g{&X-U5u52#~Us}TjY*MUV;dJHY`Jbc$552)k@`|zDO!<d8jC3Q^0Sz
z&Y!#MXmWlYPHRbn+sZeSa5ST&yL^8-g_n*dMZ1)F*)eUn1>vHB@IOu9ell#6YHh6W
zSXTStP{``Wtadk(TQXJRP)z*nWQ1;5JSylkGmc@8MjRGaky6N7^>UfjLu8do3y$3(
zSvm$~*0`kZT&AV{??RhC;8U9(5=)|-sQ%Hc>v)FA!Sk;t)M@}K6{hve-xbg5Qk<mu
zBL27@YVdaf_ySSlC@MRbiF}tdKd^08?}8QG_YUcX-g@~l(_0<{0zuL4<&$drB!y^+
z$9TxD0nm5J&+w%V0Vf`N{r%_bK7ZCPyru(o5IA`VE`j;;QVaxXZkY8jcTGS=uyE<P
zkFAE=Nr50uA4Hs?XKugRYp&ys46YVqCs4h25Jvje3x-%brF%})c@{}b4c6bZ35{sn
ztJ{;(VsafRbjZyC!agH83~=y|!6o_`=CB32^FITI9=miL_`}T*3|QS;i2Wr(C(ta7
zg>Gjfl>Ff#V50XNn9u8WX=V|Jb3-?4RO=84OjJEcPDP@ZrcRuCma!!%0{Rt(S?$#*
z{C7r}3EGbt$hgC=AGO73P9+6x5`Fqbf|eFWC({OV%}u05FV2|~z$r2x4(w3BsN_t*
zf&%V3gtb?!*!wqGur0Jdf3e+7O!7Ao_`8l|$y);>O$6LS)LpT#FK8uwnIZ`1a7c8F
z@R0rilsw;%#vgWIEeDb&|1!PTbz_0H`UFxGlwrR;g6Dl*O3!*kbIAK@StxRQB~=qA
zSsow%)6i+bZ>vws!-;_W<QdN9hpY$^-!~2eics}I9Ow~Q@F2oUJZ33{3;}yEx!U}%
z5E5|~UkN5_ME&s2j*4J{CA-AFh!@fjOE-p9#R}}SEmS%u1!SHda}{+unrp6=*p47Q
za5dno(7=1n$Xk5TouBaB8_^EhE3h>~UgI@>MViWSX}L^dX1t+)d*3GBU%m>rHQV6{
zA9nN6bguybCl@eIX|hnn`s`sScMi*bU)?(U{T{^?ynDi4Q^Gayok2>n!0<0#x131V
zcXsL;AlHNYYc!Ch@2qN!qK<L5)AjBLahG~q{$SNf2fuzDZYzSxigCwbhabKR+Dr%(
z=>AKk7B6ZjRDL7{vyMRdKO`tI5W@IMhJ6yQe1%_f<5hAN(&xM6V;0x<<w~3^z5AMw
zmMwdGTw&xNkk}$;*qwVrgS}2S3IYdZxt{qKXmu5RTW<_5#9A(1pPJadE#s%BFLSZG
zHZWD&A_`Vh=j=uc7I!3cD9Fpcg<nf`8LU2Yf_Vk;!g9-XXi!64$U;A6D5=b1i?lKk
zfFVdR3?R5}IuL<ne}+&5M6lmOXLuZVaoMfL#7EqQl=*oJL1bitUqjunMLG)K)&N;y
znD;h&r{jb+U-@xIHkVXxHPNt5f@(pa?OjbQU(rDa%^mGTQ1&t1Wxe$3=Jnsq#6@pJ
zJ#s#o#J6_dX#5y+b-U<}pMZxnCdqDdw!Du$x+~N_X&ADJK2RGBvN7%t*w|<@0x_DR
zP4pC$$T24Spmmlz^{R!DRxmvUeLaN|3l+V%uhh4UVkmWU98y$`k(fY&G$*>&^k^8o
zvs-ch_>RJJaeAG<W1CcF>yyR^vAcVD_}*tSJ8^ayaj$}Vfet(XgApI#xbH)7_iMkz
zneyabWIND&iP(*3^sR*fbXMTx86U7=*jZ#LE9-@shF*b1oZ#Ex9W<3>PoRhsnLZLk
zc>({)Pq2(dd9th^+)pe86U<oKr^(Maox}uen3R5gBG?`5oA3iVT{&nk{(kSw?_l5H
zV!3G#e{qvs?7_3`8&N&vSri5ks?@hR@&5U--Cf`wXV@jXCZT!(o?KyRG8?MLir~bi
zH{Y9`jUPy!)-S+im&*FyW_Ppr)9xvXb7%I?x!{lV_PNtv_;(x;J~5`y&#|<1qqVi!
zXV-tk1AQ2xH5kZCJ-USi*W}YfxHK7HpAVBa*t=YTae`@!-o~qzSw|bU_gnd03N4pi
zQMJv8^+R2@PB0sgUJ;~^Pd?(K?$x!=3ANScqs``*3G2j{(_YBH<NE{$^i|Bjbw#7~
zmH1%zXK~{0bHC1gAJ!AEkb9)xUS5H^h8wK!h#zRVi-ihCNA_<JeC-VX9A&q@7tmSf
z`GJNfd3%K^7@lwZXok4kCv^Et@3P}FB_$ZdhjaR?4hQ3IWlYeyS5KU8)O`a2IJc6*
zvryjTM164@!MgA~0tQ+n?+fg93M}lnO~<cmSEGR`0i)$o`$Sk?d?Y0K7-T6Y!oa+u
zZY$ipaZc{DO=NHfd-RTdSl91kcAYA)Js*R%eb)Bt2`TiSLCfGQ<Id@0L5w>|{+m#U
zJBjn;he7hkc+K-uO+~{WMnAR!K#OIgzAk@(EW%^jlk_<@!Wu5mY}jX_+2_%S&JUX6
z`%x<+@OUZGsLvN(w(Em5<<%z_FjVvS?R+A=CA?>6D*)r^c{<z(<4yxvVAcPAc>^2s
z?x9a*KoHcU$yLy5`+KKikk8a#9~UHJyQyQ^^^L2@>Q;m5ofop%=c8|+0n<}7%zmsK
z&2gJ~CJS>eKgRL;AiY2QZAI?j`nM{t-(9)(gn!1ynsn+}|La3`;w5$Np~rNiLLT^<
zuHoAc^?@z~2z39<qTGnOWk&TMzUP~$M|HRn%<x`Vc@-#Luiag#&Fb@g(EqICuK(#y
zfaLL4XTzgwMR83w^Ro)fiId8CnE$=?wUg?()D=GCLnFdn*!?P`n{9oXKuwr*hk1H-
zx~C*?YW*?=;*O`(O`+qQbo9SOrl(^P?34adw?RLF>b>2fb<{hCYbLiIy<+Y3T{dcv
zuvZ@5#Ga!mb)LmPZsB208h5GtyYMOB(e(FiGqSnd$P;+Xzou`i(d`NtF{<i_)j4OV
zRux6O;R4$Rc^YYW2@mKYN0$deqc<8aCJ@{ozx1WOJ__>@9^^dFD@qDP<8nC6Iao|~
zH+|-Yca$2gO?OF(0Ztrpe}#2Q6tFIaDiam+Sjr`4#uck5fD|w_jzd#dJ6vFyb#Rsm
z%=4NgJv)ajmt{p06z~VG^t%SW*31=KJ?uc%%=vV+mDEViAO2AIjCJL^N_bU^Uto@S
zaywmFQZrmk{mIJ<SmmyNy)FQnC|Pz-!!{fW;_NKplT*X?K40~IeL@hbG9_<M4N_Wf
zPw?92WDATtgl3}s53^D>j8;@6xx1^;HS9h~<^xsj;F5+@=vaia$ljhqPw)%--^E{|
zmW`=M(+=CjJU2vviiZFAzpWa_(@$ZdpIi17aegL*5m?__i31Uk?lPi8)tSf$gN-^v
zrIQZiR087Hha>kI<dKM7yikP}cAN=@)}wAM%CKsQT|MLWTJ!pd<cY38B#`SnYw79T
zPuEmbRKtci=UE7s8ve4r*m0kOaObJjl~Qw{31SRWo6W&9dZi=5q=5BNsl3TpfbtQc
znMx~*?(+%$e+;bqCabz#s*7j~3;mp$?e0U<?4DN`u}>P;vC;1cj=z5BBd8D2u087m
zkD)c^{!-Yloe{TWvkucox?QJe*e8j*>Ax_j%NIp~J3swfxW9iGkKK<eWsm}Oe?VF|
z&m)@W3tJGnHH+g{gA|XA5k4jr&DRA`|3SD;Z(?>o5U!4_xEFo>&WV3U^2<lypB0|y
zd%wZKoJ4*I6aSA<rB6_cLG^8yX3c>!L71!6iDonw^~_G9{J@c3OQ`1cqo*aOlVcFx
z?HiA-!Z2tKKyMMDlbb=bXiea8;S%U|Gko8gSQB!;bM{~kGN@UHj66aCu70iv;NYw7
zK=umh`t^h0$LLjioLgd_Bv&`*oZXh=f@Uj@I5z4ha4L<z56p|<F%44OUm*INeAeO9
zbD*}OYp-BNlqzD})OQ}#L++5*I(@+dKOYI{E@>%;zAhLefjDoy@len_op7lsb?&wh
zDa!gr8=q%I8Am#nT%j&|53G>yj&3MMzS~0Cid3o-{4Qk$dfpfA&}X-s^m*OeklXhk
za>Fbga-+|}GZ#B&@Mb`i)Gyo<&N>A2!xV^6-}big5EdtSr-DpruXTrr?)-kUQw|!E
zT0$m>s4X=if-^o9hn%n&rta9n603ZN<St3rDG+18*F=bX+Mz~6v>Bve*(pWbLC)%b
zOye5;KRv&qIB8|gi8h-6-HdH>Wj|vHvP1%5ZYK@&58COc-~_&wC+}rabO+ZAQx~Cr
z7}?ER$Z!Vy(&v*UwM_+X!wpf-Xxu*`odVVxKw|wTlKcP}RMB&e^LS86$8dzzz&cSA
z-HA39@u6R5(<2paE{=QjABTVDT66xeAP#z`|Hqi({zDFxFgzEEGx1==J@=BhD&<ws
zRpUkW?6C2o0I4+I2@hc~g%HS~j5{TDDD=Jf1+<n{ZnNebaJ={y@<XknZa;(I(^@?i
z!>L+5F<#_hPcLo*JEKl9;Jx2E`hTtH<oLx{w}wgT$_p0cz(895>6x6!$-`6O*(*Lq
z1<?~E$n?=tZPx5FdT<JhRfHx}{;h8)6J-%j&F~R-$Uk?K9!+pU_6P;)WL&i36zM;s
z5_&xj{{U~ZL+%BB38;hA;GcV2uUF&&Y4du435NgfT)u;g@&|w2)_dj;y8^kWl&D`o
zkW&e}-{7%rfw)`V0KJmUDYDBz(+5I;88kBfg79UK6D6Xf1ihp>vbKHp6U_-e93;)c
zu|Fzf;g(?`<iL8?qAF0ROTQ4|?%R1doL5DH-v?KatLkE({lK?DhE3Xe;L#a!#BFiC
z@sh0i4``+b&TUhucZ;vD)Dlq^kleizd9Q<cb+Ug)Q}Jx?ramd0Xf_rIe7%U)v+vPk
znxN|Mf}zN+N#+DOH;g;<D8WBq&l%1cMw<dFFCoqZ2`@pi)lR*7l$7@9tG7>o5V!wB
zAMm~N*>LF5ll29KFj7}b`;rBq-VG;rodo!B6Anv%OvQgqM;nU^G+Z|ShfNV}{HtC3
zqjTxQC`W6~CDz-EcQhRYi+2blojlE61*Lfvv<J@=hqd^=6z&k*YjP7F7=WD8rff?5
zmFZWG;wK%Ul6}ZBVl^jr(7hVxi#0_EE^D3cuF6i)u4X1~$f0AHr<bNOJnwiy-@XAD
zYk{$bA?w#LgJWSUNWDdA6$O{hsp^U{K}fi%zfw<gd_Nq}r;EXufd0dwkgks)fZ<}u
zk85ZVk#q9<s)}ylPn_eSy}1iaFLT54<!SBbrY-GfIl6MV-n3-}_br=><~ul=?{~Nh
zb*g<ev*VLB>1yP9el<l3dHbaTp!0ohTZipNXpue}?+H15`J_s<k`PuU(t1i@Tpesh
zC>~Q=%3V6LUF8nM{j42kF~7`IWxYUny(I%fg0d_>Y=_k+9{F@&fw;8q<l5pGhti`c
zCQ%7F#g0T8OPu3p0J18rZG1{sVh6EE@|L&~E41BOEmVBjl}%sZ0LQ}d7L>3a8cYEx
z_pQHtTl@eAXXs!qnrx=Usgw~JnljP`^(e(%3)c*0=&%eLU6T<$>BjzGr6o0>YinG@
z_<+?bZ~bpcVN1~rXP$Y)*J&xrp)OwYmH;XQ5h|~+nosP=ykA#vGCF$FhYj67fmzRH
zB32`@c(WV+;-=mHJ~VEZf0v|yY8rsZw1-7T6&lNG+~U7v%BeSg&=<JX7`cEbZ8fem
zXy4>V!C#9Ll^L;>o}M`(Qm>F&iAnGKbrY_qIo}H3pCQO}LVc&GiGy^m@K$DitFXnT
zQX_wOl+Hu(H|=n@Z_JU!Kt65Mv*@j!r`!tWOP=~_@VYG1o3ebo{HTF!N27`Zn0=e)
zj3Hg~kek@H+fuT?Sum5AwcRnW4cA7$D@E#uP~lyKzWzm|>cNqiErZ09o6i8g&WWt}
z{-SCh`^80j#T4|43p4{U+t+P<|KwOAG-GU{2uaJf{%R`%MGe!dO_Wl$>i#6+XS9rN
z<~v<K^!afBx7nZo9N&VFf)X05!;*6R{cZexi3a+*kKAcAk)Hh}F$dp`GR&Ry5-PhX
z*b9smVqA^r7E0-lfr0Bfa&I%qCBuQJS%e<+nb}$%uA0vRG7@x!^&&H4oI5hLn5fI1
zcBRd!^C{g(9mu%)5RoT-;}<~qT#_0{dnbGF^m24abs!B@30fM^|4&)d-9n7Z>~dMA
zANRG^QA7NMBe==j2pkFSlwSE{qifOx#y3842s&2AM^0)qYS;=+ZM#Jg?wKhGS%@zo
z-PKXJ?P#Ix@D;04I?(_cp>c{kSTb<hAoG<7+DlJ5k{S`KKybQuxj}pN5a6^)e(7ot
z{PvR;nFE2)3S}yT5Fgy37^z$~r0+tE`y9Ua(UEzxntUm%uew_i2iu0Z4e<6H4v|k=
zWo0Tar1e<~NyMzb(!1<3c-~`=tZT*G-dgB;4~s8nQ1;9w>;&?T`D$<NS{B&w;HjlO
zq6@wK*#6_}>4ZtM8>&0m@~KUvz1J{JGZ%IBO22wRX3~o6R=#SiZS)ao{0bjK_KJ2G
z_Oy53=sZ6MEI+D1b`8hksQ|;5K>c9hL83q2;GAJ_pErZt1m%}@O(TAjf|lqhFk=g7
zEC3vOh-;+p%L_aB1AN&^ngNS$ZCbw7U`$_q&ja?3_=A**MDy1wGoL#j*e5T&JS?sA
zaw<`MnZ6N(VD-fg>GBA2;VDYMChQpFc|oG}V)S3yoDvNO@51wRA#e$Y<vKWcYhNzW
zcZzd&aZ(P`X+@Ryq62mU9QpZ4h8_6zlbxIRH!vV8G2Y|c1=;%ef3^g!T8@nvuae47
zUk3`L-T5uoJ4~VS`DBKiTLDv+vrt-(&K`fmvi%Y&==u_e=hid63Cx=E+u43(=VK*|
zlS?C%?x_{X294si<&oG=)yI;l^@1y~xaYASkRVJ0c1(aLXuoOVPp(J97?0r8tHxvw
zRU*=fa$P(&_x^D{9vTY$;&A8A+J*M_0WOiq2Z`N?2Pw9i^x0lP2<@<I=D(!G0L6;}
z1Z^5u&b@Hd`DuF3QBF8Zxc1vPC*0YS7gmvPGL=R@4^PEtrbWGkdbQ(hcKPOJ@-zJ~
zBp^?64?d-oVz`rWS3{KSg@dpfC+NcH9JszfxRz|v0crL>?I=n^NRGlc%+NVrz=Q$(
z>BR9waqT{h2pE*^ewLgg48T*o_)b*%CAy&sywN8jdvtbfMaf$&->_wEvlHfy0N%cK
z9hv$cazx-mhHLcbZG|DS(`lb}a_It~ZBY88`lrrFE#&=jNJV(j*egRcVZU%N)zYnt
z#kB$OkOchkjN*=Xy@cOn_szTW7A2B5^>GUrA6bcXe~JE{yhG<lpLVO7T3*23gN&RU
z23`15)=c=0@x;Gd|9Dg%Uv=)}_DeZOouaMQTI2Cq5I^v$8C6^&g1Jzh3BuI|1FIDe
z$~FeVh--w|jUdKw(3;I_9rL=E6`m~?UJNZ^Yh1F_sY!_?A^?bjFJ?V*;tm;UhXI*@
zy52rWV?T@v`RA7l`CobpSX7MU$5lAIFLF;ZfQ;jMvR-vpocJEl@opl*X&V;21^CYe
zRbrBZO78CB)=gK9?k<VEGufoKeoUDMQ?Oz4SQlc*7=-xg{gZ4Q+PqWq4X_8TA$XsH
zl0LhYQ8Rf5tZb8OFJswR+wydoQa1YH@UO}qIiIOL22GH(HV}wWf{v6@mE;?_N%$~<
zPOLXZ!|F3B+&q%izL^RhrDzZD^SW}4BQE|IU3v2IAuMu_*g@X4<s^zbGMBg|A1XnA
z#Z{?(j*DetChtbd8Zo3O!>3Bs&XDGylgL6Fl(I6=T`!z_lVWo;^I|Kmf8&yM!+yzs
zmU>IP8_bcyC5<fDLK$Jme<%}7%aOijBA78rK%a<EJ{48?s;_VH{3#n{xSev}Nl;lH
zO_qRuChAmSy6e+wul#1P<IC|emTW{Xl?NBtUbs)v($ymc#U9S5Fnf9jcUyYpyM(D)
zu_bb6pCt&?TFAz+SZ&7;`iNWyrPKo_dgUk5Uq)~o$YEPg$dYi#D<cX!h9A>e%<1S+
z0S4_x?=p&K@XLhg$~LKz7o16z)%zCSg=ppQ*Sy+>@<1phEK;#%0R9PM05l8^Jd$z3
zsu5h7k_hCWW?yE`a`m43B~I-x3Jd1tfcb9r&oulJG6Q&AR_AG>{$wuAOuExH1!kp<
zn}*S@VovUA^fNg+(*v;B14ygDr<Uxe16=omhf9bJv17y`l;!td&Q$qb!P7;r62P9b
zq6b69b-`MN{aAGhjqvMoibTM#8DwSZXH?3pO=MfA3y4UdJ<)<kL|U%!XQO_&qH=Gn
zf!T4XPqL<I3})lZOVcCyOzFwT8Z!4+OVtU;kSN->kr#CHpCxfx^*f>k=zgJ_IeE7>
zu#=x?z=EGp1?i_A9BH(CK@M31ovt^oB=-+3SBj8N5w}ay=Yg+QW_`)bF2Ba{HI;K-
zyjlT5x?Iuya+|gaJ4<WXj)H*vBOz&7a>w+@(gf?tt|tj8-n}g{UE6!+BpJ-|0-ukH
zm#_DZ4iz}O7Ov?lE*f{NftErg|2qb1@qUDdY^JZsl1NW2><9Pbsdbw3JMIxhO(=y~
zl4f{1cVF^w4BXW8H+6ea`~DWW!HwW;V&oB?+_(!Pm+)Av7@p^qtD{JtJ!J;BQn6qZ
zZ_dUG#?)^qh(u@k*z6VNe4#~XNrJ-oO=0o!DKJ>pk>R)q&6~AzyORtYNMEVar(s$T
zx7wayJyWvJ>xs_7DSq=mYn`c652Ou#c45n{S4WEF!|VUe4_R#kI$L}h?K{`4+PMf>
zwhfQEuC#$_H;G^NI8%O6@$wEavcVDf@8=0XzcHXj{O@kR@W<W$j~^`nm_Vt?Svol*
zsyaKG8rqmTO52**p^4eKfUfwHSX<hDH#GtMb8-gV@b|<55UT+|H~e+JTN5n02=eJT
zNO#hVCYfqS378pa$1$wL9nU9{n@h=5?Mda)&$3F3H<`JakHp>=rfP+abKe!oZ|1Rl
z8fG~HTH;fS6MvcGrG0{(#$vu9x3S8RPZx6d(I6Zy_y#5Zvk5k=ZG-22^6a-`az-KL
z3JveT?-Tm-&W+ZC46n)7`&F&*BDXo{u}{c9nYiV`SvNdjhHupV^0_WuMt@!XytPt2
zS0nDs5GET4rUO%~m?swd_7+X_igRS9bc9>Vm)gy||LpqnSU1O?VgRs{Q|bwBwu(&f
zc1MfXbL%j+?dgRO5#l&!@rU-;it;R7N-;Hc@kE*T&mU1cas*6gzD_@0!cQK6^UB^}
zc(ihW{A@kbtXv^!=qhu_Cvu0sNR0PR?ILWQd8%*%i%#BTc>Nv%lUb5cxNv~*zuxhz
zDBFUf&{f4y!x1}(ZF72>j-20fVu(vn5S_`crQ-k6pCyHSH!t@Hq1z_0+^^}d6~5H4
z-&m)mgy{L5aDe_BZC#PeimVI`mu6E&=*$ufb*ARoeXw2AEsC&J&#jPgN_xTO%P9S1
z*6_Y3<;6ao!pzO*TyZtqxLUt<P`iq7XIb25&~B>;KQld;*h#ZgW)MaADq!{t%k(Mo
zP%{p}TCe|CCubQH$JeEC+}&l6K#;%?0zrd&Ai-vE!VomLGXnvJ;O-E72m~EmgF^_e
ze;{ZE_aMPCkYG!)wYBe;eQS4bRp08{)#pB^`^%|*?(JXT42|tn9^q402aBLg(~^>$
z80r}iA>W=p|M^N0epd{-WwyK&7coUI<s0n)dQFJ?*i>1Rsas#@xWqJ$da`&AIwJl_
zE(<D45YR@E<r_;^uTvL-QDg|vzTPnH0^A9MZZUPze`$ap4W<`ri#NPhcm;Ux#rfe$
z{X4#jhdWYIG^AU;G|f&OJRx(ANCoQ@%<lRE96!@sb`DXa>hjmUS^9G%^xdUR8NV4c
z?K+X7E(j9o1uUpJmD8{(bX21w2j(B{siDQV{ovg&w?(FYIo}FKYEI*hV7A6iC;zFC
zsa@hk{9c|n@(r@+?E)h)R!NSa=<Yu|E1mC(Nn>`mil^G>pY??z3t*T;ubLte+|Tu4
zJFkh~MT#}uZ~lfMZFtU^w+k?`RCstVAp#Y33#RVZ{b8RcFVmBTNef<tz`?B|J_@Z~
z0mPJEeH7}Sgd&;f9OO6f*me(ym`S&%JbB$1FJ4Tg)ji+NH~8}PRP+A7*}zyj!6!>d
z*G2Aq6<sMZPja~>o9O(d7!7I(>Ik$`<&Odv8(=}TI4xl{A)z1<Av7lx;OPk@Nf?o*
zy;c!CK7|YsGs7|&29`NwGoiRRGm6y*0^gioyp#$Z8Jts6qpZZCK!M8?@dQAYY_b<g
zhHUXNpd1ZD@UKE0Nddj(`&~D7S?cF};{@iG^Cxs4Cj@umSz~0+WE6#gcKYCxkL=Iu
zgBx6Nr@lbSyadc&GN1G@x&3JG_`&s|AztEDXW8mD&QWUj5>o{8X8aP&dL%$?R$hU(
z4i(%TK@b*p9Ts|(o$9lpN2^4;%yw6m6ts_v*(Ha0gs`?>a`0s64Oa-oFQ;Jlf2SKP
z%U7FR`jm8S`D}hLKLJPY3K;rGlWE({GK=JuHWBn&EVbTBu1SsKc=)?&AJwwP#fSn8
z78kZz$fBG!9%8%jMp+`&Q(Ho%8p3K}elB9kOszyTk&5L&oj|CcTPs^sizR$q7=F^>
zF1wA2=+Kxvfwg(W;5|;*;!xGTUsqMaN;CXXkTDKsFp4+V6%f9zXM!h@NY5BV3+*7v
z9!qk?exW`7<<J4z9N*F9pe6m5>aF7EOoW(Z<)$IxQ^b@OxOF309c|(1YeAKbxvgFz
z%%Y{q+DW9Elj%b%tQSGMNXJ%Y{;&vaxDn~$)R;${Tadn~9Xr_@P=m3h!?Zk|clyQ}
zlp~fIsx5VdGtcaD!7_J}s}U3+f#BNI3j4xz5}~=J9%zWtQsb?7`P6=TNa@CxW~b(`
zMJtcGMca`2_8}v$7-yY^QBF>|$<pX70E!Y=IICd1QE6qDnYJU^%ZyR{?JW?7@kqc=
zbCDq=V^k=0hrqca1!_xow%%SWBYVN%EE*%sY$kRWDO!H3>W)K@)jPv{$&)8TKA(x4
zIPukpEvwP>pi%8+n>?l+@af?XCnnmU3VfM>X=~$R&v*3W`{w|td0{|`1?3IFma*q;
zQOZ@1`1O}bl$;tK0zom>!Z{S+0&bR@g2vy(uyZ9wvg3U%0d#ZzRtA$+5w7VD)V-5{
zOu^FzW+Qa6Bpd2elz2n2r32f`eBg?U`xy=vMzvBh7Mzbw3b5G%cX|2p&5~&LZ>q+j
zoa5D!Gfb8rN8?r&5#TZ%$_K;#G}vll@ll!p^6L}VJOAq#Ug#5GLEiMTP3Gkznlc_s
zJqgg>Bt&9LV|Cg2{Z^7dODMT?l$*Am#ah5qJDmLKh?unZ=%9M+z$Kb-GXLsqvHkIs
zBYXmuOQzwF66|W|sfe0H#a%*2CTXQr<Gj>YA_{Zfy-1hw!A*xx(4&kALt+GrWw^%>
zG5td=oa8Xi(y;lh5M_PjBQnQVam+A1LM!q<>dHls!En*)<P*M&uuvnt_txvRrHtZE
zx|eljI+dbc=NKf=7xtF8IKQTD0gQBN?Z&TM6F$jB2GtoM5A7zp%VXlr>l_bY`0m9D
zzMPbsBTR<C{yPpvI&Bfgt0W0@jZ|4JS&qJSj-!et0ewd>qRT$ofeQG$$G!MSE2kWk
z-X~(kM#R{fA^^q}vgw@GL!X)oBVmoZilI+XS&#n_htEjH(c$T=`Rcs}w{Wyu7}u=M
ziKMZ-fV9<O80^fCj;F6X0=MTcal{vVmHDkFFOtfv4_sdO;hO{~#%Ug%eCHZqyI(ST
z`zx}UId8$h0|$5pOnp&qL{Ot#`#9O+B$$Bs!VTaS;)f#Z3Gk1i^PUHk|9X{gLg-xG
zgVo4?sK2YXidx#x+>%a+JbuOj?qJu<JjM$?uB2I>&al%6=?{@{y1w-Bjyk=&?I2Z7
ztsQK}+sY^D=YB%Mgw4>ox{77O?zOPqXs{a(v2EiY&$B>h3%@}vtV!4`4iR;(Gu*5N
z9y2-ZM~ZaUM2?H5$+PmnvuJ`)0DOR3!l+ZG5dA@NTi2%EHdm=tc{9=m05sUw(H6<X
zdkq~qn8D5XCj1Hhjz=_RJTd6Dls3V19XQ;Q(kcE!U(8a&!C;G%aw#+gOjD5ybnN6I
z8{>?WIWqwpr=_<Vr#)XS+_L)+96{uyf1ss8MYE4h2^_WW%;na3IbevKO*DBTX#k*F
zQppOQGEMef`VF3HH9>1ge2YVRYiT;^9datvR@vuUh@|<zIo6F^5|MNUrMhh=wCC*D
zE&gnxMzVp+kJwJ6XYmzf--zIACu0V)QvO0Q%<W@d7`YpjB*y>b%%<VoPCfj#_1Y@V
zm5h$T=!vu?WWZNIi&e;98{k|Hn$DlaVx-fB*l7dbl6l4oI*QGG{o0z(XdwAd`j3D3
zkd-byO@qmqRo#>UXtt~ZyoD}WQM>A!AcMxvZGkZFm3-<K={%FqfIetay&zWWz<Mxw
z?^_dPTAJqAwvoOhqOtW>xyPYn?!r}+*=#=xVBEug2WoffwVZXAk_|@=wF4i&;_QpH
z@_h8t0CvW7Dwc;x7{+~&D8YL8a1+WpV5Z{XkSQoc$qd~Yj(!7UPmZA&w|7mTuzDQ*
zwBQc&7bK_rHzMa$2GB#=`<sfMGEzeUHUGUg&P-+<uIYKiZ~gA8&1AGPiS(xIn$H=r
zg<Fl(hJQ(DPJe;b?6m{wh;lo`ahsU|Be}I*QTjTW`|M1y*d#viNmYAB_`F3U0JWT}
zA?invkpPPQ9XW1DdB|p02Ui<>tI#Y?&$IvRA{H!>nddc-(F~5S-gaZtR4X$6(uy%^
zIj_a_>H!?CYT6i1!Ah{kg1ud;<+VIH?53=Q{i1QpM09mEgVVFJ?R8n0=L{zGi0214
ztrAjCKIeHf!4pqHE9J%E?$S+Ghv?jqfQIRDXKV@ZG3IkX=Rj1Qi`Em$4<xMviI&ET
zi^4lO`$kx865%hb%-brl{CTT(!ljy2D)exI!i}j7X2P3NG$&>8XBj&79oZNKGf5CU
zU!sK}Q8KtnN0j)PZ8h$s=-cCf8zYrC+6nl>(^|=k1~cg+y{2DK$`=YbYDN=YCD|}d
zpyUqwPYMaChnYh|yWSj?3m?ah8o=R|JrKakLa6@e?$e(|xJ%~}LN|<1?O$3H7}ll5
za_12>6*e39g(9u@z&kee(E+c=B4?O5gCvHrXCaCz0YS#{EV|_@A<L9{N;h%iWLz~J
zw^;V34@c0e-LVXn)#CRAk~6)=66k8OYsXf-&BW!GpU9h+Vr6VeE~i<Tp*#|V7hc}(
zuE0?JY$oeW;olc+?CbTdXA_AQlmbNia;!X-gEOo=S|L!$TvoNG??KG~_lK=Ew*B={
zMe=Ds-h5h14%+w4=dTTIBh;XGha0jiEZnHz4_Q{MazFIQNHiK)IGcYG08oDwvzy6%
z7=U%*qbjlH_vwMS31N>|MdrJ{MVf{>sw!eOvoVMhav^Na3Yy=d^4a<7j%I0XAq?HR
zKnsB};L5T?V5;OtU~41ggy@Ig?70)|n?1ApqU<Vr3?0cFWj^oPW>JNIannB1@%2Xo
z(%$B8mc|j=Q__k4q!k9vK13i`q7%qpK575Jq(~bwDF!-Evu==Ja=Z{Y+}x|UH$yh5
zmoCMcjC1_joYDLKXz9hyn_$*UU*QV7<;-L7mm{I2YG-N1j6mJ$f26-x#M8t)(nZgC
zE8p^4ukJDKjec|&bMY8BH8N<btzbDu!g0LEQ*Xp$m$RmJ?<@>$^+JB<(W+ty^M6$$
zF0^>|_<=g==plNZ?1U@|)R@zyuwsD|VD79cYS!$jzI^fEzB&pDMKG;*TR*Gm_;%UD
zq+gYO@ZPo~#tj#QI*BVb%4IR9E}xEPT?<p4hYiaD8ePMer6q*P46H~FRwc1!MWGe*
zHn$cuuMacSf<~IV@UMp3Dsj1HM}5U9U6)Zsr_SvZUiP2)ff>+B1C6~FDNumpVpxSA
zu&bdYmzDo*l~dVgR?G3cd0972W%$$Lj?I&GLzA{dqLw5qUo?_kutXlQProqpv2G`s
zc9zjvYF>-BuD&I4#{kYJ0JEU8xgHo>UvgJUQ|Wi#D;9g{$RvxcBkpD$_A9zTv^9SW
zBG9nqVt0VJI%HNYaue=UyaKc2c)eF`^O!R38ILUwTi6YkbcE=SZn<Q5?)M*vxoa7<
zV_s}d9aUABr3R!0%x8-j#km;O8?kQ4<QOtIwlL4Wx-%O55C!iyw|fq3KWms(5)*WK
zWjM{&yZ21YkIbe4mhYME?jbRBCU#$9SV}ufH}cHczpSfk(#`e0X7EaS6s{(}%NbtY
z@zJ6WJ_ny=s!y^wIN$0HRG&VNv0ha#S`XxwmB&YAUL)!c2F4$hM`a3f8wz>iKeOtL
z{Z0J2Zk=sTZKk3CIT?mD7Q6b9jO_ning!MqfaN<J5$QCd!jOgyI9=>idcV?Yn{n!o
zHZP}S{wd>&(aCf}jTM-w9bvp+JUJ9rP=}6>$|sk78kCQ<^Xn)S4HbEB^=!)ain}r!
z2zGZier{z^%;{X^I@L;eZX@syz48aM<*Fe0gvU#bpbx{oW}^1R1?3OCxQZ51s`xpF
z^}Ga#&D3?#h5N&UCnF~Dg3$oM=oYpF^3fc>RHdBE8;YWkT1Is;D{vBBoQ`k4bHAQd
zy*Z0#Yuso<!x)h>#m@JJv8wbY7p12H&Yp_Q%B|0wJ@<<$zs(<PKbE6Q-%IoZ^@@BM
z(h_Sv95TnO&hk|OCiM3$RExANE_~G+BhsgMBZzEZzbZy%1HfQW9zBJ`j?yWPgKT6Y
zSLqZ<R2W=+kk-~E=$gILp!6dP=MUCoMybdaa-IP{nS{zpSSc}a(}XEy9UujElBy2*
zS?KV-Eco)RZXcd^u3n|UXN2CEkUoXEAaXvZDg{YP)r$me+ku^XpP{T89kRsF&&KiF
z8E;Wtw^MI0^As8@OT%Z7qwH8-l-WUn#}8mHAkROJGz(5)R3Y1<oXbu-fx>D&<m+M!
zAy2Czx`}|qw{aNz9`{w{?B>`M@jLI3MykL}l09i<J$3JS5Q%gyb$U|9)PwA~BNSPX
z9*Zb_?Qh=lcyZnDED`78nrjbl!rbac-iz(=+b3uC%;{pkEEI$Z>q<liwy!*b^G3R3
zM@q+Bp;^^a)ly0JZcC7^Nuc;ZRa%4iuKk1b!qv&@H@d6BM?dmBDq8q*b>ef~w-PlU
z(6%#a@4*TSsvVIVk$z0oJg4$t0Ly1QzoJ_P-0P;qU_Ts~mTGPMa}d$R?BuxWW+QrF
zMf~y!UzEd1A=8gpj&I*%as2gt2V|vi4+pOez?lhiDpHH;PTfvBeJ-26j)#WVT|c#5
zPoY}awB@CP&xBXXIA1cG6kCG#26_74m98+Td&xsMRu5NAeZr%0!|DdE>UI43@-JdO
zbtYs-xi~Jd2ojbz9#J}-C!6!xxq|BcSw}A9JAMrgyoQmX^OLK?Jnvr~ZJ!7iq;<Rn
zRXe2pI!071^W?M%E;lzSMFvm!{FpYew)>lC=nAO&5vZ?YKWWUcoXd8PJZo67gR94+
zg>*0Dn)T)UhdlqQHBP%|=dXsk5zb%vb3Le@UvC7kj#PwpkuzBo2(P5V8^QVP?)=2B
zv4*&`on!)b@mIEIxXyuJLhJE*2p-)sUgEPQ;dM^P)Pv?@L(|^E9+S9n<$eYx2bJ)s
z2)N?ADt{fNZJ(%c2GMVX@|Bb0E!;ATc7F?ex}nL{tRzDt%=gmu`dc8b9ik5%_~5iT
zxR}*xlofP;(1=x`RAkI1q`>3SH<w$V@^I-%^@j3^QUh0WwYF9wvFuV-tf=Uh&Keno
zx=^RyVXB1ns^+*ZmjxHx-w(tiTsP1kIb9;0ovGgp)kGF6|Duv27i%t|YscoS+Tnyj
zOplMlnSiocmc;Ey+M_T0M1!B5gF?o5<}d4HQ;nC>1_o=6;k8~x&dv&l@1(q6GhAt0
zV61jS{3q4uK_as5ubXv9t3VrIe9mEV2<|YsYU;%|AKkO|9T(-}c7K7h>*cl|D?IHj
z)F`>;PZL^&-I=`RBL{&niK-)QX@%^0&AQLIysZ!_`@j_$OaALG#dSR^^k<VN)TC~C
z(u3;cW=-9Iv)T>+j%ld!nvBoGrVWP(7i|aDpZ;-9A%3j~`eJ@*L<ZZwrfRtz&)Gr*
zXoEW%TB7qLOxSv|vXhUSR!_O%hBbF%^+1%i5*>hf#*Y9tIw2=72fsX$!?ZGL=Fvff
z`89x>v3a}W^XL6tL;WDc;<r+4pZY^6ZAY6JtZKaM$AkK1d$X~uY@w$6;`Tm<d{8iE
z$Q*7r{$lua_fUqvE6d_m4Ng`aWeUvyBqf0!%!Lp>Zivc8cxlhQm_puvrXy1Op=0Q3
zNx10pe!Akd?V82)Dh-^v#^i!{9On+YyrvuP`LnoO_i4k8FV6v*t$ll}OT^3P{2=HC
ze<JR?7+Hd<_azv!>w&w^IoP(Z1?L%BF7&ts??yKGqMa^x-OAf(sQ2XvA^Jd+O+-${
zp@8$;B&E1%{T7rnJ5i}v9<R=UVyLXV>$THV-^+-xAm|^O2xuDoc!wJ;tQCH5R%`sl
z<kI}Lu>WFm|H63hE$sgpll#Z$Hk`SK-^%_uGkygVO~tsoyL*rEzXIFdYs&xCB>ET4
zyZ^M!|GlP>+#jX;=JhvT?r*&4pB#+j{=}32LF(#xSh#pPS$NsIx)A>1>3aPc-z#EB
zVPM|(EPs3Y`=I+U3=Hgh;_$!R_UF>SHhJF<|1~W8tLgdQIp3py|62Y3Cg;CE<Nq%J
L_<r{P`*Z#We%SJW

literal 0
HcmV?d00001

diff --git a/trd/trd_v23a_1h.geo.info b/trd/trd_v23a_1h.geo.info
new file mode 100644
index 00000000..a72e64e9
--- /dev/null
+++ b/trd/trd_v23a_1h.geo.info
@@ -0,0 +1,126 @@
+#
+##   trd_v23a_1h information file
+#
+
+# created 20230621
+
+# position
+410.000000 cm z-front position of TRD in hadron   setup
+410.000000 cm z-front position of TRD in electron setup
+490.000000 cm z-front position of TRD in muon     setup
+
+# detector thickness
+284.000000 cm   end   of TRD (z)
+
+# layer thickness
+71.000000 cm   per single layer (z)
+
+# extra gaps
+ 0.000000 0.000000 0.000000 0.000000    extra gaps in z (cm)
+
+# generated TRD layers
+  1  2  3  4    planeID
+
+# dimensions in x
+-312.000000 cm to 312.000000 cm x-dimension of layer  1
+-312.000000 cm to 312.000000 cm x-dimension of layer  2
+-312.000000 cm to 312.000000 cm x-dimension of layer  3
+-312.000000 cm to 312.000000 cm x-dimension of layer  4
+
+# dimensions in y inner modules
+-256.500000 cm to 256.500000 cm y-dimension of layer  1
+-256.500000 cm to 256.500000 cm y-dimension of layer  2
+-256.500000 cm to 256.500000 cm y-dimension of layer  3
+-256.500000 cm to 256.500000 cm y-dimension of layer  4
+
+# dimensions in y outer modules
+-247.500000 cm to 247.500000 cm y-dimension of layer  1
+-247.500000 cm to 247.500000 cm y-dimension of layer  2
+-247.500000 cm to 247.500000 cm y-dimension of layer  3
+-247.500000 cm to 247.500000 cm y-dimension of layer  4
+
+# angles of acceptance for inner + outer modules
+vi: 30.11 deg, vo: 29.23 deg, h: 35.20 deg - vertical/horizontal - layer  1
+vi: 26.56 deg, vo: 25.75 deg, h: 31.30 deg - vertical/horizontal - layer  2
+vi: 23.70 deg, vo: 22.96 deg, h: 28.10 deg - vertical/horizontal - layer  3
+vi: 21.38 deg, vo: 20.69 deg, h: 25.46 deg - vertical/horizontal - layer  4
+
+# inner aperture
+v:  3.69 deg, h:  7.34 deg - vertical/horizontal - layer  1
+v:  3.18 deg, h:  6.34 deg - vertical/horizontal - layer  2
+v:  2.79 deg, h:  5.57 deg - vertical/horizontal - layer  3
+v:  2.49 deg, h:  4.97 deg - vertical/horizontal - layer  4
+
+# z-positions of layer front
+   0.00 cm   z-position of layer  1
+  71.00 cm   z-position of layer  2
+ 142.00 cm   z-position of layer  3
+ 213.00 cm   z-position of layer  4
+
+# flags
+support structure is    : included
+radiator is             : included
+lattice grid is         : included
+kapton window is        : included
+gas frame is            : included
+padplane is             : included
+backpanel is            : included
+Aluminium ledge is      : included
+Power bus bars are      : included
+asics are               : included
+front-end boards are    : included
+GBTX readout boards are : included
+
+# modules
+     mod1     mod2     mod3     mod4     mod5     mod6     mod7     mod8    total
+---------------------------------------------------------------------------------
+       10        0       16        0        8        0        0        0            layer  1
+       10        0       16        0        8        0        0        0            layer  2
+       10        0       16        0        8        0        0        0            layer  3
+       10        0       16        0        8        0        0        0            layer  4
+
+---------------------------------------------------------------------------------
+       40        0       64        0       32        0        0        0      136   number of modules
+# febs
+        8s       4s       2s       4       12       12        4        4            FEBs per module
+                                                                                0   ultimate  FEBs
+      320s       0s     128s                                                  448   super     FEBs
+                                   0      384        0        0        0      384   regular   FEBs
+      320        0      128        0      384        0        0        0      832   number of FEBs
+# asics
+       10       10       10        5        9        9        9        9            ASICs per FEB
+       80       40       20       20      108      108       36       36            ASICs per module
+     3200        0     1280        0     3456        0        0        0     7936   number of ASICs
+# gbtx
+       12        6        3        0       18       18        6        6            GBTXs per module
+      480        0      192        0      576        0        0        0     1248   number of GBTXs
+     3333       33        3        0   333333   333333       33       33            GBTX ROB types on module
+        0        0        0        0        0        0        0        0        0   number of GBTX ROB7
+        0        0        0        0        0        0        0        0        0   number of GBTX ROB5
+      160        0       64        0      192        0        0        0      416   number of GBTX ROB3
+# e-links
+      160       80       40       40      216      216       72       72    15872   e-links used
+      168       84       42        0      252      252       84       84    17472   e-links available
+    95.2%        -    95.2%        -    85.7%        -        -        -    90.8%   e-link efficiency
+
+# channels
+     2560     1280      640      640     3456     3456     1152     1152            channels per module
+      320      320      320      160      288      288      288      288            channels per feb
+   102400        0    40960        0   110592        0        0        0   253952   channels used
+   102400s       0s   40960s       0   110592        0        0        0   253952   channels available
+     0.0%u   56.5%s   43.5%r                                                        channel ratio
+
+   100.0%   channel efficiency
+
+  65.15 m2      total surface    
+  59.82 m2      total active area
+   0.72 m3      total gas volume 
+   2.36 cm2/ch  average channel size
+4245.44 ch/m2   channels per m2 active area
+
+# gas volume position
+   31.6000 cm   position of gas volume - layer  1
+  102.6000 cm   position of gas volume - layer  2
+  173.6000 cm   position of gas volume - layer  3
+  244.6000 cm   position of gas volume - layer  4
+
diff --git a/trd/trd_v23a_1h.geo.root b/trd/trd_v23a_1h.geo.root
new file mode 100644
index 0000000000000000000000000000000000000000..1ea0ede5b8b938581ff0037a733d25daaf851507
GIT binary patch
literal 22876
zcma%jbyOTdvoG#0!7X@jcX#*TuEE{i2^uuGyK90h?gR+#?(U1jUGm-g&i&(^^WL5_
zyFE2M)iu>s-POOEUS|gfS1_;}Fwn;g3`|=O3`{c`RF(xD5THXI3iM?T1|~cV2KK2B
z3>?DZ@e)lM{X9+<4hjpQ^8$4B|LYS8_Q6Qisq#}H7$+Dws0?Zi3=CRb@|&$WmaDUw
zp*t&^u_22Uqouh6qw|MQ|92`F^aqcBe89lUK`i9|hZh)_R^$ImK%rHT9N;BG|L*7g
zC&%f>{TS*}<_=#SY~Ae4MO<9W?M!UF5dW7@U^?<}=|W&bCE%XmXMXU3*mEg|UUP`L
z(N)u=DiEWavbF4$7Z3$`G{L|7jWX=5^3bhp@u6IswlNfDBY80kcW?>26iuiG8KN*S
zbMVuQVsr;7kALqE#Y|06@NQ6E<+_|-AJ11V=>IY>y=VL6ssXq^Ugv%0xnEZ+6+bR{
z?!he2^oQAlFrp~BB(bMl0fTXEVscnjS6i9Y0w7!tIX{&bKukUb58;$N=%R+FzJO0&
z^8IMLn#|p7@f5i^PCq+S&;{%Af|gY;CH=+98>zlQ<a_jk!EUI9!GWiwyb$2V=H~}_
zH*;@&3Dv#sOVZH+^$ygUX(}!TRJ7H%A-qG2$leKP+`E~qWW?I&TG%iCZD{dAUhBG`
z7lwLPw1kStd_(IItmraQ%Kp4ynS|<?E`6tsBl(RmIAV?P7ZTHA&=3<jO5LU^h=1pP
z4j8ki-O6>WjSdA$WOytrJ@;S)ma|C@p>-Q65sZ#7$()E@-qs?6AUN_+4l#^3b8pC6
z@}E9Lw8O-7sHXc*o)CGgaIWvblD%pLBD=HLPjfx(GbOz4`}&il7v>qJ8-8v#gg*gE
zN4y>SJhJgWK6fK`+00~5X3T{LgI{8Ix<Yt*3XZOVDbvWPjw^r#K+r(5tPPR77sp3j
z4|VW?mk-@B#DCLXZ*yW;XTM|X{PvZl?lEv68pUv<p`iMkodWjVepow}+jVC4g*eH~
z5C_T4Zu`cw);qEN##%0P_cKi6{5TQ8if&|1ttk9?7o?wKt^`_rJz76WIv?a4jI?(B
z#*O6*a7oG#t#9a5<26ajz3Bbh37ynB>#4lc>z{?0Ld7=qRp0$!my5Rzp{SXNsyw@W
zze#^rLQW(H2o3PjpK8hl0WmKa0k^6Jss>44u@s`<&7W7BFUJw5FJc}Cx>g^Sx7DA<
zu?^q*9?0%XFKoPkV{{iUjps9ja#t}>kngJPvpi!<DjDq2E1C0lS~Ig#%Pn!kYJFKG
zgU>;WG5BI5TFVi?<g+IY;mbM@CzaE`I2605*mPrp88TOc8!2^&?TiBF_hQRNG{|Br
z_-A1+=xw=k=4fo*TIwGW*(u<5w9Ihdlmt)SFXa;cV!(z5w@fvO0fbi5o`kZ6fp17T
za3?syt5a=N#nu|Sa0aMTl%4=xy!EQNOX%ClmQird=2+?A`zY0y=EVb-2VF!%7Ic38
zcawxrF_{gGi^T7h%filFmB1seOS;u*CV&_C_fe9)(p5m<tejx-pP?N#U$I@!RK>lr
z6REG7Dvj5UE9<5E<y(TuaZ>WYKn!q4<VyEXB&a`>A2w^h-$rVrb30m`H95T2smFLf
zOwdxJS}O*qk7btCrq3`x0Zsd>jw}u4Jcn=X=Z>cdt3R2d;jZ@gT>mWG3&sn=ktdl7
z7<?kgktrtWYS_t{vkds@@4Tjw#_0J?=czu|;WO5B`{BVGo0(9MzyNU(l=OGjF@z#N
znoL?Sd@Y#2gxinG<nX3f*KrDmwe{tz{Y^1~dxc=X`z-~6Z(6U|FE9C4l*~B_>Z$TD
zhoh?zh(i&%Y;jR@ygRep(+NFQ83g;1cvCiIkRg?JLoC&FP3^#lJI;B^7cRxAy#eLp
z_94c`9w!{@qSuvJO@h(i9<c58k2nTBzIjnzJZ}mPKVZCl?f-mR@x}GlINZf&)fndr
zFFv#e5e+%-{qumQvyu~D{N?NcbJmIrPI+;s8NZ~aKC{1ujj10PF?#$}rOp{=d(f39
z;<#tuWqWPO8NSqD(h}7md64#w*R9B<(p~Z3(B(~m?6TNtI2X8MK2yqTR!s_^*-16f
z0Jny?TKESsG@lE&`R^i#z92r^GbmXxcA6sM)pSUjbO@1jLS)$uio9LsVG(#v4lYIb
zz|Y&XJtY?H<MzrB9bu_!w`+-KCfpHobVMn6xyNwd#$<(acN%mNyUMzv&H;&;&L`?g
zOvvMDi+_<|m3C2<%y)m6V@sWJ_L#K(TyyxwY0jXKI$U+`7AH>CLn)`0AGu00nH|*;
z5a(^UD<`+pSe%ZMa~Lz+gU;KXM?$Lw17^3#8t!is?vm7vqTAkMGQ<t@sR-46F%yzL
zJ@{~XRf{Ob!4b_pt6+>+#%M$Z3a5>f-W|@!2=5Rgx&hECdjx^_#r*Fp?5_DFMIBZ@
zdFX(9lB59)Wnfq)lzXp+yPeQCqb;7s-wl<X>UF2fanr+N2~e&hSYO&jl<@u*=A+ad
z{?1okD$dIaueWlc`&)ubj4THs7u2AeG<1%l1ct~3e;QhNI=@@r?n4<^th`h`V(KA9
z5mYSvue7)NS(PVTXtYeY(P(KLbfxXDM4xKe>3)5CAx3wv0tDaImv*ny^L2P5S}pgR
zMg1JE*dxfM4)MjcIqQtZ^qsbl9x<J>kii&H>Aa&Tk*#lvFN$$y<B8!q%ZFc-u@l-f
z$DP*4JqQRplw{Ow_|}pf<f*+=0rv`yy%EmAm~T*&5Sw3eHvfFyA=`q(d!glPhu=;Z
z+<3i4>@&bL>`p<@tC1#ozp3wfuH9<yj}}@Me7Fzr67KLhZEMeYTd!Q>ZP!l3P*oI;
z5lP&pvfgE(L`k*5vEXz8!eZSTCdqbPt^1`hq+j}b<5ZX1`ce9I>goMBgYd!E_7!<s
zvcY4a*UBRh97mG78iz_wVBcDnkRck0yhri;%x~<eGxHSJ;zqZuvk-~{;ZH%01Rx2e
zMskXyTlunCSMPw&>Od{ie^V9~xF;)?dWpT$(|6J!hZHD~6h6FurAEA_l@$@W7|aP?
zzCpX@`Qw5un6$u98uoe1x3v`<f^gY8H@xV}97Z=O4LaESD1M>@JO@P}hC#wylHhh=
zij=;S*El_k^J`1>OxL^Xlb??9$^j#b-`vnaQ^0|r)9uQIo~HY3>skf%Z-l%%@u#h-
zJ3R8J*e6w1sM7oRK8~&v5Az9vf`yl+x1#A^8$MTZQZEOZGw=6^9$l|OsMU&wHzTL|
z3pHL0fRnBHgM-&Chlbql9Lc_ZlNUO@fN<Q`rM|SMkduruq5EL!U>mqVv56D~g5K{g
z<*HeTT22iuf26?s$JW?ksLec&VyMlG2t6T4GjG7SsTJ|X)?^_zozpWE7lv+afa=r+
zR(24osI+cNBgcvQ2E8X%UNS%w%H`<8ef{InGMU;=9&aES-^LV!`-KYFi-uRyy_V)R
zeHtE>(f8iKG;}H@_W4!z?e(<q?_M7CPm}tSvGN{~@U;Q1b4mlvlynz>^F5jEy~-iL
zW$iP{`Bw>%hypC}7!guOOzwDj0*0h|lgKENF1N=Dpzgr*SI(pITXSSCd!Nhmx1;x)
zOPd80p10_uU)1_MSB2T{3@gw;cFGw$g!<BC(&S|5&MXrCL<&j`h#autl5jBZK<qOG
z8(M<FPdA1#*@1?2ie{95aFiK!7Z(c2uQ<seJaO#)Uj8vnJ{;YXW#ILosIZiYiVWLj
zWG8Rh6laqYS4Bmgmn{s5pSMxOlbN;_-{Uu&fXNvd<_wJ3kVu>*hC09h4FTEHgG|5^
zn7{C;(WrmVHkQpY#E3k3ZCD$jE0PRdF3LWu*sHB5YmRV$(Q_=3ozc=pRBmX;L9ttV
zd`geG!_xN?^92hA^M%Q!I5Qs{GoO{;%(c1Q$-=MQq7Vjg4n9PJant5;7$QL!q7w9x
zoRr_HtT5&2N-mlvX_Lm$lAYUNmzVsR*pNT5#ZVYlS}mL=;L1;EE(!PMCpLA>^M^8(
zhbdGBQArm@59RIjy<3!oHcs5LXG6VG7|yB{Y$8v+f<?mc3=)uG#s-36xqD>)BuIZ}
z8fDM8eZCM-^O*VdrXhct)M;~dNYFMnMC%PPF6fcTcie@9DKfu7O6u0Zv^F)>zokxc
zDelQ16x`&mFw>S=xAfGUZ0ngo$!FtG-`Clu5NG6(vG!XJ-u-|v>d9ap$*cGYAsrZu
zv%6G92$vy!A=sd3=m&(IjK{`3e3YM0g!x=KO40{~--(^PDF9n#t-H`*uDzn8_gq)D
zyT)*Iy!OeMMV`D8-YYbbWwxF9`n#pJVV5d;i%ay6Gkzw!jpF{^op+L6l2&->R|D;s
zG+bOCv+th@;Y~B=_ZVh%EIgo|j{K;|IaHAeVa1}re#gPaX=m{h+QB;Z(lrbgh!c9Q
zVaM~kuKJkFPErfp^+NiT{u+bQbQ(}fTX&y>4fym9+z#2}nw>cLYO0bkO&*igtrbgi
z70hBd5tDJN!zui>+rpIVx_Iv--g^Fb#a|^;c7yY(Vj(TfH_PAT@(>SI=#J#5G~j8z
zAOwY%_jUFH*6xXISYrlkh51`Efd-96t{@_$yLyI{?~&_;B{nZCKf1fiSjKYZ3MllO
zo1RAhTCgM=RZ@>(&Vl+&h-Q^qD7nUb|G7P)gSUUli-bQON8G+l>`XS|Ya_~@x4vX1
ze%cW+(t?j+>RqfL;qSEJ3oA-iPm!-4vaz<uQ`tlQ9)>C|?^`&Xf=}2iHxp|9UH4f^
zZ5kfz4Bz1E+xdGZJeXauZkAQDJRViEE=-*S3HZ_D$TH_Q)zHQ?_mN&Z`cjz34mcXF
zHxUml@%JK~OAEU^iOE*Hv@&LxARUejms|0!S57+-zYP*p+38EgV{cMnI$jn@7xP5N
zz{$E8vfPP1@^=S?QlhYrQH=NFuwj?7zZ(7c38-;;9=z`a=oWd=tS1!V`Dt8}-Mc~%
z7#)y!R&Ra+zvRd*#+$If<iO^CVYD#^ude!${dciy9~~NAG&IwZ!0kXdk$1^bT6GAW
zq8#C}Zpcd78D?Ec77(nzB~6#78E5Li1wcURGK5+0XU~n-Kf)G1TQEmlpSku|Wki%v
zThsr{7$LQpG)TGWOvOZzg8KYtZxqR?^_u=td;&{J?xv*W5<`BEFgKT|GE0Qv3&GE+
zrPfBfvQoO=L?ihe5K_*P{WB1fc`hYVLy}eDe+$Xk4I|goJK}LpyLVQgtOv$7qu`V?
zS2!a?Q@<l)%zmFKlaP?ZRqx3&X<y7kc_^6#ed*w;$8A9s*$*M2&CZTPees1OK5vA7
z3j~KzrG}#BFKgOAK*|^3iBCHST=@3p(=p<8{7I|3G3n+A$v-SJ;YjLQY<C_1LM1Wm
z`aH=&?Z7t7e!3CT<<2w>Op{q(*#Jry=u~>u({2Xzyq|LbJoFDD#bgU@S+dnkb<%k%
zT<Y;m%ua9xblk-z9c)wu$W=~0d8{ctM6N#NFtxf1^xbJ*LJ5B@0f%n=CU(-myrLXp
z^%;TnPYW6ShNoQ=Q(kh-<d$x!*qy~`?0%l2F)k1ib+S<nEKm)M9d_W=da(GN#6LFE
zBI}L5D|R`a80Vn{V=~I=72I}Ef2VJjcZ#-=wOO!5e3gz-u<|%&2Il<but}hnVePG+
zit!z{e&&z#1ij~grA3d6e3|#9I7MTyJ&Y0lge-F+@!xQTZPF!2SO(VFI|GWd4(brI
zD8xj=<kocnjtpP^C@HNapNaEzpy3qI>Ox|AVwP2U^va5#0-8Co>lh%tOlt%qa}z2{
zn0<ODz1(UJBg2zRl9Z&XM{)$nYD$_%N@R7Tq)ME=Y`O(;r#A~JBGecXZ#d8!uI#)`
z>M|GNf#(lhoS04!iOt@yt?MrX<FdsRqm`JHfV4a$y?M}3IDy3G0aJuV%{S~{jNiYp
z?S@}sAb3Z>_WV8@?ZMA>(uw_);V3No18P8_$ByYmxDPvv@TdH~{2SwH_;&Nf`g_Rh
zKEE+B+V^IZjcIvu629ep>4+ZYsR?x<plM_}WSYL`=xVfsG(<R2JT9|5|2D+na0JY{
z*JC7kVxX}U5)2Y13wPiT|KkQ@A^+#?3o7tF;1LYc&J0mES|N3p&utr*I|Yc=2BNv?
zcXJ;uk8`~h?aWdbE&5Ld8ov}E;<{~QbsjzvVI~C{`!GU=U+FO#$@6hSNiG@X#@cHO
zvGNt821ZbI6Av{1s_$KvOD^WF7smFI?UH1WeT^(fSc*e(uF_6P%zfh5P;rJ0wb0N)
zger0ri75S2QXdwRQPHg%KGcEg&Z-ggVc<u}ULEBK$6xW)+2@|OXzhbju^eZ}4IgQ(
z9TYVFHo{m}n5<*CO$gSA`26r1)17x~ayOEp4y+$_Bc+DqCk!FK>eeXt>ZI6_@8q>U
zH!^pT^0Y?a&E(5Fae+%;R=h!ki_)3xX*{)db*XBFJl9lHoy7iW3e&b&)fxi0GAW?Y
zanA(JI#R<@rGL(*e{x7>f<06)nWi$tSkErzM1AvVFFc?l<v$K<ivkyy1po0PwwnlU
zWdV;g;q!!Wq#mh`FZYYJIHf-p=2v714H)XWv5G$(l&rENZ`>G4BYgQR^27sw|DfA@
zQ^5&kAIR10Pf{fhGGGlP7*WQXNQ*kjL4=QMLxv+-?v1P9B7*hBnIPfXcA3hyf|IAw
zo<ndd0I5p+!aCOT3w$Z6+w==B>Te><#D#*gFJ_9g?TA>I=#6gkwk2OyAghNM`A0V-
z=wk=QsufP1Xap=>qPy`GCq`M<4m#x_4A<xll$-1WNmwK7_b`N@>~V20A_DrlXdenS
z4S=Yyj;7$3h-dN^ri`j|3(ue3UjyxQc4s~ILyK3r*)|Ref2RMC0%Pmco}D-T9?l`<
zJ^&*;#`i0Jao|;d^EixY4yfeI1y1b$i^+?uJGKrr8Lz4bKSV>LMV|_V+&sLwrUXVj
z_~NPV(um(aJ~V(|KSd=gigdu*767e#FL-K$=d)r<b2{Yr{v7&M{<N9@6E@H-24Gi>
z1>|seoq~RTvHt7hWjMLGA|?>_T2&!NShpY<n3>RT7At%);E!SI5YLPaL|j?mF=E2H
zh(>r0$8Yckc7HYQI$eKv>NdDB*yRnx?bvvXD_Ry<*kJE;UrZG2{JiaYr~O{jIl*I<
zOS)?NW;VD^tVDOpmHhQezfKA^(@=d;$@uh))+Fq;RVwQ|5YX~C5bDP<Us3opygM)d
z4Jqt(4`=N>7%=^uGw7c&3jTAD2Tbi9mS3FV%X0Z%@83{>Kp5LygrL%v{HupGuf|uJ
ziHTnhm~Caw%<|nnMkPE$>a_g727wSI{1-Qb6Un8_tE?(Gn}c}x5USLh(0rGkNYLu#
z{+m&kjWBISPM)6+oH%~mFe`DGmzLG_g{CBHmdQk}=?UYBO|~YiS+R>3^>i^^R8H_L
ze`kSBIFraRM?6KTy-ly{gGD!vctzmfQZ@3xRXk9!9<Hlpachjnu#?j>@;Hn~D;R@9
zdKJ<7BnfFh{Q9XQ&@BH%G>Zq?-4uJf|M*w06<<#Nrh7(Y)7O!{QZ*y4TRn<#lLReK
z?hxk$Udwvv$}lwln9yl_^d#Hhd9AGX#cXUXB|n3n5XY_X`#4x70Yk<1OEx#fnD^(3
z?$H<~<IyOs(DhhsErNhTTn7sW6Xv%YgsSY6S(I-b25u4%Y&#<mb>TeR!Hx=|Seb}^
zJn+say5AMY7$WHEI0Y(%WtyhH8ZD{$D4Pf$iHVc7?+9b-%fx1m&MT_dOToclWtpXB
zw+3E&L4PgLF|uTERIx^A6)0k$3zE@@5;0|XX_XiftnIc&Plrm2)cXfG>>MYPIS0+n
zR`tMke}{oaJjfrKbwEZ8Az6eUvbLTBHq{0}AB7MA_ep)jzN#T=80o(i{R0?i>oAPU
zAS#2*^APFVOCc(^RG7-Tt&Q-K0~uE->M&~>Y@THx5mD=QM$ga7yRCO6_IXJyoNlE*
zmi)_@x-g%-9~f#BPkxgv<p0({MbR+g;7_D`xH>d3qWyaw{-q9I%gT5r<sYxO27(F@
z>!s-D{&kb#=n}bncP{myxnV>B!d=<4$S<ilkE{syJO~#}yk0J*A3_yRLx0l0Ya$h}
zw(Hllf@AxJaXFLx4Ly?)KULIx!JvfYdK&Sg3812ITCn*7aUQPMR#fv(LDE7`EVB0B
zfqkg%BjzV-IziYQEgW(1G#*$#D<E>hCSx-oa>|o@d8U2`CbMvW@uRl~QZLR-EcKEs
znqM$(Mn!{v8@9)?oWTWqN1(1QKl{nsn^q(cbEc=RNHq_Sq_ihQL!C)>e5IoH6%BmO
zVNTvos_usy&>8ZxSi^cz(Vd*{z<JqOWK@c?@y~Ob#{Kr##9SO`io|K72<c;N(kv4l
z7@zLP{orT__ZP*Wpv_GxlL1O!+Vfjik54g^(GZ`t6CJ<0%qGmIH*O_DWx7*sR_$9c
z;<6wp{lxG!CU_`n2;vE&u7msjO}xR9axyLEs2`(7J+<x!!`3++0-R$vp#l;=OvN<z
zxwc@fY$>f=65`sv#nVZJD~tI2Y@iFe_KcNBq-~3f42Ex&D5d_fX<KxKD_BHUK76!P
z2K^D|a)z^cInyI6u8uT9Boo1%_=~goWhg6L*DkiF-hnw>J-1jblO~Mvo!YQH`}2%`
z|M;iL?_|H1oW<M=5O<rKgFXx8Q|V(b##-7Si+`uk?osHXhu_!Qjj(7$KuInc)204$
ztw!X%yJf4VYg8GJLd>=GiEdALyL+!IUR7~|*zH%cGw;C}l-`8l=(odcL4wizcad=C
z!!MW0_6>OYfnz}p6l%ke$kjj|Q#+a=PO+gd65f6znU*mpQCo#810bAgcS7w$RuTKI
zI2>hF3Mtm2!a$=ZI2El1zhd53J&2r0Fph#`Oscl2n;+Oi%F*A+`|=R(RTU4Okd6bZ
zjg`IN6@-teI>1B}^riCN)>52#@9DvgSfid79`wIL^^SRsAp!TC68MjIP2N~dxL%#p
zn+O$E=g)30o?IRx37?49qqqmkGtutg_ANVnlh_*NAF0Nxf?oc7t){Yv%6*_4kIBAR
z)I4;5@_6O(#Y(91oq3E02gQgRIPFnnKhneb;3|2^e*jQMjJ_}jiX_IG%Quf5UMm1n
zlYk*2FfvJSI1x#0zG}4+(+2x2(is#@xY8M*%b#R?UWZA)O|O`crcdo<dNU-tiw25J
zQ%np9tA5-Lx;`*Q`c3tEo3wn4>rRK_3=1ZtXe25+#0)eBYx<#BcUSu+^-NO~5A>*}
zIXvBJFKxf<0@>rh<bO=xs_pI^eRFBWv+OFRhgWcdM7|0kpp;g2#;-~8y@LnM-(f38
zK2`AyEY&aeUL@$Hf51^noufHa^!ki`E?QW>m?#wRiYY^N)4Wzs2CF?$#Olg+!RNrC
z)~h!|`^1%CrMb02jYC+geA%c;VhC<ShV^M6f~K0M_wJlB8hI2%t(ToZK&@ZAH|;hE
z!cpEd$nb~^`-K#%!&jXe4GPB&+<+4`o@3dw)mTaA^dc@xausU)-71shMEj44#BAxr
zDv;@uo($<=GUD`Zr{_AXX#oThsSn!)F>CsAgJ8xm5G?e;Frw1KA<%ZKv8Vph;H&cK
z#Y1}smx9?-8+t(1#bMQO%&@M9w8i1$bvD0N$uoo>MY9p^xXY?<Imp1~wu@{$uT(td
zT)BRX-^P03JCx6xB+Cp3c;ZVw?i<zSa@Hj`HkOTmu}1kjTi?RtUZIa_G-QWXFS?O1
zv7@Q8&Y0*IB4?PX*K_HgyiV^Z5e|*@85J-_Rj3)Aza^p!O7-{ow@qr|U<36sD3Y;j
z>qzcjNqCHE7hs|hd_F4nX)Z2w+;t)X2WTGkGK!XSGL#o5dn>S;qC698>kYTn3fB!Y
zLT_{AlGImRJ|R4Zon=xIU)3#m8_F+oDI2F+`>=``cim336V-8j(3C7r&$Lm({8pYx
z+Kdci5+{pgD$b5j|AiDsfdJ6Z5_#|aV^fV@F2tKjE-5qzPi4{2e@cLHkq&_K5pG~x
zzzY-?)NOR0)S@if0GPg<+Ti*;dx?j=R{Id{e*_-|y`8D`zi?8pfP6SvJAr_yXK^Qg
z)FVG4Q-@kk+S33(uR&;^>U$6~0aFsZ6Tkxj4-8g)0Z}1{^hz-($U5(1Q>%^Av0#2E
zj%pgfO8Mm+&2d_a9ouu7|5DtQr@~u5u7V2p#5l=cQ0X8ixuAsFzaNiHWv?vwbIAQ+
z5#e0ao#5m_j;FMzpa=72_)Qupc!6_ONh{3ABr_8}+{u5bPtxynR_9s|j*ZzL_}PQF
zL9QEj+|40~3GCjZK!%M2S91LtSHa6}?%!R>iU$nbXu#TKk}|J_bEQIr&GS^@sen{9
z*8Yk7J0GcO6Pf~1KeezzQ9TYpcWQG^C-QLJS$!_n6LCZ&>rQh!!5^}#m*F+hR|W8b
z)%;6VGNy-48jC+LU?YDbO16Gf$XGgBVV7#3ajw)C3oPwH-ikZd43f88SuC_gtni}d
z>m{k)Z{wRL9q;2R{;zI#X8%d^5aQ;R5o+9(tWA1$gjsZ0{QgPj<Zkw&HHVJz6VI?0
z5UCYv5LVBRu&!#4vHqVFPRmX~W*V)hCnY1*4tmZA57L5TehCvO9g`~`{1YE02Tlm5
z4U_;bbkml*tC$~5Sn*QSq45l6P~U7-27hg=hWoo#c~zZ<=YU)D$&(20U1AP>KbCn%
zfhr+{9Ide~shf&$R0Tcu%=1tvl}35ARqpf;baK_`$vn=}^tr1xUbHYg3^f=GR+7dJ
z#3)pF_h~4(#;G<Lq^#jN8s7<FGK;Tv4pEDH!FK@(Q(+doFWDiioNy9UX<zE2sn9}1
zoAr?Csp9*gQ}v9ULMU+~po+}F$YaFagD9mUwly0o)<Z{NMdG7=#hI3I?opAsdRPVj
z`WrrKmKU?RAS8HfRR&ZeLROy-!Z78=iWD)k%j?f_Hpts6SzQhrrt$6JK}1g)t`5{Z
z|LRajdxG2`o_Zu0Cr%t8p8s$mEU_zaxtcy4;Y8kuiLz%>!A17t3~ke$=$UNCsc&5m
z*Pt)<4~p*4f@3h{;Tt#-{q1EX8-2>^@M$O=eM=^L9nv;&Jr``78A8|qFbU=pu@T=j
zjT%k7t<*Oor!P_*at)Mf38w|vEdqOXxC&0{5~!E0qjFS3TCKy3sW=UlIRskat=$Fu
zW;I)`LC|A}OF7e*kr-c1W<aSLw0N}Cyi%mYTLT#*T4i^!y)q<y$&d6-HcCn%Yu&KD
z1pjk^r+S$m{Ku(sLuzFQmbIbv^`d^7v%2U^G3k;-cFS4K)Da-*Z?W>T$%;PYm=%uJ
ztW}=T#|b%8viK)m19p1otFq?$`IdH=RKLV-)jYp)P_l@n`cF0^^m5uVzq^M#gcd?G
zQ*)27;3lLMXTOF4=<Gp0kQp)*jNUY<TQ%X7lWTtYs%GjNJ`VRxvGB914X7zZWT>6q
z-n8jC=$>F+yA}Pyndcj1arzA_BicwQxM({MWcnS@&1HU|q}4kaJUytfHhy=_3^y)f
zY-_{g>%}!lj1RF@(}vEsaY?wgDB8o~;*V|HZCs!7K>4(ynekY+mNkw#!c(y5oN@Zu
z&e<jRg~MAikh1>%D|b6vVQ3*VF}Z<~T>YRstPMe`X+5MhIr@>B7JMd0+^(A)$QZVq
z_5^CTVf_aq^oYHSDZtJnRxvX|s>J<uxL`{q2w1!hQq8AFI4k+KGAGmgf9H~=C;Gep
zy2w#t?n84j|7rE0zI{JGg!{VS=tGZ_rXJ?^_Sc|i{3w=EY^wACDdX3&GoVs~&2Y{@
zI*3&qv%DwtQqS{CH~Z)wSDdyouM5$$F^ZLQ{Op_`po*TMOHdz=Ic#rwE&ZWgR@(SA
z1?qgcAfUM_aeFjY5AwZ}ZFYfN{=aiRHhB85Ynu4Alrr9FkO|n?XMs2u&NL?drCjK&
z8aypNKr39Ne51`Ny4$oh$(Lb1Wv&1F<w^;YGGeT&_eMd;hVt#eB7wCm`1q&6A5^*A
z5ktxI>y!tktR@MA?SLAJw2>&E*yx(!L!rdPN7)w~#gR$br~rm!2kEEcc8c;8WqEiC
zGhzO~eu}yB;-%#$#~db?r-@y?ZJ0~(-|m0D15272wi=qdytF<7>hM^T2mVeh58g0t
z#6ioV{w`H~sR<PEM2fwt{W3DU9?G}ew_i}8RLD3qxul4RTD8zEn%G;zjDYg?#!}-h
z-BqrZ7qXp@9OYY|8NlRUE?x!&f}?kSsv#=5P9h^DU`=>_QYY%2*$y)e^bjq%0E~Cz
zZG$DJ$>T;L&-Fx&6R}Q=cWBJ}M$K)*DbCjh3ZrX`_o#1l`%k_X_Ow^;+nMnE72??@
z#mp2e{1yIoqAJM`xpcUiQjBWn=GS>L)5#an?c#bUUHC`E)EJK1E?hW?Dtu^zL=ci|
zib0QMZkthA-5teVYAYGaf7vT~4oU;16pB6-qHLB{o)*N#QNBqr-aqzC{*WV8-wuG=
zq%!Kxy@Y^r>khyygS3ZG5)aJK-3}1W1W{zIS@LL+DjXTFHr{n|Mb6%pjFq1u?F*#k
zUQUc9!V`qq&Fp`_ptb%ArWg&>5SgxwJ<gJ{U3j>Xd%3teuiWsyii*X<<qPPYw9qT8
z?2uX~>QXP^YrYvLaq!#OedIbhnLciO)4#_Q{9M|3(5U>Ho%%2Y+nbf1lI{ZGkp4Y-
zvVwP~DTq&q*KX2A?pHunRAoAvptS{s<<|y`_u7q`gj?Lt=(YVq29mlUT-2b9Svr+@
z@iTGa9Uwaih!82#Fbh5M>cf`^oc=B{&A)hJBJ5MGxNO4-f=h=Tkto7;cSiu4)Mo>v
zAw^!eJSd3(1M0ImzYsG+*laATT&oihd^!Vzl(-Lm%$;@0Beb-w_hK;MFA8n+`EHwN
z@=u#Xm>DMP7p$K@q>7E0eoyUa-I8(;8@6J`UwdqEng=|DYUXsBoRa)etB;D_P}Ax&
z!mSl*K9Oe)&G;1~jS_yAhKxJN)E>y<we>2r=rFM(Q)cX=2m&Xw7>(3faFsqFO*;^z
zxuVyN>(Uoi`Umh34uUk-hXRc|;vqqbZG0Q|3gP3V2Gv6a)gvM7MtfepJD)mPe{jNJ
zwnen>X8yDa9TO$Tx$%$`rv}14SF|9*>+2bf*jHKorf&EuAdIpu#;}JPty;jSLL#2g
zt&$h%e{cfTn8x9-%a|Q6wTNMF80F$Vk2?}(z@hL_j&+N0roc`!-u`_3BM4jN=Oq4_
z`_z>lQc41YI}WL@zJ2|3a3gnamqh5a|L)A!B`$iipLW@&RoaB!lBw)a?{A{C!qZU!
zZ=cX9pqFDl0`B&|YYymM7hPCrj4HAIK~j>O2%X(Km7VN~x{K2DArV&QmQLWg&b#-$
zi!8C=y_6+W{{YIY!nwK_p|}J|+oPDbYo=!#P^#~5$PrdpUJ4VbP72^Coe7;<C*|uG
zb*6YII<F>P9v)myOJrQetQ4*xmfp_XzrbG<vvq|Ukdld38ZpL!9U#q4Re*==_Af!=
zbYt=9a2QcUeI3|B;)5#Ns<HQW^xT!hQdj?e{X@O-5PylS#%4{{l6LX2)8BNN&Ley-
z_BebsFhH!GEUX|8XD#&8ti)QCW?YB4mg2F+{@-f0`Hf2?od^O4_#M&7?RTa(;~Ivp
zLkrHFMo-^`h%i{hz%yHgskrS&VG1M<W!9XUQF=oq*x{_KEz{b7DdZIJeVjF;C`okB
z<Lvp4M+vS2IsWaGKt{<^P?-a0Bw;Lc{*20Pl&jtKy>`C6U{j#$kV>6Q%-HazrCu5(
z5rp~OMB9sU@L&NOE8<)?0m}bF(h$Z1A&gAUJ)O9eT|u&45yx>fr)g`JRJ4Q?h7=8t
zd>cPlZ)iJDL;nGZabs9O0@--yEkNQ+&S0l&<D_Z!^xbZn94d@bDB?z~17Be=puV--
zPs~*6`TBTp^Tr!O_U+JRRBq&CwrRJEJAM~&5a57WXIT~!*w^plrV7?&mM{rVN$E$H
z{M?IP7dR{0VFXKjfPPud3VN?k+Qp$e-J{dvW)PWYL@T}wVfdb{dx@6WP*`Y&238$4
zn!yE34TTtq;Sq9uGARfthe0Er(n-Vu7m?WC5|yCU)O#Y@BzM~Op|ul3D6=0~Fn(Rz
zYkX*vqoGj!sH^hkH@KI@9dMWrF0l5|`PPS%ocAL~N1{?KQ?I_HdAZgA6%`TSM25Zw
z8O32XCaSs(CS%b#sTtwX8%veyHZ0o9DhGjW+N-)7Q8eJCW8@Z&j^PxBq&=L^^DD9a
z(KBz$zz~ajMEA*{zc;J~$=+oDjK2j<#(=S{=b(n2@o|uL=|ar_Hw_Xjd^G}a8WHfY
zB4oQuyr;MRJK8Vx)#>2JY5dB^y8@kE;Fm=6HW@8VO`7>UJ=RwuM?+(l54P|_SD{nC
zqinSxYQew{3-K}cs$|>Xq(imQnOo*85xHC7ML#(b_KL3gM&jf_hYHm<AY5Mh8lIzg
z+M~eK+Ua&WAq$Fz)|OW8vB+(nO9$yE9DC?`b>((NFSx`z>D|N2Jz7^YZzrF<XoFP^
z_N;&6AC+S33lS*bS#`NdrM;<rmJAShD7mm=W7K~=zxmb5x2E{p*syOAR@<VEB>i(H
zA;I&JprO9{;=;A(9BX36{qxSu8feiOG8bHz>;I^*V-vw}ROmI%HJH6${-z&5B6xff
zN^o(4>odk|b9%z*aj8%@gqv8qp_v?WkKe9@_w1eO>+?zJ=oK9ma1aRaSHk1!(N{Tq
zrPv1uc$L)|-d;U})|2bheVq}W8{HkhG#9af3^$XGA82_5l|;|;NDM$gqO|VfVP7A#
z7_HR&K*L9Vl^$XN-(EfVj2zZgN_$ng*6(9>O@D_>DbhrX7<W~lis77UG$qB{3j_)P
zV$)3l)_fii8xu69fOrsQ@9nTIw!UI2;14Ts1i1Tx4i@%0oJ>oP)wf~k+BDOkK3#=d
zcc3-tJrvR7|1MLKtb%mfyiUF2hbkjD<ei`9K(oGJC%7VV-P{FQ2J_4#0?x&Z1Ny~s
zxs4od{i6)|6NRGg*5mH5fYd-7#*f7^)hWT^&Qg6&Zzqqy47g9>eN^2A86fx1;tGiN
zc3Ycs5)8;$qoF!2t=s)a>Y)BZVTF`gd$-;Z)egr`%qX4Tg$kgNG!EGN+ehSC`|77+
z9M42AaY}9qxcHL|T5Zoin=RhQtZObX1A!em+pi284;hF+-U+79fZ7`KkzWTOand(3
zki2mKOa;=v+T!Z}k>cZXPP#z?eXPpmIt6M=>jI3o_+d|D*Qt9uBW`mJ?nIe5R2RFv
z_PF#u&;|O%8@@yB>oYA>Omt7*t{Hv;bg7HJ5lg_@hRZRLTqn^9?P<h&ac|f?wDAUH
zqSB&Vro)go!ZUm$lUuhS^<53F=Om{P*IgV%*H*A$yHTy@q=MrCXXO%P<<EYfmdDm|
zkI>gsqIe#o+$8UV{%7Ju-~T2SbfGx+2xfU}A}!wNDB2$r8E>$@JHwv3wKdBKx`2eG
z$Q`=RPm7_g^mx*&1=)|BKkI3`$~DuK`T5|ZmkXC@y35yQTE%A3b@F}I0SOAZA)Y<!
z(Zk%JYTYcg=z<xi3DJZqg{+4MeZ-B9z%&wys-;}irWq%cHl<hB*_)p#m|R2=`!6<?
z!G)v|u7vH{mhe$)S#fG%%$iGm?mBtA;>l@5PvA)+{j#!u)i|kWjU`g-iO7khO4VuF
z4hXm3;_BKc$hT%NBLM=onv1A>eih+DieP+e2bCbuM?CxOpvZ*mVrY$wq+P^&u-gE2
z?K^^xuQx>fuZXkn_Z$~%JKa8w;)OUR(IVGZNAUgY#4U8EmK-m0;2>0G70ROkw{EDE
z8qLQiO47K?@x=JUtv~?N!!4AF1L_JkaLm6IWP9U2Ny(f2KG}glT0sF3__F_VnP9g}
zzyhNny+*F+ULf=p3zUTd@t+jn9J$tGxyqrkwJw}?`n#jw$p9iu8BHE>o85h$cA}Zj
z{AuPjK|#rV<hQD&xH5aG@(bt6R6ubEl(W)`FR?~{HZG;s&Y}BqI<-r7ai*mNn)>1p
z32i&0?rz21ST1u+0g<kRyME(7sBK2IX?xM|K5-w6(Vn%FlISPRZ@10<RkG%rS4-@2
zv`O4+1tCpA|8X$6i^sO;-4k?smMec&(|?xM(skzCV{qcfVmw)I(EMSKlLA01*i(h9
zT)1cANY|;2F)gOgM6lKCdn=4iJq9wJGSW^B-U6Wlg1C{<jsKhnNKN9_ZSed7X@%Fv
z$K2Ty3I2ul0ni)DCmN0|N)3ARDd}wfL%60CQDyu=2-oBZ?a2Gx+{!;EkzZV3`|!fv
zw}FFP$L{q*kT60~AB@(QEh7<uIv3H<K8i#6R;7b+cUDdq0tQRsRp()uksP_TX%=kM
zmSrjzxifpNgoFP^kv>I3`m4w=fI$Ysms2m_TwVBRPmm4++(8aSG(@{R<-+FM7pcFx
zA@R~mv@H;SLH?n=jQbq-9{)#g#AAc5jGiNIibwP#?#S1w5pvK7m{=>LjJ0_4AP7=K
zz2WaWGn~`DBklpx$BtCYA8{dzOwW5RD2tZKyP2U_)TchA^W-B3%~_y+>h~9eo|B6^
zxoX<I=LVi1anI94d?Cpnm+BA@&3Sp9eYp6#Ni}Od(3ABgq}s!fcjCHLj;h0BgA;-)
zE6yb$JC2R48q7s@sJxFSkk`g<gN%rp+gJFDt13xV=8Ti|NZN-h<?x-?U;Cr3kC_QO
zniQEG=4Z-`Sh1x?u}nL8leWjDTGaERm^i?*Yf6ipN&(p*h+us<TtNnQ74_}AskEhr
zK9x2BT>Zv7bJ`w{fU8`%AJ_h;wjz@)%$Z0(<qIUBTj$ty)?c+|Z|!xNYacitUlaTf
zCzHL1_xw|yP~DrO0DT^c2^1*0|EUtYxYFky_Ig!}%KD`Yi{;kfMi37u(C_o7O!D;1
zxV^X2{OSkD(=r_rF}?@gYk|}W;)L)V=b*m}8q@zd6UE~{a+(!r$|9FZJxILjw4}(b
z*qN0m-pLzUX_5Lc>7JY!C+TZY&vDQD^h;bf56vW{0Q4_-h$8BLnF?f-?Q7NcLi-S%
zU}FLaPb7+V9IJjsKmw`e<wE^X4+XCN<3;_Q6GHRQ&%qR35ugd|!^-Q0wpr3j51P8T
z;Asc)KIE&;0r><#$SD%9a4_<YRp%n@LDl3txK9<R+dt->&d1>%#zaFjpa8|=!!4o7
zKc|}M>Ky(6Z=*an#1>862>bsT=7GR-G9<{F6=WsRr3D4>HE}dP{3^u<)dl2N{-7!9
zNE$TQ)s}j`XYYjb8G)uP)>9wJ>vB-{fe_#|=YgmXd>J%})~iC8eE871rGeMrzX{R=
zK#aSkickDiR`~SH3zTl(dDZ}p4|knE>xN|E|8cDg*pegvz_&jfd)g;wA-XIsg!6qo
zfM?(z&>SqlplEWZy9*#XQ4vKj*|_LAAgWuCYosD8{`KtBYq0DK8d4Tf-w&Z-Pw%E}
zL81v?!~1-@`8P&w9jX!4P09?>!mKxr$4d{1j5z$h<po6*st}+6rq*zr^uOt+mK*m(
zu&2$tA0Z4yuARR)=;;D{kH#1mBW9ek{&mHFT&L6ADG3s|y#K#^>dNn5?WcuIkYtIu
zNYD1W03Y5s>;o6x2`Bba%lV6>qMas<(>K?wW=wSuEj|o1A+>;x&QKm&!><}H6_a-%
z){1#gA{<g7)L@dZ8?Wq+eS>!=E6aSlKF`5oMjifnlMa;?JzPs$)bhUF^M&#@f97l9
zT2P84H{G%+_S6@iUq&mA#S$)K;);X-H#l72e)yNcM4nmFMrjTZN>C0+o~FLzMmrsY
z409UXk@fa^g2;yT9-mq&kO9pO1f9*3O$`}nRpn=)IO~JnHo1Wf7P-a@e3VFZfK#M)
z8IEmeIGbY%>zrjwesq7FoK8Bbsm1$OCHOD=_z>7W?0MlCyU^H<eSD@*3HOA=dt=SJ
z?fCaB^nErkGFF_;O&;o8IrGz^c+LGG-IXvuW}2cDbdq-uR{g5=AX9|Yw}N;@S?!DP
z$Z1O<HknhlIirqrN1n-C@eH6SO)uw(beYS)Y*6V*>zM+G4ZwCOorLj&)kqeL_+<1<
zle7rG)XzrE$5BvyMxVR%OO!W>_rcWv;aNpdZ$j6Cer;#4n&A$yNzh5p?#|dqeH<I7
z^W6sDj@)}t3p!Ta<h0TyoX)C&)U2Tt4pC$$Ppvt&X9Tgsi!dA(y_;%n<Z>CUPYP2q
zGU;=tMaK)LwZjpX3f1tXsy&%WA}%dkIKfYSi=Ad)Mi7p?Vl|#n)PkgeWQi!<iy6JO
zID*^Rx)epvev-VT)3dD!odf2}SJ8sLXreW5%VBS=i^;05Q!7qn@LhMoo5MS+Bk>*t
zYrmYpmd8o*XKeo#Qokr3YSQmvvL5g|1l(?u%&{*eBenGF(qZF(l~&>qwK&`ON>TWy
z`7Q1EKQs&hTjHuSr+|CWQMdPM){_r+&>P%tHHy3QCPe`YQXM@5o$6-(0+jNQs9j@E
zwsrcJf3I28DBrL>@s7w?+_!o>lS}wsDh97yHK<VE5_oTTZ6E8IdL9u?H=wyi07!wR
zUssdrOka1PD9JF>h&a3qg}mauIkwh@X5S9CpmE++8pTN5jB=BSMASZY2jmTs!t-Ih
zB|J&V^E2`FTDm6_NuJUGKpB1pqD&Xa%IQM0CRJWKtZG}f8Z2G({ObEu?@XE4$Cd7r
zge#7}!zjOz;;YdRAmqTfV5#d`c}0xEVoid-<VO){Ra@IQAZt@sS1-dyvgH;l@-5L*
z3v<S1fhAs@HXrNRST4!uH?y(UecnlQaQW;M+-==>=gts{`D)w5ju!gxeEhSX?#J)S
z?$Ox(JGj8>Mv%#neoip)Y#INFQTq!5g0AQ*P2KgRI+A5rB(ef$#wc<XX-zIA#?V!x
ze&W(~V^V@5R`0FMrX_L|7oexK#@}6TF8RxjrJJP=+l}9Rxc+-icU>c8^DF)LpY6GG
zq-LC}qow!((%G7f+wFcZL%>ED!W~P~2R!7szo*RpgG7WYXLyc!t2r=3%0m#PwmD2|
z>+<eCI6>3}YwPoHzdT}`eO#{F1Z*XizqJCe1bMNKfMvw2t$>;9RzR^Q_&9Zz{J2_3
zH|Eq0yspdI`V5BpgBzUssmeIDQQ^-#2z$?inPdfn!C^uOV*d!QJX;2I$iN;}=8d`%
zJAqD-jvM$eN>9Ji%)NX3OVz!5My;9&Q`|ik_T{zZ){SVT9m1}(v_UF_W&ExCf`K3_
zGQw}GDLXEOS7xEYJc1?lQl#keEQA~L=T5%TH3>WIj*vyT_&7tquye<!bwhV-)SNpK
z_kQE^gEKSI4D~@e6As<D$ykovD2V)(y<&<wU?cy-7O6X&T@u4TNHh&4V7OTL4Yf>w
z;GVF4W+CdKCOo$M>@lJ8JZCb7S?odVn1G_(3AO_%?(7kXn=wbJk$i@1q-f~}6yeGZ
zNQ?ZrC5r6aDe+II3SUS_TWepWK$u2k-fEJmmHmnyQHE4y*3Qjpz#fvd>QXl`C7)N2
zX{TTX*;Ti*-zwiaa#ypYFZpbwgZM;bJUe7NEzv1kT`@Om2=O)eC6rQIU6_fbS|_du
z@_0d-ZBjyNoh}nk8rk>+6M0eb>=(|T>x!We0!{ar9h6Iwooqw`%ka|1;@!mFC_(A6
zLDa!Fyn#BMzgx=%ER~<&GD!7)20r77W{Il-p25slNnt@bQ?RxO1(^<T{Z>8gCQ9D{
zPtcArLdXh5@H`=H_VeF(Lg-Y*q%d3HTq2EkuIjmarDXu~L6knaGV+eGV)o~uT{0uW
z`Ek~K-S5Als^M9P+df<U1(L?Fznl^W&qKlCe=Z^ynfV?WhNgal(Y~!fQI425^%t{@
zjH<k*5q7uB%pXYSZRZOAmLhVT$h0#h!QFpqE7ZdV?sxE1W#^}&`1jBkwBe5+OrljX
ze^N{^vsRGr=t<B+3K!a1qJUt`J*DfSQH3UeK*g*dPHp*?)o4M|_(!G6CJYa$dkB)t
z5IEk~Kb(yR`Ya^$h0K`c!W1HSoxaJumWbGWG?A}$BK_fi;-vmQNQwyKZ2@#+AUp^~
zlohnNf+s|S(L|imC$sa=`-^I!x?2V5Fl@~uSl~g>(a99}+NVO}>O9e7Syy$Wun5h5
z3p&GSP0e!5S3FhJhiR|3m^^7aaHU=0srq`JQ+~C^;v0E|XvduBGH_$7a_3U->t5>L
z41x{Cc2|S@sXMw~RZk*%`T#|W2Z|{Ui%5xbV<PI?wDu;!ykFccXYWC8tQ$N>Ufyks
z=Q3fO815IwwYu5Xn0hq+aeV!6bfs%y!T9?S_qp)7#SU4yzlFMxNeu5)F4<ih6W${P
z+x5z36rp56n{i_6K)QOP$u6x*OcBido<8qcJUh8%3zrM;NkF5kM~_fj{I20QL!|G?
z=+n~pZ-J|<-)oNx;WOCZd(jmnd8Yp0&I#_S-`$0^pk6&XcIcW29$?N<)c5yboGqS1
zogwxRtwQ<J40Uzd*Z1SvCVF5hcP?6{Gvq3Xs>Xrm!wq3X91LQZD?Jj*B@2iyqzRy*
z%PCh9wo*n6_u}Hirg#YsVHA^y(xfWy<l)v_I3{n_#h$Vg?|*csHF??)zLDdQYFZVz
zr1U=7g~d_@`6Vl5pJuJ{L4CHOw89;cM3z?YU&rs1zkAL<TR8^i|7DgOVMxtGpcGe*
zp<IQpc-4u+iAR@{4u&aYkbadb4DK~860dS91lFVz(x`eoPeZRsTBqtD5(BNI*dwF{
zFpx)~6=EDkR=Z=X<Dbg|a)LbKNQ5pGnkI~1@?MpsEm@C!;Ov$iLXl7Hzmx25pJASu
z5r30#ZszWiRfQMEJwtPAAW_+dKi}kp75W>Ad|;eCRECF8^qDiusBP3zgdPwBRj*#M
zWYU6^gdEHN)Zo?XU+l`1`zm`Rd|9Wl0oNs3?Hu~!dEj}mQIy-5b0|$tj;+@}jI`U{
z<RQhY#y^Z;H*gWzKa6jl7vtw|gn`9S?OTh-l)_7V%D#=qR^Iq6%|USwhOSrzW$G?b
zPuS{`!<s0%b8cZ}JJ;lJ>-R(w)95^@9XE01TRKK4B7##v4_Dm2T4wxwmg74i6=ly=
zK;)h#J4LHMWze_jek5&2zxXV23<leb{Vj>&hlr$&i4vLn+<ZldOlcE~sOH~M<i1`=
z>6b{==FnVFTrp$nFMc#{TY*`aU*MU({=!X%PH*gDs9j&wB%X6llXZRQwp2sBNGuN<
z+1wKJ7U}bDNwWH44B9kkT*<u@>Sfe3|NCdXBO)=M!uhJ|jIwzHyk9~laZP1>Uc}?0
z;K^2}bnl<W+&z0Y(JJjKRW3|kn>n=BLY6;&#4eXX?-paeA9B6&&G{(geW^j)LcSxq
z+V9BEAORpuj=l>45I7?L{XGHbKL*rE{_X7-{@C09@uvk~X3*;L-&|ag)Lfm-jqS{x
zW$Y~+FvK0)KwJDtZNJ&un45uqTwFmr{JlSck*I@#cKGYr*b*+d3G(SV$pC0ZQq6Va
z1T0K+6B$+#Pi9ldEv02^_M{8wr&(nrS}Z&)hkx7`r)z&7;|7)}Y!<Mf4Y3?Aej}ik
zAQ742rG0|?`-%CM+|D{rAyddHph-Ad@C{lbqy_GK+Xm15#Q7iRw5(#v6&l|DKd1B;
zfQ{CJET4(i`&I4e5|0^}Q8bhgCT{s?)(tP%p<DGsKKG@oc#YLBTPw9QbrP-&-{r!<
z^<Ybt3dDcBy~Pv1;vQQlALEttrFSv!Kf8yV=;sAd^n>l>m3u>2tfCOU0cr8O@0>=r
zy?qd4BAsWf=4eA#RHo^EmQqufj#v1G1jOyg6EdCqy9B&MpFS+ks`!HA)5?Pt<{Fsi
z<O|8b)L242kvknCGv2$ji?RU<)ZhgcTzo&{_jw6S<VeNg!GlE~`X;fWZVQUR)RaOG
z#q1!p%@}AobK2x3kd&b!xqiNpPCBGNPmQ#(tn`Yc+a~?CU)NzTe5L8Qu}(_~+5IQ^
z0P_#Vx)PW5=L!rwnoU`u^KanjQ+3at1MONKaYU^K9>t84GV^vKBlHtFL;K#8m-}>z
zQ@3C8CDiQ`>jT?C?JB{a=Ww6Hc&s9ZWP35OljW#RA&K%;!R{AV7*Z6VXB~mJ-UQ5H
zSxo1`vpHBB2c_$lmS#m`&iz*>XBia7*Jg3t-DQwKkiZZEL4$iB!Dev65Hz?m0|AEM
z?ht$k1RY$1LkO;aAZP~nAi*+_U`w*KweOdGYj<x|-|E}dr_a;<<*7cm>IWj^+tcSi
zUn#=xib1!`mY3oprs$=7qa8r632`5rDvL68>kA#1n8s007Vkkv#6QVpL1hU7+9<Mo
zW9jO3>OwGz3<28L8>U@=J7Lf*rcU}V4e+DE^g?a%hSv(O0PnpxKRl^_$5-)iM@ou@
zbjz2f*{OpkWX=((V4Z^5U0;CXXPV2-A!<}z{<=3ye~yH{yR<3eH-n~KCsNb}K_b0?
z1vRH~8a9QFYINkl{KGvpv>3M^yc_1W$kZ?ATfs=pY1|Ra*4XLfKNT{yOPq+`%kxIQ
zK^DDTU?j#W$q^LY{by&T^Ib7%%<fk4R2%)XzEETV43p?pQzU}>xjt;?HSxPhu_jEH
z92nAu=bU-F03%C<hxZa9P*JyF>VDlH_IdI$J!zP<;6(@=+$!Ru(CQUHOzG7}q5erI
zl8Meiegltf_kf6*bbHE^*NySw#Z+3|^X+_tFJDhJuZkZ8#?lEsSwgxla__6?N|AYz
z%PrYN=P$)*P)krppq(mz6u8&`3#!Fw39AVS1&IiuIiUbgPasLch&=7Jis11nWQdp<
zmdP-%%pscz#l@LXtUeI<=JevFROrayoRS)4B@P7&T&9R80J3D0y+|@-i<bfAXc&Tj
z73xR|=q=Ngc-UpBpYx3qm|M=D(0!Z`+=*w6kv)@96b9PqgHJxPKd%pNaK)Ya0x9zn
zFn`H>(#PcXqrKw?*N299iC3LvtJ^q7sohIV5zL$MOEBw^0JT|p1>QPTaCZbjSlD$~
z=v8*A&xRhY674eET~$)hJ}zdL9Oe<i+J4Ewlc6_UAr!xyg5Cd}Zm=w0ZF1>T(zWHY
z`N8}I9K9=G=p#+0Z8ys-l2_V9&~LHSdMmjmHIC!q@2Y)N%NiFW3N%<;*k&P%a@u%^
z?ZO*niBwN*36*LHtA+Wwh$S<%6468|mIHMHp?+?yY*8(i@Nr@INr$`a_WfR!#^edC
z%_9cyal#gds`k6J9wn?a!yg41<6s7(cynC=;p=)PcoK>9j6t-}4x;R_Bv<Sg+T&ji
z9iYwe9bFDu(r>BWDt^vHh)Gs%8X`VLOlg5zH<H!S7M{KqRN0u@>LtP~TAHk#M5;NN
zKD5Gm5wweRY-Q#Ti@=5(kseNsdBnK|>6_ZIlf3~o7+X3_%hP$MZ>&K%Vws`ZQb#!R
z%q|x!b0@hPK>-p7u1&45FH9#9np^6DhA1sH-int`?Wc#7ZhUEWY7Sep@~B(14XJM*
zGV+RX)@c~!<dmB%jm`p~D1n8u3dS3iR(6?bJEFbJ7{%Y-0$~`B1pG7?8A38fg;IA2
zoGVhGwsdFf?Zq;(7Yxp#F~ZDdVt0|E<+rNtI0RX}Gt8Gfc{1elnaGI~UyazZ8eI<>
z)o!-QW7+|q9{zA*q7ACRmkF4*HZJyjM?b!Q4uF~$2BcU}-VkgVd)^kMT=j@wf0;zd
zso^0I6k{!%Ljf+}X1OV7{7noyS7IbP-q#X9H|K9<FliOxn(jc|I|;}XJZ)e$LMKbI
zp*}^4Hxyesu)WL&uDH0L;b37@D<xyW`PifYn=NpcmoMKeiDv(%Y8=WrUM)GpWchJ4
zZe<YxF4LiWFzio*ttJ*9r3oOvK5@PCzmDOBJ^>cwO)uMIUOu8J<FV9}0PRgeB&IZ0
zm!02lB?+{Il1oRqY3o_61w6IG$)AphNqdhDs>cpoq8TUiug(_RA5S^LCt$f`8V)JJ
zu7;k9s7X}ZC3IwxR$4XAOMNAxFz4NibQvGqboc~4%9t=DMzC0hdkhiNKh(lW4)ZJx
zo8Jmi)<-@fb9@!Y4AUdDBJZQFTm%^m7p+b{;kyV6HPU-;y<S_&DDI?tSy!f0De85O
zK>~eYZ;6ZZYw8xjNT=3r{K_@qlU!s_oe}cTZlb$9Cf>Zx@c@SJUaa8DNx3<~WC-lP
z<6xxI7Gb<fl0er;mDQ5v=v(JFs#p@xcLXE4?4up1fWLd(i;uK&%0cOUB35ifjIAjG
zU|b=a&S^dLsi`m$*0`$}`UI8r_#bijjAR@gp3a)D-fM6RN4te_&FY*;8p{hvTP=pc
z&iv?j`nn@<d;Stfe8E?l-+J;Qsm%Jo<%J)<Nq}OU=F!P_t^u~44_9x0MK&|%Ef{#<
z0MCG_FUpMwYLsgqCtI8Z6A)jx0o+3TP-Hy;{!w(^^MLYSukuX@ovVAW8u<_PclB0L
zOB<S7(g~5r&p5yx?3$U!c)`b&G|ST&b{Zl5Au>+amp<N6r+2p<q{^wagUxtb`6T_^
zPe_=s89G;2u}s*#7S<aLcH<$oZT#bT7U*o@H>ia*37f?sqRw@Oo3+4WCa3*Kk?xwv
zanUq+Rvvg3O%Muz4{%Eub;=Z?KS*xt+SJ?TDzz$aM%n;?2KzeNBAIxvp(6(~xEbGs
zKf&Meh{lX32Hlp@CYY`Rhg(uQ#ee9FS!y^KY;jU9g{FXMDsq92ojhb?oRKnTCSc>V
z^j71v=c|QVb{~Qxh@A8fv{a~Q_OU5}qxPM-+&V7@43V>mCQl>{08~pVS;14L$-Ya!
z!Bed!Xbp*PaY%11O((rWPKDYk`+N(LG#@y}x^YV)lFp!1x9x=XoE^KxpH0+AHgNe7
z+lllnzM||K5q#}r%wSf^UnqvTeas6ZccYTT_@A8FG@RS1hu^kdTgADO(J>f3k+y^k
z_zGyT3i)dToXbJe`LkGzbh;2bZQxrn&saf6vAM5bTk{zWB>zeO@ed!e(xs<qFgdfT
zn=$~+mQ{ea&_ye1SA7#?(Ac>x5azv-PyHgDXYv`)2TiIM#A+Q_4<_$@Yobg`(;VA2
z(w9Uuw%#iDICRWixQa5H?Pmdud)V(l?M}Uxv+h!|;mDzO;Nw@EeX&-ak6s$U&X`Wc
z@(>BbxDOH~SPvg=LRkmQR6HCq1%)V?p*zFTZ(!`nF%;wWt_c)YkE5R!++qHL<dpwL
z<ebU?dPsYJQ_)jKYAB%QzxT$O$*jXQJ&*XU-+i^2j8-O*-jrSQIU}}ktC8C9FA2@*
zFR+@ub|4*5ZihH-Gc#Z$x3()vUng^)ohcTZ#0Ng9YR?Ftw`c^QmUA^k{RlD=K(W6g
z#|<eD+3f1zYJ+bTn#JjP_MctEf+aHZyaqCw!SU7GZfu%rMaExRF-9%twYXkAfWuWy
z8^bAB3D#J!w@bCWmM4eZl$EewG;W!QuC8WqdRDf*E(`OV!K5DX{NSclLh8xqJdY-L
z;z?+wyg1xly2<JgojVfHFg@;!Edf5pd=BUwh^lkZdP4buq;(+C(s*%EcqeDy2&+vZ
z{DqZyTP2o1Z`Dq?RFg`D9!^lWF}1-=cvFhzq%8g{L&v@&8>3(*34-TKv@j$}23P5b
z5<j!8#+?*>dmM0Mq!LFv0e^T}D|yjiCViyW^b1P)LLo=ZXu_)`8>R`A++qJoAtCiJ
zb7*MSo1=2!<JeIHIJ~k40$5oH)gRq``m+dk>0CnSh7qd$ON#=-y0lpCJffz;X5+q5
zr1c(n$EH3y;PqJK3=?ON#4z?OL{TLm$XK35w|pgJnNm;bCT^UJtES@?%ii?i2zs?U
zmZ7p*{GLE^rq@^kT}^iF*s8agxcu@HdGk`Nj4jFKGz&A7M}qLe%iG-*7^<JmWSuGe
z`=X6~y}tEqBGH0UfM{QimB(^$hLuMv1S*-!s`m6fs2Sk?u+_%4zdou+KJCYwPix6R
z`@Z@7wV`c<8uadPLzabw8x{N^%ZgR*haMS;Mgt3H^G^Z*>aSvUGr11~ur7R5CD!~t
zJrFk`>=CQTeAl-~(@;lMMa*V425~|zgw0t&^IKFtJ73+=EUhhsp<5SdAutA9S#}6a
zmHY^7ZKRwK{qUPTccOi>XLetdU1g7<BblSj=Uv+@s_-vv+DAIR{%Anj+x*SaIAVKB
zI?<oB!ob;w2n0)X0{P1)?H`yFX+tK(K<8=J4H8U_7XpWydljk(s!i&pOR*;79KSYa
z^u9k@da?5+nDx?ExWaBZ^BDZ)NNB0rSz0k8P`COY>F*WsG%=5K(R1F)xBS+tdyIRd
zAKk@VJO)mU44P^ySdNi!9Pjbe8}ZoXtf}2Q3qxDIkl%T<su;rjUzLapEuKAoppH6v
zh@K}qA&UYv=5#5nSl|ShJFAMCHG8TrUp%<)j)FoFOzYj&&uTipUG^~PSEV1kx9x~=
z!v&#E;);!OS<I=+r{h`I!c^yB!?J)z*YIU&31Kn=E0Tj%Nvv5>XvMtEtp&~N!wj{c
zk>)P^tKqgvT&~$sUvWy;WmM6rb328X{bzn)2DH*ZW3NRD6yUfRR^bQiYADHN<$qh{
zRQ8$Gay)Nd)=g6x{<OGb^JLx7q%D!CB?-$Hjbs-rkw@&)FU)+b+exOKWwe%>*P^Yf
zZ%N!Sfb$8!Ea+^m2gcTy+?CQ)`rY@6#a=ox$ztn>yIF_*iY^ds%^!mZG;F!p9U!g_
znN^G2ggX_lz$`gl?^WA8ri^>WW6Q%9cEcqdA^M|RE*YNt{Rd+1T1M@d7n@T@RTXBb
z0cipA*&;@9E=Ki6tQ#^ph767^%(JiVj0QhM!TZhao&(#@8fKNm1f5<PPP6syJrnaI
zvuS|kduF?PNDQ5c-M1K)($3P2JahIh>*|_xbG@$_ypkS;tI6+jhL?AIwCID+!DpH3
zlPnI-x4Hw>r_W=oSJjKw1G#18@ll!Ai28$p@dxEmnS$JgLZ0}~tU6<V6MwE-XPZ--
zsVG2Bh9Ql`u6`sV`+t{af%ODn`3^@!I*q6>q+tV27dw^Sue91`ocg29%PE<E%J^b*
zGTl&P1!ihT7%v!44uuueq2r_S$z`7g<zwyqItoQYMc!LIo3g#)uFM94-JOk}TUiuy
zI#;<)wGy7&2>e5@{K0IwDo8%z@lqq`!?3TJsC{uk`2#PmqJ@+ye$HV%F9BjRbzOAf
z{_x<*h)KL)G(a%Ag)M=6G{-MhDJS!Wq9~-6QJu^RoJ1F=<D2i?uV+<n&f?h`H`>rJ
zM&wMf^SxoLD!s`?>8XITry{d*>oaH1{i4cm^9S3H<>=D)68%8EB438I#F`I>%rUF8
zd{ux6{e277B5jKcU-ia_^eNs5A{*GRijmm>Fj$mFPa(0Rbc*938`;QJIz<u{23H@X
zwRH))X74m8{m8=kgEg5^Dzb%~XTVP;p|TQIN=)1|VM<vCNP(TCszZJjI=n9nzI?0O
zhv%KES1Irrp*JR^Phl>IoX@FBLDEw7B0<}BVCUXvD62+?Eb;TRar}11TU6KW)Emq^
zg~rO#@EPPNJC+w^c2MB)1K115^N%CVf>Rh($hIiwveQnWu$m9~y4XU<(`txrA|UZ?
z9LB!KeOEcVIW|T7&O4-$Dln5|Pg+?|-FqHHBArW}o|G~5AbaizMHZyTB1&KTo3}h(
zT=zRm#JRZU+QXYLx4Mz{Vtf4d$(cQKy4WuZ1!2Ov648O}E05s3k?z=$(lJ+PR`pc1
zRFb{h5~OPqC_Ye?)*!xX{~*0^b+Y=6?yB(7k35fx7QS4a_+0m`M9l}Z?M&Kxu)>0B
zN90DNA5%5YsXQ3K@)^&s=#~NZx+yW(4+o~DS{wfyM07DbIj*|dh#puGzkI?M<#1BS
z^kbIe+xJ);e|_HpSt;DZ!D|C>X2P6`)S|jmx6@9a%cig6q2YDcPi@yzs1`PDdFkLY
z;gvGZm&_)`mf*cXp1yabD-7yh@(_;I!&OtC@Mzqyx`C^D9lyT(i<nQH3E5FDj!P_p
zgyoG#luqZ#=6rUppt^t7kqh~bUxNd$VPxq1<mxcb`;SN4C&C439dAL^4r#xR5f#fk
zIc<W=&5cTt!4p0|rcJEv{w5l_0_uJQ>g(7~8Z#{CvfU%k8dmJ!>M>~{-OIRUeL4Rj
z&;M$T(=OWitD$a$^H=^{531+a8v(2%6`@_^Ocn*gE2;2Ca6Y>`Kk;j<AueqvnSfpV
zmF*d>bKsZIdb}QjN4JcZ_-sjdof9(kp!wL)w70OwByL=}pMl9iB|ItuuK2FXUq@-%
zCn}sl^c$gk<>Yt^x6Gp5-vXa*XmT|x$<PS%y>z|)7Km$y=tBoSIBgCtW_2261>GMs
zVpS*=8M6r~@VNBN<<_S>TzXQyp?sp$z|~x>t(8bDyOb3xD*C0fMn<77)TwuvDq+2<
zIj+lP!3FpC1Mvvg4fID&mk4KP>Ni6*k;TftsHDinnoH=~u{o=DIAIXe<Ku89plp^U
zaXXUs=nFs5;AiKckTIV5%R1Rq<E6BL!J1=utyht=v%=v!Deu<|R~i=>tKAU)Ni}+q
zh^+hTW*yQh&;}TvbC?{0J4~*cdhyLi_pE)#MftehU*PO|x$VaaPkReBO0N0SgjQj9
zCa?L(K_E<`>PTB!A$wl4?sG10D}>5Ea7D(F|N2XDUC#>r+2jc|sau}(pgOr(Q#atO
zcEi788mhb|<MXg-!y&>&+ky3`f1Fc@U+aOsm|q%^!M3ldT5iX4wh#f@;Eslt=sXD%
zww|o)<m0B*Q*O9n&D~f%5T&g|2VkD@BY=%g$jQsWFOTFft&Ey^bP!>F4d7;M-tPGP
zd4JbXKM1k-trXj*{t!yr(Iy6~8ZZ0tpnlojY%D8VsOi4Ay^kRu6pR@%hue+67(U%S
zl;Q8nvba@)lT}BV0`osfNuURFA%u?`qOuWQ+H)_akoUjoh}3@Q7`j>#F1oy*u6S*`
zW^uhr1E;PrxgZ|Lxq~jR>Bf8hEH2l5+Hm8`bAV=R-yZ7{@$xx82)e<ai2E)^mZ0i=
z3C8St;O=t{w(V=dd4`q?J#N9fkqy3Rr^{Wp@^%{PeK|siJ`iOSk&|&K;5;`;DQ;T7
z1?9|6R4SIot8<_jDl6}L?KIW*GGZ(U`iCY0ng&1K;YJH<h2MwO8h<glG=C%PznI*=
zFy8wJ`+vsd{t3DbXYS#*vVYEuU%^CEG4Af}-edf)z_$0E@_#*v{>Ag|KV$QM?`b6W
z$LW4}{ng9;)r<bA!AS0pp8O9|SI@)3#nZ{c%ih(6@DESd>(Bb$5km?C^L}ReJJa8b
z?qwJl*!RTYf4S|?rGFjrz90T;S@ze{^S^7pNB{nf`u|PMe}TsTUjXp^)Bo@9`5#v{
B8JPe8

literal 0
HcmV?d00001

diff --git a/trd/trd_v23a_1m.geo.info b/trd/trd_v23a_1m.geo.info
new file mode 100644
index 00000000..44fb7c65
--- /dev/null
+++ b/trd/trd_v23a_1m.geo.info
@@ -0,0 +1,126 @@
+#
+##   trd_v23a_1m information file
+#
+
+# created 20230621
+
+# position
+410.000000 cm z-front position of TRD in hadron   setup
+410.000000 cm z-front position of TRD in electron setup
+490.000000 cm z-front position of TRD in muon     setup
+
+# detector thickness
+284.000000 cm   end   of TRD (z)
+
+# layer thickness
+71.000000 cm   per single layer (z)
+
+# extra gaps
+ 0.000000 0.000000 0.000000 0.000000    extra gaps in z (cm)
+
+# generated TRD layers
+  1  2  3  4    planeID
+
+# dimensions in x
+-312.000000 cm to 312.000000 cm x-dimension of layer  1
+-312.000000 cm to 312.000000 cm x-dimension of layer  2
+-312.000000 cm to 312.000000 cm x-dimension of layer  3
+-312.000000 cm to 312.000000 cm x-dimension of layer  4
+
+# dimensions in y inner modules
+-256.500000 cm to 256.500000 cm y-dimension of layer  1
+-256.500000 cm to 256.500000 cm y-dimension of layer  2
+-256.500000 cm to 256.500000 cm y-dimension of layer  3
+-256.500000 cm to 256.500000 cm y-dimension of layer  4
+
+# dimensions in y outer modules
+-247.500000 cm to 247.500000 cm y-dimension of layer  1
+-247.500000 cm to 247.500000 cm y-dimension of layer  2
+-247.500000 cm to 247.500000 cm y-dimension of layer  3
+-247.500000 cm to 247.500000 cm y-dimension of layer  4
+
+# angles of acceptance for inner + outer modules
+vi: 26.16 deg, vo: 25.36 deg, h: 30.86 deg - vertical/horizontal - layer  1
+vi: 23.38 deg, vo: 22.65 deg, h: 27.74 deg - vertical/horizontal - layer  2
+vi: 21.11 deg, vo: 20.44 deg, h: 25.16 deg - vertical/horizontal - layer  3
+vi: 19.23 deg, vo: 18.60 deg, h: 22.99 deg - vertical/horizontal - layer  4
+
+# inner aperture
+v:  3.12 deg, h:  6.23 deg - vertical/horizontal - layer  1
+v:  2.75 deg, h:  5.49 deg - vertical/horizontal - layer  2
+v:  2.46 deg, h:  4.90 deg - vertical/horizontal - layer  3
+v:  2.22 deg, h:  4.43 deg - vertical/horizontal - layer  4
+
+# z-positions of layer front
+   0.00 cm   z-position of layer  1
+  71.00 cm   z-position of layer  2
+ 142.00 cm   z-position of layer  3
+ 213.00 cm   z-position of layer  4
+
+# flags
+support structure is    : included
+radiator is             : included
+lattice grid is         : included
+kapton window is        : included
+gas frame is            : included
+padplane is             : included
+backpanel is            : included
+Aluminium ledge is      : included
+Power bus bars are      : included
+asics are               : included
+front-end boards are    : included
+GBTX readout boards are : included
+
+# modules
+     mod1     mod2     mod3     mod4     mod5     mod6     mod7     mod8    total
+---------------------------------------------------------------------------------
+       10        0       16        0        8        0        0        0            layer  1
+       10        0       16        0        8        0        0        0            layer  2
+       10        0       16        0        8        0        0        0            layer  3
+       10        0       16        0        8        0        0        0            layer  4
+
+---------------------------------------------------------------------------------
+       40        0       64        0       32        0        0        0      136   number of modules
+# febs
+        8s       4s       2s       4       12       12        4        4            FEBs per module
+                                                                                0   ultimate  FEBs
+      320s       0s     128s                                                  448   super     FEBs
+                                   0      384        0        0        0      384   regular   FEBs
+      320        0      128        0      384        0        0        0      832   number of FEBs
+# asics
+       10       10       10        5        9        9        9        9            ASICs per FEB
+       80       40       20       20      108      108       36       36            ASICs per module
+     3200        0     1280        0     3456        0        0        0     7936   number of ASICs
+# gbtx
+       12        6        3        0       18       18        6        6            GBTXs per module
+      480        0      192        0      576        0        0        0     1248   number of GBTXs
+     3333       33        3        0   333333   333333       33       33            GBTX ROB types on module
+        0        0        0        0        0        0        0        0        0   number of GBTX ROB7
+        0        0        0        0        0        0        0        0        0   number of GBTX ROB5
+      160        0       64        0      192        0        0        0      416   number of GBTX ROB3
+# e-links
+      160       80       40       40      216      216       72       72    15872   e-links used
+      168       84       42        0      252      252       84       84    17472   e-links available
+    95.2%        -    95.2%        -    85.7%        -        -        -    90.8%   e-link efficiency
+
+# channels
+     2560     1280      640      640     3456     3456     1152     1152            channels per module
+      320      320      320      160      288      288      288      288            channels per feb
+   102400        0    40960        0   110592        0        0        0   253952   channels used
+   102400s       0s   40960s       0   110592        0        0        0   253952   channels available
+     0.0%u   56.5%s   43.5%r                                                        channel ratio
+
+   100.0%   channel efficiency
+
+  65.15 m2      total surface    
+  59.82 m2      total active area
+   0.72 m3      total gas volume 
+   2.36 cm2/ch  average channel size
+4245.44 ch/m2   channels per m2 active area
+
+# gas volume position
+   31.6000 cm   position of gas volume - layer  1
+  102.6000 cm   position of gas volume - layer  2
+  173.6000 cm   position of gas volume - layer  3
+  244.6000 cm   position of gas volume - layer  4
+
diff --git a/trd/trd_v23a_1m.geo.root b/trd/trd_v23a_1m.geo.root
new file mode 100644
index 0000000000000000000000000000000000000000..35e380f74c06801ae54994d6d6d8b5c6eb72e6be
GIT binary patch
literal 22875
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

literal 0
HcmV?d00001

-- 
GitLab