ATLAS Offline Software
Loading...
Searching...
No Matches
AlignModuleTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6
9#include "TrkTrack/Track.h"
10
14
16
17namespace Trk {
18
19 //______________________________________________________________
20 AlignModuleTool::AlignModuleTool(const std::string& type, const std::string& name,
21 const IInterface* parent)
22
23 : AthAlgTool(type,name,parent)
24 , m_alignModuleMaps (AlignModule::NDetectorTypes, nullptr)
25 , m_alignParList1D (SG::VIEW_ELEMENTS)
26 , m_subDetElement (AlignModule::NDetectorTypes, false)
27 {
28 declareInterface<IAlignModuleTool>(this);
29 }
30
31 //________________________________________________________________________
33 {
34 // Number of layers in the superstructures
36 msg(MSG::FATAL)<<"AlignModuleListType can be 0, 1, 2, or 3" << endmsg;
37 return StatusCode::FAILURE;
38 }
39
40 msg(MSG::INFO).setColor(MSG::GREEN);
41 ATH_MSG_INFO("AlignModuleListType set to " << m_alignModuleListType);
42
43 // Set up ATLAS ID helper
44 if (detStore()->retrieve(m_idHelper, "AtlasID").isFailure()) {
45 msg(MSG::FATAL)<<"Could not get Atlas ID helper"<<endmsg;
46 return StatusCode::FAILURE;
47 }
48
49 return StatusCode::SUCCESS;
50 }
51
52 //________________________________________________________________________
54 {
55 return StatusCode::SUCCESS;
56 }
57
58 //________________________________________________________________________
60 std::vector<AlignModuleList*>* idHashMaps)
61 {
62 ATH_MSG_DEBUG("in setAlignModules");
63
64 m_alignModules=alignmods;
65
66 for (int i=0;i<(int)idHashMaps->size();i++) {
67 if ((*idHashMaps)[i]) m_alignModuleMaps[i]=(*idHashMaps)[i];
68 }
69
70 // reset 1-D collection
71 ATH_MSG_DEBUG("clearing alignModules1D");
72 int nmods(0);
73 for (int imod=0;imod<(int)m_alignModules->size();imod++) {
74 m_alignModules1D.push_back((*m_alignModules)[imod]);
75 (*m_alignModules)[imod]->setIdHash(nmods++); // this overwrites what's set in geometry manager tool... should we do this?
76 }
77
78 ATH_MSG_DEBUG("done setting AlignModules");
79 }
80
81
82 //________________________________________________________________________
85 {
86 ATH_MSG_DEBUG("setting fullAlignParList="<<fullAlignParList
87 <<", alignParList="<<alignParList);
88
91
92 // recalculate 1-D collection of alignment parameters
93 ATH_MSG_DEBUG("getting AlignParList1D");
94 m_alignParList1D.clear();
95 int index(0);
96
98
99 for (AlignPar2DVec::iterator apVec=aplist->begin(); apVec!=aplist->end();++apVec) {
100 for (AlignParVec::iterator ap=(*apVec)->begin(); ap!=(*apVec)->end();++ap) {
101 m_alignParList1D.push_back(*ap);
102 (*ap)->setIndex(index++);
103 }
104
105 }
106 }
107
108 //________________________________________________________________________
110 AlignModule::DetectorType detType) const
111 {
112 ATH_MSG_DEBUG("in AlignModuleTool::findAlignModule(det,detType)");
113
114 if (!det) {
115 ATH_MSG_VERBOSE("no det!");
116 return nullptr;
117 }
118
119 if (m_subDetElement[detType]) {
120 ATH_MSG_ERROR("please use findAlignModule method passing RIO_OnTrack");
121 return nullptr;
122 }
123
124 ATH_MSG_VERBOSE("in findAlignModule, detType="<<detType);
125
126 if (detType==AlignModule::NDetectorTypes)
127 detType=getDetectorType(det);
128 if (detType==AlignModule::NDetectorTypes || !m_alignModuleMaps[detType]) {
129 ATH_MSG_VERBOSE("bad detector type or no map for detType "<<detType);
130 return nullptr;
131 }
132
133 // find align module
134 int idHash = det->identifyHash();
135 return (*m_alignModuleMaps[detType])[idHash];
136
137 }
138
139 //________________________________________________________________________
141 AlignModule::DetectorType detType) const
142 {
143
144 ATH_MSG_DEBUG("in AlignModuleTool::findAlignModule(rio,detType)");
145
146 if (!rio) {
147 ATH_MSG_VERBOSE("no rio!");
148 return nullptr;
149 }
150
151 // find detector type using TrkDetElementBase
152 const TrkDetElementBase * detelement = rio->detectorElement();
153 if (detelement) {
154 ATH_MSG_DEBUG("have detelement");
155
156 if (detType==AlignModule::NDetectorTypes)
157 detType=getDetectorType(detelement);
158 if (detType==AlignModule::NDetectorTypes || !m_alignModuleMaps[detType]) {
159 ATH_MSG_VERBOSE("bad detector type or no map for detType "<<detType);
160 return nullptr;
161 }
162
163 // find align module
164 int idHash(0);
165 if (m_subDetElement[detType]) {
166 idHash = subDetElementIDHash(rio->identify());
167 ATH_MSG_DEBUG("idHash (from subDetElement): "<<idHash);
168 }
169 else {
170 idHash = detelement->identifyHash();
171 ATH_MSG_DEBUG("idHash: "<<idHash);
172 }
173
174 return (*m_alignModuleMaps[detType])[idHash];
175
176 }
177
178 ATH_MSG_VERBOSE("no detector element!");
179 return nullptr;
180 }
181
182
183 //________________________________________________________________________
185 {
186 if (!alignModule) return nullptr;
187
188 int idHash =alignModule->identifyHash();
189 ATH_MSG_DEBUG("getting alignPars for idHash "<<idHash);
190
191 return std::as_const(m_alignParList)->at(idHash);
192 }
193
194 //________________________________________________________________________
196 DataVector<AlignPar>* detAPVec,
197 AlignModule::DetectorType detType) const
198 {
199 if (detType==AlignModule::NDetectorTypes)
200 detType=getDetectorType(det);
201 if (detType==AlignModule::NDetectorTypes || !m_alignModuleMaps[detType]) return;
202
203 // get AlignModule
204 int idHash=det->identifyHash();
205 AlignModule* alignModule=(*(m_alignModuleMaps[detType]))[idHash];
206
207 ATH_MSG_DEBUG("have alignModule "<<alignModule->identify());
208 // get alignment parameters
209 const AlignParVec* modAlignPar = getFullAlignPars(alignModule);
210 ATH_MSG_DEBUG("modAlignPar size: "<<modAlignPar->size());
211
212 double alignModPar[AlignModule::NTransformPar];
213 double alignModErr[AlignModule::NTransformPar];
214 for (int i=0;i<AlignModule::NTransformPar;i++) {
215 if ((*modAlignPar)[i]) {
216 alignModPar[i]=(*modAlignPar)[i]->par();
217 alignModErr[i]=(*modAlignPar)[i]->err();
218 }
219 else {
220 alignModPar[i]=alignModErr[i]=0.;
221 ATH_MSG_DEBUG("no alignModPar!");
222 }
223 }
224
225 ATH_MSG_DEBUG("getting transforms");
226
227 Amg::Translation3D alignModXTranslation(alignModPar[AlignModule::TransX],
228 alignModPar[AlignModule::TransY],
229 alignModPar[AlignModule::TransZ]);
230
231 Amg::Transform3D alignModXform = alignModXTranslation * Amg::RotationMatrix3D::Identity();
232 alignModXform *= Amg::AngleAxis3D(alignModPar[AlignModule::RotZ], Amg::Vector3D(0.,0.,1.));
233 alignModXform *= Amg::AngleAxis3D(alignModPar[AlignModule::RotY], Amg::Vector3D(0.,1.,0.));
234 alignModXform *= Amg::AngleAxis3D(alignModPar[AlignModule::RotX], Amg::Vector3D(1.,0.,0.));
235
236
237 Amg::Translation3D alignModXTranslationErr(alignModErr[AlignModule::TransX],
238 alignModErr[AlignModule::TransY],
239 alignModErr[AlignModule::TransZ]);
240
241 Amg::Transform3D alignModXformErr = alignModXTranslationErr * Amg::RotationMatrix3D::Identity();
242 alignModXformErr *= Amg::AngleAxis3D(alignModErr[AlignModule::RotZ], Amg::Vector3D(0.,0.,1.));
243 alignModXformErr *= Amg::AngleAxis3D(alignModErr[AlignModule::RotY], Amg::Vector3D(0.,1.,0.));
244 alignModXformErr *= Amg::AngleAxis3D(alignModErr[AlignModule::RotX], Amg::Vector3D(1.,0.,0.));
245
246 ATH_MSG_DEBUG("getting AlignPars for detector element "<<det->identify());
247
248 // get the transform for this detector element
249 const Amg::Transform3D* transform = alignModule->alignModuleToDetElementTransform(detType,det);
250
251 // get the alignment parameters for this detector element
252 ATH_MSG_WARNING("Check that order is correct: AlignModuleTool:271,284");
253 Amg::Transform3D xformPar( (*transform) * alignModXform );
254 double* detpars = new double[AlignModule::NTransformPar];
255 double* deterrs = new double[AlignModule::NTransformPar];
256 decomposeTransform(xformPar,detpars);
257
258 ATH_MSG_DEBUG("transx="<<detpars[0]);
259 ATH_MSG_DEBUG("transy="<<detpars[1]);
260 ATH_MSG_DEBUG("transz="<<detpars[2]);
261 ATH_MSG_DEBUG("rotx=" <<detpars[3]);
262 ATH_MSG_DEBUG("roty=" <<detpars[4]);
263 ATH_MSG_DEBUG("rotz=" <<detpars[5]);
264
265 Amg::Transform3D xformErr( (*transform) * alignModXformErr);
266 decomposeTransform(xformErr,deterrs);
267
268 // set in AlignParList for this detector element
269 ATH_MSG_DEBUG("setting AlignPar for detector element ");
270 for (int ipar=0;ipar<AlignModule::NTransformPar;ipar++) {
271 AlignPar* ap=(*detAPVec)[ipar];
272 ap->setPar(detpars[ipar],deterrs[ipar]);
273 ap->setFinalPar(ap->initPar()+detpars[ipar],
274 std::sqrt(ap->initErr()*ap->initErr() + deterrs[ipar]*deterrs[ipar]) );
275 }
276
277 ATH_MSG_DEBUG("set");
278
279 }
280
281 //________________________________________________________________________
284 {
285 Identifier id = det->identify();
286
287 // get dector type
288 if ( id.is_valid()) {
289 if (m_idHelper->is_pixel(id)) return AlignModule::Pixel;
290 else if (m_idHelper->is_sct(id)) return AlignModule::SCT;
291 else if (m_idHelper->is_trt(id)) return AlignModule::TRT;
292 else if (m_idHelper->is_mdt(id)) return AlignModule::MDT;
293 else if (m_idHelper->is_csc(id)) return AlignModule::CSC;
294 else if (m_idHelper->is_rpc(id)) return AlignModule::RPC;
295 else if (m_idHelper->is_tgc(id)) return AlignModule::TGC;
296 }
297
299 }
300
301 //________________________________________________________________________
304 {
305 int idHash =alignModule->identifyHash();
306 return std::as_const(m_fullAlignParList)->at(idHash);
307 }
308
309 //________________________________________________________________________
310 MsgStream& operator << ( MsgStream& sl, AlignModuleTool& alignModTool)
311 {
312 const AlignModuleList* modules=alignModTool.alignModules1D();
313 for (int imod=0;imod<(int)modules->size(); imod++) {
314 sl << "AML: "<<*((*modules)[imod]);
315 }
316
317 DataVector<AlignPar>* alignParList=alignModTool.alignParList1D();
318 for (int iap=0;iap<(int)alignParList->size();iap++) {
319 sl << *((*alignParList)[iap]);
320 }
321 return sl;
322 }
323}
#define endmsg
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
const ServiceHandle< StoreGateSvc > & detStore() const
MsgStream & msg() const
Derived DataVector<T>.
Definition DataVector.h:795
DataModel_detail::iterator< DataVector > iterator
Definition DataVector.h:842
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
AlignModuleTool(const std::string &type, const std::string &name, const IInterface *parent)
virtual AlignParVec * alignParList1D() override
Returns 1-D vector of all AlignPars for all detector types.
std::vector< bool > m_subDetElement
identify detectors aligning structures smaller than TrkDetElementBase
std::vector< const AlignModuleList * > m_alignModuleMaps
maps detector element idHash to AlignModule
virtual void setAlignModules(AlignModuleList *alignmods, std::vector< AlignModuleList * > *idHashMaps) override
sets alignModuleLists and idHash maps for a set of AlignModules.
AlignPar2DVec * fullAlignParList() const
returns complete AlignParList
DataVector< AlignParVec > AlignPar2DVec
AlignPar2DVec * alignParList() const
returns complete AlignParList (active parameters only)
AlignModuleList * m_alignModules
list of AlignModules
virtual StatusCode initialize() override
virtual const AlignModuleList * alignModules1D() override
Returns 1-D vector of all AlignModules containing all detector types.
AlignPar2DVec * m_fullAlignParList
contains all parameters
virtual AlignModule * findAlignModule(const RIO_OnTrack *rio, AlignModule::DetectorType detType) const override
Returns pointer to AlignModule containing RIO.
AlignPar2DVec * m_alignParList
contains active parameters
AlignParVec * getFullAlignPars(const AlignModule *alignModule) const override
returns vector of full AlignPars for an AlignModule
virtual void fillDetAlignmentParameters(const TrkDetElementBase *det, DataVector< AlignPar > *apVec, AlignModule::DetectorType detType) const override
fills values for alignment parameters for a detector element, applying AlignModule transforms if nece...
virtual StatusCode finalize() override
virtual int subDetElementIDHash(Identifier) const
Returns identifier hash for sub-TrkDetElementBase structure based on detector type.
AlignModule::DetectorType getDetectorType(const TrkDetElementBase *det) const override
Returns detector type (AlignModule enum) for a detector element.
virtual AlignParVec * getAlignPars(const AlignModule *alignModule) const override
returns vector of AlignPars for an AlignModule
const AtlasDetectorID * m_idHelper
Used to identify type of detector.
std::vector< AlignModule * > m_alignModules1D
1-D vector of AlignModules
IntegerProperty m_alignModuleListType
uses Trk enum AlignModuleListType (L1,L2,L3,L1_5,L2_5)
AlignParVec m_alignParList1D
1-D vector of AlignPars
DataVector< AlignPar > AlignParVec
virtual void setAlignParLists(AlignPar2DVec *fullAlignParList, AlignPar2DVec *alignParList=0) override
Sets the AlignParLists using boost::multi_array.
Identifier identify() const
Definition AlignModule.h:97
const Amg::Transform3D * alignModuleToDetElementTransform(AlignModule::DetectorType detType, const TrkDetElementBase *det, const Identifier id=Identifier()) const
returns AlignModule to DetElement transform for a detector element
IdentifierHash identifyHash() const
Set and return index of module, used by alignment classes to keep track of order of align module.
Definition AlignModule.h:92
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
Definition RIO_OnTrack.h:70
virtual const TrkDetElementBase * detectorElement() const =0
returns the detector element, assoicated with the PRD of this class
Identifier identify() const
return the identifier -extends MeasurementBase
This is the base class for all tracking detector elements with read-out relevant information.
virtual IdentifierHash identifyHash() const =0
Identifier hash.
Eigen::AngleAxisd AngleAxis3D
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
Eigen::Translation< double, 3 > Translation3D
Forward declaration.
Ensure that the ATLAS eigen extensions are properly loaded.
MsgStream & operator<<(MsgStream &sl, const AlignModule &alignModule)
overload of << operator for MsgStream for debug output
std::vector< AlignModule * > AlignModuleList
void decomposeTransform(const Amg::Transform3D &transform, double *values)
Definition index.py:1