62 for (
int i = 3;
i <=
sqrt(n_orig);
i =
i+2)
94 size_t Xdim, Ydim, Zdim, Ndim;
96 size_t pad_Xdim=d_correlationAux.
Xdim;
97 size_t pad_Ydim=d_correlationAux.
Ydim;
101 size_t radius = d_correlationAux.
YdimPolar;
102 size_t angles = d_correlationAux.
XdimPolar;
107 for(
int i=firstIdx;
i<firstIdx+numImages;
i++){
112 original_image_stack_ref.
fillImage(n,Iref()/8);
114 if(iter != SF.
ids().end())
121 original_image_stack_ref.
copyToGpu(image_stack_gpu, myStream);
128 cpuMalloc((
void**)&mask_aux,
sizeof(
float)*Xdim*Ydim*Zdim);
129 memcpy(mask_aux,
MULTIDIM_ARRAY(dMask),
sizeof(
float)*Xdim*Ydim*Zdim);
157 size_t 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;
176 Iref().selfReverseX();
179 for(
size_t i=0;
i<numImagesRef;
i++)
193 d_maskFFT.copyGpuToGpuStream(d_correlationAux.
d_maskFFT, myStream);
210 int firstStep,
bool mirror,
219 size_t 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;
226 original_image_stack.
resize(Xdim,Ydim,1,numImagesRef);
236 Iref().selfReverseX();
239 for(
size_t i=0;
i<numImagesRef;
i++)
246 d_correlationAuxTR.
d_projFFT.
resize((pad_Xdim/2)+1, pad_Ydim, 1, numImagesRef);
267 d_maskFFT.copyGpuToGpuStream(d_correlationAuxTR.
d_maskFFT, myStreamTR);
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;
294 d_correlationAuxOne.
d_projFFT.
resize((pad_Xdim/2)+1, pad_Ydim, 1, numImagesRef);
309 d_maskFFT.copyGpuToGpuStream(d_correlationAuxOne.
d_maskFFT, myStreamOne);
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;
340 d_maskFFT.copyGpuToGpuStream(d_correlationAux.
d_maskFFT, myStream);
358 MetaDataVec &SFexp,
int available_images_proj,
bool mirror,
int maxShift,
381 d_referenceAux.
d_maskFFT, d_experimentalAuxTR, d_experimentalAuxRT, 0, mirror,
383 myhandleMask_rt, myhandlePolar_rt,
384 myStructureAux_tr, myStructureAux_rt, myStreamTR, myStreamRT, original_image_stack);
387 d_experimentalAuxTR.
produceSideInfo(myhandlePaddedB_tr, myhandleMaskB_tr, myStructureAux_tr,
395 for(
int step=0; step<6; step++){
397 bool saveMaxVector =
false;
399 saveMaxVector =
true;
407 transMat_tr, max_vector_tr, maxShift,
408 myhandlePaddedB_tr, mirror, myStructureAux_tr,
410 d_experimentalAuxRT, transMat_rt,
411 max_vector_rt, myhandlePolarB_rt,
412 myStructureAux_rt, myStreamRT,
413 resultTR, resultRT, ifftcb, saveMaxVector);
422 d_referenceAux.
d_maskFFT, d_experimentalAuxRT, d_experimentalAuxTR,
425 myStructureAux_rt, myStructureAux_tr, myStreamRT, myStreamTR, 1);
428 d_experimentalAuxRT.
produceSideInfo(myhandlePaddedB_rt, myhandleMaskB_rt, myStructureAux_rt,
438 transMat_rt, max_vector_rt, maxShift,
439 myhandlePaddedB_rt, mirror, myStructureAux_rt,
441 d_experimentalAuxTR, transMat_tr,
442 max_vector_tr, myhandlePolarB_tr,
443 myStructureAux_tr, myStreamTR,
444 resultRT, resultTR, ifftcb, saveMaxVector);
456 d_referenceAux.
d_maskFFT, d_experimentalAuxTR, d_experimentalAuxRT,
459 myStructureAux_tr, myStructureAux_rt, myStreamTR, myStreamRT, 2);
462 d_experimentalAuxTR.
produceSideInfo(myhandlePaddedB_tr, myhandleMaskB_tr, myStructureAux_tr,
473 myhandlePadded_tr, myhandlePolar_tr, myStructureAux_tr, myStreamTR);
475 d_experimentalAuxTR.
produceSideInfo(myhandlePaddedB_tr, myhandleMaskB_tr, myStructureAux_tr,
481 mirror, myStructureAux_tr, myStreamTR, resultTR, saveMaxVector);
501 fn_classes_out =
getParam(
"--classify");
508 if(
checkParam(
"--keep_best") && !significance){
512 if(!keepN && !significance){
529 <<
"Input projected: " << fn_ref << std::endl
530 <<
"Input experimental: " << fn_exp << std::endl
531 <<
"Generate output images (y/n): " << generate_out << std::endl
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");
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");
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");
556 float data[3]={0, 0, 0};
558 int bytes = 8*(2*((2*Xdim)-1)*((2*Ydim)-1) + 2*(360*(Xdim/2)));
559 return (
int)((data[1]*percent/100)/bytes);
568 for(
int i=0;
i<2*mdInSize;
i++){
570 matrixCorrCpu.
getRow(
i,colAux);
571 corrTotalRow.
setCol(
i, colAux);
573 matrixCorrCpu_mirror.
getRow(
i-mdInSize,colAux);
574 corrTotalRow.
setCol(
i, colAux);
579 for(
int i=0;
i<2*mdExpSize;
i++){
581 matrixCorrCpu.
getCol(
i,rowAux);
582 corrTotalCol.
setRow(
i, rowAux);
584 matrixCorrCpu_mirror.
getCol(
i-mdExpSize,rowAux);
585 corrTotalCol.
setRow(
i, rowAux);
598 for (
size_t i=0;
i<mdExpSize;
i++){
599 corrTotalRow.
getRow(
i, rowCorr);
601 corrOrderByRowIndex.
setRow(
i, rowIndexOrder);
603 for (
size_t i=0;
i<mdInSize;
i++){
604 corrTotalCol.
getCol(
i, colCorr);
606 corrOrderByColIndex.
setCol(
i, colIndexOrder);
616 for(
int i=0;
i<mdExpSize;
i++){
618 for(
int j=0;
j<2*mdInSize;
j++){
624 weight = 1.0 - (
j/(float)corrOrderByRowIndex.
xdim);
629 for(
int i=0;
i<mdInSize;
i++){
631 for(
int j=0;
j<2*mdExpSize;
j++){
637 weight = 1.0 - (
j/(float)corrOrderByColIndex.
ydim);
646 weights=weights1*weights2;
655 double maxShift2 = maxShift*maxShift;
659 for (
size_t i=0;
i<mdExpSize;
i++){
661 rowWeights.
indexSort(rowIndexOrderWeights);
662 weightsOrderByRowIndex.
setRow(
i, rowIndexOrderWeights);
665 for(
int i=0;
i<mdExpSize;
i++){
668 for(
int j=0;
j<2*mdInSize;
j++){
671 if(simplifiedMd && howManyInMd==1){
676 if(!simplifiedMd && howManyInMd==Nref){
686 matrixTransCpu_mirror[idx-mdInSize].
getSlice(
i, out2);
701 double shiftX =
MAT_ELEM(bestM,0,2);
702 double shiftY =
MAT_ELEM(bestM,1,2);
703 if (shiftX*shiftX + shiftY*shiftY > maxShift2){
786 matrixTransCpu_mirror[
j-mdInSize].
getSlice(
i, out2);
805 double shiftX =
MAT_ELEM(bestM,0,2);
806 double shiftY =
MAT_ELEM(bestM,1,2);
807 if (shiftX*shiftX + shiftY*shiftY > maxShift2){
813 (*iterExp).setValue(
MDL_FLIP, flip);
857 (*iterExp).setValue(
MDL_REF, (
int)refNum);
858 mdOut.addRow(dynamic_cast<MDRowVec&>(*iterExp));
867 mdOut.write(fnFinal);
875 double maxShift2 = maxShift*maxShift;
878 double rot, tilt,
psi;
881 size_t xAux, yAux, zAux, nAux;
883 FileName fnImgNew, fnExpNew, fnRoot, fnStackOut,
fnOut, fnStackMD, fnClass;
897 auto rad = (size_t)
std::min(xAux*0.5, yAux*0.5);
906 auto iterSF = SF.
begin();
909 int countingClasses=1;
911 NexpVector =
new int[mdInSize];
912 for(
int i=0;
i<mdInSize;
i++){
917 MDRow& rowSF = *iterSF;
921 refNum=countingClasses;
923 auto iterSFexp = SFexp.
begin();
928 fnStackOut=
formatString(
"%s/%s.stk",fnDir.c_str(),fnRoot.c_str());
929 if(fnStackOut.
exists() && firstTime)
933 for(
int j=0;
j<mdExpSize;
j++){
938 long int pointer1=
i*xAux*yAux;
939 long int pointer2=
i*xAux*yAux;
998 Iexp_aux().resetOrigin();
1069 Iexp_aux().resetOrigin();
1076 if(iterSFexp != SFexp.
end())
1081 fnStackNo.
compose(countingClasses, fnStackOut);
1087 mask.apply_mask(Inew(), Inew2());
1088 Inew2().resetOrigin();
1095 if(iterSF !=
SF.
end())
1109 for(
int i=0;
i<mdInSize;
i++){
1111 MDRow& rowSF = *iterSF;
1115 refNum = countingClasses;
1118 fnStackMD=
formatString(
"%s/%s.xmd", fnDir.c_str(), fnRoot.c_str());
1119 fnClass.compose(countingClasses, fnStackOut);
1121 if(fnStackMD.exists() && firstTime)
1122 fnStackMD.deleteFile();
1130 if(iterSF !=
SF.
end())
1139 for(
int i=0;
i<mdInSize;
i++){
1141 MDRow& rowSF = *iterSF;
1151 for(
int j=0;
j<mdExpSize;
j++){
1329 if(iterSF !=
SF.
end())
1333 delete []NexpVector;
1344 size_t Xdim, Ydim, Zdim, Ndim;
1346 size_t mdInSize =
SF.
size();
1358 auto rad = (size_t)
std::min(Xdim*0.48, Ydim*0.48);
1361 auto *out =
new int[5];
1368 for (
int z=0;
z<5;
z++)
1371 if ((out[0]!=0 || out[1]!=0 || out[2]!=0 || out[3]!=0) && out[4]==0){
1386 float memory[3]={0, 0, 0};
1395 int available_images_proj = mdExpSize;
1396 int available1 = mdExpSize;
1397 int available2 = mdExpSize;
1398 if(Xdim*Ydim*mdExpSize*4*100/memory[1]>limit){
1399 available1 =
floor(memory[1]*(limit/100)/(Xdim*Ydim*4));
1401 if(Xdim*2*Ydim*2*mdExpSize>maxGridSize[0]){
1402 available2 =
floor((
round(maxGridSize[0]*0.9))/(Xdim*Ydim*2*2));
1404 if (available1<available2)
1405 available_images_proj = available1;
1407 available_images_proj = available2;
1412 for(
int i=0;
i<mdInSize;
i++)
1413 matrixTransCpu[
i].coreAllocate(1, mdExpSize, 3, 3);
1415 for(
int i=0;
i<mdInSize;
i++)
1416 matrixTransCpu_mirror[
i].coreAllocate(1, mdExpSize, 3, 3);
1423 float *max_vector_rt;
1424 float *max_vector_tr;
1425 float *max_vector_rt_mirror;
1426 float *max_vector_tr_mirror;
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;
1451 size_t pad_Xdim=2*Xdim-1;
1452 size_t pad_Ydim=2*Ydim-1;
1460 for (
int z=0;
z<5;
z++)
1463 if ((out[0]!=0 || out[1]!=0 || out[2]!=0 || out[3]!=0) && out[4]==0){
1471 pad_Ydim = pad_Xdim;
1474 d_referenceAux.
Xdim=pad_Xdim;
1475 d_referenceAux.
Ydim=pad_Ydim;
1487 size_t totalWork=mdInSize*mdExpSize;
1490 size_t lastProgressShown=0;
1493 original_image_stack.
resize(Xdim,Ydim,1,available_images_proj);
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);
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);
1508 resultTR.
resize(myStreamTR, available_images_proj);
1509 resultRT.
resize(myStreamRT, available_images_proj);
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);
1526 myhandlePadded_tr, myhandleMask_tr, myhandlePolar_tr, myStructureAux_tr,
iter, myStreamTR);
1529 d_referenceAux.
produceSideInfo(myhandlePaddedB_tr, myhandleMaskB_tr, myStructureAux_tr, myStreamTR);
1536 size_t expIndex = 0;
1543 d_experimentalAuxTR.
Xdim=d_referenceAux.
Xdim;
1544 d_experimentalAuxTR.
Ydim=d_referenceAux.
Ydim;
1550 d_experimentalAuxRT.
Xdim=d_referenceAux.
Xdim;
1551 d_experimentalAuxRT.
Ydim=d_referenceAux.
Ydim;
1557 int available_images_exp = mdInSize;
1558 while(available_images_exp && (*iterExp).id()!=0){
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;
1572 available_images_exp--;
1574 MDRow& rowExp = *iterExp;
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);
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);
1608 for(
int i=0;
i<available_images_proj;
i++){
1609 if(max_vector_tr[
i]>max_vector_rt[
i]){
1611 matrixTransCpu[
n].setSlice(firstIdx+i, out2);
1612 A2D_ELEM(matrixCorrCpu, n, firstIdx+i) = max_vector_tr[
i];
1615 matrixTransCpu[
n].setSlice(firstIdx+i, out2);
1616 A2D_ELEM(matrixCorrCpu, n, firstIdx+i) = max_vector_rt[
i];
1619 if(max_vector_tr_mirror[i]>max_vector_rt_mirror[i]){
1621 matrixTransCpu_mirror[
n].setSlice(firstIdx+i, out2);
1622 A2D_ELEM(matrixCorrCpu_mirror, n, firstIdx+i) = max_vector_tr_mirror[
i];
1625 matrixTransCpu_mirror[
n].setSlice(firstIdx+i, out2);
1626 A2D_ELEM(matrixCorrCpu_mirror, n, firstIdx+i) = max_vector_rt_mirror[
i];
1630 if(iterExp !=
SF.
end())
1634 workDone+=available_images_proj;
1635 if (
size_t(workDone/100)>lastProgressShown)
1638 lastProgressShown=size_t(workDone/100);
1642 firstIdx +=available_images_proj;
1644 aux=available_images_proj;
1645 if(firstIdx+available_images_proj > mdExpSize){
1646 aux=available_images_proj;
1647 available_images_proj=mdExpSize-firstIdx;
1649 if(firstIdx==mdExpSize){
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();
1660 myhandlePadded_rt.
clear();
1661 myhandleMask_rt.
clear();
1662 myhandlePolar_rt.
clear();
1663 myhandlePaddedB_rt.
clear();
1664 myhandleMaskB_rt.
clear();
1665 myhandlePolarB_rt.
clear();
1672 myhandlePadded_tr.
clear();
1673 myhandleMask_tr.
clear();
1674 myhandlePolar_tr.
clear();
1675 myhandlePaddedB_tr.
clear();
1676 myhandleMaskB_tr.
clear();
1677 myhandlePolarB_tr.
clear();
1679 myhandlePadded_rt.
clear();
1680 myhandleMask_rt.
clear();
1681 myhandlePolar_rt.
clear();
1682 myhandlePaddedB_rt.
clear();
1683 myhandleMaskB_rt.
clear();
1684 myhandlePolarB_rt.
clear();
1692 }
else if(significance){
1699 calculate_weights(matrixCorrCpu, matrixCorrCpu_mirror, corrTotalRow, weights, Nref, mdExpSize, mdInSize, weightsMax, simplifiedMd,
1700 matrixTransCpu, matrixTransCpu_mirror, maxShift);
1702 std::cerr <<
"Creating output metadatas..." << std::endl;
1705 matrixTransCpu_mirror, maxShift, weightsMax, simplifiedMd, Nref);
1709 matrixTransCpu_mirror, maxShift, fn_classes_out, weightsMax, simplifiedMd, Nref);
1712 for(
int i=0;
i<mdInSize;
i++)
1713 matrixTransCpu[
i].coreDeallocate();
1714 delete []matrixTransCpu;
1715 for(
int i=0;
i<mdInSize;
i++)
1716 matrixTransCpu_mirror[
i].coreDeallocate();
1717 delete []matrixTransCpu_mirror;
1721 cpuFree(max_vector_tr_mirror);
1722 cpuFree(max_vector_rt_mirror);
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)
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.
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 getSlice(int k, MultidimArray< T1 > &M, char axis='Z', bool reverse=false, size_t n=0) const
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)
void sqrt(Image< double > &op)
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
#define DIRECT_A2D_ELEM(v, i, j)
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 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
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 readParams()
Read argument from command line.
GpuMultidimArrayAtGpu< float > padded_mask_gpu
GpuMultidimArrayAtGpu< float > padded_image2_gpu
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)
GpuMultidimArrayAtGpu< float > maskAutocorrelation
#define MAT_ELEM(m, i, j)
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
void resize(int _Xdim, int _Ydim=1, int _Zdim=1, int _Ndim=1)
void setCol(size_t j, const MultidimArray< T > &v)
GpuMultidimArrayAtGpu< float > d_original_image
void progress_bar(long rlen)
void copyToGpuStream(T *data, myStreamHandle &myStream)
void myStreamCreate(myStreamHandle &myStream)
void cuda_cart2polar(GpuMultidimArrayAtGpu< float > &image, GpuMultidimArrayAtGpu< float > &polar_image, GpuMultidimArrayAtGpu< float > &polar2_image, bool rotate, myStreamHandle &myStream)
void cpuFree(void *h_data)
int check_gpu_memory(size_t Xdim, size_t Ydim, int percent)
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)
GpuMultidimArrayAtGpu< std::complex< float > > d_projSquaredFFT
void getRow(size_t i, MultidimArray< T > &v) const
void produceSideInfo(mycufftHandle &myhandlePadded, mycufftHandle &myhandleMask, StructuresAux &myStructureAux, myStreamHandle &myStream)
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)
virtual bool containsLabel(MDLabel label) const =0
FileName withoutExtension() const
void typeCast(const Matrix1D< T1 > &v1, Matrix1D< T2 > &v2)
#define BINARY_CIRCULAR_MASK
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)
void addUsageLine(const char *line, bool verbatim=false)
void initZeros(const MultidimArray< T1 > &op)
const MultidimArray< int > & get_binary_mask() const
int getIntParam(const char *param, int arg=0)
GpuMultidimArrayAtGpu< std::complex< float > > d_maskFFT
GpuMultidimArrayAtGpu< float > d_mask
void setRow(int i, const MultidimArray< T > &v)
void indexSort(MultidimArray< int > &indx) const
void addParamsLine(const String &line)
GpuMultidimArrayAtGpu< float > padded_image_gpu
void waitGpu(myStreamHandle &myStream, bool allStreams)