Esempio n. 1
0
def render_one_maass_waveform(maass_id, **kwds):
    r"""
    Render the webpage of one Maass waveform by calling
    render_one_maass_waveform_wp or generates a download
    in a format that is readable by python.
    """
    info = get_args_mwf(**kwds)
    info['maass_id'] = maass_id
    mwf_logger.debug("in_render_one_maass_form: info={0}".format(info))
    if (info.get('download', '') == 'coefficients'
            or info.get('download', '') == 'all'):
        maass_id = info['maass_id']
        try:
            f = WebMaassForm(maass_id)
        except KeyError:
            flask.abort(404)
        filename = str(f._maass_id) + '.txt'
        if info.get('download', '') == 'coefficients':
            res = f.coeffs
        else:
            res = f.download_text()

        strIO = StringIO.StringIO()
        strIO.write(res)
        strIO.seek(0)
        try:
            return send_file(strIO,
                             attachment_filename=filename,
                             as_attachment=True,
                             add_etags=False)
        except IOError:
            info['error'] = "Could not send file!"

    else:
        return render_one_maass_waveform_wp(info)
Esempio n. 2
0
def render_one_maass_waveform(maass_id, **kwds):
    r"""
    Render the webpage of one Maass waveform by calling
    render_one_maass_waveform_wp or generates a download
    in a format that is readable by python.
    """
    info = get_args_mwf(**kwds)
    info['maass_id'] = maass_id
    mwf_logger.debug("in_render_one_maass_form: info={0}".format(info))
    if (info.get('download', '') == 'coefficients'  or
        info.get('download', '') == 'all'):
        maass_id = info['maass_id']
        try:
            f = WebMaassForm(maass_id)
        except KeyError:
            flask.abort(404)
        filename = str(f._maass_id) + '.txt'
        if info.get('download', '') == 'coefficients':
            res = f.coeffs
        else:
            res = f.download_text()

        strIO = StringIO.StringIO()
        strIO.write(res)
        strIO.seek(0)
        try:
            return send_file(strIO,
                             attachment_filename=filename,
                             as_attachment=True,
                             add_etags=False)
        except IOError:
            info['error'] = "Could not send file!"

    else:
        return render_one_maass_waveform_wp(info)
