Ejemplo n.º 1
0
def rate_spectrum(spid=None):
    session_init(session, db)
    error = None
    if session['username'] is None:
        error = 'must be logged in to rate spectrum'
        return redirect(url_for('spectrum', spid=spid, error=error))

    pid = session['person_id']
    s = db.get_spectrum(spid)
    if s is None:
        error = 'Could not find Spectrum #%i' % spid
        return render_template('ptable', error=error)

    opts = parse_spectrum(s, db)
    score = 3
    review = '<review>'
    for _s, _r, _d, _p in spectrum_ratings(db, spid):
        if int(_p) == int(pid):
            score = _s
            review = _r
    spid = s.id
    spname = s.name

    return render_template('ratespectrum.html',
                           error=error,
                           spectrum_id=spid,
                           spectrum_name=spname,
                           person_id=pid,
                           score=score,
                           review=review)
Ejemplo n.º 2
0
def rate_spectrum(spid=None):
    session_init(session, db)
    error=None
    if session['username'] is None:
        error='must be logged in to rate spectrum'
        return redirect(url_for('spectrum', spid=spid, error=error))

    pid = session['person_id']
    s  = db.get_spectrum(spid)
    if s is None:
        error = 'Could not find Spectrum #%i' % spid
        return render_template('ptable', error=error)

    opts = parse_spectrum(s, db)
    score = 3
    review = '<review>'
    for _s, _r, _d, _p in spectrum_ratings(db, spid):
        if int(_p) == int(pid):
            score = _s
            review =  _r
    spid = s.id
    spname = s.name

    return render_template('ratespectrum.html', error=error,
                           spectrum_id=spid, spectrum_name=spname,
                           person_id=pid, score=score, review=review)
Ejemplo n.º 3
0
def submit_upload():
    session_init(session, db)
    error = None
    if session['username'] is None:
        error = 'must be logged in to submit a spectrum'
        return redirect(url_for('search', error=error))

    if request.method == 'POST':
        pid = request.form['person']
        pemail = db.get_person(int(pid)).email
        file = request.files['file']
        s = None
        file_ok = False
        if file and allowed_file(file.filename):
            fname = secure_filename(file.filename)
            fullpath = os.path.abspath(
                os.path.join(app.config['UPLOAD_FOLDER'], fname))
            try:
                file.save(fullpath)
                file_ok = True
            except IOError:
                pass

            if file_ok:
                time.sleep(1.0)
                db.add_xdifile(fullpath, person=pemail, create_sample=True)
                time.sleep(1.0)
                db.session.commit()

            s = db.get_spectra()[-1]
            if s is None:
                error = 'Could not find Spectrum #%i' % s.id
                return render_template('upload.html', error=error)

        if s is None:
            error = "File '%s' not found or not suppported type" % (
                file.filename)
            return render_template('upload.html', error=error)

        try:
            opts = parse_spectrum(s, db)
        except:
            error = "Could not read spectrum from '%s'" % (file.filename)
            return render_template('upload.html', error=error)
        return redirect(url_for('spectrum', spid=s.id, error=error))
    return render_template('upload.html', error='upload error')
Ejemplo n.º 4
0
def submit_upload():
    session_init(session, db)
    error=None
    if session['username'] is None:
        error='must be logged in to submit a spectrum'
        return redirect(url_for('search', error=error))

    if request.method == 'POST':
        pid    = request.form['person']
        pemail = db.get_person(int(pid)).email
        file = request.files['file']
        s = None
        file_ok = False
        if file and allowed_file(file.filename):
            fname = secure_filename(file.filename)
            fullpath = os.path.abspath(os.path.join(
                app.config['UPLOAD_FOLDER'], fname))
            try:
                file.save(fullpath)
                file_ok = True
            except IOError:
                pass

            if file_ok:
                time.sleep(1.0)
                db.add_xdifile(fullpath, person=pemail, create_sample=True)
                time.sleep(1.0)
                db.session.commit()

            s  = db.get_spectra()[-1]
            if s is None:
                error = 'Could not find Spectrum #%i' % s.id
                return render_template('upload.html', error=error)

        if s is None:
            error = "File '%s' not found or not suppported type" %  (file.filename)
            return render_template('upload.html', error=error)

        try:
            opts = parse_spectrum(s, db)
        except:
            error = "Could not read spectrum from '%s'" % (file.filename)
            return render_template('upload.html', error=error)
        return redirect(url_for('spectrum', spid=s.id, error=error))
    return render_template('upload.html', error='upload error')
