Header menu logo BioFSharp.Mz

BinderScriptNotebook

Peptide search databases

Bottom-up proteomics identifies proteins through their peptides. The mass of an intact protein is not specific enough to identify it, so the sample is digested with a protease, almost always trypsin, and the mass spectrometer measures the resulting peptides. Trypsin cuts C-terminal to lysine and arginine, except when a proline follows, which yields peptides of around 14 residues on average that ionize well. When the instrument selects a peptide ion for fragmentation, it records the precursor m/z, and charge state determination turns that into a neutral mass. Identification then becomes a lookup problem: which peptides from the organism's proteome could have this mass?

A run holds tens of thousands of spectra, and each one needs its candidate peptides with every modification variant and a precomputed mass. The SearchDB module does this preparation once. It digests the FASTA proteome, generates the modified variants of each peptide, precomputes their masses and stores everything in a SQLite database file with an index on the mass column. A search engine then asks for all candidates within a narrow mass window around a measured precursor and gets them back from an indexed query.

This page builds such a database for the chloroplast proteome of Chlamydomonas reinhardtii and queries it by mass. The same organism accompanies the rest of these pages.

Describing the search space

Everything the database will contain is decided up front by a SearchDbParams record. The parameters are the identity of the database: two runs with the same parameters mean the same database, and any change means a different one.

A fixed modification is applied to every occurrence of its target residue, the standard example being carbamidomethylation of cysteine from the sample preparation. A variable modification may or may not be present, so the database stores each peptide with and without it. The most common variable modification is oxidation of methionine, which adds one oxygen atom. createSearchModification describes it: a name, a Unimod accession, a description, a flag whether the modification is biological in origin, the composition as an elemental formula, the target sites, whether the composition is added or subtracted, and a short code that will mark the modification inside stored sequence strings.

open System.IO
open BioFSharp
open BioFSharp.Mz

let oxidationM =
    SearchDB.createSearchModification
        "Oxidation'Met'" "35" "Oxidation of methionine" true "O"
        [ SearchDB.Specific(AminoAcids.Met, ModificationInfo.ModLocation.Residual) ]
        SearchDB.SearchModType.Plus "ox"

let oxidationDelta =
    SearchDB.massFBy SearchDB.MassMode.Monoisotopic (SearchDB.getModBy oxidationM)

printfn "mass shift of %s: %.6f Da" oxidationM.Name oxidationDelta
mass shift of Oxidation'Met': 15.994915 Da

The composition "O" translates to the monoisotopic mass of one oxygen atom, the expected +15.995 Da shift. With the modification in hand we can assemble the full parameter record. createSearchDbParams takes every field as a positional argument.

let fastaPath = __SOURCE_DIRECTORY__ + "/data/Chlamy_Cp.fastA"

let fastaHeaderToName (header: string) = header.Split('|').[1].Trim()

let searchDbParams =
    SearchDB.createSearchDbParams
        "Chlamy_Cp_trypsin"                             // database name
        dbFolder                                        // folder for the db file
        fastaPath                                       // proteome FASTA
        fastaHeaderToName                               // header -> accession
        (Digestion.Table.getProteaseBy "Trypsin")       // protease
        0 2                                             // min/max missed cleavages
        15000.                                          // MaxMass
        4 40                                            // MinPepLength/MaxPepLength
        []                                              // isotopic mods
        SearchDB.MassMode.Monoisotopic                  // mass mode
        (SearchDB.massFBy SearchDB.MassMode.Monoisotopic) // matching mass function
        []                                              // fixed mods
        [ oxidationM ]                                  // variable mods
        2                                               // variable mod threshold

printfn "database file name: %s" (Path.GetFileName(SearchDB.Db.getNameOf searchDbParams))
printfn "protease: %s" searchDbParams.Protease.Name
database file name: Chlamy_Cp_trypsin.db
protease: Trypsin

The name and folder determine where the SQLite file lands, here a folder under the system temp directory, and SearchDB.Db.getNameOf shows the resulting file name. fastaHeaderToName extracts a protein accession from each FASTA header line: our headers look like sp|P19528| cytochrome b6/f complex subunit 4, so splitting at | and taking the second field yields the accession. The protease comes from BioFSharp's Digestion.Table, either by name as shown or directly as Digestion.Table.Trypsin.

