uno-ms 0.1.0

MS1-only peptide and protein identification from LC-MS features, with target-decoy FDR
# Bundled koth config for uno's in-process feature finder (`--raw`) on Bruker
# timsTOF `.d` input. Selected automatically by file extension; override with a
# `[koth]` table in the uno config.
#
# `koth_default.toml` (the mzML/Thermo default) is tuned for biosaur2 parity on
# Orbitrap and is actively WRONG on timsTOF:
#   features.min_charge  1 -> 2     Bruker runs are dominated by singly-charged
#                                   background (one rapidms1 run: 103k of 142k
#                                   features were 1+, with zero peptide signal).
#   file.mz_recalibration false -> true  ID-free isotope-consistency recalibration.
#                                   The adaptive isotope-match tolerance it enables
#                                   is what matters on TOF, where absolute mass
#                                   accuracy is ~3 ppm vs ~0.55 ppm on Orbitrap.
#   hills.min_scans 2 -> 3, max_gap 0 -> 1, smoothing on
#                                   The loosened Orbitrap values exist to recover
#                                   short low-abundance hills; on PASEF they admit
#                                   noise the search cannot afford.
#
# Provenance: this is koth's own `example_config.toml` (its current-schema Bruker
# profile), which is the config validated on the timsTOF Ultra 2 HYE benchmark
# (LFQ_Ultra2_PASEF_15min_50ng) — 199-368 proteins at 1% honest entrapment FDP
# across 12 runs, 96.6% confirmed by a sage DDA search of the same run. koth's
# config structs use `deny_unknown_fields`, so this must track koth's schema;
# regenerate from a `koth_ff` run's `config.toml` if koth adds or removes fields.

[output]
format = "tsv"

[file]
mz_tolerance = 8.0
mz_tolerance_type = "ppm"

im_tolerance = 0.05
im_tolerance_type = "relative"

intensity_coverage = 1.0

bruker_filter_mz_half_width = 2
bruker_filter_max_internal_gap = 1
bruker_filter_min_feature_length = 5
bruker_filter_min_window_intensity = 0
bruker_filter_min_feature_intensity = 0
bruker_filter_num_iterations = 1

bruker_watershed_box_scan = 10
bruker_watershed_box_mz_idx = 3
bruker_watershed_min_seed_intensity = 0
bruker_watershed_min_centroid_total = 0
bruker_watershed_max_tof_offset = 10

bruker_streaming = false

bruker_halo = true
bruker_halo_peak_fraction = 0.15
bruker_halo_mz_idx_half_width = 80
bruker_halo_scan_half_width = 2

bruker_ms1_polygon = false
bruker_ms1_polygon_mz_pad = 0.0
bruker_ms1_polygon_im_pad = 0.0

ms2_hills_enabled = false

mz_recalibration = true
mz_recalibration_mz_bins = 20
mz_recalibration_rt_bins = 8
mz_recalibration_min_samples = 50

mz_recalibration_tol_sigma_mult = 4.0
mz_recalibration_tol_floor_ppm = 1.0

[hills]
min_scans = 3
max_gap = 1

split_hills = true
split_valley_ratio = 0.60
split_sigma_mult   = 5.0
split_height_frac  = 0.10

lfc_weight = 0.3

gap_fill_enabled = false

smoothing_enabled = false
smoothing_window = 1

[features]
min_charge = 2
max_charge = 6

min_chain_cosine = 0.4

min_isotope_step_ratio = 0.01

max_isotopes = 6

max_isotope_log2_ratio = 1.5
isotope_evidence_ratio_sigma = 0.75
isotope_evidence_cosine_shape = 2.0

neutron_mass = 1.003354835

min_isotope_score = 0.5
min_cosine_score  = 0.0
min_combined_score = 0.0

[scoring]
isotope_offset_enabled = true

offset_zero_bonus = 0.15

min_isotope_score_for_offset = 0.5