277 if( H0==
nullptr ||
C==
nullptr) {
278 ATH_MSG_ERROR(
"no derivative matrix or cov matrix stored on AlignTrack!"
279 <<
"This should have been done in AlignTrackPreProcessor!"
290 int Csize(
C->rows());
302 auto CA = std::make_unique<AlSymMat>(Csize);
305 for(
int ii=0; ii<Csize; ++ii ) {
306 for(
int jj=ii; jj<Csize; ++jj ) {
307 CA->elemr(ii,jj) = (*C)(ii,jj);
314 ATH_MSG_ERROR(
"First inversion of matrix CA failed with LAPACK status flag " << ierr);
319 if( !(alignTrack->
refitD0()) ) {
320 for(
int ii=0; ii<(Csize); ++ii) CA->elemr(0,ii)=0.0;
323 if( !(alignTrack->
refitZ0()) ) {
324 for(
int ii=0; ii<(Csize); ++ii) CA->elemr(1,ii)=0.0;
328 for(
int ii=0; ii<(Csize); ++ii) CA->elemr(2,ii)=0.0;
332 for(
int ii=0; ii<(Csize); ++ii) CA->elemr(3,ii)=0.0;
336 for(
int ii=0; ii<(Csize); ++ii) CA->elemr(4,ii)=0.0;
344 ATH_MSG_ERROR(
"Second inversion of matrix CA failed with LAPACK status flag " << ierr);
349 for(
int ii=0; ii<Csize; ++ii ) {
350 for(
int jj=ii; jj<Csize; ++jj ) {
351 CC(ii,jj) = CA->elemc(ii,jj);
356 if( !(alignTrack->
refitD0()) )
for(
int ii=0; ii<(Csize); ++ii){ CC(0,ii)=0.0; CC(ii,0)=0.0; };
357 if( !(alignTrack->
refitZ0()) )
for(
int ii=0; ii<(Csize); ++ii){ CC(1,ii)=0.0; CC(ii,1)=0.0; };
358 if( !(alignTrack->
refitPhi()) )
for(
int ii=0; ii<(Csize); ++ii){ CC(2,ii)=0.0; CC(ii,2)=0.0; };
359 if( !(alignTrack->
refitTheta()) )
for(
int ii=0; ii<(Csize); ++ii){ CC(3,ii)=0.0; CC(ii,3)=0.0; };
360 if( !(alignTrack->
refitQovP()) )
for(
int ii=0; ii<(Csize); ++ii){ CC(4,ii)=0.0; CC(ii,4)=0.0; };
369 int nMeas = H0->rows();
375 HCH = CC.similarity( *H0 );
377 ATH_MSG_DEBUG(
"HCH ( "<<HCH.rows()<<
" x "<<HCH.cols()<<
" )");
384 std::vector<int> matrixIndices(nMeas);
409 matrixIndices[imeas]=-1;
416 for (
const AlignTSOS* atsos : *alignTSOSCollection) {
418 if (!atsos->isValid())
422 ATH_MSG_ERROR(
"can't use scatterers on AlignTrack yet for analytical derivatives!");
428 if (atsos_rio->
identify()==tsosId) {
429 matrixIndices[imeas]=iameas;
433 if (atsos->nResDim()>1)
437 matrixIndices[imeas]=iameas;
443 else if(atsos->nResDim()>1)
453 matrixIndices[imeas]=-1;
454 ATH_MSG_DEBUG(
"matrixIndices["<<imeas<<
"]="<<matrixIndices[imeas]);
464 for (
int k=0;k<nMeas;k++) {
466 int iameas=matrixIndices[k];
470 for (
int l=0;l<nMeas;l++) {
471 int jameas=matrixIndices[l];
475 Q(iameas,jameas) = HCH(k,l);
480 ATH_MSG_DEBUG(
"before check Q ( "<<Q.rows()<<
" x "<<Q.cols()<<
" )");
484 ATH_MSG_DEBUG(
"Matrix Q = HCH is invalid, skipping the track");
554 Amg::Transform3D globalFrameToAlignFrame =
module->globalFrameToAlignFrame();
557 globalFrameToAlignFrame(0,1)<<
" "<<
558 globalFrameToAlignFrame(0,2));
560 globalFrameToAlignFrame(1,1)<<
" "<<
561 globalFrameToAlignFrame(1,2));
563 globalFrameToAlignFrame(2,1)<<
" "<<
564 globalFrameToAlignFrame(2,2));
569 globalToAlignFrameRotation(0,1)<<
" "<<
570 globalToAlignFrameRotation(0,2));
572 globalToAlignFrameRotation(1,1)<<
" "<<
573 globalToAlignFrameRotation(1,2));
575 globalToAlignFrameRotation(2,1)<<
" "<<
576 globalToAlignFrameRotation(2,2));
579 const int nAlignPar = alignPars->
size();
583 for(
int i(0); i<nAlignPar+3; ++i) derivatives[i].setZero();
587 for (; iatsos != alignTrack->
lastAtsos(); ++iatsos) {
594 int nResDim = alignTSOS->
nResDim();
595 if (alignTSOS->
module() != module) {
601 std::unique_ptr<std::vector<Amg::VectorX>> atsosDerivs;
602 std::unique_ptr<std::vector<Amg::VectorX>>atsosDerVtx;
604 atsosDerivs = std::make_unique<std::vector<Amg::VectorX>>(nResDim,
Amg::VectorX(nAlignPar));
605 atsosDerVtx = std::make_unique<std::vector<Amg::VectorX>>(nResDim,
Amg::VectorX(3));
606 ATH_MSG_DEBUG(
"nResDim = "<<nResDim<<
" vector size is "<<atsosDerivs->size());
607 ATH_MSG_DEBUG(
"nAlignPar = "<<nAlignPar<<
" CLHEP::HepVector size is "<<atsosDerivs->at(0).rows());
614 if (!mtp || !(mtp->covariance()) ){
622 localToGlobalRotation(0,1) <<
" " <<
623 localToGlobalRotation(0,2));
625 localToGlobalRotation(1,1) <<
" " <<
626 localToGlobalRotation(1,2));
628 localToGlobalRotation(2,1) <<
" " <<
629 localToGlobalRotation(2,2));
631 if(
double alphastrip=alignTSOS->
alphaStrip()) {
632 ATH_MSG_DEBUG(
"applying fanout rotation : " << alphastrip );
636 localToGlobalRotation(0,1) <<
" " <<
637 localToGlobalRotation(0,2));
639 localToGlobalRotation(1,1) <<
" " <<
640 localToGlobalRotation(1,2));
642 localToGlobalRotation(2,1) <<
" " <<
643 localToGlobalRotation(2,2));
680 ATH_MSG_DEBUG(
"trackdir " << trackdir[0] <<
" " << trackdir[1] <<
" " << trackdir[2]);
684 double cotphi_x = trackdir.x() / trackdir.z();
689 cotphi_x = trackdir.y() / trackdir.z();
692 double Rxx = R(0,0) - cotphi_x * R(0,2);
693 double Ryx = R(1,0) - cotphi_x * R(1,2);
694 double Rzx = R(2,0) - cotphi_x * R(2,2);
695 ATH_MSG_DEBUG(
"Rxx/Ryx/Rzx: " << Rxx <<
"/" << Ryx <<
"/" << Rzx);
731 const double z0z0 = 366.5*366.5;
738 Amg::Vector3D RxGlob=-1.0 * (globalToAlignFrameRotation.inverse() * RxLoc);
740 for (
int ipar=0; ipar<nAlignPar; ipar++) {
741 const AlignPar * alignPar = (*alignPars)[ipar];
745 derivatives[ipar][imeas] = projR[paramType];
747 (*atsosDerivs)[0][ipar] = projR[paramType];
750 for (
int ipar=0; ipar<3; ipar++) {
751 derivatives[nAlignPar+ipar][imeas] = RxGlob[ipar];
755 for (
int i=0;i<nAlignPar+3;i++)
756 ATH_MSG_DEBUG(
"derivatives["<<i<<
"]["<<imeas<<
"]="<<derivatives[i][imeas]);
763 double cotphi_y = trackdir.y() / trackdir.z() ;
764 double Rxy = R(0,1) - cotphi_y * R(0,2) ;
765 double Ryy = R(1,1) - cotphi_y * R(1,2) ;
766 double Rzy = R(2,1) - cotphi_y * R(2,2) ;
767 ATH_MSG_DEBUG(
"Rxy/Ryy/Rzy: " << Rxy <<
"/" << Ryy <<
"/" << Rzy);
784 Amg::Vector3D RyGlob=-1.0 * (globalToAlignFrameRotation.inverse() * RyLoc);
786 for (
int ipar=0; ipar<nAlignPar; ipar++) {
787 const AlignPar * alignPar = (*alignPars)[ipar];
789 ATH_MSG_DEBUG(
"2nd dim, ipar="<<ipar<<
", paramType="<<paramType);
791 derivatives[ipar][imeas] = projR[paramType];
793 (*atsosDerivs)[1][ipar] = projR[paramType];
797 for (
int ipar=0; ipar<3; ipar++) {
798 derivatives[nAlignPar+ipar][imeas] = RyGlob[ipar];
802 for (
int i=0;i<nAlignPar+3;i++)
803 ATH_MSG_DEBUG(
"2nd dim: derivatives["<<i<<
"]["<<imeas<<
"]="<<derivatives[i][imeas]);