ATLAS Offline Software
Loading...
Searching...
No Matches
InDetDD::SCT_DetectorManager Class Reference

Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated SCT information, access. More...

#include <SCT_DetectorManager.h>

Inheritance diagram for InDetDD::SCT_DetectorManager:
Collaboration diagram for InDetDD::SCT_DetectorManager:

Public Member Functions

 SCT_DetectorManager (StoreGateSvc *detStore)
 Constructor.
 SCT_DetectorManager (StoreGateSvc *detStore, const std::string &name, const bool doEncapNeighbour=false)
 Constructur with name.
const std::string & tag () const
 Get tag used in dictionary.
bool isSCT () const
virtual void invalidateAll ()
 Invalidate cache for all detector elements.
virtual void updateAll () const
 Update all caches.
const SiDetectorDesignaddDesign (std::unique_ptr< const SiDetectorDesign > &&)
 Access to module design; returns an observer pointer.
int numDesigns () const
const SiDetectorDesigngetDesign (int i) const
const SiNumerologynumerology () const
 Access Numerology.
SiNumerologynumerology ()
void setCommonItems (std::unique_ptr< const SiCommonItems > &&commonItems)
 Set SiCommonItems.
const VersiongetVersion () const
 Get version information.
const std::string & getLayout () const
void setVersion (const Version &version)
void addChannel (const std::string &key, int level, FrameType frame)
 Alignment access.
void addFolder (const std::string &key)
void addSpecialFolder (const std::string &key)
void addGlobalFolder (const std::string &key)
void addAlignFolderType (const AlignFolderType alignfolder)
StatusCode align (IOVSVC_CALLBACK_ARGS)
StatusCode align (const RawAlignmentObjects &alignObjects, GeoVAlignmentStore *alignStore) const
bool msgLvl (const MSG::Level lvl) const
 Test the output level.
MsgStream & msg () const
 The standard message stream.
MsgStream & msg (const MSG::Level lvl) const
 The standard message stream.
void setLevel (MSG::Level lvl)
 Change the current logging level.
Access Raw Geometry
virtual unsigned int getNumTreeTops () const override
virtual PVConstLink getTreeTop (unsigned int i) const override
void addTreeTop (const PVConstLink &vol)
 Add tree top.
Access Readout Elements
virtual const SiDetectorElementgetDetectorElement (const Identifier &id) const override
 access to individual elements via Identifier
virtual const SiDetectorElementgetDetectorElement (const IdentifierHash &idHash) const override
 access to individual elements via IdentifierHash
const SiDetectorElementgetDetectorElement (int barrel_endcap, int layer_wheel, int phi_module, int eta_module, int side) const
 access to individual elements via module numbering schema

Static Public Member Functions

static bool setAlignableTransformGlobalDelta (ExtendedAlignableTransform *extXF, const Amg::Transform3D &delta, GeoVAlignmentStore *alignStore=nullptr)
 Helper method to set delta transform from a global delta - Amg interface.
static bool setAlignableTransformLocalDelta (ExtendedAlignableTransform *extXF, const Amg::Transform3D &localToGlobalXF, const Amg::Transform3D &delta, GeoVAlignmentStore *alignStore=nullptr)
 Helper method to set delta transform from a local delta - Amg interface.

Public Attributes

AlignFolderType m_alignfoldertype

Protected Attributes

StoreGateSvcm_detStore
std::atomic_bool m_suppressWarnings

Private Member Functions

const LevelInfogetLevel (const std::string &key) const
 Retrieve level information.
bool processAlignmentContainer (const std::string &key) const
 return align folder string to use
bool processAlignmentContainer (const AlignableTransformContainer *container, GeoVAlignmentStore *alignStore) const
bool processKey (const std::string &key, const AlignableTransform *transformCollection, GeoVAlignmentStore *alignStore=nullptr) const
 Called by processAlignmentContainer, applies only one key on the transform Collections.
bool processGlobalAlignmentContainer (const std::string &key, const CondAttrListCollection *obj=nullptr, GeoVAlignmentStore *alignStore=nullptr) const
void initMessaging () const
 Initialize our message level and MessageSvc.

Private Attributes

std::string m_tag
SiNumerology m_numerology
std::vector< std::unique_ptr< const SiDetectorDesign > > m_designs
std::unique_ptr< const SiCommonItemsm_commonItems
Version m_version
std::map< std::string, LevelInfom_keys
std::set< std::string > m_folders
std::set< std::string > m_specialFolders
std::set< std::string > m_globalFolders
std::string m_nm
 Message source name.
boost::thread_specific_ptr< MsgStream > m_msg_tls
 MsgStream instance (a std::cout like with print-out levels)
std::atomic< IMessageSvc * > m_imsg { nullptr }
 MessageSvc pointer.
std::atomic< MSG::Level > m_lvl { MSG::NIL }
 Current logging level.
std::atomic_flag m_initialized ATLAS_THREAD_SAFE = ATOMIC_FLAG_INIT
 Messaging initialized (initMessaging)

Static Private Attributes

static const LevelInfo s_invalidLevel

Private member data

typedef std::map< Identifier, std::unique_ptr< ExtendedAlignableTransform > > AlignableTransformMap
std::vector< PVConstLink > m_volume
SiDetectorElementCollection m_elementCollection
std::vector< AlignableTransformMapm_higherAlignableTransforms
std::vector< std::unique_ptr< ExtendedAlignableTransform > > m_alignableTransforms
std::vector< std::unique_ptr< ExtendedAlignableTransform > > m_moduleAlignableTransforms
const SCT_IDm_idHelper
std::vector< std::unique_ptr< const SCT_ModuleSideDesign > > m_motherDesigns
bool m_isLogical
 This variable switches the how the local alignment corrections are applied If true they will be calcualted on top of all of other corrections but in the default reference frame If false they will be calcualted on top of all of other corrections but in the globally aligned reference frame.
bool m_doEndcapEtaNeighbour

access to whole collectiom via iterators

virtual const SiDetectorElementCollectiongetDetectorElementCollection () const override
 access to whole collectiom
virtual SiDetectorElementCollection::const_iterator getDetectorElementBegin () const override
virtual SiDetectorElementCollection::const_iterator getDetectorElementEnd () const override
virtual SiDetectorElementCollection::iterator getDetectorElementBegin () override
virtual SiDetectorElementCollection::iterator getDetectorElementEnd () override
virtual void addDetectorElement (SiDetectorElement *element) override
 Add elememts during construction.
virtual void addAlignableTransform (int level, const Identifier &id, GeoAlignableTransform *xf, const GeoVFullPhysVol *child)
 Add alignable transforms. No access to these, they will be changed by manager:
virtual void addAlignableTransform (int level, const Identifier &id, GeoAlignableTransform *xf, const GeoVPhysVol *child)
 As above but does a dynamic_cast to GeoVFullPhysVol.
virtual void addAlignableTransform (int, const Identifier &, GeoAlignableTransform *) override
 DEPRECATED For backward compatibility.
virtual void initNeighbours () override
 Initialize the neighbours. This can only be done when all elements are built.
virtual bool isPixel () const override
 Methods to query which manager we have.
virtual bool identifierBelongs (const Identifier &id) const override
 Check identifier is for this detector.
const SCT_ModuleSideDesigngetSCT_Design (int i) const
 Access to module design, casts to SCT_ModuleSideDesign.
virtual bool processGlobalAlignment (const std::string &, int level, FrameType frame, const CondAttrListCollection *obj, GeoVAlignmentStore *alignStore) const override
 Process new global DB folders for L1 and L2.
bool processSpecialAlignment (const std::string &key, InDetDD::AlignFolderType alignfolder) override
 Comply with InDetDetectorManager interface (not implemented for SCT)
bool processSpecialAlignment (const std::string &key, const CondAttrListCollection *obj=nullptr, GeoVAlignmentStore *alignStore=nullptr) const override
 Comply with InDetDetectorManager interface (not implemented for SCT)
void addMotherDesign (std::unique_ptr< const SCT_ModuleSideDesign > &&)
int getStripEndcapEtaNeighbour (const SiDetectorElement *element, IdentifierHash &idHashNeighbour, const bool phi_plus_one=false) const
virtual bool setAlignableTransformDelta (int level, const Identifier &id, const Amg::Transform3D &delta, FrameType frame, GeoVAlignmentStore *alignStore) const override
 implements the main alignment update for delta transforms in different frames, it translates into the LocalDelta or GlobalDelta function of SiDetectorManager
