Xmipp  v3.23.11-Nereus
Functions
volume_initial_simulated_annealing.cpp File Reference
#include "volume_initial_simulated_annealing.h"
#include <data/filters.h>
Include dependency graph for volume_initial_simulated_annealing.cpp:

Go to the source code of this file.

Functions

void alignSingleImage (size_t nImg, ProgVolumeInitialSimulatedAnnealing &prm, MetaData &mdReconstruction, double &newCorr, double &improvementFraction)
 
void threadAlignSubset (ThreadArgument &thArg)
 

Function Documentation

◆ alignSingleImage()

void alignSingleImage ( size_t  nImg,
ProgVolumeInitialSimulatedAnnealing prm,
MetaData mdReconstruction,
double &  newCorr,
double &  improvementFraction 
)

Definition at line 90 of file volume_initial_simulated_annealing.cpp.

91 {
92  MultidimArray<double> mGalleryProjection, mCurrentImage, mCurrentImageAligned;
94 
95  mCurrentImage.aliasImageInStack(prm.inputImages(),nImg);
96  mCurrentImage.setXmippOrigin();
97 
98  MultidimArray<double> allCorrs;
99  allCorrs.resizeNoCopy(prm.mdGallery.size());
100 
101  size_t improvementCount=0;
102  double oldCorr=prm.mdInp[nImg].maxcc;
103 #ifdef DEBUG
104  FileName fnImg;
105  prm.mdIn.getValue(MDL_IMAGE,fnImg,id);
106  std::cout << "Image: " << fnImg << " oldCorr=" << oldCorr << std::endl;
107 #endif
108  std::vector< Matrix2D<double> > allM;
109  for (size_t nGallery=0; nGallery<XSIZE(allCorrs); ++nGallery)
110  {
111  mCurrentImageAligned=mCurrentImage;
112  mGalleryProjection.aliasImageInStack(prm.gallery(),nGallery);
113  mGalleryProjection.setXmippOrigin();
114  double corr=alignImagesConsideringMirrors(mGalleryProjection,mCurrentImageAligned,M,xmipp_transformation::DONT_WRAP);
115 #ifdef DEBUG
116  mdGallery.getValue(MDL_MAXCC,corr,__iter.objId);
117 #endif
118  A1D_ELEM(allCorrs,nGallery)=corr;
119  allM.push_back(M);
120  if (corr>oldCorr)
121  {
122  ++improvementCount;
123 #ifdef DEBUG
124  prm.mdGallery.getValue(MDL_IMAGE,fnImg,__iter.objId);
125  std::cout << " Matching Gallery: " << fnImg << " " << corr << std::endl;
126 #endif
127  }
128  }
129  improvementFraction=(double)improvementCount/NSIZE(prm.gallery());
130 #ifdef DEBUG
131  mdGallery.write("PPPgallery.xmd");
132  std::cout << " oldcorr=" << oldCorr << std::endl;
133 #endif
134 
135  MultidimArray<double> scaledCorrs;
136  allCorrs.cumlativeDensityFunction(scaledCorrs);
137  double bestCorr, bestAngleRot, bestAngleTilt, bestAnglePsi, bestShiftX, bestShiftY, bestWeight;
138  bool bestFlip;
139  bestCorr=-1;
140  double correctionFactor=1;
141  double currentT=prm.T0*(1.0-((double)prm.iter)/prm.NiterRandom);
142  double icurrentT=1.0/currentT;
143  for (size_t nGallery=0; nGallery<XSIZE(allCorrs); ++nGallery)
144  {
145  bool getThis=(A1D_ELEM(allCorrs,nGallery)>oldCorr) || (improvementCount==0 && A1D_ELEM(scaledCorrs,nGallery)>=0.98);
146  if (A1D_ELEM(allCorrs,nGallery)<oldCorr && !getThis && prm.iter<=prm.NiterRandom)
147  {
148  // Simulated annealing
149  double diff=oldCorr-A1D_ELEM(allCorrs,nGallery);
150  double p=rnd_unif();
151  getThis=(p<exp(-diff*icurrentT));
152  }
153  if (getThis)
154  {
155  bool flip;
156  double scale, shiftX, shiftY, anglePsi;
157  transformationMatrix2Parameters2D(allM[nGallery],flip,scale,shiftX,shiftY,anglePsi);
158  anglePsi*=-1;
159  double weight=A1D_ELEM(scaledCorrs,nGallery)*correctionFactor;
160  double corr=A1D_ELEM(allCorrs,nGallery);
161  double angleRot=prm.mdGallery[nGallery].rot;
162  double angleTilt=prm.mdGallery[nGallery].tilt;
163 #ifdef DEBUG
164  fnImg=prm.mdGallery[nGallery].fnImg;
165  std::cout << " Getting Gallery: " << fnImg << " corr=" << corr << " cdf=" << weight << " rot=" << angleRot
166  << " tilt=" << angleTilt << std::endl;
167 #endif
168 
169  if (prm.iter<=prm.NiterRandom)
170  {
171  size_t recId=mdReconstruction.addObject();
172  FileName fnImg;
173  fnImg=prm.mdInp[nImg].fnImg;
174  mdReconstruction.setValue(MDL_IMAGE,fnImg,recId);
175  mdReconstruction.setValue(MDL_ENABLED,1,recId);
176  mdReconstruction.setValue(MDL_MAXCC,corr,recId);
177  mdReconstruction.setValue(MDL_ANGLE_ROT,angleRot,recId);
178  mdReconstruction.setValue(MDL_ANGLE_TILT,angleTilt,recId);
179  mdReconstruction.setValue(MDL_ANGLE_PSI,anglePsi,recId);
180  mdReconstruction.setValue(MDL_SHIFT_X,shiftX,recId);
181  mdReconstruction.setValue(MDL_SHIFT_Y,shiftY,recId);
182  mdReconstruction.setValue(MDL_FLIP,flip,recId);
183  mdReconstruction.setValue(MDL_WEIGHT,weight,recId);
184  }
185  if (corr>bestCorr)
186  {
187  bestCorr=corr;
188  bestAngleRot=angleRot;
189  bestAngleTilt=angleTilt;
190  bestAnglePsi=anglePsi;
191  bestShiftX=shiftX;
192  bestShiftY=shiftY;
193  bestFlip=flip;
194  bestWeight=weight;
195  }
196  }
197 
198  ++nGallery;
199  }
200 
201  if (prm.iter>prm.NiterRandom)
202  {
203  size_t recId=mdReconstruction.addObject();
204  FileName fnImg;
205  fnImg=prm.mdInp[nImg].fnImg;
206  mdReconstruction.setValue(MDL_IMAGE,fnImg,recId);
207  mdReconstruction.setValue(MDL_ENABLED,1,recId);
208  mdReconstruction.setValue(MDL_MAXCC,bestCorr,recId);
209  mdReconstruction.setValue(MDL_ANGLE_ROT,bestAngleRot,recId);
210  mdReconstruction.setValue(MDL_ANGLE_TILT,bestAngleTilt,recId);
211  mdReconstruction.setValue(MDL_ANGLE_PSI,bestAnglePsi,recId);
212  mdReconstruction.setValue(MDL_SHIFT_X,bestShiftX,recId);
213  mdReconstruction.setValue(MDL_SHIFT_Y,bestShiftY,recId);
214  mdReconstruction.setValue(MDL_FLIP,bestFlip,recId);
215  mdReconstruction.setValue(MDL_WEIGHT,bestWeight,recId);
216  }
217  newCorr=bestCorr;
218 #ifdef DEBUG
219  mdReconstruction.write("PPPreconstruction.xmd");
220  std::cout << "Press any key" << std::endl;
221  char c;
222  std::cin >> c;
223 #endif
224 }
#define NSIZE(v)
Rotation angle of an image (double,degrees)
virtual size_t addObject()=0
void cumlativeDensityFunction(MultidimArray< double > &cdf)
void transformationMatrix2Parameters2D(const Matrix2D< T > &A, bool &flip, T &scale, T &shiftX, T &shiftY, T &psi)
doublereal * c
void resizeNoCopy(const MultidimArray< T1 > &v)
void aliasImageInStack(const MultidimArray< T > &m, size_t select_image)
bool getValue(MDObject &mdValueOut, size_t id) const override
virtual void write(const FileName &outFile, WriteModeMetaData mode=MD_OVERWRITE) const =0
Tilting angle of an image (double,degrees)
Shift for the image in the X axis (double)
#define A1D_ELEM(v, i)
Special label to be used when gathering MDs in MpiMetadataPrograms.
Is this image enabled? (int [-1 or 1])
double rnd_unif()
Flip the image? (bool)
#define XSIZE(v)
Maximum cross-correlation for the image (double)
bool setValue(const MDLabel label, const T &valueIn, size_t id)
Shift for the image in the Y axis (double)
double alignImagesConsideringMirrors(const MultidimArray< double > &Iref, const AlignmentTransforms &IrefTransforms, MultidimArray< double > &I, Matrix2D< double > &M, AlignmentAux &aux, CorrelationAux &aux2, RotationalCorrelationAux &aux3, bool wrap, const MultidimArray< int > *mask)
Definition: filters.cpp:2150
Name of an image (std::string)
< Score 4 for volumes

◆ threadAlignSubset()

void threadAlignSubset ( ThreadArgument thArg)

Definition at line 228 of file volume_initial_simulated_annealing.cpp.

229 {
232 
233  results.sumCorr=results.sumImprovement=0.0;
234  results.mdReconstruction.clear();
235  auto nMax=(int)prm.mdInp.size();
236  for (int nImg=0; nImg<nMax; ++nImg)
237  {
238  if ((nImg+1)%prm.Nthr==thArg.thread_id)
239  {
240  double corr, improvement;
241  alignSingleImage(nImg, prm, results.mdReconstruction, corr, improvement);
242  results.sumCorr+=corr;
243  results.sumImprovement+=improvement;
244  prm.mdInp[nImg].maxcc=corr;
245  }
246 
247  if (thArg.thread_id==0)
248  progress_bar(nImg+1);
249  }
250 
251  // Update all MAXCC
252  prm.mutexMaxCC.lock();
253 
255  prm.sumCorr+=results.sumCorr;
256  prm.sumImprovement+=results.sumImprovement;
257 
258  prm.mutexMaxCC.unlock();
259 }
void progress_bar(long rlen)
void clear() override
Definition: metadata_db.cpp:54
void * workClass
The class in which threads will be working.
int thread_id
The thread id.
virtual void unlock()
void unionAll(const MetaDataDb &mdIn)
ProgClassifyCL2D * prm
virtual void lock()
void alignSingleImage(size_t nImg, ProgVolumeInitialSimulatedAnnealing &prm, MetaData &mdReconstruction, double &newCorr, double &improvementFraction)