def getLocalMax(points, groupWidth, adaptiveNoise=False): """Get possible peaks from the points using local maxima. points: (numpy.array) spectrum points groupWidth: (float) peaks within this range will be grouped together adaptiveNoise: (bool) calculate noise level separately for each peak """ groupWidth /= 2 buff = [] previous = None localMax = points[0] growing = True # get local maxima for point in points[1:]: # remember last maximum if localMax[1] <= point[1]: localMax = point growing = True # store local maximum elif growing and localMax[1] > point[1]: # try to group with previous or add new peak if previous!=None and (localMax[0]-groupWidth)<previous[0]: if localMax[1] > previous[1]: buff[-1] = (objects.peak(mz=localMax[0], intensity=localMax[1])) previous = localMax else: buff.append(objects.peak(mz=localMax[0], intensity=localMax[1])) previous = localMax localMax = point growing = False else: localMax = point # get baseline and s/n ratio noiseLevel, noiseWidth = getNoise(points) for peak in buff: if adaptiveNoise: noiseLevel, noiseWidth = getNoise(points, mz=peak.mz) peak.baseline = noiseLevel if noiseWidth != 0: sn = (peak.intensity-noiseLevel) / noiseWidth peak.sn = round(sn,3) return objects.peaklist(buff)
def findPoint(points, mz, adaptiveNoise=False): """Find peak for given m/z value. points: (numpy.array) spectrum points mz: (float) m/z value adaptiveNoise: (bool) calculate noise level separately for each peak """ # get intensity i = _getIndex(points, mz) intensity = _interpolateLine(points[i], points[i-1], mz) # get noise if adaptiveNoise: noiseLevel, noiseWidth = getNoise(points, mz=mz) else: noiseLevel, noiseWidth = getNoise(points) # get S/N if noiseWidth != 0: sn = (intensity-noiseLevel) / noiseWidth sn = round(sn,3) else: sn = None # make peak if intensity > noiseLevel: peak = objects.peak(mz=mz, intensity=intensity, baseline=noiseLevel, sn=sn) return peak else: return False
def findPeak(points, mzRange, pickingHeight, adaptiveNoise=False): """Find one peak in given m/z range. points: (numpy.array) spectrum points mzRange: (list) m/z range where to find the peak pickingHeight: (float) peak intensity height where the mass is picked in %/100 adaptiveNoise: (bool) calculate noise level separately for each peak """ # get current selection i1 = _getIndex(points, mzRange[0]) i2 = _getIndex(points, mzRange[1]) selection = points[i1:i2] # get local max for current selection localMax = [0,0] for point in selection: if point[1] > localMax[1]: localMax = point # make peak peak = objects.peak(mz=localMax[0], intensity=localMax[1]) # get centroid maxWidth = mzRange[1]-mzRange[0] centroids = getCentroids(points, [peak], pickingHeight, maxWidth, adaptiveNoise) if centroids: return centroids[0] else: return None
def getSpectrum(self, discrete=False): """Get spectrum from document.""" # parse data data = self._parseData() if not data: return False # parse data as peaklist (discrete points) if discrete: for x, p in enumerate(data): data[x] = objects.peak(p[0], p[1]) spectrum = objects.scan(peaks=data) # parse data as spectrum (continuous line) else: spectrum = objects.scan(points=data) return spectrum
def getSpectrum(self, scanNumber=None): """Get spectrum from document.""" # init parser handler = scanHandler(scanNumber) parser = xml.sax.make_parser() parser.setContentHandler(handler) # parse document try: document = file(self.path) parser.parse(document) document.close() scan = handler.scan except stopParsing: scan = handler.scan except xml.sax.SAXException: return False # check data if not scan: return False # parse peaks try: points = self._parsePoints(scan) except: return False # parse data as peaklist (discrete points) if scan['spectrumType'] == 'discrete': for x, p in enumerate(points): points[x] = objects.peak(p[0], p[1]) spectrum = objects.scan(peaks=points) # parse data as spectrum (continuous line) else: spectrum = objects.scan(points=points) # set metadata if scan['scanNumber']: spectrum.scanNumber = int(scan['scanNumber']) if scan['parentScanNumber']: spectrum.parentScanNumber = int(scan['parentScanNumber']) if scan['msLevel']: spectrum.msLevel = int(scan['msLevel']) if scan['polarity']: spectrum.polarity = scan['polarity'] if scan['retentionTime']: spectrum.retentionTime = scan['retentionTime'] if scan['totIonCurrent']: spectrum.totIonCurrent = float(scan['totIonCurrent']) if scan['basePeakMz']: spectrum.basePeakMZ = float(scan['basePeakMz']) if scan['basePeakIntensity']: spectrum.basePeakIntensity = float(scan['basePeakIntensity']) if scan['precursorMz']: spectrum.precursorMZ = float(scan['precursorMz']) if scan['precursorIntensity']: spectrum.precursorIntensity = float(scan['precursorIntensity']) return spectrum