From cca98b46104e3ae9e635030cacc1d9badff39a65 Mon Sep 17 00:00:00 2001
From: David Emschermann <d.emschermann@gsi.de>
Date: Fri, 29 Apr 2022 12:03:54 +0200
Subject: [PATCH 1/6] add much v22j geometry for uranium setup, refs #2483

---
 .../mcbm/create_MUCH_geometry_v22i_mcbm.C     |   2 +-
 .../mcbm/create_MUCH_geometry_v22j_mcbm.C     | 780 ++++++++++++++++++
 much/much_v22j_mcbm.geo.info                  |  39 +
 much/much_v22j_mcbm.geo.root                  | Bin 0 -> 17007 bytes
 setup/setup_mcbm_beam_2022_03_28_uranium.C    |   3 +-
 5 files changed, 822 insertions(+), 2 deletions(-)
 create mode 100644 macro/much/mcbm/create_MUCH_geometry_v22j_mcbm.C
 create mode 100644 much/much_v22j_mcbm.geo.info
 create mode 100644 much/much_v22j_mcbm.geo.root

diff --git a/macro/much/mcbm/create_MUCH_geometry_v22i_mcbm.C b/macro/much/mcbm/create_MUCH_geometry_v22i_mcbm.C
index df0992cf..33ce56a0 100644
--- a/macro/much/mcbm/create_MUCH_geometry_v22i_mcbm.C
+++ b/macro/much/mcbm/create_MUCH_geometry_v22i_mcbm.C
@@ -8,7 +8,7 @@
 
 // clang-format off
 
-// 2022-03-27 - DE - v22i - 2 GEMs in acceptance / RPC downstream of TOF stack
+// 2022-03-27 - DE - v22i - 2 GEMs in acceptance x = -3 cm / RPC downstream of TOF stack
 // 2022-03-27 - DE - v22h - 2 GEMs out of acceptance / RPC downstream of TOF stack
 // 2022-03-26 - DE - v22g - 2 GEMs out of acceptance / RPC upstream of TOF stack out of acceptance
 // 2022-03-25 - DE - v22f - 2 GEMs in acceptance / RPC upstream of TOF stack on z-axis
