ATLAS Offline Software
TRT_DetectorTool.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 "TRT_DetectorTool.h"
8 
10 
15 
19 #include "SGTools/DataProxy.h"
20 
21 #include <memory>
22 
24 //
25 TRT_DetectorTool::TRT_DetectorTool( const std::string& type, const std::string& name, const IInterface* parent )
27 {
28 }
29 
31 //
33 {
34  // Get the detector configuration.
35  ATH_CHECK( m_geoDbTagSvc.retrieve());
36 
37  ServiceHandle<IRDBAccessSvc> accessSvc(m_geoDbTagSvc->getParamSvcName(),name());
38  ATH_CHECK( accessSvc.retrieve());
39 
40  // Locate the top level experiment node
41  GeoModelExperiment* theExpt{nullptr};
42  ATH_CHECK(detStore()->retrieve(theExpt,"ATLAS"));
43  GeoPhysVol *world = theExpt->getPhysVol();
44 
45  // Retrieve the Geometry DB Interface
46  ATH_CHECK( m_geometryDBSvc.retrieve() );
47 
48  // Pass athena services to factory, etc
49  m_athenaComps.setDetStore(detStore().operator->());
51  m_athenaComps.setRDBAccessSvc(accessSvc.get());
53 
54  std::unique_ptr<TRTStrawStatusAccessor> strawStatusAccessor;
55  ATH_CHECK(m_sumTool.retrieve(DisableTool{ !m_dumpStrawStatus }));
57  // Read Straw Statuses from the ASCII file
58  strawStatusAccessor = std::make_unique<TRTStrawStatusAccessor>();
59  const std::string strawStatusPath = PathResolverFindCalibFile(m_strawStatusFile);
60  if (strawStatusPath.empty()) {
61  ATH_MSG_ERROR("Failed to resolve path for StrawStatusFile: " << m_strawStatusFile << ", the job will fail now.");
62  return StatusCode::FAILURE;
63  }
64  ATH_MSG_VERBOSE("StrawStatusFile: " << m_strawStatusFile << ", resolved path: " << strawStatusPath);
65  strawStatusAccessor->fill(strawStatusPath);
66  }
67 
68  GeoModelIO::ReadGeoModel* sqliteReader = m_geoDbTagSvc->getSqliteReader();
69  //
70  // If we are using the SQLite reader, then we are not building the raw geometry but
71  // just locating it and attaching to readout geometry and various other actions
72  // taken in this factory.
73  //
74  if (sqliteReader) {
75  ATH_MSG_INFO( " Building TRT geometry from GeoModel factory TRTDetectorFactory_Lite" );
76  TRTDetectorFactory_Lite theTRTFactory(sqliteReader,
78  std::move(strawStatusAccessor),
83  );
84 
85  theTRTFactory.create(world);
86  m_manager=theTRTFactory.getDetectorManager();
87  }
88  else {
89  DecodeVersionKey versionKey(m_geoDbTagSvc.get(), "TRT");
90 
91  ATH_MSG_INFO( "Building TRT with Version Tag: "<< versionKey.tag() << " at Node: " << versionKey.node() );
92 
93  // Print the TRT version tag:
94  std::string trtVersionTag = accessSvc->getChildTag("TRT", versionKey.tag(), versionKey.node());
95  ATH_MSG_INFO("TRT Version: " << trtVersionTag );
96 
97  // Check if version is empty. If so, then the TRT cannot be built. This may or may not be intentional. We
98  // just issue an INFO message.
99  if (trtVersionTag.empty()) {
100  ATH_MSG_INFO("No TRT Version. TRT will not be built." );
101  return StatusCode::SUCCESS;
102  }
103 
104  ATH_MSG_DEBUG( "Keys for TRT Switches are " << versionKey.tag() << " " << versionKey.node() );
105  IRDBRecordset_ptr switchSet = accessSvc->getRecordsetPtr("TRTSwitches", versionKey.tag(), versionKey.node());
106  const IRDBRecord *switches = (*switchSet)[0];
107 
108  if (switches->getInt("DC1COMPATIBLE")) {
109  ATH_MSG_ERROR( "DC1COMPATIBLE flag set in database, but DC1 is no longer supported in the code!!");
110  return StatusCode::FAILURE;
111  }
112 
113  m_DC2CompatibleBarrelCoordinates = switches->getInt("DC2COMPATIBLE");
114  m_useOldActiveGasMixture = ( switches->getInt("GASVERSION") == 0 );
115  m_initialLayout = switches->getInt("INITIALLAYOUT");
116 
117  // Check if the new switches exists:
119  if ( switches->getInt("DOARGONMIXTURE") == 0) { m_doArgonMixture = false; }
120  else if ( switches->getInt("DOARGONMIXTURE") == 1) { m_doArgonMixture = true; }
121 
122  if ( switches->getInt("DOKRYPTONMIXTURE") == 0) { m_doKryptonMixture = false; }
123  else if ( switches->getInt("DOKRYPTONMIXTURE") == 1) { m_doKryptonMixture = true; }
124  }
125 
126  ATH_MSG_INFO( "Creating the TRT" );
127  ATH_MSG_INFO( "TRT Geometry Options:" << std::boolalpha );
128  ATH_MSG_INFO( " UseOldActiveGasMixture = " << m_useOldActiveGasMixture );
129  ATH_MSG_INFO( " Do Argon = " << m_doArgonMixture );
130  ATH_MSG_INFO( " Do Krypton = " << m_doKryptonMixture );
131  ATH_MSG_INFO( " DC2CompatibleBarrelCoordinates = " << m_DC2CompatibleBarrelCoordinates );
132  ATH_MSG_INFO( " InitialLayout = " << m_initialLayout );
133  ATH_MSG_INFO( " Alignable = " << m_alignable );
134  ATH_MSG_INFO( " VersioName = " << switches->getString("VERSIONNAME") );
135 
136  ATH_MSG_INFO( " Building TRT geometry from GeoModel factory TRTDetectorFactory_Full" );
137 
138  TRTDetectorFactory_Full theTRTFactory(&m_athenaComps,
139  m_dumpStrawStatus ? m_sumTool.get() : nullptr,
140  std::move(strawStatusAccessor),
143  m_alignable,
147  );
148  theTRTFactory.create(world);
149  m_manager=theTRTFactory.getDetectorManager();
150 
151  }
152 
153  // Register the TRTDetectorNode instance with the Transient Detector Store
154  if (!m_manager) return StatusCode::FAILURE;
155 
156  theExpt->addManager(m_manager);
157  ATH_CHECK(detStore()->record(m_manager,m_manager->getName()));
158  return StatusCode::SUCCESS;
159 }
160 
161 
162 
164 TRT_DetectorTool::registerCallback ATLAS_NOT_THREAD_SAFE () // Thread unsafe StoreGateSvc::regFcn method and DataHandle template are used.
165 {
166  // This callback is kept because the folder never changes.
167 
168  MsgStream log(msgSvc(), name());
169 
170  // If we fail to register any callbacks we return FAILURE. This just tells GeoModelSvc that
171  // no callbacks were registered. It will continue normally but without any alignments.
172  StatusCode sc = StatusCode::FAILURE;
173 
174  if (m_alignable) {
175 
176 
177  if (m_useDynamicAlignFolders){ // Regular alignment new schema
178  std::string folderName = "/TRT/AlignL1/TRT";
179  if (detStore()->contains<CondAttrListCollection>(folderName)) {
180  msg(MSG::DEBUG) << "Registering callback on global Container with folder " << folderName << endmsg;
182  StatusCode trttmp = detStore()->regFcn(&IGeoModelTool::align, dynamic_cast<IGeoModelTool*>(this), calc, folderName);
183  // We don't expect this to fail as we have already checked that the detstore contains the object.
184  if (trttmp.isFailure()) {
185  msg(MSG::ERROR) << "Problem when register callback on global Container with folder " << folderName <<endmsg;
186  } else {
187  sc = StatusCode::SUCCESS;
188  }
189  } else {
190  msg(MSG::WARNING) << "Unable to register callback on global Container with folder " << folderName <<endmsg;
191  return StatusCode::FAILURE;
192  }
193 
194  folderName = "/TRT/AlignL2";
195  if (detStore()->contains<AlignableTransformContainer>(folderName)) {
196  if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Registering callback on AlignableTransformContainer with folder " << folderName << endmsg;
198  StatusCode sctmp = detStore()->regFcn(&IGeoModelTool::align, dynamic_cast<IGeoModelTool *>(this), atc, folderName);
199  if(sctmp.isFailure()) {
200  msg(MSG::ERROR) << "Problem when register callback on AlignableTransformContainer with folder " << folderName <<endmsg;
201  } else {
202  sc = StatusCode::SUCCESS;
203  }
204  }
205  else {
206  msg(MSG::WARNING) << "Unable to register callback on AlignableTransformContainer with folder "
207  << folderName << endmsg;
208  return StatusCode::FAILURE;
209  }
210  }
211  else { // Regular alignment old schema
212  std::string folderName = "/TRT/Align";
213  if (detStore()->contains<AlignableTransformContainer>(folderName)) {
214  msg(MSG::DEBUG) << "Registering callback on AlignableTransformContainer with folder " << folderName << endmsg;
216  StatusCode sctmp = detStore()->regFcn(&IGeoModelTool::align, dynamic_cast<IGeoModelTool *>(this), atc, folderName);
217  // We don't expect this to fail as we have already checked that the detstore contains the object.
218  if (sctmp.isFailure()) {
219  msg(MSG::ERROR) << "Problem when register callback on AlignableTransformContainer with folder " << folderName <<endmsg;
220  } else {
221  sc = StatusCode::SUCCESS;
222  }
223  } else {
224  msg(MSG::WARNING) << "Unable to register callback on AlignableTransformContainer with folder "
225  << folderName << ", Alignments disabled! (Only if no Run2 schema is loaded)" << endmsg;
226  }
227  }
228 
229 
230  // Fine alignment
231  {
232  std::string folderName = "/TRT/Calib/DX";
233  if (detStore()->contains<TRTCond::StrawDxContainer>(folderName)) {
234  msg(MSG::DEBUG) << "Registering callback on StrawDxContainer with folder " << folderName << endmsg;
236  StatusCode sctmp = detStore()->regFcn(&IGeoModelTool::align, dynamic_cast<IGeoModelTool*>(this), sdc, folderName);
237  // We don't expect this to fail as we have already checked that the detstore contains the object.
238  if (sctmp.isFailure()) {
239  msg(MSG::ERROR) << "Problem when register callback on StrawDxContainer with folder " << folderName <<endmsg;
240  } else {
241  sc = StatusCode::SUCCESS;
242  }
243  } else {
244  msg(MSG::DEBUG) << "Unable to register callback on StrawDxContainer with folder " << folderName <<endmsg;
245  }
246  }
247 
248  } else {
249  msg(MSG::INFO) << "Alignment disabled. No callback registered" << endmsg;
250  // We return failure otherwise it will try and register
251  // a GeoModelSvc callback associated with this callback.
252  }
253 
254  return sc;
255 }
256 
258 {
260  if(proxy) {
261  proxy->reset();
262  m_manager = nullptr;
263  }
264  return StatusCode::SUCCESS;
265 }
266 
267 
270 //The manager align call invalidates all elements
271 {
272  MsgStream log(msgSvc(), name());
273  if (!m_manager) {
274  msg(MSG::WARNING) << "Manager does not exist" << endmsg;
275  return StatusCode::FAILURE;
276  }
277  if (m_alignable) {
278  return const_cast<InDetDD::TRT_DetectorManager*>(m_manager)->align(I,keys);
279  } else {
280  msg(MSG::DEBUG) << "Alignment disabled. No alignments applied" << endmsg;
281  return StatusCode::SUCCESS;
282  }
283 }
IRDBRecord::getInt
virtual int getInt(const std::string &fieldName) const =0
Get int field value.
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
StateLessPT_NewConfig.proxy
proxy
Definition: StateLessPT_NewConfig.py:407
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
IRDBRecord::getString
virtual const std::string & getString(const std::string &fieldName) const =0
Get string field value.
TRTDetectorFactory_Lite::create
virtual void create(GeoPhysVol *world) override
Definition: TRTDetectorFactory_Lite.cxx:88
GeoModelExperiment
Definition: GeoModelExperiment.h:32
TRT_DetectorTool::m_dumpStrawStatus
Gaudi::Property< bool > m_dumpStrawStatus
Definition: TRT_DetectorTool.h:56
DecodeVersionKey::node
const std::string & node() const
Return the version node.
Definition: DecodeVersionKey.cxx:97
IOVSVC_CALLBACK_ARGS_P
#define IOVSVC_CALLBACK_ARGS_P(I, K)
short hand for IOVSvc call back argument list, to be used when access to formal arguments is needed,...
Definition: IOVSvcDefs.h:42
TRT_DetectorTool::m_alignable
Gaudi::Property< bool > m_alignable
Definition: TRT_DetectorTool.h:45
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
TRT_DetectorTool::m_manager
const InDetDD::TRT_DetectorManager * m_manager
Definition: TRT_DetectorTool.h:60
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
TRT_DetectorTool::TRT_DetectorTool
TRT_DetectorTool(const std::string &type, const std::string &name, const IInterface *parent)
Definition: TRT_DetectorTool.cxx:25
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
TRT_DetectorTool.h
InDetDD::AthenaComps::setGeoDbTagSvc
void setGeoDbTagSvc(IGeoDbTagSvc *)
Definition: InDetDDAthenaComps.cxx:22
InDetDD::AthenaComps::setDetStore
void setDetStore(StoreGateSvc *)
Definition: InDetDDAthenaComps.cxx:17
GeoModelExperiment.h
TRTDetectorFactory_Full::getDetectorManager
virtual const InDetDD::TRT_DetectorManager * getDetectorManager() const override
Definition: TRTDetectorFactory_Full.cxx:112
TRTDetectorFactory_Full::create
virtual void create(GeoPhysVol *world) override
Definition: TRTDetectorFactory_Full.cxx:131
IRDBAccessSvc.h
Definition of the abstract IRDBAccessSvc interface.
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
StdJOSetup.msgSvc
msgSvc
Provide convenience handles for various services.
Definition: StdJOSetup.py:36
TRT_DetectorTool::m_DC2CompatibleBarrelCoordinates
Gaudi::Property< bool > m_DC2CompatibleBarrelCoordinates
Definition: TRT_DetectorTool.h:44
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
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
AlignableTransformContainer.h
DecodeVersionKey
This is a helper class to query the version tags from GeoModelSvc and determine the appropriate tag a...
Definition: DecodeVersionKey.h:18
ClassID_traits
Default, invalid implementation of ClassID_traits.
Definition: Control/AthenaKernel/AthenaKernel/ClassID_traits.h:37
TRTDetectorFactory_Lite.h
test_pyathena.parent
parent
Definition: test_pyathena.py:15
DecodeVersionKey::tag
const std::string & tag() const
Return version tag.
Definition: DecodeVersionKey.cxx:91
GeoModelTool
Definition: GeoModelTool.h:16
InDetDD::AthenaComps::setRDBAccessSvc
void setRDBAccessSvc(IRDBAccessSvc *)
Definition: InDetDDAthenaComps.cxx:27
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
TRT_DetectorTool::m_athenaComps
InDetDD::AthenaComps m_athenaComps
Definition: TRT_DetectorTool.h:61
ATLAS_NOT_THREAD_SAFE
StatusCode TRT_DetectorTool::registerCallback ATLAS_NOT_THREAD_SAFE()
Install fatal handler with default options.
Definition: TRT_DetectorTool.cxx:164
TRT_DetectorTool::m_strawStatusFile
Gaudi::Property< std::string > m_strawStatusFile
Definition: TRT_DetectorTool.h:57
IRDBRecordset_ptr
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
Definition: IRDBAccessSvc.h:25
TRT_DetectorTool::m_initialLayout
bool m_initialLayout
Definition: TRT_DetectorTool.h:62
python.PyKernel.detStore
detStore
Definition: PyKernel.py:41
PathResolver.h
TRTStrawStatusAccessor::fill
void fill(const std::string &path)
Definition: TRTStrawStatusAccessor.cxx:8
CaloCellTimeCorrFiller.folderName
string folderName
Definition: CaloCellTimeCorrFiller.py:19
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
DataHandle
an iterator over instances of a given type in StoreGateSvc. It d-casts and caches locally the pointed...
Definition: DataHandle.h:43
DecodeVersionKey.h
PathResolverFindCalibFile
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.cxx:283
InDetDD::TRT_DetectorManager
The Detector Manager for all TRT Detector elements, it acts as the interface to the detector elements...
Definition: TRT_DetectorManager.h:63
IRDBRecord.h
Definition of the abstract IRDBRecord interface.
IGeoModelTool
Definition: IGeoModelTool.h:12
TRT_DetectorTool::create
virtual StatusCode create() override final
Definition: TRT_DetectorTool.cxx:32
python.Constants.INFO
int INFO
Definition: Control/AthenaCommon/python/Constants.py:15
IRDBRecord
IRDBRecord is one record in the IRDBRecordset object.
Definition: IRDBRecord.h:27
DEBUG
#define DEBUG
Definition: page_access.h:11
InDetDD::AthenaComps::setGeometryDBSvc
void setGeometryDBSvc(IGeometryDBSvc *)
Definition: InDetDDAthenaComps.cxx:32
TRTDetectorFactory_Lite::getDetectorManager
virtual const InDetDD::TRT_DetectorManager * getDetectorManager() const override
Definition: TRTDetectorFactory_Lite.cxx:69
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
TRT_DetectorTool::m_doKryptonMixture
Gaudi::Property< bool > m_doKryptonMixture
Definition: TRT_DetectorTool.h:51
TRT_DetectorTool::m_useOldActiveGasMixture
Gaudi::Property< bool > m_useOldActiveGasMixture
Definition: TRT_DetectorTool.h:43
TRT_DetectorTool::m_doArgonMixture
Gaudi::Property< bool > m_doArgonMixture
Definition: TRT_DetectorTool.h:49
python.Bindings.keys
keys
Definition: Control/AthenaPython/python/Bindings.py:801
TRT_DetectorTool::m_sumTool
ToolHandle< ITRT_StrawStatusSummaryTool > m_sumTool
Definition: TRT_DetectorTool.h:58
TRTDetectorFactory_Lite
Definition: TRTDetectorFactory_Lite.h:29
TRT_DetectorTool::m_geoDbTagSvc
ServiceHandle< IGeoDbTagSvc > m_geoDbTagSvc
Definition: TRT_DetectorTool.h:53
TRT_DetectorTool::m_useDynamicAlignFolders
Gaudi::Property< bool > m_useDynamicAlignFolders
Definition: TRT_DetectorTool.h:46
I
#define I(x, y, z)
Definition: MD5.cxx:116
IRDBRecordset.h
Definition of the abstract IRDBRecordset interface.
TRTDetectorFactory_Full
This class creates the TRT Geometry.
Definition: TRTDetectorFactory_Full.h:33
SG::DataProxy
Definition: DataProxy.h:45
TRT_DetectorTool::clear
virtual StatusCode clear() override final
Definition: TRT_DetectorTool.cxx:257
beamspotnt.calc
calc
Definition: bin/beamspotnt.py:1251
TRT_DetectorTool::m_geometryDBSvc
ServiceHandle< IGeometryDBSvc > m_geometryDBSvc
Definition: TRT_DetectorTool.h:54
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
StrawDxContainer.h
Class for storing/accessing trt endpoint corrections data.
TRTDetectorFactory_Full.h
ServiceHandle< IRDBAccessSvc >
DataProxy.h