public DataReaderCSharpClient() { string msg = null; string stackTrace = null; try { // Transition information for MRM data files TestIsPrimaryChrom(_tMRM_DataFile); // UV spectra and signals for non-MS detectors ExtractNonMSData(_nonMs_DataFile1, 10); //Create an instance of MassSpecDataReader to open up the data file IMsdrDataReader dataAccess = new MassSpecDataReader(); println("MHDA API Version: " + dataAccess.Version); dataAccess.OpenDataFile(_tgtMsMs_DataFile); GetAxisInformation(dataAccess); PrintFileInfo(dataAccess); PrintDeviceInfo(dataAccess); PrintMSScanInfo(dataAccess); GetAllScansUsingRowIndex(dataAccess);//Get all scans using row Index GetPrecursorInfo(dataAccess); DeisotopeTest(dataAccess); DoSpectrumExtractionTest(dataAccess); DoSpectrumExtractionTestWithStorage(dataAccess); GetAllScanRecords(dataAccess); GetSampleInfoData(dataAccess); ExtractEIC(dataAccess); dataAccess.CloseDataFile(); println("\nDone."); } catch (Exception ex) { msg = ex.Message; stackTrace = ex.StackTrace; println("Exception: " + msg); } println("Press Enter to close"); Console.ReadLine(); }
// Examine triggered MRM data file transition chromatograms to see which are // for primary transitions. private void TestIsPrimaryChrom(string tMrmFilePath) { IMsdrDataReader dataReader = new MassSpecDataReader(); dataReader.OpenDataFile(tMrmFilePath); IBDAChromFilter filter = new BDAChromFilter(); filter.ChromatogramType = ChromType.MultipleReactionMode; filter.MSScanTypeFilter = MSScanType.MultipleReaction; filter.ExtractOneChromatogramPerScanSegment = true; filter.DoCycleSum = false; IBDAChromData[] chroms = dataReader.GetChromatogram(filter); foreach (IBDAChromData chrom in chroms) { bool val = chrom.IsPrimaryMrm; string s = string.Format("{0}->{1}, {2}", chrom.MZOfInterest[0].Start, chrom.MeasuredMassRange[0].Start, val); println(s); } dataReader.CloseDataFile(); }
public DataReaderCSharpClient() { //Create an instance of MassSpecDataReader to open up the data file //ExtractNonMSData(); IMsdrDataReader dataAccess = new MassSpecDataReader(); println("MHDA API Version: " + dataAccess.Version); dataAccess.OpenDataFile(_dataFilename1); GetMSLevels(dataAccess); //PrintFileInfo(dataAccess); //PrintDeviceInfo(dataAccess); //PrintMSScanInfo(dataAccess); //GetAllScansUsingRowIndex(dataAccess);//Get all scans using row Index //GetPrecursorInfo(dataAccess); //DeisotopeTest(dataAccess); //DoSpectrumExtractionTest(dataAccess); //DoSpectrumExtractionTestWithStorage(dataAccess); //dataAccess.CloseDataFile(); //DadSignalExtract(); }
public override int LoadIndex(string FileName) { this.RawFileName = FileName; RawFile = new MassSpecDataReader(); MSReader = RawFile; MSReader.OpenDataFile(FileName); Spectra = (int)(MSReader.MSScanFileInformation.TotalScansPresent); bool PosMode = false, NegMode = false; if (Spectra <= 0) { return(0); } int i, LastFull = 0, Total = 0; //there will be fake [0] spectra with no data and fake last spectra with no data //it is made to make any chromatogram start and end with zero IndexDir = new int[Spectra + 2]; IndexRev = new int[Spectra + 2]; RawSpectra = new RawSpectrum[Spectra + 2]; for (int j = 0; j <= Spectra + 1; j++) { RawSpectra[j] = new RawSpectrum(); } TimeStamps = new double[Spectra + 2]; TimeCoefs = new double[Spectra + 2]; LowRT = 0.0; HighRT = 0.0; int Progress = 0; for (i = 1; i <= Spectra; i++) { if ((int)(100.0 * ((double)i / (double)Spectra)) > Progress)//report progress { Progress = (int)(100.0 * ((double)i / (double)Spectra)); RepProgress?.Invoke(Progress); } IMSScanRecord ScanRecord = MSReader.GetScanRecord(i - 1); if (ScanRecord.MSScanType == MSScanType.Scan && ScanRecord.MSLevel == MSLevel.MS && ScanRecord.CollisionEnergy == 0.0) //if spectra is a FULL MS { PosMode |= ScanRecord.IonPolarity == IonPolarity.Positive; NegMode |= ScanRecord.IonPolarity == IonPolarity.Negative; RawSpectra[i].RT = ScanRecord.RetentionTime; TimeStamps[i] = RawSpectra[i].RT - RawSpectra[LastFull].RT; RawSpectra[i].Scan = i; IndexDir[LastFull] = i; IndexRev[i] = LastFull; LastFull = i; Total++; } } IndexDir[LastFull] = Spectra + 1; IndexDir[Spectra + 1] = -1; IndexRev[Spectra + 1] = LastFull; TotalRT = RawSpectra[LastFull].RT; AverageTimeStamp = TotalRT / Total; //time interval bias coefficients for (i = IndexDir[0]; IndexDir[i] != -1; i = IndexDir[i]) { TimeCoefs[i] = (TimeStamps[i] + TimeStamps[IndexDir[i]]) / (2.0 * AverageTimeStamp); } TimeCoefs[i] = 1.0; //Fake spectra number 0 has to have reasonable RT double FRT = RawSpectra[IndexDir[0]].RT; double SRT = RawSpectra[IndexDir[IndexDir[0]]].RT; RawSpectra[0].RT = Math.Max(0, FRT - (SRT - FRT)); //Last spectra also has to have reasonable RT FRT = RawSpectra[LastFull].RT; SRT = RawSpectra[IndexRev[LastFull]].RT; RawSpectra[Spectra + 1].RT = FRT + (FRT - SRT); RawSpectra[0].Data = new MZData[0]; RawSpectra[Spectra + 1].Data = new MZData[0]; PeakFilter = new MsdrPeakFilter(); PeakFilter.AbsoluteThreshold = 5.0; if (PosMode && !NegMode) { Mode = 1; } if (!PosMode && NegMode) { Mode = -1; } return(Spectra); }
// Extract non-MS data from the specified file path, with UV spectra limited to at // most the specified number. private void ExtractNonMSData(string dataFilePath, int maxSpectraToReport) { IMsdrDataReader dataReader = new MassSpecDataReader(); dataReader.OpenDataFile(dataFilePath); INonmsDataReader nonMsReader = dataReader as INonmsDataReader; IDeviceInfo[] deviceInfo = nonMsReader.GetNonmsDevices(); if ((deviceInfo == null) || (deviceInfo.Length == 0)) { println("No Non MS device found"); } else { foreach (IDeviceInfo device in deviceInfo) { println("Device = " + device.DeviceName + " Ordinal number = " + device.OrdinalNumber.ToString() + " Device type = " + device.DeviceType.ToString()); #region DAD Signal & Spectrum if (device.DeviceType == DeviceType.DiodeArrayDetector || device.DeviceType == DeviceType.HDR || device.DeviceType == DeviceType.CompactLC1220DAD) { //Extracting Signal Information ISignalInfo[] sigInfo = nonMsReader.GetSignalInfo(device, StoredDataType.Chromatograms); if (sigInfo.Length == 0) { println("No DAD signal found"); } else { StringBuilder sb = new StringBuilder(); sb.AppendFormat("Found info on {0} signals: ", sigInfo.Length); foreach (ISignalInfo info in sigInfo) { sb.AppendFormat("{0}, ", info.SignalName); } println(sb.ToString()); IBDAChromData chromData = nonMsReader.GetSignal(sigInfo[0]); if ((chromData == null) || (chromData.TotalDataPoints == 0)) { println("No data found for first DAD signal"); } else { int count = chromData.TotalDataPoints; double[] xArray = chromData.XArray; float[] yArray = chromData.YArray; // This information can be exported to a file on disk FileStream file = new FileStream(@"C:\temp\reportNew.csv", FileMode.Create, FileAccess.ReadWrite); TextWriter sw = new StreamWriter(file); sw.WriteLine("#Point,X(Minutes),Y(Response Units)"); for (int i = 0; i < xArray.Length; i++) { sw.WriteLine(i.ToString() + "," + xArray[i].ToString() + "," + yArray[i].ToString()); } sw.Close(); file.Close(); } } //Extracting TWC IBDAChromData chromDataTWC = nonMsReader.GetTWC(device); //compare this data with our own file if ((chromDataTWC == null) || (chromDataTWC.TotalDataPoints == 0)) { println("No TWC found"); } else { int dataPoints = chromDataTWC.TotalDataPoints; double[] xArrayTWC = chromDataTWC.XArray; float[] yArrayTWC = chromDataTWC.YArray; // Expoting this information to a file on disk FileStream fileTWC = new FileStream(@"C:\temp\reportTWC.csv", FileMode.Create, FileAccess.ReadWrite); TextWriter swTWC = new StreamWriter(fileTWC); swTWC.WriteLine("#Point,X(Minutes),Y(Response Units)"); for (int i = 0; i < xArrayTWC.Length; i++) { swTWC.WriteLine(i.ToString() + "," + xArrayTWC[i].ToString() + "," + yArrayTWC[i].ToString()); } swTWC.Close(); fileTWC.Close(); } //Extracting EWC IRange rangeSignal = new MinMaxRange(40, 250); IRange rangeRef = new MinMaxRange(40, 250); IBDAChromData chromDataEWC = nonMsReader.GetEWC(device, rangeSignal, rangeRef); if ((chromDataEWC == null) || (chromDataEWC.TotalDataPoints == 0)) { println("No EWC found"); } else { double[] xArrayEWC = chromDataEWC.XArray; float[] yArrayEWC = chromDataEWC.YArray; // Expoting this information to a file on disk FileStream fileEWC = new FileStream(@"C:\temp\reportEWC.csv", FileMode.Create, FileAccess.ReadWrite); TextWriter swEWC = new StreamWriter(fileEWC); swEWC.WriteLine("#Point,X(Minutes),Y(Response Units)"); for (int i = 0; i < xArrayEWC.Length; i++) { swEWC.WriteLine(i.ToString() + "," + xArrayEWC[i].ToString() + "," + yArrayEWC[i].ToString()); } swEWC.Close(); fileEWC.Close(); } //UV Spectrum: get each UV spectrum in the file string uvSpectraFilePath = @"C:\temp\reportUV.csv"; if (File.Exists(uvSpectraFilePath)) { File.Delete(uvSpectraFilePath); } for (int k = 0; k < chromDataTWC.XArray.Length && k < maxSpectraToReport; k++) { IRange range = new MinMaxRange(chromDataTWC.XArray[k], chromDataTWC.XArray[k]); IBDASpecData[] uvSpecData = nonMsReader.GetUVSpectrum(device, range); if (uvSpecData == null) { println("No UV spectrum found"); } else { foreach (IBDASpecData uvSpec in uvSpecData) { if (uvSpec.TotalDataPoints != 0) { int dataPopints = uvSpec.TotalDataPoints; double[] xArrayUV = uvSpec.XArray; float[] yArrayUV = uvSpec.YArray; // Expoting this information to a file on disk FileStream fileUV = new FileStream(uvSpectraFilePath, FileMode.Append, FileAccess.Write); TextWriter swUV = new StreamWriter(fileUV); swUV.WriteLine("#Point,X(Nanometers),Y(mAU)"); for (int i = 0; i < xArrayUV.Length; i++) { swUV.WriteLine(i.ToString() + "," + xArrayUV[i].ToString() + "," + yArrayUV[i].ToString()); } swUV.Close(); fileUV.Close(); } else { println("No UV spectrum found"); } } } } } #endregion #region InstrumentCurves - TCC if (device.DeviceType == DeviceType.ThermostattedColumnCompartment) { ISignalInfo[] sigInfo = nonMsReader.GetSignalInfo(device, StoredDataType.InstrumentCurves); if (sigInfo.Length == 0) { println("No TCC Curves found"); } else { IBDAChromData chromData = nonMsReader.GetSignal(sigInfo[0]); if ((chromData == null) || (chromData.TotalDataPoints == 0)) { println("No TCC Curves found"); } else { int count = chromData.TotalDataPoints; double[] xArray = chromData.XArray; float[] yArray = chromData.YArray; // Expoting this information to a file on disk FileStream file = new FileStream(@"C:\temp\reportInstrumentCurve.csv", FileMode.Create, FileAccess.ReadWrite); TextWriter sw = new StreamWriter(file); sw.WriteLine("#Point,X(Minutes),Y(Response Units)"); for (int i = 0; i < xArray.Length; i++) { sw.WriteLine(i.ToString() + "," + xArray[i].ToString() + "," + yArray[i].ToString()); } sw.Close(); file.Close(); } } } #endregion } } }
/// <summary> /// To extract non MS data /// </summary> private void ExtractNonMSData() { IMsdrDataReader dataReader = new MassSpecDataReader(); dataReader.OpenDataFile(_NonMSdataFilename); INonmsDataReader nonMsReader = dataReader as INonmsDataReader; IDeviceInfo[] deviceInfo = nonMsReader.GetNonmsDevices(); if ((deviceInfo == null) || (deviceInfo.Length == 0)) { println("No Non MS device found"); } else { foreach (IDeviceInfo device in deviceInfo) { println("Device = " + device.DeviceName + " Ordinal number = " + device.OrdinalNumber.ToString() + " Device type = " + device.DeviceType.ToString()); #region DAD Signal & Spectrum if (device.DeviceType == DeviceType.DiodeArrayDetector) { //Extracting Signal Information ISignalInfo[] sigInfo = nonMsReader.GetSignalInfo(device, StoredDataType.Chromatograms); if (sigInfo.Length == 0) { println("No DAD signal found"); } else { IBDAChromData chromData = nonMsReader.GetSignal(sigInfo[0]); if ((chromData == null) || (chromData.TotalDataPoints == 0)) { println("No DAD signal found"); } else { int count = chromData.TotalDataPoints; double[] xArray = chromData.XArray; float[] yArray = chromData.YArray; // This information can be exported to a file on disk FileStream file = new FileStream(@"C:\temp\reportNew.csv", FileMode.Create, FileAccess.ReadWrite); TextWriter sw = new StreamWriter(file); sw.WriteLine("#Point,X(Minutes),Y(Response Units)"); for (int i = 0; i < xArray.Length; i++) { sw.WriteLine(i.ToString() + "," + xArray[i].ToString() + "," + yArray[i].ToString()); } sw.Close(); file.Close(); } } //Extracting TWC IBDAChromData chromDataTWC = nonMsReader.GetTWC(device); //compare this data with our own file if ((chromDataTWC == null) || (chromDataTWC.TotalDataPoints == 0)) { println("No TWC found"); } else { int dataPoints = chromDataTWC.TotalDataPoints; double[] xArrayTWC = chromDataTWC.XArray; float[] yArrayTWC = chromDataTWC.YArray; // Expoting this information to a file on disk FileStream fileTWC = new FileStream(@"C:\temp\reportTWC.csv", FileMode.Create, FileAccess.ReadWrite); TextWriter swTWC = new StreamWriter(fileTWC); swTWC.WriteLine("#Point,X(Minutes),Y(Response Units)"); for (int i = 0; i < xArrayTWC.Length; i++) { swTWC.WriteLine(i.ToString() + "," + xArrayTWC[i].ToString() + "," + yArrayTWC[i].ToString()); } swTWC.Close(); fileTWC.Close(); } //Extracting EWC IRange rangeSignal = new MinMaxRange(40, 250); IRange rangeRef = new MinMaxRange(40, 250); IBDAChromData chromDataEWC = nonMsReader.GetEWC(device, rangeSignal, rangeRef); if ((chromDataEWC == null) || (chromDataEWC.TotalDataPoints == 0)) { println("No EWC signal found"); } else { int dataPointsEWC = chromDataEWC.TotalDataPoints; double[] xArrayEWC = chromDataEWC.XArray; float[] yArrayEWC = chromDataEWC.YArray; // Expoting this information to a file on disk FileStream fileEWC = new FileStream(@"C:\temp\reportEWC.csv", FileMode.Create, FileAccess.ReadWrite); TextWriter swEWC = new StreamWriter(fileEWC); swEWC.WriteLine("#Point,X(Minutes),Y(Response Units)"); for (int i = 0; i < xArrayEWC.Length; i++) { swEWC.WriteLine(i.ToString() + "," + xArrayEWC[i].ToString() + "," + yArrayEWC[i].ToString()); } swEWC.Close(); fileEWC.Close(); } //UV Spectrum IRange range = new MinMaxRange(1.109, 1.409); IMinMaxRange ran = new MinMaxRange(1, 2); ran.Max = 1; IBDASpecData[] uvSpecData = nonMsReader.GetUVSpectrum(device, range); if (uvSpecData == null) { println("No UV signal found"); } else { foreach (IBDASpecData uvSpec in uvSpecData) { if (uvSpec.TotalDataPoints != 0) { int dataPopints = uvSpec.TotalDataPoints; double[] xArrayUV = uvSpec.XArray; float[] yArrayUV = uvSpec.YArray; // Expoting this information to a file on disk FileStream fileUV = new FileStream(@"C:\temp\reportUV.csv", FileMode.Create, FileAccess.ReadWrite); TextWriter swUV = new StreamWriter(fileUV); swUV.WriteLine("#Point,X(Nanometers),Y(mAU)"); for (int i = 0; i < xArrayUV.Length; i++) { swUV.WriteLine(i.ToString() + "," + xArrayUV[i].ToString() + "," + yArrayUV[i].ToString()); } swUV.Close(); fileUV.Close(); } else { println("No UV signal found"); } } } } #endregion #region InstrumentCurves - TCC if (device.DeviceType == DeviceType.ThermostattedColumnCompartment) { ISignalInfo[] sigInfo = nonMsReader.GetSignalInfo(device, StoredDataType.InstrumentCurves); if (sigInfo.Length == 0) { println("No TCC Curves found"); } else { IBDAChromData chromData = nonMsReader.GetSignal(sigInfo[0]); if ((chromData == null) || (chromData.TotalDataPoints == 0)) { println("No TCC Curves found"); } else { int count = chromData.TotalDataPoints; double[] xArray = chromData.XArray; float[] yArray = chromData.YArray; // Expoting this information to a file on disk FileStream file = new FileStream(@"C:\temp\reportInstrumentCurve.csv", FileMode.Create, FileAccess.ReadWrite); TextWriter sw = new StreamWriter(file); sw.WriteLine("#Point,X(Minutes),Y(Response Units)"); for (int i = 0; i < xArray.Length; i++) { sw.WriteLine(i.ToString() + "," + xArray[i].ToString() + "," + yArray[i].ToString()); } sw.Close(); file.Close(); } } } #endregion } } }
public void Load(string agilentDFolderPath, int minimumAssumedPrecursorChargeState, int maximumAssumedPrecursorChargeState, double absoluteThreshold, double relativeThresholdPercent, int maximumNumberOfPeaks, bool assignChargeStates, bool deisotope, int maximumThreads) { OnReportTaskWithoutProgress(new EventArgs()); IMsdrDataReader agilent_d = new MassSpecDataReader(); agilent_d.OpenDataFile(agilentDFolderPath); Dictionary <int, IBDASpecData> ms1s; if (GET_PRECURSOR_MZ_AND_INTENSITY_FROM_MS1) { ms1s = new Dictionary <int, IBDASpecData>(); } IMsdrPeakFilter ms1_peak_filter = new MsdrPeakFilter(); IMsdrPeakFilter ms2_peak_filter = new MsdrPeakFilter(); ms2_peak_filter.AbsoluteThreshold = absoluteThreshold; ms2_peak_filter.RelativeThreshold = relativeThresholdPercent; ms2_peak_filter.MaxNumPeaks = maximumNumberOfPeaks; ChargeStateAssignmentWrapper csaw = new ChargeStateAssignmentWrapper(); OnReportTaskWithProgress(new EventArgs()); object progress_lock = new object(); int spectra_processed = 0; int old_progress = 0; ParallelOptions parallel_options = new ParallelOptions(); parallel_options.MaxDegreeOfParallelism = maximumThreads; Parallel.For(0, (int)agilent_d.MSScanFileInformation.TotalScansPresent, parallel_options, row_number => { IMSScanRecord scan_record; lock (agilent_d) { scan_record = agilent_d.GetScanRecord(row_number); } if (scan_record.MSLevel == MSLevel.MSMS) { IBDASpecData agilent_spectrum; lock (agilent_d) { agilent_spectrum = agilent_d.GetSpectrum(row_number, ms1_peak_filter, ms2_peak_filter); } if (agilent_spectrum.TotalDataPoints > 0) { int polarity = 0; if (agilent_spectrum.IonPolarity == IonPolarity.Positive) { polarity = 1; } else if (agilent_spectrum.IonPolarity == IonPolarity.Negative) { polarity = -1; } int spectrum_number = row_number + 1; string scan_id = "scanId=" + agilent_spectrum.ScanId.ToString(); double precursor_mz = agilent_spectrum.MZOfInterest[0].Start; double precursor_intensity; if (GET_PRECURSOR_MZ_AND_INTENSITY_FROM_MS1) { GetAccurateMZAndIntensity(ms1s, agilent_d, agilent_spectrum.ParentScanId, ref precursor_mz, out precursor_intensity); } else { agilent_spectrum.GetPrecursorIntensity(out precursor_intensity); } int charge; agilent_spectrum.GetPrecursorCharge(out charge); if (polarity < 0) { charge = -charge; } List <MSPeak> peaks = null; if (!assignChargeStates) { peaks = new List <MSPeak>(agilent_spectrum.TotalDataPoints); for (int i = 0; i < agilent_spectrum.TotalDataPoints; i++) { peaks.Add(new MSPeak(agilent_spectrum.XArray[i], agilent_spectrum.YArray[i], 0, polarity)); } } for (int c = (ALWAYS_USE_PRECURSOR_CHARGE_STATE_RANGE || charge == 0 ? minimumAssumedPrecursorChargeState : charge); c <= (ALWAYS_USE_PRECURSOR_CHARGE_STATE_RANGE || charge == 0 ? maximumAssumedPrecursorChargeState : charge); c++) { if (assignChargeStates) { int[] peak_ids = new int[agilent_spectrum.TotalDataPoints]; double[] peak_mzs = new double[agilent_spectrum.TotalDataPoints]; double[] peak_intensities = new double[agilent_spectrum.TotalDataPoints]; for (int i = 0; i < agilent_spectrum.TotalDataPoints; i++) { peak_ids[i] = i; peak_mzs[i] = agilent_spectrum.XArray[i]; peak_intensities[i] = agilent_spectrum.YArray[i]; } int[] peak_charge_states = new int[agilent_spectrum.TotalDataPoints]; int[] peak_clusters = new int[agilent_spectrum.TotalDataPoints]; int num_peaks; lock (csaw) { csaw.SetParameters(IsotopeModel.Peptidic, 1, (short)c, false, ACCURACY_C0, ACCURACY_C1); num_peaks = csaw.AssignChargeStates(peak_ids, peak_mzs, peak_intensities, peak_charge_states, peak_clusters); } peaks = new List <MSPeak>(num_peaks); HashSet <int> observed_peak_clusters = new HashSet <int>(); for (int i = 0; i < num_peaks; i++) { bool isotopic_peak = observed_peak_clusters.Contains(peak_clusters[i]); if (!deisotope || !isotopic_peak) { peaks.Add(new MSPeak(peak_mzs[i], peak_intensities[i], peak_charge_states[i], polarity)); if (peak_clusters[i] > 0 && !isotopic_peak) { observed_peak_clusters.Add(peak_clusters[i]); } } } } double precursor_mass = MSPeak.MassFromMZ(precursor_mz, c); TandemMassSpectrum spectrum = new TandemMassSpectrum(agilentDFolderPath, spectrum_number, scan_id, null, scan_record.RetentionTime, FRAGMENTATION_METHOD, precursor_mz, precursor_intensity, c, precursor_mass, peaks); lock (this) { Add(spectrum); } } } } lock (progress_lock) { spectra_processed++; int new_progress = (int)((double)spectra_processed / agilent_d.MSScanFileInformation.TotalScansPresent * 100); if (new_progress > old_progress) { OnUpdateProgress(new ProgressEventArgs(new_progress)); old_progress = new_progress; } } }); agilent_d.CloseDataFile(); }
public void Load(string agilentDFolderPath, int minimumAssumedPrecursorChargeState, int maximumAssumedPrecursorChargeState, double absoluteThreshold, double relativeThresholdPercent, int maximumNumberOfPeaks, bool assignChargeStates, bool deisotope, int maximumThreads) { OnReportTaskWithoutProgress(new EventArgs()); IMsdrDataReader agilent_d = new MassSpecDataReader(); agilent_d.OpenDataFile(agilentDFolderPath); Dictionary<int, IBDASpecData> ms1s; if(GET_PRECURSOR_MZ_AND_INTENSITY_FROM_MS1) { ms1s = new Dictionary<int, IBDASpecData>(); } IMsdrPeakFilter ms1_peak_filter = new MsdrPeakFilter(); IMsdrPeakFilter ms2_peak_filter = new MsdrPeakFilter(); ms2_peak_filter.AbsoluteThreshold = absoluteThreshold; ms2_peak_filter.RelativeThreshold = relativeThresholdPercent; ms2_peak_filter.MaxNumPeaks = maximumNumberOfPeaks; ChargeStateAssignmentWrapper csaw = new ChargeStateAssignmentWrapper(); OnReportTaskWithProgress(new EventArgs()); object progress_lock = new object(); int spectra_processed = 0; int old_progress = 0; ParallelOptions parallel_options = new ParallelOptions(); parallel_options.MaxDegreeOfParallelism = maximumThreads; Parallel.For(0, (int)agilent_d.MSScanFileInformation.TotalScansPresent, parallel_options, row_number => { IMSScanRecord scan_record; lock(agilent_d) { scan_record = agilent_d.GetScanRecord(row_number); } if(scan_record.MSLevel == MSLevel.MSMS) { IBDASpecData agilent_spectrum; lock(agilent_d) { agilent_spectrum = agilent_d.GetSpectrum(row_number, ms1_peak_filter, ms2_peak_filter); } if(agilent_spectrum.TotalDataPoints > 0) { int polarity = 0; if(agilent_spectrum.IonPolarity == IonPolarity.Positive) { polarity = 1; } else if(agilent_spectrum.IonPolarity == IonPolarity.Negative) { polarity = -1; } int spectrum_number = row_number + 1; string scan_id = "scanId=" + agilent_spectrum.ScanId.ToString(); double precursor_mz = agilent_spectrum.MZOfInterest[0].Start; double precursor_intensity; if(GET_PRECURSOR_MZ_AND_INTENSITY_FROM_MS1) { GetAccurateMZAndIntensity(ms1s, agilent_d, agilent_spectrum.ParentScanId, ref precursor_mz, out precursor_intensity); } else { agilent_spectrum.GetPrecursorIntensity(out precursor_intensity); } int charge; agilent_spectrum.GetPrecursorCharge(out charge); if(polarity < 0) { charge = -charge; } List<MSPeak> peaks = null; if(!assignChargeStates) { peaks = new List<MSPeak>(agilent_spectrum.TotalDataPoints); for(int i = 0; i < agilent_spectrum.TotalDataPoints; i++) { peaks.Add(new MSPeak(agilent_spectrum.XArray[i], agilent_spectrum.YArray[i], 0, polarity)); } } for(int c = (ALWAYS_USE_PRECURSOR_CHARGE_STATE_RANGE || charge == 0 ? minimumAssumedPrecursorChargeState : charge); c <= (ALWAYS_USE_PRECURSOR_CHARGE_STATE_RANGE || charge == 0 ? maximumAssumedPrecursorChargeState : charge); c++) { if(assignChargeStates) { int[] peak_ids = new int[agilent_spectrum.TotalDataPoints]; double[] peak_mzs = new double[agilent_spectrum.TotalDataPoints]; double[] peak_intensities = new double[agilent_spectrum.TotalDataPoints]; for(int i = 0; i < agilent_spectrum.TotalDataPoints; i++) { peak_ids[i] = i; peak_mzs[i] = agilent_spectrum.XArray[i]; peak_intensities[i] = agilent_spectrum.YArray[i]; } int[] peak_charge_states = new int[agilent_spectrum.TotalDataPoints]; int[] peak_clusters = new int[agilent_spectrum.TotalDataPoints]; int num_peaks; lock(csaw) { csaw.SetParameters(IsotopeModel.Peptidic, 1, (short)c, false, ACCURACY_C0, ACCURACY_C1); num_peaks = csaw.AssignChargeStates(peak_ids, peak_mzs, peak_intensities, peak_charge_states, peak_clusters); } peaks = new List<MSPeak>(num_peaks); HashSet<int> observed_peak_clusters = new HashSet<int>(); for(int i = 0; i < num_peaks; i++) { bool isotopic_peak = observed_peak_clusters.Contains(peak_clusters[i]); if(!deisotope || !isotopic_peak) { peaks.Add(new MSPeak(peak_mzs[i], peak_intensities[i], peak_charge_states[i], polarity)); if(peak_clusters[i] > 0 && !isotopic_peak) { observed_peak_clusters.Add(peak_clusters[i]); } } } } double precursor_mass = MSPeak.MassFromMZ(precursor_mz, c); TandemMassSpectrum spectrum = new TandemMassSpectrum(agilentDFolderPath, spectrum_number, scan_id, null, scan_record.RetentionTime, FRAGMENTATION_METHOD, precursor_mz, precursor_intensity, c, precursor_mass, peaks); lock(this) { Add(spectrum); } } } } lock(progress_lock) { spectra_processed++; int new_progress = (int)((double)spectra_processed / agilent_d.MSScanFileInformation.TotalScansPresent * 100); if(new_progress > old_progress) { OnUpdateProgress(new ProgressEventArgs(new_progress)); old_progress = new_progress; } } }); agilent_d.CloseDataFile(); }