Xmipp  v3.23.11-Nereus
Functions
xmipp_gpu_correlation.cpp File Reference
#include "xmipp_gpu_correlation.h"
#include <core/xmipp_image.h>
#include <data/mask.h>
#include <core/xmipp_fftw.h>
#include <core/transformations.h>
#include <core/metadata_extension.h>
#include <data/filters.h>
#include <core/xmipp_funcs.h>
#include "xmipp_gpu_utils.h"
#include <reconstruction_cuda/cuda_gpu_correlation.h>
#include <algorithm>
#include <math.h>
#include <time.h>
#include <sys/time.h>
Include dependency graph for xmipp_gpu_correlation.cpp:

Go to the source code of this file.

Functions

void primeFactors (int n, int *out)
 
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)
 
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 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)
 
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 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 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)
 
int check_gpu_memory (size_t Xdim, size_t Ydim, int percent)
 
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 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 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)
 

Function Documentation

◆ align_experimental_image()

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 
)

Definition at line 355 of file xmipp_gpu_correlation.cpp.

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 }
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 resize(const GpuMultidimArrayAtGpu< T1 > &array)
void apply_transform(GpuMultidimArrayAtGpu< float > &d_original_image, GpuMultidimArrayAtGpu< float > &d_transform_image, TransformMatrix< float > &transMat, myStreamHandle &myStream)
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 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)
GpuMultidimArrayAtGpu< float > maskAutocorrelation
GpuMultidimArrayAtGpu< float > d_transform_image
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)
GpuMultidimArrayAtGpu< float > d_original_image
void produceSideInfo(mycufftHandle &myhandlePadded, mycufftHandle &myhandleMask, StructuresAux &myStructureAux, myStreamHandle &myStream)
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)
GpuMultidimArrayAtGpu< std::complex< float > > d_maskFFT
GpuMultidimArrayAtGpu< float > d_mask

◆ calculate_weights()

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 
)

Definition at line 563 of file xmipp_gpu_correlation.cpp.

565  {
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 }
void getSlice(int k, MultidimArray< T1 > &M, char axis='Z', bool reverse=false, size_t n=0) const
#define DIRECT_A2D_ELEM(v, i, j)
void getCol(size_t j, MultidimArray< T > &v) const
#define i
#define MAT_ELEM(m, i, j)
Definition: matrix2d.h:116
void setCol(size_t j, const MultidimArray< T > &v)
#define j
void getRow(size_t i, MultidimArray< T > &v) const
void indexSort(MultidimArray< int > &indx) const

◆ check_gpu_memory()

int check_gpu_memory ( size_t  Xdim,
size_t  Ydim,
int  percent 
)

Definition at line 555 of file xmipp_gpu_correlation.cpp.

555  {
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 }
void cuda_check_gpu_memory(float *data)

◆ generate_metadata()

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 
)

Definition at line 736 of file xmipp_gpu_correlation.cpp.

738  {
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 }
Rotation angle of an image (double,degrees)
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
Tilting angle of an image (double,degrees)
Shift for the image in the X axis (double)
#define DIRECT_A2D_ELEM(v, i, j)
Special label to be used when gathering MDs in MpiMetadataPrograms.
void write(const FileName &outFile, WriteModeMetaData mode=MD_OVERWRITE) const
glob_prnt iter
#define i
size_t addRow(const MDRow &row) override
Unique identifier for items inside a list or set (std::size_t)
#define MAT_ELEM(m, i, j)
Definition: matrix2d.h:116
Flip the image? (bool)
Maximum cross-correlation for the image (double)
#define j
Class to which the image belongs (int)
std::string String
Definition: xmipp_strings.h:34
double psi(const double x)
String formatString(const char *format,...)
Shift for the image in the Y axis (double)
< Score 4 for volumes

◆ generate_output_classes()

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 
)

Definition at line 871 of file xmipp_gpu_correlation.cpp.

