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)
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)
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
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
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)
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)
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)
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)
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
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
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)
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
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
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)