12#include "FairDetector.h"
13#include <fairlogger/Logger.h>
14#include "FairRootManager.h"
16#include "FairRuntimeDb.h"
17#include "FairVolume.h"
18#include "FairRootManager.h"
20#include "TGeoManager.h"
23#include "TGeoVolume.h"
25#include "TVirtualMC.h"
26#include "TVirtualMCStack.h"
79 std::vector<std::array<double, 6>> IBdat;
80 IBdat.emplace_back(std::array<double, 6>{2.24, 2.34, 2.67, 9., 16.42, 12});
81 IBdat.emplace_back(std::array<double, 6>{3.01, 3.15, 3.46, 9., 12.18, 16});
82 IBdat.emplace_back(std::array<double, 6>{3.78, 3.93, 4.21, 9., 9.55, 20});
84 for (
auto idLayer{0u}; idLayer <
mNumLayers; ++idLayer) {
85 mTurboLayer[idLayer] =
true;
86 mLayerPhi0[idLayer] = IBdat[idLayer][4];
88 mStavePerLayer[idLayer] = IBdat[idLayer][5];
89 mUnitPerStave[idLayer] = IBdat[idLayer][3];
90 mChipThickness[idLayer] = 50.e-4;
97 LOG(info) <<
"L# " << idLayer <<
" Phi:" << mLayerPhi0[idLayer] <<
" R:" <<
mLayerRadii[idLayer] <<
" Nst:" << mStavePerLayer[idLayer] <<
" Nunit:" << mUnitPerStave[idLayer]
98 <<
" W:" << mStaveWidth[idLayer] <<
" Tilt:" << mStaveTilt[idLayer] <<
" Lthick:" << mChipThickness[idLayer] <<
" Dthick:" <<
mDetectorThickness[idLayer]
111 LOG(fatal) <<
"Trying to define layer " << idLayer <<
" of inner barrel, but only " <<
mNumLayers <<
" layers expected!";
115 if (mTurboLayer[idLayer]) {
116 mLayer[idLayer] =
new V3Layer(idLayer,
true,
false);
117 mLayer[idLayer]->setStaveWidth(mStaveWidth[idLayer]);
118 mLayer[idLayer]->setStaveTilt(mStaveTilt[idLayer]);
120 mLayer[idLayer] =
new V3Layer(idLayer,
false);
123 mLayer[idLayer]->setPhi0(mLayerPhi0[idLayer]);
125 mLayer[idLayer]->setNumberOfStaves(mStavePerLayer[idLayer]);
126 mLayer[idLayer]->setNumberOfUnits(mUnitPerStave[idLayer]);
127 mLayer[idLayer]->setChipType(
mChipTypeID[idLayer]);
128 mLayer[idLayer]->setBuildLevel(
mBuildLevel[idLayer]);
132 if (mChipThickness[idLayer] != 0) {
133 mLayer[idLayer]->setChipThick(mChipThickness[idLayer]);
139 mLayer[idLayer]->createLayer(dest);
141 return mLayer[idLayer];
165 std::unique_ptr<V3Services> mServicesGeometry(
new V3Services(
"ITS"));
167 if (itsBaseParam.buildEndWheels) {
169 TGeoVolume* endWheelsA = mServicesGeometry.get()->createIBEndWheelsSideA();
170 dest->AddNode(endWheelsA, 1,
nullptr);
173 TGeoVolume* endWheelsC = mServicesGeometry.get()->createIBEndWheelsSideC();
174 dest->AddNode(endWheelsC, 1,
nullptr);
176 if (itsBaseParam.buildCYSSAssembly) {
178 TGeoVolume* cyss = mServicesGeometry.get()->createCYSSAssembly();
179 dest->AddNode(cyss, 1,
nullptr);
181 mServicesGeometry.get()->createIBGammaConvWire(dest);
198 int nHalfBarrel = mLayer[idLayer]->getNumberOfHalfBarrelsPerParent();
199 int start = nHalfBarrel > 0 ? 0 : -1;
200 for (
int iHalfBarrel{
start}; iHalfBarrel < nHalfBarrel; ++iHalfBarrel) {
201 addAlignableVolumesHalfBarrel(idLayer, iHalfBarrel,
path, lastUID);
205void DescriptorInnerBarrelITS2::addAlignableVolumesHalfBarrel(
int idLayer,
int iHalfBarrel, TString& parentPath,
int& lastUID)
const
213 TString
path = parentPath;
214 if (iHalfBarrel >= 0) {
220 if (!gGeoManager->SetAlignableEntry(sname.Data(),
path.Data())) {
221 LOG(fatal) <<
"Unable to set alignable entry ! " << sname <<
" : " <<
path;
225 int nStaves = mLayer[idLayer]->getNumberOfStavesPerParent();
226 for (
int iStave{0}; iStave < nStaves; ++iStave) {
227 addAlignableVolumesStave(idLayer, iHalfBarrel, iStave,
path, lastUID);
231void DescriptorInnerBarrelITS2::addAlignableVolumesStave(
int idLayer,
int iHalfBarrel,
int iStave, TString& parentPath,
int& lastUID)
const
245 if (!gGeoManager->SetAlignableEntry(sname.Data(),
path.Data())) {
246 LOG(fatal) <<
"Unable to set alignable entry ! " << sname <<
" : " <<
path;
249 int nHalfStave = mLayer[idLayer]->getNumberOfHalfStavesPerParent();
250 int start = nHalfStave > 0 ? 0 : -1;
251 for (
int iHalfStave{
start}; iHalfStave < nHalfStave; ++iHalfStave) {
252 addAlignableVolumesHalfStave(idLayer, iHalfBarrel, iStave, iHalfStave,
path, lastUID);
256void DescriptorInnerBarrelITS2::addAlignableVolumesHalfStave(
int idLayer,
int iHalfBarrel,
int iStave,
int iHalfStave, TString& parentPath,
int& lastUID)
const
265 TString
path = parentPath;
266 if (iHalfStave >= 0) {
272 if (!gGeoManager->SetAlignableEntry(sname.Data(),
path.Data())) {
273 LOG(fatal) <<
"Unable to set alignable entry ! " << sname <<
" : " <<
path;
277 int nModules = mLayer[idLayer]->getNumberOfModulesPerParent();
278 int start = nModules > 0 ? 0 : -1;
279 for (
int iModule{
start}; iModule < nModules; iModule++) {
280 addAlignableVolumesModule(idLayer, iHalfBarrel, iStave, iHalfStave, iModule,
path, lastUID);
284void DescriptorInnerBarrelITS2::addAlignableVolumesModule(
int idLayer,
int iHalfBarrel,
int iStave,
int iHalfStave,
int iModule, TString& parentPath,
int& lastUID)
const
293 TString
path = parentPath;
300 if (!gGeoManager->SetAlignableEntry(sname.Data(),
path.Data())) {
301 LOG(fatal) <<
"Unable to set alignable entry ! " << sname <<
" : " <<
path;
305 int nChips = mLayer[idLayer]->getNumberOfChipsPerParent();
306 for (
int iChip{0}; iChip <
nChips; ++iChip) {
307 addAlignableVolumesChip(idLayer, iHalfBarrel, iStave, iHalfStave, iModule, iChip,
path, lastUID);
311void DescriptorInnerBarrelITS2::addAlignableVolumesChip(
int idLayer,
int iHalfBarrel,
int iStave,
int iHalfStave,
int iModule,
int iChip, TString& parentPath,
int& lastUID)
const
326 if (!gGeoManager->SetAlignableEntry(sname,
path.Data(), modUID)) {
327 LOG(fatal) <<
"Unable to set alignable entry ! " << sname <<
" : " <<
path;
Definition of the DescriptorInnerBarrelITS2 class.
Definition of the GeometryTGeo class.
Definition of the SegmentationAlpide class.
Definition of the V3Layer class.
Definition of the V3Services class.
static int getSensID(o2::detectors::DetID detid, int sensid)
static const ITSBaseParam & Instance()
DescriptorInnerBarrelITS2()
void createServices(TGeoVolume *dest)
void configure(int buildLevel=0)
V3Layer * createLayer(int idLayer, TGeoVolume *dest)
void addAlignableVolumesLayer(int idLayer, int wrapperLayerId, TString &parentPath, int &lastUID)
double mSensorLayerThickness
std::vector< int > mChipTypeID
Vector of detector thickness.
std::vector< int > mBuildLevel
Vector of unique chip ID.
std::vector< double > mDetectorThickness
Vector of layer radius.
std::vector< double > mLayerRadii
sensor thickness
double radii2Turbo(double rMin, double rMid, double rMax, double sensW) const
static const char * getITSLayerPattern()
static const char * composeSymNameLayer(int lr, bool isITS3=false)
sym name of the layer
static const char * getITSHalfBarrelPattern()
static const char * composeSymNameHalfBarrel(int lr, int hba, bool isITS3=false)
Sym name of the half barrel at given layer.
static const char * composeSymNameHalfStave(int lr, int hba, int sta, int ssta, bool isITS3=false)
Sym name of the stave at given layer/halfbarrel.
static const char * composeSymNameChip(int lr, int hba, int sta, int ssta, int mod, int chip, bool isITS3=false)
Sym name of the chip in the given layer/halfbarrel/stave/substave/module.
static const char * getITSChipPattern()
static const char * composeSymNameModule(int lr, int hba, int sta, int ssta, int mod, bool isITS3=false)
Sym name of the substave at given layer/halfbarrel/stave.
static const char * getITSModulePattern()
static const char * composeSymNameStave(int lr, int hba, int sta, bool isITS3=false)
Sym name of the stave at given layer.
static const char * getITSHalfStavePattern()
static const char * getITSStavePattern()
static const char * getITSWrapVolPattern()
This class defines the Geometry for the Services of the ITS Upgrade using TGeo.
static constexpr float SensorLayerThickness
static constexpr float SensorSizeRows
GLsizei const GLchar *const * path
constexpr unsigned int nChips
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"