diff --git a/macro/much/mcbm/create_MUCH_geometry_v22j_mcbm.C b/macro/much/mcbm/create_MUCH_geometry_v22j_mcbm.C
new file mode 100644
index 00000000..1d5e4141
--- /dev/null
+++ b/macro/much/mcbm/create_MUCH_geometry_v22j_mcbm.C
@@ -0,0 +1,780 @@
+/* Copyright (C) 2022 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Omveer Singh, Shreya Roy, Florian Uhlig [committer] */
+
+/*** @author Omveer Singh <omvir.ch@gmail.com>
+ ** @date 17 May 2020
+ ** For more details see info file*/
+
+// clang-format off
+
+// 2022-04-29 - DE - v22j - 2 GEMs in acceptance x = -5 cm / RPC downstream of TOF stack
+// 2022-03-27 - DE - v22i - 2 GEMs in acceptance x = -3 cm / RPC downstream of TOF stack
+// 2022-03-27 - DE - v22h - 2 GEMs out of acceptance / RPC downstream of TOF stack
+// 2022-03-26 - DE - v22g - 2 GEMs out of acceptance / RPC upstream of TOF stack out of acceptance
+// 2022-03-25 - DE - v22f - 2 GEMs in acceptance / RPC upstream of TOF stack on z-axis
+
+#include "TClonesArray.h"
+#include "TDatime.h"
+#include "TFile.h"
+#include "TGeoBBox.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 "TMath.h"
+#include "TObjArray.h"
+#include "TRandom3.h"
+#include "TString.h"
+#include "TSystem.h"
+
+#include <cassert>
+#include <fstream>
+#include <iostream>
+#include <stdexcept>
+
+
+TObjArray* fStations = new TObjArray();
+CbmMuchStation* muchSt;
+CbmMuchLayer* muchLy;
+CbmMuchLayerSide* muchLySd;
+
+// Name of output file with geometry
+const TString tagVersion = "_v22j";
+//const TString subVersion   = "_sis100_1m_lmvm";
+const TString geoVersion   = "much";  // + tagVersion + subVersion;
+const TString FileNameSim  = geoVersion + tagVersion + "_mcbm.geo.root";
+const TString FileNameGeo  = geoVersion + tagVersion + "_mcbm_geo.root";
+const TString FileNameInfo = geoVersion + tagVersion + "_mcbm.geo.info";
+const TString FileNamePar  = geoVersion + tagVersion + "_mcbm.par.root";
+
+// 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 activemedium        = "MUCHargon";
+const TString spacermedium        = "MUCHnoryl";
+const TString Al                  = "aluminium";  //Al for cooling & support purpose
+const TString copper              = "copper";
+const TString g10                 = "G10";
+const TString RPCm= "RPCgas";
+const TString RPCg= "RPCglass";
+
+// Input parameters for MUCH stations
+//********************************************
+
+const Int_t fNst = 3;  // Number of stations
+Double_t TOF_Z_Front_Stand = 244.5;  // this is the TOF box front
+//Double_t TOF_Z_Front_Stand = 247.;  // this is the TOF RPC front
+Double_t RpcDistanceFromTof = -100.;  // add half thickness of RPC - gap is between backside of RPC and front of TOF
+//Double_t RpcDistanceFromTof = 7.;
+Double_t RpcPositionZ = TOF_Z_Front_Stand - RpcDistanceFromTof;
+Int_t fNlayers         = 1;               // Number of layers
+Double_t fLayersZ0[fNst]  = {75.7, 108.7, RpcPositionZ};   // Layers Positions
+//Double_t fLayersZ0[fNst]  = {65.7, 88.7, RpcPositionZ};   // Layers Positions
+Int_t fDetType[fNst]      = {3, 3, 4};          // Detector type
+Double_t fSupportLz[fNst] = {1., 1., 0};        // (cooling + support)
+Double_t fDriftDz      = 0.0035;          //35 micron copper Drift
+Double_t fG10Dz        = 0.30;            // 3 mm G10
+
+Double_t fActiveLzSector[fNst] = {0.3, 0.3, 0.2};  // Active volume thickness [cm]
+Double_t fFrameLzSector[fNst]  = {.3, .3, .6};    // Frame thickness [cm]
+Double_t fRpcGlassDz[fNst] = {0.0,0.0,0.2}; //Rpc Glass thickness [cm]
+Double_t fSpacerPhi         = 2.0;         // Spacer width in Phi [cm]
+Double_t fOverlapR          = 2.0;         // Overlap in R direction [cm]
+Double_t fSpacerR1          = 2.8;         // Spacer width in R at low Z[cm]
+Double_t fSpacerR2          = 3.5;         // Spacer width in R at high Z[cm]
+
+//Size of Modules
+//GEM
+Double_t dy  = 40.0;
+Double_t dx1 = 3.75;
+Double_t dx2 = 20;
+
+
+//RPC
+Double_t dyR  = 116.13/2.; 
+Double_t dx1R = 10.26/2.;
+Double_t dx2R = 50.98/2.;
+
+//box size
+Double_t dxx  = 74.0/2. ; 
+Double_t dyy = 123.0/2.;
+Double_t dzz = 3.8/2.;
+
+
+Double_t DetectorAxisHeight = 200.; //reference ground
+Double_t BoxBaseHeight = 154.0;
+Double_t BoxCentreHeight = BoxBaseHeight + dyy;
+Double_t BoxAwayBeamAxisY = BoxCentreHeight - DetectorAxisHeight;
+
+
+Double_t RpcBaseHeight = BoxBaseHeight + 4.5 ;
+Double_t RpcCentreHeight = RpcBaseHeight + dyR;
+Double_t RpcAwayBeamAxisY = RpcCentreHeight - DetectorAxisHeight;
+
+//Position of Box
+Double_t posBox[]={0,BoxAwayBeamAxisY}; //from the detector axis
+
+
+Double_t fX[fNst]         = {7.2, 7.2, 0.};      //Placement of modules in X [cm]
+Double_t fY[fNst]         = {24.53, 24.53, RpcAwayBeamAxisY};  //Placement of modules in Y [cm]
+
+//***********************************************************
+
+// some global variables
+TGeoManager* gGeoMan = NULL;         // Pointer to TGeoManager instance
+TGeoVolume* gModules_station[fNst];  // Global storage for module types
+
+// Forward declarations
+void create_materials_from_media_file();
+TGeoVolume* CreateStations(int ist);
+TGeoVolume* CreateLayersGem(int istn, int ily);
+TGeoVolume* CreateLayersRpc(int istn, int ily);
+
+
+fstream infoFile;
+void create_MUCH_geometry_v22j_mcbm()
+{
+  // Load FairRunSim to ensure the correct unit system
+  FairRunSim* sim = new FairRunSim();
+
+  // -------   Open info file   -----------------------------------------------
+  TString infoFileName = FileNameSim;
+  infoFileName.ReplaceAll("root", "info");
+  infoFile.open(infoFileName.Data(), fstream::out);
+  infoFile << "MUCH geometry created with create_MUCH_geometry_v22j_mcbm.C" << endl << endl;
+  infoFile << "Build a mMUCH setup for mCBM with 2 GEM." << endl;
+  infoFile << "10 mm thick Al plates are used for support and cooling in the "
+              "GEM modules."
+           << endl;
+  infoFile << "Drift and read-out PCBs (copper coated G10 plates) inserted for "
+              "realistic material budget for both GEM and RPC modules."
+           << endl
+           << endl;
+  infoFile << "No of Modules: " << fNlayers << "      ( GEM )" << endl;
+  infoFile << "Position of Modules Z [cm]: ";
+  for (int i = 0; i < fNlayers; i++)
+    infoFile << fLayersZ0[i] << "    ";
+
+  infoFile << endl << endl << "Placement of Modules:" << endl;
+  infoFile << "Module"
+           << "\t"
+           << "X [cm]"
+           << "\t"
+           << "Y [cm]"
+           << "\t" << endl;
+  infoFile << "----------------------" << endl;
+  for (int i = 0; i < fNlayers; i++)
+    infoFile << " " << i + 1 << "\t" << fX[i] << "\t" << fY[i] << endl;
+  infoFile << "----------------------" << endl;
+  infoFile << endl << "Al Cooling Plate Thickness [cm]: ";
+  for (int i = 0; i < fNlayers; i++)
+    infoFile << fSupportLz[i] << "    ";
+
+  infoFile << endl << "Active Volume Thickness [cm]: ";
+  for (int i = 0; i < fNlayers; i++)
+    infoFile << fActiveLzSector[i] << "    ";
+
+  infoFile << endl << endl << endl << " GEM Module:" << endl;
+  infoFile << "                " << 2 * dx1 << " cm" << endl;
+  infoFile << "               .........                 |" << endl;
+  infoFile << "              ...........                |" << endl;
+  infoFile << "             .............               |" << endl;
+  infoFile << "            ...............              |" << endl;
+  infoFile << "           .................             |" << endl;
+  infoFile << "          ...................            |" << endl;
+  infoFile << "         .....................           |" << endl;
+  infoFile << "        .......................         " << 2 * dy << " cm" << endl;
+  infoFile << "       .........................         |" << endl;
+  infoFile << "      ...........................        |" << endl;
+  infoFile << "     .............................       |" << endl;
+  infoFile << "    ...............................      |" << endl;
+  infoFile << "   .................................     |" << endl;
+  infoFile << "  ...................................    |" << endl;
+  infoFile << " .....................................   |" << endl;
+  infoFile << ".......................................  |" << endl;
+  infoFile << "                " << 2 * dx2 << " cm" << endl;
+  infoFile << endl;
+
+
+  // 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(10);
+
+  // Create the top volume
+  TGeoBBox* topbox = new TGeoBBox("", 1000., 1000., 2000.);
+  TGeoVolume* top  = new TGeoVolume("top", topbox, gGeoMan->GetMedium("air"));
+  gGeoMan->SetTopVolume(top);
+
+  TString topName = geoVersion + tagVersion + "_mcbm";
+
+  TGeoVolume* much = new TGeoVolumeAssembly(topName);
+  top->AddNode(much, 1);
+
+  TGeoVolume* sttn = new TGeoVolumeAssembly("station");
+  much->AddNode(sttn, 1);
+
+
+  for (Int_t istn = 0; istn < fNst; istn++) {
+
+    Double_t stGlobalZ0 = fLayersZ0[istn];
+    muchSt              = new CbmMuchStation(istn, stGlobalZ0);
+    muchSt->SetRmin(0.);
+    muchSt->SetRmax(0.);
+    fStations->Add(muchSt);
+
+
+    gModules_station[istn] = CreateStations(istn);
+    sttn->AddNode(gModules_station[istn], istn);
+  }
+
+  gGeoMan->CloseGeometry();
+  gGeoMan->CheckOverlaps(0.0001, "s");
+  gGeoMan->PrintOverlaps();
+
+  much->Export(FileNameSim);  // an alternative way of writing the much
+
+  TFile* outfile                  = new TFile(FileNameSim, "UPDATE");
+  TGeoTranslation* much_placement = new TGeoTranslation("much_trans", -6., 0., 0.);
+  much_placement->Write();
+  outfile->Close();
+
+  outfile = new TFile(FileNameGeo, "RECREATE");
+  gGeoMan->Write();  // use this if you want GeoManager format in the output
+  outfile->Close();
+
+  // create medialist for this geometry
+  TString createmedialist = gSystem->Getenv("VMCWORKDIR");
+  createmedialist += "/macro/geometry/create_medialist.C";
+  std::cout << "Loading macro " << createmedialist << std::endl;
+  gROOT->LoadMacro(createmedialist);
+  gROOT->ProcessLine("create_medialist(\"\", false)");
+
+  top->Draw("ogl");
+  infoFile.close();
+
+  TFile* parfile = new TFile(FileNamePar, "RECREATE");
+  fStations->Write("stations", 1);  // for geometry parameters
+  parfile->Close();
+}
+
+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(KeepingVolumeMedium);
+  geoBuild->createMedium(air);
+
+  FairGeoMedium* MUCHargon = geoMedia->getMedium(activemedium);
+  geoBuild->createMedium(MUCHargon);
+
+  FairGeoMedium* MUCHnoryl = geoMedia->getMedium(spacermedium);
+  geoBuild->createMedium(MUCHnoryl);
+
+  FairGeoMedium* MUCHsupport = geoMedia->getMedium(Al);
+  geoBuild->createMedium(MUCHsupport);
+
+  FairGeoMedium* copperplate = geoMedia->getMedium(copper);
+  geoBuild->createMedium(copperplate);
+
+  FairGeoMedium* g10plate = geoMedia->getMedium(g10);
+  geoBuild->createMedium(g10plate);
+
+  FairGeoMedium* RPCmedium = geoMedia->getMedium(RPCm);
+  geoBuild->createMedium(RPCmedium);
+
+  FairGeoMedium* RPCmaterial = geoMedia->getMedium(RPCg);
+  geoBuild->createMedium(RPCmaterial);
+
+}
+
+TGeoVolume* CreateStations(int ist)
+{
+
+  TString stationName         = Form("muchstation%02i", ist + 1);
+  TGeoVolumeAssembly* station = new TGeoVolumeAssembly(stationName);  //, shStation, air);
+
+  TGeoVolume* gLayer[fNlayers + 1];
+  for (int ii = 0; ii < fNlayers; ii++) {  // 2 Layers
+
+   // Double_t sideDz = fSupportLz[istn] / 2. + fActiveLzSector[istn] / 2.;  // distance between side's and layer's centers
+
+    muchLy = new CbmMuchLayer(ist, ii, fLayersZ0[ist], 0.);
+    muchSt->AddLayer(muchLy);
+    muchLy->GetSideF()->SetZ(fLayersZ0[ist] );  
+
+
+ if(ist<2)gLayer[ii] = CreateLayersGem(ist, ii);
+   else gLayer[ii] = CreateLayersRpc(ist, ii);
+    station->AddNode(gLayer[ii], ii);
+  }
+
+  return station;
+}
+
+TGeoVolume* CreateLayersGem(int istn, int ily)
+{
+
+  TString layerName = Form("muchstation%02ilayer%i", istn + 1, ily + 1);
+
+
+  TGeoVolumeAssembly* volayer = new TGeoVolumeAssembly(layerName);
+
+  Double_t SupportDz = fSupportLz[istn] / 2.;
+  Double_t driftDz   = fActiveLzSector[istn] / 2 + fDriftDz / 2.;
+  Double_t g10Dz     = driftDz + fDriftDz / 2. + fG10Dz / 2.;
+
+
+  Double_t moduleZ   = fLayersZ0[istn];
+  Double_t driftZIn  = moduleZ - driftDz;
+  Double_t driftZOut = moduleZ + driftDz;
+  Double_t g10ZIn    = moduleZ - g10Dz;
+  Double_t g10ZOut   = moduleZ + g10Dz;
+  Double_t cool_z    = g10ZIn - fG10Dz / 2. - SupportDz;
+
+  Double_t dz = fActiveLzSector[istn] / 2.;  // Active Volume Thickness
+
+  Int_t Nsector = 16.0;
+  Double_t phi0 = TMath::Pi() / Nsector;  // azimuthal half widh of each module
+
+  //define the spacer dimensions
+  Double_t tg   = (dx2 - dx1) / 2 / dy;
+  Double_t dd1  = fSpacerPhi * tg;
+  Double_t dd2  = fSpacerPhi * sqrt(1 + tg * tg);
+  Double_t sdx1 = dx1 + dd2 - dd1;
+  Double_t sdx2 = dx2 + dd2 + dd1;
+  Double_t sdy1 = dy + fSpacerR1;  // frame width added
+  Double_t sdy2 = dy + fSpacerR2;  // frame width added
+  Double_t sdz  = fFrameLzSector[istn] / 2.;
+
+  //define Additional material as realistic GEM module
+  Double_t dz_sD = fDriftDz / 2.;  //35 micron copper Drift
+  Double_t dz_sG = fG10Dz / 2.;    // 3mm G10
+  Double_t sdy   = sdy2;
+
+
+  Double_t pos[10];
+
+  Int_t iMod = 0;
+  for (Int_t iSide = 0; iSide < 1; iSide++) {
+    //muchLySd = muchLy->GetSide(iSide);
+    // Now start adding the GEM modules
+    for (Int_t iModule = 0; iModule < 1; iModule++) {
+
+      Double_t phi  = 0;  // add 0.5 to not overlap with y-axis for left-right layer separation
+      Bool_t isBack = iModule % 2;
+      Char_t cside  = (isBack == 1) ? 'b' : 'f';
+
+      // correct the x, y positions
+      pos[0] = fX[istn];
+      pos[1] = fY[istn];
+
+
+      // different z positions for odd/even modules
+      pos[2] = moduleZ;
+      pos[3] = driftZIn;
+      pos[4] = driftZOut;
+      pos[5] = g10ZIn;
+      pos[6] = g10ZOut;
+      pos[7] = cool_z;
+
+      if (iSide != isBack) continue;
+      if (iModule != 0) iMod = iModule / 2;
+
+      muchLySd = muchLy->GetSide(iSide);
+
+      TGeoMedium* argon       = gGeoMan->GetMedium(activemedium);  // active medium
+      TGeoMedium* noryl       = gGeoMan->GetMedium(spacermedium);  // spacer medium
+      TGeoMedium* copperplate = gGeoMan->GetMedium(copper);        // copper Drift medium
+      TGeoMedium* g10plate    = gGeoMan->GetMedium(g10);           // G10 medium
+      TGeoMedium* coolMat     = gGeoMan->GetMedium(Al);
+
+
+      // Define and place the shape of the modules
+      TGeoTrap* shapeGem = new TGeoTrap(dz, 0, 0, dy, dx1, dx2, 0, dy, dx1, dx2, 0);
+      shapeGem->SetName(Form("shStation%02iLayer%i%cModule%03iActiveGemNoHole", istn, ily, cside, iModule));
+
+      //------------------------------------------------------Al Cooling Plate--------------------------------------------------------------------
+      TGeoVolume* voActive;
+      TGeoTrap* coolGem;
+      TGeoVolume* voCool;
+
+      coolGem = new TGeoTrap(SupportDz, 0, phi, sdy2, sdx1, sdx2, 0, sdy2, sdx1, sdx2, 0);
+      coolGem->SetName(Form("shStation%02iLayer%i%cModule%03icoolGem", istn, ily, cside, iModule));
+      TString CoolName = Form("muchstation%02ilayer%i%ccoolGem%03iAluminum", istn + 1, ily + 1, cside, iModule + 1);
+      voCool           = new TGeoVolume(CoolName, coolGem, coolMat);
+      voCool->SetLineColor(kYellow);
+
+      //------------------------------------------------------Active Volume-----------------------------------------------------
+      //GEM
+      TGeoTrap* shapeActive = new TGeoTrap(dz, 0, 0, dy, dx1, dx2, 0, dy, dx1, dx2, 0);
+      shapeActive->SetName(Form("shStation%02iLayer%i%cModule%03iActiveNoHole", istn, ily, cside, iModule));
+      TString activeName = Form("muchstation%02ilayer%i%cactive%03igasArgon", istn + 1, ily + 1, cside, iMod + 1);
+      voActive           = new TGeoVolume(activeName, shapeActive, argon);
+      voActive->SetLineColor(kGreen);
+
+
+      //---------------------------------------------------------Drift & PCB's---------------------------------------------------------------
+
+      TString DriftName[2], G10Name[2], AlName;
+      TGeoVolume *voDrift[2], *voG10[2];
+      TGeoTrap *DriftGem[2], *G10Gem[2];
+
+      for (int iPos = 0; iPos < 2; iPos++) {
+        Char_t cpos    = (iPos == 0) ? 'i' : 'o';
+        DriftGem[iPos] = new TGeoTrap(dz_sD, 0, phi, sdy, sdx1, sdx2, 0, sdy, sdx1, sdx2, 0);
+        G10Gem[iPos]   = new TGeoTrap(dz_sG, 0, phi, sdy, sdx1, sdx2, 0, sdy, sdx1, sdx2, 0);
+        DriftGem[iPos]->SetName(Form("shStation%02iLayer%i%cModule%03i%cDrift", istn, ily, cside, iModule, cpos));
+        DriftName[iPos] =
+          Form("muchstation%02ilayer%i%cside%03i%ccopperDrift", istn + 1, ily + 1, cside, iMod + 1, cpos);
+        G10Gem[iPos]->SetName(Form("shStation%02iLayer%i%cModule%03i%cG10", istn, ily, cside, iModule, cpos));
+        G10Name[iPos] = Form("muchstation%02ilayer%i%cside%03i%cG10", istn + 1, ily + 1, cside, iMod + 1, cpos);
+        voDrift[iPos] = new TGeoVolume(DriftName[iPos], DriftGem[iPos], copperplate);
+        voDrift[iPos]->SetLineColor(kRed);
+        voG10[iPos] = new TGeoVolume(G10Name[iPos], G10Gem[iPos], g10plate);
+        voG10[iPos]->SetLineColor(28);
+      }
+      //------------------------------------------------------------Frame-----------------------------------------------------------------
+      // Define the trapezoidal Frame
+      TGeoTrap* shapeFrame = new TGeoTrap(sdz, 0, 0, sdy, sdx1, sdx2, 0, sdy, sdx1, sdx2, 0);
+      shapeFrame->SetName(Form("shStation%02iLayer%i%cModule%03iFullFrameGemNoHole", istn, ily, cside, iModule));
+
+
+      TString expression = Form("shStation%02iLayer%i%cModule%03iFullFrameGemNoHole-shStation%"
+                                "02iLayer%i%cModule%03iActiveGemNoHole",
+                                istn, ily, cside, iModule, istn, ily, cside, iModule);
+
+      TGeoCompositeShape* shFrame = new TGeoCompositeShape(
+        Form("shStation%02iLayer%i%cModule%03iFinalFrameNoHole", istn, ily, cside, iModule), expression);
+      TString frameName = Form("muchstation%02ilayer%i%csupport%03i", istn + 1, ily + 1, cside, iMod + 1);
+
+      TGeoVolume* voFrame = new TGeoVolume(frameName, shFrame, noryl);  // Frame for GEM
+      voFrame->SetLineColor(kMagenta);
+
+
+      //----------------------------------------------------Placement----------------------------------------------------------------------
+      // Calculate the phi angle of the sector where it has to be placed
+      Double_t angle = 180.0 - (180. / TMath::Pi() * phi0);  // convert angle phi from rad to deg
+
+
+      TGeoRotation* r2 = new TGeoRotation("r2");
+      //rotate in the vertical plane (per to z axis) with angle
+      r2->RotateZ(angle);
+
+
+      TGeoTranslation* trans[10];
+      TGeoHMatrix* incline_mod[10];
+
+      for (int i = 0; i < 6; i++) {
+        trans[i] = new TGeoTranslation("", pos[0] - 5.0, pos[1], pos[i + 2]);  // shift GEMs in x, y, z here
+
+        incline_mod[i]    = new TGeoHMatrix("");
+        (*incline_mod[i]) = (*trans[i]) * (*r2);
+      }
+
+      volayer->AddNode(voFrame, iMod, incline_mod[0]);     // add spacer
+      volayer->AddNode(voActive, iMod, incline_mod[0]);    // add active volume
+      volayer->AddNode(voDrift[0], iMod, incline_mod[1]);  //Drift In
+      volayer->AddNode(voDrift[1], iMod, incline_mod[2]);  //Drift Out
+      volayer->AddNode(voG10[0], iMod, incline_mod[3]);    //G10 In
+      volayer->AddNode(voG10[1], iMod, incline_mod[4]);    //G10 Out
+      volayer->AddNode(voCool, iMod, incline_mod[5]);      // Al Cooling Plate
+
+      TVector3 Position;
+      Position.SetXYZ(pos[0], pos[1], pos[2]);
+      cout << pos[2] << "   " << pos[3] << "   " << pos[4] << "   " << pos[5] << "   " << pos[6] << "   " << pos[7]
+           << endl;
+     muchLySd->AddModule(new CbmMuchModuleGemRadial(fDetType[istn], istn, ily, iSide, iModule, Position, dx1,
+                                                     dx2,  dy,  dz, muchSt->GetRmin()));
+cout<<"stn: "<<istn<<"   module: "<<iModule<<endl;
+    }
+  }
+
+  return volayer;
+}
+
+TGeoVolume* CreateLayersRpc(int istn, int ily){
+
+ 
+ TString layerName;
+ 
+   layerName = Form("muchstation%02ilayerRpc%i",istn+1,ily+1);
+  
+
+  TGeoVolumeAssembly* volayer = new TGeoVolumeAssembly(layerName);
+
+  Double_t SupportDz = fSupportLz[istn]/2.;
+  Double_t RpcGlassDz = fActiveLzSector[istn]/2. + fRpcGlassDz[istn]/2.;
+  Double_t driftDz = RpcGlassDz + fRpcGlassDz[istn]/2 + fDriftDz/2.;
+  Double_t g10Dz = driftDz + fDriftDz/2. + fG10Dz/2.;
+  Double_t FrameRpcDz = fActiveLzSector[istn]/2. + fRpcGlassDz[istn] + fDriftDz + g10Dz + fG10Dz;
+  
+  Double_t moduleZ = fLayersZ0[istn]; 
+  Double_t RpcGlassZIn = moduleZ - RpcGlassDz;
+  Double_t RpcGlassZOut = moduleZ + RpcGlassDz;
+  Double_t driftZIn = moduleZ - driftDz; 
+  Double_t driftZOut = moduleZ + driftDz; 
+  Double_t g10ZIn = moduleZ - g10Dz;
+  Double_t g10ZOut = moduleZ + g10Dz;
+ // Double_t cool_z = g10ZOut + fG10Dz/2. + SupportDz;
+  Double_t cool_z = g10ZIn - fG10Dz / 2. - SupportDz;
+
+  Double_t dz  = fActiveLzSector[istn]/2.; // Active Volume Thickness 
+  
+  Int_t Nsector=16.0;
+  Double_t phi0 = TMath::Pi()/Nsector; // azimuthal half widh of each module
+
+  dx1 = dx1R; dx2 = dx2R; dy = dyR;
+  //define the spacer dimensions      
+  Double_t tg = (dx2-dx1)/2/dy;
+  Double_t dd1 = fSpacerPhi*tg;
+  Double_t dd2 = fSpacerPhi*sqrt(1+tg*tg);
+  Double_t sdx1 = dx1+dd2-dd1;
+  Double_t sdx2 = dx2+dd2+dd1; 
+  Double_t sdy1  = dy+fSpacerR1; // frame width added 
+  Double_t sdy2  = dy+fSpacerR2; // frame width added
+  Double_t sdz = fFrameLzSector[istn]/2.;
+  
+  //define Additional material as realistic GEM module
+  Double_t dz_sD = fDriftDz/2.; //35 micron copper Drift 
+  Double_t dz_sG = fG10Dz/2.; // 3mm G10
+  Double_t sdy = sdy2;
+  
+  
+  Double_t pos[10];
+  
+  Int_t iMod =0;
+  for (Int_t iSide=0;iSide<1;iSide++){
+     // muchLySd = muchLy->GetSide(iSide);
+    // Now start adding the Rpc modules  
+    for (Int_t iModule=0; iModule<1; iModule++){ 
+      
+      Double_t phi  = 0;  // add 0.5 to not overlap with y-axis for left-right layer separation
+      Bool_t isBack = iModule%2; 
+      Char_t cside  = (isBack==1) ? 'b' : 'f'; 
+      
+      // correct the x, y positions
+      pos[0] = fX[istn];   
+      pos[1] = fY[istn];
+      
+      
+      
+      // different z positions for odd/even modules
+      pos[2] = moduleZ ;
+      pos[3] = RpcGlassZIn;
+      pos[4] = RpcGlassZOut;
+      pos[5] = driftZIn;
+      pos[6] = driftZOut;
+      pos[7] = g10ZIn;
+      pos[8] = g10ZOut;
+      pos[9] = cool_z;
+      
+      if(iSide!=isBack)continue;
+      if(iModule!=0)iMod =iModule/2;
+      
+      muchLySd = muchLy->GetSide(iSide);  
+    
+
+      TGeoMedium* SpacerRpc = gGeoMan->GetMedium(Al); // spacer medium
+      TGeoMedium* copperplate = gGeoMan->GetMedium(copper); // copper Drift medium
+      TGeoMedium* g10plate = gGeoMan->GetMedium(g10); // G10 medium
+      TGeoMedium*  RPCglassmat = gGeoMan->GetMedium(RPCg); // RPC Glass
+      TGeoMedium*  RPCgasmedium = gGeoMan->GetMedium(RPCm); // RPC Gas
+      TGeoMedium* coolMat = gGeoMan->GetMedium(Al);
+      
+
+      TGeoTrap* shapeRpc = new TGeoTrap(sdz,0,0,dy,dx1,dx2,0,dy,dx1,dx2,0);
+     // TGeoBBox * shapeRpc = new TGeoBBox(dxx,dyy,FrameRpcDz);
+      shapeRpc->SetName(Form("shStation%02iLayer%i%cModule%03iActiveRpcNoHole", istn, ily, cside, iModule));
+      
+      //------------------------------------------------------Al Cooling Plate--------------------------------------------------------------------
+      TGeoVolume* voActive, *voRPCback, *voRPCFront;      
+      TGeoTrap * coolRpc;
+      TGeoVolume* voCool;
+   
+	coolRpc = new TGeoTrap(SupportDz,0,phi,sdy2,sdx1,sdx2,0,sdy2,sdx1,sdx2,0);
+	coolRpc->SetName(Form("shStation%02iLayer%i%cModule%03icoolRpc", istn, ily, cside, iModule));
+	TString CoolName = Form("muchstation%02ilayer%i%ccoolRpc%03iAluminum",istn+1,ily+1,cside,iModule+1);
+	voCool = new TGeoVolume(CoolName,coolRpc,coolMat);
+	voCool->SetLineColor(kYellow);
+     
+      
+      
+      //------------------------------------------------------Active Volume & Rpc Glass----------------------------------------------------- 
+ 
+          //RPC Active
+          TGeoTrap* shapeActive = new TGeoTrap(dz,0,0,dy,dx1,dx2,0,dy,dx1,dx2,0);
+          shapeActive->SetName(Form("shStation%02iLayer%i%cModule%03iActiveNoHole", istn, ily, cside, iModule));
+	  TString activeName = Form("muchstation%02ilayer%i%cactive%03irpcgas",istn+1,ily+1,cside,iMod+1);
+	  voActive = new TGeoVolume(activeName,shapeActive,RPCgasmedium);
+	  voActive->SetLineColor(kRed);
+	  
+	  //RPC Glass Front          
+          TGeoTrap* shapeRPCfront = new TGeoTrap(dz,0,0,dy,dx1,dx2,0,dy,dx1,dx2,0);
+         // TGeoBBox * shapeRPCfront = new TGeoBBox(dxx,dyy,dz);
+	  shapeRPCfront->SetName(Form("shStation%02iLayer%i%cModule%03iNoHoleFront", istn, ily, cside, iModule));
+	  TString NameFront = Form("muchstation%02ilayer%i%c%03irpcglassFront",istn+1,ily+1,cside,iMod+1);
+	  voRPCFront = new TGeoVolume(NameFront,shapeRPCfront,RPCglassmat);
+	  voRPCFront->SetLineColor(kRed);
+	  
+	  //RPC Glass Back
+          TGeoTrap* shapeRPCback = new TGeoTrap(dz,0,0,dy,dx1,dx2,0,dy,dx1,dx2,0);
+          //TGeoBBox * shapeRPCback = new TGeoBBox(dxx,dyy,dz);
+	  shapeRPCback->SetName(Form("shStation%02iLayer%i%cModule%03iNoHoleback", istn, ily, cside, iModule));
+	  TString Nameback = Form("muchstation%02ilayer%i%c%03irpcglassback",istn+1,ily+1,cside,iMod+1);
+	  voRPCback = new TGeoVolume(Nameback,shapeRPCback,RPCglassmat);
+	  voRPCback->SetLineColor(kRed);
+      
+//---------------------------------------------------------Drift & PCB's---------------------------------------------------------------     
+      
+      TString DriftName[2], G10Name[2], AlName;
+      TGeoVolume *voDrift[2], *voG10[2];
+      TGeoTrap *DriftRpc[2], *G10Rpc[2];
+      
+      for(int iPos =0; iPos<2; iPos++){
+	Char_t cpos  = (iPos==0) ? 'i' : 'o'; 
+	
+	    DriftRpc[iPos] = new TGeoTrap(dz_sD,0,phi,dy+1.,dx1+1.,dx2+1.,0,dy+1.,dx1+1.,dx2+1.,0);
+	    G10Rpc[iPos] = new TGeoTrap(dz_sG,0,phi,dy+1.,dx1+1.,dx2+1.,0,dy+1.,dx1+1.,dx2+1.,0);
+	    DriftRpc[iPos]->SetName(Form("shStation%02iLayer%i%cModule%03i%cDrift", istn, ily, cside, iModule,cpos));
+	    DriftName[iPos] = Form("muchstation%02ilayer%i%cside%03i%ccopperDrift",istn+1,ily+1,cside,iMod+1,cpos);
+	    G10Rpc[iPos]->SetName(Form("shStation%02iLayer%i%cModule%03i%cG10", istn, ily, cside, iModule,cpos));
+	    G10Name[iPos] = Form("muchstation%02ilayer%i%cside%03i%cG10",istn+1,ily+1,cside,iMod+1,cpos);
+	    voDrift[iPos] = new TGeoVolume(DriftName[iPos],DriftRpc[iPos],copperplate);
+	    voDrift[iPos]->SetLineColor(kRed);
+	    voG10[iPos] = new TGeoVolume(G10Name[iPos],G10Rpc[iPos],g10plate);
+	    voG10[iPos]->SetLineColor(3);
+	  
+      }
+
+      //------------------------------------------------------------Frame-----------------------------------------------------------------
+      // Define the trapezoidal Frame 
+      TGeoTrap* shapeFrame = new TGeoTrap(sdz,0,phi,dy+1.,dx1+1.,dx2+1.,0,dy+1.,dx1+1.,dx2+1.,0);
+      shapeFrame->SetName(Form("shStation%02iLayer%i%cModule%03iFullFrameGemNoHole", istn, ily, cside, iModule));
+
+      TGeoTrap* shapeFrame1 = new TGeoTrap(sdz+.0001,0,phi,dy,dx1,dx2,0,dy,dx1,dx2,0);
+      shapeFrame1->SetName(Form("shStation%02iLayer%i%cModule%03iActiveVol", istn, ily, cside, iModule));
+      
+         
+     
+      TString expression;
+	  expression = Form("shStation%02iLayer%i%cModule%03iFullFrameGemNoHole-shStation%02iLayer%i%cModule%03iActiveVol", istn, ily, cside, iModule, istn, ily, cside, iModule);
+        
+      
+      TGeoCompositeShape* shFrame = new TGeoCompositeShape(Form("shStation%02iLayer%i%cModule%03iFinalFrameNoHole", istn, ily, cside, iModule), expression);
+      TString frameName = Form("muchstation%02ilayer%i%cframe%03i",istn+1,ily+1,cside,iMod+1);
+      
+      TGeoVolume* voFrame;
+      
+	  voFrame = new TGeoVolume(frameName,shFrame,SpacerRpc);  // Frame For RPC
+          voFrame->SetLineColor(kRed);
+      
+
+//----------------------------------------------Box -------------------------------------------
+       Double_t placeBox[3]={0.,0.,-0.5};
+       TGeoBBox * RpcBox1 = new TGeoBBox(dxx,dyy,dzz);
+       RpcBox1->SetName(Form("shStation%02iLayer%i%cModule%03iRpcBox1", istn, ily, cside, iModule));
+
+       TGeoBBox * RpcBox2 = new TGeoBBox(dxx-.3,dyy-.3,dzz-.5/2.,placeBox);
+       RpcBox2->SetName(Form("shStation%02iLayer%i%cModule%03iRpcBox2", istn, ily, cside, iModule));
+
+       TString expressionBox;
+       expressionBox = Form("shStation%02iLayer%i%cModule%03iRpcBox1-shStation%02iLayer%i%cModule%03iRpcBox2", istn, ily, cside, iModule, istn, ily, cside, iModule);
+
+
+       TGeoCompositeShape* shBox = new TGeoCompositeShape(Form("shStation%02iLayer%i%cModule%03iFinalBox", istn, ily, cside, iModule), expressionBox);
+      TString BoxName = Form("muchstation%02ilayer%i%cBox%03i",istn+1,ily+1,cside,iMod+1);
+      
+      TGeoVolume* voBox;
+      voBox = new TGeoVolume(BoxName,shBox,SpacerRpc);  // Box For RPC
+      voBox->SetLineColor(kMagenta);
+      voBox->SetTransparency(2);
+      //----------------------------------------------------Placement----------------------------------------------------------------------  
+      // Calculate the phi angle of the sector where it has to be placed 
+      Double_t angle = 180.0-(180. / TMath::Pi() * phi0);  // convert angle phi from rad to deg
+
+      // displace RPC module along the TOF frame
+      Double_t XOffset = 0;
+      Double_t ZOffset = -6.4-4;
+      
+      Double_t displacement_along_rails     = -0.0; // cm for Iron-56 run // -50.0; // cm for Carbon-12 run
+      Double_t support_frame_rotation_angle =  12.5; // degrees
+      
+      XOffset += +displacement_along_rails *cos( support_frame_rotation_angle * acos(-1)/180 );
+      ZOffset += -displacement_along_rails *sin( support_frame_rotation_angle * acos(-1)/180 );
+      // end of displacement along the rails
+      
+      TGeoRotation *r2 = new TGeoRotation("r2");
+      //rotate in the vertical plane (per to z axis) with angle 
+      r2->RotateZ(0);
+      //      r2->RotateX(2);
+   //   cout<<RpcAwayBeamAxisY<<"     "<<BoxAwayBeamAxisY<<endl;
+      TGeoTranslation *trans[10];
+      TGeoHMatrix *incline_mod[10]; 
+      
+      TGeoTranslation *transBox = new TGeoTranslation("",posBox[0]+XOffset,posBox[1],pos[2]+ZOffset);
+      //      TGeoTranslation *transBox = new TGeoTranslation("",posBox[0],posBox[1],pos[2]);
+      TGeoHMatrix *incline_modBox = new TGeoHMatrix("");
+	(*incline_modBox) =  (*transBox) * (*r2);
+	// incline_modBox->RotateX(-2.);
+	incline_modBox->RotateY(support_frame_rotation_angle);//sroy
+	
+      for(int i=0; i<8; i++){
+	trans[i] = new TGeoTranslation("",pos[0]+XOffset,pos[1],pos[i+2]+ZOffset);
+	//	trans[i] = new TGeoTranslation("",pos[0],pos[1],pos[i+2]);
+       
+	incline_mod[i] = new TGeoHMatrix("");
+	(*incline_mod[i]) =  (*trans[i]) * (*r2);  
+	// incline_mod[i]->RotateX(-2.);
+	incline_mod[i]->RotateY(support_frame_rotation_angle);//sroy
+
+      }
+   
+      volayer->AddNode(voBox, iMod, incline_modBox); // add box volume 
+      volayer->AddNode(voActive, iMod, incline_mod[0]); // add active volume 
+     // volayer->AddNode(voFrame, iMod, incline_mod[0]);  // add spacer
+      volayer->AddNode(voRPCFront, iMod, incline_mod[1]); //Rpc Glass In
+      volayer->AddNode(voRPCback, iMod, incline_mod[2]); //Rpc Glass Out 
+     
+      volayer->AddNode(voDrift[0], iMod, incline_mod[3]); //Drift In
+      volayer->AddNode(voDrift[1], iMod, incline_mod[4]); //Drift Out
+      volayer->AddNode(voG10[0], iMod, incline_mod[5]); //G10 In
+      volayer->AddNode(voG10[1], iMod, incline_mod[6]); //G10 Out
+   //   volayer->AddNode(voCool, iMod, incline_mod[7]); // Al Cooling Plate  
+
+      TVector3 Position;
+      Position.SetXYZ(pos[0], pos[1], pos[2]);
+      cout << pos[2] << "   " << pos[3] << "   " << pos[4] << "   " << pos[5] << "   " << pos[6] << "   " << pos[7]
+           << endl;
+     muchLySd->AddModule(new CbmMuchModuleGemRadial(fDetType[istn], istn, ily, iSide, iModule, Position, dx1,
+                                                     dx2,  dy,  dz, muchSt->GetRmin()));
+cout<<"stn: "<<istn<<"   module: "<<iModule<<endl;
+    }
+  }  
+  
+  return volayer;
+
+
+
+
+}
diff --git a/much/much_v22j_mcbm.geo.info b/much/much_v22j_mcbm.geo.info
new file mode 100644
index 00000000..dfb7229d
--- /dev/null
+++ b/much/much_v22j_mcbm.geo.info
@@ -0,0 +1,39 @@
+MUCH geometry created with create_MUCH_geometry_v22j_mcbm.C
+
+Build a mMUCH setup for mCBM with 2 GEM.
+10 mm thick Al plates are used for support and cooling in the GEM modules.
+Drift and read-out PCBs (copper coated G10 plates) inserted for realistic material budget for both GEM and RPC modules.
+
+No of Modules: 1      ( GEM )
+Position of Modules Z [cm]: 75.7    
+
+Placement of Modules:
+Module	X [cm]	Y [cm]	
+----------------------
+ 1	7.2	24.53
+----------------------
+
+Al Cooling Plate Thickness [cm]: 1    
+Active Volume Thickness [cm]: 0.3    
+
+
+ GEM Module:
+                7.5 cm
+               .........                 |
+              ...........                |
+             .............               |
+            ...............              |
+           .................             |
+          ...................            |
+         .....................           |
+        .......................         80 cm
+       .........................         |
+      ...........................        |
+     .............................       |
+    ...............................      |
+   .................................     |
+  ...................................    |
+ .....................................   |
+.......................................  |
+                40 cm
+
diff --git a/much/much_v22j_mcbm.geo.root b/much/much_v22j_mcbm.geo.root
new file mode 100644
index 0000000000000000000000000000000000000000..20f4618b80b5a8373333601894c89046330bca54
GIT binary patch
literal 17007
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

literal 0
HcmV?d00001

diff --git a/setup/setup_mcbm_beam_2022_03_28_uranium.C b/setup/setup_mcbm_beam_2022_03_28_uranium.C
index 1ba84b1f..0a044066 100644
--- a/setup/setup_mcbm_beam_2022_03_28_uranium.C
+++ b/setup/setup_mcbm_beam_2022_03_28_uranium.C
@@ -8,6 +8,7 @@
 
 // clang-format off
 
+// 2022-04-29 - DE - shift MUCH GEM to x = -5 cm
 // 2022-03-27 - DE - place the MUCH RPC behind the TOF stack, while GEMs are in the acceptance
 // 2022-03-27 - DE - place the MUCH RPC behind the TOF stack, while GEMs are out of acceptance
 // 2022-03-23 - DE - prepare setup for mCBM March 2022-03-22 iron run - tof_v21f
@@ -65,7 +66,7 @@ void setup_mcbm_beam_2022_03_28_uranium() {
   TString stsGeoTag  = "v22d_mcbm";
 
   // done
-  TString muchGeoTag = "v22i_mcbm"; // 2 GEM layers and 1 RPC
+  TString muchGeoTag = "v22j_mcbm"; // 2 GEM layers and 1 RPC
 
   // done
   TString trdGeoTag  = "v22g_mcbm"; // TRD-2D + 2x TRD-1D modules
-- 
GitLab


From e63550c9123644f6067bdbe3f1d98c1e772a040a Mon Sep 17 00:00:00 2001
From: "d.emschermann" <d.emschermann@gsi.de>
Date: Mon, 23 May 2022 21:31:21 +0200
Subject: [PATCH 2/6] Update position of MUCH GEM and RPC modules for the
 Nickel run, refs #2520

---
 .../mcbm/create_MUCH_geometry_v22k_mcbm.C     | 781 ++++++++++++++++++
 much/much_v22k_mcbm.geo.info                  |  39 +
 much/much_v22k_mcbm.geo.root                  | Bin 0 -> 16972 bytes
 3 files changed, 820 insertions(+)
 create mode 100644 macro/much/mcbm/create_MUCH_geometry_v22k_mcbm.C
 create mode 100644 much/much_v22k_mcbm.geo.info
 create mode 100644 much/much_v22k_mcbm.geo.root

diff --git a/macro/much/mcbm/create_MUCH_geometry_v22k_mcbm.C b/macro/much/mcbm/create_MUCH_geometry_v22k_mcbm.C
new file mode 100644
index 00000000..4e9d7c49
--- /dev/null
+++ b/macro/much/mcbm/create_MUCH_geometry_v22k_mcbm.C
@@ -0,0 +1,781 @@
+/* Copyright (C) 2022 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Omveer Singh, Shreya Roy, Florian Uhlig [committer] */
+
+/*** @author Omveer Singh <omvir.ch@gmail.com>
+ ** @date 17 May 2020
+ ** For more details see info file*/
+
+// clang-format off
+
+// 2022-05-23 - DE - v22k - 2 GEMs out of acceptance / RPC downstream of TOF stack at 25 degrees
+// 2022-04-29 - DE - v22j - 2 GEMs in acceptance x = -5 cm / RPC downstream of TOF stack
+// 2022-03-27 - DE - v22i - 2 GEMs in acceptance x = -3 cm / RPC downstream of TOF stack
+// 2022-03-27 - DE - v22h - 2 GEMs out of acceptance / RPC downstream of TOF stack
+// 2022-03-26 - DE - v22g - 2 GEMs out of acceptance / RPC upstream of TOF stack out of acceptance
+// 2022-03-25 - DE - v22f - 2 GEMs in acceptance / RPC upstream of TOF stack on z-axis
+
+#include "TClonesArray.h"
+#include "TDatime.h"
+#include "TFile.h"
+#include "TGeoBBox.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 "TMath.h"
+#include "TObjArray.h"
+#include "TRandom3.h"
+#include "TString.h"
+#include "TSystem.h"
+
+#include <cassert>
+#include <fstream>
+#include <iostream>
+#include <stdexcept>
+
+
+TObjArray* fStations = new TObjArray();
+CbmMuchStation* muchSt;
+CbmMuchLayer* muchLy;
+CbmMuchLayerSide* muchLySd;
+
+// Name of output file with geometry
+const TString tagVersion = "_v22k";
+//const TString subVersion   = "_sis100_1m_lmvm";
+const TString geoVersion   = "much";  // + tagVersion + subVersion;
+const TString FileNameSim  = geoVersion + tagVersion + "_mcbm.geo.root";
+const TString FileNameGeo  = geoVersion + tagVersion + "_mcbm_geo.root";
+const TString FileNameInfo = geoVersion + tagVersion + "_mcbm.geo.info";
+const TString FileNamePar  = geoVersion + tagVersion + "_mcbm.par.root";
+
+// 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 activemedium        = "MUCHargon";
+const TString spacermedium        = "MUCHnoryl";
+const TString Al                  = "aluminium";  //Al for cooling & support purpose
+const TString copper              = "copper";
+const TString g10                 = "G10";
+const TString RPCm= "RPCgas";
+const TString RPCg= "RPCglass";
+
+// Input parameters for MUCH stations
+//********************************************
+
+const Int_t fNst = 3;  // Number of stations
+Double_t TOF_Z_Front_Stand = 244.5;  // this is the TOF box front
+//Double_t TOF_Z_Front_Stand = 247.;  // this is the TOF RPC front
+Double_t RpcDistanceFromTof = -100.;  // add half thickness of RPC - gap is between backside of RPC and front of TOF
+//Double_t RpcDistanceFromTof = 7.;
+Double_t RpcPositionZ = TOF_Z_Front_Stand - RpcDistanceFromTof;
+Int_t fNlayers         = 1;               // Number of layers
+Double_t fLayersZ0[fNst]  = {75.7, 108.7, RpcPositionZ};   // Layers Positions
+//Double_t fLayersZ0[fNst]  = {65.7, 88.7, RpcPositionZ};   // Layers Positions
+Int_t fDetType[fNst]      = {3, 3, 4};          // Detector type
+Double_t fSupportLz[fNst] = {1., 1., 0};        // (cooling + support)
+Double_t fDriftDz      = 0.0035;          //35 micron copper Drift
+Double_t fG10Dz        = 0.30;            // 3 mm G10
+
+Double_t fActiveLzSector[fNst] = {0.3, 0.3, 0.2};  // Active volume thickness [cm]
+Double_t fFrameLzSector[fNst]  = {.3, .3, .6};    // Frame thickness [cm]
+Double_t fRpcGlassDz[fNst] = {0.0,0.0,0.2}; //Rpc Glass thickness [cm]
+Double_t fSpacerPhi         = 2.0;         // Spacer width in Phi [cm]
+Double_t fOverlapR          = 2.0;         // Overlap in R direction [cm]
+Double_t fSpacerR1          = 2.8;         // Spacer width in R at low Z[cm]
+Double_t fSpacerR2          = 3.5;         // Spacer width in R at high Z[cm]
+
+//Size of Modules
+//GEM
+Double_t dy  = 40.0;
+Double_t dx1 = 3.75;
+Double_t dx2 = 20;
+
+
+//RPC
+Double_t dyR  = 116.13/2.; 
+Double_t dx1R = 10.26/2.;
+Double_t dx2R = 50.98/2.;
+
+//box size
+Double_t dxx  = 74.0/2. ; 
+Double_t dyy = 123.0/2.;
+Double_t dzz = 3.8/2.;
+
+
+Double_t DetectorAxisHeight = 200.; //reference ground
+Double_t BoxBaseHeight = 154.0;
+Double_t BoxCentreHeight = BoxBaseHeight + dyy;
+Double_t BoxAwayBeamAxisY = BoxCentreHeight - DetectorAxisHeight;
+
+
+Double_t RpcBaseHeight = BoxBaseHeight + 4.5 ;
+Double_t RpcCentreHeight = RpcBaseHeight + dyR;
+Double_t RpcAwayBeamAxisY = RpcCentreHeight - DetectorAxisHeight;
+
+//Position of Box
+Double_t posBox[]={0,BoxAwayBeamAxisY}; //from the detector axis
+
+
+Double_t fX[fNst]         = {7.2, 7.2, 0.};      //Placement of modules in X [cm]
+Double_t fY[fNst]         = {24.53, 24.53, RpcAwayBeamAxisY};  //Placement of modules in Y [cm]
+
+//***********************************************************
+
+// some global variables
+TGeoManager* gGeoMan = NULL;         // Pointer to TGeoManager instance
+TGeoVolume* gModules_station[fNst];  // Global storage for module types
+
+// Forward declarations
+void create_materials_from_media_file();
+TGeoVolume* CreateStations(int ist);
+TGeoVolume* CreateLayersGem(int istn, int ily);
+TGeoVolume* CreateLayersRpc(int istn, int ily);
+
+
+fstream infoFile;
+void create_MUCH_geometry_v22k_mcbm()
+{
+  // Load FairRunSim to ensure the correct unit system
+  FairRunSim* sim = new FairRunSim();
+
+  // -------   Open info file   -----------------------------------------------
+  TString infoFileName = FileNameSim;
+  infoFileName.ReplaceAll("root", "info");
+  infoFile.open(infoFileName.Data(), fstream::out);
+  infoFile << "MUCH geometry created with create_MUCH_geometry_v22k_mcbm.C" << endl << endl;
+  infoFile << "Build a mMUCH setup for mCBM with 2 GEM." << endl;
+  infoFile << "10 mm thick Al plates are used for support and cooling in the "
+              "GEM modules."
+           << endl;
+  infoFile << "Drift and read-out PCBs (copper coated G10 plates) inserted for "
+              "realistic material budget for both GEM and RPC modules."
+           << endl
+           << endl;
+  infoFile << "No of Modules: " << fNlayers << "      ( GEM )" << endl;
+  infoFile << "Position of Modules Z [cm]: ";
+  for (int i = 0; i < fNlayers; i++)
+    infoFile << fLayersZ0[i] << "    ";
+
+  infoFile << endl << endl << "Placement of Modules:" << endl;
+  infoFile << "Module"
+           << "\t"
+           << "X [cm]"
+           << "\t"
+           << "Y [cm]"
+           << "\t" << endl;
+  infoFile << "----------------------" << endl;
+  for (int i = 0; i < fNlayers; i++)
+    infoFile << " " << i + 1 << "\t" << fX[i] << "\t" << fY[i] << endl;
+  infoFile << "----------------------" << endl;
+  infoFile << endl << "Al Cooling Plate Thickness [cm]: ";
+  for (int i = 0; i < fNlayers; i++)
+    infoFile << fSupportLz[i] << "    ";
+
+  infoFile << endl << "Active Volume Thickness [cm]: ";
+  for (int i = 0; i < fNlayers; i++)
+    infoFile << fActiveLzSector[i] << "    ";
+
+  infoFile << endl << endl << endl << " GEM Module:" << endl;
+  infoFile << "                " << 2 * dx1 << " cm" << endl;
+  infoFile << "               .........                 |" << endl;
+  infoFile << "              ...........                |" << endl;
+  infoFile << "             .............               |" << endl;
+  infoFile << "            ...............              |" << endl;
+  infoFile << "           .................             |" << endl;
+  infoFile << "          ...................            |" << endl;
+  infoFile << "         .....................           |" << endl;
+  infoFile << "        .......................         " << 2 * dy << " cm" << endl;
+  infoFile << "       .........................         |" << endl;
+  infoFile << "      ...........................        |" << endl;
+  infoFile << "     .............................       |" << endl;
+  infoFile << "    ...............................      |" << endl;
+  infoFile << "   .................................     |" << endl;
+  infoFile << "  ...................................    |" << endl;
+  infoFile << " .....................................   |" << endl;
+  infoFile << ".......................................  |" << endl;
+  infoFile << "                " << 2 * dx2 << " cm" << endl;
+  infoFile << endl;
+
+
+  // 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(10);
+
+  // Create the top volume
+  TGeoBBox* topbox = new TGeoBBox("", 1000., 1000., 2000.);
+  TGeoVolume* top  = new TGeoVolume("top", topbox, gGeoMan->GetMedium("air"));
+  gGeoMan->SetTopVolume(top);
+
+  TString topName = geoVersion + tagVersion + "_mcbm";
+
+  TGeoVolume* much = new TGeoVolumeAssembly(topName);
+  top->AddNode(much, 1);
+
+  TGeoVolume* sttn = new TGeoVolumeAssembly("station");
+  much->AddNode(sttn, 1);
+
+
+  for (Int_t istn = 0; istn < fNst; istn++) {
+
+    Double_t stGlobalZ0 = fLayersZ0[istn];
+    muchSt              = new CbmMuchStation(istn, stGlobalZ0);
+    muchSt->SetRmin(0.);
+    muchSt->SetRmax(0.);
+    fStations->Add(muchSt);
+
+
+    gModules_station[istn] = CreateStations(istn);
+    sttn->AddNode(gModules_station[istn], istn);
+  }
+
+  gGeoMan->CloseGeometry();
+  gGeoMan->CheckOverlaps(0.0001, "s");
+  gGeoMan->PrintOverlaps();
+
+  much->Export(FileNameSim);  // an alternative way of writing the much
+
+  TFile* outfile                  = new TFile(FileNameSim, "UPDATE");
+  TGeoTranslation* much_placement = new TGeoTranslation("much_trans", -6., 0., 0.);
+  much_placement->Write();
+  outfile->Close();
+
+  outfile = new TFile(FileNameGeo, "RECREATE");
+  gGeoMan->Write();  // use this if you want GeoManager format in the output
+  outfile->Close();
+
+  // create medialist for this geometry
+  TString createmedialist = gSystem->Getenv("VMCWORKDIR");
+  createmedialist += "/macro/geometry/create_medialist.C";
+  std::cout << "Loading macro " << createmedialist << std::endl;
+  gROOT->LoadMacro(createmedialist);
+  gROOT->ProcessLine("create_medialist(\"\", false)");
+
+  top->Draw("ogl");
+  infoFile.close();
+
+  TFile* parfile = new TFile(FileNamePar, "RECREATE");
+  fStations->Write("stations", 1);  // for geometry parameters
+  parfile->Close();
+}
+
+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(KeepingVolumeMedium);
+  geoBuild->createMedium(air);
+
+  FairGeoMedium* MUCHargon = geoMedia->getMedium(activemedium);
+  geoBuild->createMedium(MUCHargon);
+
+  FairGeoMedium* MUCHnoryl = geoMedia->getMedium(spacermedium);
+  geoBuild->createMedium(MUCHnoryl);
+
+  FairGeoMedium* MUCHsupport = geoMedia->getMedium(Al);
+  geoBuild->createMedium(MUCHsupport);
+
+  FairGeoMedium* copperplate = geoMedia->getMedium(copper);
+  geoBuild->createMedium(copperplate);
+
+  FairGeoMedium* g10plate = geoMedia->getMedium(g10);
+  geoBuild->createMedium(g10plate);
+
+  FairGeoMedium* RPCmedium = geoMedia->getMedium(RPCm);
+  geoBuild->createMedium(RPCmedium);
+
+  FairGeoMedium* RPCmaterial = geoMedia->getMedium(RPCg);
+  geoBuild->createMedium(RPCmaterial);
+
+}
+
+TGeoVolume* CreateStations(int ist)
+{
+
+  TString stationName         = Form("muchstation%02i", ist + 1);
+  TGeoVolumeAssembly* station = new TGeoVolumeAssembly(stationName);  //, shStation, air);
+
+  TGeoVolume* gLayer[fNlayers + 1];
+  for (int ii = 0; ii < fNlayers; ii++) {  // 2 Layers
+
+   // Double_t sideDz = fSupportLz[istn] / 2. + fActiveLzSector[istn] / 2.;  // distance between side's and layer's centers
+
+    muchLy = new CbmMuchLayer(ist, ii, fLayersZ0[ist], 0.);
+    muchSt->AddLayer(muchLy);
+    muchLy->GetSideF()->SetZ(fLayersZ0[ist] );  
+
+
+ if(ist<2)gLayer[ii] = CreateLayersGem(ist, ii);
+   else gLayer[ii] = CreateLayersRpc(ist, ii);
+    station->AddNode(gLayer[ii], ii);
+  }
+
+  return station;
+}
+
+TGeoVolume* CreateLayersGem(int istn, int ily)
+{
+
+  TString layerName = Form("muchstation%02ilayer%i", istn + 1, ily + 1);
+
+
+  TGeoVolumeAssembly* volayer = new TGeoVolumeAssembly(layerName);
+
+  Double_t SupportDz = fSupportLz[istn] / 2.;
+  Double_t driftDz   = fActiveLzSector[istn] / 2 + fDriftDz / 2.;
+  Double_t g10Dz     = driftDz + fDriftDz / 2. + fG10Dz / 2.;
+
+
+  Double_t moduleZ   = fLayersZ0[istn];
+  Double_t driftZIn  = moduleZ - driftDz;
+  Double_t driftZOut = moduleZ + driftDz;
+  Double_t g10ZIn    = moduleZ - g10Dz;
+  Double_t g10ZOut   = moduleZ + g10Dz;
+  Double_t cool_z    = g10ZIn - fG10Dz / 2. - SupportDz;
+
+  Double_t dz = fActiveLzSector[istn] / 2.;  // Active Volume Thickness
+
+  Int_t Nsector = 16.0;
+  Double_t phi0 = TMath::Pi() / Nsector;  // azimuthal half widh of each module
+
+  //define the spacer dimensions
+  Double_t tg   = (dx2 - dx1) / 2 / dy;
+  Double_t dd1  = fSpacerPhi * tg;
+  Double_t dd2  = fSpacerPhi * sqrt(1 + tg * tg);
+  Double_t sdx1 = dx1 + dd2 - dd1;
+  Double_t sdx2 = dx2 + dd2 + dd1;
+  Double_t sdy1 = dy + fSpacerR1;  // frame width added
+  Double_t sdy2 = dy + fSpacerR2;  // frame width added
+  Double_t sdz  = fFrameLzSector[istn] / 2.;
+
+  //define Additional material as realistic GEM module
+  Double_t dz_sD = fDriftDz / 2.;  //35 micron copper Drift
+  Double_t dz_sG = fG10Dz / 2.;    // 3mm G10
+  Double_t sdy   = sdy2;
+
+
+  Double_t pos[10];
+
+  Int_t iMod = 0;
+  for (Int_t iSide = 0; iSide < 1; iSide++) {
+    //muchLySd = muchLy->GetSide(iSide);
+    // Now start adding the GEM modules
+    for (Int_t iModule = 0; iModule < 1; iModule++) {
+
+      Double_t phi  = 0;  // add 0.5 to not overlap with y-axis for left-right layer separation
+      Bool_t isBack = iModule % 2;
+      Char_t cside  = (isBack == 1) ? 'b' : 'f';
+
+      // correct the x, y positions
+      pos[0] = fX[istn];
+      pos[1] = fY[istn];
+
+
+      // different z positions for odd/even modules
+      pos[2] = moduleZ;
+      pos[3] = driftZIn;
+      pos[4] = driftZOut;
+      pos[5] = g10ZIn;
+      pos[6] = g10ZOut;
+      pos[7] = cool_z;
+
+      if (iSide != isBack) continue;
+      if (iModule != 0) iMod = iModule / 2;
+
+      muchLySd = muchLy->GetSide(iSide);
+
+      TGeoMedium* argon       = gGeoMan->GetMedium(activemedium);  // active medium
+      TGeoMedium* noryl       = gGeoMan->GetMedium(spacermedium);  // spacer medium
+      TGeoMedium* copperplate = gGeoMan->GetMedium(copper);        // copper Drift medium
+      TGeoMedium* g10plate    = gGeoMan->GetMedium(g10);           // G10 medium
+      TGeoMedium* coolMat     = gGeoMan->GetMedium(Al);
+
+
+      // Define and place the shape of the modules
+      TGeoTrap* shapeGem = new TGeoTrap(dz, 0, 0, dy, dx1, dx2, 0, dy, dx1, dx2, 0);
+      shapeGem->SetName(Form("shStation%02iLayer%i%cModule%03iActiveGemNoHole", istn, ily, cside, iModule));
+
+      //------------------------------------------------------Al Cooling Plate--------------------------------------------------------------------
+      TGeoVolume* voActive;
+      TGeoTrap* coolGem;
+      TGeoVolume* voCool;
+
+      coolGem = new TGeoTrap(SupportDz, 0, phi, sdy2, sdx1, sdx2, 0, sdy2, sdx1, sdx2, 0);
+      coolGem->SetName(Form("shStation%02iLayer%i%cModule%03icoolGem", istn, ily, cside, iModule));
+      TString CoolName = Form("muchstation%02ilayer%i%ccoolGem%03iAluminum", istn + 1, ily + 1, cside, iModule + 1);
+      voCool           = new TGeoVolume(CoolName, coolGem, coolMat);
+      voCool->SetLineColor(kYellow);
+
+      //------------------------------------------------------Active Volume-----------------------------------------------------
+      //GEM
+      TGeoTrap* shapeActive = new TGeoTrap(dz, 0, 0, dy, dx1, dx2, 0, dy, dx1, dx2, 0);
+      shapeActive->SetName(Form("shStation%02iLayer%i%cModule%03iActiveNoHole", istn, ily, cside, iModule));
+      TString activeName = Form("muchstation%02ilayer%i%cactive%03igasArgon", istn + 1, ily + 1, cside, iMod + 1);
+      voActive           = new TGeoVolume(activeName, shapeActive, argon);
+      voActive->SetLineColor(kGreen);
+
+
+      //---------------------------------------------------------Drift & PCB's---------------------------------------------------------------
+
+      TString DriftName[2], G10Name[2], AlName;
+      TGeoVolume *voDrift[2], *voG10[2];
+      TGeoTrap *DriftGem[2], *G10Gem[2];
+
+      for (int iPos = 0; iPos < 2; iPos++) {
+        Char_t cpos    = (iPos == 0) ? 'i' : 'o';
+        DriftGem[iPos] = new TGeoTrap(dz_sD, 0, phi, sdy, sdx1, sdx2, 0, sdy, sdx1, sdx2, 0);
+        G10Gem[iPos]   = new TGeoTrap(dz_sG, 0, phi, sdy, sdx1, sdx2, 0, sdy, sdx1, sdx2, 0);
+        DriftGem[iPos]->SetName(Form("shStation%02iLayer%i%cModule%03i%cDrift", istn, ily, cside, iModule, cpos));
+        DriftName[iPos] =
+          Form("muchstation%02ilayer%i%cside%03i%ccopperDrift", istn + 1, ily + 1, cside, iMod + 1, cpos);
+        G10Gem[iPos]->SetName(Form("shStation%02iLayer%i%cModule%03i%cG10", istn, ily, cside, iModule, cpos));
+        G10Name[iPos] = Form("muchstation%02ilayer%i%cside%03i%cG10", istn + 1, ily + 1, cside, iMod + 1, cpos);
+        voDrift[iPos] = new TGeoVolume(DriftName[iPos], DriftGem[iPos], copperplate);
+        voDrift[iPos]->SetLineColor(kRed);
+        voG10[iPos] = new TGeoVolume(G10Name[iPos], G10Gem[iPos], g10plate);
+        voG10[iPos]->SetLineColor(28);
+      }
+      //------------------------------------------------------------Frame-----------------------------------------------------------------
+      // Define the trapezoidal Frame
+      TGeoTrap* shapeFrame = new TGeoTrap(sdz, 0, 0, sdy, sdx1, sdx2, 0, sdy, sdx1, sdx2, 0);
+      shapeFrame->SetName(Form("shStation%02iLayer%i%cModule%03iFullFrameGemNoHole", istn, ily, cside, iModule));
+
+
+      TString expression = Form("shStation%02iLayer%i%cModule%03iFullFrameGemNoHole-shStation%"
+                                "02iLayer%i%cModule%03iActiveGemNoHole",
+                                istn, ily, cside, iModule, istn, ily, cside, iModule);
+
+      TGeoCompositeShape* shFrame = new TGeoCompositeShape(
+        Form("shStation%02iLayer%i%cModule%03iFinalFrameNoHole", istn, ily, cside, iModule), expression);
+      TString frameName = Form("muchstation%02ilayer%i%csupport%03i", istn + 1, ily + 1, cside, iMod + 1);
+
+      TGeoVolume* voFrame = new TGeoVolume(frameName, shFrame, noryl);  // Frame for GEM
+      voFrame->SetLineColor(kMagenta);
+
+
+      //----------------------------------------------------Placement----------------------------------------------------------------------
+      // Calculate the phi angle of the sector where it has to be placed
+      Double_t angle = 180.0 - (180. / TMath::Pi() * phi0);  // convert angle phi from rad to deg
+
+
+      TGeoRotation* r2 = new TGeoRotation("r2");
+      //rotate in the vertical plane (per to z axis) with angle
+      r2->RotateZ(angle);
+
+
+      TGeoTranslation* trans[10];
+      TGeoHMatrix* incline_mod[10];
+
+      for (int i = 0; i < 6; i++) {
+        trans[i] = new TGeoTranslation("", pos[0] - 58.0, pos[1], pos[i + 2]);  // shift GEMs in x, y, z here
+
+        incline_mod[i]    = new TGeoHMatrix("");
+        (*incline_mod[i]) = (*trans[i]) * (*r2);
+      }
+
+      volayer->AddNode(voFrame, iMod, incline_mod[0]);     // add spacer
+      volayer->AddNode(voActive, iMod, incline_mod[0]);    // add active volume
+      volayer->AddNode(voDrift[0], iMod, incline_mod[1]);  //Drift In
+      volayer->AddNode(voDrift[1], iMod, incline_mod[2]);  //Drift Out
+      volayer->AddNode(voG10[0], iMod, incline_mod[3]);    //G10 In
+      volayer->AddNode(voG10[1], iMod, incline_mod[4]);    //G10 Out
+      volayer->AddNode(voCool, iMod, incline_mod[5]);      // Al Cooling Plate
+
+      TVector3 Position;
+      Position.SetXYZ(pos[0], pos[1], pos[2]);
+      cout << pos[2] << "   " << pos[3] << "   " << pos[4] << "   " << pos[5] << "   " << pos[6] << "   " << pos[7]
+           << endl;
+     muchLySd->AddModule(new CbmMuchModuleGemRadial(fDetType[istn], istn, ily, iSide, iModule, Position, dx1,
+                                                     dx2,  dy,  dz, muchSt->GetRmin()));
+cout<<"stn: "<<istn<<"   module: "<<iModule<<endl;
+    }
+  }
+
+  return volayer;
+}
+
+TGeoVolume* CreateLayersRpc(int istn, int ily){
+
+ 
+ TString layerName;
+ 
+   layerName = Form("muchstation%02ilayerRpc%i",istn+1,ily+1);
+  
+
+  TGeoVolumeAssembly* volayer = new TGeoVolumeAssembly(layerName);
+
+  Double_t SupportDz = fSupportLz[istn]/2.;
+  Double_t RpcGlassDz = fActiveLzSector[istn]/2. + fRpcGlassDz[istn]/2.;
+  Double_t driftDz = RpcGlassDz + fRpcGlassDz[istn]/2 + fDriftDz/2.;
+  Double_t g10Dz = driftDz + fDriftDz/2. + fG10Dz/2.;
+  Double_t FrameRpcDz = fActiveLzSector[istn]/2. + fRpcGlassDz[istn] + fDriftDz + g10Dz + fG10Dz;
+  
+  Double_t moduleZ = fLayersZ0[istn]; 
+  Double_t RpcGlassZIn = moduleZ - RpcGlassDz;
+  Double_t RpcGlassZOut = moduleZ + RpcGlassDz;
+  Double_t driftZIn = moduleZ - driftDz; 
+  Double_t driftZOut = moduleZ + driftDz; 
+  Double_t g10ZIn = moduleZ - g10Dz;
+  Double_t g10ZOut = moduleZ + g10Dz;
+ // Double_t cool_z = g10ZOut + fG10Dz/2. + SupportDz;
+  Double_t cool_z = g10ZIn - fG10Dz / 2. - SupportDz;
+
+  Double_t dz  = fActiveLzSector[istn]/2.; // Active Volume Thickness 
+  
+  Int_t Nsector=16.0;
+  Double_t phi0 = TMath::Pi()/Nsector; // azimuthal half widh of each module
+
+  dx1 = dx1R; dx2 = dx2R; dy = dyR;
+  //define the spacer dimensions      
+  Double_t tg = (dx2-dx1)/2/dy;
+  Double_t dd1 = fSpacerPhi*tg;
+  Double_t dd2 = fSpacerPhi*sqrt(1+tg*tg);
+  Double_t sdx1 = dx1+dd2-dd1;
+  Double_t sdx2 = dx2+dd2+dd1; 
+  Double_t sdy1  = dy+fSpacerR1; // frame width added 
+  Double_t sdy2  = dy+fSpacerR2; // frame width added
+  Double_t sdz = fFrameLzSector[istn]/2.;
+  
+  //define Additional material as realistic GEM module
+  Double_t dz_sD = fDriftDz/2.; //35 micron copper Drift 
+  Double_t dz_sG = fG10Dz/2.; // 3mm G10
+  Double_t sdy = sdy2;
+  
+  
+  Double_t pos[10];
+  
+  Int_t iMod =0;
+  for (Int_t iSide=0;iSide<1;iSide++){
+     // muchLySd = muchLy->GetSide(iSide);
+    // Now start adding the Rpc modules  
+    for (Int_t iModule=0; iModule<1; iModule++){ 
+      
+      Double_t phi  = 0;  // add 0.5 to not overlap with y-axis for left-right layer separation
+      Bool_t isBack = iModule%2; 
+      Char_t cside  = (isBack==1) ? 'b' : 'f'; 
+      
+      // correct the x, y positions
+      pos[0] = fX[istn];   
+      pos[1] = fY[istn];
+      
+      
+      
+      // different z positions for odd/even modules
+      pos[2] = moduleZ ;
+      pos[3] = RpcGlassZIn;
+      pos[4] = RpcGlassZOut;
+      pos[5] = driftZIn;
+      pos[6] = driftZOut;
+      pos[7] = g10ZIn;
+      pos[8] = g10ZOut;
+      pos[9] = cool_z;
+      
+      if(iSide!=isBack)continue;
+      if(iModule!=0)iMod =iModule/2;
+      
+      muchLySd = muchLy->GetSide(iSide);  
+    
+
+      TGeoMedium* SpacerRpc = gGeoMan->GetMedium(Al); // spacer medium
+      TGeoMedium* copperplate = gGeoMan->GetMedium(copper); // copper Drift medium
+      TGeoMedium* g10plate = gGeoMan->GetMedium(g10); // G10 medium
+      TGeoMedium*  RPCglassmat = gGeoMan->GetMedium(RPCg); // RPC Glass
+      TGeoMedium*  RPCgasmedium = gGeoMan->GetMedium(RPCm); // RPC Gas
+      TGeoMedium* coolMat = gGeoMan->GetMedium(Al);
+      
+
+      TGeoTrap* shapeRpc = new TGeoTrap(sdz,0,0,dy,dx1,dx2,0,dy,dx1,dx2,0);
+     // TGeoBBox * shapeRpc = new TGeoBBox(dxx,dyy,FrameRpcDz);
+      shapeRpc->SetName(Form("shStation%02iLayer%i%cModule%03iActiveRpcNoHole", istn, ily, cside, iModule));
+      
+      //------------------------------------------------------Al Cooling Plate--------------------------------------------------------------------
+      TGeoVolume* voActive, *voRPCback, *voRPCFront;      
+      TGeoTrap * coolRpc;
+      TGeoVolume* voCool;
+   
+	coolRpc = new TGeoTrap(SupportDz,0,phi,sdy2,sdx1,sdx2,0,sdy2,sdx1,sdx2,0);
+	coolRpc->SetName(Form("shStation%02iLayer%i%cModule%03icoolRpc", istn, ily, cside, iModule));
+	TString CoolName = Form("muchstation%02ilayer%i%ccoolRpc%03iAluminum",istn+1,ily+1,cside,iModule+1);
+	voCool = new TGeoVolume(CoolName,coolRpc,coolMat);
+	voCool->SetLineColor(kYellow);
+     
+      
+      
+      //------------------------------------------------------Active Volume & Rpc Glass----------------------------------------------------- 
+ 
+          //RPC Active
+          TGeoTrap* shapeActive = new TGeoTrap(dz,0,0,dy,dx1,dx2,0,dy,dx1,dx2,0);
+          shapeActive->SetName(Form("shStation%02iLayer%i%cModule%03iActiveNoHole", istn, ily, cside, iModule));
+	  TString activeName = Form("muchstation%02ilayer%i%cactive%03irpcgas",istn+1,ily+1,cside,iMod+1);
+	  voActive = new TGeoVolume(activeName,shapeActive,RPCgasmedium);
+	  voActive->SetLineColor(kRed);
+	  
+	  //RPC Glass Front          
+          TGeoTrap* shapeRPCfront = new TGeoTrap(dz,0,0,dy,dx1,dx2,0,dy,dx1,dx2,0);
+         // TGeoBBox * shapeRPCfront = new TGeoBBox(dxx,dyy,dz);
+	  shapeRPCfront->SetName(Form("shStation%02iLayer%i%cModule%03iNoHoleFront", istn, ily, cside, iModule));
+	  TString NameFront = Form("muchstation%02ilayer%i%c%03irpcglassFront",istn+1,ily+1,cside,iMod+1);
+	  voRPCFront = new TGeoVolume(NameFront,shapeRPCfront,RPCglassmat);
+	  voRPCFront->SetLineColor(kRed);
+	  
+	  //RPC Glass Back
+          TGeoTrap* shapeRPCback = new TGeoTrap(dz,0,0,dy,dx1,dx2,0,dy,dx1,dx2,0);
+          //TGeoBBox * shapeRPCback = new TGeoBBox(dxx,dyy,dz);
+	  shapeRPCback->SetName(Form("shStation%02iLayer%i%cModule%03iNoHoleback", istn, ily, cside, iModule));
+	  TString Nameback = Form("muchstation%02ilayer%i%c%03irpcglassback",istn+1,ily+1,cside,iMod+1);
+	  voRPCback = new TGeoVolume(Nameback,shapeRPCback,RPCglassmat);
+	  voRPCback->SetLineColor(kRed);
+      
+//---------------------------------------------------------Drift & PCB's---------------------------------------------------------------     
+      
+      TString DriftName[2], G10Name[2], AlName;
+      TGeoVolume *voDrift[2], *voG10[2];
+      TGeoTrap *DriftRpc[2], *G10Rpc[2];
+      
+      for(int iPos =0; iPos<2; iPos++){
+	Char_t cpos  = (iPos==0) ? 'i' : 'o'; 
+	
+	    DriftRpc[iPos] = new TGeoTrap(dz_sD,0,phi,dy+1.,dx1+1.,dx2+1.,0,dy+1.,dx1+1.,dx2+1.,0);
+	    G10Rpc[iPos] = new TGeoTrap(dz_sG,0,phi,dy+1.,dx1+1.,dx2+1.,0,dy+1.,dx1+1.,dx2+1.,0);
+	    DriftRpc[iPos]->SetName(Form("shStation%02iLayer%i%cModule%03i%cDrift", istn, ily, cside, iModule,cpos));
+	    DriftName[iPos] = Form("muchstation%02ilayer%i%cside%03i%ccopperDrift",istn+1,ily+1,cside,iMod+1,cpos);
+	    G10Rpc[iPos]->SetName(Form("shStation%02iLayer%i%cModule%03i%cG10", istn, ily, cside, iModule,cpos));
+	    G10Name[iPos] = Form("muchstation%02ilayer%i%cside%03i%cG10",istn+1,ily+1,cside,iMod+1,cpos);
+	    voDrift[iPos] = new TGeoVolume(DriftName[iPos],DriftRpc[iPos],copperplate);
+	    voDrift[iPos]->SetLineColor(kRed);
+	    voG10[iPos] = new TGeoVolume(G10Name[iPos],G10Rpc[iPos],g10plate);
+	    voG10[iPos]->SetLineColor(3);
+	  
+      }
+
+      //------------------------------------------------------------Frame-----------------------------------------------------------------
+      // Define the trapezoidal Frame 
+      TGeoTrap* shapeFrame = new TGeoTrap(sdz,0,phi,dy+1.,dx1+1.,dx2+1.,0,dy+1.,dx1+1.,dx2+1.,0);
+      shapeFrame->SetName(Form("shStation%02iLayer%i%cModule%03iFullFrameGemNoHole", istn, ily, cside, iModule));
+
+      TGeoTrap* shapeFrame1 = new TGeoTrap(sdz+.0001,0,phi,dy,dx1,dx2,0,dy,dx1,dx2,0);
+      shapeFrame1->SetName(Form("shStation%02iLayer%i%cModule%03iActiveVol", istn, ily, cside, iModule));
+      
+         
+     
+      TString expression;
+	  expression = Form("shStation%02iLayer%i%cModule%03iFullFrameGemNoHole-shStation%02iLayer%i%cModule%03iActiveVol", istn, ily, cside, iModule, istn, ily, cside, iModule);
+        
+      
+      TGeoCompositeShape* shFrame = new TGeoCompositeShape(Form("shStation%02iLayer%i%cModule%03iFinalFrameNoHole", istn, ily, cside, iModule), expression);
+      TString frameName = Form("muchstation%02ilayer%i%cframe%03i",istn+1,ily+1,cside,iMod+1);
+      
+      TGeoVolume* voFrame;
+      
+	  voFrame = new TGeoVolume(frameName,shFrame,SpacerRpc);  // Frame For RPC
+          voFrame->SetLineColor(kRed);
+      
+
+//----------------------------------------------Box -------------------------------------------
+       Double_t placeBox[3]={0.,0.,-0.5};
+       TGeoBBox * RpcBox1 = new TGeoBBox(dxx,dyy,dzz);
+       RpcBox1->SetName(Form("shStation%02iLayer%i%cModule%03iRpcBox1", istn, ily, cside, iModule));
+
+       TGeoBBox * RpcBox2 = new TGeoBBox(dxx-.3,dyy-.3,dzz-.5/2.,placeBox);
+       RpcBox2->SetName(Form("shStation%02iLayer%i%cModule%03iRpcBox2", istn, ily, cside, iModule));
+
+       TString expressionBox;
+       expressionBox = Form("shStation%02iLayer%i%cModule%03iRpcBox1-shStation%02iLayer%i%cModule%03iRpcBox2", istn, ily, cside, iModule, istn, ily, cside, iModule);
+
+
+       TGeoCompositeShape* shBox = new TGeoCompositeShape(Form("shStation%02iLayer%i%cModule%03iFinalBox", istn, ily, cside, iModule), expressionBox);
+      TString BoxName = Form("muchstation%02ilayer%i%cBox%03i",istn+1,ily+1,cside,iMod+1);
+      
+      TGeoVolume* voBox;
+      voBox = new TGeoVolume(BoxName,shBox,SpacerRpc);  // Box For RPC
+      voBox->SetLineColor(kMagenta);
+      voBox->SetTransparency(2);
+      //----------------------------------------------------Placement----------------------------------------------------------------------  
+      // Calculate the phi angle of the sector where it has to be placed 
+      Double_t angle = 180.0-(180. / TMath::Pi() * phi0);  // convert angle phi from rad to deg
+
+      // displace RPC module along the TOF frame
+      Double_t XOffset = 53.5;
+      Double_t ZOffset = -16.4;
+      
+      Double_t displacement_along_rails     = 0; // cm for Nickel-58 run
+      Double_t support_frame_rotation_angle = 0; // 12.5; // degrees
+      
+      XOffset += +displacement_along_rails *cos( support_frame_rotation_angle * acos(-1)/180 );
+      ZOffset += -displacement_along_rails *sin( support_frame_rotation_angle * acos(-1)/180 );
+      // end of displacement along the rails
+      
+      TGeoRotation *r2 = new TGeoRotation("r2");
+      //rotate in the vertical plane (per to z axis) with angle 
+      r2->RotateZ(0);
+      //      r2->RotateX(2);
+      //   cout<<RpcAwayBeamAxisY<<"     "<<BoxAwayBeamAxisY<<endl;
+      TGeoTranslation *trans[10];
+      TGeoHMatrix *incline_mod[10]; 
+      
+      TGeoTranslation *transBox = new TGeoTranslation("",posBox[0]+XOffset,posBox[1],pos[2]+ZOffset);
+      //      TGeoTranslation *transBox = new TGeoTranslation("",posBox[0],posBox[1],pos[2]);
+      TGeoHMatrix *incline_modBox = new TGeoHMatrix("");
+	(*incline_modBox) =  (*transBox) * (*r2);
+	// incline_modBox->RotateX(-2.);
+	incline_modBox->RotateY(support_frame_rotation_angle);//sroy
+	
+      for(int i=0; i<8; i++){
+	trans[i] = new TGeoTranslation("",pos[0]+XOffset,pos[1],pos[i+2]+ZOffset);
+	//	trans[i] = new TGeoTranslation("",pos[0],pos[1],pos[i+2]);
+       
+	incline_mod[i] = new TGeoHMatrix("");
+	(*incline_mod[i]) =  (*trans[i]) * (*r2);  
+	// incline_mod[i]->RotateX(-2.);
+	incline_mod[i]->RotateY(support_frame_rotation_angle);//sroy
+
+      }
+   
+      volayer->AddNode(voBox, iMod, incline_modBox); // add box volume 
+      volayer->AddNode(voActive, iMod, incline_mod[0]); // add active volume 
+     // volayer->AddNode(voFrame, iMod, incline_mod[0]);  // add spacer
+      volayer->AddNode(voRPCFront, iMod, incline_mod[1]); //Rpc Glass In
+      volayer->AddNode(voRPCback, iMod, incline_mod[2]); //Rpc Glass Out 
+     
+      volayer->AddNode(voDrift[0], iMod, incline_mod[3]); //Drift In
+      volayer->AddNode(voDrift[1], iMod, incline_mod[4]); //Drift Out
+      volayer->AddNode(voG10[0], iMod, incline_mod[5]); //G10 In
+      volayer->AddNode(voG10[1], iMod, incline_mod[6]); //G10 Out
+     // volayer->AddNode(voCool, iMod, incline_mod[7]); // Al Cooling Plate  
+
+      TVector3 Position;
+      Position.SetXYZ(pos[0], pos[1], pos[2]);
+      cout << pos[2] << "   " << pos[3] << "   " << pos[4] << "   " << pos[5] << "   " << pos[6] << "   " << pos[7]
+           << endl;
+     muchLySd->AddModule(new CbmMuchModuleGemRadial(fDetType[istn], istn, ily, iSide, iModule, Position, dx1,
+                                                     dx2,  dy,  dz, muchSt->GetRmin()));
+cout<<"stn: "<<istn<<"   module: "<<iModule<<endl;
+    }
+  }  
+  
+  return volayer;
+
+
+
+
+}
diff --git a/much/much_v22k_mcbm.geo.info b/much/much_v22k_mcbm.geo.info
new file mode 100644
index 00000000..256eb64f
--- /dev/null
+++ b/much/much_v22k_mcbm.geo.info
@@ -0,0 +1,39 @@
+MUCH geometry created with create_MUCH_geometry_v22k_mcbm.C
+
+Build a mMUCH setup for mCBM with 2 GEM.
+10 mm thick Al plates are used for support and cooling in the GEM modules.
+Drift and read-out PCBs (copper coated G10 plates) inserted for realistic material budget for both GEM and RPC modules.
+
+No of Modules: 1      ( GEM )
+Position of Modules Z [cm]: 75.7    
+
+Placement of Modules:
+Module	X [cm]	Y [cm]	
+----------------------
+ 1	7.2	24.53
+----------------------
+
+Al Cooling Plate Thickness [cm]: 1    
+Active Volume Thickness [cm]: 0.3    
+
+
+ GEM Module:
+                7.5 cm
+               .........                 |
+              ...........                |
+             .............               |
+            ...............              |
+           .................             |
+          ...................            |
+         .....................           |
+        .......................         80 cm
+       .........................         |
+      ...........................        |
+     .............................       |
+    ...............................      |
+   .................................     |
+  ...................................    |
+ .....................................   |
+.......................................  |
+                40 cm
+
diff --git a/much/much_v22k_mcbm.geo.root b/much/much_v22k_mcbm.geo.root
new file mode 100644
index 0000000000000000000000000000000000000000..6256dab71a5a7d196bc937c9f13d1da4a5b1643b
GIT binary patch
literal 16972
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
F{|ht!KQ90P

literal 0
HcmV?d00001

-- 
GitLab


From a5c6e8039f830f45772292e4aa482f7adef7af46 Mon Sep 17 00:00:00 2001
From: David Emschermann <d.emschermann@gsi.de>
Date: Wed, 13 Jul 2022 10:23:29 +0200
Subject: [PATCH 3/6] Changes to mTRD geometries for the Ni and Au runs of mCBM
 2022

- Add mTRD 22h
- Correct TRD-2D position in Nickel setup (mTRD 22h), refs #2520
---
 macro/trd/mcbm/Create_TRD_Geometry_v22h.C |   3 +-
 trd/trd_v22h_mcbm.geo.info                | 110 ++++++++++++++++++++++
 trd/trd_v22h_mcbm.geo.root                | Bin 0 -> 17278 bytes
 3 files changed, 112 insertions(+), 1 deletion(-)
 create mode 100644 trd/trd_v22h_mcbm.geo.info
 create mode 100644 trd/trd_v22h_mcbm.geo.root

diff --git a/macro/trd/mcbm/Create_TRD_Geometry_v22h.C b/macro/trd/mcbm/Create_TRD_Geometry_v22h.C
index 97802bdd..e9bcbbc3 100644
--- a/macro/trd/mcbm/Create_TRD_Geometry_v22h.C
+++ b/macro/trd/mcbm/Create_TRD_Geometry_v22h.C
@@ -3233,7 +3233,8 @@ void create_detector_layers(Int_t layerId)
     xPos = 0;
     yPos = 0;
     //    xPos = xPos - 35.5;
-    zPos = -2.0;
+    //    zPos = -2.0;
+    zPos = -20.0;
   }
   if (layerId == 1) {
     xPos = xPos - 22.5;
diff --git a/trd/trd_v22h_mcbm.geo.info b/trd/trd_v22h_mcbm.geo.info
new file mode 100644
index 00000000..1374039d
--- /dev/null
+++ b/trd/trd_v22h_mcbm.geo.info
@@ -0,0 +1,110 @@
+#
+##   trd_v22h_mcbm information file
+#
+
+# created 20220524
+
+# envelope
+0.000000 cm   start of TRD (z)
+81.000000 cm   end   of TRD (z)
+
+# thickness
+27.000000 cm   per single layer (z)
+
+# extra gaps
+ 0.000000 0.000000 0.000000    extra gaps in z (cm)
+
+# generated TRD layers
+  1  2  3    planeID
+
+# dimensions in x
+-206.500000 cm to 206.500000 cm x-dimension of layer  1
+-332.500000 cm to 332.500000 cm x-dimension of layer  2
+-332.500000 cm to 332.500000 cm x-dimension of layer  3
+
+# dimensions in y
+-152.000000 cm to 152.000000 cm y-dimension of layer  1
+-237.500000 cm to 237.500000 cm y-dimension of layer  2
+-237.500000 cm to 237.500000 cm y-dimension of layer  3
+
+# z-positions of layer front
+0.000000 cm   z-position of layer  1
+27.000000 cm   z-position of layer  2
+54.000000 cm   z-position of layer  3
+
+# flags
+support structure is    : NOT included
+radiator is             : NOT included
+lattice grid is         : included
+kapton window is        : included
+gas frame is            : included
+padplane is             : included
+backpanel is            : included
+Aluminium ledge is      : included
+Gibbet support is       : included
+Power bus bars are      : NOT included
+asics are               : included
+front-end boards are    : included
+GBTX readout boards are : included
+
+# modules
+     mod1     mod2     mod3     mod4     mod5     mod6     mod7     mod8     mod9     mod10    total
+---------------------------------------------------------------------------------
+        0        0        0        0        0        0        0        0        1        0            layer  1
+        0        0        0        0        0        0        0        1        0        0            layer  2
+        0        0        0        0        0        0        0        1        0        0            layer  3
+
+---------------------------------------------------------------------------------
+        0        0        0        0        0        0        0        2        1        0        3   number of modules
+# febs
+        9s       5s       6s      18       12        8        4        3       18       18            FEBs per module
+                                                                                                  0   ultimate  FEBs
+        0s       0s       0s                                                                      0   super     FEBs
+                                            0        0        0        6                          6   regular   FEBs
+        0        0        0        0        0        0        0        6       18        0       24   number of FEBs
+# asics
+       10       10       10       10        8        8        8        8       10       10            ASICs per FEB
+       90       50       60      180       96       64       32       24      180      180            ASICs per module
+        0        0        0        0        0        0        0       48      180        0      228   number of ASICs
+# gbtx
+       15       10        5       18        0       10        5        3       18       18            GBTXs per module
+        0        0        0        0        0        0        0        6       18        0       24   number of GBTXs
+      555       55        5   333333        0       55        5        3   333333   333333            GBTX ROB types on module
+        0        0        0        0        0        0        0        0        0        0        0   number of GBTX ROB7
+        0        0        0        0        0        0        0        0        0        0        0   number of GBTX ROB5
+        0        0        0        0        0        0        0        2        6        0        8   number of GBTX ROB3
+# e-links
+      180      100      120      360      192      128       64       48      360      360      456   e-links used
+      210      140       70      252        0      140       70       42      252      252      336   e-links available
+        -        -        -        -        -        -        -   114.3%   142.9%        -   135.7%   e-link efficiency
+
+# channels
+     1440      800      960     2880     3072     2048     1024      768     2880     2880            channels per module
+      160      160      160      160      256      256      256      256      160      160            channels per feb
+        0        0        0        0        0        0        0     1536     2880        0     4416   channels used
+        0s       0s       0s       0F       0        0        0     1536     2880F       0F    7296   channels available
+    39.5%u    0.0%s   21.1%r                                                        channel ratio
+
+    60.5%   channel efficiency
+
+   2.71 m2      total surface    
+   2.54 m2      total active area
+   0.03 m3      total gas volume 
+   5.75 cm2/ch  average channel size
+1739.13 ch/m2   channels per m2 active area
+
+# gas volume position
+    1.6000 cm   position of gas volume - layer  1
+   28.6000 cm   position of gas volume - layer  2
+   55.6000 cm   position of gas volume - layer  3
+
+# angles of acceptance
+v: 89.16 deg, h: 89.38 deg - vertical/horizontal - layer  1
+v: 82.99 deg, h: 84.98 deg - vertical/horizontal - layer  2
+v: 76.68 deg, h: 80.40 deg - vertical/horizontal - layer  3
+
+# inner aperture
+v: 85.54 deg, h: 85.54 deg - vertical/horizontal - layer  1
+v: 44.28 deg, h: 44.28 deg - vertical/horizontal - layer  2
+v: 26.88 deg, h: 26.88 deg - vertical/horizontal - layer  3
+
diff --git a/trd/trd_v22h_mcbm.geo.root b/trd/trd_v22h_mcbm.geo.root
new file mode 100644
index 0000000000000000000000000000000000000000..2d0132ae27424fd5cd592d869e308632e9ed1993
GIT binary patch
literal 17278
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

literal 0
HcmV?d00001

-- 
GitLab


From deb6bcbbce6a751567f0d6c3a6ed9e0feb4d7f48 Mon Sep 17 00:00:00 2001
From: David Emschermann <d.emschermann@gsi.de>
Date: Wed, 13 Jul 2022 10:21:57 +0200
Subject: [PATCH 4/6] Changes to mTOF geometries for the Ni and Au runs of mCBM
 2022

- Add TOF v21g, refs #2516
- Use Norberts TOF v21g for Uranium, refs #2483
- Add TOF v21h derived from Norberts TOF v21g, refs #2516
- Move mTOF in x by -0.5 cm in 21h, refs #2520
---
 .../tof/mcbm/Create_TOF_Geometry_v21g_mcbm.C  | 1300 ++++++++++++++++
 .../tof/mcbm/Create_TOF_Geometry_v21h_mcbm.C  | 1301 +++++++++++++++++
 tof/tof_v21e_mcbm.geo.info                    |   15 +
 tof/tof_v21e_mcbm.geo.root                    |  Bin 0 -> 14207 bytes
 tof/tof_v21g_mcbm.geo.info                    |   15 +
 tof/tof_v21g_mcbm.geo.root                    |  Bin 0 -> 14326 bytes
 tof/tof_v21h_mcbm.geo.info                    |   15 +
 tof/tof_v21h_mcbm.geo.root                    |  Bin 0 -> 14333 bytes
 8 files changed, 2646 insertions(+)
 create mode 100644 macro/tof/mcbm/Create_TOF_Geometry_v21g_mcbm.C
 create mode 100644 macro/tof/mcbm/Create_TOF_Geometry_v21h_mcbm.C
 create mode 100644 tof/tof_v21e_mcbm.geo.info
 create mode 100644 tof/tof_v21e_mcbm.geo.root
 create mode 100644 tof/tof_v21g_mcbm.geo.info
 create mode 100644 tof/tof_v21g_mcbm.geo.root
 create mode 100644 tof/tof_v21h_mcbm.geo.info
 create mode 100644 tof/tof_v21h_mcbm.geo.root

diff --git a/macro/tof/mcbm/Create_TOF_Geometry_v21g_mcbm.C b/macro/tof/mcbm/Create_TOF_Geometry_v21g_mcbm.C
new file mode 100644
index 00000000..cfd6b183
--- /dev/null
+++ b/macro/tof/mcbm/Create_TOF_Geometry_v21g_mcbm.C
@@ -0,0 +1,1300 @@
+/* Copyright (C) 2020 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Florian Uhlig [committer] */
+///
+/// \file Create_TOF_Geometry_v21g_mcbm.C
+/// \brief Generates TOF geometry in Root format.
+///
+
+// clang-format off
+
+// Changelog
+//
+// 2022-04-10 - v21g - NH - setup for U-run, March 2022
+// 2022-03-23 - v21f - DE - apply global rotation of TOF around target _after_ z-shift
+// 2022-03-19 - v21f - ID - Setup for Iron run of March 22nd
+// 2021-05-24 - v21n - NH - add M6 module
+// 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_v21g_mcbm";  // do not change
+const TString geoVersionStand = geoVersion + "Stand";
+//
+const TString fileTag      = "tof_v21g";
+const TString FileNameSim  = fileTag + "_mcbm.geo.root";
+const TString FileNameGeo  = fileTag + "_mcbm_geo.root";
+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 = 247.;  // = z=298 mCBM@SIS18
+const Float_t TOF_X_Front_Stand = 0.;    // = z=298 mCBM@SIS18
+const Float_t TOF_Z_Front       = 0.;    // = z=298 mCBM@SIS18
+//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, 8, 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., 12., 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, 1, 8, 2};
+const Int_t NCounterInModule[NofModuleTypes]    = {5, 5, 5, 5, 5, 1, 2, 2, 1, 2};
+
+// Placement of the counter inside the module
+const Float_t CounterXStartPosition[NofModuleTypes] = {-60.1, -66.0, -67.0, -60.0, -60.0, 0.0, 0., 0., 0., 0.};
+const Float_t CounterXDistance[NofModuleTypes]      = {29.3, 32.0, 29.8, 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.5, 0.0, 0.0, 2.5, 2.5, 0., 6., 4., 0.1, 4.};
+const Float_t CounterZStartPosition[NofModuleTypes] = {0.0, 0.0, 0.0, 0.0, 0.0, 0., -3., -2., 0.0, -2.};
+const Float_t CounterRotationAngle[NofModuleTypes]  = {0., 8.7, 7.0, 0., 0., 0., 0., 0., 0., 0.};
+const Float_t CounterRotationAngleZ[NofModuleTypes] = {0., 0., 0.0, 0., 0., 0., 0., 90., 0., 0.};
+
+// 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 + 15.7 + 16.7;
+const Float_t Star2_Delta_Z_Position       = 16.3;
+const Float_t Star2_First_Y_Position       = 31.35;  //
+const Float_t Star2_Delta_Y_Position       = 0.;     //
+const Int_t Star2_NTypes                   = 1;
+const Float_t Star2_rotate_Z[Star2_NTypes] = {-90.};
+const Float_t Star2_Types[Star2_NTypes]    = {9.};
+const Float_t Star2_Number[Star2_NTypes]   = {1.};  //debugging, V16b
+const Float_t Star2_X_Offset[Star2_NTypes] = {0.};  //{51.};
+
+const Float_t Buc_First_Z_Position     = TOF_Z_Front + 16.5 + 4.;  //put 600 to position of 601
+const Float_t Buc_Delta_Z_Position     = 0.;
+const Float_t Buc_First_Y_Position     = -27.5;  //
+const Float_t Buc_Delta_Y_Position     = 0.;     //
+const Float_t Buc_rotate_Y             = 180.;
+const Float_t Buc_rotate_Z             = 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] = {-5.};
+
+const Int_t Cer_NTypes                   = 2;
+const Float_t Cer_Z_Position[Cer_NTypes] = {(float) (TOF_Z_Front + 46.), (float) (TOF_Z_Front + 47.1)};
+const Float_t Cer_X_Position[Cer_NTypes] = {1., 1.};
+const Float_t Cer_Y_Position[Cer_NTypes] = {-29., -29.};
+const Float_t Cer_rotate_Z[Cer_NTypes]   = {0., 0.};
+const Float_t Cer_Types[Cer_NTypes]      = {8., 8.};
+const Float_t Cer_Number[Cer_NTypes]     = {1., 1.};  
+
+const Float_t Testbox_MRPC4_Z_Position          = TOF_Z_Front + 15.7;  // 20 gap
+const Float_t Testbox_MRPC4_First_Y_Position    = 34.;
+const Float_t Testbox_MRPC4_X_Offset            = 0.;  //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.2 - 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_v21g_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, 0., 0.);
+  TGeoTranslation* stand_trans       = new TGeoTranslation("", 0., 0., TOF_Z_Front_Stand);
+  TGeoCombiTrans* stand_combi_trans  = new TGeoCombiTrans(*stand_trans, *tof_rotation);
+
+  // Nov 2019 run
+  // TGeoTranslation*  stand_trans   = new TGeoTranslation("", 12., 0., TOF_Z_Front_Stand);
+  // TGeoTranslation*  stand_trans   = new TGeoTranslation("",  0., 0., TOF_Z_Front_Stand);
+  TGeoRotation* stand_rot = new TGeoRotation();
+  stand_rot->RotateY(0.);
+  //stand_rot->RotateY(1.0);
+  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(3);
+  position_Dia(1);
+  position_Star2(1);
+  position_cer_modules(2);
+  position_Testbox_MRPC4(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();
+
+  // create medialist for this geometry
+  TString createmedialist = gSystem->Getenv("VMCWORKDIR");
+  createmedialist += "/macro/geometry/create_medialist.C";
+  std::cout << "Loading macro " << createmedialist << std::endl;
+  gROOT->LoadMacro(createmedialist);
+  gROOT->ProcessLine("create_medialist(\"\", false)");
+  
+  /*
+  TFile* outfile1 = new TFile(FileNameSim,"RECREATE");
+  top->Write();
+  //gGeoMan->Write();
+  outfile1->Close();
+*/
+  //tof->RemoveNode((TGeoNode*)tofstand);
+  //top->AddNode(tof, 1, tof_rotation);
+  //tof->ReplaceNode((TGeoNode*)tofstand, 0, stand_combi_trans);
+  /*
+  CbmTransport run;
+  run.SetGeoFileName(FileNameGeo);
+  run.LoadSetup("setup_mcbm_tof_2020");
+  run.SetField(new CbmFieldConst());
+*/
+  //top->Export(FileNameGeo);
+
+  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;
+
+  // for (Int_t j=0; j<modNType; j++){
+  // for (Int_t j=1; j<modNType; j++){
+  Int_t modType;
+  Int_t modNum[4] = {4 * 0};
+
+  // May2021 setup
+  const Int_t NModules           = 6;
+  Double_t xPos                  = 0.;
+  Double_t yPos                  = 0.;
+  Double_t zPos                  = TOF_Z_Front;
+  const Int_t ModType[NModules]  = {0, 0, 0, 0, 0, 2};
+  const Double_t ModDx[NModules] = {-53.5, -57., -57.7, 0., 0., -66.};
+  //const Double_t ModDx[NModules] = {-53.5, -57.3, -66.8, 0., 0., -64.};
+  //const Double_t ModDx[NModules] = {-53.5, -57., -72.7, 0., -21.5, -64.};
+  //const Double_t ModDx[NModules] = {-53.5, -57., -57.7, 0., -21.5, -64.};
+  //const Double_t ModDx[NModules] = {-53.5, -57., -75.7, 0., -21., -66.};
+  //const Double_t ModDx[NModules] = { 1.5,    0., -1.5, 49.8, 55.8};
+  const Double_t ModDy[NModules]     = {0., 0., 0., 0., 0., -6.};
+  const Double_t ModDz[NModules]     = {0., 16.5, 59., 0., 59.5, 34.};  // regular
+  const Double_t ModAng[NModules]    = {-90., -90., -90., -90., -90.0, -90.};
+  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);
+    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]]++;
+  }
+
+}
+
+
+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 = 0; 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/macro/tof/mcbm/Create_TOF_Geometry_v21h_mcbm.C b/macro/tof/mcbm/Create_TOF_Geometry_v21h_mcbm.C
new file mode 100644
index 00000000..8e560835
--- /dev/null
+++ b/macro/tof/mcbm/Create_TOF_Geometry_v21h_mcbm.C
@@ -0,0 +1,1301 @@
+/* Copyright (C) 2020 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Florian Uhlig [committer] */
+///
+/// \file Create_TOF_Geometry_v21h_mcbm.C
+/// \brief Generates TOF geometry in Root format.
+///
+
+// clang-format off
+
+// Changelog
+//
+// 2022-05-07 - v21h - DE - shift v21g by x += 53.5 cm to align triple stack on z-axis
+// 2022-04-10 - v21g - NH - setup for U-run, March 2022
+// 2022-03-23 - v21f - DE - apply global rotation of TOF around target _after_ z-shift
+// 2022-03-19 - v21f - ID - Setup for Iron run of March 22nd
+// 2021-05-24 - v21n - NH - add M6 module
+// 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_v21h_mcbm";  // do not change
+const TString geoVersionStand = geoVersion + "Stand";
+//
+const TString fileTag      = "tof_v21h";
+const TString FileNameSim  = fileTag + "_mcbm.geo.root";
+const TString FileNameGeo  = fileTag + "_mcbm_geo.root";
+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 = 247.;  // = z=298 mCBM@SIS18
+const Float_t TOF_X_Front_Stand = 53.5;  // = z=298 mCBM@SIS18
+const Float_t TOF_Z_Front       = 0.;    // = z=298 mCBM@SIS18
+//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, 8, 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., 12., 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, 1, 8, 2};
+const Int_t NCounterInModule[NofModuleTypes]    = {5, 5, 5, 5, 5, 1, 2, 2, 1, 2};
+
+// Placement of the counter inside the module
+const Float_t CounterXStartPosition[NofModuleTypes] = {-60.1, -66.0, -67.0, -60.0, -60.0, 0.0, 0., 0., 0., 0.};
+const Float_t CounterXDistance[NofModuleTypes]      = {29.3, 32.0, 29.8, 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.5, 0.0, 0.0, 2.5, 2.5, 0., 6., 4., 0.1, 4.};
+const Float_t CounterZStartPosition[NofModuleTypes] = {0.0, 0.0, 0.0, 0.0, 0.0, 0., -3., -2., 0.0, -2.};
+const Float_t CounterRotationAngle[NofModuleTypes]  = {0., 8.7, 7.0, 0., 0., 0., 0., 0., 0., 0.};
+const Float_t CounterRotationAngleZ[NofModuleTypes] = {0., 0., 0.0, 0., 0., 0., 0., 90., 0., 0.};
+
+// 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 + 15.7 + 16.7;
+const Float_t Star2_Delta_Z_Position       = 16.3;
+const Float_t Star2_First_Y_Position       = 31.35;  //
+const Float_t Star2_Delta_Y_Position       = 0.;     //
+const Int_t Star2_NTypes                   = 1;
+const Float_t Star2_rotate_Z[Star2_NTypes] = {-90.};
+const Float_t Star2_Types[Star2_NTypes]    = {9.};
+const Float_t Star2_Number[Star2_NTypes]   = {1.};  //debugging, V16b
+const Float_t Star2_X_Offset[Star2_NTypes] = {0.};  //{51.};
+
+const Float_t Buc_First_Z_Position     = TOF_Z_Front + 16.5 + 4.;  //put 600 to position of 601
+const Float_t Buc_Delta_Z_Position     = 0.;
+const Float_t Buc_First_Y_Position     = -27.5;  //
+const Float_t Buc_Delta_Y_Position     = 0.;     //
+const Float_t Buc_rotate_Y             = 180.;
+const Float_t Buc_rotate_Z             = 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] = {-5.};
+
+const Int_t Cer_NTypes                   = 2;
+const Float_t Cer_Z_Position[Cer_NTypes] = {(float) (TOF_Z_Front + 46.), (float) (TOF_Z_Front + 47.1)};
+const Float_t Cer_X_Position[Cer_NTypes] = {1., 1.};
+const Float_t Cer_Y_Position[Cer_NTypes] = {-29., -29.};
+const Float_t Cer_rotate_Z[Cer_NTypes]   = {0., 0.};
+const Float_t Cer_Types[Cer_NTypes]      = {8., 8.};
+const Float_t Cer_Number[Cer_NTypes]     = {1., 1.};  
+
+const Float_t Testbox_MRPC4_Z_Position          = TOF_Z_Front + 15.7;  // 20 gap
+const Float_t Testbox_MRPC4_First_Y_Position    = 34.;
+const Float_t Testbox_MRPC4_X_Offset            = 0.;  //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.2 - 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_v21h_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, 0., 0.);
+  TGeoTranslation* stand_trans       = new TGeoTranslation("", 0., 0., TOF_Z_Front_Stand);
+  TGeoCombiTrans* stand_combi_trans  = new TGeoCombiTrans(*stand_trans, *tof_rotation);
+
+  // Nov 2019 run
+  // TGeoTranslation*  stand_trans   = new TGeoTranslation("", 12., 0., TOF_Z_Front_Stand);
+  // TGeoTranslation*  stand_trans   = new TGeoTranslation("",  0., 0., TOF_Z_Front_Stand);
+  TGeoRotation* stand_rot = new TGeoRotation();
+  stand_rot->RotateY(0.);
+  //stand_rot->RotateY(1.0);
+  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(3);
+  position_Dia(1);
+  position_Star2(1);
+  position_cer_modules(2);
+  position_Testbox_MRPC4(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();
+
+  // create medialist for this geometry
+  TString createmedialist = gSystem->Getenv("VMCWORKDIR");
+  createmedialist += "/macro/geometry/create_medialist.C";
+  std::cout << "Loading macro " << createmedialist << std::endl;
+  gROOT->LoadMacro(createmedialist);
+  gROOT->ProcessLine("create_medialist(\"\", false)");
+  
+  /*
+  TFile* outfile1 = new TFile(FileNameSim,"RECREATE");
+  top->Write();
+  //gGeoMan->Write();
+  outfile1->Close();
+*/
+  //tof->RemoveNode((TGeoNode*)tofstand);
+  //top->AddNode(tof, 1, tof_rotation);
+  //tof->ReplaceNode((TGeoNode*)tofstand, 0, stand_combi_trans);
+  /*
+  CbmTransport run;
+  run.SetGeoFileName(FileNameGeo);
+  run.LoadSetup("setup_mcbm_tof_2020");
+  run.SetField(new CbmFieldConst());
+*/
+  //top->Export(FileNameGeo);
+
+  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;
+
+  // for (Int_t j=0; j<modNType; j++){
+  // for (Int_t j=1; j<modNType; j++){
+  Int_t modType;
+  Int_t modNum[4] = {4 * 0};
+
+  // May2021 setup
+  const Int_t NModules           = 6;
+  Double_t xPos                  = 0.;
+  Double_t yPos                  = 0.;
+  Double_t zPos                  = TOF_Z_Front;
+  const Int_t ModType[NModules]  = {0, 0, 0, 0, 0, 2};
+  const Double_t ModDx[NModules] = {-53.5, -57., -57.7, 0., 0., -66.};
+  //const Double_t ModDx[NModules] = {-53.5, -57.3, -66.8, 0., 0., -64.};
+  //const Double_t ModDx[NModules] = {-53.5, -57., -72.7, 0., -21.5, -64.};
+  //const Double_t ModDx[NModules] = {-53.5, -57., -57.7, 0., -21.5, -64.};
+  //const Double_t ModDx[NModules] = {-53.5, -57., -75.7, 0., -21., -66.};
+  //const Double_t ModDx[NModules] = { 1.5,    0., -1.5, 49.8, 55.8};
+  const Double_t ModDy[NModules]     = {0., 0., 0., 0., 0., -6.};
+  const Double_t ModDz[NModules]     = {0., 16.5, 59., 0., 59.5, 34.};  // regular
+  const Double_t ModAng[NModules]    = {-90., -90., -90., -90., -90.0, -90.};
+  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);
+    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]]++;
+  }
+
+}
+
+
+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 = 0; 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_v21e_mcbm.geo.info b/tof/tof_v21e_mcbm.geo.info
new file mode 100644
index 00000000..b0ad1509
--- /dev/null
+++ b/tof/tof_v21e_mcbm.geo.info
@@ -0,0 +1,15 @@
+#
+##   tof_v21e_mcbm information file
+#
+
+# created 20220504
+
+# 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_v21e_mcbm.geo.root b/tof/tof_v21e_mcbm.geo.root
new file mode 100644
index 0000000000000000000000000000000000000000..e3e498a699ff2f9b73f7d8a714eb177fbcf6dd8b
GIT binary patch
literal 14207
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

