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