ENLIGHTEN
Cross-platform desktop GUI for Wasatch Photonics spectrometers
Loading...
Searching...
No Matches
Todo List
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.