A missed cleavage is a lysine or arginine the protease failed to cut, and real digests always contain such peptides, so search databases typically include peptides with up to two or three missed cleavages, here up to two.

One implementation detail matters when choosing MinPepLength and MaxPepLength: the digest filter compares CleavageEnd - CleavageStart, which is the peptide length minus one, strictly against both bounds. The shortest stored peptide therefore has MinPepLength + 2 residues and the longest has MaxPepLength residues. With the values 4 and 40 above, the database contains peptides of 6 to 40 residues. MaxMass is recorded with the database and participates in its identity.

Metabolic labeling such as full 15N would go into the isotopic modification list, empty here, and the database would then store every peptide in a light and a heavy form. MassMode.Monoisotopic together with massFBy selects the memoized monoisotopic mass function used for all mass computations. Fixed modifications stay empty. Oxidation of methionine goes in as a variable modification, and the threshold of 2 caps how many variable modifications a single peptide may carry.

Building and connecting to the database

connectOrCreateDB checks whether a database file matching the parameters already exists. If it does, it simply reconnects. If not, it reads the FASTA, digests every protein, generates the modified variants, computes their masses and bulk inserts everything. The returned value is an open SQLiteConnection. A few SQL counts show what the build produced.

open System.Data.SQLite

let cn = SearchDB.connectOrCreateDB searchDbParams

let countRows table =
    use cmd = new SQLiteCommand(sprintf "SELECT COUNT(*) FROM %s" table, cn)
    cmd.ExecuteScalar() :?> int64

printfn "database file exists: %b" (File.Exists(SearchDB.Db.getNameOf searchDbParams))
printfn "proteins:                  %i" (countRows "Protein")
printfn "distinct peptide sequences: %i" (countRows "PepSequence")
printfn "mass entries (ModSequence): %i" (countRows "ModSequence")
database file exists: true
proteins:                  74
distinct peptide sequences: 6415
mass entries (ModSequence): 9355

The 74 chloroplast proteins digest into several thousand distinct peptides, and the variable methionine oxidation expands them into more rows in the ModSequence table, which holds one row per modified variant with its precomputed mass. Calling connectOrCreateDB a second time with the same parameters finds the parameter record stored inside the file and reconnects without rebuilding anything. Changing any parameter, even only MaxMass, changes the identity and triggers a fresh build.

Looking up candidates by precursor mass

getThreadSafePeptideLookUpFromFileBy prepares the mass window query against the open connection. The result is a function taking a lower and an upper neutral mass and returning every ModSequence row in between.

To query something realistic we first need a mass a spectrometer could have measured. We digest the first protein of the FASTA in memory with the same trypsin instance and pick the first tryptic peptide that fits the stored length range and contains a methionine. Its neutral mass is the residue masses summed up plus one water for the termini.

open BioFSharp.IO

let firstProtein =
    Fasta.read BioArray.ofAminoAcidString fastaPath
    |> Seq.head

let targetPeptide =
    Digestion.BioArray.digest Digestion.Table.Trypsin 0 (firstProtein.Sequence |> Array.ofSeq)
    |> Array.find (fun p ->
        p.PepSequence.Length >= 6 && p.PepSequence.Length <= 40
        && List.contains AminoAcids.Met p.PepSequence)

let targetMass =
    targetPeptide.PepSequence
    |> List.sumBy BioItem.monoisoMass
    |> (+) (BioItem.monoisoMass ModificationInfo.Table.H2O)

printfn "protein:  %s" (fastaHeaderToName firstProtein.Header)
printfn "peptide:  %s" (BioList.toString targetPeptide.PepSequence)
printfn "neutral monoisotopic mass: %.5f Da" targetMass
protein:  P19528
peptide:  LLGVLLMAAVPAGLITVPFIESINK
neutral monoisotopic mass: 2578.51720 Da

A production pipeline queries the database with a 30 ppm window around the measured precursor mass.

let lookUpByMass = SearchDB.getThreadSafePeptideLookUpFromFileBy cn searchDbParams

let ppmToDalton ppm mass = mass * ppm / 1000000.

let showHits (hits: SearchDB.LookUpResult<AminoAcids.AminoAcid> list) =
    hits
    |> List.sortBy (fun h -> h.Mass)
    |> List.iter (fun h ->
        printfn "%-30s mass %11.5f  rounded %11i  pepSeqID %i  modSeqID %i  globalMod %i"
            h.StringSequence h.Mass h.RoundedMass h.PepSequenceID h.ModSequenceID h.GlobalMod)

