예제 #1
0
        private UMCLight GetUMC(LcMsFeature lcmsFeature)
        {
            UMCLight umc;

            if (lcmsFeature.FeatureId == 0)
            {   // Promex clusterer added a new noise feature (filled in missing data for a cluster.
                umc = new UMCLight
                {
                    GroupId                 = lcmsFeature.DataSetId,
                    Id                      = ++this.maxFeatureId,
                    Abundance               = lcmsFeature.Abundance,
                    AbundanceSum            = lcmsFeature.Abundance,
                    Net                     = (lcmsFeature.MinNet + lcmsFeature.MaxNet) / 2,
                    NetStart                = lcmsFeature.MinNet,
                    NetEnd                  = lcmsFeature.MaxNet,
                    ChargeState             = (lcmsFeature.MinCharge + lcmsFeature.MaxCharge) / 2,
                    MinCharge               = lcmsFeature.MinCharge,
                    MaxCharge               = lcmsFeature.MaxCharge,
                    MassMonoisotopic        = lcmsFeature.Mass,
                    MassMonoisotopicAligned = lcmsFeature.Mass,
                };
            }
            else
            {   // Clustered existing feature.
                var key = new Tuple <int, int>(this.promexToMultiAlignDatasetIdMap[lcmsFeature.DataSetId], lcmsFeature.FeatureId);
                umc = this.featureMap[key];
            }

            return(umc);
        }
예제 #2
0
        /*
         * public static List<LcMsFeature> LoadProMexResult(string featureFilePath)
         * {
         *  return LoadProMexResult(0, featureFilePath);
         * }
         */

        public static List <LcMsFeature> LoadProMexResult(int dataId, string featureFilePath, LcMsRun run, double minMass = 2000, double maxMass = 50000)
        {
            var featureList = new List <LcMsFeature>();
            var tsvReader   = new TsvFileParser(featureFilePath);
            //var run = (rawFilePath == null || !File.Exists(rawFilePath)) ? null : PbfLcMsRun.GetLcMsRun(rawFilePath);
            var featureIds = tsvReader.GetData("FeatureID");

            var minScans = tsvReader.GetData("MinScan");
            var maxScans = tsvReader.GetData("MaxScan");
            var abu      = tsvReader.GetData("Abundance");

            var minCharges = tsvReader.GetData("MinCharge");
            var maxCharges = tsvReader.GetData("MaxCharge");
            var monoMass   = tsvReader.GetData("MonoMass");

            var minElutionTime = tsvReader.GetData("MinElutionTime");
            var maxElutionTime = tsvReader.GetData("MaxElutionTime");

            var repCharges = tsvReader.GetData("RepCharge");
            var repScans   = tsvReader.GetData("RepScan");
            var repMzs     = tsvReader.GetData("RepMz");
            var scores     = tsvReader.GetData("LikelihoodRatio");

            for (var i = 0; i < tsvReader.NumData; i++)
            {
                var abundance = double.Parse(abu[i]);
                var repMass   = double.Parse(monoMass[i]);
                if (repMass < minMass || repMass > maxMass)
                {
                    continue;
                }

                var minCharge = int.Parse(minCharges[i]);
                var maxCharge = int.Parse(maxCharges[i]);
                var minScan   = int.Parse(minScans[i]);
                var maxScan   = int.Parse(maxScans[i]);
                var fid       = int.Parse(featureIds[i]);

                var repCharge  = (repCharges != null) ? int.Parse(repCharges[i]) : (int)Math.Round(0.5 * (minCharge + maxCharge));
                var repMz      = (repMzs != null) ? double.Parse(repMzs[i]) : (repMass / repCharge) + Constants.Proton;
                var repScanNum = (repScans != null) ? int.Parse(repScans[i]) : minScan;
                var score      = (scores != null) ? double.Parse(scores[i]) : 0;

                var minEt   = double.Parse(minElutionTime[i]);
                var maxEt   = double.Parse(maxElutionTime[i]);
                var minNet  = minEt / run.GetElutionTime(run.MaxLcScan);
                var maxNet  = maxEt / run.GetElutionTime(run.MaxLcScan);
                var feature = new LcMsFeature(repMass, repCharge, repMz, repScanNum, abundance, minCharge, maxCharge, minScan, maxScan, minEt, maxEt, minNet, maxNet)
                {
                    FeatureId = fid,
                    DataSetId = dataId,
                    Score     = score,
                };

                featureList.Add(feature);
            }

            return(featureList);
        }
예제 #3
0
        private double NetDiff(LcMsFeature f1, LcMsFeature f2)
        {
            var n1 = Math.Abs(f1.Net - f2.Net);

            return(n1);
            //var n2 = Math.Abs(f1.MinNet - f2.MinNet);
            //var n3 = Math.Abs(f1.MaxNet - f2.MaxNet);
            //return Math.Min(Math.Min(n1, n2), n3);
        }
