Xmipp  v3.23.11-Nereus
xmipp_gpu_correlation.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  *
3  * Authors: Amaya Jimenez ajimenez@cnb.csic.es (2017)
4  *
5  * Unidad de Bioinformatica of Centro Nacional de Biotecnologia , CSIC
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20  * 02111-1307 USA
21  *
22  * All comments concerning this program package may be sent to the
23  * e-mail address 'xmipp@cnb.csic.es'
24  ***************************************************************************/
25 
26 #include "xmipp_gpu_correlation.h"
27 
28 #include <core/xmipp_image.h>
29 #include <data/mask.h>
30 #include <core/xmipp_fftw.h>
31 #include <core/transformations.h>
33 #include <data/filters.h>
34 #include <core/xmipp_funcs.h>
35 //#include <core/xmipp_threads.h>
36 
37 #include "xmipp_gpu_utils.h"
39 
40 #include <algorithm>
41 #include <math.h>
42 #include <time.h>
43 #include <sys/time.h>
44 
45 
46 
47 
48 // A function to print all prime factors of a given number n
49 void primeFactors(int n, int *out)
50 {
51  int n_orig = n;
52  // Print the number of 2s that divide n
53  while (n%2 == 0)
54  {
55  //printf("%d ", 2);
56  out[0]++;
57  n = n/2;
58  }
59 
60  // n must be odd at this point. So we can skip
61  // one element (Note i = i +2)
62  for (int i = 3; i <= sqrt(n_orig); i = i+2)
63  {
64  // While i divides n, print i and divide n
65  while (n%i == 0)
66  {
67  //printf("%d ", i);
68  if (i==3)
69  out[1]++;
70  else if (i==5)
71  out[2]++;
72  else if (i==7)
73  out[3]++;
74  else if(i>7)
75  out[4]++;
76 
77  n = n/i;
78  }
79  }
80 
81  // This condition is to handle the case when n
82  // is a prime number greater than 2
83  if (n > 2){
84  //printf ("%d ", n);
85  out[4]++;
86  }
87 }
88 
89 
90 void preprocess_images_reference(MetaDataVec &SF, int firstIdx, int numImages, Mask &mask, GpuCorrelationAux &d_correlationAux,
91  mycufftHandle &myhandlePadded, mycufftHandle &myhandleMask, mycufftHandle &myhandlePolar,
92  StructuresAux &myStructureAux, MetaDataVec::id_iterator iter, myStreamHandle myStream)
93 {
94  size_t Xdim, Ydim, Zdim, Ndim;
95  getImageSize(SF,Xdim,Ydim,Zdim,Ndim);
96  size_t pad_Xdim=d_correlationAux.Xdim;
97  size_t pad_Ydim=d_correlationAux.Ydim;
98 
99  FileName fnImg;
100  Image<float> Iref;
101  size_t radius = d_correlationAux.YdimPolar;
102  size_t angles = d_correlationAux.XdimPolar;
103 
104  GpuMultidimArrayAtCpu<float> original_image_stack_ref(Xdim,Ydim,1,numImages);
105 
106  size_t n=0;
107  for(int i=firstIdx; i<firstIdx+numImages; i++){
108 
109  SF.getValue(MDL_IMAGE,fnImg,*iter);
110  //std::cerr << iter->objId << ". Image: " << fnImg << std::endl;
111  Iref.read(fnImg);
112  original_image_stack_ref.fillImage(n,Iref()/8);
113 
114  if(iter != SF.ids().end())
115  ++iter;
116 
117  n++;
118  }
119 
120  GpuMultidimArrayAtGpu<float> image_stack_gpu(Xdim,Ydim,1,numImages);
121  original_image_stack_ref.copyToGpu(image_stack_gpu, myStream);
122 
123  MultidimArray<int> maskArray = mask.get_binary_mask();
124  MultidimArray<float> dMask;
125  typeCast(maskArray, dMask);
126  d_correlationAux.d_mask.resize(Xdim, Ydim, Zdim, 1);
127  float *mask_aux;
128  cpuMalloc((void**)&mask_aux, sizeof(float)*Xdim*Ydim*Zdim);
129  memcpy(mask_aux, MULTIDIM_ARRAY(dMask), sizeof(float)*Xdim*Ydim*Zdim);
130  d_correlationAux.d_mask.copyToGpuStream(mask_aux, myStream);
131 
132  padding_masking(image_stack_gpu, d_correlationAux.d_mask, myStructureAux.padded_image_gpu, myStructureAux.padded_image2_gpu,
133  myStructureAux.padded_mask_gpu, false, myStream);
134 
136 
137  myStructureAux.padded_image_gpu.fftStream(d_correlationAux.d_projFFT, myhandlePadded, myStream, false, dull);
138 
139  myStructureAux.padded_image2_gpu.fftStream(d_correlationAux.d_projSquaredFFT, myhandlePadded, myStream, false, dull);
140  myStructureAux.padded_mask_gpu.fftStream(d_correlationAux.d_maskFFT, myhandleMask, myStream, false, dull);
141 
142  //Polar transform of the projected images
143  cuda_cart2polar(image_stack_gpu, myStructureAux.polar_gpu, myStructureAux.polar2_gpu, false, myStream);
144 
145  myStructureAux.polar_gpu.fftStream(d_correlationAux.d_projPolarFFT, myhandlePolar, myStream, false, dull);
146 
147  myStructureAux.polar2_gpu.fftStream(d_correlationAux.d_projPolarSquaredFFT, myhandlePolar, myStream, false, dull);
148 }
149 
150 
151 
153  GpuMultidimArrayAtGpu< std::complex<float> > &d_maskFFT, GpuCorrelationAux &d_correlationAux, bool rotation,
154  int firstStep, bool mirror, mycufftHandle &myhandlePadded, mycufftHandle &myhandlePolar,
155  StructuresAux &myStructureAux, myStreamHandle myStream)
156 {
157  size_t Xdim, Ydim, Zdim, Ndim;
158  getImageSize(SF,Xdim,Ydim,Zdim,Ndim);
159  size_t pad_Xdim=d_correlationAux.Xdim;
160  size_t pad_Ydim=d_correlationAux.Ydim;
161  size_t radius=d_correlationAux.YdimPolar;
162  size_t angles = d_correlationAux.XdimPolar;
163 
164  GpuMultidimArrayAtCpu<float> original_image_stack(Xdim,Ydim,1,numImagesRef);
165 
167 
168  if(firstStep==0){
169 
170  Image<float> Iref;
171 
172  Iref.read(fnImg);
173 
174  //AJ mirror of the image
175  if(mirror)
176  Iref().selfReverseX();
177  //END AJ mirror
178 
179  for(size_t i=0; i<numImagesRef; i++)
180  original_image_stack.fillImage(i,Iref()/8);
181 
182  }
183 
184  original_image_stack.copyToGpu(d_correlationAux.d_original_image, myStream);
185 
186  if(!rotation){
187  padding_masking(d_correlationAux.d_original_image, mask, myStructureAux.padded_image_gpu, myStructureAux.padded_image2_gpu,
188  myStructureAux.padded_mask_gpu, true, myStream);
189 
190  myStructureAux.padded_image_gpu.fftStream(d_correlationAux.d_projFFT, myhandlePadded, myStream, false, dull);
191 
192  myStructureAux.padded_image2_gpu.fftStream(d_correlationAux.d_projSquaredFFT, myhandlePadded, myStream, false, dull);
193  d_maskFFT.copyGpuToGpuStream(d_correlationAux.d_maskFFT, myStream);
194 
195  }
196 
197  if(rotation){
198  cuda_cart2polar(d_correlationAux.d_original_image, myStructureAux.polar_gpu, myStructureAux.polar2_gpu, true, myStream);
199  myStructureAux.polar_gpu.fftStream(d_correlationAux.d_projPolarFFT, myhandlePolar, myStream, false, dull);
200  myStructureAux.polar2_gpu.fftStream(d_correlationAux.d_projPolarSquaredFFT, myhandlePolar, myStream, false, dull);
201  }
202 
203 }
204 
205 
206 
208  GpuMultidimArrayAtGpu< std::complex<float> > &d_maskFFT,
209  GpuCorrelationAux &d_correlationAuxTR, GpuCorrelationAux &d_correlationAuxRT,
210  int firstStep, bool mirror,
211  mycufftHandle &myhandlePaddedTR, mycufftHandle &myhandleMaskTR,
212  mycufftHandle &myhandlePolarRT,
213  StructuresAux &myStructureAuxTR, StructuresAux &myStructureAuxRT,
214  myStreamHandle &myStreamTR, myStreamHandle &myStreamRT,
215  GpuMultidimArrayAtCpu<float> &original_image_stack)
216 {
217 
218 
219  size_t Xdim, Ydim, Zdim, Ndim;
220  getImageSize(SF,Xdim,Ydim,Zdim,Ndim);
221  size_t pad_Xdim=d_correlationAuxTR.Xdim;
222  size_t pad_Ydim=d_correlationAuxTR.Ydim;
223  size_t radius=d_correlationAuxTR.YdimPolar;
224  size_t angles = d_correlationAuxTR.XdimPolar;
225 
226  original_image_stack.resize(Xdim,Ydim,1,numImagesRef);
227 
228  if(firstStep==0){
229 
230  Image<float> Iref;
231 
232  Iref.read(fnImg);
233 
234  //AJ mirror of the image
235  if(mirror)
236  Iref().selfReverseX();
237  //END AJ mirror
238 
239  for(size_t i=0; i<numImagesRef; i++)
240  original_image_stack.fillImage(i,Iref()/8);
241 
242  }
243 
244  d_correlationAuxTR.d_original_image.resize(Xdim,Ydim,1,numImagesRef);
245  d_correlationAuxRT.d_original_image.resize(Xdim,Ydim,1,numImagesRef);
246  d_correlationAuxTR.d_projFFT.resize((pad_Xdim/2)+1, pad_Ydim, 1, numImagesRef);
247  d_correlationAuxTR.d_projSquaredFFT.resize((pad_Xdim/2)+1, pad_Ydim, 1, numImagesRef);
248  d_correlationAuxRT.d_projPolarFFT.resize((angles/2)+1, radius, 1, numImagesRef);
249  d_correlationAuxRT.d_projPolarSquaredFFT.resize((angles/2)+1, radius, 1, numImagesRef);
250  d_correlationAuxTR.d_maskFFT.resize(d_maskFFT);
251 
252  original_image_stack.copyToGpu(d_correlationAuxTR.d_original_image, myStreamTR);
253 
254  padding_masking(d_correlationAuxTR.d_original_image, mask, myStructureAuxTR.padded_image_gpu, myStructureAuxTR.padded_image2_gpu,
255  myStructureAuxTR.padded_mask_gpu, true, myStreamTR);
256 
257  original_image_stack.copyToGpu(d_correlationAuxRT.d_original_image, myStreamRT);
258 
259  cuda_cart2polar(d_correlationAuxRT.d_original_image, myStructureAuxRT.polar_gpu, myStructureAuxRT.polar2_gpu, true, myStreamRT);
260 
261 
263 
264  myStructureAuxTR.padded_image_gpu.fftStream(d_correlationAuxTR.d_projFFT, myhandlePaddedTR, myStreamTR, false, dull);
265 
266  myStructureAuxTR.padded_image2_gpu.fftStream(d_correlationAuxTR.d_projSquaredFFT, myhandlePaddedTR, myStreamTR, false, dull);
267  d_maskFFT.copyGpuToGpuStream(d_correlationAuxTR.d_maskFFT, myStreamTR);
268 
269  myStructureAuxRT.polar_gpu.fftStream(d_correlationAuxRT.d_projPolarFFT, myhandlePolarRT, myStreamRT, false, dull);
270  myStructureAuxRT.polar2_gpu.fftStream(d_correlationAuxRT.d_projPolarSquaredFFT, myhandlePolarRT, myStreamRT, false, dull);
271 
272 }
273 
274 
275 
277  GpuMultidimArrayAtGpu< std::complex<float> > &d_maskFFT,
278  GpuCorrelationAux &d_correlationAuxOne, GpuCorrelationAux &d_correlationAuxTwo,
279  mycufftHandle &myhandlePaddedOne,
280  mycufftHandle &myhandlePolarTwo,
281  StructuresAux &myStructureAuxOne, StructuresAux &myStructureAuxTwo,
282  myStreamHandle &myStreamOne, myStreamHandle &myStreamTwo, int step)
283 {
284 
285  size_t Xdim = d_correlationAuxOne.d_transform_image.Xdim;
286  size_t Ydim = d_correlationAuxOne.d_transform_image.Ydim;
287  size_t Zdim = d_correlationAuxOne.d_transform_image.Zdim;
288  size_t Ndim = d_correlationAuxOne.d_transform_image.Ndim;
289  size_t pad_Xdim=d_correlationAuxOne.Xdim;
290  size_t pad_Ydim=d_correlationAuxOne.Ydim;
291  size_t radius=d_correlationAuxOne.YdimPolar;
292  size_t angles = d_correlationAuxOne.XdimPolar;
293 
294  d_correlationAuxOne.d_projFFT.resize((pad_Xdim/2)+1, pad_Ydim, 1, numImagesRef);
295  d_correlationAuxOne.d_projSquaredFFT.resize((pad_Xdim/2)+1, pad_Ydim, 1, numImagesRef);
296  d_correlationAuxTwo.d_projPolarFFT.resize((angles/2)+1, radius, 1, numImagesRef);
297  d_correlationAuxTwo.d_projPolarSquaredFFT.resize((angles/2)+1, radius, 1, numImagesRef);
298  d_correlationAuxOne.d_maskFFT.resize(d_maskFFT);
299 
300 
301  padding_masking(d_correlationAuxOne.d_transform_image, mask, myStructureAuxOne.padded_image_gpu, myStructureAuxOne.padded_image2_gpu,
302  myStructureAuxOne.padded_mask_gpu, true, myStreamOne);
303 
304  cuda_cart2polar(d_correlationAuxTwo.d_transform_image, myStructureAuxTwo.polar_gpu, myStructureAuxTwo.polar2_gpu, true, myStreamTwo);
305 
307  myStructureAuxOne.padded_image_gpu.fftStream(d_correlationAuxOne.d_projFFT, myhandlePaddedOne, myStreamOne, false, dull);
308  myStructureAuxOne.padded_image2_gpu.fftStream(d_correlationAuxOne.d_projSquaredFFT, myhandlePaddedOne, myStreamOne, false, dull);
309  d_maskFFT.copyGpuToGpuStream(d_correlationAuxOne.d_maskFFT, myStreamOne);
310 
311  myStructureAuxTwo.polar_gpu.fftStream(d_correlationAuxTwo.d_projPolarFFT, myhandlePolarTwo, myStreamTwo, false, dull);
312  myStructureAuxTwo.polar2_gpu.fftStream(d_correlationAuxTwo.d_projPolarSquaredFFT, myhandlePolarTwo, myStreamTwo, false, dull);
313 
314 }
315 
316 
318  GpuMultidimArrayAtGpu< std::complex<float> > &d_maskFFT, bool rotation, mycufftHandle &myhandlePadded,
319  mycufftHandle &myhandlePolar, StructuresAux &myStructureAux, myStreamHandle myStream)
320 {
321 
322  size_t Xdim = d_correlationAux.d_transform_image.Xdim;
323  size_t Ydim = d_correlationAux.d_transform_image.Ydim;
324  size_t Zdim = d_correlationAux.d_transform_image.Zdim;
325  size_t Ndim = d_correlationAux.d_transform_image.Ndim;
326  size_t pad_Xdim=d_correlationAux.Xdim;
327  size_t pad_Ydim=d_correlationAux.Ydim;
328  size_t radius=d_correlationAux.YdimPolar;
329  size_t angles = d_correlationAux.XdimPolar;
330 
332 
333  if(!rotation){
334  padding_masking(d_correlationAux.d_transform_image, mask, myStructureAux.padded_image_gpu, myStructureAux.padded_image2_gpu,
335  myStructureAux.padded_mask_gpu, true, myStream);
336 
337  myStructureAux.padded_image_gpu.fftStream(d_correlationAux.d_projFFT, myhandlePadded, myStream, false, dull);
338 
339  myStructureAux.padded_image2_gpu.fftStream(d_correlationAux.d_projSquaredFFT, myhandlePadded, myStream, false, dull);
340  d_maskFFT.copyGpuToGpuStream(d_correlationAux.d_maskFFT, myStream);
341 
342  }
343 
344  //Polar transform of the projected images
345  if(rotation){
346  cuda_cart2polar(d_correlationAux.d_transform_image, myStructureAux.polar_gpu, myStructureAux.polar2_gpu, true, myStream);
347  myStructureAux.polar_gpu.fftStream(d_correlationAux.d_projPolarFFT, myhandlePolar, myStream, false, dull);
348  myStructureAux.polar2_gpu.fftStream(d_correlationAux.d_projPolarSquaredFFT, myhandlePolar, myStream, false, dull);
349 
350  }
351 
352 
353 }
354 
355 void align_experimental_image(FileName &fnImgExp, GpuCorrelationAux &d_referenceAux,
356  GpuCorrelationAux &d_experimentalAuxTR, GpuCorrelationAux &d_experimentalAuxRT,
357  TransformMatrix<float> &transMat_tr, TransformMatrix<float> &transMat_rt, float *max_vector_tr, float *max_vector_rt,
358  MetaDataVec &SFexp, int available_images_proj, bool mirror, int maxShift,
359  mycufftHandle &myhandlePadded_tr, mycufftHandle &myhandleMask_tr, mycufftHandle &myhandlePolar_tr,
360  mycufftHandle &myhandlePaddedB_tr, mycufftHandle &myhandleMaskB_tr, mycufftHandle &myhandlePolarB_tr,
361  mycufftHandle &myhandlePadded_rt, mycufftHandle &myhandleMask_rt, mycufftHandle &myhandlePolar_rt,
362  mycufftHandle &myhandlePaddedB_rt, mycufftHandle &myhandleMaskB_rt, mycufftHandle &myhandlePolarB_rt,
363  StructuresAux &myStructureAux_tr, StructuresAux &myStructureAux_rt,
364  myStreamHandle &myStreamTR, myStreamHandle &myStreamRT,
365  TransformMatrix<float> &resultTR, TransformMatrix<float> &resultRT,
366  GpuMultidimArrayAtCpu<float> &original_image_stack, mycufftHandle &ifftcb)
367 {
368 
369  bool rotation;
370 
372  //FIRST PART FOR TRTRTRT
373 
374  int max_step;
375  rotation = false;
376  //max_vector = max_vector_tr;
377  max_step=7;
378 
379 
380  preprocess_images_experimental_two(SFexp, fnImgExp, available_images_proj, d_referenceAux.d_mask,
381  d_referenceAux.d_maskFFT, d_experimentalAuxTR, d_experimentalAuxRT, 0, mirror,
382  myhandlePadded_tr,
383  myhandleMask_rt, myhandlePolar_rt,
384  myStructureAux_tr, myStructureAux_rt, myStreamTR, myStreamRT, original_image_stack);
385 
386  d_experimentalAuxTR.maskCount=d_referenceAux.maskCount;
387  d_experimentalAuxTR.produceSideInfo(myhandlePaddedB_tr, myhandleMaskB_tr, myStructureAux_tr,
388  d_referenceAux.maskAutocorrelation, myStreamTR);
389 
390  d_experimentalAuxTR.d_transform_image.resize(d_experimentalAuxTR.d_original_image);
391  d_experimentalAuxRT.d_transform_image.resize(d_experimentalAuxRT.d_original_image);
392 
393  //transMat = &transMat_tr;
394 
395  for(int step=0; step<6; step++){
396 
397  bool saveMaxVector = false;
398  if(step==5)
399  saveMaxVector = true;
400 
401  if(step%2==0){
402 
403  //FIRST TRANSLATION AND SECOND ROTATION
404  //CORRELATION PART
405  //TRANSFORMATION MATRIX CALCULATION
406  cuda_calculate_correlation_two(d_referenceAux, d_experimentalAuxTR,
407  transMat_tr, max_vector_tr, maxShift,
408  myhandlePaddedB_tr, mirror, myStructureAux_tr,
409  myStreamTR,
410  d_experimentalAuxRT, transMat_rt,
411  max_vector_rt, myhandlePolarB_rt,
412  myStructureAux_rt, myStreamRT,
413  resultTR, resultRT, ifftcb, saveMaxVector);
414 
415  //APPLY TRANSFORMATION
416  apply_transform(d_experimentalAuxTR.d_original_image, d_experimentalAuxTR.d_transform_image, transMat_tr, myStreamTR);
417 
418  apply_transform(d_experimentalAuxRT.d_original_image, d_experimentalAuxRT.d_transform_image, transMat_rt, myStreamRT);
419 
420  //PREPROCESS TO PREPARE DATA TO THE NEXT STEP
421  preprocess_images_experimental_transform_two(SFexp, fnImgExp, available_images_proj, d_referenceAux.d_mask,
422  d_referenceAux.d_maskFFT, d_experimentalAuxRT, d_experimentalAuxTR,
423  myhandlePadded_rt,
424  myhandlePolar_tr,
425  myStructureAux_rt, myStructureAux_tr, myStreamRT, myStreamTR, 1);
426 
427  d_experimentalAuxRT.maskCount=d_referenceAux.maskCount;
428  d_experimentalAuxRT.produceSideInfo(myhandlePaddedB_rt, myhandleMaskB_rt, myStructureAux_rt,
429  d_referenceAux.maskAutocorrelation, myStreamRT);
430 
431  }
432  else{
433 
434  //FIRST ROTATION AND SECOND TRANSLATION
435  //CORRELATION PART
436  //TRANSFORMATION MATRIX CALCULATION
437  cuda_calculate_correlation_two(d_referenceAux, d_experimentalAuxRT,
438  transMat_rt, max_vector_rt, maxShift,
439  myhandlePaddedB_rt, mirror, myStructureAux_rt,
440  myStreamRT,
441  d_experimentalAuxTR, transMat_tr,
442  max_vector_tr, myhandlePolarB_tr,
443  myStructureAux_tr, myStreamTR,
444  resultRT, resultTR, ifftcb, saveMaxVector);
445 
446 
447  if(step < 5){
448 
449  //APPLY TRANSFORMATION
450  apply_transform(d_experimentalAuxRT.d_original_image, d_experimentalAuxRT.d_transform_image, transMat_rt, myStreamRT);
451 
452  apply_transform(d_experimentalAuxTR.d_original_image, d_experimentalAuxTR.d_transform_image, transMat_tr, myStreamTR);
453 
454  //PREPROCESS TO PREPARE DATA TO THE NEXT STEP
455  preprocess_images_experimental_transform_two(SFexp, fnImgExp, available_images_proj, d_referenceAux.d_mask,
456  d_referenceAux.d_maskFFT, d_experimentalAuxTR, d_experimentalAuxRT,
457  myhandlePadded_tr,
458  myhandlePolar_rt,
459  myStructureAux_tr, myStructureAux_rt, myStreamTR, myStreamRT, 2);
460 
461  d_experimentalAuxTR.maskCount=d_referenceAux.maskCount;
462  d_experimentalAuxTR.produceSideInfo(myhandlePaddedB_tr, myhandleMaskB_tr, myStructureAux_tr,
463  d_referenceAux.maskAutocorrelation, myStreamTR);
464 
465  }else if(step==5){
466 
467  //APPLY TRANSFORMATION
468  d_experimentalAuxTR.d_transform_image.resize(d_experimentalAuxTR.d_original_image);
469  apply_transform(d_experimentalAuxTR.d_original_image, d_experimentalAuxTR.d_transform_image, transMat_tr, myStreamTR);
470 
471  //PREPROCESS TO PREPARE DATA TO THE NEXT STEP
472  preprocess_images_experimental_transform(d_experimentalAuxTR, d_referenceAux.d_mask, d_referenceAux.d_maskFFT, false,
473  myhandlePadded_tr, myhandlePolar_tr, myStructureAux_tr, myStreamTR);
474  d_experimentalAuxTR.maskCount=d_referenceAux.maskCount;
475  d_experimentalAuxTR.produceSideInfo(myhandlePaddedB_tr, myhandleMaskB_tr, myStructureAux_tr,
476  d_referenceAux.maskAutocorrelation, myStreamTR);
477 
478  //CORRELATION PART
479  //TRANSFORMATION MATRIX CALCULATION
480  cuda_calculate_correlation(d_referenceAux, d_experimentalAuxTR, transMat_tr, max_vector_tr, maxShift, myhandlePaddedB_tr,
481  mirror, myStructureAux_tr, myStreamTR, resultTR, saveMaxVector);
482 
483  }
484 
485  }
486 
487  }
488 
489 }
490 
491 
492 
493 // Read arguments ==========================================================
495 {
496 
497  fn_ref = getParam("-i_ref");
498  fn_exp = getParam("-i_exp");
499  fn_out = getParam("-o");
500  generate_out = checkParam("--classify");
501  fn_classes_out = getParam("--classify");
502  significance = checkParam("--significance");
503  simplifiedMd = checkParam("--simplifiedMd");
504  if(significance){
505  alpha=getDoubleParam("--significance");
506  keepN=false;
507  }
508  if(checkParam("--keep_best") && !significance){
509  keepN=true;
510  n_keep=getIntParam("--keep_best");
511  }
512  if(!keepN && !significance){
513  keepN=true;
514  n_keep=getIntParam("--keep_best");
515  }
516  fnDir = getParam("--odir");
517  maxShift = getIntParam("--maxShift");
518  sizePad = getIntParam("--sizePad");
519  int device = getIntParam("--device");
520  gpu = GPU(device);
521 
522 }
523 
524 // Show ====================================================================
525 
527 {
528  std::cout
529  << "Input projected: " << fn_ref << std::endl
530  << "Input experimental: " << fn_exp << std::endl
531  << "Generate output images (y/n): " << generate_out << std::endl
532  ;
533 }
534 
535 // usage ===================================================================
537 {
538 
539  addParamsLine(" -i_ref <md_ref_file> : Metadata file with input reference images");
540  addParamsLine(" -i_exp <md_exp_file> : Metadata file with input experimental images");
541  addParamsLine(" -o <md_out> : Output metadata file");
542  addParamsLine(" [--classify <md_classes_out=\"output_classes.xmd\">] : To generate the aligned output images and write the associated metadata");
543  addParamsLine(" [--keep_best <N=2>] : To keep N aligned images with the highest correlation");
544  addParamsLine(" [--significance <alpha=0.2>] : To use significance with the indicated value");
545  addParamsLine(" [--odir <outputDir=\".\">] : Output directory to save the aligned images");
546  addParamsLine(" [--maxShift <s=10>] : Maximum shift allowed (+-this amount)");
547  addParamsLine(" [--simplifiedMd <b=false>] : To generate a simplified metadata with only the maximum weight image stores");
548  addParamsLine(" [--sizePad <pad=100>] ");
549  addParamsLine(" [--device <dev=0>] : GPU device to use. 0th by default");
550  addUsageLine("Computes the correlation between a set of experimental images with respect "
551  "to a set of reference images with CUDA in GPU");
552 
553 }
554 
555 int check_gpu_memory(size_t Xdim, size_t Ydim, int percent){
556  float data[3]={0, 0, 0};
557  cuda_check_gpu_memory(data);
558  int bytes = 8*(2*((2*Xdim)-1)*((2*Ydim)-1) + 2*(360*(Xdim/2)));
559  return (int)((data[1]*percent/100)/bytes);
560 }
561 
562 
563 void calculate_weights(MultidimArray<float> &matrixCorrCpu, MultidimArray<float> &matrixCorrCpu_mirror, MultidimArray<float> &corrTotalRow,
564  MultidimArray<float> &weights, int Nref, size_t mdExpSize, size_t mdInSize, MultidimArray<float> &weightsMax, bool simplifiedMd,
565  MultidimArray<float> *matrixTransCpu, MultidimArray<float> *matrixTransCpu_mirror, int maxShift){
566 
567  MultidimArray<float> colAux;
568  for(int i=0; i<2*mdInSize; i++){
569  if(i<mdInSize){
570  matrixCorrCpu.getRow(i,colAux); //col
571  corrTotalRow.setCol(i, colAux);
572  }else{
573  matrixCorrCpu_mirror.getRow(i-mdInSize,colAux); //col
574  corrTotalRow.setCol(i, colAux);
575  }
576  }
577  MultidimArray<float> corrTotalCol(1,1,2*mdExpSize, mdInSize);
578  MultidimArray<float> rowAux;
579  for(int i=0; i<2*mdExpSize; i++){
580  if(i<mdExpSize){
581  matrixCorrCpu.getCol(i,rowAux); //row
582  corrTotalCol.setRow(i, rowAux);
583  }else{
584  matrixCorrCpu_mirror.getCol(i-mdExpSize,rowAux); //row
585  corrTotalCol.setRow(i, rowAux);
586  }
587  }
588 
589  //Order the correlation matrix by rows and columns
590  MultidimArray<float> rowCorr;
591  MultidimArray<int> rowIndexOrder;
592  MultidimArray<int> corrOrderByRowIndex(1,1,mdExpSize, 2*mdInSize);
593 
594  MultidimArray<float> colCorr;
595  MultidimArray<int> colIndexOrder;
596  MultidimArray<int> corrOrderByColIndex(1,1,2*mdExpSize, mdInSize);
597 
598  for (size_t i=0; i<mdExpSize; i++){
599  corrTotalRow.getRow(i, rowCorr);
600  rowCorr.indexSort(rowIndexOrder);
601  corrOrderByRowIndex.setRow(i, rowIndexOrder);
602  }
603  for (size_t i=0; i<mdInSize; i++){
604  corrTotalCol.getCol(i, colCorr);
605  colCorr.indexSort(colIndexOrder);
606  corrOrderByColIndex.setCol(i, colIndexOrder);
607  }
608  corrOrderByRowIndex.selfReverseX();
609  corrOrderByColIndex.selfReverseY();
610 
611 
612  //AJ To calculate the weights of every image
613  MultidimArray<float> weights1(1,1,mdExpSize,2*mdInSize);
614  MultidimArray<float> weights2(1,1,mdExpSize,2*mdInSize);
615 
616  for(int i=0; i<mdExpSize; i++){
617  int idxMax = DIRECT_A2D_ELEM(corrOrderByRowIndex,i,0)-1;
618  for(int j=0; j<2*mdInSize; j++){
619  int idx = DIRECT_A2D_ELEM(corrOrderByRowIndex,i,j)-1;
620  float weight;
621  if(DIRECT_A2D_ELEM(corrTotalRow,i,idx)<0)
622  weight=0.0;
623  else
624  weight = 1.0 - (j/(float)corrOrderByRowIndex.xdim);
625  weight *= DIRECT_A2D_ELEM(corrTotalRow,i,idx) / DIRECT_A2D_ELEM(corrTotalRow,i,idxMax);
626  DIRECT_A2D_ELEM(weights1, i, idx) = weight;
627  }
628  }
629  for(int i=0; i<mdInSize; i++){
630  int idxMax = DIRECT_A2D_ELEM(corrOrderByColIndex,0,i)-1;
631  for(int j=0; j<2*mdExpSize; j++){
632  int idx = DIRECT_A2D_ELEM(corrOrderByColIndex,j,i)-1;
633  float weight;
634  if(DIRECT_A2D_ELEM(corrTotalCol,idx,i)<0)
635  weight=0.0;
636  else
637  weight = 1.0 - (j/(float)corrOrderByColIndex.ydim);
638  weight *= DIRECT_A2D_ELEM(corrTotalCol,idx,i) / DIRECT_A2D_ELEM(corrTotalCol,idxMax,i);
639  if(idx<mdExpSize){
640  DIRECT_A2D_ELEM(weights2, idx, i) = weight;
641  }else{
642  DIRECT_A2D_ELEM(weights2, idx-mdExpSize, i+mdInSize) = weight;
643  }
644  }
645  }
646  weights=weights1*weights2;
647 
648 
649  //AJ
650  MultidimArray<float> rowWeights;
651  MultidimArray<int> rowIndexOrderWeights;
652  MultidimArray<int> weightsOrderByRowIndex(1,1,mdExpSize, 2*mdInSize);
653  int howManyInMd=0;
654  bool flip;
655  double maxShift2 = maxShift*maxShift;
656  Matrix2D<double> bestM(3,3);
657  MultidimArray<float> out2(3,3);
658 
659  for (size_t i=0; i<mdExpSize; i++){
660  weights.getRow(i, rowWeights);
661  rowWeights.indexSort(rowIndexOrderWeights);
662  weightsOrderByRowIndex.setRow(i, rowIndexOrderWeights);
663  }
664  weightsOrderByRowIndex.selfReverseX();
665  for(int i=0; i<mdExpSize; i++){
666  howManyInMd=0;
667 
668  for(int j=0; j<2*mdInSize; j++){
669  int idx = DIRECT_A2D_ELEM(weightsOrderByRowIndex,i,j)-1;
670 
671  if(simplifiedMd && howManyInMd==1){
672  DIRECT_A2D_ELEM(weights, i, idx) = 0;
673  continue;
674  }
675 
676  if(!simplifiedMd && howManyInMd==Nref){
677  DIRECT_A2D_ELEM(weights, i, idx) = 0;
678  continue;
679  }
680 
681  if(idx<mdInSize){
682  flip = false;
683  matrixTransCpu[idx].getSlice(i, out2);
684  }else{
685  flip = true;
686  matrixTransCpu_mirror[idx-mdInSize].getSlice(i, out2);
687  }
688  MAT_ELEM(bestM,0,0) = DIRECT_A2D_ELEM(out2,0,0);
689  MAT_ELEM(bestM,0,1)=DIRECT_A2D_ELEM(out2,0,1);
690  MAT_ELEM(bestM,0,2)=DIRECT_A2D_ELEM(out2,0,2);
691 
692  MAT_ELEM(bestM,1,0)=DIRECT_A2D_ELEM(out2,1,0);
693  MAT_ELEM(bestM,1,1)=DIRECT_A2D_ELEM(out2,1,1);
694  MAT_ELEM(bestM,1,2)=DIRECT_A2D_ELEM(out2,1,2);
695 
696  MAT_ELEM(bestM,2,0)=0.0;
697  MAT_ELEM(bestM,2,1)=0.0;
698  MAT_ELEM(bestM,2,2)=1.0;
699  bestM = bestM.inv();
700 
701  double shiftX = MAT_ELEM(bestM,0,2);
702  double shiftY = MAT_ELEM(bestM,1,2);
703  if (shiftX*shiftX + shiftY*shiftY > maxShift2){
704  DIRECT_A2D_ELEM(weights, i, idx) = 0;
705  }
706  else{
707  howManyInMd++;
708  }
709 
710  }
711  }
712  //END AJ
713 
714 
715  /*/AJ new to store the maximum weight for every exp image
716  if(simplifiedMd && Nref>1){
717  weightsMax.resize(mdExpSize);
718  for(int i=0; i<mdInSize; i++){
719  for(int j=0; j<mdExpSize; j++){
720  if(DIRECT_A2D_ELEM(weights,j,i)!=0){
721  if(DIRECT_A2D_ELEM(weights,j,i)>DIRECT_A1D_ELEM(weightsMax,j))
722  DIRECT_A1D_ELEM(weightsMax,j) = DIRECT_A2D_ELEM(weights,j,i);
723  }
724  if(DIRECT_A2D_ELEM(weights,j,i+mdInSize)!=0){
725  if(DIRECT_A2D_ELEM(weights,j,i+mdInSize)>DIRECT_A1D_ELEM(weightsMax,j))
726  DIRECT_A1D_ELEM(weightsMax,j) = DIRECT_A2D_ELEM(weights,j,i+mdInSize);
727  }
728  }
729  }
730  }
731  //END AJ/*/
732 
733 }
734 
735 
736 void generate_metadata(MetaDataVec SF, MetaDataVec SFexp, FileName fnDir, FileName fn_out, size_t mdExpSize, size_t mdInSize, MultidimArray<float> &weights,
737  MultidimArray<float> &corrTotalRow, MultidimArray<float> *matrixTransCpu, MultidimArray<float> *matrixTransCpu_mirror, int maxShift,
738  MultidimArray<float> &weightsMax, bool simplifiedMd, int Nref){
739 
740  double maxShift2 = maxShift*maxShift;
741  Matrix2D<double> bestM(3,3);
742  MultidimArray<float> out2(3,3);
743  Matrix2D<double>out2Matrix(3,3);
744  MetaDataVec mdOut;
745  String nameImg, nameRef;
746  bool flip;
747  double rot, tilt, psi;
748  int idxJ;
749  size_t refNum;
750 
751  auto iterExp = SFexp.begin();
752 
753  for(int i=0; i<mdExpSize; i++){
754  auto iter = SF.begin();
755 
756  for(int j=0; j<2*mdInSize; j++){
757  if(j%mdInSize==0)
758  iter = SF.begin();
759 
760  if(DIRECT_A2D_ELEM(weights,i,j)!=0){
761 
762  /*/AJ new to store the maximum weight for every exp image
763  if(simplifiedMd && Nref>1){
764  if(DIRECT_A2D_ELEM(weights,i,j)!=DIRECT_A1D_ELEM(weightsMax,i)){
765  if(iter->hasNext())
766  iter->moveNext();
767  continue;
768  }
769  }
770  //END AJ*/
771 
772  size_t itemId;
773  //*iterExp.getValue(MDL_IMAGE, nameImg);
774  //*iterExp.getValue(MDL_ITEM_ID, itemId);
775  //*iterOut
776  //*iterExp.setValue(MDL_ITEM_ID, itemId);
777  //*iterExp.setValue(MDL_IMAGE,nameImg);
778  (*iterExp).setValue(MDL_WEIGHT, (double)DIRECT_A2D_ELEM(weights, i, j));
779  (*iterExp).setValue(MDL_MAXCC, (double)DIRECT_A2D_ELEM(corrTotalRow, i, j));
780  if(j<mdInSize){
781  flip = false;
782  matrixTransCpu[j].getSlice(i, out2); //matrixTransCpu[i].getSlice(j, out2);
783  idxJ = j;
784  }else{
785  flip = true;
786  matrixTransCpu_mirror[j-mdInSize].getSlice(i, out2); //matrixTransCpu_mirror[i].getSlice(j-mdInSize, out2);
787  idxJ = j-mdInSize;
788  }
789 
790  //AJ NEW
791  MAT_ELEM(bestM,0,0) = DIRECT_A2D_ELEM(out2,0,0);
792  MAT_ELEM(bestM,0,1)=DIRECT_A2D_ELEM(out2,0,1);
793  MAT_ELEM(bestM,0,2)=DIRECT_A2D_ELEM(out2,0,2);
794 
795  MAT_ELEM(bestM,1,0)=DIRECT_A2D_ELEM(out2,1,0);
796  MAT_ELEM(bestM,1,1)=DIRECT_A2D_ELEM(out2,1,1);
797  MAT_ELEM(bestM,1,2)=DIRECT_A2D_ELEM(out2,1,2);
798 
799  MAT_ELEM(bestM,2,0)=0.0;
800  MAT_ELEM(bestM,2,1)=0.0;
801  MAT_ELEM(bestM,2,2)=1.0;
802  bestM = bestM.inv();
803  //FIN AJ NEW
804 
805  double shiftX = MAT_ELEM(bestM,0,2);//(double)DIRECT_A2D_ELEM(out2,0,2);
806  double shiftY = MAT_ELEM(bestM,1,2);//(double)DIRECT_A2D_ELEM(out2,1,2);
807  if (shiftX*shiftX + shiftY*shiftY > maxShift2){
808  if(iter != SF.end())
809  ++iter;
810  continue;
811  }
812 
813  (*iterExp).setValue(MDL_FLIP, flip);
814 
815  double scale;
816  /*MAT_ELEM(bestM,0,0)=MAT_ELEM(out2Matrix,0,0);//DIRECT_A2D_ELEM(out2,0,0);
817  MAT_ELEM(bestM,0,1)=MAT_ELEM(out2Matrix,0,1);//DIRECT_A2D_ELEM(out2,0,1);
818  MAT_ELEM(bestM,0,2)=MAT_ELEM(out2Matrix,0,2);//DIRECT_A2D_ELEM(out2,0,2);
819  MAT_ELEM(bestM,1,0)=MAT_ELEM(out2Matrix,1,0);//DIRECT_A2D_ELEM(out2,1,0);
820  MAT_ELEM(bestM,1,1)=MAT_ELEM(out2Matrix,1,1);//DIRECT_A2D_ELEM(out2,1,1);
821  MAT_ELEM(bestM,1,2)=MAT_ELEM(out2Matrix,1,2);//DIRECT_A2D_ELEM(out2,1,2);
822  */
823 
824  MAT_ELEM(bestM,2,0)=0.0;
825  MAT_ELEM(bestM,2,1)=0.0;
826  MAT_ELEM(bestM,2,2)=1.0;
827  if(flip){
828  MAT_ELEM(bestM,0,0)*=-1; //bestM
829  MAT_ELEM(bestM,1,0)*=-1; //bestM
830  }
831  bestM=bestM.inv(); //bestM
832 
833  transformationMatrix2Parameters2D(bestM,flip,scale,shiftX,shiftY,psi); //bestM
834  if (flip)
835  shiftX*=-1;
836 
837  //AJ NEW
838  if(flip){
839  shiftX*=-1;
840  //shiftY*=-1;
841  psi*=-1;
842  }
843  //FIN AJ NEW
844 
845  (*iterExp).setValue(MDL_SHIFT_X, -shiftX);
846  (*iterExp).setValue(MDL_SHIFT_Y, -shiftY);
847  //(*iterExp).setValue(MDL_SHIFT_Z, 0.0);
848  (*iter).getValue(MDL_ANGLE_ROT, rot);
849  (*iterExp).setValue(MDL_ANGLE_ROT, rot);
850  (*iter).getValue(MDL_ANGLE_TILT, tilt);
851  (*iterExp).setValue(MDL_ANGLE_TILT, tilt);
852  (*iterExp).setValue(MDL_ANGLE_PSI, psi);
853  if((*iter).containsLabel(MDL_ITEM_ID))
854  (*iter).getValue(MDL_ITEM_ID, refNum);
855  else
856  refNum = idxJ+1;
857  (*iterExp).setValue(MDL_REF, (int)refNum);
858  mdOut.addRow(dynamic_cast<MDRowVec&>(*iterExp));
859  }
860  if(iter != SF.end())
861  ++iter;
862  }
863  if(iterExp != SFexp.end())
864  ++iterExp;
865  }
866  String fnFinal=formatString("%s/%s",fnDir.c_str(),fn_out.c_str());
867  mdOut.write(fnFinal);
868 }
869 
870 
871 void generate_output_classes(MetaDataVec SF, MetaDataVec SFexp, FileName fnDir, size_t mdExpSize, size_t mdInSize,
872  MultidimArray<float> &weights, MultidimArray<float> *matrixTransCpu, MultidimArray<float> *matrixTransCpu_mirror,
873  int maxShift, FileName fn_classes_out, MultidimArray<float> &weightsMax, bool simplifiedMd, int Nref){
874 
875  double maxShift2 = maxShift*maxShift;
876  MultidimArray<float> out2(3,3);
877  Matrix2D<double> out2Matrix(3,3);
878  double rot, tilt, psi;
879  int *NexpVector;
880 
881  size_t xAux, yAux, zAux, nAux;
882  getImageSize(SF,xAux,yAux,zAux,nAux);
883  FileName fnImgNew, fnExpNew, fnRoot, fnStackOut, fnOut, fnStackMD, fnClass;
884  Image<double> Inew, Iexp_aux, Inew2, Iexp_out;
885  Matrix2D<double> E(3,3);
886  MultidimArray<float> auxtr(3,3);
887  Matrix2D<double> auxtrMatrix(3,3);
888  MultidimArray<double> refSum(1, 1, yAux, xAux);
889  bool firstTime=true;
890  size_t refNum;
891  MultidimArray<double> zeros(1, 1, yAux, xAux);
892 
893  // Generate mask
894  Mask mask;
895  mask.type = BINARY_CIRCULAR_MASK;
896  mask.mode = INNER_MASK;
897  auto rad = (size_t)std::min(xAux*0.5, yAux*0.5);
898  mask.R1 = rad;
899  mask.resize(yAux,xAux);
901  mask.generate_mask();
902 
903  CorrelationAux auxCenter;
904  RotationalCorrelationAux auxCenter2;
905 
906  auto iterSF = SF.begin();
907 
908  bool read = false;
909  int countingClasses=1;
910  bool skip_image;
911  NexpVector = new int[mdInSize];
912  for(int i=0; i<mdInSize; i++){
913  NexpVector[i]=0;
914  bool change=false;
915  double normWeight=0;
916 
917  MDRow& rowSF = *iterSF;
918  if(rowSF.containsLabel(MDL_ITEM_ID))
919  rowSF.getValue(MDL_ITEM_ID, refNum);
920  else
921  refNum=countingClasses;
922 
923  auto iterSFexp = SFexp.begin();
924 
925  refSum.initZeros();
926 
927  fnRoot=fn_classes_out.withoutExtension();
928  fnStackOut=formatString("%s/%s.stk",fnDir.c_str(),fnRoot.c_str());
929  if(fnStackOut.exists() && firstTime)
930  fnStackOut.deleteFile();
931 
932  firstTime=false;
933  for(int j=0; j<mdExpSize; j++){
934 
935  read = false;
936  skip_image=false;
937 
938  long int pointer1=i*xAux*yAux;
939  long int pointer2=i*xAux*yAux;
940 
941  if(DIRECT_A2D_ELEM(weights,j,i)!=0){
942 
943  /*/AJ new to store the maximum weight for every exp image
944  if(simplifiedMd && Nref>1){
945  if(DIRECT_A2D_ELEM(weights,j,i)!=DIRECT_A1D_ELEM(weightsMax,j))
946  skip_image=true;
947  }
948  //END AJ/*/
949 
950  if(!skip_image){
951  matrixTransCpu[i].getSlice(j, auxtr); //matrixTransCpu[j].getSlice(i, auxtr);
952  //AJ NEW
953  MAT_ELEM(E,0,0)=DIRECT_A2D_ELEM(auxtr,0,0);
954  MAT_ELEM(E,0,1)=DIRECT_A2D_ELEM(auxtr,0,1);
955  MAT_ELEM(E,0,2)=DIRECT_A2D_ELEM(auxtr,0,2);
956 
957  MAT_ELEM(E,1,0)=DIRECT_A2D_ELEM(auxtr,1,0);
958  MAT_ELEM(E,1,1)=DIRECT_A2D_ELEM(auxtr,1,1);
959  MAT_ELEM(E,1,2)=DIRECT_A2D_ELEM(auxtr,1,2);
960 
961  MAT_ELEM(E,2,0)=0.0;
962  MAT_ELEM(E,2,1)=0.0;
963  MAT_ELEM(E,2,2)=1.0;
964  E = E.inv();
965  //FIN AJ NEW
966 
967  double shiftX = MAT_ELEM(E,0,2);//(double)DIRECT_A2D_ELEM(auxtr,0,2);
968  double shiftY = MAT_ELEM(E,1,2);//(double)DIRECT_A2D_ELEM(auxtr,1,2);
969  if (shiftX*shiftX + shiftY*shiftY > maxShift2)
970  skip_image=true;
971  }
972 
973  if(!skip_image){
974 
975  if(!read){
976  (*iterSFexp).getValue(MDL_IMAGE, fnExpNew);
977  Iexp_aux.read(fnExpNew);
978  read = true;
979  }
980 
981  NexpVector[i]++;
982 
983  /*MAT_ELEM(E,0,0)=MAT_ELEM(auxtrMatrix,0,0);//DIRECT_A2D_ELEM(auxtr,0,0);
984  MAT_ELEM(E,0,1)=MAT_ELEM(auxtrMatrix,0,1);//DIRECT_A2D_ELEM(auxtr,0,1);
985  MAT_ELEM(E,0,2)=MAT_ELEM(auxtrMatrix,0,2);//DIRECT_A2D_ELEM(auxtr,0,2);
986  MAT_ELEM(E,1,0)=MAT_ELEM(auxtrMatrix,1,0);//DIRECT_A2D_ELEM(auxtr,1,0);
987  MAT_ELEM(E,1,1)=MAT_ELEM(auxtrMatrix,1,1);//DIRECT_A2D_ELEM(auxtr,1,1);
988  MAT_ELEM(E,1,2)=MAT_ELEM(auxtrMatrix,1,2);//DIRECT_A2D_ELEM(auxtr,1,2);
989  */
990 
991  MAT_ELEM(E,2,0)=0.0;
992  MAT_ELEM(E,2,1)=0.0;
993  MAT_ELEM(E,2,2)=1.0;
994 
995  selfApplyGeometry(xmipp_transformation::LINEAR,Iexp_aux(),E,xmipp_transformation::IS_NOT_INV,xmipp_transformation::DONT_WRAP,0.0); //E
996  //applyGeometry(LINEAR,Iexp_out(),Iexp_aux(),auxtrMatrix,IS_NOT_INV,DONT_WRAP,0.0);
997 
998  Iexp_aux().resetOrigin();
999 
1000  refSum += Iexp_aux()*DIRECT_A2D_ELEM(weights,j,i);
1001  change=true;
1002  normWeight+=DIRECT_A2D_ELEM(weights,j,i);
1003  }
1004  }
1005  skip_image=false;
1006  if(DIRECT_A2D_ELEM(weights,j,i+mdInSize)!=0){
1007 
1008  /*/AJ new to store the maximum weight for every exp image
1009  if(simplifiedMd && Nref>1){
1010  if(DIRECT_A2D_ELEM(weights,j,i+mdInSize)!=DIRECT_A1D_ELEM(weightsMax,j))
1011  skip_image=true;
1012  }
1013  //END AJ/*/
1014 
1015  if(!skip_image){
1016  matrixTransCpu_mirror[i].getSlice(j, auxtr); //matrixTransCpu_mirror[j].getSlice(i, auxtr);
1017  //AJ NEW
1018  MAT_ELEM(E,0,0)=DIRECT_A2D_ELEM(auxtr,0,0);
1019  MAT_ELEM(E,0,1)=DIRECT_A2D_ELEM(auxtr,0,1);
1020  MAT_ELEM(E,0,2)=DIRECT_A2D_ELEM(auxtr,0,2);
1021 
1022  MAT_ELEM(E,1,0)=DIRECT_A2D_ELEM(auxtr,1,0);
1023  MAT_ELEM(E,1,1)=DIRECT_A2D_ELEM(auxtr,1,1);
1024  MAT_ELEM(E,1,2)=DIRECT_A2D_ELEM(auxtr,1,2);
1025 
1026  MAT_ELEM(E,2,0)=0.0;
1027  MAT_ELEM(E,2,1)=0.0;
1028  MAT_ELEM(E,2,2)=1.0;
1029  E = E.inv();
1030  //FIN AJ NEW
1031 
1032  double shiftX = MAT_ELEM(E,0,2);//(double)DIRECT_A2D_ELEM(auxtr,0,2);
1033  double shiftY = MAT_ELEM(E,1,2);//(double)DIRECT_A2D_ELEM(auxtr,1,2);
1034  if (shiftX*shiftX + shiftY*shiftY > maxShift2)
1035  skip_image=true;
1036  }
1037 
1038  if(!skip_image){
1039 
1040  if(!read){
1041  (*iterSFexp).getValue(MDL_IMAGE, fnExpNew);
1042  Iexp_aux.read(fnExpNew);
1043  read = true;
1044  }
1045 
1046  NexpVector[i]++;
1047  Iexp_aux().selfReverseX();
1048 
1049  /*MAT_ELEM(E,0,0)=MAT_ELEM(auxtrMatrix,0,0);//DIRECT_A2D_ELEM(auxtr,0,0);
1050  MAT_ELEM(E,0,1)=MAT_ELEM(auxtrMatrix,0,1);//DIRECT_A2D_ELEM(auxtr,0,1);
1051  MAT_ELEM(E,0,2)=MAT_ELEM(auxtrMatrix,0,2);//DIRECT_A2D_ELEM(auxtr,0,2);
1052  MAT_ELEM(E,1,0)=MAT_ELEM(auxtrMatrix,1,0);//DIRECT_A2D_ELEM(auxtr,1,0);
1053  MAT_ELEM(E,1,1)=MAT_ELEM(auxtrMatrix,1,1);//DIRECT_A2D_ELEM(auxtr,1,1);
1054  MAT_ELEM(E,1,2)=MAT_ELEM(auxtrMatrix,1,2);//DIRECT_A2D_ELEM(auxtr,1,2);
1055  */
1056 
1057  MAT_ELEM(E,2,0)=0.0;
1058  MAT_ELEM(E,2,1)=0.0;
1059  MAT_ELEM(E,2,2)=1.0;
1060 
1061  //AJ NEW
1062  MAT_ELEM(E,0,2)*=-1; //E
1063  MAT_ELEM(E,0,1)*=-1; //E
1064  MAT_ELEM(E,1,0)*=-1; //E
1065  //FIN AJ NEW//
1066 
1067  selfApplyGeometry(xmipp_transformation::LINEAR,Iexp_aux(),E,xmipp_transformation::IS_NOT_INV,xmipp_transformation::DONT_WRAP,0.0); //E
1068 
1069  Iexp_aux().resetOrigin();
1070 
1071  refSum += Iexp_aux()*DIRECT_A2D_ELEM(weights,j,i+mdInSize);
1072  change=true;
1073  normWeight+=DIRECT_A2D_ELEM(weights,j,i+mdInSize);
1074  }
1075  }
1076  if(iterSFexp != SFexp.end())
1077  ++iterSFexp;
1078  }
1079 
1080  FileName fnStackNo;
1081  fnStackNo.compose(countingClasses, fnStackOut);
1082  if(change){
1083  refSum/=normWeight;
1084  Inew()=refSum;
1085  centerImage(Inew(), auxCenter, auxCenter2);
1086  //masking to avoid wrapping in the edges of the image
1087  mask.apply_mask(Inew(), Inew2());
1088  Inew2().resetOrigin();
1089  Inew2.write(fnStackNo,i,true,WRITE_APPEND);
1090  }else{
1091  Inew2() = zeros;
1092  Inew2.write(fnStackNo,i,true,WRITE_APPEND);
1093  }
1094 
1095  if(iterSF != SF.end())
1096  ++iterSF;
1097 
1098  countingClasses++;
1099  }
1100 
1101 
1102  iterSF = SF.begin();
1103 
1104  countingClasses=1;
1105  Matrix2D<double> bestM(3,3);
1106  MetaDataVec SFout;
1107  firstTime=true;
1108  skip_image=false;
1109  for(int i=0; i<mdInSize; i++){
1110 
1111  MDRow& rowSF = *iterSF;
1112  if(rowSF.containsLabel(MDL_ITEM_ID))
1113  rowSF.getValue(MDL_ITEM_ID, refNum);
1114  else
1115  refNum = countingClasses;
1116 
1117  fnRoot=fn_classes_out.withoutExtension();
1118  fnStackMD=formatString("%s/%s.xmd", fnDir.c_str(), fnRoot.c_str());
1119  fnClass.compose(countingClasses, fnStackOut);
1120 
1121  if(fnStackMD.exists() && firstTime)
1122  fnStackMD.deleteFile();
1123 
1124  firstTime=false;
1125  size_t id = SFout.addObject();
1126  SFout.setValue(MDL_REF, (int)refNum, id);
1127  SFout.setValue(MDL_IMAGE, fnClass, id);
1128  SFout.setValue(MDL_CLASS_COUNT,(size_t)NexpVector[i], id);
1129 
1130  if(iterSF != SF.end())
1131  ++iterSF;
1132 
1133  countingClasses++;
1134  }
1135  SFout.write("classes@"+fnStackMD, MD_APPEND);
1136 
1137  iterSF = SF.begin();
1138  FileName fnExpIm;
1139  for(int i=0; i<mdInSize; i++){
1140  skip_image=false;
1141  MDRow& rowSF = *iterSF;
1142  if (rowSF.containsLabel(MDL_ITEM_ID))
1143  rowSF.getValue(MDL_ITEM_ID, refNum);
1144  else
1145  refNum=i+1;
1146 
1147  auto iterSFexp = SFexp.begin();
1148  MetaDataVec SFq;
1149  MDRowVec rowSFexp;
1150 
1151  for(int j=0; j<mdExpSize; j++){
1152  read = false;
1153  skip_image=false;
1154  //SFexp.getRow(rowSFexp, iterSFexp->objId);
1155  //rowSFexp.getValue(MDL_IMAGE, fnExpIm);
1156 
1157  if(DIRECT_A2D_ELEM(weights,j,i)!=0){
1158 
1159  /*/AJ new to store the maximum weight for every exp image
1160  if(simplifiedMd && Nref>1){
1161  if(DIRECT_A2D_ELEM(weights,j,i)!=DIRECT_A1D_ELEM(weightsMax,j))
1162  skip_image=true;
1163  }
1164  //END AJ/*/
1165 
1166  if(!skip_image){
1167  matrixTransCpu[i].getSlice(j, out2); //matrixTransCpu[j].getSlice(i, out2);
1168  //AJ NEW
1169  MAT_ELEM(bestM,0,0)=DIRECT_A2D_ELEM(out2,0,0);
1170  MAT_ELEM(bestM,0,1)=DIRECT_A2D_ELEM(out2,0,1);
1171  MAT_ELEM(bestM,0,2)=DIRECT_A2D_ELEM(out2,0,2);
1172 
1173  MAT_ELEM(bestM,1,0)=DIRECT_A2D_ELEM(out2,1,0);
1174  MAT_ELEM(bestM,1,1)=DIRECT_A2D_ELEM(out2,1,1);
1175  MAT_ELEM(bestM,1,2)=DIRECT_A2D_ELEM(out2,1,2);
1176 
1177  MAT_ELEM(bestM,2,0)=0.0;
1178  MAT_ELEM(bestM,2,1)=0.0;
1179  MAT_ELEM(bestM,2,2)=1.0;
1180  bestM = bestM.inv();
1181  //FIN AJ NEW
1182 
1183  double sx = MAT_ELEM(bestM,0,2); //(double)DIRECT_A2D_ELEM(out2,0,2);
1184  double sy = MAT_ELEM(bestM,1,2); //(double)DIRECT_A2D_ELEM(out2,1,2);
1185  if (sx*sx + sy*sy > maxShift2)
1186  skip_image=true;
1187  }
1188 
1189  if(!skip_image){
1190 
1191  size_t itemId;
1192  if(!read){
1193  rowSFexp = dynamic_cast<MDRowVec&>(*iterSFexp);
1194  //rowSFexp.getValue(MDL_IMAGE, fnExpIm);
1195  //rowSFexp.getValue(MDL_ITEM_ID, itemId);
1196  read = true;
1197  }
1198  //row
1199  //row.setValue(MDL_ITEM_ID, itemId);
1200  //row.setValue(MDL_IMAGE, fnExpIm);
1201  rowSFexp.setValue(MDL_WEIGHT, (double)DIRECT_A2D_ELEM(weights, j, i));
1202  rowSFexp.setValue(MDL_FLIP, false);
1203 
1204  double scale, shiftX, shiftY, psi;
1205  bool flip;
1206  /*MAT_ELEM(bestM,0,0)=MAT_ELEM(out2Matrix,0,0);//DIRECT_A2D_ELEM(out2,0,0);
1207  MAT_ELEM(bestM,0,1)=MAT_ELEM(out2Matrix,0,1);//DIRECT_A2D_ELEM(out2,0,1);
1208  MAT_ELEM(bestM,0,2)=MAT_ELEM(out2Matrix,0,2);//DIRECT_A2D_ELEM(out2,0,2);
1209  MAT_ELEM(bestM,1,0)=MAT_ELEM(out2Matrix,1,0);//DIRECT_A2D_ELEM(out2,1,0);
1210  MAT_ELEM(bestM,1,1)=MAT_ELEM(out2Matrix,1,1);//DIRECT_A2D_ELEM(out2,1,1);
1211  MAT_ELEM(bestM,1,2)=MAT_ELEM(out2Matrix,1,2);//DIRECT_A2D_ELEM(out2,1,2);
1212  */
1213 
1214  MAT_ELEM(bestM,2,0)=0.0;
1215  MAT_ELEM(bestM,2,1)=0.0;
1216  MAT_ELEM(bestM,2,2)=1.0;
1217  bestM=bestM.inv(); //bestM
1218 
1219  transformationMatrix2Parameters2D(bestM,flip,scale,shiftX,shiftY,psi); //bestM
1220 
1221  //row
1222  rowSFexp.setValue(MDL_SHIFT_X, -shiftX);
1223  rowSFexp.setValue(MDL_SHIFT_Y, -shiftY);
1224  //rowSFexp.setValue(MDL_SHIFT_Z, 0.0);
1225  rowSF.getValue(MDL_ANGLE_ROT, rot);
1226  rowSFexp.setValue(MDL_ANGLE_ROT, rot);
1227  rowSF.getValue(MDL_ANGLE_TILT, tilt);
1228  rowSFexp.setValue(MDL_ANGLE_TILT, tilt);
1229  rowSFexp.setValue(MDL_ANGLE_PSI, psi);
1230  rowSFexp.setValue(MDL_REF,(int)refNum);
1231  SFq.addRow(rowSFexp);
1232  }
1233  }
1234 
1235  skip_image=false;
1236  if(DIRECT_A2D_ELEM(weights,j,i+mdInSize)!=0){
1237 
1238  /*/AJ new to store the maximum weight for every exp image
1239  if(simplifiedMd && Nref>1){
1240  if(DIRECT_A2D_ELEM(weights,j,i+mdInSize)!=DIRECT_A1D_ELEM(weightsMax,j))
1241  skip_image=true;
1242  }
1243  //END AJ/*/
1244 
1245  if(!skip_image){
1246  matrixTransCpu_mirror[i].getSlice(j, out2); //matrixTransCpu_mirror[j].getSlice(i, out2);
1247  //AJ NEW
1248  MAT_ELEM(bestM,0,0)=DIRECT_A2D_ELEM(out2,0,0);
1249  MAT_ELEM(bestM,0,1)=DIRECT_A2D_ELEM(out2,0,1);
1250  MAT_ELEM(bestM,0,2)=DIRECT_A2D_ELEM(out2,0,2);
1251 
1252  MAT_ELEM(bestM,1,0)=DIRECT_A2D_ELEM(out2,1,0);
1253  MAT_ELEM(bestM,1,1)=DIRECT_A2D_ELEM(out2,1,1);
1254  MAT_ELEM(bestM,1,2)=DIRECT_A2D_ELEM(out2,1,2);
1255 
1256  MAT_ELEM(bestM,2,0)=0.0;
1257  MAT_ELEM(bestM,2,1)=0.0;
1258  MAT_ELEM(bestM,2,2)=1.0;
1259  bestM = bestM.inv();
1260  //FIN AJ NEW
1261 
1262  double sx = MAT_ELEM(bestM,0,2); //(double)DIRECT_A2D_ELEM(out2,0,2);
1263  double sy = MAT_ELEM(bestM,1,2); //(double)DIRECT_A2D_ELEM(out2,1,2);
1264  if (sx*sx + sy*sy > maxShift2)
1265  skip_image=true;
1266  }
1267 
1268  if(!skip_image){
1269 
1270  size_t itemId;
1271  if(!read){
1272  rowSFexp = dynamic_cast<MDRowVec&>(*iterSFexp);
1273  //rowSFexp.getValue(MDL_IMAGE, fnExpIm);
1274  //rowSFexp.getValue(MDL_ITEM_ID, itemId);
1275  read = true;
1276  }
1277  //row
1278  //row.setValue(MDL_ITEM_ID, itemId);
1279  //row.setValue(MDL_IMAGE, fnExpIm);
1280  rowSFexp.setValue(MDL_WEIGHT, (double)DIRECT_A2D_ELEM(weights, j, i+mdInSize));
1281  rowSFexp.setValue(MDL_FLIP, true);
1282 
1283  double scale, shiftX, shiftY, psi;
1284  bool flip;
1285  /*MAT_ELEM(bestM,0,0)=MAT_ELEM(out2Matrix,0,0);//DIRECT_A2D_ELEM(out2,0,0);
1286  MAT_ELEM(bestM,0,1)=MAT_ELEM(out2Matrix,0,1);//DIRECT_A2D_ELEM(out2,0,1);
1287  MAT_ELEM(bestM,0,2)=MAT_ELEM(out2Matrix,0,2);//DIRECT_A2D_ELEM(out2,0,2);
1288  MAT_ELEM(bestM,1,0)=MAT_ELEM(out2Matrix,1,0);//DIRECT_A2D_ELEM(out2,1,0);
1289  MAT_ELEM(bestM,1,1)=MAT_ELEM(out2Matrix,1,1);//DIRECT_A2D_ELEM(out2,1,1);
1290  MAT_ELEM(bestM,1,2)=MAT_ELEM(out2Matrix,1,2);//DIRECT_A2D_ELEM(out2,1,2);
1291  */
1292 
1293  MAT_ELEM(bestM,2,0)=0.0;
1294  MAT_ELEM(bestM,2,1)=0.0;
1295  MAT_ELEM(bestM,2,2)=1.0;
1296 
1297  MAT_ELEM(bestM,0,0)*=-1; //bestM
1298  MAT_ELEM(bestM,1,0)*=-1; //bestM
1299  bestM=bestM.inv(); //bestM
1300 
1301  transformationMatrix2Parameters2D(bestM,flip,scale,shiftX,shiftY,psi); //bestM
1302 
1303  //AJ NEW
1304  shiftX*=-1;
1305  psi*=-1;
1306  //FIN AJ NEW
1307 
1308  shiftX*=-1;
1309  //row
1310  rowSFexp.setValue(MDL_SHIFT_X, -shiftX);
1311  rowSFexp.setValue(MDL_SHIFT_Y, -shiftY);
1312  //rowSFexp.setValue(MDL_SHIFT_Z, 0.0);
1313  rowSF.getValue(MDL_ANGLE_ROT, rot);
1314  rowSFexp.setValue(MDL_ANGLE_ROT, rot);
1315  rowSF.getValue(MDL_ANGLE_TILT, tilt);
1316  rowSFexp.setValue(MDL_ANGLE_TILT, tilt);
1317  rowSFexp.setValue(MDL_ANGLE_PSI, psi);
1318  rowSFexp.setValue(MDL_REF,(int)refNum);
1319  SFq.addRow(rowSFexp);
1320  }
1321  }
1322  if(iterSFexp != SFexp.end())
1323  ++iterSFexp;
1324  }
1325  MetaDataVec SFq_sorted;
1326  SFq_sorted.sort(SFq, MDL_IMAGE);
1327  SFq_sorted.write(formatString("class%06d_images@%s",refNum,fnStackMD.c_str()),MD_APPEND);
1328 
1329  if(iterSF != SF.end())
1330  ++iterSF;
1331  }
1332 
1333  delete []NexpVector;
1334 }
1335 
1336 // Compute correlation --------------------------------------------------------
1338 {
1339 
1340  //Setting the cuda device to use
1341  gpu.set();
1342 
1343  //PROJECTION IMAGES
1344  size_t Xdim, Ydim, Zdim, Ndim;
1345  SF.read(fn_ref,NULL);
1346  size_t mdInSize = SF.size();
1347  getImageSize(SF, Xdim, Ydim, Zdim, Ndim);
1348 
1349 
1350  //EXPERIMENTAL IMAGES
1351  SFexp.read(fn_exp,NULL);
1352  size_t mdExpSize = SFexp.size();
1353 
1354  // Generate mask
1355  Mask mask;
1356  mask.type = BINARY_CIRCULAR_MASK;
1357  mask.mode = INNER_MASK;
1358  auto rad = (size_t)std::min(Xdim*0.48, Ydim*0.48);
1359 
1360  int number = rad;
1361  auto *out = new int[5];
1362 
1363  while(true){
1364  if (number%2!=0){
1365  number--;
1366  continue;
1367  }
1368  for (int z=0; z<5; z++)
1369  out[z]=0;
1370  primeFactors(number, out);
1371  if ((out[0]!=0 || out[1]!=0 || out[2]!=0 || out[3]!=0) && out[4]==0){
1372  rad = number;
1373  break;
1374  }
1375  else
1376  number--;
1377  }
1378 
1379  mask.R1 = rad;
1380  mask.resize(Ydim,Xdim);
1382  mask.generate_mask();
1383  int maskCount = mask.get_binary_mask().sum();
1384 
1385  //AJ check the size of the data to avoid exceed the GPU memory
1386  float memory[3]={0, 0, 0}; //total, free, used
1387  cuda_check_gpu_memory(memory);
1388 
1389  int maxGridSize[3];
1390  cuda_check_gpu_properties(maxGridSize);
1391 
1392 
1393  //AJ check_gpu_memory to know how many images we can copy in the gpu memory
1394  float limit=0.4; //0.877; 1.3;
1395  int available_images_proj = mdExpSize; //mdInSize
1396  int available1 = mdExpSize;
1397  int available2 = mdExpSize;
1398  if(Xdim*Ydim*mdExpSize*4*100/memory[1]>limit){ //mdInSize
1399  available1 = floor(memory[1]*(limit/100)/(Xdim*Ydim*4));
1400  }
1401  if(Xdim*2*Ydim*2*mdExpSize>maxGridSize[0]){ //mdInSize
1402  available2 = floor((round(maxGridSize[0]*0.9))/(Xdim*Ydim*2*2));
1403  }
1404  if (available1<available2)
1405  available_images_proj = available1;
1406  else
1407  available_images_proj = available2;
1408 
1409 
1410  //matrix with all the best transformations in CPU
1411  auto *matrixTransCpu = new MultidimArray<float> [mdInSize]; //mdExpSize
1412  for(int i=0; i<mdInSize; i++) //mdExpSize
1413  matrixTransCpu[i].coreAllocate(1, mdExpSize, 3, 3); //mdInSize
1414  auto *matrixTransCpu_mirror = new MultidimArray<float> [mdInSize]; //mdExpSize
1415  for(int i=0; i<mdInSize; i++) //mdExpSize
1416  matrixTransCpu_mirror[i].coreAllocate(1, mdExpSize, 3, 3); //mdInSize
1417 
1418  //correlation matrix
1419  MultidimArray<float> matrixCorrCpu(1, 1, mdInSize, mdExpSize); //mdExpSize, mdInSize
1420  MultidimArray<float> matrixCorrCpu_mirror(1, 1, mdInSize, mdExpSize); //mdExpSize, mdInSize
1421 
1422  //Aux vectors with maximum values of correlation in RT and TR steps
1423  float *max_vector_rt;
1424  float *max_vector_tr;
1425  float *max_vector_rt_mirror;
1426  float *max_vector_tr_mirror;
1427 
1428  //Transformation matrix in GPU and CPU
1429  TransformMatrix<float> transMat_tr;
1430  TransformMatrix<float> transMat_rt;
1431  TransformMatrix<float> transMat_tr_mirror;
1432  TransformMatrix<float> transMat_rt_mirror;
1433 
1434  TransformMatrix<float> resultTR;
1435  TransformMatrix<float> resultRT;
1436 
1437  int firstIdx=0;
1438  bool finish=false;
1439 
1440  mycufftHandle myhandlePadded_tr, myhandleMask_tr, myhandlePolar_tr, myhandleAux_tr, myhandlePaddedB_tr, myhandleMaskB_tr, myhandlePolarB_tr, myhandleAuxB_tr;
1441  mycufftHandle myhandlePadded_rt, myhandleMask_rt, myhandlePolar_rt, myhandleAux_rt, myhandlePaddedB_rt, myhandleMaskB_rt, myhandlePolarB_rt, myhandleAuxB_rt;
1442  mycufftHandle ifftcb;
1443 
1444  myStreamHandle myStreamTR, myStreamRT;
1445  myStreamCreate(myStreamTR);
1446  myStreamCreate(myStreamRT);
1447 
1448 
1449  GpuCorrelationAux d_referenceAux;
1450 
1451  size_t pad_Xdim=2*Xdim-1;
1452  size_t pad_Ydim=2*Ydim-1;
1453 
1454  number = pad_Xdim;
1455  while(true){
1456  if (number%2!=0){
1457  number++;
1458  continue;
1459  }
1460  for (int z=0; z<5; z++)
1461  out[z]=0;
1462  primeFactors(number, out);
1463  if ((out[0]!=0 || out[1]!=0 || out[2]!=0 || out[3]!=0) && out[4]==0){
1464  pad_Xdim = number;
1465  break;
1466  }
1467  else
1468  number++;
1469  }
1470 
1471  pad_Ydim = pad_Xdim;
1472  d_referenceAux.XdimOrig=Xdim;
1473  d_referenceAux.YdimOrig=Ydim;
1474  d_referenceAux.Xdim=pad_Xdim;
1475  d_referenceAux.Ydim=pad_Ydim;
1476  d_referenceAux.XdimPolar=360;
1477  d_referenceAux.YdimPolar=(size_t)mask.R1;
1478 
1479 
1480  StructuresAux myStructureAux_tr, myStructureAux_rt;
1481 
1482  auto iter = SFexp.ids().begin();
1483 
1484  GpuMultidimArrayAtCpu<float> original_image_stack;
1485 
1486  //Loop over the reference images
1487  size_t totalWork=mdInSize*mdExpSize;
1488  size_t workDone=0;
1489  init_progress_bar(totalWork);
1490  size_t lastProgressShown=0;
1491  while(!finish){
1492 
1493  original_image_stack.resize(Xdim,Ydim,1,available_images_proj);
1494 
1495  //Aux vectors with maximum values of correlation in RT and TR steps
1496  cpuMalloc((void**)&max_vector_tr, sizeof(float)*available_images_proj);
1497  cpuMalloc((void**)&max_vector_rt, sizeof(float)*available_images_proj);
1498  cpuMalloc((void**)&max_vector_tr_mirror, sizeof(float)*available_images_proj);
1499  cpuMalloc((void**)&max_vector_rt_mirror, sizeof(float)*available_images_proj);
1500 
1501 
1502  //Transformation matrix in GPU and CPU
1503  transMat_tr.resize(myStreamTR, available_images_proj);
1504  transMat_rt.resize(myStreamRT, available_images_proj);
1505  transMat_tr_mirror.resize(myStreamTR, available_images_proj);
1506  transMat_rt_mirror.resize(myStreamRT, available_images_proj);
1507 
1508  resultTR.resize(myStreamTR, available_images_proj);
1509  resultRT.resize(myStreamRT, available_images_proj);
1510 
1511  //TODO allocate memory with care
1512  myStructureAux_tr.padded_image_gpu.resize(pad_Xdim, pad_Ydim, 1, available_images_proj);
1513  myStructureAux_tr.padded_image2_gpu.resize(pad_Xdim, pad_Ydim, 1, available_images_proj);
1514  myStructureAux_tr.padded_mask_gpu.resize(pad_Xdim, pad_Ydim, 1, 1);
1515  myStructureAux_tr.polar_gpu.resize(d_referenceAux.XdimPolar,d_referenceAux.YdimPolar,1,available_images_proj);
1516  myStructureAux_tr.polar2_gpu.resize(d_referenceAux.XdimPolar,d_referenceAux.YdimPolar,1,available_images_proj);
1517 
1518  myStructureAux_rt.padded_image_gpu.resize(pad_Xdim, pad_Ydim, 1, available_images_proj);
1519  myStructureAux_rt.padded_image2_gpu.resize(pad_Xdim, pad_Ydim, 1, available_images_proj);
1520  myStructureAux_rt.padded_mask_gpu.resize(pad_Xdim, pad_Ydim, 1, 1);
1521  myStructureAux_rt.polar_gpu.resize(d_referenceAux.XdimPolar,d_referenceAux.YdimPolar,1,available_images_proj);
1522  myStructureAux_rt.polar2_gpu.resize(d_referenceAux.XdimPolar,d_referenceAux.YdimPolar,1,available_images_proj);
1523 
1524  //SF
1525  preprocess_images_reference(SFexp, firstIdx, available_images_proj, mask, d_referenceAux,
1526  myhandlePadded_tr, myhandleMask_tr, myhandlePolar_tr, myStructureAux_tr, iter, myStreamTR);
1527 
1528  d_referenceAux.maskCount=maskCount;
1529  d_referenceAux.produceSideInfo(myhandlePaddedB_tr, myhandleMaskB_tr, myStructureAux_tr, myStreamTR);
1530 
1531  //AJ calling a cudaDeviceSyncrhonize to be sure that these images are loaded in gpu memory
1532  // and available for all the streams
1533  waitGpu(myStreamTR, true);
1534 
1535  //EXPERIMENTAL IMAGES PART
1536  size_t expIndex = 0;
1537  FileName fnImgExp;
1538  auto iterExp = SF.begin();
1539 
1540  GpuCorrelationAux d_experimentalAuxTR, d_experimentalAuxRT;
1541  d_experimentalAuxTR.XdimOrig=d_referenceAux.XdimOrig;
1542  d_experimentalAuxTR.YdimOrig=d_referenceAux.YdimOrig;
1543  d_experimentalAuxTR.Xdim=d_referenceAux.Xdim;
1544  d_experimentalAuxTR.Ydim=d_referenceAux.Ydim;
1545  d_experimentalAuxTR.XdimPolar=d_referenceAux.XdimPolar;
1546  d_experimentalAuxTR.YdimPolar=d_referenceAux.YdimPolar;
1547 
1548  d_experimentalAuxRT.XdimOrig=d_referenceAux.XdimOrig;
1549  d_experimentalAuxRT.YdimOrig=d_referenceAux.YdimOrig;
1550  d_experimentalAuxRT.Xdim=d_referenceAux.Xdim;
1551  d_experimentalAuxRT.Ydim=d_referenceAux.Ydim;
1552  d_experimentalAuxRT.XdimPolar=d_referenceAux.XdimPolar;
1553  d_experimentalAuxRT.YdimPolar=d_referenceAux.YdimPolar;
1554 
1555  //TODO: here we can use threads to carry out the alignment of different images in different threads
1556  size_t n=0;
1557  int available_images_exp = mdInSize; //mdExpSize
1558  while(available_images_exp && (*iterExp).id()!=0){
1559 
1560  transMat_tr.initialize(myStreamTR);
1561  transMat_rt.initialize(myStreamRT);
1562  transMat_tr_mirror.initialize(myStreamTR);
1563  transMat_rt_mirror.initialize(myStreamRT);
1564 
1565  for(int i=0; i<available_images_proj; i++){
1566  max_vector_tr[i]=-1;
1567  max_vector_rt[i]=-1;
1568  max_vector_tr_mirror[i]=-1;
1569  max_vector_rt_mirror[i]=-1;
1570  }
1571 
1572  available_images_exp--;
1573 
1574  MDRow& rowExp = *iterExp;
1575  rowExp.getValue(MDL_IMAGE, fnImgExp);
1576  //std::cerr << expIndex << ". Image: " << fnImgExp << std::endl;
1577 
1578  //AJ calling the function to align the images
1579  bool mirror=false;
1580  //SFexp
1581  align_experimental_image(fnImgExp, d_referenceAux, d_experimentalAuxTR, d_experimentalAuxRT, transMat_tr, transMat_rt,
1582  max_vector_tr, max_vector_rt, SF, available_images_proj, mirror, maxShift,
1583  myhandlePadded_tr, myhandleMask_tr, myhandlePolar_tr, myhandlePaddedB_tr, myhandleMaskB_tr, myhandlePolarB_tr,
1584  myhandlePadded_rt, myhandleMask_rt, myhandlePolar_rt, myhandlePaddedB_rt, myhandleMaskB_rt, myhandlePolarB_rt,
1585  myStructureAux_tr, myStructureAux_rt, myStreamTR, myStreamRT,
1586  resultTR, resultRT, original_image_stack, ifftcb);
1587 
1588 
1589  mirror=true;
1590  //SFexp
1591  align_experimental_image(fnImgExp, d_referenceAux, d_experimentalAuxTR, d_experimentalAuxRT, transMat_tr_mirror, transMat_rt_mirror,
1592  max_vector_tr_mirror, max_vector_rt_mirror, SF, available_images_proj, mirror, maxShift,
1593  myhandlePadded_tr, myhandleMask_tr, myhandlePolar_tr, myhandlePaddedB_tr, myhandleMaskB_tr, myhandlePolarB_tr,
1594  myhandlePadded_rt, myhandleMask_rt, myhandlePolar_rt, myhandlePaddedB_rt, myhandleMaskB_rt, myhandlePolarB_rt,
1595  myStructureAux_tr, myStructureAux_rt, myStreamTR, myStreamRT,
1596  resultTR, resultRT, original_image_stack, ifftcb);
1597 
1598  //AJ to check the best transformation among all the evaluated
1599  transMat_tr.copyMatrixToCpu(myStreamTR);
1600  transMat_tr_mirror.copyMatrixToCpu(myStreamRT);
1601  transMat_rt.copyMatrixToCpu(myStreamTR);
1602  transMat_rt_mirror.copyMatrixToCpu(myStreamRT);
1603 
1604  waitGpu(myStreamTR, false);
1605  waitGpu(myStreamRT, false);
1606 
1607  MultidimArray<float> out2(3,3);
1608  for(int i=0; i<available_images_proj; i++){
1609  if(max_vector_tr[i]>max_vector_rt[i]){
1610  memcpy(MULTIDIM_ARRAY(out2), &transMat_tr.h_data[i*9], 9*sizeof(float));
1611  matrixTransCpu[n].setSlice(firstIdx+i, out2);
1612  A2D_ELEM(matrixCorrCpu, n, firstIdx+i) = max_vector_tr[i];
1613  }else{
1614  memcpy(MULTIDIM_ARRAY(out2), &transMat_rt.h_data[i*9], 9*sizeof(float));
1615  matrixTransCpu[n].setSlice(firstIdx+i, out2);
1616  A2D_ELEM(matrixCorrCpu, n, firstIdx+i) = max_vector_rt[i];
1617  }
1618  //mirror image
1619  if(max_vector_tr_mirror[i]>max_vector_rt_mirror[i]){
1620  memcpy(MULTIDIM_ARRAY(out2), &transMat_tr_mirror.h_data[i*9], 9*sizeof(float));
1621  matrixTransCpu_mirror[n].setSlice(firstIdx+i, out2);
1622  A2D_ELEM(matrixCorrCpu_mirror, n, firstIdx+i) = max_vector_tr_mirror[i];
1623  }else{
1624  memcpy(MULTIDIM_ARRAY(out2), &transMat_rt_mirror.h_data[i*9], 9*sizeof(float));
1625  matrixTransCpu_mirror[n].setSlice(firstIdx+i, out2);
1626  A2D_ELEM(matrixCorrCpu_mirror, n, firstIdx+i) = max_vector_rt_mirror[i];
1627  }
1628  }
1629 
1630  if(iterExp != SF.end())
1631  ++iterExp;
1632 
1633  n++;
1634  workDone+=available_images_proj;
1635  if (size_t(workDone/100)>lastProgressShown)
1636  {
1637  progress_bar(workDone);
1638  lastProgressShown=size_t(workDone/100);
1639  }
1640  }//end while experimental images
1641 
1642  firstIdx +=available_images_proj;
1643  int aux;
1644  aux=available_images_proj;
1645  if(firstIdx+available_images_proj > mdExpSize){ //mdInSize
1646  aux=available_images_proj;
1647  available_images_proj=mdExpSize-firstIdx; //mdInSize
1648  }
1649  if(firstIdx==mdExpSize){ //mdInSize
1650  finish=true;
1651  }
1652  if(aux!=available_images_proj){
1653  myhandlePadded_tr.clear();
1654  myhandleMask_tr.clear();
1655  myhandlePolar_tr.clear();
1656  myhandlePaddedB_tr.clear();
1657  myhandleMaskB_tr.clear();
1658  myhandlePolarB_tr.clear();
1659 
1660  myhandlePadded_rt.clear();
1661  myhandleMask_rt.clear();
1662  myhandlePolar_rt.clear();
1663  myhandlePaddedB_rt.clear();
1664  myhandleMaskB_rt.clear();
1665  myhandlePolarB_rt.clear();
1666  }
1667 
1668 
1669  }//End loop over the reference images while(!finish)
1670  progress_bar(totalWork);
1671 
1672  myhandlePadded_tr.clear();
1673  myhandleMask_tr.clear();
1674  myhandlePolar_tr.clear();
1675  myhandlePaddedB_tr.clear();
1676  myhandleMaskB_tr.clear();
1677  myhandlePolarB_tr.clear();
1678 
1679  myhandlePadded_rt.clear();
1680  myhandleMask_rt.clear();
1681  myhandlePolar_rt.clear();
1682  myhandlePaddedB_rt.clear();
1683  myhandleMaskB_rt.clear();
1684  myhandlePolarB_rt.clear();
1685 
1686  MultidimArray<float> weights(1,1,mdExpSize,2*mdInSize);
1687  MultidimArray<float> weightsMax;
1688  MultidimArray<float> corrTotalRow(1,1,mdExpSize, 2*mdInSize);
1689  int Nref;
1690  if(keepN){
1691  Nref=n_keep;
1692  }else if(significance){
1693  Nref=round(corrTotalRow.xdim*alpha);
1694  if(Nref==0)
1695  Nref=1;
1696  }
1697 
1698 
1699  calculate_weights(matrixCorrCpu, matrixCorrCpu_mirror, corrTotalRow, weights, Nref, mdExpSize, mdInSize, weightsMax, simplifiedMd,
1700  matrixTransCpu, matrixTransCpu_mirror, maxShift);
1701 
1702  std::cerr << "Creating output metadatas..." << std::endl;
1703 
1704  generate_metadata(SF, SFexp, fnDir, fn_out, mdExpSize, mdInSize, weights, corrTotalRow, matrixTransCpu,
1705  matrixTransCpu_mirror, maxShift, weightsMax, simplifiedMd, Nref);
1706 
1707  if(generate_out)
1708  generate_output_classes(SF, SFexp, fnDir, mdExpSize, mdInSize, weights, matrixTransCpu,
1709  matrixTransCpu_mirror, maxShift, fn_classes_out, weightsMax, simplifiedMd, Nref);
1710 
1711  //Free memory in CPU
1712  for(int i=0; i<mdInSize; i++) //mdExpSize
1713  matrixTransCpu[i].coreDeallocate();
1714  delete []matrixTransCpu;
1715  for(int i=0; i<mdInSize; i++) //mdExpSize
1716  matrixTransCpu_mirror[i].coreDeallocate();
1717  delete []matrixTransCpu_mirror;
1718 
1719  cpuFree(max_vector_tr);
1720  cpuFree(max_vector_rt);
1721  cpuFree(max_vector_tr_mirror);
1722  cpuFree(max_vector_rt_mirror);
1723 
1724 
1725 
1726 }
void selfApplyGeometry(int Splinedegree, MultidimArray< std::complex< double > > &V1, const Matrix2D< double > &A, bool inv, bool wrap, std::complex< double > outside)
void cuda_calculate_correlation(GpuCorrelationAux &referenceAux, GpuCorrelationAux &experimentalAux, TransformMatrix< float > &transMat, float *max_vector, int maxShift, mycufftHandle &myhandlePadded, bool mirror, StructuresAux &myStructureAux, myStreamHandle &myStream, TransformMatrix< float > &resultTR, bool saveMaxVector)
void init_progress_bar(long total)
Rotation angle of an image (double,degrees)
void min(Image< double > &op1, const Image< double > &op2)
#define A2D_ELEM(v, i, j)
void resize(const GpuMultidimArrayAtGpu< T1 > &array)
GpuMultidimArrayAtGpu< float > polar2_gpu
void defineParams()
Define parameters.
void sort(const MetaDataVec &MDin, const MDLabel sortLabel, bool asc=true, int limit=-1, int offset=0)
double getDoubleParam(const char *param, int arg=0)
virtual void read(int argc, const char **argv, bool reportErrors=true)
__host__ __device__ float2 floor(const float2 v)
void read(const FileName &inFile, const std::vector< MDLabel > *desiredLabels=nullptr, bool decomposeStack=true) override
iterator begin() override
Definition: metadata_vec.h:501
void getSlice(int k, MultidimArray< T1 > &M, char axis='Z', bool reverse=false, size_t n=0) const
void transformationMatrix2Parameters2D(const Matrix2D< T > &A, bool &flip, T &scale, T &shiftX, T &shiftY, T &psi)
iterator end() override
Definition: metadata_vec.h:504
void generate_output_classes(MetaDataVec SF, MetaDataVec SFexp, FileName fnDir, size_t mdExpSize, size_t mdInSize, MultidimArray< float > &weights, MultidimArray< float > *matrixTransCpu, MultidimArray< float > *matrixTransCpu_mirror, int maxShift, FileName fn_classes_out, MultidimArray< float > &weightsMax, bool simplifiedMd, int Nref)
void padding_masking(GpuMultidimArrayAtGpu< float > &d_orig_image, GpuMultidimArrayAtGpu< float > &mask, GpuMultidimArrayAtGpu< float > &padded_image_gpu, GpuMultidimArrayAtGpu< float > &padded_image2_gpu, GpuMultidimArrayAtGpu< float > &padded_mask_gpu, bool experimental, myStreamHandle &myStream)
void preprocess_images_experimental(MetaDataVec &SF, FileName &fnImg, int numImagesRef, GpuMultidimArrayAtGpu< float > &mask, GpuMultidimArrayAtGpu< std::complex< float > > &d_maskFFT, GpuCorrelationAux &d_correlationAux, bool rotation, int firstStep, bool mirror, mycufftHandle &myhandlePadded, mycufftHandle &myhandlePolar, StructuresAux &myStructureAux, myStreamHandle myStream)
void apply_transform(GpuMultidimArrayAtGpu< float > &d_original_image, GpuMultidimArrayAtGpu< float > &d_transform_image, TransformMatrix< float > &transMat, myStreamHandle &myStream)
GpuMultidimArrayAtGpu< std::complex< float > > d_projPolarSquaredFFT
void copyToGpu(GpuMultidimArrayAtGpu< T > &gpuArray, myStreamHandle &myStream)
Definition: mask.h:360
void sqrt(Image< double > &op)
Tilting angle of an image (double,degrees)
void preprocess_images_experimental_transform(GpuCorrelationAux &d_correlationAux, GpuMultidimArrayAtGpu< float > &mask, GpuMultidimArrayAtGpu< std::complex< float > > &d_maskFFT, bool rotation, mycufftHandle &myhandlePadded, mycufftHandle &myhandlePolar, StructuresAux &myStructureAux, myStreamHandle myStream)
void setValue(const MDObject &object) override
Shift for the image in the X axis (double)
#define DIRECT_A2D_ELEM(v, i, j)
void getImageSize(const MetaData &md, size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim, MDLabel image_label)
void preprocess_images_reference(MetaDataVec &SF, int firstIdx, int numImages, Mask &mask, GpuCorrelationAux &d_correlationAux, mycufftHandle &myhandlePadded, mycufftHandle &myhandleMask, mycufftHandle &myhandlePolar, StructuresAux &myStructureAux, MetaDataVec::id_iterator iter, myStreamHandle myStream)
#define MULTIDIM_ARRAY(v)
void resize(size_t Xdim)
Definition: mask.cpp:654
void fillImage(int n, const MultidimArray< T > &from)
void compose(const String &str, const size_t no, const String &ext="")
void inv(Matrix2D< T > &result) const
Definition: matrix2d.cpp:663
Special label to be used when gathering MDs in MpiMetadataPrograms.
void write(const FileName &outFile, WriteModeMetaData mode=MD_OVERWRITE) const
void calculate_weights(MultidimArray< float > &matrixCorrCpu, MultidimArray< float > &matrixCorrCpu_mirror, MultidimArray< float > &corrTotalRow, MultidimArray< float > &weights, int Nref, size_t mdExpSize, size_t mdInSize, MultidimArray< float > &weightsMax, bool simplifiedMd, MultidimArray< float > *matrixTransCpu, MultidimArray< float > *matrixTransCpu_mirror, int maxShift)
void preprocess_images_experimental_transform_two(MetaDataVec &SF, FileName &fnImg, int numImagesRef, GpuMultidimArrayAtGpu< float > &mask, GpuMultidimArrayAtGpu< std::complex< float > > &d_maskFFT, GpuCorrelationAux &d_correlationAuxOne, GpuCorrelationAux &d_correlationAuxTwo, mycufftHandle &myhandlePaddedOne, mycufftHandle &myhandlePolarTwo, StructuresAux &myStructureAuxOne, StructuresAux &myStructureAuxTwo, myStreamHandle &myStreamOne, myStreamHandle &myStreamTwo, int step)
void getCol(size_t j, MultidimArray< T > &v) const
void resize(const TransformMatrix< T1 > &array, myStreamHandle &myStream)
glob_prnt iter
virtual IdIteratorProxy< false > ids()
void readParams()
Read argument from command line.
GpuMultidimArrayAtGpu< float > padded_mask_gpu
size_t size() const override
#define i
GpuMultidimArrayAtGpu< float > padded_image2_gpu
size_t addRow(const MDRow &row) override
Unique identifier for items inside a list or set (std::size_t)
void align_experimental_image(FileName &fnImgExp, GpuCorrelationAux &d_referenceAux, GpuCorrelationAux &d_experimentalAuxTR, GpuCorrelationAux &d_experimentalAuxRT, TransformMatrix< float > &transMat_tr, TransformMatrix< float > &transMat_rt, float *max_vector_tr, float *max_vector_rt, MetaDataVec &SFexp, int available_images_proj, bool mirror, int maxShift, mycufftHandle &myhandlePadded_tr, mycufftHandle &myhandleMask_tr, mycufftHandle &myhandlePolar_tr, mycufftHandle &myhandlePaddedB_tr, mycufftHandle &myhandleMaskB_tr, mycufftHandle &myhandlePolarB_tr, mycufftHandle &myhandlePadded_rt, mycufftHandle &myhandleMask_rt, mycufftHandle &myhandlePolar_rt, mycufftHandle &myhandlePaddedB_rt, mycufftHandle &myhandleMaskB_rt, mycufftHandle &myhandlePolarB_rt, StructuresAux &myStructureAux_tr, StructuresAux &myStructureAux_rt, myStreamHandle &myStreamTR, myStreamHandle &myStreamRT, TransformMatrix< float > &resultTR, TransformMatrix< float > &resultRT, GpuMultidimArrayAtCpu< float > &original_image_stack, mycufftHandle &ifftcb)
GpuMultidimArrayAtGpu< float > polar_gpu
Matrix2D< double > centerImage(MultidimArray< double > &I, CorrelationAux &aux, RotationalCorrelationAux &aux2, int Niter, bool limitShift)
Definition: filters.cpp:3277
GpuMultidimArrayAtGpu< float > maskAutocorrelation
#define MAT_ELEM(m, i, j)
Definition: matrix2d.h:116
GpuMultidimArrayAtGpu< std::complex< float > > d_projFFT
T & getValue(MDLabel label)
GpuMultidimArrayAtGpu< float > d_transform_image
const char * getParam(const char *param, int arg=0)
void cuda_calculate_correlation_two(GpuCorrelationAux &referenceAux, GpuCorrelationAux &experimentalAuxTR, TransformMatrix< float > &transMatTR, float *max_vectorTR, int maxShift, mycufftHandle &myhandlePaddedTR, bool mirror, StructuresAux &myStructureAuxTR, myStreamHandle &myStreamTR, GpuCorrelationAux &experimentalAuxRT, TransformMatrix< float > &transMatRT, float *max_vectorRT, mycufftHandle &myhandlePaddedRT, StructuresAux &myStructureAuxRT, myStreamHandle &myStreamRT, TransformMatrix< float > &resultTR, TransformMatrix< float > &resultRT, mycufftHandle &ifftcb, bool saveMaxVector)
void cuda_check_gpu_memory(float *data)
GpuMultidimArrayAtGpu< std::complex< float > > d_projPolarFFT
bool setValue(const MDObject &mdValueIn, size_t id)
size_t addObject() override
void copyMatrixToCpu(myStreamHandle &myStream)
FileName fnOut
void resize(int _Xdim, int _Ydim=1, int _Zdim=1, int _Ndim=1)
double R1
Definition: mask.h:413
Flip the image? (bool)
void setCol(size_t j, const MultidimArray< T > &v)
GpuMultidimArrayAtGpu< float > d_original_image
void progress_bar(long rlen)
int type
Definition: mask.h:402
void copyToGpuStream(T *data, myStreamHandle &myStream)
double z
void myStreamCreate(myStreamHandle &myStream)
void cuda_cart2polar(GpuMultidimArrayAtGpu< float > &image, GpuMultidimArrayAtGpu< float > &polar_image, GpuMultidimArrayAtGpu< float > &polar2_image, bool rotate, myStreamHandle &myStream)
Maximum cross-correlation for the image (double)
void cpuFree(void *h_data)
int check_gpu_memory(size_t Xdim, size_t Ydim, int percent)
bool exists() const
void generate_metadata(MetaDataVec SF, MetaDataVec SFexp, FileName fnDir, FileName fn_out, size_t mdExpSize, size_t mdInSize, MultidimArray< float > &weights, MultidimArray< float > &corrTotalRow, MultidimArray< float > *matrixTransCpu, MultidimArray< float > *matrixTransCpu_mirror, int maxShift, MultidimArray< float > &weightsMax, bool simplifiedMd, int Nref)
void set()
Definition: gpu.cpp:50
void initialize(myStreamHandle &myStream)
GpuMultidimArrayAtGpu< std::complex< float > > d_projSquaredFFT
#define j
void deleteFile() const
void getRow(size_t i, MultidimArray< T > &v) const
void produceSideInfo(mycufftHandle &myhandlePadded, mycufftHandle &myhandleMask, StructuresAux &myStructureAux, myStreamHandle &myStream)
bool getValue(MDObject &mdValueOut, size_t id) const override
Class to which the image belongs (int)
void fftStream(GpuMultidimArrayAtGpu< std::complex< float >> &fourierTransform, mycufftHandle &myhandle, myStreamHandle &myStream, bool useCallback, GpuMultidimArrayAtGpu< std::complex< float >> &dataRef)
void generate_mask(bool apply_geo=false)
Definition: mask.cpp:1577
int round(double x)
Definition: ap.cpp:7245
Number of images assigned to the same class as this image.
virtual bool containsLabel(MDLabel label) const =0
FileName withoutExtension() const
void typeCast(const Matrix1D< T1 > &v1, Matrix1D< T2 > &v2)
Definition: matrix1d.h:1227
#define BINARY_CIRCULAR_MASK
Definition: mask.h:365
std::string String
Definition: xmipp_strings.h:34
double psi(const double x)
void cuda_check_gpu_properties(int *grid)
void preprocess_images_experimental_two(MetaDataVec &SF, FileName &fnImg, int numImagesRef, GpuMultidimArrayAtGpu< float > &mask, GpuMultidimArrayAtGpu< std::complex< float > > &d_maskFFT, GpuCorrelationAux &d_correlationAuxTR, GpuCorrelationAux &d_correlationAuxRT, int firstStep, bool mirror, mycufftHandle &myhandlePaddedTR, mycufftHandle &myhandleMaskTR, mycufftHandle &myhandlePolarRT, StructuresAux &myStructureAuxTR, StructuresAux &myStructureAuxRT, myStreamHandle &myStreamTR, myStreamHandle &myStreamRT, GpuMultidimArrayAtCpu< float > &original_image_stack)
String formatString(const char *format,...)
void cpuMalloc(void **h_data, size_t Nbytes)
bool checkParam(const char *param)
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
void primeFactors(int n, int *out)
Shift for the image in the Y axis (double)
void addUsageLine(const char *line, bool verbatim=false)
void initZeros(const MultidimArray< T1 > &op)
const MultidimArray< int > & get_binary_mask() const
Definition: mask.h:707
int getIntParam(const char *param, int arg=0)
GpuMultidimArrayAtGpu< std::complex< float > > d_maskFFT
GpuMultidimArrayAtGpu< float > d_mask
int * n
Name of an image (std::string)
double sum() const
void setRow(int i, const MultidimArray< T > &v)
void indexSort(MultidimArray< int > &indx) const
void addParamsLine(const String &line)
int mode
Definition: mask.h:407
GpuMultidimArrayAtGpu< float > padded_image_gpu
< Score 4 for volumes
void waitGpu(myStreamHandle &myStream, bool allStreams)
constexpr int INNER_MASK
Definition: mask.h:47