ATLAS Offline Software
xAODTrackParticleRetriever.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 #include "CLHEP/Units/SystemOfUnits.h"
8 
10 //#include "TrkTrackSummary/TrackSummary.h"
11 
12 namespace JiveXML {
13 
26  xAODTrackParticleRetriever::xAODTrackParticleRetriever(const std::string& type,const std::string& name,const IInterface* parent):
27  AthAlgTool(type,name,parent), m_typeName("Track"){
28 
29  //Only declare the interface
30  declareInterface<IDataRetriever>(this);
31 
32  //In xAOD: GSFTrackParticles, CombinedFitMuonParticles, InDetTrackParticlesForward, ExtrapolatedMuonSpectrometerParticles
33  declareProperty("StoreGateKey", m_sgKey = "InDetTrackParticles",
34  "Collection to be first in output, shown in Atlantis without switching");
35  declareProperty("PriorityTrackCollection", m_sgKey = "TrackParticleCandidate",
36  "Track collections to retrieve first, shown as default in Atlantis");
37  declareProperty("OtherTrackCollections" , m_otherKeys , "Track collections to retrieve, all if empty");
38  declareProperty("DoWriteHLT" , m_doWriteHLT = false, "Wether to write HLTAutoKey objects");
39  }
40 
45  StatusCode xAODTrackParticleRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
46 
47  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "in retrieveAll()" << endmsg;
48 
50  const xAOD::TrackParticleContainer* TrackParticles;
51 
52  //obtain the default collection first
53  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve " << dataTypeName() << " (" << m_sgKey << ")" << endmsg;
54  StatusCode sc = evtStore()->retrieve(TrackParticles, m_sgKey);
55  if (sc.isFailure() ) {
56  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << m_sgKey << " not found in SG " << endmsg;
57  }else{
58  DataMap data = getData(TrackParticles);
59  if ( FormatTool->AddToEvent(dataTypeName(), m_sgKey+"_xAOD", &data).isFailure()){
60  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << m_sgKey << " not found in SG " << endmsg;
61  }else{
62  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << " (" << m_sgKey << ") TrackParticle retrieved" << endmsg;
63  }
64  }
65 
66  if ( m_otherKeys.empty() ) {
67  //obtain all other collections from StoreGate
68  if (( evtStore()->retrieve(iterator, end)).isFailure()){
69  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Unable to retrieve iterator for Jet collection" << endmsg;
70 // return false;
71  }
72 
73  for (; iterator!=end; ++iterator) {
74  if (iterator.key()!=m_sgKey) {
75  if ((iterator.key().find("HLT",0) != std::string::npos) && (!m_doWriteHLT)){
76  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Ignoring HLT-AutoKey collection " << iterator.key() << endmsg;
77  continue; }
78  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve all. Current collection: " << dataTypeName() << " (" << iterator.key() << ")" << endmsg;
80  //Check if this is an HLT-AutoKey collection
81  if ( FormatTool->AddToEvent(dataTypeName(), iterator.key()+"_xAOD", &data).isFailure()){
82  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << iterator.key() << " not found in SG " << endmsg;
83  }else{
84  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << " (" << iterator.key() << ") AODJet retrieved" << endmsg;
85  }
86  }
87  }
88  }else {
89  //obtain all collections with the given keys
90  std::vector<std::string>::const_iterator keyIter;
91  for ( keyIter=m_otherKeys.begin(); keyIter!=m_otherKeys.end(); ++keyIter ){
92  if ( !evtStore()->contains<xAOD::TrackParticleContainer>( (*keyIter) ) ){ continue; } // skip if not in SG
93  StatusCode sc = evtStore()->retrieve( TrackParticles, (*keyIter) );
94  if (!sc.isFailure()) {
95  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve selected " << dataTypeName() << " (" << (*keyIter) << ")" << endmsg;
96  DataMap data = getData(TrackParticles);
97  if ( FormatTool->AddToEvent(dataTypeName(), (*keyIter)+"_xAOD", &data).isFailure()){
98  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << (*keyIter) << " not found in SG " << endmsg;
99  }else{
100  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << " (" << (*keyIter) << ") retrieved" << endmsg;
101  }
102  }
103  }
104  }
105  //All collections retrieved okay
106  return StatusCode::SUCCESS;
107  }
108 
109 
115 
116  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "in getData()" << endmsg;
117 
119 
120  DataVect d0; d0.reserve(TrackParticleCont->size());
121  DataVect z0; z0.reserve(TrackParticleCont->size());
122  DataVect pt; pt.reserve(TrackParticleCont->size());
123  DataVect phi0; phi0.reserve(TrackParticleCont->size());
124  DataVect cotTheta; cotTheta.reserve(TrackParticleCont->size());
125  DataVect label; label.reserve(TrackParticleCont->size());
126  DataVect nBLayerHits; nBLayerHits.reserve(TrackParticleCont->size());
127  DataVect nPixHits; nPixHits.reserve(TrackParticleCont->size());
128  DataVect nSCTHits; nSCTHits.reserve(TrackParticleCont->size());
129  DataVect nTRTHits; nTRTHits.reserve(TrackParticleCont->size());
130 
131  xAOD::TrackParticleContainer::const_iterator TrackParticleItr = TrackParticleCont->begin();
132  xAOD::TrackParticleContainer::const_iterator TrackParticleItrE = TrackParticleCont->end();
133 
134  int counter = 0;
135  float charge = 0.;
136  float myQOverP = 0.;
137  double countHits = 0.;
138  std::string labelStr = "unknownHits";
139 
140  for (; TrackParticleItr != TrackParticleItrE; ++TrackParticleItr) {
141 
142  if (msgLvl(MSG::VERBOSE)) {
143  msg(MSG::VERBOSE) << " TrackParticle #" << counter++ << " : d0 = " << (*TrackParticleItr)->d0() << ", z0 = "
144  << (*TrackParticleItr)->z0() << ", pt[GeV] = " << (*TrackParticleItr)->pt()*(1./CLHEP::GeV)
145  << ", phi = " << (*TrackParticleItr)->phi()
146  << ", qOverP = " << (*TrackParticleItr)->qOverP()
147  << ", abs(qOverP) = " << fabs((*TrackParticleItr)->qOverP())
148  << endmsg;
149  }
150 
151  // Event/xAOD/xAODTrackingCnv/trunk/src/TrackParticleCnvAlg.cxx#L190 Info from Nick Styles
152 
154  uint8_t numberOfBLayerHits_tmp=0;
155  if ( (*TrackParticleItr)->summaryValue(numberOfBLayerHits_tmp,xAOD::numberOfBLayerHits) ){
156  numberOfBLayerHits += numberOfBLayerHits_tmp;
157  }
159  uint8_t numberOfPixelHits_tmp = 0;
160  if ( (*TrackParticleItr)->summaryValue(numberOfPixelHits_tmp,xAOD::numberOfPixelHits)){
161  numberOfPixelHits += numberOfPixelHits_tmp;
162  }
164  uint8_t numberOfTRTHits_tmp = 0;
165  if ( (*TrackParticleItr)->summaryValue(numberOfTRTHits_tmp,xAOD::numberOfTRTHits)){
166  numberOfTRTHits += numberOfTRTHits_tmp;
167  }
169  uint8_t numberOfSCTHits_tmp = 0;
170  if ( (*TrackParticleItr)->summaryValue(numberOfSCTHits_tmp,xAOD::numberOfSCTHits)){
171  numberOfSCTHits += numberOfSCTHits_tmp;
172  }
173  labelStr = "_PixelHits"+DataType( (double)numberOfPixelHits ).toString()
174  + "_SCTHits"+DataType( (double)numberOfSCTHits ).toString()
175  + "_BLayerHits"+DataType( (double)numberOfBLayerHits ).toString()
176  + "_TRTHits"+DataType( (double)numberOfTRTHits ).toString() ;
177 
178  countHits = (double)numberOfBLayerHits + (double)numberOfPixelHits
180 
181  if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << " TrackParticle #" << counter
182  << " BLayer hits: " << (double)numberOfBLayerHits
183  << ", Pixel hits: " << (double)numberOfPixelHits
184  << ", SCT hits: " << (double)numberOfSCTHits
185  << ", TRT hits: " << (double)numberOfTRTHits
186  << ", Total hits: " << countHits
187  << "; Label: " << labelStr << endmsg;
188 
189  nBLayerHits.push_back( DataType( (double)numberOfBLayerHits ));
190  nPixHits.push_back( DataType( (double)numberOfPixelHits ));
191  nSCTHits.push_back( DataType( (double)numberOfSCTHits ));
192  nTRTHits.push_back( DataType( (double)numberOfTRTHits ));
193 
194  label.push_back( DataType( labelStr ).toString() );
195  d0.push_back(DataType((*TrackParticleItr)->d0()/CLHEP::cm));
196  z0.push_back(DataType((*TrackParticleItr)->z0()/CLHEP::cm));
197  phi0.push_back(DataType((*TrackParticleItr)->phi()));
198 
199  // pt is always positive, get charge from qOverP
200  myQOverP = (*TrackParticleItr)->qOverP() ;
201  if (fabs(myQOverP) != myQOverP){
202  charge = -1.;
203  }else{
204  charge = +1.;
205  }
206  pt.push_back(DataType(( charge*(*TrackParticleItr)->pt() )/CLHEP::GeV));
207 
208  if ( (*TrackParticleItr)->theta() == 0.) {
209  cotTheta.push_back(DataType(9999.));
210  } else {
211  cotTheta.push_back(DataType(1./tan((*TrackParticleItr)->theta())));
212  }
213  } // end TrackParticleIterator
214 
215  // four-vectors
216  DataMap["d0"] = d0;
217  DataMap["z0"] = z0;
218  DataMap["pt"] = pt;
219  DataMap["phi0"] = phi0;
220  DataMap["cotTheta"] = cotTheta;
221  DataMap["label"] = label;
222  DataMap["nBLayerHits"] = nBLayerHits;
223  DataMap["nPixHits"] = nPixHits;
224  DataMap["nSCTHits"] = nSCTHits;
225  DataMap["nTRTHits"] = nTRTHits;
226 
227  if (msgLvl(MSG::DEBUG)) {
228  msg(MSG::DEBUG) << dataTypeName() << " retrieved with " << d0.size() << " entries"<< endmsg;
229  }
230 
231  //All collections retrieved okay
232  return DataMap;
233 
234  } // retrieve
235 
236  //--------------------------------------------------------------------------
237 
238 } // JiveXML namespace
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
GeV
#define GeV
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/Root/HelperFunctions.cxx:17
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:557
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
PlotCalibFromCool.label
label
Definition: PlotCalibFromCool.py:78
InDetAccessor::phi0
@ phi0
Definition: InDetAccessor.h:33
JiveXML::DataVect
std::vector< DataType > DataVect
Defines a map with a key and a vector of DataType objects e.g.
Definition: DataType.h:58
DataType
OFFLINE_FRAGMENTS_NAMESPACE::PointerType DataType
Definition: RoIBResultByteStreamTool.cxx:25
test_pyathena.pt
pt
Definition: test_pyathena.py:11
AthCommonMsg< AlgTool >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
xAOD::numberOfPixelHits
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
Definition: TrackingPrimitives.h:259
xAOD::numberOfTRTHits
@ numberOfTRTHits
number of TRT hits [unit8_t].
Definition: TrackingPrimitives.h:275
JiveXML::DataMap
std::map< std::string, DataVect > DataMap
Definition: DataType.h:59
JiveXML::xAODTrackParticleRetriever::getData
const DataMap getData(const xAOD::TrackParticleContainer *)
Retrieve basic parameters, mainly four-vectors, for each collection.
Definition: xAODTrackParticleRetriever.cxx:114
JiveXML::xAODTrackParticleRetriever::m_sgKey
std::string m_sgKey
First track collections to retrieve, shown as default in Atlantis.
Definition: xAODTrackParticleRetriever.h:54
xAOD::numberOfBLayerHits
@ numberOfBLayerHits
these are the hits in the first pixel layer, i.e.
Definition: TrackingPrimitives.h:231
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
cm
const double cm
Definition: Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimParametrization/tools/FCAL_ChannelMap.cxx:25
AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
JiveXML::xAODTrackParticleRetriever::retrieve
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
Definition: xAODTrackParticleRetriever.cxx:45
IDTPM::nSCTHits
float nSCTHits(const U &p)
Definition: TrackParametersHelper.h:393
IDTPM::nTRTHits
float nTRTHits(const U &p)
Definition: TrackParametersHelper.h:446
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
TRT::Track::d0
@ d0
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:62
test_pyathena.parent
parent
Definition: test_pyathena.py:15
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
xAOD::double
double
Definition: CompositeParticle_v1.cxx:159
TRT::Track::z0
@ z0
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:63
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
JiveXML
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
Definition: BadLArRetriever.cxx:22
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
charge
double charge(const T &p)
Definition: AtlasPID.h:756
JiveXML::xAODTrackParticleRetriever::m_otherKeys
std::vector< std::string > m_otherKeys
Track collections to retrieve in the sequence they are given, all if empty.
Definition: xAODTrackParticleRetriever.h:56
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
xAODTrackParticleRetriever.h
DEBUG
#define DEBUG
Definition: page_access.h:11
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
JiveXML::xAODTrackParticleRetriever::xAODTrackParticleRetriever
xAODTrackParticleRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
Definition: xAODTrackParticleRetriever.cxx:26
JiveXML::xAODTrackParticleRetriever::dataTypeName
virtual std::string dataTypeName() const
Return the name of the data type.
Definition: xAODTrackParticleRetriever.h:45
TRT::Track::cotTheta
@ cotTheta
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:65
xAOD::numberOfSCTHits
@ numberOfSCTHits
number of hits in SCT [unit8_t].
Definition: TrackingPrimitives.h:268
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:14
JiveXML::xAODTrackParticleRetriever::m_doWriteHLT
bool m_doWriteHLT
Whether to write HLTAutoKey objects.
Definition: xAODTrackParticleRetriever.h:58
AthAlgTool
Definition: AthAlgTool.h:26
test_pyathena.counter
counter
Definition: test_pyathena.py:15
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
SG::ConstIterator
Definition: SGIterator.h:163
TrackParticleContainer.h
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.