Esempio n. 1
0
 /// <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;
         }
     }
 }
Esempio n. 2
0
        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);
        }