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 
18 
19 #include "SGTools/DataProxy.h"
20 
22 //
23 TRT_DetectorTool::TRT_DetectorTool( const std::string& type, const std::string& name, const IInterface* parent )
25 {
26 }
27 
29 //
31 {
32  // Get the detector configuration.
33  ATH_CHECK( m_geoDbTagSvc.retrieve());
34 
35  // Get the straw status tool
36  ATH_CHECK(m_sumTool.retrieve());
37 
38  ServiceHandle<IRDBAccessSvc> accessSvc(m_geoDbTagSvc->getParamSvcName(),name());
39  ATH_CHECK( accessSvc.retrieve());
40 
41  // Locate the top level experiment node
42  GeoModelExperiment* theExpt{nullptr};
43  ATH_CHECK(detStore()->retrieve(theExpt,"ATLAS"));
44  GeoPhysVol *world = theExpt->getPhysVol();
45 
46  // Retrieve the Geometry DB Interface
47  ATH_CHECK( m_geometryDBSvc.retrieve() );
48 
49  // Pass athena services to factory, etc
50  m_athenaComps.setDetStore(detStore().operator->());
52  m_athenaComps.setRDBAccessSvc(accessSvc.get());
54 
55  GeoModelIO::ReadGeoModel* sqliteReader = m_geoDbTagSvc->getSqliteReader();
56  //
57  // If we are using the SQLite reader, then we are not building the raw geometry but
58  // just locating it and attaching to readout geometry and various other actions
59  // taken in this factory.
60  //
61  if (sqliteReader) {
62  ATH_MSG_INFO( " Building TRT geometry from GeoModel factory TRTDetectorFactory_Lite" );
63  TRTDetectorFactory_Lite theTRTFactory(sqliteReader,
65  m_sumTool.get(),
70  );
71 
72  theTRTFactory.create(world);
73  m_manager=theTRTFactory.getDetectorManager();
74  }
75  else {
76  DecodeVersionKey versionKey(m_geoDbTagSvc.get(), "TRT");
77 
78  ATH_MSG_INFO( "Building TRT with Version Tag: "<< versionKey.tag() << " at Node: " << versionKey.node() );
79 
80  // Print the TRT version tag:
81  std::string trtVersionTag = accessSvc->getChildTag("TRT", versionKey.tag(), versionKey.node());
82  ATH_MSG_INFO("TRT Version: " << trtVersionTag );
83 
84  // Check if version is empty. If so, then the TRT cannot be built. This may or may not be intentional. We
85  // just issue an INFO message.
86  if (trtVersionTag.empty()) {
87  ATH_MSG_INFO("No TRT Version. TRT will not be built." );
88  return StatusCode::SUCCESS;
89  }
90 
91  ATH_MSG_DEBUG( "Keys for TRT Switches are " << versionKey.tag() << " " << versionKey.node() );
92  IRDBRecordset_ptr switchSet = accessSvc->getRecordsetPtr("TRTSwitches", versionKey.tag(), versionKey.node());
93  const IRDBRecord *switches = (*switchSet)[0];
94 
95  if (switches->getInt("DC1COMPATIBLE")) {
96  ATH_MSG_ERROR( "DC1COMPATIBLE flag set in database, but DC1 is no longer supported in the code!!");
97  return StatusCode::FAILURE;
98  }
99 
100  m_DC2CompatibleBarrelCoordinates = switches->getInt("DC2COMPATIBLE");
101  m_useOldActiveGasMixture = ( switches->getInt("GASVERSION") == 0 );
102  m_initialLayout = switches->getInt("INITIALLAYOUT");
103 
104  // Check if the new switches exists:
106  if ( switches->getInt("DOARGONMIXTURE") == 0) { m_doArgonMixture = false; }
107  else if ( switches->getInt("DOARGONMIXTURE") == 1) { m_doArgonMixture = true; }
108 
109  if ( switches->getInt("DOKRYPTONMIXTURE") == 0) { m_doKryptonMixture = false; }
110  else if ( switches->getInt("DOKRYPTONMIXTURE") == 1) { m_doKryptonMixture = true; }
111  }
112 
113  ATH_MSG_INFO( "Creating the TRT" );
114  ATH_MSG_INFO( "TRT Geometry Options:" << std::boolalpha );
115  ATH_MSG_INFO( " UseOldActiveGasMixture = " << m_useOldActiveGasMixture );
116  ATH_MSG_INFO( " Do Argon = " << m_doArgonMixture );
117  ATH_MSG_INFO( " Do Krypton = " << m_doKryptonMixture );
118  ATH_MSG_INFO( " DC2CompatibleBarrelCoordinates = " << m_DC2CompatibleBarrelCoordinates );
119  ATH_MSG_INFO( " InitialLayout = " << m_initialLayout );
120  ATH_MSG_INFO( " Alignable = " << m_alignable );
121  ATH_MSG_INFO( " VersioName = " << switches->getString("VERSIONNAME") );
122 
123  ATH_MSG_INFO( " Building TRT geometry from GeoModel factory TRTDetectorFactory_Full" );
124 
125  TRTDetectorFactory_Full theTRTFactory(&m_athenaComps,
126  m_sumTool.get(),
129  m_alignable,
133  );
134  theTRTFactory.create(world);
135  m_manager=theTRTFactory.getDetectorManager();
136 
137  }
138 
139  // Register the TRTDetectorNode instance with the Transient Detector Store
140  if (!m_manager) return StatusCode::FAILURE;
141 
142  theExpt->addManager(m_manager);
143  ATH_CHECK(detStore()->record(m_manager,m_manager->getName()));
144  return StatusCode::SUCCESS;
145 }
146 
147 
148 
150 TRT_DetectorTool::registerCallback ATLAS_NOT_THREAD_SAFE () // Thread unsafe StoreGateSvc::regFcn method and DataHandle template are used.
151 {
152  // This callback is kept because the folder never changes.
153 
154  MsgStream log(msgSvc(), name());
155 
156  // If we fail to register any callbacks we return FAILURE. This just tells GeoModelSvc that
157  // no callbacks were registered. It will continue normally but without any alignments.
158  StatusCode sc = StatusCode::FAILURE;
159 
160  if (m_alignable) {
161 
162 
163  if (m_useDynamicAlignFolders){ // Regular alignment new schema
164  std::string folderName = "/TRT/AlignL1/TRT";
165  if (detStore()->contains<CondAttrListCollection>(folderName)) {
166  msg(MSG::DEBUG) << "Registering callback on global Container with folder " << folderName << endmsg;
168  StatusCode trttmp = detStore()->regFcn(&IGeoModelTool::align, dynamic_cast<IGeoModelTool*>(this), calc, folderName);
169  // We don't expect this to fail as we have already checked that the detstore contains the object.
170  if (trttmp.isFailure()) {
171  msg(MSG::ERROR) << "Problem when register callback on global Container with folder " << folderName <<endmsg;
172  } else {
173  sc = StatusCode::SUCCESS;
174  }
175  } else {
176  msg(MSG::WARNING) << "Unable to register callback on global Container with folder " << folderName <<endmsg;
177  return StatusCode::FAILURE;
178  }
179 
180  folderName = "/TRT/AlignL2";
181  if (detStore()->contains<AlignableTransformContainer>(folderName)) {
182  if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Registering callback on AlignableTransformContainer with folder " << folderName << endmsg;
184  StatusCode sctmp = detStore()->regFcn(&IGeoModelTool::align, dynamic_cast<IGeoModelTool *>(this), atc, folderName);
185  if(sctmp.isFailure()) {
186  msg(MSG::ERROR) << "Problem when register callback on AlignableTransformContainer with folder " << folderName <<endmsg;
187  } else {
188  sc = StatusCode::SUCCESS;
189  }
190  }
191  else {
192  msg(MSG::WARNING) << "Unable to register callback on AlignableTransformContainer with folder "
193  << folderName << endmsg;
194  return StatusCode::FAILURE;
195  }
196  }
197  else { // Regular alignment old schema
198  std::string folderName = "/TRT/Align";
199  if (detStore()->contains<AlignableTransformContainer>(folderName)) {
200  msg(MSG::DEBUG) << "Registering callback on AlignableTransformContainer with folder " << folderName << endmsg;
202  StatusCode sctmp = detStore()->regFcn(&IGeoModelTool::align, dynamic_cast<IGeoModelTool *>(this), atc, folderName);
203  // We don't expect this to fail as we have already checked that the detstore contains the object.
204  if (sctmp.isFailure()) {
205  msg(MSG::ERROR) << "Problem when register callback on AlignableTransformContainer with folder " << folderName <<endmsg;
206  } else {
207  sc = StatusCode::SUCCESS;
208  }
209  } else {
210  msg(MSG::WARNING) << "Unable to register callback on AlignableTransformContainer with folder "
211  << folderName << ", Alignments disabled! (Only if no Run2 schema is loaded)" << endmsg;
212  }
213  }
214 
215 
216  // Fine alignment
217  {
218  std::string folderName = "/TRT/Calib/DX";
219  if (detStore()->contains<TRTCond::StrawDxContainer>(folderName)) {
220  msg(MSG::DEBUG) << "Registering callback on StrawDxContainer with folder " << folderName << endmsg;
222  StatusCode sctmp = detStore()->regFcn(&IGeoModelTool::align, dynamic_cast<IGeoModelTool*>(this), sdc, folderName);
223  // We don't expect this to fail as we have already checked that the detstore contains the object.
224  if (sctmp.isFailure()) {
225  msg(MSG::ERROR) << "Problem when register callback on StrawDxContainer with folder " << folderName <<endmsg;
226  } else {
227  sc = StatusCode::SUCCESS;
228  }
229  } else {
230  msg(MSG::DEBUG) << "Unable to register callback on StrawDxContainer with folder " << folderName <<endmsg;
231  }
232  }
233 
234  } else {
235  msg(MSG::INFO) << "Alignment disabled. No callback registered" << endmsg;
236  // We return failure otherwise it will try and register
237  // a GeoModelSvc callback associated with this callback.
238  }
239 
240  return sc;
241 }
242 
244 {
246  if(proxy) {
247  proxy->reset();
248  m_manager = nullptr;
249  }
250  return StatusCode::SUCCESS;
251 }
252 
253 
256 //The manager align call invalidates all elements
257 {
258  MsgStream log(msgSvc(), name());
259  if (!m_manager) {
260  msg(MSG::WARNING) << "Manager does not exist" << endmsg;
261  return StatusCode::FAILURE;
262  }
263  if (m_alignable) {
264  return const_cast<InDetDD::TRT_DetectorManager*>(m_manager)->align(I,keys);
265  } else {
266  msg(MSG::DEBUG) << "Alignment disabled. No alignments applied" << endmsg;
267  return StatusCode::SUCCESS;
268  }
269 }
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:87
GeoModelExperiment
Definition: GeoModelExperiment.h:32
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
TRT_DetectorTool::m_manager
const InDetDD::TRT_DetectorManager * m_manager
Definition: TRT_DetectorTool.h:57
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:23
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:107
TRTDetectorFactory_Full::create
virtual void create(GeoPhysVol *world) override
Definition: TRTDetectorFactory_Full.cxx:126
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:58
ATLAS_NOT_THREAD_SAFE
StatusCode TRT_DetectorTool::registerCallback ATLAS_NOT_THREAD_SAFE()
Install fatal handler with default options.
Definition: TRT_DetectorTool.cxx:150
IRDBRecordset_ptr
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
Definition: IRDBAccessSvc.h:25
TRT_DetectorTool::m_initialLayout
bool m_initialLayout
Definition: TRT_DetectorTool.h:59
python.PyKernel.detStore
detStore
Definition: PyKernel.py:41
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
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:30
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:68
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:55
TRTDetectorFactory_Lite
Definition: TRTDetectorFactory_Lite.h:28
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:30
SG::DataProxy
Definition: DataProxy.h:45
TRT_DetectorTool::clear
virtual StatusCode clear() override final
Definition: TRT_DetectorTool.cxx:243
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