ATLAS Offline Software
xAODVertexRetriever.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 
11 
12 #include "AthenaKernel/Units.h"
13 using Athena::Units::cm;
14 
15 namespace JiveXML {
16 
29  xAODVertexRetriever::xAODVertexRetriever(const std::string& type,const std::string& name,const IInterface* parent):
30  AthAlgTool(type,name,parent), m_typeName("RVx"){
31 
32  //Only declare the interface
33  declareInterface<IDataRetriever>(this);
34 
35  //In xAOD: PrimaryVertices, AllPhotonsVxCandidates
36  declareProperty("PrimaryVertexCollection", m_primaryVertexKey = "PrimaryVertices",
37  "Collection to be first in output, shown in Atlantis without switching");
38  declareProperty("SecondaryVertexCollection", m_secondaryVertexKey = "SecVertices", "Vertices to use as secondary vertex");
39  declareProperty ( "TracksName", m_tracksName = "InDetTrackParticles_xAOD" );
40  }
41 
46  StatusCode xAODVertexRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
47 
48  //Get an iterator over all vertex collections,
49  //return if there are none
50  SG::ConstIterator<xAOD::VertexContainer> vtxCollectionItr, vtxCollectionsEnd;
51  if (evtStore()->retrieve(vtxCollectionItr,vtxCollectionsEnd).isFailure()) {
52  if (msgLvl(MSG::DEBUG )) msg(MSG::DEBUG ) << "No xAODVertexContainer containers found in this event" << endmsg;
53  return StatusCode::SUCCESS;
54  }
55 
56  //See if we can find the requested secondary vertex collection
57  const xAOD::VertexContainer* secondaryVtxCollection;
58  if (evtStore()->retrieve(secondaryVtxCollection,m_secondaryVertexKey).isFailure()) {
59  if (msgLvl(MSG::DEBUG )) msg(MSG::DEBUG ) << "No Secondary vertex container found at SecVertices" << endmsg;
60  }else{
61  if (msgLvl(MSG::DEBUG )) msg(MSG::DEBUG ) << "Secondary vertex container size: " << secondaryVtxCollection->size() << endmsg;
62  }
63 
64  //See if we can find the requested primary vertex collection
65  const xAOD::VertexContainer* primaryVtxCollection;
66  if ( evtStore()->retrieve(primaryVtxCollection,m_primaryVertexKey).isFailure()) {
67  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Primary vertex container "
68  << m_primaryVertexKey << " not found" << endmsg;
69  }
70 
71  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "in retrieve" << endmsg;
72 
77  float chi2val = 0.;
78  DataVect x;
79  DataVect y;
80  DataVect z;
81  DataVect chi2;
83  DataVect primVxCand;
85  DataVect numTracks;
86  DataVect tracks;
87  DataVect sgkey;
88 
89  //Loop over all vertex containers
90  for ( ; vtxCollectionItr != vtxCollectionsEnd; ++vtxCollectionItr ) {
91 
92  if ( ( vtxCollectionItr.key().find("HLT") != std::string::npos)){ // ignore all HLT for now
93  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Ignoring HLT collection " << vtxCollectionItr.key() << endmsg;
94  continue;
95  }
96  if ( ( vtxCollectionItr.key().find("V0") != std::string::npos)){ // ignore all HLT for now
97  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Ignoring V0 collection " << vtxCollectionItr.key() << endmsg;
98  continue;
99  }
100 
101  //Get size of current container
102  xAOD::VertexContainer::size_type NVtx = vtxCollectionItr->size();
103 
104  //Be a bit verbose
105  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Reading vertex container " << vtxCollectionItr.key()
106  << " with " << NVtx << " entries" << endmsg;
107 
108  x.reserve(x.size()+NVtx);
109  y.reserve(y.size()+NVtx);
110  z.reserve(z.size()+NVtx);
111  chi2.reserve(chi2.size()+NVtx);
112  vertexType.reserve(vertexType.size()+NVtx);
113  primVxCand.reserve(primVxCand.size()+NVtx);
114  covMatrix.reserve(covMatrix.size()+NVtx);
115  numTracks.reserve(numTracks.size()+NVtx);
116  tracks.reserve(tracks.size()+NVtx);
117  sgkey.reserve(sgkey.size()+NVtx);
118 
119  int counter = 0;
120 
121  //Loop over vertices
122  xAOD::VertexContainer::const_iterator VertexItr = vtxCollectionItr->begin();
123  for ( ; VertexItr != vtxCollectionItr->end(); ++VertexItr) {
124 
125  if (msgLvl(MSG::DEBUG)) {
126  msg(MSG::DEBUG) << " Vertex #" << counter++ << " : x = " << (*VertexItr)->x()/cm << ", y = "
127  << (*VertexItr)->y()/cm << ", z[GeV] = " << (*VertexItr)->z()/cm
128  << ", vertexType = " << (*VertexItr)->vertexType()
129  << ", chiSquared = " << (*VertexItr)->chiSquared()
130  << ", numberDoF = " << (*VertexItr)->numberDoF() << endmsg;
131  }
132 
133  x.push_back(DataType((*VertexItr)->x()/cm));
134  y.push_back(DataType((*VertexItr)->y()/cm));
135  z.push_back(DataType((*VertexItr)->z()/cm));
136 
137  if ( vtxCollectionItr.key() == m_secondaryVertexKey){
138  vertexType.push_back( 2 );
139  }else{
140  vertexType.push_back( DataType((*VertexItr)->vertexType()));
141  }
142 
143  if ((*VertexItr)->vertexType() == 1 ){
144  primVxCand.push_back( 1 );
145  }else{
146  primVxCand.push_back( 0 );
147  }
148  sgkey.push_back (m_tracksName);
149 
151  covMatrix.push_back(DataType("2 -.1 .5 -.01 0.002 .01"));
152 
153  //degrees of freedom might be zero - beware
154  if ( (*VertexItr)->numberDoF() != 0 ){
155  chi2val = (*VertexItr)->chiSquared()/(*VertexItr)->numberDoF() ;
156  }else{
157  chi2val = -1.;
158  }
159  chi2.push_back(DataType( chi2val ));
160 
161  // track-vertex association code in xAOD from Nick Styles, Apr14:
162  // InnerDetector/InDetRecAlgs/InDetPriVxFinder/InDetVxLinksToTrackParticles
163 
164  int trkCnt = 0;
165  const std::vector< ElementLink< xAOD::TrackParticleContainer > > tpLinks = (*VertexItr)->trackParticleLinks();
166 
167  //iterating over the links
168  unsigned int tp_size = tpLinks.size();
169  numTracks.push_back(DataType( tp_size ));
170  if(tp_size){ // links exist
171  for(unsigned int tp = 0; tp<tp_size; ++tp)
172  {
174 
175 //checking a container name consitency
176 // if(tpl.key() == m_tracksName) // doesn't work. tpl.key is a number ?
177 
178  if (msgLvl(MSG::DEBUG)) {
179  msg(MSG::DEBUG) << " Vertex #" << counter << " track association index: " << tpl.index()
180  << ", collection : " << tpl.key()
181  << ", Tracks : " << tp << " out of " << tp_size << ", own count: " << trkCnt++ << endmsg;
182  }
183  if ( tpl.index() < 1000 ){ // sanity check, this can be huge number
184  tracks.push_back(DataType( tpl.index() ));
185  }else{
186  tracks.push_back(DataType( 0 ));
187  }
188  } //links exist
189  }//end of track particle collection size check
190 
191  //if (msgLvl(MSG::DEBUG)) {
192  // msg(MSG::DEBUG) << " Vertex #" << counter << ", numTracks : " << tpLinks.size() << endmsg;
193  //}
194 
195  } // end VertexIterator
196  } // end collectionIterator
197 
198  // four-vectors
200  DataMap["x"] = x;
201  DataMap["y"] = y;
202  DataMap["z"] = z;
203  DataMap["chi2"] = chi2;
204  DataMap["vertexType"] = vertexType;
205  DataMap["primVxCand"] = primVxCand;
206  DataMap["covMatrix multiple=\"6\""] = covMatrix;
207  DataMap["numTracks"] = numTracks;
208 // DataMap["tracks multiple=\"0\""];
209  DataMap["sgkey"] = sgkey;
210 
211  //This is needed once we know numTracks and associations:
212  //If there had been any tracks, add a tag
213  if ((numTracks.size()) != 0){
214  //Calculate average number of tracks per vertex
215  double NTracksPerVertex = tracks.size()*1./numTracks.size();
216  std::string tag = "tracks multiple=\"" +DataType(NTracksPerVertex).toString()+"\"";
217  DataMap[tag] = tracks;
218  }
219 
220  if (msgLvl(MSG::DEBUG)) {
221  msg(MSG::DEBUG) << dataTypeName() << " retrieved with " << x.size() << " entries"<< endmsg;
222  }
223  //All collections retrieved okay
224  return FormatTool->AddToEvent(dataTypeName(), "Vertices_xAOD", &DataMap);
225 
226  } // retrieve
227 
228  //--------------------------------------------------------------------------
229 
230 } // JiveXML namespace
common.sgkey
def sgkey(tool)
Definition: common.py:1028
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
SG::detail::IteratorBase::key
const std::string & key() const
Get the key string with which the current object was stored.
Definition: SGIterator.cxx:155
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
JiveXML::xAODVertexRetriever::m_secondaryVertexKey
std::string m_secondaryVertexKey
Definition: xAODVertexRetriever.h:52
JiveXML::xAODVertexRetriever::m_tracksName
std::string m_tracksName
Definition: xAODVertexRetriever.h:53
ParticleTest.tp
tp
Definition: ParticleTest.py:25
AthCommonMsg< AlgTool >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
JiveXML::DataMap
std::map< std::string, DataVect > DataMap
Definition: DataType.h:59
x
#define x
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
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
xAOD::covMatrix
covMatrix
Definition: TrackMeasurement_v1.cxx:19
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition: comparitor.cxx:522
test_pyathena.parent
parent
Definition: test_pyathena.py:15
JiveXML::xAODVertexRetriever::dataTypeName
virtual std::string dataTypeName() const
Return the name of the data type.
Definition: xAODVertexRetriever.h:45
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
JiveXML
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
Definition: BadLArRetriever.cxx:21
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
xAOD::vertexType
vertexType
Definition: Vertex_v1.cxx:166
Units.h
Wrapper to avoid constant divisions when using units.
VertexContainer.h
y
#define y
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
DEBUG
#define DEBUG
Definition: page_access.h:11
JiveXML::xAODVertexRetriever::xAODVertexRetriever
xAODVertexRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
Definition: xAODVertexRetriever.cxx:29
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
JiveXML::xAODVertexRetriever::retrieve
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
Definition: xAODVertexRetriever.cxx:46
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.
SG::ConstIterator
Definition: SGIterator.h:163
JiveXML::xAODVertexRetriever::m_primaryVertexKey
std::string m_primaryVertexKey
Definition: xAODVertexRetriever.h:51
xAODVertexRetriever.h
TrackParticleContainer.h
VertexAuxContainer.h