def show_images_get(): dataset = bottle.request.params.get('dataset', app.paths.iterkeys().next()) formula = bottle.request.params.get('formula', '') tolerance = float(bottle.request.params.get('tolerance', 5.0)) resolution = float(bottle.request.params.get('resolution', 1e5)) selected_adduct = bottle.request.params.get('adduct', 'H') hs_removal = bottle.request.GET.get('hs_removal', False) k = int(bottle.request.params.get('npeaks', 4)) if hs_removal == 'on': hs_removal = True pts = float(bottle.request.params.get('pts', 10)) cutoff = float(bottle.request.params.get('pyisocalc_cutoff', 1e-3)) adducts = ['H', 'K', 'Na'] isotope_patterns = {} for adduct in adducts: sf = pyisocalc.SumFormulaParser.parse_string(formula + adduct) raw_pattern = pyisocalc.isodist(sf, cutoff) fwhm = raw_pattern.get_spectrum()[0][0] / resolution pattern = pyisocalc.apply_gaussian(raw_pattern, fwhm, pts, exact=True) mzs, intensities = map(np.array, pattern.get_spectrum(source='centroids')) if len(mzs) > k: order = intensities.argsort()[::-1] mzs = mzs[order][:k] intensities = intensities[order][:k] order = mzs.argsort() mzs = mzs[order] intensities = intensities[order] datacube = app.get_datacube(dataset, mzs, tolerance) if hs_removal: for img in datacube.xic: if len(img) > 0: pc = np.percentile(img, 99) img[img > pc] = pc chaos = measure_of_chaos(datacube.xic_to_image(0), 30, overwrite=False) iso_corr = isotope_pattern_match(datacube.xic, intensities) img_corr = 1.0 # return 1 if there's a single peak if len(intensities[1:]) > 1: img_corr = isotope_image_correlation(datacube.xic, weights=intensities[1:]) stats = {'measure of chaos': chaos, 'image correlation score': img_corr, 'isotope pattern score': iso_corr} isotope_patterns[adduct] = (mzs, intensities, stats) return bottle.template('show_images', hs_removal=hs_removal, isotope_patterns=isotope_patterns, formula=formula, selected_adduct=selected_adduct, pretty_formula=re.sub(r"(\d+)", r"<sub>\1</sub>", formula), resolution=resolution, tol=tolerance, datasets=app.paths.keys(), npeaks=k, selected_dataset=dataset)
def calculate_isotope_patterns(sum_formulae,adduct,isocalc_resolution,isocalc_do_centroid = True, charge=1): ### Generate a mz list of peak centroids for each sum formula with the given adduct mz_list={} for n, sum_formula in enumerate(sum_formulae): sf = pyisocalc.SumFormulaParser.parse_string(str(sum_formula + adduct)) raw_pattern = pyisocalc.isodist(sf, cutoff=1e-4, charge=charge) mz = raw_pattern.get_spectrum()[0][0] # if mz < 200 or mz > 2000: # continue fwhm = mz / isocalc_resolution # TODO: resolution = resolution(mz) isotope_ms = pyisocalc.apply_gaussian(raw_pattern, fwhm, exact=False) if not sum_formula in mz_list: mz_list[sum_formula] = {} mzs, intensities = isotope_ms.get_spectrum(source='centroids') order = intensities.argsort()[::-1][:5] mz_list[sum_formula][adduct] = (mzs[order], intensities[order]) return mz_list
def generate_patterns(formulas_fn, resolution_func, mz_range): mz_min, mz_max = mz_range patterns = {} adducts = ['H', 'K', 'Na'] formulae = [s.strip() for s in open(formulas_fn).readlines()] for f in formulae: for a in adducts: sf = pyisocalc.SumFormulaParser.parse_string(f + a) raw_pattern = pyisocalc.isodist(sf, cutoff=1e-4, charge=1) mz = raw_pattern.get_spectrum()[0][0] if mz < mz_min or mz > mz_max: continue fwhm = mz / resolution_func(mz) mzs, intensities = pyisocalc.apply_gaussian(raw_pattern, fwhm, exact=False).get_spectrum(source="centroids") mzs = np.array(mzs) intensities = np.array(intensities) order = np.argsort(intensities)[::-1] patterns[(f, a)] = (mzs[order], intensities[order]) return patterns