Commit 12670bc5 authored by Andrey Filippov's avatar Andrey Filippov

implemented post-UV manual adjustment control

parent 52e7ddde
......@@ -9983,11 +9983,19 @@ if (MORE_BUTTONS) {
}
// double [] targetTilts={0.0,0.0};
double [] manualScrewsCW=null;
double [] postUVScrews=null;
if (zTxTyM1M2M3!=null){
manualScrewsCW=FOCUSING_FIELD.fieldFitting.mechanicalFocusingModel.getManualScrews(
zTxTy[0]-FOCUSING_FIELD.targetRelFocalShift, //double zErr, // positive - away from lens
zTxTy[1]-FOCUSING_FIELD.targetRelTiltX, //targetTilts[0], // double tXErr,// positive - 1,2 away from lens, 3 - to the lens
zTxTy[2]-FOCUSING_FIELD.targetRelTiltY); //targetTilts[1]); // double tYErr);
postUVScrews=FOCUSING_FIELD.fieldFitting.mechanicalFocusingModel.getManualScrews(
FOCUS_MEASUREMENT_PARAMETERS.postUVscrewSensitivity,
zTxTy[0]-FOCUSING_FIELD.targetRelFocalShift, //double zErr, // positive - away from lens
zTxTy[1]-FOCUSING_FIELD.targetRelTiltX, //targetTilts[0], // double tXErr,// positive - 1,2 away from lens, 3 - to the lens
zTxTy[2]-FOCUSING_FIELD.targetRelTiltY); //targetTilts[1]); // double tYErr);
}
double scaleMovement=1.0; // calculate automatically - reduce when close
boolean parallelMove=false;
......@@ -10011,6 +10019,16 @@ if (MORE_BUTTONS) {
else System.out.println("Suggested rotation for screw # "+(i+1)+
" "+IJ.d2s(manualScrewsCW[i],3)+" ("+IJ.d2s(deg,0)+"\u00b0 CCW)");
}
if (postUVScrews!=null) {
System.out.println("----- Post-UV fixture screw adjustments -----");
for (int i=0;i<postUVScrews.length;i++){
double deg=360*Math.abs(postUVScrews[i]);
if (postUVScrews[i]>=0) System.out.println("Suggested rotation for screw # "+(i+1)+
" "+IJ.d2s(postUVScrews[i],3)+" ("+IJ.d2s(deg,0)+"\u00b0 CW)");
else System.out.println("Suggested rotation for screw # "+(i+1)+
" "+IJ.d2s(postUVScrews[i],3)+" ("+IJ.d2s(deg,0)+"\u00b0 CCW)");
}
}
System.out.println("----- end of Focus/tilt measurement results -----");
if (MASTER_DEBUG_LEVEL>0) System.out.println(FOCUSING_FIELD.showSamples());
......@@ -10042,6 +10060,17 @@ if (MORE_BUTTONS) {
if (manualScrewsCW[i]>=0) gd.addMessage("Screw # "+(i+1)+" "+IJ.d2s(manualScrewsCW[i],3)+" ("+IJ.d2s(deg,0)+"\u00b0 CW)");
else gd.addMessage("Screw # "+(i+1)+" "+IJ.d2s(manualScrewsCW[i],3)+" ("+IJ.d2s(deg,0)+"\u00b0 CCW)");
}
if (postUVScrews!=null) {
for (int i=0;i<postUVScrews.length;i++){
double deg=360*Math.abs(postUVScrews[i]);
if (postUVScrews[i]>=0) gd.addMessage("Screw # "+(i+1)+" "+IJ.d2s(postUVScrews[i],3)+" ("+IJ.d2s(deg,0)+"\u00b0 CW)");
else gd.addMessage("Screw # "+(i+1)+" "+IJ.d2s(postUVScrews[i],3)+" ("+IJ.d2s(deg,0)+"\u00b0 CCW)");
}
gd.addMessage( "--- Post-UV fixture screws sensitivity ---");
for (int i=0;i<FOCUS_MEASUREMENT_PARAMETERS.postUVscrewSensitivity.length;i++){
gd.addNumericField("Screw "+i+" sensitivity", FOCUS_MEASUREMENT_PARAMETERS.postUVscrewSensitivity[i], 4,6,"um/turn CW");
}
}
gd.addNumericField("Scale movement",scaleMovement,3,5,"x");
gd.addCheckbox("Recalculate and apply parallel move only",parallelMove); // should be false after manual movement
......@@ -10076,6 +10105,12 @@ if (MORE_BUTTONS) {
newMotors[0]= (int) gd.getNextNumber();
newMotors[1]= (int) gd.getNextNumber();
newMotors[2]= (int) gd.getNextNumber();
if (postUVScrews!=null) {
for (int i=0;i<FOCUS_MEASUREMENT_PARAMETERS.postUVscrewSensitivity.length;i++){
FOCUS_MEASUREMENT_PARAMETERS.postUVscrewSensitivity[i]=gd.getNextNumber();
}
}
scaleMovement= gd.getNextNumber();
parallelMove= gd.getNextBoolean();
FOCUSING_FIELD.filterZ= gd.getNextBoolean();
......@@ -8631,6 +8631,45 @@ public boolean LevenbergMarquardt(
return turnCW;
}
/**
* Post UV gluing fixture adjustment, screw numbers match motor numbers
* @param umPerTurn sensitivity of the 3 adjustment screws - microns of the uv-glued support movement per screw revolution
* @param zErr current focal distance error in microns, positive - away from lens
* @param tXErr current horizontal tilt in microns/mm , positive - 1,2 away from lens, 3 - to the lens
* @param tYErr current vertical tilt in microns/mm , positive - 2 away from lens, 1 - to the lens
* @return array of optimal CW rotations of each screw (1.0 == 360 deg)
* @return array of optimal CW rotations of each screw (1.0 == 360 deg)
*/
public double [] getManualScrews(
double [] umPerTurn, // if null - use defined here
double zErr, // positive - away from lens
double tXErr,// positive - 1,2 away from lens, 3 - to the lens
double tYErr){// positive - 2 away from lens
double [][] screws={ // right, up, thread pitch (pull) !!! Inverting Y! - again invert? 1 - far left, 2 - near left, 3 - right
{ -13.5, -6.5, 192.8}, // -2.908571735}, // 192.8, ... for proto push-away fixture
{ -13.5, 6.5, 202.6}, // -3.8198374024},
{ 13.6, 3.5, 83.4}}; // -2.4491867448}};
if (umPerTurn!=null) for (int i=0;i<umPerTurn.length;i++) screws[i][2]=umPerTurn[i];
double [] moveDownUm=new double [screws.length];
double [] turnCW=new double [screws.length];
for (int i=0;i<screws.length;i++){
moveDownUm[i]=zErr + screws[i][0]*tXErr+screws[i][1]*tYErr;
turnCW[i]=moveDownUm[i]/screws[i][2];
}
return turnCW;
}
/*
*
192.8479341564
202.5779753086
83.4354504792
-2.908571735
-3.8198374024
-2.4491867448
*/
/**
* Calculate three linearized values of motor positions for current parameters, target center focal
* shift and tilt (from the optic axis)
......
......@@ -255,18 +255,18 @@ public class LensAdjustment {
// when approximating PSF with a second degree polynomial:
public double psf_cutoffEnergy=0.98; //0.5; // disregard pixels outside of this fraction of the total energy
public double psf_cutoffLevel= 0.2; // disregard pixels below this fraction of the maximal value
public int psf_minArea = 10; // continue increasing the selected area, even if beyound psf_cutoffEnergy and psf_cutoffLevel,
// if the selected area is smaller than this (so approximation wpuld work)
public int psf_minArea = 10; // continue increasing the selected area, even if beyond psf_cutoffEnergy and psf_cutoffLevel,
// if the selected area is smaller than this (so approximation would work)
public double psf_blurSigma = 0.0; // optionally blur the calculated mask
public double weightRatioRedToGreen=0.7; // Use this data when combining defocusing data from different color PSF
public double weightRatioBlueToGreen=0.3;
public double targetFarNear=0.0; // OBSOLETE target logariphm of average tangential-to-radial resolution
public double weightRatioBlueToGreen=0.2;
public double targetFarNear=0.0; // OBSOLETE target logarithm of average tangential-to-radial resolution
public boolean useRadialTangential=false; // Use targetFarNear (radial/tangential resolution) as a proxy for the distance
public double targetMicrons=0.0; // target lens center distance (away from "best focus"
public double toleranceMicrons=0.5; // microns
public double toleranceTilt=0.02; //
public double toleranceThreshold=3.0; // When each error is under swcaled thereshold, reduce correxction step twice
public double toleranceThreshold=3.0; // When each error is under scaled threshold, reduce correction step twice
// public boolean parallelAdjust=true; // move 3 motors parallel after each 3-motor focus/tilt adjustment
public double parallelAdjustThreshold=4.0; // adjust 3 motors parallel if focal distance error in the center exceeds this
......@@ -353,7 +353,7 @@ public class LensAdjustment {
public int subdiv=4;
// overwrites public static class MultiFilePSF.overexposedMaxFraction
public double overexposedMaxFraction=0.1; // allowed fraction of the overexposed pixels in the PSF kernel measurement area
// overwirites public static class PSFParameters.minDefinedArea
// overwrites public static class PSFParameters.minDefinedArea
public double minDefinedArea=0.75; // minimal (weighted) fraction of the defined patter pixels in the FFT area
public int PSFKernelSize=32; // size of the detected PSF kernel
public boolean approximateGrid=true; // approximate grid with polynomial
......@@ -375,6 +375,7 @@ public class LensAdjustment {
public double correlationMinAbsoluteContrast=0.5; // minimal contrast for the pattern to pass, does not compensate for low ligt
public double correlationMinAbsoluteInitialContrast=0.5; // minimal contrast for the pattern of the center (initial point)
public double [] postUVscrewSensitivity={-2.908571735,-3.8198374024,-2.4491867448};
public boolean flatFieldCorrection=true;
public double flatFieldExpand=4.0;
......@@ -597,6 +598,7 @@ public class LensAdjustment {
double correlationMinInitialContrast, // minimal contrast for the pattern of the center (initial point)
double correlationMinAbsoluteContrast, // minimal contrast for the pattern to pass, does not compensate for low ligt
double correlationMinAbsoluteInitialContrast, // minimal contrast for the pattern of the center (initial point)
double [] postUVscrewSensitivity, // microns/turn for 3 post-UV fixture adjustment screws
boolean flatFieldCorrection,
double flatFieldExpand,
double thresholdFinish,// (copied from series) stop iterations if 2 last steps had less improvement (but not worsening )
......@@ -752,6 +754,7 @@ public class LensAdjustment {
this.correlationMinInitialContrast=correlationMinInitialContrast; // minimal contrast for the pattern of the center (initial point)
this.correlationMinAbsoluteContrast=correlationMinAbsoluteContrast; // minimal contrast for the pattern to pass, does not compensate for low ligt
this.correlationMinAbsoluteInitialContrast=correlationMinAbsoluteInitialContrast; // minimal contrast for the pattern of the center (initial point)
this.postUVscrewSensitivity=postUVscrewSensitivity.clone(); // microns/turn for 3 post-UV fixture adjustment screws
this.flatFieldCorrection=flatFieldCorrection;
this.flatFieldExpand=flatFieldExpand;
this.thresholdFinish=thresholdFinish;// (copied from series) stop iterations if 2 last steps had less improvement (but not worsening )
......@@ -910,6 +913,7 @@ public class LensAdjustment {
this.correlationMinInitialContrast,
this.correlationMinAbsoluteContrast,
this.correlationMinAbsoluteInitialContrast,
this.postUVscrewSensitivity,
this.flatFieldCorrection,
this.flatFieldExpand,
this.thresholdFinish,
......@@ -1078,7 +1082,9 @@ public class LensAdjustment {
properties.setProperty(prefix+"correlationMinInitialContrast",this.correlationMinInitialContrast+"");
properties.setProperty(prefix+"correlationMinAbsoluteContrast",this.correlationMinAbsoluteContrast+"");
properties.setProperty(prefix+"correlationMinAbsoluteInitialContrast",this.correlationMinAbsoluteInitialContrast+"");
for (int i=0;i<this.postUVscrewSensitivity.length;i++){
properties.setProperty(prefix+"postUVscrewSensitivity_"+i,this.postUVscrewSensitivity[i]+"");
}
properties.setProperty(prefix+"flatFieldCorrection",this.flatFieldCorrection+"");
properties.setProperty(prefix+"flatFieldExpand",this.flatFieldExpand+"");
properties.setProperty(prefix+"thresholdFinish",this.thresholdFinish+"");
......@@ -1405,6 +1411,10 @@ public class LensAdjustment {
this.correlationMinAbsoluteContrast=Double.parseDouble(properties.getProperty(prefix+"correlationMinAbsoluteContrast"));
if (properties.getProperty(prefix+"correlationMinAbsoluteInitialContrast")!=null)
this.correlationMinAbsoluteInitialContrast=Double.parseDouble(properties.getProperty(prefix+"correlationMinAbsoluteInitialContrast"));
for (int i=0;i<this.postUVscrewSensitivity.length;i++){
if (properties.getProperty(prefix+"postUVscrewSensitivity_"+i)!=null)
this.postUVscrewSensitivity[i]=Double.parseDouble(properties.getProperty(prefix+"postUVscrewSensitivity_"+i));
}
if (properties.getProperty(prefix+"flatFieldCorrection")!=null)
this.flatFieldCorrection=Boolean.parseBoolean(properties.getProperty(prefix+"flatFieldCorrection"));
if (properties.getProperty(prefix+"flatFieldExpand")!=null)
......@@ -1679,6 +1689,11 @@ public class LensAdjustment {
gd.addNumericField("Expand during extrapolation (relative to the average grid period)", this.flatFieldExpand, 3);
gd.addNumericField("Threshold RMS to exit LMA", this.thresholdFinish, 7,9,"pix");
gd.addNumericField("Maximal number of LMA iterations per series",this.numIterations, 0);
gd.addMessage( "--- Post-UV fixture screws sensitivity ---");
for (int i=0;i<this.postUVscrewSensitivity.length;i++){
gd.addNumericField("Screw "+i+" sensitivity", this.postUVscrewSensitivity[i], 4,6,"um/turn CW");
}
gd.addMessage("-----");
gd.addNumericField("Report focal length at this temperature", this.reportTemperature, 1,5,"C");
......@@ -1869,6 +1884,9 @@ public class LensAdjustment {
this.flatFieldExpand= gd.getNextNumber();
this.thresholdFinish= gd.getNextNumber();
this.numIterations= (int) gd.getNextNumber();
for (int i=0;i<this.postUVscrewSensitivity.length;i++){
this.postUVscrewSensitivity[i]= gd.getNextNumber();
}
this.reportTemperature= gd.getNextNumber();
return true;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment