/// <summary> /// Acquire in loop, exit early if breakout function returns true. /// </summary> /// <param name="AcqBuffer">Array for raw camera data.</param> /// <param name="DataBuffer">Array for binned camera data.</param> /// <param name="SumBuffer">Array for accumulated binned data.</param> /// <param name="N"></param> /// <param name="Breakout"></param> void DoAcq(int[] AcqBuffer, int[] DataBuffer, int[] SumBuffer, int N, Func <int, bool> Breakout) { Array.Clear(SumBuffer, 0, SumBuffer.Length); for (var i = 0; i < N; i++) { Array.Clear(DataBuffer, 0, DataBuffer.Length); TryAcquire(AcqBuffer); Data.ColumnSum(DataBuffer, AcqBuffer); Data.Accumulate(SumBuffer, DataBuffer); RawData.WriteNext(DataBuffer, 0); if (Breakout(i)) { return; } } }
protected override void DoWork(object sender, DoWorkEventArgs e) { DoTempCheck(() => PauseCancelProgress(e, 0, new ProgressObject(null, 0, Dialog.TEMPERATURE))); if (PauseCancelProgress(e, 0, new ProgressObject(null, 0, Dialog.INITIALIZE))) { return; // Show zero progress. } #region collect variables var args = (WorkArgs)e.Argument; var N = args.N; // Save typing for later. var Times = args.Times; var AcqSize = Commander.Camera.AcqSize; var AcqWidth = Commander.Camera.AcqWidth; // minus + plus + dark var TotalScans = N + Times.Count * N * 2; #endregion #region initialize data files // Create the data store. InitDataFile(AcqWidth, TotalScans, Times.Count); // Write dummy value (number of scans). LuiData.Write(args.N, new long[] { 0, 0 }); // Write wavelengths. long[] RowSize = { 1, AcqWidth }; LuiData.Write(Commander.Camera.Calibration, new long[] { 0, 1 }, RowSize); // Write times. long[] ColSize = { Times.Count, 1 }; LuiData.Write(Times.ToArray(), new long[] { 1, 0 }, ColSize); #endregion #region Initialize buffers for acuisition data var AcqBuffer = new int[AcqSize]; var AcqRow = new int[AcqWidth]; var DarkBuffer = new int[AcqWidth]; var PlusBetaBuffer = new int[AcqWidth]; var MinusBetaBuffer = new int[AcqWidth]; var PlusBeta = new double[AcqWidth]; var MinusBeta = new double[AcqWidth]; var Dark = new double[AcqWidth]; #endregion /* * Collect LD procedure * A. Collect dark spectrum * 1. Set up dark envirornment * 2. Acquire data * B. Collect plus beta intensity * 1. Adjust time delay * 2. Move polarizer to plus beta * 3. Open pump and probe beam shutters * 4. Acquire data * 5. Close beam shutters * C. Collect minus beta intensity * 1. Move polarizer to minus beta * 2. Open pump and probe beam shutters * 3. Acquire data * 4. Close beam shutters * 5. Calculate and plot */ #region Collect dark spectrum // A0. Reset GS delay for dark Commander.DDG.SetDelay(args.PrimaryDelayName, args.TriggerName, 3.2E-8); // A1. Set up to collect dark spectrum //Commander.Polarizer.PolarizerToZeroBeta(); Commander.BeamFlag.CloseLaserAndFlash(); // A2. Acquire data DoAcq(AcqBuffer, AcqRow, DarkBuffer, N, p => PauseCancelProgress(e, p, new ProgressObject(null, 0, Dialog.PROGRESS_DARK))); if (PauseCancelProgress(e, -1, new ProgressObject(null, 0, Dialog.PROGRESS))) { return; } Data.Accumulate(Dark, DarkBuffer); #endregion for (int i = 0; i < Times.Count; i++) { // Set time delay var Delay = Times[i]; Commander.DDG.SetDelay(args.PrimaryDelayName, args.TriggerName, Delay); #region Collect minus beta // B1. Move polarizer to minus beta Commander.Polarizer.PolarizerToMinusBeta(); // B2. Open pump and probe beam shutters Commander.BeamFlag.OpenLaserAndFlash(); // B3. Acquire data if (PauseCancelProgress(e, -1, new ProgressObject(null, Delay, Dialog.PROGRESS_TIME))) { return; } DoAcq(AcqBuffer, AcqRow, MinusBetaBuffer, N, p => PauseCancelProgress(e, p, new ProgressObject(null, Delay, Dialog.PROGRESS_MINUS))); if (PauseCancelProgress(e, -1, new ProgressObject(null, 0, Dialog.PROGRESS))) { return; } Data.Accumulate(MinusBeta, MinusBetaBuffer); // B4. Close beam shutters Commander.BeamFlag.CloseLaserAndFlash(); #endregion #region Collect plus beta // C1. Move polarizer to plus beta Commander.Polarizer.PolarizerToPlusBeta(); // C2. Open pump and probe beam shutters Commander.BeamFlag.OpenLaserAndFlash(); // C3. Acquire data if (PauseCancelProgress(e, -1, new ProgressObject(null, Delay, Dialog.PROGRESS_TIME))) { return; } DoAcq(AcqBuffer, AcqRow, PlusBetaBuffer, N, p => PauseCancelProgress(e, p, new ProgressObject(null, Delay, Dialog.PROGRESS_PLUS))); if (PauseCancelProgress(e, -1, new ProgressObject(null, 0, Dialog.PROGRESS))) { return; } Data.Accumulate(PlusBeta, PlusBetaBuffer); // C4. Close beam shutters Commander.BeamFlag.CloseLaserAndFlash(); #endregion var S = Data.S(PlusBeta, MinusBeta, Dark); LuiData.Write(S, new long[] { i + 1, 1 }, RowSize); //var LD = Data.LD(PlusBeta, MinusBeta, Dark, (double)Beta.Value); //LuiData.Write(LD, new long[] { i + 1, 1 }, RowSize); if (PauseCancelProgress(e, i, new ProgressObject(S, Delay, Dialog.PROGRESS_TIME_COMPLETE))) { return; } Array.Clear(PlusBeta, 0, PlusBeta.Length); Array.Clear(MinusBeta, 0, MinusBeta.Length); Array.Clear(PlusBetaBuffer, 0, PlusBetaBuffer.Length); Array.Clear(MinusBetaBuffer, 0, PlusBetaBuffer.Length); } Array.Clear(Dark, 0, Dark.Length); Array.Clear(DarkBuffer, 0, DarkBuffer.Length); Commander.Polarizer.PolarizerToZeroBeta(); Commander.DDG.SetDelay(args.PrimaryDelayName, args.TriggerName, 3.2E-8); }