Esempio n. 3
0
def render_one_maass_waveform_wp(info, prec=9):
    r"""
    Render the webpage of one Maass waveform.

    The precision kwarg `prec` is passed to the coefficient table, and
    indicates to round to 0 when the difference is less than 1e-`prec`.
    """
    info["check"] = []
    maass_id = info['maass_id']
    mwf_logger.debug("id1={0}".format(maass_id))
    try:
        MF = WebMaassForm(maass_id)
    except KeyError:
        return flask.abort(404)
    info['MF'] = MF
    info['title'] = "Maass Form"
    info['bread'] = [('Modular Forms', url_for('mf.modular_form_main_page')),
                     ('Maass Forms', url_for('.render_maass_waveforms'))]
    if hasattr(MF, 'level'):
        info['bread'].append(('Level {0}'.format(MF.level),
                              url_for('.render_maass_waveforms',
                                      level=MF.level)))
        info['title'] += r" on \(\Gamma_{0}( %s )\)" % info['MF'].level
        if hasattr(MF, 'R') and MF.R:
            info['title'] += r" with \(R=%s\)" % info['MF'].R

    # make sure all the expected attributes of a WebMaassForm are actually present
    missing = [
        attr for attr in ['level', 'dim', 'num_coeff', 'R', 'character']
        if not hasattr(MF, attr)
    ]
    if missing:
        mwf_logger.critical(
            "Unable to render Maass form {0}; required attributes {1} missing from database record."
            .format(maass_id, missing))
        info['explain'] = "Unable to render Maass form {0} because the following required attributes were missing from the database record:".format(maass_id) \
                      + "<ul>" + "".join(["<li>"+attr+"</li>" for attr in missing]) + "</ul>"
        return render_template("problem.html", **info)

    level = info['MF'].level
    dim = info['MF'].dim
    # numc = info['MF'].num_coeff # never used
    # if info['MF'].has_plot(): # and level == 1: # Bara level = 1 har rätt format för tillfället //Lemurell
    #    info['plotlink'] = url_for('mwf.plot_maassform', maass_id=maass_id)
    # Create the link to the L-function (put in '/L' at the beginning and '/' before '?'
    Llink = "/L" + url_for('mwf.render_one_maass_waveform',
                           maass_id=maass_id)  # + '/?db=' + info['db']
    if dim == 1:
        info["friends"] = [("L-function", Llink)]

    # Navigation to previous and next form
    # next_form_id = info['MF'].next_maassform_id()
    # if next_form_id:
    #    next_data = ('next', r"$f_{\text next}$", url_for('mwf.render_one_maass_waveform', maass_id = next_form_id) )
    # else:
    #    next_data = ('','','')
    # prev_form_id = info['MF'].prev_maassform_id()
    # if prev_form_id:
    #    prev_data = ('previous', r"$f_{\text prev}$", url_for('mwf.render_one_maass_waveform', maass_id = prev_form_id) )
    # else:
    #    prev_data = ('','','')

    # info['navi'] = ( prev_data, next_data )

    info["downloads"] = [('All stored data of the form',
                          url_for('mwf.render_one_maass_waveform',
                                  maass_id=maass_id,
                                  download='all')),
                         ('All coefficients of the form',
                          url_for('mwf.render_one_maass_waveform',
                                  maass_id=maass_id,
                                  download='coefficients'))]
    mwf_logger.debug("count={0}".format(maass_db.count()))
    ch = info['MF'].character
    s = r"\( \chi_{" + str(level) + "}(" + str(ch) + r",\cdot) \)"
    # Q: Is it possible to get the knowls into the properties?
    # A: Not in a nice way and this is not done elsewhere in the LMFDB; the knowls should appear on labels in the template
    # knowls = {'level': 'mf.maass.mwf.level',
    #                   'weight': 'mf.maass.mwf.weight',
    #                   'char': 'mf.maass.mwf.character',
    #                   'R': 'mf.maass.mwf.eigenvalue',
    #                   'sym': 'mf.maass.mwf.symmetry',
    #                   'prec': 'mf.maass.mwf.precision',
    #                   'mult': 'mf.maass.mwf.dimension',
    #                   'ncoeff': 'mf.maass.mwf.ncoefficients',
    #                   'fricke': 'cmf.fricke',
    #                   'atkinlehner': 'cmf.atkin-lehner'}
    properties = [
        ('Level', [info['MF'].level]),
        ('Symmetry', [info['MF'].even_odd()]),
        ('Weight', [info['MF'].the_weight()]),
        ('Character', [s]),
        ('Multiplicity', [dim]),
        ('Precision', [info['MF'].precision()]),
        ('Fricke Eigenvalue', [info['MF'].fricke()]),
        ('Atkin-Lehner Eigenvalues', [info['MF'].atkinlehner()]),
    ]
    if dim > 1 and info['MF'].the_character() == "trivial":
        properties.append(("Possibly oldform", []))
    info['properties'] = properties

    # The precision in set_table indicates which coefficients to set to zero.
    # For instance, if the imaginary part is less than the precision in
    # absolute value, then it is set to 0 in set_table.
    # The value 1e-9 is chosen arbitrarily, as recommended in issue #2076.
    info['MF'].set_table(prec=prec)
    cols = [{
        "aaSorting": "asc",
        "sWidth": "10%",
        "bSortable": "true",
        "bSearchable": "false",
        "sType": "numeric"
    }]
    negc = info['MF'].table.get('negc', 0)
    for j in range(dim):
        if not negc:
            col = {
                "bSortable": "false",
                "bSearchable": "true",
                "sClass": "alignLeft",
                "fnRender": "text-align:left",
                "sType": "numeric"
            }
            cols.append(col)
        else:
            col1 = {
                "bSortable": "false",
                "bSearchable": "true",
                "sClass": "alignLeft",
                "fnRender": "text-align:left",
                "sType": "numeric"
            }
            col2 = {
                "bSortable": "false",
                "bSearchable": "true",
                "sClass": "alignLeft",
                "fnRender": "text-align:left",
                "sType": "numeric"
            }
            cols.append(col1)
            cols.append(col2)
    info['credit'] = info['MF'].contributor_name
    info['coeff_aoColumns'] = cols  # json.dumps(cols)
    mwf_logger.debug("col={0}".format(cols))
    return render_template("mwf_one_form.html", **info)
