Xmipp  v3.23.11-Nereus
Public Member Functions | Public Attributes | List of all members
TiltPairAligner Class Reference

#include <micrograph.h>

Collaboration diagram for TiltPairAligner:
Collaboration graph
[legend]

Public Member Functions

 TiltPairAligner ()
 Empty constructor. More...
 
void clear ()
 Clear set of coordinates. More...
 
void addCoordinatePair (int _muX, int _muY, int _mtX, int _mtY)
 Add coordinates pair. More...
 
void adjustPassingMatrix (int _muX, int _muY, int _mtX, int _mtY)
 Adjust passing matrix. More...
 
void calculatePassingMatrix ()
 Calculate passing matrix. More...
 
void passToTilted (int _muX, int _muY, int &_mtX, int &_mtY)
 Pass to tilted. More...
 
void passToUntilted (int _mtX, int _mtY, int &_muX, int &_muY)
 Pass to untilted. More...
 
void computeGamma ()
 Compute gamma. More...
 
void computeAngles (double &ualpha, double &talpha, double &ogamma)
 

Public Attributes

std::vector< int > coordU
 Untilted coordinates. More...
 
std::vector< int > coordT
 Tilted coordinates. More...
 
Matrix2D< double > Au
 
Matrix2D< double > Bt
 
Matrix2D< double > Put
 
Matrix2D< double > Ptu
 
int Nu
 
double gamma
 
double alpha_u
 
double alpha_t
 
Matrix1D< double > m
 Auxiliary vector. More...
 
Matrix2D< double > pair_E
 

Detailed Description

Class for aligning two tilted micrographs

Definition at line 548 of file micrograph.h.

Constructor & Destructor Documentation

◆ TiltPairAligner()

TiltPairAligner::TiltPairAligner ( )

Empty constructor.

Definition at line 593 of file micrograph.cpp.

594 {
595  clear();
596 }
void clear()
Clear set of coordinates.
Definition: micrograph.cpp:598

Member Function Documentation

◆ addCoordinatePair()

void TiltPairAligner::addCoordinatePair ( int  _muX,
int  _muY,
int  _mtX,
int  _mtY 
)

Add coordinates pair.

Definition at line 612 of file micrograph.cpp.

614 {
615  coordU.push_back(_muX);
616  coordU.push_back(_muY);
617  coordT.push_back(_mtX);
618  coordT.push_back(_mtY);
619  Nu++; // Number of particles
620 
621 #ifdef _DEBUG
622 
623  std::cout << "Adding point U(" << U.X << "," << U.Y << ") T(" << T.X << ","
624  << T.Y << ")\n";
625  std::cout << "A at input" << Au << "B at input" << Bt;
626 #endif
627  // Adjust untilted dependent matrix
628  MAT_ELEM(Au,0, 0) += _muX * _muX;
629  MAT_ELEM(Au,0, 1) += _muX * _muY;
630  MAT_ELEM(Au,0, 2) += _muX;
631  MAT_ELEM(Au,1, 0) = MAT_ELEM(Au,0, 1);
632  MAT_ELEM(Au,1, 1) += _muY * _muY;
633  MAT_ELEM(Au,1, 2) += _muY;
634  MAT_ELEM(Au,2, 0) = MAT_ELEM(Au,0, 2);
635  MAT_ELEM(Au,2, 1) = MAT_ELEM(Au,1, 2);
636  MAT_ELEM(Au,2, 2) = Nu;
637 
638  // Adjust tilted dependent matrix
639  MAT_ELEM(Bt,0, 0) += _mtX * _muX;
640  MAT_ELEM(Bt,0, 1) += _mtY * _muX;
641  MAT_ELEM(Bt,0, 2) = MAT_ELEM(Au,0, 2);
642  MAT_ELEM(Bt,1, 0) += _mtX * _muY;
643  MAT_ELEM(Bt,1, 1) += _mtY * _muY;
644  MAT_ELEM(Bt,1, 2) = MAT_ELEM(Au,1, 2);
645  MAT_ELEM(Bt,2, 0) += _mtX;
646  MAT_ELEM(Bt,2, 1) += _mtY;
647  MAT_ELEM(Bt,2, 2) = MAT_ELEM(Au,2, 2);
648 
649 #ifdef _DEBUG
650 
651  std::cout << "A at output" << Au << "B at output" << Bt;
652 #endif
653 
654 
655 }
#define MAT_ELEM(m, i, j)
Definition: matrix2d.h:116
Matrix2D< double > Bt
Definition: micrograph.h:587
std::vector< int > coordT
Tilted coordinates.
Definition: micrograph.h:554
Matrix2D< double > Au
Definition: micrograph.h:586
std::vector< int > coordU
Untilted coordinates.
Definition: micrograph.h:552

