def target_plan(context): """ Displays form and renders plot for visibility calculation. Using this templatetag to render a plot requires that the context of the parent view have values for start_time, end_time, and airmass. """ request = context['request'] plan_form = TargetVisibilityForm() visibility_graph = '' if all(request.GET.get(x) for x in ['start_time', 'end_time']): plan_form = TargetVisibilityForm({ 'start_time': request.GET.get('start_time'), 'end_time': request.GET.get('end_time'), 'airmass': request.GET.get('airmass'), 'target': context['object'] }) if plan_form.is_valid(): start_time = parse(request.GET['start_time']) end_time = parse(request.GET['end_time']) if request.GET.get('airmass'): airmass_limit = float(request.GET.get('airmass')) else: airmass_limit = None visibility_data = get_sidereal_visibility(context['object'], start_time, end_time, 10, airmass_limit) plot_data = [ go.Scatter(x=data[0], y=data[1], mode='lines', name=site) for site, data in visibility_data.items() ] layout = go.Layout(yaxis=dict(autorange='reversed')) visibility_graph = offline.plot( go.Figure(data=plot_data, layout=layout), output_type='div', show_link=False ) return { 'form': plan_form, 'target': context['object'], 'visibility_graph': visibility_graph }
def custom_observation_plan(target, facility, length=1, interval=30, airmass_limit=3.0): """ Displays form and renders plot for visibility calculation. Using this templatetag to render a plot requires that the context of the parent view have values for start_time, end_time, and airmass. """ visibility_graph = '' start_time = datetime.datetime.now() end_time = start_time + datetime.timedelta(days=length) visibility_data = get_sidereal_visibility(target, start_time, end_time, interval, airmass_limit) i = 0 plot_data = [] for site, data in visibility_data.items(): plot_data.append(go.Scatter(x=data[0], y=data[1], mode='markers+lines', marker={'symbol': i}, name=site)) i += 1 layout = go.Layout( xaxis=dict(gridcolor='#D3D3D3',showline=True,linecolor='#D3D3D3',mirror=True,title='Date'), yaxis=dict(range=[airmass_limit,1.0],gridcolor='#D3D3D3',showline=True,linecolor='#D3D3D3',mirror=True,title='Airmass'), #xaxis={'title': 'Date'}, #yaxis={'autorange': 'reversed', 'title': 'Airmass'}, plot_bgcolor='white' ) visibility_graph = offline.plot( go.Figure(data=plot_data, layout=layout), output_type='div', show_link=False ) return { 'visibility_graph': visibility_graph }
def test_get_visibility_invalid_target_type(self): invalid_target = self.target invalid_target.type = 'Invalid Type' end = self.start + timedelta(minutes=60) airmass = get_sidereal_visibility(invalid_target, self.start, end, self.interval, self.airmass_limit) self.assertEqual(len(airmass), 0)
def observation_plan(target, facility, length=7, interval=60, airmass_limit=None): """ Displays form and renders plot for visibility calculation. Using this templatetag to render a plot requires that the context of the parent view have values for start_time, end_time, and airmass. """ visibility_graph = '' start_time = datetime.now() end_time = start_time + timedelta(days=length) visibility_data = get_sidereal_visibility(target, start_time, end_time, interval, airmass_limit) plot_data = [ go.Scatter(x=data[0], y=data[1], mode='lines', name=site) for site, data in visibility_data.items() ] layout = go.Layout(yaxis=dict(autorange='reversed')) visibility_graph = offline.plot(go.Figure(data=plot_data, layout=layout), output_type='div', show_link=False) return {'visibility_graph': visibility_graph}
def test_get_visibility_sidereal(self, mock_facility): mock_facility.return_value = {'Fake Robotic Facility': FakeRoboticFacility} end = self.start + timedelta(minutes=60) airmass = get_sidereal_visibility(self.target, self.start, end, self.interval, self.airmass_limit) airmass_data = airmass['(Fake Robotic Facility) Siding Spring'][1] expected_airmass = [ 1.2619096566629477, 1.2648181328558852, 1.2703522349950636, 1.2785703053923894, 1.2895601364316183, 1.3034413026227516, 1.3203684217446099 ] self.assertEqual(len(airmass_data), len(expected_airmass)) for i in range(0, len(expected_airmass)): self.assertAlmostEqual(airmass_data[i], expected_airmass[i], places=3)
def target_plan(context, fast_render=False, width=600, height=400, background=None, label_color=None, grid=True): """ Displays form and renders plot for visibility calculation. Using this templatetag to render a plot requires that the context of the parent view have values for start_time, end_time, and airmass. :param fast_render: Render the plot on page load, defaults to the next 24hrs and 2.5 airmass :type fast_render: bool :param width: Width of generated plot :type width: int :param height: Height of generated plot :type width: int :param background: Color of the background of generated plot. Can be rgba or hex string. :type background: str :param label_color: Color of labels/tick labels. Can be rgba or hex string. :type label_color: str :param grid: Whether to show grid lines. :type grid: bool """ request = context['request'] plan_form = TargetVisibilityForm() visibility_graph = '' if all(request.GET.get(x) for x in ['start_time', 'end_time']) or fast_render: plan_form = TargetVisibilityForm({ 'start_time': request.GET.get('start_time', datetime.utcnow()), 'end_time': request.GET.get('end_time', datetime.utcnow() + timedelta(days=1)), 'airmass': request.GET.get('airmass', 2.5), 'target': context['object'] }) if plan_form.is_valid(): start_time = plan_form.cleaned_data['start_time'] end_time = plan_form.cleaned_data['end_time'] airmass_limit = plan_form.cleaned_data['airmass'] visibility_data = get_sidereal_visibility(context['object'], start_time, end_time, 10, airmass_limit) plot_data = [ go.Scatter(x=data[0], y=data[1], mode='lines', name=site) for site, data in visibility_data.items() ] layout = go.Layout(yaxis=dict(autorange='reversed'), width=width, height=height, paper_bgcolor=background, plot_bgcolor=background) layout.legend.font.color = label_color fig = go.Figure(data=plot_data, layout=layout) fig.update_yaxes(showgrid=grid, color=label_color, showline=True, linecolor=label_color, mirror=True) fig.update_xaxes(showgrid=grid, color=label_color, showline=True, linecolor=label_color, mirror=True) visibility_graph = offline.plot(fig, output_type='div', show_link=False) return { 'form': plan_form, 'target': context['object'], 'visibility_graph': visibility_graph }