Loading src/main/java/FocusingField.java +66 −38 Original line number Diff line number Diff line Loading @@ -96,6 +96,7 @@ public class FocusingField { private double rslt_scan_above; private double rslt_scan_step; private boolean rslt_mtf50_mode; private boolean rslt_solve; // find z for minimum of f, if false - use parameter z0 private boolean [] rslt_show_chn; // not saved/restored Loading Loading @@ -219,6 +220,7 @@ public class FocusingField { rslt_scan_above= 10.0; rslt_scan_step= 5.0; rslt_mtf50_mode= true; rslt_solve = false; boolean [] rslt_show_chnDflt={true,true,true,true,true,true}; rslt_show_chn=rslt_show_chnDflt.clone(); // not saved/restored Loading Loading @@ -317,6 +319,7 @@ public class FocusingField { properties.setProperty(prefix+"rslt_scan_above",rslt_scan_above+""); properties.setProperty(prefix+"rslt_scan_step",rslt_scan_step+""); properties.setProperty(prefix+"rslt_mtf50_mode",rslt_mtf50_mode+""); properties.setProperty(prefix+"rslt_solve",rslt_solve+""); for (int chn=0; chn<rslt_show_chn.length; chn++) properties.setProperty(prefix+"rslt_show_chn_"+chn,rslt_show_chn[chn]+""); } Loading Loading @@ -422,6 +425,8 @@ public class FocusingField { rslt_scan_step=Double.parseDouble(properties.getProperty(prefix+"rslt_scan_step")); if (properties.getProperty(prefix+"rslt_mtf50_mode")!=null) rslt_mtf50_mode=Boolean.parseBoolean(properties.getProperty(prefix+"rslt_mtf50_mode")); if (properties.getProperty(prefix+"rslt_solve")!=null) rslt_solve=Boolean.parseBoolean(properties.getProperty(prefix+"rslt_solve")); for (int chn=0; chn<rslt_show_chn.length; chn++) if (properties.getProperty(prefix+"rslt_show_chn_"+chn)!=null) rslt_show_chn[chn]=Boolean.parseBoolean(properties.getProperty(prefix+"rslt_show_chn_"+chn)); } Loading Loading @@ -618,6 +623,7 @@ public boolean configureDataVector(String title, boolean forcenew, boolean enabl getProperties(propertiesPrefix,savedProperties); } } fieldFitting.setCenterXY(currentPX0,currentPY0); if (setupMasks) { if (!fieldFitting.maskSetDialog("Setup parameter masks")) return false; } Loading Loading @@ -2402,11 +2408,11 @@ public void listCombinedResults(){ // private boolean rslt_mtf50_mode= true; // public double fwhm_to_mtf50=500.0; // put actual number double [] center_z=fieldFitting.getZCenters(false); double [] center_z=fieldFitting.getZCenters(false); // do not solve, use z0 coefficient double [] centerFWHM={ fieldFitting.getCalcValuesForZ(center_z[0],0.0)[1], fieldFitting.getCalcValuesForZ(center_z[1],0.0)[3], fieldFitting.getCalcValuesForZ(center_z[2],0.0)[5] fieldFitting.getCalcValuesForZ(center_z[0],0.0,null)[1], fieldFitting.getCalcValuesForZ(center_z[1],0.0,null)[3], fieldFitting.getCalcValuesForZ(center_z[2],0.0,null)[5] }; double [] best_qb_axial= fieldFitting.getBestQualB( k_red, Loading Loading @@ -2438,6 +2444,8 @@ public void listCombinedResults(){ gd.addCheckbox("Show constant-z sections (per-sample adjusted)", this.rslt_show_f_individual); gd.addNumericField("Ring averaging radial sigma", this.rslt_show_smooth_sigma, 3,5,"mm"); gd.addCheckbox("Show mtf50 (false - PSF FWHM)", this.rslt_mtf50_mode); gd.addCheckbox("Find z for minimum, unchecked - use parameter", this.rslt_solve); gd.addCheckbox("Show focal distance relative to best composite focus (false - to center green )", this.z_relative); gd.addMessage("Multiple section setup:"); Loading @@ -2459,8 +2467,8 @@ public void listCombinedResults(){ this.rslt_show_f_smooth= gd.getNextBoolean(); this.rslt_show_f_individual= gd.getNextBoolean(); this.rslt_show_smooth_sigma= gd.getNextNumber(); this.rslt_mtf50_mode= gd.getNextBoolean(); this.rslt_solve=gd.getNextBoolean(); this.z_relative= gd.getNextBoolean(); this.rslt_scan_below= gd.getNextNumber(); this.rslt_scan_above= gd.getNextNumber(); Loading @@ -2481,7 +2489,8 @@ public void listCombinedResults(){ (z_relative?best_qb_corr[0]:center_z[1])+rslt_scan_below, // double scan_below, (z_relative?best_qb_corr[0]:center_z[1])+rslt_scan_above, //double scan_above, rslt_scan_step, //double scan_step, rslt_mtf50_mode); //boolean freq_mode) rslt_mtf50_mode, //boolean freq_mode) rslt_solve); // currently if not using z^(>=2) no numeric solution is required - z0 is the minimum } public double [][] filterListSamples( Loading Loading @@ -2542,7 +2551,9 @@ public void listCombinedResults( double scan_below, double scan_above, double scan_step, boolean freq_mode){ boolean freq_mode, boolean solveZ){ // currently if not using z^(>=2) no numeric solution is required - z0 is the minimum String [] chnNames={"RS","RT","GS","GT","BS","BT"}; // Calculate weights of each channel/sample double [][] sampleWeights=new double[getNumChannels()][getNumSamples()]; Loading Loading @@ -2602,7 +2613,7 @@ public void listCombinedResults( for (double z=scan_below;z<=scan_above;z+=scan_step){ if (show_f_axial){ double [][] f=fieldFitting.getCalcValuesForZ(z, false,true); double [] f0=fieldFitting.getCalcValuesForZ(z, 0.0); double [] f0=fieldFitting.getCalcValuesForZ(z, 0.0,null); f_values[sect][0]=new double [f.length][]; for (int chn=0;chn<f.length;chn++){ if (f[chn]!=null){ Loading Loading @@ -2652,8 +2663,8 @@ public void listCombinedResults( } double [][][] z_values=new double [3][][]; if (show_z_axial){ double [][] zai=fieldFitting.getCalcZ(false,true); double [] zai0=fieldFitting.getCalcZ(0.0); double [][] zai=fieldFitting.getCalcZ(false,true,solveZ); double [] zai0=fieldFitting.getCalcZ(0.0,solveZ); z_values[0]=new double [zai.length][]; for (int chn=0;chn<zai.length;chn++){ if (zai[chn]!=null){ Loading @@ -2667,7 +2678,7 @@ public void listCombinedResults( } } else z_values[0] = null; if (show_z_individual){ double [][] zai=fieldFitting.getCalcZ(true,true); double [][] zai=fieldFitting.getCalcZ(true,true,solveZ); z_values[1]=new double [zai.length][]; for (int chn=0;chn<zai.length;chn++){ if (zai[chn]!=null){ Loading @@ -2681,7 +2692,7 @@ public void listCombinedResults( } } else z_values[1] = null; if (show_f_smooth){ double [][] zai=fieldFitting.getCalcZ(true,true); double [][] zai=fieldFitting.getCalcZ(true,true,solveZ); z_values[2]=new double [zai.length][]; for (int chn=0;chn<zai.length;chn+=2){ double [][] smooth=filterListSamples( Loading Loading @@ -2757,11 +2768,11 @@ public void listCombinedResults( public void listScanQB(){ double [] center_z=fieldFitting.getZCenters(false); double [] center_z=fieldFitting.getZCenters(false); // do not solve, use z0 coefficient double [] centerFWHM={ fieldFitting.getCalcValuesForZ(center_z[0],0.0)[1], fieldFitting.getCalcValuesForZ(center_z[1],0.0)[3], fieldFitting.getCalcValuesForZ(center_z[2],0.0)[5] fieldFitting.getCalcValuesForZ(center_z[0],0.0,null)[1], fieldFitting.getCalcValuesForZ(center_z[1],0.0,null)[3], fieldFitting.getCalcValuesForZ(center_z[2],0.0,null)[5] }; double [] best_qb_axial= fieldFitting.getBestQualB( k_red, Loading Loading @@ -2853,11 +2864,11 @@ public void listScanQB( // } // Add result to the bottom of the file double [] center_z=fieldFitting.getZCenters(false); double [] center_z=fieldFitting.getZCenters(false); // z0 coefficient, do not find minimum double [] centerFWHM={ fieldFitting.getCalcValuesForZ(center_z[0],0.0)[1], fieldFitting.getCalcValuesForZ(center_z[1],0.0)[3], fieldFitting.getCalcValuesForZ(center_z[2],0.0)[5] fieldFitting.getCalcValuesForZ(center_z[0],0.0,null)[1], fieldFitting.getCalcValuesForZ(center_z[1],0.0,null)[3], fieldFitting.getCalcValuesForZ(center_z[2],0.0,null)[5] }; // double [] best_qb_axial= fieldFitting.getBestQualB( // k_red, Loading Loading @@ -3592,12 +3603,12 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ titles); } public double [] getCalcValuesForZ(double z, double r){ public double [] getCalcValuesForZ(double z, double r, double [] corrPars){ double [] result=new double [6]; for (int chn=0;chn<result.length;chn++) { if (curvatureModel[chn]!=null){ result[chn]=curvatureModel[chn].getFdF( null, corrPars, r, // in mm, Double.NaN, // py, z, //mot_z, Loading Loading @@ -3642,12 +3653,14 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ return result; } public double [] getCalcZ(double r){ public double [] getCalcZ(double r, boolean solve // currently if not using z^(>=2) no numeric solution is required - z0 is the minimum ){ double [] result=new double [6]; for (int chn=0;chn<result.length;chn++) { if (curvatureModel[chn]!=null){ // result[chn]=curvatureModel[chn].getAr(r, null)[0]; result[chn]=findBestZ(chn, -1, false); result[chn]=findBestZ(chn, -1, false,solve); } else { result[chn]=Double.NaN; } Loading @@ -3657,11 +3670,14 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ public double findBestZ( int channel, int sampleIndex, // -1 for center boolean corrected){ boolean corrected, boolean solve // currently if not using z^(>=2) no numeric solution is required - z0 is the minimum ){ return findBestZ( channel, sampleIndex, // -1 for center corrected, // solve, // currently if not using z^(>=2) no numeric solution is required - z0 is the minimum 1.0, // double iniStep, 0.0001); //double precision) } Loading @@ -3670,16 +3686,18 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ int channel, int sampleIndex, // -1 for center boolean corrected, // boolean solve, // currently if not using z^(>=2) no numeric solution is required - z0 is the minimum double iniStep, double precision){ int maxSteps=100; double [] corrPars=corrected?getCorrPar(channel,sampleIndex):null; double r=(sampleIndex>=0)?getSampleRadius(sampleIndex):0.0; double z0=curvatureModel[channel].getAr( r, corrPars)[0]; if (!solve) return z0; if (Double.isNaN(z0)) return z0; double f0=getCalcValuesForZ(z0, r)[channel]; double f0=getCalcValuesForZ(z0, r,corrPars)[channel]; double z1=z0+iniStep; double f1=getCalcValuesForZ(z1,r)[channel]; double f1=getCalcValuesForZ(z1,r,corrPars)[channel]; double dir = (f1<f0)?1.0:-1.0; double z_prev,f_prev; if (dir>0) { Loading @@ -3694,7 +3712,7 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ int step; for (step=0;step<maxSteps;step++) { z1=z0+dir*iniStep; f1=getCalcValuesForZ(z1,r)[channel]; f1=getCalcValuesForZ(z1,r,corrPars)[channel]; if (f1>f0) break; z_prev=z0; f_prev=f0; Loading @@ -3716,7 +3734,7 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ } z0=(z_prev+z1)/2; // f0=getCalcValuesForZ(z1,r)[channel]; // ???? f0=getCalcValuesForZ(z0,r)[channel]; f0=getCalcValuesForZ(z0,r,corrPars)[channel]; if (Math.abs(z0-z_prev)<precision) break; } return z0; Loading @@ -3728,7 +3746,11 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ * @param allChannels calculate for all (even disabled) channels, false - only for currently selected * @return outer dimension - number of channel, inner - number of sample (use getSampleRadiuses for radius of each) */ public double [][] getCalcZ(boolean corrected, boolean allChannels){ public double [][] getCalcZ( boolean corrected, boolean allChannels, boolean solve // currently if not using z^(>=2) no numeric solution is required - z0 is the minimum ){ double [] sampleCorrRadius=getSampleRadiuses(); int numSamples=sampleCorrRadius.length; boolean [][] goodSamples=new boolean[getNumChannels()][getNumSamples()]; Loading @@ -3753,7 +3775,8 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ result[chn][sampleIndex]=findBestZ( chn, // int channel, sampleIndex, // int sampleIndex, corrected); //boolean corrected, corrected, //boolean corrected, solve); } else { result[chn][sampleIndex]=Double.NaN; } Loading @@ -3777,9 +3800,9 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ curvatureModel[5].getCenterVector()[0]}; // Blue, Tangential if (solve) { double [] result_1 = { findBestZ(1, -1, false), findBestZ(3, -1, false), findBestZ(5, -1, false), findBestZ(1, -1, false,true), findBestZ(3, -1, false,true), findBestZ(5, -1, false,true), }; return solve?result_1:result; } Loading Loading @@ -3923,6 +3946,10 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ public double[] getCenterXY(){ return pXY; } public void setCenterXY(double px, double py){ pXY[0]=px; pXY[1]=py; } public void setDefaultSampleCorr(){ // int numPars= getNumCurvars()[0]; // number of Z parameters ( [1] - numbnr of radial parameters). for (int n=0;n<channelDescriptions.length;n++){ Loading Loading @@ -4465,10 +4492,11 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ gd.addMessage("===== Aberrations center ====="); String [] centerDescriptions={"Aberrations center X","Aberrations center Y"}; for (int i=0;i<2;i++){ double distXY=(i==0)?pX0_distortions:pY0_distortions; if (centerSelect[i] ) { gd.addNumericField(centerDescriptions[i],pXY[i],5,10,"pix"); gd.addNumericField(centerDescriptions[i],pXY[i],5,10,"pix ("+IJ.d2s(distXY,1)+")"); } else if (showDisabled){ gd.addNumericField("(disabled) "+centerDescriptions[i],pXY[i],5,10,"pix"); gd.addNumericField("(disabled) "+centerDescriptions[i],pXY[i],5,10,"pix ("+IJ.d2s(distXY,1)+")"); } } Loading Loading @@ -5467,7 +5495,7 @@ f_corr: d_fcorr/d_zcorr=0, other: a, reff, kx -> ar[1], ar[2], ar[3], ar[4] //z_corr: kx,r_eff,a - ar[1], ar[4], ar[2], ar[3] double sqr_azr=Math.sqrt(exp_a2*z_corr2+reff2); double dfcorr_da=exp_a*z_corr2/sqr_azr; // double dfcorr_da=exp_a*z_corr2/sqr_azr; double dfcorr_dreff=reff/sqr_azr-1; double dfcorr_dkx=-z_corr; // dfcorr_dar1==0 Loading Loading
src/main/java/FocusingField.java +66 −38 Original line number Diff line number Diff line Loading @@ -96,6 +96,7 @@ public class FocusingField { private double rslt_scan_above; private double rslt_scan_step; private boolean rslt_mtf50_mode; private boolean rslt_solve; // find z for minimum of f, if false - use parameter z0 private boolean [] rslt_show_chn; // not saved/restored Loading Loading @@ -219,6 +220,7 @@ public class FocusingField { rslt_scan_above= 10.0; rslt_scan_step= 5.0; rslt_mtf50_mode= true; rslt_solve = false; boolean [] rslt_show_chnDflt={true,true,true,true,true,true}; rslt_show_chn=rslt_show_chnDflt.clone(); // not saved/restored Loading Loading @@ -317,6 +319,7 @@ public class FocusingField { properties.setProperty(prefix+"rslt_scan_above",rslt_scan_above+""); properties.setProperty(prefix+"rslt_scan_step",rslt_scan_step+""); properties.setProperty(prefix+"rslt_mtf50_mode",rslt_mtf50_mode+""); properties.setProperty(prefix+"rslt_solve",rslt_solve+""); for (int chn=0; chn<rslt_show_chn.length; chn++) properties.setProperty(prefix+"rslt_show_chn_"+chn,rslt_show_chn[chn]+""); } Loading Loading @@ -422,6 +425,8 @@ public class FocusingField { rslt_scan_step=Double.parseDouble(properties.getProperty(prefix+"rslt_scan_step")); if (properties.getProperty(prefix+"rslt_mtf50_mode")!=null) rslt_mtf50_mode=Boolean.parseBoolean(properties.getProperty(prefix+"rslt_mtf50_mode")); if (properties.getProperty(prefix+"rslt_solve")!=null) rslt_solve=Boolean.parseBoolean(properties.getProperty(prefix+"rslt_solve")); for (int chn=0; chn<rslt_show_chn.length; chn++) if (properties.getProperty(prefix+"rslt_show_chn_"+chn)!=null) rslt_show_chn[chn]=Boolean.parseBoolean(properties.getProperty(prefix+"rslt_show_chn_"+chn)); } Loading Loading @@ -618,6 +623,7 @@ public boolean configureDataVector(String title, boolean forcenew, boolean enabl getProperties(propertiesPrefix,savedProperties); } } fieldFitting.setCenterXY(currentPX0,currentPY0); if (setupMasks) { if (!fieldFitting.maskSetDialog("Setup parameter masks")) return false; } Loading Loading @@ -2402,11 +2408,11 @@ public void listCombinedResults(){ // private boolean rslt_mtf50_mode= true; // public double fwhm_to_mtf50=500.0; // put actual number double [] center_z=fieldFitting.getZCenters(false); double [] center_z=fieldFitting.getZCenters(false); // do not solve, use z0 coefficient double [] centerFWHM={ fieldFitting.getCalcValuesForZ(center_z[0],0.0)[1], fieldFitting.getCalcValuesForZ(center_z[1],0.0)[3], fieldFitting.getCalcValuesForZ(center_z[2],0.0)[5] fieldFitting.getCalcValuesForZ(center_z[0],0.0,null)[1], fieldFitting.getCalcValuesForZ(center_z[1],0.0,null)[3], fieldFitting.getCalcValuesForZ(center_z[2],0.0,null)[5] }; double [] best_qb_axial= fieldFitting.getBestQualB( k_red, Loading Loading @@ -2438,6 +2444,8 @@ public void listCombinedResults(){ gd.addCheckbox("Show constant-z sections (per-sample adjusted)", this.rslt_show_f_individual); gd.addNumericField("Ring averaging radial sigma", this.rslt_show_smooth_sigma, 3,5,"mm"); gd.addCheckbox("Show mtf50 (false - PSF FWHM)", this.rslt_mtf50_mode); gd.addCheckbox("Find z for minimum, unchecked - use parameter", this.rslt_solve); gd.addCheckbox("Show focal distance relative to best composite focus (false - to center green )", this.z_relative); gd.addMessage("Multiple section setup:"); Loading @@ -2459,8 +2467,8 @@ public void listCombinedResults(){ this.rslt_show_f_smooth= gd.getNextBoolean(); this.rslt_show_f_individual= gd.getNextBoolean(); this.rslt_show_smooth_sigma= gd.getNextNumber(); this.rslt_mtf50_mode= gd.getNextBoolean(); this.rslt_solve=gd.getNextBoolean(); this.z_relative= gd.getNextBoolean(); this.rslt_scan_below= gd.getNextNumber(); this.rslt_scan_above= gd.getNextNumber(); Loading @@ -2481,7 +2489,8 @@ public void listCombinedResults(){ (z_relative?best_qb_corr[0]:center_z[1])+rslt_scan_below, // double scan_below, (z_relative?best_qb_corr[0]:center_z[1])+rslt_scan_above, //double scan_above, rslt_scan_step, //double scan_step, rslt_mtf50_mode); //boolean freq_mode) rslt_mtf50_mode, //boolean freq_mode) rslt_solve); // currently if not using z^(>=2) no numeric solution is required - z0 is the minimum } public double [][] filterListSamples( Loading Loading @@ -2542,7 +2551,9 @@ public void listCombinedResults( double scan_below, double scan_above, double scan_step, boolean freq_mode){ boolean freq_mode, boolean solveZ){ // currently if not using z^(>=2) no numeric solution is required - z0 is the minimum String [] chnNames={"RS","RT","GS","GT","BS","BT"}; // Calculate weights of each channel/sample double [][] sampleWeights=new double[getNumChannels()][getNumSamples()]; Loading Loading @@ -2602,7 +2613,7 @@ public void listCombinedResults( for (double z=scan_below;z<=scan_above;z+=scan_step){ if (show_f_axial){ double [][] f=fieldFitting.getCalcValuesForZ(z, false,true); double [] f0=fieldFitting.getCalcValuesForZ(z, 0.0); double [] f0=fieldFitting.getCalcValuesForZ(z, 0.0,null); f_values[sect][0]=new double [f.length][]; for (int chn=0;chn<f.length;chn++){ if (f[chn]!=null){ Loading Loading @@ -2652,8 +2663,8 @@ public void listCombinedResults( } double [][][] z_values=new double [3][][]; if (show_z_axial){ double [][] zai=fieldFitting.getCalcZ(false,true); double [] zai0=fieldFitting.getCalcZ(0.0); double [][] zai=fieldFitting.getCalcZ(false,true,solveZ); double [] zai0=fieldFitting.getCalcZ(0.0,solveZ); z_values[0]=new double [zai.length][]; for (int chn=0;chn<zai.length;chn++){ if (zai[chn]!=null){ Loading @@ -2667,7 +2678,7 @@ public void listCombinedResults( } } else z_values[0] = null; if (show_z_individual){ double [][] zai=fieldFitting.getCalcZ(true,true); double [][] zai=fieldFitting.getCalcZ(true,true,solveZ); z_values[1]=new double [zai.length][]; for (int chn=0;chn<zai.length;chn++){ if (zai[chn]!=null){ Loading @@ -2681,7 +2692,7 @@ public void listCombinedResults( } } else z_values[1] = null; if (show_f_smooth){ double [][] zai=fieldFitting.getCalcZ(true,true); double [][] zai=fieldFitting.getCalcZ(true,true,solveZ); z_values[2]=new double [zai.length][]; for (int chn=0;chn<zai.length;chn+=2){ double [][] smooth=filterListSamples( Loading Loading @@ -2757,11 +2768,11 @@ public void listCombinedResults( public void listScanQB(){ double [] center_z=fieldFitting.getZCenters(false); double [] center_z=fieldFitting.getZCenters(false); // do not solve, use z0 coefficient double [] centerFWHM={ fieldFitting.getCalcValuesForZ(center_z[0],0.0)[1], fieldFitting.getCalcValuesForZ(center_z[1],0.0)[3], fieldFitting.getCalcValuesForZ(center_z[2],0.0)[5] fieldFitting.getCalcValuesForZ(center_z[0],0.0,null)[1], fieldFitting.getCalcValuesForZ(center_z[1],0.0,null)[3], fieldFitting.getCalcValuesForZ(center_z[2],0.0,null)[5] }; double [] best_qb_axial= fieldFitting.getBestQualB( k_red, Loading Loading @@ -2853,11 +2864,11 @@ public void listScanQB( // } // Add result to the bottom of the file double [] center_z=fieldFitting.getZCenters(false); double [] center_z=fieldFitting.getZCenters(false); // z0 coefficient, do not find minimum double [] centerFWHM={ fieldFitting.getCalcValuesForZ(center_z[0],0.0)[1], fieldFitting.getCalcValuesForZ(center_z[1],0.0)[3], fieldFitting.getCalcValuesForZ(center_z[2],0.0)[5] fieldFitting.getCalcValuesForZ(center_z[0],0.0,null)[1], fieldFitting.getCalcValuesForZ(center_z[1],0.0,null)[3], fieldFitting.getCalcValuesForZ(center_z[2],0.0,null)[5] }; // double [] best_qb_axial= fieldFitting.getBestQualB( // k_red, Loading Loading @@ -3592,12 +3603,12 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ titles); } public double [] getCalcValuesForZ(double z, double r){ public double [] getCalcValuesForZ(double z, double r, double [] corrPars){ double [] result=new double [6]; for (int chn=0;chn<result.length;chn++) { if (curvatureModel[chn]!=null){ result[chn]=curvatureModel[chn].getFdF( null, corrPars, r, // in mm, Double.NaN, // py, z, //mot_z, Loading Loading @@ -3642,12 +3653,14 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ return result; } public double [] getCalcZ(double r){ public double [] getCalcZ(double r, boolean solve // currently if not using z^(>=2) no numeric solution is required - z0 is the minimum ){ double [] result=new double [6]; for (int chn=0;chn<result.length;chn++) { if (curvatureModel[chn]!=null){ // result[chn]=curvatureModel[chn].getAr(r, null)[0]; result[chn]=findBestZ(chn, -1, false); result[chn]=findBestZ(chn, -1, false,solve); } else { result[chn]=Double.NaN; } Loading @@ -3657,11 +3670,14 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ public double findBestZ( int channel, int sampleIndex, // -1 for center boolean corrected){ boolean corrected, boolean solve // currently if not using z^(>=2) no numeric solution is required - z0 is the minimum ){ return findBestZ( channel, sampleIndex, // -1 for center corrected, // solve, // currently if not using z^(>=2) no numeric solution is required - z0 is the minimum 1.0, // double iniStep, 0.0001); //double precision) } Loading @@ -3670,16 +3686,18 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ int channel, int sampleIndex, // -1 for center boolean corrected, // boolean solve, // currently if not using z^(>=2) no numeric solution is required - z0 is the minimum double iniStep, double precision){ int maxSteps=100; double [] corrPars=corrected?getCorrPar(channel,sampleIndex):null; double r=(sampleIndex>=0)?getSampleRadius(sampleIndex):0.0; double z0=curvatureModel[channel].getAr( r, corrPars)[0]; if (!solve) return z0; if (Double.isNaN(z0)) return z0; double f0=getCalcValuesForZ(z0, r)[channel]; double f0=getCalcValuesForZ(z0, r,corrPars)[channel]; double z1=z0+iniStep; double f1=getCalcValuesForZ(z1,r)[channel]; double f1=getCalcValuesForZ(z1,r,corrPars)[channel]; double dir = (f1<f0)?1.0:-1.0; double z_prev,f_prev; if (dir>0) { Loading @@ -3694,7 +3712,7 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ int step; for (step=0;step<maxSteps;step++) { z1=z0+dir*iniStep; f1=getCalcValuesForZ(z1,r)[channel]; f1=getCalcValuesForZ(z1,r,corrPars)[channel]; if (f1>f0) break; z_prev=z0; f_prev=f0; Loading @@ -3716,7 +3734,7 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ } z0=(z_prev+z1)/2; // f0=getCalcValuesForZ(z1,r)[channel]; // ???? f0=getCalcValuesForZ(z0,r)[channel]; f0=getCalcValuesForZ(z0,r,corrPars)[channel]; if (Math.abs(z0-z_prev)<precision) break; } return z0; Loading @@ -3728,7 +3746,11 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ * @param allChannels calculate for all (even disabled) channels, false - only for currently selected * @return outer dimension - number of channel, inner - number of sample (use getSampleRadiuses for radius of each) */ public double [][] getCalcZ(boolean corrected, boolean allChannels){ public double [][] getCalcZ( boolean corrected, boolean allChannels, boolean solve // currently if not using z^(>=2) no numeric solution is required - z0 is the minimum ){ double [] sampleCorrRadius=getSampleRadiuses(); int numSamples=sampleCorrRadius.length; boolean [][] goodSamples=new boolean[getNumChannels()][getNumSamples()]; Loading @@ -3753,7 +3775,8 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ result[chn][sampleIndex]=findBestZ( chn, // int channel, sampleIndex, // int sampleIndex, corrected); //boolean corrected, corrected, //boolean corrected, solve); } else { result[chn][sampleIndex]=Double.NaN; } Loading @@ -3777,9 +3800,9 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ curvatureModel[5].getCenterVector()[0]}; // Blue, Tangential if (solve) { double [] result_1 = { findBestZ(1, -1, false), findBestZ(3, -1, false), findBestZ(5, -1, false), findBestZ(1, -1, false,true), findBestZ(3, -1, false,true), findBestZ(5, -1, false,true), }; return solve?result_1:result; } Loading Loading @@ -3923,6 +3946,10 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ public double[] getCenterXY(){ return pXY; } public void setCenterXY(double px, double py){ pXY[0]=px; pXY[1]=py; } public void setDefaultSampleCorr(){ // int numPars= getNumCurvars()[0]; // number of Z parameters ( [1] - numbnr of radial parameters). for (int n=0;n<channelDescriptions.length;n++){ Loading Loading @@ -4465,10 +4492,11 @@ public boolean LevenbergMarquardt(boolean openDialog, int debugLevel){ gd.addMessage("===== Aberrations center ====="); String [] centerDescriptions={"Aberrations center X","Aberrations center Y"}; for (int i=0;i<2;i++){ double distXY=(i==0)?pX0_distortions:pY0_distortions; if (centerSelect[i] ) { gd.addNumericField(centerDescriptions[i],pXY[i],5,10,"pix"); gd.addNumericField(centerDescriptions[i],pXY[i],5,10,"pix ("+IJ.d2s(distXY,1)+")"); } else if (showDisabled){ gd.addNumericField("(disabled) "+centerDescriptions[i],pXY[i],5,10,"pix"); gd.addNumericField("(disabled) "+centerDescriptions[i],pXY[i],5,10,"pix ("+IJ.d2s(distXY,1)+")"); } } Loading Loading @@ -5467,7 +5495,7 @@ f_corr: d_fcorr/d_zcorr=0, other: a, reff, kx -> ar[1], ar[2], ar[3], ar[4] //z_corr: kx,r_eff,a - ar[1], ar[4], ar[2], ar[3] double sqr_azr=Math.sqrt(exp_a2*z_corr2+reff2); double dfcorr_da=exp_a*z_corr2/sqr_azr; // double dfcorr_da=exp_a*z_corr2/sqr_azr; double dfcorr_dreff=reff/sqr_azr-1; double dfcorr_dkx=-z_corr; // dfcorr_dar1==0 Loading