Example #1
0
def render_maass_waveforms(level=0, weight=-1, character=-1, r1=0, r2=0, **kwds):
    info = get_args_mwf(level=level, weight=weight, character=character, r1=r1, r2=r2, **kwds)

    info["credit"] = ""
    info["learnmore"] = []
    mwf_logger.debug("args=%s" % request.args)
    mwf_logger.debug("method=%s" % request.method)
    mwf_logger.debug("req.form=%s" % request.form)
    mwf_logger.debug("info=%s" % info)
    mwf_logger.debug("level,weight,char={0},{1},{2}".format(level, weight, character))
    if info.get('maass_id', None) and info.get('db', None):
        return render_one_maass_waveform_wp(**info)
    if info['search'] or (info['browse'] and int(info['weight']) != 0):
        search = get_search_parameters(info)
        mwf_logger.debug("search=%s" % search)
        return render_search_results_wp(info, search)
    if info['browse']:
        mwf_logger.debug("browse info=%s" % info)
        return render_browse_all_eigenvalues(**info)

    DB = connect_db()
    if not info['collection'] or info['collection'] == 'all':
        # FIXME: metadata returned by get_collections_info is never used, only side effect appears to be logging messages
        # md = get_collections_info()
        get_collections_info()
    info['cur_character'] = character
    if level > 0:
        info['maass_weight'] = DB.weights(int(level))
        info['cur_level'] = level

    if weight > -1:
        info['cur_weight'] = weight
        if level > 0:
            info['maass_character'] = DB.characters(int(level), float(weight))
    if character > - 1:
        info['cur_character'] = character

    if level > 0 or weight > -1 or character > -1:
        search = get_search_parameters(info)
        mwf_logger.debug("info=%s" % info)
        mwf_logger.debug("search=%s" % search)
        return render_search_results_wp(info, search)
    title = 'Maass forms'
    info['list_of_levels'] = DB.levels()
    if info['list_of_levels']:
        info['max_level'] = max(info['list_of_levels'])
    else:
        info['max_level'] = 0
    mwf_logger.debug("info3=%s" % info)
    bread = [('Modular forms', url_for('mf.modular_form_main_page')),
             ('Maass forms', url_for('.render_maass_waveforms'))]
    info['bread'] = bread
    info['title'] = title
    DB.set_table()
    DB.table['ncols'] = 10
    info['DB'] = DB
    info['dbcount'] = DB.count()
    info['limit'] = maxNumberOfResultsToShow
    return render_template("mwf_navigate.html", **info)
Example #2
0
def render_maass_waveforms(level=0, weight=-1, character=-1, r1=0, r2=0, **kwds):
    info = get_args_mwf(level=level, weight=weight, character=character, r1=r1, r2=r2, **kwds)

    info["credit"] = ""
    info["learnmore"] = []
    mwf_logger.debug("args=%s" % request.args)
    mwf_logger.debug("method=%s" % request.method)
    mwf_logger.debug("req.form=%s" % request.form)
    mwf_logger.debug("info=%s" % info)
    mwf_logger.debug("level,weight,char={0},{1},{2}".format(level, weight, character))
    if info.get('maass_id', None) and info.get('db', None):
        return render_one_maass_waveform_wp(**info)
    if info['search'] or (info['browse'] and int(info['weight']) != 0):
        search = get_search_parameters(info)
        mwf_logger.debug("search=%s" % search)
        return render_search_results_wp(info, search)
    if info['browse']:
        mwf_logger.debug("browse info=%s" % info)
        return render_browse_all_eigenvalues(**info)

    DB = connect_db()
    if not info['collection'] or info['collection'] == 'all':
        # FIXME: metadata returned by get_collections_info is never used, only side effect appears to be logging messages
        # md = get_collections_info()
        get_collections_info()
    info['cur_character'] = character
    if level > 0:
        info['maass_weight'] = DB.weights(int(level))
        info['cur_level'] = level

    if weight > -1:
        info['cur_weight'] = weight
        if level > 0:
            info['maass_character'] = DB.characters(int(level), float(weight))
    if character > - 1:
        info['cur_character'] = character

    if level > 0 or weight > -1 or character > -1:
        search = get_search_parameters(info)
        mwf_logger.debug("info=%s" % info)
        mwf_logger.debug("search=%s" % search)
        return render_search_results_wp(info, search)
    title = 'Maass forms'
    info['list_of_levels'] = DB.levels()
    if info['list_of_levels']:
        info['max_level'] = max(info['list_of_levels'])
    else:
        info['max_level'] = 0
    mwf_logger.debug("info3=%s" % info)
    bread = [('Modular forms', url_for('mf.modular_form_main_page')),
             ('Maass forms', url_for('.render_maass_waveforms'))]
    info['bread'] = bread
    info['title'] = title
    DB.set_table()
    DB.table['ncols'] = 10
    info['DB'] = DB
    info['dbcount'] = DB.count()
    info['limit'] = maxNumberOfResultsToShow
    return render_template("mwf_navigate.html", **info)