const SCT_DetectorManageroperator= (const SCT_DetectorManager &right)=delete
 Prevent assign operator.
 SCT_DetectorManager (const SCT_DetectorManager &right)=delete
 Prevent copy constructor.
virtual const SCT_IDgetIdHelper () const override

Detailed Description

Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated SCT information, access.

Author
: Grant Gorfine
  • modified and maintained by Nick Styles & Andreas Salzburger

Definition at line 49 of file SCT_DetectorManager.h.

Member Typedef Documentation

◆ AlignableTransformMap

Definition at line 177 of file SCT_DetectorManager.h.

Constructor & Destructor Documentation

◆ SCT_DetectorManager() [1/3]

InDetDD::SCT_DetectorManager::SCT_DetectorManager ( StoreGateSvc * detStore)

Constructor.

Definition at line 25 of file SCT_DetectorManager.cxx.

26 : SCT_DetectorManager(detStore, "SCT") {}
SCT_DetectorManager(StoreGateSvc *detStore)
Constructor.

◆ SCT_DetectorManager() [2/3]

InDetDD::SCT_DetectorManager::SCT_DetectorManager ( StoreGateSvc * detStore,
const std::string & name,
const bool doEncapNeighbour = false )

Constructur with name.

Definition at line 28 of file SCT_DetectorManager.cxx.

31 : SiDetectorManager(detStore,name),
32 m_idHelper(nullptr),
33 m_isLogical(false), // Change to true to change the definition of local module corrections
34 m_doEndcapEtaNeighbour(doEndcapEtaNeighbour)
35 {
36 ATH_MSG_VERBOSE("Creating SCT_DetectorManager named " << name);
37 //
38 // Initialized the Identifier helper.
39 //
40 StatusCode sc = detStore->retrieve(m_idHelper, "SCT_ID");
41 if (sc.isFailure()) {
42 ATH_MSG_ERROR("Could not retrieve SCT id helper");
43 }
44 // Initialize the collections.
45 if (m_idHelper) {
46 m_elementCollection.resize(m_idHelper->wafer_hash_max());
47 m_alignableTransforms.resize(m_idHelper->wafer_hash_max());
48 m_moduleAlignableTransforms.resize(m_idHelper->wafer_hash_max()/2);
49 }
50 }
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
static Double_t sc
std::vector< std::unique_ptr< ExtendedAlignableTransform > > m_moduleAlignableTransforms
SiDetectorElementCollection m_elementCollection
bool m_isLogical
This variable switches the how the local alignment corrections are applied If true they will be calcu...
std::vector< std::unique_ptr< ExtendedAlignableTransform > > m_alignableTransforms
SiDetectorManager(StoreGateSvc *detStore, const std::string &name)
::StatusCode StatusCode
StatusCode definition for legacy code.

◆ SCT_DetectorManager() [3/3]

InDetDD::SCT_DetectorManager::SCT_DetectorManager ( const SCT_DetectorManager & right)
privatedelete

Prevent copy constructor.

Member Function Documentation

◆ addAlignableTransform() [1/3]

void InDetDD::SCT_DetectorManager::addAlignableTransform ( int level,
const Identifier & id,
GeoAlignableTransform * xf,
const GeoVFullPhysVol * child )
virtual

Add alignable transforms. No access to these, they will be changed by manager:

Definition at line 353 of file SCT_DetectorManager.cxx.

357 {
358 if (m_idHelper) {
359 if (level == 0) {
360 // Element
361 IdentifierHash idHash = m_idHelper->wafer_hash(id);
362 if (idHash.is_valid()) {
363 m_alignableTransforms[idHash] = std::make_unique<ExtendedAlignableTransform>(transform, child);
364 }
365 } else if (level == 1) {
366 // Module
367 IdentifierHash idHash = m_idHelper->wafer_hash(id);
368 if (idHash.is_valid()) {
369 m_moduleAlignableTransforms[idHash/2] = std::make_unique<ExtendedAlignableTransform>(transform, child);
370 }
371
372 } else {
373
374 // Higher levels are saved in a map. NB level=0,1 is treated above.
375 int index = level - FIRST_HIGHER_LEVEL; // level 0 and 1 is treated separately.
376 if (index >= static_cast<int>(m_higherAlignableTransforms.size())) m_higherAlignableTransforms.resize(index+1);
377 m_higherAlignableTransforms[index][id] = std::make_unique<ExtendedAlignableTransform>(transform, child);
378 }
379 }
380 }
bool is_valid() const
Check if id is in a valid state.
std::vector< AlignableTransformMap > m_higherAlignableTransforms
str index
Definition DeMoScan.py:362
const int FIRST_HIGHER_LEVEL

◆ addAlignableTransform() [2/3]

void InDetDD::SCT_DetectorManager::addAlignableTransform ( int level,
const Identifier & id,
GeoAlignableTransform * xf,
const GeoVPhysVol * child )
virtual

As above but does a dynamic_cast to GeoVFullPhysVol.

Definition at line 337 of file SCT_DetectorManager.cxx.

341 {
342 if (m_idHelper) {
343
344 const GeoVFullPhysVol * childFPV = dynamic_cast<const GeoVFullPhysVol *>(child);
345 if (!childFPV) {
346 ATH_MSG_ERROR("Child of alignable transform is not a full physical volume");
347 } else {
348 addAlignableTransform (level, id, transform, childFPV);
349 }
350 }
351 }
virtual void addAlignableTransform(int level, const Identifier &id, GeoAlignableTransform *xf, const GeoVFullPhysVol *child)
Add alignable transforms. No access to these, they will be changed by manager:

◆ addAlignableTransform() [3/3]

virtual void InDetDD::SCT_DetectorManager::addAlignableTransform ( int ,
const Identifier & ,
GeoAlignableTransform *  )
inlineoverridevirtual

DEPRECATED For backward compatibility.

Implements InDetDD::SiDetectorManager.

Definition at line 111 of file SCT_DetectorManager.h.

111{};

◆ addAlignFolderType()

void InDetDD::InDetDetectorManager::addAlignFolderType ( const AlignFolderType alignfolder)
inherited

Definition at line 81 of file InDetDetectorManager.cxx.

82 {
83 m_alignfoldertype = alignfolder;
84 }

◆ addChannel()

void InDetDD::InDetDetectorManager::addChannel ( const std::string & key,
int level,
FrameType frame )
inherited

Alignment access.

Definition at line 56 of file InDetDetectorManager.cxx.

57 {
58 std::string frameStr = "other";
59 if (frame == InDetDD::global) frameStr = "global";
60 if (frame == InDetDD::local) frameStr = "local";
61 ATH_MSG_INFO("Registering alignment channel with key " << key << ", level " << level
62 << ", with frame " << frameStr << ".");
63 m_keys[key] = LevelInfo(level, frame);
64 }
#define ATH_MSG_INFO(x)
std::map< std::string, LevelInfo > m_keys

◆ addDesign()

const SiDetectorDesign * InDetDD::SiDetectorManager::addDesign ( std::unique_ptr< const SiDetectorDesign > && design)
inherited

Access to module design; returns an observer pointer.

Definition at line 134 of file SiDetectorManager.cxx.

135 {
136 m_designs.push_back(std::move(design));
137 return m_designs.back().get();
138 }
std::vector< std::unique_ptr< const SiDetectorDesign > > m_designs

◆ addDetectorElement()

void InDetDD::SCT_DetectorManager::addDetectorElement ( SiDetectorElement * element)
overridevirtual

Add elememts during construction.

Implements InDetDD::SiDetectorManager.

Definition at line 117 of file SCT_DetectorManager.cxx.

118 {
119 IdentifierHash idHash = element->identifyHash();
120 if (idHash >= m_elementCollection.size())
121 throw std::runtime_error("SCT_DetectorManager: Error adding detector element.");
122 m_elementCollection[idHash] = element;
123 }
virtual IdentifierHash identifyHash() const override final
identifier hash (inline)

◆ addFolder()

void InDetDD::InDetDetectorManager::addFolder ( const std::string & key)
inherited

Definition at line 66 of file InDetDetectorManager.cxx.

67 {
68 m_folders.insert(key);
69 }
std::set< std::string > m_folders

◆ addGlobalFolder()

void InDetDD::InDetDetectorManager::addGlobalFolder ( const std::string & key)
inherited

Definition at line 76 of file InDetDetectorManager.cxx.

77 {
78 m_globalFolders.insert(key);
79 }
std::set< std::string > m_globalFolders

