All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
-
Calibration and fine-tuning now use one PSM per peptidoform, the first observation in the reference. A reference built from a search result repeats a peptidoform once per spectrum it was identified in, each time with a different observed retention time, so the fit was given conflicting targets and weighed peptidoforms by how often they happened to be identified. On a reported MS2Rescore case (201,593 PSMs, one run) the reference selected by auto-calibration held 6,331 PSMs but only 2,623 peptidoforms; the repeats of one peptidoform disagreed on the observed retention time by 236 s, two thirds of the 354 s range covered by the identifications. Fitting on the first observations improved the calibration on those 2,623 peptidoforms from 9.69 to 4.51 s mean absolute error (median 5.98 to 2.09 s; within 5 s 44.9 % to 81.4 %). Retention times are in whatever unit the input uses; DeepLC does not convert them.
Charge states of one peptidoform count as repeats, since retention time does not depend on precursor charge. When repeats disagree by a large fraction of the observed range, DeepLC now says so: that means the reference mixes runs or contains low-confidence PSMs, which deduplication hides rather than fixes.
There is no option for it: the public functions keep the signature they had. A caller who really wants every reference PSM to count fits a
Calibrationon its own targets and passes it topredict_and_calibrate, which uses an already fitted calibration as given;trainremains available for full control over a training set.
deeplc._reference_selection.deduplicate_psms, which returns the first PSM of every peptidoform in aPSMList.
- The default model is now the fused-trunk multitask model trained across 6,543 LC
setups (
multitask_flexcnn_model.pt, bundled since 4.1.0 as an opt-in). Every core function and the command line use it when nomodelis given. The 4.0 default,multitask_model.pt, stays bundled asdeeplc.core.LEGACY_MULTITASK_MODEL; pass it asmodel=to reproduce 4.0 and 4.1.0 predictions exactly. - Uncalibrated
predict()on a multitask model that carries setup names reports the setup named bydeeplc.core.DEFAULT_TASK_NAME(PXD005573_mcp, the 200-minute gradient the DeepLC 1.x to 3.x models were trained on) instead of head 0, which for the new default was an arbitrary setup.return_matrix=Trueis unchanged, and so are calibration and fine-tuning, which select or fit the setup from the reference.
legacy_positional_deltas, onencode_peptidoformandDeepLCDataset, reproducing the placement of modification deltas in the positional block exactly as versions before 4.0.1 did. Verified bit-identical to a v4.0.0 checkout across 4,760 feature arrays from 1,190 peptidoforms covering lengths 2 to 70, every modified position, and terminal modifications. Unmodified peptidoforms are unaffected either way.- The feature layout a model expects is now resolved from the specification it carries,
in one place. A checkpoint that records no specification was written before 4.1.0, so
it also predates the 4.0.1 correction and is fed the encoding it was trained on. One
that records a specification is read literally, and every checkpoint this version
writes records the encoding it used.
DeepLCDatasettherefore defaults to the pre-4.0.1 placement, since a dataset exists to feed a model;encode_peptidoform, whose job is correct featurisation, still defaults to the corrected placement. Newly trained models get the corrected placement.
-
Predictions from models trained before the 4.0.1 feature correction no longer change. 4.0.1 corrected where modification deltas land in the positional block, which altered the encoding of every modified peptidoform, while every model released up to that point had been trained on the old encoding. Modified peptides were therefore predicted from input those models had never seen. All five bundled checkpoints are bare state dicts and are now recognised as predating the correction, so their predictions match v4.0.0 exactly again, with no retraining and no change to any calling code.
This also covers models held by downstream packages. IM2Deep 2.0.2, unmodified, reproduces its v4.0.0 CCS predictions exactly on this release; under 4.0.1 its modified peptides had shifted by up to 7.6 A^2. Note that this means predictions for such models differ from 4.0.1, which is the point: 4.0.1's change to them was not intended.
-
Fine-tuning onto a new LC setup for models with a low-rank multitask head, fitting the setup's own
rank + 2parameters with the encoder and pretrained setups frozen: 66 values at rank 64, against roughly 1.7 million for an adapter over a 6,543-wide head vector.finetune()previously refused this architecture. -
MIN_FINETUNE_REFERENCE, with a warning when fine-tuning is attempted on fewer reference PSMs. Measured on six unseen LC setups, fine-tuning was worse than calibration below roughly 500 reference peptidoforms and better above 700; the validation split is widened automatically below the threshold so early stopping has signal to work with. -
The new setup's
scaleandshiftare solved by least squares on the reference data before training, rather than learned. Left to the optimiser on a small reference set they collapse: on a 133-minute gradient with 230 reference peptides the output range shrank to 17 minutes and the error reached 91 minutes, with the correlation still above 0.9 because the ordering was never what broke. Anchoring them brought that setup to 2.2 minutes. -
Fused-trunk multitask architecture (
FlexCNNMultitaskModel), which merges atomic composition with a learned residue embedding in a single convolutional trunk and pools over the valid length instead of flattening four separate branches. Available asdeeplc.core.FLEXCNN_MULTITASK_MODEL; the bundled model was trained across 6,543 LC setups and reaches 0.82 min test MAE and 0.24 min median against 1.26 min and 0.51 min for the four-branch backbone on the same data and the same head. -
FactorHead, a low-rank multitask head where a setup owns onlyrank + 2parameters, so adding an LC setup means fitting 66 values with the encoder frozen rather than training a head. -
Self-describing checkpoints. A model file may now record its architecture, constructor arguments, feature specification and target units, so loading no longer infers the architecture from tensor shapes. Bare state dicts continue to load unchanged.
-
add_terminal_compositiononDeepLCDatasetandDeepLCDataset.from_psm_list, passed through toencode_peptidoform.
- Fine-tuning could return a model far worse than the one it started from. Three
defects compounded:
train()began with an infinite best validation loss, so the first epoch always became the best however bad it was; the output layer's scale was learned rather than solved, though it is linear in its input; and the adapter's ReLU stack is largely dead at its default initialisation, which left the activations rank deficient and made a CUDA least-squares solve return non-finite values and silently decline. On a 133-minute gradient with 230 reference peptides the adapter path returned predictions spanning 1.3 to 27.2 minutes at an error of 92 minutes, with the correlation still above 0.9 because only the scale was lost. Training now scores its starting point, both adaptation paths solve their output layer on the reference data first, and that solve is rank tolerant. The same setup now gives 1.63 minutes for the adapter path and 2.05 for the low-rank head, against 1.47 and 1.28 for calibration. - A fine-tuned model whose validation error exceeds a large fraction of the reference retention-time span is now reported at error level, since a collapsed fit leaves the loss curve and the correlation looking unremarkable.
predict()loads the model before encoding features, so a model that records a feature specification gets the features it was trained on. Previously the dataset was always built with defaults.
- Default epochs for finetuning to 50
- Bundled multitask pretrained model as the new default, trained across multiple LC setups. Automatic head selection in
calibrate()based on Pearson correlation ensures the best fitting setup is used for predictions. Fine-tuning uses adapter-based transfer learning: a small MLP is attached on top of the multi-setup prediction heads. - NiceGUI-based web interface, launchable as a browser app (
deeplc gui) or native desktop window (deeplc gui --native) [gui]optional dependency group (nicegui, plotly, pywebview) for desktop use[web]optional dependency group (nicegui, plotly) for server/Docker use- Docker image for containerized web server deployment
- Updated Windows installer (PyInstaller and Inno Setup) to new GUI
predict_and_calibrate()core function combining prediction and calibration in one call, with optional automatic reference PSM selectionfinetune_and_predict()core function for transfer learning followed by calibrated prediction- Automatic calibration reference selection from input PSMs using q-value filtering or top-scoring fraction
Calibration.selected_model_headfield to record which model output head a calibration was fitted to- Publish workflow with Windows installer build, Docker image build, and dry-run mode for CI testing without publishing
- CLI restructured into
predictandguisubcommands - Example datasets updated from legacy CSV format to psm_utils TSV and peprec formats
- Simplified the public package API by splitting up the single class-based API into core functions (
predict,finetune,train, etc.) - Switched deep learning framework from Tensorflow to PyTorch
- Speed up predictions by removing ensemble method where output from three models with differing kernel sizes was averaged to one prediction
- Separated calibration logic to dedicated reusable module with sklearn-like API.
- Improved computational efficiency of piece-wise linear calibration and set sensible default parameters
- Built-in transfer learning functionality, instead of using external
deeplcretrainerpackage. - Cleaned up package, removing legacy and unused code and files, and improving modularity
- Modernized CI workflows to use
uv - Added sphinx-based documentation for readthedocs
- Removed library-feature for storing past predictions
- Removed legacy CALLC functionality
- Bump version
- Bump version
- Bump version
- Fix no calibration peptides when looking for best model
- When no calibration peptides are present, just fit a model that returns the original predicted value
- Allow for much smaller peptides in feature calculation
- Log warnings in obtaining atoms only once
- Remove unimod, replace with psm_utils
- Bump minimal requirements python version
- Bump minimal requirements python version
- Bioconda fix import
- Remove dependencies
- Revert to linear calibration after transfer learning only
- Use scikit-learn instead of pygam for calibration
- Fix custom activation by using default implementation
- Loosen requirements
- Remove batch number parameter from GUI
- Debugging release issues
- Debugging release issues
- Debugging release issues
- Remove old python build
- Debugging release issues
- Windows release fix
- New TensorFlow versions that break support with earlier models
- Relax tensorflow version for mac
- Pin scipy version
- Set max threads
- Remove limit threads feature calc
- Fix issue transfer learning single model mode
- Make single model mode available and the default
- Bump version
- Bump version
- Bump version with new workflows
- Bump version with .toml
- Removed dependencies (most importantly sklearn; which is optional now)
- Support for custom labels in plot
- Fix memory usage, limit threads
- Fixed multiprocessing
- Pass flag CCS feature extract
- Reintroduce ability to predict CCS
- Fix pypi token GA
- Fix non-initialized modifications
- Allow for setting number of epochs
- Fix selenium atom logging error
- Fix selenium atom on AA
- Fix wrong error except
- Fix peptides that are too long and their modifcations
- bump version
- reduce logging (change to debug)
- Fix missing debug time in feature extractor
- Fix potential issues in feat extractor (uncommon AA)
- Set plotly param to false
- Remove assumption psm_utils_obj
- Add plotly diagnostic plots
- Fix logger issue
- Activate garbage collection to clear GPU memory
- Reintroduce support for batched calculation
- Introduce batch_num_tf parameter for DeepLC that determines TF batch size
- Allow for linear piecewise calibration again
- More strict version of TF, as 2.13.0 crashes for transfer learning
- Fixed a bug where a reinit led to issues with setting parallelism
- Fixed a bug where it checked the calibration file while this was not initialized
- Fixed a bug where missing atoms in encoding cause a crash
- Fixed a bug where isotopes are incorrectly parsed
- Fixed a bug where numpy no longer accepts dict_values, explicit list conversion
- Fixed a bug where atom counts were wrong, fixed by retraining models with new features
- Fixed a bug where detection of legacy csv is wrong
- remove pygam from GUI, set to true as default
- fix setting cmd line calibration default
- fix setting GUI calibration default
- fix library feature
- slight refractoring
- slight refractoring
- add Arthur Declercq as contributor
- dependency fix
- Calibration bug fix
- Support for GUI and PSM utils
- Support for GUI and transfer learning
- Log peptide sequences that are too long
- bump version
- second try
- bump version
- bug fix for sequences > 60 AA
- bug fix non-resolved modifications
- psm_utils integration
- pygam default calibrator
- additional support transfer learning
- code refractoring of feature extraction
- prediction library support
- piecewise linear calibration support
- Bump version
- Support for DeepLCRetrainer
- Optimized library usage (~85% reduce in DeepLC prediction time) @markmipt
- Made Gooey an optional dependency (facilitates install on Linux). Install the optional
dependencies for the graphical user interface with
pip install deeplc[gui]
- New native Python GUI, based on the Gooey package
- New standalone installer for Windows using PyInstaller and Inno Setup
- Added
deeplc-guientrypoint to start GUI from the command line
- CLI: Restructured help message
- Made DeepLC class API docstring consistent with CLI help message
- Docs: Moved
dict_dividerandsplit_calexplanation to README Q&A section. - CI: Only run tests on commits to
mainor from a PR - Refactoring: Cleaned up
__main__.py - Logging: Changed some loggings from DEBUG to INFO level, some from WARNING to INFO or DEBUG level
- Removed Java-based GUI in favor of new Python-based GUI
- If run through CLI/GUI, all Tensorflow warnings are now fully suppressed
- Added
--legacy_calibrationCLI option to allow for old piecewise linear calibration while new pyGAM calibration method is default.--legacy_calibrationis mutually exclusive with--pygam_calibration.
- Make version compatible with pip release
- Make version compatible with pip release
- Make pygam the default calibration method
- Bug fix where split_cal was not correctly passed
- CMD support for pygam calibration
- Scikit-learn and pygam dependency in setup
- Bug fix duplicate peptide+mod for DeepCALLC
- New feature DeepCALLC
- Version bump
- Deep(CAL)LC functionality
- Pygam as calibration function
- Update to Streamlit webserver: Use
st.formand new official download button
- More elegant solution for library call as global
- Fix var call dict object
- Fix library delete call
- Temporary fix suggested by markmipt for the library
- Change logging to specified logger object instead of standard logger
- GUI: Fix small font through starting jar with cmd to increase font size
- Added testing for Python 3.9
- Relax h5py requirement to allow v3
- Fixed GitHub Action workflow for Streamlit docker image build
- Bug in writing library where a list was assumed so library only partially filled
- Make it optional to reload library
- Ignore library messages
- Force older library h5py for compatability
- Library gets appended for non-calibration peptides too
- Change the default windows install to pip instead of conda
- Change reporting of identifiers used from library
- Log the amount of identifiers in library used
- Publish PyPI and GitHub release
- Add library functionality that allows for storing and retrieving predictions (without running the model)
- Describe hyperparameters and limit CPU threads
- Additional modfications, including those exclusive to pFind
- Change calibration error to warning (since it is a warning if it is out of range...)
- Limit CPU usage by tensorflow by connecting to n_jobs
- Support for Python 3.8
- Bug fix in the calibration function
- Had to order the predicted instead of observed retention times of the calibration analytes
- Thanks to @courcelm for both finding and fixing the issue
- Different calibration function, should not contain gaps anymore
- Changed to more accurate rounding
- Changed to splitting in groups of retention time instead of groups of peptides
- Changed default model to a different data set
- Duplicate peptides charge fix
- Support for charges and spaces in peprec
- Fixes in GUI
- Include less models in package to meet PyPI 60MB size limitation
- Bugfix: Pass custom activation function
- Fixed support for averaging predictions of groups of models (ensemble) when no models were passed
- New models for ensemble
- Support for averaging predictions of groups of models (ensemble)
- Fix the latest release
- Spaces in paths to files and installation allowed
- References to other CompOmics tools removed in GUI
- Fixes in GUI
- Fix the latest release
- Fixed the .bat installer (now uses bioconda)
- Example files in GUI folder
- Unnecesary bat and sh for running GUI removed
- Switch to setuptools
- Reorder publish workflow; build wheels
- Remove xgboost dependancy
- Use dot instead of dash in versioning for bioconda
- Fix publish action branch specification (2)
- Fix publish action branch specification
- Test other trigger for publish action
- Update documentation, specify branch in publish action
- Add long description to setup.py
- Initial pre-release