Example #3
0
def plot_maassform(maass_id):
    r"""
    Render the plot of the Maass waveform as a pg-file.
    Loads it from the database.
    """
    try:
        maass_id = bson.objectid.ObjectId(maass_id)
    except bson.errors.InvalidId:
        return flask.abort(404)
    DB = connect_db()
    data = DB.get_maassform_plot_by_id(maass_id)
    if not data:
        return flask.abort(404)
    data = data['plot']
    response = make_response(loads(data))
    response.headers['Content-type'] = 'image/png'
    return response
Example #4
0
def plot_maassform(maass_id):
    r"""
    Render the plot of the Maass waveform as a pg-file.
    Loads it from the database.
    """
    try:
        maass_id = bson.objectid.ObjectId(maass_id)
    except bson.errors.InvalidId:
        return flask.abort(404)
    DB = connect_db()
    data = DB.get_maassform_plot_by_id(maass_id)
    if not data:
        return flask.abort(404)
    data = data['plot']
    response = make_response(loads(data))
    response.headers['Content-type'] = 'image/png'
    return response
Example #5
0
def render_picard_maass_forms():
    return render_picard_test()
    htp = connect_db('HTPicard').picard  # base.getDBConnection().HTPicard.picard
    docid = request.args.get('id', None)
    test = request.args.get('test', None)
    if test:
        return render_picard_test()
    if docid is not None:
        return render_picard_maass_forms_get_one(docid)
    ds = [(_['_id'], _['ev']) for _ in htp.find({}, ['ev'], sort=[('ev', 1)])]
    data = None
    # TT= MaassformsPicardDisplay(mwfp_dbname,collection='all',skip=[0],limit=[10],keys=['Eigenvalue'])
    # TT.set_table_browsing()
    # TT.get_metadata()
    if docid:
        data = htp.find_one({'_id': docid})
    return render_template("maass_form_picard.html", title="Maass forms on \(\mathrm{PSL}(2,\mathbb{Z}[i])\)", data=data, id=docid, ds=ds)
Example #6
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)
    try:
        info['maass_id'] = bson.objectid.ObjectId(maass_id)
    except bson.errors.InvalidId:
        return flask.abort(404)
    mwf_logger.debug("in_render_one_maass_form: info={0}".format(info))
    if (info.get('download', '') == 'coefficients'  or
        info.get('download', '') == 'all'):
        DB = connect_db()
        maass_id = info['maass_id']
        try:
            f = WebMaassForm(DB, maass_id)
        except KeyError:
            flask.abort(404)
        filename = str(f._maassid) + '.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)
Example #7
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)
    try:
        info['maass_id'] = bson.objectid.ObjectId(maass_id)
    except bson.errors.InvalidId:
        return flask.abort(404)
    mwf_logger.debug("in_render_one_maass_form: info={0}".format(info))
    if (info.get('download', '') == 'coefficients'
            or info.get('download', '') == 'all'):
        DB = connect_db()
        maass_id = info['maass_id']
        try:
            f = WebMaassForm(DB, maass_id)
        except KeyError:
            flask.abort(404)
        filename = str(f._maassid) + '.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)
Example #8
0
def render_picard_maass_forms():
    return render_picard_test()
    htp = connect_db(
        'HTPicard').picard  # base.getDBConnection().HTPicard.picard
    docid = request.args.get('id', None)
    test = request.args.get('test', None)
    if test:
        return render_picard_test()
    if docid is not None:
        return render_picard_maass_forms_get_one(docid)
    ds = [(_['_id'], _['ev']) for _ in htp.find({}, ['ev'], sort=[('ev', 1)])]
    data = None
    # TT= MaassformsPicardDisplay(mwfp_dbname,collection='all',skip=[0],limit=[10],keys=['Eigenvalue'])
    # TT.set_table_browsing()
    # TT.get_metadata()
    if docid:
        data = htp.find_one({'_id': docid})
    return render_template(
        "maass_form_picard.html",
        title="Maass Forms on \(\mathrm{PSL}(2,\mathbb{Z}[i])\)",
        data=data,
        id=docid,
        ds=ds)
