ATLAS Offline Software
TRT_PrepDataToxAOD.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 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"
21 #include "InDetIdentifier/TRT_ID.h"
22 
23 
24 #include "TrkSurfaces/Surface.h"
27 
31 
32 #include "StoreGate/ReadHandle.h"
33 #include "StoreGate/WriteHandle.h"
34 
35 #define AUXDATA(OBJ, TYP, NAME) \
36  static const SG::AuxElement::Accessor<TYP> acc_##NAME (#NAME); acc_##NAME(*(OBJ))
37 
39 //
40 // Constructor with parameters:
41 //
43 TRT_PrepDataToxAOD::TRT_PrepDataToxAOD(const std::string &name, ISvcLocator *pSvcLocator) :
44  AthAlgorithm(name,pSvcLocator),
45  m_driftFunctionTool("TRT_DriftFunctionTool", this),
46  m_trtcaldbTool("TRT_CalDbTool", this),
47  m_neighbourSvc("TRT_StrawNeighbourSvc", name),
48  m_TRTStrawSummaryTool("TRT_StrawStatusSummaryTool",this),
49  m_TRTHelper(nullptr),
50  m_trtman(nullptr),
51  m_firstEventWarnings(true)
52 {
53 
54  // --- Services and Tools
55  declareProperty("TRTDriftFunctionTool", m_driftFunctionTool);
56  declareProperty("TRTCalDbTool", m_trtcaldbTool);
57  declareProperty("NeighbourSvc", m_neighbourSvc);
58  declareProperty("TRTStrawSummaryTool", m_TRTStrawSummaryTool);
59 
60 }
61 
63 //
64 // Initialize method:
65 //
68 {
69  ATH_MSG_DEBUG("Initialize");
70 
71  //Initialize VarHandleKeys
75  ATH_CHECK(m_xAodContainer.initialize());
77 
78  // --- Retrieve services and tools
79  CHECK ( detStore()->retrieve(m_TRTHelper, "TRT_ID") );
80 
81  CHECK ( detStore()->retrieve(m_trtman, "TRT") );
82 
83  CHECK ( m_neighbourSvc.retrieve() );
84 
85  CHECK ( m_trtcaldbTool.retrieve() );
86 
87  CHECK ( m_TRTStrawSummaryTool.retrieve() );
88 
89  CHECK( m_driftFunctionTool.retrieve() );
90 
91  return StatusCode::SUCCESS;
92 }
93 
95 //
96 // Execute method:
97 //
100 {
101  //This is needed for the algorithm. If not there, it fails
102 
104  if (not h_trtPrds.isValid()) {
105  ATH_MSG_ERROR("Cannot retrieve TRT PrepDataContainer " << m_driftcirclecontainer.key());
106  return StatusCode::FAILURE;
107  }
108 
109  //This is optional for the algorithm. If not there, just print a one-time warning
110  // On ESD
111 
112  const PRD_MultiTruthCollection* prdmtColl = nullptr; // to be used in the loop later
113  if (m_useTruthInfo && (!m_multiTruth.key().empty()) ) {
115  if (not h_prdmtColl.isValid()){
116  if (m_firstEventWarnings) {
117  ATH_MSG_WARNING("PRD MultiTruth collection not available (" << m_multiTruth.key() << "). Skipping this info although requested.");}
118  } else {
119  prdmtColl = h_prdmtColl.cptr();
120  }
121  }
122 
123  //This is optional for the algorithm. If not there, just print a one-time warning
124  // On RDO
125 
126  const InDetSimDataCollection* sdoCollection = nullptr; // to be used in the loop later
127  if (m_writeSDOs && m_useTruthInfo && (!m_SDOcontainer.key().empty()) ) {
129  if (not h_sdoCollection.isValid()) {
131  ATH_MSG_WARNING("SDO Collection not available (" << m_SDOcontainer.key() << "). Skipping this info although requested.");}
132  } else{
133  sdoCollection = h_sdoCollection.cptr();
134  }
135  }
136 
137 
138  // Create the xAOD container and its auxiliary store:
140  ATH_CHECK(xaod.record(std::make_unique<xAOD::TrackMeasurementValidationContainer>(),std::make_unique<xAOD::TrackMeasurementValidationAuxContainer>() ) );
141 
143  ATH_CHECK(offsets.record(std::make_unique<std::vector<unsigned int>>(m_TRTHelper->straw_layer_hash_max() , 0) ));
144 
145  InDet::TRT_DriftCircleContainer::const_iterator it = h_trtPrds->begin();
146  InDet::TRT_DriftCircleContainer::const_iterator it_end = h_trtPrds->end();
147  unsigned int counter(0);
148  for( ; it!=it_end; ++it ) {
149 
150  //Fill Offset container
151  if( m_TRTHelper->straw_layer_hash_max() <= (*it)->identifyHash() )
152  ATH_MSG_ERROR("My assumption about the maximum size of the hash was wrong");
153  (*offsets)[ (*it)->identifyHash() ] = counter;
154 
155  // skip empty collections
156  if( (*it)->empty() ) continue;
157 
158  // loop over collection and convert to xAOD
159  for( const auto prd : **it ){
160 
161  ++counter;
162 
163  // create and add xAOD object
165  xaod->push_back(xprd);
166 
167  Identifier surfaceID = prd->identify();
168 
169  xprd->setIdentifier(surfaceID.get_compact());
170 
171 
172  // Save ID info:
173  AUXDATA(xprd, int, bec) = m_TRTHelper->barrel_ec( surfaceID ) ;
174  AUXDATA(xprd, int, layer) = m_TRTHelper->layer_or_wheel(surfaceID ) ;
175  AUXDATA(xprd, int, phi_module) = m_TRTHelper->phi_module( surfaceID ) ;
176  AUXDATA(xprd, int, strawlayer) = m_TRTHelper->straw_layer( surfaceID ) ;
177  AUXDATA(xprd, int, strawnumber) = m_TRTHelper->straw( surfaceID ) ;
178  const InDetDD::TRT_BaseElement* element = m_trtman->getElement(surfaceID);
179  AUXDATA(xprd, float, strawphi) = element->center(surfaceID).phi();
180 
181  int chip=0;
182  int board=-1;
183  m_neighbourSvc->getChip(surfaceID,chip);
184  if(abs(m_TRTHelper->barrel_ec(surfaceID))<2)
185  board=m_neighbourSvc->chipToBoardBarrel(chip,m_TRTHelper->layer_or_wheel(surfaceID));
186  else if (chip<12)
187  board=0;
188  else {
189  chip=chip-20;
190  board=1;
191  }
192  AUXDATA(xprd, int, TRTboard) = board ;
193  AUXDATA(xprd, int, TRTchip) = chip ;
194 
195 
196  //Set Local Position
197  const Amg::Vector2D& locpos = prd->localPosition();
198  float locY(0.);
199  float locX = locpos.x();
200  if ( !(std::isinf(locpos.y()) || std::isnan(locpos.y())) ){
201  if (locpos.y()>=1e-07)
202  locY=locpos.y();
203  } else {
204  locY = -9999.;
205  }
206 
207  // Set local error matrix
208  xprd->setLocalPosition(locX,locY);
209 
210  const Amg::MatrixX& localCov = prd->localCovariance();
211  if(localCov.size() == 1){
212  xprd->setLocalPositionError( sqrt(localCov(0,0)), 0., 0. );
213  } else if(localCov.size() == 2){
214  xprd->setLocalPositionError( sqrt(localCov(0,0)), sqrt(localCov(1,1)), sqrt(localCov(0,1)) );
215  } else {
216  xprd->setLocalPositionError(0.,0.,0.);
217  }
218 
219 
220  //Set Global position
221  const Amg::Vector3D gpos = prd->detectorElement()->surface(surfaceID).localToGlobal(prd->localPosition());
222  xprd->setGlobalPosition(gpos.x(),gpos.y(),gpos.z());
223 
224 
225  //TRT hit bit word
226  unsigned int word = prd->getWord();
227 
228 
229  double tot = prd->timeOverThreshold();
230  bool isvalid=false;
231  AUXDATA(xprd, float, drifttime) = prd->driftTime(isvalid) ;
232  AUXDATA(xprd, int, status) = isvalid;
233  AUXDATA(xprd, float, tot) = tot ;
234  AUXDATA(xprd, char, isHT) = prd->highLevel() ;
235  AUXDATA(xprd, float, T0) = m_trtcaldbTool->getT0(surfaceID) ;
236 
237 
238  // Save time info:
239  AUXDATA(xprd, float, leadingEdge) = prd->rawDriftTime();
240 
241  //Drift Time corrections
242  AUXDATA(xprd, float, driftTimeToTCorrection) = m_driftFunctionTool->driftTimeToTCorrection(tot,surfaceID);
243  if(prd->highLevel()) {
244  AUXDATA(xprd, float, driftTimeHTCorrection) = m_driftFunctionTool->driftTimeHTCorrection(surfaceID);
245  }
246  else {
247  AUXDATA(xprd, float, driftTimeHTCorrection) = 0;
248  }
249 
250 
251  //HT Bit patterens
252  unsigned int theWord = word & 0x04020100; //HT bits mask
253  char highThreshold = 0;
254  //this is the agreed-upon binning for HT bit patterns...
255  if (theWord == 0x04000000) //pattern 1
256  highThreshold = 1;
257  else if (theWord == 0x00020000) //pattern 2
258  highThreshold = 2;
259  else if (theWord == 0x00000100) //pattern 3
260  highThreshold = 3;
261  else if (theWord == 0x04020000) //pattern 4
262  highThreshold = 4;
263  else if (theWord == 0x00020100) //pattern 5
264  highThreshold = 5;
265  else if (theWord == 0x04000100) //pattern 6
266  highThreshold = 6;
267  else if (theWord == 0x04020100) //pattern 7
268  highThreshold = 7;
269 
270  AUXDATA(xprd, char, highThreshold) = highThreshold;
271 
272  //Full bit patternword from the TRT
273  AUXDATA(xprd, unsigned int, bitPattern) = word;
274 
275  char gas_type = kUnset;
276  if (!m_TRTStrawSummaryTool.empty()) {
277  int stat = m_TRTStrawSummaryTool->getStatusHT(surfaceID);
278 
279  if ( stat==1 || stat==4 ) { gas_type = kArgon; }
280  else if ( stat==5 ) { gas_type = kKrypton; }
281  else if ( stat==2 || stat==3 ) { gas_type = kXenon; }
282  else if ( stat==6 ) gas_type = kEmAr;
283  else if ( stat==7 ) gas_type = kEmKr;
284  }
285  AUXDATA(xprd, char, gasType) = gas_type;
286 
287  // Use the MultiTruth Collection to get a list of all true particle contributing to the DC
288  if (m_useTruthInfo){
289  if(prdmtColl){
290  std::vector<int> barcodes;
291  auto range = prdmtColl->equal_range(surfaceID);
292  for (auto i = range.first; i != range.second; ++i) {
293  barcodes.push_back( i->second.barcode() );
294  }
295  AUXDATA(xprd, std::vector<int> , truth_barcode) = barcodes;
296  }
297  }
298  if (m_writeSDOs) {
299  if(sdoCollection){
300  // find hit
301  auto pos = sdoCollection->find(surfaceID);
302  int sdo_word = -1000000;
303  if( pos != sdoCollection->end() ) {
304  sdo_word = pos->second.word();
305  }
306  AUXDATA(xprd, int, sdo_word) = sdo_word;
307  }
308  }
309 
310  }
311  }
312  ATH_MSG_DEBUG( " recorded TRT_PrepData obejcts: size " << xaod->size() );
313 
314 
315 
316  // Code to test that something was added to SG:
317  StatusCode sc = StatusCode::SUCCESS;
318 
319  // --- end of event. Disable one-time warnings
320  m_firstEventWarnings = false;
321 
322  return sc;
323 }
324 
326 //
327 // Finalize method:
328 //
331 {
332  return StatusCode::SUCCESS;
333 }
TRT_PrepDataToxAOD::TRT_PrepDataToxAOD
TRT_PrepDataToxAOD(const std::string &name, ISvcLocator *pSvcLocator)
Definition: TRT_PrepDataToxAOD.cxx:43
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
Amg::MatrixX
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Definition: EventPrimitives.h:29
Trk::locX
@ locX
Definition: ParamDefs.h:43
Trk::locY
@ locY
local cartesian
Definition: ParamDefs.h:44
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
Surface.h
TRT_PrepDataToxAOD::m_driftcirclecontainer
SG::ReadHandleKey< InDet::TRT_DriftCircleContainer > m_driftcirclecontainer
Definition: TRT_PrepDataToxAOD.h:59
ParticleGun_SamplingFraction.bec
int bec
Definition: ParticleGun_SamplingFraction.py:89
make_unique
std::unique_ptr< T > make_unique(Args &&... args)
Definition: SkimmingToolEXOT5.cxx:23
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
TrackMeasurementValidationAuxContainer.h
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
xAOD::TrackMeasurementValidation
TrackMeasurementValidation_v1 TrackMeasurementValidation
Reference the current persistent version:
Definition: TrackMeasurementValidation.h:13
TRT_PrepDataToxAOD::m_firstEventWarnings
bool m_firstEventWarnings
Definition: TRT_PrepDataToxAOD.h:75
PRD_MultiTruthCollection
A PRD is mapped onto all contributing particles.
Definition: PRD_MultiTruthCollection.h:24
TRT_ID::straw_layer_hash_max
size_type straw_layer_hash_max(void) const
Definition: TRT_ID.h:920
TRT_PrepDataToxAOD::m_trtman
const InDetDD::TRT_DetectorManager * m_trtman
Definition: TRT_PrepDataToxAOD.h:72
AUXDATA
#define AUXDATA(OBJ, TYP, NAME)
Definition: TRT_PrepDataToxAOD.cxx:35
skel.it
it
Definition: skel.GENtoEVGEN.py:423
TRT_ID.h
This is an Identifier helper class for the TRT subdetector. This class is a factory for creating comp...
InDetSimDataCollection
Definition: InDetSimDataCollection.h:25
TRT_PrepDataToxAOD::m_TRTHelper
const TRT_ID * m_TRTHelper
Definition: TRT_PrepDataToxAOD.h:71
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
TRT_PrepDataToxAOD::m_multiTruth
SG::ReadHandleKey< PRD_MultiTruthCollection > m_multiTruth
Definition: TRT_PrepDataToxAOD.h:60
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
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
TRT_PrepDataToxAOD::m_SDOcontainer
SG::ReadHandleKey< InDetSimDataCollection > m_SDOcontainer
Definition: TRT_PrepDataToxAOD.h:61
TRT_PrepDataToxAOD::m_neighbourSvc
ServiceHandle< ITRT_StrawNeighbourSvc > m_neighbourSvc
Definition: TRT_PrepDataToxAOD.h:69
xAOD::TrackMeasurementValidation_v1
Class describing a TrackMeasurementValidation.
Definition: TrackMeasurementValidation_v1.h:27
WriteHandle.h
Handle class for recording to StoreGate.
TRT_PrepDataToxAOD::kXenon
@ kXenon
Definition: TRT_PrepDataToxAOD.h:43
TRT_ID::straw
int straw(const Identifier &id) const
Definition: TRT_ID.h:902
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
xAOD::TrackMeasurementValidation_v1::setLocalPosition
void setLocalPosition(float localX, float localY)
Sets the local position.
python.Dumpers.barcodes
def barcodes(beg, end, sz)
Definition: Dumpers.py:2800
lumiFormat.i
int i
Definition: lumiFormat.py:92
TRT_PrepDataToxAOD::initialize
virtual StatusCode initialize()
Definition: TRT_PrepDataToxAOD.cxx:67
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
TRT_PrepDataToxAOD::m_TRTStrawSummaryTool
ToolHandle< ITRT_StrawStatusSummaryTool > m_TRTStrawSummaryTool
Definition: TRT_PrepDataToxAOD.h:70
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
TRT_PrepDataToxAOD::kEmKr
@ kEmKr
Definition: TRT_PrepDataToxAOD.h:43
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
TRT_PrepDataToxAOD::finalize
virtual StatusCode finalize()
Definition: TRT_PrepDataToxAOD.cxx:330
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
TRT_ID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: TRT_ID.h:866
TRT_ID::straw_layer
int straw_layer(const Identifier &id) const
Definition: TRT_ID.h:893
xAOD::TrackMeasurementValidation_v1::setIdentifier
void setIdentifier(uint64_t identifier)
Sets the identifier.
TRT_PrepDataToxAOD::execute
virtual StatusCode execute()
Definition: TRT_PrepDataToxAOD.cxx:99
TRT_ID::layer_or_wheel
int layer_or_wheel(const Identifier &id) const
Definition: TRT_ID.h:884
beamspotman.stat
stat
Definition: beamspotman.py:266
LB_AnalMapSplitter.tot
tot
Definition: LB_AnalMapSplitter.py:46
AthAlgorithm
Definition: AthAlgorithm.h:47
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
TRT_PrepDataToxAOD::m_useTruthInfo
Gaudi::Property< bool > m_useTruthInfo
Definition: TRT_PrepDataToxAOD.h:55
TRT_PrepDataToxAOD::m_xAodOffset
SG::WriteHandleKey< std::vector< unsigned int > > m_xAodOffset
Definition: TRT_PrepDataToxAOD.h:63
TRT_DriftCircleContainer.h
xAOD::TrackMeasurementValidation_v1::setGlobalPosition
void setGlobalPosition(float globalX, float globalY, float globalZ)
Sets the global position.
Definition: TrackMeasurementValidation_v1.cxx:50
ITRT_DriftFunctionTool.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
InDetDD::TRT_DetectorManager::getElement
const TRT_BaseElement * getElement(Identifier id) const
Access Elements Generically---------------------------------------------—.
Definition: TRT_DetectorManager.cxx:158
xAOD::TrackMeasurementValidation_v1::setLocalPositionError
void setLocalPositionError(float localXError, float localYError, float localXYCorrelation)
Sets the local position error.
Definition: TrackMeasurementValidation_v1.cxx:37
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
TRT_ID::phi_module
int phi_module(const Identifier &id) const
Definition: TRT_ID.h:875
TRT_PrepDataToxAOD::kEmAr
@ kEmAr
Definition: TRT_PrepDataToxAOD.h:43
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
TRT_PrepDataToxAOD::m_trtcaldbTool
ToolHandle< ITRT_CalDbTool > m_trtcaldbTool
Definition: TRT_PrepDataToxAOD.h:68
ITRT_StrawNeighbourSvc.h
Abstract interface to information on straws electronic grouping.
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
TRTUncompressedHitCollection.h
Identifier::get_compact
value_type get_compact(void) const
Get the compact id.
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
InDetSimDataCollection.h
InDetDD::TRT_BaseElement::center
virtual const Amg::Vector3D & center() const override final
Element Surface: center of a straw layer.
TrackMeasurementValidation.h
TRT_PrepDataToxAOD::m_xAodContainer
SG::WriteHandleKey< xAOD::TrackMeasurementValidationContainer > m_xAodContainer
Definition: TRT_PrepDataToxAOD.h:62
PRD_MultiTruthCollection.h
TRT_PrepDataToxAOD::kArgon
@ kArgon
Definition: TRT_PrepDataToxAOD.h:43
TrackMeasurementValidationContainer.h
merge.status
status
Definition: merge.py:17
ReadHandle.h
Handle class for reading from StoreGate.
TRT_PrepDataToxAOD::m_driftFunctionTool
ToolHandle< ITRT_DriftFunctionTool > m_driftFunctionTool
DriftFunctionTool.
Definition: TRT_PrepDataToxAOD.h:67
TRT_PrepDataToxAOD.h
test_pyathena.counter
counter
Definition: test_pyathena.py:15
TRT_PrepDataToxAOD::m_writeSDOs
Gaudi::Property< bool > m_writeSDOs
Definition: TRT_PrepDataToxAOD.h:56
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
TRT_PrepDataToxAOD::kUnset
@ kUnset
Definition: TRT_PrepDataToxAOD.h:43
InDetDD::TRT_BaseElement
Definition: TRT_BaseElement.h:57
TRT_PrepDataToxAOD::kKrypton
@ kKrypton
Definition: TRT_PrepDataToxAOD.h:43