literal 0
HcmV?d00001

diff --git a/tof/tof_v21g_mcbm.geo.info b/tof/tof_v21g_mcbm.geo.info
new file mode 100644
index 00000000..9578c495
--- /dev/null
+++ b/tof/tof_v21g_mcbm.geo.info
@@ -0,0 +1,15 @@
+#
+##   tof_v21g_mcbm information file
+#
+
+# created 20220507
+
+# 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_v21g_mcbm.geo.root b/tof/tof_v21g_mcbm.geo.root
new file mode 100644
index 0000000000000000000000000000000000000000..4205e28149d11dbcd847ffb9e144dc7c417e0e5f
GIT binary patch
literal 14326
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

literal 0
HcmV?d00001

diff --git a/tof/tof_v21h_mcbm.geo.info b/tof/tof_v21h_mcbm.geo.info
new file mode 100644
index 00000000..039bf453
--- /dev/null
+++ b/tof/tof_v21h_mcbm.geo.info
@@ -0,0 +1,15 @@
+#
+##   tof_v21h_mcbm information file
+#
+
+# created 20220523
+
+# 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_v21h_mcbm.geo.root b/tof/tof_v21h_mcbm.geo.root
new file mode 100644
index 0000000000000000000000000000000000000000..39bc35213febffdb2c4370a82a199c15ef6e9bb7
GIT binary patch
literal 14333
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
TosX4w|NmF10W<th@9F;nVe-5s

