package com.elphel.imagej.cameras;
/**
 **
 ** CLTParameters - Class for handling multiple configuration parameters
 **
 ** Copyright (C) 2017-2020 Elphel, Inc.
 **
 ** -----------------------------------------------------------------------------**
 **
 **  CLTParameters.java is free software: you can redistribute it and/or modify
 **  it under the terms of the GNU General Public License as published by
 **  the Free Software Foundation, either version 3 of the License, or
 **  (at your option) any later version.
 **
 **  This program is distributed in the hope that it will be useful,
 **  but WITHOUT ANY WARRANTY; without even the implied warranty of
 **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 **  GNU General Public License for more details.
 **
 **  You should have received a copy of the GNU General Public License
 **  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ** -----------------------------------------------------------------------------**
 **
 */

//import static jcuda.driver.JCudaDriver.cuMemcpyDtoH;




import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Properties;
import java.util.Set;

import com.elphel.imagej.common.GenericJTabbedDialog;
import com.elphel.imagej.common.WindowTools;
import com.elphel.imagej.lwir.LwirReaderParameters;
import com.elphel.imagej.tileprocessor.BiQuadParameters;
import com.elphel.imagej.tileprocessor.ImageDtt;
import com.elphel.imagej.tileprocessor.ImageDttParameters;
import com.elphel.imagej.tileprocessor.IntersceneLmaParameters;
import com.elphel.imagej.tileprocessor.MeasuredLayersFilterParameters;
import com.elphel.imagej.tileprocessor.OpticalFlowParameters;
import com.elphel.imagej.tileprocessor.PoleProcessorParameters;

import ij.gui.GenericDialog;

public class CLTParameters {
	public int        transform_size =      8; //
	public int        clt_window =          1; // currently only 3 types of windows - 0 (none), 1 and 2
	public double     shift_x =           0.0;
	public double     shift_y =           0.0;
	public int        tileStep =            4;  // process tileStep x tileStep cluster of tiles when adjusting lazy eye parameters
	public int        super_radius =        2;  // Consolidate multiple clusterts for low-contrast infinity (clouds in the sky) 0 - none, 1 - 3x3, 2 - 5x5,
	public int        iclt_mask =          15;  // which transforms to combine
	public int        tileX =            -258;  // number of kernel tile (0..163)
	public int        tileY =             133;  // number of kernel tile (0..122)
	public int        dbg_mode =            0;  // 0 - normal, +1 - no DCT/IDCT
	public int        ishift_x =            0;  // debug feature - shift source image by this pixels left
	public int        ishift_y =            0;  // debug feature - shift source image by this pixels down

	private double    fat_zero =          0.05; // modify phase correlation to prevent division by very small numbers
	private double    fat_zero_mono =     0.03; // modify phase correlation to prevent division by very small numbers
	private double    corr_sigma =        0.9;  // LPF correlation sigma
	private double    corr_sigma_mono =   0.15; // LPF correlation sigma for monochrome images
	private double    texture_sigma =     0.9;  // LPF correlation sigma
	private double    texture_sigma_mono =0.15; // LPF correlation sigma for monochrome images
	private double    scale_strength_main = 1.0;// leave as is
	private double    scale_strength_aux =  0.3;// reduce to match lower sigma
	public boolean    norm_kern =         true; // normalize kernels
	public boolean    gain_equalize =     false;// equalize green channel gain (bug fix for wrong exposure in Exif ?)
	public boolean    colors_equalize =   true; // equalize R/G, B/G of the individual channels
	public boolean    nosat_equalize =    true; // Skip saturated when adjusting gains
	public double     sat_level =         0.95; // Saturation level of the most saturated color channel
	public double     max_overexposure =  0.6;  // Do not use tiles with higher fraction of (near) saturated tiles
	public double     novignetting_r    = 0.2644; // reg gain in the center of sensor calibration R (instead of vignetting)
	public double     novignetting_g    = 0.3733; // green gain in the center of sensor calibration G
	public double     novignetting_b    = 0.2034; // blue gain in the center of sensor calibration B
	public double     scale_r =           1.0; // extra gain correction after vignetting or non-vignetting, before other processing
	public double     scale_g =           1.0;
	public double     scale_b =           1.0;
	public double     vignetting_max    = 0.4; // value in vignetting data to correspond to 1x in the kernel
	public double     vignetting_range  = 5.0; // do not try to correct vignetting less than vignetting_max/vignetting_range
	public int        kernel_step =       16;  // source kernels step in pixels (have 1 kernel margin on each side)
	public double     disparity  =        0.0; // nominal disparity between side of square cameras (pix)
	public double     z_correction  =     0.0; // Inverse distance to infinity (misalignment correction)
	public boolean    correlate =         true; // calculate correlation
	public boolean    correlate_lma =     true; // Use LMA to find disparity from 2d phase correlations
	public int        corr_mask =         15;  // bitmask of pairs to combine in the composite
	public boolean    corr_sym =          false; // combine correlation with mirrored around disparity direction
	public boolean    corr_keep =         true;  // keep all partial correlations (otherwise - only combined one)
	public boolean    corr_show =         false; // Show combined correlations
	public boolean    corr_mismatch=      false; // calculate per-pair X/Y variations of measured correlations
	// TODO: what to do if some occlusion is present (only some channels correlate)
	public double     corr_offset =       0.1; //0.1;  // add to pair correlation before multiplying by other pairs (between sum and product)
	// negative - add, not mpy
	public double     corr_red =          0.5;  // Red to green correlation weight
	public double     corr_blue =         0.2;  // Blue to green correlation weight
	public boolean    corr_normalize =    false; // normalize each correlation tile by rms
	public double     min_corr =          0.02; // minimal correlation value to consider valid
	public double     min_corr_normalized =  2.0; // minimal correlation value to consider valid when normalizing correlation results
	public double     max_corr_sigma =    1.2;  // weights of points around global max to find fractional
	// pixel location by quadratic approximation
	public double     corr_r2_offset =    0.0;  // 0.0 - for compatibility with old, normally should be 2.0 (or 1.0)

	public double     max_corr_radius =   3.9;  // maximal distance from int max to consider

	//  		public int        enhortho_width =    2;    // reduce weight of center correlation pixels from center (0 - none, 1 - center, 2 +/-1 from center)
	//  		public double     enhortho_scale =    0.0; // 0.2;  // multiply center correlation pixels (inside enhortho_width)

	public boolean    max_corr_double =   false; // NOT USED double pass when masking center of mass to reduce preference for integer values
	public int        corr_mode =         2;    // which correlation mode to use: 0 - integer max, 1 - center of mass, 2 - polynomial

	// pixel location by quadratic approximation
	public double     corr_border_contrast = 0.01; // contrast of dotted border on correlation results

	public int        tile_task_op =      0xff;   // bitmask of operation modes applied to tiles (0 - nothing), bits TBD later
	// +(0..f) - images, +(00.f0) - process pairs + 256 - force disparity when combining images
	// window to process tiles (later arbitrary masks will be generated to follow particular stages);
	public int        tile_task_wl =      0;   //
	public int        tile_task_wt =      0;   //
	public int        tile_task_ww =      324; //
	public int        tile_task_wh =      242; //
	public double     min_shot =          10.0;  // Do not adjust for shot noise if lower than
	public double     scale_shot =        3.0;   // scale when dividing by sqrt

	public double     diff_sigma =        5.0;   // RMS difference from average to reduce weights (~ 1.0 - 1/255 full scale image) (1.5 for RGB, 10 for LWIR?) 
	public double     diff_threshold =    1.5;   // RMS difference from average to discard channel (~ 1.0 - 1/255 full scale image)
	public boolean    diff_gauss =        true;  // when averaging images, use Gaussian around average as weight (false - sharp all/nothing)
	public double     min_agree =         3.0;   // minimal number of channels to agree on a point (real number to work with fuzzy averages)
	public boolean    dust_remove =       true;  // Do not reduce average weight when only one image differes much from the average

	public boolean    black_back =        true;  // use Black for backdrop outside of the FOV
	public boolean    keep_weights =      true;  // add port weights to RGBA stack (debug feature)
	public boolean    sharp_alpha =       false; // combining mode for alpha channel: false - treat as RGB, true - apply center 8x8 only
	public double     alpha0 = 	          0.6; // > .525 Alpha channel 0.0 threshold (lower - transparent) (watch for far objects)
	public double     alpha1 = 	          0.8; // Alpha channel 1.0 threshold (higher - opaque) (watch for window dust)

	public boolean    gen_chn_stacks =    false; // generate shifted channel rgb stacks
	public boolean    gen_chn_img =       true;  // generate shifted channel images
	public boolean    gen_4_img =         true;  // Generate shifted channel images and save with the model
	public boolean    show_nonoverlap =   true;  // show result RGBA before overlap combined (first channels, then RGBA combined?)
	public boolean    show_overlap =      true;  // show result RGBA (first channels, then RGBA combined?)
	public boolean    show_rgba_color =   true;  // show combined color image
	public boolean    show_map =          true;  // show disparity maps
	public boolean    show_corr =         true;  // show GPU correlation

	public double     disp_scan_start =   0.0;   // disparity scan start value
	public double     disp_scan_step =    1.0;   // disparity scan step
	public int        disp_scan_count =   10;    // disparity scan number of measurements

	public boolean    fine_dbg =          false; // Debug infinity/lazy eye correction
	public double     fine_corr_x_0 =     0.0;   // additionally shift image in port 0 in x direction
	public double     fine_corr_y_0 =     0.0;   // additionally shift image in port 0 in y direction
	public double     fine_corr_x_1 =     0.0;   // additionally shift image in port 1 in x direction
	public double     fine_corr_y_1 =     0.0;   // additionally shift image in port 1 in y direction
	public double     fine_corr_x_2 =     0.0;   // additionally shift image in port 2 in x direction
	public double     fine_corr_y_2 =     0.0;   // additionally shift image in port 2 in y direction
	public double     fine_corr_x_3 =     0.0;   // additionally shift image in port 3 in x direction
	public double     fine_corr_y_3 =     0.0;   // additionally shift image in port 3 in y direction
	
//	public double [][] fine_corr_xy;
	
	public boolean    fine_corr_ignore =  false; // Ignore manual pixel correction
	public boolean    fine_corr_apply =   true;  // Apply and set to ignore manual pixel correction after extrinsics correction

	public double     fcorr_radius =       0.75 ; // Do not try to correct outside this fraction of width/hight
	public double     fcorr_min_strength = 0.15 ; // 0.005 minimal correlation strength to apply fine correction
	public double     fcorr_disp_diff =   1.5;   // consider only tiles with absolute residual disparity lower than
	public boolean    fcorr_quadratic =   true;  // Use quadratic polynomial for fine correction (false - only linear)
	public boolean    fcorr_ignore =      false; // Ignore currently calculated fine correction
	public double     fcorr_inf_strength = 0.15 ; // Minimal correlation strength to use for infinity correction
	public double     fcorr_inf_diff =    0.2;   // Disparity half-range for infinity
	public boolean    fcorr_inf_quad =    true;  // Use quadratic polynomial for infinity correction (false - only linear)
	public boolean    fcorr_inf_vert =    false; // Correct infinity in vertical direction (false - only horizontal)

	//--
	public boolean    inf_disp_apply =   true;   // Apply disparity correction to zero at infinity
	public int        inf_repeat =       5;      // Re run disparity correction at infinity multiple times
	//  		public boolean    inf_mism_apply =   true;   // Apply lazy eye correction at infinity

	public int        inf_iters =        20;     // Infinity extraction - maximum iterations
	public double     inf_final_diff =   0.0001; // Coefficients maximal increment to exit iterations
	public double     inf_far_pull =     0.0;    // include farther tiles than tolerance, but scale their weights

	// infinity filter
	public double     inf_str_pow =      1.0;    // Strength power for infinity filtering
	public int        inf_smpl_side =    3;      // Sample size (side of a square) for infinity filtering
	public int        inf_smpl_num =     5;      // Number after removing worst (should be >1) for infinity filtering
	public double     inf_smpl_rms =     0.1;    // Maximal RMS of the remaining tiles in a sample for infinity filtering

	//Histogram infinity filter
	public int        ih_smpl_step =     8;      // Square sample step (50% overlap)
	public double     ih_disp_min =     -1.0;    // Minimal disparity
	public double     ih_disp_step =     0.05;   // Disparity step
	public int        ih_num_bins =     40;      // Number of bins
	public double     ih_sigma =         0.1;    // Gaussian sigma (in disparity pixels)
	public double     ih_max_diff =      0.1;    // Keep samples within this difference from farthest maximum
	public int        ih_min_samples =  10;      // Minimal number of remaining samples
	public boolean    ih_norm_center =  true;    // Replace samples with a single average with equal weight
	public boolean    inf_restore_disp = true;   // Add disparity back to d{x,y}[i] (debug feature)
	
	// intraframe filtering, reusing LY clusters
	public double     intra_keep_strength = 0.4;           // do not remeasure if stronger than
	public double     intra_keep_conditional_strength = 0.3;    // keep if has a close neighbor in clusters
	public double     intra_absolute_disparity_tolerance = 1.0; //
	public double     intra_relative_disparity_tolerance = 0.1; // 
	public int        intra_cluster_size = 4;
	
	// Lazy eye parameters

	public boolean    ly_lma_ers =      true;    // Use 2020 LMA-based measurement of mismatch (GPU-supported)
	public double     ly_gt_strength =  0.18;    // use some configurable parameters
	public boolean    ly_gt_use_wnd =   true;    //
	public double     ly_gt_rms =       0.2;     // split small source samples to FG/BG if all aux tile RMS exceeds this value

// Use for LWIR
	public boolean    lylw_inf_en =       true;    // Simultaneously correct disparity at infinity (both poly and extrinsic)
	public boolean    lylw_aztilt_en =    true;    // Adjust azimuths and tilts
	public boolean    lylw_diff_roll_en = true;    // Adjust differential rolls (3 of 4 angles)
	public boolean    lylw_focalLength=   true;    // Correct scales (focal length temperature? variations)
	public boolean    lylw_com_roll=      false;   // Enable common roll (valid for high disparity range only)
	public int        lylw_par_sel   =    0;       // Manually select the parameter mask bit 0 - sym0, bit1 - sym1, ... (0 - use checkbox selections above)

	public double     ly_marg_fract =    0.2;    // part of half-width, and half-height to reduce weights
	public double     ly_rad_to_hdiag =  0.8;    // Limit by radius too (1.0 - radius is half diagonal, same margins, use min)
	public boolean    ly_on_scan =      true;    // Calculate and apply lazy eye correction after disparity scan (poly or extrinsic)
	public boolean    ly_inf_en =       true;    // Simultaneously correct disparity at infinity (both poly and extrinsic)
	public int        ly_min_forced =     20;    // Minimal number of clusters with forced disparity to use it
	public boolean    ly_aztilt_en =    true;    // Adjust azimuths and tilts
	public boolean    ly_diff_roll_en = true;    // Adjust differential rolls (3 of 4 angles)
	public boolean    ly_focalLength=   true;    // Correct scales (focal length temperature? variations)
	public boolean    ly_com_roll=      false;   // Enable common roll (valid for high disparity range only)
	public boolean    ly_ers_rot=       true;    // Enable ERS correction of the camera rotation
	public boolean    ly_ers_forw=      true;    // Enable ERS correction of the camera linear movement in z direction
	public boolean    ly_ers_side=      false;   // true;    // Enable ERS correction of the camera linear movement in x direction
	public boolean    ly_ers_vert=      false;   // true;    // Enable ERS correction of the camera linear movement in y direction
	public int        ly_par_sel   =    0;       // Manually select the parameter mask bit 0 - sym0, bit1 - sym1, ... (0 - use checkbox selections above)

	public  double    ly_weight_infinity =      0.3; // Total weight of infinity tiles fraction (0.0 - 1.0) 
	public  double    ly_weight_disparity =     0.0; // Disparity weight relative to the sum of 8 lazy eye values of the same tile 
	public  double    ly_weight_disparity_inf = 0.5; // Disparity weight relative to the sum of 8 lazy eye values of the same tile for infinity 
	public  double    ly_max_disparity_far =    5.0; // Reduce weights of near tiles proportional to sqrt(max_disparity_far/disparity) 
	public  double    ly_max_disparity_use = 1000.0; // Disregard near objects (default 1000) for LY adjustment to avoid ERS influence
	
	public  double    ly_inf_min_dfe =         1.75; // Clouds detection: minimal distance from bg_sel edge for non-zero weight 
	public  double    ly_inf_max_dfe =         5.0;  // Clouds detection: saturation level for distance from bg_sel edge (<=0 - disable feature) 
	
	public  boolean   ly_inf_force_fine =    false;  // Use fine settings even for early adjustment cycles 
	public  double    ly_inf_min_broad =      -1.0;  // Minimal infinity disparity during early LY adjustments (broad) 
	public  double    ly_inf_max_broad =       0.5;  // Maximal infinity disparity during early LY adjustments (broad) 
	public  double    ly_inf_min_narrow =     -0.2;  // Minimal infinity disparity during late LY adjustments (narrow) 
	public  double    ly_inf_max_narrow =      0.05; // Maximal infinity disparity during late LY adjustments (narrow 

	public  boolean   ly_moving_en =           false;  // enable filtering areas with potentially moving objects 
	public  boolean   ly_moving_apply =        false;  // apply filtering areas with potentially moving objects 
	public  double    ly_moving_sigma =          1.0;  // blurring sigma for moving objects = 1.0;
	public  double    ly_max_mov_disparity =    75.0;  // disparity limit for moving objects detection = 75.0;
	public  double    ly_rad_to_hdiag_mov =      0.7;  // radius to half-diagonal ratio to remove high-distortion corners = 0.7 ; // 0.8
	public  double    ly_max_mov_average =       0.2;  // do not attempt to detect moving objects if ERS is not accurate for terrain = .25;
	public  double    ly_mov_min_L2 =            0.75; // threshold for moving objects = 0.75;

	public int        ly_debug_level =  0;       // LY debug level

	public boolean    ly_right_left=    true;    // equalize weights of right/left FoV (use with horizon in both halves and gross infinity correction)
	public boolean    ly_inf_tilt=      true;    // select infinity tiles form right/left tilted (false - from average)  
	public int        ly_per_quad =     10;      // minimal tiles per quadrant (not counting the worst) tp proceed
	public double     ly_per_quad_r =   0.003;    // minimal relative tiles per quadrant (not counting the worst) tp proceed
	public int        ly_inf =          10;      // minimal number of tiles at infinity to proceed
	public double     ly_inf_r =        0.0; //0.01;    // minimal relative number of tiles at infinity to proceed
	public int        ly_inf_scale =    20;      // minimal number of tiles at infinity to apply weight scaling
	public double     ly_inf_scale_r =  0.02;    // minimal relative number of tiles at infinity to apply weight scaling

	public double     ly_inf_frac =     0.7;     // Relative weight of infinity calibration data
	public double     ly_inf_max_disparity = 0.2;   // Maximal disparity to be treated as infinity when adjusting with rig data
	public boolean    ly_inf_disp=      false;   // Correct disparity for infinity tiles
	public boolean    ly_inf_force=     false;   // Force convergence correction during extrinsic, even with no infinity data
	public boolean    ly_poly =         false;   // Use polynomial correction, false - correct tilt/azimuth/roll of each sensor

	public int        ly_smpl_side =    3;       // Sample size (side of a square) disp/strength filter
	public int        ly_smpl_num =     5;       // Number after removing worst (should be >1)
	// 		public double     ly_meas_disp =    1.5;     // Maximal measured relative disparity - using  (0.8*disp_scan_step)
	public double     ly_smpl_rms =     0.05;     // 1;     // Maximal RMS of the remaining tiles in a sample

	public double     ly_disp_var =     0.1;     // Maximal full disparity difference to 8 neighbors
	public double     ly_disp_rvar =    0.01;    // Maximal relative full disparity difference to 8 neighbors

	public double     ly_disp_var_gt =  0.5;     // Maximal full disparity difference to 8 neighbors when  GT is available
	public double     ly_disp_rvar_gt = 0.05;    // Maximal relative full disparity difference to 8 neighbors when  GT is available


	public double     ly_norm_disp =    5.0;     // Reduce weight of higher disparity tiles

	// Lazy eye multi-step fitting
	public String     lym_dbg_path =   "";      // read saved extrinsics_bgnd_combo.tif to bypass long preparation
	
	public double     lym_overexp     = 0.0001;  // Any (near) saturated pixels - discard tile (see sat_level also)
	public boolean    lym_update_disp = true;    // Update target disparity after each step
	public int        lym_iter =        25;      // Maximal number of iterations
	private double    lym_change =      5e-5;    // Parameter vector difference to exit 4e-6 - OK
	private double    lym_change_aux =  1e-4;    // same for aux camera (currntly)lwir
	public double     lym_poly_change = 0.002;   // Parameter vector difference to exit from polynomial correction
	
	public boolean    lym_mod_map =     true;    // Modify preliminary disparity map before running LY
	public boolean    lym_top_bg =      true;    // All above found BG is also BG (valid for most, but not all scenes)
	public int        lym_fill_gaps_bg = 0;      // fill small gaps in found background 
	public int        lym_fill_gaps_combo = 2;   // 1 - in 4 directions by 1, 2 - in 8 directions by 1,
	public boolean    lym_use_strength = true;   // Use strength when averaging disparity from neighbors
	public double     lym_scale_deriv_str=0.5;   // Scale strength of the interpolated tiles from average neighbors strength
	
	public boolean    lyf_filter =      false;   // Filter lazy eye pairs by their values
	public int        lyf_smpl_side =   3;       // 8 x8 masked, 16x16 sampled
	public double     lyf_rms_max =     0.1;     // Maximal RMS (all components to components average)
	public double     lyf_frac_keep =   0.5;     // Keep best fit samples, discard worst
	public int        lyf_min_samples = 5;       // Minimal number of tiles remaining in the sample
	public boolean    lyf_norm_center = true;    // Replace samples with a single average with equal weight
	public double     ly_corr_scale =   1.0;     // Scale calculated correction vector
	public boolean    lyr_filter_ds =   false;    // true;
	public boolean    lyr_filter_lyf =  false;   // ~clt_parameters.lyf_filter, but may be different, now off for a single cameras


	// old fcorr parameters, reuse?
	// 		public int        fcorr_sample_size = 32;    // Use square this size side to detect outliers
	// 		public int        fcorr_mintiles =    8;     // Keep tiles only if there are more in each square
	// 		public double     fcorr_reloutliers = 0.5;   // Remove this fraction of tiles from each sample
	// 		public double     fcorr_sigma =       20.0;  // Gaussian blur channel mismatch data

	public double     corr_magic_scale =  0.85;  // reported correlation offset vs. actual one (not yet understood)
	public int        corr_select =       0;     // Select correlation type for all-pair supertiles and assignments (0 - CM, 1 - polynomial)

	// 3d reconstruction
	public boolean    show_textures    = true;  // show generated textures
	public boolean    debug_filters    = false;// show intermediate results of filtering
	// not used anywhere so far
	public double     min_smth         = 0.25;  // 0.25 minimal noise-normalized pixel difference in a channel to suspect something
	public double     sure_smth        = 2.0;   // reliable noise-normalized pixel difference in a channel to have something
	public double     bgnd_range       = 0.3;   // disparity range to be considered background
	public double     other_range      = 2.0;   // disparity difference from center (provided) disparity to trust

	public double     ex_strength      = 0.18;  // minimal 4-corr strength to trust tile
	public double     ex_nstrength     = 0.4;   // minimal 4-corr strength divided by channel diff for new (border) tiles

	public boolean    ex_over_bgnd     = false; // Allow expansion over previously identified background (infinity)
	public double     ex_min_over      = 1.0;   // When expanding over background, disregard lower disparity

	public double     pt_super_trust   = 1.6;   // If strength exceeds ex_strength * super_trust, do not apply ex_nstrength and plate_ds
	public boolean    pt_keep_raw_fg   = true;  // Do not replace raw tiles by the plates, if raw is closer (like poles)
	public double     pt_scale_pre     = 1.5;   // Scale plates strength before comparing to raw strength
	public double     pt_scale_post    = 2.5;   // Scale plates strength when replacing raw (plates d/s data is more reliable if it exists)

	public double     bgnd_sure        = 0.18;  // minimal strength to be considered definitely background
	public double     bgnd_maybe       = 0.1; // maximal strength to ignore as non-background
	//  		public double     bgnd_2diff       = 0.005; // maximal strength to ignore as non-background
	public int        min_clstr_seed   = 4; //2;     // number of tiles in a cluster to seed (just background?)
	public int        min_clstr_lone   = 4;     // number of tiles in a cluster not close to other clusters (more than 2 tiles apart)
	public double     min_clstr_weight = 0.0;   // Minimal total strength of the cluster
	public double     min_clstr_max    = 0.18;  // Minimal maximal strength of the cluster

	public int        fill_gaps        = 4;     // same as in grow - 1:  4 directions by 1 step, 2: 8 directions by 1 step. +2*n - alternating hor/vert
	public int        fill_final       = 50;    // same as fill_gaps, on the final pass
	public int        min_clstr_block  = 3;     // number of tiles in a cluster to block (just non-background?)
	public int        bgnd_grow        = 2;     // number of tiles to grow (1 - hor/vert, 2 - hor/vert/diagonal)

	//  		public double     ortho_min        = 0.09;  // minimal strength of hor/vert correlation to be used instead of full 4-pair correlation
	public boolean    ortho_old        = false; // use old ortho features processing (orth0_* parameters, false - use or_*)
	public double     ortho_min_hor    = 0.07;  // minimal strength of hor correlation to be used instead of full 4-pair correlation -
	public double     ortho_min_vert   = 0.15;  // minimal strength of vert correlation to be used instead of full 4-pair correlation
	public double     ortho_asym       = 1.2;   // vert/hor (or hor/vert) strength to be used instead of the full correlation
	public double     ortho_over4      = 0.8;   // vert/hor (or hor/vert) strength exceeding scaled 4-pair strength
	public double     ortho_sustain    = 0.05;  // minimal strength of hor/vert to bridge over
	public int        ortho_run        = 3;     // minimal run of hor/vert tiles to be considered (at least from one side)
	public double     ortho_minmax     = 0.09;  // minimal maximal strength in an ortho run
	public int        ortho_bridge     = 10;    // number of tiles to bridge over hor/vert gaps
	public double     ortho_rms        = 0.3;   // maximal disparity RMS in a run to replace by average
	public int        ortho_half_length = 4;    // convolve hor/vert strength by 3*(2*l+1) kernels to detect multi-tile features
	public double     ortho_mix        = 0.5;   // Fraction ovf convolved ortho in a mix with raw

	// Alternative mixing of ortho disparity/strength
	public boolean    or_hor           = true;  // Apply ortho correction to horizontal correlation (vertical features)
	public boolean    or_vert          = true;  // Apply ortho correction to vertical correlation (horizontal features)
	public double     or_sigma         = 2.0;   // Blur sigma: verically for horizontal correlation, horizontally - for vertically
	public double     or_sharp         = 0.0;   // 0.5;   // 3-point sharpening (-k, +2k+1, -k)
	public double     or_scale         = 2.5;   // Scale ortho correletion strength relative to 4-directional one
	public double     or_offset        = 0.1;   // Subtract from scaled correlation strength, limit by 0
	public double     or_asym          = 1.5;   // Minimal ratio of orthogonal strengths required for dis[parity replacement
	public double     or_threshold     = 0.3;   // 1.5;   // Minimal scaled offset ortho strength to normal strength needed for replacement
	public double     or_absHor        = 0.15;  // Minimal horizontal absolute scaled offset ortho strength needed for replacement
	public double     or_absVert       = 0.19;  // Minimal vertical absolute scaled offset ortho strength needed for replacement
	public double     or_maxDisp       = 5.0;   // Maximal disparity to apply ortho correction

	public boolean    poles_fix        = true;  // Continue vertical structures to the ground
	public int        poles_len        = 25;    // Number of tiles to extend over the poles bottoms
	public double     poles_ratio      = 1.0;   // Maximal ratio of invisible to visible pole length
	public double     poles_min_strength = 0.1; // Set new pole segment strength to max of horizontal correlation and this value
	public boolean    poles_force_disp = true;  // Set disparity to that of the bottom of existing segment (false - use hor. disparity)

	public int        max_clusters     = 500;   // Maximal number of clusters to generate for one run
	public boolean    remove_scans     = true;  // Remove all unneeded scans when generating x3d output to save memory
	public boolean    output_x3d       = true;  // Generate x3d output
	public boolean    output_obj       = true;  // Generate Wavefront obj output


	public boolean    correct_distortions = false; // Correct lens geometric distortions in a model (will need backdrop to be corrected too)
	public boolean    show_triangles =    true;  // Show generated triangles
	public boolean    avg_cluster_disp =  false;  // Weight-average disparity for the whole cluster
	public double     maxDispTriangle   = 0.2;    // Maximal relative disparity difference in a triangle face
	public double     infinityDistance  = 10000;  // Distance to generate backdrop (0 - use regular backdrop)
	public int        min_bgnd_tiles    = 10;     // Minimal number of background tiles to generate background
	public boolean    shUseFlaps        = true;  // Split into shells with flaps
	public boolean    shAggrFade        = false; // true;  // Aggressive fade alpha (whole boundary)
	public int        shMinArea         = 1;     // Minimal shell area (not counting flaps
	public double     shMinStrength    = 0.2;   // Minimal value of the shell maximum strength

	// Thin ice parameters
	public double     tiRigidVertical   = 3.0;   // 2.0 relative disparity rigidity in vertical direction
	public double     tiRigidHorizontal = 1.0;   // 2.0 relative disparity rigidity in horizontal direction
	public double     tiRigidDiagonal   = 0.5;   // 0.5 relative disparity rigidity in diagonal direction
	public double     tiStrengthOffset  = 0.1;   // 0.1 strength "floor" - subtract (limit 0) before applying
	public double     tiDispScale       = 0.5;   // 0.5 divide actual (disparity*eff_Strength) by this  before Math.pow and applying to T.I.
	public double     tiDispPow         = 0.0;   // 0.0 apply pow to disparity (restore sign) for disparity difference pressure on ice
	public double     tiDispPull        =  .1;   // 10.0 tiDispPull: multiply strength*disparity difference to pull force
	public double     tiDispPullPreFinal=  .1;   // 5.0 Scale tiDispPull for pre-final pass
	public double     tiDispPullFinal   =  .01;  // 2.0 Scale tiDispPull for final pass

	public double     tiBreakNorm       =   .5;  // Normalize stresses to average disparity if it is above threshold
	public double     tiBreak3          = 0.6;   // 0.5 TI break value of abs(d0-3d1+3d2-d3)
	public double     tiBreak31         = 0.1;   // 0.04 TI break value of (d0-3d1+3d2-d3) * (d1 - d2)
	public double     tiBreak21         = 0.1;   // 0.1 TI break value of (-d0+d1+d2-d3) * abs(d1 - d2)
	public double     tiBreakFar        = 0.3;   // 0.3  TI disparity threshold to remove as too far tiles
	public double     tiBreakNear       = 0.3;   // 0.3 TI disparity threshold to remove as too near tiles
	public int        tiBreakMode       = 0;     // 1 TI break mode: +1: abs(3-rd derivative), +2: -(3-rd * 1-st), +4: -(2-nd * abs(1-st)) , +8 - remove far, +16 - remove near
	public double     tiBreakSame       = 0.5;   // 0.75 Amplify colinear breaks in neighbor tiles
	public double     tiBreakTurn       = 0.125; // 0.125 Amplify 90-degree turnintg breaks in neighbor tiles

	public double     tiHealPreLast     = 0.1;    // 0.1 Heal disparity gap before pre-last smooth
	public double     tiHealLast        = 0.05;   // 0.05 Heal disparity gap before last smooth
	public int        tiHealSame        = 5;      // 10 Maximal length of an internal break in the cluster to heal

	public int        tiIterations      = 1000;  // 300 maximal number of TI iterations for each step
	public int        tiPrecision       = 6;     // 6 iteration maximal error (1/power of 10)
	public int        tiNumCycles       = 5;     // 5 Number of cycles break-smooth (after the first smooth)

	// FG/BG separation
	public boolean    stUseRefine =       false; // Apply super-tiles during refine passes
	public boolean    stUsePass2 =        true;  // Apply super-tiles during pass2
	public boolean    stUseRender =       true;  // Apply super-tiles during render

	public boolean    stShow =            false; // Calculate and show supertiles histograms
	public int        stSize            = 8;     // Super tile size (square, in tiles)
	public double     stStepFar         = 0.1;   // Disparity histogram step for far objects
	public double     stStepNear        = 0.5;   // Disparity histogram step for near objects
	public double     stStepThreshold   = 1.0;   // Disparity threshold to switch from linear to logarithmic steps
	public double     stMinDisparity    = 0.0;   // Minimal disparity (center of a bin)

	// moved to MeasuredLayersFilterParameters
	//  		public double     stFloor           = 0.1;  // Subtract from strength, discard negative
	//  		public double     stPow             = 1.0;   // raise strength to this power
	public double     stSigma           = 1.5;   // Blur disparity histogram (sigma in bins)
	public double     stMinBgDisparity  = 0.0;   // Minimal backgroubnd disparity to extract as a maximum from the supertiles
	public double     stMinBgFract      = 0.1;   // Minimal fraction of the disparity histogram to use as background
	public double     stUseDisp         = 0.12;  // Use background disparity from supertiles if tile strength is less
	public double     stStrengthScale   = 50.0;  // Multiply st strength if used instead of regular strength
	public boolean    stSmplMode        = true;   // Use sample mode (false - regular tile mode)

	//  		public int        stSmplSide        = 3;      // Sample size (side of a square)
	//  		public int        stSmplNum         = 5;      // Number after removing worst
	//  		public double     stSmplRms         = 0.3;    // Maximal RMS of the remaining tiles in a sample
	//		public boolean    stSmplWnd         = false;  // Use window function for the samples (TODO: change default to true after testing)

	// Additional parameters to prevent increase of the  distance to far (small) objects. It happens because of averaging bg and fg disparities
	// These parameters are also used when expanding tiles from the known ones.

	//		public double     fs_max_abs_tilt  = 2.0; // Maximal absolute tilt in pixels/tile
	//		public double     fs_max_rel_tilt  = 0.2; // Maximal relative tilt in pixels/tile/disparity
	//		public double     fs_damp_tilt  =    0.001; // Tilt cost for damping insufficient plane data
	//		public double     fs_min_tilt_disp = 4.0; // Disparity switch between filtering modes - near objects use tilts, far - use max disparity
	//		public double     fs_transition    = 1.0; // Mode transition range (between tilted and maximal disparity)
	//		public int        fs_far_mode  =     1;   // Far objects filtering mode (0 - off, 1 - power of disparity)
	//		public double     fs_far_power =     3.0; // Raise disparity to this power before averaging for far objects


	public int        stGrowSel         = 2;     // Grow initial selection before processing supertiles, odd - ortho. <0 - use all tiles
	public int        stMeasSel         = 1;     // Select measurements for supertiles : +1 - combo, +2 - quad +4 - hor +8 - vert

	public double     stSmallDiff       = 0.4;   // Consider merging initial planes if disparity difference below
	public double     stHighMix         = 0.4;   // Consider merging initial planes if jumps between ratio above


	public double     outlierStrength  =  0.3;   // Outlier tiles weaker than this may be replaced from neighbors
	public double     outlierDiff      =  0.4;   // Replace weak outlier tiles that do not have neighbors within this disparity difference
	public double     outlierDiffPos   =  1.0;   // Replace weak outlier tiles that have higher disparity than weighted average
	public double     outlierDiffNeg   =  0.4;   // Replace weak outlier tiles that have lower disparity than weighted average

	// TODO: Make refine skip if already good?
	public boolean    combine_refine    = true; // combine with all previous after refine pass
	public double     combine_min_strength = 0.12; // Disregard weaker tiles when combining scans
	public double     combine_min_hor =      0.12; // Disregard weaker tiles when combining scans for horizontal correlation
	public double     combine_min_vert =     0.12; // Disregard weaker tiles when combining scans for vertical correlation

	// TODO: Move together with similar parameters
	//  		public double     unique_tolerance = 0.1; // Do not re-measure correlation if target disparity differs from some previous by this

	// Multi-pass growing disparity
	public int        grow_sweep         = 8; // Try these number of tiles around known ones
	public double     grow_disp_max =   160.0;// Maximal disparity to try
	public double     grow_disp_trust =  4.0; // Trust measured disparity within +/- this value
	public double     grow_disp_step =   6.0; // Increase disparity (from maximal tried) if nothing found in that tile // TODO: handle enclosed dips?
	public double     grow_min_diff =    0.5; // Grow more only if at least one channel has higher variance from others for the tile

	public boolean    grow_retry_far =  false; // Retry tiles around known foreground that have low max_tried_disparity
	public boolean    grow_pedantic =   false; // Scan full range between max_tried_disparity of the background and known foreground
	public boolean    grow_retry_inf =  false;  // Retry border tiles that were identified as infinity earlier

	// New for initial growing
	public boolean    gr_new_expand        =   true;
	//		public int        gr_max_expand        = 500; // 150; // 30;

	public double     fds_str_floor        =   0.09; // Should be normally less than combine_min_strength
	public double     gr_ovrbg_cmb         =   0.3; // 0.3;
	public double     gr_ovrbg_cmb_hor     =   0.3; // 0.3;
	public double     gr_ovrbg_cmb_vert    =   0.3; // 0.3;
	public double     gr_ovrbg_filtered    =   0.3; // 0.3;
	public double     fds_str_pow          =   1.0;
	public int        fds_smpl_side        =   5; // 3;      // Sample size (side of a square)
	public int        fds_smpl_num         =  13; // 13; // 5;      // Number after removing worst (should be >1)
	public double     fds_smpl_rms         =   0.15; // Maximal RMS of the remaining tiles in a sample
	public double     fds_smpl_rel_rms     =   0.01; // 05;  // Maximal RMS/disparity in addition to smplRms
	public boolean    fds_smpl_wnd         =   true; //
	public double     fds_abs_tilt         =   2.0; // pix per tile
	public double     fds_rel_tilt         =   0.2; // (pix / disparity) per tile

	public boolean    per_filter =             true; // detect and filter periodic structures
	public double     per_trustedCorrelation = 2.0;
	public double     per_initial_diff =       0.8;   // initial disparity difference to merge to maximum
	public double     per_strength_floor =     0.1;   //
	public double     per_strength_max_over =  0.03;  //
	public double     per_min_period =         4.0;   //
	public int        per_min_num_periods =    3; // minimal number of periods
	public double     per_disp_tolerance =     1.0;   // maximal difference between the average of fundamental and
	public double     per_disp_match =         1.5;   // disparity difference to match neighbors
	public double     per_strong_match_inc =   0.05;  // extra strength to treat match as strong (for hysteresis)

	// Macro disparity scanning parameters
	public double     mc_disp8_step        =   2.0;   // Macro disparity scan step (actual disparity step is 8x)
	public double     mc_disp8_trust       =   2.0;   //Trust measured disparity within +/- this value
	public double     mc_strength          =   0.2;   // Minimal composite correlation to process (0.2..0.3)
	public double     mc_unique_tol        =   0.05;  // Do not re-measure macro correlation if target disparity differs from some previous by this

	public double     mc_trust_fin         =   0.3;   // When consolidating macro results, exclude high residual disparity
	public double     mc_trust_sigma       =   0.2;   // Gaussian sigma to reduce weight of large residual disparity
	public double     mc_ortho_weight      =   0.5;   // Weight from ortho neighbor supertiles
	public double     mc_diag_weight       =   0.25;  // Weight from diagonal neighbor supertiles
	public double     mc_gap               =   0.4;   // Do not remove measurements farther from the kept ones


	public double     mc_weight_var        =   1.0;   // weight of variance data (old, detects thin wires?)
	public double     mc_weight_Y          =   1.0;   // weight of average intensity
	public double     mc_weight_RBmG       =   5.0;   // weight of average color difference (0.5*(R+B)-G), shoukld be ~5*weight_Y

	//		  0x1e, // 0x1f, // final int         variants_mask,
	public int        gr_min_new           =  20;    // Discard variant if it requests too few tiles
	public boolean    gr_var_new_sngl      =   false;// Expand only unambiguous tiles over previously undefined
	public boolean    gr_var_new_fg        =   true; // Expand unambiguous and foreground tiles over previously undefined
	public boolean    gr_var_all_fg        =   true;
	public boolean    gr_var_new_bg        =   false;
	public boolean    gr_var_all_bg        =   false;
	public boolean    gr_var_next          =   false; // try next disparity range  TODO: add related statements
	public int        gr_num_steps         =   8;    // How far to extend over previously undefined disparity tiles
	public int        gr_steps_over        =   4;    // How far to extend over previously determined disparity tiles
	public int        gr_smpl_size         =   5;    // Extend sample square side
	public int        gr_min_pnts          =   3;    // Extend at least this number of the seed tiles
	public boolean    gr_use_wnd           =   true; // Use window function for square sample
	public double     gr_tilt_damp         =   0.001;// Tilt cost for damping insufficient plane data
	public double     gr_split_rng         =   5.0;  // When growing, range of disparities to be extended without far/near division
	public double     gr_same_rng          =   3.0;  // consider far/near tiles within that range from the farthest/closest
	public double     gr_diff_cont         =   2.0;  // Maximal difference from the old value when smoothing
	public double     gr_abs_tilt          =   2.0;  // Maximal filter disparity absolute tilt (pix per tile)
	public double     gr_rel_tilt          =   0.2;  // Maximal filter disparity tilt (pix / disparity) per tile
	public int        gr_smooth            =   50;   // Maximal number of smoothing steps (reduce if long?)
	public double     gr_fin_diff          =   0.01; // Maximal change to finish smoothing iterations
	public double     gr_unique_tol        =   0.15; // Do not re-measure correlation if target disparity differs from some previous by this
	public double     gr_unique_pretol     =   0.5;  // Larger tolerance for expanding (not refining)


	public boolean    ft_mod_strength =          true;    // When set, multiply each tile strength by the number of selected neighbors
	public boolean    ft_clusterize_by_highest = true;    // Clusterize using disparity horizontal maximums for fronto planes and minimums - for horizontal. False - use histograms
	public double     ft_clust_sigma =             0.7;   // Blur disparity before argmax/argmin for initial clusterization
	public double     ft_disp_arange_vert =        0.07;  // Absolute disparity range for fronto clusters
	public double     ft_disp_rrange_vert =        0.01;  // Relative disparity range for fronto clusters
	public double     ft_disp_arange_hor =         0.035; // Absolute disparity range for horizontal clusters
	public double     ft_disp_rrange_hor =          0.005; // Relative disparity range for horizontal clusters
	public double     ft_tolerance_above_near =  100.0;   // Actual disparity positive tolerance over blurred disparity argmax range
	public double     ft_tolerance_below_near =   -0.01;  // Actual disparity negative tolerance under blurred disparity argmax range
	public double     ft_tolerance_above_far =     0.07;  // Actual disparity positive tolerance over blurred disparity argmin range
	public double     ft_tolerance_below_far =     0.1;   // Actual disparity negative tolerance under blurred disparity argmin range
	public int        ft_hor_vert_overlap =        2;     // Allow clusters tile sharing between fronto and horizontal. 2 - 1 tile in 8 directions, 1 - 1 tile in 4 directions
	public int        ft_used_companions =         5;     // Cell that has this many new used companions is considered used (borders and already use3d are considered used too)
	public int        ft_used_true_companions =    1;     // There should be at least this many new selected tiles among neighbors.,

	public boolean    plPreferDisparity    =   false;// Always start with disparity-most axis (false - lowest eigenvalue)
	public double     plDispNorm           =   5.0;  // Normalize disparities to the average if above (now only for eigenvalue comparison)
	public double     plFrontoTol          =   0.0;  // for compatibility with old //0.1;  // Fronto tolerance (pix) - treat almost fronto as fronto (constant disparity). <= 0 - disable
	public double     plFrontoRms          =   0.05; // Target rms for the fronto planes - same as sqrt(plMaxEigen) for other planes
	public double     plFrontoOffs         =   0.2;  // increasing weight of the near tiles by using difference between the reduced average as weight. <= 0 - disable
	public double     PlFrontoPow          =   1.0;  // increase weight even more

	public double     plBlurBinVert        =   1.2;  // Blur disparity histograms for constant disparity clusters by this sigma (in bins)
	public double     plBlurBinHor         =   0.8;  // Blur disparity histograms for horizontal clusters by this sigma (in bins)
	public double     plMaxDiffVert        =   0.4;  // Maximal normalized disparity difference when initially assigning to vertical plane
	public double     plMaxDiffHor         =   0.2;  // Maximal normalized disparity difference when initially assigning to horizontal plane
	public int        plInitPasses         =     3;  // Number of initial passes to assign tiles to vert (const disparity) and hor planes

	public int        plMinPoints          =     5;  // Minimal number of points for plane detection
	public double     plTargetEigen        =   0.02; // Remove outliers until main axis eigenvalue (possibly scaled by plDispNorm) gets below
	public double     plFractOutliers      =   0.3;  // Maximal fraction of outliers to remove
	public int        plMaxOutliers        =   200;  // Maximal number of outliers to remove
	public double     plMinStrength        =   0.01; // Minimal total strength of a plane
	public double     plMaxEigen           =   0.06; // Maximal eigenvalue of a plane
	public double     plEigenFloor         =   0.005;// Add to eigenvalues of each participating plane and result to validate connections
	public double     plEigenStick         =   25.0; // Consider plane to be a "stick" if second eigenvalue is below
	public double     plBadPlate           =   0.2;  // Not a plate if sin^2 between normals from disparity and world exceeds this
	public boolean    plDbgMerge           =   true; // Combine 'other' plane with current
	public double     plWorstWorsening     =   2.0;  // Worst case worsening after merge
	public double     plWorstWorsening2    =   5.0;  // Worst case worsening for thin planes
	public double     plWorstEq            =   1.0;  // Worst case worsening after merge with equal weights
	public double     plWorstEq2           =   2.0;  // Worst case worsening for thin planes with equal weights
	public double     plOKMergeEigen       =   0.03; // If result of the merged planes is below, OK to use thin planes (higher) threshold
	public double     plMaxWorldSin2       =   0.1;  // Maximal sine squared of the world angle between planes to merge. Set to >= 1.0 to disable
	public double     pl2dForSin           =   2.5;  // Do not compare sin() between planes, if at least one has too small axis ratio
	public double     plWeakWorsening      =   1.0;  // Relax merge requirements for weaker planes
	public double     plMaxOverlap         =   0.1;  // Maximal overlap between the same supertile planes to merge
	// Merge same supetile planes if at least one is weak and they do not differ much
	public double     plWeakWeight         =   0.2 ; // Maximal weight of the weak plane to merge
	public double     plWeakEigen          =   0.1;  // Maximal eigenvalue of the result of non-weighted merge
	public double     plWeakWeight2        =  10.0 ; // Maximal weight of the weak plane to merge (second variant)
	public double     plWeakEigen2         =   0.05; // Maximal eigenvalue of the result of non-weighted merge  (second variant)
	public double     plSumThick           =   1.6;  // Do not merge if any sqrt of merged eigenvalue exceeds scaled sum of components
	public double     plNeNeibCost         =   5.0;  // When calculating non-exclusive planes, do not use neighbors with high cost
	public double     plNeOwn              =   5.0;  // When calculating non-exclusive planes, use center plane relative weight

	public double     plExNeibCost         =   5.0;  // When calculating exclusive planes links, do not use neighbors with high cost
	//  	    public double     plExNeibCostSngl     =  10.0;  // When calculating exclusive planes links, do not use no-link neighbors with high cost
	public double     plExNeibSmooth       =   0.5;  // Scale down maximal costs for smoothed planes (tighter requirements)
	public double     plMergeCostStar      =   5.0;  // Cost threshold for merging same tile planes if the plane has connected neighbors
	public double     plMergeCost          =  10.0;  // Cost threshold for merging same tile planes if not connected

	public boolean    plConflMerge         =  true;  // Try to merge conflicting planes
	public double     plConflRelax         =   1.5;  // Scale parameters to relax planes fit for merging conflicting planes
	public boolean    plConflSngl          =  true;  // Only merge conflicting planes if this is the only conflicting pair in the supertile
	public boolean    plConflSnglPair      =  true;  // Only merge conflicting planes only if there are just two planes in the supertile

	public double     plWeakFgStrength     =   0.15; // Consider merging plane if it is foreground and maximal strength below this
	public int        plWeakFgOutliers     =   1;    // Remove these strongest from foreground when determining the maximal strength
	public double     plWeakFgRelax        =   2.0;  // Relax cost requirements when merging with weak foreground


	public double     plThickWorld         =   0.2;  // Maximal real-world thickness of merged overlapping planes (meters)
	public double     plThickWorldConfl    =   0.4;  // Maximal real-world merged thickness for conflicting planes
	public double     plRelaxComplete      =   1.5;  // Relax cost requirements when adding exclusive links to complete squares and triangles
	public double     plRelaxComplete2     =   2.0;  // Relax cost requirements during the second pass


	public double     plMaxZRatio          =   2.0;  // Maximal ratio of Z to allow plane merging
	public double     plMaxDisp            =   0.6;  // Maximal disparity of one of the planes to apply  maximal ratio
	public double     plCutTail            =   1.4;  // When merging with neighbors cut the tail that is worse than scaled best
	public double     plMinTail            =   0.015;// Set cutoff value level not less than


	// parameters to recreate planes from tiles disparity/strengths using determined plane connections to neighbors
	public boolean    plDiscrEn            =   true; // Enable planes tiles selection regeneration hinted by supertile neighbors
	public double     plDiscrTolerance     =   0.4;  // Maximal disparity difference from the plane to consider tile
	public double     plDiscrDispRange     =   1.0;  // Parallel move known planes around original know value for the best overall fit
	public int        plDiscrSteps         =   10;   // Number of steps (each direction) for each plane to search for the best fit (0 - single, 1 - 1 each side)
	//  		public int        plDiscrVariants      =   500;  // total number of variants to try (protect from too many planes)
	public int        plDiscrMode          =   3;    // 0 - weighted, 1 - equalized, 2 - best, 3 - combined

	public double     plDiscrVarFloor      =   0.03;  // Squared add to variance to calculate reverse flatness (used mostly for single-cell clusters)
	public double     plDiscrSigma         =   0.05;  // Gaussian sigma to compare how measured data is attracted to planes
	public double     plDiscrBlur          =   0.05;  // Sigma to blur histograms while re-discriminating
	public double     plDiscrExclusivity   =   1.5;   // Tile exclusivity: 1.0 - tile belongs to one plane only, 0.0 - regardless of others
	public double     plDiscrExclus2       =   0.8;   // For second pass if exclusivity > 1.0 - will assign only around strong neighbors
	public boolean    plDiscrStrict        =   false; // When growing selection do not allow any offenders around (false - more these than others)
	public double     plDiscrCorrMax       =   0.7;   // Attraction to different planes correlation that is too high for re-discrimination.
	public double     plDiscrCorrMerge     =   0.85;  // Attraction to different planes correlation that is high enough to merge planes
	public int        plDiscrSteal         =   4;     // If offender has this number of tiles (including center) the cell can not be used
	public int        plDiscrGrown         =   4;     // Only use tiles within this range from original selection

	public double     plDiscrXMedian       =   1.5;   // Remove outliers from the final selection that have distance more than scaled median

	// comparing merge quality for plane pairs
	public double     plCostDist           =   4.0;  // Disparity (pix) - closer cost will use more of the real world, farther - disparity
	public double     plCostKrq            =   0.8;  // Cost of merge quality sqrt(weighted*equal) in disparity space
	public double     plCostKrqEq          =   0.2;  // Cost of merge quality average of weighted and equal weight in disparity space
	public double     plCostWrq            =   0.8;  // Cost of merge quality sqrt(weighted*equal) in world space
	public double     plCostWrqEq          =   0.2;  // Cost of merge quality average of weighted and equal weight in world space
	public double     plCostSin2           =  10.0;  // Cost of sin squared between normals
	public double     plCostRdist2         =1000.0;  // Cost of squared relative distances


	public boolean    plConflDualTri       =   false; // Resolve dual triangles conflict (odoodo)
	public boolean    plConflMulti         =   false; // Resolve multiple odo triangles conflicts
	public boolean    plConflDiag          =   false; // Resolve diagonal (ood) conflicts
	public boolean    plConflStar          =   true;  // Resolve all conflicts around a supertile

	public int        plStarSteps          =   2;    // How far to look around when calculating connection cost
	public double     plStarOrtho          =   0.5;  // When calculating cost for the connections scale 4 ortho neighbors
	public double     plStarDiag           =   0.25; // When calculating cost for the connections scale 4 diagonal neighbors
	public double     plStarPwr            =   0.5;  // Divide cost by number of connections to this power
	public double     plStarWeightPwr      =   0.5;  // use this power of tile weight when calculating connection cost
	public double     plWeightToDens       =   0.3;  // Balance weighted density against density. 0.0 - density, 1.0 - weighted density
	public double     plStarValPwr         =   1.0;  // Raise value of each tile before averaging
	public double     plDblTriLoss         =   0.0001; // When resolving double triangles allow minor degradation (0.0 - strict)
	public boolean    plNewConfl           =   false; // Allow more conflicts if overall cost is reduced
	public int        plMaxChanges         =   0;     // Maximal number of simultaneous connection changes around one tile (0 - any)

	public boolean    plMutualOnly         =   true; // keep only mutual links, remove weakest if conflict
	public boolean    plFillSquares        =   true; // Add diagonals to full squares
	public boolean    plCutCorners         =   true; // Add ortho to 45-degree corners
	public boolean    plHypotenuse         =   true; // Add hypotenuse connection if both legs exist

	public double     plPull               =  5.0; // .3;   // Relative weight of original (measured) plane compared to average neighbor pull
	// when combing with neighbors
	public int        plIterations         =  10;   // Maximal number of smoothing iterations for each step
	public boolean    plStopBad            =  true; // Do not update supertile if any of connected neighbors is not good (false: just skip that neighbor)
	public int        plPrecision          =  6;    // Maximal step difference (1/power of 10)

	public double     plSplitPull          =  .5;   // Relative weight of center plane when splitting into pairs
	public double     plNormPow            =  .5;   // 0.0: 8 neighbors pull 8 times as 1, 1.0 - same as 1
	public int        plSplitMinNeib       =  2;    // Minimal number of neighbors to split plane in pairs
	public double     plSplitMinWeight     =  2.0;  // Minimal weight of split plains to show
	public double     plSplitMinQuality    =  1.1;  // Maximal normalized disparity difference from the plane to consider

	public boolean    plSplitApply         = true;  // Apply plane split to pairs
	public boolean    plNonExclusive       = true;  // Allow tiles to belong to both planes of the pair
	public boolean    plUseOtherPlanes     = false; // Allow other tiles from the same supertile
	public boolean    plAllowParallel      = true;  // Allow parallel shift of the specified planes before adding
	public double     plMaxDiff            = 0.3;   // Maximal normalized tile disparity difference from the plane to consider
	public double     plOtherDiff          = 1.4;   // Maximal difference of the added tile ratio to the average  disparity difference


	public boolean    plSplitXY            = true;  // Separate tiles for split planes by X, Y
	public double     plSplitXYTolerance   = 0.2;   // Disparity tolerance when separating by X, Y


	public boolean    plFuse               =  true; // Fuse planes together (off for debug only)
	public boolean    plKeepOrphans        =  true; // Keep unconnected supertiles
	public double     plMinOrphan          =  2.0;  // Minimal strength unconnected supertiles to keep

	public double     plSnapDispAny        =  .2;   // Maximal (scaled by plDispNorm) disparity difference to snap to plane at any strength
	public double     plSnapStrengthAny    =  .2;   // Maximal strength to fit any distance (if does not fit otherwise - treat as zero str4ength
	public double     plSnapNegAny         =  .5;   // Maximal negative disparity difference from the best match
	public double     plSnapDispMax        =  .5;   // Maximal (scaled by plDispNorm) disparity difference to snap to plane at low strength
	public double     plSnapDispWeight     =  .5;   // Maximal disparity diff. by weight product to snap to plane
	public int        plSnapZeroMode       =  1;    // Zero strength snap mode: 0: no special treatment, 1 - strongest, 2 - farthest

	public boolean    msUseSel             =   true; // Use planes selection masks (generated when splitting to intersecting pairs
	public boolean    msDivideByArea       =   true; // Divide plane strengths by ellipsoid area
	public double     msScaleProj          =   1.5;  // Scale projection of the plane ellipsoid
	public double     msFractUni           =   0.3;  // Spread this fraction of the ellipsoid weight among extended (double) supertile

	public boolean    tsNoEdge             = true;   // Do not assign tiles to the surface edges (not having all 8 neighbors)
	public boolean    tsUseCenter          = true;   // Only assign outside of 8x8 center if no suitable alternative
	public double     tsMaxDiff            = 0.3;    // Maximal disparity difference when assigning tiles
	public double     tsMinDiffOther       = 0.35;   // Minimal disparity difference to be considered as a competitor surface
	public double     tsMinStrength        = 0.05;   // Minimal tile correlation strength to be assigned
	public double     tsMaxStrength        = 10.0;   // Maximal tile correlation strength to be assigned
	public double     tsMinSurface         = 0.001;  // Minimal surface strength at the tile location
	public int        tsMoveDirs           = 3;      // Allowed tile disparity correction: 1 increase, 2 - decrease, 3 - both directions
	public double     tsSurfStrPow         = 0.0;    // Raise surface strengths ratio to this power when comparing candidates
	public double     tsAddStrength        = 0.01;   // Add to strengths when calculating pull of assigned tiles
	public double     tsSigma              = 2.0;    // Radius of influence (in tiles) of the previously assigned tiles
	public double     tsNSigma             = 2.0;    // Maximal relative to radius distance to calculate influence
	public double     tsMinPull            = 0.001;  // Additional pull of each surface
	public double     tsMinAdvantage       = 3.0;    // Minimal ratio of the best surface candidate to the next one to make selection

	public int        tsClustSize          = 1;      // Minimal size of a cluster to keep
	public double     tsClustWeight        = 0.2;    // Minimal total weight of a cluster to keep

	public int        tsMinNeib            = 6;      // Minimal number of neighbors of unassigned tile to join (the farthest)
	public double     tsMaxSurStrength     = 0.05;   // Maximal strength of the surrounded unassigned tile to join
	public boolean    tsCountDis           = true;   // Include disabled tiles/borders when counting assigned neighbors

	public boolean    tsEnPlaneSeed        = true;   // Assign tiles that were used to generate planes
	public boolean    tsEnOnly             = true;   // Allow assignment only surface
	public boolean    tsEnGrow             = true;   // Grow the only surface assignments
	public double     tsGrowStrength       = 0.01;   // Maximal strength when growing the only surfaces
	public boolean    tsGrowStrong         = true;   // Grow over strong if disparity matches
	public double     tsContStrength       = 0.1;    // Minimal strength to continue grow with disparity match
	public double     tsContDiff           = 0.1;    // Maximal normalized disparity error to grow over strong tiles


	public boolean    tsEnSingle           = true;   // Allow assignment to the nearest surface with no competitors
	public boolean    tsEnMulti            = true;   // Allow assignment when several surfaces fit

	public boolean    tsRemoveWeak1        = false;  // Remove weak clusters before growing
	public boolean    tsGrowSurround       = true;   // Assign tiles that have neighbors to the lowest disparity
	public boolean    tsRemoveWeak2        = true;   // Remove weak clusters after growing

	public boolean    tsLoopMulti          = true;   // Repeat multi-choice assignment while succeeding
	public boolean    tsReset              = false;  // Reset tiles to surfaces assignment
	public boolean    tsShow               = false;  // Show results of tiles to surfaces assignment
	public int        tsNumClust           = 500;     // Number of clusters to keep

	public int        tsConsensMode        = 7;      // Which assignments to match +1 - combo, +2 grown single, +4 plane seeds
	public int        tsConsensAgree       = 1;      // Minimal number of assignments to agree

	// Tile assignment parameters
	public double     taMinFgBg            = 0.1;    // Minimal foreground/ background separation to look for weak FG edge
	public double     taMinFgEdge          = 0.2;    // Minimal foreground edge strength (stronger edges will have proportionally smaller costs)
	public double     taMinColSep          = 0.05;   // Minimal surface separation that requires color change
	public double     taMinColDiff         = 0.01;   // Minimal color variation (larger proportionally reduces cost)
	public double     taOutlier            = 1.0;    // Disparity difference limit
	public double     taDiffPwr            = 0.25;   // Strength power when calculating disparity error
	public double     taBestPwr            = 0.0;    // Strength power when calculating disparity error over best
	public double     taDiff9Pwr           = 0.5;    // Strength power when calculating disparity error for group of 9
	public double     taColSigma           = 1.5;    // Gaussian sigma to blur color difference between tiles along each direction
	public double     taColFraction        = 0.3;    // Relative amount of the blurred color difference in the mixture


	public double     taCostEmpty          = 1.0;    // Cost of a tile that is not assigned
	public double     taCostNoLink         = 1.0;    // Cost of a tile not having any neighbor in particular direction
	public double     taCostSwitch         = 1.0;    // Cost of a tile switching to a neighbor that does not have a link
	public double     taCostColor          = 1.0;    // Cost of a tile switching to a disconnected neighbor divided by a color mismatch
	public double     taCostDiff           = 1.0;    // Cost of a weighted normalized tile disparity error
	public double     taCostDiffBest       = 1.0;    // Cost of a weighted normalized tile disparity error above best surface
	public double     taCostDiff9          = 1.0;    // Cost of a weighted normalized tile disparity error for tile and 8 neighbors (DC)
	public double     taCostWeakFgnd       = 1.0;    // Cost of a weak foreground edge
	public double     taCostFlaps          = 1.0;    // Cost of using supertile "flaps" (not in the center 8x8 tiles area)
	public double     taCostMismatch       = 1.0;    // Cost of a measurement layer not having same layer in the same location or near

	public boolean    taEnEmpty            = true;   // Enable cost of a tile that is not assigned
	public boolean    taEnNoLink           = true;   // Enable cost of a tile not having any neighbor in particular direction
	public boolean    taEnSwitch           = true;   // Enable cost of a tile switching to a neighbor that does not have a link
	public boolean    taEnColor            = true;   // Enable cost of a tile switching to a disconnected neighbor divided by a color mismatch
	public boolean    taEnDiff             = true;   // Enable cost of a weighted normalized tile disparity error
	public boolean    taEnDiffBest         = true;   // Enable cost of a weighted normalized tile disparity error above best surface
	public boolean    taEnDiff9            = true;   // Enable cost of a weighted normalized tile disparity error for tile and 8 neighbors (DC)
	public boolean    taEnWeakFgnd         = true;   // Enable cost of a weak foreground edge
	public boolean    taEnFlaps            = true;   // Enable cost of using supertile "flaps" (not in the center 8x8 tiles area)
	public boolean    taEnMismatch         = false;  // Enable cost of a measurement layer not having same layer in the same location or near

// gpu processing parameters
	public double     gpu_corr_scale =       0.75; // reduce GPU-generated correlation values
	public int        gpu_corr_rad =         7;  // size of the correlation to save - initially only 15x15
	public double     gpu_weight_r =         0.5; // 25;
	public double     gpu_weight_b =         0.2; // 0.25; // weight g = 1.0 - gpu_weight_r - gpu_weight_b
	public double     gpu_sigma_r =          0.9; // 1.1;
	public double     gpu_sigma_b =          0.9; // 1.1;
	public double     gpu_sigma_g =          0.6; // 0.7;
	public double     gpu_sigma_m =          0.4; // 0.7;
	public double     gpu_sigma_rb_corr =    0.3; // apply LPF after accumulating R and B correlation before G,
	public double     gpu_sigma_corr =       0.8;
	public double     gpu_sigma_corr_m =     0.15;
	public double     gpu_sigma_log_corr =   3.0; // fill in after testing
	public double     gpu_sigma_log_corr_m = 3.0; // fill in after testing
	public double     gpu_fatz =           500.0; // was 30
	public double     gpu_fatz_m =         500.0; // was 30

	public boolean    gpu_woi =             false; // if true - use gpu_woi_tx, ...
	public int        gpu_woi_tx =              0;
	public int        gpu_woi_ty =              0;
	public int        gpu_woi_twidth =        324;
	public int        gpu_woi_theight =       242;
	public boolean    gpu_woi_round =       false;
	public boolean    gpu_save_ports_xy =   false; // debug feature - save calculated ports X,Y to compare with Java-generated
	public boolean    gpu_show_jtextures =  true;  // debug feature - show Java-generated textures from non-overlapping in GPU (will not generate if false)
	public boolean    gpu_show_extra =      true;  // show low-res data for macro
	public boolean    gpu_show_geometry =   true;  // show geometry correction 
	
	public boolean    gpu_use_main =        false; // accelerate tile processor for the main quad camera
	public boolean    gpu_use_main_macro =  false; // accelerate tile processor for the main quad camera in macro mode
	public boolean    gpu_use_main_adjust = false; // accelerate tile processor for the main quad camera for field calibration
	public boolean    gpu_use_aux =         false; // accelerate tile processor for the aux (lwir) quad camera
	public boolean    gpu_use_aux_macro =   false; // accelerate tile processor for the aux (lwir) quad camera in macro mode
	public boolean    gpu_use_aux_adjust =  false; // accelerate tile processor for the aux (lwir) quad camera for field calibration
	public boolean    gpu_debug_accum =     false; // debug multi-tile TD accumulation

	public boolean    replaceWeakOutliers =   true; // false;

	public boolean    debug_initial_discriminate = false;

	public boolean    dbg_migrate =            true;

	// other debug images
	public int        dbg_early_exit =         0;     // Exit from early stages
	public boolean    show_first_bg =          false; // show extrinsic adjustment differences

	public boolean    show_interframe =        false; // show interframe processing
	public boolean    show_filter_ly =         false; // show dsi filtering by LY clusters
	public boolean    show_extrinsic =         false; // show extrinsic adjustment differences
	public boolean    show_ortho_combine =     false; // Show 'ortho_combine'
	public boolean    show_refine_supertiles = false; // show 'refine_disparity_supertiles'
	public boolean    show_bgnd_nonbgnd =      false; // show 'bgnd_nonbgnd'
	public boolean    show_filter_scan =       false; // show 'FilterScan'
	public boolean    show_combined =          false; // show 'combo_scan' (combined multiple scans)
	public boolean    show_unique =            false; // show 'unique_scan' (removed already measured tiles with the same disparity)
	public boolean    show_histograms =        false; // show supertile disparity histograms
	public boolean    show_init_refine =       false; // show debug images during initial refinement
	public boolean    show_expand =            false; // show debug images during disparity expansion
	public boolean    show_variant =           false; // show prepareExpandVariant when elevating variant number
	public boolean    show_retry_far =         false; // show debug images related to retrying far tiles near foreground
	public boolean    show_macro =             false; // show debug images related to macro correlation

	public boolean    show_shells =            false; // show 'shells'
	public boolean    show_neighbors =         false; // show 'neighbors'
	public boolean    show_flaps_dirs =        false; // show 'flaps-dirs'
	public boolean    show_first_clusters =    false; // show 'first_N_clusters'
	public boolean    show_planes =            false; // show planes
	public double []  vertical_xyz =           {0.0,1.0,0.0}; // real world up unit vector in camera CS (x - right, y - up, z - to camera};

	public ImageDttParameters             img_dtt = new ImageDttParameters();
	public BiQuadParameters               rig =     new BiQuadParameters();
	public PoleProcessorParameters        poles =   new PoleProcessorParameters();
	public MeasuredLayersFilterParameters mlfp =    new MeasuredLayersFilterParameters();
	public LwirReaderParameters           lwir =    new LwirReaderParameters();
	public OpticalFlowParameters          ofp =     new OpticalFlowParameters();
	public IntersceneLmaParameters        ilp =     new IntersceneLmaParameters();
	public InterNoiseParameters           inp =     new InterNoiseParameters();
			
	public HashMap<String,Double> z_corr_map = new HashMap<String,Double>(); //old one
	public HashMap<String,Double> infinity_distace_map = new HashMap<String,Double>(); //new one
	public static String Z_CORR_PREFIX = "z_corr.";
	public static String INFINITY_DISTANCE_PREFIX = "infinity_distance.";

	public boolean   batch_run =               false; // turned on only while running in batch mode

	public boolean useGPU() {
		return  useGPU(false) || useGPU(true);
	
	}
	public boolean useGPU(boolean aux) {
		return  aux? (gpu_use_aux  || gpu_use_aux_macro || gpu_use_aux_adjust)
				: (gpu_use_main || gpu_use_main_macro || gpu_use_main_adjust);
	}

	
	
	public double getCorrSigma(boolean monochrome) {
		return monochrome ? corr_sigma_mono : corr_sigma;
	}
	public double getTextureSigma(boolean monochrome) {
		return monochrome ? texture_sigma_mono : texture_sigma;
	}
	public double getFatZero(boolean monochrome) {
		return monochrome ? fat_zero_mono : fat_zero;
	}

	public double getGpuFatZero(boolean monochrome) {
		return monochrome ? gpu_fatz_m : gpu_fatz;
	}

	public double getGpuCorrSigma(boolean monochrome) {
		return monochrome ? gpu_sigma_corr_m : gpu_sigma_corr;
	}

	public double getGpuCorrLoGSigma(boolean monochrome) {
		return monochrome ? gpu_sigma_log_corr_m : gpu_sigma_log_corr;
	}

	public double getGpuCorrRBSigma(boolean monochrome) {
		return monochrome ? 1.0 : gpu_sigma_rb_corr;
	}

	public double getScaleStrength(boolean aux) {
		return aux ? scale_strength_aux : scale_strength_main;
	}

	public double getLymChange(boolean aux) {
		return aux ? lym_change_aux : lym_change;
	}

	public int getLyPerQuad (int num_tiles) {
		return (int) Math.max(ly_per_quad_r * num_tiles , ly_per_quad );
	}
	public int getLyInf (int num_tiles) {
		return (int) Math.max(ly_inf_r * num_tiles , ly_inf );
	}
	public int getLyInfScale (int num_tiles) {
		return (int) Math.max(ly_inf_scale_r * num_tiles , ly_inf_scale );
	}

	public CLTParameters(){}
	public void setProperties(String prefix,Properties properties){
		properties.setProperty(prefix+"transform_size",             this.transform_size+"");
		properties.setProperty(prefix+"clt_window",                 this.clt_window+"");
		properties.setProperty(prefix+"shift_x",                    this.shift_x+"");
		properties.setProperty(prefix+"shift_y",                    this.shift_y+"");
		properties.setProperty(prefix+"tileStep",                   this.tileStep+"");
		properties.setProperty(prefix+"tileSizeBg",                 this.super_radius+"");
		properties.setProperty(prefix+"iclt_mask",                  this.iclt_mask+"");
		properties.setProperty(prefix+"tileX",                      this.tileX+"");
		properties.setProperty(prefix+"tileY",                      this.tileY+"");
		properties.setProperty(prefix+"dbg_mode",                   this.dbg_mode+"");
		properties.setProperty(prefix+"ishift_x",                   this.ishift_x+"");
		properties.setProperty(prefix+"ishift_y",                   this.ishift_y+"");
		properties.setProperty(prefix+"fat_zero",                   this.fat_zero+"");
		properties.setProperty(prefix+"fat_zero_mono",              this.fat_zero_mono+"");
		properties.setProperty(prefix+"corr_sigma",                 this.corr_sigma+"");
		properties.setProperty(prefix+"corr_sigma_mono",            this.corr_sigma_mono+"");
		properties.setProperty(prefix+"texture_sigma",              this.texture_sigma+"");
		properties.setProperty(prefix+"texture_sigma_mono",         this.texture_sigma_mono+"");
		properties.setProperty(prefix+"scale_strength_main",        this.scale_strength_main+"");
		properties.setProperty(prefix+"scale_strength_aux",         this.scale_strength_aux+"");

		properties.setProperty(prefix+"norm_kern",                  this.norm_kern+"");
		properties.setProperty(prefix+"gain_equalize",              this.gain_equalize+"");
		properties.setProperty(prefix+"colors_equalize",            this.colors_equalize+"");
		properties.setProperty(prefix+"nosat_equalize",             this.nosat_equalize+"");
		properties.setProperty(prefix+"sat_level",                  this.sat_level+"");
		properties.setProperty(prefix+"max_overexposure",           this.max_overexposure+"");

		properties.setProperty(prefix+"novignetting_r",             this.novignetting_r+"");
		properties.setProperty(prefix+"novignetting_g",             this.novignetting_g+"");
		properties.setProperty(prefix+"novignetting_b",             this.novignetting_b+"");
		properties.setProperty(prefix+"scale_r",                    this.scale_r+"");
		properties.setProperty(prefix+"scale_g",                    this.scale_g+"");
		properties.setProperty(prefix+"scale_b",                    this.scale_b+"");
		properties.setProperty(prefix+"vignetting_max",             this.vignetting_max+"");
		properties.setProperty(prefix+"vignetting_range",           this.vignetting_range+"");
		properties.setProperty(prefix+"kernel_step",                this.kernel_step+"");
		properties.setProperty(prefix+"disparity",                  this.disparity +"");
		properties.setProperty(prefix+"z_correction",               this.z_correction +"");
		properties.setProperty(prefix+"correlate",                  this.correlate+"");
		properties.setProperty(prefix+"correlate_lma",              this.correlate_lma+"");
		properties.setProperty(prefix+"corr_mask",                  this.corr_mask+"");
		properties.setProperty(prefix+"corr_sym",                   this.corr_sym+"");
		properties.setProperty(prefix+"corr_keep",                  this.corr_keep+"");
		properties.setProperty(prefix+"corr_show",                  this.corr_show+"");
		properties.setProperty(prefix+"corr_mismatch",              this.corr_mismatch+"");
		properties.setProperty(prefix+"corr_offset",                this.corr_offset +"");
		properties.setProperty(prefix+"corr_red",                   this.corr_red +"");
		properties.setProperty(prefix+"corr_blue",                  this.corr_blue +"");
		properties.setProperty(prefix+"corr_normalize",             this.corr_normalize+"");
		properties.setProperty(prefix+"min_corr",                   this.min_corr +"");
		properties.setProperty(prefix+"min_corr_normalized",        this.min_corr_normalized +"");
		properties.setProperty(prefix+"max_corr_sigma",             this.max_corr_sigma +"");
		properties.setProperty(prefix+"max_corr_radius",            this.max_corr_radius +"");

		//  			properties.setProperty(prefix+"enhortho_width",             this.enhortho_width +"");
		//  			properties.setProperty(prefix+"enhortho_scale",             this.enhortho_scale +"");


		properties.setProperty(prefix+"max_corr_double",            this.max_corr_double+"");
		properties.setProperty(prefix+"corr_mode",                  this.corr_mode+"");
		properties.setProperty(prefix+"corr_border_contrast",       this.corr_border_contrast +"");
		properties.setProperty(prefix+"tile_task_op",               this.tile_task_op+"");
		properties.setProperty(prefix+"tile_task_wl",               this.tile_task_wl+"");
		properties.setProperty(prefix+"tile_task_wt",               this.tile_task_wt+"");
		properties.setProperty(prefix+"tile_task_ww",               this.tile_task_ww+"");
		properties.setProperty(prefix+"tile_task_wh",               this.tile_task_wh+"");
		properties.setProperty(prefix+"min_shot",                   this.min_shot +"");
		properties.setProperty(prefix+"scale_shot",                 this.scale_shot +"");
		properties.setProperty(prefix+"diff_sigma",                 this.diff_sigma +"");
		properties.setProperty(prefix+"diff_threshold",             this.diff_threshold +"");
		properties.setProperty(prefix+"diff_gauss",                 this.diff_gauss+"");
		properties.setProperty(prefix+"min_agree",                  this.min_agree +"");
		properties.setProperty(prefix+"dust_remove",                this.dust_remove+"");
		properties.setProperty(prefix+"black_back",                 this.black_back+"");
		properties.setProperty(prefix+"keep_weights",               this.keep_weights+"");
		properties.setProperty(prefix+"sharp_alpha",                this.sharp_alpha+"");

		properties.setProperty(prefix+"alpha0",                     this.alpha0 +"");
		properties.setProperty(prefix+"alpha1",                     this.alpha1 +"");

		properties.setProperty(prefix+"gen_chn_stacks",             this.gen_chn_stacks+"");
		properties.setProperty(prefix+"gen_chn_img",                this.gen_chn_img+"");
		properties.setProperty(prefix+"gen_4_img",                  this.gen_4_img+"");
		properties.setProperty(prefix+"show_nonoverlap",            this.show_nonoverlap+"");
		properties.setProperty(prefix+"show_overlap",               this.show_overlap+"");
		properties.setProperty(prefix+"show_rgba_color",            this.show_rgba_color+"");
		properties.setProperty(prefix+"show_map",                   this.show_map+"");
		properties.setProperty(prefix+"show_corr",                  this.show_corr+"");
		properties.setProperty(prefix+"disp_scan_start",            this.disp_scan_start +"");
		properties.setProperty(prefix+"disp_scan_step",             this.disp_scan_step +"");
		properties.setProperty(prefix+"disp_scan_count",            this.disp_scan_count+"");

		properties.setProperty(prefix+"fine_dbg",                   this.fine_dbg+"");
		properties.setProperty(prefix+"fine_corr_x_0",              this.fine_corr_x_0 +"");
		properties.setProperty(prefix+"fine_corr_y_0",              this.fine_corr_y_0 +"");
		properties.setProperty(prefix+"fine_corr_x_1",              this.fine_corr_x_1 +"");
		properties.setProperty(prefix+"fine_corr_y_1",              this.fine_corr_y_1 +"");
		properties.setProperty(prefix+"fine_corr_x_2",              this.fine_corr_x_2 +"");
		properties.setProperty(prefix+"fine_corr_y_2",              this.fine_corr_y_2 +"");
		properties.setProperty(prefix+"fine_corr_x_3",              this.fine_corr_x_3 +"");
		properties.setProperty(prefix+"fine_corr_y_3",              this.fine_corr_y_3 +"");
		properties.setProperty(prefix+"fine_corr_ignore",           this.fine_corr_ignore+"");
		properties.setProperty(prefix+"fine_corr_apply",            this.fine_corr_apply+"");

		properties.setProperty(prefix+"fcorr_radius",               this.fcorr_radius +"");
		properties.setProperty(prefix+"fcorr_min_strength",         this.fcorr_min_strength +"");
		properties.setProperty(prefix+"fcorr_disp_diff",            this.fcorr_disp_diff +"");
		properties.setProperty(prefix+"fcorr_quadratic",            this.fcorr_quadratic+"");
		properties.setProperty(prefix+"fcorr_ignore",               this.fcorr_ignore+"");

		properties.setProperty(prefix+"fcorr_inf_strength",         this.fcorr_inf_strength +"");
		properties.setProperty(prefix+"fcorr_inf_diff",             this.fcorr_inf_diff +"");
		properties.setProperty(prefix+"fcorr_inf_quad",             this.fcorr_inf_quad+"");
		properties.setProperty(prefix+"fcorr_inf_vert",             this.fcorr_inf_vert+"");
		
		properties.setProperty(prefix+"inf_disp_apply",             this.inf_disp_apply+"");
		properties.setProperty(prefix+"inf_repeat",                 this.inf_repeat+"");

		//			properties.setProperty(prefix+"inf_mism_apply",             this.inf_mism_apply+"");
		properties.setProperty(prefix+"inf_iters",                  this.inf_iters+"");
		properties.setProperty(prefix+"inf_final_diff",             this.inf_final_diff +"");
		properties.setProperty(prefix+"inf_far_pull",               this.inf_far_pull +"");
		properties.setProperty(prefix+"inf_str_pow",                this.inf_str_pow +"");
		properties.setProperty(prefix+"inf_smpl_side",              this.inf_smpl_side+"");
		properties.setProperty(prefix+"inf_smpl_num",               this.inf_smpl_num+"");
		properties.setProperty(prefix+"inf_smpl_rms",               this.inf_smpl_rms +"");

		properties.setProperty(prefix+"ih_smpl_step",               this.ih_smpl_step+"");
		properties.setProperty(prefix+"ih_disp_min",                this.ih_disp_min +"");
		properties.setProperty(prefix+"ih_disp_step",               this.ih_disp_step +"");
		properties.setProperty(prefix+"ih_num_bins",                this.ih_num_bins+"");
		properties.setProperty(prefix+"ih_sigma",                   this.ih_sigma +"");
		properties.setProperty(prefix+"ih_max_diff",                this.ih_max_diff +"");
		properties.setProperty(prefix+"ih_min_samples",             this.ih_min_samples+"");
		properties.setProperty(prefix+"ih_norm_center",             this.ih_norm_center+"");
		properties.setProperty(prefix+"inf_restore_disp",           this.inf_restore_disp+"");
		
		properties.setProperty(prefix+"intra_keep_strength",                this.intra_keep_strength+"");
		properties.setProperty(prefix+"intra_keep_conditional_strength",    this.intra_keep_conditional_strength+"");
		properties.setProperty(prefix+"intra_absolute_disparity_tolerance", this.intra_absolute_disparity_tolerance+"");
		properties.setProperty(prefix+"intra_relative_disparity_tolerance", this.intra_relative_disparity_tolerance+"");
		properties.setProperty(prefix+"intra_cluster_size",                 this.intra_cluster_size+"");

		properties.setProperty(prefix+"ly_lma_ers",                 this.ly_lma_ers+"");
		properties.setProperty(prefix+"ly_gt_strength",             this.ly_gt_strength+"");
		properties.setProperty(prefix+"ly_gt_use_wnd",              this.ly_gt_use_wnd+"");
		properties.setProperty(prefix+"ly_gt_rms",                  this.ly_gt_rms+"");

		properties.setProperty(prefix+"lylw_inf_en",                  this.lylw_inf_en+"");
		properties.setProperty(prefix+"lylw_aztilt_en",               this.lylw_aztilt_en+"");
		properties.setProperty(prefix+"lylw_diff_roll_en",            this.lylw_diff_roll_en+"");
		properties.setProperty(prefix+"lylw_focalLength",             this.lylw_focalLength+"");
		properties.setProperty(prefix+"lylw_com_roll",                this.lylw_com_roll+"");
		properties.setProperty(prefix+"lylw_par_sel",                 this.lylw_par_sel+"");

		properties.setProperty(prefix+"ly_marg_fract",              this.ly_marg_fract+"");
		properties.setProperty(prefix+"ly_rad_to_hdiag",            this.ly_rad_to_hdiag+"");
		
		properties.setProperty(prefix+"ly_on_scan",                 this.ly_on_scan+"");
		properties.setProperty(prefix+"ly_inf_en",                  this.ly_inf_en+"");
		properties.setProperty(prefix+"ly_min_forced",              this.ly_min_forced+"");
		properties.setProperty(prefix+"ly_aztilt_en",               this.ly_aztilt_en+"");
		properties.setProperty(prefix+"ly_diff_roll_en",            this.ly_diff_roll_en+"");
		properties.setProperty(prefix+"ly_focalLength",             this.ly_focalLength+"");
		properties.setProperty(prefix+"ly_com_roll",                this.ly_com_roll+"");
		properties.setProperty(prefix+"ly_ers_rot",                 this.ly_ers_rot+"");
		properties.setProperty(prefix+"ly_ers_forw",                this.ly_ers_forw+"");
		properties.setProperty(prefix+"ly_ers_side",                this.ly_ers_side+"");
		properties.setProperty(prefix+"ly_ers_vert",                this.ly_ers_vert+"");
		properties.setProperty(prefix+"ly_par_sel",                 this.ly_par_sel+"");

		properties.setProperty(prefix+"ly_weight_infinity",         this.ly_weight_infinity+"");
		properties.setProperty(prefix+"ly_weight_disparity",        this.ly_weight_disparity+"");
		properties.setProperty(prefix+"ly_weight_disparity_inf",    this.ly_weight_disparity_inf+"");
		properties.setProperty(prefix+"ly_max_disparity_far",       this.ly_max_disparity_far+"");
		properties.setProperty(prefix+"ly_max_disparity_use",       this.ly_max_disparity_use+"");

		properties.setProperty(prefix+"ly_inf_min_dfe",             this.ly_inf_min_dfe+"");
		properties.setProperty(prefix+"ly_inf_max_dfe",             this.ly_inf_max_dfe+"");

		properties.setProperty(prefix+"ly_inf_force_fine",          this.ly_inf_force_fine+"");
		properties.setProperty(prefix+"ly_inf_min_broad",           this.ly_inf_min_broad+"");
		properties.setProperty(prefix+"ly_inf_max_broad",           this.ly_inf_max_broad+"");
		properties.setProperty(prefix+"ly_inf_min_narrow",          this.ly_inf_min_narrow+"");
		properties.setProperty(prefix+"ly_inf_max_narrow",          this.ly_inf_max_narrow+"");
		
		properties.setProperty(prefix+"ly_moving_en",               this.ly_moving_en+"");
		properties.setProperty(prefix+"ly_moving_apply",            this.ly_moving_apply+"");
		properties.setProperty(prefix+"ly_moving_sigma",            this.ly_moving_sigma+"");
		properties.setProperty(prefix+"ly_max_mov_disparity",       this.ly_max_mov_disparity+"");
		properties.setProperty(prefix+"ly_rad_to_hdiag_mov",        this.ly_rad_to_hdiag_mov+"");
		properties.setProperty(prefix+"ly_max_mov_average",         this.ly_max_mov_average+"");
		properties.setProperty(prefix+"ly_mov_min_L2",              this.ly_mov_min_L2+"");

		properties.setProperty(prefix+"ly_debug_level",             this.ly_debug_level+"");
		properties.setProperty(prefix+"ly_right_left",              this.ly_right_left+"");
		properties.setProperty(prefix+"ly_inf_tilt",                this.ly_inf_tilt+"");

		properties.setProperty(prefix+"ly_per_quad",                this.ly_per_quad +"");
		properties.setProperty(prefix+"ly_per_quad_r",              this.ly_per_quad_r +"");
		properties.setProperty(prefix+"ly_inf",                     this.ly_inf +"");
		properties.setProperty(prefix+"ly_inf_r",                   this.ly_inf_r +"");
		properties.setProperty(prefix+"ly_inf_scale",               this.ly_inf_scale +"");
		properties.setProperty(prefix+"ly_inf_scale_r",             this.ly_inf_scale_r +"");

		properties.setProperty(prefix+"ly_inf_frac",                this.ly_inf_frac +"");

		properties.setProperty(prefix+"ly_inf_max_disparity",       this.ly_inf_max_disparity +"");
		properties.setProperty(prefix+"ly_inf_disp",                this.ly_inf_disp+"");
		properties.setProperty(prefix+"ly_inf_force",               this.ly_inf_force+"");
		properties.setProperty(prefix+"ly_poly",                    this.ly_poly+"");

		properties.setProperty(prefix+"ly_smpl_side",               this.ly_smpl_side+"");
		properties.setProperty(prefix+"ly_smpl_num",                this.ly_smpl_num+"");
		properties.setProperty(prefix+"ly_smpl_rms",                this.ly_smpl_rms +"");
		properties.setProperty(prefix+"ly_disp_var",                this.ly_disp_var +"");
		properties.setProperty(prefix+"ly_disp_rvar",               this.ly_disp_rvar +"");
		properties.setProperty(prefix+"ly_disp_var_gt",             this.ly_disp_var_gt +"");
		properties.setProperty(prefix+"ly_disp_rvar_gt",            this.ly_disp_rvar_gt +"");
		properties.setProperty(prefix+"ly_norm_disp",               this.ly_norm_disp +"");
		properties.setProperty(prefix+"lym_overexp",                this.lym_overexp +"");
		properties.setProperty(prefix+"lym_dbg_path",                this.lym_dbg_path +"");
		properties.setProperty(prefix+"lym_update_disp",            this.lym_update_disp+"");
		properties.setProperty(prefix+"lym_iter",                   this.lym_iter+"");
		properties.setProperty(prefix+"lym_change",                 this.lym_change +"");
		properties.setProperty(prefix+"lym_change_aux",             this.lym_change_aux +"");
		properties.setProperty(prefix+"lym_poly_change",            this.lym_poly_change +"");

		properties.setProperty(prefix+"lym_mod_map",                this.lym_mod_map +"");
		properties.setProperty(prefix+"lym_top_bg",                 this.lym_top_bg +"");
		properties.setProperty(prefix+"lym_fill_gaps_bg",           this.lym_fill_gaps_bg +"");
		properties.setProperty(prefix+"lym_fill_gaps_combo",        this.lym_fill_gaps_combo +"");
		properties.setProperty(prefix+"lym_use_strength",           this.lym_use_strength +"");
		properties.setProperty(prefix+"lym_scale_deriv_str",        this.lym_scale_deriv_str +"");

		properties.setProperty(prefix+"lyf_filter",                 this.lyf_filter+"");
		properties.setProperty(prefix+"lyf_smpl_side",              this.lyf_smpl_side+"");
		properties.setProperty(prefix+"lyf_rms_max",                this.lyf_rms_max +"");
		properties.setProperty(prefix+"lyf_frac_keep",              this.lyf_frac_keep +"");
		properties.setProperty(prefix+"lyf_min_samples",            this.lyf_min_samples+"");
		properties.setProperty(prefix+"lyf_norm_center",            this.lyf_norm_center+"");
		properties.setProperty(prefix+"ly_corr_scale",              this.ly_corr_scale +"");

		properties.setProperty(prefix+"lyr_filter_ds",              this.lyr_filter_ds +"");
		properties.setProperty(prefix+"lyr_filter_lyf",             this.lyr_filter_lyf +"");

		properties.setProperty(prefix+"corr_magic_scale",           this.corr_magic_scale +"");
		properties.setProperty(prefix+"corr_select",                this.corr_select +"");

		properties.setProperty(prefix+"show_textures",              this.show_textures+"");
		properties.setProperty(prefix+"debug_filters",              this.debug_filters+"");

		properties.setProperty(prefix+"min_smth",                   this.min_smth +"");
		properties.setProperty(prefix+"sure_smth",                  this.sure_smth +"");
		properties.setProperty(prefix+"bgnd_range",                 this.bgnd_range +"");
		properties.setProperty(prefix+"other_range",                this.other_range +"");

		properties.setProperty(prefix+"ex_strength",                this.ex_strength +"");
		properties.setProperty(prefix+"ex_nstrength",               this.ex_nstrength +"");

		properties.setProperty(prefix+"ex_over_bgnd",               this.ex_over_bgnd+"");
		properties.setProperty(prefix+"ex_min_over",                this.ex_min_over +"");

		properties.setProperty(prefix+"pt_super_trust",             this.pt_super_trust +"");
		properties.setProperty(prefix+"pt_keep_raw_fg",             this.pt_keep_raw_fg+"");
		properties.setProperty(prefix+"pt_scale_pre",               this.pt_scale_pre +"");
		properties.setProperty(prefix+"pt_scale_post",              this.pt_scale_post +"");

		properties.setProperty(prefix+"bgnd_sure",                  this.bgnd_sure +"");
		properties.setProperty(prefix+"bgnd_maybe",                 this.bgnd_maybe +"");
		properties.setProperty(prefix+"min_clstr_seed",             this.min_clstr_seed+"");
		properties.setProperty(prefix+"min_clstr_lone",             this.min_clstr_lone+"");
		properties.setProperty(prefix+"min_clstr_weight",           this.min_clstr_weight +"");
		properties.setProperty(prefix+"min_clstr_max",              this.min_clstr_max +"");

		properties.setProperty(prefix+"fill_gaps",                  this.fill_gaps+"");
		properties.setProperty(prefix+"fill_final",                 this.fill_final+"");
		properties.setProperty(prefix+"min_clstr_block",            this.min_clstr_block+"");
		properties.setProperty(prefix+"bgnd_grow",                  this.bgnd_grow+"");

		properties.setProperty(prefix+"ortho_old",                  this.ortho_old+"");
		properties.setProperty(prefix+"ortho_min_hor",              this.ortho_min_hor +"");
		properties.setProperty(prefix+"ortho_min_vert",             this.ortho_min_vert +"");
		properties.setProperty(prefix+"ortho_asym",                 this.ortho_asym +"");
		properties.setProperty(prefix+"ortho_over4",                this.ortho_over4 +"");
		properties.setProperty(prefix+"ortho_sustain",              this.ortho_sustain +"");
		properties.setProperty(prefix+"ortho_run",                  this.ortho_run+"");
		properties.setProperty(prefix+"ortho_minmax",               this.ortho_minmax +"");
		properties.setProperty(prefix+"ortho_bridge",               this.ortho_bridge+"");
		properties.setProperty(prefix+"ortho_rms",                  this.ortho_rms +"");
		properties.setProperty(prefix+"ortho_half_length",          this.ortho_half_length+"");
		properties.setProperty(prefix+"ortho_mix",                  this.ortho_mix +"");


		properties.setProperty(prefix+"or_hor",                     this.or_hor+"");
		properties.setProperty(prefix+"or_vert",                    this.or_vert+"");
		properties.setProperty(prefix+"or_sigma",                   this.or_sigma +"");
		properties.setProperty(prefix+"or_sharp",                   this.or_sharp +"");
		properties.setProperty(prefix+"or_scale",                   this.or_scale +"");
		properties.setProperty(prefix+"or_offset",                  this.or_offset +"");
		properties.setProperty(prefix+"or_asym",                    this.or_asym +"");
		properties.setProperty(prefix+"or_threshold",               this.or_threshold +"");
		properties.setProperty(prefix+"or_absHor",                  this.or_absHor +"");
		properties.setProperty(prefix+"or_absVert",                 this.or_absVert +"");
		properties.setProperty(prefix+"or_maxDisp",                 this.or_maxDisp +"");

		properties.setProperty(prefix+"poles_fix",                  this.poles_fix+"");
		properties.setProperty(prefix+"poles_len",                  this.poles_len+"");
		properties.setProperty(prefix+"poles_ratio",                this.poles_ratio +"");
		properties.setProperty(prefix+"poles_min_strength",         this.poles_min_strength +"");
		properties.setProperty(prefix+"or_maxDisp",                 this.or_maxDisp+"");



		properties.setProperty(prefix+"max_clusters",               this.max_clusters+"");
		properties.setProperty(prefix+"remove_scans",               this.remove_scans+"");
		properties.setProperty(prefix+"output_x3d",                 this.output_x3d+"");
		properties.setProperty(prefix+"output_obj",                 this.output_obj+"");
		properties.setProperty(prefix+"correct_distortions",        this.correct_distortions+"");
		properties.setProperty(prefix+"show_triangles",             this.show_triangles+"");
		properties.setProperty(prefix+"avg_cluster_disp",           this.avg_cluster_disp+"");
		properties.setProperty(prefix+"maxDispTriangle",            this.maxDispTriangle +"");
		properties.setProperty(prefix+"infinityDistance",           this.infinityDistance +"");
		properties.setProperty(prefix+"min_bgnd_tiles",             this.min_bgnd_tiles+"");
		properties.setProperty(prefix+"shUseFlaps",                 this.shUseFlaps+"");
		properties.setProperty(prefix+"shAggrFade",                 this.shAggrFade+"");
		properties.setProperty(prefix+"shMinArea",                  this.shMinArea+"");
		properties.setProperty(prefix+"shMinStrength",              this.shMinStrength +"");
		properties.setProperty(prefix+"tiRigidVertical",            this.tiRigidVertical +"");
		properties.setProperty(prefix+"tiRigidHorizontal",          this.tiRigidHorizontal +"");
		properties.setProperty(prefix+"tiRigidDiagonal",            this.tiRigidDiagonal +"");
		properties.setProperty(prefix+"tiStrengthOffset",           this.tiStrengthOffset +"");
		properties.setProperty(prefix+"tiDispScale",                this.tiDispScale +"");
		properties.setProperty(prefix+"tiDispPow",                  this.tiDispPow +"");
		properties.setProperty(prefix+"tiDispPull",                 this.tiDispPull +"");
		properties.setProperty(prefix+"tiDispPullPreFinal",          this.tiDispPullPreFinal +"");
		properties.setProperty(prefix+"tiDispPullFinal",            this.tiDispPullFinal +"");
		properties.setProperty(prefix+"tiBreakNorm",                this.tiBreakNorm +"");
		properties.setProperty(prefix+"tiBreak3",                   this.tiBreak3 +"");
		properties.setProperty(prefix+"tiBreak31",                  this.tiBreak31 +"");
		properties.setProperty(prefix+"tiBreak21",                  this.tiBreak21 +"");
		properties.setProperty(prefix+"tiBreakFar",                 this.tiBreakFar +"");
		properties.setProperty(prefix+"tiBreakNear",                this.tiBreakNear +"");
		properties.setProperty(prefix+"tiBreakMode",                this.tiBreakMode +"");
		properties.setProperty(prefix+"tiBreakSame",                this.tiBreakSame +"");
		properties.setProperty(prefix+"tiBreakTurn",                this.tiBreakTurn +"");

		properties.setProperty(prefix+"tiHealPreLast",              this.tiHealPreLast +"");
		properties.setProperty(prefix+"tiHealLast",                 this.tiHealLast +"");
		properties.setProperty(prefix+"tiHealSame",                 this.tiHealSame+"");

		properties.setProperty(prefix+"tiIterations",               this.tiIterations+"");
		properties.setProperty(prefix+"tiPrecision",                this.tiPrecision+"");
		properties.setProperty(prefix+"tiNumCycles",                this.tiNumCycles+"");

		properties.setProperty(prefix+"stUseRefine",                this.stUseRefine+"");
		properties.setProperty(prefix+"stUsePass2",                 this.stUsePass2+"");
		properties.setProperty(prefix+"stUseRender",                this.stUseRender+"");

		properties.setProperty(prefix+"stShow",                     this.stShow+"");
		properties.setProperty(prefix+"stSize",                     this.stSize+"");
		properties.setProperty(prefix+"stStepFar",                  this.stStepFar +"");
		properties.setProperty(prefix+"stStepNear",                 this.stStepNear +"");
		properties.setProperty(prefix+"stStepThreshold",            this.stStepThreshold +"");
		properties.setProperty(prefix+"stMinDisparity",             this.stMinDisparity +"");

		///			properties.setProperty(prefix+"stFloor",                    this.stFloor +"");   // mlfp.strength_floor
		///			properties.setProperty(prefix+"stPow",                      this.stPow +"");     // mlfp.strength_pow
		properties.setProperty(prefix+"stSigma",                    this.stSigma +"");          // keep
		properties.setProperty(prefix+"stMinBgDisparity",           this.stMinBgDisparity +""); // keep
		properties.setProperty(prefix+"stMinBgFract",               this.stMinBgFract +"");     // keep
		properties.setProperty(prefix+"stUseDisp",                  this.stUseDisp +"");        // keep
		properties.setProperty(prefix+"stStrengthScale",            this.stStrengthScale +"");  // keep

		properties.setProperty(prefix+"stSmplMode",                 this.stSmplMode+"");        // keep

		///			properties.setProperty(prefix+"stSmplSide",                 this.stSmplSide+"");        // mlfp.smplSide
		///			properties.setProperty(prefix+"stSmplNum",                  this.stSmplNum+"");         // mlfp.smplNum
		///			properties.setProperty(prefix+"stSmplRms",                  this.stSmplRms +"");        // mlfp.smplRms
		///			properties.setProperty(prefix+"stSmplWnd",                  this.stSmplWnd+"");         // mlfp.smplWnd

		///			properties.setProperty(prefix+"fs_max_abs_tilt",            this.fs_max_abs_tilt+"");   // mlfp.max_abs_tilt
		///			properties.setProperty(prefix+"fs_max_rel_tilt",            this.fs_max_rel_tilt+"");   // mlfp.max_rel_tilt
		///			properties.setProperty(prefix+"fs_damp_tilt",               this.fs_damp_tilt+"");      // mlfp.damp_tilt
		///			properties.setProperty(prefix+"fs_min_tilt_disp",           this.fs_min_tilt_disp+"");  // mlfp.min_tilt_disp
		///			properties.setProperty(prefix+"fs_transition",              this.fs_transition+"");     // mlfp.transition
		///			properties.setProperty(prefix+"fs_far_mode",                this.fs_far_mode+"");       // mlfp.far_mode
		///			properties.setProperty(prefix+"fs_far_power",               this.fs_far_power+"");      // mlfp.far_power

		properties.setProperty(prefix+"stGrowSel",                  this.stGrowSel+"");
		properties.setProperty(prefix+"stMeasSel",                  this.stMeasSel+"");
		properties.setProperty(prefix+"stSmallDiff",                this.stSmallDiff +"");
		properties.setProperty(prefix+"stHighMix",                  this.stHighMix +"");


		properties.setProperty(prefix+"outlierStrength",            this.outlierStrength +"");
		properties.setProperty(prefix+"outlierDiff",                this.outlierDiff +"");
		properties.setProperty(prefix+"outlierDiffPos",             this.outlierDiffPos +"");
		properties.setProperty(prefix+"outlierDiffNeg",             this.outlierDiffNeg +"");

		properties.setProperty(prefix+"combine_refine",             this.combine_refine+"");

		properties.setProperty(prefix+"combine_min_strength",       this.combine_min_strength +"");
		properties.setProperty(prefix+"combine_min_hor",            this.combine_min_hor +"");
		properties.setProperty(prefix+"combine_min_vert",           this.combine_min_vert +"");
		//			properties.setProperty(prefix+"unique_tolerance",           this.unique_tolerance +"");
		properties.setProperty(prefix+"grow_sweep",                 this.grow_sweep+"");
		properties.setProperty(prefix+"grow_disp_max",              this.grow_disp_max +"");
		properties.setProperty(prefix+"grow_disp_trust",            this.grow_disp_trust +"");
		properties.setProperty(prefix+"grow_disp_step",             this.grow_disp_step +"");
		properties.setProperty(prefix+"grow_min_diff",              this.grow_min_diff +"");
		properties.setProperty(prefix+"grow_retry_far",             this.grow_retry_far+"");
		properties.setProperty(prefix+"grow_pedantic",              this.grow_pedantic+"");
		properties.setProperty(prefix+"grow_retry_inf",             this.grow_retry_inf+"");

		properties.setProperty(prefix+"gr_new_expand",              this.gr_new_expand+"");
		//  			properties.setProperty(prefix+"gr_max_expand",              this.gr_max_expand+"");
		properties.setProperty(prefix+"fds_str_floor",              this.fds_str_floor +"");
		properties.setProperty(prefix+"gr_ovrbg_cmb",               this.gr_ovrbg_cmb +"");
		properties.setProperty(prefix+"gr_ovrbg_cmb_hor",           this.gr_ovrbg_cmb_hor +"");
		properties.setProperty(prefix+"gr_ovrbg_cmb_vert",          this.gr_ovrbg_cmb_vert +"");
		properties.setProperty(prefix+"gr_ovrbg_filtered",          this.gr_ovrbg_filtered +"");
		properties.setProperty(prefix+"fds_str_pow",                this.fds_str_pow +"");
		properties.setProperty(prefix+"fds_smpl_side",              this.fds_smpl_side+"");
		properties.setProperty(prefix+"fds_smpl_num",               this.fds_smpl_num+"");
		properties.setProperty(prefix+"fds_smpl_rms",               this.fds_smpl_rms +"");
		properties.setProperty(prefix+"fds_smpl_rel_rms",           this.fds_smpl_rel_rms +"");
		properties.setProperty(prefix+"fds_smpl_wnd",               this.fds_smpl_wnd+"");
		properties.setProperty(prefix+"fds_abs_tilt",               this.fds_abs_tilt +"");
		properties.setProperty(prefix+"fds_rel_tilt",               this.fds_rel_tilt +"");

		properties.setProperty(prefix+"per_filter",                 this.per_filter +"");
		properties.setProperty(prefix+"per_trustedCorrelation",     this.per_trustedCorrelation +"");
		properties.setProperty(prefix+"per_initial_diff",           this.per_initial_diff +"");
		properties.setProperty(prefix+"per_strength_floor",         this.per_strength_floor +"");
		properties.setProperty(prefix+"per_strength_max_over",      this.per_strength_max_over +"");
		properties.setProperty(prefix+"per_min_period",             this.per_min_period +"");
		properties.setProperty(prefix+"per_min_num_periods",        this.per_min_num_periods +"");
		properties.setProperty(prefix+"per_disp_tolerance",         this.per_disp_tolerance +"");
		properties.setProperty(prefix+"per_disp_match",             this.per_disp_match +"");
		properties.setProperty(prefix+"per_strong_match_inc",       this.per_strong_match_inc +"");

		properties.setProperty(prefix+"mc_disp8_step",              this.mc_disp8_step +"");
		properties.setProperty(prefix+"mc_disp8_trust",             this.mc_disp8_trust +"");
		properties.setProperty(prefix+"mc_strength",                this.mc_strength +"");
		properties.setProperty(prefix+"mc_unique_tol",              this.mc_unique_tol +"");

		properties.setProperty(prefix+"mc_trust_fin",               this.mc_trust_fin +"");
		properties.setProperty(prefix+"mc_trust_sigma",             this.mc_trust_sigma +"");
		properties.setProperty(prefix+"mc_ortho_weight",            this.mc_ortho_weight +"");
		properties.setProperty(prefix+"mc_diag_weight",             this.mc_diag_weight +"");
		properties.setProperty(prefix+"mc_gap",                     this.mc_gap +"");

		properties.setProperty(prefix+"mc_weight_var",              this.mc_weight_var +"");
		properties.setProperty(prefix+"mc_weight_Y",                this.mc_weight_Y +"");
		properties.setProperty(prefix+"mc_weight_RBmG",             this.mc_weight_RBmG +"");

		properties.setProperty(prefix+"gr_min_new",                 this.gr_min_new+"");
		properties.setProperty(prefix+"gr_var_new_sngl",            this.gr_var_new_sngl+"");
		properties.setProperty(prefix+"gr_var_new_fg",              this.gr_var_new_fg+"");
		properties.setProperty(prefix+"gr_var_all_fg",              this.gr_var_all_fg+"");
		properties.setProperty(prefix+"gr_var_new_bg",              this.gr_var_new_bg+"");
		properties.setProperty(prefix+"gr_var_all_bg",              this.gr_var_all_bg+"");
		properties.setProperty(prefix+"gr_var_next",                this.gr_var_next+"");
		properties.setProperty(prefix+"gr_num_steps",               this.gr_num_steps+"");
		properties.setProperty(prefix+"gr_steps_over",              this.gr_steps_over+"");
		properties.setProperty(prefix+"gr_smpl_size",               this.gr_smpl_size+"");
		properties.setProperty(prefix+"gr_min_pnts",                this.gr_min_pnts+"");
		properties.setProperty(prefix+"gr_use_wnd",                 this.gr_use_wnd+"");
		properties.setProperty(prefix+"gr_tilt_damp",               this.gr_tilt_damp +"");
		properties.setProperty(prefix+"gr_split_rng",               this.gr_split_rng +"");
		properties.setProperty(prefix+"gr_same_rng",                this.gr_same_rng +"");
		properties.setProperty(prefix+"gr_diff_cont",               this.gr_diff_cont +"");
		properties.setProperty(prefix+"gr_abs_tilt",                this.gr_abs_tilt +"");
		properties.setProperty(prefix+"gr_rel_tilt",                this.gr_rel_tilt +"");
		properties.setProperty(prefix+"gr_smooth",                  this.gr_smooth+"");
		properties.setProperty(prefix+"gr_fin_diff",                this.gr_fin_diff +"");
		properties.setProperty(prefix+"gr_unique_tol",              this.gr_unique_tol +"");
		properties.setProperty(prefix+"gr_unique_pretol",           this.gr_unique_pretol +"");

		properties.setProperty(prefix+"ft_mod_strength",                    this.ft_mod_strength +"");
		properties.setProperty(prefix+"ft_clusterize_by_highest",           this.ft_clusterize_by_highest +"");
		properties.setProperty(prefix+"ft_clust_sigma",                     this.ft_clust_sigma +"");
		properties.setProperty(prefix+"ft_disp_arange_vert",                this.ft_disp_arange_vert +"");
		properties.setProperty(prefix+"ft_disp_rrange_vert",                this.ft_disp_rrange_vert +"");
		properties.setProperty(prefix+"ft_disp_arange_hor",                 this.ft_disp_arange_hor +"");
		properties.setProperty(prefix+"ft_disp_rrange_hor",                  this.ft_disp_rrange_hor +"");
		properties.setProperty(prefix+"ft_tolerance_above_near",            this.ft_tolerance_above_near +"");
		properties.setProperty(prefix+"ft_tolerance_below_near",            this.ft_tolerance_below_near +"");
		properties.setProperty(prefix+"ft_tolerance_above_far",             this.ft_tolerance_above_far +"");
		properties.setProperty(prefix+"ft_tolerance_below_far",             this.ft_tolerance_below_far +"");
		properties.setProperty(prefix+"ft_hor_vert_overlap",                this.ft_hor_vert_overlap +"");
		properties.setProperty(prefix+"ft_used_companions",                 this.ft_used_companions +"");
		properties.setProperty(prefix+"ft_used_true_companions",            this.ft_used_true_companions +"");

		properties.setProperty(prefix+"plPreferDisparity",          this.plPreferDisparity+"");
		properties.setProperty(prefix+"plDispNorm",                 this.plDispNorm +"");
		properties.setProperty(prefix+"plFrontoTol",                this.plFrontoTol +"");
		properties.setProperty(prefix+"plFrontoRms",                this.plFrontoRms +"");
		properties.setProperty(prefix+"plFrontoOffs",               this.plFrontoOffs +"");
		properties.setProperty(prefix+"PlFrontoPow",                this.PlFrontoPow +"");

		properties.setProperty(prefix+"plBlurBinVert",              this.plBlurBinVert +"");
		properties.setProperty(prefix+"plBlurBinHor",               this.plBlurBinHor +"");
		properties.setProperty(prefix+"plMaxDiffVert",              this.plMaxDiffVert +"");
		properties.setProperty(prefix+"plMaxDiffHor",               this.plMaxDiffHor +"");
		properties.setProperty(prefix+"plInitPasses",               this.plInitPasses+"");

		properties.setProperty(prefix+"plMinPoints",                this.plMinPoints+"");
		properties.setProperty(prefix+"plTargetEigen",              this.plTargetEigen +"");
		properties.setProperty(prefix+"plFractOutliers",            this.plFractOutliers +"");
		properties.setProperty(prefix+"plMaxOutliers",              this.plMaxOutliers+"");
		properties.setProperty(prefix+"plMinStrength",              this.plMinStrength +"");
		properties.setProperty(prefix+"plMaxEigen",                 this.plMaxEigen +"");
		properties.setProperty(prefix+"plEigenFloor",               this.plEigenFloor +"");
		properties.setProperty(prefix+"plEigenStick",               this.plEigenStick +"");
		properties.setProperty(prefix+"plBadPlate",                 this.plBadPlate +"");
		properties.setProperty(prefix+"plDbgMerge",                 this.plDbgMerge+"");
		properties.setProperty(prefix+"plWorstWorsening",           this.plWorstWorsening +"");
		properties.setProperty(prefix+"plWorstWorsening2",          this.plWorstWorsening2 +"");
		properties.setProperty(prefix+"plWorstEq",                  this.plWorstEq +"");
		properties.setProperty(prefix+"plWorstEq2",                 this.plWorstEq2 +"");
		properties.setProperty(prefix+"plOKMergeEigen",             this.plOKMergeEigen +"");
		properties.setProperty(prefix+"plMaxWorldSin2",             this.plMaxWorldSin2 +"");
		properties.setProperty(prefix+"pl2dForSin",                 this.pl2dForSin +"");
		properties.setProperty(prefix+"plWeakWorsening",            this.plWeakWorsening +"");
		properties.setProperty(prefix+"plMaxOverlap",               this.plMaxOverlap +"");

		properties.setProperty(prefix+"plWeakWeight",               this.plWeakWeight +"");
		properties.setProperty(prefix+"plWeakEigen",                this.plWeakEigen +"");
		properties.setProperty(prefix+"plWeakWeight2",              this.plWeakWeight2 +"");
		properties.setProperty(prefix+"plWeakEigen2",               this.plWeakEigen2 +"");
		properties.setProperty(prefix+"plSumThick",                 this.plSumThick +"");
		properties.setProperty(prefix+"plNeNeibCost",               this.plNeNeibCost +"");
		properties.setProperty(prefix+"plNeOwn",                    this.plNeOwn +"");

		properties.setProperty(prefix+"plExNeibCost",               this.plExNeibCost +"");
		properties.setProperty(prefix+"plExNeibSmooth",             this.plExNeibSmooth +"");
		properties.setProperty(prefix+"plMergeCostStar",            this.plMergeCostStar +"");
		properties.setProperty(prefix+"plMergeCost",                this.plMergeCost +"");

		properties.setProperty(prefix+"plConflMerge",               this.plConflMerge+"");
		properties.setProperty(prefix+"plConflRelax",               this.plConflRelax +"");
		properties.setProperty(prefix+"plConflSngl",                this.plConflSngl+"");
		properties.setProperty(prefix+"plConflSnglPair",            this.plConflSnglPair+"");

		properties.setProperty(prefix+"plWeakFgStrength",           this.plWeakFgStrength +"");
		properties.setProperty(prefix+"plWeakFgOutliers",           this.plWeakFgOutliers+"");
		properties.setProperty(prefix+"plWeakFgRelax",              this.plWeakFgRelax +"");

		properties.setProperty(prefix+"plThickWorld",               this.plThickWorld +"");
		properties.setProperty(prefix+"plThickWorldConfl",          this.plThickWorldConfl +"");
		properties.setProperty(prefix+"plRelaxComplete",            this.plRelaxComplete +"");
		properties.setProperty(prefix+"plRelaxComplete2",           this.plRelaxComplete2 +"");

		properties.setProperty(prefix+"plMaxZRatio",                this.plMaxZRatio +"");
		properties.setProperty(prefix+"plMaxDisp",                  this.plMaxDisp +"");
		properties.setProperty(prefix+"plCutTail",                  this.plCutTail +"");
		properties.setProperty(prefix+"plMinTail",                  this.plMinTail +"");

		properties.setProperty(prefix+"plDiscrEn",                  this.plDiscrEn+"");
		properties.setProperty(prefix+"plDiscrTolerance",           this.plDiscrTolerance +"");
		properties.setProperty(prefix+"plDiscrDispRange",           this.plDiscrDispRange +"");
		properties.setProperty(prefix+"plDiscrSteps",               this.plDiscrSteps+"");
		//  			properties.setProperty(prefix+"plDiscrVariants",            this.plDiscrVariants+"");
		properties.setProperty(prefix+"plDiscrMode",                this.plDiscrMode+"");
		properties.setProperty(prefix+"plDiscrVarFloor",            this.plDiscrVarFloor +"");
		properties.setProperty(prefix+"plDiscrSigma",               this.plDiscrSigma +"");
		properties.setProperty(prefix+"plDiscrBlur",                this.plDiscrBlur +"");
		properties.setProperty(prefix+"plDiscrExclusivity",          this.plDiscrExclusivity +"");
		properties.setProperty(prefix+"plDiscrExclus2",             this.plDiscrExclus2 +"");
		properties.setProperty(prefix+"plDiscrStrict",              this.plDiscrStrict+"");
		properties.setProperty(prefix+"plDiscrCorrMax",             this.plDiscrCorrMax +"");
		properties.setProperty(prefix+"plDiscrCorrMerge",           this.plDiscrCorrMerge +"");
		properties.setProperty(prefix+"plDiscrSteal",               this.plDiscrSteal+"");
		properties.setProperty(prefix+"plDiscrGrown",               this.plDiscrGrown+"");
		properties.setProperty(prefix+"plDiscrXMedian",             this.plDiscrXMedian +"");

		properties.setProperty(prefix+"plCostDist",                 this.plCostDist +"");
		properties.setProperty(prefix+"plCostKrq",                  this.plCostKrq +"");
		properties.setProperty(prefix+"plCostKrqEq",                this.plCostKrqEq +"");
		properties.setProperty(prefix+"plCostWrq",                  this.plCostWrq +"");
		properties.setProperty(prefix+"plCostWrqEq",                this.plCostWrqEq +"");
		properties.setProperty(prefix+"plCostSin2",                 this.plCostSin2 +"");
		properties.setProperty(prefix+"plCostRdist2",               this.plCostRdist2 +"");

		properties.setProperty(prefix+"plConflDualTri",             this.plConflDualTri+"");
		properties.setProperty(prefix+"plConflMulti",               this.plConflMulti+"");
		properties.setProperty(prefix+"plConflDiag",                this.plConflDiag+"");
		properties.setProperty(prefix+"plConflStar",                this.plConflStar+"");
		properties.setProperty(prefix+"plStarSteps",                this.plStarSteps+"");
		properties.setProperty(prefix+"plStarOrtho",                this.plStarOrtho +"");
		properties.setProperty(prefix+"plStarDiag",                 this.plStarDiag +"");
		properties.setProperty(prefix+"plStarPwr",                  this.plStarPwr +"");
		properties.setProperty(prefix+"plStarWeightPwr",            this.plStarWeightPwr +"");
		properties.setProperty(prefix+"plWeightToDens",             this.plWeightToDens +"");
		properties.setProperty(prefix+"plStarValPwr",               this.plStarValPwr +"");
		properties.setProperty(prefix+"plDblTriLoss",               this.plDblTriLoss +"");
		properties.setProperty(prefix+"plNewConfl",                 this.plNewConfl+"");
		properties.setProperty(prefix+"plMaxChanges",               this.plMaxChanges+"");

		properties.setProperty(prefix+"plMutualOnly",               this.plMutualOnly+"");
		properties.setProperty(prefix+"plFillSquares",              this.plFillSquares+"");
		properties.setProperty(prefix+"plCutCorners",               this.plCutCorners+"");
		properties.setProperty(prefix+"plHypotenuse",               this.plHypotenuse+"");
		properties.setProperty(prefix+"plPull",                     this.plPull +"");
		properties.setProperty(prefix+"plNormPow",                  this.plNormPow +"");
		properties.setProperty(prefix+"plIterations",               this.plIterations+"");
		properties.setProperty(prefix+"plStopBad",                  this.plStopBad+"");
		properties.setProperty(prefix+"plPrecision",                this.plPrecision+"");

		properties.setProperty(prefix+"plSplitPull",                this.plSplitPull +"");
		properties.setProperty(prefix+"plSplitMinNeib",             this.plSplitMinNeib+"");
		properties.setProperty(prefix+"plSplitMinWeight",           this.plSplitMinWeight +"");
		properties.setProperty(prefix+"plSplitMinQuality",          this.plSplitMinQuality +"");
		properties.setProperty(prefix+"plSplitApply",               this.plSplitApply+"");
		properties.setProperty(prefix+"plNonExclusive",             this.plNonExclusive+"");
		properties.setProperty(prefix+"plUseOtherPlanes",           this.plUseOtherPlanes+"");
		properties.setProperty(prefix+"plAllowParallel",            this.plAllowParallel+"");
		properties.setProperty(prefix+"plMaxDiff",                  this.plMaxDiff +"");
		properties.setProperty(prefix+"plOtherDiff",                this.plOtherDiff +"");
		properties.setProperty(prefix+"plSplitXY",                  this.plSplitXY+"");
		properties.setProperty(prefix+"plSplitXYTolerance",          this.plSplitXYTolerance +"");

		properties.setProperty(prefix+"plFuse",                     this.plFuse+"");
		properties.setProperty(prefix+"plKeepOrphans",              this.plKeepOrphans+"");
		properties.setProperty(prefix+"plMinOrphan",                this.plMinOrphan +"");

		properties.setProperty(prefix+"plSnapDispAny",              this.plSnapDispAny +"");
		properties.setProperty(prefix+"plSnapStrengthAny",          this.plSnapStrengthAny +"");
		properties.setProperty(prefix+"plSnapNegAny",               this.plSnapNegAny +"");
		properties.setProperty(prefix+"plSnapDispMax",              this.plSnapDispMax +"");
		properties.setProperty(prefix+"plSnapDispWeight",           this.plSnapDispWeight +"");
		properties.setProperty(prefix+"plSnapZeroMode",             this.plSnapZeroMode+"");

		properties.setProperty(prefix+"msUseSel",                   this.msUseSel+"");
		properties.setProperty(prefix+"msDivideByArea",             this.msDivideByArea+"");
		properties.setProperty(prefix+"msScaleProj",                this.msScaleProj +"");
		properties.setProperty(prefix+"msFractUni",                 this.msFractUni +"");

		properties.setProperty(prefix+"tsNoEdge",                   this.tsNoEdge+"");
		properties.setProperty(prefix+"tsUseCenter",                this.tsUseCenter+"");
		properties.setProperty(prefix+"tsMaxDiff",                  this.tsMaxDiff +"");
		properties.setProperty(prefix+"tsMinDiffOther",             this.tsMinDiffOther +"");
		properties.setProperty(prefix+"tsMinStrength",              this.tsMinStrength +"");
		properties.setProperty(prefix+"tsMaxStrength",              this.tsMaxStrength +"");
		properties.setProperty(prefix+"tsMinSurface",               this.tsMinSurface +"");
		properties.setProperty(prefix+"tsMoveDirs",                 this.tsMoveDirs+"");
		properties.setProperty(prefix+"tsSurfStrPow",               this.tsSurfStrPow +"");
		properties.setProperty(prefix+"tsAddStrength",              this.tsAddStrength +"");
		properties.setProperty(prefix+"tsSigma",                    this.tsSigma +"");
		properties.setProperty(prefix+"tsNSigma",                   this.tsNSigma +"");
		properties.setProperty(prefix+"tsMinPull",                  this.tsMinPull +"");
		properties.setProperty(prefix+"tsMinAdvantage",             this.tsMinAdvantage +"");

		properties.setProperty(prefix+"tsClustSize",                this.tsClustSize +"");
		properties.setProperty(prefix+"tsClustWeight",              this.tsClustWeight +"");
		properties.setProperty(prefix+"tsMinNeib",                  this.tsMinNeib +"");
		properties.setProperty(prefix+"tsMaxSurStrength",           this.tsMaxSurStrength +"");
		properties.setProperty(prefix+"tsCountDis",                 this.tsCountDis +"");

		properties.setProperty(prefix+"tsEnPlaneSeed",              this.tsEnPlaneSeed+"");
		properties.setProperty(prefix+"tsEnOnly",                   this.tsEnOnly+"");
		properties.setProperty(prefix+"tsEnGrow",                   this.tsEnGrow+"");
		properties.setProperty(prefix+"tsGrowStrength",             this.tsGrowStrength +"");
		properties.setProperty(prefix+"tsGrowStrong",               this.tsGrowStrong+"");
		properties.setProperty(prefix+"tsContStrength",             this.tsContStrength +"");
		properties.setProperty(prefix+"tsContDiff",                 this.tsContDiff +"");

		properties.setProperty(prefix+"tsEnSingle",                 this.tsEnSingle+"");
		properties.setProperty(prefix+"tsEnMulti",                  this.tsEnMulti+"");
		properties.setProperty(prefix+"tsRemoveWeak1",              this.tsRemoveWeak1+"");
		properties.setProperty(prefix+"tsGrowSurround",             this.tsGrowSurround+"");
		properties.setProperty(prefix+"tsRemoveWeak2",              this.tsRemoveWeak2+"");
		properties.setProperty(prefix+"tsLoopMulti",                this.tsLoopMulti+"");
		properties.setProperty(prefix+"tsShow",                     this.tsShow+"");
		properties.setProperty(prefix+"tsNumClust",                 this.tsNumClust +"");

		properties.setProperty(prefix+"tsConsensMode",              this.tsConsensMode +"");
		properties.setProperty(prefix+"tsConsensAgree",             this.tsConsensAgree +"");

		properties.setProperty(prefix+"taMinFgBg",                  this.taMinFgBg +"");
		properties.setProperty(prefix+"taMinFgEdge",                this.taMinFgEdge +"");
		properties.setProperty(prefix+"taMinColSep",                this.taMinColSep +"");
		properties.setProperty(prefix+"taMinColDiff",               this.taMinColDiff +"");
		properties.setProperty(prefix+"taOutlier",                  this.taOutlier +"");
		properties.setProperty(prefix+"taDiffPwr",                  this.taDiffPwr +"");
		properties.setProperty(prefix+"taBestPwr",                  this.taBestPwr +"");
		properties.setProperty(prefix+"taDiff9Pwr",                 this.taDiff9Pwr +"");
		properties.setProperty(prefix+"taColSigma",                 this.taColSigma +"");
		properties.setProperty(prefix+"taColFraction",              this.taColFraction +"");

		properties.setProperty(prefix+"taCostEmpty",                this.taCostEmpty +"");
		properties.setProperty(prefix+"taCostNoLink",               this.taCostNoLink +"");
		properties.setProperty(prefix+"taCostSwitch",               this.taCostSwitch +"");
		properties.setProperty(prefix+"taCostColor",                this.taCostColor +"");
		properties.setProperty(prefix+"taCostDiff",                 this.taCostDiff +"");
		properties.setProperty(prefix+"taCostDiffBest",             this.taCostDiffBest +"");
		properties.setProperty(prefix+"taCostDiff9",                this.taCostDiff9 +"");
		properties.setProperty(prefix+"taCostWeakFgnd",             this.taCostWeakFgnd +"");
		properties.setProperty(prefix+"taCostFlaps",                this.taCostFlaps +"");
		properties.setProperty(prefix+"taCostMismatch",             this.taCostMismatch +"");

		properties.setProperty(prefix+"taEnEmpty",                  this.taEnEmpty +"");
		properties.setProperty(prefix+"taEnNoLink",                 this.taEnNoLink +"");
		properties.setProperty(prefix+"taEnSwitch",                 this.taEnSwitch +"");
		properties.setProperty(prefix+"taEnColor",                  this.taEnColor +"");
		properties.setProperty(prefix+"taEnDiff",                   this.taEnDiff +"");
		properties.setProperty(prefix+"taEnDiffBest",               this.taEnDiffBest +"");
		properties.setProperty(prefix+"taEnDiff9",                  this.taEnDiff9 +"");
		properties.setProperty(prefix+"taEnWeakFgnd",               this.taEnWeakFgnd +"");
		properties.setProperty(prefix+"taEnFlaps",                  this.taEnFlaps +"");
		properties.setProperty(prefix+"taEnMismatch",               this.taEnMismatch +"");


		properties.setProperty(prefix+"gpu_corr_scale",             this.gpu_corr_scale +"");
		properties.setProperty(prefix+"gpu_corr_rad",               this.gpu_corr_rad +"");
		properties.setProperty(prefix+"gpu_weight_r",               this.gpu_weight_r +"");
		properties.setProperty(prefix+"gpu_weight_b",               this.gpu_weight_b +"");
		properties.setProperty(prefix+"gpu_sigma_r",                this.gpu_sigma_r +"");
		properties.setProperty(prefix+"gpu_sigma_b",                this.gpu_sigma_b +"");
		properties.setProperty(prefix+"gpu_sigma_g",                this.gpu_sigma_g +"");
		properties.setProperty(prefix+"gpu_sigma_m",                this.gpu_sigma_m +"");
		properties.setProperty(prefix+"gpu_sigma_rb_corr",          this.gpu_sigma_rb_corr +"");
		properties.setProperty(prefix+"gpu_sigma_corr",             this.gpu_sigma_corr +"");
		properties.setProperty(prefix+"gpu_sigma_corr_m",           this.gpu_sigma_corr_m +"");
		properties.setProperty(prefix+"gpu_sigma_log_corr",         this.gpu_sigma_log_corr +"");
		properties.setProperty(prefix+"gpu_sigma_log_corr_m",       this.gpu_sigma_log_corr_m +"");
		properties.setProperty(prefix+"gpu_fatz",                   this.gpu_fatz +"");
		properties.setProperty(prefix+"gpu_fatz_m",                 this.gpu_fatz_m +"");

		properties.setProperty(prefix+"gpu_woi",                    this.gpu_woi +"");
		properties.setProperty(prefix+"gpu_woi_tx",                 this.gpu_woi_tx +"");
		properties.setProperty(prefix+"gpu_woi_ty",                 this.gpu_woi_ty +"");
		properties.setProperty(prefix+"gpu_woi_twidth",             this.gpu_woi_twidth +"");
		properties.setProperty(prefix+"gpu_woi_theight",            this.gpu_woi_theight +"");
		properties.setProperty(prefix+"gpu_woi_round",              this.gpu_woi_round +"");
		properties.setProperty(prefix+"gpu_save_ports_xy",          this.gpu_save_ports_xy +"");
		properties.setProperty(prefix+"gpu_show_jtextures",         this.gpu_show_jtextures +"");
		properties.setProperty(prefix+"gpu_show_extra",             this.gpu_show_extra +"");
		properties.setProperty(prefix+"gpu_show_geometry",          this.gpu_show_geometry +"");

		properties.setProperty(prefix+"gpu_use_main",               this.gpu_use_main +"");
		properties.setProperty(prefix+"gpu_use_main_macro",         this.gpu_use_main_macro +"");
		properties.setProperty(prefix+"gpu_use_main_adjust",        this.gpu_use_main_adjust +"");
		properties.setProperty(prefix+"gpu_use_aux",                this.gpu_use_aux +"");
		properties.setProperty(prefix+"gpu_use_aux_macro",          this.gpu_use_aux_macro +"");
		properties.setProperty(prefix+"gpu_use_aux_adjust",         this.gpu_use_aux_adjust +"");
		properties.setProperty(prefix+"gpu_debug_accum",            this.gpu_debug_accum +"");
		
		properties.setProperty(prefix+"debug_initial_discriminate",       this.debug_initial_discriminate+"");
		properties.setProperty(prefix+"dbg_migrate",                      this.dbg_migrate+"");

		properties.setProperty(prefix+"dbg_early_exit",                   this.dbg_early_exit+"");
		properties.setProperty(prefix+"show_first_bg",                    this.show_first_bg+"");

		properties.setProperty(prefix+"show_interframe",                  this.show_interframe+"");
		properties.setProperty(prefix+"show_filter_ly",                   this.show_filter_ly+"");
		properties.setProperty(prefix+"show_extrinsic",                   this.show_extrinsic+"");
		properties.setProperty(prefix+"show_ortho_combine",               this.show_ortho_combine+"");
		properties.setProperty(prefix+"show_refine_supertiles",           this.show_refine_supertiles+"");
		properties.setProperty(prefix+"show_bgnd_nonbgnd",                this.show_bgnd_nonbgnd+"");
		properties.setProperty(prefix+"show_filter_scan",                 this.show_filter_scan+"");
		properties.setProperty(prefix+"show_combined",                    this.show_combined+"");
		properties.setProperty(prefix+"show_unique",                      this.show_unique+"");
		properties.setProperty(prefix+"show_histograms",                  this.show_histograms+"");
		properties.setProperty(prefix+"show_init_refine",                 this.show_init_refine+"");
		properties.setProperty(prefix+"show_expand",                      this.show_expand+"");
		properties.setProperty(prefix+"show_variant",                     this.show_variant+"");
		properties.setProperty(prefix+"show_retry_far",                   this.show_retry_far+"");
		properties.setProperty(prefix+"show_macro",                       this.show_macro+"");
		properties.setProperty(prefix+"show_shells",                      this.show_shells+"");
		properties.setProperty(prefix+"show_neighbors",                   this.show_neighbors+"");
		properties.setProperty(prefix+"show_flaps_dirs",                  this.show_flaps_dirs+"");
		properties.setProperty(prefix+"show_first_clusters",              this.show_first_clusters+"");
		properties.setProperty(prefix+"show_planes",                      this.show_planes+"");

		properties.setProperty(prefix+"vertical_xyz.x",                   this.vertical_xyz[0]+"");
		properties.setProperty(prefix+"vertical_xyz.y",                   this.vertical_xyz[1]+"");
		properties.setProperty(prefix+"vertical_xyz.z",                   this.vertical_xyz[2]+"");

		if (z_corr_map != null) {
			for (HashMap.Entry<String,Double> entry : z_corr_map.entrySet()){
				properties.setProperty(prefix+Z_CORR_PREFIX+entry.getKey(),   entry.getValue().toString());
			}
		}
		setPropertiesInfinityDistance(prefix, properties);
		/*
			if (infinity_distace_map != null) {
				for (HashMap.Entry<String,Double> entry : infinity_distace_map.entrySet()){
					properties.setProperty(prefix+INFINITY_DISTANCE_PREFIX+entry.getKey(),   entry.getValue().toString());
				}
			}
		 */
		img_dtt.setProperties (prefix+"_img_dtt", properties);
		mlfp.setProperties    (prefix+"_mlfp",    properties);
		rig.setProperties     (prefix+"_rig",     properties);
		poles.setProperties   (prefix+"_poles",   properties);
		lwir.setProperties    (prefix+"_lwir",    properties);
		ofp.setProperties     (prefix+"_ofp_",    properties);
		ilp.setProperties     (prefix+"_ilp_",    properties);
		inp.setProperties     (prefix+"_inp_",    properties);

	}

	public void setPropertiesInfinityDistance(String prefix,Properties properties){
		if (infinity_distace_map != null) {
			for (HashMap.Entry<String,Double> entry : infinity_distace_map.entrySet()){
				properties.setProperty(prefix+INFINITY_DISTANCE_PREFIX+entry.getKey(),   entry.getValue().toString());
			}
		}
	}


	public void getProperties(String prefix,Properties properties){
		if (properties.getProperty(prefix+"transform_size")!=null)                this.transform_size=Integer.parseInt(properties.getProperty(prefix+"transform_size"));
		if (properties.getProperty(prefix+"clt_window")!=null)                    this.clt_window=Integer.parseInt(properties.getProperty(prefix+"clt_window"));
		if (properties.getProperty(prefix+"shift_x")!=null)                       this.shift_x=Double.parseDouble(properties.getProperty(prefix+"shift_x"));
		if (properties.getProperty(prefix+"shift_y")!=null)                       this.shift_y=Double.parseDouble(properties.getProperty(prefix+"shift_y"));

		if (properties.getProperty(prefix+"tileStep")!=null)                      this.tileStep=Integer.parseInt(properties.getProperty(prefix+"tileStep"));
		if (properties.getProperty(prefix+"tileSizeBg")!=null)                    this.super_radius=Integer.parseInt(properties.getProperty(prefix+"tileSizeBg"));
		if (properties.getProperty(prefix+"iclt_mask")!=null)                     this.iclt_mask=Integer.parseInt(properties.getProperty(prefix+"iclt_mask"));
		if (properties.getProperty(prefix+"tileX")!=null)                         this.tileX=Integer.parseInt(properties.getProperty(prefix+"tileX"));
		if (properties.getProperty(prefix+"tileY")!=null)                         this.tileY=Integer.parseInt(properties.getProperty(prefix+"tileY"));
		if (properties.getProperty(prefix+"dbg_mode")!=null)                      this.dbg_mode=Integer.parseInt(properties.getProperty(prefix+"dbg_mode"));
		if (properties.getProperty(prefix+"ishift_x")!=null)                      this.ishift_x=Integer.parseInt(properties.getProperty(prefix+"ishift_x"));
		if (properties.getProperty(prefix+"ishift_y")!=null)                      this.ishift_y=Integer.parseInt(properties.getProperty(prefix+"ishift_y"));
		if (properties.getProperty(prefix+"fat_zero")!=null)                      this.fat_zero=Double.parseDouble(properties.getProperty(prefix+"fat_zero"));
		if (properties.getProperty(prefix+"fat_zero_mono")!=null)                 this.fat_zero_mono=Double.parseDouble(properties.getProperty(prefix+"fat_zero_mono"));
		if (properties.getProperty(prefix+"corr_sigma")!=null)                    this.corr_sigma=Double.parseDouble(properties.getProperty(prefix+"corr_sigma"));
		if (properties.getProperty(prefix+"corr_sigma_mono")!=null)               this.corr_sigma_mono=Double.parseDouble(properties.getProperty(prefix+"corr_sigma_mono"));
		if (properties.getProperty(prefix+"texture_sigma")!=null)                 this.texture_sigma=Double.parseDouble(properties.getProperty(prefix+"texture_sigma"));
		if (properties.getProperty(prefix+"texture_sigma_mono")!=null)            this.texture_sigma_mono=Double.parseDouble(properties.getProperty(prefix+"texture_sigma_mono"));
		if (properties.getProperty(prefix+"scale_strength_main")!=null)           this.scale_strength_main=Double.parseDouble(properties.getProperty(prefix+"scale_strength_main"));
		if (properties.getProperty(prefix+"scale_strength_aux")!=null)            this.scale_strength_aux=Double.parseDouble(properties.getProperty(prefix+"scale_strength_aux"));

		if (properties.getProperty(prefix+"norm_kern")!=null)                     this.norm_kern=Boolean.parseBoolean(properties.getProperty(prefix+"norm_kern"));
		if (properties.getProperty(prefix+"gain_equalize")!=null)                 this.gain_equalize=Boolean.parseBoolean(properties.getProperty(prefix+"gain_equalize"));
		if (properties.getProperty(prefix+"colors_equalize")!=null)               this.colors_equalize=Boolean.parseBoolean(properties.getProperty(prefix+"colors_equalize"));
		if (properties.getProperty(prefix+"nosat_equalize")!=null)                this.nosat_equalize=Boolean.parseBoolean(properties.getProperty(prefix+"nosat_equalize"));
		if (properties.getProperty(prefix+"sat_level")!=null)                     this.sat_level=Double.parseDouble(properties.getProperty(prefix+"sat_level"));
		if (properties.getProperty(prefix+"max_overexposure")!=null)              this.max_overexposure=Double.parseDouble(properties.getProperty(prefix+"max_overexposure"));

		if (properties.getProperty(prefix+"novignetting_r")!=null)                this.novignetting_r=Double.parseDouble(properties.getProperty(prefix+"novignetting_r"));
		if (properties.getProperty(prefix+"novignetting_g")!=null)                this.novignetting_g=Double.parseDouble(properties.getProperty(prefix+"novignetting_g"));
		if (properties.getProperty(prefix+"novignetting_b")!=null)                this.novignetting_b=Double.parseDouble(properties.getProperty(prefix+"novignetting_b"));
		if (properties.getProperty(prefix+"scale_r")!=null)                       this.scale_r=Double.parseDouble(properties.getProperty(prefix+"scale_r"));
		if (properties.getProperty(prefix+"scale_g")!=null)                       this.scale_g=Double.parseDouble(properties.getProperty(prefix+"scale_g"));
		if (properties.getProperty(prefix+"scale_b")!=null)                       this.scale_b=Double.parseDouble(properties.getProperty(prefix+"scale_b"));
		if (properties.getProperty(prefix+"vignetting_max")!=null)                this.vignetting_max=Double.parseDouble(properties.getProperty(prefix+"vignetting_max"));
		if (properties.getProperty(prefix+"vignetting_range")!=null)              this.vignetting_range=Double.parseDouble(properties.getProperty(prefix+"vignetting_range"));
		if (properties.getProperty(prefix+"kernel_step")!=null)                   this.kernel_step=Integer.parseInt(properties.getProperty(prefix+"kernel_step"));
		if (properties.getProperty(prefix+"disparity")!=null)                     this.disparity=Double.parseDouble(properties.getProperty(prefix+"disparity"));
		if (properties.getProperty(prefix+"z_correction")!=null)                  this.z_correction=Double.parseDouble(properties.getProperty(prefix+"z_correction"));
		if (properties.getProperty(prefix+"correlate")!=null)                     this.correlate=Boolean.parseBoolean(properties.getProperty(prefix+"correlate"));
		if (properties.getProperty(prefix+"correlate_lma")!=null)                 this.correlate_lma=Boolean.parseBoolean(properties.getProperty(prefix+"correlate_lma"));
		if (properties.getProperty(prefix+"corr_mask")!=null)                     this.corr_mask=Integer.parseInt(properties.getProperty(prefix+"corr_mask"));
		if (properties.getProperty(prefix+"corr_sym")!=null)                      this.corr_sym=Boolean.parseBoolean(properties.getProperty(prefix+"corr_sym"));
		if (properties.getProperty(prefix+"corr_keep")!=null)                     this.corr_keep=Boolean.parseBoolean(properties.getProperty(prefix+"corr_keep"));
		if (properties.getProperty(prefix+"corr_show")!=null)                     this.corr_show=Boolean.parseBoolean(properties.getProperty(prefix+"corr_show"));
		if (properties.getProperty(prefix+"corr_mismatch")!=null)                 this.corr_mismatch=Boolean.parseBoolean(properties.getProperty(prefix+"corr_mismatch"));
		if (properties.getProperty(prefix+"corr_offset")!=null)                   this.corr_offset=Double.parseDouble(properties.getProperty(prefix+"corr_offset"));
		if (properties.getProperty(prefix+"corr_red")!=null)                      this.corr_red=Double.parseDouble(properties.getProperty(prefix+"corr_red"));
		if (properties.getProperty(prefix+"corr_blue")!=null)                     this.corr_blue=Double.parseDouble(properties.getProperty(prefix+"corr_blue"));
		if (properties.getProperty(prefix+"corr_normalize")!=null)                this.corr_normalize=Boolean.parseBoolean(properties.getProperty(prefix+"corr_normalize"));
		if (properties.getProperty(prefix+"min_corr")!=null)                      this.min_corr=Double.parseDouble(properties.getProperty(prefix+"min_corr"));
		if (properties.getProperty(prefix+"min_corr_normalized")!=null)           this.min_corr_normalized=Double.parseDouble(properties.getProperty(prefix+"min_corr_normalized"));
		if (properties.getProperty(prefix+"max_corr_sigma")!=null)                this.max_corr_sigma=Double.parseDouble(properties.getProperty(prefix+"max_corr_sigma"));
		if (properties.getProperty(prefix+"max_corr_radius")!=null)               this.max_corr_radius=Double.parseDouble(properties.getProperty(prefix+"max_corr_radius"));

		// for compatibility with old settings
		if (properties.getProperty(prefix+"enhortho_width")!=null)                this.img_dtt.setEnhOrthoWidth(Integer.parseInt(properties.getProperty(prefix+"enhortho_width")));
		if (properties.getProperty(prefix+"enhortho_scale")!=null)                this.img_dtt.setEnhOrthoScale(Double.parseDouble(properties.getProperty(prefix+"enhortho_scale")));
		// for compatibility with old settings

		if (properties.getProperty(prefix+"max_corr_double")!=null)               this.max_corr_double=Boolean.parseBoolean(properties.getProperty(prefix+"max_corr_double"));
		if (properties.getProperty(prefix+"corr_mode")!=null)                     this.corr_mode=Integer.parseInt(properties.getProperty(prefix+"corr_mode"));
		if (properties.getProperty(prefix+"corr_border_contrast")!=null)          this.corr_border_contrast=Double.parseDouble(properties.getProperty(prefix+"corr_border_contrast"));
		if (properties.getProperty(prefix+"tile_task_op")!=null)                  this.tile_task_op=Integer.parseInt(properties.getProperty(prefix+"tile_task_op"));
		if (properties.getProperty(prefix+"tile_task_wl")!=null)                  this.tile_task_wl=Integer.parseInt(properties.getProperty(prefix+"tile_task_wl"));
		if (properties.getProperty(prefix+"tile_task_wt")!=null)                  this.tile_task_wt=Integer.parseInt(properties.getProperty(prefix+"tile_task_wt"));
		if (properties.getProperty(prefix+"tile_task_ww")!=null)                  this.tile_task_ww=Integer.parseInt(properties.getProperty(prefix+"tile_task_ww"));
		if (properties.getProperty(prefix+"tile_task_wh")!=null)                  this.tile_task_wh=Integer.parseInt(properties.getProperty(prefix+"tile_task_wh"));
		if (properties.getProperty(prefix+"min_shot")!=null)                      this.min_shot=Double.parseDouble(properties.getProperty(prefix+"min_shot"));
		if (properties.getProperty(prefix+"scale_shot")!=null)                    this.scale_shot=Double.parseDouble(properties.getProperty(prefix+"scale_shot"));
		if (properties.getProperty(prefix+"diff_sigma")!=null)                    this.diff_sigma=Double.parseDouble(properties.getProperty(prefix+"diff_sigma"));
		if (properties.getProperty(prefix+"diff_threshold")!=null)                this.diff_threshold=Double.parseDouble(properties.getProperty(prefix+"diff_threshold"));
		if (properties.getProperty(prefix+"diff_gauss")!=null)                    this.diff_gauss=Boolean.parseBoolean(properties.getProperty(prefix+"diff_gauss"));
		if (properties.getProperty(prefix+"min_agree")!=null)                     this.min_agree=Double.parseDouble(properties.getProperty(prefix+"min_agree"));
		if (properties.getProperty(prefix+"dust_remove")!=null)                   this.dust_remove=Boolean.parseBoolean(properties.getProperty(prefix+"dust_remove"));
		if (properties.getProperty(prefix+"black_back")!=null)                    this.black_back=Boolean.parseBoolean(properties.getProperty(prefix+"black_back"));
		if (properties.getProperty(prefix+"keep_weights")!=null)                  this.keep_weights=Boolean.parseBoolean(properties.getProperty(prefix+"keep_weights"));
		if (properties.getProperty(prefix+"sharp_alpha")!=null)                   this.sharp_alpha=Boolean.parseBoolean(properties.getProperty(prefix+"sharp_alpha"));
		if (properties.getProperty(prefix+"alpha0")!=null)                        this.alpha0=Double.parseDouble(properties.getProperty(prefix+"alpha0"));
		if (properties.getProperty(prefix+"alpha1")!=null)                        this.alpha1=Double.parseDouble(properties.getProperty(prefix+"alpha1"));
		if (properties.getProperty(prefix+"gen_chn_stacks")!=null)                this.gen_chn_stacks=Boolean.parseBoolean(properties.getProperty(prefix+"gen_chn_stacks"));
		if (properties.getProperty(prefix+"gen_chn_img")!=null)                   this.gen_chn_img=Boolean.parseBoolean(properties.getProperty(prefix+"gen_chn_img"));
		if (properties.getProperty(prefix+"gen_4_img")!=null)                     this.gen_4_img=Boolean.parseBoolean(properties.getProperty(prefix+"gen_4_img"));
		if (properties.getProperty(prefix+"show_nonoverlap")!=null)               this.show_nonoverlap=Boolean.parseBoolean(properties.getProperty(prefix+"show_nonoverlap"));
		if (properties.getProperty(prefix+"show_overlap")!=null)                  this.show_overlap=Boolean.parseBoolean(properties.getProperty(prefix+"show_overlap"));
		if (properties.getProperty(prefix+"show_rgba_color")!=null)               this.show_rgba_color=Boolean.parseBoolean(properties.getProperty(prefix+"show_rgba_color"));
		if (properties.getProperty(prefix+"show_map")!=null)                      this.show_map=Boolean.parseBoolean(properties.getProperty(prefix+"show_map"));
		if (properties.getProperty(prefix+"show_corr")!=null)                     this.show_corr=Boolean.parseBoolean(properties.getProperty(prefix+"show_corr"));

		if (properties.getProperty(prefix+"disp_scan_start")!=null)               this.disp_scan_start=Double.parseDouble(properties.getProperty(prefix+"disp_scan_start"));
		if (properties.getProperty(prefix+"disp_scan_step")!=null)                this.disp_scan_step=Double.parseDouble(properties.getProperty(prefix+"disp_scan_step"));
		if (properties.getProperty(prefix+"disp_scan_count")!=null)               this.disp_scan_count=Integer.parseInt(properties.getProperty(prefix+"disp_scan_count"));

		if (properties.getProperty(prefix+"fine_dbg")!=null)                      this.fine_dbg=Boolean.parseBoolean(properties.getProperty(prefix+"fine_dbg"));
		if (properties.getProperty(prefix+"fine_corr_x_0")!=null)                 this.fine_corr_x_0=Double.parseDouble(properties.getProperty(prefix+"fine_corr_x_0"));
		if (properties.getProperty(prefix+"fine_corr_y_0")!=null)                 this.fine_corr_y_0=Double.parseDouble(properties.getProperty(prefix+"fine_corr_y_0"));
		if (properties.getProperty(prefix+"fine_corr_x_1")!=null)                 this.fine_corr_x_1=Double.parseDouble(properties.getProperty(prefix+"fine_corr_x_1"));
		if (properties.getProperty(prefix+"fine_corr_y_1")!=null)                 this.fine_corr_y_1=Double.parseDouble(properties.getProperty(prefix+"fine_corr_y_1"));
		if (properties.getProperty(prefix+"fine_corr_x_2")!=null)                 this.fine_corr_x_2=Double.parseDouble(properties.getProperty(prefix+"fine_corr_x_2"));
		if (properties.getProperty(prefix+"fine_corr_y_2")!=null)                 this.fine_corr_y_2=Double.parseDouble(properties.getProperty(prefix+"fine_corr_y_2"));
		if (properties.getProperty(prefix+"fine_corr_x_3")!=null)                 this.fine_corr_x_3=Double.parseDouble(properties.getProperty(prefix+"fine_corr_x_3"));
		if (properties.getProperty(prefix+"fine_corr_y_3")!=null)                 this.fine_corr_y_3=Double.parseDouble(properties.getProperty(prefix+"fine_corr_y_3"));
		if (properties.getProperty(prefix+"fine_corr_ignore")!=null)              this.fine_corr_ignore=Boolean.parseBoolean(properties.getProperty(prefix+"fine_corr_ignore"));
		if (properties.getProperty(prefix+"fine_corr_apply")!=null)               this.fine_corr_apply=Boolean.parseBoolean(properties.getProperty(prefix+"fine_corr_apply"));

		if (properties.getProperty(prefix+"fcorr_radius")!=null)                  this.fcorr_radius=Double.parseDouble(properties.getProperty(prefix+"fcorr_radius"));
		if (properties.getProperty(prefix+"fcorr_min_strength")!=null)            this.fcorr_min_strength=Double.parseDouble(properties.getProperty(prefix+"fcorr_min_strength"));
		if (properties.getProperty(prefix+"fcorr_disp_diff")!=null)               this.fcorr_disp_diff=Double.parseDouble(properties.getProperty(prefix+"fcorr_disp_diff"));
		if (properties.getProperty(prefix+"fcorr_quadratic")!=null)               this.fcorr_quadratic=Boolean.parseBoolean(properties.getProperty(prefix+"fcorr_quadratic"));
		if (properties.getProperty(prefix+"fcorr_ignore")!=null)                  this.fcorr_ignore=Boolean.parseBoolean(properties.getProperty(prefix+"fcorr_ignore"));

		if (properties.getProperty(prefix+"fcorr_inf_strength")!=null)            this.fcorr_inf_strength=Double.parseDouble(properties.getProperty(prefix+"fcorr_inf_strength"));
		if (properties.getProperty(prefix+"fcorr_inf_diff")!=null)                this.fcorr_inf_diff=Double.parseDouble(properties.getProperty(prefix+"fcorr_inf_diff"));
		if (properties.getProperty(prefix+"fcorr_inf_quad")!=null)                this.fcorr_inf_quad=Boolean.parseBoolean(properties.getProperty(prefix+"fcorr_inf_quad"));
		if (properties.getProperty(prefix+"fcorr_inf_vert")!=null)                this.fcorr_inf_vert=Boolean.parseBoolean(properties.getProperty(prefix+"fcorr_inf_vert"));

		if (properties.getProperty(prefix+"inf_disp_apply")!=null)                this.inf_disp_apply=Boolean.parseBoolean(properties.getProperty(prefix+"inf_disp_apply"));
		if (properties.getProperty(prefix+"inf_repeat")!=null)                    this.inf_repeat=Integer.parseInt(properties.getProperty(prefix+"inf_repeat"));
		//  			if (properties.getProperty(prefix+"inf_mism_apply")!=null)              this.inf_mism_apply=Boolean.parseBoolean(properties.getProperty(prefix+"inf_mism_apply"));

		if (properties.getProperty(prefix+"inf_iters")!=null)                     this.inf_iters=Integer.parseInt(properties.getProperty(prefix+"inf_iters"));
		if (properties.getProperty(prefix+"inf_final_diff")!=null)                this.inf_final_diff=Double.parseDouble(properties.getProperty(prefix+"inf_final_diff"));
		if (properties.getProperty(prefix+"inf_far_pull")!=null)                  this.inf_far_pull=Double.parseDouble(properties.getProperty(prefix+"inf_far_pull"));

		if (properties.getProperty(prefix+"inf_str_pow")!=null)                   this.inf_str_pow=Double.parseDouble(properties.getProperty(prefix+"inf_str_pow"));
		if (properties.getProperty(prefix+"inf_smpl_side")!=null)                 this.inf_smpl_side=Integer.parseInt(properties.getProperty(prefix+"inf_smpl_side"));
		if (properties.getProperty(prefix+"inf_smpl_num")!=null)                  this.inf_smpl_num=Integer.parseInt(properties.getProperty(prefix+"inf_smpl_num"));
		if (properties.getProperty(prefix+"inf_smpl_rms")!=null)                  this.inf_smpl_rms=Double.parseDouble(properties.getProperty(prefix+"inf_smpl_rms"));

		if (properties.getProperty(prefix+"ih_smpl_step")!=null)                  this.ih_smpl_step=Integer.parseInt(properties.getProperty(prefix+"ih_smpl_step"));
		if (properties.getProperty(prefix+"ih_disp_min")!=null)                   this.ih_disp_min=Double.parseDouble(properties.getProperty(prefix+"ih_disp_min"));
		if (properties.getProperty(prefix+"ih_disp_step")!=null)                  this.ih_disp_step=Double.parseDouble(properties.getProperty(prefix+"ih_disp_step"));
		if (properties.getProperty(prefix+"ih_num_bins")!=null)                   this.ih_num_bins=Integer.parseInt(properties.getProperty(prefix+"ih_num_bins"));
		if (properties.getProperty(prefix+"ih_sigma")!=null)                      this.ih_sigma=Double.parseDouble(properties.getProperty(prefix+"ih_sigma"));
		if (properties.getProperty(prefix+"ih_max_diff")!=null)                   this.ih_max_diff=Double.parseDouble(properties.getProperty(prefix+"ih_max_diff"));
		if (properties.getProperty(prefix+"ih_min_samples")!=null)                this.ih_min_samples=Integer.parseInt(properties.getProperty(prefix+"ih_min_samples"));
		if (properties.getProperty(prefix+"ih_norm_center")!=null)                this.ih_norm_center=Boolean.parseBoolean(properties.getProperty(prefix+"ih_norm_center"));
		if (properties.getProperty(prefix+"inf_restore_disp")!=null)              this.inf_restore_disp=Boolean.parseBoolean(properties.getProperty(prefix+"inf_restore_disp"));

		if (properties.getProperty(prefix+"intra_keep_strength")!=null)                this.intra_keep_strength=Double.parseDouble(properties.getProperty(prefix+"intra_keep_strength"));
		if (properties.getProperty(prefix+"intra_keep_conditional_strength")!=null)    this.intra_keep_conditional_strength=Double.parseDouble(properties.getProperty(prefix+"intra_keep_conditional_strength"));
		if (properties.getProperty(prefix+"intra_absolute_disparity_tolerance")!=null) this.intra_absolute_disparity_tolerance=Double.parseDouble(properties.getProperty(prefix+"intra_absolute_disparity_tolerance"));
		if (properties.getProperty(prefix+"intra_relative_disparity_tolerance")!=null) this.intra_relative_disparity_tolerance=Double.parseDouble(properties.getProperty(prefix+"intra_relative_disparity_tolerance"));
		if (properties.getProperty(prefix+"intra_cluster_size")!=null)                 this.intra_cluster_size=Integer.parseInt(properties.getProperty(prefix+"intra_cluster_size"));

		if (properties.getProperty(prefix+"ly_lma_ers")!=null)                    this.ly_lma_ers=Boolean.parseBoolean(properties.getProperty(prefix+"ly_lma_ers"));
		if (properties.getProperty(prefix+"ly_gt_strength")!=null)                this.ly_gt_strength=Double.parseDouble(properties.getProperty(prefix+"ly_gt_strength"));
		if (properties.getProperty(prefix+"ly_gt_use_wnd")!=null)                 this.ly_gt_use_wnd=Boolean.parseBoolean(properties.getProperty(prefix+"ly_gt_use_wnd"));
		if (properties.getProperty(prefix+"ly_gt_rms")!=null)                     this.ly_gt_rms=Double.parseDouble(properties.getProperty(prefix+"ly_gt_rms"));

		if (properties.getProperty(prefix+"lylw_inf_en")!=null)                     this.lylw_inf_en=Boolean.parseBoolean(properties.getProperty(prefix+"lylw_inf_en"));
		if (properties.getProperty(prefix+"lylw_aztilt_en")!=null)                  this.lylw_aztilt_en=Boolean.parseBoolean(properties.getProperty(prefix+"lylw_aztilt_en"));
		if (properties.getProperty(prefix+"lylw_diff_roll_en")!=null)               this.lylw_diff_roll_en=Boolean.parseBoolean(properties.getProperty(prefix+"lylw_diff_roll_en"));
		if (properties.getProperty(prefix+"lylw_focalLength")!=null)                this.lylw_focalLength=Boolean.parseBoolean(properties.getProperty(prefix+"lylw_focalLength"));
		if (properties.getProperty(prefix+"lylw_com_roll")!=null)                   this.lylw_com_roll=Boolean.parseBoolean(properties.getProperty(prefix+"lylw_com_roll"));
		if (properties.getProperty(prefix+"lylw_par_sel")!=null)                    this.lylw_par_sel=Integer.parseInt(properties.getProperty(prefix+"lylw_par_sel"));

		if (properties.getProperty(prefix+"ly_marg_fract")!=null)                 this.ly_marg_fract=Double.parseDouble(properties.getProperty(prefix+"ly_marg_fract"));
		if (properties.getProperty(prefix+"ly_rad_to_hdiag")!=null)               this.ly_rad_to_hdiag=Double.parseDouble(properties.getProperty(prefix+"ly_rad_to_hdiag"));
		if (properties.getProperty(prefix+"ly_on_scan")!=null)                    this.ly_on_scan=Boolean.parseBoolean(properties.getProperty(prefix+"ly_on_scan"));
		if (properties.getProperty(prefix+"ly_inf_en")!=null)                     this.ly_inf_en=Boolean.parseBoolean(properties.getProperty(prefix+"ly_inf_en"));
		if (properties.getProperty(prefix+"ly_min_forced")!=null)                 this.ly_min_forced=Integer.parseInt(properties.getProperty(prefix+"ly_min_forced"));
		if (properties.getProperty(prefix+"ly_aztilt_en")!=null)                  this.ly_aztilt_en=Boolean.parseBoolean(properties.getProperty(prefix+"ly_aztilt_en"));
		if (properties.getProperty(prefix+"ly_diff_roll_en")!=null)               this.ly_diff_roll_en=Boolean.parseBoolean(properties.getProperty(prefix+"ly_diff_roll_en"));
		if (properties.getProperty(prefix+"ly_focalLength")!=null)                this.ly_focalLength=Boolean.parseBoolean(properties.getProperty(prefix+"ly_focalLength"));
		if (properties.getProperty(prefix+"ly_com_roll")!=null)                   this.ly_com_roll=Boolean.parseBoolean(properties.getProperty(prefix+"ly_com_roll"));
		if (properties.getProperty(prefix+"ly_ers_rot")!=null)                    this.ly_ers_rot=Boolean.parseBoolean(properties.getProperty(prefix+"ly_ers_rot"));
		if (properties.getProperty(prefix+"ly_ers_forw")!=null)                   this.ly_ers_forw=Boolean.parseBoolean(properties.getProperty(prefix+"ly_ers_forw"));
		if (properties.getProperty(prefix+"ly_ers_side")!=null)                   this.ly_ers_side=Boolean.parseBoolean(properties.getProperty(prefix+"ly_ers_side"));
		if (properties.getProperty(prefix+"ly_ers_vert")!=null)                   this.ly_ers_vert=Boolean.parseBoolean(properties.getProperty(prefix+"ly_ers_vert"));
		if (properties.getProperty(prefix+"ly_par_sel")!=null)                    this.ly_par_sel=Integer.parseInt(properties.getProperty(prefix+"ly_par_sel"));

		if (properties.getProperty(prefix+"ly_weight_infinity")!=null)            this.ly_weight_infinity=Double.parseDouble(properties.getProperty(prefix+"ly_weight_infinity"));
		if (properties.getProperty(prefix+"ly_weight_disparity")!=null)           this.ly_weight_disparity=Double.parseDouble(properties.getProperty(prefix+"ly_weight_disparity"));
		if (properties.getProperty(prefix+"ly_weight_disparity_inf")!=null)       this.ly_weight_disparity_inf=Double.parseDouble(properties.getProperty(prefix+"ly_weight_disparity_inf"));
		if (properties.getProperty(prefix+"ly_max_disparity_far")!=null)          this.ly_max_disparity_far=Double.parseDouble(properties.getProperty(prefix+"ly_max_disparity_far"));
		if (properties.getProperty(prefix+"ly_max_disparity_use")!=null)          this.ly_max_disparity_use=Double.parseDouble(properties.getProperty(prefix+"ly_max_disparity_use"));

		if (properties.getProperty(prefix+"ly_inf_min_dfe")!=null)                this.ly_inf_min_dfe=Double.parseDouble(properties.getProperty(prefix+"ly_inf_min_dfe"));
		if (properties.getProperty(prefix+"ly_inf_max_dfe")!=null)                this.ly_inf_max_dfe=Double.parseDouble(properties.getProperty(prefix+"ly_inf_max_dfe"));

		if (properties.getProperty(prefix+"ly_inf_force_fine")!=null)             this.ly_inf_force_fine=Boolean.parseBoolean(properties.getProperty(prefix+"ly_inf_force_fine"));
		if (properties.getProperty(prefix+"ly_inf_min_broad")!=null)              this.ly_inf_min_broad=Double.parseDouble(properties.getProperty(prefix+"ly_inf_min_broad"));
		if (properties.getProperty(prefix+"ly_inf_max_broad")!=null)              this.ly_inf_max_broad=Double.parseDouble(properties.getProperty(prefix+"ly_inf_max_broad"));
		if (properties.getProperty(prefix+"ly_inf_min_narrow")!=null)             this.ly_inf_min_narrow=Double.parseDouble(properties.getProperty(prefix+"ly_inf_min_narrow"));
		if (properties.getProperty(prefix+"ly_inf_max_narrow")!=null)             this.ly_inf_max_narrow=Double.parseDouble(properties.getProperty(prefix+"ly_inf_max_narrow"));
		
		if (properties.getProperty(prefix+"ly_moving_en")!=null)                  this.ly_moving_en=Boolean.parseBoolean(properties.getProperty(prefix+"ly_moving_en"));
		if (properties.getProperty(prefix+"ly_moving_apply")!=null)               this.ly_moving_apply=Boolean.parseBoolean(properties.getProperty(prefix+"ly_moving_apply"));
		if (properties.getProperty(prefix+"ly_moving_sigma")!=null)               this.ly_moving_sigma=Double.parseDouble(properties.getProperty(prefix+"ly_moving_sigma"));
		if (properties.getProperty(prefix+"ly_max_mov_disparity")!=null)          this.ly_max_mov_disparity=Double.parseDouble(properties.getProperty(prefix+"ly_max_mov_disparity"));
		if (properties.getProperty(prefix+"ly_rad_to_hdiag_mov")!=null)           this.ly_rad_to_hdiag_mov=Double.parseDouble(properties.getProperty(prefix+"ly_rad_to_hdiag_mov"));
		if (properties.getProperty(prefix+"ly_max_mov_average")!=null)            this.ly_max_mov_average=Double.parseDouble(properties.getProperty(prefix+"ly_max_mov_average"));
		if (properties.getProperty(prefix+"ly_mov_min_L2")!=null)                 this.ly_mov_min_L2=Double.parseDouble(properties.getProperty(prefix+"ly_mov_min_L2"));
		
		if (properties.getProperty(prefix+"ly_debug_level")!=null)                this.ly_debug_level=Integer.parseInt(properties.getProperty(prefix+"ly_debug_level"));
		if (properties.getProperty(prefix+"ly_right_left")!=null)                 this.ly_right_left=Boolean.parseBoolean(properties.getProperty(prefix+"ly_right_left"));
		if (properties.getProperty(prefix+"ly_inf_tilt")!=null)                   this.ly_inf_tilt=Boolean.parseBoolean(properties.getProperty(prefix+"ly_inf_tilt"));

		if (properties.getProperty(prefix+"ly_per_quad")!=null)                   this.ly_per_quad=Integer.parseInt(properties.getProperty(prefix+"ly_per_quad"));
		if (properties.getProperty(prefix+"ly_per_quad_r")!=null)                 this.ly_per_quad_r=Double.parseDouble(properties.getProperty(prefix+"ly_per_quad_r"));
		if (properties.getProperty(prefix+"ly_inf")!=null)                        this.ly_inf=Integer.parseInt(properties.getProperty(prefix+"ly_inf"));
		if (properties.getProperty(prefix+"ly_inf_r")!=null)                      this.ly_inf_r=Double.parseDouble(properties.getProperty(prefix+"ly_inf_r"));
		if (properties.getProperty(prefix+"ly_inf_scale")!=null)                  this.ly_inf_scale=Integer.parseInt(properties.getProperty(prefix+"ly_inf_scale"));
		if (properties.getProperty(prefix+"ly_inf_scale_r")!=null)                this.ly_inf_scale_r=Double.parseDouble(properties.getProperty(prefix+"ly_inf_scale_r"));

		if (properties.getProperty(prefix+"ly_inf_frac")!=null)                   this.ly_inf_frac=Double.parseDouble(properties.getProperty(prefix+"ly_inf_frac"));
		if (properties.getProperty(prefix+"ly_inf_max_disparity")!=null)          this.ly_inf_max_disparity=Double.parseDouble(properties.getProperty(prefix+"ly_inf_max_disparity"));

		if (properties.getProperty(prefix+"ly_inf_disp")!=null)                   this.ly_inf_disp=Boolean.parseBoolean(properties.getProperty(prefix+"ly_inf_disp"));

		if (properties.getProperty(prefix+"ly_inf_force")!=null)                  this.ly_inf_force=Boolean.parseBoolean(properties.getProperty(prefix+"ly_inf_force"));


		if (properties.getProperty(prefix+"ly_poly")!=null)                       this.ly_poly=Boolean.parseBoolean(properties.getProperty(prefix+"ly_poly"));

		if (properties.getProperty(prefix+"ly_smpl_side")!=null)                  this.ly_smpl_side=Integer.parseInt(properties.getProperty(prefix+"ly_smpl_side"));
		if (properties.getProperty(prefix+"ly_smpl_num")!=null)                   this.ly_smpl_num=Integer.parseInt(properties.getProperty(prefix+"ly_smpl_num"));
		if (properties.getProperty(prefix+"ly_smpl_rms")!=null)                   this.ly_smpl_rms=Double.parseDouble(properties.getProperty(prefix+"ly_smpl_rms"));
		if (properties.getProperty(prefix+"ly_disp_var")!=null)                   this.ly_disp_var=Double.parseDouble(properties.getProperty(prefix+"ly_disp_var"));
		if (properties.getProperty(prefix+"ly_disp_rvar")!=null)                  this.ly_disp_rvar=Double.parseDouble(properties.getProperty(prefix+"ly_disp_rvar"));
		if (properties.getProperty(prefix+"ly_disp_var_gt")!=null)                this.ly_disp_var_gt=Double.parseDouble(properties.getProperty(prefix+"ly_disp_var_gt"));
		if (properties.getProperty(prefix+"ly_disp_rvar_gt")!=null)               this.ly_disp_rvar_gt=Double.parseDouble(properties.getProperty(prefix+"ly_disp_rvar_gt"));
		if (properties.getProperty(prefix+"ly_norm_disp")!=null)                  this.ly_norm_disp=Double.parseDouble(properties.getProperty(prefix+"ly_norm_disp"));
		if (properties.getProperty(prefix+"lym_overexp")!=null)                   this.lym_overexp=Double.parseDouble(properties.getProperty(prefix+"lym_overexp"));
		if (properties.getProperty(prefix+"lym_dbg_path")!=null)                  this.lym_dbg_path= (String) properties.getProperty(prefix+"lym_dbg_path");
		if (properties.getProperty(prefix+"lym_update_disp")!=null)               this.lym_update_disp=Boolean.parseBoolean(properties.getProperty(prefix+"lym_update_disp"));
		if (properties.getProperty(prefix+"lym_iter")!=null)                      this.lym_iter=Integer.parseInt(properties.getProperty(prefix+"lym_iter"));
		if (properties.getProperty(prefix+"lym_change")!=null)                    this.lym_change=Double.parseDouble(properties.getProperty(prefix+"lym_change"));
		if (properties.getProperty(prefix+"lym_change_aux")!=null)                this.lym_change_aux=Double.parseDouble(properties.getProperty(prefix+"lym_change_aux"));
		if (properties.getProperty(prefix+"lym_poly_change")!=null)               this.lym_poly_change=Double.parseDouble(properties.getProperty(prefix+"lym_poly_change"));

		if (properties.getProperty(prefix+"lym_mod_map")!=null)                   this.lym_mod_map=Boolean.parseBoolean(properties.getProperty(prefix+"lym_mod_map"));
		if (properties.getProperty(prefix+"lym_top_bg")!=null)                    this.lym_top_bg=Boolean.parseBoolean(properties.getProperty(prefix+"lym_top_bg"));
		if (properties.getProperty(prefix+"lym_fill_gaps_bg")!=null)              this.lym_fill_gaps_bg=Integer.parseInt(properties.getProperty(prefix+"lym_fill_gaps_bg"));
		if (properties.getProperty(prefix+"lym_fill_gaps_combo")!=null)           this.lym_fill_gaps_combo=Integer.parseInt(properties.getProperty(prefix+"lym_fill_gaps_combo"));
		if (properties.getProperty(prefix+"lym_use_strength")!=null)              this.lym_use_strength=Boolean.parseBoolean(properties.getProperty(prefix+"lym_use_strength"));
		if (properties.getProperty(prefix+"lym_scale_deriv_str")!=null)           this.lym_scale_deriv_str=Double.parseDouble(properties.getProperty(prefix+"lym_scale_deriv_str"));
		
		if (properties.getProperty(prefix+"lyf_filter")!=null)                    this.lyf_filter=Boolean.parseBoolean(properties.getProperty(prefix+"lyf_filter"));
		if (properties.getProperty(prefix+"lyf_smpl_side")!=null)                 this.lyf_smpl_side=Integer.parseInt(properties.getProperty(prefix+"lyf_smpl_side"));
		if (properties.getProperty(prefix+"lyf_rms_max")!=null)                   this.lyf_rms_max=Double.parseDouble(properties.getProperty(prefix+"lyf_rms_max"));
		if (properties.getProperty(prefix+"lyf_frac_keep")!=null)                 this.lyf_frac_keep=Double.parseDouble(properties.getProperty(prefix+"lyf_frac_keep"));
		if (properties.getProperty(prefix+"lyf_min_samples")!=null)               this.lyf_min_samples=Integer.parseInt(properties.getProperty(prefix+"lyf_min_samples"));
		if (properties.getProperty(prefix+"lyf_norm_center")!=null)               this.lyf_norm_center=Boolean.parseBoolean(properties.getProperty(prefix+"lyf_norm_center"));
		if (properties.getProperty(prefix+"ly_corr_scale")!=null)                 this.ly_corr_scale=Double.parseDouble(properties.getProperty(prefix+"ly_corr_scale"));

		if (properties.getProperty(prefix+"lyr_filter_ds")!=null)                 this.lyr_filter_ds=Boolean.parseBoolean(properties.getProperty(prefix+"lyr_filter_ds"));
		if (properties.getProperty(prefix+"lyr_filter_lyf")!=null)                this.lyr_filter_lyf=Boolean.parseBoolean(properties.getProperty(prefix+"lyr_filter_lyf"));

		if (properties.getProperty(prefix+"corr_magic_scale")!=null)              this.corr_magic_scale=Double.parseDouble(properties.getProperty(prefix+"corr_magic_scale"));
		if (properties.getProperty(prefix+"corr_select")!=null)                   this.corr_select=Integer.parseInt(properties.getProperty(prefix+"corr_select"));

		if (properties.getProperty(prefix+"show_textures")!=null)                 this.show_textures=Boolean.parseBoolean(properties.getProperty(prefix+"show_textures"));
		if (properties.getProperty(prefix+"debug_filters")!=null)                 this.debug_filters=Boolean.parseBoolean(properties.getProperty(prefix+"debug_filters"));

		if (properties.getProperty(prefix+"min_smth")!=null)                      this.min_smth=Double.parseDouble(properties.getProperty(prefix+"min_smth"));
		if (properties.getProperty(prefix+"sure_smth")!=null)                     this.sure_smth=Double.parseDouble(properties.getProperty(prefix+"sure_smth"));
		if (properties.getProperty(prefix+"bgnd_range")!=null)                    this.bgnd_range=Double.parseDouble(properties.getProperty(prefix+"bgnd_range"));
		if (properties.getProperty(prefix+"other_range")!=null)                   this.other_range=Double.parseDouble(properties.getProperty(prefix+"other_range"));

		if (properties.getProperty(prefix+"ex_strength")!=null)                   this.ex_strength=Double.parseDouble(properties.getProperty(prefix+"ex_strength"));
		if (properties.getProperty(prefix+"ex_nstrength")!=null)                  this.ex_nstrength=Double.parseDouble(properties.getProperty(prefix+"ex_nstrength"));

		if (properties.getProperty(prefix+"ex_over_bgnd")!=null)                  this.ex_over_bgnd=Boolean.parseBoolean(properties.getProperty(prefix+"ex_over_bgnd"));
		if (properties.getProperty(prefix+"ex_min_over")!=null)                   this.ex_min_over=Double.parseDouble(properties.getProperty(prefix+"ex_min_over"));

		if (properties.getProperty(prefix+"pt_super_trust")!=null)                this.pt_super_trust=Double.parseDouble(properties.getProperty(prefix+"pt_super_trust"));
		if (properties.getProperty(prefix+"pt_keep_raw_fg")!=null)                this.pt_keep_raw_fg=Boolean.parseBoolean(properties.getProperty(prefix+"pt_keep_raw_fg"));
		if (properties.getProperty(prefix+"pt_scale_pre")!=null)                  this.pt_scale_pre=Double.parseDouble(properties.getProperty(prefix+"pt_scale_pre"));
		if (properties.getProperty(prefix+"pt_scale_post")!=null)                 this.pt_scale_post=Double.parseDouble(properties.getProperty(prefix+"pt_scale_post"));

		if (properties.getProperty(prefix+"bgnd_sure")!=null)                     this.bgnd_sure=Double.parseDouble(properties.getProperty(prefix+"bgnd_sure"));
		if (properties.getProperty(prefix+"bgnd_maybe")!=null)                    this.bgnd_maybe=Double.parseDouble(properties.getProperty(prefix+"bgnd_maybe"));
		if (properties.getProperty(prefix+"min_clstr_seed")!=null)                this.min_clstr_seed=Integer.parseInt(properties.getProperty(prefix+"min_clstr_seed"));
		if (properties.getProperty(prefix+"min_clstr_lone")!=null)                this.min_clstr_lone=Integer.parseInt(properties.getProperty(prefix+"min_clstr_lone"));
		if (properties.getProperty(prefix+"min_clstr_weight")!=null)              this.min_clstr_weight=Double.parseDouble(properties.getProperty(prefix+"min_clstr_weight"));
		if (properties.getProperty(prefix+"min_clstr_max")!=null)                 this.min_clstr_max=Double.parseDouble(properties.getProperty(prefix+"min_clstr_max"));


		if (properties.getProperty(prefix+"fill_gaps")!=null)                     this.fill_gaps=Integer.parseInt(properties.getProperty(prefix+"fill_gaps"));
		if (properties.getProperty(prefix+"fill_final")!=null)                    this.fill_final=Integer.parseInt(properties.getProperty(prefix+"fill_final"));
		if (properties.getProperty(prefix+"min_clstr_block")!=null)               this.min_clstr_block=Integer.parseInt(properties.getProperty(prefix+"min_clstr_block"));
		if (properties.getProperty(prefix+"bgnd_grow")!=null)                     this.bgnd_grow=Integer.parseInt(properties.getProperty(prefix+"bgnd_grow"));

		if (properties.getProperty(prefix+"ortho_old")!=null)                     this.ortho_old=Boolean.parseBoolean(properties.getProperty(prefix+"ortho_old"));
		if (properties.getProperty(prefix+"ortho_min_hor")!=null)                 this.ortho_min_hor=Double.parseDouble(properties.getProperty(prefix+"ortho_min_hor"));
		if (properties.getProperty(prefix+"ortho_min_vert")!=null)                this.ortho_min_vert=Double.parseDouble(properties.getProperty(prefix+"ortho_min_vert"));
		if (properties.getProperty(prefix+"ortho_asym")!=null)                    this.ortho_asym=Double.parseDouble(properties.getProperty(prefix+"ortho_asym"));
		if (properties.getProperty(prefix+"ortho_over4")!=null)                   this.ortho_over4=Double.parseDouble(properties.getProperty(prefix+"ortho_over4"));
		if (properties.getProperty(prefix+"ortho_sustain")!=null)                 this.ortho_sustain=Double.parseDouble(properties.getProperty(prefix+"ortho_sustain"));
		if (properties.getProperty(prefix+"ortho_run")!=null)                     this.ortho_run=Integer.parseInt(properties.getProperty(prefix+"ortho_run"));
		if (properties.getProperty(prefix+"ortho_minmax")!=null)                  this.ortho_minmax=Double.parseDouble(properties.getProperty(prefix+"ortho_minmax"));
		if (properties.getProperty(prefix+"ortho_bridge")!=null)                  this.ortho_bridge=Integer.parseInt(properties.getProperty(prefix+"ortho_bridge"));
		if (properties.getProperty(prefix+"ortho_rms")!=null)                     this.ortho_rms=Double.parseDouble(properties.getProperty(prefix+"ortho_rms"));
		if (properties.getProperty(prefix+"ortho_half_length")!=null)             this.ortho_half_length=Integer.parseInt(properties.getProperty(prefix+"ortho_half_length"));
		if (properties.getProperty(prefix+"ortho_mix")!=null)                     this.ortho_mix=Double.parseDouble(properties.getProperty(prefix+"ortho_mix"));

		if (properties.getProperty(prefix+"or_hor")!=null)                        this.or_hor=Boolean.parseBoolean(properties.getProperty(prefix+"or_hor"));
		if (properties.getProperty(prefix+"or_vert")!=null)                       this.or_vert=Boolean.parseBoolean(properties.getProperty(prefix+"or_vert"));
		if (properties.getProperty(prefix+"or_sigma")!=null)                      this.or_sigma=Double.parseDouble(properties.getProperty(prefix+"or_sigma"));
		if (properties.getProperty(prefix+"or_sharp")!=null)                      this.or_sharp=Double.parseDouble(properties.getProperty(prefix+"or_sharp"));
		if (properties.getProperty(prefix+"or_scale")!=null)                      this.or_scale=Double.parseDouble(properties.getProperty(prefix+"or_scale"));
		if (properties.getProperty(prefix+"or_offset")!=null)                     this.or_offset=Double.parseDouble(properties.getProperty(prefix+"or_offset"));
		if (properties.getProperty(prefix+"or_asym")!=null)                       this.or_asym=Double.parseDouble(properties.getProperty(prefix+"or_asym"));
		if (properties.getProperty(prefix+"or_threshold")!=null)                  this.or_threshold=Double.parseDouble(properties.getProperty(prefix+"or_threshold"));
		if (properties.getProperty(prefix+"or_absHor")!=null)                     this.or_absHor=Double.parseDouble(properties.getProperty(prefix+"or_absHor"));
		if (properties.getProperty(prefix+"or_absVert")!=null)                    this.or_absVert=Double.parseDouble(properties.getProperty(prefix+"or_absVert"));
		if (properties.getProperty(prefix+"or_maxDisp")!=null)                    this.or_maxDisp=Double.parseDouble(properties.getProperty(prefix+"or_maxDisp"));

		if (properties.getProperty(prefix+"poles_fix")!=null)                     this.poles_fix=Boolean.parseBoolean(properties.getProperty(prefix+"poles_fix"));
		if (properties.getProperty(prefix+"poles_len")!=null)                     this.poles_len=Integer.parseInt(properties.getProperty(prefix+"poles_len"));
		if (properties.getProperty(prefix+"poles_ratio")!=null)                   this.poles_ratio=Double.parseDouble(properties.getProperty(prefix+"poles_ratio"));
		if (properties.getProperty(prefix+"poles_min_strength")!=null)            this.poles_min_strength=Double.parseDouble(properties.getProperty(prefix+"poles_min_strength"));
		if (properties.getProperty(prefix+"poles_force_disp")!=null)              this.poles_force_disp=Boolean.parseBoolean(properties.getProperty(prefix+"poles_force_disp"));

		if (properties.getProperty(prefix+"max_clusters")!=null)                  this.max_clusters=Integer.parseInt(properties.getProperty(prefix+"max_clusters"));
		if (properties.getProperty(prefix+"remove_scans")!=null)                  this.remove_scans=Boolean.parseBoolean(properties.getProperty(prefix+"remove_scans"));
		if (properties.getProperty(prefix+"output_x3d")!=null)                    this.output_x3d=Boolean.parseBoolean(properties.getProperty(prefix+"output_x3d"));
		if (properties.getProperty(prefix+"output_obj")!=null)                    this.output_obj=Boolean.parseBoolean(properties.getProperty(prefix+"output_obj"));
		if (properties.getProperty(prefix+"correct_distortions")!=null)           this.correct_distortions=Boolean.parseBoolean(properties.getProperty(prefix+"correct_distortions"));
		if (properties.getProperty(prefix+"show_triangles")!=null)                this.show_triangles=Boolean.parseBoolean(properties.getProperty(prefix+"show_triangles"));
		if (properties.getProperty(prefix+"avg_cluster_disp")!=null)              this.avg_cluster_disp=Boolean.parseBoolean(properties.getProperty(prefix+"avg_cluster_disp"));
		if (properties.getProperty(prefix+"maxDispTriangle")!=null)               this.maxDispTriangle=Double.parseDouble(properties.getProperty(prefix+"maxDispTriangle"));
		if (properties.getProperty(prefix+"infinityDistance")!=null)              this.infinityDistance=Double.parseDouble(properties.getProperty(prefix+"infinityDistance"));
		if (properties.getProperty(prefix+"min_bgnd_tiles")!=null)                this.min_bgnd_tiles=Integer.parseInt(properties.getProperty(prefix+"min_bgnd_tiles"));
		if (properties.getProperty(prefix+"shUseFlaps")!=null)                    this.shUseFlaps=Boolean.parseBoolean(properties.getProperty(prefix+"shUseFlaps"));
		if (properties.getProperty(prefix+"shAggrFade")!=null)                    this.shAggrFade=Boolean.parseBoolean(properties.getProperty(prefix+"shAggrFade"));
		if (properties.getProperty(prefix+"shMinArea")!=null)                     this.shMinArea=Integer.parseInt(properties.getProperty(prefix+"shMinArea"));
		if (properties.getProperty(prefix+"shMinStrength")!=null)                 this.shMinStrength=Double.parseDouble(properties.getProperty(prefix+"shMinStrength"));
		if (properties.getProperty(prefix+"tiRigidVertical")!=null)               this.tiRigidVertical=Double.parseDouble(properties.getProperty(prefix+"tiRigidVertical"));
		if (properties.getProperty(prefix+"tiRigidHorizontal")!=null)             this.tiRigidHorizontal=Double.parseDouble(properties.getProperty(prefix+"tiRigidHorizontal"));
		if (properties.getProperty(prefix+"tiRigidDiagonal")!=null)               this.tiRigidDiagonal=Double.parseDouble(properties.getProperty(prefix+"tiRigidDiagonal"));
		if (properties.getProperty(prefix+"tiStrengthOffset")!=null)              this.tiStrengthOffset=Double.parseDouble(properties.getProperty(prefix+"tiStrengthOffset"));
		if (properties.getProperty(prefix+"tiDispScale")!=null)                   this.tiDispScale=Double.parseDouble(properties.getProperty(prefix+"tiDispScale"));
		if (properties.getProperty(prefix+"tiDispPow")!=null)                     this.tiDispPow=Double.parseDouble(properties.getProperty(prefix+"tiDispPow"));
		if (properties.getProperty(prefix+"tiDispPull")!=null)                    this.tiDispPull=Double.parseDouble(properties.getProperty(prefix+"tiDispPull"));
		if (properties.getProperty(prefix+"tiDispPullPreFinal")!=null)            this.tiDispPullPreFinal=Double.parseDouble(properties.getProperty(prefix+"tiDispPullPreFinal"));
		if (properties.getProperty(prefix+"tiDispPullFinal")!=null)               this.tiDispPullFinal=Double.parseDouble(properties.getProperty(prefix+"tiDispPullFinal"));
		if (properties.getProperty(prefix+"tiBreakNorm")!=null)                   this.tiBreakNorm=Double.parseDouble(properties.getProperty(prefix+"tiBreakNorm"));
		if (properties.getProperty(prefix+"tiBreak3")!=null)                      this.tiBreak3=Double.parseDouble(properties.getProperty(prefix+"tiBreak3"));
		if (properties.getProperty(prefix+"tiBreak31")!=null)                     this.tiBreak31=Double.parseDouble(properties.getProperty(prefix+"tiBreak31"));
		if (properties.getProperty(prefix+"tiBreak21")!=null)                     this.tiBreak21=Double.parseDouble(properties.getProperty(prefix+"tiBreak21"));
		if (properties.getProperty(prefix+"tiBreakFar")!=null)                    this.tiBreakFar=Double.parseDouble(properties.getProperty(prefix+"tiBreakFar"));
		if (properties.getProperty(prefix+"tiBreakNear")!=null)                   this.tiBreakNear=Double.parseDouble(properties.getProperty(prefix+"tiBreakNear"));
		if (properties.getProperty(prefix+"tiBreakMode")!=null)                   this.tiBreakMode=Integer.parseInt(properties.getProperty(prefix+"tiBreakMode"));
		if (properties.getProperty(prefix+"tiBreakSame")!=null)                   this.tiBreakSame=Double.parseDouble(properties.getProperty(prefix+"tiBreakSame"));
		if (properties.getProperty(prefix+"tiBreakTurn")!=null)                   this.tiBreakTurn=Double.parseDouble(properties.getProperty(prefix+"tiBreakTurn"));

		if (properties.getProperty(prefix+"tiHealPreLast")!=null)                 this.tiHealPreLast=Double.parseDouble(properties.getProperty(prefix+"tiHealPreLast"));
		if (properties.getProperty(prefix+"tiHealLast")!=null)                    this.tiHealLast=Double.parseDouble(properties.getProperty(prefix+"tiHealLast"));
		if (properties.getProperty(prefix+"tiHealSame")!=null)                    this.tiHealSame=Integer.parseInt(properties.getProperty(prefix+"tiHealSame"));

		if (properties.getProperty(prefix+"tiIterations")!=null)                  this.tiIterations=Integer.parseInt(properties.getProperty(prefix+"tiIterations"));
		if (properties.getProperty(prefix+"tiPrecision")!=null)                   this.tiPrecision=Integer.parseInt(properties.getProperty(prefix+"tiPrecision"));
		if (properties.getProperty(prefix+"tiNumCycles")!=null)                   this.tiNumCycles=Integer.parseInt(properties.getProperty(prefix+"tiNumCycles"));

		if (properties.getProperty(prefix+"stUseRefine")!=null)                   this.stUseRefine=Boolean.parseBoolean(properties.getProperty(prefix+"stUseRefine"));
		if (properties.getProperty(prefix+"stUsePass2")!=null)                    this.stUsePass2=Boolean.parseBoolean(properties.getProperty(prefix+"stUsePass2"));
		if (properties.getProperty(prefix+"stUseRender")!=null)                   this.stUseRender=Boolean.parseBoolean(properties.getProperty(prefix+"stUseRender"));

		if (properties.getProperty(prefix+"stShow")!=null)                        this.stShow=Boolean.parseBoolean(properties.getProperty(prefix+"stShow"));
		if (properties.getProperty(prefix+"stSize")!=null)                        this.stSize=Integer.parseInt(properties.getProperty(prefix+"stSize"));
		if (properties.getProperty(prefix+"stStepFar")!=null)                     this.stStepFar=Double.parseDouble(properties.getProperty(prefix+"stStepFar"));
		if (properties.getProperty(prefix+"stStepNear")!=null)                    this.stStepNear=Double.parseDouble(properties.getProperty(prefix+"stStepNear"));
		if (properties.getProperty(prefix+"stStepThreshold")!=null)               this.stStepThreshold=Double.parseDouble(properties.getProperty(prefix+"stStepThreshold"));
		if (properties.getProperty(prefix+"stMinDisparity")!=null)                this.stMinDisparity=Double.parseDouble(properties.getProperty(prefix+"stMinDisparity"));
		//  			if (properties.getProperty(prefix+"stMaxDisparity")!=null)                this.stMaxDisparity=Double.parseDouble(properties.getProperty(prefix+"stMaxDisparity"));

		if (properties.getProperty(prefix+"stSigma")!=null)                       this.stSigma=Double.parseDouble(properties.getProperty(prefix+"stSigma"));
		if (properties.getProperty(prefix+"stMinBgDisparity")!=null)              this.stMinBgDisparity=Double.parseDouble(properties.getProperty(prefix+"stMinBgDisparity"));
		if (properties.getProperty(prefix+"stMinBgFract")!=null)                  this.stMinBgFract=Double.parseDouble(properties.getProperty(prefix+"stMinBgFract"));
		if (properties.getProperty(prefix+"stUseDisp")!=null)                     this.stUseDisp=Double.parseDouble(properties.getProperty(prefix+"stUseDisp"));
		if (properties.getProperty(prefix+"stStrengthScale")!=null)               this.stStrengthScale=Double.parseDouble(properties.getProperty(prefix+"stStrengthScale"));

		if (properties.getProperty(prefix+"stSmplMode")!=null)                    this.stSmplMode=Boolean.parseBoolean(properties.getProperty(prefix+"stSmplMode"));


		// next kept for compatibility with old configs
		if (properties.getProperty(prefix+"stFloor")!=null)                       this.mlfp.strength_floor=Double.parseDouble(properties.getProperty(prefix+"stFloor"));
		if (properties.getProperty(prefix+"stPow")!=null)                         this.mlfp.strength_pow=Double.parseDouble(properties.getProperty(prefix+"stPow"));
		if (properties.getProperty(prefix+"stSmplSide")!=null)                    this.mlfp.smplSide=Integer.parseInt(properties.getProperty(prefix+"stSmplSide"));
		if (properties.getProperty(prefix+"stSmplNum")!=null)                     this.mlfp.smplNum=Integer.parseInt(properties.getProperty(prefix+"stSmplNum"));
		if (properties.getProperty(prefix+"stSmplRms")!=null)                     this.mlfp.smplRms=Double.parseDouble(properties.getProperty(prefix+"stSmplRms"));
		if (properties.getProperty(prefix+"stSmplWnd")!=null)                     this.mlfp.smplWnd=Boolean.parseBoolean(properties.getProperty(prefix+"stSmplWnd"));
		if (properties.getProperty(prefix+"fs_max_abs_tilt")!=null)               this.mlfp.max_abs_tilt=Double.parseDouble(properties.getProperty(prefix+"fs_max_abs_tilt"));
		if (properties.getProperty(prefix+"fs_max_rel_tilt")!=null)               this.mlfp.max_rel_tilt=Double.parseDouble(properties.getProperty(prefix+"fs_max_rel_tilt"));
		if (properties.getProperty(prefix+"fs_damp_tilt")!=null)                  this.mlfp.damp_tilt=Double.parseDouble(properties.getProperty(prefix+"fs_damp_tilt"));
		if (properties.getProperty(prefix+"fs_min_tilt_disp")!=null)              this.mlfp.min_tilt_disp=Double.parseDouble(properties.getProperty(prefix+"fs_min_tilt_disp"));
		if (properties.getProperty(prefix+"fs_transition")!=null)                 this.mlfp.transition=Double.parseDouble(properties.getProperty(prefix+"fs_transition"));
		if (properties.getProperty(prefix+"fs_far_mode")!=null)                   this.mlfp.far_mode=Integer.parseInt(properties.getProperty(prefix+"fs_far_mode"));
		if (properties.getProperty(prefix+"fs_far_power")!=null)                  this.mlfp.far_power=Double.parseDouble(properties.getProperty(prefix+"fs_far_power"));
		// end of next kept for compatibility with old configs


		if (properties.getProperty(prefix+"stGrowSel")!=null)                     this.stGrowSel=Integer.parseInt(properties.getProperty(prefix+"stGrowSel"));
		if (properties.getProperty(prefix+"stMeasSel")!=null)                     this.stMeasSel=Integer.parseInt(properties.getProperty(prefix+"stMeasSel"));
		if (properties.getProperty(prefix+"stSmallDiff")!=null)                   this.stSmallDiff=Double.parseDouble(properties.getProperty(prefix+"stSmallDiff"));
		if (properties.getProperty(prefix+"stHighMix")!=null)                     this.stHighMix=Double.parseDouble(properties.getProperty(prefix+"stHighMix"));

		// old wrong spelling
		if (properties.getProperty(prefix+"outlayerStrength")!=null)              this.outlierStrength=Double.parseDouble(properties.getProperty(prefix+"outlayerStrength"));
		if (properties.getProperty(prefix+"outlayerDiff")!=null)                  this.outlierDiff=Double.parseDouble(properties.getProperty(prefix+"outlayerDiff"));
		if (properties.getProperty(prefix+"outlayerDiffPos")!=null)               this.outlierDiffPos=Double.parseDouble(properties.getProperty(prefix+"outlayerDiffPos"));
		if (properties.getProperty(prefix+"outlayerDiffNeg")!=null)               this.outlierDiffNeg=Double.parseDouble(properties.getProperty(prefix+"outlayerDiffNeg"));


		if (properties.getProperty(prefix+"outlierStrength")!=null)               this.outlierStrength=Double.parseDouble(properties.getProperty(prefix+"outlierStrength"));
		if (properties.getProperty(prefix+"outlierDiff")!=null)                   this.outlierDiff=Double.parseDouble(properties.getProperty(prefix+"outlierDiff"));
		if (properties.getProperty(prefix+"outlierDiffPos")!=null)                this.outlierDiffPos=Double.parseDouble(properties.getProperty(prefix+"outlierDiffPos"));
		if (properties.getProperty(prefix+"outlierDiffNeg")!=null)                this.outlierDiffNeg=Double.parseDouble(properties.getProperty(prefix+"outlierDiffNeg"));

		if (properties.getProperty(prefix+"combine_refine")!=null)                this.combine_refine=Boolean.parseBoolean(properties.getProperty(prefix+"combine_refine"));

		if (properties.getProperty(prefix+"combine_min_strength")!=null)          this.combine_min_strength=Double.parseDouble(properties.getProperty(prefix+"combine_min_strength"));
		if (properties.getProperty(prefix+"combine_min_hor")!=null)               this.combine_min_hor=Double.parseDouble(properties.getProperty(prefix+"combine_min_hor"));
		if (properties.getProperty(prefix+"combine_min_vert")!=null)              this.combine_min_vert=Double.parseDouble(properties.getProperty(prefix+"combine_min_vert"));
		//  			if (properties.getProperty(prefix+"unique_tolerance")!=null)              this.unique_tolerance=Double.parseDouble(properties.getProperty(prefix+"unique_tolerance"));
		if (properties.getProperty(prefix+"grow_sweep")!=null)                    this.grow_sweep=Integer.parseInt(properties.getProperty(prefix+"grow_sweep"));
		if (properties.getProperty(prefix+"grow_disp_max")!=null)                 this.grow_disp_max=Double.parseDouble(properties.getProperty(prefix+"grow_disp_max"));
		if (properties.getProperty(prefix+"grow_disp_trust")!=null)               this.grow_disp_trust=Double.parseDouble(properties.getProperty(prefix+"grow_disp_trust"));
		if (properties.getProperty(prefix+"grow_disp_step")!=null)                this.grow_disp_step=Double.parseDouble(properties.getProperty(prefix+"grow_disp_step"));
		if (properties.getProperty(prefix+"grow_min_diff")!=null)                 this.grow_min_diff=Double.parseDouble(properties.getProperty(prefix+"grow_min_diff"));
		if (properties.getProperty(prefix+"grow_retry_far")!=null)                this.grow_retry_far=Boolean.parseBoolean(properties.getProperty(prefix+"grow_retry_far"));
		if (properties.getProperty(prefix+"grow_pedantic")!=null)                 this.grow_pedantic=Boolean.parseBoolean(properties.getProperty(prefix+"grow_pedantic"));
		if (properties.getProperty(prefix+"grow_retry_inf")!=null)                this.grow_retry_inf=Boolean.parseBoolean(properties.getProperty(prefix+"grow_retry_inf"));

		if (properties.getProperty(prefix+"gr_new_expand")!=null)                 this.gr_new_expand=Boolean.parseBoolean(properties.getProperty(prefix+"gr_new_expand"));
		//  			if (properties.getProperty(prefix+"gr_max_expand")!=null)                 this.gr_max_expand=Integer.parseInt(properties.getProperty(prefix+"gr_max_expand"));
		if (properties.getProperty(prefix+"fds_str_floor")!=null)                 this.fds_str_floor=Double.parseDouble(properties.getProperty(prefix+"fds_str_floor"));
		if (properties.getProperty(prefix+"gr_ovrbg_cmb")!=null)                  this.gr_ovrbg_cmb=Double.parseDouble(properties.getProperty(prefix+"gr_ovrbg_cmb"));
		if (properties.getProperty(prefix+"gr_ovrbg_cmb_hor")!=null)              this.gr_ovrbg_cmb_hor=Double.parseDouble(properties.getProperty(prefix+"gr_ovrbg_cmb_hor"));
		if (properties.getProperty(prefix+"gr_ovrbg_cmb_vert")!=null)             this.gr_ovrbg_cmb_vert=Double.parseDouble(properties.getProperty(prefix+"gr_ovrbg_cmb_vert"));
		if (properties.getProperty(prefix+"gr_ovrbg_filtered")!=null)             this.gr_ovrbg_filtered=Double.parseDouble(properties.getProperty(prefix+"gr_ovrbg_filtered"));
		if (properties.getProperty(prefix+"fds_str_pow")!=null)                   this.fds_str_pow=Double.parseDouble(properties.getProperty(prefix+"fds_str_pow"));
		if (properties.getProperty(prefix+"fds_smpl_side")!=null)                 this.fds_smpl_side=Integer.parseInt(properties.getProperty(prefix+"fds_smpl_side"));
		if (properties.getProperty(prefix+"fds_smpl_num")!=null)                  this.fds_smpl_num=Integer.parseInt(properties.getProperty(prefix+"fds_smpl_num"));
		if (properties.getProperty(prefix+"fds_smpl_rms")!=null)                  this.fds_smpl_rms=Double.parseDouble(properties.getProperty(prefix+"fds_smpl_rms"));
		if (properties.getProperty(prefix+"fds_smpl_rel_rms")!=null)              this.fds_smpl_rel_rms=Double.parseDouble(properties.getProperty(prefix+"fds_smpl_rel_rms"));
		if (properties.getProperty(prefix+"fds_smpl_wnd")!=null)                  this.fds_smpl_wnd=Boolean.parseBoolean(properties.getProperty(prefix+"fds_smpl_wnd"));
		if (properties.getProperty(prefix+"fds_abs_tilt")!=null)                  this.fds_abs_tilt=Double.parseDouble(properties.getProperty(prefix+"fds_abs_tilt"));
		if (properties.getProperty(prefix+"fds_rel_tilt")!=null)                  this.fds_rel_tilt=Double.parseDouble(properties.getProperty(prefix+"fds_rel_tilt"));

		if (properties.getProperty(prefix+"per_filter")!=null)                    this.per_filter=Boolean.parseBoolean(properties.getProperty(prefix+"per_filter"));
		if (properties.getProperty(prefix+"per_trustedCorrelation")!=null)        this.per_trustedCorrelation=Double.parseDouble(properties.getProperty(prefix+"per_trustedCorrelation"));
		if (properties.getProperty(prefix+"per_initial_diff")!=null)              this.per_initial_diff=Double.parseDouble(properties.getProperty(prefix+"per_initial_diff"));
		if (properties.getProperty(prefix+"per_strength_floor")!=null)            this.per_strength_floor=Double.parseDouble(properties.getProperty(prefix+"per_strength_floor"));
		if (properties.getProperty(prefix+"per_strength_max_over")!=null)         this.per_strength_max_over=Double.parseDouble(properties.getProperty(prefix+"per_strength_max_over"));
		if (properties.getProperty(prefix+"per_min_period")!=null)                this.per_min_period=Double.parseDouble(properties.getProperty(prefix+"per_min_period"));
		if (properties.getProperty(prefix+"per_min_num_periods")!=null)           this.per_min_num_periods=Integer.parseInt(properties.getProperty(prefix+"per_min_num_periods"));
		if (properties.getProperty(prefix+"per_disp_tolerance")!=null)            this.per_disp_tolerance=Double.parseDouble(properties.getProperty(prefix+"per_disp_tolerance"));
		if (properties.getProperty(prefix+"per_disp_match")!=null)                this.per_disp_match=Double.parseDouble(properties.getProperty(prefix+"per_disp_match"));
		if (properties.getProperty(prefix+"per_strong_match_inc")!=null)          this.per_strong_match_inc=Double.parseDouble(properties.getProperty(prefix+"per_strong_match_inc"));


		if (properties.getProperty(prefix+"mc_disp8_step")!=null)                 this.mc_disp8_step=Double.parseDouble(properties.getProperty(prefix+"mc_disp8_step"));
		if (properties.getProperty(prefix+"mc_disp8_trust")!=null)                this.mc_disp8_trust=Double.parseDouble(properties.getProperty(prefix+"mc_disp8_trust"));
		if (properties.getProperty(prefix+"mc_strength")!=null)                   this.mc_strength=Double.parseDouble(properties.getProperty(prefix+"mc_strength"));
		if (properties.getProperty(prefix+"mc_unique_tol")!=null)                 this.mc_unique_tol=Double.parseDouble(properties.getProperty(prefix+"mc_unique_tol"));
		if (properties.getProperty(prefix+"mc_trust_fin")!=null)                  this.mc_trust_fin=Double.parseDouble(properties.getProperty(prefix+"mc_trust_fin"));
		if (properties.getProperty(prefix+"mc_trust_sigma")!=null)                this.mc_trust_sigma=Double.parseDouble(properties.getProperty(prefix+"mc_trust_sigma"));
		if (properties.getProperty(prefix+"mc_ortho_weight")!=null)               this.mc_ortho_weight=Double.parseDouble(properties.getProperty(prefix+"mc_ortho_weight"));
		if (properties.getProperty(prefix+"mc_diag_weight")!=null)                this.mc_diag_weight=Double.parseDouble(properties.getProperty(prefix+"mc_diag_weight"));
		if (properties.getProperty(prefix+"mc_gap")!=null)                        this.mc_gap=Double.parseDouble(properties.getProperty(prefix+"mc_gap"));

		if (properties.getProperty(prefix+"mc_weight_var")!=null)                 this.mc_weight_var=Double.parseDouble(properties.getProperty(prefix+"mc_weight_var"));
		if (properties.getProperty(prefix+"mc_weight_Y")!=null)                   this.mc_weight_Y=Double.parseDouble(properties.getProperty(prefix+"mc_weight_Y"));
		if (properties.getProperty(prefix+"mc_weight_RBmG")!=null)                this.mc_weight_RBmG=Double.parseDouble(properties.getProperty(prefix+"mc_weight_RBmG"));

		if (properties.getProperty(prefix+"gr_min_new")!=null)                    this.gr_min_new=Integer.parseInt(properties.getProperty(prefix+"gr_min_new"));
		if (properties.getProperty(prefix+"gr_var_new_sngl")!=null)               this.gr_var_new_sngl=Boolean.parseBoolean(properties.getProperty(prefix+"gr_var_new_sngl"));
		if (properties.getProperty(prefix+"gr_var_new_fg")!=null)                 this.gr_var_new_fg=Boolean.parseBoolean(properties.getProperty(prefix+"gr_var_new_fg"));
		if (properties.getProperty(prefix+"gr_var_all_fg")!=null)                 this.gr_var_all_fg=Boolean.parseBoolean(properties.getProperty(prefix+"gr_var_all_fg"));
		if (properties.getProperty(prefix+"gr_var_new_bg")!=null)                 this.gr_var_new_bg=Boolean.parseBoolean(properties.getProperty(prefix+"gr_var_new_bg"));
		if (properties.getProperty(prefix+"gr_var_all_bg")!=null)                 this.gr_var_all_bg=Boolean.parseBoolean(properties.getProperty(prefix+"gr_var_all_bg"));
		if (properties.getProperty(prefix+"gr_var_next")!=null)                   this.gr_var_next=Boolean.parseBoolean(properties.getProperty(prefix+"gr_var_next"));
		if (properties.getProperty(prefix+"gr_num_steps")!=null)                  this.gr_num_steps=Integer.parseInt(properties.getProperty(prefix+"gr_num_steps"));
		if (properties.getProperty(prefix+"gr_steps_over")!=null)                 this.gr_steps_over=Integer.parseInt(properties.getProperty(prefix+"gr_steps_over"));
		if (properties.getProperty(prefix+"gr_smpl_size")!=null)                  this.gr_smpl_size=Integer.parseInt(properties.getProperty(prefix+"gr_smpl_size"));
		if (properties.getProperty(prefix+"gr_min_pnts")!=null)                   this.gr_min_pnts=Integer.parseInt(properties.getProperty(prefix+"gr_min_pnts"));
		if (properties.getProperty(prefix+"gr_use_wnd")!=null)                    this.gr_use_wnd=Boolean.parseBoolean(properties.getProperty(prefix+"gr_use_wnd"));
		if (properties.getProperty(prefix+"gr_tilt_damp")!=null)                  this.gr_tilt_damp=Double.parseDouble(properties.getProperty(prefix+"gr_tilt_damp"));
		if (properties.getProperty(prefix+"gr_split_rng")!=null)                  this.gr_split_rng=Double.parseDouble(properties.getProperty(prefix+"gr_split_rng"));
		if (properties.getProperty(prefix+"gr_same_rng")!=null)                   this.gr_same_rng=Double.parseDouble(properties.getProperty(prefix+"gr_same_rng"));
		if (properties.getProperty(prefix+"gr_diff_cont")!=null)                  this.gr_diff_cont=Double.parseDouble(properties.getProperty(prefix+"gr_diff_cont"));
		if (properties.getProperty(prefix+"gr_abs_tilt")!=null)                   this.gr_abs_tilt=Double.parseDouble(properties.getProperty(prefix+"gr_abs_tilt"));
		if (properties.getProperty(prefix+"gr_rel_tilt")!=null)                   this.gr_rel_tilt=Double.parseDouble(properties.getProperty(prefix+"gr_rel_tilt"));
		if (properties.getProperty(prefix+"gr_smooth")!=null)                     this.gr_smooth=Integer.parseInt(properties.getProperty(prefix+"gr_smooth"));
		if (properties.getProperty(prefix+"gr_fin_diff")!=null)                   this.gr_fin_diff=Double.parseDouble(properties.getProperty(prefix+"gr_fin_diff"));
		if (properties.getProperty(prefix+"gr_unique_tol")!=null)                 this.gr_unique_tol=Double.parseDouble(properties.getProperty(prefix+"gr_unique_tol"));
		if (properties.getProperty(prefix+"gr_unique_pretol")!=null)              this.gr_unique_pretol=Double.parseDouble(properties.getProperty(prefix+"gr_unique_pretol"));


		if (properties.getProperty(prefix+"ft_mod_strength")!=null)                    this.ft_mod_strength=Boolean.parseBoolean(properties.getProperty(prefix+"ft_mod_strength"));
		if (properties.getProperty(prefix+"ft_clusterize_by_highest")!=null)           this.ft_clusterize_by_highest=Boolean.parseBoolean(properties.getProperty(prefix+"ft_clusterize_by_highest"));
		if (properties.getProperty(prefix+"ft_clust_sigma")!=null)                     this.ft_clust_sigma=Double.parseDouble(properties.getProperty(prefix+"ft_clust_sigma"));
		if (properties.getProperty(prefix+"ft_disp_arange_vert")!=null)                this.ft_disp_arange_vert=Double.parseDouble(properties.getProperty(prefix+"ft_disp_arange_vert"));
		if (properties.getProperty(prefix+"ft_disp_rrange_vert")!=null)                this.ft_disp_rrange_vert=Double.parseDouble(properties.getProperty(prefix+"ft_disp_rrange_vert"));
		if (properties.getProperty(prefix+"ft_disp_arange_hor")!=null)                 this.ft_disp_arange_hor=Double.parseDouble(properties.getProperty(prefix+"ft_disp_arange_hor"));
		if (properties.getProperty(prefix+"ft_disp_rrange_hor")!=null)                 this.ft_disp_rrange_hor=Double.parseDouble(properties.getProperty(prefix+"ft_disp_rrange_hor"));
		if (properties.getProperty(prefix+"ft_tolerance_above_near")!=null)            this.ft_tolerance_above_near=Double.parseDouble(properties.getProperty(prefix+"ft_tolerance_above_near"));
		if (properties.getProperty(prefix+"ft_tolerance_below_near")!=null)            this.ft_tolerance_below_near=Double.parseDouble(properties.getProperty(prefix+"ft_tolerance_below_near"));
		if (properties.getProperty(prefix+"ft_tolerance_above_far")!=null)             this.ft_tolerance_above_far=Double.parseDouble(properties.getProperty(prefix+"ft_tolerance_above_far"));
		if (properties.getProperty(prefix+"ft_tolerance_below_far")!=null)             this.ft_tolerance_below_far=Double.parseDouble(properties.getProperty(prefix+"ft_tolerance_below_far"));
		if (properties.getProperty(prefix+"ft_hor_vert_overlap")!=null)                this.ft_hor_vert_overlap=Integer.parseInt(properties.getProperty(prefix+"ft_hor_vert_overlap"));
		if (properties.getProperty(prefix+"ft_used_companions")!=null)                 this.ft_used_companions=Integer.parseInt(properties.getProperty(prefix+"ft_used_companions"));
		if (properties.getProperty(prefix+"ft_used_true_companions")!=null)            this.ft_used_true_companions=Integer.parseInt(properties.getProperty(prefix+"ft_used_true_companions"));



		if (properties.getProperty(prefix+"plPreferDisparity")!=null)             this.plPreferDisparity=Boolean.parseBoolean(properties.getProperty(prefix+"plPreferDisparity"));
		if (properties.getProperty(prefix+"plDispNorm")!=null)                    this.plDispNorm=Double.parseDouble(properties.getProperty(prefix+"plDispNorm"));
		if (properties.getProperty(prefix+"plFrontoTol")!=null)                   this.plFrontoTol=Double.parseDouble(properties.getProperty(prefix+"plFrontoTol"));
		if (properties.getProperty(prefix+"plFrontoRms")!=null)                   this.plFrontoRms=Double.parseDouble(properties.getProperty(prefix+"plFrontoRms"));
		if (properties.getProperty(prefix+"plFrontoOffs")!=null)                  this.plFrontoOffs=Double.parseDouble(properties.getProperty(prefix+"plFrontoOffs"));
		if (properties.getProperty(prefix+"PlFrontoPow")!=null)                   this.PlFrontoPow=Double.parseDouble(properties.getProperty(prefix+"PlFrontoPow"));

		if (properties.getProperty(prefix+"plBlurBinVert")!=null)                 this.plBlurBinVert=Double.parseDouble(properties.getProperty(prefix+"plBlurBinVert"));
		if (properties.getProperty(prefix+"plBlurBinHor")!=null)                  this.plBlurBinHor=Double.parseDouble(properties.getProperty(prefix+"plBlurBinHor"));
		if (properties.getProperty(prefix+"plMaxDiffVert")!=null)                 this.plMaxDiffVert=Double.parseDouble(properties.getProperty(prefix+"plMaxDiffVert"));
		if (properties.getProperty(prefix+"plMaxDiffHor")!=null)                  this.plMaxDiffHor=Double.parseDouble(properties.getProperty(prefix+"plMaxDiffHor"));
		if (properties.getProperty(prefix+"plInitPasses")!=null)                  this.plInitPasses=Integer.parseInt(properties.getProperty(prefix+"plInitPasses"));

		if (properties.getProperty(prefix+"plMinPoints")!=null)                   this.plMinPoints=Integer.parseInt(properties.getProperty(prefix+"plMinPoints"));
		if (properties.getProperty(prefix+"plTargetEigen")!=null)                 this.plTargetEigen=Double.parseDouble(properties.getProperty(prefix+"plTargetEigen"));
		if (properties.getProperty(prefix+"plFractOutliers")!=null)               this.plFractOutliers=Double.parseDouble(properties.getProperty(prefix+"plFractOutliers"));
		if (properties.getProperty(prefix+"plMaxOutliers")!=null)                 this.plMaxOutliers=Integer.parseInt(properties.getProperty(prefix+"plMaxOutliers"));
		if (properties.getProperty(prefix+"plMinStrength")!=null)                 this.plMinStrength=Double.parseDouble(properties.getProperty(prefix+"plMinStrength"));
		if (properties.getProperty(prefix+"plMaxEigen")!=null)                    this.plMaxEigen=Double.parseDouble(properties.getProperty(prefix+"plMaxEigen"));
		if (properties.getProperty(prefix+"plEigenFloor")!=null)                  this.plEigenFloor=Double.parseDouble(properties.getProperty(prefix+"plEigenFloor"));
		if (properties.getProperty(prefix+"plEigenStick")!=null)                  this.plEigenStick=Double.parseDouble(properties.getProperty(prefix+"plEigenStick"));
		if (properties.getProperty(prefix+"plBadPlate")!=null)                    this.plBadPlate=Double.parseDouble(properties.getProperty(prefix+"plBadPlate"));
		if (properties.getProperty(prefix+"plDbgMerge")!=null)                    this.plDbgMerge=Boolean.parseBoolean(properties.getProperty(prefix+"plDbgMerge"));
		if (properties.getProperty(prefix+"plWorstWorsening")!=null)              this.plWorstWorsening=Double.parseDouble(properties.getProperty(prefix+"plWorstWorsening"));
		if (properties.getProperty(prefix+"plWorstWorsening2")!=null)             this.plWorstWorsening2=Double.parseDouble(properties.getProperty(prefix+"plWorstWorsening2"));
		if (properties.getProperty(prefix+"plWorstEq")!=null)                     this.plWorstEq=Double.parseDouble(properties.getProperty(prefix+"plWorstEq"));
		if (properties.getProperty(prefix+"plWorstEq2")!=null)                    this.plWorstEq2=Double.parseDouble(properties.getProperty(prefix+"plWorstEq2"));
		if (properties.getProperty(prefix+"plOKMergeEigen")!=null)                this.plOKMergeEigen=Double.parseDouble(properties.getProperty(prefix+"plOKMergeEigen"));
		if (properties.getProperty(prefix+"plMaxWorldSin2")!=null)                this.plMaxWorldSin2=Double.parseDouble(properties.getProperty(prefix+"plMaxWorldSin2"));
		if (properties.getProperty(prefix+"pl2dForSin")!=null)                    this.pl2dForSin=Double.parseDouble(properties.getProperty(prefix+"pl2dForSin"));
		if (properties.getProperty(prefix+"plWeakWorsening")!=null)               this.plWeakWorsening=Double.parseDouble(properties.getProperty(prefix+"plWeakWorsening"));
		if (properties.getProperty(prefix+"plMaxOverlap")!=null)                  this.plMaxOverlap=Double.parseDouble(properties.getProperty(prefix+"plMaxOverlap"));

		if (properties.getProperty(prefix+"plWeakWeight")!=null)                  this.plWeakWeight=Double.parseDouble(properties.getProperty(prefix+"plWeakWeight"));
		if (properties.getProperty(prefix+"plWeakEigen")!=null)                   this.plWeakEigen=Double.parseDouble(properties.getProperty(prefix+"plWeakEigen"));
		if (properties.getProperty(prefix+"plWeakWeight2")!=null)                 this.plWeakWeight2=Double.parseDouble(properties.getProperty(prefix+"plWeakWeight2"));
		if (properties.getProperty(prefix+"plWeakEigen2")!=null)                  this.plWeakEigen2=Double.parseDouble(properties.getProperty(prefix+"plWeakEigen2"));
		if (properties.getProperty(prefix+"plSumThick")!=null)                    this.plSumThick=Double.parseDouble(properties.getProperty(prefix+"plSumThick"));
		if (properties.getProperty(prefix+"plNeNeibCost")!=null)                  this.plNeNeibCost=Double.parseDouble(properties.getProperty(prefix+"plNeNeibCost"));
		if (properties.getProperty(prefix+"plNeOwn")!=null)                       this.plNeOwn=Double.parseDouble(properties.getProperty(prefix+"plNeOwn"));

		if (properties.getProperty(prefix+"plExNeibCost")!=null)                  this.plExNeibCost=Double.parseDouble(properties.getProperty(prefix+"plExNeibCost"));
		if (properties.getProperty(prefix+"plExNeibSmooth")!=null)                this.plExNeibSmooth=Double.parseDouble(properties.getProperty(prefix+"plExNeibSmooth"));
		if (properties.getProperty(prefix+"plMergeCostStar")!=null)               this.plMergeCostStar=Double.parseDouble(properties.getProperty(prefix+"plMergeCostStar"));
		if (properties.getProperty(prefix+"plMergeCost")!=null)                   this.plMergeCost=Double.parseDouble(properties.getProperty(prefix+"plMergeCost"));

		if (properties.getProperty(prefix+"plConflMerge")!=null)                  this.plConflMerge=Boolean.parseBoolean(properties.getProperty(prefix+"plConflMerge"));
		if (properties.getProperty(prefix+"plConflRelax")!=null)                  this.plConflRelax=Double.parseDouble(properties.getProperty(prefix+"plConflRelax"));
		if (properties.getProperty(prefix+"plConflSngl")!=null)                   this.plConflSngl=Boolean.parseBoolean(properties.getProperty(prefix+"plConflSngl"));
		if (properties.getProperty(prefix+"plConflSnglPair")!=null)               this.plConflSnglPair=Boolean.parseBoolean(properties.getProperty(prefix+"plConflSnglPair"));

		if (properties.getProperty(prefix+"plWeakFgStrength")!=null)              this.plWeakFgStrength=Double.parseDouble(properties.getProperty(prefix+"plWeakFgStrength"));
		if (properties.getProperty(prefix+"plWeakFgOutliers")!=null)              this.plWeakFgOutliers=Integer.parseInt(properties.getProperty(prefix+"plWeakFgOutliers"));
		if (properties.getProperty(prefix+"plWeakFgRelax")!=null)                 this.plWeakFgRelax=Double.parseDouble(properties.getProperty(prefix+"plWeakFgRelax"));

		if (properties.getProperty(prefix+"plThickWorld")!=null)                  this.plThickWorld=Double.parseDouble(properties.getProperty(prefix+"plThickWorld"));
		if (properties.getProperty(prefix+"plThickWorldConfl")!=null)             this.plThickWorldConfl=Double.parseDouble(properties.getProperty(prefix+"plThickWorldConfl"));
		if (properties.getProperty(prefix+"plRelaxComplete")!=null)               this.plRelaxComplete=Double.parseDouble(properties.getProperty(prefix+"plRelaxComplete"));
		if (properties.getProperty(prefix+"plRelaxComplete2")!=null)              this.plRelaxComplete2=Double.parseDouble(properties.getProperty(prefix+"plRelaxComplete2"));

		if (properties.getProperty(prefix+"plMaxZRatio")!=null)                   this.plMaxZRatio=Double.parseDouble(properties.getProperty(prefix+"plMaxZRatio"));
		if (properties.getProperty(prefix+"plMaxDisp")!=null)                     this.plMaxDisp=Double.parseDouble(properties.getProperty(prefix+"plMaxDisp"));
		if (properties.getProperty(prefix+"plCutTail")!=null)                     this.plCutTail=Double.parseDouble(properties.getProperty(prefix+"plCutTail"));
		if (properties.getProperty(prefix+"plMinTail")!=null)                     this.plMinTail=Double.parseDouble(properties.getProperty(prefix+"plMinTail"));

		if (properties.getProperty(prefix+"plDiscrEn")!=null)                     this.plDiscrEn=Boolean.parseBoolean(properties.getProperty(prefix+"plDiscrEn"));
		if (properties.getProperty(prefix+"plDiscrTolerance")!=null)              this.plDiscrTolerance=Double.parseDouble(properties.getProperty(prefix+"plDiscrTolerance"));
		if (properties.getProperty(prefix+"plDiscrDispRange")!=null)              this.plDiscrDispRange=Double.parseDouble(properties.getProperty(prefix+"plDiscrDispRange"));
		if (properties.getProperty(prefix+"plDiscrSteps")!=null)                  this.plDiscrSteps=Integer.parseInt(properties.getProperty(prefix+"plDiscrSteps"));
		//  			if (properties.getProperty(prefix+"plDiscrVariants")!=null)               this.plDiscrVariants=Integer.parseInt(properties.getProperty(prefix+"plDiscrVariants"));
		if (properties.getProperty(prefix+"plDiscrMode")!=null)                   this.plDiscrMode=Integer.parseInt(properties.getProperty(prefix+"plDiscrMode"));
		if (properties.getProperty(prefix+"plDiscrVarFloor")!=null)               this.plDiscrVarFloor=Double.parseDouble(properties.getProperty(prefix+"plDiscrVarFloor"));
		if (properties.getProperty(prefix+"plDiscrSigma")!=null)                  this.plDiscrSigma=Double.parseDouble(properties.getProperty(prefix+"plDiscrSigma"));
		if (properties.getProperty(prefix+"plDiscrBlur")!=null)                   this.plDiscrBlur=Double.parseDouble(properties.getProperty(prefix+"plDiscrBlur"));
		if (properties.getProperty(prefix+"plDiscrExclusivity")!=null)            this.plDiscrExclusivity=Double.parseDouble(properties.getProperty(prefix+"plDiscrExclusivity"));
		if (properties.getProperty(prefix+"plDiscrExclus2")!=null)                this.plDiscrExclus2=Double.parseDouble(properties.getProperty(prefix+"plDiscrExclus2"));
		if (properties.getProperty(prefix+"plDiscrStrict")!=null)                 this.plDiscrStrict=Boolean.parseBoolean(properties.getProperty(prefix+"plDiscrStrict"));
		if (properties.getProperty(prefix+"plDiscrCorrMax")!=null)                this.plDiscrCorrMax=Double.parseDouble(properties.getProperty(prefix+"plDiscrCorrMax"));
		if (properties.getProperty(prefix+"plDiscrCorrMerge")!=null)              this.plDiscrCorrMerge=Double.parseDouble(properties.getProperty(prefix+"plDiscrCorrMerge"));
		if (properties.getProperty(prefix+"plDiscrSteal")!=null)                  this.plDiscrSteal=Integer.parseInt(properties.getProperty(prefix+"plDiscrSteal"));
		if (properties.getProperty(prefix+"plDiscrGrown")!=null)                  this.plDiscrGrown=Integer.parseInt(properties.getProperty(prefix+"plDiscrGrown"));
		if (properties.getProperty(prefix+"plDiscrXMedian")!=null)                this.plDiscrXMedian=Double.parseDouble(properties.getProperty(prefix+"plDiscrXMedian"));

		if (properties.getProperty(prefix+"plCostDist")!=null)                    this.plCostDist=Double.parseDouble(properties.getProperty(prefix+"plCostDist"));
		if (properties.getProperty(prefix+"plCostKrq")!=null)                     this.plCostKrq=Double.parseDouble(properties.getProperty(prefix+"plCostKrq"));
		if (properties.getProperty(prefix+"plCostKrqEq")!=null)                   this.plCostKrqEq=Double.parseDouble(properties.getProperty(prefix+"plCostKrqEq"));
		if (properties.getProperty(prefix+"plCostWrq")!=null)                     this.plCostWrq=Double.parseDouble(properties.getProperty(prefix+"plCostWrq"));
		if (properties.getProperty(prefix+"plCostWrqEq")!=null)                   this.plCostWrqEq=Double.parseDouble(properties.getProperty(prefix+"plCostWrqEq"));
		if (properties.getProperty(prefix+"plCostSin2")!=null)                    this.plCostSin2=Double.parseDouble(properties.getProperty(prefix+"plCostSin2"));
		if (properties.getProperty(prefix+"plCostRdist2")!=null)                  this.plCostRdist2=Double.parseDouble(properties.getProperty(prefix+"plCostRdist2"));

		if (properties.getProperty(prefix+"plConflDualTri")!=null)                this.plConflDualTri=Boolean.parseBoolean(properties.getProperty(prefix+"plConflDualTri"));
		if (properties.getProperty(prefix+"plConflMulti")!=null)                  this.plConflMulti=Boolean.parseBoolean(properties.getProperty(prefix+"plConflMulti"));
		if (properties.getProperty(prefix+"plConflDiag")!=null)                   this.plConflDiag=Boolean.parseBoolean(properties.getProperty(prefix+"plConflDiag"));
		if (properties.getProperty(prefix+"plConflStar")!=null)                   this.plConflStar=Boolean.parseBoolean(properties.getProperty(prefix+"plConflStar"));
		if (properties.getProperty(prefix+"plStarSteps")!=null)                   this.plStarSteps=Integer.parseInt(properties.getProperty(prefix+"plStarSteps"));
		if (properties.getProperty(prefix+"plStarOrtho")!=null)                   this.plStarOrtho=Double.parseDouble(properties.getProperty(prefix+"plStarOrtho"));
		if (properties.getProperty(prefix+"plStarDiag")!=null)                    this.plStarDiag=Double.parseDouble(properties.getProperty(prefix+"plStarDiag"));
		if (properties.getProperty(prefix+"plStarPwr")!=null)                     this.plStarPwr=Double.parseDouble(properties.getProperty(prefix+"plStarPwr"));
		if (properties.getProperty(prefix+"plStarWeightPwr")!=null)               this.plStarWeightPwr=Double.parseDouble(properties.getProperty(prefix+"plStarWeightPwr"));
		if (properties.getProperty(prefix+"plWeightToDens")!=null)                this.plWeightToDens=Double.parseDouble(properties.getProperty(prefix+"plWeightToDens"));
		if (properties.getProperty(prefix+"plStarValPwr")!=null)                  this.plStarValPwr=Double.parseDouble(properties.getProperty(prefix+"plStarValPwr"));
		if (properties.getProperty(prefix+"plDblTriLoss")!=null)                  this.plDblTriLoss=Double.parseDouble(properties.getProperty(prefix+"plDblTriLoss"));
		if (properties.getProperty(prefix+"plNewConfl")!=null)                    this.plNewConfl=Boolean.parseBoolean(properties.getProperty(prefix+"plNewConfl"));
		if (properties.getProperty(prefix+"plMaxChanges")!=null)                  this.plMaxChanges=Integer.parseInt(properties.getProperty(prefix+"plMaxChanges"));

		if (properties.getProperty(prefix+"plMutualOnly")!=null)                  this.plMutualOnly=Boolean.parseBoolean(properties.getProperty(prefix+"plMutualOnly"));
		if (properties.getProperty(prefix+"plFillSquares")!=null)                 this.plFillSquares=Boolean.parseBoolean(properties.getProperty(prefix+"plFillSquares"));
		if (properties.getProperty(prefix+"plCutCorners")!=null)                  this.plCutCorners=Boolean.parseBoolean(properties.getProperty(prefix+"plCutCorners"));
		if (properties.getProperty(prefix+"plHypotenuse")!=null)                  this.plHypotenuse=Boolean.parseBoolean(properties.getProperty(prefix+"plHypotenuse"));

		if (properties.getProperty(prefix+"plPull")!=null)                        this.plPull=Double.parseDouble(properties.getProperty(prefix+"plPull"));
		if (properties.getProperty(prefix+"plNormPow")!=null)                     this.plNormPow=Double.parseDouble(properties.getProperty(prefix+"plNormPow"));
		if (properties.getProperty(prefix+"plIterations")!=null)                  this.plIterations=Integer.parseInt(properties.getProperty(prefix+"plIterations"));
		if (properties.getProperty(prefix+"plStopBad")!=null)                     this.plStopBad=Boolean.parseBoolean(properties.getProperty(prefix+"plStopBad"));
		if (properties.getProperty(prefix+"plPrecision")!=null)                   this.plPrecision=Integer.parseInt(properties.getProperty(prefix+"plPrecision"));

		if (properties.getProperty(prefix+"plSplitPull")!=null)                   this.plSplitPull=Double.parseDouble(properties.getProperty(prefix+"plSplitPull"));
		if (properties.getProperty(prefix+"plSplitMinNeib")!=null)                this.plSplitMinNeib=Integer.parseInt(properties.getProperty(prefix+"plSplitMinNeib"));
		if (properties.getProperty(prefix+"plSplitMinWeight")!=null)              this.plSplitMinWeight=Double.parseDouble(properties.getProperty(prefix+"plSplitMinWeight"));
		if (properties.getProperty(prefix+"plSplitMinQuality")!=null)             this.plSplitMinQuality=Double.parseDouble(properties.getProperty(prefix+"plSplitMinQuality"));
		if (properties.getProperty(prefix+"plSplitApply")!=null)                  this.plSplitApply=Boolean.parseBoolean(properties.getProperty(prefix+"plSplitApply"));
		if (properties.getProperty(prefix+"plNonExclusive")!=null)                this.plNonExclusive=Boolean.parseBoolean(properties.getProperty(prefix+"plNonExclusive"));
		if (properties.getProperty(prefix+"plUseOtherPlanes")!=null)            this.plUseOtherPlanes=Boolean.parseBoolean(properties.getProperty(prefix+"plUseOtherPlanes"));
		if (properties.getProperty(prefix+"plAllowParallel")!=null)             this.plAllowParallel=Boolean.parseBoolean(properties.getProperty(prefix+"plAllowParallel"));
		if (properties.getProperty(prefix+"plMaxDiff")!=null)                   this.plMaxDiff=Double.parseDouble(properties.getProperty(prefix+"plMaxDiff"));
		if (properties.getProperty(prefix+"plOtherDiff")!=null)                 this.plOtherDiff=Double.parseDouble(properties.getProperty(prefix+"plOtherDiff"));
		if (properties.getProperty(prefix+"plSplitXY")!=null)                   this.plSplitXY=Boolean.parseBoolean(properties.getProperty(prefix+"plSplitXY"));
		if (properties.getProperty(prefix+"plSplitXYTolerance")!=null)          this.plSplitXYTolerance=Double.parseDouble(properties.getProperty(prefix+"plSplitXYTolerance"));

		if (properties.getProperty(prefix+"plFuse")!=null)                      this.plFuse=Boolean.parseBoolean(properties.getProperty(prefix+"plFuse"));
		if (properties.getProperty(prefix+"plKeepOrphans")!=null)               this.plKeepOrphans=Boolean.parseBoolean(properties.getProperty(prefix+"plKeepOrphans"));
		if (properties.getProperty(prefix+"plMinOrphan")!=null)                 this.plMinOrphan=Double.parseDouble(properties.getProperty(prefix+"plMinOrphan"));

		if (properties.getProperty(prefix+"plSnapDispAny")!=null)               this.plSnapDispAny=Double.parseDouble(properties.getProperty(prefix+"plSnapDispAny"));
		if (properties.getProperty(prefix+"plSnapStrengthAny")!=null)           this.plSnapStrengthAny=Double.parseDouble(properties.getProperty(prefix+"plSnapStrengthAny"));
		if (properties.getProperty(prefix+"plSnapNegAny")!=null)                this.plSnapNegAny=Double.parseDouble(properties.getProperty(prefix+"plSnapNegAny"));
		if (properties.getProperty(prefix+"plSnapDispMax")!=null)               this.plSnapDispMax=Double.parseDouble(properties.getProperty(prefix+"plSnapDispMax"));
		if (properties.getProperty(prefix+"plSnapDispWeight")!=null)            this.plSnapDispWeight=Double.parseDouble(properties.getProperty(prefix+"plSnapDispWeight"));
		if (properties.getProperty(prefix+"plSnapZeroMode")!=null)              this.plPrecision=Integer.parseInt(properties.getProperty(prefix+"plSnapZeroMode"));

		if (properties.getProperty(prefix+"msUseSel")!=null)                    this.msUseSel=Boolean.parseBoolean(properties.getProperty(prefix+"msUseSel"));
		if (properties.getProperty(prefix+"msDivideByArea")!=null)              this.msDivideByArea=Boolean.parseBoolean(properties.getProperty(prefix+"msDivideByArea"));
		if (properties.getProperty(prefix+"msScaleProj")!=null)                 this.msScaleProj=Double.parseDouble(properties.getProperty(prefix+"msScaleProj"));
		if (properties.getProperty(prefix+"msFractUni")!=null)                  this.msFractUni=Double.parseDouble(properties.getProperty(prefix+"msFractUni"));


		if (properties.getProperty(prefix+"tsNoEdge")!=null)                    this.tsNoEdge=Boolean.parseBoolean(properties.getProperty(prefix+"tsNoEdge"));
		if (properties.getProperty(prefix+"tsUseCenter")!=null)                 this.tsUseCenter=Boolean.parseBoolean(properties.getProperty(prefix+"tsUseCenter"));
		if (properties.getProperty(prefix+"tsMaxDiff")!=null)                   this.tsMaxDiff=Double.parseDouble(properties.getProperty(prefix+"tsMaxDiff"));
		if (properties.getProperty(prefix+"tsMinDiffOther")!=null)              this.tsMinDiffOther=Double.parseDouble(properties.getProperty(prefix+"tsMinDiffOther"));
		if (properties.getProperty(prefix+"tsMinStrength")!=null)               this.tsMinStrength=Double.parseDouble(properties.getProperty(prefix+"tsMinStrength"));
		if (properties.getProperty(prefix+"tsMaxStrength")!=null)               this.tsMaxStrength=Double.parseDouble(properties.getProperty(prefix+"tsMaxStrength"));
		if (properties.getProperty(prefix+"tsMinSurface")!=null)                this.tsMinSurface=Double.parseDouble(properties.getProperty(prefix+"tsMinSurface"));
		if (properties.getProperty(prefix+"tsMoveDirs")!=null)                  this.tsMoveDirs=Integer.parseInt(properties.getProperty(prefix+"tsMoveDirs"));
		if (properties.getProperty(prefix+"tsSurfStrPow")!=null)                this.tsSurfStrPow=Double.parseDouble(properties.getProperty(prefix+"tsSurfStrPow"));
		if (properties.getProperty(prefix+"tsAddStrength")!=null)               this.tsAddStrength=Double.parseDouble(properties.getProperty(prefix+"tsAddStrength"));
		if (properties.getProperty(prefix+"tsSigma")!=null)                     this.tsSigma=Double.parseDouble(properties.getProperty(prefix+"tsSigma"));
		if (properties.getProperty(prefix+"tsNSigma")!=null)                    this.tsNSigma=Double.parseDouble(properties.getProperty(prefix+"tsNSigma"));
		if (properties.getProperty(prefix+"tsMinPull")!=null)                   this.tsMinPull=Double.parseDouble(properties.getProperty(prefix+"tsMinPull"));
		if (properties.getProperty(prefix+"tsMinAdvantage")!=null)              this.tsMinAdvantage=Double.parseDouble(properties.getProperty(prefix+"tsMinAdvantage"));

		if (properties.getProperty(prefix+"tsClustSize")!=null)                 this.tsClustSize=Integer.parseInt(properties.getProperty(prefix+"tsClustSize"));
		if (properties.getProperty(prefix+"tsClustWeight")!=null)               this.tsClustWeight=Double.parseDouble(properties.getProperty(prefix+"tsClustWeight"));
		if (properties.getProperty(prefix+"tsMinNeib")!=null)                   this.tsMinNeib=Integer.parseInt(properties.getProperty(prefix+"tsMinNeib"));
		if (properties.getProperty(prefix+"tsMaxSurStrength")!=null)            this.tsMaxSurStrength=Double.parseDouble(properties.getProperty(prefix+"tsMaxSurStrength"));
		if (properties.getProperty(prefix+"tsCountDis")!=null)                  this.tsCountDis=Boolean.parseBoolean(properties.getProperty(prefix+"tsCountDis"));

		if (properties.getProperty(prefix+"tsEnPlaneSeed")!=null)               this.tsEnPlaneSeed=Boolean.parseBoolean(properties.getProperty(prefix+"tsEnPlaneSeed"));
		if (properties.getProperty(prefix+"tsEnOnly")!=null)                    this.tsEnOnly=Boolean.parseBoolean(properties.getProperty(prefix+"tsEnOnly"));
		if (properties.getProperty(prefix+"tsEnGrow")!=null)                    this.tsEnGrow=Boolean.parseBoolean(properties.getProperty(prefix+"tsEnGrow"));
		if (properties.getProperty(prefix+"tsGrowStrength")!=null)              this.tsGrowStrength=Double.parseDouble(properties.getProperty(prefix+"tsGrowStrength"));
		if (properties.getProperty(prefix+"tsGrowStrong")!=null)                this.tsGrowStrong=Boolean.parseBoolean(properties.getProperty(prefix+"tsGrowStrong"));
		if (properties.getProperty(prefix+"tsContStrength")!=null)              this.tsGrowStrength=Double.parseDouble(properties.getProperty(prefix+"tsContStrength"));
		if (properties.getProperty(prefix+"tsContDiff")!=null)                  this.tsContDiff=Double.parseDouble(properties.getProperty(prefix+"tsContDiff"));

		if (properties.getProperty(prefix+"tsEnSingle")!=null)                  this.tsEnSingle=Boolean.parseBoolean(properties.getProperty(prefix+"tsEnSingle"));
		if (properties.getProperty(prefix+"tsEnMulti")!=null)                   this.tsEnMulti=Boolean.parseBoolean(properties.getProperty(prefix+"tsEnMulti"));
		if (properties.getProperty(prefix+"tsRemoveWeak1")!=null)               this.tsRemoveWeak1=Boolean.parseBoolean(properties.getProperty(prefix+"tsRemoveWeak1"));
		if (properties.getProperty(prefix+"tsGrowSurround")!=null)              this.tsGrowSurround=Boolean.parseBoolean(properties.getProperty(prefix+"tsGrowSurround"));
		if (properties.getProperty(prefix+"tsRemoveWeak2")!=null)               this.tsRemoveWeak2=Boolean.parseBoolean(properties.getProperty(prefix+"tsRemoveWeak2"));

		if (properties.getProperty(prefix+"tsLoopMulti")!=null)                 this.tsLoopMulti=Boolean.parseBoolean(properties.getProperty(prefix+"tsLoopMulti"));
		if (properties.getProperty(prefix+"tsShow")!=null)                      this.tsShow=Boolean.parseBoolean(properties.getProperty(prefix+"tsShow"));
		if (properties.getProperty(prefix+"tsNumClust")!=null)                  this.tsNumClust=Integer.parseInt(properties.getProperty(prefix+"tsNumClust"));

		if (properties.getProperty(prefix+"tsConsensMode")!=null)               this.tsConsensMode=Integer.parseInt(properties.getProperty(prefix+"tsConsensMode"));
		if (properties.getProperty(prefix+"tsConsensAgree")!=null)              this.tsConsensAgree=Integer.parseInt(properties.getProperty(prefix+"tsConsensAgree"));

		if (properties.getProperty(prefix+"taMinFgBg")!=null)                   this.taMinFgBg=Double.parseDouble(properties.getProperty(prefix+"taMinFgBg"));
		if (properties.getProperty(prefix+"taMinFgEdge")!=null)                 this.taMinFgEdge=Double.parseDouble(properties.getProperty(prefix+"taMinFgEdge"));
		if (properties.getProperty(prefix+"taMinColSep")!=null)                 this.taMinColSep=Double.parseDouble(properties.getProperty(prefix+"taMinColSep"));
		if (properties.getProperty(prefix+"taMinColDiff")!=null)                this.taMinColDiff=Double.parseDouble(properties.getProperty(prefix+"taMinColDiff"));
		if (properties.getProperty(prefix+"taOutlier")!=null)                   this.taOutlier=Double.parseDouble(properties.getProperty(prefix+"taOutlier"));
		if (properties.getProperty(prefix+"taDiffPwr")!=null)                   this.taDiffPwr=Double.parseDouble(properties.getProperty(prefix+"taDiffPwr"));
		if (properties.getProperty(prefix+"taBestPwr")!=null)                   this.taBestPwr=Double.parseDouble(properties.getProperty(prefix+"taBestPwr"));
		if (properties.getProperty(prefix+"taDiff9Pwr")!=null)                  this.taDiff9Pwr=Double.parseDouble(properties.getProperty(prefix+"taDiff9Pwr"));
		if (properties.getProperty(prefix+"taColSigma")!=null)                  this.taDiff9Pwr=Double.parseDouble(properties.getProperty(prefix+"taColSigma"));
		if (properties.getProperty(prefix+"taColFraction")!=null)               this.taColFraction=Double.parseDouble(properties.getProperty(prefix+"taColFraction"));

		if (properties.getProperty(prefix+"taCostEmpty")!=null)                 this.taCostEmpty=Double.parseDouble(properties.getProperty(prefix+"taCostEmpty"));
		if (properties.getProperty(prefix+"taCostNoLink")!=null)                this.taCostNoLink=Double.parseDouble(properties.getProperty(prefix+"taCostNoLink"));
		if (properties.getProperty(prefix+"taCostSwitch")!=null)                this.taCostSwitch=Double.parseDouble(properties.getProperty(prefix+"taCostSwitch"));
		if (properties.getProperty(prefix+"taCostColor")!=null)                 this.taCostColor=Double.parseDouble(properties.getProperty(prefix+"taCostColor"));
		if (properties.getProperty(prefix+"taCostDiff")!=null)                  this.taCostDiff=Double.parseDouble(properties.getProperty(prefix+"taCostDiff"));
		if (properties.getProperty(prefix+"taCostDiffBest")!=null)              this.taCostDiffBest=Double.parseDouble(properties.getProperty(prefix+"taCostDiffBest"));
		if (properties.getProperty(prefix+"taCostDiff9")!=null)                 this.taCostDiff9=Double.parseDouble(properties.getProperty(prefix+"taCostDiff9"));
		if (properties.getProperty(prefix+"taCostWeakFgnd")!=null)              this.taCostWeakFgnd=Double.parseDouble(properties.getProperty(prefix+"taCostWeakFgnd"));
		if (properties.getProperty(prefix+"taCostFlaps")!=null)                 this.taCostFlaps=Double.parseDouble(properties.getProperty(prefix+"taCostFlaps"));
		if (properties.getProperty(prefix+"taCostMismatch")!=null)              this.taCostMismatch=Double.parseDouble(properties.getProperty(prefix+"taCostMismatch"));

		if (properties.getProperty(prefix+"taEnEmpty")!=null)                   this.taEnEmpty=Boolean.parseBoolean(properties.getProperty(prefix+"taEnEmpty"));
		if (properties.getProperty(prefix+"taEnNoLink")!=null)                  this.taEnNoLink=Boolean.parseBoolean(properties.getProperty(prefix+"taEnNoLink"));
		if (properties.getProperty(prefix+"taEnSwitch")!=null)                  this.taEnSwitch=Boolean.parseBoolean(properties.getProperty(prefix+"taEnSwitch"));
		if (properties.getProperty(prefix+"taEnColor")!=null)                   this.taEnColor=Boolean.parseBoolean(properties.getProperty(prefix+"taEnColor"));
		if (properties.getProperty(prefix+"taEnDiff")!=null)                    this.taEnDiff=Boolean.parseBoolean(properties.getProperty(prefix+"taEnDiff"));
		if (properties.getProperty(prefix+"taEnDiffBest")!=null)                this.taEnDiffBest=Boolean.parseBoolean(properties.getProperty(prefix+"taEnDiffBest"));
		if (properties.getProperty(prefix+"taEnDiff9")!=null)                   this.taEnDiff9=Boolean.parseBoolean(properties.getProperty(prefix+"taEnDiff9"));
		if (properties.getProperty(prefix+"taEnWeakFgnd")!=null)                this.taEnWeakFgnd=Boolean.parseBoolean(properties.getProperty(prefix+"taEnWeakFgnd"));
		if (properties.getProperty(prefix+"taEnFlaps")!=null)                   this.taEnFlaps=Boolean.parseBoolean(properties.getProperty(prefix+"taEnFlaps"));
		if (properties.getProperty(prefix+"taEnMismatch")!=null)                this.taEnMismatch=Boolean.parseBoolean(properties.getProperty(prefix+"taEnMismatch"));

		if (properties.getProperty(prefix+"gpu_corr_scale")!=null)              this.gpu_corr_scale=Double.parseDouble(properties.getProperty(prefix+"gpu_corr_scale"));
		if (properties.getProperty(prefix+"gpu_corr_rad")!=null)                this.gpu_corr_rad=Integer.parseInt(properties.getProperty(prefix+"gpu_corr_rad"));
		if (properties.getProperty(prefix+"gpu_weight_r")!=null)                this.gpu_weight_r=Double.parseDouble(properties.getProperty(prefix+"gpu_weight_r"));
		if (properties.getProperty(prefix+"gpu_weight_b")!=null)                this.gpu_weight_b=Double.parseDouble(properties.getProperty(prefix+"gpu_weight_b"));
		if (properties.getProperty(prefix+"gpu_sigma_r")!=null)                 this.gpu_sigma_r=Double.parseDouble(properties.getProperty(prefix+"gpu_sigma_r"));
		if (properties.getProperty(prefix+"gpu_sigma_b")!=null)                 this.gpu_sigma_b=Double.parseDouble(properties.getProperty(prefix+"gpu_sigma_b"));
		if (properties.getProperty(prefix+"gpu_sigma_g")!=null)                 this.gpu_sigma_g=Double.parseDouble(properties.getProperty(prefix+"gpu_sigma_g"));
		if (properties.getProperty(prefix+"gpu_sigma_m")!=null)                 this.gpu_sigma_m=Double.parseDouble(properties.getProperty(prefix+"gpu_sigma_m"));
		if (properties.getProperty(prefix+"gpu_sigma_rb_corr")!=null)           this.gpu_sigma_rb_corr=Double.parseDouble(properties.getProperty(prefix+"gpu_sigma_rb_corr"));
		if (properties.getProperty(prefix+"gpu_sigma_corr")!=null)              this.gpu_sigma_corr=Double.parseDouble(properties.getProperty(prefix+"gpu_sigma_corr"));
		if (properties.getProperty(prefix+"gpu_sigma_corr_m")!=null)            this.gpu_sigma_corr_m=Double.parseDouble(properties.getProperty(prefix+"gpu_sigma_corr_m"));
		if (properties.getProperty(prefix+"gpu_sigma_log_corr")!=null)          this.gpu_sigma_log_corr=Double.parseDouble(properties.getProperty(prefix+"gpu_sigma_log_corr"));
		if (properties.getProperty(prefix+"gpu_sigma_log_corr_m")!=null)        this.gpu_sigma_log_corr_m=Double.parseDouble(properties.getProperty(prefix+"gpu_sigma_log_corr_m"));
		if (properties.getProperty(prefix+"gpu_fatz")!=null)                    this.gpu_fatz=Double.parseDouble(properties.getProperty(prefix+"gpu_fatz"));
		if (properties.getProperty(prefix+"gpu_fatz_m")!=null)                  this.gpu_fatz_m=Double.parseDouble(properties.getProperty(prefix+"gpu_fatz_m"));

		if (properties.getProperty(prefix+"gpu_woi")!=null)                     this.gpu_woi=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_woi"));
		if (properties.getProperty(prefix+"gpu_woi_tx")!=null)                  this.gpu_woi_tx=Integer.parseInt(properties.getProperty(prefix+"gpu_woi_tx"));
		if (properties.getProperty(prefix+"gpu_woi_ty")!=null)                  this.gpu_woi_ty=Integer.parseInt(properties.getProperty(prefix+"gpu_woi_ty"));
		if (properties.getProperty(prefix+"gpu_woi_twidth")!=null)              this.gpu_woi_twidth=Integer.parseInt(properties.getProperty(prefix+"gpu_woi_twidth"));
		if (properties.getProperty(prefix+"gpu_woi_theight")!=null)             this.gpu_woi_theight=Integer.parseInt(properties.getProperty(prefix+"gpu_woi_theight"));
		if (properties.getProperty(prefix+"gpu_woi_round")!=null)               this.gpu_woi_round=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_woi_round"));
		if (properties.getProperty(prefix+"gpu_save_ports_xy")!=null)           this.gpu_save_ports_xy=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_save_ports_xy"));
		if (properties.getProperty(prefix+"gpu_show_jtextures")!=null)          this.gpu_show_jtextures=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_show_jtextures"));
		if (properties.getProperty(prefix+"gpu_show_extra")!=null)              this.gpu_show_extra=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_show_extra"));
		if (properties.getProperty(prefix+"gpu_show_geometry")!=null)           this.gpu_show_geometry=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_show_geometry"));
		
		if (properties.getProperty(prefix+"gpu_use_main")!=null)                this.gpu_use_main=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_use_main"));
		if (properties.getProperty(prefix+"gpu_use_main_macro")!=null)          this.gpu_use_main_macro=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_use_main_macro"));
		if (properties.getProperty(prefix+"gpu_use_main_adjust")!=null)         this.gpu_use_main_adjust=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_use_main_adjust"));
		if (properties.getProperty(prefix+"gpu_use_aux")!=null)                 this.gpu_use_aux=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_use_aux"));
		if (properties.getProperty(prefix+"gpu_use_aux_macro")!=null)           this.gpu_use_aux_macro=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_use_aux_macro"));
		if (properties.getProperty(prefix+"gpu_use_aux_adjust")!=null)          this.gpu_use_aux_adjust=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_use_aux_adjust"));
		if (properties.getProperty(prefix+"gpu_debug_accum")!=null)             this.gpu_debug_accum=Boolean.parseBoolean(properties.getProperty(prefix+"gpu_debug_accum"));

		if (properties.getProperty(prefix+"debug_initial_discriminate")!=null)       this.debug_initial_discriminate=Boolean.parseBoolean(properties.getProperty(prefix+"debug_initial_discriminate"));
		if (properties.getProperty(prefix+"dbg_migrate")!=null)                      this.dbg_migrate=Boolean.parseBoolean(properties.getProperty(prefix+"dbg_migrate"));

		if (properties.getProperty(prefix+"dbg_early_exit")!=null)                   this.dbg_early_exit=Integer.parseInt(properties.getProperty(prefix+"dbg_early_exit"));
		if (properties.getProperty(prefix+"show_first_bg")!=null)                    this.show_first_bg=Boolean.parseBoolean(properties.getProperty(prefix+"show_first_bg"));

		if (properties.getProperty(prefix+"show_interframe")!=null)                  this.show_interframe=Boolean.parseBoolean(properties.getProperty(prefix+"show_interframe"));
		if (properties.getProperty(prefix+"show_filter_ly")!=null)                   this.show_filter_ly=Boolean.parseBoolean(properties.getProperty(prefix+"show_filter_ly"));
		if (properties.getProperty(prefix+"show_extrinsic")!=null)                   this.show_extrinsic=Boolean.parseBoolean(properties.getProperty(prefix+"show_extrinsic"));
		if (properties.getProperty(prefix+"show_ortho_combine")!=null)               this.show_ortho_combine=Boolean.parseBoolean(properties.getProperty(prefix+"show_ortho_combine"));
		if (properties.getProperty(prefix+"show_refine_supertiles")!=null)           this.show_refine_supertiles=Boolean.parseBoolean(properties.getProperty(prefix+"show_refine_supertiles"));
		if (properties.getProperty(prefix+"show_bgnd_nonbgnd")!=null)                this.show_bgnd_nonbgnd=Boolean.parseBoolean(properties.getProperty(prefix+"show_bgnd_nonbgnd"));
		if (properties.getProperty(prefix+"show_filter_scan")!=null)                 this.show_filter_scan=Boolean.parseBoolean(properties.getProperty(prefix+"show_filter_scan"));
		if (properties.getProperty(prefix+"show_combined")!=null)                    this.show_combined=Boolean.parseBoolean(properties.getProperty(prefix+"show_combined"));
		if (properties.getProperty(prefix+"show_unique")!=null)                      this.show_unique=Boolean.parseBoolean(properties.getProperty(prefix+"show_unique"));
		if (properties.getProperty(prefix+"show_histograms")!=null)                  this.show_histograms=Boolean.parseBoolean(properties.getProperty(prefix+"show_histograms"));
		if (properties.getProperty(prefix+"show_init_refine")!=null)                 this.show_init_refine=Boolean.parseBoolean(properties.getProperty(prefix+"show_init_refine"));
		if (properties.getProperty(prefix+"show_expand")!=null)                      this.show_expand=Boolean.parseBoolean(properties.getProperty(prefix+"show_expand"));
		if (properties.getProperty(prefix+"show_variant")!=null)                     this.show_variant=Boolean.parseBoolean(properties.getProperty(prefix+"show_variant"));
		if (properties.getProperty(prefix+"show_retry_far")!=null)                   this.show_retry_far=Boolean.parseBoolean(properties.getProperty(prefix+"show_retry_far"));
		if (properties.getProperty(prefix+"show_macro")!=null)                       this.show_macro=Boolean.parseBoolean(properties.getProperty(prefix+"show_macro"));
		if (properties.getProperty(prefix+"show_shells")!=null)                      this.show_shells=Boolean.parseBoolean(properties.getProperty(prefix+"show_shells"));
		if (properties.getProperty(prefix+"show_neighbors")!=null)                   this.show_neighbors=Boolean.parseBoolean(properties.getProperty(prefix+"show_neighbors"));
		if (properties.getProperty(prefix+"show_flaps_dirs")!=null)                  this.show_flaps_dirs=Boolean.parseBoolean(properties.getProperty(prefix+"show_flaps_dirs"));
		if (properties.getProperty(prefix+"show_first_clusters")!=null)              this.show_first_clusters=Boolean.parseBoolean(properties.getProperty(prefix+"show_first_clusters"));
		if (properties.getProperty(prefix+"show_planes")!=null)                      this.show_planes=Boolean.parseBoolean(properties.getProperty(prefix+"show_planes"));


		if (properties.getProperty(prefix+"vertical_xyz.x")!=null)               this.vertical_xyz[0]=Double.parseDouble(properties.getProperty(prefix+"vertical_xyz.x"));
		if (properties.getProperty(prefix+"vertical_xyz.y")!=null)               this.vertical_xyz[1]=Double.parseDouble(properties.getProperty(prefix+"vertical_xyz.y"));
		if (properties.getProperty(prefix+"vertical_xyz.z")!=null)               this.vertical_xyz[2]=Double.parseDouble(properties.getProperty(prefix+"vertical_xyz.z"));

		Set<String> ss = properties.stringPropertyNames();
		String full_prefix = prefix+Z_CORR_PREFIX;
		int li = full_prefix.length();
		for (String s:ss){
			if (s.indexOf(full_prefix) == 0){
				z_corr_map.put(s.substring(li), Double.parseDouble(properties.getProperty(s)));
			}
		}
		String full_prefix_infinity_distance = prefix+INFINITY_DISTANCE_PREFIX;
		int lii = full_prefix_infinity_distance.length();
		for (String s:ss){
			if (s.indexOf(full_prefix_infinity_distance) == 0){
				infinity_distace_map.put(s.substring(lii), Double.parseDouble(properties.getProperty(s)));
			}
		}
		img_dtt.getProperties (prefix+"_img_dtt", properties);
		mlfp.getProperties    (prefix+"_mlfp",    properties);
		rig.getProperties     (prefix+"_rig",     properties);
		poles.getProperties   (prefix+"_poles",   properties);
		lwir.getProperties    (prefix+"_lwir",    properties);
		ofp.getProperties     (prefix+"_ofp_",    properties);
		ilp.getProperties     (prefix+"_ilp_",    properties);
		inp.getProperties     (prefix+"_inp_",    properties);
	}

	public boolean showJDialog() {
		//  			GenericDialog gd = new GenericDialog("Set CLT parameters");
		GenericJTabbedDialog gd = new GenericJTabbedDialog("Set CLT parameters",800,900);
		gd.addTab         ("General", "General parameters");
		gd.addNumericField("Nominal (rectilinear) disparity between side of square cameras (pix)",              this.disparity,  3,7,"pix",
				"Used when rendering 4 images");
		gd.addNumericField("Transform size (default 8)",                                                        this.transform_size,            0, 6, "pixels","Should always be 8");
		gd.addNumericField("Lapped transform window type (0- rectangular, 1 - sinus)",                          this.clt_window,                0);
		gd.addNumericField("shift_x",                                                                           this.shift_x,                   4);
		gd.addNumericField("shift_y",                                                                           this.shift_y,                   4);

		gd.addNumericField("Lazy eye cluster size",                                                             this.tileStep,                  0, 6, "tiles",
				"Process tileStep x tileStep cluster of tiles when adjusting lazy eye parameters");
		gd.addNumericField("Consolidate multiple clusterts around given for low-contrast infinity",             this.super_radius,              0, 6, "clusters",
				"e.g. for clouds in tghe sky  0 - none, 1 - 3x3, 2 - 5x5");
		gd.addNumericField("Bit mask - which of 4 transforms to combine after iclt",                            this.iclt_mask,                 0);
		gd.addNumericField("Tile X to extract (0..163)",                                                        this.tileX,                     0);
		gd.addNumericField("Tile Y to extract (0..122)",                                                        this.tileY,                     0);
		gd.addNumericField("dbg_mode: 0 - normal, +1 - no DCT/IDCT, just fold",                                 this.dbg_mode,                  0);
		gd.addNumericField("ishift_x: shift source image by this pixels left",                                  this.ishift_x,                  0);
		gd.addNumericField("ishift_y: shift source image by this pixels down",                                  this.ishift_y,                  0);
		gd.addNumericField("Modify phase correlation to prevent division by very small numbers",                this.fat_zero,                  4);
		gd.addNumericField("Modify phase correlation for monochrome images",                                    this.fat_zero_mono,             4);
		gd.addNumericField("LPF correlarion sigma for Bayer color images (correlation)",                        this.corr_sigma,                4);
		gd.addNumericField("LPF correlarion sigma for monochrome images (correlation)",                         this.corr_sigma_mono,           4);

		gd.addNumericField("LPF correlarion sigma for Bayer color images (textures)",                           this.texture_sigma,             4);
		gd.addNumericField("LPF correlarion sigma for monochrome images (textures)",                            this.texture_sigma_mono,        4);
		
		
		
		gd.addNumericField("Scale all correlation strengths (to compensate correlation sigma) for main camera", this.scale_strength_main,       4);
		gd.addNumericField("Scale all correlation strengths (to compensate correlation sigma) for aux camera",  this.scale_strength_aux,        4);

		gd.addCheckbox    ("Normalize kernels",                                                                 this.norm_kern);
		gd.addCheckbox    ("Equalize green channel gain of the individual cnannels (bug fix for exposure)",           this.gain_equalize);
		gd.addCheckbox    ("Equalize R/G, B/G balance of the individual channels",                              this.colors_equalize);
		gd.addCheckbox    ("Skip saturated when adjusting gains",                                               this.nosat_equalize);
		gd.addNumericField("Saturation level of the most saturated color channel",                              this.sat_level,   4);
		gd.addNumericField("Do not use tiles with higher fraction of (near) saturated tiles",                   this.max_overexposure,   4);

		gd.addNumericField("Red gain in the center of sensor calibration R (instead of vignetting)",            this.novignetting_r,   4);
		gd.addNumericField("Green gain in the center of sensor calibration G (instead of vignetting)",          this.novignetting_g, 4);
		gd.addNumericField("Blue gain in the center of sensor calibration B (instead of vignetting)",           this.novignetting_b,  4);
		gd.addNumericField("Extra red correction to compensate for light temperature",                          this.scale_r,  4);
		gd.addNumericField("Extra green correction to compensate for light temperature",                        this.scale_g,  4);
		gd.addNumericField("Extra blue correction to compensate for light temperature",                         this.scale_b,  4);
		gd.addNumericField("Value (max) in vignetting data to correspond to 1x in the kernel",                  this.vignetting_max,      3);
		gd.addNumericField("Do not try to correct vignetting smaller than this fraction of max",                this.vignetting_range,  3);
		gd.addNumericField("Kernel step in pixels (has 1 kernel margin on each side)",                          this.kernel_step,            0);
		gd.addNumericField("Inverse distance to infinity (misalignment correction)",                            this.z_correction,  6);
		gd.addCheckbox    ("Perform correlation",                                                               this.correlate);
		gd.addCheckbox    ("Run LMA on 2d correlations to extract disparity",                                   this.correlate_lma);
		gd.addNumericField("Bitmask of pairs to combine in the composite (top, bottom, left,righth)",           this.corr_mask,            0);
		gd.addCheckbox    ("Combine correlation with mirrored around disparity direction",                      this.corr_sym);
		gd.addCheckbox    ("Keep all partial correlations (otherwise - only combined one)",                     this.corr_keep);
		gd.addCheckbox    ("Show combined correlations",                                                        this.corr_show);
		gd.addCheckbox    ("Calculate per-pair X/Y variations of measured correlations ",                       this.corr_mismatch);
		gd.addNumericField("Add to pair correlation before multiplying by other pairs (between sum and product)",              this.corr_offset,  6);
		gd.addNumericField("Red to green correlation weight",                                                   this.corr_red,  4);
		gd.addNumericField("Blue to green correlation weight",                                                  this.corr_blue,  4);
		gd.addCheckbox    ("Normalize each correlation tile by rms",                                            this.corr_normalize);
		gd.addNumericField("Minimal correlation value to consider valid",                                       this.min_corr,  6);
		gd.addNumericField("Minimal correlation value to consider valid when normalizing results",              this.min_corr_normalized,  6);
		gd.addNumericField("Sigma for weights of points around global max to find fractional",                  this.max_corr_sigma,  3);
		gd.addNumericField("Maximal distance from int max to consider",                                         this.max_corr_radius,  3);
		gd.addNumericField("Calculated from correlation offset vs. actual one (not yet understood)",            this.corr_magic_scale,  3,6,"", "CM and poly");
		gd.addNumericField("Select all-pair correlation type to use 0 - CM, 1 - poly",                          this.corr_select,  0);

		gd.addTab         ("imageDtt", "Setup extra ImageDtt parameters - eventually all will be set that way");
		this.img_dtt.dialogQuestions(gd);
		gd.addTab         ("Rig", "Parameters for the wide baseline rig with two quad cameras");
		this.rig.dialogQuestions(gd);
		gd.addTab         ("Poles", "Parameters for processing vertical poles (such as street lights)");
		this.poles.dialogQuestions(gd);

		gd.addTab         ("vert/hor", "Enhance detection of horizontal/vertical features (when enh_ortho is enabled for tile");

		gd.addMessage("--- Enhance detection of horizontal/vertical features (when enh_ortho is enabled for tile ---");


		gd.addCheckbox    ("Double pass when masking center of mass to reduce preference for integer values",           this.max_corr_double);
		gd.addNumericField("Correlation mode: 0 - integer max, 1 - center of mass, 2 - polynomial",             this.corr_mode,            0,4,"",
				"Only applies to textures");
		gd.addNumericField("Contrast of dotted border on correlation results",                                  this.corr_border_contrast,  6);

		gd.addTab         ("tileTasks", "tiles tasks (current tile_task_op = "+          this.tile_task_op+")");

		gd.addMessage("--- tiles tasks (current tile_task_op = "+          this.tile_task_op+") ---");
		gd.addCheckbox    ("Enhance ortho lines detection (enh_ortho)",                                              ImageDtt.getOrthoLines(          this.tile_task_op));
		gd.addCheckbox    ("Force disparity for image rendering (false - use found from tile correlation)",          ImageDtt.getForcedDisparity(          this.tile_task_op));
		gd.addNumericField("Bitmask of used images (1 - top left, 2 - top right, 4 - bottom left, 8 bottom right)",  ImageDtt.getImgMask(          this.tile_task_op),            0);
		gd.addNumericField("Bitmask of used pairs  (1 - top, 2 - bottom, 4 - left, 8 - right)",                      ImageDtt.getPairMask(          this.tile_task_op),            0);
		gd.addNumericField("Tile operations window left (in 8x8 tiles)",                                        this.tile_task_wl,            0);
		gd.addNumericField("Tile operations window top",                                                        this.tile_task_wt,            0);
		gd.addNumericField("Tile operations window width",                                                      this.tile_task_ww,            0);
		gd.addNumericField("Tile operations window height",                                                     this.tile_task_wh,            0);

		gd.addNumericField("Do not adjust for shot noise (~sqrt) if lower than this",                           this.min_shot,  4);
		gd.addNumericField("Scale when dividing by sqrt for shot noise compensation of pixel differences (<0 - disable)",           this.scale_shot,  4);

		gd.addNumericField("RMS difference from average to reduce weights (255 full scale image)",              this.diff_sigma,  4);
		gd.addNumericField("RMS difference from average in sigmas to discard channel",                          this.diff_threshold,  4);
		gd.addCheckbox    ("Gaussian as weight when averaging images (false - sharp all/nothing)",              this.diff_gauss);
		gd.addNumericField("Minimal number of channels to agree on a point (real number to work with fuzzy averages)",             this.min_agree,  2);
		gd.addCheckbox    ("Do not reduce average weight when only one image differes much from the average",           this.dust_remove);
		gd.addCheckbox    ("Use black for backdrop outside of the FOV",                                         this.black_back);
		gd.addCheckbox    ("Add port weights to RGBA stack (debug feature)",                                    this.keep_weights);
		gd.addCheckbox    ("Alpha channel: use center 8x8 (unchecked - treat same as RGB)",                     this.sharp_alpha);
		gd.addNumericField("Alpha channel 0.0 thereshold (lower - transparent)",                                this.alpha0,   3);
		gd.addNumericField("Alpha channel 1.0 threshold (higher - opaque)",                                     this.alpha1,   3);
		gd.addCheckbox    ("Generate shifted channel linear RGB stacks",                                        this.gen_chn_stacks);
		gd.addCheckbox    ("Generate shifted channel color image stack",                                        this.gen_chn_img);
		gd.addCheckbox    ("Generate shifted channel images and save with the model 'CLT process corr'",        this.gen_4_img);
		gd.addCheckbox    ("Show result RGBA before overlap combined",                                          this.show_nonoverlap);
		gd.addCheckbox    ("Show result RGBA",                                                                  this.show_overlap);
		gd.addCheckbox    ("Show result color",                                                                 this.show_rgba_color);
		gd.addCheckbox    ("Show disparity maps",                                                               this.show_map);
		gd.addCheckbox    ("Show correlation tiles",                                                            this.show_corr);

		gd.addNumericField("Disparity scan start value",                                                        this.disp_scan_start,  2);
		gd.addNumericField("Disparity scan step",                                                               this.disp_scan_step,  2);
		gd.addNumericField("Disparity scan number of disparity values to scan",                                 this.disp_scan_count,            0);

		gd.addTab         ("Manual", "camera fine correction: X/Y for images 0..3");

		gd.addMessage("--- camera fine correction: X/Y for images 0..3  ---");
		gd.addCheckbox    ("Debug infinity/lazy eye correction",                                                this.fine_dbg);
		gd.addNumericField("X 0",                                                                               this.fine_corr_x_0,  3);
		gd.addNumericField("Y 0",                                                                               this.fine_corr_y_0,  3);
		gd.addNumericField("X 1",                                                                               this.fine_corr_x_1,  3);
		gd.addNumericField("Y 1",                                                                               this.fine_corr_y_1,  3);
		gd.addNumericField("X 2",                                                                               this.fine_corr_x_2,  3);
		gd.addNumericField("Y 2",                                                                               this.fine_corr_y_2,  3);
		gd.addNumericField("X 3",                                                                               this.fine_corr_x_3,  3);
		gd.addNumericField("Y 3",                                                                               this.fine_corr_y_3,  3);
		gd.addCheckbox    ("Ignore manual pixel correction (set/reset automatically if enabled below)",             this.fine_corr_ignore);
		gd.addCheckbox    ("Apply and set to ignore manual pixel correction after extrinsics correction",           this.fine_corr_apply);

		gd.addNumericField("fcorr_radius",                                                                      this.fcorr_radius,  3);
		gd.addNumericField("Do not try to correct outside this fraction of width/hight",                        this.fcorr_min_strength,3);
		gd.addNumericField("Consider only tiles with absolute residual disparity lower than",                   this.fcorr_disp_diff,  3);
		gd.addCheckbox    ("Use quadratic polynomial for fine correction (false - only linear)",                this.fcorr_quadratic);
		gd.addCheckbox    ("Ignore current calculated fine correction (use manual only)",                       this.fcorr_ignore);

		gd.addNumericField("Minimal correlation strength to use for infinity correction",                       this.fcorr_inf_strength,3);
		gd.addNumericField("Disparity half-range for infinity",                                                 this.fcorr_inf_diff,  3);
		gd.addCheckbox    ("Use quadratic polynomial for infinity correction (false - only linear)",            this.fcorr_inf_quad);
		gd.addCheckbox    ("Correct infinity in vertical direction (false - only horizontal)",                  this.fcorr_inf_vert);


		gd.addCheckbox    ("Apply disparity correction to zero at infinity",                                    this.inf_disp_apply);
		gd.addNumericField("Re run disparity correction at infinity multiple times",                            this.inf_repeat,      0);

		//  			gd.addCheckbox    ("Apply lazy eye correction at infinity",                                             this.inf_mism_apply);
		gd.addNumericField("Infinity extraction - maximum iterations",                                          this.inf_iters,       0);
		gd.addNumericField("Coefficients maximal increment to exit iterations",                                 this.inf_final_diff,  6);
		gd.addNumericField("Include farther tiles than tolerance, but scale their weights",                     this.inf_far_pull,    3);

		gd.addTab         ("Infinity", "Infinity filter and Infinity histogram filter");

		gd.addMessage     ("--- Infinity filter ---");
		gd.addNumericField("Strength power",                                                                    this.inf_str_pow,     3);
		gd.addNumericField("Sample size (side of a square)",                                                    this.inf_smpl_side,   0);
		gd.addNumericField("Number after removing worst (should be >1)",                                        this.inf_smpl_num,    0);
		gd.addNumericField("Maximal RMS of the remaining tiles in a sample",                                    this.inf_smpl_rms,    3);
		gd.addMessage     ("--- Infinity histogram filter ---");
		gd.addNumericField("Square sample step (50% overlap)",                                                  this.ih_smpl_step,    0);
		gd.addNumericField("Histogram minimal disparity",                                                       this.ih_disp_min,     3);
		gd.addNumericField("Histogram disparity step",                                                          this.ih_disp_step,    3);
		gd.addNumericField("Histogram number of bins",                                                          this.ih_num_bins,     0);
		gd.addNumericField("Histogram Gaussian sigma (in disparity pixels)",                                    this.ih_sigma,        3);
		gd.addNumericField("Keep samples within this difference from farthest maximum",                         this.ih_max_diff,     3);
		gd.addNumericField("Minimal number of remaining samples",                                               this.ih_min_samples,  0);
		gd.addCheckbox    ("Replace samples with a single average with equal weight",                           this.ih_norm_center);
		gd.addCheckbox    ("Add disparity back to d{x,y}[i] (debug feature)",                                   this.inf_restore_disp);

		gd.addTab         ("Intra", "Intrascene DSI filtering");
		gd.addNumericField("Keep tile if it is stronger than", this.intra_keep_strength,  3,5,"",
				"Regardless of the clustered (4x4 typical) average value");
		gd.addNumericField("Keep tile conditionally if it is stonger than", this.intra_keep_conditional_strength,  3,5,"",
				"Keep tile disparity if it has close disparity among 9 neighbor clusters");
		gd.addNumericField("Absolute disparity tolearance", this.intra_absolute_disparity_tolerance,  3,5,"pix",
				"Use when comparing with neighbor clusters");
		gd.addNumericField("Relative disparity tolearance", this.intra_relative_disparity_tolerance,  3,5,"pix/pix",
				"Add to absolute disparity tolerance, multiply by disparity (relaxes for near tiles)");
		gd.addNumericField("Cluster size for consolidation",                                                    this.intra_cluster_size,  0, 5,"",
				"Typically 4 for 4x4 clusters");
		
		
		gd.addTab         ("Lazy eye", "Lazy eye parameters");

		gd.addCheckbox    ("Use 2020 LMA-based measurement of mismatch (GPU-supported)",                        this.ly_lma_ers);
		gd.addMessage     ("--- main-to-aux depth map parameters ---");
		gd.addNumericField("Minimal reference (main) channel correlation strength",                             this.ly_gt_strength,        3);
		gd.addCheckbox    ("Use window for AUX tiles to reduce weight of the hi-res tiles near low-res tile boundaries", this.ly_gt_use_wnd);
		gd.addNumericField("Aux disparity thershold to split FG and BG (and disable AUX tile for adjustment)",  this.ly_gt_rms,        3);

		gd.addMessage     ("--- Lazy eye from GT ---");
		gd.addCheckbox    ("Adjust disparity using objects at infinity by changing individual tilt and azimuth ", this.lylw_inf_en," disable if there are no really far objects in the scene");
		gd.addCheckbox    ("Adjust azimuths and tilts",                                                           this.lylw_aztilt_en,"Adjust azimuths and tilts excluding those that change disparity");
		gd.addCheckbox    ("Adjust differential rolls",                                                           this.lylw_diff_roll_en,"Adjust differential rolls (3 of 4 rolls, keeping average roll)");
		gd.addCheckbox    ("Correct scales (focal length temperature? variations)",                               this.lylw_focalLength);
		gd.addCheckbox    ("Enable common roll adjustment (valid for high disparity range scans only)",           this.lylw_com_roll);
		gd.addNumericField("Manual parameter mask selection (0 use checkboxes above)",                            this.lylw_par_sel,  0, 5,"",
				"bit 0 - sym0, bit1 - sym1, ...");

		gd.addMessage     ("--- other LMA parameters ---");

		gd.addNumericField("Relative weight margins (0.0 - all 1.0, 1.0 sin^2)",                                this.ly_marg_fract,  3,5,"","Reduce weigt of peripheral tiles");
		gd.addNumericField("Vignette corners (relative to diagonal), same fading as margins above",             this.ly_rad_to_hdiag,  3,5,"","1.0 - half diagonal, 0.8 - half width");

		gd.addCheckbox    ("Calculate and apply lazy eye correction after disparity scan (poly or extrinsic), may repeat", this.ly_on_scan);
		gd.addCheckbox    ("Adjust disparity using objects at infinity by changing individual tilt and azimuth ",          this.ly_inf_en," disable if there are no really far objects in the scene");
		gd.addNumericField("Minimal number of clusters with forced disparity to use it (otherwise keep current)",this.ly_min_forced,  0);
		gd.addCheckbox    ("Adjust azimuths and tilts",                                                         this.ly_aztilt_en,"Adjust azimuths and tilts excluding those that change disparity");
		gd.addCheckbox    ("Adjust differential rolls",                                                         this.ly_diff_roll_en,"Adjust differential rolls (3 of 4 rolls, keeping average roll)");
		gd.addCheckbox    ("Correct scales (focal length temperature? variations)",                             this.ly_focalLength);
		gd.addCheckbox    ("Enable common roll adjustment (valid for high disparity range scans only)",         this.ly_com_roll);
		gd.addCheckbox    ("Enable ERS correction of the camera rotation",                                      this.ly_ers_rot);
		gd.addCheckbox    ("Enable ERS correction of the camera forward motion",                                this.ly_ers_forw);
		gd.addCheckbox    ("Enable ERS correction of the camera sideways motion",                               this.ly_ers_side);
		gd.addCheckbox    ("Enable ERS correction of the camera vertical motion",                               this.ly_ers_vert);
		gd.addNumericField("Manual parameter mask selection (0 use checkboxes above)",                          this.ly_par_sel,  0, 5,"",
				"bit 0 - sym0, bit1 - sym1, ...");
		gd.addMessage     ("--- Relarive weights for LY samples (infinity/near, disparity/lazy eye, ...)---");
		gd.addNumericField("Total weight of infinity tiles fraction (0.0 - 1.0)",                                        this.ly_weight_infinity,  3,5,"pix",
				"The remaining weight goes to all objects and finate distance");
		gd.addNumericField("Disparity weight relative to the sum of 8 lazy eye values of the same tile for near object", this.ly_weight_disparity,  3,5,"pix",
				"Should probably be zero");
		gd.addNumericField("Disparity weight relative to the sum of 8 lazy eye values of the same tile for infinity",    this.ly_weight_disparity_inf,  3,5,"pix",
				"Now 0.5");
		gd.addNumericField("Disparity threshold to reduce weights of near tiles",                                        this.ly_max_disparity_far,  1,5,"pix",
				"Near objects' (disparity > max_disparity_far) weights are scaled by sqrt(max_disparity_far/disparity)");
		gd.addNumericField("Disregard near objects (default 1000) for LY adjustment to avoid ERS influence",             this.ly_max_disparity_use,  1,5,"pix",
				"Testing extrinsic (no ERS) adjustment only");

		gd.addMessage     ("--- Clouds in the sky detection (reduces weights for far objects, such as mountain ridges) ---");
		gd.addNumericField("Minimal distance from background selection edge for positive weighths",                      this.ly_inf_min_dfe,  3,5,"clusters",
				"Values close to the larger integer cause first positive value smaller than next increments");
		gd.addNumericField("Maximal (saturation) distance from background selection edge (0.0 - disable clouds)",        this.ly_inf_max_dfe,  3,5,"clusters",
				"Cluters farther from the edge will have the same weight. If <= 0 - disable clouds in the sky boosting.");

		gd.addMessage     ("--- Early/late lazy eye adjustments infinity margins ---");
		gd.addCheckbox    ("Use narrow-band settings even for early adjustment cycles",                          this.ly_inf_force_fine,
				"Unchecked - start with broad range, switch to narrow in later cysles");
		gd.addNumericField("Low disaprity limit for infinity during early passes (broad)",                       this.ly_inf_min_broad,  3,5,"pix",
				"Early adjustment passes should tolerate large disp[arity tilts");
		gd.addNumericField("High disaprity limit for infinity during early passes (broad)",                      this.ly_inf_max_broad,  3,5,"pix",
				"Early adjustment passes should tolerate large disp[arity tilts");
		gd.addNumericField("Low disaprity limit for infinity during late passes (narrow)",                       this.ly_inf_min_narrow,  3,5,"pix",
				"Late adjustments should have tighter margins, and the negative (this) should be more tolerant than the positive one");
		gd.addNumericField("High disaprity limit for infinity during late passes (narrow)",                      this.ly_inf_max_narrow,  3,5,"pix",
				"Late adjustments should have tighter margins, and the positive (this) should be more tighter than the negatgive one");

		gd.addMessage     ("--- Detection and removal of potentially moving objects from adjustment data set ---");
		gd.addCheckbox    ("Enable moving object detection",                                                     this.ly_moving_en,
				"Should be enabled when camera egomotion is approximately determined");
		gd.addCheckbox    ("Apply detected moving objects",                                                      this.ly_moving_apply,
				"Uncheck for dry-run");
		gd.addNumericField("Low-pass sigma to blur moving objects detection",                                    this.ly_moving_sigma,  3,5,"pix",
				"1.0 seems to be a good value");
		gd.addNumericField("Do not detect very close objects",                                                   this.ly_max_mov_disparity,  3,5,"pix",
				"More tests are needed with close objects");
		gd.addNumericField("Do not detect objects in peripheral (high lens distortion) areas",                   this.ly_rad_to_hdiag_mov,  3,5,"",
				"As a ratio to half diagonal. 0.8 corresponds to half-width");
		gd.addNumericField("Do not try to detect until the camera egomotion is determoined",                     this.ly_max_mov_average,  3,5,"",
				"After adjustment the evatage value is about 1.1");
		gd.addNumericField("Threshold value for potentially moving objects (lower - terrain)",                   this.ly_mov_min_L2,  3,5,"",
				"0.5 .. 0.75, needs more testing");
		
		gd.addMessage     ("---");
		gd.addNumericField("Debug level for lazy eye/ers processing",                                           this.ly_debug_level,  0, 5,"",
				"Active when global debug level > -1, 1 - min, 2 - lma steps, 3 - images");

		gd.addCheckbox    ("Equalize weights of right/left FoV",                                                this.ly_right_left,
				"Use this mode use with horizon visible in both FoV halves when gross infinity correction is needed");
		gd.addCheckbox    ("Compensate for right/left tilt at infinity",                                        this.ly_inf_tilt,
				"When selectig true infinity tiles, compare to tilted avarage (false use average of all infinity tiles)");

		gd.addNumericField("Minimal tiles per quadrant (not counting the worst) tp proceed",                         this.ly_per_quad,  0);
		gd.addNumericField("Minimal tiles per quadrant (not counting the worst) tp proceed - fraction of all tiles", this.ly_per_quad_r,  3);
		gd.addNumericField("Minimal number of tiles at infinity to proceed",                                         this.ly_inf,  0);
		gd.addNumericField("Minimal number of tiles at infinity to proceed - fraction of all tiles",                 this.ly_inf_r,  3);
		gd.addNumericField("Minimal number of tiles at infinity to apply weight scaling",                            this.ly_inf_scale,  0);
		gd.addNumericField("Minimal number of tiles at infinity to apply weight scaling - fraction of all tiles",    this.ly_inf_scale_r,  3);

		gd.addNumericField("Relative weight of infinity calibration data",                                           this.ly_inf_frac,  3);

		gd.addNumericField("Maximal disparity to be treated as infinity when adjusting with the rig data",           this.ly_inf_max_disparity,  3,5,"pix",
				"Only used in guided (by rig data) mode");

		gd.addCheckbox    ("Correct disparity for infinity tiles )has to disable until code fixed)",                 this.ly_inf_disp);
		gd.addCheckbox    ("Force convergence correction during extrinsic, even with no infinity data",              this.ly_inf_force);
		gd.addCheckbox    ("*Use polynomial correction, false - correct tilt/azimuth/roll of each sensor)",          this.ly_poly);

		gd.addMessage     ("--- Lazy eye parameters ---");
		gd.addNumericField("Sample size (side of a square)",                                                    this.ly_smpl_side,  0);
		gd.addNumericField("Number after removing worst (should be >1)",                                        this.ly_smpl_num,  0);
		gd.addMessage     ("Maximal measured relative disparity = "+ (0.8*disp_scan_step)+" (0.8 * disp_scan_step)");
		//			gd.addNumericField("Maximal measured relative disparity",                                               this.ly_meas_disp,  3);
		gd.addNumericField("Maximal RMS of the remaining tiles in a sample",                                    this.ly_smpl_rms,  5,8,"");
		gd.addNumericField("Maximal full disparity difference to 8 neighbors",                                  this.ly_disp_var, 5,8,"pix",
				"Full allowed mismatch is a sum of absolute and disparity times relative");
		gd.addNumericField("Maximal relative full disparity difference to 8 neighbors",                         this.ly_disp_rvar, 5,8,"",
				"Full allowed mismatch is a sum of absolute and disparity times relative");
		gd.addNumericField("Maximal full disparity difference to 8 neighbors with GT",                          this.ly_disp_var_gt, 5,8,"pix",
				"Full allowed mismatch is a sum of absolute and disparity times relative (relaxed when ground truth is available)");
		gd.addNumericField("Maximal relative full disparity difference to 8 neighbors with GT",                 this.ly_disp_rvar_gt, 5,8,"",
				"Full allowed mismatch is a sum of absolute and disparity times relative (relaxed when ground truth is available)");
		gd.addNumericField("Reduce weight of higher disparity tiles",                                           this.ly_norm_disp, 5,8,"");
		gd.addMessage     ("--- Lazy eye multi-step fitting ---");

		gd.addStringField ("Read extrinsics_bgnd_combo instead of building it",                                 this.lym_dbg_path, 80);
		gd.addNumericField("Any (near) saturated pixels - discard tile (see sat_level also)",                   this.lym_overexp,  10,12,"");
		gd.addCheckbox    ("Update target disparity after each step",                                           this.lym_update_disp);
		gd.addNumericField("Maximal number of iterations",                                                      this.lym_iter,  0);
		gd.addNumericField("Parameter vector difference to exit (main camera)",                                 this.lym_change,  10,12,"");
		gd.addNumericField("Parameter vector difference to exit (aux camera)",                                  this.lym_change_aux,  10,12,"");
		gd.addNumericField("Parameter vector difference to exit from polynomial correction",                    this.lym_poly_change,  10);

		gd.addMessage     ("--- Lazy eye data preparation ---");
		gd.addCheckbox    ("Modify preliminary disparity map before running LY",                                this.lym_mod_map,
				"LY may tolerate some disparity errors when just pure LY is needed");
		gd.addCheckbox    ("Consider all above infinity to be infinity",                                        this.lym_top_bg,
				"Valid for many, but not all scenes, such as tree branches over sky background");
		gd.addNumericField("Fill gaps in background selection",                                                 this.lym_fill_gaps_bg,  0, 2, "pix",
				"1 -  1 pixel in 4 directions, 2 - 1 step in 8 directions, ...");
		gd.addNumericField("Fill gaps in combo selection",                                                      this.lym_fill_gaps_combo,  0, 2, "pix",
				"1 -  1 pixel in 4 directions, 2 - 1 step in 8 directions, ...");
		gd.addCheckbox    ("Use strength when averaging disparity from neighbors",                              this.lym_use_strength,
				"Weight by strength when averaging missing disparity tiles, false - use equal weights");
		gd.addNumericField("Scale strength of the interpolated tiles from average neighbors strength",          this.lym_scale_deriv_str,  3, 6, "",
				"Multiply average strength of neighbors when assigning to a missing tile");
		
		
		gd.addMessage     ("--- Lazy eye samples filter ---");
		gd.addCheckbox    ("Filter lazy eye pairs by their values",                                             this.lyf_filter);
		gd.addNumericField("Fileter sample side (if 8, 8 x8 masked, 16x16 sampled)",                            this.lyf_smpl_side,  0);
		gd.addNumericField("Maximal RMS (all components to components average)",                                this.lyf_rms_max,  3);
		gd.addNumericField("Keep best fit samples, discard worst",                                              this.lyf_frac_keep,  3);
		gd.addNumericField("Minimal number of tiles remaining in the sample",                                   this.lyf_min_samples,  0);
		gd.addCheckbox    ("Replace samples with a single average with equal weight",                           this.lyf_norm_center);
		gd.addNumericField("Scale calculated correction vector",                                                this.ly_corr_scale,  3);
		gd.addMessage     ("--- Parameters specific to LY adjustments with dual-camera rig data (as ground truth ---");

		gd.addCheckbox    ("Use samples filter with rig data",                                                  this.lyr_filter_ds,
				"Raw measured data may not need filtering when ground truth disparity is available");
		gd.addCheckbox    ("Filter lazy eye pairs by their values wen GT data is available",                    this.lyr_filter_lyf,
				"Same as \"Filter lazy eye pairs by their values\" above, but for the rig-guided adjustments");


		//  			gd.addNumericField("Use square this size side to detect outliers",                                      this.fcorr_sample_size,  0);
		//  			gd.addNumericField("Keep tiles only if there are more in each square",                                  this.fcorr_mintiles,     0);
		//  			gd.addNumericField("Remove this fraction of tiles from each sample",                                    this.fcorr_reloutliers,  3);
		//  			gd.addNumericField("Gaussian blur channel mismatch data",                                               this.fcorr_sigma,        3);

		///  			gd.addNumericField("Calculated from correlation offset vs. actual one (not yet understood)",            this.corr_magic_scale,  3);

		gd.addTab         ("3D", "3D reconstruction");
		gd.addMessage     ("--- 3D reconstruction ---");
		gd.addCheckbox    ("Show generated textures",                                                                this.show_textures);
		gd.addCheckbox    ("show intermediate results of filtering",                                                 this.debug_filters);

		gd.addNumericField("Minimal noise-normalized pixel difference in a channel to suspect something",            this.min_smth,  3);
		gd.addNumericField("Reliable noise-normalized pixel difference in a channel to have something ",             this.sure_smth,  3);
		gd.addNumericField("Disparity range to be considered background",                                            this.bgnd_range,  3);
		gd.addNumericField("Disparity difference from the center (provided) disparity to trust",                     this.other_range,  3);

		gd.addNumericField("Minimal 4-corr strength to trust tile",                                                  this.ex_strength,  3);
		gd.addNumericField("Minimal 4-corr strength divided by channel diff for new (border) tiles",                 this.ex_nstrength,  3);

		gd.addCheckbox    ("Allow expansion over previously identified background (infinity)",                       this.ex_over_bgnd);
		gd.addNumericField("When expanding over background, disregard lower disparity ",                             this.ex_min_over,  3);

		gd.addTab         ("Plates", "Plates filtering when building initial z-map");
		gd.addMessage     ("********* Plates filtering when building initial z-map *********");
		gd.addNumericField("If strength exceeds ex_strength * super_trust, do not apply ex_nstrength and plate_ds",           this.pt_super_trust,  3);
		gd.addCheckbox    ("Do not replace raw tiles by the plates, if raw is closer (like poles)",                  this.pt_keep_raw_fg);
		gd.addNumericField("Scale plates strength before comparing to raw strength",                                 this.pt_scale_pre,  3);
		gd.addNumericField("Scale plates strength when replacing raw (plates d/s data is more reliable if it exists)",           this.pt_scale_post,  3);

		gd.addNumericField("Minimal strength to be considered definitely background",                                this.bgnd_sure,  3);
		gd.addNumericField("Maximal strength to ignore as non-background",                                           this.bgnd_maybe,  3);

		gd.addNumericField("Number of tiles in a cluster to seed (just background?)",                                this.min_clstr_seed,   0);
		gd.addNumericField("Number of tiles in a cluster not close to other clusters (more than 2 tiles apart)",           this.min_clstr_lone,   0);
		gd.addNumericField("Minimal total strength of the cluster",                                                  this.min_clstr_weight,  3);
		gd.addNumericField("Minimal maximal strength of the cluster",                                                this.min_clstr_max,  3);

		gd.addNumericField("Fill gaps betsween clusters, see comments for 'grow'",                                   this.fill_gaps,   0);
		gd.addNumericField("Same as fill_gaps above, on the final pass",                                             this.fill_final,   0);
		gd.addNumericField("Number of tiles in a cluster to block (just non-background?)",                           this.min_clstr_block,   0);
		gd.addNumericField("Number of tiles to grow tile selection (1 - hor/vert, 2 - hor/vert/diagonal)",           this.bgnd_grow,   0);

		gd.addCheckbox    ("Use old ortho features processing (ortho_* parameters, false - use or_*)",               this.ortho_old);
		gd.addMessage     ("--- old ones, new are in  \"Ortho+4\" tab---");
		gd.addNumericField("Minimal strength of hor correlation to be used instead of full 4-pair correlation",      this.ortho_min_hor,  3);
		gd.addNumericField("Minimal strength of vert correlation to be used instead of full 4-pair correlation",     this.ortho_min_vert,  3);
		gd.addNumericField("Vert/hor (or hor/vert) strength to be used instead of the full correlation",             this.ortho_asym,  3);
		gd.addNumericField("Vert/hor (or hor/vert) strength exceeding scaled 4-pair strength",                       this.ortho_over4,  3);

		gd.addNumericField("Minimal strength of hor/vert to bridge over",                                            this.ortho_sustain,  3);
		gd.addNumericField("minimal run of hor/vert tiles to be considered (at least from one side)",                this.ortho_run,      0);
		gd.addNumericField("Minimal maximal strength in an ortho run (max. in run >=...)",                           this.ortho_minmax,  3);
		gd.addNumericField("Number of tiles to bridge over hor/vert gaps",                                           this.ortho_bridge,   0);
		gd.addNumericField("Maximal disparity RMS in a run to replace by average)",                                  this.ortho_rms,  3);
		gd.addNumericField("Convolve hor/vert strength by 3*(2*l+1) kernels to detect multi-tile features",          this.ortho_half_length,   0);
		gd.addNumericField("Fraction of convolved ortho in a mix with raw",                                          this.ortho_mix,  3);

		gd.addTab         ("Ortho+4", "Combining of ortho and 4-pair correlations");
		gd.addMessage     ("--- Combining of ortho and 4-pair correlations ---");
		gd.addCheckbox    ("Apply ortho correction to horizontal correlation (vertical features)",                      this.or_hor);
		gd.addCheckbox    ("Apply ortho correction to vertical correlation (horizontal features)",                      this.or_vert);
		gd.addNumericField("Blur sigma: verically for horizontal correlation, horizontally - for vertically",           this.or_sigma,  3);
		gd.addNumericField("3-point sharpening (-k, +2k+1, -k)",                                                        this.or_sharp,  3);
		gd.addNumericField("Scale ortho correletion strength relative to 4-directional one",                            this.or_scale,  3);
		gd.addNumericField("Subtract from scaled correlation strength, limit by 0",                                     this.or_offset,  3);
		gd.addNumericField("Minimal ratio of orthogonal strengths required for disparity replacement",                  this.or_asym,  3);
		gd.addNumericField("Minimal scaled offset ortho strength to normal strength needed for replacement",            this.or_threshold,  3);
		gd.addNumericField("Minimal horizontal absolute scaled offset ortho strength needed for replacement",           this.or_absHor,  3);
		gd.addNumericField("Minimal vertical absolute scaled offset ortho strength needed for replacement",             this.or_absVert,  3);
		gd.addNumericField("Maximal disparity to apply ortho correction",                                               this.or_maxDisp,  3,8,"pix",
				"Maximal disparity to apply ortho correction");

		gd.addTab         ("Vert", "Fix vertical structures, such as street poles");
		gd.addMessage     ("--- Fix vertical structures, such as street poles ---");
		gd.addCheckbox    ("Continue vertical structures to the ground",                                                this.poles_fix);
		gd.addNumericField("Number of tiles to extend over the poles bottoms",                                          this.poles_len,   0);
		gd.addNumericField("Maximal ratio of invisible to visible pole length",                                         this.poles_ratio,  3);
		gd.addNumericField("Set new pole segment strength to max of horizontal correlation and this value",             this.poles_min_strength,  3);
		gd.addCheckbox    ("Set disparity to that of the bottom of existing segment (false - use hor. disparity)",          this.poles_force_disp);

		gd.addNumericField("Maximal number of output meshes to generate",                                            this.max_clusters,   0);
		gd.addCheckbox    ("Remove all unneeded scans when generating x3d output to save memory",                    this.remove_scans);
		gd.addCheckbox    ("Generate x3d output",                                                                    this.output_x3d);
		gd.addCheckbox    ("Generate Wavefront obj output",                                                          this.output_obj);
		gd.addCheckbox    ("Correct lens geometric distortions in a model (will need backdrop to be corrected too)",           this.correct_distortions);
		gd.addCheckbox    ("Show generated triangles",                                                               this.show_triangles);
		gd.addCheckbox    ("Weight-average disparity for the whole cluster ",                                        this.avg_cluster_disp);
		gd.addNumericField("Maximal disparity difference in a triangle face to show",                                this.maxDispTriangle,  6);
		gd.addNumericField("Distance to generate backdrop (0 - use regular backdrop)",                               this.infinityDistance,  8);
		gd.addNumericField(" Minimal number of background tiles to generate background",                             this.min_bgnd_tiles,   0);

		gd.addCheckbox    ("Split into shells with flaps",                                                           this.shUseFlaps);
		gd.addCheckbox    ("Aggressive fade alpha (whole boundary)",                                                 this.shAggrFade);
		gd.addNumericField("Minimal shell area (not counting flaps",                                                 this.shMinArea,   0);
		gd.addNumericField("Minimal value of the shell maximum strength",                                            this.shMinStrength,  6);

		gd.addTab         ("Thin ice", "Thin ice parameters (obsolete)");
		gd.addMessage     ("--- Thin ice parameters (obsolete) ---");
		gd.addNumericField("Relative disparity rigidity in vertical direction",                                      this.tiRigidVertical,  6);
		gd.addNumericField("Relative disparity rigidity in horizontal direction",                                    this.tiRigidHorizontal,  6);
		gd.addNumericField("Relative disparity rigidity in diagonal   direction",                                    this.tiRigidDiagonal,  6);
		gd.addNumericField("Strength floor - subtract (limit with 0) before applying",                               this.tiStrengthOffset,  6);
		gd.addNumericField("Divide actual disparity by this  before Math.pow and applying to TI",                    this.tiDispScale,  6);
		gd.addNumericField("Apply pow to disparity (restore sign) for disparity difference pressure on TI",          this.tiDispPow,  6);
		gd.addNumericField("tiDispPull: multiply strength*disparity difference to pull force",                       this.tiDispPull,  6);
		gd.addNumericField("Scale tiDispPull for pre-final pass",                                                    this.tiDispPullPreFinal,  6);
		gd.addNumericField("Scale tiDispPull for final pass",                                                        this.tiDispPullFinal,  6);
		gd.addNumericField("Normalize stresses to average disparity if it is above threshold",                       this.tiBreakNorm,  6);
		gd.addNumericField("TI break value of abs(d0-3d1+3d2-d3)",                                                   this.tiBreak3,  6);
		gd.addNumericField("TI break value of (d0-3d1+3d2-d3) * (d1 - d2)",                                          this.tiBreak31,  6);
		gd.addNumericField("TI break value of (-d0+d1+d2-d3) * abs(d1 - d2)",                                        this.tiBreak21,  6);
		gd.addNumericField("TI disparity threshold to remove as too far tiles",                                      this.tiBreakFar,  6);
		gd.addNumericField("TI disparity threshold to remove as too near tiles",                                     this.tiBreakNear,  6);
		gd.addNumericField("TI break mode: +1: abs(3-rd derivative), +2: -(3-rd * 1-st), +4: -(2-nd * abs(1-st))",           this.tiBreakMode,  0);
		gd.addNumericField("Amplify colinear breaks in neighbor tiles",                                              this.tiBreakSame,  6);
		gd.addNumericField("Amplify 90-degree turnintg breaks in neighbor tiles",                                    this.tiBreakTurn,  6);

		gd.addNumericField("Heal disparity gap before pre-last smooth",                                              this.tiHealPreLast,  6);
		gd.addNumericField("Heal disparity gap before last smooth",                                                  this.tiHealLast,  6);
		gd.addNumericField("Maximal length of an internal break in the cluster to heal",                             this.tiHealSame, 0);

		gd.addNumericField("Maximal number of TI iterations for each step",                                          this.tiIterations, 0);
		gd.addNumericField("Iteration maximal error (1/power of 10)",                                                this.tiPrecision,  0);
		gd.addNumericField("Number of cycles break-smooth (after the first smooth)",                                 this.tiNumCycles,  0);

		gd.addTab         ("Fg/Bg", "Fg/Bg separation");
		gd.addMessage     ("--- Fg/Bg separation ---");
		gd.addCheckbox    ("Apply super-tiles during refine passes",                                                 this.stUseRefine);
		gd.addCheckbox    ("Apply super-tiles during pass2 ",                                                        this.stUsePass2);
		gd.addCheckbox    ("Apply super-tiles during render",                                                        this.stUseRender);

		gd.addCheckbox    ("Show supertiles histograms",                                                             this.stShow);
		gd.addNumericField("Super tile size (square, in tiles)",                                                     this.stSize,  0);
		gd.addNumericField("Disparity histogram step for far objects",                                               this.stStepFar,  6);
		gd.addNumericField("Disparity histogram step for near objects",                                              this.stStepNear,  6);
		gd.addNumericField("Disparity threshold to switch from linear to logarithmic steps",                         this.stStepThreshold,  6);
		gd.addNumericField("Minimal disparity (center of a bin)",                                                    this.stMinDisparity,  6);

		gd.addTab         ("Supertiles", "Build supertiles (plates)");
		//  			gd.addNumericField("Maximal disparity (center of a bin)",                                                    this.stMaxDisparity,  6);
		gd.addMessage     ("Maximal disparity (center of a bin) - using grow_disp_max="+          this.grow_disp_max);
		//  			gd.addNumericField("Subtract from strength, discard negative",                                               this.stFloor,  6);
		//  			gd.addNumericField("Raise strength to this power ",                                                          this.stPow,  6);
		gd.addNumericField("Blur disparity histogram (sigma in bins)",                                               this.stSigma,  6);
		gd.addNumericField("Minimal backgroubnd disparity to extract as a maximum from the supertiles",              this.stMinBgDisparity,  6);
		gd.addNumericField("Minimal fraction of the disparity histogram to use as background",                       this.stMinBgFract,  6);
		gd.addNumericField("Use background disparity from supertiles if tile strength is less",                      this.stUseDisp,  6);
		gd.addNumericField("Multiply st strength if used instead of regular strength ",                              this.stStrengthScale,  6);

		//  			gd.addMessage     ("Sample filtering mode");

		gd.addMessage     ("Other supertile parameters");
		gd.addNumericField("Grow initial selection before processing supertiles, odd - ortho. <0 - use all tiles",          this.stGrowSel,  0);
		gd.addNumericField("Select measurements for supertiles : +1 - combo, +2 - quad +4 - hor +8 - vert",          this.stMeasSel,  0);
		gd.addNumericField("Consider merging initial planes if disparity difference below",                          this.stSmallDiff,  6);
		gd.addNumericField("Consider merging initial planes if jumps between ratio above",                           this.stHighMix,  6);

		gd.addNumericField("Outlier tiles weaker than this may be replaced from neighbors",                          this.outlierStrength,  6);
		gd.addNumericField("Replace weak outlier tiles that do not have neighbors within this disparity difference",           this.outlierDiff,  6);
		gd.addNumericField("Replace weak outlier tiles that have higher disparity than weighted average",            this.outlierDiffPos,  6);
		gd.addNumericField("Replace weak outlier tiles that have lower disparity than weighted average",             this.outlierDiffNeg,  6);

		gd.addCheckbox    ("Combine with all previous after refine pass",                                            this.combine_refine);
		gd.addNumericField("Disregard weaker tiles when combining scans",                                            this.combine_min_strength,  6);
		gd.addNumericField("Disregard weaker tiles when combining scans  for horizontal correlation",                this.combine_min_hor,  6);
		gd.addNumericField("Disregard weaker tiles when combining scans  for vertical correlation",                  this.combine_min_vert,  6);
		//  			gd.addNumericField("Do not re-measure correlation if target disparity differs from some previous by this",          this.unique_tolerance,  6);

		gd.addTab         ("Tile Filter", "Filter for measured tile data");
		gd.addCheckbox    ("Use sample mode (false - regular tile mode)",                                            this.stSmplMode);
		gd.addNumericField("Sure strength",                                                                          this.mlfp.strength_sure,  4,6,"",
				"Do not filter tile disparities above this strength level (on top of strength floor");
		gd.addNumericField("Strength floor",                                                                         this.mlfp.strength_floor,  4,6,"",
				"Subtract from strength, discard negative");
		gd.addNumericField("Raise strength to this power ",                                                          this.mlfp.strength_pow,  6);
		gd.addNumericField("Sample size (side of a square)",                                                         this.mlfp.smplSide,  0);
		gd.addNumericField("Number after removing worst",                                                            this.mlfp.smplNum,  0);
		gd.addNumericField("Maximal RMS of the remaining tiles in a sample",                                         this.mlfp.smplRms,  6);
		gd.addCheckbox    ("Use window function for the samples",                                                    this.mlfp.smplWnd);

		gd.addMessage     ("Additional parameters to prevent increase of the  distance to far (small) objects",
				"These parameters are also used when expanding tiles from the known ones");
		gd.addNumericField("Maximal absolute plane \"tilt\" in pixels/tile",                                         this.mlfp.max_abs_tilt,  4, 6,
				"pix/tile", "difference between disparity of the neighbor tiles in disparity space image");
		gd.addNumericField("Maximal relative plane \"tilt\"",                                                        this.mlfp.max_rel_tilt,  4, 6,
				"1/tile", "pixel/tile tilte divided by the full disparity of the tle");

		gd.addNumericField("Tilt cost for damping insufficient plane data",                                          this.mlfp.damp_tilt,  6, 8,
				"", "Allows to find plane when there are not enough tiles to process");

		gd.addNumericField("Disparity switch between filtering modes",                                               this.mlfp.min_tilt_disp,  4,6,
				"pix","Objects that are closer (larger disparity) use tilted plane model, far objects use maximal among neighbors disparity");
		gd.addNumericField("Mode transition range (between tilted and maximal disparity)",                           this.mlfp.transition,  4,6,
				"pix","Disparity range to gradually switch between maximal and tilted modes");
		gd.addNumericField("Far objects filtering mode (0 - off, 1,2 - power of disparity)",                         this. mlfp.far_mode,  0,3,
				"","So far only 2 far modes: 1 - remove outliers from both sides, 2 - only from far side, 0 - use tilted mode for all tiles");
		gd.addNumericField("Raise disparity to this power before averaging for far objects",                         this.mlfp.far_power,  4,6,
				"", "Parameter to specify preference of the larger disparity when averaging");


		gd.addTab         ("Grow", "Growing disparity range to scan");
		gd.addMessage     ("========= Growing disparity range to scan ========");
		gd.addNumericField("Try these number of tiles around known ones",                                                   this.grow_sweep,  0);
		gd.addNumericField("Maximal disparity to try",                                                                      this.grow_disp_max,  6);
		gd.addNumericField("Trust measured disparity within +/- this value",                                                this.grow_disp_trust,  6);
		gd.addNumericField("Increase disparity (from maximal tried) if nothing found in that tile",                         this.grow_disp_step,  6);
		gd.addNumericField("Grow more only if at least one channel has higher variance from others for the tile",           this.grow_min_diff,  6);
		gd.addCheckbox    ("Retry tiles around known foreground that have low max_tried_disparity",                         this.grow_retry_far);
		gd.addCheckbox    ("Scan full range between max_tried_disparity of the background and known foreground",            this.grow_pedantic);
		gd.addCheckbox    ("Retry border tiles that were identified as infinity earlier",                                   this.grow_retry_inf);

		gd.addTab         ("Filter", "\"plate\" filtering when growing parameters");
		gd.addMessage     ("--- more growing parameters ---");
		gd.addCheckbox    ("New expansion mode",                                                                            this.gr_new_expand);
		//  			gd.addNumericField("Expansion steps limit",                                                                         this.gr_max_expand,  0);
		gd.addNumericField("Strength floor for multi-tile (now 5x5) samples (normally < combine_min_strength) ",            this.fds_str_floor,  6);
		gd.addNumericField("Over background extra reliable strength",                                                       this.gr_ovrbg_cmb,  6);
		gd.addNumericField("Over background extra reliable strength horizontal",                                            this.gr_ovrbg_cmb_hor,  6);
		gd.addNumericField("Over background extra reliable strength vertical",                                              this.gr_ovrbg_cmb_vert,  6);
		gd.addNumericField("Over background filtered extra reliable strength",                                              this.gr_ovrbg_filtered,  6);

		gd.addMessage     ("--- \"plate\" filtering when growing parameters ---");
		gd.addNumericField("Strength power exponent for tilted plates growing",                                             this.fds_str_pow,  6);
		gd.addNumericField("Sample size (side of a square) for tilted plates growing",                                      this.fds_smpl_side,  0);
		gd.addNumericField("Number of tiles in a square tilted plate (should be >1)",                                       this.fds_smpl_num,  0);
		gd.addNumericField("Maximal RMS for the tiles to the tilted plate",                                                 this.fds_smpl_rms,  6);
		gd.addNumericField("Maximal relative RMS for the tiles to the tilted plate - multiply by disparity and add",           this.fds_smpl_rel_rms,  6);
		gd.addCheckbox    ("Use window function for the square sample plates",                                              this.fds_smpl_wnd);
		gd.addNumericField("Maximal growing plate tilt in disparity pix per tile",                                          this.fds_abs_tilt,  6);
		gd.addNumericField("Maximal relative growing plate tilt in disparity pix per tile per disparity pixel",             this.fds_rel_tilt,  6);

		gd.addTab         ("Periodic", "Detect and filter periodic features");
		gd.addCheckbox    ("Apply filter to remove false correlations of periodic structures",                              this.per_filter,
				"Detect repetitive features (such as windows grid) and remove false matches");
		gd.addNumericField("Maximal residual disparity difference to use for periodic features",                            this.per_trustedCorrelation,  4, 6,"pix",
				"do not trust correlation results with larger absolute value of residual disparity");
		gd.addNumericField("Initial half-width of the disparity range per cluster",                                         this.per_initial_diff,  4, 6,"pix",
				"Select tiles this far from the local maximums");
		gd.addNumericField("Strength floor to detect periodic features",                                                    this.per_strength_floor,  4, 6,"",
				"Only use stronger correlations, subtract this value for weighted averages");
		gd.addNumericField("Maximums seeds should have at least this much over strength floor",                             this.per_strength_max_over,  4, 6,"",
				"When growing clusters, only start with the correlations this much stronger than strength floor ");
		gd.addNumericField("Minimal feature period",                                                                        this.per_min_period,  4, 6,"",
				"Only detect/filter feature that have period above this value");
		gd.addNumericField("Minimal number of periods in periodic structures",                                              this.per_min_num_periods,  0, 2,"",
				"Minimal number of full periods to be detected");
		gd.addNumericField("Maximal period variations",                                                                     this.per_disp_tolerance,  4, 6,"pix",
				"The detected periods should be higher than this value");
		gd.addNumericField("Disparity difference to match neighbors",                                                       this.per_disp_match,  0, 2,"",
				"Neighbor tiles should have smaller disparity difference from gthe center to qualify");
		gd.addNumericField("Extra strength to treat match as strong (for hysteresis)",                                      this.per_strong_match_inc,  0, 2,"",
				"The layer that does not have any match in the direction where some other layer has a strong match will be removed");


		gd.addTab         ("Macro", "Macro tiles correlation parameters");
		gd.addMessage     ("--- Macro correlation parameters ---");
		gd.addNumericField("Macro disparity scan step (actual disparity step is 8x)",                                       this.mc_disp8_step,  6);
		gd.addNumericField("Trust measured macro(8x)  disparity within +/- this value ",                                    this.mc_disp8_trust,  6);
		gd.addNumericField("Minimal macro correlation strength to process",                                                 this.mc_strength,  6);
		gd.addNumericField("Do not re-measure macro correlation if target disparity differs less",                          this.mc_unique_tol,  6);

		gd.addNumericField("When consolidating macro results, exclude high residual disparity",                             this.mc_trust_fin,  6);
		gd.addNumericField("Gaussian sigma to reduce weight of large residual disparity",                                   this.mc_trust_sigma,  6);
		gd.addNumericField("Weight from ortho neighbor supertiles",                                                         this.mc_ortho_weight,  6);
		gd.addNumericField("Weight from diagonal neighbor supertiles",                                                      this.mc_diag_weight,  6);
		gd.addNumericField("Do not remove measurements farther from the kept ones",                                         this.mc_gap,  6);


		gd.addNumericField("weight of variance data ",                                                                      this.mc_weight_var,  4, 6,"",
				"This is what was used before - can detect tin wires, probably");
		gd.addNumericField("Weight of average intensity",                                                                   this.mc_weight_Y,  4, 6,"",
				"Combination of R,G,B fro the tile");
		gd.addNumericField("Weight of average color difference",                                                            this.mc_weight_RBmG,  4, 6,"",
				"0.5*(R+B)-G");


		gd.addTab         ("Grow2", "More disparity range growing parameters");
		gd.addMessage     ("--- more growing parameters ---");
		gd.addNumericField("Discard variant if it requests too few tiles",                                                  this.gr_min_new,  0);
		gd.addCheckbox    ("Expand only unambiguous tiles over previously undefined",                                       this.gr_var_new_sngl);
		gd.addCheckbox    ("Expand unambiguous and FOREGROUND tiles over previously UNDEFINED",                             this.gr_var_new_fg);
		gd.addCheckbox    ("Expand unambiguous and FOREGROUND tiles over already DEFINED",                                  this.gr_var_all_fg);
		gd.addCheckbox    ("Expand unambiguous and BACKGROUND tiles over previously UNDEFINED",                             this.gr_var_new_bg);
		gd.addCheckbox    ("Expand unambiguous and BACKGROUND tiles over already DEFINED",                                  this.gr_var_all_bg);
		gd.addCheckbox    ("Try next disparity range that was not tried before",                                            this.gr_var_next);
		gd.addNumericField("How far to extend over previously undefined disparity tiles",                                   this.gr_num_steps,  0);
		gd.addNumericField("How far to extend over previously determined disparity tiles",                                  this.gr_steps_over,  0);
		gd.addNumericField("Extend sample plate square side",                                                               this.gr_smpl_size,  0);
		gd.addNumericField("Extend at least this number of the seed tiles",                                                 this.gr_min_pnts,  0);
		gd.addCheckbox    ("Use window function for square sample ",                                                        this.gr_use_wnd);
		gd.addNumericField("Tilt cost for damping insufficient plane data",                                                 this.gr_tilt_damp,  6);
		gd.addNumericField("When growing, range of disparities to be extended without far/near subdivision",                this.gr_split_rng,  6);
		gd.addNumericField("Consider far/near tiles within that range from the farthest/closest",                           this.gr_same_rng,  6);
		gd.addNumericField("Maximal difference from the old value when smoothing",                                          this.gr_diff_cont,  6);
		gd.addNumericField("Maximal filter disparity absolute tilt (pix per tile)",                                         this.gr_abs_tilt,  6);
		gd.addNumericField("Maximal filter disparity tilt (pix / disparity) per tile",                                      this.gr_rel_tilt,  6);
		gd.addNumericField("Maximal number of smoothing steps (reduce if long?)",                                           this.gr_smooth,  0);
		gd.addNumericField("Maximal change to finish smoothing iterations",                                                 this.gr_fin_diff,  6);
		gd.addNumericField("Do not re-measure correlation if target disparity differs from some previous less",             this.gr_unique_tol,  6);
		gd.addNumericField("Larger tolerance for expanding (not refining)",                                                 this.gr_unique_pretol,  6);

		gd.addTab         ("Alt CLusterize", "Alternative initial tiles clusterization");

		gd.addCheckbox    ("Modify cluster strengths",                                                                      this.ft_mod_strength,
				"Supplement sum of strengths with other parameters, such as density and height ");
		gd.addCheckbox    ("Enable alternative initial tile clusterization",                                                this.ft_clusterize_by_highest,
				"Clusterize using disparity horizontal maximums for fronto planes and minimums - for horizontal. False - use histograms");
		gd.addNumericField("Disparity blur sigma",                                                                          this.ft_clust_sigma, 4, 6,"pix",
				"Blur disparity before finding each line max (for fronto planes ) or min (for horizontal planes) during initial clusterization");
		gd.addNumericField("Absolute disparity range for fronto clusters",                                                  this.ft_disp_arange_vert, 4, 6,"pix",
				"Disparity range for blurred disparity (down from max disparity) for fronto planes");
		gd.addNumericField("Relative disparity range for fronto clusters",                                                  this.ft_disp_rrange_vert, 4, 6,"pix/pix",
				"Increase disparity range for fronto clusters for each disparity pixel");
		gd.addNumericField("Absolute disparity range for horizontal clusters",                                              this.ft_disp_arange_hor, 4, 6,"pix",
				"Disparity range for blurred disparity (up from min disparity to horizontal difference) for horizontal planes");
		gd.addNumericField("Relative disparity range for horizontal clusters",                                              this.ft_disp_rrange_hor, 4, 6,"pix/pix",
				"Increase disparity range for horizontal clusters for each disparity pixel");
		gd.addNumericField("Actual disparity positive tolerance over blurred disparity max range",                          this.ft_tolerance_above_near, 4, 6,"pix",
				"Allow measured tile disparity above cluster disparity range for fronto clusters");
		gd.addNumericField("Actual disparity negative tolerance over blurred disparity max range",                          this.ft_tolerance_below_near, 4, 6,"pix",
				"Allow measured tile disparity below cluster disparity range for fronto planes");
		gd.addNumericField("Actual disparity positive tolerance over blurred disparity min range",                          this.ft_tolerance_above_far, 4, 6,"pix",
				"Allow measured tile disparity above cluster disparity range for horizontal planes");
		gd.addNumericField("Actual disparity negative tolerance over blurred disparity min range",                          this.ft_tolerance_below_far, 4, 6,"pix",
				"Allow measured tile disparity below cluster disparity range for horizontal planes");
		gd.addNumericField("Fronto/horizontal selections overlap",                                                          this.ft_hor_vert_overlap,  0,6,"",
				"Allow clusters tile sharing between fronto and horizontal. 2 - 1 tile in 8 directions, 1 - 1 tile in 4 directions");
		gd.addNumericField("Mark as used if has used/disabled neighbors ",                                                  this.ft_used_companions,  0,6,"",
				"Cell that has this many new used companions is considered used (borders and already use3d are considered used too)");
		gd.addNumericField("Minimal number of new used cells among new/old used and marginal tiles",                        this.ft_used_true_companions,  0,6,"",
				"There should be at least this many new selected tiles among neighbors");


		gd.addTab         ("Plane Det", "Planes detection");
		gd.addMessage     ("--- Planes detection ---");
		gd.addCheckbox    ("Always start with disparity-most axis (false - lowest eigenvalue)",                      this.plPreferDisparity);
		gd.addNumericField("Normalize disparities to the average if above",                                          this.plDispNorm,  4,6, "pix");
		gd.addNumericField("Fronto tolerance",                                                                       this.plFrontoTol,  4,6,"pix",
				"Fronto tolerance (pix) - treat almost fronto planes as fronto (constant disparity). If <= 0 - disable this feature");
		gd.addNumericField("Fronto RMS",                                                                             this.plFrontoRms,  4,6,"pix",
				"Target half-thikness of the fronto planes. Similar to  sqrt(plMaxEigen) for other planes");
		gd.addNumericField("Fronto offset",                                                                          this.plFrontoOffs,  4,6,"pix",
				"Increasing weights of the near tiles by using difference between tile disparity and reduced by this value average as weight. If <= 0 - disable feature");
		gd.addNumericField("Fronto power",                                                                           this.PlFrontoPow,  4,6,"pix",
				"Increasing weights of the near tiles by even more (see previous parameter) by raising disparity difference to this power");
		gd.addNumericField("Blur disparity histograms for constant disparity clusters by this sigma (in bins)",             this.plBlurBinVert,  6);
		gd.addNumericField("Blur disparity histograms for horizontal clusters by this sigma (in bins)",                     this.plBlurBinHor,  6);
		gd.addNumericField("Maximal normalized disparity difference when initially assigning to vertical plane",            this.plMaxDiffVert,  6);
		gd.addNumericField("Maximal normalized disparity difference when initially assigning to horizontal plane",          this.plMaxDiffHor,  6);
		gd.addNumericField("Number of initial passes to assign tiles to vert (const disparity) and hor planes",             this.plInitPasses,  0);

		gd.addNumericField("Minimal number of points for plane detection",                                           this.plMinPoints,  0);
		gd.addNumericField("Remove outliers until main axis eigenvalue (possibly scaled by plDispNorm) gets below",           this.plTargetEigen,  6);
		gd.addNumericField("Maximal fraction of outliers to remove",                                                 this.plFractOutliers,  6);
		gd.addNumericField("Maximal number of outliers to remove",                                                   this.plMaxOutliers,  0);
		gd.addNumericField("Minimal total strength of a plane",                                                      this.plMinStrength,  6);
		gd.addNumericField("Maximal eigenvalue of a plane",                                                          this.plMaxEigen,  6);
		gd.addNumericField("Add to eigenvalues of each participating plane and result to validate connections",          this.plEigenFloor,  6);
		gd.addNumericField("Consider plane to be a \"stick\" if second eigenvalue is below",                         this.plEigenStick,  6);
		gd.addNumericField("Not a plate if sin^2 between normals from disparity and world exceeds this",             this.plBadPlate,  6);
		gd.addCheckbox    ("Combine 'other' plane with the current (unused)",                                        this.plDbgMerge);
		gd.addNumericField("Worst case worsening after merge",                                                       this.plWorstWorsening,  6);
		gd.addNumericField("Worst case worsening for thin planes",                                                   this.plWorstWorsening2,  6);
		gd.addNumericField("Worst case worsening after merge with equal weights",                                    this.plWorstEq,  6);
		gd.addNumericField("Worst case worsening for thin planes with equal weights",                                this.plWorstEq2,  6);
		gd.addNumericField("If result of the merged planes is below, OK to use thin planes (higher) threshold ",          this.plOKMergeEigen,  6);
		gd.addNumericField("Maximal sine squared of the world angle between planes to merge. Set to >= 1.0 to disable",           this.plMaxWorldSin2,  6);
		gd.addNumericField("Do not compare sin() between planes, if at least one has too small axis ratio",          this.pl2dForSin,  6);
		gd.addNumericField("Relax merge requirements for weaker planes",                                             this.plWeakWorsening,  6);
		gd.addNumericField("Maximal overlap between the same supertile planes to merge",                             this.plMaxOverlap,  6);

		gd.addTab         ("Merge", "Merge same supetile planes if at least one is weak and they do not differ much");
		gd.addMessage     ("--- Merge same supetile planes if at least one is weak and they do not differ much ---");
		gd.addNumericField("Maximal weight of the weak plane to merge (first variant)",                              this.plWeakWeight,  6);
		gd.addNumericField("Maximal eigenvalue of the result of non-weighted merge (first variant)",                 this.plWeakEigen,  6);
		gd.addNumericField("Maximal weight of the weak plane to merge (second variant)",                             this.plWeakWeight2,  6);
		gd.addNumericField("Maximal eigenvalue of the result of non-weighted merge (second variant)",                this.plWeakEigen2,  6);
		gd.addNumericField("Do not merge if any sqrt of merged eigenvalue exceeds scaled sum of components",           this.plSumThick,  6);
		gd.addNumericField("When calculating non-exclusive planes, do not use neighbors with high cost",             this.plNeNeibCost,  6);
		gd.addNumericField("When calculating non-exclusive planes, use cenrter plane relative weight",               this.plNeOwn,  6);
		gd.addNumericField("When calculating exclusive planes links, do not use neighbors with high cost",           this.plExNeibCost,  6);
		gd.addNumericField("Scale down maximal costs for smoothed planes links (tighter requirements)",              this.plExNeibSmooth,  6);
		gd.addNumericField("Cost threshold for merging same tile planes if the plane has connected neighbors",           this.plMergeCostStar,  6);
		gd.addNumericField("Cost threshold for merging same tile planes if not connected",                           this.plMergeCost,  6);

		gd.addMessage     ("--- Merging planes with topological conflicts ---");
		gd.addCheckbox    ("Try to merge conflicting planes",                                                               this.plConflMerge);
		gd.addNumericField("Scale parameters to relax planes fit for merging conflicting planes",                           this.plConflRelax,  6);
		gd.addCheckbox    ("Only merge conflicting planes if this is the only conflicting pair in the supertile",           this.plConflSngl);
		gd.addCheckbox    ("Only merge conflicting planes only if there are just two planes in the supertile",              this.plConflSnglPair);

		gd.addNumericField("Consider merging plane if it is foreground and maximal strength below this",                    this.plWeakFgStrength,  6);
		gd.addNumericField("Remove these strongest from foreground when determining the maximal strength",                  this.plWeakFgOutliers,  0);
		gd.addNumericField("Relax cost requirements when merging with weak foreground",                                     this.plWeakFgRelax,  6);

		gd.addNumericField("Maximal real-world thickness of merged overlapping planes (meters)",                            this.plThickWorld,  6);
		gd.addNumericField("Maximal real-world merged thickness for conflicting planes",                                    this.plThickWorldConfl,  6);
		gd.addNumericField("Relax cost requirements when adding exclusive links to complete squares and triangles",          this.plRelaxComplete,  6);
		gd.addNumericField("Relax cost requirements more during the second pass",                                           this.plRelaxComplete2,  6);

		gd.addMessage     ("---  ---");
		gd.addNumericField("Maximal ratio of Z to allow plane merging",                                              this.plMaxZRatio,  6);
		gd.addNumericField("Maximal disparity of one of the planes to apply  maximal ratio",                         this.plMaxDisp,  6);
		gd.addNumericField("When merging with neighbors cut the tail that is worse than scaled best",                this.plCutTail,  6);
		gd.addNumericField("Set cutoff value level not less than this",                                              this.plMinTail,  6);


		gd.addTab         ("Regenerate", "Parameters to regenerate planes using preliminary tile connections");
		gd.addMessage     ("--- Parameters to regenerate planes using preliminary tile connections  ---");
		gd.addCheckbox    ("Enable planes tiles selection regeneration hinted by supertile neighbors",               this.plDiscrEn);
		gd.addNumericField("Maximal disparity difference from the plane to consider tile",                           this.plDiscrTolerance,  6);
		gd.addNumericField("Parallel move known planes around original know value for the best overall fit",          this.plDiscrDispRange,  6);
		gd.addNumericField("Number of steps (each direction) for each plane to search for the best fit (0 - single, 1 - 1 each side)",          this.plDiscrSteps,  0);
		gd.addNumericField("What plane to use as a hint: 0 - weighted, 1 - equalized, 2 - best, 3 - combined",           this.plDiscrMode,  0);
		gd.addNumericField("Squared add to variance to calculate reverse flatness (used mostly for single-cell clusters)",          this.plDiscrVarFloor,  6);
		gd.addNumericField("Gaussian sigma to compare how measured data is attracted to planes",                     this.plDiscrSigma,  6);
		gd.addNumericField("Sigma to blur histograms while re-discriminating",                                       this.plDiscrBlur,  6);
		gd.addNumericField("Tile exclusivity: 1.0 - tile belongs to one plane only, 0.0 - regardless of others",          this.plDiscrExclusivity,  6);
		gd.addNumericField("For second pass if exclusivity > 1.0 - will assign only around strong neighbors",          this.plDiscrExclus2,  6);
		gd.addCheckbox    ("When growing selection do not allow any offenders around (false - more these than others)",           this.plDiscrStrict);
		gd.addNumericField("Attraction to different planes correlation that is too high for re-discrimination",          this.plDiscrCorrMax,  6);
		gd.addNumericField("Attraction to different planes correlation that is high enough to merge",                this.plDiscrCorrMerge,  6);
		gd.addNumericField("If offender has this number of tiles (including center) the cell can not be used",           this.plDiscrSteal,  0);
		gd.addNumericField("Only use tiles within this range from original selection",                               this.plDiscrGrown,  0);
		gd.addNumericField("Remove outliers from the final selection that have distance more than scaled median",          this.plDiscrXMedian,  6);

		gd.addTab         ("Merge costs", "Planes merge costs");
		gd.addMessage     ("--- Planes merge costs ---");
		gd.addNumericField(" Disparity (pix) - closer cost will use more of the real world, farther - disparity",          this.plCostDist,  6);
		gd.addNumericField("Cost of merge quality sqrt(weighted*equal) in disparity space",                          this.plCostKrq,     6);
		gd.addNumericField("Cost of merge quality average of weighted and equal weight in disparity space",          this.plCostKrqEq,   6);
		gd.addNumericField("Cost of merge quality sqrt(weighted*equal) in world space",                              this.plCostWrq,     6);
		gd.addNumericField("Cost of merge quality average of weighted and equal weight in world space",              this.plCostWrqEq,   6);
		gd.addNumericField("Cost of sin squared between normals",                                                    this.plCostSin2,    6);
		gd.addNumericField("Cost of squared relative plane-to-other-center distances",                               this.plCostRdist2,  6);

		gd.addCheckbox    ("Resolve dual triangles conflict (odoodo)",                                               this.plConflDualTri);
		gd.addCheckbox    ("Resolve multiple odo triangles conflicts",                                               this.plConflMulti);
		gd.addCheckbox    ("Resolve diagonal (ood) conflicts",                                                       this.plConflDiag);
		gd.addCheckbox    ("Resolve all conflicts around a supertile",                                               this.plConflStar);
		gd.addNumericField("How far to look around when calculationg connection cost",                               this.plStarSteps,  0);
		gd.addNumericField("When calculating cost for the connections scale 4 ortho neighbors",                      this.plStarOrtho,  6);
		gd.addNumericField("When calculating cost for the connections scale 4 diagonal neighbors",                   this.plStarDiag,  6);
		gd.addNumericField("Divide cost by number of connections to this power",                                     this.plStarPwr,  6);
		gd.addNumericField("Use this power of tile weight when calculating connection cost",                         this.plStarWeightPwr,  6);
		gd.addNumericField("Balance weighted density against density. 0.0 - density, 1.0 - weighted density",           this.plWeightToDens,  6);
		gd.addNumericField("Raise value of each tile before averaging",                                              this.plStarValPwr,  6);
		gd.addNumericField("When resolving double triangles allow minor degradation (0.0 - strict)",                 this.plDblTriLoss,  6);
		gd.addCheckbox    ("Allow more conflicts if overall cost is reduced",                                        this.plNewConfl);
		gd.addNumericField("aximal number of simultaneous connection changes around one tile (0 - any)",             this.plMaxChanges,  0);

		gd.addCheckbox    ("Keep only mutual links, remove weakest if conflict",                                     this.plMutualOnly);

		gd.addCheckbox    ("Add diagonals to full squares",                                                          this.plFillSquares);
		gd.addCheckbox    ("Add ortho to 45-degree corners",                                                         this.plCutCorners);
		gd.addCheckbox    ("Add hypotenuse connection if both legs exist",                                           this.plHypotenuse);

		gd.addNumericField("Relative (to average neighbor) weight of the measured plane when combing with neighbors",               this.plPull,  6);
		gd.addNumericField("0.0: 8 neighbors pull 8 times as 1, 1.0 - same as 1",                                    this.plNormPow,  6);
		gd.addNumericField("Maximal number of smoothing iterations for each step",                                   this.plIterations,  0);
		gd.addCheckbox    ("Do not update supertile if any of connected is not good (false: just skip that neighbor)",           this.plStopBad);
		gd.addNumericField("Maximal step difference (1/power of 10)",                                                this.plPrecision,  0);

		gd.addNumericField("Relative weight of center plane when splitting into pairs",                              this.plSplitPull,  6);
		gd.addNumericField("Minimal number of neighbors to split plane in pairs",                                    this.plSplitMinNeib,  0);
		gd.addNumericField("Minimal weight of split plains to show",                                                 this.plSplitMinWeight,  6);
		gd.addNumericField("Minimal split quality to show",                                                          this.plSplitMinQuality,  6);
		gd.addCheckbox    ("Apply plane split to pairs",                                                             this.plSplitApply);
		gd.addCheckbox    ("Allow tiles to belong to both planes of the pair",                                       this.plNonExclusive);
		gd.addCheckbox    ("Allow other tiles from the same supertile",                                              this.plUseOtherPlanes);
		gd.addCheckbox    ("Allow parallel shift of the specified planes before adding",                             this.plAllowParallel);
		gd.addNumericField("Maximal normalized tile disparity difference from the plane to consider",                this.plMaxDiff,  6);
		gd.addNumericField("Maximal difference of the added tile ratio to the average  disparity difference",          this.plOtherDiff,  6);
		gd.addCheckbox    ("Separate tiles for split planes by X, Y",                                                this.plSplitXY);
		gd.addNumericField("Disparity tolerance when separating by X, Y",                                            this.plSplitXYTolerance,  6);

		gd.addCheckbox    ("Fuse planes together (off for debug only)",                                              this.plFuse);
		gd.addCheckbox    ("Keep unconnected supertiles",                                                            this.plKeepOrphans);
		gd.addNumericField("Minimal strength unconnected supertiles to keep",                                        this.plMinOrphan,  6);

		gd.addTab         ("Snap", "Snap to planes");
		gd.addMessage     ("--- Snap to planes ---");
		gd.addNumericField("Maximal (scaled by plDispNorm) disparity difference to snap to plane at any strength",               this.plSnapDispAny,  6);
		gd.addNumericField("Maximal strength to fit any distance (if does not fit otherwise - treat as zero strength",           this.plSnapStrengthAny,  6);
		gd.addNumericField("Maximal negative disparity difference from the best match",                              this.plSnapNegAny,  6);
		gd.addNumericField("Maximal (scaled by plDispNorm) disparity difference to snap to plane at low strength",               this.plSnapDispMax,  6);
		gd.addNumericField("Maximal disparity diff. by weight product to snap to plane",                             this.plSnapDispWeight,  6);
		gd.addNumericField("Zero strength snap mode: 0: no special treatment, 1 - strongest, 2 - farthest",          this.plSnapZeroMode,  0);

		gd.addCheckbox    ("Use planes selection masks (generated when splitting to intersecting pairs",             this.msUseSel);
		gd.addCheckbox    ("Divide plane strengths by ellipsoid area",                                               this.msDivideByArea);
		gd.addNumericField("Scale projection of the plane ellipsoid",                                                this.msScaleProj,  6);
		gd.addNumericField("Spread this fraction of the ellipsoid weight among extended (double) supertile",          this.msFractUni,  6);

		gd.addTab         ("Assign", "Tiles assignment");
		gd.addMessage     ("--- Tiles assignment ---");
		gd.addCheckbox    ("Do not assign tiles to the surface edges (not having all 8 neighbors)",                     this.tsNoEdge);
		gd.addCheckbox    ("Only assign outside of 8x8 center if no suitable alternative",                              this.tsUseCenter);
		gd.addNumericField("Maximal disparity difference when assigning tiles",                                         this.tsMaxDiff,  6);
		gd.addNumericField("Minimal disparity difference to be considered as a competitor surface",                     this.tsMinDiffOther,  6);
		gd.addNumericField("Minimal tile correlation strength to be assigned",                                          this.tsMinStrength,  6);
		gd.addNumericField("Maximal tile correlation strength to be assigned",                                          this.tsMaxStrength,  6);
		gd.addNumericField("Minimal surface strength at the tile location",                                             this.tsMinSurface,  6);
		gd.addNumericField("Allowed tile disparity correction: 1 increase, 2 - decrease, 3 - both directions",          this.tsMoveDirs,  0);
		gd.addNumericField("Raise surface strengths ratio to this power when comparing candidates",                     this.tsSurfStrPow,  6);
		gd.addNumericField("Add to strengths when calculating pull of assigned tiles",                                  this.tsAddStrength,  6);
		gd.addNumericField("Radius of influence (in tiles) of the previously assigned tiles",                           this.tsSigma,  6);
		gd.addNumericField("Maximal relative to radius distance to calculate influence",                                this.tsNSigma,  6);
		gd.addNumericField(" Additional pull of each surface ",                                                         this.tsMinPull,  6);
		gd.addNumericField("Minimal ratio of the best surface candidate to the next one to make selection",             this.tsMinAdvantage,  6);

		gd.addNumericField("Minimal size of a cluster to keep",                                                         this.tsClustSize,  0);
		gd.addNumericField("Minimal total weight of a cluster to keep",                                                 this.tsClustWeight,  6);
		gd.addNumericField("Minimal number of neighbors of unassigned tile to join (the farthest)",                     this.tsMinNeib,  0);
		gd.addNumericField("Maximal strength of the surrounded unassigned tile to join",                                this.tsMaxSurStrength,  6);
		gd.addCheckbox    ("Include disabled tiles/borders when counting assigned neighbors",                           this.tsCountDis);

		gd.addCheckbox    ("Assign tiles that were used to generate planes",                                            this.tsEnPlaneSeed);
		gd.addCheckbox    ("Allow assignment only surface",                                                             this.tsEnOnly);
		gd.addCheckbox    ("Grow the only surface assignments",                                                         this.tsEnGrow);
		gd.addNumericField("Maximal strength when growing the only surfaces",                                           this.tsGrowStrength,  6);
		gd.addCheckbox    ("Grow over strong if disparity matches",                                                     this.tsGrowStrong);
		gd.addNumericField("Minimal strength to continue grow with disparity match",                                    this.tsContStrength,  6);
		gd.addNumericField("Maximal normalized disparity error to grow over strong tiles",                              this.tsContDiff,  6);

		gd.addCheckbox    ("Allow assignment to the nearest surface with no competitors",                               this.tsEnSingle);
		gd.addCheckbox    ("Allow assignment when several surfaces fit",                                                this.tsEnMulti);
		gd.addCheckbox    ("Remove weak clusters before growing",                                                       this.tsRemoveWeak1);
		gd.addCheckbox    ("Assign tiles that have neighbors to the lowest disparity",                                  this.tsGrowSurround);
		gd.addCheckbox    ("Remove weak clusters after growing",                                                        this.tsRemoveWeak2);

		gd.addCheckbox    ("Repeat multi-choice assignment while succeeding",                                           this.tsLoopMulti);
		gd.addCheckbox    ("Show results of tiles to surfaces assignment",                                              this.tsShow);
		gd.addNumericField("Number of clusters to keep",                                                                this.tsNumClust,  0);

		gd.addNumericField("Which assignments to match +1 - combo, +2 grown single, +4 plane seeds",                    this.tsConsensMode,  0);
		gd.addNumericField("Minimal number of assignments to agree",                                                    this.tsConsensAgree,  0);

		gd.addMessage     ("--- Tile assignment parameters ---");
		gd.addNumericField("Minimal foreground/ background separation to look for weak FG edge",                        this.taMinFgBg,    6);
		gd.addNumericField("Minimal foreground edge strength (stronger edges will have proportionally smaller costs)",           this.taMinFgEdge,  6);
		gd.addNumericField("Minimal surface separation that requires color change",                                     this.taMinColSep,  6);
		gd.addNumericField("Minimal color variation (larger proportionally reduces cost)",                              this.taMinColDiff, 6);
		gd.addNumericField("Disparity difference limit (to handle outliers)",                                           this.taOutlier, 6);
		gd.addNumericField("Strength power when calculating disparity error",                                           this.taDiffPwr, 6);
		gd.addNumericField("Strength power when calculating disparity error over best",                                 this.taBestPwr, 6);
		gd.addNumericField("Strength power when calculating disparity error for group of 9",                            this.taDiff9Pwr, 6);
		gd.addNumericField("Gaussian sigma to blur color difference between tiles along each direction",                this.taColSigma, 6);
		gd.addNumericField("Relative amount of the blurred color difference in the mixture",                            this.taColFraction, 6);

		gd.addNumericField("Cost of a tile that is not assigned",                                                       this.taCostEmpty,  6);
		gd.addNumericField("Cost of a tile not having any neighbor in particular direction",                            this.taCostNoLink,  6);
		gd.addNumericField("Cost of a tile switching to a neighbor that does not have a link",                          this.taCostSwitch,  6);
		gd.addNumericField("Cost of a tile switching to a disconnected neighbor divided by a color",                    this.taCostColor,  6);
		gd.addNumericField("Cost of a weighted normalized tile disparity error",                                        this.taCostDiff,  6);
		gd.addNumericField("Cost of a weighted normalized tile disparity error above best surface",                     this.taCostDiffBest,  6);
		gd.addNumericField("Cost of a weighted normalized tile disparity error for tile and 8 neighbors (DC)",          this.taCostDiff9,  6);
		gd.addNumericField("Cost of a weak foreground edge",                                                            this.taCostWeakFgnd,  6);
		gd.addNumericField("Cost of using supertile \"flaps\" (not in the center 8x8 tiles area)",                      this.taCostFlaps,  6);
		gd.addNumericField("Cost of a measurement layer not having same layer in the same location or near",            this.taCostMismatch,  6);

		gd.addCheckbox    ("Cost of a tile that is not assigned",                                                       this.taEnEmpty);
		gd.addCheckbox    ("Cost of a tile not having any neighbor in particular direction",                            this.taEnNoLink);
		gd.addCheckbox    ("Cost of a tile switching to a neighbor that does not have a link",                          this.taEnSwitch);
		gd.addCheckbox    ("Cost of a tile switching to a disconnected neighbor divided by a color",                    this.taEnColor);
		gd.addCheckbox    ("Cost of a weighted normalized tile disparity error",                                        this.taEnDiff);
		gd.addCheckbox    ("Cost of a weighted normalized tile disparity error above best surface",                     this.taEnDiffBest);
		gd.addCheckbox    ("Cost of a weighted normalized tile disparity error for tile and 8 neighbors (DC)",          this.taEnDiff9);
		gd.addCheckbox    ("Cost of a weak foreground edge",                                                            this.taEnWeakFgnd);
		gd.addCheckbox    ("Cost of using supertile \"flaps\" (not in the center 8x8 tiles area)",                      this.taEnFlaps);
		gd.addCheckbox    ("Cost of a measurement layer not having same layer in the same location or near",            this.taEnMismatch);

		gd.addTab         ("GPU", "Parameters for GPU development");
		gd.addMessage     ("--- GPU processing parameters ---");
		gd.addNumericField("GPU 2D correlation scale",                                                                  this.gpu_corr_scale, 4, 6,"",
				"Reduce GPU-generated correlation values to approximately match CPU-generated ones");
		gd.addNumericField("Correlation radius",                                                                        this.gpu_corr_rad, 0, 6,"pix",
				"Size of the 2D correlation - maximal radius = 7 corresponds to full 15x15 pixel tile");
		gd.addNumericField("Correlation weight R",                                                                      this.gpu_weight_r, 4, 6,"",
				"Weight of R for composite 2D correlation (green weight is 1.0 -gpu_weight_r - gpu_weight_b");
		gd.addNumericField("Correlation weight B",                                                                      this.gpu_weight_b, 4, 6,"",
				"Weight of R for composite 2D correlation (green weight is 1.0 -gpu_weight_r - gpu_weight_b");
		gd.addMessage     ("--- LPF sigmas used for images/textures ---");
		gd.addNumericField("Color LPF sigma R",                                                                         this.gpu_sigma_r, 4, 6,"pix",
				"LPF sigma to process color components during aberration correction");
		gd.addNumericField("Color LPF sigma B",                                                                         this.gpu_sigma_b, 4, 6,"pix",
				"LPF sigma to process color components during aberration correction");
		gd.addNumericField("Color LPF sigma G",                                                                         this.gpu_sigma_g, 4, 6,"pix",
				"LPF sigma to process color components during aberration correction");
		gd.addNumericField("Monochrome LPF sigma",                                                                      this.gpu_sigma_m, 4, 6,"pix",
				"LPF sigma to process monochrome (e.g.LWIR) during aberration correction");
		gd.addMessage     ("--- LPF sigmas used for 2D phase correlation ---");
		gd.addNumericField("LPF sigma Red/Blue (extra)",                                                                this.gpu_sigma_rb_corr, 4, 6,"pix",
				"LPF sigma to apply to the composite R+B 2D correlation before adding G (next LPF will be applied to R+B+G correlation");
		gd.addNumericField("LPF sigma for correlation, color",                                                          this.gpu_sigma_corr, 4, 6,"pix",
				"LPF sigma to apply to the composite 2D correlation for RGB images");
		gd.addNumericField("LPF sigma for correlation, mono",                                                           this.gpu_sigma_corr_m, 4, 6,"pix",
				"LPF sigma to apply to the composite 2D correlation for monochrome images");

		gd.addNumericField("LoG sigma for correlation, color",                                                          this.gpu_sigma_log_corr, 4, 6,"pix",
				"Use LoG filter to reduce dynamic range of the correlation input to fit into float range");
		gd.addNumericField("LoG sigma for correlation, mono",                                                           this.gpu_sigma_log_corr_m, 4, 6,"pix",
				"Use LoG filter to reduce dynamic range of the correlation input to fit into float range");
		
		gd.addNumericField("Fat zero (absolute) for phase correlation of color images",                                 this.gpu_fatz, 4, 6,"",
				"Add squared fat zero to the sum of squared amplitudes, color images");
		gd.addNumericField("Fat zero (absolute) for phase correlation of monochrome images",                            this.gpu_fatz_m, 4, 6,"",
				"Add squared fat zero to the sum of squared amplitudes, monochrome images");
		gd.addMessage     ("--- GPU WOI selection ---");

		gd.addCheckbox    ("Use following WOI for GPU processing (unchecked - ignore WOI dimensions)",                  this.gpu_woi);

		gd.addNumericField("WOI left",                                                                                  this.gpu_woi_tx, 0, 6,"tiles",
				"Left WOI margin, in tiles (0..323");
		gd.addNumericField("WOI top",                                                                                   this.gpu_woi_ty, 0, 6,"tiles",
				"Top WOI margin, in tiles (0..241");
		gd.addNumericField("WOI width",                                                                                 this.gpu_woi_twidth, 0, 6,"tiles",
				"WOI width, in tiles (1..324");
		gd.addNumericField("WOI height",                                                                                this.gpu_woi_theight, 0, 6,"tiles",
				"WOI height, in tiles (1..242");
		gd.addCheckbox    ("Select circle/ellipse within the rectanghular WOI",                                         this.gpu_woi_round);
		gd.addCheckbox    ("Debug feature - save calculated ports X,Y to compare with Java-generated",                  this.gpu_save_ports_xy);
		gd.addCheckbox    ("Show Java-generated textures from non-overlapping in GPU (will not generate if false)",     this.gpu_show_jtextures);
		gd.addCheckbox    ("Show low-res data for macro (will not generate if false)",                                  this.gpu_show_extra);
		gd.addCheckbox    ("Show per-tile geometry corrected tile coordinates and disparity derivatives",               this.gpu_show_geometry);

		gd.addCheckbox    ("Accelerate tile processor for the main quad camera",                                        this.gpu_use_main);
		gd.addCheckbox    ("Accelerate tile processor for the main quad camera in macro mode",                          this.gpu_use_main_macro);
		gd.addCheckbox    ("Accelerate tile processor for the main quad camera for field calibration",                  this.gpu_use_main_adjust);
		gd.addCheckbox    ("Accelerate tile processor for the aux (lwir) quad camera",                                  this.gpu_use_aux);
		gd.addCheckbox    ("Accelerate tile processor for the aux (lwir) quad camera in macro mode",                    this.gpu_use_aux_macro);
		gd.addCheckbox    ("Accelerate tile processor for the aux (lwir) quad camera for field calibration",            this.gpu_use_aux_adjust);
		gd.addCheckbox    ("Debug multi-tile TD accumulation",                                                          this.gpu_debug_accum);
		
		gd.addTab         ("LWIR", "parameters for LWIR/EO 8-camera rig");
		this.lwir.dialogQuestions(gd);
		
		
		gd.addTab         ("O-Flow", "parameters for the interscene Optical FLow calculations");
		this.ofp.dialogQuestions(gd);

		gd.addTab         ("Inter-LMA", "parameters for the interscene LMA fitting");
		this.ilp.dialogQuestions(gd);
		
		gd.addTab         ("Inter-Noise", "parameters for the interscene noise testing");
		this.inp.dialogQuestions(gd);
		
		gd.addTab         ("Debug", "Other debug images");
		gd.addMessage     ("--- Other debug images ---");
		//	clt_parameters.debug_initial_discriminate, // final boolean    debug_initial_discriminate,
		gd.addCheckbox    ("Debug initial clusterization of the supertile tiles",                                    this.debug_initial_discriminate);
		gd.addCheckbox    ("Test new mode after migration",                                                          this.dbg_migrate);

		gd.addNumericField("Temporay exit stage (0- normal execution)",                                              this.dbg_early_exit,  0,6,"","Temporary exit at intermediate stage (0 - normal)");
		gd.addCheckbox    ("Show first infinity scan",                                                               this.show_first_bg, "Show results of the first calculated background scan");

		gd.addCheckbox    ("Show interframe processing",                                                             this.show_interframe, "Debugging interframe functionality");
		gd.addCheckbox    ("Show DSI filtering by LY clusters",                                                      this.show_filter_ly, "Filtering DSI by comparing with clusters prepared for LY adjustment");
		gd.addCheckbox    ("Show extrinsic adjustment differences",                                                  this.show_extrinsic);
		gd.addCheckbox    ("Show 'ortho_combine'",                                                                   this.show_ortho_combine);
		gd.addCheckbox    ("Show 'refine_disparity_supertiles'",                                                     this.show_refine_supertiles);
		gd.addCheckbox    ("Show 'bgnd_nonbgnd'",                                                                    this.show_bgnd_nonbgnd);
		gd.addCheckbox    ("Show 'FilterScan'",                                                                      this.show_filter_scan);
		gd.addCheckbox    ("Show 'combo_scan' (combined multiple scans)",                                            this.show_combined);
		gd.addCheckbox    ("Show 'unique_scan' (removed already measured tiles with the same disparity)",            this.show_unique);
		gd.addCheckbox    ("Show supertile disparity histograms ",                                                   this.show_histograms);
		gd.addCheckbox    ("Show debug images during initial refinement",                                            this.show_init_refine,"Show debug images during initial refinement");
		gd.addCheckbox    ("Show debug images during disparity expansion",                                           this.show_expand);
		gd.addCheckbox    ("Show prepareExpandVariant when elevating variant",                                       this.show_variant);
		gd.addCheckbox    ("Show debug images related to retrying far tiles near foreground",                        this.show_retry_far);
		gd.addCheckbox    ("Show debug images related to macro correlation",                                         this.show_macro);
		gd.addCheckbox    ("Show 'shells'",                                                                          this.show_shells);
		gd.addCheckbox    ("show 'neighbors'",                                                                       this.show_neighbors);
		gd.addCheckbox    ("Show 'flaps-dirs'",                                                                      this.show_flaps_dirs);
		gd.addCheckbox    ("Show 'first_N_clusters'",                                                                this.show_first_clusters);
		gd.addCheckbox    ("Show planes",                                                                            this.show_planes);

		gd.addMessage     ("Unity up vector in camera coordinate system (x - right, y - up, z - to camera): {"+
				this.vertical_xyz[0]+","+          this.vertical_xyz[1]+","+          this.vertical_xyz[2]+"}");


		//  			gd.buildDialog();
		gd.showDialog();
		//  			System.out.println("gd.wasCanceled="+gd.wasCanceled());
		/*
  			if (true) return false;
  			WindowTools.addScrollBars(gd);
  			gd.showDialog();
		 */
		if (gd.wasCanceled()) return false;
		this.disparity=             gd.getNextNumber();
		this.transform_size=  (int) gd.getNextNumber();
		this.clt_window=      (int) gd.getNextNumber();
		this.shift_x =              gd.getNextNumber();
		this.shift_y =              gd.getNextNumber();

		this.tileStep=        (int) gd.getNextNumber();
		this.super_radius=    (int) gd.getNextNumber();
		this.iclt_mask=       (int) gd.getNextNumber();
		this.tileX=           (int) gd.getNextNumber();
		this.tileY=           (int) gd.getNextNumber();
		this.dbg_mode=        (int) gd.getNextNumber();
		this.ishift_x=        (int) gd.getNextNumber();
		this.ishift_y=        (int) gd.getNextNumber();
		this.fat_zero =             gd.getNextNumber();
		this.fat_zero_mono =        gd.getNextNumber();
		this.corr_sigma =           gd.getNextNumber();
		this.corr_sigma_mono =      gd.getNextNumber();
		this.texture_sigma =        gd.getNextNumber();
		this.texture_sigma_mono =   gd.getNextNumber();
		this.scale_strength_main =  gd.getNextNumber();
		this.scale_strength_aux =   gd.getNextNumber();
		this.norm_kern=             gd.getNextBoolean();
		this.gain_equalize=         gd.getNextBoolean();
		this.colors_equalize=       gd.getNextBoolean();
		this.nosat_equalize=        gd.getNextBoolean();
		this.sat_level=             gd.getNextNumber();
		this.max_overexposure=      gd.getNextNumber();

		this.novignetting_r=        gd.getNextNumber();
		this.novignetting_g=        gd.getNextNumber();
		this.novignetting_b=        gd.getNextNumber();
		this.scale_r=               gd.getNextNumber();
		this.scale_g=               gd.getNextNumber();
		this.scale_b=               gd.getNextNumber();
		this.vignetting_max=        gd.getNextNumber();
		this.vignetting_range=      gd.getNextNumber();
		this.kernel_step=     (int) gd.getNextNumber();
		this.z_correction=          gd.getNextNumber();
		this.correlate=             gd.getNextBoolean();
		this.correlate_lma=         gd.getNextBoolean();
		this.corr_mask=       (int) gd.getNextNumber();
		this.corr_sym=              gd.getNextBoolean();
		this.corr_keep=             gd.getNextBoolean();
		this.corr_show=             gd.getNextBoolean();
		this.corr_mismatch=         gd.getNextBoolean();
		this.corr_offset=           gd.getNextNumber();
		this.corr_red=              gd.getNextNumber();
		this.corr_blue=             gd.getNextNumber();
		this.corr_normalize=        gd.getNextBoolean();
		this.min_corr=              gd.getNextNumber();
		this.min_corr_normalized=   gd.getNextNumber();
		this.max_corr_sigma=        gd.getNextNumber();
		this.max_corr_radius=       gd.getNextNumber();
		this.corr_magic_scale=      gd.getNextNumber();
		this.corr_select =    (int) gd.getNextNumber();


		this.img_dtt.dialogAnswers(gd);
		this.rig.dialogAnswers(gd);
		this.poles.dialogAnswers(gd);

		this.max_corr_double=       gd.getNextBoolean();
		this.corr_mode=       (int) gd.getNextNumber();
		this.corr_border_contrast=  gd.getNextNumber();

		//  			          this.tile_task_op=    (int) gd.getNextNumber();
		this.tile_task_op = ImageDtt.setOrthoLines      (          this.tile_task_op, gd.getNextBoolean());
		this.tile_task_op = ImageDtt.setForcedDisparity (          this.tile_task_op, gd.getNextBoolean());
		this.tile_task_op = ImageDtt.setImgMask         (          this.tile_task_op, (int) gd.getNextNumber());
		this.tile_task_op = ImageDtt.setPairMask        (          this.tile_task_op, (int) gd.getNextNumber());

		this.tile_task_wl=    (int) gd.getNextNumber();
		this.tile_task_wt=    (int) gd.getNextNumber();
		this.tile_task_ww=    (int) gd.getNextNumber();
		this.tile_task_wh=    (int) gd.getNextNumber();
		this.min_shot=              gd.getNextNumber();
		this.scale_shot=            gd.getNextNumber();
		this.diff_sigma=            gd.getNextNumber();
		this.diff_threshold=        gd.getNextNumber();
		this.diff_gauss=            gd.getNextBoolean();
		this.min_agree=             gd.getNextNumber();
		this.dust_remove=           gd.getNextBoolean();
		this.black_back=            gd.getNextBoolean();
		this.keep_weights=          gd.getNextBoolean();
		this.sharp_alpha=           gd.getNextBoolean();
		this.alpha0=                gd.getNextNumber();
		this.alpha1=                gd.getNextNumber();
		this.gen_chn_stacks=        gd.getNextBoolean();
		this.gen_chn_img=           gd.getNextBoolean();
		this.gen_4_img=             gd.getNextBoolean();
		this.show_nonoverlap=       gd.getNextBoolean();
		this.show_overlap=          gd.getNextBoolean();
		this.show_rgba_color=       gd.getNextBoolean();
		this.show_map=              gd.getNextBoolean();
		this.show_corr=             gd.getNextBoolean();
		this.disp_scan_start=       gd.getNextNumber();
		this.disp_scan_step=        gd.getNextNumber();
		this.disp_scan_count= (int) gd.getNextNumber();

		this.fine_dbg=              gd.getNextBoolean();
		this.fine_corr_x_0=         gd.getNextNumber();
		this.fine_corr_y_0=         gd.getNextNumber();
		this.fine_corr_x_1=         gd.getNextNumber();
		this.fine_corr_y_1=         gd.getNextNumber();
		this.fine_corr_x_2=         gd.getNextNumber();
		this.fine_corr_y_2=         gd.getNextNumber();
		this.fine_corr_x_3=         gd.getNextNumber();
		this.fine_corr_y_3=         gd.getNextNumber();
		this.fine_corr_ignore=      gd.getNextBoolean();
		this.fine_corr_apply=       gd.getNextBoolean();

		this.fcorr_radius=          gd.getNextNumber();
		this.fcorr_min_strength=    gd.getNextNumber();
		this.fcorr_disp_diff=       gd.getNextNumber();
		this.fcorr_quadratic=       gd.getNextBoolean();
		this.fcorr_ignore=          gd.getNextBoolean();

		this.fcorr_inf_strength=    gd.getNextNumber();
		this.fcorr_inf_diff=        gd.getNextNumber();
		this.fcorr_inf_quad=        gd.getNextBoolean();
		this.fcorr_inf_vert=        gd.getNextBoolean();

		this.inf_disp_apply=        gd.getNextBoolean();
		this.inf_repeat=      (int) gd.getNextNumber();
		this.inf_iters=       (int) gd.getNextNumber();
		this.inf_final_diff=        gd.getNextNumber();
		this.inf_far_pull=          gd.getNextNumber();

		this.inf_str_pow=           gd.getNextNumber();
		this.inf_smpl_side=   (int) gd.getNextNumber();
		this.inf_smpl_num=    (int) gd.getNextNumber();
		this.inf_smpl_rms=          gd.getNextNumber();

		this.ih_smpl_step=    (int) gd.getNextNumber();
		this.ih_disp_min=           gd.getNextNumber();
		this.ih_disp_step=          gd.getNextNumber();
		this.ih_num_bins=     (int) gd.getNextNumber();
		this.ih_sigma=              gd.getNextNumber();
		this.ih_max_diff=           gd.getNextNumber();
		this.ih_min_samples=  (int) gd.getNextNumber();
		this.ih_norm_center=        gd.getNextBoolean();
		this.inf_restore_disp=      gd.getNextBoolean();
		
		this.intra_keep_strength=                gd.getNextNumber();
		this.intra_keep_conditional_strength=    gd.getNextNumber();
		this.intra_absolute_disparity_tolerance= gd.getNextNumber();
		this.intra_relative_disparity_tolerance= gd.getNextNumber();
		this.intra_cluster_size=           (int) gd.getNextNumber();

		this.ly_lma_ers =           gd.getNextBoolean();
		this.ly_gt_strength=        gd.getNextNumber();
		this.ly_gt_use_wnd=         gd.getNextBoolean();
		this.ly_gt_rms=             gd.getNextNumber();

		this.lylw_inf_en =          gd.getNextBoolean();
		this.lylw_aztilt_en =       gd.getNextBoolean();
		this.lylw_diff_roll_en =    gd.getNextBoolean();
		this.lylw_focalLength =     gd.getNextBoolean();
		this.lylw_com_roll =        gd.getNextBoolean();
		this.lylw_par_sel=    (int) gd.getNextNumber();

		this.ly_marg_fract=         gd.getNextNumber();
		this.ly_rad_to_hdiag=       gd.getNextNumber();
		this.ly_on_scan=            gd.getNextBoolean();
		this.ly_inf_en=             gd.getNextBoolean();
		this.ly_min_forced=   (int) gd.getNextNumber();
		this.ly_aztilt_en=          gd.getNextBoolean();
		this.ly_diff_roll_en=       gd.getNextBoolean();
		this.ly_focalLength=        gd.getNextBoolean();
		this.ly_com_roll=           gd.getNextBoolean();
		this.ly_ers_rot=            gd.getNextBoolean();
		this.ly_ers_forw=           gd.getNextBoolean();
		this.ly_ers_side=           gd.getNextBoolean();
		this.ly_ers_vert=           gd.getNextBoolean();
		this.ly_par_sel=      (int) gd.getNextNumber();
		
		this.ly_weight_infinity=     gd.getNextNumber();
		this.ly_weight_disparity=    gd.getNextNumber();
		this.ly_weight_disparity_inf=gd.getNextNumber();
		this.ly_max_disparity_far=   gd.getNextNumber();
		this.ly_max_disparity_use=   gd.getNextNumber();
		
		this.ly_inf_min_dfe=         gd.getNextNumber();
		this.ly_inf_max_dfe=         gd.getNextNumber();
		this.ly_inf_force_fine=      gd.getNextBoolean();
		this.ly_inf_min_broad=       gd.getNextNumber();
		this.ly_inf_max_broad=       gd.getNextNumber();
		this.ly_inf_min_narrow=      gd.getNextNumber();
		this.ly_inf_max_narrow=      gd.getNextNumber();
		
		this.ly_moving_en=           gd.getNextBoolean();
		this.ly_moving_apply=        gd.getNextBoolean();
		this.ly_moving_sigma=        gd.getNextNumber();
		this.ly_max_mov_disparity=   gd.getNextNumber();
		this.ly_rad_to_hdiag_mov=    gd.getNextNumber();
		this.ly_max_mov_average=     gd.getNextNumber();
		this.ly_mov_min_L2=          gd.getNextNumber();
		
		this.ly_debug_level=  (int) gd.getNextNumber();

		this.ly_right_left=         gd.getNextBoolean();
		this.ly_inf_tilt=           gd.getNextBoolean();

		this.ly_per_quad=     (int) gd.getNextNumber();
		this.ly_per_quad_r=         gd.getNextNumber();
		this.ly_inf=          (int) gd.getNextNumber();
		this.ly_inf_r=              gd.getNextNumber();
		this.ly_inf_scale=    (int) gd.getNextNumber();
		this.ly_inf_scale_r=        gd.getNextNumber();

		this.ly_inf_frac=           gd.getNextNumber();
		this.ly_inf_max_disparity=  gd.getNextNumber();

		this.ly_inf_disp=           gd.getNextBoolean();
		this.ly_inf_force=          gd.getNextBoolean();
		this.ly_poly=               gd.getNextBoolean();

		this.ly_smpl_side=    (int) gd.getNextNumber();
		this.ly_smpl_num=     (int) gd.getNextNumber();
		this.ly_smpl_rms=           gd.getNextNumber();
		this.ly_disp_var=           gd.getNextNumber();
		this.ly_disp_rvar=          gd.getNextNumber();
		this.ly_disp_var_gt=        gd.getNextNumber();
		this.ly_disp_rvar_gt=       gd.getNextNumber();
		this.ly_norm_disp=          gd.getNextNumber();
		
		this.lym_dbg_path =         gd.getNextString();
		this.lym_overexp=           gd.getNextNumber();
		this.lym_update_disp=       gd.getNextBoolean();
		this.lym_iter=        (int) gd.getNextNumber();
		this.lym_change=            gd.getNextNumber();
		this.lym_change_aux=        gd.getNextNumber();

		this.lym_poly_change=       gd.getNextNumber();
		
		this.lym_mod_map=           gd.getNextBoolean();
		this.lym_top_bg=            gd.getNextBoolean();
		this.lym_fill_gaps_bg = (int) gd.getNextNumber();
		this.lym_fill_gaps_combo = (int) gd.getNextNumber();
		this.lym_use_strength=      gd.getNextBoolean();
		this.lym_scale_deriv_str =  gd.getNextNumber();

		this.lyf_filter=            gd.getNextBoolean();
		this.lyf_smpl_side=   (int) gd.getNextNumber();
		this.lyf_rms_max=           gd.getNextNumber();
		this.lyf_frac_keep=         gd.getNextNumber();
		this.lyf_min_samples= (int) gd.getNextNumber();
		this.lyf_norm_center=       gd.getNextBoolean();
		this.ly_corr_scale=         gd.getNextNumber();

		this.lyr_filter_ds=         gd.getNextBoolean();
		this.lyr_filter_lyf=        gd.getNextBoolean();

		//  			          this.fcorr_sample_size= (int)gd.getNextNumber();
		//  			          this.fcorr_mintiles= (int)  gd.getNextNumber();
		//  			          this.fcorr_reloutliers=     gd.getNextNumber();
		//  			          this.fcorr_sigma=           gd.getNextNumber();

		///  			          this.corr_magic_scale=      gd.getNextNumber();

		this.show_textures=         gd.getNextBoolean();
		this.debug_filters=         gd.getNextBoolean();
		this.min_smth=              gd.getNextNumber();
		this.sure_smth=             gd.getNextNumber();
		this.bgnd_range=            gd.getNextNumber();
		this.other_range=           gd.getNextNumber();

		this.ex_strength=           gd.getNextNumber();
		this.ex_nstrength=          gd.getNextNumber();

		this.ex_over_bgnd=          gd.getNextBoolean();
		this.ex_min_over=           gd.getNextNumber();

		this.pt_super_trust=        gd.getNextNumber();
		this.pt_keep_raw_fg=        gd.getNextBoolean();
		this.pt_scale_pre=          gd.getNextNumber();
		this.pt_scale_post=         gd.getNextNumber();

		this.bgnd_sure=             gd.getNextNumber();
		this.bgnd_maybe=            gd.getNextNumber();
		this.min_clstr_seed=  (int) gd.getNextNumber();
		this.min_clstr_lone=  (int) gd.getNextNumber();
		this.min_clstr_weight=      gd.getNextNumber();
		this.min_clstr_max=         gd.getNextNumber();

		this.fill_gaps=       (int) gd.getNextNumber();
		this.fill_final=      (int) gd.getNextNumber();
		this.min_clstr_block= (int) gd.getNextNumber();
		this.bgnd_grow=       (int) gd.getNextNumber();

		this.ortho_old=             gd.getNextBoolean();
		this.ortho_min_hor=         gd.getNextNumber();
		this.ortho_min_vert=        gd.getNextNumber();
		this.ortho_asym=            gd.getNextNumber();
		this.ortho_over4=           gd.getNextNumber();

		this.ortho_sustain=         gd.getNextNumber();
		this.ortho_run=       (int) gd.getNextNumber();
		this.ortho_minmax=          gd.getNextNumber();
		this.ortho_bridge=    (int) gd.getNextNumber();
		this.ortho_rms=             gd.getNextNumber();
		this.ortho_half_length=(int)gd.getNextNumber();
		this.ortho_mix=             gd.getNextNumber();

		this.or_hor=                gd.getNextBoolean();
		this.or_vert=               gd.getNextBoolean();
		this.or_sigma=              gd.getNextNumber();
		this.or_sharp=              gd.getNextNumber();
		this.or_scale=              gd.getNextNumber();
		this.or_offset=             gd.getNextNumber();
		this.or_asym=               gd.getNextNumber();
		this.or_threshold=          gd.getNextNumber();
		this.or_absHor=             gd.getNextNumber();
		this.or_absVert=            gd.getNextNumber();
		this.or_maxDisp=            gd.getNextNumber();

		this.poles_fix=             gd.getNextBoolean();
		this.poles_len=        (int)gd.getNextNumber();
		this.poles_ratio=           gd.getNextNumber();
		this.poles_min_strength=    gd.getNextNumber();
		this.poles_force_disp=      gd.getNextBoolean();

		this.max_clusters=    (int) gd.getNextNumber();
		this.remove_scans=          gd.getNextBoolean();
		this.output_x3d=            gd.getNextBoolean();
		this.output_obj=            gd.getNextBoolean();
		this.correct_distortions=   gd.getNextBoolean();
		this.show_triangles=        gd.getNextBoolean();
		this.avg_cluster_disp=      gd.getNextBoolean();
		this.maxDispTriangle=       gd.getNextNumber();
		this.infinityDistance=      gd.getNextNumber();
		this.min_bgnd_tiles=  (int) gd.getNextNumber();
		this.shUseFlaps=            gd.getNextBoolean();
		this.shAggrFade=            gd.getNextBoolean();
		this.shMinArea=       (int) gd.getNextNumber();
		this.shMinStrength=         gd.getNextNumber();
		this.tiRigidVertical=       gd.getNextNumber();
		this.tiRigidHorizontal=     gd.getNextNumber();
		this.tiRigidDiagonal=       gd.getNextNumber();
		this.tiStrengthOffset=      gd.getNextNumber();
		this.tiDispScale=           gd.getNextNumber();
		this.tiDispPow=             gd.getNextNumber();
		this.tiDispPull=            gd.getNextNumber();
		this.tiDispPullPreFinal=    gd.getNextNumber();
		this.tiDispPullFinal=       gd.getNextNumber();
		this.tiBreakNorm=           gd.getNextNumber();
		this.tiBreak3=              gd.getNextNumber();
		this.tiBreak31=             gd.getNextNumber();
		this.tiBreak21=             gd.getNextNumber();
		this.tiBreakFar=            gd.getNextNumber();
		this.tiBreakNear=           gd.getNextNumber();
		this.tiBreakMode=     (int) gd.getNextNumber();
		this.tiBreakSame=           gd.getNextNumber();
		this.tiBreakTurn=           gd.getNextNumber();

		this.tiHealPreLast=         gd.getNextNumber();
		this.tiHealLast=            gd.getNextNumber();
		this.tiHealSame=      (int) gd.getNextNumber();

		this.tiIterations=    (int) gd.getNextNumber();
		this.tiPrecision=     (int) gd.getNextNumber();
		this.tiNumCycles=     (int) gd.getNextNumber();

		this.stUseRefine=           gd.getNextBoolean();
		this.stUsePass2=            gd.getNextBoolean();
		this.stUseRender=           gd.getNextBoolean();

		this.stShow=                gd.getNextBoolean();
		this.stSize=          (int) gd.getNextNumber();
		this.stStepFar=             gd.getNextNumber();
		this.stStepNear=            gd.getNextNumber();
		this.stStepThreshold=       gd.getNextNumber();
		this.stMinDisparity=        gd.getNextNumber();
		//  			          this.stMaxDisparity=        gd.getNextNumber();
		this.stSigma=               gd.getNextNumber();
		this.stMinBgDisparity=      gd.getNextNumber();
		this.stMinBgFract=          gd.getNextNumber();
		this.stUseDisp=             gd.getNextNumber();
		this.stStrengthScale=       gd.getNextNumber();

		this.stGrowSel=       (int) gd.getNextNumber();
		this.stMeasSel=       (int) gd.getNextNumber();
		this.stSmallDiff=           gd.getNextNumber();
		this.stHighMix=             gd.getNextNumber();

		this.outlierStrength=      gd.getNextNumber();
		this.outlierDiff=          gd.getNextNumber();
		this.outlierDiffPos=       gd.getNextNumber();
		this.outlierDiffNeg=       gd.getNextNumber();

		this.combine_refine=        gd.getNextBoolean();

		this.combine_min_strength=  gd.getNextNumber();
		this.combine_min_hor=       gd.getNextNumber();
		this.combine_min_vert=      gd.getNextNumber();
		///--------------------
		this.stSmplMode=            gd.getNextBoolean();
		this.mlfp.strength_sure=    gd.getNextNumber();
		this.mlfp.strength_floor=   gd.getNextNumber();
		this.mlfp.strength_pow=     gd.getNextNumber();

		this.mlfp.smplSide=   (int) gd.getNextNumber();
		this.mlfp.smplNum=    (int) gd.getNextNumber();
		this.mlfp.smplRms=          gd.getNextNumber();
		this.mlfp.smplWnd=          gd.getNextBoolean();

		this.mlfp.max_abs_tilt=     gd.getNextNumber();
		this.mlfp.max_rel_tilt=     gd.getNextNumber();
		this.mlfp.damp_tilt =       gd.getNextNumber();
		this.mlfp.min_tilt_disp=    gd.getNextNumber();
		this.mlfp.transition=       gd.getNextNumber();
		this.mlfp.far_mode=   (int) gd.getNextNumber();
		this.mlfp.far_power=        gd.getNextNumber();

		//  			          this.unique_tolerance=      gd.getNextNumber();
		this.grow_sweep=      (int) gd.getNextNumber();
		this.grow_disp_max=         gd.getNextNumber();
		this.grow_disp_trust=       gd.getNextNumber();
		this.grow_disp_step=        gd.getNextNumber();
		this.grow_min_diff=         gd.getNextNumber();
		this.grow_retry_far=        gd.getNextBoolean();
		this.grow_pedantic=         gd.getNextBoolean();
		this.grow_retry_inf=        gd.getNextBoolean();

		this.gr_new_expand=         gd.getNextBoolean();
		//  			          this.gr_max_expand=   (int) gd.getNextNumber();
		this.fds_str_floor=         gd.getNextNumber();
		this.gr_ovrbg_cmb=          gd.getNextNumber();
		this.gr_ovrbg_cmb_hor=      gd.getNextNumber();
		this.gr_ovrbg_cmb_vert=     gd.getNextNumber();
		this.gr_ovrbg_filtered=     gd.getNextNumber();
		this.fds_str_pow=           gd.getNextNumber();
		this.fds_smpl_side=   (int) gd.getNextNumber();
		this.fds_smpl_num=    (int) gd.getNextNumber();
		this.fds_smpl_rms=          gd.getNextNumber();
		this.fds_smpl_rel_rms=      gd.getNextNumber();
		this.fds_smpl_wnd=          gd.getNextBoolean();
		this.fds_abs_tilt=          gd.getNextNumber();
		this.fds_rel_tilt=          gd.getNextNumber();

		this.per_filter=               gd.getNextBoolean();
		this.per_trustedCorrelation=   gd.getNextNumber();
		this.per_initial_diff=         gd.getNextNumber();
		this.per_strength_floor=       gd.getNextNumber();
		this.per_strength_max_over=    gd.getNextNumber();
		this.per_min_period=           gd.getNextNumber();
		this.per_min_num_periods=(int) gd.getNextNumber();
		this.per_disp_tolerance=       gd.getNextNumber();
		this.per_disp_match=           gd.getNextNumber();
		this.per_strong_match_inc=     gd.getNextNumber();

		this.mc_disp8_step=         gd.getNextNumber();
		this.mc_disp8_trust=        gd.getNextNumber();
		this.mc_strength=           gd.getNextNumber();
		this.mc_unique_tol=         gd.getNextNumber();

		this.mc_trust_fin=          gd.getNextNumber();
		this.mc_trust_sigma=        gd.getNextNumber();
		this.mc_ortho_weight=       gd.getNextNumber();
		this.mc_diag_weight=        gd.getNextNumber();
		this.mc_gap=                gd.getNextNumber();

		this.mc_weight_var=         gd.getNextNumber();
		this.mc_weight_Y=           gd.getNextNumber();
		this.mc_weight_RBmG=        gd.getNextNumber();

		this.gr_min_new=      (int) gd.getNextNumber();
		this.gr_var_new_sngl=       gd.getNextBoolean();
		this.gr_var_new_fg=         gd.getNextBoolean();
		this.gr_var_all_fg=         gd.getNextBoolean();
		this.gr_var_new_bg=         gd.getNextBoolean();
		this.gr_var_all_bg=         gd.getNextBoolean();
		this.gr_var_next=           gd.getNextBoolean();
		this.gr_num_steps=    (int) gd.getNextNumber();
		this.gr_steps_over=   (int) gd.getNextNumber();
		this.gr_smpl_size=    (int) gd.getNextNumber();
		this.gr_min_pnts=     (int) gd.getNextNumber();
		this.gr_use_wnd=            gd.getNextBoolean();
		this.gr_tilt_damp=          gd.getNextNumber();
		this.gr_split_rng=          gd.getNextNumber();
		this.gr_same_rng=           gd.getNextNumber();
		this.gr_diff_cont=          gd.getNextNumber();
		this.gr_abs_tilt=           gd.getNextNumber();
		this.gr_rel_tilt=           gd.getNextNumber();
		this.gr_smooth=       (int) gd.getNextNumber();
		this.gr_fin_diff=           gd.getNextNumber();
		this.gr_unique_tol=         gd.getNextNumber();
		this.gr_unique_pretol=      gd.getNextNumber();

		this.ft_mod_strength=               gd.getNextBoolean();
		this.ft_clusterize_by_highest=      gd.getNextBoolean();
		this.ft_clust_sigma=                gd.getNextNumber();
		this.ft_disp_arange_vert=           gd.getNextNumber();
		this.ft_disp_rrange_vert=           gd.getNextNumber();
		this.ft_disp_arange_hor=            gd.getNextNumber();
		this.ft_disp_rrange_hor=            gd.getNextNumber();
		this.ft_tolerance_above_near=       gd.getNextNumber();
		this.ft_tolerance_below_near=       gd.getNextNumber();
		this.ft_tolerance_above_far=        gd.getNextNumber();
		this.ft_tolerance_below_far=        gd.getNextNumber();
		this.ft_hor_vert_overlap=     (int) gd.getNextNumber();
		this.ft_used_companions=      (int) gd.getNextNumber();
		this.ft_used_true_companions= (int) gd.getNextNumber();

		this.plPreferDisparity=     gd.getNextBoolean();
		this.plDispNorm=            gd.getNextNumber();
		this.plFrontoTol =          gd.getNextNumber();
		this.plFrontoRms =          gd.getNextNumber();
		this.plFrontoOffs =         gd.getNextNumber();
		this.PlFrontoPow =          gd.getNextNumber();

		this.plBlurBinVert=         gd.getNextNumber();
		this.plBlurBinHor=          gd.getNextNumber();
		this.plMaxDiffVert=         gd.getNextNumber();
		this.plMaxDiffHor=          gd.getNextNumber();
		this.plInitPasses=    (int) gd.getNextNumber();

		this.plMinPoints=     (int) gd.getNextNumber();
		this.plTargetEigen=         gd.getNextNumber();
		this.plFractOutliers=       gd.getNextNumber();
		this.plMaxOutliers=   (int) gd.getNextNumber();
		this.plMinStrength=         gd.getNextNumber();
		this.plMaxEigen=            gd.getNextNumber();
		this.plEigenFloor=          gd.getNextNumber();
		this.plEigenStick=          gd.getNextNumber();
		this.plBadPlate=            gd.getNextNumber();
		this.plDbgMerge=            gd.getNextBoolean();
		this.plWorstWorsening=      gd.getNextNumber();
		this.plWorstWorsening2=     gd.getNextNumber();
		this.plWorstEq=             gd.getNextNumber();
		this.plWorstEq2=            gd.getNextNumber();
		this.plOKMergeEigen=        gd.getNextNumber();
		this.plMaxWorldSin2=        gd.getNextNumber();
		this.pl2dForSin=            gd.getNextNumber();
		this.plWeakWorsening=       gd.getNextNumber();
		this.plMaxOverlap=          gd.getNextNumber();

		this.plWeakWeight=          gd.getNextNumber();
		this.plWeakEigen=           gd.getNextNumber();
		this.plWeakWeight2=         gd.getNextNumber();
		this.plWeakEigen2=          gd.getNextNumber();
		this.plSumThick=            gd.getNextNumber();
		this.plNeNeibCost=          gd.getNextNumber();
		this.plNeOwn=               gd.getNextNumber();

		this.plExNeibCost=          gd.getNextNumber();
		this.plExNeibSmooth=        gd.getNextNumber();
		this.plMergeCostStar=       gd.getNextNumber();
		this.plMergeCost=           gd.getNextNumber();

		this.plConflMerge=          gd.getNextBoolean();
		this.plConflRelax=          gd.getNextNumber();
		this.plConflSngl=           gd.getNextBoolean();
		this.plConflSnglPair=       gd.getNextBoolean();

		this.plWeakFgStrength=      gd.getNextNumber();
		this.plWeakFgOutliers=(int) gd.getNextNumber();
		this.plWeakFgRelax=         gd.getNextNumber();

		this.plThickWorld=          gd.getNextNumber();
		this.plThickWorldConfl=     gd.getNextNumber();
		this.plRelaxComplete=       gd.getNextNumber();
		this.plRelaxComplete2=      gd.getNextNumber();

		this.plMaxZRatio=           gd.getNextNumber();
		this.plMaxDisp=             gd.getNextNumber();
		this.plCutTail=             gd.getNextNumber();
		this.plMinTail=             gd.getNextNumber();

		this.plDiscrEn=             gd.getNextBoolean();
		this.plDiscrTolerance=      gd.getNextNumber();
		this.plDiscrDispRange=      gd.getNextNumber();
		this.plDiscrSteps=    (int) gd.getNextNumber();
		//  			          this.plDiscrVariants= (int) gd.getNextNumber();
		this.plDiscrMode=     (int) gd.getNextNumber();
		this.plDiscrVarFloor=       gd.getNextNumber();
		this.plDiscrSigma=          gd.getNextNumber();
		this.plDiscrBlur=           gd.getNextNumber();
		this.plDiscrExclusivity=    gd.getNextNumber();
		this.plDiscrExclus2=        gd.getNextNumber();
		this.plDiscrStrict=         gd.getNextBoolean();
		this.plDiscrCorrMax=        gd.getNextNumber();
		this.plDiscrCorrMerge=      gd.getNextNumber();
		this.plDiscrSteal=    (int) gd.getNextNumber();
		this.plDiscrGrown=    (int) gd.getNextNumber();
		this.plDiscrXMedian=        gd.getNextNumber();

		this.plCostDist=            gd.getNextNumber();
		this.plCostKrq=             gd.getNextNumber();
		this.plCostKrqEq=           gd.getNextNumber();
		this.plCostWrq=             gd.getNextNumber();
		this.plCostWrqEq=           gd.getNextNumber();
		this.plCostSin2=            gd.getNextNumber();
		this.plCostRdist2=          gd.getNextNumber();

		this.plConflDualTri=        gd.getNextBoolean();
		this.plConflMulti=          gd.getNextBoolean();
		this.plConflDiag=           gd.getNextBoolean();
		this.plConflStar=           gd.getNextBoolean();
		this.plStarSteps=     (int) gd.getNextNumber();
		this.plStarOrtho=           gd.getNextNumber();
		this.plStarDiag=            gd.getNextNumber();
		this.plStarPwr=             gd.getNextNumber();
		this.plStarWeightPwr=       gd.getNextNumber();
		this.plWeightToDens=        gd.getNextNumber();
		this.plStarValPwr=          gd.getNextNumber();
		this.plDblTriLoss=          gd.getNextNumber();
		this.plNewConfl=            gd.getNextBoolean();
		this.plMaxChanges=    (int) gd.getNextNumber();

		this.plMutualOnly=          gd.getNextBoolean();

		this.plFillSquares=         gd.getNextBoolean();
		this.plCutCorners=          gd.getNextBoolean();
		this.plHypotenuse=          gd.getNextBoolean();

		this.plPull=                gd.getNextNumber();
		this.plNormPow=             gd.getNextNumber();
		this.plIterations=    (int) gd.getNextNumber();
		this.plStopBad=             gd.getNextBoolean();
		this.plPrecision=     (int) gd.getNextNumber();

		this.plSplitPull=           gd.getNextNumber();
		this.plSplitMinNeib=  (int) gd.getNextNumber();
		this.plSplitMinWeight=      gd.getNextNumber();
		this.plSplitMinQuality=     gd.getNextNumber();
		this.plSplitApply=          gd.getNextBoolean();
		this.plNonExclusive=        gd.getNextBoolean();
		this.plUseOtherPlanes=      gd.getNextBoolean();
		this.plAllowParallel=       gd.getNextBoolean();
		this.plMaxDiff=             gd.getNextNumber();
		this.plOtherDiff=           gd.getNextNumber();
		this.plSplitXY=             gd.getNextBoolean();
		this.plSplitXYTolerance=    gd.getNextNumber();

		this.plFuse=                gd.getNextBoolean();
		this.plKeepOrphans=         gd.getNextBoolean();
		this.plMinOrphan=           gd.getNextNumber();

		this.plSnapDispAny=         gd.getNextNumber();
		this.plSnapStrengthAny=     gd.getNextNumber();
		this.plSnapNegAny=          gd.getNextNumber();
		this.plSnapDispMax=         gd.getNextNumber();
		this.plSnapDispWeight=      gd.getNextNumber();
		this.plSnapZeroMode=  (int) gd.getNextNumber();

		this.msUseSel=              gd.getNextBoolean();
		this.msDivideByArea=        gd.getNextBoolean();
		this.msScaleProj=           gd.getNextNumber();
		this.msFractUni=            gd.getNextNumber();

		this.tsNoEdge=              gd.getNextBoolean();
		this.tsUseCenter=           gd.getNextBoolean();
		this.tsMaxDiff=             gd.getNextNumber();
		this.tsMinDiffOther=        gd.getNextNumber();
		this.tsMinStrength=         gd.getNextNumber();
		this.tsMaxStrength=         gd.getNextNumber();
		this.tsMinSurface=          gd.getNextNumber();
		this.tsMoveDirs=      (int) gd.getNextNumber();
		this.tsSurfStrPow=          gd.getNextNumber();
		this.tsAddStrength=         gd.getNextNumber();
		this.tsSigma=               gd.getNextNumber();
		this.tsNSigma=              gd.getNextNumber();
		this.tsMinPull=             gd.getNextNumber();
		this.tsMinAdvantage=        gd.getNextNumber();

		this.tsClustSize=     (int) gd.getNextNumber();
		this.tsClustWeight=         gd.getNextNumber();
		this.tsMinNeib=       (int) gd.getNextNumber();
		this.tsMaxSurStrength=      gd.getNextNumber();
		this.tsCountDis=            gd.getNextBoolean();
		this.tsReset              = false;  // Reset tiles to surfaces assignment

		this.tsEnPlaneSeed=         gd.getNextBoolean();
		this.tsEnOnly=              gd.getNextBoolean();
		this.tsEnGrow=              gd.getNextBoolean();
		this.tsGrowStrength=        gd.getNextNumber();
		this.tsGrowStrong=          gd.getNextBoolean();
		this.tsContStrength=        gd.getNextNumber();
		this.tsContDiff=            gd.getNextNumber();

		this.tsEnSingle=            gd.getNextBoolean();
		this.tsEnMulti=             gd.getNextBoolean();
		this.tsRemoveWeak1=         gd.getNextBoolean();
		this.tsGrowSurround=        gd.getNextBoolean();
		this.tsRemoveWeak2=         gd.getNextBoolean();

		this.tsLoopMulti=           gd.getNextBoolean();
		this.tsShow               = gd.getNextBoolean();
		this.tsNumClust =     (int) gd.getNextNumber();

		this.tsConsensMode =  (int) gd.getNextNumber();
		this.tsConsensAgree = (int) gd.getNextNumber();

		this.taMinFgBg=             gd.getNextNumber();
		this.taMinFgEdge=           gd.getNextNumber();
		this.taMinColSep=           gd.getNextNumber();
		this.taMinColDiff=          gd.getNextNumber();
		this.taOutlier=             gd.getNextNumber();
		this.taDiffPwr=             gd.getNextNumber();
		this.taBestPwr=             gd.getNextNumber();
		this.taDiff9Pwr=            gd.getNextNumber();
		this.taColSigma=            gd.getNextNumber();
		this.taColFraction=         gd.getNextNumber();


		this.taCostEmpty=           gd.getNextNumber();
		this.taCostNoLink=          gd.getNextNumber();
		this.taCostSwitch=          gd.getNextNumber();
		this.taCostColor=           gd.getNextNumber();
		this.taCostDiff=            gd.getNextNumber();
		this.taCostDiffBest=        gd.getNextNumber();
		this.taCostDiff9=           gd.getNextNumber();
		this.taCostWeakFgnd=        gd.getNextNumber();
		this.taCostFlaps=           gd.getNextNumber();
		this.taCostMismatch=        gd.getNextNumber();

		this.taEnEmpty=             gd.getNextBoolean();
		this.taEnNoLink=            gd.getNextBoolean();
		this.taEnSwitch=            gd.getNextBoolean();
		this.taEnColor=             gd.getNextBoolean();
		this.taEnDiff=              gd.getNextBoolean();
		this.taEnDiffBest=          gd.getNextBoolean();
		this.taEnDiff9=             gd.getNextBoolean();
		this.taEnWeakFgnd=          gd.getNextBoolean();
		this.taEnFlaps=             gd.getNextBoolean();
		this.taEnMismatch=          gd.getNextBoolean();

		this.gpu_corr_scale =       gd.getNextNumber();
		this.gpu_corr_rad =   (int) gd.getNextNumber();
		this.gpu_weight_r =         gd.getNextNumber();
		this.gpu_weight_b =         gd.getNextNumber();
		this.gpu_sigma_r =          gd.getNextNumber();
		this.gpu_sigma_b =          gd.getNextNumber();
		this.gpu_sigma_g =          gd.getNextNumber();
		this.gpu_sigma_m =          gd.getNextNumber();
		this.gpu_sigma_rb_corr =    gd.getNextNumber();
		this.gpu_sigma_corr =       gd.getNextNumber();
		this.gpu_sigma_corr_m =     gd.getNextNumber();
		this.gpu_sigma_log_corr =   gd.getNextNumber();
		this.gpu_sigma_log_corr_m = gd.getNextNumber();
		this.gpu_fatz =             gd.getNextNumber();
		this.gpu_fatz_m =           gd.getNextNumber();

		this.gpu_woi=               gd.getNextBoolean();
		this.gpu_woi_tx =     (int) gd.getNextNumber();
		this.gpu_woi_ty =     (int) gd.getNextNumber();
		this.gpu_woi_twidth = (int) gd.getNextNumber();
		this.gpu_woi_theight =(int) gd.getNextNumber();
		this.gpu_woi_round=         gd.getNextBoolean();
		this.gpu_save_ports_xy=     gd.getNextBoolean();
		this.gpu_show_jtextures=    gd.getNextBoolean();
		this.gpu_show_extra=        gd.getNextBoolean();
		this.gpu_show_geometry=     gd.getNextBoolean();

		this.gpu_use_main=          gd.getNextBoolean();
		this.gpu_use_main_macro=    gd.getNextBoolean();
		this.gpu_use_main_adjust=   gd.getNextBoolean();
		this.gpu_use_aux=           gd.getNextBoolean();
		this.gpu_use_aux_macro=     gd.getNextBoolean();
		this.gpu_use_aux_adjust=    gd.getNextBoolean();
		this.gpu_debug_accum=       gd.getNextBoolean();
		
		this.lwir.dialogAnswers(gd);
		this.ofp.dialogAnswers(gd);
		this.ilp.dialogAnswers(gd);
		this.inp.dialogAnswers(gd);

		this.debug_initial_discriminate= gd.getNextBoolean();
		this.dbg_migrate=                gd.getNextBoolean();

		this.dbg_early_exit = (int) gd.getNextNumber();
		this.show_first_bg=         gd.getNextBoolean();

		this.show_interframe=       gd.getNextBoolean();
		this.show_filter_ly=        gd.getNextBoolean();
		this.show_extrinsic=        gd.getNextBoolean();
		this.show_ortho_combine=    gd.getNextBoolean();
		this.show_refine_supertiles=gd.getNextBoolean();
		this.show_bgnd_nonbgnd=     gd.getNextBoolean(); // first on second pass
		this.show_filter_scan=      gd.getNextBoolean(); // first on refine
		this.show_combined=         gd.getNextBoolean();
		this.show_unique=           gd.getNextBoolean();
		this.show_histograms=       gd.getNextBoolean();
		this.show_init_refine=      gd.getNextBoolean();
		this.show_expand=           gd.getNextBoolean();
		this.show_variant=          gd.getNextBoolean();
		this.show_retry_far=        gd.getNextBoolean();
		this.show_macro=            gd.getNextBoolean();
		this.show_shells=           gd.getNextBoolean();
		this.show_neighbors=        gd.getNextBoolean();
		this.show_flaps_dirs=       gd.getNextBoolean();
		this.show_first_clusters=   gd.getNextBoolean();
		this.show_planes=           gd.getNextBoolean();

		return true;
	}


	public boolean showTsDialog() {
		GenericDialog gd = new GenericDialog("Set CLT tiles to surfaces assignment parameters");
		gd.addCheckbox    ("Do not assign tiles to the surface edges (not having all 8 neighbors)",                     this.tsNoEdge);
		gd.addCheckbox    ("Only assign outside of 8x8 center if no suitable alternative",                              this.tsUseCenter);
		gd.addNumericField("Maximal disparity difference when assigning tiles",                                         this.tsMaxDiff,  6);
		gd.addNumericField("Minimal disparity difference to be considered as a competitor surface",                     this.tsMinDiffOther,  6);
		gd.addNumericField("Minimal tile correlation strength to be assigned",                                          this.tsMinStrength,  6);
		gd.addNumericField("Maximal tile correlation strength to be assigned",                                          this.tsMaxStrength,  6);
		gd.addNumericField("Minimal surface strength at the tile location",                                             this.tsMinSurface,  6);
		gd.addNumericField("Allowed tile disparity correction: 1 increase, 2 - decrease, 3 - both directions",          this.tsMoveDirs,  0);
		gd.addNumericField("Raise surface strengths ratio to this power when comparing candidates",                     this.tsSurfStrPow,  6);
		gd.addNumericField("Add to strengths when calculating pull of assigned tiles",                                  this.tsAddStrength,  6);
		gd.addNumericField("Radius of influence (in tiles) of the previously assigned tiles",                           this.tsSigma,  6);
		gd.addNumericField("Maximal relative to radius distance to calculate influence",                                this.tsNSigma,  6);
		gd.addNumericField("Additional pull of each surface ",                                                          this.tsMinPull,  6);
		gd.addNumericField("Minimal ratio of the best surface candidate to the next one to make selection",             this.tsMinAdvantage,  6);
		gd.addNumericField("Minimal size of a cluster to keep",                                                         this.tsClustSize,  0);
		gd.addNumericField("Minimal total weight of a cluster to keep",                                                 this.tsClustWeight,  6);
		gd.addNumericField("Minimal number of neighbors of unassigned tile to join (the farthest)",                     this.tsMinNeib,  0);
		gd.addNumericField("Maximal strength of the surrounded unassigned tile to join",                                this.tsMaxSurStrength,  6);
		gd.addCheckbox    ("Include disabled tiles/borders when counting assigned neighbors",                           this.tsCountDis);
		gd.addCheckbox    ("Reset tiles to surfaces assignment",                                              false);

		gd.addCheckbox    ("Assign tiles that were used to generate planes",                                            this.tsEnPlaneSeed);
		gd.addCheckbox    ("Allow assignment only surface",                                                             this.tsEnOnly);
		gd.addCheckbox    ("Grow the only surface assignments",                                                         this.tsEnGrow);
		gd.addNumericField("Maximal strength when growing the only surfaces",                                           this.tsGrowStrength,  6);
		gd.addCheckbox    ("Grow over strong if disparity matches",                                                     this.tsGrowStrong);
		gd.addNumericField("Minimal strength to continue grow with disparity match",                                    this.tsContStrength,  6);
		gd.addNumericField("Maximal normalized disparity error to grow over strong tiles",                              this.tsContDiff,  6);

		gd.addCheckbox    ("Allow assignment to the nearest surface with no competitors",                               this.tsEnSingle);
		gd.addCheckbox    ("Allow assignment when several surfaces fit",                                                this.tsEnMulti);
		gd.addCheckbox    ("Remove weak clusters before growing",                                                       this.tsRemoveWeak1);
		gd.addCheckbox    ("Assign tiles that have neighbors to the lowest disparity",                                  this.tsGrowSurround);
		gd.addCheckbox    ("Remove weak clusters after growing",                                                        this.tsRemoveWeak2);

		gd.addCheckbox    ("Repeat multi-choice assignment while succeeding",                                           this.tsLoopMulti);
		gd.addCheckbox    ("Show results of tiles to surfaces assignment",                                              this.tsShow);
		gd.addNumericField("Number of clusters to keep",                                                                this.tsNumClust,  0);

		gd.addNumericField("Which assignments to match +1 - combo, +2 grown single, +4 plane seeds",                    this.tsConsensMode,  0);
		gd.addNumericField("Minimal number of assignments to agree",                                                    this.tsConsensAgree,  0);

		gd.addMessage     ("--- Tile assignment parameters ---");
		gd.addNumericField("Minimal foreground/ background separation to look for weak FG edge",                        this.taMinFgBg,    6);
		gd.addNumericField("Minimal foreground edge strength (stronger edges will have proportionally smaller costs)",           this.taMinFgEdge,  6);
		gd.addNumericField("Minimal surface separation that requires color change",                                     this.taMinColSep,  6);
		gd.addNumericField("Minimal color variation (larger proportionally reduces cost)",                              this.taMinColDiff, 6);
		gd.addNumericField("Disparity difference limit (to handle outliers)",                                           this.taOutlier, 6);
		gd.addNumericField("Strength power when calculating disparity error",                                           this.taDiffPwr, 6);
		gd.addNumericField("Strength power when calculating disparity error over best",                                 this.taBestPwr, 6);
		gd.addNumericField("Strength power when calculating disparity error for group of 9",                            this.taDiff9Pwr, 6);
		gd.addNumericField("Gaussian sigma to blur color difference between tiles along each direction",                this.taColSigma, 6);
		gd.addNumericField("Relative amount of the blurred color difference in the mixture",                            this.taColFraction, 6);

		gd.addNumericField("Cost of a tile that is not assigned",                                                       this.taCostEmpty,  6);
		gd.addNumericField("Cost of a tile not having any neighbor in particular direction",                            this.taCostNoLink,  6);
		gd.addNumericField("Cost of a tile switching to a neighbor that does not have a link",                          this.taCostSwitch,  6);
		gd.addNumericField("Cost of a tile switching to a disconnected neighbor divided by a color",                    this.taCostColor,  6);
		gd.addNumericField("Cost of a weighted normalized tile disparity error",                                        this.taCostDiff,  6);
		gd.addNumericField("Cost of a weighted normalized tile disparity error above best surface",                     this.taCostDiffBest,  6);
		gd.addNumericField("Cost of a weighted normalized tile disparity error for tile and 8 neighbors (DC)",          this.taCostDiff9,  6);
		gd.addNumericField("Cost of a weak foreground edge",                                                            this.taCostWeakFgnd,  6);
		gd.addNumericField("Cost of using supertile \"flaps\" (not in the center 8x8 tiles area)",                      this.taCostFlaps,  6);
		gd.addNumericField("Cost of a measurement layer not having same layer in the same location or near",            this.taCostMismatch,  6);

		gd.addCheckbox    ("Cost of a tile that is not assigned",                                                       this.taEnEmpty);
		gd.addCheckbox    ("Cost of a tile not having any neighbor in particular direction",                            this.taEnNoLink);
		gd.addCheckbox    ("Cost of a tile switching to a neighbor that does not have a link",                          this.taEnSwitch);
		gd.addCheckbox    ("Cost of a tile switching to a disconnected neighbor divided by a color",                    this.taEnColor);
		gd.addCheckbox    ("Cost of a weighted normalized tile disparity error",                                        this.taEnDiff);
		gd.addCheckbox    ("Cost of a weighted normalized tile disparity error above best surface",                     this.taEnDiffBest);
		gd.addCheckbox    ("Cost of a weighted normalized tile disparity error for tile and 8 neighbors (DC)",          this.taEnDiff9);
		gd.addCheckbox    ("Cost of a weak foreground edge",                                                            this.taEnWeakFgnd);
		gd.addCheckbox    ("Cost of using supertile \"flaps\" (not in the center 8x8 tiles area)",                      this.taEnFlaps);
		gd.addCheckbox    ("Cost of a measurement layer not having same layer in the same location or near",            this.taEnMismatch);

		WindowTools.addScrollBars(gd);
		gd.showDialog();
		if (gd.wasCanceled()) return false;
		this.tsNoEdge=              gd.getNextBoolean();
		this.tsUseCenter=           gd.getNextBoolean();
		this.tsMaxDiff=             gd.getNextNumber();
		this.tsMinDiffOther=        gd.getNextNumber();
		this.tsMinStrength=         gd.getNextNumber();
		this.tsMaxStrength=         gd.getNextNumber();
		this.tsMinSurface=          gd.getNextNumber();
		this.tsMoveDirs=      (int) gd.getNextNumber();
		this.tsSurfStrPow=          gd.getNextNumber();
		this.tsAddStrength=         gd.getNextNumber();
		this.tsSigma=               gd.getNextNumber();
		this.tsNSigma=              gd.getNextNumber();
		this.tsMinPull=             gd.getNextNumber();
		this.tsMinAdvantage=        gd.getNextNumber();

		this.tsClustSize=     (int) gd.getNextNumber();
		this.tsClustWeight=         gd.getNextNumber();
		this.tsMinNeib=       (int) gd.getNextNumber();
		this.tsMaxSurStrength=      gd.getNextNumber();
		this.tsCountDis=            gd.getNextBoolean();
		this.tsReset=               gd.getNextBoolean();

		this.tsEnPlaneSeed=         gd.getNextBoolean();
		this.tsEnOnly=              gd.getNextBoolean();
		this.tsEnGrow=              gd.getNextBoolean();
		this.tsGrowStrength=        gd.getNextNumber();
		this.tsGrowStrong=          gd.getNextBoolean();
		this.tsContStrength=        gd.getNextNumber();
		this.tsContDiff=            gd.getNextNumber();

		this.tsEnSingle=            gd.getNextBoolean();
		this.tsEnMulti=             gd.getNextBoolean();
		this.tsRemoveWeak1=         gd.getNextBoolean();
		this.tsGrowSurround=        gd.getNextBoolean();
		this.tsRemoveWeak2=         gd.getNextBoolean();

		this.tsLoopMulti=           gd.getNextBoolean();
		this.tsShow =               gd.getNextBoolean();
		this.tsNumClust=      (int) gd.getNextNumber();
		this.tsConsensMode =  (int) gd.getNextNumber();
		this.tsConsensAgree = (int) gd.getNextNumber();

		this.taMinFgBg=             gd.getNextNumber();
		this.taMinFgEdge=           gd.getNextNumber();
		this.taMinColSep=           gd.getNextNumber();
		this.taMinColDiff=          gd.getNextNumber();
		this.taOutlier=             gd.getNextNumber();
		this.taDiffPwr=             gd.getNextNumber();
		this.taBestPwr=             gd.getNextNumber();
		this.taDiff9Pwr=            gd.getNextNumber();
		this.taColSigma=            gd.getNextNumber();
		this.taColFraction=         gd.getNextNumber();

		this.taCostEmpty=           gd.getNextNumber();
		this.taCostNoLink=          gd.getNextNumber();
		this.taCostSwitch=          gd.getNextNumber();
		this.taCostColor=           gd.getNextNumber();
		this.taCostDiff=            gd.getNextNumber();
		this.taCostDiffBest=        gd.getNextNumber();
		this.taCostDiff9=           gd.getNextNumber();
		this.taCostWeakFgnd=        gd.getNextNumber();
		this.taCostFlaps=           gd.getNextNumber();
		this.taCostMismatch=        gd.getNextNumber();

		this.taEnEmpty=             gd.getNextBoolean();
		this.taEnNoLink=            gd.getNextBoolean();
		this.taEnSwitch=            gd.getNextBoolean();
		this.taEnColor=             gd.getNextBoolean();
		this.taEnDiff=              gd.getNextBoolean();
		this.taEnDiffBest=          gd.getNextBoolean();
		this.taEnDiff9=             gd.getNextBoolean();
		this.taEnWeakFgnd=          gd.getNextBoolean();
		this.taEnFlaps=             gd.getNextBoolean();
		this.taEnMismatch=          gd.getNextBoolean();
		return true;
	}
	public boolean modifyZCorr (String title) {
		if (z_corr_map == null){
			z_corr_map = new HashMap<String,Double>();
		}
		GenericDialog gd = new GenericDialog(title);
		if (z_corr_map.size() > 0) {
			gd.addMessage("Edit infinity disparity correction (in 1/m), set >= 1.0 to remove for the following");
			for (HashMap.Entry<String,Double> entry : z_corr_map.entrySet()){
				gd.addNumericField(entry.getKey(),   entry.getValue(), 9,12, "m-1");
			}
		}
		gd.addMessage("Add new infinity correction");
		gd.addStringField ("Timestamp string (seconds_microseconds):",                              "", 40);
		gd.addNumericField("Infinity correction (in 1/m)",                                          0,  9,12,"m-1");
		gd.addCheckbox    ("Clear list",                                                            false);
		WindowTools.addScrollBars(gd);
		gd.showDialog();
		if (gd.wasCanceled()) return false;
		HashMap<String,Double> new_map = new HashMap<String,Double>();
		for (HashMap.Entry<String,Double> entry : z_corr_map.entrySet()){
			double d = gd.getNextNumber();
			if (d < 1.0) {
				new_map.put(entry.getKey(),d);
			}
		}
		String new_ts =  gd.getNextString();
		double d =       gd.getNextNumber();
		if (gd.getNextBoolean()){
			z_corr_map = new HashMap<String,Double>();
		} else {
			z_corr_map = new_map;
		}
		if(new_ts.length() > 0){
			z_corr_map.put(new_ts, d);
		}
		return true;
	}
	public boolean modifyInfCorr (String title) {
		if (infinity_distace_map == null){
			infinity_distace_map = new HashMap<String,Double>();
		}
		class StringDouble{
			String str;
			double dbl;
			StringDouble (String s, double d){
				this.str = s;
				this.dbl = d;
			}
		}
		ArrayList<StringDouble> sd_list = new ArrayList<StringDouble>();
		for (HashMap.Entry<String,Double> entry : infinity_distace_map.entrySet()){
			sd_list.add(new StringDouble(entry.getKey(),   entry.getValue()));
		}
		Collections.sort(sd_list, new Comparator<StringDouble>() {
			@Override
			public int compare(StringDouble lhs, StringDouble rhs) {
				// -1 - less than, 1 - greater than, 0 - equal, not inverted for ascending disparity
				return  lhs.str.compareTo(rhs.str);
			}
		});


		GenericDialog gd = new GenericDialog(title);
		if (infinity_distace_map.size() > 0) {
			gd.addMessage("Edit \"infinity\" (when mountains are too close) distance (in m), set == 0.0 to remove for the following");
			gd.addMessage("Press \"Cancel\" to exit");
			//				for (HashMap.Entry<String,Double> entry : infinity_distace_map.entrySet()){
			for (StringDouble entry : sd_list){
				gd.addNumericField(entry.str,   entry.dbl, 1,6, "m");
			}
		}
		gd.addMessage("Add new infinity correction");
		gd.addStringField ("Timestamp string (seconds_microseconds):",                              "", 40);
		gd.addNumericField("Infinity distance",                                          0,  1,6,"m");
		gd.addCheckbox    ("Clear list",                                                            false);
		WindowTools.addScrollBars(gd);
		gd.showDialog();
		if (gd.wasCanceled()) return false;
		HashMap<String,Double> new_map = new HashMap<String,Double>();
		for (StringDouble entry : sd_list){
			double d = gd.getNextNumber();
			if (d != 0.0) {
				new_map.put(entry.str,d);
			}
		}


		String new_ts =  gd.getNextString();
		double d =       gd.getNextNumber();
		if (gd.getNextBoolean()){
			infinity_distace_map = new HashMap<String,Double>();
		} else {
			infinity_distace_map = new_map;
		}
		if(new_ts.length() > 0){
			infinity_distace_map.put(new_ts, d);
		}
		return true;
	}
}