Ejemplo n.º 5
0
def edit_spectrum(spid=None):
    session_init(session, db)
    error = None
    if session['username'] is None:
        error = 'must be logged in to edit spectrum'
        return render_template('ptable.html', error=error)

    s = db.get_spectrum(spid)
    if s is None:
        error = 'Could not find Spectrum #%i' % spid
        return render_template('ptable.html', error=error)

    opts = parse_spectrum(s, db)
    return render_template('editspectrum.html',
                           error=error,
                           elems=get_element_list(db),
                           eunits=get_energy_units_list(db),
                           edges=get_edge_list(db),
                           beamlines=get_beamline_list(db),
                           samples=get_sample_list(db),
                           **opts)
Ejemplo n.º 6
0
def edit_spectrum(spid=None):
    session_init(session, db)
    error=None
    if session['username'] is None:
        error='must be logged in to edit spectrum'
        return render_template('ptable.html',
                               error=error)

    s  = db.get_spectrum(spid)
    if s is None:
        error = 'Could not find Spectrum #%i' % spid
        return render_template('ptable.html', error=error)

    opts = parse_spectrum(s, db)
    return render_template('editspectrum.html', error=error,
                           elems=get_element_list(db),
                           eunits=get_energy_units_list(db),
                           edges=get_edge_list(db),
                           beamlines=get_beamline_list(db),
                           samples=get_sample_list(db),
                           **opts)
Ejemplo n.º 7
0
def showspectrum_rating(spid=None):
    session_init(session, db)
    s  = db.get_spectrum(spid)
    if s is None:
        error = 'Could not find Spectrum #%i' % spid
        return render_template('ptable.html', error=error)

    opts = parse_spectrum(s, db)
    ratings = []
    for score, review, dtime, pid in spectrum_ratings(db, spid):
        person = db.get_person(pid)
        ratings.append({'score': score,
                        'review': multiline_text(review),
                        'date': fmttime(dtime),
                        'person_email': person.email,
                        'person_name': person.name,
                        'person_affil': person.affiliation})

    return render_template('show_spectrum_ratings.html',
                           ratings=ratings,
                           spectrum_name=opts['spectrum_name'])
Ejemplo n.º 8
0
    def _optimize_nuisance_parameters(self, dispersion, flux, ivar, grid_index,
                                      **kwargs):
        """
        Optimize nuisance parameters at a single grid point. Note that no
        slicing and masking is performed to the data by this function.

        :param dispersion:
            The observed dispersion points.

        :param flux:
            The observed flux values.

        :param ivar:
            The inverse variance values for the observed fluxes.

        :param grid_index:
            The grid index.
        """

        return_model_spectrum = kwargs.pop("__return_model_spectrum", False)

        # Load the spectrum from the grid.
        model_disp, model_flux = utils.parse_spectrum(self.paths[grid_index]).T

        kwds = {
            "f": lambda x, *theta: \
                self.fitting_function(x, model_disp, model_flux, *theta),
            "xdata": dispersion,
            "ydata": flux,
            "sigma": ivar,
            "absolute_sigma": False,
            "p0": self.initial_guess(dispersion, flux),
            "full_output": True,
            "maxfev": 10000
        }
        kwds.update(kwargs)
        result = op.curve_fit(**kwds)

        return tuple(list(result) + [model_disp, model_flux]) \
            if return_model_spectrum else result
Ejemplo n.º 9
0
def showspectrum_rating(spid=None):
    session_init(session, db)
    s = db.get_spectrum(spid)
    if s is None:
        error = 'Could not find Spectrum #%i' % spid
        return render_template('ptable.html', error=error)

    opts = parse_spectrum(s, db)
    ratings = []
    for score, review, dtime, pid in spectrum_ratings(db, spid):
        person = db.get_person(pid)
        ratings.append({
            'score': score,
            'review': multiline_text(review),
            'date': fmttime(dtime),
            'person_email': person.email,
            'person_name': person.name,
            'person_affil': person.affiliation
        })

    return render_template('show_spectrum_ratings.html',
                           ratings=ratings,
                           spectrum_name=opts['spectrum_name'])
