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){
1693 Nref=
round(corrTotalRow.xdim*alpha);
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 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
__host__ __device__ float2 floor(const float2 v)
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 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 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)
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
T & getValue(MDLabel label)
void cuda_check_gpu_memory(float *data)
void resize(int _Xdim, int _Ydim=1, int _Zdim=1, int _Ndim=1)
void progress_bar(long rlen)
void myStreamCreate(myStreamHandle &myStream)
void cpuFree(void *h_data)
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 produceSideInfo(mycufftHandle &myhandlePadded, mycufftHandle &myhandleMask, StructuresAux &myStructureAux, myStreamHandle &myStream)
void generate_mask(bool apply_geo=false)
#define BINARY_CIRCULAR_MASK
void cuda_check_gpu_properties(int *grid)
void cpuMalloc(void **h_data, size_t Nbytes)
void primeFactors(int n, int *out)
const MultidimArray< int > & get_binary_mask() const
GpuMultidimArrayAtGpu< float > padded_image_gpu
void waitGpu(myStreamHandle &myStream, bool allStreams)