◆ adjustPassingMatrix()

void TiltPairAligner::adjustPassingMatrix ( int  _muX,
int  _muY,
int  _mtX,
int  _mtY 
)

Adjust passing matrix.

Definition at line 658 of file micrograph.cpp.

660 {
661  addCoordinatePair(_muX, _muY, _mtX, _mtY);
663 }
void addCoordinatePair(int _muX, int _muY, int _mtX, int _mtY)
Add coordinates pair.
Definition: micrograph.cpp:612
void calculatePassingMatrix()
Calculate passing matrix.
Definition: micrograph.cpp:665

◆ calculatePassingMatrix()

void TiltPairAligner::calculatePassingMatrix ( )

Calculate passing matrix.

Definition at line 665 of file micrograph.cpp.

666 {
667  if (Nu > 3)
668  {
669  solve(Au, Bt, Put);
670  Put = Put.transpose();
671  Ptu = Put.inv();
672  }
673 }
Matrix2D< double > Put
Definition: micrograph.h:588
void inv(Matrix2D< T > &result) const
Definition: matrix2d.cpp:663
Matrix2D< T > transpose() const
Definition: matrix2d.cpp:1314
void solve(const Matrix2D< T > &A, const Matrix2D< T > &b, Matrix2D< T > &result)
Matrix2D< double > Bt
Definition: micrograph.h:587
Matrix2D< double > Au
Definition: micrograph.h:586
Matrix2D< double > Ptu
Definition: micrograph.h:589

◆ clear()

void TiltPairAligner::clear ( )

Clear set of coordinates.

Definition at line 598 of file micrograph.cpp.

599 {
600  coordU.clear();
601  coordT.clear();
602  Au.clear();
603  Bt.clear();
604  Put.clear();
605  Ptu.clear();
606  Au.initZeros(3, 3);
607  Bt.initZeros(3, 3);
608  Nu = 0;
609  m.resizeNoCopy(3);
610 }
Matrix1D< double > m
Auxiliary vector.
Definition: micrograph.h:595
Matrix2D< double > Put
Definition: micrograph.h:588
void clear()
Definition: matrix2d.h:473
Matrix2D< double > Bt
Definition: micrograph.h:587
std::vector< int > coordT
Tilted coordinates.
Definition: micrograph.h:554
Matrix2D< double > Au
Definition: micrograph.h:586
std::vector< int > coordU
Untilted coordinates.
Definition: micrograph.h:552
Matrix2D< double > Ptu
Definition: micrograph.h:589
void initZeros()
Definition: matrix2d.h:626
void resizeNoCopy(int Xdim)
Definition: matrix1d.h:458

◆ computeAngles()

void TiltPairAligner::computeAngles ( double &  ualpha,
double &  talpha,
double &  ogamma 
)

Compute alphas. Make sure of calling computeGamma before calling this function.

Definition at line 802 of file micrograph.cpp.

