ATLAS Offline Software
Loading...
Searching...
No Matches
TRT_PrepDataToxAOD.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// TRT_PrepDataToxAOD.cxx
7// Implementation file for class TRT_PrepDataToxAOD
9
10#include "TRT_PrepDataToxAOD.h"
11
13//#include "EventPrimitives/EventPrimitivesHelpers.h"
14
18
19
20#include "Identifier/Identifier.h"
22
23
24#include "TrkSurfaces/Surface.h"
25
29
32
33#define AUXDATA(OBJ, TYP, NAME) \
34 static const SG::AuxElement::Accessor<TYP> acc_##NAME (#NAME); acc_##NAME(*(OBJ))
35
37//
38// Constructor with parameters:
39//
41TRT_PrepDataToxAOD::TRT_PrepDataToxAOD(const std::string &name, ISvcLocator *pSvcLocator) :
42 AthAlgorithm(name,pSvcLocator)
43{
44}
45
47//
48// Initialize method:
49//
52{
53 ATH_MSG_DEBUG("Initialize");
54
55 //Initialize VarHandleKeys
57 ATH_CHECK(m_multiTruth.initialize(m_useTruthInfo && (not m_multiTruth.key().empty()) ));
58 ATH_CHECK(m_SDOcontainer.initialize(m_writeSDOs && (not m_SDOcontainer.key().empty()) ));
59 ATH_CHECK(m_xAodContainer.initialize());
60 ATH_CHECK(m_xAodOffset.initialize());
61
62 // --- Retrieve services and tools
63 CHECK ( detStore()->retrieve(m_TRTHelper, "TRT_ID") );
64
65 CHECK ( detStore()->retrieve(m_trtman, "TRT") );
66
67 CHECK ( m_neighbourSvc.retrieve() );
68
69 CHECK ( m_trtcaldbTool.retrieve() );
70
71 CHECK ( m_TRTStrawSummaryTool.retrieve() );
72
73 CHECK( m_driftFunctionTool.retrieve() );
74
75 return StatusCode::SUCCESS;
76}
77
79//
80// Execute method:
81//
84{
85 //This is needed for the algorithm. If not there, it fails
86
88 if (not h_trtPrds.isValid()) {
89 ATH_MSG_ERROR("Cannot retrieve TRT PrepDataContainer " << m_driftcirclecontainer.key());
90 return StatusCode::FAILURE;
91 }
92
93 //This is optional for the algorithm. If not there, just print a one-time warning
94 // On ESD
95
96 const PRD_MultiTruthCollection* prdmtColl = nullptr; // to be used in the loop later
97 if (m_useTruthInfo && (!m_multiTruth.key().empty()) ) {
99 if (not h_prdmtColl.isValid()){
101 ATH_MSG_WARNING("PRD MultiTruth collection not available (" << m_multiTruth.key() << "). Skipping this info although requested.");}
102 } else {
103 prdmtColl = h_prdmtColl.cptr();
104 }
105 }
106
107 //This is optional for the algorithm. If not there, just print a one-time warning
108 // On RDO
109
110 const InDetSimDataCollection* sdoCollection = nullptr; // to be used in the loop later
111 if (m_writeSDOs && m_useTruthInfo && (!m_SDOcontainer.key().empty()) ) {
113 if (not h_sdoCollection.isValid()) {
115 ATH_MSG_WARNING("SDO Collection not available (" << m_SDOcontainer.key() << "). Skipping this info although requested.");}
116 } else{
117 sdoCollection = h_sdoCollection.cptr();
118 }
119 }
120
121
122 // Create the xAOD container and its auxiliary store:
124 ATH_CHECK(xaod.record(std::make_unique<xAOD::TrackMeasurementValidationContainer>(),std::make_unique<xAOD::TrackMeasurementValidationAuxContainer>() ) );
125
127 ATH_CHECK(offsets.record(std::make_unique<std::vector<unsigned int>>(m_TRTHelper->straw_layer_hash_max() , 0) ));
128
129 InDet::TRT_DriftCircleContainer::const_iterator it = h_trtPrds->begin();
130 InDet::TRT_DriftCircleContainer::const_iterator it_end = h_trtPrds->end();
131 unsigned int counter(0);
132 for( ; it!=it_end; ++it ) {
133
134 //Fill Offset container
135 if( m_TRTHelper->straw_layer_hash_max() <= (*it)->identifyHash() )
136 ATH_MSG_ERROR("My assumption about the maximum size of the hash was wrong");
137 (*offsets)[ (*it)->identifyHash() ] = counter;
138
139 // skip empty collections
140 if( (*it)->empty() ) continue;
141
142 // loop over collection and convert to xAOD
143 for( const auto prd : **it ){
144
145 ++counter;
146
147 // create and add xAOD object
149 xaod->push_back(xprd);
150
151 Identifier surfaceID = prd->identify();
152
153 xprd->setIdentifier(surfaceID.get_compact());
154
155
156 // Save ID info:
157 AUXDATA(xprd, int, bec) = m_TRTHelper->barrel_ec( surfaceID ) ;
158 AUXDATA(xprd, int, layer) = m_TRTHelper->layer_or_wheel(surfaceID ) ;
159 AUXDATA(xprd, int, phi_module) = m_TRTHelper->phi_module( surfaceID ) ;
160 AUXDATA(xprd, int, strawlayer) = m_TRTHelper->straw_layer( surfaceID ) ;
161 AUXDATA(xprd, int, strawnumber) = m_TRTHelper->straw( surfaceID ) ;
162 const InDetDD::TRT_BaseElement* element = m_trtman->getElement(surfaceID);
163 AUXDATA(xprd, float, strawphi) = element->center(surfaceID).phi();
164
165 int chip=0;
166 int board=-1;
167 m_neighbourSvc->getChip(surfaceID,chip);
168 if(abs(m_TRTHelper->barrel_ec(surfaceID))<2)
169 board=m_neighbourSvc->chipToBoardBarrel(chip,m_TRTHelper->layer_or_wheel(surfaceID));
170 else if (chip<12)
171 board=0;
172 else {
173 chip=chip-20;
174 board=1;
175 }
176 AUXDATA(xprd, int, TRTboard) = board ;
177 AUXDATA(xprd, int, TRTchip) = chip ;
178
179
180 //Set Local Position
181 const Amg::Vector2D& locpos = prd->localPosition();
182 float locY(0.);
183 float locX = locpos.x();
184 if ( !(std::isinf(locpos.y()) || std::isnan(locpos.y())) ){
185 if (locpos.y()>=1e-07)
186 locY=locpos.y();
187 } else {
188 locY = -9999.;
189 }
190
191 // Set local error matrix
192 xprd->setLocalPosition(locX,locY);
193
194 const Amg::MatrixX& localCov = prd->localCovariance();
195 if(localCov.size() == 1){
196 xprd->setLocalPositionError( sqrt(localCov(0,0)), 0., 0. );
197 } else if(localCov.size() == 2){
198 xprd->setLocalPositionError( sqrt(localCov(0,0)), sqrt(localCov(1,1)), sqrt(localCov(0,1)) );
199 } else {
200 xprd->setLocalPositionError(0.,0.,0.);
201 }
202
203
204 //Set Global position
205 const Amg::Vector3D gpos = prd->detectorElement()->surface(surfaceID).localToGlobal(prd->localPosition());
206 xprd->setGlobalPosition(gpos.x(),gpos.y(),gpos.z());
207
208
209 //TRT hit bit word
210 unsigned int word = prd->getWord();
211
212
213 double tot = prd->timeOverThreshold();
214 bool isvalid=false;
215 AUXDATA(xprd, float, drifttime) = prd->driftTime(isvalid) ;
216 AUXDATA(xprd, int, status) = isvalid;
217 AUXDATA(xprd, float, tot) = tot ;
218 AUXDATA(xprd, char, isHT) = prd->highLevel() ;
219 AUXDATA(xprd, float, T0) = m_trtcaldbTool->getT0(surfaceID) ;
220
221
222 // Save time info:
223 AUXDATA(xprd, float, leadingEdge) = prd->rawDriftTime();
224
225 //Drift Time corrections
226 AUXDATA(xprd, float, driftTimeToTCorrection) = m_driftFunctionTool->driftTimeToTCorrection(tot,surfaceID);
227 if(prd->highLevel()) {
228 AUXDATA(xprd, float, driftTimeHTCorrection) = m_driftFunctionTool->driftTimeHTCorrection(surfaceID);
229 }
230 else {
231 AUXDATA(xprd, float, driftTimeHTCorrection) = 0;
232 }
233
234
235 //HT Bit patterens
236 unsigned int theWord = word & 0x04020100; //HT bits mask
237 char highThreshold = 0;
238 //this is the agreed-upon binning for HT bit patterns...
239 if (theWord == 0x04000000) //pattern 1
240 highThreshold = 1;
241 else if (theWord == 0x00020000) //pattern 2
242 highThreshold = 2;
243 else if (theWord == 0x00000100) //pattern 3
244 highThreshold = 3;
245 else if (theWord == 0x04020000) //pattern 4
246 highThreshold = 4;
247 else if (theWord == 0x00020100) //pattern 5
248 highThreshold = 5;
249 else if (theWord == 0x04000100) //pattern 6
250 highThreshold = 6;
251 else if (theWord == 0x04020100) //pattern 7
252 highThreshold = 7;
253
254 AUXDATA(xprd, char, highThreshold) = highThreshold;
255
256 //Full bit patternword from the TRT
257 AUXDATA(xprd, unsigned int, bitPattern) = word;
258
259 char gas_type = kUnset;
260 if (!m_TRTStrawSummaryTool.empty()) {
261 int stat = m_TRTStrawSummaryTool->getStatusHT(surfaceID, Gaudi::Hive::currentContext());
262
263 if ( stat==1 || stat==4 ) { gas_type = kArgon; }
264 else if ( stat==5 ) { gas_type = kKrypton; }
265 else if ( stat==2 || stat==3 ) { gas_type = kXenon; }
266 else if ( stat==6 ) gas_type = kEmAr;
267 else if ( stat==7 ) gas_type = kEmKr;
268 }
269 AUXDATA(xprd, char, gasType) = gas_type;
270
271 // Use the MultiTruth Collection to get a list of all true particle contributing to the DC
272 if (m_useTruthInfo){
273 if(prdmtColl){
274 std::vector<int> uniqueIDs;
275 auto range = prdmtColl->equal_range(surfaceID);
276 for (auto i = range.first; i != range.second; ++i) {
277 uniqueIDs.push_back( HepMC::uniqueID(i->second) );
278 }
279 AUXDATA(xprd, std::vector<int> , truth_barcode) = uniqueIDs; // TODO rename variable to be consistent?
280 }
281 }
282 if (m_writeSDOs) {
283 if(sdoCollection){
284 // find hit
285 auto pos = sdoCollection->find(surfaceID);
286 int sdo_word = -1000000;
287 if( pos != sdoCollection->end() ) {
288 sdo_word = pos->second.word();
289 }
290 AUXDATA(xprd, int, sdo_word) = sdo_word;
291 }
292 }
293
294 }
295 }
296 ATH_MSG_DEBUG( " recorded TRT_PrepData obejcts: size " << xaod->size() );
297
298
299
300 // Code to test that something was added to SG:
301 StatusCode sc = StatusCode::SUCCESS;
302
303 // --- end of event. Disable one-time warnings
304 m_firstEventWarnings = false;
305
306 return sc;
307}
308
310//
311// Finalize method:
312//
315{
316 return StatusCode::SUCCESS;
317}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
#define CHECK(...)
Evaluate an expression and check for errors.
static Double_t sc
#define AUXDATA(OBJ, TYP, NAME)
Handle class for reading from StoreGate.
Handle class for recording to StoreGate.
This is an Identifier helper class for the TRT subdetector.
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
const ServiceHandle< StoreGateSvc > & detStore() const
value_type get_compact() const
Get the compact id.
Virtual base class of TRT readout elements.
virtual const Amg::Vector3D & center() const override final
Element Surface: center of a straw layer.
A PRD is mapped onto all contributing particles.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
virtual StatusCode finalize()
ServiceHandle< ITRT_StrawNeighbourSvc > m_neighbourSvc
virtual StatusCode initialize()
SG::ReadHandleKey< InDet::TRT_DriftCircleContainer > m_driftcirclecontainer
ToolHandle< ITRT_StrawStatusSummaryTool > m_TRTStrawSummaryTool
const TRT_ID * m_TRTHelper
const InDetDD::TRT_DetectorManager * m_trtman
Gaudi::Property< bool > m_writeSDOs
ToolHandle< ITRT_DriftFunctionTool > m_driftFunctionTool
Gaudi::Property< bool > m_useTruthInfo
SG::WriteHandleKey< xAOD::TrackMeasurementValidationContainer > m_xAodContainer
SG::ReadHandleKey< InDetSimDataCollection > m_SDOcontainer
ToolHandle< ITRT_CalDbTool > m_trtcaldbTool
TRT_PrepDataToxAOD(const std::string &name, ISvcLocator *pSvcLocator)
SG::WriteHandleKey< std::vector< unsigned int > > m_xAodOffset
virtual StatusCode execute()
SG::ReadHandleKey< PRD_MultiTruthCollection > m_multiTruth
void setLocalPositionError(float localXError, float localYError, float localXYCorrelation)
Sets the local position error.
void setLocalPosition(float localX, float localY)
Sets the local position.
void setIdentifier(uint64_t identifier)
Sets the identifier.
void setGlobalPosition(float globalX, float globalY, float globalZ)
Sets the global position.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
int uniqueID(const T &p)
TrackMeasurementValidation_v1 TrackMeasurementValidation
Reference the current persistent version: