Commit 9dacd956 authored by Andrey Filippov's avatar Andrey Filippov
Browse files

Next working snapshot

parent f2fc939c
Loading
Loading
Loading
Loading
+105 −26
Original line number Original line Diff line number Diff line
@@ -2148,7 +2148,8 @@ public class CuasMotion {
			String              dbg_suffix,
			String              dbg_suffix,
			int                 dbg_iter_index,     // to generate different image names for different iteration to simplify "save as" images
			int                 dbg_iter_index,     // to generate different image names for different iteration to simplify "save as" images
			int                 debugLevel) {
			int                 debugLevel) {
		final int max_index_dbg = 3;// 5; //  // show images for the first iterations only
//		debugLevel = -1; // DEBUG OFF
//		final int max_index_dbg = 3;// 5; //  // show images for the first iterations only
		final int tileSize = GPUTileProcessor.DTT_SIZE;   // 8 pixels
		final int tileSize = GPUTileProcessor.DTT_SIZE;   // 8 pixels
		final int tilesX   = cuasMotion.tilesX;
		final int tilesX   = cuasMotion.tilesX;
		final int width    = cuasMotion.gpu_max_width;
		final int width    = cuasMotion.gpu_max_width;
@@ -2166,11 +2167,22 @@ public class CuasMotion {
		final int corr_offset_eff = corr_offset * Math.max(1, Math.min(corr_offset_scale, corr_pairs_ref / corr_offset));
		final int corr_offset_eff = corr_offset * Math.max(1, Math.min(corr_offset_scale, corr_pairs_ref / corr_offset));


		// Hard-coded debug selectors: set >= 0 to enable per-scan/per-tile visualisation
		// Hard-coded debug selectors: set >= 0 to enable per-scan/per-tile visualisation
		final int dbg_nseq = 36; // 28; // 97; // 40; // 41; // 157; // -(116); // 57; // 20; // -1;
		final int dbg_nseq = 166;      // 36; // 28; // 97; // 40; // 41; // 157; // -(116); // 57; // 20; // -1;
		final int dbg_tile = 51+38*80; // 54+38*80; //52+38*80;  // 50+38*80; // 55+38*80; // -(17 + 33*80); // 48+32*80; // 50+38*80; // -1;
		final int dbg_tile = 55+38*80; // 51+38*80; // 54+38*80; //52+38*80;  // 50+38*80; // 55+38*80; // -(17 + 33*80); // 48+32*80; // 50+38*80; // -1;
		final int corr_offset_scale_eff = corr_offset_eff / corr_offset; // actual scale after clamping
		final int corr_offset_scale_eff = corr_offset_eff / corr_offset; // actual scale after clamping
		if ((dbg_nseq < 0) || (dbg_nseq >= targets_nonoverlap.length) || (dbg_tile < 0) || (dbg_tile >= targets_nonoverlap[dbg_nseq].length)) {
			debugLevel = -2;
		}
		if (debugLevel >= 0) {
			// See if it contains specified dbg_nseq, dbg_tile
			double[] target = targets_nonoverlap[dbg_nseq][dbg_tile];
			if (target == null || Double.isNaN(target[CuasMotionLMA.RSLT_X])) {
				debugLevel = -3;	
			};
		}
		
		if (debugLevel >= 0) {
		if (debugLevel >= 0) {
			System.out.println("refineMotionVectors(): corr_offset="+corr_offset+", corr_offset_scale="+corr_offset_scale+
			System.out.println("\nrefineMotionVectors(): dbg_iter_index="+dbg_iter_index+", corr_offset="+corr_offset+", corr_offset_scale="+corr_offset_scale+
					", corr_offset_eff="+corr_offset_eff+
					", corr_offset_eff="+corr_offset_eff+
					(corr_offset_scale_eff != corr_offset_scale ? " (CLAMPED from "+corr_offset_scale+" to "+corr_offset_scale_eff+")" : "")+
					(corr_offset_scale_eff != corr_offset_scale ? " (CLAMPED from "+corr_offset_scale+" to "+corr_offset_scale_eff+")" : "")+
					", dbg_nseq="+dbg_nseq+", dbg_tile="+dbg_tile);
					", dbg_nseq="+dbg_nseq+", dbg_tile="+dbg_tile);
@@ -2196,7 +2208,8 @@ public class CuasMotion {
		for (int i = 0; i < mask_kernel.length; i++) {
		for (int i = 0; i < mask_kernel.length; i++) {
			mask_kernel[i] *= scale_w; 
			mask_kernel[i] *= scale_w; 
		}
		}
		if ((dbg_nseq >= 0 || dbg_tile >= 0) && (debugLevel >= 0) && (dbg_iter_index<= max_index_dbg)) {
//		if ((dbg_nseq >= 0 || dbg_tile >= 0) && (debugLevel >= 0) && (dbg_iter_index<= max_index_dbg)) {
		if ((dbg_nseq >= 0 || dbg_tile >= 0) && (debugLevel >= 0)) {
			ShowDoubleFloatArrays.showArrays(mask_kernel.clone(), mside, mside,
			ShowDoubleFloatArrays.showArrays(mask_kernel.clone(), mside, mside,
					"refineMotionVectors-mask-boost"+recalc_mv_boost+"-r0_" + recalc_mv_r0 + "-r1_" + recalc_mv_r1+"-niter"+dbg_iter_index+dbg_suffix);
					"refineMotionVectors-mask-boost"+recalc_mv_boost+"-r0_" + recalc_mv_r0 + "-r1_" + recalc_mv_r1+"-niter"+dbg_iter_index+dbg_suffix);
		}
		}
@@ -2291,7 +2304,7 @@ public class CuasMotion {
			ImageDtt.startAndJoin(threads);
			ImageDtt.startAndJoin(threads);


			// Debug: show full fmin..fmax masked frame stack for dbg_nseq
			// Debug: show full fmin..fmax masked frame stack for dbg_nseq
			if ((nseq == dbg_nseq) && (debugLevel >= 0) && (dbg_iter_index<= max_index_dbg)) {
			if ((nseq == dbg_nseq) && (debugLevel >= 0)) { //  && (dbg_iter_index<= max_index_dbg)) {
				int fcount = fmax_alloc - fmin_alloc + 1;
				int fcount = fmax_alloc - fmin_alloc + 1;
				float[][] stack_slices = new float[fcount][];
				float[][] stack_slices = new float[fcount][];
				String[] stack_titles = new String[fcount];
				String[] stack_titles = new String[fcount];
@@ -2304,7 +2317,7 @@ public class CuasMotion {
				ShowDoubleFloatArrays.showArrays(stack_slices, width, height, true,
				ShowDoubleFloatArrays.showArrays(stack_slices, width, height, true,
						"refineMotionVectors-boost"+recalc_mv_boost+"-masked-nseq" + nseq+"-niter"+dbg_iter_index+dbg_suffix, stack_titles);
						"refineMotionVectors-boost"+recalc_mv_boost+"-masked-nseq" + nseq+"-niter"+dbg_iter_index+dbg_suffix, stack_titles);
			}
			}
			if ((nseq == dbg_nseq) && (debugLevel >= 0) && (dbg_iter_index<= max_index_dbg)) {
			if ((nseq == dbg_nseq) && (debugLevel >= 0)) { //  && (dbg_iter_index<= max_index_dbg)) {
				int fcount = fmax_alloc - fmin_alloc + 1;
				int fcount = fmax_alloc - fmin_alloc + 1;
				float[][] stack_slices = new float[fcount][];
				float[][] stack_slices = new float[fcount][];
				String[] stack_titles = new String[fcount];
				String[] stack_titles = new String[fcount];
@@ -2372,6 +2385,7 @@ public class CuasMotion {
				target[CuasMotionLMA.RSLT_VX] += scaled_dvx;
				target[CuasMotionLMA.RSLT_VX] += scaled_dvx;
				target[CuasMotionLMA.RSLT_VY] += scaled_dvy;
				target[CuasMotionLMA.RSLT_VY] += scaled_dvy;
				target[CuasMotionLMA.RSLT_VSTR] = vector_field[ntile][INDX_STR];
				target[CuasMotionLMA.RSLT_VSTR] = vector_field[ntile][INDX_STR];
				target[CuasMotionLMA.RSLT_VBOOST] = recalc_mv_boost;
				target[CuasMotionLMA.RSLT_VCORR] = Math.sqrt(scaled_dvx*scaled_dvx + scaled_dvy*scaled_dvy);
				target[CuasMotionLMA.RSLT_VCORR] = Math.sqrt(scaled_dvx*scaled_dvx + scaled_dvy*scaled_dvy);
				if ((mv_diff_max > 0) && (target[CuasMotionLMA.RSLT_VCORR] > mv_diff_max) && !(target[CuasMotionLMA.RSLT_FAIL] > 0 )) {
				if ((mv_diff_max > 0) && (target[CuasMotionLMA.RSLT_VCORR] > mv_diff_max) && !(target[CuasMotionLMA.RSLT_FAIL] > 0 )) {
					target[CuasMotionLMA.RSLT_FAIL] = CuasMotionLMA.FAIL_VCORR; // set when?
					target[CuasMotionLMA.RSLT_FAIL] = CuasMotionLMA.FAIL_VCORR; // set when?
@@ -2380,7 +2394,7 @@ public class CuasMotion {
			}
			}
		}
		}
		// Debug: CORR2D overview — one slice per keyframe, same layout as *CORR2D.tiff
		// Debug: CORR2D overview — one slice per keyframe, same layout as *CORR2D.tiff
		if (show_dbg && (corr2d_ref != null) && (dbg_iter_index<= max_index_dbg)) {
		if (show_dbg && (corr2d_ref != null)) { // && (dbg_iter_index<= max_index_dbg)) {
			final int corr_size = 2 * GPUTileProcessor.DTT_SIZE - 1; // 15
			final int corr_size = 2 * GPUTileProcessor.DTT_SIZE - 1; // 15
			String[] slice_titles_ref = new String[targets_nonoverlap.length];
			String[] slice_titles_ref = new String[targets_nonoverlap.length];
			for (int i = 0; i < targets_nonoverlap.length; i++) {
			for (int i = 0; i < targets_nonoverlap.length; i++) {
@@ -7887,6 +7901,8 @@ public class CuasMotion {
		} else {
		} else {
			fpixels_refine = fpixels_tum;
			fpixels_refine = fpixels_tum;
		}
		}
		// TODO: Skip calculation of motion_sequence if it is not needed (data restored from the file)
		
		if (target_sequence_multi == null) {
		if (target_sequence_multi == null) {
			//		final double [][][][]
			//		final double [][][][]
			target_sequence_multi = new double [num_seq][num_tiles][][];
			target_sequence_multi = new double [num_seq][num_tiles][][];
@@ -8245,6 +8261,8 @@ public class CuasMotion {
		double  recalc_mv_max2  = clt_parameters.imp.cuas_recalc_mv_max2;
		double  recalc_mv_max2  = clt_parameters.imp.cuas_recalc_mv_max2;
		int     recalc_mv_icorr = (int) Math.round(recalc_mv_corr);
		int     recalc_mv_icorr = (int) Math.round(recalc_mv_corr);
		
		
		int trim_first = clt_parameters.imp.cuas_trim_first;
		
	    double lma_rrms2 =       clt_parameters.imp.cuas_lma_rrms2; // =      0.15; // Maximal relative to A rms. OK is when (RMS < cuas_lma_arms) || (RMS < cuas_lma_rrms * A)
	    double lma_rrms2 =       clt_parameters.imp.cuas_lma_rrms2; // =      0.15; // Maximal relative to A rms. OK is when (RMS < cuas_lma_arms) || (RMS < cuas_lma_rrms * A)
	    double lma_mina2 =       clt_parameters.imp.cuas_lma_mina2; // =      1.0;  // Minimal A (amplitude)
	    double lma_mina2 =       clt_parameters.imp.cuas_lma_mina2; // =      1.0;  // Minimal A (amplitude)
		if (debugLevel > -4) {
		if (debugLevel > -4) {
@@ -8253,8 +8271,67 @@ public class CuasMotion {
		}
		}
		
		
		// second pass, using non-centered targets
		// second pass, using non-centered targets
		// optionally trim pass-one targets
		if (trim_first > 0) {
			if (debugLevel > -4) {
				System.out.println("Will trim Phase One (noncentered) data to keep not more than "+clt_parameters.imp.cuas_trim_first+" tasrgets in each tile");
			}
			// evaluate scores here to reduce the number of attempts for centered targets
			getEffectiveStrengthLMA(
					target_sequence_multi, // final double [][][] target_coords, // LMA
					target_strength,   // final double        target_strength,
					target_frac,       // final double [][]   target_frac, // pairs - strength, minimal fraction for that strength
					lma_rms,           // final double        lma_rms, // =       1.5;  // Maximal RMS (should always match, regardless if A)
					lma_arms,          // final double        lma_arms, // =      0.06; // Maximal absolute RMS (should match one of cuas_lma_arms OR cuas_lma_rrms (0.484)
					lma_rrms,          // final double        lma_rrms, // =      0.15; // Maximal relative to A rms. OK is when (RMS < cuas_lma_arms) || (RMS < cuas_lma_rrms * A)
					lma_mina,          // final double        lma_mina, // =      1.0;  // Minimal A (amplitude)
					lma_maxr,          // final double        lma_maxr, // =      5.0;  // Minimal K (overshoot) = 3.0
					lma_minr1,         // final double        lma_minr1,// =      1.0;  // Minimal R1 (radius of positive peak)
					lma_mink,          // final double        lma_mink, // =      0.0;  // Minimal K (overshoot) = 1.0
					lma_maxk,          // final double        lma_maxk, // =      5.0;  // Minimal K (overshoot) = 3.0//			final double        lma_a2a,
					lma_a2a,           // final double        lma_a2a,
					0, // max_mismatch,      // final double        max_mismatch, apply only during final, when mismatch scores are calculated
					slow_fast_mismatch,// final double          slow_fast_mismatch, // // 1.5; allow larger mismatch between slow and fast
					fail_mismatch,     // final boolean       fail_mismatch,
					offcenter,   	   // final double          offcenter,
					cuasMotion.getNoiseNeibs(), // final int []          noise_neibs,
//					cuasMotion.getNoiseMap(), // final double []       noise_map,
//					noisemax,          // final double          noise_max,
					target_horizon,    // final double        lma_horizon, // horizon as maximal pixel Y
					cuasMotion.tilesX);            // final int         tilesX,
			getScore(
					target_sequence_multi, // final double [][][] target_sequence, // modifies certain fields (scores)
					factor_lim,        // final double        importance_limit,
					factor_pow,        // final double        importance_power, // Raise each factor to this power before combining
					score_coeff,       // final double []     importance, // for now (each - squared?): [0] - Amplitude (A/A0), 1 - RMS (RMS0/RMS), 2 - RRMS((RMS/A0) / (RMS/A)
					slow_score,        // final double          slow_score,           // multiply total score for targets detected in slow target mode
					cuasMotion.tilesX);            // final int         tilesX,
			sortMultiTargets(
					target_sequence_multi, // final double [][][][] target_multi,
					true);                 // final boolean         trim_nulls) { // trim null targets
	  	    trimTargets( // limit number of targets per tile
	  	    		target_sequence_multi, // final double [][][][] target_multi,
	  	    		trim_first);           // final int             max_targets) {
			if (intermed_low) {
				ImagePlus imp_new_scores = showTargetSequence(
						target_sequence_multi,          // double [][][][] vector_fields_sequence,
						slice_titles,         // String []     titles, // all slices*frames titles or just slice titles or null
						model_prefix+"-ROUND_ONE_TRIMMED",// String        title,
						false, // good_only,            // final boolean         good_only,
						false, // show_empty,           // final boolean         show_empty, // show scenes with no (valid) targets
						!batch_mode,          // boolean       show,
						cuasMotion.tilesX);   //  int           tilesX) {
				parentCLT.saveImagePlusInModelDirectory(imp_new_scores);  // ImagePlus   imp)
			}
		} else {
			if (debugLevel > -4) {
				System.out.println("Will not trim Phase One (noncentered) data, as clt_parameters.imp.cuas_trim_first="+clt_parameters.imp.cuas_trim_first);
			}

		}
		int niter_lim = niter+ num_cycles;
		int niter_lim = niter+ num_cycles;
		int iter_show1 = iter_show + niter;
		int iter_show1 = iter_show + niter;
		/*
		if (intermed_low  && debug_more) {
		if (intermed_low  && debug_more) {
			ImagePlus imp_mv_strength = showTargetSequence(
			ImagePlus imp_mv_strength = showTargetSequence(
					motion_sequence,       // double [][][] vector_fields_sequence,
					motion_sequence,       // double [][][] vector_fields_sequence,
@@ -8264,6 +8341,7 @@ public class CuasMotion {
					cuasMotion.tilesX);   //  int           tilesX) {
					cuasMotion.tilesX);   //  int           tilesX) {
			parentCLT.saveImagePlusInModelDirectory(imp_mv_strength);
			parentCLT.saveImagePlusInModelDirectory(imp_mv_strength);
		}
		}
		*/
		int niter0 = niter; // for debugging, so (niter - niter0) will start from 0
		int niter0 = niter; // for debugging, so (niter - niter0) will start from 0
		for (; niter < niter_lim; niter++) {
		for (; niter < niter_lim; niter++) {
			boolean         good_only=    false;
			boolean         good_only=    false;
@@ -8347,10 +8425,12 @@ public class CuasMotion {
			}
			}


			int num_new = 0;
			int num_new = 0;
			double effective_boost = boost_accum_pairs; // default virtual exposure scale
			if (accum_boosted) {
			if (accum_boosted) {
				// Andrey 05/05/2026 moved here (earlier) so shiftAndRenderAccumulate() will use updated motion vector
				// Andrey 05/05/2026 moved here (earlier) so shiftAndRenderAccumulate() will use updated motion vector
				// By Claude on 05/05/2026 — re-correlate with spatial mask around known target
				// By Claude on 05/05/2026 — re-correlate with spatial mask around known target
				if (recalc_mv_num > 0) {
				if (recalc_mv_num > 0) {
					effective_boost = recalc_mv_boost; // virtual exposure scale used in refineMotionVectors()
					int corr_offset_scale = (int) Math.round(recalc_mv_boost); // TODO: promote to config or derive from other params	
					int corr_offset_scale = (int) Math.round(recalc_mv_boost); // TODO: promote to config or derive from other params	
					refineMotionVectors(
					refineMotionVectors(
							clt_parameters,      // CLTParameters   clt_parameters,
							clt_parameters,      // CLTParameters   clt_parameters,
@@ -8418,7 +8498,8 @@ public class CuasMotion {
						frame0,             // int              frame0,
						frame0,             // int              frame0,
						corr_inc,           // int	            corr_inc,
						corr_inc,           // int	            corr_inc,
						half_accum_range,   // int              half_accum_range,
						half_accum_range,   // int              half_accum_range,
						boost_accum_pairs,  // double           boost_accum_pairs,
						// next is switched before the default exposure boost (same as pass one) and recalc_mv_boost
						effective_boost, // boost_accum_pairs,  // double           boost_accum_pairs,
						smooth,             // boolean          smooth,
						smooth,             // boolean          smooth,
						corr_offset,        // int              corr_offset,      // interframe distance for correlation
						corr_offset,        // int              corr_offset,      // interframe distance for correlation
						save_filtered_high, // boolean          save_filtered_high,
						save_filtered_high, // boolean          save_filtered_high,
@@ -8650,12 +8731,9 @@ public class CuasMotion {
				if (debugLevel > -4) {
				if (debugLevel > -4) {
					System.out.println("Added "+num_new+" new tiles as good/bad at base iteration "+niter+".");
					System.out.println("Added "+num_new+" new tiles as good/bad at base iteration "+niter+".");
				}
				}
			}
				if (save_filtered_low) {
				if (save_filtered_low) {
					String title = model_prefix+"-ADDED_NEW_CENTERED_MULTI-n"+niter;
					String title = model_prefix+"-ADDED_NEW_CENTERED_MULTI-n"+niter;
				if (boost_accum_pairs > 1.0) {
					title+="-BOOST"+effective_boost+"-NOBOOST"; // boost_accum_pairs;
					title+="-BOOST"+boost_accum_pairs;
				}
					ImagePlus imp_new_scores = showTargetSequence(
					ImagePlus imp_new_scores = showTargetSequence(
							target_sequence_multi,          // double [][][] vector_fields_sequence,
							target_sequence_multi,          // double [][][] vector_fields_sequence,
							slice_titles,         // String []     titles, // all slices*frames titles or just slice titles or null
							slice_titles,         // String []     titles, // all slices*frames titles or just slice titles or null
@@ -8666,6 +8744,7 @@ public class CuasMotion {
							cuasMotion.tilesX);   //  int           tilesX) {
							cuasMotion.tilesX);   //  int           tilesX) {
					parentCLT.saveImagePlusInModelDirectory(imp_new_scores);  // ImagePlus   imp)
					parentCLT.saveImagePlusInModelDirectory(imp_new_scores);  // ImagePlus   imp)
				}
				}
			}


			if (num_new == 0) {
			if (num_new == 0) {
				if (debugLevel > -4) System.out.println ("Nothing added from last try, breaking the loop.\n");
				if (debugLevel > -4) System.out.println ("Nothing added from last try, breaking the loop.\n");
@@ -9381,7 +9460,7 @@ public class CuasMotion {
		final int num_tiles = target_sequence_multi[0].length;
		final int num_tiles = target_sequence_multi[0].length;
//		final double center_scale = 0.25*Math.PI/GPUTileProcessor.DTT_SIZE;
//		final double center_scale = 0.25*Math.PI/GPUTileProcessor.DTT_SIZE;
		final double center_scale = 0.125*Math.PI/GPUTileProcessor.DTT_SIZE/offcenter;
		final double center_scale = 0.125*Math.PI/GPUTileProcessor.DTT_SIZE/offcenter;
		final int dbg_tile = 51+38*80; // -(34 + 34*80);
		final int dbg_tile = -( 51+38*80); // -(34 + 34*80);
		final Thread[] threads = ImageDtt.newThreadArray();
		final Thread[] threads = ImageDtt.newThreadArray();
		final AtomicInteger ai = new AtomicInteger(0);
		final AtomicInteger ai = new AtomicInteger(0);
		for (int ithread = 0; ithread < threads.length; ithread++) {
		for (int ithread = 0; ithread < threads.length; ithread++) {
@@ -9656,7 +9735,7 @@ public class CuasMotion {
			final int             debugLevel) {
			final int             debugLevel) {
		final int num_seq =   target_sequence_multi.length;
		final int num_seq =   target_sequence_multi.length;
		final int num_tiles = target_sequence_multi[0].length;
		final int num_tiles = target_sequence_multi[0].length;
		boolean debug_now = (debugLevel > -5); // NEVER
		boolean debug_now = (debugLevel > 5); // NEVER
		final int dbg_tile = debug_now ?(56+38*80) : -1;
		final int dbg_tile = debug_now ?(56+38*80) : -1;
		final int dbg_seq0 = debug_now ? 197: -1; 
		final int dbg_seq0 = debug_now ? 197: -1; 
		final int dbg_seq1 = debug_now ? 197: -1; 		
		final int dbg_seq1 = debug_now ? 197: -1; 		
+2 −2
Original line number Original line Diff line number Diff line
@@ -2809,7 +2809,7 @@ min_str_neib_fpn 0.35
				"Add to coordinates when looking for the mask value .");
				"Add to coordinates when looking for the mask value .");
		
		
		gd.addNumericField("Maximums separation fraction",           this.cuas_lmax_fraction, 5,8,"",
		gd.addNumericField("Maximums separation fraction",           this.cuas_lmax_fraction, 5,8,"",
				"Check if local maximum is separated from tye surrounding by this fraction of the maximum value.");
				"Check if local maximum is separated from the surrounding by this fraction of the maximum value.");
		gd.addNumericField("Hack for ridges",                        this.cuas_lmax_hack_ridge, 5,8,"",
		gd.addNumericField("Hack for ridges",                        this.cuas_lmax_hack_ridge, 5,8,"",
				"Remove horizontal streaks, where average(abs()) for the line exceeds fraction of abs max(0.32-good max, 0.55 - bad max).");
				"Remove horizontal streaks, where average(abs()) for the line exceeds fraction of abs max(0.32-good max, 0.55 - bad max).");
		gd.addNumericField("Maximums separation radius",             this.cuas_lmax_radius, 5,8,"pix",
		gd.addNumericField("Maximums separation radius",             this.cuas_lmax_radius, 5,8,"pix",
@@ -2987,7 +2987,7 @@ min_str_neib_fpn 0.35
		gd.addNumericField("Image range",                           this.cuas_input_range, 5,8,"10mK",
		gd.addNumericField("Image range",                           this.cuas_input_range, 5,8,"10mK",
				"Dispaly pixel values range (1.0 ~= 10 mK).");
				"Dispaly pixel values range (1.0 ~= 10 mK).");
		gd.addCheckbox ("Scale images twice",                       this.cuas_scale2x,
		gd.addCheckbox ("Scale images twice",                       this.cuas_scale2x,
				"Scale imges to 1280x1024 for higher annotation quality.");
				"Scale images to 1280x1024 for higher annotation quality.");
		gd.addCheckbox ("Smooth background with runnong average",   this.cuas_ra_background,
		gd.addCheckbox ("Smooth background with runnong average",   this.cuas_ra_background,
				"Apply running average to the background of the moving targets (false - use high-noise no-averaged images.");
				"Apply running average to the background of the moving targets (false - use high-noise no-averaged images.");