Esempio n. 4
0
def evs_table(search, twodarray=False):
    DB = connect_db()

    indices = DB.find_Maass_form_id(search)
    table = []
    nrows = 0
    for fid in indices:
        f = WebMaassForm(DB, fid, get_coeffs=False)
        row = {}
        R = f.R
        N = f.level
        k = f.weight
        if R is None or N is None or k is None:
            continue
        row['R'] = R
        row['N'] = N
        if k == 0 or k == 1:
            row['k'] = int(k)
        else:
            row['k'] = k
        # j = f.get('Character',0)
        ## Now get the COnrey number.
        ## First the character
        if k == 0:
             # s+=url_for('characters.render_Dirichletwebpage',modulus=level,number=ch)
            row['ch'] = f.the_character()  # conrey_character_name(N,chi)
        else:
            row['ch'] = "eta"
        st = f.symmetry
        if st == 1:
            st = "odd"
        elif st == 0:
            st = "even"
        else:
            st = "n/a"
        row['symmetry'] = st
        er = f.error
        if er > 0:
            er = "{0:1.0e}".format(er)
        else:
            er = "unknown"
        row['err'] = er
        dim = f.dim
        if dim is None:
            dim = 1  # "undefined"
        row['dim'] = dim
        numc = f.num_coeff
        row['numc'] = numc
        cev = f.cusp_evs
        row['fricke'] = 'n/a'
        row['cuspevs'] = 'n/a'
        if row['k'] == 0 and isinstance(cev, list):
            if len(cev) > 1:
                fricke = cev[1]
                row['fricke'] = fricke
            row['cuspevs'] = cev
        url = url_for('mwf.render_one_maass_waveform', maass_id=f._maassid)
        row['url'] = url
        nrows += 1
        if twodarray:
            s = '<a href="{0}">{1}</a>'.format(row['url'], row['R'])
            rowr = [row['N'], row['k'], row['ch'], s,
                    row['symmetry'], row['err'], row['dim'], row['numc'],
                    row['fricke'], row['cuspevs']]
            table.append(rowr)
        else:
            # row=row.values()
            table.append(row)
    mwf_logger.debug("nrows:".format(nrows))
    evs = {'table': {}}
    evs['table']['data'] = table
    evs['table']['nrows'] = nrows
    evs['table']['ncols'] = 10
    evs['table']['colheads'] = []
    knowls = ['mf.maass.mwf.level', 'mf.maass.mwf.weight', 'mf.maass.mwf.character',
              'mf.maass.mwf.eigenvalue', 'mf.maass.mwf.symmetry',
              'mf.maass.mwf.precision', 'mf.maass.mwf.dimension',
              'mf.maass.mwf.ncoefficients', 'mf.maass.mwf.fricke',
              'mf.maass.mwf.atkinlehner']
    titles = ['Level', 'Weight', 'Char',
              'Eigenvalue', 'Symmetry',
              'Precision', 'Mult.',
              'Coeff.', 'Fricke', 'Atkin-Lehner']
    for i in range(10):
        evs['table']['colheads'].append((knowls[i], titles[i]))
    if 'limit' in search:
        search.pop('limit')
    if 'skip' in search:
        search.pop('skip')
    evs['totalrecords'] = DB.count(search)

    return evs
