def _makeScan(self, scanData, dataType): """Make scan object from raw data.""" # parse data as peaklist (discrete points) if dataType == 'peaklist' or (dataType==None and len(scanData['data'])<3000): buff = [] for point in scanData['data']: buff.append(obj_peak.peak(point[0], point[1])) scan = obj_scan.scan(peaklist=obj_peaklist.peaklist(buff)) # parse data as spectrum (continuous line) else: scan = obj_scan.scan(profile=scanData['data']) # set metadata scan.title = scanData['title'] scan.scanNumber = scanData['scanNumber'] scan.parentScanNumber = scanData['parentScanNumber'] scan.msLevel = scanData['msLevel'] scan.polarity = scanData['polarity'] scan.retentionTime = scanData['retentionTime'] scan.totIonCurrent = scanData['totIonCurrent'] scan.basePeakMZ = scanData['basePeakMZ'] scan.basePeakIntensity = scanData['basePeakIntensity'] scan.precursorMZ = scanData['precursorMZ'] scan.precursorIntensity = scanData['precursorIntensity'] scan.precursorCharge = scanData['precursorCharge'] return scan
def _makeScan(self, scanData, dataType): """Make scan object from raw data.""" # parse data as peaklist (discrete points) if dataType == 'peaklist' or (dataType == None and len(scanData['data']) < 3000): buff = [] for point in scanData['data']: buff.append(obj_peak.peak(point[0], point[1])) scan = obj_scan.scan(peaklist=obj_peaklist.peaklist(buff)) # parse data as spectrum (continuous line) else: scan = obj_scan.scan(profile=scanData['data']) # set metadata scan.title = scanData['title'] scan.scanNumber = scanData['scanNumber'] scan.parentScanNumber = scanData['parentScanNumber'] scan.msLevel = scanData['msLevel'] scan.polarity = scanData['polarity'] scan.retentionTime = scanData['retentionTime'] scan.totIonCurrent = scanData['totIonCurrent'] scan.basePeakMZ = scanData['basePeakMZ'] scan.basePeakIntensity = scanData['basePeakIntensity'] scan.precursorMZ = scanData['precursorMZ'] scan.precursorIntensity = scanData['precursorIntensity'] scan.precursorCharge = scanData['precursorCharge'] return scan
def _makeScan(self, scanData): """Make scan object from raw data.""" # parse peaks points = self._parsePoints(scanData) if scanData['spectrumType'] == 'discrete': for x, p in enumerate(points): points[x] = obj_peak.peak(p[0], p[1]) scan = obj_scan.scan(peaklist=obj_peaklist.peaklist(points)) else: scan = obj_scan.scan(profile=points) # set metadata scan.title = scanData['title'] scan.scanNumber = scanData['scanNumber'] scan.parentScanNumber = scanData['parentScanNumber'] scan.msLevel = scanData['msLevel'] scan.polarity = scanData['polarity'] scan.retentionTime = scanData['retentionTime'] scan.totIonCurrent = scanData['totIonCurrent'] scan.basePeakMZ = scanData['basePeakMZ'] scan.basePeakIntensity = scanData['basePeakIntensity'] scan.precursorMZ = scanData['precursorMZ'] scan.precursorIntensity = scanData['precursorIntensity'] scan.precursorCharge = scanData['precursorCharge'] return scan
def envmono(isotopes, charge, intensity='maximum'): """Calculate envelope centroid for given isotopes. isotopes (mspy.peaklist or list of mspy.peak) - envelope isotopes charge (int) - peak charge intensity (maximum | sum | average) - envelope intensity type """ # check isotopes if len(isotopes) == 0: return None # check peaklist object if not isinstance(isotopes, obj_peaklist.peaklist): isotopes = obj_peaklist.peaklist(isotopes) # calc averagine avFormula = averagine(isotopes.basepeak.mz, charge=charge, composition=AVERAGE_AMINO) avPattern = avFormula.pattern(fwhm=0.1, threshold=0.001, charge=charge) avPattern = obj_peaklist.peaklist(avPattern) # get envelope centroid points = numpy.array([(p.mz, p.intensity) for p in isotopes]) centroid = labelpeak(points, mz=isotopes.basepeak.mz, pickingHeight=0.8) if not centroid: centroid = isotopes.basepeak # get averagine centroid points = numpy.array([(p.mz, p.intensity) for p in avPattern]) avCentroid = labelpeak(points, mz=avPattern.basepeak.mz, pickingHeight=0.8) if not avCentroid: avCentroid = avPattern.basepeak # align profiles and get monoisotopic mass shift = centroid.mz - avCentroid.mz errors = [(abs(p.mz - avPattern.basepeak.mz - shift), p.mz) for p in isotopes] mz = min(errors)[1] - (avPattern.basepeak.mz - avFormula.mz(charge)[0]) # sum intensities sumIntensity = 0 for isotope in isotopes: sumIntensity += isotope.intensity # get ai, base and sn base = isotopes.basepeak.base sn = isotopes.basepeak.sn fwhm = isotopes.basepeak.fwhm if intensity == 'sum': ai = base + sumIntensity elif intensity == 'average': ai = base + sumIntensity / len(isotopes) else: ai = isotopes.basepeak.ai if isotopes.basepeak.sn: sn = (ai - base) * isotopes.basepeak.sn / (isotopes.basepeak.ai - base) # make peak peak = obj_peak.peak(mz=mz, ai=ai, base=base, sn=sn, fwhm=fwhm, isotope=0) return peak
def labelpoint(signal, mz, baseline=None): """Return labeled peak at given x-value. signal (numpy array) - signal data points mz (float) - x-value to label baseline (numpy array) - signal baseline """ # check signal type if not isinstance(signal, numpy.ndarray): raise TypeError, "Signal must be NumPy array!" # check baseline type if baseline != None and not isinstance(baseline, numpy.ndarray): raise TypeError, "Baseline must be NumPy array!" # check signal data if len(signal) == 0: return None # check m/z value if mz <= 0: return None # get peak intensity ai = mod_signal.intensity(signal, mz) if not ai: return None # get peak baseline and s/n base = 0.0 sn = None if baseline == None: base, noise = mod_signal.noise(signal, x=mz) if noise: sn = (ai - base) / noise else: idx = mod_signal.locate(baseline, mz) if (idx > 0) and (idx < len(baseline)): base = mod_signal.interpolate( (baseline[idx-1][0], baseline[idx-1][1]), (baseline[idx][0], baseline[idx][1]), x=mz) noise = mod_signal.interpolate( (baseline[idx-1][0], baseline[idx-1][2]), (baseline[idx][0], baseline[idx][2]), x=mz) if noise: sn = (ai - base) / noise # check peak intensity if ai <= base: return None # get peak fwhm height = base + (ai - base) * 0.5 fwhm = mod_signal.width(signal, mz, height) # make peak object peak = obj_peak.peak(mz=mz, ai=ai, base=base, sn=sn, fwhm=fwhm) return peak
def _checkPeak(self, item): """Check item to be a valid peak.""" # peak instance if isinstance(item, obj_peak.peak): return item # make peak from list or tuple elif type(item) in (list, tuple) and len(item)==2: return obj_peak.peak(item[0], item[1]) # not valid peak data raise TypeError, 'Item must be a peak object or list/tuple of two floats!'
def _makeScan(self, scanData, dataType): """Make scan object from raw data.""" # parse data as peaklist (discrete points) if dataType == 'discrete': buff = [] for point in scanData: buff.append(obj_peak.peak(point[0], point[1])) scan = obj_scan.scan(peaklist=obj_peaklist.peaklist(buff)) # parse data as spectrum (continuous line) else: scan = obj_scan.scan(profile=scanData) return scan
def swap(self): """Swap data between profile and peaklist.""" # make new profile profile = [[i.mz, i.ai] for i in self.peaklist] profile = numpy.array(profile) # make new peaklist peaks = [obj_peak.peak(i[0], i[1]) for i in self.profile] peaks = obj_peaklist.peaklist(peaks) # update scan self.profile = profile self.peaklist = peaks # clear buffers self.reset()
def labelscan(signal, minX=None, maxX=None, pickingHeight=0.75, absThreshold=0., relThreshold=0., snThreshold=0., baseline=None): """Return centroided peaklist for given data points. signal (numpy array) - signal data points minX (float) - x-range start maxX (float) - x-range end pickingHeight (float) - centroiding height absThreshold (float) - absolute intensity threshold relThreshold (float) - relative intensity threshold snThreshold (float) - signal to noise threshold baseline (numpy array) - signal baseline """ # check signal type if not isinstance(signal, numpy.ndarray): raise TypeError, "Signal must be NumPy array!" # check baseline type if baseline != None and not isinstance(baseline, numpy.ndarray): raise TypeError, "Baseline must be NumPy array!" # crop data if minX != None and maxX != None: i1 = mod_signal.locate(signal, minX) i2 = mod_signal.locate(signal, maxX) signal = signal[i1:i2] # check data points if len(signal) == 0: return obj_peaklist.peaklist([]) # get local maxima buff = [] basepeak = mod_signal.basepeak(signal) threshold = max(signal[basepeak][1] * relThreshold, absThreshold) for peak in mod_signal.maxima(signal): if peak[1] >= threshold: buff.append( [peak[0], peak[1], 0., None, None] ) # mz, ai, base, sn, fwhm CHECK_FORCE_QUIT() # get peaks baseline and s/n basepeak = 0.0 if baseline != None: for peak in buff: idx = mod_signal.locate(baseline, peak[0]) if (idx > 0) and (idx < len(baseline)): p1 = baseline[idx-1] p2 = baseline[idx] peak[2] = mod_signal.interpolate( (p1[0], p1[1]), (p2[0], p2[1]), x=peak[0]) noise = mod_signal.interpolate( (p1[0], p1[2]), (p2[0], p2[2]), x=peak[0]) intens = peak[1] - peak[2] if noise: peak[3] = intens / noise if intens > basepeak: basepeak = intens CHECK_FORCE_QUIT() # remove peaks bellow threshold threshold = max(basepeak * relThreshold, absThreshold) candidates = [] for peak in buff: if peak[0] > 0 and (peak[1] - peak[2]) >= threshold and (not peak[3] or peak[3] >= snThreshold): candidates.append(peak) # make centroides if pickingHeight < 1.: buff = [] previous = None for peak in candidates: CHECK_FORCE_QUIT() # calc peak height h = ((peak[1]-peak[2]) * pickingHeight) + peak[2] # get centroid indexes idx = mod_signal.locate(signal, peak[0]) if (idx == 0) or (idx == len(signal)): continue ileft = idx-1 while (ileft > 0) and (signal[ileft][1] > h): ileft -= 1 iright = idx while (iright < len(signal)-1) and (signal[iright][1] > h): iright += 1 # calculate peak mz leftMZ = mod_signal.interpolate(signal[ileft], signal[ileft+1], y=h) rightMZ = mod_signal.interpolate(signal[iright-1], signal[iright], y=h) peak[0] = (leftMZ + rightMZ)/2. # get peak intensity intens = mod_signal.intensity(signal, peak[0]) if intens and intens <= peak[1]: peak[1] = intens else: continue # try to group with previous peak if previous != None and leftMZ < previous: if peak[1] > buff[-1][1]: buff[-1] = peak previous = rightMZ else: buff.append(peak) previous = rightMZ # store as candidates candidates = buff CHECK_FORCE_QUIT() # get peaks baseline and s/n basepeak = 0.0 if baseline != None: for peak in candidates: idx = mod_signal.locate(baseline, peak[0]) if (idx > 0) and (idx < len(baseline)): p1 = baseline[idx-1] p2 = baseline[idx] peak[2] = mod_signal.interpolate( (p1[0], p1[1]), (p2[0], p2[1]), x=peak[0]) noise = mod_signal.interpolate( (p1[0], p1[2]), (p2[0], p2[2]), x=peak[0]) intens = peak[1] - peak[2] if noise: peak[3] = intens / noise if intens > basepeak: basepeak = intens CHECK_FORCE_QUIT() # remove peaks bellow threshold and calculate fwhm threshold = max(basepeak * relThreshold, absThreshold) centroides = [] for peak in candidates: if peak[0] > 0 and (peak[1] - peak[2]) >= threshold and (not peak[3] or peak[3] >= snThreshold): peak[4] = mod_signal.width(signal, peak[0], (peak[2] + ((peak[1] - peak[2]) * 0.5))) centroides.append(obj_peak.peak(mz=peak[0], ai=peak[1], base=peak[2], sn=peak[3], fwhm=peak[4])) # return peaklist object return obj_peaklist.peaklist(centroides)
def envcentroid(isotopes, pickingHeight=0.5, intensity='maximum'): """Calculate envelope centroid for given isotopes. isotopes (mspy.peaklist or list of mspy.peak) envelope isotopes pickingHeight (float) - centroiding height intensity (maximum | sum | average) envelope intensity type """ # check isotopes if len(isotopes) == 0: return None elif len(isotopes) == 1: return isotopes[0] # check peaklist object if not isinstance(isotopes, obj_peaklist.peaklist): isotopes = obj_peaklist.peaklist(isotopes) # get sums sumMZ = 0. sumIntensity = 0. for isotope in isotopes: sumMZ += isotope.mz * isotope.intensity sumIntensity += isotope.intensity # get average m/z mz = sumMZ / sumIntensity # get ai, base and sn base = isotopes.basepeak.base sn = isotopes.basepeak.sn fwhm = isotopes.basepeak.fwhm if intensity == 'sum': ai = base + sumIntensity elif intensity == 'average': ai = base + sumIntensity / len(isotopes) else: ai = isotopes.basepeak.ai if isotopes.basepeak.sn: sn = (ai - base) * isotopes.basepeak.sn / (isotopes.basepeak.ai - base) # get envelope width minInt = isotopes.basepeak.intensity * pickingHeight i1 = None i2 = None for x, isotope in enumerate(isotopes): if isotope.intensity >= minInt: i2 = x if i1 == None: i1 = x mz1 = isotopes[i1].mz mz2 = isotopes[i2].mz if i1 != 0: mz1 = mod_signal.interpolate((isotopes[i1-1].mz, isotopes[i1-1].ai), (isotopes[i1].mz, isotopes[i1].ai), y=minInt) if i2 < len(isotopes)-1: mz2 = mod_signal.interpolate((isotopes[i2].mz, isotopes[i2].ai), (isotopes[i2+1].mz, isotopes[i2+1].ai), y=minInt) if mz1 != mz2: fwhm = abs(mz2 - mz1) # make peak peak = obj_peak.peak(mz=mz, ai=ai, base=base, sn=sn, fwhm=fwhm) return peak