Ejemplo n.º 10
0
    def plot_projection(self,
                        data,
                        ax=None,
                        index=None,
                        sample_cov=0,
                        **kwargs):

        if ax is None:
            fig, ax = plt.subplots()
        else:
            fig = ax.figure

        obs_dispersion, obs_flux, obs_ivar = self._slice_spectrum(data)

        # Apply masks.
        mask = _generate_mask(obs_dispersion, self.metadata["mask"]) \
             * np.isfinite(obs_flux * obs_ivar)

        if 0 in (obs_dispersion.size, mask.sum()):
            raise ValueError("no overlapping spectra with finite flux/ivar")

        #obs_dispersion = obs_dispersion[mask]
        #obs_flux, obs_ivar = obs_flux[mask], obs_ivar[mask]

        _ = np.where(mask)[0]
        si, ei = _[0], _[-1]

        # Show uncertainties.
        obs_sigma = np.sqrt(1.0 / obs_ivar)
        fill_between_steps(ax,
                           obs_dispersion[si:ei],
                           obs_flux[si:ei] - obs_sigma[si:ei],
                           obs_flux[si:ei] + obs_sigma[si:ei],
                           facecolor="#AAAAAA",
                           edgecolor="none",
                           alpha=1)

        # Limit to the edge of what is OK.
        ax.plot(obs_dispersion[si:ei],
                obs_flux[si:ei],
                c="#444444",
                drawstyle="steps-mid")

        obs_flux[~mask] = np.nan
        ax.plot(obs_dispersion, obs_flux, c='k', drawstyle="steps-mid")

        # Get the MAP value.
        if index is None:
            index = np.nanargmax(self._inference_result[1])
        op_theta = self._inference_result[3][index]

        model_disp, model_flux = utils.parse_spectrum(self.paths[index]).T

        y = self(obs_dispersion, model_disp, model_flux, *op_theta)
        y[~mask] = np.nan

        c = kwargs.pop("c", "r")
        ax.plot(obs_dispersion, y, c=c, **kwargs)

        # Get the covariance matrix?
        if sample_cov > 0:
            cov = self._inference_result[4][index]
            print(np.sqrt(np.diag(cov)))

            # Sample values from the cov matrix and project them.
            draws = np.random.multivariate_normal(
                self._inference_result[3][index],
                self._inference_result[4][index],
                size=sample_cov)

            for draw in draws:
                y_draw = self(obs_dispersion, model_disp, model_flux, *draw)
                y_draw[~mask] = np.nan

                ax.plot(obs_dispersion, y_draw, c=c, alpha=10.0 / sample_cov)

        # Draw fill_between in y?
        ax.set_title("Index {}: {}".format(index,
                                           self.stellar_parameters[index]))

        return fig
Ejemplo n.º 11
0
    def _get_wavelength_limits(self, path):

        wavelengths = utils.parse_spectrum(self.paths[0])[:, 0]
        return (min(wavelengths), max(wavelengths))
Ejemplo n.º 12
0
def spectrum(spid=None):
    session_init(session, db)
    s = db.get_spectrum(spid)
    if s is None:
        error = 'Could not find Spectrum #%i' % spid
        return render_template('ptable.html', error=error)

    opts = parse_spectrum(s, db)
    opts['spectrum_owner'] = (session['person_id'] == "%i" % s.person_id)
    opts['rating'] = get_rating(s)

    modes = db.get_spectrum_mode(spid)
    if modes is None:
        modes = 1
    else:
        modes = modes[0][1]

    if modes == 1:
        try:
            energy = np.array(json.loads(s.energy))
            i0 = np.array(json.loads(s.i0))
            itrans = np.array(json.loads(s.itrans))
            mutrans = -np.log(itrans / i0)
        except:
            error = 'Could not extract data from spectrum'
            return render_template('spectrum.html', **opts)
    else:  #get a fluorescence
        try:
            energy = np.array(json.loads(s.energy))
            i0 = np.array(json.loads(s.i0))
            ifluor = np.array(json.loads(s.ifluor))
            mutrans = ifluor / i0
        except:
            error = 'Could not extract data from spectrum'
            return render_template('spectrum.html', **opts)

    murefer = None
    try:
        irefer = np.array(json.loads(s.irefer))
        murefer = -np.log(irefer / itrans)
    except:
        pass

    eunits = opts['energy_units']
    if eunits.startswith('keV'):
        energy = energy / 1000.0
    elif eunits.startswith('deg'):
        print 'Need to convert angle to energy'

    if modes != 7:
        group = preedge(energy, mutrans)
        e0 = group['e0']
    try:
        e0 = edge_energies[int(s.element_z)][str(opts['edge'])]
    except:
        pass

    try:
        i1 = max(np.where(energy <= e0 - 25)[0])
    except:
        i1 = 0
    i2 = max(np.where(energy <= e0 + 75)[0]) + 1
    xanes_en = energy[i1:i2] - e0

    if modes != 3:
        xanes_mu = group['norm'][i1:i2]
    else:
        xanes_mu = mutrans[i1:i2]

    xanes_ref = None
    if murefer is not None:
        rgroup = preedge(energy, murefer)
        xanes_ref = rgroup['norm'][i1:i2]

    opts['e0'] = '%f' % e0
    opts['fullfig'] = make_xafs_plot(energy,
                                     mutrans,
                                     s.name,
                                     ylabel='Raw XAFS')

    opts['xanesfig'] = make_xafs_plot(xanes_en,
                                      xanes_mu,
                                      s.name,
                                      xlabel='Energy-%.1f (eV)' % e0,
                                      ylabel='Normalized XANES',
                                      x0=e0,
                                      ref_mu=xanes_ref,
                                      ref_name='with reference')

    suites = []
    for r in db.filtered_query('spectrum_suite', spectrum_id=s.id):
        st = db.filtered_query('suite', id=r.suite_id)[0]
        suites.append({'id': r.suite_id, 'name': st.name})
    opts['nsuites'] = len(suites)
    opts['suites'] = suites

    return render_template('spectrum.html', **opts)