◆ addMotherDesign()

void InDetDD::SCT_DetectorManager::addMotherDesign ( std::unique_ptr< const SCT_ModuleSideDesign > && motherDesign)

Definition at line 473 of file SCT_DetectorManager.cxx.

473 {
474 m_motherDesigns.push_back(std::move(motherDesign));
475 }
std::vector< std::unique_ptr< const SCT_ModuleSideDesign > > m_motherDesigns

◆ addSpecialFolder()

void InDetDD::InDetDetectorManager::addSpecialFolder ( const std::string & key)
inherited

Definition at line 71 of file InDetDetectorManager.cxx.

72 {
73 m_specialFolders.insert(key);
74 }
std::set< std::string > m_specialFolders

◆ addTreeTop()

void InDetDD::SCT_DetectorManager::addTreeTop ( const PVConstLink & vol)

Add tree top.

Definition at line 62 of file SCT_DetectorManager.cxx.

62 {
63 m_volume.push_back(vol);
64 }
std::vector< PVConstLink > m_volume

◆ align() [1/2]

StatusCode InDetDD::InDetDetectorManager::align ( const RawAlignmentObjects & alignObjects,
GeoVAlignmentStore * alignStore ) const
inherited

Definition at line 209 of file InDetDetectorManager.cxx.

210 {
211
212 ATH_MSG_DEBUG("align() called from an alignment CondAlg");
213 if (!getIdHelper()) return StatusCode::SUCCESS; // To Do: is it really a success?
214
215 bool alignmentChange = false;
216 // const AlignInfo &aligninfo = AlignInfo(m_alignfoldertype);
217
218 for(const auto& alignObj : alignObjects) {
219 const std::string& key = alignObj.first;
220
221 ATH_MSG_DEBUG(" Processing folder " << key);
222
223 if(m_globalFolders.find(key)!=m_globalFolders.end()) {
224 try {
225 // New global alignemnts
226 const CondAttrListCollection* obj = static_cast<const CondAttrListCollection*>(alignObj.second);
227 bool status = processGlobalAlignmentContainer(key,obj,alignStore);
228 alignmentChange = (alignmentChange || status);
229 } catch(std::runtime_error& err) {
230 // alignments should always exist so we return fatal if we could not process the alignment for this key
231 ATH_MSG_FATAL(err.what());
232 return StatusCode::FAILURE;
233 }
234 }
235 else if(m_folders.find(key)!=m_folders.end()) {
236 try {
237 // Regular alignemnts
238 const AlignableTransformContainer* container = static_cast<const AlignableTransformContainer*>(alignObj.second);
239 bool status = processAlignmentContainer(container,alignStore);
240 alignmentChange = (alignmentChange || status);
241 } catch(std::runtime_error& err) {
242 // alignments should always exist so we return fatal if we could not process the alignment for this key
243 ATH_MSG_FATAL(err.what());
244 return StatusCode::FAILURE;
245 }
246 }
247 else if(m_specialFolders.find(key)!=m_specialFolders.end()) {
248 try {
249 // Detector specific alignments
250 const CondAttrListCollection *obj =
251 static_cast<const CondAttrListCollection*>(alignObj.second);
252 bool status = processSpecialAlignment(key, obj, alignStore);
253 alignmentChange = (alignmentChange || status);
254 }
255 catch(std::runtime_error& err) {
256 // Should always exist if the folder was requested so we return fatal if
257 // we could not process the alignment for this key
258 ATH_MSG_FATAL(err.what());
259 return StatusCode::FAILURE;
260 }
261 }
262 else {
263 // Should not be any other keys specified in raw alignment object.
264 ATH_MSG_ERROR("Unrecognized folder name "<<key<<". Expected names are:");
265 for (const std::string& out:m_globalFolders) ATH_MSG_ERROR("--"<<out);
266 for (const std::string& out:m_folders) ATH_MSG_ERROR("--"<<out);
267 for (const std::string& out:m_specialFolders) ATH_MSG_ERROR("--"<<out);
268
269 return StatusCode::RECOVERABLE;
270 }
271 }
272 return StatusCode::SUCCESS;
273 }
CondMultChanCollection< AlignableTransform > AlignableTransformContainer
#define ATH_MSG_FATAL(x)
#define ATH_MSG_DEBUG(x)
virtual bool processSpecialAlignment(const std::string &key, InDetDD::AlignFolderType alignfolder)=0
bool processGlobalAlignmentContainer(const std::string &key, const CondAttrListCollection *obj=nullptr, GeoVAlignmentStore *alignStore=nullptr) const
virtual const AtlasDetectorID * getIdHelper() const =0
bool processAlignmentContainer(const std::string &key) const
return align folder string to use
status
Definition merge.py:16

◆ align() [2/2]

StatusCode InDetDD::InDetDetectorManager::align ( IOVSVC_CALLBACK_ARGS )
inherited

◆ getDesign()

const SiDetectorDesign * InDetDD::SiDetectorManager::getDesign ( int i) const
inherited

Definition at line 146 of file SiDetectorManager.cxx.

147 {
148 return m_designs[i].get();
149 }

◆ getDetectorElement() [1/3]

const SiDetectorElement * InDetDD::SCT_DetectorManager::getDetectorElement ( const Identifier & id) const
overridevirtual

access to individual elements via Identifier

Implements InDetDD::SiDetectorManager.

Definition at line 66 of file SCT_DetectorManager.cxx.

67 {
68 // NB the id helpers implementation for getting a hash is not optimal.
69 // Essentially does a binary search.
70 // Make sure it is a wafer Id
71 Identifier waferId = m_idHelper->wafer_id(id);
72 IdentifierHash idHash = m_idHelper->wafer_hash(waferId);
73 if (idHash.is_valid()) {
74 return m_elementCollection[idHash];
75 } else {
76 return nullptr;
77 }
78 }

◆ getDetectorElement() [2/3]

const SiDetectorElement * InDetDD::SCT_DetectorManager::getDetectorElement ( const IdentifierHash & idHash) const
overridevirtual

access to individual elements via IdentifierHash

Implements InDetDD::SiDetectorManager.

Definition at line 80 of file SCT_DetectorManager.cxx.

81 {
82 return m_elementCollection[idHash];
83 }

◆ getDetectorElement() [3/3]

const SiDetectorElement * InDetDD::SCT_DetectorManager::getDetectorElement ( int barrel_endcap,
int layer_wheel,
int phi_module,
int eta_module,
int side ) const

access to individual elements via module numbering schema

Definition at line 85 of file SCT_DetectorManager.cxx.

86 {
87 return getDetectorElement(m_idHelper->wafer_id(barrel_endcap, layer_wheel, phi_module, eta_module, side));
88 }
virtual const SiDetectorElement * getDetectorElement(const Identifier &id) const override
access to individual elements via Identifier

◆ getDetectorElementBegin() [1/2]

SiDetectorElementCollection::const_iterator InDetDD::SCT_DetectorManager::getDetectorElementBegin ( ) const
overridevirtual

Implements InDetDD::SiDetectorManager.

Definition at line 95 of file SCT_DetectorManager.cxx.

96 {
97 return m_elementCollection.begin();
98 }

◆ getDetectorElementBegin() [2/2]

SiDetectorElementCollection::iterator InDetDD::SCT_DetectorManager::getDetectorElementBegin ( )
overridevirtual

Implements InDetDD::SiDetectorManager.

Definition at line 105 of file SCT_DetectorManager.cxx.

106 {
107 return m_elementCollection.begin();
108 }

◆ getDetectorElementCollection()

const SiDetectorElementCollection * InDetDD::SCT_DetectorManager::getDetectorElementCollection ( ) const
overridevirtual

access to whole collectiom

Implements InDetDD::SiDetectorManager.

Definition at line 90 of file SCT_DetectorManager.cxx.

91 {
92 return &m_elementCollection;
93 }

◆ getDetectorElementEnd() [1/2]

SiDetectorElementCollection::const_iterator InDetDD::SCT_DetectorManager::getDetectorElementEnd ( ) const
overridevirtual

Implements InDetDD::SiDetectorManager.

Definition at line 100 of file SCT_DetectorManager.cxx.

101 {
102 return m_elementCollection.end();
103 }

◆ getDetectorElementEnd() [2/2]

SiDetectorElementCollection::iterator InDetDD::SCT_DetectorManager::getDetectorElementEnd ( )
overridevirtual

Implements InDetDD::SiDetectorManager.

Definition at line 110 of file SCT_DetectorManager.cxx.

