Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Classes | Public Types | Public Member Functions | Private Member Functions | Private Attributes | List of all members
ActsHGTDLayerBuilder Class Reference

#include <ActsHGTDLayerBuilder.h>

Inheritance diagram for ActsHGTDLayerBuilder:
Collaboration diagram for ActsHGTDLayerBuilder:

Classes

struct  Config
 

Public Types

using ElementVector = ActsElementVector
 

Public Member Functions

 ActsHGTDLayerBuilder (const Config &cfg, std::unique_ptr< const Acts::Logger > logger)
 Constructor. More...
 
virtual ~ActsHGTDLayerBuilder ()=default
 Destructor. More...
 
virtual const Acts::LayerVector negativeLayers (const Acts::GeometryContext &gctx) const override
 
virtual const Acts::LayerVector centralLayers (const Acts::GeometryContext &gctx) const override
 
virtual const Acts::LayerVector positiveLayers (const Acts::GeometryContext &gctx) const override
 
virtual const std::string & identification () const override
 

Private Member Functions

const Acts::Logger & logger () const
 Private access to the logger. More...
 
std::vector< std::shared_ptr< const ActsDetectorElement > > getDetectorElements () const
 
void buildEndcap (const Acts::GeometryContext &gctx, Acts::LayerVector &layersOutput, int type=0) const
 

Private Attributes

Config m_cfg
 configuration object More...
 
std::unique_ptr< const Acts::Logger > m_logger
 logging instance More...
 

Detailed Description

Definition at line 35 of file ActsHGTDLayerBuilder.h.

Member Typedef Documentation

◆ ElementVector

Definition at line 39 of file ActsHGTDLayerBuilder.h.

Constructor & Destructor Documentation

◆ ActsHGTDLayerBuilder()

ActsHGTDLayerBuilder::ActsHGTDLayerBuilder ( const Config cfg,
std::unique_ptr< const Acts::Logger >  logger 
)

Constructor.

Parameters
cfgis the configuration struct
loggerthe local logging instance

Definition at line 41 of file ActsHGTDLayerBuilder.cxx.

43  : m_cfg (cfg),
44  m_logger(std::move(logger))
45 {
46 }

◆ ~ActsHGTDLayerBuilder()

virtual ActsHGTDLayerBuilder::~ActsHGTDLayerBuilder ( )
virtualdefault

Destructor.

Member Function Documentation

◆ buildEndcap()

void ActsHGTDLayerBuilder::buildEndcap ( const Acts::GeometryContext &  gctx,
Acts::LayerVector &  layersOutput,
int  type = 0 
) const
private

Definition at line 71 of file ActsHGTDLayerBuilder.cxx.

