From 39ef87c2e64e3856375f47edd62aad399b08cc17 Mon Sep 17 00:00:00 2001 From: Marina Pauw Date: Tue, 15 Oct 2019 07:13:00 +0200 Subject: [PATCH 1/2] Full width at five percent maximum height calculation added. This calculation can be used in peak symmetry measurements. --- CrawdadSharp/CrawPeakAnnotator.cs | 46 +++++++++++++++++++++++++++++++ CrawdadSharp/CrawdadPeak.cs | 2 ++ CrawdadSharp/CrawdadPeakFinder.cs | 28 ++++++++++++++++++- CrawdadSharp/SlimCrawPeak.cs | 1 + 4 files changed, 76 insertions(+), 1 deletion(-) diff --git a/CrawdadSharp/CrawPeakAnnotator.cs b/CrawdadSharp/CrawPeakAnnotator.cs index 2244572..c428e42 100644 --- a/CrawdadSharp/CrawPeakAnnotator.cs +++ b/CrawdadSharp/CrawPeakAnnotator.cs @@ -364,6 +364,52 @@ public void calc_fwhm(SlimCrawPeak peak) peak.fwhm = rh_hm - lh_hm; } + public void calc_fwfpcnt(SlimCrawPeak peak) + { + float[] chrom = active_chrom; + float lh_height = chrom[peak.start_rt_idx]; + float rh_height = chrom[peak.stop_rt_idx]; + float height = peak.raw_height - Math.Min(lh_height, rh_height); + float fpct_max = (float)(peak.raw_height - (height / 100 * 95)); + int lh_pt = -1, rh_pt = -1; + float lh_hm, rh_hm; + for (int i = peak.start_rt_idx; i < peak.peak_rt_idx; i++) + { + if (chrom[i] <= fpct_max && chrom[i + 1] >= fpct_max) + { + lh_pt = i; + break; + } + } + for (int i = peak.peak_rt_idx; i < Math.Min(peak.stop_rt_idx, chrom.Length - 2); i++) + { + if (chrom[i] >= fpct_max && chrom[i + 1] <= fpct_max) + { + rh_pt = i; + break; + } + } + + if (lh_pt == -1) + { + lh_hm = peak.start_rt_idx; + } + else + { + float frac_delta = (fpct_max - chrom[lh_pt]) / (chrom[lh_pt + 1] - chrom[lh_pt]); + lh_hm = lh_pt + frac_delta; + } + if (rh_pt == -1) + { + rh_hm = peak.stop_rt_idx; + } + else + { + float frac_delta = (chrom[rh_pt] - fpct_max) / (chrom[rh_pt] - chrom[rh_pt + 1]); + rh_hm = rh_pt + frac_delta; + } + peak.fwfpct = rh_hm - lh_hm; + } public void refind_peak_peak(SlimCrawPeak peak) { peak.peak_rt_idx = get_peakloc_in_range(peak.start_rt_idx, peak.stop_rt_idx); diff --git a/CrawdadSharp/CrawdadPeak.cs b/CrawdadSharp/CrawdadPeak.cs index af6f5b9..99e7a5d 100644 --- a/CrawdadSharp/CrawdadPeak.cs +++ b/CrawdadSharp/CrawdadPeak.cs @@ -18,6 +18,7 @@ public CrawdadPeak(SlimCrawPeak crawPeak) BackgroundArea = Math.Max(0.0f, crawPeak.bg_area); Fwhm = crawPeak.fwhm; FwhmDegenerate = !crawPeak.fwhm_calculated_ok; + Fwfpct = crawPeak.fwfpct; } public int TimeIndex { get; } @@ -29,6 +30,7 @@ public CrawdadPeak(SlimCrawPeak crawPeak) public float BackgroundArea { get; } public float Height { get; } public float Fwhm { get; } + public float Fwfpct { get; } public bool FwhmDegenerate { get; } public bool IsIdentified(IEnumerable idIndices) diff --git a/CrawdadSharp/CrawdadPeakFinder.cs b/CrawdadSharp/CrawdadPeakFinder.cs index da55449..4b7a13f 100644 --- a/CrawdadSharp/CrawdadPeakFinder.cs +++ b/CrawdadSharp/CrawdadPeakFinder.cs @@ -130,7 +130,33 @@ void SetChromatogram(float[] intensities, int maxIntensityIndex, double baseline } FullWidthHalfMax = fwhm; - _widthDataWings = (int)(FullWidthHalfMax * 2); + int fwfpcnt = 0; + if (maxIntensityIndex != -1) + { + double fpcntHeight = (intensities[maxIntensityIndex] - baselineIntensity) / 20 + baselineIntensity; + int iBeginning = 0; + for (int i = maxIntensityIndex - 1; i >= 0; i--) + { + if (intensities[i] < fpcntHeight) + { + iBeginning = i; + break; + } + } + int len = intensities.Length; + int iTail = len - 1; + for (int i = maxIntensityIndex + 1; i < len; i++) + { + if (intensities[i] < fpcntHeight) + { + iTail = i; + break; + } + } + fwfpcnt = Math.Max(fwfpcnt, iTail - iBeginning); + } + + _widthDataWings = (int)(FullWidthHalfMax * 2); if (_widthDataWings > 0) { diff --git a/CrawdadSharp/SlimCrawPeak.cs b/CrawdadSharp/SlimCrawPeak.cs index a5ea869..5deddf8 100644 --- a/CrawdadSharp/SlimCrawPeak.cs +++ b/CrawdadSharp/SlimCrawPeak.cs @@ -7,6 +7,7 @@ public class SlimCrawPeak public int len; public float fwhm; public bool fwhm_calculated_ok; + public float fwfpct; public float bg_area; public float raw_area; // total area under the curve, including background public float peak_area; From 9fe994529e596e0c4e3ffb5914263f0b13788227 Mon Sep 17 00:00:00 2001 From: Marina Pauw Date: Mon, 21 Oct 2019 18:33:22 +0200 Subject: [PATCH 2/2] Corrected missing link between Peaksymmetry and CrawDad output Peaksymmetry did not get transferred to the crawPeak and therefore translated back to default (0) within SwaMe. --- CrawdadSharp/CrawPeakAnnotator.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/CrawdadSharp/CrawPeakAnnotator.cs b/CrawdadSharp/CrawPeakAnnotator.cs index c428e42..200ed80 100644 --- a/CrawdadSharp/CrawPeakAnnotator.cs +++ b/CrawdadSharp/CrawPeakAnnotator.cs @@ -28,6 +28,7 @@ void peak_annotate(SlimCrawPeak peak) //calls set_peak_areas onpeak member variables set_peak_bg_subtracted_area(peak); calc_fwhm(peak); + calc_fwfpcnt(peak); } int calc_len(int start_rt_idx, int stop_rt_idx) => stop_rt_idx - start_rt_idx + 1;