/// <summary> /// /// </summary> /// <param name="o"></param> public OptionsForm(OptionsForm.Options o) { InitializeComponent(); _o = new Options(o); // copy in }
/// <summary> /// Constructs a FittsSession instance. A FittsSession contains conditions for a Fitts' law study, /// which, in turn, contain a set of trials. A constructed instance contains a list of conditions /// in sequence, which themselves contain a list of trials. /// </summary> /// <param name="o">The options that configure this session obtained from the OptionsForm dialog.</param> public SessionData(OptionsForm.Options o) { // // Set the condition variables that define this test. // _subject = o.Subject; _circular = o.Is2D; _a = o.A; _w = o.W; _mtpct = o.MTPct; _intercept = o.Intercept; _slope = o.Slope; _screen = Screen.PrimaryScreen.Bounds; _conditions = new List <ConditionData>(); // // Create the order of conditions. Nesting is mt%[a[w]]]. // int[] a_order, w_order, mt_order; if (o.Randomize) // randomize the order of conditions { a_order = RandomEx.Array(0, o.A.Length - 1, o.A.Length, true); w_order = RandomEx.Array(0, o.W.Length - 1, o.W.Length, true); if (o.MTPct != null) { mt_order = RandomEx.Array(0, o.MTPct.Length - 1, o.MTPct.Length, true); while (o.MTPct[mt_order[0]] < StatsEx.Mean(o.MTPct)) // enforce that the first MT% condition is >avg(MT%) { mt_order = RandomEx.Array(0, o.MTPct.Length - 1, o.MTPct.Length, true); } } else { mt_order = null; } } else // in-order arrays { a_order = new int[o.A.Length]; for (int i = 0; i < o.A.Length; i++) { a_order[i] = i; } w_order = new int[o.W.Length]; for (int i = 0; i < o.W.Length; i++) { w_order[i] = i; } mt_order = (o.MTPct != null) ? new int[o.MTPct.Length] : null; for (int i = 0; o.MTPct != null && i < o.MTPct.Length; i++) { mt_order[i] = i; } } // // Create the ordered condition list for the first block of all conditions (i.e., one time through). // int n = 0; for (int i = 0; o.MTPct == null || i < o.MTPct.Length; i++) { for (int j = 0; j < o.A.Length; j++) { for (int k = 0; k < o.W.Length; k++) { double pct = (o.MTPct != null) ? o.MTPct[mt_order[i]] : -1.0; // MT% double fitts = o.Intercept + o.Slope * Math.Log((double)o.A[a_order[j]] / o.W[w_order[k]] + 1.0, 2.0); long mt = (o.MTPct != null) ? (long)fitts : -1L; // Fitts' law predicted movement time ConditionData cd = new ConditionData(0, n++, o.A[a_order[j]], o.W[w_order[k]], pct, mt, o.Trials, o.Practice, o.Is2D); _conditions.Add(cd); } } if (o.MTPct == null) { break; } } // // Now possibly replicate the created order multiple times. // int nConditions = _conditions.Count; // number of conditions in one block for (int b = 1; b < o.Blocks; b++) { for (int c = 0; c < nConditions; c++) { ConditionData fx = _conditions[c]; ConditionData fc = new ConditionData(b, c, fx.A, fx.W, fx.MTPct, fx.MTPred, o.Trials, o.Practice, o.Is2D); _conditions.Add(fc); } } }
/// <summary> /// /// </summary> public OptionsForm() { InitializeComponent(); _o = new Options(); // defaults }