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 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 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 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 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