73 {
74  using enum Acts::AxisDirection;
75 
76  ACTS_VERBOSE("Build layers: " << (type < 0 ? "NEGATIVE" : "POSITIVE")
77  << " ENDCAP");
78 
79  std::vector<std::shared_ptr<const ActsDetectorElement>> elements =
81  std::map<int, std::vector<const Acts::Surface *>>
82  initialLayers{};
83 
84  for (const auto &element : elements) {
85 
86  Identifier currentId(element->identify());
87  // Check if the element is in the correct endcap (type -1 or 1)
88  if (m_cfg.idHelper->endcap(currentId) * type <= 0) {
89  continue;
90  }
91 
92  m_cfg.elementStore->push_back(element);
93  int currentLayer {m_cfg.idHelper->layer(currentId)};
94 
95  initialLayers[currentLayer].push_back(&element->surface());
96  }
97 
98  ACTS_VERBOSE("Found " << initialLayers.size() << " "
99  << (type < 0 ? "NEGATIVE" : "POSITIVE")
100  << " ENDCAP inital layers");
101 
102  // Loops over a provided vector of surface and calculates the various
103  // min/max values in one go. Also takes into account the thickness
104  // of an associated DetectorElement, if it exists.
105  //
106  // @param gctx The current geometry context object, e.g. alignment
107  // @param surfaces The vector of surfaces to consider
108 
109  std::vector<Acts::ProtoLayer> protoLayers;
110  protoLayers.reserve(initialLayers.size());
111 
112  for (const auto &[key, surfaces] : initialLayers) {
113  auto &pl = protoLayers.emplace_back(gctx, surfaces);
114  pl.envelope[AxisR] = m_cfg.endcapEnvelopeR;
115  pl.envelope[AxisZ] = m_cfg.endcapEnvelopeZ;
116  }
117 
118 
119  // sort proto layers by their medium z position
120  std::sort(protoLayers.begin(), protoLayers.end(),
121  [type](const Acts::ProtoLayer &a, const Acts::ProtoLayer &b) {
122  double midA = (a.min(AxisZ) + a.max(AxisZ)) / 2.0;
123  double midB = (b.min(AxisZ) + b.max(AxisZ)) / 2.0;
124  if (type < 0) {
125  return midA < midB;
126  } else {
127  return midA > midB;
128  }
129  });
130 
131  std::vector<std::shared_ptr<const Surface>> ownedSurfaces;
132  for (const auto &pl : protoLayers) {
133 
134  std::unique_ptr<Acts::ApproachDescriptor> approachDescriptor = nullptr;
135  std::shared_ptr<const Acts::ProtoSurfaceMaterial> materialProxy = nullptr;
136 
137  double layerZ = pl.medium(AxisZ);
138  double layerHalfZ = 0.5 * pl.range(AxisZ);
139 
140  double layerZInner = layerZ - layerHalfZ;
141  double layerZOuter = layerZ + layerHalfZ;
142 
143  if (std::abs(layerZInner) > std::abs(layerZOuter))
144  std::swap(layerZInner, layerZOuter);
145 
146  std::vector<std::shared_ptr<const Acts::Surface>> aSurfaces;
147 
148  Acts::Transform3 transformNominal(Translation3(0., 0., layerZ));
149  Acts::Transform3 transformInner(Translation3(0., 0., layerZInner));
150  Acts::Transform3 transformOuter(Translation3(0., 0., layerZOuter));
151 
152  std::shared_ptr<Acts::DiscSurface> innerBoundary =
153  Acts::Surface::makeShared<Acts::DiscSurface>(
154  transformInner, pl.min(AxisR), pl.max(AxisR));
155  aSurfaces.push_back(innerBoundary);
156 
157  std::shared_ptr<Acts::DiscSurface> nominalSurface =
158  Acts::Surface::makeShared<Acts::DiscSurface>(
159  transformNominal, pl.min(AxisR), pl.max(AxisR));
160  aSurfaces.push_back(nominalSurface);
161 
162  std::shared_ptr<Acts::DiscSurface> outerBoundary =
163  Acts::Surface::makeShared<Acts::DiscSurface>(
164  transformOuter, pl.min(AxisR), pl.max(AxisR));
165  aSurfaces.push_back(outerBoundary);
166 
167  size_t matBinsPhi = m_cfg.endcapMaterialBins.first;
168  size_t matBinsR = m_cfg.endcapMaterialBins.second;
169 
170  Acts::BinUtility materialBinUtil(matBinsPhi, -M_PI, M_PI, Acts::closed,
171  AxisPhi);
172  materialBinUtil +=
173  Acts::BinUtility(matBinsR, pl.min(AxisR), pl.max(AxisR),
174  Acts::open, AxisR, transformNominal);
175 
176  materialProxy =
177  std::make_shared<const Acts::ProtoSurfaceMaterial>(materialBinUtil);
178 
179  ACTS_VERBOSE("[L] Layer is marked to carry support material on Surface ( "
180  "inner=0 / center=1 / outer=2 ) : "
181  << "inner");
182  ACTS_VERBOSE("with binning: [" << matBinsPhi << ", " << matBinsR << "]");
183 
184  ACTS_VERBOSE("Created ApproachSurfaces for disc layer at:");
185  ACTS_VERBOSE(" - inner: Z=" << layerZInner);
186  ACTS_VERBOSE(" - central: Z=" << layerZ);
187  ACTS_VERBOSE(" - outer: Z=" << layerZOuter);
188 
189  // set material on inner
190  innerBoundary->assignSurfaceMaterial(materialProxy);
191 
192  std::set<int> phiModuleByRing;
193  // want to figure out bins in phi
194  for (const auto &srf : pl.surfaces()) {
195  auto elm = dynamic_cast<const ActsDetectorElement *>(
196  srf->associatedDetectorElement());
197  if (elm) {
198  auto id = elm->identify();
199  phiModuleByRing.insert(m_cfg.idHelper->phi_module(id));
200  }
201  }
202 
203  size_t nModPhi = 50; //phiModuleByRing.size();
204  size_t nModR = 1;// pl.surfaces().size()/nModPhi;
205 
206  ACTS_VERBOSE("Identifier reports: " << nModPhi << " is lowest for " << nModR
207  << " r-rings");
208 
209  size_t nBinsPhi = nModPhi;
210  size_t nBinsR = nModR;
211 
212 
213  ACTS_VERBOSE("Creating r x phi binned layer with " << nBinsR << " x "
214  << nBinsPhi << " bins");
215 
216 
217  approachDescriptor =
218  std::make_unique<Acts::GenericApproachDescriptor>(aSurfaces);
219 
220  // get ownership of pl surfaces
221  ownedSurfaces.clear();
222  ownedSurfaces.reserve(pl.surfaces().size());
223  std::transform(pl.surfaces().begin(), pl.surfaces().end(),
224  std::back_inserter(ownedSurfaces),
225  [](const auto &s) { return s->getSharedPtr(); });
226 
227  auto layer = m_cfg.layerCreator->discLayer(gctx, ownedSurfaces, nBinsR,
228  nBinsPhi, pl, transformNominal,
229  std::move(approachDescriptor));
230 
231  layersOutput.push_back( std::move(layer) );
232  }
233 }

