def test_spinner_smallest_step(self, bokeh_model_page) -> None: spinner = Spinner(value=0, low=0, high=1, step=1e-16, css_classes=["foo"]) spinner.js_on_change('value', CustomJS(code=RECORD("value", "cb_obj.value"))) page = bokeh_model_page(spinner) input_el = page.driver.find_element_by_css_selector('.foo input') enter_text_in_element(page.driver, input_el, "0.43654644333534") results = page.results assert results['value'] == 0.43654644333534 enter_text_in_element(page.driver, input_el, "1e-16", click=2) results = page.results assert results['value'] == 1e-16 assert page.has_no_console_errors()
def test_input_smallest_step(self, bokeh_model_page) -> None: spinner = Spinner(value=0, low=0, high=1, step=1e-16, css_classes=["foo"]) spinner.js_on_change('value', CustomJS(code=RECORD("value", "cb_obj.value"))) page = bokeh_model_page(spinner) el = page.driver.find_element_by_css_selector('.foo input') enter_value_in_spinner(page.driver, el, 1e-16) results = page.results assert float(results['value']) == 1e-16 enter_value_in_spinner(page.driver, el, 0.43654644333534) results = page.results assert float(results['value']) == 0.43654644333534 assert page.has_no_console_errors()
# get the center/means in each direction cp = np.mean(P_new, axis=0) r_x, r_y, aou = calc_covariance_matrix(P_new, cp, num_trials) # results_div.text = tdoa_results + str(aou) + "</font>" aou_text.value = "{:.6f}".format(aou) # st_source.data = dict(sx=Sn[:, 0, :].reshape(-1), sy=Sn[:, 1, :].reshape(-1)) etx_source.data = dict(x=P_new[:, 0]*1, y=P_new[:, 1]*1) ctx_source.data = dict(x=[cp[0]*1], y=[cp[1]*1]) ell_source.data = dict(x=r_x*1, y=r_y*1) # setup the event callbacks for the plot st_source.js_on_change('patching', update_plot_callback) ig_source.js_on_change('patching', update_plot_callback) tx_source.js_on_change('patching', update_plot_callback) p_err_spin.js_on_change('value', update_plot_callback) t_err_spin.js_on_change('value', update_plot_callback) # p_err_spin.on_change('value', update_plot) spin_inputs = row([p_err_spin, Spacer(width=15), t_err_spin]) inputs = column([Div(text="""<B>Receiver Positions</B>""", width=220), st_datatable, Spacer(height=10), Div(text="""<B>Initial Guess</B>""", width=220), ig_datatable, Spacer(height=10), Div(text="""<B>Emitter Position</B>""", width=220), tx_datatable, spin_inputs, Spacer(height=10), aou_text]) layout = row(inputs, Spacer(width=20), tdoa_plot) show(layout)
def test_spinner_spinning_events(self, bokeh_model_page) -> None: spinner = Spinner(value=0, low=0, high=1, step=0.01, css_classes=["foo"]) spinner.js_on_change('value', CustomJS(code=RECORD("value", "cb_obj.value"))) page = bokeh_model_page(spinner) input_el = page.driver.find_element_by_css_selector('.foo input') btn_up_el = page.driver.find_element_by_css_selector( '.foo .bk-spin-btn-up') btn_down_el = page.driver.find_element_by_css_selector( '.foo .bk-spin-btn-down') enter_text_in_element(page.driver, input_el, "0.5") results = page.results assert results['value'] == 0.5 #click btn up actions = ActionChains(page.driver) actions.click(on_element=btn_up_el) actions.perform() results = page.results assert results['value'] == 0.51 #dbl click btn down actions = ActionChains(page.driver) actions.double_click(on_element=btn_down_el) actions.perform() results = page.results assert results['value'] == 0.49 #arrow up actions = ActionChains(page.driver) actions.click(on_element=input_el) actions.send_keys(Keys.ARROW_UP) actions.perform() results = page.results assert results['value'] == 0.50 #arrow down actions = ActionChains(page.driver) actions.click(on_element=input_el) actions.key_down(Keys.ARROW_DOWN) actions.perform() results = page.results assert results['value'] == 0.49 #page up actions = ActionChains(page.driver) actions.click(on_element=input_el) actions.key_down(Keys.PAGE_UP) actions.perform() results = page.results assert results['value'] == 0.59 #page down actions = ActionChains(page.driver) actions.click(on_element=input_el) actions.key_down(Keys.PAGE_DOWN) actions.perform() results = page.results assert results['value'] == 0.49 assert page.has_no_console_errors()
import numpy as np from bokeh.io import show from bokeh.layouts import column, row from bokeh.models import ColumnDataSource, CustomJS, Spinner from bokeh.plotting import Figure data = np.random.rand(10, 2) cds = ColumnDataSource(data=dict(x=data[:, 0], y=data[:, 1])) p = Figure(x_range=(0, 1), y_range=(0, 1)) points = p.scatter(x='x', y='y', source=cds) w = Spinner(title="Glyph size", low=1, high=20, step=0.1, value=4, width=100) cb = CustomJS(args={'points': points}, code=""" points.glyph.size = cb_obj.value """) points.glyph.size = w.value w.js_on_change('value', cb) show(row(column(w, width=100), p))
import numpy as np from bokeh.io import show from bokeh.plotting import Figure from bokeh.models import ColumnDataSource, CustomJS, Spinner from bokeh.layouts import row, widgetbox data = np.random.rand(10, 2) cds = ColumnDataSource(data=dict(x=data[:, 0], y=data[:, 1])) p = Figure(x_range=(0, 1), y_range=(0, 1)) points = p.scatter(x='x', y='y', source=cds) w = Spinner(title="Glyph size", low=1, high=20, step=0.1, value=4, width=100) cb = CustomJS(args={'points': points}, code=""" points.glyph.size = cb_obj.value """) points.glyph.size = w.value w.js_on_change('value', cb) show(row([widgetbox(w, width=100), p]))
def plotfits(dirname): session.modifeid = True session['pathname'] = app.config['UPLOAD_FOLDER']+'/'+dirname+'/' session['stats'] = {} session['date'] = {} # pegar a data para converter em juliana e inserir nas análises with open(session['pathname']+'data.json') as f: dirdata = json.load(f) r = dirdata['r'] session['r'] = r celestial = False # Faz logo algumas estatísticas da imagem for fil in BANDAS: for fname in dirdata[fil]: img, header = fits.getdata(session['pathname']+fname, header=True) session['stats'][fil+':'+fname] = sigma_clipped_stats(img,sigma=3.0) if not celestial: celestial = WCS(header).has_celestial session['wcs'] = session['pathname']+fname session['date'][fil+':'+fname] = Time(header['DATE-OBS']).jd # a data de observação de cada imagem # Abrindo coordenadas se salvas try: cordata = pd.read_excel(session['pathname']+'data.xlsx') # Dados que serão usados para fazer computação e visualizar os pontos source = ColumnDataSource(cordata) print('Coordenadas carregadas.') except FileNotFoundError: print('Não há coordenadas salvas em %s' % session['pathname']) # Dados que serão usados para fazer computação e visualizar os pontos source = ColumnDataSource(dict( ra=[], dec=[], x=[], y=[], flux = [], j = [], k = [], tipo=[], # se é obj, src ou sky banda=[], # o filtro da imagem e arquivo sid=[], # id da estrela copiada colors=[], # para colorir de acordo o tipo de objeto )) # Constrói a tabaela de table que poderá ser usada para designar as posições do objeto, estrela e céu tabela = DataTable(source=source,columns=[ TableColumn(field='x',title='x'), TableColumn(field='y',title='y'), TableColumn(field='ra',title='ra'), TableColumn(field='dec',title='dec'), TableColumn(field='j',title='j'), TableColumn(field='k',title='k'), TableColumn(field='flux',title='flux'), TableColumn(field='tipo',title='tipo'), TableColumn(field='banda',title='banda'), TableColumn(field='sid',title='sid') ], editable=True) P = [] # lista de gráficos para o plot Nimg = [] # lista de imagens normalizadas para o contraste for fil in BANDAS: for fname in dirdata[fil]: img = fits.getdata(session['pathname']+fname) stretch = HistEqStretch(img) # Histograma, melhor função para granular a imagem h,w = img.shape # número de linhas e colunas da matriz da imagem nimg = stretch(normal(img)).tolist() p = figure(plot_width=700, active_scroll='wheel_zoom') p.image(image=[nimg], x=0, y=0, dw=w, dh=h, palette='Greys256', level="image") p.x_range.range_padding = p.y_range.range_padding = 0 p.grid.grid_line_width = 0 view = CDSView(source=source,filters=[GroupFilter(column_name='banda', group=fil+':'+fname)]) c = p.circle('x','y', source=source, view=view, color='colors', fill_color=None, radius=r, line_width=2) cd = p.circle_dot('x','y', source=source, view=view, color='colors', size=2) tool = PointDrawTool(renderers=[c,cd],empty_value='na') p.add_tools(tool) p.toolbar.active_tap = tool p.toolbar.active_inspect = None tab = Panel(child=p, title=fil+':'+fname) P.append(tab) Nimg.append(nimg) graficos = Tabs(tabs=P) graficos.js_on_change('active', CustomJS(code=''' tabs_onchange(cb_obj); ''')) contrast = Slider(start=-1, end=6, value=1, step=0.05, title="Contraste") contrast.js_on_change('value',CustomJS(args = dict(tabs=graficos.tabs, im=Nimg), code = ''' contrast_onchange(cb_obj,tabs,im); ''')) # Selecionar o tipo de fonte luminosa: obj, src ou sky radio_title = Paragraph(text='Escolha o tipo:') LABELS = ['obj','src','sky'] radio_group = RadioGroup(labels=LABELS, active=0) # Evento de mudança da tabela de table, para inserir table padrão nas colunas inalteradas source.js_on_change('data', CustomJS(args=dict(radio=radio_group, graficos=graficos), code=''' source_onchange(cb_obj, radio, graficos); ''')) # Muda o raio da abertura fotométrica spinner = Spinner(title="Raio", low=1, high=40, step=0.5, value=r, width=80) spinner.js_on_change('value', CustomJS(args=dict(source=source, tabs=graficos.tabs), code=''' radius_onchange(cb_obj,source,tabs); ''')) # Coluna de requisição text1 = Div(text='<b>Instruções:</b><p>1. Digite a chave do Astrometry.net') apikey_input = TextInput(title='Apikey do Astrometry.net', placeholder='digite a chave aqui') text2 = Div(text='''<p>2. Selecione qual imagem será usada como referência para o astrometry.net e para o cálculo das coordenadas celestes</p>''') seletor = Select(title='Escolha a imagem de referência', options=[*session['stats'].keys()]) text3 = Div(text='3. Clique abaixo pra requisitar a correção WCS') send_astrometry = Toggle(label='Solução de placa do astrometry.net', disabled=celestial) send_astrometry.js_on_click(CustomJS(args=dict(key=apikey_input, source=source, selected=seletor), code=''' send_astrometry(cb_obj,key,source,selected); ''')) # o Botão de salvar irá enviar um json para o servidor que irá ler e fazer os procedimentos posteriores text4 = Div(text='4. Salve a tabela de table clicando em salvar.') salvar = Button(label='Salvar tabela', button_type="success") salvar.js_on_click(CustomJS(args=dict(source=source), code=''' salvar_onclick(source); ''')) reset = Button(label='Limpar', button_type='success') reset.js_on_click(CustomJS(args=dict(source=source), code=''' reset_onclick(source); ''')) copiar = Button(label='Copiar coordenadas', button_type='success') copiar.js_on_click(CustomJS(args=dict(source=source, ref=seletor, active=graficos), code=''' add_data(source,ref,active); ''')) div, script = components(row(column(contrast,spinner,radio_title,radio_group),\ column(row(reset,copiar,salvar), graficos, tabela, sizing_mode='stretch_both'), column(text1,apikey_input,text2,seletor,text3,send_astrometry,text4))) return render_template('plot.html', the_div=div, the_script=script,filename=dirdata['name'])