let tolerance = ppmToDalton 30. targetMass

printfn "30 ppm at this mass: %.5f Da" tolerance

let hits = lookUpByMass (targetMass - tolerance) (targetMass + tolerance)

showHits hits
30 ppm at this mass: 0.07736 Da
LLGVLLMAAVPAGLITVPFIESINK      mass  2578.51720  rounded  2578517204  pepSeqID 4  modSeqID 3  globalMod 0

The window returns exactly the peptide we computed the mass for, as a LookUpResult. StringSequence is the stored sequence, Mass the precomputed neutral mass and RoundedMass that mass multiplied by one million and stored as an integer, which is the indexed column the BETWEEN query runs against. PepSequenceID identifies the plain peptide sequence and ModSequenceID the specific modified variant. GlobalMod tells whether the entry belongs to the isotopically labeled form of the database. We configured no isotopic modification, so it is 0 for every entry. The BioSequence field, not printed here, holds the sequence parsed back into a BioFSharp amino acid list, ready for fragment prediction.

The oxidized form of the same peptide weighs one oxygen more and sits in its own mass window. Querying 30 ppm around that mass returns the variant carrying the modification.

let oxidizedMass = targetMass + oxidationDelta

let oxHits = lookUpByMass (oxidizedMass - tolerance) (oxidizedMass + tolerance)

showHits oxHits
LLGVLL[ox]MAAVPAGLITVPFIESINK  mass  2594.51212  rounded  2594512119  pepSeqID 4  modSeqID 4  globalMod 0

The modification appears inside the sequence string as the [ox] code directly in front of the modified residue, the same code we passed to createSearchModification. Both variants share the PepSequenceID of the plain sequence but have distinct ModSequenceIDs and masses. A search engine scoring this window would now treat the oxidized sequence as its own candidate.

Mapping peptides back to proteins

After spectra have been matched, the pipeline needs to know which proteins a peptide belongs to, because the final goal is a protein list. The CleavageIndex table stores this mapping, and getProteinPeptideLookUpFromFileBy prepares a lookup from a PepSequenceID to the accessions of all proteins containing that peptide, each accession paired with the peptide sequence the ID stands for. It expects an in-memory copy of the database, which copyDBIntoMemory produces from the open file connection, so the many lookups of a full run avoid disk access.

let memoryDB = SearchDB.copyDBIntoMemory cn

let proteinsOfPeptide = SearchDB.getProteinPeptideLookUpFromFileBy memoryDB

let firstHit = hits |> List.minBy (fun h -> h.Mass)

proteinsOfPeptide firstHit.PepSequenceID
|> List.iter (fun (accession, peptideSequence) ->
    printfn "peptide %s occurs in protein %s" peptideSequence accession)
peptide LLGVLLMAAVPAGLITVPFIESINK occurs in protein P19528

The peptide maps back to P19528, the cytochrome b6/f subunit the FASTA starts with, and the returned accession is exactly what our fastaHeaderToName function extracted during the build. This reverse mapping is the raw material for protein inference, where shared peptides make the mapping ambiguous and need to be resolved.

Caching repeated lookups

Consecutive precursors in a run often have similar masses, so their candidate windows overlap and the same peptides would be fetched and their fragments predicted again. The Cache module addresses this with a thin wrapper around SortedList, keyed by the same rounded integer masses the database uses. getPeptideLookUpWithMemBy combines such a cache with the database lookup and fragment prediction, so a peptide that already went through the pipeline is served from memory. Creating a cache and storing a result under its rounded mass looks like this.

let lookUpCache = Cache.createCache<int64, SearchDB.LookUpResult<AminoAcids.AminoAcid> list>

Cache.addItem lookUpCache (firstHit.RoundedMass, hits)

printfn "cached entries: %i" lookUpCache.Count
printfn "contains key %i: %b" firstHit.RoundedMass (fst (Cache.getItemBy lookUpCache firstHit.RoundedMass))
cached entries: 1
contains key 2578517204: true

addItem inserts or replaces the value under a key and getItemBy retrieves it. The memoized lookup itself is wired up by the search engine.

