Instances of this class are used to send data to interested listeners.
Inheritance: System.EventArgs
示例#1
0
        public void HandleDataPoint(DataEventArgs e)
        {
            Profile currentProfile = Controller.GetController().ProfileManager.CurrentProfile;
            // update the TOF graphs

            if (currentProfile.GUIConfig.average)
            {
                if (shotCounter % currentProfile.GUIConfig.updateTOFsEvery == 0)
                {
                    if (avOnTof != null)
                    {
                        window.PlotOnTOF(avOnTof/onAverages);
                    }
                    avOnTof = (TOF) e.point.AverageOnShot.TOFs[0];
                    onAverages = 1;

                    if ((bool)currentProfile.AcquisitorConfig.switchPlugin.Settings["switchActive"])
                    {
                        if (avOffTof != null)
                        {
                            window.PlotOffTOF(avOffTof/offAverages);
                        }
                        avOffTof = (TOF) e.point.AverageOffShot.TOFs[0];
                        offAverages = 1;
                    }
                }
                else // do the averaging
                {
                    if (avOnTof != null)
                    {
                        avOnTof = avOnTof + ((TOF) e.point.AverageOnShot.TOFs[0]);
                        onAverages++;
                    }
                    if ((bool)currentProfile.AcquisitorConfig.switchPlugin.Settings["switchActive"] && avOffTof != null)
                    {
                        avOffTof = avOffTof + ((TOF) e.point.AverageOffShot.TOFs[0]);
                        offAverages++;
                    }
                }
            }

            else  // if not averaging
            {
                if (shotCounter % currentProfile.GUIConfig.updateTOFsEvery == 0)
                {
                    window.PlotOnTOF((TOF)e.point.AverageOnShot.TOFs[0]);
                    if ((bool)currentProfile.AcquisitorConfig.switchPlugin.Settings["switchActive"])
                    {
                        window.PlotOffTOF((TOF)e.point.AverageOffShot.TOFs[0]);
                    }
                }
            }

            // update the spectra
            pointsToPlot.Points.Add(e.point);
            if (shotCounter % currentProfile.GUIConfig.updateSpectraEvery == 0)
            {
                if (pointsToPlot.AnalogChannelCount >= 1)
                    window.AppendToAnalog1(pointsToPlot.ScanParameterArray, pointsToPlot.GetAnalogArray(0));
                if (pointsToPlot.AnalogChannelCount >= 2)
                    window.AppendToAnalog2(pointsToPlot.ScanParameterArray, pointsToPlot.GetAnalogArray(1));
                window.AppendToPMTOn(pointsToPlot.ScanParameterArray,
                    pointsToPlot.GetTOFOnIntegralArray(0,
                    startTOFGate, endTOFGate));
                if ((bool)currentProfile.AcquisitorConfig.switchPlugin.Settings["switchActive"])
                {
                    window.AppendToPMTOff(pointsToPlot.ScanParameterArray,
                        pointsToPlot.GetTOFOffIntegralArray(0,
                        startTOFGate, endTOFGate));
                    window.AppendToDifference(pointsToPlot.ScanParameterArray,
                        pointsToPlot.GetDifferenceIntegralArray(0,
                        startTOFGate, endTOFGate));
                }
                // update the spectrum fit if in shot mode.
                if (spectrumFitMode == FitMode.Shot)
                {
                    Scan currentScan = Controller.GetController().DataStore.CurrentScan;
                    if (currentScan.Points.Count > 10)
                    {
                        FitAndPlotSpectrum(currentScan);
                   }
                }
                pointsToPlot.Points.Clear();
            }
            shotCounter++;
        }
