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 State state;
202 initState (ctx, state);
203 setApproximateVertex(startingPoint.x(),
204 startingPoint.y(),
205 startingPoint.z(),
206 state);
207 std::vector<const NeutralParameters*> perigeeListN(0);
209 TLorentzVector Momentum;
210 long int Charge;
211 std::vector<double> ErrorMatrix;
212 std::vector<double> Chi2PerTrk;
213 std::vector< std::vector<double> > TrkAtVrt;
214 double Chi2;
215 StatusCode sc=VKalVrtFit( perigeeListC, perigeeListN,
216 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
217
218 if(sc.isSuccess()) {
219 return makeXAODVertex( 0, Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
220 }
221 return {};
222}
223
224
225std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const EventContext& ctx,
226 const std::vector<const TrackParameters*> & perigeeListC,
227 const std::vector<const NeutralParameters*> & perigeeListN,
228 const Amg::Vector3D & startingPoint) const
229{
230 State state;
231 initState (ctx, state);
232 setApproximateVertex(startingPoint.x(),
233 startingPoint.y(),
234 startingPoint.z(),
235 state);
237 TLorentzVector Momentum;
238 long int Charge;
239 std::vector<double> ErrorMatrix;
240 std::vector<double> Chi2PerTrk;
241 std::vector< std::vector<double> > TrkAtVrt;
242 double Chi2;
243 StatusCode sc=VKalVrtFit( perigeeListC,perigeeListN,
244 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
245
246 if(sc.isSuccess()) {
247 return makeXAODVertex( (int)perigeeListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
248 }
249 return {};
250}
251
252
253
254
255
256
259std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const EventContext& ctx,
260 const std::vector<const TrackParameters*> & perigeeListC,
261 const xAOD::Vertex & constraint) const
262{
263 State state;
264 initState (ctx, state);
265 if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG)<< "A priori vertex constraint is activated in VKalVrt fitter!" << endmsg;
266 Amg::Vector3D VertexIni(0.,0.,0.);
267 StatusCode sc=VKalVrtFitFast(perigeeListC, VertexIni, state);
268 if( sc.isSuccess()){
269 setApproximateVertex(VertexIni.x(),VertexIni.y(),VertexIni.z(),state);
270 }else{
271 setApproximateVertex(constraint.position().x(),
272 constraint.position().y(),
273 constraint.position().z(),
274 state);
275 }
276 setVertexForConstraint(constraint.position().x(),
277 constraint.position().y(),
278 constraint.position().z(),
279 state);
280 setCovVrtForConstraint(constraint.covariancePosition()(Trk::x,Trk::x),
281 constraint.covariancePosition()(Trk::y,Trk::x),
282 constraint.covariancePosition()(Trk::y,Trk::y),
283 constraint.covariancePosition()(Trk::z,Trk::x),
284 constraint.covariancePosition()(Trk::z,Trk::y),
285 constraint.covariancePosition()(Trk::z,Trk::z),
286 state);
287 state.m_useAprioriVertex=true;
288 std::vector<const NeutralParameters*> perigeeListN(0);
290 TLorentzVector Momentum;
291 long int Charge;
292 std::vector<double> ErrorMatrix;
293 std::vector<double> Chi2PerTrk;
294 std::vector< std::vector<double> > TrkAtVrt;
295 double Chi2;
296 sc=VKalVrtFit( perigeeListC, perigeeListN,
297 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
298
299
300 if(sc.isSuccess()) {
301 return makeXAODVertex( 0, Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
302 }
303 return {};
304}
305
306
307std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const EventContext& ctx,
308 const std::vector<const TrackParameters*> & perigeeListC,
309 const std::vector<const NeutralParameters*> & perigeeListN,
310 const xAOD::Vertex & constraint) const
311{
312 State state;
313 initState (ctx, state);
314
315 if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG)<< "A priori vertex constraint is activated in VKalVrt fitter!" << endmsg;
316 Amg::Vector3D VertexIni(0.,0.,0.);
317 StatusCode sc=VKalVrtFitFast(perigeeListC, VertexIni, state);
318 if( sc.isSuccess()){
319 setApproximateVertex(VertexIni.x(),VertexIni.y(),VertexIni.z(),state);
320 }else{
321 setApproximateVertex(constraint.position().x(),
322 constraint.position().y(),
323 constraint.position().z(),
324 state);
325 }
326 setVertexForConstraint(constraint.position().x(),
327 constraint.position().y(),
328 constraint.position().z(),
329 state);
330 setCovVrtForConstraint(constraint.covariancePosition()(Trk::x,Trk::x),
331 constraint.covariancePosition()(Trk::y,Trk::x),
332 constraint.covariancePosition()(Trk::y,Trk::y),
333 constraint.covariancePosition()(Trk::z,Trk::x),
334 constraint.covariancePosition()(Trk::z,Trk::y),
335 constraint.covariancePosition()(Trk::z,Trk::z),
336 state);
337 state.m_useAprioriVertex=true;
339 TLorentzVector Momentum;
340 long int Charge;
341 std::vector<double> ErrorMatrix;
342 std::vector<double> Chi2PerTrk;
343 std::vector< std::vector<double> > TrkAtVrt;
344 double Chi2;
345 sc=VKalVrtFit( perigeeListC, perigeeListN,
346 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
347
348
349 if(sc.isSuccess()) {
350 return makeXAODVertex( (int)perigeeListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
351 }
352 return {};
353}
354
358std::unique_ptr<xAOD::Vertex>
359TrkVKalVrtFitter::fit(const EventContext& ctx,
360 const std::vector<const xAOD::TrackParticle*>& xtpListC,
361 const Amg::Vector3D& startingPoint) const
362{
363 State state;
364 initState(ctx, state);
365 return std::unique_ptr<xAOD::Vertex>(fit(xtpListC, startingPoint, state));
366}
367
368std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const std::vector<const xAOD::TrackParticle*> & xtpListC,
369 const Amg::Vector3D & startingPoint,
370 IVKalState& istate) const
371{
372 assert(dynamic_cast<State*> (&istate)!=nullptr);
373 State& state = static_cast<State&> (istate);
374
375 std::unique_ptr<xAOD::Vertex> tmpVertex;
376 setApproximateVertex(startingPoint.x(),
377 startingPoint.y(),
378 startingPoint.z(),
379 state);
380 std::vector<const xAOD::NeutralParticle*> xtpListN(0);
382 TLorentzVector Momentum;
383 long int Charge;
384 std::vector<double> ErrorMatrix;
385 std::vector<double> Chi2PerTrk;
386 std::vector< std::vector<double> > TrkAtVrt;
387 double Chi2;
388 StatusCode sc=VKalVrtFit( xtpListC, xtpListN,
389 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
390 if(sc.isSuccess()) {
391 tmpVertex = makeXAODVertex( 0, Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
392 dvect fittrkwgt;
393 sc=VKalGetTrkWeights(fittrkwgt, state); if(sc.isFailure())fittrkwgt.clear();
394 for(int ii=0; ii<state.m_FitStatus; ii++) {
396 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
397 else tmpVertex->addTrackAtVertex(TEL,1.);
398 }
399 }
400
401 return tmpVertex;
402}
403
404std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const EventContext& ctx,
405 const std::vector<const xAOD::TrackParticle*> & xtpListC,
406 const std::vector<const xAOD::NeutralParticle*> & xtpListN,
407 const Amg::Vector3D & startingPoint) const
408{
409 State state;
410 initState (ctx, state);
411 std::unique_ptr<xAOD::Vertex> tmpVertex;
412 setApproximateVertex(startingPoint.x(),
413 startingPoint.y(),
414 startingPoint.z(),
415 state);
417 TLorentzVector Momentum;
418 long int Charge;
419 std::vector<double> ErrorMatrix;
420 std::vector<double> Chi2PerTrk;
421 std::vector< std::vector<double> > TrkAtVrt;
422 double Chi2;
423 StatusCode sc=VKalVrtFit( xtpListC, xtpListN,
424 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
425 if(sc.isSuccess()) {
426 tmpVertex = makeXAODVertex( (int)xtpListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
427 dvect fittrkwgt;
428 sc=VKalGetTrkWeights(fittrkwgt, state); if(sc.isFailure())fittrkwgt.clear();
429 for(int ii=0; ii<state.m_FitStatus; ii++) {
430 if(ii<(int)xtpListC.size()) {
432 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
433 else tmpVertex->addTrackAtVertex(TEL,1.);
434 }else{
436 if(!fittrkwgt.empty()) tmpVertex->addNeutralAtVertex(TEL,fittrkwgt[ii]);
437 else tmpVertex->addNeutralAtVertex(TEL,1.);
438 }
439 }
440 }
441
442 return tmpVertex;
443}
444
447std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const EventContext& ctx,
448 const std::vector<const xAOD::TrackParticle*> & xtpListC,
449 const xAOD::Vertex & constraint) const
450{
451 State state;
452 initState (ctx, state);
453 return fit (xtpListC, constraint, state);
454}
455std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const std::vector<const xAOD::TrackParticle*> & xtpListC,
456 const xAOD::Vertex & constraint,
457 IVKalState& istate) const
458{
459 assert(dynamic_cast<State*> (&istate)!=nullptr);
460 State& state = static_cast<State&> (istate);
461
462 if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG)<< "A priori vertex constraint is activated in VKalVrt fitter!" << endmsg;
463 std::unique_ptr<xAOD::Vertex> tmpVertex;
464 setApproximateVertex(constraint.position().x(), constraint.position().y(),constraint.position().z(),state);
465 setVertexForConstraint(constraint.position().x(),
466 constraint.position().y(),
467 constraint.position().z(),
468 state);
469 setCovVrtForConstraint(constraint.covariancePosition()(Trk::x,Trk::x),
470 constraint.covariancePosition()(Trk::y,Trk::x),
471 constraint.covariancePosition()(Trk::y,Trk::y),
472 constraint.covariancePosition()(Trk::z,Trk::x),
473 constraint.covariancePosition()(Trk::z,Trk::y),
474 constraint.covariancePosition()(Trk::z,Trk::z),
475 state);
476 state.m_useAprioriVertex=true;
477 std::vector<const xAOD::NeutralParticle*> xtpListN(0);
479 TLorentzVector Momentum;
480 long int Charge;
481 std::vector<double> ErrorMatrix;
482 std::vector<double> Chi2PerTrk;
483 std::vector< std::vector<double> > TrkAtVrt;
484 double Chi2;
485 StatusCode sc=VKalVrtFit( xtpListC, xtpListN,
486 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
487 if(sc.isSuccess()) {
488 tmpVertex = makeXAODVertex( 0, Vertex, ErrorMatrix,Chi2PerTrk, TrkAtVrt, Chi2, state );
489 dvect fittrkwgt;
490 sc=VKalGetTrkWeights(fittrkwgt, state); if(sc.isFailure())fittrkwgt.clear();
491 for(int ii=0; ii<state.m_FitStatus; ii++) {
493 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
494 else tmpVertex->addTrackAtVertex(TEL,1.);
495 }
496 }
497
498 return tmpVertex;
499}
500
501std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const EventContext& ctx,
502 const std::vector<const xAOD::TrackParticle*> & xtpListC,
503 const std::vector<const xAOD::NeutralParticle*> & xtpListN,
504 const xAOD::Vertex & constraint) const
505{
506 State state;
507 initState (ctx, state);
508
509 if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG)<< "A priori vertex constraint is activated in VKalVrt fitter!" << endmsg;
510 std::unique_ptr<xAOD::Vertex> tmpVertex;
511 setApproximateVertex(constraint.position().x(), constraint.position().y(),constraint.position().z(),state);
512 setVertexForConstraint(constraint.position().x(),
513 constraint.position().y(),
514 constraint.position().z(),
515 state);
516 setCovVrtForConstraint(constraint.covariancePosition()(Trk::x,Trk::x),
517 constraint.covariancePosition()(Trk::y,Trk::x),
518 constraint.covariancePosition()(Trk::y,Trk::y),
519 constraint.covariancePosition()(Trk::z,Trk::x),
520 constraint.covariancePosition()(Trk::z,Trk::y),
521 constraint.covariancePosition()(Trk::z,Trk::z),
522 state);
523 state.m_useAprioriVertex=true;
525 TLorentzVector Momentum;
526 long int Charge;
527 std::vector<double> ErrorMatrix;
528 std::vector<double> Chi2PerTrk;
529 std::vector< std::vector<double> > TrkAtVrt;
530 double Chi2;
531 StatusCode sc=VKalVrtFit( xtpListC, xtpListN,
532 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
533 if(sc.isSuccess()){
534 tmpVertex = makeXAODVertex( (int)xtpListN.size(), Vertex, ErrorMatrix,Chi2PerTrk, TrkAtVrt, Chi2, state );
535 dvect fittrkwgt;
536 sc=VKalGetTrkWeights(fittrkwgt, state); if(sc.isFailure())fittrkwgt.clear();
537 for(int ii=0; ii<state.m_FitStatus; ii++) {
538 if(ii<(int)xtpListC.size()) {
540 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
541 else tmpVertex->addTrackAtVertex(TEL,1.);
542 }else{
544 if(!fittrkwgt.empty()) tmpVertex->addNeutralAtVertex(TEL,fittrkwgt[ii]);
545 else tmpVertex->addNeutralAtVertex(TEL,1.);
546 }
547 }
548 }
549
550 return tmpVertex;
551}
552
553
554std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const EventContext& ctx,
555 const std::vector<const TrackParameters*> & perigeeListC) const
556{
557 State state;
558 initState (ctx, state);
559 Amg::Vector3D VertexIni(0.,0.,0.);
560 StatusCode sc=VKalVrtFitFast(perigeeListC, VertexIni, state);
561 if( sc.isSuccess()) setApproximateVertex(VertexIni.x(),VertexIni.y(),VertexIni.z(),state);
562 std::vector<const NeutralParameters*> perigeeListN(0);
564 TLorentzVector Momentum;
565 long int Charge;
566 std::vector<double> ErrorMatrix;
567 std::vector<double> Chi2PerTrk;
568 std::vector< std::vector<double> > TrkAtVrt;
569 double Chi2;
570 sc=VKalVrtFit( perigeeListC, perigeeListN,
571 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
572
573 if(sc.isSuccess()) {
574 return makeXAODVertex( 0, Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
575 }
576 return {};
577}
578
579std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::fit(const EventContext& ctx,
580 const std::vector<const TrackParameters*> & perigeeListC,
581 const std::vector<const NeutralParameters*> & perigeeListN) const
582{
583 State state;
584 initState (ctx, state);
585 Amg::Vector3D VertexIni(0.,0.,0.);
586 StatusCode sc=VKalVrtFitFast(perigeeListC, VertexIni, state);
587 if( sc.isSuccess()) setApproximateVertex(VertexIni.x(),VertexIni.y(),VertexIni.z(),state);
589 TLorentzVector Momentum;
590 long int Charge;
591 std::vector<double> ErrorMatrix;
592 std::vector<double> Chi2PerTrk;
593 std::vector< std::vector<double> > TrkAtVrt;
594 double Chi2;
595 sc=VKalVrtFit( perigeeListC, perigeeListN,
596 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
597
598 if(sc.isSuccess()) {
599 return makeXAODVertex( (int)perigeeListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
600 }
601 return {};
602}
603
604
605
606/* Filling of 3x3 HepSymMatrix with content of symmetric matrix
607 in packed form vector<double> (6x6 - 21 elem)
608 (VxVyVzPxPyPz) */
609
610// Fills 5x5 matrix. Input Matrix is track covariance only.
611void TrkVKalVrtFitter::FillMatrixP(AmgSymMatrix(5)& CovMtx, std::vector<double> & Matrix)
612{
613 CovMtx.setIdentity();
614 if( Matrix.size() < 21) return;
615 CovMtx(0,0) = 0;
616 CovMtx(1,1) = 0;
617 CovMtx(2,2)= Matrix[ 9];
618 CovMtx.fillSymmetric(2,3,Matrix[13]);
619 CovMtx(3,3)= Matrix[14];
620 CovMtx.fillSymmetric(2,4,Matrix[18]);
621 CovMtx.fillSymmetric(3,4,Matrix[19]);
622 CovMtx(4,4)= Matrix[20];
623}
624
625// Fills 5x5 matrix. Input Matrix is a full covariance
626void TrkVKalVrtFitter::FillMatrixP(int iTrk, AmgSymMatrix(5)& CovMtx, std::vector<double> & Matrix)
627{
628 int iTmp=(iTrk+1)*3;
629 int NContent = Matrix.size();
630 CovMtx.setIdentity(); //Clean matrix for the beginning, then fill needed elements
631 CovMtx(0,0) = 0;
632 CovMtx(1,1) = 0;
633 int pnt = (iTmp+1)*iTmp/2 + iTmp; if( pnt > NContent ) return;
634 CovMtx(2,2) = Matrix[pnt];
635 pnt = (iTmp+1+1)*(iTmp+1)/2 + iTmp; if( pnt+1 > NContent ){ CovMtx.setIdentity(); return; }
636 CovMtx.fillSymmetric(2,3,Matrix[pnt]);
637 CovMtx(3,3) = Matrix[pnt+1];
638 pnt = (iTmp+2+1)*(iTmp+2)/2 + iTmp; if( pnt+2 > NContent ){ CovMtx.setIdentity(); return; }
639 CovMtx.fillSymmetric(2,4,Matrix[pnt]);
640 CovMtx.fillSymmetric(3,4,Matrix[pnt+1]);
641 CovMtx(4,4) = Matrix[pnt+2];
642}
643
644
645
646Amg::MatrixX * TrkVKalVrtFitter::GiveFullMatrix(int NTrk, std::vector<double> & Matrix)
647{
648 Amg::MatrixX * mtx = new Amg::MatrixX(3+3*NTrk,3+3*NTrk);
649 long int ij=0;
650 for(int i=1; i<=(3+3*NTrk); i++){
651 for(int j=1; j<=i; j++){
652 if(i==j){ (*mtx)(i-1,j-1)=Matrix[ij];}
653 else { (*mtx).fillSymmetric(i-1,j-1,Matrix[ij]);}
654 ij++;
655 }
656 }
657 return mtx;
658}
659
660
661
662std::unique_ptr<xAOD::Vertex> TrkVKalVrtFitter::makeXAODVertex( int Neutrals,
663 const Amg::Vector3D& Vertex, const std::vector<double> & fitErrorMatrix,
664 const std::vector<double> & Chi2PerTrk, const std::vector< std::vector<double> >& TrkAtVrt,
665 double Chi2,
666 State& state) const
667{
668 long int NTrk = state.m_FitStatus;
669 long int Ndf = VKalGetNDOF(state)+state.m_planeCnstNDOF;
670
671 auto tmpVertex = std::make_unique<xAOD::Vertex>();
672 tmpVertex->makePrivateStore();
673 tmpVertex->setPosition(Vertex);
674 tmpVertex->setFitQuality(Chi2, (float)Ndf);
675
676 std::vector<VxTrackAtVertex> & tmpVTAV=tmpVertex->vxTrackAtVertex();
677 tmpVTAV.clear();
678 std::vector <double> CovFull;
679 StatusCode sc = VKalGetFullCov( NTrk, CovFull, state);
680 int covarExist=0; if( sc.isSuccess() ) covarExist=1;
681
682 std::vector<float> floatErrMtx;
683 if( m_makeExtendedVertex && covarExist ) {
684 floatErrMtx.resize(CovFull.size());
685 for(int i=0; i<(int)CovFull.size(); i++) {
686 if( CovFull[i] < std::numeric_limits<float>::max() &&
687 CovFull[i] > std::numeric_limits<float>::lowest() ){
688 floatErrMtx[i]=static_cast<float>(CovFull[i]);
689 } else {
690 floatErrMtx[i]=std::numeric_limits<float>::max();
691 }
692 }
693 }else{
694 floatErrMtx.resize(fitErrorMatrix.size());
695 for(int i=0; i<(int)fitErrorMatrix.size(); i++) {
696 if( fitErrorMatrix[i] < std::numeric_limits<float>::max() &&
697 fitErrorMatrix[i] > std::numeric_limits<float>::lowest() ){
698 floatErrMtx[i]=static_cast<float>(fitErrorMatrix[i]);
699 } else {
700 floatErrMtx[i]=std::numeric_limits<float>::max();
701 }
702 }
703 }
704 tmpVertex->setCovariance(floatErrMtx);
705
706 for(int ii=0; ii<NTrk ; ii++) {
707 AmgSymMatrix(5) CovMtxP;
708 if(covarExist){ FillMatrixP( ii, CovMtxP, CovFull );}
709 else { CovMtxP.setIdentity();}
710 Perigee * tmpChargPer=nullptr;
711 NeutralPerigee * tmpNeutrPer=nullptr;
712 if(ii<NTrk-Neutrals){
713 tmpChargPer = new Perigee( 0.,0., TrkAtVrt[ii][0],
714 TrkAtVrt[ii][1],
715 TrkAtVrt[ii][2],
716 PerigeeSurface(Vertex), std::move(CovMtxP) );
717 }else{
718 tmpNeutrPer = new NeutralPerigee( 0.,0., TrkAtVrt[ii][0],
719 TrkAtVrt[ii][1],
720 TrkAtVrt[ii][2],
722 std::move(CovMtxP) );
723 }
724 tmpVTAV.emplace_back(Chi2PerTrk[ii], tmpChargPer, tmpNeutrPer );
725 }
726
727 return tmpVertex;
728}
729
730
731} // 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