The next step is to predict each candidate's fragments and compare them to the measured spectrum, the subject of SEQUEST-like scoring.

val dbFolder: string
namespace System
namespace System.IO
type Path = static member ChangeExtension: path: string * extension: string -> string static member Combine: path1: string * path2: string -> string + 4 overloads static member EndsInDirectorySeparator: path: ReadOnlySpan<char> -> bool + 1 overload static member Exists: path: string -> bool static member GetDirectoryName: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload static member GetExtension: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload static member GetFileName: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload static member GetFileNameWithoutExtension: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload static member GetFullPath: path: string -> string + 1 overload static member GetInvalidFileNameChars: unit -> char array ...
<summary>Performs operations on <see cref="T:System.String" /> instances that contain file or directory path information. These operations are performed in a cross-platform manner.</summary>
System.IO.Path.Combine(paths: System.ReadOnlySpan<string>) : string
System.IO.Path.Combine([<System.ParamArray>] paths: string array) : string
System.IO.Path.Combine(path1: string, path2: string) : string
System.IO.Path.Combine(path1: string, path2: string, path3: string) : string
System.IO.Path.Combine(path1: string, path2: string, path3: string, path4: string) : string
System.IO.Path.GetTempPath() : string
type Directory = static member CreateDirectory: path: string -> DirectoryInfo + 1 overload static member CreateSymbolicLink: path: string * pathToTarget: string -> FileSystemInfo static member CreateTempSubdirectory: ?prefix: string -> DirectoryInfo static member Delete: path: string -> unit + 1 overload static member EnumerateDirectories: path: string -> IEnumerable<string> + 3 overloads static member EnumerateFileSystemEntries: path: string -> IEnumerable<string> + 3 overloads static member EnumerateFiles: path: string -> IEnumerable<string> + 3 overloads static member Exists: path: string -> bool static member GetCreationTime: path: string -> DateTime static member GetCreationTimeUtc: path: string -> DateTime ...
<summary>Exposes static methods for creating, moving, and enumerating through directories and subdirectories. This class cannot be inherited.</summary>
System.IO.Directory.CreateDirectory(path: string) : System.IO.DirectoryInfo
System.IO.Directory.CreateDirectory(path: string, unixCreateMode: System.IO.UnixFileMode) : System.IO.DirectoryInfo
val ignore: value: 'T -> unit
namespace BioFSharp
namespace BioFSharp.Mz
val oxidationM: SearchDB.SearchModification
module SearchDB from BioFSharp.Mz
val createSearchModification: name: string -> accession: string -> description: string -> isBiological: bool -> composition: string -> site: SearchDB.SearchModSite list -> mType: SearchDB.SearchModType -> xModCode: string -> SearchDB.SearchModification
union case SearchDB.SearchModSite.Specific: AminoAcids.AminoAcid * ModificationInfo.ModLocation -> SearchDB.SearchModSite
module AminoAcids from BioFSharp
<summary> Contains the AminoAcid type and its according functions. The AminoAcid type is a complex presentation of amino acids, allowing modifications </summary>
union case AminoAcids.AminoAcid.Met: AminoAcids.AminoAcid
<summary> 'M' - Met - Methionine Met is essential for humans. Always the first amino acid to be incorporated into a protein, it is sometimes removed after translation. Like cysteine, it contains sulfur, but with a methyl group instead of hydrogen. This methyl group can be activated, and is used in many reactions where a new carbon atom is being added to another molecule. </summary>
module ModificationInfo from BioFSharp
<summary> Functionality for creating formula modifications </summary>
[<Struct>] type ModLocation = | Residual = 0 | Cterm = 1 | Nterm = 2 | ProteinCterm = 3 | ProteinNterm = 4 | Isotopic = 5
<summary> Specifier for location of modification </summary>
ModificationInfo.ModLocation.Residual: ModificationInfo.ModLocation = 0
type SearchModType = | Minus | Plus member Equals: SearchModType * IEqualityComparer -> bool member IsMinus: bool member IsPlus: bool
union case SearchDB.SearchModType.Plus: SearchDB.SearchModType
val oxidationDelta: float
val massFBy: massMode: SearchDB.MassMode -> (IBioItem -> float)
type MassMode = | Average | Monoisotopic member Equals: MassMode * IEqualityComparer -> bool override ToString: unit -> string member IsAverage: bool member IsMonoisotopic: bool
union case SearchDB.MassMode.Monoisotopic: SearchDB.MassMode
val getModBy: smodi: SearchDB.SearchModification -> ModificationInfo.Modification
val printfn: format: Printf.TextWriterFormat<'T> -> 'T
SearchDB.SearchModification.Name: string
val fastaPath: string
val fastaHeaderToName: header: string -> string
val header: string
Multiple items
val string: value: 'T -> string

