Alignment of Peptide derived MS Spectra.

Interested? Contact muehlhaus@bio.uni-kl.de or d_zimmer@rhrk.uni-kl.de

Table of contents

Introduction

Modern Proteomics relies on the use of mass spectrometry (MS). Since it is not feasible to analyze proteins directly, MS-based shotgun proteomics estimates protein abundances using a proxy: peptides. While the whole process is complex enough to fill whole textbooks, this project focuses on a very specific puzzle piece:

The alignment of peptide derived MS spectra.

Let us motivate this problem by visual examination of the fragment spectra' of two example peptides with the sequences 'PRTEIINNEE' (blue) and 'PRTEYINNEE' (orange).

': For simplicity we will only consider b-ions at charge 1.

Even though that both peptides show very high sequence similarity and only differ by one amino acid, with 'I' at index 4 being substituted with 'Y', this small change in the sequence results in a big change on the spectrum level. As one can see, more than half of all peaks do not overlap. This is problematic since many algorithms that compare spectra aim to maximize matching peaks - This project is designed to tackle this gap by solving the 'Spectral Alignment Problem'.

Before we formulate the problem and discover a strategy to tackle it we change the perspective: The following figure plots the peak positions of the fragment spectra of the b-ions of 'PRTEIINNEE' versus the one of 'PRTEYINNEE'. The plot contains every possible pair of peaks (eg. the first peak of spectrum 1 and the second peak of spectrum 2) depicted as grey crosses. Additionally, we added matching peaks as blue circles and non-matching peaks as orange triangles. You can see, that all matching peaks are placed on the main diagonal (blue line), while the non-matching peaks are lined up at a constant offset, parallel to the main diagonal.

The pattern which we want to highlight here becomes even more evident if we raise the amount of amino acid mutations by one and plotting the b-ion spectrum of 'PRTEIINNEE' versus the one of 'PRTEYINYEE'.

As one can see, the addition of another mutation has the effect that the 6 non-matching peaks are now lined up at 2 distinct offsets, resulting in three peaks per offset which are placed parallel to the main diagonal. Analyzing the plot carefully, you can derive that the green path is the longest path one can find with at most k=2 shifts from the main diagonal. In practice this information can be used to identify spectra that are the result of modified or mutated peptides: Your main task will be to solve the following longest path problem and to provide an efficient implementation:

Spectral Alignment Problem: Description: Find the k-similarity between two Spectra.

Input: Spectrum \(Sa\) , Spectrum \(Sb\), number of shifts \(k\)

Output: The \(k\) -similarity, \(D(k)\), between \(Sa\) and \(Sb\)

Aim for this project

This project is your chance to dive into a topic of great relevance to modern biology: MS-based shotgun proteomics.

  • By completing this assignment you will understand the basic principles of modern proteomics and gain a deep understanding of peptide identification.

  • Finally, you will implement an efficient version of spectral alignment to extend the BioFSharp.Mz library.

Coding clues

Fortunately, you can straight away start your journey since many functionalities are already implemented in the BioFSharp and BioFSharp.Mz libaries. The following snippet creates a function that returns a fragment spectrum consisting of b-ions at intensity 1 based on a string encoded peptide sequence:

let calcBIonFragments pepSequence =   
    pepSequence
    |> BioFSharp.BioList.ofAminoAcidString
    |> Fragmentation.Series.bOfBioList BioFSharp.BioItem.monoisoMass
    |> List.map (fun x -> x.MainPeak.Mass,1.)

This function can for example be used to recreate the first sample from above:

let PRTEIINNEE' =   
    "PRTEIINNEE"
    |> calcBIonFragments
let PRTEYINNEE' =   
    "PRTEYINNEE"
    |> calcBIonFragments

let specComp' = 
    [
        PRTEIINNEE' 
        |> Chart.Column
        |> Chart.withTraceName "PRTEIINNEE"
        PRTEYINNEE' 
        |> Chart.Column
        |> Chart.withTraceName "PRTEYINNEE"
    ]    
    |> Chart.combine
    
specComp'
|> GenericChart.toChartHTML

To allow you a little head start we provide you with a very naive implementation of the spectral alignment problem''.

Disclaimer: You can use this implementation to benchmark against, or just familiarize yourself with the problem. You are by no means obligated to use this implementation as a blue print!

In contrast to this naive implementation, the algorithm provided by you should be more efficient as well as applicable on mass spectra which consist of b and y ions'' at charges up to 4. Additionally, this naive implementation assumes that masses are measured as integers. Your algorithm should be able to take floating point values as an input.

'': Remember in the examples above we only considered b-ions at charge 1.

type Path = {
    K         : int
    PathIndices: list<int*int>
    }
   
