public static ScanPoint operator +(ScanPoint p1, ScanPoint p2) { if (p1.OnShots.Count == p2.OnShots.Count && p1.OffShots.Count == p2.OffShots.Count && p1.Analogs.Count == p2.Analogs.Count) { ScanPoint temp = new ScanPoint(); temp.ScanParameter = p1.ScanParameter; for (int i = 0; i < p1.OnShots.Count; i++) { temp.OnShots.Add((Shot)p1.OnShots[i] + (Shot)p2.OnShots[i]); } for (int i = 0; i < p1.OffShots.Count; i++) { temp.OffShots.Add((Shot)p1.OffShots[i] + (Shot)p2.OffShots[i]); } for (int i = 0; i < p1.Analogs.Count; i++) { temp.Analogs.Add((double)p1.Analogs[i] + (double)p2.Analogs[i]); } return(temp); } else { if (p1.OnShots.Count == 0) { return(p2); } if (p2.OnShots.Count == 0) { return(p1); } return(null); } }
public static ScanPoint operator /(ScanPoint p, int n) { ScanPoint temp = new ScanPoint(); temp.ScanParameter = p.ScanParameter; foreach (Shot s in p.OnShots) { temp.OnShots.Add(s / n); } foreach (Shot s in p.OffShots) { temp.OffShots.Add(s / n); } foreach (double a in p.Analogs) { temp.Analogs.Add(a / n); } return(temp); }
public static ScanPoint operator +(ScanPoint p1, ScanPoint p2) { if (p1.OnShots.Count == p2.OnShots.Count && p1.OffShots.Count == p2.OffShots.Count && p1.Analogs.Count == p2.Analogs.Count) { ScanPoint temp = new ScanPoint(); temp.ScanParameter = p1.ScanParameter; for (int i = 0 ; i < p1.OnShots.Count ; i++) temp.OnShots.Add((Shot)p1.OnShots[i] + (Shot)p2.OnShots[i]); for (int i = 0 ; i < p1.OffShots.Count ; i++) temp.OffShots.Add((Shot)p1.OffShots[i] + (Shot)p2.OffShots[i]); for (int i = 0 ; i < p1.Analogs.Count ; i++) temp.Analogs.Add((double)p1.Analogs[i] + (double)p2.Analogs[i]); return temp; } else { if (p1.OnShots.Count == 0) return p2; if (p2.OnShots.Count == 0) return p1; return null; } }
private ScanPoint GetAverageScanPoint(double lowGate, double highGate) { Scan ss = GetSortedScan(); double scanParameterStart = ((ScanPoint)ss.points[0]).ScanParameter; double scanParameterEnd = ((ScanPoint)ss.points[points.Count - 1]).ScanParameter; int low = (int)Math.Ceiling(ss.points.Count * (lowGate - scanParameterStart) / (scanParameterEnd - scanParameterStart)); int high = (int)Math.Floor(ss.points.Count * (highGate - scanParameterStart) / (scanParameterEnd - scanParameterStart)); if (low < 0) { low = 0; } if (low >= ss.points.Count) { low = ss.points.Count - 2; } if (high < low) { high = low + 1; } if (high >= ss.points.Count) { high = ss.points.Count - 1; } ScanPoint temp = new ScanPoint(); for (int i = low; i < high; i++) { temp += (ScanPoint)ss.points[i]; } return(temp / (high - low)); }
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; } }
public void AddScanPoint(ScanPoint sp) { currentScan.Points.Add(sp); }
private ScanPoint GetAverageScanPoint(double lowGate, double highGate) { Scan ss = GetSortedScan(); double scanParameterStart = ((ScanPoint)ss.points[0]).ScanParameter; double scanParameterEnd = ((ScanPoint)ss.points[points.Count -1]).ScanParameter; int low = (int)Math.Ceiling(ss.points.Count * (lowGate - scanParameterStart) / (scanParameterEnd - scanParameterStart)); int high = (int)Math.Floor(ss.points.Count * (highGate - scanParameterStart) / (scanParameterEnd - scanParameterStart)); if (low < 0) low = 0; if (low >= ss.points.Count) low = ss.points.Count - 2; if (high < low) high = low + 1; if (high >= ss.points.Count) high = ss.points.Count -1; ScanPoint temp = new ScanPoint(); for (int i = low ; i < high ; i++) temp += (ScanPoint)ss.points[i]; return temp /(high-low); }
public static ScanPoint operator /(ScanPoint p, int n) { ScanPoint temp = new ScanPoint(); temp.ScanParameter = p.ScanParameter; foreach (Shot s in p.OnShots) temp.OnShots.Add(s/n); foreach (Shot s in p.OffShots) temp.OffShots.Add(s/n); foreach (double a in p.Analogs) temp.Analogs.Add(a/n); return temp; }