111 {
112 return m_elementCollection.end();
113 }

◆ getIdHelper()

const SCT_ID * InDetDD::SCT_DetectorManager::getIdHelper ( ) const
overrideprivatevirtual

Implements InDetDD::InDetDetectorManager.

Definition at line 235 of file SCT_DetectorManager.cxx.

236 {
237 return m_idHelper;
238 }

◆ getLayout()

const std::string & InDetDD::InDetDetectorManager::getLayout ( ) const
inherited

Definition at line 38 of file InDetDetectorManager.cxx.

39 {
40 return m_version.layout();
41 }

◆ getLevel()

const InDetDetectorManager::LevelInfo & InDetDD::InDetDetectorManager::getLevel ( const std::string & key) const
privateinherited

Retrieve level information.

Definition at line 87 of file InDetDetectorManager.cxx.

88 {
89 std::map<std::string, LevelInfo>::const_iterator iter;
90 iter = m_keys.find(key);
91 if (iter == m_keys.end()) return s_invalidLevel;
92 return iter->second;
93 }
static const LevelInfo s_invalidLevel

◆ getNumTreeTops()

unsigned int InDetDD::SCT_DetectorManager::getNumTreeTops ( ) const
overridevirtual

Definition at line 52 of file SCT_DetectorManager.cxx.

53 {
54 return m_volume.size();
55 }

◆ getSCT_Design()

const SCT_ModuleSideDesign * InDetDD::SCT_DetectorManager::getSCT_Design ( int i) const

Access to module design, casts to SCT_ModuleSideDesign.

Definition at line 389 of file SCT_DetectorManager.cxx.

390 {
391 return dynamic_cast<const SCT_ModuleSideDesign *>(getDesign(i));
392 }
const SiDetectorDesign * getDesign(int i) const

◆ getStripEndcapEtaNeighbour()

int InDetDD::SCT_DetectorManager::getStripEndcapEtaNeighbour ( const SiDetectorElement * element,
IdentifierHash & idHashNeighbour,
const bool phi_plus_one = false ) const
private

Definition at line 176 of file SCT_DetectorManager.cxx.

179{
180 // Check we are well in strip endcap
181 if( !(element->isSCT() && element->isEndcap()) ) return 1;
182
183 // Now we try to find a neighbour at larger radius
184 Identifier id = element->identify();
185 int bec = m_idHelper->barrel_ec(id);
186 int layer_disk = m_idHelper->layer_disk(id);
187 int phi_module = m_idHelper->phi_module(id);
188 int eta_module = m_idHelper->eta_module(id);
189 int side = m_idHelper->side(id);
190
191 // We want to find neighbour only for elements on "main" side
192 // since the space points are made from trigger cluster (on side 0 for ITk)
193 // and stero cluster (on side 1 for ITk)
194 if(element->isStereo()) return 1;
195
196 // Most of the time we want to find neighbours in same phi
197 // but in transition region (eta_module 9->10) the module granularity in phi changes
198 // we have to look for two neighours, at: 2*phi and 2*phi+1
199 int target_phi = phi_module;
200 if (eta_module==9) target_phi = (phi_plus_one)? 2*phi_module+1 : 2*phi_module;
201
202 // Brute force search, loop on all elements to find a neighbour
203 for(const SiDetectorElement* other_element : m_elementCollection){
204
205 Identifier other_id = other_element->identify();
206
207 // To speed up the search, screening firt on bec, then layer_disk, etc...
208 int other_bec = m_idHelper->barrel_ec(other_id);
209 if(other_bec != bec) continue;
210
211 int other_layer_disk = m_idHelper->layer_disk(other_id);
212 if(other_layer_disk != layer_disk) continue;
213
214 int other_phi_module = m_idHelper->phi_module(other_id);
215 if(other_phi_module != target_phi) continue;
216
217 // We keep only neighbour at eta_module+1 (larger radius)
218 int other_eta_module = m_idHelper->eta_module(other_id);
219 if( (other_eta_module-eta_module) != 1 ) continue;
220
221 // We keep only neighbour on stereo side (side=1 for ITk)
222 int other_side = m_idHelper->side(other_id);
223 if(other_side==side) continue;
224
225 // If we are here, we found it!
226 idHashNeighbour = other_element->identifyHash();
227 ATH_MSG_VERBOSE(__FUNCTION__<<"found strip endcap neighbour for id="<<id<<" neigh="<<other_id
228 <<" eta:"<<eta_module<<" "<<other_eta_module);
229 return 0;
230 }
231
232 return 1;
233}
virtual Identifier identify() const override final
identifier of this detector element (inline)
bool isSCT() const
bool isEndcap() const
bool isStereo() const
Check if it is the stereo side (useful for SCT)

◆ getTreeTop()

PVConstLink InDetDD::SCT_DetectorManager::getTreeTop ( unsigned int i) const
overridevirtual

Definition at line 57 of file SCT_DetectorManager.cxx.

58 {
59 return m_volume[i];
60 }

◆ getVersion()

const Version & InDetDD::InDetDetectorManager::getVersion ( ) const
inherited

Get version information.

Definition at line 33 of file InDetDetectorManager.cxx.

34 {
35 return m_version;
36 }

◆ identifierBelongs()

bool InDetDD::SCT_DetectorManager::identifierBelongs ( const Identifier & id) const
overridevirtual

Check identifier is for this detector.

Implements InDetDD::InDetDetectorManager.

Definition at line 383 of file SCT_DetectorManager.cxx.

384 {
385 return getIdHelper()->is_sct(id);
386 }
bool is_sct(Identifier id) const
virtual const SCT_ID * getIdHelper() const override

◆ initMessaging()

void AthMessaging::initMessaging ( ) const
privateinherited

Initialize our message level and MessageSvc.

This method should only be called once.

Definition at line 39 of file AthMessaging.cxx.

40{
42 // If user did not set an explicit level, set a default
43 if (m_lvl == MSG::NIL) {
44 m_lvl = m_imsg ?
45 static_cast<MSG::Level>( m_imsg.load()->outputLevel(m_nm) ) :
46 MSG::INFO;
47 }
48}
std::string m_nm
Message source name.
std::atomic< IMessageSvc * > m_imsg
MessageSvc pointer.
std::atomic< MSG::Level > m_lvl
Current logging level.
IMessageSvc * getMessageSvc(bool quiet=false)

◆ initNeighbours()

void InDetDD::SCT_DetectorManager::initNeighbours ( )
overridevirtual

Initialize the neighbours. This can only be done when all elements are built.

Implements InDetDD::SiDetectorManager.

Definition at line 125 of file SCT_DetectorManager.cxx.

126 {
128
129 // Loop over all elements and set the neighbours
130 for (iter = m_elementCollection.begin(); iter != m_elementCollection.end(); ++iter){
131
132 SiDetectorElement * element = *iter;
133 if (element) {
134
135 IdentifierHash idHash = element->identifyHash();
136 IdentifierHash idHashOther;
137
138 int result;
139 // If no neighbour, result != 0 in which case we leave neighbour as null
140 if(element->isBarrel()){
141 result = m_idHelper->get_next_in_eta(idHash, idHashOther);
142 if (result==0) element->setNextInEta(m_elementCollection[idHashOther]);
143 }
144 else if(m_doEndcapEtaNeighbour){
145 // In endcaps the neighbours cannot be found with id+/-1, therefore we cannot rely on SCT_ID and need
146 // a dedicated search, considering only neighbour at larger radius (compatible wih outgoing particle)
147 result = getStripEndcapEtaNeighbour(element, idHashOther, false);
148 if(result==0) element->setNextInEta(m_elementCollection[idHashOther]);
149
150 // In ITk strip endcap, when we move from eta_module=9 to eta_module=10 we have change of module
151 // granularity in phi: twice more module in eta_module=10, therefore for module at eta_module=9
152 // and phi_module=phi we have two neighbours at larger radius: both at eta_module=10, but one with
153 // phi_module=2*phi the other with phi_module=2*phi+1, for completeness we store this neighbour in
154 // "PrevInEta" even if it is a misnomer in this case
155 if( m_idHelper->eta_module(element->identify())==9 ){
156 result = getStripEndcapEtaNeighbour(element, idHashOther, true);
157 if(result==0) element->setPrevInEta(m_elementCollection[idHashOther]);
158 }
159 }
160
161 result = m_idHelper->get_prev_in_eta(idHash, idHashOther);
162 if (result==0) element->setPrevInEta(m_elementCollection[idHashOther]);
163
164 result = m_idHelper->get_next_in_phi(idHash, idHashOther);
165 if (result==0) element->setNextInPhi(m_elementCollection[idHashOther]);
166
167 result = m_idHelper->get_prev_in_phi(idHash, idHashOther);
168 if (result==0) element->setPrevInPhi(m_elementCollection[idHashOther]);
169
170 result = m_idHelper->get_other_side(idHash, idHashOther);
171 if (result==0) element->setOtherSide(m_elementCollection[idHashOther]);
172 }
173 }
174 }
DataModel_detail::iterator< DataVector > iterator
Definition DataVector.h:842
int getStripEndcapEtaNeighbour(const SiDetectorElement *element, IdentifierHash &idHashNeighbour, const bool phi_plus_one=false) const
void setPrevInEta(const SiDetectorElement *element)
void setPrevInPhi(const SiDetectorElement *element)
void setNextInEta(const SiDetectorElement *element)
void setOtherSide(const SiDetectorElement *element)
For SCT only.
void setNextInPhi(const SiDetectorElement *element)
bool isBarrel() const