873  {
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 }
void selfApplyGeometry(int Splinedegree, MultidimArray< std::complex< double > > &V1, const Matrix2D< double > &A, bool inv, bool wrap, std::complex< double > outside)
Rotation angle of an image (double,degrees)
void min(Image< double > &op1, const Image< double > &op2)
void sort(const MetaDataVec &MDin, const MDLabel sortLabel, bool asc=true, int limit=-1, int offset=0)
iterator begin() override
Definition: metadata_vec.h:501
void transformationMatrix2Parameters2D(const Matrix2D< T > &A, bool &flip, T &scale, T &shiftX, T &shiftY, T &psi)
iterator end() override
Definition: metadata_vec.h:504
Definition: mask.h:360
Tilting angle of an image (double,degrees)
void setValue(const MDObject &object) override
Shift for the image in the X axis (double)
#define DIRECT_A2D_ELEM(v, i, j)
void write(const FileName &name="", size_t select_img=ALL_IMAGES, bool isStack=false, int mode=WRITE_OVERWRITE, CastWriteMode castMode=CW_CAST, int _swapWrite=0)
void getImageSize(const MetaData &md, size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim, MDLabel image_label)
void resize(size_t Xdim)
Definition: mask.cpp:654
void compose(const String &str, const size_t no, const String &ext="")
Special label to be used when gathering MDs in MpiMetadataPrograms.
void write(const FileName &outFile, WriteModeMetaData mode=MD_OVERWRITE) const
#define i
size_t addRow(const MDRow &row) override
Unique identifier for items inside a list or set (std::size_t)
Matrix2D< double > centerImage(MultidimArray< double > &I, CorrelationAux &aux, RotationalCorrelationAux &aux2, int Niter, bool limitShift)
Definition: filters.cpp:3277
#define MAT_ELEM(m, i, j)
Definition: matrix2d.h:116
void apply_mask(const MultidimArray< T > &I, MultidimArray< T > &result, T subs_val=0, bool apply_geo=false)
Definition: mask.h:635
T & getValue(MDLabel label)
bool setValue(const MDObject &mdValueIn, size_t id)
size_t addObject() override
FileName fnOut
double R1
Definition: mask.h:413
int type
Definition: mask.h:402
bool exists() const
#define j
void deleteFile() const
Class to which the image belongs (int)
void generate_mask(bool apply_geo=false)
Definition: mask.cpp:1577
Number of images assigned to the same class as this image.
virtual bool containsLabel(MDLabel label) const =0
FileName withoutExtension() const
#define BINARY_CIRCULAR_MASK
Definition: mask.h:365
double psi(const double x)
String formatString(const char *format,...)
Shift for the image in the Y axis (double)
const MultidimArray< int > & get_binary_mask() const
Definition: mask.h:707
file read(std::istream &is)
Definition: pdb2cif.cpp:6200
Name of an image (std::string)
int mode
Definition: mask.h:407
constexpr int INNER_MASK
Definition: mask.h:47

◆ preprocess_images_experimental()

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 
)

Definition at line 152 of file xmipp_gpu_correlation.cpp.

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 }
GpuMultidimArrayAtGpu< float > polar2_gpu
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)
GpuMultidimArrayAtGpu< std::complex< float > > d_projPolarSquaredFFT
void getImageSize(const MetaData &md, size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim, MDLabel image_label)
GpuMultidimArrayAtGpu< float > padded_mask_gpu
#define i
GpuMultidimArrayAtGpu< float > padded_image2_gpu
GpuMultidimArrayAtGpu< float > polar_gpu
GpuMultidimArrayAtGpu< std::complex< float > > d_projFFT
GpuMultidimArrayAtGpu< std::complex< float > > d_projPolarFFT
GpuMultidimArrayAtGpu< float > d_original_image
void cuda_cart2polar(GpuMultidimArrayAtGpu< float > &image, GpuMultidimArrayAtGpu< float > &polar_image, GpuMultidimArrayAtGpu< float > &polar2_image, bool rotate, myStreamHandle &myStream)
GpuMultidimArrayAtGpu< std::complex< float > > d_projSquaredFFT
void fftStream(GpuMultidimArrayAtGpu< std::complex< float >> &fourierTransform, mycufftHandle &myhandle, myStreamHandle &myStream, bool useCallback, GpuMultidimArrayAtGpu< std::complex< float >> &dataRef)
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
void copyGpuToGpuStream(GpuMultidimArrayAtGpu< T > &gpuArray, myStreamHandle &myStream)
GpuMultidimArrayAtGpu< std::complex< float > > d_maskFFT
GpuMultidimArrayAtGpu< float > padded_image_gpu

