diff --git a/RawTools.sln b/RawTools.sln index 7b9a027..4bd8e3d 100644 --- a/RawTools.sln +++ b/RawTools.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30621.155 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.33424.131 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RawTools", "RawTools\RawTools.csproj", "{A9BF3DB6-A6E6-4324-AA7A-625639C17E64}" EndProject @@ -31,8 +31,8 @@ Global {A9BF3DB6-A6E6-4324-AA7A-625639C17E64}.Debug|Any CPU.Build.0 = Debug|x64 {A9BF3DB6-A6E6-4324-AA7A-625639C17E64}.Debug|x64.ActiveCfg = Debug|x64 {A9BF3DB6-A6E6-4324-AA7A-625639C17E64}.Debug|x64.Build.0 = Debug|x64 - {A9BF3DB6-A6E6-4324-AA7A-625639C17E64}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A9BF3DB6-A6E6-4324-AA7A-625639C17E64}.Release|Any CPU.Build.0 = Release|Any CPU + {A9BF3DB6-A6E6-4324-AA7A-625639C17E64}.Release|Any CPU.ActiveCfg = Release|x64 + {A9BF3DB6-A6E6-4324-AA7A-625639C17E64}.Release|Any CPU.Build.0 = Release|x64 {A9BF3DB6-A6E6-4324-AA7A-625639C17E64}.Release|x64.ActiveCfg = Release|x64 {A9BF3DB6-A6E6-4324-AA7A-625639C17E64}.Release|x64.Build.0 = Release|x64 {BFF243DD-CEB4-489C-9726-9E5A6E9EB9AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU diff --git a/RawTools/Algorithms/PrecursorPeaks.cs b/RawTools/Algorithms/PrecursorPeaks.cs index 9fba88b..79579f9 100644 --- a/RawTools/Algorithms/PrecursorPeaks.cs +++ b/RawTools/Algorithms/PrecursorPeaks.cs @@ -60,7 +60,7 @@ private static PrecursorPeakData OnePeak(CentroidStreamCollection centroids, Ret List profileTimes = new List(); List profileIntensities = new List(); - double[] masses, intensities, massDiff; + double[] masses, intensities; Dictionary indexedIntensities = new Dictionary(); @@ -78,15 +78,17 @@ private static PrecursorPeakData OnePeak(CentroidStreamCollection centroids, Ret return peak; } - massDiff = new double[masses.Length]; + minMassDiff = Double.PositiveInfinity; for (int i = 0; i < masses.Length; i++) { - massDiff[i] = Math.Abs(masses[i] - targetMass); + var massDiff = Math.Min(minMassDiff, Math.Abs(masses[i] - targetMass)); + if(massDiff < minMassDiff) + { + minMassDiff = massDiff; + } } - minMassDiff = massDiff.Min(); - if (minMassDiff / targetMass * 1e6 < 10) { peak.PeakFound = true; @@ -106,20 +108,24 @@ private static PrecursorPeakData OnePeak(CentroidStreamCollection centroids, Ret masses = centroids[currentScan].Masses; intensities = centroids[currentScan].Intensities; - massDiff = new double[masses.Length]; + minMassDiff = Double.PositiveInfinity; + int minMassDiffIndex = -1; for (int i = 0; i < masses.Length; i++) { - massDiff[i] = Math.Abs(masses[i] - targetMass); + var massDiff = Math.Abs(masses[i] - targetMass); + if(massDiff < minMassDiff) + { + minMassDiff = massDiff; + minMassDiffIndex = i; + } } - minMassDiff = massDiff.Min(); - if (minMassDiff / targetMass * 1e6 < 10) { scans.Add(currentScan); scanIndex -= 1; - indexedIntensities.Add(currentScan, intensities[Array.IndexOf(massDiff, minMassDiff)]); + indexedIntensities.Add(currentScan, intensities[minMassDiffIndex]); if (scanIndex < 0) { previousMS1scan = currentScan; @@ -157,20 +163,24 @@ private static PrecursorPeakData OnePeak(CentroidStreamCollection centroids, Ret masses = centroids[currentScan].Masses; intensities = centroids[currentScan].Intensities; - massDiff = new double[masses.Length]; + minMassDiff = Double.PositiveInfinity; + int minMassDiffIndex = -1; for (int i = 0; i < masses.Length; i++) { - massDiff[i] = Math.Abs(masses[i] - targetMass); + double massDiff = Math.Abs(masses[i] - targetMass); + if (massDiff < minMassDiff) + { + minMassDiff = massDiff; + minMassDiffIndex = i; + } } - minMassDiff = massDiff.Min(); - if (minMassDiff / targetMass * 1e6 < 10) { scans.Add(currentScan); scanIndex += 1; - indexedIntensities.Add(currentScan, intensities[Array.IndexOf(massDiff, minMassDiff)]); + indexedIntensities.Add(currentScan, intensities[minMassDiffIndex]); if (scanIndex >= MS1Scans.Length) { nextMS1scan = currentScan; diff --git a/RawTools/App.config b/RawTools/App.config index f31e48d..57c5dec 100644 --- a/RawTools/App.config +++ b/RawTools/App.config @@ -1,7 +1,7 @@  - + diff --git a/RawTools/ArgumentParser.cs b/RawTools/ArgumentParser.cs index d465cd1..43dc5f6 100644 --- a/RawTools/ArgumentParser.cs +++ b/RawTools/ArgumentParser.cs @@ -16,193 +16,197 @@ // any third-party libraries ditributed with RawTools. All third party // licenses are provided in accompanying files as outline in the NOTICE. +using System; using System.Collections.Generic; -using CLParser; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security.Cryptography.X509Certificates; +using System.Xml.Linq; +using CommandLine; +using CommandLine.Text; +using ThermoFisher.CommonCore.Data; namespace RawTools.ArgumentParser { - static class ParserForRawTools + public class Options { - public static ClParser Create() - { - ClParser parser = new ClParser("Welcome to the main page for RawTools version 2.0.4! RawTools is an " + - "open-source and freely available package designed to perform scan data parsing and quantification, " + - "and quality control analysis of Thermo Orbitrap raw mass spectrometer files. RawTools uses the " + - "Thermo RawFileReader library (Copyright © 2016 by Thermo Fisher Scientific, Inc. All rights reserved). " + - "RawTools is fully compatible with Windows, Linux, and MacOS operating systems."); - - parser.Add(new Argument(name: "RawFiles", shortArgument: "-f", longArgument: "-files", required: false, - typeOf: typeof(List), allowList: true, - helpText: "Indicates input file(s) to be processed, separated by a space if there are multiple files. " + - "Must be Thermo .raw files. You must use either -f or -d to indicate the file(s) to process.")); - - parser.Add(new Argument(name: "RawFileDirectory", shortArgument: "-d", longArgument: "-directory", required: false, - typeOf: typeof(string), - helpText: "Indicates directory to be processed. Files other than .raw files will be ignored. " + - "You must use either -d or -f to indicate the file(s) to process.")); - - parser.Add(new Argument(name: "SearchSubdirectories", shortArgument: "-s", longArgument: "-searchsubdirectories", required: false, - typeOf: typeof(bool), - helpText: "Indicate that, in addition to the directory specified by -d, search all subdirectories for .raw files.")); - - parser.Add(new Argument(name: "QcDirectory", shortArgument: "-qc", longArgument: "-qcdirectory", required: false, - typeOf: typeof(string), - helpText: "Indicates you want to perform QC. Must be followed by the tath to the directory containing " + - "(or to contain) the QC data file (called QC.xml).")); - - parser.Add(new Argument(name: "Parse", shortArgument: "-p", longArgument: "-parse", required: false, - typeOf: typeof(bool), - helpText: "Parses raw file meta and scan data and writes the output to a tab-delimited text file. " + + [Option('f', "files", Required = false, HelpText = + "Indicates input file(s) to be processed, separated by a space if there are multiple files. " + + "Must be Thermo .raw files. You must use either -f or -d to indicate the file(s) to process.")] + public IEnumerable RawFiles { get; set; } + + [Option('d', "directory", Required = false, HelpText = + "Indicates directory to be processed. Files other than .raw files will be ignored. " + + "You must use either -d or -f to indicate the file(s) to process.")] + public string RawFileDirectory { get; set; } + + [Option('s', "searchsubdirectories", Required = false, + HelpText = "Indicate that, in addition to the directory specified by -d, search all subdirectories for .raw files.")] + public bool SearchSubdirectories { get; set; } + + [Option("qcdirectory", Required = false, + HelpText = "Indicates you want to perform QC. Must be followed by the tath to the directory containing " + + "(or to contain) the QC data file (called QC.xml).")] + public string QcDirectory { get; set; } + + [Option('p', "parse", Required = false, + HelpText = "Parses raw file meta and scan data and writes the output to a tab-delimited text file. " + "Typically either this output or the quant output (-q) is used unless your aim is to simply create an MGF " + - "or to observe broad metrics using -x.")); - - parser.Add(new Argument(name: "Quant", shortArgument: "-q", longArgument: "-quant", required: false, - typeOf: typeof(bool), - helpText: "Similar to parse (-p), but also quantifies reporter ions and write results to output matrix. " + - "Use of this flag requires you also specify the reagents used for isobaric labeling with the -r argument (e.g. -r TMT10)")); - - parser.Add(new Argument(name: "LabelingReagent", shortArgument: "-r", longArgument: "-labellingreagent", required: false, - typeOf: typeof(string), - helpText: "Required for reporter ion quantification. Reagents used to label peptides, required if using quant option. " + - "Available options are: {TMT0, TMT2, TMT6, TMT10, TMT11, TMT16, TMT18, iTRAQ4, iTRAQ8}.")); - - parser.Add(new Argument(name: "UnlabeledQuant", shortArgument: "-u", longArgument: "-unlabeledquant", required: false, - typeOf: typeof(bool), - helpText: "Calculate areas of precursor peaks and writes them to the parse or quant file " + - "(ParentPeakArea column). This option is to be used in combination with -p or -q.")); - - parser.Add(new Argument(name: "WriteMGF", shortArgument: "-m", longArgument: "-mgf", required: false, - typeOf: typeof(bool), - helpText: "Writes a standard MGF file. To specify a mass cutoff use the -c argument.")); - - parser.Add(new Argument(name: "WriteMgfLevels", shortArgument: "-ml", longArgument: "-mgfLevels", required: false, - typeOf: typeof(string), - helpText: "Writes a standard MGF file for different scan levels. Should be in the format \"-mgfLevels [levels]\", " + - "where levels is the MS level (or a combination of levels). For example, to output MS2 and MS3 scans, you would " + - "invoke the command \"-mgfLevels 23\". Currently, only MS levels 1, 2, and 3 are supported.")); - - parser.Add(new Argument(name: "FaimsMgf", shortArgument: "-faimsMgf", longArgument: "-faimsMgf", required: false, - typeOf: typeof(bool), - helpText: "Writes an MGF for each FAIMS CV detected in the file.")); - - parser.Add(new Argument(name: "MgfMassCutoff", shortArgument: "-c", longArgument: "-masscutoff", required: false, - typeOf: typeof(float), - helpText: "Specify a mass cutoff to be applied when generating MGF files. " + - "May be of use if removal of reporter ions is desired prior to searching of MS2 spectra. Default is 0.")); - - parser.Add(new Argument(name: "OutputDirectory", shortArgument: "-o", longArgument: "-out", required: false, - typeOf: typeof(string), - helpText: "The directory in which to write output. Can be a relative or absolute path to the directory. If it is a relative path it will be placed inside " + - "the directory containing the respective raw file. Note that relative paths should not start with a slash. If this is left blank, the directory where the raw file is stored will " + - "be used by default.")); - - parser.Add(new Argument(name: "Metrics", shortArgument: "-x", longArgument: "-metrics", required: false, - typeOf: typeof(bool), - helpText: "Write a text file containing general metrics about the MS run.")); - - parser.Add(new Argument(name: "AllScanData", shortArgument: "-asd", longArgument: "-allScanData", required: false, - typeOf: typeof(bool), - helpText: "Write a text file containing all scan data acquired in the MS run. Currently, this only outputs" + - "MS1 data to the text file. Depending on the size of your raw file, this will generate a large output and can be slow.")); - - parser.Add(new Argument(name: "Chromatogram", shortArgument: "-chro", longArgument: "-chromatograms", required: false, - typeOf: typeof(string), - helpText: "Write a chromatogram to disk. Should be in the format \"-chro [order][type]\", where order " + - "is the MS order (or a combination of orders) and type is T, B, or TB (TIC, base peak and both, respectively). " + - "For example, to generate MS1 and MS2 TIC and base peak chromatograms, invoke \"-chro 12TB\". Or, to generate a MS2 TIC, " + - "invoke \"-chro 2T\".")); - - parser.Add(new Argument(name: "Xic", shortArgument: "-xic", longArgument: "-xic", required: false, - typeOf: typeof(string), - helpText: "Provide a mass value to write an extraction ion chromatrogram from MS1 data. The values should be provided " + - "in a comma delimited format (e.g. 500,10) for mass,tolerance. The tolerance value is treated as a window around the " + - "given mass value.")); - - parser.Add(new Argument(name: "RefineMassCharge", shortArgument: "-R", longArgument: "-refinemasscharge", required: false, - typeOf: typeof(bool), - helpText: "Refine precursor charge and monoisotopic mass assignments. Highly recommended if " + - "monoisotopic precursor selection was turned off in the instrument method (or peptide match on a QE instrument).")); - - parser.Add(new Argument(name: "MinCharge", shortArgument: "-min", longArgument: "-mincharge", required: false, - typeOf: typeof(int), - defaultValue: 2, - helpText: "The minimum charge to consider when refining precursor mass and charge.")); - - parser.Add(new Argument(name: "MaxCharge", shortArgument: "-max", longArgument: "-maxcharge", required: false, - typeOf: typeof(int), - defaultValue: 4, - helpText: "The maximum charge to consider when refining precursor mass and charge.")); - - parser.Add(new Argument(name: "FastaDB", shortArgument: "-db", longArgument: "-fastadb", required: false, - typeOf: typeof(string), - helpText: "Required for an X! Tandem search during QC. Path to a fasta protein database.")); - - parser.Add(new Argument(name: "FixedModifications", shortArgument: "-fmods", longArgument: "-fixedmods", required: false, - typeOf: typeof(string), - helpText: "Fixed modifications to pass to the search, if desired. Use mass@aminoacid1,mass@aminoacid2 format. " + - "It is important that the values are separated with a comma and not spaces. Invoke \">RawTools -modifications\" " + - "to see examples of some common modifications")); - - parser.Add(new Argument(name: "VariableModifications", shortArgument: "-vmods", longArgument: "-variablemods", required: false, - typeOf: typeof(string), - helpText: "Variable modifications to pass to the search, if desired. Use mass@aminoacid1,mass@aminoacid2 format. " + - "It is important that the values are separated with a comma and not spaces. Invoke \">RawTools -modifications\" " + - "to see examples of some common modifications")); - - parser.Add(new Argument(name: "XTandemDirectory", shortArgument: "-X", longArgument: "-xtandem", required: false, - typeOf: typeof(string), - helpText: "Specify the path to the X! Tandem directory (the directory containing \"tandem.exe\") if you want " + - "to run a database search as part of QC.")); - - parser.Add(new Argument(name: "NumberSpectra", shortArgument: "-N", longArgument: "-numberspectra", required: false, - typeOf: typeof(int), - defaultValue: 3000, - helpText: "The number of MS2 spectra to be passes to the search engine as an MGF file. Defaults to 10,000. " + - "If N is greater than the number of MS2 scans in a raw file, all MS2 scans will be used.")); - - parser.Add(new Argument(name: "LogDump", shortArgument: "-l", longArgument: "-logdump", required: false, - typeOf: typeof(bool), - helpText: "Write the instrument logs from all provided raw files to disk.")); - - parser.Add(new Argument(name: "ExampleCommands", shortArgument: "-commands", longArgument: "-examplecommands", required: false, typeOf: typeof(bool), - helpText: "Displays command line examples.")); - - parser.Add(new Argument(name: "ExampleModifications", shortArgument: "-modifications", longArgument: "-examplemods", required: false, typeOf: typeof(bool), - helpText: "Displays example peptide modifications.")); - - parser.Add(new Argument(name: "VersionInfo", shortArgument: "-version", longArgument: "-version", required: false, typeOf: typeof(bool), - helpText: "Displays version details.")); - - parser.Add(new Argument( - name: "MaxProcesses", - shortArgument: "-k", - longArgument: "-maxprocesses", - required: false, - typeOf: typeof(int), - defaultValue: 4, - helpText: "Maximum number of concurrent processes.")); - - parser.Add(new Argument( - name: "TmtImpurityTable", - shortArgument: "-i", - longArgument: "-impurities", - required: false, - typeOf: typeof(string), - helpText: "Path to a TMT impurity table. To save an example table you can modify, use the command \"RawTools -printtable LABEL\" where LABEL is one of the available TMT labels.")); - - parser.AddMutuallyExclusiveGroup(new List { "RawFiles", "RawFileDirectory" }); - parser.AddMutuallyExclusiveGroup(new List { "RawFiles", "QcDirectory" }); - - parser.AddMutuallyDependenteGroup(new List { "Quant", "LabelingReagent" }); - parser.AddMutuallyDependenteGroup(new List { "XTandemDirectory", "FastaDB" }); - - //parser.AddRequiredGroup(new List { "RawFiles", "RawFileDirectory" }); - - parser.AddDependencyGroup("WriteMGF", new List { "MgfMassCutoff" }); + "or to observe broad metrics using -x.")] + public bool Parse { get; set; } + + [Option('q', "quant", Required = false, + HelpText = "Similar to parse (-p), but also quantifies reporter ions and write results to output matrix. " + + "Use of this flag requires you also specify the reagents used for isobaric labeling with the -r argument (e.g. -r TMT10)")] + public bool Quant { get; set; } + + [Option('r', "labellingreagent", Required = false, + HelpText = "Required for reporter ion quantification. Reagents used to label peptides, required if using quant option. " + + "Available options are: {TMT0, TMT2, TMT6, TMT10, TMT11, TMT16, TMT18, iTRAQ4, iTRAQ8}.")] + public string LabelingReagent { get; set; } + + [Option('u', "unlabeledquant", Required = false, HelpText = + "Calculate areas of precursor peaks and writes them to the parse or quant file " + + "(ParentPeakArea column). This option is to be used in combination with -p or -q.")] + public bool UnlabeledQuant { get; set; } + + [Option('m', "mgf", Required = false, + HelpText = "Writes a standard MGF file. To specify a mass cutoff use the -c argument.")] + public bool WriteMGF { get; set; } + + [Option("mgfLevels", Required = false, + HelpText = "Writes a standard MGF file for different scan levels. Should be in the format \"-mgfLevels [levels]\", " + + "where levels is the MS level (or a combination of levels). For example, to output MS2 and MS3 scans, you would " + + "invoke the command \"-mgfLevels 23\". Currently, only MS levels 1, 2, and 3 are supported.")] + public string WriteMgfLevels { get; set; } + + [Option("faimsMgf", Required = false, + HelpText = "Writes an MGF for each FAIMS CV detected in the file.")] + public bool FaimsMgf { get; set; } + + [Option('c', "masscutoff", Required = false, + HelpText = "Specify a mass cutoff to be applied when generating MGF files. " + + "May be of use if removal of reporter ions is desired prior to searching of MS2 spectra. Default is 0.")] + public float MgfMassCutOff { get; set; } + + [Option('o', "out", Required = false, + HelpText = "The directory in which to write output. Can be a relative or absolute path to the directory. If it is a relative path it will be placed inside " + + "the directory containing the respective raw file. Note that relative paths should not start with a slash. If this is left blank, the directory where the raw file is stored will " + + "be used by default.")] + public string OutputDirectory { get; set; } + + [Option('x', "metrics", Required = false, + HelpText = "Write a text file containing general metrics about the MS run.")] + public bool Metrics { get; set; } + + [Option("allScanData", Required = false, + HelpText = "Write a text file containing all scan data acquired in the MS run. Currently, this only outputs" + + "MS1 data to the text file. Depending on the size of your raw file, this will generate a large output and can be slow.")] + public bool AllScanData { get; set; } + + [Option("chromatograms", Required = false, + HelpText = "Write a chromatogram to disk. Should be in the format \"-chro [order][type]\", where order " + + "is the MS order (or a combination of orders) and type is T, B, or TB (TIC, base peak and both, respectively). " + + "For example, to generate MS1 and MS2 TIC and base peak chromatograms, invoke \"-chromatograms 12TB\". Or, to generate a MS2 TIC, " + + "invoke \"-chromatograms 2T\".")] + public string Chromatogram { get; set; } + + [Option("xic", Required = false, + HelpText = "Provide a mass value to write an extraction ion chromatrogram from MS1 data. The values should be provided " + + "in a comma delimited format (e.g. 500,10) for mass,tolerance. The tolerance value is treated as a window around the " + + "given mass value.")] + public string Xic { get; set; } + + [Option('R', "refinemasscharge", Required = false, + HelpText = "Refine precursor charge and monoisotopic mass assignments. Highly recommended if " + + "monoisotopic precursor selection was turned off in the instrument method (or peptide match on a QE instrument).")] + public bool RefineMassCharge { get; set; } + + [Option("mincharge", Required = false, + HelpText = "The minimum charge to consider when refining precursor mass and charge.")] + public int MinCharge { get; set; } = 2; + + [Option("maxcharge", Required = false, + HelpText = "The maximum charge to consider when refining precursor mass and charge.")] + public int MaxCharge { get; set; } = 4; + + [Option("fastadb", Required = false, + HelpText = "Required for an X! Tandem search during QC. Path to a fasta protein database.")] + public string FastaDB { get; set; } + + [Option("fixedmods", Required = false, + HelpText = "Fixed modifications to pass to the search, if desired. Use mass@aminoacid1,mass@aminoacid2 format. " + + "It is important that the values are separated with a comma and not spaces. Invoke \">RawTools -modifications\" " + + "to see examples of some common modifications")] + public string FixedModifications { get; set; } + + [Option("variablemods", Required = false, + HelpText = "Variable modifications to pass to the search, if desired. Use mass@aminoacid1,mass@aminoacid2 format. " + + "It is important that the values are separated with a comma and not spaces. Invoke \">RawTools -modifications\" " + + "to see examples of some common modifications")] + public string VariableModifications { get; set; } + + [Option("fixedscans", Required = false, + HelpText = "Fix random number generator seed for selecting random scan numbers for search. " + + "This guarantees that running the QC step twice in a row produces identical results")] + public bool FixedScans { get; set; } = false; + + [Option('X', "xtandem", Required = false, + HelpText = "Specify the path to the X! Tandem directory (the directory containing \"tandem.exe\") if you want " + + "to run a database search as part of QC.")] + public string XTandemDirectory { get; set; } + + [Option('N', "numberspectra", Required = false, + HelpText = "The number of MS2 spectra to be passes to the search engine as an MGF file. Defaults to 10,000. " + + "If N is greater than the number of MS2 scans in a raw file, all MS2 scans will be used.")] + public int NumberSpectra { get; set; } = 10000; + + [Option('l', "logdump", Required = false, + HelpText = "Write the instrument logs from all provided raw files to disk.")] + public bool LogDump { get; set; } + + [Option("examplecommands", Required = false, + HelpText = "Displays command line examples.")] + public bool ExampleCommands { get; set; } + + [Option("examplemods", Required = false, + HelpText = "Displays example peptide modifications.")] + public bool ExampleModifications { get; set; } + + [Option("version", Required = false, + HelpText = "Displays version details.")] + public bool VersionInfo { get; set; } = false; + + [Option('k', + "maxprocesses", + Required = false, + HelpText = "Maximum number of concurrent processes.")] + public int MaxProcesses { get; set; } = 4; + + [Option('i', "impurities", + Required = false, + HelpText = "Path to a TMT impurity table. To save an example table you can modify, use the command \"RawTools -printtable LABEL\" where LABEL is one of the available TMT labels.")] + public string TmtImpurityTable { get; set; } + +// parser.AddMutuallyExclusiveGroup(new List { "RawFiles", "RawFileDirectory" }); +// parser.AddMutuallyExclusiveGroup(new List { "RawFiles", "QcDirectory" }); + +// parser.AddMutuallyDependenteGroup(new List { "Quant", "LabelingReagent" }); +// parser.AddMutuallyDependenteGroup(new List { "XTandemDirectory", "FastaDB" }); + +//parser.AddRequiredGroup(new List { "RawFiles", "RawFileDirectory" }); + +// parser.AddDependencyGroup("WriteMGF", new List { "MgfMassCutoff" }); //parser.AddDependencyGroup("XTandemDirectory", new List { "FixedModifications", // "VariableModifications", "XModifications", "NumberSpectra" }); - return parser; + } + + static class ParserForRawTools + { + public static Options Parse(string[] args) + { + return CommandLine.Parser.Default.ParseArguments(args).Value; } } } diff --git a/RawTools/Data/Containers.cs b/RawTools/Data/Containers.cs index 6e46adb..2b3518b 100644 --- a/RawTools/Data/Containers.cs +++ b/RawTools/Data/Containers.cs @@ -424,17 +424,20 @@ public class SearchMetricsContainer public SearchData SearchData; public SerializableDictionary ModificationFrequency; - - public SearchMetricsContainer(string rawFile, DateTime dateAquired, MethodDataContainer methodData) + public SearchMetricsContainer() { + SearchData = new SearchData(); + ModificationFrequency = new SerializableDictionary(); + } + + public SearchMetricsContainer(string rawFile, DateTime dateAquired, MethodDataContainer methodData) : this() + { RawFile = rawFile; Instrument = methodData.Instrument; DateAcquired = dateAquired; DigestionEfficiency = IdentificationRate = MissedCleavageRate = -1; ChargeRatio3to2 = ChargeRatio4to2 = -1; MedianMassDrift = -1; - SearchData = new SearchData(); - ModificationFrequency = new SerializableDictionary(); } } diff --git a/RawTools/Program.cs b/RawTools/Program.cs index 997594c..3a2cb8c 100644 --- a/RawTools/Program.cs +++ b/RawTools/Program.cs @@ -20,27 +20,12 @@ using System.IO; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; -using ThermoFisher; using ThermoFisher.CommonCore.Data.Business; using ThermoFisher.CommonCore.Data.Interfaces; -using ThermoFisher.CommonCore.Data.FilterEnums; -using ThermoFisher.CommonCore.Data; -using RawTools.Data.IO; -using RawTools.Data.Collections; -using RawTools.Data.Extraction; -using RawTools.Data.Containers; using RawTools.Utilities; -using RawTools.Algorithms; using RawTools.QC; using RawTools.WorkFlows; -using RawTools.Algorithms.Analyze; -using RawTools.Algorithms.ExtractData; -using RawTools.Utilities.MathStats; -using System.Xml.Linq; using Serilog; -using CLParser; //using Serilog.Sinks.File; namespace RawTools @@ -64,30 +49,30 @@ static void Main(string[] args) Log.Information("Program started with arguments: {0}", String.Join(" ", args)); - ClParser parser = ArgumentParser.ParserForRawTools.Create(); - - var arguments = parser.Parse(args); - - _ = Run(arguments); + var arguments = ArgumentParser.ParserForRawTools.Parse(args); + if (arguments != null) + { + _ = Run(arguments); + } Log.CloseAndFlush(); } - static int Run(Dictionary opts) + static int Run(ArgumentParser.Options opts) { - if ((bool)opts["VersionInfo"] == true) + if ((bool)opts.VersionInfo == true) { Examples.VersionInfo(); Environment.Exit(0); } - if ((bool)opts["ExampleCommands"] == true) + if ((bool)opts.ExampleCommands == true) { Examples.CommandLineUsage(); Environment.Exit(0); } - if ((bool)opts["ExampleModifications"] == true) + if ((bool)opts.ExampleModifications == true) { Examples.ExampleMods(); Environment.Exit(0); @@ -98,7 +83,7 @@ static int Run(Dictionary opts) WorkflowParameters parameters = new WorkflowParameters(opts); - if (parameters.InputFiles != null) // did the user give us a list of files? + if (parameters.InputFiles != null && parameters.InputFiles.Count() > 0) // did the user give us a list of files? { List problems = new List(); files = parameters.InputFiles.ToList(); diff --git a/RawTools/Properties/Resources.Designer.cs b/RawTools/Properties/Resources.Designer.cs index 74b915b..67f697e 100644 --- a/RawTools/Properties/Resources.Designer.cs +++ b/RawTools/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace RawTools.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { @@ -103,10 +103,7 @@ internal static string XTandem_default_config { /// /// Looks up a localized string similar to <?xml version="1.0"?> ///<bioml label="x! taxon-to-file matching list"> - /// <taxon label="yeast"> - /// <file format="peptide" URL="../fasta/scd.fasta.pro" /> - /// <file format="peptide" URL="../fasta/scd_1.fasta.pro" /> - /// <file format="peptide" URL="../fasta/crap.fasta.pro" /> + /// <taxon label="all"> /// </taxon> ///</bioml> ///. diff --git a/RawTools/QC/RunSearch.cs b/RawTools/QC/RunSearch.cs index e2f9ec6..ab704c6 100644 --- a/RawTools/QC/RunSearch.cs +++ b/RawTools/QC/RunSearch.cs @@ -39,7 +39,7 @@ static class Search { public static void WriteSearchMGF(WorkflowParameters parameters, CentroidStreamCollection centroids, SegmentScanCollection segments, RetentionTimeCollection retentionTimes, PrecursorMassCollection precursorMasses, PrecursorScanCollection precursorScans, TrailerExtraCollection trailerExtras, MethodDataContainer methodData, - ScanIndex index, string rawFileName, bool fixedScans = false) + ScanIndex index, string rawFileName) { var pars = parameters.QcParams.SearchParameters; int[] scans = AdditionalMath.SelectRandomScans(scans: index.ScanEnumerators[MSOrderType.Ms2], diff --git a/RawTools/RawTools.csproj b/RawTools/RawTools.csproj index b8b8f7e..45f60aa 100644 --- a/RawTools/RawTools.csproj +++ b/RawTools/RawTools.csproj @@ -8,7 +8,7 @@ Exe RawTools RawTools - v4.6.2 + v4.8 512 true @@ -85,8 +85,8 @@ Auto - - ..\..\rawtoolsDevPackages\CLParserForNetFramework\CLParserForNetFramework\bin\Release\CLParserForNetFramework.dll + + ..\packages\CommandLineParser.2.9.1\lib\net461\CommandLine.dll @@ -131,17 +131,17 @@ - - ..\packages\ThermoFisher.CommonCore.BackgroundSubtraction.5.0.0.71\lib\netstandard2.0\ThermoFisher.CommonCore.BackgroundSubtraction.dll + + ..\lib\ThermoFisher.CommonCore.BackgroundSubtraction.dll - - ..\packages\ThermoFisher.CommonCore.Data.5.0.0.71\lib\netstandard2.0\ThermoFisher.CommonCore.Data.dll + + ..\lib\ThermoFisher.CommonCore.Data.dll - - ..\packages\ThermoFisher.CommonCore.MassPrecisionEstimator.5.0.0.71\lib\netstandard2.0\ThermoFisher.CommonCore.MassPrecisionEstimator.dll + + ..\lib\ThermoFisher.CommonCore.MassPrecisionEstimator.dll - - ..\packages\ThermoFisher.CommonCore.RawFileReader.5.0.0.71\lib\netstandard2.0\ThermoFisher.CommonCore.RawFileReader.dll + + ..\lib\ThermoFisher.CommonCore.RawFileReader.dll diff --git a/RawTools/Utilities/Utilities.cs b/RawTools/Utilities/Utilities.cs index 4a26665..62e282f 100644 --- a/RawTools/Utilities/Utilities.cs +++ b/RawTools/Utilities/Utilities.cs @@ -347,6 +347,11 @@ static class AdditionalMath { public static double Percentile(this double[] Values, int percentile) { + if(Values.Length == 0) + { + return Double.NaN; + } + int end = Values.Length - 1; double endAsDouble = Convert.ToDouble(end); double[] sortedValues = (double[])Values.Clone(); @@ -600,8 +605,7 @@ public static bool IsFileLocked(string fileName) } finally { - if (stream != null) - stream.Close(); + stream?.Close(); } //file is not locked @@ -763,8 +767,7 @@ public static class XmlSerialization } finally { - if (writer != null) - writer.Close(); + writer?.Close(); } } @@ -786,8 +789,7 @@ public static class XmlSerialization } finally { - if (reader != null) - reader.Close(); + reader?.Close(); } } } diff --git a/RawTools/WorkFlows/DDA.cs b/RawTools/WorkFlows/DDA.cs index 71ab3fd..31b057b 100644 --- a/RawTools/WorkFlows/DDA.cs +++ b/RawTools/WorkFlows/DDA.cs @@ -183,7 +183,7 @@ public static void UniversalDDA(IRawFileThreadManager rawFileThreadManager, Work if (parameters.QcParams.PerformSearch) { Search.WriteSearchMGF(parameters, centroidStreams, segmentScans, retentionTimes, precursorMasses, precursorScans, trailerExtras, methodData, - Index, staticRawFile.FileName, parameters.QcParams.FixedScans); + Index, staticRawFile.FileName); Search.RunSearch(parameters, methodData, staticRawFile.FileName); diff --git a/RawTools/WorkFlows/WorkflowParameters.cs b/RawTools/WorkFlows/WorkflowParameters.cs index a8e31a9..31b4c43 100644 --- a/RawTools/WorkFlows/WorkflowParameters.cs +++ b/RawTools/WorkFlows/WorkflowParameters.cs @@ -43,36 +43,36 @@ public WorkflowParameters() ParseParams = new ParseWorkflowParameters(); } - public WorkflowParameters(Dictionary Options) + public WorkflowParameters(ArgumentParser.Options Options) { ParseParams = new ParseWorkflowParameters(); ExpType = ExperimentType.DDA; MgfIntensityCutoff = 0; - MaxProcesses = Convert.ToInt32(TryGetElseDefault(Options, "MaxProcesses")); - MgfMassCutoff = Convert.ToDouble(TryGetElseDefault(Options, "MgfMassCutOff")); - InputFiles = (List)TryGetElseDefault(Options,"RawFiles"); - RawFileDirectory = (string)TryGetElseDefault(Options,"RawFileDirectory"); - IncludeSubdirectories = (bool)TryGetElseDefault(Options,"SearchSubdirectories"); - RefineMassCharge = (bool)TryGetElseDefault(Options,"RefineMassCharge"); - ParseParams.Chromatogram = (string)TryGetElseDefault(Options, "Chromatogram"); - ParseParams.Xic = (string)TryGetElseDefault(Options, "Xic"); - ParseParams.WriteMgfLevels = (string)TryGetElseDefault(Options, "WriteMgfLevels"); - ParseParams.WriteFaimsMgf = (bool)TryGetElseDefault(Options, "FaimsMgf"); - ParseParams.LabelingReagents = (string)TryGetElseDefault(Options, "LabelingReagent"); - ParseParams.Metrics = (bool)TryGetElseDefault(Options, "Metrics"); - ParseParams.AllScanData = (bool)TryGetElseDefault(Options, "AllScanData"); - ParseParams.Parse = (bool)TryGetElseDefault(Options, "Parse"); - ParseParams.Quant = (bool)TryGetElseDefault(Options, "Quant"); - ParseParams.UnlabeledQuant = (bool)TryGetElseDefault(Options, "UnlabeledQuant"); - ParseParams.WriteMgf = (bool)TryGetElseDefault(Options, "WriteMGF"); - ConsideredChargeStates.Min = Convert.ToInt32(TryGetElseDefault(Options, "MinCharge")); - ConsideredChargeStates.Max = Convert.ToInt32(TryGetElseDefault(Options, "MaxCharge")); - LogDump = (bool)TryGetElseDefault(Options, "LogDump"); - ImpurityTable = (string)TryGetElseDefault(Options, "TmtImpurityTable"); - - string output = (string)TryGetElseDefault(Options, "OutputDirectory"); + MaxProcesses = Options.MaxProcesses; + MgfMassCutoff = Options.MgfMassCutOff; + InputFiles = Options.RawFiles; + RawFileDirectory = Options.RawFileDirectory; + IncludeSubdirectories = Options.SearchSubdirectories; + RefineMassCharge = Options.RefineMassCharge; + ParseParams.Chromatogram = Options.Chromatogram; + ParseParams.Xic = Options.Xic; + ParseParams.WriteMgfLevels = Options.WriteMgfLevels; + ParseParams.WriteFaimsMgf = Options.FaimsMgf; + ParseParams.LabelingReagents = Options.LabelingReagent; + ParseParams.Metrics = Options.Metrics; + ParseParams.AllScanData = Options.AllScanData; + ParseParams.Parse = Options.Parse; + ParseParams.Quant = Options.Quant; + ParseParams.UnlabeledQuant = Options.UnlabeledQuant; + ParseParams.WriteMgf = Options.WriteMGF; + ConsideredChargeStates.Min = Options.MinCharge; + ConsideredChargeStates.Max = Options.MaxCharge; + LogDump = Options.LogDump; + ImpurityTable = Options.TmtImpurityTable; + + string output = Options.OutputDirectory; if (!String.IsNullOrEmpty(output)) { @@ -86,8 +86,8 @@ public WorkflowParameters(Dictionary Options) QcParams = new QcWorkflowParameters(); - QcParams.QcDirectory = (string)TryGetElseDefault(Options, "QcDirectory"); - QcParams.XTandemDirectory = (string)TryGetElseDefault(Options, "XTandemDirectory"); + QcParams.QcDirectory = Options.QcDirectory; + QcParams.XTandemDirectory = Options.XTandemDirectory; if (!String.IsNullOrEmpty(QcParams.XTandemDirectory)) { @@ -96,12 +96,12 @@ public WorkflowParameters(Dictionary Options) ExpType = ExperimentType.DDA; - QcParams.FastaDatabase = (string)TryGetElseDefault(Options, "FastaDB"); - QcParams.FixedMods = (string)TryGetElseDefault(Options, "FixedModifications"); - //QcParams.FixedScans = Options.FixedScans; - QcParams.VariableMods = (string)TryGetElseDefault(Options, "VariableModifications"); + QcParams.FastaDatabase = Options.FastaDB; + QcParams.FixedMods = Options.FixedModifications; + QcParams.FixedScans = Options.FixedScans; + QcParams.VariableMods = Options.VariableModifications; - QcParams.NumberSpectra = Convert.ToInt32(TryGetElseDefault(Options, "NumberSpectra")); + QcParams.NumberSpectra = Options.NumberSpectra; if (QcParams.SearchAlgorithm != SearchAlgorithm.None) { @@ -132,18 +132,6 @@ public WorkflowParameters(Dictionary Options) } } } - - private V TryGetElseDefault(Dictionary parameters, T key) - { - if (parameters.ContainsKey(key)) - { - return parameters[key]; - } - else - { - return default(V); - } - } } public class ParseWorkflowParameters diff --git a/RawTools/packages.config b/RawTools/packages.config index a9f0374..e0e8f5e 100644 --- a/RawTools/packages.config +++ b/RawTools/packages.config @@ -1,5 +1,6 @@  + @@ -10,8 +11,4 @@ - - - - \ No newline at end of file diff --git a/RawToolsGUI/App.config b/RawToolsGUI/App.config index a8c1b66..7f49925 100644 --- a/RawToolsGUI/App.config +++ b/RawToolsGUI/App.config @@ -1,33 +1,33 @@ - + - + - - + + - - + + - - + + - - + + - - + + - - + + diff --git a/RawToolsGUI/Properties/Resources.Designer.cs b/RawToolsGUI/Properties/Resources.Designer.cs index 9d15b57..3664c04 100644 --- a/RawToolsGUI/Properties/Resources.Designer.cs +++ b/RawToolsGUI/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace RawToolsGUI.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { diff --git a/RawToolsGUI/Properties/Settings.Designer.cs b/RawToolsGUI/Properties/Settings.Designer.cs index d849956..983f208 100644 --- a/RawToolsGUI/Properties/Settings.Designer.cs +++ b/RawToolsGUI/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace RawToolsGUI.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.8.1.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.5.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/RawToolsGUI/RawToolsGUI.csproj b/RawToolsGUI/RawToolsGUI.csproj index 6f9394e..ba409e9 100644 --- a/RawToolsGUI/RawToolsGUI.csproj +++ b/RawToolsGUI/RawToolsGUI.csproj @@ -8,7 +8,7 @@ WinExe RawToolsGUI RawToolsGUI - v4.6.2 + v4.8 512 true @@ -74,17 +74,21 @@ - - ..\packages\ThermoFisher.CommonCore.BackgroundSubtraction.5.0.0.71\lib\netstandard2.0\ThermoFisher.CommonCore.BackgroundSubtraction.dll + + False + ..\lib\ThermoFisher.CommonCore.BackgroundSubtraction.dll - - ..\packages\ThermoFisher.CommonCore.Data.5.0.0.71\lib\netstandard2.0\ThermoFisher.CommonCore.Data.dll + + False + ..\lib\ThermoFisher.CommonCore.Data.dll - - ..\packages\ThermoFisher.CommonCore.MassPrecisionEstimator.5.0.0.71\lib\netstandard2.0\ThermoFisher.CommonCore.MassPrecisionEstimator.dll + + False + ..\lib\ThermoFisher.CommonCore.MassPrecisionEstimator.dll - - ..\packages\ThermoFisher.CommonCore.RawFileReader.5.0.0.71\lib\netstandard2.0\ThermoFisher.CommonCore.RawFileReader.dll + + False + ..\lib\ThermoFisher.CommonCore.RawFileReader.dll diff --git a/RawToolsViz/App.config b/RawToolsViz/App.config index 28a3372..7f49925 100644 --- a/RawToolsViz/App.config +++ b/RawToolsViz/App.config @@ -1,34 +1,34 @@ - + - + - - + + - - + + - - + + - - + + - - + + - - + + - \ No newline at end of file + diff --git a/RawToolsViz/Properties/Resources.Designer.cs b/RawToolsViz/Properties/Resources.Designer.cs index ea632c4..864283d 100644 --- a/RawToolsViz/Properties/Resources.Designer.cs +++ b/RawToolsViz/Properties/Resources.Designer.cs @@ -8,10 +8,10 @@ // //------------------------------------------------------------------------------ -namespace RawToolsViz.Properties -{ - - +namespace RawToolsViz.Properties { + using System; + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -19,51 +19,43 @@ namespace RawToolsViz.Properties // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - + internal class Resources { + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { + internal Resources() { } - + /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("RawToolsViz.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } - + /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { + internal static global::System.Globalization.CultureInfo Culture { + get { return resourceCulture; } - set - { + set { resourceCulture = value; } } diff --git a/RawToolsViz/Properties/Settings.Designer.cs b/RawToolsViz/Properties/Settings.Designer.cs index ef5f793..fe1b079 100644 --- a/RawToolsViz/Properties/Settings.Designer.cs +++ b/RawToolsViz/Properties/Settings.Designer.cs @@ -8,21 +8,17 @@ // //------------------------------------------------------------------------------ -namespace RawToolsViz.Properties -{ - - +namespace RawToolsViz.Properties { + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.5.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { + + public static Settings Default { + get { return defaultInstance; } } diff --git a/RawToolsViz/RawToolsViz.csproj b/RawToolsViz/RawToolsViz.csproj index f71010c..5188505 100644 --- a/RawToolsViz/RawToolsViz.csproj +++ b/RawToolsViz/RawToolsViz.csproj @@ -8,9 +8,10 @@ WinExe RawToolsViz RawToolsViz - v4.6.2 + v4.8 512 true + x64 @@ -32,9 +33,6 @@ 4 - - ..\..\rawtoolsDevPackages\CheckBoxComboBox\CheckBoxComboBox\bin\Debug\CheckBoxComboBox.dll - ..\packages\OpenMcdf.2.2.1.9\lib\net40\OpenMcdf.dll @@ -74,17 +72,21 @@ - - ..\packages\ThermoFisher.CommonCore.BackgroundSubtraction.5.0.0.71\lib\netstandard2.0\ThermoFisher.CommonCore.BackgroundSubtraction.dll + + False + ..\lib\ThermoFisher.CommonCore.BackgroundSubtraction.dll - - ..\packages\ThermoFisher.CommonCore.Data.5.0.0.71\lib\netstandard2.0\ThermoFisher.CommonCore.Data.dll + + False + ..\lib\ThermoFisher.CommonCore.Data.dll - - ..\packages\ThermoFisher.CommonCore.MassPrecisionEstimator.5.0.0.71\lib\netstandard2.0\ThermoFisher.CommonCore.MassPrecisionEstimator.dll + + False + ..\lib\ThermoFisher.CommonCore.MassPrecisionEstimator.dll - - ..\packages\ThermoFisher.CommonCore.RawFileReader.5.0.0.71\lib\netstandard2.0\ThermoFisher.CommonCore.RawFileReader.dll + + False + ..\lib\ThermoFisher.CommonCore.RawFileReader.dll @@ -154,6 +156,7 @@ True Resources.resx + True Launcher.cs diff --git a/lib/ThermoFisher.CommonCore.BackgroundSubtraction.dll b/lib/ThermoFisher.CommonCore.BackgroundSubtraction.dll new file mode 100644 index 0000000..a732848 Binary files /dev/null and b/lib/ThermoFisher.CommonCore.BackgroundSubtraction.dll differ diff --git a/lib/ThermoFisher.CommonCore.Data.dll b/lib/ThermoFisher.CommonCore.Data.dll new file mode 100644 index 0000000..1ed8566 Binary files /dev/null and b/lib/ThermoFisher.CommonCore.Data.dll differ diff --git a/lib/ThermoFisher.CommonCore.MassPrecisionEstimator.dll b/lib/ThermoFisher.CommonCore.MassPrecisionEstimator.dll new file mode 100644 index 0000000..ed5a4fb Binary files /dev/null and b/lib/ThermoFisher.CommonCore.MassPrecisionEstimator.dll differ diff --git a/lib/ThermoFisher.CommonCore.RawFileReader.dll b/lib/ThermoFisher.CommonCore.RawFileReader.dll new file mode 100644 index 0000000..f84548a Binary files /dev/null and b/lib/ThermoFisher.CommonCore.RawFileReader.dll differ