--------------------
type string = System.String
System.String.Split(separator: System.ReadOnlySpan<char>) : string array
   (+0 other overloads)
System.String.Split([<System.ParamArray>] separator: char array) : string array
   (+0 other overloads)
System.String.Split(separator: string array, options: System.StringSplitOptions) : string array
   (+0 other overloads)
System.String.Split(separator: string, ?options: System.StringSplitOptions) : string array
   (+0 other overloads)
System.String.Split(separator: char array, options: System.StringSplitOptions) : string array
   (+0 other overloads)
System.String.Split(separator: char array, count: int) : string array
   (+0 other overloads)
System.String.Split(separator: char, ?options: System.StringSplitOptions) : string array
   (+0 other overloads)
System.String.Split(separator: string array, count: int, options: System.StringSplitOptions) : string array
   (+0 other overloads)
System.String.Split(separator: string, count: int, ?options: System.StringSplitOptions) : string array
   (+0 other overloads)
System.String.Split(separator: char array, count: int, options: System.StringSplitOptions) : string array
   (+0 other overloads)
val searchDbParams: SearchDB.SearchDbParams
val createSearchDbParams: name: string -> dbPath: string -> fastapath: string -> fastaHeaderToName: (string -> string) -> protease: Digestion.Protease -> minMissedCleavages: int -> maxMissedCleavages: int -> maxmass: float -> minPepLength: int -> maxPepLength: int -> globalMod: SearchDB.SearchInfoIsotopic list -> massMode: SearchDB.MassMode -> massFunction: (IBioItem -> float) -> fixedMods: SearchDB.SearchModification list -> variableMods: SearchDB.SearchModification list -> varModThreshold: int -> SearchDB.SearchDbParams
module Digestion from BioFSharp
<summary> Contains types and functions needed to digest amino acid sequences with proteases </summary>
module Table from BioFSharp.Digestion
<summary> Contains frequently needed proteases </summary>
val getProteaseBy: name: string -> Digestion.Protease
Path.GetFileName(path: string) : string
Path.GetFileName(path: System.ReadOnlySpan<char>) : System.ReadOnlySpan<char>
module Db from BioFSharp.Mz.SearchDB
val getNameOf: sdbParams: SearchDB.SearchDbParams -> string
<summary> Returns the database name given the SearchDbParams </summary>
SearchDB.SearchDbParams.Protease: Digestion.Protease
Digestion.Protease.Name: string
namespace System.Data
namespace System.Data.SQLite
val cn: SQLiteConnection
val connectOrCreateDB: sdbParams: SearchDB.SearchDbParams -> SQLiteConnection
val countRows: table: string -> int64
val table: string
val cmd: SQLiteCommand
Multiple items
type SQLiteCommand = inherit DbCommand interface ICloneable new: unit -> unit + 4 overloads member Cancel: unit -> unit member Clone: unit -> obj member CreateParameter: unit -> SQLiteParameter member ExecuteNonQuery: unit -> int + 1 overload member ExecuteReader: behavior: CommandBehavior -> SQLiteDataReader + 1 overload member ExecuteScalar: unit -> obj + 1 overload member GetDiagnostics: unit -> string ...
<summary> SQLite implementation of DbCommand. </summary>

--------------------
SQLiteCommand() : SQLiteCommand
SQLiteCommand(commandText: string) : SQLiteCommand
SQLiteCommand(connection: SQLiteConnection) : SQLiteCommand
SQLiteCommand(commandText: string, connection: SQLiteConnection) : SQLiteCommand
SQLiteCommand(commandText: string, connection: SQLiteConnection, transaction: SQLiteTransaction) : SQLiteCommand
val sprintf: format: Printf.StringFormat<'T> -> 'T
SQLiteCommand.ExecuteScalar() : obj
SQLiteCommand.ExecuteScalar(behavior: System.Data.CommandBehavior) : obj
Multiple items
val int64: value: 'T -> int64 (requires member op_Explicit)