예제 #4
0
        private List <LcMsFeature[]> GroupFeatures(List <LcMsFeature> features)
        {
            var adjList = new List <int> [features.Count];

            for (var i = 0; i < features.Count; i++)
            {
                adjList[i] = new List <int>();
            }
            for (var i = 0; i < features.Count; i++)
            {
                var fi = features[i];

                for (var j = i + 1; j < features.Count; j++)
                {
                    var fj = features[j];
                    if (fj.Mass - fi.Mass > 1.5)
                    {
                        break;
                    }
                    if (_featureCompare.SameCluster(fi, fj))
                    {
                        adjList[i].Add(j);
                        adjList[j].Add(i);
                    }
                }
            }

            var ret        = new List <LcMsFeature[]>();
            var components = GetConnectedComponents(adjList);

            for (var i = 0; i < components.Count; i++)
            {
                var component = new HashSet <int>(components[i]);
                while (component.Count > 0)
                {
                    var featureGroup = new LcMsFeature[CountDatasets];
                    var featureSet   = GetAlignedFeatures(ref component, adjList);
                    foreach (var f in featureSet)
                    {
                        featureGroup[f.DataSetId] = f;
                    }
                    ret.Add(featureGroup);
                }
            }

            return(ret);
        }
예제 #5
0
        /// <summary>
        /// Converts a <see cref="LcMsFeature"/> to a <see cref="Ms1FtEntry"/>
        /// </summary>
        /// <param name="feature"></param>
        /// <returns></returns>
        public static Ms1FtEntry ToMs1FtEntry(this LcMsFeature feature, int featureId = 0)
        {
            var ms1FtEntry = new Ms1FtEntry
            {
                FeatureId            = featureId,
                MinScan              = feature.MinScanNum,
                MaxScan              = feature.MaxScanNum,
                MinCharge            = feature.MinCharge,
                MaxCharge            = feature.MaxCharge,
                MonoMass             = feature.RepresentativeMass,
                RepresentativeScan   = feature.RepresentativeScanNum,
                RepresentativeCharge = feature.RepresentativeCharge,
                RepresentativeMz     = feature.RepresentativeMz,
                Abundance            = feature.Abundance,
                MinElutionTime       = feature.MinElutionTime,
                MaxElutionTime       = feature.MaxElutionTime,
                ElutionLength        = feature.ElutionLength,
                LikelihoodRatio      = feature.Score
            };

            return(ms1FtEntry);
        }
예제 #6
0
        /// <summary>
        /// Converts a <see cref="Ms1FtEntry"/> to a <see cref="LcMsFeature"/>
        /// </summary>
        /// <param name="ms1FtEntry"></param>
        /// <param name="totalDatasetRunTime">The total runtime of the dataset; generally the elution time of the last scan. Used to compute NET</param>
        /// <returns></returns>
        public static LcMsFeature ToLcMsFeature(this Ms1FtEntry ms1FtEntry, double totalDatasetRunTime = 0)
        {
            var repCharge  = ms1FtEntry.RepresentativeCharge != 0 ? ms1FtEntry.RepresentativeCharge : (int)Math.Round(0.5 * (ms1FtEntry.MinCharge + ms1FtEntry.MaxCharge));
            var repMz      = !ms1FtEntry.RepresentativeMz.Equals(0) ? ms1FtEntry.RepresentativeMz : (ms1FtEntry.MonoMass / repCharge) + Constants.Proton;
            var repScanNum = ms1FtEntry.RepresentativeScan > 0 ? ms1FtEntry.RepresentativeScan : ms1FtEntry.MinScan;

            var minNet = 0.0;
            var maxNet = 0.0;

            if (totalDatasetRunTime > 0)
            {
                minNet = ms1FtEntry.MinElutionTime / totalDatasetRunTime;
                maxNet = ms1FtEntry.MaxElutionTime / totalDatasetRunTime;
            }

            var feature = new LcMsFeature(ms1FtEntry.MonoMass, repCharge, repMz, repScanNum, ms1FtEntry.Abundance, ms1FtEntry.MinCharge, ms1FtEntry.MaxCharge, ms1FtEntry.MinScan, ms1FtEntry.MaxScan, ms1FtEntry.MinElutionTime, ms1FtEntry.MaxElutionTime, minNet, maxNet)
            {
                FeatureId = ms1FtEntry.FeatureId,
                Score     = ms1FtEntry.LikelihoodRatio,
            };

            return(feature);
        }
예제 #7
0
        public static string GetString(LcMsFeature feature)
        {
            // should be called after calling UpdateScore & UpdateAbundance
            var sb = new StringBuilder(string.Format("{0}\t{1}\t{2}\t{3}\t{4:0.0000}\t{5}\t{6}\t{7:0.0000}\t{8:0.00}",
                                                     feature.MinScanNum, feature.MaxScanNum,
                                                     feature.MinCharge, feature.MaxCharge,
                                                     feature.RepresentativeMass,
                                                     feature.RepresentativeScanNum,
                                                     feature.RepresentativeCharge,
                                                     feature.RepresentativeMz,
                                                     feature.Abundance));

            sb.AppendFormat("\t{0:0}", 0);
            sb.AppendFormat("\t{0:0.00}", 0);

            sb.AppendFormat("\t{0:0.0}", feature.MinElutionTime);
            sb.AppendFormat("\t{0:0.0}", feature.MaxElutionTime);
            sb.AppendFormat("\t{0:0.0}", feature.ElutionLength);

            sb.Append("\t");
            sb.Append("");
            sb.Append(string.Format("\t{0:0.0}", feature.Score));
            return(sb.ToString());
        }
예제 #8
0
 public ProteinSpectrumMatch FindByFeature(LcMsFeature feature, Tolerance tolerance)
 {
     return(FindByFeature(feature.Mass, feature.MinScanNum, feature.MaxScanNum, tolerance));
 }