ATLAS Offline Software
VertexRetriever.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 #include <string>
7 #include <vector>
8 #include <map>
9 #include <cmath>
10 
11 #include "VxVertex/VxContainer.h"
12 #include "VxVertex/VxCandidate.h"
13 #include "VxVertex/RecVertex.h"
15 
16 #include "TrkTrack/TrackInfo.h"
17 #include "TrkTrack/LinkToTrack.h"
19 
20 //#include "TrkVertexAnalysisUtils/V0Tools.h"
21 
26 
27 
28 namespace JiveXML {
29 
36  VertexRetriever::VertexRetriever(const std::string& type,const std::string& name,const IInterface* parent):
38  m_typeName("RVx"){
39 
40  //Declare the interface
41  declareInterface<IDataRetriever>(this);
42 
43  //Declare AlgTool properties
44  declareProperty("PrimaryVertexCollection", m_primaryVertexKey = "VxPrimaryCandidate", "Vertices to use as primary vertex");
45  declareProperty("SecondaryVertexCollection", m_secondaryVertexKey = "SecVertices", "Vertices to use as secondary vertex");
46  declareProperty("ConversionVertexCollection", m_conversionVertexKey = "ConversionCandidate", "Vertices to use as conversion vertex");
47  declareProperty("DoWritePrimAndSecVertexOnly", m_doWritePrimAndSecVertexOnly = false,
48  "if true only write primary and secondary vertex, placeholder to be removed");
49  declareProperty("DoWriteHLT", m_doWriteHLT = false, "whether to write HLTAutoKey objects");
50  declareProperty("TrackCollection", m_trackCollection = "Tracks");
51  declareProperty("Chi2OverDOFCut", m_chi2Cut = 10.); // <10 is 'tight', <100 is 'loose'
52  }
53 
54 
61  void manualPerigeeMatch(const Trk::Perigee* per1,
62  const Trk::Perigee* per2, bool& matched){
63 
64  double diff1 = ( per1->parameters()[Trk::d0] -
65  per2->parameters()[Trk::d0] );
66  double diff2 = ( per1->parameters()[Trk::z0] -
67  per2->parameters()[Trk::z0] );
68  double diff3 = ( per1->parameters()[Trk::phi0] -
69  per2->parameters()[Trk::phi0] );
70  double diff4 = ( per1->charge() -
71  per2->charge() );
72  double diff5 = ( per1->pT() -
73  per2->pT() );
74 
75  matched = diff1+diff2+diff3+diff4+diff5 == 0.;
76  }
77 
85 
87 // from:
88 // http://atlas-sw.cern.ch/cgi-bin/viewcvs-all.cgi/users/jsvirzi/PhysicsAnalysis/Atlas_ESD_Analysis/src/Atlas_ESD_Analysis.cxx?root=atlas&view=co
90 // InnerDetector/InDetMonitoring/InDetAlignmentMonitoring/TrackSplitterTool.cxx
92 // const Trk::Perigee* trackPerigee = inputTrack->perigeeParameters();
93 // const Trk::perigee* perigee = dynamic_cast<const Trk::perigee*>( trackPerigee );
94 // double m_d0 = perigee->parameters()[Trk::d0];
95 
96  const Rec::TrackParticleContainer* tracks = nullptr ;
97  const TrackCollection* trktracks = nullptr ;
98 
99  size_t found;
100  std::string searchStr = "TrackParticle";
101  found=m_trackCollection.find(searchStr);
102 
103  m_perigeeVector.clear(); // need to clear, otherwise accumulates over events
104  if (found!=std::string::npos){ // User selected a Rec::TrackParticle Collection
105  if (evtStore()->retrieve(tracks, m_trackCollection).isFailure()){
106  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Unable to retrieve track collection"
107  << m_trackCollection << " for association "<< endmsg;
108  } else {
109  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Retrieved " <<
111 
113  for(track=tracks->begin();track!=tracks->end();++track) {
114  const Trk::Perigee *perigee = (*track)->perigee();
115 // if(perigee == 0) continue; // not skip ! need to keep order for index !
116  m_perigeeVector.push_back( perigee ); // this perigee match works !
117  }
118  }
119  }else{ // it's a Trk::Tracks collection
120  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " User selected a Trk::Track collection ! " << endmsg;
121 
122  if (evtStore()->retrieve(trktracks, m_trackCollection).isFailure()){
123  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Unable to retrieve track collection"
124  << m_trackCollection << " for association "<< endmsg;
125  } else {
126  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Retrieved " <<
129  for(track=trktracks->begin();track!=trktracks->end();++track) {
130  const Trk::Perigee* trackPerigee = (*track)->perigeeParameters();
131  //const Trk::Perigee *perigee = dynamic_cast<const Trk::Perigee*>( trackPerigee );
132 // if(perigee == 0) continue; // not skip ! need to keep order for index !
133 // m_perigeeVector.push_back( perigee );
134  m_perigeeVector.push_back( trackPerigee );
135  }
136  }
137  }
138  return StatusCode::SUCCESS;
139  }
140 
148  StatusCode VertexRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool){
149 
150  //Get an iterator over all vertex collections,
151  //return if there are none
152  SG::ConstIterator<VxContainer> vtxCollectionItr, vtxCollectionsEnd;
153  if (evtStore()->retrieve(vtxCollectionItr,vtxCollectionsEnd).isFailure()) {
154  if (msgLvl(MSG::DEBUG )) msg(MSG::DEBUG ) << "No VxContainer containers found in this event" << endmsg;
155  return StatusCode::SUCCESS;
156  }
157 
158  //See if we can find the requested secondary vertex collection
159  const VxContainer* secondaryVtxCollection;
160  if (evtStore()->retrieve(secondaryVtxCollection,m_secondaryVertexKey).isFailure()) {
161  if (msgLvl(MSG::DEBUG )) msg(MSG::DEBUG ) << "No Secondary vertex container found at SecVertices" << endmsg;
162  }else{
163  if (msgLvl(MSG::DEBUG )) msg(MSG::DEBUG ) << "Secondary vertex container size: " << secondaryVtxCollection->size() << endmsg;
164  }
165 
166  //See if we can find the requested primary vertex collection
167  const VxContainer* primaryVtxCollection;
168  if ( evtStore()->retrieve(primaryVtxCollection,m_primaryVertexKey).isFailure()) {
169  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Primary vertex container "
170  << m_primaryVertexKey << " not found" << endmsg;
171  }
172 
173  //Declare all the data vectors we want to retrieve
174  DataVect x;
175  DataVect y;
176  DataVect z;
177  DataVect primVxCand;
178  DataVect chi2;
179  DataVect sgkey;
181  DataVect numTracks;
182  DataVect tracks;
184 
185  //Loop over all vertex containers
186  for ( ; vtxCollectionItr != vtxCollectionsEnd; ++vtxCollectionItr ) {
187 
188  //Check whether we should ignore HLTAutoKey collections
189  if ( (!m_doWriteHLT) && ( vtxCollectionItr.key().find("HLT") != std::string::npos)){
190  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Ignoring HLT collection " << vtxCollectionItr.key() << endmsg;
191  continue;
192  }
193 
194  //Get size of current container
195  VxContainer::size_type NVtx = vtxCollectionItr->size();
196 
197  //Be a bit verbose
198  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Reading vertex container " << vtxCollectionItr.key()
199  << " with " << NVtx << " entries" << endmsg;
200 
201  //Declare all the data vectors we want to retrieve and reserve space
202  x.reserve(x.size()+NVtx);
203  y.reserve(y.size()+NVtx);
204  z.reserve(z.size()+NVtx);
205  primVxCand.reserve(primVxCand.size()+NVtx);
206  chi2.reserve(chi2.size()+NVtx);
207  sgkey.reserve(sgkey.size()+NVtx);
208  covMatrix.reserve(covMatrix.size()+NVtx);
209  numTracks.reserve(numTracks.size()+NVtx);
210  vertexType.reserve(numTracks.size()+NVtx);
211 
213  if (!sc.isFailure()) {
214  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Perigee list filled with " << m_perigeeVector.size()
215  << " entries " << endmsg;
216  }
217 
218  //Loop over vertices
219  VxContainer::const_iterator vertexItr = vtxCollectionItr->begin();
220  for ( ; vertexItr != vtxCollectionItr->end(); ++vertexItr) {
222 // if ( m_doWritePrimAndSecVertexOnly && vtxCollectionItr.key() == m_conversionVertexKey ){
223 // if (msgLvl(MSG::DEBUG)){ msg(MSG::DEBUG) << " DoWritePrimAndSecVertexOnly switch true - skipping "
224 // << vtxCollectionItr.key() << endmsg; }
225 // continue; }
227 
231  //Get fit quality object
232  Trk::FitQuality fitQuality = (*vertexItr)->recVertex().fitQuality();
233 
234  //degrees of freedom might be zero - beware
235  float this_chi2 = -1;
236  if ( fitQuality.doubleNumberDoF() != 0 ){
238  }
239  //Cut: on Chi^2 over NumberOfDegreesOfFreedom only for ConversionCandidate
240  if ( this_chi2 > m_chi2Cut && ( vtxCollectionItr.key() == m_conversionVertexKey )) continue;
241 
242  float this_x = (*vertexItr)->recVertex().position().x()/10.; //Atlantis units are cm
243  float this_y = (*vertexItr)->recVertex().position().y()/10.;
244  float this_z = (*vertexItr)->recVertex().position().z()/10.;
245  float R = std::hypot (this_x, this_y); // distance from beamline
246 
247  if (msgLvl(MSG::DEBUG)){ msg(MSG::DEBUG) << " Collection: " << vtxCollectionItr.key()
248  << ", this_chi2: " << this_chi2 << " - chi2: " << fitQuality.chiSquared()
249 // << " ," << (*vertexItr)->recVertex().position().x()/10. << " ," << (*vertexItr)->recVertex().position().x()*CLHEP::cm
250  << ", R: " << R << endmsg; }
251 
252  chi2.emplace_back( this_chi2 );
253  x.emplace_back( this_x );
254  y.emplace_back( this_y );
255  z.emplace_back( this_z );
256 
257  // from: Tracking/TrkEvent/TrkEventPrimitives/VertexType.h
258  const Trk::VertexType vtx_type = (*vertexItr)->vertexType();
259  vertexType.emplace_back( vtx_type );
260  if (msgLvl(MSG::DEBUG)){ msg(MSG::DEBUG) << " collection " << vtxCollectionItr.key() << ": VertexType: " << vtx_type << endmsg; }
261 
262  //Store primary vertex candidate flag
263  if ( &(*vtxCollectionItr) == primaryVtxCollection ){
264  if ( Trk::PriVtx == vtx_type ){ primVxCand.emplace_back( 1 ); // type 1 'real' primary vertex
265  }else{ primVxCand.emplace_back( 0 ); } // hack ! 'type 3 pileup' Should properly use 'vertexType'
266  }else if ( &(*vtxCollectionItr) == secondaryVtxCollection ){
267  primVxCand.emplace_back( 2 ); // normally those are 'type 9 Kshort'
268  }else{
269  primVxCand.emplace_back( 0 );
270  }
271 
272 // !!! This doesn't work after Migration. 'errorposition' not known anymore ? jpt Dec'13 !!!
274  //double scale = (CLHEP::cm*CLHEP::cm)/(CLHEP::mm*CLHEP::mm); // in order to convert the covMatrix elements from (mm)^2 to (cm)^2 divide them by 100
275  //double precision = 10000; //// otherwise you sometimes loose precision by putting only 6 decimal points into the xml
276  //for (int i = 0;i<3; i++)
277  //for (int j = 0; j<i+1; j++ )
278  //covMatrix.push_back (DataType((*vertexItr)->recVertex().errorPosition().covariance()[i][j]/scale*precision ));
279 //-----------
284  covMatrix.emplace_back("2 -.1 .5 -.01 0.002 .01");
285 
291 //---- association from:
292 //---- from http://alxr.usatlas.bnl.gov/lxr/source/atlas/Reconstruction/tauRec/src/PhotonConversionPID.cxx
293 
294  const std::vector<Trk::VxTrackAtVertex*>* trklist = (*vertexItr)->vxTrackAtVertex();
295 
296  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Tracks at vertex: " << trklist->size() << endmsg;
297 
298  numTracks.emplace_back( trklist->size() );
299  sgkey.emplace_back( m_trackCollection ); // sgkey in current scheme is _not_ a multiple !
300 
301  tracks.emplace_back( -1 );
302  }
303  } // loop over vertex containers
304 
305  //Finally add all retrieved data to the data map
307  dataMap["x"] = x;
308  dataMap["y"] = y;
309  dataMap["z"] = z;
310  dataMap["primVxCand"] = primVxCand;
311  dataMap["chi2"] = chi2;
312  dataMap["covMatrix multiple=\"6\""] = covMatrix;
313  dataMap["numTracks"] = numTracks;
314  dataMap["sgkey"] = sgkey;
315  dataMap["vertexType"] = vertexType;
316 
317  //If there had been any tracks, add a tag
318  if (!numTracks.empty()){
319  //Calculate average number of tracks per vertex
320  double NTracksPerVertex = tracks.size()*1./numTracks.size();
321  std::string tag = "tracks multiple=\"" +DataType(NTracksPerVertex).toString()+"\"";
322  dataMap[tag] = tracks;
324 // std::string tag2 = "sgkey multiple=\"" +DataType(NTracksPerVertex).toString()+"\"";
325 // dataMap[tag2] = sgkey;
326  }
327 
331  //return FormatTool->AddToEvent(dataTypeName(), "PrimSecConvRecVx", &dataMap);
332  return FormatTool->AddToEvent(dataTypeName(), "", &dataMap);
333 
334  } // end retrieve
335 
336 } // namepspace JiveXML
RecVertex.h
LinkToTrack.h
common.sgkey
def sgkey(tool)
Definition: common.py:1028
JiveXML::VertexRetriever::m_perigeeVector
std::vector< const Trk::Perigee * > m_perigeeVector
Definition: VertexRetriever.h:70
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
TrackParameters.h
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
Trk::ParametersT
Dummy class used to allow special convertors to be called for surfaces owned by a detector element.
Definition: EMErrorDetail.h:25
TrackParticleBase.h
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
Trk::VertexType
VertexType
Definition: VertexType.h:25
Trk::z0
@ z0
Definition: ParamDefs.h:70
AthCommonMsg< AlgTool >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
Trk::FitQualityOnSurface::doubleNumberDoF
double doubleNumberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as double
Definition: FitQuality.h:68
JiveXML::DataMap
std::map< std::string, DataVect > DataMap
Definition: DataType.h:59
x
#define x
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
VertexRetriever.h
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::VertexRetriever::VertexRetriever
VertexRetriever(const std::string &t, const std::string &n, const IInterface *p)
Standard constructor.
Definition: VertexRetriever.cxx:36
JiveXML::VertexRetriever::m_conversionVertexKey
std::string m_conversionVertexKey
StoreGate key for conversion candidate collection.
Definition: VertexRetriever.h:56
JiveXML::VertexRetriever::m_chi2Cut
float m_chi2Cut
Chi^2 over NumberOfDegreesOfFreedom cut.
Definition: VertexRetriever.h:65
z
#define z
LArHistMerge_trf.dataMap
dataMap
Definition: LArHistMerge_trf.py:218
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
JiveXML::VertexRetriever::dataTypeName
virtual std::string dataTypeName() const
Return the name of the data type.
Definition: VertexRetriever.h:45
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition: comparitor.cxx:522
test_pyathena.parent
parent
Definition: test_pyathena.py:15
VxTrackAtVertex.h
VxContainer.h
Trk::FitQuality
Class to represent and store fit qualities from track reconstruction in terms of and number of degre...
Definition: FitQuality.h:97
VxContainer
Definition: VxContainer.h:28
DataVector< Trk::Track >
JiveXML::manualPerigeeMatch
void manualPerigeeMatch(const Trk::Perigee *per1, const Trk::Perigee *per2, bool &matched)
Manually match measured perigee d0,z0,phi0 of Trk::Track and Rec::TrackParticle, some problem with di...
Definition: VertexRetriever.cxx:61
JiveXML
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
Definition: BadLArRetriever.cxx:21
JiveXML::VertexRetriever::m_trackCollection
std::string m_trackCollection
StoreGate key for track collection for association.
Definition: VertexRetriever.h:63
LinkToTrackParticleBase.h
VxCandidate.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
Trk::d0
@ d0
Definition: ParamDefs.h:69
TrackInfo.h
Rec::TrackParticleContainer
Definition: Reconstruction/Particle/Particle/TrackParticleContainer.h:33
xAOD::vertexType
vertexType
Definition: Vertex_v1.cxx:166
python.ElectronD3PDObject.matched
matched
Definition: ElectronD3PDObject.py:138
Trk::GsfMeasurementUpdator::fitQuality
FitQualityOnSurface fitQuality(const MultiComponentState &, const MeasurementBase &)
Method for determining the chi2 of the multi-component state and the number of degrees of freedom.
Definition: GsfMeasurementUpdator.cxx:845
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
y
#define y
CondAlgsOpts.found
int found
Definition: CondAlgsOpts.py:101
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
DEBUG
#define DEBUG
Definition: page_access.h:11
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
JiveXML::VertexRetriever::m_primaryVertexKey
std::string m_primaryVertexKey
StoreGate key for primary vertex candidate collection.
Definition: VertexRetriever.h:45
Trk::PriVtx
@ PriVtx
Primary Vertex.
Definition: VertexType.h:27
JiveXML::VertexRetriever::retrieve
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
Definition: VertexRetriever.cxx:148
JiveXML::VertexRetriever::fillPerigeeList
virtual StatusCode fillPerigeeList()
Retrieve measured perigee, automatically switch between Trk::Track and Rec::TrackParticle depending o...
Definition: VertexRetriever.cxx:84
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
CaloCondBlobAlgs_fillNoiseFromASCII.tag
string tag
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:24
JiveXML::VertexRetriever::m_secondaryVertexKey
std::string m_secondaryVertexKey
StoreGate key for secondary vertex candidate collection.
Definition: VertexRetriever.h:54
AthAlgTool
Definition: AthAlgTool.h:26
JiveXML::VertexRetriever::m_doWriteHLT
bool m_doWriteHLT
wether to write HLTAutoKey objects
Definition: VertexRetriever.h:58
DataVector< Trk::VxCandidate >::size_type
BASE::size_type size_type
Definition: DataVector.h:813
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
SG::ConstIterator
Definition: SGIterator.h:163
Trk::FitQualityOnSurface::chiSquared
double chiSquared() const
returns the of the overall track fit
Definition: FitQuality.h:56
Trk::phi0
@ phi0
Definition: ParamDefs.h:71
JiveXML::VertexRetriever::m_doWritePrimAndSecVertexOnly
bool m_doWritePrimAndSecVertexOnly
write primary and secondary vertizes only - placeholder, to be removed
Definition: VertexRetriever.h:60
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
TrackParticleContainer.h