ATLAS Offline Software
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 
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()) );
28 
29  // Write condition handles initialize
32 
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 
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 
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) {
159  InDetDD::TRT_BaseElement::Type type = oldEl->type();
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);
167  } else if (type == InDetDD::TRT_BaseElement::BARREL) {
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 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
TRTAlignCondAlg::m_readKeyDynamicRegular
SG::ReadCondHandleKey< AlignableTransformContainer > m_readKeyDynamicRegular
Definition: TRTAlignCondAlg.h:34
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
TRTAlignCondAlg::initialize
virtual StatusCode initialize() override
Definition: TRTAlignCondAlg.cxx:19
InDetDD::TRT_BarrelElement
Definition: TRT_BarrelElement.h:43
InDetDD::TRT_DetectorManager::getDetectorElementCollection
const TRT_DetElementCollection * getDetectorElementCollection() const
Access to Whole Collection of Elements ---------------------------------—.
Definition: TRT_DetectorManager.cxx:167
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
TRT_DetectorManager.h
CondMultChanCollection
A CondMultChanCollection is a template class which can hold a collection of T* objects which are inte...
Definition: CondMultChanCollection.h:52
InDetDD::RawAlignmentObjects
std::map< std::string, const void * > RawAlignmentObjects
Definition: InDetDetectorManager.h:43
TRTAlignCondAlg::TRTAlignCondAlg
TRTAlignCondAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: TRTAlignCondAlg.cxx:10
InDetDD::TRT_EndcapElement
Definition: TRT_EndcapElement.h:43
TRTAlignCondAlg::m_detManager
const InDetDD::TRT_DetectorManager * m_detManager
Definition: TRTAlignCondAlg.h:40
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
CondAttrListCollection
This class is a collection of AttributeLists where each one is associated with a channel number....
Definition: CondAttrListCollection.h:52
TRTAlignCondAlg::~TRTAlignCondAlg
virtual ~TRTAlignCondAlg() override
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
AthCommonDataStore< AthCommonMsg< Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
InDetDD::TRT_DetectorManager::getNumerology
TRT_Numerology * getNumerology()
Access Numerological information:---------------------------------------—.
Definition: TRT_DetectorManager.cxx:43
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
TRTAlignCondAlg::execute
virtual StatusCode execute() override
Definition: TRTAlignCondAlg.cxx:38
InDetDD::TRT_BaseElement::ENDCAP
@ ENDCAP
Definition: TRT_BaseElement.h:56
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
InDetDD::InDetDetectorManager::align
StatusCode align(IOVSVC_CALLBACK_ARGS)
InDetDD::TRT_BaseElement::BARREL
@ BARREL
Definition: TRT_BaseElement.h:56
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
AthAlgorithm
Definition: AthAlgorithm.h:47
InDetDD::TRT_BaseElement::Type
Type
Definition: TRT_BaseElement.h:56
TRTAlignCondAlg.h
TRTAlignCondAlg::m_readKeyDynamicGlobal
SG::ReadCondHandleKey< CondAttrListCollection > m_readKeyDynamicGlobal
Definition: TRTAlignCondAlg.h:33
TRTAlignCondAlg::m_writeKeyDetElCont
SG::WriteCondHandleKey< InDetDD::TRT_DetElementContainer > m_writeKeyDetElCont
Definition: TRTAlignCondAlg.h:38
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
TRTCond::StrawDxContainer
Definition: StrawDxContainer.h:109
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
TRTAlignCondAlg::m_writeKeyAlignStore
SG::WriteCondHandleKey< GeoAlignmentStore > m_writeKeyAlignStore
Definition: TRTAlignCondAlg.h:37
InDetDD::TRT_DetElementCollection
Class to hold collection of TRT detector elements.
Definition: TRT_DetElementCollection.h:26
TRTAlignCondAlg::m_useDynamicFolders
Gaudi::Property< bool > m_useDynamicFolders
Definition: TRTAlignCondAlg.h:42
TRTAlignCondAlg::m_readKeySpecial
SG::ReadCondHandleKey< TRTCond::StrawDxContainer > m_readKeySpecial
Definition: TRTAlignCondAlg.h:36
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
TRTAlignCondAlg::m_readKeyRegular
SG::ReadCondHandleKey< AlignableTransformContainer > m_readKeyRegular
Definition: TRTAlignCondAlg.h:35
InDetDD::TRT_BaseElement
Definition: TRT_BaseElement.h:52