// 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 }
// 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 }
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); }
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); }
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); }