--------------------
type int64 = System.Int64

--------------------
type int64<'Measure> = int64
type File = static member AppendAllBytes: path: string * bytes: byte array -> unit + 1 overload static member AppendAllBytesAsync: path: string * bytes: byte array * ?cancellationToken: CancellationToken -> Task + 1 overload static member AppendAllLines: path: string * contents: IEnumerable<string> -> unit + 1 overload static member AppendAllLinesAsync: path: string * contents: IEnumerable<string> * encoding: Encoding * ?cancellationToken: CancellationToken -> Task + 1 overload static member AppendAllText: path: string * contents: ReadOnlySpan<char> -> unit + 3 overloads static member AppendAllTextAsync: path: string * contents: ReadOnlyMemory<char> * encoding: Encoding * ?cancellationToken: CancellationToken -> Task + 3 overloads static member AppendText: path: string -> StreamWriter static member Copy: sourceFileName: string * destFileName: string -> unit + 1 overload static member Create: path: string -> FileStream + 2 overloads static member CreateSymbolicLink: path: string * pathToTarget: string -> FileSystemInfo ...
<summary>Provides static methods for the creation, copying, deletion, moving, and opening of a single file, and aids in the creation of <see cref="T:System.IO.FileStream" /> objects.</summary>
File.Exists(path: string) : bool
namespace BioFSharp.IO
val firstProtein: FileFormats.Fasta.FastaItem<AminoAcids.AminoAcid>
module Fasta from BioFSharp.IO
<summary> Functions to read and write fasta formatted files </summary>
val read: sequenceConverter: (char seq -> #('SequenceItem seq)) -> filePath: string -> FileFormats.Fasta.FastaItem<'SequenceItem> seq
<summary> Creates a sequence of FastaItems by parsing the input line per line. The passed converter function is used to convert the sequence of each record to the desired type. Lines starting with '#' or ';' are ignored. </summary>
<param name="sequenceConverter">Function to convert the sequence of each record to the desired type</param>
<param name="filePath">Path to a fasta formatted file</param>
<returns>Sequence of FastaItems</returns>
<exception cref="System.IO.InvalidDataException">If the input is not in the correct fasta format</exception>
Multiple items
module BioArray from BioFSharp.BioCollectionsExtensions

--------------------
module BioArray from BioFSharp
<summary> This module contains the BioArray type and its according functions. The BioArray type is an array of objects using the IBioItem interface </summary>
val ofAminoAcidString: s: #(char seq) -> BioArray.BioArray<AminoAcids.AminoAcid>
<summary> Generates amino acid sequence of one-letter-code raw string </summary>
module Seq from Microsoft.FSharp.Collections
val head: source: 'T seq -> 'T
val targetPeptide: Digestion.DigestedPeptide<int>
module BioArray from BioFSharp.Digestion
val digest: protease: Digestion.Protease -> proteinID: 'a -> aas: AminoAcids.AminoAcid array -> Digestion.DigestedPeptide<'a> array
<summary> Takes Proteinsequence as input and returns Array of resulting DigestedPeptides </summary>
val Trypsin: Digestion.Protease
FileFormats.Fasta.FastaItem.Sequence: AminoAcids.AminoAcid seq
module Array from Microsoft.FSharp.Collections
val ofSeq: source: 'T seq -> 'T array
val find: predicate: ('T -> bool) -> array: 'T array -> 'T
val p: Digestion.DigestedPeptide<int>
Digestion.DigestedPeptide.PepSequence: AminoAcids.AminoAcid list
property List.Length: int with get
Multiple items
module List from Microsoft.FSharp.Collections

--------------------
type List<'T> = | op_Nil | op_ColonColon of Head: 'T * Tail: 'T list interface IReadOnlyList<'T> interface IReadOnlyCollection<'T> interface IEnumerable interface IEnumerable<'T> member GetReverseIndex: rank: int * offset: int -> int member GetSlice: startIndex: int option * endIndex: int option -> 'T list static member Cons: head: 'T * tail: 'T list -> 'T list member Head: 'T member IsEmpty: bool member Item: index: int -> 'T with get ...
val contains: value: 'T -> source: 'T list -> bool (requires equality)
val targetMass: float
val sumBy: projection: ('T -> 'U) -> list: 'T list -> 'U (requires member (+) and member Zero)
module BioItem from BioFSharp
<summary> Basic functions on IBioItems interface </summary>
val monoisoMass<'a (requires 'a :> IBioItem)> : (IBioItem -> float) (requires 'a :> IBioItem)
<summary> Returns the monoisotopic mass of a bio item (without H20) </summary>
module Table from BioFSharp.ModificationInfo
<summary> Contains frequent modifications </summary>
val H2O: ModificationInfo.Modification
FileFormats.Fasta.FastaItem.Header: string
Multiple items
module BioList from BioFSharp.BioCollectionsExtensions

--------------------
module BioList from BioFSharp
<summary> This module contains the BioList type and its according functions. The BioList type is a List of objects using the IBioItem interface </summary>
val toString: bs: BioList.BioList<#IBioItem> -> string
<summary> Returns string of one-letter-code </summary>
val lookUpByMass: (float -> float -> SearchDB.LookUpResult<AminoAcids.AminoAcid> list)
val getThreadSafePeptideLookUpFromFileBy: cn: SQLiteConnection -> sdbParams: SearchDB.SearchDbParams -> (float -> float -> SearchDB.LookUpResult<AminoAcids.AminoAcid> list)
<summary> Returns a LookUpResult list </summary>
val ppmToDalton: ppm: float -> mass: float -> float
val ppm: float
val mass: float
val showHits: hits: SearchDB.LookUpResult<AminoAcids.AminoAcid> list -> unit
val hits: SearchDB.LookUpResult<AminoAcids.AminoAcid> list
type LookUpResult<'a (requires 'a :> IBioItem)> = { ModSequenceID: int PepSequenceID: int Mass: float RoundedMass: int64 StringSequence: string BioSequence: 'a list GlobalMod: int } member Equals: LookUpResult<'a> * IEqualityComparer -> bool
type AminoAcid = | Ala | Cys | Asp | Glu | Phe | Gly | His | Ile | Lys | Leu ... interface IBioItem static member op_Explicit: value: #IBioItem -> byte + 1 overload
<summary> Amino acid Codes </summary>
type 'T list = List<'T>
val sortBy: projection: ('T -> 'Key) -> list: 'T list -> 'T list (requires comparison)
val h: SearchDB.LookUpResult<AminoAcids.AminoAcid>
SearchDB.LookUpResult.Mass: float
val iter: action: ('T -> unit) -> list: 'T list -> unit
SearchDB.LookUpResult.StringSequence: string
SearchDB.LookUpResult.RoundedMass: int64
SearchDB.LookUpResult.PepSequenceID: int
SearchDB.LookUpResult.ModSequenceID: int
SearchDB.LookUpResult.GlobalMod: int
val tolerance: float
val oxidizedMass: float
val oxHits: SearchDB.LookUpResult<AminoAcids.AminoAcid> list
val memoryDB: SQLiteConnection
val copyDBIntoMemory: cn: SQLiteConnection -> SQLiteConnection
val proteinsOfPeptide: (int32 -> (string * string) list)
val getProteinPeptideLookUpFromFileBy: memoryDB: SQLiteConnection -> (int32 -> (string * string) list)
<summary> Prepares a function which returns a list of protein Accessions tupled with the peptide sequence whose ID they were retrieved by </summary>
val firstHit: SearchDB.LookUpResult<AminoAcids.AminoAcid>
val minBy: projection: ('T -> 'U) -> list: 'T list -> 'T (requires comparison)
val accession: string
val peptideSequence: string
val lookUpCache: Cache.Cache<int64,SearchDB.LookUpResult<AminoAcids.AminoAcid> list>
module Cache from BioFSharp.Mz
val createCache<'a,'b> : Cache.Cache<'a,'b>
<summary> Creates cache with default constructor </summary>
val addItem: cache: Cache.Cache<'a,'b> -> 'a * 'b -> unit
<summary> Adds item to the Cache </summary>
property System.Collections.Generic.SortedList.Count: int with get
val fst: tuple: ('T1 * 'T2) -> 'T1
val getItemBy: cache: Cache.Cache<'a,'b> -> key: 'a -> bool * 'b
<summary> Returns with defined key </summary>

Type something to start searching.