OpenMS
Loading...
Searching...
No Matches
ChangeLog
Glossary:
OpenMS - Name of the project and our C++ library
TOPP - "The OpenMS PiPeline", a collection of chainable tools for flexible HPLC/MS workflows. Formerly known as "The OpenMS Proteomics Pipeline"
TOPPAS - "The OpenMS PiPeline Assistant", a graphical tool to interactively build and run HPLC/MS workflows
TOPPView - Versatile viewer for HPLC/MS data
INI file - parameter configuration file, holding custom parameter settings for TOPP tools
INIFileEditor - graphical parameter editor for INI files
Parameters - list of algorithm or TOPP tool parameters that changed in this release
PR - Pull Request (on GitHub), i.e. integration of a new feature or bugfix
#<number>, e.g. #4957 - a reference to an issue or pull request on GitHub, visit e.g. https://github.com/OpenMS/OpenMS/pull/XXXX (replace XXXX with number of interest) for details



------------------------------------------------------------------------------------------
----                                OpenMS 3.7.0     (under development)              ----
------------------------------------------------------------------------------------------

OpenMS Library:
  - ProSEAlgorithm rescores the PSMs of every search run with Percolator by default: the new parameter 'rescore'
    (default true) runs ProSEAlgorithm::rescoreWithPercolator in each search path (search(), searchWithModificationAnalysis(),
    single and multi-file) in place of the PSM-level FDR, which ProSEAlgorithm::applyDeferredPsmFDR then applies on Percolator's
    q-values (or, for a run that was not rescored, on q-values of the search engine scores); the file-based search() applies
    FDR:protein on the rescored PSMs. rescoreWithPercolator keeps the Percolator settings of ProSE's former -rescore (best hit per spectrum,
    the runs marked as post-processed by Percolator) and returns whether it rescored and, if not, why (fewer than 100 PSMs, no
    decoy PSMs, Percolator failed); SearchResult::percolator reports that outcome per run, also in pyOpenMS, and its 'warning'
    names a rescoring whose learned model Percolator's sanity check replaced by the best single feature. Runs that were
    rescored and runs that were not are not pooled into the multi-file aggregate (different search engines). 'rescore' false
    restores the previous results. The ProSE tool and other callers (e.g. the WebAssembly bindings) share this implementation.
  - Percolator::usedDefaultDirection() tells whether the last rescore()/train() kept the learned model or Percolator's sanity
    check replaced it by the default direction ("Resetting score vector" of the percolator binary): no target at q < test_fdr
    on the held-out folds, fewer targets than the best single feature, or a configured initial direction of the wrong sign
    (ProSE configures none). Typical for blank runs and small inputs (q-values count the decoys + 1, so a fold needs about
    1 / test_fdr targets above its first decoy).
  - ProSEAlgorithm::mergeFileResults(): the merged evaluation of the ProSE tool's -out_merged moves into the library, so that
    other callers (e.g. a browser app on the WebAssembly module) can share it. It pools the PSMs of the result of a multi-file
    searchWithModificationAnalysis(), infers proteins across the files and, with FDR:protein and decoys in the database,
    applies the picked-protein FDR and removes the decoys (remove_decoys false keeps the decoys that pass, e.g. to show them);
    the result is the new ProSEAlgorithm::MergedResult. Throws Exception::InvalidValue if Percolator rescored only some of the
    files (the tool still exits with INCOMPATIBLE_INPUT_DATA). The tool's -out_merged does not change, but for the
    'id_merge_index' fix below (runs in which a file failed). Other output of the tool changes with the entries below: with
    peptdeep:enable its per-file idXML runs carry the meta value 'peptdeep_nce', and the command-line progress of a multi-file
    search nests under "Searching <file> (i of n)...".
  - FIX: ProSEAlgorithm: the meta value 'id_merge_index' of the pooled PSMs of a multi-file search (and of -out_merged) is the
    position of their file in the input list (for inputs with distinct paths). After a file whose search failed, the PSMs of the
    later files named the wrong file.
  - FIX: OpenSearchModificationAnalysis names a delta mass cluster after the Unimod modification nearest to its mass. It
    named the entries of lowest and highest mass within the tolerance ("A//B"), so that +15.9949 Da (oxidation) was
    "thiocarboxylic acid//Oxidation or Hydroxylation" (thiocarboxylic acid, +15.9772 Da, is within 0.02 Da), and it annotated the
    PSMs (meta value 'PTM') and mapped the entries of the delta mass statistics (DeltaMassEntry::mapped_modification) with
    the lowest one alone, "thiocarboxylic acid". "A//B" now names candidates that are about equally close (distances differing
    by at most 0.0005 Da, the width of a histogram bin). The nearest entry is also used for the modification that explains a
    cluster of a higher mass (including the "+1Da" variant) and for the combination of two modifications, which is looked up
    on both sides of the cluster mass (before, only at or above it, so that a cluster could be "Unknown" with a combination
    within the tolerance below it). This changes the modification names in the output tables of ProSE's open search
    (-out_mod_analysis_dir) and of SageAdapter.
  - ProSEAlgorithm multi-file search: progress step "Searching <file> (i of n)..." per input file, with the steps of the search of the
    file nested below it, so that a progress display can tell which file is searched. Consumers identify the step by its
    label: the nesting depth is reliable only with one thread (ProgressLogger's depth is shared by the threads), and a chunk-major
    search (database:chunk_size) has no per-file step.
  - PeptDeepRescoring::annotate() stores the normalised collision energy the predictions of each run used (the scanned one, or 'nce'
    when set) as the double run meta value 'peptdeep_nce' (PeptDeepRescoring::NCE_META_VALUE) on that run's
    ProteinIdentification, so that a consumer of the result can predict spectra at the same energy. Runs without PSMs get none.
  - ConsensusMapNormalizerAlgorithmRTLocal: normalizes each map of a consensus map by a log2 offset that may vary
    with retention time, estimated as the median deviation of the features quantified in several maps among the
    neighbouring features in retention time (the run normalisation of andes). It removes both different loading
    and a drift of the ion signal along the gradient. On the ProteoBench DDA ion module (QExactive), applied to
    ProteomicsLFQ output, it lowers the median CV from 0.23-0.24 to 0.09-0.10 and the median absolute fold-change
    error from 0.22 to 0.15-0.16; one median per map ('median') reaches a CV of 0.16 at an error of 0.22.
  - PepXMLFile accepts the optional pepXML `no_cut` attribute when reading unknown enzymes,
    including files written by OpenMS (#10321).
  - FIX: PepXMLFile::store writes the expect score of X! Tandem and Mascot hits read from pepXML (it wrote an empty
    value, so the stored file could not be read back), and skips scores without a value. PepXMLFile::load keeps
    'unknown_enzyme' for an empty `cut` (as OpenMS writes it) instead of naming a "user-defined" enzyme that grew
    with every pepXML pass and was not recognized as missing. It also keeps the Mascot expectation value (MS:1001172)
    for search_engine "MASCOT", as TPP and PepXMLFile::store write it (#10570).
  - FIX: ConsensusMapMergerAlgorithm::mergeAllIDRuns throws Exception::MissingInformation for a ConsensusMap without
    protein identification runs instead of reading past the end of the run list, on which ProteomicsLFQ,
    ProteinInference, Epifany and MS1LabeledWorkflow segfaulted (e.g. ProteomicsLFQ on FAIMS data before #10001).
  - FIX: ims::Weights (getWeight, operator[], back, getAlphabetMass, swap) and
    SignalToNoiseEstimatorMedianRapid::NoiseEstimator (get_noise_even/odd/value) throw Exception::IndexOverflow or
    IndexUnderflow for an invalid index or an m/z outside the estimated windows, instead of reading out of bounds in
    release builds. SignalToNoiseEstimatorMedianRapid::estimateNoise throws Exception::InvalidParameter for empty
    arrays or arrays of different length.
  - Added PeptDeepLibraryPredictor, which turns peptide precursors into an OpenSWATH assay library
    (LightTargetedExperiment) with the native PeptDeep ONNX models: predicted retention time,
    optionally CCS (stored as 1/K0), and b/y fragment intensities (four canonical non-loss
    channels). It only predicts; digestion, filtering and decoys stay with the calling
    workflow. Available in builds with WITH_ONNX (#10380).
  - Added OpenSwathLibraryPreparation, which holds the library preparation (normalization to PQP,
    assay generation, decoy generation) shared by OpenSwathAssayGenerator, OpenSwathDecoyGenerator
    and OpenDIA (#10373).
  - Added BedRModFile (FileTypes::BEDRMOD, also in pyOpenMS), which exports RNA modification sites
    as bedRMod v2 (#10529).
  - FIX: FLASH (SpectralDeconvolution, FLASHHelperClasses): averagine isotope trimming subtracted the
    power of isotopes that were not removed, and the isotope cosine assumed a unit-norm averagine
    vector. The cosine now normalizes both vectors and is clamped to [0, 1]; a cosine above 1
    produced negative noise power in PeakGroup::updateSNR_ (#10543).
  - FIX: Fixes found by running the class tests on a WebAssembly build (#10558): the
    MetaboliteSpectralMatching comparator objects (PrecursorMZLess, SpectralMatchScoreGreater) are
    inline variables (duplicate symbols with two translation units); a protein group without a score
    gets the worst calibrated FDR value explicitly (a NaN lookup in a std::map was undefined);
    toStr(long double) no longer prints the binary expansion of the double under libc++;
    IndexedMzMLDecoder and MzMLSpectrumDecoder initialise Xerces before DOM parsing; DataValue stores
    integers as Int64 (they were truncated on 32-bit targets).
  - FIX: MzMLSqliteHandler (sqMass) throws Exception::IllegalArgument when the m/z (or retention time)
    and intensity arrays of a spectrum or chromatogram differ in length. Before, depending on which
    array SQLite returned first, data was silently dropped or the shorter array was read past its
    end (#10471).
  - FIX: Percolator (in-process rescoring of PercolatorAdapter and ProSE's Percolator rescoring): the static flag
    PosteriorEstimator::includeNegativesInResult is atomic. It was written and read by the threads of
    the parallel cross-validation at the same time (data race, found with ThreadSanitizer); results
    do not change (#10474).
  - HiGHS is now the default LP/MIP solver (LP_SOLVER=HIGHS; the former default AUTO is an alias for it). A HiGHS >= 1.11
    from vcpkg or the system is used if found, otherwise HiGHS is fetched and linked statically into libOpenMS. COIN-OR and
    GLPK (LP_SOLVER=COIN/GLPK, vcpkg features lp-coin/lp-glpk) are deprecated and will be removed in the next release (#10551).
    The HiGHS backend of LPWrapper now solves MIPs to proven optimality by default (mip_gap was ignored when 0), resets
    the time limit on every solve, batches integrality changes and skips the probing/enumeration presolve rules, which
    makes large decharging ILPs about 15x faster. An ILP with several optimal solutions (e.g. in Decharger and
    MetaboliteAdductDecharger) may now give a different one of them than COIN-OR did. HiGHS fetched by the build installs
    its license (share/OpenMS/LICENSES/vendored/HiGHS).
  - FIX: ProteaseDB and RNaseDB also find enzyme names and synonyms ignoring case, whitespace, '-' and '_' (e.g. 'glu-c',
    'GluC' and 'Glu_C' find glutamyl endopeptidase, 'LysC/P' finds Lys-C/P); other characters such as '/' and '+' stay
    significant. pepXML files with sample_enzyme or enzymatic_search_constraint 'Glu-C' load with glutamyl endopeptidase
    instead of failing. Adding an enzyme named like a synonym of another enzyme no longer removes that enzyme (#10571).
  - Enzymes.xml and the built-in proteases drop the synonyms 'argc', 'arg_c', 'asp_n', 'glu_c', 'lys_c' and 'lys_n' and two
    synonyms that repeated the enzyme's name. ProteaseDB still finds these spellings; getSynonyms() no longer lists them.
  - PepXMLFile: a known enzyme of 'enzymatic_search_constraint' takes precedence over 'sample_enzyme' (unchanged, now
    documented); the warning when they differ names both enzymes. A user-defined enzyme from an unknown 'sample_enzyme'
    keeps the case of its name.
  - FIX: PepXMLFile::store no longer writes an empty <specificity cut=""> for enzymes without cleavage rules (e.g.
    'unknown_enzyme') or a misleading cut="A" for unspecific cleavage, and writes 'search_engine' only on
    'search_summary' (it is not an attribute of 'msms_run_summary') (#10346).
  - FIX: MzTabFile reads and writes the colunit metadata as specified by mzTab 1.0 ('MTD<tab>colunit-<section><tab><value>').
    The writer emitted an upper-case 'colunit-PSM' without a tab, and the reader expected an index in the key, so
    conforming lines failed with a ConversionError (#10524).
  - FIX: mzTab export of a consensus map (MzTabExporter, MzTab::exportConsensusMapToMzTab, the MzTabFile consensus stream)
    fails with an error naming the maps when several maps have the same MS file and channel (e.g. all 'UNKNOWN', or
    labeled maps of one file without 'channel_id'). They were merged silently into one assay; labeled maps of one file
    that differ only in 'channel_id' are no longer confused. A PSM whose identification run has no primary MS run path
    now gets an error that names the run; it was either reported as "does not map to an MS file registered in the
    quantitative metadata" or credited to another file's score column (#5357).
  - FIX: MzMLSqliteHandler (sqMass with write_full_meta) keeps the original spectrum native IDs: the embedded mzML
    snapshot replaced them by 'spectrum=<index>', so such files could not be read back (#10525).
  - Faster SignalToNoiseEstimatorMedianRapid (1.4-2 fold) (#9782).
  - API: Move NASE-directed precursor query selection into the tool; remove the unreleased SpectralDeconvolution::setQueryMasses API and pyOpenMS binding. Shared FLASH construction, scoring and filtering remain in the library.
  - FIX: DigestionEnzyme built from cleavage residues (name, cut, no_cut, sense; used for unknown pepXML <sample_enzyme>s)
    closes its regex groups, e.g. KR/P/C gives (?<=[KRX])(?!P) like Trypsin; the regexes did not compile (#10569).
  - FIX: EmpiricalFormula orders its elements by atomic number, an element before its isotopes ("C", "(12)C", "(13)C"),
    instead of by the addresses of the Element objects. Weights, isotope distributions and operator< followed the address
    order, which differs between runs where the heap is randomized (Windows): theoretical masses differed in the last
    bits between two identical runs, and Percolator rescoring in ProSE turned that into percolator_score differences of
    about 1%. On Linux the new order is the order the elements had in memory, so results do not change there.
  - FIX: ConsensusMapNormalizerAlgorithmMedian, -Quantile and -Threshold accept maps whose indices are not consecutive, as
    'FileFilter -consensus:map' leaves them. Median and Quantile threw ElementNotFound for them, and Threshold
    (ConsensusMapNormalizer -algorithm_type robust_regression) read past the end of its per-map vectors and crashed. The
    per-map vectors (medians, ratios, intensity vectors) are numbered by the position of a map among the column headers,
    which is the map index for maps numbered 0 ... N-1.
  - FIX: MapAlignmentAlgorithmIdentification::setReference() (MapAlignerIdentification -reference:file) ignored the
    parameters 'min_score' and 'use_adducts' until the first align() call: with 'score_cutoff', a reference with
    lower-is-better scores kept no identifications (MissingInformation), and adducted identifications in .oms input
    did not match the inputs (no alignment points).
  - PERF: MetaInfoRegistry lookups (every MetaInfoInterface access by name) share a reader-writer lock instead of
    all passing through one OpenMP critical section, which serialized threads that read or set meta values.
  - FIX: Percolator nonparametric PEPs (e.g. ProSE's Percolator rescoring): fewer than 4 score bins, or bin medians closer than 1e-15,
  - PERF: OpenSwathWorkflow/OpenDIA output no longer stalls the scoring threads: XIC Parquet chromatograms are
    compressed by the thread that extracted them (MSChromatogramParquetConsumer::encodeChromatogram(),
    consumeEncodedChromatograms()) and only appended inside the output lock, and the buffered OSW writer writes
    queued rows as they are instead of merging them under its queue lock. Output is unchanged.
  - PERF: MSChromatogramParquetConsumer writes its row batches (ZSTD compression) on a thread of its own, in the order
    in which they are completed, instead of inside the lock that serializes chromatogram output. The rows are unchanged.
  - FIX: Percolator nonparametric PEPs (e.g. ProSE -rescore): fewer than 4 score bins, or bin medians closer than 1e-15,
    made the PEP spline divide by zero (assertion in Debug builds, meaningless PEPs in Release builds).
  - FIX: TempDir names drop the hostname and, on Windows, use an 8-character random suffix instead
    of a full UUID (about 45 instead of 90 characters). On Windows, OpenDIA failed with "unable to
    open database file" once -workflow:intermediate_dir was longer than about 120 characters,
    because its intermediate SQLite files (and their journals) ended up beyond MAX_PATH.
  - FIX: pyOpenMS RNase modification groups borrow stable RibonucleotideDB entries. Inference accepts equivalent registered definitions and rejects unknown or edited definitions; copied groups and digestion products survive collection or mutation of Python inputs.
  - PERF: ChromatogramExtractorAlgorithm reaches a target m/z that is far ahead in a spectrum by binary search
    instead of walking there peak by peak (MS1 extraction of one isolation window's precursors). Output is unchanged.
  - PERF: ChromatogramExtractorAlgorithm reserves each chromatogram for the spectra inside its RT window instead of
    growing it point by point, and ChromatogramExtractor::return_chromatogram moves the converted chromatograms into
    the output. OpenDIA peak memory on an Astral DIA run with 600k precursors and 32 threads: 25.6 GB instead of 32.6 GB.
  - PERF: SWATH maps that were cached to disk (readOptions cache/cacheWorkingInMemory of OpenSwathWorkflow and
    OpenDIA) get their access objects in parallel: 12 s instead of 48 s for the 300 windows of an Astral DIA run.
  - UniqueIdGenerator guards the shared Mersenne Twister with one mutex per id instead of two OpenMP
    critical sections, which also protects callers without OpenMP. Generated ids exclude zero.
    The seeded sequence is preserved except for skipped zeros.
  - PERF: OpenDIA returns the memory freed by extraction and scoring to the system before rescoring (glibc), so that
    rescoring, inference and export no longer run on top of it: 26.8 GB instead of 34.8 GB peak for three Astral runs.
  - PERF: OpenDIA/CalibrationWorkflow apply the RT extraction window estimated by the calibration to the precursor (MS1)
    traces as well (plus 15 s on either side), instead of leaving them at the uncalibrated default, unless the MS1 traces
    are peak-picked too (TransitionGroupPicker:use_precursors). Scores are unchanged;
    on Astral DIA runs the peak memory drops from 25.5 GB to 19-20 GB and the XIC output to about half its size.
  - PERF: OpenSwathOSWWriter::OSWValue takes 16 instead of 40 bytes (text values, which are rare, are held out of
    line), so the rows queued for the OSW writer need less than half the memory and block the scoring threads less.
  - FIX: IDFilter throws on non-finite observation-match scores and PSM/distinct peptide q-values outside [0, 1] before modifying the data; missing scores are still filtered out.
  - FIX: RNA a1-B fragments include 5-prime terminal modifications; getMultipleSpectra uses the requested precursor charge, and RNA mzTab calculated m/z includes the assigned adduct.
  - PERF: OpenSwathPercolatorScoring reads the peak groups of an OSW file with one scan per table and joins and sorts
    them in memory, instead of one SQL join with an ORDER BY (176 s instead of 219 s rescoring for 2.9 M peak groups).
  - PERF: OSWFile::readOpenSwathExportRows aggregates the transition intensities only for the exported peak groups
    instead of for every peak group of the file (OpenDIA/OpenSwathExport result export: 30 s instead of 72 s).
  - FIX: PEFFEntry::getVariantSequences and digestWithVariants no longer shift descriptions against
    sequences when a variant sequence cannot be parsed; the unparsable variant is skipped as a pair.
  - OpenSwathPercolatorScoring (OpenDIA rescoring) trains Percolator on the best peak group of every precursor (new
    parameter training_main_score, default var_xcorr_shape) plus all peak groups of precursors drawn at random, up to
    percolator:subset_max_train further peak groups, and scores all peak groups with the model; before,
    percolator:subset_max_train had no effect and training used all peak groups. percolator:subset_max_train = 0
    restores that. Results change.
  - FIX: Percolator's num_threads (OpenDIA rescoring, OpenSwathPercolatorScoring, in-process PercolatorAdapter, ProSE) had
    no effect; cross-validation now runs on at most num_threads threads, and never on more than the tool's -threads.
    num_threads accepts up to 128 (as upstream) instead of 3; the default stays 3.
  - FIX: SignalToNoiseEstimatorMedian auto_mode 1 (percentile) used the minimum instead of the maximum intensity and
    indexed its histogram out of bounds (crash, e.g. PeakPickerHiRes); intensities beyond the int range land in the last bin.
  - FIX: SignalToNoiseEstimatorMedian and SignalToNoiseEstimatorMeanIterative no longer apply an absolute intensity offset
    when binning auto percentiles. MeanIterative selects the actual maximum and safely handles all-zero spectra (#10521).
  - PERF: SignalToNoiseOpenMS keeps only the S/N values of its chromatogram: it computes them with the new static
    SignalToNoiseEstimatorMedian::estimate(), which takes the parameters as a plain Settings struct, instead of
    constructing an estimator with its whole parameter set for every chromatogram (about 4% of the CPU time of
    OpenSWATH/OpenDIA scoring). The values are unchanged.
  - PERF: PeakPickerHiRes no longer builds a SignalToNoiseEstimatorMedian with its whole parameter set for every
    spectrum or chromatogram it picks: the S/N settings (new SignalToNoiseEstimatorMedianSettings) are read once and
    the values come from the static SignalToNoiseEstimatorMedian::estimate(). The values are unchanged. OpenSWATH and
    OpenDIA pick every fragment trace this way; a 150-point chromatogram takes about a fifth of the time to pick.
  - PERF: OpenSwathWorkflow/OpenDIA extraction and scoring use all threads when a wave holds fewer SWATHs than threads
    (e.g. maxConcurrentSwaths 1): the minimum inner batch size no longer scores a whole SWATH in one job, and the
    chromatogram extraction, the conversion of the extracted chromatograms, loading a SWATH into memory and the XIC
    encoding of a SWATH run in parallel. Scoring needs about 45% less CPU time: transition groups are scored in place,
    picked features and chromatograms are moved instead of copied, the MS1 combined cross-correlation and MI matrices
    reuse the entries of the transition, precursor and contrast matrices, the inverse RT transformation, averagine
    isotope distributions (by element composition) and the chromatogram index of a SWATH are computed once, and when
    only the best peak groups are reported (stop_report_after_feature) the scores outside the SWATH prescore are
    computed for those only. On an Astral DIA run (300 windows, 600k precursors, 4 threads, maxConcurrentSwaths 1)
    extraction and scoring take 15 min instead of 1:33 h, and OpenDIA 33 min instead of 1:51 h. Scores and results
    are unchanged.
  - FIX: ChromatogramExtractorAlgorithm: with ion mobility extraction, a coordinate with ion mobility that follows
    (in m/z order) coordinates without ion mobility no longer compares the ion mobility of other peaks.
  - FIX: FeatureOverlapFilter::filter (and mergeFAIMSFeatures) no longer removes every feature
    without a unique id once one of them is merged; FAIMS feature merging kept 0 features.
  - Feature ids (#10520): FeatureFinderAlgorithmPicked and SeedListGenerator::convertSeedList give every
    feature a valid unique id (FeatureFinderAlgorithmPicked when the feature is found, so the FAIMS merge
    in FeatureFinderCentroided sees valid ids). The new FeatureUniqueIds::check() (also in pyOpenMS) throws
    Exception::InvalidValue for invalid or duplicate ids of the features (including subordinates) or
    consensus features of a map.
  - API: MapConversion::convert(PeakMap -> ConsensusMap) is removed (also from pyOpenMS): each peak became a
    consensus feature whose handle referred to the peak's index (the first one being the invalid id 0), not to
    an element with a unique id. MapAlignmentAlgorithmPoseClustering selects the most intense MS1 peaks of a
    PeakMap itself (holding only the selected peaks, without copying the map); its setReference() template is
    replaced by overloads for FeatureMap and PeakMap.
  - MapAlignmentAlgorithmPoseClustering (MapAlignerPoseClustering): new 'peak_selection:method' 'spread', the new
    default for peak maps (e.g. mzML input), selects at most one MS1 peak per analyte (non-maximum suppression over
    the elution profile, within 'peak_selection:rt_window', and the isotope pattern, up to
    'peak_selection:max_charge'), spread round-robin over a 'peak_selection:rt_bins' x 'peak_selection:mz_bins' grid.
    The most intense peaks of a few analytes cancel out in the superimposer and make the pair finder's matches
    ambiguous. 'peak_selection:method' 'intensity' selects the most intense peaks as before. Feature maps are not
    affected.
  - FIX: MapAlignmentAlgorithmPoseClustering (MapAlignerPoseClustering) used the first 'max_num_peaks_considered'
    features of a feature map in file order (e.g. the 1000 lowest-RT features of a position-sorted featureXML)
    instead of the most intense ones. Peaks or features with a NaN intensity or a non-finite RT or m/z now throw
    Exception::InvalidValue instead of making the selection undefined.
  - FIX: MetaboliteSpectralMatching HyperScore rejects negative and non-finite fragment tolerances before scoring, including empty spectra; zero-tolerance exact matching remains supported.
  - FIX: OMS schema 6 preserves IdentificationData processing actions and distinct same-second search provenance; schemas 1-5 remain readable.
  - FIX: IdentificationData chooses a reproducible representative for exact best-score ties without target/decoy preference.
  - ProteinIdentification: an empty file list ('spectra_data', 'spectra_data_raw') names no files and is not
    stored. setPrimaryMSRunPath() with an empty list removes the meta value (it stored an empty list and warned),
    addPrimaryMSRunPath() with an empty list changes nothing, and idXML, featureXML, consensusXML and the Parquet
    formats drop an empty list when loading (removeEmptyPrimaryMSRunPaths()). An empty list could not be told from
    a missing one: getPrimaryMSRunPath() returns no files for both, and the Parquet formats wrote both as an empty
    list and read an empty list back, so converting a run without files added one.
  - FIX: FeatureFinderAlgorithmPicked (FeatureFinderCentroided) throws InvalidParameter for isotopic_pattern:charge_low above
    charge_high (the charge count wrapped; crash) and aborts seeds without an isotope pattern for feature:min_isotope_fit 0 (crash).
  - FIX: FeatureFinderAlgorithmPicked (FeatureFinderCentroided) counted aborted seeds in a map shared by
    the OpenMP threads of the seed extension without a lock, which could corrupt the map (intermittent crash).
  - FIX: MapAlignmentAlgorithmIdentification (MapAlignerIdentification, ProteomicsLFQ, MS1LabeledWorkflow) applies
    'score_cutoff'/'min_score' in the score direction of each peptide identification. The cut-off was ignored for
    peptide identifications (idXML input), applied the score direction of the first identification of a feature or
    consensus map to all of them, and read out of bounds (crash) if the first feature had no identification. With
    'use_feature_rt', a feature whose identifications all failed the cut-off was an alignment point under an empty sequence.
  - FIX: ParamValue and DataValue conversions to double, float and long double throw a ConversionError
    for string and list values instead of returning garbage.
  - FIX: MRMIonSeries::annotateTransitionCV gave every formula neutral loss (e.g. y7-H2O1) the mass
    of the first formula loss annotated in the process.
  - FIX: IndexedMzMLDecoder no longer drops the first offset of an <index> whose first child is an
    <offset> element (no whitespace after the opening tag).
  - FIX: IDFilter -in_silico_digestion (IDFilter::DigestionFilter) dropped the last residue of each
    peptide evidence (inclusive end) and so rejected valid digestion products and accepted invalid ones.
  - FIX: ElementDB built iridium (Ir) from rhenium's isotope masses and abundances.
  - FIX: IMDataConverter::splitByFAIMSCV updates the ranges of each FAIMS CV group, so
    FeatureFinderCentroided no longer fails with "No ranges for this MS level" on FAIMS input.
  - FIX: IsobaricAnalyzer and IsobaricWorkflow precursor purity now count the precursor's own
    isotope peaks using 13C/12C mass spacing and a bounded nearest-peak search on both sides of
    each expected isotope position. Clean envelopes no longer receive artificially low purity
    or get discarded by precursor-purity filtering (#10467).
  - Every PeptideIdentification needs the ProteinIdentification run (search run) whose identifier
    it names; the run may have no protein hits or database (e.g. peptidomics, de novo). The new
    ProteinRunReferences checks this (also in pyOpenMS) and throws Exception::InvalidParameter
    ("Peptide identification has no matching protein run: '<id>'. Every peptide identification
    needs the protein identification run (search run) with its identifier, which may have no
    protein hits."). Writers check it before opening the file: idXML, featureXML and consensusXML
    (which silently omitted such peptide identifications with a warning), pepXML, mzIdentML, xQuest
    XML, mzTab (which threw std::out_of_range after truncating the file), OMS
    (IdentificationDataConverter::importIDs) and the Parquet formats (idparquet, featureparquet,
    consensusparquet, the QPX views), which wrote dangling references. Loaders refuse dangling
    references instead of keeping the identification without a run: featureXML/consensusXML
    (unknown identification_run_ref; was a warning), featureparquet, idparquet and consensusparquet
    (which added an empty run) and mzIdentML (which assigned the first run).
  - FIX: Producers of peptide identifications without their run, whose identifications the writers
    dropped: MzIdentMLFile and XQuestResultXMLFile lost the run identifier of cross-linking
    identifications (OPXLHelper::removeBetaPeptideHits, which now also keeps the matches of the
    same spectrum of different runs apart, and every cross-link match but the last of a spectrum);
    FeatureMapArrowIO did not rename the run identifier of subordinate identifications on load;
    OpenSwathWorkflow's featureXML output had no run (MRMFeatureFinderScoring::
    addProteinIdentificationRun adds it with the proteins of the transition list, or merges them
    into an existing run); FeatureFinderIdentification wrote its feature candidates (candidates_out)
    before setting the runs, and reported the pseudo IDs of seeds and offset peptides that the PSM
    score cutoff rejected as unassigned identifications (re-scoring candidates now removes the
    pseudo IDs, too); FeatureFinderAlgorithmMetaboIdent took the run only from the first FAIMS group;
    ConsensusMap::split (not isobaric) copied no runs; IDMerger -add_to kept a peptide without its
    run when none of its proteins was found there, and added a protein shared by two runs of a file
    to the first run only; the OMSSA XML loader of FileHandler overwrote the first run and added an
    empty one. OpenSwathAnalyzer added a run per SWATH file, with the same identifier (several files
    could not be stored); it adds one now.
  - FIX: featureXML and consensusXML wrote a protein reference to a protein that is no protein hit of
    the peptide identification's run as 'PH_0', i.e. as another protein (the file could not be read back
    or named the wrong protein). Storing now throws Exception::ElementNotFound before the file is opened
    (ProteinRunReferences::checkProteinAccessions, also in pyOpenMS). idXML wrote a reference to the
    protein hit of an earlier run for an accession missing from the peptide identification's run; it
    throws Exception::ElementNotFound for it now, as for an unknown accession. featureXML and
    consensusXML also looked protein hits up by run identifier and accession joined with '_', so the
    hits of e.g. run 'A' with accession 'B_C' and run 'A_B' with accession 'C' were confused.
    Loading idXML, featureXML and consensusXML refuses a protein reference (protein_refs) to a protein hit
    of another run (it was resolved file-wide, so such references, e.g. written by the former 'PH_0'
    fallback, named whatever protein that hit was).
  - FIX: OnDiscMSExperiment::getSpectrum and getChromatogram keep the retention time, MS level, name and
    all data arrays (float, string, integer, e.g. ion mobility) when an m/z, RT or intensity range is set.
    The range filter copied only the SpectrumSettings / ChromatogramSettings, and the data arrays are now
    filtered together with the peaks. The returned spectrum's or chromatogram's m/z, RT and intensity ranges
    describe the kept peaks; a data array whose length does not match the peak list is emptied.
  - BrukerTimsFile applies the ModelType 2 correction of the MzCalibration table (columns C5..C14:
    a polynomial in m/z subtracted inside the calibrant range, as in Bruker's high precision
    calibration). When these columns are present and usable, m/z now matches the Bruker SDK inside
    that range (before: up to 1.3-7.8 ppm off); within about 4 m/z units outside its limits
    deviations of a few ppm remain. Without them the base curve is used, with a warning.
  - FIX: PeptideAndProteinQuant (ProteinQuantifier, IsobaricWorkflow) reported file/channel-level
    protein abundances of 0 for run files whose name stem contains a dot (e.g. sample.v1.mzML).
  - BrukerTimsFile computes m/z from the MzCalibration table of analysis.tdf, with the per-frame
    temperature correction (new MzCalibrationTof2MzConverter; formula as in rustims). Before, m/z
    came from a linear approximation in sqrt(m/z) over the acquisition range, which was off from the
    Bruker SDK by -37 to -4 ppm on a 2020 timsTOF Pro run, mostly by up to +-17 ppm on newer runs,
    and by up to 1800 ppm on older otofControl runs. Now m/z matches the SDK for MzCalibration
    ModelType 1 (ModelType 2: see the entry above). tims_calibration_strategy LINEAR keeps the
    old m/z; bruker:calibrate (OLS) only applies to it. DDA MS2 spectra convert TOF to m/z with a
    real frame id instead of 0.
  - BrukerTimsFile: when an optional Bruker SDK is configured (OPENMS_BRUKER_SDK_PATH or
    Config::bruker_sdk_path) it is used for m/z as well as 1/K0 ("TIMS calibration: Bruker SDK
    (m/z + 1/K0)"). The SDK is never required; one that cannot be loaded is reported as a warning
    (before: debug message) unless tims_calibration_strategy is BRUKER_SDK.
  - FIX: BrukerTimsFile (RationalScan2ImConverter, tims_calibration_strategy RATIONAL or AUTO without
    SDK) returned negative 1/K0 for negative-mode runs: the TimsCalibration ramp voltages are signed
    by polarity and entered 1/K0 = 1/(c6 + c7/V) with their sign. The mobility term now uses |V|, and
    the inverse (1/K0 to scan) restores the sign from the calibration. 1/K0 matches the Bruker SDK
    (without pressure compensation) in both polarities; positive-mode results are unchanged.
  - Added FileHandler::loadImagingExperiment(), which loads mass spectrometry imaging files (imzML and
    Bruker timsTOF MALDI imaging .d) into an MSImagingExperiment; exposed through pyOpenMS.
    FileHandler::loadExperiment() now rejects Bruker MALDI imaging .d folders with InvalidFileType, as
    it already did for imzML. Before, it read them as DDA-PASEF and failed on the missing Precursors table.
  - pyOpenMS: BrukerTimsFile.Config has every field of the C++ struct. New are the frame and retention
    time range (frame_id_min, frame_id_max, rt_min_sec, rt_max_sec), ms1_centroid_algo, the HillBased
    centroiding options and the isotopic prefilter options.
  - FileHandler::loadExperiment() no longer decodes what its PeakFileOptions exclude from Bruker .d
    input. The reader skips the MS levels that are not requested, and the retention times outside the
    requested range if only MS1 is requested, instead of reading everything and filtering afterwards.
    The spectra returned are unchanged. An MS2-only load of a ddaPASEF run (SimpleSearchEngine, ProSE,
    ...) no longer reads the MS1 frames, an MS1-only load (the FeatureFinders) no MS2 frames. For direct
    use of the reader there is BrukerTimsFile::Config::load_ms2 (also in pyOpenMS).
  - FIX: BrukerTimsFile no longer warns "ms1_centroid_mz_ppm and ms1_centroid_im_pct must both be > 0 to
    enable MS1 centroiding" on every load with the default configuration (ms1_centroid_mz_ppm has been
    10 by default since HillBased centroiding uses it; on its own it selects nothing).
  - BrukerTimsFile reads raw frames (MS1 without centroiding, FRAME export mode) more than twice as fast:
    the peaks of a frame are put in m/z order while they are read, by their TOF index, instead of sorting
    every spectrum by m/z at the end of the load, which took most of the time. The output is unchanged.
  - BrukerTimsFile decodes every MS2 frame of a diaPASEF run once and splits it into the isolation windows
    of its window group (load() without RT aggregation, transform() and loadDIAStreaming(), which
    OpenSWATH uses), instead of decoding it once per window; the window spectra are emitted in m/z order.
    A default diaPASEF load takes less than half the time. The output is unchanged.
  - BrukerTimsFile keeps a decoded MS2 frame of a ddaPASEF run only until the last precursor that needs
    it has been read, not until the end of the load. An MS2-only load of a 110 min run (62,000 frames,
    230,000 precursors) peaks at 5.8 GB instead of 14 GB. The output is unchanged.
  - BrukerTimsFile decodes raw frames (MS1 without centroiding or aggregation, FRAME export mode) on up to
    four threads, in batches that it hands on in order. With the changes above, a default load of a 5.6 min
    ddaPASEF run takes 4.1 s instead of 20.8 s and one of a diaPASEF run 5.5 s instead of 19.4 s. Frames
    are decoded one at a time if the Bruker SDK does the conversions. The output is unchanged.
  - Bruker .d input that cannot be read is reported as such. A .d directory with TSF data (analysis.tsf,
    timsTOF without ion mobility) or BAF data (analysis.baf, QTOF) was an unknown file type ("Could not
    determine input file type"); FileHandler::getType() now takes it as Bruker .d and the readers throw
    a ParseError that names the format. TDF data that is not zstd-compressed (TimsCompressionType other
    than 2) gets a ParseError naming the value instead of "... is not readable for the current user".
    A '.d.zip' archive is typed by its list of entries: one without a .d directory (or without entries)
    is no longer taken for Bruker data, and nothing is extracted before the reader rejects an archive.
    New: BrukerTimsFile::detectFormat() and checkDataFormat(), and ZipArchiveFile::listEntries() with a
    result that tells an archive without entries from one that cannot be read.
  - BrukerTimsFile::transform() hands the spectra to the consumer as they are read, in the order and form
    load() returns them, instead of loading the whole run first; the memory it needs no longer grows with
    the run. (Exceptions, loaded completely as before: DIA with MS2 aggregation over retention time, and
    DDA with calibrate on the linear m/z model.) Exposed in pyOpenMS (BrukerTimsFile.transform()), as are
    detectFormat() and checkDataFormat().
  - FileHandler::transformExperiment() streams Bruker .d input (directory or .d.zip) as well; before, it threw
    InvalidFileType. As for loadExperiment(), the reader skips the frames the PeakFileOptions exclude, and
    every spectrum is then filtered on its way to the consumer (MS level, RT and precursor m/z range, peak
    m/z and intensity range, metadata-only), so the consumer gets the spectra loadExperiment() returns.
    MALDI imaging .d is rejected as by loadExperiment(). The number of spectra passed to setExpectedSize()
    is an upper bound (see BrukerTimsFile::transform()). loadExperiment() now also honours fill-data off for
    Bruker .d input (spectra without peaks, as for Thermo .raw).
  - BrukerTimsFile::Config::rt_selects_spectra (new, default false): the retention time range selects the spectra
    instead of the frames. load() and transform() then return the spectra of a load without the range whose retention
    time lies in it, unchanged: a DDA MS2 spectrum (the mean time of its frames) is built from all of its frames, and
    aggregation over retention time reads the neighboring frames outside the range that it needs. FileHandler uses it,
    so loadExperiment() and transformExperiment() no longer decode the MS2 frames outside a requested RT range of
    Bruker .d input (before, the RT range was passed to the reader for MS1-only loads alone).
  - Ion mobility range: PeakFileOptions::setIMRange() (new) restricts the ion mobility of the data FileHandler loads or
    streams, for every format: peaks outside the range are removed from spectra with an ion mobility per peak, spectra
    with a single ion mobility outside it are left out, spectra without ion mobility are kept. For Bruker .d input it is
    passed to the reader, BrukerTimsFile::Config::im_min/im_max (new), which filters likewise and skips the DDA
    precursors isolated outside the range before their frames are decoded. Both are exposed in pyOpenMS.
  - FIX: BrukerTimsFile reads TDF data without DDA-PASEF precursors (no Precursors and PasefFrameMsMsInfo tables,
    e.g. MS1-only MALDI runs) as its MS1 frames, and warns if such a run has MS2 frames, which only export mode
    FRAME reads. It threw SQLite::Exception "no such table: Precursors", which ended TOPP tools such as
    FileConverter (exit code 134). No SQLite::Exception leaves load(), transform(), readDIAMetadata() or
    loadDIAStreaming() any more: an analysis.tdf that lacks a table or column the reader needs gives a ParseError
    that names the file (#10597).
  - FIX: BrukerTimsImagingFile reads '.d.zip' archives (it looked for <archive>/analysis.tdf); only analysis.tdf
    is extracted for the metadata. isImagingDataset() now recognizes zipped MALDI imaging runs, so
    FileHandler::loadExperiment() and transformExperiment() reject them as they reject .d directories, and
    loadImagingExperiment() loads them (#10596).
  - FIX: ZipArchiveFile::extractEntryToTempFile() rejected every entry as "would extract outside target directory"
    when the path of the temporary directory was not in normal form: always on Windows, where it holds both '/' and
    '\', and elsewhere with a temporary directory ending in '/' (e.g. TMPDIR on macOS). It now checks containment as
    unzipDirectory() does. This affected zipped .oswpq archives and the .d.zip support of BrukerTimsImagingFile.
  - FIX: BrukerTimsFile rejects MALDI imaging runs (.d or .d.zip) with InvalidFileType unless the export mode is
    FRAME, which BrukerTimsImagingFile uses; readDIAMetadata() and loadDIAStreaming() reject them in any case.
    The tools that read .d with BrukerTimsFile directly instead of FileHandler read them as DDA or DIA data,
    without their pixel positions (#10596).
  - FIX: cachedMzML (CachedMzMLHandler, MSDataCachedConsumer) wrote no data arrays for a spectrum or chromatogram
    without peaks, although it announced them, so everything after it was read from the wrong position ("Read an
    invalid spectrum length"). Bruker .d input with MS1 aggregation (ms1_n_neighbors > 0) gives such spectra: a
    frame without peaks keeps its empty ion mobility array. CachedMzMLHandler::readMemdump() also returns the values
    of the data arrays of chromatograms, which came back empty.
  - MSDataWritingConsumer (the streaming mzML writer of the low-memory modes) corrects the count of its
    spectrumList when the file is closed, if another number of spectra was written than it was told to
    expect (a filter, or a reader that leaves empty spectra out). The tag is rewritten in place and
    padded with blanks, so the index stays valid. Before, the count stayed at the expected number.
    If it got the settings of a run but no spectrum or chromatogram, it now writes the mzML document of
    a run without spectra, as MzMLFile::store() does, instead of an empty file (e.g. -process_lowmemory
    conversions in which every spectrum is filtered out).
  - FIX: ThermoRawFile (native Thermo .raw reader) opens files given through a symbolic link, as
    staged by Nextflow and Galaxy. Thermo's RawFileReader failed on them ("Could not open RAW file");
    the resolved path is opened now, while the source file keeps the given name (#10451).
  - ThermoRawFile reads .raw files faster: trailer values are looked up by a per-file label index,
    numbers and scan filters are parsed without locale streams and regular expressions, the TIC
    is built from the scan headers, and with more than one thread up to three worker threads read
    scans ahead while the calling thread converts them (output independent of the thread count). New ThermoRawFile::Options select scans by scan number, RT, MS
    level and precursor m/z, and load metadata only or skip chromatograms; scans that are not
    selected are not decoded, and selected MSn scans keep the precursors of a full load (#10522).
    FileHandler::loadExperiment() passes the PeakFileOptions MS levels, RT and precursor m/z ranges,
    metadata-only, fill-data and skip-chromatograms to the reader (MS2-only tools no longer decode
    MS1 scans; fill-data off now loads spectra without peaks) and no longer computes the SHA-1 of the
    RAW file. Instrument configuration ids no longer depend on which scans are loaded.
  - ThermoRawFile::transform() streams a .raw file into an IMSDataConsumer in acquisition order with
    the same spectra as load() and constant memory (only the parent MS1 scans that later precursor
    intensity estimates need are kept). FileHandler::transformExperiment() streams mzML, mzXML and
    Thermo .raw files into a consumer and applies the PeakFileOptions like loadExperiment(). SwathFile
    gains loadThermoRaw(); loadFromMSExperiment() keeps only the experimental settings as metadata (#10522).
  - Random access to Thermo .raw files: OnDiscThermoRawExperiment keeps the file open with an index of
    the selected scans and converts single spectra on request, identical to the corresponding spectra of
    ThermoRawFile::load() with the same Options; clone() gives handles for concurrent reads. It and
    OnDiscMSExperiment implement the new IMSExperimentRandomAccess interface (OnDiscMSExperiment gains
    getSpectrumMetadata(), getSpectrumRT(), getSpectrumMSLevel() and findFirstRT()).
    SpectrumAccessOnDisc exposes any IMSExperimentRandomAccess (or an RT-sorted subset of it) as an
    OpenSwath::ISpectrumAccess; SwathFile::loadThermoRaw() supports readoptions "onDisc" (#10522).
    SwathFile::loadOnDisc() and loadOnDiscByFAIMSCV() build the SWATH maps on any
    IMSExperimentRandomAccess, the latter split by FAIMS compensation voltage like
    IMDataConverter::splitByFAIMSCV(). Their file overloads choose the random-access backend by file
    type (indexed mzML: OnDiscMSExperiment, Thermo .raw: OnDiscThermoRawExperiment). Plugin consumers
    may only observe the spectra with "onDisc".
  - pyOpenMS: ThermoRawFile.transform() streams into a Python consumer; OnDiscThermoRawExperiment is
    wrapped with indexing, iteration and RT lookup (#10522).
  - PeptideIndexing sorts its peptide-protein matches once after the parallel database search,
    instead of after every thread/chunk merge. Matching results are unchanged.
  - Percolator::rescorePSMs rescores PeptideIdentifications in place on the standard Percolator
    (.pin) feature set: it stamps the PIN features, trains, transfers q-value/PEP/SVM score into
    the main score and the PSI-MS meta values, and removes the stamped features again. It is the
    in-process backend of PercolatorAdapter, moved out of the tool so other tools (ProSE) can use it.
    Hits it cannot rescore (no peptide evidence, no target/decoy annotation or a missing feature)
    now get q-value = PEP = 1 and SVM score = -100, as on PercolatorAdapter's executable path,
    instead of keeping their search engine score under the Percolator score type.
  - OpenSWATH (MRMFeatureFinderScoring) and AccurateMassSearchEngine record the score type of the
    peptide identifications they write: xx_lda_prelim_score (or xx_swath_prelim_score,
    OverallQuality; higher is better) and MassErrorAbsPPMScore (lower is better). AccurateMassSearch
    hits of feature and consensus maps now score their absolute m/z error in ppm instead of 0; the
    signed error stays in the meta value mz_error_ppm (and is what MassErrorPPMScore names in the
    mzTab and mzTab-M output).
  - FeatureOverlapFilter::mergeCoincidentFeatures merges features with the same charge, RT and m/z
    (within 0.01 ppm) into the most intense one, which keeps the peptide identifications of all of
    them (also in pyOpenMS).
  - FIX: IDConflictResolverAlgorithm::resolve keeps a feature's best identification with hits when
    lower scores are better. It picked an identification without hits instead (moving the feature's
    hits to the unassigned list), and with keep_matching read that identification's missing first hit
    (#10443).
  - FIX: ConsensusMapMergerAlgorithm::mergeProteinsAcrossFractionsAndReplicates offsets each PSM's
    id_merge_index by the position of its original run's files in the merged run. The offset was
    looked up under the new run identifier, so every PSM pointed at the first file of its new run.
  - FIX: MzTab identification export gives a spectrum file listed by several runs one ms_run. The
    next new file used to take that ms_run's index again, so its PSMs pointed at the repeated file.
  - FIX: SpectrumMetaDataLookup::addMissingSpectrumReferences updates the caller's protein
    identifications; it took them by value, so 'override_spectra_data' had no effect. A second
    overload without protein identifications replaces the default argument.
  - FIX: ProteinIdentificationArrowIO restores 'spectra_data_raw' (the raw files of a run) on import;
    it was written but dropped when reading.
  - Added IDFreeMassErrorEstimator, a streaming identification-free precursor/fragment mass-precision
    estimator with charge-less DIA fragment support, background-aware high-resolution fragment
    precision, and an adaptive high-intensity fallback for low-signal DIA data; exposed through pyOpenMS. (#10433)
  - FIX: PercolatorInfile keeps the observed precursor m/z in ExpMass and mass for all
    PSMs of a spectrum. Isotope correction applies only to the mass-error features,
    so candidates with different isotope errors compete in the same Percolator spectrum group.
  - IdXMLFile formats peptide identifications in parallel, writes blocks in input order,
    caches metadata names per worker, and sorts hit indices instead of copying hits.
    The writer uses at most 16 threads and preserves the existing output and hit order.
  - FIX: IdXMLFile::store throws when writing the file fails (e.g. disk full, an I/O error, or an
    allocation failure while a block of the parallel writer is formatted). It does not remove the
    file: a partial file may remain. The message of an OpenMS exception names the file and says
    so; other exceptions (e.g. std::bad_alloc) are raised unchanged.
    The block writer accepted the text of a failed block stream, and the state of the file stream
    was never checked, so a truncated idXML could be left behind a successful return.
  - FIX: OpenDIA builds without private Arrow headers. OSWPQ result storage now uses
    the public OSWParquetFile API, including staged archive commits (#10414).
  - TransitionPQPFile can write a PQP library incrementally in batches (new batch writer API), so
    large libraries do not have to be held in memory before they are written (#10401).
  - FIX: Predicted-library persistence builds with ONNX, uses the OpenDIA working directory,
    and preserves protein accessions/order and prediction values across disk batches. Indexed
    mapping lookups and direct source-ID reload avoid quadratic append work and full-library
    provenance maps. Duplicate precursor charges are rejected before inference (#10402).
  - FIX: File::getOpenMSDataPath() and the documentation path no longer keep NUL padding from
    the compiled-in install paths. Relocated packages (e.g. conda, which rewrites the install
    prefix inside the binary) could not read share/OpenMS data files, and OPENMS_DATA_PATH was
    never consulted (#10353).
  - FIX: PercolatorFeatureSetHelper::addMSGFFeatures sets the MS-GF+ fragment error standard
    deviations (StdevErrorAll, StdevErrorTop7, StdevRelErrorAll, StdevRelErrorTop7) to 0 if
    MS-GF+ reported them as NaN (identical fragment errors). PercolatorAdapter rejects non-finite
    features, so MSGFPlusAdapter/PSMFeatureExtractor output could fail rescoring (e.g. quantms TMT).
  - FIX: Number parsing (StringUtils::toDouble/toFloat/extractDouble) is now independent of the
    C locale on libc++ (macOS). In a decimal-comma region (e.g. de_DE), TOPPView, TOPPAS and
    INIFileEditor failed to load mzML files with a ConversionError, because "60.5" was read as
    60. The imzML and Arrow/Parquet readers no longer use the locale-dependent std::stod, and
    the GUI tools reset LC_NUMERIC to "C" after starting Qt.
  - FIX: HyperScore::computeWithDetail reported a mean fragment error of 0 for Da tolerances on
    Linux arm64: an unqualified abs() bound to the integer overload there and truncated every
    error. ProSE's fragment calibration therefore kept the configured Da tolerance on arm64,
    while x86-64 and macOS tightened it.
  - FIX: FragmentIndex rejects fixed terminal modifications it applied to every peptide although
    they apply to some only (protein-terminal or residue-specific ones, e.g. Acetyl (Protein
    N-term), Gln->pyro-Glu (N-term Q); search them as variable modifications) and a second fixed
    modification on one terminus. A variable modification of a whole terminus is not applied
    where a fixed one sits (as in ModifiedPeptideGenerator); the index used to add both masses.
    Variable modifications are enumerated only up to modifications:variable_max_per_peptide per
    peptide, from at most 31 sites (a warning counts peptides with more). The default precursor
    isotope range of FragmentIndex is [-2, 0] (it searched [0, +2], precursors picked below the
    monoisotopic peak).
  - FIX: FragmentIndex applies a residue-specific terminal variable modification (e.g. Gln->pyro-Glu
    (N-term Q)) as a terminal modification; set as a residue modification, it failed ResidueDB's
    precondition and aborted the parallel search. A variable residue modification is not applied to a
    residue that carries a fixed one (as in ModifiedPeptideGenerator; the index held both masses while
    the reconstructed sequence kept one); a residue-specific terminal one is, e.g. Ammonia-loss (N-term
    C) next to a fixed Carbamidomethyl (C). The peptide-mass index (low_memory) also
    enumerates nonempty modification subsets whose shifts cancel (e.g. Deamidated (N) with Amidated
    (C-term)); it returned the unmodified sequence only.
  - FIX: FragmentIndex tests the fragments against the same float bounds of a peak's tolerance
    window that select the fragment buckets. The two tests rounded differently, so whether a
    fragment on or next to a bound was counted depended on the bucket layout. Search results can
    change only for spectra with a candidate fragment on or next to such a bound.
  - FIX: ProSE rejects a fragment:mass_tolerance that is not finite and positive, for every
    scoring:method, when the parameters are set; such searches ended without hits or with inflated
    scores. An exception on a worker thread of the parallel preprocessing, scoring and calibration
    loops is rethrown after the loop instead of terminating the process.
  - FIX: ProSEAlgorithm::searchWithModificationAnalysis() for a single input (spectrum file or
    in-memory spectra) ignored FDR:protein and returned the decoys; like search(), it now applies
    protein inference and picked-protein FDR and removes the decoys.
  - FIX: GlobalExceptionHandler records the last exception per thread (the fields were shared strings
    that exceptions constructed on several threads at once wrote concurrently), and its singleton is
    initialised thread-safely. Xerces initialisation and termination are serialised
    (Internal::xercesInitialize(), Internal::xercesTerminate()), as Xerces requires of its callers;
    XMLFile::parseBuffer_() runs on several threads at once in ProSE's chunked mzML reader.
  - FragmentIndex::getProteinOccurrences() lists every span of the digest with the residues of an index peptide,
    including the occurrences that peptide:deduplicate removed from getPeptides() (recorded by the deduplication);
    hasProteinOccurrences() tells whether the list is complete (not with low_memory or with
    protein-terminal modifications).
  - FIX: RNaseDigestion::digest returns no fragments for a sequence shorter than min_length, or
    when min_length exceeds max_length. Unsigned arithmetic wrapped around there, so unspecific
    cleavage asked reserve() for a huge capacity and could index far past the end of the sequence
    (#10179, fixes #9231).
  - FIX: CoarseIsotopePatternGenerator::calcFragmentIsotopeDist() no longer writes behind the end of its
    result when the generator caps the number of isotopes below the length of the fragment
    distribution, e.g. EmpiricalFormula::getConditionalFragmentIsotopeDist() with
    CoarseIsotopePatternGenerator(2) and three isolated precursor isotopes (CPP-005, #10148).
  - Lower peak memory when light OpenSWATH libraries are prepared and written to PQP (OpenDIA
    predicted and transition-list libraries; OpenSwathAssayGenerator, OpenSwathDecoyGenerator and
    TargetedFileConverter on TSV/PQP). Source-ID normalization moves the library instead of copying
    it, the light PQP writer no longer copies every name or builds its mapping inserts as SQL text,
    and decoy generation moves decoys into place. The written libraries are unchanged (#10410).
  - FIX: MzDataHandler now round-trips the ABSORPTION, EMC and TDF scan modes instead of silently
    turning them into the wrong mode; a reader crash (back() on an empty spectrum vector) for an
    unrecognized scan mode on the first MS level >=2 spectrum is also fixed.
  - FIX: MzDataHandler no longer indexes past a spectrum's binary data arrays when they are
    missing, shorter than expected, or desynced with the number of <data> elements actually
    read; peak and float-data-array length mismatches are now clamped instead of read out of
    bounds.
  - FIX: The mzML writer escapes the name of a non-standard data array and the fraction identifier.
    An & or < in either - they are taken verbatim from the data - produced a file that no reader
    could parse, including the OpenMS one (#10148).
  - FIX: MzIdentMLDOMHandler now rejects a SubstitutionModification whose location is 0 or past
    the peptide sequence's length, instead of writing one byte outside the sequence string.
  - FIX: The thread-local log streams behind OPENMS_LOG_* follow the destinations of the global
    streams (getGlobalLog*(), LogConfigHandler, also in pyOpenMS) instead of copying them on their
    first message. Changes did not reach threads that had logged before, including the calling
    thread: e.g. LogConfigHandler 'add' and setLogLevel() had no effect there, and TOPP tools lost
    their -debug output. Worse, threads that had logged while a stream was attached kept writing to
    it after LogConfigHandler 'remove' or 'clear' deleted it (use-after-free, could crash). Changes
    of a thread-local stream itself (insert(), remove(), LogSinkGuard) still apply to its thread
    only, on top of the global destinations (#10478). When the destinations of a stream change, a
    message repeated afterwards is no longer suppressed for a new destination; repeat counts
    ("<message> occurred N times") go only to the destinations that got the message.
  - FIX: Logging from a static destructor, an atexit handler or the destructor of a thread_local
    object crashed: the thread's log streams were already destroyed. Such messages now reach their
    destinations. The global log streams and the colors of warnings, errors and debug messages are
    created on first use, so static initializers can log too. StreamHandler (LogConfigHandler's
    files and string streams) removes a stream from the global log streams before deleting it, also
    at exit (#10478).
  - FIX: LogSinkGuard restores exactly what it removed: it no longer re-adds a destination that the
    global stream removed in its scope (which could then be written to after its deletion), and a
    guard on a global stream no longer undoes the hiding of that destination on a thread. A guard on
    a global stream writes the calling thread's pending text to the destinations it was logged for.
    Log destinations are identified per insertion, not by address, so a new log file at the address
    of a deleted one is a new destination. A destination with exceptions enabled that fails no
    longer makes logging calls throw (#10478).
  - API: LogStreamNotifier and LogStream::insertNotification() were removed; nothing in OpenMS or
    pyOpenMS used them. setPrefix() on a thread-local stream (getThreadLocalLog*()) only changes the
    destinations inserted into that stream; set the prefix of a global destination on the global
    stream, as LogConfigHandler does (#10478).
  - setConsoleDebugLogging() attaches std::cout to, or detaches it from, the global debug stream,
    which all threads follow. TOPPBase (-debug) and TOPPAS (-debug) use it (#10478).
  - Disabled debug output costs about 30 instead of 350 ns per message: without a debug destination
    (the default, e.g. a TOPP tool without -debug), OPENMS_LOG_DEBUG and OPENMS_LOG_DEBUG_NOFILE skip
    the whole message and no longer evaluate its arguments. Both are now void expressions; use
    getThreadLocalLogDebug() to use the stream otherwise. A thread-local stream of the other levels
    without destinations (e.g. after setLogLevel()) is in a failed state (badbit), so that it does not
    format messages, until it has a destination again (#10478).
  - FIX: Below debug level 1, FeatureFinderAlgorithmMetaboIdent and FeatureFinderIdentificationAlgorithm
    suppress OpenSWATH's status output again. They detached std::cout from the global info stream,
    which the calling thread's stream had already copied (#10478). FeatureFinderAlgorithmMetaboIdent
    now shows it at debug level 1 and above, like FeatureFinderIdentificationAlgorithm.
  - FIX: LogConfigHandler::setLogLevel("DEBUG") (also in pyOpenMS) writes debug messages to
    std::cout; the default configuration had no destination for them. Warnings stay on std::cerr:
    setLogLevel() moved them to std::cout, as the default configuration did not match the initial
    destinations of the global streams. The pyOpenMS docstrings of LogConfigHandler.parse(),
    configure() and setLogLevel() were shifted by one method.
  - FIX: FalseDiscoveryRate::applyPickedProteinFDR read past the end of its score map for a protein
    group that took no part in the target-decoy competition (all its members lost their pairs) and
    whose score lay beyond every calibrated group score. The group got an arbitrary value (in our
    builds a number close to 0, i.e. the best q-value). A group score better than every calibrated
    one gets the best q-value now (with no_qvalues: FDR 1), a worse one the q-value or FDR of the
    worst calibrated score. If there are groups but none takes part in the competition,
    Exception::MissingInformation is thrown.
  - FIX: MzMLSqliteHandler no longer accepts a sqMass PRECURSOR.ACTIVATION_METHOD value below -1.
    Such a value cast straight to an out-of-range Precursor::ActivationMethod enum, which later
    code (e.g. getActivationMethodsAsString()) used to index a static name table out of bounds.
  - FIX: For lower-is-better scores, FalseDiscoveryRate gave a protein group whose score is not a
    calibrated score (in picked protein FDR: a group that takes no part in the competition) the
    q-value or FDR of the next worse calibrated score. It gets the one of the closest equal or
    better calibrated score now. IDScoreGetterSetter::setScores_ for protein groups takes the
    direction of the group scores and whether the map holds q-values as new arguments (defaults:
    higher is better, q-values).
  - FIX: Picked protein-group FDR (FalseDiscoveryRate::applyPickedProteinFDR) counted a group twice,
    as decoy and as target, if a member whose decoy won its pair was listed before a member whose
    target won its pair (DECOY_ accessions sort first). A group counts once now, as target, as
    documented. The extra decoys made group q-values too high, depending on accession order.
  - FIX: Picked protein-group FDR in prefix mode also removed the decoy string from the end of an
    accession, so a target such as "XDECOY_" was taken as a decoy and the FDR threw
    std::out_of_range. The decoy string is removed only at the configured end now.
  - FIX: Picked protein FDR made a pair's winner a target when two hits of the same decoy tied.
    A tie prefers a target only if one of the tied hits is a target now.
  - FIX: FalseDiscoveryRate::applyBasic() and applyPickedProteinFDR() skip the protein-group FDR
    when there are no indistinguishable groups, instead of warning "No scores extracted for FDR
    calculation. Skipping. Do you have target-decoy annotated Hits?". Every strictly_unique_peptides
    run of ProteomicsLFQ, IsobaricWorkflow and MS1LabeledWorkflow printed it; results are unchanged.
  - FIX: SwathQC (the charge distribution of OpenSwathWorkflow -out_qc and OpenSwathFileSplitter) used only
    the first MS1 spectrum of a run with 45 or more MS1 spectra: the index for subsampling 30 spectra only
    counted the spectra already taken. It now counts every MS1 spectrum.
  - FIX: TargetedSpectraExtractor with mz_unit_is_Da 'false' (ppm): annotateSpectra() with a TargetedExperiment
    and pickSpectrum() divided mz_tolerance and fwhm_threshold by 1e6 without multiplying by the m/z, so the
    precursor window and the FWHM threshold were about a factor of m/z too small; annotateSpectra() with MS1
    features (extractSpectra() with features) took mz_tolerance in Th. They are now relative to the precursor
    and the peak m/z.
  - FIX: FeatureFinderMultiplexAlgorithm with knock_out: a partial pattern lacking the lightest channel
    (e.g. medium and heavy of a triple SILAC peptide without light) kept the mass shifts of the complete
    pattern, so the filtering only found it next to a peak at the absent light position; such peptides
    came out as unrelated singlets. Knock-out patterns now start at shift 0 (relative to their lightest
    present channel), and the quadruplex knock-out without its third channel is searched as well.
  - FIX: FeatureFinderMultiplexAlgorithm fills getBlacklist() for centroided input, too (it was empty, so
    MultiplexResolver reported overlapped dummy channels as absent instead of not quantifiable). Every
    FeatureHandle of getConsensusMap() carries the unique id of its feature in getFeatureMap() (the
    channel's mass trace hulls); getCentroidedExperiment() returns the peaks the detection worked on.
  - MultiplexResolverAlgorithm: a pattern also has to label as many K, R (and L for Leu3) residues as
    the identified sequence has. The label set of an unlabelled identification occurs in every pattern,
    so e.g. a light singlet of a K-terminal peptide could be completed with Arg-shifted channels. New
    checkIdentifications() tells which identifications of a multiplet agree with its mass shifts,
    expectedChannelMZs() where the peptide of an identification appears in every channel.
  - FIX: TheoreticalSpectrumGenerator with add_internal_fragments never generated the internal fragment that
    ends next to the C-terminal residue (e.g. ID of PEPTIDE), and none at all for peptides of 4 residues.
    OpenNuXL, which annotates spectra with internal fragments, now reports these fragments too.
  - FIX: TMT 32-plex and 35-plex (IsobaricAnalyzer, IsobaricWorkflow) could not use isotope correction:
    the correction_matrix parameter was ignored and the identity matrix used, which the isotope correction
    rejects, so the tools failed with the default isotope_correction 'true'. Both methods now ship the
    matrices of a Thermo Certificate of Analysis as defaults, in two parameters laid out like the two CoA
    sheets: correction_matrix for the non-deuterated channels (8 columns, as for TMT 16-/18-plex) and
    correction_matrix_deuterated for the deuterated channels (14 columns). A correction_matrix with one
    14-column row per channel, as stored in OpenMS 3.6.0 INI files, is still accepted.
  - FIX: pyOpenMS docstrings (#10599): the former pxd-to-nanobind generator attached every multi-line
    docstring to the method declared after it (getRT() read "Checks if retention time is set") and
    dropped blank lines and indentation, so examples, lists and :param:/:return: fields rendered as
    one paragraph. All such docstrings are reattributed and reformatted, docstrings lost by the shift
    are restored. The API docs list nanobind methods as methods, with signatures, instead of as
    attributes, and static methods no longer render as "<nanobind.nb_func object>".
  - FIX: pyOpenMS bindings that could not work (#10599): SimpleTSGXLMS and TheoreticalSpectrumGeneratorXLMS
    getLinearIonSpectrum()/getXLinkIonSpectrum() generated the spectrum of an empty peptide (or cross-link)
    instead of taking it as argument; they now take spectrum, peptide (or cross-link) and the other arguments
    of the C++ API. IsotopeLabelingMDVs calculateIsotopicPurity()/calculateMDVAccuracy() annotate the feature
    passed to them, like the C++ API, instead of a new empty one. PeptideIndexing.run() takes the FASTA file
    name instead of a FASTAContainer, which Python could not create. CachedMzMLHandler.getSpectraIndex(),
    getChromatogramIndex() and IndexedMzMLDecoder.findIndexListOffset() return int offsets instead of raw
    std::streampos objects. MZTrafoModel.getCoefficients() returns (intercept, slope, power) instead of
    filling float arguments, which Python cannot observe. Bound the nested types the signatures referred to
    but Python could not use (ConsensusFeature.Ratio, whose ratio value now defaults to 0 instead of being
    uninitialized, SignalToNoiseEstimatorMedianRapid.NoiseEstimator, SplineInterpolatedPeaks.Navigator,
    the IsotopeLabelingMDVs enums, ims Weights, FeatureFinderAlgorithmPickedHelperStructs_MassTrace) and
    DeltaMass.label_set. Removed what could not be called from Python: begin()/end() returning C++ iterators
    (MSExperiment, IsotopeDistribution, DeconvolvedSpectrum, PeakGroup), the initializer_list and std::list
    constructors, MascotGenericFile.store() to a C++ stream and MapToResidueType.val (now len()).
    OPXLHelper.buildCandidates returns cross-links that keep their peptides alive (they pointed into a freed
    copy of the peptide list) and checks the candidate indices it was given.
    Arguments of 64 methods got names, and the API docs show public names (pyopenms.X instead of
    pyopenms._pyopenms_kernel.X), property types, the DB singletons, and nested enums only once.
  - API: The ConsensusIDAlgorithm classes (Average, Best, Worst, Ranks, PEPMatrix, PEPIons, Identity,
    Similarity) are removed, also from pyOpenMS, together with the TOPP tool ConsensusID (see there).
    Identifications written by ConsensusID (search engine "OpenMS/ConsensusID_*") are still read, e.g. by
    PosteriorErrorProbabilityModel and the mzTab export (#10619).
  - FIX: FalseDiscoveryRate::applyBasic(ConsensusMap&) and both applyBasicPeptideLevel overloads mark
    the FDRs/q-values they write as lower-is-better. They kept the orientation of the PSM scores, so after
    a higher-is-better score filtering by q-value kept the worst hits. -psmFDR below 1 therefore removed
    the best PSMs - typically every target, failing with "No proteins left after FDR filtering" - in
    ProteomicsLFQ, MS1LabeledWorkflow and IsobaricWorkflow with Bayesian protein inference (which turns
    each PSM's PEP into a posterior probability) and in IsobaricWorkflow on a higher-is-better main
    score (e.g. a hyperscore). applyBasicPeptideLevel also sorts the hits of each identification and
    keeps only the best one and the hits tied with it whose peptide has a peptide FDR/q-value. The other
    hits had no FDR/q-value: they kept their search score under the new score type and were kept or
    dropped at random by a filter on it.

Dependencies:
  - OPENMS_CONTRIB_LIBS was removed, together with the contrib (OpenMS/contrib), after its
    deprecation in 3.6. Configuring with it stops with an error: add the prefix of the
    dependencies to CMAKE_PREFIX_PATH, or let vcpkg build them (cmake --preset
    <platform>-release). A build directory that still has it cached needs
    cmake -U OPENMS_CONTRIB_LIBS. find_package(OpenMS) no longer reads it either (#10327).
  - Every release ships a developer SDK archive per platform
    (OpenMS-SDK-<version>-<platform>.tar.gz, .zip on Windows) next to the installers:
    the core and CLI layers (OpenMS, OpenSwathAlgo, OpenMS_CLI) with their headers, the
    CMake package, share/OpenMS and the shared libraries those layers load, relocatable
    and without Qt or the GUI library. Point CMAKE_PREFIX_PATH at the extracted archive
    and use find_package(OpenMS CONFIG COMPONENTS CLI). The archive's README.txt lists the
    requirements (no Boost, MSVC Release /MD on Windows, Ubuntu 24.04 as the Linux
    baseline). The CI presets now build
    with WITH_ONNX=ON (ONNX Runtime from vcpkg), so the installers and the SDK include the
    PeptDeep classes, their ONNX models (share/OpenMS/models) and the ONNX Runtime library,
    which were not installed before (#10248).
  - vcpkg builds use OpenSSL 3.6.5 instead of 3.6.4, so the installers, the DEBs, the macOS
    package and the pyOpenMS wheels bundle it. 3.6.5 fixes the 13 advisories of 2026-09-29
    listed under 3.6.0's known issues, among them the High-severity CVE-2026-84782 (DTLS,
    which OpenMS does not use).
  - WITH_THERMO_RAW requires openms-thermo-bridge 1.0.0 (FetchContent, vcpkg overlay and
    find_package). ThermoRawFile reads each scan through its typed single-pass API (header,
    m/z-sorted peaks, charges and noise in one call) instead of per-scan JSON and separate
    peak and auxiliary-array calls; system or vcpkg installations of 0.x are no longer
    accepted (#10522). With noise_data, scans without a centroid stream (e.g. ion trap
    scans) no longer carry a "sampled noise m/z array" without intensities; the vendor
    returned the segmented scan masses there, not noise samples.

TOPP tools:
  New tools:
    - OpenDIA: high-level DIA workflow in one call: library preparation (prepared PQP/TSV/OSWPQ/TraML
      library or empirical transition list, mode chosen automatically from the presence of decoys),
      OpenSWATH extraction and scoring, in-process Percolator rescoring, peptide/protein/gene inference
      and export; peptidoform inference needs workflow:working_format sqlite. Intermediate files are
      removed on success unless workflow:keep_intermediate_files is set (#10373).
  Removed tools:
    - BREAKING: ConsensusID removed. Its default mode grouped identifications of different spectra by
      retention time and m/z, -per_spectrum by spectrum; no OpenMS workflow used either. OpenMS has no
      tool to combine the results of several search engines: pass the results of one engine to the
      quantification workflows. Conflicting identifications of one feature are resolved with
      IDConflictResolver or FileFilter (-id:keep_best_score_id), as before (#10619).
  Changes:
    ProteomicsLFQ:
      - With -pip_echo true and -proteinFDR 1 (no protein filter), PIP-ECHO transfers a precursor only if its best
        identification over all runs has a q-value <= 0.001 (PipEchoAlgorithm parameter donor_max_q).
    ConsensusMapNormalizer:
      - New -algorithm_type rt_local (options rt_local:*): per-map normalization with an offset that varies with
        retention time (see ConsensusMapNormalizerAlgorithmRTLocal). -accession_filter and -description_filter
        restrict the reference features as for 'median'.
    NucleicAcidSearchEngine:
      - Resolve interleaved ambiguity variants within their original precursor/source hypotheses, record current cached-digest search parameters, and produce finite LFQ retention times. Exact cutoff tie retention is unchanged; exported ties now follow the shared library value order.
      - Enumerate cleavage-blocking RNA modifications during digestion, apply fixed internal modifications
        before cleavage, preserve terminal candidate hypotheses, and expose coordinate-bearing RNase
        products in pyOpenMS.
      - PARAM: New scoring:method (hyperscore, mvh) with MVH options (scoring:num_intensity_classes,
        scoring:tic_fraction, scoring:single_peak_credit), scoring:use_mass_accuracy,
        scoring:blacklist_tolerance (ion blacklist) and report:require_coverage (minimum fraction of
        internal positions covered by fragment ions) (#10526).
      - PARAM: New configurable MS2 preprocessing: preprocessing:deisotoping (legacy, none, flash), the
        WindowMower and NLargest filters (preprocessing:window_mower:*, preprocessing:nlargest:n),
        precursor peak removal, and out_preprocessed to write the preprocessed spectra.
        preprocessing:window_mower:movetype 'jump' reproduces the historical preprocessing (#10526).
      - PARAM: New preprocessing:deisotoping flash: FLASHDeconv RNA averagine isotope detection of
        fragment spectra (preprocessing:flash:min_cos, preprocessing:flash:min_snr; requires a ppm
        fragment tolerance) (#10531).
      - PARAM: New precursor:correct_with_flash infers the monoisotopic precursor m/z of each MS2 from
        the complete parent MS1 with FLASH RNA (precursor:flash:mass_tolerance, min_cos, min_snr);
        out_precursor_corrections writes an audit table (#10532).
      - PARAM: New report:precursor_percentage reports the strongest peak in the precursor window as a
        percentage of the raw MS2 base peak intensity (report:precursor_percentage_mass_tolerance and
        _unit) (#10530).
      - PARAM: New bedrmod_out exports RNA modification sites as a bedRMod v2 track
        (bedrmod_chebi_mapping, bedrmod:* reference metadata) (#10529).
    All tools:
      - FIX: CometAdapter, ProteomicsLFQ, IsobaricWorkflow and the OpenSWATH tools reject Bruker MALDI imaging .d
        input, as FileConverter and the tools reading through FileHandler do. PeakPickerIM, which reads raw frames
        by default (-bruker:export_mode frame), still reads their frames, without pixel positions; with
        -bruker:export_mode auto it rejects them (#10596).
      - FIX: -debug activates console debug logging in the main thread even when its
        thread-local logger was initialized before parameter parsing. Debug levels from INI
        files also take effect. A subsequent run in the same process removes the console
        destination from both the global configuration and the current thread before it parses
        its command line, and adds it again only if its debug level is above 0 (#10478).
      - FIX: '-write_cwl' and '-write_nested_cwl' no longer abort every TOPP tool in builds without
        CWL support (ENABLE_TDL=OFF, the default). They report that the build lacks it and exit with
        ILLEGAL_PARAMETERS, without leaving an empty <Tool>.cwl behind. ParamCWLFile throws OpenMS
        exceptions (NotImplemented, UnableToCreateFile) instead of std ones and has isSupported()
        (#10459).
    FileConverter:
      - New option -bruker:load_ms2: 'false' skips the MS2 spectra of a Bruker .d (MS1-only conversion),
        the counterpart of -bruker:load_ms1.
      - -process_lowmemory also works for Bruker .d input (to mzML; before: an error). The spectra are
        written as they are read, and the mzML file is the one the conversion in memory gives. A 110 min
        ddaPASEF run (5.6 GB .d, 1.9 billion peaks) converts in under 5 minutes with 170 MB of heap memory
        (the resident memory, 4.8 GB at its peak, is the memory-mapped analysis.tdf_bin).
      - FIX: -force_TPP_compatibility had no effect with -process_lowmemory (mzML output from mzML, mzXML,
        Thermo .raw and now Bruker .d input).
      - -process_lowmemory also converts Bruker .d input to cachedMzML (before: an error); the spectra go to
        the cache as they are read, and both files are those of the conversion in memory.
      - FIX: Bruker MALDI imaging .d input is rejected (exit code INCOMPATIBLE_INPUT_DATA), as by
        FileHandler::loadExperiment(); it was read as DDA-PASEF data, without its pixel geometry. This covers
        zipped imaging runs (.d.zip) as well (#10596).
      - FIX: Bruker .d input without DDA-PASEF precursors (e.g. MS1-only MALDI runs) converts to its MS1 spectra;
        the tool aborted (exit code 134), and with -process_lowmemory left an empty output file behind (#10597).
    MS1LabeledWorkflow:
      - FIX: identifications were mapped onto a multiplet only within id_mapping:rt_tolerance (5 s) of
        its apex and by their precursor m/z, so MS2 spectra acquired off the apex, and every spectrum
        whose precursor was picked on another isotope (accepted by searches with isotope error
        correction), stayed unassigned. They are now matched against the elution region of the
        multiplet's channels (their mass traces, plus the tolerances), and id_mapping:mz_reference
        defaults to 'peptide': the theoretical m/z of the identified, labelled peptidoform. The
        channel of a spectrum match is the one closest to that m/z, too (an off-isotope precursor
        could be closer to another channel and turn the multiplet into a conflict).
      - FIX: of several identifications on a multiplet, those whose labels agree with its mass shifts
        are preferred; a better-scoring one that contradicts them (e.g. a co-isolated peptide) made
        the whole multiplet a quant/ID conflict.
      - PARAM: algorithm:knock_out defaults to 'true': partial multiplets (e.g. a peptide seen in the
        heavy channel only, or whose weaker channels fail the detection's filters) are quantified;
        before, every multiplet with an undetected channel was dropped. Partial multiplets that only
        flank a larger multiplet of the same peptide are merged into it. Supported for up to four
        channels. -match_between_runs can be combined with it (only complete unidentified
        multiplets are kept).
      - PARAM: new -requantify (default 'true'): a channel the detection did not find is measured at
        its expected position over the elution region of the multiplet, relative to its most intense
        detected channel (like MaxQuant's re-quantify), and reported as absent only if it shows no
        signal there. An identification of such a channel (e.g. the minor channel of a mixture, which
        DDA fragments as well) joins the multiplet detected in the peptide's other channels.
      - On a synthetic triple SILAC run (120 peptides; complete, partial and weak 1:0.15:0.15
        multiplets; MS2 over the whole elution, precursors partly on M+1..M+3) 119 peptides are
        quantified with the exact channel ratios. The previous per-run chain (apex mapping on precursor
        m/z, complete multiplets only) quantified 27, i.e. not even half of the 60 complete ones.
    IsobaricWorkflow:
      - -in also accepts Thermo .raw (if built WITH_THERMO_RAW) and Bruker timsTOF .d (if built
        WITH_OPENTIMS) runs, read natively like in IsobaricAnalyzer; mzML input is unchanged. The
        experimental design names the runs with their extension (e.g. run1.raw).
      - FIX: no longer crashes while printing reporter statistics when a channel has no
        reporter signal at all.
    MapAlignerPoseClustering:
      - PARAM: new algorithm:peak_selection:* parameters for mzML input. The new default
        'algorithm:peak_selection:method' 'spread' aligns one MS1 peak per analyte, spread over RT and
        m/z, instead of the most intense MS1 peaks, so mzML alignments change; 'intensity' selects the
        most intense peaks as before. The other parameters (rt_window, mz_tolerance, max_charge, rt_bins,
        mz_bins) tune 'spread'. featureXML input does not use them, but is now aligned on its most
        intense features instead of the first ones (see OpenMS Library).
    ProSE:
      - PARAM: Percolator rescoring runs in-process (OpenMS' built-in Percolator, the default
        backend of PercolatorAdapter) and is ON by default, with the new parameter -Search:rescore
        (default true; behaviour change: Percolator q-values are the scores of the output, and the
        FDR filters use them). -Search:rescore false restores the previous output (ProSE's own
        scores). The flag -rescore of earlier 3.7.0 development versions is removed in favour of the
        parameter; an INI file written by such a version carries the flag's value over to
        Search:rescore when it is updated, so with the flag off it keeps rescoring off (INI files of
        earlier releases get the default). The parameter
        -percolator_executable is removed: ProSE no longer starts PercolatorAdapter (and with it the
        percolator executable) for every input file. Each input file is still rescored on its own;
        a file with fewer than 100 PSMs or without decoys, or for which Percolator fails, keeps its
        HyperScores with a warning. ProSE also warns for a file whose learned Percolator model the
        sanity check replaced by the best single feature (e.g. a blank run). With -out_merged, input files of which only some were rescored
        are not merged: ProSE writes the per-file outputs and exits with an error
        (INCOMPATIBLE_INPUT_DATA). A merged idXML that cannot be written now also fails the run
        (CANNOT_WRITE_OUTPUT_FILE); before, ProSE logged the error and exited successfully.
      - PARAM: Search:peptdeep:enable (default false) adds five features per PSM from
        AlphaPeptDeep predictions of its peptide, used by Search:rescore and written to -out_pin:
        ms2_cosine, ms2_spectral_angle, ms2_pearson and ms2_frac_pred_found compare predicted
        with annotated fragment intensities (Search:annotate:PSM must keep fragment annotations,
        as its default ALL does), rt_abs_error compares the observed with the predicted retention
        time after a per-run calibration. The collision energy is chosen per run from the data
        unless Search:peptdeep:nce is set. Needs a build with WITH_ONNX=ON (the installers are)
        and the models in share/OpenMS/models, or Search:peptdeep:ms2_model and rt_model.
        It fails when OpenMS was built without ONNX, a model is missing or cannot be loaded, or
        no PSM received predicted features. On success it logs '[PeptDeepRescoring] Predicted
        features added: N / M PSMs (<features>), NCE=<nce>'. On the 20-file suite of #10364
        (10 hits per spectrum) it gave 5.7% more PSMs at 1% FDR for 3.4 times the search CPU
        time (#9975).
      - FIX: -out_pin holds the PSMs before any FDR filter. With Search:FDR:PSM, the .pin had only the
        PSMs that passed, with q-values as score; with one input and Search:FDR:protein, it had no
        decoys, so Percolator could not use it. The search now also hands back the PSMs before
        FDR:PSM (ProSEAlgorithm::setKeepPreFdrPsms), and the .pin is written from them before the
        protein FDR. It is the input of a later rescoring, so with Search:rescore (the default) it also
        holds the PSMs before the rescoring: ProSE's own scores, all reported hits and the decoys. The
        other outputs do not change.
    FileConverter:
      - PARAM: Thermo .raw input (in-process reader) no longer records the SHA-1 of the raw file by
        default, which cost a second read of the whole file (5-15% of the conversion time); the new
        flag -raw_checksum restores it. Without it the mzML sourceFile has an empty SHA-1 (#10522).
      - -process_lowmemory streams Thermo .raw input (in-process reader) scan by scan into mzML and
        cachedMzML outputs in constant memory; it was ignored for .raw before. Other output types
        still load the file into memory (with a warning) (#10522).
      - Spectra (e.g. mzML) can no longer be converted to consensusXML or consensusparquet: each peak
        became a consensus feature. The tool exits with an error (INCOMPATIBLE_INPUT_DATA) before loading
        the input (#10520).
    OpenSwathWorkflow:
      - Thermo .raw input is streamed into the SWATH maps instead of being loaded completely and
        copied, and the full map is no longer kept alive as run metadata; -out_qc (SwathQC) now also
        receives the spectra of .raw input (#10522).
      - -readOptions onDisc for indexed mzML and Thermo .raw input reads the spectra of each SWATH window from the file
        during extraction instead of holding them in memory; results are identical to 'normal'.
        Input with more than one FAIMS compensation voltage is rejected (#10522).
      - FIX (also OpenDIA): with -out_chrom .xic, an error while writing the Parquet file (e.g. a full disk) was
        only logged, and the tool exited with 0 and a missing or truncated .xic file. The run now fails.
    SageAdapter, CometAdapter:
      - Thermo .raw input is streamed into the temporary mzML instead of being loaded into memory (#10522).
    IDFileConverter:
      - TSV import: the hits of a line get their rank as score (score type 'rank', lower is
        better) instead of no score.
    UniPEFF:
      - Without -dbversion, '# DbVersion=' takes the download date UniProt puts into its
        file names, e.g. 2025_07_05 for uniprotkb_proteome_UP000005640_2025_07_05.xml.gz,
        and stays 'unknown' if the input file name has none. -dbversion now defaults to empty.
    ProteomicsLFQ:
      - FIX: Features that FeatureFinderIdentification reports at the same charge, RT and m/z (one
        signal targeted once per positional isomer, e.g. when the HCD and ETD scans of a precursor
        localize a phosphosite differently) are merged before ID conflict resolution. The signal was
        quantified once per isomer, and copies whose identifications failed the PSM FDR filter became
        identical unidentified consensus features, which made -out_qpx fail with duplicate QPX
        feature rows.
      - The RT tolerance of linking (QT linking, and the global RT window of PIP-ECHO) is
        sized from the 95th percentile of the RT differences of the alignment points after alignment
        (the largest over the runs) instead of their maximum, and no longer has a 2-minute minimum.
        A few outlying points decided the maximum: on the ProteoBench DDA ion module (QExactive, 6 runs,
        2 h gradients) the tolerance was +-20 min, and match-between-runs without PIP-ECHO raised the
        median absolute E. coli fold-change error from 0.41 (identified only) to 0.62. With the 95th
        percentile the tolerance is +-74 s, and match-between-runs adds 4,600 precursors (42,322 to
        46,929) at the accuracy of identified only (median error 0.221, E. coli 0.41).
      - FIX: -Alignment:model_type and -Alignment:model:<type>:* were ignored: the RT transformations
        were always B-splines with default parameters. They now select the RT model and its parameters.
        The second, unused switch -Alignment:model:type is removed; use -Alignment:model_type.
      - FIX: -feat_dir checkpoints record -protein_quantification. Detection keeps the peptide
        uniqueness annotation that strictly_unique_peptides filters on only in that mode, so a
        strict combine accepted checkpoints detected in another mode and then dropped the peptide
        hits lacking it (all of them, ending in "No protein is supported by a strictly unique
        peptide"). Such a combine is now refused and names the setting; detecting and combining
        runs have to use the same -protein_quantification (#10481, #10486).
      - FIX: ignored its Seeding:charge and Seeding:traceRTTolerance settings: since the seeding
        code moved to DDAWorkflowCommons the call passed a fixed charge range of 2:5 and the helper
        used a fixed RT band of 3 s. Both settings take effect again; the defaults are unchanged,
        so results with default parameters stay the same (#10300).
    FileInfo:
      - FIX: a duplicate FASTA header or sequence was not reported when an entry in between had the
        same std::hash value; each hash now keeps all of its entries (#10499).
      - FIX: the consensusXML statistics (-s) for qualities were computed over twice the number of
        consensus features, half of the values zero; they now cover each feature once (#10498).
      - FIX: crashed on an idXML or mzIdentML with a peptide identification without hits; such
        spectra are now skipped as unidentified (#10497).
      - FIX: the consensusXML peptide-per-map counts indexed a vector of map positions with map ids,
        which wrote out of bounds (or crashed) and miscounted when map ids are not 0..n-1; the
        counts are now kept per map id (#10496).
    QualityControl:
      - FIX: The identifications of a feature are sorted best first according to their score
        direction. Lower-is-better scores (q-value, PEP, E-value) put the worst identification
        first, which the MaxQuant-compatible evidence.txt and msms.txt took as the feature's best
        hit (wrong Type, MS/MS Count and best-hit columns), and -out_feat listed it first.
        Identifications without hits are sorted last instead of being read past their end. The
        identifications that ID conflict resolution removes from a consensus feature are now
        listed best first among the unassigned ones (-out_cm, PSM section of -out).
    PeptideIndexer:
      - PeptideIndexer evaluates enzyme specificity on the original protein sequence again, instead
        of the I/L-substituted one used for matching. With '-IL_equivalent', every 'L' (and 'J') in
        the database was replaced by 'I' before the cleavage sites were determined, which silently
        dropped valid hits for enzymes that cleave after 'L' but not after 'I' (Chymotrypsin,
        Chymotrypsin/P, TrypChymo, PepsinA, PepsinA + P, leukocyte elastase and
        elastase-trypsin-chymotrypsin). The reported flanking residues ('aa_before'/'aa_after')
        likewise come from the original sequence, so an 'L' or 'J' next to a peptide is no longer
        reported as 'I'. The former hard error rejecting '-IL_equivalent' for three of those enzymes
        was removed; it did not cover the other four and never triggered for the default
        'enzyme:name=auto', where the enzyme is taken from the idXML (#1793).
      - The cleavage rule of 'elastase-trypsin-chymotrypsin' now includes 'J', matching its own
        description ("cuts after A,L,I(or J),V,K,R,W,F,Y") and the six other enzymes that cleave
        after I/L. It was the only one omitting 'J', so a peptide preceded by 'J' in the database
        was rejected as non-specific. This was previously masked with '-IL_equivalent', which
        rewrote 'J' to 'I' before the cleavage sites were determined (#1793).

Build System:
  - Installing with WITH_ONNX=ON also installs the versioned files and symlinks of ONNX Runtime
    (libonnxruntime.so.1, libonnxruntime.1.dylib, ...) next to libonnxruntime.so/.dylib. Before, a
    non-vcpkg ONNX Runtime left a dangling unversioned symlink and no SONAME file, so an installed
    libOpenMS could not load ONNX Runtime (#10465).
  - Docker images (dockerfiles/Dockerfile) are built with WITH_ONNX=ON against a pinned ONNX
    Runtime release and ship libonnxruntime and the PeptDeep models (amd64 and arm64).
  - Debian package: for each library package that Debian and Ubuntu 24.04 renamed in the
    64-bit time_t transition, Depends also accepts the package under its old name.
    dpkg-shlibdeps names the packages of the build host (libqt6gui6t64 (>= 6.4.0)); a
    CPack post-build script adds the old name with the same version constraint as an
    alternative (| libqt6gui6 (>= 6.4.0)) wherever the renamed package provides it, i.e.
    on amd64 and arm64. Later releases went back to the old names for most Qt libraries
    (libqt6gui6, libqt6widgets6, libqt6opengl6, libqt6openglwidgets6 in Debian 13 and
    Ubuntu 25.10 and 26.04), so the package built on Ubuntu 24.04 now installs there too
    (#10351). It still requires the glibc of the release it is built on, currently 2.38,
    so not Ubuntu 22.04 or Debian 12 (#10352, #10367).
  - Source tarball: the Release workflow packs it with git archive, so it holds exactly the
    tracked files. The 3.6.0 tarball lacked src/tests/topp/THIRDPARTY/ and a few other files,
    and carried empty .git/, build/, THIRDPARTY/ and vcpkg/ directories. git archive fills in
    .git_archival.txt, from which CMake takes the commit, so a build from the source tarball of
    a release (or from GitHub's source archive of its tag) reports the plain version instead of
    <version>-pre-exported-<date> (#10359).
  - The macOS package puts TOPPView, TOPPAS and INIFileEditor into the folder of the version
    being installed. pkgbuild marks app bundles relocatable by default, so the installer
    updated an app with the same bundle identifier wherever it found one, such as in an older
    OpenMS or in a build tree, and left the new folder without it. The package now gives
    pkgbuild a component plist that turns relocation off; the BundleIsRelocatable key in the
    apps' Info.plist, which pkgbuild does not read, is gone (#8477, #8479).
  - macOS package and SDK: built with OpenMP. CI and the Release workflow found no OpenMP
    runtime on macOS and fell back to -fopenmp-simd, which compiles out every
    '#pragma omp parallel', so the 3.6.0 package ran single-threaded and '-threads' had no
    effect. tools/ci/deps-macos.sh installs Homebrew's libomp, the macOS presets set
    OpenMP_ROOT to /opt/homebrew/opt/libomp, and the package bundles libomp.dylib and its
    license. The new option MT_REQUIRE_OPENMP, which the CI presets set, makes the
    configuration fail instead of falling back. The package and the SDK install omp.h with
    the headers, and find_package(OpenMS) points FindOpenMP at the bundled runtime, so that
    a program built against them does not load a second libomp (#10326).
  - Third-party licenses: the packages now ship the license texts of every library they
    bundle.
    - macOS: share/OpenMS/LICENSES/homebrew lacked glib, harfbuzz and pcre2, and in some
      nightlies libpng, whose libraries the package bundles with Qt. 'brew deps --installed'
      left out the dependencies that 'brew install qtbase' had upgraded in the same run; the
      formulae that Qt and libomp declare as dependencies are now collected as well.
    - DEB: libgfortran, which vcpkg's LAPACK needs, comes from the build machine's
      libgfortran5 and had no license. Libraries the package takes from the build machine's
      distribution now come with the copyright file of their Debian package and the
      /usr/share/common-licenses texts it refers to, in share/OpenMS/LICENSES/system, with an
      INDEX.txt that names the package, version and source package of each (#10442).

TOPP tools:
    IDFileConverter:
      - FIX: idXML input with -mz_file records the mzML in the runs' 'spectra_data' unless
        -no_spectra_data_override is set, as documented; it was left unchanged.
    IsobaricWorkflow:
      - FIX: The precursor purity uses -extraction:precursor_isotope_deviation (default 10 ppm)
        for the isotope match and the fuzzy border of the isolation window. The value was passed
        through a bool parameter, so any setting other than 0 became 1 ppm (#10448).
    MaRaClusterAdapter:
      - FIX: With several -id_in files, the PSMs of each idXML get their cluster_id and file_origin
        from the mzML at the same position; all of them were looked up in the first mzML. More
        -id_in than -in files are rejected.
    PercolatorAdapter:
      - FIX: With several -in files, the pin ScanNr is the scan number again (it was the input file
        index) and spectrum references keep their native IDs. Inputs are told apart by file_origin:
        Percolator identifies a spectrum by spectrum file, scan number and precursor m/z (e.g. for
        -post_processing_tdc), so the in-process backend numbers the spectrum files, and a pin file
        with PSMs of several files has a FileName column (PercolatorInfile::getFileIdentifier). In the
        pin SpecId, a '|' now separates the id_merge_index of a PSM from its file origin.
    ProSE:
      - BREAKING: low_memory replaces snes_enabled. For non-specific searches, low_memory=true indexes the
        peptide masses, as the prefixes of one mother peptide per protein position, instead of the fragments
        of every peptidoform, and generates the fragments of the peptidoforms in the precursor window at query
        time. It finds the candidates of the fragment index, with the same numbers of matched fragments. SNES,
        which it replaces, ranked and filtered its candidates (fragment:min_matched_ions,
        scoring:max_candidates_per_spectrum) by the matches of one ion series of a whole mother peptide (b ions or
        y ions), without the shifts of variable modifications, and found them through the terminal ion at the
        precursor mass, which is not indexed above fragment:max_mz. In an immunopeptidomics benchmark (36 runs,
        human database) SNES found 15-31% fewer peptides than the fragment index, a third of the oxidized ones,
        almost no class II peptide of 18-29 residues, and searched 7-46 times as long. With low_memory, the
        identifications equal those of the fragment index (HepG2 immunopeptidome, every spectrum) at 1/3 to 1/14
        of its peak memory, with a 4-12 times faster search than SNES, but still 6-30 times the search time of the
        fragment index. Unlike SNES, it supports calibration, ions:electron_ions, any ion series and
        peptide:deduplicate.
      - The PSM meta value isotope_error is observed minus theoretical precursor mass in 13C spacings
        (+1: the first 13C isotope peak was selected), as in MS-GF+, pepXML and Sage and as
        PercolatorInfile/PercolatorAdapter expect; ProSE wrote the opposite sign, so -out_pin,
        -percolator_executable and PercolatorAdapter doubled the isotope offset in dm/absdm instead
        of removing it. The search parameters record isotope_error_convention=observed_minus_theoretical;
        the new report:isotope_error_convention=theoretical_minus_observed writes the previous sign
        (and no record). precursor:isotope_error_min/max keep their meaning. PercolatorAdapter warns
        about ProSE input without the record.
      - BREAKING: precursor:isotopes was removed. It was never used (the searched isotope errors are
        precursor:isotope_error_min/max); ini files that still set it are rejected as outdated: remove
        the item or update them with INIUpdater.
      - Fixed terminal modifications: see FragmentIndex above (an invalid one stops ProSE when the
        parameters are set). A warning names the variable modifications that a fixed one excludes (on
        the terminus or on the residue).
      - A warning when decoys=auto reuses the database's decoys with peptide:clip_nterm_methionine and
        they start with M much less often than the targets (e.g. fully reversed decoys), because
        clipping then enlarges the target search space only.
      - FIX: the MS2 preprocessing filters are per thread (they were shared between threads).
      - FIX: The MS2 intensity cutoff applied before normalization removes only peaks without
        intensity (zero or negative). It was the ThresholdMower default of 0.05 absolute, which
        deleted real peaks from intensity-scaled input such as spectra normalized to a base peak of 1.
      - FIX: MS2 deisotoping (high-resolution fragments) requires isotope intensities to fall from the
        monoisotopic peak. A small peak one isotope spacing below a fragment ion was taken as the
        envelope's monoisotopic peak, and the ion was removed as its isotope. Every TMT/TMTpro-labelled
        fragment has such a peak from the reagent's isotope impurity, so labelled searches lost a fifth
        of their matchable fragment peaks; dense Orbitrap Astral and timsTOF spectra lost about 5%.
      - New peptide:deduplicate=true (the default) indexes each exact modified peptide once before
        candidate selection. A peptide that occurs in several proteins used to take one candidate slot
        per occurrence, so the runner-up was often the same peptide (delta score 0) and the candidate
        pool statistics counted copies. Protein mappings and target/decoy labels are recovered against
        the complete database as before. Chunked searches score each peptide/charge/isotope hypothesis
        once across chunks; keeping the queried keys adds memory per spectrum. Peptide-mass indices
        (low_memory) deduplicate the candidates of a spectrum instead. Set false for the
        previous occurrence-based candidates. FragmentIndex keeps false as its own default.
      - New scoring:fragment_charges (auto, single, multiple). Candidates were scored against singly
        charged fragments only, also when the spectra are not deisotoped and keep multiply charged
        fragments at their own m/z, as in ion-trap CID. 'auto', the default, scores charges up to
        min(precursor charge - 1, fragment:max_charge) for spectra that are not deisotoped and charge 1
        for deisotoped (high-resolution) spectra, whose results do not change. The calibration pass and
        the peak annotations use the same charges; the ion-count fractions divide by the number of
        charges scored.
      - New scoring:method (auto, hyperscore, mass_accuracy) and scoring:mass_error_sd (7 ppm).
        'mass_accuracy' weights each matched fragment's share of HyperScore's ion counts and intensity
        product by a Gaussian of its mass error, so that a match at the edge of the tolerance counts
        less than one at the theoretical m/z; exact matches score as HyperScore, and matching
        tolerances and candidates do not change. 'auto', the default, uses it for fragment tolerances
        in ppm up to 100 ppm and HyperScore otherwise, so low-resolution (Da) searches do not change.
        The calibration pass scores the same way. Search results record the method when it is used;
        the score type stays 'ln(hyperscore)'.
      - New FDR:PSM_groups (scored_charges, pooled). FDR:PSM computes q-values separately for PSMs
        scored with different numbers of fragment charges ('scored_charges', the default). Since
        scoring:fragment_charges scores 2+ fragments of precursors of charge 3 and above in spectra
        that are not deisotoped, their HyperScores are larger for targets and decoys alike, and one
        pooled competition left fewer charge-2 PSMs below the threshold. High-resolution searches
        score charge-1 fragments only and form one group, as before.
      - MS2 deisotoping uses a Sage-like envelope rule, with three new advanced parameters: two isotope
        peaks make an envelope (fragment:deisotope_min_peaks=2; 3 before), the monoisotopic peak carries
        the envelope's summed intensity (fragment:deisotope_sum_intensity=true), and charges are tried up
        to the precursor charge, at most 3 (fragment:deisotope_charge_cap=precursor; 1-3 for every
        spectrum before). Only high-resolution (deisotoped) searches change; 3 / none / false restores
        the earlier output. It gave more PSMs after Percolator on high-resolution Orbitrap data, but fewer
        PSMs after native-score FDR pooled over precursor charges (FDR:PSM, FalseDiscoveryRate) on
        timsTOF data (on two files, although each precursor charge on its own gained). The search
        parameters of the idXML output record the three settings.
      - New fragment:query_spectrum (auto, raw, processed). 'raw' retrieves candidates from the fragment
        index with all positive-intensity peaks, before deisotoping and local/top-N peak filtering, also
        in the calibration pass; scoring still uses the processed peak list. More spectra get
        candidates, notably on dense high-resolution spectra. 'auto', the default, uses 'raw' for
        high-resolution fragment tolerances (<= 0.1 Da / <= 100 ppm) and 'processed', the previous
        retrieval, otherwise: at low resolution the unfiltered peaks crowd out the correct candidates.
      - New annotate:local_fragment_evidence (default true): adds chance_match_surprise (local
        peak-density surprise of the matched fragments) and mass_competition_evidence (matches
        discounted by alternative intact and neutral-loss assignments) as annotations and Percolator
        features. Computed on the peak list before local/top-N filtering; candidates and native scores
        do not change.
      - PERF: faster searches with unchanged output: the fragment index bins fragments by m/z instead
        of sorting them globally and writes them straight into their bins; regex-free digestion; a
        multi-threaded peptide sort that reproduces std::sort exactly; one bucket walk for all precursor
        isotope errors, with skip tables and prefetching; PSM meta value keys resolved once; flat-storage
        Da alignment for the peak annotation; the mzML is read while the fragment index is built; parallel
        FASTA reading and index release, no database copy. peptide:deduplicate is evaluated inside the
        index build.
      - New annotate:self_trained_ion_priors (on by default) learns per-run fragment ion likelihoods from
        the confident target PSMs of each file (target-decoy competition q <= annotate:ion_prior_train_fdr
        of the native score), with their reversed sequences on the same spectra as noise model: presence,
        intensity rank among all peaks before the window and top-N filters, and mass error, per ion
        series, precursor and fragment charge, position, cleavage-site residues and complementary-ion
        presence (annotate:ion_prior_model rich; basic as in the self-trained ion priors of #10378). The
        spectra are split into two halves by scan parity and every PSM is scored by the model of the
        other half, so no PSM is scored by a model that saw its spectrum or its label. Adds the
        Percolator features ion_prior_llr and ion_prior_explained (annotate:ion_prior_features) to every
        hit; native scores and candidates are unchanged. Files with fewer than annotate:ion_prior_min_psms
        confident PSMs in either half get zeros and a warning; target-only searches (decoys=ignore) get
        nothing. The search parameters record the annotate:ion_prior_* settings and the training set
        (ion_prior:*). The model is the new FragmentIonLikelihoodModel class.
      - FIX: With multiple-charge fragment scoring and an unknown precursor charge (0), the peak
        annotations covered only singly charged fragments. They now use the charge each hit reports
        and was scored (#10398).
      - New peptide:protein_mapping (index, PeptideIndexing): the hits are mapped to their proteins from the digest of
        the fragment index, which knows every protein occurrence of a candidate, instead of searching every hit in the
        whole database (PeptideIndexing). Peptide evidences, target_decoy, protein_references, the protein hits and the
        PeptideIndexer:* search parameters are the same; PeptideIndexing still runs where the index cannot reproduce it
        exactly (low_memory, a specificity other than full, protein-terminal modifications, a chunked
        database, and databases with symbols other than letters, with stretches of X, or with more spans over ambiguous residues than a lookup
        budget allows, which is decided by counting them before any lookup). Together with the post-processing below,
        this shortens the search.
      - The PSMs are annotated in per-spectrum slots (no lock, no sort afterwards), and the decoy marker of large
        databases is detected with up to 8 threads. Results are unchanged.
    SimpleSearchEngine:
      - FIX: MS2 deisotoping (high-resolution fragments) requires isotope intensities to fall from the
        monoisotopic peak, as in ProSE (#10391). A small peak one isotope spacing below a fragment ion
        was taken as the envelope's monoisotopic peak, and the ion was removed as its isotope. On a
        TMTpro Orbitrap Eclipse run (PXD061985) this removed 9.5% of the matched b/y ions of
        identified spectra; PSMs at 1% FDR rose by 8% with the fix, and by 3% on a label-free run.
    OpenDIA:
      - New workflow:library_mode=predicted (also chosen by 'auto' when -tr is a FASTA database):
        digests the FASTA (PeptideQueryParameters:LibraryPrediction:*: enzyme, missed cleavages,
        peptide length, variable modifications, precursor charges), predicts RT, MS2 and optionally
        CCS (as 1/K0) with the native PeptDeep ONNX models (requires WITH_ONNX=ON), and continues
        through the same assay preparation, decoy generation, extraction, rescoring, inference and
        export as an empirical library. LibraryPrediction:out keeps the generated target/decoy PQP
        for reuse; FASTA entries carrying the decoy tag are skipped (#10383).

------------------------------------------------------------------------------------------
----                                OpenMS 3.6.0     (Released September 2026)        ----
------------------------------------------------------------------------------------------

OpenMS 3.6.0 is a substantial release and an important step toward our next major version. It addresses many feature requests, 
including extended support for ion mobility (FAIMS and PASEF), arrow and parquet support, and new nanobind-based pyOpenMS bindings that enable more Pythonic and faster code. 
A restructured build system now supports building OpenMS with vcpkg, replacing the deprecated contrib repository. 
These are just a few of the many improvements in this release.

General:
  - DOC: Explicitly enable pre-release upgrades in the pyOpenMS nightly installation instructions.
  - FIX: Normalize source-file paths when converting them to file URIs, including Windows paths with mixed separators (#10275)
  - Updated the bundled PSI-MS controlled vocabulary from 4.1.155 to 4.2.2, including CV
    term-name changes in mzML/TraML output and vocabulary versions in mzTab-M/mzQC output
    (#8691)
  - New native readers for Bruker timsTOF .d and Thermo .raw, which FileConverter and many other
    tools use, and for imzML (library and pyOpenMS) and Bruker MALDI imaging (library only); no
    TOPP tool reads imaging data yet. See OpenMS Library for capabilities and runtime requirements.
  - New .idparquet, .featureparquet and .consensusparquet directory formats for native
    identification, feature and consensus-map storage, supported across TOPP tools
    (#9225, #9232, #9236, #9237, #9241, #9242, #9396, #9405).
  - New: modification definition records let a tool register a named, non-vocabulary modification (an
    Id, formula and site not shipped in unimod.xml/PSI-MOD/XLMOD) so that files naming it stay readable
    by another process. ResidueModification::toDefinitionString()/fromDefinitionString() (de)serialise
    one record; ModificationsDB::registerDefinition()/hasDefinedModification() register and query them;
    the new ModificationDefinitionIO class collects the definitions a run's identifications, features or
    consensus elements reference and attaches them to ProteinIdentification::SearchParameters under the
    "modification_definitions" meta value. ResidueModification::Provenance (DEFINED/CV/MASS_ONLY) records
    where a modification's description came from. idXML, featureXML, consensusXML and the
    .idparquet/.featureparquet/.consensusparquet bundles all carry the definitions their peptidoforms
    reference and register them before parsing any sequence; ProForma writes a tool-defined modification
    as its chemistry plus an INFO: name (e.g. "[Formula:C9H11N2O8P1|INFO:NuXL:U-H2O]") so a reader
    without the definition still gets the right mass, and resolves the name first when it is registered.
    OpenNuXL is the first consumer (see OpenNuXL below). BREAKING: an idXML, featureXML or consensusXML
    file naming such a modification is a hard load failure ("Cannot convert string to peptide modification")
    in an OpenMS build without this support (#10003, #10026, #10028, #10036, #10037, #10038, #10039, #10040)
  - Transparent .zip input for the XML formats (except mzIdentML) and Bruker .d directories;
    mzML, mzXML, mzData, featureXML, consensusXML, traML and mzIdentML output is compressed
    with gzip or bzip2 when the file name ends in .gz or .bz2, in any letter case. TOPP tools
    refuse a compressed output name for any other format (#7560, #9139, #9259, #10317).
  - BREAKING: OpenMS::String/StringView replaced by std::string/std::string_view;
    StringList is std::vector<std::string>. Use OpenMS::StringUtils free functions for
    conversion, splitting, trimming and substitution. String, StringConversions and
    StringUtilsSimple shim headers were removed (#9450, #9468). "Migrating from
    OpenMS::String" in the developer documentation lists the replacement for each member
    of String and the changes the compiler does not catch.
  - Core modularization reduces dependencies between KERNEL, FORMAT, PROCESSING,
    APPLICATIONS and QC. Shared utilities cover spectrum-type estimation, resampling,
    alignment defaults, filename recognition, ion-mobility metadata and data-processing
    provenance; compatibility entry points remain unless listed below (#10083, #10092,
    #10101). Include used types directly instead of relying on transitive headers;
    ToolInfo moved to DATASTRUCTURES/ToolInfo.h (#8946, #10083).
  - Shared-data lookup uses the compiled-in path, then the executable location, then
    OPENMS_DATA_PATH, preventing stale installations from overriding bundled resources.
    Missing-file errors identify the resolved directory (#9635, #9636, #9650).
  - A TOPP tool may keep its own sources and headers in a subfolder src/topp/<Tool>/ with
    a CMakeLists.txt of its own, next to the single-file src/topp/<Tool>.cpp layout. The
    class test of a tool-local class builds that class straight from the tool folder, so
    moving code out of the library does not cost it its test coverage.
    BREAKING (installed headers): OpenNuXL moved to src/topp/OpenNuXL/ and took the whole
    NuXL pipeline with it. Nothing outside this tool ever used it, so OpenMS/ANALYSIS/NUXL
    is gone: its thirteen headers are no longer installed and its classes are no longer
    part of libOpenMS. The five NuXL class tests are unchanged and still run (#10228).
  - The TOPP tool registry (which tools exist, and their TOPPAS/CTD category) is generated
    at build time from each tool's openms_topp_tool() declaration in
    src/topp/executables.cmake, instead of being hard-coded as 154 literal entries in
    ToolHandler::getTOPPToolList(). The build writes share/OpenMS/TOOLS/OpenMS.tsv from the
    declarations, so a build option that removes a tool (e.g. DISABLE_OPENSWATH) now also
    removes it from the registry, and a tool built outside this repository can register
    itself by installing its own .tsv next to it, without an OpenMS rebuild. ToolHandler
    looks for a registry at the installation's shared-data path, then next to the
    executable, then in the build tree if earlier locations contain no registry. It also
    reads .tsv files from directories named by OPENMS_TOOL_REGISTRY_PATH or the legacy
    OPENMS_TTD_INTERNAL_PATH, and caches the result after the first read.
    ToolHandler::getTypes() returns an empty list for a tool the registry does not know
    instead of throwing, matching its documented behavior. BREAKING (installed headers):
    ToolDescriptionFile, ToolDescriptionHandler and Internal::ToolDescription's
    foreign-executable fields (FileMapping, MappingParam, ToolExternalDetails,
    external_details, is_internal) are removed; nothing used them once the .ttd XML format
    was replaced by the generated TSV (#10216).
  - BREAKING: TOPPBase no longer takes a bool official, and neither do SearchEngineBase,
    TOPPOpenSwathBase, TOPPMapAlignerBase and TOPPFeatureLinkerBase, which only forwarded
    it. A tool is registered by its openms_topp_tool() declaration, the same declaration
    that builds it, so every tool that exists is registered and the flag named nothing.
    What it did instead was let a tool disown its own registration: OpenNuXL, PeakPickerIM,
    FeatureFinderLFQ, ProSE, QCEmbedder and ImageCreator each wrote an empty category into
    their CTD while the registry held a real one, so TOPPAS and every other CTD consumer
    saw them uncategorised; all six now carry their category. Out-of-tree code deriving
    from one of these classes drops the argument; something that is not a registered TOPP
    tool at all passes toolhandler_test = false instead, which is now the only way to skip
    the registry check (#10228).
  - BREAKING (installed headers): Move tool-only helpers without pyOpenMS bindings
    into the CometAdapter, DecoyDatabase, INIUpdater, NucleicAcidSearchEngine,
    OpenSwathInfer, QualityControl and UniPEFF folders. Their 21 headers are no longer
    installed and 20 implementations no longer live in libOpenMS or libOpenMS_CLI.
    Class tests travel with the tools; reusable inference tests also remain available
    in library-only builds (#10239). Helpers built on a private dependency of libOpenMS
    stay in the library even with a single tool as user, so that no tool has to find
    that dependency itself: the Arrow/Parquet-based OpenSWATH exporters, OSW Parquet
    reader/writer, Percolator scoring, XIPMParquetConsumer and ParquetTableComparator.
    OpenSwathExport, OpenSwathPeakMapExtractor, OpenSwathPercolatorScoring,
    OpenSwathWorkflow and ParquetDiff link nothing but OpenMS (#10247).
  - BREAKING: KNIME plugin support was removed. The ENABLE_PREPARE_KNIME_PACKAGE option
    and the prepare_knime_package targets are gone, as are the KNIME user tutorial, the
    LaTeX tutorial handout and the .knwf workflow collection under doc/tutorials (still
    available in the archived OpenMS/Tutorials repository). CTD generation is unaffected:
    -write_ctd and -write_cwl continue to work for Galaxy and CWL (#10135).
  - The API documentation no longer generates Graphviz (dot) graphs: include, included-by,
    collaboration, directory and graphical class-hierarchy graphs are gone, class
    inheritance diagrams use doxygen's built-in renderer, and the few hand-drawn
    diagrams are pre-rendered SVGs. This shrinks the HTML documentation by more than half
    and makes Graphviz optional; the 'doc_dot' target still builds all graphs. The
    OPENMS_HASDOXYGENDOT macro in the installed OpenMS/config.h, which was always 0 and
    no longer used, was removed (#10265).

Dependencies:
  - Boost is now private to the shared OpenMS library. Installed headers and the CMake
    package of a shared build no longer require Boost development packages; a static
    build keeps Boost among its link dependencies, so its consumers still need them,
    and builds of OpenMS itself still use Boost. A consumer test compiles every
    installed core header with Boost headers blocked.
  - BREAKING (C++ API/ABI): regex parameters now use OpenMS::RegularExpression;
    MetaInfo::MapType uses sorted vector storage, and identification collections are
    std::set-based (IDDataContainer) instead of Boost.MultiIndex containers: their
    iterators are the set's, modify() takes the position by reference and updates it,
    and getStepsAndScoresByStep() returns a lookup view (find/end/modify) by value.
    RandomShuffler holds a std::mt19937_64 (same sequence as before) and exposes seed()
    instead of the Boost engine constructor/member, and IDBoostGraph.h is internal: use
    the new BasicProteinInferenceAlgorithm::annotateIndistinguishableGroups() to compute
    indistinguishable protein groups without it.
    Rebuild downstream C++ code and Python extensions; code using Boost directly
    must declare its own dependency. A TOPP or GUI layer built against an installed
    OpenMS (OPENMS_USE_INSTALLED_LIBRARY) finds the Boost headers itself.
  - The internal headers FORMAT/ParquetFile.h, FORMAT/ZipRandomAccessFile.h (Arrow) and
    FORMAT/RationalScan2ImConverter.h (OpenTIMS) are no longer installed. They take,
    return or derive from Arrow and OpenTIMS types and were usable only where those
    development files happened to be on the include path; the installed Parquet and
    Bruker readers expose OpenMS types as before, and the OpenSWATH helpers built on
    them live in libOpenMS (#10247).
    ML/CLUSTERING/HashGrid.h is no longer installed either: it keeps Boost.Unordered,
    because QTClusterFinder numbers its clusters in the grid's bucket order and only
    Boost orders the buckets identically on every platform. QTClusterFinder::Grid is
    an opaque type now, like its Heap.
  - Configuring OpenMS fails if an installed header includes anything but OpenMS
    headers, the C++ standard library, operating-system headers and the headers of a
    public dependency (OpenMP; Qt in the GUI layer). This allowlist replaces a list of
    known private dependencies, so a dependency added later cannot slip into the
    installed headers unnoticed. A library allows the headers of its own public
    dependencies with openms_add_library(... ALLOWED_PUBLIC_INCLUDES ...).
  - Minimum versions: CMake 3.24, Eigen 3.4.0, Boost 1.81, Arrow/Parquet 23 and nanobind
    3.1. Arrow/Parquet is required on all platforms; WITH_PARQUET was removed and
    versions 24+ are accepted. Compiler minimums are checked before vcpkg runs
    (#8366, #8370, #8422, #8679, #8699, #8991, #9042, #9095, #9196, #9221, #10112,
    #10133, #10221).
  - C++23 is required (#9037). The minimum compilers are GCC 13, Clang 17, AppleClang 16
    (Xcode 16) and Visual Studio 2022 17.14; configuring with an older one stops with a
    message.
  - Zstandard (zstd) is now a required dependency (mzML zstd binary array compression; #9033).
    It is found via its CMake config package or as a plain library (e.g. libzstd-dev).
  - Qt6 is required only with WITH_GUI=ON. Core/non-GUI code now uses standard C++ and
    platform APIs, libcurl for HTTP, boost-process for subprocesses and nlohmann/json.
    ZIP support uses libzip instead of minizip-ng. ExecutePipeline, INIUpdater and
    ImageCreator require the GUI build (#8808, #8841, #8936, #8937, #8938, #8939,
    #8940, #8965, #9041).
  - BREAKING: Qt-based public APIs were removed: Date's QDate constructor, QString-based
    filesystem parameters and QObject inheritance in ExternalProcess. Qt string interop
    and Qt5Port.h were removed; downstream code using Qt must link Qt6::Core explicitly.
  - LibSVM, Xerces-C++, SQLite, Eigen, CURL and nlohmann/json no longer leak into the
    public dependency interface. Shared-library consumers no longer require CURL/Xerces
    development packages; OpenSwathAlgo's Boost headers are private. See OpenMS Library
    for XMLHandler/Matrix API migration (#8511, #8547, #8558, #9712, #9737, #10084, #10103).
  - Boost is used header-only: OpenMS, its tools and tests no longer link the compiled
    Boost.Regex, Boost.Iostreams and Boost.DateTime libraries, of which only header-only
    parts were used. Building needs just the Boost headers, and a static Boost works as
    well as a shared one. A static Boost used to be linked into the shared libOpenMS,
    which could fail at link time: the archives are not always built with -fPIC, and
    their own dependencies (zstd, lzma, ICU) had to be installed as development packages.
    The BOOST_USE_STATIC option and the Homebrew static-Boost link fixups (#10187) were
    removed; passing -DBOOST_USE_STATIC now only triggers CMake's unused-variable
    warning (#3319).
  - BREAKING (installed headers): two internal headers are no longer installed, and two
    public ones no longer pull in a private dependency.
    DATASTRUCTURES/MatrixEigen.h (the Eigen::Map views on Matrix) and SYSTEM/SIMDe.h
    both already documented themselves as internal -- MatrixEigen.h says not to include
    it from public headers, SIMDe.h says to include it from .cpp files only -- and only
    libOpenMS sources and class tests include them; they stay where they are in the
    source tree, so in-tree builds are unaffected. FORMAT/GzipIfstream.h and
    FORMAT/Bzip2Ifstream.h no longer include <zlib.h> and <bzlib.h>: they store the
    library handle as an opaque pointer (a forward-declared gzFile_s*, resp. a void*,
    which is what bzlib's BZFILE is), so neither header needs the zlib/bzip2 include
    directory any more. External code that obtained Eigen, SIMDe, zlib or bzlib
    declarations through one of these headers has to include the library itself.
    find_package(OpenMS) no longer looks for Eigen at all: CMake omits the PRIVATE
    dependencies of a shared library from the exported link interface, and the OpenMS
    build always produces shared libraries, so OpenMSTargets.cmake names no Eigen
    target and a consumer needs neither the Eigen CMake package nor its headers.
    Previously find_package(OpenMS REQUIRED) failed outright when Eigen was absent.
    The lookup is kept for a static OpenMS, whose export does carry
    $<LINK_ONLY:Eigen3::Eigen>, and runs only for such an installation. Eigen is still
    required to build OpenMS and pyOpenMS (#10169).
  - The class-test framework (CONCEPT/ClassTest.h, ClassTestUtils.h,
    FuzzyStringComparator.h, MacrosTest.h) is no longer installed by default. It is an
    in-repo development tool: its static library was already EXCLUDE_FROM_ALL and is not
    exported, so an installation carried the headers without anything to link them
    against. `cmake --install . --component OpenMSTestFramework_headers` still installs
    them explicitly.
  - CMake package: find_package(OpenMS CONFIG) provides namespaced imported targets, OpenMS::OpenMS,
    OpenMS::OpenSwathAlgo and, via COMPONENTS GUI, OpenMS::OpenMS_GUI together with the Qt6
    modules it was built against; the un-namespaced names remain as aliases, while the
    bundled third-party libraries exist under the OpenMS:: namespace only. The build options
    of an installation are reported as OpenMS_WITH_GUI, OpenMS_WITH_HDF5, OpenMS_WITH_OPENTIMS,
    OpenMS_WITH_THERMO_RAW, OpenMS_WITH_OPENMP and OpenMS_BUILD_TOPP_TOOLS instead of the
    unprefixed WITH_* variables, which shadowed options of the consuming project, and the
    OPENMS_*_DIR variables no longer point into the prefix of a dependency found before them.
    The empty OPENMS_ADDCXX_FLAGS variable was dropped, and the Find modules of the OpenMS
    build (FindCOIN, FindLIBSVM, ...) are no longer installed next to the package: they served
    the package's former lookups of dependencies that are PRIVATE now. Consuming projects need
    CMake 3.24: find_package(OpenMS) rejects older versions with an explanatory message
    instead of failing later (#10158).
  - The source tarball contains vcpkg.json, vcpkg-configuration.json and vcpkg-overlays/, so
    it builds with an external vcpkg (OPENMS_USE_VCPKG=ON and its CMAKE_TOOLCHAIN_FILE) as well
    as against system packages.
    With OPENMS_USE_VCPKG=ON, a missing or non-vcpkg toolchain stops the configure with a
    message that names the alternatives (#10327).
  - The contrib (OpenMS/contrib) is deprecated and will be removed after 3.6: vcpkg
    builds the dependencies (see the vcpkg install guide and the CMake presets). It is no
    longer a git submodule; a build that still needs it takes it from a separate clone of
    OpenMS/contrib. Configuring with OPENMS_CONTRIB_LIBS, which requires
    OPENMS_USE_VCPKG=OFF, prints a deprecation warning (#10327).
  - The dev container (.devcontainer/) builds with the vcpkg presets on Ubuntu 24.04 instead of
    the contrib image. The Gitpod configuration and tools/quickbuild.sh/quickbuild-osx.sh, which
    built contrib, were removed; use cmake --preset <platform>-release instead (#10327).
  - Optional readers: WITH_OPENTIMS enables timsTOF support (default ON); opentims_DIR or
    opentims_ROOT selects a system installation before downloading. WITH_THERMO_RAW is
    ON by default on every supported platform; .NET 8+ is required at runtime (#9147,
    #9148, #9389, #9736, #10206).
  - WITH_WNETALIGN (default OFF, #10255) fetches wnetalign/wnet/pylmcf when enabled. WITH_ONNX
    (default OFF) requires an external ONNX Runtime installation (#8992, #9453).
  - HiGHS joins COIN-OR and GLPK as LP backends. LP_SOLVER=AUTO tries COIN-OR, GLPK,
    then downloads HiGHS (#9246).
  - ENABLE_TDL now defaults to OFF; set it to ON for CWL support (#9067).
  - macOS Intel builds discontinued; the minimum macOS version is 15 (Sequoia), for the installer
    and for the pyOpenMS wheels (#8450, #9037, #10202).
  - vcpkg builds use OpenSSL 3.6.4, and the Linux DEBs and the macOS package bundle it (the 3.5.0 DEBs
    bundled 3.0.2). vcpkg.json pins the version because the baseline's 3.6.2 is affected by the
    High-severity CVE-2026-45447.
  - The SQLite amalgamation vendored with SQLiteCpp is updated from 3.49.2, which
    CVE-2025-6965 affects, to 3.53.1, the version vcpkg builds. Builds with
    USE_EXTERNAL_SQLITECPP=OFF, the default, compile it into libOpenMS.
  - The bundled MaRaCluster is updated from 0.05.0 to 1.04.1 on Linux and Windows x86_64,
    and the macOS arm64 packages now include it too. MaRaClusterAdapter now converts the
    input files in MaRaCluster's index step, single-threaded, before it clusters them:
    1.04.1's Windows build crashes in about one run in ten when it converts several files
    in parallel (OpenMS/THIRDPARTY#113, #10259).

PyOpenMS:
  - BREAKING: boolean parameters are Python bools (#10116). Reading/writing Params
    now uses Python bool for boolean entries; assigning bool to non-boolean
    parameters raises TypeError; boolean-ness is preserved through Param updates,
    dict conversion, repr and INI round-trips. Param::setDefaults now gives existing
    string entries the defaults' valid strings (values unchanged), so a partial Param
    cannot override an algorithm's restrictions.
  - Fixed keyword defaults that did not match the wrapped C++ signatures. Four bindings
    declared a parameter with no default after parameters that had one: the transf
    argument of MultipleTesting.lfdr, spectra in both IDMapper.annotate overloads and
    plugin_consumer in SwathFile.loadMzML. They are now optional and carry the C++
    defaults (LfdrTransform.Probit, an empty MSExperiment and None). This also makes
    the generated type stubs valid Python again: _pyopenms_datastructures.pyi and
    _pyopenms_misc.pyi did not parse, both failing with "non-default argument follows
    default argument" (#10137).
  - BREAKING: MultipleTesting.lfdr's gridsize and cut defaults were 100 and 0.05, while
    the wrapped C++ signature (and its documentation) use 512 and 3.0, so Python callers
    who omitted them silently got different results than C++ callers. The bindings now
    use the C++ values (#10137).
  - Wheels are now built in nanobind split mode against the CPython 3.11 stable ABI:
    each platform ships a single cp311-abi3 wheel that serves Python 3.11 and every
    later version, instead of one wheel per interpreter. Adding a new CPython minor
    version normally only means adding it to the test matrix. nanobind's
    version-specific runtime moves into the separate nanobind-backend package, which
    is a new runtime dependency (nanobind-backend>=1.0, deliberately unpinned: newer
    backends serve extensions built against older backend ABI revisions).
    python_versions.json is now purely the list of versions the wheel is tested on;
    the version it is compiled for comes from abi3_minimum_cpython_version in
    pyproject.toml, so the two cannot drift apart.
  - Wheels now ship the .pyi type stubs and the py.typed marker. The pyopenms_stubs
    target was never part of the build, so PYOPENMS_GENERATE_STUBS=ON defined it and
    nothing ran it. It is now built with the pyopenms target, requires every extension
    module to import before generating anything, and py.typed is written only once the
    stubs exist. On Windows the stub generator and the ctest suite are handed the
    contrib bin/ directory, where a contrib built with shared libraries keeps its DLLs;
    a failed import now names the DLL that could not be resolved (#10141).
  - Stub generation uses named free_mem fallbacks on Windows and unsupported
    platforms, avoiding invalid <lambda> definitions and re-exports in .pyi files.
    Generated stubs are syntax-checked after post-processing, before the build
    writes py.typed and its success stamp.
  - The type stubs export the aliases PeakMap, PeakSpectrum, Kernel_MassTrace,
    TM_DataPoint and MZTrafoModel_MODELTYPE, which mypy rejected with "does not
    explicitly export". The nested enums that pyOpenMS also exports at module level,
    such as FileType and LogType, now have their types; type checkers saw them as Any.
    The package no longer exposes names its own imports left behind: the modules c,
    ctypes, importlib and warnings, and the __future__ feature annotations.
  - The wheel metadata declares the license as the SPDX expression BSD-3-Clause
    (Metadata-Version 2.4) and ships the license text as dist-info/licenses/LICENSE.
    Before, dist-info/LICENSE held only the string "BSD-3-Clause".
  - The Windows wheel is built against vcpkg's static libraries (triplet
    x64-windows-static-md-release) instead of the prebuilt contrib. Every dependency
    is linked into OpenMS.dll, so the only native DLLs the wheel bundles besides
    OpenMS's own are those of the MSVC runtime; the managed Thermo RawFileReader
    assemblies ship as before. Earlier Windows wheels carried an unrelated libcurl
    and a second zlib from the CI image. The dependency versions are those the main
    CI tests, e.g. Arrow 24, Xerces-C 3.3, bzip2 1.0.8 and libsvm 3.35 (#10327).
  - The Linux wheels (x86_64 and aarch64) are built in the stock manylinux_2_34 images
    against static vcpkg libraries instead of the contrib. They carry the libraries the
    other builds already test, e.g. bzip2 1.0.8 instead of 1.0.5 (CVE-2019-12900),
    Xerces-C 3.3.0 instead of 3.2.0 (CVE-2018-1311), libsvm 3.35 and Arrow 24 (#10327).
  - The Linux and Windows wheels take SQLiteCpp and SQLite from vcpkg, as the packages do,
    instead of the copies OpenMS vendors, which the macOS wheel keeps. All wheels carry
    SQLite 3.53.1 instead of 3.49.2 (#10327).
  - The custom type casters build their result lists with the checked
    PyList_SetItem() instead of the PyList_SET_ITEM() macro, which is unavailable
    under the Limited API. Behaviour is unchanged; failures release the partially
    built list rather than leaking it.
  - Building pyOpenMS in split mode requires CMake 3.26 or newer, for FindPython's
    Development.SABIModule component. This applies to pyOpenMS only -- the C++-only
    OpenMS build still requires no more than CMake 3.24. Configure with
    -DPYOPENMS_SPLIT_MODE=OFF for interpreter-specific modules; that mode refuses to
    produce a wheel, which would otherwise be mislabelled abi3.
  - BREAKING (source builds): nanobind 3.1 or newer is required; nanobind 2.x no longer
    works. The custom type casters follow the nanobind 3 caster protocol, whose
    from_python() takes uint32_t instead of uint8_t flags. pyproject.toml asks for
    nanobind>=3.1,<4 and py-build-cmake~=0.5.1, and the CMake fallback fetches nanobind
    v3.1.0. nanobind discovery enforces that minimum instead of accepting whatever
    find_package() returns, and reports the version it selected (#10133, #10221).
  - BREAKING: Python 3.10 is no longer supported. Wheels and source builds require
    Python 3.11 or newer; the wheel matrix covers 3.11 to 3.14. With 3.10 gone, pandas 3
    is the floor for DataFrame support (the dataframes/all extras and the test
    requirements ask for pandas>=3), so string columns consistently use the pandas str
    dtype and Arrow-backed large_string. The pyarrow 24.0.0/25.0.0 exclusions were
    dropped: both only worked around cp310-specific problems (#10119).
  - Autowrap/Cython replaced by nanobind, with PEP 561 type stubs, smaller binaries,
    faster builds and clearer errors. Fixed mutable-reference output parameters and
    restored missing default arguments; Python addons remain supported (#8699).
  - BREAKING: pyopenms.String removed; use Python str (string arguments also accept
    bytes). MzMLFile.storeBuffer() and MSNumpressCoder.encodeNP() return str directly;
    encodeNPRaw() returns bytes (#8602, #8604, #10109).
  - BREAKING: output arguments are return values. A method that filled a list or object
    passed by the caller now returns it, and the old call raises TypeError. For example:
      picked = oms.PeakPickerHiRes().pickExperiment(exp)   # was pickExperiment(exp, picked, True)
      traces = oms.MassTraceDetection().run(exp)           # was run(exp, traces, 0)
      trafo = aligner.align(feature_map)                   # was align(feature_map, trafo)
      decomps = decomposer.getDecompositions(262.1)        # was getDecompositions(decomps, 262.1)
      proteins, peptides = oms.ProtXMLFile().load(path)    # was load(path, proteins, peptides)
      ok, errors, warnings = oms.MzMLFile().isSemanticallyValid(path)
      names = oms.RNaseDB().getAllNames()                  # was getAllNames(names)
    FileHandler.loadFeatures() and the load() of MzTabFile, SqMassFile, DTAFile, DTA2DFile,
    EDTAFile, KroenikFile, ChromeleonFile and MRMFeatureQCFile changed the same way, 108 call
    forms in all; the type stubs show the new form of each. MzMLFile, FeatureXMLFile,
    ConsensusXMLFile and FileHandler.loadExperiment still fill their argument, and
    IdXMLFile.load accepts both forms (#8699). PeptideIndexing.run(),
    PosteriorErrorProbabilityModel.fit() and initPlots(), IDFilter.updateProteinGroups() and
    AbsoluteQuantitation.optimizeCalibrationCurveIterative() keep their 3.5 arguments but
    return a tuple, their 3.5 result followed by the updated lists. A check such as
    `if model.fit(...)` is therefore always true; unpack the tuple instead (#10260).
  - BREAKING: strings inside returned containers are str instead of bytes: list and set
    elements, dict keys (EmpiricalFormula("H2O").getElementalComposition() is now
    {'H': 2, 'O': 1}), Param keys and tags, list-valued string meta values and string data
    arrays, as well as the few methods that returned bytes. Methods that return a single
    String already returned str. Drop .decode() calls and b"..." keys and comparisons.
  - BREAKING: C++ char arguments take a one-character str and reject bytes, the only type
    3.5 accepted: PeptideEvidence.setAABefore("K"), not setAABefore(b"K"). This affects
    PeptideEvidence.setAABefore() and setAAAfter(), ResidueModification.setOrigin(),
    Ribonucleotide.setOrigin() and its constructor, GaussTraceFitter.getGnuplotFormula(),
    the separator of CsvFile.load() and AAIndex, whose methods are now static and which
    has no constructor: AAIndex.aliphatic("A") instead of AAIndex().aliphatic(b"A")
    (#10260).
  - BREAKING: LogConfigHandler has no constructor any more. Use
    oms.LogConfigHandler.getInstance().setLogLevel("ERROR") instead of
    oms.LogConfigHandler().setLogLevel("ERROR").
  - BREAKING: CrossLinksDB, ElementDB, ModificationsDB, ProteaseDB, ResidueDB, RibonucleotideDB
    and RNaseDB are callable singletons. ModificationsDB() and ModificationsDB.getInstance()
    return the one shared instance, but the names are no longer classes:
    isinstance(x, oms.ModificationsDB) is False, even for that instance. To check the type,
    use isinstance(x, type(oms.ModificationsDB.getInstance())).
  - BREAKING: classes removed from pyOpenMS. PeptideSearchEngineFIAlgorithm is now
    ProSEAlgorithm, after the C++ rename; its exit codes are
    ProSEAlgorithm.ProSEAlgorithm_ExitCodes (#9137). OPXL_PreprocessedPairSpectra is
    PreprocessedPairSpectra. DPosition1 and DPosition2 are a float and an (x, y) tuple.
    ArrayWrapperDouble and ArrayWrapperFloat are not needed any more, because peak data comes
    back as NumPy arrays. ProteinInference was deleted (#9482); PeptideAndProteinQuant covers
    protein quantification. KDTreeFeatureMaps, KDTreeFeatureNode and PeakIndex were dropped
    because they handed out references that could outlive their data; use
    FeatureGroupingAlgorithmKD, and fm[i] or exp[s][p] (#9803). IdentificationRuns,
    Internal_MzMLValidator, IsotopePattern, Seed, TheoreticalIsotopePattern, TraceInfo and
    OSWFile are no longer bound; use IDRipper.rip(), MzMLFile.isSemanticallyValid() and
    CoarseIsotopePatternGenerator.
  - BREAKING: MassTrace is now the kernel mass trace (getCentroidMZ(), getSize(), ...), and
    Kernel_MassTrace is an alias for it. 3.5.0's MassTrace was the FeatureFinder helper
    struct with max_rt and theoretical_int, which is gone.
  - BREAKING: CVTerm_ControlledVocabulary, the term class of ControlledVocabulary, is now
    ControlledVocabulary.CVTerm, and XRefType_CVTerm_ControlledVocabulary is now
    ControlledVocabulary.CVTerm.XRefType. A term prints as
    CVTerm(id='MS:1002252', name='Comet:xcorr') (#10284).
  - BREAKING: some nested enums were renamed. IonDetector.Type_IonDetector is now
    IonDetector.Type, FeatureDeconvolution.CHARGEMODE_FD and
    MetaboliteFeatureDeconvolution.CHARGEMODE_MFD are now CHARGEMODE, and
    OpenPepXLAlgorithm.OpenPepXLAlgorithm_ExitCodes,
    PeptideIndexing.PeptideIndexing_ExitCodes and
    PercolatorOutfile.PercolatorOutfile_ScoreType are now ExitCodes and ScoreType.
    getMapping() is now called on a member, e.g.
    IonSource.IonizationMethod.ESI.getMapping(), not on an instance of the enum class such
    as IonSource.IonizationMethod(). Thirty-two enums are no longer ints: int() raises
    TypeError, and == with a number is False without an error, so spec.getType() == 1 is
    now False for a centroided spectrum. Compare with a member such as
    SpectrumSettings.SpectrumType.CENTROID, or use .value. The 32 are AnnotationState,
    ChecksumType, DecoyTransitionType, DimensionDescription,
    IMFormat, MT_QUANTMETHOD, MZTrafoModel_MODELTYPE, DataFilters.FilterOperation,
    DataFilters.FilterType, DataProcessing.ProcessingAction,
    FeatureOverlapFilter.MergeIntensityMode, Instrument.IonOpticsType,
    InstrumentSettings.ScanMode, IonDetector.AcquisitionMode, IonDetector.Type,
    IonSource.InletType, IonSource.IonizationMethod, IonSource.Polarity,
    IsotopeModel.Averagines, the six MassAnalyzer enums,
    NonNegativeLeastSquaresSolver.RETURN_STATUS, Precursor.ActivationMethod,
    ProteinIdentification.PeakMassType, RetentionTime.RTType, RetentionTime.RTUnit,
    Sample.SampleState and SpectrumSettings.SpectrumType. Setters such as
    IonSource.setIonizationMethod() still accept an int (#8405, #8604).
  - The names List, Union, np, numpy, print_function and common_meta_value_types, which
    3.5.0 leaked from its implementation, and the streampos class are no longer exported.
  - Getters and ordinary element access return owned copies, restoring 3.5 semantics
    after the initial nanobind port. Modify and assign back, e.g.
    s = exp.getSpectrum(0); s.setRT(1.0); exp[0] = s
    Explicit live access uses spectrum_view(i), spectrum_views(), iter_spectrum_views()
    and corresponding accessors on feature/consensus maps, identification lists,
    transition groups and data arrays. Views keep parents alive; resizing/reordering
    invalidates them. See src/pyOpenMS/OWNERSHIP.md for rules and exceptions
    (#9792, #9794).
  - BREAKING: metadata enums are strongly typed; activation-method enum handling changed
    (#8405, #8604). LPWrapper, SolverParam and nested enums are no longer exposed; use
    high-level algorithms such as MRMFeatureSelector or FeatureDecharger (#9983).
  - DataFrame methods get_df()/get_df_columns() become to_df()/df_columns(); _mv methods use _view
    (e.g. get_data_mv() -> data_view()). Deprecated aliases remain (#8655, #8857).
  - Expanded DataFrame, Arrow/Parquet and zero-copy pyarrow support for spectra,
    chromatograms, mobilograms, experiments, feature/consensus maps, identification lists
    and transition groups. Added column discovery, container operations, hashing and
    snake_case scalar properties alongside existing getters/setters. Param supports dict
    construction and readable values, descriptions, restrictions and tags in str/repr
    (#8436, #8501, #8503, #8510, #8520, #8576, #8631, #8632, #8655, #8729, #9760, #10097).
  - DataFrame exports preserve long strings and use nulls for missing strings instead of
    'None', 'nan' or 'unknown'. Transition-group metadata handles str/bytes names equally;
    missing integer values produce float columns with NaN instead of errors (#8583).
  - New/expanded bindings include ProForma, USI, PEFF, XIC/XIM Parquet, BrukerTimsFile,
    FileInfo, IsoelectricPoint, FAIMSHelper, SpectrumNativeIDParser, FileHandler I/O,
    rasterize2D, quantification results, rank aggregation, chemistry/spectrum generation,
    RANSAC seeding, ppm helpers and DRange1 (#8504, #8525, #8543, #8637, #8648, #8684,
    #8690, #8737, #8738, #8739, #8762, #8894, #8907, #9275, #9379, #9407, #9412,
    #9415, #9419, #9602).
  - SpectrumAccessOpenMSCached is available and selected automatically for cached-data
    experiments. SystemSettings, TempDir and TempFiles are exposed; existing Python
    File settings/temp-file methods remain available (#9952, #10083).
  - Ion mobility: explicit-unit setters for per-peak arrays, drift-time/unit getters and
    zero-copy peaks_struct() for chromatograms/mobilograms. Fixed unit detection and
    preservation of live NumPy buffers on same-length drift-array replacement
    (#8423, #8825, #8842, #9792).
  - Fixed iterator/consumer lifetimes, borrowed-pointer ownership, out-of-range access,
    copy-constructor dispatch, AASequence string conversion and peak-buffer dtype
    offsets. set_peaks() keeps parallel data arrays consistent; enum/FileTypes and
    identification-file wrappers were completed or corrected (#8502, #8553, #8589,
    #8720, #9098, #9705, #9792, #9794, #9795).
  - Fixed SimpleSearchEngineAlgorithm.search(), which ran the search and then raised
    std::bad_cast because its ExitCodes enum was not registered. It returns
    (exit_code, protein_ids) and fills pep_ids; the codes are
    SimpleSearchEngineAlgorithm.ExitCodes (#10260).
  - Copying works again for the classes that supported it in 3.5.0. Sixty-one classes,
    most of them derived from DefaultParamHandler, ProgressLogger, CVTermList or CsvFile,
    either had no __copy__ or inherited their base's, so copy.copy() and copy.deepcopy()
    failed or returned the base class: a DefaultParamHandler for PeakPickerHiRes, for
    example. FeatureDistance, MultiplexResolverAlgorithm and SwathMapMassCorrection, which
    returned a DefaultParamHandler too, get their own __copy__ and __deepcopy__ as well.
    The copy constructor X(other) is back on 136 classes that had it in 3.5.0,
    and new on four more. It stays gone from six: FeatureFindingMetabo and
    OpenSwathOSWWriter have no C++ copy constructor any more, and MSDataSqlConsumer,
    CachedSwathFileConsumer, MzMLSwathFileConsumer and PeakWidthEstimator delete objects
    that their C++ copy shares, so a copy and its original freed them twice
    (MSDataSqlConsumer(other) aborted Python in 3.5.0). copy.copy() and copy.deepcopy()
    raise TypeError for FeatureFindingMetabo and these four (#10260).
  - ControlledVocabulary.getTerm() and getTermByName() return a ControlledVocabulary.CVTerm
    again, as in 3.5.0, instead of a dict with id, name and description. With the dict,
    PeptideIdentificationList.to_df() and df_columns() kept PSI-MS accessions such as
    MS:1002252 as column names, although decode_ontology=True asks for the term names
    (#10284).
  - Restored C++ default arguments that the port had dropped, e.g. Residue.getMonoWeight(),
    getAverageWeight() and getFormula() without a residue type, MSDataCachedConsumer(filename),
    MetaInfo.getValue(name), FineIsotopePatternGenerator(threshold),
    ModificationDefinition(mod, fixed), TextFile(filename, trim_lines, first_n),
    IDFilter.removeDuplicatePeptideHits(peptides) and
    IDConflictResolverAlgorithm.resolve(features) (#10260).
  - Methods that update a list argument in C++ update a Python list passed there again, as
    in 3.5, besides returning the updated list, so both f(prots, peps) and
    prots = f(prots, peps) work. Without this, 3.5 code ran but its list silently stayed
    unchanged. Among them are IDFilter.removeUnreferencedProteins(),
    FalseDiscoveryRate.apply() and applyEstimated(), BasicProteinInferenceAlgorithm.run(),
    BayesianProteinInferenceAlgorithm.inferPosteriorProbabilities(),
    PeptideProteinResolution.run(), the PercolatorFeatureSetHelper feature methods and
    TransformationModel*.weightData(); pyopenms/addons/inout_lists.py lists all of them.
    Tuples and other sequences are not updated (#10260).
  - Restored calls that 3.5 had: MapAlignmentAlgorithmIdentification.align() aligns
    several maps, returning one TransformationDescription per map or, in the 3.5 form
    align(maps, transformations, reference_index), filling the list passed in, and
    setReference() takes a PeptideIdentificationList; IDFilter.filterHitsByScore() takes
    a list of ProteinIdentification; IDFilter.updateProteinReferences() is a deprecated
    alias of removeDanglingProteinReferences(). OPXLHelper.computeDeltaScores() takes the
    identifications to score (it took no argument), and the OPXLHelper methods update a
    PeptideIdentificationList in place again instead of a copy. TransitionTSVFile and
    TransitionPQPFile accept bytes file names, like the other file classes (#10260).
  - plot_spectrum() and mirror_plot_spectrum() plot annotated spectra again. They called
    .decode() on the peak annotations, which the bindings now return as str (#10260).
  - The deprecated MSExperiment.get_df() and get_df_columns() accept long= again, 3.5.0's
    name for long_format (#10260).
  - FeatureMap.to_peptide_df() and peptide_df_columns() export the PeptideIdentifications
    assigned to features, one row per identification, with the feature_id of each. Merge the
    frame with FeatureMap.to_df() on feature_id (#10260).
  - BREAKING: FeatureMap.get_assigned_peptide_identifications() returns the identifications
    unchanged. 3.5.0 added feature_id, ID_native_id and ID_filename as meta values to every
    peptide hit, to merge on all three. Merge FeatureMap.to_df() with to_peptide_df() on
    feature_id instead (#10260).
  - BREAKING: FeatureMap.to_df() indexes features by feature_id as an unsigned 64-bit
    integer, where 3.5.0's get_df() used text; the deprecated get_df() returns it as a
    column (#10260).
  - Thermo .raw reading is included in every wheel, Linux aarch64 among them; install
    .NET 8+ and set DOTNET_ROOT for non-standard locations. Optional WNet/Bruker bindings
    are exposed only when built; use hasattr() for feature detection (#9946, #9957,
    #10070, #10205, #10206).
  - See src/pyOpenMS/THREAD_SAFETY.md for concurrency rules and OpenMP oversubscription
    guidance; releasing the GIL does not guarantee thread safety (#9792, #9857).
  - BREAKING: IMSWeights, NoiseEstimator, Ratio, SpectrumAccessQuadMZTransforming and
    SplineSpectrum_Navigator are no longer bound. The methods that take or return them are
    still exposed but cannot be used: RealMassDecomposer(weights),
    SignalToNoiseEstimatorMedianRapid.estimateNoise(), ConsensusFeature.addRatio(),
    setRatios() and getRatios(), and SplineInterpolatedPeaks.getNavigator().
  - User guide: new pages on ProForma, USI and mzPAF, on glycans and glycopeptide fragment
    spectra, and on threads and parallel processing; new sections on PEFF files, FAIMS
    data, file summaries with FileInfo and the type stubs. Corrected the PEFFFile docstring
    (load() returns a tuple) and four PEFFEntry method docstrings that carried the
    description of their neighbour; the docstring examples of ProForma,
    IdentifierMSRunMapper and PEFFFile now render as code blocks.

TOPP tools:
  Changes:
    All tools:
      - Boolean parameters accept flag syntax or explicit true/false, including overriding
        an INI-enabled flag with '-flag false' (#10116).
      - A JSON INI ('-ini x.json') reads input file lists in every shape they occur in. A CWL
        runner emits a 'File[]' input as an array of File objects, which was rejected with a
        json type error, so every tool with an input file list failed through its generated
        CWL description once the list was set. Input and output file lists also accept an
        array of path strings or an object with a 'path' array; a single file parameter takes
        a path string or an object with a 'path' string (#10121).
      - BREAKING: the advanced option '-instance <n>' was removed. It selected the numbered
        'ToolName:<n>:' section of an INI file and was broken together with '-ini' (every tool
        exited with ILLEGAL_PARAMETERS). Tools always read and write the 'ToolName:1:' section
        used by all existing INI/CTD/TOPPAS files; the file format is unchanged. INIUpdater lost
        its '-instance' option accordingly (fixes #10125).
      - BREAKING: repeated command-line parameters use the LAST occurrence, with a warning;
        appended workflow arguments can override earlier values (#8670, fixes #5345).
      - An output file name ending in .gz, .bz2 or .zip is refused with an error unless the
        format is written that way: mzML, mzXML, mzData, featureXML, consensusXML, traML,
        mzIdentML and xquest.xml are compressed with gzip or bzip2 (the suffix in any letter
        case), and an .oswpq bundle is a ZIP archive anyway. Before, idXML, trafoXML, pepXML,
        MGF, text formats and every .zip name silently got uncompressed data under the compressed
        name, and so did mzML that a tool streams to disk: FileConverter -process_lowmemory, the
        lowmemory processOption of PeakPickerHiRes and NoiseFilterGaussian/SGolay, PeakPickerIM
        on mzML input and OpenSwathWorkflow -out_chrom. The check covers output file lists too,
        and replaces UniPEFF's own check for PEFF (#10317).
      - Native Parquet I/O is supported by identification converters/filters/search adapters,
        alignment and feature-linking tools; TextExporter and MzTabExporter read all three
        native formats. Output follows input format where applicable (#9232, #9236, #9237,
        #9241, #9396, #9405).
      - Thermo .raw input: FileConverter, ProSE, SimpleSearchEngine, CometAdapter, SageAdapter,
        ProteomicsLFQ and OpenSwathWorkflow. Bruker .d input: FileConverter, CometAdapter,
        ProteomicsLFQ, OpenSwathWorkflow and PeakPickerIM (#8975, #9019, #9022, #9030,
        #9126, #9418).
      - Adapters find the search engines that ship with OpenMS. When an engine such as Comet or
        Sage is not on the PATH, they look for it in share/OpenMS/THIRDPARTY, which the Linux and
        macOS packages do not put on the PATH; without '-<engine>_executable' they stopped with
        exit code 14 there (#10304).
      - Tools that read Thermo .raw get the spectra centroided by Thermo's peak picking, as
        FileConverter writes them by default. For profile spectra, convert with FileConverter
        -RawToMzML:no_peak_picking first; in C++ and pyOpenMS, ThermoRawFile keeps the scans as
        acquired unless its centroid option is set (#10303).
      - On Linux and macOS, FileConverter reads Thermo .raw in-process by default
        (-RawToMzML:reader inprocess): the packages there provide neither mono nor
        ThermoRawFileParser on the PATH, which the external reader needs. The in-process reader
        needs a .NET 8 runtime (with DOTNET_ROOT set if it is not in the standard location, e.g.
        installed with Homebrew or into ~/.dotnet) and applies vendor peak picking unless
        -RawToMzML:no_peak_picking, as ThermoRawFileParser did. Pipelines that set
        -RawToMzML:ThermoRaw_executable must pass
        '-RawToMzML:reader external' too; FileConverter warns when that option or
        -RawToMzML:NET_executable is set but the in-process reader runs. Windows keeps the
        external reader, which runs on the built-in .NET Framework.
      - For per-peak IM input, PeakPickerHiRes warns and uses intensity-weighted mean IM;
        Resampler, FeatureFinderCentroided, FeatureFinderMultiplex and MultiplexResolver
        reject incompatible data (#9018).
    ConsensusID:
      - Accept empty idXML searches while preserving their run metadata; initialize
        per-spectrum search settings even for MS files without peptide IDs. Handle maps
        without identification runs and report invalid input combinations cleanly (#1427).
    QPX export (ProteomicsLFQ, IsobaricWorkflow, ProteinQuantifier, ProSE):
      - BREAKING: -out_feature_qpx replaced by -out_qpx, a directory containing QPX 1.1
        quantms.psm.parquet, quantms.feature.parquet and quantms.pg.parquet views.
        ProSE also writes per-input PSM/PG files and omits PG output when no groups were
        inferred (#8973, #8974, #9146).
      - Views use long format, bare run-file stems, scalar label/intensity columns and
        grouped_runs matching experimental-design fraction groups. Required identity columns
        (psm_id/feature_id/pg_id) follow the QPX reference algorithm; PSM/feature links are
        bidirectional and protein-group identity uses full group membership (#9816, #9818,
        #9825, #9843, #9864).
      - Exports validate required values, identities, channel labels, run references and
        experimental design; failed exports leave no partial collection. Batched streaming
        substantially reduces memory use and supports deterministic parallel row generation
        (n_threads: 1=serial, 0=auto, N=fixed) (#9692, #9697, #9698, #9699, #9817,
        #9832, #9834, #9835, #9843).
    ProteinQuantifier / PeptideAndProteinQuant:
      - BREAKING: quantities are reported per assay (fraction_group, label), replacing sample
        aggregation. CSV columns use abundance_fgroup<F>_label<L>; total_abundances,
        peptide_abundances and indistinguishable_proteins_<N>_abundances were removed in
        favor of fraction_group_abundances/peptide_fraction_group_abundances. MSstats and
        QPX PG values already used run/assay data (#9864, #9869).
      - New fractions:aggregate selects sum (unchanged default) or best (one fraction per
        peptide and fraction group) (#9876).
      - BREAKING: best_charge_and_fraction renamed to best_charge without an alias. It selects
        one charge per modified peptide globally by assay coverage, then abundance, then
        lower charge, retaining all observations of that charge (#9796, #9864).
      - BREAKING: -ratios/-ratiosSILAC and their CSV columns removed; calculate contrasts from
        abundance columns downstream, e.g. in MSstats (#9853).
      - Fixed zero/undetected reporters biasing peptide selection and protein abundance,
        merged-run PSMs assigned to the wrong file, and missing/misaligned fraction columns
        in detailed peptide output. Removed quadratic quantification hotspots in large
        isobaric experiments (#5518, #9658, #9672, #9683, #9796).
    MzTabExporter:
      - BREAKING: an assay is now a (fraction_group, label) unit covering all of that group's fractions,
        and study_variable lists a sample's assays as its replicates. n_assays was previously
        ExperimentalDesign::getNumberOfSamples(), so a sample measured in several fraction groups
        collapsed onto a single assay and the replicate axis had nowhere to live -- the opposite of the
        mzTab spec, which defines an assay as one measurement and study_variable as the grouping level
        above it. Assay abundances are read from PeptideAndProteinQuant's fraction_group_level_abundance
        array matched by (fraction_group, label) key rather than by position. Malformed arrays, keys
        that are not 1-based and duplicated keys warn and fall back to the previous sample-grain value
        instead of emitting a wrong number; an assay whose key the array lacks gets a null abundance,
        without a warning. A sample split across several assays reports each assay's own value with a null
        study_variable abundance, since no across-replicate aggregator has been agreed on, rather than
        silently picking one of them. This also fixes peptide_abundance_assay[i] being assigned rather
        than summed -- only ill-defined before, when an assay was forced 1:1 with a study variable, and
        now a genuine sum over the ms_runs an assay spans. One shipped reference moves,
        ProteomicsLFQ_1_subset_out.mzTab, whose design splits one sample's fractions across two fraction
        groups; every other shipped mzTab reference has exactly one (fraction_group, label) per sample
        and is byte-identical (#9868, part of #9864)
    ProSE:
      - Search initial methionine loss by default (peptide:clip_nterm_methionine=true), retaining
        the original protein coordinates and protein N-terminal variable modifications.
        The false setting restores the previous search space; standalone FragmentIndex defaults
        to false. Length, mass and missed-cleavage limits apply after clipping. Generated decoys
        retain the initial M when clipping is enabled; supplied decoys are searched as provided.
      - FIX: Preserve strong peaks in the short final 100 Da window for high-resolution searches.
        New peaks:window_type=auto keeps the full local quota at <=0.1 Da / <=100 ppm;
        low-resolution filtering is unchanged. jump restores the previous filter and jump_full
        forces a full quota. Peak-associated data arrays stay aligned.
      - Fixed FragmentIndex::build reusing old peptide coordinates on a second build;
        rebuilding now replaces the previous index and failed builds remain unbuilt.
      - BREAKING: renamed from PeptideDataBaseSearchFI. -out replaced by -out_idxml
        (one per input), -out_qpx and -out_parquet (native tables); directory outputs require
        unique input basenames (#9137, #9146).
      - BREAKING: precursor:mass_tolerance and precursor:open_window_lower/_upper replaced
        by non-negative precursor:mass_tolerance_lower/_upper, applied as [-lower, +upper].
        Calibration preserves signed bias and rejects implausible estimates. Open search
        is detected above 1000 ppm or 1 Da (#9108, #9132).
      - Changed defaults: precursor tolerance 20 -> 10 ppm per side, fragment tolerance
        10 -> 20 ppm, isotope errors [-1, +1] -> [0, +2], and fragment:min_ion_index=2
        (skips b1/b2/y1/y2). Widen the precursor window or enable calibration for larger
        drift (#9088, #9188, #9634).
      - Multi-file searches reuse one fragment index. Added semi-/non-specific search,
        opt-in SNES indexing, open-search modification discovery, FASTA chunking and
        modification-analysis output. Automatic calibration uses a parallel first pass
        and empirical tolerance quantiles (#8414, #9109, #9112, #9122, #9177, #9185,
        #9191, #9224, #9639).
      - Search:decoys supports auto/generate/ignore (default auto), recognizing prefix and
        suffix decoys. PSM and optional picked-protein FDR run after rescoring when enabled;
        protein FDR uses the complete protein set across files (#9123, #9195, #9633,
        #9634, #9644).
      - Standalone -out_pin no longer requires Percolator. Expanded rescoring features include
        isotope error, delta score, matched ion current, candidate-pool statistics and
        complementary-ion evidence. BREAKING: matched_b_ions/matched_y_ions renamed to
        matched_prefix_ions/matched_suffix_ions; scoring now counts all enabled ion series.
        Fixed isotope-aware precursor errors, fragment-error tolerances and adapter lookup
        (#9166, #9167, #9175, #9177, #9188, #9195, #9204, #9970).
      - Added PSM annotations, search diagnostics and an end-of-run report with optional
        -summary_out. Optimized indexing, modification enumeration, scoring and annotation;
        fragment sorting honors -threads/OMP_NUM_THREADS. Failed merged writes preserve
        per-file output; target/decoy-shared peptides no longer break merged idXML
        (#9088, #9094, #9117, #9121, #9197, #9203, #9205, #9642, #9963, #10129).
      - Stop codons ('*') in the database no longer abort ProSE or SimpleSearchEngine. A trailing
        stop codon, as in genome-translated databases such as SGD's, is removed so the C-terminal
        peptide is searched; peptides containing a stop codon or another symbol are skipped like
        X/B/Z (#10262).
      - Spectra activated by electrons (ETD, ECD, EThcD or ETciD, as recorded in the input file)
        are also searched with c and z+1 (z-dot) ions, their main fragments; other spectra, also
        in the same run, are not affected. Switch this off with ions:by_activation. The new
        ions:add_zp1_ions adds z+1 ions for all spectra; ions:add_z_ions generates z ions
        (y - NH3), which miss them. Calibration now scores with the configured ion series instead
        of always b/y.
    PercolatorAdapter:
      - Defaults to in-process Percolator 3.08 rescoring; no executable is required for
        idXML/mzid/idparquet PSM-level FDR. OSW input, peptide/protein-level FDR, -doc and
        -init_weights run the percolator executable automatically, which is then required
        (#9218, #10020). So do the options only the executable implements (-out_pout_*,
        -weights, -quick_validation, -static, -test_each_iteration, -override), which the
        in-process backend ignored; it now writes the -out_pin file itself, and uses three
        threads for -threads 0 instead of one.
      - Both backends preserve input CalcMass and apply -score:fdr/-best_per_spectrum_only
        consistently. Fixed in-process memory leaks and Debug-build Normalizer assertions
        (#9240, #9257, #9997, #10012, #10049, #10057).
    ProteomicsLFQ:
      - BREAKING: automatic per-fraction normalization removed; output selection no longer
        changes intensities. Normalize explicitly with ConsensusMapNormalizer on -out_cxml,
        ProteinQuantification:consensus:normalize or downstream software (#9864, #9880).
      - New -feat_dir checkpoints support resume, distributed -detect_only runs and final
        combination without raw/ID inputs. Requires explicit -design and -fasta; excludes
        spectral_counting. Reuse checks parameters, build, design and input size/mtime;
        -force_recompute refreshes affected runs. -in/-ids are required only for runs
        without reusable checkpoints (#9989).
      - Added PIP-ECHO FDR-controlled match-between-runs with IM-aware matching, local adaptive
        RT windows (disable via -PipEcho:local_rt:enabled false), corrected mass-error/RT
        scoring and isotope-envelope evidence. PipEcho:max_training_points defaults to
        50000 per fold; 0 disables the training cap (#9647, #9669, #9674, #9676, #9680).
      - Bruker .d feature seeding via Biosaur2 and Seeding:algorithm; advanced
        PeptideQuantification:seed_apex_rt_tolerance defaults to 5 s. tree_guided alignment
        is available again; star remains the default (#8752, #9030, #9102).
      - Linking RT tolerance uses the median FWHM across runs of a fraction, independent of
        file order; unmeasurable widths fall back to 30 s. Inconsistent decoy affixes are
        reported. Quantification-score SVM training is reproducibly shuffled before capping
        (#9981, #9982, #9985).
      - Fixed CalcMass preservation, mzTab export of non-string search settings and Biosaur2
        FAIMS processing that lost spectra/chromatograms/settings and crashed downstream
        feature finding (#9666, #9980, #9996, #9998, #10012).
    ProteomicsLFQ and IsobaricWorkflow:
      - Duplicate identifications of one (spectrum, peptidoform, charge) are reduced to the
        best-scoring hit, avoiding duplicate FDR observations, reporter intensities and QPX
        IDs; distinct peptidoforms are retained (#9871).
      - Any supported result output can be requested alone; at least one is required (#9866).
      - Fixed strictly_unique_peptides quantification; proteins with retained evidence are
        represented as singleton groups. IsobaricWorkflow requires peptide uniqueness
        annotations in its input (#9979).
    IsobaricWorkflow:
      - Added TMT 32-/35-plex (identity isotope-correction matrix until calibrated values are
        supplied) and optional -count_sps_matches, recording sps_matched_ions and
        sps_precursor_count (#4792, #9003, #9706).
      - Fixed multi-file mzTab export, MS2 scans without MS3 or preceding MS1, and placeholder
        features for unquantifiable IDs. Real all-zero reporter features are retained;
        consensus column headers preserve fraction/sample design information
        (#8519, #8592, #9817, #9824, #9836).
    OpenNuXL:
      - Localized adducts use named modifications with empirical formulas, including combined
        definitions on already modified residues. idXML, featureXML, consensusXML and the parquet
        bundles carry the definitions for reload; unlocalized hits retain CalcMass. BREAKING: older
        releases without modification-definition support cannot load these files (#9992, #10003).
      - Corrected RNA/DNA UV, DEB, NM and FA preset formulas, ion-series-specific localization
        and shifted-immonium charge annotations (#8766, #9961, #10031).
    PSMFeatureExtractor:
      - Added numeric andes:* rescoring features (#9643).
      - BREAKING: removed multi-search-engine mode; -in takes one file. Removed
        -multiple_search_engines, -concat, -skip_db_check, -impute and -limit_imputation.
        Use ConsensusID to combine search-engine results. PercolatorFeatureSetHelper's
        concatMULTISEPeptideIds, mergeMULTISEPeptideIds, addMULTISEFeatures and
        addCONCATSEFeatures were also removed from C++/Python.
    MapAlignerIdentification, MapAlignerPoseClustering, MapAlignerTreeGuided:
      - BREAKING: MapAlignerIdentification without a reference aligns to the input that shares the
        most identified sequences with every other input, so that each input can be aligned to it;
        ProteomicsLFQ ('star' alignment) and MS1LabeledWorkflow, whose docs already described a
        single reference run, change with it. The per-peptide RT consensus over all inputs used
        before left part of larger RT shifts uncorrected, because every input contributed to the
        consensus it was aligned to. It remains available as 'algorithm:auto_reference consensus',
        and is used when no input shares at least two sequences with every other input. If the
        chosen input leaves other inputs with fewer alignment points than
        'algorithm:auto_reference_min_points' (default 11, the smallest number of points to which
        ProteomicsLFQ and MS1LabeledWorkflow fit an RT model), the other inputs and the consensus
        are tried as the reference as well, and the one that gives the most inputs that many points
        is used (fixes #2541).
      - Optional -in_spectra_files/-out_spectra_files transform mzML alongside maps (#8536).
      - Fixed tree-guided transformation/residual estimates and reference-state leakage
        across repeated identification alignment calls. Pose clustering uses identity
        transforms for unalignable files and reports parallel I/O failures cleanly (#7010).
    OpenSwathWorkflow:
      - Automatic in-memory wave scheduling with batchSize=0; innerBatchSize,
        maxConcurrentSwaths and outer_loop_threads allow tuning. OSW buffering adapts to
        available memory. Added SRM support, priority iRT sampling and Parquet chromatograms
        (#8373, #8569, #8700, #8737, #9190).
      - Precursor/transition IDs are consistent across outputs. PQP/OSWPQ retains stored IDs;
        TraML/TSV is renumbered with original IDs retained as provenance (#9888).
      - Fixed RUN.ID storage/joins, run-ID mismatches, empty compound/gene handling,
        single-transition scoring, mass-error denominators and calibration-option conflicts
        (#8688, #8790, #8830, #8831, #8833, #8869, #9190, #10050, #10055).
    Peak pickers:
      - PeakPickerIM adds Sage IM centroiding via bruker:ms1_centroid_mz_ppm and
        bruker:ms1_centroid_im_pct, plus hill centroiding (-algorithm hill). Fixed shuffled
        IM axes in trace picking, which produced incoherent/split peaks (#9022, #9380, #10051).
      - PeakPickerHiRes allows peak cores without leading flank peaks (#8649).
      - PeakPickerChromatogram: report_sn adds per-peak apex S/N in an SN array
        (default false; unavailable estimates are -1.0) (#9780).
    Feature finding and linking:
      - BREAKING: FeatureFinderIdentification removes -id_ext, svm:*, SVM FDR estimation,
        extract:rt_quantile and FFIDAlgoExternalIDHandler. run() now takes
        (peptides, proteins, features, seeds, spectra_file); external/implied/unknown
        feature categories and rt_delta/predicted_class/FDR_probabilities annotations are
        no longer produced (#9995, #10011).
      - BREAKING: FeatureLinkerUnlabeled/UnlabeledQT/UnlabeledKD/WNet remove -design. Link
        fractions separately and combine with FileMerger -append_method append_cols, or
        use ProteomicsLFQ for fractionated LFQ (#10043).
      - BREAKING: FeatureFinderMultiplex/MultiplexResolver rename missed_cleavages to
        max_nr_labelled_aas (#8911).
      - FeatureFindingMetabo/MetaboliteFeatureDeconvolution add opt-in RT-overlap reference
        options for short isotope/adduct traces; FeatureFindingMetabo adds local_im_range
        for ion mobility (#4483, #8758, #9711).
      - FeatureFinderMetaboIdent accepts an optional Adduct TSV column, including multimers
        (#9382). FeatureFinderCentroided uses about 20% less RAM (#9159).
      - Fixed swapped mass-trace/isotopic-pattern tolerances in FeatureFinderAlgorithmPicked
        and charge-merging crashes in FeatureLinkerUnlabeledKD (#8944, #9247, #9250).
    MultiplexResolver, MS1LabeledWorkflow:
      - BREAKING: `algorithm:mz_tolerance` and `algorithm:rt_tolerance` (re-exported by
        MS1LabeledWorkflow as `resolver:mz_tolerance` / `resolver:rt_tolerance`) are now double
        instead of int, with a minimum of 0.0. They were always read into double members, so a
        fractional value was rejected on the command line and, in an INI file, silently stored as 0 --
        disabling the blacklist proximity check. An INI carrying them as type="int" must be updated
        to type="double" or the tool will refuse to start
    Other tools:
      - CometAdapter merges compatible variable modifications for faster searches and supports
        DDA-PASEF .d input; native-ID translation avoids Comet mzParser crashes (#8407,
        #9126, #9168). SageAdapter thread registration corrected (#8441).
      - SimpleSearchEngine adds semi-/non-specific search and PSM annotations; candidate
        processing scales better across threads (#9112, #9117).
      - AssayGeneratorMetabo now applies its feature/masstrace and precursor m/z/RT filtering
        options, which were previously ignored (#10120).
      - FileConverter adds MSP and sqMass-to-XIC Parquet conversion, plus Bruker aggregation,
        centroiding and range filters. FileInfo adds assigned/unassigned ID counts, FASTA
        sequence statistics and nucleic-acid support; progress logging restored (#8395,
        #8643, #8650, #8829, #9707).
      - TextExporter supports XIC Parquet and fixes USI run resolution; IDMerger preserves
        input order (#8470, #8737, #8738, #9240, #9657).
      - MSstatsConverter exposes -remove_shared_peptides (default true), accepts design
        subsets, and warns, as does ProteomicsLFQ, about BioReplicate IDs shared across
        conditions (paired designs) (#7314, #8846, #9068, #9864).
      - Epifany clarifies -exp_design behavior and reports unidentifiable input as an error
        instead of aborting (#9864, #9901).
      - MetaboliteAdductDecharger adds multimer detection (max_multimer/multimer_log_penalty).
        MetaboliteSpectralMatcher adds optional CCS filtering (ccs_error_percent=0 disables
        it), automatic 1/K0-to-CCS conversion and CCS mzTab columns; missing observed CCS
        does not filter candidates (#8784, #8888, #9412).
      - IDConflictResolver adds rank_aggregation; MaRaClusterAdapter records consensus-spectrum
        origins/cluster size; OpenSwathChromatogramExtractor uses CompoundName for metabolite
        chromatogram identifiers (#8864, #8907, #9271).
  New tools:
    - MS1LabeledWorkflow: one-command quantification of MS1-labeled (SILAC, Dimethyl, ...) experiments,
      the counterpart of ProteomicsLFQ and IsobaricWorkflow: per run FeatureFinderMultiplex, IDMapper,
      IDConflictResolver and MultiplexResolver, then per-fraction alignment and linking (channels kept as
      sub-features, fractions combined column-wise), protein inference/FDR and quantification, written as
      consensusXML, mzTab and/or a QPX collection; optional match between runs (-match_between_runs)
      lets unidentified multiplets take over identifications from other runs. The peptide identity is
      the unlabeled sequence (the label belongs to the channel): label modifications are removed after
      the multiplet resolution and the label state is kept on every identification (labeled_sequence,
      removed_labels, label_channel), reported as mzTab opt_global columns and QPX cv_params; PSM-level
      output (mzTab PSM section, QPX psm view) reports the peptidoform as searched, feature-level
      output the peptide identity. Each column header describes its channel's labels
      (channel_description). A spectrum match mapped onto several multiplets stays with the closest
      one; distinct spectra of one peptide on distinct multiplets are all quantified. The reported quantity
      is the channel ratio, computed as MaxQuant does (median of the evidence ratios per peptide, median
      of the peptide ratios per protein group, a minimum ratio count, and a normalized variant) rather
      than as a ratio of aggregated intensities, so no ProteinQuantifier run is needed for it. The
      reference channel is reported with its ratio of 1.0 wherever another channel was measured
      against it, so a consumer sees a complete set of channels; the
      per-channel abundances are reported next to it as summed intensities. Checks up front that
      the labels were searched as modifications, that the design enumerates the channels of -labels,
      and that -out_qpx is only requested for labels in the QPX vocabulary (#10044).
      Channel/pattern order and unique input/design basenames are validated before processing.
      Native Thermo RAW input is supported with WITH_THERMO_RAW and a .NET 8+ runtime;
      scan metadata and MS1 peaks are extracted in one RAW read, including spectrum-reference repair.
      FAIMS CVs are preserved through ID mapping, multiplet completion and linking. A protein's
      reference-channel ratio requires a comparison passing min_ratio_count in that fraction group (#10047).
    - FeatureLinkerWNet: Wasserstein network-flow grouping across label-free maps; optional,
      built with WITH_WNETALIGN=ON (#8992, #10255).
    - UniPEFF: UniProtKB XML-to-PEFF conversion with sequence, modification, variant and
      disulfide-bond annotations; disulfide connectivity is reported by default via bond-ordered
      half-cystine labels; optional global annotation identifiers and external
      unimod.obo (#9649, #9829). UniProt isoforms are reconstructed from their splice-variant
      features and emitted as additional entries after the parent entry, with the features
      UniProt annotates on that isoform; disable with -omit_isoforms (#9966, fixes #9830).
    - OpenSwathInfer: peptidoform, peptide, protein and gene inference (#9280).
    - OpenSwathExport: TSV/Parquet result export (#9377).
    - OpenSwathPercolatorScoring: Percolator scoring of OpenSWATH results (#9695).
    - OpenSwathPeakMapExtractor: targeted full-peakmap extraction (#9684).
    - TransitionListEvidenceFilter: filter transition lists using mzML evidence (#9161).
    - DIAuditor: quality metrics of DIA runs per run and per isolation window (MS1 sampling,
      window layout incl. FAIMS/1/K0, cycle times, TIC and peak-count distributions), a
      re-implementation of D. L. Tabb's DIAuditor. Reads mzML, Thermo .raw and Bruker timsTOF .d
      (diaPASEF) and writes its per-run and per-window tables and an mzQC file with the PSI-MS
      DIA metrics (MS:4000190-MS:4000199). Warns when spectra carry several isolation windows
      (e.g. MSX; demultiplex first) and when diaPASEF windows have an ion mobility array but no
      ion mobility range, as TIMSCONVERT writes them, so windows differing only in ion mobility
      count as one (#10271, #10312).
    - ParquetDiff: compares two Parquet tables by primary key with a numeric tolerance instead of exact
      bytes. FuzzyDiff is string-based and cannot read Parquet, which left the QPX psm/feature/pg exchange
      surface with no comparison route at all. The key is auto-derived from a QPX file's own file_type
      metadata or given explicitly via -pk for any table; matched rows are compared cell-by-cell recursing
      into list/struct columns, and schema drift (added/removed/retyped columns) is reported separately
      from value drift. Tolerance mirrors FuzzyStringComparator -- either -ratio or -absdiff must hold, so
      a zero-vs-epsilon comparison stays expressible -- and two NaNs compare equal. List-valued key columns
      (e.g. QPX's grouped_runs) are canonicalized by sorting before matching, and a duplicate primary key
      is reported as an error in its own right. -schema validates a single file against a named QPX view
      instead of diffing two files. Exit code is EXECUTION_OK when the comparison (or -schema validation)
      passes and every input holds at least -min_rows rows, if set; otherwise INCOMPATIBLE_INPUT_DATA, so it
      drops into CTest the way FuzzyDiff does (#9865, part of #9864)
    - ParquetConverter: converts featureXML and consensusXML files to Parquet directories and
      back (#8970).
  Removed tools:
    - BREAKING: GenericWrapper and its external-tool definitions removed; use direct TOPP
      invocations or TOPPAS workflows (#8981, #9735).
    - BREAKING: QuantmsIOConverter removed (renamed QPXConverter in #8756, then removed). QPX
      output comes from the -out_qpx option of ProteomicsLFQ, IsobaricWorkflow, MS1LabeledWorkflow,
      ProteinQuantifier and ProSE; the QPXFile export API remains (#9693).
    - BREAKING: TriqlerConverter, ProteomicsLFQ -out_triqler and TriqlerFile removed. Use
      -out_msstats, or convert -out_cxml/-out_qpx downstream (#9898).

GUI tools:
  - TOPPView/TOPPAS accept generic Qt command-line options. TOPPView shows selectable MS2
    precursor markers and isolation windows in 2D; the splash screen is dismissible
    (#4963, #9715, #9723).
  - Fixed TOPPAS shutdown crashes, TOPPView extreme-zoom crashes and large-file context-menu
    delays, non-string metadata conversion, Windows spinbox sizing and Annotation1DItem
    DLL exports (#8997, #9206, #9263, #9723, #9831).
  - Fragment annotations survive viewing and spectrum switches unchanged, including charge
    notation and multiline comments. Corrected duplicate charge display, neutral-loss ion
    ordinals and sequence diagrams with multiple modifications (#8766).
  - TOPPView's scan list shows each MSn scan under the scan its precursor refers to (mzML
    spectrumRef), so SPS-MS3 scans that are interleaved with later MS2 scans appear under their
    own MS2 scan. MS2 scans that follow an MS3 scan are no longer nested under the previous MS2
    scan (#4215).
  - BREAKING: SwathWizard and FLASHDeconvWizard removed; run the TOPP tools they wrapped,
    such as OpenSwathWorkflow and FLASHDeconv, directly (#9472).

OpenMS Library:
  - mzML: read and write Zstandard (zstd) compressed binary data arrays (MS:1003780 zstd,
    MS:1003781 byte-shuffled zstd, MS:1003782 dictionary-encoded zstd and MS:1003783-MS:1003785
    MS-Numpress followed by zstd). Writing is enabled with PeakFileOptions::setZstdCompression(),
    FileConverter -zstd_compression or FileFilter -peak_options:zstd_compression (#9033).
  - Added GlycanStructure and TheoreticalGlycanSpectrumGenerator for composition-based
    diagnostic/oxonium and bounded B/Y/C/Z ions, structural and internal glycan fragments,
    and HCD/ETD/EThcD glycopeptide backbone retention with configurable stubs (#10176, #10204).
    Includes mzPAF annotations, neutral losses, resource limits, and pyOpenMS bindings.
  - Added DIon, VIon and WIon to Residue::ResidueType, with side-chain loss methods on Residue,
    fragment mass calculation in AASequence and MzPAF, TraML support and pyOpenMS bindings (#10175).
  Added:
    - File type aliases are now honoured end to end: TOPP tools accept an alias wherever they accept
      the preferred extension (and a tool declaring an alias accepts the preferred extension),
      TOPPAS connects tools and input-file lists by format rather than by literal suffix, GUI file
      dialogs offer every accepted extension ('FASTA file (*.fasta *.fa *.faa)'), and INI/CTD
      supported_formats list them for input parameters. Output parameters keep the single canonical
      extension, so what OpenMS writes is unchanged (#490)
    - FileTypes::sameFormat() compares two declared format strings by type when both are recognized and
      literally otherwise, so 'fasta' matches 'fa' while two different custom extensions stay distinct.
      FileTypes::supportsCompressedReading(type, compression) reports whether a reader accepts that
      specific container, and FileNameUtils::compressionType() reports which container a filename
      carries (hasCompressionSuffix() answers the same question as a bool). The pair takes the
      container because support is not uniform: the XML-based readers decompress .gz, .bz2 and .zip
      transparently through CompressedInputSource (except the mzIdentML reader, which parses the
      file itself and cannot read a compressed one), while Bruker TDF accepts only a '.d.zip' archive
      that BrukerTimsFile unpacks. A compression suffix alone therefore no longer implies compatibility,
      so '.mgf.gz' is rejected where '.mzML.gz' is accepted, and both the CLI and TOPPAS apply the
      same rule. Compressed output is unaffected: XMLFile still selects gzip/bzip2 by filename (#490)
    - FileTypes::supportsCompressedWriting(type, compression) is the writing counterpart: XMLFile
      compresses the formats marked with the new FileProperties::COMPRESSED_WRITEABLE with gzip or
      bzip2 and never writes a ZIP archive, while an OSWPQ bundle is always one. TOPPBase uses it to
      refuse output names whose writer would store plain data under them (#10317)
    - FileTypes: a file type may now register additional accepted extensions besides its preferred
      one. FileTypes::typeToExtensions() lists them (preferred first) and nameToType() resolves them
      case-insensitively: 'fa'/'faa' for FASTA, 'pep.xml' for pepXML, 'prot.xml' for protXML and
      'pqt' for parquet. typeToName() still returns the single preferred extension, which is what
      OpenMS writes, and formats that merely share an extension family (e.g. CSV and TSV) remain
      distinct types (#490)
    - MultiplexResolverAlgorithm: the multiplet completion and quant/ID conflict resolution of the
      MultiplexResolver tool as a library class (DefaultParamHandler with the tool's 'algorithm' and
      'labels' sections), shared by MultiplexResolver and MS1LabeledWorkflow (#10044)
    - ProteinGroupArrowExport: the QPX pg view fills its previously empty additional_intensities column
      with the channel ratio of that (protein group, fraction group, label) -- named ratio and
      ratio_normalized under the row's own channel label -- and the number of contributing peptides
      with cv_params/ratio_count, when the producer annotated them (MS1LabeledWorkflow does). Rows
      without them are written as before (#10044)
    - MS1LabelState: the label-state meta values of an MS1-labeled identification (labeled_sequence,
      removed_labels, label_channel) and the peptidoform a hit was matched with. The mzTab PSM
      section and the QPX psm view report that matched peptidoform (and derive the psm identity
      from it); the QPX feature and psm views write the three values to the previously empty
      cv_params column (ArrowIOHelpers::qpxCvParams). Identifications without a label state are
      exported as before (#10044)
    - BrukerTimsFile (WITH_OPENTIMS): DDA-/DIA-PASEF and raw 4D access, tiered scan-to-1/K0
      calibration, optional neighboring-MS1-frame aggregation, IM hill centroiding and
      frame/RT filtering. Range-limited reads reduce I/O/memory; aggregation is faster.
      DDA native IDs use 'frame=... scan=... precursor=...' for unique identification;
      exported PASEF spectra are marked CENTROID (#8975, #8999, #9151, #9154, #9233,
      #9243, #9380, #9387).
    - ThermoRawFile: native .raw reading with openms-thermo-bridge 0.3.1 and .NET 8+.
      Preserves sample/method/trailer metadata, SHA-1 provenance, scan/instrument metadata,
      MSn/SPS precursor hierarchy and supplemental activation. Optional centroid charges,
      independent noise arrays and auxiliary detector/PDA data support mzML export.
      Fixed mixed-activation hierarchy reconstruction. Managed assemblies are installed
      with OpenMS; OPENMS_THERMO_MANAGED_DIR overrides their location (#9389, #9623,
      #10070, #10077, #10079).
    - Imaging: IonImage, MSImagingGeometry/Region/Experiment, imzML read/write and on-disc
      access, streaming consumers, multi-region extraction and Bruker MALDI .d support.
      imzML preserves auxiliary float arrays/IM units; warns about unsupported integer/
      string arrays and duplicate pixels (first spectrum used for geometry, all remain
      index-accessible). Both loaders reject zlib-compressed m/z/intensity arrays
      (#9381, #9383, #9521, #9654, #9903, #9908, #10002).
    - Native Parquet: PSMArrowIO, FeatureMapArrowIO, ConsensusMapArrowIO, ArrowSchemaRegistry,
      ArrowExport and ProteinGroupArrowExport. Preserves map metadata/unique IDs and
      identification run links; rejects duplicate run IDs and dangling feature references.
      Native bundles no longer claim a QPX version (#8655, #8970, #8973, #9225, #9232,
      #9242, #9864).
    - Percolator: in-process rescoring with combined or separate training/scoring and model
      persistence. Calls across instances must be serialized because of process-wide
      Percolator state (#9218).
    - OpenSWATH: reusable inference/export APIs ported from PyProphet; KDE, ranking and
      multiple-testing statistics; workflow scheduling, memory-aware OSW output and
      CalibrationWorkflow. Calibration RT windows default to 60-600 s (set either bound
      to 0 to disable it). Added .oswpq archives, .xic chromatograms, .xim mobilograms,
      per-compound RT ranges and a FAIMS-aware adapter for pre-loaded experiments
      (#8524, #8737, #8743, #8813, #8871, #9190, #9271, #9280, #9377, #9842, #9932).
    - PipEchoAlgorithm exposes the new match-between-runs method (#9647).
    - FeatureGroupingAlgorithmWNet/WNetMatcher expose the Wasserstein grouping methods;
      optional, built with WITH_WNETALIGN=ON (#8992, #10255).
    - Optional C++ ONNX predictors for AlphaPeptDeep RT, MS2 and CCS models, with verified
      model downloads and AASequence-based modification support. Unsupported modifications
      are rejected; Python bindings are not yet available (#9453, #9765).
    - Standards: ProForma v2 parsing/serialization (LOSSLESS/CANONICAL), AASequence
      conversion, mass calculation and JSON support; MzPAF peak annotations; USI parsing/
      construction; SpectrumNativeIDParser (#8637, #8648, #8684, #8686).
    - MzPAF accepts and writes d/v/w satellite ions and the da/db/wa/wb subtypes,
      including validation, peak annotation conversion and pyOpenMS bindings (#10175).
      Satellite mass calculations use d = a + H - radical side-chain loss and
      v = y - HR. Direct residue/sequence mass and formula APIs reject unsupported
      or modified cleavage residues instead of returning the parent-ion mass.
      Theoretical spectrum generation for satellite ions remains unsupported.
    - Added IsoelectricPoint, hydrophobicity profiles, protein SequenceCoverage,
      ModifiedSincSmoother, programmatic FileInfo, CCS conversion and MSExperiment
      rasterization. Extended PeakFileOptions and on-disc filtering, peak annotations,
      LightTransition APIs, MetaInfo iteration and ParamIterator STL support
      (#8217, #8362, #8421, #8512, #8526, #8544, #8621, #8728, #8735, #8739,
      #9179, #9419, #9602).
    - IMPeakType tracks IM processing state independently of layout; IMFormat::CENTROIDED
      is deprecated. IM units are recognized across vendor array naming conventions
      (#9007, #9181).
    - I/O: MGF SEQ fields round-trip; MSP reads numeric CCS and long lines; consensusXML
      preserves protein-group abundance arrays. PeptideIndexer settings and upstream
      IDMapper processing metadata are retained (#8489, #8816, #8852, #9186, #9844).
  API and behavior changes:
    - XMLFile::save_() matches the .gz/.bz2 suffix in any letter case (FileNameUtils::compressionType()),
      as input handling does, so 'x.mzML.GZ' is written gzip-compressed rather than plain.
      MSDataWritingConsumer and PlainMSDataWritingConsumer throw Exception::UnableToCreateFile for a
      file name ending in .gz, .bz2 or .zip: they stream uncompressed mzML, which such a name would
      mislabel. Use MzMLFile::store() for compressed mzML (#10317).
    - BREAKING: File settings methods move to SystemSettings (getSystemParameters,
      getTempDirectory, getUserDirectory, findDatabase, getOpenMSHomePath,
      getOpenMSConfigDir). File::TempDir becomes TempDir; File::getTemporaryFile becomes
      TempFiles::getTemporaryFile. Old C++ entry points are removed (#10083).
    - BREAKING: XMLHandler no longer derives from xercesc::DefaultHandler; use
      onStartElement(const char16_t*, const XMLAttributes&), onEndElement() and
      onCharacters(). Matrix<T> uses std::vector storage and no longer inherits Eigen
      (#8511, #8547, #8558, #9712, #9737).
    - BREAKING: database getInstance() methods return const pointers (ElementDB, ResidueDB,
      ModificationsDB, CrossLinksDB, RibonucleotideDB, MonosaccharideDB, ProteaseDB and
      RNaseDB); use const T* or auto. Runtime modification interning is thread-safe.
      ElementDB::addElement() removed: use local CoarseIsotopePatternGenerator::
      setIsotopeOverride(element, distribution), avoiding global isotope-state mutation.
    - BREAKING: PeptideIdentification::get/setBaseName removed; use the run's
      setPrimaryMSRunPath() and IdentifierMSRunMapper. IDFilter::updateProteinReferences
      renamed to removeDanglingProteinReferences; Exception::InvalidSize requires a
      context message (#8500, #8437, #9660).
    - BREAKING: FileWatcher moved from SYSTEM to VISUAL; plain metadata/platform enums
      became enum classes; PeptideAndProteinQuant channel IDs are UInt; ChromatogramPeak
      intensity changed from double to float (#8516, #8591, #8622, #8857).
    - BREAKING: IMFormat::CONCATENATED/MULTIPLE_SPECTRA renamed to IM_PEAK/IM_SPECTRUM;
      MIXED removed. determineIMFormat(experiment, ms_level) requires an explicit MS level
      (#8993, #9011).
    - BREAKING: QuantmsIO renamed to QPXFile; LinearResampler removed in favor of
      LinearResamplerAlign (#8756, #9153).
    - BREAKING: OpenSwath::Scoring removes pointer/C-array overloads of NormalizedManhattanDist,
      RootMeanSquareDeviation, SpectralAngle, normalize_sum and calcxcorr_legacy_mquest_;
      use std::vector overloads. ChromatogramExtractor::prepare_coordinates(TargetedExperiment)
      removed; convert via OpenSwathDataAccessHelper::convertTargetedExp and use
      LightTargetedExperiment (Python API unchanged) (#9252, #9271).
    - BREAKING: NeighborSeq owns its peptide vector, fixing dangling references but changing
      class layout; C++ consumers must rebuild. IDBoostGraph rejects missing target_decoy
      annotations; BayesianProteinInferenceAlgorithm requires one merged identification
      run (#8480, #9488, #9613).
    - Charged EmpiricalFormula isotope generation retains its 3.x implicit-hydrogen behavior
      with a deprecation warning; use addChargeAdduct(count, adduct="H") for the explicit
      replacement before OpenMS 4.0 (#4449, #9714, #9719).
    - SignalToNoiseEstimatorMedian interpolates within histogram bins (floor 1), changing
      S/N-derived peak-picking/scoring results. Corrected MassTrace FWHM interpolation
      affects feature widths, peak filtering, linking tolerances and some quantified
      intensities; traces must be sorted along their x axis (#9781, #9967, #10052).
    - EMGScoring init_mom now defaults to true; enzyme definitions are built in and
      Enzymes.xml is optional. Warnings go to stderr; logging and DataValue conversion
      diagnostics improved (#8409, #8572, #8593, #8620, #8754).
    - ParamEntry::isBool() centralizes boolean-parameter recognition; ThermoRawFileMetadata
      exposes typed ThermoScan/ThermoReaction/ThermoPrecursor access (#10084, #10116).
    - OpenMSTestFramework is a separate static library: tests/FuzzyDiff users must link it.
      Temporary-output schema validation is explicit via VALIDATE_TMP_FILES; test projects
      register unique-ID/exception support. OpenMS_locale removed (#9929).
  Performance:
    - Faster decharging, peptide indexing/resolution, precursor purity/correction, OpenSWATH
      scoring and cross-correlation, plus fewer copies in search and extraction loops.
      AccurateMassSearchEngine honors observed-adduct-only searches; mzIdentML caches CV
      lookups and supports schema 1.3. Parquet PSM/metadata export avoids repeated scans and
      registry locking (#4787, #5867, #8618, #8635, #8651, #8656, #8763, #8764,
      #8785, #8787, #8806, #8848, #8849, #9686, #9689, #9692, #9801).

Fixes:
  Chemistry and identifications:
    - PercolatorAdapter's in-process backend and Percolator::rescore() read a feature stored as
      a string meta value as the number it holds, as the percolator executable does when it
      parses the .pin file. Both went through DataValue's conversion to double, which yields an
      unrelated number for a string: SageAdapter stores all of Sage's extra features as strings,
      so they were constant and Percolator weighted them zero, losing identifications (on a small
      dataset, every PSM). A feature value that is not a finite number is now an error, as for
      the executable (#10310).
    - MatchedIterator no longer stops at the first of two target elements with the same value
      (e.g. two peaks with the same m/z). HyperScore, PScore, AScore, SpectrumAlignment (ppm) and
      the QC metrics FragmentMassError and PSMExplainedIonCurrent ignored all peaks above such a
      pair, so ProSE and SimpleSearchEngine mis-scored spectra with duplicate peaks. (#10291)
    - MzIdentMLFile: search engine scores without a score order in the PSI-MS vocabulary take
      it from OpenMS' score registry, so Comet:expectation value, X!Tandem:expect, OMSSA:evalue,
      OMSSA:pvalue, percolator:Q value and percolator:PEP are read as lower-is-better. Such
      lower-is-better engine scores yield to a PSM-level q-value, which is then used. The
      registry (Scores) now lists the X!Tandem and OMSSA scores by accession, so QPX and Arrow
      exports also report them as additional scores (#8691).
    - Fixed signed/stacked unknown mass shifts, precision-aware mass matching and spurious
      zero-mass PSI-MOD assignments. Distinct modified residues remain distinct and
      mass/formula round-trips no longer silently change peptidoforms (#10006, #10007,
      #10010, #10029).
    - Fixed UniMod ICAT formulas and site-specific neutral-loss masses; ProForma Formula
      tags, anonymous mass shifts and stacked modifications retain mass/chemistry instead
      of being dropped or serialized as empty brackets (#10003, #10026, #10030).
    - QPX import reports unsupported modifications and checks reconstructed m/z. Modification
      definitions are still not carried by the format, so unsupported modifications may
      still be lost on import (#10004, #10012).
    - AASequence::getFormula() and AASequence::getMonoWeight() handle Residue::Zp1Ion and
      Residue::Zp2Ion, the radical z+1/z+2 electron-transfer fragments. Both types used to fall
      through to the default branch, which logs an error and returns the internal mass without any
      ion offset, and a C-terminal modification was never applied to them. getAverageWeight() and
      getMZ() build on those two functions and are fixed with them (#10181).
    - Corrected a/b neutral-loss fragment masses, negative-charge MzPAF parsing and
      deisotoping precursor constraints (proton mass units; unknown precursor charge no
      longer discards all isotope clusters). Unsupported deisotoping tolerances no longer
      abort ProSE/SimpleSearchEngine (#9078, #9084, #9620, #10067, #10075).
    - Fixed peptide-indexing crashes on short peptides, NucleicAcidSearchEngine multi-hit
      handling, modified-sequence decoy duplicate detection, and copy operations on spectrum
      generators, SpectrumAnnotator and Normalizer (#532, #8542, #8569, #8575, #8685, #10066).
    - PeptideIndexer no longer exhausts memory when a peptide hit carries an empty sequence
      (an empty AASequence, or one consisting of stop codons only). The empty needle flagged
      the root node of the Aho-Corasick trie as a hit, and since the root's suffix link points
      to itself, the search collected hits until memory ran out. ACTrie::addNeedle() now skips
      an empty needle with a warning, but still consumes a needle index, so the peptide indices
      of the caller stay aligned and such hits are simply reported as unmatched (#2987).
    - PeptideIndexer: ACTrieState returns empty hits when no query was set instead of crashing
      (potentially happens when the number of threads is larger than number of proteins) (#10257)
    - Fixed the m/z of H2O/NH3 neutral-loss peaks of x/y/z linear ions at charge >= 2 in
      TheoreticalSpectrumGeneratorXLMS and SimpleTSGXLMS: the loss was subtracted from the already
      charge-divided position and divided by the charge again, so these peaks sat at roughly half
      their true m/z. OpenPepXL scores and annotations of such peaks change accordingly (#10148).
    - TheoreticalSpectrumGeneratorXLMS placed the second isotope peak of the precursor (and of its
      H2O/NH3 losses) at the charged mass instead of its m/z, e.g. about 2003 instead of 668 for a
      2000 Da precursor at charge 3. OpenPepXL uses these peaks: on the test data only its
      log_occupancy scores change; on other data the corrected peak can now match an experimental
      peak and change matched ion counts and scores (#10194).
    - ConsensusID rejected a single empty idXML run (valid XML with no peptide identifications)
      and dropped search settings when combining empty runs; per-spectrum runs also lost their
      MS-file metadata, and unannotated feature/consensus maps could crash. Empty runs, and
      entirely empty input in RT/mz mode, now keep their original search settings and
      spectra_data instead of being discarded (#10203).
    - MaRaClusterAdapter passes -precursor_tolerance_units on to MaRaCluster. It appended the
      unit's index as a digit instead, so 20 ppm reached MaRaCluster as '-p 20.00' and 0.05 Da
      as '-p 0.051', which MaRaCluster reads as 0.051 ppm: a tolerance in Da was never applied.
  Quantification and numerical correctness:
    - IsobaricWorkflow wrote every consensus feature with the same id ("e_0"), which is invalid
      consensusXML (consensusElement/@id is xs:ID); each feature now gets its own unique ID
      (#10201).
    - ExperimentalDesign mappings use sample names consistently. Protein-group quantities
      survive ID filtering; ProtXML excludes ProteinProphet's unneeded/subsumed groups
      (#6038, #8960, #9874).
    - Fixed SimpleSVM constant-predictor indexing, degenerate EMG fits, NaN similarity scores,
      small-sample quantiles/variance, ROCCurve negative cutoffs and FragmentMassError ppm
      variance. Corrected DistanceMatrix cache invalidation/comparison and empty-cell
      clustering access (#6239, #9488, #9495, #9497, #9594, #9610, #9617, #9618,
      #9659, #9661, #9664, #9670, #9682).
    - MRMFeatureSelector works with GLPK; LP/ILP failures now report status and throw instead
      of returning silently empty results in feature selection/decharging (#9940, #9944,
      #9956).
    - MapAlignmentAlgorithmKD::filterCCs_ (used by FeatureGroupingAlgorithmKD, i.e. by
      FeatureLinkerUnlabeledKD) rejected a connected component containing conflicting nonzero
      charge states only via a continue that escaped the inner charge-scanning loop, so the
      component still passed the conflict check and was grouped. Such components are now
      correctly rejected, which changes alignment and linking results (#10157).
    - MassTrace::updateWeightedMeanRT() weighted each peak by the RT distance to its
      predecessor and started the sum at the second peak, so the first peak contributed to
      neither the numerator nor the denominator. The centroid was biased towards later RT
      and, for a two-point trace, was always the RT of the second peak whatever the
      intensities. The intensity-weighted mean now uses mid-interval (trapezoidal) weights
      over all peaks, which changes RT positions on the 'epd:enabled=false' path of
      FeatureFinderMetabo and MassTraceExtractor (#2777, #10225).
  Data integrity and I/O:
    - Sorting/filtering/set_peaks keeps peak annotations and binary arrays aligned in
      spectra, chromatograms and mobilograms. select() checks bounds before mutation;
      selectUnchecked() is available for validated C++ indices. Python raises IndexError
      for invalid indices and ValueError for duplicates (#8645, #9795, #9807).
    - MSExperiment::reset clears chromatograms; missing named protein data arrays/targeted
      references throw ElementNotFound. Fixed stale targeted-reference caches and null
      prediction access (#9488, #9492, #9211).
    - mzML metadata round-trips preserve UTF-8, whitespace, timestamps, independent noise
      grids, detector types/units and precursor-intensity units (#10077, #10079).
    - MzMLFile writes activation and analyzer terms that are valid with PSI-MS 4.2.2. EThcD or
      ETciD without a supplemental activation term also gets the generic dissociation method,
      as PSI-MS now lists combined methods as activation attributes. SWIFT, cyclotron and
      ion-storage analyzers, and the analyzer invented for incomplete instruments, use the
      generic mass analyzer type; the OpenMS type is kept in a userParam and restored on
      reading. HCID, EThcD and ETciD terms use their PSI-MS names (#8691).
    - Reading an mzML file only partly (metadata only, or counting its spectra, as the first pass of
      MzMLFile::transform() does) ends the progress it started, so the progress output of every later
      file is no longer nested one level deeper (#10271).
    - mzML chromatograms are written with a precursor or product only if they have one. A TIC used
      to get an empty precursor and a product isolation window at m/z 0, and an MS1 chromatogram such
      a product. The original DIAuditor, for example, read that product's isolation window as the
      last spectrum's and crashed (#10271).
    - mzML: the mass resolving power (MS:1000800) is written in the scan, the only place mzML allows
      it. It used to be written as a userParam of the spectrum, so other readers, such as the
      original DIAuditor, lost it once a file had been written by OpenMS (#10313).
    - Thermo .raw: spectra carry the mass resolving power of the scan trailer ('Orbitrap
      Resolution:', else 'FT Resolution:'), as msconvert reports it (#10313).
    - Bruker timsTOF .d: the start of the acquisition (with its time zone), the instrument model and
      its serial number are read from analysis.tdf (#10313).
    - mzML: the other scan attributes the reader keeps with the spectrum (filter string, preset scan
      configuration, dwell time, scan rate, mass resolution, elution time, analyzer scan offset and
      interchannel delay) are written in the scan as well, and scan terms it keeps under their
      accession, such as the ion injection time (MS:1000927), as CV terms. Both used to be written
      as userParams, which other readers do not find.
    - Fixed INI required/advanced parsing, XQuest FDR-type restoration, mzIdentML missing
      modification locations, PepXML source-run paths/redundant Comet scores and duplicate
      IDMapper spectrum references (#5443, #8905, #9089, #9660, #9763, #9766).
    - TOPP tools no longer exit with ILLEGAL_PARAMETERS when the file given via '-ini'
      contains a tool-specific 'common:<ToolName>:' section; it was merged twice and its
      entries were then rejected as unknown parameters. Those values now override 'common:'
      as documented (#10126).
    - PQP/sqMass SQL writes use bound parameters, preventing quoted-string failures and SQL
      injection. Parquet writers remove incomplete outputs; OpenSWATH Arrow errors throw
      contextual exceptions instead of aborting. Fixed mixed-IPF target/decoy labeling
      and unified XIC/XIM reading (#9691, #9730, #9734, #9739, #9778, #9862).
    - Fixed chromatogram MS1-isotope extraction, empty-spectrum mass/IM correction and
      metabolite-library GNPS/COMPOUND_NAME compatibility (#7284, #8163, #9270, #9386).
    - The MGF reader (MascotGenericFile) starts every BEGIN IONS block from a fresh spectrum:
      fields absent from a block (CHARGE, RTINSECONDS, the PEPMASS intensity, MSLEVEL, NAME,
      SMILES, INCHI, ...) no longer inherit the previous block's values, and a block without
      peak lines is read as an empty spectrum instead of being merged with the next block or
      dropped at the end of the file (#10148).
    - MzIdentMLFile: loading a Peptide whose PeptideSequence element is empty (as written for a hit
      with an empty sequence) no longer crashes with a null-pointer dereference; the reader stores an
      empty sequence for it instead. Sequences held in a CDATA section or preceded by a comment inside
      the element are now read instead of being discarded (#10148).
    - ExperimentalDesignFile rejects a data row with the wrong number of cells with a ParseError
      naming the line and the expected/actual count, before the row is indexed. A row ending in
      an empty cell is one cell short after trimming and was read past its end, which crashed
      ProteomicsLFQ/MSstatsConverter or put garbage into MSstats/Triqler condition and replicate
      columns. SampleSection::getFactorValue throws MissingInformation for a row without a value
      for the factor instead of reading past its end (#10148).
    - UniPEFF wrote UniProt features whose <location sequence="..."> names another isoform
      as annotations of the canonical entry, although their coordinates refer to that isoform
      (e.g. \ModResPsi phosphoserines on non-S residues or past the sequence end). Such
      features now go to the entry of their isoform when UniPEFF writes one; otherwise they
      are skipped and counted in a summary log line.
    - IDFileConverter: pepXML input with 'mz_file' failed with "Found no experiment with name" unless
      the run's 'base_name' ended with the exact path given. This broke TPP results on Windows (TPP
      writes 'c:/...', the tool got 'c:\...'), moved data and OpenMS' own pepXML output, which stores
      the file name only. 'mz_file' is now matched by its file name; 'mz_name' can give more of the
      path. PepXMLFile matches the experiment name against whole trailing path components of
      'base_name', treating '/' and '\' alike, so 'LN1' no longer selects both 'L_LN1' and 'H_LN1'.
      A name that matches runs with different 'base_name's is an error, and the not-found error lists
      the 'base_name's in the file (#3502).
  Robustness:
    - mzIdentML writer: the "unknown modification" cvParam (MS:1001460) referenced the undeclared
      controlled vocabulary "MS", although the document declares only "PSI-MS". The writer names
      every other cvParam PSI-MS; this one now does too, so files with an unrecognized
      modification validate against strict readers that check cvRef against the declared
      vocabularies (#10245).
    - NuXLDeisotoper (a copy of Deisotoper::deisotopeAndSingleCharge) applies the two precursor mass
      fixes already made to Deisotoper: a precursor with unknown charge (0) no longer enables the
      mass constraint with a neutral mass of 0, which rejected every fragment cluster, and neutral
      masses are computed with PROTON_MASS_U (the proton mass in Da) instead of PROTON_MASS (the
      proton mass in kg), which had made every mass about 1 u per charge too high
      (#10073, #10075, #10231).
    - SpectrumCheapDPCorr::operator()(x, y) declared a local "bool keeppeaks_" that shadowed the
      member of the same name, so the member itself was never assigned: dynprog_(), which resolves
      ambiguous many-to-many peak alignments, read uninitialized memory instead of the keeppeaks
      parameter when deciding whether to keep unaligned peaks in the consensus spectrum.
    - PeakPickerMobilogram::remove_overlapping_ (the cached form of the remove_overlapping_peaks
      parameter) was declared but never assigned in updateMembers_(), so overlapping peak
      boundaries were merged or not depending on uninitialized memory, regardless of what the
      parameter was set to. It is now read like every other cached parameter.
    - mzIdentML output with more than one identification run repeated the Measure ids
      (Measure_mz, Measure_int, Measure_error) in every SpectrumIdentificationList and failed schema
      validation; the Measure definitions are now written once (#10213).
    - Chromatograms built from MS1 spectra (FileConverter -convert_to_chromatograms, e.g. on GC-MS/SIM
      data) had no native ID, so the mzML output contained many chromatograms with id="" and failed
      schema validation. They are now named "XIC mz=<m/z>" (#10214).
    - MSExperiment::sortSpectra() keeps spectra with equal retention time in their input order.
      std::sort gave no guarantee for them, so ion mobility frames, FAIMS splits and Bruker TIMS
      data were reordered depending on the standard library, which silently corrupted mass traces
      built over such a map. The sort is also faster now, because it moves an index instead of a
      whole spectrum (#10054, #10220).
    - FLASHDeconv skips spectra with a non-positive mzml_mass_charge value instead of crashing on them,
      and logs a warning. TOPPASEdge falls back to extension-based file type detection when
      content-based detection returns UNKNOWN, and no longer mishandles an edge whose referenced
      vertex was removed (#9054).
    - QPX export names the offending values when it refuses a duplicated primary key, and says
      whether the duplicate is a repeated identification or a run/scan value that does not
      identify a spectrum, instead of only reporting a Parquet row index (#9895).
    - FileMerger renamed the merged spectra but left precursor spectrumRef attributes pointing to the
      original native IDs, so MS2 spectra lost the link to their parent scan and the mzML output
      failed schema validation. The references are now updated together with the IDs (#10200).
    - BREAKING: FileHandler/FileNameUtils::stripExtension() now removes the whole recognized
      extension instead of searching the path for the canonical type name. 'a.pep.xml' yields 'a'
      rather than 'a.pep', and 'a.pep.xml.gz' yields 'a' rather than 'a.pep.xml'. File::extension()
      reports the same span ('.pep.xml'), and an extensionless file in a dotted directory
      ('/my.dir/fid') is no longer truncated. swapExtension() follows (#490).
    - File::writable checks no longer delete concurrently created files or report spurious
      failures; temporary directories are claimed atomically. UUID/unique-ID generation
      avoids weak-entropy/parallel-process collisions (#8678, #9703, #9937, #9940, #9941, #9965).
    - Fixed concurrent logging heap corruption, stream restoration and scoped suppression;
      update checks tolerate unwritable home directories (#8440, #9074, #9075, #9583, #10019).
    - Fixed ARM64 Base64 alignment, invalid EICExtractor/MetaProSIP size parameters and
      boundary/serialization defects including empty-range accesses and unbounded loops
      (#8689, #9767, #9775, #9776, #9790).
    - ConsensusMap::split() used raw map indices to address its result vector, so a
      consensusXML with column ids other than 0..n-1 (e.g. FileFilter -consensus:map 0 3
      followed by QualityControl) wrote past the end of the vector. Feature maps are now placed
      by column position (key order); an index with no column raises ElementNotFound (#10148).
    - MapConversion::convert(PeakMap -> ConsensusMap) capped the number of peaks by
      MSExperiment::getSize() (all MS levels plus chromatogram points) although it collects MS1
      peaks only, so MapAlignerPoseClustering with max_num_peaks_considered -1 (or above the MS1
      peak count) on runs with MS2 spectra sorted and copied past the end of a vector (#10148).
    - StringUtils::skipWhitespace(string_view) and skipNonWhitespace(string_view) returned the
      scanned length as int; for inputs longer than INT_MAX characters the value wrapped
      negative, and removeWhitespaces() then built its iterators from it, reading and writing
      before the start of the buffer. Both now return size_t (#10171).
    - FileConverter: converting spectra to consensusXML/consensusparquet kept only as many of the
      most intense MS1 peaks as the input had spectra. It now writes one consensus feature per MS1
      peak (more memory and runtime for large files); equal intensities are ordered by RT and m/z,
      so the output no longer depends on the platform, and every feature gets its own unique ID
      (previously all were written as "e_0", which is invalid consensusXML) (#10161).
    - BaseFeature::sortPeptideIdentifications() no longer reads the first hit of an
      identification without hits (a crash for hit-less identifications loaded from featureXML,
      e.g. in FeatureLinkerUnlabeledQT with use_identifications), sorts the hits of every
      identification (also of a single one) and uses one score orientation throughout (#10148).
    - OpenMS.ini: entries that a hand-written file does not set are now taken from the built-in
      defaults, as are entries of the wrong type (with a warning). With a file that set only
      temp_dir, the search engine adapters reported a database they could not find as an internal
      error ("the element 'id_db_dir' could not be found"), and with id_db_dir given as a single
      string instead of a list, as a conversion error. A file without the current 'version' no
      longer logs "Broken file" or "deprecated" warnings on every run, since OpenMS never rewrites
      the file (#3009).
    - ProteomicsLFQ crashed in the QT feature linker (QTClusterFinder) when no run of a fraction
      had a feature, e.g. because none of their identifications passed the FDR filter. Such a
      fraction now contributes no quantities, a warning names it, and Debug builds no longer fail
      an assertion on it (#9790, #10310).

Documentation:
  - New "File formats" page in the OpenMS documentation: which formats tools read and write
    compressed, the .idparquet, .featureparquet and .consensusparquet bundles (their files, the
    tools that use them, how to convert), and that imzML is read by the library and pyOpenMS
    only. The TextExporter page lists the Parquet bundles it reads.
  - Corrected misleading Doxygen contracts in the sqMass/SQLite stack: countTableRows
    exception types, the SpectrumAccessSqMass usage example and getSpectraByRT /
    getMultipleSpectra semantics, SqMassFile::store replacement behaviour and the
    OpenSwathScoring fetchSpectrumSwath spectrum counts (#10148, #10244).
  - The ProteomicsLFQ page describes match-between-runs with PIP-ECHO (-pip_echo) and lists
    Thermo .raw input. The PercolatorAdapter page describes the in-process backend, when the
    percolator executable is run instead, and how many threads each backend uses.
  - Expanded experimental-design terminology and LFQ/fractionated/TMT/SILAC examples,
    targeted quantitation, FAIMS, RT units, file conversions, USI and MetaProSIP CSV docs
    (#4400, #8478, #8588, #8597, #8615, #9173, #9909).
  - New pyOpenMS user-guide pages "Arrow and Parquet" (to_arrow() of spectra, feature maps,
    consensus maps and identifications; reading and writing the Parquet bundles) and "Mass
    Spectrometry Imaging" (loading imzML, ion images, regions, on-disc access, writing).
  - Updated pyOpenMS type hints, docstrings, wrapping/ownership guidance and test templates;
    documented native-reader requirements, core-only builds and vcpkg configuration
    (#8483, #8507, #8548, #8561, #8674, #9162, #9629, #9736, #9752, #9792, #9812, #9928).
  - New "Vendor formats" pages in the OpenMS and pyOpenMS documentation: the tools that read
    Thermo .raw files and Bruker timsTOF .d directories, FileConverter's two Thermo readers
    and their defaults, and that the other tools apply Thermo's peak picking too (#10303).
    Corrected the FileConverter, FeatureFinderIdentification and FeatureFinderMetaboIdent
    pages, the .NET requirement on the Windows installation page, and the macOS installation
    page (macOS 15, notarized installer).
  - The user FAQ explains OpenMS.ini: that it is optional, where OpenMS looks for it and which
    entries it reads. The OpenMSInfo page describes the data, temp and user data paths as they
    are resolved now (#3009).
  - The Windows installation page builds with the vcpkg presets instead of the contrib package,
    and the developer FAQ, the guide to adding a dependency (now via vcpkg.json and overlay
    ports), the external-code pages and the agent notes no longer refer to contrib. The
    orphaned install-contrib page is removed (#10144).

Build System:
  - OpenMS can be built and installed in layers from the same source tree, e.g. for separate
    packages of the libraries, the TOPP tools and the GUI: the new option
    OPENMS_USE_INSTALLED_LIBRARY builds only the TOPP tools (BUILD_TOPP_TOOLS) and/or the
    GUI library and applications (WITH_GUI) against an installed OpenMS library of the same
    version (OpenMS_DIR). Such a build installs its own tool registry, share/OpenMS/TOOLS/
    OpenMS-TOPP.tsv or OpenMS-GUI.tsv, with its tools; a build of the libraries alone installs
    none. The GUI applications and the Qt-based TOPP tools ExecutePipeline and ImageCreator
    moved from the install component Applications to the new component GUIApplications
    (except in the macOS .pkg installer); the installers still contain all of them. The new
    cache variable OPENMS_INSTALL_DATA_PATH overrides the compiled-in location of the
    installed shared data, for layers installed into separate prefixes and linked into one
    tree (e.g. Homebrew); the GUI applications also look for TOPP tools in the bin directory
    of that tree. macOS app bundles installed without packaging (into bin/) now find the
    installed libraries. OpenMSConfig.cmake reports OpenMS_WITH_WNETALIGN.
  - The Debian package of a nightly or branch build carries its prerelease identifier in its
    control version, for example 3.6.0~nightly.2026.09.27, so it sorts below the release
    and a later nightly above an earlier one. Before, every build of 3.6.0 was version 3.6.0
    to apt, whether nightly or release.
  - Public headers of OpenMS, OpenSwathAlgo, OpenMS_CLI, OpenMS_GUI and the test
    framework use CMake header file sets. Installation paths and components stay
    unchanged and private headers remain excluded. Building OpenMS and consuming
    its CMake package both require CMake 3.24. Linux x64 CI explicitly verifies
    public headers as standalone translation units, with missing includes in
    identification-data and GUI headers corrected; normal builds can opt in with
    OPENMS_VERIFY_INTERFACE_HEADER_SETS=ON (#10177).
  - The TOPP tool framework (TOPPBase, ToolHandler, ParameterInformation,
    SearchEngineBase, TOPPExternalToolBase, MapAlignerBase, OpenSwathBase) moved out of
    libOpenMS into the new library libOpenMS_CLI (src/openms_cli; CMake target OpenMS_CLI,
    installed as OpenMS::OpenMS_CLI, package component CLI, export macro OPENMS_CLI_DLLAPI).
    Include paths are unchanged. The CTD/CWL parameter serializers read the parameter tag
    names from the new core header OpenMS/DATASTRUCTURES/ParamTags.h, so nothing in
    libOpenMS depends on the framework any more and its exported interface is purely
    scientific. BREAKING for external projects that build TOPP-style tools: link
    OpenMS::OpenMS_CLI (which carries OpenMS::OpenMS) instead of OpenMS::OpenMS (#10162).
  - The installed CMake package is layered: the core libraries (libOpenMS, libOpenSwathAlgo and the
    bundled third-party libraries; export set OpenMSTargets, install components library and cmake),
    the TOPP tool framework (libOpenMS_CLI; OpenMSCLITargets, library_cli and cmake_cli) and the GUI
    library (libOpenMS_GUI; OpenMSGUITargets, library_gui and cmake_gui) each have their own export
    set and install components (openms_add_library(... EXPORT_SET <set>)). An installation may stop
    at any layer: OpenMSConfig.cmake provides the targets of the layers present, reports them with
    OpenMS_CLI_FOUND and OpenMS_WITH_GUI (now true only when the GUI library is installed) and
    refuses a required CLI or GUI component that is missing; TOPP-style external tools request
    COMPONENTS CLI. The pyOpenMS wheels build and install the core layer only again, the
    installed-consumer test covers a full and a core-only installation, and the deb/rpm/macOS
    packages include the new library components. The Applications component depends on the library
    layer its binaries link (library_gui in a WITH_GUI build, library_cli otherwise), so a
    component-selectable installation cannot leave the TOPP tools without libOpenMS_CLI. The
    deb/rpm component lists spell that component the way the install rules register it: CPack
    compares component names verbatim when it selects what to install, so a component-wise
    package built from the previous spelling would have contained none of the TOPP tools.
    Reconfiguring a build directory with another WITH_GUI setting no longer leaves a stale GUI
    target file behind (src/tests/package_layers checks this with stub libraries) (#10164).
  - Three places spelled the install component that every TOPP tool, TOPPView and TOPPAS is
    registered under ("Applications") in lower case: the cpack_add_component() declaration and
    the CPACK_COMPONENTS_ALL lists of the deb/rpm packages. CPack folds CPACK_COMPONENT_<NAME>_*
    metadata (DISPLAY_NAME, DEPENDS, ...) to upper case, so that lookup still worked, but compares
    the name verbatim when selecting what to install, so a component-wise deb/rpm build from these
    lists would have matched no install rule and shipped no TOPP tools at all. Both generators
    currently build monolithically, so the shipped packages were unaffected; the naming is now
    "Applications" everywhere (#10199).
  - vcpkg manifests, cross-platform CMake presets, overlay ports/triplets and binary caching
    support Linux, Windows and macOS; main build/test CI uses them. Release-only triplets
    avoid building duplicate Debug dependencies (#9511, #9800, #9927).
  - BUILD_TOPP_TOOLS and INSTALL_OPENMS_EXAMPLES (both default ON) enable a core-only SDK;
    incompatible workflow-generation options fail configuration. Installed headers and
    external find_package(OpenMS) consumers are validated (#9752, #9774, #10103).
  - Linux/macOS install RPATHs include linked dependency locations; vcpkg paths and macOS
    loader-relative paths are handled explicitly. Build-tree linking resolves private
    dependencies consistently, avoiding same-name library conflicts (#10114).
  - Numeric conversion uses std::from_chars/to_chars, reducing compile time and improving
    throughput; scientific formatting uses portable shortest round-trip strings
    (#9648, #9668). Core/OpenSwathAlgo AUTOMOC is disabled (#10099).
  - pyOpenMS uses py-build-cmake/cibuildwheel; improved dev RPATH, Windows DLL discovery,
    local nanobind detection and isolated builds. Thermo bridge assets are bundled from
    verified cached downloads (#8484, #8530, #8706, #8874, #8892, #8933, #9732, #9738, #10070).
  - CI/release packaging updated across platforms, including Ubuntu 24.04, Visual Studio
    2026 and automated backports/version bumps. Windows Release builds regain optimization;
    installer path/staging failures are fixed. macOS installers are signed/notarized and
    exclude pyOpenMS modules distributed as wheels (#8961, #9514, #9523, #9742, #9827,
    #9969, #10009).
  - The macOS package installs bin/qt.conf, so ExecutePipeline, and with it TOPPAS
    pipelines on the command line, can load the Qt platform plugin (#10260, #10280).
  - Fixed Arrow repository keys/version pins, Bioconda synchronization/tooling/dependency
    conflicts and package-list handling; build failures now propagate. Multi-architecture
    images publish a combined amd64/arm64 manifest (#9196, #9726, #9728, #9729, #9750,
    #9798, #9890, #9891, #9905, #9951, #9954, #10071). The nightly Bioconda deploy
    workflow called bioconda-utils build with --pkg-dir, an option that does not exist
    (--package-dir is correct), failing every nightly run since 2026-09-08 (#10167). A later
    upstream bioconda-utils release renamed --mulled-test to --mulled-build-and-test without
    keeping the old name, breaking the same workflow again; it now uses the current flag
    (#10227).
  - Fixed compiler-cache saving and fork-PR workflow failures; documentation lint rules are
    pinned. Added effective Parquet schema/value checks and non-finite numeric comparisons;
    removed parallel-test output collisions and source-timestamp assumptions
    (#9785, #9787, #9859, #9861, #9877, #9878, #9879, #9887, #9899, #9906, #9937,
    #9973, #10018).
  - Fixed a link-order bug that left libOpenMS.so with undefined libxml2 symbols when
    Arrow is linked statically, which ARROW_USE_STATIC (our own option, default ON)
    selects whenever a static Arrow target exists. libxml2 was listed as a direct
    OpenMS dependency, which put it ahead of libarrow_bundled_dependencies.a on the
    link line; an --as-needed linker then dropped it and `import pyopenms` failed with
    "undefined symbol: xmlBufferFree". It is now appended to Arrow's link interface,
    where the ordering is correct. The symbols come from the bundled
    azure-storage-common, not from the AWS SDK, which brings its own XML parser (#10136).
  - Improved CMake 4/MSVC, clang/Xcode, OpenMP and non-vcpkg ONNX builds, plus Debian
    dependency packaging to avoid .deb conflicts. OpenMP requests fail clearly when
    unavailable; SIMD-only compilation works without a runtime. Fixed
    YAML CTD parsing and optional WNet tool registration (#8368, #8880, #9056, #9223,
    #8496, #9267, #9388, #9651, #9653, #9783, #9784, #9971).
  - Documentation formulas use MathJax, removing Ghostscript. Removed obsolete developer
    scripts, ENABLE_STYLE_TESTING, doc_xml and stale examples/schemas. Runtime schema
    coverage is retained; QcMLFile/PepXMLFileMascot validation remains unavailable and
    now throws NotImplemented (#9740, #9757, #9771, #9945).
  - The Debian package derives its libc6, libstdc++6, libgomp1 and libgcc-s1 dependencies
    from the shipped binaries with dpkg-shlibdeps, so they cannot go stale as the declared
    libc6 (>= 2.28) had, and the package does not install on distributions too old to run
    it. This needed the install tree cleaned up first: the bundled tools were installed
    verbatim, including ThermoRawFileParser's NuGet runtimes/<rid>/ directories, which
    carry libMono.Unix.so for nine runtime identifiers (android-arm, android-arm64,
    android-x64, android-x86, linux-arm, linux-arm64, linux-x64, osx-arm64, osx-x64).
    Most are foreign to whichever host builds the package, and dpkg-shlibdeps treats a
    foreign-architecture binary as an error rather than as missing information, so no
    package was produced at all. Only the runtime identifiers the build targets are
    installed now; the parser's own Mono.Unix.dll.config maps the library to linux-x64,
    osx-x64 and osx-arm64 and to nothing else, so the others could never be loaded
    (#10202, #10207, #10211).
  - Debian package clean-up (#10230). Libraries no longer carry empty RUNPATH entries,
    which the dynamic loader reads as the current working directory: the release
    workflow links under PACKAGE_TYPE=none, whose install RPATH also names the build
    tree's vcpkg directory, and packages after reconfiguring, so CMake kept most of the
    ':' padding of the longer build-tree RPATH. libOpenSwathAlgo (and on arm64 the
    Thermo bridge) shipped with $ORIGIN/../lib/ and about 90 empty entries; CPack now
    removes them before building the package. The arm64 build takes the Thermo bridge
    from vcpkg, as every other platform does: vcpkg.json still left it out on
    linux & arm64 from when Thermo RAW reading was off there (#10206 turned it on), so
    the arm64 build fetched and built the bridge itself and packaged the bridge's
    headers, CMake package, .pdb and a second copy of its managed assemblies. The vcpkg
    port also installs the Thermo RawFileReader license now, so every package ships it
    under share/OpenMS/LICENSES as the from-source build did; before, only the arm64
    package had it. Depends is now exactly what dpkg-shlibdeps derives. The hand-written
    entries had gone stale: the Qt ones are derived anyway, and the derived plain t64
    names made their "t64 | non-t64" alternatives unenforceable; nothing links yaml-cpp
    dynamically; and SQLite ships inside the package, so libsqlite3-0 was never used
    (#10259).
  - The DEB installed the 53 third-party libraries it bundles and the Thermo bridge
    world-writable (mode 0777) in /usr/lib, among them libssl.so.3 and libcrypto.so.3, so any
    local user could replace code that the OpenMS tools load, also when root runs them. The
    macOS package installed the headers and resources of its Qt frameworks world-writable.
    Bundled libraries are now writable by their owner only (0755), like any installed library
    (#10324).
  - The container image build failed on every nightly run once WITH_THERMO_RAW defaulted
    to ON on Linux aarch64 (#10206): the Dockerfile still installed the .NET SDK/runtime
    that openms-thermo-bridge needs only for amd64, so the arm64 build could not find
    the dotnet executable at configure time. Both installs are now unconditional (#10210).
  - Linux wheels are built in a container with the checkout bind-mounted, which made git
    refuse the repository and left the embedded version a placeholder. The build marks the
    checkout safe, and any git failure now falls back to the "exported" version string
    instead of leaking the placeholder into VersionInfo and package file names (#10202).
  - MACOSX_DEPLOYMENT_TARGET is declared once for the wheels; the workflow value silently
    overrode pyproject.toml, which moved the supported macOS floor without notice. A CI
    check compares the Mach-O load commands of each wheel against its platform tag, so a
    wheel can no longer install on a macOS it cannot run on (#10202).
  - The macOS package states the macOS it needs. The build targets macOS 15, the macOS its
    Homebrew libraries are built for, instead of 14. The installer refuses older versions,
    and TOPPView, TOPPAS and INIFileEditor declare the build's target in their Info.plist
    instead of macOS 12 (#10286).
  - vcpkg builds OpenBLAS, which COIN-OR's LAPACK pulls in, for a fixed CPU target on Linux:
    CORE2 (SSSE3, the baseline OpenMS itself is compiled for) on x86_64 and ARMV8 on arm64. It
    used to take the kernels for the CPU of the build machine, and the binary cache passed that
    build on to later builds and to the packages. The 2026-09-24 nightlies shipped an OpenBLAS
    that needs AVX2 on x86_64 and SVE on arm64, which not every supported CPU has, and clang
    debug builds failed on x86_64 machines with AVX-512 (#10264).
  - The installers and the pyOpenMS wheels ship the license texts of the third-party code they
    contain; before, share/OpenMS/LICENSES held only the OpenMS license. It now also holds the
    licenses of the vcpkg ports, which the packages and the Linux and Windows wheels contain
    (vcpkg/), of Qt with where to get its source (Qt/, Windows and macOS), of the Homebrew
    formulae whose libraries the macOS package and wheel bundle (homebrew/), of the system
    libraries the wheel repair tools copy in, such as GCC's OpenMP and Fortran runtimes
    (system/), and of the code that OpenMS carries in its source tree and compiles into
    libOpenMS, such as Percolator with its NOTICE file (vendored/).
    share/OpenMS/THIRD-PARTY-NOTICES.txt gathers them in one file: the third-party components,
    grouped by where they come from, and each text once. The DEB also installs it, after the
    OpenMS license, as /usr/share/doc/openms/copyright, and License.txt points to it (#10292).
  - The tools the installers bundle from THIRDPARTY come with their license texts: Comet,
    MaRaCluster, Percolator and the assemblies of ThermoRawFileParser, and so do the
    assemblies of the in-process Thermo reader (openms-thermo-bridge 0.3.1). SpectraST is no
    longer bundled: it is GPL-licensed and was shipped without its license text or source code.
    SpectraSTSearchAdapter runs a separately installed spectrast given with -executable
    (OpenMS/THIRDPARTY abe0956, #10292).
  - The Windows installer no longer includes ProteoWizard (msconvert and the instrument vendors'
    libraries in THIRDPARTY/pwiz-bin). OpenMS does not use it; to convert other vendor formats
    with msconvert, install ProteoWizard from https://proteowizard.sourceforge.io/ (#10292).
  - The Windows installer and the Linux x86_64 DEB no longer include X!Tandem
    (THIRDPARTY/XTandem). No OpenMS tool has run it since XTandemAdapter was removed in 3.4.0,
    and its Linux build embeds expat 2.0.1, which Critical CVEs such as CVE-2016-0718 affect.
    OpenMS still reads X!Tandem's result files (#10344).
  - TOPPView and TOPPAS show the notice that Thermo's RawFileReader license asks for in their
    About dialog, in builds with the in-process Thermo reader (#10292).

Known issues:
  - Three search engines that the installers bundle from THIRDPARTY contain outdated library code:
    Comet embeds zlib 1.2.11 and expat 2.2.9, MaRaCluster zlib 1.2.3, and Sage SQLite 3.41.2.
    Published vulnerabilities of these versions, such as CVE-2022-25235 (expat), CVE-2016-9841
    (zlib) and CVE-2025-6965 (SQLite), concern malformed input or SQL statements, so run these
    engines only on files you trust. They will be rebuilt against current versions after this
    release.
  - All installers and pyOpenMS wheels contain OpenSSL 3.6.4, which 13 advisories published with
    OpenSSL 3.6.5 on 2026-09-29 affect. The only one rated High, CVE-2026-84782, concerns DTLS
    connections, which OpenMS does not open. The other twelve are rated Low; among them,
    CVE-2026-35189 lets a malicious HTTPS server make OpenMS use excessive memory with a crafted
    certificate.
  - The macOS package is built without OpenMP: the tools run single-threaded, and '-threads'
    has no effect. The macOS pyOpenMS wheels are not affected (#10326).

------------------------------------------------------------------------------------------
----                                OpenMS 3.5.0     (Released December 2025)         ----
------------------------------------------------------------------------------------------
NOTICE: 3.5.0 was the last official release for MacOS on Intel processors.
If you need support for OpenMS on that platform moving forward, please contact us.

General:
 - speed improvements:
    - loading .gz files is about 7% faster (#8069)
    - loading of mzML files with more than than m/z+intensity (e.g. ion mobility) is 20-40% faster (#8074)
    - loading of mzML files is 7-25% faster in general (SIMD ASCII conversion) (#8105)
 - linux arm64 support:
	- OpenMS releases now include a .deb for arm64 machines
    
Dependencies:
    - PyOpenMS now depends on Autowrap 0.24.0
    - PyOpenMS now supports Cython 3.1
    - CMake now accepts Eigen 5 in addition to Eigen 3.4+ (#8366)
    - Apache Arrow/Parquet integration for high-performance columnar data export (#8091, #8145)

PyOpenMS:
    - PyOpenMS now has wheels for arm64 linux machines
	- PyOpenMS wheels are now available for Python 3.14 on all supported operating systems
	- Parquet support enabled in pyopenms wheels (#8422)
	- BREAKING: DataFrame column names standardized to lowercase snake_case for PEP 8 compliance.
	  Affected methods: MSSpectrum.get_df(), MSChromatogram.get_df(), ConsensusMap.get_metadata_df(),
	  FeatureMap.get_df(). Example changes: 'RT' -> 'rt', 'MZ' -> 'mz', 'nativeID' -> 'native_id',
	  'precursorMZ' -> 'precursor_mz'. Update code that references old column names.
    - Pythonic convenience methods added:
      - __len__() for MSSpectrum, MSChromatogram, MSExperiment, AASequence (#8151, #8415, #8417)
      - __str__() and __repr__() for core classes (#8429)
      - Python accessors for drift time on MSSpectrum and OpenSwathSpectrum (#8423)
    - New Python bindings for Mobilogram and MobilityPeak1D classes (#8377)
    - DataFrame wrapper for MSSpectrum with get_df() method (#8435)
    - Enum class support in Python bindings with IntEnum (#8405)
    - Static methods to query enum names for METADATA classes (#8353)
    - Fix: PyOpenMS import no longer affects Python locale settings (#8322)
    - Improved pyOpenMS documentation for Feature, MRMFeature, FeatureMap classes (#8247)

TOPP tools:
  Changes:
    FileFilter:
      - Filter RT by blocks of MS levels (#8239)
    SageAdapter:
      - Improved parameter documentation and tolerance validation (#8259)
      - Now correctly passes threads parameter via RAYON_NUM_THREADS (#8260)
    CometAdapter:
      - All enzymes now available by adding CometIDs to database (#8280)
    DecoyDatabase:
      - Added repeated shuffle option for improved decoy generation (#8339)
    MassTraceExtractor:
      - support for Bruker Ion Mobility (experimental). Note: requires IM peak picked data.
    FeatureFinderCentroided, FeatureFinderMetabo, FeatureFinderMultiplex:
      - FAIMS support (experimental): Automatic detection and separate processing of FAIMS compensation voltage (CV) groups.
        Features from different CVs representing the same analyte are merged by default.
    FeatureFinderMetaboIdent, FeatureFinderIdentification:
      - FAIMS support (experimental): Automatic detection and separate processing of FAIMS compensation voltage (CV) groups.
        Features from different CVs representing the same analyte are merged by default.
      - Bruker TimsTOF ion mobility support (experimental): Requires concatenated IM spectra in mzML format
        (use msconvert with --combineIonMobilitySpectra option). IM values can be specified in the input TSV/idXML.
    NucleicAcidSearchEngine:
      - add support for global fixed modifications as a search parameter
    Digestor:
      - supports replacing ambiguous amino acids (X,B,J,Z) in the FASTA input with random unambiguous amino acids in the output (#8167)
    all:
      - show load/store progress for files in all TOPP tools (#8041)
    IonMobilityBinning:
      - Detect FAIMS data automatically and split output per FAIMS compensation voltage (CV)
    FLASHDeconv:
      - Major update with improved scoring, FDR estimation, and isobaric quantification support (#8257)
      - Automatic mass tolerance estimation from data
      - Per-MS-level deconvolved spectrum outputs
      - TopFD version 1.7 compatible feature and TSV export formats
      - Improved precursor mass assignment for MSn spectra
  Added Tools:
    - OpenNuXL - A peptide-RNA/DNA cross-linking search engine
    - ProSE - Experimental peptide database search engine using a fragment index (FI) and the new ProSEAlgorithm
    - FeatureFinderLFQ (experimental) - Feature detection for label-free proteomics DDA-LFQ based on the Biosaur2 algorithm with support for FAIMS and TimsTOF ion mobility
    - PeakPickerIM - Ion mobility peak picker for TimsTOF and other IM data. Supports three methods: mobilogram-based,
      clustering, and elution profile-based picking. Supports both in-memory and low-memory streaming modes. (#8177)
    - IsobaricWorkflow (experimental) - Simple, targeted, fast workflow for isobaric quantification (#7298)
  Removed Tools:
    - OpenPepXLLF - Experimental search for cross-linked peptide pairs in tandem MS spectra (showed inferior performance in benchmarks)
    - IDMassAccuracy - Calculates a distribution of the mass error from given mass spectra and IDs
    - SpecLibCreator - Creates an MSP formatted spectral library
    - SpecLibSearcher - Identifies peptide MS/MS spectra by spectral matching with a searchable spectral library

GUI tools:
 - fix TOPPAS crash when using TOPP tools with multiple output formats (#8120)
 

OpenMS Library:
  Added:
    - PeakPickerIM (experimental): New algorithm for ion mobility peak picking with three methods (mobilogram, cluster, elution profiles). (#8177)
    - IMFormat: Added CENTROIDED and UNKNOWN format types for ion mobility data. (#8177)
    - MSSpectrum/SpectrumSettings: Added setIMFormat()/getIMFormat() API for per-spectrum ion mobility format tracking. (#8177)
    - FeatureFinderAlgorithmBiosaur2 (experimental): Feature detection algorithm for label-free proteomics DDA-LFQ based on the Biosaur2 algorithm with support for FAIMS and TimsTOF ion mobility.
    - PeptideHit: Added TargetDecoyType (TARGET, DECOY, TARGET_DECOY, UNKNOWN) and setTargetDecoyType()/getTargetDecoyType(); supports target+decoy peptide hits.
    - IDScoreSwitcherAlgorithm: Added findScoreType() method for generic score type detection. Checks if main score matches requested ScoreType (PEP, QVAL, FDR, etc.) or finds it in meta values..
    - ProteinHit: Added TargetDecoyType (TARGET, DECOY, UNKNOWN) and setTargetDecoyType()/getTargetDecoyType().
    - Both: Added isDecoy().
    - unify isotopic distributions (coarse vs. fine) for EmpiricalFormulas with charge (#8099)
    - FragmentIndex (experimental): New fragment index for fast peptide fragment lookup supporting FI-based peptide database search.
    - ProSEAlgorithm (experimental): Library algorithm leveraging FragmentIndex for peptide database search; used by the ProSE TOPP tool.
    - AhoCorasick: Improved high-performance string matching algorithm with path compression (#8269, #8304)
    - HashGrid: Exposed cellIndexAtClusterCenter method (#8318)
  Changes:
    - removed `assignRanks` and `sortByRanks` in PeptideIdentifications and sort and filter by score instead. Also removed `updateHitRanks` in IDFilter (#7991)
    - remove rank member in PeptideHit and store ranks as meta value (for backwards compatibility). (#7997)
    - std::vector<PeptideIdentification> now is encapsulated in a class PeptideIdentificationList.
    - Zlibcompression using zlib (not Qt) and Base64 decoding for zlib-compressed data using SIMD (not Qt) (#8161)
    - Exception::InvalidSize now includes mandatory context message (#8437)
    - Matrix::operator== no longer throws assert when comparing different-sized matrices (#8305)
    - Removed boost::smart_ptr dependency, using std::shared_ptr instead (#8405)
    - C++20 modernization: std::erase_if, range-based for loops, default constructors (#8229, #8230, #8233)
  New Features:
    - FAIMSHelper: dataset-wide FAIMS detection; ignore DRIFTTIME_NOT_SET sentinel; improved warning
    - IMDataConverter::splitByFAIMSCV: retain MS2 without explicit FAIMS CV by assigning to prior FAIMS CV
    - added `EnzymaticDigestion.semiSpecificDigestion_()`
    - ProteaseDigestion: add support for semi-specific digestion (#8130)
    - TransformationModelLowess: Add option to automate span selection via cross-validation (#8166)
    - OpenSwath:
      - Added automated iRT calibration using input transition list (#8146)
      - Added automated RT, m/z, and IM extraction window estimation based on iRT calibration (#8188)
      - Added lowess span grid search params and updated documentation for OpenSwathWorkflow TOPP tool (#8297)
      - Added priority inclusion list for iRT sampling from PQP when using automated iRT calibration (#8373)

Fixes:
  - Fix overlap test in crowded FAIMS data (#8418)
  - Fix window estimation when no MS1 maps available in OpenSwath (#8308)
  - Fix column header filenames for all maps in Decharger/MetaboliteAdductDecharger (#8265)
  - Fix ternary operator misuse in FileMerger append_method logic (#8263)
  - Fix Qt6 deprecation warnings (#8248)
  - Fix FileNotFound exception misuse for file access errors (#8274)
  - Fix peaks being skipped in OpenSwath wide boundary selection method (#8316)
  - Fix mzTab-M validation errors for missing identification and database metadata (#8363)
  - Fix negative offset handling in mzML readers (#8336)

Documentation:
  - Build instructions rewritten for macOS and Linux (#8042)
  - Comprehensive documentation added to DeMeanderize tool (#8264)


------------------------------------------------------------------------------------------
----                                OpenMS 3.4.1     (May 2025)                       ----
------------------------------------------------------------------------------------------

Documentation:
  - TOPPAS: tutorial update (#8025)
  
Fixes: 
 - TOPPView: fix a few error messages boxes (in IM frames, and 2D projections) (#8047)
 - RANSAC algorithm: avoid r^2 is zero; fixes crash in OpenSwathWorkflow (#8052 )

------------------------------------------------------------------------------------------
----                                OpenMS 3.4.0     (May 2025)                       ----
------------------------------------------------------------------------------------------

General:
- OpenMS now expects a compiler that supports C++20
- OpenMSInfo TOPP tool now informs about custom CXX compile flags (#7846)
- speed improvements:
  - TOPP tool FeatureFinderCentroided TOPP tool is 28-44% faster (internally GaussTraceFitter is 4-7x faster) (#7950)
  - mzML parsing is 6% faster (#7850)
  
Dependencies:
- switch to Qt 6 (>= 6.5)  (#7525)

OpenSwath:
- changes to -out_features (# 7793)
	- Deprecate .tsv feature output
	- Deprecate -out_osw, -out_tsv. -out_features is used for outputting .osw or .featureXML files and file format is autodetected.
	- Enable outputting any feature file (.osw or .featureXML) from a .tsv library 
- add warning message if irt_im_extraction_window not set and im_window is set (#7813)
- add auto add up spectra across the peak width in retention time for ion mobility extraction (#7742)
- add peak-picking for extracted ion mobilogram (#7759)
- add ion mobility scoring for identifying transitions for IPF (#7760)
- bug fix: pass `im_range` to `scoreIdentification_` instead of computing it in the function. Addresses issue #7883. (PR #7885)

Misc:
- pyOpenMS: improve developer experience (installation/compilation) (#7735)
- TOPP tools and TOPPAS/ExecutePipeline return exit code 14 when external third-party tools (such as Comet or Sage) are not found (#7758)
- ProteinInference tool: Algorithm:score_type allows switching the main score (e.g., "RAW", "PEP") for BasicProteinInference. (#7769)
- README.md: Added dedicated "Building OpenMS" section with direct links to platform-specific build instructions (#7912)
- TOPPAS: tutorial now includes Pipeline and Node updating (#8025)

Fixes:
- fix AScore algorithm when counting phosphorylation events (#7905)
- add option to PeakFileOption to ignore loading of chromatograms or spectra from mzML (#7901)
- fix Doxygen Docs contain stty warning for TOPP tool output (#7865)
- fix various issues with the Windows installer (#7995, #7996, #8001)
- TOPPView: open theoretical spectra immediately in 1D to avoid crash when opening in 3D mode (#8019)

Library:
- IDScoreSwitcherAlgorithm: Added switchToScoreType and switchBackScoreType methods for score switching and reversion. (#7769)
- made FASTA file reader more robust in presence of whitespaces (#7960)
- add 3' cyclophosphate version of RNAse 4, fix handling of cleavage gains (#7928)

Removed tools:
  - XTandemAdapter
  - MascotAdapter (note: MascotAdapterOnline still exists) (#7927)

------------------------------------------------------------------------------------------
----                                OpenMS 3.3.0                                      ----
------------------------------------------------------------------------------------------

What's new:
- Changes breaking backward compatibility: 
  - the QualityControl TOPP tool has some renamed parameters and supports output directories (#7497)
- Low-level  peak extraction helper for MSExperiments (#7628)
- pyOpenMS: use Numpy2 (#7539)
- Docker files are now part of the main OpenMS repo (#7303)
- Added new functionality to SageAdapter + compatibility with new Sage versions (#7577)

Library:
- TOPPView: 
  - offer Ion mobility view from 2D spectra view (#7423)
  - view ion mobility frames, irrespective of its MS level (formerly only MS1 was supported) (#7427)
- OpenSwath: 
  - Add output on peak shape metrics to .osw file (#7222)
  - Update IonMobilityScoring to use Mobilogram Kernel datastructure (#7587)

Misc:
- FileInfo:
    - support MzTab files (#7568)
- TOPPAS 
    - supports writing results to output directories  (for TOPP tools that have such parameters) (#7497)
    - TOPPAS tutorial enhanced (#7497)
- TOPPAS & TOPPView: new splash screen with new OpenMS logo (#7712)
- FeatureFinderMetabo
    - added report_smoothed_intensities parameter (#7594)
- Write out percolator features in search engine adapters (by default, no PSMFeatureExtractor is needed)
- Add isobaric correction defaults for tmt6plex and 11plex (#7601) 
- Decoy phosho added to unimod.xml (#7612)
- Add additional convenience functions for MSExperiment (#7630)
- Improve file list comparison (#7645)
- pyOpenMS: Add more convenient constructor for AASequence (#7650)
- Add annotate_features param in Deisotoper.cpp (#7643)
- internal enhancements (#7652)

Fixes:
- OpenMS does not compile when using GLPK (instead of COINOR) (#7626)
- fix MassCalculator error ('residue type has no name') (#7698)
- pyOpenMS
  - get_feature_df() in MRMTransitionGroupCP, output is now as expected (#7646)
- Fix scan number extraction for merged spectra (#7599)
- Cmake fix (#7625) 
  - use Boost config instead of find module (new policy of CMake)
  - escape quotes in whitespace strings
  - remove invalid PRE_BUILD option (in combination with OUTPUT)
  - update diff regex and actual results (which seem to have changed with recent Sage versions...)
- MzTab: preallocate enough memory instead of allocating in the loops (#7624)
  - add check that otherwise will result in out of memory error
  - reduce memory fragmentation on huge files
- KNIME Plugin: Fix categories (#7622)


------------------------------------------------------------------------------------------
----                                OpenMS 3.2.0       (released 09/2024)             ----
------------------------------------------------------------------------------------------

What's new:
- Changes breaking backwards compatibility: 
   - Rename of parameters for TOPP tool FeatureFinderCentroided (debug -> advanced), and PeakPickerWavelet/TOFCalibration (optimization -> optimization:type) (#7154)
   - Rename of parameters for TOPP tool IDFilter (score:pep -> score:psm; score:prot -> score:protein; score:protgroup -> score:proteingroup) with 'nan' as new default (#7541)
   - 3.2.0 KNIME package requires KNIME 5.3 or later
- Support for SubsetNeighborSearch (SNS) via DecoyDatabase (#7565)
- SageAdapter received large updates including added functionality for PTM discovery + enabling features such as chimera seach, RT prediction, filtering by q-value, etc. 

Library:
- Extend FileHandler to support load and store operations for our major datastructures (spectra, features, identifications, etc.). Replaced file type specific code with the more generic FileHandler calls to decouple the IO code from other parts of the library.
- SiriusAdapter reworked to SiriusExport: Instead of running SIRIUS directly, this reworked tool takes multiple mzML and feautureXML (optional) files exporting a single SIRIUS .ms input file as well as an input table with compound info from features for the new AssayGeneratorMetaboSirius tool. (#7234)
- Splitting AssayGeneratorMetabo into two tools: In line with the changes to SiriusExport this tool has been split into two separate workflows. AssayGeneratorMetabo generates an assay library from mzML and feautreXML files using an heuristic approach picking the highest intensity MS2 peaks (like before). AssayGeneratorMetaboSirius takes an existing SIRIUS project directory as input to generate an assay library based on fragmentation trees. (#7234)
- better documentation for all SpectraFilter... tools (#7183)
- TOPPView: offer Ion mobility view from 2D spectra view (#7423)
- TOPPView: view ion mobility frames, irrespective of its MS level (formerly only MS1 was supported) (#7427)
- OpenSwath: Add output on peak shape metrics to .osw file (#7222)

New Tools:
- IonMobilityBinning - Merges spectra with similar IM values and creates @p N output mzML's by discretizing the IM range (#7459)
- AssayGeneratorMetaboSirius -- Assay library generation from a SIRIUS project directory (Metabolomics)
- SiriusExport -- Metabolite identification using single and tandem mass spectrometry


Fixes:
- FileConverter: more robust (#7176)
- MSFragger: allow relative path to database (#7155)
- MSGFPlusAdapter: allow concurrent creation of indexed database (#7272)
- CometAdapter: work around bug in Comet 2024.01 rev. 0 to avoid empty results (#7540)
- ParamEditor: fixed error for the subsection parameter (ParamNode) to go through store function (#7180)
- TOPPView:
   - fix crash when viewing certain Chromatograms (#7220)
   - in 2D view, show correct adjacent layers in context menu, if user clicked to the right of the last MS1 scan (now shows the 4 rightmost MS1 scans, used to show the 4 leftmost scans) (#7423)
   - fix glitches in 1D view and layer names (#7549)
   - Show prefix ions (e.g. b1) when generating theoretical spectra (#7567)
- TOPPAS: open files in TOPPView (#7213)
- pyOpenMS: Log warnings in pure Python code with warnings.warn instead of print (#7418)
- more robust parsing of mzIdentML (#7153)
- SageAdapter now works with sage v0.15.0 and beyond
- OpenSwath: Fix bug in diaPASEF window determination (#7546)  

Misc:
- FileInfo: Report ion mobility ranges (if any) (#7459)
- OpenMSInfo reports the ILP solver (CoinOr or glpk) (#7156)
- add citation information for OpenMS 3.0 (Nat. Methods) (#7383)
- Add export for Common Workflow Language (CWL) (#6156)
- Add tool description lib (TDL) dependency (#6156)
- Docker containers have been optimized (#7303)

Changed/new parameters: see CHANGELOG_PARAMS for details

Note: The goal of our library is to provide useful, reusable code in a way that’s easy to understand and use.
To make OpenMS simpler, more focused and more accessible we gradually remove potentially outdated tools and algorithms.
If you, as a user, are negatively affected by this step please contact us. We listen to our users and will try to find 
an alternative solution or reverse a particular decision for removal.

Cleanup/Removal:

- removed tools:
  - SpectraFilterMarkerMower -- Applies thresholdfilter to peak spectra (#7183)
  - FeatureFinderIsotopeWavelet -- Detects two-dimensional features in LC-MS data
  - PeakPickerWavelet -- Finds mass spectrometric peaks in profile mass spectra
  - PrecursorMassCorrector -- Corrects the precursor entries of MS/MS spectra, by using MS1 information
  - TOFCalibration -- Applies time of flight calibration
  - ERPairFinder -- Util which can be used to evaluate pair ratios on enhanced resolution (zoom) scans
  - RNPxlSearch -- Annotate RNA/DNA-peptide cross-links in MS/MS spectra
  - SpectraFilterSqrtMower -- Applies thresholdfilter to peak spectra
  - FeatureFinderMRM -- Detects two-dimensional features in LC-MS data
  - MapAlignerSpectrum -- Corrects retention time distortions between maps by spectrum alignment
  - ProteinResolver -- protein inference
  - SiriusAdapter -- Tool for metabolite identification using single and tandem mass spectrometry
  - SpectraFilterBernNorm -- Applies thresholdfilter to peak spectra
  - SpectraFilterScaler -- Applies thresholdfilter to peak spectra

- removed library code:
  - HiddenMarkovModel
  - PeakPickerMaxima
  - DeNovo related, old marker code

- removed tutorials:
  - Tutorial_PeakPickerCWT
  - Tutorial_TOFCalibration

- removed tests:
  - TOFCalibration_test
  - ContinuousWaveletTransformNumIntegration_test
  - ContinuousWaveletTransform_test
  - FeatureFinderAlgorithmIsotopeWavelet_test
  - IsotopeWaveletTransform_test
  - IsotopeWavelet_test
  - OptimizePeakDeconvolution_test
  - OptimizePick_test
  - PeakPickerCWT_test
  - PeakShape_test

- Deprecated (and likely removed in the next release)
  - XTandemAdapter

------------------------------------------------------------------------------------------
----                                OpenMS 3.1     (released 10/2023)                 ----
------------------------------------------------------------------------------------------

We are excited to share an experimental update with our community, mainly targeted at platforms that depend on Conda packages.
Please note that this is a partial and unannounced release, focused on delivering novel features and major changes that we're actively testing and refining.
While these features are still in an experimental phase, we encourage adventurous users and platform integrators to explore and provide feedback.

Important Notes:
- Features are experimental and may undergo changes or be removed in future releases based on user feedback and stability.
- We welcome your feedback and suggestions to help us improve and refine these experimental features.
- For stability and production use, we recommend sticking with the latest stable release.

Please use this opportunity to test and provide feedback on these new features, as your input will play a vital role in shaping their development.

Thank you for being a part of our community and for helping us make OpenMS even better!

What's new:
- Major change: removed the distinction between TOPP tool and util and the TOPP and UTIL build targets were merged to a single TOPP target. All utils are considered tools now and categorized as "Utilities".
- Added SageAdapter. Support for standard identification tasks with sage (https://github.com/lazear/sage) (experimental).
- Require some advanced instruction sets for x64 CPUs: SSE3 (g++/clang) or AVX (MSVC); and NEON for ARM64 CPUs (#6978)
  and report them via the OpenMSInfo tool (#7022)
- Base64 encoding/decoding using the SIMDe library (#6978)
- Filter features in ProteomicsLFQ according to feature p-value (additional parameters feature_with(out)_id_min_score, MBR is automatically active if targeted_only = false)
- TOPPAS: filter TOPP tools by name for faster access when building a pipeline (#7139)

Fixes:
- Fix a crash when loading mzML data with multiple threads which contains non-MS spectra, e.g. 'electromagnetic radiation spectrum' (#7011)
- InternalCalibration: improve visualization of calibration plots (#7064)
- Restore TOPPAS tutorial (#7076)
- various low impact UBSan fixes
- make mzData more robust against wrong 'length' attributes for binary data (#7113)

Misc:
- Report reading/writing throughput (MiB/sec) when loading/storing mzML (#7035)
- Add ability to create decoy features in FeatureFinderIdentification
- Restore developer quick guide in Doxygen docu - see https://openms.de/current_doxygen/html/index.html (#7109)
- Updated the changelog helper to set LD_LIBRARY_PATH automatically and other fixes
- Added "area" column to EICextractor output

Cleanup of old/unused tools and code:
- Removed old tools and associated code in the library for InclusionExclusionListCreator, SvmTheoreticalSpectrumGenerator, PrecursorIonSelector, and MSSimulator
  Note: general SVC and SVR is still supported with the SimpleSVM class.
- Removed old RT and PT predict code and tools RTModel, RTPredict, PTModel, PTPredict, RTEvaluation and associated library code (SVMWrapper and LibSVMEncoder).
- Removed PepNovoAdapter
- Removed CompNovoAdapter and library code
- Removed simplistic evaluation tools FFEval, LabeledEval, TransformationEvaluation
- Removed EnzymaticDigestionLogModel
- Removed FidoAdapter (same functionality now in our own inference engines)

------------------------------------------------------------------------------------------
----                                OpenMS 3.0     (released 7/2023)                  ----
------------------------------------------------------------------------------------------

New Tools:

    FLASHDeconv -- Ultra-fast high-quality deconvolution enables online processing of top-down MS data (TOPP)
    FLASHDeconvWizard -- A GUI assistant for FLASHDeconv execution.

New Features:

e.g.

    TMT18plex support (#6390)
    ProteinQuantifier supports iBAQ (#6107)
    OpenSwath: Add support for diaPASEF data with overlapping m/z and IM windows, and add new outputs on ion mobility features (delta_im), IM calibration (#5911, #6234, #6268)
    OpenSwathDecoyGenerator speed improvement and remove duplicates (#6054)
    NucleicAcidSearchEngine (NASE): user defined ribonucleotides with phosphorothioate linkages (#6337), JSON based ribonucleotides and updated to latest Modomics database (#6482)
    TargetedSpectraExtractor: more features (#6106)
    TOPPView: TheoreticalSpectrumGenerationDialog now supports generation of isotope patterns for metabolites (#6023); faster loading of external drag'n'drop data (#6837)
    colored commandline/console on all platforms (#6275)
    support for 'no cleavage' for XTandemAdapter and CometAdapter (#6133).
    Percolator pin file reader (#6824)
    JSON export for OMS files(SQLite) (#6114)
    ParamEditor with more convenient StringList editing (#5135)
    load parameter values from a JSON formatted .json file. (Accessible via -ini. This will be
    helpful for Common Workflow Language users and others)
    FileFilter can remove convex hulls of features and consensusFeatures to reduce file size (#6140)
    Faster compile time (#6618)
    Improving code quality by fixing lots of linting warnings and leaks (e.g. #6839, #6831, #6829)

Documentation:

    website redesign (visit openms.org)
    OpenMS user documentation is moved to openms.readthedocs.io/en/latest.
    OpenMS API reference and advanced developer documentation remains inside OpenMS doxygen
    documentation (https://abibuilder.cs.uni-tuebingen.de/archive/openms/Documentation/release/)
    pyopenms: pyopenms-extra is renamed to pyopenms-docs.

Bug fixes

e.g.

    GaussFilter when using ppm as width (#6830)
    NASE a-B ion masses (#6718), ID-Mapper for TMT data (#6758)
    FeatureFinderMetaboliteIdentification speed improvements (#6619)
    IDRipper speed improvements (#6584)
    Honor MissedCleavages in SimpleSearchEngine (#6889)
    TOPPView: fixed lots of display glitches, e.g. axis labels, goto dialog and easier re-use of components, etc (#6673, #6616, #6592, #6703, #6793)
    mzTab fixes for empty IDs (#6445)
    Fix GNPS error for empty scans in Bruker files (#6898)
    PrecursorPurity: handle unknown charge (#6283)
    OpenSwath: Fix duplicated transition error when multiple genes map to a single peptide (#5653)
    Fixed race condition when logging messages.

Removed tools:

    InspectAdapter
    OMSSAAdapter
    MyriMatchAdapter
    CruxAdapter

Supported compilers (when building from source):

    g++ (7.0 or later, tested up to v13.0)
    clang (?, tested up to v16)
    Visual Studio (2019(v16.8.4) or later)

Full changelog: [OpenMS 2.8 &rarr; 3.0](https://github.com/OpenMS/OpenMS/compare/Release2.8.0...Release3.0.0)

------------------------------------------------------------------------------------------
----                                OpenMS 2.8     (released 2/2022)                  ----
------------------------------------------------------------------------------------------

- source + conda release only
- Restructuring of Imported CMake targets and pyOpenMS CMake
- Reduce exposition of third-party libraries to interface
- greatly improved pyOpenMS documentation and extra functions (in the pyopenms-extra submodule)
- Fixes IDMapper for isobaric labelling experiments (will lead to much more identifications)
- Deisotoping algorithm using KL
- PeptideIndexer supports ambiguous AA's in Peptide sequence (as reported by recent Mascot versions) (#5776)
- SeqAn external library removed from source tree (not needed anymore)
- Resolve compatibility issues between IDRipper and IDMerger (#4957)
- Basic MzTabM support for AccurateMassSearch
- Changed default parameter keep_unidentified_masses to "true" (AccurateMassSearch/AccurateMassSearchEngine)
- Added parameter allow_nterm_protein_cleavage to PeptideIndexer to support no cleavage.
- Fixes and improves TheoreticalSpectrumGenerationDialog in TOPPView (closes #5787) (#5883)

------------------------------------------------------------------------------------------
----                                OpenMS 2.7     (released 9/2021)                  ----
------------------------------------------------------------------------------------------

General:
- OpenMS now expects a compiler that supports C++17
- Config storage path on linux changed to ~/.config/
- Some documentation improvements to pyOpenMS https://pyopenms.readthedocs.io/en/latest/
- PyOpenMS checks if `OPENMS_DATA_PATH` environment variable is set, before setting to default value

Adapters/Third-party support:
- Added support for SIRIUS 4.9.0
- Added basic Triqler export
- Improved NOVOR support
- Improved MSFragger support
- Removed Inspect support
- Easier 15N-labeling support for XTandemAdapter by shipping the required AA mass modification file (#5026)

What's new:
- Add some support for integrating spectral information when conducting DDA metabolomics experiments
- SimpleSearchEngine and algorithm: Additional spectrum features for percolator added
- FeatureFinderMetaboIdent: Targeted feature extraction is now also available from pyOpenMS
- AssayGeneratorMetabo: Added SIRIUS 4.9.0 support, allowing internal decoy generation and added internal feature linking support
- QCCalculator: export in mzQC file format is now available

New Tools:
- OpenMSDatabasesInfo -- Prints the content of OpenMS' enzyme and modification databases to TSV (UTIL)
- TriqlerConverter -- Converter to input for Triqler (UTIL)

Removed Tools:
- FeatureFinderSuperHirn -- Finds mass spectrometric features in mass spectra (TOPP)
- InspectAdapter -- Annotates MS/MS spectra using Inspect (TOPP)

Further fixes:
- Support for GLPK 5.x (#5127)
- IPF (identification of peptidoforms): add a check for terminal residue modification when generating theoretical peptidoforms
- Reduced build times on Windows
- Reduced AddressSanitizer warnings

File formats:
- Exporter for MSP files
- Improved support for reading NIST MSP files

Dependencies:
- Promoted SeqAn v1 to C17. Moved Seqan from contrib to main source tree (as it is not officially maintained anymore).

Library:
- Removed Elements.xml and Residues.xml. Hard-coded elements and residues for better performance/startup times.
- Moved algorithm of FeatureFinderMetaboIdent into library
- Added support for isotopic labelling experiments (MDV) 
- Removed SuperHirn library

GUI tools:
- TOPPView: Various bug fixes
- TOPPView: Dynamic detection of tools in TOPPView upon startup
- TOPPView: Improved DIA data browsing
- TOPPAS: add a `recent files` submenu
- ParamEditor: with more convenient StringList editing
- SwathWizard: Allow opening in TOPPView


------------------------------------------------------------------------------------------
----                                OpenMS 2.6     (released 10/2020)                 ----
------------------------------------------------------------------------------------------

We now create nightly pyopenms wheels (https://pypi.org/project/pyopenms-nightly/) and conda packages (https://anaconda.org/OpenMS/)

Adapters/Third-party support:
- LuciphorAdapter now stores which modifications were used for localization (#4771) and localization scores are reported in mzTab #4772 
- Added Percolator3.0 support, fixed ConsensusID reading from wrong (Percolator-overwritten) meta data (#4829), and adapted the Regex parsing of XTandem Percolator output files #4849 
- Added options introduced in new MSGF versions #4713 
- Updated IsoSpec fine structure isotopic calculator sources to v 2.1.0 #4733 
- Updated other third-party tools

What's new:
- Introduced a Wizard for Swath data (#4647 #4706 #4758 #4769 #4773 #4837), which also reports summary statistics about Swath TargetedExperiments #4788 #4790
- UTIL StaticModification: Applies a set of modifications to all PeptideIDs in an idXML file (UTIL)
- TOPP DatabaseSuitability: Computes a suitability score for a database which was used for a peptide identification search. Also reports the quality of LC-MS spectra. #4791 #4781 #4814
- Added support for QC of labeled experiments (iTRAQ/TMT)
- Added automated QC computations for MRM (#4637)
- Adapted consensusXML and mzTab to support protein groups (#4630)
- Consensus/IDMerger: Introduced use of merge idx to ensure keeping track of primaryRuns
- Epifany: Added calculation of protein group FDR, ID filtering for protein group scores (#4802) and support for inference on not just individual samples but also consensusXML files
- FeatureFinderCentroided/FeatureFinderAlgorithmPicked: Improved runtime performance #4652 #4701 
- FeatureFinderIdentification: Improved SLIM-labeling experiment support
- FileConverter: Improved runtime performance when producing mzML output #4750
- FeatureLinkerQT: Introduced Fibonacci heaps for large runtime optimization (#4721) and fixed related preconditions/segfaults #4756 #4760 #4778 
- IDFilter: added support for consensusXMLs #4798 #4799
- MapAlignerIdentification: New option to use an "identity" transformation when data is too sparse to determine alignment model #4628
- MzTabExporter: changed to only export one main score, and to derive nativeIDs from data (#4767). Now ensures that all output rows contain the same number of columns #4801 
- MzTabExporter on LFQ consensusXMLs produces 100% PRIDE validated mzTabs now
- ProteomicsLFQ: Added spectral counting as quantification method (#4726). Introduced performance improvements for AASequence and string parsing, especially for modified sequences. Various further improvements (e.g. #4669)
- SimpleSearchEngine (multithreaded), TheoreticalSpectrumGenerator, MSSpectrum: Runtime optimization #4709
- Further introduction of more file streaming to address possible memory consumption issues #4682 #4694

Further fixes:
- We now limit double precision to 17 digits during file writes #4636 
- Ensure that CometAdapter always writes indexed mzML fixes for CometAdapter (#4653), fixed the writing of terminal modifications with specific origin in Comet (#4742), the writing of protein terminal mods in Comet and MSGF adapter #4710, and the Comet pepXML modification parsing #4755 
- Removed secondary search engine settings duplication in mzTab MTD section. #4720 
- Improved XTandem output protein parsing #4789 to fix Issue #4770
- Increased (partial) support for parsing mzid with nonstandard, non-CV-term scores, fixes #4859
- Fixes to NucleicAcidSearchEngine mzTab output #4692
- ConsensusID now passes spectrum reference meta values along #4703
- Fix to LFQ requantification #4633
- Improved MapAlignerTreeGuided memory usage (#4704) and fixed segfault when featureXML contains no IDs #4665 
- TOPPAS fixes #4780 

Various:
- OMMSAAdapter now writes out native ids and spectrum references #4852 
- FileInfo: Report more charge distribution and MS2 activation-method information for Raw files #4836 
- Added sum formula output in RNAMassCalculator #4677 
- Added automatic OpenMS tool reporting of peak memory usage #4712 
- Some extra tools documentation outputs #4822 #4823
- Extended mapping of filetypes and mimetypes for knime output formats documentation #4839
- RTEvaluation: fixed output formats #4533 
- Some further clarifications, standardization/consolidation of outputs formats/consistency
- Continued fixes/improvement of documentation
- Removed deprecated version of PeakPickerHiRes (LowMemPeakPickerHiResRandomAccess and LowMemPeakPickerHiRes). Their functionality can be accessed through options of PeakPickerHiRes
- moved the config storage location for unix installations to comply with X Display Group (freedesktop.org) guidelines.


-------------------------------------------------------------------------------------------
----                                OpenMS 2.5     (released 2/2020)                   ----
-------------------------------------------------------------------------------------------

OpenMS 2.5 ships exciting new tools and improvements. 

General:
- support for RNA mass spectrometry
- TMT16plex support for IsobaricAnalyzer (see PR #4295)
- improved MsStats/MsStatsTMT output support (see PR #4181, #4207)
- extended MaxQuant-compatible mzXML support (via FileConverter) (see PR #4432, #4423)
- QualityControl Workflow (all in the QC folder)
- OpenMS and pyOpenMS support for oligonucleotides
- OpenSWATH support for ion mobility extraction and scoring
- OpenSWATH support for metabolite assay library building through SIRIUS (and metabolite extraction and scoring)
- OpenSWATH support for PRM
- TOPPAS improvements (see PR #4100, #4121, #4266, #4497)
- fixes to PeptideIndexer for X!Tandem special cutting rules and ambiguous amino acids (see PR #4356)
- support for HDF5
- support for hyperfine isotopic distributions (through IsoSpec)
- JSON support (see PR #3786)
- speed improvements (loading/storing files, handling peptide sequences)
- support for VS2019 and GCC 9.1 (see PR #4211)
- support for outlier removal in IDPosteriorErrorProbability
- reduced memory footprint of FeatureFinderIdentification through batch processing

New Tools:
- Epifany -- Runs a Bayesian protein inference (UTIL)
- FeatureFinderMetaboIdent -- Detects features in MS1 data based on metabolite identifications (UTIL)
- GNPSExport -- Tool to export consensus features into MGF format (TOPP)
- NucleicAcidSearchEngine -- Annotate nucleic acid identifications to MS/MS spectra (UTIL)
- ProteomicsLFQ -- A standard proteomics LFQ pipeline (TOPP) (experimental)
- QualityControl -- Computes various QC metrics from many possible input files (only the consensusXML is required). The more optional files you provide, the more metrics you get (TOPP)
- RNAMassCalculator -- Calculates masses and mass-to-charge ratios of RNA sequences (UTIL)
- MapAlignerTreeGuided -- Aligns maps through hierarchical clustering based on distances computed between shared IDs.

Deprecated and removed Tools:

Changed Tools:
- OpenPepXL and OpenPepXLLF runtime and memory efficiency improved by orders of magnitude
- IDFilter can now filter by using all MetaValues available in the ID files
- ImageCreator uses updated gradients and has gained RT and m/z filtering options (PR #4188)

Status changed:
- OpenPepXL (UTIL -> TOPP)
- OpenPepXLLF (UTIL -> TOPP)
- XFDR (UTIL -> TOPP)


-------------------------------------------------------------------------------------------
----                                OpenMS 2.4     (released 9/2021)                   ----
-------------------------------------------------------------------------------------------
OpenMS 2.4 introduces changes from 322 pull requests including new features and bug fixes.

Notable changes since version 2.3 are:

Dependencies:
- Switch to Qt 5 (>= 5.5)

Documentation:
- New developer documentation to get started developing tools with OpenMS

Library:
- Improved mass calculations for isotope distributions 
- Moved tool code from the tool to the library
- BinnedSpectrum now also supports offsets
- Improved peak type estimation
- Improved adduct grouping
- New EMG fitter for peak intensity imputation
- Targeted / untargeted spectra extraction and matching
- Spectra matching against a spectra library, using contrast angle similary function
- More precise peak integration (trapezoid, simpson)

New tools:
- AssayGeneratorMetabo -- Assay library generation from DDA data (Metabolomics) (UTIL)
- ClusterMassTraces -- Creates pseudo spectra (UTIL)
- ClusterMassTracesByPrecursor -- Correlate precursor masstraces with fragment ion masstraces in SWATH maps based on their elution profile (UTIL)
- CruxAdapter -- Identifies MS/MS spectra using Crux (TOPP)
- MSFraggerAdapter -- Peptide Identification with MSFragger (UTIL)
- MSstatsConverter -- Converter to input for MSstats (UTIL)
- MaRaClusterAdapter -- Facilitate input to MaRaCluster and reintegrate (TOPP)
- NovorAdapter -- Template for Tool creation (UTIL)
- RNADigestor -- Digests an RNA sequence database in-silico (UTIL)

Deprecated and removed tools:
- AdditiveSeries -- Computes an additive series to quantify a peptide in a set of samples (TOPP)
- IDEvaluator -- Computes a 'q-value vs. #PSM' plot which is saved as an image to visualize the number identifications for a certain q-value (UTIL)
- IDEvaluatorGUI -- Computes a 'q-value vs. #PSM' plot to visualize the number identifications for a certain q-value (UTIL)
- RNPxl -- Tool for RNP cross linking experiment analysis (UTIL) (superseded by RNPxlSearch)
  
Changed Tools:
- SiriusAdapter now supports several input data
- FileFilter now supports filtering spectra by similarity
- PeptideIndexer now supports automatic detection of decoy suffix/prefix string and position
- PeakPickerHiRes now supports automatic detection and picking of profile spectra
- Support for MSFragger search engine through MSFraggerAdapter
- Support for Crux search engine through CruxAdapter
- Support for Maracluster through MaraClusterAdapter
- OpenPepXL was improved in efficiency and usability
- IDFileConverter now supports the Cross-Linking MS specific xquest.xml format

TOPPView:
- Improved visualization of identification results and ion annotations
- Support for visualization of Ion Mobility and DIA data

Major changes in functionality:
- None   

File formats:
- Importer for MSP files
  
Scripts:
- None
 
Databases:
- None

Third-party software:
- New: maracluster (0.05)
- Update: MS-GF+ to Release (2018.01.30)
- Update: Sirius 4 for Windows 64bit, Linux 64bit, and MacOS 64bit
- Update: Crux (crux-3.1.8b78546) on all 64bit platforms.


-------------------------------------------------------------------------------------------
----                                OpenMS 2.3     (released 1/18)                   ----
-------------------------------------------------------------------------------------------
OpenMS 2.3 introduces a considerable number of new features and bug fixes.

Notable changes since version 2.2 are:

TOPPView:
   - Deletion of selections of Peak Annotations is reflected in the Peptide Hit
   - Buttons for saving ID files were merged to one single button. Format is determined by file extension or selected filter
   - Clicking on a data point in 2D view, the search range for close fragment ion spectra is extended if no spectra are found initially
   
New tools:
  - CometAdapter -- Annotates MS/MS spectra using Comet (TOPP)
  - MetaboliteAdductDecharger -- Decharges and merges different feature charge variants of the same metabolite (UTIL)
  - OpenPepXL -- Tool for protein-protein cross-linking identification using labeled linkers (UTIL)
  - OpenPepXLLF -- Tool for protein-protein cross linking with label-free linkers (UTIL)
  - PSMFeatureExtractor -- Computes extra features for each input PSM (UTIL)
  - SiriusExport -- Tool for metabolite identification using single and tandem mass spectrometry (UTIL)
  - XFDR -- Calculates false discovery rate estimates on protein-protein-crosslink identifications (UTIL)

Deprecated and removed tools:
  - None

Renamed tool:
  - LowMemPeakPickerHiRes_RandomAccess was renamed to LowMemPeakPickerHiResRandomAccess

Major changes in functionality:
  - Experimental design
    - Add support for fractions
  - FeatureLinkerUnlabeledKD
    - m/z and retention time tolerances for warping and linking are now separate parameters 
  - IsobaricAnalyzer
    - Support for TMT11plex (https://www.thermofisher.com/order/catalog/product/A34808)
  - FileInfo
    - For idXML files, the tool computes the average length of contained peptides
  - TopPerc
    - Renamed in PercolatorAdapter (still experimental)
  - OpenSWATH:
    - RT normalization now allows more models
    - Add S/N ratio for each ion trace
  - Support for C++11 (requires a compiler that supports C++11)

    
Library:
  - TOPP tools report their peak memory usage when using -debug 1 (or higher)
  - idXML files can now be written faster (about 10%)
  - pyOpenMS bindings for DataArrayByName getters
  - Python build are now split in compilation units and can thus run in parallel
  - FASTA files can now be written
  - Allow String values to be passed to EnzymaticDigestion::isValidProduct

File formats:
  - consensusXML now supports both channels and MS runs. Information will also be exported in mzTab
  
Scripts:
 - None
 
Databases:
 - None

Third-party software:
  - New: Comet "2016.01 rev. 3" for Windows 32bit/64bit, Linux 64bit, and MacOS 64bit
  - New: Percolator 3.1.2 for Windows 32bit/64bit, Linux 64bit, and MacOS 64bit (still experimental)
  - New: Sirius 3.5.1 for Windows 64bit, Linux 64bit, and MacOS 64bit
  - New: SpectraST 5.0 for Windows 64bit, Linux 64bit, and MacOS 64bit
  - Update MS-GF+ to Release (v2017.07.21)  


-------------------------------------------------------------------------------------------
----                                OpenMS 2.2     (released 11/2016)                  ----
-------------------------------------------------------------------------------------------
OpenMS 2.2 introduces a considerable number of new features and bug fixes.

Notable changes since version 2.1 are:

New tools:
  - RNPxlSearch -- Annotate RNA to peptide crosslinks in MS/MS spectra (UTIL)
  - SpectraSTSearchAdapter -- Interface to the SEARCH Mode of the SpectraST executable (UTIL)
  - FeatureLinkerUnlabeledKD -- Feature linking using a KD tree (TOPP)
  - DatabaseFilter -- Filters a protein database (FASTA format) based on identified proteins (UTIL)
  - TargetedFileConverter -- Conversion of multiple targeted file formats (CSV, TraML etc)
  
Deprecated and removed tools:
  - ITRAQAnalyzer -- superseded by IsobaricAanalyzer
  - TMTAnalyzer -- superseded by IsobaricAanalyzer
  - ConvertTSVToTraML - superseded by TargetedFileConverter
  - ConvertTraMLToTSV - superseded by TargetedFileConverter
  - MapAlignmentEvaluation -- removed as deprecated
   
Major changes in functionality:
  - OpenSWATH analysis
    - Support for metabolomics workflows
    - Support for scanning SWATH (SONAR)
    - Support for SQL-based file formats
  - XTandemAdapter 
    - Simplified usage
    - Improved support for PTMs and newer X! Tandem versions ("Vengeance", "Alanine")
  - IsobaricAnalyzer
    - Support for TMT10plex
    - Support for quantification in MS3 data
  - IDMapper
    - Allows to map unidentified tandem mass spectra to features
  - FeatureFinderIdentification
    - Advanced multi-sample support using machine learning
  - FileFilter
    - Allows users to enable zlib and lossy compression (see "-lossy_compression")
    - Allows users to set desired mass accuracy
  - IDFilter
    - Added option to filter for valid digestion products
  - FalseDiscoveryRate
    - Allow filtering by q-value in the tool (no need for IDFilter with "score:pep" option)
    
Library:
  - Averagine approximation for fragment isotope distributions
  - Precursor mass correction supports correction to highest intensity peak in tolerance window
  - Functionality for resampling and adding of spectra
  - Protein-protein cross-link spectrum generator
  - Terminal modifications are now separated by "." in text output
  - SQLite support in OpenSWATH
  - TheoreticalSpectrumGenerator speed-up and removal of RichPeak code
  - Removal of template parameters from MSExperiment (reduced compile time and binary size)
  - Allow estimation of isotope distributions with predefined numbers of sulfur atoms
  - Improved handling of bracket notation for modified residues (e.g. N[2457.877]VSVK)
  - Improved handling of terminal and residue specificity of modifications
  - Improved annotation of peptide identifications with spectrum references
  - Improved handling of unknown amino acids ("X") in sequences

File formats:
  - Improved mzML support for SONAR data and mzML with drift time (experimental)
  - Improved support for cross-link data and unknown modifications in mzIdentML
  - mzXML writer able to write MaxQuant-compatible files
  - mzML files now routinely support substantial compression (up to 5x compression, see #2449, #2458)
  - Support for Percolator result files based on X! Tandem searches

Scripts:
  - New R script for visualizing RT transformations (trafoXML) 
 
Databases:
  - By default, decoy sequences are now denoted by the prefix "DECOY_"

Third-party software:
  

-------------------------------------------------------------------------------------------
----                                OpenMS 2.1     (released 11/2016)                  ----
-------------------------------------------------------------------------------------------
OpenMS 2.1 introduces a considerable number of new features and bug fixes.

Notable changes since version 2.0.1 are:

New tools:
  - ExternalCalibration -- Applies an external mass recalibration (TOPP)
  - OpenSwathFileSplitter -- Splits SWATH files into n files, each containing one window (TOPP)
  - MultiplexResolver -- Completes peptide multiplets and resolves conflicts within them (UTIL)
  - TICCalculator -- Calculates the TIC from a mass spectrometric raw file (useful for benchmarking) (UTIL)

Deprecated and removed tools:
  - PILISIdentification -- performs a peptide/protein identification with the PILIS engine (TOPP)
  - PILISModelCV -- Perform a cross validation of the PILIS model parameters (TOPP)
  - PILISModelTrainer -- Train the PILIS model with a given set of spectra and identifications (TOPP)
  - PILISSpectraGenerator -- Generate spectra given a list of peptides and a PILIS model (TOPP)

Major changes in functionality:
  - Update notification: starting with OpenMS 2.1 all TOPP tools will check for updated versions of the tools 
      online and will print an information message if a newer version is available. This version check occurs only 
      once per day and tool. Information on which tools are executed will be collected anonymously to identify which 
      tools are no longer used and to optimally distribute development resources. If the feature causes problems or
      concerns, it can be disabled through a command line switch or environment variable (see the documentation).
  - InternalCalibration:
    - supports calibration using a table of lock masses and peptide ids.
    - global or RT-chunked calibration
    - linear & quadratic models (with intensity weighting)
    - outlier removal via RANSAC
    - reoccurring calibrations can be quickly applied to other files using the novel ExternalCalibration tool
  - OpenSwathWorkflow
    - support for metabolites / small molecules
  - MapAlignerIdentification
    - support for "lowess" transformation model
  - AccurateMassSearch:
    - support for multiple databases
  - FeatureFinderMetabo
    - isotope spacing model for carbon rich molecules (e.g. lipids)
  - PeakPickerHiRes and MassTraceExtractor:
    - support for FWHM annotation

File formats:
  - Improved mzIdentML support (experimental)
  - Improved pepXML support
  - Improved support for indexed mzML files
  - Improved TraML support

Databases:
  - By default, decoy sequences are now denoted by a prefix 'DECOY_'.

Third-party software:
  - update for 64-bit X!Tandem VENGEANCE (2015.12.15) NOTE: 32-bit version kept at SLEDGEHAMMER (2013.09.01)
  - update for MS-GF+ Release v2016.10.14, released October 14, 2016
  - update for pwiz 3.0.9935


-------------------------------------------------------------------------------------------
----                                OpenMS 2.0.1   (released 4/2016)                   ----
-------------------------------------------------------------------------------------------
OpenMS 2.0.1 is a source only release of the core libraries and tools. 
With over 300 merged pull requests, it introduces a considerable number of new features, 
bug fixes and speed improvements.

Notable changes are:

File formats:
  - Improved mzIdentML support (experimental)
  - Improved mzTab support (experimental)
  - Comet pepXML file reading support (experimental) 
  - Search parameter units are retained through id files
  - Faster base64 decoding in XML files

Databases:
  - HMDB has been updated to version 3.6

TOPPView:
  - Added slight margin around data range (%2) for improved visualization
  - Added FeatureFinderMultiplex to the tools accessible from TOPPView
  - Some fixes to the scrollbar behaviour

Added tools:
  - IDScoreSwitcher -- Switches between different scores of peptide or protein hits in identification data (UTIL)
  - LuciphorAdapter -- Modification site localisation using LuciPHOr2 (TOPP)
  - MetaProSIP -- Performs proteinSIP on peptide features for elemental flux analysis (UTIL)
  - MzMLSplitter -- Splits an mzML file into multiple parts (UTIL)
  - OpenSwathAssayGenerator -- Generates assays according to different models for a specific TraML (TOPP)

Removed tools:
  - RTAnnotator -- Annotates identification files that are missing the RT field (UTIL)

Tools with major changes:
  - OpenSWATH now outputs peak apices
    - Improved iRT correction
    - Assay generator
    - UIS scoring
  - Deuterium labeling in MetaProSIP (experimental)
  - XTandemAdapter allows for external config file
  - TextExporter can optionally export PeptideIdentification and PeptideHits meta-values
  - FeatureLinkerUnlabeledQT speed improvements
  - FileMerger allows to concatenate files in RT
  - MzTabExporter supports protein IDs
  - PeakPickerWavelet speedup
  - HiResPrecursorMassCorrector supports correction of precursors to detected features
  - FeatureFinderMultiplex speed improvements

Library:
  - Support for user definable enzymes available in EnzymesDB.xml
  - PeptideIndexing is now available as internal algorithm
  - EnzymaticDigestion allows for minimum / maximum length constraints
  - HyperScore and PScore implementations
  - Fits allow extrapolation of data values
  - QT clustering is now order independent
  - Additional convinience functions to access the nearest spectrum peak in a mass tolerance window
  - User defined averagine compositions
  - A fast linear lowess implementation has been added
  - MetaInfoInterface has been added to FeatureMap to store additional meta-values
  - Calculation of Median Absolute Deviation

General:
  - OpenMS writes indexed mzML by default
  - OpenMS home directory can be configured through OPENMS_HOME_DIR environment variable
  - Updated GenericWrapper definitions for MS-GF+ and Mascot

Third party software:
  - LuciphorAdapter (experimental) PTM localization using the LuciPHOr2 algorithm (http://luciphor2.sourceforge.net/)


-------------------------------------------------------------------------------------------
----                                OpenMS 2.0     (released 4/2015)                   ----
-------------------------------------------------------------------------------------------
Release date: February 2015

OpenMS 2.0 is the first release after the switch to git and a complete overhaul of the
build system. It introduces a considerable number of new features and bug fixes.

Furthermore, we removed the dependency to GSL and replaced the functionality using
Eigen3 and Wildmagic. Thus, the OpenMS core and the full build are now under a more
permissive non-GPL (e.g., Apache or BSD) license.

File formats:
  - mzQuantML support (experimental)
  - mzIdentML support (experimental)
  - mzTab support (experimental)
  - Indexed mzML support
  - Support for numpress encoding in mzML
  - Major speed improvement in mzML / mzXML parsing (up to 4x for some setups)

TOPPView:
  - Support for visualizing mass fingerprinting hits from featureXML along with their raw spectra in MS1
  - Improved "Tools" -> "Goto" dialog
  - Improved display of m/z, RT, and intensity values 1D and 2D view

New tools:
  - FeatureFinderIdentification -- Detects features in MS1 data based on peptide identifications (TOPP)
  - FeatureFinderMultiplex -- Determination of peak ratios in LC-MS data (TOPP)
  - FidoAdapter -- Runs the protein inference engine Fido (TOPP)
  - LowMemPeakPickerHiRes -- Finds mass spectrometric peaks in profile mass spectra (UTIL)
  - LowMemPeakPickerHiRes_RandomAccess -- Finds mass spectrometric peaks in profile mass spectra (UTIL)
  - MRMTransitionGroupPicker (UTIL)
  - MSGFPlusAdapter -- MS/MS database search using MS-GF+ (TOPP)
  - MetaboliteSpectralMatcher -- Find potential HMDB ids within the given mass error window (UTIL)
  - OpenSwathWorkflow -- Complete workflow to run OpenSWATH (UTIL)
  - PeakPickerIterative -- Finds mass spectrometric peaks in profile mass spectra (UTIL)
  - RTAnnotator -- Annotates identification files that are missing the RT field (UTIL)
  - SimpleSearchEngine -- Annotates MS/MS spectra using SimpleSearchEngine (UTIL)
  - TopPerc -- Facilitate input to Percolator and reintegrate (UTIL)

Deprecated tools:
  - DBExporter -- Exports data from an OpenMS database to a file (TOPP)
  - DBImporter -- Imports data to an OpenMS database (TOPP)
  - FeatureFinderRaw -- Determination of peak ratios in LC-MS data (TOPP)
  - SILACAnalyzer -- Determination of peak ratios in LC-MS data (TOPP)

Status changes:
  - PhosphoScoring (UTIL -> TOPP)

Tools with major changes:
  - OpenSWATH now supports MS1 extraction and labelled workflows
  - OpenSWATHWorkflow single binary (high performance integrated workflow)
  - IsobaricAnalyzer now supports TMT 10-plex

General:
  - Removed GSL dependencies
  - Introduced low memory versions of various algorithms
  - OpenMS now offers a single interface for different implementations to access mass spectrometric data
      - in memory
      - on disk with index
      - cached on disc for fast access
    as well as a chainable, low memory sequential processor of MS data (using a separate interface)
  - pyOpenMS now supports python 3.x
  - Refactored AASequence, major speed improvement (~40x) for construction of unmodified sequences

Third party software:
  - Added Fido support
  - Added MS-GF+ support

Changes to the Build System / Package System:
  - Restructured repository layout and build system
  - Added support for Travis CI
  - Simplified pyOpenMS build system
  - Support for Visual Studio 2013


Resolved issues and merged pull requests:
  #644 Fix header macros
  #649 Fix ms numpress
  #651 [INTERNAL,API] Removal of the GSL
  #656 Repository layout restructuring
  #657 [FIX, INTERNAL]
  #658 [FIX] PeptideIndexer crashes on empty idXML (#653)
  #659 [NOP] replaced c like file ending C with cpp
  #660 [FIX] fix Cython 0.20 compatibility issue
  #661 [BUILD,PYOPENMS] simplify pyOpenMS build system
  #662 CMake and docu cleanups w.r.t. to the new layout
  #664 [BUILD] build system fixes / cleanups
  #665 Fix coverity errors
  #666 [FEATURE] ib spectra format export
  #667 [BUILD] improved handling of boost in OpenMS build system
  #668 [NOP] added support for travis-ci to OpenMS
  #669 [FIX] fixed AccurateMassSearch_test
  #673 [FEATURE,FIX] Added min/max values to go-to dialog
  #675 Checker/Test fixes and adds test for CTD writing
  #677 [PYOPENMS] setup.py as minimal as possible + other improvements
  #678 [FIX] fix how swath files are annotated
  #679 [FIX,TEST] fixed OpenSwathDecoyGenerator / MRMDecoy
  #680 [INTERNAL] Feature/CachedMzML fixes
  #684 [FIX] Bugfix for threading issue in MascotGenericFile
  #685 Typo fixes in documentation and licence files
  #688 Fix/file size limit
  #689 [FIX] disable OpenMP again for ILPDCWrapper
  #690 Fix/misc
  #691 further improvements to MGF::load()
  #693 Major speedup of String --> Double conversion
  #694 added missing index file for OMSSA test, which gets recreated when runni...
  #696 [FIX] fix RAM usage when adding dataprocessing to chromatograms
  #697 [FIX] proper usage of map in ControlledVocabulary
  #698 Updates to FeatureFinderIdentification and the ...TraceFitter classes
  #702 Feature/parallel reader
  #703 Feature/aa sequence tpp
  #705 [FIX] Propagate metadata in OpenSwathWorkflow
  #707 [FEATURE] variable stylesheet support for qcml
  #708 [BUILD] fix build system bug
  #711 [FEATURE,BUILD] fix install target
  #713 Fix for pepXML loading bug (#710)
  #715 Feature/pyopenms wrapping improvements neu
  #716 [NOP,TEST] clean up MRMDecoy, add more tests
  #717 fixed 32bit memory limitation of OMSSA by chunking input data
  #718 [FIX] fixed misleading warning ("Removed x peptide identifications...
  #719 [CI,FIX] fix travis contrib clone problems
  #721 [INTERNAL] cleanup of iostream includes
  #722 Feature/mz xml consumer
  #724 Feature/pyopenms mzxml consumer
  #725 Fix/misc
  #726 IDPosteriorErrorProbability fix
  #729 Fix/coverity
  #730 Feature/peak picker sn performance
  #734 Feature/more pyopenms improvements
  #735 [FEATURE] clang warning level
  #737 [FIX] several minor fixes
  #739 Feature/uids fileconverter
  #741 ProteinResolver fix
  #742 svn cleanup
  #743 [FIX] fixed compilation error on vs2013
  #747 Speedup OMSSA-XML parsing and some stats for OMSSA&XTandem
  #749 Feature/python3
  #750 [PYOPENMS,FIX] fixed streampos->long conversion
  #751 [FEATURE] track base name when reading pep.xml files
  #752 [FIX] fixed missing adaption PeptideIdentification::empty()
  #754 [PYOPENMS] changed extra methods on MSSpectrum
  #755 [FIX] fixed shadow warning
  #756 Unity Builds
  #760 [FIX-#618] fix spelling errors in headers
  #761 Feature/header fixes
  #764 [FEATURE] lib superhirn
  #765 Feature/db removal
  #768 [FIX] fixed warnings in CONCEPTS
  #770 [FIX] fixed some clang warnings in stream manipulation
  #771 New warnings
  #773 [BUILD,PYOPENMS] fix pyOpenMS build
  #775 [FIX] typos in the CMake file
  #776 Fix for IDPosteriorErrorProbability on Mascot search results (#740)
  #777 Memory profiling class
  #779 [FIX] replaced DoubleReal and Real by double and float.
  #780 [FIX] fix Swath window estimation
  #781 Fix/open swath fixes
  #784 [FEATURE] fix macosx pyopenms errors
  #785 [FIX] VS2013 compile fixes
  #786 [FEATURE] added openms_add_library function
  #787 [FEATURE,BUILD] move pyOpenMS to src
  #789 small fix to Win install doc for VS2013
  #790 Remove "RT"; and "MZ"; metavalues from PeptideIdentification
  #791 [FIX] forgot writtenDigits fixes in tests VS2013
  #792 [FIX] AASequence refactoring
  #794 Generic Wrapping of R scripts using GenericWrapper
  #797 [NOP,DOC] removed all remaining references to FeatureFinderRaw and SILAC...
  #798 Fix/py open ms testfix
  #799 [DOC] removed migrated pages from doxygen. replaced by link to wiki
  #800 spline interpolation of MS1 spectra
  #801 RTPredict: fixed order of parameters and doc
  #802 [FIX] fixed copy-paste mistake in error message
  #804 [FIX] MRMDecoy: Fix neutral losses for higher charge states
  #805 [PYOPENMS] added getters/setters for MZ and RT in PeptideIdentification....
  #807 cubic spline implementation
  #810 cubic spline interpolation
  #811 [NOP] add better debug information and error handling
  #812 [FIX] per cppcheck
  #813 Fix/openswath
  #814 [FEATURE] ConvertTSVToTraML: Support for SpectraST MRM Transition Lists
  #816 Feature/cached mz ml format change
  #817 [FIX] fix spline derivative for cubic spline
  #819 Feature/custom i rt
  #820 Fix/warnings
  #821 [FIX] suppress clang warnings
  #823 Feature/update numpress
  #824 Fix/coverity
  #826 Feature/funny pictures
  #827 [FIX] fixes export macro warnings
  #831 [FEATURE] fix all gcc warnings and turn warnings into errors
  #832 several pyopenms fixes + updates
  #833 Feature/visibility hidden
  #834 Fix/fix werror
  #835 Fix spline spectrum
  #836 [FIX,TEST] MRMRTNormalizer_test: Windows compatibility
  #838 [FIX] fixed uninitialized pointer warning
  #840 [FIX] fix pyOpenMS test
  #841 [BUILD] disable -Werror by default
  #842 [FIX] fix dereference of iterator
  #843 [FIX] fixes tests failing win debug mode
  #844 [FIX] evaluation at m/z in first package now possible
  #845 [FEATURE] replace String classes with StringUtils
  #846 Fix/fixes from822
  #847 peak boundaries and new cubic splines for PeakPickerHiRes
  #850 [FEATURE] modified tests to reflect X!Tandem SLEDGEHAMMER as default
  #851 Fix and tests for a bug in reading Mascot XML files
  #852 [FIX] fix windows compile error
  #854 [FIX] ConsensusID doesn't sort peptide hits before processing (idXML)
  #855 [FIX] FalseDiscoveryRate "target+decoy"; hits should be considered as targets
  #856 [FEATURE] KNIME package generation updates
  #857 Fix/py open ms fix
  #858 [FEATURE] ~40x speedup for constructions of unmodified AASequence
  #859 Feature/SystemWildMagic
  #863 [BUILD] added test for x!tandem version to enable tests only with newer ...
  #865 Work-around for special modifications in Mascot (fixes #864)
  #866 [FEATURE] git version embedding
  #867 [FIX-#861,DOC] fixed eigen 3.2.1 problems with GammaDistributionFitter
  #868 multiplex filtering
  #869 [FIX] fixed problems with negative sizeof values in CachedMzML
  #870 [FIX,DOC] doxygen 1.8.7 fixes
  #873 [FIX] fixed macosx version query
  #875 Rewrite of 'AASequence::parseString_', increasing robustness of parsing (fixes #818)
  #876 [DOC] added new doc_class_only target
  #880 PeakPickerHiRes peak boundaries fixed
  #881 [FEATURE] mzTab 1.0
  #882 [FEATURE] coding style improvements
  #884 [FIX] Convert XTandem search results into .pepXML by IDFileConverter
  #885 [NOP] added moc files to gitignore
  #888 [FIX-#887] IDFilter errornousely removed peptidhits in multiple run files
  #889 multiplex clustering
  #891 [FIX] converting uniform distributed generators with normal distributions
  #892 Enable loading of some pepXML files that used to cause crashes
  #894 [FEATURE] improved 3rd party lib finding
  #895 [FEATURE] simple search engine
  #896 added scan-polarity filter to FileFilter ...
  #897 (feature for Windows developers) added a small Windows .reg file
  #898 More compact format for MGF files (fixes #890)
  #899 [DOC] some minor documentation addition
  #901 [FIX] fix MS level for DTA file reader
  #902 [FIX,PYOPENMS] fix pyOpenMS after #875
  #903 [FIX] mzXML fix (filterLine, basePeakMz)
  #904 Feature/fix peak boundaries
  #910 [FIX] fixed unity build error introduced in #845
  #911 [FIX] FFCentroided replace exception handling with proper check
  #914 fix index in CubicSpline2d
  #916 IDMapper extension for featureMaps
  #917 AccurateMassSearchEngine annotation of input map (not only mzTab output)
  #919 [FIX] libc++ test fixes
  #920 [FIX] fixed minor problem with knime package generation and cmake versions >2.8.11
  #921 MS1 annotation in TOPPView
  #922 [FIX] build system improvements
  #923 EmpiricalFormula: fix (negative counts were casted away)
  #924 Switch to disable tracking of Git version within OpenMS
  #925 Fix/small docu improvement
  #926 Feature/spellcheck
  #927 PeptideIndexer: support for treating isoleucine/leucine as equivalent (resolves #872)
  #928 Build System
  #929 TextFile feature (skip empty lines) and docu fix
  #930 check for missing peaks
  #931 fix for evaluation at last node
  #936 [FIX] fixed the 'variable' consumption of xslt files for a QcML file.
  #938 [FEATURE] precursor scoring
  #939 [FIX] fix compile error
  #940 coding convention violations in MultiplexClustering fixed
  #943 [FIX,PYOPENMS] fix pyOpenMS after #889
  #944 [FIX,TOOLS] pyopenms parser fix
  #945 [FEATURE] pyopenms wrap improved
  #946 OPENMS_DLLAPI removed from GridBasedClustering
  #947 [FEATURE] FeatureFinderMultiplex
  #949 Fix/xml escape
  #950 Feature/traml heavylight
  #951 [FIX] add setOptions method for FileHandler
  #955 Fix/xml escape
  #958 [FIX] disallow concurrent access to the static PRNG
  #959 Feature/pyopenms copyconstr
  #960 [FEATURE] peptide group label new
  #962 [FIX] QCCalculator now computes TIC only on MS1 spectra (fixes #96)
  #964 [FIX] check for invalid charge ranges in search engine adapters (see #963)
  #965 [FEATURE] tmt 10plex support
  #966 [FEATURE] chaining consumer
  #967 [FEATURE,TEST] mssim more ground truth in id xml
  #968 [FEATURE] export PT value analogous to predicted rt value in TextExporte...
  #969 [FEATURE] add a low memory FileConverter option
  #970 [FEATURE] test if java can be executed
  #972 Fix/file cleanup
  #973 [FIX] validate presence of input file before starting executable
  #977 [FEATURE] replaced pphires ms1_only flag with ms_levels parameter
  #981 Feature/TextExporter_mzML
  #983 [FEATURE] add library check on Windows for correct lib arch
  #984 [NOP] add heavy methyl SILAC labels to unimod.xml
  #985 [FEATURE] bspline support using eol bsplines implementation
  #988 [FIX] simplified EmpiricalFormula
  #990 [FIX,FEATURE] TransformationModelInterpolated readded
  #993 Feature/sort on load (mzML, mzXML)
  #994 fixes mass traces in featureXML output
  #995 fixes CubicSpline2d constructor exceptions
  #996 allow for SplinePackages based on just two data points
  #1000 fixes problems with ">>" generated in nested C++ templates
  #1001 Fix/py open ms test
  #1002 [pyOPENMS] features
  #1003 [FIX] fixes random fails of MSSim_test
  #1006 [FEATURE] enable gui less OpenMS
  #1009 update unimod.xml with newest version from unimod.org
  #1010 [FIX] external code tests updated/fixed
  #1011 [FIX] external project doc
  #1012 [FEATURE] decreased memory footprint of Feature class by up to 44%
  #1014 TOPPView: group separator for mz,rt and int values in 1D and 2D canvas
  #1019 [FIX] fixed unitybuild problem on win32 with eol-bsplines
  #1020 [NOP] updated copyright/license header to 2014
  #1021 Feature/py open ms fixes and wraps
  #1024 sorting mass shifts in FeatureFinderMultiplex
  #1025 Fix/checker fixes
  #1026 additional example in SplineSpectrum test
  #1027 Adapter for Fido (protein inference engine), solves #808
  #1029 [FIX-#184] remove public vector/map inheritance
  #1032 fixes peak boundaries in PeakPickerHiRes (resolves #1022)
  #1034 [FIX] improve set_peaks documentation
  #1035 B-spline interpolation for peak width estimation in MultiplexClustering class
  #1036 [FEATURE,API] Removed template parameter from FeatureMap
  #1037 Fix/ TraML load/store
  #1038 Feature/py open ms wraps
  #1039 Fix/debug fix
  #1040 Fix/spellcheck
  #1044 [FIX:#1043]fixed featureXML reading spectrum_reference as String
  #1045 [FIX] fix compile issue on win32 systems
  #1046 Fix/py open ms wrap
  #1047 [FIX] first probe install path, then the build path for share/OpenMS
  #1048 Feature/peptide hit protein locations
  #1050 Re-added B-spline transformation for non-linear RT alignment in MapAlignerIdentification
  #1051 [FIX] made arguments and functions in BSpline2d const (if possible)
  #1055 [FEATURE] improved purity computation for IsobaricAnalyzer
  #1056 [FIX] UniqueIdGenerator susceptible to identical RNG seeds
  #1057 GenericWrapper doc has minor quirks
  #1058 Feature/openswathwf add
  #1059 Switch to version 2.0
  #1061 FeatureFinderIdentification: documentation, tests, parameter improvements
  #1063 Fix/accession nr
  #1065 PeakPickerHiRes docu updated
  #1067 Testing/mzid
  #1069 Fix and test for issue #1068 (bug in "AASequence::operator<" involving N-terminal modifications)
  #1070 removing zeros in profile data caused by Thermo bug
  #1072 PeakPickerHiRes: disable spacing constraints for chromatograms (fixes #1060)
  #1074 'intensity weighted mean'; averaging added to ProteinQuantifier, solves #830
  #1076 Adapter for MS-GF+ search engine
  #1077 [TESTING] download and add MSGFPlus in travis-ci
  #1078 [FEATURE] export aabefore and aaafter in peptideindexer
  #1079 Linear extrapolation (and other options) for B-spline transformation
  #1080 [NOP] refactored PeptideHit protein accession extraction to true member
  #1082 [NOP] removed index file as these are recreated by MSGF+ anyways
  #1083 Feature/mz tab fixes
  #1084 [FIX] compile fixes
  #1086 Update (indistinguishable) protein groups when filtering protein identifications (fixes #748)
  #1087 centroided input data for FeatureFinderMultiplex
  #1088 Fix FileConverter's "write_mzML_index" flag
  #1089 Fix/mzid
  #1090 Enable mzIdentML input in IDFileConverter
  #1091 Feature/mz tab cleanup
  #1092 [NOP] removed unnecessary index files
  #1094 [FIX] fixed small bugs preventing a build on windows
  #1097 [FIX] consistent use of wildmagic
  #1098 Revert "[FIX] consistent use of wildmagic"
  #1099 [FIX,BUILD] fix Windows build
  #1100 Fix/windows fix
  #1101 optimisation for knockout searches in FeatureFinderMultiplex
  #1102 Fix/fix spellcheck
  #1104 [FIX] fix compile warning from unused variables
  #1108 [FIX] fix compile warnings and increase QT min version to 4.6
  #1109 [FIX] removed support for multiple id formats in tools without
  #1115 fix some windows compile warnings
  #1116 fix segfaults in XTandemXMLFile and IsobaricChannelExtractor
  #1118 Feature/swath window loader
  #1121 [FIX] some VC 2013 static tests fixed
  #1122 Fix PeakPicker Wavelet
  #1123 [FEATURE] remove PeakType template argument from FeatureFinder
  #1124 [NOP] addendum to #1123
  #1125 optimisations in FeatureFinderMultiplex
  #1126 [FIX] intermediate fix for win32 systems
  #1127 [FEATURE] create uncrustify branch
  #1128 Fix/RT meta value related bug, removed unused comment
  #1131 Make BuildSystem's LibCheck fail-safe
  #1135 Fix/ams mz tab export
  #1136 [NOP] uncrustified
  #1137 [FIX] added -b option to create new branch
  #1140 [FIX] fixed bugs in AScore implementation and added deisotoping as
  #1141 Fix AccurateMassSearch and visualization
  #1145 Fix/spellchecks
  #1147 Fix/copyright update
  #1150 Added PhosphoScoring tool to TOPP documentation
  #1151 Changelog 2.0
  #1152 [FIX,PYOPENMS] fix and adopt pyOpenMS
  #1153 minor amendmend to last fix (better console output)
  #1154 [TEST] fix test
  #1156 [FIX-#618] fix spelling errors
  #1157 [NOP] correct version in LICENSE file
  #1158 [FIX] make identifier of multiple identification runs unique
  #1161 pyOpenMS 2.0 features
  #1162 [FIX] fixed study variable index start at 1. Added global identifiert to
  #1164 [FIX] pepXML does on some occassion contain very small fixed
  #1165 Added minimal test cases for checker.php Missing test errors
  #1169 [FIX] fixed segfault if searchparam requested on empty proteinids
  #1170 [FIX,TEST] FidoAdapter test
  #1172 [FIX] fix for the write out of mzid
  #1173 [FIX] changed path String parameter to input files
  #1174 [TRAVIS] added Fido executables and adapted to new directory structure
  #1175 [FEATURE] add ConsensusMap push_back
  #1176 [BUILD] added support for new thirdparty executables in KNIME
  #1179 [FIX] added missing option to apply e-value filtering
  #1180 [FIX] fix toolnames for KNIME packaging
  #1181 fixed minor typo in error message
  #1184 [FIX] we decided to add the missing struct mapping file and in the
  #1185 [FIX] added missing elements and spike ins
  #1186 Fix/docu qc mzid
  #1187 [FIX] AMS: export observed-Mass in mzTab as well
  #1188 [Build] Added support for new third party binaries for dmg packaging. Adapted Li...
  #1189 Feature/sn
  #1190 [TEST] fix test
  #1192 [FIX] HMDB: removed duplicates introduced by including spike ins
  #1194 [NOP] removed deprecated qc toppas workflow
  #1195 [STYLE] Changed header guards mentioned by checker.php
  #1196 [FIX] XTandemAdapter added option to disable isotope error flag
  #1198 [TEST] fix
  #1199 [TEST,FIX] changing the order of the test fixes the issue
  #1201 Fix/lp wrapper param file
  #1203 [TEST,FIX] set reasonable comparison tolerance
  #1204 Removes debug code from FeatureFinderMultiplex
  #1206 [TEST] fix test error
  #1212 [FIX] and/or extension to IDFilter: Added support for old target_decoy user param in decoy filtering.
  #1213 [DOC] improve linux install doc
  #1215 [FIX] export AMS result as valid mzTab
  #1218 [FIX] consistent use of wildmagic: TransformationModelLinear
  #1219 [FIX] Map index stored as meta value in peptide identification
  #1220 change parameter ranges in FeatureFinderMultiplex
  #1224 updated KNIME license
  #1225 [FIX][TEST] Fido replacing scores
  #1226 Ammend to pull request #1212
  #1228 [FIX, PYOPENMS] fixed pxd file
  #1229 [DOC] merged License.txt and LICENSE for more complete description
  #1230 Updated ACTIVE_MAINTAINERS with people commiting, starting in 2012. Remo...
  #1231 Added Deuterium and Tritium to Elements.xml, as LIPIDMAPS contains sum f...
  #1232 Fix amt
  #1237 [FIX] minimum value for max_length should be 0 not -Inf
  #1240 [FIX] Fix/id filter blacklist
  #1242 Fix amt
  #1243 fixes INIUpdater test
  #1246 Updated problematic FidoAdapter test (fixes #1171)
  #1247 [FIX] added missing function
  #1248 [FIX, PYOPENMS] ammend to last commit
  #1249 Documentation improvements (and minor fixes)
  #1250 Another FidoAdapter test fix
  #1253 [FIX] IsobaricAnalyzer: set charge states of consensus features
  #1254 [DOC,FIX] Updated CHANGELOG, changelog_helper.sh
  #1256 Fix MSGFPlusAdapter running in TOPPAS (mzid output)
  #1257 Clean-up of UTILS documentation
  #1261 [KNIME] adapted parameter naming for FidoAdapter in KNIME
  #1262 IDFilter reports empty results
  #1263 [FIX] moved TopPerc to UTILS and changed experimental status of MSGFPlus
  #1266 [FIX] ammend to last commit
  #1267 [FIX] fix conversion from Feature with Masstraces to MSExperiment
  #1269 IsobaricAnalyzer: documentation, warning fix
  #1270 [FIX] lexical cast is discouraged. Use of build in functions.
  #1273 [FIX][BUILD] Fixes linking issue with boost in UTILS #1272
  #1275 [FEATURE] [FIX] mass trace RT spacing
  #1283 [PYOPENMS] Better PepXMLFile write support
  #1284 [FIX] KNIME execution of MSGFPlusAdapter
  #1286 [FIX] set low memory log type correctly
  #1290 [FIX, PYOPENMS] fix python binding for MassTrace
  #1305 [FIX] Fix/id mapper statistics
  #1307 remove OS X specific code for opening folders
  #1309 [FIX] Ammend to #1284
  #1315 sync develop additions

-------------------------------------------------------------------------------------------
----                                OpenMS 1.11.1  (released 11/2013)                  ----
-------------------------------------------------------------------------------------------
Release date: November 2013

OpenMS 1.11.1 is a bugfix release resolving the following issues with OpenMS 1.11:

TOPPAS:
- fixed bug that caused TOPPAS to crash when a connection between nodes was added under certain circumstances

TOPP:
- XMLValidator can now be used on mzML files
- fixed bug in MSSimulator/EnzymaticDigestion where amino acid "U" was leading to crash
- fixed some problems with protein modifications in MascotAdapterOnline
- fixed potential problems of TOPP help screens on small screens / small terminal windows

Build system:
- fixed issues with CMake 2.8.12
- fixed potential clang compile errors

General:
- fixed issues with MIME types in KNIME

Resolved issues:
  #606 TOPPAS crashes during creation of certain edges.
  #609 MascotAdapterOnline: Problems with modifications
  #614 Amino acid "U" leads to crash in MSSimulator/EnzymaticDigestion
  #629 OpenMS is incompatible with CMake 2.8.12
  #630 Knime mime.types file should have lower case mime type names
  #633 ConsoleUtils::breakString triggers uncaught exception if terminal size is too small

------------------------------------------------------------------------------------------
----                                  OpenMS 1.11                                     ----
------------------------------------------------------------------------------------------
Release date: August 2013

OpenMS 1.11 is the first release with fully integrated Python bindings (termed pyOpenMS).
For further details, please refer to https://pypi.python.org/pypi/pyopenms

File formats:
- QcML support
- pepXML exported from Mascot (added support)
- mzTab updated to 1.0RC3
- ParamXML updated to v 1.6.2
- support for CTD schema 0.3
- full support of sourceFile tag in mzML (all source files are written, SHA1 support)

TOPPView:
- handle .mzML file with mixed spectra and chromatograms (prefer spectra)
- chromatograms of all types can be displayed (not just SRM)
- link to documentation and webpage fixed
- fix a segfault when loading empty chromatograms into TOPPView

TOPPAS:
- link to documentation and webpage fixed

TOPP tools:
- MODIFIED:
  - FeatureLinkerUnlabeledQT: performance (speed and memory) improvement
  - FeatureLinkerUnlabeled: performance (memory) improvement (now constant in number of input maps)
  - MapAlignerPoseClustering: performance (memory) improvement (now constant in number of input maps)
  - EICExtractor: critical bugfix if the input map was not sorted
  - PeptideIndexer: by default now demands that the peptide is fully tryptic ("-enzyme:specificity none" restores the old behavior)
  - FileFilter: filter MS2 spectra by consensus map feature overlap, collision energy, isolation window width
  - ProteinResolver: documentation and interface improvements
  - QCCalculator/QCEmbedder/QCExtractor: multiple improvements
  - WindowMower: speed improvement (movetype either slide or jump [faster])
- ADDED
  - AccurateMassSearch: AccurateMassSearch assembles metabolite features from singleton mass traces.
  - IsobaricAnalyzer: Extracts and normalizes isobaric labeling information from an MS experiment. This merges the previous TMTAnalyzer and ITRAQAnalyzer functionality
  - QCExtractor: Extracts a table attachment to a given qc parameter
  - QCImporter: Embed tables or pictures in QcML

General:
- Python bindings allow full access to the OpenMS API from Python
- TOPPTools now support passing of all parameters on the command line (use --helphelp)
- Better chromatogram support (for NoiseFilterGaussian, NoiseFilterSGolay, PeakPickerHiRes)

Search engine support:
- Mascot 2.4 is now supported
- OMSSAAdapter with improved memory footprint
- N-terminal modifications work now with X!Tandem

Changes to the Build System / Package System:
- shared linking works for all contrib packages with automated detection using CMake find modules
- upgrade of xerces to version 3.1.1
- upgrade of libsvm to version 3.12

Development:
- public inheritance from std::vector and std::set has been reduced in the
  OpenMS codebase (removed from ConsensusFeature, FeatureMap, ConsensusMap,
  MSExperiment)
- addition of the OpenMS/INTERFACES folder which contains proposed OpenMS
  interfaces for reading/writing spectra

Deprecated:
- TMTAnalyzer, ITRAQAnalyzer -> please use IsobaricAnalyzer instead
- Several functions provided by std::vector in the MSSpectrum interface are now
  deprecated (e.g. push_back, reserve etc.)

Resolved issues:
  #120	Improve visual representation of edges
  #151	Optimize time/memory efficiency of critical tools/algorithms
  #184	Some OpenMS classes are derived from std::vector
  #309	FileConverter puts incorrect/incomplete information in <sourceFile>
  #343	OpenMS build system should allow searching for contrib libs also in system paths (e.g., /opt/local/..)
  #382	Excessive memory usage by MapAligners and FeatureLinkers
  #398	INIFileEditor doesn't save modified values if still in edit mode
  #457	Use system libraries instead of contrib
  #465	"-debug" option in TOPP tools doesn't show LOG_DEBUG messages
  #497	Non-intuitive way to edit parameters in TOPPView/TOPPAS/INIFileEditor
  #516	TOPPAS: "Refresh parameters" complains if no input files are present
  #517	MSQuantification::load declared but not implemented
  #519	Merge ITRAQAnalyzer and TMTAnalyzer
  #520	Support linking against shared libs
  #521	Upgrade contrib libsvm
  #522	Make parameters from subsections addressable from command line
  #523	Link to OpenMS website from within TOPPAS/TOPPView broken
  #524	PeptideIndexer does not honor cleavage sites
  #525	EICExtractor will report wrong intensities if input map is not sorted
  #527	pyOpenMS compile issue with clang
  #529	Strange naming of TextExporter parameters
  #531	Upgrade xerces-c version in contrib to 3.1.1
  #533	pyOpenMS
  #534	MascotAdapterOnline does not support Mascot 2.4
  #535	mzML with Spectra and Chromatograms
  #536	MascotAdapterOnline SSL and Mascot 2.4
  #537	Invalid Doxygen XML Files
  #540	IsobaricAnalyzer
  #541	AccurateMassSearch
  #542	TOPPView: switch to 3D view should pick the data layer automatically
  #544	featureXML version at 1.4 while 1.6 is the current version
  #549	Problems converting Mascot XML to idXML
  #552	pyOpenMS build system
  #553	TOPPView's "Apply TOPP tool" functionality is broken
  #554	FeatureLinkerUnlabeled(QT) - speed/memory enhancements
  #556	Setting parameter may not take effect
  #557	XTandemAdapter/mz-out scramble
  #562	cmake doesn't check for MSBuild.exe location on Windows
  #565	XTandemAdapter fails to add terminal modifications correctly to X!Tandem search
  #569	Segfault of IDEvaluator and IDEvaluatorGUI
  #570	FeatureLinkerUnlabeledQT regression
  #574	Update ParamXMLHandler to support v1.6.2 of Param schema
  #575	Upgrade TOPPBase's CTD support to new version of CTD schema
  #576	Cython 0.19 does not compile current pyOpenMS
  #578	Add qcML CV terms
  #580	XTandemAdapter finds non-tryptic peptides although cleavage rule is set to "[RK]|{P}"
  #582	Compile error with Boost 1.46
  #583	MascotAdapterOnline with Mascot 2.4.0 may never finish
  #584	FileFilter parameter -mz (mz range to extract) applies to all MS levels and not to a specified level
  #586	ModificationsDB_test relies on raw memory addresses
  #587	MascotAdapterOnline does not support SSL connections
  #588	MascotAdapterOnline does not support connections to public MatrixScience Mascot instance
  #591	Detection of MGF format via file content fails on our own files
  #593	Parameter default of 'tab' will be returned as single space
  #598  SILACAnalyzer (no label) crash
  #603  TOPPView: showing peptide annotations of feature maps also shows feature indexes

------------------------------------------------------------------------------------------
----                                  OpenMS 1.10                                     ----
------------------------------------------------------------------------------------------
Release date: March 2013

OpenMS 1.10 is the first release integrated into KNIME (www.knime.org).
To use OpenMS in KNIME please refer to the www.OpenMS.de for additional information.

File formats:
- TraML 1.0.0 support
- Initial mzQuantML, mzIdentML and mzTab support (not fully supported)

TOPPView:
- Concurrent zoom
- SRM data visualization

New tools:
- Superhirn
- OpenSWATH
- QCCalculator
- IDRipper
- FeatureFinderMetabo
- IDEvaluation
- RNPxl

General:
- Better chromatogram support
- Decoy strings can now be prepended
- Filter modified peptides
- Many memory and speed improvements
- TMT-6plex support
- EDTA conversion from feature and consensusXML in FileConverter
- Filtering of MS2 spectra by identifications

Search engine support:
- MyriMatch adapter

Changes to the Build System / Package System:
- Cpplint coding convention check integrated into build system
- Integration of OMSSA search engine in Windows and Mac installers
- Integration of X!Tandem search engine in Windows and Mac installers
- Integration of MyriMatch search engine in Windows and Mac installers

Development:
- Style corrections of the OpenMS source base using uncrustify

Deprecated:
- Conversion of Sequest files in IDFileConverter

Resolved issues:
	#513	Commented out the functionality of smartFileNames_() (not mature enough for the 1.10 release)
	#508	allow free columns for TSV
	#473	change in/out types again to csv
	#507	TOPPDocumenter now expects the path to the executables and can generate doc for TOPPView/TOPPAS on mac osx
	#506	added custom info.plist containing the path to OMSSA/XTandem for the GUI tools
	#505	goto dialogs now act with error tolerance
	#504	Fixed XTandemXMLFile loading when no encoding is given by XTandemXML file by enforcing ISO-Latin-1 (default would be utf-8, breaking the aminoacid sequence readin). Introduced enforceEncoding(encoding) to XMLFile.
	#316	SpectraTreeTab is not cleaned up when last layer is deleted
	#283	TOPPView: Scan view widget does not clear after closing last file
	#379	MapAlignerPoseClustering: -reference:index has no effect
	#384	replace zip libraries with The Boost Iostreams Library (already in contrib)
	#280	IonizationSimulation_test can not be compiled with OpenMP support on Mac OS X	(Unit) Tests
	#368	Check Example pipelines and tutorials if they still contain the Tools using the type parameters
	#341	Move IMS Mass Decomposition Code to OpenMS and remove IMS from contrib
	#330	Remove static references to 10.5 SDK in OpenMS and contrib builds
	#135	Remove temporary files after completion
	#301	IDExtractor has no documentation
	#78		Write generic Nightly Testing Script
	#355	Adapt documentation to the changes in the contrib handling of the build system
	#348	Update TOPP tool names in documentation
	#383	iTRAQ isotope correction & simulation broken for 8plex
	#333	CMake returning incorrect configurations.
	#378	Intensity issue for simulation of MS2 signals
	#264	PrecursorIonSelector crashs (SegFault) with minimal input
	#322	PeakPicker (wavelet) writes lots of "dataProcessing" junk to mzML file
	#327	Feature width not stored in featureXML
	#372	Calculation of rank correlation coefficient buggy
	#376	Command line parser does not recognize --help and --helphelp
	#374	IonizationSimulation takes ages to complete on very high abundance peptides
	#371	FileFilter should support filtering by meta values
	#359	Remove type argument from SpectrumFilter
	#346	Implement mechanism to convert pre1.9 toppas workflows to 1.9 workflows
	#345	Implement mechanism to convert pre1.9 ini files to 1.9 workflows
	#212	Nicer formatting of parameter listings in documentation
	#356	PeakPickerWavelet fails for broad peaks
	#332	TOPPAS: QWebView for downloading pipelines does not work behind proxy
	#366	SILACLabeler should adjust all channels to have the same RT elution profiles
	#365	Sampling of RT parameters in RTSimulation can produces abnormal RT parameters
	#364	Improve handling of user input while downloading workflows from the online repository
	#363	TOPP test need to define their dependencies to avoid wrong execution
	#360	Remove type argument from FeatureFinder
	#357	IDPosteriorError Prob crashes with small number of peptides
	#354	Adapt documentation to the changes in the contrib handling of the build system
	#344	remove TOPPBase type argument from MSSimulator
	#347	Contaminant simulation might produce wrong masses when used in unintended way
	#41		AndiMS for 32/64bit Windows and 64bit Linux.
	#326	PepXMLFile: use RT of MS2 spectra for peptide RT
	#321	Update Seqan to 1.3	Build System
	#331	TOPPAS: Active tab changes all the time under MacOSX (10.6 and 10.7)
	#106	Export for Workflows as image
	#325	No HTML for Internal FAQ
	#324	DecoyDatabase should support shuffling and contaminants	TOPP
	#323	MapAligner -apply_given_trafo's "invert" option only works from commandline	TOPP
	#209	Reading Bruker XMassFile failes with invalid DateTime String
	#236	TOPP tool API change will crash existing TOPPAS pipelines
	#282	TOPPAS updateParameters() might create invalid Pipeline
	#298	"Open in TOPPView" broken for MacOSX
	#320	TOPPAS Workflows should support a short documentation
	#318	FuzzyStringComparator::compareLines_ throws exception on gcc-4.6
	#317	ostream::operator<< for MSSpectrum is not working
	#314	Crash when selecting empty window
	#227	TOPPAS tmp directory not multi-user friendly
	#178	Warn if merger node is followed by a tool for single files, not lists
	#313	MascotAdapterOnline does not support Mascot 2.3
	#312	FilterFilter should support filtering by precursor charge
	#226	Specific isotopes in ElementsDB are generated with wrong masses
	#308	AASequence(iterator, iterator) constructor is invalid, since it ignores terminal modifications
	#305	TOPPView fails while opening mzML with intensities stored in an int32 array
	#234	File forwarding/merging broken
	#303	TOPPAS, TOPPView and ExecutePipeline: looking for TOPP tools
	#302	Simulator should support picked peak Ground Truth
	#300	Allow input node recycling	TOPPAS	closed	fixed
	#299	Enable automatic static code analysis of OpenMS using cppcheck
	#205	TOPPAS crashes
	#210	TOPPAS Merger nodes are buggy
	#259	Resume button broken
	#43		Discuss overhaul of OpenMS web site and possible migration to CMS	Website, FAQs, Screencasts
	#297	Simulation: Ionization does not consider n-term to carry charge
	#295	Split OpenMS library in two or more parts
	#296	PeptideIndexer might keep 1 old ProteinAccession

------------------------------------------------------------------------------------------
----                                  OpenMS 1.9                                      ----
------------------------------------------------------------------------------------------
Release date: February 2012

OpenMS 1.9 has some major changes in TOPP tool names and usage. Therefore all .ini files
for "typed" TOPP tools (i.e. those with a "type" parameter) built with OpenMS 1.8 and below
are incompatible! To fix your old .ini and .toppas files use the new
INIUpdater tool (see its documentation and the TOPP documentation in general).

OpenMS 1.9 removed support for Mac OS X 10.5.

Documentation:
- new Quickstart tutorial
- dedicated and reworked TOPPAS tutorial

TOPPView improvements:
-MODIFIED:
  - ConsensusFeatures can now be colored using MetaValues
  - better grid line drawing/calculation, extracted AxisPainter class
  - IdentificationView:
    - added automatic labeling with peptide fragment sequence
    - theoretical spectrum is now hidden by default (labeling contains relevant information for most use cases)
    - automatic zoom to measured MS2 data range

TOPPAS improvements:
	- TOPPAS allows for interactive download of preconfigured TOPPAS pipelines from OpenMS homepage
	- "Recycling" mode for nodes, useful for database input files (see docu for details)
- more flexible pipeline design for Merger nodes
- Merger nodes (merge, merge all) renamed to "Merge" (one round) and "Collect" (all rounds)


TOPP tools:
- ADDED:
  - MapStatistics: statistics for low level quality control
  - EICExtractor: quantify known RT, m/z locations in one or many LC/MS maps and align them
  - MassTraceExtractor: annotate mass traces in centroided LC/MS maps - useful for metabolomics and top-down proteomics (use FeatureFinder tools for peptides)
  - FeatureFinderRaw: feature finding on raw data
	- FeatureFinderMetabo: feature finding for metabolites
  - IDConflictResolver: resolve ambiguous annotations of features with peptide identifications
- MODIFIED:
  - FeatureFinder: split into FeatureFinderMRM, FeatureFinderCentroided, FeatureFinderIsotopeWavelet
  - FeatureLinker: split into FeatureLinkerLabeled, FeatureLinkerUnlabeled, FeatureLinkerUnlabeledQT
  - FeatureLinker tools remove unneeded data after loading featureXML files to conserve memory
  - MapAligner: split into MapAlignerIdentification, MapAlignerPoseClustering, MapAlignerSpectrum, and MapRTTransformer
  - model parameters of MapAligner tools are now set in the INI file
  - MapAlignerIdentification: don't fail if parameter "min_run_occur" is set too high, warn and use possible maximum instead
  - NoiseFilter: split into NoiseFilterGaussian and NoiseFilterSGolay
  - PeakPicker: split into PeakPickerWavelet and PeakPickerHiRes
  - PILISModel: split into PILISModelCV, PILISModelTrainer, and PILISSpectraGenerator
  - MascotAdapterOnline: now supports Mascot 2.3 servers
  - ProteinQuantifier: added support for writing idXML (suitable for export to mzTab)
  - IDFileConverter: when reading pepXML, fail if the requested experiment (parameters "mz_file"/"mz_name") could not be found in the file
- REMOVED:
  - AndiMS/NetCDF is no longer supported on any platform
  - removed IDDecoyProbability tool

UTIL tools:
- ADDED:
  - INIUpdater: update INI and TOPPAS files
  - TransformationEvaluation: evaluate a (RT) transformation by applying it to a range of values
- REMOVED:
  - CaapConvert
  - UniqueIdAssigner
  - HistView

Changes to the Build System:
	- TOPPAS now requires Qt's Webkit library
	- Use CMAKE_BUILD_TYPE instead of OPENMS_BUILD_TYPE (removed)
	- Use CMAKE_FIND_ROOT_PATH instead of CONTRIB_CUSTOM_DIR (deprecated)
  - Removed AndiMS, NetCDF and dependencies
	- Removed dependency to imslib, relevant classes were moved directly to OpenMS/CHEMISTRY/MASSDECOMPOSITION/IMS
- OpenMS now supports ctests functionality for optimized and parallel testing (see ticket #363)

Fixed Issues: (see also http://sourceforge.net/apps/trac/open-ms/report)
	#341 	Move IMS Mass Decomposition Code to OpenMS and remove IMS from contrib
	#330 	Remove static references to 10.5 SDK in OpenMS and contrib builds
	#301 	IDExtractor has no documentation
	#78 	Write generic Nightly Testing Script
	#355 	Adapt documentation to the changes in the contrib handling of the build system
	#348 	Update TOPP tool names in documentation
	#333 	CMake returning incorrect configurations
	#264 	PrecursorIonSelector crashs (SegFault) with minimal input
	#280	IonizationSimulation_test can not be compiled with OpenMP support on Mac OS X
	#322 	PeakPicker (wavelet) writes lots of "dataProcessing" junk to mzML file
	#327 	Feature width not stored in featureXML
	#372 	Calculation of rank correlation coefficient buggy
	#376 	Command line parser does not recognize --help and --helphelp
	#371 	FileFilter should support filtering by meta values
	#359 	Remove type argument from SpectrumFilter
	#346 	Implement mechanism to convert pre1.9 toppas workflows to 1.9 workflows
	#345 	Implement mechanism to convert pre1.9 ini files to 1.9 workflows
	#212 	Nicer formatting of parameter listings in documentation
	#356 	PeakPickerWavelet fails for broad peaks
	#363 	TOPP test need to define their dependencies to avoid wrong execution
	#360 	Remove type argument from FeatureFinder
	#357 	IDPosteriorErrorProb crashes with small number of peptides
	#354 	Adapt documentation to the changes in the contrib handling of the build system
	#41 	AndiMS for 32/64bit Windows and 64bit Linux..
	#326 	PepXMLFile: use RT of MS2 spectra for peptide RT
	#321 	Update to Seqan 1.3
	#324 	DecoyDatabase should support shuffling and contaminants
	#323 	MapAligner -apply_given_trafo's "invert" option only works from commandline
	#209 	Reading Bruker XMassFile failes with invalid DateTime String
	#236 	TOPP tool API change will crash existing TOPPAS pipelines
	#318 	FuzzyStringComparator::compareLines_ throws exception on gcc-4.6
	#317 	ostream::operator<< for MSSpectrum is not working
	#297 	Simulation: Ionization does not consider n-term to carry charge
	#383 	Simulation: iTRAQ isotope correction & simulation broken for 8plex
	#378 	Simulation: Intensity issue for simulation of MS2 signals
	#374 	Simulation: IonizationSimulation takes ages to complete on very high abundance peptides
	#366 	Simulation: SILACLabeler should adjust all channels to have the same RT elution profiles
	#365 	Simulation: Sampling of RT parameters in RTSimulation can produces abnormal RT parameters
	#344 	Simulation: remove TOPPBase type argument from MSSimulator
	#347 	Simulation: Contaminant simulation might produce wrong masses when used in unintended way
	#303 	TOPPAS, TOPPView and ExecutePipeline: looking for TOPP tools
	#305 	TOPPView fails while opening mzML with intensities stored in an int32 array
	#314 	TOPPView: Crash when selecting empty window
	#205 	TOPPAS crashes
	#227 	TOPPAS: tmp directory not multi-user friendly
	#282 	TOPPAS: updateParameters() might create invalid Pipeline
	#332 	TOPPAS: QWebView for downloading pipelines does not work behind proxy
	#135 	TOPPAS: Remove temporary files after completion
	#320 	TOPPAS: Workflows should support a short documentation
	#298 	TOPPAS: "Open in TOPPView" broken for MacOSX
	#106 	TOPPAS: Export for Workflows as image
	#364 	TOPPAS: Improve handling of user input while downloading workflows from the online repository
	#331 	TOPPAS: Active tab changes all the time under MacOSX (10.6 and 10.7)
	#210 	TOPPAS: Merger nodes are buggy
	#259 	TOPPAS: Resume button broken
	#300 	TOPPAS: Allow input node recycling
	#234 	TOPPAS: File forwarding/merging broken
	#178 	TOPPAS: Warn if merger node is followed by a tool for single files, not lists
	#313 	MascotAdapterOnline does not support Mascot 2.3
	#312 	FilterFilter should support filtering by precursor charge
	#226 	Specific isotopes in ElementsDB are generated with wrong masses
	#308 	AASequence(iterator, iterator) constructor is invalid, since it ignores terminal modifications
	#302 	Simulator should support picked peak Ground Truth
	#299 	Enable automatic static code analysis of OpenMS using cppcheck
	#43 	Discuss overhaul of OpenMS web site and possible migration to CMS
	#295 	Split OpenMS library in two or more parts
	#296 	PeptideIndexer might keep 1 old ProteinAccession
	#379  MapAlignerPoseClustering: -reference:index has no effect


Detailed list of changes to specific OpenMS classes:
- NEW:
	- compose_f_gx_hy_t (from imslib)
	- compose_f_gx_t (from imslib)
	- IMSAlphabet (from imslib)
	- IMSAlphabetParser (from imslib)
	- IMSAlphabetTextParser (from imslib)
	- IMSElement (from imslib)
	- IMSIsotopeDistribution (from imslib)
	- IntegerMassDecomposer (from imslib)
	- MassDecomposer (from imslib)
	- RealMassDecomposer (from imslib)
	- Weights (from imslib)
  - sum/mean/median functions added to header "StatisticFunctions"
  - PeptideAndProteinQuant: contains quantification code formerly included in ProteinQuantifier (TOPP tool)
- MODIFIED:
  - AASequence: removed AASequence(ConstIterator, ConstIterator) constructor, since it ignored Terminal Modifications; since there was no way to enable correct construction from two Iterators, we removed it
  - MapAlignmentAlgorithmIdentification: don't fail (exception: InvalidParameter) if value for "min_run_occur" is too high, warn and use possible maximum instead
  - MSSimulator: "type" parameter moved to "MSSim:Labeling:type"
  - Param: added new command line parser with improved functionality
  - PepXMLFile:
    - added reading support for pepXML version 1.17
    - set RT's of peptide identifications based on MS2 spectra, not the MS1 precursors as before (flag "use_precursor_rt" switches to the old behavior)
    - fail with ParseError if a requested experiment could not be found in a pepXML file
  - ProtXMLFile: set score type for peptides
  - TOPPBase: added methods to turn Param objects into command line parameters
  - TransformationModel: simplified handling of parameters
  - TransformationModelBSpline: new option to distribute breakpoints evenly at data quantiles (instead of uniformly over the data range)
  - lots more... too much to list



------------------------------------------------------------------------------------------
----                                  OpenMS 1.8                                      ----
------------------------------------------------------------------------------------------

TOPP tools:
- MODIFIED:
  - MapAligner: separated data extraction from transformation modelling - this allows to combine different algorithms and models; new option "invert"; reworked parameters (please see the MapAligner documentation and update your INI files)
  - FeatureLinker: now able to link consensus maps; added new experimental algorithm "unabeled_qt"; improved quality calculation in "unlabeled" algorithm
  - IDMapper, FeatureLinker ("unlabeled"/"unlabeled_qt" algorithms): now consider charge states by default (use parameter "ignore_charge" if you want to avoid this)
  - FileInfo: improved formatting of output
  - TextExporter: unified output formats
  - FileConverter: added conversion to consensusXML
  - ProteinQuantifier: redefined meaning of parameter combination "top 0"/"consensus:fix_peptides"
  - ITRAQAnalyzer: isotope corrected quantitation result is written to "-out" instead of the uncorrected values
  - GenericWrapper: now supports arbitrary external programs, when a .ttd file is present (see <OpenMS>/share/OpenMS/TOOLS/EXTERNAL)

UTIL tools:

TOPPView improvements:
- NEW:
  - Identification View (load idXML through Tools->annotate with identifications)
  - 1D view now supports vector graphics export when saving an image
  - Peaks in 2D view are drawn as circles at a high zoom level
  - TOPPAS pipelines can be edited and run directly from TOPPView

TOPPAS improvements:
- MODIFIED:
  - improved stability when using longer filenames
  - minor fixes (see bug tickets below)

OpenMS library improvements:
- Stability and consistency fixes mostly (see bug tickets below)

Changes to the Build System:
- minor only


Fixed Issues:
#277 	Crash upon annotation with idXML
#271 	Filename generation in TOPPAS broken
#278 	TOPP tools update only values from INI files, not restrictions
#273 	TOPPAS appends an extra "toppas" when saving files with uppercase TOPPAS extension
#272 	TOPPAS doesn't update the tab title after saving a new pipeline
#261 	ProteinQuantifier: handling of mod. peptides during protein quantification
#153 	"Unlabeled" FeatureLinker produces quality values that make no sense
#220 	TOPPAS: mzML.gz files are not recognized as correct input
#260 	InclusionExclusionListCreator creates invalid lists for Thermo instruments
#269 	OMSSAAdapter crashes when run from directory containing spaces
#267 	bug in StablePairfinder (distances)
#266 	TOPPAS "store" button for vertex' INI files always writes default INI
#129 	TOPPAS: Allow opening files in one layer
#105 	TOPPAS: Split TOPPAS.ini into Resource and Workflow files
#262 	PrecursorIonSelector handles input/output arguments incorrectly
#100 	TOPPView memory consumption high when copying data
#257 	CLang++ crashes with "SCEVAddRecExpr operand is not loop-invariant!" on EnzymaticDigestion
#233 	TOPPView's updateLayer does not reload all data
#247 	TOPPView: crashes if file is deleted while opened
#66 	"Tools -> Go to" coordinates should default to current view
#239 	seg. fault when loading featureXML into TOPPView from the wrong context
#221 	TOPPView: when loading a new layer, the zoom should not reset
#222 	IDMapper should support mapping charge-matched entities only
#255 	TOPPView's Projection is showing only single peaks at high zoom
#253 	TOPP tools should be able to write their type into ini file, without knowing it a priori
#252 	OMSSAAdapter crashes when v2.1.7 and 'precursor_mass_tolerance_unit_ppm' are used
#251 	XTandem Adapter ignores "no_refinement" flag
#198 	add Proteowizward to Windows binary installer
#246 	TOPPView: Update Layer broken
#149 	Support external tools not derived from TOPPBase
#245 	PeptideIndexer fails on ambiguous AA's
#244 	merging by Precursor in SpectraMerger
#242 	Protein coverage should be reported
#237 	RT corrections via BSpline transformation is unreliable for sparse regions (e.g. borders and extrapolation)
#235 	TOPPAS input file name lists should be sorted
#231 	FeatureFinder has faulty Averagine model
#229 	Digestor UTIL cannot write FASTA output
#27 	generate publication ready figures in SVG format - 1D view
#215 	FeatureFinder crashes with Segmentation fault
#213 	TOPPView crashs when loading mzML and featureXML
#224 	PepXMLFile produces invalid files (mod_aminoacid_mass position is 1-based)
#225 	msInspect pepXML parser can not handle OpenMS pepXML due to massdiff attribute
#223 	TOPPAS restores wrong parameter name when deleting an input/output edge
#217 	Caching in LogStream is not thread safe
#218 	FF should work on non-sorted data, but gracefully exit on negative m/z values
#214 	MapAligner crashes on certain data
#211 	TOPPAS: IDFilter RTPredict linking not possible
#150 	TOPPAS does not use user environment to find executables
#208 	Windows: hide extra console window when starting GUI apps
#207 	Projections show wrong axis names
#179 	adapt to command/console width
#206 	Parameter names should include subsection
#204 	TOPPView "Go To" Dialog should support UniqueID's
#202 	"Open file" dialog: "readable files" should include .gz files
#191 	changing from 1D to 2D,3D View and 3D to 2D if MS1 spectra are present
#196 	NoiseFilter, PeakPicker, BaselineFilter crash on certain input-data

Detailed list of changes to specific OpenMS classes:
- NEW:
  - BaseFeature: parent of Feature and ConsensusFeature
  - FeatureGroupingAlgorithmQT, QTClusterFinder, QTCluster, GridFeature: feature grouping for unlabeled data based on QT clustering
  - FeatureDistance: distance measure for features
  - TransformationModel: different models for retention time transformations
  - SvmTheoreticalSpectrumGenerator: simulator for MS/MS spectra

- MODIFIED:
  - Feature, ConsensusFeature: moved common parts to BaseFeature
  - StablePairFinder: moved distance calculation to FeatureDistance
  - TransformationDescription: reworked, some functionality moved to TransformationModel
  - all MapAlignmentAlgorithm... classes, PoseClustering[Affine/Shift]Superimposer, TransformationXMLFile, InternalCalibration: adapted to changes in RT alignment/transformation modelling
  - FeatureGroupingAlgorithm: support linking of consensus maps; new algorithm "unlabeled_qt"
  - BaseGroupFinder: new algorithm "qt"
  - IDMapper: consider charge states for matching
  - PepXMLFile: use E-value (instead of hyperscore) as score for X! Tandem results
  - FileHandler: accept endings ".pep.xml" and ".prot.xml" for pepXML/protXML
  - FeatureMap, ConsensusMap: "clear" also clears meta data by default
  - ConsensusMap: adapted signature of "convert" for feature maps (to mirror that for peak maps)
  - Param: remove() and ::removeAll() now delete empty nodes which have no subnodes nor entries (otherwise writing paramXML breaks)
  - TheoreticalSpectrumGenerator: getSpectrum() now generates all selected ion types not only b- and y-ions

------------------------------------------------------------------------------------------
----                                  OpenMS 1.7                                      ----
------------------------------------------------------------------------------------------
Release date: Sep 5th 2010

TOPP tools:
- TOPP tool categories have been reorganized
- TOPP documentation now has a predecessor/successor tool section and uniform algorithms subsection parameter documentation
- MODIFIED:
  - IDFilter: reworked parameter names and documentation (please see the IDFilter documentation and update your INI files)
  - IDMapper: reworked parameter handling (please see the IDMapper documentation and update your INI files)
  - FileMerger: can now merge featureXML
  - IDMerger: new option to integrate data from pepXML and protXML
  - MapAligner: improved handling of reference files, added several options to the "identification" algorithm
  - SeedListGenerator: new option to use monoisotopic peptide mass instead of precursor m/z for seeds from idXML input
  - Resampler: PNG image creation functionality removed and transferred to ImageCreator UTIL
  - FeatureFinder: deprecated algorithms "simple" and "simplest"
  - FeatureLinker: deprected algorithm "identification"
- NEW:
  - ProteinQuantifier: compute protein/peptide abundances from annotated featureXML or consensusXML files
  - GenericWrapper: wrap external programs (e.g. ProteinProphet) in TOPPAS
  - ConsensusID: [rewritten] combine several peptide search engine results to improve precision and recall
  - InclusionExclusionListCreator: creates inclusion or exclusion lists for MS/MS based on identifications, feature maps or protein databases
- REMOVED:
  - TextImporter (functionality moved to FileConverter)

UTIL tools:
- MODIFIED:
  - DecoyDatabase now uses "_rev" as decoy string by default (previously: "_ref"), as required by PeptideIndexer by default
  - MSSimulator provides a framework for the simulation of labeled data (#88)
- NEW:
  - ImageCreator: creates PNG's from MS maps
  - IDSplitter: splits peptide/protein annotations off of data files (inverse operation as IDMapper)
  - MassCalculator: calculates masses and mass-to-charge ratios of peptide sequences

OpenMS library improvements:
- read protXML files
- support protein groups in ProteinIdentification/idXML
- line numbers in errors of Textbased files (most formats: dta, dta2D, FASTAFile, PepNovoOutfile, MascotGenericFile, MS2File, MSPFile, OMSSACSVFile, TextImporter (csv, msInspect, SpecArray?, Kroenik))
- FeatureFinderAlgorithmPicked is now able to fit asymmetric retention time profiles (experimental)
- added generic labeling framework to SIMULATION (#88) (experimental)

TOPPView improvements:
- basic visualization of peptide identifications in idXML
- when the amount of loaded data causes memory depletion, an error is issued and TOPPView does not crash (only a problem on 32bit systems)
- zooming beyond the last zoom stack item using the mouse wheel or CTRL+

TOPPAS improvements:
- added copy/paste for workflow items
- workflows can now include other workflows (File>Include)
- several bug fixes
- split TOPPAS in TOPPAS and PipelineExecute TOPP-tool

Changes to the Build System:
- external code support for CMake 2.8:
  External code using "include (${OpenMS_USE_FILE})" in its CMakeLists.txt cannot be configured against OpenMS 1.7, however, only minor changes are required to fix this. See the documentation for "Programming with OpenMS".
- nightly tests for external code
- SVN revision used to build the lib is remembered (finer version tracking)
- nightly coverage builds
- GUI testing (experimental)
- Visual Studio 2010 support
- building on Mac OS X requires CMake 2.8.1 due to bugs in CMake < 2.8.1

Fixed Issues:
[new tracker: http://sourceforge.net/apps/trac/open-ms/query?status=closed&group=resolution&milestone=Release+1.7]
-	#23	  implement protXML
-	#44  	TOPPView warning "Cannot show projections!"
-	#46  	All TOPP/UTILS segfault if /share is not found
-	#53  	TOPPAS select directory has save as dialog
-	#54  	TOPPAS select directory has save as dialog
-	#56  	TOPPAS context menu "open in TOPPView" does not work under MacOSX
-	#58  	Unit tests for nested classes
-	#59  	Test of external Code
-	#61  	automatic ini file Version number update
-	#62  	nightly tests for external code
-	#63  	rename methods named min() or max() to something else...
-	#64  	TOPPView - update_layer reload is incomplete
-	#69  	FileMerger needs ability to merge featureXML
-	#73  	Resampler: can't create PNGs with TOPPAS
-	#74  	Default parameters of PTModel cause infinite loop
-	#76  	Add deployment target for compatibility with older MacOSX versions
-	#77  	FuzzyDiff always returns 'true' when comparing any two PNG images
-	#81  	Terminal modification with residue specificity
-	#85	  IDMapper will crash on negative RT's or big deltas
-	#87  	Gzipped files work as input, but arrow stays red
-	#88  	Implement Labeling Framework for MSSimulator
-	#90	  Quantification on protein level
-	#91	  Simple FF crashes on very sparse data
-	#92	  Encoding of XML files (invalid multcharacter)
-	#93	  TOPPAS layer bug
-	#98	  display RT value when viewing 1D data
-	#104	Split TOPPAS in TOPPAS and PipelineExecute TOPP-tool
-	#110	"Copy&paste, include workflows in current window"
-	#121	Tool categories and menu items in context menus have arbitrary order
-	#122	Projection view: mouse-over text on RT projection says "m/z"
-	#123	Reorganize TOPP tool categories
-	#124	TOPPAS fails to load files correctly
-	#127	catch out-of-memory exceptions in TOPPView
-	#131	TOPP input files check too restrictive...
-	#132	check all system calls
-	#133	Textexporter runs indefinitely when input has no IDs and -consensus_features as output
-	#134	[Windows] failure of TOPP tools in TOPPAS due to _out and _temp directory not writeable
-	#136	TOPPView: #of Isotopes in TheoreticalSpectrumGenerator not forwarded
-	#137	Implement asymmetric elution profile shapes for model fitting in FeatureFinderAlgorithmPicked
-	#141	CMake 2.8.1 causes linker errors on Mac OS 10.6.3
-	#143	Incompatibility between String and string methods
-	#147	Internal Compiler Error with gcc 4.3
-	#152	Remove/hide deprecated algorithms
-	#154	Update TOPPAS workflows params
-	#155	linking OpenMS.so using a relative contrib directory fails
-	#156	use MSBuild instead of devenv for contrib building on Windows
-	#158	FeatureFinder (centroided) might crash on certain input
-	#159	IDMapper will crash when given empty FeatureMap
-	#161	TOPPAS Output file naming can lead to wrong "merge all" behaviour
-	#163	rework IDFilter
-	#164	DecoyDatabase creates faulty protein names by default
-	#170	TheoreticalSpectrumGenerator computes wrong prefix/suffix masses
-	#171	Remove/hide entire deprecated tools
-	#175	Internal Compiler error in BaseModel/FeatureFinder
-	#182	INIFileEditor crashes upon execution
For more minor bugfixes visit the above URL.

Detailed list of changes to specific OpenMS classes:
- ConsensusMap, FeatureHandle, ConsensusFeature:
  - element index replaced by unique id
- DPosition:
  - min() renamed to minPositive()
  - min_negative() to minNegative()
- DIntervalBase
  - min() renamed to minPosition()
  - max() renamed to maxPosition()
- String
  - removed:
     String substr(SignedSize start, SignedSize n) const;
     String substr(SignedSize start) const;
  - added:
     String substr(size_t pos = 0, size_t n = npos) const;
     String chop(Size n) const;

------------------------------------------------------------------------------------------
----                                  OpenMS 1.6                                      ----
------------------------------------------------------------------------------------------
Release date: Nov 19th 2009

Main improvements of TOPPView:
- Storing peak data is now possible in mzData, mzXML and mzML format
- Feature and consensus feature peaks are now configurable (icon and size)
- Added new label mode for feature layers: all peptide hits of a feature are displayed
- Added visualization of unassigned peptide hits for feature layers
- Measuring to arbitrary end points is now supported in 1D and 2D view
- file load progress bar stays responsive under load on Windows
- rudimentary chromatogram support

Main improvements of TOPP-Framework:
- Major update of TOPPAS
- TOPP tools now warn when used with parameter files from a different version
- Combining '-write_ini' and '-ini' option now allows to transfer settings with identical
  path and names from an old ini file into a new one.

New TOPP tools:
- SeedListGenerator
  - generates seed lists for feature detection (still experimental)
- PrecursorMassCorrector
  - update precursor m/z information of MS/MS spectra based on MS1 peptide isotope fits
    (still experimental)

Main improvements of TOPP-Tools:
- all tools:
  - gzipped and bzipped XML files (e.g. mzML) can be directly read
- FeatureFinder
  - Centroided
    - supports parallel execution now
    - supports user-specified seeds now
    - Wavelet: removed (Isotope-Wavelet is still available)
- FileMerger: accumulated processingMethod entries, which all contained the same
  information
- IDMapper
  - has new default m/z tolerance and uses ppm as new default measure! Da is still
    supported.
  - referenze m/z of ID can now be either: 1) precursor mass, 2) [new] mass of identified
    peptide
  - assigns more peptides to features with convex hulls (the deltas are used)
- InternalCalibration
  - supports calibration functions calculated seperately for each spectrum or one global
    function
  - supports peptide ids as reference peaks
  - works on peak or feature data now
- MapAligner
  - new "identification" algorithm for alignment based on identified peptides
    (still experimental)
- PeakPicker
  - support for automatic estimation of peak width
- TextImporter can now import Koenik(Hardkloer) feature files
- TextExporter
  - added option for string quoting
  - improved export of consensusXML
- PepNovoAdapter: complete rewrite of the code, including classes

New UTILS:
- UniqueIdAssigner can be used to assign unique ids to FeatureXML and ConsensusXML files

Main improvements of UTILS:


Main improvements of OpenMS C++ library:
- MGF file creation speedup (also affects some TOPP tools)
- removed FeatureFinder-Wavelet (IsotopeWavelet is still available)
- support for bzip2 and gzip compressed XML files
- chromatogram support
- comments and other strings of XML writers are now escaped to prevent reading problems
- fixed IdXMLFile segmentation fault if no protein identification given

Detailed list of changes to specific OpenMS classes
- [New classes]:
  - UniqueIdGenerator, UniqueIdInterface, UniqueIdIndexer
  - SVOutStream
  - MapAlignmentAlgorithmIdentification
  - SeedListGenerator
- [Removed classes]:
  - FeatureFinderAlgorithmWavelet
- [Renamed classes]:
  - IDTagger -> DocumentIDTagger
- String:
  - improved behaviour of split(...) method
  - added support for quoting and unquoting of strings
- ConsensusMap: added clear(...) method
- IDMapper:
  - uses bounding boxes of mass traces instead of convex hulls now
  - the given deltas are used for features with convex hulls as well
- PoseClusteringShiftSuperimposer:
  - full rewrite, uses a similar algorithm like PoseClusteringAffineSuperimposer now
- TranformationDescription:
  - added cubic b-spline transformation
  - PairsType uses DoubleReal instead of Real now, thus can be used for m/z as well
- VersionInfo:
  - includes (if available) SVN revision number that the library is build upon via support
    by the build system
  - SVN revision information is displayed in the TOPP tools help text
- PepXMLFile: improved handling of PTMs

Changes to the Build System:
- unit tests are now in a separate sub-project in <OpenMS/source/TEST/> avoiding huge
  Solution files in MSVC IDE
- new targets: test_build, tutorials_build, tutorials_exec
- SVN revision (if available) is determined and compiled into OpenMS before the library is
  built
- added real install prefix and install target to be able to do a 'make install'

Changes to OpenMS XML formats:
- FeatureXML and ConsensusXML files use unique ids now instead of running indices. New XML
  Schema versions: 1.4

Changes to the contrib package:
- updated GSL to version 1.13
- updated SVM to version 2.89
- added Z lib and bz2 lib

Bug fixes:

[old tracker: http://sourceforge.net/tracker/?func=detail&aid=2857130&group_id=90558&atid=1059012]
- [2857042]: RTModel/PTModel unable to find modification
- [2857040]: Modification names with brackets fail to parse
- [2849215]: OMSSAAdapter fails with Acetlyation not found
- [2849201]: Parameters in INI files are duplicated
- [2849439]: Compilation error with Qt 4.3.x
- [2900457]: idXML files with more than ProteinIdentification might be incorrect

[new tracker: http://sourceforge.net/apps/trac/open-ms/query?status=closed&group=resolution&milestone=Release+1.6]
- #29: FilerMerger accumulates processingMethod entries
- #28: Segfault if idXML file does not contain a protein identification.
- #24: XML formats are written with unescaped special chars like "&"

------------------------------------------------------------------------------------------
----                                  OpenMS 1.5                                      ----
------------------------------------------------------------------------------------------

Main improvements of TOPPView:
- Added new labeling options for feature data
- Fixed crash when zooming in snap-mode
- Added context menu to spectra selection bar
- Feature editing mode can be enabled/disabled in the context menu (to avoid accidental editing)
- Several minor fixes and improvements

Main improvements of TOPP:
- Made mzML 1.1.0 the default format for all TOPP tools
- Added data processing information to all output files to improve traceability
- FileFilter:
  - added 'sort_peaks' option
  - added filtering according to scan type
  - added filtering according to activation type
- FileInfo:
  - added flag for data processing output
  - corrupt data checks: sorting is checked now, improved speed
- Added new tool IDFileConverter, which can convert between identification file formats
- Added TOPPAS, a tool for visual creation and execution of TOPP pipelines (beta)
- TextImporter can now import SpecArray and msInspect feature files
- Added CompNovo, a de novo identification tool for combined CID/ETD experiments
- MapAligner uses a new algorithm for pose clustering with less parameters

Main improvements of UTILS:
- Added PeptideIndexer, assign proteins to peptides including target/decoy specification
- Added MRMPairFinder, ERPairFinder to extract ratios of labeled experiments
- Added IDMassAccurracy, given mzML files and identification, it calculates distributions of mass deviations
- Added MapAlignmentEvaluation, a tool to evaluate alignment results
- Added MSSimulator, a highly configurable simulator for mass spectrometry experiments

Main improvements of OpenMS C++ library:
- mzML 1.1.0 support
- Improved the precision of mass values in several file formats

Detailed list of changes to specific OpenMS classes
- New classes:
  - CompNovo-classes
  - StablePairFinder, which is now used by MapAligner and FeatureLinker
  - Simulation-classes
- Removed classes:
  - FeatureFinderAlgorithmWatershed
  - PeakIcon
  - FactoryProduct (replaced by DefaultParamHandler)
  - DSpectrum (all the functionalty was moved to MSSpectrum)
- Renamed and moved classes:
  - moved PersistentObject from FORMAT/ to FORMAT/DB/
  - renamed PepXMLFile to PepXMLFileMascot
- Changes to Classes:
  - MSExperiment: added 'isSorted' method
  - MSSpectrum:
    - added 'isSorted' method
    - renamed MetaDataArray to FloatDataArray
    - added IntegerDataArrays
    - added StringDataArrays
  - DataValue: added constructor for 'std::string' and QString
  - MetaInfo: 'setValue' method takes only DataValue now
  - MetaInfoInterface: 'setMetaValue' method takes only DataValue now
  - Param: 'setValue' method takes only DataValue now
  - ExperimentalSettings: moved DataProcessing to SpectrumSettings (for mzML)
  - Precursor: supports multiple dissociation methods now (for mzML)
  - MetaInfoDescription: removed comment and source file; added data processing (for MzML)
  - ElementDB: isotopes are now possible
  - EmpiricalFormula: isotopes are now possible (e.g. (2)H for deuterium)
  - ModificationsDB: switched completely to UniMod (www.unimod.org). PSI-MOD still provided for convenience
  - PepXMLFile: added new 'load' method (moved the old 'load' method to PepXMLFileMascot)
  - TextFile:
    - is now derived from StringList
    - the 'asString' method was replaced by 'concatenate' from StringList
  - MzMLFile:
    - added support for integer and string binary arrays
    - added support for compressed binary data arrays
    - loading a file with unknown CV terms in certain tags no longer causes an error
  - DBConnection:
    - The 'executeQuery' method no longer sets the internal pointer to the first record of the result.
      It is now positioned before the first record. A boolean flag can be used to switch to the old behaviour.
  - SourceFile: changed native ID type to string
  - PoseClusteringAffineSuperimposer: full rewrite, not using CGAL

Changes to the contrib package:
- Added CoinMP 1.3.3
- Added IMSlib 0.1.0
- Update Xerces-C to revision 806068 of SVN trunk

Bug fixes:
- [2778461]: mzData files containing 'supDataArray' elements no longer crash OpenMS
- [2777173]: TOPPView 2D view projections no longer forget the draw mode on repaint
- [2776386]: TOPPView snap-to-max intensity mode no longer crashes with empty spectra
- [2775912]: PeakPickerCWT no longer assigns RT=-1 to MS/MS spectra

------------------------------------------------------------------------------------------
----                                  OpenMS 1.4                                      ----
------------------------------------------------------------------------------------------

Main improvements of TOPPView:
- Drag-and-drop is now supported from the layer bar, spectrum bar and for files from the operating system
- Improved visualization of very high-resolution data
- Improved painting speed of 2D view

Main improvements of TOPP:
- Added new tool TextImporter, which can convert text files to featureXML
- TextExporter can now export peptide/protein information stored in consensusXML
- PeakPicker: reduced the number of parameters, added parallization support
- FeatureFinder: added new MRM algorithm and removed the tool 'FeatureFinderMRM'
- FileInfo: added support for idXML

Main improvements of OpenMS C++ library:
- mzML 1.1.0 RC5 support
- removed support for external memory (use the 64bit builds if you want to process large datasets)
- added support for three kinds of parallization architectures
  - OpenMP
  - Intel Threading Building Blocks
  - Nvidia Cuda

Detailed list of changes to specific OpenMS classes:
- SpectrumSettings: several precursor peaks are now supported, added product list
- Precursor: complete rewrite for better support of mzData, mzXML and mzML
- PeakPickerCWT: cleaned up interface, improved meta data handling, improved parameters, added parallelization support
- GaussFilter: cleaned up interface, improved meta data handling
- SavitzkyGolayFilter: cleaned up interface, improved meta data handling
- MorphologicalFilter: cleaned up interface
- LinearResampler: cleaned up interface
- LabeledPairFinder: estimated negative sigma values are now treated as positive values
- FeatureFinder: added new algorithm 'MRM' for MRM feature detection; replaces FeatureFinderMRM
- ExperimentalSettings: remove native ID type (for mzML support)
- SourceFile: added native ID type (for mzML support)
- File: replaced vector<String> by StringList in all methods

Bug fixes:
- [2645436]: TOPPView - Data Filter for "Size" not available
- [2645510]: OpenMS - libOpenMS.so is built but linking fails (TOPP, tests) (on Debian "Lenny")
- [2665055]: FileFilter ignores -sort option for FeatureXML and Consensus
- [2659013]: windows contrib can fail when copying compiled libraries
- [2606068]: TOPP tools with list parameters do not work with INI files
- [2690367]: Protein references missing on peptide identifications

------------------------------------------------------------------------------------------
----                                   OpenMS 1.3                                     ----
------------------------------------------------------------------------------------------

New features and improvements of OpenMS:
- The build system is now based on CMake - supporting Linux, MacOS and Windows.
- Finalized mzML implementation (version 1.1.0 RC4)
  - previously unsupported parts
  - indexed mzML
  - semantic validation (see FileInfo)
- Kernel: Replaced comparators NthPositionLess by the comparator(s) RTLess and/or MZLess.
- Kernel: Replaced methods sortByNthPosition() by the method(s) sortByRT() and/or sortByMZ().
- Improved the framework for meta data visualization.
- Several extensions to the meta data classes were made for mzML compliance.
- The macros used for unit testing in source/TEST have been revised.
- More consistent handling of single vs. double numeric precision, esp. in file output.
- Added ANALYSIS/PIP/PeakIntensityPredictor class for peak intensity prediction (contributed by Alexandra Scherbart).
- Added support for Intel Compiler versions 10 and 11
- Added support for Qt up to 4.5 rc1

New features and improvements of TOPP:
- Added SILACAnalyzer: A specialized tool for quantitation of SILAC experiments (contributed by Lars Nilse).
- Added ITRAQAnalyzer: A specialized tool for quantitation of ITRAQ experiments.
- Added IDMapper: Assigns protein/peptide identifications to features or consensus features.
- FeatureLinker: Added automated RT parameter estimation for 'labeled' algorithm.
- MapAligner: Added spectrum_alignment and apply_given_trafo, IdXML is supported.
- Resampler: This tool is now used for resampling raw data instead of resampling in NoiseFilter or BaselineFilter.
- FileInfo: The option '-v' now also does a semantic validation of mzML files.
- FileMerger: Improved interface
- ConsensusID: Now also supports consensus identification of features and consensus features.
- INIFileEditor: Support for string/int/double lists and input/output files was added.
- Added PrecursorIonSelector: A tool for result-driven precursor ion selection.
- FalseDiscoveryRate: corrected FDR calculations and added optional support for q-values
- Added MascotAdapterOnline: which allows queries to Mascot via network (together with Daniel Jameson)

New features and improvements of TOPPView:
- Added functionality for editing feature data
- Added support for consensus features (consensusXML)
- Added measuring and generic annotations to 1D view
- Several minor interface improvements and bugfixes

Changes to OpenMS XML formats:
- ParamXML:
  - Restrictions in Param .ini files are represented by 'min:max' instead
    of 'min-max' now, to avoid issues with small (1e-06) and negative numbers.
  - Replaced 'advanced' attribute by the more general 'tags' attribute.
  - Added support for float, int and string lists
- featureXML:
  - Added tag <subordinate> to store competing features that did not qualify for the final map
  - Removed <description> section
  - Added document identifier
  - Added protein and peptide information
- consensusXML:
  - Added document identifier
  - Added protein and peptide information
- idXML:
  - Added document identifier

Changes to the contrib package:
- The build system is now based on CMake - supporting Linux, MacOS and Windows.
- Updated SeqAn package to revision 2666 (this fixes the STL debug error)
- Updated xerces-c to version 3.0.0
- Updated boost to version 1.37.0
- Downgraded GSL to 1.8 (because of Mac/Windows support)

Detailed list of changes to specific OpenMS classes:
- Renamed and moved classes
  - Renamed MSMetaDataExplorer to MetaDataBrowser
  - Renamed ProcessingMethod to DataProcessing
  - Moved XMLValidator from FORMAT/ to FORMAT/VALIDATORS/
- Removed classes
  - DPeakArray (moved the functionality to the classes that inherited from it)
  - IDSpectrumMapper (replaced by IDMapper)
  - IDFeatureMapper (replaced by IDMapper)
  - FeatureXMLHandler (merged into FeatureXMLFile)
  - ConsensusXMLHandler (merged into ConsensusXMLFile)
  - PeakPicker (merged into PeakPickerCWT)
  - MorphFilter (merged into MorphologicalFilter)
  - TopHatFilter (merged into MorphologicalFilter)
- New classes
  - DATASTRUCTURES/IntList
  - DATASTRUCTURES/StringList
  - ANALYSIS/ID/IDMapper
  - ANALYSIS/MAPMATCHING/MapAlignmentAlgorithmApplyGivenTrafo
  - ANALYSIS/MAPMATCHING/MapAlignmentAlgorithmSpectrumAlignment
- Changes to classes
  - InstrumentSettings
    - Revisited scan modes
    - Added bool member for zoom scans (no longer a scan mode)
  - MassAnalyzer: Removed tandem scanning method. This is stored in the ScanMode of InstrumentSettings.
  - DataProcessing: Now contains Software and can handle multiple processing actions.
  - Software: Only contains name and version now.
  - SourceFile: Added MetaInfointerface and checksum type
  - ContactPerson: Added URL and address
  - Instrument:
    - Can contain multiple detectors and multiple ion sources now
    - Added Software
    - Added ion optics type
  - AcquisitionInfo: Added MetaInfoInterface
  - Acquisition: integer 'number' member was changed to a string 'identifier' (for mzML)
  - ExperimentalSettings
    - Now contains multiple SourceFiles and DataProcessings
    - ExperimentType was removed
  - SpectrumSettings
    - Added nativeID (from acquisition software)
  - DSpectrum
    - The peaks are no longer stored in a container member, but DSpectrum is derived
      from std::vector<PeakType>.
    - The container type is no longer a template argument. Peak type and allocator type
      are the new template arguments.
  - LabeledPairFinder: Added automated RT parameter estimation.
  - GaussFitter: Removed several unneeded methods.
  - GammaDistributionFitter: Removed several unneeded methods.
  - DataValue: Added support for IntList and DoubleList types
  - Param:
    - Added a new remove(key) method, that removed only exact matches.
      The old remove() method was renamed to removeAll(prefix)
    - Replaced 'advanced' flag by a generic tagging mechanism
    - Added support for IntList and DoubleList types
  - File: find(...) now throws an exception, of the file is not found.
  - DPeak and DRichPeak are metafunctions now, e.g. DPeak<1>::Type is a typedef for Peak1D.
  - VersionInfo: Added support for SVN revision info. Slight interface changes.
  - TOPPBase: Print revison info (if meaningful).
  - MetaInfo: Uses double precision now.
  - Date
    - get() now returns a string instead of modifying a string reference.
    - Made today() is static now and returns the current DateTime instead of modifying the object.
  - DateTime
    - get(), getDate() and getTime() now return a string instead of modifying a string reference.
    - Made now() is static now and returns the current Date instead of modifying the object.
  - MSExperiment: The date is now a DateTime object.
  - ProgressLogger: Nested application uses indentation.
  - XMLValidator: The output stream for error messages can now be set in the isValid(...) method
  - XMLFile: The output stream for validation error messages can now be set in the isValid(...) method
  - MzMLFile: The output stream for validation error messages can now be set in the isValid(...) method
  - IdXMLFile: Adden document identifier to the load(...) and store(...) method

------------------------------------------------------------------------------------------
----                                   OpenMS 1.2                                     ----
------------------------------------------------------------------------------------------

New features and improvements of OpenMS:
- GCC 4.3 is now supported (GCC 3.4 and 4.0 are no longer supported)
- Added support for GCC STL debug mode (configure option --enable-stl-debug)
- Complete reimplementation of map alignment and feature grouping classes.
  This affected some classes in KERNEL and nearly all classes in ANALYSIS/MAPMATCHING.
  The affected classes are not listed in detail here.
- Added meta data arrays to spectra as the new standard way of handing peak meta information
- Improved interface of SpectrumCanvas and derived classes for easier reuse outside of TOPPView
- Added support for arbitrary modifications to peptide/protein modifications (based on PSI-MOD)
- Exceptions thrown by member functions are no longer declared in the header files.
  They are however documented in the class documentation.
- Added *beta* support for the HUPO PSI format mzML
  Currently only reading is supported and some features are not implemented yet
  e.g. chromatograms, zlib compression of base64 data, base64 integer data, base64 16 bit data
- Added the UTILS package, a bundle of small helper tools.
- Changed handling of amino acid sequences and modifications. Modifications are taken from
  PSI-MOD and are fully supported via the class AASequence.
- Added new framework for generic clustering

New features and improvements of TOPP:
- Replaced 'MapAlignment', 'UnlabeledMatcher' and 'LabeledMatcher' tools by 'MapAligner' and 'FeatureLinker' tools
- Added map alignment algorithm based on spectrum similarity to 'MapAlignment'
- Added 'PTModel' and 'PTPredict' tool for prediction of proteotypic peptides
- Added XTandemAdapter with a minimal interface (shared with OMSSAAdapter) all advanced option can be set using a
  standard X!Tandem configuration file
- Changed OMSSAAdapter to same minimal interface as XTandemAdapter, advanced option are additionally available
- Added IDDecoyProbability which implements the transformation of a forward and reversed search into probability
  scores (target-decoy approach)
- Added FalseDiscoveryRate, which implements FDR calculation from forward and reversed searches at peptide
  and protein levels

New features and improvements of TOPPView:
- Major update to the user interface and functionality
- Speed improvements of the 2D view
- Many bug fixes
- Updated tutorial

Changes to OpenMS XML formats:
- Added TransformationXML which stores information about map alignment
- Removed map alignment information from ConsensusXML
- FeaturePairsXML is now deprecated (ConsensusXML is used instead)

Changes to the contrib package:
- Updated to NetCDF 3.6.3
- Updated to SeqAn 1.1 (r2416)
- Updated to CGAL 3.3.1
- Updated to GSL 1.11
- Updated to xerces-c 2.80
- Updated to boost 1.35.0
- Updated to libsvm 2.86

Detailed list of changes to specific OpenMS classes:
- Renamed and moved classes
  - Renamed 'Exception::Base' to 'Exception::BaseException'
  - Renamed all 'Peak' classes to 'RichPeak'
  - Renamed all 'RawDataPoint' classes to 'Peak'
  - Renamed 'KERNEL/DPeakConstRefArray' to 'DATASTRUCTURES/ConstRefVector'

- Removed classes
  - KERNEL/PickedPeak1D
  - DATASTRUCTURES/HashMap (replace by Map)
  - ANALYSIS/MAPMATCHING/BaseAlignment (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/BaseMapMatcher (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/BasePairFinder (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/BasePairFinder_impl (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/BasePairwiseMapMatcher_impl (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/BaseSuperImposer_impl (restructuring of map alignment
  - ANALYSIS/MAPMATCHING/ElementPair (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/Grid (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/GridCell (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/Group (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/IndexTuple (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/LinearMapping (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/MapDewarper (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/MapMatcherRegression (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/PairMatcher (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/PoseClusteringPairwiseMapMatcher (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/StarAlignment (restructuring of map alignment)
  - ANALYSIS/CLUSTERING/BinnedRep (reimplemented in BinnedSpectrum)
  - COMPARISON/SPECTRA/BinnedRepCompareFunctor (reimplemented in BinnedSpectrumCompareFunctor)
  - COMPARISON/SPECTRA/BinnedRepMutualInformation (reimplemented in BinnedMutualInformation)
  - COMPARISON/SPECTRA/BinnedRepSharedPeakCount (reimplemented in BinnedSharedPeakCount)
  - COMPARISON/SPECTRA/BinnedRepSpectrumContrastAngle (reimplemented in BinnedSpectralContrastAngle)
  - COMPARISON/SPECTRA/BinnedRepSumAgreeingIntensities (reimplemented in BinnedSumAgreeingIntensities)
  - CONCEPT/Benchmark
  - CONCEPT/HashFunction
  - FILTERING/SMOOTHING/SmoothFilter
  - FORMAT/FeaturePairsXMLFile (restructuring of map alignment)
  - FORMAT/GridFile (restructuring of map alignment)
  - FORMAT/HANDLER/FeaturePairsHandler (restructuring of map alignment)
  - FORMAT/HANDLER/GridHandler (restructuring of map alignment)
  - FORMAT/HANDLER/OMSAAXMLHandler (replaced by OMSSAXMLFile)
  - KERNEL/ConsensusPeak (restructuring of map alignment)
  - KERNEL/FeatureHandle
  - KERNEL/MSExperimentExtern
  - KERNEL/PeakIndex
  - TRANSFORMATIONS/CENTROIDING/PeakShapeType

- New classes
  - CHEMISTRY/ModificationsDB which handles the PSI-MOD modifications
  - CHEMISTRY/ModificationDefinition class, which specifies modification search options
  - CHEMISTRY/ModificationDefinitionSet class, which specifies modification search options
  - CHEMISTRY/ResidueModification which represents a PSI-MOD modification
  - ANALYSIS/ID/FalseDiscoveryRate class, which calculates FDRs on peptide and protein level
  - ANALYSIS/ID/IDDecoyProbability class, which implements a target decoy probability estimation
  - DATASTRUCTURES/Map class and replaced HashMap usage with Map
  - ANALYSIS/MAPMATCHING/BaseGroupFinder (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/FeatureGroupingAlgorithm (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/FeatureGroupingAlgorithmLabeled (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/FeatureGroupingAlgorithmUnlabeled (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/LabeledPairFinder (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/MapAlignmentAlgorithm (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/MapAlignmentAlgorithmPoseClustering (restructuring of map alignment)
  - ANALYSIS/MAPMATCHING/MapAlignmentAlgorithmSpectrumAlignment (new map alignment type using spectral alignments)
  - ANALYSIS/MAPMATCHING/TransformationDescription (new map alignment type using spectral alignments)
  - ANALYSIS/CLUSTERING/AverageLinkage (new framework for clustering)
  - ANALYSIS/CLUSTERING/ClusterFunctor (new framework for clustering)
  - ANALYSIS/CLUSTERING/ClusterHierachical (new framework for clustering)
  - ANALYSIS/CLUSTERING/CompleteLinkage (new framework for clustering)
  - ANALYSIS/CLUSTERING/SingleLinkage (new framework for clustering)
  - COMPARISON/SPECTRA/BinnedSpectrum (Binned represenetation of a spectrum)
  - COMPARISON/SPECTRA/BinnedMutualInformation
  - COMPARISON/SPECTRA/BinnedSumAgreeingIntensities
  - COMPARISON/SPECTRA/BinnedSpectralContrastAngle
  - COMPARISON/SPECTRA/BinnedSharedPeakCount
  - COMPARISON/SPECTRA/BinnedSpectrumCompareFunctor
  - COMPARISON/SPECTRA/CompareFourierTransform
  - COMPARISON/SPECTRA/PeakAlignment
  - COMPARISON/SPECTRA/SteinScottImproveScore
  - DATASTRUCTURE/DistanceMatrix
  - FORMAT/ControlledVocabulary
  - FORMAT/HANDLER/MzMLHandler
  - FORMAT/HANDLER/UnimodXMLHandler
  - FORMAT/HANDLER/XTandemInFileXMLHandler
  - FORMAT/MSPFile
  - FORMAT/MzMLFile
  - FORMAT/OMSSACSVFile
  - FORMAT/PepXMLFile (only for Mascot output, not complete implementation of pepXML)
  - FORMAT/TransformationXMLFile
  - FORMAT/XTandemInfile
  - FORMAT/XTandemXMLFile
  - MATH/STATISTICS/GammaDistributionFitter
  - MATH/STATISTICS/GaussFitter
  - TRANSFORMATIONS/FEATUREFINDER/FeatureFinderAlgorithmIsotopeWavelet
  - TRANSFORMATIONS/FEATUREFINDER/FeatureFinderAlgorithmWavelet

- Changes to classes
  - Changed AASequence to support PSI-MOD modifications
  - Changed Residue to support PSI-MOD modifications



------------------------------------------------------------------------------------------
----                                  OpenMS 1.1.1                                    ----
------------------------------------------------------------------------------------------

Bug fixes:
- [1953335]: TOPP - TOPPView: Filter bar is not updated when deleting a layer
- [1953339]: TOPP - TOPPView: Crash when pressing cancel button of the DB password dialog
- [1948699]: TOPP - TOPPView: Opening a file from command-line containing spaces fails
- [1948080]: TOPP - MascotAdapter: Variable modification were added to fixed modifications
- [1941268]: TOPP - TOPPView: Crash when displaying files with intensity 0 peaks only
- [1941270]: TOPP - TOPPView: Recent file paths in TOPPView are wrong under certain conditions (Windows only)
- [1941273]: TOPP - TOPPView: Crash when loading an INI file without type in TOPP dialog
- [1934199]: OpenMS - SpectrumWidget: Crash when painted without layers
- [1933097]: OpenMS - TOPPBase: Invalid default values of string parameters were not handled correctly


------------------------------------------------------------------------------------------
----                                   OpenMS 1.1                                     ----
------------------------------------------------------------------------------------------

New features and improvements of OpenMS:
- Added support for Windows XP
- Improved configure
  - prefix option now works as expected
  - Fixed several bugs in handling of Qt
  - Fixed several minor bugs
- Added support for large datasets through a custom allocator
- Added support for XML schemas, which allows validation of files
- Added optional schema version tag to all OpenMS XML formats
- Removed classes: DataReducer, MaxReducer, SumReducer, SavitzkyGolaySVDFilter,
                   MSExperimentExtern, BaseMapping
- Added classes: StringList, SuffixArray, DataFilters
- Renamed/moved classes:
  - ExternalCalibraton -> TOFCalibration,
  - SavitzkyGolayQRFilter -> SavitzkyGolayFilter
  - FORMAT/Param.h -> DATASTRUCTURES/Param.h
- Refactoring of FeatureFinder framework
- Refactoring of MapAlignment framework
- Refactoring of XML parsing classes
- Refactoring of the visualization widgets
- Reorganization of the OpenMS documentation
- Lots of minor bug fixes and improvements to documentation

New features and improvements of TOPP:
- Added support for advanced parameters and parameter value restrictions
- Added file type/name checks before use of input/output files
- Improved parameter handling of the tools that offer different methods:
  FeatureFinder, NoiseFilter and SpectraFilter
- Lots of minor bug fixes and improvements to documentation
- FileFilter: Added option to sort data points according to RT and m/z
- FileInfo: Added validation of files against the XML schema, added check for corrupt data
- Added TextExporter: exports featureXML, featurePairsXML, consensusXML and idXML to text
                      files for import to other tools
- Added FeatureFinderMRM: performs peptide quantitation using Multiple-Reaction-Monitoring (MRM)

New features and improvements of TOPPView:
- Refactoring of the interface: Moved a lot of functions to context menus
- Added data filters (intensity, quality, ...)
- Lots of minor bug fixes
- Added tutorial

Detailed list of changes to specific OpenMS classes:
- BoundingBox2D
  - Added constructor from PointArrayType
- DataValue
  - Simplified to Int, DoubleReal and String types only
  - Direct cast to all data types is not possible anymore
- DefaultParamHandler
  - Added support for restrictions
  - Added support for advanced parameters
- String
  - Improved implementations of implode and substr
  - Renamed implode(...) method to concatenate(...)
- DSpectrum
  - Added method to find the nearest peak to an m/z value (findNearest)
- Feature
  - Added support for convex hulls of individual mass traces
- Param
  - Added support for value restrictions
  - Added support for advanced parameters
  - Replaced STL iterator by Param-specific iterator, which is aware of the tree strucure
  - The getValue method now throws an exception in case of a non-existing name.
    Use exists(...) to check if a parameter exists
- FileHandler
  - Added support for IdXML, ConsensusXML and mgf format
- Factory
  - Added methods to find out which products are registered
- MetaInfo/MetaInfoInterface/MetaInfoRegistry
  - Names are automatically registered now
- FileHandler
  - Renamed some of the Type enum values to make them consistent

------------------------------------------------------------------------------------------
----                                   OpenMS 1.0                                     ----
------------------------------------------------------------------------------------------
- Kernel redesign (improvement of usability)
- Removed Boost dependencies
- Qt4 port
- Experimental support for MacOS 10
- Experimental support for Windows (XP & VISTA via MinGW)
- New OpenMS and TOPP tutorial
- Redesign of protein and peptide identification datastructures
- New format for protein and peptide identification: IdXML
- Release of annotated schemas for all OpenMS XML formats
- New features and improvements of TOPPView
  - Visualization of peaks, feature and feature pairs has been speeded up
  - Meta data browsing and editing
  - TOPP tools can be invoked via TOPPView
  - Visualization of protein/peptide identification annotated to LC-MS/MS data
- New features and improvements of TOPP
  - Added INIFileEditor - A GUI editor for TOPP configuration files
  - Added ConsensusID - A tool to unify protein and petide identification from several
                        search engines
  - Added Decharger - Decharging feature maps
  - Added MapAlignment - Multiple alignment of LC-MS maps
  - Added MapNormalizer - Normalization of peak intensities
  - Added InternalCalibration - Calibration of peak m/z using reference masses
  - Added ExternalCalibration - Conversion of flight times into m/z using external
                                calibrant spectra