Skip to content
Snippets Groups Projects

Add NCAL mockup to platform v20a

Merged David Emschermann requested to merge d.emschermann/cbmroot_geometry:ncalmockup into master
All threads resolved!
Files
4
+ 265
0
/* Copyright (C) 2013-2025 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
SPDX-License-Identifier: GPL-3.0-only
Authors: Volker Friese, David Emschermann [committer] */
/******************************************************************************
** Creation of beam pipe geometry in ROOT format (TGeo).
**
** @file create_pipegeo_v16.C
** @author Volker Friese <v.friese@gsi.de>
** @date 11.10.2013
**
** The beam pipe is composed of carbon with a thickness of 0.5 mm. It is
** placed directly into the cave as mother volume.
** The pipe consists of a number of parts. Each part has a PCON
** shape. The beam pipe inside the RICH is part of the RICH geometry;
** the beam pipe geometry thus excludes the z range of the RICH in case
** the latter is present in the setup.
*****************************************************************************/
// 2025.02.07 - DE - add NCAL mockup to v20a
// 2020.05.05 - DE - update table dimensions and position measured by Christian Sturm
// 2018.08.23 - DE - shorten the table length from 400 cm to 250 cm
#include "TGeoManager.h"
#include "TGeoPcon.h"
#include "TGeoTube.h"
#include <iomanip>
#include <iostream>
using namespace std;
// ------------- Other global variables -----------------------------------
// ---> TGeoManager (too lazy to write out 'Manager' all the time
TGeoManager* gGeoMan = NULL; // will be set later
// ----------------------------------------------------------------------------
// ============================================================================
// ====== Main function =====
// ============================================================================
void create_platform_v24a()
{
// ----- Define platform parts ----------------------------------------------
/** For v24a (mCBM) **/
TString geoTag = "v24a_mcbm";
// Double_t platform_angle = 25.; // rotation angle around y-axis
// Double_t platform_angle = 19.; // rotation angle around y-axis
Double_t platform_angle = 0.; // rotation angle around y-axis
// Double_t platX_offset = -230.; // offset to the right side along x-axis
Double_t platX_offset = -25.1; // offset along x-axis
Double_t platY_offset = 0.0; // offset along y-axis
Double_t platZ_offset = 13.7; // offset along z-axis
Double_t sizeX = 100.0; // table width // until 15.05.2020: 80.0;
Double_t sizeY = 98.5; // table height // until 15.05.2020: 80.0;
Double_t sizeZ = 215.5; // table length // until 15.05.2020: 250.0;
// Double_t endZ = 450.0; // ends at z = 450.0
// /** For v16b (SIS 300) **/
// TString geoTag = "v16b";
// Double_t sizeX = 725.0; // symmetric in x
// Double_t sizeY = 234.0; // without rails
// Double_t sizeZ = 455.0; // long version
// Double_t endZ = 540.0; // ends at z = 450.0
// Double_t beamY = 570.0; // nominal beam height
Double_t beamY = 200.0; // nominal beam height
Double_t posX = 0;
Double_t posY = -beamY + sizeY / 2.; // rest on the floor at -beamY
Double_t posZ = +sizeZ / 2.;
// --------------------------------------------------------------------------
// ------- Geometry file name (output) ----------------------------------
TString geoFileName = "platform_";
geoFileName = geoFileName + geoTag + ".geo.root";
// --------------------------------------------------------------------------
// ------- Open info file -----------------------------------------------
TString infoFileName = geoFileName;
infoFileName.ReplaceAll("root", "info");
fstream infoFile;
infoFile.open(infoFileName.Data(), fstream::out);
infoFile << "Platform geometry created with create_platform_v24a.C" << std::endl << std::endl;
// --------------------------------------------------------------------------
// ------- Load media from media file -----------------------------------
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();
gGeoMan = gGeoManager;
// --------------------------------------------------------------------------
// ----------------- Get and create the required media -----------------
FairGeoMedia* geoMedia = geoFace->getMedia();
FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
// // ---> aluminium
// FairGeoMedium* mAluminium = geoMedia->getMedium("aluminium");
// if ( ! mAluminium ) Fatal("Main", "FairMedium aluminium not found");
// geoBuild->createMedium(mAluminium);
// TGeoMedium* aluminium = gGeoMan->GetMedium("aluminium");
// if ( ! aluminium ) Fatal("Main", "Medium aluminium not found");
FairGeoMedium* mAir = geoMedia->getMedium("air");
if (!mAir) Fatal("Main", "FairMedium air not found");
geoBuild->createMedium(mAir);
TGeoMedium* air = gGeoMan->GetMedium("air");
if (!air) Fatal("Main", "Medium air not found");
// --------------------------------------------------------------------------
// -------------- Create geometry and top volume -------------------------
gGeoMan = (TGeoManager*) gROOT->FindObject("FAIRGeom");
gGeoMan->SetName("PLATFORMgeom");
TGeoVolume* top = new TGeoVolumeAssembly("top");
gGeoMan->SetTopVolume(top);
TString platformName = "platform_";
platformName += geoTag;
TGeoVolume* platform = new TGeoVolumeAssembly(platformName.Data());
// --------------------------------------------------------------------------
// ----- Create ---------------------------------------------------------
TGeoBBox* platform_base = new TGeoBBox("", sizeX / 2., sizeY / 2., sizeZ / 2.);
TGeoVolume* platform_vol = new TGeoVolume("platform", platform_base, air);
platform_vol->SetLineColor(kBlue);
platform_vol->SetTransparency(70);
TGeoTranslation* platform_trans = new TGeoTranslation("", posX, posY, posZ);
platform->AddNode(platform_vol, 1, platform_trans);
infoFile << "sizeX : " << setprecision(2) << sizeX << " cm " << endl
<< "sizeY : " << setprecision(2) << sizeY << " cm " << endl
<< "sizeZ : " << setprecision(2) << sizeZ << " cm " << endl
<< endl;
infoFile << "posX : " << setprecision(2) << posX << " cm " << endl
<< "posY : " << setprecision(2) << posY << " cm " << endl
<< "posZ : " << setprecision(2) << posZ << " cm " << endl
<< endl;
infoFile << "offsetX : " << setprecision(2) << platX_offset << " cm " << endl
<< "offsetY : " << setprecision(2) << platY_offset << " cm " << endl
<< "offsetZ : " << setprecision(2) << platZ_offset << " cm " << endl
<< endl;
// --------------- Finish -----------------------------------------------
top->AddNode(platform, 1);
// ----- Create ncal -------------------------------------------------
//=======================================================================================
// -------------- Create geometry and top volume -------------------------
TString ncalName = "ncal_v24a";
// gGeoMan->SetTopVolume(top);
// TGeoVolume* ncal = new TGeoVolumeAssembly(ncalName.Data());
// --------------------------------------------------------------------------
// Laenge 50.0 cm
// Durchmesser 14.0 cm
const Bool_t IncludeOuterRing = true; // false; // true, plot out 6 detectors
const Bool_t IncludeInnerCore = true; // false; // true, plot inner detectors
// start and stop angles
Double_t angle1 = 0; // closed
Double_t angle2 = 360; // closed
Double_t gxoff = 0; // global offset in x
Double_t gyoff = 0; // global offset in y
Double_t gzoff = 380; // global offset in z
gxoff -= platX_offset; // global offset in x
gyoff -= platY_offset; // global offset in y
gzoff -= platZ_offset; // global offset in z
// 7 ncal array
Double_t rmax50 = 14.0 / 2.;
Double_t rmin50 = 0.;
Double_t length50 = 50.0;
Double_t nscale = 1.01;
// TGeoVolume* vncal00 = gGeoManager->MakePgon("ncal00", air, 0, 360, 6, 2); // 1 section
TGeoVolume* vncal00 = gGeoManager->MakePgon("ncal00", air, angle1, angle2, 6, 4); // 2 sections
TGeoPgon *pgon = (TGeoPgon*)(vncal00->GetShape());
pgon->DefineSection(0,-length50 /2., rmin50, rmax50); // detector
pgon->DefineSection(1, length50 /2., rmin50, rmax50); // detector
pgon->DefineSection(2, length50 /2. , rmin50, rmax50/2.); // light guide
pgon->DefineSection(3, length50 /2.+10, rmin50, rmax50/2.); // light guide
vncal00->SetLineColor(kGreen);
TGeoTranslation* tra1 = new TGeoTranslation("tra1", gxoff + cos( 30 * acos(-1)/180) * 2 * rmax50 * nscale, gyoff + sin( 30 * acos(-1)/180) * 2 * rmax50 * nscale, gzoff + length50 / 2.);
if (IncludeOuterRing) platform->AddNode(vncal00, 1, tra1);
TGeoTranslation* tra2 = new TGeoTranslation("tra2", gxoff + cos( 90 * acos(-1)/180) * 2 * rmax50 * nscale, gyoff + sin( 90 * acos(-1)/180) * 2 * rmax50 * nscale, gzoff + length50 / 2.);
if (IncludeOuterRing) platform->AddNode(vncal00, 2, tra2);
TGeoTranslation* tra3 = new TGeoTranslation("tra3", gxoff + cos(150 * acos(-1)/180) * 2 * rmax50 * nscale, gyoff + sin(150 * acos(-1)/180) * 2 * rmax50 * nscale, gzoff + length50 / 2.);
if (IncludeOuterRing) platform->AddNode(vncal00, 3, tra3);
TGeoTranslation* tra4 = new TGeoTranslation("tra4", gxoff + cos(210 * acos(-1)/180) * 2 * rmax50 * nscale, gyoff + sin(210 * acos(-1)/180) * 2 * rmax50 * nscale, gzoff + length50 / 2.);
if (IncludeOuterRing) platform->AddNode(vncal00, 4, tra4);
TGeoTranslation* tra5 = new TGeoTranslation("tra5", gxoff + cos(270 * acos(-1)/180) * 2 * rmax50 * nscale, gyoff + sin(270 * acos(-1)/180) * 2 * rmax50 * nscale, gzoff + length50 / 2.);
if (IncludeOuterRing) platform->AddNode(vncal00, 5, tra5);
TGeoTranslation* tra6 = new TGeoTranslation("tra6", gxoff + cos(330 * acos(-1)/180) * 2 * rmax50 * nscale, gyoff + sin(330 * acos(-1)/180) * 2 * rmax50 * nscale, gzoff + length50 / 2.);
if (IncludeOuterRing) platform->AddNode(vncal00, 6, tra6);
TGeoTranslation* tra7 = new TGeoTranslation("tra7", gxoff + 0., gyoff + 0., gzoff + length50 / 2.);
if (IncludeInnerCore) platform->AddNode(vncal00, 7, tra7);
// --------------- Finish -----------------------------------------------
// TGeoTranslation* tra_ncal = new TGeoTranslation("tra_ncal", gxoff, gyoff, gzoff);
// platform->AddNode(ncal, 1, tra_ncal);
cout << endl << endl;
gGeoMan->CloseGeometry();
gGeoMan->CheckOverlaps(0.001);
gGeoMan->PrintOverlaps();
gGeoMan->Test();
platform->Export(geoFileName); // an alternative way of writing the platform volume
TFile* geoFile = new TFile(geoFileName, "UPDATE");
// rotate the platform around y
TGeoRotation* platform_rotation = new TGeoRotation();
platform_rotation->RotateY(platform_angle);
// TGeoCombiTrans* platform_placement = new TGeoCombiTrans( sin( platform_angle/180.*acos(-1) ) * z1[1]/2., 0., 0., platform_rotation);
TGeoCombiTrans* platform_placement =
new TGeoCombiTrans("platform_rot", platX_offset, platY_offset, platZ_offset, platform_rotation);
// TGeoTranslation* platform_placement = new TGeoTranslation("platform_trans", 0., 0., 0.);
platform_placement->Write();
geoFile->Close();
cout << endl;
cout << "Geometry " << top->GetName() << " written to " << geoFileName << endl;
top->Draw("ogl");
infoFile.close();
}
// ============================================================================
// ====== End of main function =====
// ============================================================================
Loading