◆ centralLayers()

const Acts::LayerVector ActsHGTDLayerBuilder::centralLayers ( const Acts::GeometryContext &  gctx) const
overridevirtual

Definition at line 57 of file ActsHGTDLayerBuilder.cxx.

57  {
58  ACTS_VERBOSE("HGTD has no central layers");
59  Acts::LayerVector layers;
60  return layers;
61 }

◆ getDetectorElements()

std::vector< std::shared_ptr< const ActsDetectorElement > > ActsHGTDLayerBuilder::getDetectorElements ( ) const
private

Definition at line 236 of file ActsHGTDLayerBuilder.cxx.

236  {
237  ACTS_VERBOSE("Retrieving detector elements from detector manager");
238  if ( not m_cfg.mng ) {
239  ACTS_ERROR("Manager is null");
240  throw std::runtime_error{"Detector manager is null"};
241  }
242  auto hgtdDetMng = static_cast<const HGTD_DetectorManager *>(m_cfg.mng);
243  ACTS_VERBOSE("Detector manager has "
244  << std::distance(hgtdDetMng->getDetectorElementBegin(),
245  hgtdDetMng->getDetectorElementEnd())
246  << " elements");
247 
248  std::vector<std::shared_ptr<const ActsDetectorElement>> elements;
249 
250  InDetDD::HGTD_DetectorElementCollection::const_iterator iter;
251  for (iter = hgtdDetMng->getDetectorElementBegin();
252  iter != hgtdDetMng->getDetectorElementEnd(); ++iter) {
253  const InDetDD::HGTD_DetectorElement *detElement =
254  dynamic_cast<InDetDD::HGTD_DetectorElement *>(*iter);
255 
256  if (not detElement) {
257  ACTS_ERROR("Detector element was nullptr");
258  throw std::runtime_error{"Corrupt detector element collection"};
259  }
260  elements.push_back(
261  std::make_shared<const ActsDetectorElement>(*detElement, (*iter)->identify()));
262  }
263  ACTS_VERBOSE("Retrieved " << elements.size() << " elements");
264 
265  return elements;
266 }

◆ identification()

virtual const std::string& ActsHGTDLayerBuilder::identification ( ) const
inlineoverridevirtual

Definition at line 92 of file ActsHGTDLayerBuilder.h.

93  {
94  return m_cfg.configurationName;
95  }

◆ logger()

const Acts::Logger& ActsHGTDLayerBuilder::logger ( ) const
inlineprivate

Private access to the logger.

Definition at line 103 of file ActsHGTDLayerBuilder.h.

104  {
105  return *m_logger;
106  }

◆ negativeLayers()

const Acts::LayerVector ActsHGTDLayerBuilder::negativeLayers ( const Acts::GeometryContext &  gctx) const
overridevirtual

Definition at line 49 of file ActsHGTDLayerBuilder.cxx.

49  {
50  ACTS_VERBOSE("Building negative layers");
51  Acts::LayerVector nVector;
52  buildEndcap(gctx, nVector, -1);
53  return nVector;
54 }

◆ positiveLayers()

const Acts::LayerVector ActsHGTDLayerBuilder::positiveLayers ( const Acts::GeometryContext &  gctx) const
overridevirtual

Definition at line 64 of file ActsHGTDLayerBuilder.cxx.

64  {
65  ACTS_VERBOSE("Building positive layers");
66  Acts::LayerVector pVector;
67  buildEndcap(gctx, pVector, 1);
68  return pVector;
69 }

