Releases: CAMBI-tech/BciPy
2.0.0
What's Changed
- #177171927 ; Signal Viewer Filter by @lawhead in #123
- Bump pillow from 8.0.0 to 8.1.1 by @dependabot[bot] in #124
- function for loading users by @AlisterD in #125
- EDF conversion fixes by @tab-cmd in #126
- Session module by @lawhead in #127
- remove display from unittests (mock) and lint by @tab-cmd in #128
- Inquiry Preview by @tab-cmd in #129
- #176581753 ; added timeout to acquisition connector by @lawhead in #130
- Update citation on README by @tab-cmd in #131
- Add abstract base class for SignalModel by @nik-sm in #132
- #176151285 ; use stim_length parameter by @lawhead in #134
- Signal module add tests by @nik-sm in #133
- Add function to compute probabilities after keyinput by @nik-sm in #136
- Python 3 7 generator end by @nik-sm in #135
- Add tests copy phrase by @nik-sm in #138
- Lint and update test-all command by @tab-cmd in #142
- Refactor pca rda kde by @nik-sm in #141
- Model load bugfix by @lawhead in #143
- Model save fix by @lawhead in #144
- Copy phrase refactor by @lawhead in #146
- Refactor trial inquiry reshaper by @nik-sm in #147
- Fix targetness assignments in write copy phrase triggers by @tab-cmd in #148
- Hippocratic license + better entry point by @tab-cmd in #150
- calibration trigger refactor and cleanup by @tab-cmd in #149
- Update the main bcipy image to cambi.png by @tab-cmd in #152
- Stimuli Ordering by @tab-cmd in #153
- 178007109 task ready by @tab-cmd in #155
- Aziz PR v2 by @celikbasak in #145
- PyQt Signal viewer by @lawhead in #154
- Replace data viewer by @lawhead in #157
- Experiment anon field by @tab-cmd in #156
- Copy Phrase Fusion Error by @lawhead in #159
- #175674845 ; module for raw data format by @lawhead in #160
- #179057693 ; Analysis Channels by @lawhead in #161
- AUC output fix + report timing by @tab-cmd in #163
- Refactor task by @tab-cmd in #162
- add linux requirements shell script and CI spec by @tab-cmd in #167
- Language model base class by @tab-cmd in #164
- PyQt file dialog by @lawhead in #168
- CI Failing Test by @lawhead in #170
- Multi-modal acquisition by @lawhead in #171
- Keypress clock fix by @lawhead in #172
- Adds methods to convert.py to support data compression/decompression by @theJokerEvoker in #173
- InsufficientDataException fix by @lawhead in #174
- Max inq per trial by @lawhead in #176
- Copy Phrase task max selections by @lawhead in #175
- Add preview only mode by @tab-cmd in #177
- Backspace always shown by @tab-cmd in #178
- Matrix display by @tab-cmd in #182
- Refactor generate_offline_analysis to visualize_erp by @tab-cmd in #183
- Session data refinements by @lawhead in #184
- Session Metrics by @lawhead in #186
- Trigger handling by @theJokerEvoker in #185
- Pyedflib fix by @tab-cmd in #190
- TriggerHandler Implementation by @tab-cmd in #189
- Switch response metric by @lawhead in #187
- Uniform Language Model by @lawhead in #188
- Updates to integration tests to reflect recent changes by @tab-cmd in #195
- Button press fix by @nik-sm in #194
- Matrix calibration by @jcgangemi1 in #192
- Show target phrase at start of copy spelling and on pause screen by @tab-cmd in #191
- Language model by @sliu126 in #193
- Unicode trigger labels by @tab-cmd in #196
- Integrate GPT2 Language Model by @lawhead in #197
- assign zero probability for symbols not returned by gpt2 by @sliu126 in #199
- #178695472 ; Remove Legacy Language Models by @lawhead in #201
- Fix inquiry reshaper by @nik-sm in #200
- GPT2 tests by @lawhead in #202
- Bug fix for Preview button evidence by @lawhead in #204
- Fixed backspace prob by @lawhead in #203
- Improving GPT2 language model prediction by @sliu126 in #207
- Matrix calibration by @jcgangemi1 in #205
- Prestimulus, Inquiry Based Training, Model Tuning by @tab-cmd in #208
- Ubuntu fix by @tab-cmd in #198
- #181490020 ; Remove old lm params by @lawhead in #210
- #181489190 ; Session fixation labels by @lawhead in #211
- Bump pillow from 8.0.0 to 9.0.1 by @dependabot[bot] in #209
- Prestim acq buffer by @tab-cmd in #212
- Matrix timing validation by @tab-cmd in #213
- #181987601 move session script to demo by @lawhead in #215
- Release by @tab-cmd in #214
- Clear events before getting key presses in inquiry preview by @tab-cmd in #216
- #181038299 ; acquisition module docs by @lawhead in #217
- 2.0.0rc2 by @tab-cmd in #251
- #180155337 ; Params form Save As by @lawhead in #255
- #180317983 ; GUI History by @lawhead in #257
- #179846837 ; user editable parameters by @lawhead in #256
- Add missing inits by @tab-cmd in #258
- MNE unit conversion by @tab-cmd in #259
- Generate ERP figures after bcipy sessions by @tab-cmd in #260
- Matrix calibration refinements by @lawhead in #262
- Matrix Copy Phrase Task by @lawhead in #261
- Added -r flag to pip install from file command in README by @dcgaines in #263
- Fix Windows Builds (pin pygame version) by @tab-cmd in #265
- Device channel specs by @lawhead in #266
- IP calibration by @tab-cmd in #267
- Filter updates and small fixes to offline analysis by @tab-cmd in #269
- Cross Validation Fixes, Integration Test updates and CHAGELOG updates by @tab-cmd in #271
- Fix Mac OS Builds by @tab-cmd in #273
- Merging MacOS fixes into LM branch by @dcgaines in #274
- Task bar by @lawhead in #270
- Language Model Redesign by @dcgaines in #268
- Merging task bar changes into lm branch to resolve merge conflicts by @dcgaines in #275
- Addressing Language Model PR by @tab-cmd in #276
- Upgrade psychopy and add support for python3.9 by @tab-cmd in #272
- Multimodal config by @lawhead in https://github.com/CAM...
2.0.1rc4
2.0.0rc4
What's Changed
2.0.0-rc.4
Our final release candidate before the official 2.0 release!
Contributions
- Multimodal Acquisition and Querying
- Session Orchestrator #339
- BciPy Client Additions #346
- Other commands added for offline analysis, visualization and simulation.
- Artifact Module #336
- Simulator #350
- Task
- Model
- Offline analysis to support multimodal fusion. Initial release of GazeModel, GazeReshaper, and Gaze Visualization #294
- Updates to ensure seamless offline analysis for both EEG and Gaze data #305
- Offline analysis support for EEG and (multiple) gaze models. Updates to support Eye Tracker Evidence class #360
- Language Model
- Stimuli
- Dynamic Selection Window
- Updated trial_length to trial_window to allow for greater control of window used after stimulus presentations #291
- Report
- Offset Support
- Add support for determining offsets between timing verification Tasks (Ex. RSVPTimingVerificationCalibration) and RawData with a photodiode trigger column. This is useful for setting up new systems and preventing errors before an experiment begins. #327
- Parameters
- Housekeeping
- Add mypy typing to the codebase #301
- Change default log level to INFO to prevent too many messages in the experiment logs #288
- Upgrade requirements for m1/2 chips #299/#300
- Fix GitHub actions build issues with macOS #324
- Tests Improvements
- Fix parameter save as #323
- Pause error #321
- Fix data buffer issue #308
- GUI Refactor #337
- Create new
BCIUIclass for simpler more straightforward UI creation. - Create dedicated external stylesheet for global styling
- Rewrite Experiment Registry to use new GUI code
- Create intertask action UI
- Create new
- Task Return Object #334
- Create
TaskDatadataclass to be returned from tasks - updates task
executemethods to return an instance ofTaskData - Allows for optional storage of a save path and task dictionary in
TaskData
- Create
- Experiment Refactor #333 #329
- Refactors the Experiment Field Collection GUI to be an action
- Allows task protocol to be defined in the orchestrator
2.0.1rc3
2.0.0rc3
2.0.0-rc.3
Contributions
- GUIs
- Acquisition
- Set channel spec information in devices.json. Removed aliases. #266 Updated default analysis channels for Wearable Sensing devices #279
- Refactor to allow multiple devices to be configured for multimodal acquisition. #277
- Refinements to LSL server to use the device ChannelSpec information for generating metadata. #282
- Matrix
- RSVP
- RSVP Calibration pulls out inquiry preview parameters and calls the display with them if enabled
- RSVP Display
do_inquiryaccepts a preview_calibration argument that will present the full inquiry to come if True after the prompt and before the fixation - RSVP Calibration now support Inquiry Preview #267
- Signal Processing
- MNE
- convert to mne can now handle conversion to Volts from microvolts, and no channel map #259
- Dependencies
- BciPy client
- Add
-nv(no visualizations) and-f(fake data) client options #272
- Add
- Session
- Language Model
- Signal Model
- added
RdaKdeModeland restructured to pull out common elements from the PcaRdaKdeModel #279
- added
- Bug Fixes
- Documentation
- Misc Features!
2.0.1rc2
2.0.0-rc.2
2.0.0-rc.2
Contributions
- New Display Paradigm: VEP Display #237
- New BciPy Session Features:
- Device configuration moved to bcipy/parameters #242
- New MNE based plotting for EEG data #220
- New file export features for BciPy data, including .bdf format and prefiltering #246
- New Supported Devices: Tobii-Nano #234
- Bug fixes #218, #225, #228, #235, #240, #246
- Documentation for Matrix Speller and AUC calculation #253
Added
display/paradigm/vep: added create_vep_codes for generating random flicker patterns, VEPBox to encapsulate each flickering box stimuli, and a working VEPDisplay for later task development. #237helpers/visualization.py: added methods for visualized MNE Epochs and better visualizing EEG data in BciPy. #220visualize_joint_averageandvisualize_evokeds.helpers/stimuli.py: added a method for converting MNE RawArray to Epochs. #220 Added stimuli flash time jitter to calibration and inq_generation methods #233 Added ssvep_to_code method #232helpers/convert.py: added a convert to mne method that returns an MNE RawArray. Assumes standard_1020 eeg montage by default.#220 Refactored the convert to edf method. Add convert to bdf method for better export resolution. Ensured the static offset output in the parameters file is accounted for. Add a pre-filter option. Fix annotations. #246- Better handling of the
fake_dataparameter to avoid erroneous recordings. Added a confirmation dialog when thefake_dataparameter is set toTrueto alert users that they are in a system test mode. #219 task/data.py: session data contains more contextual data for interpreting the results, including thesymbol_setand thedecision_thresholdused.parameters/parameters.json: Addedsummarize_sessionparameter is used to output richer session summaries after a Copy Phrase task. Added thesignal_model_pathparameter. When set this can be used for loading the pre-trained signal model during typing sessions.config.py: Added a config file for static paths and other constants #241 enabling bcipy to be called as a package outside of root #242
Updated
helpers/visualization.py:visualize_erpupdated to use MNE for average ERP plots + topomaps. #220 fix to demo #240helpers/raw_data.py: updated channel methods to accept transformation argument and return sampling rate. Add by_channel map method to call by_channel and remove channels by map ([0, 1, 1]). #220gui.main.py-->gui/main.py: refactor to follow rest of codebase convention. #218bcipy/gui/BCInterface.py: to include timeouts on buttons creating subprocess- this prevents multiple unintended windows or functionality from occurring after double clicks. #218 added alert to let experimenter know when a session has completed. Allow for custom paramter setting in GUI for offline_analysis (defaults to same as current,bcipy/parameters.json) #235
Removed
2.0.0-rc.1
2.0.0-rc.1
Contributions
This version contains major refactoring efforts and features. We anticipate a few additional refactor efforts in the near term based on feature requests from the community and CAMBI. These will support multi-modality, data sharing, and more complex language modeling. We are utilizing a release candidate to make features and bugfixes available sooner despite the full second version being in-progress. Thank you for your understanding and continued support! All pull requests in Github from #123 until #217 represent the 2.0.0-rc.1 work.
The highlights:
Acquisition Enhancements: multi-modal support and better performance overall! #171, #174Language Model Refactor: deprecation of docker base models. Addition ofLanguageModelbase class,UniformLanguageModeland a hugggingface modelGPT2LanguageModel. #207Signal Model Refactor: Refactor with base class definitions and general cleanup. PcaRdaKde model updates to decrease training time and limit the magnitude of likelihood responses. #132, #140, #141, #147, #208Matrix Display: SCP: A single character flash Matrix speller is now integrated. AMatrixDisplayand accompanyingMatrixCalibration+Matrix Time Test Calibration. #192, #205, #213Inquiry Preview: a mode in RSVP spelling that allows a user to see an inquiry before it is presented in a serial fashion. The user may also engage with the preview using a key press; either to confirm or skip an inquiry. See below for more details.GUI updates: all BciPy core GUIs and methods are converted to PyQt5 for better cross-platform availability and tooling. See below for more details.Linux compatibility: with the upgrading of dependencies and a helpful shell script (seescripts/shell/linux_requirements.sh) for setting up new machines, we are linux compatible. See below for more details.Prestimulus buffer and Inquiry Based Training- support to add prestimulus data to reshaping and data queries to permit better filter application. Additionally, use this buffer and the inquiry reshaper to mimic data experienced in real time during training in offline_analysis.py #208
The details (incomplete, our apologies!):
Added
Makefile:run-with-defaultsmake command for runningbcipyandviewercommand for running the data viewer #149.bcipy/README.md: describes experiments and fields in greater detail #156signal/process/filter.py: addNotchandBandpassas classes #147signal/process/transform.py: addComposition,Downsample, andget_default_transform#147helpers/visualization.py: moved plot_edf function from demo to this module #126helpers/raw_data.py: module for raw data format support in BciPy #160helpers/load.py: addload_usersmethod for extracting user names from data save location #125 add extract_mode method for determining the mode #126helpers/task/: addReshaper, refactor trial reshaper and add inquiry reshaper #147 addget_key_pressmethod with custom stamp argument. #129helpers/stimuli.StimuliOrder: defined ordering of inquiry stimuli. The current approach is to randomize. This adds an alphabetical option. #153helpers/stimuli.alphabetize: method for taking a list of strings and returning them in alphabetical order with characters last in the list. #153helpers/validate:_validate_experiment_fieldsandvalidate_experiments: validates experiments and fields in the correct format #156bcipy/helpers/system_utils: add report execution decorator #163scripts/shell/linux_requirements.sh: add script for installing necessary dependencies on linux systems #167.github/workflows/main.yml: adds support for CI in BciPy #166bcipy/gui/file_dialog.py: PyQt5 window for prompting for file locations #168display/paradigm/matrix: added MatrixDisplay class with single-character presentation (SCP). #180
Updated
-
LICENSE.md: to used the Hippocratic license 2.1 -
CODE_OF_CONDUCT.md: to latest version of the Contributor Covenant -
README.md: Add new glossary terms: mode, session and task #126 #127 and cleanup #129 -
bcipy/main.py: formally,bci_main.py. To give a better console entry point and infrastructure for integration testing. In the terminal, you can now runbcipyinstead ofpython bci_main.py -
parameters.json: add stim_order #153 add max selections #175 remove max_inq_per_trial in favor of max_inq_per_series #176 add inquiry preview #177 with relevant stimuli units in help text, better starting stim_height, and inquiry preview keys #216 -
demo_stimuli_generation.py: update imports and add a case showing the new ordering functionality. #153 -
copy_phrase_wrapper: update logging and exception handling. add stim order. #153 BUGFIX: return transformed sampling rate #159 -
random_rsvp_calibration_inq_gen: rename tocalibration_inquiry_generator#153 -
ExperimentField.py: updated to use new alert types with timeouts #156 -
ExperimentRegistry.py: add the ability to toggle anonymization of field data and use new alert types with timeouts #156 -
FieldRegistry.py: updated to use new alert types with timeout #156 -
gui/BCInterface.py: useload_usersmethod to populate user dropdown and remove internal BCInterface load method #125 -
gui/gui_main.py: update to return a value in FormInput, set a value for IntegerInput only if provided #156 -
gui/viewer/data_viewer.py: Replaced the original WxPython version of the signal data viewer with the new PyQt version #157. Use signal process filters instead of duplicating logic #147. -
gui/viewer/file_viewer.py: to use new raw data format #160 -
bcipy/acquisition: refactored acquisition to support multi-modal acquisition and more performant real-time acquisition. These changes were significant and across multiple PRs. Support for new raw data format #160 -
ring_buffer_test.py->test_ring_buffer.py: to comply with naming conventions #156 -
signal/model/base_model.py: add reshaper to base model class, requiring it to be defined in all models and return aReshaper. Fix return types. #147 -
signal/model/offline_analysis.py: updated to use new reshapers and transforms. #147 updated to report execution time and logging levels #163 -
bcipy/language_model/-->bcipy/language/refactor for clarity and add base classLanguageModel#164 -
bcipy/tasks-->bcipy/task: refactor for clarity, add README, organize tasks under paradigm #162 organize tasks operation objects intocontrolmodule #162 #178 -
task/paradigm/rsvp/copy_phrase.py: refactored overall #146 to use new Session classes #127 and updated to use new reshapers and transforms #147 implements current state of inquiry preview #129 #177 to account for max selection parameter #175 fix targetness #179 -
bcipy/task/data.py: to track number of decisions made #175 -
task/control/handler.py: added the ability to set constants in defined stimuli agent #178 -
task/control/query.py: remove redundant best_selection in favor of one with constants. Implemented constants in return_stimuli methods. #178 -
display/rsvp/display.py: refactored to use new trigger pulse and ensure it occurs only on first display call (whether that bedo_inquiryorpreview_inquiry) #149 Overall refactoring of properties intoStimuliProperties,InformationProperties,TaskDisplayProperties. AddedPreviewInquiryPropertiesandpreview_inquirykwarg. Add full-screen parameter to help with scaling stimuli. Add textbox to self._create_stimulus. Addpreview_inquiryand_generate_inquiry_previewmethods. #129 -
static/images/gui_images: updated toguiand refactored where defined #149 -
bcipy/display/main.py: moveStimuliProperties,InformationProperties,TaskDisplayPropertiesandPreviewInquiryPropertiesto higher level #180 -
helpers/stimuli.py: refactored for clarity and addget_fixationmethod #149 glossary updates and remove unneeded code #178 fix targetness in copy phrase #179 -
helpers/triggers.py: refactored_calibration_trigger for clarityand addCalibrationType(deprecating sound and adding text) #149 add an offset correction method #126 -
helpers/load.py: updated to use new raw data format #160 -
helpers/convert.py: mode, write_targetness, and annotation_channels keyword arguments #126 add compression/decompression support for experiments and BciPy session data #173 -
helpers/session.py: refactored session helpers to use the new Session data structures. #127 -
helpers/exceptions: refactored Field and Experiment exceptions to corresponding base exception #156 -
feedback/auditory_feedback: to allow for easier setting of relevant parameters and testing #128 -
feedback/visual_feedback: deprecate shape feedback type, line_color (in the administer method), and compare assertion as both were unused and added unneeded complexity. Set hard-coded values on the class instance for easier changing later. #128
Removed
target_rsvp_inquiry_generator: #153 unusedrsvp_copy_phrase_inq_generator: #153 unusedtasks/rsvp/icon_to_icon.py: #129 unusedtasks/rsvp/calibration/inter_inquiry_feedback_calibration.py: unusedgenerate_icon_match_images: #153 deprecated tasksignal/process/demo/text_filter_demo.py: #147 removes old matlab generated filtersignal/process/filter/resources/filters.txt: #147 in favor of new filters and transformssignal/process/filter/notch.py: #147 in favor of new filters and transformssignal/process/filter/downsample.py: #147 in favor of new filters and transformssignal/process/filter/bandpass.py: #147 in favor of new filters and transforms
Version 1.5.0
1.5.0
Contributions
This version contains major refactoring and tooling improvements across the codebase. In addition, it indtrocudes the concept of BciPy Experiments and Fields. Below we describe the major changes along with a PR# in github where applicable.
Added
- Language model histogram #91
- BciPy official glossary (Sequence -> Inquiry & Epoch -> Series) #121
- System information to
system_utils(cpu, platform, etc) #98 - BciPy Experiments and Fields: See PRs #113 #111 and #114 for more information on the additions!
.bcipysystem directory to support experiment and fields #100- support for python 3.7
rsvp/query_mechanisms: to model the way we build inquiries #108Makefile: contains useful install and development commandsconvert: a module for data conversions that will be useful for data sharing. Implemented a conversion function to the EDF format. #104exceptions: a module for BciPy core exceptions
Updated
acquisition: refactored the acquisition module to separate the concept of a device (ex. DSI-24 headset) and a connection method to that device (TCP or LSL). #122setup.py: with new repo location and CAMBI official support emailoffline_analysis: to pull parameters from session file #90requirements.txt: to the latest available #99 #107Parameters(added help text, removed redundant parameters). Refactored to make them immutable. #101gui_main: to use PyQt5. We will refactor all GUI code to use this in the future. After this PR, the signal viewer (WxPython) and a couple of loading functions will remain (Tk). #102BCInterface: updated to use new gui_main methods. Added user if validations. #102 #120params_form: moved into a parameters modules within GUI and updated to use PyQt5. #109dev_requirements: used to be called test_requirements. It contains more than that, so we updated the name! #99README: with relevant updates and contributors
Removed
RSVPKeyboard.py