示例#1
0
// check the reslicing is right
TEST( MultidimTest, reslice)
{
    XMIPP_TRY
    MultidimArray<float> imgSliced, imgRef;

    imgRef.resize(3,3,3);

    FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(imgRef)
    dAi(imgRef, n) = n;

    imgRef.reslice(imgSliced, VIEW_Y_NEG);


    //    imgSliced.reslice(ImageGeneric::Y_NEG);

    FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY3D(imgRef)
    {
        EXPECT_EQ(DIRECT_ZYX_ELEM(imgRef,k,i,j), DIRECT_ZYX_ELEM(imgSliced,ZSIZE(imgSliced)-1-i,k,j));
    }

    imgRef.reslice(imgSliced, VIEW_X_NEG);

    FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY3D(imgRef)
    {
        EXPECT_EQ(DIRECT_ZYX_ELEM(imgRef,k,i,j), DIRECT_ZYX_ELEM(imgSliced,ZSIZE(imgSliced)-1-j,i,k));
    }
    XMIPP_CATCH
}
示例#2
0
// check the reslicing is right
TEST( MultidimTest, getImage)
{
    XMIPP_TRY
    MultidimArray<float> imgTgt, imgRef;

    imgRef.resize(3,1,3,3);

    FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(imgRef)
    dAi(imgRef, n) = n;


    imgRef.getImage(2, imgTgt);
    FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY3D(imgRef)
    {
        EXPECT_EQ(DIRECT_NZYX_ELEM(imgRef,2,k,i,j), DIRECT_ZYX_ELEM(imgTgt,k,i,j));
    }


    imgTgt.resize(6,1,3,3);

    imgRef.getImage(0, imgTgt, 5);
    imgRef.getImage(1, imgTgt, 3);
    imgRef.getImage(2, imgTgt, 1);


    FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY3D(imgRef)
    {
        EXPECT_EQ(DIRECT_NZYX_ELEM(imgRef,0,k,i,j), DIRECT_NZYX_ELEM(imgTgt,5,k,i,j));
        EXPECT_EQ(DIRECT_NZYX_ELEM(imgRef,1,k,i,j), DIRECT_NZYX_ELEM(imgTgt,3,k,i,j));
        EXPECT_EQ(DIRECT_NZYX_ELEM(imgRef,2,k,i,j), DIRECT_NZYX_ELEM(imgTgt,1,k,i,j));
    }

    XMIPP_CATCH
}
示例#3
0
文件: fftw.cpp 项目: shy3u/GeRelion
void adaptSpectrum(MultidimArray<double>& Min,
                   MultidimArray<double>& Mout,
                   const MultidimArray<double>& spectrum_ref,
                   int spectrum_type,
                   bool leave_origin_intact)
{

	MultidimArray<double> spectrum;
	getSpectrum(Min, spectrum, spectrum_type);
	FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY1D(spectrum)
	{
		dAi(spectrum, i) = (dAi(spectrum, i) > 0.) ? dAi(spectrum_ref, i) / dAi(spectrum, i) : 1.;
	}
	Mout = Min;
	multiplyBySpectrum(Mout, spectrum, leave_origin_intact);

}
示例#4
0
文件: fftw.cpp 项目: shy3u/GeRelion
void divideBySpectrum(MultidimArray<double>& Min,
                      MultidimArray<double>& spectrum,
                      bool leave_origin_intact)
{

	MultidimArray<double> div_spec(spectrum);
	FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY1D(spectrum)
	{
		if (ABS(dAi(spectrum, i)) > 0.)
		{
			dAi(div_spec, i) = 1. / dAi(spectrum, i);
		}
		else
		{
			dAi(div_spec, i) = 1.;
		}
	}
	multiplyBySpectrum(Min, div_spec, leave_origin_intact);
}
void evaluateClass(MetaData &MD, ClassEvaluation &eval)
{
    eval.FRC_05=0;
    eval.DPR_05=0;
    if (MD.size()<10)
    	return;

    MetaData MDrandomized;
	std::vector<MetaData> vMD;
    MultidimArray<double> I0, I1, freq, frc, dpr, frc_noise, error_l2;

    // Compute FRC
    MDrandomized.randomize(MD);
    MDrandomized.split(2,vMD,MDL_IMAGE);
    getAverageApplyGeo(vMD[0],I0);
    getAverageApplyGeo(vMD[1],I1);
    I0.setXmippOrigin();
    I1.setXmippOrigin();
    frc_dpr(I0, I1, 1, freq, frc, frc_noise, dpr, error_l2, true);

    // Compute the frequency of FRC=0.5
    int i_05=-1;
    FOR_ALL_ELEMENTS_IN_ARRAY1D(frc)
    if (dAi(frc,i)<0.5)
    {
    	i_05=i;
    	break;
    }
    if (i_05==-1)
    {
    	i_05=XSIZE(frc)-1;
    	eval.overfitting=true;
    }

    // Extract evaluators
    eval.FRC_05=dAi(freq,i_05);
    eval.DPR_05=dAi(dpr,i_05);
}
示例#6
0
void ProgXrayImport::getFlatfield(const FileName &fnFFinput,
                                  Image<double> &Iavg)
{

    // Process the flatfield images


    MultidimArray<double> &mdaIavg = Iavg();

    Matrix1D<double> expTimeArray, cBeamArray, slitWidthArray; // Local vectors

    DataSource ldSource = dSource;

    // Checking if fnFFinput is a single file to obtain the flatfield avg from
    if (extFlat && isImage(fnFFinput))
    {
        fMD.read(fnFFinput);
        ldSource = NONE;
    }
    else
    {
        switch (ldSource)
        {
        case MISTRAL:
            if (!H5File.checkDataset(fnFFinput.getBlockName().c_str()))
                break;
            {
                fMD.read(fnFFinput);
                H5File.getDataset("NXtomo/instrument/bright_field/ExpTimes", expTimeArray, false);
                H5File.getDataset("NXtomo/instrument/bright_field/current", cBeamArray, false);

                // If expTime is empty or only one single value in nexus file then we fill with 1
                if (expTimeArray.size() < 2)
                {
                    reportWarning("Input file does not contains flatfields' exposition time information.");
                    expTimeArray.initConstant(fMD.size(), 1.);
                }
                // If current is empty or only one single value in nexus file then we fill with 1
                if (cBeamArray.size() < 2)
                {
                    reportWarning("Input file does not contains flatfields' current beam information.");
                    cBeamArray.initConstant(fMD.size(), 1.);
                }

            }

            // Since Alba does not provide slit width, we set to ones
            slitWidthArray.initConstant(fMD.size(), 1.);

            break;
        case BESSY:
            {
                size_t objId;

                for (size_t i = fIni; i <= fEnd; ++i)
                {
                    objId = fMD.addObject();
                    fMD.setValue(MDL_IMAGE, fnFFinput + formatString("/img%d.spe", i), objId);
                }
                break;
            }
        case GENERIC:
            {
                // Get Darkfield
                std::cout << "Getting darkfield from "+fnFFinput << " ..." << std::endl;
                getDarkfield(fnFFinput, IavgDark);
                if (darkFix)
                    IavgDark.write(fnRoot+"_"+fnFFinput.removeDirectories()+"_darkfield.xmp");

                std::vector<FileName> listDir;
                fnFFinput.getFiles(listDir);
                size_t objId;

                for (size_t i = 0; i < listDir.size(); ++i)
                {
                    if (!listDir[i].hasImageExtension())
                        continue;
                    objId = fMD.addObject();
                    fMD.setValue(MDL_IMAGE, fnFFinput+"/"+listDir[i], objId);
                }
            }
            break;
        }
    }

    if ( fMD.size() == 0 )
    {
        reportWarning("XrayImport::getFlatfield: No images to process");
        return;
    }

    ImageInfo imFFInfo;

    getImageInfo(fMD, imFFInfo);

    if ( (imFFInfo.adim.xdim != imgInfo.adim.xdim) || (imFFInfo.adim.ydim != imgInfo.adim.ydim) )
    {
        reportWarning(formatString("XrayImport:: Flatfield images size %dx%d different from Tomogram images size %dx%d",
                                   imFFInfo.adim.xdim,imFFInfo.adim.ydim,imgInfo.adim.xdim,imgInfo.adim.ydim));
        std::cout << "Setting crop values to fit the smallest dimensions." <<std::endl;

        // This shift in the crop sizes is exclusive of Mistral data
        cropSizeXi = (imgInfo.adim.xdim - std::min(imgInfo.adim.xdim-cropSizeX*2, imFFInfo.adim.xdim))/2 + 1;
        cropSizeYi = (imgInfo.adim.ydim - std::min(imgInfo.adim.ydim-cropSizeY*2, imFFInfo.adim.ydim))/2 + 1;
        cropSizeXe = cropSizeXi - 2;
        cropSizeYe = cropSizeYi - 2;
    }

    int cropX = (imFFInfo.adim.xdim - (imgInfo.adim.xdim-cropSizeXi-cropSizeXe))/2;// - 1;
    int cropY = (imFFInfo.adim.ydim - (imgInfo.adim.ydim-cropSizeYi-cropSizeYe))/2;// - 1;


    int N  = 0;
    Image<double> Iaux;
    FileName fnImg;

    FOR_ALL_OBJECTS_IN_METADATA(fMD)
    {
        fMD.getValue(MDL_IMAGE, fnImg, __iter.objId);

        readAndCrop(fnImg, Iaux, cropX, cropY);


        if ( darkFix )
        {
            Iaux() -= IavgDark();
            forcePositive(Iaux());
        }

        double currentBeam = 1;
        double expTime = 1;
        double slitWidth = 1;

        switch (ldSource)
        {
        case MISTRAL:
            {
                size_t idx = fnImg.getPrefixNumber();
                currentBeam = dMi(cBeamArray, idx-1);
                expTime = dMi(expTimeArray, idx-1);
                slitWidth = dMi(slitWidthArray, idx-1);
            }
            break;
        case BESSY:
        case GENERIC:
            readCorrectionInfo(fnImg, currentBeam, expTime, slitWidth);
            break;
        default:
            break;
        }

        Iaux() *= 1.0/(currentBeam*expTime*slitWidth);

        if ( N == 0 )
            mdaIavg = Iaux();
        else
            mdaIavg += Iaux();
        N++;
    }

    darkFix = false; // We reset just in case there is no dark field for tomo images

    mdaIavg*=1.0/N;

    /* Create a mask with zero valued pixels to apply boundaries median filter
     * to avoid dividing by zero when normalizing */

    MultidimArray<char> &mdaMask = MULTIDIM_ARRAY(bpMask);

    if ( !fnBPMask.empty() && !mdaIavg.sameShape(mdaMask) )
        REPORT_ERROR(ERR_MULTIDIM_SIZE, "XrayImport: Mask size does not match flat fields size.");

    if (BPFactor > 0)
    {
        double  avg, std;
        mdaIavg.computeAvgStdev(avg, std);
        mdaMask.resize(mdaIavg, false);

        double th = avg - std*BPFactor;
        FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(mdaMask)
        dAi(mdaMask, n) = dAi(mdaIavg, n) < th;
    }
    else if (fnBPMask.empty())
        mdaIavg.equal(0,mdaMask);

    MultidimArray<char> mask = mdaMask;
    boundMedianFilter(mdaIavg,mask);
}