ATLAS Offline Software
Loading...
Searching...
No Matches
TrkVKalVrtFitter.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Header include
7#include "GaudiKernel/EventContext.h"
8#include "GaudiKernel/IChronoStatSvc.h"
13#include "TrkTrack/Track.h"
19
20
21//-------------------------------------------------
22// Other stuff
23#include <iostream>
24
25namespace Trk{
26
27
28//
29//Constructor--------------------------------------------------------------
31 const std::string& name,
32 const IInterface* parent):
33 base_class(type,name,parent)
34 {
35 declareInterface<IVertexFitter>(this);
36 declareInterface<ITrkVKalVrtFitter>(this);
37 declareInterface<IVertexCascadeFitter>(this);
38
39/*--------------------------------------------------------------------------*/
40/* New propagator object is created. It's provided to VKalVrtCore. */
41/* VKalVrtFitter must set up Core BEFORE any call required propagation!!! */
42/* This object is created ONLY if IExtrapolator pointer is provideded. */
43/* see VKalExtPropagator.cxx for details */
44/*--------------------------------------------------------------------------*/
45 m_fitPropagator = nullptr; //Pointer to VKalVrtFitter propagator object to supply to VKalVrtCore (specific interface)
46 m_InDetExtrapolator = nullptr; //Direct pointer to Athena propagator
47}
48
49
50//Destructor---------------------------------------------------------------
52 //log << MSG::DEBUG << "TrkVKalVrtFitter destructor called" << endmsg;
53 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<<"TrkVKalVrtFitter destructor called" << endmsg;
55}
56
57std::unique_ptr<IVKalState>
58TrkVKalVrtFitter::makeState(const EventContext& ctx) const
59{
60 auto state = std::make_unique<State>();
61 initState(ctx, *state);
62 return state;
63}
64
66{
67 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG) <<"TrkVKalVrtFitter finalize() successful" << endmsg;
68 return StatusCode::SUCCESS;
69}
70
71
73{
74
75// Checking ROBUST algoritms
77
78
79 if(!m_useFixedField){
80 // Read handle for AtlasFieldCacheCondObj
81 if (!m_fieldCacheCondObjInputKey.key().empty()){
82 if( (m_fieldCacheCondObjInputKey.initialize()).isSuccess() ){
83 m_isAtlasField = true;
84 ATH_MSG_DEBUG( "Found AtlasFieldCacheCondObj with key ="<< m_fieldCacheCondObjInputKey.key());
85 }else{
86 ATH_MSG_INFO( "No AtlasFieldCacheCondObj with key ="<< m_fieldCacheCondObjInputKey.key());
87 ATH_MSG_INFO( "Use fixed magnetic field instead");
88 }
89 }
90 }
91//
92// Only here the VKalVrtFitter propagator object is created if ATHENA propagator is provided (see setAthenaPropagator)
93// In this case the ATHENA propagator can be used via pointers:
94// m_InDetExtrapolator - direct access
95// m_fitPropagator - via VKalVrtFitter object VKalExtPropagator
96// If ATHENA propagator is not provided, only defined object is
97// myPropagator - extern propagator from TrkVKalVrtCore
98//
99 if (m_extPropagator.empty()){
100 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<< "External propagator is not supplied - use internal one"<<endmsg;
101 m_extPropagator.disable();
102 }else{
103 if (m_extPropagator.retrieve().isFailure()) {
104 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<< "Could not find external propagator=" <<m_extPropagator<<endmsg;
105 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<< "TrkVKalVrtFitter will uses internal propagator" << endmsg;
106 m_extPropagator.disable();
107 }else{
108 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<< "External propagator="<<m_extPropagator<<" retrieved" << endmsg;
110 }
111 }
112
113//
114//
115//
116 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<< "TrkVKalVrtFitter initialize() successful" << endmsg;
117 if(msgLvl(MSG::DEBUG)){
118 msg(MSG::DEBUG)<< "TrkVKalVrtFitter configuration:" << endmsg;
119 msg(MSG::DEBUG)<< " Frozen version for BTagging: "<< m_frozenVersionForBTagging <<endmsg;
120 msg(MSG::DEBUG)<< " Allow ultra displaced vertices: "<< m_allowUltraDisplaced <<endmsg;
121 msg(MSG::DEBUG)<< " A priori vertex constraint: "<< m_useAprioriVertex <<endmsg;
122 msg(MSG::DEBUG)<< " Angle dTheta=0 constraint: "<< m_useThetaCnst <<endmsg;
123 msg(MSG::DEBUG)<< " Angle dPhi=0 constraint: "<< m_usePhiCnst <<endmsg;
124 msg(MSG::DEBUG)<< " Pointing to other vertex constraint: "<< m_usePointingCnst <<endmsg;
125 msg(MSG::DEBUG)<< " ZPointing to other vertex constraint: "<< m_useZPointingCnst <<endmsg;
126 msg(MSG::DEBUG)<< " Comb. particle pass near other vertex:"<< m_usePassNear <<endmsg;
127 msg(MSG::DEBUG)<< " Pass near with comb.particle errors: "<< m_usePassWithTrkErr <<endmsg;
129 msg(MSG::DEBUG)<< " Mass constraint M="<< m_massForConstraint <<endmsg;
130 msg(MSG::DEBUG)<< " with particles M=";
131 for(int i=0; i<(int)m_c_MassInputParticles.size(); i++) msg(MSG::DEBUG)<<m_c_MassInputParticles[i]<<", ";
132 msg(MSG::DEBUG)<<endmsg; ;
133 }
134 if(m_IterationNumber==0){
135 msg(MSG::DEBUG)<< " Default iteration number limit 50 is used " <<endmsg;
136 } else {
137 msg(MSG::DEBUG)<< " Iteration number limit: "<< m_IterationNumber <<endmsg;
138 }
139
140 if(m_isAtlasField){ msg(MSG::DEBUG)<< " ATLAS magnetic field is used!"<<endmsg; }
141 else { msg(MSG::DEBUG)<< " Constant magnetic field is used! B="<<m_BMAG<<endmsg; }
142
143 if(m_InDetExtrapolator){ msg(MSG::DEBUG)<< " InDet extrapolator is used!"<<endmsg; }
144 else { msg(MSG::DEBUG)<< " Internal VKalVrt extrapolator is used!"<<endmsg;}
145
146 if(m_Robustness) { msg(MSG::DEBUG)<< " VKalVrt uses robust algorithm! Type="<<m_Robustness<<" with Scale="<<m_RobustScale<<endmsg; }
147
148 if(m_firstMeasuredPoint){ msg(MSG::DEBUG)<< " VKalVrt will use FirstMeasuredPoint strategy in fits with InDetExtrapolator"<<endmsg; }
149 else { msg(MSG::DEBUG)<< " VKalVrt will use Perigee strategy in fits with InDetExtrapolator"<<endmsg; }
150 if(m_firstMeasuredPointLimit){ msg(MSG::DEBUG)<< " VKalVrt will use FirstMeasuredPointLimit strategy "<<endmsg; }
151 }
152
153
154 return StatusCode::SUCCESS;
155}
156
157
158void TrkVKalVrtFitter::initState (const EventContext& ctx, State& state) const
159
160{
161 //----------------------------------------------------------------------
162 // New magnetic field object is created. It's provided to VKalVrtCore.
163 // VKalVrtFitter must set up Core BEFORE any call required propagation!!!
164 if (m_isAtlasField) {
165 // For the moment, use Gaudi Hive for the event context - would need to be passed in from clients
167 const AtlasFieldCacheCondObj* fieldCondObj{*readHandle};
168 if (fieldCondObj == nullptr) {
169 ATH_MSG_ERROR("Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCacheCondObjInputKey.key());
170 return;
171 }
172 fieldCondObj->getInitializedCache (state.m_fieldCache);
174 } else {
176 }
177 state.m_eventContext = &ctx;
194}
195
197std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const EventContext& ctx,
198 const std::vector<const TrackParameters*> & perigeeListC,
199 const Amg::Vector3D & startingPoint) const
200{
201 //Local variable state uses 49312 bytes of stack space
202 //coverity[STACK_USE]
203 State state;
204 initState (ctx, state);
205 setApproximateVertex(startingPoint.x(),
206 startingPoint.y(),
207 startingPoint.z(),
208 state);
209 std::vector<const NeutralParameters*> perigeeListN(0);
211 TLorentzVector Momentum;
212 long int Charge;
213 std::vector<double> ErrorMatrix;
214 std::vector<double> Chi2PerTrk;
215 std::vector< std::vector<double> > TrkAtVrt;
216 double Chi2;
217 StatusCode sc=VKalVrtFit( perigeeListC, perigeeListN,
218 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
219
220 if(sc.isSuccess()) {
221 return makeXAODVertex( 0, Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
222 }
223 return {};
224}
225
226
227std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const EventContext& ctx,
228 const std::vector<const TrackParameters*> & perigeeListC,
229 const std::vector<const NeutralParameters*> & perigeeListN,
230 const Amg::Vector3D & startingPoint) const
231{
232 //Local variable state uses 49312 bytes of stack space
233 //coverity[STACK_USE]
234 State state;
235 initState (ctx, state);
236 setApproximateVertex(startingPoint.x(),
237 startingPoint.y(),
238 startingPoint.z(),
239 state);
241 TLorentzVector Momentum;
242 long int Charge;
243 std::vector<double> ErrorMatrix;
244 std::vector<double> Chi2PerTrk;
245 std::vector< std::vector<double> > TrkAtVrt;
246 double Chi2;
247 StatusCode sc=VKalVrtFit( perigeeListC,perigeeListN,
248 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
249
250 if(sc.isSuccess()) {
251 return makeXAODVertex( (int)perigeeListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
252 }
253 return {};
254}
255
256
257
258
259
260
263std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const EventContext& ctx,
264 const std::vector<const TrackParameters*> & perigeeListC,
265 const xAOD::Vertex & constraint) const
266{
267 //Local variable state uses 49312 bytes of stack space
268 //coverity[STACK_USE]
269 State state;
270 initState (ctx, state);
271 if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG)<< "A priori vertex constraint is activated in VKalVrt fitter!" << endmsg;
272 Amg::Vector3D VertexIni(0.,0.,0.);
273 StatusCode sc=VKalVrtFitFast(perigeeListC, VertexIni, state);
274 if( sc.isSuccess()){
275 setApproximateVertex(VertexIni.x(),VertexIni.y(),VertexIni.z(),state);
276 }else{
277 setApproximateVertex(constraint.position().x(),
278 constraint.position().y(),
279 constraint.position().z(),
280 state);
281 }
282 setVertexForConstraint(constraint.position().x(),
283 constraint.position().y(),
284 constraint.position().z(),
285 state);
286 setCovVrtForConstraint(constraint.covariancePosition()(Trk::x,Trk::x),
287 constraint.covariancePosition()(Trk::y,Trk::x),
288 constraint.covariancePosition()(Trk::y,Trk::y),
289 constraint.covariancePosition()(Trk::z,Trk::x),
290 constraint.covariancePosition()(Trk::z,Trk::y),
291 constraint.covariancePosition()(Trk::z,Trk::z),
292 state);
293 state.m_useAprioriVertex=true;
294 std::vector<const NeutralParameters*> perigeeListN(0);
296 TLorentzVector Momentum;
297 long int Charge;
298 std::vector<double> ErrorMatrix;
299 std::vector<double> Chi2PerTrk;
300 std::vector< std::vector<double> > TrkAtVrt;
301 double Chi2;
302 sc=VKalVrtFit( perigeeListC, perigeeListN,
303 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
304
305
306 if(sc.isSuccess()) {
307 return makeXAODVertex( 0, Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
308 }
309 return {};
310}
311
312
313std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const EventContext& ctx,
314 const std::vector<const TrackParameters*> & perigeeListC,
315 const std::vector<const NeutralParameters*> & perigeeListN,
316 const xAOD::Vertex & constraint) const
317{
318 //Local variable state uses 49312 bytes of stack space
319 //coverity[STACK_USE]
320 State state;
321 initState (ctx, state);
322
323 if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG)<< "A priori vertex constraint is activated in VKalVrt fitter!" << endmsg;
324 Amg::Vector3D VertexIni(0.,0.,0.);
325 StatusCode sc=VKalVrtFitFast(perigeeListC, VertexIni, state);
326 if( sc.isSuccess()){
327 setApproximateVertex(VertexIni.x(),VertexIni.y(),VertexIni.z(),state);
328 }else{
329 setApproximateVertex(constraint.position().x(),
330 constraint.position().y(),
331 constraint.position().z(),
332 state);
333 }
334 setVertexForConstraint(constraint.position().x(),
335 constraint.position().y(),
336 constraint.position().z(),
337 state);
338 setCovVrtForConstraint(constraint.covariancePosition()(Trk::x,Trk::x),
339 constraint.covariancePosition()(Trk::y,Trk::x),
340 constraint.covariancePosition()(Trk::y,Trk::y),
341 constraint.covariancePosition()(Trk::z,Trk::x),
342 constraint.covariancePosition()(Trk::z,Trk::y),
343 constraint.covariancePosition()(Trk::z,Trk::z),
344 state);
345 state.m_useAprioriVertex=true;
347 TLorentzVector Momentum;
348 long int Charge;
349 std::vector<double> ErrorMatrix;
350 std::vector<double> Chi2PerTrk;
351 std::vector< std::vector<double> > TrkAtVrt;
352 double Chi2;
353 sc=VKalVrtFit( perigeeListC, perigeeListN,
354 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
355
356
357 if(sc.isSuccess()) {
358 return makeXAODVertex( (int)perigeeListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
359 }
360 return {};
361}
362
366std::unique_ptr<xAOD::Vertex>
367TrkVKalVrtFitter::fit(const EventContext& ctx,
368 const std::vector<const xAOD::TrackParticle*>& xtpListC,
369 const Amg::Vector3D& startingPoint) const
370{
371 //Local variable state uses 49312 bytes of stack space
372 //coverity[STACK_USE]
373 State state;
374 initState(ctx, state);
375 return std::unique_ptr<xAOD::Vertex>(fit(xtpListC, startingPoint, state));
376}
377
378std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const std::vector<const xAOD::TrackParticle*> & xtpListC,
379 const Amg::Vector3D & startingPoint,
380 IVKalState& istate) const
381{
382 assert(dynamic_cast<State*> (&istate)!=nullptr);
383 State& state = static_cast<State&> (istate);
384
385 std::unique_ptr<xAOD::Vertex> tmpVertex;
386 setApproximateVertex(startingPoint.x(),
387 startingPoint.y(),
388 startingPoint.z(),
389 state);
390 std::vector<const xAOD::NeutralParticle*> xtpListN(0);
392 TLorentzVector Momentum;
393 long int Charge;
394 std::vector<double> ErrorMatrix;
395 std::vector<double> Chi2PerTrk;
396 std::vector< std::vector<double> > TrkAtVrt;
397 double Chi2;
398 StatusCode sc=VKalVrtFit( xtpListC, xtpListN,
399 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
400 if(sc.isSuccess()) {
401 tmpVertex = makeXAODVertex( 0, Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
402 dvect fittrkwgt;
403 sc=VKalGetTrkWeights(fittrkwgt, state); if(sc.isFailure())fittrkwgt.clear();
404 for(int ii=0; ii<state.m_FitStatus; ii++) {
406 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
407 else tmpVertex->addTrackAtVertex(TEL,1.);
408 }
409 }
410
411 return tmpVertex;
412}
413
414std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const EventContext& ctx,
415 const std::vector<const xAOD::TrackParticle*> & xtpListC,
416 const std::vector<const xAOD::NeutralParticle*> & xtpListN,
417 const Amg::Vector3D & startingPoint) const
418{
419 //Local variable state uses 49312 bytes of stack space
420 //coverity[STACK_USE]
421 State state;
422 initState (ctx, state);
423 std::unique_ptr<xAOD::Vertex> tmpVertex;
424 setApproximateVertex(startingPoint.x(),
425 startingPoint.y(),
426 startingPoint.z(),
427 state);
429 TLorentzVector Momentum;
430 long int Charge;
431 std::vector<double> ErrorMatrix;
432 std::vector<double> Chi2PerTrk;
433 std::vector< std::vector<double> > TrkAtVrt;
434 double Chi2;
435 StatusCode sc=VKalVrtFit( xtpListC, xtpListN,
436 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
437 if(sc.isSuccess()) {
438 tmpVertex = makeXAODVertex( (int)xtpListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
439 dvect fittrkwgt;
440 sc=VKalGetTrkWeights(fittrkwgt, state); if(sc.isFailure())fittrkwgt.clear();
441 for(int ii=0; ii<state.m_FitStatus; ii++) {
442 if(ii<(int)xtpListC.size()) {
444 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
445 else tmpVertex->addTrackAtVertex(TEL,1.);
446 }else{
448 if(!fittrkwgt.empty()) tmpVertex->addNeutralAtVertex(TEL,fittrkwgt[ii]);
449 else tmpVertex->addNeutralAtVertex(TEL,1.);
450 }
451 }
452 }
453
454 return tmpVertex;
455}
456
459std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const EventContext& ctx,
460 const std::vector<const xAOD::TrackParticle*> & xtpListC,
461 const xAOD::Vertex & constraint) const
462{
463 //Local variable state uses 49312 bytes of stack space
464 //coverity[STACK_USE]
465 State state;
466 initState (ctx, state);
467 return fit (xtpListC, constraint, state);
468}
469std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const std::vector<const xAOD::TrackParticle*> & xtpListC,
470 const xAOD::Vertex & constraint,
471 IVKalState& istate) const
472{
473 assert(dynamic_cast<State*> (&istate)!=nullptr);
474 State& state = static_cast<State&> (istate);
475
476 if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG)<< "A priori vertex constraint is activated in VKalVrt fitter!" << endmsg;
477 std::unique_ptr<xAOD::Vertex> tmpVertex;
478 setApproximateVertex(constraint.position().x(), constraint.position().y(),constraint.position().z(),state);
479 setVertexForConstraint(constraint.position().x(),
480 constraint.position().y(),
481 constraint.position().z(),
482 state);
483 setCovVrtForConstraint(constraint.covariancePosition()(Trk::x,Trk::x),
484 constraint.covariancePosition()(Trk::y,Trk::x),
485 constraint.covariancePosition()(Trk::y,Trk::y),
486 constraint.covariancePosition()(Trk::z,Trk::x),
487 constraint.covariancePosition()(Trk::z,Trk::y),
488 constraint.covariancePosition()(Trk::z,Trk::z),
489 state);
490 state.m_useAprioriVertex=true;
491 std::vector<const xAOD::NeutralParticle*> xtpListN(0);
493 TLorentzVector Momentum;
494 long int Charge;
495 std::vector<double> ErrorMatrix;
496 std::vector<double> Chi2PerTrk;
497 std::vector< std::vector<double> > TrkAtVrt;
498 double Chi2;
499 StatusCode sc=VKalVrtFit( xtpListC, xtpListN,
500 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
501 if(sc.isSuccess()) {
502 tmpVertex = makeXAODVertex( 0, Vertex, ErrorMatrix,Chi2PerTrk, TrkAtVrt, Chi2, state );
503 dvect fittrkwgt;
504 sc=VKalGetTrkWeights(fittrkwgt, state); if(sc.isFailure())fittrkwgt.clear();
505 for(int ii=0; ii<state.m_FitStatus; ii++) {
507 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
508 else tmpVertex->addTrackAtVertex(TEL,1.);
509 }
510 }
511
512 return tmpVertex;
513}
514
515std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const EventContext& ctx,
516 const std::vector<const xAOD::TrackParticle*> & xtpListC,
517 const std::vector<const xAOD::NeutralParticle*> & xtpListN,
518 const xAOD::Vertex & constraint) const
519{
520 //Local variable state uses 49312 bytes of stack space
521 //coverity[STACK_USE]
522 State state;
523 initState (ctx, state);
524
525 if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG)<< "A priori vertex constraint is activated in VKalVrt fitter!" << endmsg;
526 std::unique_ptr<xAOD::Vertex> tmpVertex;
527 setApproximateVertex(constraint.position().x(), constraint.position().y(),constraint.position().z(),state);
528 setVertexForConstraint(constraint.position().x(),
529 constraint.position().y(),
530 constraint.position().z(),
531 state);
532 setCovVrtForConstraint(constraint.covariancePosition()(Trk::x,Trk::x),
533 constraint.covariancePosition()(Trk::y,Trk::x),
534 constraint.covariancePosition()(Trk::y,Trk::y),
535 constraint.covariancePosition()(Trk::z,Trk::x),
536 constraint.covariancePosition()(Trk::z,Trk::y),
537 constraint.covariancePosition()(Trk::z,Trk::z),
538 state);
539 state.m_useAprioriVertex=true;
541 TLorentzVector Momentum;
542 long int Charge;
543 std::vector<double> ErrorMatrix;
544 std::vector<double> Chi2PerTrk;
545 std::vector< std::vector<double> > TrkAtVrt;
546 double Chi2;
547 StatusCode sc=VKalVrtFit( xtpListC, xtpListN,
548 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
549 if(sc.isSuccess()){
550 tmpVertex = makeXAODVertex( (int)xtpListN.size(), Vertex, ErrorMatrix,Chi2PerTrk, TrkAtVrt, Chi2, state );
551 dvect fittrkwgt;
552 sc=VKalGetTrkWeights(fittrkwgt, state); if(sc.isFailure())fittrkwgt.clear();
553 for(int ii=0; ii<state.m_FitStatus; ii++) {
554 if(ii<(int)xtpListC.size()) {
556 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
557 else tmpVertex->addTrackAtVertex(TEL,1.);
558 }else{
560 if(!fittrkwgt.empty()) tmpVertex->addNeutralAtVertex(TEL,fittrkwgt[ii]);
561 else tmpVertex->addNeutralAtVertex(TEL,1.);
562 }
563 }
564 }
565
566 return tmpVertex;
567}
568
569
570std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const EventContext& ctx,
571 const std::vector<const TrackParameters*> & perigeeListC) const
572{
573 //Local variable state uses 49312 bytes of stack space
574 //coverity[STACK_USE]
575 State state;
576 initState (ctx, state);
577 Amg::Vector3D VertexIni(0.,0.,0.);
578 StatusCode sc=VKalVrtFitFast(perigeeListC, VertexIni, state);
579 if( sc.isSuccess()) setApproximateVertex(VertexIni.x(),VertexIni.y(),VertexIni.z(),state);
580 std::vector<const NeutralParameters*> perigeeListN(0);
582 TLorentzVector Momentum;
583 long int Charge;
584 std::vector<double> ErrorMatrix;
585 std::vector<double> Chi2PerTrk;
586 std::vector< std::vector<double> > TrkAtVrt;
587 double Chi2;
588 sc=VKalVrtFit( perigeeListC, perigeeListN,
589 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
590
591 if(sc.isSuccess()) {
592 return makeXAODVertex( 0, Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
593 }
594 return {};
595}
596
597std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const EventContext& ctx,
598 const std::vector<const TrackParameters*> & perigeeListC,
599 const std::vector<const NeutralParameters*> & perigeeListN) const
600{
601 //Local variable state uses 49312 bytes of stack space
602 //coverity[STACK_USE]
603 State state;
604 initState (ctx, state);
605 Amg::Vector3D VertexIni(0.,0.,0.);
606 StatusCode sc=VKalVrtFitFast(perigeeListC, VertexIni, state);
607 if( sc.isSuccess()) setApproximateVertex(VertexIni.x(),VertexIni.y(),VertexIni.z(),state);
609 TLorentzVector Momentum;
610 long int Charge;
611 std::vector<double> ErrorMatrix;
612 std::vector<double> Chi2PerTrk;
613 std::vector< std::vector<double> > TrkAtVrt;
614 double Chi2;
615 sc=VKalVrtFit( perigeeListC, perigeeListN,
616 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
617
618 if(sc.isSuccess()) {
619 return makeXAODVertex( (int)perigeeListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
620 }
621 return {};
622}
623
624
625
626/* Filling of 3x3 HepSymMatrix with content of symmetric matrix
627 in packed form vector<double> (6x6 - 21 elem)
628 (VxVyVzPxPyPz) */
629
630// Fills 5x5 matrix. Input Matrix is track covariance only.
631void TrkVKalVrtFitter::FillMatrixP(AmgSymMatrix(5)& CovMtx, std::vector<double> & Matrix)
632{
633 CovMtx.setIdentity();
634 if( Matrix.size() < 21) return;
635 CovMtx(0,0) = 0;
636 CovMtx(1,1) = 0;
637 CovMtx(2,2)= Matrix[ 9];
638 CovMtx.fillSymmetric(2,3,Matrix[13]);
639 CovMtx(3,3)= Matrix[14];
640 CovMtx.fillSymmetric(2,4,Matrix[18]);
641 CovMtx.fillSymmetric(3,4,Matrix[19]);
642 CovMtx(4,4)= Matrix[20];
643}
644
645// Fills 5x5 matrix. Input Matrix is a full covariance
646void TrkVKalVrtFitter::FillMatrixP(int iTrk, AmgSymMatrix(5)& CovMtx, std::vector<double> & Matrix)
647{
648 int iTmp=(iTrk+1)*3;
649 int NContent = Matrix.size();
650 CovMtx.setIdentity(); //Clean matrix for the beginning, then fill needed elements
651 CovMtx(0,0) = 0;
652 CovMtx(1,1) = 0;
653 int pnt = (iTmp+1)*iTmp/2 + iTmp; if( pnt > NContent ) return;
654 CovMtx(2,2) = Matrix[pnt];
655 pnt = (iTmp+1+1)*(iTmp+1)/2 + iTmp; if( pnt+1 > NContent ){ CovMtx.setIdentity(); return; }
656 CovMtx.fillSymmetric(2,3,Matrix[pnt]);
657 CovMtx(3,3) = Matrix[pnt+1];
658 pnt = (iTmp+2+1)*(iTmp+2)/2 + iTmp; if( pnt+2 > NContent ){ CovMtx.setIdentity(); return; }
659 CovMtx.fillSymmetric(2,4,Matrix[pnt]);
660 CovMtx.fillSymmetric(3,4,Matrix[pnt+1]);
661 CovMtx(4,4) = Matrix[pnt+2];
662}
663
664
665
666Amg::MatrixX * TrkVKalVrtFitter::GiveFullMatrix(int NTrk, std::vector<double> & Matrix)
667{
668 Amg::MatrixX * mtx = new Amg::MatrixX(3+3*NTrk,3+3*NTrk);
669 long int ij=0;
670 for(int i=1; i<=(3+3*NTrk); i++){
671 for(int j=1; j<=i; j++){
672 if(i==j){ (*mtx)(i-1,j-1)=Matrix[ij];}
673 else { (*mtx).fillSymmetric(i-1,j-1,Matrix[ij]);}
674 ij++;
675 }
676 }
677 return mtx;
678}
679
680
681
682std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::makeXAODVertex( int Neutrals,
683 const Amg::Vector3D& Vertex, const std::vector<double> & fitErrorMatrix,
684 const std::vector<double> & Chi2PerTrk, const std::vector< std::vector<double> >& TrkAtVrt,
685 double Chi2,
686 State& state) const
687{
688 long int NTrk = state.m_FitStatus;
689 long int Ndf = VKalGetNDOF(state)+state.m_planeCnstNDOF;
690
691 auto tmpVertex = std::make_unique<xAOD::Vertex>();
692 tmpVertex->makePrivateStore();
693 tmpVertex->setPosition(Vertex);
694 tmpVertex->setFitQuality(Chi2, (float)Ndf);
695
696 std::vector<VxTrackAtVertex> & tmpVTAV=tmpVertex->vxTrackAtVertex();
697 tmpVTAV.clear();
698 std::vector <double> CovFull;
699 StatusCode sc = VKalGetFullCov( NTrk, CovFull, state);
700 int covarExist=0; if( sc.isSuccess() ) covarExist=1;
701
702 std::vector<float> floatErrMtx;
703 if( m_makeExtendedVertex && covarExist ) {
704 floatErrMtx.resize(CovFull.size());
705 for(int i=0; i<(int)CovFull.size(); i++) {
706 if( CovFull[i] < std::numeric_limits<float>::max() &&
707 CovFull[i] > std::numeric_limits<float>::lowest() ){
708 floatErrMtx[i]=static_cast<float>(CovFull[i]);
709 } else {
710 floatErrMtx[i]=std::numeric_limits<float>::max();
711 }
712 }
713 }else{
714 floatErrMtx.resize(fitErrorMatrix.size());
715 for(int i=0; i<(int)fitErrorMatrix.size(); i++) {
716 if( fitErrorMatrix[i] < std::numeric_limits<float>::max() &&
717 fitErrorMatrix[i] > std::numeric_limits<float>::lowest() ){
718 floatErrMtx[i]=static_cast<float>(fitErrorMatrix[i]);
719 } else {
720 floatErrMtx[i]=std::numeric_limits<float>::max();
721 }
722 }
723 }
724 tmpVertex->setCovariance(floatErrMtx);
725
726 for(int ii=0; ii<NTrk ; ii++) {
727 AmgSymMatrix(5) CovMtxP;
728 if(covarExist){ FillMatrixP( ii, CovMtxP, CovFull );}
729 else { CovMtxP.setIdentity();}
730 Perigee * tmpChargPer=nullptr;
731 NeutralPerigee * tmpNeutrPer=nullptr;
732 if(ii<NTrk-Neutrals){
733 tmpChargPer = new Perigee( 0.,0., TrkAtVrt[ii][0],
734 TrkAtVrt[ii][1],
735 TrkAtVrt[ii][2],
736 PerigeeSurface(Vertex), std::move(CovMtxP) );
737 }else{
738 tmpNeutrPer = new NeutralPerigee( 0.,0., TrkAtVrt[ii][0],
739 TrkAtVrt[ii][1],
740 TrkAtVrt[ii][2],
742 std::move(CovMtxP) );
743 }
744 tmpVTAV.emplace_back(Chi2PerTrk[ii], tmpChargPer, tmpNeutrPer );
745 }
746
747 return tmpVertex;
748}
749
750
751} // End Of Namespace
#define endmsg
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
#define AmgSymMatrix(dim)
static Double_t sc
void getInitializedCache(MagField::AtlasFieldCache &cache) const
get B field cache for evaluation as a function of 2-d or 3-d position.
Class describing the Line to which the Perigee refers to.
std::vector< double > m_MassInputParticles
MagField::AtlasFieldCache m_fieldCache
std::vector< double > m_VertexForConstraint
std::vector< double > m_CovVrtForConstraint
const EventContext * m_eventContext
TrkVKalVrtFitter(const std::string &t, const std::string &name, const IInterface *parent)
virtual std::unique_ptr< xAOD::Vertex > fit(const EventContext &ctx, const std::vector< const TrackParameters * > &perigeeList, const Amg::Vector3D &startingPoint) const override final
Interface for MeasuredPerigee with starting point.
const IExtrapolator * m_InDetExtrapolator
Pointer to Extrapolator AlgTool.
Gaudi::Property< bool > m_makeExtendedVertex
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCacheCondObjInputKey
static Amg::MatrixX * GiveFullMatrix(int NTrk, std::vector< double > &)
Gaudi::Property< bool > m_usePhiCnst
virtual void setCovVrtForConstraint(double XX, double XY, double YY, double XZ, double YZ, double ZZ, IVKalState &istate) const override final
virtual StatusCode VKalVrtFitFast(std::span< const xAOD::TrackParticle *const >, Amg::Vector3D &Vertex, double &minDZ, IVKalState &istate) const
virtual void setVertexForConstraint(const xAOD::Vertex &, IVKalState &istate) const override final
Gaudi::Property< bool > m_usePointingCnst
ToolHandle< IExtrapolator > m_extPropagator
Gaudi::Property< int > m_IterationNumber
Gaudi::Property< bool > m_allowUltraDisplaced
Gaudi::Property< double > m_RobustScale
void initState(const EventContext &ctx, State &state) const
virtual StatusCode initialize() override final
Gaudi::Property< std::vector< double > > m_c_CovVrtForConstraint
virtual StatusCode VKalGetFullCov(long int, dvect &CovMtx, IVKalState &istate, bool=false) const override final
Gaudi::Property< double > m_massForConstraint
virtual StatusCode VKalVrtFit(const std::vector< const xAOD::TrackParticle * > &, const std::vector< const xAOD::NeutralParticle * > &, Amg::Vector3D &Vertex, TLorentzVector &Momentum, long int &Charge, dvect &ErrorMatrix, dvect &Chi2PerTrk, std::vector< std::vector< double > > &TrkAtVrt, double &Chi2, IVKalState &istate, bool ifCovV0=false) const override final
Gaudi::Property< bool > m_frozenVersionForBTagging
Gaudi::Property< bool > m_firstMeasuredPoint
Gaudi::Property< int > m_Robustness
virtual StatusCode VKalGetTrkWeights(dvect &Weights, const IVKalState &istate) const override final
static int VKalGetNDOF(const State &state)
Gaudi::Property< bool > m_usePassWithTrkErr
static void FillMatrixP(AmgSymMatrix(5)&, std::vector< double > &)
Gaudi::Property< bool > m_useZPointingCnst
Gaudi::Property< bool > m_useAprioriVertex
Gaudi::Property< bool > m_useFixedField
std::unique_ptr< xAOD::Vertex > makeXAODVertex(int, const Amg::Vector3D &, const dvect &, const dvect &, const std::vector< dvect > &, double, State &state) const
virtual StatusCode finalize() override final
Gaudi::Property< bool > m_usePassNear
VKalExtPropagator * m_fitPropagator
virtual void setApproximateVertex(double X, double Y, double Z, IVKalState &istate) const override final
Gaudi::Property< std::vector< double > > m_c_MassInputParticles
Gaudi::Property< std::vector< double > > m_c_VertexForConstraint
Gaudi::Property< bool > m_firstMeasuredPointLimit
virtual std::unique_ptr< IVKalState > makeState(const EventContext &ctx) const override final
void setAthenaPropagator(const Trk::IExtrapolator *)
Gaudi::Property< bool > m_useThetaCnst
void setAtlasField(MagField::AtlasFieldCache *)
const basePropagator * vk_objProp
This class is a simplest representation of a vertex candidate.
const Amg::Vector3D & position() const
Returns the 3-pos.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 3, 1 > Vector3D
Ensure that the ATLAS eigen extensions are properly loaded.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
ParametersT< NeutralParametersDim, Neutral, PerigeeSurface > NeutralPerigee
@ x
Definition ParamDefs.h:55
@ z
global position (cartesian)
Definition ParamDefs.h:57
@ y
Definition ParamDefs.h:56
std::vector< double > dvect
Vertex_v1 Vertex
Define the latest version of the vertex class.
MsgStream & msg
Definition testRead.cxx:32