示例#2
0
        private void Acquire()
        {
            try
            {
                // lock a monitor onto the acquisitor, to synchronise with the controller
                // when acquiring a set number of scans - the monitor is released in
                // AcquisitionFinishing()
                Monitor.Enter(AcquisitorMonitorLock);

                // initialise all of the plugins
                config.outputPlugin.AcquisitionStarting();
                config.pgPlugin.AcquisitionStarting();
                config.shotGathererPlugin.AcquisitionStarting();
                config.switchPlugin.AcquisitionStarting();
                config.yagPlugin.AcquisitionStarting();
                config.analogPlugin.AcquisitionStarting();

                for (int scanNumber = 0 ;; scanNumber++)
                {

                    // prepare for the scan start
                    config.outputPlugin.ScanStarting();
                    config.pgPlugin.ScanStarting();
                    config.shotGathererPlugin.ScanStarting();
                    config.switchPlugin.ScanStarting();
                    config.yagPlugin.ScanStarting();
                    config.analogPlugin.ScanStarting();
                    for (int pointNumber = 0 ; pointNumber < (int)config.outputPlugin.Settings["pointsPerScan"] ; pointNumber++)
                    {
                        // calculate the new scan parameter and move the scan along
                        config.outputPlugin.ScanParameter = NextScanParameter(pointNumber, scanNumber);

                        // check for a change in the pg parameters
                        lock(this)
                        {
                            if (tweakFlag)
                            {
                                // now it's safe to update the pattern generator settings
                                // and ask the pg to reload
                                SettingsReflector sr = new SettingsReflector();
                                sr.SetField(config.pgPlugin,
                                    latestTweak.parameter, latestTweak.newValue.ToString());
                                config.pgPlugin.ReloadPattern();
                                tweakFlag = false;
                            }
                        }

                        ScanPoint sp = new ScanPoint();
                        sp.ScanParameter = config.outputPlugin.ScanParameter;

                        for (int shotNum = 0; shotNum < (int)(config.outputPlugin.Settings["shotsPerPoint"]); shotNum++)
                        {
                            // Set the switch state
                            config.switchPlugin.State = true;

                            // wait for the data gatherer to finish
                            config.shotGathererPlugin.ArmAndWait();

                            // read out the data

                            sp.OnShots.Add(config.shotGathererPlugin.Shot);

                            if ((bool)config.switchPlugin.Settings["switchActive"])
                            {
                                config.switchPlugin.State = false;
                                config.shotGathererPlugin.ArmAndWait();
                                sp.OffShots.Add(config.shotGathererPlugin.Shot);
                            }
                        }

                        // sample the analog channels and add them to the ScanPoint
                        config.analogPlugin.ArmAndWait();
                        sp.Analogs.AddRange(config.analogPlugin.Analogs);

                        // send up the data bundle
                        DataEventArgs evArgs = new DataEventArgs();
                        evArgs.point = sp;
                        OnData(evArgs);

                        // check for exit
                        if (CheckIfStopping())
                        {
                            AcquisitionFinishing(config);
                            return;
                        }
             					}
                    // prepare for the start of the next scan
                    OnScanFinished();
                    config.pgPlugin.ScanFinished();
                    config.yagPlugin.ScanFinished();
                    config.outputPlugin.ScanFinished();
                    config.shotGathererPlugin.ScanFinished();
                    config.switchPlugin.ScanFinished();
                    config.analogPlugin.ScanFinished();
                    // I think that this pause will workaround an annoying threading bug
                    // I should probably be less cheezy and put a lock in, but I'm not really
                    // sure that I know what the bug is as it's intermittent (and rare).
                    Thread.Sleep(750);

                    // check if we are finished scanning
                    if (scanNumber + 1 == numberOfScans)
                    {
                        backendState = AcquisitorState.stopped;
                        // set the controller state to stopped
                        Controller.GetController().appState = Controller.AppState.stopped;
                        AcquisitionFinishing(config);
                        return;
                    }

                }

            }
            catch (Exception e)
            {
                // last chance exception handler - this stops a rogue exception in the
                // acquire loop from killing the whole program
                Console.Error.Write(e.Message + e.StackTrace);
                MessageBox.Show("Exception caught in acquire loop.\nTake care - the program " +
                    "is probably unstable.\n" + e.Message + "\n" + e.StackTrace, "Acquire error",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                // Try and stop the pattern gracefully before the program dies
                config.pgPlugin.AcquisitionFinished();
                lock (this) backendState = AcquisitorState.stopped;
            }
        }
示例#3
0
 protected virtual void OnData( DataEventArgs e )
 {
     if (Data != null) Data(this, e);
 }
示例#4
0
        // This function is registered to handle data events from the acquisitor.
        // Whenever the acquisitor has new data it will call this function.
        // Note well that this will be called on the acquisitor thread (meaning
        // no direct GUI manipulation in this function).
        private void DataHandler(object sender, DataEventArgs e)
        {
            lock (this)
            {
                // grab the settings
                GUIConfiguration guiConfig = profileManager.CurrentProfile.GUIConfig;
                // store the datapoint
                dataStore.AddScanPoint(e.point);

                // tell the viewers to handle the data point
                viewerManager.HandleDataPoint(e);
            }
        }
示例#5
0
        public void HandleDataPoint(DataEventArgs e)
        {
            Profile currentProfile = Controller.GetController().ProfileManager.CurrentProfile;
            // update the TOF graphs

            if (currentProfile.GUIConfig.average)
            {
                if (shotCounter % currentProfile.GUIConfig.updateTOFsEvery == 0)
                {
                    if (avOnTofs != null)
                    {
                        for (int i = 0; i < avOnTofs.Count; i++) { avOnTofs[i] = ((TOF)avOnTofs[i]) / onAverages; }
                        window.PlotOnTOF(avOnTofs);
                        if (avOnTofs.Count > 1)
                        {
                            // integral between the signal gates minus the integral between the background gates (adjusted for the relative width of the two gates)
                            double normVal = (((TOF)avOnTofs[1]).Integrate(NormSigGateLow, NormSigGateHigh)) - (((TOF)avOnTofs[1]).Integrate(NormBgGateLow, NormBgGateHigh)) * (NormSigGateHigh - NormSigGateLow) / (NormBgGateHigh - NormBgGateLow);
                            window.PlotNormedOnTOF(((TOF)avOnTofs[0]) / normVal);
                        }
                    }
                    avOnTofs = e.point.AverageOnShot.TOFs;
                    onAverages = 1;

                    if ((bool)currentProfile.AcquisitorConfig.switchPlugin.Settings["switchActive"])
                    {
                        if (avOffTofs != null)
                        {
                            for (int i = 0; i < avOffTofs.Count; i++) { avOffTofs[i] = ((TOF)avOffTofs[i]) / offAverages; }
                            window.PlotOffTOF(avOffTofs);
                            if (avOffTofs.Count > 1)
                            {
                                double normVal = (((TOF)avOffTofs[1]).Integrate(NormSigGateLow, NormSigGateHigh)) - (((TOF)avOffTofs[1]).Integrate(NormBgGateLow, NormBgGateHigh)) * (NormSigGateHigh - NormSigGateLow) / (NormBgGateHigh - NormBgGateLow);
                                window.PlotNormedOffTOF(((TOF)avOffTofs[0]) / normVal);
                            }
                        }
                        avOffTofs = e.point.AverageOffShot.TOFs;
                        offAverages = 1;
                    }
                }
                else // do the averaging
                {
                    if (avOnTofs != null)
                    {
                        //avOnTof = avOnTof + ((TOF) e.point.AverageOnShot.TOFs[0]);
                        for (int i = 0; i < avOnTofs.Count; i++) { avOnTofs[i] = (TOF)avOnTofs[i] + ((TOF)e.point.AverageOnShot.TOFs[i]); }
                        onAverages++;
                    }
                    if ((bool)currentProfile.AcquisitorConfig.switchPlugin.Settings["switchActive"] && avOffTofs != null)
                    {
                        //avOffTof = avOffTof + ((TOF) e.point.AverageOffShot.TOFs[0]);
                        for (int i = 0; i < avOffTofs.Count; i++) { avOffTofs[i] = (TOF)avOffTofs[i] + ((TOF)e.point.AverageOffShot.TOFs[i]); }
                        offAverages++;
                    }
                }
            }

            else  // if not averaging
            {
                if (shotCounter % currentProfile.GUIConfig.updateTOFsEvery == 0)
                {
                    ArrayList currentTofs = e.point.AverageOnShot.TOFs;
                    window.PlotOnTOF(currentTofs);
                    if (currentTofs.Count > 1)
                    {
                        double normVal = (((TOF)currentTofs[1]).Integrate(NormSigGateLow, NormSigGateHigh)) - (((TOF)currentTofs[1]).Integrate(NormBgGateLow, NormBgGateHigh)) * (NormSigGateHigh - NormSigGateLow) / (NormBgGateHigh - NormBgGateLow);
                        window.PlotNormedOnTOF(((TOF)currentTofs[0]) / normVal);
                    }
                    if ((bool)currentProfile.AcquisitorConfig.switchPlugin.Settings["switchActive"])
                    {
                        currentTofs = e.point.AverageOffShot.TOFs;
                        window.PlotOffTOF(currentTofs);
                        if (currentTofs.Count > 1)
                        {
                            double normVal = (((TOF)currentTofs[1]).Integrate(NormSigGateLow, NormSigGateHigh)) - (((TOF)currentTofs[1]).Integrate(NormBgGateLow, NormBgGateHigh)) * (NormSigGateHigh - NormSigGateLow) / (NormBgGateHigh - NormBgGateLow);
                            window.PlotNormedOffTOF(((TOF)currentTofs[0]) / normVal);
                        }
                    }
                }
            }

            // update the spectra
            pointsToPlot.Points.Add(e.point);
            if (shotCounter % currentProfile.GUIConfig.updateSpectraEvery == 0)
            {
                if (pointsToPlot.AnalogChannelCount >= 1)
                    window.AppendToAnalog1(pointsToPlot.ScanParameterArray, pointsToPlot.GetAnalogArray(0));
                if (pointsToPlot.AnalogChannelCount >= 2)
                    window.AppendToAnalog2(pointsToPlot.ScanParameterArray, pointsToPlot.GetAnalogArray(1));
                window.AppendToPMTOn(pointsToPlot.ScanParameterArray,
                    pointsToPlot.GetTOFOnIntegralArray(0,
                    startTOFGate, endTOFGate));
                if ((bool)currentProfile.AcquisitorConfig.switchPlugin.Settings["switchActive"])
                {
                    window.AppendToPMTOff(pointsToPlot.ScanParameterArray,
                        pointsToPlot.GetTOFOffIntegralArray(0,
                        startTOFGate, endTOFGate));
                    window.AppendToDifference(pointsToPlot.ScanParameterArray,
                        pointsToPlot.GetDifferenceIntegralArray(0,
                        startTOFGate, endTOFGate));
                }
                // update the spectrum fit if in shot mode.
                if (spectrumFitMode == FitMode.Shot)
                {
                    Scan currentScan = Controller.GetController().DataStore.CurrentScan;
                    if (currentScan.Points.Count > 10)
                    {
                        FitAndPlotSpectrum(currentScan);
                   }
                }
                pointsToPlot.Points.Clear();
            }
            shotCounter++;
        }
示例#6
0
 public void HandleDataPoint(DataEventArgs e)
 {
     foreach (DictionaryEntry de in viewers) ((Viewer)(de.Value)).HandleDataPoint(e);
 }