- Class Analysis.Stats.Stats
- "stitch" spectra from multiple spectrometer ranges? would require tracking x-coord of each pixel, in all 3 axes?
- Class Analysis.StripChart.StripChart
- this is an example of a plug-in that would benefit from multiple y-axes
- Class Analysis.Tail.Tail
understand QTimer warning in error log
add disconnect to delete curves
auto-color "fade" based on assigned Spectrometer color
support multiple spectrometers
- Class ble-util.Fixture
- It appears notifications don't work on Windows?!?
- Member EmissionLines.EmissionLines.get_lamps (self)
- for completeness add He, Rn
- Class enlighten.common.Views
- consider auto-populating inside code
- Member enlighten.Controller.Controller.acquire_reading (self, Spectrometer spec)
- eventually move to AcquisitionFeature
- Member enlighten.Controller.Controller.current_spectrometer (self)
- DEPRECATE
- Member enlighten.Controller.Controller.generate_x_axis (self, spec=None, settings=None, unit=None, cropped=True)
move this to Spectrometer? Graph?
need to update for DetectorRegions
- Member enlighten.Controller.Controller.process_hardware_strip (self)
- move to StripChartFeature
- Member enlighten.Controller.Controller.process_reading (self, reading, spec=None, dark=None, ref=None, settings=None)
- split into "update graphs" and "post-processing"
- Member enlighten.Controller.Controller.set_curve_data (self, curve, y, x=None, label=None)
- merge into Graph.set_data (calling it is a start)
- Member enlighten.Controller.Controller.setup_hardware_strip_listener (self)
- move to StripChartFeature
- Class enlighten.device.BatteryFeature.BatteryFeature
- track battery state in SpectrometerApplicationState to support multiple connected spectrometers
- Class enlighten.device.GainDBFeature.GainDBFeature
- currently re-using this class for IDSPeak cameras, even though they seem to treat gain as a scalar rather than dB. Possibly we should continue to pass gain as dB all the way through the pipeline and only linearize it in IDSDevice?
- Class enlighten.device.Spectrometer.Spectrometer
- consider moving to enlighten.device
- Class enlighten.device.SpectrometerApplicationState.SpectrometerApplicationState
- consider moving to enlighten.device
- Member enlighten.device.SpectrometerApplicationState.SpectrometerApplicationState.reset_rolling_data (self, cfu=None, time_window=3, hotplug=True)
- remove cfu (add setters for secondary adc windows)
- Class enlighten.file_io.Configuration.Configuration
allow Business Objects to define their own ConfigurationDefaults.
support registration, similar to EEPROMEditor, of tuples like the following:
- Member enlighten.file_io.HardwareFileOutputManager.HardwareFileOutputManager.register_feature (self, feature_obj)
- rename register_observer
- Member enlighten.KnowItAll.Feature.Feature._get_selected_compound_name (self)
could return AliasedName
- Member enlighten.KnowItAll.Feature.Feature.KNOW_IT_ALL_DIRECTORY
- make this configurable, some might not have it on C: etc
- Class enlighten.KnowItAll.Wrapper.Wrapper
support authentication (look for "expected" within match results)
support good/bad (look for known-good and known-bad results, returning binary indicator)
- Member enlighten.KnowItAll.Wrapper.Wrapper.send_request (self, x_axis, spectrum, max_results, min_score, measurement_id=None)
- address use-case of identifying loaded spectra, perhaps via a process(x, y) method
- Member enlighten.measurement.AreaScanFeature.AreaScanFeature.finish_update (self)
- qimage2ndarray technically provides access to the existing QImage's underlying data, so we could probably simply update the existing QImage rather than make a whole new QPixmap.
- Member enlighten.measurement.AreaScanFeature.AreaScanFeature.update_visibility (self)
- mess with is_supported etc if appropriate
- Class enlighten.measurement.Measurement.Measurement
- more robust / defined behavior with duplicate labels across Measurements (currently has some graphing glitches when adding / removing traces)
- Member enlighten.measurement.Measurement.Measurement.expand_template (self, template)
- We can't easily expand the set of objects whose attributes can be used (like BatchCollection) without running into potential namespace collisions (different objects can have identically- named attributes, leading to ambiguity). Templates should move toward a prefixed notation like "m.measurement_id", "b.current_batch_count" etc. This could then be implemented within a call to string.format(), giving users access to full precision controls etc.
- Member enlighten.measurement.Measurement.Measurement.get_metadata (self, field)
Note that temperature fields come from the underlying Reading object, and in the case that we loaded previously-saved spectra from disk, we're not currently re-instantiating Reading objects (only the ProcessedReading, which is all that's needed for on-screen traces), so currently those output "NA"
replace if/elif with dict of lambdas
- Member enlighten.measurement.Measurement.Measurement.save (self, resave=False)
- cloud etc
- Member enlighten.measurement.Measurement.Measurement.save_csv_file_by_row (self, resave=False)
support .cropped, .interpolated
consider how to properly support verify_pathname and resave
- Member enlighten.measurement.MeasurementFactory.MeasurementFactory.render_thumbnail_to_qpixmap (self, measurement)
- seems like this should be in ThumbnailWidget?
- Member enlighten.measurement.Measurements.Measurements.update_kia (self)
- fold into observers?
- Member enlighten.measurement.SaveOptions.SaveOptions.update_filename_template (self)
- Note that we're not actually validating that the macro is valid; this is another reason to create a TemplateFeature.
- Class enlighten.network.CloudManager.CloudManager
- this whole class needs reviewed.
- Class enlighten.parser.DashFileParser.DashMeasurement
consider replacing both this and DashSpectrometer with a generalized ExportedMeasurement, containing a generic post_process_metadata() method
instantiate a Reading object and write detector/laser temperature to it
- Class enlighten.parser.ExportFileParser.ExportedMeasurement
- this can probably be generalized and re-used for ColumnFileParser at least, and likely DashFileParser as well.
- Member enlighten.parser.SPCFileParser.SPCFileParser.parse (self)
- think about other things we could import from the file
- Class enlighten.parser.TextFileParser.TextFileParser
consider parsing metadata found below the spectrum, including the following from Andor Solis .asc files:
given Andor serial number, consider using ENLIGHTEN's configured excitation for that unit as the excitation — or even for full x-axis?
- Member enlighten.Plugins.PluginController.PluginController.display_exception (self, summary, detail)
- move from QMessageBox to a custom dialog that's resizeable / larger
- Member enlighten.Plugins.PluginController.PluginController.find_all_plugins (self)
- prefix name with module hierarchy, i.e. Prod.DarkNoise, Demo.NullOddBlock
- Member enlighten.Plugins.PluginController.PluginController.handle_response (self, response, orig_pr=None)
- split-out outputs, series into their own methods
- Member enlighten.Plugins.PluginController.PluginController.show_plugin_graph (self, flag)
- it would be neat if plugins themselves could toggle self.use_other_graph, but we'd need to move existing curves between graphs/legends via self.plugin_curves
- Member enlighten.post_processing.AbsorbanceFeature.AbsorbanceFeature.process (self, processed_reading, settings, app_state)
- optimize with Numpy
- Class enlighten.post_processing.AutoRamanFeature.AutoRamanFeature
- consider registering to LaserControlFeature events so if the user tries turning off the laser, we can force-stop the Auto-Raman measurement.
- Class enlighten.post_processing.PixelCalibration.PixelCalibration
- persist enable in enlighten.ini
- Class enlighten.post_processing.TransmissionFeature.TransmissionFeature
- redo process() math with numpy
- Member enlighten.scope.Graph.Graph.add_curve (self, name, y=[], x=None, pen=None, spec=None, measurement=None, rehide=True, in_legend=True)
- we should probably create a Curve class to encapsulate data associated with a particular on-screen trace, rather than hanging attributes off a library class
- Member enlighten.scope.Graph.Graph.get_x_axis_unit (self)
- merge with common suffixes
- Class enlighten.scope.PresetFeature.PresetFeature
- This class should probably register as an observer on Multispec, and re-fire apply(self.selected_preset) when Multispec changes the active spectrometer.
- Class enlighten.timing.RollingDataSet.RollingDataSet
- We may need to track these by timestamp, so that things like StatusIndicators can base an LED's color on "all_within(-55C, 1C, window=10sec)" (more-or-less). We need to be able to discriminate between the graph window size and the analytical / status window size.
- Class enlighten.ui.FocusListener.FocusListener
- it would seem slightly more efficient if we actually disconnected the signal in unregister(), and reconnect in register
- Class enlighten.ui.PageNavigation.PageNavigation
- WE NEED to decide how to handle that more elegantly when in Expert Mode with a Raman spectrometer (probably by including Raman as a selectable Technique, and automatically setting that if transitioning to Expert "from" Raman Mode).
- Class enlighten.ui.Sounds.Sounds
- Allow user sound overrides in EnlightenSpectra/sounds (basename = event)
- Class enlighten.ui.StatusBarFeature.StatusBarFeature
- selectively show/hide trios which are inapplicable to the currently selected spectrometer (battery should be hidden unless has_battery)
- Class enlighten.ui.StatusIndicators.StatusIndicators
- Laser and temperature indicators should probably represent the UNION of connected spectrometers, so if at least one is firing, or has unstable temperature, that should probably be indicated. We could provide more data on "which" spectrometers contribute to a particular reading via tooltip.
- Member enlighten.ui.ThumbnailWidget.ThumbnailWidget.add_curve_to_graph (self)
- move some of this to Graph?
- Member enlighten.util.add_combobox_item (combobox, name)
- move to GUI
- Member enlighten.util.apply_min_max (widget)
- move to GUI
- Member enlighten.util.decr_spinbox (spinbox)
- move to GUI
- Member enlighten.util.find_file (filename, dirs)
- move to FileManager
- Member enlighten.util.get_combobox_item_index (combobox, name)
- move to GUI
- Member enlighten.util.incr_spinbox (spinbox)
- move to GUI
- Member enlighten.util.remove_combobox_item (combobox, name)
- move to GUI
- Member enlighten.util.safe_mkdirp (directory)
- move to FileManager
- Member enlighten.util.set_enabled (w, flag, tooltip=None)
- move to GUI
- Member enlighten.util.set_min_max (widget, lo, hi, value=None)
- move to GUI
- Member enlighten.util.set_table_row_color (table, row, color)
replace with Colors
move to GUI
- Member enlighten.util.sets_intersect (s1, s2, case_insensitive=False)
could memoize if this ever became performance-critical
best option would be to maintain sets in lowercase
- Member EnlightenPlugin.EnlightenPluginBase.plot (self, y, x=None, title=None, color=None)
- add weight
- Class EnlightenPlugin.EnlightenPluginResponse
- add metadata arrays as CSV columns
- Class LibraryMatching.LibraryMatching
- This is currently oriented toward Raman (defaulting to wavenumbers), but there's no reason it couldn't also support wavelengths for non-Raman (absorbance etc).
- Class wasatch.AndorDevice.AndorDevice
have check_result return a SpectrometerResponse
try to auto-detect whether x-axis needs inverted via DLL.GetImageFlip()
- Member wasatch.AndorDevice.AndorDevice._get_spectrum_raw (self)
- missing bad-pixel correction
- Class wasatch.BLEDevice.BLEDevice
- consider https://github.com/django/asgiref#function-wrappers
- Member wasatch.EEPROM.EEPROM.generate_write_buffers (self)
- update to use self.fields
- Member wasatch.EEPROM.EEPROM.has_mml (self)
- include light_source_type
- Member wasatch.EEPROM.EEPROM.has_sml (self)
- include light_source_type
- Member wasatch.EEPROM.EEPROM.read_eeprom (self)
- update to use self.fields
- Member wasatch.EEPROM.EEPROM.read_spline (self)
- turn into EEPROMSpline
- Member wasatch.FeatureIdentificationDevice.FeatureIdentificationDevice._get_code (self, int bRequest, int wValue=0, int wIndex=0, int wLength=64, str label="", int msb_len=None, int lsb_len=None)
- consider adding retry logic as well
- Member wasatch.FeatureIdentificationDevice.FeatureIdentificationDevice.apply_edc (self, spectrum)
- we might want to make buffer length configurable, either in spectra or by time (consider 10ms vs 1sec integration time)
- Member wasatch.FeatureIdentificationDevice.FeatureIdentificationDevice.get_discretes_enabled (self)
- find out opcode
- Member wasatch.FeatureIdentificationDevice.FeatureIdentificationDevice.handle_requests (self, list[SpectrometerRequest] requests)
- consider making 'requests' an object, and dynamically checking to see if it is a single SpectrometerRequest or a list[SpectrometerRequest]; if the former, only return a single SpectrometerResponse.
- Member wasatch.FeatureIdentificationDevice.FeatureIdentificationDevice.set_accessory_enable (self, bool flag)
- change opcode (conflicts with GET_DETECTOR_START_LINE)
- Member wasatch.FeatureIdentificationDevice.FeatureIdentificationDevice.set_detector_gain (self, float gain)
- we should probably track runtime hardware gain in SpectrometerState, not EEPROM
- Member wasatch.FeatureIdentificationDevice.FeatureIdentificationDevice.set_integration_time_ms (self, float ms)
- SiG needs to wait 20ms + 8 frames for stabilization.
- Member wasatch.FeatureIdentificationDevice.FeatureIdentificationDevice.set_laser_power_perc (self, float value_in, bool set_in_perc=True)
- support floating-point value, as we have a 12-bit ADC and can provide a bit more precision than 100 discrete steps (goal to support 0.1 - .125% resolution)
- Member wasatch.FeatureIdentificationDevice.FeatureIdentificationDevice.set_laser_power_perc_immediate (self, float value)
- talk to Jason about changing modulation PERIOD to longer value (200us? 400? 1000?), OR whether pulse WIDTH can be in smaller unit (500ns? 100ns?)
- Member wasatch.FeatureIdentificationDevice.FeatureIdentificationDevice.set_single_region (self, int n)
- consider clear_region() function to restore physical ROI to (0, active_vertical_pixels, 0, active_horizontal_pixels) (leave wavecal alone?)
- Member wasatch.FeatureIdentificationDevice.FeatureIdentificationDevice.set_tec_enable (self, bool flag)
- rename set_detector_tec_enable
- Member wasatch.FirmwareRequirements.FirmwareRequirements.supports (self, feature)
- generalize the logic within microcontroller and fpga portions; add ble
- Member wasatch.InterfaceDevice.InterfaceDevice.__init__ (self)
- move scan averaging, TakeOneRequest logic upstream from WasatchDevice, AndorDevice etc to here (simplify children of this class while while increasing code-reuse and consistency across all InterfaceDevice variants)
- Member wasatch.Reading.Reading.__init__ (self, device_id=None)
- add optional spectrometer_settings argument, so classes like AutoRaman could instantiate the Reading with basic attributes auto-copied from the current state?
- Member wasatch.SpectrometerSettings.SpectrometerSettings.has_marker (self)
- add this to EEPROM.feature_mask if we decide to keep the feature
- Member wasatch.SpectrometerSettings.SpectrometerSettings.update_raman_intensity_factors (self)
- Note that WasatchNET.Util.applyRamanCorrection() only generates factors from (roiStart, roiEnd), whereas this function generates them for the whole detector. They're only valid within the ROI, and should only be applied within the ROI, so this is generating more than we need (wasting memory and risking bugs).
- Member wasatch.WasatchDevice.WasatchDevice.acquire_spectrum_auto_raman (self)
- fold-in a lot of the post-reading sensor measurements (temperature, interlock etc) provided by acquire_spectrum_standard
- Member wasatch.WasatchDevice.WasatchDevice.connect_feature_identification (self)
- merge with the hardcoded list in DeviceFinderUSB
- Member wasatch.WasatchDevice.WasatchDevice.perform_optional_throwaways (self)
- This shouldn't be required at all if we're in free-running mode, or if it's been less than a second since the last acquisition.
- Class wasatch.WasatchDeviceWrapper.WasatchDeviceWrapper
- This document is full of references to continuous_poll(). That method no longer exists, and has been replaced by WrapperWorker.run()
- Class WISP.WISP
- persist previous addresses in Configuration and auto-add them to TCPBus for polling.