◆ invalidateAll()

void InDetDD::SiDetectorManager::invalidateAll ( )
virtualinherited

Invalidate cache for all detector elements.

Implements InDetDD::InDetDetectorManager.

Definition at line 39 of file SiDetectorManager.cxx.

40 {
42 element_iter != getDetectorElementEnd();
43 ++element_iter) {
44
45 if (*element_iter) {
46 (*element_iter)->invalidate();
47 }
48 }
49 }
virtual SiDetectorElementCollection::const_iterator getDetectorElementEnd() const =0
virtual SiDetectorElementCollection::const_iterator getDetectorElementBegin() const =0

◆ isPixel()

virtual bool InDetDD::SCT_DetectorManager::isPixel ( ) const
inlineoverridevirtual

Methods to query which manager we have.

Implements InDetDD::SiDetectorManager.

Definition at line 117 of file SCT_DetectorManager.h.

117{return false;}

◆ isSCT()

bool InDetDD::SiDetectorManager::isSCT ( ) const
inlineinherited

Definition at line 100 of file SiDetectorManager.h.

100{return !isPixel();}
virtual bool isPixel() const =0
Methods to query which manager we have.

◆ msg() [1/2]

MsgStream & AthMessaging::msg ( ) const
inlineinherited

The standard message stream.

Returns a reference to the default message stream May not be invoked before sysInitialize() has been invoked.

Definition at line 163 of file AthMessaging.h.

164{
165 MsgStream* ms = m_msg_tls.get();
166 if (!ms) {
167 if (!m_initialized.test_and_set()) initMessaging();
168 ms = new MsgStream(m_imsg,m_nm);
169 m_msg_tls.reset( ms );
170 }
171
172 ms->setLevel (m_lvl);
173 return *ms;
174}
boost::thread_specific_ptr< MsgStream > m_msg_tls
MsgStream instance (a std::cout like with print-out levels)
void initMessaging() const
Initialize our message level and MessageSvc.

◆ msg() [2/2]

MsgStream & AthMessaging::msg ( const MSG::Level lvl) const
inlineinherited

The standard message stream.

Returns a reference to the default message stream May not be invoked before sysInitialize() has been invoked.

Definition at line 178 of file AthMessaging.h.

179{ return msg() << lvl; }
MsgStream & msg() const
The standard message stream.

◆ msgLvl()

bool AthMessaging::msgLvl ( const MSG::Level lvl) const
inlineinherited

Test the output level.

Parameters
lvlThe message level to test against
Returns
boolean Indicating if messages at given level will be printed
Return values
trueMessages at level "lvl" will be printed

Definition at line 151 of file AthMessaging.h.

152{
153 if (m_lvl <= lvl) {
154 msg() << lvl;
155 return true;
156 } else {
157 return false;
158 }
159}

◆ numDesigns()

int InDetDD::SiDetectorManager::numDesigns ( ) const
inherited

Definition at line 140 of file SiDetectorManager.cxx.

141 {
142 return m_designs.size();
143 }

◆ numerology() [1/2]

SiNumerology & InDetDD::SiDetectorManager::numerology ( )
inlineinherited

Definition at line 129 of file SiDetectorManager.h.

129{return m_numerology;}

◆ numerology() [2/2]

const SiNumerology & InDetDD::SiDetectorManager::numerology ( ) const
inlineinherited

Access Numerology.

Definition at line 128 of file SiDetectorManager.h.

128{return m_numerology;}

◆ operator=()

const SCT_DetectorManager & InDetDD::SCT_DetectorManager::operator= ( const SCT_DetectorManager & right)
privatedelete

Prevent assign operator.

◆ processAlignmentContainer() [1/2]

bool InDetDD::InDetDetectorManager::processAlignmentContainer ( const AlignableTransformContainer * container,
GeoVAlignmentStore * alignStore ) const
privateinherited

Definition at line 303 of file InDetDetectorManager.cxx.

304 {
305 bool alignmentChange = false;
306
307 // Check if container is empty - this can occur if it is an invalid IOV.
308 if (container->empty()) {
309 ATH_MSG_ERROR("AlignableTransformContainer "
310 << " is empty. Probably due to out of range IOV"); // To Do: add key to this printout for making it more informative
311 // This should not occur in normal situations so we force job to abort.
312 throw std::runtime_error("Unable to apply Inner Detector alignments.");
313 }
314 // loop over all the AlignableTransform objects in the collection
315 // use only the last ones.
316 // /Indet/AlignL3/SCTEA9 appear repeatedly in tags of the /Indet/AlignL3 folder
317 std::map<const std::string, const AlignableTransform*> stringToTransform;
318 for (const auto *pat : *container) {
319 stringToTransform[pat->tag()] = pat;
320 }
321 for (const std::pair<const std::string, const AlignableTransform*>& value: stringToTransform) {
322 bool status = processKey(value.first, value.second, alignStore);
323 alignmentChange = (alignmentChange || status);
324 }
325 return alignmentChange;
326 }
bool empty() const noexcept
Returns true if the collection is empty.
bool processKey(const std::string &key, const AlignableTransform *transformCollection, GeoVAlignmentStore *alignStore=nullptr) const
Called by processAlignmentContainer, applies only one key on the transform Collections.

◆ processAlignmentContainer() [2/2]

bool InDetDD::InDetDetectorManager::processAlignmentContainer ( const std::string & key) const
privateinherited

return align folder string to use

Process the alignment container, calls processKey

Definition at line 275 of file InDetDetectorManager.cxx.

276 {
277 bool alignmentChange = false;
278
279 ATH_MSG_DEBUG("Dealing with key as container");
280 const AlignableTransformContainer* container;
281 if (StatusCode::SUCCESS!=m_detStore->retrieve(container, key)) {
282 ATH_MSG_ERROR("Cannot find AlignableTransformContainer for key "
283 << key << " - no misalignment");
284 // This should not occur in normal situations so we force job to abort.
285 throw std::runtime_error("Unable to apply Inner Detector alignments");
286 }
287 // Check if container is empty - this can occur if it is an invalid IOV.
288 if (container->empty()) {
289 ATH_MSG_ERROR("AlignableTransformContainer for key "
290 << key << " is empty. Probably due to out of range IOV");
291 // This should not occur in normal situations so we force job to abort.
292 throw std::runtime_error("Unable to apply Inner Detector alignments.");
293 }
294 // loop over all the AlignableTransform objects in the collection
295 for (const auto *pat : *container) {
296
297 bool status = processKey(pat->tag(),pat);
298 alignmentChange = (alignmentChange || status);
299 }
300 return alignmentChange;
301 }

◆ processGlobalAlignment()

bool InDetDD::SCT_DetectorManager::processGlobalAlignment ( const std::string & key,
int level,
FrameType frame,
const CondAttrListCollection * obj,
GeoVAlignmentStore * alignStore ) const
overridevirtual

Process new global DB folders for L1 and L2.

Reimplemented from InDetDD::InDetDetectorManager.

Definition at line 395 of file SCT_DetectorManager.cxx.

