def processMaassNavigation(numrecs=35): """ Produces a table of numrecs Maassforms with Fourier coefficients in the database """ s = '<h5>The L-functions attached to the first 4 weight 0 Maass newforms with trivial character on Hecke congruence groups $\Gamma_0(N)$</h5>' s += '<table>\n' i = 0 maxinlevel = 4 for level in [1, 2, 3, 4, 5, 6, 7, 9]: j = 0 s += '<tr>\n' s += '<td><bold>N={0}:</bold></td>\n'.format(level) finds = maass_db.get_Maass_forms({'Level': int(level), 'char': 1, 'Newform' : None}) for f in finds: nc = f.get('Numc', 0) if nc <= 0: continue R = f.get('Eigenvalue', 0) if R == 0: continue if f.get('Symmetry',0) == 1: T = 'o' else: T = 'e' _until = min(12, len(str(R))) Rst = str(R)[:_until] idd = f.get('maass_id', None) if idd is None: continue idd = str(idd) url = url_for('.l_function_maass_page', maass_id=idd) s += '<td><a href="{0}">{1}</a>{2}'.format(url, Rst, T) i += 1 j += 1 if i >= numrecs or j >= maxinlevel: break s += '</tr>\n' if i > numrecs: break s += '</table>\n' return s
def evs_table2(search, twodarray=False, limit=50, offset=0): r""" Returns an object containing the results of a search for Maass forms. """ table = [] nrows = 0 fs = maass_db.get_Maass_forms(search, limit=limit, offset=offset) 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) ## 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(float(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('maass_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', 'cmf.fricke', 'cmf.atkin-lehner' ] 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'] = maass_db.count(search) evs['totalrecords_filtered'] = len(fs) return evs
def set_table(self, data={}): # data = maass_db.get_search_parameters(data,kwds mwf_logger.debug("set table, data = {0}".format(data)) mwf_logger.debug("skip= {0}".format(self.skip)) mwf_logger.debug("limit= {0}".format(self.limit)) self.table = [] data['skip'] = self.skip data['limit'] = self.limit l1 = self.keys.index('Level') level_ll = (self.skip[l1]) * self.limit[l1] level_ul = (self.skip[l1] + 1) * self.limit[l1] ev_limit = self.limit[self.keys.index('Eigenvalue')] ev_skip = self.skip[self.keys.index('Eigenvalue')] * ev_limit new_cols = [] levels = maass_db.levels() mwf_logger.debug("levels= {0}".format(levels)) cur_level = data.get('level', None) cur_wt = data.get('weight', None) print("cur_level=", cur_level) print("cur_wt=", cur_wt) for N in levels: if cur_level and cur_level != N: continue N = int(N) if N < level_ll or N > level_ul: continue print("N=", N) weights = maass_db.weights(N) print("weights=", weights) self.wt = weights for k in weights: if cur_wt is not None and cur_wt != k: continue print("k=", k) k = int(k) evs = [] query = {'Level': N, 'Weight': k} totalc = maass_db.count(query) finds = maass_db.get_Maass_forms(query, limit=ev_limit, offset=ev_skip) for rec in finds: row = {} maass_id = rec.get('_id', None) row['R'] = rec.get('Eigenvalue', None) row['st'] = rec.get("Symmetry") row['cusp_evs'] = rec.get("Cusp_evs") row['err'] = rec.get('Error', 0) row['url'] = url_for('mwf.render_one_maass_waveform', maass_id=maass_id) row['numc'] = rec.get('Numc', 0) evs.append(row) kmax = int(totalc / ev_limit) paging = [] for j in range(ev_skip, kmax): k0 = (j) * ev_limit k1 = (j + 1) * ev_limit url = url_for('mwf.render_maass_waveforms', level=N, weight=k, skip=ev_skip + j, limit=ev_limit) skip = { 'url': url, 'k0': k0, 'k1': k1, 'cur_skip': ev_skip, 'cur_limit': ev_limit, "skip": j } paging.append(skip) # s+="]" self.paging = paging smalltbl = {'N': N, 'k': k, 'evs': evs, 'paging': paging} if len(evs) > 0: self.table.append(smalltbl) print("table=", self.table) self.cols = new_cols
def set_table(self, data={}): # data = maass_db.get_search_parameters(data,kwds mwf_logger.debug("set table, data = {0}".format(data)) mwf_logger.debug("skip= {0}".format(self.skip)) mwf_logger.debug("limit= {0}".format(self.limit)) self.table = [] data['skip'] = self.skip data['limit'] = self.limit l1 = self.keys.index('Level') level_ll = (self.skip[l1]) * self.limit[l1] level_ul = (self.skip[l1] + 1) * self.limit[l1] ev_limit = self.limit[self.keys.index('Eigenvalue')] ev_skip = self.skip[self.keys.index('Eigenvalue')] * ev_limit new_cols = [] levels = maass_db.levels() mwf_logger.debug("levels= {0}".format(levels)) cur_level = data.get('level', None) cur_wt = data.get('weight', None) print "cur_level=", cur_level print "cur_wt=", cur_wt for N in levels: if cur_level and cur_level != N: continue N = int(N) if N < level_ll or N > level_ul: continue print "N=", N weights = maass_db.weights(N) print "weights=", weights self.wt = weights for k in weights: if cur_wt is not None and cur_wt != k: continue print "k=", k k = int(k) evs = [] query = {'Level': N, 'Weight': k} totalc = maass_db.count(query) finds = maass_db.get_Maass_forms(query, limit=ev_limit, offset=ev_skip) for rec in finds: row = {} maass_id = rec.get('_id', None) row['R'] = rec.get('Eigenvalue', None) row['st'] = rec.get("Symmetry") row['cusp_evs'] = rec.get("Cusp_evs") row['err'] = rec.get('Error', 0) row['url'] = url_for('mwf.render_one_maass_waveform', maass_id=maass_id) row['numc'] = rec.get('Numc', 0) evs.append(row) kmax = int(totalc / ev_limit) paging = [] for j in range(ev_skip, kmax): k0 = (j) * ev_limit k1 = (j + 1) * ev_limit url = url_for( 'mwf.render_maass_waveforms', level=N, weight=k, skip=ev_skip + j, limit=ev_limit) skip = {'url': url, 'k0': k0, 'k1': k1, 'cur_skip': ev_skip, 'cur_limit': ev_limit, "skip": j} paging.append(skip) # s+="]" self.paging = paging smalltbl = {'N': N, 'k': k, 'evs': evs, 'paging': paging} if len(evs) > 0: self.table.append(smalltbl) print "table=", self.table self.cols = new_cols
def evs_table2(search, twodarray=False, limit=50, offset=0): r""" Returns an object containing the results of a search for Maass forms. """ table = [] nrows = 0 fs = maass_db.get_Maass_forms(search, limit=limit, offset=offset) 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) ## 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(float(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('maass_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'] = maass_db.count(search) evs['totalrecords_filtered'] = len(fs) return evs
def paintSvgMaass(min_level, max_level, min_R, max_R, weight=0, char=1, width=1000, heightfactor=20, L=""): ''' Returns the contents (as a string) of the svg-file for all Maass forms in the database. Takes all levels from min_level to max_level Spectral parameter in [min_R, max_R] Set L="/L" to make link go to the L-function ''' xMax = int(max_R) yMax = int(max_level) xMin = int(min_R) yMin = int(min_level) extraSpace = 40 length_R = xMax - xMin length_level = yMax - yMin + 1 if length_level < 15: heightfactor = heightfactor * 2 height = length_level * heightfactor + extraSpace xfactor = (width - extraSpace) / length_R yfactor = (height - extraSpace) / length_level ticlength = 4 radius = 3 xshift = extraSpace # Start of file and add coordinate system ans = "<svg xmlns='http://www.w3.org/2000/svg'" ans += " xmlns:xlink='http://www.w3.org/1999/xlink'" ans += " height='{0}' width='{1}'>\n".format(height + 20, width + 20) ans += paintCSMaass(width, height, xMin, xMax, yMin, yMax, xfactor, yfactor, ticlength, xshift) # Fetch Maass forms from database search = { 'level1': yMin, 'level2': yMax, 'char': char, 'R1': xMin, 'R2': xMax, 'Newform': None, 'weight': weight } projection = ['maass_id', 'Eigenvalue', 'Level', 'Symmetry'] forms = maass_db.get_Maass_forms(search, projection, sort=[], limit=10000) # Loop through all forms and add a clickable dot for each for f in forms: linkurl = L + "/ModularForm/GL2/Q/Maass/{0}".format(f['maass_id']) x = (f['Eigenvalue'] - xMin) * xfactor + xshift y = (f['Level'] - yMin + 1) * yfactor try: # Shifting even slightly up and odd slightly down if f['Symmetry'] == 0 or f['Symmetry'] == 'even': y -= 1 color = signtocolour(1) elif f['Symmetry'] == 1 or f['Symmetry'] == 'odd': y += 1 color = signtocolour(-1) else: color = signtocolour(0) except Exception: color = signtocolour(0) ans += "<a xlink:href='{0}' target='_top'>".format(linkurl) ans += "<circle cx='{0}' cy='{1}' ".format(str(x)[0:6], str(y)) ans += "r='{0}' style='fill:{1}'>".format(str(radius), color) ans += "<title>{0}</title></circle></a>\n".format(f['Eigenvalue']) ans += "</svg>" return ans