Esempio n. 5
0
def evs_table(search, twodarray=False):
    DB = connect_db()

    indices = DB.find_Maass_form_id(search)
    table = []
    nrows = 0
    for fid in indices:
        f = WebMaassForm(DB, fid, get_coeffs=False)
        row = {}
        R = f.R
        N = f.level
        k = f.weight
        if R is None or N is None or k is None:
            continue
        row['R'] = R
        row['N'] = N
        if k == 0 or k == 1:
            row['k'] = int(k)
        else:
            row['k'] = k
        # j = f.get('Character',0)
        ## Now get the COnrey number.
        ## First the character
        if k == 0:
             # s+=url_for('characters.render_Dirichletwebpage',modulus=level,number=ch)
            row['ch'] = f.the_character()  # conrey_character_name(N,chi)
        else:
            row['ch'] = "eta"
        st = f.symmetry
        if st == 1:
            st = "odd"
        elif st == 0:
            st = "even"
        else:
            st = "n/a"
        row['symmetry'] = st
        er = f.error
        if er > 0:
            er = "{0:1.0e}".format(er)
        else:
            er = "unknown"
        row['err'] = er
        dim = f.dim
        if dim is None:
            dim = 1  # "undefined"
        row['dim'] = dim
        numc = f.num_coeff
        row['numc'] = numc
        cev = f.cusp_evs
        row['fricke'] = 'n/a'
        row['cuspevs'] = 'n/a'
        if row['k'] == 0 and isinstance(cev, list):
            if len(cev) > 1:
                fricke = cev[1]
                row['fricke'] = fricke
            row['cuspevs'] = cev
        url = url_for('mwf.render_one_maass_waveform', maass_id=f._maassid)
        row['url'] = url
        nrows += 1
        if twodarray:
            s = '<a href="{0}">{1}</a>'.format(row['url'], row['R'])
            rowr = [row['N'], row['k'], row['ch'], s,
                    row['symmetry'], row['err'], row['dim'], row['numc'],
                    row['fricke'], row['cuspevs']]
            table.append(rowr)
        else:
            # row=row.values()
            table.append(row)
    mwf_logger.debug("nrows:".format(nrows))
    evs = {'table': {}}
    evs['table']['data'] = table
    evs['table']['nrows'] = nrows
    evs['table']['ncols'] = 10
    evs['table']['colheads'] = []
    knowls = ['mf.maass.mwf.level', 'mf.maass.mwf.weight', 'mf.maass.mwf.character',
              'mf.maass.mwf.eigenvalue', 'mf.maass.mwf.symmetry',
              'mf.maass.mwf.precision', 'mf.maass.mwf.dimension',
              'mf.maass.mwf.ncoefficients', 'mf.maass.mwf.fricke',
              'mf.maass.mwf.atkinlehner']
    titles = ['Level', 'Weight', 'Char',
              'Eigenvalue', 'Symmetry',
              'Precision', 'Mult.',
              'Coeff.', 'Fricke', 'Atkin-Lehner']
    for i in range(10):
        evs['table']['colheads'].append((knowls[i], titles[i]))
    if 'limit' in search:
        search.pop('limit')
    if 'skip' in search:
        search.pop('skip')
    evs['totalrecords'] = DB.count(search)

    return evs
