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++; }
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; } }
protected virtual void OnData( DataEventArgs e ) { if (Data != null) Data(this, e); }
// 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); } }
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++; }
public void HandleDataPoint(DataEventArgs e) { foreach (DictionaryEntry de in viewers) ((Viewer)(de.Value)).HandleDataPoint(e); }