397 {
398 ATH_MSG_INFO("Processing new global alignment containers with key " << key << " in the " << frame << " frame at level ");
399
400 const CondAttrListCollection* atrlistcol=obj;
401 if(atrlistcol==nullptr and m_detStore->retrieve(atrlistcol,key)!=StatusCode::SUCCESS) {
402 ATH_MSG_WARNING("Cannot find new global align Container for key "
403 << key << " - no new global alignment ");
404 return false;
405 }
406
407 bool alignmentChange = false;
408 Identifier ident=Identifier();
409
410 // loop over objects in collection
411 for (CondAttrListCollection::const_iterator citr=atrlistcol->begin(); citr!=atrlistcol->end();++citr) {
412 const coral::AttributeList& atrlist=citr->second;
413 // SCT manager, therefore ignore all that is not a SCT Identifier
414 if (atrlist["det"].data<int>()!=2) continue;
415
416 ident = getIdHelper()->wafer_id(atrlist["bec"].data<int>(),
417 atrlist["layer"].data<int>(),
418 atrlist["ring"].data<int>(),
419 atrlist["sector"].data<int>(),
420 0); // The last is the module side which is at this ident-level always the 0-side
421
422 // construct new transform
423 // Order of rotations is defined as around z, then y, then x.
424 Amg::Translation3D newtranslation(atrlist["Tx"].data<float>(),atrlist["Ty"].data<float>(),atrlist["Tz"].data<float>());
425 Amg::Transform3D newtrans = newtranslation * Amg::RotationMatrix3D::Identity();
426 newtrans *= Amg::AngleAxis3D(atrlist["Rz"].data<float>()*CLHEP::mrad, Amg::Vector3D(0.,0.,1.));
427 newtrans *= Amg::AngleAxis3D(atrlist["Ry"].data<float>()*CLHEP::mrad, Amg::Vector3D(0.,1.,0.));
428 newtrans *= Amg::AngleAxis3D(atrlist["Rx"].data<float>()*CLHEP::mrad, Amg::Vector3D(1.,0.,0.));
429
430 ATH_MSG_DEBUG("New global DB -- channel: " << citr->first
431 << " ,det: " << atrlist["det"].data<int>()
432 << " ,bec: " << atrlist["bec"].data<int>()
433 << " ,layer: " << atrlist["layer"].data<int>()
434 << " ,ring: " << atrlist["ring"].data<int>()
435 << " ,sector: " << atrlist["sector"].data<int>()
436 << " ,Tx: " << atrlist["Tx"].data<float>()
437 << " ,Ty: " << atrlist["Ty"].data<float>()
438 << " ,Tz: " << atrlist["Tz"].data<float>()
439 << " ,Rx: " << atrlist["Rx"].data<float>()
440 << " ,Ry: " << atrlist["Ry"].data<float>()
441 << " ,Rz: " << atrlist["Rz"].data<float>());
442
443 // Set the new transform; Will replace existing one with updated transform
445 ident,
446 newtrans,
447 frame,
448 alignStore);
449
450 if (!status) {
451 ATH_MSG_DEBUG("Cannot set AlignableTransform for identifier."
452 << getIdHelper()->show_to_string(ident)
453 << " at level " << level << " for new global DB ");
454 }
455
456 alignmentChange = (alignmentChange || status);
457 }
458 return alignmentChange;
459 }
#define ATH_MSG_WARNING(x)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
const_iterator end() const
const_iterator begin() const
Access to Chan/AttributeList pairs via iterators.
ChanAttrListMap::const_iterator const_iterator
virtual bool setAlignableTransformDelta(int level, const Identifier &id, const Amg::Transform3D &delta, FrameType frame, GeoVAlignmentStore *alignStore) const override
implements the main alignment update for delta transforms in different frames, it translates into the...
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module, int side) const
For a single side of module.
Definition SCT_ID.h:459
Eigen::AngleAxisd AngleAxis3D
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
Eigen::Translation< double, 3 > Translation3D
@ ident
Definition HitInfo.h:77

◆ processGlobalAlignmentContainer()

bool InDetDD::InDetDetectorManager::processGlobalAlignmentContainer ( const std::string & key,
const CondAttrListCollection * obj = nullptr,
GeoVAlignmentStore * alignStore = nullptr ) const
privateinherited

Definition at line 391 of file InDetDetectorManager.cxx.

394 {
395 bool alignmentChange = false;
396
397 ATH_MSG_DEBUG("processing GlobalAlignmentContainer with key: " << key);
398 // From the key determine what level in hierarchy we are dealing with.
399 // returns -1 if unrecognized.
400 const LevelInfo & levelInfo = getLevel(key);
401 if (levelInfo.isValid()) {
402 ATH_MSG_VERBOSE("Processing channel: " << key);
403 } else {
404 ATH_MSG_DEBUG("Channel " << key << " not registered in this manager");
405 }
406 // return silently if unrecognised - this can happen in container mode
407 // when a single container holds transforms for both pixel and SCT
408 if (!levelInfo.isValid() ) return false;
409
410 // Within detector specific code
411 bool status = processGlobalAlignment(key, levelInfo.level(), levelInfo.frame(), obj, alignStore);
412
413 alignmentChange = (alignmentChange || status);
414
415 return alignmentChange;
416
417 }
virtual bool processGlobalAlignment(const std::string &key, int level, FrameType frame, const CondAttrListCollection *obj=nullptr, GeoVAlignmentStore *alignStore=nullptr) const
const LevelInfo & getLevel(const std::string &key) const
Retrieve level information.

◆ processKey()

bool InDetDD::InDetDetectorManager::processKey ( const std::string & key,
const AlignableTransform * transformCollection,
GeoVAlignmentStore * alignStore = nullptr ) const
privateinherited

Called by processAlignmentContainer, applies only one key on the transform Collections.

Definition at line 328 of file InDetDetectorManager.cxx.

331 {
332 bool alignmentChange = false;
333
334 // From the key determine what level in hierarchy we are dealing with.
335 // returns -1 if unrecognized.
336 const LevelInfo & levelInfo = getLevel(key);
337 if (levelInfo.isValid()) {
338 ATH_MSG_VERBOSE("Processing channel: " << key);
339 } else {
340 ATH_MSG_DEBUG("Channel " << key << " not registered in this manager");
341 }
342 // return silently if unrecognised - this can happen in container mode
343 // when a single container holds transforms for both pixel and SCT
344 if (!levelInfo.isValid() ) return false;
345
346 //Loop over the effected nodes.
347 for (AlignableTransform::AlignTransMem_citr trans_iter = transformCollection->begin();
348 trans_iter != transformCollection->end();
349 ++trans_iter) {
350 ATH_MSG_DEBUG( "Get alignment for identifier "
351 << getIdHelper()->show_to_string(trans_iter->identify())
352 << " at level " << levelInfo.level());
353
354 // The delta in the conditions DB is not necessarily the same as what is needed in the
355 // alignable transform. At the moment we support global frame, local frame or an alternative frame
356 // The setAlignableTransformDelta method takes care of this correction - this is CLHEP <--> Amg interfaced
357 bool status = setAlignableTransformDelta(levelInfo.level(),
358 trans_iter->identify(),
359 Amg::CLHEPTransformToEigen(trans_iter->transform()),
360 levelInfo.frame(),
361 alignStore);
362
363 alignmentChange = (alignmentChange || status);
364
365 if (!status) {
366 if (!identifierBelongs(trans_iter->identify())) {
367 // Its probably OK. Eg /Indet/Align/ID contains alse pixel and sct ids.
368 ATH_MSG_DEBUG("Cannot set AlignableTransform for identifier."
369 << " Probably OK if its /Indet/Align/ID folder. "
370 << getIdHelper()->show_to_string(trans_iter->identify())
371 << " at level " << levelInfo.level());
372 } else {
373 if (m_suppressWarnings) {
374 ATH_MSG_DEBUG("WARNING: Cannot set AlignableTransform for identifier "
375 << getIdHelper()->show_to_string(trans_iter->identify())
376 << " at level " << levelInfo.level());
377 } else {
378 ATH_MSG_WARNING("Cannot set AlignableTransform for identifier "
379 << getIdHelper()->show_to_string(trans_iter->identify())
380 << " at level " << levelInfo.level());
381 ATH_MSG_WARNING("Subsequent WARNINGS will be printed at DEBUG level.");
382 m_suppressWarnings = true;
383 }
384 }
385 }
386 }
387 return alignmentChange;
388 }
std::vector< AlignTransMember >::const_iterator AlignTransMem_citr
AlignTransMem_citr end() const
AlignTransMem_citr begin() const
virtual bool identifierBelongs(const Identifier &id) const =0
Check identifier is for this detector.
virtual bool setAlignableTransformDelta(int level, const Identifier &id, const Amg::Transform3D &delta, FrameType frame, GeoVAlignmentStore *alignStore=nullptr) const =0
Set method applying the delta transform (in global or local frame) onto the geoModel transform : CLHE...
Amg::Transform3D CLHEPTransformToEigen(const HepGeom::Transform3D &CLHEPtransf)
Converts a CLHEP-based HepGeom::Transform3D into an Eigen Amg::Transform3D.