◆ preprocess_images_experimental_transform()

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 
)

Definition at line 317 of file xmipp_gpu_correlation.cpp.

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 }
GpuMultidimArrayAtGpu< float > polar2_gpu
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)
GpuMultidimArrayAtGpu< std::complex< float > > d_projPolarSquaredFFT
GpuMultidimArrayAtGpu< float > padded_mask_gpu
GpuMultidimArrayAtGpu< float > padded_image2_gpu
GpuMultidimArrayAtGpu< float > polar_gpu
GpuMultidimArrayAtGpu< std::complex< float > > d_projFFT
GpuMultidimArrayAtGpu< float > d_transform_image
GpuMultidimArrayAtGpu< std::complex< float > > d_projPolarFFT
void cuda_cart2polar(GpuMultidimArrayAtGpu< float > &image, GpuMultidimArrayAtGpu< float > &polar_image, GpuMultidimArrayAtGpu< float > &polar2_image, bool rotate, myStreamHandle &myStream)
GpuMultidimArrayAtGpu< std::complex< float > > d_projSquaredFFT
void fftStream(GpuMultidimArrayAtGpu< std::complex< float >> &fourierTransform, mycufftHandle &myhandle, myStreamHandle &myStream, bool useCallback, GpuMultidimArrayAtGpu< std::complex< float >> &dataRef)
void copyGpuToGpuStream(GpuMultidimArrayAtGpu< T > &gpuArray, myStreamHandle &myStream)
GpuMultidimArrayAtGpu< std::complex< float > > d_maskFFT
GpuMultidimArrayAtGpu< float > padded_image_gpu

◆ preprocess_images_experimental_transform_two()

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 
)

Definition at line 276 of file xmipp_gpu_correlation.cpp.

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 }
void resize(const GpuMultidimArrayAtGpu< T1 > &array)
GpuMultidimArrayAtGpu< float > polar2_gpu
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)
GpuMultidimArrayAtGpu< std::complex< float > > d_projPolarSquaredFFT
GpuMultidimArrayAtGpu< float > padded_mask_gpu
GpuMultidimArrayAtGpu< float > padded_image2_gpu
GpuMultidimArrayAtGpu< float > polar_gpu
GpuMultidimArrayAtGpu< std::complex< float > > d_projFFT
GpuMultidimArrayAtGpu< float > d_transform_image
GpuMultidimArrayAtGpu< std::complex< float > > d_projPolarFFT
void cuda_cart2polar(GpuMultidimArrayAtGpu< float > &image, GpuMultidimArrayAtGpu< float > &polar_image, GpuMultidimArrayAtGpu< float > &polar2_image, bool rotate, myStreamHandle &myStream)
GpuMultidimArrayAtGpu< std::complex< float > > d_projSquaredFFT
void fftStream(GpuMultidimArrayAtGpu< std::complex< float >> &fourierTransform, mycufftHandle &myhandle, myStreamHandle &myStream, bool useCallback, GpuMultidimArrayAtGpu< std::complex< float >> &dataRef)
void copyGpuToGpuStream(GpuMultidimArrayAtGpu< T > &gpuArray, myStreamHandle &myStream)
GpuMultidimArrayAtGpu< std::complex< float > > d_maskFFT
GpuMultidimArrayAtGpu< float > padded_image_gpu

◆ preprocess_images_experimental_two()

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 
)

