279 const Vertex* primVrt,
bool FirstDecayAtPV )
const
281 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
286 std::vector< Vect3DF > cVertices;
287 std::vector< std::vector<double> > covVertices;
288 std::vector< std::vector< VectMOM> > fittedParticles;
289 std::vector< std::vector<double> > fittedCovariance;
290 std::vector<double> fitFullCovariance;
291 std::vector<double> particleChi2;
295 std::vector<const TrackParameters*> baseInpTrk;
297 std::vector<const xAOD::TrackParticle*>::const_iterator i_ntrk;
299 unsigned int indexFMP;
302 ATH_MSG_DEBUG(
"FirstMeasuredPoint on track is discovered. Use it.");
305 ATH_MSG_DEBUG(
"No FirstMeasuredPoint on track in CascadeFitter. Stop fit");
318 std::vector< std::vector<int> > vertexDefinition;
319 std::vector< std::vector<int> > cascadeDefinition;
322 double * partMass=
new double[ntrk];
332 std::vector<int> indexT,indexV,indexTT,indexVV,tmpInd;
337 throw std::runtime_error(
"TrkVKalVrtFitter::fitCascade: index into vector is negative.");
342 for (
int idx : c.pseudoInVrt)
350 if(msgLvl(MSG::DEBUG)){
351 msg(MSG::DEBUG)<<
"Standard cascade fit" <<
endmsg;
364 double covari[6] = {primVrtRec->covariancePosition()(0,0),primVrtRec->covariancePosition()(0,1),
365 primVrtRec->covariancePosition()(1,1),primVrtRec->covariancePosition()(0,2),
366 primVrtRec->covariancePosition()(1,2),primVrtRec->covariancePosition()(2,2)};
376 getFittedCascade(refCascadeEvent, cVertices, covVertices, fittedParticles, fittedCovariance, particleChi2, fitFullCovariance );
389 int ip,ivFrom=0,ivTo;
391 for( ivTo=0; ivTo<(int)vertexDefinition.size(); ivTo++){
392 if(cascadeDefinition[ivTo].
empty())
continue;
393 for( ip=0; ip<(int)cascadeDefinition[ivTo].size(); ip++){
394 ivFrom=cascadeDefinition[ivTo][ip];
396 for(it=0; it<(int)fittedParticles[ivFrom].size(); it++){
397 px += fittedParticles[ivFrom][it].Px;
398 py += fittedParticles[ivFrom][it].Py;
399 pz += fittedParticles[ivFrom][it].Pz;
401 Sign= (cVertices[ivFrom].X-cVertices[ivTo].X)*
px
402 +(cVertices[ivFrom].Y-cVertices[ivTo].Y)*
py
403 +(cVertices[ivFrom].Z-cVertices[ivTo].Z)*
pz;
414 std::vector< std::vector<int> > new_vertexDefinition;
415 std::vector< std::vector<int> > new_cascadeDefinition;
419 if(msgLvl(MSG::DEBUG)){
420 msg(MSG::DEBUG)<<
"Compressed cascade fit" <<
endmsg;
425 partMass=
new double[ntrk];
428 new_vertexDefinition,
429 new_cascadeDefinition);
delete[] partMass;
if(IERR){
CLEANCASCADE();
return nullptr;}
432 indexT.clear(); indexV.clear();
435 for (
VertexID inV : c.pseudoInVrt) {
436 int icv=
indexInV(inV, cstate);
if(icv<0)
break;
440 indexT.insert (indexT.end(), indexTT.begin(), indexTT.end());
442 std::vector<int> tmpI(1); tmpI[0]=inV;
445 indexV.insert (indexV.end(), indexVV.begin(), indexVV.end());
452 ATH_MSG_DEBUG(
"Setting compressed mass constraints ierr="<<IERR);
461 double covari[6] = {primVrtRec->covariancePosition()(0,0),primVrtRec->covariancePosition()(0,1),
462 primVrtRec->covariancePosition()(1,1),primVrtRec->covariancePosition()(0,2),
463 primVrtRec->covariancePosition()(1,2),primVrtRec->covariancePosition()(2,2)};
476 std::vector< Vect3DF > t_cVertices;
477 std::vector< std::vector<double> > t_covVertices;
478 std::vector< std::vector< VectMOM> > t_fittedParticles;
479 std::vector< std::vector<double> > t_fittedCovariance;
480 std::vector<double> t_fitFullCovariance;
482 t_fittedCovariance, particleChi2, t_fitFullCovariance);
483 cVertices.clear(); covVertices.clear();
487 if(msgLvl(MSG::DEBUG)){
488 msg(MSG::DEBUG)<<
"Initial cascade momenta"<<
endmsg;
489 for(
int kv=0; kv<(int)fittedParticles.size(); kv++){
490 for(
int kt=0; kt<(int)fittedParticles[kv].size(); kt++)
492 " Px="<<fittedParticles[kv][kt].Px<<
" Py="<<fittedParticles[kv][kt].Py<<
";";
495 msg(MSG::DEBUG)<<
"Squized cascade momenta"<<
endmsg;
496 for(
int kv=0; kv<(int)t_fittedParticles.size(); kv++){
497 for(
int kt=0; kt<(int)t_fittedParticles[kv].size(); kt++)
499 " Px="<<t_fittedParticles[kv][kt].Px<<
" Py="<<t_fittedParticles[kv][kt].Py<<
";";
505 cVertices.push_back(t_cVertices[
index]);
506 covVertices.push_back(t_covVertices[
index]);
507 for(it=0; it<(int)cstate.
m_cascadeVList[iv].trkInVrt.size(); it++){
509 for(itmp=0; itmp<(int)new_vertexDefinition[
index].size(); itmp++)
if(numTrk==new_vertexDefinition[
index][itmp])
break;
510 fittedParticles[iv][it]=t_fittedParticles[
index][itmp];
532 for(ip=0; ip<(int)cstate.
m_cascadeVList[iv].inPointingV.size(); ip++){
535 tmpMom.
Px=tmpMom.
Py=tmpMom.
Pz=tmpMom.
E=0.;
536 for(it=0; it<(int)(cstate.
m_cascadeVList[tmpIndexV].trkInVrt.size()+
538 tmpMom.
Px += fittedParticles[tmpIndexV][it].Px; tmpMom.
Py += fittedParticles[tmpIndexV][it].Py;
539 tmpMom.
Pz += fittedParticles[tmpIndexV][it].Pz; tmpMom.
E += fittedParticles[tmpIndexV][it].E;
541 fittedParticles[iv][ip+NTrkInVrt]=tmpMom;
544 for(itmp=0; itmp<(int)new_cascadeDefinition[
index].size(); itmp++)
if(indexS==new_cascadeDefinition[
index][itmp])
break;
545 fittedParticles[iv][ip+NTrkInVrt]=t_fittedParticles[
index][itmp+new_vertexDefinition[
index].size()];
549 if(msgLvl(MSG::DEBUG)){
550 msg(MSG::DEBUG)<<
"Refit cascade momenta"<<
endmsg;
551 for(
int kv=0; kv<(int)fittedParticles.size(); kv++){
552 for(
int kt=0; kt<(int)fittedParticles[kv].size(); kt++)
554 " Px="<<fittedParticles[kv][kt].Px<<
" Py="<<fittedParticles[kv][kt].Py<<
";";
565 for(ip=0; ip<(int)cstate.
m_cascadeVList[iv].inPointingV.size(); ip++){
570 fittedCovariance[iv]=t_fittedCovariance[
index];
580 std::vector<xAOD::Vertex*> xaodVrtList(0);
581 double phi,
theta, invP, mom, fullChi2=0.;
583 int NDOF=
getCascadeNDoF(cstate);
if(NDOFsqueezed) NDOF=NDOFsqueezed;
584 if(primVrt){
if(FirstDecayAtPV){ NDOF+=3; }
else{ NDOF+=2; } }
586 for(iv=0; iv<(int)cVertices.size(); iv++){
588 VrtCovMtx(0,0) = covVertices[iv][0]; VrtCovMtx(0,1) = covVertices[iv][1];
589 VrtCovMtx(1,1) = covVertices[iv][2]; VrtCovMtx(0,2) = covVertices[iv][3];
590 VrtCovMtx(1,2) = covVertices[iv][4]; VrtCovMtx(2,2) = covVertices[iv][5];
591 VrtCovMtx(1,0) = VrtCovMtx(0,1);
592 VrtCovMtx(2,0) = VrtCovMtx(0,2);
593 VrtCovMtx(2,1) = VrtCovMtx(1,2);
595 for(it=0; it<(int)vertexDefinition[iv].size(); it++) { Chi2 += particleChi2[vertexDefinition[iv][it]];};
600 tmpXAODVertex->makePrivateStore();
603 std::vector<VxTrackAtVertex> & tmpVTAV=tmpXAODVertex->
vxTrackAtVertex();
606 int NRealT=vertexDefinition[iv].size();
608 for( it=0; it<NRealT*3+3; it++){
609 for( jt=0; jt<=it; jt++){
610 genCOV(it,jt) = genCOV(jt,it) = fittedCovariance[iv][it*(it+1)/2+jt];
615 fullDeriv=Amg::MatrixX::Zero(NRealT*3+3, NRealT*3+3);
616 fullDeriv(0,0)=fullDeriv(1,1)=fullDeriv(2,2)=1.;
618 for( it=0; it<NRealT; it++) {
619 mom= sqrt( fittedParticles[iv][it].Pz*fittedParticles[iv][it].Pz
620 +fittedParticles[iv][it].Py*fittedParticles[iv][it].Py
621 +fittedParticles[iv][it].Px*fittedParticles[iv][it].Px);
622 double Px=fittedParticles[iv][it].Px;
623 double Py=fittedParticles[iv][it].Py;
624 double Pz=fittedParticles[iv][it].Pz;
625 double Pt= sqrt(Px*Px + Py*Py) ;
627 theta=acos( Pz/mom );
628 invP = - state.
m_ich[vertexDefinition[iv][it]] / mom;
632 tmpDeriv(0,1) = -sin(
phi);
633 tmpDeriv(0,2) = cos(
phi);
634 tmpDeriv(1,1) = -cos(
phi)/tan(
theta);
635 tmpDeriv(1,2) = -sin(
phi)/tan(
theta);
637 tmpDeriv(2+0,3*it+3+0) = -Py/Pt/Pt;
638 tmpDeriv(2+0,3*it+3+1) = Px/Pt/Pt;
639 tmpDeriv(2+0,3*it+3+2) = 0;
640 tmpDeriv(2+1,3*it+3+0) = Px*Pz/(Pt*mom*mom);
641 tmpDeriv(2+1,3*it+3+1) = Py*Pz/(Pt*mom*mom);
642 tmpDeriv(2+1,3*it+3+2) = -Pt/(mom*mom);
643 tmpDeriv(2+2,3*it+3+0) = -Px/(mom*mom) * invP;
644 tmpDeriv(2+2,3*it+3+1) = -Py/(mom*mom) * invP;
645 tmpDeriv(2+2,3*it+3+2) = -Pz/(mom*mom) * invP;
647 if(
m_makeExtendedVertex )fullDeriv.block<3,3>(3*it+3+0,3*it+3+0) = tmpDeriv.block<3,3>(2,3*it+3+0);
650 tmpCovMtx = genCOV.similarity(tmpDeriv);
652 tmpVTAV.emplace_back( particleChi2[vertexDefinition[iv][it]] , measPerigee ) ;
654 std::vector<float> floatErrMtx;
657 tmpCovMtx=genCOV.similarity(fullDeriv);
658 floatErrMtx.resize((NRealT*3+3)*(NRealT*3+3+1)/2);
660 for(
int i=0;i<NRealT*3+3;i++){
661 for(
int j=0;j<=i;j++){
662 floatErrMtx.at(ivk++)=tmpCovMtx(i,j);
666 floatErrMtx.resize(6);
667 for(
int i=0; i<6; i++) floatErrMtx[i]=covVertices[iv][i];
670 for(
int itvk=0; itvk<NRealT; itvk++) {
679 xaodVrtList.push_back(tmpXAODVertex);
685 std::vector<TLorentzVector> tmpMoms;
686 std::vector<std::vector<TLorentzVector> > particleMoms;
687 std::vector<Amg::MatrixX> particleCovs;
689 for(iv=0; iv<(int)cVertices.size(); iv++){
691 int NTrkF=fittedParticles[iv].size();
692 for(it=0; it< NTrkF; it++) {
693 tmpMoms.emplace_back( fittedParticles[iv][it].Px, fittedParticles[iv][it].Py,
694 fittedParticles[iv][it].Pz, fittedParticles[iv][it].E );
697 Amg::MatrixX COV(NTrkF*3+3,NTrkF*3+3); COV=Amg::MatrixX::Zero(NTrkF*3+3,NTrkF*3+3);
698 for( it=0; it<NTrkF*3+3; it++){
699 for( jt=0; jt<=it; jt++){
700 COV(it,jt) = COV(jt,it) = fittedCovariance[iv][it*(it+1)/2+jt];
702 particleMoms.push_back( std::move(tmpMoms) );
703 particleCovs.push_back( std::move(COV) );
707 int NAPAR=(allFitPrt+cVertices.size())*3;
711 for( it=0; it<NAPAR; it++){
712 for( jt=0; jt<=it; jt++){
713 FULL(it,jt) = FULL(jt,it) = fitFullCovariance[it*(it+1)/2+jt];
720 FULL.block(mcount,mcount,particleCovs[iv].rows(),particleCovs[iv].cols())=particleCovs[iv];
721 mcount += particleCovs[iv].rows();
727 VxCascadeInfo * recCascade=
new VxCascadeInfo(std::move(xaodVrtList),std::move(particleMoms),std::move(particleCovs), NDOF ,fullChi2);