// 
let findAllPaths maxK (m:Matrix<float>) = 
    let extendInAllPossibleDirections (m:Matrix<float>) maxK currentRow (path :Path) = 
        if path.K >= maxK then 
            let lastRow,lastCol = path.PathIndices.Head
            let colinearCol = currentRow-lastRow+lastCol
            if colinearCol > m.NumCols-1 then 
                [path]
            else
            let acc' =
                let v = m.[currentRow,colinearCol]
                if v = 1. then 
                    (currentRow,colinearCol)::path.PathIndices
                else
                    path.PathIndices 
            [{path with PathIndices = acc'}]
        else 
            let newV =
                let _,lastCol = path.PathIndices.Head 
                [
                    for j = (lastCol + 1) to m.NumCols-1 do
                        let v = m.[currentRow,j]
                        if v = 1. then yield (currentRow,j) 
                ]
            match newV with 
            | [] -> [path]
            | _ -> 
            let newPaths = 
                newV
                |> List.map (fun (currentRow,matchingColumn) -> (currentRow,matchingColumn)::path.PathIndices)
                |> List.map (fun acc' ->
                    let k' = 
                        match acc' with 
                        | [] -> path.K
                        | x::[] -> path.K
                        | x::y::t -> 
                            if (fst x - fst y) = (snd x - snd y) then 
                                path.K
                            else path.K + 1
                    {K=k';PathIndices=acc'}
                    )
            path::newPaths
    let rec loop paths currentRowIdx =
        if currentRowIdx > m.NumRows-1 then 
            paths
        else
            let expandedPaths = 
                paths
                |> List.collect (extendInAllPossibleDirections m maxK currentRowIdx)           
            loop expandedPaths (currentRowIdx+1)
    loop [{K=0;PathIndices=[0,0]}] 0

//
let calcSimilarityAt_simple k (specA:int[]) (specB:int[]) =
    let n :int = System.Math.Max(specA |> Array.max,specB |> Array.max)
    let vecA = 
        let tmp = FSharp.Stats.Vector.create (n+1) 0.
        specA
        |> Array.iter (fun p -> tmp.[p] <- 1.)
        tmp
    let vecB = 
        let tmp = FSharp.Stats.Vector.create (n+1) 0.
        specB
        |> Array.iter (fun p -> tmp.[p] <- 1.)
        tmp
    let m = vecA * vecB.Transpose
    let longestPath = 
        findAllPaths k m
        |> List.maxBy (fun p -> p.PathIndices.Length)
    longestPath.PathIndices.Length - 1

Using this implementation we encourage you to read the paper "Mutation-Tolerant Protein Identification by Mass Spectrometry" (see References), which takes a deep dive into the topic. In the following code snippet we will apply our naive implementation to examples from the paper - something we also advise you to do - once you come up with your first implementation.

// Example 1
let sa = [|10; 20; 30; 40; 50; 60; 70; 80; 90; 100|]
let sb = [|10; 20; 30; 40; 50; 55; 65; 75; 85; 95|]
let sc = [|10; 15; 30; 35; 50; 55; 70; 75; 90; 95|]

// should be 10
let D_1_sa_sb =  calcSimilarityAt_simple 1 sa sb  

// should be 6
let D_1_sa_sc =  calcSimilarityAt_simple 1 sa sc  


// Example 2
let sd = [|7; 11; 15; 18; 21; 24; 30; 38; 43|]
let se = [|7; 11; 13; 19; 22; 25; 31; 33; 38|]

// the authors claim its 5.
let D_1_sd_se =  calcSimilarityAt_simple 1 sd se  

// should be 8
let D_2_sd_se =  calcSimilarityAt_simple 2 sd se  

References

Mutation-Tolerant Protein Identification by Mass Spectrometry, P. A. Pevzner et al. 2000

Efficiency of Database Search for Identification of Mutated and Modified Proteins via Mass Spectrometry, P. A. Pevzner et al. 2001

Additional information

  • We strongly advise to work through the paper "Mutation-Tolerant Protein Identification by Mass Spectrometry". It serves as a very good introduction into the topic and gives you many ideas on how to write an efficient implementation.
namespace FSharpAux
namespace FSharpAux.IO
namespace BioFSharp
namespace BioFSharp.IO
namespace BioFSharp.Mz
Multiple items
namespace FSharp

--------------------
namespace Microsoft.FSharp
namespace FSharp.Stats
namespace Plotly
namespace Plotly.NET
val PRTEIINNEE : (float * float) list
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 ofAminoAcidString : s:#seq<char> -> BioList.BioList<AminoAcids.AminoAcid>
<summary> Generates amino acid sequence of one-letter-code raw string </summary>
module Fragmentation from BioFSharp.Mz
module Series from BioFSharp.Mz.Fragmentation
val bOfBioList : massfunction:(IBioItem -> float) -> aal:AminoAcids.AminoAcid list -> PeakFamily<TaggedMass.TaggedMass> list
<summary> Returns the b series of the given amino acids list. The mass accuracy is determined by the massfunction applied. </summary>
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>
Multiple items
module List from FSharp.Stats
<summary> Module to compute common statistical measure on list </summary>

--------------------
module List from FSharpAux

--------------------
module List from Microsoft.FSharp.Collections
<summary>Contains operations for working with values of type <see cref="T:Microsoft.FSharp.Collections.list`1" />.</summary>
<namespacedoc><summary>Operations for collections such as lists, arrays, sets, maps and sequences. See also <a href="https://docs.microsoft.com/dotnet/fsharp/language-reference/fsharp-collection-types">F# Collection Types</a> in the F# Language Guide. </summary></namespacedoc>


--------------------
type List<'T> = | ( [] ) | ( :: ) 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 ...
<summary>The type of immutable singly-linked lists.</summary>
<remarks>Use the constructors <c>[]</c> and <c>::</c> (infix) to create values of this type, or the notation <c>[1;2;3]</c>. Use the values in the <c>List</c> module to manipulate values of this type, or pattern match against the values directly. </remarks>
<exclude />
val map : mapping:('T -> 'U) -> list:'T list -> 'U list
<summary>Builds a new collection whose elements are the results of applying the given function to each of the elements of the collection.</summary>
<param name="mapping">The function to transform elements from the input list.</param>
<param name="list">The input list.</param>
<returns>The list of transformed elements.</returns>
val x : PeakFamily<TaggedMass.TaggedMass>
PeakFamily.MainPeak: TaggedMass.TaggedMass
property TaggedMass.TaggedMass.Mass: float with get
val PRTEYINNEE : (float * float) list
val specComp : GenericChart.GenericChart
type Chart = static member AnnotatedHeatmap : zData:seq<#seq<'a1>> * annotationText:seq<#seq<string>> * ?Name:string * ?ShowLegend:bool * ?Opacity:float * ?X:seq<#IConvertible> * ?XGap:int * ?Y:seq<#IConvertible> * ?YGap:int * ?Text:'a5 * ?MultiText:seq<'a5> * ?ColorBar:ColorBar * ?ColorScale:Colorscale * ?ShowScale:bool * ?ReverseScale:bool * ?ZSmooth:SmoothAlg * ?Transpose:bool * ?UseWebGL:bool * ?ReverseYAxis:bool * ?UseDefaults:bool -> GenericChart (requires 'a1 :> IConvertible and 'a5 :> IConvertible) static member Area : x:seq<#IConvertible> * y:seq<#IConvertible> * ?Name:string * ?ShowMarkers:bool * ?ShowLegend:bool * ?MarkerSymbol:MarkerSymbol * ?Color:Color * ?Opacity:float * ?Labels:seq<#IConvertible> * ?TextPosition:TextPosition * ?TextFont:Font * ?Dash:DrawingStyle * ?Width:float * ?UseDefaults:bool -> GenericChart + 1 overload static member Bar : values:seq<#IConvertible> * ?Keys:seq<#IConvertible> * ?Name:string * ?ShowLegend:bool * ?Opacity:float * ?MultiOpacity:seq<float> * ?Text:'a2 * ?MultiText:seq<'a2> * ?MarkerColor:Color * ?MarkerColorScale:Colorscale * ?MarkerOutline:Line * ?MarkerPatternShape:PatternShape * ?MultiMarkerPatternShape:seq<PatternShape> * ?MarkerPattern:Pattern * ?Marker:Marker * ?Base:#IConvertible * ?Width:'a4 * ?MultiWidth:seq<'a4> * ?TextPosition:TextPosition * ?MultiTextPosition:seq<TextPosition> * ?UseDefaults:bool -> GenericChart (requires 'a2 :> IConvertible and 'a4 :> IConvertible) + 1 overload static member BoxPlot : ?x:seq<#IConvertible> * ?y:seq<#IConvertible> * ?Name:string * ?ShowLegend:bool * ?Text:'a2 * ?MultiText:seq<'a2> * ?Fillcolor:Color * ?MarkerColor:Color * ?OutlierColor:Color * ?OutlierWidth:int * ?Opacity:float * ?WhiskerWidth:float * ?BoxPoints:BoxPoints * ?BoxMean:BoxMean * ?Jitter:float * ?PointPos:float * ?Orientation:Orientation * ?Marker:Marker * ?Line:Line * ?AlignmentGroup:string * ?Offsetgroup:string * ?Notched:bool * ?NotchWidth:float * ?QuartileMethod:QuartileMethod * ?UseDefaults:bool -> GenericChart (requires 'a2 :> IConvertible) + 1 overload static member Bubble : x:seq<#IConvertible> * y:seq<#IConvertible> * sizes:seq<int> * ?Name:string * ?ShowLegend:bool * ?Opacity:float * ?MultiOpacity:seq<float> * ?Text:'a2 * ?MultiText:seq<'a2> * ?TextPosition:TextPosition * ?MultiTextPosition:seq<TextPosition> * ?MarkerColor:Color * ?MarkerColorScale:Colorscale * ?MarkerOutline:Line * ?MarkerSymbol:MarkerSymbol * ?MultiMarkerSymbol:seq<MarkerSymbol> * ?Marker:Marker * ?LineColor:Color * ?LineColorScale:Colorscale * ?LineWidth:float * ?LineDash:DrawingStyle * ?Line:Line * ?StackGroup:string * ?Orientation:Orientation * ?GroupNorm:GroupNorm * ?UseWebGL:bool * ?UseDefaults:bool -> GenericChart (requires 'a2 :> IConvertible) + 1 overload static member Candlestick : open:seq<#IConvertible> * high:seq<#IConvertible> * low:seq<#IConvertible> * close:seq<#IConvertible> * x:seq<#IConvertible> * ?Name:string * ?ShowLegend:bool * ?Opacity:float * ?Text:'a5 * ?MultiText:seq<'a5> * ?Line:Line * ?IncreasingColor:Color * ?Increasing:FinanceMarker * ?DecreasingColor:Color * ?Decreasing:FinanceMarker * ?WhiskerWidth:float * ?UseDefaults:bool -> GenericChart (requires 'a5 :> IConvertible) + 1 overload static member Column : values:seq<#IConvertible> * ?Keys:seq<#IConvertible> * ?Name:string * ?ShowLegend:bool * ?Opacity:float * ?MultiOpacity:seq<float> * ?Text:'a2 * ?MultiText:seq<'a2> * ?MarkerColor:Color * ?MarkerColorScale:Colorscale * ?MarkerOutline:Line * ?MarkerPatternShape:PatternShape * ?MultiMarkerPatternShape:seq<PatternShape> * ?MarkerPattern:Pattern * ?Marker:Marker * ?Base:#IConvertible * ?Width:'a4 * ?MultiWidth:seq<'a4> * ?TextPosition:TextPosition * ?MultiTextPosition:seq<TextPosition> * ?UseDefaults:bool -> GenericChart (requires 'a2 :> IConvertible and 'a4 :> IConvertible) + 1 overload static member Contour : zData:seq<#seq<'a1>> * ?Name:string * ?ShowLegend:bool * ?Opacity:float * ?X:seq<#IConvertible> * ?Y:seq<#IConvertible> * ?Text:'a4 * ?MultiText:seq<'a4> * ?ColorBar:ColorBar * ?ColorScale:Colorscale * ?ShowScale:bool * ?ReverseScale:bool * ?Transpose:bool * ?LineColor:Color * ?LineDash:DrawingStyle * ?Line:Line * ?ContoursColoring:ContourColoring * ?ContoursOperation:ConstraintOperation * ?ContoursType:ContourType * ?ShowContourLabels:bool * ?ContourLabelFont:Font * ?Contours:Contours * ?FillColor:Color * ?NContours:int * ?UseDefaults:bool -> GenericChart (requires 'a1 :> IConvertible and 'a4 :> IConvertible) static member Funnel : x:seq<#IConvertible> * y:seq<#IConvertible> * ?Name:string * ?ShowLegend:bool * ?Opacity:float * ?Width:float * ?Offset:float * ?Text:'a2 * ?MultiText:seq<'a2> * ?TextPosition:TextPosition * ?MultiTextPosition:seq<TextPosition> * ?Orientation:Orientation * ?AlignmentGroup:string * ?OffsetGroup:string * ?MarkerColor:Color * ?MarkerOutline:Line * ?Marker:Marker * ?TextInfo:TextInfo * ?ConnectorLineColor:Color * ?ConnectorLineStyle:DrawingStyle * ?ConnectorFillColor:Color * ?ConnectorLine:Line * ?Connector:FunnelConnector * ?InsideTextFont:Font * ?OutsideTextFont:Font * ?UseDefaults:bool -> GenericChart (requires 'a2 :> IConvertible) static member Heatmap : zData:seq<#seq<'a1>> * ?Name:string * ?ShowLegend:bool * ?Opacity:float * ?X:seq<#IConvertible> * ?XGap:int * ?Y:seq<#IConvertible> * ?YGap:int * ?Text:'a4 * ?MultiText:seq<'a4> * ?ColorBar:ColorBar * ?ColorScale:Colorscale * ?ShowScale:bool * ?ReverseScale:bool * ?ZSmooth:SmoothAlg * ?Transpose:bool * ?UseWebGL:bool * ?ReverseYAxis:bool * ?UseDefaults:bool -> GenericChart (requires 'a1 :> IConvertible and 'a4 :> IConvertible) + 1 overload ...
static member Chart.Column : keysValues:seq<#System.IConvertible * #System.IConvertible> * ?Name:string * ?ShowLegend:bool * ?Opacity:float * ?MultiOpacity:seq<float> * ?Text:'c * ?MultiText:seq<'c> * ?MarkerColor:Color * ?MarkerColorScale:StyleParam.Colorscale * ?MarkerOutline:Line * ?MarkerPatternShape:StyleParam.PatternShape * ?MultiMarkerPatternShape:seq<StyleParam.PatternShape> * ?MarkerPattern:TraceObjects.Pattern * ?Marker:TraceObjects.Marker * ?Base:#System.IConvertible * ?Width:'e * ?MultiWidth:seq<'e> * ?TextPosition:StyleParam.TextPosition * ?MultiTextPosition:seq<StyleParam.TextPosition> * ?UseDefaults:bool -> GenericChart.GenericChart (requires 'c :> System.IConvertible and 'e :> System.IConvertible)
static member Chart.Column : values:seq<#System.IConvertible> * ?Keys:seq<#System.IConvertible> * ?Name:string * ?ShowLegend:bool * ?Opacity:float * ?MultiOpacity:seq<float> * ?Text:'a2 * ?MultiText:seq<'a2> * ?MarkerColor:Color * ?MarkerColorScale:StyleParam.Colorscale * ?MarkerOutline:Line * ?MarkerPatternShape:StyleParam.PatternShape * ?MultiMarkerPatternShape:seq<StyleParam.PatternShape> * ?MarkerPattern:TraceObjects.Pattern * ?Marker:TraceObjects.Marker * ?Base:#System.IConvertible * ?Width:'a4 * ?MultiWidth:seq<'a4> * ?TextPosition:StyleParam.TextPosition * ?MultiTextPosition:seq<StyleParam.TextPosition> * ?UseDefaults:bool -> GenericChart.GenericChart (requires 'a2 :> System.IConvertible and 'a4 :> System.IConvertible)
static member Chart.withTraceName : ?Name:string * ?ShowLegend:bool * ?LegendGroup:string * ?Visible:StyleParam.Visible -> (GenericChart.GenericChart -> GenericChart.GenericChart)
static member Chart.combine : gCharts:seq<GenericChart.GenericChart> -> GenericChart.GenericChart
module GenericChart from Plotly.NET
<summary> Module to represent a GenericChart </summary>
val toChartHTML : gChart:GenericChart.GenericChart -> string
<summary> Converts a GenericChart to it HTML representation. The div layer has a default size of 600 if not specified otherwise. </summary>
val vs : GenericChart.GenericChart
val vs : (float * float) list
val zip : list1:'T1 list -> list2:'T2 list -> ('T1 * 'T2) list
<summary>Combines the two lists into a list of pairs. The two lists must have equal lengths.</summary>
<param name="list1">The first input list.</param>
<param name="list2">The second input list.</param>
<returns>A single list containing pairs of matching elements from the input lists.</returns>
val fst : tuple:('T1 * 'T2) -> 'T1
<summary>Return the first element of a tuple, <c>fst (a,b) = a</c>.</summary>
<param name="tuple">The input tuple.</param>
<returns>The first value.</returns>
val matching : (float * float) list
val filter : predicate:('T -> bool) -> list:'T list -> 'T list
<summary>Returns a new collection containing only the elements of the collection for which the given predicate returns "true"</summary>
<param name="predicate">The function to test the input elements.</param>
<param name="list">The input list.</param>
<returns>A list containing only the elements that satisfy the predicate.</returns>
val x : float
val y : float
val nonMatching : (float * float) list
val allPossibleMatchups : (float * float) list
val x : float list
val y : float list
val unzip : list:('T1 * 'T2) list -> 'T1 list * 'T2 list
<summary>Splits a list of pairs into two lists.</summary>
<param name="list">The input list.</param>
<returns>Two lists of split elements.</returns>
val i : int
property List.Length: int with get
<summary>Gets the number of items contained in the list</summary>
val j : int
static member Chart.Point : xy:seq<#System.IConvertible * #System.IConvertible> * ?Name:string * ?ShowLegend:bool * ?Opacity:float * ?MultiOpacity:seq<float> * ?Text:'c * ?MultiText:seq<'c> * ?TextPosition:StyleParam.TextPosition * ?MultiTextPosition:seq<StyleParam.TextPosition> * ?MarkerColor:Color * ?MarkerColorScale:StyleParam.Colorscale * ?MarkerOutline:Line * ?MarkerSymbol:StyleParam.MarkerSymbol * ?MultiMarkerSymbol:seq<StyleParam.MarkerSymbol> * ?Marker:TraceObjects.Marker * ?StackGroup:string * ?Orientation:StyleParam.Orientation * ?GroupNorm:StyleParam.GroupNorm * ?UseWebGL:bool * ?UseDefaults:bool -> GenericChart.GenericChart (requires 'c :> System.IConvertible)
static member Chart.Point : x:seq<#System.IConvertible> * y:seq<#System.IConvertible> * ?Name:string * ?ShowLegend:bool * ?Opacity:float * ?MultiOpacity:seq<float> * ?Text:'a2 * ?MultiText:seq<'a2> * ?TextPosition:StyleParam.TextPosition * ?MultiTextPosition:seq<StyleParam.TextPosition> * ?MarkerColor:Color * ?MarkerColorScale:StyleParam.Colorscale * ?MarkerOutline:Line * ?MarkerSymbol:StyleParam.MarkerSymbol * ?MultiMarkerSymbol:seq<StyleParam.MarkerSymbol> * ?Marker:TraceObjects.Marker * ?StackGroup:string * ?Orientation:StyleParam.Orientation * ?GroupNorm:StyleParam.GroupNorm * ?UseWebGL:bool * ?UseDefaults:bool -> GenericChart.GenericChart (requires 'a2 :> System.IConvertible)
static member Chart.withMarkerStyle : ?AutoColorScale:bool * ?CAuto:bool * ?CMax:float * ?CMid:float * ?CMin:float * ?Color:Color * ?Colors:seq<Color> * ?ColorAxis:StyleParam.SubPlotId * ?ColorBar:LayoutObjects.ColorBar * ?Colorscale:StyleParam.Colorscale * ?Gradient:TraceObjects.Gradient * ?Outline:Line * ?Size:int * ?MultiSize:seq<int> * ?Opacity:float * ?MultiOpacity:seq<float> * ?Pattern:TraceObjects.Pattern * ?Symbol:StyleParam.MarkerSymbol * ?MultiSymbols:seq<StyleParam.MarkerSymbol> * ?OutlierColor:Color * ?Maxdisplayed:int * ?ReverseScale:bool * ?ShowScale:bool * ?SizeMin:int * ?SizeMode:StyleParam.MarkerSizeMode * ?SizeRef:int -> (GenericChart.GenericChart -> GenericChart.GenericChart)
module StyleParam from Plotly.NET
type MarkerSymbol = | Modified of MarkerSymbol * SymbolStyle | Circle | Square | Diamond | Cross | X | TriangleUp | TriangleDown | TriangleLeft | TriangleRight ... member Convert : unit -> obj override ToString : unit -> string static member convert : (MarkerSymbol -> obj) static member toInteger : (MarkerSymbol -> int)
union case StyleParam.MarkerSymbol.Cross: StyleParam.MarkerSymbol
Multiple items
module Color from Plotly.NET

--------------------
type Color = private new : obj:obj -> Color override Equals : other:obj -> bool override GetHashCode : unit -> int static member fromARGB : a:int -> r:int -> g:int -> b:int -> Color static member fromColorScaleValues : c:seq<#IConvertible> -> Color static member fromColors : c:seq<Color> -> Color static member fromHex : s:string -> Color static member fromKeyword : c:ColorKeyword -> Color static member fromRGB : r:int -> g:int -> b:int -> Color static member fromString : c:string -> Color ...
<summary> Plotly color can be a single color, a sequence of colors, or a sequence of numeric values referencing the color of the colorscale obj </summary>
static member Color.fromKeyword : c:ColorKeyword -> Color
union case ColorKeyword.Grey: ColorKeyword
union case StyleParam.MarkerSymbol.Circle: StyleParam.MarkerSymbol
union case ColorKeyword.Blue: ColorKeyword
static member Chart.Line : xy:seq<#System.IConvertible * #System.IConvertible> * ?ShowMarkers:bool * ?Name:string * ?ShowLegend:bool * ?Opacity:float * ?MultiOpacity:seq<float> * ?Text:'c * ?MultiText:seq<'c> * ?TextPosition:StyleParam.TextPosition * ?MultiTextPosition:seq<StyleParam.TextPosition> * ?MarkerColor:Color * ?MarkerColorScale:StyleParam.Colorscale * ?MarkerOutline:Line * ?MarkerSymbol:StyleParam.MarkerSymbol * ?MultiMarkerSymbol:seq<StyleParam.MarkerSymbol> * ?Marker:TraceObjects.Marker * ?LineColor:Color * ?LineColorScale:StyleParam.Colorscale * ?LineWidth:float * ?LineDash:StyleParam.DrawingStyle * ?Line:Line * ?StackGroup:string * ?Orientation:StyleParam.Orientation * ?GroupNorm:StyleParam.GroupNorm * ?UseWebGL:bool * ?UseDefaults:bool -> GenericChart.GenericChart (requires 'c :> System.IConvertible)
static member Chart.Line : x:seq<#System.IConvertible> * y:seq<#System.IConvertible> * ?ShowMarkers:bool * ?Name:string * ?ShowLegend:bool * ?Opacity:float * ?MultiOpacity:seq<float> * ?Text:'a2 * ?MultiText:seq<'a2> * ?TextPosition:StyleParam.TextPosition * ?MultiTextPosition:seq<StyleParam.TextPosition> * ?MarkerColor:Color * ?MarkerColorScale:StyleParam.Colorscale * ?MarkerOutline:Line * ?MarkerSymbol:StyleParam.MarkerSymbol * ?MultiMarkerSymbol:seq<StyleParam.MarkerSymbol> * ?Marker:TraceObjects.Marker * ?LineColor:Color * ?LineColorScale:StyleParam.Colorscale * ?LineWidth:float * ?LineDash:StyleParam.DrawingStyle * ?Line:Line * ?StackGroup:string * ?Orientation:StyleParam.Orientation * ?GroupNorm:StyleParam.GroupNorm * ?UseWebGL:bool * ?UseDefaults:bool -> GenericChart.GenericChart (requires 'a2 :> System.IConvertible)
static member Chart.withLineStyle : ?Width:float * ?Color:Color * ?Shape:StyleParam.Shape * ?Dash:StyleParam.DrawingStyle * ?Smoothing:float * ?Colorscale:StyleParam.Colorscale * ?OutlierColor:Color * ?OutlierWidth:float -> (GenericChart.GenericChart -> GenericChart.GenericChart)
type DrawingStyle = | Solid | Dash | Dot | DashDot | User of int member Convert : unit -> obj override ToString : unit -> string static member convert : (DrawingStyle -> obj) static member toString : (DrawingStyle -> string)
<summary> Dash: Sets the drawing style of the lines segments in this trace. Sets the style of the lines. Set to a dash string type or a dash length in px. </summary>
union case StyleParam.DrawingStyle.Dash: StyleParam.DrawingStyle
union case ColorKeyword.DarkGreen: ColorKeyword
union case StyleParam.MarkerSymbol.TriangleUp: StyleParam.MarkerSymbol
union case ColorKeyword.Orange: ColorKeyword
static member Chart.withYAxisStyle : title:string * ?TitleFont:Font * ?MinMax:(float * float) * ?ShowGrid:bool * ?ShowLine:bool * ?Side:StyleParam.Side * ?Overlaying:StyleParam.LinearAxisId * ?Id:StyleParam.SubPlotId * ?Domain:(float * float) * ?Position:float * ?ZeroLine:bool * ?Anchor:StyleParam.LinearAxisId -> (GenericChart.GenericChart -> GenericChart.GenericChart)
static member Chart.withXAxisStyle : title:string * ?TitleFont:Font * ?MinMax:(float * float) * ?ShowGrid:bool * ?ShowLine:bool * ?Side:StyleParam.Side * ?Overlaying:StyleParam.LinearAxisId * ?Id:StyleParam.SubPlotId * ?Domain:(float * float) * ?Position:float * ?Zeroline:bool * ?Anchor:StyleParam.LinearAxisId -> (GenericChart.GenericChart -> GenericChart.GenericChart)
static member Chart.withLegend : showlegend:bool -> (GenericChart.GenericChart -> GenericChart.GenericChart)
static member Chart.withLegend : legend:LayoutObjects.Legend -> (GenericChart.GenericChart -> GenericChart.GenericChart)
val PRTEYINYEE : (float * float) list
val vs2 : GenericChart.GenericChart
val calcBIonFragments : pepSequence:seq<char> -> (float * float) list
val pepSequence : seq<char>
val PRTEIINNEE' : (float * float) list
val PRTEYINNEE' : (float * float) list
val specComp' : GenericChart.GenericChart
type Path = { K: int PathIndices: (int * int) list }
Path.K: int
Multiple items
val int : value:'T -> int (requires member op_Explicit)
<summary>Converts the argument to signed 32-bit integer. This is a direct conversion for all primitive numeric types. For strings, the input is converted using <c>Int32.Parse()</c> with InvariantCulture settings. Otherwise the operation requires an appropriate static conversion method on the input type.</summary>
<param name="value">The input value.</param>
<returns>The converted int</returns>


--------------------
[<Struct>] type int = int32
<summary>An abbreviation for the CLI type <see cref="T:System.Int32" />.</summary>
<category>Basic Types</category>


--------------------
type int<'Measure> = int
<summary>The type of 32-bit signed integer numbers, annotated with a unit of measure. The unit of measure is erased in compiled code and when values of this type are analyzed using reflection. The type is representationally equivalent to <see cref="T:System.Int32" />.</summary>
<category>Basic Types with Units of Measure</category>
Path.PathIndices: (int * int) list
type 'T list = List<'T>
<summary>The type of immutable singly-linked lists. </summary>
<remarks>See the <see cref="T:Microsoft.FSharp.Collections.ListModule" /> module for further operations related to lists. Use the constructors <c>[]</c> and <c>::</c> (infix) to create values of this type, or the notation <c>[1; 2; 3]</c>. Use the values in the <c>List</c> module to manipulate values of this type, or pattern match against the values directly. See also <a href="https://docs.microsoft.com/dotnet/fsharp/language-reference/lists">F# Language Guide - Lists</a>. </remarks>
val findAllPaths : maxK:int -> m:Matrix<float> -> Path list
val maxK : int
val m : Matrix<float>
Multiple items
module Matrix from FSharp.Stats

--------------------
type Matrix<'T> = | DenseRepr of DenseMatrix<'T> | SparseRepr of SparseMatrix<'T> interface IEnumerable interface IEnumerable<'T> interface IStructuralEquatable interface IStructuralComparable interface IComparable override Equals : yobj:obj -> bool override GetHashCode : unit -> int member GetSlice : start1:int option * finish1:int option * start2:int option * finish2:int option -> Matrix<'T> member PermuteColumns : p:permutation -> Matrix<'T> member PermuteRows : p:permutation -> Matrix<'T> ...
Multiple items
val float : value:'T -> float (requires member op_Explicit)
<summary>Converts the argument to 64-bit float. This is a direct conversion for all primitive numeric types. For strings, the input is converted using <c>Double.Parse()</c> with InvariantCulture settings. Otherwise the operation requires an appropriate static conversion method on the input type.</summary>
<param name="value">The input value.</param>
<returns>The converted float</returns>


--------------------
[<Struct>] type float = System.Double
<summary>An abbreviation for the CLI type <see cref="T:System.Double" />.</summary>
<category>Basic Types</category>


--------------------
type float<'Measure> = float
<summary>The type of double-precision floating point numbers, annotated with a unit of measure. The unit of measure is erased in compiled code and when values of this type are analyzed using reflection. The type is representationally equivalent to <see cref="T:System.Double" />.</summary>
<category index="6">Basic Types with Units of Measure</category>
val extendInAllPossibleDirections : (Matrix<float> -> int -> int -> Path -> Path list)
val currentRow : int
val path : Path
val lastRow : int
val lastCol : int
property List.Head: int * int with get
<summary>Gets the first element of the list</summary>
val colinearCol : int
property Matrix.NumCols: int with get
val acc' : (int * int) list
val v : float
val newV : (int * int) list
val newPaths : Path list
val matchingColumn : int
val k' : int
val x : int * int
val y : int * int
val t : (int * int) list
val snd : tuple:('T1 * 'T2) -> 'T2
<summary>Return the second element of a tuple, <c>snd (a,b) = b</c>.</summary>
<param name="tuple">The input tuple.</param>
<returns>The second value.</returns>
val loop : (Path list -> int -> Path list)
val paths : Path list
val currentRowIdx : int
property Matrix.NumRows: int with get
val expandedPaths : Path list
val collect : mapping:('T -> 'U list) -> list:'T list -> 'U list
<summary>For each element of the list, applies the given function. Concatenates all the results and return the combined list.</summary>
<param name="mapping">The function to transform each input element into a sublist to be concatenated.</param>
<param name="list">The input list.</param>
<returns>The concatenation of the transformed sublists.</returns>
val calcSimilarityAt_simple : k:int -> specA:int [] -> specB:int [] -> int
val k : int
val specA : int []
val specB : int []
val n : int
namespace System
type Math = static member Abs : value: decimal -> decimal + 6 overloads static member Acos : d: float -> float static member Acosh : d: float -> float static member Asin : d: float -> float static member Asinh : d: float -> float static member Atan : d: float -> float static member Atan2 : y: float * x: float -> float static member Atanh : d: float -> float static member BigMul : a: int * b: int -> int64 + 2 overloads static member BitDecrement : x: float -> float ...
<summary>Provides constants and static methods for trigonometric, logarithmic, and other common mathematical functions.</summary>
System.Math.Max(val1: uint64, val2: uint64) : uint64
   (+0 other overloads)
System.Math.Max(val1: uint32, val2: uint32) : uint32
   (+0 other overloads)
System.Math.Max(val1: uint16, val2: uint16) : uint16
   (+0 other overloads)
System.Math.Max(val1: float32, val2: float32) : float32
   (+0 other overloads)
System.Math.Max(val1: sbyte, val2: sbyte) : sbyte
   (+0 other overloads)
System.Math.Max(val1: int64, val2: int64) : int64
   (+0 other overloads)
System.Math.Max(val1: int, val2: int) : int
   (+0 other overloads)
System.Math.Max(val1: int16, val2: int16) : int16
   (+0 other overloads)
System.Math.Max(val1: float, val2: float) : float
   (+0 other overloads)
System.Math.Max(val1: decimal, val2: decimal) : decimal
   (+0 other overloads)
Multiple items
module Array from FSharp.Stats
<summary> Module to compute common statistical measure on array </summary>

--------------------
module Array from FSharpAux

--------------------
module Array from Microsoft.FSharp.Collections
<summary>Contains operations for working with arrays.</summary>
<remarks> See also <a href="https://docs.microsoft.com/dotnet/fsharp/language-reference/arrays">F# Language Guide - Arrays</a>. </remarks>
val max : array:'T [] -> 'T (requires comparison)
<summary>Returns the greatest of all elements of the array, compared via Operators.max on the function result.</summary>
<remarks>Throws ArgumentException for empty arrays.</remarks>
<param name="array">The input array.</param>
<exception cref="T:System.ArgumentNullException">Thrown when the input array is null.</exception>
<exception cref="T:System.ArgumentException">Thrown when the input array is empty.</exception>
<returns>The maximum element.</returns>
val vecA : Vector<float>
val tmp : Vector<float>
Multiple items
module Vector from FSharp.Stats
<summary> Basic vector operations </summary>

--------------------
type Vector<'T> = interface IEnumerable interface IEnumerable<'T> interface IStructuralEquatable interface IStructuralComparable interface IComparable new : opsV:INumeric<'T> option * arrV:'T array -> Vector<'T> override Equals : yobj:obj -> bool override GetHashCode : unit -> int member GetSlice : start:int option * finish:int option -> Vector<'T> member Permute : p:permutation -> Vector<'T> ...

--------------------
new : opsV:INumeric<'T> option * arrV:'T array -> Vector<'T>
val create : count:int -> value:float -> Vector<float>
<summary> Creates vector of length count and fills it with value </summary>
val iter : action:('T -> unit) -> array:'T [] -> unit
<summary>Applies the given function to each element of the array.</summary>
<param name="action">The function to apply.</param>
<param name="array">The input array.</param>
<exception cref="T:System.ArgumentNullException">Thrown when the input array is null.</exception>
val p : int
val vecB : Vector<float>
property Vector.Transpose: RowVector<float> with get
val longestPath : Path
val maxBy : projection:('T -> 'U) -> list:'T list -> 'T (requires comparison)
<summary>Returns the greatest of all elements of the list, compared via Operators.max on the function result.</summary>
<remarks>Raises <see cref="T:System.ArgumentException" /> if <c>list</c> is empty.</remarks>
<param name="projection">The function to transform the list elements into the type to be compared.</param>
<param name="list">The input list.</param>
<exception cref="T:System.ArgumentException">Thrown when the list is empty.</exception>
<returns>The maximum element.</returns>
val p : Path
val sa : int []
val sb : int []
val sc : int []
val D_1_sa_sb : int
val D_1_sa_sc : int
val sd : int []
val se : int []
val D_1_sd_se : int
val D_2_sd_se : int