803 {
804  alpha_u = alpha_t = 0;
805  Matrix1D<double> angles(3);
806  angles.initZeros();
807  double fitness;
808  int iter;
809 
810  // Coarse search
811  double *aux = angles.adaptForNumericalRecipes();
812  double best_alpha_u = 0;
813  double best_alpha_t = 0;
814  double best_fit = 1e8;
815  aux[3] = gamma;
816  for (aux[1] = 0; aux[1] < 180; aux[1] += 5)
817  for (aux[2] = 0; aux[2] < 180; aux[2] += 5)
818  {
819  double fit = matrix_fitness(aux, this);
820  if (fit < best_fit)
821  {
822  best_fit = fit;
823  best_alpha_u = aux[1];
824  best_alpha_t = aux[2];
825  }
826  }
827  angles.killAdaptationForNumericalRecipes(aux);
828  angles(0) = best_alpha_u;
829  angles(1) = best_alpha_t;
830  angles(2) = gamma;
831 
832  // Fine search
834  steps.initConstant(1);
835  powellOptimizer(angles, 1, 3, &matrix_fitness, this, 0.001, fitness, iter,
836  steps, false);
837  alpha_u = angles(0);
838  alpha_t = angles(1);
839  gamma = angles(2);
840 
841  ualpha = alpha_u;
842  talpha = alpha_t;
843  ogamma = gamma;
844 }
void powellOptimizer(Matrix1D< double > &p, int i0, int n, double(*f)(double *x, void *), void *prm, double ftol, double &fret, int &iter, const Matrix1D< double > &steps, bool show)
glob_prnt iter
double steps
double fitness(double *p)
double matrix_fitness(double *p, void *prm)
Definition: micrograph.cpp:785

◆ computeGamma()

void TiltPairAligner::computeGamma ( )

Compute gamma.

Definition at line 717 of file micrograph.cpp.

718 {
719 constexpr int TRIANGLE_NO = 15000;
720 constexpr int MIN_AREA = 15;
721 constexpr int MAX_AREA = 250000;
722  gamma = 0;
723  Matrix1D<int> iju(2); // From i to j in untilted
724  Matrix1D<int> iku(2); // From i to j in untilted
725  Matrix1D<int> ijt(2); // From i to j in untilted
726  Matrix1D<int> ikt(2); // From i to j in untilted
727  // From i to k in untilted
728  // From i to j in tilted
729  // From i to k in tilted
730  int triang = 0; // Number of triangles considered
731  int i;
732  int j;
733  int k;
734  int counter1;
735  counter1 = 0;
737  long noCombinations;
738  noCombinations = Nu * (Nu - 1) * (Nu - 2) / 6;
739  while (triang < TRIANGLE_NO && counter1 < noCombinations)
740  {
741  counter1++;
742  i = (int)round(rnd_unif(0, Nu - 1));
743  j = (int)round(rnd_unif(0, Nu - 1));
744  k = (int)round(rnd_unif(0, Nu - 1));
745 
746  // Compute area of triangle in untilted micrograph
747  VECTOR_R2(iju, coordU[j] - coordU[i], coordU[j+1] - coordU[i+1]);
748  VECTOR_R2(iku, coordU[k] - coordU[i], coordU[k+1] - coordU[i+1]);
749  double untilted_area = fabs(dotProduct(iju, iku)/*/2*/);
750  if (untilted_area < MIN_AREA
751  )
752  continue; // For numerical stability
753 
754  // Compute area of the same triangle in the tilted micrograph
755  VECTOR_R2(ijt, coordT[j] - coordT[i], coordT[j+1] - coordT[i+1]);
756  VECTOR_R2(ikt, coordT[k] - coordT[i], coordT[k+1] - coordT[i+1]);
757  double tilted_area = fabs(dotProduct(ijt, ikt)/*/2*/);
758  if (tilted_area < MIN_AREA
759  )
760  continue; // For numerical stability
761  if (tilted_area > MAX_AREA
762  )
763  continue; // micrograph are not perfect
764  // sheets so avoid
765  // very far away particles
766 
767  // Now we know that tilted_area=untilted_area*cos(gamma)
768  if (tilted_area > untilted_area)
769  continue; // There are user errors
770  // In the point selection
771  gamma += acos(tilted_area / untilted_area);
772  triang++;
773  }
774  if (0 == triang) {
775  REPORT_ERROR(ERR_NUMERICAL, "triang is zero (0), which would lead to division by zero");
776  }
777  gamma /= triang;
778  gamma = RAD2DEG(gamma);
779  if (triang < 100)
780  std::cout << "Not many particles, tilt angle may not be accurate"
781  << std::endl;
782 }
#define VECTOR_R2(v, x, y)
Definition: matrix1d.h:112
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
double rnd_unif()
std::vector< int > coordT
Tilted coordinates.
Definition: micrograph.h:554
Error related to numerical calculation.
Definition: xmipp_error.h:179
#define j
std::vector< int > coordU
Untilted coordinates.
Definition: micrograph.h:552
int round(double x)
Definition: ap.cpp:7245
T dotProduct(const Matrix1D< T > &v1, const Matrix1D< T > &v2)
Definition: matrix1d.h:1140
#define RAD2DEG(r)
Definition: xmipp_macros.h:320
unsigned int randomize_random_generator()

