package cz.cuni.lf1.lge.ThunderSTORM.calibration; import cz.cuni.lf1.lge.ThunderSTORM.calibration.PSFSeparator.Position; import cz.cuni.lf1.lge.ThunderSTORM.detectors.ui.IDetectorUI; import cz.cuni.lf1.lge.ThunderSTORM.estimators.PSF.MoleculeDescriptor; import cz.cuni.lf1.lge.ThunderSTORM.estimators.ui.BiplaneCalibrationEstimatorUI; import cz.cuni.lf1.lge.ThunderSTORM.filters.ui.IFilterUI; import cz.cuni.lf1.lge.ThunderSTORM.util.IBinaryTransform; import ij.IJ; import ij.ImagePlus; import ij.gui.Roi; import java.util.Collection; import java.util.List; import static cz.cuni.lf1.lge.ThunderSTORM.estimators.PSF.PSFModel.Params.LABEL_SIGMA; import static cz.cuni.lf1.lge.ThunderSTORM.estimators.PSF.PSFModel.Params.LABEL_SIGMA1; import static cz.cuni.lf1.lge.ThunderSTORM.estimators.PSF.PSFModel.Params.LABEL_SIGMA2; public class BiplaneCalibrationProcess extends AbstractCalibrationProcess { // processing ImagePlus imp1, imp2; Roi roi1, roi2; public BiplaneCalibrationProcess(CalibrationConfig config, IFilterUI selectedFilterUI, IDetectorUI selectedDetectorUI, BiplaneCalibrationEstimatorUI calibrationEstimatorUI, DefocusFunction defocusModel, double stageStep, double zRangeLimit, ImagePlus imp1, ImagePlus imp2, Roi roi1, Roi roi2) { super(config, selectedFilterUI, selectedDetectorUI, calibrationEstimatorUI, defocusModel, stageStep, zRangeLimit); this.imp1 = imp1; this.imp2 = imp2; this.roi1 = roi1; this.roi2 = roi2; } @Override public void runCalibration() { Collection<Position> positions = fitPositions(); IJ.log("Homography transformation matrix: " + transformationMatrix.toString()); fitQuadraticPolynomials(positions); IJ.log("s1 = " + polynomS1Final.toString()); IJ.log("s2 = " + polynomS2Final.toString()); } @SuppressWarnings("unchecked") public DefocusCalibration getCalibration(DefocusFunction defocusModel) { DefocusCalibration cal1 = defocusModel.getCalibration(angle, null, polynomS1Final, polynomS1Final); DefocusCalibration cal2 = defocusModel.getCalibration(angle, null, polynomS2Final, polynomS2Final); return new DoubleDefocusCalibration(cal1.name, transformationMatrix, cal1, cal2); } public void drawOverlay() { // TODO: this doesn't work //drawOverlay(imp1, roi1, beadFits1.getAllFits(), usedPositions); //drawOverlay(imp2, roi2, beadFits2.getAllFits(), Homography.transformPositions(transformationMatrix, // usedPositions, (int) roi2.getFloatWidth(), (int) roi2.getFloatHeight())); } protected Collection<Position> fitPositions() { angle = 0.0; List<Position> fits1 = filterPositions(fitFixedAngle(angle, imp1, roi1, selectedFilterUI, selectedDetectorUI, calibrationEstimatorUI, defocusModel, config.showResultsTable), config.minimumFitsCount); List<Position> fits2 = filterPositions(fitFixedAngle(angle, imp2, roi2, selectedFilterUI, selectedDetectorUI, calibrationEstimatorUI, defocusModel, config.showResultsTable), config.minimumFitsCount); IJ.showStatus("Estimating homography between the planes..."); transformationMatrix = Homography.estimateTransform( config.ransacTranslationAndFlip, config.ransacHomography, (int) roi1.getFloatWidth(), (int) roi1.getFloatHeight(), fits1, (int) roi2.getFloatWidth(), (int) roi2.getFloatHeight(), fits2); if (transformationMatrix == null) { throw new TransformEstimationFailedException("Could not estimate a transform between the planes!"); } return Homography.mergePositions(transformationMatrix, new IBinaryTransform<Position>() { @Override public void map(Position pos1, Position pos2) { double[] sigma1 = pos1.getAsArray(LABEL_SIGMA, MoleculeDescriptor.Units.PIXEL); double[] sigma2 = pos2.getAsArray(LABEL_SIGMA, MoleculeDescriptor.Units.PIXEL); pos1.setFromArray(LABEL_SIGMA1, MoleculeDescriptor.Units.PIXEL, sigma1); pos1.setFromArray(LABEL_SIGMA2, MoleculeDescriptor.Units.PIXEL, sigma2); pos2.setFromArray(LABEL_SIGMA1, MoleculeDescriptor.Units.PIXEL, sigma1); pos2.setFromArray(LABEL_SIGMA2, MoleculeDescriptor.Units.PIXEL, sigma2); } }, config.dist2thrZStackMatching, (int) roi1.getFloatWidth(), (int) roi1.getFloatHeight(), fits1, (int) roi2.getFloatWidth(), (int) roi2.getFloatHeight(), fits2) .keySet(); } }