Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
xAODVertexRetriever.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 
11 
12 #include "AthenaKernel/Units.h"
13 using Athena::Units::cm;
14 
15 namespace JiveXML {
16 
24  xAODVertexRetriever::xAODVertexRetriever(const std::string& type,const std::string& name,const IInterface* parent):
26 
31  StatusCode xAODVertexRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
32 
33  ATH_MSG_DEBUG("In retrieve()");
34 
35  std::vector<std::string> keys = getKeys();
36 
37  if(keys.empty()){
38  ATH_MSG_WARNING("No StoreGate keys found");
39  return StatusCode::SUCCESS;
40  }
41 
42  // Loop through the keys and retrieve the corresponding data
43  for (const std::string& key : keys) {
45  if (cont.isValid()) {
46  DataMap data = getData(&(*cont),key);
47  if (FormatTool->AddToEvent(dataTypeName(), key + "_xAOD", &data).isFailure()) {
48  ATH_MSG_WARNING("Failed to retrieve Collection " << key);
49  } else {
50  ATH_MSG_DEBUG(" (" << key << ") retrieved");
51  }
52  } else {
53  ATH_MSG_WARNING("Collection " << key << " not found in SG");
54  }
55  }
56  return StatusCode::SUCCESS;
57  }
58 
63  const DataMap xAODVertexRetriever::getData(const xAOD::VertexContainer* cont, const std::string &key) {
64 
65  ATH_MSG_DEBUG("in getData()");
66 
67  float chi2val = 0.;
68 
70 
71  DataVect x;
72  DataVect y;
73  DataVect z;
74  DataVect chi2;
76  DataVect primVxCand;
78  DataVect numTracks;
79  DataVect tracks;
81 
82  //Get size of current container
84 
85  ATH_MSG_DEBUG("Reading vertex container " << key
86  << " with " << NVtx << " entries");
87 
88  x.reserve(x.size()+NVtx);
89  y.reserve(y.size()+NVtx);
90  z.reserve(z.size()+NVtx);
91  chi2.reserve(chi2.size()+NVtx);
92  vertexType.reserve(vertexType.size()+NVtx);
93  primVxCand.reserve(primVxCand.size()+NVtx);
94  covMatrix.reserve(covMatrix.size()+NVtx);
95  numTracks.reserve(numTracks.size()+NVtx);
96  tracks.reserve(tracks.size()+NVtx);
97  sgkey.reserve(sgkey.size()+NVtx);
98 
99  int counter = 0;
100 
101  //Loop over vertices
102  xAOD::VertexContainer::const_iterator VertexItr = cont->begin();
103  for ( ; VertexItr != cont->end(); ++VertexItr) {
104 
105  ATH_MSG_DEBUG(" Vertex #" << counter++ << " : x = " << (*VertexItr)->x()/cm << ", y = "
106  << (*VertexItr)->y()/cm << ", z[GeV] = " << (*VertexItr)->z()/cm
107  << ", vertexType = " << (*VertexItr)->vertexType()
108  << ", chiSquared = " << (*VertexItr)->chiSquared()
109  << ", numberDoF = " << (*VertexItr)->numberDoF());
110 
111  x.emplace_back(DataType((*VertexItr)->x()/cm));
112  y.emplace_back(DataType((*VertexItr)->y()/cm));
113  z.emplace_back(DataType((*VertexItr)->z()/cm));
114 
115  if ( key == m_secondaryVertexKey){
116  vertexType.emplace_back( 2 );
117  }else{
118  vertexType.emplace_back( DataType((*VertexItr)->vertexType()));
119  }
120 
121  if ((*VertexItr)->vertexType() == 1 ){
122  primVxCand.emplace_back( 1 );
123  }else{
124  primVxCand.emplace_back( 0 );
125  }
126  sgkey.emplace_back (m_tracksName.value());
127 
129  covMatrix.emplace_back(DataType("2 -.1 .5 -.01 0.002 .01"));
130 
131  //degrees of freedom might be zero - beware
132  if ( (*VertexItr)->numberDoF() != 0 ){
133  chi2val = (*VertexItr)->chiSquared()/(*VertexItr)->numberDoF() ;
134  }else{
135  chi2val = -1.;
136  }
137  chi2.emplace_back(DataType( chi2val ));
138 
139  // track-vertex association code in xAOD from Nick Styles, Apr14:
140  // InnerDetector/InDetRecAlgs/InDetPriVxFinder/InDetVxLinksToTrackParticles
141 
142  int trkCnt = 0;
143  const std::vector< ElementLink< xAOD::TrackParticleContainer > > tpLinks = (*VertexItr)->trackParticleLinks();
144 
145  //iterating over the links
146  unsigned int tp_size = tpLinks.size();
147  numTracks.emplace_back(DataType( tp_size ));
148  if(tp_size){ // links exist
149  for(unsigned int tp = 0; tp<tp_size; ++tp)
150  {
152 
153  ATH_MSG_DEBUG(" Vertex #" << counter << " track association index: " << tpl.index()
154  << ", collection : " << tpl.key()
155  << ", Tracks : " << tp << " out of " << tp_size << ", own count: " << trkCnt++);
156 
157  if ( tpl.index() < 1000 ){ // sanity check, this can be huge number
158  tracks.emplace_back(DataType( tpl.index() ));
159  }else{
160  tracks.emplace_back(DataType( 0 ));
161  }
162  } //links exist
163  }//end of track particle collection size check
164 
165  } // end VertexIterator
166 
167  // four-vectors
168  DataMap["x"] = x;
169  DataMap["y"] = y;
170  DataMap["z"] = z;
171  DataMap["chi2"] = chi2;
172  DataMap["vertexType"] = vertexType;
173  DataMap["primVxCand"] = primVxCand;
174  DataMap["covMatrix multiple=\"6\""] = covMatrix;
175  DataMap["numTracks"] = numTracks;
176  DataMap["sgkey"] = sgkey;
177 
178  //This is needed once we know numTracks and associations:
179  //If there had been any tracks, add a tag
180  if ((numTracks.size()) != 0){
181  //Calculate average number of tracks per vertex
182  double NTracksPerVertex = tracks.size()*1./numTracks.size();
183  std::string tag = "tracks multiple=\"" +DataType(NTracksPerVertex).toString()+"\"";
184  DataMap[tag] = tracks;
185  }
186 
187  ATH_MSG_DEBUG(dataTypeName() << " retrieved with " << x.size() << " entries");
188 
189  return DataMap;
190 
191  }
192 
193 
194  const std::vector<std::string> xAODVertexRetriever::getKeys() {
195  ATH_MSG_DEBUG("in getKeys()");
196 
197  std::vector<std::string> keys = {};
198 
199  // Remove m_primaryVertexKey and m_secondaryVertexKey from m_otherKeys if they exist, we don't want to write them twice
200  auto it = std::find(m_otherKeys.begin(), m_otherKeys.end(), m_primaryVertexKey);
201  if(it != m_otherKeys.end()){
202  m_otherKeys.erase(it);
203  }
204  auto it2 = std::find(m_otherKeys.begin(), m_otherKeys.end(), m_secondaryVertexKey);
205  if(it2 != m_otherKeys.end()){
206  m_otherKeys.erase(it2);
207  }
208 
209  // Add m_primaryVertexKey as the first element and m_secondaryVertexKey as the second if they are not ""
210  if(m_primaryVertexKey!=""){
211  keys.push_back(m_primaryVertexKey);
212  }
213  if(m_secondaryVertexKey!=""){
214  keys.push_back(m_secondaryVertexKey);
215  }
216 
217  if(!m_otherKeys.empty()){
218  keys.insert(keys.end(), m_otherKeys.begin(), m_otherKeys.end());
219  }
220 
221  // If all collections are requested, obtain all available keys from StoreGate
222  std::vector<std::string> allKeys;
223 
225  evtStore()->keys<xAOD::VertexContainer>(allKeys);
226 
227  // Add keys that are not the priority key and do not add containers with "HLT" in their name if requested, , and do not contain V0 in their name, if requested
228  for(const std::string& key : allKeys){
229  // Don't include key if it's already in keys
230  auto it2 = std::find(keys.begin(), keys.end(), key);
231  if(it2 != keys.end())continue;
232  if((key.find("HLT") == std::string::npos || m_doWriteHLT) && (m_doWriteV0 || key.find("V0") == std::string::npos)){
233  keys.emplace_back(key);
234  }
235  }
236  }
237  return keys;
238  }
239 
240 } // JiveXML namespace
common.sgkey
def sgkey(tool)
Definition: common.py:1028
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
JiveXML::xAODVertexRetriever::m_tracksName
Gaudi::Property< std::string > m_tracksName
Definition: xAODVertexRetriever.h:66
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
JiveXML::xAODVertexRetriever::m_doWriteAllCollections
Gaudi::Property< bool > m_doWriteAllCollections
Definition: xAODVertexRetriever.h:61
JiveXML::xAODVertexRetriever::m_secondaryVertexKey
Gaudi::Property< std::string > m_secondaryVertexKey
Definition: xAODVertexRetriever.h:64
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
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
skel.it
it
Definition: skel.GENtoEVGEN.py:407
ParticleTest.tp
tp
Definition: ParticleTest.py:25
JiveXML::xAODVertexRetriever::m_primaryVertexKey
Gaudi::Property< std::string > m_primaryVertexKey
Definition: xAODVertexRetriever.h:63
JiveXML::DataMap
std::map< std::string, DataVect > DataMap
Definition: DataType.h:59
x
#define x
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
JiveXML::xAODVertexRetriever::getKeys
const std::vector< std::string > getKeys()
Gets the StoreGate keys for the desired containers.
Definition: xAODVertexRetriever.cxx:194
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
TrackParticleAuxContainer.h
z
#define z
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
xAOD::covMatrix
covMatrix
Definition: TrackMeasurement_v1.cxx:19
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition: comparitor.cxx:525
test_pyathena.parent
parent
Definition: test_pyathena.py:15
JiveXML::xAODVertexRetriever::dataTypeName
virtual std::string dataTypeName() const
Return the name of the data type that is generated by this retriever.
Definition: xAODVertexRetriever.h:53
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
JiveXML::xAODVertexRetriever::getData
const DataMap getData(const xAOD::VertexContainer *, const std::string &key)
Puts the variables into a DataMap.
Definition: xAODVertexRetriever.cxx:63
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
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
xAOD::vertexType
vertexType
Definition: Vertex_v1.cxx:166
Units.h
Wrapper to avoid constant divisions when using units.
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
VertexContainer.h
JiveXML::xAODVertexRetriever::m_otherKeys
Gaudi::Property< std::vector< std::string > > m_otherKeys
Definition: xAODVertexRetriever.h:65
y
#define y
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
JiveXML::xAODVertexRetriever::xAODVertexRetriever
xAODVertexRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
Definition: xAODVertexRetriever.cxx:24
python.Bindings.keys
keys
Definition: Control/AthenaPython/python/Bindings.py:798
JiveXML::xAODVertexRetriever::retrieve
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
For each Vertex collections retrieve basic parameters.
Definition: xAODVertexRetriever.cxx:31
JiveXML::xAODVertexRetriever::m_doWriteHLT
Gaudi::Property< bool > m_doWriteHLT
Definition: xAODVertexRetriever.h:60
CaloCondBlobAlgs_fillNoiseFromASCII.tag
string tag
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:24
AthAlgTool
Definition: AthAlgTool.h:26
DataVector::size_type
BASE::size_type size_type
Definition: DataVector.h:813
test_pyathena.counter
counter
Definition: test_pyathena.py:15
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
xAODVertexRetriever.h
TrackParticleContainer.h
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
VertexAuxContainer.h
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
JiveXML::xAODVertexRetriever::m_doWriteV0
Gaudi::Property< bool > m_doWriteV0
Definition: xAODVertexRetriever.h:62