ATLAS Offline Software
Loading...
Searching...
No Matches
GeoPixelCable.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "GeoPixelCable.h"
6#include "GeoModelKernel/GeoBox.h"
7#include "GeoModelKernel/GeoLogVol.h"
8#include "GeoModelKernel/GeoPhysVol.h"
9#include "GeoModelKernel/GeoMaterial.h"
10
11#include <sstream>
12#include <utility>
13
16 GeoModelIO::ReadGeoModel* sqliteReader,
17 std::shared_ptr<std::map<std::string, GeoFullPhysVol*>> mapFPV,
18 std::shared_ptr<std::map<std::string, GeoAlignableTransform*>> mapAX)
19 : GeoVPixelFactory(ddmgr, mgr, sqliteReader, std::move(mapFPV), std::move(mapAX)),
21{
22 fillElements(m_gmt_mgr->GetLD(), m_gmt_mgr->Phi());
23 if (m_elements.empty()) { // If no information for layer use layer 0 numbers.
24 fillElements(0, m_gmt_mgr->Phi());
25 }
26}
27
28void
29GeoPixelCable::fillElements(int layer, int phiSector)
30{
31 int nentries = m_gmt_mgr->PixelCableElements();
32 int biStaveType = m_gmt_mgr->PixelBiStaveType(layer, phiSector);
33
34 for (int i = 0; i < nentries; i++) {
35 // bistave number
36 // 0 means both staves in bistave the same
37 // 1 means odd bistave
38 // 2 means even bistave
39 // If 0 then keep for all staves otherwise keep if odd/even correspond
40 int cableBiStaveNum = m_gmt_mgr->PixelCableBiStaveNum(i);
41 if (m_gmt_mgr->PixelCableLayerNum(i) == layer) {
42 if (!cableBiStaveNum || ((cableBiStaveNum%2) == biStaveType%2)) {
43 m_elements.push_back(i);
44 }
45 }
46 }
47}
48
49
50GeoVPhysVol* GeoPixelCable::Build() {
51
52 if (m_currentElement < 0){
53 std::cout << "ERROR: GeoPixelCableCurrent, current element not set." << std::endl;
54 return nullptr;
55 }
56
57
58 int tableIndex = m_elements[m_currentElement];
59 //std::cout << "GeoPixelCable: " << m_currentElement << ", " << tableIndex << std::endl;
60
61 double zstart = m_gmt_mgr->PixelCableZStart(tableIndex);
62 double zend = m_gmt_mgr->PixelCableZEnd(tableIndex);
63 double length = std::abs(zend - zstart);
64 double width = m_gmt_mgr->PixelCableWidth(tableIndex);
65 double thickness = m_gmt_mgr->PixelCableThickness(tableIndex);
66 double weight = m_gmt_mgr->PixelCableWeight(tableIndex);
67 std::string label = m_gmt_mgr->PixelCableLabel(tableIndex);
68
69 std::string matName = m_gmt_mgr->getMaterialName("Cable", m_gmt_mgr->GetLD());
70 const GeoMaterial* cableMat = m_mat_mgr->getMaterial(matName);
71
72 // If weight supplied use it to calculate the required thickness
73 // otherwise use the suppled thickness
74 if (weight != 0) {
75 thickness = weight / (cableMat->getDensity() * length * width);
76 }
77
78 const GeoBox* cableBox = new GeoBox(0.5*thickness,0.5*width,0.5*length);
79 std::string logName = "Cable";
80 std::ostringstream o;
81 o << m_gmt_mgr->getLD_Label() << label;
82 logName = logName+o.str();
83 //std::cout << logName << ": " << weight/Gaudi::Units::g << " g, " << thickness << std::endl;
84
85 GeoLogVol* theCable = new GeoLogVol(logName,cableBox,cableMat);
86 GeoPhysVol* cablePhys = new GeoPhysVol(theCable);
87 return cablePhys;
88}
89
90
92
93 int tableIndex = m_elements[m_currentElement];
94 double zstart = m_gmt_mgr->PixelCableZStart(tableIndex);
95 double zend = m_gmt_mgr->PixelCableZEnd(tableIndex);
96 return 0.5*(zend + zstart);
97}
98
100 int tableIndex = m_elements[m_currentElement];
101 return m_gmt_mgr->PixelCableStackOffset(tableIndex);
102
103}
104
double length(const pvec &v)
const double width
virtual GeoVPhysVol * Build() override
double getStackOffset()
GeoPixelCable(InDetDD::PixelDetectorManager *ddmgr, PixelGeometryManager *mgr, GeoModelIO::ReadGeoModel *sqliteReader, std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > mapFPV, std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > mapAX)
void fillElements(int layer, int phiSector)
std::vector< int > m_elements
PixelGeometryManager * m_gmt_mgr
InDetMaterialManager * m_mat_mgr
GeoVPixelFactory(InDetDD::PixelDetectorManager *ddmgr, PixelGeometryManager *mgr, GeoModelIO::ReadGeoModel *sqliteReader, std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > mapFPV, std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > mapAX)
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated pixel ...
std::string label(const std::string &format, int i)
Definition label.h:19
STL namespace.