Esempio n. 6
0
def render_one_maass_waveform_wp(info):
    r"""
    Render the webpage of one Maass waveform.
    """
    info["check"] = []
    DB = connect_db()
    maass_id = info['maass_id']
    mwf_logger.debug("id1={0}".format(maass_id))
    info['MF'] = WebMaassForm(DB, maass_id)
    level = info['MF'].level
    dim = info['MF'].dim
    numc = info['MF'].num_coeff
    if info['MF'].has_plot():
        info['plotlink'] = url_for('mwf.plot_maassform', maass_id=maass_id)
    # Create the link to the L-function (put in '/L' at the beginning and '/' before '?'
    Llink = "/L" + url_for('mwf.render_one_maass_waveform', maass_id=maass_id)  # + '/?db=' + info['db']
    if dim == 1:
        info["friends"] = [("L-function", Llink)]
    bread = [('Maass waveforms', url_for('.render_maass_waveforms')),
             ('Of Level {0}'.format(level),
             url_for('.render_maass_waveforms', level=level))]

    # Navigation to previous and next form
    next_form_id = info['MF'].next_maassform_id()
    if next_form_id:
        next_data = ('next', r"$f_{\text next}$", url_for('mwf.render_one_maass_waveform',
                                                                maass_id = next_form_id) )
    else:
        next_data = ('','','')
    prev_form_id = info['MF'].prev_maassform_id()
    if prev_form_id:
        prev_data = ('previous', r"$f_{\text prev}$", url_for('mwf.render_one_maass_waveform',
                                                                maass_id = prev_form_id) )
    else:
        prev_data = ('','','')
        
    info['navi'] = ( prev_data, next_data )
    
    info["downloads"] = [ ('All stored data of the form', url_for('mwf.download_maassform', maass_id=maass_id)) ]
    lenc = 20
    mwf_logger.debug("count={0}".format(DB.count()))
    ch = info['MF'].character
    s = "\( \chi_{" + str(level) + "}(" + str(ch) + ",\cdot) \)"
    # is it possible to get the knowls into the properties?
    knowls = knowls = {'level': 'mf.maass.mwf.level',
                       'weight': 'mf.maass.mwf.weight',
                       'char': 'mf.maass.mwf.character',
                       'R': 'mf.maass.mwf.eigenvalue',
                       'sym': 'mf.maass.mwf.symmetry',
                       'prec': 'mf.maass.mwf.precision',
                       'mult': 'mf.maass.mwf.dimension',
                       'ncoeff': 'mf.maass.mwf.ncoefficients',
                       'fricke': 'mf.maass.mwf.fricke',
                       'atkinlehner': 'mf.maass.mwf.atkinlehner'}
    properties = [('Level', [info['MF'].level]),
                  ('Symmetry', [info['MF'].even_odd()]),
                  ('Weight', [info['MF'].the_weight()]),
                  ('Character', [s]),
                  ('Multiplicity', [dim]),
                  ('Precision', [info['MF'].precision()]),
                  ('Fricke Eigenvalue', [info['MF'].fricke()]),
                  ('Atkin-Lehner Eigenvalues', [info['MF'].atkinlehner()]),
                  ]
    if dim > 1 and info['MF'].the_character() == "trivial":
        properties.append(("Possibly oldform", []))
    info['title'] = "Maass form on \(\Gamma_{0}( %s )\) with $R=%s$" % (info['MF'].level, info['MF'].R)
    info['bread'] = bread
    info['properties2'] = properties

    info['MF'].set_table()
    cols = [{"aaSorting": "asc", "sWidth": "10%", "bSortable": "true", "bSearchable": "false",
             "sType": "numeric"}]
    negc = info['MF'].table.get('negc', 0)
    for j in range(dim):
        if not negc:
            col = {"bSortable": "false", "bSearchable": "true", "sClass": "alignLeft",
                   "fnRender": "text-align:left", "sType": "numeric"}
            cols.append(col)
        else:
            col1 = {"bSortable": "false", "bSearchable": "true", "sClass": "alignLeft",
                    "fnRender": "text-align:left", "sType": "numeric"}
            col2 = {"bSortable": "false", "bSearchable": "true", "sClass": "alignLeft",
                    "fnRender": "text-align:left", "sType": "numeric"}
            cols.append(col1)
            cols.append(col2)
    info['credit'] = info['MF'].contributor_name
    info['coeff_aoColumns'] = cols  # json.dumps(cols)
    mwf_logger.debug("col={0}".format(cols))
    # coeffurl=url_for('mwf.render_one_maass_waveform',maass_id=maass_id,download='coefficients')
    #    info['downloads'] = [('Coefficients', coeffurl) ]
    return render_template("mwf_one_form.html", **info)
Esempio n. 7
0
def download_maassform(maass_id):
    DB = connect_db()
    MF = WebMaassForm(DB, maass_id)
    response = make_response(MF.download_text())
    response.headers['Content-type'] = 'text/plain'
    return response