From 0e10fe6e3036e6f188c4aa4ff88cb54490c3c86e Mon Sep 17 00:00:00 2001
From: David Emschermann <d.emschermann@gsi.de>
Date: Tue, 30 Apr 2024 15:44:04 +0200
Subject: [PATCH] [squashed] mTOF geometry v24d

- Introduce TOF geometry macro provided by Ingo Deppner
- Add TOF v24d geometry binaries, provided by Ingo Deppner
- In TOF v24d, fix Z position of odd and even RPCs in module type 0 (17-18/06/2024)
- Made reproducible
---
 .../tof/mcbm/Create_TOF_Geometry_v24d_mcbm.C  | 1326 +++++++++++++++++
 tof/tof_v24d_mcbm.geo.info                    |   15 +
 tof/tof_v24d_mcbm.geo.root                    |  Bin 0 -> 12943 bytes
 3 files changed, 1341 insertions(+)
 create mode 100644 macro/tof/mcbm/Create_TOF_Geometry_v24d_mcbm.C
 create mode 100644 tof/tof_v24d_mcbm.geo.info
 create mode 100644 tof/tof_v24d_mcbm.geo.root

diff --git a/macro/tof/mcbm/Create_TOF_Geometry_v24d_mcbm.C b/macro/tof/mcbm/Create_TOF_Geometry_v24d_mcbm.C
new file mode 100644
index 0000000..0fb5386
--- /dev/null
+++ b/macro/tof/mcbm/Create_TOF_Geometry_v24d_mcbm.C
@@ -0,0 +1,1326 @@
+/* Copyright (C) 2024 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Florian Uhlig, Ingo Deppner [committer], A. Bercuci */
+
+///
+/// \file Create_TOF_Geometry_v24d_mcbm.C
+/// \brief Generates TOF geometry in Root format.
+///
+
+// Changelog
+// 2024-06-17 - v24d - AB - Fix Z position of odd and even RPCs in module type 0
+// 2024-04-30 - v24d - ID - Add 2nd downstream wall of TOF modules
+// 2024-03-26 - v24b - DE - Shifted in z to position measured in the cave
+// 2024-03-26 - v24a - DE - March 2024 setup by NH, script patched by DE in lines 1000 and 1004 to show only 2 STAR modules
+// 2021-11-17 - v24a - QZ - Modified v20d to fit the logic of digibdf.par
+// 2020-04-14 - v20b - NH - swapped double stack layer 2 with STAR2 moodule, buc kept as dummy
+// 2020-04-01 - v20a - NH - move mTOF +20 cm in x direction for the Mar 2020 run
+// 2019-11-28 - v19b - DE - move mTOF +12 cm in x direction for the Nov 2019 run
+// 2019-07-31 - v19a - DE - this TOF March 2019 geometry is also known as v18m
+// 2017-11-03 - v18i - DE - shift mTOF to z=298 cm for acceptance matching with mSTS
+// 2017-10-06 - v18h - DE - put v18f into vertical position to fit into the mCBM cave
+// 2017-07-15 - v18g - DE - swap the z-position of TOF modules: 2 in the front, 3 in the back
+// 2017-07-14 - v18f - DE - reduce vertical gap between TOF modules to fix the gap between modules 1-2 and 4-5
+// 2017-05-17 - v18e - DE - rotate electronics away from beam, shift 16 cm away from beam along x-axis
+// 2017-05-17 - v18d - DE - change geometry name to v18d
+
+// in root all sizes are given in cm
+
+#include "TFile.h"
+#include "TGeoCompositeShape.h"
+#include "TGeoManager.h"
+#include "TGeoMaterial.h"
+#include "TGeoMatrix.h"
+#include "TGeoMedium.h"
+#include "TGeoPgon.h"
+#include "TGeoVolume.h"
+#include "TList.h"
+#include "TMath.h"
+#include "TROOT.h"
+#include "TString.h"
+#include "TSystem.h"
+
+#include <iostream>
+
+// Name of geometry version and output file
+const TString geoVersion      = "tof_v24d_mcbm";  // do not change
+const TString geoVersionStand = geoVersion + "Stand";
+//
+const TString fileTag      = "tof_v24d";
+const TString FileNameSim  = fileTag + "_mcbm.geo.root?reproducible";
+const TString FileNameGeo  = fileTag + "_mcbm_geo.root?reproducible";
+const TString FileNameInfo = fileTag + "_mcbm.geo.info";
+
+// TOF_Z_Front corresponds to front cover of outer super module towers
+const Float_t TOF_Z_Front_Stand = 233.2;  // = z=298 mCBM@SIS18
+const Float_t TOF_Y_Front_Stand = 0.;  
+const Float_t TOF_X_Front_Stand = 0.;  
+const Float_t TOF_Z_Front       = 0;   
+//const Float_t TOF_Z_Front =  130;  // = z=225 mCBM@SIS18
+//const Float_t TOF_Z_Front =  250;  // SIS 100 hadron
+//const Float_t TOF_Z_Front =  450;  // SIS 100 hadron
+//const Float_t TOF_Z_Front =  600;  // SIS 100 electron
+//const Float_t TOF_Z_Front =  650;  // SIS 100 muon
+//const Float_t TOF_Z_Front =  880;  // SIS 300 electron
+//const Float_t TOF_Z_Front = 1020;  // SIS 300 muon
+//
+//const Float_t TOF_Z_Front = 951.5;   // Wall_Z_Position = 1050 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 BoxVolumeMedium     = "aluminium";
+const TString NoActivGasMedium    = "RPCgas_noact";
+const TString ActivGasMedium      = "RPCgas";
+const TString GlasMedium          = "RPCglass";
+const TString ElectronicsMedium   = "carbon";
+
+// Counters:
+// 0 MRPC3a
+// 1 MRPC3b
+// 2 USTC
+// 3
+// 4 Diamond
+//
+// 6 Buc 2019
+// 7 CERN 20gap
+// 8 Ceramic Pad
+const Int_t NumberOfDifferentCounterTypes            = 9;
+const Float_t Glass_X[NumberOfDifferentCounterTypes] = {32., 32., 32., 32., 0.2, 32., 28.8, 20., 2.4};
+const Float_t Glass_Y[NumberOfDifferentCounterTypes] = {27.0, 53., 26.8, 10., 0.2, 10., 6., 20., 2.4};
+const Float_t Glass_Z[NumberOfDifferentCounterTypes] = {0.1, 0.1, 0.1, 0.1, 0.01, 0.1, 0.1, 0.1, 0.1};
+
+const Float_t GasGap_X[NumberOfDifferentCounterTypes] = {32., 32., 32., 32., 0.2, 32., 28.8, 20., 2.4};
+const Float_t GasGap_Y[NumberOfDifferentCounterTypes] = {27.0, 53., 26.8, 10., 0.2, 10., 6., 20., 2.4};
+const Float_t GasGap_Z[NumberOfDifferentCounterTypes] = {0.025, 0.025, 0.025, 0.025, 0.01, 0.02, 0.02, 0.02, 0.025};
+
+const Int_t NumberOfGaps[NumberOfDifferentCounterTypes] = {8, 8, 8, 8, 1, 8, 10, 20, 4};
+//const Int_t NumberOfGaps[NumberOfDifferentCounterTypes] = {1,1,1,1}; //deb
+const Int_t NumberOfReadoutStrips[NumberOfDifferentCounterTypes] = {32, 32, 32, 32, 16, 32, 32, 20, 1};
+//const Int_t NumberOfReadoutStrips[NumberOfDifferentCounterTypes] = {1,1,1,1}; //deb
+
+const Float_t SingleStackStartPosition_Z[NumberOfDifferentCounterTypes] = {-0.6, -0.6, -0.6, -0.6, -0.1,
+                                                                           -0.6, -0.6, -0.6, -1.};
+
+const Float_t Electronics_X[NumberOfDifferentCounterTypes] = {32.0, 32.0, 32.0, 32., 0.3, 0.1, 28.8, 20., 0.1};
+const Float_t Electronics_Y[NumberOfDifferentCounterTypes] = {5.0, 5.0, 1.0, 1., 0.1, 0.1, 1.0, 1.0, 0.1};
+const Float_t Electronics_Z[NumberOfDifferentCounterTypes] = {0.3, 0.3, 0.3, 0.3, 0.1, 0.1, 0.1, 0.1, 0.1};
+
+const Int_t NofModuleTypes = 10;
+// 0 M4 (TSHU)
+// 1 M4 (USTC)
+// 2 M6 (USTC)
+// 5 Diamond
+// 6 Buc
+// 7 Testbox MRPC4
+// 8 Ceramic
+// 9 Star2
+// Aluminum box for all module types
+const Float_t Module_Size_X[NofModuleTypes] = {180., 180., 180., 180., 180., 5., 40., 100., 10., 100.};
+const Float_t Module_Size_Y[NofModuleTypes] = {49., 49., 74., 28., 18., 5., 15., 49., 10., 49.};
+const Float_t Module_Over_Y[NofModuleTypes] = {11.5, 11.5, 11., 4.5, 4.5, 0., 0., 0., 0., 0.};
+const Float_t Module_Size_Z[NofModuleTypes] = {11., 11., 13., 11., 11., 1., 14.5, 11., 1., 11.2};
+const Float_t Module_Thick_Alu_X_left       = 0.1;
+const Float_t Module_Thick_Alu_X_right      = 1.0;
+const Float_t Module_Thick_Alu_Y            = 0.1;
+const Float_t Module_Thick_Alu_Z            = 0.1;
+
+// Distance to the center of the TOF wall [cm];
+const Float_t Wall_Z_Position = 400.;
+const Float_t MeanTheta       = 0.;
+
+//Type of Counter for module
+const Int_t CounterTypeInModule[NofModuleTypes] = {0, 0, 1, 2, 3, 4, 6, 7, 8, 0};
+const Int_t NCounterInModule[NofModuleTypes]    = {5, 5, 5, 5, 5, 1, 2, 1, 8, 2};
+
+// Placement of the counter inside the module
+const Float_t CounterXStartPosition[NofModuleTypes] = {-60.0, -66.0, -61.1,  -60.0, -60.0,  0.0, 0.,  0., 0.,   0.};
+const Float_t CounterXDistance[NofModuleTypes]       = { 30.0,   32.0,  30.45, 30.0,   30.0,  0.0, 0.,  0., 0.,   0.};
+const Float_t CounterYStartPosition[NofModuleTypes] = {   0.0,   0.0,    0.0,     0.0,     0.0,  0.,   0.,  0., 0.,   0.};
+const Float_t CounterYDistance[NofModuleTypes]       = {   0.0,   0.0,    0.0,     0.0,     0.0,  0.,   0.,  0., 0.,   0.};
+const Float_t CounterZDistance[NofModuleTypes]       = {  -2.25,   0.0,    0.0,     2.5,    2.5,   0.,   3.8,  4., 0.1, 4.3};
+const Float_t CounterZStartPosition[NofModuleTypes] = {   3.3,   0.0,    0.0,     0.0,    0.0,   0.,  -1.9, -2., 0.0,-2.2};
+const Float_t CounterRotationAngle[NofModuleTypes]  = {  0.,     8.7,    -10.0,     0.,      0.,     0.,   0.,   0., 0.,   0.};
+const Float_t CounterRotationAngleZ[NofModuleTypes] = { 0.,    0.,       0.0,     0.,      0.,     0.,   0., 90., 0.,   0.};
+// clang-format on
+
+// Pole (support structure)
+const Int_t MaxNumberOfPoles = 20;
+Float_t Pole_ZPos[MaxNumberOfPoles];
+Float_t Pole_Col[MaxNumberOfPoles];
+Int_t NumberOfPoles = 0;
+
+const Float_t Pole_Size_X  = 20.;
+const Float_t Pole_Size_Y  = 300.;
+const Float_t Pole_Size_Z  = 10.;
+const Float_t Pole_Thick_X = 5.;
+const Float_t Pole_Thick_Y = 5.;
+const Float_t Pole_Thick_Z = 5.;
+
+// Bars (support structure)
+const Float_t Bar_Size_X = 20.;
+const Float_t Bar_Size_Y = 20.;
+Float_t Bar_Size_Z       = 100.;
+
+const Int_t MaxNumberOfBars = 20;
+Float_t Bar_ZPos[MaxNumberOfBars];
+Float_t Bar_XPos[MaxNumberOfBars];
+Int_t NumberOfBars = 0;
+
+const Float_t ChamberOverlap = 40;
+const Float_t DxColl         = 158.0;  //Module_Size_X-ChamberOverlap;
+//const Float_t Pole_Offset=Module_Size_X/2.+Pole_Size_X/2.;
+const Float_t Pole_Offset = 90.0 + Pole_Size_X / 2.;
+
+// Position for module placement
+const Float_t Inner_Module_First_Y_Position = 16.;
+const Float_t Inner_Module_Last_Y_Position  = 480.;
+const Float_t Inner_Module_X_Offset         = 0.;  // centered position in x/y
+//const Float_t Inner_Module_X_Offset=18; // shift by 16 cm in x
+const Int_t Inner_Module_NTypes                       = 3;
+const Float_t Inner_Module_Types[Inner_Module_NTypes] = {4., 3., 0.};
+//const Float_t Inner_Module_Number[Inner_Module_NTypes] = {2.,2.,6.}; //V13_3a
+const Float_t Inner_Module_Number[Inner_Module_NTypes] = {2., 2., 1.};  //V13_3a
+//const Float_t Inner_Module_Number[Inner_Module_NTypes] = {0.,0.,0.}; //debugging
+
+const Float_t InnerSide_Module_X_Offset                    = 51.;
+const Float_t InnerSide_Module_NTypes                      = 1;
+const Float_t InnerSide_Module_Types[Inner_Module_NTypes]  = {5.};
+const Float_t InnerSide_Module_Number[Inner_Module_NTypes] = {2.};  //v13_3a
+//const Float_t InnerSide_Module_Number[Inner_Module_NTypes] = {0.};  //debug
+
+const Float_t Outer_Module_First_Y_Position                              = 0.;
+const Float_t Outer_Module_Last_Y_Position                               = 480.;
+const Float_t Outer_Module_X_Offset                                      = 3.;
+const Int_t Outer_Module_Col                                             = 4;
+const Int_t Outer_Module_NTypes                                          = 2;
+const Float_t Outer_Module_Types[Outer_Module_NTypes][Outer_Module_Col]  = {1., 1., 1., 1., 2., 2., 2., 2.};
+const Float_t Outer_Module_Number[Outer_Module_NTypes][Outer_Module_Col] = {9., 9., 2., 0., 0., 0., 3., 4.};  //V13_3a
+//const Float_t Outer_Module_Number[Outer_Module_NTypes][Outer_Module_Col] = {1.,1.,0.,0.,  0.,0.,0.,0.};//debug
+
+const Float_t Star2_First_Z_Position       = TOF_Z_Front + 36.;
+const Float_t Star2_Delta_Z_Position       = 16.;
+const Float_t Star2_First_Y_Position       = -1.3;  //
+const Float_t Star2_Delta_Y_Position       = 0.;   //
+const Int_t Star2_NTypes                   = 2;
+const Float_t Star2_rotate_Z[Star2_NTypes] = {90.,90};
+const Float_t Star2_Types[Star2_NTypes]    = {9.,9};
+const Float_t Star2_Number[Star2_NTypes]   = {1.,1.};   //debugging, V16b
+const Float_t Star2_X_Offset[Star2_NTypes] = {-15.,-15.0};  //{62.};
+
+const Float_t Buc_First_Z_Position     = TOF_Z_Front + 34.75;
+const Float_t Buc_Delta_Z_Position     = 0.;
+const Float_t Buc_First_Y_Position     = 33.5;  //
+const Float_t Buc_Delta_Y_Position     = 0.;     //
+const Float_t Buc_rotate_Z             = 180.;
+const Float_t Buc_rotate_Y             = 0.;
+const Int_t Buc_NTypes                 = 1;
+const Float_t Buc_Types[Buc_NTypes]    = {6.};
+const Float_t Buc_Number[Buc_NTypes]   = {1.};  //debugging, V16b
+const Float_t Buc_X_Offset[Buc_NTypes] = {32.};
+
+const Int_t Cer_NTypes                   = 3;
+const Float_t Cer_Z_Position[Cer_NTypes] = {(float) (TOF_Z_Front + 13.2), (float) (TOF_Z_Front + 45.),
+                                            (float) (TOF_Z_Front + 45.)};
+const Float_t Cer_X_Position[Cer_NTypes] = {0., 49.8, 49.8};
+const Float_t Cer_Y_Position[Cer_NTypes] = {-1., 5., 5.};
+const Float_t Cer_rotate_Z[Cer_NTypes]   = {0., 0., 0.};
+const Float_t Cer_Types[Cer_NTypes]      = {5., 8., 8.};
+const Float_t Cer_Number[Cer_NTypes]     = {1., 1., 1.};  //V16b
+
+
+const Float_t Testbox_MRPC4_Z_Position          = TOF_Z_Front + 15.9;  // 
+const Float_t Testbox_MRPC4_First_Y_Position  = 32.70;
+const Float_t Testbox_MRPC4_X_Offset            = 50.17;  //65.5;
+const Float_t Testbox_MRPC4_rotate_Z            = -90.;
+const Int_t Testbox_MRPC4_NTypes                = 1;
+const Float_t Testbox_MRPC4_Types[Testbox_MRPC4_NTypes]  = {7.};  // this is the SmType!
+const Float_t Testbox_MRPC4_Number[Testbox_MRPC4_NTypes] = {1.};  // evtl. double for split signals
+
+// some global variables
+TGeoManager* gGeoMan = NULL;           // Pointer to TGeoManager instance
+TGeoVolume* gModules[NofModuleTypes];  // Global storage for module types
+TGeoVolume* gCounter[NumberOfDifferentCounterTypes];
+TGeoVolume* gPole;
+TGeoVolume* gBar[MaxNumberOfBars];
+
+const Float_t Dia_Z_Position         = -0.5 - TOF_Z_Front_Stand;
+const Float_t Dia_First_Y_Position   = 0.;
+const Float_t Dia_X_Offset           = 0.;
+const Float_t Dia_rotate_Z           = 0.;
+const Int_t Dia_NTypes               = 1;
+const Float_t Dia_Types[Dia_NTypes]  = {5.};
+const Float_t Dia_Number[Dia_NTypes] = {1.};
+
+Float_t Last_Size_Y = 0.;
+Float_t Last_Over_Y = 0.;
+
+// Forward declarations
+void create_materials_from_media_file();
+TGeoVolume* create_counter(Int_t);
+TGeoVolume* create_new_counter(Int_t);
+TGeoVolume* create_tof_module(Int_t);
+TGeoVolume* create_new_tof_module(Int_t);
+TGeoVolume* create_tof_pole();
+TGeoVolume* create_tof_bar();
+void position_tof_poles(Int_t);
+void position_tof_bars(Int_t);
+void position_inner_tof_modules(Int_t);
+void position_side_tof_modules(Int_t);
+void position_outer_tof_modules(Int_t);
+void position_Dia(Int_t);
+void position_Star2(Int_t);
+void position_Buc(Int_t);
+void position_cer_modules(Int_t);
+void position_Testbox_MRPC4(Int_t);
+void dump_info_file();
+
+
+void Create_TOF_Geometry_v24d_mcbm()
+{
+
+  // Load needed material definition from media.geo file
+  create_materials_from_media_file();
+
+  // Get the GeoManager for later usage
+  gGeoMan = (TGeoManager*) gROOT->FindObject("FAIRGeom");
+  gGeoMan->SetVisLevel(5);  // 2 = super modules
+  gGeoMan->SetVisOption(0);
+
+  // Create the top volume
+  /*
+  TGeoBBox* topbox= new TGeoBBox("", 1000., 1000., 1000.);
+  TGeoVolume* top = new TGeoVolume("top", topbox, gGeoMan->GetMedium("air"));
+  gGeoMan->SetTopVolume(top);
+  */
+
+  TGeoVolume* top = new TGeoVolumeAssembly("TOP");
+  gGeoMan->SetTopVolume(top);
+
+  TGeoRotation* tof_rotation = new TGeoRotation();
+  tof_rotation->RotateY(0.);  // angle with respect to beam axis
+    //tof_rotation->RotateZ(   0 );   // electronics on  9 o'clock position = +x
+  //  tof_rotation->RotateZ(   0 );   // electronics on  9 o'clock position = +x
+  //  tof_rotation->RotateZ(  90 );   // electronics on 12 o'clock position (top)
+  //  tof_rotation->RotateZ( 180 );   // electronics on  3 o'clock position = -x
+  //  tof_rotation->RotateZ( 270 );   // electronics on  6 o'clock position (bottom)
+
+  TGeoVolume* tof = new TGeoVolumeAssembly(geoVersion);
+  //  top->AddNode(tof, 1, tof_rotation);
+  top->AddNode(tof, 1);
+
+  TGeoVolume* tofstand = new TGeoVolumeAssembly(geoVersionStand);
+  // Mar 2020 run
+  TGeoTranslation* stand_trans_local = new TGeoTranslation("", TOF_X_Front_Stand, TOF_Y_Front_Stand, 0.);
+  TGeoTranslation* stand_trans       = new TGeoTranslation("", 0., 0., TOF_Z_Front_Stand);
+  TGeoCombiTrans* stand_combi_trans  = new TGeoCombiTrans(*stand_trans, *tof_rotation);
+
+  TGeoRotation* stand_rot = new TGeoRotation();
+  stand_rot->RotateY(0.);
+  //stand_rot->RotateY(0.97);
+  TGeoCombiTrans* stand_combi_trans_local = new TGeoCombiTrans(*stand_trans_local, *stand_rot);
+
+  //tof->AddNode(tofstand, 1, stand_combi_trans);
+  tof->AddNode(tofstand, 1, stand_combi_trans_local);
+  //tof->AddNode(tofstand, 1);
+
+  for (Int_t counterType = 0; counterType < NumberOfDifferentCounterTypes; counterType++) {
+    gCounter[counterType] = create_new_counter(counterType);
+  }
+
+  for (Int_t moduleType = 0; moduleType < NofModuleTypes; moduleType++) {
+    gModules[moduleType] = create_new_tof_module(moduleType);
+    gModules[moduleType]->SetVisContainers(1);
+  }
+
+  // no pole
+  //  gPole = create_tof_pole();
+
+  //  position_side_tof_modules(1);  // keep order !!
+  //  position_inner_tof_modules(2);
+  position_inner_tof_modules(1);
+  position_Dia(1);
+  position_Star2(2);
+  //  position_cer_modules(3);
+  //  position_CERN(1);
+  position_Buc(1);
+
+  cout << "Outer Types " << Outer_Module_Types[0][0] << ", " << Outer_Module_Types[1][0]
+       << ", col=1:  " << Outer_Module_Types[0][1] << ", " << Outer_Module_Types[1][1] << endl;
+  cout << "Outer Number " << Outer_Module_Number[0][0] << ", " << Outer_Module_Number[1][0]
+       << ", col=1:  " << Outer_Module_Number[0][1] << ", " << Outer_Module_Number[1][1] << endl;
+  //  position_outer_tof_modules(4);
+  // position_tof_poles(0);
+  // position_tof_bars(0);
+
+  gGeoMan->CloseGeometry();
+  gGeoMan->CheckOverlaps(0.001);
+  gGeoMan->PrintOverlaps();
+  gGeoMan->CheckOverlaps(0.001, "s");
+  gGeoMan->PrintOverlaps();
+  gGeoMan->Test();
+
+  tof->Export(FileNameSim);
+  TFile* geoFile = new TFile(FileNameSim, "UPDATE");
+  stand_combi_trans->Write();
+  geoFile->Close();
+
+  /*
+  TFile* outfile1 = new TFile(FileNameSim,"RECREATE");
+  top->Write();
+  //gGeoMan->Write();
+  outfile1->Close();
+*/
+  TFile* outfile2 = new TFile(FileNameGeo, "RECREATE");
+  gGeoMan->Write();
+  outfile2->Close();
+
+  dump_info_file();
+
+  top->SetVisContainers(1);
+  gGeoMan->SetVisLevel(5);
+  top->Draw("ogl");
+  //top->Draw();
+  //gModules[0]->Draw("ogl");
+  //  gModules[0]->Draw("");
+  gModules[0]->SetVisContainers(1);
+  //  gModules[1]->Draw("");
+  gModules[1]->SetVisContainers(1);
+  //gModules[5]->Draw("");
+  //  top->Raytrace();
+}
+
+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 geoFile           = geoPath + "/geometry/media.geo";
+  geoFace->setMediaFile(geoFile);
+  geoFace->readMedia();
+
+  // Read the required media and create them in the GeoManager
+  FairGeoMedia* geoMedia   = geoFace->getMedia();
+  FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
+
+  FairGeoMedium* air          = geoMedia->getMedium("air");
+  FairGeoMedium* aluminium    = geoMedia->getMedium("aluminium");
+  FairGeoMedium* RPCgas       = geoMedia->getMedium("RPCgas");
+  FairGeoMedium* RPCgas_noact = geoMedia->getMedium("RPCgas_noact");
+  FairGeoMedium* RPCglass     = geoMedia->getMedium("RPCglass");
+  FairGeoMedium* carbon       = geoMedia->getMedium("carbon");
+
+  // include check if all media are found
+
+  geoBuild->createMedium(air);
+  geoBuild->createMedium(aluminium);
+  geoBuild->createMedium(RPCgas);
+  geoBuild->createMedium(RPCgas_noact);
+  geoBuild->createMedium(RPCglass);
+  geoBuild->createMedium(carbon);
+}
+
+TGeoVolume* create_counter(Int_t modType)
+{
+
+  //glass
+  Float_t gdx = Glass_X[modType];
+  Float_t gdy = Glass_Y[modType];
+  Float_t gdz = Glass_Z[modType];
+
+  //gas gap
+  Int_t nstrips = NumberOfReadoutStrips[modType];
+  Int_t ngaps   = NumberOfGaps[modType];
+
+
+  Float_t ggdx = GasGap_X[modType];
+  Float_t ggdy = GasGap_Y[modType];
+  Float_t ggdz = GasGap_Z[modType];
+  Float_t gsdx = ggdx / float(nstrips);
+
+  //single stack
+  Float_t dzpos     = gdz + ggdz;
+  Float_t startzpos = SingleStackStartPosition_Z[modType];
+
+  // electronics
+  //pcb dimensions
+  Float_t dxe  = Electronics_X[modType];
+  Float_t dye  = Electronics_Y[modType];
+  Float_t dze  = Electronics_Z[modType];
+  Float_t yele = (gdy + 0.1) / 2. + dye / 2.;
+
+  // needed materials
+  TGeoMedium* glassPlateVolMed  = gGeoMan->GetMedium(GlasMedium);
+  TGeoMedium* noActiveGasVolMed = gGeoMan->GetMedium(NoActivGasMedium);
+  TGeoMedium* activeGasVolMed   = gGeoMan->GetMedium(ActivGasMedium);
+  TGeoMedium* electronicsVolMed = gGeoMan->GetMedium(ElectronicsMedium);
+
+  // Single glass plate
+  TGeoBBox* glass_plate       = new TGeoBBox("", gdx / 2., gdy / 2., gdz / 2.);
+  TGeoVolume* glass_plate_vol = new TGeoVolume("tof_glass", glass_plate, glassPlateVolMed);
+  glass_plate_vol->SetLineColor(kMagenta);  // set line color for the glass plate
+  glass_plate_vol->SetTransparency(20);     // set transparency for the TOF
+  TGeoTranslation* glass_plate_trans = new TGeoTranslation("", 0., 0., 0.);
+
+  // Single gas gap
+  TGeoBBox* gas_gap = new TGeoBBox("", ggdx / 2., ggdy / 2., ggdz / 2.);
+  //TGeoVolume* gas_gap_vol =
+  //new TGeoVolume("tof_gas_gap", gas_gap, noActiveGasVolMed);
+  TGeoVolume* gas_gap_vol = new TGeoVolume("tof_gas_active", gas_gap, activeGasVolMed);
+  gas_gap_vol->Divide("Strip", 1, nstrips, -ggdx / 2., 0);
+
+  gas_gap_vol->SetLineColor(kRed);   // set line color for the gas gap
+  gas_gap_vol->SetTransparency(70);  // set transparency for the TOF
+  TGeoTranslation* gas_gap_trans = new TGeoTranslation("", 0., 0., (gdz + ggdz) / 2.);
+
+
+  // Single subdivided active gas gap
+  /*
+    TGeoBBox* gas_active = new TGeoBBox("", gsdx/2., ggdy/2., ggdz/2.);
+    TGeoVolume* gas_active_vol = 
+    new TGeoVolume("tof_gas_active", gas_active, activeGasVolMed);
+  gas_active_vol->SetLineColor(kBlack); // set line color for the gas gap
+  gas_active_vol->SetTransparency(70); // set transparency for the TOF
+  */
+
+  // Add glass plate, inactive gas gap and active gas gaps to a single stack
+  TGeoVolume* single_stack = new TGeoVolumeAssembly("single_stack");
+  single_stack->AddNode(glass_plate_vol, 0, glass_plate_trans);
+  single_stack->AddNode(gas_gap_vol, 0, gas_gap_trans);
+
+  /*
+  for (Int_t l=0; l<nstrips; l++){
+    TGeoTranslation* gas_active_trans 
+      = new TGeoTranslation("", -ggdx/2+(l+0.5)*gsdx, 0., 0.);
+    gas_gap_vol->AddNode(gas_active_vol, l, gas_active_trans);
+    //    single_stack->AddNode(gas_active_vol, l, gas_active_trans);
+  }
+  */
+
+  // Add 8 single stacks + one glass plate at the e09.750nd to a multi stack
+  TGeoVolume* multi_stack = new TGeoVolumeAssembly("multi_stack");
+  Int_t l;
+  for (l = 0; l < ngaps; l++) {
+    TGeoTranslation* single_stack_trans = new TGeoTranslation("", 0., 0., startzpos + l * dzpos);
+    multi_stack->AddNode(single_stack, l, single_stack_trans);
+  }
+  TGeoTranslation* single_glass_back_trans = new TGeoTranslation("", 0., 0., startzpos + ngaps * dzpos);
+  multi_stack->AddNode(glass_plate_vol, l, single_glass_back_trans);
+
+  // Add electronics above and below the glass stack to build a complete counter
+  TGeoVolume* counter                = new TGeoVolumeAssembly("counter");
+  TGeoTranslation* multi_stack_trans = new TGeoTranslation("", 0., 0., 0.);
+  counter->AddNode(multi_stack, l, multi_stack_trans);
+
+  TGeoBBox* pcb       = new TGeoBBox("", dxe / 2., dye / 2., dze / 2.);
+  TGeoVolume* pcb_vol = new TGeoVolume("pcb", pcb, electronicsVolMed);
+  pcb_vol->SetLineColor(kCyan);  // set line color for the gas gap
+  pcb_vol->SetTransparency(10);  // set transparency for the TOF
+  for (Int_t l = 0; l < 2; l++) {
+    yele *= -1.;
+    TGeoTranslation* pcb_trans = new TGeoTranslation("", 0., yele, 0.);
+    counter->AddNode(pcb_vol, l, pcb_trans);
+  }
+
+  return counter;
+}
+
+TGeoVolume* create_new_counter(Int_t modType)
+{
+
+  //glass
+  Float_t gdx = Glass_X[modType];
+  Float_t gdy = Glass_Y[modType];
+  Float_t gdz = Glass_Z[modType];
+
+  //gas gap
+  Int_t nstrips = NumberOfReadoutStrips[modType];
+  Int_t ngaps   = NumberOfGaps[modType];
+
+
+  Float_t ggdx = GasGap_X[modType];
+  Float_t ggdy = GasGap_Y[modType];
+  Float_t ggdz = GasGap_Z[modType];
+  Float_t gsdx = ggdx / (Float_t)(nstrips);
+
+  // electronics
+  //pcb dimensions
+  Float_t dxe  = Electronics_X[modType];
+  Float_t dye  = Electronics_Y[modType];
+  Float_t dze  = Electronics_Z[modType];
+  Float_t yele = gdy / 2. + dye / 2.;
+
+  // counter size (calculate from glas, gap and electronics sizes)
+  Float_t cdx = TMath::Max(gdx, ggdx);
+  cdx         = TMath::Max(cdx, dxe) + 0.2;
+  Float_t cdy = TMath::Max(gdy, ggdy) + 2 * dye + 0.2;
+  Float_t cdz = ngaps * ggdz + (ngaps + 1) * gdz + 0.2;  // ngaps * (gdz+ggdz) + gdz + 0.2; // ok
+
+  //calculate thickness and first position in counter of single stack
+  Float_t dzpos         = gdz + ggdz;
+  Float_t startzposglas = -ngaps * (gdz + ggdz) / 2.;  // -cdz/2.+0.1+gdz/2.; // ok  // (-cdz+gdz)/2.; // not ok
+  Float_t startzposgas  = startzposglas + gdz / 2. + ggdz / 2.;  // -cdz/2.+0.1+gdz   +ggdz/2.;  // ok
+
+
+  // needed materials
+  TGeoMedium* glassPlateVolMed  = gGeoMan->GetMedium(GlasMedium);
+  TGeoMedium* noActiveGasVolMed = gGeoMan->GetMedium(NoActivGasMedium);
+  TGeoMedium* activeGasVolMed   = gGeoMan->GetMedium(ActivGasMedium);
+  TGeoMedium* electronicsVolMed = gGeoMan->GetMedium(ElectronicsMedium);
+
+
+  // define counter volume
+  TGeoBBox* counter_box = new TGeoBBox("", cdx / 2., cdy / 2., cdz / 2.);
+  TGeoVolume* counter   = new TGeoVolume("counter", counter_box, noActiveGasVolMed);
+  counter->SetLineColor(kRed);   // set line color for the counter
+  counter->SetTransparency(70);  // set transparency for the TOF
+
+  // define single glass plate volume
+  TGeoBBox* glass_plate       = new TGeoBBox("", gdx / 2., gdy / 2., gdz / 2.);
+  TGeoVolume* glass_plate_vol = new TGeoVolume("tof_glass", glass_plate, glassPlateVolMed);
+  glass_plate_vol->SetLineColor(kMagenta);  // set line color for the glass plate
+  glass_plate_vol->SetTransparency(20);     // set transparency for the TOF
+  // define single gas gap volume
+  TGeoBBox* gas_gap       = new TGeoBBox("", ggdx / 2., ggdy / 2., ggdz / 2.);
+  TGeoVolume* gas_gap_vol = new TGeoVolume("Gap", gas_gap, activeGasVolMed);
+  gas_gap_vol->Divide("Cell", 1, nstrips, -ggdx / 2., 0);
+  gas_gap_vol->SetLineColor(kRed);   // set line color for the gas gap
+  gas_gap_vol->SetTransparency(99);  // set transparency for the TOF
+
+  // place 8 gas gaps and 9 glas plates in the counter
+  for (Int_t igap = 0; igap <= ngaps; igap++) {
+    // place (ngaps+1) glass plates
+    Float_t zpos_glas                  = startzposglas + igap * dzpos;
+    TGeoTranslation* glass_plate_trans = new TGeoTranslation("", 0., 0., zpos_glas);
+    counter->AddNode(glass_plate_vol, igap, glass_plate_trans);
+    // place ngaps gas gaps
+    if (igap < ngaps) {
+      Float_t zpos_gas               = startzposgas + igap * dzpos;
+      TGeoTranslation* gas_gap_trans = new TGeoTranslation("", 0., 0., zpos_gas);
+      counter->AddNode(gas_gap_vol, igap, gas_gap_trans);
+    }
+    //    cout <<"Zpos(Glas): "<< zpos_glas << endl;
+    //    cout <<"Zpos(Gas): "<< zpos_gas << endl;
+  }
+
+  // create and place the electronics above and below the glas stack
+  TGeoBBox* pcb       = new TGeoBBox("", dxe / 2., dye / 2., dze / 2.);
+  TGeoVolume* pcb_vol = new TGeoVolume("pcb", pcb, electronicsVolMed);
+  pcb_vol->SetLineColor(kYellow);  // kCyan); // set line color for electronics
+  pcb_vol->SetTransparency(10);    // set transparency for the TOF
+  for (Int_t l = 0; l < 2; l++) {
+    yele *= -1.;
+    TGeoTranslation* pcb_trans = new TGeoTranslation("", 0., yele, 0.);
+    counter->AddNode(pcb_vol, l, pcb_trans);
+  }
+
+
+  return counter;
+}
+
+TGeoVolume* create_tof_module(Int_t modType)
+{
+  Int_t cType         = CounterTypeInModule[modType];
+  Float_t dx          = Module_Size_X[modType];
+  Float_t dy          = Module_Size_Y[modType];
+  Float_t dz          = Module_Size_Z[modType];
+  Float_t width_aluxl = Module_Thick_Alu_X_left;
+  Float_t width_aluxr = Module_Thick_Alu_X_right;
+  Float_t width_aluy  = Module_Thick_Alu_Y;
+  Float_t width_aluz  = Module_Thick_Alu_Z;
+
+  Float_t shift_gas_box = (Module_Thick_Alu_X_right - Module_Thick_Alu_X_left) / 2;
+
+  Float_t dxpos     = CounterXDistance[modType];
+  Float_t startxpos = CounterXStartPosition[modType];
+  Float_t dzoff     = CounterZDistance[modType];
+  Float_t rotangle  = CounterRotationAngle[modType];
+
+  TGeoMedium* boxVolMed         = gGeoMan->GetMedium(BoxVolumeMedium);
+  TGeoMedium* noActiveGasVolMed = gGeoMan->GetMedium(NoActivGasMedium);
+
+  TString moduleName = Form("module_%d", modType);
+  TGeoVolume* module = new TGeoVolumeAssembly(moduleName);
+
+  TGeoBBox* alu_box       = new TGeoBBox("", dx / 2., dy / 2., dz / 2.);
+  TGeoVolume* alu_box_vol = new TGeoVolume("alu_box", alu_box, boxVolMed);
+  alu_box_vol->SetLineColor(kGreen);  // set line color for the alu box
+  alu_box_vol->SetTransparency(20);   // set transparency for the TOF
+  TGeoTranslation* alu_box_trans = new TGeoTranslation("", 0., 0., 0.);
+  module->AddNode(alu_box_vol, 0, alu_box_trans);
+
+  TGeoBBox* gas_box =
+    new TGeoBBox("", (dx - (width_aluxl + width_aluxr)) / 2., (dy - 2 * width_aluy) / 2., (dz - 2 * width_aluz) / 2.);
+  TGeoVolume* gas_box_vol = new TGeoVolume("gas_box", gas_box, noActiveGasVolMed);
+  gas_box_vol->SetLineColor(kYellow);  // set line color for the gas box
+  gas_box_vol->SetTransparency(70);    // set transparency for the TOF
+  TGeoTranslation* gas_box_trans = new TGeoTranslation("", shift_gas_box, 0., 0.);
+  alu_box_vol->AddNode(gas_box_vol, 0, gas_box_trans);
+
+  for (Int_t j = 0; j < 5; j++) {  //loop over counters (modules)
+    Float_t zpos;
+    if (0 == modType) { zpos = dzoff *= -1; }
+    else {
+      zpos = 0.;
+    }
+    //cout << "counter z position " << zpos << endl;
+    TGeoTranslation* counter_trans = new TGeoTranslation("", startxpos + j * dxpos, 0.0, zpos);
+
+    TGeoRotation* counter_rot = new TGeoRotation();
+    counter_rot->RotateY(rotangle);
+    TGeoCombiTrans* counter_combi_trans = new TGeoCombiTrans(*counter_trans, *counter_rot);
+    gas_box_vol->AddNode(gCounter[cType], j, counter_combi_trans);
+  }
+
+  return module;
+}
+
+TGeoVolume* create_new_tof_module(Int_t modType)
+{
+  Int_t cType         = CounterTypeInModule[modType];
+  Float_t dx          = Module_Size_X[modType];
+  Float_t dy          = Module_Size_Y[modType];
+  Float_t dz          = Module_Size_Z[modType];
+  Float_t width_aluxl = Module_Thick_Alu_X_left;
+  Float_t width_aluxr = Module_Thick_Alu_X_right;
+  Float_t width_aluy  = Module_Thick_Alu_Y;
+  Float_t width_aluz  = Module_Thick_Alu_Z;
+
+  Float_t shift_gas_box = (Module_Thick_Alu_X_right - Module_Thick_Alu_X_left) / 2;
+
+  Float_t dxpos     = CounterXDistance[modType];
+  Float_t startxpos = CounterXStartPosition[modType];
+  Float_t dypos     = CounterYDistance[modType];
+  Float_t startypos = CounterYStartPosition[modType];
+  Float_t dzoff     = CounterZDistance[modType];
+  Float_t rotangle  = CounterRotationAngle[modType];
+
+  TGeoMedium* boxVolMed         = gGeoMan->GetMedium(BoxVolumeMedium);
+  TGeoMedium* noActiveGasVolMed = gGeoMan->GetMedium(NoActivGasMedium);
+
+  TString moduleName = Form("module_%d", modType);
+
+  TGeoBBox* module_box = new TGeoBBox("", dx / 2., dy / 2., dz / 2.);
+  TGeoVolume* module   = new TGeoVolume(moduleName, module_box, boxVolMed);
+  module->SetLineColor(kGreen);  // set line color for the alu box
+  module->SetTransparency(20);   // set transparency for the TOF
+
+  TGeoBBox* gas_box =
+    new TGeoBBox("", (dx - (width_aluxl + width_aluxr)) / 2., (dy - 2 * width_aluy) / 2., (dz - 2 * width_aluz) / 2.);
+  TGeoVolume* gas_box_vol = new TGeoVolume("gas_box", gas_box, noActiveGasVolMed);
+  gas_box_vol->SetLineColor(kBlue);  // set line color for the alu box
+  gas_box_vol->SetTransparency(50);  // set transparency for the TOF
+  TGeoTranslation* gas_box_trans = new TGeoTranslation("", shift_gas_box, 0., 0.);
+  module->AddNode(gas_box_vol, 0, gas_box_trans);
+
+  for (Int_t j = 0; j < NCounterInModule[modType]; j++) {  //loop over counters (modules)
+                                                           //for (Int_t j=0; j< 1; j++){ //loop over counters (modules)
+    Float_t xpos, ypos, zpos;
+    if (0 == modType || 3 == modType || 4 == modType || 5 == modType) { zpos = dzoff *= -1; }
+    else {
+      zpos = CounterZStartPosition[modType] + j * dzoff;
+    }
+    //cout << "counter z position " << zpos << endl;
+    xpos = startxpos + j * dxpos;
+    ypos = startypos + j * dypos;
+
+    TGeoTranslation* counter_trans = new TGeoTranslation("", xpos, ypos, zpos);
+
+    TGeoRotation* counter_rot = new TGeoRotation();
+    counter_rot->RotateY(rotangle);
+    if ( CounterRotationAngleZ[modType] != 0. ) counter_rot->RotateZ(CounterRotationAngleZ[modType]);
+    TGeoCombiTrans* counter_combi_trans = new TGeoCombiTrans(*counter_trans, *counter_rot);
+    gas_box_vol->AddNode(gCounter[cType], j, counter_combi_trans);
+  }
+
+  return module;
+}
+
+
+TGeoVolume* create_tof_pole()
+{
+  // needed materials
+  TGeoMedium* boxVolMed = gGeoMan->GetMedium(BoxVolumeMedium);
+  TGeoMedium* airVolMed = gGeoMan->GetMedium(KeepingVolumeMedium);
+
+  Float_t dx         = Pole_Size_X;
+  Float_t dy         = Pole_Size_Y;
+  Float_t dz         = Pole_Size_Z;
+  Float_t width_alux = Pole_Thick_X;
+  Float_t width_aluy = Pole_Thick_Y;
+  Float_t width_aluz = Pole_Thick_Z;
+
+  TGeoVolume* pole         = new TGeoVolumeAssembly("Pole");
+  TGeoBBox* pole_alu_box   = new TGeoBBox("", dx / 2., dy / 2., dz / 2.);
+  TGeoVolume* pole_alu_vol = new TGeoVolume("pole_alu", pole_alu_box, boxVolMed);
+  pole_alu_vol->SetLineColor(kGreen);  // set line color for the alu box
+  pole_alu_vol->SetTransparency(20);   // set transparency for the TOF
+  TGeoTranslation* pole_alu_trans = new TGeoTranslation("", 0., 0., 0.);
+  pole->AddNode(pole_alu_vol, 0, pole_alu_trans);
+
+  Float_t air_dx = dx / 2. - width_alux;
+  Float_t air_dy = dy / 2. - width_aluy;
+  Float_t air_dz = dz / 2. - width_aluz;
+
+  //  cout << "My pole." << endl;
+  if (air_dx <= 0.) cout << "ERROR - No air volume in pole X, size: " << air_dx << endl;
+  if (air_dy <= 0.) cout << "ERROR - No air volume in pole Y, size: " << air_dy << endl;
+  if (air_dz <= 0.) cout << "ERROR - No air volume in pole Z, size: " << air_dz << endl;
+
+  if ((air_dx > 0.) && (air_dy > 0.) && (air_dz > 0.))  // crate air volume only, if larger than zero
+  {
+    TGeoBBox* pole_air_box = new TGeoBBox("", air_dx, air_dy, air_dz);
+    //  TGeoBBox* pole_air_box = new TGeoBBox("", dx/2.-width_alux, dy/2.-width_aluy, dz/2.-width_aluz);
+    TGeoVolume* pole_air_vol = new TGeoVolume("pole_air", pole_air_box, airVolMed);
+    pole_air_vol->SetLineColor(kYellow);  // set line color for the alu box
+    pole_air_vol->SetTransparency(70);    // set transparency for the TOF
+    TGeoTranslation* pole_air_trans = new TGeoTranslation("", 0., 0., 0.);
+    pole_alu_vol->AddNode(pole_air_vol, 0, pole_air_trans);
+  }
+  else
+    cout << "Skipping pole_air_vol, no thickness: " << air_dx << " " << air_dy << " " << air_dz << endl;
+
+  return pole;
+}
+
+TGeoVolume* create_tof_bar(Float_t dx, Float_t dy, Float_t dz)
+{
+  // needed materials
+  TGeoMedium* boxVolMed = gGeoMan->GetMedium(BoxVolumeMedium);
+  TGeoMedium* airVolMed = gGeoMan->GetMedium(KeepingVolumeMedium);
+
+  Float_t width_alux = Pole_Thick_X;
+  Float_t width_aluy = Pole_Thick_Y;
+  Float_t width_aluz = Pole_Thick_Z;
+
+  TGeoVolume* bar         = new TGeoVolumeAssembly("Bar");
+  TGeoBBox* bar_alu_box   = new TGeoBBox("", dx / 2., dy / 2., dz / 2.);
+  TGeoVolume* bar_alu_vol = new TGeoVolume("bar_alu", bar_alu_box, boxVolMed);
+  bar_alu_vol->SetLineColor(kGreen);  // set line color for the alu box
+  bar_alu_vol->SetTransparency(20);   // set transparency for the TOF
+  TGeoTranslation* bar_alu_trans = new TGeoTranslation("", 0., 0., 0.);
+  bar->AddNode(bar_alu_vol, 0, bar_alu_trans);
+
+  TGeoBBox* bar_air_box   = new TGeoBBox("", dx / 2. - width_alux, dy / 2. - width_aluy, dz / 2. - width_aluz);
+  TGeoVolume* bar_air_vol = new TGeoVolume("bar_air", bar_air_box, airVolMed);
+  bar_air_vol->SetLineColor(kYellow);  // set line color for the alu box
+  bar_air_vol->SetTransparency(70);    // set transparency for the TOF
+  TGeoTranslation* bar_air_trans = new TGeoTranslation("", 0., 0., 0.);
+  bar_alu_vol->AddNode(bar_air_vol, 0, bar_air_trans);
+
+  return bar;
+}
+
+void position_tof_poles(Int_t modType)
+{
+
+  TGeoTranslation* pole_trans = NULL;
+
+  Int_t numPoles = 0;
+  for (Int_t i = 0; i < NumberOfPoles; i++) {
+    if (i < 2) {
+      pole_trans = new TGeoTranslation("", -Pole_Offset + 2.0, 0., Pole_ZPos[i]);
+      gGeoMan->GetVolume(geoVersionStand)->AddNode(gPole, numPoles, pole_trans);
+      numPoles++;
+    }
+    else {
+      Float_t xPos = Pole_Offset + Pole_Size_X / 2. + Pole_Col[i] * DxColl;
+      Float_t zPos = Pole_ZPos[i];
+      pole_trans   = new TGeoTranslation("", xPos, 0., zPos);
+      gGeoMan->GetVolume(geoVersionStand)->AddNode(gPole, numPoles, pole_trans);
+      numPoles++;
+
+      pole_trans = new TGeoTranslation("", -xPos, 0., zPos);
+      gGeoMan->GetVolume(geoVersionStand)->AddNode(gPole, numPoles, pole_trans);
+      numPoles++;
+    }
+    cout << " Position Pole " << numPoles << " at z=" << Pole_ZPos[i] << endl;
+  }
+}
+
+void position_tof_bars(Int_t modType)
+{
+
+  TGeoTranslation* bar_trans = NULL;
+
+  Int_t numBars = 0;
+  Int_t i;
+  Float_t xPos;
+  Float_t yPos;
+  Float_t zPos;
+
+  for (i = 0; i < NumberOfBars; i++) {
+
+    xPos = Bar_XPos[i];
+    zPos = Bar_ZPos[i];
+    yPos = Pole_Size_Y / 2. + Bar_Size_Y / 2.;
+
+    bar_trans = new TGeoTranslation("", xPos, yPos, zPos);
+    gGeoMan->GetVolume(geoVersionStand)->AddNode(gBar[i], numBars, bar_trans);
+    numBars++;
+
+    bar_trans = new TGeoTranslation("", xPos, -yPos, zPos);
+    gGeoMan->GetVolume(geoVersionStand)->AddNode(gBar[i], numBars, bar_trans);
+    numBars++;
+
+    bar_trans = new TGeoTranslation("", -xPos, yPos, zPos);
+    gGeoMan->GetVolume(geoVersionStand)->AddNode(gBar[i], numBars, bar_trans);
+    numBars++;
+
+    bar_trans = new TGeoTranslation("", -xPos, -yPos, zPos);
+    gGeoMan->GetVolume(geoVersionStand)->AddNode(gBar[i], numBars, bar_trans);
+    numBars++;
+  }
+  cout << " Position Bar " << numBars << " at z=" << Bar_ZPos[i] << endl;
+
+  // horizontal frame bars
+  i = NumberOfBars;
+  NumberOfBars++;
+  // no bar
+  //   gBar[i]=create_tof_bar(2.*xPos+Pole_Size_X,Bar_Size_Y,Bar_Size_Y);
+
+  zPos      = Pole_ZPos[0] + Pole_Size_Z / 2.;
+  bar_trans = new TGeoTranslation("", 0., yPos, zPos);
+  gGeoMan->GetVolume(geoVersionStand)->AddNode(gBar[i], numBars, bar_trans);
+  numBars++;
+
+  bar_trans = new TGeoTranslation("", 0., -yPos, zPos);
+  gGeoMan->GetVolume(geoVersionStand)->AddNode(gBar[i], numBars, bar_trans);
+  numBars++;
+}
+
+void position_inner_tof_modules(Int_t modNType)
+{
+  TGeoTranslation* module_trans = NULL;
+
+  //  Int_t numModules=(Int_t)( (Inner_Module_Last_Y_Position-Inner_Module_First_Y_Position)/Module_Size_Y[modType])+1;
+  Float_t yPos = Inner_Module_First_Y_Position;
+  Int_t ii     = 0;
+  Float_t xPos = Inner_Module_X_Offset;
+  Float_t zPos = Wall_Z_Position;
+
+  Pole_ZPos[NumberOfPoles] = zPos;
+  Pole_Col[NumberOfPoles]  = 0;
+  NumberOfPoles++;
+
+  Float_t DzPos = 0.;
+  for (Int_t j = 0; j < modNType; j++) {
+    if (Module_Size_Z[j] > DzPos) { DzPos = Module_Size_Z[j]; }
+  }
+  Pole_ZPos[NumberOfPoles] = zPos + DzPos;
+  Pole_Col[NumberOfPoles]  = 0;
+  NumberOfPoles++;
+
+  // Mar2019 setup
+  Int_t modNum[4]                = {4 * 0};
+  const Int_t NModules           = 8;
+  xPos                           = 0.;
+  yPos                           = 0.;
+  zPos                           = TOF_Z_Front;
+  const Int_t ModType[NModules]  = {0, 0, 0, 0, 0, 0, 2, 2};
+  const Double_t ModDx[NModules] = {0., 0., 0., 0., 0., 0., 0., 0.};
+  //const Double_t ModDx[NModules]= { 1.5,    0., -1.5, 49.8, 55.8};
+  const Double_t ModDy[NModules]     = {50., 0., -50.0, 27., -27.0, 0., 37.5, -37.5};
+  const Double_t ModDz[NModules]     = {0., 0, 0, 20., 20., 92., 72., 72};
+  const Double_t ModAng[NModules]    = {0., 0., 0., 0., 0., 0., 0., 0.};
+  TGeoRotation* module_rot           = NULL;
+  TGeoCombiTrans* module_combi_trans = NULL;
+
+  /*
+  for (Int_t iMod = 0; iMod < NModules; iMod++) {
+    module_trans = new TGeoTranslation("", xPos + ModDx[iMod], yPos + ModDy[iMod], zPos + ModDz[iMod]);
+    module_rot   = new TGeoRotation();
+    module_rot->RotateZ(ModAng[iMod]);
+    module_combi_trans = new TGeoCombiTrans(*module_trans, *module_rot);
+    if (iMod < 5) { gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[0], modNum, module_combi_trans); }
+    else {
+      gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[2], modNum, module_combi_trans);
+    }
+    modNum++;
+  }
+*/
+
+  for (Int_t iMod = 0; iMod < NModules; iMod++) {
+    module_trans = new TGeoTranslation("", xPos + ModDx[iMod], yPos + ModDy[iMod], zPos + ModDz[iMod]);
+    module_rot   = new TGeoRotation();
+    module_rot->RotateZ(ModAng[iMod]);
+    module_combi_trans = new TGeoCombiTrans(*module_trans, *module_rot);
+    gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[ModType[iMod]], modNum[ModType[iMod]], module_combi_trans);
+    cout << "Placed Module " << modNum[ModType[iMod]] << ", Type " << ModType[iMod] << endl;
+    modNum[ModType[iMod]]++;
+  }
+
+  /*
+ module_trans = new TGeoTranslation("", xPos, 0, zPos+16.5);
+ gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum, module_trans);
+ modNum++;
+ 
+ // module_trans = new TGeoTranslation("", xPos, 49+3, zPos);
+ module_trans = new TGeoTranslation("", xPos, 0, zPos+16.5+17.5);
+ gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum, module_trans);
+ modNum++;
+
+ // module_trans = new TGeoTranslation("", xPos,-26, zPos+Module_Size_Z[modType]);
+ module_trans = new TGeoTranslation("", xPos, -49.8, zPos);
+ gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum, module_trans);
+ modNum++;
+
+ // module_trans = new TGeoTranslation("", xPos, 26, zPos+Module_Size_Z[modType]);
+ module_trans = new TGeoTranslation("", xPos, -49.8, zPos+16.5);
+ gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum, module_trans);
+ modNum++;
+ */
+}
+
+
+void position_Dia(Int_t modNType)
+{
+  TGeoTranslation* module_trans = NULL;
+  TGeoRotation* module_rot      = new TGeoRotation();
+  module_rot->RotateZ(Dia_rotate_Z);
+  TGeoCombiTrans* module_combi_trans = NULL;
+
+  //  Int_t numModules=(Int_t)( (Inner_Module_Last_Y_Position-Inner_Module_First_Y_Position)/Module_Size_Y[modType])+1;
+  Float_t yPos = Dia_First_Y_Position;
+  Int_t ii     = 0;
+  Float_t xPos = Dia_X_Offset;
+  Float_t zPos = Dia_Z_Position;
+
+  Int_t modNum = 0;
+  for (Int_t j = 0; j < modNType; j++) {
+    Int_t modType = Dia_Types[j];
+    for (Int_t i = 0; i < Dia_Number[j]; i++) {
+      ii++;
+      module_trans       = new TGeoTranslation("", xPos, yPos, zPos);
+      module_combi_trans = new TGeoCombiTrans(*module_trans, *module_rot);
+      gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum, module_combi_trans);
+      modNum++;
+    }
+  }
+}
+
+void position_Star2(Int_t modNType)
+{ 
+  TGeoTranslation* module_trans = NULL;
+  TGeoCombiTrans* module_combi_trans = NULL;
+  TGeoRotation* module_rot           = NULL;
+  Float_t yPos = Star2_First_Y_Position;
+  Float_t zPos = Star2_First_Z_Position;
+  Int_t ii     = 0;
+
+  Int_t modNum = 0;
+  for (Int_t j = 0; j < modNType; j++) {
+    Int_t modType = Star2_Types[j];
+    Float_t xPos  = Star2_X_Offset[j];
+    module_rot    = new TGeoRotation();
+    module_rot->RotateZ(Star2_rotate_Z[j]);
+    for (Int_t i = 0; i < Star2_Number[j]; i++) {
+      ii++;
+      module_trans       = new TGeoTranslation("", xPos, yPos, zPos);
+      module_combi_trans = new TGeoCombiTrans(*module_trans, *module_rot);
+      gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum, module_combi_trans);
+      modNum++;
+      yPos += Star2_Delta_Y_Position;
+      zPos += Star2_Delta_Z_Position;
+    }
+  }
+}
+
+void position_Buc(Int_t modNType)
+{
+  TGeoTranslation* module_trans = NULL;
+  TGeoRotation* module_rot      = new TGeoRotation();
+  module_rot->RotateZ(Buc_rotate_Z);
+  module_rot->RotateY(Buc_rotate_Y);
+  TGeoCombiTrans* module_combi_trans = NULL;
+
+  Float_t yPos = Buc_First_Y_Position;
+  Float_t zPos = Buc_First_Z_Position;
+  Int_t ii     = 0;
+
+  Int_t modNum = 0;
+  for (Int_t j = 0; j < modNType; j++) {
+    Int_t modType = Buc_Types[j];
+    Float_t xPos  = Buc_X_Offset[j];
+    for (Int_t i = 0; i < Buc_Number[j]; i++) {
+      ii++;
+      module_trans       = new TGeoTranslation("", xPos, yPos, zPos);
+      module_combi_trans = new TGeoCombiTrans(*module_trans, *module_rot);
+      gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum, module_combi_trans);
+      modNum++;
+      yPos += Buc_Delta_Y_Position;
+      zPos += Buc_Delta_Z_Position;
+    }
+  }
+}
+
+void position_cer_modules(Int_t modNType)
+{
+  Int_t ii     = 0;
+  Int_t modNum = 0;
+  for (Int_t j = 1; j < modNType; j++) {
+    Int_t modType                 = Cer_Types[j];
+    Float_t xPos                  = Cer_X_Position[j];
+    Float_t yPos                  = Cer_Y_Position[j];
+    Float_t zPos                  = Cer_Z_Position[j];
+    TGeoTranslation* module_trans = NULL;
+    TGeoRotation* module_rot      = new TGeoRotation(Form("Cer%d", j), Cer_rotate_Z[j], -MeanTheta, 0.);
+    // module_rot->RotateZ(Cer_rotate_Z[j]);
+    TGeoCombiTrans* module_combi_trans = NULL;
+
+    for (Int_t i = 0; i < Cer_Number[j]; i++) {
+      ii++;
+      cout << "Position Ceramic Module " << i << " of " << Cer_Number[j] << " Type " << modType << " at X = " << xPos
+           << ", Y = " << yPos << ", Z = " << zPos << endl;
+      // Front staggered module (Top if pair), top
+      module_trans       = new TGeoTranslation("", xPos, yPos, zPos);
+      module_combi_trans = new TGeoCombiTrans(*module_trans, *module_rot);
+      gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum, module_combi_trans);
+      //    modNum++;
+    }
+  }
+}
+
+void position_Testbox_MRPC4(Int_t modNType)
+{
+  TGeoTranslation* module_trans = NULL;
+  TGeoRotation* module_rot      = new TGeoRotation();
+  module_rot->RotateZ(Testbox_MRPC4_rotate_Z);
+  TGeoCombiTrans* module_combi_trans = NULL;
+
+  //  Int_t numModules=(Int_t)( (Inner_Module_Last_Y_Position-Inner_Module_First_Y_Position)/Module_Size_Y[modType])+1;
+  Float_t yPos = Testbox_MRPC4_First_Y_Position;
+  Int_t ii     = 0;
+  Float_t xPos = Testbox_MRPC4_X_Offset;
+  Float_t zPos = Testbox_MRPC4_Z_Position;
+
+  for (Int_t j = 0; j < modNType; j++) {
+    Int_t modType = Testbox_MRPC4_Types[j];
+    Int_t modNum  = 0;
+    for (Int_t i = 0; i < Testbox_MRPC4_Number[j]; i++) {
+      ii++;
+      module_trans       = new TGeoTranslation("", xPos, yPos, zPos);
+      module_combi_trans = new TGeoCombiTrans(*module_trans, *module_rot);
+      gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum, module_combi_trans);
+      modNum++;
+    }
+  }
+}
+
+void position_side_tof_modules(Int_t modNType)
+{
+  TGeoTranslation* module_trans = NULL;
+  TGeoRotation* module_rot      = new TGeoRotation();
+  module_rot->RotateZ(180.);
+  TGeoCombiTrans* module_combi_trans = NULL;
+
+  //  Int_t numModules=(Int_t)( (Inner_Module_Last_Y_Position-Inner_Module_First_Y_Position)/Module_Size_Y[modType])+1;
+  Float_t yPos = 0.;  //Inner_Module_First_Y_Position;
+  Int_t ii     = 0;
+  for (Int_t j = 0; j < modNType; j++) {
+    Int_t modType = InnerSide_Module_Types[j];
+    Int_t modNum  = 0;
+    for (Int_t i = 0; i < InnerSide_Module_Number[j]; i++) {
+      ii++;
+      cout << "InnerSide ii " << ii << " Last " << Last_Size_Y << "," << Last_Over_Y << endl;
+      Float_t DeltaY = Module_Size_Y[modType] + Last_Size_Y - 2. * (Module_Over_Y[modType] + Last_Over_Y);
+      if (ii > 1) { yPos += DeltaY; }
+      Last_Size_Y  = Module_Size_Y[modType];
+      Last_Over_Y  = Module_Over_Y[modType];
+      Float_t xPos = InnerSide_Module_X_Offset;
+      Float_t zPos = Wall_Z_Position;
+      cout << "Position InnerSide Module " << i << " of " << InnerSide_Module_Number[j] << " Type " << modType
+           << " at Y = " << yPos << " Ysize = " << Module_Size_Y[modType] << " DeltaY = " << DeltaY << endl;
+
+      module_trans = new TGeoTranslation("", xPos, yPos, zPos);
+      gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum, module_trans);
+      modNum++;
+
+      module_trans       = new TGeoTranslation("", -xPos, yPos, zPos);
+      module_combi_trans = new TGeoCombiTrans(*module_trans, *module_rot);
+      gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum, module_combi_trans);
+      modNum++;
+
+      if (ii > 1) {
+        module_trans = new TGeoTranslation("", xPos, -yPos, zPos);
+        gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum, module_trans);
+        modNum++;
+
+        module_trans       = new TGeoTranslation("", -xPos, -yPos, zPos);
+        module_combi_trans = new TGeoCombiTrans(*module_trans, *module_rot);
+        gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum, module_combi_trans);
+        modNum++;
+
+        module_trans = new TGeoTranslation("", xPos, yPos - DeltaY / 2, zPos + Module_Size_Z[modType]);
+        gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum, module_trans);
+        modNum++;
+
+        module_trans       = new TGeoTranslation("", -xPos, yPos - DeltaY / 2, zPos + Module_Size_Z[modType]);
+        module_combi_trans = new TGeoCombiTrans(*module_trans, *module_rot);
+        gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum, module_combi_trans);
+        modNum++;
+
+        module_trans = new TGeoTranslation("", xPos, -(yPos - DeltaY / 2), zPos + Module_Size_Z[modType]);
+        gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum, module_trans);
+        modNum++;
+
+        module_trans       = new TGeoTranslation("", -xPos, -(yPos - DeltaY / 2), zPos + Module_Size_Z[modType]);
+        module_combi_trans = new TGeoCombiTrans(*module_trans, *module_rot);
+        gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum, module_combi_trans);
+        modNum++;
+      }
+    }
+  }
+}
+
+void position_outer_tof_modules(Int_t nCol)  //modType, Int_t col1, Int_t col2)
+{
+  TGeoTranslation* module_trans = NULL;
+  TGeoRotation* module_rot      = new TGeoRotation();
+  module_rot->RotateZ(180.);
+  TGeoCombiTrans* module_combi_trans = NULL;
+
+  //  Int_t numModules=(Int_t)( (Outer_Module_Last_Y_Position-Outer_Module_First_Y_Position)/Module_Size_Y[modType])+1;
+
+  Int_t modNum[NofModuleTypes];
+  for (Int_t k = 0; k < NofModuleTypes; k++) {
+    modNum[k] = 0;
+  }
+
+  Float_t zPos = Wall_Z_Position;
+  for (Int_t j = 0; j < nCol; j++) {
+    Float_t xPos  = Outer_Module_X_Offset + ((j + 1) * DxColl);
+    Last_Size_Y   = 0.;
+    Last_Over_Y   = 0.;
+    Float_t yPos  = 0.;
+    Int_t ii      = 0;
+    Float_t DzPos = 0.;
+    for (Int_t k = 0; k < Outer_Module_NTypes; k++) {
+      Int_t modType = Outer_Module_Types[k][j];
+      if (Module_Size_Z[modType] > DzPos) {
+        if (Outer_Module_Number[k][j] > 0) { DzPos = Module_Size_Z[modType]; }
+      }
+    }
+
+    zPos -= 2. * DzPos;  //((j+1)*2*Module_Size_Z[modType]);
+
+    Pole_ZPos[NumberOfPoles] = zPos;
+    Pole_Col[NumberOfPoles]  = j + 1;
+    NumberOfPoles++;
+    Pole_ZPos[NumberOfPoles] = zPos + DzPos;
+    Pole_Col[NumberOfPoles]  = j + 1;
+    NumberOfPoles++;
+    //if (j+1==nCol) {
+    if (1) {
+      Pole_ZPos[NumberOfPoles] = Pole_ZPos[0];
+      Pole_Col[NumberOfPoles]  = j + 1;
+      NumberOfPoles++;
+
+      Bar_Size_Z             = Pole_ZPos[0] - zPos;
+      gBar[NumberOfBars]     = create_tof_bar(Bar_Size_X, Bar_Size_Y, Bar_Size_Z);
+      Bar_ZPos[NumberOfBars] = zPos + Bar_Size_Z / 2. - Pole_Size_Z / 2.;
+      Bar_XPos[NumberOfBars] = xPos + Pole_Offset;
+      NumberOfBars++;
+    }
+
+    for (Int_t k = 0; k < Outer_Module_NTypes; k++) {
+      Int_t modType    = Outer_Module_Types[k][j];
+      Int_t numModules = Outer_Module_Number[k][j];
+
+      cout << " Outer: position " << numModules << " of type " << modType << " in col " << j << " at z = " << zPos
+           << ", DzPos = " << DzPos << endl;
+      for (Int_t i = 0; i < numModules; i++) {
+        ii++;
+        cout << "Outer ii " << ii << " Last " << Last_Size_Y << "," << Last_Over_Y << endl;
+        Float_t DeltaY = Module_Size_Y[modType] + Last_Size_Y - 2. * (Module_Over_Y[modType] + Last_Over_Y);
+        if (ii > 1) { yPos += DeltaY; }
+        Last_Size_Y = Module_Size_Y[modType];
+        Last_Over_Y = Module_Over_Y[modType];
+        cout << "Position Outer Module " << i << " of " << Outer_Module_Number[k][j] << " Type " << modType << "(#"
+             << modNum[modType] << ") "
+             << " at Y = " << yPos << " Ysize = " << Module_Size_Y[modType] << " DeltaY = " << DeltaY << endl;
+
+        module_trans = new TGeoTranslation("", xPos, yPos, zPos);
+        gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum[modType], module_trans);
+        modNum[modType]++;
+
+        module_trans       = new TGeoTranslation("", -xPos, yPos, zPos);
+        module_combi_trans = new TGeoCombiTrans(*module_trans, *module_rot);
+        gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum[modType], module_combi_trans);
+        modNum[modType]++;
+
+        if (ii > 1) {
+          module_trans = new TGeoTranslation("", xPos, -yPos, zPos);
+          gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum[modType], module_trans);
+          modNum[modType]++;
+          module_trans       = new TGeoTranslation("", -xPos, -yPos, zPos);
+          module_combi_trans = new TGeoCombiTrans(*module_trans, *module_rot);
+          gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum[modType], module_combi_trans);
+          modNum[modType]++;
+
+          // second layer
+          module_trans = new TGeoTranslation("", xPos, yPos - DeltaY / 2., zPos + DzPos);
+          gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum[modType], module_trans);
+          modNum[modType]++;
+          module_trans       = new TGeoTranslation("", -xPos, yPos - DeltaY / 2., zPos + DzPos);
+          module_combi_trans = new TGeoCombiTrans(*module_trans, *module_rot);
+          gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum[modType], module_combi_trans);
+          modNum[modType]++;
+
+          module_trans = new TGeoTranslation("", xPos, -(yPos - DeltaY / 2.), zPos + DzPos);
+          gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum[modType], module_trans);
+          modNum[modType]++;
+          module_trans       = new TGeoTranslation("", -xPos, -(yPos - DeltaY / 2.), zPos + DzPos);
+          module_combi_trans = new TGeoCombiTrans(*module_trans, *module_rot);
+          gGeoMan->GetVolume(geoVersionStand)->AddNode(gModules[modType], modNum[modType], module_combi_trans);
+          modNum[modType]++;
+        }
+      }
+    }
+  }
+}
+
+
+void dump_info_file()
+{
+  TDatime datetime;  // used to get timestamp
+
+  printf("writing info 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());
+
+  fprintf(ifile, "# TOF setup\n");
+  if (TOF_Z_Front == 450) fprintf(ifile, "SIS 100 hadron setup\n");
+  if (TOF_Z_Front == 600) fprintf(ifile, "SIS 100 electron\n");
+  if (TOF_Z_Front == 650) fprintf(ifile, "SIS 100 muon\n");
+  if (TOF_Z_Front == 880) fprintf(ifile, "SIS 300 electron\n");
+  if (TOF_Z_Front == 1020) fprintf(ifile, "SIS 300 muon\n");
+  fprintf(ifile, "\n");
+
+  const Float_t TOF_Z_Back = Wall_Z_Position + 1.5 * Module_Size_Z[0];  // back of TOF wall
+
+  fprintf(ifile, "# envelope\n");
+  // Show extension of TRD
+  fprintf(ifile, "%7.2f cm   start of TOF (z)\n", TOF_Z_Front);
+  fprintf(ifile, "%7.2f cm   end   of TOF (z)\n", TOF_Z_Back);
+  fprintf(ifile, "\n");
+
+  // Layer thickness
+  fprintf(ifile, "# central tower position\n");
+  fprintf(ifile, "%7.2f cm   center of staggered, front RPC cell at x=0\n", Wall_Z_Position);
+  fprintf(ifile, "\n");
+
+  fclose(ifile);
+}
diff --git a/tof/tof_v24d_mcbm.geo.info b/tof/tof_v24d_mcbm.geo.info
new file mode 100644
index 0000000..bac4e71
--- /dev/null
+++ b/tof/tof_v24d_mcbm.geo.info
@@ -0,0 +1,15 @@
+#
+##   tof_v24d_mcbm information file
+#
+
+# created 20240617
+
+# TOF setup
+
+# envelope
+   0.00 cm   start of TOF (z)
+ 416.50 cm   end   of TOF (z)
+
+# central tower position
+ 400.00 cm   center of staggered, front RPC cell at x=0
+
diff --git a/tof/tof_v24d_mcbm.geo.root b/tof/tof_v24d_mcbm.geo.root
new file mode 100644
index 0000000000000000000000000000000000000000..19f45d24999b16886a747e96460866c6cb74dac7
GIT binary patch
literal 12943
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

literal 0
HcmV?d00001

-- 
GitLab