◆ processSpecialAlignment() [1/2]

bool InDetDD::SCT_DetectorManager::processSpecialAlignment ( const std::string & key,
const CondAttrListCollection * obj = nullptr,
GeoVAlignmentStore * alignStore = nullptr ) const
overridevirtual

Comply with InDetDetectorManager interface (not implemented for SCT)

Implements InDetDD::InDetDetectorManager.

Definition at line 466 of file SCT_DetectorManager.cxx.

468 {
469 return false;
470
471}

◆ processSpecialAlignment() [2/2]

bool InDetDD::SCT_DetectorManager::processSpecialAlignment ( const std::string & key,
InDetDD::AlignFolderType alignfolder )
overridevirtual

Comply with InDetDetectorManager interface (not implemented for SCT)

Implements InDetDD::InDetDetectorManager.

Definition at line 461 of file SCT_DetectorManager.cxx.

462 {
463 return false;
464}

◆ setAlignableTransformDelta()

bool InDetDD::SCT_DetectorManager::setAlignableTransformDelta ( int level,
const Identifier & id,
const Amg::Transform3D & delta,
FrameType frame,
GeoVAlignmentStore * alignStore ) const
overrideprivatevirtual

implements the main alignment update for delta transforms in different frames, it translates into the LocalDelta or GlobalDelta function of SiDetectorManager

Implements InDetDD::SiDetectorManager.

Definition at line 241 of file SCT_DetectorManager.cxx.

246 {
247
248 if (level == 0) { // 0 - At the element level
249
250 // We retrieve it via a hashId.
251 IdentifierHash idHash = m_idHelper->wafer_hash(id);
252 if (!idHash.is_valid()) return false;
253
254 if (frame == InDetDD::global) { // global shift
255 // Its a global transform
256 return setAlignableTransformGlobalDelta(m_alignableTransforms[idHash].get(), delta, alignStore);
257
258 } else if (frame == InDetDD::local) { // local shift
259
260 const SiDetectorElement * element = m_elementCollection[idHash];
261 if (!element) return false;
262
263
264 // Its a local transform
265 //See header file for definition of m_isLogical
266 if( m_isLogical ){
267 //Ensure cache is up to date and use the alignment corrected local to global transform
268 element->updateCache();
269 return setAlignableTransformLocalDelta(m_alignableTransforms[idHash].get(), element->transform(), delta, alignStore);
270 } else
271 //Use default local to global transform
272 return setAlignableTransformLocalDelta(m_alignableTransforms[idHash].get(), element->defTransform(), delta, alignStore);
273
274 } else {
275 // other not supported
276 ATH_MSG_WARNING("Frames other than global or local are not supported.");
277 return false;
278 }
279
280 } else if (level == 1) { // module level
281
282 // We retrieve it via a hashId.
283 IdentifierHash idHash = m_idHelper->wafer_hash(id);
284 if (!idHash.is_valid()) return false;
285
286 int idModuleHash = idHash / 2;
287
288 if (idHash%2) {
289 ATH_MSG_WARNING("Side 1 wafer id used for module id");
290 return false;
291 }
292
293 if (frame == InDetDD::global) { // global shift
294 // Its a global transform
295 return setAlignableTransformGlobalDelta(m_moduleAlignableTransforms[idModuleHash].get(), delta, alignStore);
296 } else if (frame == InDetDD::local) { // local shift
297 const SiDetectorElement * element = m_elementCollection[idHash];
298 if (!element) return false;
299
300 // Its a local transform
301 //See header file for definition of m_isLogical
302 if( m_isLogical ){
303 //Ensure cache is up to date and use the alignment corrected local to global transform
304 element->updateCache();
305 return setAlignableTransformLocalDelta(m_moduleAlignableTransforms[idModuleHash].get(), element->moduleTransform(), delta, alignStore);
306 } else
307 //Use default local to global transform
308 return setAlignableTransformLocalDelta(m_moduleAlignableTransforms[idModuleHash].get(), element->defModuleTransform(), delta, alignStore);
309
310 } else {
311 // other not supported
312 ATH_MSG_WARNING("Frames other than global or local are not supported.");
313 return false;
314 }
315
316 } else { // higher level
317
318 if (frame != InDetDD::global) {
319 ATH_MSG_WARNING("Non global shift at higher levels is not supported.");
320 return false;
321 }
322
323 int index = level - FIRST_HIGHER_LEVEL; // level 0 and 1 is treated separately.
324 if (index >= static_cast<int>(m_higherAlignableTransforms.size())) return false;
325
326 // We retrieve it from a map.
327 AlignableTransformMap::const_iterator iter;
329 if (iter == m_higherAlignableTransforms[index].end()) return false;
330
331 // Its a global transform
332 return setAlignableTransformGlobalDelta((iter->second).get(), delta, alignStore);
333 }
334
335 }
static bool setAlignableTransformGlobalDelta(ExtendedAlignableTransform *extXF, const Amg::Transform3D &delta, GeoVAlignmentStore *alignStore=nullptr)
Helper method to set delta transform from a global delta - Amg interface.
static bool setAlignableTransformLocalDelta(ExtendedAlignableTransform *extXF, const Amg::Transform3D &localToGlobalXF, const Amg::Transform3D &delta, GeoVAlignmentStore *alignStore=nullptr)
Helper method to set delta transform from a local delta - Amg interface.
virtual const Amg::Transform3D & transform() const override final
Return local to global transform.
virtual void updateCache() const
Recalculate cached values.
Amg::Transform3D defModuleTransform() const
Default module to global frame transform, ie with no misalignment.
const Amg::Transform3D & moduleTransform() const
Module to global frame transform.
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:130

◆ setAlignableTransformGlobalDelta()

bool InDetDD::SiDetectorManager::setAlignableTransformGlobalDelta ( ExtendedAlignableTransform * extXF,
const Amg::Transform3D & delta,
GeoVAlignmentStore * alignStore = nullptr )
staticinherited

Helper method to set delta transform from a global delta - Amg interface.

Definition at line 101 of file SiDetectorManager.cxx.

103 {
104 // ATTENTION -------------------------------------------------------- (A.S.)
105 // CLHEP < -- > AMG interface method
106
107 // Sets the alignable transform delta when the supplied delta is in the global frame.
108
109 // If the default transform down to the alignable transform is
110 // T = A*B*C
111 // and the alignable transform is C with delta c and the delta in the global frame is g, then
112 // A*B*C*c = g*A*B*C
113 // T*c = g*T
114 // c = T.inverse() * g * T
115
116 // To get default transform up and including the alignable transform,
117 // we assume the next volume down is a fullphys volume and so its
118 // transform is the transform we want (ie T=A*B*C in the above example).
119
120
121 if (!extXF) return false;
122
123 const GeoVFullPhysVol * child = extXF->child();
124 if (child && extXF->alignableTransform()) {
125 // do the calculation in CLHEP
126 const GeoTrf::Transform3D& transform = child->getDefAbsoluteTransform(alignStore);
127 extXF->alignableTransform()->setDelta(transform.inverse() * delta * transform, alignStore);
128 return true;
129 } else {
130 return false;
131 }
132 }
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.

◆ setAlignableTransformLocalDelta()

bool InDetDD::SiDetectorManager::setAlignableTransformLocalDelta ( ExtendedAlignableTransform * extXF,
const Amg::Transform3D & localToGlobalXF,
const Amg::Transform3D & delta,
GeoVAlignmentStore * alignStore = nullptr )
staticinherited

Helper method to set delta transform from a local delta - Amg interface.

Definition at line 62 of file SiDetectorManager.cxx.