Ejemplo n.º 13
0
def spectrum(spid=None):
    session_init(session, db)
    s  = db.get_spectrum(spid)
    if s is None:
        error = 'Could not find Spectrum #%i' % spid
        return render_template('ptable.html', error=error)

    opts = parse_spectrum(s, db)
    opts['spectrum_owner'] = (session['person_id'] == "%i" % s.person_id)
    opts['rating'] = get_rating(s)

    modes = db.get_spectrum_mode(spid)
    if modes is None:
        modes = 1
    else:
        modes = modes[0][1]

    if modes == 1:
        try:
            energy = np.array(json.loads(s.energy))
            i0     = np.array(json.loads(s.i0))
            itrans = np.array(json.loads(s.itrans))
            mutrans = -np.log(itrans/i0)
        except:
            error = 'Could not extract data from spectrum'
            return render_template('spectrum.html', **opts)
    else: #get a fluorescence
        try:
            energy = np.array(json.loads(s.energy))
            i0     = np.array(json.loads(s.i0))
            ifluor = np.array(json.loads(s.ifluor))
            mutrans = ifluor/i0
        except:
            error = 'Could not extract data from spectrum'
            return render_template('spectrum.html', **opts)

    murefer = None
    try:
        irefer = np.array(json.loads(s.irefer))
        murefer = -np.log(irefer/itrans)
    except:
        pass


    eunits = opts['energy_units']
    if eunits.startswith('keV'):
        energy = energy /1000.0
    elif eunits.startswith('deg'):
        print 'Need to convert angle to energy'


    if modes != 7:
        group = preedge(energy, mutrans)
        e0 = group['e0']
    try:
        e0 = edge_energies[int(s.element_z)][str(opts['edge'])]
    except:
        pass

    try:
        i1 = max(np.where(energy<=e0 - 25)[0])
    except:
        i1 = 0
    i2 = max(np.where(energy<=e0 + 75)[0]) + 1
    xanes_en = energy[i1:i2] - e0
    
    if modes !=3:
        xanes_mu = group['norm'][i1:i2]
    else:
        xanes_mu = mutrans[i1:i2]
        
    xanes_ref = None
    if murefer is not None:
        rgroup = preedge(energy, murefer)
        xanes_ref = rgroup['norm'][i1:i2]

    opts['e0'] = '%f' % e0
    opts['fullfig'] =  make_xafs_plot(energy, mutrans, s.name,
                                      ylabel='Raw XAFS')

    opts['xanesfig'] = make_xafs_plot(xanes_en, xanes_mu, s.name,
                                      xlabel='Energy-%.1f (eV)' % e0,
                                      ylabel='Normalized XANES',
                                      x0=e0, ref_mu=xanes_ref,
                                      ref_name='with reference')

    suites = []
    for r in db.filtered_query('spectrum_suite', spectrum_id=s.id):
        st = db.filtered_query('suite', id=r.suite_id)[0]
        suites.append({'id': r.suite_id, 'name': st.name})
    opts['nsuites'] = len(suites)
    opts['suites'] = suites

    return render_template('spectrum.html', **opts)