Member Data Documentation

◆ m_cfg

Config ActsHGTDLayerBuilder::m_cfg
private

configuration object

Definition at line 99 of file ActsHGTDLayerBuilder.h.

◆ m_logger

std::unique_ptr<const Acts::Logger> ActsHGTDLayerBuilder::m_logger
private

logging instance

Definition at line 112 of file ActsHGTDLayerBuilder.h.


The documentation for this class was generated from the following files:
ActsHGTDLayerBuilder::Config::endcapEnvelopeZ
std::array< double, 2 > endcapEnvelopeZ
Definition: ActsHGTDLayerBuilder.h:63
ActsHGTDLayerBuilder::Config::layerCreator
std::shared_ptr< const Acts::LayerCreator > layerCreator
Definition: ActsHGTDLayerBuilder.h:50
ActsHGTDLayerBuilder::getDetectorElements
std::vector< std::shared_ptr< const ActsDetectorElement > > getDetectorElements() const
Definition: ActsHGTDLayerBuilder.cxx:236
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
ActsHGTDLayerBuilder::logger
const Acts::Logger & logger() const
Private access to the logger.
Definition: ActsHGTDLayerBuilder.h:103
HGTD_ID::endcap
int endcap(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: HGTD_ID.h:468
ActsHGTDLayerBuilder::buildEndcap
void buildEndcap(const Acts::GeometryContext &gctx, Acts::LayerVector &layersOutput, int type=0) const
Definition: ActsHGTDLayerBuilder.cxx:71
module_driven_slicing.layers
layers
Definition: module_driven_slicing.py:114
InDetDD::HGTD_DetectorElement
Definition: HGTD_DetectorElement.h:40
M_PI
#define M_PI
Definition: ActiveFraction.h:11
Trk::closed
@ closed
Definition: BinningType.h:41
HGTD_ID::layer
int layer(const Identifier &id) const
Definition: HGTD_ID.h:475
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
ActsHGTDLayerBuilder::m_logger
std::unique_ptr< const Acts::Logger > m_logger
logging instance
Definition: ActsHGTDLayerBuilder.h:112
ActsHGTDLayerBuilder::Config::idHelper
const HGTD_ID * idHelper
Definition: ActsHGTDLayerBuilder.h:49
ActsHGTDLayerBuilder::Config::configurationName
std::string configurationName
string based identification
Definition: ActsHGTDLayerBuilder.h:47
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
Amg::transform
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Definition: GeoPrimitivesHelpers.h:156
ActsDetectorElement
Definition: ActsDetectorElement.h:42
WriteCalibToCool.swap
swap
Definition: WriteCalibToCool.py:94
ActsDetectorElement::identify
Identifier identify() const override final
Identifier.
Definition: ActsDetectorElement.cxx:279
ActsHGTDLayerBuilder::Config::endcapEnvelopeR
std::array< double, 2 > endcapEnvelopeR
Definition: ActsHGTDLayerBuilder.h:61
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
WriteCaloSwCorrections.cfg
cfg
Definition: WriteCaloSwCorrections.py:23
Trk::open
@ open
Definition: BinningType.h:40
ActsHGTDLayerBuilder::Config::mng
const HGTD_DetectorManager * mng
Definition: ActsHGTDLayerBuilder.h:48
ActsHGTDLayerBuilder::Config::elementStore
std::shared_ptr< ElementVector > elementStore
Definition: ActsHGTDLayerBuilder.h:59
a
TList * a
Definition: liststreamerinfos.cxx:10
std::sort
void sort(typename std::reverse_iterator< DataModel_detail::iterator< DVL > > beg, typename std::reverse_iterator< DataModel_detail::iterator< DVL > > end, const Compare &comp)
Specialization of sort for DataVector/List.
Definition: DVL_algorithms.h:623
HGTD_ID::phi_module
int phi_module(const Identifier &id) const
Definition: HGTD_ID.h:482
HGTD_DetectorManager
Definition: HGTD_DetectorManager.h:33
ActsHGTDLayerBuilder::Config::endcapMaterialBins
std::pair< size_t, size_t > endcapMaterialBins
Definition: ActsHGTDLayerBuilder.h:66
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54
ActsHGTDLayerBuilder::m_cfg
Config m_cfg
configuration object
Definition: ActsHGTDLayerBuilder.h:99
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
Identifier
Definition: IdentifierFieldParser.cxx:14