ATLAS Offline Software
Loading...
Searching...
No Matches
TRTAlignCondAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "GaudiKernel/MsgStream.h"
7#include "TRTAlignCondAlg.h"
8
9
10TRTAlignCondAlg::TRTAlignCondAlg(const std::string& name
11 , ISvcLocator* pSvcLocator )
12 : ::AthAlgorithm(name,pSvcLocator)
13{
14}
15
17= default;
18
20{
21 ATH_MSG_DEBUG("initialize " << name());
22
23 // Read Condition Handles initialize
24 ATH_CHECK( m_readKeyRegular.initialize(!m_useDynamicFolders.value()) );
27 ATH_CHECK( m_readKeySpecial.initialize() );
28
29 // Write condition handles initialize
31 ATH_CHECK( m_writeKeyDetElCont.initialize() );
32
33 ATH_CHECK(detStore()->retrieve(m_detManager,"TRT"));
34
35 return StatusCode::SUCCESS;
36}
37
39{
40 ATH_MSG_DEBUG("execute " << name());
41
42 const EventContext& ctx = Gaudi::Hive::currentContext();
43 // ____________ Construct Write Cond Handles and check their validity ____________
45 if (writeHandleDetElCont.isValid()) {
46 ATH_MSG_DEBUG("CondHandle " << writeHandleDetElCont.fullKey() << " is already valid."
47 << ". In theory this should not be called, but may happen"
48 << " if multiple concurrent events are being processed out of order.");
49 return StatusCode::SUCCESS;
50 }
51
52 std::unique_ptr<SG::WriteCondHandle<GeoAlignmentStore>> writeHandleAlignStore{};
53 if (!m_writeKeyAlignStore.empty()) {
54 writeHandleAlignStore = std::make_unique<SG::WriteCondHandle<GeoAlignmentStore>>(m_writeKeyAlignStore, ctx);
55 if (writeHandleAlignStore->isValid()) {
56 ATH_MSG_DEBUG("CondHandle " << writeHandleAlignStore->fullKey() << " is already valid."
57 << ". In theory this should not be called, but may happen"
58 << " if multiple concurrent events are being processed out of order.");
59 return StatusCode::SUCCESS;
60 }
61 }
62
63 // ____________ Construct new Write Cond Object and its range ____________
64 std::unique_ptr<GeoAlignmentStore> writeCdoAlignStore{std::make_unique<GeoAlignmentStore>()};
65
66 // ____________ Get Read Cond Objects ____________
67 // Container for passing read CDO-s over to the Detector Manager
68 InDetDD::RawAlignmentObjects readCdoContainer;
69
70 const InDetDD::TRT_DetElementCollection* unAlignedColl{m_detManager->getDetectorElementCollection()};
71 if (unAlignedColl==nullptr) {
72 ATH_MSG_FATAL("Null pointer is returned by getDetectorElementCollection()");
73 return StatusCode::FAILURE;
74 }
75
77 // 1. Dynamic folders
78
79 // ** Global
81 // Get CDO and store it into container
82 const CondAttrListCollection* readCdoDynamicGlobal{*readHandleDynamicGlobal};
83 if(readCdoDynamicGlobal==nullptr) {
84 ATH_MSG_ERROR("Null pointer to the read conditions object: Dynamic Global");
85 return StatusCode::FAILURE;
86 }
87 readCdoContainer.emplace(m_readKeyDynamicGlobal.key(),readCdoDynamicGlobal);
88 // Add depdency for IOV-intersection
89 if (writeHandleAlignStore) writeHandleAlignStore->addDependency(readHandleDynamicGlobal);
90 writeHandleDetElCont.addDependency(readHandleDynamicGlobal);
91
92 // ** Regular
94 // Get CDO and store it into container
95 const AlignableTransformContainer* readCdoDynamicRegular{*readHandleDynamicRegular};
96 if(readCdoDynamicRegular==nullptr) {
97 ATH_MSG_ERROR("Null pointer to the read conditions object: Dynamic Regular");
98 return StatusCode::FAILURE;
99 }
100 readCdoContainer.emplace(m_readKeyDynamicRegular.key(),readCdoDynamicRegular);
101 // Add depdency for IOV-intersection
102 if (writeHandleAlignStore) writeHandleAlignStore->addDependency(readHandleDynamicRegular);
103 writeHandleDetElCont.addDependency(readHandleDynamicRegular);
104 }
105 else {
106 // 2. Regular folder
108 // Get CDO and store it into container
109 const AlignableTransformContainer* readCdoRegular{*readHandleRegular};
110 if(readCdoRegular==nullptr) {
111 ATH_MSG_ERROR("Null pointer to the read conditions object: Regular");
112 return StatusCode::FAILURE;
113 }
114 readCdoContainer.emplace(m_readKeyRegular.key(),readCdoRegular);
115 //Add dependency for IOV-intersection
116 if (writeHandleAlignStore) writeHandleAlignStore->addDependency(readHandleRegular);
117 writeHandleDetElCont.addDependency(readHandleRegular);
118 }
119
120 {
121 // Special folder
123 // Get CDO and store it into container
124 const TRTCond::StrawDxContainer* readCdoSpecial{*readHandleSpecial};
125 if(!readCdoSpecial) {
126 ATH_MSG_ERROR("Null pointer to the read conditions object: Special");
127 return StatusCode::FAILURE;
128 }
129 readCdoContainer.emplace(m_readKeySpecial.key(),readCdoSpecial);
130 //Add dependency for IOV-intersection
131 if (writeHandleAlignStore) writeHandleAlignStore->addDependency(readHandleSpecial);
132 writeHandleDetElCont.addDependency(readHandleSpecial);
133 }
134
135 // ____________ Apply alignments to TRT GeoModel ____________
136 if(m_detManager->align(readCdoContainer, writeCdoAlignStore.get()).isFailure()) {
137 ATH_MSG_ERROR("Failed to apply alignments to TRT");
138 return StatusCode::FAILURE;
139 }
140
141 const InDetDD::TRT_DetElementCollection* alignedColl{m_detManager->getDetectorElementCollection()};
142 if (alignedColl==nullptr) {
143 ATH_MSG_FATAL("Null pointer is returned by getDetectorElementCollection()");
144 return StatusCode::FAILURE;
145 }
146
147 // ____________ Construct new Write Cond Object ____________
148 std::unique_ptr<InDetDD::TRT_DetElementContainer> writeCdoDetElCont{std::make_unique<InDetDD::TRT_DetElementContainer>()};
149
150 // ____________ Update writeCdo using readCdo ____________
151 std::map<const InDetDD::TRT_EndcapElement*, InDetDD::TRT_EndcapElement*> oldToNewECMap;
152 std::map<const InDetDD::TRT_BarrelElement*, InDetDD::TRT_BarrelElement*> oldToNewBAMap;
153
154 oldToNewECMap[nullptr] = nullptr;
155 oldToNewBAMap[nullptr] = nullptr;
156
157 //Create new aligned detector elements
158 for (const InDetDD::TRT_BaseElement* oldEl : *alignedColl) {
160
162 const InDetDD::TRT_EndcapElement* oldEl_Endcap = static_cast<const InDetDD::TRT_EndcapElement*>(oldEl);
163 //New encap element with new alignment created based on old element
164 InDetDD::TRT_EndcapElement* newEl = new InDetDD::TRT_EndcapElement(*oldEl_Endcap);
165 oldToNewECMap[oldEl_Endcap] = newEl;
166 writeCdoDetElCont->addEndcapElement(newEl);
168 const InDetDD::TRT_BarrelElement* oldEl_Barrel = static_cast<const InDetDD::TRT_BarrelElement*>(oldEl);
169 //New barrel element with new alignment created based on old element
170 InDetDD::TRT_BarrelElement* newEl = new InDetDD::TRT_BarrelElement(*oldEl_Barrel);
171 oldToNewBAMap[oldEl_Barrel] = newEl;
172 writeCdoDetElCont->addBarrelElement(newEl);
173 } else {
174 ATH_MSG_FATAL("Unknown TRT detector element found");
175 return StatusCode::FAILURE;
176 }
177 }
178
179 //Set detector elements links
180 for (auto pairOfEl : oldToNewECMap) {
181 if (!pairOfEl.first) continue; // skip nullptr
182 pairOfEl.second->setNextInZ(oldToNewECMap[pairOfEl.first->nextInZ()]);
183 pairOfEl.second->setPreviousInZ(oldToNewECMap[pairOfEl.first->previousInZ()]);
184 }
185 for (auto pairOfEl : oldToNewBAMap) {
186 if (!pairOfEl.first) continue; // skip nullptr
187 pairOfEl.second->setNextInR(oldToNewBAMap[pairOfEl.first->nextInR()]);
188 pairOfEl.second->setPreviousInR(oldToNewBAMap[pairOfEl.first->previousInR()]);
189 pairOfEl.second->setNextInPhi(oldToNewBAMap[pairOfEl.first->nextInPhi()]);
190 pairOfEl.second->setPreviousInPhi(oldToNewBAMap[pairOfEl.first->previousInPhi()]);
191 }
192
193 // Update all detector elements caches
194 for (InDetDD::TRT_BaseElement* newEl : *(writeCdoDetElCont->getElements())) {
195 newEl->updateAllCaches(writeCdoAlignStore.get());
196 }
197
198 // Record WriteCondHandle
199 const std::size_t writeHandleDetElContSize{writeCdoDetElCont->getElements()->size()};
200
201 writeCdoDetElCont->setNumerology(m_detManager->getNumerology());
202
203 // Record the resulting CDO
204 if (writeHandleAlignStore != nullptr) {
205 if(writeHandleAlignStore->record(std::move(writeCdoAlignStore)).isFailure()) {
206 ATH_MSG_ERROR("Could not record GeoAlignmentStore " << writeHandleAlignStore->key()
207 << " with EventRange " << writeHandleAlignStore->getRange()
208 << " into Conditions Store");
209 return StatusCode::FAILURE;
210 }
211 ATH_MSG_INFO("recorded new CDO " << writeHandleAlignStore->key() << " with range "
212 << writeHandleAlignStore->getRange() << " into Conditions Store");
213 }
214
215 if (writeHandleDetElCont.record(std::move(writeCdoDetElCont)).isFailure()) {
216 ATH_MSG_FATAL("Could not record " << writeHandleDetElCont.key()
217 << " with EventRange " << writeHandleDetElCont.getRange()
218 << " into Conditions Store");
219 return StatusCode::FAILURE;
220 }
221 ATH_MSG_INFO("recorded new CDO " << writeHandleDetElCont.key() << " with range "
222 << writeHandleDetElCont.getRange() << " with size of " << writeHandleDetElContSize << " into Conditions Store");
223
224 return StatusCode::SUCCESS;
225}
CondMultChanCollection< AlignableTransform > AlignableTransformContainer
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
const ServiceHandle< StoreGateSvc > & detStore() const
This class is a collection of AttributeLists where each one is associated with a channel number.
Extended TRT_BaseElement to describe a TRT readout element, this is a planar layer with n ( order of ...
Virtual base class of TRT readout elements.
Class to hold collection of TRT detector elements.
Extended class of a TRT_BaseElement to describe a readout elment in the endcap.
const std::string & key() const
void addDependency(const EventIDRange &range)
const EventIDRange & getRange() const
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
const DataObjID & fullKey() const
SG::ReadCondHandleKey< AlignableTransformContainer > m_readKeyDynamicRegular
SG::ReadCondHandleKey< TRTCond::StrawDxContainer > m_readKeySpecial
SG::ReadCondHandleKey< AlignableTransformContainer > m_readKeyRegular
TRTAlignCondAlg(const std::string &name, ISvcLocator *pSvcLocator)
SG::WriteCondHandleKey< InDetDD::TRT_DetElementContainer > m_writeKeyDetElCont
SG::WriteCondHandleKey< GeoAlignmentStore > m_writeKeyAlignStore
const InDetDD::TRT_DetectorManager * m_detManager
virtual StatusCode initialize() override
virtual ~TRTAlignCondAlg() override
virtual StatusCode execute() override
Gaudi::Property< bool > m_useDynamicFolders
SG::ReadCondHandleKey< CondAttrListCollection > m_readKeyDynamicGlobal
specialise to detector level
std::map< std::string, const void * > RawAlignmentObjects
ElementLink_p1< typename GenerateELinkIndexType_p1< typename LINK::index_type >::type > type