literal 0
HcmV?d00001

-- 
GitLab


From 96307da12b1d2d7aa0074524ececd6f153b9e150 Mon Sep 17 00:00:00 2001
From: "d.emschermann" <d.emschermann@gsi.de>
Date: Mon, 23 May 2022 20:08:07 +0200
Subject: [PATCH 5/6] Place RICH orthogonal to and on the z-axis, refs #2520

---
 macro/rich/mcbm/create_rich_v21c_mcbm.C | 376 ++++++++++++++++++++++++
 rich/rich_v21c_mcbm.geo.root            | Bin 0 -> 15132 bytes
 2 files changed, 376 insertions(+)
 create mode 100644 macro/rich/mcbm/create_rich_v21c_mcbm.C
 create mode 100644 rich/rich_v21c_mcbm.geo.root

diff --git a/macro/rich/mcbm/create_rich_v21c_mcbm.C b/macro/rich/mcbm/create_rich_v21c_mcbm.C
new file mode 100644
index 00000000..b1860403
--- /dev/null
+++ b/macro/rich/mcbm/create_rich_v21c_mcbm.C
@@ -0,0 +1,376 @@
+/* Copyright (C) 2020-2022 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Florian Uhlig, David Emschermann [committer] */
+
+// clang-format off
+
+#include <iostream>
+//#include "FairGeoMedium.h"
+//#include "FairGeoBuilder.h"
+//#include "FairGeoMedia.h"
+#include "TGeoManager.h"
+#include "TGeoVolume.h"
+
+using namespace std;
+
+// Changelog
+
+// 2022-05-23 - v21c - DE - Based on v21b, rotate RICH orthogonal to the z-axis
+// 2022-03-08 - v21b - DE - Based on v21a, relocate RICH along the rail onto the 25 degree line by -20 cm
+// 2021-09-28 - v21a - SR - Based on v20d, moved RICH according to the TOF v21d
+// 2020-05-25 - v20d - AW - Move mRICH by +7.2cm in Z accordingly to the mTOF movement from rev 16441
+// 2020-05-20 - v20d - AW - changed positioning to +2.5cm to 25°line (nearer to beam axis) (from Analysis)
+// 2020-05-06 - v20b - AW - changed positioning to center on 25° line (without Window)
+// 2020-04-02 - v19a - FU - same as v19c but with exported geometry in output file
+// 2019-11-28 - v19c - DE - move mRICH +12+7 cm in x direction (same as mTOF v19b) for the Nov 2019 run
+// 2017-11-17 - v18d - DE - add aerogel as radiator to the mRICH module
+// 2017-11-12 - v18c - DE - push mRICH downstream to z=355 cm for long setup
+// 2017-07-19 - v18b - DE - add one level to the geometry hierarchy
+// 2017-07-15 - v18b - DE - arrange 4x mRICH detectors in the setup and tilt towards target
+
+
+void create_rich_v21c_mcbm()
+{
+  gSystem->Load("libGeom");
+
+  // Load FairRunSim to ensure the correct unit system
+  FairRunSim* sim = new FairRunSim();
+
+  TString geoFileName = "rich_v21c_mcbm.geo.root";
+  TString topNodeName = "rich_v21c_mcbm";
+
+  // displace RICH module along the rails on the TOF frame
+  Double_t XOffset = 0;
+  Double_t ZOffset = -9;
+
+  Double_t displacement_along_rails     = -23.5; // cm for Nickel-58 run
+  Double_t support_frame_rotation_angle = 0; //  12.5; // degrees
+
+  XOffset += +displacement_along_rails *cos( support_frame_rotation_angle * acos(-1)/180 );
+  ZOffset += -displacement_along_rails *sin( support_frame_rotation_angle * acos(-1)/180 );
+  // end of displacement along the rails
+  
+  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();
+  TGeoManager* gGeoMan = gGeoManager;
+
+  FairGeoMedia* geoMedia   = geoFace->getMedia();
+  FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
+
+  //Media
+  FairGeoMedium* mAluminium = geoMedia->getMedium("aluminium");
+  if (mAluminium == NULL) Fatal("Main", "FairMedium aluminium not found");
+  geoBuild->createMedium(mAluminium);
+  TGeoMedium* medAl = gGeoMan->GetMedium("aluminium");
+  if (medAl == NULL) Fatal("Main", "Medium vacuum not found");
+
+  FairGeoMedium* mKapton = geoMedia->getMedium("kapton");
+  if (mKapton == NULL) Fatal("Main", "FairMedium kapton not found");
+  geoBuild->createMedium(mKapton);
+  TGeoMedium* medKapton = gGeoMan->GetMedium("kapton");
+  if (medKapton == NULL) Fatal("Main", "Medium kapton not found");
+
+  FairGeoMedium* mAir = geoMedia->getMedium("air");
+  if (mAir == NULL) Fatal("Main", "FairMedium air not found");
+  geoBuild->createMedium(mAir);
+  TGeoMedium* medAir = gGeoMan->GetMedium("air");
+  if (medAir == NULL) Fatal("Main", "Medium air not found");
+
+  FairGeoMedium* mPmtGlas = geoMedia->getMedium("PMTglass");
+  if (mPmtGlas == NULL) Fatal("Main", "FairMedium vacuum not found");
+  geoBuild->createMedium(mPmtGlas);
+  TGeoMedium* medPmtGlas = gGeoMan->GetMedium("PMTglass");
+  if (medPmtGlas == NULL) Fatal("Main", "Medium vacuum not found");
+
+  FairGeoMedium* mNitrogen = geoMedia->getMedium("RICHgas_N2_dis");
+  if (mNitrogen == NULL) Fatal("Main", "FairMedium RICHgas_N2_dis not found");
+  geoBuild->createMedium(mNitrogen);
+  TGeoMedium* medNitrogen = gGeoMan->GetMedium("RICHgas_N2_dis");
+  if (medNitrogen == NULL) Fatal("Main", "Medium RICHgas_N2_dis not found");
+
+  FairGeoMedium* mPMT = geoMedia->getMedium("CsI");
+  if (mPMT == NULL) Fatal("Main", "FairMedium CsI not found");
+  geoBuild->createMedium(mPMT);
+  TGeoMedium* medCsI = gGeoMan->GetMedium("CsI");
+  if (medCsI == NULL) Fatal("Main", "Medium CsI not found");
+
+  FairGeoMedium* mElectronic = geoMedia->getMedium("air");
+  if (mElectronic == NULL) Fatal("Main", "FairMedium air not found");
+  geoBuild->createMedium(mElectronic);
+  TGeoMedium* medElectronic = gGeoMan->GetMedium("air");
+  if (medElectronic == NULL) Fatal("Main", "Medium air not found");
+
+  FairGeoMedium* mAerogel = geoMedia->getMedium("aerogel");
+  if (mAerogel == NULL) Fatal("Main", "FairMedium aerogel not found");
+  geoBuild->createMedium(mAerogel);
+  TGeoMedium* medAerogel = gGeoMan->GetMedium("aerogel");
+  if (medAerogel == NULL) Fatal("Main", "Medium aerogel  not found");
+
+
+  //Dimensions of the RICH prototype [cm]
+
+  const Double_t ItemToKapton = 1.85;
+
+  // Box
+  const Double_t boxThickness      = 0.3;
+  const Double_t boxBackThickness  = 1.;
+  const Double_t boxFrontThickness = 0.3;
+  const Double_t boxXLen           = 38.2;
+  const Double_t boxYLen           = 59.7;
+  const Double_t boxZLen           = 25. + boxBackThickness - ItemToKapton;
+  const Bool_t isRotate90DegZ      = false;
+
+  // PMT
+  // PMT specs https://www.hamamatsu.com/resources/pdf/etd/H12700_TPMH1348E.pdf
+  const Double_t pmtNofPixels          = 8;
+  const Double_t pmtSize               = 5.2;
+  const Double_t pmtSizeHalf           = pmtSize / 2.;
+  const Double_t pmtSensitiveSize      = 4.85;
+  const Double_t pmtPixelSize          = 0.6;  //pmtSensitiveSize / pmtNofPixels;
+  const Double_t pmtPixelSizeHalf      = pmtPixelSize / 2.;
+  const Double_t pmtOuterPixelSize     = 0.625;  //pmtSensitiveSize / pmtNofPixels;
+  const Double_t pmtOuterPixelSizeHalf = pmtOuterPixelSize / 2.;
+  const Double_t pmtGap                = 0.1;
+  const Double_t pmtGapHalf            = pmtGap / 2.;
+  const Double_t pmtMatrixGap          = 0.1;
+  const Double_t pmtPixelThickness     = 0.1;
+  const Double_t pmtWindowThickness    = 0.00;  //0.15
+  Double_t pmtWindowPixelDistance      = 0.0;
+  if (pmtWindowThickness > 0.0) pmtWindowPixelDistance = 0.0;
+  const Double_t pmtThickness = pmtPixelThickness + pmtWindowThickness + pmtWindowPixelDistance;
+  const Double_t pmtZPadding  = 3.871;
+  const Double_t pmtXShift    = 2.5;
+
+  // Electronics
+  const Double_t elecLength = 10.;
+  const Double_t elecWidth  = 3. * pmtSize;
+  const Double_t elecHeight = 2. * pmtSize;
+
+  // Aerogel Box
+  const Double_t aerogelXLen        = 20.;
+  const Double_t aerogelYLen        = 20.;
+  const Double_t aerogelZLen        = 3.;
+  const Double_t aerogelPmtDistance = 10.;
+  const Double_t aerogelGap         = 0.1;
+
+  // Imaginary sensitive plane
+  Bool_t isIncludeSensPlane           = false;
+  const Double_t sensPlaneSize        = 200.;
+  const Double_t sensPlaneBoxDistance = 1.;
+
+  //Global positioning
+  const Double_t boxFrontToTarget = 334.2 + ItemToKapton + boxZLen / 2;
+
+  // Create the top volume
+  TGeoVolume* top = new TGeoVolumeAssembly("top");
+  gGeoMan->SetTopVolume(top);
+
+  // Rich assembly
+  TGeoVolume* rich = new TGeoVolumeAssembly(topNodeName);
+  top->AddNode(rich, 1);
+
+  // Al box
+  TGeoRotation* rotBox  = new TGeoRotation("rotBox", 0., 0., 0.);
+  TGeoCombiTrans* trBox = NULL;
+  if (isRotate90DegZ) {
+    rotBox->RotateZ(90.);
+    rotBox->RotateY(0.955);  //Tilting of Rich
+    trBox = new TGeoCombiTrans(0, -pmtXShift - (pmtSize + pmtGap + 1), boxFrontToTarget, rotBox);
+  }
+  else {
+    rotBox->RotateX(0.955);  //Tilting of Rich
+    // Nov 2019 run
+    rotBox->RotateY(support_frame_rotation_angle);
+    //trBox = new TGeoCombiTrans(-pmtXShift-(pmtSize + pmtGap + 1)+12.+7., 0, boxFrontToTarget, rotBox);
+    // Mar2020
+    trBox = new TGeoCombiTrans(-pmtXShift - (pmtSize + pmtGap + 1) + 6.3 + XOffset + 16. + 5. + 2.5, 0,
+                               boxFrontToTarget + 27. + ZOffset, rotBox);
+  }
+  TGeoVolume* boxVol = gGeoMan->MakeBox("box", medAl, boxXLen / 2., boxYLen / 2., boxZLen / 2.);
+  //        rich->AddNode(boxVol, 1, trBox);
+  rich->AddNode(boxVol, 1);
+
+  // Gas
+  TGeoVolume* gasVol = gGeoMan->MakeBox("Gas", medNitrogen, boxXLen / 2. - boxThickness, boxYLen / 2. - boxThickness,
+                                        ((boxZLen - boxBackThickness - boxFrontThickness) / 2.));
+  TGeoTranslation* trGas = new TGeoTranslation(0., 0., (-(boxBackThickness - boxFrontThickness) / 2.));
+  boxVol->AddNode(gasVol, 1, trGas);
+
+  // Front plane from kapton
+  TGeoVolume* kaptonVol     = gGeoMan->MakeBox("kapton", medKapton, boxXLen / 2. - boxThickness,
+                                           boxYLen / 2. - boxThickness, boxFrontThickness / 2.);
+  TGeoTranslation* trKapton = new TGeoTranslation(0., 0., -(boxZLen - boxFrontThickness) / 2.);
+  boxVol->AddNode(kaptonVol, 1, trKapton);
+
+
+  // Aerogel
+  TGeoVolume* aerogelVol =
+    gGeoMan->MakeBox("aerogel", medAerogel, aerogelXLen / 2., aerogelYLen / 2., aerogelZLen / 2.);
+  Double_t aerogelZ           = boxZLen / 2. - boxBackThickness - pmtZPadding - aerogelPmtDistance - aerogelZLen / 2.;
+  TGeoTranslation* trAerogel1 = new TGeoTranslation(pmtXShift, (aerogelYLen + aerogelGap) / 2., aerogelZ);
+  TGeoTranslation* trAerogel2 = new TGeoTranslation(pmtXShift, -(aerogelYLen + aerogelGap) / 2., aerogelZ);
+  gasVol->AddNode(aerogelVol, 1, trAerogel1);
+  gasVol->AddNode(aerogelVol, 2, trAerogel2);
+
+  // PMT
+  TGeoTranslation* trPmt1 = new TGeoTranslation(pmtSizeHalf + pmtGapHalf, -pmtSize - pmtGap, 0.);   // Bottom Right
+  TGeoTranslation* trPmt2 = new TGeoTranslation(pmtSizeHalf + pmtGapHalf, 0., 0.);                  // Middle Right
+  TGeoTranslation* trPmt3 = new TGeoTranslation(pmtSizeHalf + pmtGapHalf, pmtSize + pmtGap, 0.);    // Top Right
+  TGeoTranslation* trPmt4 = new TGeoTranslation(-pmtSizeHalf - pmtGapHalf, -pmtSize - pmtGap, 0.);  // Bottom Left
+  TGeoTranslation* trPmt5 = new TGeoTranslation(-pmtSizeHalf - pmtGapHalf, 0., 0.);                 // Middle Left
+  TGeoTranslation* trPmt6 = new TGeoTranslation(-pmtSizeHalf - pmtGapHalf, pmtSize + pmtGap, 0.);   // Top Left
+
+  TGeoVolume* pmtContVol = new TGeoVolumeAssembly("pmt_cont_vol");
+  TGeoVolume* pmtVol     = new TGeoVolumeAssembly("pmt_vol_0");
+  TGeoVolume* pmtVol_180 = new TGeoVolumeAssembly("pmt_vol_1");
+  TGeoVolume* pmtPixelVol =
+    gGeoMan->MakeBox("pmt_pixel", medCsI, pmtPixelSize / 2., pmtPixelSize / 2., pmtPixelThickness / 2.);
+  TGeoVolume* pmtPixelVol_outer_outer =
+    gGeoMan->MakeBox("pmt_pixel", medCsI, pmtOuterPixelSize / 2., pmtOuterPixelSize / 2., pmtPixelThickness / 2.);
+  TGeoVolume* pmtPixelVol_inner_outer =
+    gGeoMan->MakeBox("pmt_pixel", medCsI, pmtPixelSize / 2., pmtOuterPixelSize / 2., pmtPixelThickness / 2.);
+  TGeoVolume* pmtPixelVol_outer_inner =
+    gGeoMan->MakeBox("pmt_pixel", medCsI, pmtOuterPixelSize / 2., pmtPixelSize / 2., pmtPixelThickness / 2.);
+  TGeoVolume* pmtWindow = gGeoMan->MakeBox("pmt_Window", medPmtGlas, pmtSizeHalf, pmtSizeHalf, pmtWindowThickness / 2.);
+
+  pmtContVol->AddNode(pmtVol_180, 1, trPmt1);  // To Power Module    // Bottom Right
+  pmtContVol->AddNode(pmtVol, 2, trPmt2);      // Middle             // Middle Right
+  pmtContVol->AddNode(pmtVol, 3, trPmt3);      // To Combiner        // Top Right
+  pmtContVol->AddNode(pmtVol_180, 4, trPmt4);  // To Power Module    // Bottom Left
+  pmtContVol->AddNode(pmtVol, 5, trPmt5);      // Middle             // Middle Left
+  pmtContVol->AddNode(pmtVol, 6, trPmt6);      // To Combiner        // Top Left
+
+  Int_t halfPmtNofPixels = pmtNofPixels / 2;
+  for (Int_t i = 0; i < pmtNofPixels; i++) {
+    for (Int_t j = 0; j < pmtNofPixels; j++) {
+      //check outer Pixels
+
+      Double_t x   = 0.;
+      Double_t y   = 0.;
+      bool x_outer = false;
+      bool y_outer = false;
+
+      if (i == 0) {
+        x       = -(halfPmtNofPixels - 1) * pmtPixelSize - pmtOuterPixelSizeHalf;
+        x_outer = true;
+      }
+      else if (i == (pmtNofPixels - 1)) {
+        x       = (halfPmtNofPixels - 1) * pmtPixelSize + pmtOuterPixelSizeHalf;
+        x_outer = true;
+      }
+      else if (i < halfPmtNofPixels) {
+        x       = -((halfPmtNofPixels - 1) - i) * pmtPixelSize - pmtPixelSizeHalf;
+        x_outer = false;
+      }
+      else {
+        x       = (i - halfPmtNofPixels) * pmtPixelSize + pmtPixelSizeHalf;
+        x_outer = false;
+      }
+
+
+      if (j == 0) {
+        y       = -(halfPmtNofPixels - 1) * pmtPixelSize - pmtOuterPixelSizeHalf;
+        y_outer = true;
+      }
+      else if (j == (pmtNofPixels - 1)) {
+        y       = (halfPmtNofPixels - 1) * pmtPixelSize + pmtOuterPixelSizeHalf;
+        y_outer = true;
+      }
+      else if (j < halfPmtNofPixels) {
+        y       = -((halfPmtNofPixels - 1) - j) * pmtPixelSize - pmtPixelSizeHalf;
+        y_outer = false;
+      }
+      else {
+        y       = (j - halfPmtNofPixels) * pmtPixelSize + pmtPixelSizeHalf;
+        y_outer = false;
+      }
+      //Double_t x = (i - (halfPmtNofPixels - 1)) * pmtPixelSize - pmtPixelSizeHalf;
+
+      //Double_t y = (j - (halfPmtNofPixels - 1)) * pmtPixelSize - pmtPixelSizeHalf;
+      TGeoTranslation* trij = new TGeoTranslation(x, y, -pmtPixelThickness / 2. + pmtThickness / 2.);
+
+      //normal rotated PMT (HV connector at lower side)
+      uint uid = 18 - ((j % 4) / 2) * 16 - (j % 2) + 2 * i + (1 - (j / 4)) * 100;
+
+      //180?? rotated PMT
+      uint uid_180 = 15 + ((j % 4) / 2) * 16 + (j % 2) - 2 * i + (1 - (j / 4)) * 100;
+      if (x_outer == true && y_outer == true) {
+        pmtVol->AddNode(pmtPixelVol_outer_outer, uid, trij);
+        pmtVol_180->AddNode(pmtPixelVol_outer_outer, uid_180, trij);
+      }
+      else if (x_outer == true && y_outer == false) {
+        pmtVol->AddNode(pmtPixelVol_outer_inner, uid, trij);
+        pmtVol_180->AddNode(pmtPixelVol_outer_inner, uid_180, trij);
+      }
+      else if (x_outer == false && y_outer == true) {
+        pmtVol->AddNode(pmtPixelVol_inner_outer, uid, trij);
+        pmtVol_180->AddNode(pmtPixelVol_inner_outer, uid_180, trij);
+      }
+      else {
+        pmtVol->AddNode(pmtPixelVol, uid, trij);
+        pmtVol_180->AddNode(pmtPixelVol, uid_180, trij);
+      }
+    }
+  }
+
+  TGeoTranslation* trWndw = new TGeoTranslation(0., 0., +pmtWindowThickness / 2. - pmtThickness / 2.);
+  if (pmtWindowThickness > 0.0) {
+    pmtVol->AddNode(pmtWindow, 1, trWndw);
+    pmtVol_180->AddNode(pmtWindow, 1, trWndw);
+  }
+
+  //
+  Double_t pmtContXLen        = 2 * (pmtSize + pmtGap);
+  Double_t pmtContYLen        = 3 * (pmtSize + pmtGap);
+  TGeoTranslation* trPmtCont1 = new TGeoTranslation(-pmtContXLen / 2., pmtContYLen, 0.);   //Top Left
+  TGeoTranslation* trPmtCont2 = new TGeoTranslation(-pmtContXLen / 2., 0., 0.);            //Middle Left
+  TGeoTranslation* trPmtCont3 = new TGeoTranslation(-pmtContXLen / 2., -pmtContYLen, 0.);  //Bottom Left
+  TGeoTranslation* trPmtCont4 = new TGeoTranslation(pmtContXLen / 2., pmtContYLen, 0.);    //
+  TGeoTranslation* trPmtCont5 = new TGeoTranslation(pmtContXLen / 2., 0., 0.);             //
+  TGeoTranslation* trPmtCont6 = new TGeoTranslation(pmtContXLen / 2., -pmtContYLen, 0.);   //
+
+  TGeoVolume* pmtPlaneVol = new TGeoVolumeAssembly("pmt_plane");
+  pmtPlaneVol->AddNode(pmtContVol, 00,
+                       trPmtCont1);  // Id gives the Address 0x7**0 of the top left DiRICH in a BP  (X|Y)
+  pmtPlaneVol->AddNode(pmtContVol, 03, trPmtCont2);
+  pmtPlaneVol->AddNode(pmtContVol, 06, trPmtCont3);
+  pmtPlaneVol->AddNode(pmtContVol, 20, trPmtCont4);
+  pmtPlaneVol->AddNode(pmtContVol, 23, trPmtCont5);
+  pmtPlaneVol->AddNode(pmtContVol, 26, trPmtCont6);
+
+  TGeoTranslation* trPmtPlane =
+    new TGeoTranslation(pmtXShift, 0., boxZLen / 2. - boxBackThickness - pmtZPadding + (pmtThickness / 2.));
+  gasVol->AddNode(pmtPlaneVol, 1, trPmtPlane);
+
+
+  gGeoMan->CheckOverlaps();
+  gGeoMan->PrintOverlaps();
+
+  //Draw
+  pmtPixelVol->SetLineColor(kYellow + 4);
+  aerogelVol->SetLineColor(kCyan);
+  aerogelVol->SetTransparency(70);
+  gasVol->SetLineColor(kGreen);
+  gasVol->SetTransparency(60);
+  kaptonVol->SetLineColor(kBlue);
+  kaptonVol->SetTransparency(70);
+
+
+  //gGeoMan->SetTopVisible();
+  //boxVol->SetVisibility(true);
+
+  //	boxVol->Draw("ogl");
+  //top->Draw("ogl");
+  gGeoMan->SetVisLevel(7);  //7
+
+  rich->Export(geoFileName);  // an alternative way of writing the trd volume
+  TFile* geoFile = new TFile(geoFileName, "UPDATE");
+  trBox->Write();
+  cout << endl << "Geometry exported to " << geoFileName << endl;
+  geoFile->Close();
+}
diff --git a/rich/rich_v21c_mcbm.geo.root b/rich/rich_v21c_mcbm.geo.root
new file mode 100644
index 0000000000000000000000000000000000000000..ad83b749608d743932e8e8d4f96229153a5f9772
GIT binary patch
literal 15132
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

literal 0
HcmV?d00001

-- 
GitLab


From 003019fc36469c3acc09937b19ea03ecf4d69bc8 Mon Sep 17 00:00:00 2001
From: David Emschermann <d.emschermann@gsi.de>
Date: Wed, 13 Jul 2022 10:22:24 +0200
Subject: [PATCH 6/6] Changes to mCBM setups for the Ni and Au runs of mCBM
 2022

- Add setup 2022_08, refs #2516
- Use mTOF v21h in setup 2022_08, refs #2516
- Introduce preliminary Nickel setup for May 2022
- Rename Nickel setup file and use mTOF 21h in it, refs #2520
- Update subsystems in Nickel setup, refs #2520
- Add dedicated setup for Au run of June
---
 setup/setup_mcbm_beam_2022_05_23_nickel.C | 115 ++++++++++++++++++++++
 setup/setup_mcbm_beam_2022_06_16_gold.C   | 115 ++++++++++++++++++++++
 setup/setup_mcbm_beam_2022_08.C           | 101 +++++++++++++++++++
 3 files changed, 331 insertions(+)
 create mode 100644 setup/setup_mcbm_beam_2022_05_23_nickel.C
 create mode 100644 setup/setup_mcbm_beam_2022_06_16_gold.C
 create mode 100644 setup/setup_mcbm_beam_2022_08.C

diff --git a/setup/setup_mcbm_beam_2022_05_23_nickel.C b/setup/setup_mcbm_beam_2022_05_23_nickel.C
new file mode 100644
index 00000000..b52033e2
--- /dev/null
+++ b/setup/setup_mcbm_beam_2022_05_23_nickel.C
@@ -0,0 +1,115 @@
+/** ROOT macro to define the CBM setup sis18_mcbm
+ **
+ ** @author Volker Friese <v.friese@gsi.de>
+ ** @author David Emschermann <d.emschermann@gsi.de>
+ ** @date   5 February 2016
+ **
+ **/
+
+// clang-format off
+
+// 2022-05-24 - DE - prepare setup for mCBM May 2022-05-23 nickel run
+// 2022-05-24 - DE - disable PSD to reduce secondaries (PSD is in parking position)
+// 2022-04-29 - DE - shift MUCH GEM to x = -5 cm
+// 2022-03-27 - DE - place the MUCH RPC behind the TOF stack, while GEMs are in the acceptance
+// 2022-03-27 - DE - place the MUCH RPC behind the TOF stack, while GEMs are out of acceptance
+// 2022-03-23 - DE - prepare setup for mCBM March 2022-03-22 iron run - tof_v21f
+// 2022-03-20 - DE - prepare setup for mCBM March 2022-03-20 iron run
+// 2022-03-09 - DE - prepare setup for mCBM March 2022-03-09 carbon run
+// 2022-02-04 - DE - surveyed position of STS v22c (7 cm downstream of nominal)
+// 2021-09-28 - DE - surveyed position of TRD v21b, TOF v21d and RICH v21a
+// 2020-08-17 - DE - add TRD v21a, add TOF v21c, disable MUCH v20a
+// 2020-05-26 - DE - use RICH v20d which moved according to TOF v20b
+// 2020-05-25 - DE - use TRD v20b with 2 modules and support frame for 2021
+// 2020-05-22 - DE - use platform v20a with measured size of support table
+// 2020-05-12 - DE - make mRICH v20b (without window) the new default
+// 2020-03-11 - DE - prepare setup for mCBM Spring 2021 beamtime
+// 2020-03-11 - DE - prepare setup for mCBM May 2020 beamtime
+// 2020-03-11 - DE - prepare setup for mCBM March 2020 beamtime
+// 2019-12-20 - FU - use the new pipe/targetbox geometry which consists of
+//                   root files which are both passed to to CbmSetup
+// 2019-11-28 - DE - move mTOF v19b +12 cm in x direction for the Nov 2019 run
+// 2019-11-15 - DE - use mSTS v19b with single module in the top left of station
+// 0 2019-08-15 - DE - use mCBM targetbox as pipe v19b 2019-08-12 - DE - use
+// mSTS v19a 2019-08-08 - FU - use mMUCH v19a 2019-08-02 - DE - use pipe v19a
+// with flange position at z=610 mm 2019-07-31 - DE - add TOF v18m=v19a geometry
+// - provided by the TOF group 2019-07-31 - DE - add RICH v19a geometry -
+// provided by the RICH group 2019-03-15 - DE - this is supposed to be the start
+// version of mCBM in March 2019 2018-08-24 - DE - this is supposed to be the
+// start version of mCBM in 2018 2018-06-27 - DE - set flipped mTOF v18j
+// geometry as new default 2018-05-24 - DE - place 20deg_long setup back at 25
+// degrees, see issue #1078 2018-02-27 - DE - use mTRD v18o to fix redmine issue
+// #1046 with tracking 2017-12-11 - DE - enable mBUCH v18m 2017-12-04 - DE - add
+// mPSD to mCBM setup 2017-11-22 - DE - use TRD v17n with 22 cm spacing from CAD
+// 2017-11-17 - DE - set aerogel mRICH v18d as default
+// 2017-11-10 - DE - switch to mMUCH v18e with Mv2 dimensions
+// 2017-11-03 - DE - add long setup, (acceptance matching +-12 degrees from
+// mSTS) 2017-11-02 - DE - add common support table v18c 2017-11-02 - DE -
+// include mBUCH with mTRD v18j 2017-10-23 - DE - use mMUCH with vertically
+// aligned left rim 2017-10-18 - DE - use mTOF v18h with vertical orientation
+// 2017-10-16 - DE - use 20 degree beampipe
+// 2017-06-03 - DE - add RICH v18a_mcbm
+// 2017-05-02 - DE - switch back to 5x5 RPC TOF
+// 2017-05-02 - DE - skip MVD in the initial setup
+// 2016-02-05 - VF - Replaces former sis18_mcbm_setup.C,
+//                   now using the CbmSetup class.
+// 2015-06-18 - DE - mCBM @ SIS18 setup
+
+void setup_mcbm_beam_2022_05_23_nickel() {
+
+  // -----  Geometry Tags  --------------------------------------------------
+  TString platGeoTag = "v20a_mcbm"; // 2020 // support table
+
+  TString pipeGeoTag = "v19f_mcbm"; // pipe after target box
+
+  //  TString mvdGeoTag  = "v18b_mcbm";
+
+  // done
+  TString stsGeoTag  = "v22d_mcbm"; // unchanged
+
+  // done
+  TString muchGeoTag = "v22k_mcbm"; // 2 GEM layers and 1 RPC
+
+  // done
+  TString trdGeoTag  = "v22h_mcbm"; // TRD-2D May 2022 + 2x TRD-1D modules
+
+  // done
+  TString tofGeoTag  = "v21h_mcbm"; // same calibration parameters as v21g
+
+  // done
+  TString richGeoTag = "v21c_mcbm"; // othogonal to z-axis
+
+  // unchanged
+  //  TString psdGeoTag  = "v20a_mcbm"; // at 25 degree, below the beampipe
+  // ------------------------------------------------------------------------
+
+  // -----  Magnetic field  -------------------------------------------------
+  TString fieldTag    = "v18a";
+  Double_t fieldZ     = 40.; // field centre z position
+  Double_t fieldScale = 0.; // field scaling factor
+  // ------------------------------------------------------------------------
+
+  // -----  Create setup  ---------------------------------------------------
+  CbmSetup *setup = CbmSetup::Instance();
+  if (!setup->IsEmpty()) {
+    std::cout << "-W- setup_sis18_mcbm: overwriting existing setup"
+              << setup->GetTitle() << std::endl;
+    setup->Clear();
+  }
+  setup->SetTitle("SIS18 - mCBM Setup");
+  setup->SetModule(ECbmModuleId::kPlatform, platGeoTag);
+  setup->SetModule(ECbmModuleId::kPipe, pipeGeoTag);
+  //  setup->SetModule(ECbmModuleId::kMvd, mvdGeoTag);  // skip mvd
+  setup->SetModule(ECbmModuleId::kSts, stsGeoTag);
+  setup->SetModule(ECbmModuleId::kMuch, muchGeoTag);
+  setup->SetModule(ECbmModuleId::kTrd, trdGeoTag);
+  setup->SetModule(ECbmModuleId::kTof, tofGeoTag);
+  setup->SetModule(ECbmModuleId::kRich, richGeoTag);
+  //  setup->SetModule(ECbmModuleId::kPsd, psdGeoTag);
+  setup->SetField(fieldTag, fieldScale, 0., 0., fieldZ);
+  // ------------------------------------------------------------------------
+
+  // -----   Screen output   ------------------------------------------------
+  setup->Print();
+  // ------------------------------------------------------------------------
+}
diff --git a/setup/setup_mcbm_beam_2022_06_16_gold.C b/setup/setup_mcbm_beam_2022_06_16_gold.C
new file mode 100644
index 00000000..b9bbe6b7
--- /dev/null
+++ b/setup/setup_mcbm_beam_2022_06_16_gold.C
@@ -0,0 +1,115 @@
+/** ROOT macro to define the CBM setup sis18_mcbm
+ **
+ ** @author Volker Friese <v.friese@gsi.de>
+ ** @author David Emschermann <d.emschermann@gsi.de>
+ ** @date   5 February 2016
+ **
+ **/
+
+// clang-format off
+
+// 2022-05-24 - DE - prepare setup for mCBM May 2022-05-23 nickel run
+// 2022-05-24 - DE - disable PSD to reduce secondaries (PSD is in parking position)
+// 2022-04-29 - DE - shift MUCH GEM to x = -5 cm
+// 2022-03-27 - DE - place the MUCH RPC behind the TOF stack, while GEMs are in the acceptance
+// 2022-03-27 - DE - place the MUCH RPC behind the TOF stack, while GEMs are out of acceptance
+// 2022-03-23 - DE - prepare setup for mCBM March 2022-03-22 iron run - tof_v21f
+// 2022-03-20 - DE - prepare setup for mCBM March 2022-03-20 iron run
+// 2022-03-09 - DE - prepare setup for mCBM March 2022-03-09 carbon run
+// 2022-02-04 - DE - surveyed position of STS v22c (7 cm downstream of nominal)
+// 2021-09-28 - DE - surveyed position of TRD v21b, TOF v21d and RICH v21a
+// 2020-08-17 - DE - add TRD v21a, add TOF v21c, disable MUCH v20a
+// 2020-05-26 - DE - use RICH v20d which moved according to TOF v20b
+// 2020-05-25 - DE - use TRD v20b with 2 modules and support frame for 2021
+// 2020-05-22 - DE - use platform v20a with measured size of support table
+// 2020-05-12 - DE - make mRICH v20b (without window) the new default
+// 2020-03-11 - DE - prepare setup for mCBM Spring 2021 beamtime
+// 2020-03-11 - DE - prepare setup for mCBM May 2020 beamtime
+// 2020-03-11 - DE - prepare setup for mCBM March 2020 beamtime
+// 2019-12-20 - FU - use the new pipe/targetbox geometry which consists of
+//                   root files which are both passed to to CbmSetup
+// 2019-11-28 - DE - move mTOF v19b +12 cm in x direction for the Nov 2019 run
+// 2019-11-15 - DE - use mSTS v19b with single module in the top left of station
+// 0 2019-08-15 - DE - use mCBM targetbox as pipe v19b 2019-08-12 - DE - use
+// mSTS v19a 2019-08-08 - FU - use mMUCH v19a 2019-08-02 - DE - use pipe v19a
+// with flange position at z=610 mm 2019-07-31 - DE - add TOF v18m=v19a geometry
+// - provided by the TOF group 2019-07-31 - DE - add RICH v19a geometry -
+// provided by the RICH group 2019-03-15 - DE - this is supposed to be the start
+// version of mCBM in March 2019 2018-08-24 - DE - this is supposed to be the
+// start version of mCBM in 2018 2018-06-27 - DE - set flipped mTOF v18j
+// geometry as new default 2018-05-24 - DE - place 20deg_long setup back at 25
+// degrees, see issue #1078 2018-02-27 - DE - use mTRD v18o to fix redmine issue
+// #1046 with tracking 2017-12-11 - DE - enable mBUCH v18m 2017-12-04 - DE - add
+// mPSD to mCBM setup 2017-11-22 - DE - use TRD v17n with 22 cm spacing from CAD
+// 2017-11-17 - DE - set aerogel mRICH v18d as default
+// 2017-11-10 - DE - switch to mMUCH v18e with Mv2 dimensions
+// 2017-11-03 - DE - add long setup, (acceptance matching +-12 degrees from
+// mSTS) 2017-11-02 - DE - add common support table v18c 2017-11-02 - DE -
+// include mBUCH with mTRD v18j 2017-10-23 - DE - use mMUCH with vertically
+// aligned left rim 2017-10-18 - DE - use mTOF v18h with vertical orientation
+// 2017-10-16 - DE - use 20 degree beampipe
+// 2017-06-03 - DE - add RICH v18a_mcbm
+// 2017-05-02 - DE - switch back to 5x5 RPC TOF
+// 2017-05-02 - DE - skip MVD in the initial setup
+// 2016-02-05 - VF - Replaces former sis18_mcbm_setup.C,
+//                   now using the CbmSetup class.
+// 2015-06-18 - DE - mCBM @ SIS18 setup
+
+void setup_mcbm_beam_2022_06_16_gold() {
+
+  // -----  Geometry Tags  --------------------------------------------------
+  TString platGeoTag = "v20a_mcbm"; // 2020 // support table
+
+  TString pipeGeoTag = "v19f_mcbm"; // pipe after target box
+
+  //  TString mvdGeoTag  = "v18b_mcbm";
+
+  // done
+  TString stsGeoTag  = "v22d_mcbm"; // unchanged
+
+  // done
+  TString muchGeoTag = "v22k_mcbm"; // 2 GEM layers and 1 RPC
+
+  // done
+  TString trdGeoTag  = "v22h_mcbm"; // TRD-2D May 2022 + 2x TRD-1D modules
+
+  // done
+  TString tofGeoTag  = "v21h_mcbm"; // same calibration parameters as v21g
+
+  // done
+  TString richGeoTag = "v21c_mcbm"; // othogonal to z-axis
+
+  // unchanged
+  //  TString psdGeoTag  = "v20a_mcbm"; // at 25 degree, below the beampipe
+  // ------------------------------------------------------------------------
+
+  // -----  Magnetic field  -------------------------------------------------
+  TString fieldTag    = "v18a";
+  Double_t fieldZ     = 40.; // field centre z position
+  Double_t fieldScale = 0.; // field scaling factor
+  // ------------------------------------------------------------------------
+
+  // -----  Create setup  ---------------------------------------------------
+  CbmSetup *setup = CbmSetup::Instance();
+  if (!setup->IsEmpty()) {
+    std::cout << "-W- setup_sis18_mcbm: overwriting existing setup"
+              << setup->GetTitle() << std::endl;
+    setup->Clear();
+  }
+  setup->SetTitle("SIS18 - mCBM Setup");
+  setup->SetModule(ECbmModuleId::kPlatform, platGeoTag);
+  setup->SetModule(ECbmModuleId::kPipe, pipeGeoTag);
+  //  setup->SetModule(ECbmModuleId::kMvd, mvdGeoTag);  // skip mvd
+  setup->SetModule(ECbmModuleId::kSts, stsGeoTag);
+  setup->SetModule(ECbmModuleId::kMuch, muchGeoTag);
+  setup->SetModule(ECbmModuleId::kTrd, trdGeoTag);
+  setup->SetModule(ECbmModuleId::kTof, tofGeoTag);
+  setup->SetModule(ECbmModuleId::kRich, richGeoTag);
+  //  setup->SetModule(ECbmModuleId::kPsd, psdGeoTag);
+  setup->SetField(fieldTag, fieldScale, 0., 0., fieldZ);
+  // ------------------------------------------------------------------------
+
+  // -----   Screen output   ------------------------------------------------
+  setup->Print();
+  // ------------------------------------------------------------------------
+}
diff --git a/setup/setup_mcbm_beam_2022_08.C b/setup/setup_mcbm_beam_2022_08.C
new file mode 100644
index 00000000..4bfea2db
--- /dev/null
+++ b/setup/setup_mcbm_beam_2022_08.C
@@ -0,0 +1,101 @@
+/** ROOT macro to define the CBM setup sis18_mcbm
+ **
+ ** @author Volker Friese <v.friese@gsi.de>
+ ** @author David Emschermann <d.emschermann@gsi.de>
+ ** @date   5 February 2016
+ **
+ **/
+
+// clang-format off
+
+// 2022-05-07 - DE - derived from setup 2022_04 - use mTOF v21h
+// 2022-02-22 - QZ - use mTOF v22a for setup 2022
+// 2021-10-03 - SR - setup for 2022 beamtime for the study of lambda physics
+// 2021-09-28 - DE - surveyed position of TRD v21b, TOF v21d and RICH v21a
+// 2020-08-17 - DE - add TRD v21a, add TOF v21c, disable MUCH v20a
+// 2020-05-26 - DE - use RICH v20d which moved according to TOF v20b
+// 2020-05-25 - DE - use TRD v20b with 2 modules and support frame for 2021
+// 2020-05-22 - DE - use platform v20a with measured size of support table
+// 2020-05-12 - DE - make mRICH v20b (without window) the new default
+// 2020-03-11 - DE - prepare setup for mCBM Spring 2021 beamtime
+// 2020-03-11 - DE - prepare setup for mCBM May 2020 beamtime
+// 2020-03-11 - DE - prepare setup for mCBM March 2020 beamtime
+// 2019-12-20 - FU - use the new pipe/targetbox geometry which consists of
+//                   root files which are both passed to to CbmSetup
+// 2019-11-28 - DE - move mTOF v19b +12 cm in x direction for the Nov 2019 run
+// 2019-11-15 - DE - use mSTS v19b with single module in the top left of station 0
+// 2019-08-15 - DE - use mCBM targetbox as pipe v19b
+// 2019-08-12 - DE - use mSTS v19a
+// 2019-08-08 - FU - use mMUCH v19a
+// 2019-08-02 - DE - use pipe v19a with flange position at z=610 mm
+// 2019-07-31 - DE - add TOF v18m=v19a geometry - provided by the TOF group
+// 2019-07-31 - DE - add RICH v19a geometry - provided by the RICH group
+// 2019-03-15 - DE - this is supposed to be the start version of mCBM in March 2019
+// 2018-08-24 - DE - this is supposed to be the start version of mCBM in 2018
+// 2018-06-27 - DE - set flipped mTOF v18j geometry as new default
+// 2018-05-24 - DE - place 20deg_long setup back at 25 degrees, see issue #1078
+// 2018-02-27 - DE - use mTRD v18o to fix redmine issue #1046 with tracking
+// 2017-12-11 - DE - enable mBUCH v18m
+// 2017-12-04 - DE - add mPSD to mCBM setup
+// 2017-11-22 - DE - use TRD v17n with 22 cm spacing from CAD
+// 2017-11-17 - DE - set aerogel mRICH v18d as default
+// 2017-11-10 - DE - switch to mMUCH v18e with Mv2 dimensions
+// 2017-11-03 - DE - add long setup, (acceptance matching +-12 degrees from mSTS)
+// 2017-11-02 - DE - add common support table v18c
+// 2017-11-02 - DE - include mBUCH with mTRD v18j
+// 2017-10-23 - DE - use mMUCH with vertically aligned left rim
+// 2017-10-18 - DE - use mTOF v18h with vertical orientation
+// 2017-10-16 - DE - use 20 degree beampipe
+// 2017-06-03 - DE - add RICH v18a_mcbm
+// 2017-05-02 - DE - switch back to 5x5 RPC TOF
+// 2017-05-02 - DE - skip MVD in the initial setup
+// 2016-02-05 - VF - Replaces former sis18_mcbm_setup.C,
+//                   now using the CbmSetup class.
+// 2015-06-18 - DE - mCBM @ SIS18 setup
+
+void setup_mcbm_beam_2022_08() {
+
+  // -----  Geometry Tags  --------------------------------------------------
+  TString platGeoTag    = "v20a_mcbm"; // 2020 // support table
+  TString pipeGeoTag    = "v19f_mcbm"; // pipe after target box
+  // TString mvdGeoTag      = "v18b_mcbm";
+  TString stsGeoTag     = "v20e_mcbm";
+  // TString muchGeoTag     = "v22c_mcbm"; // 2 layers
+  TString trdGeoTag     = "v22a_mcbm"; // 2022
+  TString tofGeoTag     = "v21h_mcbm"; // TOF
+  TString richGeoTag    = "v20d_mcbm"; // geometry provided by RICH group
+  TString psdGeoTag     = "v20a_mcbm"; // at 25 degree, below the beampipe
+  // ------------------------------------------------------------------------
+
+  // -----  Magnetic field  -------------------------------------------------
+  TString fieldTag    = "v18a";
+  Double_t fieldZ     = 40.;    // field centre z position
+  Double_t fieldScale =  0.;    // field scaling factor
+  // ------------------------------------------------------------------------
+
+  // -----  Create setup  ---------------------------------------------------
+  CbmSetup *setup = CbmSetup::Instance();
+  if (!setup->IsEmpty()) {
+    std::cout << "-W- setup_sis18_mcbm: overwriting existing setup"
+              << setup->GetTitle() << std::endl;
+    setup->Clear();
+  }
+  setup->SetTitle("SIS18 - mCBM Setup");
+  setup->SetModule(ECbmModuleId::kPlatform, platGeoTag);
+  setup->SetModule(ECbmModuleId::kPipe, pipeGeoTag);
+  //  setup->SetModule(ECbmModuleId::kMvd, mvdGeoTag);  // skip mvd
+  setup->SetModule(ECbmModuleId::kSts, stsGeoTag);
+  //  setup->SetModule(ECbmModuleId::kMuch, muchGeoTag);
+  setup->SetModule(ECbmModuleId::kTrd, trdGeoTag);
+  setup->SetModule(ECbmModuleId::kTof, tofGeoTag);
+  setup->SetModule(ECbmModuleId::kRich, richGeoTag);
+  setup->SetModule(ECbmModuleId::kPsd, psdGeoTag);
+  setup->SetField(fieldTag, fieldScale, 0., 0., fieldZ);
+  // ------------------------------------------------------------------------
+
+  // -----   Screen output   ------------------------------------------------
+  setup->Print();
+  // ------------------------------------------------------------------------
+
+// clang-format on
+}
-- 
GitLab