66 {
67 // ATTENTION -------------------------------------------------------- (A.S.)
68 // CLHEP < -- > AMG interface method
69
70 // Sets the alignable transform delta when the supplied delta is in the local
71 // reconstruction frame
72
73 // If the default transform to the local recostruction frame is
74 // T = A*B*C*D*E
75 // and the alignable transform is C with delta c and the delat in the local frame is l, then
76 // A*B*C*c*D*E = A*B*C*D*E*l
77 // c = (D*E) * l * (D*E).inverse()
78 // c = (A*B*C).inverse * T * l * T.inverse() * (A*B*C)
79
80 // To get default transform up and including the alignable transform,
81 // we assume the next volume down is a fullphys volume and so its
82 // transform is the transform we want (ie A*B*C in the above example).
83
84 if (!extXF) return false;
85
86 const GeoVFullPhysVol* child = extXF->child();
87 if (child && extXF->alignableTransform()) {
88 // the definitiv absolut transform is in CLHEP -> do the calculation in CLHEP
89 const GeoTrf::Transform3D& transform = child->getDefAbsoluteTransform(alignStore);
90 // calucluate the corrected delta according to the formula above
91 GeoTrf::Transform3D correctedDelta = transform.inverse()*localToGlobalXF // (A*B*C).inverse() * T
92 * delta // l
93 * localToGlobalXF.inverse() * transform; // T.inverse() * (A*B*C)
94 extXF->alignableTransform()->setDelta(correctedDelta, alignStore);
95 return true;
96 } else {
97 return false;
98 }
99 }

◆ setCommonItems()

void InDetDD::SiDetectorManager::setCommonItems ( std::unique_ptr< const SiCommonItems > && commonItems)
inherited

Set SiCommonItems.

Definition at line 151 of file SiDetectorManager.cxx.

152 {
153 m_commonItems = std::move(commonItems);
154 }
std::unique_ptr< const SiCommonItems > m_commonItems

◆ setLevel()

void AthMessaging::setLevel ( MSG::Level lvl)
inherited

Change the current logging level.

Use this rather than msg().setLevel() for proper operation with MT.

Definition at line 28 of file AthMessaging.cxx.

29{
30 m_lvl = lvl;
31}

◆ setVersion()

void InDetDD::InDetDetectorManager::setVersion ( const Version & version)
inherited

Definition at line 43 of file InDetDetectorManager.cxx.

44 {
46
47 // Since default alignments are for final layout, Pixel Rome-Initial
48 // layout will result in several (harmless) WARNING message. We suppress these.
49 // Also the SR1 layout produce warnings due to missing parts. We suppress these also.
50 m_suppressWarnings = ( (getName() == "Pixel" &&
51 (version.tag() == "Pixel-01" || version.tag() == "Pixel-DC2-Initial-00"))
52 || version.layout() == "SR1" || version.layout() == "SR1-EndcapC");
53
54 }

◆ tag()

const std::string & InDetDD::SiDetectorManager::tag ( ) const
inherited

Get tag used in dictionary.

Definition at line 34 of file SiDetectorManager.cxx.

35 {
36 return m_tag;
37 }

◆ updateAll()

void InDetDD::SiDetectorManager::updateAll ( ) const
virtualinherited

Update all caches.

Implements InDetDD::InDetDetectorManager.

Definition at line 51 of file SiDetectorManager.cxx.

52 {
54 element_iter != getDetectorElementEnd();
55 ++element_iter) {
56 if (*element_iter) {
57 (*element_iter)->updateCache();
58 }
59 }
60 }
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838

Member Data Documentation

◆ ATLAS_THREAD_SAFE

std::atomic_flag m_initialized AthMessaging::ATLAS_THREAD_SAFE = ATOMIC_FLAG_INIT
mutableprivateinherited

Messaging initialized (initMessaging)

Definition at line 141 of file AthMessaging.h.

◆ m_alignableTransforms

std::vector<std::unique_ptr<ExtendedAlignableTransform> > InDetDD::SCT_DetectorManager::m_alignableTransforms
private

Definition at line 179 of file SCT_DetectorManager.h.

◆ m_alignfoldertype

AlignFolderType InDetDD::InDetDetectorManager::m_alignfoldertype
inherited

Definition at line 96 of file InDetDetectorManager.h.

◆ m_commonItems

std::unique_ptr<const SiCommonItems> InDetDD::SiDetectorManager::m_commonItems
privateinherited

Definition at line 151 of file SiDetectorManager.h.

◆ m_designs

std::vector<std::unique_ptr<const SiDetectorDesign> > InDetDD::SiDetectorManager::m_designs
privateinherited

Definition at line 150 of file SiDetectorManager.h.

◆ m_detStore

StoreGateSvc* InDetDD::InDetDetectorManager::m_detStore
protectedinherited

Definition at line 99 of file InDetDetectorManager.h.

◆ m_doEndcapEtaNeighbour

bool InDetDD::SCT_DetectorManager::m_doEndcapEtaNeighbour
private

Definition at line 192 of file SCT_DetectorManager.h.

◆ m_elementCollection

SiDetectorElementCollection InDetDD::SCT_DetectorManager::m_elementCollection
private

Definition at line 176 of file SCT_DetectorManager.h.

◆ m_folders

std::set<std::string> InDetDD::InDetDetectorManager::m_folders
privateinherited

Definition at line 182 of file InDetDetectorManager.h.

◆ m_globalFolders

std::set<std::string> InDetDD::InDetDetectorManager::m_globalFolders
privateinherited

Definition at line 184 of file InDetDetectorManager.h.

◆ m_higherAlignableTransforms

std::vector<AlignableTransformMap> InDetDD::SCT_DetectorManager::m_higherAlignableTransforms
private

Definition at line 178 of file SCT_DetectorManager.h.

◆ m_idHelper

const SCT_ID* InDetDD::SCT_DetectorManager::m_idHelper
private

Definition at line 181 of file SCT_DetectorManager.h.

◆ m_imsg

std::atomic<IMessageSvc*> AthMessaging::m_imsg { nullptr }
mutableprivateinherited

MessageSvc pointer.

Definition at line 135 of file AthMessaging.h.

135{ nullptr };

◆ m_isLogical

bool InDetDD::SCT_DetectorManager::m_isLogical
private

This variable switches the how the local alignment corrections are applied If true they will be calcualted on top of all of other corrections but in the default reference frame If false they will be calcualted on top of all of other corrections but in the globally aligned reference frame.

Definition at line 189 of file SCT_DetectorManager.h.

◆ m_keys

std::map<std::string, LevelInfo> InDetDD::InDetDetectorManager::m_keys
privateinherited

Definition at line 181 of file InDetDetectorManager.h.

◆ m_lvl

std::atomic<MSG::Level> AthMessaging::m_lvl { MSG::NIL }
mutableprivateinherited

Current logging level.

Definition at line 138 of file AthMessaging.h.

138{ MSG::NIL };

◆ m_moduleAlignableTransforms

std::vector<std::unique_ptr<ExtendedAlignableTransform> > InDetDD::SCT_DetectorManager::m_moduleAlignableTransforms
private

Definition at line 180 of file SCT_DetectorManager.h.

◆ m_motherDesigns

std::vector<std::unique_ptr<const SCT_ModuleSideDesign> > InDetDD::SCT_DetectorManager::m_motherDesigns
private

Definition at line 182 of file SCT_DetectorManager.h.

◆ m_msg_tls

boost::thread_specific_ptr<MsgStream> AthMessaging::m_msg_tls
mutableprivateinherited

MsgStream instance (a std::cout like with print-out levels)

Definition at line 132 of file AthMessaging.h.

◆ m_nm

std::string AthMessaging::m_nm
privateinherited

Message source name.

Definition at line 129 of file AthMessaging.h.

◆ m_numerology

SiNumerology InDetDD::SiDetectorManager::m_numerology
privateinherited

Definition at line 149 of file SiDetectorManager.h.

◆ m_specialFolders

std::set<std::string> InDetDD::InDetDetectorManager::m_specialFolders
privateinherited

Definition at line 183 of file InDetDetectorManager.h.

◆ m_suppressWarnings

std::atomic_bool InDetDD::InDetDetectorManager::m_suppressWarnings
mutableprotectedinherited

Definition at line 100 of file InDetDetectorManager.h.

◆ m_tag

std::string InDetDD::SiDetectorManager::m_tag
privateinherited

Definition at line 148 of file SiDetectorManager.h.

◆ m_version

Version InDetDD::InDetDetectorManager::m_version
privateinherited

Definition at line 180 of file InDetDetectorManager.h.

◆ m_volume

std::vector<PVConstLink> InDetDD::SCT_DetectorManager::m_volume
private

Definition at line 175 of file SCT_DetectorManager.h.

◆ s_invalidLevel

const InDetDetectorManager::LevelInfo InDetDD::InDetDetectorManager::s_invalidLevel
staticprivateinherited

Definition at line 186 of file InDetDetectorManager.h.


The documentation for this class was generated from the following files: