private void CalculateTICisolationWindow(RawScan previousFullMS, double precursormz, double window) { double intensitySum = 0.0; double relativeIntensity = 0.0; if (previousFullMS != null) { double[,] msscan = previousFullMS.Data; int msscanLength = msscan.GetLength(1); double lowerbound = precursormz - window / 2; double upperbound = precursormz + window / 2; for (int i = 0; i < msscanLength; i++) { if (msscan[0, i] > lowerbound && msscan[0, i] < upperbound) { intensitySum += msscan[1, i]; } } if (intensitySum > 0) { relativeIntensity = this.Tic / intensitySum; } } this.IsolationWindowTic = intensitySum; this.IsolationWindowTicRelative = relativeIntensity; }
public Ms2Scan(RawScan rawScan, double signalToNoiseThreshold, RawScan previousFullMS) : base(rawScan, signalToNoiseThreshold) { SetPrecursorMass(rawScan.Precursormz); CalculateSignalPartAbove(rawScan.Data, rawScan.Precursormz, IsolationWindow);//parameter here to shift outside precursor window? CalculateTICisolationWindow(previousFullMS, rawScan.Precursormz, IsolationWindow); IsPrecursorBP(rawScan.Precursormz, rawScan.BasePeakMass); }
/// <summary> /// Reads raw data. Puts spectra into a thread safe queue. Closes queue when done. Parses the rawfile-log into the statusLog object /// </summary> /// <param name="raw">Raw file</param> /// <param name="rawScanQueue">Thread safe queue</param> private void ReadRawFile(IXRawfile5 raw, BlockingCollection <RawScan> rawScanQueue) { int firstScanNumber = -1; raw.GetFirstSpectrumNumber(ref firstScanNumber); int lastScanNumber = -1; raw.GetLastSpectrumNumber(ref lastScanNumber); for (int scanNumber = firstScanNumber; scanNumber <= lastScanNumber; scanNumber++) { string scanFilter = null; raw.GetFilterForScanNum(scanNumber, ref scanFilter); //read scan header into key/value arrays object keyRef = null; object valueRef = null; int indexRef = 0; raw.GetTrailerExtraForScanNum(scanNumber, ref keyRef, ref valueRef, ref indexRef); string[] trailerKeys = (string[])keyRef; string[] trailerValues = (string[])valueRef; //read tic and base peak mass using dummy variables double tic = 0.0; int int1 = 0; int int2 = 0; int int3 = 0; double double1 = 0.0; double double2 = 0.0; double double3 = 0.0; double basePeakMass = 0.0; double double5 = 0.0; double double6 = 0.0; raw.GetScanHeaderInfoForScanNum(scanNumber, ref int1, ref double1, ref double2, ref double3, ref tic, ref basePeakMass, ref double5, ref int2, ref int3, ref double6); //read data (mz,int,...) using dummy variables object labels_obj = null; object flags_obj = null; raw.GetLabelData(ref labels_obj, ref flags_obj, ref scanNumber); double[,] data = (double[, ])labels_obj; //read precursorMz double precursorMz = 0.0; raw.GetPrecursorMassForScanNum(scanNumber, 2, ref precursorMz); RawScan rawScan = new RawScan(scanNumber, scanFilter, tic, trailerKeys, trailerValues, data, precursorMz, basePeakMass); rawScanQueue.Add(rawScan); //read status log double rtLog = 0.0; object statuslogKeys = null; object statuslogValues = null; int statuslogN = 0; raw.GetStatusLogForScanNum(scanNumber, ref rtLog, ref statuslogKeys, ref statuslogValues, ref statuslogN); statusLog.Add(rtLog, (string[])statuslogKeys, (string[])statuslogValues); } rawScanQueue.CompleteAdding(); Log.Information("Read all spectra in base module"); }
protected void ParseScanHeader(RawScan rawScan) { double _injectionTime = 0.0; double _ionCountFromRawOvFtT = 0.0; double _isolationWidth = 0.0; int _chargeState = 0; double _ctcd = 0.0; int _lockMassNo = 0; double _lockMassCorr = 0.0; string[] theStringKeys = (string[])rawScan.TrailerExtraKeys; string[] theStringValues = (string[])rawScan.TrailerExtraValues; for (int i = 0; i < theStringKeys.Length; i++) { string trimmed = theStringKeys[i].Trim(new Char[] { ' ', '*', '.', ';', ':' }); switch (trimmed) { case "Ion Injection Time (ms)": Double.TryParse(theStringValues[i], out _injectionTime); break; case "RawOvFtT": Double.TryParse(theStringValues[i], out _ionCountFromRawOvFtT); break; case "Charge State": Int32.TryParse(theStringValues[i], out _chargeState); break; case "MS2 Isolation Width": Double.TryParse(theStringValues[i], out _isolationWidth); break; case "LM m/z-Correction (ppm)": Double.TryParse(theStringValues[i], out _lockMassCorr); break; case "CTCD Comp": Double.TryParse(theStringValues[i], out _ctcd); break; case "PrOSA Comp": Double.TryParse(theStringValues[i], out _ctcd); break; } } this.ScanNumber = rawScan.ScanNumber; this.InjectionTime = _injectionTime; this.IonCountFromRawOvFtT = _ionCountFromRawOvFtT; this.ChargeState = _chargeState; this.IsolationWindow = _isolationWidth; this.LockMassCorr = _lockMassCorr; this.LockMassNo = _lockMassNo; this.Ctcd = _ctcd; this.Tic = rawScan.Tic; }
public MsScan(RawScan rawScan, double signalToNoiseThreshold, List <Tuple <int, double, int> > polymerTargetList, int polymerCount, List <Adduct> adducts, double massError) : base(rawScan, signalToNoiseThreshold) { Tuple <double, int> maxMz = GetMaxIntensity(rawScan.Data); if (maxMz.Item2 > 0) { List <Tuple <int, double, int> > targetList = new List <Tuple <int, double, int> >(); targetList.AddRange(polymerTargetList); int precursorIndex, adductIndex; ExtractAdducts(polymerCount, adducts, maxMz, targetList, out precursorIndex, out adductIndex); double[] targetIntensities = GetIntensityByMatching(rawScan, massError, targetList); SetPolymersAndAdducts(polymerCount, targetList, precursorIndex, adductIndex, targetIntensities); } else { this.Polymer = new double[polymerCount]; this.Adduct = new double[adducts.Count]; } }
private static double[] GetIntensityByMatching(RawScan rawScan, double massError, List <Tuple <int, double, int> > targetList) { double[] targetIntensities = new double[targetList.Count]; int sortedMzAscendingLength = targetList.Count; double[,] msscan = rawScan.Data; int msscanLength = msscan.GetLength(1); int t = 0; int o = 0; int charge = (int)(msscan[5, o] + 0.5); while (t < sortedMzAscendingLength && o < msscanLength) { int specificScan = o; double[] curscan = new double[] { msscan[0, specificScan], msscan[1, specificScan], msscan[2, specificScan], msscan[3, specificScan], msscan[4, specificScan], msscan[5, specificScan] }; double mass_difference = (msscan[0, o] - targetList[t].Item2) / targetList[t].Item2 * 1e6; if (Math.Abs(mass_difference) <= massError && targetList[t].Item3 == charge) { if (msscan[1, o] > targetIntensities[t]) { targetIntensities[t] = msscan[1, o]; } t++; } else if (mass_difference < 0) { o++; if (o < msscanLength) { charge = (short)(msscan[5, o] + 0.5); } } else if (mass_difference >= 0) { t++; } } return(targetIntensities); }
// Relies on assumption that the rawscans are sorted, i.e. the currentFullMS is set for each ms2 scan private Tuple <List <MsScan>, List <Ms2Scan> > ParseSpectra(BlockingCollection <RawScan> rawScanQueue, SettingsForAnalysis fixedSettings) { List <Tuple <int, double, int> > polymerTargetList = ExtractPolymers(fixedSettings.Polymers); List <MsScan> msScanList = new List <MsScan>(1000); List <Ms2Scan> ms2ScanList = new List <Ms2Scan>(1000); RawScan currentFullMS = null; foreach (RawScan rawScan in rawScanQueue.GetConsumingEnumerable()) { if (rawScan.IsMS2()) { ms2ScanList.Add(new Ms2Scan(rawScan, fixedSettings.StoNthreshold, currentFullMS)); } else { currentFullMS = rawScan; msScanList.Add(new MsScan(rawScan, fixedSettings.StoNthreshold, polymerTargetList, fixedSettings.Polymers.Count, fixedSettings.Adducts, fixedSettings.BaseMassTolerance)); } } return(new Tuple <List <MsScan>, List <Ms2Scan> >(msScanList, ms2ScanList)); }
public MsScanAbstract(RawScan rawScan, double signalToNoiseThreshold) { ParseScanHeader(rawScan); SetSignalToNoiseAsAverageAboveThreshold(signalToNoiseThreshold, rawScan.Data); }