Definition at line 207 of file xmipp_gpu_correlation.cpp.

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 }
void resize(const GpuMultidimArrayAtGpu< T1 > &array)
GpuMultidimArrayAtGpu< float > polar2_gpu
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)
GpuMultidimArrayAtGpu< std::complex< float > > d_projPolarSquaredFFT
void copyToGpu(GpuMultidimArrayAtGpu< T > &gpuArray, myStreamHandle &myStream)
void getImageSize(const MetaData &md, size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim, MDLabel image_label)
void fillImage(int n, const MultidimArray< T > &from)
GpuMultidimArrayAtGpu< float > padded_mask_gpu
#define i
GpuMultidimArrayAtGpu< float > padded_image2_gpu
GpuMultidimArrayAtGpu< float > polar_gpu
GpuMultidimArrayAtGpu< std::complex< float > > d_projFFT
GpuMultidimArrayAtGpu< std::complex< float > > d_projPolarFFT
void resize(int _Xdim, int _Ydim=1, int _Zdim=1, int _Ndim=1)
GpuMultidimArrayAtGpu< float > d_original_image
void cuda_cart2polar(GpuMultidimArrayAtGpu< float > &image, GpuMultidimArrayAtGpu< float > &polar_image, GpuMultidimArrayAtGpu< float > &polar2_image, bool rotate, myStreamHandle &myStream)
GpuMultidimArrayAtGpu< std::complex< float > > d_projSquaredFFT
void fftStream(GpuMultidimArrayAtGpu< std::complex< float >> &fourierTransform, mycufftHandle &myhandle, myStreamHandle &myStream, bool useCallback, GpuMultidimArrayAtGpu< std::complex< float >> &dataRef)
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
void copyGpuToGpuStream(GpuMultidimArrayAtGpu< T > &gpuArray, myStreamHandle &myStream)
GpuMultidimArrayAtGpu< std::complex< float > > d_maskFFT
GpuMultidimArrayAtGpu< float > padded_image_gpu

◆ preprocess_images_reference()

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 
)

Definition at line 90 of file xmipp_gpu_correlation.cpp.

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 }
void resize(const GpuMultidimArrayAtGpu< T1 > &array)
GpuMultidimArrayAtGpu< float > polar2_gpu
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)
GpuMultidimArrayAtGpu< std::complex< float > > d_projPolarSquaredFFT
void getImageSize(const MetaData &md, size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim, MDLabel image_label)
#define MULTIDIM_ARRAY(v)
virtual IdIteratorProxy< false > ids()
GpuMultidimArrayAtGpu< float > padded_mask_gpu
#define i
GpuMultidimArrayAtGpu< float > padded_image2_gpu
GpuMultidimArrayAtGpu< float > polar_gpu
GpuMultidimArrayAtGpu< std::complex< float > > d_projFFT
GpuMultidimArrayAtGpu< std::complex< float > > d_projPolarFFT
void copyToGpuStream(T *data, myStreamHandle &myStream)
void cuda_cart2polar(GpuMultidimArrayAtGpu< float > &image, GpuMultidimArrayAtGpu< float > &polar_image, GpuMultidimArrayAtGpu< float > &polar2_image, bool rotate, myStreamHandle &myStream)
GpuMultidimArrayAtGpu< std::complex< float > > d_projSquaredFFT
bool getValue(MDObject &mdValueOut, size_t id) const override
void fftStream(GpuMultidimArrayAtGpu< std::complex< float >> &fourierTransform, mycufftHandle &myhandle, myStreamHandle &myStream, bool useCallback, GpuMultidimArrayAtGpu< std::complex< float >> &dataRef)
void typeCast(const Matrix1D< T1 > &v1, Matrix1D< T2 > &v2)
Definition: matrix1d.h:1227
void cpuMalloc(void **h_data, size_t Nbytes)
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
const MultidimArray< int > & get_binary_mask() const
Definition: mask.h:707
GpuMultidimArrayAtGpu< std::complex< float > > d_maskFFT
GpuMultidimArrayAtGpu< float > d_mask
int * n
Name of an image (std::string)
GpuMultidimArrayAtGpu< float > padded_image_gpu

◆ primeFactors()

void primeFactors ( int  n,
int *  out 
)

Definition at line 49 of file xmipp_gpu_correlation.cpp.

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 }
void sqrt(Image< double > &op)
#define i
int * n