Example #9
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
Example #10
0
def evs_table2(search, twodarray=False):
    r"""
    Returns an object containing the results of a search for Maass forms.
    """
    DB = connect_db()
    table = []
    nrows = 0
    fs = DB.get_Maass_forms(search)
    mwf_logger.debug("numrec:{0}".format(len(fs)))
    for f in fs:  # indices:
        row = {}
        R = f.get('Eigenvalue', None)
        N = f.get('Level', None)
        k = f.get('Weight', None)
        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
        ##
        chi = f.get('Character', 0)
        conrey = f.get('Conrey', 0)
        if conrey == 0:  # we need to change to conrey's notation
            chi = DB.getDircharConrey(N, chi)
        ## Now get the COnrey number.
        ## First the character
        if k == 0:
            url = url_for('characters.render_Dirichletwebpage', modulus=N, number=chi)
            s = "<a href={0}>{1}</a>".format(url, chi)
            row['ch'] = s
        else:
            row['ch'] = "eta"
        st = f.get('Symmetry', -1)
        if st == 1:
            st = "odd"
        elif st == 0:
            st = "even"
        else:
            st = "n/a"
        row['symmetry'] = st
        er = f.get('Error', 0)
        if er > 0:
            er = "{0:1.0e}".format(er)
        else:
            er = "unknown"
        row['err'] = er
        dim = f.get('Dim', 0)
        if dim is None:
            dim = 1  # "undefined"
        row['dim'] = dim
        numc = f.get('Numc', 0)
        row['numc'] = numc
        cev = f.get('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
                s = '{0}'.format(cev[0])
                for j in range(1, len(cev)):
                    s += ",{0}".format(cev[j])
            elif len(cev) == 1:
                s = str(cev[0])
            elif len(cev) == 0:
                s = 'n/a'
            row['cuspevs'] = s

        url = url_for('mwf.render_one_maass_waveform', maass_id=f.get('_id'))
        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, filtered=False)
    evs['totalrecords_filtered'] = DB.count(search, filtered=True)

    return evs
Example #11
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))
    try:
        MF = WebMaassForm(DB, 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 waveforms', 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'] += " on \(\Gamma_{0}( %s )\)" % info['MF'].level
        if hasattr(MF, 'R') and MF.R:
            info['title'] += " 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(DB.count()))
    ch = info['MF'].character
    s = "\( \chi_{" + str(level) + "}(" + str(ch) + ",\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': '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['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))
    return render_template("mwf_one_form.html", **info)
Example #12
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
Example #13
0
def evs_table2(search, twodarray=False):
    r"""
    Returns an object containing the results of a search for Maass forms.
    """
    DB = connect_db()
    table = []
    nrows = 0
    fs = DB.get_Maass_forms(search)
    mwf_logger.debug("numrec:{0}".format(len(fs)))
    for f in fs:  # indices:
        row = {}
        R = f.get('Eigenvalue', None)
        N = f.get('Level', None)
        k = f.get('Weight', None)
        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
        ##
        chi = f.get('Character', 0)
        conrey = f.get('Conrey', 0)
        if conrey == 0:  # we need to change to conrey's notation
            chi = DB.getDircharConrey(N, chi)
        ## Now get the COnrey number.
        ## First the character
        if k == 0:
            url = url_for('characters.render_Dirichletwebpage',
                          modulus=N,
                          number=chi)
            s = "<a href={0}>{1}</a>".format(url, chi)
            row['ch'] = s
        else:
            row['ch'] = "eta"
        st = f.get('Symmetry', -1)
        if st == 1:
            st = "odd"
        elif st == 0:
            st = "even"
        else:
            st = "n/a"
        row['symmetry'] = st
        er = f.get('Error', 0)
        if er > 0:
            er = "{0:1.0e}".format(er)
        else:
            er = "unknown"
        row['err'] = er
        dim = f.get('Dim', 0)
        if dim is None:
            dim = 1  # "undefined"
        row['dim'] = dim
        numc = f.get('Numc', 0)
        row['numc'] = numc
        cev = f.get('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
                s = '{0}'.format(cev[0])
                for j in range(1, len(cev)):
                    s += ",{0}".format(cev[j])
            elif len(cev) == 1:
                s = str(cev[0])
            elif len(cev) == 0:
                s = 'n/a'
            row['cuspevs'] = s

        url = url_for('mwf.render_one_maass_waveform', maass_id=f.get('_id'))
        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, filtered=False)
    evs['totalrecords_filtered'] = DB.count(search, filtered=True)

    return evs
Example #14
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))
    try:
        MF = WebMaassForm(DB, 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 waveforms', 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'] += " on \(\Gamma_{0}( %s )\)" % info['MF'].level
        if hasattr(MF, 'R') and MF.R:
            info['title'] += " 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(DB.count()))
    ch = info['MF'].character
    s = "\( \chi_{" + str(level) + "}(" + str(ch) + ",\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': '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['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))
    return render_template("mwf_one_form.html", **info)