◆ passToTilted()

void TiltPairAligner::passToTilted ( int  _muX,
int  _muY,
int &  _mtX,
int &  _mtY 
)

Pass to tilted.

Definition at line 676 of file micrograph.cpp.

677 {
678 
679 
680  if (Nu > 3)
681  {
683  VECTOR_R3(m, _muX, _muY, 1);
684  M3x3_BY_V3x1(m, Put, m);
685 
686  _mtX = (int) XX(m);
687  _mtY = (int) YY(m);
688  }
689  else
690  {
691  _mtX = _muX;
692  _mtY = _muY;
693  }
694 
695 }
Matrix1D< double > m
Auxiliary vector.
Definition: micrograph.h:595
Matrix2D< double > Put
Definition: micrograph.h:588
#define XX(v)
Definition: matrix1d.h:85
#define M3x3_BY_V3x1(a, M, b)
Definition: matrix2d.h:170
#define YY(v)
Definition: matrix1d.h:93
#define VECTOR_R3(v, x, y, z)
Definition: matrix1d.h:124
#define SPEED_UP_temps012
Definition: xmipp_macros.h:403

◆ passToUntilted()

void TiltPairAligner::passToUntilted ( int  _mtX,
int  _mtY,
int &  _muX,
int &  _muY 
)

Pass to untilted.

Definition at line 698 of file micrograph.cpp.

699 {
700  if (Nu > 3)
701  {
703 
704  VECTOR_R3(m, _mtX, _mtY, 1);
705  M3x3_BY_V3x1(m, Ptu, m);
706  _muX = (int) XX(m);
707  _muY = (int) YY(m);
708  }
709  else
710  {
711  _muX = _mtX;
712  _muY = _mtY;
713  }
714 }
Matrix1D< double > m
Auxiliary vector.
Definition: micrograph.h:595
#define XX(v)
Definition: matrix1d.h:85
#define M3x3_BY_V3x1(a, M, b)
Definition: matrix2d.h:170
#define YY(v)
Definition: matrix1d.h:93
Matrix2D< double > Ptu
Definition: micrograph.h:589
#define VECTOR_R3(v, x, y, z)
Definition: matrix1d.h:124
#define SPEED_UP_temps012
Definition: xmipp_macros.h:403

Member Data Documentation

◆ alpha_t

double TiltPairAligner::alpha_t

Definition at line 593 of file micrograph.h.

◆ alpha_u

double TiltPairAligner::alpha_u

Definition at line 592 of file micrograph.h.

◆ Au

Matrix2D<double> TiltPairAligner::Au

Definition at line 586 of file micrograph.h.

◆ Bt

Matrix2D<double> TiltPairAligner::Bt

Definition at line 587 of file micrograph.h.

◆ coordT

std::vector<int> TiltPairAligner::coordT

Tilted coordinates.

Definition at line 554 of file micrograph.h.

◆ coordU

std::vector<int> TiltPairAligner::coordU

Untilted coordinates.

Definition at line 552 of file micrograph.h.

◆ gamma

double TiltPairAligner::gamma

Definition at line 591 of file micrograph.h.

◆ m

Matrix1D<double> TiltPairAligner::m

Auxiliary vector.

Definition at line 595 of file micrograph.h.

◆ Nu

int TiltPairAligner::Nu

Definition at line 590 of file micrograph.h.

◆ pair_E

Matrix2D<double> TiltPairAligner::pair_E

Definition at line 596 of file micrograph.h.

◆ Ptu

Matrix2D<double> TiltPairAligner::Ptu

Definition at line 589 of file micrograph.h.

◆ Put

Matrix2D<double> TiltPairAligner::Put

Definition at line 588 of file micrograph.h.


The documentation for this class was generated from the following files: