From 237c171a977b82880df6998bf2e7d399cb01be48 Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Mon, 23 Aug 2021 14:52:15 +0200 Subject: [PATCH 01/93] Polarization visualization prototype. --- orangecontrib/spectroscopy/widgets/owhyper.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index b462f7843..e65c147ff 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -847,6 +847,8 @@ def __init__(self, parent): self.data = None self.data_ids = {} + self.p_markings = [] + def init_interface_data(self, data): self.init_attr_values(data) @@ -941,6 +943,9 @@ def update_view(self): self.parent.Information.not_shown.clear() self.img.clear() self.img.setSelection(None) + for m in self.p_markings: + self.plot.removeItem(m) + self.p_markings = [] self.legend.set_colors(None) self.lsx = None self.lsy = None @@ -973,7 +978,7 @@ def set_visible_image_comp_mode(self, comp_mode: QPainter.CompositionMode): @staticmethod def compute_image(data: Orange.data.Table, attr_x, attr_y, - image_values, image_values_fixed_levels, state: TaskState): + image_values, image_values_fixed_levels, choose, state: TaskState): if data is None or attr_x is None or attr_y is None: raise UndefinedImageException From bcde9105d1ec41afd4b3f3565fec02b52e32795f Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Tue, 28 Sep 2021 22:17:29 +0200 Subject: [PATCH 02/93] HyperSpectra: a cyclic HSV color map from matplotlib --- orangecontrib/spectroscopy/widgets/owhyper.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index e65c147ff..70b7e84b3 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -244,6 +244,10 @@ def color_palette_table(colors, underflow=None, overflow=None): # misc ("rainbow", {0: np.array(colorcet.rainbow_bgyr_35_85_c73) * 255}), ("isolum", {0: np.array(colorcet.isoluminant_cgo_80_c38) * 255}), + + # cyclic + ("HSV", {0: pg.colormap.get("hsv", source='matplotlib').getLookupTable(nPts=256)}), + ] From 2e6e6129236ff4e20b23a35ff8ea2855bfde50ee Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Tue, 28 Sep 2021 22:19:48 +0200 Subject: [PATCH 03/93] Prototype Stokes method --- orangecontrib/spectroscopy/widgets/owpolar.py | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 orangecontrib/spectroscopy/widgets/owpolar.py diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py new file mode 100644 index 000000000..5b0913ddc --- /dev/null +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -0,0 +1,123 @@ +import numpy as np + +import Orange.data +from Orange.widgets.widget import OWWidget, Msg, Input, Output +from Orange.widgets import gui, settings + + +from orangecontrib.spectroscopy.data import _spectra_from_image, getx, build_spec_table +from orangecontrib.spectroscopy.utils import get_hypercube + + +def get_hypercubes(images): + output = [] + lsx, lsy = None, None + for im in images: + hypercube, lsx, lsy = get_hypercube(im, im.domain["map_x"], im.domain["map_y"]) + output.append(hypercube) + return output, lsx, lsy + + +def compute_theta(images): + return 0.5 * np.arctan2(images[1] - images[3], images[0] - images[2]) + + +def compute_intensity(images): + S0 = (images[0] + images[1] + images[2] + images[3]) * 0.5 + return S0 + + +def compute_amp(images): + return np.sqrt((images[3] - images[1])**2 + (images[2] - images[0])**2) / compute_intensity(images) + + +def hypercube_to_table(hc, wns, lsx, lsy): + table = build_spec_table(*_spectra_from_image(hc, + wns, + np.linspace(*lsx), + np.linspace(*lsy))) + return table + + +def process_polar(images): + hypercubes, lsx, lsy = get_hypercubes(images) + + wns = getx(images[0]) + + th = compute_theta(hypercubes) + amp = compute_amp(hypercubes) + int = compute_intensity(hypercubes) + + # join absorbance from images into a single image with a mean + intensity = hypercube_to_table(int, wns, lsx, lsy) + tht = hypercube_to_table(th, wns, lsx, lsy) + ampt = hypercube_to_table(amp, wns, lsx, lsy) + + output = intensity + output.th = tht + output.amp = ampt + + return output, intensity, tht, ampt + + +class OWPolar(OWWidget): + # Widget's name as displayed in the canvas + name = "Polar" + + # Short widget description + description = ( + "Polar.") + + icon = "icons/unknown.svg" + + # Define inputs and outputs + class Inputs: + data = Input("Data", Orange.data.Table, default=True) + + class Outputs: + polar = Output("Polar Data", Orange.data.Table, default=True) + intensity = Output("Intensity", Orange.data.Table) + theta = Output("Theta", Orange.data.Table) + amplitude = Output("Amplitude", Orange.data.Table) + + autocommit = settings.Setting(True) + + want_main_area = False + resizing_enabled = False + + def __init__(self): + super().__init__() + gui.auto_commit(self.controlArea, self, "autocommit", "Apply") + + + @Inputs.data + def set_data(self, dataset): + self.data = dataset + self.commit() + + def commit(self): + if self.data is None: + return + + # TODO for now this assumes images in the correct order of filenames with a Filename column + + fncol = self.data[:, "Filename"].metas.reshape(-1) + unique_fns = np.unique(fncol) + + # split images into separate tables + images = [] + for fn in unique_fns: + images.append(self.data[fn == fncol]) + + # TODO align images according to their positions + + out, int, th, amp = process_polar(images) + self.Outputs.polar.send(out) + self.Outputs.intensity.send(int) + self.Outputs.theta.send(th) + self.Outputs.amplitude.send(amp) + + +if __name__ == "__main__": # pragma: no cover + from Orange.widgets.utils.widgetpreview import WidgetPreview + WidgetPreview(OWPolar).run(Orange.data.Table("/home/marko/polar_preprocessed.pkl.gz")) From 2f1d7290e135c2d01704831da12d70f39d6da491 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Thu, 3 Mar 2022 16:29:11 +1100 Subject: [PATCH 04/93] Add files via upload --- orangecontrib/spectroscopy/widgets/owhyper.py | 59 +- orangecontrib/spectroscopy/widgets/owpolar.py | 1047 +++++++++++++++-- 2 files changed, 1024 insertions(+), 82 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 70b7e84b3..0a3b02770 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -52,6 +52,7 @@ from orangecontrib.spectroscopy.widgets.line_geometry import in_polygon, intersect_line_segments from orangecontrib.spectroscopy.widgets.utils import \ SelectionGroupMixin, SelectionOutputsMixin +from pyqtgraph.functions import mkBrush IMAGE_TOO_BIG = 1024*1024*100 @@ -244,12 +245,23 @@ def color_palette_table(colors, underflow=None, overflow=None): # misc ("rainbow", {0: np.array(colorcet.rainbow_bgyr_35_85_c73) * 255}), ("isolum", {0: np.array(colorcet.isoluminant_cgo_80_c38) * 255}), + ("Jet", {0: pg.colormap.get("jet", source='matplotlib').getLookupTable(nPts=256)}), + ("Viridis", {0: pg.colormap.get("viridis", source='matplotlib').getLookupTable(nPts=256)}), # cyclic ("HSV", {0: pg.colormap.get("hsv", source='matplotlib').getLookupTable(nPts=256)}), - ] - +#r, g, b, c, m, y, k, w +vector_colour = [ + ("Black", {0: (0,0,0)}), + ("White", {0: (255,255,255)}), + ("Red", {0: (255,0,0)}), + ("Green", {0: (0,255,0)}), + ("Blue", {0: (0,0,255)}), + ("Cyan", {0: (0,255,255)}), + ("Magenta", {0: (255,0,255)}), + ("Yellow", {0: (255,255,0)}), +] def palette_gradient(colors): n = len(colors) @@ -287,6 +299,13 @@ def color_palette_model(palettes, iconsize=QSize(64, 16)): model.appendRow([item]) return model +def vector_colour_model(colours): + model = QStandardItemModel() + for name, palette in colours: + item = QStandardItem(name) + item.setData(palette, Qt.UserRole) + model.appendRow([item]) + return model class AxesSettingsMixin: @@ -980,9 +999,30 @@ def set_visible_image_opacity(self, opacity: int): def set_visible_image_comp_mode(self, comp_mode: QPainter.CompositionMode): self.vis_img.setCompositionMode(comp_mode) + def set_vector_co(self, pen): + self.c.setPen(pen) + + def set_vector_scale(self, scale): + th = self.v[:,0] + v_mag = self.v[:,1] + amp = v_mag / max(v_mag) * (scale/100)# TODO, new setting: range + wy = self.shifty*2 + wx = self.shiftx*2 + y = np.linspace(*self.lsy)[self.yindex[self.valid]] + x = np.linspace(*self.lsx)[self.xindex[self.valid]] + dispx = amp*wx/2*np.cos(np.radians(th)) + dispy = amp*wy/2*np.sin(np.radians(th)) + xcurve = np.empty((dispx.shape[0]*2)) + ycurve = np.empty((dispy.shape[0]*2)) + xcurve[0::2], xcurve[1::2] = x - dispx, x + dispx + ycurve[0::2], ycurve[1::2] = y - dispy, y + dispy + connect = np.ones((dispx.shape[0]*2)) + connect[1::2] = 0 + self.c.setData(x=xcurve, y=ycurve, connect=connect) + @staticmethod def compute_image(data: Orange.data.Table, attr_x, attr_y, - image_values, image_values_fixed_levels, choose, state: TaskState): + vector_values, image_values, image_values_fixed_levels, choose, state: TaskState): if data is None or attr_x is None or attr_y is None: raise UndefinedImageException @@ -1128,6 +1168,13 @@ class Outputs(SelectionOutputsMixin.Outputs): rgb_green_value = ContextSetting(None) rgb_blue_value = ContextSetting(None) + show_vector_plot = Setting(False) + vector_angle = ContextSetting(None) + vector_magnitude = ContextSetting(None) + vector_colour_index = Setting(0) + vector_scale = Setting(1) + vector_opacity = Setting(255) + show_visible_image = Setting(False) visible_image_name = Setting(None) visible_image_composition = Setting('Normal') @@ -1244,16 +1291,17 @@ def __init__(self): splitter.setOrientation(Qt.Vertical) self.imageplot = ImagePlot(self) self.imageplot.selection_changed.connect(self.output_image_selection) - # add image settings to the main panne after ImagePlot.__init__ iabox.layout().addWidget(self.imageplot.axes_settings_box) icbox.layout().addWidget(self.imageplot.color_settings_box) + self.setup_vector_plot_controls() + # do not save visible image (a complex structure as a setting; # only save its name) self.visible_image = None self.setup_visible_image_controls() - + self.curveplot = CurvePlotHyper(self, select=SELECTONE) self.curveplot.selection_changed.connect(self.redraw_integral_info) self.curveplot.plot.vb.x_padding = 0.005 # pad view so that lines are not hidden @@ -1362,6 +1410,7 @@ def update_visible_image_opacity(self): def init_interface_data(self, data): self.init_attr_values(data) self.init_visible_images(data) + self.init_vector_plot(data) def output_image_selection(self): _, selected = self.send_selection(self.data, self.imageplot.selection_group) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 5b0913ddc..2594bf2c1 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -1,34 +1,621 @@ +import warnings +import os +import multiprocessing +from multiprocessing import shared_memory +from typing import List, Optional, Sequence +from collections import OrderedDict + +from Orange.util import wrap_callback +from Orange.widgets.utils.concurrent import ConcurrentWidgetMixin +from PyQt5.QtWidgets import QGridLayout +from scipy.optimize import OptimizeWarning + import numpy as np +import pandas as pd +from scipy.optimize import curve_fit, minpack +import math +from types import SimpleNamespace + +from orangecanvas.scheme import scheme +from orangecanvas.scheme import SchemeNode +from orangewidget.workflow.widgetsscheme import WidgetsScheme import Orange.data -from Orange.widgets.widget import OWWidget, Msg, Input, Output +from Orange.data import DiscreteVariable, ContinuousVariable, Domain, Variable +from Orange.data.table import Table +from Orange.widgets.widget import OWWidget, Msg, Input, Output, MultiInput from Orange.widgets import gui, settings +from orangewidget.gui import LineEditWFocusOut +from Orange.widgets.settings import \ + Setting, ContextSetting, DomainContextHandler, SettingProvider +from orangecontrib.spectroscopy.widgets.gui import lineEditFloatOrNone +from Orange.widgets.utils.itemmodels import DomainModel, VariableListModel +from Orange.widgets.utils.concurrent import TaskState, ConcurrentWidgetMixin +from Orange.widgets.utils.annotated_data import add_columns +from orangewidget.utils.listview import ListViewSearch +from Orange.data.util import get_indices + +from AnyQt.QtWidgets import QFormLayout, QWidget, QSplitter, QListView, QLabel, QLineEdit, QAbstractItemView, QSizePolicy +from AnyQt.QtCore import Qt, QSize from orangecontrib.spectroscopy.data import _spectra_from_image, getx, build_spec_table from orangecontrib.spectroscopy.utils import get_hypercube - -def get_hypercubes(images): +import time + +class Results(SimpleNamespace): + out = None + model = None + errorstate = 0 + +def unify_tables(piece): + if len(piece) > 0: + dom_n = [i.name for i in piece] + un, n = np.unique(dom_n, return_index=True) + dom = np.full((max(n)+1), None, dtype=object) + for i in n: + dom[i] = piece[i] + odom = [i for i in dom if i != None] + return odom + else: + return None + +def combine_visimg(data, polangles): + atts = [] + for k, i in enumerate(data): + try: + temp = i.attributes['visible_images'] + for j in temp: + tempname = str(j['name'] + f'({polangles[k]} Degrees)') + dictcopy = j.copy() + dictcopy.update({'name': tempname}) + atts = atts + [dictcopy] + except: + pass + attsdict = {'visible_images': atts} + return attsdict + +def run0(data, feature, alpha, map_x, map_y, invert_angles, polangles, state: TaskState): + + results = Results() + + alpha = alpha + + output, model, spectra, origmetas, errorstate = process_polar_abs(data, alpha, feature, map_x, map_y, invert_angles, polangles, state) + + + tempoutaddmetas = [[ContinuousVariable.make('Azimuth Angle (' + i.name + ')'), + ContinuousVariable.make('Hermans Orientation Function (' + i.name + ')'), + ContinuousVariable.make('Intensity (' + i.name + ')'), + ContinuousVariable.make('Amplitude (' + i.name + ')'), + ContinuousVariable.make('R-squared (' + i.name + ')')] for i in feature] + outaddmetas = [] + for i in tempoutaddmetas: + outaddmetas = outaddmetas + i + + tempmodaddmetas = [[ContinuousVariable.make('R-squared (' + i.name + ')'), + ContinuousVariable.make('a0 (' + i.name + ')'), + ContinuousVariable.make('a1 (' + i.name + ')'), + ContinuousVariable.make('a2 (' + i.name + ')')] for i in feature] + modaddmetas = [] + for i in tempmodaddmetas: + modaddmetas = modaddmetas + i + values = tuple([f'{i} Degrees' for i in polangles]) + PolAng = DiscreteVariable.make('Polarisation Angle', values=values) + + ometadom = data[0].domain.metas + outmetadom = (ometadom + tuple([PolAng]) + tuple(outaddmetas)) + modmetadom = (ometadom + tuple([PolAng]) + tuple(modaddmetas)) + ofeatdom = data[0].domain.attributes + datadomain = Domain(ofeatdom, metas = outmetadom) + moddomain = Domain(ofeatdom, metas = modmetadom) + + output_stack = tuple([output for i in polangles]) + model_stack = tuple([model for i in polangles]) + output = np.vstack(output_stack) + model = np.vstack(model_stack) + + outmetas = np.hstack((origmetas, output)) + modmetas = np.hstack((origmetas, model)) + + out = Table.from_numpy(datadomain, X=spectra, Y=None, metas=outmetas) + mod = Table.from_numpy(moddomain, X=spectra, Y=None, metas=modmetas) + + results.out = out + results.model = mod + results.errorstate = errorstate + + attsdict = combine_visimg(data, polangles) + + results.out.attributes = attsdict + results.model.attributes = attsdict + return results + +# def run1(data, feature, map_x, map_y, invert_angles, state: TaskState): +# results = Results() +# if data is not None: +# fncol = data[:, "Filename"].metas.reshape(-1) +# unique_fns = np.unique(fncol) + +# # split images into separate tables +# images = [] +# for fn in unique_fns: +# images.append(data[fn == fncol]) + +# try: +# output, spectra, origmetas = process_polar_stokes(images, feature, map_x, map_y, invert_angles, state) + +# tempoutaddmetas = [[ContinuousVariable.make('Azimuth Angle (' + i.name + ')'), +# ContinuousVariable.make('Amplitude (' + i.name + ')'), +# ContinuousVariable.make('Intensity (' + i.name + ')'),] for i in feature] +# outaddmetas = [] +# for i in tempoutaddmetas: +# outaddmetas = outaddmetas + i + +# PolAng = DiscreteVariable.make('Polarisation Angle', values=('0 Degrees','45 Degrees','90 Degrees','135/-45 Degrees')) + +# ometadom = data.domain.metas +# outmetadom = (ometadom + tuple([PolAng]) + tuple(outaddmetas)) +# ofeatdom = data.domain.attributes +# datadomain = Domain(ofeatdom, metas = outmetadom) + +# output = np.vstack((output, output, output, output)) + +# outmetas = np.hstack((origmetas, output)) + +# out = Table.from_numpy(datadomain, X=spectra, Y=None, metas=outmetas) + +# results.out = out +# results.out.attributes = data.attributes +# return results +# except: +# OWPolar.Warning.wrongdata() + + # elif deg0 and deg45 and deg90 and deg135 is not None: + + # for i in feature: + # featname = i.name + # try: + # deg0.domain[featname] + # deg45.domain[featname] + # deg90.domain[featname] + # deg135.domain[featname] + # except: + # OWPolar.Warning.missingfeat() + # return results + + # images = [deg0, deg45, deg90, deg135] + + # metas = [] + # attrs = [] + # class_vars = [] + # for i in images: + # metas = metas+[j for j in i.domain.metas] + # attrs = attrs+[j for j in i.domain.attributes] + # class_vars = class_vars+[j for j in i.domain.class_vars] + + # attrs = unify_tables(attrs) + # metas = unify_tables(metas) + # class_vars = unify_tables(class_vars) + + # dom = Domain(attrs, metas = metas) + + # for i, j in enumerate(images): + # images[i] = j.transform(dom) + + # try: + # output, spectra, origmetas = process_polar_stokes(images, feature, map_x, map_y, invert_angles, state) + + # tempoutaddmetas = [[ContinuousVariable.make('Azimuth Angle (' + i.name + ')'), + # ContinuousVariable.make('Amplitude (' + i.name + ')'), + # ContinuousVariable.make('Intensity (' + i.name + ')'),] for i in feature] + # outaddmetas = [] + # for i in tempoutaddmetas: + # outaddmetas = outaddmetas + i + + # PolAng = DiscreteVariable.make('Polarisation Angle', values=('0 Degrees','45 Degrees','90 Degrees','135/-45 Degrees')) + # #TODO: ensure all inputs have same domain variables/concatenate all domain vars + # ometadom = images[0].domain.metas + # outmetadom = (ometadom + tuple([PolAng]) + tuple(outaddmetas)) + # ofeatdom = images[0].domain.attributes + # datadomain = Domain(ofeatdom, metas = outmetadom) + + # output = np.vstack((output, output, output, output)) + + # outmetas = np.hstack((origmetas, output)) + + # out = Table.from_numpy(datadomain, X=spectra, Y=None, metas=outmetas) + + # results.out = out + # results.out.attributes = deg0.attributes + # return results + # except: + # OWPolar.Warning.wrongdata() + +def get_hypercubes(images, xy): output = [] lsx, lsy = None, None for im in images: - hypercube, lsx, lsy = get_hypercube(im, im.domain["map_x"], im.domain["map_y"]) + hypercube, lsx, lsy = get_hypercube(im, im.domain[xy[0]], im.domain[xy[1]]) output.append(hypercube) return output, lsx, lsy - - -def compute_theta(images): - return 0.5 * np.arctan2(images[1] - images[3], images[0] - images[2]) - - -def compute_intensity(images): - S0 = (images[0] + images[1] + images[2] + images[3]) * 0.5 - return S0 - - -def compute_amp(images): - return np.sqrt((images[3] - images[1])**2 + (images[2] - images[0])**2) / compute_intensity(images) +#Calculate by fitting to function +def Azimuth(x,a0,a1,a2): + return a0*np.sin(2*np.radians(x))+a1*np.cos(2*np.radians(x))+a2 + +def calc_angles(a0,a1): + return np.degrees(0.5*np.arctan(a0/a1)) + +def ampl1(a0,a1,a2): + return (a2+(math.sqrt(a0**2+a1**2))+a2-(math.sqrt(a0**2+a1**2))) + +def ampl2(a0,a1): + return (2*(math.sqrt(a0**2+a1**2))) + +def OrFunc(alpha,a0,a1,a2): + if alpha < 54.73: + Dmax = (2*a2+2*math.sqrt(a0**2+a1**2))/(2*a2-2*math.sqrt(a0**2+a1**2)) + return ((Dmax-1)/(Dmax+2)*(2/(3*np.cos(np.radians(alpha))**2-1))) + elif alpha >= 54.73: + Dmin = (2*a2-2*math.sqrt(a0**2+a1**2))/(2*a2+2*math.sqrt(a0**2+a1**2)) + return ((Dmin-1)/(Dmin+2)*(2/(3*np.cos(np.radians(alpha))**2-1))) + +def compute(xys, yidx, shapes, dtypes, polangles): + + tcvs = shared_memory.SharedMemory(name='cvs', create=False) + cvs = np.ndarray(shapes[0], dtype=dtypes[0], buffer=tcvs.buf) + tout = shared_memory.SharedMemory(name='out', create=False) + out = np.ndarray(shapes[3], dtype=dtypes[3], buffer=tout.buf) + tmod = shared_memory.SharedMemory(name='mod', create=False) + mod = np.ndarray(shapes[4], dtype=dtypes[4], buffer=tmod.buf) + tcoords = shared_memory.SharedMemory(name='coords', create=False) + coords = np.ndarray(shapes[5], dtype=dtypes[5], buffer=tcoords.buf) + tvars = shared_memory.SharedMemory(name='vars', create=False) + vars = np.ndarray(shapes[6], dtype=dtypes[6], buffer=tvars.buf) + + x = np.asarray(polangles) + + for i in range(yidx[0], yidx[1]):#y-values(rows) + if vars[1] == 1: + break + for j, k in enumerate(xys[0]):#x-values(cols) + for l in range(cvs.shape[2]): + if np.isnan(cvs[i,j,l,:].any(axis=0)): + continue + out[i,j,l,0] = coords[i,j,1]#x-map + mod[i,j,l,0] = coords[i,j,1] + out[i,j,l,1] = coords[i,j,0]#y-map + mod[i,j,l,1] = coords[i,j,0] + + temp = [i for i in cvs[i,j,l,:]]# cvs[i,j,l,0],cvs[i,j,l,1],cvs[i,j,l,2],cvs[i,j,l,3] + + params, cov = curve_fit(Azimuth, x, temp) + + residuals = temp - Azimuth(x, *params) + ss_res = np.sum(residuals**2) + ss_tot = np.sum((temp-np.mean(temp))**2) + if ss_tot == 0: + vars[1] = 1 + break + out[i,j,l,6] = 1-(ss_res/ss_tot) + mod[i,j,l,2] = 1-(ss_res/ss_tot) + + Az0 = calc_angles(params[0],params[1]) + Abs0 = Azimuth(Az0, *params) + Az1 = calc_angles(params[0],params[1])+90 + Abs1 = Azimuth(Az1, *params) + Az2 = calc_angles(params[0],params[1])-90 + + if vars[0] < 54.73: + if Abs0 > Abs1: + out[i,j,l,2] = Az0 + elif Abs1 > Abs0: + if Az1 < 90: + out[i,j,l,2] = Az1 + elif Az1 > 90: + out[i,j,l,2] = Az2 + elif vars[0] >= 54.73: + if Abs0 < Abs1: + out[i,j,l,2] = Az0 + elif Abs1 < Abs0: + if Az1 < 90: + out[i,j,l,2] = Az1 + elif Az1 > 90: + out[i,j,l,2] = Az2 + + out[i,j,l,3] = OrFunc(vars[0], *params) + out[i,j,l,4] = ampl1(*params) + out[i,j,l,5] = ampl2(params[0],params[1]) + mod[i,j,l,3] = params[0] + mod[i,j,l,4] = params[1] + mod[i,j,l,5] = params[2] + + tcvs.close() + tout.close() + tmod.close() + tcoords.close() + tvars.close() + +def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, state): + start = time.time() + + state.set_status("Preparing...") + featnames = [i.name for i in feature] + lsxs = np.empty(0) + lsys = np.empty(0) + for i in range(len(images)): + tempdata = images[i].transform(Domain([map_x, map_y])) + lsx = np.unique(tempdata.X[:,0]) + lsy = np.unique(tempdata.X[:,1]) + lsxs = np.append(lsxs, lsx) + lsys = np.append(lsys, lsy) + + ulsxs = np.unique(lsxs) + ulsys = np.unique(lsys) + + cvs = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], len(featnames), len(images)), np.nan) + spec = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], images[0].X.shape[1], len(images)), np.nan, dtype=object) + metas = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], images[0].metas.shape[1], len(images)), np.nan, dtype=object) + out = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], len(featnames), 7), np.nan) + mod = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], len(featnames), 6), np.nan) + coords = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], 2), np.nan) + vars = np.asarray([alpha, 0]) + fill = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0]), np.nan) + for i in range(len(images)): + cv = [images[i].domain[j] for j in featnames] #when feature is not meta type, have to recreate ContinuousVariable using name of original CV for some reason, otherwise returns NaNs for all except last image + doms = [map_x, map_y] + cv + tempdata = images[i].transform(Domain(doms)) + computevalue = pd.DataFrame(fill, index=ulsys, columns=ulsxs, dtype=object) + attributes = pd.DataFrame(fill, index=ulsys, columns=ulsxs, dtype=object) + meta = pd.DataFrame(fill, index=ulsys, columns=ulsxs, dtype=object) + ##################################################### + #this is a time consuming loop (~2.27s for 36,864 spectra) i.e. with 4 loops(images/angles), ~82% of time to prepare data for calculations!!! + for j, k in enumerate(tempdata): + computevalue.at[k[1], k[0]] = k.x[2:] + attributes.at[k[1], k[0]] = images[i].X[j] + meta.at[k[1], k[0]] = images[i].metas[j] + ##################################################### + # cvs[:,:,i] = computevalue.to_numpy(copy=True) + for l, m in enumerate(attributes.columns): + for n, o in enumerate(attributes.index): + cvs[n,l,:,i] = computevalue.at[o,m] + spec[n,l,:,i] = attributes.at[o,m] + metas[n,l,:,i] = meta.at[o,m] + xys = pd.DataFrame(fill, index=ulsys, columns=ulsxs, dtype=object) + for k, i in enumerate(xys.index): + for l, j in enumerate(xys.columns): + coords[k,l,0] = i + coords[k,l,1] = j + + tcvs = shared_memory.SharedMemory(name='cvs', create=True, size=cvs.nbytes) + scvs = np.ndarray(cvs.shape, dtype=cvs.dtype, buffer=tcvs.buf) + scvs[:,:,:] = cvs[:,:,:] + tout = shared_memory.SharedMemory(name='out', create=True, size=out.nbytes) + sout = np.ndarray(out.shape, dtype=out.dtype, buffer=tout.buf) + sout[:,:,:,:] = out[:,:,:,:] + tmod = shared_memory.SharedMemory(name='mod', create=True, size=mod.nbytes) + smod = np.ndarray(mod.shape, dtype=mod.dtype, buffer=tmod.buf) + smod[:,:,:,:] = mod[:,:,:,:] + tcoords = shared_memory.SharedMemory(name='coords', create=True, size=coords.nbytes) + scoords = np.ndarray(coords.shape, dtype=coords.dtype, buffer=tcoords.buf) + scoords[:,:,:] = coords[:,:,:] + tvars = shared_memory.SharedMemory(name='vars', create=True, size=vars.nbytes) + svars = np.ndarray(vars.shape, dtype=vars.dtype, buffer=tvars.buf) + svars[:] = vars[:] + + shapes = [cvs.shape, spec.shape, metas.shape, out.shape, mod.shape, coords.shape, vars.shape] + dtypes = [cvs.dtype, spec.dtype, metas.dtype, out.dtype, mod.dtype, coords.dtype, vars.dtype] + + ncpu = os.cpu_count() + # ncpu = 1 + tulsys = np.array_split(ulsys, ncpu) + state.set_status("Calculating...") + threads=[] + cumu = 0 + for i in range(ncpu): + tlsxys = [ulsxs,tulsys[i]] + yidx = [cumu, cumu+len(tulsys[i])] + cumu += len(tulsys[i]) + # compute(tlsxys, yidx, shapes, dtypes, polangles) + t = multiprocessing.Process(target=compute, args=(tlsxys, yidx, shapes, dtypes, polangles)) + threads.append(t) + t.start() + + for t in threads: + t.join() + + state.set_status("Finishing...") + if invert == True: + sout[:,:,:,2] = sout[:,:,:,2]*-1 + outputs = np.reshape(sout[:,:,:,2:], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], 5*len(featnames))) + model = np.reshape(smod[:,:,:,2:], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], 4*len(featnames))) + + spectra = [] + met = [] + for i in range(len(polangles)): + spectratemp = np.reshape(spec[:,:,:,i], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].X.shape[1])) + spectratemp = spectratemp[~np.isnan(model).any(axis=1)] + spectra.append(spectratemp) + metatemp = np.reshape(metas[:,:,:,i], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].metas.shape[1])) + metatemp = metatemp[~np.isnan(model).any(axis=1)] + metatemp = np.append(metatemp, np.full((np.shape(metatemp)[0],1), i), axis=1) + met.append(metatemp) + + outputs = outputs[~np.isnan(model).any(axis=1)] + model = model[~np.isnan(model).any(axis=1)] + + spectra = np.concatenate((spectra), axis=0) + meta = np.concatenate((met), axis=0) + + tcvs.unlink() + tout.unlink() + tmod.unlink() + tcoords.unlink() + tvars.unlink() + + return outputs, model, spectra, meta, vars[1] + +#calculate by "Stoke's Method" +# def compute_stokes(xys, yidx, shapes, dtypes): + +# tcvs = shared_memory.SharedMemory(name='cvs', create=False) +# cvs = np.ndarray(shapes[0], dtype=dtypes[0], buffer=tcvs.buf) +# tout = shared_memory.SharedMemory(name='out', create=False) +# out = np.ndarray(shapes[3], dtype=dtypes[3], buffer=tout.buf) +# tcoords = shared_memory.SharedMemory(name='coords', create=False) +# coords = np.ndarray(shapes[4], dtype=dtypes[4], buffer=tcoords.buf) + +# for i in range(yidx[0], yidx[1]):#y-values(rows) +# for j, k in enumerate(xys[0]):#x-values(cols) +# for l in range(cvs.shape[2]): +# if np.isnan(cvs[i,j,l,0]) == True or np.isnan(cvs[i,j,l,1]) == True or np.isnan(cvs[i,j,l,2]) == True or np.isnan(cvs[i,j,l,3]) == True: +# continue +# out[i,j,l,0] = coords[i,j,1]#x-map +# out[i,j,l,1] = coords[i,j,0]#y-map + +# temp = [cvs[i,j,l,0],cvs[i,j,l,1],cvs[i,j,l,2],cvs[i,j,l,3]] + +# out[i,j,l,2] = compute_theta(temp) +# out[i,j,l,3] = compute_amp(temp) +# out[i,j,l,4] = compute_intensity(temp) + +# tcvs.close() +# tout.close() +# tcoords.close() + +# #Does not agree with other algorithm/published/reference data unless angles inverted +# def compute_theta(images): +# return 0.5 * np.arctan2(images[1] - images[3], images[0] - images[2]) + + +# def compute_intensity(images): +# S0 = (images[0] + images[1] + images[2] + images[3]) * 0.5 +# return S0 + + +# def compute_amp(images): +# return np.sqrt((images[3] - images[1])**2 + (images[2] - images[0])**2) / compute_intensity(images) + + +# def process_polar_stokes(images, feature, map_x, map_y, invert, state): + +# state.set_status("Preparing...") +# featnames = [i.name for i in feature] +# lsxs = np.empty(0) +# lsys = np.empty(0) +# for i in range(len(images)): +# tempdata = images[i].transform(Domain([map_x, map_y])) +# lsx = np.unique(tempdata.X[:,0]) +# lsy = np.unique(tempdata.X[:,1]) +# lsxs = np.append(lsxs, lsx) +# lsys = np.append(lsys, lsy) + +# ulsxs = np.unique(lsxs) +# ulsys = np.unique(lsys) + +# cvs = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], len(featnames), len(images)), np.nan) +# spec = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], images[0].X.shape[1], len(images)), np.nan) +# metas = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], images[0].metas.shape[1], len(images)), np.nan) +# out = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], len(featnames), 5), np.nan) +# coords = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], 2), np.nan) +# fill = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0]), np.nan) +# for i in range(len(images)): +# cv = [images[i].domain[j] for j in featnames] #when feature is not meta type, have to recreate ContinuousVariable using name of original CV for some reason, otherwise returns NaNs for all except last image +# doms = [map_x, map_y] + cv +# tempdata = images[i].transform(Domain(doms)) +# computevalue = pd.DataFrame(fill, index=ulsys, columns=ulsxs, dtype=object) +# attributes = pd.DataFrame(fill, index=ulsys, columns=ulsxs, dtype=object) +# meta = pd.DataFrame(fill, index=ulsys, columns=ulsxs, dtype=object) +# ##################################################### +# #this is a time consuming loop (~2.27s for 36,864 spectra) i.e. with 4 loops(images/angles), ~82% of time to prepare data for calculations!!! +# for j, k in enumerate(tempdata): +# computevalue.at[k[1], k[0]] = k.x[2:] +# attributes.at[k[1], k[0]] = images[i].X[j] +# meta.at[k[1], k[0]] = images[i].metas[j] +# ##################################################### + +# # cvs[:,:,i] = computevalue.to_numpy(copy=True) +# for l, m in enumerate(attributes.columns): +# for n, o in enumerate(attributes.index): +# cvs[n,l,:,i] = computevalue.at[o,m] +# spec[n,l,:,i] = attributes.at[o,m] +# metas[n,l,:,i] = meta.at[o,m] +# xys = pd.DataFrame(fill, index=ulsys, columns=ulsxs, dtype=object) +# for k, i in enumerate(xys.index): +# for l, j in enumerate(xys.columns): +# coords[k,l,0] = i +# coords[k,l,1] = j + +# tcvs = shared_memory.SharedMemory(name='cvs', create=True, size=cvs.nbytes) +# scvs = np.ndarray(cvs.shape, dtype=cvs.dtype, buffer=tcvs.buf) +# scvs[:,:,:] = cvs[:,:,:] +# tout = shared_memory.SharedMemory(name='out', create=True, size=out.nbytes) +# sout = np.ndarray(out.shape, dtype=out.dtype, buffer=tout.buf) +# sout[:,:,:,:] = out[:,:,:,:] +# tcoords = shared_memory.SharedMemory(name='coords', create=True, size=coords.nbytes) +# scoords = np.ndarray(coords.shape, dtype=coords.dtype, buffer=tcoords.buf) +# scoords[:,:,:] = coords[:,:,:] + + +# shapes = [cvs.shape, spec.shape, metas.shape, out.shape, coords.shape] +# dtypes = [cvs.dtype, spec.dtype, metas.dtype, out.dtype, coords.dtype] + +# ncpu = os.cpu_count() +# tulsys = np.array_split(ulsys, ncpu) +# state.set_status("Calculating...") +# threads=[] +# cumu = 0 + +# for i in range(ncpu): +# tlsxys = [ulsxs,tulsys[i]] +# yidx = [cumu, cumu+len(tulsys[i])] +# cumu += len(tulsys[i]) +# t = multiprocessing.Process(target=compute_stokes, args=(tlsxys, yidx, shapes, dtypes)) +# threads.append(t) +# t.start() + +# for t in threads: +# t.join() + +# state.set_status("Finishing...") +# if invert == True: +# sout[:,:,:,2] = sout[:,:,:,2]*-1 +# outputs = np.reshape(sout[:,:,:,2:], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], 3*len(featnames))) + +# spectra0 = np.reshape(spec[:,:,:,0], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].X.shape[1])) +# spectra45 = np.reshape(spec[:,:,:,1], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].X.shape[1])) +# spectra90 = np.reshape(spec[:,:,:,2], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].X.shape[1])) +# spectra135 = np.reshape(spec[:,:,:,3], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].X.shape[1])) + +# meta0 = np.reshape(metas[:,:,:,0], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].metas.shape[1])) +# meta45 = np.reshape(metas[:,:,:,1], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].metas.shape[1])) +# meta90 = np.reshape(metas[:,:,:,2], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].metas.shape[1])) +# meta135 = np.reshape(metas[:,:,:,3], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].metas.shape[1])) + + +# spectra0 = spectra0[~np.isnan(outputs).any(axis=1)] +# spectra45 = spectra45[~np.isnan(outputs).any(axis=1)] +# spectra90 = spectra90[~np.isnan(outputs).any(axis=1)] +# spectra135 = spectra135[~np.isnan(outputs).any(axis=1)] +# meta0 = meta0[~np.isnan(outputs).any(axis=1)] +# meta0 = np.append(meta0, np.full((np.shape(meta0)[0],1), 0), axis=1) +# meta45 = meta45[~np.isnan(outputs).any(axis=1)] +# meta45 = np.append(meta45, np.full((np.shape(meta45)[0],1), 1), axis=1) +# meta90 = meta90[~np.isnan(outputs).any(axis=1)] +# meta90 = np.append(meta90, np.full((np.shape(meta90)[0],1), 2), axis=1) +# meta135 = meta135[~np.isnan(outputs).any(axis=1)] +# meta135 = np.append(meta135, np.full((np.shape(meta135)[0],1), 3), axis=1) +# outputs = outputs[~np.isnan(outputs).any(axis=1)] + +# spectra = np.concatenate((spectra0, spectra45, spectra90, spectra135), axis=0) +# meta = np.concatenate((meta0, meta45, meta90, meta135), axis=0) + +# tcvs.unlink() +# tout.unlink() +# tcoords.unlink() + +# return outputs, spectra, meta def hypercube_to_table(hc, wns, lsx, lsy): @@ -38,86 +625,392 @@ def hypercube_to_table(hc, wns, lsx, lsy): np.linspace(*lsy))) return table - -def process_polar(images): - hypercubes, lsx, lsy = get_hypercubes(images) - - wns = getx(images[0]) - - th = compute_theta(hypercubes) - amp = compute_amp(hypercubes) - int = compute_intensity(hypercubes) - - # join absorbance from images into a single image with a mean - intensity = hypercube_to_table(int, wns, lsx, lsy) - tht = hypercube_to_table(th, wns, lsx, lsy) - ampt = hypercube_to_table(amp, wns, lsx, lsy) - - output = intensity - output.th = tht - output.amp = ampt - - return output, intensity, tht, ampt - - -class OWPolar(OWWidget): +class OWPolar(OWWidget, ConcurrentWidgetMixin): + # Widget's name as displayed in the canvas - name = "Polar" - + name = "4-Angle Polarisation 2" + # Short widget description description = ( - "Polar.") - - icon = "icons/unknown.svg" + "4-Angle Polarisation implimentation") + icon = "icons/unknown.svg" + # Define inputs and outputs class Inputs: - data = Input("Data", Orange.data.Table, default=True) + data = MultiInput("Data", Orange.data.Table, default=True) class Outputs: polar = Output("Polar Data", Orange.data.Table, default=True) - intensity = Output("Intensity", Orange.data.Table) - theta = Output("Theta", Orange.data.Table) - amplitude = Output("Amplitude", Orange.data.Table) + model = Output("Curve Fit model data",Orange.data.Table) - autocommit = settings.Setting(True) + autocommit = settings.Setting(False) + + settingsHandler = DomainContextHandler() want_main_area = False - resizing_enabled = False + resizing_enabled = True + alpha = ContextSetting(0) + + feature = ContextSetting(None) + map_x = ContextSetting(None) + map_y = ContextSetting(None) + # method = Setting(0) + invert_angles = Setting(False) + + angles = None + anglst = Setting([], packable=False) + lines = Setting([], packable=False) + labels = Setting([], packable=False) + multiin_anglst = Setting([], packable=False) + multiin_lines = Setting([], packable=False) + multiin_labels = Setting([], packable=False) + minangles = 4 + polangles = Setting([], packable=False) + n_inputs = 0 + + feats: List[Variable] = Setting([]) + + # method_names = ('Curve Fitting Method','Stokes Method') + + class Warning(OWWidget.Warning): + nodata = Msg("No useful data on input!") + noang = Msg("Must receive 4 angles at specified polarisation") + nofeat = Msg("Select Feature") + noxy = Msg("Select X and Y variables") + pol = Msg("Invalid Polarisation angles") + notenough = Msg("Must have >= 4 angles") + wrongdata = Msg("Model returns inf. Inappropriate data") + tomany = Msg("Widget must receive data at data input or discrete angles only") + missingfeat = Msg("All inputs must have the selected feature") def __init__(self): super().__init__() - gui.auto_commit(self.controlArea, self, "autocommit", "Apply") - - + ConcurrentWidgetMixin.__init__(self) + gui.OWComponent.__init__(self) + + self._data_inputs: List[Optional[Table]] = [] + self.feats = None + + hbox = gui.hBox(self.controlArea, "4-Angle Polarisation") + #col 1 + + self.vbox2 = gui.vBox(hbox, "Inputs") + + self.multifile = gui.widgetBox(self.vbox2, "Multifile Input (all angles in 1 table)") + + self.anglemetas = DomainModel(DomainModel.METAS, valid_types=DiscreteVariable) + self.anglesel = gui.comboBox(self.multifile, self, 'angles', searchable=True, label='Select Angles by:', callback=self._change_angles, model=self.anglemetas) + self.anglesel.setDisabled(True) + + self.multiin = gui.widgetBox(self.vbox2, "Multiple Inputs (1 angle per input)") + + #col 2 + self.vbox1 = gui.vBox(hbox, "Features") + # vbox1.setFixedSize() + + self.featureselect = DomainModel(DomainModel.SEPARATED, + valid_types=ContinuousVariable) + self.feat_view = ListViewSearch(selectionMode=QListView.ExtendedSelection) + self.feat_view.setModel(self.featureselect) + self.feat_view.selectionModel().selectionChanged.connect(self._feat_changed) + self.vbox1.layout().addWidget(self.feat_view) + self.vbox1.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Minimum)) + + #col 3 + vbox = gui.vBox(hbox, "Parameters") + + # mbox = gui.widgetBox(vbox, "Calculation method") + + # buttons = gui.radioButtons( + # mbox, self, "method", + # callback=self._change_input) + + # for opts in self.method_names: + # gui.appendRadioButton(buttons, self.tr(opts)) + + form = QWidget() + formlayout = QFormLayout() + form.setLayout(formlayout) + # mbox.layout().addWidget(form) + + # splitter = QSplitter(self) + # splitter.setOrientation(Qt.Horizontal) + + xybox = gui.widgetBox(vbox, "Data XY Selection") + + self.x_axis = DomainModel(DomainModel.METAS, valid_types=DomainModel.PRIMITIVE) + self.y_axis = DomainModel(DomainModel.METAS, valid_types=DomainModel.PRIMITIVE) + + self.xvar = gui.comboBox(xybox, self, 'map_x', searchable=True, label="X Axis", + callback=self._change_input, model=self.x_axis) + self.yvar = gui.comboBox(xybox, self, 'map_y', searchable=True, label="Y Axis", + callback=self._change_input, model=self.y_axis) + + vbox.layout().addWidget(form) + gui.rubber(self.controlArea) + + self.alphavalue = gui.lineEdit(vbox, self, "alpha", "Alpha value", callback=self._change_input, valueType=int) + + gui.checkBox(vbox, self, 'invert_angles', label="Invert Angles", callback=self._change_input)#callback? + + gui.auto_commit(self.controlArea, self, "autocommit", "Apply", commit=self.commit) + self._change_input() + self.contextAboutToBeOpened.connect(lambda x: self.init_attr_values(x[0])) + self.resize(640, 300) + + + def _feat_changed(self): + rows = self.feat_view.selectionModel().selectedRows() + values = self.feat_view.model()[:] + self.feats = [values[row.row()] for row in sorted(rows)] + self.commit.deferred() + # self.commit.now() + + def init_attr_values(self, data): + domain = data.domain if data is not None else None + self.featureselect.set_domain(domain) + self.x_axis.set_domain(domain) + self.y_axis.set_domain(domain) + self.anglemetas.set_domain(domain) + self.group_x = None + self.group_y = None + + def _change_input(self): + # if self.method == 0: + # self.alphavalue.setDisabled(False) + # elif self.method == 1: + # self.alphavalue.setDisabled(True) + # self.commit.now() + self.commit.deferred() + + def _change_angles(self): + self.Warning.nodata.clear() + if self.angles: + self.clear_angles(self.anglst, self.lines, self.labels, self.multifile) + self.anglst = [] + self.lines = [] + self.labels = [] + self.Warning.notenough.clear() + if len(self.angles.values) < 4: + self.Warning.notenough() + else: + tempangles = np.linspace(0, 180, len(self.angles.values)+1) + for i, j in enumerate(self.angles.values): + self.add_angles(self.anglst, j, self.labels, self.lines, self.multifile, + i, tempangles[i], self._send_angles) + self._send_angles() + for i in self.labels: + i.setDisabled(False) + for i in self.lines: + i.setDisabled(False) + # self.commit.now() + self.commit.deferred() + + def add_angles(self, anglst, lab, labels, lines, widget, i, place, callback): #to be used in a loop + anglst.append(lab) + ledit = gui.lineEdit(widget, self, None, label = lab, callback = callback) + ledit.setText(str(place)) + lines.append(ledit) + for j in ledit.parent().children(): + if type(j) is QLabel: + labels.append(j) + + def clear_angles(self, anglst, lines, labels, widget): + for i in reversed(range(self.multiin.layout().count())): + self.multiin.layout().itemAt(i).widget().setParent(None) + for i in reversed(range(self.multifile.layout().count())): + if i != 0: + self.multifile.layout().itemAt(i).widget().setParent(None) + anglst.clear() + lines.clear() + labels.clear() + self.polangles.clear() + + def _send_ind_angles(self): + self.polangles.clear() + for i in self.multiin_lines: + self.polangles.append(i.text()) + try: + pol = [] + for i in self.polangles: + pol.append(float(i)) + self.polangles = pol + # self.commit.now() + self.commit.deferred() + except: + pass + + def _send_angles(self): + self.polangles.clear() + for i in self.lines: + self.polangles.append(i.text()) + try: + pol = [] + for i in self.polangles: + pol.append(float(i)) + self.polangles = pol + # self.commit.now() + self.commit.deferred() + except: + pass + @Inputs.data - def set_data(self, dataset): - self.data = dataset - self.commit() - - def commit(self): - if self.data is None: + def set_data(self, index: int, dataset: Table): + self._data_inputs[index] = dataset + + @Inputs.data.insert + def insert_data(self, index, dataset): + self._data_inputs.insert(index, dataset) + self.n_inputs += 1 + self.idx = index + + @Inputs.data.remove + def remove_data(self, index): + self._data_inputs.pop(index) + self.n_inputs -= 1 + self.polangles.clear() + + @property + def more_data(self) -> Sequence[Table]: + return [t for t in self._data_inputs if t is not None] + + def handleNewSignals(self): + self.data = None + self.feats = None + self.closeContext() + self.Warning.clear() + self.Outputs.polar.send(None) + self.Outputs.model.send(None) + self.data = self.more_data + self.clear_angles(self.anglst, self.lines, self.labels, self.multifile) + self.clear_angles(self.multiin_anglst, self.multiin_lines, self.multiin_labels, self.multiin) + + node = self.signalManager.active_nodes()[0] + inputlinks = self.signalManager.workflow().input_links(node) + names = [name.source_node.title for name in inputlinks] + + tempangles = np.linspace(0, 180, len(self.data)+1) + for i in range(len(self.data)): + self.add_angles(self.multiin_anglst, names[i], self.multiin_labels, self.multiin_lines, + self.multiin, i, tempangles[i], self._send_ind_angles) + + if len(self.data) == 0 or 1 < len(self.data) < 4: + self.anglesel.setDisabled(True) + for i in self.multiin_labels: + i.setDisabled(True) + for i in self.multiin_lines: + i.setDisabled(True) + elif len(self.data) == 1: + self.anglesel.setDisabled(False) + for i in self.multiin_labels: + i.setDisabled(True) + for i in self.multiin_lines: + i.setDisabled(True) + elif len(self.data) > 3: + self.anglesel.setDisabled(True) + for i in self.multiin_labels: + i.setDisabled(False) + for i in self.multiin_lines: + i.setDisabled(False) + self._send_ind_angles() + if len(self.data) == 0: + self.Outputs.polar.send(None) + self.Outputs.model.send(None) + self.contextAboutToBeOpened.emit([Table.from_domain(Domain(()))]) return + + if len(self.data) == 1: + self.openContext(self.data[0]) + elif 1 < len(self.data) < 4 or len(self.data) == 0: + self.Warning.notenough() + self.contextAboutToBeOpened.emit([Table.from_domain(Domain(()))]) + return + else: + self.sorted_data = self.data + metas = [] + attrs = [] + class_vars = [] + for i in self.sorted_data: + metas = metas+[j for j in i.domain.metas] + attrs = attrs+[j for j in i.domain.attributes] + class_vars = class_vars+[j for j in i.domain.class_vars] + + attrs = unify_tables(attrs) + metas = unify_tables(metas) + class_vars = unify_tables(class_vars) + + dom = Domain(attrs, metas = metas) + + for i, j in enumerate(self.sorted_data): + self.sorted_data[i] = j.transform(dom) + self.openContext(self.sorted_data[0]) + + # self.commit.now() + self.commit.deferred() + + @gui.deferred + def commit(self): + self.Warning.nofeat.clear() + if self.feats is None or len(self.feats) == 0: + self.Warning.nofeat() + return + self.Warning.noxy.clear() + if self.map_x is None or self.map_y is None: + self.Warning.noxy() + return + self.Warning.pol.clear() + if len(self.polangles) == 0: + self.Warning.pol() + return + for i in self.polangles: + if type(i) is not float: + self.Warning.pol() + return + self.Warning.wrongdata.clear() + + if len(self.data) == 1: + if self.angles: + fncol = self.data[0][:, self.angles.name].metas.reshape(-1) + images = [] + for fn in self.anglst: + images.append(self.data[0][self.angles.to_val(fn) == fncol]) + sorted_data = images + else: + return + elif 1 < len(self.data) < 4: + self.Warning.notenough() + self.Outputs.polar.send(None) + self.Outputs.model.send(None) + return + else: + sorted_data = self.sorted_data + + + + # if self.method == 0: + self.start(run0, sorted_data, self.feats, self.alpha, self.map_x, self.map_y, self.invert_angles, self.polangles) #, self.anglst, self.angles + # elif self.method == 1: + # self.start(run1, sorted_data, self.feats, self.map_x, self.map_y, self.invert_angles) + + def on_done(self, result: Results): + if result is None: + self.Outputs.polar.send(None) + self.Outputs.model.send(None) + return + if result.errorstate == 1: + self.Warning.wrongdata() + else: + self.Outputs.polar.send(result.out) + self.Outputs.model.send(result.model) - # TODO for now this assumes images in the correct order of filenames with a Filename column - - fncol = self.data[:, "Filename"].metas.reshape(-1) - unique_fns = np.unique(fncol) - - # split images into separate tables - images = [] - for fn in unique_fns: - images.append(self.data[fn == fncol]) - - # TODO align images according to their positions + def onDeleteWidget(self): + self.shutdown() + super().onDeleteWidget() - out, int, th, amp = process_polar(images) - self.Outputs.polar.send(out) - self.Outputs.intensity.send(int) - self.Outputs.theta.send(th) - self.Outputs.amplitude.send(amp) + if __name__ == "__main__": # pragma: no cover from Orange.widgets.utils.widgetpreview import WidgetPreview - WidgetPreview(OWPolar).run(Orange.data.Table("/home/marko/polar_preprocessed.pkl.gz")) + WidgetPreview(OWPolar).run(Orange.data.Table("ftir-4pol.pkl.gz")) From cdb2a18ca11511714cf9815c3cbf872e28be18ba Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Thu, 3 Mar 2022 17:06:21 +1100 Subject: [PATCH 05/93] Update owpolar.py --- orangecontrib/spectroscopy/widgets/owpolar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 2594bf2c1..faa5a211c 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -628,7 +628,7 @@ def hypercube_to_table(hc, wns, lsx, lsy): class OWPolar(OWWidget, ConcurrentWidgetMixin): # Widget's name as displayed in the canvas - name = "4-Angle Polarisation 2" + name = "4-Angle Polarisation" # Short widget description description = ( From cbb1019bb6674fa1ff7e5a76f58d4300ab544719 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Fri, 22 Apr 2022 11:13:40 +1000 Subject: [PATCH 06/93] Add test for "4+ angle polarisation" --- .../spectroscopy/tests/test_owpolar.py | 401 ++++++++++++++++++ 1 file changed, 401 insertions(+) create mode 100644 orangecontrib/spectroscopy/tests/test_owpolar.py diff --git a/orangecontrib/spectroscopy/tests/test_owpolar.py b/orangecontrib/spectroscopy/tests/test_owpolar.py new file mode 100644 index 000000000..e2541061f --- /dev/null +++ b/orangecontrib/spectroscopy/tests/test_owpolar.py @@ -0,0 +1,401 @@ +import numpy as np +import Orange +from Orange.data import ContinuousVariable, DiscreteVariable, Domain +from Orange.widgets.tests.base import WidgetTest, DummySignalManager +from orangecontrib.spectroscopy.widgets.owpolar import OWPolar +from orangewidget.widget import OWBaseWidget, Output, Input +from orangewidget.workflow.widgetsscheme import WidgetsScheme, WidgetsSignalManager +from orangewidget.workflow.tests.test_widgetsscheme import widget_description +from orangewidget.utils.signals import notify_input_helper +from AnyQt.QtCore import QObject, pyqtSignal, QElapsedTimer +from AnyQt.QtTest import QSignalSpy +import unittest +import time + +class Multifile(OWBaseWidget): + name = "Multifile" + + class Outputs: + out = Output("output", Orange.data.Table) + +class Data1(OWBaseWidget): + name = "Data 1" + + class Outputs: + out = Output("output", Orange.data.Table) + +class Data2(OWBaseWidget): + name = "Data 2" + + class Outputs: + out = Output("output", Orange.data.Table) + +class Data3(OWBaseWidget): + name = "Data 3" + + class Outputs: + out = Output("output", Orange.data.Table) + +class Data4(OWBaseWidget): + name = "Data 4" + + class Outputs: + out = Output("output", Orange.data.Table) + +class MockIn(OWBaseWidget): + name = "Results" + + class Inputs: + polar = Input("polar data", Orange.data.Table) + model = Input("model data", Orange.data.Table) + + @Inputs.polar + def set_polar(self, dataset): + self.polar_results = dataset + + @Inputs.model + def set_model(self, dataset): + self.model_results = dataset + +class SigMan(WidgetsSignalManager, DummySignalManager): + def __init__(self, scheme: WidgetsScheme): + WidgetsSignalManager.__init__(self, scheme) + DummySignalManager.__init__(self) + +class TestOWPolar(WidgetTest): + + def reset_input_links(self): + for j, i in enumerate(self.scheme.links): + widget = self.scheme.widget_for_node(i.sink_node) + inputs = vars(widget.Inputs) + input_keys = list(inputs) + + for k in input_keys: + if inputs[k].name == i.sink_channel.name: + key = k + + self.scheme.remove_link(i) + self._send_signal(widget, i.sink_channel.name, + inputs[key].closing_sentinel, j) + self.pol_widget.handleNewSignals() + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.scheme = WidgetsScheme() + cls.signal_manager = SigMan(cls.scheme) + cls.scheme.signal_manager = cls.signal_manager + + cls.multifile_node = cls.scheme.new_node(widget_description(Multifile)) + cls.multifile_widget = cls.scheme.widget_for_node(cls.multifile_node) + cls.in1_node = cls.scheme.new_node(widget_description(Data1)) + cls.in1_widget = cls.scheme.widget_for_node(cls.in1_node) + cls.in2_node = cls.scheme.new_node(widget_description(Data2)) + cls.in2_widget = cls.scheme.widget_for_node(cls.in2_node) + cls.in3_node = cls.scheme.new_node(widget_description(Data3)) + cls.in3_widget = cls.scheme.widget_for_node(cls.in3_node) + cls.in4_node = cls.scheme.new_node(widget_description(Data4)) + cls.in4_widget = cls.scheme.widget_for_node(cls.in4_node) + cls.pol_node = cls.scheme.new_node(widget_description(OWPolar)) + cls.pol_widget = cls.scheme.widget_for_node(cls.pol_node) + cls.pol_widget.signalManager = cls.scheme.signal_manager + cls.pol_widget.__init__() + cls.mock_in_node = cls.scheme.new_node(widget_description(MockIn)) + cls.mock_in_widget = cls.scheme.widget_for_node(cls.mock_in_node) + cls.multifile = Orange.data.Table("polar/4-angle-ftir_multifile.pkl") + cls.in1 = Orange.data.Table("polar/4-angle-ftir_multiin1.pkl") + cls.in2 = Orange.data.Table("polar/4-angle-ftir_multiin2.pkl") + cls.in3 = Orange.data.Table("polar/4-angle-ftir_multiin3.pkl") + cls.in4 = Orange.data.Table("polar/4-angle-ftir_multiin4.pkl") + cls.multifile_polar = Orange.data.Table("polar/4-angle-ftir_multifile_polar-results.pkl") + cls.multifile_model = Orange.data.Table("polar/4-angle-ftir_multifile_model-results.pkl") + cls.multiin_polar = Orange.data.Table("polar/4-angle-ftir_multiin_polar-results.pkl") + cls.multiin_model = Orange.data.Table("polar/4-angle-ftir_multiin_model-results.pkl") + + def test_multifile_init(self): + print('test_multifile_init') + self.reset_input_links() + self.scheme.new_link(self.multifile_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.multifile, 0, widget=self.pol_widget) + + testfeats = [ft for ft in self.multifile.domain.metas + if isinstance(ft, ContinuousVariable)] + testfeats = testfeats + [ft for ft in self.multifile.domain.attributes + if isinstance(ft, ContinuousVariable)] + polfeats = [ft for ft in self.pol_widget.featureselect[:] + if isinstance(ft, ContinuousVariable)] + self.assertEqual(polfeats, testfeats) + testinputs = [inp for inp in self.multifile.domain + if isinstance(inp, DiscreteVariable)] + self.assertEqual(self.pol_widget.anglemetas[:], testinputs) + testxy = [xy for xy in self.multifile.domain.metas + if isinstance(xy, (ContinuousVariable, DiscreteVariable))] + self.assertEqual(self.pol_widget.x_axis[:], testxy) + self.assertEqual(self.pol_widget.y_axis[:], testxy) + + def test_multifile_in(self): + print('test_multifile_in') + self.reset_input_links() + self.scheme.new_link(self.multifile_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.multifile, 0, widget=self.pol_widget) + + self.assertTrue(self.pol_widget.isEnabled()) + for i in self.pol_widget.multiin_labels: + self.assertFalse(i.isEnabled()) + for i in self.pol_widget.multiin_lines: + self.assertFalse(i.isEnabled()) + self.pol_widget.angles = self.pol_widget.anglemetas[1] + self.assertEqual(self.pol_widget.angles, self.multifile.domain.metas[4]) + self.pol_widget._change_angles() + self.assertEqual(len(self.pol_widget.labels), 4) + self.assertEqual(len(self.pol_widget.lines), 4) + self.assertEqual(self.pol_widget.polangles, list(np.linspace(0, 180, 5)[:4])) + for i in self.pol_widget.labels: + self.assertTrue(i.isEnabled()) + for i in self.pol_widget.lines: + self.assertTrue(i.isEnabled()) + self.pol_widget.map_x = self.pol_widget.x_axis[0] + self.assertEqual(self.pol_widget.map_x, self.multifile.domain.metas[0]) + self.pol_widget.map_y = self.pol_widget.y_axis[1] + self.assertEqual(self.pol_widget.map_y, self.multifile.domain.metas[1]) + self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][3], self.pol_widget.feat_view.model()[:][4]] + self.assertEqual(self.pol_widget.feats[0], self.multifile.domain.metas[5]) + self.assertEqual(self.pol_widget.feats[1], self.multifile.domain.metas[6]) + self.pol_widget.alpha = 0 + self.pol_widget.invert_angles = True + self.pol_widget.autocommit = True + + self.scheme.new_link(self.pol_node, "Polar Data", self.mock_in_node, "polar data") + self.scheme.new_link(self.pol_node, "Curve Fit model data", self.mock_in_node, "model data") + self.commit_and_wait(self.pol_widget, 20000) + + self.scheme.signal_manager.process_node(self.mock_in_node) + polar = self.mock_in_widget.polar_results + model = self.mock_in_widget.model_results + + np.testing.assert_equal(self.multifile_polar.metas, polar.metas) + np.testing.assert_equal(self.multifile_polar.X, polar.X) + np.testing.assert_equal(self.multifile_model.metas, model.metas) + np.testing.assert_equal(self.multifile_model.X, model.X) + + def test_multi_inputs(self): + print('test_multi_inputs') + self.reset_input_links() + self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.in1, 0, widget=self.pol_widget) + self.send_signal("Data", self.in2, 1, widget=self.pol_widget) + self.pol_widget.handleNewSignals() + + self.assertFalse(self.pol_widget.anglesel.isEnabled()) + for i in self.pol_widget.multiin_labels: + self.assertFalse(i.isEnabled()) + for i in self.pol_widget.multiin_lines: + self.assertFalse(i.isEnabled()) + self.send_signal("Data", self.in3, 2, widget=self.pol_widget) + self.send_signal("Data", self.in4, 3, widget=self.pol_widget) + self.pol_widget.handleNewSignals() + self.assertFalse(self.pol_widget.anglesel.isEnabled()) + for i in self.pol_widget.multiin_labels: + self.assertTrue(i.isEnabled()) + for i in self.pol_widget.multiin_lines: + self.assertTrue(i.isEnabled()) + + self.pol_widget.map_x = self.pol_widget.x_axis[0] + self.assertEqual(self.pol_widget.map_x, self.in1.domain.metas[0]) + self.pol_widget.map_y = self.pol_widget.y_axis[1] + self.assertEqual(self.pol_widget.map_y, self.in1.domain.metas[1]) + + self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][2], self.pol_widget.feat_view.model()[:][3]] + self.assertEqual(self.pol_widget.feats[0], self.in1.domain.metas[4].copy(compute_value=None)) #fails because of missing compute_value + self.assertEqual(self.pol_widget.feats[1], self.in1.domain.metas[5].copy(compute_value=None)) + self.pol_widget.alpha = 0 + self.pol_widget.invert_angles = True + self.pol_widget.autocommit = True + + self.scheme.new_link(self.pol_node, "Polar Data", self.mock_in_node, "polar data") + self.scheme.new_link(self.pol_node, "Curve Fit model data", self.mock_in_node, "model data") + self.commit_and_wait(self.pol_widget, 20000) + + self.scheme.signal_manager.process_node(self.mock_in_node) + polar = self.mock_in_widget.polar_results + model = self.mock_in_widget.model_results + multiin_polar_fixed_values = self.multiin_polar.metas[:,np.r_[0:2,3:7]] + multiin_model_fixed_values = self.multiin_model.metas[:,np.r_[0:2,3:7]] + multiin_polar_calc_values = self.multiin_polar.metas[:,7:] + multiin_model_calc_values = self.multiin_model.metas[:,7:] + + np.testing.assert_equal(multiin_polar_fixed_values, polar.metas[:,np.r_[0:2,3:7]]) + np.testing.assert_equal(multiin_polar_calc_values, polar.metas[:,7:]) + np.testing.assert_equal(self.multiin_polar.X, np.flip(polar.X, axis=1)) + np.testing.assert_equal(multiin_model_fixed_values, model.metas[:,np.r_[0:2,3:7]]) + np.testing.assert_equal(multiin_model_calc_values, model.metas[:,7:]) + np.testing.assert_equal(self.multiin_model.X, np.flip(model.X, axis=1)) + + def test_pixelsubset(self): + #Test multi in with subset of pixels selected + print('test_multi_inputs') + self.reset_input_links() + self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") + rng = np.random.default_rng() + sub_idx = rng.choice(132, size=(20), replace=False) + subset = self.in1[sub_idx] + + self.send_signal("Data", subset, 0, widget=self.pol_widget) + self.send_signal("Data", self.in2, 1, widget=self.pol_widget) + self.send_signal("Data", self.in3, 2, widget=self.pol_widget) + self.send_signal("Data", self.in4, 3, widget=self.pol_widget) + + self.pol_widget.map_x = self.pol_widget.x_axis[0] + self.pol_widget.map_y = self.pol_widget.y_axis[1] + self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][2], self.pol_widget.feat_view.model()[:][3]] + self.pol_widget.alpha = 0 + self.pol_widget.invert_angles = True + self.pol_widget.autocommit = True + + self.scheme.new_link(self.pol_node, "Polar Data", self.mock_in_node, "polar data") + self.scheme.new_link(self.pol_node, "Curve Fit model data", self.mock_in_node, "model data") + self.commit_and_wait(self.pol_widget, 20000) + + self.scheme.signal_manager.process_node(self.mock_in_node) + polar = self.mock_in_widget.polar_results + model = self.mock_in_widget.model_results + + self.assertEqual(len(polar), len(sub_idx)*4) + self.assertEqual(len(model), len(sub_idx)*4) + + def test_multiin_mismatched_domain(self): + # test multi in with different domains + self.reset_input_links() + self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") + + metadom = self.in1.domain.metas + metadom = [i for i in metadom if type(i) is ContinuousVariable] + attdom = self.in1.domain.attributes + attdom = attdom[0::2] + mismatched_domain = Domain(attdom, metas = metadom) + mismatched_table = self.in1.transform(mismatched_domain) + + self.send_signal("Data", mismatched_table, 0, widget=self.pol_widget) + self.send_signal("Data", self.in2, 1, widget=self.pol_widget) + self.send_signal("Data", self.in3, 2, widget=self.pol_widget) + self.send_signal("Data", self.in4, 3, widget=self.pol_widget) + + feat_len = len(metadom) + len(attdom) + 1 + XY_len = len(metadom) + self.assertEqual(feat_len, len(self.pol_widget.feat_view.model()[:])) + self.assertEqual(XY_len, len(self.pol_widget.x_axis[:])) + self.assertEqual(XY_len, len(self.pol_widget.y_axis[:])) + + self.reset_input_links() + self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") + + self.send_signal("Data", self.in2, 0, widget=self.pol_widget) + self.send_signal("Data", self.in3, 1, widget=self.pol_widget) + self.send_signal("Data", mismatched_table, 2, widget=self.pol_widget) + self.send_signal("Data", self.in4, 3, widget=self.pol_widget) + + + feat_len = len(metadom) + len(attdom) + 1 + XY_len = len(metadom) + self.assertEqual(feat_len, len(self.pol_widget.feat_view.model()[:])) + self.assertEqual(XY_len, len(self.pol_widget.x_axis[:])) + self.assertEqual(XY_len, len(self.pol_widget.y_axis[:])) + + def test_custom_angles(self): + # test inputting custom angles (multin and multifile) + self.reset_input_links() + self.scheme.new_link(self.multifile_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.multifile, 0, widget=self.pol_widget) + angles = np.array([0, 22.5, 45.0, 90]) + + for i, j in enumerate(self.pol_widget.lines): + j.setText(str(angles[i])) + self.pol_widget._send_angles() + for i, j in enumerate(self.pol_widget.polangles): + self.assertEqual(j, angles[i]) + + self.reset_input_links() + self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.in1, 0, widget=self.pol_widget) + self.send_signal("Data", self.in2, 1, widget=self.pol_widget) + self.send_signal("Data", self.in3, 2, widget=self.pol_widget) + self.send_signal("Data", self.in4, 3, widget=self.pol_widget) + + for i, j in enumerate(self.pol_widget.multiin_lines): + j.setText(str(angles[i])) + self.pol_widget._send_ind_angles() + for i, j in enumerate(self.pol_widget.polangles): + self.assertEqual(j, angles[i]) + + def test_warnings(self): + #test all warnings + #self.pol_widget.Warning..is_shown() + self.reset_input_links() + self.scheme.new_link(self.multifile_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.multifile, 0, widget=self.pol_widget) + self.pol_widget.autocommit = True + + self.commit_and_wait(self.pol_widget) + self.assertTrue(self.pol_widget.Warning.nofeat.is_shown()) + + self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][4]] + self.pol_widget.map_x = None + self.pol_widget.map_y = None + self.commit_and_wait(self.pol_widget) + self.assertTrue(self.pol_widget.Warning.noxy.is_shown()) + + self.pol_widget.map_x = self.pol_widget.x_axis[0] + self.pol_widget.map_y = self.pol_widget.y_axis[1] + self.pol_widget.polangles = [] + self.commit_and_wait(self.pol_widget) + self.assertTrue(self.pol_widget.Warning.pol.is_shown()) + self.pol_widget.polangles = [0.0,45.0,'hi',135.0] + self.commit_and_wait(self.pol_widget) + self.assertTrue(self.pol_widget.Warning.pol.is_shown()) + + self.pol_widget.polangles = [0.0,45.0,90.0,135.0] + self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][0]] + print(type(self.pol_widget.map_x)) + print(type(self.pol_widget.feats[0])) + self.commit_and_wait(self.pol_widget) + print(self.pol_widget.Warning.pol.is_shown()) + self.assertTrue(self.pol_widget.Warning.XYfeat.is_shown()) + + self.reset_input_links() + self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.in1, 0, widget=self.pol_widget) + self.send_signal("Data", self.in2, 1, widget=self.pol_widget) + self.assertTrue(self.pol_widget.Warning.notenough.is_shown()) + + self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.in3, 2, widget=self.pol_widget) + self.assertTrue(self.pol_widget.Warning.notenough.is_shown()) + + self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.in4, 3, widget=self.pol_widget) + self.assertFalse(self.pol_widget.Warning.notenough.is_shown()) + + # def test_clearangles(self): + # #test clearing angles + # pass + +if __name__ == "__main__": + unittest.main() + + \ No newline at end of file From e478c9b7601cb73c5c93cc74f38f7cc99a619675 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Fri, 22 Apr 2022 11:18:36 +1000 Subject: [PATCH 07/93] Update owpolar.py - Code cleanup - Faster data preparation - Improved handling of inputs with different features --- orangecontrib/spectroscopy/widgets/owpolar.py | 522 +++++------------- 1 file changed, 127 insertions(+), 395 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index faa5a211c..d542c22b9 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -1,65 +1,67 @@ -import warnings import os import multiprocessing from multiprocessing import shared_memory from typing import List, Optional, Sequence -from collections import OrderedDict - -from Orange.util import wrap_callback -from Orange.widgets.utils.concurrent import ConcurrentWidgetMixin -from PyQt5.QtWidgets import QGridLayout -from scipy.optimize import OptimizeWarning +import copy +import time +from xmlrpc.server import DocXMLRPCRequestHandler import numpy as np import pandas as pd -from scipy.optimize import curve_fit, minpack +from scipy.optimize import curve_fit import math from types import SimpleNamespace -from orangecanvas.scheme import scheme -from orangecanvas.scheme import SchemeNode -from orangewidget.workflow.widgetsscheme import WidgetsScheme - import Orange.data from Orange.data import DiscreteVariable, ContinuousVariable, Domain, Variable from Orange.data.table import Table -from Orange.widgets.widget import OWWidget, Msg, Input, Output, MultiInput +from Orange.widgets.widget import OWWidget, Msg, Output, MultiInput from Orange.widgets import gui, settings -from orangewidget.gui import LineEditWFocusOut from Orange.widgets.settings import \ - Setting, ContextSetting, DomainContextHandler, SettingProvider -from orangecontrib.spectroscopy.widgets.gui import lineEditFloatOrNone -from Orange.widgets.utils.itemmodels import DomainModel, VariableListModel + Setting, ContextSetting, DomainContextHandler +from Orange.widgets.utils.itemmodels import DomainModel from Orange.widgets.utils.concurrent import TaskState, ConcurrentWidgetMixin -from Orange.widgets.utils.annotated_data import add_columns +# from Orange.widgets.data.owconcatenate import OWConcatenate +from Orange.widgets.data import owconcatenate from orangewidget.utils.listview import ListViewSearch -from Orange.data.util import get_indices +from orangewidget.workflow.widgetsscheme import WidgetsScheme, WidgetsSignalManager -from AnyQt.QtWidgets import QFormLayout, QWidget, QSplitter, QListView, QLabel, QLineEdit, QAbstractItemView, QSizePolicy -from AnyQt.QtCore import Qt, QSize +from AnyQt.QtWidgets import QFormLayout, QWidget, QListView, QLabel, QSizePolicy -from orangecontrib.spectroscopy.data import _spectra_from_image, getx, build_spec_table +from orangecontrib.spectroscopy.data import _spectra_from_image, build_spec_table from orangecontrib.spectroscopy.utils import get_hypercube -import time - class Results(SimpleNamespace): out = None model = None errorstate = 0 -def unify_tables(piece): - if len(piece) > 0: - dom_n = [i.name for i in piece] - un, n = np.unique(dom_n, return_index=True) - dom = np.full((max(n)+1), None, dtype=object) - for i in n: - dom[i] = piece[i] - odom = [i for i in dom if i != None] - return odom - else: - return None +def sort_domain(domain): + dom = [domain.metas, domain.attributes, domain.class_vars] + sorted_dom_lst = [] + for i in dom: + cvs = [[i, j, j.name] for i, j in enumerate(i)] + rcvs_idx = [] + rcvs = [] + for j, k in enumerate(cvs): + try: + cvs[j][-1] = float(k[-1]) + except: + rcvs.append(k[1]) + rcvs_idx.append(j) + for j in reversed(rcvs_idx): + cvs.pop(j) + cvs_arr = np.array(cvs) + if cvs_arr.shape[0] > 0: + cvs_arr_sorted = cvs_arr[cvs_arr[:,2].argsort()] + odom_cv = [i[1] for i in cvs_arr_sorted] + odom = rcvs + odom_cv + else: + odom = rcvs + sorted_dom_lst.append(tuple(odom)) + out = Domain(sorted_dom_lst[1], class_vars=sorted_dom_lst[2], metas=sorted_dom_lst[0]) + return out def combine_visimg(data, polangles): atts = [] @@ -76,7 +78,7 @@ def combine_visimg(data, polangles): attsdict = {'visible_images': atts} return attsdict -def run0(data, feature, alpha, map_x, map_y, invert_angles, polangles, state: TaskState): +def run(data, feature, alpha, map_x, map_y, invert_angles, polangles, state: TaskState): results = Results() @@ -131,107 +133,7 @@ def run0(data, feature, alpha, map_x, map_y, invert_angles, polangles, state: Ta results.out.attributes = attsdict results.model.attributes = attsdict return results - -# def run1(data, feature, map_x, map_y, invert_angles, state: TaskState): -# results = Results() -# if data is not None: -# fncol = data[:, "Filename"].metas.reshape(-1) -# unique_fns = np.unique(fncol) - -# # split images into separate tables -# images = [] -# for fn in unique_fns: -# images.append(data[fn == fncol]) - -# try: -# output, spectra, origmetas = process_polar_stokes(images, feature, map_x, map_y, invert_angles, state) - -# tempoutaddmetas = [[ContinuousVariable.make('Azimuth Angle (' + i.name + ')'), -# ContinuousVariable.make('Amplitude (' + i.name + ')'), -# ContinuousVariable.make('Intensity (' + i.name + ')'),] for i in feature] -# outaddmetas = [] -# for i in tempoutaddmetas: -# outaddmetas = outaddmetas + i - -# PolAng = DiscreteVariable.make('Polarisation Angle', values=('0 Degrees','45 Degrees','90 Degrees','135/-45 Degrees')) - -# ometadom = data.domain.metas -# outmetadom = (ometadom + tuple([PolAng]) + tuple(outaddmetas)) -# ofeatdom = data.domain.attributes -# datadomain = Domain(ofeatdom, metas = outmetadom) - -# output = np.vstack((output, output, output, output)) - -# outmetas = np.hstack((origmetas, output)) - -# out = Table.from_numpy(datadomain, X=spectra, Y=None, metas=outmetas) - -# results.out = out -# results.out.attributes = data.attributes -# return results -# except: -# OWPolar.Warning.wrongdata() - - # elif deg0 and deg45 and deg90 and deg135 is not None: - - # for i in feature: - # featname = i.name - # try: - # deg0.domain[featname] - # deg45.domain[featname] - # deg90.domain[featname] - # deg135.domain[featname] - # except: - # OWPolar.Warning.missingfeat() - # return results - - # images = [deg0, deg45, deg90, deg135] - - # metas = [] - # attrs = [] - # class_vars = [] - # for i in images: - # metas = metas+[j for j in i.domain.metas] - # attrs = attrs+[j for j in i.domain.attributes] - # class_vars = class_vars+[j for j in i.domain.class_vars] - - # attrs = unify_tables(attrs) - # metas = unify_tables(metas) - # class_vars = unify_tables(class_vars) - - # dom = Domain(attrs, metas = metas) - - # for i, j in enumerate(images): - # images[i] = j.transform(dom) - - # try: - # output, spectra, origmetas = process_polar_stokes(images, feature, map_x, map_y, invert_angles, state) - - # tempoutaddmetas = [[ContinuousVariable.make('Azimuth Angle (' + i.name + ')'), - # ContinuousVariable.make('Amplitude (' + i.name + ')'), - # ContinuousVariable.make('Intensity (' + i.name + ')'),] for i in feature] - # outaddmetas = [] - # for i in tempoutaddmetas: - # outaddmetas = outaddmetas + i - - # PolAng = DiscreteVariable.make('Polarisation Angle', values=('0 Degrees','45 Degrees','90 Degrees','135/-45 Degrees')) - # #TODO: ensure all inputs have same domain variables/concatenate all domain vars - # ometadom = images[0].domain.metas - # outmetadom = (ometadom + tuple([PolAng]) + tuple(outaddmetas)) - # ofeatdom = images[0].domain.attributes - # datadomain = Domain(ofeatdom, metas = outmetadom) - - # output = np.vstack((output, output, output, output)) - - # outmetas = np.hstack((origmetas, output)) - - # out = Table.from_numpy(datadomain, X=spectra, Y=None, metas=outmetas) - - # results.out = out - # results.out.attributes = deg0.attributes - # return results - # except: - # OWPolar.Warning.wrongdata() + def get_hypercubes(images, xy): output = [] @@ -240,6 +142,7 @@ def get_hypercubes(images, xy): hypercube, lsx, lsy = get_hypercube(im, im.domain[xy[0]], im.domain[xy[1]]) output.append(hypercube) return output, lsx, lsy + #Calculate by fitting to function def Azimuth(x,a0,a1,a2): return a0*np.sin(2*np.radians(x))+a1*np.cos(2*np.radians(x))+a2 @@ -261,7 +164,7 @@ def OrFunc(alpha,a0,a1,a2): Dmin = (2*a2-2*math.sqrt(a0**2+a1**2))/(2*a2+2*math.sqrt(a0**2+a1**2)) return ((Dmin-1)/(Dmin+2)*(2/(3*np.cos(np.radians(alpha))**2-1))) -def compute(xys, yidx, shapes, dtypes, polangles): +def compute(xys, yidx, shapes, dtypes, polangles, pidx): tcvs = shared_memory.SharedMemory(name='cvs', create=False) cvs = np.ndarray(shapes[0], dtype=dtypes[0], buffer=tcvs.buf) @@ -281,15 +184,15 @@ def compute(xys, yidx, shapes, dtypes, polangles): break for j, k in enumerate(xys[0]):#x-values(cols) for l in range(cvs.shape[2]): - if np.isnan(cvs[i,j,l,:].any(axis=0)): + if np.any(np.isnan(cvs[i,j,l,:]), axis=0): continue out[i,j,l,0] = coords[i,j,1]#x-map mod[i,j,l,0] = coords[i,j,1] out[i,j,l,1] = coords[i,j,0]#y-map mod[i,j,l,1] = coords[i,j,0] - temp = [i for i in cvs[i,j,l,:]]# cvs[i,j,l,0],cvs[i,j,l,1],cvs[i,j,l,2],cvs[i,j,l,3] - + temp = [m for m in cvs[i,j,l,:]] + params, cov = curve_fit(Azimuth, x, temp) residuals = temp - Azimuth(x, *params) @@ -338,9 +241,8 @@ def compute(xys, yidx, shapes, dtypes, polangles): tvars.close() def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, state): - start = time.time() - state.set_status("Preparing...") + featnames = [i.name for i in feature] lsxs = np.empty(0) lsys = np.empty(0) @@ -353,6 +255,11 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, s ulsxs = np.unique(lsxs) ulsys = np.unique(lsys) + # TODO: cannot handle single point measurements (likely also line measurements), dx and dy div by 0 + dx = np.sum(np.diff(ulsxs))/(len(ulsxs)-1) + minx = np.min(ulsxs) + dy = np.sum(np.diff(ulsys))/(len(ulsys)-1) + miny = np.min(ulsys) cvs = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], len(featnames), len(images)), np.nan) spec = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], images[0].X.shape[1], len(images)), np.nan, dtype=object) @@ -363,25 +270,16 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, s vars = np.asarray([alpha, 0]) fill = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0]), np.nan) for i in range(len(images)): - cv = [images[i].domain[j] for j in featnames] #when feature is not meta type, have to recreate ContinuousVariable using name of original CV for some reason, otherwise returns NaNs for all except last image + cv = [images[i].domain[j] for j in featnames] doms = [map_x, map_y] + cv - tempdata = images[i].transform(Domain(doms)) - computevalue = pd.DataFrame(fill, index=ulsys, columns=ulsxs, dtype=object) - attributes = pd.DataFrame(fill, index=ulsys, columns=ulsxs, dtype=object) - meta = pd.DataFrame(fill, index=ulsys, columns=ulsxs, dtype=object) - ##################################################### - #this is a time consuming loop (~2.27s for 36,864 spectra) i.e. with 4 loops(images/angles), ~82% of time to prepare data for calculations!!! - for j, k in enumerate(tempdata): - computevalue.at[k[1], k[0]] = k.x[2:] - attributes.at[k[1], k[0]] = images[i].X[j] - meta.at[k[1], k[0]] = images[i].metas[j] - ##################################################### - # cvs[:,:,i] = computevalue.to_numpy(copy=True) - for l, m in enumerate(attributes.columns): - for n, o in enumerate(attributes.index): - cvs[n,l,:,i] = computevalue.at[o,m] - spec[n,l,:,i] = attributes.at[o,m] - metas[n,l,:,i] = meta.at[o,m] + tempdata: Table = images[i].transform(Domain(doms)) + temp_xy = tempdata.X[:,0:2].copy() + temp_xy[:,0] = np.rint(((temp_xy[:,0]-minx)/dx)) + temp_xy[:,1] = np.rint(((temp_xy[:,1]-miny)/dy)) + temp_xy = np.array(temp_xy, dtype=np.int_) + cvs[temp_xy[:,1],temp_xy[:,0],:,i] = tempdata[:,2:] + spec[temp_xy[:,1],temp_xy[:,0],:,i] = images[i].X + metas[temp_xy[:,1],temp_xy[:,0],:,i] = images[i].metas xys = pd.DataFrame(fill, index=ulsys, columns=ulsxs, dtype=object) for k, i in enumerate(xys.index): for l, j in enumerate(xys.columns): @@ -407,8 +305,11 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, s shapes = [cvs.shape, spec.shape, metas.shape, out.shape, mod.shape, coords.shape, vars.shape] dtypes = [cvs.dtype, spec.dtype, metas.dtype, out.dtype, mod.dtype, coords.dtype, vars.dtype] - ncpu = os.cpu_count() - # ncpu = 1 + start = time.time() + # single core processing is faster for small data sets and small number of selected features + # if > x: + ncpu = os.cpu_count() + # ncpu = 6 tulsys = np.array_split(ulsys, ncpu) state.set_status("Calculating...") threads=[] @@ -417,14 +318,27 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, s tlsxys = [ulsxs,tulsys[i]] yidx = [cumu, cumu+len(tulsys[i])] cumu += len(tulsys[i]) - # compute(tlsxys, yidx, shapes, dtypes, polangles) - t = multiprocessing.Process(target=compute, args=(tlsxys, yidx, shapes, dtypes, polangles)) + # compute(tlsxys, yidx, shapes, dtypes, polangles, i) + t = multiprocessing.Process(target=compute, args=(tlsxys, yidx, shapes, dtypes, polangles, i)) threads.append(t) t.start() - + for t in threads: t.join() + # else: + # ncpu = 1 + # tulsys = np.array_split(ulsys, ncpu) + # state.set_status("Calculating...") + # threads=[] + # cumu = 0 + # for i in range(ncpu): + # tlsxys = [ulsxs,tulsys[i]] + # yidx = [cumu, cumu+len(tulsys[i])] + # cumu += len(tulsys[i]) + # compute(tlsxys, yidx, shapes, dtypes, polangles, i) + print(time.time()-start) + state.set_status("Finishing...") if invert == True: sout[:,:,:,2] = sout[:,:,:,2]*-1 @@ -453,170 +367,8 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, s tmod.unlink() tcoords.unlink() tvars.unlink() - - return outputs, model, spectra, meta, vars[1] - -#calculate by "Stoke's Method" -# def compute_stokes(xys, yidx, shapes, dtypes): - -# tcvs = shared_memory.SharedMemory(name='cvs', create=False) -# cvs = np.ndarray(shapes[0], dtype=dtypes[0], buffer=tcvs.buf) -# tout = shared_memory.SharedMemory(name='out', create=False) -# out = np.ndarray(shapes[3], dtype=dtypes[3], buffer=tout.buf) -# tcoords = shared_memory.SharedMemory(name='coords', create=False) -# coords = np.ndarray(shapes[4], dtype=dtypes[4], buffer=tcoords.buf) - -# for i in range(yidx[0], yidx[1]):#y-values(rows) -# for j, k in enumerate(xys[0]):#x-values(cols) -# for l in range(cvs.shape[2]): -# if np.isnan(cvs[i,j,l,0]) == True or np.isnan(cvs[i,j,l,1]) == True or np.isnan(cvs[i,j,l,2]) == True or np.isnan(cvs[i,j,l,3]) == True: -# continue -# out[i,j,l,0] = coords[i,j,1]#x-map -# out[i,j,l,1] = coords[i,j,0]#y-map - -# temp = [cvs[i,j,l,0],cvs[i,j,l,1],cvs[i,j,l,2],cvs[i,j,l,3]] - -# out[i,j,l,2] = compute_theta(temp) -# out[i,j,l,3] = compute_amp(temp) -# out[i,j,l,4] = compute_intensity(temp) - -# tcvs.close() -# tout.close() -# tcoords.close() - -# #Does not agree with other algorithm/published/reference data unless angles inverted -# def compute_theta(images): -# return 0.5 * np.arctan2(images[1] - images[3], images[0] - images[2]) - - -# def compute_intensity(images): -# S0 = (images[0] + images[1] + images[2] + images[3]) * 0.5 -# return S0 - - -# def compute_amp(images): -# return np.sqrt((images[3] - images[1])**2 + (images[2] - images[0])**2) / compute_intensity(images) - - -# def process_polar_stokes(images, feature, map_x, map_y, invert, state): - -# state.set_status("Preparing...") -# featnames = [i.name for i in feature] -# lsxs = np.empty(0) -# lsys = np.empty(0) -# for i in range(len(images)): -# tempdata = images[i].transform(Domain([map_x, map_y])) -# lsx = np.unique(tempdata.X[:,0]) -# lsy = np.unique(tempdata.X[:,1]) -# lsxs = np.append(lsxs, lsx) -# lsys = np.append(lsys, lsy) - -# ulsxs = np.unique(lsxs) -# ulsys = np.unique(lsys) - -# cvs = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], len(featnames), len(images)), np.nan) -# spec = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], images[0].X.shape[1], len(images)), np.nan) -# metas = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], images[0].metas.shape[1], len(images)), np.nan) -# out = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], len(featnames), 5), np.nan) -# coords = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], 2), np.nan) -# fill = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0]), np.nan) -# for i in range(len(images)): -# cv = [images[i].domain[j] for j in featnames] #when feature is not meta type, have to recreate ContinuousVariable using name of original CV for some reason, otherwise returns NaNs for all except last image -# doms = [map_x, map_y] + cv -# tempdata = images[i].transform(Domain(doms)) -# computevalue = pd.DataFrame(fill, index=ulsys, columns=ulsxs, dtype=object) -# attributes = pd.DataFrame(fill, index=ulsys, columns=ulsxs, dtype=object) -# meta = pd.DataFrame(fill, index=ulsys, columns=ulsxs, dtype=object) -# ##################################################### -# #this is a time consuming loop (~2.27s for 36,864 spectra) i.e. with 4 loops(images/angles), ~82% of time to prepare data for calculations!!! -# for j, k in enumerate(tempdata): -# computevalue.at[k[1], k[0]] = k.x[2:] -# attributes.at[k[1], k[0]] = images[i].X[j] -# meta.at[k[1], k[0]] = images[i].metas[j] -# ##################################################### - -# # cvs[:,:,i] = computevalue.to_numpy(copy=True) -# for l, m in enumerate(attributes.columns): -# for n, o in enumerate(attributes.index): -# cvs[n,l,:,i] = computevalue.at[o,m] -# spec[n,l,:,i] = attributes.at[o,m] -# metas[n,l,:,i] = meta.at[o,m] -# xys = pd.DataFrame(fill, index=ulsys, columns=ulsxs, dtype=object) -# for k, i in enumerate(xys.index): -# for l, j in enumerate(xys.columns): -# coords[k,l,0] = i -# coords[k,l,1] = j - -# tcvs = shared_memory.SharedMemory(name='cvs', create=True, size=cvs.nbytes) -# scvs = np.ndarray(cvs.shape, dtype=cvs.dtype, buffer=tcvs.buf) -# scvs[:,:,:] = cvs[:,:,:] -# tout = shared_memory.SharedMemory(name='out', create=True, size=out.nbytes) -# sout = np.ndarray(out.shape, dtype=out.dtype, buffer=tout.buf) -# sout[:,:,:,:] = out[:,:,:,:] -# tcoords = shared_memory.SharedMemory(name='coords', create=True, size=coords.nbytes) -# scoords = np.ndarray(coords.shape, dtype=coords.dtype, buffer=tcoords.buf) -# scoords[:,:,:] = coords[:,:,:] - - -# shapes = [cvs.shape, spec.shape, metas.shape, out.shape, coords.shape] -# dtypes = [cvs.dtype, spec.dtype, metas.dtype, out.dtype, coords.dtype] - -# ncpu = os.cpu_count() -# tulsys = np.array_split(ulsys, ncpu) -# state.set_status("Calculating...") -# threads=[] -# cumu = 0 - -# for i in range(ncpu): -# tlsxys = [ulsxs,tulsys[i]] -# yidx = [cumu, cumu+len(tulsys[i])] -# cumu += len(tulsys[i]) -# t = multiprocessing.Process(target=compute_stokes, args=(tlsxys, yidx, shapes, dtypes)) -# threads.append(t) -# t.start() - -# for t in threads: -# t.join() - -# state.set_status("Finishing...") -# if invert == True: -# sout[:,:,:,2] = sout[:,:,:,2]*-1 -# outputs = np.reshape(sout[:,:,:,2:], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], 3*len(featnames))) - -# spectra0 = np.reshape(spec[:,:,:,0], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].X.shape[1])) -# spectra45 = np.reshape(spec[:,:,:,1], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].X.shape[1])) -# spectra90 = np.reshape(spec[:,:,:,2], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].X.shape[1])) -# spectra135 = np.reshape(spec[:,:,:,3], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].X.shape[1])) - -# meta0 = np.reshape(metas[:,:,:,0], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].metas.shape[1])) -# meta45 = np.reshape(metas[:,:,:,1], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].metas.shape[1])) -# meta90 = np.reshape(metas[:,:,:,2], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].metas.shape[1])) -# meta135 = np.reshape(metas[:,:,:,3], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].metas.shape[1])) - - -# spectra0 = spectra0[~np.isnan(outputs).any(axis=1)] -# spectra45 = spectra45[~np.isnan(outputs).any(axis=1)] -# spectra90 = spectra90[~np.isnan(outputs).any(axis=1)] -# spectra135 = spectra135[~np.isnan(outputs).any(axis=1)] -# meta0 = meta0[~np.isnan(outputs).any(axis=1)] -# meta0 = np.append(meta0, np.full((np.shape(meta0)[0],1), 0), axis=1) -# meta45 = meta45[~np.isnan(outputs).any(axis=1)] -# meta45 = np.append(meta45, np.full((np.shape(meta45)[0],1), 1), axis=1) -# meta90 = meta90[~np.isnan(outputs).any(axis=1)] -# meta90 = np.append(meta90, np.full((np.shape(meta90)[0],1), 2), axis=1) -# meta135 = meta135[~np.isnan(outputs).any(axis=1)] -# meta135 = np.append(meta135, np.full((np.shape(meta135)[0],1), 3), axis=1) -# outputs = outputs[~np.isnan(outputs).any(axis=1)] - -# spectra = np.concatenate((spectra0, spectra45, spectra90, spectra135), axis=0) -# meta = np.concatenate((meta0, meta45, meta90, meta135), axis=0) - -# tcvs.unlink() -# tout.unlink() -# tcoords.unlink() - -# return outputs, spectra, meta + return outputs, model, spectra, meta, vars[1] def hypercube_to_table(hc, wns, lsx, lsy): table = build_spec_table(*_spectra_from_image(hc, @@ -628,22 +380,23 @@ def hypercube_to_table(hc, wns, lsx, lsy): class OWPolar(OWWidget, ConcurrentWidgetMixin): # Widget's name as displayed in the canvas - name = "4-Angle Polarisation" + name = "4+ Angle Polarisation" # Short widget description description = ( - "4-Angle Polarisation implimentation") + "Calculate Azimuth Angle, Orientation function, Amplitude and Intensity of " + "vibrational mode(s) using polarised data measured at 4 or more polarisation angles.") icon = "icons/unknown.svg" # Define inputs and outputs class Inputs: - data = MultiInput("Data", Orange.data.Table, default=True) + data = MultiInput("Data", Orange.data.Table, default=True) class Outputs: polar = Output("Polar Data", Orange.data.Table, default=True) - model = Output("Curve Fit model data",Orange.data.Table) - + model = Output("Curve Fit model data", Orange.data.Table) + autocommit = settings.Setting(False) settingsHandler = DomainContextHandler() @@ -655,7 +408,6 @@ class Outputs: feature = ContextSetting(None) map_x = ContextSetting(None) map_y = ContextSetting(None) - # method = Setting(0) invert_angles = Setting(False) angles = None @@ -671,8 +423,6 @@ class Outputs: feats: List[Variable] = Setting([]) - # method_names = ('Curve Fitting Method','Stokes Method') - class Warning(OWWidget.Warning): nodata = Msg("No useful data on input!") noang = Msg("Must receive 4 angles at specified polarisation") @@ -683,12 +433,18 @@ class Warning(OWWidget.Warning): wrongdata = Msg("Model returns inf. Inappropriate data") tomany = Msg("Widget must receive data at data input or discrete angles only") missingfeat = Msg("All inputs must have the selected feature") + renamed_variables = Msg("Variables with duplicated names have been renamed.") + XYfeat = Msg("Selected feature(s) cannot be the same as XY selection") def __init__(self): super().__init__() ConcurrentWidgetMixin.__init__(self) gui.OWComponent.__init__(self) + self._dumb_tables = owconcatenate.OWConcatenate._dumb_tables + self._get_part = owconcatenate.OWConcatenate._get_part + self.merge_domains = owconcatenate.OWConcatenate.merge_domains + self._data_inputs: List[Optional[Table]] = [] self.feats = None @@ -703,6 +459,7 @@ def __init__(self): self.anglesel = gui.comboBox(self.multifile, self, 'angles', searchable=True, label='Select Angles by:', callback=self._change_angles, model=self.anglemetas) self.anglesel.setDisabled(True) + self.multiin = gui.widgetBox(self.vbox2, "Multiple Inputs (1 angle per input)") #col 2 @@ -720,22 +477,9 @@ def __init__(self): #col 3 vbox = gui.vBox(hbox, "Parameters") - # mbox = gui.widgetBox(vbox, "Calculation method") - - # buttons = gui.radioButtons( - # mbox, self, "method", - # callback=self._change_input) - - # for opts in self.method_names: - # gui.appendRadioButton(buttons, self.tr(opts)) - form = QWidget() formlayout = QFormLayout() - form.setLayout(formlayout) - # mbox.layout().addWidget(form) - - # splitter = QSplitter(self) - # splitter.setOrientation(Qt.Horizontal) + form.setLayout(formlayout) xybox = gui.widgetBox(vbox, "Data XY Selection") @@ -758,6 +502,10 @@ def __init__(self): self._change_input() self.contextAboutToBeOpened.connect(lambda x: self.init_attr_values(x[0])) self.resize(640, 300) + + + self.widgets_scheme: WidgetsScheme = self.signalManager.workflow()# + self.widget_node = self.widgets_scheme.node_for_widget(self) def _feat_changed(self): @@ -765,7 +513,6 @@ def _feat_changed(self): values = self.feat_view.model()[:] self.feats = [values[row.row()] for row in sorted(rows)] self.commit.deferred() - # self.commit.now() def init_attr_values(self, data): domain = data.domain if data is not None else None @@ -777,11 +524,6 @@ def init_attr_values(self, data): self.group_y = None def _change_input(self): - # if self.method == 0: - # self.alphavalue.setDisabled(False) - # elif self.method == 1: - # self.alphavalue.setDisabled(True) - # self.commit.now() self.commit.deferred() def _change_angles(self): @@ -804,7 +546,6 @@ def _change_angles(self): i.setDisabled(False) for i in self.lines: i.setDisabled(False) - # self.commit.now() self.commit.deferred() def add_angles(self, anglst, lab, labels, lines, widget, i, place, callback): #to be used in a loop @@ -836,7 +577,6 @@ def _send_ind_angles(self): for i in self.polangles: pol.append(float(i)) self.polangles = pol - # self.commit.now() self.commit.deferred() except: pass @@ -850,7 +590,6 @@ def _send_angles(self): for i in self.polangles: pol.append(float(i)) self.polangles = pol - # self.commit.now() self.commit.deferred() except: pass @@ -883,17 +622,17 @@ def handleNewSignals(self): self.Outputs.polar.send(None) self.Outputs.model.send(None) self.data = self.more_data + self.clear_angles(self.anglst, self.lines, self.labels, self.multifile) self.clear_angles(self.multiin_anglst, self.multiin_lines, self.multiin_labels, self.multiin) - - node = self.signalManager.active_nodes()[0] - inputlinks = self.signalManager.workflow().input_links(node) - names = [name.source_node.title for name in inputlinks] + + self.inputlinks = self.signalManager.workflow().input_links(self.widget_node) + self.names = [name.source_node.title for name in self.inputlinks] - tempangles = np.linspace(0, 180, len(self.data)+1) + self.tempangles = np.linspace(0, 180, len(self.data)+1) for i in range(len(self.data)): - self.add_angles(self.multiin_anglst, names[i], self.multiin_labels, self.multiin_lines, - self.multiin, i, tempangles[i], self._send_ind_angles) + self.add_angles(self.multiin_anglst, self.names[i], self.multiin_labels, self.multiin_lines, + self.multiin, i, self.tempangles[i], self._send_ind_angles) if len(self.data) == 0 or 1 < len(self.data) < 4: self.anglesel.setDisabled(True) @@ -927,30 +666,22 @@ def handleNewSignals(self): self.contextAboutToBeOpened.emit([Table.from_domain(Domain(()))]) return else: - self.sorted_data = self.data - metas = [] - attrs = [] - class_vars = [] - for i in self.sorted_data: - metas = metas+[j for j in i.domain.metas] - attrs = attrs+[j for j in i.domain.attributes] - class_vars = class_vars+[j for j in i.domain.class_vars] - - attrs = unify_tables(attrs) - metas = unify_tables(metas) - class_vars = unify_tables(class_vars) - - dom = Domain(attrs, metas = metas) - - for i, j in enumerate(self.sorted_data): - self.sorted_data[i] = j.transform(dom) - self.openContext(self.sorted_data[0]) + tables = self._dumb_tables(self) + domains = [table.domain for table in tables] + self._get_part = self._get_part + self.merge_type = 0 + domain1 = self.merge_domains(self, domains) + domain1 = sort_domain(domain1) + self.merge_type = 1 + domain2 = self.merge_domains(self, domains) + + self.sorted_data = [table.transform(domain1) for table in tables] + self.openContext(Table.from_domain(domain2)) - # self.commit.now() self.commit.deferred() @gui.deferred - def commit(self): + def commit(self): self.Warning.nofeat.clear() if self.feats is None or len(self.feats) == 0: self.Warning.nofeat() @@ -967,6 +698,11 @@ def commit(self): if type(i) is not float: self.Warning.pol() return + self.Warning.XYfeat.clear() + for i in self.feats: + if i == self.map_x or i == self.map_y: + self.Warning.XYfeat() + return self.Warning.wrongdata.clear() if len(self.data) == 1: @@ -984,14 +720,9 @@ def commit(self): self.Outputs.model.send(None) return else: - sorted_data = self.sorted_data - - - - # if self.method == 0: - self.start(run0, sorted_data, self.feats, self.alpha, self.map_x, self.map_y, self.invert_angles, self.polangles) #, self.anglst, self.angles - # elif self.method == 1: - # self.start(run1, sorted_data, self.feats, self.map_x, self.map_y, self.invert_angles) + sorted_data = self.sorted_data + + self.start(run, sorted_data, self.feats, self.alpha, self.map_x, self.map_y, self.invert_angles, self.polangles) def on_done(self, result: Results): if result is None: @@ -1003,6 +734,7 @@ def on_done(self, result: Results): else: self.Outputs.polar.send(result.out) self.Outputs.model.send(result.model) + # self.Outputs.polar. def onDeleteWidget(self): self.shutdown() From dfc9f7ef1e73a2600715fb0e3985d2a43109ae1b Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Mon, 6 Jun 2022 14:02:57 +1000 Subject: [PATCH 08/93] Added 4+ Angle Polarisation widget documentation --- doc/index.rst | 1 + doc/widgets.json | 9 +++++- doc/widgets/images/Polar-Example1.PNG | Bin 0 -> 62023 bytes doc/widgets/images/Polar-Example2.PNG | Bin 0 -> 58652 bytes doc/widgets/images/Polar-stamped.png | Bin 0 -> 20137 bytes doc/widgets/polar.md | 38 ++++++++++++++++++++++++++ 6 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 doc/widgets/images/Polar-Example1.PNG create mode 100644 doc/widgets/images/Polar-Example2.PNG create mode 100644 doc/widgets/images/Polar-stamped.png create mode 100644 doc/widgets/polar.md diff --git a/doc/index.rst b/doc/index.rst index 0fd62172d..4a2c0c0b3 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -36,6 +36,7 @@ Widgets widgets/pls widgets/peakfit widgets/snr + widgets/polar Indices and tables ------------------ diff --git a/doc/widgets.json b/doc/widgets.json index f41ac3697..2321b8233 100644 --- a/doc/widgets.json +++ b/doc/widgets.json @@ -128,7 +128,14 @@ "icon": "../orangecontrib/spectroscopy/widgets/icons/stackalign.svg", "background": "light-blue", "keywords": [] + }, + { + "text": "4+ Angle Polarisation", + "doc": "widgets/polar.md", + "icon": "../orangecontrib/spectroscopy/widgets/icons/unknown.svg", + "background": "light-blue", + "keywords": [] } ] ] -] \ No newline at end of file +] diff --git a/doc/widgets/images/Polar-Example1.PNG b/doc/widgets/images/Polar-Example1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..73b8a205c92e86d5b2b7975c218031e4f5d7757a GIT binary patch literal 62023 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 X^Dou+nS2~XH(BzboLG+Nlb8Ps9tarW literal 0 HcmV?d00001 diff --git a/doc/widgets/images/Polar-stamped.png b/doc/widgets/images/Polar-stamped.png new file mode 100644 index 0000000000000000000000000000000000000000..4941d5d1365ee750afe12235c5f6fd5fc42cc906 GIT binary patch literal 20137 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 + +![](images/Polar-stamped.png) + +1. Inputs: Define the polarisation angles of the input dataset. Data can be passed to widget with two methods: + - *Multifile Input*: A single input with data from all polarisation angles in a single dataset. (Each polarisation angle must be separated with a categorical variable). + - *Multiple Inputs*: 1 input per polarisation angle. +2. Features: Select the features to calculate the orientation of. +3. Data XY Selection: Define the attributes for the x and y axes for 2D datasets. +4. Alpha value: The value (α) to use when calculating Herman's orientation function . +5. Invert Angles: Invert the calculated Azimuth Angles about the 0 degree axis (i.e. so that 90 degrees is output as -90 degrees). + +Input Examples +------- +MultiFile Input + +![](images/Polar-Example1.PNG) + +Multiple Inputs + +![](images/Polar-Example2.PNG) + + +1. Hikima, Y.; Morikawa, J.; Hashimoto, T., Wavenumber Dependence of FT-IR Image of Molecular Orientation in Banded Spherulites of Poly(3-hydroxybutyrate) and Poly(L-lactic acid). Macromolecules 2013, 46, 1582-1590. From 127f6e8034e13042e435ba4e02ce26fcba7f8267 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Tue, 7 Jun 2022 11:14:30 +1000 Subject: [PATCH 09/93] polar 390: update icon name --- orangecontrib/spectroscopy/widgets/owpolar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index d542c22b9..8223a735e 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -387,7 +387,7 @@ class OWPolar(OWWidget, ConcurrentWidgetMixin): "Calculate Azimuth Angle, Orientation function, Amplitude and Intensity of " "vibrational mode(s) using polarised data measured at 4 or more polarisation angles.") - icon = "icons/unknown.svg" + icon = "icons/polar.svg" # Define inputs and outputs class Inputs: From 214e3e1cd02f4d4efb247ed42bc87176cb3a4bfe Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Fri, 10 Jun 2022 10:46:40 +1000 Subject: [PATCH 10/93] Polar: Fix handling of single row/col --- orangecontrib/spectroscopy/widgets/owpolar.py | 96 ++++++++++--------- 1 file changed, 49 insertions(+), 47 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 8223a735e..30f1ddb04 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -2,9 +2,6 @@ import multiprocessing from multiprocessing import shared_memory from typing import List, Optional, Sequence -import copy -import time -from xmlrpc.server import DocXMLRPCRequestHandler import numpy as np import pandas as pd @@ -22,10 +19,9 @@ Setting, ContextSetting, DomainContextHandler from Orange.widgets.utils.itemmodels import DomainModel from Orange.widgets.utils.concurrent import TaskState, ConcurrentWidgetMixin -# from Orange.widgets.data.owconcatenate import OWConcatenate from Orange.widgets.data import owconcatenate from orangewidget.utils.listview import ListViewSearch -from orangewidget.workflow.widgetsscheme import WidgetsScheme, WidgetsSignalManager +from orangewidget.workflow.widgetsscheme import WidgetsScheme from AnyQt.QtWidgets import QFormLayout, QWidget, QListView, QLabel, QSizePolicy @@ -84,7 +80,7 @@ def run(data, feature, alpha, map_x, map_y, invert_angles, polangles, state: Tas alpha = alpha - output, model, spectra, origmetas, errorstate = process_polar_abs(data, alpha, feature, map_x, map_y, invert_angles, polangles, state) + output, model, spectra, origmetas, errorstate = process_polar_abs(data, alpha, feature, map_x, map_y, invert_angles, polangles, state) tempoutaddmetas = [[ContinuousVariable.make('Azimuth Angle (' + i.name + ')'), @@ -104,7 +100,7 @@ def run(data, feature, alpha, map_x, map_y, invert_angles, polangles, state: Tas for i in tempmodaddmetas: modaddmetas = modaddmetas + i values = tuple([f'{i} Degrees' for i in polangles]) - PolAng = DiscreteVariable.make('Polarisation Angle', values=values) + PolAng = DiscreteVariable.make('Polarisation Angle', values=values) ometadom = data[0].domain.metas outmetadom = (ometadom + tuple([PolAng]) + tuple(outaddmetas)) @@ -191,7 +187,7 @@ def compute(xys, yidx, shapes, dtypes, polangles, pidx): out[i,j,l,1] = coords[i,j,0]#y-map mod[i,j,l,1] = coords[i,j,0] - temp = [m for m in cvs[i,j,l,:]] + temp = [m for m in cvs[i,j,l,:]] params, cov = curve_fit(Azimuth, x, temp) @@ -213,7 +209,7 @@ def compute(xys, yidx, shapes, dtypes, polangles, pidx): if vars[0] < 54.73: if Abs0 > Abs1: out[i,j,l,2] = Az0 - elif Abs1 > Abs0: + elif Abs1 > Abs0: if Az1 < 90: out[i,j,l,2] = Az1 elif Az1 > 90: @@ -221,7 +217,7 @@ def compute(xys, yidx, shapes, dtypes, polangles, pidx): elif vars[0] >= 54.73: if Abs0 < Abs1: out[i,j,l,2] = Az0 - elif Abs1 < Abs0: + elif Abs1 < Abs0: if Az1 < 90: out[i,j,l,2] = Az1 elif Az1 > 90: @@ -229,7 +225,7 @@ def compute(xys, yidx, shapes, dtypes, polangles, pidx): out[i,j,l,3] = OrFunc(vars[0], *params) out[i,j,l,4] = ampl1(*params) - out[i,j,l,5] = ampl2(params[0],params[1]) + out[i,j,l,5] = ampl2(params[0],params[1]) mod[i,j,l,3] = params[0] mod[i,j,l,4] = params[1] mod[i,j,l,5] = params[2] @@ -255,10 +251,14 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, s ulsxs = np.unique(lsxs) ulsys = np.unique(lsys) - # TODO: cannot handle single point measurements (likely also line measurements), dx and dy div by 0 - dx = np.sum(np.diff(ulsxs))/(len(ulsxs)-1) + if len(ulsxs) > 1: + dx = np.sum(np.diff(ulsxs))/(len(ulsxs)-1) + else: + dx = 1 + if len(ulsys) > 1: + dy = np.sum(np.diff(ulsys))/(len(ulsys)-1) + else: dy = 1 minx = np.min(ulsxs) - dy = np.sum(np.diff(ulsys))/(len(ulsys)-1) miny = np.min(ulsys) cvs = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], len(featnames), len(images)), np.nan) @@ -305,7 +305,6 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, s shapes = [cvs.shape, spec.shape, metas.shape, out.shape, mod.shape, coords.shape, vars.shape] dtypes = [cvs.dtype, spec.dtype, metas.dtype, out.dtype, mod.dtype, coords.dtype, vars.dtype] - start = time.time() # single core processing is faster for small data sets and small number of selected features # if > x: ncpu = os.cpu_count() @@ -337,7 +336,6 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, s # yidx = [cumu, cumu+len(tulsys[i])] # cumu += len(tulsys[i]) # compute(tlsxys, yidx, shapes, dtypes, polangles, i) - print(time.time()-start) state.set_status("Finishing...") if invert == True: @@ -356,7 +354,7 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, s metatemp = np.append(metatemp, np.full((np.shape(metatemp)[0],1), i), axis=1) met.append(metatemp) - outputs = outputs[~np.isnan(model).any(axis=1)] + outputs = outputs[~np.isnan(model).any(axis=1)] model = model[~np.isnan(model).any(axis=1)] spectra = np.concatenate((spectra), axis=0) @@ -387,11 +385,11 @@ class OWPolar(OWWidget, ConcurrentWidgetMixin): "Calculate Azimuth Angle, Orientation function, Amplitude and Intensity of " "vibrational mode(s) using polarised data measured at 4 or more polarisation angles.") - icon = "icons/polar.svg" + icon = "icons/polar.svg" # Define inputs and outputs class Inputs: - data = MultiInput("Data", Orange.data.Table, default=True) + data = MultiInput("Data", Orange.data.Table, default=True) class Outputs: polar = Output("Polar Data", Orange.data.Table, default=True) @@ -436,7 +434,7 @@ class Warning(OWWidget.Warning): renamed_variables = Msg("Variables with duplicated names have been renamed.") XYfeat = Msg("Selected feature(s) cannot be the same as XY selection") - def __init__(self): + def __init__(self): super().__init__() ConcurrentWidgetMixin.__init__(self) gui.OWComponent.__init__(self) @@ -448,40 +446,45 @@ def __init__(self): self._data_inputs: List[Optional[Table]] = [] self.feats = None - hbox = gui.hBox(self.controlArea, "4-Angle Polarisation") + hbox = gui.hBox(self.controlArea) #col 1 - self.vbox2 = gui.vBox(hbox, "Inputs") + vbox2 = gui.vBox(hbox, "Inputs") - self.multifile = gui.widgetBox(self.vbox2, "Multifile Input (all angles in 1 table)") + form2 = QWidget() + formlayout2 = QFormLayout() + form2.setLayout(formlayout2) + + self.multifile = gui.widgetBox(vbox2, "Multifile Input (all angles in 1 table)", sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) self.anglemetas = DomainModel(DomainModel.METAS, valid_types=DiscreteVariable) self.anglesel = gui.comboBox(self.multifile, self, 'angles', searchable=True, label='Select Angles by:', callback=self._change_angles, model=self.anglemetas) self.anglesel.setDisabled(True) - self.multiin = gui.widgetBox(self.vbox2, "Multiple Inputs (1 angle per input)") - + self.multiin = gui.widgetBox(vbox2, "Multiple Inputs (1 angle per input)", sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) + + vbox2.layout().addWidget(form2) + #col 2 - self.vbox1 = gui.vBox(hbox, "Features") - # vbox1.setFixedSize() + vbox1 = gui.vBox(hbox, "Features") self.featureselect = DomainModel(DomainModel.SEPARATED, valid_types=ContinuousVariable) self.feat_view = ListViewSearch(selectionMode=QListView.ExtendedSelection) self.feat_view.setModel(self.featureselect) self.feat_view.selectionModel().selectionChanged.connect(self._feat_changed) - self.vbox1.layout().addWidget(self.feat_view) - self.vbox1.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Minimum)) + vbox1.layout().addWidget(self.feat_view) + vbox1.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Minimum)) #col 3 vbox = gui.vBox(hbox, "Parameters") form = QWidget() formlayout = QFormLayout() - form.setLayout(formlayout) + form.setLayout(formlayout) - xybox = gui.widgetBox(vbox, "Data XY Selection") + xybox = gui.widgetBox(vbox, "Data XY Selection", sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) self.x_axis = DomainModel(DomainModel.METAS, valid_types=DomainModel.PRIMITIVE) self.y_axis = DomainModel(DomainModel.METAS, valid_types=DomainModel.PRIMITIVE) @@ -492,16 +495,15 @@ def __init__(self): callback=self._change_input, model=self.y_axis) vbox.layout().addWidget(form) - gui.rubber(self.controlArea) - - self.alphavalue = gui.lineEdit(vbox, self, "alpha", "Alpha value", callback=self._change_input, valueType=int) + + pbox = gui.widgetBox(vbox, sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) + self.alphavalue = gui.lineEdit(pbox, self, "alpha", "Alpha value", callback=self._change_input, valueType=int) - gui.checkBox(vbox, self, 'invert_angles', label="Invert Angles", callback=self._change_input)#callback? + gui.checkBox(pbox, self, 'invert_angles', label="Invert Angles", callback=self._change_input) gui.auto_commit(self.controlArea, self, "autocommit", "Apply", commit=self.commit) self._change_input() self.contextAboutToBeOpened.connect(lambda x: self.init_attr_values(x[0])) - self.resize(640, 300) self.widgets_scheme: WidgetsScheme = self.signalManager.workflow()# @@ -548,25 +550,25 @@ def _change_angles(self): i.setDisabled(False) self.commit.deferred() - def add_angles(self, anglst, lab, labels, lines, widget, i, place, callback): #to be used in a loop + def add_angles(self, anglst, lab, labels, lines, widget, i, place, callback): #to be used in a loop anglst.append(lab) ledit = gui.lineEdit(widget, self, None, label = lab, callback = callback) ledit.setText(str(place)) lines.append(ledit) for j in ledit.parent().children(): if type(j) is QLabel: - labels.append(j) + labels.append(j) - def clear_angles(self, anglst, lines, labels, widget): - for i in reversed(range(self.multiin.layout().count())): + def clear_angles(self, anglst, lines, labels, widget): + for i in reversed(range(self.multiin.layout().count())): self.multiin.layout().itemAt(i).widget().setParent(None) for i in reversed(range(self.multifile.layout().count())): if i != 0: self.multifile.layout().itemAt(i).widget().setParent(None) anglst.clear() lines.clear() - labels.clear() - self.polangles.clear() + labels.clear() + self.polangles.clear() def _send_ind_angles(self): self.polangles.clear() @@ -595,7 +597,7 @@ def _send_angles(self): pass @Inputs.data - def set_data(self, index: int, dataset: Table): + def set_data(self, index: int, dataset: Table): self._data_inputs[index] = dataset @Inputs.data.insert @@ -616,7 +618,7 @@ def more_data(self) -> Sequence[Table]: def handleNewSignals(self): self.data = None - self.feats = None + self.feats = None self.closeContext() self.Warning.clear() self.Outputs.polar.send(None) @@ -639,7 +641,7 @@ def handleNewSignals(self): for i in self.multiin_labels: i.setDisabled(True) for i in self.multiin_lines: - i.setDisabled(True) + i.setDisabled(True) elif len(self.data) == 1: self.anglesel.setDisabled(False) for i in self.multiin_labels: @@ -681,7 +683,7 @@ def handleNewSignals(self): self.commit.deferred() @gui.deferred - def commit(self): + def commit(self): self.Warning.nofeat.clear() if self.feats is None or len(self.feats) == 0: self.Warning.nofeat() @@ -734,13 +736,13 @@ def on_done(self, result: Results): else: self.Outputs.polar.send(result.out) self.Outputs.model.send(result.model) - # self.Outputs.polar. def onDeleteWidget(self): self.shutdown() super().onDeleteWidget() + if __name__ == "__main__": # pragma: no cover From 654f9f09c148d0acadac741defc6a39fb2699f74 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Fri, 10 Jun 2022 10:59:27 +1000 Subject: [PATCH 11/93] Polar: Add test datasets --- .../datasets/polar/4-angle-ftir_multifile.tab | 19 ++++++++ .../4-angle-ftir_multifile_model-results.tab | 19 ++++++++ .../4-angle-ftir_multifile_polar-results.tab | 19 ++++++++ .../datasets/polar/4-angle-ftir_multiin1.tab | 7 +++ .../datasets/polar/4-angle-ftir_multiin2.tab | 7 +++ .../datasets/polar/4-angle-ftir_multiin3.tab | 7 +++ .../datasets/polar/4-angle-ftir_multiin4.tab | 7 +++ .../4-angle-ftir_multiin_model-results.tab | 19 ++++++++ .../4-angle-ftir_multiin_polar-results.tab | 19 ++++++++ .../spectroscopy/tests/test_owpolar.py | 46 +++++++++---------- 10 files changed, 144 insertions(+), 25 deletions(-) create mode 100644 orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile.tab create mode 100644 orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile_model-results.tab create mode 100644 orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile_polar-results.tab create mode 100644 orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin1.tab create mode 100644 orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin2.tab create mode 100644 orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin3.tab create mode 100644 orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin4.tab create mode 100644 orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin_model-results.tab create mode 100644 orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin_polar-results.tab diff --git a/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile.tab b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile.tab new file mode 100644 index 000000000..d3c091abd --- /dev/null +++ b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile.tab @@ -0,0 +1,19 @@ +1697.131066748047 1693.2739506872558 1689.416834626465 1685.5597185656738 1681.702602504883 1677.8454864440919 1673.9883703833011 1670.13125432251 1666.2741382617191 1662.417022200928 1658.5599061401367 1654.702790079346 1650.8456740185547 1646.988557957764 1643.1314418969728 1639.274325836182 1635.4172097753908 1631.5600937145996 1627.7029776538088 1623.8458615930176 1619.9887455322269 1616.1316294714356 1612.2745134106449 1608.4173973498537 1604.5602812890625 1600.7031652282717 1596.8460491674805 1592.9889331066897 1589.1318170458985 1585.2747009851078 1581.4175849243165 1577.5604688635258 1573.7033528027346 1569.8462367419434 1565.9891206811526 1562.1320046203614 1558.2748885595706 1554.4177724987794 1550.5606564379887 1546.7035403771974 1542.8464243164062 1538.9893082556155 1535.1321921948243 1531.2750761340335 1527.4179600732423 1523.5608440124515 1519.7037279516603 1515.846611890869 1511.9894958300783 1508.1323797692871 1504.2752637084964 1500.4181476477052 1496.5610315869144 1492.7039155261232 1488.8467994653324 1484.9896834045412 1481.13256734375 1477.2754512829592 1473.418335222168 1469.5612191613773 1465.704103100586 1461.8469870397953 1457.989870979004 1454.1327549182129 1450.275638857422 1446.418522796631 1442.5614067358401 1438.704290675049 1434.8471746142582 1430.990058553467 1427.1329424926757 1423.275826431885 1419.4187103710938 1415.561594310303 1411.7044782495118 1407.847362188721 1403.9902461279298 1400.133130067139 1396.2760140063479 1392.4188979455566 1388.5617818847659 1384.7046658239747 1380.847549763184 1376.9904337023927 1373.133317641602 1369.2762015808107 1365.4190855200195 1361.5619694592287 1357.7048533984375 1353.8477373376468 1349.9906212768556 1346.1335052160648 1342.2763891552736 1338.4192730944824 1334.5621570336916 1330.7050409729004 1326.8479249121096 1322.9908088513184 1319.1336927905277 1315.2765767297365 1311.4194606689457 1307.5623446081545 1303.7052285473633 1299.8481124865725 1295.9909964257813 1292.1338803649905 1288.2767643041993 1284.4196482434086 1280.5625321826174 1276.7054161218261 1272.8483000610354 1268.9911840002442 1265.1340679394534 1261.2769518786622 1257.4198358178714 1253.5627197570802 1249.705603696289 1245.8484876354983 1241.991371574707 1238.1342555139163 1234.277139453125 1230.4200233923343 1226.562907331543 1222.7057912707523 1218.8486752099611 1214.99155914917 1211.1344430883792 1207.277327027588 1203.4202109667972 map_x map_y Filename 1214.0 - 1258.0 1500.0 - 1580.0 +continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous F:/DATA/0deg F:/DATA/45deg F:/DATA/90deg F:/DATA/135deg continuous continuous + meta meta meta meta meta +0.3711118698120117 0.43782272934913635 0.49062955379486084 0.5547452569007874 0.6374028921127319 0.711500346660614 0.7876919507980347 0.8770861625671387 0.9559172987937927 1.0098530054092407 1.0404753684997559 1.0543735027313232 1.0619465112686157 1.0437582731246948 1.0013220310211182 0.9536964297294617 0.897933840751648 0.8533709645271301 0.8181004524230957 0.7584443688392639 0.6689296364784241 0.5782220363616943 0.513115644454956 0.46961721777915955 0.43171659111976624 0.3991532325744629 0.3810955286026001 0.37965840101242065 0.386007159948349 0.3947145342826843 0.4098324477672577 0.4343760311603546 0.46137940883636475 0.49168214201927185 0.528336226940155 0.5667646527290344 0.6178287267684937 0.6604256629943848 0.6766932010650635 0.6885275840759277 0.6986993551254272 0.6930281519889832 0.6724157929420471 0.6501829028129578 0.6263569593429565 0.5885990858078003 0.5376056432723999 0.5005533695220947 0.4779326319694519 0.4443279504776001 0.39699268341064453 0.36137861013412476 0.33436083793640137 0.30747178196907043 0.2803654670715332 0.2625480592250824 0.2592535614967346 0.27015992999076843 0.29309216141700745 0.31150364875793457 0.3194276988506317 0.328142374753952 0.3443129062652588 0.35353028774261475 0.3476772606372833 0.33774372935295105 0.32855379581451416 0.3200712502002716 0.31163617968559265 0.3032289445400238 0.2943628430366516 0.28816357254981995 0.2909632623195648 0.29872336983680725 0.3025616407394409 0.3057458698749542 0.3115512728691101 0.31618112325668335 0.3176253139972687 0.3175846040248871 0.3153497576713562 0.3088831901550293 0.3000914454460144 0.29377707839012146 0.2888909578323364 0.28027477860450745 0.270122230052948 0.26286780834198 0.2575746774673462 0.2533765435218811 0.2540722191333771 0.26083439588546753 0.2694004774093628 0.27414125204086304 0.2728372812271118 0.26937466859817505 0.2672775387763977 0.2684006989002228 0.2723020315170288 0.27508431673049927 0.2749064266681671 0.274681955575943 0.2775912284851074 0.28367695212364197 0.2893185019493103 0.290900319814682 0.2906703054904938 0.2926110625267029 0.2950325608253479 0.2977401614189148 0.3037301301956177 0.3114270567893982 0.318378210067749 0.32530495524406433 0.3349395990371704 0.3490666151046753 0.3638021945953369 0.3744945526123047 0.3803212642669678 0.3803481459617615 0.37394478917121887 0.3625723719596863 0.34696418046951294 0.3287803828716278 0.31259098649024963 0.3022864758968353 0.2975075840950012 0.2938818633556366 0.2872605323791504 30442.5687 41538.7379 F:/DATA/0deg 15.009961445779307 43.87936019111817 +0.388348788022995 0.44867801666259766 0.502106249332428 0.5762503743171692 0.6664558053016663 0.739630937576294 0.8222108483314514 0.9173783659934998 0.9785887002944946 1.0107851028442383 1.0361779928207397 1.0637257099151611 1.0711760520935059 1.0423812866210938 1.025393009185791 0.9986843466758728 0.9373337626457214 0.8785869479179382 0.8271448612213135 0.7655133605003357 0.6908860802650452 0.6117749810218811 0.5471857190132141 0.4971246123313904 0.45541316270828247 0.42525458335876465 0.4062337279319763 0.39754077792167664 0.39981767535209656 0.41045162081718445 0.42612242698669434 0.4495392143726349 0.48013657331466675 0.509360134601593 0.5352477431297302 0.5706249475479126 0.6430520415306091 0.7104148864746094 0.7287077903747559 0.7300795912742615 0.7207353115081787 0.6928030848503113 0.6642997860908508 0.6465807557106018 0.6357985734939575 0.6169293522834778 0.5714240670204163 0.5247028470039368 0.49503496289253235 0.4588204622268677 0.41067439317703247 0.37448638677597046 0.34704023599624634 0.32218214869499207 0.29583585262298584 0.27490201592445374 0.26934197545051575 0.28096309304237366 0.3069058060646057 0.3270772397518158 0.33470597863197327 0.34152284264564514 0.35194724798202515 0.3573232889175415 0.3541431128978729 0.34866204857826233 0.3427005112171173 0.3312859833240509 0.3122206926345825 0.2955722510814667 0.2872144877910614 0.2867285907268524 0.2918354272842407 0.2956002652645111 0.2986833155155182 0.3060479462146759 0.31676867604255676 0.3262639045715332 0.330106645822525 0.32593291997909546 0.31699928641319275 0.30795541405677795 0.3018266558647156 0.29686442017555237 0.28721868991851807 0.2752007842063904 0.2667289972305298 0.2609139084815979 0.25778260827064514 0.2584190368652344 0.2610763907432556 0.2639258801937103 0.26595649123191833 0.26701226830482483 0.2679225206375122 0.2679891288280487 0.2669326663017273 0.2678163945674896 0.2720436155796051 0.2770630121231079 0.28001782298088074 0.27851158380508423 0.2751752436161041 0.276258647441864 0.2823660373687744 0.2899717390537262 0.29827389121055603 0.30697736144065857 0.3102128207683563 0.30654236674308777 0.30582261085510254 0.3128655254840851 0.3222534656524658 0.32939496636390686 0.33602944016456604 0.34821176528930664 0.3637096881866455 0.37178686261177063 0.3715791702270508 0.37046146392822266 0.36934414505958557 0.36342424154281616 0.350017786026001 0.33207470178604126 0.3140036165714264 0.2998875081539154 0.29220956563949585 0.2874009907245636 0.2815419137477875 30445.38885 41538.7379 F:/DATA/0deg 14.936959331411803 45.349811063094954 +0.366887629032135 0.43671754002571106 0.49220016598701477 0.5703327059745789 0.6657547950744629 0.731933057308197 0.7937033176422119 0.8747525215148926 0.9398021697998047 0.9730452299118042 1.0031681060791016 1.0538406372070312 1.0965853929519653 1.0494016408920288 0.9825043678283691 0.9511120319366455 0.9302560687065125 0.8842418789863586 0.8129315972328186 0.7183979153633118 0.6205475330352783 0.5415375232696533 0.48775240778923035 0.44761666655540466 0.41458284854888916 0.39335882663726807 0.3796997666358948 0.36864838004112244 0.36498430371284485 0.3680277466773987 0.3732655644416809 0.38918817043304443 0.42386338114738464 0.46311137080192566 0.4917769134044647 0.5237820148468018 0.5971131920814514 0.6691277027130127 0.6892750859260559 0.7003340125083923 0.7168111801147461 0.6999649405479431 0.6541981101036072 0.6189929246902466 0.5926592946052551 0.5696735382080078 0.5413363575935364 0.5053853988647461 0.465243935585022 0.41113007068634033 0.36086025834083557 0.32808783650398254 0.3003191649913788 0.2793380916118622 0.26471295952796936 0.2541550099849701 0.24993854761123657 0.25305330753326416 0.2655698359012604 0.27899375557899475 0.2841063439846039 0.28888702392578125 0.30285078287124634 0.3161625862121582 0.3197145164012909 0.3178388774394989 0.31100529432296753 0.29754751920700073 0.28191861510276794 0.2750825583934784 0.27559351921081543 0.27823397517204285 0.2830919921398163 0.2850538194179535 0.2825995981693268 0.28359857201576233 0.2883332371711731 0.289949893951416 0.2929544150829315 0.30135759711265564 0.30265331268310547 0.2906714677810669 0.2753030061721802 0.2651992440223694 0.25924843549728394 0.25318726897239685 0.24550479650497437 0.23828820884227753 0.23315896093845367 0.23029816150665283 0.2334306240081787 0.24293583631515503 0.2510787546634674 0.25073981285095215 0.24615781009197235 0.2464907467365265 0.2522513270378113 0.2587389051914215 0.262591689825058 0.263126403093338 0.26156532764434814 0.2589862048625946 0.2572213411331177 0.2594248950481415 0.2655974328517914 0.27193424105644226 0.27772676944732666 0.28423818945884705 0.28888431191444397 0.29118603467941284 0.2921951413154602 0.29164180159568787 0.2948339283466339 0.3066503405570984 0.32164159417152405 0.333238422870636 0.34339842200279236 0.355623722076416 0.36564287543296814 0.36494630575180054 0.35201695561408997 0.3341171145439148 0.3175579309463501 0.30399125814437866 0.2928829789161682 0.28347793221473694 0.2780621647834778 0.276618093252182 0.27352389693260193 30442.5687 41541.616519999996 F:/DATA/0deg 14.140093941838566 42.63377488797279 +0.36428871750831604 0.43003931641578674 0.47958770394325256 0.5450240969657898 0.634536862373352 0.7099695801734924 0.7796786427497864 0.8637834787368774 0.942089855670929 0.9903811812400818 1.0105667114257812 1.0208871364593506 1.005222201347351 0.963545024394989 0.9371297359466553 0.9139838814735413 0.8946059942245483 0.8827653527259827 0.840722918510437 0.7564958333969116 0.6611053943634033 0.5774503946304321 0.5202354192733765 0.48433250188827515 0.45376747846603394 0.4260224401950836 0.4059300422668457 0.3930695950984955 0.38632991909980774 0.3889123797416687 0.4001465141773224 0.4183931052684784 0.4428093135356903 0.47215187549591064 0.5050704479217529 0.5453080534934998 0.6085248589515686 0.658994734287262 0.668915331363678 0.6675289869308472 0.6717699766159058 0.6808158755302429 0.6681414842605591 0.6372467875480652 0.6000738739967346 0.5683797597885132 0.544323742389679 0.516345202922821 0.48224183917045593 0.4387160539627075 0.39499184489250183 0.3595888912677765 0.3304763436317444 0.3092094361782074 0.28860795497894287 0.26972246170043945 0.2605076730251312 0.26343077421188354 0.28140151500701904 0.29994896054267883 0.30823972821235657 0.31485551595687866 0.32437241077423096 0.33080095052719116 0.3303925395011902 0.3248642385005951 0.3165438175201416 0.3061983585357666 0.2946605384349823 0.2872968912124634 0.2868692874908447 0.2896806299686432 0.2909656763076782 0.2920180857181549 0.2945660948753357 0.2972028851509094 0.29964983463287354 0.3004482090473175 0.29766783118247986 0.2939799129962921 0.2927486002445221 0.2923987805843353 0.2889113426208496 0.2816716730594635 0.27281782031059265 0.2626931965351105 0.2514967918395996 0.24271203577518463 0.23827271163463593 0.23637256026268005 0.2380509227514267 0.24506837129592896 0.25348952412605286 0.25623422861099243 0.25412917137145996 0.2532842457294464 0.2547925114631653 0.2577175199985504 0.26068350672721863 0.2616606056690216 0.2597542703151703 0.2559884488582611 0.2536808252334595 0.256541907787323 0.2641761898994446 0.271513968706131 0.2755036950111389 0.27728980779647827 0.27779620885849 0.27858373522758484 0.28195881843566895 0.28836870193481445 0.29790475964546204 0.3091188371181488 0.317819207906723 0.3241935074329376 0.33264613151550293 0.3433806300163269 0.3505949378013611 0.35062962770462036 0.34647127985954285 0.3387751281261444 0.32535696029663086 0.3086860477924347 0.2940033972263336 0.2858646810054779 0.2827148139476776 0.2769644856452942 0.26818761229515076 30445.38885 41541.616519999996 F:/DATA/0deg 13.949567230311496 43.05058779046659 +0.3773364722728729 0.43966636061668396 0.49002042412757874 0.5639562606811523 0.6609355807304382 0.7364853620529175 0.8136956691741943 0.8985644578933716 0.9468745589256287 0.9731678366661072 0.9914941191673279 0.9854417443275452 0.9628058671951294 0.9528713226318359 0.9546505808830261 0.9532977342605591 0.9257292151451111 0.8693946599960327 0.8010186553001404 0.7217180728912354 0.6436004638671875 0.5754334926605225 0.5214712619781494 0.47915247082710266 0.4447232484817505 0.41765138506889343 0.3990515470504761 0.39321616291999817 0.39747321605682373 0.40612584352493286 0.4184291958808899 0.43992483615875244 0.47834911942481995 0.5266345739364624 0.5672381520271301 0.597634494304657 0.6348262429237366 0.6744903922080994 0.6967960000038147 0.7098262310028076 0.7118614912033081 0.6856943368911743 0.6489338874816895 0.6190053224563599 0.5941586494445801 0.5711410641670227 0.5421783328056335 0.5111346244812012 0.4810764491558075 0.4355677664279938 0.3860788941383362 0.3534643054008484 0.32750168442726135 0.3032616674900055 0.2819446921348572 0.26981374621391296 0.2693929970264435 0.2801830768585205 0.30366891622543335 0.3256083130836487 0.3365386128425598 0.34310561418533325 0.35129883885383606 0.3588528633117676 0.35683950781822205 0.3458286225795746 0.33076736330986023 0.31613433361053467 0.30460110306739807 0.2960743308067322 0.2915134131908417 0.29322516918182373 0.2980576753616333 0.300569623708725 0.3029937744140625 0.3091799318790436 0.3191257119178772 0.32923704385757446 0.3315645456314087 0.3225858509540558 0.31236401200294495 0.3056598901748657 0.2981754243373871 0.2894536256790161 0.2814278304576874 0.2723696827888489 0.26151928305625916 0.2525339126586914 0.25026053190231323 0.2539668083190918 0.25997182726860046 0.26598429679870605 0.27031874656677246 0.27086934447288513 0.2690020799636841 0.26832443475723267 0.2695266008377075 0.2705895006656647 0.2702696919441223 0.27155083417892456 0.2761310338973999 0.28070759773254395 0.2832408547401428 0.2835163474082947 0.28365248441696167 0.2872329354286194 0.29273301362991333 0.29702767729759216 0.2998993694782257 0.30078554153442383 0.3016831874847412 0.30665796995162964 0.31462526321411133 0.32313990592956543 0.3358403742313385 0.3547256886959076 0.3718043267726898 0.3799355626106262 0.3825741112232208 0.383433073759079 0.3778041899204254 0.3644450008869171 0.3474675118923187 0.3291182518005371 0.3145691752433777 0.3077240586280823 0.3049233853816986 0.3022094964981079 0.2970089614391327 30442.5687 41538.7379 F:/DATA/45deg 15.14943703154183 44.23850067435577 +0.37337228655815125 0.4396507143974304 0.49107563495635986 0.5586245059967041 0.646790623664856 0.7179062962532043 0.7848191857337952 0.8587467670440674 0.9132012128829956 0.9501560926437378 0.9785140156745911 0.984795868396759 0.9518576860427856 0.9169514179229736 0.9128903150558472 0.9190047979354858 0.9011522531509399 0.8552564978599548 0.7962431311607361 0.7195406556129456 0.6405887007713318 0.5768947005271912 0.5284963250160217 0.48475223779678345 0.44452735781669617 0.4175184965133667 0.4050688147544861 0.4015383720397949 0.4035366475582123 0.4095524847507477 0.41840967535972595 0.43762996792793274 0.4735090136528015 0.5144422650337219 0.5498296618461609 0.5891739130020142 0.6544406414031982 0.7074301838874817 0.721211850643158 0.7253494262695312 0.7205705046653748 0.7011243104934692 0.6794993877410889 0.6561350226402283 0.6234012842178345 0.5791003108024597 0.5371192693710327 0.5127407312393188 0.48728594183921814 0.43710267543792725 0.3880417048931122 0.358508825302124 0.3291686475276947 0.30198532342910767 0.2838975191116333 0.2756803035736084 0.27510562539100647 0.28265753388404846 0.30272212624549866 0.3223998248577118 0.3314470052719116 0.3400789797306061 0.3539663255214691 0.3615642189979553 0.35621216893196106 0.34422820806503296 0.33036601543426514 0.3164904713630676 0.30386441946029663 0.29513826966285706 0.2911766767501831 0.2941439151763916 0.302760511636734 0.30998602509498596 0.31750985980033875 0.32691699266433716 0.33109205961227417 0.3281230330467224 0.32525792717933655 0.32315510511398315 0.3174678683280945 0.31104981899261475 0.3055250942707062 0.297789067029953 0.28920844197273254 0.28300905227661133 0.27708175778388977 0.27133673429489136 0.26787322759628296 0.2659844756126404 0.26673445105552673 0.2708447575569153 0.2750791013240814 0.2769821286201477 0.2775936722755432 0.278523713350296 0.2802591919898987 0.2821207642555237 0.282520055770874 0.28267189860343933 0.2840110957622528 0.28552529215812683 0.28797078132629395 0.2903944253921509 0.29174160957336426 0.2954663932323456 0.30151888728141785 0.30476686358451843 0.30412399768829346 0.30343693494796753 0.30575087666511536 0.31121543049812317 0.3187049329280853 0.3290562331676483 0.3425249457359314 0.3562610149383545 0.36918962001800537 0.3792024254798889 0.3837013840675354 0.3848077654838562 0.3821556568145752 0.3716545104980469 0.3544897437095642 0.33635222911834717 0.3203563988208771 0.30804407596588135 0.3005572259426117 0.2961486577987671 0.29254403710365295 30445.38885 41538.7379 F:/DATA/45deg 15.287506938801155 44.956915156436416 +0.38911929726600647 0.44554373621940613 0.4855414927005768 0.5539154410362244 0.6538650989532471 0.7315957546234131 0.8033648729324341 0.884945809841156 0.9360079765319824 0.954917311668396 0.9649530649185181 0.9849116206169128 1.008013129234314 0.9807816743850708 0.9428510069847107 0.9156916737556458 0.8764055967330933 0.825237512588501 0.7735792994499207 0.705725371837616 0.6241020560264587 0.5504984855651855 0.4957604706287384 0.45222288370132446 0.41255465149879456 0.3828220069408417 0.37051448225975037 0.37108558416366577 0.37338513135910034 0.37661170959472656 0.3874439001083374 0.41331085562705994 0.449747771024704 0.47858643531799316 0.4993457794189453 0.5276702642440796 0.5828417539596558 0.6414362788200378 0.6703454852104187 0.6750879287719727 0.6613235473632812 0.6516115069389343 0.6429095268249512 0.6263266801834106 0.6048684120178223 0.5731279253959656 0.5306711196899414 0.492236465215683 0.45757782459259033 0.40995675325393677 0.3611593246459961 0.33053696155548096 0.3058626651763916 0.2824017405509949 0.2620924711227417 0.24882546067237854 0.24321754276752472 0.24622128903865814 0.2659408152103424 0.29050007462501526 0.3000190854072571 0.30213284492492676 0.3106580674648285 0.3247032165527344 0.3296380937099457 0.3233187794685364 0.3104628324508667 0.29432252049446106 0.2806641161441803 0.2753435969352722 0.2728271782398224 0.270643025636673 0.2736828327178955 0.2805771827697754 0.28472232818603516 0.2870364487171173 0.2909660339355469 0.29421940445899963 0.2940268814563751 0.29415833950042725 0.2929386496543884 0.2845102548599243 0.27148693799972534 0.26009973883628845 0.25316986441612244 0.25014013051986694 0.24763965606689453 0.24328280985355377 0.24036899209022522 0.2429419606924057 0.24842298030853271 0.25228366255760193 0.25561103224754333 0.25914180278778076 0.25783947110176086 0.253574401140213 0.2532463073730469 0.25550371408462524 0.2551080286502838 0.2552626430988312 0.2603242099285126 0.2648930549621582 0.26599374413490295 0.26791733503341675 0.27033597230911255 0.27200937271118164 0.27633726596832275 0.281934916973114 0.28416839241981506 0.2850780189037323 0.28886574506759644 0.29535502195358276 0.30392923951148987 0.3146568834781647 0.3258497714996338 0.3378189206123352 0.3510323464870453 0.3626718819141388 0.3707166612148285 0.37344253063201904 0.3687247931957245 0.3559401333332062 0.336141973733902 0.31635063886642456 0.30404531955718994 0.2972669005393982 0.29117393493652344 0.28547903895378113 0.2802625894546509 30442.5687 41541.616519999996 F:/DATA/45deg 14.612466406432896 42.07633292374312 +0.34738847613334656 0.4179860055446625 0.4664291739463806 0.5296632647514343 0.6272340416908264 0.7056167125701904 0.7561516165733337 0.8085007667541504 0.8644552826881409 0.9050332307815552 0.9181493520736694 0.9111636281013489 0.9073537588119507 0.9109403491020203 0.9062535762786865 0.8872991800308228 0.8642696738243103 0.8446381688117981 0.8067254424095154 0.7335556745529175 0.6443662047386169 0.5644205808639526 0.506117045879364 0.467324823141098 0.43990078568458557 0.4194169044494629 0.4045620858669281 0.39635950326919556 0.3957340121269226 0.40181082487106323 0.4117859899997711 0.4274001121520996 0.4520021080970764 0.48187950253486633 0.5073687434196472 0.5298813581466675 0.5784440636634827 0.6448124051094055 0.6777898669242859 0.6767211556434631 0.648645281791687 0.6306580901145935 0.6294295191764832 0.6141109466552734 0.586581289768219 0.5592874884605408 0.5341745018959045 0.5011913180351257 0.4583965539932251 0.4066646993160248 0.3704123795032501 0.3489791750907898 0.3235110640525818 0.29798153042793274 0.2787266969680786 0.26791489124298096 0.2635549306869507 0.2648940086364746 0.2800384759902954 0.30330970883369446 0.3163895010948181 0.31783244013786316 0.3187214732170105 0.3288123607635498 0.33496859669685364 0.3315340280532837 0.32235997915267944 0.30760458111763 0.289726585149765 0.27839016914367676 0.2739510238170624 0.272896945476532 0.27768412232398987 0.286607027053833 0.29376494884490967 0.30020976066589355 0.3059932589530945 0.30805355310440063 0.3080996572971344 0.30983278155326843 0.30988332629203796 0.3039196729660034 0.29341766238212585 0.28149351477622986 0.2707284390926361 0.2622477412223816 0.25400418043136597 0.2478829324245453 0.2490083873271942 0.2554311156272888 0.26148200035095215 0.26385727524757385 0.26382210850715637 0.26387882232666016 0.26245152950286865 0.26000332832336426 0.2600518763065338 0.2617824673652649 0.26309698820114136 0.26552656292915344 0.2700032591819763 0.2736172676086426 0.2747006118297577 0.2754264175891876 0.2767968773841858 0.2779064476490021 0.279891699552536 0.284357488155365 0.28945451974868774 0.2933834195137024 0.2966553568840027 0.2989789843559265 0.30280598998069763 0.31150293350219727 0.32365909218788147 0.33813759684562683 0.35394054651260376 0.3676077127456665 0.376840740442276 0.3798968195915222 0.37367281317710876 0.3576556146144867 0.3369816541671753 0.31849825382232666 0.30471497774124146 0.29529136419296265 0.2896086275577545 0.2846777141094208 0.2775256037712097 30445.38885 41541.616519999996 F:/DATA/45deg 14.724239544441382 41.95246636406159 +0.36890196800231934 0.4383719861507416 0.49215278029441833 0.5678848028182983 0.6697624325752258 0.7421551942825317 0.7949410080909729 0.861175537109375 0.9304823279380798 0.9888854622840881 1.0296154022216797 1.0200906991958618 0.9658761620521545 0.9375912547111511 0.9355541467666626 0.9351963996887207 0.9119044542312622 0.8633236289024353 0.8102912902832031 0.7478935718536377 0.6693353056907654 0.5896985530853271 0.5278323888778687 0.47969499230384827 0.4415580630302429 0.4171638786792755 0.40274444222450256 0.3934766352176666 0.3904435634613037 0.39783647656440735 0.41653168201446533 0.4471336603164673 0.4835716187953949 0.5180643796920776 0.5542099475860596 0.5966129302978516 0.6491007804870605 0.6811864972114563 0.6899703741073608 0.6939358711242676 0.6857684850692749 0.6570229530334473 0.6270668506622314 0.6001116633415222 0.5694991946220398 0.5400396585464478 0.5212351679801941 0.5054466128349304 0.4800109267234802 0.4332926869392395 0.38531044125556946 0.35653600096702576 0.33400747179985046 0.3157062530517578 0.3017118573188782 0.29292401671409607 0.2914346158504486 0.2968195676803589 0.3123685419559479 0.3298073410987854 0.3378491699695587 0.3447093665599823 0.35713934898376465 0.36121153831481934 0.354942262172699 0.35000061988830566 0.34591320157051086 0.3377359211444855 0.32351627945899963 0.3089088499546051 0.299715518951416 0.29520851373672485 0.29720360040664673 0.3091683089733124 0.3235648274421692 0.3309069871902466 0.3311137557029724 0.3341479003429413 0.3409155011177063 0.3392958343029022 0.32886332273483276 0.318060964345932 0.31203606724739075 0.30700525641441345 0.2969604432582855 0.2861284911632538 0.2785927355289459 0.27391406893730164 0.2739171087741852 0.27796828746795654 0.2818444073200226 0.28413259983062744 0.28639599680900574 0.28605619072914124 0.28013235330581665 0.27383479475975037 0.27307555079460144 0.27768054604530334 0.2847695052623749 0.29085657000541687 0.28964218497276306 0.2820451259613037 0.2783108055591583 0.28211650252342224 0.28757697343826294 0.2919096350669861 0.2974321246147156 0.30412620306015015 0.3101852238178253 0.31293031573295593 0.31173041462898254 0.31200647354125977 0.31643787026405334 0.3226405680179596 0.33135539293289185 0.3442952632904053 0.3607310354709625 0.37769126892089844 0.38771292567253113 0.3854190707206726 0.37552234530448914 0.36437416076660156 0.35301434993743896 0.34029337763786316 0.3268333971500397 0.31639185547828674 0.31317082047462463 0.31620898842811584 0.31643491983413696 30442.5687 41538.7379 F:/DATA/90deg 15.196114730939069 43.482395133432554 +0.37875914573669434 0.4469207227230072 0.49604201316833496 0.5680999159812927 0.6705905199050903 0.7483171224594116 0.80452561378479 0.8658115863800049 0.9279407262802124 0.9807824492454529 1.0223487615585327 1.0514615774154663 1.0463922023773193 1.0112226009368896 0.9982134103775024 1.004634141921997 0.9877952933311462 0.9317412972450256 0.8688726425170898 0.791929304599762 0.6982804536819458 0.6116718649864197 0.5463566184043884 0.4956464171409607 0.4562545120716095 0.43035486340522766 0.41308432817459106 0.4023517668247223 0.40038397908210754 0.4071796238422394 0.4212566614151001 0.44529813528060913 0.47869226336479187 0.5134111642837524 0.5476288199424744 0.5924862027168274 0.6646744608879089 0.7205690741539001 0.7406251430511475 0.7573677897453308 0.7730262279510498 0.7530763149261475 0.701831042766571 0.6527606844902039 0.6117518544197083 0.5808829665184021 0.5582142472267151 0.5362958312034607 0.5081617832183838 0.4623250961303711 0.41480353474617004 0.3816410005092621 0.3512253761291504 0.3229435384273529 0.30036529898643494 0.28829801082611084 0.28772664070129395 0.29815641045570374 0.31810328364372253 0.33310839533805847 0.34295332431793213 0.3576355576515198 0.37281879782676697 0.37368515133857727 0.36629509925842285 0.3603748083114624 0.35585665702819824 0.3474416136741638 0.33159855008125305 0.31616654992103577 0.3076492249965668 0.307073712348938 0.3140259385108948 0.3209126889705658 0.3253902792930603 0.3307969272136688 0.3362623155117035 0.34198322892189026 0.3472789525985718 0.3470509350299835 0.3400651216506958 0.3291180729866028 0.31915709376335144 0.3109745383262634 0.3023119568824768 0.2948138117790222 0.28782516717910767 0.27949029207229614 0.2736770212650299 0.2739221751689911 0.27921369671821594 0.2852224111557007 0.2887378931045532 0.2893288731575012 0.28667038679122925 0.2830811142921448 0.28239449858665466 0.28517019748687744 0.28917649388313293 0.2914784848690033 0.2913095951080322 0.2914259135723114 0.29324576258659363 0.2956298291683197 0.2981545031070709 0.3011481463909149 0.3054879605770111 0.3107515871524811 0.31411612033843994 0.31555652618408203 0.3172118663787842 0.31911471486091614 0.32280173897743225 0.33204859495162964 0.3453712463378906 0.357761949300766 0.3699503242969513 0.38311585783958435 0.39259737730026245 0.395723819732666 0.39234602451324463 0.38097503781318665 0.3659316301345825 0.3534175157546997 0.34347930550575256 0.33371132612228394 0.3236602544784546 0.3152346611022949 0.30779775977134705 30445.38885 41538.7379 F:/DATA/90deg 15.717131304491499 46.21617319326819 +0.3608156144618988 0.4259406626224518 0.47818616032600403 0.5471063256263733 0.6347803473472595 0.7001804113388062 0.7520433068275452 0.8171277642250061 0.8950353264808655 0.9654224514961243 1.013027548789978 1.0263880491256714 0.9852103590965271 0.941172182559967 0.931695818901062 0.9181087017059326 0.8757404685020447 0.8307337164878845 0.7877539992332458 0.7257715463638306 0.6523596048355103 0.5768492817878723 0.5085425972938538 0.456727534532547 0.4192277491092682 0.3939008414745331 0.3818787932395935 0.3828960657119751 0.389323353767395 0.39450258016586304 0.39829221367836 0.40605780482292175 0.4275314211845398 0.4643791615962982 0.505535900592804 0.5479178428649902 0.5994552969932556 0.6376073360443115 0.6582133769989014 0.6799547672271729 0.6931027770042419 0.6702796816825867 0.6343024969100952 0.6056128144264221 0.5789087414741516 0.5561301112174988 0.53394615650177 0.4996113181114197 0.4577721953392029 0.4083678126335144 0.36549386382102966 0.3386378884315491 0.3173430263996124 0.2995651960372925 0.2844037711620331 0.27193325757980347 0.26600706577301025 0.2700923979282379 0.2851560115814209 0.30088505148887634 0.3138630986213684 0.3285767436027527 0.3413139879703522 0.3445935547351837 0.3396775424480438 0.330121785402298 0.3199063241481781 0.30752673745155334 0.2904285490512848 0.27791693806648254 0.2726101279258728 0.27176886796951294 0.2783729135990143 0.2872854471206665 0.29147452116012573 0.29573073983192444 0.30301201343536377 0.3096592128276825 0.3131972551345825 0.31535086035728455 0.3140628933906555 0.3053463399410248 0.2954469323158264 0.2890409231185913 0.280372679233551 0.2706373333930969 0.2643801271915436 0.25798389315605164 0.2508365511894226 0.24706313014030457 0.2483857423067093 0.25367772579193115 0.2591390609741211 0.26199933886528015 0.2643854320049286 0.2681591808795929 0.2714567184448242 0.27293530106544495 0.2729243338108063 0.27181246876716614 0.27032458782196045 0.2693708539009094 0.26829567551612854 0.2665247321128845 0.2669430077075958 0.271585613489151 0.2774175703525543 0.28121861815452576 0.2841823399066925 0.28875136375427246 0.2948462665081024 0.3012498915195465 0.30834972858428955 0.3174125552177429 0.3262895941734314 0.33198782801628113 0.3391663730144501 0.35144802927970886 0.3615659177303314 0.3633808195590973 0.3589021563529968 0.3500611186027527 0.33608290553092957 0.3192422091960907 0.30552980303764343 0.29612672328948975 0.2880210280418396 0.2813362777233124 0.2759957015514374 30442.5687 41541.616519999996 F:/DATA/90deg 14.381547746983568 42.02895298858711 +0.3729221224784851 0.44012895226478577 0.4914250373840332 0.5655630230903625 0.6647416949272156 0.7444058060646057 0.8126416206359863 0.8799846172332764 0.9443001747131348 0.9979190826416016 1.0210847854614258 1.0208030939102173 1.0111762285232544 0.992798924446106 0.9904224276542664 0.99041348695755 0.9595239162445068 0.908574640750885 0.846463143825531 0.7647848725318909 0.6809067726135254 0.6017272472381592 0.5331747531890869 0.48201125860214233 0.44443103671073914 0.41660502552986145 0.3969760835170746 0.38763803243637085 0.38977357745170593 0.4000709354877472 0.41259172558784485 0.4278537333011627 0.45189592242240906 0.48642393946647644 0.5247828960418701 0.5645804405212402 0.612518310546875 0.6483836770057678 0.6727944016456604 0.7076162695884705 0.7434014678001404 0.7206994891166687 0.6666464805603027 0.63228839635849 0.608867883682251 0.5807878971099854 0.5441436171531677 0.5172581076622009 0.4963454604148865 0.45485949516296387 0.401254266500473 0.36339372396469116 0.3367786109447479 0.31736981868743896 0.29844656586647034 0.28279122710227966 0.27746984362602234 0.2811555564403534 0.2927308678627014 0.3071295917034149 0.3210527002811432 0.33639973402023315 0.3501872718334198 0.3525633215904236 0.34586936235427856 0.33730486035346985 0.3312234878540039 0.32529526948928833 0.31066590547561646 0.2939175069332123 0.286742240190506 0.28868338465690613 0.2973419427871704 0.3067079484462738 0.31102290749549866 0.31296807527542114 0.3165799379348755 0.3216167390346527 0.32459816336631775 0.32458773255348206 0.32075992226600647 0.31120601296424866 0.3001273572444916 0.2915954291820526 0.28556665778160095 0.28158968687057495 0.2759927809238434 0.26627132296562195 0.25822049379348755 0.25609999895095825 0.2582840323448181 0.26162636280059814 0.26389646530151367 0.26584580540657043 0.269505113363266 0.2740560472011566 0.2757222354412079 0.2737424373626709 0.27331092953681946 0.2753473222255707 0.2754512131214142 0.2745696008205414 0.27530866861343384 0.2763848900794983 0.27731868624687195 0.2794644236564636 0.28307804465293884 0.2873600125312805 0.29181772470474243 0.29564568400382996 0.29717445373535156 0.2980411946773529 0.30308812856674194 0.31369927525520325 0.3267776072025299 0.3403771221637726 0.3552534282207489 0.3692227900028229 0.3773849606513977 0.37742289900779724 0.3699462413787842 0.3581613600254059 0.3446747362613678 0.3301258683204651 0.3174242079257965 0.3073962330818176 0.2965550720691681 0.28561556339263916 0.27806076407432556 30445.38885 41541.616519999996 F:/DATA/90deg 14.87720727584366 44.091357683377474 +0.3949830234050751 0.4622531533241272 0.5109723210334778 0.5819476842880249 0.6732906699180603 0.7399584054946899 0.8056941032409668 0.8803262114524841 0.9407079219818115 0.9959824681282043 1.0247737169265747 0.9988774061203003 0.9598121643066406 0.9596822261810303 0.9756194353103638 0.9531159996986389 0.8880895376205444 0.8291646242141724 0.7852953672409058 0.7326091527938843 0.6583097577095032 0.5755128264427185 0.5128992199897766 0.47360721230506897 0.4461856484413147 0.424794465303421 0.40726786851882935 0.39642640948295593 0.3955315947532654 0.3990853428840637 0.40200623869895935 0.41744357347488403 0.4541429877281189 0.4928371012210846 0.523593544960022 0.5572065114974976 0.6082401275634766 0.6535071730613708 0.6752548813819885 0.6942375302314758 0.7089064717292786 0.6849415898323059 0.648251473903656 0.6290637254714966 0.611190140247345 0.5820888876914978 0.5479511022567749 0.5251440405845642 0.5092036724090576 0.4710317552089691 0.41165193915367126 0.368015855550766 0.33563244342803955 0.30891987681388855 0.289467990398407 0.279835045337677 0.2776188254356384 0.281124472618103 0.2969658076763153 0.3199588358402252 0.3370678722858429 0.35005685687065125 0.3592534065246582 0.3598088026046753 0.3555058240890503 0.34791675209999084 0.3381218910217285 0.32693901658058167 0.3126853406429291 0.3007925748825073 0.2955957353115082 0.2945536673069 0.29722654819488525 0.30562835931777954 0.3160330057144165 0.32335811853408813 0.32722195982933044 0.33106622099876404 0.333890825510025 0.3307388126850128 0.32467377185821533 0.31839045882225037 0.3102380931377411 0.30023348331451416 0.28814268112182617 0.2750730514526367 0.26571476459503174 0.2631886601448059 0.2642560303211212 0.2657497227191925 0.2698196768760681 0.2753346860408783 0.27848049998283386 0.27970898151397705 0.2795354127883911 0.2767869830131531 0.27504852414131165 0.2782919108867645 0.28145065903663635 0.2807522118091583 0.2820216417312622 0.28606170415878296 0.2876238524913788 0.2858695089817047 0.28583207726478577 0.29170745611190796 0.2989623248577118 0.3013303577899933 0.3022397756576538 0.3061143457889557 0.31094178557395935 0.31485098600387573 0.3188069462776184 0.32449349761009216 0.333775132894516 0.34593096375465393 0.3592696785926819 0.3726845979690552 0.3809838593006134 0.37974658608436584 0.37090665102005005 0.3579893112182617 0.3460439443588257 0.33749645948410034 0.3274995684623718 0.3147842586040497 0.3056890070438385 0.3015490472316742 0.2963547110557556 30442.5687 41538.7379 F:/DATA/135deg 15.053673351479718 43.89851045568374 +0.36599868535995483 0.44001543521881104 0.4966375231742859 0.5643589496612549 0.654793381690979 0.7409048080444336 0.8192135691642761 0.8847960829734802 0.9369638562202454 0.9906289577484131 1.025296688079834 1.0149723291397095 0.9805884957313538 0.9636447429656982 0.9588003158569336 0.9524202942848206 0.9314351677894592 0.8927587270736694 0.8397254943847656 0.7675902843475342 0.6844693422317505 0.6059010624885559 0.5474121570587158 0.5043894052505493 0.468307226896286 0.44075509905815125 0.4207476079463959 0.4080858826637268 0.40591961145401 0.4134867191314697 0.42650675773620605 0.4475072920322418 0.47888901829719543 0.5122790336608887 0.5369526743888855 0.5554997324943542 0.5947977304458618 0.647955060005188 0.6778163313865662 0.6932549476623535 0.6977417469024658 0.6872305870056152 0.659528911113739 0.6245843768119812 0.5957351922988892 0.5746957659721375 0.5465317368507385 0.5116745233535767 0.47723180055618286 0.4333028197288513 0.3936629891395569 0.36897724866867065 0.345966637134552 0.3255443572998047 0.31004011631011963 0.29891106486320496 0.2932963967323303 0.2937392592430115 0.3078584671020508 0.33370327949523926 0.35201096534729004 0.3585779666900635 0.36050570011138916 0.3624379336833954 0.3620472550392151 0.35969817638397217 0.35452911257743835 0.3419364094734192 0.3230227828025818 0.30832669138908386 0.30204203724861145 0.3018741011619568 0.30683496594429016 0.3151794970035553 0.3218154311180115 0.3262678384780884 0.33061009645462036 0.33248963952064514 0.3305680453777313 0.32937225699424744 0.3280726373195648 0.322355717420578 0.3143385052680969 0.30674803256988525 0.2977624237537384 0.28612422943115234 0.27380654215812683 0.26605281233787537 0.2670673131942749 0.27401211857795715 0.2821645736694336 0.28739145398139954 0.289187490940094 0.2906554937362671 0.29101991653442383 0.28759765625 0.28305813670158386 0.28146880865097046 0.2823540270328522 0.2834238111972809 0.28334492444992065 0.28242823481559753 0.2830897569656372 0.285215824842453 0.286749929189682 0.2894335985183716 0.2963193953037262 0.30561134219169617 0.31135934591293335 0.3125182092189789 0.3135771155357361 0.31644806265830994 0.3219490647315979 0.3305686414241791 0.3386459946632385 0.34468361735343933 0.35293155908584595 0.3640737235546112 0.3740508556365967 0.3799596130847931 0.3787302076816559 0.3690877854824066 0.3545362651348114 0.33818575739860535 0.32251599431037903 0.31119340658187866 0.3069508969783783 0.30643993616104126 0.3014766573905945 30445.38885 41538.7379 F:/DATA/135deg 15.056927844654062 43.61475352701898 +0.36250585317611694 0.42431044578552246 0.4834742844104767 0.5558268427848816 0.6433207988739014 0.7237451076507568 0.797504723072052 0.8740603923797607 0.9462519288063049 1.0028680562973022 1.0236170291900635 0.9993492960929871 0.9659426808357239 0.929129958152771 0.8976386189460754 0.8773003220558167 0.845932126045227 0.804290771484375 0.7517927289009094 0.6770941019058228 0.5976353883743286 0.5313588380813599 0.48177453875541687 0.44140711426734924 0.40849852561950684 0.3899365961551666 0.38149017095565796 0.3739112615585327 0.3684139847755432 0.372007817029953 0.38562244176864624 0.40915170311927795 0.4383581876754761 0.46522119641304016 0.4911789894104004 0.5281954407691956 0.5901359915733337 0.6282098889350891 0.6299937963485718 0.6347435712814331 0.6456948518753052 0.6421006917953491 0.6224752068519592 0.6007646918296814 0.5784657001495361 0.5487658381462097 0.5032517313957214 0.4633730351924896 0.4398660957813263 0.41094517707824707 0.3713396489620209 0.3397798538208008 0.315258264541626 0.2960793673992157 0.2789282202720642 0.26473933458328247 0.2583105266094208 0.26161065697669983 0.276593953371048 0.29428234696388245 0.30759015679359436 0.3208509385585785 0.33403608202934265 0.3378518223762512 0.3314681351184845 0.3205536901950836 0.3096092939376831 0.29909756779670715 0.2854691445827484 0.27216678857803345 0.2648516893386841 0.26480165123939514 0.27259862422943115 0.28223392367362976 0.28807657957077026 0.2966751158237457 0.3103998601436615 0.31771647930145264 0.3139994740486145 0.31038033962249756 0.30780771374702454 0.30000224709510803 0.2885487973690033 0.2776309549808502 0.2691199779510498 0.26336920261383057 0.2575911581516266 0.2499367892742157 0.24667014181613922 0.2502342164516449 0.2533777952194214 0.25388017296791077 0.2556212842464447 0.2578236758708954 0.25818225741386414 0.2583445906639099 0.2599364221096039 0.2620580792427063 0.2627926170825958 0.2631688117980957 0.2642405927181244 0.263955682516098 0.2622736394405365 0.2618711590766907 0.2638363242149353 0.2683615982532501 0.2739871144294739 0.27764204144477844 0.2804603576660156 0.28473037481307983 0.28941360116004944 0.2937960624694824 0.2986640930175781 0.30610325932502747 0.316412091255188 0.3255343437194824 0.3314375877380371 0.33745360374450684 0.3465556502342224 0.355802059173584 0.358920693397522 0.35263997316360474 0.33765292167663574 0.3183898329734802 0.30118611454963684 0.2887457013130188 0.28239473700523376 0.2824958264827728 0.2819530665874481 30442.5687 41541.616519999996 F:/DATA/135deg 14.148486745442884 40.914534151939826 +0.3650876581668854 0.44027072191238403 0.49740421772003174 0.5676716566085815 0.6565104126930237 0.7217820286750793 0.776906430721283 0.8554854989051819 0.9431904554367065 0.99639892578125 0.9918259382247925 0.9632425308227539 0.9571559429168701 0.9453587532043457 0.9196834564208984 0.9045694470405579 0.8967841863632202 0.8714707493782043 0.8187240958213806 0.7500607967376709 0.6737703084945679 0.5944964289665222 0.5322104096412659 0.48620209097862244 0.4495582580566406 0.4267524480819702 0.4147963225841522 0.4065539836883545 0.40079763531684875 0.40120112895965576 0.4117395281791687 0.4343542158603668 0.4588378369808197 0.4770737290382385 0.49635985493659973 0.5230758190155029 0.5750504732131958 0.6321943402290344 0.6574925780296326 0.6613973379135132 0.6457144618034363 0.6232727766036987 0.6174584627151489 0.6194400787353516 0.6105873584747314 0.5773681402206421 0.5304786562919617 0.4934249520301819 0.45931971073150635 0.41730549931526184 0.38470304012298584 0.3595018684864044 0.3293219804763794 0.30435964465141296 0.2891426980495453 0.2798253893852234 0.2746725082397461 0.2748556435108185 0.2886051833629608 0.3117738366127014 0.32717078924179077 0.33106401562690735 0.3289177715778351 0.33031389117240906 0.33271220326423645 0.3304341435432434 0.32225725054740906 0.30900219082832336 0.2952777147293091 0.2869744896888733 0.28450044989585876 0.2863030433654785 0.29052266478538513 0.29561755061149597 0.3012177348136902 0.3077249825000763 0.3149780333042145 0.3194979727268219 0.31837978959083557 0.3156931400299072 0.31331557035446167 0.3074597716331482 0.29792141914367676 0.28665927052497864 0.2769920229911804 0.2717728316783905 0.2680080831050873 0.26393961906433105 0.2608543634414673 0.25888293981552124 0.25867512822151184 0.2605808675289154 0.263666570186615 0.26618891954421997 0.2665948271751404 0.2663698196411133 0.2670312225818634 0.26882821321487427 0.27096620202064514 0.2717668414115906 0.2718110680580139 0.2726369798183441 0.27475622296333313 0.2783312201499939 0.2822757363319397 0.285504013299942 0.2890436351299286 0.29262956976890564 0.292468398809433 0.2886587381362915 0.28673070669174194 0.2884071469306946 0.29260167479515076 0.30139777064323425 0.31254521012306213 0.32084983587265015 0.329580694437027 0.34177514910697937 0.35234349966049194 0.3568665683269501 0.3554323613643646 0.3491654396057129 0.3388620913028717 0.32499754428863525 0.3104616105556488 0.29853302240371704 0.28830283880233765 0.27974289655685425 0.27512240409851074 30445.38885 41541.616519999996 F:/DATA/135deg 14.216843459338445 41.87857263213592 diff --git a/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile_model-results.tab b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile_model-results.tab new file mode 100644 index 000000000..d040448fd --- /dev/null +++ b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile_model-results.tab @@ -0,0 +1,19 @@ +1697.131066748047 1693.2739506872558 1689.416834626465 1685.5597185656738 1681.702602504883 1677.8454864440919 1673.9883703833011 1670.13125432251 1666.2741382617191 1662.417022200928 1658.5599061401367 1654.702790079346 1650.8456740185547 1646.988557957764 1643.1314418969728 1639.274325836182 1635.4172097753908 1631.5600937145996 1627.7029776538088 1623.8458615930176 1619.9887455322269 1616.1316294714356 1612.2745134106449 1608.4173973498537 1604.5602812890625 1600.7031652282717 1596.8460491674805 1592.9889331066897 1589.1318170458985 1585.2747009851078 1581.4175849243165 1577.5604688635258 1573.7033528027346 1569.8462367419434 1565.9891206811526 1562.1320046203614 1558.2748885595706 1554.4177724987794 1550.5606564379887 1546.7035403771974 1542.8464243164062 1538.9893082556155 1535.1321921948243 1531.2750761340335 1527.4179600732423 1523.5608440124515 1519.7037279516603 1515.846611890869 1511.9894958300783 1508.1323797692871 1504.2752637084964 1500.4181476477052 1496.5610315869144 1492.7039155261232 1488.8467994653324 1484.9896834045412 1481.13256734375 1477.2754512829592 1473.418335222168 1469.5612191613773 1465.704103100586 1461.8469870397953 1457.989870979004 1454.1327549182129 1450.275638857422 1446.418522796631 1442.5614067358401 1438.704290675049 1434.8471746142582 1430.990058553467 1427.1329424926757 1423.275826431885 1419.4187103710938 1415.561594310303 1411.7044782495118 1407.847362188721 1403.9902461279298 1400.133130067139 1396.2760140063479 1392.4188979455566 1388.5617818847659 1384.7046658239747 1380.847549763184 1376.9904337023927 1373.133317641602 1369.2762015808107 1365.4190855200195 1361.5619694592287 1357.7048533984375 1353.8477373376468 1349.9906212768556 1346.1335052160648 1342.2763891552736 1338.4192730944824 1334.5621570336916 1330.7050409729004 1326.8479249121096 1322.9908088513184 1319.1336927905277 1315.2765767297365 1311.4194606689457 1307.5623446081545 1303.7052285473633 1299.8481124865725 1295.9909964257813 1292.1338803649905 1288.2767643041993 1284.4196482434086 1280.5625321826174 1276.7054161218261 1272.8483000610354 1268.9911840002442 1265.1340679394534 1261.2769518786622 1257.4198358178714 1253.5627197570802 1249.705603696289 1245.8484876354983 1241.991371574707 1238.1342555139163 1234.277139453125 1230.4200233923343 1226.562907331543 1222.7057912707523 1218.8486752099611 1214.99155914917 1211.1344430883792 1207.277327027588 1203.4202109667972 map_x map_y Filename 1214.0 - 1258.0 1500.0 - 1580.0 Polarisation Angle R-squared (1214.0 - 1258.0) a0 (1214.0 - 1258.0) a1 (1214.0 - 1258.0) a2 (1214.0 - 1258.0) R-squared (1500.0 - 1580.0) a0 (1500.0 - 1580.0) a1 (1500.0 - 1580.0) a2 (1500.0 - 1580.0) +continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous F:/DATA/0deg F:/DATA/45deg F:/DATA/90deg F:/DATA/135deg continuous continuous 0.0\ Degrees 45.0\ Degrees 90.0\ Degrees 135.0\ Degrees continuous continuous continuous continuous continuous continuous continuous continuous + meta meta meta meta meta meta meta meta meta meta meta meta meta meta +0.3711118698120117 0.43782272934913635 0.49062955379486084 0.5547452569007874 0.6374028921127319 0.711500346660614 0.7876919507980347 0.8770861625671387 0.9559172987937927 1.0098530054092407 1.0404753684997559 1.0543735027313232 1.0619465112686157 1.0437582731246948 1.0013220310211182 0.9536964297294617 0.897933840751648 0.8533709645271301 0.8181004524230957 0.7584443688392639 0.6689296364784241 0.5782220363616943 0.513115644454956 0.46961721777915955 0.43171659111976624 0.3991532325744629 0.3810955286026001 0.37965840101242065 0.386007159948349 0.3947145342826843 0.4098324477672577 0.4343760311603546 0.46137940883636475 0.49168214201927185 0.528336226940155 0.5667646527290344 0.6178287267684937 0.6604256629943848 0.6766932010650635 0.6885275840759277 0.6986993551254272 0.6930281519889832 0.6724157929420471 0.6501829028129578 0.6263569593429565 0.5885990858078003 0.5376056432723999 0.5005533695220947 0.4779326319694519 0.4443279504776001 0.39699268341064453 0.36137861013412476 0.33436083793640137 0.30747178196907043 0.2803654670715332 0.2625480592250824 0.2592535614967346 0.27015992999076843 0.29309216141700745 0.31150364875793457 0.3194276988506317 0.328142374753952 0.3443129062652588 0.35353028774261475 0.3476772606372833 0.33774372935295105 0.32855379581451416 0.3200712502002716 0.31163617968559265 0.3032289445400238 0.2943628430366516 0.28816357254981995 0.2909632623195648 0.29872336983680725 0.3025616407394409 0.3057458698749542 0.3115512728691101 0.31618112325668335 0.3176253139972687 0.3175846040248871 0.3153497576713562 0.3088831901550293 0.3000914454460144 0.29377707839012146 0.2888909578323364 0.28027477860450745 0.270122230052948 0.26286780834198 0.2575746774673462 0.2533765435218811 0.2540722191333771 0.26083439588546753 0.2694004774093628 0.27414125204086304 0.2728372812271118 0.26937466859817505 0.2672775387763977 0.2684006989002228 0.2723020315170288 0.27508431673049927 0.2749064266681671 0.274681955575943 0.2775912284851074 0.28367695212364197 0.2893185019493103 0.290900319814682 0.2906703054904938 0.2926110625267029 0.2950325608253479 0.2977401614189148 0.3037301301956177 0.3114270567893982 0.318378210067749 0.32530495524406433 0.3349395990371704 0.3490666151046753 0.3638021945953369 0.3744945526123047 0.3803212642669678 0.3803481459617615 0.37394478917121887 0.3625723719596863 0.34696418046951294 0.3287803828716278 0.31259098649024963 0.3022864758968353 0.2975075840950012 0.2938818633556366 0.2872605323791504 30442.5687 41538.7379 F:/DATA/0deg 15.009961445779307 43.87936019111817 0.0 Degrees 0.9998996542510169 0.04788184003105633 -0.0930766425798808 15.10229663993498 0.4761749412326489 0.1699951093342037 0.198482528841064 43.874691613741085 +0.388348788022995 0.44867801666259766 0.502106249332428 0.5762503743171692 0.6664558053016663 0.739630937576294 0.8222108483314514 0.9173783659934998 0.9785887002944946 1.0107851028442383 1.0361779928207397 1.0637257099151611 1.0711760520935059 1.0423812866210938 1.025393009185791 0.9986843466758728 0.9373337626457214 0.8785869479179382 0.8271448612213135 0.7655133605003357 0.6908860802650452 0.6117749810218811 0.5471857190132141 0.4971246123313904 0.45541316270828247 0.42525458335876465 0.4062337279319763 0.39754077792167664 0.39981767535209656 0.41045162081718445 0.42612242698669434 0.4495392143726349 0.48013657331466675 0.509360134601593 0.5352477431297302 0.5706249475479126 0.6430520415306091 0.7104148864746094 0.7287077903747559 0.7300795912742615 0.7207353115081787 0.6928030848503113 0.6642997860908508 0.6465807557106018 0.6357985734939575 0.6169293522834778 0.5714240670204163 0.5247028470039368 0.49503496289253235 0.4588204622268677 0.41067439317703247 0.37448638677597046 0.34704023599624634 0.32218214869499207 0.29583585262298584 0.27490201592445374 0.26934197545051575 0.28096309304237366 0.3069058060646057 0.3270772397518158 0.33470597863197327 0.34152284264564514 0.35194724798202515 0.3573232889175415 0.3541431128978729 0.34866204857826233 0.3427005112171173 0.3312859833240509 0.3122206926345825 0.2955722510814667 0.2872144877910614 0.2867285907268524 0.2918354272842407 0.2956002652645111 0.2986833155155182 0.3060479462146759 0.31676867604255676 0.3262639045715332 0.330106645822525 0.32593291997909546 0.31699928641319275 0.30795541405677795 0.3018266558647156 0.29686442017555237 0.28721868991851807 0.2752007842063904 0.2667289972305298 0.2609139084815979 0.25778260827064514 0.2584190368652344 0.2610763907432556 0.2639258801937103 0.26595649123191833 0.26701226830482483 0.2679225206375122 0.2679891288280487 0.2669326663017273 0.2678163945674896 0.2720436155796051 0.2770630121231079 0.28001782298088074 0.27851158380508423 0.2751752436161041 0.276258647441864 0.2823660373687744 0.2899717390537262 0.29827389121055603 0.30697736144065857 0.3102128207683563 0.30654236674308777 0.30582261085510254 0.3128655254840851 0.3222534656524658 0.32939496636390686 0.33602944016456604 0.34821176528930664 0.3637096881866455 0.37178686261177063 0.3715791702270508 0.37046146392822266 0.36934414505958557 0.36342424154281616 0.350017786026001 0.33207470178604126 0.3140036165714264 0.2998875081539154 0.29220956563949585 0.2874009907245636 0.2815419137477875 30445.38885 41538.7379 F:/DATA/0deg 14.936959331411803 45.349811063094954 0.0 Degrees 0.9324530395726834 0.11528954707161643 -0.3900859865428774 15.249631354870715 0.36275784996581106 0.671080814707999 -0.43318106508974763 45.03441323505067 +0.366887629032135 0.43671754002571106 0.49220016598701477 0.5703327059745789 0.6657547950744629 0.731933057308197 0.7937033176422119 0.8747525215148926 0.9398021697998047 0.9730452299118042 1.0031681060791016 1.0538406372070312 1.0965853929519653 1.0494016408920288 0.9825043678283691 0.9511120319366455 0.9302560687065125 0.8842418789863586 0.8129315972328186 0.7183979153633118 0.6205475330352783 0.5415375232696533 0.48775240778923035 0.44761666655540466 0.41458284854888916 0.39335882663726807 0.3796997666358948 0.36864838004112244 0.36498430371284485 0.3680277466773987 0.3732655644416809 0.38918817043304443 0.42386338114738464 0.46311137080192566 0.4917769134044647 0.5237820148468018 0.5971131920814514 0.6691277027130127 0.6892750859260559 0.7003340125083923 0.7168111801147461 0.6999649405479431 0.6541981101036072 0.6189929246902466 0.5926592946052551 0.5696735382080078 0.5413363575935364 0.5053853988647461 0.465243935585022 0.41113007068634033 0.36086025834083557 0.32808783650398254 0.3003191649913788 0.2793380916118622 0.26471295952796936 0.2541550099849701 0.24993854761123657 0.25305330753326416 0.2655698359012604 0.27899375557899475 0.2841063439846039 0.28888702392578125 0.30285078287124634 0.3161625862121582 0.3197145164012909 0.3178388774394989 0.31100529432296753 0.29754751920700073 0.28191861510276794 0.2750825583934784 0.27559351921081543 0.27823397517204285 0.2830919921398163 0.2850538194179535 0.2825995981693268 0.28359857201576233 0.2883332371711731 0.289949893951416 0.2929544150829315 0.30135759711265564 0.30265331268310547 0.2906714677810669 0.2753030061721802 0.2651992440223694 0.25924843549728394 0.25318726897239685 0.24550479650497437 0.23828820884227753 0.23315896093845367 0.23029816150665283 0.2334306240081787 0.24293583631515503 0.2510787546634674 0.25073981285095215 0.24615781009197235 0.2464907467365265 0.2522513270378113 0.2587389051914215 0.262591689825058 0.263126403093338 0.26156532764434814 0.2589862048625946 0.2572213411331177 0.2594248950481415 0.2655974328517914 0.27193424105644226 0.27772676944732666 0.28423818945884705 0.28888431191444397 0.29118603467941284 0.2921951413154602 0.29164180159568787 0.2948339283466339 0.3066503405570984 0.32164159417152405 0.333238422870636 0.34339842200279236 0.355623722076416 0.36564287543296814 0.36494630575180054 0.35201695561408997 0.3341171145439148 0.3175579309463501 0.30399125814437866 0.2928829789161682 0.28347793221473694 0.2780621647834778 0.276618093252182 0.27352389693260193 30442.5687 41541.616519999996 F:/DATA/0deg 14.140093941838566 42.63377488797279 0.0 Degrees 0.9052486894719146 0.23198983049333044 -0.12072690257494645 14.320648710203532 0.5510780301748821 0.5808993859007311 0.3024109496913203 41.91339873814995 +0.36428871750831604 0.43003931641578674 0.47958770394325256 0.5450240969657898 0.634536862373352 0.7099695801734924 0.7796786427497864 0.8637834787368774 0.942089855670929 0.9903811812400818 1.0105667114257812 1.0208871364593506 1.005222201347351 0.963545024394989 0.9371297359466553 0.9139838814735413 0.8946059942245483 0.8827653527259827 0.840722918510437 0.7564958333969116 0.6611053943634033 0.5774503946304321 0.5202354192733765 0.48433250188827515 0.45376747846603394 0.4260224401950836 0.4059300422668457 0.3930695950984955 0.38632991909980774 0.3889123797416687 0.4001465141773224 0.4183931052684784 0.4428093135356903 0.47215187549591064 0.5050704479217529 0.5453080534934998 0.6085248589515686 0.658994734287262 0.668915331363678 0.6675289869308472 0.6717699766159058 0.6808158755302429 0.6681414842605591 0.6372467875480652 0.6000738739967346 0.5683797597885132 0.544323742389679 0.516345202922821 0.48224183917045593 0.4387160539627075 0.39499184489250183 0.3595888912677765 0.3304763436317444 0.3092094361782074 0.28860795497894287 0.26972246170043945 0.2605076730251312 0.26343077421188354 0.28140151500701904 0.29994896054267883 0.30823972821235657 0.31485551595687866 0.32437241077423096 0.33080095052719116 0.3303925395011902 0.3248642385005951 0.3165438175201416 0.3061983585357666 0.2946605384349823 0.2872968912124634 0.2868692874908447 0.2896806299686432 0.2909656763076782 0.2920180857181549 0.2945660948753357 0.2972028851509094 0.29964983463287354 0.3004482090473175 0.29766783118247986 0.2939799129962921 0.2927486002445221 0.2923987805843353 0.2889113426208496 0.2816716730594635 0.27281782031059265 0.2626931965351105 0.2514967918395996 0.24271203577518463 0.23827271163463593 0.23637256026268005 0.2380509227514267 0.24506837129592896 0.25348952412605286 0.25623422861099243 0.25412917137145996 0.2532842457294464 0.2547925114631653 0.2577175199985504 0.26068350672721863 0.2616606056690216 0.2597542703151703 0.2559884488582611 0.2536808252334595 0.256541907787323 0.2641761898994446 0.271513968706131 0.2755036950111389 0.27728980779647827 0.27779620885849 0.27858373522758484 0.28195881843566895 0.28836870193481445 0.29790475964546204 0.3091188371181488 0.317819207906723 0.3241935074329376 0.33264613151550293 0.3433806300163269 0.3505949378013611 0.35062962770462036 0.34647127985954285 0.3387751281261444 0.32535696029663086 0.3086860477924347 0.2940033972263336 0.2858646810054779 0.2827148139476776 0.2769644856452942 0.26818761229515076 30445.38885 41541.616519999996 F:/DATA/0deg 13.949567230311496 43.05058779046659 0.0 Degrees 0.9941901147353087 0.2536980425498405 -0.46382002276927525 14.441964377513065 0.1657092533769018 0.03694686596283513 -0.5203849464554426 42.743246117510395 +0.3773364722728729 0.43966636061668396 0.49002042412757874 0.5639562606811523 0.6609355807304382 0.7364853620529175 0.8136956691741943 0.8985644578933716 0.9468745589256287 0.9731678366661072 0.9914941191673279 0.9854417443275452 0.9628058671951294 0.9528713226318359 0.9546505808830261 0.9532977342605591 0.9257292151451111 0.8693946599960327 0.8010186553001404 0.7217180728912354 0.6436004638671875 0.5754334926605225 0.5214712619781494 0.47915247082710266 0.4447232484817505 0.41765138506889343 0.3990515470504761 0.39321616291999817 0.39747321605682373 0.40612584352493286 0.4184291958808899 0.43992483615875244 0.47834911942481995 0.5266345739364624 0.5672381520271301 0.597634494304657 0.6348262429237366 0.6744903922080994 0.6967960000038147 0.7098262310028076 0.7118614912033081 0.6856943368911743 0.6489338874816895 0.6190053224563599 0.5941586494445801 0.5711410641670227 0.5421783328056335 0.5111346244812012 0.4810764491558075 0.4355677664279938 0.3860788941383362 0.3534643054008484 0.32750168442726135 0.3032616674900055 0.2819446921348572 0.26981374621391296 0.2693929970264435 0.2801830768585205 0.30366891622543335 0.3256083130836487 0.3365386128425598 0.34310561418533325 0.35129883885383606 0.3588528633117676 0.35683950781822205 0.3458286225795746 0.33076736330986023 0.31613433361053467 0.30460110306739807 0.2960743308067322 0.2915134131908417 0.29322516918182373 0.2980576753616333 0.300569623708725 0.3029937744140625 0.3091799318790436 0.3191257119178772 0.32923704385757446 0.3315645456314087 0.3225858509540558 0.31236401200294495 0.3056598901748657 0.2981754243373871 0.2894536256790161 0.2814278304576874 0.2723696827888489 0.26151928305625916 0.2525339126586914 0.25026053190231323 0.2539668083190918 0.25997182726860046 0.26598429679870605 0.27031874656677246 0.27086934447288513 0.2690020799636841 0.26832443475723267 0.2695266008377075 0.2705895006656647 0.2702696919441223 0.27155083417892456 0.2761310338973999 0.28070759773254395 0.2832408547401428 0.2835163474082947 0.28365248441696167 0.2872329354286194 0.29273301362991333 0.29702767729759216 0.2998993694782257 0.30078554153442383 0.3016831874847412 0.30665796995162964 0.31462526321411133 0.32313990592956543 0.3358403742313385 0.3547256886959076 0.3718043267726898 0.3799355626106262 0.3825741112232208 0.383433073759079 0.3778041899204254 0.3644450008869171 0.3474675118923187 0.3291182518005371 0.3145691752433777 0.3077240586280823 0.3049233853816986 0.3022094964981079 0.2970089614391327 30442.5687 41538.7379 F:/DATA/45deg 15.14943703154183 44.23850067435577 45.0 Degrees 0.9998996542510169 0.04788184003105633 -0.0930766425798808 15.10229663993498 0.4761749412326489 0.1699951093342037 0.198482528841064 43.874691613741085 +0.37337228655815125 0.4396507143974304 0.49107563495635986 0.5586245059967041 0.646790623664856 0.7179062962532043 0.7848191857337952 0.8587467670440674 0.9132012128829956 0.9501560926437378 0.9785140156745911 0.984795868396759 0.9518576860427856 0.9169514179229736 0.9128903150558472 0.9190047979354858 0.9011522531509399 0.8552564978599548 0.7962431311607361 0.7195406556129456 0.6405887007713318 0.5768947005271912 0.5284963250160217 0.48475223779678345 0.44452735781669617 0.4175184965133667 0.4050688147544861 0.4015383720397949 0.4035366475582123 0.4095524847507477 0.41840967535972595 0.43762996792793274 0.4735090136528015 0.5144422650337219 0.5498296618461609 0.5891739130020142 0.6544406414031982 0.7074301838874817 0.721211850643158 0.7253494262695312 0.7205705046653748 0.7011243104934692 0.6794993877410889 0.6561350226402283 0.6234012842178345 0.5791003108024597 0.5371192693710327 0.5127407312393188 0.48728594183921814 0.43710267543792725 0.3880417048931122 0.358508825302124 0.3291686475276947 0.30198532342910767 0.2838975191116333 0.2756803035736084 0.27510562539100647 0.28265753388404846 0.30272212624549866 0.3223998248577118 0.3314470052719116 0.3400789797306061 0.3539663255214691 0.3615642189979553 0.35621216893196106 0.34422820806503296 0.33036601543426514 0.3164904713630676 0.30386441946029663 0.29513826966285706 0.2911766767501831 0.2941439151763916 0.302760511636734 0.30998602509498596 0.31750985980033875 0.32691699266433716 0.33109205961227417 0.3281230330467224 0.32525792717933655 0.32315510511398315 0.3174678683280945 0.31104981899261475 0.3055250942707062 0.297789067029953 0.28920844197273254 0.28300905227661133 0.27708175778388977 0.27133673429489136 0.26787322759628296 0.2659844756126404 0.26673445105552673 0.2708447575569153 0.2750791013240814 0.2769821286201477 0.2775936722755432 0.278523713350296 0.2802591919898987 0.2821207642555237 0.282520055770874 0.28267189860343933 0.2840110957622528 0.28552529215812683 0.28797078132629395 0.2903944253921509 0.29174160957336426 0.2954663932323456 0.30151888728141785 0.30476686358451843 0.30412399768829346 0.30343693494796753 0.30575087666511536 0.31121543049812317 0.3187049329280853 0.3290562331676483 0.3425249457359314 0.3562610149383545 0.36918962001800537 0.3792024254798889 0.3837013840675354 0.3848077654838562 0.3821556568145752 0.3716545104980469 0.3544897437095642 0.33635222911834717 0.3203563988208771 0.30804407596588135 0.3005572259426117 0.2961486577987671 0.29254403710365295 30445.38885 41538.7379 F:/DATA/45deg 15.287506938801155 44.956915156436416 45.0 Degrees 0.9324530395726834 0.11528954707161643 -0.3900859865428774 15.249631354870715 0.36275784996581106 0.671080814707999 -0.43318106508974763 45.03441323505067 +0.38911929726600647 0.44554373621940613 0.4855414927005768 0.5539154410362244 0.6538650989532471 0.7315957546234131 0.8033648729324341 0.884945809841156 0.9360079765319824 0.954917311668396 0.9649530649185181 0.9849116206169128 1.008013129234314 0.9807816743850708 0.9428510069847107 0.9156916737556458 0.8764055967330933 0.825237512588501 0.7735792994499207 0.705725371837616 0.6241020560264587 0.5504984855651855 0.4957604706287384 0.45222288370132446 0.41255465149879456 0.3828220069408417 0.37051448225975037 0.37108558416366577 0.37338513135910034 0.37661170959472656 0.3874439001083374 0.41331085562705994 0.449747771024704 0.47858643531799316 0.4993457794189453 0.5276702642440796 0.5828417539596558 0.6414362788200378 0.6703454852104187 0.6750879287719727 0.6613235473632812 0.6516115069389343 0.6429095268249512 0.6263266801834106 0.6048684120178223 0.5731279253959656 0.5306711196899414 0.492236465215683 0.45757782459259033 0.40995675325393677 0.3611593246459961 0.33053696155548096 0.3058626651763916 0.2824017405509949 0.2620924711227417 0.24882546067237854 0.24321754276752472 0.24622128903865814 0.2659408152103424 0.29050007462501526 0.3000190854072571 0.30213284492492676 0.3106580674648285 0.3247032165527344 0.3296380937099457 0.3233187794685364 0.3104628324508667 0.29432252049446106 0.2806641161441803 0.2753435969352722 0.2728271782398224 0.270643025636673 0.2736828327178955 0.2805771827697754 0.28472232818603516 0.2870364487171173 0.2909660339355469 0.29421940445899963 0.2940268814563751 0.29415833950042725 0.2929386496543884 0.2845102548599243 0.27148693799972534 0.26009973883628845 0.25316986441612244 0.25014013051986694 0.24763965606689453 0.24328280985355377 0.24036899209022522 0.2429419606924057 0.24842298030853271 0.25228366255760193 0.25561103224754333 0.25914180278778076 0.25783947110176086 0.253574401140213 0.2532463073730469 0.25550371408462524 0.2551080286502838 0.2552626430988312 0.2603242099285126 0.2648930549621582 0.26599374413490295 0.26791733503341675 0.27033597230911255 0.27200937271118164 0.27633726596832275 0.281934916973114 0.28416839241981506 0.2850780189037323 0.28886574506759644 0.29535502195358276 0.30392923951148987 0.3146568834781647 0.3258497714996338 0.3378189206123352 0.3510323464870453 0.3626718819141388 0.3707166612148285 0.37344253063201904 0.3687247931957245 0.3559401333332062 0.336141973733902 0.31635063886642456 0.30404531955718994 0.2972669005393982 0.29117393493652344 0.28547903895378113 0.2802625894546509 30442.5687 41541.616519999996 F:/DATA/45deg 14.612466406432896 42.07633292374312 45.0 Degrees 0.9052486894719146 0.23198983049333044 -0.12072690257494645 14.320648710203532 0.5510780301748821 0.5808993859007311 0.3024109496913203 41.91339873814995 +0.34738847613334656 0.4179860055446625 0.4664291739463806 0.5296632647514343 0.6272340416908264 0.7056167125701904 0.7561516165733337 0.8085007667541504 0.8644552826881409 0.9050332307815552 0.9181493520736694 0.9111636281013489 0.9073537588119507 0.9109403491020203 0.9062535762786865 0.8872991800308228 0.8642696738243103 0.8446381688117981 0.8067254424095154 0.7335556745529175 0.6443662047386169 0.5644205808639526 0.506117045879364 0.467324823141098 0.43990078568458557 0.4194169044494629 0.4045620858669281 0.39635950326919556 0.3957340121269226 0.40181082487106323 0.4117859899997711 0.4274001121520996 0.4520021080970764 0.48187950253486633 0.5073687434196472 0.5298813581466675 0.5784440636634827 0.6448124051094055 0.6777898669242859 0.6767211556434631 0.648645281791687 0.6306580901145935 0.6294295191764832 0.6141109466552734 0.586581289768219 0.5592874884605408 0.5341745018959045 0.5011913180351257 0.4583965539932251 0.4066646993160248 0.3704123795032501 0.3489791750907898 0.3235110640525818 0.29798153042793274 0.2787266969680786 0.26791489124298096 0.2635549306869507 0.2648940086364746 0.2800384759902954 0.30330970883369446 0.3163895010948181 0.31783244013786316 0.3187214732170105 0.3288123607635498 0.33496859669685364 0.3315340280532837 0.32235997915267944 0.30760458111763 0.289726585149765 0.27839016914367676 0.2739510238170624 0.272896945476532 0.27768412232398987 0.286607027053833 0.29376494884490967 0.30020976066589355 0.3059932589530945 0.30805355310440063 0.3080996572971344 0.30983278155326843 0.30988332629203796 0.3039196729660034 0.29341766238212585 0.28149351477622986 0.2707284390926361 0.2622477412223816 0.25400418043136597 0.2478829324245453 0.2490083873271942 0.2554311156272888 0.26148200035095215 0.26385727524757385 0.26382210850715637 0.26387882232666016 0.26245152950286865 0.26000332832336426 0.2600518763065338 0.2617824673652649 0.26309698820114136 0.26552656292915344 0.2700032591819763 0.2736172676086426 0.2747006118297577 0.2754264175891876 0.2767968773841858 0.2779064476490021 0.279891699552536 0.284357488155365 0.28945451974868774 0.2933834195137024 0.2966553568840027 0.2989789843559265 0.30280598998069763 0.31150293350219727 0.32365909218788147 0.33813759684562683 0.35394054651260376 0.3676077127456665 0.376840740442276 0.3798968195915222 0.37367281317710876 0.3576556146144867 0.3369816541671753 0.31849825382232666 0.30471497774124146 0.29529136419296265 0.2896086275577545 0.2846777141094208 0.2775256037712097 30445.38885 41541.616519999996 F:/DATA/45deg 14.724239544441382 41.95246636406159 45.0 Degrees 0.9941901147353087 0.2536980425498405 -0.46382002276927525 14.441964377513065 0.1657092533769018 0.03694686596283513 -0.5203849464554426 42.743246117510395 +0.36890196800231934 0.4383719861507416 0.49215278029441833 0.5678848028182983 0.6697624325752258 0.7421551942825317 0.7949410080909729 0.861175537109375 0.9304823279380798 0.9888854622840881 1.0296154022216797 1.0200906991958618 0.9658761620521545 0.9375912547111511 0.9355541467666626 0.9351963996887207 0.9119044542312622 0.8633236289024353 0.8102912902832031 0.7478935718536377 0.6693353056907654 0.5896985530853271 0.5278323888778687 0.47969499230384827 0.4415580630302429 0.4171638786792755 0.40274444222450256 0.3934766352176666 0.3904435634613037 0.39783647656440735 0.41653168201446533 0.4471336603164673 0.4835716187953949 0.5180643796920776 0.5542099475860596 0.5966129302978516 0.6491007804870605 0.6811864972114563 0.6899703741073608 0.6939358711242676 0.6857684850692749 0.6570229530334473 0.6270668506622314 0.6001116633415222 0.5694991946220398 0.5400396585464478 0.5212351679801941 0.5054466128349304 0.4800109267234802 0.4332926869392395 0.38531044125556946 0.35653600096702576 0.33400747179985046 0.3157062530517578 0.3017118573188782 0.29292401671409607 0.2914346158504486 0.2968195676803589 0.3123685419559479 0.3298073410987854 0.3378491699695587 0.3447093665599823 0.35713934898376465 0.36121153831481934 0.354942262172699 0.35000061988830566 0.34591320157051086 0.3377359211444855 0.32351627945899963 0.3089088499546051 0.299715518951416 0.29520851373672485 0.29720360040664673 0.3091683089733124 0.3235648274421692 0.3309069871902466 0.3311137557029724 0.3341479003429413 0.3409155011177063 0.3392958343029022 0.32886332273483276 0.318060964345932 0.31203606724739075 0.30700525641441345 0.2969604432582855 0.2861284911632538 0.2785927355289459 0.27391406893730164 0.2739171087741852 0.27796828746795654 0.2818444073200226 0.28413259983062744 0.28639599680900574 0.28605619072914124 0.28013235330581665 0.27383479475975037 0.27307555079460144 0.27768054604530334 0.2847695052623749 0.29085657000541687 0.28964218497276306 0.2820451259613037 0.2783108055591583 0.28211650252342224 0.28757697343826294 0.2919096350669861 0.2974321246147156 0.30412620306015015 0.3101852238178253 0.31293031573295593 0.31173041462898254 0.31200647354125977 0.31643787026405334 0.3226405680179596 0.33135539293289185 0.3442952632904053 0.3607310354709625 0.37769126892089844 0.38771292567253113 0.3854190707206726 0.37552234530448914 0.36437416076660156 0.35301434993743896 0.34029337763786316 0.3268333971500397 0.31639185547828674 0.31317082047462463 0.31620898842811584 0.31643491983413696 30442.5687 41538.7379 F:/DATA/90deg 15.196114730939069 43.482395133432554 90.0 Degrees 0.9998996542510169 0.04788184003105633 -0.0930766425798808 15.10229663993498 0.4761749412326489 0.1699951093342037 0.198482528841064 43.874691613741085 +0.37875914573669434 0.4469207227230072 0.49604201316833496 0.5680999159812927 0.6705905199050903 0.7483171224594116 0.80452561378479 0.8658115863800049 0.9279407262802124 0.9807824492454529 1.0223487615585327 1.0514615774154663 1.0463922023773193 1.0112226009368896 0.9982134103775024 1.004634141921997 0.9877952933311462 0.9317412972450256 0.8688726425170898 0.791929304599762 0.6982804536819458 0.6116718649864197 0.5463566184043884 0.4956464171409607 0.4562545120716095 0.43035486340522766 0.41308432817459106 0.4023517668247223 0.40038397908210754 0.4071796238422394 0.4212566614151001 0.44529813528060913 0.47869226336479187 0.5134111642837524 0.5476288199424744 0.5924862027168274 0.6646744608879089 0.7205690741539001 0.7406251430511475 0.7573677897453308 0.7730262279510498 0.7530763149261475 0.701831042766571 0.6527606844902039 0.6117518544197083 0.5808829665184021 0.5582142472267151 0.5362958312034607 0.5081617832183838 0.4623250961303711 0.41480353474617004 0.3816410005092621 0.3512253761291504 0.3229435384273529 0.30036529898643494 0.28829801082611084 0.28772664070129395 0.29815641045570374 0.31810328364372253 0.33310839533805847 0.34295332431793213 0.3576355576515198 0.37281879782676697 0.37368515133857727 0.36629509925842285 0.3603748083114624 0.35585665702819824 0.3474416136741638 0.33159855008125305 0.31616654992103577 0.3076492249965668 0.307073712348938 0.3140259385108948 0.3209126889705658 0.3253902792930603 0.3307969272136688 0.3362623155117035 0.34198322892189026 0.3472789525985718 0.3470509350299835 0.3400651216506958 0.3291180729866028 0.31915709376335144 0.3109745383262634 0.3023119568824768 0.2948138117790222 0.28782516717910767 0.27949029207229614 0.2736770212650299 0.2739221751689911 0.27921369671821594 0.2852224111557007 0.2887378931045532 0.2893288731575012 0.28667038679122925 0.2830811142921448 0.28239449858665466 0.28517019748687744 0.28917649388313293 0.2914784848690033 0.2913095951080322 0.2914259135723114 0.29324576258659363 0.2956298291683197 0.2981545031070709 0.3011481463909149 0.3054879605770111 0.3107515871524811 0.31411612033843994 0.31555652618408203 0.3172118663787842 0.31911471486091614 0.32280173897743225 0.33204859495162964 0.3453712463378906 0.357761949300766 0.3699503242969513 0.38311585783958435 0.39259737730026245 0.395723819732666 0.39234602451324463 0.38097503781318665 0.3659316301345825 0.3534175157546997 0.34347930550575256 0.33371132612228394 0.3236602544784546 0.3152346611022949 0.30779775977134705 30445.38885 41538.7379 F:/DATA/90deg 15.717131304491499 46.21617319326819 90.0 Degrees 0.9324530395726834 0.11528954707161643 -0.3900859865428774 15.249631354870715 0.36275784996581106 0.671080814707999 -0.43318106508974763 45.03441323505067 +0.3608156144618988 0.4259406626224518 0.47818616032600403 0.5471063256263733 0.6347803473472595 0.7001804113388062 0.7520433068275452 0.8171277642250061 0.8950353264808655 0.9654224514961243 1.013027548789978 1.0263880491256714 0.9852103590965271 0.941172182559967 0.931695818901062 0.9181087017059326 0.8757404685020447 0.8307337164878845 0.7877539992332458 0.7257715463638306 0.6523596048355103 0.5768492817878723 0.5085425972938538 0.456727534532547 0.4192277491092682 0.3939008414745331 0.3818787932395935 0.3828960657119751 0.389323353767395 0.39450258016586304 0.39829221367836 0.40605780482292175 0.4275314211845398 0.4643791615962982 0.505535900592804 0.5479178428649902 0.5994552969932556 0.6376073360443115 0.6582133769989014 0.6799547672271729 0.6931027770042419 0.6702796816825867 0.6343024969100952 0.6056128144264221 0.5789087414741516 0.5561301112174988 0.53394615650177 0.4996113181114197 0.4577721953392029 0.4083678126335144 0.36549386382102966 0.3386378884315491 0.3173430263996124 0.2995651960372925 0.2844037711620331 0.27193325757980347 0.26600706577301025 0.2700923979282379 0.2851560115814209 0.30088505148887634 0.3138630986213684 0.3285767436027527 0.3413139879703522 0.3445935547351837 0.3396775424480438 0.330121785402298 0.3199063241481781 0.30752673745155334 0.2904285490512848 0.27791693806648254 0.2726101279258728 0.27176886796951294 0.2783729135990143 0.2872854471206665 0.29147452116012573 0.29573073983192444 0.30301201343536377 0.3096592128276825 0.3131972551345825 0.31535086035728455 0.3140628933906555 0.3053463399410248 0.2954469323158264 0.2890409231185913 0.280372679233551 0.2706373333930969 0.2643801271915436 0.25798389315605164 0.2508365511894226 0.24706313014030457 0.2483857423067093 0.25367772579193115 0.2591390609741211 0.26199933886528015 0.2643854320049286 0.2681591808795929 0.2714567184448242 0.27293530106544495 0.2729243338108063 0.27181246876716614 0.27032458782196045 0.2693708539009094 0.26829567551612854 0.2665247321128845 0.2669430077075958 0.271585613489151 0.2774175703525543 0.28121861815452576 0.2841823399066925 0.28875136375427246 0.2948462665081024 0.3012498915195465 0.30834972858428955 0.3174125552177429 0.3262895941734314 0.33198782801628113 0.3391663730144501 0.35144802927970886 0.3615659177303314 0.3633808195590973 0.3589021563529968 0.3500611186027527 0.33608290553092957 0.3192422091960907 0.30552980303764343 0.29612672328948975 0.2880210280418396 0.2813362777233124 0.2759957015514374 30442.5687 41541.616519999996 F:/DATA/90deg 14.381547746983568 42.02895298858711 90.0 Degrees 0.9052486894719146 0.23198983049333044 -0.12072690257494645 14.320648710203532 0.5510780301748821 0.5808993859007311 0.3024109496913203 41.91339873814995 +0.3729221224784851 0.44012895226478577 0.4914250373840332 0.5655630230903625 0.6647416949272156 0.7444058060646057 0.8126416206359863 0.8799846172332764 0.9443001747131348 0.9979190826416016 1.0210847854614258 1.0208030939102173 1.0111762285232544 0.992798924446106 0.9904224276542664 0.99041348695755 0.9595239162445068 0.908574640750885 0.846463143825531 0.7647848725318909 0.6809067726135254 0.6017272472381592 0.5331747531890869 0.48201125860214233 0.44443103671073914 0.41660502552986145 0.3969760835170746 0.38763803243637085 0.38977357745170593 0.4000709354877472 0.41259172558784485 0.4278537333011627 0.45189592242240906 0.48642393946647644 0.5247828960418701 0.5645804405212402 0.612518310546875 0.6483836770057678 0.6727944016456604 0.7076162695884705 0.7434014678001404 0.7206994891166687 0.6666464805603027 0.63228839635849 0.608867883682251 0.5807878971099854 0.5441436171531677 0.5172581076622009 0.4963454604148865 0.45485949516296387 0.401254266500473 0.36339372396469116 0.3367786109447479 0.31736981868743896 0.29844656586647034 0.28279122710227966 0.27746984362602234 0.2811555564403534 0.2927308678627014 0.3071295917034149 0.3210527002811432 0.33639973402023315 0.3501872718334198 0.3525633215904236 0.34586936235427856 0.33730486035346985 0.3312234878540039 0.32529526948928833 0.31066590547561646 0.2939175069332123 0.286742240190506 0.28868338465690613 0.2973419427871704 0.3067079484462738 0.31102290749549866 0.31296807527542114 0.3165799379348755 0.3216167390346527 0.32459816336631775 0.32458773255348206 0.32075992226600647 0.31120601296424866 0.3001273572444916 0.2915954291820526 0.28556665778160095 0.28158968687057495 0.2759927809238434 0.26627132296562195 0.25822049379348755 0.25609999895095825 0.2582840323448181 0.26162636280059814 0.26389646530151367 0.26584580540657043 0.269505113363266 0.2740560472011566 0.2757222354412079 0.2737424373626709 0.27331092953681946 0.2753473222255707 0.2754512131214142 0.2745696008205414 0.27530866861343384 0.2763848900794983 0.27731868624687195 0.2794644236564636 0.28307804465293884 0.2873600125312805 0.29181772470474243 0.29564568400382996 0.29717445373535156 0.2980411946773529 0.30308812856674194 0.31369927525520325 0.3267776072025299 0.3403771221637726 0.3552534282207489 0.3692227900028229 0.3773849606513977 0.37742289900779724 0.3699462413787842 0.3581613600254059 0.3446747362613678 0.3301258683204651 0.3174242079257965 0.3073962330818176 0.2965550720691681 0.28561556339263916 0.27806076407432556 30445.38885 41541.616519999996 F:/DATA/90deg 14.87720727584366 44.091357683377474 90.0 Degrees 0.9941901147353087 0.2536980425498405 -0.46382002276927525 14.441964377513065 0.1657092533769018 0.03694686596283513 -0.5203849464554426 42.743246117510395 +0.3949830234050751 0.4622531533241272 0.5109723210334778 0.5819476842880249 0.6732906699180603 0.7399584054946899 0.8056941032409668 0.8803262114524841 0.9407079219818115 0.9959824681282043 1.0247737169265747 0.9988774061203003 0.9598121643066406 0.9596822261810303 0.9756194353103638 0.9531159996986389 0.8880895376205444 0.8291646242141724 0.7852953672409058 0.7326091527938843 0.6583097577095032 0.5755128264427185 0.5128992199897766 0.47360721230506897 0.4461856484413147 0.424794465303421 0.40726786851882935 0.39642640948295593 0.3955315947532654 0.3990853428840637 0.40200623869895935 0.41744357347488403 0.4541429877281189 0.4928371012210846 0.523593544960022 0.5572065114974976 0.6082401275634766 0.6535071730613708 0.6752548813819885 0.6942375302314758 0.7089064717292786 0.6849415898323059 0.648251473903656 0.6290637254714966 0.611190140247345 0.5820888876914978 0.5479511022567749 0.5251440405845642 0.5092036724090576 0.4710317552089691 0.41165193915367126 0.368015855550766 0.33563244342803955 0.30891987681388855 0.289467990398407 0.279835045337677 0.2776188254356384 0.281124472618103 0.2969658076763153 0.3199588358402252 0.3370678722858429 0.35005685687065125 0.3592534065246582 0.3598088026046753 0.3555058240890503 0.34791675209999084 0.3381218910217285 0.32693901658058167 0.3126853406429291 0.3007925748825073 0.2955957353115082 0.2945536673069 0.29722654819488525 0.30562835931777954 0.3160330057144165 0.32335811853408813 0.32722195982933044 0.33106622099876404 0.333890825510025 0.3307388126850128 0.32467377185821533 0.31839045882225037 0.3102380931377411 0.30023348331451416 0.28814268112182617 0.2750730514526367 0.26571476459503174 0.2631886601448059 0.2642560303211212 0.2657497227191925 0.2698196768760681 0.2753346860408783 0.27848049998283386 0.27970898151397705 0.2795354127883911 0.2767869830131531 0.27504852414131165 0.2782919108867645 0.28145065903663635 0.2807522118091583 0.2820216417312622 0.28606170415878296 0.2876238524913788 0.2858695089817047 0.28583207726478577 0.29170745611190796 0.2989623248577118 0.3013303577899933 0.3022397756576538 0.3061143457889557 0.31094178557395935 0.31485098600387573 0.3188069462776184 0.32449349761009216 0.333775132894516 0.34593096375465393 0.3592696785926819 0.3726845979690552 0.3809838593006134 0.37974658608436584 0.37090665102005005 0.3579893112182617 0.3460439443588257 0.33749645948410034 0.3274995684623718 0.3147842586040497 0.3056890070438385 0.3015490472316742 0.2963547110557556 30442.5687 41538.7379 F:/DATA/135deg 15.053673351479718 43.89851045568374 135.0 Degrees 0.9998996542510169 0.04788184003105633 -0.0930766425798808 15.10229663993498 0.4761749412326489 0.1699951093342037 0.198482528841064 43.874691613741085 +0.36599868535995483 0.44001543521881104 0.4966375231742859 0.5643589496612549 0.654793381690979 0.7409048080444336 0.8192135691642761 0.8847960829734802 0.9369638562202454 0.9906289577484131 1.025296688079834 1.0149723291397095 0.9805884957313538 0.9636447429656982 0.9588003158569336 0.9524202942848206 0.9314351677894592 0.8927587270736694 0.8397254943847656 0.7675902843475342 0.6844693422317505 0.6059010624885559 0.5474121570587158 0.5043894052505493 0.468307226896286 0.44075509905815125 0.4207476079463959 0.4080858826637268 0.40591961145401 0.4134867191314697 0.42650675773620605 0.4475072920322418 0.47888901829719543 0.5122790336608887 0.5369526743888855 0.5554997324943542 0.5947977304458618 0.647955060005188 0.6778163313865662 0.6932549476623535 0.6977417469024658 0.6872305870056152 0.659528911113739 0.6245843768119812 0.5957351922988892 0.5746957659721375 0.5465317368507385 0.5116745233535767 0.47723180055618286 0.4333028197288513 0.3936629891395569 0.36897724866867065 0.345966637134552 0.3255443572998047 0.31004011631011963 0.29891106486320496 0.2932963967323303 0.2937392592430115 0.3078584671020508 0.33370327949523926 0.35201096534729004 0.3585779666900635 0.36050570011138916 0.3624379336833954 0.3620472550392151 0.35969817638397217 0.35452911257743835 0.3419364094734192 0.3230227828025818 0.30832669138908386 0.30204203724861145 0.3018741011619568 0.30683496594429016 0.3151794970035553 0.3218154311180115 0.3262678384780884 0.33061009645462036 0.33248963952064514 0.3305680453777313 0.32937225699424744 0.3280726373195648 0.322355717420578 0.3143385052680969 0.30674803256988525 0.2977624237537384 0.28612422943115234 0.27380654215812683 0.26605281233787537 0.2670673131942749 0.27401211857795715 0.2821645736694336 0.28739145398139954 0.289187490940094 0.2906554937362671 0.29101991653442383 0.28759765625 0.28305813670158386 0.28146880865097046 0.2823540270328522 0.2834238111972809 0.28334492444992065 0.28242823481559753 0.2830897569656372 0.285215824842453 0.286749929189682 0.2894335985183716 0.2963193953037262 0.30561134219169617 0.31135934591293335 0.3125182092189789 0.3135771155357361 0.31644806265830994 0.3219490647315979 0.3305686414241791 0.3386459946632385 0.34468361735343933 0.35293155908584595 0.3640737235546112 0.3740508556365967 0.3799596130847931 0.3787302076816559 0.3690877854824066 0.3545362651348114 0.33818575739860535 0.32251599431037903 0.31119340658187866 0.3069508969783783 0.30643993616104126 0.3014766573905945 30445.38885 41538.7379 F:/DATA/135deg 15.056927844654062 43.61475352701898 135.0 Degrees 0.9324530395726834 0.11528954707161643 -0.3900859865428774 15.249631354870715 0.36275784996581106 0.671080814707999 -0.43318106508974763 45.03441323505067 +0.36250585317611694 0.42431044578552246 0.4834742844104767 0.5558268427848816 0.6433207988739014 0.7237451076507568 0.797504723072052 0.8740603923797607 0.9462519288063049 1.0028680562973022 1.0236170291900635 0.9993492960929871 0.9659426808357239 0.929129958152771 0.8976386189460754 0.8773003220558167 0.845932126045227 0.804290771484375 0.7517927289009094 0.6770941019058228 0.5976353883743286 0.5313588380813599 0.48177453875541687 0.44140711426734924 0.40849852561950684 0.3899365961551666 0.38149017095565796 0.3739112615585327 0.3684139847755432 0.372007817029953 0.38562244176864624 0.40915170311927795 0.4383581876754761 0.46522119641304016 0.4911789894104004 0.5281954407691956 0.5901359915733337 0.6282098889350891 0.6299937963485718 0.6347435712814331 0.6456948518753052 0.6421006917953491 0.6224752068519592 0.6007646918296814 0.5784657001495361 0.5487658381462097 0.5032517313957214 0.4633730351924896 0.4398660957813263 0.41094517707824707 0.3713396489620209 0.3397798538208008 0.315258264541626 0.2960793673992157 0.2789282202720642 0.26473933458328247 0.2583105266094208 0.26161065697669983 0.276593953371048 0.29428234696388245 0.30759015679359436 0.3208509385585785 0.33403608202934265 0.3378518223762512 0.3314681351184845 0.3205536901950836 0.3096092939376831 0.29909756779670715 0.2854691445827484 0.27216678857803345 0.2648516893386841 0.26480165123939514 0.27259862422943115 0.28223392367362976 0.28807657957077026 0.2966751158237457 0.3103998601436615 0.31771647930145264 0.3139994740486145 0.31038033962249756 0.30780771374702454 0.30000224709510803 0.2885487973690033 0.2776309549808502 0.2691199779510498 0.26336920261383057 0.2575911581516266 0.2499367892742157 0.24667014181613922 0.2502342164516449 0.2533777952194214 0.25388017296791077 0.2556212842464447 0.2578236758708954 0.25818225741386414 0.2583445906639099 0.2599364221096039 0.2620580792427063 0.2627926170825958 0.2631688117980957 0.2642405927181244 0.263955682516098 0.2622736394405365 0.2618711590766907 0.2638363242149353 0.2683615982532501 0.2739871144294739 0.27764204144477844 0.2804603576660156 0.28473037481307983 0.28941360116004944 0.2937960624694824 0.2986640930175781 0.30610325932502747 0.316412091255188 0.3255343437194824 0.3314375877380371 0.33745360374450684 0.3465556502342224 0.355802059173584 0.358920693397522 0.35263997316360474 0.33765292167663574 0.3183898329734802 0.30118611454963684 0.2887457013130188 0.28239473700523376 0.2824958264827728 0.2819530665874481 30442.5687 41541.616519999996 F:/DATA/135deg 14.148486745442884 40.914534151939826 135.0 Degrees 0.9052486894719146 0.23198983049333044 -0.12072690257494645 14.320648710203532 0.5510780301748821 0.5808993859007311 0.3024109496913203 41.91339873814995 +0.3650876581668854 0.44027072191238403 0.49740421772003174 0.5676716566085815 0.6565104126930237 0.7217820286750793 0.776906430721283 0.8554854989051819 0.9431904554367065 0.99639892578125 0.9918259382247925 0.9632425308227539 0.9571559429168701 0.9453587532043457 0.9196834564208984 0.9045694470405579 0.8967841863632202 0.8714707493782043 0.8187240958213806 0.7500607967376709 0.6737703084945679 0.5944964289665222 0.5322104096412659 0.48620209097862244 0.4495582580566406 0.4267524480819702 0.4147963225841522 0.4065539836883545 0.40079763531684875 0.40120112895965576 0.4117395281791687 0.4343542158603668 0.4588378369808197 0.4770737290382385 0.49635985493659973 0.5230758190155029 0.5750504732131958 0.6321943402290344 0.6574925780296326 0.6613973379135132 0.6457144618034363 0.6232727766036987 0.6174584627151489 0.6194400787353516 0.6105873584747314 0.5773681402206421 0.5304786562919617 0.4934249520301819 0.45931971073150635 0.41730549931526184 0.38470304012298584 0.3595018684864044 0.3293219804763794 0.30435964465141296 0.2891426980495453 0.2798253893852234 0.2746725082397461 0.2748556435108185 0.2886051833629608 0.3117738366127014 0.32717078924179077 0.33106401562690735 0.3289177715778351 0.33031389117240906 0.33271220326423645 0.3304341435432434 0.32225725054740906 0.30900219082832336 0.2952777147293091 0.2869744896888733 0.28450044989585876 0.2863030433654785 0.29052266478538513 0.29561755061149597 0.3012177348136902 0.3077249825000763 0.3149780333042145 0.3194979727268219 0.31837978959083557 0.3156931400299072 0.31331557035446167 0.3074597716331482 0.29792141914367676 0.28665927052497864 0.2769920229911804 0.2717728316783905 0.2680080831050873 0.26393961906433105 0.2608543634414673 0.25888293981552124 0.25867512822151184 0.2605808675289154 0.263666570186615 0.26618891954421997 0.2665948271751404 0.2663698196411133 0.2670312225818634 0.26882821321487427 0.27096620202064514 0.2717668414115906 0.2718110680580139 0.2726369798183441 0.27475622296333313 0.2783312201499939 0.2822757363319397 0.285504013299942 0.2890436351299286 0.29262956976890564 0.292468398809433 0.2886587381362915 0.28673070669174194 0.2884071469306946 0.29260167479515076 0.30139777064323425 0.31254521012306213 0.32084983587265015 0.329580694437027 0.34177514910697937 0.35234349966049194 0.3568665683269501 0.3554323613643646 0.3491654396057129 0.3388620913028717 0.32499754428863525 0.3104616105556488 0.29853302240371704 0.28830283880233765 0.27974289655685425 0.27512240409851074 30445.38885 41541.616519999996 F:/DATA/135deg 14.216843459338445 41.87857263213592 135.0 Degrees 0.9941901147353087 0.2536980425498405 -0.46382002276927525 14.441964377513065 0.1657092533769018 0.03694686596283513 -0.5203849464554426 42.743246117510395 diff --git a/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile_polar-results.tab b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile_polar-results.tab new file mode 100644 index 000000000..c4c2a91c6 --- /dev/null +++ b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile_polar-results.tab @@ -0,0 +1,19 @@ +1697.131066748047 1693.2739506872558 1689.416834626465 1685.5597185656738 1681.702602504883 1677.8454864440919 1673.9883703833011 1670.13125432251 1666.2741382617191 1662.417022200928 1658.5599061401367 1654.702790079346 1650.8456740185547 1646.988557957764 1643.1314418969728 1639.274325836182 1635.4172097753908 1631.5600937145996 1627.7029776538088 1623.8458615930176 1619.9887455322269 1616.1316294714356 1612.2745134106449 1608.4173973498537 1604.5602812890625 1600.7031652282717 1596.8460491674805 1592.9889331066897 1589.1318170458985 1585.2747009851078 1581.4175849243165 1577.5604688635258 1573.7033528027346 1569.8462367419434 1565.9891206811526 1562.1320046203614 1558.2748885595706 1554.4177724987794 1550.5606564379887 1546.7035403771974 1542.8464243164062 1538.9893082556155 1535.1321921948243 1531.2750761340335 1527.4179600732423 1523.5608440124515 1519.7037279516603 1515.846611890869 1511.9894958300783 1508.1323797692871 1504.2752637084964 1500.4181476477052 1496.5610315869144 1492.7039155261232 1488.8467994653324 1484.9896834045412 1481.13256734375 1477.2754512829592 1473.418335222168 1469.5612191613773 1465.704103100586 1461.8469870397953 1457.989870979004 1454.1327549182129 1450.275638857422 1446.418522796631 1442.5614067358401 1438.704290675049 1434.8471746142582 1430.990058553467 1427.1329424926757 1423.275826431885 1419.4187103710938 1415.561594310303 1411.7044782495118 1407.847362188721 1403.9902461279298 1400.133130067139 1396.2760140063479 1392.4188979455566 1388.5617818847659 1384.7046658239747 1380.847549763184 1376.9904337023927 1373.133317641602 1369.2762015808107 1365.4190855200195 1361.5619694592287 1357.7048533984375 1353.8477373376468 1349.9906212768556 1346.1335052160648 1342.2763891552736 1338.4192730944824 1334.5621570336916 1330.7050409729004 1326.8479249121096 1322.9908088513184 1319.1336927905277 1315.2765767297365 1311.4194606689457 1307.5623446081545 1303.7052285473633 1299.8481124865725 1295.9909964257813 1292.1338803649905 1288.2767643041993 1284.4196482434086 1280.5625321826174 1276.7054161218261 1272.8483000610354 1268.9911840002442 1265.1340679394534 1261.2769518786622 1257.4198358178714 1253.5627197570802 1249.705603696289 1245.8484876354983 1241.991371574707 1238.1342555139163 1234.277139453125 1230.4200233923343 1226.562907331543 1222.7057912707523 1218.8486752099611 1214.99155914917 1211.1344430883792 1207.277327027588 1203.4202109667972 map_x map_y Filename 1214.0 - 1258.0 1500.0 - 1580.0 Polarisation Angle Azimuth Angle (1214.0 - 1258.0) Hermans Orientation Function (1214.0 - 1258.0) Intensity (1214.0 - 1258.0) Amplitude (1214.0 - 1258.0) R-squared (1214.0 - 1258.0) Azimuth Angle (1500.0 - 1580.0) Hermans Orientation Function (1500.0 - 1580.0) Intensity (1500.0 - 1580.0) Amplitude (1500.0 - 1580.0) R-squared (1500.0 - 1580.0) +continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous F:/DATA/0deg F:/DATA/45deg F:/DATA/90deg F:/DATA/135deg continuous continuous 0.0\ Degrees 45.0\ Degrees 90.0\ Degrees 135.0\ Degrees continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous + meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta +0.3711118698120117 0.43782272934913635 0.49062955379486084 0.5547452569007874 0.6374028921127319 0.711500346660614 0.7876919507980347 0.8770861625671387 0.9559172987937927 1.0098530054092407 1.0404753684997559 1.0543735027313232 1.0619465112686157 1.0437582731246948 1.0013220310211182 0.9536964297294617 0.897933840751648 0.8533709645271301 0.8181004524230957 0.7584443688392639 0.6689296364784241 0.5782220363616943 0.513115644454956 0.46961721777915955 0.43171659111976624 0.3991532325744629 0.3810955286026001 0.37965840101242065 0.386007159948349 0.3947145342826843 0.4098324477672577 0.4343760311603546 0.46137940883636475 0.49168214201927185 0.528336226940155 0.5667646527290344 0.6178287267684937 0.6604256629943848 0.6766932010650635 0.6885275840759277 0.6986993551254272 0.6930281519889832 0.6724157929420471 0.6501829028129578 0.6263569593429565 0.5885990858078003 0.5376056432723999 0.5005533695220947 0.4779326319694519 0.4443279504776001 0.39699268341064453 0.36137861013412476 0.33436083793640137 0.30747178196907043 0.2803654670715332 0.2625480592250824 0.2592535614967346 0.27015992999076843 0.29309216141700745 0.31150364875793457 0.3194276988506317 0.328142374753952 0.3443129062652588 0.35353028774261475 0.3476772606372833 0.33774372935295105 0.32855379581451416 0.3200712502002716 0.31163617968559265 0.3032289445400238 0.2943628430366516 0.28816357254981995 0.2909632623195648 0.29872336983680725 0.3025616407394409 0.3057458698749542 0.3115512728691101 0.31618112325668335 0.3176253139972687 0.3175846040248871 0.3153497576713562 0.3088831901550293 0.3000914454460144 0.29377707839012146 0.2888909578323364 0.28027477860450745 0.270122230052948 0.26286780834198 0.2575746774673462 0.2533765435218811 0.2540722191333771 0.26083439588546753 0.2694004774093628 0.27414125204086304 0.2728372812271118 0.26937466859817505 0.2672775387763977 0.2684006989002228 0.2723020315170288 0.27508431673049927 0.2749064266681671 0.274681955575943 0.2775912284851074 0.28367695212364197 0.2893185019493103 0.290900319814682 0.2906703054904938 0.2926110625267029 0.2950325608253479 0.2977401614189148 0.3037301301956177 0.3114270567893982 0.318378210067749 0.32530495524406433 0.3349395990371704 0.3490666151046753 0.3638021945953369 0.3744945526123047 0.3803212642669678 0.3803481459617615 0.37394478917121887 0.3625723719596863 0.34696418046951294 0.3287803828716278 0.31259098649024963 0.3022864758968353 0.2975075840950012 0.2938818633556366 0.2872605323791504 30442.5687 41538.7379 F:/DATA/0deg 15.009961445779307 43.87936019111817 0.0 Degrees -76.38857262236182 0.004631214554422166 30.204593279869965 0.2093411760614958 0.9998996542510169 -20.289596380815063 0.003978761893197851 87.74938322748216 0.5226610812091969 0.4761749412326489 +0.388348788022995 0.44867801666259766 0.502106249332428 0.5762503743171692 0.6664558053016663 0.739630937576294 0.8222108483314514 0.9173783659934998 0.9785887002944946 1.0107851028442383 1.0361779928207397 1.0637257099151611 1.0711760520935059 1.0423812866210938 1.025393009185791 0.9986843466758728 0.9373337626457214 0.8785869479179382 0.8271448612213135 0.7655133605003357 0.6908860802650452 0.6117749810218811 0.5471857190132141 0.4971246123313904 0.45541316270828247 0.42525458335876465 0.4062337279319763 0.39754077792167664 0.39981767535209656 0.41045162081718445 0.42612242698669434 0.4495392143726349 0.48013657331466675 0.509360134601593 0.5352477431297302 0.5706249475479126 0.6430520415306091 0.7104148864746094 0.7287077903747559 0.7300795912742615 0.7207353115081787 0.6928030848503113 0.6642997860908508 0.6465807557106018 0.6357985734939575 0.6169293522834778 0.5714240670204163 0.5247028470039368 0.49503496289253235 0.4588204622268677 0.41067439317703247 0.37448638677597046 0.34704023599624634 0.32218214869499207 0.29583585262298584 0.27490201592445374 0.26934197545051575 0.28096309304237366 0.3069058060646057 0.3270772397518158 0.33470597863197327 0.34152284264564514 0.35194724798202515 0.3573232889175415 0.3541431128978729 0.34866204857826233 0.3427005112171173 0.3312859833240509 0.3122206926345825 0.2955722510814667 0.2872144877910614 0.2867285907268524 0.2918354272842407 0.2956002652645111 0.2986833155155182 0.3060479462146759 0.31676867604255676 0.3262639045715332 0.330106645822525 0.32593291997909546 0.31699928641319275 0.30795541405677795 0.3018266558647156 0.29686442017555237 0.28721868991851807 0.2752007842063904 0.2667289972305298 0.2609139084815979 0.25778260827064514 0.2584190368652344 0.2610763907432556 0.2639258801937103 0.26595649123191833 0.26701226830482483 0.2679225206375122 0.2679891288280487 0.2669326663017273 0.2678163945674896 0.2720436155796051 0.2770630121231079 0.28001782298088074 0.27851158380508423 0.2751752436161041 0.276258647441864 0.2823660373687744 0.2899717390537262 0.29827389121055603 0.30697736144065857 0.3102128207683563 0.30654236674308777 0.30582261085510254 0.3128655254840851 0.3222534656524658 0.32939496636390686 0.33602944016456604 0.34821176528930664 0.3637096881866455 0.37178686261177063 0.3715791702270508 0.37046146392822266 0.36934414505958557 0.36342424154281616 0.350017786026001 0.33207470178604126 0.3140036165714264 0.2998875081539154 0.29220956563949585 0.2874009907245636 0.2815419137477875 30445.38885 41538.7379 F:/DATA/0deg 14.936959331411803 45.349811063094954 0.0 Degrees -81.76750236979787 0.017942087761759287 30.49926270974143 0.8135324371187873 0.9324530395726834 -61.4210730982497 0.011894554755490427 90.06882647010134 1.5974921533722033 0.36275784996581106 +0.366887629032135 0.43671754002571106 0.49220016598701477 0.5703327059745789 0.6657547950744629 0.731933057308197 0.7937033176422119 0.8747525215148926 0.9398021697998047 0.9730452299118042 1.0031681060791016 1.0538406372070312 1.0965853929519653 1.0494016408920288 0.9825043678283691 0.9511120319366455 0.9302560687065125 0.8842418789863586 0.8129315972328186 0.7183979153633118 0.6205475330352783 0.5415375232696533 0.48775240778923035 0.44761666655540466 0.41458284854888916 0.39335882663726807 0.3796997666358948 0.36864838004112244 0.36498430371284485 0.3680277466773987 0.3732655644416809 0.38918817043304443 0.42386338114738464 0.46311137080192566 0.4917769134044647 0.5237820148468018 0.5971131920814514 0.6691277027130127 0.6892750859260559 0.7003340125083923 0.7168111801147461 0.6999649405479431 0.6541981101036072 0.6189929246902466 0.5926592946052551 0.5696735382080078 0.5413363575935364 0.5053853988647461 0.465243935585022 0.41113007068634033 0.36086025834083557 0.32808783650398254 0.3003191649913788 0.2793380916118622 0.26471295952796936 0.2541550099849701 0.24993854761123657 0.25305330753326416 0.2655698359012604 0.27899375557899475 0.2841063439846039 0.28888702392578125 0.30285078287124634 0.3161625862121582 0.3197145164012909 0.3178388774394989 0.31100529432296753 0.29754751920700073 0.28191861510276794 0.2750825583934784 0.27559351921081543 0.27823397517204285 0.2830919921398163 0.2850538194179535 0.2825995981693268 0.28359857201576233 0.2883332371711731 0.289949893951416 0.2929544150829315 0.30135759711265564 0.30265331268310547 0.2906714677810669 0.2753030061721802 0.2651992440223694 0.25924843549728394 0.25318726897239685 0.24550479650497437 0.23828820884227753 0.23315896093845367 0.23029816150665283 0.2334306240081787 0.24293583631515503 0.2510787546634674 0.25073981285095215 0.24615781009197235 0.2464907467365265 0.2522513270378113 0.2587389051914215 0.262591689825058 0.263126403093338 0.26156532764434814 0.2589862048625946 0.2572213411331177 0.2594248950481415 0.2655974328517914 0.27193424105644226 0.27772676944732666 0.28423818945884705 0.28888431191444397 0.29118603467941284 0.2921951413154602 0.29164180159568787 0.2948339283466339 0.3066503405570984 0.32164159417152405 0.333238422870636 0.34339842200279236 0.355623722076416 0.36564287543296814 0.36494630575180054 0.35201695561408997 0.3341171145439148 0.3175579309463501 0.30399125814437866 0.2928829789161682 0.28347793221473694 0.2780621647834778 0.276618093252182 0.27352389693260193 30442.5687 41541.616519999996 F:/DATA/0deg 14.140093941838566 42.63377488797279 0.0 Degrees -58.74617564278722 0.012249198283408431 28.641297420407064 0.5230459500184083 0.9052486894719146 -31.249461838574835 0.010471285030812348 83.8267974762999 1.3098037700862717 0.5510780301748821 +0.36428871750831604 0.43003931641578674 0.47958770394325256 0.5450240969657898 0.634536862373352 0.7099695801734924 0.7796786427497864 0.8637834787368774 0.942089855670929 0.9903811812400818 1.0105667114257812 1.0208871364593506 1.005222201347351 0.963545024394989 0.9371297359466553 0.9139838814735413 0.8946059942245483 0.8827653527259827 0.840722918510437 0.7564958333969116 0.6611053943634033 0.5774503946304321 0.5202354192733765 0.48433250188827515 0.45376747846603394 0.4260224401950836 0.4059300422668457 0.3930695950984955 0.38632991909980774 0.3889123797416687 0.4001465141773224 0.4183931052684784 0.4428093135356903 0.47215187549591064 0.5050704479217529 0.5453080534934998 0.6085248589515686 0.658994734287262 0.668915331363678 0.6675289869308472 0.6717699766159058 0.6808158755302429 0.6681414842605591 0.6372467875480652 0.6000738739967346 0.5683797597885132 0.544323742389679 0.516345202922821 0.48224183917045593 0.4387160539627075 0.39499184489250183 0.3595888912677765 0.3304763436317444 0.3092094361782074 0.28860795497894287 0.26972246170043945 0.2605076730251312 0.26343077421188354 0.28140151500701904 0.29994896054267883 0.30823972821235657 0.31485551595687866 0.32437241077423096 0.33080095052719116 0.3303925395011902 0.3248642385005951 0.3165438175201416 0.3061983585357666 0.2946605384349823 0.2872968912124634 0.2868692874908447 0.2896806299686432 0.2909656763076782 0.2920180857181549 0.2945660948753357 0.2972028851509094 0.29964983463287354 0.3004482090473175 0.29766783118247986 0.2939799129962921 0.2927486002445221 0.2923987805843353 0.2889113426208496 0.2816716730594635 0.27281782031059265 0.2626931965351105 0.2514967918395996 0.24271203577518463 0.23827271163463593 0.23637256026268005 0.2380509227514267 0.24506837129592896 0.25348952412605286 0.25623422861099243 0.25412917137145996 0.2532842457294464 0.2547925114631653 0.2577175199985504 0.26068350672721863 0.2616606056690216 0.2597542703151703 0.2559884488582611 0.2536808252334595 0.256541907787323 0.2641761898994446 0.271513968706131 0.2755036950111389 0.27728980779647827 0.27779620885849 0.27858373522758484 0.28195881843566895 0.28836870193481445 0.29790475964546204 0.3091188371181488 0.317819207906723 0.3241935074329376 0.33264613151550293 0.3433806300163269 0.3505949378013611 0.35062962770462036 0.34647127985954285 0.3387751281261444 0.32535696029663086 0.3086860477924347 0.2940033972263336 0.2858646810054779 0.2827148139476776 0.2769644856452942 0.26818761229515076 30445.38885 41541.616519999996 F:/DATA/0deg 13.949567230311496 43.05058779046659 0.0 Degrees -75.66121752117968 0.024705796952298773 28.883928755026126 1.0573395108768266 0.9941901147353087 -87.96943280855872 0.008170118041294187 85.4864922350208 1.0433897898712823 0.1657092533769018 +0.3773364722728729 0.43966636061668396 0.49002042412757874 0.5639562606811523 0.6609355807304382 0.7364853620529175 0.8136956691741943 0.8985644578933716 0.9468745589256287 0.9731678366661072 0.9914941191673279 0.9854417443275452 0.9628058671951294 0.9528713226318359 0.9546505808830261 0.9532977342605591 0.9257292151451111 0.8693946599960327 0.8010186553001404 0.7217180728912354 0.6436004638671875 0.5754334926605225 0.5214712619781494 0.47915247082710266 0.4447232484817505 0.41765138506889343 0.3990515470504761 0.39321616291999817 0.39747321605682373 0.40612584352493286 0.4184291958808899 0.43992483615875244 0.47834911942481995 0.5266345739364624 0.5672381520271301 0.597634494304657 0.6348262429237366 0.6744903922080994 0.6967960000038147 0.7098262310028076 0.7118614912033081 0.6856943368911743 0.6489338874816895 0.6190053224563599 0.5941586494445801 0.5711410641670227 0.5421783328056335 0.5111346244812012 0.4810764491558075 0.4355677664279938 0.3860788941383362 0.3534643054008484 0.32750168442726135 0.3032616674900055 0.2819446921348572 0.26981374621391296 0.2693929970264435 0.2801830768585205 0.30366891622543335 0.3256083130836487 0.3365386128425598 0.34310561418533325 0.35129883885383606 0.3588528633117676 0.35683950781822205 0.3458286225795746 0.33076736330986023 0.31613433361053467 0.30460110306739807 0.2960743308067322 0.2915134131908417 0.29322516918182373 0.2980576753616333 0.300569623708725 0.3029937744140625 0.3091799318790436 0.3191257119178772 0.32923704385757446 0.3315645456314087 0.3225858509540558 0.31236401200294495 0.3056598901748657 0.2981754243373871 0.2894536256790161 0.2814278304576874 0.2723696827888489 0.26151928305625916 0.2525339126586914 0.25026053190231323 0.2539668083190918 0.25997182726860046 0.26598429679870605 0.27031874656677246 0.27086934447288513 0.2690020799636841 0.26832443475723267 0.2695266008377075 0.2705895006656647 0.2702696919441223 0.27155083417892456 0.2761310338973999 0.28070759773254395 0.2832408547401428 0.2835163474082947 0.28365248441696167 0.2872329354286194 0.29273301362991333 0.29702767729759216 0.2998993694782257 0.30078554153442383 0.3016831874847412 0.30665796995162964 0.31462526321411133 0.32313990592956543 0.3358403742313385 0.3547256886959076 0.3718043267726898 0.3799355626106262 0.3825741112232208 0.383433073759079 0.3778041899204254 0.3644450008869171 0.3474675118923187 0.3291182518005371 0.3145691752433777 0.3077240586280823 0.3049233853816986 0.3022094964981079 0.2970089614391327 30442.5687 41538.7379 F:/DATA/45deg 15.14943703154183 44.23850067435577 45.0 Degrees -76.38857262236182 0.004631214554422166 30.204593279869965 0.2093411760614958 0.9998996542510169 -20.289596380815063 0.003978761893197851 87.74938322748216 0.5226610812091969 0.4761749412326489 +0.37337228655815125 0.4396507143974304 0.49107563495635986 0.5586245059967041 0.646790623664856 0.7179062962532043 0.7848191857337952 0.8587467670440674 0.9132012128829956 0.9501560926437378 0.9785140156745911 0.984795868396759 0.9518576860427856 0.9169514179229736 0.9128903150558472 0.9190047979354858 0.9011522531509399 0.8552564978599548 0.7962431311607361 0.7195406556129456 0.6405887007713318 0.5768947005271912 0.5284963250160217 0.48475223779678345 0.44452735781669617 0.4175184965133667 0.4050688147544861 0.4015383720397949 0.4035366475582123 0.4095524847507477 0.41840967535972595 0.43762996792793274 0.4735090136528015 0.5144422650337219 0.5498296618461609 0.5891739130020142 0.6544406414031982 0.7074301838874817 0.721211850643158 0.7253494262695312 0.7205705046653748 0.7011243104934692 0.6794993877410889 0.6561350226402283 0.6234012842178345 0.5791003108024597 0.5371192693710327 0.5127407312393188 0.48728594183921814 0.43710267543792725 0.3880417048931122 0.358508825302124 0.3291686475276947 0.30198532342910767 0.2838975191116333 0.2756803035736084 0.27510562539100647 0.28265753388404846 0.30272212624549866 0.3223998248577118 0.3314470052719116 0.3400789797306061 0.3539663255214691 0.3615642189979553 0.35621216893196106 0.34422820806503296 0.33036601543426514 0.3164904713630676 0.30386441946029663 0.29513826966285706 0.2911766767501831 0.2941439151763916 0.302760511636734 0.30998602509498596 0.31750985980033875 0.32691699266433716 0.33109205961227417 0.3281230330467224 0.32525792717933655 0.32315510511398315 0.3174678683280945 0.31104981899261475 0.3055250942707062 0.297789067029953 0.28920844197273254 0.28300905227661133 0.27708175778388977 0.27133673429489136 0.26787322759628296 0.2659844756126404 0.26673445105552673 0.2708447575569153 0.2750791013240814 0.2769821286201477 0.2775936722755432 0.278523713350296 0.2802591919898987 0.2821207642555237 0.282520055770874 0.28267189860343933 0.2840110957622528 0.28552529215812683 0.28797078132629395 0.2903944253921509 0.29174160957336426 0.2954663932323456 0.30151888728141785 0.30476686358451843 0.30412399768829346 0.30343693494796753 0.30575087666511536 0.31121543049812317 0.3187049329280853 0.3290562331676483 0.3425249457359314 0.3562610149383545 0.36918962001800537 0.3792024254798889 0.3837013840675354 0.3848077654838562 0.3821556568145752 0.3716545104980469 0.3544897437095642 0.33635222911834717 0.3203563988208771 0.30804407596588135 0.3005572259426117 0.2961486577987671 0.29254403710365295 30445.38885 41538.7379 F:/DATA/45deg 15.287506938801155 44.956915156436416 45.0 Degrees -81.76750236979787 0.017942087761759287 30.49926270974143 0.8135324371187873 0.9324530395726834 -61.4210730982497 0.011894554755490427 90.06882647010134 1.5974921533722033 0.36275784996581106 +0.38911929726600647 0.44554373621940613 0.4855414927005768 0.5539154410362244 0.6538650989532471 0.7315957546234131 0.8033648729324341 0.884945809841156 0.9360079765319824 0.954917311668396 0.9649530649185181 0.9849116206169128 1.008013129234314 0.9807816743850708 0.9428510069847107 0.9156916737556458 0.8764055967330933 0.825237512588501 0.7735792994499207 0.705725371837616 0.6241020560264587 0.5504984855651855 0.4957604706287384 0.45222288370132446 0.41255465149879456 0.3828220069408417 0.37051448225975037 0.37108558416366577 0.37338513135910034 0.37661170959472656 0.3874439001083374 0.41331085562705994 0.449747771024704 0.47858643531799316 0.4993457794189453 0.5276702642440796 0.5828417539596558 0.6414362788200378 0.6703454852104187 0.6750879287719727 0.6613235473632812 0.6516115069389343 0.6429095268249512 0.6263266801834106 0.6048684120178223 0.5731279253959656 0.5306711196899414 0.492236465215683 0.45757782459259033 0.40995675325393677 0.3611593246459961 0.33053696155548096 0.3058626651763916 0.2824017405509949 0.2620924711227417 0.24882546067237854 0.24321754276752472 0.24622128903865814 0.2659408152103424 0.29050007462501526 0.3000190854072571 0.30213284492492676 0.3106580674648285 0.3247032165527344 0.3296380937099457 0.3233187794685364 0.3104628324508667 0.29432252049446106 0.2806641161441803 0.2753435969352722 0.2728271782398224 0.270643025636673 0.2736828327178955 0.2805771827697754 0.28472232818603516 0.2870364487171173 0.2909660339355469 0.29421940445899963 0.2940268814563751 0.29415833950042725 0.2929386496543884 0.2845102548599243 0.27148693799972534 0.26009973883628845 0.25316986441612244 0.25014013051986694 0.24763965606689453 0.24328280985355377 0.24036899209022522 0.2429419606924057 0.24842298030853271 0.25228366255760193 0.25561103224754333 0.25914180278778076 0.25783947110176086 0.253574401140213 0.2532463073730469 0.25550371408462524 0.2551080286502838 0.2552626430988312 0.2603242099285126 0.2648930549621582 0.26599374413490295 0.26791733503341675 0.27033597230911255 0.27200937271118164 0.27633726596832275 0.281934916973114 0.28416839241981506 0.2850780189037323 0.28886574506759644 0.29535502195358276 0.30392923951148987 0.3146568834781647 0.3258497714996338 0.3378189206123352 0.3510323464870453 0.3626718819141388 0.3707166612148285 0.37344253063201904 0.3687247931957245 0.3559401333332062 0.336141973733902 0.31635063886642456 0.30404531955718994 0.2972669005393982 0.29117393493652344 0.28547903895378113 0.2802625894546509 30442.5687 41541.616519999996 F:/DATA/45deg 14.612466406432896 42.07633292374312 45.0 Degrees -58.74617564278722 0.012249198283408431 28.641297420407064 0.5230459500184083 0.9052486894719146 -31.249461838574835 0.010471285030812348 83.8267974762999 1.3098037700862717 0.5510780301748821 +0.34738847613334656 0.4179860055446625 0.4664291739463806 0.5296632647514343 0.6272340416908264 0.7056167125701904 0.7561516165733337 0.8085007667541504 0.8644552826881409 0.9050332307815552 0.9181493520736694 0.9111636281013489 0.9073537588119507 0.9109403491020203 0.9062535762786865 0.8872991800308228 0.8642696738243103 0.8446381688117981 0.8067254424095154 0.7335556745529175 0.6443662047386169 0.5644205808639526 0.506117045879364 0.467324823141098 0.43990078568458557 0.4194169044494629 0.4045620858669281 0.39635950326919556 0.3957340121269226 0.40181082487106323 0.4117859899997711 0.4274001121520996 0.4520021080970764 0.48187950253486633 0.5073687434196472 0.5298813581466675 0.5784440636634827 0.6448124051094055 0.6777898669242859 0.6767211556434631 0.648645281791687 0.6306580901145935 0.6294295191764832 0.6141109466552734 0.586581289768219 0.5592874884605408 0.5341745018959045 0.5011913180351257 0.4583965539932251 0.4066646993160248 0.3704123795032501 0.3489791750907898 0.3235110640525818 0.29798153042793274 0.2787266969680786 0.26791489124298096 0.2635549306869507 0.2648940086364746 0.2800384759902954 0.30330970883369446 0.3163895010948181 0.31783244013786316 0.3187214732170105 0.3288123607635498 0.33496859669685364 0.3315340280532837 0.32235997915267944 0.30760458111763 0.289726585149765 0.27839016914367676 0.2739510238170624 0.272896945476532 0.27768412232398987 0.286607027053833 0.29376494884490967 0.30020976066589355 0.3059932589530945 0.30805355310440063 0.3080996572971344 0.30983278155326843 0.30988332629203796 0.3039196729660034 0.29341766238212585 0.28149351477622986 0.2707284390926361 0.2622477412223816 0.25400418043136597 0.2478829324245453 0.2490083873271942 0.2554311156272888 0.26148200035095215 0.26385727524757385 0.26382210850715637 0.26387882232666016 0.26245152950286865 0.26000332832336426 0.2600518763065338 0.2617824673652649 0.26309698820114136 0.26552656292915344 0.2700032591819763 0.2736172676086426 0.2747006118297577 0.2754264175891876 0.2767968773841858 0.2779064476490021 0.279891699552536 0.284357488155365 0.28945451974868774 0.2933834195137024 0.2966553568840027 0.2989789843559265 0.30280598998069763 0.31150293350219727 0.32365909218788147 0.33813759684562683 0.35394054651260376 0.3676077127456665 0.376840740442276 0.3798968195915222 0.37367281317710876 0.3576556146144867 0.3369816541671753 0.31849825382232666 0.30471497774124146 0.29529136419296265 0.2896086275577545 0.2846777141094208 0.2775256037712097 30445.38885 41541.616519999996 F:/DATA/45deg 14.724239544441382 41.95246636406159 45.0 Degrees -75.66121752117968 0.024705796952298773 28.883928755026126 1.0573395108768266 0.9941901147353087 -87.96943280855872 0.008170118041294187 85.4864922350208 1.0433897898712823 0.1657092533769018 +0.36890196800231934 0.4383719861507416 0.49215278029441833 0.5678848028182983 0.6697624325752258 0.7421551942825317 0.7949410080909729 0.861175537109375 0.9304823279380798 0.9888854622840881 1.0296154022216797 1.0200906991958618 0.9658761620521545 0.9375912547111511 0.9355541467666626 0.9351963996887207 0.9119044542312622 0.8633236289024353 0.8102912902832031 0.7478935718536377 0.6693353056907654 0.5896985530853271 0.5278323888778687 0.47969499230384827 0.4415580630302429 0.4171638786792755 0.40274444222450256 0.3934766352176666 0.3904435634613037 0.39783647656440735 0.41653168201446533 0.4471336603164673 0.4835716187953949 0.5180643796920776 0.5542099475860596 0.5966129302978516 0.6491007804870605 0.6811864972114563 0.6899703741073608 0.6939358711242676 0.6857684850692749 0.6570229530334473 0.6270668506622314 0.6001116633415222 0.5694991946220398 0.5400396585464478 0.5212351679801941 0.5054466128349304 0.4800109267234802 0.4332926869392395 0.38531044125556946 0.35653600096702576 0.33400747179985046 0.3157062530517578 0.3017118573188782 0.29292401671409607 0.2914346158504486 0.2968195676803589 0.3123685419559479 0.3298073410987854 0.3378491699695587 0.3447093665599823 0.35713934898376465 0.36121153831481934 0.354942262172699 0.35000061988830566 0.34591320157051086 0.3377359211444855 0.32351627945899963 0.3089088499546051 0.299715518951416 0.29520851373672485 0.29720360040664673 0.3091683089733124 0.3235648274421692 0.3309069871902466 0.3311137557029724 0.3341479003429413 0.3409155011177063 0.3392958343029022 0.32886332273483276 0.318060964345932 0.31203606724739075 0.30700525641441345 0.2969604432582855 0.2861284911632538 0.2785927355289459 0.27391406893730164 0.2739171087741852 0.27796828746795654 0.2818444073200226 0.28413259983062744 0.28639599680900574 0.28605619072914124 0.28013235330581665 0.27383479475975037 0.27307555079460144 0.27768054604530334 0.2847695052623749 0.29085657000541687 0.28964218497276306 0.2820451259613037 0.2783108055591583 0.28211650252342224 0.28757697343826294 0.2919096350669861 0.2974321246147156 0.30412620306015015 0.3101852238178253 0.31293031573295593 0.31173041462898254 0.31200647354125977 0.31643787026405334 0.3226405680179596 0.33135539293289185 0.3442952632904053 0.3607310354709625 0.37769126892089844 0.38771292567253113 0.3854190707206726 0.37552234530448914 0.36437416076660156 0.35301434993743896 0.34029337763786316 0.3268333971500397 0.31639185547828674 0.31317082047462463 0.31620898842811584 0.31643491983413696 30442.5687 41538.7379 F:/DATA/90deg 15.196114730939069 43.482395133432554 90.0 Degrees -76.38857262236182 0.004631214554422166 30.204593279869965 0.2093411760614958 0.9998996542510169 -20.289596380815063 0.003978761893197851 87.74938322748216 0.5226610812091969 0.4761749412326489 +0.37875914573669434 0.4469207227230072 0.49604201316833496 0.5680999159812927 0.6705905199050903 0.7483171224594116 0.80452561378479 0.8658115863800049 0.9279407262802124 0.9807824492454529 1.0223487615585327 1.0514615774154663 1.0463922023773193 1.0112226009368896 0.9982134103775024 1.004634141921997 0.9877952933311462 0.9317412972450256 0.8688726425170898 0.791929304599762 0.6982804536819458 0.6116718649864197 0.5463566184043884 0.4956464171409607 0.4562545120716095 0.43035486340522766 0.41308432817459106 0.4023517668247223 0.40038397908210754 0.4071796238422394 0.4212566614151001 0.44529813528060913 0.47869226336479187 0.5134111642837524 0.5476288199424744 0.5924862027168274 0.6646744608879089 0.7205690741539001 0.7406251430511475 0.7573677897453308 0.7730262279510498 0.7530763149261475 0.701831042766571 0.6527606844902039 0.6117518544197083 0.5808829665184021 0.5582142472267151 0.5362958312034607 0.5081617832183838 0.4623250961303711 0.41480353474617004 0.3816410005092621 0.3512253761291504 0.3229435384273529 0.30036529898643494 0.28829801082611084 0.28772664070129395 0.29815641045570374 0.31810328364372253 0.33310839533805847 0.34295332431793213 0.3576355576515198 0.37281879782676697 0.37368515133857727 0.36629509925842285 0.3603748083114624 0.35585665702819824 0.3474416136741638 0.33159855008125305 0.31616654992103577 0.3076492249965668 0.307073712348938 0.3140259385108948 0.3209126889705658 0.3253902792930603 0.3307969272136688 0.3362623155117035 0.34198322892189026 0.3472789525985718 0.3470509350299835 0.3400651216506958 0.3291180729866028 0.31915709376335144 0.3109745383262634 0.3023119568824768 0.2948138117790222 0.28782516717910767 0.27949029207229614 0.2736770212650299 0.2739221751689911 0.27921369671821594 0.2852224111557007 0.2887378931045532 0.2893288731575012 0.28667038679122925 0.2830811142921448 0.28239449858665466 0.28517019748687744 0.28917649388313293 0.2914784848690033 0.2913095951080322 0.2914259135723114 0.29324576258659363 0.2956298291683197 0.2981545031070709 0.3011481463909149 0.3054879605770111 0.3107515871524811 0.31411612033843994 0.31555652618408203 0.3172118663787842 0.31911471486091614 0.32280173897743225 0.33204859495162964 0.3453712463378906 0.357761949300766 0.3699503242969513 0.38311585783958435 0.39259737730026245 0.395723819732666 0.39234602451324463 0.38097503781318665 0.3659316301345825 0.3534175157546997 0.34347930550575256 0.33371132612228394 0.3236602544784546 0.3152346611022949 0.30779775977134705 30445.38885 41538.7379 F:/DATA/90deg 15.717131304491499 46.21617319326819 90.0 Degrees -81.76750236979787 0.017942087761759287 30.49926270974143 0.8135324371187873 0.9324530395726834 -61.4210730982497 0.011894554755490427 90.06882647010134 1.5974921533722033 0.36275784996581106 +0.3608156144618988 0.4259406626224518 0.47818616032600403 0.5471063256263733 0.6347803473472595 0.7001804113388062 0.7520433068275452 0.8171277642250061 0.8950353264808655 0.9654224514961243 1.013027548789978 1.0263880491256714 0.9852103590965271 0.941172182559967 0.931695818901062 0.9181087017059326 0.8757404685020447 0.8307337164878845 0.7877539992332458 0.7257715463638306 0.6523596048355103 0.5768492817878723 0.5085425972938538 0.456727534532547 0.4192277491092682 0.3939008414745331 0.3818787932395935 0.3828960657119751 0.389323353767395 0.39450258016586304 0.39829221367836 0.40605780482292175 0.4275314211845398 0.4643791615962982 0.505535900592804 0.5479178428649902 0.5994552969932556 0.6376073360443115 0.6582133769989014 0.6799547672271729 0.6931027770042419 0.6702796816825867 0.6343024969100952 0.6056128144264221 0.5789087414741516 0.5561301112174988 0.53394615650177 0.4996113181114197 0.4577721953392029 0.4083678126335144 0.36549386382102966 0.3386378884315491 0.3173430263996124 0.2995651960372925 0.2844037711620331 0.27193325757980347 0.26600706577301025 0.2700923979282379 0.2851560115814209 0.30088505148887634 0.3138630986213684 0.3285767436027527 0.3413139879703522 0.3445935547351837 0.3396775424480438 0.330121785402298 0.3199063241481781 0.30752673745155334 0.2904285490512848 0.27791693806648254 0.2726101279258728 0.27176886796951294 0.2783729135990143 0.2872854471206665 0.29147452116012573 0.29573073983192444 0.30301201343536377 0.3096592128276825 0.3131972551345825 0.31535086035728455 0.3140628933906555 0.3053463399410248 0.2954469323158264 0.2890409231185913 0.280372679233551 0.2706373333930969 0.2643801271915436 0.25798389315605164 0.2508365511894226 0.24706313014030457 0.2483857423067093 0.25367772579193115 0.2591390609741211 0.26199933886528015 0.2643854320049286 0.2681591808795929 0.2714567184448242 0.27293530106544495 0.2729243338108063 0.27181246876716614 0.27032458782196045 0.2693708539009094 0.26829567551612854 0.2665247321128845 0.2669430077075958 0.271585613489151 0.2774175703525543 0.28121861815452576 0.2841823399066925 0.28875136375427246 0.2948462665081024 0.3012498915195465 0.30834972858428955 0.3174125552177429 0.3262895941734314 0.33198782801628113 0.3391663730144501 0.35144802927970886 0.3615659177303314 0.3633808195590973 0.3589021563529968 0.3500611186027527 0.33608290553092957 0.3192422091960907 0.30552980303764343 0.29612672328948975 0.2880210280418396 0.2813362777233124 0.2759957015514374 30442.5687 41541.616519999996 F:/DATA/90deg 14.381547746983568 42.02895298858711 90.0 Degrees -58.74617564278722 0.012249198283408431 28.641297420407064 0.5230459500184083 0.9052486894719146 -31.249461838574835 0.010471285030812348 83.8267974762999 1.3098037700862717 0.5510780301748821 +0.3729221224784851 0.44012895226478577 0.4914250373840332 0.5655630230903625 0.6647416949272156 0.7444058060646057 0.8126416206359863 0.8799846172332764 0.9443001747131348 0.9979190826416016 1.0210847854614258 1.0208030939102173 1.0111762285232544 0.992798924446106 0.9904224276542664 0.99041348695755 0.9595239162445068 0.908574640750885 0.846463143825531 0.7647848725318909 0.6809067726135254 0.6017272472381592 0.5331747531890869 0.48201125860214233 0.44443103671073914 0.41660502552986145 0.3969760835170746 0.38763803243637085 0.38977357745170593 0.4000709354877472 0.41259172558784485 0.4278537333011627 0.45189592242240906 0.48642393946647644 0.5247828960418701 0.5645804405212402 0.612518310546875 0.6483836770057678 0.6727944016456604 0.7076162695884705 0.7434014678001404 0.7206994891166687 0.6666464805603027 0.63228839635849 0.608867883682251 0.5807878971099854 0.5441436171531677 0.5172581076622009 0.4963454604148865 0.45485949516296387 0.401254266500473 0.36339372396469116 0.3367786109447479 0.31736981868743896 0.29844656586647034 0.28279122710227966 0.27746984362602234 0.2811555564403534 0.2927308678627014 0.3071295917034149 0.3210527002811432 0.33639973402023315 0.3501872718334198 0.3525633215904236 0.34586936235427856 0.33730486035346985 0.3312234878540039 0.32529526948928833 0.31066590547561646 0.2939175069332123 0.286742240190506 0.28868338465690613 0.2973419427871704 0.3067079484462738 0.31102290749549866 0.31296807527542114 0.3165799379348755 0.3216167390346527 0.32459816336631775 0.32458773255348206 0.32075992226600647 0.31120601296424866 0.3001273572444916 0.2915954291820526 0.28556665778160095 0.28158968687057495 0.2759927809238434 0.26627132296562195 0.25822049379348755 0.25609999895095825 0.2582840323448181 0.26162636280059814 0.26389646530151367 0.26584580540657043 0.269505113363266 0.2740560472011566 0.2757222354412079 0.2737424373626709 0.27331092953681946 0.2753473222255707 0.2754512131214142 0.2745696008205414 0.27530866861343384 0.2763848900794983 0.27731868624687195 0.2794644236564636 0.28307804465293884 0.2873600125312805 0.29181772470474243 0.29564568400382996 0.29717445373535156 0.2980411946773529 0.30308812856674194 0.31369927525520325 0.3267776072025299 0.3403771221637726 0.3552534282207489 0.3692227900028229 0.3773849606513977 0.37742289900779724 0.3699462413787842 0.3581613600254059 0.3446747362613678 0.3301258683204651 0.3174242079257965 0.3073962330818176 0.2965550720691681 0.28561556339263916 0.27806076407432556 30445.38885 41541.616519999996 F:/DATA/90deg 14.87720727584366 44.091357683377474 90.0 Degrees -75.66121752117968 0.024705796952298773 28.883928755026126 1.0573395108768266 0.9941901147353087 -87.96943280855872 0.008170118041294187 85.4864922350208 1.0433897898712823 0.1657092533769018 +0.3949830234050751 0.4622531533241272 0.5109723210334778 0.5819476842880249 0.6732906699180603 0.7399584054946899 0.8056941032409668 0.8803262114524841 0.9407079219818115 0.9959824681282043 1.0247737169265747 0.9988774061203003 0.9598121643066406 0.9596822261810303 0.9756194353103638 0.9531159996986389 0.8880895376205444 0.8291646242141724 0.7852953672409058 0.7326091527938843 0.6583097577095032 0.5755128264427185 0.5128992199897766 0.47360721230506897 0.4461856484413147 0.424794465303421 0.40726786851882935 0.39642640948295593 0.3955315947532654 0.3990853428840637 0.40200623869895935 0.41744357347488403 0.4541429877281189 0.4928371012210846 0.523593544960022 0.5572065114974976 0.6082401275634766 0.6535071730613708 0.6752548813819885 0.6942375302314758 0.7089064717292786 0.6849415898323059 0.648251473903656 0.6290637254714966 0.611190140247345 0.5820888876914978 0.5479511022567749 0.5251440405845642 0.5092036724090576 0.4710317552089691 0.41165193915367126 0.368015855550766 0.33563244342803955 0.30891987681388855 0.289467990398407 0.279835045337677 0.2776188254356384 0.281124472618103 0.2969658076763153 0.3199588358402252 0.3370678722858429 0.35005685687065125 0.3592534065246582 0.3598088026046753 0.3555058240890503 0.34791675209999084 0.3381218910217285 0.32693901658058167 0.3126853406429291 0.3007925748825073 0.2955957353115082 0.2945536673069 0.29722654819488525 0.30562835931777954 0.3160330057144165 0.32335811853408813 0.32722195982933044 0.33106622099876404 0.333890825510025 0.3307388126850128 0.32467377185821533 0.31839045882225037 0.3102380931377411 0.30023348331451416 0.28814268112182617 0.2750730514526367 0.26571476459503174 0.2631886601448059 0.2642560303211212 0.2657497227191925 0.2698196768760681 0.2753346860408783 0.27848049998283386 0.27970898151397705 0.2795354127883911 0.2767869830131531 0.27504852414131165 0.2782919108867645 0.28145065903663635 0.2807522118091583 0.2820216417312622 0.28606170415878296 0.2876238524913788 0.2858695089817047 0.28583207726478577 0.29170745611190796 0.2989623248577118 0.3013303577899933 0.3022397756576538 0.3061143457889557 0.31094178557395935 0.31485098600387573 0.3188069462776184 0.32449349761009216 0.333775132894516 0.34593096375465393 0.3592696785926819 0.3726845979690552 0.3809838593006134 0.37974658608436584 0.37090665102005005 0.3579893112182617 0.3460439443588257 0.33749645948410034 0.3274995684623718 0.3147842586040497 0.3056890070438385 0.3015490472316742 0.2963547110557556 30442.5687 41538.7379 F:/DATA/135deg 15.053673351479718 43.89851045568374 135.0 Degrees -76.38857262236182 0.004631214554422166 30.204593279869965 0.2093411760614958 0.9998996542510169 -20.289596380815063 0.003978761893197851 87.74938322748216 0.5226610812091969 0.4761749412326489 +0.36599868535995483 0.44001543521881104 0.4966375231742859 0.5643589496612549 0.654793381690979 0.7409048080444336 0.8192135691642761 0.8847960829734802 0.9369638562202454 0.9906289577484131 1.025296688079834 1.0149723291397095 0.9805884957313538 0.9636447429656982 0.9588003158569336 0.9524202942848206 0.9314351677894592 0.8927587270736694 0.8397254943847656 0.7675902843475342 0.6844693422317505 0.6059010624885559 0.5474121570587158 0.5043894052505493 0.468307226896286 0.44075509905815125 0.4207476079463959 0.4080858826637268 0.40591961145401 0.4134867191314697 0.42650675773620605 0.4475072920322418 0.47888901829719543 0.5122790336608887 0.5369526743888855 0.5554997324943542 0.5947977304458618 0.647955060005188 0.6778163313865662 0.6932549476623535 0.6977417469024658 0.6872305870056152 0.659528911113739 0.6245843768119812 0.5957351922988892 0.5746957659721375 0.5465317368507385 0.5116745233535767 0.47723180055618286 0.4333028197288513 0.3936629891395569 0.36897724866867065 0.345966637134552 0.3255443572998047 0.31004011631011963 0.29891106486320496 0.2932963967323303 0.2937392592430115 0.3078584671020508 0.33370327949523926 0.35201096534729004 0.3585779666900635 0.36050570011138916 0.3624379336833954 0.3620472550392151 0.35969817638397217 0.35452911257743835 0.3419364094734192 0.3230227828025818 0.30832669138908386 0.30204203724861145 0.3018741011619568 0.30683496594429016 0.3151794970035553 0.3218154311180115 0.3262678384780884 0.33061009645462036 0.33248963952064514 0.3305680453777313 0.32937225699424744 0.3280726373195648 0.322355717420578 0.3143385052680969 0.30674803256988525 0.2977624237537384 0.28612422943115234 0.27380654215812683 0.26605281233787537 0.2670673131942749 0.27401211857795715 0.2821645736694336 0.28739145398139954 0.289187490940094 0.2906554937362671 0.29101991653442383 0.28759765625 0.28305813670158386 0.28146880865097046 0.2823540270328522 0.2834238111972809 0.28334492444992065 0.28242823481559753 0.2830897569656372 0.285215824842453 0.286749929189682 0.2894335985183716 0.2963193953037262 0.30561134219169617 0.31135934591293335 0.3125182092189789 0.3135771155357361 0.31644806265830994 0.3219490647315979 0.3305686414241791 0.3386459946632385 0.34468361735343933 0.35293155908584595 0.3640737235546112 0.3740508556365967 0.3799596130847931 0.3787302076816559 0.3690877854824066 0.3545362651348114 0.33818575739860535 0.32251599431037903 0.31119340658187866 0.3069508969783783 0.30643993616104126 0.3014766573905945 30445.38885 41538.7379 F:/DATA/135deg 15.056927844654062 43.61475352701898 135.0 Degrees -81.76750236979787 0.017942087761759287 30.49926270974143 0.8135324371187873 0.9324530395726834 -61.4210730982497 0.011894554755490427 90.06882647010134 1.5974921533722033 0.36275784996581106 +0.36250585317611694 0.42431044578552246 0.4834742844104767 0.5558268427848816 0.6433207988739014 0.7237451076507568 0.797504723072052 0.8740603923797607 0.9462519288063049 1.0028680562973022 1.0236170291900635 0.9993492960929871 0.9659426808357239 0.929129958152771 0.8976386189460754 0.8773003220558167 0.845932126045227 0.804290771484375 0.7517927289009094 0.6770941019058228 0.5976353883743286 0.5313588380813599 0.48177453875541687 0.44140711426734924 0.40849852561950684 0.3899365961551666 0.38149017095565796 0.3739112615585327 0.3684139847755432 0.372007817029953 0.38562244176864624 0.40915170311927795 0.4383581876754761 0.46522119641304016 0.4911789894104004 0.5281954407691956 0.5901359915733337 0.6282098889350891 0.6299937963485718 0.6347435712814331 0.6456948518753052 0.6421006917953491 0.6224752068519592 0.6007646918296814 0.5784657001495361 0.5487658381462097 0.5032517313957214 0.4633730351924896 0.4398660957813263 0.41094517707824707 0.3713396489620209 0.3397798538208008 0.315258264541626 0.2960793673992157 0.2789282202720642 0.26473933458328247 0.2583105266094208 0.26161065697669983 0.276593953371048 0.29428234696388245 0.30759015679359436 0.3208509385585785 0.33403608202934265 0.3378518223762512 0.3314681351184845 0.3205536901950836 0.3096092939376831 0.29909756779670715 0.2854691445827484 0.27216678857803345 0.2648516893386841 0.26480165123939514 0.27259862422943115 0.28223392367362976 0.28807657957077026 0.2966751158237457 0.3103998601436615 0.31771647930145264 0.3139994740486145 0.31038033962249756 0.30780771374702454 0.30000224709510803 0.2885487973690033 0.2776309549808502 0.2691199779510498 0.26336920261383057 0.2575911581516266 0.2499367892742157 0.24667014181613922 0.2502342164516449 0.2533777952194214 0.25388017296791077 0.2556212842464447 0.2578236758708954 0.25818225741386414 0.2583445906639099 0.2599364221096039 0.2620580792427063 0.2627926170825958 0.2631688117980957 0.2642405927181244 0.263955682516098 0.2622736394405365 0.2618711590766907 0.2638363242149353 0.2683615982532501 0.2739871144294739 0.27764204144477844 0.2804603576660156 0.28473037481307983 0.28941360116004944 0.2937960624694824 0.2986640930175781 0.30610325932502747 0.316412091255188 0.3255343437194824 0.3314375877380371 0.33745360374450684 0.3465556502342224 0.355802059173584 0.358920693397522 0.35263997316360474 0.33765292167663574 0.3183898329734802 0.30118611454963684 0.2887457013130188 0.28239473700523376 0.2824958264827728 0.2819530665874481 30442.5687 41541.616519999996 F:/DATA/135deg 14.148486745442884 40.914534151939826 135.0 Degrees -58.74617564278722 0.012249198283408431 28.641297420407064 0.5230459500184083 0.9052486894719146 -31.249461838574835 0.010471285030812348 83.8267974762999 1.3098037700862717 0.5510780301748821 +0.3650876581668854 0.44027072191238403 0.49740421772003174 0.5676716566085815 0.6565104126930237 0.7217820286750793 0.776906430721283 0.8554854989051819 0.9431904554367065 0.99639892578125 0.9918259382247925 0.9632425308227539 0.9571559429168701 0.9453587532043457 0.9196834564208984 0.9045694470405579 0.8967841863632202 0.8714707493782043 0.8187240958213806 0.7500607967376709 0.6737703084945679 0.5944964289665222 0.5322104096412659 0.48620209097862244 0.4495582580566406 0.4267524480819702 0.4147963225841522 0.4065539836883545 0.40079763531684875 0.40120112895965576 0.4117395281791687 0.4343542158603668 0.4588378369808197 0.4770737290382385 0.49635985493659973 0.5230758190155029 0.5750504732131958 0.6321943402290344 0.6574925780296326 0.6613973379135132 0.6457144618034363 0.6232727766036987 0.6174584627151489 0.6194400787353516 0.6105873584747314 0.5773681402206421 0.5304786562919617 0.4934249520301819 0.45931971073150635 0.41730549931526184 0.38470304012298584 0.3595018684864044 0.3293219804763794 0.30435964465141296 0.2891426980495453 0.2798253893852234 0.2746725082397461 0.2748556435108185 0.2886051833629608 0.3117738366127014 0.32717078924179077 0.33106401562690735 0.3289177715778351 0.33031389117240906 0.33271220326423645 0.3304341435432434 0.32225725054740906 0.30900219082832336 0.2952777147293091 0.2869744896888733 0.28450044989585876 0.2863030433654785 0.29052266478538513 0.29561755061149597 0.3012177348136902 0.3077249825000763 0.3149780333042145 0.3194979727268219 0.31837978959083557 0.3156931400299072 0.31331557035446167 0.3074597716331482 0.29792141914367676 0.28665927052497864 0.2769920229911804 0.2717728316783905 0.2680080831050873 0.26393961906433105 0.2608543634414673 0.25888293981552124 0.25867512822151184 0.2605808675289154 0.263666570186615 0.26618891954421997 0.2665948271751404 0.2663698196411133 0.2670312225818634 0.26882821321487427 0.27096620202064514 0.2717668414115906 0.2718110680580139 0.2726369798183441 0.27475622296333313 0.2783312201499939 0.2822757363319397 0.285504013299942 0.2890436351299286 0.29262956976890564 0.292468398809433 0.2886587381362915 0.28673070669174194 0.2884071469306946 0.29260167479515076 0.30139777064323425 0.31254521012306213 0.32084983587265015 0.329580694437027 0.34177514910697937 0.35234349966049194 0.3568665683269501 0.3554323613643646 0.3491654396057129 0.3388620913028717 0.32499754428863525 0.3104616105556488 0.29853302240371704 0.28830283880233765 0.27974289655685425 0.27512240409851074 30445.38885 41541.616519999996 F:/DATA/135deg 14.216843459338445 41.87857263213592 135.0 Degrees -75.66121752117968 0.024705796952298773 28.883928755026126 1.0573395108768266 0.9941901147353087 -87.96943280855872 0.008170118041294187 85.4864922350208 1.0433897898712823 0.1657092533769018 diff --git a/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin1.tab b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin1.tab new file mode 100644 index 000000000..d661b3ec9 --- /dev/null +++ b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin1.tab @@ -0,0 +1,7 @@ +1697.131066748047 1693.2739506872558 1689.416834626465 1685.5597185656738 1681.702602504883 1677.8454864440919 1673.9883703833011 1670.13125432251 1666.2741382617191 1662.417022200928 1658.5599061401367 1654.702790079346 1650.8456740185547 1646.988557957764 1643.1314418969728 1639.274325836182 1635.4172097753908 1631.5600937145996 1627.7029776538088 1623.8458615930176 1619.9887455322269 1616.1316294714356 1612.2745134106449 1608.4173973498537 1604.5602812890625 1600.7031652282717 1596.8460491674805 1592.9889331066897 1589.1318170458985 1585.2747009851078 1581.4175849243165 1577.5604688635258 1573.7033528027346 1569.8462367419434 1565.9891206811526 1562.1320046203614 1558.2748885595706 1554.4177724987794 1550.5606564379887 1546.7035403771974 1542.8464243164062 1538.9893082556155 1535.1321921948243 1531.2750761340335 1527.4179600732423 1523.5608440124515 1519.7037279516603 1515.846611890869 1511.9894958300783 1508.1323797692871 1504.2752637084964 1500.4181476477052 1496.5610315869144 1492.7039155261232 1488.8467994653324 1484.9896834045412 1481.13256734375 1477.2754512829592 1473.418335222168 1469.5612191613773 1465.704103100586 1461.8469870397953 1457.989870979004 1454.1327549182129 1450.275638857422 1446.418522796631 1442.5614067358401 1438.704290675049 1434.8471746142582 1430.990058553467 1427.1329424926757 1423.275826431885 1419.4187103710938 1415.561594310303 1411.7044782495118 1407.847362188721 1403.9902461279298 1400.133130067139 1396.2760140063479 1392.4188979455566 1388.5617818847659 1384.7046658239747 1380.847549763184 1376.9904337023927 1373.133317641602 1369.2762015808107 1365.4190855200195 1361.5619694592287 1357.7048533984375 1353.8477373376468 1349.9906212768556 1346.1335052160648 1342.2763891552736 1338.4192730944824 1334.5621570336916 1330.7050409729004 1326.8479249121096 1322.9908088513184 1319.1336927905277 1315.2765767297365 1311.4194606689457 1307.5623446081545 1303.7052285473633 1299.8481124865725 1295.9909964257813 1292.1338803649905 1288.2767643041993 1284.4196482434086 1280.5625321826174 1276.7054161218261 1272.8483000610354 1268.9911840002442 1265.1340679394534 1261.2769518786622 1257.4198358178714 1253.5627197570802 1249.705603696289 1245.8484876354983 1241.991371574707 1238.1342555139163 1234.277139453125 1230.4200233923343 1226.562907331543 1222.7057912707523 1218.8486752099611 1214.99155914917 1211.1344430883792 1207.277327027588 1203.4202109667972 map_x map_y 1214.0 - 1258.0 1500.0 - 1580.0 +continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous + meta meta meta meta +0.3711118698120117 0.43782272934913635 0.49062955379486084 0.5547452569007874 0.6374028921127319 0.711500346660614 0.7876919507980347 0.8770861625671387 0.9559172987937927 1.0098530054092407 1.0404753684997559 1.0543735027313232 1.0619465112686157 1.0437582731246948 1.0013220310211182 0.9536964297294617 0.897933840751648 0.8533709645271301 0.8181004524230957 0.7584443688392639 0.6689296364784241 0.5782220363616943 0.513115644454956 0.46961721777915955 0.43171659111976624 0.3991532325744629 0.3810955286026001 0.37965840101242065 0.386007159948349 0.3947145342826843 0.4098324477672577 0.4343760311603546 0.46137940883636475 0.49168214201927185 0.528336226940155 0.5667646527290344 0.6178287267684937 0.6604256629943848 0.6766932010650635 0.6885275840759277 0.6986993551254272 0.6930281519889832 0.6724157929420471 0.6501829028129578 0.6263569593429565 0.5885990858078003 0.5376056432723999 0.5005533695220947 0.4779326319694519 0.4443279504776001 0.39699268341064453 0.36137861013412476 0.33436083793640137 0.30747178196907043 0.2803654670715332 0.2625480592250824 0.2592535614967346 0.27015992999076843 0.29309216141700745 0.31150364875793457 0.3194276988506317 0.328142374753952 0.3443129062652588 0.35353028774261475 0.3476772606372833 0.33774372935295105 0.32855379581451416 0.3200712502002716 0.31163617968559265 0.3032289445400238 0.2943628430366516 0.28816357254981995 0.2909632623195648 0.29872336983680725 0.3025616407394409 0.3057458698749542 0.3115512728691101 0.31618112325668335 0.3176253139972687 0.3175846040248871 0.3153497576713562 0.3088831901550293 0.3000914454460144 0.29377707839012146 0.2888909578323364 0.28027477860450745 0.270122230052948 0.26286780834198 0.2575746774673462 0.2533765435218811 0.2540722191333771 0.26083439588546753 0.2694004774093628 0.27414125204086304 0.2728372812271118 0.26937466859817505 0.2672775387763977 0.2684006989002228 0.2723020315170288 0.27508431673049927 0.2749064266681671 0.274681955575943 0.2775912284851074 0.28367695212364197 0.2893185019493103 0.290900319814682 0.2906703054904938 0.2926110625267029 0.2950325608253479 0.2977401614189148 0.3037301301956177 0.3114270567893982 0.318378210067749 0.32530495524406433 0.3349395990371704 0.3490666151046753 0.3638021945953369 0.3744945526123047 0.3803212642669678 0.3803481459617615 0.37394478917121887 0.3625723719596863 0.34696418046951294 0.3287803828716278 0.31259098649024963 0.3022864758968353 0.2975075840950012 0.2938818633556366 0.2872605323791504 30442.5687 41538.7379 15.009961445779307 43.87936019111817 +0.388348788022995 0.44867801666259766 0.502106249332428 0.5762503743171692 0.6664558053016663 0.739630937576294 0.8222108483314514 0.9173783659934998 0.9785887002944946 1.0107851028442383 1.0361779928207397 1.0637257099151611 1.0711760520935059 1.0423812866210938 1.025393009185791 0.9986843466758728 0.9373337626457214 0.8785869479179382 0.8271448612213135 0.7655133605003357 0.6908860802650452 0.6117749810218811 0.5471857190132141 0.4971246123313904 0.45541316270828247 0.42525458335876465 0.4062337279319763 0.39754077792167664 0.39981767535209656 0.41045162081718445 0.42612242698669434 0.4495392143726349 0.48013657331466675 0.509360134601593 0.5352477431297302 0.5706249475479126 0.6430520415306091 0.7104148864746094 0.7287077903747559 0.7300795912742615 0.7207353115081787 0.6928030848503113 0.6642997860908508 0.6465807557106018 0.6357985734939575 0.6169293522834778 0.5714240670204163 0.5247028470039368 0.49503496289253235 0.4588204622268677 0.41067439317703247 0.37448638677597046 0.34704023599624634 0.32218214869499207 0.29583585262298584 0.27490201592445374 0.26934197545051575 0.28096309304237366 0.3069058060646057 0.3270772397518158 0.33470597863197327 0.34152284264564514 0.35194724798202515 0.3573232889175415 0.3541431128978729 0.34866204857826233 0.3427005112171173 0.3312859833240509 0.3122206926345825 0.2955722510814667 0.2872144877910614 0.2867285907268524 0.2918354272842407 0.2956002652645111 0.2986833155155182 0.3060479462146759 0.31676867604255676 0.3262639045715332 0.330106645822525 0.32593291997909546 0.31699928641319275 0.30795541405677795 0.3018266558647156 0.29686442017555237 0.28721868991851807 0.2752007842063904 0.2667289972305298 0.2609139084815979 0.25778260827064514 0.2584190368652344 0.2610763907432556 0.2639258801937103 0.26595649123191833 0.26701226830482483 0.2679225206375122 0.2679891288280487 0.2669326663017273 0.2678163945674896 0.2720436155796051 0.2770630121231079 0.28001782298088074 0.27851158380508423 0.2751752436161041 0.276258647441864 0.2823660373687744 0.2899717390537262 0.29827389121055603 0.30697736144065857 0.3102128207683563 0.30654236674308777 0.30582261085510254 0.3128655254840851 0.3222534656524658 0.32939496636390686 0.33602944016456604 0.34821176528930664 0.3637096881866455 0.37178686261177063 0.3715791702270508 0.37046146392822266 0.36934414505958557 0.36342424154281616 0.350017786026001 0.33207470178604126 0.3140036165714264 0.2998875081539154 0.29220956563949585 0.2874009907245636 0.2815419137477875 30445.38885 41538.7379 14.936959331411803 45.349811063094954 +0.366887629032135 0.43671754002571106 0.49220016598701477 0.5703327059745789 0.6657547950744629 0.731933057308197 0.7937033176422119 0.8747525215148926 0.9398021697998047 0.9730452299118042 1.0031681060791016 1.0538406372070312 1.0965853929519653 1.0494016408920288 0.9825043678283691 0.9511120319366455 0.9302560687065125 0.8842418789863586 0.8129315972328186 0.7183979153633118 0.6205475330352783 0.5415375232696533 0.48775240778923035 0.44761666655540466 0.41458284854888916 0.39335882663726807 0.3796997666358948 0.36864838004112244 0.36498430371284485 0.3680277466773987 0.3732655644416809 0.38918817043304443 0.42386338114738464 0.46311137080192566 0.4917769134044647 0.5237820148468018 0.5971131920814514 0.6691277027130127 0.6892750859260559 0.7003340125083923 0.7168111801147461 0.6999649405479431 0.6541981101036072 0.6189929246902466 0.5926592946052551 0.5696735382080078 0.5413363575935364 0.5053853988647461 0.465243935585022 0.41113007068634033 0.36086025834083557 0.32808783650398254 0.3003191649913788 0.2793380916118622 0.26471295952796936 0.2541550099849701 0.24993854761123657 0.25305330753326416 0.2655698359012604 0.27899375557899475 0.2841063439846039 0.28888702392578125 0.30285078287124634 0.3161625862121582 0.3197145164012909 0.3178388774394989 0.31100529432296753 0.29754751920700073 0.28191861510276794 0.2750825583934784 0.27559351921081543 0.27823397517204285 0.2830919921398163 0.2850538194179535 0.2825995981693268 0.28359857201576233 0.2883332371711731 0.289949893951416 0.2929544150829315 0.30135759711265564 0.30265331268310547 0.2906714677810669 0.2753030061721802 0.2651992440223694 0.25924843549728394 0.25318726897239685 0.24550479650497437 0.23828820884227753 0.23315896093845367 0.23029816150665283 0.2334306240081787 0.24293583631515503 0.2510787546634674 0.25073981285095215 0.24615781009197235 0.2464907467365265 0.2522513270378113 0.2587389051914215 0.262591689825058 0.263126403093338 0.26156532764434814 0.2589862048625946 0.2572213411331177 0.2594248950481415 0.2655974328517914 0.27193424105644226 0.27772676944732666 0.28423818945884705 0.28888431191444397 0.29118603467941284 0.2921951413154602 0.29164180159568787 0.2948339283466339 0.3066503405570984 0.32164159417152405 0.333238422870636 0.34339842200279236 0.355623722076416 0.36564287543296814 0.36494630575180054 0.35201695561408997 0.3341171145439148 0.3175579309463501 0.30399125814437866 0.2928829789161682 0.28347793221473694 0.2780621647834778 0.276618093252182 0.27352389693260193 30442.5687 41541.616519999996 14.140093941838566 42.63377488797279 +0.36428871750831604 0.43003931641578674 0.47958770394325256 0.5450240969657898 0.634536862373352 0.7099695801734924 0.7796786427497864 0.8637834787368774 0.942089855670929 0.9903811812400818 1.0105667114257812 1.0208871364593506 1.005222201347351 0.963545024394989 0.9371297359466553 0.9139838814735413 0.8946059942245483 0.8827653527259827 0.840722918510437 0.7564958333969116 0.6611053943634033 0.5774503946304321 0.5202354192733765 0.48433250188827515 0.45376747846603394 0.4260224401950836 0.4059300422668457 0.3930695950984955 0.38632991909980774 0.3889123797416687 0.4001465141773224 0.4183931052684784 0.4428093135356903 0.47215187549591064 0.5050704479217529 0.5453080534934998 0.6085248589515686 0.658994734287262 0.668915331363678 0.6675289869308472 0.6717699766159058 0.6808158755302429 0.6681414842605591 0.6372467875480652 0.6000738739967346 0.5683797597885132 0.544323742389679 0.516345202922821 0.48224183917045593 0.4387160539627075 0.39499184489250183 0.3595888912677765 0.3304763436317444 0.3092094361782074 0.28860795497894287 0.26972246170043945 0.2605076730251312 0.26343077421188354 0.28140151500701904 0.29994896054267883 0.30823972821235657 0.31485551595687866 0.32437241077423096 0.33080095052719116 0.3303925395011902 0.3248642385005951 0.3165438175201416 0.3061983585357666 0.2946605384349823 0.2872968912124634 0.2868692874908447 0.2896806299686432 0.2909656763076782 0.2920180857181549 0.2945660948753357 0.2972028851509094 0.29964983463287354 0.3004482090473175 0.29766783118247986 0.2939799129962921 0.2927486002445221 0.2923987805843353 0.2889113426208496 0.2816716730594635 0.27281782031059265 0.2626931965351105 0.2514967918395996 0.24271203577518463 0.23827271163463593 0.23637256026268005 0.2380509227514267 0.24506837129592896 0.25348952412605286 0.25623422861099243 0.25412917137145996 0.2532842457294464 0.2547925114631653 0.2577175199985504 0.26068350672721863 0.2616606056690216 0.2597542703151703 0.2559884488582611 0.2536808252334595 0.256541907787323 0.2641761898994446 0.271513968706131 0.2755036950111389 0.27728980779647827 0.27779620885849 0.27858373522758484 0.28195881843566895 0.28836870193481445 0.29790475964546204 0.3091188371181488 0.317819207906723 0.3241935074329376 0.33264613151550293 0.3433806300163269 0.3505949378013611 0.35062962770462036 0.34647127985954285 0.3387751281261444 0.32535696029663086 0.3086860477924347 0.2940033972263336 0.2858646810054779 0.2827148139476776 0.2769644856452942 0.26818761229515076 30445.38885 41541.616519999996 13.949567230311496 43.05058779046659 diff --git a/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin2.tab b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin2.tab new file mode 100644 index 000000000..320451020 --- /dev/null +++ b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin2.tab @@ -0,0 +1,7 @@ +1697.131066748047 1693.2739506872558 1689.416834626465 1685.5597185656738 1681.702602504883 1677.8454864440919 1673.9883703833011 1670.13125432251 1666.2741382617191 1662.417022200928 1658.5599061401367 1654.702790079346 1650.8456740185547 1646.988557957764 1643.1314418969728 1639.274325836182 1635.4172097753908 1631.5600937145996 1627.7029776538088 1623.8458615930176 1619.9887455322269 1616.1316294714356 1612.2745134106449 1608.4173973498537 1604.5602812890625 1600.7031652282717 1596.8460491674805 1592.9889331066897 1589.1318170458985 1585.2747009851078 1581.4175849243165 1577.5604688635258 1573.7033528027346 1569.8462367419434 1565.9891206811526 1562.1320046203614 1558.2748885595706 1554.4177724987794 1550.5606564379887 1546.7035403771974 1542.8464243164062 1538.9893082556155 1535.1321921948243 1531.2750761340335 1527.4179600732423 1523.5608440124515 1519.7037279516603 1515.846611890869 1511.9894958300783 1508.1323797692871 1504.2752637084964 1500.4181476477052 1496.5610315869144 1492.7039155261232 1488.8467994653324 1484.9896834045412 1481.13256734375 1477.2754512829592 1473.418335222168 1469.5612191613773 1465.704103100586 1461.8469870397953 1457.989870979004 1454.1327549182129 1450.275638857422 1446.418522796631 1442.5614067358401 1438.704290675049 1434.8471746142582 1430.990058553467 1427.1329424926757 1423.275826431885 1419.4187103710938 1415.561594310303 1411.7044782495118 1407.847362188721 1403.9902461279298 1400.133130067139 1396.2760140063479 1392.4188979455566 1388.5617818847659 1384.7046658239747 1380.847549763184 1376.9904337023927 1373.133317641602 1369.2762015808107 1365.4190855200195 1361.5619694592287 1357.7048533984375 1353.8477373376468 1349.9906212768556 1346.1335052160648 1342.2763891552736 1338.4192730944824 1334.5621570336916 1330.7050409729004 1326.8479249121096 1322.9908088513184 1319.1336927905277 1315.2765767297365 1311.4194606689457 1307.5623446081545 1303.7052285473633 1299.8481124865725 1295.9909964257813 1292.1338803649905 1288.2767643041993 1284.4196482434086 1280.5625321826174 1276.7054161218261 1272.8483000610354 1268.9911840002442 1265.1340679394534 1261.2769518786622 1257.4198358178714 1253.5627197570802 1249.705603696289 1245.8484876354983 1241.991371574707 1238.1342555139163 1234.277139453125 1230.4200233923343 1226.562907331543 1222.7057912707523 1218.8486752099611 1214.99155914917 1211.1344430883792 1207.277327027588 1203.4202109667972 map_x map_y 1214.0 - 1258.0 1500.0 - 1580.0 +continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous + meta meta meta meta +0.3773364722728729 0.43966636061668396 0.49002042412757874 0.5639562606811523 0.6609355807304382 0.7364853620529175 0.8136956691741943 0.8985644578933716 0.9468745589256287 0.9731678366661072 0.9914941191673279 0.9854417443275452 0.9628058671951294 0.9528713226318359 0.9546505808830261 0.9532977342605591 0.9257292151451111 0.8693946599960327 0.8010186553001404 0.7217180728912354 0.6436004638671875 0.5754334926605225 0.5214712619781494 0.47915247082710266 0.4447232484817505 0.41765138506889343 0.3990515470504761 0.39321616291999817 0.39747321605682373 0.40612584352493286 0.4184291958808899 0.43992483615875244 0.47834911942481995 0.5266345739364624 0.5672381520271301 0.597634494304657 0.6348262429237366 0.6744903922080994 0.6967960000038147 0.7098262310028076 0.7118614912033081 0.6856943368911743 0.6489338874816895 0.6190053224563599 0.5941586494445801 0.5711410641670227 0.5421783328056335 0.5111346244812012 0.4810764491558075 0.4355677664279938 0.3860788941383362 0.3534643054008484 0.32750168442726135 0.3032616674900055 0.2819446921348572 0.26981374621391296 0.2693929970264435 0.2801830768585205 0.30366891622543335 0.3256083130836487 0.3365386128425598 0.34310561418533325 0.35129883885383606 0.3588528633117676 0.35683950781822205 0.3458286225795746 0.33076736330986023 0.31613433361053467 0.30460110306739807 0.2960743308067322 0.2915134131908417 0.29322516918182373 0.2980576753616333 0.300569623708725 0.3029937744140625 0.3091799318790436 0.3191257119178772 0.32923704385757446 0.3315645456314087 0.3225858509540558 0.31236401200294495 0.3056598901748657 0.2981754243373871 0.2894536256790161 0.2814278304576874 0.2723696827888489 0.26151928305625916 0.2525339126586914 0.25026053190231323 0.2539668083190918 0.25997182726860046 0.26598429679870605 0.27031874656677246 0.27086934447288513 0.2690020799636841 0.26832443475723267 0.2695266008377075 0.2705895006656647 0.2702696919441223 0.27155083417892456 0.2761310338973999 0.28070759773254395 0.2832408547401428 0.2835163474082947 0.28365248441696167 0.2872329354286194 0.29273301362991333 0.29702767729759216 0.2998993694782257 0.30078554153442383 0.3016831874847412 0.30665796995162964 0.31462526321411133 0.32313990592956543 0.3358403742313385 0.3547256886959076 0.3718043267726898 0.3799355626106262 0.3825741112232208 0.383433073759079 0.3778041899204254 0.3644450008869171 0.3474675118923187 0.3291182518005371 0.3145691752433777 0.3077240586280823 0.3049233853816986 0.3022094964981079 0.2970089614391327 30442.5687 41538.7379 15.14943703154183 44.23850067435577 +0.37337228655815125 0.4396507143974304 0.49107563495635986 0.5586245059967041 0.646790623664856 0.7179062962532043 0.7848191857337952 0.8587467670440674 0.9132012128829956 0.9501560926437378 0.9785140156745911 0.984795868396759 0.9518576860427856 0.9169514179229736 0.9128903150558472 0.9190047979354858 0.9011522531509399 0.8552564978599548 0.7962431311607361 0.7195406556129456 0.6405887007713318 0.5768947005271912 0.5284963250160217 0.48475223779678345 0.44452735781669617 0.4175184965133667 0.4050688147544861 0.4015383720397949 0.4035366475582123 0.4095524847507477 0.41840967535972595 0.43762996792793274 0.4735090136528015 0.5144422650337219 0.5498296618461609 0.5891739130020142 0.6544406414031982 0.7074301838874817 0.721211850643158 0.7253494262695312 0.7205705046653748 0.7011243104934692 0.6794993877410889 0.6561350226402283 0.6234012842178345 0.5791003108024597 0.5371192693710327 0.5127407312393188 0.48728594183921814 0.43710267543792725 0.3880417048931122 0.358508825302124 0.3291686475276947 0.30198532342910767 0.2838975191116333 0.2756803035736084 0.27510562539100647 0.28265753388404846 0.30272212624549866 0.3223998248577118 0.3314470052719116 0.3400789797306061 0.3539663255214691 0.3615642189979553 0.35621216893196106 0.34422820806503296 0.33036601543426514 0.3164904713630676 0.30386441946029663 0.29513826966285706 0.2911766767501831 0.2941439151763916 0.302760511636734 0.30998602509498596 0.31750985980033875 0.32691699266433716 0.33109205961227417 0.3281230330467224 0.32525792717933655 0.32315510511398315 0.3174678683280945 0.31104981899261475 0.3055250942707062 0.297789067029953 0.28920844197273254 0.28300905227661133 0.27708175778388977 0.27133673429489136 0.26787322759628296 0.2659844756126404 0.26673445105552673 0.2708447575569153 0.2750791013240814 0.2769821286201477 0.2775936722755432 0.278523713350296 0.2802591919898987 0.2821207642555237 0.282520055770874 0.28267189860343933 0.2840110957622528 0.28552529215812683 0.28797078132629395 0.2903944253921509 0.29174160957336426 0.2954663932323456 0.30151888728141785 0.30476686358451843 0.30412399768829346 0.30343693494796753 0.30575087666511536 0.31121543049812317 0.3187049329280853 0.3290562331676483 0.3425249457359314 0.3562610149383545 0.36918962001800537 0.3792024254798889 0.3837013840675354 0.3848077654838562 0.3821556568145752 0.3716545104980469 0.3544897437095642 0.33635222911834717 0.3203563988208771 0.30804407596588135 0.3005572259426117 0.2961486577987671 0.29254403710365295 30445.38885 41538.7379 15.287506938801155 44.956915156436416 +0.38911929726600647 0.44554373621940613 0.4855414927005768 0.5539154410362244 0.6538650989532471 0.7315957546234131 0.8033648729324341 0.884945809841156 0.9360079765319824 0.954917311668396 0.9649530649185181 0.9849116206169128 1.008013129234314 0.9807816743850708 0.9428510069847107 0.9156916737556458 0.8764055967330933 0.825237512588501 0.7735792994499207 0.705725371837616 0.6241020560264587 0.5504984855651855 0.4957604706287384 0.45222288370132446 0.41255465149879456 0.3828220069408417 0.37051448225975037 0.37108558416366577 0.37338513135910034 0.37661170959472656 0.3874439001083374 0.41331085562705994 0.449747771024704 0.47858643531799316 0.4993457794189453 0.5276702642440796 0.5828417539596558 0.6414362788200378 0.6703454852104187 0.6750879287719727 0.6613235473632812 0.6516115069389343 0.6429095268249512 0.6263266801834106 0.6048684120178223 0.5731279253959656 0.5306711196899414 0.492236465215683 0.45757782459259033 0.40995675325393677 0.3611593246459961 0.33053696155548096 0.3058626651763916 0.2824017405509949 0.2620924711227417 0.24882546067237854 0.24321754276752472 0.24622128903865814 0.2659408152103424 0.29050007462501526 0.3000190854072571 0.30213284492492676 0.3106580674648285 0.3247032165527344 0.3296380937099457 0.3233187794685364 0.3104628324508667 0.29432252049446106 0.2806641161441803 0.2753435969352722 0.2728271782398224 0.270643025636673 0.2736828327178955 0.2805771827697754 0.28472232818603516 0.2870364487171173 0.2909660339355469 0.29421940445899963 0.2940268814563751 0.29415833950042725 0.2929386496543884 0.2845102548599243 0.27148693799972534 0.26009973883628845 0.25316986441612244 0.25014013051986694 0.24763965606689453 0.24328280985355377 0.24036899209022522 0.2429419606924057 0.24842298030853271 0.25228366255760193 0.25561103224754333 0.25914180278778076 0.25783947110176086 0.253574401140213 0.2532463073730469 0.25550371408462524 0.2551080286502838 0.2552626430988312 0.2603242099285126 0.2648930549621582 0.26599374413490295 0.26791733503341675 0.27033597230911255 0.27200937271118164 0.27633726596832275 0.281934916973114 0.28416839241981506 0.2850780189037323 0.28886574506759644 0.29535502195358276 0.30392923951148987 0.3146568834781647 0.3258497714996338 0.3378189206123352 0.3510323464870453 0.3626718819141388 0.3707166612148285 0.37344253063201904 0.3687247931957245 0.3559401333332062 0.336141973733902 0.31635063886642456 0.30404531955718994 0.2972669005393982 0.29117393493652344 0.28547903895378113 0.2802625894546509 30442.5687 41541.616519999996 14.612466406432896 42.07633292374312 +0.34738847613334656 0.4179860055446625 0.4664291739463806 0.5296632647514343 0.6272340416908264 0.7056167125701904 0.7561516165733337 0.8085007667541504 0.8644552826881409 0.9050332307815552 0.9181493520736694 0.9111636281013489 0.9073537588119507 0.9109403491020203 0.9062535762786865 0.8872991800308228 0.8642696738243103 0.8446381688117981 0.8067254424095154 0.7335556745529175 0.6443662047386169 0.5644205808639526 0.506117045879364 0.467324823141098 0.43990078568458557 0.4194169044494629 0.4045620858669281 0.39635950326919556 0.3957340121269226 0.40181082487106323 0.4117859899997711 0.4274001121520996 0.4520021080970764 0.48187950253486633 0.5073687434196472 0.5298813581466675 0.5784440636634827 0.6448124051094055 0.6777898669242859 0.6767211556434631 0.648645281791687 0.6306580901145935 0.6294295191764832 0.6141109466552734 0.586581289768219 0.5592874884605408 0.5341745018959045 0.5011913180351257 0.4583965539932251 0.4066646993160248 0.3704123795032501 0.3489791750907898 0.3235110640525818 0.29798153042793274 0.2787266969680786 0.26791489124298096 0.2635549306869507 0.2648940086364746 0.2800384759902954 0.30330970883369446 0.3163895010948181 0.31783244013786316 0.3187214732170105 0.3288123607635498 0.33496859669685364 0.3315340280532837 0.32235997915267944 0.30760458111763 0.289726585149765 0.27839016914367676 0.2739510238170624 0.272896945476532 0.27768412232398987 0.286607027053833 0.29376494884490967 0.30020976066589355 0.3059932589530945 0.30805355310440063 0.3080996572971344 0.30983278155326843 0.30988332629203796 0.3039196729660034 0.29341766238212585 0.28149351477622986 0.2707284390926361 0.2622477412223816 0.25400418043136597 0.2478829324245453 0.2490083873271942 0.2554311156272888 0.26148200035095215 0.26385727524757385 0.26382210850715637 0.26387882232666016 0.26245152950286865 0.26000332832336426 0.2600518763065338 0.2617824673652649 0.26309698820114136 0.26552656292915344 0.2700032591819763 0.2736172676086426 0.2747006118297577 0.2754264175891876 0.2767968773841858 0.2779064476490021 0.279891699552536 0.284357488155365 0.28945451974868774 0.2933834195137024 0.2966553568840027 0.2989789843559265 0.30280598998069763 0.31150293350219727 0.32365909218788147 0.33813759684562683 0.35394054651260376 0.3676077127456665 0.376840740442276 0.3798968195915222 0.37367281317710876 0.3576556146144867 0.3369816541671753 0.31849825382232666 0.30471497774124146 0.29529136419296265 0.2896086275577545 0.2846777141094208 0.2775256037712097 30445.38885 41541.616519999996 14.724239544441382 41.95246636406159 diff --git a/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin3.tab b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin3.tab new file mode 100644 index 000000000..ac94a50bf --- /dev/null +++ b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin3.tab @@ -0,0 +1,7 @@ +1697.131066748047 1693.2739506872558 1689.416834626465 1685.5597185656738 1681.702602504883 1677.8454864440919 1673.9883703833011 1670.13125432251 1666.2741382617191 1662.417022200928 1658.5599061401367 1654.702790079346 1650.8456740185547 1646.988557957764 1643.1314418969728 1639.274325836182 1635.4172097753908 1631.5600937145996 1627.7029776538088 1623.8458615930176 1619.9887455322269 1616.1316294714356 1612.2745134106449 1608.4173973498537 1604.5602812890625 1600.7031652282717 1596.8460491674805 1592.9889331066897 1589.1318170458985 1585.2747009851078 1581.4175849243165 1577.5604688635258 1573.7033528027346 1569.8462367419434 1565.9891206811526 1562.1320046203614 1558.2748885595706 1554.4177724987794 1550.5606564379887 1546.7035403771974 1542.8464243164062 1538.9893082556155 1535.1321921948243 1531.2750761340335 1527.4179600732423 1523.5608440124515 1519.7037279516603 1515.846611890869 1511.9894958300783 1508.1323797692871 1504.2752637084964 1500.4181476477052 1496.5610315869144 1492.7039155261232 1488.8467994653324 1484.9896834045412 1481.13256734375 1477.2754512829592 1473.418335222168 1469.5612191613773 1465.704103100586 1461.8469870397953 1457.989870979004 1454.1327549182129 1450.275638857422 1446.418522796631 1442.5614067358401 1438.704290675049 1434.8471746142582 1430.990058553467 1427.1329424926757 1423.275826431885 1419.4187103710938 1415.561594310303 1411.7044782495118 1407.847362188721 1403.9902461279298 1400.133130067139 1396.2760140063479 1392.4188979455566 1388.5617818847659 1384.7046658239747 1380.847549763184 1376.9904337023927 1373.133317641602 1369.2762015808107 1365.4190855200195 1361.5619694592287 1357.7048533984375 1353.8477373376468 1349.9906212768556 1346.1335052160648 1342.2763891552736 1338.4192730944824 1334.5621570336916 1330.7050409729004 1326.8479249121096 1322.9908088513184 1319.1336927905277 1315.2765767297365 1311.4194606689457 1307.5623446081545 1303.7052285473633 1299.8481124865725 1295.9909964257813 1292.1338803649905 1288.2767643041993 1284.4196482434086 1280.5625321826174 1276.7054161218261 1272.8483000610354 1268.9911840002442 1265.1340679394534 1261.2769518786622 1257.4198358178714 1253.5627197570802 1249.705603696289 1245.8484876354983 1241.991371574707 1238.1342555139163 1234.277139453125 1230.4200233923343 1226.562907331543 1222.7057912707523 1218.8486752099611 1214.99155914917 1211.1344430883792 1207.277327027588 1203.4202109667972 map_x map_y 1214.0 - 1258.0 1500.0 - 1580.0 +continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous + meta meta meta meta +0.36890196800231934 0.4383719861507416 0.49215278029441833 0.5678848028182983 0.6697624325752258 0.7421551942825317 0.7949410080909729 0.861175537109375 0.9304823279380798 0.9888854622840881 1.0296154022216797 1.0200906991958618 0.9658761620521545 0.9375912547111511 0.9355541467666626 0.9351963996887207 0.9119044542312622 0.8633236289024353 0.8102912902832031 0.7478935718536377 0.6693353056907654 0.5896985530853271 0.5278323888778687 0.47969499230384827 0.4415580630302429 0.4171638786792755 0.40274444222450256 0.3934766352176666 0.3904435634613037 0.39783647656440735 0.41653168201446533 0.4471336603164673 0.4835716187953949 0.5180643796920776 0.5542099475860596 0.5966129302978516 0.6491007804870605 0.6811864972114563 0.6899703741073608 0.6939358711242676 0.6857684850692749 0.6570229530334473 0.6270668506622314 0.6001116633415222 0.5694991946220398 0.5400396585464478 0.5212351679801941 0.5054466128349304 0.4800109267234802 0.4332926869392395 0.38531044125556946 0.35653600096702576 0.33400747179985046 0.3157062530517578 0.3017118573188782 0.29292401671409607 0.2914346158504486 0.2968195676803589 0.3123685419559479 0.3298073410987854 0.3378491699695587 0.3447093665599823 0.35713934898376465 0.36121153831481934 0.354942262172699 0.35000061988830566 0.34591320157051086 0.3377359211444855 0.32351627945899963 0.3089088499546051 0.299715518951416 0.29520851373672485 0.29720360040664673 0.3091683089733124 0.3235648274421692 0.3309069871902466 0.3311137557029724 0.3341479003429413 0.3409155011177063 0.3392958343029022 0.32886332273483276 0.318060964345932 0.31203606724739075 0.30700525641441345 0.2969604432582855 0.2861284911632538 0.2785927355289459 0.27391406893730164 0.2739171087741852 0.27796828746795654 0.2818444073200226 0.28413259983062744 0.28639599680900574 0.28605619072914124 0.28013235330581665 0.27383479475975037 0.27307555079460144 0.27768054604530334 0.2847695052623749 0.29085657000541687 0.28964218497276306 0.2820451259613037 0.2783108055591583 0.28211650252342224 0.28757697343826294 0.2919096350669861 0.2974321246147156 0.30412620306015015 0.3101852238178253 0.31293031573295593 0.31173041462898254 0.31200647354125977 0.31643787026405334 0.3226405680179596 0.33135539293289185 0.3442952632904053 0.3607310354709625 0.37769126892089844 0.38771292567253113 0.3854190707206726 0.37552234530448914 0.36437416076660156 0.35301434993743896 0.34029337763786316 0.3268333971500397 0.31639185547828674 0.31317082047462463 0.31620898842811584 0.31643491983413696 30442.5687 41538.7379 15.196114730939069 43.482395133432554 +0.37875914573669434 0.4469207227230072 0.49604201316833496 0.5680999159812927 0.6705905199050903 0.7483171224594116 0.80452561378479 0.8658115863800049 0.9279407262802124 0.9807824492454529 1.0223487615585327 1.0514615774154663 1.0463922023773193 1.0112226009368896 0.9982134103775024 1.004634141921997 0.9877952933311462 0.9317412972450256 0.8688726425170898 0.791929304599762 0.6982804536819458 0.6116718649864197 0.5463566184043884 0.4956464171409607 0.4562545120716095 0.43035486340522766 0.41308432817459106 0.4023517668247223 0.40038397908210754 0.4071796238422394 0.4212566614151001 0.44529813528060913 0.47869226336479187 0.5134111642837524 0.5476288199424744 0.5924862027168274 0.6646744608879089 0.7205690741539001 0.7406251430511475 0.7573677897453308 0.7730262279510498 0.7530763149261475 0.701831042766571 0.6527606844902039 0.6117518544197083 0.5808829665184021 0.5582142472267151 0.5362958312034607 0.5081617832183838 0.4623250961303711 0.41480353474617004 0.3816410005092621 0.3512253761291504 0.3229435384273529 0.30036529898643494 0.28829801082611084 0.28772664070129395 0.29815641045570374 0.31810328364372253 0.33310839533805847 0.34295332431793213 0.3576355576515198 0.37281879782676697 0.37368515133857727 0.36629509925842285 0.3603748083114624 0.35585665702819824 0.3474416136741638 0.33159855008125305 0.31616654992103577 0.3076492249965668 0.307073712348938 0.3140259385108948 0.3209126889705658 0.3253902792930603 0.3307969272136688 0.3362623155117035 0.34198322892189026 0.3472789525985718 0.3470509350299835 0.3400651216506958 0.3291180729866028 0.31915709376335144 0.3109745383262634 0.3023119568824768 0.2948138117790222 0.28782516717910767 0.27949029207229614 0.2736770212650299 0.2739221751689911 0.27921369671821594 0.2852224111557007 0.2887378931045532 0.2893288731575012 0.28667038679122925 0.2830811142921448 0.28239449858665466 0.28517019748687744 0.28917649388313293 0.2914784848690033 0.2913095951080322 0.2914259135723114 0.29324576258659363 0.2956298291683197 0.2981545031070709 0.3011481463909149 0.3054879605770111 0.3107515871524811 0.31411612033843994 0.31555652618408203 0.3172118663787842 0.31911471486091614 0.32280173897743225 0.33204859495162964 0.3453712463378906 0.357761949300766 0.3699503242969513 0.38311585783958435 0.39259737730026245 0.395723819732666 0.39234602451324463 0.38097503781318665 0.3659316301345825 0.3534175157546997 0.34347930550575256 0.33371132612228394 0.3236602544784546 0.3152346611022949 0.30779775977134705 30445.38885 41538.7379 15.717131304491499 46.21617319326819 +0.3608156144618988 0.4259406626224518 0.47818616032600403 0.5471063256263733 0.6347803473472595 0.7001804113388062 0.7520433068275452 0.8171277642250061 0.8950353264808655 0.9654224514961243 1.013027548789978 1.0263880491256714 0.9852103590965271 0.941172182559967 0.931695818901062 0.9181087017059326 0.8757404685020447 0.8307337164878845 0.7877539992332458 0.7257715463638306 0.6523596048355103 0.5768492817878723 0.5085425972938538 0.456727534532547 0.4192277491092682 0.3939008414745331 0.3818787932395935 0.3828960657119751 0.389323353767395 0.39450258016586304 0.39829221367836 0.40605780482292175 0.4275314211845398 0.4643791615962982 0.505535900592804 0.5479178428649902 0.5994552969932556 0.6376073360443115 0.6582133769989014 0.6799547672271729 0.6931027770042419 0.6702796816825867 0.6343024969100952 0.6056128144264221 0.5789087414741516 0.5561301112174988 0.53394615650177 0.4996113181114197 0.4577721953392029 0.4083678126335144 0.36549386382102966 0.3386378884315491 0.3173430263996124 0.2995651960372925 0.2844037711620331 0.27193325757980347 0.26600706577301025 0.2700923979282379 0.2851560115814209 0.30088505148887634 0.3138630986213684 0.3285767436027527 0.3413139879703522 0.3445935547351837 0.3396775424480438 0.330121785402298 0.3199063241481781 0.30752673745155334 0.2904285490512848 0.27791693806648254 0.2726101279258728 0.27176886796951294 0.2783729135990143 0.2872854471206665 0.29147452116012573 0.29573073983192444 0.30301201343536377 0.3096592128276825 0.3131972551345825 0.31535086035728455 0.3140628933906555 0.3053463399410248 0.2954469323158264 0.2890409231185913 0.280372679233551 0.2706373333930969 0.2643801271915436 0.25798389315605164 0.2508365511894226 0.24706313014030457 0.2483857423067093 0.25367772579193115 0.2591390609741211 0.26199933886528015 0.2643854320049286 0.2681591808795929 0.2714567184448242 0.27293530106544495 0.2729243338108063 0.27181246876716614 0.27032458782196045 0.2693708539009094 0.26829567551612854 0.2665247321128845 0.2669430077075958 0.271585613489151 0.2774175703525543 0.28121861815452576 0.2841823399066925 0.28875136375427246 0.2948462665081024 0.3012498915195465 0.30834972858428955 0.3174125552177429 0.3262895941734314 0.33198782801628113 0.3391663730144501 0.35144802927970886 0.3615659177303314 0.3633808195590973 0.3589021563529968 0.3500611186027527 0.33608290553092957 0.3192422091960907 0.30552980303764343 0.29612672328948975 0.2880210280418396 0.2813362777233124 0.2759957015514374 30442.5687 41541.616519999996 14.381547746983568 42.02895298858711 +0.3729221224784851 0.44012895226478577 0.4914250373840332 0.5655630230903625 0.6647416949272156 0.7444058060646057 0.8126416206359863 0.8799846172332764 0.9443001747131348 0.9979190826416016 1.0210847854614258 1.0208030939102173 1.0111762285232544 0.992798924446106 0.9904224276542664 0.99041348695755 0.9595239162445068 0.908574640750885 0.846463143825531 0.7647848725318909 0.6809067726135254 0.6017272472381592 0.5331747531890869 0.48201125860214233 0.44443103671073914 0.41660502552986145 0.3969760835170746 0.38763803243637085 0.38977357745170593 0.4000709354877472 0.41259172558784485 0.4278537333011627 0.45189592242240906 0.48642393946647644 0.5247828960418701 0.5645804405212402 0.612518310546875 0.6483836770057678 0.6727944016456604 0.7076162695884705 0.7434014678001404 0.7206994891166687 0.6666464805603027 0.63228839635849 0.608867883682251 0.5807878971099854 0.5441436171531677 0.5172581076622009 0.4963454604148865 0.45485949516296387 0.401254266500473 0.36339372396469116 0.3367786109447479 0.31736981868743896 0.29844656586647034 0.28279122710227966 0.27746984362602234 0.2811555564403534 0.2927308678627014 0.3071295917034149 0.3210527002811432 0.33639973402023315 0.3501872718334198 0.3525633215904236 0.34586936235427856 0.33730486035346985 0.3312234878540039 0.32529526948928833 0.31066590547561646 0.2939175069332123 0.286742240190506 0.28868338465690613 0.2973419427871704 0.3067079484462738 0.31102290749549866 0.31296807527542114 0.3165799379348755 0.3216167390346527 0.32459816336631775 0.32458773255348206 0.32075992226600647 0.31120601296424866 0.3001273572444916 0.2915954291820526 0.28556665778160095 0.28158968687057495 0.2759927809238434 0.26627132296562195 0.25822049379348755 0.25609999895095825 0.2582840323448181 0.26162636280059814 0.26389646530151367 0.26584580540657043 0.269505113363266 0.2740560472011566 0.2757222354412079 0.2737424373626709 0.27331092953681946 0.2753473222255707 0.2754512131214142 0.2745696008205414 0.27530866861343384 0.2763848900794983 0.27731868624687195 0.2794644236564636 0.28307804465293884 0.2873600125312805 0.29181772470474243 0.29564568400382996 0.29717445373535156 0.2980411946773529 0.30308812856674194 0.31369927525520325 0.3267776072025299 0.3403771221637726 0.3552534282207489 0.3692227900028229 0.3773849606513977 0.37742289900779724 0.3699462413787842 0.3581613600254059 0.3446747362613678 0.3301258683204651 0.3174242079257965 0.3073962330818176 0.2965550720691681 0.28561556339263916 0.27806076407432556 30445.38885 41541.616519999996 14.87720727584366 44.091357683377474 diff --git a/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin4.tab b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin4.tab new file mode 100644 index 000000000..87bcee76b --- /dev/null +++ b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin4.tab @@ -0,0 +1,7 @@ +1697.131066748047 1693.2739506872558 1689.416834626465 1685.5597185656738 1681.702602504883 1677.8454864440919 1673.9883703833011 1670.13125432251 1666.2741382617191 1662.417022200928 1658.5599061401367 1654.702790079346 1650.8456740185547 1646.988557957764 1643.1314418969728 1639.274325836182 1635.4172097753908 1631.5600937145996 1627.7029776538088 1623.8458615930176 1619.9887455322269 1616.1316294714356 1612.2745134106449 1608.4173973498537 1604.5602812890625 1600.7031652282717 1596.8460491674805 1592.9889331066897 1589.1318170458985 1585.2747009851078 1581.4175849243165 1577.5604688635258 1573.7033528027346 1569.8462367419434 1565.9891206811526 1562.1320046203614 1558.2748885595706 1554.4177724987794 1550.5606564379887 1546.7035403771974 1542.8464243164062 1538.9893082556155 1535.1321921948243 1531.2750761340335 1527.4179600732423 1523.5608440124515 1519.7037279516603 1515.846611890869 1511.9894958300783 1508.1323797692871 1504.2752637084964 1500.4181476477052 1496.5610315869144 1492.7039155261232 1488.8467994653324 1484.9896834045412 1481.13256734375 1477.2754512829592 1473.418335222168 1469.5612191613773 1465.704103100586 1461.8469870397953 1457.989870979004 1454.1327549182129 1450.275638857422 1446.418522796631 1442.5614067358401 1438.704290675049 1434.8471746142582 1430.990058553467 1427.1329424926757 1423.275826431885 1419.4187103710938 1415.561594310303 1411.7044782495118 1407.847362188721 1403.9902461279298 1400.133130067139 1396.2760140063479 1392.4188979455566 1388.5617818847659 1384.7046658239747 1380.847549763184 1376.9904337023927 1373.133317641602 1369.2762015808107 1365.4190855200195 1361.5619694592287 1357.7048533984375 1353.8477373376468 1349.9906212768556 1346.1335052160648 1342.2763891552736 1338.4192730944824 1334.5621570336916 1330.7050409729004 1326.8479249121096 1322.9908088513184 1319.1336927905277 1315.2765767297365 1311.4194606689457 1307.5623446081545 1303.7052285473633 1299.8481124865725 1295.9909964257813 1292.1338803649905 1288.2767643041993 1284.4196482434086 1280.5625321826174 1276.7054161218261 1272.8483000610354 1268.9911840002442 1265.1340679394534 1261.2769518786622 1257.4198358178714 1253.5627197570802 1249.705603696289 1245.8484876354983 1241.991371574707 1238.1342555139163 1234.277139453125 1230.4200233923343 1226.562907331543 1222.7057912707523 1218.8486752099611 1214.99155914917 1211.1344430883792 1207.277327027588 1203.4202109667972 map_x map_y 1214.0 - 1258.0 1500.0 - 1580.0 +continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous + meta meta meta meta +0.3949830234050751 0.4622531533241272 0.5109723210334778 0.5819476842880249 0.6732906699180603 0.7399584054946899 0.8056941032409668 0.8803262114524841 0.9407079219818115 0.9959824681282043 1.0247737169265747 0.9988774061203003 0.9598121643066406 0.9596822261810303 0.9756194353103638 0.9531159996986389 0.8880895376205444 0.8291646242141724 0.7852953672409058 0.7326091527938843 0.6583097577095032 0.5755128264427185 0.5128992199897766 0.47360721230506897 0.4461856484413147 0.424794465303421 0.40726786851882935 0.39642640948295593 0.3955315947532654 0.3990853428840637 0.40200623869895935 0.41744357347488403 0.4541429877281189 0.4928371012210846 0.523593544960022 0.5572065114974976 0.6082401275634766 0.6535071730613708 0.6752548813819885 0.6942375302314758 0.7089064717292786 0.6849415898323059 0.648251473903656 0.6290637254714966 0.611190140247345 0.5820888876914978 0.5479511022567749 0.5251440405845642 0.5092036724090576 0.4710317552089691 0.41165193915367126 0.368015855550766 0.33563244342803955 0.30891987681388855 0.289467990398407 0.279835045337677 0.2776188254356384 0.281124472618103 0.2969658076763153 0.3199588358402252 0.3370678722858429 0.35005685687065125 0.3592534065246582 0.3598088026046753 0.3555058240890503 0.34791675209999084 0.3381218910217285 0.32693901658058167 0.3126853406429291 0.3007925748825073 0.2955957353115082 0.2945536673069 0.29722654819488525 0.30562835931777954 0.3160330057144165 0.32335811853408813 0.32722195982933044 0.33106622099876404 0.333890825510025 0.3307388126850128 0.32467377185821533 0.31839045882225037 0.3102380931377411 0.30023348331451416 0.28814268112182617 0.2750730514526367 0.26571476459503174 0.2631886601448059 0.2642560303211212 0.2657497227191925 0.2698196768760681 0.2753346860408783 0.27848049998283386 0.27970898151397705 0.2795354127883911 0.2767869830131531 0.27504852414131165 0.2782919108867645 0.28145065903663635 0.2807522118091583 0.2820216417312622 0.28606170415878296 0.2876238524913788 0.2858695089817047 0.28583207726478577 0.29170745611190796 0.2989623248577118 0.3013303577899933 0.3022397756576538 0.3061143457889557 0.31094178557395935 0.31485098600387573 0.3188069462776184 0.32449349761009216 0.333775132894516 0.34593096375465393 0.3592696785926819 0.3726845979690552 0.3809838593006134 0.37974658608436584 0.37090665102005005 0.3579893112182617 0.3460439443588257 0.33749645948410034 0.3274995684623718 0.3147842586040497 0.3056890070438385 0.3015490472316742 0.2963547110557556 30442.5687 41538.7379 15.053673351479718 43.89851045568374 +0.36599868535995483 0.44001543521881104 0.4966375231742859 0.5643589496612549 0.654793381690979 0.7409048080444336 0.8192135691642761 0.8847960829734802 0.9369638562202454 0.9906289577484131 1.025296688079834 1.0149723291397095 0.9805884957313538 0.9636447429656982 0.9588003158569336 0.9524202942848206 0.9314351677894592 0.8927587270736694 0.8397254943847656 0.7675902843475342 0.6844693422317505 0.6059010624885559 0.5474121570587158 0.5043894052505493 0.468307226896286 0.44075509905815125 0.4207476079463959 0.4080858826637268 0.40591961145401 0.4134867191314697 0.42650675773620605 0.4475072920322418 0.47888901829719543 0.5122790336608887 0.5369526743888855 0.5554997324943542 0.5947977304458618 0.647955060005188 0.6778163313865662 0.6932549476623535 0.6977417469024658 0.6872305870056152 0.659528911113739 0.6245843768119812 0.5957351922988892 0.5746957659721375 0.5465317368507385 0.5116745233535767 0.47723180055618286 0.4333028197288513 0.3936629891395569 0.36897724866867065 0.345966637134552 0.3255443572998047 0.31004011631011963 0.29891106486320496 0.2932963967323303 0.2937392592430115 0.3078584671020508 0.33370327949523926 0.35201096534729004 0.3585779666900635 0.36050570011138916 0.3624379336833954 0.3620472550392151 0.35969817638397217 0.35452911257743835 0.3419364094734192 0.3230227828025818 0.30832669138908386 0.30204203724861145 0.3018741011619568 0.30683496594429016 0.3151794970035553 0.3218154311180115 0.3262678384780884 0.33061009645462036 0.33248963952064514 0.3305680453777313 0.32937225699424744 0.3280726373195648 0.322355717420578 0.3143385052680969 0.30674803256988525 0.2977624237537384 0.28612422943115234 0.27380654215812683 0.26605281233787537 0.2670673131942749 0.27401211857795715 0.2821645736694336 0.28739145398139954 0.289187490940094 0.2906554937362671 0.29101991653442383 0.28759765625 0.28305813670158386 0.28146880865097046 0.2823540270328522 0.2834238111972809 0.28334492444992065 0.28242823481559753 0.2830897569656372 0.285215824842453 0.286749929189682 0.2894335985183716 0.2963193953037262 0.30561134219169617 0.31135934591293335 0.3125182092189789 0.3135771155357361 0.31644806265830994 0.3219490647315979 0.3305686414241791 0.3386459946632385 0.34468361735343933 0.35293155908584595 0.3640737235546112 0.3740508556365967 0.3799596130847931 0.3787302076816559 0.3690877854824066 0.3545362651348114 0.33818575739860535 0.32251599431037903 0.31119340658187866 0.3069508969783783 0.30643993616104126 0.3014766573905945 30445.38885 41538.7379 15.056927844654062 43.61475352701898 +0.36250585317611694 0.42431044578552246 0.4834742844104767 0.5558268427848816 0.6433207988739014 0.7237451076507568 0.797504723072052 0.8740603923797607 0.9462519288063049 1.0028680562973022 1.0236170291900635 0.9993492960929871 0.9659426808357239 0.929129958152771 0.8976386189460754 0.8773003220558167 0.845932126045227 0.804290771484375 0.7517927289009094 0.6770941019058228 0.5976353883743286 0.5313588380813599 0.48177453875541687 0.44140711426734924 0.40849852561950684 0.3899365961551666 0.38149017095565796 0.3739112615585327 0.3684139847755432 0.372007817029953 0.38562244176864624 0.40915170311927795 0.4383581876754761 0.46522119641304016 0.4911789894104004 0.5281954407691956 0.5901359915733337 0.6282098889350891 0.6299937963485718 0.6347435712814331 0.6456948518753052 0.6421006917953491 0.6224752068519592 0.6007646918296814 0.5784657001495361 0.5487658381462097 0.5032517313957214 0.4633730351924896 0.4398660957813263 0.41094517707824707 0.3713396489620209 0.3397798538208008 0.315258264541626 0.2960793673992157 0.2789282202720642 0.26473933458328247 0.2583105266094208 0.26161065697669983 0.276593953371048 0.29428234696388245 0.30759015679359436 0.3208509385585785 0.33403608202934265 0.3378518223762512 0.3314681351184845 0.3205536901950836 0.3096092939376831 0.29909756779670715 0.2854691445827484 0.27216678857803345 0.2648516893386841 0.26480165123939514 0.27259862422943115 0.28223392367362976 0.28807657957077026 0.2966751158237457 0.3103998601436615 0.31771647930145264 0.3139994740486145 0.31038033962249756 0.30780771374702454 0.30000224709510803 0.2885487973690033 0.2776309549808502 0.2691199779510498 0.26336920261383057 0.2575911581516266 0.2499367892742157 0.24667014181613922 0.2502342164516449 0.2533777952194214 0.25388017296791077 0.2556212842464447 0.2578236758708954 0.25818225741386414 0.2583445906639099 0.2599364221096039 0.2620580792427063 0.2627926170825958 0.2631688117980957 0.2642405927181244 0.263955682516098 0.2622736394405365 0.2618711590766907 0.2638363242149353 0.2683615982532501 0.2739871144294739 0.27764204144477844 0.2804603576660156 0.28473037481307983 0.28941360116004944 0.2937960624694824 0.2986640930175781 0.30610325932502747 0.316412091255188 0.3255343437194824 0.3314375877380371 0.33745360374450684 0.3465556502342224 0.355802059173584 0.358920693397522 0.35263997316360474 0.33765292167663574 0.3183898329734802 0.30118611454963684 0.2887457013130188 0.28239473700523376 0.2824958264827728 0.2819530665874481 30442.5687 41541.616519999996 14.148486745442884 40.914534151939826 +0.3650876581668854 0.44027072191238403 0.49740421772003174 0.5676716566085815 0.6565104126930237 0.7217820286750793 0.776906430721283 0.8554854989051819 0.9431904554367065 0.99639892578125 0.9918259382247925 0.9632425308227539 0.9571559429168701 0.9453587532043457 0.9196834564208984 0.9045694470405579 0.8967841863632202 0.8714707493782043 0.8187240958213806 0.7500607967376709 0.6737703084945679 0.5944964289665222 0.5322104096412659 0.48620209097862244 0.4495582580566406 0.4267524480819702 0.4147963225841522 0.4065539836883545 0.40079763531684875 0.40120112895965576 0.4117395281791687 0.4343542158603668 0.4588378369808197 0.4770737290382385 0.49635985493659973 0.5230758190155029 0.5750504732131958 0.6321943402290344 0.6574925780296326 0.6613973379135132 0.6457144618034363 0.6232727766036987 0.6174584627151489 0.6194400787353516 0.6105873584747314 0.5773681402206421 0.5304786562919617 0.4934249520301819 0.45931971073150635 0.41730549931526184 0.38470304012298584 0.3595018684864044 0.3293219804763794 0.30435964465141296 0.2891426980495453 0.2798253893852234 0.2746725082397461 0.2748556435108185 0.2886051833629608 0.3117738366127014 0.32717078924179077 0.33106401562690735 0.3289177715778351 0.33031389117240906 0.33271220326423645 0.3304341435432434 0.32225725054740906 0.30900219082832336 0.2952777147293091 0.2869744896888733 0.28450044989585876 0.2863030433654785 0.29052266478538513 0.29561755061149597 0.3012177348136902 0.3077249825000763 0.3149780333042145 0.3194979727268219 0.31837978959083557 0.3156931400299072 0.31331557035446167 0.3074597716331482 0.29792141914367676 0.28665927052497864 0.2769920229911804 0.2717728316783905 0.2680080831050873 0.26393961906433105 0.2608543634414673 0.25888293981552124 0.25867512822151184 0.2605808675289154 0.263666570186615 0.26618891954421997 0.2665948271751404 0.2663698196411133 0.2670312225818634 0.26882821321487427 0.27096620202064514 0.2717668414115906 0.2718110680580139 0.2726369798183441 0.27475622296333313 0.2783312201499939 0.2822757363319397 0.285504013299942 0.2890436351299286 0.29262956976890564 0.292468398809433 0.2886587381362915 0.28673070669174194 0.2884071469306946 0.29260167479515076 0.30139777064323425 0.31254521012306213 0.32084983587265015 0.329580694437027 0.34177514910697937 0.35234349966049194 0.3568665683269501 0.3554323613643646 0.3491654396057129 0.3388620913028717 0.32499754428863525 0.3104616105556488 0.29853302240371704 0.28830283880233765 0.27974289655685425 0.27512240409851074 30445.38885 41541.616519999996 14.216843459338445 41.87857263213592 diff --git a/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin_model-results.tab b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin_model-results.tab new file mode 100644 index 000000000..d23cf0c89 --- /dev/null +++ b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin_model-results.tab @@ -0,0 +1,19 @@ +1697.131066748047 1693.2739506872558 1689.416834626465 1685.5597185656738 1681.702602504883 1677.8454864440919 1673.9883703833011 1670.13125432251 1666.2741382617191 1662.417022200928 1658.5599061401367 1654.702790079346 1650.8456740185547 1646.988557957764 1643.1314418969728 1639.274325836182 1635.4172097753908 1631.5600937145996 1627.7029776538088 1623.8458615930176 1619.9887455322269 1616.1316294714356 1612.2745134106449 1608.4173973498537 1604.5602812890625 1600.7031652282717 1596.8460491674805 1592.9889331066897 1589.1318170458985 1585.2747009851078 1581.4175849243165 1577.5604688635258 1573.7033528027346 1569.8462367419434 1565.9891206811526 1562.1320046203614 1558.2748885595706 1554.4177724987794 1550.5606564379887 1546.7035403771974 1542.8464243164062 1538.9893082556155 1535.1321921948243 1531.2750761340335 1527.4179600732423 1523.5608440124515 1519.7037279516603 1515.846611890869 1511.9894958300783 1508.1323797692871 1504.2752637084964 1500.4181476477052 1496.5610315869144 1492.7039155261232 1488.8467994653324 1484.9896834045412 1481.13256734375 1477.2754512829592 1473.418335222168 1469.5612191613773 1465.704103100586 1461.8469870397953 1457.989870979004 1454.1327549182129 1450.275638857422 1446.418522796631 1442.5614067358401 1438.704290675049 1434.8471746142582 1430.990058553467 1427.1329424926757 1423.275826431885 1419.4187103710938 1415.561594310303 1411.7044782495118 1407.847362188721 1403.9902461279298 1400.133130067139 1396.2760140063479 1392.4188979455566 1388.5617818847659 1384.7046658239747 1380.847549763184 1376.9904337023927 1373.133317641602 1369.2762015808107 1365.4190855200195 1361.5619694592287 1357.7048533984375 1353.8477373376468 1349.9906212768556 1346.1335052160648 1342.2763891552736 1338.4192730944824 1334.5621570336916 1330.7050409729004 1326.8479249121096 1322.9908088513184 1319.1336927905277 1315.2765767297365 1311.4194606689457 1307.5623446081545 1303.7052285473633 1299.8481124865725 1295.9909964257813 1292.1338803649905 1288.2767643041993 1284.4196482434086 1280.5625321826174 1276.7054161218261 1272.8483000610354 1268.9911840002442 1265.1340679394534 1261.2769518786622 1257.4198358178714 1253.5627197570802 1249.705603696289 1245.8484876354983 1241.991371574707 1238.1342555139163 1234.277139453125 1230.4200233923343 1226.562907331543 1222.7057912707523 1218.8486752099611 1214.99155914917 1211.1344430883792 1207.277327027588 1203.4202109667972 map_x map_y 1214.0 - 1258.0 1500.0 - 1580.0 Polarisation Angle R-squared (1214.0 - 1258.0) a0 (1214.0 - 1258.0) a1 (1214.0 - 1258.0) a2 (1214.0 - 1258.0) R-squared (1500.0 - 1580.0) a0 (1500.0 - 1580.0) a1 (1500.0 - 1580.0) a2 (1500.0 - 1580.0) +continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous 0.0\ Degrees 45.0\ Degrees 90.0\ Degrees 135.0\ Degrees continuous continuous continuous continuous continuous continuous continuous continuous + meta meta meta meta meta meta meta meta meta meta meta meta meta +0.3711118698120117 0.43782272934913635 0.49062955379486084 0.5547452569007874 0.6374028921127319 0.711500346660614 0.7876919507980347 0.8770861625671387 0.9559172987937927 1.0098530054092407 1.0404753684997559 1.0543735027313232 1.0619465112686157 1.0437582731246948 1.0013220310211182 0.9536964297294617 0.897933840751648 0.8533709645271301 0.8181004524230957 0.7584443688392639 0.6689296364784241 0.5782220363616943 0.513115644454956 0.46961721777915955 0.43171659111976624 0.3991532325744629 0.3810955286026001 0.37965840101242065 0.386007159948349 0.3947145342826843 0.4098324477672577 0.4343760311603546 0.46137940883636475 0.49168214201927185 0.528336226940155 0.5667646527290344 0.6178287267684937 0.6604256629943848 0.6766932010650635 0.6885275840759277 0.6986993551254272 0.6930281519889832 0.6724157929420471 0.6501829028129578 0.6263569593429565 0.5885990858078003 0.5376056432723999 0.5005533695220947 0.4779326319694519 0.4443279504776001 0.39699268341064453 0.36137861013412476 0.33436083793640137 0.30747178196907043 0.2803654670715332 0.2625480592250824 0.2592535614967346 0.27015992999076843 0.29309216141700745 0.31150364875793457 0.3194276988506317 0.328142374753952 0.3443129062652588 0.35353028774261475 0.3476772606372833 0.33774372935295105 0.32855379581451416 0.3200712502002716 0.31163617968559265 0.3032289445400238 0.2943628430366516 0.28816357254981995 0.2909632623195648 0.29872336983680725 0.3025616407394409 0.3057458698749542 0.3115512728691101 0.31618112325668335 0.3176253139972687 0.3175846040248871 0.3153497576713562 0.3088831901550293 0.3000914454460144 0.29377707839012146 0.2888909578323364 0.28027477860450745 0.270122230052948 0.26286780834198 0.2575746774673462 0.2533765435218811 0.2540722191333771 0.26083439588546753 0.2694004774093628 0.27414125204086304 0.2728372812271118 0.26937466859817505 0.2672775387763977 0.2684006989002228 0.2723020315170288 0.27508431673049927 0.2749064266681671 0.274681955575943 0.2775912284851074 0.28367695212364197 0.2893185019493103 0.290900319814682 0.2906703054904938 0.2926110625267029 0.2950325608253479 0.2977401614189148 0.3037301301956177 0.3114270567893982 0.318378210067749 0.32530495524406433 0.3349395990371704 0.3490666151046753 0.3638021945953369 0.3744945526123047 0.3803212642669678 0.3803481459617615 0.37394478917121887 0.3625723719596863 0.34696418046951294 0.3287803828716278 0.31259098649024963 0.3022864758968353 0.2975075840950012 0.2938818633556366 0.2872605323791504 30442.5687 41538.7379 15.009961445779307 43.87936019111817 0.0 Degrees 0.9998996542510169 0.04788184003105633 -0.0930766425798808 15.10229663993498 0.4761749412326489 0.1699951093342037 0.198482528841064 43.874691613741085 +0.388348788022995 0.44867801666259766 0.502106249332428 0.5762503743171692 0.6664558053016663 0.739630937576294 0.8222108483314514 0.9173783659934998 0.9785887002944946 1.0107851028442383 1.0361779928207397 1.0637257099151611 1.0711760520935059 1.0423812866210938 1.025393009185791 0.9986843466758728 0.9373337626457214 0.8785869479179382 0.8271448612213135 0.7655133605003357 0.6908860802650452 0.6117749810218811 0.5471857190132141 0.4971246123313904 0.45541316270828247 0.42525458335876465 0.4062337279319763 0.39754077792167664 0.39981767535209656 0.41045162081718445 0.42612242698669434 0.4495392143726349 0.48013657331466675 0.509360134601593 0.5352477431297302 0.5706249475479126 0.6430520415306091 0.7104148864746094 0.7287077903747559 0.7300795912742615 0.7207353115081787 0.6928030848503113 0.6642997860908508 0.6465807557106018 0.6357985734939575 0.6169293522834778 0.5714240670204163 0.5247028470039368 0.49503496289253235 0.4588204622268677 0.41067439317703247 0.37448638677597046 0.34704023599624634 0.32218214869499207 0.29583585262298584 0.27490201592445374 0.26934197545051575 0.28096309304237366 0.3069058060646057 0.3270772397518158 0.33470597863197327 0.34152284264564514 0.35194724798202515 0.3573232889175415 0.3541431128978729 0.34866204857826233 0.3427005112171173 0.3312859833240509 0.3122206926345825 0.2955722510814667 0.2872144877910614 0.2867285907268524 0.2918354272842407 0.2956002652645111 0.2986833155155182 0.3060479462146759 0.31676867604255676 0.3262639045715332 0.330106645822525 0.32593291997909546 0.31699928641319275 0.30795541405677795 0.3018266558647156 0.29686442017555237 0.28721868991851807 0.2752007842063904 0.2667289972305298 0.2609139084815979 0.25778260827064514 0.2584190368652344 0.2610763907432556 0.2639258801937103 0.26595649123191833 0.26701226830482483 0.2679225206375122 0.2679891288280487 0.2669326663017273 0.2678163945674896 0.2720436155796051 0.2770630121231079 0.28001782298088074 0.27851158380508423 0.2751752436161041 0.276258647441864 0.2823660373687744 0.2899717390537262 0.29827389121055603 0.30697736144065857 0.3102128207683563 0.30654236674308777 0.30582261085510254 0.3128655254840851 0.3222534656524658 0.32939496636390686 0.33602944016456604 0.34821176528930664 0.3637096881866455 0.37178686261177063 0.3715791702270508 0.37046146392822266 0.36934414505958557 0.36342424154281616 0.350017786026001 0.33207470178604126 0.3140036165714264 0.2998875081539154 0.29220956563949585 0.2874009907245636 0.2815419137477875 30445.38885 41538.7379 14.936959331411803 45.349811063094954 0.0 Degrees 0.9324530395726834 0.11528954707161643 -0.3900859865428774 15.249631354870715 0.36275784996581106 0.671080814707999 -0.43318106508974763 45.03441323505067 +0.366887629032135 0.43671754002571106 0.49220016598701477 0.5703327059745789 0.6657547950744629 0.731933057308197 0.7937033176422119 0.8747525215148926 0.9398021697998047 0.9730452299118042 1.0031681060791016 1.0538406372070312 1.0965853929519653 1.0494016408920288 0.9825043678283691 0.9511120319366455 0.9302560687065125 0.8842418789863586 0.8129315972328186 0.7183979153633118 0.6205475330352783 0.5415375232696533 0.48775240778923035 0.44761666655540466 0.41458284854888916 0.39335882663726807 0.3796997666358948 0.36864838004112244 0.36498430371284485 0.3680277466773987 0.3732655644416809 0.38918817043304443 0.42386338114738464 0.46311137080192566 0.4917769134044647 0.5237820148468018 0.5971131920814514 0.6691277027130127 0.6892750859260559 0.7003340125083923 0.7168111801147461 0.6999649405479431 0.6541981101036072 0.6189929246902466 0.5926592946052551 0.5696735382080078 0.5413363575935364 0.5053853988647461 0.465243935585022 0.41113007068634033 0.36086025834083557 0.32808783650398254 0.3003191649913788 0.2793380916118622 0.26471295952796936 0.2541550099849701 0.24993854761123657 0.25305330753326416 0.2655698359012604 0.27899375557899475 0.2841063439846039 0.28888702392578125 0.30285078287124634 0.3161625862121582 0.3197145164012909 0.3178388774394989 0.31100529432296753 0.29754751920700073 0.28191861510276794 0.2750825583934784 0.27559351921081543 0.27823397517204285 0.2830919921398163 0.2850538194179535 0.2825995981693268 0.28359857201576233 0.2883332371711731 0.289949893951416 0.2929544150829315 0.30135759711265564 0.30265331268310547 0.2906714677810669 0.2753030061721802 0.2651992440223694 0.25924843549728394 0.25318726897239685 0.24550479650497437 0.23828820884227753 0.23315896093845367 0.23029816150665283 0.2334306240081787 0.24293583631515503 0.2510787546634674 0.25073981285095215 0.24615781009197235 0.2464907467365265 0.2522513270378113 0.2587389051914215 0.262591689825058 0.263126403093338 0.26156532764434814 0.2589862048625946 0.2572213411331177 0.2594248950481415 0.2655974328517914 0.27193424105644226 0.27772676944732666 0.28423818945884705 0.28888431191444397 0.29118603467941284 0.2921951413154602 0.29164180159568787 0.2948339283466339 0.3066503405570984 0.32164159417152405 0.333238422870636 0.34339842200279236 0.355623722076416 0.36564287543296814 0.36494630575180054 0.35201695561408997 0.3341171145439148 0.3175579309463501 0.30399125814437866 0.2928829789161682 0.28347793221473694 0.2780621647834778 0.276618093252182 0.27352389693260193 30442.5687 41541.616519999996 14.140093941838566 42.63377488797279 0.0 Degrees 0.9052486894719146 0.23198983049333044 -0.12072690257494645 14.320648710203532 0.5510780301748821 0.5808993859007311 0.3024109496913203 41.91339873814995 +0.36428871750831604 0.43003931641578674 0.47958770394325256 0.5450240969657898 0.634536862373352 0.7099695801734924 0.7796786427497864 0.8637834787368774 0.942089855670929 0.9903811812400818 1.0105667114257812 1.0208871364593506 1.005222201347351 0.963545024394989 0.9371297359466553 0.9139838814735413 0.8946059942245483 0.8827653527259827 0.840722918510437 0.7564958333969116 0.6611053943634033 0.5774503946304321 0.5202354192733765 0.48433250188827515 0.45376747846603394 0.4260224401950836 0.4059300422668457 0.3930695950984955 0.38632991909980774 0.3889123797416687 0.4001465141773224 0.4183931052684784 0.4428093135356903 0.47215187549591064 0.5050704479217529 0.5453080534934998 0.6085248589515686 0.658994734287262 0.668915331363678 0.6675289869308472 0.6717699766159058 0.6808158755302429 0.6681414842605591 0.6372467875480652 0.6000738739967346 0.5683797597885132 0.544323742389679 0.516345202922821 0.48224183917045593 0.4387160539627075 0.39499184489250183 0.3595888912677765 0.3304763436317444 0.3092094361782074 0.28860795497894287 0.26972246170043945 0.2605076730251312 0.26343077421188354 0.28140151500701904 0.29994896054267883 0.30823972821235657 0.31485551595687866 0.32437241077423096 0.33080095052719116 0.3303925395011902 0.3248642385005951 0.3165438175201416 0.3061983585357666 0.2946605384349823 0.2872968912124634 0.2868692874908447 0.2896806299686432 0.2909656763076782 0.2920180857181549 0.2945660948753357 0.2972028851509094 0.29964983463287354 0.3004482090473175 0.29766783118247986 0.2939799129962921 0.2927486002445221 0.2923987805843353 0.2889113426208496 0.2816716730594635 0.27281782031059265 0.2626931965351105 0.2514967918395996 0.24271203577518463 0.23827271163463593 0.23637256026268005 0.2380509227514267 0.24506837129592896 0.25348952412605286 0.25623422861099243 0.25412917137145996 0.2532842457294464 0.2547925114631653 0.2577175199985504 0.26068350672721863 0.2616606056690216 0.2597542703151703 0.2559884488582611 0.2536808252334595 0.256541907787323 0.2641761898994446 0.271513968706131 0.2755036950111389 0.27728980779647827 0.27779620885849 0.27858373522758484 0.28195881843566895 0.28836870193481445 0.29790475964546204 0.3091188371181488 0.317819207906723 0.3241935074329376 0.33264613151550293 0.3433806300163269 0.3505949378013611 0.35062962770462036 0.34647127985954285 0.3387751281261444 0.32535696029663086 0.3086860477924347 0.2940033972263336 0.2858646810054779 0.2827148139476776 0.2769644856452942 0.26818761229515076 30445.38885 41541.616519999996 13.949567230311496 43.05058779046659 0.0 Degrees 0.9941901147353087 0.2536980425498405 -0.46382002276927525 14.441964377513065 0.1657092533769018 0.03694686596283513 -0.5203849464554426 42.743246117510395 +0.3773364722728729 0.43966636061668396 0.49002042412757874 0.5639562606811523 0.6609355807304382 0.7364853620529175 0.8136956691741943 0.8985644578933716 0.9468745589256287 0.9731678366661072 0.9914941191673279 0.9854417443275452 0.9628058671951294 0.9528713226318359 0.9546505808830261 0.9532977342605591 0.9257292151451111 0.8693946599960327 0.8010186553001404 0.7217180728912354 0.6436004638671875 0.5754334926605225 0.5214712619781494 0.47915247082710266 0.4447232484817505 0.41765138506889343 0.3990515470504761 0.39321616291999817 0.39747321605682373 0.40612584352493286 0.4184291958808899 0.43992483615875244 0.47834911942481995 0.5266345739364624 0.5672381520271301 0.597634494304657 0.6348262429237366 0.6744903922080994 0.6967960000038147 0.7098262310028076 0.7118614912033081 0.6856943368911743 0.6489338874816895 0.6190053224563599 0.5941586494445801 0.5711410641670227 0.5421783328056335 0.5111346244812012 0.4810764491558075 0.4355677664279938 0.3860788941383362 0.3534643054008484 0.32750168442726135 0.3032616674900055 0.2819446921348572 0.26981374621391296 0.2693929970264435 0.2801830768585205 0.30366891622543335 0.3256083130836487 0.3365386128425598 0.34310561418533325 0.35129883885383606 0.3588528633117676 0.35683950781822205 0.3458286225795746 0.33076736330986023 0.31613433361053467 0.30460110306739807 0.2960743308067322 0.2915134131908417 0.29322516918182373 0.2980576753616333 0.300569623708725 0.3029937744140625 0.3091799318790436 0.3191257119178772 0.32923704385757446 0.3315645456314087 0.3225858509540558 0.31236401200294495 0.3056598901748657 0.2981754243373871 0.2894536256790161 0.2814278304576874 0.2723696827888489 0.26151928305625916 0.2525339126586914 0.25026053190231323 0.2539668083190918 0.25997182726860046 0.26598429679870605 0.27031874656677246 0.27086934447288513 0.2690020799636841 0.26832443475723267 0.2695266008377075 0.2705895006656647 0.2702696919441223 0.27155083417892456 0.2761310338973999 0.28070759773254395 0.2832408547401428 0.2835163474082947 0.28365248441696167 0.2872329354286194 0.29273301362991333 0.29702767729759216 0.2998993694782257 0.30078554153442383 0.3016831874847412 0.30665796995162964 0.31462526321411133 0.32313990592956543 0.3358403742313385 0.3547256886959076 0.3718043267726898 0.3799355626106262 0.3825741112232208 0.383433073759079 0.3778041899204254 0.3644450008869171 0.3474675118923187 0.3291182518005371 0.3145691752433777 0.3077240586280823 0.3049233853816986 0.3022094964981079 0.2970089614391327 30442.5687 41538.7379 15.14943703154183 44.23850067435577 45.0 Degrees 0.9998996542510169 0.04788184003105633 -0.0930766425798808 15.10229663993498 0.4761749412326489 0.1699951093342037 0.198482528841064 43.874691613741085 +0.37337228655815125 0.4396507143974304 0.49107563495635986 0.5586245059967041 0.646790623664856 0.7179062962532043 0.7848191857337952 0.8587467670440674 0.9132012128829956 0.9501560926437378 0.9785140156745911 0.984795868396759 0.9518576860427856 0.9169514179229736 0.9128903150558472 0.9190047979354858 0.9011522531509399 0.8552564978599548 0.7962431311607361 0.7195406556129456 0.6405887007713318 0.5768947005271912 0.5284963250160217 0.48475223779678345 0.44452735781669617 0.4175184965133667 0.4050688147544861 0.4015383720397949 0.4035366475582123 0.4095524847507477 0.41840967535972595 0.43762996792793274 0.4735090136528015 0.5144422650337219 0.5498296618461609 0.5891739130020142 0.6544406414031982 0.7074301838874817 0.721211850643158 0.7253494262695312 0.7205705046653748 0.7011243104934692 0.6794993877410889 0.6561350226402283 0.6234012842178345 0.5791003108024597 0.5371192693710327 0.5127407312393188 0.48728594183921814 0.43710267543792725 0.3880417048931122 0.358508825302124 0.3291686475276947 0.30198532342910767 0.2838975191116333 0.2756803035736084 0.27510562539100647 0.28265753388404846 0.30272212624549866 0.3223998248577118 0.3314470052719116 0.3400789797306061 0.3539663255214691 0.3615642189979553 0.35621216893196106 0.34422820806503296 0.33036601543426514 0.3164904713630676 0.30386441946029663 0.29513826966285706 0.2911766767501831 0.2941439151763916 0.302760511636734 0.30998602509498596 0.31750985980033875 0.32691699266433716 0.33109205961227417 0.3281230330467224 0.32525792717933655 0.32315510511398315 0.3174678683280945 0.31104981899261475 0.3055250942707062 0.297789067029953 0.28920844197273254 0.28300905227661133 0.27708175778388977 0.27133673429489136 0.26787322759628296 0.2659844756126404 0.26673445105552673 0.2708447575569153 0.2750791013240814 0.2769821286201477 0.2775936722755432 0.278523713350296 0.2802591919898987 0.2821207642555237 0.282520055770874 0.28267189860343933 0.2840110957622528 0.28552529215812683 0.28797078132629395 0.2903944253921509 0.29174160957336426 0.2954663932323456 0.30151888728141785 0.30476686358451843 0.30412399768829346 0.30343693494796753 0.30575087666511536 0.31121543049812317 0.3187049329280853 0.3290562331676483 0.3425249457359314 0.3562610149383545 0.36918962001800537 0.3792024254798889 0.3837013840675354 0.3848077654838562 0.3821556568145752 0.3716545104980469 0.3544897437095642 0.33635222911834717 0.3203563988208771 0.30804407596588135 0.3005572259426117 0.2961486577987671 0.29254403710365295 30445.38885 41538.7379 15.287506938801155 44.956915156436416 45.0 Degrees 0.9324530395726834 0.11528954707161643 -0.3900859865428774 15.249631354870715 0.36275784996581106 0.671080814707999 -0.43318106508974763 45.03441323505067 +0.38911929726600647 0.44554373621940613 0.4855414927005768 0.5539154410362244 0.6538650989532471 0.7315957546234131 0.8033648729324341 0.884945809841156 0.9360079765319824 0.954917311668396 0.9649530649185181 0.9849116206169128 1.008013129234314 0.9807816743850708 0.9428510069847107 0.9156916737556458 0.8764055967330933 0.825237512588501 0.7735792994499207 0.705725371837616 0.6241020560264587 0.5504984855651855 0.4957604706287384 0.45222288370132446 0.41255465149879456 0.3828220069408417 0.37051448225975037 0.37108558416366577 0.37338513135910034 0.37661170959472656 0.3874439001083374 0.41331085562705994 0.449747771024704 0.47858643531799316 0.4993457794189453 0.5276702642440796 0.5828417539596558 0.6414362788200378 0.6703454852104187 0.6750879287719727 0.6613235473632812 0.6516115069389343 0.6429095268249512 0.6263266801834106 0.6048684120178223 0.5731279253959656 0.5306711196899414 0.492236465215683 0.45757782459259033 0.40995675325393677 0.3611593246459961 0.33053696155548096 0.3058626651763916 0.2824017405509949 0.2620924711227417 0.24882546067237854 0.24321754276752472 0.24622128903865814 0.2659408152103424 0.29050007462501526 0.3000190854072571 0.30213284492492676 0.3106580674648285 0.3247032165527344 0.3296380937099457 0.3233187794685364 0.3104628324508667 0.29432252049446106 0.2806641161441803 0.2753435969352722 0.2728271782398224 0.270643025636673 0.2736828327178955 0.2805771827697754 0.28472232818603516 0.2870364487171173 0.2909660339355469 0.29421940445899963 0.2940268814563751 0.29415833950042725 0.2929386496543884 0.2845102548599243 0.27148693799972534 0.26009973883628845 0.25316986441612244 0.25014013051986694 0.24763965606689453 0.24328280985355377 0.24036899209022522 0.2429419606924057 0.24842298030853271 0.25228366255760193 0.25561103224754333 0.25914180278778076 0.25783947110176086 0.253574401140213 0.2532463073730469 0.25550371408462524 0.2551080286502838 0.2552626430988312 0.2603242099285126 0.2648930549621582 0.26599374413490295 0.26791733503341675 0.27033597230911255 0.27200937271118164 0.27633726596832275 0.281934916973114 0.28416839241981506 0.2850780189037323 0.28886574506759644 0.29535502195358276 0.30392923951148987 0.3146568834781647 0.3258497714996338 0.3378189206123352 0.3510323464870453 0.3626718819141388 0.3707166612148285 0.37344253063201904 0.3687247931957245 0.3559401333332062 0.336141973733902 0.31635063886642456 0.30404531955718994 0.2972669005393982 0.29117393493652344 0.28547903895378113 0.2802625894546509 30442.5687 41541.616519999996 14.612466406432896 42.07633292374312 45.0 Degrees 0.9052486894719146 0.23198983049333044 -0.12072690257494645 14.320648710203532 0.5510780301748821 0.5808993859007311 0.3024109496913203 41.91339873814995 +0.34738847613334656 0.4179860055446625 0.4664291739463806 0.5296632647514343 0.6272340416908264 0.7056167125701904 0.7561516165733337 0.8085007667541504 0.8644552826881409 0.9050332307815552 0.9181493520736694 0.9111636281013489 0.9073537588119507 0.9109403491020203 0.9062535762786865 0.8872991800308228 0.8642696738243103 0.8446381688117981 0.8067254424095154 0.7335556745529175 0.6443662047386169 0.5644205808639526 0.506117045879364 0.467324823141098 0.43990078568458557 0.4194169044494629 0.4045620858669281 0.39635950326919556 0.3957340121269226 0.40181082487106323 0.4117859899997711 0.4274001121520996 0.4520021080970764 0.48187950253486633 0.5073687434196472 0.5298813581466675 0.5784440636634827 0.6448124051094055 0.6777898669242859 0.6767211556434631 0.648645281791687 0.6306580901145935 0.6294295191764832 0.6141109466552734 0.586581289768219 0.5592874884605408 0.5341745018959045 0.5011913180351257 0.4583965539932251 0.4066646993160248 0.3704123795032501 0.3489791750907898 0.3235110640525818 0.29798153042793274 0.2787266969680786 0.26791489124298096 0.2635549306869507 0.2648940086364746 0.2800384759902954 0.30330970883369446 0.3163895010948181 0.31783244013786316 0.3187214732170105 0.3288123607635498 0.33496859669685364 0.3315340280532837 0.32235997915267944 0.30760458111763 0.289726585149765 0.27839016914367676 0.2739510238170624 0.272896945476532 0.27768412232398987 0.286607027053833 0.29376494884490967 0.30020976066589355 0.3059932589530945 0.30805355310440063 0.3080996572971344 0.30983278155326843 0.30988332629203796 0.3039196729660034 0.29341766238212585 0.28149351477622986 0.2707284390926361 0.2622477412223816 0.25400418043136597 0.2478829324245453 0.2490083873271942 0.2554311156272888 0.26148200035095215 0.26385727524757385 0.26382210850715637 0.26387882232666016 0.26245152950286865 0.26000332832336426 0.2600518763065338 0.2617824673652649 0.26309698820114136 0.26552656292915344 0.2700032591819763 0.2736172676086426 0.2747006118297577 0.2754264175891876 0.2767968773841858 0.2779064476490021 0.279891699552536 0.284357488155365 0.28945451974868774 0.2933834195137024 0.2966553568840027 0.2989789843559265 0.30280598998069763 0.31150293350219727 0.32365909218788147 0.33813759684562683 0.35394054651260376 0.3676077127456665 0.376840740442276 0.3798968195915222 0.37367281317710876 0.3576556146144867 0.3369816541671753 0.31849825382232666 0.30471497774124146 0.29529136419296265 0.2896086275577545 0.2846777141094208 0.2775256037712097 30445.38885 41541.616519999996 14.724239544441382 41.95246636406159 45.0 Degrees 0.9941901147353087 0.2536980425498405 -0.46382002276927525 14.441964377513065 0.1657092533769018 0.03694686596283513 -0.5203849464554426 42.743246117510395 +0.36890196800231934 0.4383719861507416 0.49215278029441833 0.5678848028182983 0.6697624325752258 0.7421551942825317 0.7949410080909729 0.861175537109375 0.9304823279380798 0.9888854622840881 1.0296154022216797 1.0200906991958618 0.9658761620521545 0.9375912547111511 0.9355541467666626 0.9351963996887207 0.9119044542312622 0.8633236289024353 0.8102912902832031 0.7478935718536377 0.6693353056907654 0.5896985530853271 0.5278323888778687 0.47969499230384827 0.4415580630302429 0.4171638786792755 0.40274444222450256 0.3934766352176666 0.3904435634613037 0.39783647656440735 0.41653168201446533 0.4471336603164673 0.4835716187953949 0.5180643796920776 0.5542099475860596 0.5966129302978516 0.6491007804870605 0.6811864972114563 0.6899703741073608 0.6939358711242676 0.6857684850692749 0.6570229530334473 0.6270668506622314 0.6001116633415222 0.5694991946220398 0.5400396585464478 0.5212351679801941 0.5054466128349304 0.4800109267234802 0.4332926869392395 0.38531044125556946 0.35653600096702576 0.33400747179985046 0.3157062530517578 0.3017118573188782 0.29292401671409607 0.2914346158504486 0.2968195676803589 0.3123685419559479 0.3298073410987854 0.3378491699695587 0.3447093665599823 0.35713934898376465 0.36121153831481934 0.354942262172699 0.35000061988830566 0.34591320157051086 0.3377359211444855 0.32351627945899963 0.3089088499546051 0.299715518951416 0.29520851373672485 0.29720360040664673 0.3091683089733124 0.3235648274421692 0.3309069871902466 0.3311137557029724 0.3341479003429413 0.3409155011177063 0.3392958343029022 0.32886332273483276 0.318060964345932 0.31203606724739075 0.30700525641441345 0.2969604432582855 0.2861284911632538 0.2785927355289459 0.27391406893730164 0.2739171087741852 0.27796828746795654 0.2818444073200226 0.28413259983062744 0.28639599680900574 0.28605619072914124 0.28013235330581665 0.27383479475975037 0.27307555079460144 0.27768054604530334 0.2847695052623749 0.29085657000541687 0.28964218497276306 0.2820451259613037 0.2783108055591583 0.28211650252342224 0.28757697343826294 0.2919096350669861 0.2974321246147156 0.30412620306015015 0.3101852238178253 0.31293031573295593 0.31173041462898254 0.31200647354125977 0.31643787026405334 0.3226405680179596 0.33135539293289185 0.3442952632904053 0.3607310354709625 0.37769126892089844 0.38771292567253113 0.3854190707206726 0.37552234530448914 0.36437416076660156 0.35301434993743896 0.34029337763786316 0.3268333971500397 0.31639185547828674 0.31317082047462463 0.31620898842811584 0.31643491983413696 30442.5687 41538.7379 15.196114730939069 43.482395133432554 90.0 Degrees 0.9998996542510169 0.04788184003105633 -0.0930766425798808 15.10229663993498 0.4761749412326489 0.1699951093342037 0.198482528841064 43.874691613741085 +0.37875914573669434 0.4469207227230072 0.49604201316833496 0.5680999159812927 0.6705905199050903 0.7483171224594116 0.80452561378479 0.8658115863800049 0.9279407262802124 0.9807824492454529 1.0223487615585327 1.0514615774154663 1.0463922023773193 1.0112226009368896 0.9982134103775024 1.004634141921997 0.9877952933311462 0.9317412972450256 0.8688726425170898 0.791929304599762 0.6982804536819458 0.6116718649864197 0.5463566184043884 0.4956464171409607 0.4562545120716095 0.43035486340522766 0.41308432817459106 0.4023517668247223 0.40038397908210754 0.4071796238422394 0.4212566614151001 0.44529813528060913 0.47869226336479187 0.5134111642837524 0.5476288199424744 0.5924862027168274 0.6646744608879089 0.7205690741539001 0.7406251430511475 0.7573677897453308 0.7730262279510498 0.7530763149261475 0.701831042766571 0.6527606844902039 0.6117518544197083 0.5808829665184021 0.5582142472267151 0.5362958312034607 0.5081617832183838 0.4623250961303711 0.41480353474617004 0.3816410005092621 0.3512253761291504 0.3229435384273529 0.30036529898643494 0.28829801082611084 0.28772664070129395 0.29815641045570374 0.31810328364372253 0.33310839533805847 0.34295332431793213 0.3576355576515198 0.37281879782676697 0.37368515133857727 0.36629509925842285 0.3603748083114624 0.35585665702819824 0.3474416136741638 0.33159855008125305 0.31616654992103577 0.3076492249965668 0.307073712348938 0.3140259385108948 0.3209126889705658 0.3253902792930603 0.3307969272136688 0.3362623155117035 0.34198322892189026 0.3472789525985718 0.3470509350299835 0.3400651216506958 0.3291180729866028 0.31915709376335144 0.3109745383262634 0.3023119568824768 0.2948138117790222 0.28782516717910767 0.27949029207229614 0.2736770212650299 0.2739221751689911 0.27921369671821594 0.2852224111557007 0.2887378931045532 0.2893288731575012 0.28667038679122925 0.2830811142921448 0.28239449858665466 0.28517019748687744 0.28917649388313293 0.2914784848690033 0.2913095951080322 0.2914259135723114 0.29324576258659363 0.2956298291683197 0.2981545031070709 0.3011481463909149 0.3054879605770111 0.3107515871524811 0.31411612033843994 0.31555652618408203 0.3172118663787842 0.31911471486091614 0.32280173897743225 0.33204859495162964 0.3453712463378906 0.357761949300766 0.3699503242969513 0.38311585783958435 0.39259737730026245 0.395723819732666 0.39234602451324463 0.38097503781318665 0.3659316301345825 0.3534175157546997 0.34347930550575256 0.33371132612228394 0.3236602544784546 0.3152346611022949 0.30779775977134705 30445.38885 41538.7379 15.717131304491499 46.21617319326819 90.0 Degrees 0.9324530395726834 0.11528954707161643 -0.3900859865428774 15.249631354870715 0.36275784996581106 0.671080814707999 -0.43318106508974763 45.03441323505067 +0.3608156144618988 0.4259406626224518 0.47818616032600403 0.5471063256263733 0.6347803473472595 0.7001804113388062 0.7520433068275452 0.8171277642250061 0.8950353264808655 0.9654224514961243 1.013027548789978 1.0263880491256714 0.9852103590965271 0.941172182559967 0.931695818901062 0.9181087017059326 0.8757404685020447 0.8307337164878845 0.7877539992332458 0.7257715463638306 0.6523596048355103 0.5768492817878723 0.5085425972938538 0.456727534532547 0.4192277491092682 0.3939008414745331 0.3818787932395935 0.3828960657119751 0.389323353767395 0.39450258016586304 0.39829221367836 0.40605780482292175 0.4275314211845398 0.4643791615962982 0.505535900592804 0.5479178428649902 0.5994552969932556 0.6376073360443115 0.6582133769989014 0.6799547672271729 0.6931027770042419 0.6702796816825867 0.6343024969100952 0.6056128144264221 0.5789087414741516 0.5561301112174988 0.53394615650177 0.4996113181114197 0.4577721953392029 0.4083678126335144 0.36549386382102966 0.3386378884315491 0.3173430263996124 0.2995651960372925 0.2844037711620331 0.27193325757980347 0.26600706577301025 0.2700923979282379 0.2851560115814209 0.30088505148887634 0.3138630986213684 0.3285767436027527 0.3413139879703522 0.3445935547351837 0.3396775424480438 0.330121785402298 0.3199063241481781 0.30752673745155334 0.2904285490512848 0.27791693806648254 0.2726101279258728 0.27176886796951294 0.2783729135990143 0.2872854471206665 0.29147452116012573 0.29573073983192444 0.30301201343536377 0.3096592128276825 0.3131972551345825 0.31535086035728455 0.3140628933906555 0.3053463399410248 0.2954469323158264 0.2890409231185913 0.280372679233551 0.2706373333930969 0.2643801271915436 0.25798389315605164 0.2508365511894226 0.24706313014030457 0.2483857423067093 0.25367772579193115 0.2591390609741211 0.26199933886528015 0.2643854320049286 0.2681591808795929 0.2714567184448242 0.27293530106544495 0.2729243338108063 0.27181246876716614 0.27032458782196045 0.2693708539009094 0.26829567551612854 0.2665247321128845 0.2669430077075958 0.271585613489151 0.2774175703525543 0.28121861815452576 0.2841823399066925 0.28875136375427246 0.2948462665081024 0.3012498915195465 0.30834972858428955 0.3174125552177429 0.3262895941734314 0.33198782801628113 0.3391663730144501 0.35144802927970886 0.3615659177303314 0.3633808195590973 0.3589021563529968 0.3500611186027527 0.33608290553092957 0.3192422091960907 0.30552980303764343 0.29612672328948975 0.2880210280418396 0.2813362777233124 0.2759957015514374 30442.5687 41541.616519999996 14.381547746983568 42.02895298858711 90.0 Degrees 0.9052486894719146 0.23198983049333044 -0.12072690257494645 14.320648710203532 0.5510780301748821 0.5808993859007311 0.3024109496913203 41.91339873814995 +0.3729221224784851 0.44012895226478577 0.4914250373840332 0.5655630230903625 0.6647416949272156 0.7444058060646057 0.8126416206359863 0.8799846172332764 0.9443001747131348 0.9979190826416016 1.0210847854614258 1.0208030939102173 1.0111762285232544 0.992798924446106 0.9904224276542664 0.99041348695755 0.9595239162445068 0.908574640750885 0.846463143825531 0.7647848725318909 0.6809067726135254 0.6017272472381592 0.5331747531890869 0.48201125860214233 0.44443103671073914 0.41660502552986145 0.3969760835170746 0.38763803243637085 0.38977357745170593 0.4000709354877472 0.41259172558784485 0.4278537333011627 0.45189592242240906 0.48642393946647644 0.5247828960418701 0.5645804405212402 0.612518310546875 0.6483836770057678 0.6727944016456604 0.7076162695884705 0.7434014678001404 0.7206994891166687 0.6666464805603027 0.63228839635849 0.608867883682251 0.5807878971099854 0.5441436171531677 0.5172581076622009 0.4963454604148865 0.45485949516296387 0.401254266500473 0.36339372396469116 0.3367786109447479 0.31736981868743896 0.29844656586647034 0.28279122710227966 0.27746984362602234 0.2811555564403534 0.2927308678627014 0.3071295917034149 0.3210527002811432 0.33639973402023315 0.3501872718334198 0.3525633215904236 0.34586936235427856 0.33730486035346985 0.3312234878540039 0.32529526948928833 0.31066590547561646 0.2939175069332123 0.286742240190506 0.28868338465690613 0.2973419427871704 0.3067079484462738 0.31102290749549866 0.31296807527542114 0.3165799379348755 0.3216167390346527 0.32459816336631775 0.32458773255348206 0.32075992226600647 0.31120601296424866 0.3001273572444916 0.2915954291820526 0.28556665778160095 0.28158968687057495 0.2759927809238434 0.26627132296562195 0.25822049379348755 0.25609999895095825 0.2582840323448181 0.26162636280059814 0.26389646530151367 0.26584580540657043 0.269505113363266 0.2740560472011566 0.2757222354412079 0.2737424373626709 0.27331092953681946 0.2753473222255707 0.2754512131214142 0.2745696008205414 0.27530866861343384 0.2763848900794983 0.27731868624687195 0.2794644236564636 0.28307804465293884 0.2873600125312805 0.29181772470474243 0.29564568400382996 0.29717445373535156 0.2980411946773529 0.30308812856674194 0.31369927525520325 0.3267776072025299 0.3403771221637726 0.3552534282207489 0.3692227900028229 0.3773849606513977 0.37742289900779724 0.3699462413787842 0.3581613600254059 0.3446747362613678 0.3301258683204651 0.3174242079257965 0.3073962330818176 0.2965550720691681 0.28561556339263916 0.27806076407432556 30445.38885 41541.616519999996 14.87720727584366 44.091357683377474 90.0 Degrees 0.9941901147353087 0.2536980425498405 -0.46382002276927525 14.441964377513065 0.1657092533769018 0.03694686596283513 -0.5203849464554426 42.743246117510395 +0.3949830234050751 0.4622531533241272 0.5109723210334778 0.5819476842880249 0.6732906699180603 0.7399584054946899 0.8056941032409668 0.8803262114524841 0.9407079219818115 0.9959824681282043 1.0247737169265747 0.9988774061203003 0.9598121643066406 0.9596822261810303 0.9756194353103638 0.9531159996986389 0.8880895376205444 0.8291646242141724 0.7852953672409058 0.7326091527938843 0.6583097577095032 0.5755128264427185 0.5128992199897766 0.47360721230506897 0.4461856484413147 0.424794465303421 0.40726786851882935 0.39642640948295593 0.3955315947532654 0.3990853428840637 0.40200623869895935 0.41744357347488403 0.4541429877281189 0.4928371012210846 0.523593544960022 0.5572065114974976 0.6082401275634766 0.6535071730613708 0.6752548813819885 0.6942375302314758 0.7089064717292786 0.6849415898323059 0.648251473903656 0.6290637254714966 0.611190140247345 0.5820888876914978 0.5479511022567749 0.5251440405845642 0.5092036724090576 0.4710317552089691 0.41165193915367126 0.368015855550766 0.33563244342803955 0.30891987681388855 0.289467990398407 0.279835045337677 0.2776188254356384 0.281124472618103 0.2969658076763153 0.3199588358402252 0.3370678722858429 0.35005685687065125 0.3592534065246582 0.3598088026046753 0.3555058240890503 0.34791675209999084 0.3381218910217285 0.32693901658058167 0.3126853406429291 0.3007925748825073 0.2955957353115082 0.2945536673069 0.29722654819488525 0.30562835931777954 0.3160330057144165 0.32335811853408813 0.32722195982933044 0.33106622099876404 0.333890825510025 0.3307388126850128 0.32467377185821533 0.31839045882225037 0.3102380931377411 0.30023348331451416 0.28814268112182617 0.2750730514526367 0.26571476459503174 0.2631886601448059 0.2642560303211212 0.2657497227191925 0.2698196768760681 0.2753346860408783 0.27848049998283386 0.27970898151397705 0.2795354127883911 0.2767869830131531 0.27504852414131165 0.2782919108867645 0.28145065903663635 0.2807522118091583 0.2820216417312622 0.28606170415878296 0.2876238524913788 0.2858695089817047 0.28583207726478577 0.29170745611190796 0.2989623248577118 0.3013303577899933 0.3022397756576538 0.3061143457889557 0.31094178557395935 0.31485098600387573 0.3188069462776184 0.32449349761009216 0.333775132894516 0.34593096375465393 0.3592696785926819 0.3726845979690552 0.3809838593006134 0.37974658608436584 0.37090665102005005 0.3579893112182617 0.3460439443588257 0.33749645948410034 0.3274995684623718 0.3147842586040497 0.3056890070438385 0.3015490472316742 0.2963547110557556 30442.5687 41538.7379 15.053673351479718 43.89851045568374 135.0 Degrees 0.9998996542510169 0.04788184003105633 -0.0930766425798808 15.10229663993498 0.4761749412326489 0.1699951093342037 0.198482528841064 43.874691613741085 +0.36599868535995483 0.44001543521881104 0.4966375231742859 0.5643589496612549 0.654793381690979 0.7409048080444336 0.8192135691642761 0.8847960829734802 0.9369638562202454 0.9906289577484131 1.025296688079834 1.0149723291397095 0.9805884957313538 0.9636447429656982 0.9588003158569336 0.9524202942848206 0.9314351677894592 0.8927587270736694 0.8397254943847656 0.7675902843475342 0.6844693422317505 0.6059010624885559 0.5474121570587158 0.5043894052505493 0.468307226896286 0.44075509905815125 0.4207476079463959 0.4080858826637268 0.40591961145401 0.4134867191314697 0.42650675773620605 0.4475072920322418 0.47888901829719543 0.5122790336608887 0.5369526743888855 0.5554997324943542 0.5947977304458618 0.647955060005188 0.6778163313865662 0.6932549476623535 0.6977417469024658 0.6872305870056152 0.659528911113739 0.6245843768119812 0.5957351922988892 0.5746957659721375 0.5465317368507385 0.5116745233535767 0.47723180055618286 0.4333028197288513 0.3936629891395569 0.36897724866867065 0.345966637134552 0.3255443572998047 0.31004011631011963 0.29891106486320496 0.2932963967323303 0.2937392592430115 0.3078584671020508 0.33370327949523926 0.35201096534729004 0.3585779666900635 0.36050570011138916 0.3624379336833954 0.3620472550392151 0.35969817638397217 0.35452911257743835 0.3419364094734192 0.3230227828025818 0.30832669138908386 0.30204203724861145 0.3018741011619568 0.30683496594429016 0.3151794970035553 0.3218154311180115 0.3262678384780884 0.33061009645462036 0.33248963952064514 0.3305680453777313 0.32937225699424744 0.3280726373195648 0.322355717420578 0.3143385052680969 0.30674803256988525 0.2977624237537384 0.28612422943115234 0.27380654215812683 0.26605281233787537 0.2670673131942749 0.27401211857795715 0.2821645736694336 0.28739145398139954 0.289187490940094 0.2906554937362671 0.29101991653442383 0.28759765625 0.28305813670158386 0.28146880865097046 0.2823540270328522 0.2834238111972809 0.28334492444992065 0.28242823481559753 0.2830897569656372 0.285215824842453 0.286749929189682 0.2894335985183716 0.2963193953037262 0.30561134219169617 0.31135934591293335 0.3125182092189789 0.3135771155357361 0.31644806265830994 0.3219490647315979 0.3305686414241791 0.3386459946632385 0.34468361735343933 0.35293155908584595 0.3640737235546112 0.3740508556365967 0.3799596130847931 0.3787302076816559 0.3690877854824066 0.3545362651348114 0.33818575739860535 0.32251599431037903 0.31119340658187866 0.3069508969783783 0.30643993616104126 0.3014766573905945 30445.38885 41538.7379 15.056927844654062 43.61475352701898 135.0 Degrees 0.9324530395726834 0.11528954707161643 -0.3900859865428774 15.249631354870715 0.36275784996581106 0.671080814707999 -0.43318106508974763 45.03441323505067 +0.36250585317611694 0.42431044578552246 0.4834742844104767 0.5558268427848816 0.6433207988739014 0.7237451076507568 0.797504723072052 0.8740603923797607 0.9462519288063049 1.0028680562973022 1.0236170291900635 0.9993492960929871 0.9659426808357239 0.929129958152771 0.8976386189460754 0.8773003220558167 0.845932126045227 0.804290771484375 0.7517927289009094 0.6770941019058228 0.5976353883743286 0.5313588380813599 0.48177453875541687 0.44140711426734924 0.40849852561950684 0.3899365961551666 0.38149017095565796 0.3739112615585327 0.3684139847755432 0.372007817029953 0.38562244176864624 0.40915170311927795 0.4383581876754761 0.46522119641304016 0.4911789894104004 0.5281954407691956 0.5901359915733337 0.6282098889350891 0.6299937963485718 0.6347435712814331 0.6456948518753052 0.6421006917953491 0.6224752068519592 0.6007646918296814 0.5784657001495361 0.5487658381462097 0.5032517313957214 0.4633730351924896 0.4398660957813263 0.41094517707824707 0.3713396489620209 0.3397798538208008 0.315258264541626 0.2960793673992157 0.2789282202720642 0.26473933458328247 0.2583105266094208 0.26161065697669983 0.276593953371048 0.29428234696388245 0.30759015679359436 0.3208509385585785 0.33403608202934265 0.3378518223762512 0.3314681351184845 0.3205536901950836 0.3096092939376831 0.29909756779670715 0.2854691445827484 0.27216678857803345 0.2648516893386841 0.26480165123939514 0.27259862422943115 0.28223392367362976 0.28807657957077026 0.2966751158237457 0.3103998601436615 0.31771647930145264 0.3139994740486145 0.31038033962249756 0.30780771374702454 0.30000224709510803 0.2885487973690033 0.2776309549808502 0.2691199779510498 0.26336920261383057 0.2575911581516266 0.2499367892742157 0.24667014181613922 0.2502342164516449 0.2533777952194214 0.25388017296791077 0.2556212842464447 0.2578236758708954 0.25818225741386414 0.2583445906639099 0.2599364221096039 0.2620580792427063 0.2627926170825958 0.2631688117980957 0.2642405927181244 0.263955682516098 0.2622736394405365 0.2618711590766907 0.2638363242149353 0.2683615982532501 0.2739871144294739 0.27764204144477844 0.2804603576660156 0.28473037481307983 0.28941360116004944 0.2937960624694824 0.2986640930175781 0.30610325932502747 0.316412091255188 0.3255343437194824 0.3314375877380371 0.33745360374450684 0.3465556502342224 0.355802059173584 0.358920693397522 0.35263997316360474 0.33765292167663574 0.3183898329734802 0.30118611454963684 0.2887457013130188 0.28239473700523376 0.2824958264827728 0.2819530665874481 30442.5687 41541.616519999996 14.148486745442884 40.914534151939826 135.0 Degrees 0.9052486894719146 0.23198983049333044 -0.12072690257494645 14.320648710203532 0.5510780301748821 0.5808993859007311 0.3024109496913203 41.91339873814995 +0.3650876581668854 0.44027072191238403 0.49740421772003174 0.5676716566085815 0.6565104126930237 0.7217820286750793 0.776906430721283 0.8554854989051819 0.9431904554367065 0.99639892578125 0.9918259382247925 0.9632425308227539 0.9571559429168701 0.9453587532043457 0.9196834564208984 0.9045694470405579 0.8967841863632202 0.8714707493782043 0.8187240958213806 0.7500607967376709 0.6737703084945679 0.5944964289665222 0.5322104096412659 0.48620209097862244 0.4495582580566406 0.4267524480819702 0.4147963225841522 0.4065539836883545 0.40079763531684875 0.40120112895965576 0.4117395281791687 0.4343542158603668 0.4588378369808197 0.4770737290382385 0.49635985493659973 0.5230758190155029 0.5750504732131958 0.6321943402290344 0.6574925780296326 0.6613973379135132 0.6457144618034363 0.6232727766036987 0.6174584627151489 0.6194400787353516 0.6105873584747314 0.5773681402206421 0.5304786562919617 0.4934249520301819 0.45931971073150635 0.41730549931526184 0.38470304012298584 0.3595018684864044 0.3293219804763794 0.30435964465141296 0.2891426980495453 0.2798253893852234 0.2746725082397461 0.2748556435108185 0.2886051833629608 0.3117738366127014 0.32717078924179077 0.33106401562690735 0.3289177715778351 0.33031389117240906 0.33271220326423645 0.3304341435432434 0.32225725054740906 0.30900219082832336 0.2952777147293091 0.2869744896888733 0.28450044989585876 0.2863030433654785 0.29052266478538513 0.29561755061149597 0.3012177348136902 0.3077249825000763 0.3149780333042145 0.3194979727268219 0.31837978959083557 0.3156931400299072 0.31331557035446167 0.3074597716331482 0.29792141914367676 0.28665927052497864 0.2769920229911804 0.2717728316783905 0.2680080831050873 0.26393961906433105 0.2608543634414673 0.25888293981552124 0.25867512822151184 0.2605808675289154 0.263666570186615 0.26618891954421997 0.2665948271751404 0.2663698196411133 0.2670312225818634 0.26882821321487427 0.27096620202064514 0.2717668414115906 0.2718110680580139 0.2726369798183441 0.27475622296333313 0.2783312201499939 0.2822757363319397 0.285504013299942 0.2890436351299286 0.29262956976890564 0.292468398809433 0.2886587381362915 0.28673070669174194 0.2884071469306946 0.29260167479515076 0.30139777064323425 0.31254521012306213 0.32084983587265015 0.329580694437027 0.34177514910697937 0.35234349966049194 0.3568665683269501 0.3554323613643646 0.3491654396057129 0.3388620913028717 0.32499754428863525 0.3104616105556488 0.29853302240371704 0.28830283880233765 0.27974289655685425 0.27512240409851074 30445.38885 41541.616519999996 14.216843459338445 41.87857263213592 135.0 Degrees 0.9941901147353087 0.2536980425498405 -0.46382002276927525 14.441964377513065 0.1657092533769018 0.03694686596283513 -0.5203849464554426 42.743246117510395 diff --git a/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin_polar-results.tab b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin_polar-results.tab new file mode 100644 index 000000000..3c29d7aca --- /dev/null +++ b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin_polar-results.tab @@ -0,0 +1,19 @@ +1697.131066748047 1693.2739506872558 1689.416834626465 1685.5597185656738 1681.702602504883 1677.8454864440919 1673.9883703833011 1670.13125432251 1666.2741382617191 1662.417022200928 1658.5599061401367 1654.702790079346 1650.8456740185547 1646.988557957764 1643.1314418969728 1639.274325836182 1635.4172097753908 1631.5600937145996 1627.7029776538088 1623.8458615930176 1619.9887455322269 1616.1316294714356 1612.2745134106449 1608.4173973498537 1604.5602812890625 1600.7031652282717 1596.8460491674805 1592.9889331066897 1589.1318170458985 1585.2747009851078 1581.4175849243165 1577.5604688635258 1573.7033528027346 1569.8462367419434 1565.9891206811526 1562.1320046203614 1558.2748885595706 1554.4177724987794 1550.5606564379887 1546.7035403771974 1542.8464243164062 1538.9893082556155 1535.1321921948243 1531.2750761340335 1527.4179600732423 1523.5608440124515 1519.7037279516603 1515.846611890869 1511.9894958300783 1508.1323797692871 1504.2752637084964 1500.4181476477052 1496.5610315869144 1492.7039155261232 1488.8467994653324 1484.9896834045412 1481.13256734375 1477.2754512829592 1473.418335222168 1469.5612191613773 1465.704103100586 1461.8469870397953 1457.989870979004 1454.1327549182129 1450.275638857422 1446.418522796631 1442.5614067358401 1438.704290675049 1434.8471746142582 1430.990058553467 1427.1329424926757 1423.275826431885 1419.4187103710938 1415.561594310303 1411.7044782495118 1407.847362188721 1403.9902461279298 1400.133130067139 1396.2760140063479 1392.4188979455566 1388.5617818847659 1384.7046658239747 1380.847549763184 1376.9904337023927 1373.133317641602 1369.2762015808107 1365.4190855200195 1361.5619694592287 1357.7048533984375 1353.8477373376468 1349.9906212768556 1346.1335052160648 1342.2763891552736 1338.4192730944824 1334.5621570336916 1330.7050409729004 1326.8479249121096 1322.9908088513184 1319.1336927905277 1315.2765767297365 1311.4194606689457 1307.5623446081545 1303.7052285473633 1299.8481124865725 1295.9909964257813 1292.1338803649905 1288.2767643041993 1284.4196482434086 1280.5625321826174 1276.7054161218261 1272.8483000610354 1268.9911840002442 1265.1340679394534 1261.2769518786622 1257.4198358178714 1253.5627197570802 1249.705603696289 1245.8484876354983 1241.991371574707 1238.1342555139163 1234.277139453125 1230.4200233923343 1226.562907331543 1222.7057912707523 1218.8486752099611 1214.99155914917 1211.1344430883792 1207.277327027588 1203.4202109667972 map_x map_y 1214.0 - 1258.0 1500.0 - 1580.0 Polarisation Angle Azimuth Angle (1214.0 - 1258.0) Hermans Orientation Function (1214.0 - 1258.0) Intensity (1214.0 - 1258.0) Amplitude (1214.0 - 1258.0) R-squared (1214.0 - 1258.0) Azimuth Angle (1500.0 - 1580.0) Hermans Orientation Function (1500.0 - 1580.0) Intensity (1500.0 - 1580.0) Amplitude (1500.0 - 1580.0) R-squared (1500.0 - 1580.0) +continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous 0.0\ Degrees 45.0\ Degrees 90.0\ Degrees 135.0\ Degrees continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous + meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta +0.3711118698120117 0.43782272934913635 0.49062955379486084 0.5547452569007874 0.6374028921127319 0.711500346660614 0.7876919507980347 0.8770861625671387 0.9559172987937927 1.0098530054092407 1.0404753684997559 1.0543735027313232 1.0619465112686157 1.0437582731246948 1.0013220310211182 0.9536964297294617 0.897933840751648 0.8533709645271301 0.8181004524230957 0.7584443688392639 0.6689296364784241 0.5782220363616943 0.513115644454956 0.46961721777915955 0.43171659111976624 0.3991532325744629 0.3810955286026001 0.37965840101242065 0.386007159948349 0.3947145342826843 0.4098324477672577 0.4343760311603546 0.46137940883636475 0.49168214201927185 0.528336226940155 0.5667646527290344 0.6178287267684937 0.6604256629943848 0.6766932010650635 0.6885275840759277 0.6986993551254272 0.6930281519889832 0.6724157929420471 0.6501829028129578 0.6263569593429565 0.5885990858078003 0.5376056432723999 0.5005533695220947 0.4779326319694519 0.4443279504776001 0.39699268341064453 0.36137861013412476 0.33436083793640137 0.30747178196907043 0.2803654670715332 0.2625480592250824 0.2592535614967346 0.27015992999076843 0.29309216141700745 0.31150364875793457 0.3194276988506317 0.328142374753952 0.3443129062652588 0.35353028774261475 0.3476772606372833 0.33774372935295105 0.32855379581451416 0.3200712502002716 0.31163617968559265 0.3032289445400238 0.2943628430366516 0.28816357254981995 0.2909632623195648 0.29872336983680725 0.3025616407394409 0.3057458698749542 0.3115512728691101 0.31618112325668335 0.3176253139972687 0.3175846040248871 0.3153497576713562 0.3088831901550293 0.3000914454460144 0.29377707839012146 0.2888909578323364 0.28027477860450745 0.270122230052948 0.26286780834198 0.2575746774673462 0.2533765435218811 0.2540722191333771 0.26083439588546753 0.2694004774093628 0.27414125204086304 0.2728372812271118 0.26937466859817505 0.2672775387763977 0.2684006989002228 0.2723020315170288 0.27508431673049927 0.2749064266681671 0.274681955575943 0.2775912284851074 0.28367695212364197 0.2893185019493103 0.290900319814682 0.2906703054904938 0.2926110625267029 0.2950325608253479 0.2977401614189148 0.3037301301956177 0.3114270567893982 0.318378210067749 0.32530495524406433 0.3349395990371704 0.3490666151046753 0.3638021945953369 0.3744945526123047 0.3803212642669678 0.3803481459617615 0.37394478917121887 0.3625723719596863 0.34696418046951294 0.3287803828716278 0.31259098649024963 0.3022864758968353 0.2975075840950012 0.2938818633556366 0.2872605323791504 30442.5687 41538.7379 15.009961445779307 43.87936019111817 0.0 Degrees -76.38857262236182 0.004631214554422166 30.204593279869965 0.2093411760614958 0.9998996542510169 -20.289596380815063 0.003978761893197851 87.74938322748216 0.5226610812091969 0.4761749412326489 +0.388348788022995 0.44867801666259766 0.502106249332428 0.5762503743171692 0.6664558053016663 0.739630937576294 0.8222108483314514 0.9173783659934998 0.9785887002944946 1.0107851028442383 1.0361779928207397 1.0637257099151611 1.0711760520935059 1.0423812866210938 1.025393009185791 0.9986843466758728 0.9373337626457214 0.8785869479179382 0.8271448612213135 0.7655133605003357 0.6908860802650452 0.6117749810218811 0.5471857190132141 0.4971246123313904 0.45541316270828247 0.42525458335876465 0.4062337279319763 0.39754077792167664 0.39981767535209656 0.41045162081718445 0.42612242698669434 0.4495392143726349 0.48013657331466675 0.509360134601593 0.5352477431297302 0.5706249475479126 0.6430520415306091 0.7104148864746094 0.7287077903747559 0.7300795912742615 0.7207353115081787 0.6928030848503113 0.6642997860908508 0.6465807557106018 0.6357985734939575 0.6169293522834778 0.5714240670204163 0.5247028470039368 0.49503496289253235 0.4588204622268677 0.41067439317703247 0.37448638677597046 0.34704023599624634 0.32218214869499207 0.29583585262298584 0.27490201592445374 0.26934197545051575 0.28096309304237366 0.3069058060646057 0.3270772397518158 0.33470597863197327 0.34152284264564514 0.35194724798202515 0.3573232889175415 0.3541431128978729 0.34866204857826233 0.3427005112171173 0.3312859833240509 0.3122206926345825 0.2955722510814667 0.2872144877910614 0.2867285907268524 0.2918354272842407 0.2956002652645111 0.2986833155155182 0.3060479462146759 0.31676867604255676 0.3262639045715332 0.330106645822525 0.32593291997909546 0.31699928641319275 0.30795541405677795 0.3018266558647156 0.29686442017555237 0.28721868991851807 0.2752007842063904 0.2667289972305298 0.2609139084815979 0.25778260827064514 0.2584190368652344 0.2610763907432556 0.2639258801937103 0.26595649123191833 0.26701226830482483 0.2679225206375122 0.2679891288280487 0.2669326663017273 0.2678163945674896 0.2720436155796051 0.2770630121231079 0.28001782298088074 0.27851158380508423 0.2751752436161041 0.276258647441864 0.2823660373687744 0.2899717390537262 0.29827389121055603 0.30697736144065857 0.3102128207683563 0.30654236674308777 0.30582261085510254 0.3128655254840851 0.3222534656524658 0.32939496636390686 0.33602944016456604 0.34821176528930664 0.3637096881866455 0.37178686261177063 0.3715791702270508 0.37046146392822266 0.36934414505958557 0.36342424154281616 0.350017786026001 0.33207470178604126 0.3140036165714264 0.2998875081539154 0.29220956563949585 0.2874009907245636 0.2815419137477875 30445.38885 41538.7379 14.936959331411803 45.349811063094954 0.0 Degrees -81.76750236979787 0.017942087761759287 30.49926270974143 0.8135324371187873 0.9324530395726834 -61.4210730982497 0.011894554755490427 90.06882647010134 1.5974921533722033 0.36275784996581106 +0.366887629032135 0.43671754002571106 0.49220016598701477 0.5703327059745789 0.6657547950744629 0.731933057308197 0.7937033176422119 0.8747525215148926 0.9398021697998047 0.9730452299118042 1.0031681060791016 1.0538406372070312 1.0965853929519653 1.0494016408920288 0.9825043678283691 0.9511120319366455 0.9302560687065125 0.8842418789863586 0.8129315972328186 0.7183979153633118 0.6205475330352783 0.5415375232696533 0.48775240778923035 0.44761666655540466 0.41458284854888916 0.39335882663726807 0.3796997666358948 0.36864838004112244 0.36498430371284485 0.3680277466773987 0.3732655644416809 0.38918817043304443 0.42386338114738464 0.46311137080192566 0.4917769134044647 0.5237820148468018 0.5971131920814514 0.6691277027130127 0.6892750859260559 0.7003340125083923 0.7168111801147461 0.6999649405479431 0.6541981101036072 0.6189929246902466 0.5926592946052551 0.5696735382080078 0.5413363575935364 0.5053853988647461 0.465243935585022 0.41113007068634033 0.36086025834083557 0.32808783650398254 0.3003191649913788 0.2793380916118622 0.26471295952796936 0.2541550099849701 0.24993854761123657 0.25305330753326416 0.2655698359012604 0.27899375557899475 0.2841063439846039 0.28888702392578125 0.30285078287124634 0.3161625862121582 0.3197145164012909 0.3178388774394989 0.31100529432296753 0.29754751920700073 0.28191861510276794 0.2750825583934784 0.27559351921081543 0.27823397517204285 0.2830919921398163 0.2850538194179535 0.2825995981693268 0.28359857201576233 0.2883332371711731 0.289949893951416 0.2929544150829315 0.30135759711265564 0.30265331268310547 0.2906714677810669 0.2753030061721802 0.2651992440223694 0.25924843549728394 0.25318726897239685 0.24550479650497437 0.23828820884227753 0.23315896093845367 0.23029816150665283 0.2334306240081787 0.24293583631515503 0.2510787546634674 0.25073981285095215 0.24615781009197235 0.2464907467365265 0.2522513270378113 0.2587389051914215 0.262591689825058 0.263126403093338 0.26156532764434814 0.2589862048625946 0.2572213411331177 0.2594248950481415 0.2655974328517914 0.27193424105644226 0.27772676944732666 0.28423818945884705 0.28888431191444397 0.29118603467941284 0.2921951413154602 0.29164180159568787 0.2948339283466339 0.3066503405570984 0.32164159417152405 0.333238422870636 0.34339842200279236 0.355623722076416 0.36564287543296814 0.36494630575180054 0.35201695561408997 0.3341171145439148 0.3175579309463501 0.30399125814437866 0.2928829789161682 0.28347793221473694 0.2780621647834778 0.276618093252182 0.27352389693260193 30442.5687 41541.616519999996 14.140093941838566 42.63377488797279 0.0 Degrees -58.74617564278722 0.012249198283408431 28.641297420407064 0.5230459500184083 0.9052486894719146 -31.249461838574835 0.010471285030812348 83.8267974762999 1.3098037700862717 0.5510780301748821 +0.36428871750831604 0.43003931641578674 0.47958770394325256 0.5450240969657898 0.634536862373352 0.7099695801734924 0.7796786427497864 0.8637834787368774 0.942089855670929 0.9903811812400818 1.0105667114257812 1.0208871364593506 1.005222201347351 0.963545024394989 0.9371297359466553 0.9139838814735413 0.8946059942245483 0.8827653527259827 0.840722918510437 0.7564958333969116 0.6611053943634033 0.5774503946304321 0.5202354192733765 0.48433250188827515 0.45376747846603394 0.4260224401950836 0.4059300422668457 0.3930695950984955 0.38632991909980774 0.3889123797416687 0.4001465141773224 0.4183931052684784 0.4428093135356903 0.47215187549591064 0.5050704479217529 0.5453080534934998 0.6085248589515686 0.658994734287262 0.668915331363678 0.6675289869308472 0.6717699766159058 0.6808158755302429 0.6681414842605591 0.6372467875480652 0.6000738739967346 0.5683797597885132 0.544323742389679 0.516345202922821 0.48224183917045593 0.4387160539627075 0.39499184489250183 0.3595888912677765 0.3304763436317444 0.3092094361782074 0.28860795497894287 0.26972246170043945 0.2605076730251312 0.26343077421188354 0.28140151500701904 0.29994896054267883 0.30823972821235657 0.31485551595687866 0.32437241077423096 0.33080095052719116 0.3303925395011902 0.3248642385005951 0.3165438175201416 0.3061983585357666 0.2946605384349823 0.2872968912124634 0.2868692874908447 0.2896806299686432 0.2909656763076782 0.2920180857181549 0.2945660948753357 0.2972028851509094 0.29964983463287354 0.3004482090473175 0.29766783118247986 0.2939799129962921 0.2927486002445221 0.2923987805843353 0.2889113426208496 0.2816716730594635 0.27281782031059265 0.2626931965351105 0.2514967918395996 0.24271203577518463 0.23827271163463593 0.23637256026268005 0.2380509227514267 0.24506837129592896 0.25348952412605286 0.25623422861099243 0.25412917137145996 0.2532842457294464 0.2547925114631653 0.2577175199985504 0.26068350672721863 0.2616606056690216 0.2597542703151703 0.2559884488582611 0.2536808252334595 0.256541907787323 0.2641761898994446 0.271513968706131 0.2755036950111389 0.27728980779647827 0.27779620885849 0.27858373522758484 0.28195881843566895 0.28836870193481445 0.29790475964546204 0.3091188371181488 0.317819207906723 0.3241935074329376 0.33264613151550293 0.3433806300163269 0.3505949378013611 0.35062962770462036 0.34647127985954285 0.3387751281261444 0.32535696029663086 0.3086860477924347 0.2940033972263336 0.2858646810054779 0.2827148139476776 0.2769644856452942 0.26818761229515076 30445.38885 41541.616519999996 13.949567230311496 43.05058779046659 0.0 Degrees -75.66121752117968 0.024705796952298773 28.883928755026126 1.0573395108768266 0.9941901147353087 -87.96943280855872 0.008170118041294187 85.4864922350208 1.0433897898712823 0.1657092533769018 +0.3773364722728729 0.43966636061668396 0.49002042412757874 0.5639562606811523 0.6609355807304382 0.7364853620529175 0.8136956691741943 0.8985644578933716 0.9468745589256287 0.9731678366661072 0.9914941191673279 0.9854417443275452 0.9628058671951294 0.9528713226318359 0.9546505808830261 0.9532977342605591 0.9257292151451111 0.8693946599960327 0.8010186553001404 0.7217180728912354 0.6436004638671875 0.5754334926605225 0.5214712619781494 0.47915247082710266 0.4447232484817505 0.41765138506889343 0.3990515470504761 0.39321616291999817 0.39747321605682373 0.40612584352493286 0.4184291958808899 0.43992483615875244 0.47834911942481995 0.5266345739364624 0.5672381520271301 0.597634494304657 0.6348262429237366 0.6744903922080994 0.6967960000038147 0.7098262310028076 0.7118614912033081 0.6856943368911743 0.6489338874816895 0.6190053224563599 0.5941586494445801 0.5711410641670227 0.5421783328056335 0.5111346244812012 0.4810764491558075 0.4355677664279938 0.3860788941383362 0.3534643054008484 0.32750168442726135 0.3032616674900055 0.2819446921348572 0.26981374621391296 0.2693929970264435 0.2801830768585205 0.30366891622543335 0.3256083130836487 0.3365386128425598 0.34310561418533325 0.35129883885383606 0.3588528633117676 0.35683950781822205 0.3458286225795746 0.33076736330986023 0.31613433361053467 0.30460110306739807 0.2960743308067322 0.2915134131908417 0.29322516918182373 0.2980576753616333 0.300569623708725 0.3029937744140625 0.3091799318790436 0.3191257119178772 0.32923704385757446 0.3315645456314087 0.3225858509540558 0.31236401200294495 0.3056598901748657 0.2981754243373871 0.2894536256790161 0.2814278304576874 0.2723696827888489 0.26151928305625916 0.2525339126586914 0.25026053190231323 0.2539668083190918 0.25997182726860046 0.26598429679870605 0.27031874656677246 0.27086934447288513 0.2690020799636841 0.26832443475723267 0.2695266008377075 0.2705895006656647 0.2702696919441223 0.27155083417892456 0.2761310338973999 0.28070759773254395 0.2832408547401428 0.2835163474082947 0.28365248441696167 0.2872329354286194 0.29273301362991333 0.29702767729759216 0.2998993694782257 0.30078554153442383 0.3016831874847412 0.30665796995162964 0.31462526321411133 0.32313990592956543 0.3358403742313385 0.3547256886959076 0.3718043267726898 0.3799355626106262 0.3825741112232208 0.383433073759079 0.3778041899204254 0.3644450008869171 0.3474675118923187 0.3291182518005371 0.3145691752433777 0.3077240586280823 0.3049233853816986 0.3022094964981079 0.2970089614391327 30442.5687 41538.7379 15.14943703154183 44.23850067435577 45.0 Degrees -76.38857262236182 0.004631214554422166 30.204593279869965 0.2093411760614958 0.9998996542510169 -20.289596380815063 0.003978761893197851 87.74938322748216 0.5226610812091969 0.4761749412326489 +0.37337228655815125 0.4396507143974304 0.49107563495635986 0.5586245059967041 0.646790623664856 0.7179062962532043 0.7848191857337952 0.8587467670440674 0.9132012128829956 0.9501560926437378 0.9785140156745911 0.984795868396759 0.9518576860427856 0.9169514179229736 0.9128903150558472 0.9190047979354858 0.9011522531509399 0.8552564978599548 0.7962431311607361 0.7195406556129456 0.6405887007713318 0.5768947005271912 0.5284963250160217 0.48475223779678345 0.44452735781669617 0.4175184965133667 0.4050688147544861 0.4015383720397949 0.4035366475582123 0.4095524847507477 0.41840967535972595 0.43762996792793274 0.4735090136528015 0.5144422650337219 0.5498296618461609 0.5891739130020142 0.6544406414031982 0.7074301838874817 0.721211850643158 0.7253494262695312 0.7205705046653748 0.7011243104934692 0.6794993877410889 0.6561350226402283 0.6234012842178345 0.5791003108024597 0.5371192693710327 0.5127407312393188 0.48728594183921814 0.43710267543792725 0.3880417048931122 0.358508825302124 0.3291686475276947 0.30198532342910767 0.2838975191116333 0.2756803035736084 0.27510562539100647 0.28265753388404846 0.30272212624549866 0.3223998248577118 0.3314470052719116 0.3400789797306061 0.3539663255214691 0.3615642189979553 0.35621216893196106 0.34422820806503296 0.33036601543426514 0.3164904713630676 0.30386441946029663 0.29513826966285706 0.2911766767501831 0.2941439151763916 0.302760511636734 0.30998602509498596 0.31750985980033875 0.32691699266433716 0.33109205961227417 0.3281230330467224 0.32525792717933655 0.32315510511398315 0.3174678683280945 0.31104981899261475 0.3055250942707062 0.297789067029953 0.28920844197273254 0.28300905227661133 0.27708175778388977 0.27133673429489136 0.26787322759628296 0.2659844756126404 0.26673445105552673 0.2708447575569153 0.2750791013240814 0.2769821286201477 0.2775936722755432 0.278523713350296 0.2802591919898987 0.2821207642555237 0.282520055770874 0.28267189860343933 0.2840110957622528 0.28552529215812683 0.28797078132629395 0.2903944253921509 0.29174160957336426 0.2954663932323456 0.30151888728141785 0.30476686358451843 0.30412399768829346 0.30343693494796753 0.30575087666511536 0.31121543049812317 0.3187049329280853 0.3290562331676483 0.3425249457359314 0.3562610149383545 0.36918962001800537 0.3792024254798889 0.3837013840675354 0.3848077654838562 0.3821556568145752 0.3716545104980469 0.3544897437095642 0.33635222911834717 0.3203563988208771 0.30804407596588135 0.3005572259426117 0.2961486577987671 0.29254403710365295 30445.38885 41538.7379 15.287506938801155 44.956915156436416 45.0 Degrees -81.76750236979787 0.017942087761759287 30.49926270974143 0.8135324371187873 0.9324530395726834 -61.4210730982497 0.011894554755490427 90.06882647010134 1.5974921533722033 0.36275784996581106 +0.38911929726600647 0.44554373621940613 0.4855414927005768 0.5539154410362244 0.6538650989532471 0.7315957546234131 0.8033648729324341 0.884945809841156 0.9360079765319824 0.954917311668396 0.9649530649185181 0.9849116206169128 1.008013129234314 0.9807816743850708 0.9428510069847107 0.9156916737556458 0.8764055967330933 0.825237512588501 0.7735792994499207 0.705725371837616 0.6241020560264587 0.5504984855651855 0.4957604706287384 0.45222288370132446 0.41255465149879456 0.3828220069408417 0.37051448225975037 0.37108558416366577 0.37338513135910034 0.37661170959472656 0.3874439001083374 0.41331085562705994 0.449747771024704 0.47858643531799316 0.4993457794189453 0.5276702642440796 0.5828417539596558 0.6414362788200378 0.6703454852104187 0.6750879287719727 0.6613235473632812 0.6516115069389343 0.6429095268249512 0.6263266801834106 0.6048684120178223 0.5731279253959656 0.5306711196899414 0.492236465215683 0.45757782459259033 0.40995675325393677 0.3611593246459961 0.33053696155548096 0.3058626651763916 0.2824017405509949 0.2620924711227417 0.24882546067237854 0.24321754276752472 0.24622128903865814 0.2659408152103424 0.29050007462501526 0.3000190854072571 0.30213284492492676 0.3106580674648285 0.3247032165527344 0.3296380937099457 0.3233187794685364 0.3104628324508667 0.29432252049446106 0.2806641161441803 0.2753435969352722 0.2728271782398224 0.270643025636673 0.2736828327178955 0.2805771827697754 0.28472232818603516 0.2870364487171173 0.2909660339355469 0.29421940445899963 0.2940268814563751 0.29415833950042725 0.2929386496543884 0.2845102548599243 0.27148693799972534 0.26009973883628845 0.25316986441612244 0.25014013051986694 0.24763965606689453 0.24328280985355377 0.24036899209022522 0.2429419606924057 0.24842298030853271 0.25228366255760193 0.25561103224754333 0.25914180278778076 0.25783947110176086 0.253574401140213 0.2532463073730469 0.25550371408462524 0.2551080286502838 0.2552626430988312 0.2603242099285126 0.2648930549621582 0.26599374413490295 0.26791733503341675 0.27033597230911255 0.27200937271118164 0.27633726596832275 0.281934916973114 0.28416839241981506 0.2850780189037323 0.28886574506759644 0.29535502195358276 0.30392923951148987 0.3146568834781647 0.3258497714996338 0.3378189206123352 0.3510323464870453 0.3626718819141388 0.3707166612148285 0.37344253063201904 0.3687247931957245 0.3559401333332062 0.336141973733902 0.31635063886642456 0.30404531955718994 0.2972669005393982 0.29117393493652344 0.28547903895378113 0.2802625894546509 30442.5687 41541.616519999996 14.612466406432896 42.07633292374312 45.0 Degrees -58.74617564278722 0.012249198283408431 28.641297420407064 0.5230459500184083 0.9052486894719146 -31.249461838574835 0.010471285030812348 83.8267974762999 1.3098037700862717 0.5510780301748821 +0.34738847613334656 0.4179860055446625 0.4664291739463806 0.5296632647514343 0.6272340416908264 0.7056167125701904 0.7561516165733337 0.8085007667541504 0.8644552826881409 0.9050332307815552 0.9181493520736694 0.9111636281013489 0.9073537588119507 0.9109403491020203 0.9062535762786865 0.8872991800308228 0.8642696738243103 0.8446381688117981 0.8067254424095154 0.7335556745529175 0.6443662047386169 0.5644205808639526 0.506117045879364 0.467324823141098 0.43990078568458557 0.4194169044494629 0.4045620858669281 0.39635950326919556 0.3957340121269226 0.40181082487106323 0.4117859899997711 0.4274001121520996 0.4520021080970764 0.48187950253486633 0.5073687434196472 0.5298813581466675 0.5784440636634827 0.6448124051094055 0.6777898669242859 0.6767211556434631 0.648645281791687 0.6306580901145935 0.6294295191764832 0.6141109466552734 0.586581289768219 0.5592874884605408 0.5341745018959045 0.5011913180351257 0.4583965539932251 0.4066646993160248 0.3704123795032501 0.3489791750907898 0.3235110640525818 0.29798153042793274 0.2787266969680786 0.26791489124298096 0.2635549306869507 0.2648940086364746 0.2800384759902954 0.30330970883369446 0.3163895010948181 0.31783244013786316 0.3187214732170105 0.3288123607635498 0.33496859669685364 0.3315340280532837 0.32235997915267944 0.30760458111763 0.289726585149765 0.27839016914367676 0.2739510238170624 0.272896945476532 0.27768412232398987 0.286607027053833 0.29376494884490967 0.30020976066589355 0.3059932589530945 0.30805355310440063 0.3080996572971344 0.30983278155326843 0.30988332629203796 0.3039196729660034 0.29341766238212585 0.28149351477622986 0.2707284390926361 0.2622477412223816 0.25400418043136597 0.2478829324245453 0.2490083873271942 0.2554311156272888 0.26148200035095215 0.26385727524757385 0.26382210850715637 0.26387882232666016 0.26245152950286865 0.26000332832336426 0.2600518763065338 0.2617824673652649 0.26309698820114136 0.26552656292915344 0.2700032591819763 0.2736172676086426 0.2747006118297577 0.2754264175891876 0.2767968773841858 0.2779064476490021 0.279891699552536 0.284357488155365 0.28945451974868774 0.2933834195137024 0.2966553568840027 0.2989789843559265 0.30280598998069763 0.31150293350219727 0.32365909218788147 0.33813759684562683 0.35394054651260376 0.3676077127456665 0.376840740442276 0.3798968195915222 0.37367281317710876 0.3576556146144867 0.3369816541671753 0.31849825382232666 0.30471497774124146 0.29529136419296265 0.2896086275577545 0.2846777141094208 0.2775256037712097 30445.38885 41541.616519999996 14.724239544441382 41.95246636406159 45.0 Degrees -75.66121752117968 0.024705796952298773 28.883928755026126 1.0573395108768266 0.9941901147353087 -87.96943280855872 0.008170118041294187 85.4864922350208 1.0433897898712823 0.1657092533769018 +0.36890196800231934 0.4383719861507416 0.49215278029441833 0.5678848028182983 0.6697624325752258 0.7421551942825317 0.7949410080909729 0.861175537109375 0.9304823279380798 0.9888854622840881 1.0296154022216797 1.0200906991958618 0.9658761620521545 0.9375912547111511 0.9355541467666626 0.9351963996887207 0.9119044542312622 0.8633236289024353 0.8102912902832031 0.7478935718536377 0.6693353056907654 0.5896985530853271 0.5278323888778687 0.47969499230384827 0.4415580630302429 0.4171638786792755 0.40274444222450256 0.3934766352176666 0.3904435634613037 0.39783647656440735 0.41653168201446533 0.4471336603164673 0.4835716187953949 0.5180643796920776 0.5542099475860596 0.5966129302978516 0.6491007804870605 0.6811864972114563 0.6899703741073608 0.6939358711242676 0.6857684850692749 0.6570229530334473 0.6270668506622314 0.6001116633415222 0.5694991946220398 0.5400396585464478 0.5212351679801941 0.5054466128349304 0.4800109267234802 0.4332926869392395 0.38531044125556946 0.35653600096702576 0.33400747179985046 0.3157062530517578 0.3017118573188782 0.29292401671409607 0.2914346158504486 0.2968195676803589 0.3123685419559479 0.3298073410987854 0.3378491699695587 0.3447093665599823 0.35713934898376465 0.36121153831481934 0.354942262172699 0.35000061988830566 0.34591320157051086 0.3377359211444855 0.32351627945899963 0.3089088499546051 0.299715518951416 0.29520851373672485 0.29720360040664673 0.3091683089733124 0.3235648274421692 0.3309069871902466 0.3311137557029724 0.3341479003429413 0.3409155011177063 0.3392958343029022 0.32886332273483276 0.318060964345932 0.31203606724739075 0.30700525641441345 0.2969604432582855 0.2861284911632538 0.2785927355289459 0.27391406893730164 0.2739171087741852 0.27796828746795654 0.2818444073200226 0.28413259983062744 0.28639599680900574 0.28605619072914124 0.28013235330581665 0.27383479475975037 0.27307555079460144 0.27768054604530334 0.2847695052623749 0.29085657000541687 0.28964218497276306 0.2820451259613037 0.2783108055591583 0.28211650252342224 0.28757697343826294 0.2919096350669861 0.2974321246147156 0.30412620306015015 0.3101852238178253 0.31293031573295593 0.31173041462898254 0.31200647354125977 0.31643787026405334 0.3226405680179596 0.33135539293289185 0.3442952632904053 0.3607310354709625 0.37769126892089844 0.38771292567253113 0.3854190707206726 0.37552234530448914 0.36437416076660156 0.35301434993743896 0.34029337763786316 0.3268333971500397 0.31639185547828674 0.31317082047462463 0.31620898842811584 0.31643491983413696 30442.5687 41538.7379 15.196114730939069 43.482395133432554 90.0 Degrees -76.38857262236182 0.004631214554422166 30.204593279869965 0.2093411760614958 0.9998996542510169 -20.289596380815063 0.003978761893197851 87.74938322748216 0.5226610812091969 0.4761749412326489 +0.37875914573669434 0.4469207227230072 0.49604201316833496 0.5680999159812927 0.6705905199050903 0.7483171224594116 0.80452561378479 0.8658115863800049 0.9279407262802124 0.9807824492454529 1.0223487615585327 1.0514615774154663 1.0463922023773193 1.0112226009368896 0.9982134103775024 1.004634141921997 0.9877952933311462 0.9317412972450256 0.8688726425170898 0.791929304599762 0.6982804536819458 0.6116718649864197 0.5463566184043884 0.4956464171409607 0.4562545120716095 0.43035486340522766 0.41308432817459106 0.4023517668247223 0.40038397908210754 0.4071796238422394 0.4212566614151001 0.44529813528060913 0.47869226336479187 0.5134111642837524 0.5476288199424744 0.5924862027168274 0.6646744608879089 0.7205690741539001 0.7406251430511475 0.7573677897453308 0.7730262279510498 0.7530763149261475 0.701831042766571 0.6527606844902039 0.6117518544197083 0.5808829665184021 0.5582142472267151 0.5362958312034607 0.5081617832183838 0.4623250961303711 0.41480353474617004 0.3816410005092621 0.3512253761291504 0.3229435384273529 0.30036529898643494 0.28829801082611084 0.28772664070129395 0.29815641045570374 0.31810328364372253 0.33310839533805847 0.34295332431793213 0.3576355576515198 0.37281879782676697 0.37368515133857727 0.36629509925842285 0.3603748083114624 0.35585665702819824 0.3474416136741638 0.33159855008125305 0.31616654992103577 0.3076492249965668 0.307073712348938 0.3140259385108948 0.3209126889705658 0.3253902792930603 0.3307969272136688 0.3362623155117035 0.34198322892189026 0.3472789525985718 0.3470509350299835 0.3400651216506958 0.3291180729866028 0.31915709376335144 0.3109745383262634 0.3023119568824768 0.2948138117790222 0.28782516717910767 0.27949029207229614 0.2736770212650299 0.2739221751689911 0.27921369671821594 0.2852224111557007 0.2887378931045532 0.2893288731575012 0.28667038679122925 0.2830811142921448 0.28239449858665466 0.28517019748687744 0.28917649388313293 0.2914784848690033 0.2913095951080322 0.2914259135723114 0.29324576258659363 0.2956298291683197 0.2981545031070709 0.3011481463909149 0.3054879605770111 0.3107515871524811 0.31411612033843994 0.31555652618408203 0.3172118663787842 0.31911471486091614 0.32280173897743225 0.33204859495162964 0.3453712463378906 0.357761949300766 0.3699503242969513 0.38311585783958435 0.39259737730026245 0.395723819732666 0.39234602451324463 0.38097503781318665 0.3659316301345825 0.3534175157546997 0.34347930550575256 0.33371132612228394 0.3236602544784546 0.3152346611022949 0.30779775977134705 30445.38885 41538.7379 15.717131304491499 46.21617319326819 90.0 Degrees -81.76750236979787 0.017942087761759287 30.49926270974143 0.8135324371187873 0.9324530395726834 -61.4210730982497 0.011894554755490427 90.06882647010134 1.5974921533722033 0.36275784996581106 +0.3608156144618988 0.4259406626224518 0.47818616032600403 0.5471063256263733 0.6347803473472595 0.7001804113388062 0.7520433068275452 0.8171277642250061 0.8950353264808655 0.9654224514961243 1.013027548789978 1.0263880491256714 0.9852103590965271 0.941172182559967 0.931695818901062 0.9181087017059326 0.8757404685020447 0.8307337164878845 0.7877539992332458 0.7257715463638306 0.6523596048355103 0.5768492817878723 0.5085425972938538 0.456727534532547 0.4192277491092682 0.3939008414745331 0.3818787932395935 0.3828960657119751 0.389323353767395 0.39450258016586304 0.39829221367836 0.40605780482292175 0.4275314211845398 0.4643791615962982 0.505535900592804 0.5479178428649902 0.5994552969932556 0.6376073360443115 0.6582133769989014 0.6799547672271729 0.6931027770042419 0.6702796816825867 0.6343024969100952 0.6056128144264221 0.5789087414741516 0.5561301112174988 0.53394615650177 0.4996113181114197 0.4577721953392029 0.4083678126335144 0.36549386382102966 0.3386378884315491 0.3173430263996124 0.2995651960372925 0.2844037711620331 0.27193325757980347 0.26600706577301025 0.2700923979282379 0.2851560115814209 0.30088505148887634 0.3138630986213684 0.3285767436027527 0.3413139879703522 0.3445935547351837 0.3396775424480438 0.330121785402298 0.3199063241481781 0.30752673745155334 0.2904285490512848 0.27791693806648254 0.2726101279258728 0.27176886796951294 0.2783729135990143 0.2872854471206665 0.29147452116012573 0.29573073983192444 0.30301201343536377 0.3096592128276825 0.3131972551345825 0.31535086035728455 0.3140628933906555 0.3053463399410248 0.2954469323158264 0.2890409231185913 0.280372679233551 0.2706373333930969 0.2643801271915436 0.25798389315605164 0.2508365511894226 0.24706313014030457 0.2483857423067093 0.25367772579193115 0.2591390609741211 0.26199933886528015 0.2643854320049286 0.2681591808795929 0.2714567184448242 0.27293530106544495 0.2729243338108063 0.27181246876716614 0.27032458782196045 0.2693708539009094 0.26829567551612854 0.2665247321128845 0.2669430077075958 0.271585613489151 0.2774175703525543 0.28121861815452576 0.2841823399066925 0.28875136375427246 0.2948462665081024 0.3012498915195465 0.30834972858428955 0.3174125552177429 0.3262895941734314 0.33198782801628113 0.3391663730144501 0.35144802927970886 0.3615659177303314 0.3633808195590973 0.3589021563529968 0.3500611186027527 0.33608290553092957 0.3192422091960907 0.30552980303764343 0.29612672328948975 0.2880210280418396 0.2813362777233124 0.2759957015514374 30442.5687 41541.616519999996 14.381547746983568 42.02895298858711 90.0 Degrees -58.74617564278722 0.012249198283408431 28.641297420407064 0.5230459500184083 0.9052486894719146 -31.249461838574835 0.010471285030812348 83.8267974762999 1.3098037700862717 0.5510780301748821 +0.3729221224784851 0.44012895226478577 0.4914250373840332 0.5655630230903625 0.6647416949272156 0.7444058060646057 0.8126416206359863 0.8799846172332764 0.9443001747131348 0.9979190826416016 1.0210847854614258 1.0208030939102173 1.0111762285232544 0.992798924446106 0.9904224276542664 0.99041348695755 0.9595239162445068 0.908574640750885 0.846463143825531 0.7647848725318909 0.6809067726135254 0.6017272472381592 0.5331747531890869 0.48201125860214233 0.44443103671073914 0.41660502552986145 0.3969760835170746 0.38763803243637085 0.38977357745170593 0.4000709354877472 0.41259172558784485 0.4278537333011627 0.45189592242240906 0.48642393946647644 0.5247828960418701 0.5645804405212402 0.612518310546875 0.6483836770057678 0.6727944016456604 0.7076162695884705 0.7434014678001404 0.7206994891166687 0.6666464805603027 0.63228839635849 0.608867883682251 0.5807878971099854 0.5441436171531677 0.5172581076622009 0.4963454604148865 0.45485949516296387 0.401254266500473 0.36339372396469116 0.3367786109447479 0.31736981868743896 0.29844656586647034 0.28279122710227966 0.27746984362602234 0.2811555564403534 0.2927308678627014 0.3071295917034149 0.3210527002811432 0.33639973402023315 0.3501872718334198 0.3525633215904236 0.34586936235427856 0.33730486035346985 0.3312234878540039 0.32529526948928833 0.31066590547561646 0.2939175069332123 0.286742240190506 0.28868338465690613 0.2973419427871704 0.3067079484462738 0.31102290749549866 0.31296807527542114 0.3165799379348755 0.3216167390346527 0.32459816336631775 0.32458773255348206 0.32075992226600647 0.31120601296424866 0.3001273572444916 0.2915954291820526 0.28556665778160095 0.28158968687057495 0.2759927809238434 0.26627132296562195 0.25822049379348755 0.25609999895095825 0.2582840323448181 0.26162636280059814 0.26389646530151367 0.26584580540657043 0.269505113363266 0.2740560472011566 0.2757222354412079 0.2737424373626709 0.27331092953681946 0.2753473222255707 0.2754512131214142 0.2745696008205414 0.27530866861343384 0.2763848900794983 0.27731868624687195 0.2794644236564636 0.28307804465293884 0.2873600125312805 0.29181772470474243 0.29564568400382996 0.29717445373535156 0.2980411946773529 0.30308812856674194 0.31369927525520325 0.3267776072025299 0.3403771221637726 0.3552534282207489 0.3692227900028229 0.3773849606513977 0.37742289900779724 0.3699462413787842 0.3581613600254059 0.3446747362613678 0.3301258683204651 0.3174242079257965 0.3073962330818176 0.2965550720691681 0.28561556339263916 0.27806076407432556 30445.38885 41541.616519999996 14.87720727584366 44.091357683377474 90.0 Degrees -75.66121752117968 0.024705796952298773 28.883928755026126 1.0573395108768266 0.9941901147353087 -87.96943280855872 0.008170118041294187 85.4864922350208 1.0433897898712823 0.1657092533769018 +0.3949830234050751 0.4622531533241272 0.5109723210334778 0.5819476842880249 0.6732906699180603 0.7399584054946899 0.8056941032409668 0.8803262114524841 0.9407079219818115 0.9959824681282043 1.0247737169265747 0.9988774061203003 0.9598121643066406 0.9596822261810303 0.9756194353103638 0.9531159996986389 0.8880895376205444 0.8291646242141724 0.7852953672409058 0.7326091527938843 0.6583097577095032 0.5755128264427185 0.5128992199897766 0.47360721230506897 0.4461856484413147 0.424794465303421 0.40726786851882935 0.39642640948295593 0.3955315947532654 0.3990853428840637 0.40200623869895935 0.41744357347488403 0.4541429877281189 0.4928371012210846 0.523593544960022 0.5572065114974976 0.6082401275634766 0.6535071730613708 0.6752548813819885 0.6942375302314758 0.7089064717292786 0.6849415898323059 0.648251473903656 0.6290637254714966 0.611190140247345 0.5820888876914978 0.5479511022567749 0.5251440405845642 0.5092036724090576 0.4710317552089691 0.41165193915367126 0.368015855550766 0.33563244342803955 0.30891987681388855 0.289467990398407 0.279835045337677 0.2776188254356384 0.281124472618103 0.2969658076763153 0.3199588358402252 0.3370678722858429 0.35005685687065125 0.3592534065246582 0.3598088026046753 0.3555058240890503 0.34791675209999084 0.3381218910217285 0.32693901658058167 0.3126853406429291 0.3007925748825073 0.2955957353115082 0.2945536673069 0.29722654819488525 0.30562835931777954 0.3160330057144165 0.32335811853408813 0.32722195982933044 0.33106622099876404 0.333890825510025 0.3307388126850128 0.32467377185821533 0.31839045882225037 0.3102380931377411 0.30023348331451416 0.28814268112182617 0.2750730514526367 0.26571476459503174 0.2631886601448059 0.2642560303211212 0.2657497227191925 0.2698196768760681 0.2753346860408783 0.27848049998283386 0.27970898151397705 0.2795354127883911 0.2767869830131531 0.27504852414131165 0.2782919108867645 0.28145065903663635 0.2807522118091583 0.2820216417312622 0.28606170415878296 0.2876238524913788 0.2858695089817047 0.28583207726478577 0.29170745611190796 0.2989623248577118 0.3013303577899933 0.3022397756576538 0.3061143457889557 0.31094178557395935 0.31485098600387573 0.3188069462776184 0.32449349761009216 0.333775132894516 0.34593096375465393 0.3592696785926819 0.3726845979690552 0.3809838593006134 0.37974658608436584 0.37090665102005005 0.3579893112182617 0.3460439443588257 0.33749645948410034 0.3274995684623718 0.3147842586040497 0.3056890070438385 0.3015490472316742 0.2963547110557556 30442.5687 41538.7379 15.053673351479718 43.89851045568374 135.0 Degrees -76.38857262236182 0.004631214554422166 30.204593279869965 0.2093411760614958 0.9998996542510169 -20.289596380815063 0.003978761893197851 87.74938322748216 0.5226610812091969 0.4761749412326489 +0.36599868535995483 0.44001543521881104 0.4966375231742859 0.5643589496612549 0.654793381690979 0.7409048080444336 0.8192135691642761 0.8847960829734802 0.9369638562202454 0.9906289577484131 1.025296688079834 1.0149723291397095 0.9805884957313538 0.9636447429656982 0.9588003158569336 0.9524202942848206 0.9314351677894592 0.8927587270736694 0.8397254943847656 0.7675902843475342 0.6844693422317505 0.6059010624885559 0.5474121570587158 0.5043894052505493 0.468307226896286 0.44075509905815125 0.4207476079463959 0.4080858826637268 0.40591961145401 0.4134867191314697 0.42650675773620605 0.4475072920322418 0.47888901829719543 0.5122790336608887 0.5369526743888855 0.5554997324943542 0.5947977304458618 0.647955060005188 0.6778163313865662 0.6932549476623535 0.6977417469024658 0.6872305870056152 0.659528911113739 0.6245843768119812 0.5957351922988892 0.5746957659721375 0.5465317368507385 0.5116745233535767 0.47723180055618286 0.4333028197288513 0.3936629891395569 0.36897724866867065 0.345966637134552 0.3255443572998047 0.31004011631011963 0.29891106486320496 0.2932963967323303 0.2937392592430115 0.3078584671020508 0.33370327949523926 0.35201096534729004 0.3585779666900635 0.36050570011138916 0.3624379336833954 0.3620472550392151 0.35969817638397217 0.35452911257743835 0.3419364094734192 0.3230227828025818 0.30832669138908386 0.30204203724861145 0.3018741011619568 0.30683496594429016 0.3151794970035553 0.3218154311180115 0.3262678384780884 0.33061009645462036 0.33248963952064514 0.3305680453777313 0.32937225699424744 0.3280726373195648 0.322355717420578 0.3143385052680969 0.30674803256988525 0.2977624237537384 0.28612422943115234 0.27380654215812683 0.26605281233787537 0.2670673131942749 0.27401211857795715 0.2821645736694336 0.28739145398139954 0.289187490940094 0.2906554937362671 0.29101991653442383 0.28759765625 0.28305813670158386 0.28146880865097046 0.2823540270328522 0.2834238111972809 0.28334492444992065 0.28242823481559753 0.2830897569656372 0.285215824842453 0.286749929189682 0.2894335985183716 0.2963193953037262 0.30561134219169617 0.31135934591293335 0.3125182092189789 0.3135771155357361 0.31644806265830994 0.3219490647315979 0.3305686414241791 0.3386459946632385 0.34468361735343933 0.35293155908584595 0.3640737235546112 0.3740508556365967 0.3799596130847931 0.3787302076816559 0.3690877854824066 0.3545362651348114 0.33818575739860535 0.32251599431037903 0.31119340658187866 0.3069508969783783 0.30643993616104126 0.3014766573905945 30445.38885 41538.7379 15.056927844654062 43.61475352701898 135.0 Degrees -81.76750236979787 0.017942087761759287 30.49926270974143 0.8135324371187873 0.9324530395726834 -61.4210730982497 0.011894554755490427 90.06882647010134 1.5974921533722033 0.36275784996581106 +0.36250585317611694 0.42431044578552246 0.4834742844104767 0.5558268427848816 0.6433207988739014 0.7237451076507568 0.797504723072052 0.8740603923797607 0.9462519288063049 1.0028680562973022 1.0236170291900635 0.9993492960929871 0.9659426808357239 0.929129958152771 0.8976386189460754 0.8773003220558167 0.845932126045227 0.804290771484375 0.7517927289009094 0.6770941019058228 0.5976353883743286 0.5313588380813599 0.48177453875541687 0.44140711426734924 0.40849852561950684 0.3899365961551666 0.38149017095565796 0.3739112615585327 0.3684139847755432 0.372007817029953 0.38562244176864624 0.40915170311927795 0.4383581876754761 0.46522119641304016 0.4911789894104004 0.5281954407691956 0.5901359915733337 0.6282098889350891 0.6299937963485718 0.6347435712814331 0.6456948518753052 0.6421006917953491 0.6224752068519592 0.6007646918296814 0.5784657001495361 0.5487658381462097 0.5032517313957214 0.4633730351924896 0.4398660957813263 0.41094517707824707 0.3713396489620209 0.3397798538208008 0.315258264541626 0.2960793673992157 0.2789282202720642 0.26473933458328247 0.2583105266094208 0.26161065697669983 0.276593953371048 0.29428234696388245 0.30759015679359436 0.3208509385585785 0.33403608202934265 0.3378518223762512 0.3314681351184845 0.3205536901950836 0.3096092939376831 0.29909756779670715 0.2854691445827484 0.27216678857803345 0.2648516893386841 0.26480165123939514 0.27259862422943115 0.28223392367362976 0.28807657957077026 0.2966751158237457 0.3103998601436615 0.31771647930145264 0.3139994740486145 0.31038033962249756 0.30780771374702454 0.30000224709510803 0.2885487973690033 0.2776309549808502 0.2691199779510498 0.26336920261383057 0.2575911581516266 0.2499367892742157 0.24667014181613922 0.2502342164516449 0.2533777952194214 0.25388017296791077 0.2556212842464447 0.2578236758708954 0.25818225741386414 0.2583445906639099 0.2599364221096039 0.2620580792427063 0.2627926170825958 0.2631688117980957 0.2642405927181244 0.263955682516098 0.2622736394405365 0.2618711590766907 0.2638363242149353 0.2683615982532501 0.2739871144294739 0.27764204144477844 0.2804603576660156 0.28473037481307983 0.28941360116004944 0.2937960624694824 0.2986640930175781 0.30610325932502747 0.316412091255188 0.3255343437194824 0.3314375877380371 0.33745360374450684 0.3465556502342224 0.355802059173584 0.358920693397522 0.35263997316360474 0.33765292167663574 0.3183898329734802 0.30118611454963684 0.2887457013130188 0.28239473700523376 0.2824958264827728 0.2819530665874481 30442.5687 41541.616519999996 14.148486745442884 40.914534151939826 135.0 Degrees -58.74617564278722 0.012249198283408431 28.641297420407064 0.5230459500184083 0.9052486894719146 -31.249461838574835 0.010471285030812348 83.8267974762999 1.3098037700862717 0.5510780301748821 +0.3650876581668854 0.44027072191238403 0.49740421772003174 0.5676716566085815 0.6565104126930237 0.7217820286750793 0.776906430721283 0.8554854989051819 0.9431904554367065 0.99639892578125 0.9918259382247925 0.9632425308227539 0.9571559429168701 0.9453587532043457 0.9196834564208984 0.9045694470405579 0.8967841863632202 0.8714707493782043 0.8187240958213806 0.7500607967376709 0.6737703084945679 0.5944964289665222 0.5322104096412659 0.48620209097862244 0.4495582580566406 0.4267524480819702 0.4147963225841522 0.4065539836883545 0.40079763531684875 0.40120112895965576 0.4117395281791687 0.4343542158603668 0.4588378369808197 0.4770737290382385 0.49635985493659973 0.5230758190155029 0.5750504732131958 0.6321943402290344 0.6574925780296326 0.6613973379135132 0.6457144618034363 0.6232727766036987 0.6174584627151489 0.6194400787353516 0.6105873584747314 0.5773681402206421 0.5304786562919617 0.4934249520301819 0.45931971073150635 0.41730549931526184 0.38470304012298584 0.3595018684864044 0.3293219804763794 0.30435964465141296 0.2891426980495453 0.2798253893852234 0.2746725082397461 0.2748556435108185 0.2886051833629608 0.3117738366127014 0.32717078924179077 0.33106401562690735 0.3289177715778351 0.33031389117240906 0.33271220326423645 0.3304341435432434 0.32225725054740906 0.30900219082832336 0.2952777147293091 0.2869744896888733 0.28450044989585876 0.2863030433654785 0.29052266478538513 0.29561755061149597 0.3012177348136902 0.3077249825000763 0.3149780333042145 0.3194979727268219 0.31837978959083557 0.3156931400299072 0.31331557035446167 0.3074597716331482 0.29792141914367676 0.28665927052497864 0.2769920229911804 0.2717728316783905 0.2680080831050873 0.26393961906433105 0.2608543634414673 0.25888293981552124 0.25867512822151184 0.2605808675289154 0.263666570186615 0.26618891954421997 0.2665948271751404 0.2663698196411133 0.2670312225818634 0.26882821321487427 0.27096620202064514 0.2717668414115906 0.2718110680580139 0.2726369798183441 0.27475622296333313 0.2783312201499939 0.2822757363319397 0.285504013299942 0.2890436351299286 0.29262956976890564 0.292468398809433 0.2886587381362915 0.28673070669174194 0.2884071469306946 0.29260167479515076 0.30139777064323425 0.31254521012306213 0.32084983587265015 0.329580694437027 0.34177514910697937 0.35234349966049194 0.3568665683269501 0.3554323613643646 0.3491654396057129 0.3388620913028717 0.32499754428863525 0.3104616105556488 0.29853302240371704 0.28830283880233765 0.27974289655685425 0.27512240409851074 30445.38885 41541.616519999996 14.216843459338445 41.87857263213592 135.0 Degrees -75.66121752117968 0.024705796952298773 28.883928755026126 1.0573395108768266 0.9941901147353087 -87.96943280855872 0.008170118041294187 85.4864922350208 1.0433897898712823 0.1657092533769018 diff --git a/orangecontrib/spectroscopy/tests/test_owpolar.py b/orangecontrib/spectroscopy/tests/test_owpolar.py index e2541061f..6f4f4127f 100644 --- a/orangecontrib/spectroscopy/tests/test_owpolar.py +++ b/orangecontrib/spectroscopy/tests/test_owpolar.py @@ -102,15 +102,15 @@ def setUpClass(cls): cls.pol_widget.__init__() cls.mock_in_node = cls.scheme.new_node(widget_description(MockIn)) cls.mock_in_widget = cls.scheme.widget_for_node(cls.mock_in_node) - cls.multifile = Orange.data.Table("polar/4-angle-ftir_multifile.pkl") - cls.in1 = Orange.data.Table("polar/4-angle-ftir_multiin1.pkl") - cls.in2 = Orange.data.Table("polar/4-angle-ftir_multiin2.pkl") - cls.in3 = Orange.data.Table("polar/4-angle-ftir_multiin3.pkl") - cls.in4 = Orange.data.Table("polar/4-angle-ftir_multiin4.pkl") - cls.multifile_polar = Orange.data.Table("polar/4-angle-ftir_multifile_polar-results.pkl") - cls.multifile_model = Orange.data.Table("polar/4-angle-ftir_multifile_model-results.pkl") - cls.multiin_polar = Orange.data.Table("polar/4-angle-ftir_multiin_polar-results.pkl") - cls.multiin_model = Orange.data.Table("polar/4-angle-ftir_multiin_model-results.pkl") + cls.multifile = Orange.data.Table("polar/4-angle-ftir_multifile.tab") + cls.in1 = Orange.data.Table("polar/4-angle-ftir_multiin1.tab") + cls.in2 = Orange.data.Table("polar/4-angle-ftir_multiin2.tab") + cls.in3 = Orange.data.Table("polar/4-angle-ftir_multiin3.tab") + cls.in4 = Orange.data.Table("polar/4-angle-ftir_multiin4.tab") + cls.multifile_polar = Orange.data.Table("polar/4-angle-ftir_multifile_polar-results.tab") + cls.multifile_model = Orange.data.Table("polar/4-angle-ftir_multifile_model-results.tab") + cls.multiin_polar = Orange.data.Table("polar/4-angle-ftir_multiin_polar-results.tab") + cls.multiin_model = Orange.data.Table("polar/4-angle-ftir_multiin_model-results.tab") def test_multifile_init(self): print('test_multifile_init') @@ -144,8 +144,8 @@ def test_multifile_in(self): self.assertFalse(i.isEnabled()) for i in self.pol_widget.multiin_lines: self.assertFalse(i.isEnabled()) - self.pol_widget.angles = self.pol_widget.anglemetas[1] - self.assertEqual(self.pol_widget.angles, self.multifile.domain.metas[4]) + self.pol_widget.angles = self.pol_widget.anglemetas[0] + self.assertEqual(self.pol_widget.angles, self.multifile.domain.metas[2]) self.pol_widget._change_angles() self.assertEqual(len(self.pol_widget.labels), 4) self.assertEqual(len(self.pol_widget.lines), 4) @@ -158,9 +158,9 @@ def test_multifile_in(self): self.assertEqual(self.pol_widget.map_x, self.multifile.domain.metas[0]) self.pol_widget.map_y = self.pol_widget.y_axis[1] self.assertEqual(self.pol_widget.map_y, self.multifile.domain.metas[1]) - self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][3], self.pol_widget.feat_view.model()[:][4]] - self.assertEqual(self.pol_widget.feats[0], self.multifile.domain.metas[5]) - self.assertEqual(self.pol_widget.feats[1], self.multifile.domain.metas[6]) + self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][2], self.pol_widget.feat_view.model()[:][3]] + self.assertEqual(self.pol_widget.feats[0], self.multifile.domain.metas[3]) + self.assertEqual(self.pol_widget.feats[1], self.multifile.domain.metas[4]) self.pol_widget.alpha = 0 self.pol_widget.invert_angles = True self.pol_widget.autocommit = True @@ -188,7 +188,7 @@ def test_multi_inputs(self): self.send_signal("Data", self.in1, 0, widget=self.pol_widget) self.send_signal("Data", self.in2, 1, widget=self.pol_widget) self.pol_widget.handleNewSignals() - + self.assertFalse(self.pol_widget.anglesel.isEnabled()) for i in self.pol_widget.multiin_labels: self.assertFalse(i.isEnabled()) @@ -202,15 +202,15 @@ def test_multi_inputs(self): self.assertTrue(i.isEnabled()) for i in self.pol_widget.multiin_lines: self.assertTrue(i.isEnabled()) - + self.pol_widget.map_x = self.pol_widget.x_axis[0] self.assertEqual(self.pol_widget.map_x, self.in1.domain.metas[0]) self.pol_widget.map_y = self.pol_widget.y_axis[1] self.assertEqual(self.pol_widget.map_y, self.in1.domain.metas[1]) - + self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][2], self.pol_widget.feat_view.model()[:][3]] - self.assertEqual(self.pol_widget.feats[0], self.in1.domain.metas[4].copy(compute_value=None)) #fails because of missing compute_value - self.assertEqual(self.pol_widget.feats[1], self.in1.domain.metas[5].copy(compute_value=None)) + self.assertEqual(self.pol_widget.feats[0], self.in1.domain.metas[2].copy(compute_value=None)) + self.assertEqual(self.pol_widget.feats[1], self.in1.domain.metas[3].copy(compute_value=None)) self.pol_widget.alpha = 0 self.pol_widget.invert_angles = True self.pol_widget.autocommit = True @@ -243,7 +243,7 @@ def test_pixelsubset(self): self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") rng = np.random.default_rng() - sub_idx = rng.choice(132, size=(20), replace=False) + sub_idx = rng.choice(4, size=(2), replace=False) subset = self.in1[sub_idx] self.send_signal("Data", subset, 0, widget=self.pol_widget) @@ -369,11 +369,8 @@ def test_warnings(self): self.assertTrue(self.pol_widget.Warning.pol.is_shown()) self.pol_widget.polangles = [0.0,45.0,90.0,135.0] - self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][0]] - print(type(self.pol_widget.map_x)) - print(type(self.pol_widget.feats[0])) + self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][0]] self.commit_and_wait(self.pol_widget) - print(self.pol_widget.Warning.pol.is_shown()) self.assertTrue(self.pol_widget.Warning.XYfeat.is_shown()) self.reset_input_links() @@ -398,4 +395,3 @@ def test_warnings(self): if __name__ == "__main__": unittest.main() - \ No newline at end of file From a4f857b2131094217a1fd51a2c31ff3e13cc0c22 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Mon, 27 Jun 2022 12:54:09 +1000 Subject: [PATCH 12/93] polar: removed unused functions and imports --- orangecontrib/spectroscopy/widgets/owpolar.py | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 30f1ddb04..6cfbea8fe 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -25,9 +25,6 @@ from AnyQt.QtWidgets import QFormLayout, QWidget, QListView, QLabel, QSizePolicy -from orangecontrib.spectroscopy.data import _spectra_from_image, build_spec_table -from orangecontrib.spectroscopy.utils import get_hypercube - class Results(SimpleNamespace): out = None model = None @@ -129,15 +126,6 @@ def run(data, feature, alpha, map_x, map_y, invert_angles, polangles, state: Tas results.out.attributes = attsdict results.model.attributes = attsdict return results - - -def get_hypercubes(images, xy): - output = [] - lsx, lsy = None, None - for im in images: - hypercube, lsx, lsy = get_hypercube(im, im.domain[xy[0]], im.domain[xy[1]]) - output.append(hypercube) - return output, lsx, lsy #Calculate by fitting to function def Azimuth(x,a0,a1,a2): @@ -368,13 +356,6 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, s return outputs, model, spectra, meta, vars[1] -def hypercube_to_table(hc, wns, lsx, lsy): - table = build_spec_table(*_spectra_from_image(hc, - wns, - np.linspace(*lsx), - np.linspace(*lsy))) - return table - class OWPolar(OWWidget, ConcurrentWidgetMixin): # Widget's name as displayed in the canvas From 5ab319e9751dc602f4691600ecd0c1bb860e100f Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Mon, 18 Jul 2022 17:20:41 +1000 Subject: [PATCH 13/93] owpolar: fixed pylint errors --- orangecontrib/spectroscopy/widgets/owpolar.py | 524 ++++++++++-------- 1 file changed, 284 insertions(+), 240 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 6cfbea8fe..070df096c 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -3,11 +3,12 @@ from multiprocessing import shared_memory from typing import List, Optional, Sequence +import math +from types import SimpleNamespace import numpy as np import pandas as pd from scipy.optimize import curve_fit -import math -from types import SimpleNamespace + import Orange.data from Orange.data import DiscreteVariable, ContinuousVariable, Domain, Variable @@ -22,6 +23,7 @@ from Orange.widgets.data import owconcatenate from orangewidget.utils.listview import ListViewSearch from orangewidget.workflow.widgetsscheme import WidgetsScheme +from orangewidget.gui import LineEditWFocusOut from AnyQt.QtWidgets import QFormLayout, QWidget, QListView, QLabel, QSizePolicy @@ -38,9 +40,9 @@ def sort_domain(domain): rcvs_idx = [] rcvs = [] for j, k in enumerate(cvs): - try: + try: cvs[j][-1] = float(k[-1]) - except: + except ValueError: rcvs.append(k[1]) rcvs_idx.append(j) for j in reversed(rcvs_idx): @@ -54,8 +56,8 @@ def sort_domain(domain): odom = rcvs sorted_dom_lst.append(tuple(odom)) out = Domain(sorted_dom_lst[1], class_vars=sorted_dom_lst[2], metas=sorted_dom_lst[0]) - return out - + return out + def combine_visimg(data, polangles): atts = [] for k, i in enumerate(data): @@ -66,7 +68,9 @@ def combine_visimg(data, polangles): dictcopy = j.copy() dictcopy.update({'name': tempname}) atts = atts + [dictcopy] - except: + except KeyError: + pass + except AttributeError: pass attsdict = {'visible_images': atts} return attsdict @@ -74,12 +78,11 @@ def combine_visimg(data, polangles): def run(data, feature, alpha, map_x, map_y, invert_angles, polangles, state: TaskState): results = Results() - - alpha = alpha - - output, model, spectra, origmetas, errorstate = process_polar_abs(data, alpha, feature, map_x, map_y, invert_angles, polangles, state) - - + + output, model, spectra, origmetas, errorstate = process_polar_abs(data, alpha, feature, map_x, + map_y, invert_angles, polangles, state) + + tempoutaddmetas = [[ContinuousVariable.make('Azimuth Angle (' + i.name + ')'), ContinuousVariable.make('Hermans Orientation Function (' + i.name + ')'), ContinuousVariable.make('Intensity (' + i.name + ')'), @@ -96,9 +99,9 @@ def run(data, feature, alpha, map_x, map_y, invert_angles, polangles, state: Tas modaddmetas = [] for i in tempmodaddmetas: modaddmetas = modaddmetas + i - values = tuple([f'{i} Degrees' for i in polangles]) + values = tuple(f'{i} Degrees' for i in polangles) PolAng = DiscreteVariable.make('Polarisation Angle', values=values) - + ometadom = data[0].domain.metas outmetadom = (ometadom + tuple([PolAng]) + tuple(outaddmetas)) modmetadom = (ometadom + tuple([PolAng]) + tuple(modaddmetas)) @@ -106,8 +109,8 @@ def run(data, feature, alpha, map_x, map_y, invert_angles, polangles, state: Tas datadomain = Domain(ofeatdom, metas = outmetadom) moddomain = Domain(ofeatdom, metas = modmetadom) - output_stack = tuple([output for i in polangles]) - model_stack = tuple([model for i in polangles]) + output_stack = tuple(output for i in polangles) + model_stack = tuple(model for i in polangles) output = np.vstack(output_stack) model = np.vstack(model_stack) @@ -120,15 +123,15 @@ def run(data, feature, alpha, map_x, map_y, invert_angles, polangles, state: Tas results.out = out results.model = mod results.errorstate = errorstate - + attsdict = combine_visimg(data, polangles) - - results.out.attributes = attsdict + + results.out.attributes = attsdict results.model.attributes = attsdict return results #Calculate by fitting to function -def Azimuth(x,a0,a1,a2): +def azimuth(x,a0,a1,a2): return a0*np.sin(2*np.radians(x))+a1*np.cos(2*np.radians(x))+a2 def calc_angles(a0,a1): @@ -140,83 +143,86 @@ def ampl1(a0,a1,a2): def ampl2(a0,a1): return (2*(math.sqrt(a0**2+a1**2))) -def OrFunc(alpha,a0,a1,a2): +def orfunc(alpha,a0,a1,a2): if alpha < 54.73: Dmax = (2*a2+2*math.sqrt(a0**2+a1**2))/(2*a2-2*math.sqrt(a0**2+a1**2)) return ((Dmax-1)/(Dmax+2)*(2/(3*np.cos(np.radians(alpha))**2-1))) elif alpha >= 54.73: Dmin = (2*a2-2*math.sqrt(a0**2+a1**2))/(2*a2+2*math.sqrt(a0**2+a1**2)) return ((Dmin-1)/(Dmin+2)*(2/(3*np.cos(np.radians(alpha))**2-1))) + return None -def compute(xys, yidx, shapes, dtypes, polangles, pidx): +def find_az(alpha, params): + Az0 = calc_angles(params[0],params[1]) + Abs0 = azimuth(Az0, *params) + Az1 = calc_angles(params[0],params[1])+90 + Abs1 = azimuth(Az1, *params) + Az2 = calc_angles(params[0],params[1])-90 + + if alpha < 54.73: + if Abs0 > Abs1: + Az = Az0 + elif Abs1 > Abs0: + if Az1 < 90: + Az = Az1 + elif Az1 > 90: + Az = Az2 + elif alpha >= 54.73: + if Abs0 < Abs1: + Az = Az0 + elif Abs1 < Abs0: + if Az1 < 90: + Az = Az1 + elif Az1 > 90: + Az = Az2 + return Az + +def compute(xys, yidx, shapes, dtypes, polangles): tcvs = shared_memory.SharedMemory(name='cvs', create=False) cvs = np.ndarray(shapes[0], dtype=dtypes[0], buffer=tcvs.buf) tout = shared_memory.SharedMemory(name='out', create=False) - out = np.ndarray(shapes[3], dtype=dtypes[3], buffer=tout.buf) + out = np.ndarray(shapes[3], dtype=dtypes[3], buffer=tout.buf) tmod = shared_memory.SharedMemory(name='mod', create=False) mod = np.ndarray(shapes[4], dtype=dtypes[4], buffer=tmod.buf) tcoords = shared_memory.SharedMemory(name='coords', create=False) coords = np.ndarray(shapes[5], dtype=dtypes[5], buffer=tcoords.buf) tvars = shared_memory.SharedMemory(name='vars', create=False) vars = np.ndarray(shapes[6], dtype=dtypes[6], buffer=tvars.buf) - - x = np.asarray(polangles) + + x = np.asarray(polangles) for i in range(yidx[0], yidx[1]):#y-values(rows) if vars[1] == 1: break - for j, k in enumerate(xys[0]):#x-values(cols) + for j in enumerate(xys[0]):#x-values(cols) for l in range(cvs.shape[2]): - if np.any(np.isnan(cvs[i,j,l,:]), axis=0): + if np.any(np.isnan(cvs[i,j[0],l,:]), axis=0): continue - out[i,j,l,0] = coords[i,j,1]#x-map - mod[i,j,l,0] = coords[i,j,1] - out[i,j,l,1] = coords[i,j,0]#y-map - mod[i,j,l,1] = coords[i,j,0] - - temp = [m for m in cvs[i,j,l,:]] - - params, cov = curve_fit(Azimuth, x, temp) - - residuals = temp - Azimuth(x, *params) + out[i,j[0],l,0] = coords[i,j[0],1]#x-map + mod[i,j[0],l,0] = coords[i,j[0],1] + out[i,j[0],l,1] = coords[i,j[0],0]#y-map + mod[i,j[0],l,1] = coords[i,j[0],0] + + temp = list(cvs[i,j[0],l,:]) + + params = curve_fit(azimuth, x, temp)[0] + + residuals = temp - azimuth(x, *params) ss_res = np.sum(residuals**2) ss_tot = np.sum((temp-np.mean(temp))**2) if ss_tot == 0: vars[1] = 1 break - out[i,j,l,6] = 1-(ss_res/ss_tot) - mod[i,j,l,2] = 1-(ss_res/ss_tot) - - Az0 = calc_angles(params[0],params[1]) - Abs0 = Azimuth(Az0, *params) - Az1 = calc_angles(params[0],params[1])+90 - Abs1 = Azimuth(Az1, *params) - Az2 = calc_angles(params[0],params[1])-90 - - if vars[0] < 54.73: - if Abs0 > Abs1: - out[i,j,l,2] = Az0 - elif Abs1 > Abs0: - if Az1 < 90: - out[i,j,l,2] = Az1 - elif Az1 > 90: - out[i,j,l,2] = Az2 - elif vars[0] >= 54.73: - if Abs0 < Abs1: - out[i,j,l,2] = Az0 - elif Abs1 < Abs0: - if Az1 < 90: - out[i,j,l,2] = Az1 - elif Az1 > 90: - out[i,j,l,2] = Az2 - - out[i,j,l,3] = OrFunc(vars[0], *params) - out[i,j,l,4] = ampl1(*params) - out[i,j,l,5] = ampl2(params[0],params[1]) - mod[i,j,l,3] = params[0] - mod[i,j,l,4] = params[1] - mod[i,j,l,5] = params[2] + out[i,j[0],l,6] = 1-(ss_res/ss_tot) + mod[i,j[0],l,2] = 1-(ss_res/ss_tot) + out[i,j[0],l,2] = find_az(vars[0], params) + out[i,j[0],l,3] = orfunc(vars[0], *params) + out[i,j[0],l,4] = ampl1(*params) + out[i,j[0],l,5] = ampl2(params[0],params[1]) + mod[i,j[0],l,3] = params[0] + mod[i,j[0],l,4] = params[1] + mod[i,j[0],l,5] = params[2] tcvs.close() tout.close() @@ -224,14 +230,11 @@ def compute(xys, yidx, shapes, dtypes, polangles, pidx): tcoords.close() tvars.close() -def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, state): - state.set_status("Preparing...") - - featnames = [i.name for i in feature] +def unique_xys(images, map_x, map_y): lsxs = np.empty(0) lsys = np.empty(0) - for i in range(len(images)): - tempdata = images[i].transform(Domain([map_x, map_y])) + for i in enumerate(images): + tempdata = i[1].transform(Domain([map_x, map_y])) lsx = np.unique(tempdata.X[:,0]) lsy = np.unique(tempdata.X[:,1]) lsxs = np.append(lsxs, lsx) @@ -239,35 +242,81 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, s ulsxs = np.unique(lsxs) ulsys = np.unique(lsys) + return ulsxs, ulsys + +def start_compute(ulsxs, ulsys, shapes, dtypes, polangles, state): + # single core processing is faster for small data sets and small number of selected features + # if > x: + ncpu = os.cpu_count() + # ncpu = 6 + tulsys = np.array_split(ulsys, ncpu) + state.set_status("Calculating...") + threads=[] + cumu = 0 + for i in range(ncpu): + tlsxys = [ulsxs,tulsys[i]] + yidx = [cumu, cumu+len(tulsys[i])] + cumu += len(tulsys[i]) + # compute(tlsxys, yidx, shapes, dtypes, polangles, i) + t = multiprocessing.Process(target=compute, + args=(tlsxys, yidx, shapes, dtypes, polangles)) + threads.append(t) + t.start() + + # for t in threads: + # t.join() + + # else: + # ncpu = 1 + # tulsys = np.array_split(ulsys, ncpu) + # state.set_status("Calculating...") + # threads=[] + # cumu = 0 + # for i in range(ncpu): + # tlsxys = [ulsxs,tulsys[i]] + # yidx = [cumu, cumu+len(tulsys[i])] + # cumu += len(tulsys[i]) + # compute(tlsxys, yidx, shapes, dtypes, polangles, i) + return threads + +def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, state): + state.set_status("Preparing...") + + ulsxs, ulsys = unique_xys(images, map_x, map_y) + if len(ulsxs) > 1: dx = np.sum(np.diff(ulsxs))/(len(ulsxs)-1) else: dx = 1 if len(ulsys) > 1: dy = np.sum(np.diff(ulsys))/(len(ulsys)-1) - else: dy = 1 + else: + dy = 1 minx = np.min(ulsxs) miny = np.min(ulsys) + featnames = [i.name for i in feature] cvs = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], len(featnames), len(images)), np.nan) - spec = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], images[0].X.shape[1], len(images)), np.nan, dtype=object) - metas = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], images[0].metas.shape[1], len(images)), np.nan, dtype=object) + spec = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], + images[0].X.shape[1], len(images)), np.nan, dtype=object) + metas = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], + images[0].metas.shape[1], len(images)), np.nan, dtype=object) out = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], len(featnames), 7), np.nan) mod = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], len(featnames), 6), np.nan) coords = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], 2), np.nan) vars = np.asarray([alpha, 0]) fill = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0]), np.nan) - for i in range(len(images)): - cv = [images[i].domain[j] for j in featnames] + for i, j in enumerate(images): + cv = [j.domain[k] for k in featnames] doms = [map_x, map_y] + cv - tempdata: Table = images[i].transform(Domain(doms)) + tempdata: Table = j.transform(Domain(doms)) temp_xy = tempdata.X[:,0:2].copy() temp_xy[:,0] = np.rint(((temp_xy[:,0]-minx)/dx)) temp_xy[:,1] = np.rint(((temp_xy[:,1]-miny)/dy)) temp_xy = np.array(temp_xy, dtype=np.int_) cvs[temp_xy[:,1],temp_xy[:,0],:,i] = tempdata[:,2:] - spec[temp_xy[:,1],temp_xy[:,0],:,i] = images[i].X - metas[temp_xy[:,1],temp_xy[:,0],:,i] = images[i].metas + spec[temp_xy[:,1],temp_xy[:,0],:,i] = j.X + metas[temp_xy[:,1],temp_xy[:,0],:,i] = j.metas xys = pd.DataFrame(fill, index=ulsys, columns=ulsxs, dtype=object) for k, i in enumerate(xys.index): for l, j in enumerate(xys.columns): @@ -293,51 +342,26 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, s shapes = [cvs.shape, spec.shape, metas.shape, out.shape, mod.shape, coords.shape, vars.shape] dtypes = [cvs.dtype, spec.dtype, metas.dtype, out.dtype, mod.dtype, coords.dtype, vars.dtype] - # single core processing is faster for small data sets and small number of selected features - # if > x: - ncpu = os.cpu_count() - # ncpu = 6 - tulsys = np.array_split(ulsys, ncpu) - state.set_status("Calculating...") - threads=[] - cumu = 0 - for i in range(ncpu): - tlsxys = [ulsxs,tulsys[i]] - yidx = [cumu, cumu+len(tulsys[i])] - cumu += len(tulsys[i]) - # compute(tlsxys, yidx, shapes, dtypes, polangles, i) - t = multiprocessing.Process(target=compute, args=(tlsxys, yidx, shapes, dtypes, polangles, i)) - threads.append(t) - t.start() - + threads = start_compute(ulsxs, ulsys, shapes, dtypes, polangles, state) + for t in threads: t.join() - # else: - # ncpu = 1 - # tulsys = np.array_split(ulsys, ncpu) - # state.set_status("Calculating...") - # threads=[] - # cumu = 0 - # for i in range(ncpu): - # tlsxys = [ulsxs,tulsys[i]] - # yidx = [cumu, cumu+len(tulsys[i])] - # cumu += len(tulsys[i]) - # compute(tlsxys, yidx, shapes, dtypes, polangles, i) - state.set_status("Finishing...") - if invert == True: - sout[:,:,:,2] = sout[:,:,:,2]*-1 + if invert is True: + sout[:,:,:,2] = sout[:,:,:,2]*-1 outputs = np.reshape(sout[:,:,:,2:], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], 5*len(featnames))) model = np.reshape(smod[:,:,:,2:], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], 4*len(featnames))) - + spectra = [] met = [] for i in range(len(polangles)): - spectratemp = np.reshape(spec[:,:,:,i], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].X.shape[1])) + spectratemp = np.reshape(spec[:,:,:,i], + (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].X.shape[1])) spectratemp = spectratemp[~np.isnan(model).any(axis=1)] spectra.append(spectratemp) - metatemp = np.reshape(metas[:,:,:,i], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].metas.shape[1])) + metatemp = np.reshape(metas[:,:,:,i], + (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].metas.shape[1])) metatemp = metatemp[~np.isnan(model).any(axis=1)] metatemp = np.append(metatemp, np.full((np.shape(metatemp)[0],1), i), axis=1) met.append(metatemp) @@ -345,7 +369,7 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, s outputs = outputs[~np.isnan(model).any(axis=1)] model = model[~np.isnan(model).any(axis=1)] - spectra = np.concatenate((spectra), axis=0) + spectra = np.concatenate((spectra), axis=0) meta = np.concatenate((met), axis=0) tcvs.unlink() @@ -357,17 +381,17 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, s return outputs, model, spectra, meta, vars[1] class OWPolar(OWWidget, ConcurrentWidgetMixin): - + # Widget's name as displayed in the canvas name = "4+ Angle Polarisation" - + # Short widget description description = ( "Calculate Azimuth Angle, Orientation function, Amplitude and Intensity of " "vibrational mode(s) using polarised data measured at 4 or more polarisation angles.") icon = "icons/polar.svg" - + # Define inputs and outputs class Inputs: data = MultiInput("Data", Orange.data.Table, default=True) @@ -375,7 +399,7 @@ class Inputs: class Outputs: polar = Output("Polar Data", Orange.data.Table, default=True) model = Output("Curve Fit model data", Orange.data.Table) - + autocommit = settings.Setting(False) settingsHandler = DomainContextHandler() @@ -384,19 +408,19 @@ class Outputs: resizing_enabled = True alpha = ContextSetting(0) - feature = ContextSetting(None) map_x = ContextSetting(None) map_y = ContextSetting(None) invert_angles = Setting(False) - + angles = None anglst = Setting([], packable=False) lines = Setting([], packable=False) labels = Setting([], packable=False) multiin_anglst = Setting([], packable=False) + multiin_lines: List[LineEditWFocusOut] multiin_lines = Setting([], packable=False) + multiin_labels: List[QLabel] multiin_labels = Setting([], packable=False) - minangles = 4 polangles = Setting([], packable=False) n_inputs = 0 @@ -415,38 +439,42 @@ class Warning(OWWidget.Warning): renamed_variables = Msg("Variables with duplicated names have been renamed.") XYfeat = Msg("Selected feature(s) cannot be the same as XY selection") - def __init__(self): + def __init__(self): super().__init__() ConcurrentWidgetMixin.__init__(self) gui.OWComponent.__init__(self) - + self._dumb_tables = owconcatenate.OWConcatenate._dumb_tables self._get_part = owconcatenate.OWConcatenate._get_part self.merge_domains = owconcatenate.OWConcatenate.merge_domains - + self._data_inputs: List[Optional[Table]] = [] self.feats = None hbox = gui.hBox(self.controlArea) #col 1 - + vbox2 = gui.vBox(hbox, "Inputs") - + form2 = QWidget() formlayout2 = QFormLayout() - form2.setLayout(formlayout2) - - self.multifile = gui.widgetBox(vbox2, "Multifile Input (all angles in 1 table)", sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) - + form2.setLayout(formlayout2) + + self.multifile = gui.widgetBox(vbox2, "Multifile Input (all angles in 1 table)", + sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) + self.anglemetas = DomainModel(DomainModel.METAS, valid_types=DiscreteVariable) - self.anglesel = gui.comboBox(self.multifile, self, 'angles', searchable=True, label='Select Angles by:', callback=self._change_angles, model=self.anglemetas) + self.anglesel = gui.comboBox(self.multifile, self, 'angles', searchable=True, + label='Select Angles by:', callback=self._change_angles, + model=self.anglemetas) self.anglesel.setDisabled(True) - - - self.multiin = gui.widgetBox(vbox2, "Multiple Inputs (1 angle per input)", sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) - + + + self.multiin = gui.widgetBox(vbox2, "Multiple Inputs (1 angle per input)", + sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) + vbox2.layout().addWidget(form2) - + #col 2 vbox1 = gui.vBox(hbox, "Features") @@ -457,7 +485,7 @@ def __init__(self): self.feat_view.selectionModel().selectionChanged.connect(self._feat_changed) vbox1.layout().addWidget(self.feat_view) vbox1.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Minimum)) - + #col 3 vbox = gui.vBox(hbox, "Parameters") @@ -465,30 +493,33 @@ def __init__(self): formlayout = QFormLayout() form.setLayout(formlayout) - xybox = gui.widgetBox(vbox, "Data XY Selection", sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) + xybox = gui.widgetBox(vbox, "Data XY Selection", + sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) self.x_axis = DomainModel(DomainModel.METAS, valid_types=DomainModel.PRIMITIVE) self.y_axis = DomainModel(DomainModel.METAS, valid_types=DomainModel.PRIMITIVE) - self.xvar = gui.comboBox(xybox, self, 'map_x', searchable=True, label="X Axis", + gui.comboBox(xybox, self, 'map_x', searchable=True, label="X Axis", callback=self._change_input, model=self.x_axis) - self.yvar = gui.comboBox(xybox, self, 'map_y', searchable=True, label="Y Axis", + gui.comboBox(xybox, self, 'map_y', searchable=True, label="Y Axis", callback=self._change_input, model=self.y_axis) vbox.layout().addWidget(form) - + pbox = gui.widgetBox(vbox, sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) - self.alphavalue = gui.lineEdit(pbox, self, "alpha", "Alpha value", callback=self._change_input, valueType=int) + gui.lineEdit(pbox, self, "alpha", "Alpha value", + callback=self._change_input, valueType=int) - gui.checkBox(pbox, self, 'invert_angles', label="Invert Angles", callback=self._change_input) + gui.checkBox(pbox, self, 'invert_angles', label="Invert Angles", + callback=self._change_input) gui.auto_commit(self.controlArea, self, "autocommit", "Apply", commit=self.commit) self._change_input() self.contextAboutToBeOpened.connect(lambda x: self.init_attr_values(x[0])) - - - self.widgets_scheme: WidgetsScheme = self.signalManager.workflow()# - self.widget_node = self.widgets_scheme.node_for_widget(self) + + + widgets_scheme: WidgetsScheme = self.signalManager.workflow() + self.widget_node = widgets_scheme.node_for_widget(self) def _feat_changed(self): @@ -503,12 +534,10 @@ def init_attr_values(self, data): self.x_axis.set_domain(domain) self.y_axis.set_domain(domain) self.anglemetas.set_domain(domain) - self.group_x = None - self.group_y = None def _change_input(self): self.commit.deferred() - + def _change_angles(self): self.Warning.nodata.clear() if self.angles: @@ -520,7 +549,7 @@ def _change_angles(self): if len(self.angles.values) < 4: self.Warning.notenough() else: - tempangles = np.linspace(0, 180, len(self.angles.values)+1) + tempangles = np.linspace(0, 180, len(self.angles.values)+1) for i, j in enumerate(self.angles.values): self.add_angles(self.anglst, j, self.labels, self.lines, self.multifile, i, tempangles[i], self._send_angles) @@ -528,18 +557,19 @@ def _change_angles(self): for i in self.labels: i.setDisabled(False) for i in self.lines: - i.setDisabled(False) - self.commit.deferred() - - def add_angles(self, anglst, lab, labels, lines, widget, i, place, callback): #to be used in a loop + i.setDisabled(False) + self.commit.deferred() + + def add_angles(self, anglst, lab, labels, lines, widget, + i, place, callback): #to be used in a loop anglst.append(lab) ledit = gui.lineEdit(widget, self, None, label = lab, callback = callback) ledit.setText(str(place)) lines.append(ledit) for j in ledit.parent().children(): - if type(j) is QLabel: + if isinstance(j, QLabel): labels.append(j) - + def clear_angles(self, anglst, lines, labels, widget): for i in reversed(range(self.multiin.layout().count())): self.multiin.layout().itemAt(i).widget().setParent(None) @@ -561,9 +591,9 @@ def _send_ind_angles(self): pol.append(float(i)) self.polangles = pol self.commit.deferred() - except: + except ValueError: pass - + def _send_angles(self): self.polangles.clear() for i in self.lines: @@ -574,139 +604,152 @@ def _send_angles(self): pol.append(float(i)) self.polangles = pol self.commit.deferred() - except: + except ValueError: pass - + + def input_select(self): + if len(self.data) == 0 or 1 < len(self.data) < 4: + self.anglesel.setDisabled(True) + for i in self.multiin_labels: + i.setDisabled(True) + for i in self.multiin_lines: + i.setDisabled(True) + elif len(self.data) == 1: + self.anglesel.setDisabled(False) + for i in self.multiin_labels: + i.setDisabled(True) + for i in self.multiin_lines: + i.setDisabled(True) + elif len(self.data) > 3: + self.anglesel.setDisabled(True) + for i in self.multiin_labels: + i.setDisabled(False) + for i in self.multiin_lines: + i.setDisabled(False) + self._send_ind_angles() + + def check_params(self): + self.Warning.nofeat.clear() + if self.feats is None or len(self.feats) == 0: + self.Warning.nofeat() + return + self.Warning.noxy.clear() + if self.map_x is None or self.map_y is None: + self.Warning.noxy() + return + self.Warning.pol.clear() + if len(self.polangles) == 0: + self.Warning.pol() + return + for i in self.polangles: + if isinstance(i, float) is False: + self.Warning.pol() + return + self.Warning.XYfeat.clear() + for i in self.feats: + if i in (self.map_x, self.map_y): + self.Warning.XYfeat() + return + self.Warning.wrongdata.clear() + @Inputs.data def set_data(self, index: int, dataset: Table): self._data_inputs[index] = dataset - + @Inputs.data.insert def insert_data(self, index, dataset): self._data_inputs.insert(index, dataset) self.n_inputs += 1 self.idx = index - + @Inputs.data.remove def remove_data(self, index): - self._data_inputs.pop(index) + self._data_inputs.pop(index) self.n_inputs -= 1 self.polangles.clear() - + @property def more_data(self) -> Sequence[Table]: return [t for t in self._data_inputs if t is not None] - + def handleNewSignals(self): - self.data = None + self.data = None self.feats = None self.closeContext() self.Warning.clear() self.Outputs.polar.send(None) self.Outputs.model.send(None) self.data = self.more_data - + self.clear_angles(self.anglst, self.lines, self.labels, self.multifile) - self.clear_angles(self.multiin_anglst, self.multiin_lines, self.multiin_labels, self.multiin) - - self.inputlinks = self.signalManager.workflow().input_links(self.widget_node) - self.names = [name.source_node.title for name in self.inputlinks] - - self.tempangles = np.linspace(0, 180, len(self.data)+1) - for i in range(len(self.data)): - self.add_angles(self.multiin_anglst, self.names[i], self.multiin_labels, self.multiin_lines, - self.multiin, i, self.tempangles[i], self._send_ind_angles) - - if len(self.data) == 0 or 1 < len(self.data) < 4: - self.anglesel.setDisabled(True) - for i in self.multiin_labels: - i.setDisabled(True) - for i in self.multiin_lines: - i.setDisabled(True) - elif len(self.data) == 1: - self.anglesel.setDisabled(False) - for i in self.multiin_labels: - i.setDisabled(True) - for i in self.multiin_lines: - i.setDisabled(True) - elif len(self.data) > 3: - self.anglesel.setDisabled(True) - for i in self.multiin_labels: - i.setDisabled(False) - for i in self.multiin_lines: - i.setDisabled(False) - self._send_ind_angles() + self.clear_angles(self.multiin_anglst, self.multiin_lines, + self.multiin_labels, self.multiin) + + inputlinks = self.signalManager.workflow().input_links(self.widget_node) + names = [name.source_node.title for name in inputlinks] + + tempangles = np.linspace(0, 180, len(self.data)+1) + for i in range(len(self.data)): + self.add_angles(self.multiin_anglst, names[i], self.multiin_labels, + self.multiin_lines, self.multiin, i, tempangles[i], + self._send_ind_angles) + + self.input_select() + if len(self.data) == 0: self.Outputs.polar.send(None) self.Outputs.model.send(None) self.contextAboutToBeOpened.emit([Table.from_domain(Domain(()))]) return - + if len(self.data) == 1: - self.openContext(self.data[0]) + self.openContext(self.data[0]) elif 1 < len(self.data) < 4 or len(self.data) == 0: self.Warning.notenough() self.contextAboutToBeOpened.emit([Table.from_domain(Domain(()))]) - return + return else: tables = self._dumb_tables(self) domains = [table.domain for table in tables] self._get_part = self._get_part - self.merge_type = 0 - domain1 = self.merge_domains(self, domains) + self.merge_type = 0 + domain1 = self.merge_domains(self, domains) domain1 = sort_domain(domain1) - self.merge_type = 1 + self.merge_type = 1 domain2 = self.merge_domains(self, domains) self.sorted_data = [table.transform(domain1) for table in tables] self.openContext(Table.from_domain(domain2)) - + self.commit.deferred() @gui.deferred def commit(self): - self.Warning.nofeat.clear() - if self.feats is None or len(self.feats) == 0: - self.Warning.nofeat() - return - self.Warning.noxy.clear() - if self.map_x is None or self.map_y is None: - self.Warning.noxy() - return - self.Warning.pol.clear() - if len(self.polangles) == 0: - self.Warning.pol() + + self.check_params() + if len(self.Warning.active) > 0: return - for i in self.polangles: - if type(i) is not float: - self.Warning.pol() - return - self.Warning.XYfeat.clear() - for i in self.feats: - if i == self.map_x or i == self.map_y: - self.Warning.XYfeat() - return - self.Warning.wrongdata.clear() - + if len(self.data) == 1: if self.angles: - fncol = self.data[0][:, self.angles.name].metas.reshape(-1) + fncol = self.data[0][:, self.angles.name].metas.reshape(-1) images = [] for fn in self.anglst: images.append(self.data[0][self.angles.to_val(fn) == fncol]) sorted_data = images else: - return + return elif 1 < len(self.data) < 4: self.Warning.notenough() self.Outputs.polar.send(None) - self.Outputs.model.send(None) + self.Outputs.model.send(None) return else: - sorted_data = self.sorted_data - - self.start(run, sorted_data, self.feats, self.alpha, self.map_x, self.map_y, self.invert_angles, self.polangles) - + sorted_data = self.sorted_data + + self.start(run, sorted_data, self.feats, self.alpha, self.map_x, + self.map_y, self.invert_angles, self.polangles) + def on_done(self, result: Results): if result is None: self.Outputs.polar.send(None) @@ -718,14 +761,15 @@ def on_done(self, result: Results): self.Outputs.polar.send(result.out) self.Outputs.model.send(result.model) + def on_partial_result(self, result): + pass + def onDeleteWidget(self): self.shutdown() super().onDeleteWidget() - - if __name__ == "__main__": # pragma: no cover from Orange.widgets.utils.widgetpreview import WidgetPreview WidgetPreview(OWPolar).run(Orange.data.Table("ftir-4pol.pkl.gz")) From 90782116bb30b4749990a6f8c8294d7968ff2209 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Mon, 18 Jul 2022 17:21:51 +1000 Subject: [PATCH 14/93] owhyper: fixed pylint errors --- orangecontrib/spectroscopy/widgets/owhyper.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 0a3b02770..72bbaee2e 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -52,7 +52,6 @@ from orangecontrib.spectroscopy.widgets.line_geometry import in_polygon, intersect_line_segments from orangecontrib.spectroscopy.widgets.utils import \ SelectionGroupMixin, SelectionOutputsMixin -from pyqtgraph.functions import mkBrush IMAGE_TOO_BIG = 1024*1024*100 @@ -260,7 +259,7 @@ def color_palette_table(colors, underflow=None, overflow=None): ("Blue", {0: (0,0,255)}), ("Cyan", {0: (0,255,255)}), ("Magenta", {0: (255,0,255)}), - ("Yellow", {0: (255,255,0)}), + ("Yellow", {0: (255,255,0)}), ] def palette_gradient(colors): @@ -1001,7 +1000,7 @@ def set_visible_image_comp_mode(self, comp_mode: QPainter.CompositionMode): def set_vector_co(self, pen): self.c.setPen(pen) - + def set_vector_scale(self, scale): th = self.v[:,0] v_mag = self.v[:,1] @@ -1018,11 +1017,12 @@ def set_vector_scale(self, scale): ycurve[0::2], ycurve[1::2] = y - dispy, y + dispy connect = np.ones((dispx.shape[0]*2)) connect[1::2] = 0 - self.c.setData(x=xcurve, y=ycurve, connect=connect) + self.c.setData(x=xcurve, y=ycurve, connect=connect) @staticmethod def compute_image(data: Orange.data.Table, attr_x, attr_y, - vector_values, image_values, image_values_fixed_levels, choose, state: TaskState): + vector_values, image_values, image_values_fixed_levels, choose, + state: TaskState): if data is None or attr_x is None or attr_y is None: raise UndefinedImageException @@ -1301,7 +1301,7 @@ def __init__(self): # only save its name) self.visible_image = None self.setup_visible_image_controls() - + self.curveplot = CurvePlotHyper(self, select=SELECTONE) self.curveplot.selection_changed.connect(self.redraw_integral_info) self.curveplot.plot.vb.x_padding = 0.005 # pad view so that lines are not hidden @@ -1410,7 +1410,7 @@ def update_visible_image_opacity(self): def init_interface_data(self, data): self.init_attr_values(data) self.init_visible_images(data) - self.init_vector_plot(data) + self.init_vector_plot(data) def output_image_selection(self): _, selected = self.send_selection(self.data, self.imageplot.selection_group) From f08c6f5bcd21e2429a791ce1bc03ae0d6dea5b0b Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Mon, 18 Jul 2022 17:22:35 +1000 Subject: [PATCH 15/93] test_owpolar: fixed pylint errors --- .../spectroscopy/tests/test_owpolar.py | 794 +++++++++--------- 1 file changed, 397 insertions(+), 397 deletions(-) diff --git a/orangecontrib/spectroscopy/tests/test_owpolar.py b/orangecontrib/spectroscopy/tests/test_owpolar.py index 6f4f4127f..9a8161feb 100644 --- a/orangecontrib/spectroscopy/tests/test_owpolar.py +++ b/orangecontrib/spectroscopy/tests/test_owpolar.py @@ -1,397 +1,397 @@ -import numpy as np -import Orange -from Orange.data import ContinuousVariable, DiscreteVariable, Domain -from Orange.widgets.tests.base import WidgetTest, DummySignalManager -from orangecontrib.spectroscopy.widgets.owpolar import OWPolar -from orangewidget.widget import OWBaseWidget, Output, Input -from orangewidget.workflow.widgetsscheme import WidgetsScheme, WidgetsSignalManager -from orangewidget.workflow.tests.test_widgetsscheme import widget_description -from orangewidget.utils.signals import notify_input_helper -from AnyQt.QtCore import QObject, pyqtSignal, QElapsedTimer -from AnyQt.QtTest import QSignalSpy -import unittest -import time - -class Multifile(OWBaseWidget): - name = "Multifile" - - class Outputs: - out = Output("output", Orange.data.Table) - -class Data1(OWBaseWidget): - name = "Data 1" - - class Outputs: - out = Output("output", Orange.data.Table) - -class Data2(OWBaseWidget): - name = "Data 2" - - class Outputs: - out = Output("output", Orange.data.Table) - -class Data3(OWBaseWidget): - name = "Data 3" - - class Outputs: - out = Output("output", Orange.data.Table) - -class Data4(OWBaseWidget): - name = "Data 4" - - class Outputs: - out = Output("output", Orange.data.Table) - -class MockIn(OWBaseWidget): - name = "Results" - - class Inputs: - polar = Input("polar data", Orange.data.Table) - model = Input("model data", Orange.data.Table) - - @Inputs.polar - def set_polar(self, dataset): - self.polar_results = dataset - - @Inputs.model - def set_model(self, dataset): - self.model_results = dataset - -class SigMan(WidgetsSignalManager, DummySignalManager): - def __init__(self, scheme: WidgetsScheme): - WidgetsSignalManager.__init__(self, scheme) - DummySignalManager.__init__(self) - -class TestOWPolar(WidgetTest): - - def reset_input_links(self): - for j, i in enumerate(self.scheme.links): - widget = self.scheme.widget_for_node(i.sink_node) - inputs = vars(widget.Inputs) - input_keys = list(inputs) - - for k in input_keys: - if inputs[k].name == i.sink_channel.name: - key = k - - self.scheme.remove_link(i) - self._send_signal(widget, i.sink_channel.name, - inputs[key].closing_sentinel, j) - self.pol_widget.handleNewSignals() - - @classmethod - def setUpClass(cls): - super().setUpClass() - cls.scheme = WidgetsScheme() - cls.signal_manager = SigMan(cls.scheme) - cls.scheme.signal_manager = cls.signal_manager - - cls.multifile_node = cls.scheme.new_node(widget_description(Multifile)) - cls.multifile_widget = cls.scheme.widget_for_node(cls.multifile_node) - cls.in1_node = cls.scheme.new_node(widget_description(Data1)) - cls.in1_widget = cls.scheme.widget_for_node(cls.in1_node) - cls.in2_node = cls.scheme.new_node(widget_description(Data2)) - cls.in2_widget = cls.scheme.widget_for_node(cls.in2_node) - cls.in3_node = cls.scheme.new_node(widget_description(Data3)) - cls.in3_widget = cls.scheme.widget_for_node(cls.in3_node) - cls.in4_node = cls.scheme.new_node(widget_description(Data4)) - cls.in4_widget = cls.scheme.widget_for_node(cls.in4_node) - cls.pol_node = cls.scheme.new_node(widget_description(OWPolar)) - cls.pol_widget = cls.scheme.widget_for_node(cls.pol_node) - cls.pol_widget.signalManager = cls.scheme.signal_manager - cls.pol_widget.__init__() - cls.mock_in_node = cls.scheme.new_node(widget_description(MockIn)) - cls.mock_in_widget = cls.scheme.widget_for_node(cls.mock_in_node) - cls.multifile = Orange.data.Table("polar/4-angle-ftir_multifile.tab") - cls.in1 = Orange.data.Table("polar/4-angle-ftir_multiin1.tab") - cls.in2 = Orange.data.Table("polar/4-angle-ftir_multiin2.tab") - cls.in3 = Orange.data.Table("polar/4-angle-ftir_multiin3.tab") - cls.in4 = Orange.data.Table("polar/4-angle-ftir_multiin4.tab") - cls.multifile_polar = Orange.data.Table("polar/4-angle-ftir_multifile_polar-results.tab") - cls.multifile_model = Orange.data.Table("polar/4-angle-ftir_multifile_model-results.tab") - cls.multiin_polar = Orange.data.Table("polar/4-angle-ftir_multiin_polar-results.tab") - cls.multiin_model = Orange.data.Table("polar/4-angle-ftir_multiin_model-results.tab") - - def test_multifile_init(self): - print('test_multifile_init') - self.reset_input_links() - self.scheme.new_link(self.multifile_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.multifile, 0, widget=self.pol_widget) - - testfeats = [ft for ft in self.multifile.domain.metas - if isinstance(ft, ContinuousVariable)] - testfeats = testfeats + [ft for ft in self.multifile.domain.attributes - if isinstance(ft, ContinuousVariable)] - polfeats = [ft for ft in self.pol_widget.featureselect[:] - if isinstance(ft, ContinuousVariable)] - self.assertEqual(polfeats, testfeats) - testinputs = [inp for inp in self.multifile.domain - if isinstance(inp, DiscreteVariable)] - self.assertEqual(self.pol_widget.anglemetas[:], testinputs) - testxy = [xy for xy in self.multifile.domain.metas - if isinstance(xy, (ContinuousVariable, DiscreteVariable))] - self.assertEqual(self.pol_widget.x_axis[:], testxy) - self.assertEqual(self.pol_widget.y_axis[:], testxy) - - def test_multifile_in(self): - print('test_multifile_in') - self.reset_input_links() - self.scheme.new_link(self.multifile_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.multifile, 0, widget=self.pol_widget) - - self.assertTrue(self.pol_widget.isEnabled()) - for i in self.pol_widget.multiin_labels: - self.assertFalse(i.isEnabled()) - for i in self.pol_widget.multiin_lines: - self.assertFalse(i.isEnabled()) - self.pol_widget.angles = self.pol_widget.anglemetas[0] - self.assertEqual(self.pol_widget.angles, self.multifile.domain.metas[2]) - self.pol_widget._change_angles() - self.assertEqual(len(self.pol_widget.labels), 4) - self.assertEqual(len(self.pol_widget.lines), 4) - self.assertEqual(self.pol_widget.polangles, list(np.linspace(0, 180, 5)[:4])) - for i in self.pol_widget.labels: - self.assertTrue(i.isEnabled()) - for i in self.pol_widget.lines: - self.assertTrue(i.isEnabled()) - self.pol_widget.map_x = self.pol_widget.x_axis[0] - self.assertEqual(self.pol_widget.map_x, self.multifile.domain.metas[0]) - self.pol_widget.map_y = self.pol_widget.y_axis[1] - self.assertEqual(self.pol_widget.map_y, self.multifile.domain.metas[1]) - self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][2], self.pol_widget.feat_view.model()[:][3]] - self.assertEqual(self.pol_widget.feats[0], self.multifile.domain.metas[3]) - self.assertEqual(self.pol_widget.feats[1], self.multifile.domain.metas[4]) - self.pol_widget.alpha = 0 - self.pol_widget.invert_angles = True - self.pol_widget.autocommit = True - - self.scheme.new_link(self.pol_node, "Polar Data", self.mock_in_node, "polar data") - self.scheme.new_link(self.pol_node, "Curve Fit model data", self.mock_in_node, "model data") - self.commit_and_wait(self.pol_widget, 20000) - - self.scheme.signal_manager.process_node(self.mock_in_node) - polar = self.mock_in_widget.polar_results - model = self.mock_in_widget.model_results - - np.testing.assert_equal(self.multifile_polar.metas, polar.metas) - np.testing.assert_equal(self.multifile_polar.X, polar.X) - np.testing.assert_equal(self.multifile_model.metas, model.metas) - np.testing.assert_equal(self.multifile_model.X, model.X) - - def test_multi_inputs(self): - print('test_multi_inputs') - self.reset_input_links() - self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.in1, 0, widget=self.pol_widget) - self.send_signal("Data", self.in2, 1, widget=self.pol_widget) - self.pol_widget.handleNewSignals() - - self.assertFalse(self.pol_widget.anglesel.isEnabled()) - for i in self.pol_widget.multiin_labels: - self.assertFalse(i.isEnabled()) - for i in self.pol_widget.multiin_lines: - self.assertFalse(i.isEnabled()) - self.send_signal("Data", self.in3, 2, widget=self.pol_widget) - self.send_signal("Data", self.in4, 3, widget=self.pol_widget) - self.pol_widget.handleNewSignals() - self.assertFalse(self.pol_widget.anglesel.isEnabled()) - for i in self.pol_widget.multiin_labels: - self.assertTrue(i.isEnabled()) - for i in self.pol_widget.multiin_lines: - self.assertTrue(i.isEnabled()) - - self.pol_widget.map_x = self.pol_widget.x_axis[0] - self.assertEqual(self.pol_widget.map_x, self.in1.domain.metas[0]) - self.pol_widget.map_y = self.pol_widget.y_axis[1] - self.assertEqual(self.pol_widget.map_y, self.in1.domain.metas[1]) - - self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][2], self.pol_widget.feat_view.model()[:][3]] - self.assertEqual(self.pol_widget.feats[0], self.in1.domain.metas[2].copy(compute_value=None)) - self.assertEqual(self.pol_widget.feats[1], self.in1.domain.metas[3].copy(compute_value=None)) - self.pol_widget.alpha = 0 - self.pol_widget.invert_angles = True - self.pol_widget.autocommit = True - - self.scheme.new_link(self.pol_node, "Polar Data", self.mock_in_node, "polar data") - self.scheme.new_link(self.pol_node, "Curve Fit model data", self.mock_in_node, "model data") - self.commit_and_wait(self.pol_widget, 20000) - - self.scheme.signal_manager.process_node(self.mock_in_node) - polar = self.mock_in_widget.polar_results - model = self.mock_in_widget.model_results - multiin_polar_fixed_values = self.multiin_polar.metas[:,np.r_[0:2,3:7]] - multiin_model_fixed_values = self.multiin_model.metas[:,np.r_[0:2,3:7]] - multiin_polar_calc_values = self.multiin_polar.metas[:,7:] - multiin_model_calc_values = self.multiin_model.metas[:,7:] - - np.testing.assert_equal(multiin_polar_fixed_values, polar.metas[:,np.r_[0:2,3:7]]) - np.testing.assert_equal(multiin_polar_calc_values, polar.metas[:,7:]) - np.testing.assert_equal(self.multiin_polar.X, np.flip(polar.X, axis=1)) - np.testing.assert_equal(multiin_model_fixed_values, model.metas[:,np.r_[0:2,3:7]]) - np.testing.assert_equal(multiin_model_calc_values, model.metas[:,7:]) - np.testing.assert_equal(self.multiin_model.X, np.flip(model.X, axis=1)) - - def test_pixelsubset(self): - #Test multi in with subset of pixels selected - print('test_multi_inputs') - self.reset_input_links() - self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") - rng = np.random.default_rng() - sub_idx = rng.choice(4, size=(2), replace=False) - subset = self.in1[sub_idx] - - self.send_signal("Data", subset, 0, widget=self.pol_widget) - self.send_signal("Data", self.in2, 1, widget=self.pol_widget) - self.send_signal("Data", self.in3, 2, widget=self.pol_widget) - self.send_signal("Data", self.in4, 3, widget=self.pol_widget) - - self.pol_widget.map_x = self.pol_widget.x_axis[0] - self.pol_widget.map_y = self.pol_widget.y_axis[1] - self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][2], self.pol_widget.feat_view.model()[:][3]] - self.pol_widget.alpha = 0 - self.pol_widget.invert_angles = True - self.pol_widget.autocommit = True - - self.scheme.new_link(self.pol_node, "Polar Data", self.mock_in_node, "polar data") - self.scheme.new_link(self.pol_node, "Curve Fit model data", self.mock_in_node, "model data") - self.commit_and_wait(self.pol_widget, 20000) - - self.scheme.signal_manager.process_node(self.mock_in_node) - polar = self.mock_in_widget.polar_results - model = self.mock_in_widget.model_results - - self.assertEqual(len(polar), len(sub_idx)*4) - self.assertEqual(len(model), len(sub_idx)*4) - - def test_multiin_mismatched_domain(self): - # test multi in with different domains - self.reset_input_links() - self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") - - metadom = self.in1.domain.metas - metadom = [i for i in metadom if type(i) is ContinuousVariable] - attdom = self.in1.domain.attributes - attdom = attdom[0::2] - mismatched_domain = Domain(attdom, metas = metadom) - mismatched_table = self.in1.transform(mismatched_domain) - - self.send_signal("Data", mismatched_table, 0, widget=self.pol_widget) - self.send_signal("Data", self.in2, 1, widget=self.pol_widget) - self.send_signal("Data", self.in3, 2, widget=self.pol_widget) - self.send_signal("Data", self.in4, 3, widget=self.pol_widget) - - feat_len = len(metadom) + len(attdom) + 1 - XY_len = len(metadom) - self.assertEqual(feat_len, len(self.pol_widget.feat_view.model()[:])) - self.assertEqual(XY_len, len(self.pol_widget.x_axis[:])) - self.assertEqual(XY_len, len(self.pol_widget.y_axis[:])) - - self.reset_input_links() - self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") - - self.send_signal("Data", self.in2, 0, widget=self.pol_widget) - self.send_signal("Data", self.in3, 1, widget=self.pol_widget) - self.send_signal("Data", mismatched_table, 2, widget=self.pol_widget) - self.send_signal("Data", self.in4, 3, widget=self.pol_widget) - - - feat_len = len(metadom) + len(attdom) + 1 - XY_len = len(metadom) - self.assertEqual(feat_len, len(self.pol_widget.feat_view.model()[:])) - self.assertEqual(XY_len, len(self.pol_widget.x_axis[:])) - self.assertEqual(XY_len, len(self.pol_widget.y_axis[:])) - - def test_custom_angles(self): - # test inputting custom angles (multin and multifile) - self.reset_input_links() - self.scheme.new_link(self.multifile_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.multifile, 0, widget=self.pol_widget) - angles = np.array([0, 22.5, 45.0, 90]) - - for i, j in enumerate(self.pol_widget.lines): - j.setText(str(angles[i])) - self.pol_widget._send_angles() - for i, j in enumerate(self.pol_widget.polangles): - self.assertEqual(j, angles[i]) - - self.reset_input_links() - self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.in1, 0, widget=self.pol_widget) - self.send_signal("Data", self.in2, 1, widget=self.pol_widget) - self.send_signal("Data", self.in3, 2, widget=self.pol_widget) - self.send_signal("Data", self.in4, 3, widget=self.pol_widget) - - for i, j in enumerate(self.pol_widget.multiin_lines): - j.setText(str(angles[i])) - self.pol_widget._send_ind_angles() - for i, j in enumerate(self.pol_widget.polangles): - self.assertEqual(j, angles[i]) - - def test_warnings(self): - #test all warnings - #self.pol_widget.Warning..is_shown() - self.reset_input_links() - self.scheme.new_link(self.multifile_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.multifile, 0, widget=self.pol_widget) - self.pol_widget.autocommit = True - - self.commit_and_wait(self.pol_widget) - self.assertTrue(self.pol_widget.Warning.nofeat.is_shown()) - - self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][4]] - self.pol_widget.map_x = None - self.pol_widget.map_y = None - self.commit_and_wait(self.pol_widget) - self.assertTrue(self.pol_widget.Warning.noxy.is_shown()) - - self.pol_widget.map_x = self.pol_widget.x_axis[0] - self.pol_widget.map_y = self.pol_widget.y_axis[1] - self.pol_widget.polangles = [] - self.commit_and_wait(self.pol_widget) - self.assertTrue(self.pol_widget.Warning.pol.is_shown()) - self.pol_widget.polangles = [0.0,45.0,'hi',135.0] - self.commit_and_wait(self.pol_widget) - self.assertTrue(self.pol_widget.Warning.pol.is_shown()) - - self.pol_widget.polangles = [0.0,45.0,90.0,135.0] - self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][0]] - self.commit_and_wait(self.pol_widget) - self.assertTrue(self.pol_widget.Warning.XYfeat.is_shown()) - - self.reset_input_links() - self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.in1, 0, widget=self.pol_widget) - self.send_signal("Data", self.in2, 1, widget=self.pol_widget) - self.assertTrue(self.pol_widget.Warning.notenough.is_shown()) - - self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.in3, 2, widget=self.pol_widget) - self.assertTrue(self.pol_widget.Warning.notenough.is_shown()) - - self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.in4, 3, widget=self.pol_widget) - self.assertFalse(self.pol_widget.Warning.notenough.is_shown()) - - # def test_clearangles(self): - # #test clearing angles - # pass - -if __name__ == "__main__": - unittest.main() - +import unittest +import numpy as np +import Orange +from Orange.data import ContinuousVariable, DiscreteVariable, Domain +from Orange.widgets.tests.base import WidgetTest, DummySignalManager +from orangewidget.widget import OWBaseWidget, Output, Input +from orangewidget.workflow.widgetsscheme import WidgetsScheme, WidgetsSignalManager +from orangewidget.workflow.tests.test_widgetsscheme import widget_description +from orangecontrib.spectroscopy.widgets.owpolar import OWPolar + +class Multifile(OWBaseWidget): + name = "Multifile" + + class Outputs: + out = Output("output", Orange.data.Table) + +class Data1(OWBaseWidget): + name = "Data 1" + + class Outputs: + out = Output("output", Orange.data.Table) + +class Data2(OWBaseWidget): + name = "Data 2" + + class Outputs: + out = Output("output", Orange.data.Table) + +class Data3(OWBaseWidget): + name = "Data 3" + + class Outputs: + out = Output("output", Orange.data.Table) + +class Data4(OWBaseWidget): + name = "Data 4" + + class Outputs: + out = Output("output", Orange.data.Table) + +class MockIn(OWBaseWidget): + name = "Results" + + class Inputs: + polar = Input("polar data", Orange.data.Table) + model = Input("model data", Orange.data.Table) + + @Inputs.polar + def set_polar(self, dataset): + self.polar_results = dataset + + @Inputs.model + def set_model(self, dataset): + self.model_results = dataset + +class SigMan(WidgetsSignalManager, DummySignalManager): + def __init__(self, scheme: WidgetsScheme): + WidgetsSignalManager.__init__(self, scheme) + DummySignalManager.__init__(self) + +class TestOWPolar(WidgetTest): + + def reset_input_links(self): + for j, i in enumerate(self.scheme.links): + widget = self.scheme.widget_for_node(i.sink_node) + inputs = vars(widget.Inputs) + input_keys = list(inputs) + + for k in input_keys: + if inputs[k].name == i.sink_channel.name: + key = k + + self.scheme.remove_link(i) + self._send_signal(widget, i.sink_channel.name, + inputs[key].closing_sentinel, j) + self.pol_widget.handleNewSignals() + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.scheme = WidgetsScheme() + cls.signal_manager = SigMan(cls.scheme) + cls.scheme.signal_manager = cls.signal_manager + + cls.multifile_node = cls.scheme.new_node(widget_description(Multifile)) + cls.multifile_widget = cls.scheme.widget_for_node(cls.multifile_node) + cls.in1_node = cls.scheme.new_node(widget_description(Data1)) + cls.in1_widget = cls.scheme.widget_for_node(cls.in1_node) + cls.in2_node = cls.scheme.new_node(widget_description(Data2)) + cls.in2_widget = cls.scheme.widget_for_node(cls.in2_node) + cls.in3_node = cls.scheme.new_node(widget_description(Data3)) + cls.in3_widget = cls.scheme.widget_for_node(cls.in3_node) + cls.in4_node = cls.scheme.new_node(widget_description(Data4)) + cls.in4_widget = cls.scheme.widget_for_node(cls.in4_node) + cls.pol_node = cls.scheme.new_node(widget_description(OWPolar)) + cls.pol_widget = cls.scheme.widget_for_node(cls.pol_node) + cls.pol_widget.signalManager = cls.scheme.signal_manager + # cls.pol_widget.__init__() + cls.mock_in_node = cls.scheme.new_node(widget_description(MockIn)) + cls.mock_in_widget = cls.scheme.widget_for_node(cls.mock_in_node) + cls.multifile = Orange.data.Table("polar/4-angle-ftir_multifile.tab") + cls.in1 = Orange.data.Table("polar/4-angle-ftir_multiin1.tab") + cls.in2 = Orange.data.Table("polar/4-angle-ftir_multiin2.tab") + cls.in3 = Orange.data.Table("polar/4-angle-ftir_multiin3.tab") + cls.in4 = Orange.data.Table("polar/4-angle-ftir_multiin4.tab") + cls.multifile_polar = Orange.data.Table("polar/4-angle-ftir_multifile_polar-results.tab") + cls.multifile_model = Orange.data.Table("polar/4-angle-ftir_multifile_model-results.tab") + cls.multiin_polar = Orange.data.Table("polar/4-angle-ftir_multiin_polar-results.tab") + cls.multiin_model = Orange.data.Table("polar/4-angle-ftir_multiin_model-results.tab") + + def test_multifile_init(self): + print('test_multifile_init') + self.reset_input_links() + self.scheme.new_link(self.multifile_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.multifile, 0, widget=self.pol_widget) + + testfeats = [ft for ft in self.multifile.domain.metas + if isinstance(ft, ContinuousVariable)] + testfeats = testfeats + [ft for ft in self.multifile.domain.attributes + if isinstance(ft, ContinuousVariable)] + polfeats = [ft for ft in self.pol_widget.featureselect[:] + if isinstance(ft, ContinuousVariable)] + self.assertEqual(polfeats, testfeats) + testinputs = [inp for inp in self.multifile.domain + if isinstance(inp, DiscreteVariable)] + self.assertEqual(self.pol_widget.anglemetas[:], testinputs) + testxy = [xy for xy in self.multifile.domain.metas + if isinstance(xy, (ContinuousVariable, DiscreteVariable))] + self.assertEqual(self.pol_widget.x_axis[:], testxy) + self.assertEqual(self.pol_widget.y_axis[:], testxy) + + def test_multifile_in(self): + print('test_multifile_in') + self.reset_input_links() + self.scheme.new_link(self.multifile_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.multifile, 0, widget=self.pol_widget) + + self.assertTrue(self.pol_widget.isEnabled()) + for i in self.pol_widget.multiin_labels: + self.assertFalse(i.isEnabled()) + for i in self.pol_widget.multiin_lines: + self.assertFalse(i.isEnabled()) + self.pol_widget.angles = self.pol_widget.anglemetas[0] + self.assertEqual(self.pol_widget.angles, self.multifile.domain.metas[2]) + self.pol_widget._change_angles() + self.assertEqual(len(self.pol_widget.labels), 4) + self.assertEqual(len(self.pol_widget.lines), 4) + self.assertEqual(self.pol_widget.polangles, list(np.linspace(0, 180, 5)[:4])) + for i in self.pol_widget.labels: + self.assertTrue(i.isEnabled()) + for i in self.pol_widget.lines: + self.assertTrue(i.isEnabled()) + self.pol_widget.map_x = self.pol_widget.x_axis[0] + self.assertEqual(self.pol_widget.map_x, self.multifile.domain.metas[0]) + self.pol_widget.map_y = self.pol_widget.y_axis[1] + self.assertEqual(self.pol_widget.map_y, self.multifile.domain.metas[1]) + self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][2], + self.pol_widget.feat_view.model()[:][3]] + self.assertEqual(self.pol_widget.feats[0], self.multifile.domain.metas[3]) + self.assertEqual(self.pol_widget.feats[1], self.multifile.domain.metas[4]) + self.pol_widget.alpha = 0 + self.pol_widget.invert_angles = True + self.pol_widget.autocommit = True + + self.scheme.new_link(self.pol_node, "Polar Data", self.mock_in_node, "polar data") + self.scheme.new_link(self.pol_node, "Curve Fit model data", self.mock_in_node, "model data") + self.commit_and_wait(self.pol_widget, 20000) + + self.scheme.signal_manager.process_node(self.mock_in_node) + polar = self.mock_in_widget.polar_results + model = self.mock_in_widget.model_results + + np.testing.assert_equal(self.multifile_polar.metas, polar.metas) + np.testing.assert_equal(self.multifile_polar.X, polar.X) + np.testing.assert_equal(self.multifile_model.metas, model.metas) + np.testing.assert_equal(self.multifile_model.X, model.X) + + def test_multi_inputs(self): + print('test_multi_inputs') + self.reset_input_links() + self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.in1, 0, widget=self.pol_widget) + self.send_signal("Data", self.in2, 1, widget=self.pol_widget) + self.pol_widget.handleNewSignals() + + self.assertFalse(self.pol_widget.anglesel.isEnabled()) + for i in self.pol_widget.multiin_labels: + self.assertFalse(i.isEnabled()) + for i in self.pol_widget.multiin_lines: + self.assertFalse(i.isEnabled()) + self.send_signal("Data", self.in3, 2, widget=self.pol_widget) + self.send_signal("Data", self.in4, 3, widget=self.pol_widget) + self.pol_widget.handleNewSignals() + self.assertFalse(self.pol_widget.anglesel.isEnabled()) + for i in self.pol_widget.multiin_labels: + self.assertTrue(i.isEnabled()) + for i in self.pol_widget.multiin_lines: + self.assertTrue(i.isEnabled()) + + self.pol_widget.map_x = self.pol_widget.x_axis[0] + self.assertEqual(self.pol_widget.map_x, self.in1.domain.metas[0]) + self.pol_widget.map_y = self.pol_widget.y_axis[1] + self.assertEqual(self.pol_widget.map_y, self.in1.domain.metas[1]) + + self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][2], + self.pol_widget.feat_view.model()[:][3]] + self.assertEqual(self.pol_widget.feats[0], + self.in1.domain.metas[2].copy(compute_value=None)) + self.assertEqual(self.pol_widget.feats[1], + self.in1.domain.metas[3].copy(compute_value=None)) + self.pol_widget.alpha = 0 + self.pol_widget.invert_angles = True + self.pol_widget.autocommit = True + + self.scheme.new_link(self.pol_node, "Polar Data", self.mock_in_node, "polar data") + self.scheme.new_link(self.pol_node, "Curve Fit model data", self.mock_in_node, "model data") + self.commit_and_wait(self.pol_widget, 20000) + + self.scheme.signal_manager.process_node(self.mock_in_node) + polar = self.mock_in_widget.polar_results + model = self.mock_in_widget.model_results + multiin_polar_fixed_values = self.multiin_polar.metas[:,np.r_[0:2,3:7]] + multiin_model_fixed_values = self.multiin_model.metas[:,np.r_[0:2,3:7]] + multiin_polar_calc_values = self.multiin_polar.metas[:,7:] + multiin_model_calc_values = self.multiin_model.metas[:,7:] + + np.testing.assert_equal(multiin_polar_fixed_values, polar.metas[:,np.r_[0:2,3:7]]) + np.testing.assert_equal(multiin_polar_calc_values, polar.metas[:,7:]) + np.testing.assert_equal(self.multiin_polar.X, np.flip(polar.X, axis=1)) + np.testing.assert_equal(multiin_model_fixed_values, model.metas[:,np.r_[0:2,3:7]]) + np.testing.assert_equal(multiin_model_calc_values, model.metas[:,7:]) + np.testing.assert_equal(self.multiin_model.X, np.flip(model.X, axis=1)) + + def test_pixelsubset(self): + #Test multi in with subset of pixels selected + print('test_multi_inputs') + self.reset_input_links() + self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") + rng = np.random.default_rng() + sub_idx = rng.choice(4, size=(2), replace=False) + subset = self.in1[sub_idx] + + self.send_signal("Data", subset, 0, widget=self.pol_widget) + self.send_signal("Data", self.in2, 1, widget=self.pol_widget) + self.send_signal("Data", self.in3, 2, widget=self.pol_widget) + self.send_signal("Data", self.in4, 3, widget=self.pol_widget) + + self.pol_widget.map_x = self.pol_widget.x_axis[0] + self.pol_widget.map_y = self.pol_widget.y_axis[1] + self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][2], + self.pol_widget.feat_view.model()[:][3]] + self.pol_widget.alpha = 0 + self.pol_widget.invert_angles = True + self.pol_widget.autocommit = True + + self.scheme.new_link(self.pol_node, "Polar Data", self.mock_in_node, "polar data") + self.scheme.new_link(self.pol_node, "Curve Fit model data", self.mock_in_node, "model data") + self.commit_and_wait(self.pol_widget, 20000) + + self.scheme.signal_manager.process_node(self.mock_in_node) + polar = self.mock_in_widget.polar_results + model = self.mock_in_widget.model_results + + self.assertEqual(len(polar), len(sub_idx)*4) + self.assertEqual(len(model), len(sub_idx)*4) + + def test_multiin_mismatched_domain(self): + # test multi in with different domains + self.reset_input_links() + self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") + + metadom = self.in1.domain.metas + metadom = [i for i in metadom if isinstance(i, ContinuousVariable)] + attdom = self.in1.domain.attributes + attdom = attdom[0::2] + mismatched_domain = Domain(attdom, metas = metadom) + mismatched_table = self.in1.transform(mismatched_domain) + + self.send_signal("Data", mismatched_table, 0, widget=self.pol_widget) + self.send_signal("Data", self.in2, 1, widget=self.pol_widget) + self.send_signal("Data", self.in3, 2, widget=self.pol_widget) + self.send_signal("Data", self.in4, 3, widget=self.pol_widget) + + feat_len = len(metadom) + len(attdom) + 1 + XY_len = len(metadom) + self.assertEqual(feat_len, len(self.pol_widget.feat_view.model()[:])) + self.assertEqual(XY_len, len(self.pol_widget.x_axis[:])) + self.assertEqual(XY_len, len(self.pol_widget.y_axis[:])) + + self.reset_input_links() + self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") + + self.send_signal("Data", self.in2, 0, widget=self.pol_widget) + self.send_signal("Data", self.in3, 1, widget=self.pol_widget) + self.send_signal("Data", mismatched_table, 2, widget=self.pol_widget) + self.send_signal("Data", self.in4, 3, widget=self.pol_widget) + + + feat_len = len(metadom) + len(attdom) + 1 + XY_len = len(metadom) + self.assertEqual(feat_len, len(self.pol_widget.feat_view.model()[:])) + self.assertEqual(XY_len, len(self.pol_widget.x_axis[:])) + self.assertEqual(XY_len, len(self.pol_widget.y_axis[:])) + + def test_custom_angles(self): + # test inputting custom angles (multin and multifile) + self.reset_input_links() + self.scheme.new_link(self.multifile_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.multifile, 0, widget=self.pol_widget) + angles = np.array([0, 22.5, 45.0, 90]) + + for i, j in enumerate(self.pol_widget.lines): + j.setText(str(angles[i])) + self.pol_widget._send_angles() + for i, j in enumerate(self.pol_widget.polangles): + self.assertEqual(j, angles[i]) + + self.reset_input_links() + self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.in1, 0, widget=self.pol_widget) + self.send_signal("Data", self.in2, 1, widget=self.pol_widget) + self.send_signal("Data", self.in3, 2, widget=self.pol_widget) + self.send_signal("Data", self.in4, 3, widget=self.pol_widget) + + for i, j in enumerate(self.pol_widget.multiin_lines): + j.setText(str(angles[i])) + self.pol_widget._send_ind_angles() + for i, j in enumerate(self.pol_widget.polangles): + self.assertEqual(j, angles[i]) + + def test_warnings(self): + #test all warnings + #self.pol_widget.Warning..is_shown() + self.reset_input_links() + self.scheme.new_link(self.multifile_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.multifile, 0, widget=self.pol_widget) + self.pol_widget.autocommit = True + + self.commit_and_wait(self.pol_widget) + self.assertTrue(self.pol_widget.Warning.nofeat.is_shown()) + + self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][4]] + self.pol_widget.map_x = None + self.pol_widget.map_y = None + self.commit_and_wait(self.pol_widget) + self.assertTrue(self.pol_widget.Warning.noxy.is_shown()) + + self.pol_widget.map_x = self.pol_widget.x_axis[0] + self.pol_widget.map_y = self.pol_widget.y_axis[1] + self.pol_widget.polangles = [] + self.commit_and_wait(self.pol_widget) + self.assertTrue(self.pol_widget.Warning.pol.is_shown()) + self.pol_widget.polangles = [0.0,45.0,'hi',135.0] + self.commit_and_wait(self.pol_widget) + self.assertTrue(self.pol_widget.Warning.pol.is_shown()) + + self.pol_widget.polangles = [0.0,45.0,90.0,135.0] + self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][0]] + self.commit_and_wait(self.pol_widget) + self.assertTrue(self.pol_widget.Warning.XYfeat.is_shown()) + + self.reset_input_links() + self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") + self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.in1, 0, widget=self.pol_widget) + self.send_signal("Data", self.in2, 1, widget=self.pol_widget) + self.assertTrue(self.pol_widget.Warning.notenough.is_shown()) + + self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.in3, 2, widget=self.pol_widget) + self.assertTrue(self.pol_widget.Warning.notenough.is_shown()) + + self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") + self.send_signal("Data", self.in4, 3, widget=self.pol_widget) + self.assertFalse(self.pol_widget.Warning.notenough.is_shown()) + + # def test_clearangles(self): + # #test clearing angles + # pass + +if __name__ == "__main__": + unittest.main() From e6cc33fa58d7432d0e72e86eb2d27efa6cba5297 Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Tue, 26 Jul 2022 11:45:33 +0200 Subject: [PATCH 16/93] Update manifest --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index 67c856d56..57ba32689 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -8,6 +8,7 @@ recursive-include orangecontrib/spectroscopy/datasets NeaReaderGSF_test/* recursive-include orangecontrib/spectroscopy/datasets renishaw_test_files/* recursive-include orangecontrib/spectroscopy/datasets photothermal/* recursive-include orangecontrib/spectroscopy/datasets perkinelmer/* +recursive-include orangecontrib/spectroscopy/datasets polar/* global-exclude __pycache__ From 69e66c074d26090007f6fb62ff581b787df87fce Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Wed, 3 Aug 2022 14:07:54 +0200 Subject: [PATCH 17/93] owpolar: save and load selected features --- orangecontrib/spectroscopy/widgets/owpolar.py | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 070df096c..8b00b07e1 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -7,6 +7,7 @@ from types import SimpleNamespace import numpy as np import pandas as pd +from AnyQt.QtCore import QItemSelectionModel, QItemSelection, QItemSelectionRange from scipy.optimize import curve_fit @@ -21,12 +22,29 @@ from Orange.widgets.utils.itemmodels import DomainModel from Orange.widgets.utils.concurrent import TaskState, ConcurrentWidgetMixin from Orange.widgets.data import owconcatenate +from Orange.widgets.data.oweditdomain import disconnected from orangewidget.utils.listview import ListViewSearch from orangewidget.workflow.widgetsscheme import WidgetsScheme from orangewidget.gui import LineEditWFocusOut from AnyQt.QtWidgets import QFormLayout, QWidget, QListView, QLabel, QSizePolicy + +def _restore_selected_items(model, view, setting, connector): + selection = QItemSelection() + sel_model: QItemSelectionModel = view.selectionModel() + with disconnected(sel_model.selectionChanged, + connector): + valid = [] + model_values = model[:] + for var in setting: + index = model_values.index(var) + model_index = view.model().index(index, 0) + selection.append(QItemSelectionRange(model_index)) + valid.append(var) + sel_model.select(selection, QItemSelectionModel.ClearAndSelect) + + class Results(SimpleNamespace): out = None model = None @@ -380,6 +398,7 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, s return outputs, model, spectra, meta, vars[1] + class OWPolar(OWWidget, ConcurrentWidgetMixin): # Widget's name as displayed in the canvas @@ -406,11 +425,11 @@ class Outputs: want_main_area = False resizing_enabled = True - alpha = ContextSetting(0) + alpha = Setting(0, schema_only=True) map_x = ContextSetting(None) map_y = ContextSetting(None) - invert_angles = Setting(False) + invert_angles = Setting(False, schema_only=True) angles = None anglst = Setting([], packable=False) @@ -424,7 +443,7 @@ class Outputs: polangles = Setting([], packable=False) n_inputs = 0 - feats: List[Variable] = Setting([]) + feats: List[Variable] = ContextSetting([]) class Warning(OWWidget.Warning): nodata = Msg("No useful data on input!") @@ -449,7 +468,6 @@ def __init__(self): self.merge_domains = owconcatenate.OWConcatenate.merge_domains self._data_inputs: List[Optional[Table]] = [] - self.feats = None hbox = gui.hBox(self.controlArea) #col 1 @@ -485,6 +503,11 @@ def __init__(self): self.feat_view.selectionModel().selectionChanged.connect(self._feat_changed) vbox1.layout().addWidget(self.feat_view) vbox1.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Minimum)) + self.contextOpened.connect( + lambda: _restore_selected_items(model=self.featureselect, + view=self.feat_view, + setting=self.feats, + connector=self._feat_changed)) #col 3 vbox = gui.vBox(hbox, "Parameters") @@ -674,7 +697,6 @@ def more_data(self) -> Sequence[Table]: def handleNewSignals(self): self.data = None - self.feats = None self.closeContext() self.Warning.clear() self.Outputs.polar.send(None) From 8710a7f1e115b7cb6919e0a6041727a034e3f18e Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Wed, 3 Aug 2022 14:08:19 +0200 Subject: [PATCH 18/93] owpolar: commit on new data input, as per standard --- orangecontrib/spectroscopy/widgets/owpolar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 8b00b07e1..a742452cf 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -743,7 +743,7 @@ def handleNewSignals(self): self.sorted_data = [table.transform(domain1) for table in tables] self.openContext(Table.from_domain(domain2)) - self.commit.deferred() + self.commit.now() @gui.deferred def commit(self): From c4b2f38e240838c418f8e49b76e3ee8d6d300720 Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Mon, 8 Aug 2022 15:32:02 +0200 Subject: [PATCH 19/93] SharedMemory: dynamic names (fix repeating same names) --- orangecontrib/spectroscopy/widgets/owpolar.py | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index a742452cf..df9db9a1c 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -195,17 +195,17 @@ def find_az(alpha, params): Az = Az2 return Az -def compute(xys, yidx, shapes, dtypes, polangles): +def compute(xys, yidx, names, shapes, dtypes, polangles): - tcvs = shared_memory.SharedMemory(name='cvs', create=False) + tcvs = shared_memory.SharedMemory(name=names[0], create=False) cvs = np.ndarray(shapes[0], dtype=dtypes[0], buffer=tcvs.buf) - tout = shared_memory.SharedMemory(name='out', create=False) + tout = shared_memory.SharedMemory(name=names[3], create=False) out = np.ndarray(shapes[3], dtype=dtypes[3], buffer=tout.buf) - tmod = shared_memory.SharedMemory(name='mod', create=False) + tmod = shared_memory.SharedMemory(name=names[4], create=False) mod = np.ndarray(shapes[4], dtype=dtypes[4], buffer=tmod.buf) - tcoords = shared_memory.SharedMemory(name='coords', create=False) + tcoords = shared_memory.SharedMemory(name=names[5], create=False) coords = np.ndarray(shapes[5], dtype=dtypes[5], buffer=tcoords.buf) - tvars = shared_memory.SharedMemory(name='vars', create=False) + tvars = shared_memory.SharedMemory(name=names[6], create=False) vars = np.ndarray(shapes[6], dtype=dtypes[6], buffer=tvars.buf) x = np.asarray(polangles) @@ -262,7 +262,7 @@ def unique_xys(images, map_x, map_y): ulsys = np.unique(lsys) return ulsxs, ulsys -def start_compute(ulsxs, ulsys, shapes, dtypes, polangles, state): +def start_compute(ulsxs, ulsys, names, shapes, dtypes, polangles, state): # single core processing is faster for small data sets and small number of selected features # if > x: ncpu = os.cpu_count() @@ -277,7 +277,7 @@ def start_compute(ulsxs, ulsys, shapes, dtypes, polangles, state): cumu += len(tulsys[i]) # compute(tlsxys, yidx, shapes, dtypes, polangles, i) t = multiprocessing.Process(target=compute, - args=(tlsxys, yidx, shapes, dtypes, polangles)) + args=(tlsxys, yidx, names, shapes, dtypes, polangles)) threads.append(t) t.start() @@ -341,26 +341,27 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, s coords[k,l,0] = i coords[k,l,1] = j - tcvs = shared_memory.SharedMemory(name='cvs', create=True, size=cvs.nbytes) + tcvs = shared_memory.SharedMemory(create=True, size=cvs.nbytes) scvs = np.ndarray(cvs.shape, dtype=cvs.dtype, buffer=tcvs.buf) scvs[:,:,:] = cvs[:,:,:] - tout = shared_memory.SharedMemory(name='out', create=True, size=out.nbytes) + tout = shared_memory.SharedMemory(create=True, size=out.nbytes) sout = np.ndarray(out.shape, dtype=out.dtype, buffer=tout.buf) sout[:,:,:,:] = out[:,:,:,:] - tmod = shared_memory.SharedMemory(name='mod', create=True, size=mod.nbytes) + tmod = shared_memory.SharedMemory(create=True, size=mod.nbytes) smod = np.ndarray(mod.shape, dtype=mod.dtype, buffer=tmod.buf) smod[:,:,:,:] = mod[:,:,:,:] - tcoords = shared_memory.SharedMemory(name='coords', create=True, size=coords.nbytes) + tcoords = shared_memory.SharedMemory(create=True, size=coords.nbytes) scoords = np.ndarray(coords.shape, dtype=coords.dtype, buffer=tcoords.buf) scoords[:,:,:] = coords[:,:,:] - tvars = shared_memory.SharedMemory(name='vars', create=True, size=vars.nbytes) + tvars = shared_memory.SharedMemory(create=True, size=vars.nbytes) svars = np.ndarray(vars.shape, dtype=vars.dtype, buffer=tvars.buf) svars[:] = vars[:] + names = [tcvs.name, None, None, tout.name, tmod.name, tcoords.name, tvars.name] shapes = [cvs.shape, spec.shape, metas.shape, out.shape, mod.shape, coords.shape, vars.shape] dtypes = [cvs.dtype, spec.dtype, metas.dtype, out.dtype, mod.dtype, coords.dtype, vars.dtype] - threads = start_compute(ulsxs, ulsys, shapes, dtypes, polangles, state) + threads = start_compute(ulsxs, ulsys, names, shapes, dtypes, polangles, state) for t in threads: t.join() From 0f10d7eab50827248b5a43269117298fe9319cd2 Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Mon, 8 Aug 2022 15:47:39 +0200 Subject: [PATCH 20/93] Less fitting iterations due to exact jaccardian --- orangecontrib/spectroscopy/widgets/owpolar.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index df9db9a1c..4ba8caf3c 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -150,7 +150,15 @@ def run(data, feature, alpha, map_x, map_y, invert_angles, polangles, state: Tas #Calculate by fitting to function def azimuth(x,a0,a1,a2): - return a0*np.sin(2*np.radians(x))+a1*np.cos(2*np.radians(x))+a2 + t = 2*np.radians(x) + return a0*np.sin(t)+a1*np.cos(t)+a2 + +def azimuth_jac(x, a0, a1, a2): + t = 2*np.radians(x).reshape(-1, 1) + da0 = np.sin(t) + da1 = np.cos(t) + da2 = np.ones(t.shape) + return np.hstack((da0, da1, da2)) def calc_angles(a0,a1): return np.degrees(0.5*np.arctan(a0/a1)) @@ -224,7 +232,7 @@ def compute(xys, yidx, names, shapes, dtypes, polangles): temp = list(cvs[i,j[0],l,:]) - params = curve_fit(azimuth, x, temp)[0] + params = curve_fit(azimuth, x, temp, jac=azimuth_jac)[0] residuals = temp - azimuth(x, *params) ss_res = np.sum(residuals**2) From a5e69e4130ffbdc8fd15369de6b5d37e5e95ad2b Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Fri, 5 Aug 2022 17:02:02 +1000 Subject: [PATCH 21/93] widgetscheme: changed widget from using widget scheme to label data inputs to using table names --- orangecontrib/spectroscopy/widgets/owpolar.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 4ba8caf3c..10736a97a 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -24,7 +24,6 @@ from Orange.widgets.data import owconcatenate from Orange.widgets.data.oweditdomain import disconnected from orangewidget.utils.listview import ListViewSearch -from orangewidget.workflow.widgetsscheme import WidgetsScheme from orangewidget.gui import LineEditWFocusOut from AnyQt.QtWidgets import QFormLayout, QWidget, QListView, QLabel, QSizePolicy @@ -550,10 +549,6 @@ def __init__(self): self.contextAboutToBeOpened.connect(lambda x: self.init_attr_values(x[0])) - widgets_scheme: WidgetsScheme = self.signalManager.workflow() - self.widget_node = widgets_scheme.node_for_widget(self) - - def _feat_changed(self): rows = self.feat_view.selectionModel().selectedRows() values = self.feat_view.model()[:] @@ -716,8 +711,7 @@ def handleNewSignals(self): self.clear_angles(self.multiin_anglst, self.multiin_lines, self.multiin_labels, self.multiin) - inputlinks = self.signalManager.workflow().input_links(self.widget_node) - names = [name.source_node.title for name in inputlinks] + names = [i.name for i in self.data] tempangles = np.linspace(0, 180, len(self.data)+1) for i in range(len(self.data)): From 6ab8100e071edcfeef9ebe9dd10ed8693cc14703 Mon Sep 17 00:00:00 2001 From: callumgassner Date: Tue, 9 Aug 2022 13:13:15 +1000 Subject: [PATCH 22/93] owpolar: Remove unnecessary settings --- orangecontrib/spectroscopy/widgets/owpolar.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 10736a97a..0d75d2084 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -440,15 +440,13 @@ class Outputs: invert_angles = Setting(False, schema_only=True) angles = None - anglst = Setting([], packable=False) - lines = Setting([], packable=False) - labels = Setting([], packable=False) - multiin_anglst = Setting([], packable=False) - multiin_lines: List[LineEditWFocusOut] - multiin_lines = Setting([], packable=False) - multiin_labels: List[QLabel] - multiin_labels = Setting([], packable=False) - polangles = Setting([], packable=False) + anglst = [] + lines = [] + labels = [] + multiin_anglst = [] + multiin_lines = [] + multiin_labels = [] + polangles = [] n_inputs = 0 feats: List[Variable] = ContextSetting([]) From 3b152ca387f69928db78f5752c1abdefc1457de9 Mon Sep 17 00:00:00 2001 From: callumgassner Date: Fri, 12 Aug 2022 12:15:00 +1000 Subject: [PATCH 23/93] owpolar: Fixed auto selection of angle separator --- orangecontrib/spectroscopy/widgets/owpolar.py | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 0d75d2084..2d9daf74f 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -8,6 +8,7 @@ import numpy as np import pandas as pd from AnyQt.QtCore import QItemSelectionModel, QItemSelection, QItemSelectionRange +from AnyQt.QtWidgets import QFormLayout, QWidget, QListView, QLabel, QSizePolicy from scipy.optimize import curve_fit @@ -18,15 +19,12 @@ from Orange.widgets import gui, settings from Orange.widgets.settings import \ - Setting, ContextSetting, DomainContextHandler + Setting, ContextSetting, PerfectDomainContextHandler from Orange.widgets.utils.itemmodels import DomainModel from Orange.widgets.utils.concurrent import TaskState, ConcurrentWidgetMixin from Orange.widgets.data import owconcatenate from Orange.widgets.data.oweditdomain import disconnected from orangewidget.utils.listview import ListViewSearch -from orangewidget.gui import LineEditWFocusOut - -from AnyQt.QtWidgets import QFormLayout, QWidget, QListView, QLabel, QSizePolicy def _restore_selected_items(model, view, setting, connector): @@ -429,7 +427,9 @@ class Outputs: autocommit = settings.Setting(False) - settingsHandler = DomainContextHandler() + settingsHandler = PerfectDomainContextHandler( + match_values=PerfectDomainContextHandler.MATCH_VALUES_ALL + ) want_main_area = False resizing_enabled = True @@ -438,8 +438,8 @@ class Outputs: map_x = ContextSetting(None) map_y = ContextSetting(None) invert_angles = Setting(False, schema_only=True) + angles = ContextSetting(None) - angles = None anglst = [] lines = [] labels = [] @@ -596,11 +596,13 @@ def add_angles(self, anglst, lab, labels, lines, widget, labels.append(j) def clear_angles(self, anglst, lines, labels, widget): - for i in reversed(range(self.multiin.layout().count())): - self.multiin.layout().itemAt(i).widget().setParent(None) - for i in reversed(range(self.multifile.layout().count())): - if i != 0: - self.multifile.layout().itemAt(i).widget().setParent(None) + if widget is self.multiin: + for i in reversed(range(self.multiin.layout().count())): + self.multiin.layout().itemAt(i).widget().setParent(None) + if widget is self.multifile: + for i in reversed(range(self.multifile.layout().count())): + if i != 0: + self.multifile.layout().itemAt(i).widget().setParent(None) anglst.clear() lines.clear() labels.clear() @@ -698,8 +700,8 @@ def more_data(self) -> Sequence[Table]: return [t for t in self._data_inputs if t is not None] def handleNewSignals(self): - self.data = None self.closeContext() + self.data = None self.Warning.clear() self.Outputs.polar.send(None) self.Outputs.model.send(None) @@ -727,6 +729,7 @@ def handleNewSignals(self): if len(self.data) == 1: self.openContext(self.data[0]) + self._change_angles() elif 1 < len(self.data) < 4 or len(self.data) == 0: self.Warning.notenough() self.contextAboutToBeOpened.emit([Table.from_domain(Domain(()))]) @@ -795,4 +798,4 @@ def onDeleteWidget(self): if __name__ == "__main__": # pragma: no cover from Orange.widgets.utils.widgetpreview import WidgetPreview - WidgetPreview(OWPolar).run(Orange.data.Table("ftir-4pol.pkl.gz")) + WidgetPreview(OWPolar).run(insert_data=[(0, Orange.data.Table("polar\\4-angle-ftir_multifile.tab"))]) From 5c43f3fbbc07d224bfcefac5ab6fbadae288426c Mon Sep 17 00:00:00 2001 From: callumgassner Date: Fri, 12 Aug 2022 15:36:17 +1000 Subject: [PATCH 24/93] owpolar: Add ability to average output spectra --- orangecontrib/spectroscopy/widgets/owpolar.py | 73 +++++++++++++------ 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 2d9daf74f..06e1bc771 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -90,13 +90,13 @@ def combine_visimg(data, polangles): attsdict = {'visible_images': atts} return attsdict -def run(data, feature, alpha, map_x, map_y, invert_angles, polangles, state: TaskState): +def run(data, feature, alpha, map_x, map_y, invert_angles, polangles, average, + sep, state: TaskState): results = Results() output, model, spectra, origmetas, errorstate = process_polar_abs(data, alpha, feature, map_x, - map_y, invert_angles, polangles, state) - + map_y, invert_angles, polangles, average, state) tempoutaddmetas = [[ContinuousVariable.make('Azimuth Angle (' + i.name + ')'), ContinuousVariable.make('Hermans Orientation Function (' + i.name + ')'), @@ -114,21 +114,30 @@ def run(data, feature, alpha, map_x, map_y, invert_angles, polangles, state: Tas modaddmetas = [] for i in tempmodaddmetas: modaddmetas = modaddmetas + i - values = tuple(f'{i} Degrees' for i in polangles) - PolAng = DiscreteVariable.make('Polarisation Angle', values=values) - ometadom = data[0].domain.metas - outmetadom = (ometadom + tuple([PolAng]) + tuple(outaddmetas)) - modmetadom = (ometadom + tuple([PolAng]) + tuple(modaddmetas)) + if average is False: + values = tuple(f'{i} Degrees' for i in polangles) + PolAng = DiscreteVariable.make('Polarisation Angle', values=values) + outmetadom = (ometadom + tuple([PolAng]) + tuple(outaddmetas)) + modmetadom = (ometadom + tuple([PolAng]) + tuple(modaddmetas)) + output_stack = tuple(output for i in polangles) + model_stack = tuple(model for i in polangles) + output = np.vstack(output_stack) + model = np.vstack(model_stack) + elif average is True: + if sep is not None: + sep_idx = ometadom.index(sep) + try: + origmetas = np.c_[origmetas[:,0:sep_idx], origmetas[:,sep_idx+1:]] + except ValueError: + origmetas = np.r_[origmetas[:,0:sep_idx]] + ometadom = tuple(i for i in ometadom if i is not sep) + outmetadom = (ometadom + tuple(outaddmetas)) + modmetadom = (ometadom + tuple(modaddmetas)) + ofeatdom = data[0].domain.attributes datadomain = Domain(ofeatdom, metas = outmetadom) moddomain = Domain(ofeatdom, metas = modmetadom) - - output_stack = tuple(output for i in polangles) - model_stack = tuple(model for i in polangles) - output = np.vstack(output_stack) - model = np.vstack(model_stack) - outmetas = np.hstack((origmetas, output)) modmetas = np.hstack((origmetas, model)) @@ -302,7 +311,7 @@ def start_compute(ulsxs, ulsys, names, shapes, dtypes, polangles, state): # compute(tlsxys, yidx, shapes, dtypes, polangles, i) return threads -def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, state): +def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, average, state): state.set_status("Preparing...") ulsxs, ulsys = unique_xys(images, map_x, map_y) @@ -379,15 +388,26 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, s spectra = [] met = [] - for i in range(len(polangles)): - spectratemp = np.reshape(spec[:,:,:,i], - (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].X.shape[1])) + if average is False: + for i in range(len(polangles)): + spectratemp = np.reshape(spec[:,:,:,i], + (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].X.shape[1])) + spectratemp = spectratemp[~np.isnan(model).any(axis=1)] + spectra.append(spectratemp) + metatemp = np.reshape(metas[:,:,:,i], + (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].metas.shape[1])) + metatemp = metatemp[~np.isnan(model).any(axis=1)] + metatemp = np.append(metatemp, np.full((np.shape(metatemp)[0],1), i), axis=1) + met.append(metatemp) + elif average is True: + average_spec = np.average(spec, axis=3) + spectratemp = np.reshape(average_spec, + (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].X.shape[1])) spectratemp = spectratemp[~np.isnan(model).any(axis=1)] spectra.append(spectratemp) - metatemp = np.reshape(metas[:,:,:,i], - (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].metas.shape[1])) + metatemp = np.reshape(metas[:,:,:,0], + (np.shape(ulsys)[0]*np.shape(ulsxs)[0], images[0].metas.shape[1])) metatemp = metatemp[~np.isnan(model).any(axis=1)] - metatemp = np.append(metatemp, np.full((np.shape(metatemp)[0],1), i), axis=1) met.append(metatemp) outputs = outputs[~np.isnan(model).any(axis=1)] @@ -438,6 +458,7 @@ class Outputs: map_x = ContextSetting(None) map_y = ContextSetting(None) invert_angles = Setting(False, schema_only=True) + average = Setting(False, schema_only=True) angles = ContextSetting(None) anglst = [] @@ -525,8 +546,8 @@ def __init__(self): xybox = gui.widgetBox(vbox, "Data XY Selection", sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) - self.x_axis = DomainModel(DomainModel.METAS, valid_types=DomainModel.PRIMITIVE) - self.y_axis = DomainModel(DomainModel.METAS, valid_types=DomainModel.PRIMITIVE) + self.x_axis = DomainModel(DomainModel.METAS, valid_types=ContinuousVariable) + self.y_axis = DomainModel(DomainModel.METAS, valid_types=ContinuousVariable) gui.comboBox(xybox, self, 'map_x', searchable=True, label="X Axis", callback=self._change_input, model=self.x_axis) @@ -542,6 +563,9 @@ def __init__(self): gui.checkBox(pbox, self, 'invert_angles', label="Invert Angles", callback=self._change_input) + gui.checkBox(pbox, self, 'average', label='Average Spectra', + callback=self._change_input) + gui.auto_commit(self.controlArea, self, "autocommit", "Apply", commit=self.commit) self._change_input() self.contextAboutToBeOpened.connect(lambda x: self.init_attr_values(x[0])) @@ -774,7 +798,8 @@ def commit(self): sorted_data = self.sorted_data self.start(run, sorted_data, self.feats, self.alpha, self.map_x, - self.map_y, self.invert_angles, self.polangles) + self.map_y, self.invert_angles, self.polangles, + self.average, self.angles) def on_done(self, result: Results): if result is None: From 9e254f943c886eee3e8fd297f942182047aebb27 Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Fri, 19 Aug 2022 13:16:19 +0200 Subject: [PATCH 25/93] Add cross platform paths Fixup: wpolar: Fixed auto selection of angle separator, --- orangecontrib/spectroscopy/widgets/owpolar.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 06e1bc771..263213234 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -823,4 +823,5 @@ def onDeleteWidget(self): if __name__ == "__main__": # pragma: no cover from Orange.widgets.utils.widgetpreview import WidgetPreview - WidgetPreview(OWPolar).run(insert_data=[(0, Orange.data.Table("polar\\4-angle-ftir_multifile.tab"))]) + import orangecontrib.spectroscopy # so that can be loaded + WidgetPreview(OWPolar).run(insert_data=[(0, Orange.data.Table("polar/4-angle-ftir_multifile.tab"))]) From 3983f699146b06488552f7f0229eaee0eb68b3ba Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Fri, 19 Aug 2022 15:14:34 +0200 Subject: [PATCH 26/93] Proper cleanup of shared memory --- orangecontrib/spectroscopy/widgets/owpolar.py | 87 ++++++++----------- 1 file changed, 38 insertions(+), 49 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 263213234..b4d8be758 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -1,6 +1,6 @@ import os import multiprocessing -from multiprocessing import shared_memory +from multiprocessing.managers import SharedMemoryManager from typing import List, Optional, Sequence import math @@ -209,17 +209,16 @@ def find_az(alpha, params): Az = Az2 return Az -def compute(xys, yidx, names, shapes, dtypes, polangles): - - tcvs = shared_memory.SharedMemory(name=names[0], create=False) +def compute(xys, yidx, smms, shapes, dtypes, polangles): + tcvs = smms[0] cvs = np.ndarray(shapes[0], dtype=dtypes[0], buffer=tcvs.buf) - tout = shared_memory.SharedMemory(name=names[3], create=False) + tout = smms[3] out = np.ndarray(shapes[3], dtype=dtypes[3], buffer=tout.buf) - tmod = shared_memory.SharedMemory(name=names[4], create=False) + tmod = smms[4] mod = np.ndarray(shapes[4], dtype=dtypes[4], buffer=tmod.buf) - tcoords = shared_memory.SharedMemory(name=names[5], create=False) + tcoords = smms[5] coords = np.ndarray(shapes[5], dtype=dtypes[5], buffer=tcoords.buf) - tvars = shared_memory.SharedMemory(name=names[6], create=False) + tvars = smms[6] vars = np.ndarray(shapes[6], dtype=dtypes[6], buffer=tvars.buf) x = np.asarray(polangles) @@ -256,11 +255,6 @@ def compute(xys, yidx, names, shapes, dtypes, polangles): mod[i,j[0],l,4] = params[1] mod[i,j[0],l,5] = params[2] - tcvs.close() - tout.close() - tmod.close() - tcoords.close() - tvars.close() def unique_xys(images, map_x, map_y): lsxs = np.empty(0) @@ -355,36 +349,37 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, a coords[k,l,0] = i coords[k,l,1] = j - tcvs = shared_memory.SharedMemory(create=True, size=cvs.nbytes) - scvs = np.ndarray(cvs.shape, dtype=cvs.dtype, buffer=tcvs.buf) - scvs[:,:,:] = cvs[:,:,:] - tout = shared_memory.SharedMemory(create=True, size=out.nbytes) - sout = np.ndarray(out.shape, dtype=out.dtype, buffer=tout.buf) - sout[:,:,:,:] = out[:,:,:,:] - tmod = shared_memory.SharedMemory(create=True, size=mod.nbytes) - smod = np.ndarray(mod.shape, dtype=mod.dtype, buffer=tmod.buf) - smod[:,:,:,:] = mod[:,:,:,:] - tcoords = shared_memory.SharedMemory(create=True, size=coords.nbytes) - scoords = np.ndarray(coords.shape, dtype=coords.dtype, buffer=tcoords.buf) - scoords[:,:,:] = coords[:,:,:] - tvars = shared_memory.SharedMemory(create=True, size=vars.nbytes) - svars = np.ndarray(vars.shape, dtype=vars.dtype, buffer=tvars.buf) - svars[:] = vars[:] - - names = [tcvs.name, None, None, tout.name, tmod.name, tcoords.name, tvars.name] - shapes = [cvs.shape, spec.shape, metas.shape, out.shape, mod.shape, coords.shape, vars.shape] - dtypes = [cvs.dtype, spec.dtype, metas.dtype, out.dtype, mod.dtype, coords.dtype, vars.dtype] - - threads = start_compute(ulsxs, ulsys, names, shapes, dtypes, polangles, state) - - for t in threads: - t.join() - - state.set_status("Finishing...") - if invert is True: - sout[:,:,:,2] = sout[:,:,:,2]*-1 - outputs = np.reshape(sout[:,:,:,2:], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], 5*len(featnames))) - model = np.reshape(smod[:,:,:,2:], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], 4*len(featnames))) + with SharedMemoryManager() as smm: + tcvs = smm.SharedMemory(size=cvs.nbytes) + scvs = np.ndarray(cvs.shape, dtype=cvs.dtype, buffer=tcvs.buf) + scvs[:,:,:] = cvs[:,:,:] + tout = smm.SharedMemory(size=out.nbytes) + sout = np.ndarray(out.shape, dtype=out.dtype, buffer=tout.buf) + sout[:,:,:,:] = out[:,:,:,:] + tmod = smm.SharedMemory(size=mod.nbytes) + smod = np.ndarray(mod.shape, dtype=mod.dtype, buffer=tmod.buf) + smod[:,:,:,:] = mod[:,:,:,:] + tcoords = smm.SharedMemory(size=coords.nbytes) + scoords = np.ndarray(coords.shape, dtype=coords.dtype, buffer=tcoords.buf) + scoords[:,:,:] = coords[:,:,:] + tvars = smm.SharedMemory(size=vars.nbytes) + svars = np.ndarray(vars.shape, dtype=vars.dtype, buffer=tvars.buf) + svars[:] = vars[:] + + smms = [tcvs, None, None, tout, tmod, tcoords, tvars] + shapes = [cvs.shape, spec.shape, metas.shape, out.shape, mod.shape, coords.shape, vars.shape] + dtypes = [cvs.dtype, spec.dtype, metas.dtype, out.dtype, mod.dtype, coords.dtype, vars.dtype] + + threads = start_compute(ulsxs, ulsys, smms, shapes, dtypes, polangles, state) + + for t in threads: + t.join() + + state.set_status("Finishing...") + if invert is True: + sout[:,:,:,2] = sout[:,:,:,2]*-1 + outputs = np.reshape(sout[:,:,:,2:], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], 5*len(featnames))) + model = np.reshape(smod[:,:,:,2:], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], 4*len(featnames))) spectra = [] met = [] @@ -416,12 +411,6 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, a spectra = np.concatenate((spectra), axis=0) meta = np.concatenate((met), axis=0) - tcvs.unlink() - tout.unlink() - tmod.unlink() - tcoords.unlink() - tvars.unlink() - return outputs, model, spectra, meta, vars[1] From 022b8fac1eb701e470b12fb10daa7d3ddb39aefc Mon Sep 17 00:00:00 2001 From: callumgassner Date: Sat, 20 Aug 2022 13:54:49 +1000 Subject: [PATCH 27/93] test_owpolar: fixed to work without widgetscheme --- .../spectroscopy/tests/test_owpolar.py | 457 ++++++------------ 1 file changed, 160 insertions(+), 297 deletions(-) diff --git a/orangecontrib/spectroscopy/tests/test_owpolar.py b/orangecontrib/spectroscopy/tests/test_owpolar.py index 9a8161feb..b21a7b05d 100644 --- a/orangecontrib/spectroscopy/tests/test_owpolar.py +++ b/orangecontrib/spectroscopy/tests/test_owpolar.py @@ -2,102 +2,14 @@ import numpy as np import Orange from Orange.data import ContinuousVariable, DiscreteVariable, Domain -from Orange.widgets.tests.base import WidgetTest, DummySignalManager -from orangewidget.widget import OWBaseWidget, Output, Input -from orangewidget.workflow.widgetsscheme import WidgetsScheme, WidgetsSignalManager -from orangewidget.workflow.tests.test_widgetsscheme import widget_description +from Orange.widgets.tests.base import WidgetTest from orangecontrib.spectroscopy.widgets.owpolar import OWPolar -class Multifile(OWBaseWidget): - name = "Multifile" - - class Outputs: - out = Output("output", Orange.data.Table) - -class Data1(OWBaseWidget): - name = "Data 1" - - class Outputs: - out = Output("output", Orange.data.Table) - -class Data2(OWBaseWidget): - name = "Data 2" - - class Outputs: - out = Output("output", Orange.data.Table) - -class Data3(OWBaseWidget): - name = "Data 3" - - class Outputs: - out = Output("output", Orange.data.Table) - -class Data4(OWBaseWidget): - name = "Data 4" - - class Outputs: - out = Output("output", Orange.data.Table) - -class MockIn(OWBaseWidget): - name = "Results" - - class Inputs: - polar = Input("polar data", Orange.data.Table) - model = Input("model data", Orange.data.Table) - - @Inputs.polar - def set_polar(self, dataset): - self.polar_results = dataset - - @Inputs.model - def set_model(self, dataset): - self.model_results = dataset - -class SigMan(WidgetsSignalManager, DummySignalManager): - def __init__(self, scheme: WidgetsScheme): - WidgetsSignalManager.__init__(self, scheme) - DummySignalManager.__init__(self) - class TestOWPolar(WidgetTest): - def reset_input_links(self): - for j, i in enumerate(self.scheme.links): - widget = self.scheme.widget_for_node(i.sink_node) - inputs = vars(widget.Inputs) - input_keys = list(inputs) - - for k in input_keys: - if inputs[k].name == i.sink_channel.name: - key = k - - self.scheme.remove_link(i) - self._send_signal(widget, i.sink_channel.name, - inputs[key].closing_sentinel, j) - self.pol_widget.handleNewSignals() - @classmethod def setUpClass(cls): super().setUpClass() - cls.scheme = WidgetsScheme() - cls.signal_manager = SigMan(cls.scheme) - cls.scheme.signal_manager = cls.signal_manager - - cls.multifile_node = cls.scheme.new_node(widget_description(Multifile)) - cls.multifile_widget = cls.scheme.widget_for_node(cls.multifile_node) - cls.in1_node = cls.scheme.new_node(widget_description(Data1)) - cls.in1_widget = cls.scheme.widget_for_node(cls.in1_node) - cls.in2_node = cls.scheme.new_node(widget_description(Data2)) - cls.in2_widget = cls.scheme.widget_for_node(cls.in2_node) - cls.in3_node = cls.scheme.new_node(widget_description(Data3)) - cls.in3_widget = cls.scheme.widget_for_node(cls.in3_node) - cls.in4_node = cls.scheme.new_node(widget_description(Data4)) - cls.in4_widget = cls.scheme.widget_for_node(cls.in4_node) - cls.pol_node = cls.scheme.new_node(widget_description(OWPolar)) - cls.pol_widget = cls.scheme.widget_for_node(cls.pol_node) - cls.pol_widget.signalManager = cls.scheme.signal_manager - # cls.pol_widget.__init__() - cls.mock_in_node = cls.scheme.new_node(widget_description(MockIn)) - cls.mock_in_widget = cls.scheme.widget_for_node(cls.mock_in_node) cls.multifile = Orange.data.Table("polar/4-angle-ftir_multifile.tab") cls.in1 = Orange.data.Table("polar/4-angle-ftir_multiin1.tab") cls.in2 = Orange.data.Table("polar/4-angle-ftir_multiin2.tab") @@ -108,175 +20,148 @@ def setUpClass(cls): cls.multiin_polar = Orange.data.Table("polar/4-angle-ftir_multiin_polar-results.tab") cls.multiin_model = Orange.data.Table("polar/4-angle-ftir_multiin_model-results.tab") + def setUp(self): + self.widget = self.create_widget(OWPolar) + def test_multifile_init(self): - print('test_multifile_init') - self.reset_input_links() - self.scheme.new_link(self.multifile_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.multifile, 0, widget=self.pol_widget) + self.send_signal("Data", self.multifile, 0) testfeats = [ft for ft in self.multifile.domain.metas if isinstance(ft, ContinuousVariable)] testfeats = testfeats + [ft for ft in self.multifile.domain.attributes if isinstance(ft, ContinuousVariable)] - polfeats = [ft for ft in self.pol_widget.featureselect[:] + polfeats = [ft for ft in self.widget.featureselect[:] if isinstance(ft, ContinuousVariable)] self.assertEqual(polfeats, testfeats) testinputs = [inp for inp in self.multifile.domain if isinstance(inp, DiscreteVariable)] - self.assertEqual(self.pol_widget.anglemetas[:], testinputs) + self.assertEqual(self.widget.anglemetas[:], testinputs) testxy = [xy for xy in self.multifile.domain.metas - if isinstance(xy, (ContinuousVariable, DiscreteVariable))] - self.assertEqual(self.pol_widget.x_axis[:], testxy) - self.assertEqual(self.pol_widget.y_axis[:], testxy) + if isinstance(xy, ContinuousVariable)] + self.assertEqual(self.widget.x_axis[:], testxy) + self.assertEqual(self.widget.y_axis[:], testxy) def test_multifile_in(self): - print('test_multifile_in') - self.reset_input_links() - self.scheme.new_link(self.multifile_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.multifile, 0, widget=self.pol_widget) + self.send_signal("Data", self.multifile, 0) - self.assertTrue(self.pol_widget.isEnabled()) - for i in self.pol_widget.multiin_labels: + self.assertTrue(self.widget.isEnabled()) + for i in self.widget.multiin_labels: self.assertFalse(i.isEnabled()) - for i in self.pol_widget.multiin_lines: + for i in self.widget.multiin_lines: self.assertFalse(i.isEnabled()) - self.pol_widget.angles = self.pol_widget.anglemetas[0] - self.assertEqual(self.pol_widget.angles, self.multifile.domain.metas[2]) - self.pol_widget._change_angles() - self.assertEqual(len(self.pol_widget.labels), 4) - self.assertEqual(len(self.pol_widget.lines), 4) - self.assertEqual(self.pol_widget.polangles, list(np.linspace(0, 180, 5)[:4])) - for i in self.pol_widget.labels: + self.widget.angles = self.widget.anglemetas[0] + self.assertEqual(self.widget.angles, self.multifile.domain.metas[2]) + self.widget._change_angles() + self.assertEqual(len(self.widget.labels), 4) + self.assertEqual(len(self.widget.lines), 4) + self.assertEqual(self.widget.polangles, list(np.linspace(0, 180, 5)[:4])) + for i in self.widget.labels: self.assertTrue(i.isEnabled()) - for i in self.pol_widget.lines: + for i in self.widget.lines: self.assertTrue(i.isEnabled()) - self.pol_widget.map_x = self.pol_widget.x_axis[0] - self.assertEqual(self.pol_widget.map_x, self.multifile.domain.metas[0]) - self.pol_widget.map_y = self.pol_widget.y_axis[1] - self.assertEqual(self.pol_widget.map_y, self.multifile.domain.metas[1]) - self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][2], - self.pol_widget.feat_view.model()[:][3]] - self.assertEqual(self.pol_widget.feats[0], self.multifile.domain.metas[3]) - self.assertEqual(self.pol_widget.feats[1], self.multifile.domain.metas[4]) - self.pol_widget.alpha = 0 - self.pol_widget.invert_angles = True - self.pol_widget.autocommit = True - - self.scheme.new_link(self.pol_node, "Polar Data", self.mock_in_node, "polar data") - self.scheme.new_link(self.pol_node, "Curve Fit model data", self.mock_in_node, "model data") - self.commit_and_wait(self.pol_widget, 20000) - - self.scheme.signal_manager.process_node(self.mock_in_node) - polar = self.mock_in_widget.polar_results - model = self.mock_in_widget.model_results - - np.testing.assert_equal(self.multifile_polar.metas, polar.metas) - np.testing.assert_equal(self.multifile_polar.X, polar.X) - np.testing.assert_equal(self.multifile_model.metas, model.metas) - np.testing.assert_equal(self.multifile_model.X, model.X) + self.widget.map_x = self.widget.x_axis[0] + self.assertEqual(self.widget.map_x, self.multifile.domain.metas[0]) + self.widget.map_y = self.widget.y_axis[1] + self.assertEqual(self.widget.map_y, self.multifile.domain.metas[1]) + self.widget.feats = [self.widget.feat_view.model()[:][2], + self.widget.feat_view.model()[:][3]] + self.assertEqual(self.widget.feats[0], self.multifile.domain.metas[3]) + self.assertEqual(self.widget.feats[1], self.multifile.domain.metas[4]) + self.widget.alpha = 0 + self.widget.invert_angles = True + self.widget.autocommit = True + self.commit_and_wait(self.widget, 20000) + + polar = self.get_output("Polar Data") + model = self.get_output("Curve Fit model data") + + np.testing.assert_allclose(np.asarray(self.multifile_polar.metas, dtype=float), + np.asarray(polar.metas, dtype=float)) + np.testing.assert_allclose(np.asarray(self.multifile_polar.X, dtype=float), + np.asarray(polar.X, dtype=float)) + np.testing.assert_allclose(np.asarray(self.multifile_model.metas, dtype=float), + np.asarray(model.metas, dtype=float)) + np.testing.assert_allclose(np.asarray(self.multifile_model.X, dtype=float), + np.asarray(model.X, dtype=float)) def test_multi_inputs(self): - print('test_multi_inputs') - self.reset_input_links() - self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.in1, 0, widget=self.pol_widget) - self.send_signal("Data", self.in2, 1, widget=self.pol_widget) - self.pol_widget.handleNewSignals() - - self.assertFalse(self.pol_widget.anglesel.isEnabled()) - for i in self.pol_widget.multiin_labels: + self.send_signal("Data", self.in1, 0, widget=self.widget) + self.send_signal("Data", self.in2, 1, widget=self.widget) + + self.assertFalse(self.widget.anglesel.isEnabled()) + for i in self.widget.multiin_labels: self.assertFalse(i.isEnabled()) - for i in self.pol_widget.multiin_lines: + for i in self.widget.multiin_lines: self.assertFalse(i.isEnabled()) - self.send_signal("Data", self.in3, 2, widget=self.pol_widget) - self.send_signal("Data", self.in4, 3, widget=self.pol_widget) - self.pol_widget.handleNewSignals() - self.assertFalse(self.pol_widget.anglesel.isEnabled()) - for i in self.pol_widget.multiin_labels: + self.send_signal("Data", self.in3, 2, widget=self.widget) + self.send_signal("Data", self.in4, 3, widget=self.widget) + self.assertFalse(self.widget.anglesel.isEnabled()) + for i in self.widget.multiin_labels: self.assertTrue(i.isEnabled()) - for i in self.pol_widget.multiin_lines: + for i in self.widget.multiin_lines: self.assertTrue(i.isEnabled()) - self.pol_widget.map_x = self.pol_widget.x_axis[0] - self.assertEqual(self.pol_widget.map_x, self.in1.domain.metas[0]) - self.pol_widget.map_y = self.pol_widget.y_axis[1] - self.assertEqual(self.pol_widget.map_y, self.in1.domain.metas[1]) + self.widget.map_x = self.widget.x_axis[0] + self.assertEqual(self.widget.map_x, self.in1.domain.metas[0]) + self.widget.map_y = self.widget.y_axis[1] + self.assertEqual(self.widget.map_y, self.in1.domain.metas[1]) - self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][2], - self.pol_widget.feat_view.model()[:][3]] - self.assertEqual(self.pol_widget.feats[0], + self.widget.feats = [self.widget.feat_view.model()[:][2], + self.widget.feat_view.model()[:][3]] + self.assertEqual(self.widget.feats[0], self.in1.domain.metas[2].copy(compute_value=None)) - self.assertEqual(self.pol_widget.feats[1], + self.assertEqual(self.widget.feats[1], self.in1.domain.metas[3].copy(compute_value=None)) - self.pol_widget.alpha = 0 - self.pol_widget.invert_angles = True - self.pol_widget.autocommit = True - - self.scheme.new_link(self.pol_node, "Polar Data", self.mock_in_node, "polar data") - self.scheme.new_link(self.pol_node, "Curve Fit model data", self.mock_in_node, "model data") - self.commit_and_wait(self.pol_widget, 20000) - - self.scheme.signal_manager.process_node(self.mock_in_node) - polar = self.mock_in_widget.polar_results - model = self.mock_in_widget.model_results - multiin_polar_fixed_values = self.multiin_polar.metas[:,np.r_[0:2,3:7]] - multiin_model_fixed_values = self.multiin_model.metas[:,np.r_[0:2,3:7]] - multiin_polar_calc_values = self.multiin_polar.metas[:,7:] - multiin_model_calc_values = self.multiin_model.metas[:,7:] - - np.testing.assert_equal(multiin_polar_fixed_values, polar.metas[:,np.r_[0:2,3:7]]) - np.testing.assert_equal(multiin_polar_calc_values, polar.metas[:,7:]) + self.widget.alpha = 0 + self.widget.invert_angles = True + self.widget.autocommit = True + self.commit_and_wait(self.widget, 20000) + + polar = self.get_output("Polar Data") + model = self.get_output("Curve Fit model data") + + np.testing.assert_allclose( + np.asarray(self.multiin_polar.metas[:,np.r_[0:2,3:7]], dtype=float), + np.asarray(polar.metas[:,np.r_[0:2,3:7]], dtype=float)) + np.testing.assert_allclose( + np.asarray(self.multiin_polar.metas[:,7:], dtype=float), + np.asarray(polar.metas[:,7:], dtype=float)) np.testing.assert_equal(self.multiin_polar.X, np.flip(polar.X, axis=1)) - np.testing.assert_equal(multiin_model_fixed_values, model.metas[:,np.r_[0:2,3:7]]) - np.testing.assert_equal(multiin_model_calc_values, model.metas[:,7:]) + np.testing.assert_allclose( + np.asarray(self.multiin_model.metas[:,np.r_[0:2,3:7]], dtype=float), + np.asarray(model.metas[:,np.r_[0:2,3:7]], dtype=float)) + np.testing.assert_allclose( + np.asarray(self.multiin_model.metas[:,7:], dtype=float), + np.asarray(model.metas[:,7:], dtype=float)) np.testing.assert_equal(self.multiin_model.X, np.flip(model.X, axis=1)) def test_pixelsubset(self): #Test multi in with subset of pixels selected - print('test_multi_inputs') - self.reset_input_links() - self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") rng = np.random.default_rng() sub_idx = rng.choice(4, size=(2), replace=False) subset = self.in1[sub_idx] - self.send_signal("Data", subset, 0, widget=self.pol_widget) - self.send_signal("Data", self.in2, 1, widget=self.pol_widget) - self.send_signal("Data", self.in3, 2, widget=self.pol_widget) - self.send_signal("Data", self.in4, 3, widget=self.pol_widget) - - self.pol_widget.map_x = self.pol_widget.x_axis[0] - self.pol_widget.map_y = self.pol_widget.y_axis[1] - self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][2], - self.pol_widget.feat_view.model()[:][3]] - self.pol_widget.alpha = 0 - self.pol_widget.invert_angles = True - self.pol_widget.autocommit = True + self.send_signal("Data", subset, 0, widget=self.widget) + self.send_signal("Data", self.in2, 1, widget=self.widget) + self.send_signal("Data", self.in3, 2, widget=self.widget) + self.send_signal("Data", self.in4, 3, widget=self.widget) - self.scheme.new_link(self.pol_node, "Polar Data", self.mock_in_node, "polar data") - self.scheme.new_link(self.pol_node, "Curve Fit model data", self.mock_in_node, "model data") - self.commit_and_wait(self.pol_widget, 20000) + self.widget.map_x = self.widget.x_axis[0] + self.widget.map_y = self.widget.y_axis[1] + self.widget.feats = [self.widget.feat_view.model()[:][2], + self.widget.feat_view.model()[:][3]] + self.widget.alpha = 0 + self.widget.invert_angles = True + self.widget.autocommit = True + self.commit_and_wait(self.widget, 20000) - self.scheme.signal_manager.process_node(self.mock_in_node) - polar = self.mock_in_widget.polar_results - model = self.mock_in_widget.model_results + polar = self.get_output("Polar Data") + model = self.get_output("Curve Fit model data") self.assertEqual(len(polar), len(sub_idx)*4) self.assertEqual(len(model), len(sub_idx)*4) def test_multiin_mismatched_domain(self): - # test multi in with different domains - self.reset_input_links() - self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") metadom = self.in1.domain.metas metadom = [i for i in metadom if isinstance(i, ContinuousVariable)] @@ -285,109 +170,87 @@ def test_multiin_mismatched_domain(self): mismatched_domain = Domain(attdom, metas = metadom) mismatched_table = self.in1.transform(mismatched_domain) - self.send_signal("Data", mismatched_table, 0, widget=self.pol_widget) - self.send_signal("Data", self.in2, 1, widget=self.pol_widget) - self.send_signal("Data", self.in3, 2, widget=self.pol_widget) - self.send_signal("Data", self.in4, 3, widget=self.pol_widget) + self.send_signal("Data", mismatched_table, 0, widget=self.widget) + self.send_signal("Data", self.in2, 1, widget=self.widget) + self.send_signal("Data", self.in3, 2, widget=self.widget) + self.send_signal("Data", self.in4, 3, widget=self.widget) feat_len = len(metadom) + len(attdom) + 1 XY_len = len(metadom) - self.assertEqual(feat_len, len(self.pol_widget.feat_view.model()[:])) - self.assertEqual(XY_len, len(self.pol_widget.x_axis[:])) - self.assertEqual(XY_len, len(self.pol_widget.y_axis[:])) - - self.reset_input_links() - self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") - - self.send_signal("Data", self.in2, 0, widget=self.pol_widget) - self.send_signal("Data", self.in3, 1, widget=self.pol_widget) - self.send_signal("Data", mismatched_table, 2, widget=self.pol_widget) - self.send_signal("Data", self.in4, 3, widget=self.pol_widget) + self.assertEqual(feat_len, len(self.widget.feat_view.model()[:])) + self.assertEqual(XY_len, len(self.widget.x_axis[:])) + self.assertEqual(XY_len, len(self.widget.y_axis[:])) + self.send_signal("Data", self.in2, 0, widget=self.widget) + self.send_signal("Data", self.in3, 1, widget=self.widget) + self.send_signal("Data", mismatched_table, 2, widget=self.widget) + self.send_signal("Data", self.in4, 3, widget=self.widget) feat_len = len(metadom) + len(attdom) + 1 XY_len = len(metadom) - self.assertEqual(feat_len, len(self.pol_widget.feat_view.model()[:])) - self.assertEqual(XY_len, len(self.pol_widget.x_axis[:])) - self.assertEqual(XY_len, len(self.pol_widget.y_axis[:])) + self.assertEqual(feat_len, len(self.widget.feat_view.model()[:])) + self.assertEqual(XY_len, len(self.widget.x_axis[:])) + self.assertEqual(XY_len, len(self.widget.y_axis[:])) def test_custom_angles(self): # test inputting custom angles (multin and multifile) - self.reset_input_links() - self.scheme.new_link(self.multifile_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.multifile, 0, widget=self.pol_widget) + self.send_signal("Data", self.multifile, 0, widget=self.widget) angles = np.array([0, 22.5, 45.0, 90]) - for i, j in enumerate(self.pol_widget.lines): + for i, j in enumerate(self.widget.lines): j.setText(str(angles[i])) - self.pol_widget._send_angles() - for i, j in enumerate(self.pol_widget.polangles): + self.widget._send_angles() + for i, j in enumerate(self.widget.polangles): self.assertEqual(j, angles[i]) - self.reset_input_links() - self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.in1, 0, widget=self.pol_widget) - self.send_signal("Data", self.in2, 1, widget=self.pol_widget) - self.send_signal("Data", self.in3, 2, widget=self.pol_widget) - self.send_signal("Data", self.in4, 3, widget=self.pol_widget) - - for i, j in enumerate(self.pol_widget.multiin_lines): + self.send_signal("Data", self.in1, 0, widget=self.widget) + self.send_signal("Data", self.in2, 1, widget=self.widget) + self.send_signal("Data", self.in3, 2, widget=self.widget) + self.send_signal("Data", self.in4, 3, widget=self.widget) + + for i, j in enumerate(self.widget.multiin_lines): j.setText(str(angles[i])) - self.pol_widget._send_ind_angles() - for i, j in enumerate(self.pol_widget.polangles): + self.widget._send_ind_angles() + for i, j in enumerate(self.widget.polangles): self.assertEqual(j, angles[i]) def test_warnings(self): #test all warnings - #self.pol_widget.Warning..is_shown() - self.reset_input_links() - self.scheme.new_link(self.multifile_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.multifile, 0, widget=self.pol_widget) - self.pol_widget.autocommit = True - - self.commit_and_wait(self.pol_widget) - self.assertTrue(self.pol_widget.Warning.nofeat.is_shown()) - - self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][4]] - self.pol_widget.map_x = None - self.pol_widget.map_y = None - self.commit_and_wait(self.pol_widget) - self.assertTrue(self.pol_widget.Warning.noxy.is_shown()) - - self.pol_widget.map_x = self.pol_widget.x_axis[0] - self.pol_widget.map_y = self.pol_widget.y_axis[1] - self.pol_widget.polangles = [] - self.commit_and_wait(self.pol_widget) - self.assertTrue(self.pol_widget.Warning.pol.is_shown()) - self.pol_widget.polangles = [0.0,45.0,'hi',135.0] - self.commit_and_wait(self.pol_widget) - self.assertTrue(self.pol_widget.Warning.pol.is_shown()) - - self.pol_widget.polangles = [0.0,45.0,90.0,135.0] - self.pol_widget.feats = [self.pol_widget.feat_view.model()[:][0]] - self.commit_and_wait(self.pol_widget) - self.assertTrue(self.pol_widget.Warning.XYfeat.is_shown()) - - self.reset_input_links() - self.scheme.new_link(self.in1_node, "output", self.pol_node, "Data") - self.scheme.new_link(self.in2_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.in1, 0, widget=self.pol_widget) - self.send_signal("Data", self.in2, 1, widget=self.pol_widget) - self.assertTrue(self.pol_widget.Warning.notenough.is_shown()) - - self.scheme.new_link(self.in3_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.in3, 2, widget=self.pol_widget) - self.assertTrue(self.pol_widget.Warning.notenough.is_shown()) - - self.scheme.new_link(self.in4_node, "output", self.pol_node, "Data") - self.send_signal("Data", self.in4, 3, widget=self.pol_widget) - self.assertFalse(self.pol_widget.Warning.notenough.is_shown()) + self.send_signal("Data", self.multifile, 0, widget=self.widget) + self.widget.autocommit = True + + self.commit_and_wait(self.widget) + self.assertTrue(self.widget.Warning.nofeat.is_shown()) + + self.widget.feats = [self.widget.feat_view.model()[:][4]] + self.widget.map_x = None + self.widget.map_y = None + self.commit_and_wait(self.widget) + self.assertTrue(self.widget.Warning.noxy.is_shown()) + + self.widget.map_x = self.widget.x_axis[0] + self.widget.map_y = self.widget.y_axis[1] + self.widget.polangles = [] + self.commit_and_wait(self.widget) + self.assertTrue(self.widget.Warning.pol.is_shown()) + self.widget.polangles = [0.0,45.0,'hi',135.0] + self.commit_and_wait(self.widget) + self.assertTrue(self.widget.Warning.pol.is_shown()) + + self.widget.polangles = [0.0,45.0,90.0,135.0] + self.widget.feats = [self.widget.feat_view.model()[:][0]] + self.commit_and_wait(self.widget) + self.assertTrue(self.widget.Warning.XYfeat.is_shown()) + + self.send_signal("Data", self.in1, 0, widget=self.widget) + self.send_signal("Data", self.in2, 1, widget=self.widget) + self.assertTrue(self.widget.Warning.notenough.is_shown()) + + self.send_signal("Data", self.in3, 2, widget=self.widget) + self.assertTrue(self.widget.Warning.notenough.is_shown()) + + self.send_signal("Data", self.in4, 3, widget=self.widget) + self.assertFalse(self.widget.Warning.notenough.is_shown()) # def test_clearangles(self): # #test clearing angles From 3fb33e84a466f80b3f07526a1d16111a5cfdfcb2 Mon Sep 17 00:00:00 2001 From: callumgassner Date: Sat, 20 Aug 2022 16:41:20 +1000 Subject: [PATCH 28/93] owhyper: Add None option for Vector Az and Mag --- orangecontrib/spectroscopy/widgets/owhyper.py | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 72bbaee2e..6a52ae183 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -999,25 +999,35 @@ def set_visible_image_comp_mode(self, comp_mode: QPainter.CompositionMode): self.vis_img.setCompositionMode(comp_mode) def set_vector_co(self, pen): - self.c.setPen(pen) + if hasattr(self, 'c'): + self.c.setPen(pen) def set_vector_scale(self, scale): - th = self.v[:,0] - v_mag = self.v[:,1] - amp = v_mag / max(v_mag) * (scale/100)# TODO, new setting: range - wy = self.shifty*2 - wx = self.shiftx*2 - y = np.linspace(*self.lsy)[self.yindex[self.valid]] - x = np.linspace(*self.lsx)[self.xindex[self.valid]] - dispx = amp*wx/2*np.cos(np.radians(th)) - dispy = amp*wy/2*np.sin(np.radians(th)) - xcurve = np.empty((dispx.shape[0]*2)) - ycurve = np.empty((dispy.shape[0]*2)) - xcurve[0::2], xcurve[1::2] = x - dispx, x + dispx - ycurve[0::2], ycurve[1::2] = y - dispy, y + dispy - connect = np.ones((dispx.shape[0]*2)) - connect[1::2] = 0 - self.c.setData(x=xcurve, y=ycurve, connect=connect) + if self.v is not None: + if self.v.shape[1] > 1: + th = self.v[:,0] + v_mag = self.v[:,1] + elif self.v.shape[1] == 1: + if self.parent.vector_angle is None: + th = np.zeros(self.v.shape[0]) + v_mag = self.v[:,0] + elif self.parent.vector_magnitude is None: + th = self.v[:,0] + v_mag = np.ones(self.v.shape[0]) + amp = v_mag / max(v_mag) * (scale/100)# TODO, new setting: range + wy = self.shifty*2 + wx = self.shiftx*2 + y = np.linspace(*self.lsy)[self.yindex[self.valid]] + x = np.linspace(*self.lsx)[self.xindex[self.valid]] + dispx = amp*wx/2*np.cos(np.radians(th)) + dispy = amp*wy/2*np.sin(np.radians(th)) + xcurve = np.empty((dispx.shape[0]*2)) + ycurve = np.empty((dispy.shape[0]*2)) + xcurve[0::2], xcurve[1::2] = x - dispx, x + dispx + ycurve[0::2], ycurve[1::2] = y - dispy, y + dispy + connect = np.ones((dispx.shape[0]*2)) + connect[1::2] = 0 + self.c.setData(x=xcurve, y=ycurve, connect=connect) @staticmethod def compute_image(data: Orange.data.Table, attr_x, attr_y, @@ -1171,7 +1181,7 @@ class Outputs(SelectionOutputsMixin.Outputs): show_vector_plot = Setting(False) vector_angle = ContextSetting(None) vector_magnitude = ContextSetting(None) - vector_colour_index = Setting(0) + vector_colour_index = ContextSetting(0) vector_scale = Setting(1) vector_opacity = Setting(255) From 7b92b2d35f3dc5724bb373a4991f4f22eaf13579 Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Wed, 24 Aug 2022 14:48:03 +0200 Subject: [PATCH 29/93] owhyper: simplify vector computation --- orangecontrib/spectroscopy/widgets/owhyper.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 6a52ae183..eb68f246e 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -1004,17 +1004,9 @@ def set_vector_co(self, pen): def set_vector_scale(self, scale): if self.v is not None: - if self.v.shape[1] > 1: - th = self.v[:,0] - v_mag = self.v[:,1] - elif self.v.shape[1] == 1: - if self.parent.vector_angle is None: - th = np.zeros(self.v.shape[0]) - v_mag = self.v[:,0] - elif self.parent.vector_magnitude is None: - th = self.v[:,0] - v_mag = np.ones(self.v.shape[0]) - amp = v_mag / max(v_mag) * (scale/100)# TODO, new setting: range + th = self.v[:,0] + v_mag = self.v[:,1] + amp = v_mag / max(v_mag) * (scale/100) # TODO, new setting: range wy = self.shifty*2 wx = self.shiftx*2 y = np.linspace(*self.lsy)[self.yindex[self.valid]] From 3e80da59e4156644cdc445190c7cbd39463ea765 Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Wed, 24 Aug 2022 21:33:57 +0200 Subject: [PATCH 30/93] owhyper: add first vector plot tests --- .../spectroscopy/tests/test_owhyper.py | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/orangecontrib/spectroscopy/tests/test_owhyper.py b/orangecontrib/spectroscopy/tests/test_owhyper.py index 16158094f..6fcd3dda4 100644 --- a/orangecontrib/spectroscopy/tests/test_owhyper.py +++ b/orangecontrib/spectroscopy/tests/test_owhyper.py @@ -770,3 +770,39 @@ def test_oldformat(self): self.assertIn(w.imageplot.vis_img, w.imageplot.plot.items) w.controls.show_visible_image.setChecked(False) self.assertNotIn(w.imageplot.vis_img, w.imageplot.plot.items) + +class TestVectorPlot(WidgetTest): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.whitelight = Orange.data.Table("whitelight.gsf") + cls.iris = Orange.data.Table("iris") + + def setUp(self): + super().setUp() + self.widget = self.create_widget(OWHyper) # type: OWHyper + + def test_enable_disable(self): + w = self.widget + for data in [None, self.whitelight, self.iris]: + self.send_signal(w.Inputs.data, data) + self.assertFalse(w.show_vector_plot) + self.assertFalse(w.controls.vector_magnitude.isEnabled()) + self.assertFalse(w.controls.vector_angle.isEnabled()) + self.assertFalse(w.controls.vector_colour_index.isEnabled()) + self.assertFalse(w.controls.vector_scale.isEnabled()) + self.assertFalse(w.controls.vector_opacity.isEnabled()) + w.controls.show_vector_plot.click() + self.assertTrue(w.show_vector_plot) + self.assertTrue(w.controls.vector_magnitude.isEnabled()) + self.assertTrue(w.controls.vector_angle.isEnabled()) + self.assertTrue(w.controls.vector_colour_index.isEnabled()) + self.assertTrue(w.controls.vector_scale.isEnabled()) + self.assertTrue(w.controls.vector_opacity.isEnabled()) + w.controls.show_vector_plot.click() + self.assertFalse(w.controls.vector_magnitude.isEnabled()) + self.assertFalse(w.controls.vector_angle.isEnabled()) + self.assertFalse(w.controls.vector_colour_index.isEnabled()) + self.assertFalse(w.controls.vector_scale.isEnabled()) + self.assertFalse(w.controls.vector_opacity.isEnabled()) From 5944879e6e97686edf7e9dfd6a22345a8a90d0ca Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Wed, 24 Aug 2022 22:03:13 +0200 Subject: [PATCH 31/93] owhyper: refactor vector plot code --- orangecontrib/spectroscopy/widgets/owhyper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index eb68f246e..87312773e 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -998,7 +998,7 @@ def set_visible_image_opacity(self, opacity: int): def set_visible_image_comp_mode(self, comp_mode: QPainter.CompositionMode): self.vis_img.setCompositionMode(comp_mode) - def set_vector_co(self, pen): + def set_vector_colour(self, pen): if hasattr(self, 'c'): self.c.setPen(pen) From fe20822528c5bbc963a3599012e0b91dad3d5bfc Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Wed, 24 Aug 2022 22:37:18 +0200 Subject: [PATCH 32/93] owhyper: consolidate duplicated vector plot drawing code --- orangecontrib/spectroscopy/widgets/owhyper.py | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 87312773e..b8ad86751 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -794,6 +794,9 @@ def __init__(self, parent): self.data_values = None self.data_imagepixels = None self.data_valid_positions = None + self.vector_data = None + self.xindex = None + self.yindex = None self.plotview = GraphicsView() ci = pg.GraphicsLayout() @@ -975,6 +978,9 @@ def update_view(self): self.data_values = None self.data_imagepixels = None self.data_valid_positions = None + self.vector_data = None + self.xindex = None + self.yindex = None self.start(self.compute_image, self.data, self.attr_x, self.attr_y, self.parent.image_values(), @@ -998,19 +1004,25 @@ def set_visible_image_opacity(self, opacity: int): def set_visible_image_comp_mode(self, comp_mode: QPainter.CompositionMode): self.vis_img.setCompositionMode(comp_mode) - def set_vector_colour(self, pen): + def update_vector_colour(self): if hasattr(self, 'c'): + pen = self.parent.get_vector_colour() self.c.setPen(pen) - def set_vector_scale(self, scale): - if self.v is not None: - th = self.v[:,0] - v_mag = self.v[:,1] - amp = v_mag / max(v_mag) * (scale/100) # TODO, new setting: range - wy = self.shifty*2 - wx = self.shiftx*2 - y = np.linspace(*self.lsy)[self.yindex[self.valid]] - x = np.linspace(*self.lsx)[self.xindex[self.valid]] + def update_vectors(self): + v = self.vector_data + if v is not None: + valid = self.data_valid_positions + lsx, lsy = self.lsx, self.lsy + xindex, yindex = self.xindex, self.yindex + scale = self.parent.vector_scale + th = v[:,0] + v_mag = v[:,1] + amp = v_mag / max(v_mag) * (scale/100) + wy = _shift(lsx)*2 + wx = _shift(lsx)*2 + y = np.linspace(*lsy)[yindex[valid]] + x = np.linspace(*lsx)[xindex[valid]] dispx = amp*wx/2*np.cos(np.radians(th)) dispy = amp*wy/2*np.sin(np.radians(th)) xcurve = np.empty((dispx.shape[0]*2)) From 08fd3cca750b7bfc2547033849f860b76554b890 Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Thu, 25 Aug 2022 14:53:03 +0200 Subject: [PATCH 33/93] owhyper: simplify vector data computation This is just a column selection and is fast, so there is no need to perform it in a separate thread. Also, if users now select different vector features, the image data is not recomputed. --- orangecontrib/spectroscopy/widgets/owhyper.py | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index b8ad86751..e044305da 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -794,7 +794,6 @@ def __init__(self, parent): self.data_values = None self.data_imagepixels = None self.data_valid_positions = None - self.vector_data = None self.xindex = None self.yindex = None @@ -824,6 +823,10 @@ def __init__(self, parent): self.plot.vb.setAspectLocked() self.plot.scene().sigMouseMoved.connect(self.plot.vb.mouseMovedEvent) + self.vector_plot = pg.PlotCurveItem() + self.vector_plot.hide() + self.plot.addItem(self.vector_plot) + layout = QGridLayout() self.plotview.setLayout(layout) self.button = QPushButton("Menu", self.plotview) @@ -872,8 +875,6 @@ def __init__(self, parent): self.data = None self.data_ids = {} - self.p_markings = [] - def init_interface_data(self, data): self.init_attr_values(data) @@ -968,9 +969,6 @@ def update_view(self): self.parent.Information.not_shown.clear() self.img.clear() self.img.setSelection(None) - for m in self.p_markings: - self.plot.removeItem(m) - self.p_markings = [] self.legend.set_colors(None) self.lsx = None self.lsy = None @@ -978,9 +976,9 @@ def update_view(self): self.data_values = None self.data_imagepixels = None self.data_valid_positions = None - self.vector_data = None self.xindex = None self.yindex = None + self.update_vectors() # clears the vector plot self.start(self.compute_image, self.data, self.attr_x, self.attr_y, self.parent.image_values(), @@ -1005,13 +1003,16 @@ def set_visible_image_comp_mode(self, comp_mode: QPainter.CompositionMode): self.vis_img.setCompositionMode(comp_mode) def update_vector_colour(self): - if hasattr(self, 'c'): - pen = self.parent.get_vector_colour() - self.c.setPen(pen) + pen = self.parent.get_vector_colour() + self.vector_plot.setPen(pen) def update_vectors(self): - v = self.vector_data - if v is not None: + v = self.parent.get_vector_data() + if self.lsx is None: # image is not shown or is being computed + v = None + if v is None: + self.vector_plot.hide() + else: valid = self.data_valid_positions lsx, lsy = self.lsx, self.lsy xindex, yindex = self.xindex, self.yindex @@ -1031,11 +1032,12 @@ def update_vectors(self): ycurve[0::2], ycurve[1::2] = y - dispy, y + dispy connect = np.ones((dispx.shape[0]*2)) connect[1::2] = 0 - self.c.setData(x=xcurve, y=ycurve, connect=connect) + self.vector_plot.setData(x=xcurve, y=ycurve, connect=connect) + self.vector_plot.show() @staticmethod def compute_image(data: Orange.data.Table, attr_x, attr_y, - vector_values, image_values, image_values_fixed_levels, choose, + image_values, image_values_fixed_levels, state: TaskState): if data is None or attr_x is None or attr_y is None: From ffa90237c66bcf1d6aaaa682fb1d31fc38624b7a Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Thu, 25 Aug 2022 17:49:54 +0200 Subject: [PATCH 34/93] owhyper: properly initialize vector feature combos --- orangecontrib/spectroscopy/widgets/owhyper.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index e044305da..78cf47617 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -1375,6 +1375,13 @@ def _setup_plot_parameters(self): VisualSettingsDialog(self, self.imageplot.parameter_setter.initial_settings) + # initialize values so that the combo boxes are not in invalid states + if self.vector_opts: + # TODO here we could instead set good default values if available + self.vector_magnitude = self.vector_angle = None + else: + self.vector_magnitude = self.vector_angle = None + def setup_visible_image_controls(self): self.visbox = gui.widgetBox(self.controlArea, True) From caacb5359c88794a9cbe39ed2d951fd78b376bdd Mon Sep 17 00:00:00 2001 From: callumgassner Date: Mon, 22 Aug 2022 22:50:48 +1000 Subject: [PATCH 35/93] owpolar: potential fix for context errors Potentially fixes an issue which persisted where contexts would be loaded when variables did not exist in the domain --- orangecontrib/spectroscopy/widgets/owpolar.py | 58 +++++++++++++++++-- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index b4d8be758..f50ea16a1 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -19,7 +19,7 @@ from Orange.widgets import gui, settings from Orange.widgets.settings import \ - Setting, ContextSetting, PerfectDomainContextHandler + Setting, ContextSetting, DomainContextHandler from Orange.widgets.utils.itemmodels import DomainModel from Orange.widgets.utils.concurrent import TaskState, ConcurrentWidgetMixin from Orange.widgets.data import owconcatenate @@ -413,6 +413,58 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, a return outputs, model, spectra, meta, vars[1] +class PolarDomainContextHandler(DomainContextHandler): + + match_values = DomainContextHandler.MATCH_VALUES_ALL + + def match(self, context, domain, attrs, metas): + try: + settings_names = [ + context.values['angles'][0], + [i[0] for i in context.values['feats'][0]], + context.values['map_x'][0], + context.values['map_y'][0]] + settings_types = [ + context.values['angles'][1], + [i[1] for i in context.values['feats'][0]], + context.values['map_x'][1], + context.values['map_y'][1]] + except IndexError: + settings_names = [ + context.values['angles'][0], + [i[0] for i in context.values['feats']], + context.values['map_x'][0], + context.values['map_y'][0]] + settings_types = [ + context.values['angles'][1], + [i[1] for i in context.values['feats']], + context.values['map_x'][1], + context.values['map_y'][1]] + + if attrs == context.attributes and \ + metas == context.metas: + for i, j in enumerate(settings_names): + if isinstance(j, str) and j in metas.keys(): + if settings_types[i] % 10 == metas[j]: + continue + return self.NO_MATCH + if isinstance(j, list): + for k, l in enumerate(j): + if l in attrs.keys(): + if settings_types[i][k] % 10 == attrs[l]: + continue + return self.NO_MATCH + if l in metas.keys(): + if settings_types[i][k] % 10 == metas[l]: + continue + return self.NO_MATCH + return self.NO_MATCH + else: + return self.NO_MATCH + else: + return self.NO_MATCH + + return self.PERFECT_MATCH class OWPolar(OWWidget, ConcurrentWidgetMixin): @@ -436,9 +488,7 @@ class Outputs: autocommit = settings.Setting(False) - settingsHandler = PerfectDomainContextHandler( - match_values=PerfectDomainContextHandler.MATCH_VALUES_ALL - ) + settingsHandler = PolarDomainContextHandler() want_main_area = False resizing_enabled = True From 51f7e8b17134e60784ec46c9393e61aef354a3af Mon Sep 17 00:00:00 2001 From: callumgassner Date: Wed, 24 Aug 2022 10:22:08 +1000 Subject: [PATCH 36/93] owpolar: prevent angle list without separator --- orangecontrib/spectroscopy/widgets/owpolar.py | 1 + 1 file changed, 1 insertion(+) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index f50ea16a1..75b4d3abd 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -698,6 +698,7 @@ def _send_angles(self): pass def input_select(self): + self.angles = None if len(self.data) == 0 or 1 < len(self.data) < 4: self.anglesel.setDisabled(True) for i in self.multiin_labels: From 3652152195a1422a0d4bbdac15468c223c4c12d6 Mon Sep 17 00:00:00 2001 From: callumgassner Date: Wed, 24 Aug 2022 10:49:29 +1000 Subject: [PATCH 37/93] owpolar: show end of filename only --- orangecontrib/spectroscopy/widgets/owpolar.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 75b4d3abd..aeac79079 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -650,8 +650,9 @@ def _change_angles(self): def add_angles(self, anglst, lab, labels, lines, widget, i, place, callback): #to be used in a loop + file = lab.split('/')[-1] anglst.append(lab) - ledit = gui.lineEdit(widget, self, None, label = lab, callback = callback) + ledit = gui.lineEdit(widget, self, None, label = file, callback = callback) ledit.setText(str(place)) lines.append(ledit) for j in ledit.parent().children(): From 51bfa658c5c4198cbe72758847cfe8d00fafb8b1 Mon Sep 17 00:00:00 2001 From: callumgassner Date: Wed, 24 Aug 2022 11:21:26 +1000 Subject: [PATCH 38/93] owpolar: proper context matching for multi inputs --- orangecontrib/spectroscopy/widgets/owpolar.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index aeac79079..235100f53 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -448,7 +448,7 @@ def match(self, context, domain, attrs, metas): if settings_types[i] % 10 == metas[j]: continue return self.NO_MATCH - if isinstance(j, list): + elif isinstance(j, list): for k, l in enumerate(j): if l in attrs.keys(): if settings_types[i][k] % 10 == attrs[l]: @@ -459,6 +459,8 @@ def match(self, context, domain, attrs, metas): continue return self.NO_MATCH return self.NO_MATCH + elif j is None: + continue else: return self.NO_MATCH else: From 3727eb5e5264f2fa38d4110c884b4b890fa76ae8 Mon Sep 17 00:00:00 2001 From: callumgassner Date: Thu, 25 Aug 2022 12:22:34 +1000 Subject: [PATCH 39/93] owpolar: better solution to properly match contexts --- orangecontrib/spectroscopy/widgets/owpolar.py | 65 +++---------------- 1 file changed, 9 insertions(+), 56 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 235100f53..cdebe7150 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -413,60 +413,6 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, a return outputs, model, spectra, meta, vars[1] -class PolarDomainContextHandler(DomainContextHandler): - - match_values = DomainContextHandler.MATCH_VALUES_ALL - - def match(self, context, domain, attrs, metas): - try: - settings_names = [ - context.values['angles'][0], - [i[0] for i in context.values['feats'][0]], - context.values['map_x'][0], - context.values['map_y'][0]] - settings_types = [ - context.values['angles'][1], - [i[1] for i in context.values['feats'][0]], - context.values['map_x'][1], - context.values['map_y'][1]] - except IndexError: - settings_names = [ - context.values['angles'][0], - [i[0] for i in context.values['feats']], - context.values['map_x'][0], - context.values['map_y'][0]] - settings_types = [ - context.values['angles'][1], - [i[1] for i in context.values['feats']], - context.values['map_x'][1], - context.values['map_y'][1]] - - if attrs == context.attributes and \ - metas == context.metas: - for i, j in enumerate(settings_names): - if isinstance(j, str) and j in metas.keys(): - if settings_types[i] % 10 == metas[j]: - continue - return self.NO_MATCH - elif isinstance(j, list): - for k, l in enumerate(j): - if l in attrs.keys(): - if settings_types[i][k] % 10 == attrs[l]: - continue - return self.NO_MATCH - if l in metas.keys(): - if settings_types[i][k] % 10 == metas[l]: - continue - return self.NO_MATCH - return self.NO_MATCH - elif j is None: - continue - else: - return self.NO_MATCH - else: - return self.NO_MATCH - - return self.PERFECT_MATCH class OWPolar(OWWidget, ConcurrentWidgetMixin): @@ -490,7 +436,7 @@ class Outputs: autocommit = settings.Setting(False) - settingsHandler = PolarDomainContextHandler() + settingsHandler = DomainContextHandler() want_main_area = False resizing_enabled = True @@ -767,7 +713,7 @@ def more_data(self) -> Sequence[Table]: return [t for t in self._data_inputs if t is not None] def handleNewSignals(self): - self.closeContext() + self.check_and_close_context() self.data = None self.Warning.clear() self.Outputs.polar.send(None) @@ -862,6 +808,13 @@ def onDeleteWidget(self): self.shutdown() super().onDeleteWidget() + def check_and_close_context(self): + if hasattr(self, 'data'): + if len(self.data) == 1: + self.closeContext() + else: + self.angles = None + self.closeContext() if __name__ == "__main__": # pragma: no cover From 1ceae056ec2ff535be8c0f51a639fc2f2433fefa Mon Sep 17 00:00:00 2001 From: callumgassner Date: Thu, 25 Aug 2022 12:30:45 +1000 Subject: [PATCH 40/93] owpolar: use os.path.basename to get filename --- orangecontrib/spectroscopy/widgets/owpolar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index cdebe7150..b096d9248 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -598,7 +598,7 @@ def _change_angles(self): def add_angles(self, anglst, lab, labels, lines, widget, i, place, callback): #to be used in a loop - file = lab.split('/')[-1] + file = os.path.basename(lab) anglst.append(lab) ledit = gui.lineEdit(widget, self, None, label = file, callback = callback) ledit.setText(str(place)) From 963c4b1621ef054888ea336f68dfa958543e93f3 Mon Sep 17 00:00:00 2001 From: callumgassner Date: Thu, 25 Aug 2022 17:04:38 +1000 Subject: [PATCH 41/93] test_owpolar: add test for signal disconnect during computation NB: Test does not fail, but ValueError does appear in output --- orangecontrib/spectroscopy/tests/test_owpolar.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/orangecontrib/spectroscopy/tests/test_owpolar.py b/orangecontrib/spectroscopy/tests/test_owpolar.py index b21a7b05d..8352145fd 100644 --- a/orangecontrib/spectroscopy/tests/test_owpolar.py +++ b/orangecontrib/spectroscopy/tests/test_owpolar.py @@ -252,6 +252,20 @@ def test_warnings(self): self.send_signal("Data", self.in4, 3, widget=self.widget) self.assertFalse(self.widget.Warning.notenough.is_shown()) + def test_disconnect(self): + self.send_signal("Data", self.multifile, 0, widget=self.widget) + self.widget.angles = self.widget.anglemetas[0] + self.widget.map_x = self.widget.x_axis[0] + self.widget.map_y = self.widget.y_axis[1] + self.widget.alpha = 0 + self.widget.invert_angles = True + self.widget.autocommit = True + self.widget.feats = [self.widget.feat_view.model()[:][2], + self.widget.feat_view.model()[:][3]] + self.widget.handleNewSignals() + self.wait_until_stop_blocking() + self.send_signal("Data", None, 0, widget=self.widget) + # def test_clearangles(self): # #test clearing angles # pass From a7ba33de46f801f0e56368c0f8ce5c250c925142 Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Thu, 25 Aug 2022 22:26:22 +0200 Subject: [PATCH 42/93] owpolar: copy lists into the computation Some lists are edited in place, therefore copy them before sending them into the computation thread. --- orangecontrib/spectroscopy/widgets/owpolar.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index b096d9248..a02483713 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -764,7 +764,7 @@ def handleNewSignals(self): @gui.deferred def commit(self): - + self.cancel() self.check_params() if len(self.Warning.active) > 0: return @@ -786,8 +786,8 @@ def commit(self): else: sorted_data = self.sorted_data - self.start(run, sorted_data, self.feats, self.alpha, self.map_x, - self.map_y, self.invert_angles, self.polangles, + self.start(run, sorted_data, list(self.feats), self.alpha, self.map_x, + self.map_y, self.invert_angles, list(self.polangles), self.average, self.angles) def on_done(self, result: Results): From a92f7c193f8ae916b5eecbde27283f8553c261f5 Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Mon, 29 Aug 2022 11:58:44 +0200 Subject: [PATCH 43/93] owpolar: fix bugs caused by class attributes --- orangecontrib/spectroscopy/widgets/owpolar.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index a02483713..2587817ba 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -447,16 +447,6 @@ class Outputs: invert_angles = Setting(False, schema_only=True) average = Setting(False, schema_only=True) angles = ContextSetting(None) - - anglst = [] - lines = [] - labels = [] - multiin_anglst = [] - multiin_lines = [] - multiin_labels = [] - polangles = [] - n_inputs = 0 - feats: List[Variable] = ContextSetting([]) class Warning(OWWidget.Warning): @@ -477,6 +467,15 @@ def __init__(self): ConcurrentWidgetMixin.__init__(self) gui.OWComponent.__init__(self) + self.anglst = [] + self.lines = [] + self.labels = [] + self.multiin_anglst = [] + self.multiin_lines = [] + self.multiin_labels = [] + self.polangles = [] + self.n_inputs = 0 + self._dumb_tables = owconcatenate.OWConcatenate._dumb_tables self._get_part = owconcatenate.OWConcatenate._get_part self.merge_domains = owconcatenate.OWConcatenate.merge_domains From 076ddffe80c2248f4bd0742ab022a6992337b8db Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Mon, 29 Aug 2022 11:59:16 +0200 Subject: [PATCH 44/93] owpolar: try shorter strings so that the tests pass --- orangecontrib/spectroscopy/widgets/owpolar.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 2587817ba..9f0768712 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -491,7 +491,7 @@ def __init__(self): formlayout2 = QFormLayout() form2.setLayout(formlayout2) - self.multifile = gui.widgetBox(vbox2, "Multifile Input (all angles in 1 table)", + self.multifile = gui.widgetBox(vbox2, "All angles in a single input", sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) self.anglemetas = DomainModel(DomainModel.METAS, valid_types=DiscreteVariable) @@ -501,7 +501,7 @@ def __init__(self): self.anglesel.setDisabled(True) - self.multiin = gui.widgetBox(vbox2, "Multiple Inputs (1 angle per input)", + self.multiin = gui.widgetBox(vbox2, "Single angle per input", sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) vbox2.layout().addWidget(form2) From ebbf21775d77da035335a5776e22a435505b5b23 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Mon, 20 May 2024 15:17:36 +1000 Subject: [PATCH 45/93] owpolar: remove azimuth dependence on alpha --- orangecontrib/spectroscopy/widgets/owpolar.py | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 9f0768712..5f7b78e97 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -98,6 +98,7 @@ def run(data, feature, alpha, map_x, map_y, invert_angles, polangles, average, output, model, spectra, origmetas, errorstate = process_polar_abs(data, alpha, feature, map_x, map_y, invert_angles, polangles, average, state) + tempoutaddmetas = [[ContinuousVariable.make('Azimuth Angle (' + i.name + ')'), ContinuousVariable.make('Hermans Orientation Function (' + i.name + ')'), ContinuousVariable.make('Intensity (' + i.name + ')'), @@ -191,22 +192,14 @@ def find_az(alpha, params): Abs1 = azimuth(Az1, *params) Az2 = calc_angles(params[0],params[1])-90 - if alpha < 54.73: - if Abs0 > Abs1: - Az = Az0 - elif Abs1 > Abs0: - if Az1 < 90: - Az = Az1 - elif Az1 > 90: - Az = Az2 - elif alpha >= 54.73: - if Abs0 < Abs1: - Az = Az0 - elif Abs1 < Abs0: - if Az1 < 90: - Az = Az1 - elif Az1 > 90: - Az = Az2 + + if Abs0 > Abs1: + Az = Az0 + elif Abs1 > Abs0: + if Az1 < 90: + Az = Az1 + elif Az1 > 90: + Az = Az2 return Az def compute(xys, yidx, smms, shapes, dtypes, polangles): From f250447d93f390ed8790f9dd4793566c98b721a8 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Mon, 20 May 2024 15:36:25 +1000 Subject: [PATCH 46/93] owhyper: fix crash with no data --- orangecontrib/spectroscopy/widgets/owhyper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 78cf47617..3bd9913e9 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -1311,6 +1311,7 @@ def __init__(self): iabox.layout().addWidget(self.imageplot.axes_settings_box) icbox.layout().addWidget(self.imageplot.color_settings_box) + self.data = None self.setup_vector_plot_controls() # do not save visible image (a complex structure as a setting; @@ -1354,7 +1355,6 @@ def __init__(self): self.markings_integral = [] - self.data = None self.disable_integral_range = False self.resize(900, 700) From 88a8dcda80cd5f96c455169d0cdd46e4fb9b2123 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Mon, 20 May 2024 17:00:28 +1000 Subject: [PATCH 47/93] owpolar: cancel upon input change Returns control to widget and prevents output data from being displayed if inputs are changed during processing/calculating Memory leak persists --- orangecontrib/spectroscopy/widgets/owpolar.py | 1 + 1 file changed, 1 insertion(+) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 5f7b78e97..1bb3fedbc 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -705,6 +705,7 @@ def more_data(self) -> Sequence[Table]: return [t for t in self._data_inputs if t is not None] def handleNewSignals(self): + self.cancel() self.check_and_close_context() self.data = None self.Warning.clear() From 596b6d9d7717140cee08b090f426d0f0ee53a57c Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Wed, 22 May 2024 16:07:30 +1000 Subject: [PATCH 48/93] owpolar: default angle, x and y values --- orangecontrib/spectroscopy/widgets/owpolar.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 1bb3fedbc..a45a642c5 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -562,6 +562,10 @@ def init_attr_values(self, data): self.x_axis.set_domain(domain) self.y_axis.set_domain(domain) self.anglemetas.set_domain(domain) + self.angles = self.anglemetas[0] if self.anglemetas else None + self.map_x = self.x_axis[0] if self.x_axis else None + self.map_y = self.y_axis[1] if len(self.y_axis) >= 2 \ + else self.map_x def _change_input(self): self.commit.deferred() @@ -735,6 +739,7 @@ def handleNewSignals(self): if len(self.data) == 1: self.openContext(self.data[0]) + self.angles = self.anglemetas[0] if self.anglemetas else None #Fixes self.angles being None if it was first a text variable and then changed to categorical, but I feel this could be done better... self._change_angles() elif 1 < len(self.data) < 4 or len(self.data) == 0: self.Warning.notenough() From 19ad946f27838b2215315050413511837f4e70be Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Wed, 22 May 2024 16:16:22 +1000 Subject: [PATCH 49/93] owpolar: better behaviour of nofeat warning --- orangecontrib/spectroscopy/widgets/owpolar.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index a45a642c5..8a1e8350b 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -551,7 +551,13 @@ def __init__(self): def _feat_changed(self): + self.Warning.nofeat.clear() rows = self.feat_view.selectionModel().selectedRows() + if len(rows) > 0: + self.Warning.nofeat.clear() + else: + self.Warning.nofeat() + return values = self.feat_view.model()[:] self.feats = [values[row.row()] for row in sorted(rows)] self.commit.deferred() From d50d4b9ef5be10ea0376bbf0ab95705ff907cd4d Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Wed, 22 May 2024 16:25:25 +1000 Subject: [PATCH 50/93] TEMP: comment out unused warnings --- orangecontrib/spectroscopy/widgets/owpolar.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 8a1e8350b..bdceb9b15 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -443,16 +443,16 @@ class Outputs: feats: List[Variable] = ContextSetting([]) class Warning(OWWidget.Warning): - nodata = Msg("No useful data on input!") - noang = Msg("Must receive 4 angles at specified polarisation") + # nodata = Msg("No useful data on input!") + # noang = Msg("Must receive 4 angles at specified polarisation") nofeat = Msg("Select Feature") noxy = Msg("Select X and Y variables") pol = Msg("Invalid Polarisation angles") notenough = Msg("Must have >= 4 angles") wrongdata = Msg("Model returns inf. Inappropriate data") - tomany = Msg("Widget must receive data at data input or discrete angles only") - missingfeat = Msg("All inputs must have the selected feature") - renamed_variables = Msg("Variables with duplicated names have been renamed.") + # tomany = Msg("Widget must receive data at data input or discrete angles only") + # missingfeat = Msg("All inputs must have the selected feature") + # renamed_variables = Msg("Variables with duplicated names have been renamed.") XYfeat = Msg("Selected feature(s) cannot be the same as XY selection") def __init__(self): @@ -577,7 +577,7 @@ def _change_input(self): self.commit.deferred() def _change_angles(self): - self.Warning.nodata.clear() + # self.Warning.nodata.clear() if self.angles: self.clear_angles(self.anglst, self.lines, self.labels, self.multifile) self.anglst = [] From b9b0eca7b09597d59a15d3c25e48e6894cd83c42 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Wed, 22 May 2024 16:47:32 +1000 Subject: [PATCH 51/93] owpolar: better clarity of nofeat warning --- orangecontrib/spectroscopy/widgets/owpolar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index bdceb9b15..649106878 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -445,7 +445,7 @@ class Outputs: class Warning(OWWidget.Warning): # nodata = Msg("No useful data on input!") # noang = Msg("Must receive 4 angles at specified polarisation") - nofeat = Msg("Select Feature") + nofeat = Msg("Select one or more Features to calculate orientations with") noxy = Msg("Select X and Y variables") pol = Msg("Invalid Polarisation angles") notenough = Msg("Must have >= 4 angles") From 94afc7b4b7ab36992c5500fe1dffe1a2af94e3b6 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Mon, 3 Jun 2024 12:39:01 +1000 Subject: [PATCH 52/93] owhyper: hide vector controls when not in use --- orangecontrib/spectroscopy/widgets/owhyper.py | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 3bd9913e9..75cd7566f 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -1375,6 +1375,87 @@ def _setup_plot_parameters(self): VisualSettingsDialog(self, self.imageplot.parameter_setter.initial_settings) + def setup_vector_plot_controls(self): + enable_vect = QWidgetAction(self) + vect_box = gui.vBox(self) + vect_box.setContentsMargins(10,5,0,5) + self.cb_vector = gui.checkBox(vect_box, self, "show_vector_plot", label="Show vector plot", + callback=self.enable_vector) + enable_vect.setDefaultWidget(vect_box) + self.imageplot.view_menu.addAction(enable_vect) + + self.vectorbox = gui.widgetBox(self.controlArea, box=True) + + self.vector_opts = DomainModel(DomainModel.SEPARATED, + valid_types=DomainModel.PRIMITIVE, placeholder='None') + self.vector_angle = None + self.vector_magnitude = None + self.colour_opts = vector_colour + + self.v_angle_select = gui.comboBox(self.vectorbox, self, 'vector_angle', searchable=True, + label="Vector Angle", model=self.vector_opts, + callback=self._update_vector) + + self.v_mag_select = gui.comboBox(self.vectorbox, self, 'vector_magnitude', searchable=True, + label="Vector Magnitude", model=self.vector_opts, + callback=self._update_vector) + + self.v_colour_select = gui.comboBox(self.vectorbox, self, 'vector_colour_index', + label="Vector Colour", callback=self.update_vector_colour) + model = vector_colour_model(vector_colour) + model.setParent(self) + self.v_colour_select.setModel(model) + + self.v_scale_slider = gui.hSlider(self.vectorbox, self, 'vector_scale', label="Scale", + minValue=0, maxValue=1000, step=10, createLabel=False, + callback=self.update_vector_scale) + + self.v_opacity_slider = gui.hSlider(self.vectorbox, self, 'vector_opacity', label="Opacity", + minValue=0, maxValue=255, step=5, createLabel=False, + callback=self.update_vector_colour) + + self.enable_vector() + + + def update_vector_plot_interface(self): + vector_params = ['vector_angle', 'vector_magnitude', 'vector_colour_index', + 'vector_scale', 'vector_opacity'] + for i in vector_params: + getattr(self.controls, i).setEnabled(self.show_vector_plot) + + def enable_vector(self): + self.vectorbox.setVisible(self.show_vector_plot) + self._update_vector() + + def _update_vector(self): + self.update_vector_plot_interface() + self.imageplot.update_vectors() + self.imageplot.update_vector_colour() + + def get_vector_data(self): + if self.show_vector_plot is False or self.data is None: + return None + + ang = self.vector_angle + mag = self.vector_magnitude + angs = self.data.get_column(ang) if ang else np.full(len(self.data), 0) + mags = self.data.get_column(mag) if mag else np.full(len(self.data), 1) + + return np.vstack([angs, mags]).T + + def get_vector_colour(self): + return vector_colour[self.vector_colour_index][1][0] + (self.vector_opacity,) + + def update_vector_colour(self): + self.imageplot.update_vector_colour() + + def update_vector_scale(self): + self.imageplot.update_vectors() + + def init_vector_plot(self, data): + domain = data.domain if data is not None else None + self.vector_opts.set_domain(domain) + # initialize values so that the combo boxes are not in invalid states if self.vector_opts: # TODO here we could instead set good default values if available From da4f7d79f4a2670790b06bf4148bb35637e32022 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Mon, 3 Jun 2024 13:48:55 +1000 Subject: [PATCH 53/93] owhyper: add vector width control --- orangecontrib/spectroscopy/widgets/owhyper.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 75cd7566f..45278c652 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -1003,7 +1003,10 @@ def set_visible_image_comp_mode(self, comp_mode: QPainter.CompositionMode): self.vis_img.setCompositionMode(comp_mode) def update_vector_colour(self): - pen = self.parent.get_vector_colour() + col = self.parent.get_vector_colour() + width = self.parent.vector_width + pen = pg.mkPen(color = col, width = width) + pen.setCapStyle(Qt.PenCapStyle.SquareCap) self.vector_plot.setPen(pen) def update_vectors(self): @@ -1189,6 +1192,7 @@ class Outputs(SelectionOutputsMixin.Outputs): vector_magnitude = ContextSetting(None) vector_colour_index = ContextSetting(0) vector_scale = Setting(1) + vector_width = Setting(1) vector_opacity = Setting(255) show_visible_image = Setting(False) @@ -1409,6 +1413,10 @@ def setup_vector_plot_controls(self): self.v_scale_slider = gui.hSlider(self.vectorbox, self, 'vector_scale', label="Scale", minValue=0, maxValue=1000, step=10, createLabel=False, callback=self.update_vector_scale) + + self.v_width_slider = gui.hSlider(self.vectorbox, self, 'vector_width', label="Width", + minValue=1, maxValue=40, step=10, createLabel=False, + callback=self.update_vector_colour) self.v_opacity_slider = gui.hSlider(self.vectorbox, self, 'vector_opacity', label="Opacity", minValue=0, maxValue=255, step=5, createLabel=False, @@ -1419,7 +1427,7 @@ def setup_vector_plot_controls(self): def update_vector_plot_interface(self): vector_params = ['vector_angle', 'vector_magnitude', 'vector_colour_index', - 'vector_scale', 'vector_opacity'] + 'vector_scale', 'vector_width', 'vector_opacity'] for i in vector_params: getattr(self.controls, i).setEnabled(self.show_vector_plot) From 21933c6c422ebd562ba484d21ea7eb6b48bd9462 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Fri, 7 Jun 2024 12:21:49 +1000 Subject: [PATCH 54/93] owhyper: move enable vector cb to control box --- orangecontrib/spectroscopy/widgets/owhyper.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 45278c652..7cce1024d 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -1307,6 +1307,9 @@ def __init__(self): contentsLength=12, searchable=True, callback=self.update_rgb_value, model=self.rgb_value_model) + self.cb_vector = gui.checkBox(rbox, self, "show_vector_plot", label="Show vector plot", + callback=self.enable_vector) + splitter = QSplitter(self) splitter.setOrientation(Qt.Vertical) self.imageplot = ImagePlot(self) @@ -1380,13 +1383,6 @@ def _setup_plot_parameters(self): VisualSettingsDialog(self, self.imageplot.parameter_setter.initial_settings) def setup_vector_plot_controls(self): - enable_vect = QWidgetAction(self) - vect_box = gui.vBox(self) - vect_box.setContentsMargins(10,5,0,5) - self.cb_vector = gui.checkBox(vect_box, self, "show_vector_plot", label="Show vector plot", - callback=self.enable_vector) - enable_vect.setDefaultWidget(vect_box) - self.imageplot.view_menu.addAction(enable_vect) self.vectorbox = gui.widgetBox(self.controlArea, box=True) From 5aaf526df35c84a7ca139c31c85613d90a5e1fd3 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Fri, 7 Jun 2024 12:27:04 +1000 Subject: [PATCH 55/93] owhyper: revamped vector plot Rewrote the vector plot to allow colouring of vectors based on the value of a feature * Only experimental -- the colour by feature option is slow for large datasets --- orangecontrib/spectroscopy/widgets/owhyper.py | 177 ++++++++++++++---- 1 file changed, 141 insertions(+), 36 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 7cce1024d..b30622fdc 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -8,7 +8,7 @@ QGridLayout, QFormLayout, QAction, QVBoxLayout, QWidgetAction, QSplitter, \ QToolTip, QGraphicsRectItem from AnyQt.QtGui import QColor, QKeySequence, QPainter, QBrush, QStandardItemModel, \ - QStandardItem, QLinearGradient, QPixmap, QIcon + QStandardItem, QLinearGradient, QPixmap, QIcon, QPen from AnyQt.QtCore import Qt, QRectF, QPointF, QSize from AnyQt.QtTest import QTest @@ -260,6 +260,7 @@ def color_palette_table(colors, underflow=None, overflow=None): ("Cyan", {0: (0,255,255)}), ("Magenta", {0: (255,0,255)}), ("Yellow", {0: (255,255,0)}), + ("By Feature", {0: ('by feature')}) ] def palette_gradient(colors): @@ -761,6 +762,87 @@ def getAxis(self): def legend_items(self): return [] +class VectorPlot(pg.GraphicsObject): + + def __init__(self): + pg.GraphicsObject.__init__(self) + self.params = None + self.coords = [None, None] + + self._maxSpotPxWidth = 0 + self._boundingRect = None + + def setData(self, params, coords): + self._maxSpotPxWidth = 0 + self._boundingRect = None + + self.coords = coords + self.params = params + self.prepareGeometryChange() + self.informViewBoundsChanged() + self.update() + + def viewTransformChanged(self): + self.prepareGeometryChange() + + def paint(self, p, option, widget): + if type(self.params[3]) == tuple: + path = pg.arrayToQPath(self.params[0], self.params[1], connect = 'pairs', finiteCheck=False) + pen = QPen(QBrush(QColor(*self.params[3])), self.params[2]) + pen.setCosmetic(True) + p.setPen(pen) + p.drawPath(path) + elif type(self.params[3]) == list: + pen = QPen(QBrush(QColor()), self.params[2]) + pen.setCosmetic(True) + unique_cols = np.unique(self.params[3][0], return_index=True, axis=0) + irgbx2 = np.hstack((self.params[3][0], self.params[3][0])).reshape(self.params[3][0].shape[0]*2, 4) + for i in unique_cols[0]: + path = pg.arrayToQPath(self.params[0][np.where(irgbx2[:,0] == i[0])], + self.params[1][np.where(irgbx2[:,0] == i[0])], + connect = 'pairs', finiteCheck=False) + pen.setColor(QColor(*i[1:], self.params[3][1])) + p.setPen(pen) + p.drawPath(path) + + # These functions are the same as pg.plotcurveitem with small adaptations + def pixelPadding(self): + self._maxSpotPxWidth = self.params[2]*0.7072 + return self._maxSpotPxWidth + + def boundingRect(self): + if self.params is None: + return QRectF() + elif self._boundingRect is None and self.params is not None: + (xmn, xmx) = (np.nanmin(self.params[0]), np.nanmax(self.params[0])) + (ymn, ymx) = (np.nanmin(self.params[1]), np.nanmax(self.params[1])) + if xmn is None or xmx is None: + return QRectF() + if ymn is None or ymx is None: + return QRectF() + + px = py = 0.0 + pxPad = self.pixelPadding() + if pxPad > 0: + # determine length of pixel in local x, y directions + px, py = self.pixelVectors() + try: + px = 0 if px is None else px.length() + except OverflowError: + px = 0 + try: + py = 0 if py is None else py.length() + except OverflowError: + py = 0 + + # return bounds expanded by pixel size + px *= pxPad + py *= pxPad + #px += self._maxSpotWidth * 0.5 + #py += self._maxSpotWidth * 0.5 + self._boundingRect = QRectF(xmn-px, ymn-py, (2*px)+xmx-xmn, (2*py)+ymx-ymn) + + return self._boundingRect class BasicImagePlot(QWidget, OWComponent, SelectionGroupMixin, AxesSettingsMixin, ImageSelectionMixin, @@ -823,7 +905,7 @@ def __init__(self, parent): self.plot.vb.setAspectLocked() self.plot.scene().sigMouseMoved.connect(self.plot.vb.mouseMovedEvent) - self.vector_plot = pg.PlotCurveItem() + self.vector_plot = VectorPlot() self.vector_plot.hide() self.plot.addItem(self.vector_plot) @@ -1002,13 +1084,6 @@ def set_visible_image_opacity(self, opacity: int): def set_visible_image_comp_mode(self, comp_mode: QPainter.CompositionMode): self.vis_img.setCompositionMode(comp_mode) - def update_vector_colour(self): - col = self.parent.get_vector_colour() - width = self.parent.vector_width - pen = pg.mkPen(color = col, width = width) - pen.setCapStyle(Qt.PenCapStyle.SquareCap) - self.vector_plot.setPen(pen) - def update_vectors(self): v = self.parent.get_vector_data() if self.lsx is None: # image is not shown or is being computed @@ -1020,8 +1095,9 @@ def update_vectors(self): lsx, lsy = self.lsx, self.lsy xindex, yindex = self.xindex, self.yindex scale = self.parent.vector_scale - th = v[:,0] - v_mag = v[:,1] + w = self.parent.vector_width + th = np.asarray(v[:,0], dtype=float) + v_mag = np.asarray(v[:,1], dtype=float) amp = v_mag / max(v_mag) * (scale/100) wy = _shift(lsx)*2 wx = _shift(lsx)*2 @@ -1033,9 +1109,10 @@ def update_vectors(self): ycurve = np.empty((dispy.shape[0]*2)) xcurve[0::2], xcurve[1::2] = x - dispx, x + dispx ycurve[0::2], ycurve[1::2] = y - dispy, y + dispy - connect = np.ones((dispx.shape[0]*2)) - connect[1::2] = 0 - self.vector_plot.setData(x=xcurve, y=ycurve, connect=connect) + vcols = self.parent.get_vector_colour(v[:,2]) + v_params = [xcurve, ycurve, w, vcols] + + self.vector_plot.setData(v_params, [x, y]) self.vector_plot.show() @staticmethod @@ -1190,7 +1267,9 @@ class Outputs(SelectionOutputsMixin.Outputs): show_vector_plot = Setting(False) vector_angle = ContextSetting(None) vector_magnitude = ContextSetting(None) - vector_colour_index = ContextSetting(0) + vector_colour_index = Setting(0) + vcol_byval_index = Setting(0) + vcol_byval_feat = ContextSetting(None) vector_scale = Setting(1) vector_width = Setting(1) vector_opacity = Setting(255) @@ -1388,8 +1467,12 @@ def setup_vector_plot_controls(self): self.vector_opts = DomainModel(DomainModel.SEPARATED, valid_types=DomainModel.PRIMITIVE, placeholder='None') + self.vector_col_opts = vector_colour_model(vector_colour) + self.vector_pal_opts = color_palette_model(_color_palettes, (QSize(64, 16))) + self.vector_angle = None self.vector_magnitude = None + self.vcol_byval_feat = None self.colour_opts = vector_colour self.v_angle_select = gui.comboBox(self.vectorbox, self, 'vector_angle', searchable=True, @@ -1401,22 +1484,31 @@ def setup_vector_plot_controls(self): callback=self._update_vector) self.v_colour_select = gui.comboBox(self.vectorbox, self, 'vector_colour_index', - label="Vector Colour", callback=self.update_vector_colour) - model = vector_colour_model(vector_colour) - model.setParent(self) - self.v_colour_select.setModel(model) + label="Vector Colour", model=self.vector_col_opts, + callback=self._update_vector) + + self.v_colour_byval = gui.comboBox(self.vectorbox, self, 'vcol_byval_feat', + label="Vector Colour by value", model=self.vector_opts, + callback=self._update_vector) + + self.v_colour_byval_select = gui.comboBox(self.vectorbox, self, 'vcol_byval_index', + label="", model = self.vector_pal_opts, + callback=self._update_vector) + self.v_colour_byval_select.setIconSize(QSize(64, 16)) + + self.v_colour_byval_select.setEnabled(False) self.v_scale_slider = gui.hSlider(self.vectorbox, self, 'vector_scale', label="Scale", - minValue=0, maxValue=1000, step=10, createLabel=False, - callback=self.update_vector_scale) + minValue=1, maxValue=1000, step=10, createLabel=False, + callback=self._update_vector) self.v_width_slider = gui.hSlider(self.vectorbox, self, 'vector_width', label="Width", - minValue=1, maxValue=40, step=10, createLabel=False, - callback=self.update_vector_colour) + minValue=1, maxValue=40, step=1, createLabel=False, + callback=self._update_vector) self.v_opacity_slider = gui.hSlider(self.vectorbox, self, 'vector_opacity', label="Opacity", minValue=0, maxValue=255, step=5, createLabel=False, - callback=self.update_vector_colour) + callback=self._update_vector) self.enable_vector() @@ -1427,6 +1519,13 @@ def update_vector_plot_interface(self): for i in vector_params: getattr(self.controls, i).setEnabled(self.show_vector_plot) + if self.vector_colour_index == 8: + self.v_colour_byval.setEnabled(True) + self.v_colour_byval_select.setEnabled(True) + else: + self.v_colour_byval.setEnabled(False) + self.v_colour_byval_select.setEnabled(False) + def enable_vector(self): self.vectorbox.setVisible(self.show_vector_plot) self._update_vector() @@ -1434,7 +1533,6 @@ def enable_vector(self): def _update_vector(self): self.update_vector_plot_interface() self.imageplot.update_vectors() - self.imageplot.update_vector_colour() def get_vector_data(self): if self.show_vector_plot is False or self.data is None: @@ -1442,19 +1540,26 @@ def get_vector_data(self): ang = self.vector_angle mag = self.vector_magnitude + col = self.vcol_byval_feat angs = self.data.get_column(ang) if ang else np.full(len(self.data), 0) mags = self.data.get_column(mag) if mag else np.full(len(self.data), 1) + cols = self.data.get_column(col) if col else np.full(len(self.data), None) - return np.vstack([angs, mags]).T - - def get_vector_colour(self): - return vector_colour[self.vector_colour_index][1][0] + (self.vector_opacity,) + return np.vstack([angs, mags, cols]).T - def update_vector_colour(self): - self.imageplot.update_vector_colour() - - def update_vector_scale(self): - self.imageplot.update_vectors() + def get_vector_colour(self, feat): + if self.vector_colour_index == 8: + if feat[0] == None: # a feat has not been selected yet + return vector_colour[0][1][0] + (self.vector_opacity,) + else: + fmin, fmax = np.min(feat), np.max(feat) + feat_idxs = np.asarray(((feat-fmin)/(fmax-fmin))*255, dtype=int) + col_vals = np.asarray(_color_palettes[self.vcol_byval_index][1][0][feat_idxs], dtype=int) + out = [np.hstack((np.expand_dims(feat_idxs, 1), col_vals)), + self.vector_opacity] + return out + else: + return vector_colour[self.vector_colour_index][1][0] + (self.vector_opacity,) def init_vector_plot(self, data): domain = data.domain if data is not None else None @@ -1463,9 +1568,9 @@ def init_vector_plot(self, data): # initialize values so that the combo boxes are not in invalid states if self.vector_opts: # TODO here we could instead set good default values if available - self.vector_magnitude = self.vector_angle = None + self.vector_magnitude = self.vector_angle = self.vcol_byval_feat = None else: - self.vector_magnitude = self.vector_angle = None + self.vector_magnitude = self.vector_angle = self.vcol_byval_feat = None def setup_visible_image_controls(self): self.visbox = gui.widgetBox(self.controlArea, True) From 859cd22d4b81d223ab30b35e1caf04e6e0b36236 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Fri, 7 Jun 2024 14:07:51 +1000 Subject: [PATCH 56/93] owhyper: add legend for feat coloured vectors --- orangecontrib/spectroscopy/widgets/owhyper.py | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index b30622fdc..3c062ca76 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -752,7 +752,7 @@ def title_item(self): @property def axis_items(self): return [value["item"] for value in self.master.plot.axes.values()] \ - + [self.master.legend.axis] + + [self.master.legend.axis] + [self.master.vect_legend.axis] @property def getAxis(self): @@ -908,6 +908,9 @@ def __init__(self, parent): self.vector_plot = VectorPlot() self.vector_plot.hide() self.plot.addItem(self.vector_plot) + self.vect_legend = ImageColorLegend() + self.vect_legend.setVisible(False) + ci.addItem(self.vect_legend) layout = QGridLayout() self.plotview.setLayout(layout) @@ -1488,7 +1491,7 @@ def setup_vector_plot_controls(self): callback=self._update_vector) self.v_colour_byval = gui.comboBox(self.vectorbox, self, 'vcol_byval_feat', - label="Vector Colour by value", model=self.vector_opts, + label="Vector Colour by Feature", model=self.vector_opts, callback=self._update_vector) self.v_colour_byval_select = gui.comboBox(self.vectorbox, self, 'vcol_byval_index', @@ -1522,9 +1525,15 @@ def update_vector_plot_interface(self): if self.vector_colour_index == 8: self.v_colour_byval.setEnabled(True) self.v_colour_byval_select.setEnabled(True) + if self.vcol_byval_feat is not None: + self.imageplot.vect_legend.setVisible(True) + self.imageplot.vect_legend.adapt_to_size() + else: + self.imageplot.vect_legend.setVisible(False) else: self.v_colour_byval.setEnabled(False) self.v_colour_byval_select.setEnabled(False) + self.imageplot.vect_legend.setVisible(False) def enable_vector(self): self.vectorbox.setVisible(self.show_vector_plot) @@ -1533,6 +1542,16 @@ def enable_vector(self): def _update_vector(self): self.update_vector_plot_interface() self.imageplot.update_vectors() + if self.vector_colour_index == 8 and \ + self.vcol_byval_feat is not None: + self.update_vect_legend()# + + def update_vect_legend(self):#feat + feat = self.data.get_column(self.vcol_byval_feat) + fmin, fmax = np.min(feat), np.max(feat) + self.imageplot.vect_legend.set_range(fmin, fmax) + self.imageplot.vect_legend.set_colors(_color_palettes[self.vcol_byval_index][1][0]) + self.imageplot.vect_legend.adapt_to_size() def get_vector_data(self): if self.show_vector_plot is False or self.data is None: From 3e3e5ce71d162bc9b1c7ad07232e15aef6114493 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Fri, 14 Jun 2024 12:02:30 +1000 Subject: [PATCH 57/93] owpolar: add checkpoints for interruption request --- orangecontrib/spectroscopy/widgets/owpolar.py | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 649106878..7531525a9 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -1,3 +1,4 @@ +import time import os import multiprocessing from multiprocessing.managers import SharedMemoryManager @@ -136,6 +137,10 @@ def run(data, feature, alpha, map_x, map_y, invert_angles, polangles, average, outmetadom = (ometadom + tuple(outaddmetas)) modmetadom = (ometadom + tuple(modaddmetas)) + if state.is_interruption_requested(): + results = None + return results + ofeatdom = data[0].domain.attributes datadomain = Domain(ofeatdom, metas = outmetadom) moddomain = Domain(ofeatdom, metas = modmetadom) @@ -145,6 +150,10 @@ def run(data, feature, alpha, map_x, map_y, invert_angles, polangles, average, out = Table.from_numpy(datadomain, X=spectra, Y=None, metas=outmetas) mod = Table.from_numpy(moddomain, X=spectra, Y=None, metas=modmetas) + if state.is_interruption_requested(): + results = None + return results + results.out = out results.model = mod results.errorstate = errorstate @@ -217,9 +226,11 @@ def compute(xys, yidx, smms, shapes, dtypes, polangles): x = np.asarray(polangles) for i in range(yidx[0], yidx[1]):#y-values(rows) - if vars[1] == 1: + if vars[1] != 0: break for j in enumerate(xys[0]):#x-values(cols) + if vars[1] != 0: + break for l in range(cvs.shape[2]): if np.any(np.isnan(cvs[i,j[0],l,:]), axis=0): continue @@ -325,7 +336,10 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, a coords = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], 2), np.nan) vars = np.asarray([alpha, 0]) fill = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0]), np.nan) + for i, j in enumerate(images): + if state.is_interruption_requested(): + return None, None, None, None, 2 cv = [j.domain[k] for k in featnames] doms = [map_x, map_y] + cv tempdata: Table = j.transform(Domain(doms)) @@ -342,6 +356,9 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, a coords[k,l,0] = i coords[k,l,1] = j + if state.is_interruption_requested(): + return None, None, None, None, 2 + with SharedMemoryManager() as smm: tcvs = smm.SharedMemory(size=cvs.nbytes) scvs = np.ndarray(cvs.shape, dtype=cvs.dtype, buffer=tcvs.buf) @@ -358,21 +375,33 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, a tvars = smm.SharedMemory(size=vars.nbytes) svars = np.ndarray(vars.shape, dtype=vars.dtype, buffer=tvars.buf) svars[:] = vars[:] + svars[:] = vars[:] # vars[1] == 0 -> continue processing, vars[1] == 1 -> data is incompatible, vars[1] == 2 -> interruption requested smms = [tcvs, None, None, tout, tmod, tcoords, tvars] shapes = [cvs.shape, spec.shape, metas.shape, out.shape, mod.shape, coords.shape, vars.shape] dtypes = [cvs.dtype, spec.dtype, metas.dtype, out.dtype, mod.dtype, coords.dtype, vars.dtype] + if state.is_interruption_requested(): + return None, None, None, None, 2 threads = start_compute(ulsxs, ulsys, smms, shapes, dtypes, polangles, state) for t in threads: - t.join() + t.join(0) + + while any([i.exitcode == None for i in threads]): + if state.is_interruption_requested(): + svars[1] = 2 + time.sleep(0.10) state.set_status("Finishing...") if invert is True: sout[:,:,:,2] = sout[:,:,:,2]*-1 outputs = np.reshape(sout[:,:,:,2:], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], 5*len(featnames))) model = np.reshape(smod[:,:,:,2:], (np.shape(ulsys)[0]*np.shape(ulsxs)[0], 4*len(featnames))) + vars[:] = svars[:] + + if state.is_interruption_requested(): + return None, None, None, None, 2 spectra = [] met = [] @@ -387,6 +416,10 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, a metatemp = metatemp[~np.isnan(model).any(axis=1)] metatemp = np.append(metatemp, np.full((np.shape(metatemp)[0],1), i), axis=1) met.append(metatemp) + + if state.is_interruption_requested(): + return None, None, None, None, 2 + elif average is True: average_spec = np.average(spec, axis=3) spectratemp = np.reshape(average_spec, From 260152311b2d37ded58c48ba8c0d294672453c32 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Mon, 17 Jun 2024 18:03:24 +1000 Subject: [PATCH 58/93] owhyper: fix vect colour crash without params --- orangecontrib/spectroscopy/widgets/owhyper.py | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 3c062ca76..78f5d53f5 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -767,16 +767,14 @@ class VectorPlot(pg.GraphicsObject): def __init__(self): pg.GraphicsObject.__init__(self) self.params = None - self.coords = [None, None] self._maxSpotPxWidth = 0 self._boundingRect = None - def setData(self, params, coords): + def setData(self, params): self._maxSpotPxWidth = 0 self._boundingRect = None - - self.coords = coords + self.params = params self.prepareGeometryChange() self.informViewBoundsChanged() @@ -786,24 +784,25 @@ def viewTransformChanged(self): self.prepareGeometryChange() def paint(self, p, option, widget): - if type(self.params[3]) == tuple: - path = pg.arrayToQPath(self.params[0], self.params[1], connect = 'pairs', finiteCheck=False) - pen = QPen(QBrush(QColor(*self.params[3])), self.params[2]) - pen.setCosmetic(True) - p.setPen(pen) - p.drawPath(path) - elif type(self.params[3]) == list: - pen = QPen(QBrush(QColor()), self.params[2]) - pen.setCosmetic(True) - unique_cols = np.unique(self.params[3][0], return_index=True, axis=0) - irgbx2 = np.hstack((self.params[3][0], self.params[3][0])).reshape(self.params[3][0].shape[0]*2, 4) - for i in unique_cols[0]: - path = pg.arrayToQPath(self.params[0][np.where(irgbx2[:,0] == i[0])], - self.params[1][np.where(irgbx2[:,0] == i[0])], - connect = 'pairs', finiteCheck=False) - pen.setColor(QColor(*i[1:], self.params[3][1])) + if self.params is not None: + if type(self.params[3]) == tuple: + path = pg.arrayToQPath(self.params[0], self.params[1], connect = 'pairs', finiteCheck=False) + pen = QPen(QBrush(QColor(*self.params[3])), self.params[2]) + pen.setCosmetic(True) p.setPen(pen) p.drawPath(path) + elif type(self.params[3]) == list: + pen = QPen(QBrush(QColor()), self.params[2]) + pen.setCosmetic(True) + unique_cols = np.unique(self.params[3][0], return_index=True, axis=0) + irgbx2 = np.hstack((self.params[3][0], self.params[3][0])).reshape(self.params[3][0].shape[0]*2, 4) + for i in unique_cols[0]: + path = pg.arrayToQPath(self.params[0][np.where(irgbx2[:,0] == i[0])], + self.params[1][np.where(irgbx2[:,0] == i[0])], + connect = 'pairs', finiteCheck=False) + pen.setColor(QColor(*i[1:], self.params[3][1])) + p.setPen(pen) + p.drawPath(path) # These functions are the same as pg.plotcurveitem with small adaptations def pixelPadding(self): @@ -1506,7 +1505,7 @@ def setup_vector_plot_controls(self): callback=self._update_vector) self.v_width_slider = gui.hSlider(self.vectorbox, self, 'vector_width', label="Width", - minValue=1, maxValue=40, step=1, createLabel=False, + minValue=1, maxValue=20, step=1, createLabel=False, callback=self._update_vector) self.v_opacity_slider = gui.hSlider(self.vectorbox, self, 'vector_opacity', label="Opacity", From 34365846b30ccdd02f60c08e94319a76fce61dcd Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Mon, 17 Jun 2024 18:06:33 +1000 Subject: [PATCH 59/93] owhyper: add ability to bin vectors magnitude and angle of vectors can be averaged using square 'bins' over a number of pixels, reducing cluttered vector plots in large datasets --- orangecontrib/spectroscopy/widgets/owhyper.py | 160 ++++++++++++++++-- 1 file changed, 142 insertions(+), 18 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 78f5d53f5..fa11f61d1 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -17,6 +17,7 @@ import bottleneck import numpy as np +import pandas as pd import pyqtgraph as pg from pyqtgraph import GraphicsWidget import colorcet @@ -263,6 +264,19 @@ def color_palette_table(colors, underflow=None, overflow=None): ("By Feature", {0: ('by feature')}) ] +bins = [ + ("1 x 1", {0, (1)}), + ("2 x 2", {0, (2)}), + ("3 x 3", {0, (3)}), + ("4 x 4", {0, (4)}), + ("5 x 5", {0, (5)}), + ("6 x 6", {0, (6)}), + ("7 x 7", {0, (7)}), + ("8 x 8", {0, (8)}), + ("9 x 9", {0, (9)}), + ("10 x 10", {0, (10)}), +] + def palette_gradient(colors): n = len(colors) stops = np.linspace(0.0, 1.0, n, endpoint=True) @@ -1062,6 +1076,7 @@ def update_view(self): self.data_valid_positions = None self.xindex = None self.yindex = None + self.parent.update_binsize() self.update_vectors() # clears the vector plot self.start(self.compute_image, self.data, self.attr_x, self.attr_y, @@ -1100,22 +1115,36 @@ def update_vectors(self): w = self.parent.vector_width th = np.asarray(v[:,0], dtype=float) v_mag = np.asarray(v[:,1], dtype=float) - amp = v_mag / max(v_mag) * (scale/100) wy = _shift(lsx)*2 wx = _shift(lsx)*2 - y = np.linspace(*lsy)[yindex[valid]] - x = np.linspace(*lsx)[xindex[valid]] - dispx = amp*wx/2*np.cos(np.radians(th)) - dispy = amp*wy/2*np.sin(np.radians(th)) - xcurve = np.empty((dispx.shape[0]*2)) - ycurve = np.empty((dispy.shape[0]*2)) - xcurve[0::2], xcurve[1::2] = x - dispx, x + dispx - ycurve[0::2], ycurve[1::2] = y - dispy, y + dispy - vcols = self.parent.get_vector_colour(v[:,2]) - v_params = [xcurve, ycurve, w, vcols] - - self.vector_plot.setData(v_params, [x, y]) + if self.parent.v_bin == 0: + y = np.linspace(*lsy)[yindex[valid]] + x = np.linspace(*lsx)[xindex[valid]] + amp = v_mag / max(v_mag) * (scale/100) + dispx = amp*wx/2*np.cos(np.radians(th)) + dispy = amp*wy/2*np.sin(np.radians(th)) + xcurve = np.empty((dispx.shape[0]*2)) + ycurve = np.empty((dispy.shape[0]*2)) + xcurve[0::2], xcurve[1::2] = x - dispx, x + dispx + ycurve[0::2], ycurve[1::2] = y - dispy, y + dispy + vcols = self.parent.get_vector_colour(v[:,2]) + v_params = [xcurve, ycurve, w, vcols] + self.vector_plot.setData(v_params) + else: + amp = self.parent.a / max(self.parent.a) * (scale/100) + dispx = amp*wx/2*np.cos(self.parent.th) + dispy = amp*wy/2*np.sin(self.parent.th) + xcurve = np.empty((dispx.shape[0]*2)) + ycurve = np.empty((dispy.shape[0]*2)) + xcurve[0::2], xcurve[1::2] = self.parent.new_xs - dispx, self.parent.new_xs + dispx + ycurve[0::2], ycurve[1::2] = self.parent.new_ys - dispy, self.parent.new_ys + dispy + vcols = self.parent.get_vector_colour(v[:,2]) + v_params = [xcurve, ycurve, w, vcols] + self.vector_plot.setData(v_params) self.vector_plot.show() + if self.parent.vector_colour_index == 8 and \ + self.parent.vcol_byval_feat is not None: + self.parent.update_vect_legend() @staticmethod def compute_image(data: Orange.data.Table, attr_x, attr_y, @@ -1197,6 +1226,13 @@ def draw(self, res, finished=False): self.update_color_schema() self.update_legend_visible() + # indices need to be saved to quickly draw vectors + self.yindex = yindex + self.xindex = xindex + + self.parent.update_binsize() + self.update_vectors() + # shift centres of the pixels so that the axes are useful shiftx = _shift(lsx) shifty = _shift(lsy) @@ -1275,6 +1311,14 @@ class Outputs(SelectionOutputsMixin.Outputs): vector_scale = Setting(1) vector_width = Setting(1) vector_opacity = Setting(255) + v_bin = Setting(0) + + a = None + th = None + cols = None + new_xs = None + new_ys = None + v_bin_change = 0 show_visible_image = Setting(False) visible_image_name = Setting(None) @@ -1443,6 +1487,7 @@ def __init__(self): self.markings_integral = [] + self.data = None self.disable_integral_range = False self.resize(900, 700) @@ -1471,6 +1516,7 @@ def setup_vector_plot_controls(self): valid_types=DomainModel.PRIMITIVE, placeholder='None') self.vector_col_opts = vector_colour_model(vector_colour) self.vector_pal_opts = color_palette_model(_color_palettes, (QSize(64, 16))) + self.vector_bin_opts = vector_colour_model(bins) self.vector_angle = None self.vector_magnitude = None @@ -1512,6 +1558,9 @@ def setup_vector_plot_controls(self): minValue=0, maxValue=255, step=5, createLabel=False, callback=self._update_vector) + self.v_bin_select = gui.comboBox(self.vectorbox, self, 'v_bin', label = "Pixel Binning", + model = self.vector_bin_opts, callback = self._update_binsize) + self.enable_vector() @@ -1541,12 +1590,12 @@ def enable_vector(self): def _update_vector(self): self.update_vector_plot_interface() self.imageplot.update_vectors() - if self.vector_colour_index == 8 and \ - self.vcol_byval_feat is not None: - self.update_vect_legend()# def update_vect_legend(self):#feat - feat = self.data.get_column(self.vcol_byval_feat) + if self.v_bin != 0: + feat = self.cols + else: + feat = self.data.get_column(self.vcol_byval_feat) fmin, fmax = np.min(feat), np.max(feat) self.imageplot.vect_legend.set_range(fmin, fmax) self.imageplot.vect_legend.set_colors(_color_palettes[self.vcol_byval_index][1][0]) @@ -1570,15 +1619,90 @@ def get_vector_colour(self, feat): if feat[0] == None: # a feat has not been selected yet return vector_colour[0][1][0] + (self.vector_opacity,) else: + if self.v_bin != 0: + self.update_binsize() + feat = self.cols fmin, fmax = np.min(feat), np.max(feat) + if fmin == fmax: + return vector_colour[0][1][0] + (self.vector_opacity,) feat_idxs = np.asarray(((feat-fmin)/(fmax-fmin))*255, dtype=int) col_vals = np.asarray(_color_palettes[self.vcol_byval_index][1][0][feat_idxs], dtype=int) - out = [np.hstack((np.expand_dims(feat_idxs, 1), col_vals)), + out = [np.hstack((np.expand_dims(feat_idxs, 1), col_vals)), self.vector_opacity] return out else: return vector_colour[self.vector_colour_index][1][0] + (self.vector_opacity,) + def circular_mean(self, degs): + sin = np.nansum(np.sin(np.radians(degs*2))) + cos = np.nansum(np.cos(np.radians(degs*2))) + return np.arctan2(sin, cos)/2 + + def _update_binsize(self): + self.v_bin_change = 1 + self.update_binsize() + + def update_binsize(self): + if self.v_bin == 0: + self.v_bin_change = 0 + self.imageplot.update_vectors() + else: + v = self.get_vector_data() + valid = self.imageplot.data_valid_positions + lsx, lsy = self.imageplot.lsx, self.imageplot.lsy + xindex, yindex = self.imageplot.xindex, self.imageplot.yindex + if lsx is None: + v = None + if v is None: + self.v_bin_change = 0 + self.imageplot.vector_plot.hide() + else: + th = np.asarray(v[:,0], dtype=float) + v_mag = np.asarray(v[:,1], dtype=float) + col = np.asarray(v[:,2], dtype=float) + y = np.linspace(*lsy)[yindex] + x = np.linspace(*lsx)[xindex] + df = pd.DataFrame([x, y, np.asarray([1 if i == True else 0 for i in valid]), v_mag, th, col], + index = ['x', 'y', 'valid', 'v_mag', 'th', 'cols']).T + + v_df = df.pivot_table(values = 'valid', columns = 'x', index = 'y', fill_value = 0) + a_df = df.pivot_table(values = 'v_mag', columns = 'x', index = 'y') + th_df = df.pivot_table(values = 'th', columns = 'x', index = 'y') + col_df = df.pivot_table(values = 'cols', columns = 'x', index = 'y') + kernel = np.ones((self.v_bin+1, self.v_bin+1)) + x_mod, y_mod = v_df.shape[1] % kernel.shape[1], v_df.shape[0] % kernel.shape[0] + st_x_idx = int(np.floor(x_mod/2)) + st_y_idx = int(np.floor(y_mod/2)) + + nvalid = np.zeros((int((v_df.shape[0]-y_mod)/kernel.shape[0]), + int((v_df.shape[1]-x_mod)/kernel.shape[1]))) + a = np.zeros((int((v_df.shape[0]-y_mod)/kernel.shape[0]), + int((v_df.shape[1]-x_mod)/kernel.shape[1]))) + th = np.zeros((int((v_df.shape[0]-y_mod)/kernel.shape[0]), + int((v_df.shape[1]-x_mod)/kernel.shape[1]))) + cols = np.zeros((int((v_df.shape[0]-y_mod)/kernel.shape[0]), + int((v_df.shape[1]-x_mod)/kernel.shape[1]))) + columns = v_df.columns + rows = v_df.index + new_xs, new_ys = [], [] + for i in range(st_y_idx, v_df.shape[0]-y_mod, kernel.shape[1]): + for j in range(st_x_idx, v_df.shape[1]-x_mod, kernel.shape[0]): + nvalid[int(i/kernel.shape[1]),int(j/kernel.shape[0])] = np.nanmean(v_df.iloc[i:i+kernel.shape[1],j:j+kernel.shape[0]].to_numpy()) + a[int(i/kernel.shape[1]),int(j/kernel.shape[0])] = np.nanmean(a_df.iloc[i:i+kernel.shape[1],j:j+kernel.shape[0]].to_numpy()) + th[int(i/kernel.shape[1]),int(j/kernel.shape[0])] = self.circular_mean(th_df.iloc[i:i+kernel.shape[1],j:j+kernel.shape[0]].to_numpy()) + cols[int(i/kernel.shape[1]),int(j/kernel.shape[0])] = np.nanmean(col_df.iloc[i:i+kernel.shape[1],j:j+kernel.shape[0]].to_numpy()) + new_xs.append(np.sum(columns[j:j+kernel.shape[0]])/kernel.shape[0]) + new_ys.append(np.sum(rows[i:i+kernel.shape[1]])/kernel.shape[1]) + nvalid = nvalid.flatten() > 0 & ~np.isnan(nvalid.flatten()) + self.a = a.flatten()[nvalid] + self.th = th.flatten()[nvalid] + self.cols = cols.flatten()[nvalid] + self.new_xs = np.asarray(new_xs)[nvalid] + self.new_ys = np.asarray(new_ys)[nvalid] + if self.v_bin_change == 1: + self.v_bin_change = 0 + self.imageplot.update_vectors() + def init_vector_plot(self, data): domain = data.domain if data is not None else None self.vector_opts.set_domain(domain) From 4d6d929292c6d7288fe1507248d026ba1e4bc22c Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Tue, 18 Jun 2024 15:25:41 +1000 Subject: [PATCH 60/93] owhyper: fix an init error and lint errors --- orangecontrib/spectroscopy/widgets/owhyper.py | 104 ++++++++++-------- 1 file changed, 60 insertions(+), 44 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index fa11f61d1..a6230e063 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -777,14 +777,14 @@ def legend_items(self): return [] class VectorPlot(pg.GraphicsObject): - + def __init__(self): pg.GraphicsObject.__init__(self) self.params = None self._maxSpotPxWidth = 0 self._boundingRect = None - + def setData(self, params): self._maxSpotPxWidth = 0 self._boundingRect = None @@ -793,23 +793,25 @@ def setData(self, params): self.prepareGeometryChange() self.informViewBoundsChanged() self.update() - + def viewTransformChanged(self): self.prepareGeometryChange() - + def paint(self, p, option, widget): if self.params is not None: - if type(self.params[3]) == tuple: - path = pg.arrayToQPath(self.params[0], self.params[1], connect = 'pairs', finiteCheck=False) + if isinstance(self.params[3], tuple): + path = pg.arrayToQPath(self.params[0], self.params[1], + connect = 'pairs', finiteCheck=False) pen = QPen(QBrush(QColor(*self.params[3])), self.params[2]) pen.setCosmetic(True) p.setPen(pen) p.drawPath(path) - elif type(self.params[3]) == list: + elif isinstance(self.params[3], list): pen = QPen(QBrush(QColor()), self.params[2]) pen.setCosmetic(True) unique_cols = np.unique(self.params[3][0], return_index=True, axis=0) - irgbx2 = np.hstack((self.params[3][0], self.params[3][0])).reshape(self.params[3][0].shape[0]*2, 4) + irgbx2 = np.hstack((self.params[3][0], + self.params[3][0])).reshape(self.params[3][0].shape[0]*2, 4) for i in unique_cols[0]: path = pg.arrayToQPath(self.params[0][np.where(irgbx2[:,0] == i[0])], self.params[1][np.where(irgbx2[:,0] == i[0])], @@ -1142,8 +1144,8 @@ def update_vectors(self): v_params = [xcurve, ycurve, w, vcols] self.vector_plot.setData(v_params) self.vector_plot.show() - if self.parent.vector_colour_index == 8 and \ - self.parent.vcol_byval_feat is not None: + if self.parent.vector_colour_index == 8 and \ + self.parent.vcol_byval_feat is not None: self.parent.update_vect_legend() @staticmethod @@ -1433,7 +1435,7 @@ def __init__(self): callback=self.update_rgb_value, model=self.rgb_value_model) self.cb_vector = gui.checkBox(rbox, self, "show_vector_plot", label="Show vector plot", - callback=self.enable_vector) + callback=self.enable_vector) splitter = QSplitter(self) splitter.setOrientation(Qt.Vertical) @@ -1517,7 +1519,7 @@ def setup_vector_plot_controls(self): self.vector_col_opts = vector_colour_model(vector_colour) self.vector_pal_opts = color_palette_model(_color_palettes, (QSize(64, 16))) self.vector_bin_opts = vector_colour_model(bins) - + self.vector_angle = None self.vector_magnitude = None self.vcol_byval_feat = None @@ -1534,22 +1536,22 @@ def setup_vector_plot_controls(self): self.v_colour_select = gui.comboBox(self.vectorbox, self, 'vector_colour_index', label="Vector Colour", model=self.vector_col_opts, callback=self._update_vector) - + self.v_colour_byval = gui.comboBox(self.vectorbox, self, 'vcol_byval_feat', - label="Vector Colour by Feature", model=self.vector_opts, - callback=self._update_vector) - + label="Vector Colour by Feature", + model=self.vector_opts, + callback=self._update_cbyval) + self.v_colour_byval_select = gui.comboBox(self.vectorbox, self, 'vcol_byval_index', label="", model = self.vector_pal_opts, - callback=self._update_vector) + callback=self._update_cbyval) self.v_colour_byval_select.setIconSize(QSize(64, 16)) - self.v_colour_byval_select.setEnabled(False) self.v_scale_slider = gui.hSlider(self.vectorbox, self, 'vector_scale', label="Scale", minValue=1, maxValue=1000, step=10, createLabel=False, callback=self._update_vector) - + self.v_width_slider = gui.hSlider(self.vectorbox, self, 'vector_width', label="Width", minValue=1, maxValue=20, step=1, createLabel=False, callback=self._update_vector) @@ -1559,7 +1561,8 @@ def setup_vector_plot_controls(self): callback=self._update_vector) self.v_bin_select = gui.comboBox(self.vectorbox, self, 'v_bin', label = "Pixel Binning", - model = self.vector_bin_opts, callback = self._update_binsize) + model = self.vector_bin_opts, + callback = self._update_binsize) self.enable_vector() @@ -1590,7 +1593,7 @@ def enable_vector(self): def _update_vector(self): self.update_vector_plot_interface() self.imageplot.update_vectors() - + def update_vect_legend(self):#feat if self.v_bin != 0: feat = self.cols @@ -1614,19 +1617,26 @@ def get_vector_data(self): return np.vstack([angs, mags, cols]).T + def _update_cbyval(self): + self.cols = None + self._update_vector() + def get_vector_colour(self, feat): if self.vector_colour_index == 8: - if feat[0] == None: # a feat has not been selected yet + if feat[0] is None: # a feat has not been selected yet return vector_colour[0][1][0] + (self.vector_opacity,) else: if self.v_bin != 0: - self.update_binsize() + if self.cols is None: + self.update_binsize() feat = self.cols fmin, fmax = np.min(feat), np.max(feat) if fmin == fmax: + # put a warning here? return vector_colour[0][1][0] + (self.vector_opacity,) feat_idxs = np.asarray(((feat-fmin)/(fmax-fmin))*255, dtype=int) - col_vals = np.asarray(_color_palettes[self.vcol_byval_index][1][0][feat_idxs], dtype=int) + col_vals = np.asarray(_color_palettes[self.vcol_byval_index][1][0][feat_idxs], + dtype=int) out = [np.hstack((np.expand_dims(feat_idxs, 1), col_vals)), self.vector_opacity] return out @@ -1640,6 +1650,7 @@ def circular_mean(self, degs): def _update_binsize(self): self.v_bin_change = 1 + self.cols = None self.update_binsize() def update_binsize(self): @@ -1662,37 +1673,42 @@ def update_binsize(self): col = np.asarray(v[:,2], dtype=float) y = np.linspace(*lsy)[yindex] x = np.linspace(*lsx)[xindex] - df = pd.DataFrame([x, y, np.asarray([1 if i == True else 0 for i in valid]), v_mag, th, col], - index = ['x', 'y', 'valid', 'v_mag', 'th', 'cols']).T + df = pd.DataFrame( + [x, y, np.asarray([1 if i else 0 for i in valid]),v_mag, th, col], + index = ['x', 'y', 'valid', 'v_mag', 'th', 'cols']).T v_df = df.pivot_table(values = 'valid', columns = 'x', index = 'y', fill_value = 0) a_df = df.pivot_table(values = 'v_mag', columns = 'x', index = 'y') th_df = df.pivot_table(values = 'th', columns = 'x', index = 'y') col_df = df.pivot_table(values = 'cols', columns = 'x', index = 'y') - kernel = np.ones((self.v_bin+1, self.v_bin+1)) - x_mod, y_mod = v_df.shape[1] % kernel.shape[1], v_df.shape[0] % kernel.shape[0] + bin_sz = self.v_bin+1 + x_mod, y_mod = v_df.shape[1] % bin_sz, v_df.shape[0] % bin_sz st_x_idx = int(np.floor(x_mod/2)) st_y_idx = int(np.floor(y_mod/2)) - nvalid = np.zeros((int((v_df.shape[0]-y_mod)/kernel.shape[0]), - int((v_df.shape[1]-x_mod)/kernel.shape[1]))) - a = np.zeros((int((v_df.shape[0]-y_mod)/kernel.shape[0]), - int((v_df.shape[1]-x_mod)/kernel.shape[1]))) - th = np.zeros((int((v_df.shape[0]-y_mod)/kernel.shape[0]), - int((v_df.shape[1]-x_mod)/kernel.shape[1]))) - cols = np.zeros((int((v_df.shape[0]-y_mod)/kernel.shape[0]), - int((v_df.shape[1]-x_mod)/kernel.shape[1]))) + nvalid = np.zeros((int((v_df.shape[0]-y_mod)/bin_sz), + int((v_df.shape[1]-x_mod)/bin_sz))) + a = np.zeros((int((v_df.shape[0]-y_mod)/bin_sz), + int((v_df.shape[1]-x_mod)/bin_sz))) + th = np.zeros((int((v_df.shape[0]-y_mod)/bin_sz), + int((v_df.shape[1]-x_mod)/bin_sz))) + cols = np.zeros((int((v_df.shape[0]-y_mod)/bin_sz), + int((v_df.shape[1]-x_mod)/bin_sz))) columns = v_df.columns rows = v_df.index new_xs, new_ys = [], [] - for i in range(st_y_idx, v_df.shape[0]-y_mod, kernel.shape[1]): - for j in range(st_x_idx, v_df.shape[1]-x_mod, kernel.shape[0]): - nvalid[int(i/kernel.shape[1]),int(j/kernel.shape[0])] = np.nanmean(v_df.iloc[i:i+kernel.shape[1],j:j+kernel.shape[0]].to_numpy()) - a[int(i/kernel.shape[1]),int(j/kernel.shape[0])] = np.nanmean(a_df.iloc[i:i+kernel.shape[1],j:j+kernel.shape[0]].to_numpy()) - th[int(i/kernel.shape[1]),int(j/kernel.shape[0])] = self.circular_mean(th_df.iloc[i:i+kernel.shape[1],j:j+kernel.shape[0]].to_numpy()) - cols[int(i/kernel.shape[1]),int(j/kernel.shape[0])] = np.nanmean(col_df.iloc[i:i+kernel.shape[1],j:j+kernel.shape[0]].to_numpy()) - new_xs.append(np.sum(columns[j:j+kernel.shape[0]])/kernel.shape[0]) - new_ys.append(np.sum(rows[i:i+kernel.shape[1]])/kernel.shape[1]) + for i in range(st_y_idx, v_df.shape[0]-y_mod, bin_sz): + for j in range(st_x_idx, v_df.shape[1]-x_mod, bin_sz): + nvalid[int(i/bin_sz),int(j/bin_sz)] = \ + np.nanmean(v_df.iloc[i:i+bin_sz,j:j+bin_sz].to_numpy()) + a[int(i/bin_sz),int(j/bin_sz)] = \ + np.nanmean(a_df.iloc[i:i+bin_sz,j:j+bin_sz].to_numpy()) + th[int(i/bin_sz),int(j/bin_sz)] = \ + self.circular_mean(th_df.iloc[i:i+bin_sz,j:j+bin_sz].to_numpy()) + cols[int(i/bin_sz),int(j/bin_sz)] = \ + np.nanmean(col_df.iloc[i:i+bin_sz,j:j+bin_sz].to_numpy()) + new_xs.append(np.sum(columns[j:j+bin_sz])/bin_sz) + new_ys.append(np.sum(rows[i:i+bin_sz])/bin_sz) nvalid = nvalid.flatten() > 0 & ~np.isnan(nvalid.flatten()) self.a = a.flatten()[nvalid] self.th = th.flatten()[nvalid] From b521df06685a6455d37128f59ec02f57d36c5751 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Tue, 18 Jun 2024 15:32:08 +1000 Subject: [PATCH 61/93] owhyper: fix vector az and mag not updating when binned --- orangecontrib/spectroscopy/widgets/owhyper.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index a6230e063..e18e79eba 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -1527,11 +1527,11 @@ def setup_vector_plot_controls(self): self.v_angle_select = gui.comboBox(self.vectorbox, self, 'vector_angle', searchable=True, label="Vector Angle", model=self.vector_opts, - callback=self._update_vector) + callback=self._update_vector_params) self.v_mag_select = gui.comboBox(self.vectorbox, self, 'vector_magnitude', searchable=True, label="Vector Magnitude", model=self.vector_opts, - callback=self._update_vector) + callback=self._update_vector_params) self.v_colour_select = gui.comboBox(self.vectorbox, self, 'vector_colour_index', label="Vector Colour", model=self.vector_col_opts, @@ -1617,6 +1617,10 @@ def get_vector_data(self): return np.vstack([angs, mags, cols]).T + def _update_vector_params(self): + self.update_binsize() + self._update_vector() + def _update_cbyval(self): self.cols = None self._update_vector() From feb497d502b75476eb35b5f5b66d96340ab87cf4 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Tue, 18 Jun 2024 16:02:26 +1000 Subject: [PATCH 62/93] owhyper: consistent removal of vector legend --- orangecontrib/spectroscopy/widgets/owhyper.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index e18e79eba..71b717ffb 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -1576,7 +1576,7 @@ def update_vector_plot_interface(self): if self.vector_colour_index == 8: self.v_colour_byval.setEnabled(True) self.v_colour_byval_select.setEnabled(True) - if self.vcol_byval_feat is not None: + if self.vcol_byval_feat is not None and self.show_vector_plot: self.imageplot.vect_legend.setVisible(True) self.imageplot.vect_legend.adapt_to_size() else: @@ -1602,6 +1602,7 @@ def update_vect_legend(self):#feat fmin, fmax = np.min(feat), np.max(feat) self.imageplot.vect_legend.set_range(fmin, fmax) self.imageplot.vect_legend.set_colors(_color_palettes[self.vcol_byval_index][1][0]) + self.imageplot.vect_legend.setVisible(True) self.imageplot.vect_legend.adapt_to_size() def get_vector_data(self): @@ -1726,6 +1727,7 @@ def update_binsize(self): def init_vector_plot(self, data): domain = data.domain if data is not None else None self.vector_opts.set_domain(domain) + self.vector_cbyf_opts.set_domain(domain) # initialize values so that the combo boxes are not in invalid states if self.vector_opts: From 0af0ab64634dd47acb06f7159002136b04067295 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Tue, 18 Jun 2024 16:03:02 +1000 Subject: [PATCH 63/93] owhyper: restrict vector colours to only numeric variables --- orangecontrib/spectroscopy/widgets/owhyper.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 71b717ffb..39e3e1be0 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -1516,6 +1516,10 @@ def setup_vector_plot_controls(self): self.vector_opts = DomainModel(DomainModel.SEPARATED, valid_types=DomainModel.PRIMITIVE, placeholder='None') + + self.vector_cbyf_opts = DomainModel(DomainModel.SEPARATED, + valid_types=(ContinuousVariable,), placeholder='None') + self.vector_col_opts = vector_colour_model(vector_colour) self.vector_pal_opts = color_palette_model(_color_palettes, (QSize(64, 16))) self.vector_bin_opts = vector_colour_model(bins) @@ -1539,7 +1543,7 @@ def setup_vector_plot_controls(self): self.v_colour_byval = gui.comboBox(self.vectorbox, self, 'vcol_byval_feat', label="Vector Colour by Feature", - model=self.vector_opts, + model=self.vector_cbyf_opts, callback=self._update_cbyval) self.v_colour_byval_select = gui.comboBox(self.vectorbox, self, 'vcol_byval_index', From 039444634b1aeccdf625bcfe8b1bf6d0f5616e6b Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:39:33 +1000 Subject: [PATCH 64/93] owhyper: fix plotting already binned vectors Ensures binned values are calculated before calculating values for vector plotting --- orangecontrib/spectroscopy/widgets/owhyper.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 39e3e1be0..d46ef0791 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -1133,6 +1133,8 @@ def update_vectors(self): v_params = [xcurve, ycurve, w, vcols] self.vector_plot.setData(v_params) else: + if self.parent.a is None: + self.parent.update_binsize() amp = self.parent.a / max(self.parent.a) * (scale/100) dispx = amp*wx/2*np.cos(self.parent.th) dispy = amp*wy/2*np.sin(self.parent.th) From 8e30e9ae70fba3f5bc543e03e040915be32b5022 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Wed, 10 Jul 2024 13:46:38 +1000 Subject: [PATCH 65/93] owpolar: correct intensity calculation --- orangecontrib/spectroscopy/widgets/owpolar.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 7531525a9..ed29be319 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -179,9 +179,6 @@ def azimuth_jac(x, a0, a1, a2): def calc_angles(a0,a1): return np.degrees(0.5*np.arctan(a0/a1)) -def ampl1(a0,a1,a2): - return (a2+(math.sqrt(a0**2+a1**2))+a2-(math.sqrt(a0**2+a1**2))) - def ampl2(a0,a1): return (2*(math.sqrt(a0**2+a1**2))) @@ -253,7 +250,7 @@ def compute(xys, yidx, smms, shapes, dtypes, polangles): mod[i,j[0],l,2] = 1-(ss_res/ss_tot) out[i,j[0],l,2] = find_az(vars[0], params) out[i,j[0],l,3] = orfunc(vars[0], *params) - out[i,j[0],l,4] = ampl1(*params) + out[i,j[0],l,4] = params[2] out[i,j[0],l,5] = ampl2(params[0],params[1]) mod[i,j[0],l,3] = params[0] mod[i,j[0],l,4] = params[1] From 0fee2d09b137a0556bbfc7dea585a93c06fb171a Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Wed, 10 Jul 2024 13:51:11 +1000 Subject: [PATCH 66/93] owpolar: visimg merging changes due to pr#726 --- orangecontrib/spectroscopy/widgets/owpolar.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index ed29be319..6620f8d96 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -80,10 +80,8 @@ def combine_visimg(data, polangles): try: temp = i.attributes['visible_images'] for j in temp: - tempname = str(j['name'] + f'({polangles[k]} Degrees)') - dictcopy = j.copy() - dictcopy.update({'name': tempname}) - atts = atts + [dictcopy] + j.name = str(j.name + f' ({polangles[k]} Degrees)') + atts.append(j) except KeyError: pass except AttributeError: @@ -355,7 +353,7 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, a if state.is_interruption_requested(): return None, None, None, None, 2 - + with SharedMemoryManager() as smm: tcvs = smm.SharedMemory(size=cvs.nbytes) scvs = np.ndarray(cvs.shape, dtype=cvs.dtype, buffer=tcvs.buf) @@ -372,7 +370,6 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, a tvars = smm.SharedMemory(size=vars.nbytes) svars = np.ndarray(vars.shape, dtype=vars.dtype, buffer=tvars.buf) svars[:] = vars[:] - svars[:] = vars[:] # vars[1] == 0 -> continue processing, vars[1] == 1 -> data is incompatible, vars[1] == 2 -> interruption requested smms = [tcvs, None, None, tout, tmod, tcoords, tvars] shapes = [cvs.shape, spec.shape, metas.shape, out.shape, mod.shape, coords.shape, vars.shape] From a2d27ce1f402527e186be7a7644dae3dbcfdb808 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Fri, 25 Oct 2024 12:07:26 +1100 Subject: [PATCH 67/93] owhyper: add colorbar labelling --- orangecontrib/spectroscopy/widgets/owhyper.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index d46ef0791..bbbbc5e58 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -743,6 +743,16 @@ def update_rect(self): class ImageParameterSetter(CommonParameterSetter): IMAGE_ANNOT_BOX = "Image annotations" + BKG_CBAR = "Colorbar" + VECT_CBAR = "Vector Colorbar" + + def update_cbar_label(self, **settings): + self.colorbar.setLabel(settings[self.TITLE_LABEL]) + self.colorbar.resizeEvent(None) + + def update_vcbar_label(self, **settings): + self.vcolorbar.setLabel(settings[self.TITLE_LABEL]) + self.vcolorbar.resizeEvent(None) def __init__(self, master): super().__init__() @@ -754,10 +764,16 @@ def update_setters(self): self.TITLE_LABEL: {self.TITLE_LABEL: ("", "")}, self.X_AXIS_LABEL: {self.TITLE_LABEL: ("", "")}, self.Y_AXIS_LABEL: {self.TITLE_LABEL: ("", "")}, + self.BKG_CBAR: {self.TITLE_LABEL: ("", "")}, + self.VECT_CBAR: {self.TITLE_LABEL: ("", "")}, }, } self._setters[self.IMAGE_ANNOT_BOX] = self._setters[self.ANNOT_BOX] + self._setters[self.IMAGE_ANNOT_BOX].update({ + self.BKG_CBAR: self.update_cbar_label, + self.VECT_CBAR: self.update_vcbar_label, + }) @property def title_item(self): @@ -776,6 +792,14 @@ def getAxis(self): def legend_items(self): return [] + @property + def colorbar(self): + return self.master.legend.axis + + @property + def vcolorbar(self): + return self.master.vect_legend.axis + class VectorPlot(pg.GraphicsObject): def __init__(self): From 1382a537b8b5f638d05034e7bc34a4cd72bfaeb8 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:04:41 +1100 Subject: [PATCH 68/93] oowhyper: prevent binning pixels large than image --- orangecontrib/spectroscopy/widgets/owhyper.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index bbbbc5e58..52136b458 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -1365,6 +1365,7 @@ class Outputs(SelectionOutputsMixin.Outputs): class Warning(OWWidget.Warning): threshold_error = Msg("Low slider should be less than High") + bin_size_error = Msg("Selected bin size larger than image size, bin size {} x {} used") class Error(OWWidget.Error): image_too_big = Msg("Image for chosen features is too big ({} x {}).") @@ -1689,6 +1690,7 @@ def _update_binsize(self): self.update_binsize() def update_binsize(self): + self.Warning.bin_size_error.clear() if self.v_bin == 0: self.v_bin_change = 0 self.imageplot.update_vectors() @@ -1717,6 +1719,9 @@ def update_binsize(self): th_df = df.pivot_table(values = 'th', columns = 'x', index = 'y') col_df = df.pivot_table(values = 'cols', columns = 'x', index = 'y') bin_sz = self.v_bin+1 + if bin_sz > v_df.shape[0] or bin_sz > v_df.shape[1]: + bin_sz = v_df.shape[0] if bin_sz > v_df.shape[0] else v_df.shape[1] + self.Warning.bin_size_error(bin_sz, bin_sz) x_mod, y_mod = v_df.shape[1] % bin_sz, v_df.shape[0] % bin_sz st_x_idx = int(np.floor(x_mod/2)) st_y_idx = int(np.floor(y_mod/2)) From 124a5d9a49fe629ea174e0b0f9d1324834b49a5b Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:47:00 +1100 Subject: [PATCH 69/93] polar data: update test data test data updated to account for different intensity calculation --- .../4-angle-ftir_multifile_model-results.tab | 38 +++++++++---------- .../4-angle-ftir_multifile_polar-results.tab | 38 +++++++++---------- .../4-angle-ftir_multiin_model-results.tab | 38 +++++++++---------- .../4-angle-ftir_multiin_polar-results.tab | 38 +++++++++---------- 4 files changed, 76 insertions(+), 76 deletions(-) diff --git a/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile_model-results.tab b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile_model-results.tab index d040448fd..335a00af0 100644 --- a/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile_model-results.tab +++ b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile_model-results.tab @@ -1,19 +1,19 @@ -1697.131066748047 1693.2739506872558 1689.416834626465 1685.5597185656738 1681.702602504883 1677.8454864440919 1673.9883703833011 1670.13125432251 1666.2741382617191 1662.417022200928 1658.5599061401367 1654.702790079346 1650.8456740185547 1646.988557957764 1643.1314418969728 1639.274325836182 1635.4172097753908 1631.5600937145996 1627.7029776538088 1623.8458615930176 1619.9887455322269 1616.1316294714356 1612.2745134106449 1608.4173973498537 1604.5602812890625 1600.7031652282717 1596.8460491674805 1592.9889331066897 1589.1318170458985 1585.2747009851078 1581.4175849243165 1577.5604688635258 1573.7033528027346 1569.8462367419434 1565.9891206811526 1562.1320046203614 1558.2748885595706 1554.4177724987794 1550.5606564379887 1546.7035403771974 1542.8464243164062 1538.9893082556155 1535.1321921948243 1531.2750761340335 1527.4179600732423 1523.5608440124515 1519.7037279516603 1515.846611890869 1511.9894958300783 1508.1323797692871 1504.2752637084964 1500.4181476477052 1496.5610315869144 1492.7039155261232 1488.8467994653324 1484.9896834045412 1481.13256734375 1477.2754512829592 1473.418335222168 1469.5612191613773 1465.704103100586 1461.8469870397953 1457.989870979004 1454.1327549182129 1450.275638857422 1446.418522796631 1442.5614067358401 1438.704290675049 1434.8471746142582 1430.990058553467 1427.1329424926757 1423.275826431885 1419.4187103710938 1415.561594310303 1411.7044782495118 1407.847362188721 1403.9902461279298 1400.133130067139 1396.2760140063479 1392.4188979455566 1388.5617818847659 1384.7046658239747 1380.847549763184 1376.9904337023927 1373.133317641602 1369.2762015808107 1365.4190855200195 1361.5619694592287 1357.7048533984375 1353.8477373376468 1349.9906212768556 1346.1335052160648 1342.2763891552736 1338.4192730944824 1334.5621570336916 1330.7050409729004 1326.8479249121096 1322.9908088513184 1319.1336927905277 1315.2765767297365 1311.4194606689457 1307.5623446081545 1303.7052285473633 1299.8481124865725 1295.9909964257813 1292.1338803649905 1288.2767643041993 1284.4196482434086 1280.5625321826174 1276.7054161218261 1272.8483000610354 1268.9911840002442 1265.1340679394534 1261.2769518786622 1257.4198358178714 1253.5627197570802 1249.705603696289 1245.8484876354983 1241.991371574707 1238.1342555139163 1234.277139453125 1230.4200233923343 1226.562907331543 1222.7057912707523 1218.8486752099611 1214.99155914917 1211.1344430883792 1207.277327027588 1203.4202109667972 map_x map_y Filename 1214.0 - 1258.0 1500.0 - 1580.0 Polarisation Angle R-squared (1214.0 - 1258.0) a0 (1214.0 - 1258.0) a1 (1214.0 - 1258.0) a2 (1214.0 - 1258.0) R-squared (1500.0 - 1580.0) a0 (1500.0 - 1580.0) a1 (1500.0 - 1580.0) a2 (1500.0 - 1580.0) -continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous F:/DATA/0deg F:/DATA/45deg F:/DATA/90deg F:/DATA/135deg continuous continuous 0.0\ Degrees 45.0\ Degrees 90.0\ Degrees 135.0\ Degrees continuous continuous continuous continuous continuous continuous continuous continuous - meta meta meta meta meta meta meta meta meta meta meta meta meta meta -0.3711118698120117 0.43782272934913635 0.49062955379486084 0.5547452569007874 0.6374028921127319 0.711500346660614 0.7876919507980347 0.8770861625671387 0.9559172987937927 1.0098530054092407 1.0404753684997559 1.0543735027313232 1.0619465112686157 1.0437582731246948 1.0013220310211182 0.9536964297294617 0.897933840751648 0.8533709645271301 0.8181004524230957 0.7584443688392639 0.6689296364784241 0.5782220363616943 0.513115644454956 0.46961721777915955 0.43171659111976624 0.3991532325744629 0.3810955286026001 0.37965840101242065 0.386007159948349 0.3947145342826843 0.4098324477672577 0.4343760311603546 0.46137940883636475 0.49168214201927185 0.528336226940155 0.5667646527290344 0.6178287267684937 0.6604256629943848 0.6766932010650635 0.6885275840759277 0.6986993551254272 0.6930281519889832 0.6724157929420471 0.6501829028129578 0.6263569593429565 0.5885990858078003 0.5376056432723999 0.5005533695220947 0.4779326319694519 0.4443279504776001 0.39699268341064453 0.36137861013412476 0.33436083793640137 0.30747178196907043 0.2803654670715332 0.2625480592250824 0.2592535614967346 0.27015992999076843 0.29309216141700745 0.31150364875793457 0.3194276988506317 0.328142374753952 0.3443129062652588 0.35353028774261475 0.3476772606372833 0.33774372935295105 0.32855379581451416 0.3200712502002716 0.31163617968559265 0.3032289445400238 0.2943628430366516 0.28816357254981995 0.2909632623195648 0.29872336983680725 0.3025616407394409 0.3057458698749542 0.3115512728691101 0.31618112325668335 0.3176253139972687 0.3175846040248871 0.3153497576713562 0.3088831901550293 0.3000914454460144 0.29377707839012146 0.2888909578323364 0.28027477860450745 0.270122230052948 0.26286780834198 0.2575746774673462 0.2533765435218811 0.2540722191333771 0.26083439588546753 0.2694004774093628 0.27414125204086304 0.2728372812271118 0.26937466859817505 0.2672775387763977 0.2684006989002228 0.2723020315170288 0.27508431673049927 0.2749064266681671 0.274681955575943 0.2775912284851074 0.28367695212364197 0.2893185019493103 0.290900319814682 0.2906703054904938 0.2926110625267029 0.2950325608253479 0.2977401614189148 0.3037301301956177 0.3114270567893982 0.318378210067749 0.32530495524406433 0.3349395990371704 0.3490666151046753 0.3638021945953369 0.3744945526123047 0.3803212642669678 0.3803481459617615 0.37394478917121887 0.3625723719596863 0.34696418046951294 0.3287803828716278 0.31259098649024963 0.3022864758968353 0.2975075840950012 0.2938818633556366 0.2872605323791504 30442.5687 41538.7379 F:/DATA/0deg 15.009961445779307 43.87936019111817 0.0 Degrees 0.9998996542510169 0.04788184003105633 -0.0930766425798808 15.10229663993498 0.4761749412326489 0.1699951093342037 0.198482528841064 43.874691613741085 -0.388348788022995 0.44867801666259766 0.502106249332428 0.5762503743171692 0.6664558053016663 0.739630937576294 0.8222108483314514 0.9173783659934998 0.9785887002944946 1.0107851028442383 1.0361779928207397 1.0637257099151611 1.0711760520935059 1.0423812866210938 1.025393009185791 0.9986843466758728 0.9373337626457214 0.8785869479179382 0.8271448612213135 0.7655133605003357 0.6908860802650452 0.6117749810218811 0.5471857190132141 0.4971246123313904 0.45541316270828247 0.42525458335876465 0.4062337279319763 0.39754077792167664 0.39981767535209656 0.41045162081718445 0.42612242698669434 0.4495392143726349 0.48013657331466675 0.509360134601593 0.5352477431297302 0.5706249475479126 0.6430520415306091 0.7104148864746094 0.7287077903747559 0.7300795912742615 0.7207353115081787 0.6928030848503113 0.6642997860908508 0.6465807557106018 0.6357985734939575 0.6169293522834778 0.5714240670204163 0.5247028470039368 0.49503496289253235 0.4588204622268677 0.41067439317703247 0.37448638677597046 0.34704023599624634 0.32218214869499207 0.29583585262298584 0.27490201592445374 0.26934197545051575 0.28096309304237366 0.3069058060646057 0.3270772397518158 0.33470597863197327 0.34152284264564514 0.35194724798202515 0.3573232889175415 0.3541431128978729 0.34866204857826233 0.3427005112171173 0.3312859833240509 0.3122206926345825 0.2955722510814667 0.2872144877910614 0.2867285907268524 0.2918354272842407 0.2956002652645111 0.2986833155155182 0.3060479462146759 0.31676867604255676 0.3262639045715332 0.330106645822525 0.32593291997909546 0.31699928641319275 0.30795541405677795 0.3018266558647156 0.29686442017555237 0.28721868991851807 0.2752007842063904 0.2667289972305298 0.2609139084815979 0.25778260827064514 0.2584190368652344 0.2610763907432556 0.2639258801937103 0.26595649123191833 0.26701226830482483 0.2679225206375122 0.2679891288280487 0.2669326663017273 0.2678163945674896 0.2720436155796051 0.2770630121231079 0.28001782298088074 0.27851158380508423 0.2751752436161041 0.276258647441864 0.2823660373687744 0.2899717390537262 0.29827389121055603 0.30697736144065857 0.3102128207683563 0.30654236674308777 0.30582261085510254 0.3128655254840851 0.3222534656524658 0.32939496636390686 0.33602944016456604 0.34821176528930664 0.3637096881866455 0.37178686261177063 0.3715791702270508 0.37046146392822266 0.36934414505958557 0.36342424154281616 0.350017786026001 0.33207470178604126 0.3140036165714264 0.2998875081539154 0.29220956563949585 0.2874009907245636 0.2815419137477875 30445.38885 41538.7379 F:/DATA/0deg 14.936959331411803 45.349811063094954 0.0 Degrees 0.9324530395726834 0.11528954707161643 -0.3900859865428774 15.249631354870715 0.36275784996581106 0.671080814707999 -0.43318106508974763 45.03441323505067 -0.366887629032135 0.43671754002571106 0.49220016598701477 0.5703327059745789 0.6657547950744629 0.731933057308197 0.7937033176422119 0.8747525215148926 0.9398021697998047 0.9730452299118042 1.0031681060791016 1.0538406372070312 1.0965853929519653 1.0494016408920288 0.9825043678283691 0.9511120319366455 0.9302560687065125 0.8842418789863586 0.8129315972328186 0.7183979153633118 0.6205475330352783 0.5415375232696533 0.48775240778923035 0.44761666655540466 0.41458284854888916 0.39335882663726807 0.3796997666358948 0.36864838004112244 0.36498430371284485 0.3680277466773987 0.3732655644416809 0.38918817043304443 0.42386338114738464 0.46311137080192566 0.4917769134044647 0.5237820148468018 0.5971131920814514 0.6691277027130127 0.6892750859260559 0.7003340125083923 0.7168111801147461 0.6999649405479431 0.6541981101036072 0.6189929246902466 0.5926592946052551 0.5696735382080078 0.5413363575935364 0.5053853988647461 0.465243935585022 0.41113007068634033 0.36086025834083557 0.32808783650398254 0.3003191649913788 0.2793380916118622 0.26471295952796936 0.2541550099849701 0.24993854761123657 0.25305330753326416 0.2655698359012604 0.27899375557899475 0.2841063439846039 0.28888702392578125 0.30285078287124634 0.3161625862121582 0.3197145164012909 0.3178388774394989 0.31100529432296753 0.29754751920700073 0.28191861510276794 0.2750825583934784 0.27559351921081543 0.27823397517204285 0.2830919921398163 0.2850538194179535 0.2825995981693268 0.28359857201576233 0.2883332371711731 0.289949893951416 0.2929544150829315 0.30135759711265564 0.30265331268310547 0.2906714677810669 0.2753030061721802 0.2651992440223694 0.25924843549728394 0.25318726897239685 0.24550479650497437 0.23828820884227753 0.23315896093845367 0.23029816150665283 0.2334306240081787 0.24293583631515503 0.2510787546634674 0.25073981285095215 0.24615781009197235 0.2464907467365265 0.2522513270378113 0.2587389051914215 0.262591689825058 0.263126403093338 0.26156532764434814 0.2589862048625946 0.2572213411331177 0.2594248950481415 0.2655974328517914 0.27193424105644226 0.27772676944732666 0.28423818945884705 0.28888431191444397 0.29118603467941284 0.2921951413154602 0.29164180159568787 0.2948339283466339 0.3066503405570984 0.32164159417152405 0.333238422870636 0.34339842200279236 0.355623722076416 0.36564287543296814 0.36494630575180054 0.35201695561408997 0.3341171145439148 0.3175579309463501 0.30399125814437866 0.2928829789161682 0.28347793221473694 0.2780621647834778 0.276618093252182 0.27352389693260193 30442.5687 41541.616519999996 F:/DATA/0deg 14.140093941838566 42.63377488797279 0.0 Degrees 0.9052486894719146 0.23198983049333044 -0.12072690257494645 14.320648710203532 0.5510780301748821 0.5808993859007311 0.3024109496913203 41.91339873814995 -0.36428871750831604 0.43003931641578674 0.47958770394325256 0.5450240969657898 0.634536862373352 0.7099695801734924 0.7796786427497864 0.8637834787368774 0.942089855670929 0.9903811812400818 1.0105667114257812 1.0208871364593506 1.005222201347351 0.963545024394989 0.9371297359466553 0.9139838814735413 0.8946059942245483 0.8827653527259827 0.840722918510437 0.7564958333969116 0.6611053943634033 0.5774503946304321 0.5202354192733765 0.48433250188827515 0.45376747846603394 0.4260224401950836 0.4059300422668457 0.3930695950984955 0.38632991909980774 0.3889123797416687 0.4001465141773224 0.4183931052684784 0.4428093135356903 0.47215187549591064 0.5050704479217529 0.5453080534934998 0.6085248589515686 0.658994734287262 0.668915331363678 0.6675289869308472 0.6717699766159058 0.6808158755302429 0.6681414842605591 0.6372467875480652 0.6000738739967346 0.5683797597885132 0.544323742389679 0.516345202922821 0.48224183917045593 0.4387160539627075 0.39499184489250183 0.3595888912677765 0.3304763436317444 0.3092094361782074 0.28860795497894287 0.26972246170043945 0.2605076730251312 0.26343077421188354 0.28140151500701904 0.29994896054267883 0.30823972821235657 0.31485551595687866 0.32437241077423096 0.33080095052719116 0.3303925395011902 0.3248642385005951 0.3165438175201416 0.3061983585357666 0.2946605384349823 0.2872968912124634 0.2868692874908447 0.2896806299686432 0.2909656763076782 0.2920180857181549 0.2945660948753357 0.2972028851509094 0.29964983463287354 0.3004482090473175 0.29766783118247986 0.2939799129962921 0.2927486002445221 0.2923987805843353 0.2889113426208496 0.2816716730594635 0.27281782031059265 0.2626931965351105 0.2514967918395996 0.24271203577518463 0.23827271163463593 0.23637256026268005 0.2380509227514267 0.24506837129592896 0.25348952412605286 0.25623422861099243 0.25412917137145996 0.2532842457294464 0.2547925114631653 0.2577175199985504 0.26068350672721863 0.2616606056690216 0.2597542703151703 0.2559884488582611 0.2536808252334595 0.256541907787323 0.2641761898994446 0.271513968706131 0.2755036950111389 0.27728980779647827 0.27779620885849 0.27858373522758484 0.28195881843566895 0.28836870193481445 0.29790475964546204 0.3091188371181488 0.317819207906723 0.3241935074329376 0.33264613151550293 0.3433806300163269 0.3505949378013611 0.35062962770462036 0.34647127985954285 0.3387751281261444 0.32535696029663086 0.3086860477924347 0.2940033972263336 0.2858646810054779 0.2827148139476776 0.2769644856452942 0.26818761229515076 30445.38885 41541.616519999996 F:/DATA/0deg 13.949567230311496 43.05058779046659 0.0 Degrees 0.9941901147353087 0.2536980425498405 -0.46382002276927525 14.441964377513065 0.1657092533769018 0.03694686596283513 -0.5203849464554426 42.743246117510395 -0.3773364722728729 0.43966636061668396 0.49002042412757874 0.5639562606811523 0.6609355807304382 0.7364853620529175 0.8136956691741943 0.8985644578933716 0.9468745589256287 0.9731678366661072 0.9914941191673279 0.9854417443275452 0.9628058671951294 0.9528713226318359 0.9546505808830261 0.9532977342605591 0.9257292151451111 0.8693946599960327 0.8010186553001404 0.7217180728912354 0.6436004638671875 0.5754334926605225 0.5214712619781494 0.47915247082710266 0.4447232484817505 0.41765138506889343 0.3990515470504761 0.39321616291999817 0.39747321605682373 0.40612584352493286 0.4184291958808899 0.43992483615875244 0.47834911942481995 0.5266345739364624 0.5672381520271301 0.597634494304657 0.6348262429237366 0.6744903922080994 0.6967960000038147 0.7098262310028076 0.7118614912033081 0.6856943368911743 0.6489338874816895 0.6190053224563599 0.5941586494445801 0.5711410641670227 0.5421783328056335 0.5111346244812012 0.4810764491558075 0.4355677664279938 0.3860788941383362 0.3534643054008484 0.32750168442726135 0.3032616674900055 0.2819446921348572 0.26981374621391296 0.2693929970264435 0.2801830768585205 0.30366891622543335 0.3256083130836487 0.3365386128425598 0.34310561418533325 0.35129883885383606 0.3588528633117676 0.35683950781822205 0.3458286225795746 0.33076736330986023 0.31613433361053467 0.30460110306739807 0.2960743308067322 0.2915134131908417 0.29322516918182373 0.2980576753616333 0.300569623708725 0.3029937744140625 0.3091799318790436 0.3191257119178772 0.32923704385757446 0.3315645456314087 0.3225858509540558 0.31236401200294495 0.3056598901748657 0.2981754243373871 0.2894536256790161 0.2814278304576874 0.2723696827888489 0.26151928305625916 0.2525339126586914 0.25026053190231323 0.2539668083190918 0.25997182726860046 0.26598429679870605 0.27031874656677246 0.27086934447288513 0.2690020799636841 0.26832443475723267 0.2695266008377075 0.2705895006656647 0.2702696919441223 0.27155083417892456 0.2761310338973999 0.28070759773254395 0.2832408547401428 0.2835163474082947 0.28365248441696167 0.2872329354286194 0.29273301362991333 0.29702767729759216 0.2998993694782257 0.30078554153442383 0.3016831874847412 0.30665796995162964 0.31462526321411133 0.32313990592956543 0.3358403742313385 0.3547256886959076 0.3718043267726898 0.3799355626106262 0.3825741112232208 0.383433073759079 0.3778041899204254 0.3644450008869171 0.3474675118923187 0.3291182518005371 0.3145691752433777 0.3077240586280823 0.3049233853816986 0.3022094964981079 0.2970089614391327 30442.5687 41538.7379 F:/DATA/45deg 15.14943703154183 44.23850067435577 45.0 Degrees 0.9998996542510169 0.04788184003105633 -0.0930766425798808 15.10229663993498 0.4761749412326489 0.1699951093342037 0.198482528841064 43.874691613741085 -0.37337228655815125 0.4396507143974304 0.49107563495635986 0.5586245059967041 0.646790623664856 0.7179062962532043 0.7848191857337952 0.8587467670440674 0.9132012128829956 0.9501560926437378 0.9785140156745911 0.984795868396759 0.9518576860427856 0.9169514179229736 0.9128903150558472 0.9190047979354858 0.9011522531509399 0.8552564978599548 0.7962431311607361 0.7195406556129456 0.6405887007713318 0.5768947005271912 0.5284963250160217 0.48475223779678345 0.44452735781669617 0.4175184965133667 0.4050688147544861 0.4015383720397949 0.4035366475582123 0.4095524847507477 0.41840967535972595 0.43762996792793274 0.4735090136528015 0.5144422650337219 0.5498296618461609 0.5891739130020142 0.6544406414031982 0.7074301838874817 0.721211850643158 0.7253494262695312 0.7205705046653748 0.7011243104934692 0.6794993877410889 0.6561350226402283 0.6234012842178345 0.5791003108024597 0.5371192693710327 0.5127407312393188 0.48728594183921814 0.43710267543792725 0.3880417048931122 0.358508825302124 0.3291686475276947 0.30198532342910767 0.2838975191116333 0.2756803035736084 0.27510562539100647 0.28265753388404846 0.30272212624549866 0.3223998248577118 0.3314470052719116 0.3400789797306061 0.3539663255214691 0.3615642189979553 0.35621216893196106 0.34422820806503296 0.33036601543426514 0.3164904713630676 0.30386441946029663 0.29513826966285706 0.2911766767501831 0.2941439151763916 0.302760511636734 0.30998602509498596 0.31750985980033875 0.32691699266433716 0.33109205961227417 0.3281230330467224 0.32525792717933655 0.32315510511398315 0.3174678683280945 0.31104981899261475 0.3055250942707062 0.297789067029953 0.28920844197273254 0.28300905227661133 0.27708175778388977 0.27133673429489136 0.26787322759628296 0.2659844756126404 0.26673445105552673 0.2708447575569153 0.2750791013240814 0.2769821286201477 0.2775936722755432 0.278523713350296 0.2802591919898987 0.2821207642555237 0.282520055770874 0.28267189860343933 0.2840110957622528 0.28552529215812683 0.28797078132629395 0.2903944253921509 0.29174160957336426 0.2954663932323456 0.30151888728141785 0.30476686358451843 0.30412399768829346 0.30343693494796753 0.30575087666511536 0.31121543049812317 0.3187049329280853 0.3290562331676483 0.3425249457359314 0.3562610149383545 0.36918962001800537 0.3792024254798889 0.3837013840675354 0.3848077654838562 0.3821556568145752 0.3716545104980469 0.3544897437095642 0.33635222911834717 0.3203563988208771 0.30804407596588135 0.3005572259426117 0.2961486577987671 0.29254403710365295 30445.38885 41538.7379 F:/DATA/45deg 15.287506938801155 44.956915156436416 45.0 Degrees 0.9324530395726834 0.11528954707161643 -0.3900859865428774 15.249631354870715 0.36275784996581106 0.671080814707999 -0.43318106508974763 45.03441323505067 -0.38911929726600647 0.44554373621940613 0.4855414927005768 0.5539154410362244 0.6538650989532471 0.7315957546234131 0.8033648729324341 0.884945809841156 0.9360079765319824 0.954917311668396 0.9649530649185181 0.9849116206169128 1.008013129234314 0.9807816743850708 0.9428510069847107 0.9156916737556458 0.8764055967330933 0.825237512588501 0.7735792994499207 0.705725371837616 0.6241020560264587 0.5504984855651855 0.4957604706287384 0.45222288370132446 0.41255465149879456 0.3828220069408417 0.37051448225975037 0.37108558416366577 0.37338513135910034 0.37661170959472656 0.3874439001083374 0.41331085562705994 0.449747771024704 0.47858643531799316 0.4993457794189453 0.5276702642440796 0.5828417539596558 0.6414362788200378 0.6703454852104187 0.6750879287719727 0.6613235473632812 0.6516115069389343 0.6429095268249512 0.6263266801834106 0.6048684120178223 0.5731279253959656 0.5306711196899414 0.492236465215683 0.45757782459259033 0.40995675325393677 0.3611593246459961 0.33053696155548096 0.3058626651763916 0.2824017405509949 0.2620924711227417 0.24882546067237854 0.24321754276752472 0.24622128903865814 0.2659408152103424 0.29050007462501526 0.3000190854072571 0.30213284492492676 0.3106580674648285 0.3247032165527344 0.3296380937099457 0.3233187794685364 0.3104628324508667 0.29432252049446106 0.2806641161441803 0.2753435969352722 0.2728271782398224 0.270643025636673 0.2736828327178955 0.2805771827697754 0.28472232818603516 0.2870364487171173 0.2909660339355469 0.29421940445899963 0.2940268814563751 0.29415833950042725 0.2929386496543884 0.2845102548599243 0.27148693799972534 0.26009973883628845 0.25316986441612244 0.25014013051986694 0.24763965606689453 0.24328280985355377 0.24036899209022522 0.2429419606924057 0.24842298030853271 0.25228366255760193 0.25561103224754333 0.25914180278778076 0.25783947110176086 0.253574401140213 0.2532463073730469 0.25550371408462524 0.2551080286502838 0.2552626430988312 0.2603242099285126 0.2648930549621582 0.26599374413490295 0.26791733503341675 0.27033597230911255 0.27200937271118164 0.27633726596832275 0.281934916973114 0.28416839241981506 0.2850780189037323 0.28886574506759644 0.29535502195358276 0.30392923951148987 0.3146568834781647 0.3258497714996338 0.3378189206123352 0.3510323464870453 0.3626718819141388 0.3707166612148285 0.37344253063201904 0.3687247931957245 0.3559401333332062 0.336141973733902 0.31635063886642456 0.30404531955718994 0.2972669005393982 0.29117393493652344 0.28547903895378113 0.2802625894546509 30442.5687 41541.616519999996 F:/DATA/45deg 14.612466406432896 42.07633292374312 45.0 Degrees 0.9052486894719146 0.23198983049333044 -0.12072690257494645 14.320648710203532 0.5510780301748821 0.5808993859007311 0.3024109496913203 41.91339873814995 -0.34738847613334656 0.4179860055446625 0.4664291739463806 0.5296632647514343 0.6272340416908264 0.7056167125701904 0.7561516165733337 0.8085007667541504 0.8644552826881409 0.9050332307815552 0.9181493520736694 0.9111636281013489 0.9073537588119507 0.9109403491020203 0.9062535762786865 0.8872991800308228 0.8642696738243103 0.8446381688117981 0.8067254424095154 0.7335556745529175 0.6443662047386169 0.5644205808639526 0.506117045879364 0.467324823141098 0.43990078568458557 0.4194169044494629 0.4045620858669281 0.39635950326919556 0.3957340121269226 0.40181082487106323 0.4117859899997711 0.4274001121520996 0.4520021080970764 0.48187950253486633 0.5073687434196472 0.5298813581466675 0.5784440636634827 0.6448124051094055 0.6777898669242859 0.6767211556434631 0.648645281791687 0.6306580901145935 0.6294295191764832 0.6141109466552734 0.586581289768219 0.5592874884605408 0.5341745018959045 0.5011913180351257 0.4583965539932251 0.4066646993160248 0.3704123795032501 0.3489791750907898 0.3235110640525818 0.29798153042793274 0.2787266969680786 0.26791489124298096 0.2635549306869507 0.2648940086364746 0.2800384759902954 0.30330970883369446 0.3163895010948181 0.31783244013786316 0.3187214732170105 0.3288123607635498 0.33496859669685364 0.3315340280532837 0.32235997915267944 0.30760458111763 0.289726585149765 0.27839016914367676 0.2739510238170624 0.272896945476532 0.27768412232398987 0.286607027053833 0.29376494884490967 0.30020976066589355 0.3059932589530945 0.30805355310440063 0.3080996572971344 0.30983278155326843 0.30988332629203796 0.3039196729660034 0.29341766238212585 0.28149351477622986 0.2707284390926361 0.2622477412223816 0.25400418043136597 0.2478829324245453 0.2490083873271942 0.2554311156272888 0.26148200035095215 0.26385727524757385 0.26382210850715637 0.26387882232666016 0.26245152950286865 0.26000332832336426 0.2600518763065338 0.2617824673652649 0.26309698820114136 0.26552656292915344 0.2700032591819763 0.2736172676086426 0.2747006118297577 0.2754264175891876 0.2767968773841858 0.2779064476490021 0.279891699552536 0.284357488155365 0.28945451974868774 0.2933834195137024 0.2966553568840027 0.2989789843559265 0.30280598998069763 0.31150293350219727 0.32365909218788147 0.33813759684562683 0.35394054651260376 0.3676077127456665 0.376840740442276 0.3798968195915222 0.37367281317710876 0.3576556146144867 0.3369816541671753 0.31849825382232666 0.30471497774124146 0.29529136419296265 0.2896086275577545 0.2846777141094208 0.2775256037712097 30445.38885 41541.616519999996 F:/DATA/45deg 14.724239544441382 41.95246636406159 45.0 Degrees 0.9941901147353087 0.2536980425498405 -0.46382002276927525 14.441964377513065 0.1657092533769018 0.03694686596283513 -0.5203849464554426 42.743246117510395 -0.36890196800231934 0.4383719861507416 0.49215278029441833 0.5678848028182983 0.6697624325752258 0.7421551942825317 0.7949410080909729 0.861175537109375 0.9304823279380798 0.9888854622840881 1.0296154022216797 1.0200906991958618 0.9658761620521545 0.9375912547111511 0.9355541467666626 0.9351963996887207 0.9119044542312622 0.8633236289024353 0.8102912902832031 0.7478935718536377 0.6693353056907654 0.5896985530853271 0.5278323888778687 0.47969499230384827 0.4415580630302429 0.4171638786792755 0.40274444222450256 0.3934766352176666 0.3904435634613037 0.39783647656440735 0.41653168201446533 0.4471336603164673 0.4835716187953949 0.5180643796920776 0.5542099475860596 0.5966129302978516 0.6491007804870605 0.6811864972114563 0.6899703741073608 0.6939358711242676 0.6857684850692749 0.6570229530334473 0.6270668506622314 0.6001116633415222 0.5694991946220398 0.5400396585464478 0.5212351679801941 0.5054466128349304 0.4800109267234802 0.4332926869392395 0.38531044125556946 0.35653600096702576 0.33400747179985046 0.3157062530517578 0.3017118573188782 0.29292401671409607 0.2914346158504486 0.2968195676803589 0.3123685419559479 0.3298073410987854 0.3378491699695587 0.3447093665599823 0.35713934898376465 0.36121153831481934 0.354942262172699 0.35000061988830566 0.34591320157051086 0.3377359211444855 0.32351627945899963 0.3089088499546051 0.299715518951416 0.29520851373672485 0.29720360040664673 0.3091683089733124 0.3235648274421692 0.3309069871902466 0.3311137557029724 0.3341479003429413 0.3409155011177063 0.3392958343029022 0.32886332273483276 0.318060964345932 0.31203606724739075 0.30700525641441345 0.2969604432582855 0.2861284911632538 0.2785927355289459 0.27391406893730164 0.2739171087741852 0.27796828746795654 0.2818444073200226 0.28413259983062744 0.28639599680900574 0.28605619072914124 0.28013235330581665 0.27383479475975037 0.27307555079460144 0.27768054604530334 0.2847695052623749 0.29085657000541687 0.28964218497276306 0.2820451259613037 0.2783108055591583 0.28211650252342224 0.28757697343826294 0.2919096350669861 0.2974321246147156 0.30412620306015015 0.3101852238178253 0.31293031573295593 0.31173041462898254 0.31200647354125977 0.31643787026405334 0.3226405680179596 0.33135539293289185 0.3442952632904053 0.3607310354709625 0.37769126892089844 0.38771292567253113 0.3854190707206726 0.37552234530448914 0.36437416076660156 0.35301434993743896 0.34029337763786316 0.3268333971500397 0.31639185547828674 0.31317082047462463 0.31620898842811584 0.31643491983413696 30442.5687 41538.7379 F:/DATA/90deg 15.196114730939069 43.482395133432554 90.0 Degrees 0.9998996542510169 0.04788184003105633 -0.0930766425798808 15.10229663993498 0.4761749412326489 0.1699951093342037 0.198482528841064 43.874691613741085 -0.37875914573669434 0.4469207227230072 0.49604201316833496 0.5680999159812927 0.6705905199050903 0.7483171224594116 0.80452561378479 0.8658115863800049 0.9279407262802124 0.9807824492454529 1.0223487615585327 1.0514615774154663 1.0463922023773193 1.0112226009368896 0.9982134103775024 1.004634141921997 0.9877952933311462 0.9317412972450256 0.8688726425170898 0.791929304599762 0.6982804536819458 0.6116718649864197 0.5463566184043884 0.4956464171409607 0.4562545120716095 0.43035486340522766 0.41308432817459106 0.4023517668247223 0.40038397908210754 0.4071796238422394 0.4212566614151001 0.44529813528060913 0.47869226336479187 0.5134111642837524 0.5476288199424744 0.5924862027168274 0.6646744608879089 0.7205690741539001 0.7406251430511475 0.7573677897453308 0.7730262279510498 0.7530763149261475 0.701831042766571 0.6527606844902039 0.6117518544197083 0.5808829665184021 0.5582142472267151 0.5362958312034607 0.5081617832183838 0.4623250961303711 0.41480353474617004 0.3816410005092621 0.3512253761291504 0.3229435384273529 0.30036529898643494 0.28829801082611084 0.28772664070129395 0.29815641045570374 0.31810328364372253 0.33310839533805847 0.34295332431793213 0.3576355576515198 0.37281879782676697 0.37368515133857727 0.36629509925842285 0.3603748083114624 0.35585665702819824 0.3474416136741638 0.33159855008125305 0.31616654992103577 0.3076492249965668 0.307073712348938 0.3140259385108948 0.3209126889705658 0.3253902792930603 0.3307969272136688 0.3362623155117035 0.34198322892189026 0.3472789525985718 0.3470509350299835 0.3400651216506958 0.3291180729866028 0.31915709376335144 0.3109745383262634 0.3023119568824768 0.2948138117790222 0.28782516717910767 0.27949029207229614 0.2736770212650299 0.2739221751689911 0.27921369671821594 0.2852224111557007 0.2887378931045532 0.2893288731575012 0.28667038679122925 0.2830811142921448 0.28239449858665466 0.28517019748687744 0.28917649388313293 0.2914784848690033 0.2913095951080322 0.2914259135723114 0.29324576258659363 0.2956298291683197 0.2981545031070709 0.3011481463909149 0.3054879605770111 0.3107515871524811 0.31411612033843994 0.31555652618408203 0.3172118663787842 0.31911471486091614 0.32280173897743225 0.33204859495162964 0.3453712463378906 0.357761949300766 0.3699503242969513 0.38311585783958435 0.39259737730026245 0.395723819732666 0.39234602451324463 0.38097503781318665 0.3659316301345825 0.3534175157546997 0.34347930550575256 0.33371132612228394 0.3236602544784546 0.3152346611022949 0.30779775977134705 30445.38885 41538.7379 F:/DATA/90deg 15.717131304491499 46.21617319326819 90.0 Degrees 0.9324530395726834 0.11528954707161643 -0.3900859865428774 15.249631354870715 0.36275784996581106 0.671080814707999 -0.43318106508974763 45.03441323505067 -0.3608156144618988 0.4259406626224518 0.47818616032600403 0.5471063256263733 0.6347803473472595 0.7001804113388062 0.7520433068275452 0.8171277642250061 0.8950353264808655 0.9654224514961243 1.013027548789978 1.0263880491256714 0.9852103590965271 0.941172182559967 0.931695818901062 0.9181087017059326 0.8757404685020447 0.8307337164878845 0.7877539992332458 0.7257715463638306 0.6523596048355103 0.5768492817878723 0.5085425972938538 0.456727534532547 0.4192277491092682 0.3939008414745331 0.3818787932395935 0.3828960657119751 0.389323353767395 0.39450258016586304 0.39829221367836 0.40605780482292175 0.4275314211845398 0.4643791615962982 0.505535900592804 0.5479178428649902 0.5994552969932556 0.6376073360443115 0.6582133769989014 0.6799547672271729 0.6931027770042419 0.6702796816825867 0.6343024969100952 0.6056128144264221 0.5789087414741516 0.5561301112174988 0.53394615650177 0.4996113181114197 0.4577721953392029 0.4083678126335144 0.36549386382102966 0.3386378884315491 0.3173430263996124 0.2995651960372925 0.2844037711620331 0.27193325757980347 0.26600706577301025 0.2700923979282379 0.2851560115814209 0.30088505148887634 0.3138630986213684 0.3285767436027527 0.3413139879703522 0.3445935547351837 0.3396775424480438 0.330121785402298 0.3199063241481781 0.30752673745155334 0.2904285490512848 0.27791693806648254 0.2726101279258728 0.27176886796951294 0.2783729135990143 0.2872854471206665 0.29147452116012573 0.29573073983192444 0.30301201343536377 0.3096592128276825 0.3131972551345825 0.31535086035728455 0.3140628933906555 0.3053463399410248 0.2954469323158264 0.2890409231185913 0.280372679233551 0.2706373333930969 0.2643801271915436 0.25798389315605164 0.2508365511894226 0.24706313014030457 0.2483857423067093 0.25367772579193115 0.2591390609741211 0.26199933886528015 0.2643854320049286 0.2681591808795929 0.2714567184448242 0.27293530106544495 0.2729243338108063 0.27181246876716614 0.27032458782196045 0.2693708539009094 0.26829567551612854 0.2665247321128845 0.2669430077075958 0.271585613489151 0.2774175703525543 0.28121861815452576 0.2841823399066925 0.28875136375427246 0.2948462665081024 0.3012498915195465 0.30834972858428955 0.3174125552177429 0.3262895941734314 0.33198782801628113 0.3391663730144501 0.35144802927970886 0.3615659177303314 0.3633808195590973 0.3589021563529968 0.3500611186027527 0.33608290553092957 0.3192422091960907 0.30552980303764343 0.29612672328948975 0.2880210280418396 0.2813362777233124 0.2759957015514374 30442.5687 41541.616519999996 F:/DATA/90deg 14.381547746983568 42.02895298858711 90.0 Degrees 0.9052486894719146 0.23198983049333044 -0.12072690257494645 14.320648710203532 0.5510780301748821 0.5808993859007311 0.3024109496913203 41.91339873814995 -0.3729221224784851 0.44012895226478577 0.4914250373840332 0.5655630230903625 0.6647416949272156 0.7444058060646057 0.8126416206359863 0.8799846172332764 0.9443001747131348 0.9979190826416016 1.0210847854614258 1.0208030939102173 1.0111762285232544 0.992798924446106 0.9904224276542664 0.99041348695755 0.9595239162445068 0.908574640750885 0.846463143825531 0.7647848725318909 0.6809067726135254 0.6017272472381592 0.5331747531890869 0.48201125860214233 0.44443103671073914 0.41660502552986145 0.3969760835170746 0.38763803243637085 0.38977357745170593 0.4000709354877472 0.41259172558784485 0.4278537333011627 0.45189592242240906 0.48642393946647644 0.5247828960418701 0.5645804405212402 0.612518310546875 0.6483836770057678 0.6727944016456604 0.7076162695884705 0.7434014678001404 0.7206994891166687 0.6666464805603027 0.63228839635849 0.608867883682251 0.5807878971099854 0.5441436171531677 0.5172581076622009 0.4963454604148865 0.45485949516296387 0.401254266500473 0.36339372396469116 0.3367786109447479 0.31736981868743896 0.29844656586647034 0.28279122710227966 0.27746984362602234 0.2811555564403534 0.2927308678627014 0.3071295917034149 0.3210527002811432 0.33639973402023315 0.3501872718334198 0.3525633215904236 0.34586936235427856 0.33730486035346985 0.3312234878540039 0.32529526948928833 0.31066590547561646 0.2939175069332123 0.286742240190506 0.28868338465690613 0.2973419427871704 0.3067079484462738 0.31102290749549866 0.31296807527542114 0.3165799379348755 0.3216167390346527 0.32459816336631775 0.32458773255348206 0.32075992226600647 0.31120601296424866 0.3001273572444916 0.2915954291820526 0.28556665778160095 0.28158968687057495 0.2759927809238434 0.26627132296562195 0.25822049379348755 0.25609999895095825 0.2582840323448181 0.26162636280059814 0.26389646530151367 0.26584580540657043 0.269505113363266 0.2740560472011566 0.2757222354412079 0.2737424373626709 0.27331092953681946 0.2753473222255707 0.2754512131214142 0.2745696008205414 0.27530866861343384 0.2763848900794983 0.27731868624687195 0.2794644236564636 0.28307804465293884 0.2873600125312805 0.29181772470474243 0.29564568400382996 0.29717445373535156 0.2980411946773529 0.30308812856674194 0.31369927525520325 0.3267776072025299 0.3403771221637726 0.3552534282207489 0.3692227900028229 0.3773849606513977 0.37742289900779724 0.3699462413787842 0.3581613600254059 0.3446747362613678 0.3301258683204651 0.3174242079257965 0.3073962330818176 0.2965550720691681 0.28561556339263916 0.27806076407432556 30445.38885 41541.616519999996 F:/DATA/90deg 14.87720727584366 44.091357683377474 90.0 Degrees 0.9941901147353087 0.2536980425498405 -0.46382002276927525 14.441964377513065 0.1657092533769018 0.03694686596283513 -0.5203849464554426 42.743246117510395 -0.3949830234050751 0.4622531533241272 0.5109723210334778 0.5819476842880249 0.6732906699180603 0.7399584054946899 0.8056941032409668 0.8803262114524841 0.9407079219818115 0.9959824681282043 1.0247737169265747 0.9988774061203003 0.9598121643066406 0.9596822261810303 0.9756194353103638 0.9531159996986389 0.8880895376205444 0.8291646242141724 0.7852953672409058 0.7326091527938843 0.6583097577095032 0.5755128264427185 0.5128992199897766 0.47360721230506897 0.4461856484413147 0.424794465303421 0.40726786851882935 0.39642640948295593 0.3955315947532654 0.3990853428840637 0.40200623869895935 0.41744357347488403 0.4541429877281189 0.4928371012210846 0.523593544960022 0.5572065114974976 0.6082401275634766 0.6535071730613708 0.6752548813819885 0.6942375302314758 0.7089064717292786 0.6849415898323059 0.648251473903656 0.6290637254714966 0.611190140247345 0.5820888876914978 0.5479511022567749 0.5251440405845642 0.5092036724090576 0.4710317552089691 0.41165193915367126 0.368015855550766 0.33563244342803955 0.30891987681388855 0.289467990398407 0.279835045337677 0.2776188254356384 0.281124472618103 0.2969658076763153 0.3199588358402252 0.3370678722858429 0.35005685687065125 0.3592534065246582 0.3598088026046753 0.3555058240890503 0.34791675209999084 0.3381218910217285 0.32693901658058167 0.3126853406429291 0.3007925748825073 0.2955957353115082 0.2945536673069 0.29722654819488525 0.30562835931777954 0.3160330057144165 0.32335811853408813 0.32722195982933044 0.33106622099876404 0.333890825510025 0.3307388126850128 0.32467377185821533 0.31839045882225037 0.3102380931377411 0.30023348331451416 0.28814268112182617 0.2750730514526367 0.26571476459503174 0.2631886601448059 0.2642560303211212 0.2657497227191925 0.2698196768760681 0.2753346860408783 0.27848049998283386 0.27970898151397705 0.2795354127883911 0.2767869830131531 0.27504852414131165 0.2782919108867645 0.28145065903663635 0.2807522118091583 0.2820216417312622 0.28606170415878296 0.2876238524913788 0.2858695089817047 0.28583207726478577 0.29170745611190796 0.2989623248577118 0.3013303577899933 0.3022397756576538 0.3061143457889557 0.31094178557395935 0.31485098600387573 0.3188069462776184 0.32449349761009216 0.333775132894516 0.34593096375465393 0.3592696785926819 0.3726845979690552 0.3809838593006134 0.37974658608436584 0.37090665102005005 0.3579893112182617 0.3460439443588257 0.33749645948410034 0.3274995684623718 0.3147842586040497 0.3056890070438385 0.3015490472316742 0.2963547110557556 30442.5687 41538.7379 F:/DATA/135deg 15.053673351479718 43.89851045568374 135.0 Degrees 0.9998996542510169 0.04788184003105633 -0.0930766425798808 15.10229663993498 0.4761749412326489 0.1699951093342037 0.198482528841064 43.874691613741085 -0.36599868535995483 0.44001543521881104 0.4966375231742859 0.5643589496612549 0.654793381690979 0.7409048080444336 0.8192135691642761 0.8847960829734802 0.9369638562202454 0.9906289577484131 1.025296688079834 1.0149723291397095 0.9805884957313538 0.9636447429656982 0.9588003158569336 0.9524202942848206 0.9314351677894592 0.8927587270736694 0.8397254943847656 0.7675902843475342 0.6844693422317505 0.6059010624885559 0.5474121570587158 0.5043894052505493 0.468307226896286 0.44075509905815125 0.4207476079463959 0.4080858826637268 0.40591961145401 0.4134867191314697 0.42650675773620605 0.4475072920322418 0.47888901829719543 0.5122790336608887 0.5369526743888855 0.5554997324943542 0.5947977304458618 0.647955060005188 0.6778163313865662 0.6932549476623535 0.6977417469024658 0.6872305870056152 0.659528911113739 0.6245843768119812 0.5957351922988892 0.5746957659721375 0.5465317368507385 0.5116745233535767 0.47723180055618286 0.4333028197288513 0.3936629891395569 0.36897724866867065 0.345966637134552 0.3255443572998047 0.31004011631011963 0.29891106486320496 0.2932963967323303 0.2937392592430115 0.3078584671020508 0.33370327949523926 0.35201096534729004 0.3585779666900635 0.36050570011138916 0.3624379336833954 0.3620472550392151 0.35969817638397217 0.35452911257743835 0.3419364094734192 0.3230227828025818 0.30832669138908386 0.30204203724861145 0.3018741011619568 0.30683496594429016 0.3151794970035553 0.3218154311180115 0.3262678384780884 0.33061009645462036 0.33248963952064514 0.3305680453777313 0.32937225699424744 0.3280726373195648 0.322355717420578 0.3143385052680969 0.30674803256988525 0.2977624237537384 0.28612422943115234 0.27380654215812683 0.26605281233787537 0.2670673131942749 0.27401211857795715 0.2821645736694336 0.28739145398139954 0.289187490940094 0.2906554937362671 0.29101991653442383 0.28759765625 0.28305813670158386 0.28146880865097046 0.2823540270328522 0.2834238111972809 0.28334492444992065 0.28242823481559753 0.2830897569656372 0.285215824842453 0.286749929189682 0.2894335985183716 0.2963193953037262 0.30561134219169617 0.31135934591293335 0.3125182092189789 0.3135771155357361 0.31644806265830994 0.3219490647315979 0.3305686414241791 0.3386459946632385 0.34468361735343933 0.35293155908584595 0.3640737235546112 0.3740508556365967 0.3799596130847931 0.3787302076816559 0.3690877854824066 0.3545362651348114 0.33818575739860535 0.32251599431037903 0.31119340658187866 0.3069508969783783 0.30643993616104126 0.3014766573905945 30445.38885 41538.7379 F:/DATA/135deg 15.056927844654062 43.61475352701898 135.0 Degrees 0.9324530395726834 0.11528954707161643 -0.3900859865428774 15.249631354870715 0.36275784996581106 0.671080814707999 -0.43318106508974763 45.03441323505067 -0.36250585317611694 0.42431044578552246 0.4834742844104767 0.5558268427848816 0.6433207988739014 0.7237451076507568 0.797504723072052 0.8740603923797607 0.9462519288063049 1.0028680562973022 1.0236170291900635 0.9993492960929871 0.9659426808357239 0.929129958152771 0.8976386189460754 0.8773003220558167 0.845932126045227 0.804290771484375 0.7517927289009094 0.6770941019058228 0.5976353883743286 0.5313588380813599 0.48177453875541687 0.44140711426734924 0.40849852561950684 0.3899365961551666 0.38149017095565796 0.3739112615585327 0.3684139847755432 0.372007817029953 0.38562244176864624 0.40915170311927795 0.4383581876754761 0.46522119641304016 0.4911789894104004 0.5281954407691956 0.5901359915733337 0.6282098889350891 0.6299937963485718 0.6347435712814331 0.6456948518753052 0.6421006917953491 0.6224752068519592 0.6007646918296814 0.5784657001495361 0.5487658381462097 0.5032517313957214 0.4633730351924896 0.4398660957813263 0.41094517707824707 0.3713396489620209 0.3397798538208008 0.315258264541626 0.2960793673992157 0.2789282202720642 0.26473933458328247 0.2583105266094208 0.26161065697669983 0.276593953371048 0.29428234696388245 0.30759015679359436 0.3208509385585785 0.33403608202934265 0.3378518223762512 0.3314681351184845 0.3205536901950836 0.3096092939376831 0.29909756779670715 0.2854691445827484 0.27216678857803345 0.2648516893386841 0.26480165123939514 0.27259862422943115 0.28223392367362976 0.28807657957077026 0.2966751158237457 0.3103998601436615 0.31771647930145264 0.3139994740486145 0.31038033962249756 0.30780771374702454 0.30000224709510803 0.2885487973690033 0.2776309549808502 0.2691199779510498 0.26336920261383057 0.2575911581516266 0.2499367892742157 0.24667014181613922 0.2502342164516449 0.2533777952194214 0.25388017296791077 0.2556212842464447 0.2578236758708954 0.25818225741386414 0.2583445906639099 0.2599364221096039 0.2620580792427063 0.2627926170825958 0.2631688117980957 0.2642405927181244 0.263955682516098 0.2622736394405365 0.2618711590766907 0.2638363242149353 0.2683615982532501 0.2739871144294739 0.27764204144477844 0.2804603576660156 0.28473037481307983 0.28941360116004944 0.2937960624694824 0.2986640930175781 0.30610325932502747 0.316412091255188 0.3255343437194824 0.3314375877380371 0.33745360374450684 0.3465556502342224 0.355802059173584 0.358920693397522 0.35263997316360474 0.33765292167663574 0.3183898329734802 0.30118611454963684 0.2887457013130188 0.28239473700523376 0.2824958264827728 0.2819530665874481 30442.5687 41541.616519999996 F:/DATA/135deg 14.148486745442884 40.914534151939826 135.0 Degrees 0.9052486894719146 0.23198983049333044 -0.12072690257494645 14.320648710203532 0.5510780301748821 0.5808993859007311 0.3024109496913203 41.91339873814995 -0.3650876581668854 0.44027072191238403 0.49740421772003174 0.5676716566085815 0.6565104126930237 0.7217820286750793 0.776906430721283 0.8554854989051819 0.9431904554367065 0.99639892578125 0.9918259382247925 0.9632425308227539 0.9571559429168701 0.9453587532043457 0.9196834564208984 0.9045694470405579 0.8967841863632202 0.8714707493782043 0.8187240958213806 0.7500607967376709 0.6737703084945679 0.5944964289665222 0.5322104096412659 0.48620209097862244 0.4495582580566406 0.4267524480819702 0.4147963225841522 0.4065539836883545 0.40079763531684875 0.40120112895965576 0.4117395281791687 0.4343542158603668 0.4588378369808197 0.4770737290382385 0.49635985493659973 0.5230758190155029 0.5750504732131958 0.6321943402290344 0.6574925780296326 0.6613973379135132 0.6457144618034363 0.6232727766036987 0.6174584627151489 0.6194400787353516 0.6105873584747314 0.5773681402206421 0.5304786562919617 0.4934249520301819 0.45931971073150635 0.41730549931526184 0.38470304012298584 0.3595018684864044 0.3293219804763794 0.30435964465141296 0.2891426980495453 0.2798253893852234 0.2746725082397461 0.2748556435108185 0.2886051833629608 0.3117738366127014 0.32717078924179077 0.33106401562690735 0.3289177715778351 0.33031389117240906 0.33271220326423645 0.3304341435432434 0.32225725054740906 0.30900219082832336 0.2952777147293091 0.2869744896888733 0.28450044989585876 0.2863030433654785 0.29052266478538513 0.29561755061149597 0.3012177348136902 0.3077249825000763 0.3149780333042145 0.3194979727268219 0.31837978959083557 0.3156931400299072 0.31331557035446167 0.3074597716331482 0.29792141914367676 0.28665927052497864 0.2769920229911804 0.2717728316783905 0.2680080831050873 0.26393961906433105 0.2608543634414673 0.25888293981552124 0.25867512822151184 0.2605808675289154 0.263666570186615 0.26618891954421997 0.2665948271751404 0.2663698196411133 0.2670312225818634 0.26882821321487427 0.27096620202064514 0.2717668414115906 0.2718110680580139 0.2726369798183441 0.27475622296333313 0.2783312201499939 0.2822757363319397 0.285504013299942 0.2890436351299286 0.29262956976890564 0.292468398809433 0.2886587381362915 0.28673070669174194 0.2884071469306946 0.29260167479515076 0.30139777064323425 0.31254521012306213 0.32084983587265015 0.329580694437027 0.34177514910697937 0.35234349966049194 0.3568665683269501 0.3554323613643646 0.3491654396057129 0.3388620913028717 0.32499754428863525 0.3104616105556488 0.29853302240371704 0.28830283880233765 0.27974289655685425 0.27512240409851074 30445.38885 41541.616519999996 F:/DATA/135deg 14.216843459338445 41.87857263213592 135.0 Degrees 0.9941901147353087 0.2536980425498405 -0.46382002276927525 14.441964377513065 0.1657092533769018 0.03694686596283513 -0.5203849464554426 42.743246117510395 +map_x map_y Filename 1214.0 - 1258.0 1500.0 - 1580.0 Polarisation Angle R-squared (1214.0 - 1258.0) a0 (1214.0 - 1258.0) a1 (1214.0 - 1258.0) a2 (1214.0 - 1258.0) R-squared (1500.0 - 1580.0) a0 (1500.0 - 1580.0) a1 (1500.0 - 1580.0) a2 (1500.0 - 1580.0) 1697.131066748047 1693.2739506872558 1689.416834626465 1685.5597185656738 1681.702602504883 1677.8454864440919 1673.9883703833011 1670.13125432251 1666.2741382617191 1662.417022200928 1658.5599061401367 1654.702790079346 1650.8456740185547 1646.988557957764 1643.1314418969728 1639.274325836182 1635.4172097753908 1631.5600937145996 1627.7029776538088 1623.8458615930176 1619.9887455322269 1616.1316294714356 1612.2745134106449 1608.4173973498537 1604.5602812890625 1600.7031652282717 1596.8460491674805 1592.9889331066897 1589.1318170458985 1585.2747009851078 1581.4175849243165 1577.5604688635258 1573.7033528027346 1569.8462367419434 1565.9891206811526 1562.1320046203614 1558.2748885595706 1554.4177724987794 1550.5606564379887 1546.7035403771974 1542.8464243164062 1538.9893082556155 1535.1321921948243 1531.2750761340335 1527.4179600732423 1523.5608440124515 1519.7037279516603 1515.846611890869 1511.9894958300783 1508.1323797692871 1504.2752637084964 1500.4181476477052 1496.5610315869144 1492.7039155261232 1488.8467994653324 1484.9896834045412 1481.13256734375 1477.2754512829592 1473.418335222168 1469.5612191613773 1465.704103100586 1461.8469870397953 1457.989870979004 1454.1327549182129 1450.275638857422 1446.418522796631 1442.5614067358401 1438.704290675049 1434.8471746142582 1430.990058553467 1427.1329424926757 1423.275826431885 1419.4187103710938 1415.561594310303 1411.7044782495118 1407.847362188721 1403.9902461279298 1400.133130067139 1396.2760140063479 1392.4188979455566 1388.5617818847659 1384.7046658239747 1380.847549763184 1376.9904337023927 1373.133317641602 1369.2762015808107 1365.4190855200195 1361.5619694592287 1357.7048533984375 1353.8477373376468 1349.9906212768556 1346.1335052160648 1342.2763891552736 1338.4192730944824 1334.5621570336916 1330.7050409729004 1326.8479249121096 1322.9908088513184 1319.1336927905277 1315.2765767297365 1311.4194606689457 1307.5623446081545 1303.7052285473633 1299.8481124865725 1295.9909964257813 1292.1338803649905 1288.2767643041993 1284.4196482434086 1280.5625321826174 1276.7054161218261 1272.8483000610354 1268.9911840002442 1265.1340679394534 1261.2769518786622 1257.4198358178714 1253.5627197570802 1249.705603696289 1245.8484876354983 1241.991371574707 1238.1342555139163 1234.277139453125 1230.4200233923343 1226.562907331543 1222.7057912707523 1218.8486752099611 1214.99155914917 1211.1344430883792 1207.277327027588 1203.4202109667972 +continuous continuous F:/DATA/0deg F:/DATA/45deg F:/DATA/90deg F:/DATA/135deg continuous continuous 0.0\ Degrees 45.0\ Degrees 90.0\ Degrees 135.0\ Degrees continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous +meta meta meta meta meta meta meta meta meta meta meta meta meta meta +30442.56870 41538.7 F:/DATA/0deg 15.01 43.8794 0.0 Degrees 0.9999 0.0478818 -0.0930766 15.1023 0.476175 0.169995 0.198483 43.8747 0.371112 0.437823 0.49063 0.554745 0.637403 0.7115 0.787692 0.877086 0.955917 1.00985 1.04048 1.05437 1.06195 1.04376 1.00132 0.953696 0.897934 0.853371 0.8181 0.758444 0.66893 0.578222 0.513116 0.469617 0.431717 0.399153 0.381096 0.379658 0.386007 0.394715 0.409832 0.434376 0.461379 0.491682 0.528336 0.566765 0.617829 0.660426 0.676693 0.688528 0.698699 0.693028 0.672416 0.650183 0.626357 0.588599 0.537606 0.500553 0.477933 0.444328 0.396993 0.361379 0.334361 0.307472 0.280365 0.262548 0.259254 0.27016 0.293092 0.311504 0.319428 0.328142 0.344313 0.35353 0.347677 0.337744 0.328554 0.320071 0.311636 0.303229 0.294363 0.288164 0.290963 0.298723 0.302562 0.305746 0.311551 0.316181 0.317625 0.317585 0.31535 0.308883 0.300091 0.293777 0.288891 0.280275 0.270122 0.262868 0.257575 0.253377 0.254072 0.260834 0.2694 0.274141 0.272837 0.269375 0.267278 0.268401 0.272302 0.275084 0.274906 0.274682 0.277591 0.283677 0.289319 0.2909 0.29067 0.292611 0.295033 0.29774 0.30373 0.311427 0.318378 0.325305 0.33494 0.349067 0.363802 0.374495 0.380321 0.380348 0.373945 0.362572 0.346964 0.32878 0.312591 0.302286 0.297508 0.293882 0.287261 +30445.38885 41538.7 F:/DATA/0deg 14.937 45.3498 0.0 Degrees 0.932453 0.11529 -0.390086 15.2496 0.362758 0.671081 -0.433181 45.0344 0.388349 0.448678 0.502106 0.57625 0.666456 0.739631 0.822211 0.917378 0.978589 1.01079 1.03618 1.06373 1.07118 1.04238 1.02539 0.998684 0.937334 0.878587 0.827145 0.765513 0.690886 0.611775 0.547186 0.497125 0.455413 0.425255 0.406234 0.397541 0.399818 0.410452 0.426122 0.449539 0.480137 0.50936 0.535248 0.570625 0.643052 0.710415 0.728708 0.73008 0.720735 0.692803 0.6643 0.646581 0.635799 0.616929 0.571424 0.524703 0.495035 0.45882 0.410674 0.374486 0.34704 0.322182 0.295836 0.274902 0.269342 0.280963 0.306906 0.327077 0.334706 0.341523 0.351947 0.357323 0.354143 0.348662 0.342701 0.331286 0.312221 0.295572 0.287214 0.286729 0.291835 0.2956 0.298683 0.306048 0.316769 0.326264 0.330107 0.325933 0.316999 0.307955 0.301827 0.296864 0.287219 0.275201 0.266729 0.260914 0.257783 0.258419 0.261076 0.263926 0.265956 0.267012 0.267923 0.267989 0.266933 0.267816 0.272044 0.277063 0.280018 0.278512 0.275175 0.276259 0.282366 0.289972 0.298274 0.306977 0.310213 0.306542 0.305823 0.312866 0.322253 0.329395 0.336029 0.348212 0.36371 0.371787 0.371579 0.370461 0.369344 0.363424 0.350018 0.332075 0.314004 0.299888 0.29221 0.287401 0.281542 +30442.56870 41541.6 F:/DATA/0deg 14.1401 42.6338 0.0 Degrees 0.905249 0.23199 -0.120727 14.3206 0.551078 0.580899 0.302411 41.9134 0.366888 0.436718 0.4922 0.570333 0.665755 0.731933 0.793703 0.874753 0.939802 0.973045 1.00317 1.05384 1.09659 1.0494 0.982504 0.951112 0.930256 0.884242 0.812932 0.718398 0.620548 0.541538 0.487752 0.447617 0.414583 0.393359 0.3797 0.368648 0.364984 0.368028 0.373266 0.389188 0.423863 0.463111 0.491777 0.523782 0.597113 0.669128 0.689275 0.700334 0.716811 0.699965 0.654198 0.618993 0.592659 0.569674 0.541336 0.505385 0.465244 0.41113 0.36086 0.328088 0.300319 0.279338 0.264713 0.254155 0.249939 0.253053 0.26557 0.278994 0.284106 0.288887 0.302851 0.316163 0.319715 0.317839 0.311005 0.297548 0.281919 0.275083 0.275594 0.278234 0.283092 0.285054 0.2826 0.283599 0.288333 0.28995 0.292954 0.301358 0.302653 0.290671 0.275303 0.265199 0.259248 0.253187 0.245505 0.238288 0.233159 0.230298 0.233431 0.242936 0.251079 0.25074 0.246158 0.246491 0.252251 0.258739 0.262592 0.263126 0.261565 0.258986 0.257221 0.259425 0.265597 0.271934 0.277727 0.284238 0.288884 0.291186 0.292195 0.291642 0.294834 0.30665 0.321642 0.333238 0.343398 0.355624 0.365643 0.364946 0.352017 0.334117 0.317558 0.303991 0.292883 0.283478 0.278062 0.276618 0.273524 +30445.38885 41541.6 F:/DATA/0deg 13.9496 43.0506 0.0 Degrees 0.99419 0.253698 -0.46382 14.442 0.165709 0.0369469 -0.520385 42.7432 0.364289 0.430039 0.479588 0.545024 0.634537 0.70997 0.779679 0.863783 0.94209 0.990381 1.01057 1.02089 1.00522 0.963545 0.93713 0.913984 0.894606 0.882765 0.840723 0.756496 0.661105 0.57745 0.520235 0.484333 0.453767 0.426022 0.40593 0.39307 0.38633 0.388912 0.400147 0.418393 0.442809 0.472152 0.50507 0.545308 0.608525 0.658995 0.668915 0.667529 0.67177 0.680816 0.668141 0.637247 0.600074 0.56838 0.544324 0.516345 0.482242 0.438716 0.394992 0.359589 0.330476 0.309209 0.288608 0.269722 0.260508 0.263431 0.281402 0.299949 0.30824 0.314856 0.324372 0.330801 0.330393 0.324864 0.316544 0.306198 0.294661 0.287297 0.286869 0.289681 0.290966 0.292018 0.294566 0.297203 0.29965 0.300448 0.297668 0.29398 0.292749 0.292399 0.288911 0.281672 0.272818 0.262693 0.251497 0.242712 0.238273 0.236373 0.238051 0.245068 0.25349 0.256234 0.254129 0.253284 0.254793 0.257718 0.260684 0.261661 0.259754 0.255988 0.253681 0.256542 0.264176 0.271514 0.275504 0.27729 0.277796 0.278584 0.281959 0.288369 0.297905 0.309119 0.317819 0.324194 0.332646 0.343381 0.350595 0.35063 0.346471 0.338775 0.325357 0.308686 0.294003 0.285865 0.282715 0.276964 0.268188 +30442.56870 41538.7 F:/DATA/45deg 15.1494 44.2385 45.0 Degrees 0.9999 0.0478818 -0.0930766 15.1023 0.476175 0.169995 0.198483 43.8747 0.377336 0.439666 0.49002 0.563956 0.660936 0.736485 0.813696 0.898564 0.946875 0.973168 0.991494 0.985442 0.962806 0.952871 0.954651 0.953298 0.925729 0.869395 0.801019 0.721718 0.6436 0.575433 0.521471 0.479152 0.444723 0.417651 0.399052 0.393216 0.397473 0.406126 0.418429 0.439925 0.478349 0.526635 0.567238 0.597634 0.634826 0.67449 0.696796 0.709826 0.711861 0.685694 0.648934 0.619005 0.594159 0.571141 0.542178 0.511135 0.481076 0.435568 0.386079 0.353464 0.327502 0.303262 0.281945 0.269814 0.269393 0.280183 0.303669 0.325608 0.336539 0.343106 0.351299 0.358853 0.35684 0.345829 0.330767 0.316134 0.304601 0.296074 0.291513 0.293225 0.298058 0.30057 0.302994 0.30918 0.319126 0.329237 0.331565 0.322586 0.312364 0.30566 0.298175 0.289454 0.281428 0.27237 0.261519 0.252534 0.250261 0.253967 0.259972 0.265984 0.270319 0.270869 0.269002 0.268324 0.269527 0.27059 0.27027 0.271551 0.276131 0.280708 0.283241 0.283516 0.283652 0.287233 0.292733 0.297028 0.299899 0.300786 0.301683 0.306658 0.314625 0.32314 0.33584 0.354726 0.371804 0.379936 0.382574 0.383433 0.377804 0.364445 0.347468 0.329118 0.314569 0.307724 0.304923 0.302209 0.297009 +30445.38885 41538.7 F:/DATA/45deg 15.2875 44.9569 45.0 Degrees 0.932453 0.11529 -0.390086 15.2496 0.362758 0.671081 -0.433181 45.0344 0.373372 0.439651 0.491076 0.558625 0.646791 0.717906 0.784819 0.858747 0.913201 0.950156 0.978514 0.984796 0.951858 0.916951 0.91289 0.919005 0.901152 0.855256 0.796243 0.719541 0.640589 0.576895 0.528496 0.484752 0.444527 0.417518 0.405069 0.401538 0.403537 0.409552 0.41841 0.43763 0.473509 0.514442 0.54983 0.589174 0.654441 0.70743 0.721212 0.725349 0.720571 0.701124 0.679499 0.656135 0.623401 0.5791 0.537119 0.512741 0.487286 0.437103 0.388042 0.358509 0.329169 0.301985 0.283898 0.27568 0.275106 0.282658 0.302722 0.3224 0.331447 0.340079 0.353966 0.361564 0.356212 0.344228 0.330366 0.31649 0.303864 0.295138 0.291177 0.294144 0.302761 0.309986 0.31751 0.326917 0.331092 0.328123 0.325258 0.323155 0.317468 0.31105 0.305525 0.297789 0.289208 0.283009 0.277082 0.271337 0.267873 0.265984 0.266734 0.270845 0.275079 0.276982 0.277594 0.278524 0.280259 0.282121 0.28252 0.282672 0.284011 0.285525 0.287971 0.290394 0.291742 0.295466 0.301519 0.304767 0.304124 0.303437 0.305751 0.311215 0.318705 0.329056 0.342525 0.356261 0.36919 0.379202 0.383701 0.384808 0.382156 0.371655 0.35449 0.336352 0.320356 0.308044 0.300557 0.296149 0.292544 +30442.56870 41541.6 F:/DATA/45deg 14.6125 42.0763 45.0 Degrees 0.905249 0.23199 -0.120727 14.3206 0.551078 0.580899 0.302411 41.9134 0.389119 0.445544 0.485541 0.553915 0.653865 0.731596 0.803365 0.884946 0.936008 0.954917 0.964953 0.984912 1.00801 0.980782 0.942851 0.915692 0.876406 0.825238 0.773579 0.705725 0.624102 0.550498 0.49576 0.452223 0.412555 0.382822 0.370514 0.371086 0.373385 0.376612 0.387444 0.413311 0.449748 0.478586 0.499346 0.52767 0.582842 0.641436 0.670345 0.675088 0.661324 0.651612 0.64291 0.626327 0.604868 0.573128 0.530671 0.492236 0.457578 0.409957 0.361159 0.330537 0.305863 0.282402 0.262092 0.248825 0.243218 0.246221 0.265941 0.2905 0.300019 0.302133 0.310658 0.324703 0.329638 0.323319 0.310463 0.294323 0.280664 0.275344 0.272827 0.270643 0.273683 0.280577 0.284722 0.287036 0.290966 0.294219 0.294027 0.294158 0.292939 0.28451 0.271487 0.2601 0.25317 0.25014 0.24764 0.243283 0.240369 0.242942 0.248423 0.252284 0.255611 0.259142 0.257839 0.253574 0.253246 0.255504 0.255108 0.255263 0.260324 0.264893 0.265994 0.267917 0.270336 0.272009 0.276337 0.281935 0.284168 0.285078 0.288866 0.295355 0.303929 0.314657 0.32585 0.337819 0.351032 0.362672 0.370717 0.373443 0.368725 0.35594 0.336142 0.316351 0.304045 0.297267 0.291174 0.285479 0.280263 +30445.38885 41541.6 F:/DATA/45deg 14.7242 41.9525 45.0 Degrees 0.99419 0.253698 -0.46382 14.442 0.165709 0.0369469 -0.520385 42.7432 0.347388 0.417986 0.466429 0.529663 0.627234 0.705617 0.756152 0.808501 0.864455 0.905033 0.918149 0.911164 0.907354 0.91094 0.906254 0.887299 0.86427 0.844638 0.806725 0.733556 0.644366 0.564421 0.506117 0.467325 0.439901 0.419417 0.404562 0.39636 0.395734 0.401811 0.411786 0.4274 0.452002 0.48188 0.507369 0.529881 0.578444 0.644812 0.67779 0.676721 0.648645 0.630658 0.62943 0.614111 0.586581 0.559287 0.534175 0.501191 0.458397 0.406665 0.370412 0.348979 0.323511 0.297982 0.278727 0.267915 0.263555 0.264894 0.280038 0.30331 0.31639 0.317832 0.318721 0.328812 0.334969 0.331534 0.32236 0.307605 0.289727 0.27839 0.273951 0.272897 0.277684 0.286607 0.293765 0.30021 0.305993 0.308054 0.3081 0.309833 0.309883 0.30392 0.293418 0.281494 0.270728 0.262248 0.254004 0.247883 0.249008 0.255431 0.261482 0.263857 0.263822 0.263879 0.262452 0.260003 0.260052 0.261782 0.263097 0.265527 0.270003 0.273617 0.274701 0.275426 0.276797 0.277906 0.279892 0.284357 0.289455 0.293383 0.296655 0.298979 0.302806 0.311503 0.323659 0.338138 0.353941 0.367608 0.376841 0.379897 0.373673 0.357656 0.336982 0.318498 0.304715 0.295291 0.289609 0.284678 0.277526 +30442.56870 41538.7 F:/DATA/90deg 15.1961 43.4824 90.0 Degrees 0.9999 0.0478818 -0.0930766 15.1023 0.476175 0.169995 0.198483 43.8747 0.368902 0.438372 0.492153 0.567885 0.669762 0.742155 0.794941 0.861176 0.930482 0.988885 1.02962 1.02009 0.965876 0.937591 0.935554 0.935196 0.911904 0.863324 0.810291 0.747894 0.669335 0.589699 0.527832 0.479695 0.441558 0.417164 0.402744 0.393477 0.390444 0.397836 0.416532 0.447134 0.483572 0.518064 0.55421 0.596613 0.649101 0.681186 0.68997 0.693936 0.685768 0.657023 0.627067 0.600112 0.569499 0.54004 0.521235 0.505447 0.480011 0.433293 0.38531 0.356536 0.334007 0.315706 0.301712 0.292924 0.291435 0.29682 0.312369 0.329807 0.337849 0.344709 0.357139 0.361212 0.354942 0.350001 0.345913 0.337736 0.323516 0.308909 0.299716 0.295209 0.297204 0.309168 0.323565 0.330907 0.331114 0.334148 0.340916 0.339296 0.328863 0.318061 0.312036 0.307005 0.29696 0.286128 0.278593 0.273914 0.273917 0.277968 0.281844 0.284133 0.286396 0.286056 0.280132 0.273835 0.273076 0.277681 0.28477 0.290857 0.289642 0.282045 0.278311 0.282117 0.287577 0.29191 0.297432 0.304126 0.310185 0.31293 0.31173 0.312006 0.316438 0.322641 0.331355 0.344295 0.360731 0.377691 0.387713 0.385419 0.375522 0.364374 0.353014 0.340293 0.326833 0.316392 0.313171 0.316209 0.316435 +30445.38885 41538.7 F:/DATA/90deg 15.7171 46.2162 90.0 Degrees 0.932453 0.11529 -0.390086 15.2496 0.362758 0.671081 -0.433181 45.0344 0.378759 0.446921 0.496042 0.5681 0.670591 0.748317 0.804526 0.865812 0.927941 0.980782 1.02235 1.05146 1.04639 1.01122 0.998213 1.00463 0.987795 0.931741 0.868873 0.791929 0.69828 0.611672 0.546357 0.495646 0.456255 0.430355 0.413084 0.402352 0.400384 0.40718 0.421257 0.445298 0.478692 0.513411 0.547629 0.592486 0.664674 0.720569 0.740625 0.757368 0.773026 0.753076 0.701831 0.652761 0.611752 0.580883 0.558214 0.536296 0.508162 0.462325 0.414804 0.381641 0.351225 0.322944 0.300365 0.288298 0.287727 0.298156 0.318103 0.333108 0.342953 0.357636 0.372819 0.373685 0.366295 0.360375 0.355857 0.347442 0.331599 0.316167 0.307649 0.307074 0.314026 0.320913 0.32539 0.330797 0.336262 0.341983 0.347279 0.347051 0.340065 0.329118 0.319157 0.310975 0.302312 0.294814 0.287825 0.27949 0.273677 0.273922 0.279214 0.285222 0.288738 0.289329 0.28667 0.283081 0.282394 0.28517 0.289176 0.291478 0.29131 0.291426 0.293246 0.29563 0.298155 0.301148 0.305488 0.310752 0.314116 0.315557 0.317212 0.319115 0.322802 0.332049 0.345371 0.357762 0.36995 0.383116 0.392597 0.395724 0.392346 0.380975 0.365932 0.353418 0.343479 0.333711 0.32366 0.315235 0.307798 +30442.56870 41541.6 F:/DATA/90deg 14.3815 42.029 90.0 Degrees 0.905249 0.23199 -0.120727 14.3206 0.551078 0.580899 0.302411 41.9134 0.360816 0.425941 0.478186 0.547106 0.63478 0.70018 0.752043 0.817128 0.895035 0.965422 1.01303 1.02639 0.98521 0.941172 0.931696 0.918109 0.87574 0.830734 0.787754 0.725772 0.65236 0.576849 0.508543 0.456728 0.419228 0.393901 0.381879 0.382896 0.389323 0.394503 0.398292 0.406058 0.427531 0.464379 0.505536 0.547918 0.599455 0.637607 0.658213 0.679955 0.693103 0.67028 0.634302 0.605613 0.578909 0.55613 0.533946 0.499611 0.457772 0.408368 0.365494 0.338638 0.317343 0.299565 0.284404 0.271933 0.266007 0.270092 0.285156 0.300885 0.313863 0.328577 0.341314 0.344594 0.339678 0.330122 0.319906 0.307527 0.290429 0.277917 0.27261 0.271769 0.278373 0.287285 0.291475 0.295731 0.303012 0.309659 0.313197 0.315351 0.314063 0.305346 0.295447 0.289041 0.280373 0.270637 0.26438 0.257984 0.250837 0.247063 0.248386 0.253678 0.259139 0.261999 0.264385 0.268159 0.271457 0.272935 0.272924 0.271812 0.270325 0.269371 0.268296 0.266525 0.266943 0.271586 0.277418 0.281219 0.284182 0.288751 0.294846 0.30125 0.30835 0.317413 0.32629 0.331988 0.339166 0.351448 0.361566 0.363381 0.358902 0.350061 0.336083 0.319242 0.30553 0.296127 0.288021 0.281336 0.275996 +30445.38885 41541.6 F:/DATA/90deg 14.8772 44.0914 90.0 Degrees 0.99419 0.253698 -0.46382 14.442 0.165709 0.0369469 -0.520385 42.7432 0.372922 0.440129 0.491425 0.565563 0.664742 0.744406 0.812642 0.879985 0.9443 0.997919 1.02108 1.0208 1.01118 0.992799 0.990422 0.990413 0.959524 0.908575 0.846463 0.764785 0.680907 0.601727 0.533175 0.482011 0.444431 0.416605 0.396976 0.387638 0.389774 0.400071 0.412592 0.427854 0.451896 0.486424 0.524783 0.56458 0.612518 0.648384 0.672794 0.707616 0.743401 0.720699 0.666646 0.632288 0.608868 0.580788 0.544144 0.517258 0.496345 0.454859 0.401254 0.363394 0.336779 0.31737 0.298447 0.282791 0.27747 0.281156 0.292731 0.30713 0.321053 0.3364 0.350187 0.352563 0.345869 0.337305 0.331223 0.325295 0.310666 0.293918 0.286742 0.288683 0.297342 0.306708 0.311023 0.312968 0.31658 0.321617 0.324598 0.324588 0.32076 0.311206 0.300127 0.291595 0.285567 0.28159 0.275993 0.266271 0.25822 0.2561 0.258284 0.261626 0.263896 0.265846 0.269505 0.274056 0.275722 0.273742 0.273311 0.275347 0.275451 0.27457 0.275309 0.276385 0.277319 0.279464 0.283078 0.28736 0.291818 0.295646 0.297174 0.298041 0.303088 0.313699 0.326778 0.340377 0.355253 0.369223 0.377385 0.377423 0.369946 0.358161 0.344675 0.330126 0.317424 0.307396 0.296555 0.285616 0.278061 +30442.56870 41538.7 F:/DATA/135deg 15.0537 43.8985 135.0 Degrees 0.9999 0.0478818 -0.0930766 15.1023 0.476175 0.169995 0.198483 43.8747 0.394983 0.462253 0.510972 0.581948 0.673291 0.739958 0.805694 0.880326 0.940708 0.995982 1.02477 0.998877 0.959812 0.959682 0.975619 0.953116 0.88809 0.829165 0.785295 0.732609 0.65831 0.575513 0.512899 0.473607 0.446186 0.424794 0.407268 0.396426 0.395532 0.399085 0.402006 0.417444 0.454143 0.492837 0.523594 0.557207 0.60824 0.653507 0.675255 0.694238 0.708906 0.684942 0.648251 0.629064 0.61119 0.582089 0.547951 0.525144 0.509204 0.471032 0.411652 0.368016 0.335632 0.30892 0.289468 0.279835 0.277619 0.281124 0.296966 0.319959 0.337068 0.350057 0.359253 0.359809 0.355506 0.347917 0.338122 0.326939 0.312685 0.300793 0.295596 0.294554 0.297227 0.305628 0.316033 0.323358 0.327222 0.331066 0.333891 0.330739 0.324674 0.31839 0.310238 0.300233 0.288143 0.275073 0.265715 0.263189 0.264256 0.26575 0.26982 0.275335 0.27848 0.279709 0.279535 0.276787 0.275049 0.278292 0.281451 0.280752 0.282022 0.286062 0.287624 0.28587 0.285832 0.291707 0.298962 0.30133 0.30224 0.306114 0.310942 0.314851 0.318807 0.324493 0.333775 0.345931 0.35927 0.372685 0.380984 0.379747 0.370907 0.357989 0.346044 0.337496 0.3275 0.314784 0.305689 0.301549 0.296355 +30445.38885 41538.7 F:/DATA/135deg 15.0569 43.6148 135.0 Degrees 0.932453 0.11529 -0.390086 15.2496 0.362758 0.671081 -0.433181 45.0344 0.365999 0.440015 0.496638 0.564359 0.654793 0.740905 0.819214 0.884796 0.936964 0.990629 1.0253 1.01497 0.980588 0.963645 0.9588 0.95242 0.931435 0.892759 0.839725 0.76759 0.684469 0.605901 0.547412 0.504389 0.468307 0.440755 0.420748 0.408086 0.40592 0.413487 0.426507 0.447507 0.478889 0.512279 0.536953 0.5555 0.594798 0.647955 0.677816 0.693255 0.697742 0.687231 0.659529 0.624584 0.595735 0.574696 0.546532 0.511675 0.477232 0.433303 0.393663 0.368977 0.345967 0.325544 0.31004 0.298911 0.293296 0.293739 0.307858 0.333703 0.352011 0.358578 0.360506 0.362438 0.362047 0.359698 0.354529 0.341936 0.323023 0.308327 0.302042 0.301874 0.306835 0.315179 0.321815 0.326268 0.33061 0.33249 0.330568 0.329372 0.328073 0.322356 0.314339 0.306748 0.297762 0.286124 0.273807 0.266053 0.267067 0.274012 0.282165 0.287391 0.289187 0.290655 0.29102 0.287598 0.283058 0.281469 0.282354 0.283424 0.283345 0.282428 0.28309 0.285216 0.28675 0.289434 0.296319 0.305611 0.311359 0.312518 0.313577 0.316448 0.321949 0.330569 0.338646 0.344684 0.352932 0.364074 0.374051 0.37996 0.37873 0.369088 0.354536 0.338186 0.322516 0.311193 0.306951 0.30644 0.301477 +30442.56870 41541.6 F:/DATA/135deg 14.1485 40.9145 135.0 Degrees 0.905249 0.23199 -0.120727 14.3206 0.551078 0.580899 0.302411 41.9134 0.362506 0.42431 0.483474 0.555827 0.643321 0.723745 0.797505 0.87406 0.946252 1.00287 1.02362 0.999349 0.965943 0.92913 0.897639 0.8773 0.845932 0.804291 0.751793 0.677094 0.597635 0.531359 0.481775 0.441407 0.408499 0.389937 0.38149 0.373911 0.368414 0.372008 0.385622 0.409152 0.438358 0.465221 0.491179 0.528195 0.590136 0.62821 0.629994 0.634744 0.645695 0.642101 0.622475 0.600765 0.578466 0.548766 0.503252 0.463373 0.439866 0.410945 0.37134 0.33978 0.315258 0.296079 0.278928 0.264739 0.258311 0.261611 0.276594 0.294282 0.30759 0.320851 0.334036 0.337852 0.331468 0.320554 0.309609 0.299098 0.285469 0.272167 0.264852 0.264802 0.272599 0.282234 0.288077 0.296675 0.3104 0.317716 0.313999 0.31038 0.307808 0.300002 0.288549 0.277631 0.26912 0.263369 0.257591 0.249937 0.24667 0.250234 0.253378 0.25388 0.255621 0.257824 0.258182 0.258345 0.259936 0.262058 0.262793 0.263169 0.264241 0.263956 0.262274 0.261871 0.263836 0.268362 0.273987 0.277642 0.28046 0.28473 0.289414 0.293796 0.298664 0.306103 0.316412 0.325534 0.331438 0.337454 0.346556 0.355802 0.358921 0.35264 0.337653 0.31839 0.301186 0.288746 0.282395 0.282496 0.281953 +30445.38885 41541.6 F:/DATA/135deg 14.2168 41.8786 135.0 Degrees 0.99419 0.253698 -0.46382 14.442 0.165709 0.0369469 -0.520385 42.7432 0.365088 0.440271 0.497404 0.567672 0.65651 0.721782 0.776906 0.855485 0.94319 0.996399 0.991826 0.963243 0.957156 0.945359 0.919683 0.904569 0.896784 0.871471 0.818724 0.750061 0.67377 0.594496 0.53221 0.486202 0.449558 0.426752 0.414796 0.406554 0.400798 0.401201 0.41174 0.434354 0.458838 0.477074 0.49636 0.523076 0.57505 0.632194 0.657493 0.661397 0.645714 0.623273 0.617458 0.61944 0.610587 0.577368 0.530479 0.493425 0.45932 0.417305 0.384703 0.359502 0.329322 0.30436 0.289143 0.279825 0.274673 0.274856 0.288605 0.311774 0.327171 0.331064 0.328918 0.330314 0.332712 0.330434 0.322257 0.309002 0.295278 0.286974 0.2845 0.286303 0.290523 0.295618 0.301218 0.307725 0.314978 0.319498 0.31838 0.315693 0.313316 0.30746 0.297921 0.286659 0.276992 0.271773 0.268008 0.26394 0.260854 0.258883 0.258675 0.260581 0.263667 0.266189 0.266595 0.26637 0.267031 0.268828 0.270966 0.271767 0.271811 0.272637 0.274756 0.278331 0.282276 0.285504 0.289044 0.29263 0.292468 0.288659 0.286731 0.288407 0.292602 0.301398 0.312545 0.32085 0.329581 0.341775 0.352343 0.356867 0.355432 0.349165 0.338862 0.324998 0.310462 0.298533 0.288303 0.279743 0.275122 diff --git a/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile_polar-results.tab b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile_polar-results.tab index c4c2a91c6..a0ccf2a0d 100644 --- a/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile_polar-results.tab +++ b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multifile_polar-results.tab @@ -1,19 +1,19 @@ -1697.131066748047 1693.2739506872558 1689.416834626465 1685.5597185656738 1681.702602504883 1677.8454864440919 1673.9883703833011 1670.13125432251 1666.2741382617191 1662.417022200928 1658.5599061401367 1654.702790079346 1650.8456740185547 1646.988557957764 1643.1314418969728 1639.274325836182 1635.4172097753908 1631.5600937145996 1627.7029776538088 1623.8458615930176 1619.9887455322269 1616.1316294714356 1612.2745134106449 1608.4173973498537 1604.5602812890625 1600.7031652282717 1596.8460491674805 1592.9889331066897 1589.1318170458985 1585.2747009851078 1581.4175849243165 1577.5604688635258 1573.7033528027346 1569.8462367419434 1565.9891206811526 1562.1320046203614 1558.2748885595706 1554.4177724987794 1550.5606564379887 1546.7035403771974 1542.8464243164062 1538.9893082556155 1535.1321921948243 1531.2750761340335 1527.4179600732423 1523.5608440124515 1519.7037279516603 1515.846611890869 1511.9894958300783 1508.1323797692871 1504.2752637084964 1500.4181476477052 1496.5610315869144 1492.7039155261232 1488.8467994653324 1484.9896834045412 1481.13256734375 1477.2754512829592 1473.418335222168 1469.5612191613773 1465.704103100586 1461.8469870397953 1457.989870979004 1454.1327549182129 1450.275638857422 1446.418522796631 1442.5614067358401 1438.704290675049 1434.8471746142582 1430.990058553467 1427.1329424926757 1423.275826431885 1419.4187103710938 1415.561594310303 1411.7044782495118 1407.847362188721 1403.9902461279298 1400.133130067139 1396.2760140063479 1392.4188979455566 1388.5617818847659 1384.7046658239747 1380.847549763184 1376.9904337023927 1373.133317641602 1369.2762015808107 1365.4190855200195 1361.5619694592287 1357.7048533984375 1353.8477373376468 1349.9906212768556 1346.1335052160648 1342.2763891552736 1338.4192730944824 1334.5621570336916 1330.7050409729004 1326.8479249121096 1322.9908088513184 1319.1336927905277 1315.2765767297365 1311.4194606689457 1307.5623446081545 1303.7052285473633 1299.8481124865725 1295.9909964257813 1292.1338803649905 1288.2767643041993 1284.4196482434086 1280.5625321826174 1276.7054161218261 1272.8483000610354 1268.9911840002442 1265.1340679394534 1261.2769518786622 1257.4198358178714 1253.5627197570802 1249.705603696289 1245.8484876354983 1241.991371574707 1238.1342555139163 1234.277139453125 1230.4200233923343 1226.562907331543 1222.7057912707523 1218.8486752099611 1214.99155914917 1211.1344430883792 1207.277327027588 1203.4202109667972 map_x map_y Filename 1214.0 - 1258.0 1500.0 - 1580.0 Polarisation Angle Azimuth Angle (1214.0 - 1258.0) Hermans Orientation Function (1214.0 - 1258.0) Intensity (1214.0 - 1258.0) Amplitude (1214.0 - 1258.0) R-squared (1214.0 - 1258.0) Azimuth Angle (1500.0 - 1580.0) Hermans Orientation Function (1500.0 - 1580.0) Intensity (1500.0 - 1580.0) Amplitude (1500.0 - 1580.0) R-squared (1500.0 - 1580.0) -continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous F:/DATA/0deg F:/DATA/45deg F:/DATA/90deg F:/DATA/135deg continuous continuous 0.0\ Degrees 45.0\ Degrees 90.0\ Degrees 135.0\ Degrees continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous - meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta -0.3711118698120117 0.43782272934913635 0.49062955379486084 0.5547452569007874 0.6374028921127319 0.711500346660614 0.7876919507980347 0.8770861625671387 0.9559172987937927 1.0098530054092407 1.0404753684997559 1.0543735027313232 1.0619465112686157 1.0437582731246948 1.0013220310211182 0.9536964297294617 0.897933840751648 0.8533709645271301 0.8181004524230957 0.7584443688392639 0.6689296364784241 0.5782220363616943 0.513115644454956 0.46961721777915955 0.43171659111976624 0.3991532325744629 0.3810955286026001 0.37965840101242065 0.386007159948349 0.3947145342826843 0.4098324477672577 0.4343760311603546 0.46137940883636475 0.49168214201927185 0.528336226940155 0.5667646527290344 0.6178287267684937 0.6604256629943848 0.6766932010650635 0.6885275840759277 0.6986993551254272 0.6930281519889832 0.6724157929420471 0.6501829028129578 0.6263569593429565 0.5885990858078003 0.5376056432723999 0.5005533695220947 0.4779326319694519 0.4443279504776001 0.39699268341064453 0.36137861013412476 0.33436083793640137 0.30747178196907043 0.2803654670715332 0.2625480592250824 0.2592535614967346 0.27015992999076843 0.29309216141700745 0.31150364875793457 0.3194276988506317 0.328142374753952 0.3443129062652588 0.35353028774261475 0.3476772606372833 0.33774372935295105 0.32855379581451416 0.3200712502002716 0.31163617968559265 0.3032289445400238 0.2943628430366516 0.28816357254981995 0.2909632623195648 0.29872336983680725 0.3025616407394409 0.3057458698749542 0.3115512728691101 0.31618112325668335 0.3176253139972687 0.3175846040248871 0.3153497576713562 0.3088831901550293 0.3000914454460144 0.29377707839012146 0.2888909578323364 0.28027477860450745 0.270122230052948 0.26286780834198 0.2575746774673462 0.2533765435218811 0.2540722191333771 0.26083439588546753 0.2694004774093628 0.27414125204086304 0.2728372812271118 0.26937466859817505 0.2672775387763977 0.2684006989002228 0.2723020315170288 0.27508431673049927 0.2749064266681671 0.274681955575943 0.2775912284851074 0.28367695212364197 0.2893185019493103 0.290900319814682 0.2906703054904938 0.2926110625267029 0.2950325608253479 0.2977401614189148 0.3037301301956177 0.3114270567893982 0.318378210067749 0.32530495524406433 0.3349395990371704 0.3490666151046753 0.3638021945953369 0.3744945526123047 0.3803212642669678 0.3803481459617615 0.37394478917121887 0.3625723719596863 0.34696418046951294 0.3287803828716278 0.31259098649024963 0.3022864758968353 0.2975075840950012 0.2938818633556366 0.2872605323791504 30442.5687 41538.7379 F:/DATA/0deg 15.009961445779307 43.87936019111817 0.0 Degrees -76.38857262236182 0.004631214554422166 30.204593279869965 0.2093411760614958 0.9998996542510169 -20.289596380815063 0.003978761893197851 87.74938322748216 0.5226610812091969 0.4761749412326489 -0.388348788022995 0.44867801666259766 0.502106249332428 0.5762503743171692 0.6664558053016663 0.739630937576294 0.8222108483314514 0.9173783659934998 0.9785887002944946 1.0107851028442383 1.0361779928207397 1.0637257099151611 1.0711760520935059 1.0423812866210938 1.025393009185791 0.9986843466758728 0.9373337626457214 0.8785869479179382 0.8271448612213135 0.7655133605003357 0.6908860802650452 0.6117749810218811 0.5471857190132141 0.4971246123313904 0.45541316270828247 0.42525458335876465 0.4062337279319763 0.39754077792167664 0.39981767535209656 0.41045162081718445 0.42612242698669434 0.4495392143726349 0.48013657331466675 0.509360134601593 0.5352477431297302 0.5706249475479126 0.6430520415306091 0.7104148864746094 0.7287077903747559 0.7300795912742615 0.7207353115081787 0.6928030848503113 0.6642997860908508 0.6465807557106018 0.6357985734939575 0.6169293522834778 0.5714240670204163 0.5247028470039368 0.49503496289253235 0.4588204622268677 0.41067439317703247 0.37448638677597046 0.34704023599624634 0.32218214869499207 0.29583585262298584 0.27490201592445374 0.26934197545051575 0.28096309304237366 0.3069058060646057 0.3270772397518158 0.33470597863197327 0.34152284264564514 0.35194724798202515 0.3573232889175415 0.3541431128978729 0.34866204857826233 0.3427005112171173 0.3312859833240509 0.3122206926345825 0.2955722510814667 0.2872144877910614 0.2867285907268524 0.2918354272842407 0.2956002652645111 0.2986833155155182 0.3060479462146759 0.31676867604255676 0.3262639045715332 0.330106645822525 0.32593291997909546 0.31699928641319275 0.30795541405677795 0.3018266558647156 0.29686442017555237 0.28721868991851807 0.2752007842063904 0.2667289972305298 0.2609139084815979 0.25778260827064514 0.2584190368652344 0.2610763907432556 0.2639258801937103 0.26595649123191833 0.26701226830482483 0.2679225206375122 0.2679891288280487 0.2669326663017273 0.2678163945674896 0.2720436155796051 0.2770630121231079 0.28001782298088074 0.27851158380508423 0.2751752436161041 0.276258647441864 0.2823660373687744 0.2899717390537262 0.29827389121055603 0.30697736144065857 0.3102128207683563 0.30654236674308777 0.30582261085510254 0.3128655254840851 0.3222534656524658 0.32939496636390686 0.33602944016456604 0.34821176528930664 0.3637096881866455 0.37178686261177063 0.3715791702270508 0.37046146392822266 0.36934414505958557 0.36342424154281616 0.350017786026001 0.33207470178604126 0.3140036165714264 0.2998875081539154 0.29220956563949585 0.2874009907245636 0.2815419137477875 30445.38885 41538.7379 F:/DATA/0deg 14.936959331411803 45.349811063094954 0.0 Degrees -81.76750236979787 0.017942087761759287 30.49926270974143 0.8135324371187873 0.9324530395726834 -61.4210730982497 0.011894554755490427 90.06882647010134 1.5974921533722033 0.36275784996581106 -0.366887629032135 0.43671754002571106 0.49220016598701477 0.5703327059745789 0.6657547950744629 0.731933057308197 0.7937033176422119 0.8747525215148926 0.9398021697998047 0.9730452299118042 1.0031681060791016 1.0538406372070312 1.0965853929519653 1.0494016408920288 0.9825043678283691 0.9511120319366455 0.9302560687065125 0.8842418789863586 0.8129315972328186 0.7183979153633118 0.6205475330352783 0.5415375232696533 0.48775240778923035 0.44761666655540466 0.41458284854888916 0.39335882663726807 0.3796997666358948 0.36864838004112244 0.36498430371284485 0.3680277466773987 0.3732655644416809 0.38918817043304443 0.42386338114738464 0.46311137080192566 0.4917769134044647 0.5237820148468018 0.5971131920814514 0.6691277027130127 0.6892750859260559 0.7003340125083923 0.7168111801147461 0.6999649405479431 0.6541981101036072 0.6189929246902466 0.5926592946052551 0.5696735382080078 0.5413363575935364 0.5053853988647461 0.465243935585022 0.41113007068634033 0.36086025834083557 0.32808783650398254 0.3003191649913788 0.2793380916118622 0.26471295952796936 0.2541550099849701 0.24993854761123657 0.25305330753326416 0.2655698359012604 0.27899375557899475 0.2841063439846039 0.28888702392578125 0.30285078287124634 0.3161625862121582 0.3197145164012909 0.3178388774394989 0.31100529432296753 0.29754751920700073 0.28191861510276794 0.2750825583934784 0.27559351921081543 0.27823397517204285 0.2830919921398163 0.2850538194179535 0.2825995981693268 0.28359857201576233 0.2883332371711731 0.289949893951416 0.2929544150829315 0.30135759711265564 0.30265331268310547 0.2906714677810669 0.2753030061721802 0.2651992440223694 0.25924843549728394 0.25318726897239685 0.24550479650497437 0.23828820884227753 0.23315896093845367 0.23029816150665283 0.2334306240081787 0.24293583631515503 0.2510787546634674 0.25073981285095215 0.24615781009197235 0.2464907467365265 0.2522513270378113 0.2587389051914215 0.262591689825058 0.263126403093338 0.26156532764434814 0.2589862048625946 0.2572213411331177 0.2594248950481415 0.2655974328517914 0.27193424105644226 0.27772676944732666 0.28423818945884705 0.28888431191444397 0.29118603467941284 0.2921951413154602 0.29164180159568787 0.2948339283466339 0.3066503405570984 0.32164159417152405 0.333238422870636 0.34339842200279236 0.355623722076416 0.36564287543296814 0.36494630575180054 0.35201695561408997 0.3341171145439148 0.3175579309463501 0.30399125814437866 0.2928829789161682 0.28347793221473694 0.2780621647834778 0.276618093252182 0.27352389693260193 30442.5687 41541.616519999996 F:/DATA/0deg 14.140093941838566 42.63377488797279 0.0 Degrees -58.74617564278722 0.012249198283408431 28.641297420407064 0.5230459500184083 0.9052486894719146 -31.249461838574835 0.010471285030812348 83.8267974762999 1.3098037700862717 0.5510780301748821 -0.36428871750831604 0.43003931641578674 0.47958770394325256 0.5450240969657898 0.634536862373352 0.7099695801734924 0.7796786427497864 0.8637834787368774 0.942089855670929 0.9903811812400818 1.0105667114257812 1.0208871364593506 1.005222201347351 0.963545024394989 0.9371297359466553 0.9139838814735413 0.8946059942245483 0.8827653527259827 0.840722918510437 0.7564958333969116 0.6611053943634033 0.5774503946304321 0.5202354192733765 0.48433250188827515 0.45376747846603394 0.4260224401950836 0.4059300422668457 0.3930695950984955 0.38632991909980774 0.3889123797416687 0.4001465141773224 0.4183931052684784 0.4428093135356903 0.47215187549591064 0.5050704479217529 0.5453080534934998 0.6085248589515686 0.658994734287262 0.668915331363678 0.6675289869308472 0.6717699766159058 0.6808158755302429 0.6681414842605591 0.6372467875480652 0.6000738739967346 0.5683797597885132 0.544323742389679 0.516345202922821 0.48224183917045593 0.4387160539627075 0.39499184489250183 0.3595888912677765 0.3304763436317444 0.3092094361782074 0.28860795497894287 0.26972246170043945 0.2605076730251312 0.26343077421188354 0.28140151500701904 0.29994896054267883 0.30823972821235657 0.31485551595687866 0.32437241077423096 0.33080095052719116 0.3303925395011902 0.3248642385005951 0.3165438175201416 0.3061983585357666 0.2946605384349823 0.2872968912124634 0.2868692874908447 0.2896806299686432 0.2909656763076782 0.2920180857181549 0.2945660948753357 0.2972028851509094 0.29964983463287354 0.3004482090473175 0.29766783118247986 0.2939799129962921 0.2927486002445221 0.2923987805843353 0.2889113426208496 0.2816716730594635 0.27281782031059265 0.2626931965351105 0.2514967918395996 0.24271203577518463 0.23827271163463593 0.23637256026268005 0.2380509227514267 0.24506837129592896 0.25348952412605286 0.25623422861099243 0.25412917137145996 0.2532842457294464 0.2547925114631653 0.2577175199985504 0.26068350672721863 0.2616606056690216 0.2597542703151703 0.2559884488582611 0.2536808252334595 0.256541907787323 0.2641761898994446 0.271513968706131 0.2755036950111389 0.27728980779647827 0.27779620885849 0.27858373522758484 0.28195881843566895 0.28836870193481445 0.29790475964546204 0.3091188371181488 0.317819207906723 0.3241935074329376 0.33264613151550293 0.3433806300163269 0.3505949378013611 0.35062962770462036 0.34647127985954285 0.3387751281261444 0.32535696029663086 0.3086860477924347 0.2940033972263336 0.2858646810054779 0.2827148139476776 0.2769644856452942 0.26818761229515076 30445.38885 41541.616519999996 F:/DATA/0deg 13.949567230311496 43.05058779046659 0.0 Degrees -75.66121752117968 0.024705796952298773 28.883928755026126 1.0573395108768266 0.9941901147353087 -87.96943280855872 0.008170118041294187 85.4864922350208 1.0433897898712823 0.1657092533769018 -0.3773364722728729 0.43966636061668396 0.49002042412757874 0.5639562606811523 0.6609355807304382 0.7364853620529175 0.8136956691741943 0.8985644578933716 0.9468745589256287 0.9731678366661072 0.9914941191673279 0.9854417443275452 0.9628058671951294 0.9528713226318359 0.9546505808830261 0.9532977342605591 0.9257292151451111 0.8693946599960327 0.8010186553001404 0.7217180728912354 0.6436004638671875 0.5754334926605225 0.5214712619781494 0.47915247082710266 0.4447232484817505 0.41765138506889343 0.3990515470504761 0.39321616291999817 0.39747321605682373 0.40612584352493286 0.4184291958808899 0.43992483615875244 0.47834911942481995 0.5266345739364624 0.5672381520271301 0.597634494304657 0.6348262429237366 0.6744903922080994 0.6967960000038147 0.7098262310028076 0.7118614912033081 0.6856943368911743 0.6489338874816895 0.6190053224563599 0.5941586494445801 0.5711410641670227 0.5421783328056335 0.5111346244812012 0.4810764491558075 0.4355677664279938 0.3860788941383362 0.3534643054008484 0.32750168442726135 0.3032616674900055 0.2819446921348572 0.26981374621391296 0.2693929970264435 0.2801830768585205 0.30366891622543335 0.3256083130836487 0.3365386128425598 0.34310561418533325 0.35129883885383606 0.3588528633117676 0.35683950781822205 0.3458286225795746 0.33076736330986023 0.31613433361053467 0.30460110306739807 0.2960743308067322 0.2915134131908417 0.29322516918182373 0.2980576753616333 0.300569623708725 0.3029937744140625 0.3091799318790436 0.3191257119178772 0.32923704385757446 0.3315645456314087 0.3225858509540558 0.31236401200294495 0.3056598901748657 0.2981754243373871 0.2894536256790161 0.2814278304576874 0.2723696827888489 0.26151928305625916 0.2525339126586914 0.25026053190231323 0.2539668083190918 0.25997182726860046 0.26598429679870605 0.27031874656677246 0.27086934447288513 0.2690020799636841 0.26832443475723267 0.2695266008377075 0.2705895006656647 0.2702696919441223 0.27155083417892456 0.2761310338973999 0.28070759773254395 0.2832408547401428 0.2835163474082947 0.28365248441696167 0.2872329354286194 0.29273301362991333 0.29702767729759216 0.2998993694782257 0.30078554153442383 0.3016831874847412 0.30665796995162964 0.31462526321411133 0.32313990592956543 0.3358403742313385 0.3547256886959076 0.3718043267726898 0.3799355626106262 0.3825741112232208 0.383433073759079 0.3778041899204254 0.3644450008869171 0.3474675118923187 0.3291182518005371 0.3145691752433777 0.3077240586280823 0.3049233853816986 0.3022094964981079 0.2970089614391327 30442.5687 41538.7379 F:/DATA/45deg 15.14943703154183 44.23850067435577 45.0 Degrees -76.38857262236182 0.004631214554422166 30.204593279869965 0.2093411760614958 0.9998996542510169 -20.289596380815063 0.003978761893197851 87.74938322748216 0.5226610812091969 0.4761749412326489 -0.37337228655815125 0.4396507143974304 0.49107563495635986 0.5586245059967041 0.646790623664856 0.7179062962532043 0.7848191857337952 0.8587467670440674 0.9132012128829956 0.9501560926437378 0.9785140156745911 0.984795868396759 0.9518576860427856 0.9169514179229736 0.9128903150558472 0.9190047979354858 0.9011522531509399 0.8552564978599548 0.7962431311607361 0.7195406556129456 0.6405887007713318 0.5768947005271912 0.5284963250160217 0.48475223779678345 0.44452735781669617 0.4175184965133667 0.4050688147544861 0.4015383720397949 0.4035366475582123 0.4095524847507477 0.41840967535972595 0.43762996792793274 0.4735090136528015 0.5144422650337219 0.5498296618461609 0.5891739130020142 0.6544406414031982 0.7074301838874817 0.721211850643158 0.7253494262695312 0.7205705046653748 0.7011243104934692 0.6794993877410889 0.6561350226402283 0.6234012842178345 0.5791003108024597 0.5371192693710327 0.5127407312393188 0.48728594183921814 0.43710267543792725 0.3880417048931122 0.358508825302124 0.3291686475276947 0.30198532342910767 0.2838975191116333 0.2756803035736084 0.27510562539100647 0.28265753388404846 0.30272212624549866 0.3223998248577118 0.3314470052719116 0.3400789797306061 0.3539663255214691 0.3615642189979553 0.35621216893196106 0.34422820806503296 0.33036601543426514 0.3164904713630676 0.30386441946029663 0.29513826966285706 0.2911766767501831 0.2941439151763916 0.302760511636734 0.30998602509498596 0.31750985980033875 0.32691699266433716 0.33109205961227417 0.3281230330467224 0.32525792717933655 0.32315510511398315 0.3174678683280945 0.31104981899261475 0.3055250942707062 0.297789067029953 0.28920844197273254 0.28300905227661133 0.27708175778388977 0.27133673429489136 0.26787322759628296 0.2659844756126404 0.26673445105552673 0.2708447575569153 0.2750791013240814 0.2769821286201477 0.2775936722755432 0.278523713350296 0.2802591919898987 0.2821207642555237 0.282520055770874 0.28267189860343933 0.2840110957622528 0.28552529215812683 0.28797078132629395 0.2903944253921509 0.29174160957336426 0.2954663932323456 0.30151888728141785 0.30476686358451843 0.30412399768829346 0.30343693494796753 0.30575087666511536 0.31121543049812317 0.3187049329280853 0.3290562331676483 0.3425249457359314 0.3562610149383545 0.36918962001800537 0.3792024254798889 0.3837013840675354 0.3848077654838562 0.3821556568145752 0.3716545104980469 0.3544897437095642 0.33635222911834717 0.3203563988208771 0.30804407596588135 0.3005572259426117 0.2961486577987671 0.29254403710365295 30445.38885 41538.7379 F:/DATA/45deg 15.287506938801155 44.956915156436416 45.0 Degrees -81.76750236979787 0.017942087761759287 30.49926270974143 0.8135324371187873 0.9324530395726834 -61.4210730982497 0.011894554755490427 90.06882647010134 1.5974921533722033 0.36275784996581106 -0.38911929726600647 0.44554373621940613 0.4855414927005768 0.5539154410362244 0.6538650989532471 0.7315957546234131 0.8033648729324341 0.884945809841156 0.9360079765319824 0.954917311668396 0.9649530649185181 0.9849116206169128 1.008013129234314 0.9807816743850708 0.9428510069847107 0.9156916737556458 0.8764055967330933 0.825237512588501 0.7735792994499207 0.705725371837616 0.6241020560264587 0.5504984855651855 0.4957604706287384 0.45222288370132446 0.41255465149879456 0.3828220069408417 0.37051448225975037 0.37108558416366577 0.37338513135910034 0.37661170959472656 0.3874439001083374 0.41331085562705994 0.449747771024704 0.47858643531799316 0.4993457794189453 0.5276702642440796 0.5828417539596558 0.6414362788200378 0.6703454852104187 0.6750879287719727 0.6613235473632812 0.6516115069389343 0.6429095268249512 0.6263266801834106 0.6048684120178223 0.5731279253959656 0.5306711196899414 0.492236465215683 0.45757782459259033 0.40995675325393677 0.3611593246459961 0.33053696155548096 0.3058626651763916 0.2824017405509949 0.2620924711227417 0.24882546067237854 0.24321754276752472 0.24622128903865814 0.2659408152103424 0.29050007462501526 0.3000190854072571 0.30213284492492676 0.3106580674648285 0.3247032165527344 0.3296380937099457 0.3233187794685364 0.3104628324508667 0.29432252049446106 0.2806641161441803 0.2753435969352722 0.2728271782398224 0.270643025636673 0.2736828327178955 0.2805771827697754 0.28472232818603516 0.2870364487171173 0.2909660339355469 0.29421940445899963 0.2940268814563751 0.29415833950042725 0.2929386496543884 0.2845102548599243 0.27148693799972534 0.26009973883628845 0.25316986441612244 0.25014013051986694 0.24763965606689453 0.24328280985355377 0.24036899209022522 0.2429419606924057 0.24842298030853271 0.25228366255760193 0.25561103224754333 0.25914180278778076 0.25783947110176086 0.253574401140213 0.2532463073730469 0.25550371408462524 0.2551080286502838 0.2552626430988312 0.2603242099285126 0.2648930549621582 0.26599374413490295 0.26791733503341675 0.27033597230911255 0.27200937271118164 0.27633726596832275 0.281934916973114 0.28416839241981506 0.2850780189037323 0.28886574506759644 0.29535502195358276 0.30392923951148987 0.3146568834781647 0.3258497714996338 0.3378189206123352 0.3510323464870453 0.3626718819141388 0.3707166612148285 0.37344253063201904 0.3687247931957245 0.3559401333332062 0.336141973733902 0.31635063886642456 0.30404531955718994 0.2972669005393982 0.29117393493652344 0.28547903895378113 0.2802625894546509 30442.5687 41541.616519999996 F:/DATA/45deg 14.612466406432896 42.07633292374312 45.0 Degrees -58.74617564278722 0.012249198283408431 28.641297420407064 0.5230459500184083 0.9052486894719146 -31.249461838574835 0.010471285030812348 83.8267974762999 1.3098037700862717 0.5510780301748821 -0.34738847613334656 0.4179860055446625 0.4664291739463806 0.5296632647514343 0.6272340416908264 0.7056167125701904 0.7561516165733337 0.8085007667541504 0.8644552826881409 0.9050332307815552 0.9181493520736694 0.9111636281013489 0.9073537588119507 0.9109403491020203 0.9062535762786865 0.8872991800308228 0.8642696738243103 0.8446381688117981 0.8067254424095154 0.7335556745529175 0.6443662047386169 0.5644205808639526 0.506117045879364 0.467324823141098 0.43990078568458557 0.4194169044494629 0.4045620858669281 0.39635950326919556 0.3957340121269226 0.40181082487106323 0.4117859899997711 0.4274001121520996 0.4520021080970764 0.48187950253486633 0.5073687434196472 0.5298813581466675 0.5784440636634827 0.6448124051094055 0.6777898669242859 0.6767211556434631 0.648645281791687 0.6306580901145935 0.6294295191764832 0.6141109466552734 0.586581289768219 0.5592874884605408 0.5341745018959045 0.5011913180351257 0.4583965539932251 0.4066646993160248 0.3704123795032501 0.3489791750907898 0.3235110640525818 0.29798153042793274 0.2787266969680786 0.26791489124298096 0.2635549306869507 0.2648940086364746 0.2800384759902954 0.30330970883369446 0.3163895010948181 0.31783244013786316 0.3187214732170105 0.3288123607635498 0.33496859669685364 0.3315340280532837 0.32235997915267944 0.30760458111763 0.289726585149765 0.27839016914367676 0.2739510238170624 0.272896945476532 0.27768412232398987 0.286607027053833 0.29376494884490967 0.30020976066589355 0.3059932589530945 0.30805355310440063 0.3080996572971344 0.30983278155326843 0.30988332629203796 0.3039196729660034 0.29341766238212585 0.28149351477622986 0.2707284390926361 0.2622477412223816 0.25400418043136597 0.2478829324245453 0.2490083873271942 0.2554311156272888 0.26148200035095215 0.26385727524757385 0.26382210850715637 0.26387882232666016 0.26245152950286865 0.26000332832336426 0.2600518763065338 0.2617824673652649 0.26309698820114136 0.26552656292915344 0.2700032591819763 0.2736172676086426 0.2747006118297577 0.2754264175891876 0.2767968773841858 0.2779064476490021 0.279891699552536 0.284357488155365 0.28945451974868774 0.2933834195137024 0.2966553568840027 0.2989789843559265 0.30280598998069763 0.31150293350219727 0.32365909218788147 0.33813759684562683 0.35394054651260376 0.3676077127456665 0.376840740442276 0.3798968195915222 0.37367281317710876 0.3576556146144867 0.3369816541671753 0.31849825382232666 0.30471497774124146 0.29529136419296265 0.2896086275577545 0.2846777141094208 0.2775256037712097 30445.38885 41541.616519999996 F:/DATA/45deg 14.724239544441382 41.95246636406159 45.0 Degrees -75.66121752117968 0.024705796952298773 28.883928755026126 1.0573395108768266 0.9941901147353087 -87.96943280855872 0.008170118041294187 85.4864922350208 1.0433897898712823 0.1657092533769018 -0.36890196800231934 0.4383719861507416 0.49215278029441833 0.5678848028182983 0.6697624325752258 0.7421551942825317 0.7949410080909729 0.861175537109375 0.9304823279380798 0.9888854622840881 1.0296154022216797 1.0200906991958618 0.9658761620521545 0.9375912547111511 0.9355541467666626 0.9351963996887207 0.9119044542312622 0.8633236289024353 0.8102912902832031 0.7478935718536377 0.6693353056907654 0.5896985530853271 0.5278323888778687 0.47969499230384827 0.4415580630302429 0.4171638786792755 0.40274444222450256 0.3934766352176666 0.3904435634613037 0.39783647656440735 0.41653168201446533 0.4471336603164673 0.4835716187953949 0.5180643796920776 0.5542099475860596 0.5966129302978516 0.6491007804870605 0.6811864972114563 0.6899703741073608 0.6939358711242676 0.6857684850692749 0.6570229530334473 0.6270668506622314 0.6001116633415222 0.5694991946220398 0.5400396585464478 0.5212351679801941 0.5054466128349304 0.4800109267234802 0.4332926869392395 0.38531044125556946 0.35653600096702576 0.33400747179985046 0.3157062530517578 0.3017118573188782 0.29292401671409607 0.2914346158504486 0.2968195676803589 0.3123685419559479 0.3298073410987854 0.3378491699695587 0.3447093665599823 0.35713934898376465 0.36121153831481934 0.354942262172699 0.35000061988830566 0.34591320157051086 0.3377359211444855 0.32351627945899963 0.3089088499546051 0.299715518951416 0.29520851373672485 0.29720360040664673 0.3091683089733124 0.3235648274421692 0.3309069871902466 0.3311137557029724 0.3341479003429413 0.3409155011177063 0.3392958343029022 0.32886332273483276 0.318060964345932 0.31203606724739075 0.30700525641441345 0.2969604432582855 0.2861284911632538 0.2785927355289459 0.27391406893730164 0.2739171087741852 0.27796828746795654 0.2818444073200226 0.28413259983062744 0.28639599680900574 0.28605619072914124 0.28013235330581665 0.27383479475975037 0.27307555079460144 0.27768054604530334 0.2847695052623749 0.29085657000541687 0.28964218497276306 0.2820451259613037 0.2783108055591583 0.28211650252342224 0.28757697343826294 0.2919096350669861 0.2974321246147156 0.30412620306015015 0.3101852238178253 0.31293031573295593 0.31173041462898254 0.31200647354125977 0.31643787026405334 0.3226405680179596 0.33135539293289185 0.3442952632904053 0.3607310354709625 0.37769126892089844 0.38771292567253113 0.3854190707206726 0.37552234530448914 0.36437416076660156 0.35301434993743896 0.34029337763786316 0.3268333971500397 0.31639185547828674 0.31317082047462463 0.31620898842811584 0.31643491983413696 30442.5687 41538.7379 F:/DATA/90deg 15.196114730939069 43.482395133432554 90.0 Degrees -76.38857262236182 0.004631214554422166 30.204593279869965 0.2093411760614958 0.9998996542510169 -20.289596380815063 0.003978761893197851 87.74938322748216 0.5226610812091969 0.4761749412326489 -0.37875914573669434 0.4469207227230072 0.49604201316833496 0.5680999159812927 0.6705905199050903 0.7483171224594116 0.80452561378479 0.8658115863800049 0.9279407262802124 0.9807824492454529 1.0223487615585327 1.0514615774154663 1.0463922023773193 1.0112226009368896 0.9982134103775024 1.004634141921997 0.9877952933311462 0.9317412972450256 0.8688726425170898 0.791929304599762 0.6982804536819458 0.6116718649864197 0.5463566184043884 0.4956464171409607 0.4562545120716095 0.43035486340522766 0.41308432817459106 0.4023517668247223 0.40038397908210754 0.4071796238422394 0.4212566614151001 0.44529813528060913 0.47869226336479187 0.5134111642837524 0.5476288199424744 0.5924862027168274 0.6646744608879089 0.7205690741539001 0.7406251430511475 0.7573677897453308 0.7730262279510498 0.7530763149261475 0.701831042766571 0.6527606844902039 0.6117518544197083 0.5808829665184021 0.5582142472267151 0.5362958312034607 0.5081617832183838 0.4623250961303711 0.41480353474617004 0.3816410005092621 0.3512253761291504 0.3229435384273529 0.30036529898643494 0.28829801082611084 0.28772664070129395 0.29815641045570374 0.31810328364372253 0.33310839533805847 0.34295332431793213 0.3576355576515198 0.37281879782676697 0.37368515133857727 0.36629509925842285 0.3603748083114624 0.35585665702819824 0.3474416136741638 0.33159855008125305 0.31616654992103577 0.3076492249965668 0.307073712348938 0.3140259385108948 0.3209126889705658 0.3253902792930603 0.3307969272136688 0.3362623155117035 0.34198322892189026 0.3472789525985718 0.3470509350299835 0.3400651216506958 0.3291180729866028 0.31915709376335144 0.3109745383262634 0.3023119568824768 0.2948138117790222 0.28782516717910767 0.27949029207229614 0.2736770212650299 0.2739221751689911 0.27921369671821594 0.2852224111557007 0.2887378931045532 0.2893288731575012 0.28667038679122925 0.2830811142921448 0.28239449858665466 0.28517019748687744 0.28917649388313293 0.2914784848690033 0.2913095951080322 0.2914259135723114 0.29324576258659363 0.2956298291683197 0.2981545031070709 0.3011481463909149 0.3054879605770111 0.3107515871524811 0.31411612033843994 0.31555652618408203 0.3172118663787842 0.31911471486091614 0.32280173897743225 0.33204859495162964 0.3453712463378906 0.357761949300766 0.3699503242969513 0.38311585783958435 0.39259737730026245 0.395723819732666 0.39234602451324463 0.38097503781318665 0.3659316301345825 0.3534175157546997 0.34347930550575256 0.33371132612228394 0.3236602544784546 0.3152346611022949 0.30779775977134705 30445.38885 41538.7379 F:/DATA/90deg 15.717131304491499 46.21617319326819 90.0 Degrees -81.76750236979787 0.017942087761759287 30.49926270974143 0.8135324371187873 0.9324530395726834 -61.4210730982497 0.011894554755490427 90.06882647010134 1.5974921533722033 0.36275784996581106 -0.3608156144618988 0.4259406626224518 0.47818616032600403 0.5471063256263733 0.6347803473472595 0.7001804113388062 0.7520433068275452 0.8171277642250061 0.8950353264808655 0.9654224514961243 1.013027548789978 1.0263880491256714 0.9852103590965271 0.941172182559967 0.931695818901062 0.9181087017059326 0.8757404685020447 0.8307337164878845 0.7877539992332458 0.7257715463638306 0.6523596048355103 0.5768492817878723 0.5085425972938538 0.456727534532547 0.4192277491092682 0.3939008414745331 0.3818787932395935 0.3828960657119751 0.389323353767395 0.39450258016586304 0.39829221367836 0.40605780482292175 0.4275314211845398 0.4643791615962982 0.505535900592804 0.5479178428649902 0.5994552969932556 0.6376073360443115 0.6582133769989014 0.6799547672271729 0.6931027770042419 0.6702796816825867 0.6343024969100952 0.6056128144264221 0.5789087414741516 0.5561301112174988 0.53394615650177 0.4996113181114197 0.4577721953392029 0.4083678126335144 0.36549386382102966 0.3386378884315491 0.3173430263996124 0.2995651960372925 0.2844037711620331 0.27193325757980347 0.26600706577301025 0.2700923979282379 0.2851560115814209 0.30088505148887634 0.3138630986213684 0.3285767436027527 0.3413139879703522 0.3445935547351837 0.3396775424480438 0.330121785402298 0.3199063241481781 0.30752673745155334 0.2904285490512848 0.27791693806648254 0.2726101279258728 0.27176886796951294 0.2783729135990143 0.2872854471206665 0.29147452116012573 0.29573073983192444 0.30301201343536377 0.3096592128276825 0.3131972551345825 0.31535086035728455 0.3140628933906555 0.3053463399410248 0.2954469323158264 0.2890409231185913 0.280372679233551 0.2706373333930969 0.2643801271915436 0.25798389315605164 0.2508365511894226 0.24706313014030457 0.2483857423067093 0.25367772579193115 0.2591390609741211 0.26199933886528015 0.2643854320049286 0.2681591808795929 0.2714567184448242 0.27293530106544495 0.2729243338108063 0.27181246876716614 0.27032458782196045 0.2693708539009094 0.26829567551612854 0.2665247321128845 0.2669430077075958 0.271585613489151 0.2774175703525543 0.28121861815452576 0.2841823399066925 0.28875136375427246 0.2948462665081024 0.3012498915195465 0.30834972858428955 0.3174125552177429 0.3262895941734314 0.33198782801628113 0.3391663730144501 0.35144802927970886 0.3615659177303314 0.3633808195590973 0.3589021563529968 0.3500611186027527 0.33608290553092957 0.3192422091960907 0.30552980303764343 0.29612672328948975 0.2880210280418396 0.2813362777233124 0.2759957015514374 30442.5687 41541.616519999996 F:/DATA/90deg 14.381547746983568 42.02895298858711 90.0 Degrees -58.74617564278722 0.012249198283408431 28.641297420407064 0.5230459500184083 0.9052486894719146 -31.249461838574835 0.010471285030812348 83.8267974762999 1.3098037700862717 0.5510780301748821 -0.3729221224784851 0.44012895226478577 0.4914250373840332 0.5655630230903625 0.6647416949272156 0.7444058060646057 0.8126416206359863 0.8799846172332764 0.9443001747131348 0.9979190826416016 1.0210847854614258 1.0208030939102173 1.0111762285232544 0.992798924446106 0.9904224276542664 0.99041348695755 0.9595239162445068 0.908574640750885 0.846463143825531 0.7647848725318909 0.6809067726135254 0.6017272472381592 0.5331747531890869 0.48201125860214233 0.44443103671073914 0.41660502552986145 0.3969760835170746 0.38763803243637085 0.38977357745170593 0.4000709354877472 0.41259172558784485 0.4278537333011627 0.45189592242240906 0.48642393946647644 0.5247828960418701 0.5645804405212402 0.612518310546875 0.6483836770057678 0.6727944016456604 0.7076162695884705 0.7434014678001404 0.7206994891166687 0.6666464805603027 0.63228839635849 0.608867883682251 0.5807878971099854 0.5441436171531677 0.5172581076622009 0.4963454604148865 0.45485949516296387 0.401254266500473 0.36339372396469116 0.3367786109447479 0.31736981868743896 0.29844656586647034 0.28279122710227966 0.27746984362602234 0.2811555564403534 0.2927308678627014 0.3071295917034149 0.3210527002811432 0.33639973402023315 0.3501872718334198 0.3525633215904236 0.34586936235427856 0.33730486035346985 0.3312234878540039 0.32529526948928833 0.31066590547561646 0.2939175069332123 0.286742240190506 0.28868338465690613 0.2973419427871704 0.3067079484462738 0.31102290749549866 0.31296807527542114 0.3165799379348755 0.3216167390346527 0.32459816336631775 0.32458773255348206 0.32075992226600647 0.31120601296424866 0.3001273572444916 0.2915954291820526 0.28556665778160095 0.28158968687057495 0.2759927809238434 0.26627132296562195 0.25822049379348755 0.25609999895095825 0.2582840323448181 0.26162636280059814 0.26389646530151367 0.26584580540657043 0.269505113363266 0.2740560472011566 0.2757222354412079 0.2737424373626709 0.27331092953681946 0.2753473222255707 0.2754512131214142 0.2745696008205414 0.27530866861343384 0.2763848900794983 0.27731868624687195 0.2794644236564636 0.28307804465293884 0.2873600125312805 0.29181772470474243 0.29564568400382996 0.29717445373535156 0.2980411946773529 0.30308812856674194 0.31369927525520325 0.3267776072025299 0.3403771221637726 0.3552534282207489 0.3692227900028229 0.3773849606513977 0.37742289900779724 0.3699462413787842 0.3581613600254059 0.3446747362613678 0.3301258683204651 0.3174242079257965 0.3073962330818176 0.2965550720691681 0.28561556339263916 0.27806076407432556 30445.38885 41541.616519999996 F:/DATA/90deg 14.87720727584366 44.091357683377474 90.0 Degrees -75.66121752117968 0.024705796952298773 28.883928755026126 1.0573395108768266 0.9941901147353087 -87.96943280855872 0.008170118041294187 85.4864922350208 1.0433897898712823 0.1657092533769018 -0.3949830234050751 0.4622531533241272 0.5109723210334778 0.5819476842880249 0.6732906699180603 0.7399584054946899 0.8056941032409668 0.8803262114524841 0.9407079219818115 0.9959824681282043 1.0247737169265747 0.9988774061203003 0.9598121643066406 0.9596822261810303 0.9756194353103638 0.9531159996986389 0.8880895376205444 0.8291646242141724 0.7852953672409058 0.7326091527938843 0.6583097577095032 0.5755128264427185 0.5128992199897766 0.47360721230506897 0.4461856484413147 0.424794465303421 0.40726786851882935 0.39642640948295593 0.3955315947532654 0.3990853428840637 0.40200623869895935 0.41744357347488403 0.4541429877281189 0.4928371012210846 0.523593544960022 0.5572065114974976 0.6082401275634766 0.6535071730613708 0.6752548813819885 0.6942375302314758 0.7089064717292786 0.6849415898323059 0.648251473903656 0.6290637254714966 0.611190140247345 0.5820888876914978 0.5479511022567749 0.5251440405845642 0.5092036724090576 0.4710317552089691 0.41165193915367126 0.368015855550766 0.33563244342803955 0.30891987681388855 0.289467990398407 0.279835045337677 0.2776188254356384 0.281124472618103 0.2969658076763153 0.3199588358402252 0.3370678722858429 0.35005685687065125 0.3592534065246582 0.3598088026046753 0.3555058240890503 0.34791675209999084 0.3381218910217285 0.32693901658058167 0.3126853406429291 0.3007925748825073 0.2955957353115082 0.2945536673069 0.29722654819488525 0.30562835931777954 0.3160330057144165 0.32335811853408813 0.32722195982933044 0.33106622099876404 0.333890825510025 0.3307388126850128 0.32467377185821533 0.31839045882225037 0.3102380931377411 0.30023348331451416 0.28814268112182617 0.2750730514526367 0.26571476459503174 0.2631886601448059 0.2642560303211212 0.2657497227191925 0.2698196768760681 0.2753346860408783 0.27848049998283386 0.27970898151397705 0.2795354127883911 0.2767869830131531 0.27504852414131165 0.2782919108867645 0.28145065903663635 0.2807522118091583 0.2820216417312622 0.28606170415878296 0.2876238524913788 0.2858695089817047 0.28583207726478577 0.29170745611190796 0.2989623248577118 0.3013303577899933 0.3022397756576538 0.3061143457889557 0.31094178557395935 0.31485098600387573 0.3188069462776184 0.32449349761009216 0.333775132894516 0.34593096375465393 0.3592696785926819 0.3726845979690552 0.3809838593006134 0.37974658608436584 0.37090665102005005 0.3579893112182617 0.3460439443588257 0.33749645948410034 0.3274995684623718 0.3147842586040497 0.3056890070438385 0.3015490472316742 0.2963547110557556 30442.5687 41538.7379 F:/DATA/135deg 15.053673351479718 43.89851045568374 135.0 Degrees -76.38857262236182 0.004631214554422166 30.204593279869965 0.2093411760614958 0.9998996542510169 -20.289596380815063 0.003978761893197851 87.74938322748216 0.5226610812091969 0.4761749412326489 -0.36599868535995483 0.44001543521881104 0.4966375231742859 0.5643589496612549 0.654793381690979 0.7409048080444336 0.8192135691642761 0.8847960829734802 0.9369638562202454 0.9906289577484131 1.025296688079834 1.0149723291397095 0.9805884957313538 0.9636447429656982 0.9588003158569336 0.9524202942848206 0.9314351677894592 0.8927587270736694 0.8397254943847656 0.7675902843475342 0.6844693422317505 0.6059010624885559 0.5474121570587158 0.5043894052505493 0.468307226896286 0.44075509905815125 0.4207476079463959 0.4080858826637268 0.40591961145401 0.4134867191314697 0.42650675773620605 0.4475072920322418 0.47888901829719543 0.5122790336608887 0.5369526743888855 0.5554997324943542 0.5947977304458618 0.647955060005188 0.6778163313865662 0.6932549476623535 0.6977417469024658 0.6872305870056152 0.659528911113739 0.6245843768119812 0.5957351922988892 0.5746957659721375 0.5465317368507385 0.5116745233535767 0.47723180055618286 0.4333028197288513 0.3936629891395569 0.36897724866867065 0.345966637134552 0.3255443572998047 0.31004011631011963 0.29891106486320496 0.2932963967323303 0.2937392592430115 0.3078584671020508 0.33370327949523926 0.35201096534729004 0.3585779666900635 0.36050570011138916 0.3624379336833954 0.3620472550392151 0.35969817638397217 0.35452911257743835 0.3419364094734192 0.3230227828025818 0.30832669138908386 0.30204203724861145 0.3018741011619568 0.30683496594429016 0.3151794970035553 0.3218154311180115 0.3262678384780884 0.33061009645462036 0.33248963952064514 0.3305680453777313 0.32937225699424744 0.3280726373195648 0.322355717420578 0.3143385052680969 0.30674803256988525 0.2977624237537384 0.28612422943115234 0.27380654215812683 0.26605281233787537 0.2670673131942749 0.27401211857795715 0.2821645736694336 0.28739145398139954 0.289187490940094 0.2906554937362671 0.29101991653442383 0.28759765625 0.28305813670158386 0.28146880865097046 0.2823540270328522 0.2834238111972809 0.28334492444992065 0.28242823481559753 0.2830897569656372 0.285215824842453 0.286749929189682 0.2894335985183716 0.2963193953037262 0.30561134219169617 0.31135934591293335 0.3125182092189789 0.3135771155357361 0.31644806265830994 0.3219490647315979 0.3305686414241791 0.3386459946632385 0.34468361735343933 0.35293155908584595 0.3640737235546112 0.3740508556365967 0.3799596130847931 0.3787302076816559 0.3690877854824066 0.3545362651348114 0.33818575739860535 0.32251599431037903 0.31119340658187866 0.3069508969783783 0.30643993616104126 0.3014766573905945 30445.38885 41538.7379 F:/DATA/135deg 15.056927844654062 43.61475352701898 135.0 Degrees -81.76750236979787 0.017942087761759287 30.49926270974143 0.8135324371187873 0.9324530395726834 -61.4210730982497 0.011894554755490427 90.06882647010134 1.5974921533722033 0.36275784996581106 -0.36250585317611694 0.42431044578552246 0.4834742844104767 0.5558268427848816 0.6433207988739014 0.7237451076507568 0.797504723072052 0.8740603923797607 0.9462519288063049 1.0028680562973022 1.0236170291900635 0.9993492960929871 0.9659426808357239 0.929129958152771 0.8976386189460754 0.8773003220558167 0.845932126045227 0.804290771484375 0.7517927289009094 0.6770941019058228 0.5976353883743286 0.5313588380813599 0.48177453875541687 0.44140711426734924 0.40849852561950684 0.3899365961551666 0.38149017095565796 0.3739112615585327 0.3684139847755432 0.372007817029953 0.38562244176864624 0.40915170311927795 0.4383581876754761 0.46522119641304016 0.4911789894104004 0.5281954407691956 0.5901359915733337 0.6282098889350891 0.6299937963485718 0.6347435712814331 0.6456948518753052 0.6421006917953491 0.6224752068519592 0.6007646918296814 0.5784657001495361 0.5487658381462097 0.5032517313957214 0.4633730351924896 0.4398660957813263 0.41094517707824707 0.3713396489620209 0.3397798538208008 0.315258264541626 0.2960793673992157 0.2789282202720642 0.26473933458328247 0.2583105266094208 0.26161065697669983 0.276593953371048 0.29428234696388245 0.30759015679359436 0.3208509385585785 0.33403608202934265 0.3378518223762512 0.3314681351184845 0.3205536901950836 0.3096092939376831 0.29909756779670715 0.2854691445827484 0.27216678857803345 0.2648516893386841 0.26480165123939514 0.27259862422943115 0.28223392367362976 0.28807657957077026 0.2966751158237457 0.3103998601436615 0.31771647930145264 0.3139994740486145 0.31038033962249756 0.30780771374702454 0.30000224709510803 0.2885487973690033 0.2776309549808502 0.2691199779510498 0.26336920261383057 0.2575911581516266 0.2499367892742157 0.24667014181613922 0.2502342164516449 0.2533777952194214 0.25388017296791077 0.2556212842464447 0.2578236758708954 0.25818225741386414 0.2583445906639099 0.2599364221096039 0.2620580792427063 0.2627926170825958 0.2631688117980957 0.2642405927181244 0.263955682516098 0.2622736394405365 0.2618711590766907 0.2638363242149353 0.2683615982532501 0.2739871144294739 0.27764204144477844 0.2804603576660156 0.28473037481307983 0.28941360116004944 0.2937960624694824 0.2986640930175781 0.30610325932502747 0.316412091255188 0.3255343437194824 0.3314375877380371 0.33745360374450684 0.3465556502342224 0.355802059173584 0.358920693397522 0.35263997316360474 0.33765292167663574 0.3183898329734802 0.30118611454963684 0.2887457013130188 0.28239473700523376 0.2824958264827728 0.2819530665874481 30442.5687 41541.616519999996 F:/DATA/135deg 14.148486745442884 40.914534151939826 135.0 Degrees -58.74617564278722 0.012249198283408431 28.641297420407064 0.5230459500184083 0.9052486894719146 -31.249461838574835 0.010471285030812348 83.8267974762999 1.3098037700862717 0.5510780301748821 -0.3650876581668854 0.44027072191238403 0.49740421772003174 0.5676716566085815 0.6565104126930237 0.7217820286750793 0.776906430721283 0.8554854989051819 0.9431904554367065 0.99639892578125 0.9918259382247925 0.9632425308227539 0.9571559429168701 0.9453587532043457 0.9196834564208984 0.9045694470405579 0.8967841863632202 0.8714707493782043 0.8187240958213806 0.7500607967376709 0.6737703084945679 0.5944964289665222 0.5322104096412659 0.48620209097862244 0.4495582580566406 0.4267524480819702 0.4147963225841522 0.4065539836883545 0.40079763531684875 0.40120112895965576 0.4117395281791687 0.4343542158603668 0.4588378369808197 0.4770737290382385 0.49635985493659973 0.5230758190155029 0.5750504732131958 0.6321943402290344 0.6574925780296326 0.6613973379135132 0.6457144618034363 0.6232727766036987 0.6174584627151489 0.6194400787353516 0.6105873584747314 0.5773681402206421 0.5304786562919617 0.4934249520301819 0.45931971073150635 0.41730549931526184 0.38470304012298584 0.3595018684864044 0.3293219804763794 0.30435964465141296 0.2891426980495453 0.2798253893852234 0.2746725082397461 0.2748556435108185 0.2886051833629608 0.3117738366127014 0.32717078924179077 0.33106401562690735 0.3289177715778351 0.33031389117240906 0.33271220326423645 0.3304341435432434 0.32225725054740906 0.30900219082832336 0.2952777147293091 0.2869744896888733 0.28450044989585876 0.2863030433654785 0.29052266478538513 0.29561755061149597 0.3012177348136902 0.3077249825000763 0.3149780333042145 0.3194979727268219 0.31837978959083557 0.3156931400299072 0.31331557035446167 0.3074597716331482 0.29792141914367676 0.28665927052497864 0.2769920229911804 0.2717728316783905 0.2680080831050873 0.26393961906433105 0.2608543634414673 0.25888293981552124 0.25867512822151184 0.2605808675289154 0.263666570186615 0.26618891954421997 0.2665948271751404 0.2663698196411133 0.2670312225818634 0.26882821321487427 0.27096620202064514 0.2717668414115906 0.2718110680580139 0.2726369798183441 0.27475622296333313 0.2783312201499939 0.2822757363319397 0.285504013299942 0.2890436351299286 0.29262956976890564 0.292468398809433 0.2886587381362915 0.28673070669174194 0.2884071469306946 0.29260167479515076 0.30139777064323425 0.31254521012306213 0.32084983587265015 0.329580694437027 0.34177514910697937 0.35234349966049194 0.3568665683269501 0.3554323613643646 0.3491654396057129 0.3388620913028717 0.32499754428863525 0.3104616105556488 0.29853302240371704 0.28830283880233765 0.27974289655685425 0.27512240409851074 30445.38885 41541.616519999996 F:/DATA/135deg 14.216843459338445 41.87857263213592 135.0 Degrees -75.66121752117968 0.024705796952298773 28.883928755026126 1.0573395108768266 0.9941901147353087 -87.96943280855872 0.008170118041294187 85.4864922350208 1.0433897898712823 0.1657092533769018 +map_x map_y Filename 1214.0 - 1258.0 1500.0 - 1580.0 Polarisation Angle Azimuth Angle (1214.0 - 1258.0) Hermans Orientation Function (1214.0 - 1258.0) Intensity (1214.0 - 1258.0) Amplitude (1214.0 - 1258.0) R-squared (1214.0 - 1258.0) Azimuth Angle (1500.0 - 1580.0) Hermans Orientation Function (1500.0 - 1580.0) Intensity (1500.0 - 1580.0) Amplitude (1500.0 - 1580.0) R-squared (1500.0 - 1580.0) 1697.131066748047 1693.2739506872558 1689.416834626465 1685.5597185656738 1681.702602504883 1677.8454864440919 1673.9883703833011 1670.13125432251 1666.2741382617191 1662.417022200928 1658.5599061401367 1654.702790079346 1650.8456740185547 1646.988557957764 1643.1314418969728 1639.274325836182 1635.4172097753908 1631.5600937145996 1627.7029776538088 1623.8458615930176 1619.9887455322269 1616.1316294714356 1612.2745134106449 1608.4173973498537 1604.5602812890625 1600.7031652282717 1596.8460491674805 1592.9889331066897 1589.1318170458985 1585.2747009851078 1581.4175849243165 1577.5604688635258 1573.7033528027346 1569.8462367419434 1565.9891206811526 1562.1320046203614 1558.2748885595706 1554.4177724987794 1550.5606564379887 1546.7035403771974 1542.8464243164062 1538.9893082556155 1535.1321921948243 1531.2750761340335 1527.4179600732423 1523.5608440124515 1519.7037279516603 1515.846611890869 1511.9894958300783 1508.1323797692871 1504.2752637084964 1500.4181476477052 1496.5610315869144 1492.7039155261232 1488.8467994653324 1484.9896834045412 1481.13256734375 1477.2754512829592 1473.418335222168 1469.5612191613773 1465.704103100586 1461.8469870397953 1457.989870979004 1454.1327549182129 1450.275638857422 1446.418522796631 1442.5614067358401 1438.704290675049 1434.8471746142582 1430.990058553467 1427.1329424926757 1423.275826431885 1419.4187103710938 1415.561594310303 1411.7044782495118 1407.847362188721 1403.9902461279298 1400.133130067139 1396.2760140063479 1392.4188979455566 1388.5617818847659 1384.7046658239747 1380.847549763184 1376.9904337023927 1373.133317641602 1369.2762015808107 1365.4190855200195 1361.5619694592287 1357.7048533984375 1353.8477373376468 1349.9906212768556 1346.1335052160648 1342.2763891552736 1338.4192730944824 1334.5621570336916 1330.7050409729004 1326.8479249121096 1322.9908088513184 1319.1336927905277 1315.2765767297365 1311.4194606689457 1307.5623446081545 1303.7052285473633 1299.8481124865725 1295.9909964257813 1292.1338803649905 1288.2767643041993 1284.4196482434086 1280.5625321826174 1276.7054161218261 1272.8483000610354 1268.9911840002442 1265.1340679394534 1261.2769518786622 1257.4198358178714 1253.5627197570802 1249.705603696289 1245.8484876354983 1241.991371574707 1238.1342555139163 1234.277139453125 1230.4200233923343 1226.562907331543 1222.7057912707523 1218.8486752099611 1214.99155914917 1211.1344430883792 1207.277327027588 1203.4202109667972 +continuous continuous F:/DATA/0deg F:/DATA/45deg F:/DATA/90deg F:/DATA/135deg continuous continuous 0.0\ Degrees 45.0\ Degrees 90.0\ Degrees 135.0\ Degrees continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous +meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta +30442.56870 41538.7 F:/DATA/0deg 15.01 43.8794 0.0 Degrees -76.3886 0.00463121 15.1023 0.209341 0.9999 -20.2896 0.00397876 43.8747 0.522661 0.476175 0.371112 0.437823 0.49063 0.554745 0.637403 0.7115 0.787692 0.877086 0.955917 1.00985 1.04048 1.05437 1.06195 1.04376 1.00132 0.953696 0.897934 0.853371 0.8181 0.758444 0.66893 0.578222 0.513116 0.469617 0.431717 0.399153 0.381096 0.379658 0.386007 0.394715 0.409832 0.434376 0.461379 0.491682 0.528336 0.566765 0.617829 0.660426 0.676693 0.688528 0.698699 0.693028 0.672416 0.650183 0.626357 0.588599 0.537606 0.500553 0.477933 0.444328 0.396993 0.361379 0.334361 0.307472 0.280365 0.262548 0.259254 0.27016 0.293092 0.311504 0.319428 0.328142 0.344313 0.35353 0.347677 0.337744 0.328554 0.320071 0.311636 0.303229 0.294363 0.288164 0.290963 0.298723 0.302562 0.305746 0.311551 0.316181 0.317625 0.317585 0.31535 0.308883 0.300091 0.293777 0.288891 0.280275 0.270122 0.262868 0.257575 0.253377 0.254072 0.260834 0.2694 0.274141 0.272837 0.269375 0.267278 0.268401 0.272302 0.275084 0.274906 0.274682 0.277591 0.283677 0.289319 0.2909 0.29067 0.292611 0.295033 0.29774 0.30373 0.311427 0.318378 0.325305 0.33494 0.349067 0.363802 0.374495 0.380321 0.380348 0.373945 0.362572 0.346964 0.32878 0.312591 0.302286 0.297508 0.293882 0.287261 +30445.38885 41538.7 F:/DATA/0deg 14.937 45.3498 0.0 Degrees -81.7675 0.0179421 15.2496 0.813532 0.932453 -61.4211 0.0118946 45.0344 1.59749 0.362758 0.388349 0.448678 0.502106 0.57625 0.666456 0.739631 0.822211 0.917378 0.978589 1.01079 1.03618 1.06373 1.07118 1.04238 1.02539 0.998684 0.937334 0.878587 0.827145 0.765513 0.690886 0.611775 0.547186 0.497125 0.455413 0.425255 0.406234 0.397541 0.399818 0.410452 0.426122 0.449539 0.480137 0.50936 0.535248 0.570625 0.643052 0.710415 0.728708 0.73008 0.720735 0.692803 0.6643 0.646581 0.635799 0.616929 0.571424 0.524703 0.495035 0.45882 0.410674 0.374486 0.34704 0.322182 0.295836 0.274902 0.269342 0.280963 0.306906 0.327077 0.334706 0.341523 0.351947 0.357323 0.354143 0.348662 0.342701 0.331286 0.312221 0.295572 0.287214 0.286729 0.291835 0.2956 0.298683 0.306048 0.316769 0.326264 0.330107 0.325933 0.316999 0.307955 0.301827 0.296864 0.287219 0.275201 0.266729 0.260914 0.257783 0.258419 0.261076 0.263926 0.265956 0.267012 0.267923 0.267989 0.266933 0.267816 0.272044 0.277063 0.280018 0.278512 0.275175 0.276259 0.282366 0.289972 0.298274 0.306977 0.310213 0.306542 0.305823 0.312866 0.322253 0.329395 0.336029 0.348212 0.36371 0.371787 0.371579 0.370461 0.369344 0.363424 0.350018 0.332075 0.314004 0.299888 0.29221 0.287401 0.281542 +30442.56870 41541.6 F:/DATA/0deg 14.1401 42.6338 0.0 Degrees -58.7462 0.0122492 14.3206 0.523046 0.905249 -31.2495 0.0104713 41.9134 1.3098 0.551078 0.366888 0.436718 0.4922 0.570333 0.665755 0.731933 0.793703 0.874753 0.939802 0.973045 1.00317 1.05384 1.09659 1.0494 0.982504 0.951112 0.930256 0.884242 0.812932 0.718398 0.620548 0.541538 0.487752 0.447617 0.414583 0.393359 0.3797 0.368648 0.364984 0.368028 0.373266 0.389188 0.423863 0.463111 0.491777 0.523782 0.597113 0.669128 0.689275 0.700334 0.716811 0.699965 0.654198 0.618993 0.592659 0.569674 0.541336 0.505385 0.465244 0.41113 0.36086 0.328088 0.300319 0.279338 0.264713 0.254155 0.249939 0.253053 0.26557 0.278994 0.284106 0.288887 0.302851 0.316163 0.319715 0.317839 0.311005 0.297548 0.281919 0.275083 0.275594 0.278234 0.283092 0.285054 0.2826 0.283599 0.288333 0.28995 0.292954 0.301358 0.302653 0.290671 0.275303 0.265199 0.259248 0.253187 0.245505 0.238288 0.233159 0.230298 0.233431 0.242936 0.251079 0.25074 0.246158 0.246491 0.252251 0.258739 0.262592 0.263126 0.261565 0.258986 0.257221 0.259425 0.265597 0.271934 0.277727 0.284238 0.288884 0.291186 0.292195 0.291642 0.294834 0.30665 0.321642 0.333238 0.343398 0.355624 0.365643 0.364946 0.352017 0.334117 0.317558 0.303991 0.292883 0.283478 0.278062 0.276618 0.273524 +30445.38885 41541.6 F:/DATA/0deg 13.9496 43.0506 0.0 Degrees -75.6612 0.0247058 14.442 1.05734 0.99419 -87.9694 0.00817012 42.7432 1.04339 0.165709 0.364289 0.430039 0.479588 0.545024 0.634537 0.70997 0.779679 0.863783 0.94209 0.990381 1.01057 1.02089 1.00522 0.963545 0.93713 0.913984 0.894606 0.882765 0.840723 0.756496 0.661105 0.57745 0.520235 0.484333 0.453767 0.426022 0.40593 0.39307 0.38633 0.388912 0.400147 0.418393 0.442809 0.472152 0.50507 0.545308 0.608525 0.658995 0.668915 0.667529 0.67177 0.680816 0.668141 0.637247 0.600074 0.56838 0.544324 0.516345 0.482242 0.438716 0.394992 0.359589 0.330476 0.309209 0.288608 0.269722 0.260508 0.263431 0.281402 0.299949 0.30824 0.314856 0.324372 0.330801 0.330393 0.324864 0.316544 0.306198 0.294661 0.287297 0.286869 0.289681 0.290966 0.292018 0.294566 0.297203 0.29965 0.300448 0.297668 0.29398 0.292749 0.292399 0.288911 0.281672 0.272818 0.262693 0.251497 0.242712 0.238273 0.236373 0.238051 0.245068 0.25349 0.256234 0.254129 0.253284 0.254793 0.257718 0.260684 0.261661 0.259754 0.255988 0.253681 0.256542 0.264176 0.271514 0.275504 0.27729 0.277796 0.278584 0.281959 0.288369 0.297905 0.309119 0.317819 0.324194 0.332646 0.343381 0.350595 0.35063 0.346471 0.338775 0.325357 0.308686 0.294003 0.285865 0.282715 0.276964 0.268188 +30442.56870 41538.7 F:/DATA/45deg 15.1494 44.2385 45.0 Degrees -76.3886 0.00463121 15.1023 0.209341 0.9999 -20.2896 0.00397876 43.8747 0.522661 0.476175 0.377336 0.439666 0.49002 0.563956 0.660936 0.736485 0.813696 0.898564 0.946875 0.973168 0.991494 0.985442 0.962806 0.952871 0.954651 0.953298 0.925729 0.869395 0.801019 0.721718 0.6436 0.575433 0.521471 0.479152 0.444723 0.417651 0.399052 0.393216 0.397473 0.406126 0.418429 0.439925 0.478349 0.526635 0.567238 0.597634 0.634826 0.67449 0.696796 0.709826 0.711861 0.685694 0.648934 0.619005 0.594159 0.571141 0.542178 0.511135 0.481076 0.435568 0.386079 0.353464 0.327502 0.303262 0.281945 0.269814 0.269393 0.280183 0.303669 0.325608 0.336539 0.343106 0.351299 0.358853 0.35684 0.345829 0.330767 0.316134 0.304601 0.296074 0.291513 0.293225 0.298058 0.30057 0.302994 0.30918 0.319126 0.329237 0.331565 0.322586 0.312364 0.30566 0.298175 0.289454 0.281428 0.27237 0.261519 0.252534 0.250261 0.253967 0.259972 0.265984 0.270319 0.270869 0.269002 0.268324 0.269527 0.27059 0.27027 0.271551 0.276131 0.280708 0.283241 0.283516 0.283652 0.287233 0.292733 0.297028 0.299899 0.300786 0.301683 0.306658 0.314625 0.32314 0.33584 0.354726 0.371804 0.379936 0.382574 0.383433 0.377804 0.364445 0.347468 0.329118 0.314569 0.307724 0.304923 0.302209 0.297009 +30445.38885 41538.7 F:/DATA/45deg 15.2875 44.9569 45.0 Degrees -81.7675 0.0179421 15.2496 0.813532 0.932453 -61.4211 0.0118946 45.0344 1.59749 0.362758 0.373372 0.439651 0.491076 0.558625 0.646791 0.717906 0.784819 0.858747 0.913201 0.950156 0.978514 0.984796 0.951858 0.916951 0.91289 0.919005 0.901152 0.855256 0.796243 0.719541 0.640589 0.576895 0.528496 0.484752 0.444527 0.417518 0.405069 0.401538 0.403537 0.409552 0.41841 0.43763 0.473509 0.514442 0.54983 0.589174 0.654441 0.70743 0.721212 0.725349 0.720571 0.701124 0.679499 0.656135 0.623401 0.5791 0.537119 0.512741 0.487286 0.437103 0.388042 0.358509 0.329169 0.301985 0.283898 0.27568 0.275106 0.282658 0.302722 0.3224 0.331447 0.340079 0.353966 0.361564 0.356212 0.344228 0.330366 0.31649 0.303864 0.295138 0.291177 0.294144 0.302761 0.309986 0.31751 0.326917 0.331092 0.328123 0.325258 0.323155 0.317468 0.31105 0.305525 0.297789 0.289208 0.283009 0.277082 0.271337 0.267873 0.265984 0.266734 0.270845 0.275079 0.276982 0.277594 0.278524 0.280259 0.282121 0.28252 0.282672 0.284011 0.285525 0.287971 0.290394 0.291742 0.295466 0.301519 0.304767 0.304124 0.303437 0.305751 0.311215 0.318705 0.329056 0.342525 0.356261 0.36919 0.379202 0.383701 0.384808 0.382156 0.371655 0.35449 0.336352 0.320356 0.308044 0.300557 0.296149 0.292544 +30442.56870 41541.6 F:/DATA/45deg 14.6125 42.0763 45.0 Degrees -58.7462 0.0122492 14.3206 0.523046 0.905249 -31.2495 0.0104713 41.9134 1.3098 0.551078 0.389119 0.445544 0.485541 0.553915 0.653865 0.731596 0.803365 0.884946 0.936008 0.954917 0.964953 0.984912 1.00801 0.980782 0.942851 0.915692 0.876406 0.825238 0.773579 0.705725 0.624102 0.550498 0.49576 0.452223 0.412555 0.382822 0.370514 0.371086 0.373385 0.376612 0.387444 0.413311 0.449748 0.478586 0.499346 0.52767 0.582842 0.641436 0.670345 0.675088 0.661324 0.651612 0.64291 0.626327 0.604868 0.573128 0.530671 0.492236 0.457578 0.409957 0.361159 0.330537 0.305863 0.282402 0.262092 0.248825 0.243218 0.246221 0.265941 0.2905 0.300019 0.302133 0.310658 0.324703 0.329638 0.323319 0.310463 0.294323 0.280664 0.275344 0.272827 0.270643 0.273683 0.280577 0.284722 0.287036 0.290966 0.294219 0.294027 0.294158 0.292939 0.28451 0.271487 0.2601 0.25317 0.25014 0.24764 0.243283 0.240369 0.242942 0.248423 0.252284 0.255611 0.259142 0.257839 0.253574 0.253246 0.255504 0.255108 0.255263 0.260324 0.264893 0.265994 0.267917 0.270336 0.272009 0.276337 0.281935 0.284168 0.285078 0.288866 0.295355 0.303929 0.314657 0.32585 0.337819 0.351032 0.362672 0.370717 0.373443 0.368725 0.35594 0.336142 0.316351 0.304045 0.297267 0.291174 0.285479 0.280263 +30445.38885 41541.6 F:/DATA/45deg 14.7242 41.9525 45.0 Degrees -75.6612 0.0247058 14.442 1.05734 0.99419 -87.9694 0.00817012 42.7432 1.04339 0.165709 0.347388 0.417986 0.466429 0.529663 0.627234 0.705617 0.756152 0.808501 0.864455 0.905033 0.918149 0.911164 0.907354 0.91094 0.906254 0.887299 0.86427 0.844638 0.806725 0.733556 0.644366 0.564421 0.506117 0.467325 0.439901 0.419417 0.404562 0.39636 0.395734 0.401811 0.411786 0.4274 0.452002 0.48188 0.507369 0.529881 0.578444 0.644812 0.67779 0.676721 0.648645 0.630658 0.62943 0.614111 0.586581 0.559287 0.534175 0.501191 0.458397 0.406665 0.370412 0.348979 0.323511 0.297982 0.278727 0.267915 0.263555 0.264894 0.280038 0.30331 0.31639 0.317832 0.318721 0.328812 0.334969 0.331534 0.32236 0.307605 0.289727 0.27839 0.273951 0.272897 0.277684 0.286607 0.293765 0.30021 0.305993 0.308054 0.3081 0.309833 0.309883 0.30392 0.293418 0.281494 0.270728 0.262248 0.254004 0.247883 0.249008 0.255431 0.261482 0.263857 0.263822 0.263879 0.262452 0.260003 0.260052 0.261782 0.263097 0.265527 0.270003 0.273617 0.274701 0.275426 0.276797 0.277906 0.279892 0.284357 0.289455 0.293383 0.296655 0.298979 0.302806 0.311503 0.323659 0.338138 0.353941 0.367608 0.376841 0.379897 0.373673 0.357656 0.336982 0.318498 0.304715 0.295291 0.289609 0.284678 0.277526 +30442.56870 41538.7 F:/DATA/90deg 15.1961 43.4824 90.0 Degrees -76.3886 0.00463121 15.1023 0.209341 0.9999 -20.2896 0.00397876 43.8747 0.522661 0.476175 0.368902 0.438372 0.492153 0.567885 0.669762 0.742155 0.794941 0.861176 0.930482 0.988885 1.02962 1.02009 0.965876 0.937591 0.935554 0.935196 0.911904 0.863324 0.810291 0.747894 0.669335 0.589699 0.527832 0.479695 0.441558 0.417164 0.402744 0.393477 0.390444 0.397836 0.416532 0.447134 0.483572 0.518064 0.55421 0.596613 0.649101 0.681186 0.68997 0.693936 0.685768 0.657023 0.627067 0.600112 0.569499 0.54004 0.521235 0.505447 0.480011 0.433293 0.38531 0.356536 0.334007 0.315706 0.301712 0.292924 0.291435 0.29682 0.312369 0.329807 0.337849 0.344709 0.357139 0.361212 0.354942 0.350001 0.345913 0.337736 0.323516 0.308909 0.299716 0.295209 0.297204 0.309168 0.323565 0.330907 0.331114 0.334148 0.340916 0.339296 0.328863 0.318061 0.312036 0.307005 0.29696 0.286128 0.278593 0.273914 0.273917 0.277968 0.281844 0.284133 0.286396 0.286056 0.280132 0.273835 0.273076 0.277681 0.28477 0.290857 0.289642 0.282045 0.278311 0.282117 0.287577 0.29191 0.297432 0.304126 0.310185 0.31293 0.31173 0.312006 0.316438 0.322641 0.331355 0.344295 0.360731 0.377691 0.387713 0.385419 0.375522 0.364374 0.353014 0.340293 0.326833 0.316392 0.313171 0.316209 0.316435 +30445.38885 41538.7 F:/DATA/90deg 15.7171 46.2162 90.0 Degrees -81.7675 0.0179421 15.2496 0.813532 0.932453 -61.4211 0.0118946 45.0344 1.59749 0.362758 0.378759 0.446921 0.496042 0.5681 0.670591 0.748317 0.804526 0.865812 0.927941 0.980782 1.02235 1.05146 1.04639 1.01122 0.998213 1.00463 0.987795 0.931741 0.868873 0.791929 0.69828 0.611672 0.546357 0.495646 0.456255 0.430355 0.413084 0.402352 0.400384 0.40718 0.421257 0.445298 0.478692 0.513411 0.547629 0.592486 0.664674 0.720569 0.740625 0.757368 0.773026 0.753076 0.701831 0.652761 0.611752 0.580883 0.558214 0.536296 0.508162 0.462325 0.414804 0.381641 0.351225 0.322944 0.300365 0.288298 0.287727 0.298156 0.318103 0.333108 0.342953 0.357636 0.372819 0.373685 0.366295 0.360375 0.355857 0.347442 0.331599 0.316167 0.307649 0.307074 0.314026 0.320913 0.32539 0.330797 0.336262 0.341983 0.347279 0.347051 0.340065 0.329118 0.319157 0.310975 0.302312 0.294814 0.287825 0.27949 0.273677 0.273922 0.279214 0.285222 0.288738 0.289329 0.28667 0.283081 0.282394 0.28517 0.289176 0.291478 0.29131 0.291426 0.293246 0.29563 0.298155 0.301148 0.305488 0.310752 0.314116 0.315557 0.317212 0.319115 0.322802 0.332049 0.345371 0.357762 0.36995 0.383116 0.392597 0.395724 0.392346 0.380975 0.365932 0.353418 0.343479 0.333711 0.32366 0.315235 0.307798 +30442.56870 41541.6 F:/DATA/90deg 14.3815 42.029 90.0 Degrees -58.7462 0.0122492 14.3206 0.523046 0.905249 -31.2495 0.0104713 41.9134 1.3098 0.551078 0.360816 0.425941 0.478186 0.547106 0.63478 0.70018 0.752043 0.817128 0.895035 0.965422 1.01303 1.02639 0.98521 0.941172 0.931696 0.918109 0.87574 0.830734 0.787754 0.725772 0.65236 0.576849 0.508543 0.456728 0.419228 0.393901 0.381879 0.382896 0.389323 0.394503 0.398292 0.406058 0.427531 0.464379 0.505536 0.547918 0.599455 0.637607 0.658213 0.679955 0.693103 0.67028 0.634302 0.605613 0.578909 0.55613 0.533946 0.499611 0.457772 0.408368 0.365494 0.338638 0.317343 0.299565 0.284404 0.271933 0.266007 0.270092 0.285156 0.300885 0.313863 0.328577 0.341314 0.344594 0.339678 0.330122 0.319906 0.307527 0.290429 0.277917 0.27261 0.271769 0.278373 0.287285 0.291475 0.295731 0.303012 0.309659 0.313197 0.315351 0.314063 0.305346 0.295447 0.289041 0.280373 0.270637 0.26438 0.257984 0.250837 0.247063 0.248386 0.253678 0.259139 0.261999 0.264385 0.268159 0.271457 0.272935 0.272924 0.271812 0.270325 0.269371 0.268296 0.266525 0.266943 0.271586 0.277418 0.281219 0.284182 0.288751 0.294846 0.30125 0.30835 0.317413 0.32629 0.331988 0.339166 0.351448 0.361566 0.363381 0.358902 0.350061 0.336083 0.319242 0.30553 0.296127 0.288021 0.281336 0.275996 +30445.38885 41541.6 F:/DATA/90deg 14.8772 44.0914 90.0 Degrees -75.6612 0.0247058 14.442 1.05734 0.99419 -87.9694 0.00817012 42.7432 1.04339 0.165709 0.372922 0.440129 0.491425 0.565563 0.664742 0.744406 0.812642 0.879985 0.9443 0.997919 1.02108 1.0208 1.01118 0.992799 0.990422 0.990413 0.959524 0.908575 0.846463 0.764785 0.680907 0.601727 0.533175 0.482011 0.444431 0.416605 0.396976 0.387638 0.389774 0.400071 0.412592 0.427854 0.451896 0.486424 0.524783 0.56458 0.612518 0.648384 0.672794 0.707616 0.743401 0.720699 0.666646 0.632288 0.608868 0.580788 0.544144 0.517258 0.496345 0.454859 0.401254 0.363394 0.336779 0.31737 0.298447 0.282791 0.27747 0.281156 0.292731 0.30713 0.321053 0.3364 0.350187 0.352563 0.345869 0.337305 0.331223 0.325295 0.310666 0.293918 0.286742 0.288683 0.297342 0.306708 0.311023 0.312968 0.31658 0.321617 0.324598 0.324588 0.32076 0.311206 0.300127 0.291595 0.285567 0.28159 0.275993 0.266271 0.25822 0.2561 0.258284 0.261626 0.263896 0.265846 0.269505 0.274056 0.275722 0.273742 0.273311 0.275347 0.275451 0.27457 0.275309 0.276385 0.277319 0.279464 0.283078 0.28736 0.291818 0.295646 0.297174 0.298041 0.303088 0.313699 0.326778 0.340377 0.355253 0.369223 0.377385 0.377423 0.369946 0.358161 0.344675 0.330126 0.317424 0.307396 0.296555 0.285616 0.278061 +30442.56870 41538.7 F:/DATA/135deg 15.0537 43.8985 135.0 Degrees -76.3886 0.00463121 15.1023 0.209341 0.9999 -20.2896 0.00397876 43.8747 0.522661 0.476175 0.394983 0.462253 0.510972 0.581948 0.673291 0.739958 0.805694 0.880326 0.940708 0.995982 1.02477 0.998877 0.959812 0.959682 0.975619 0.953116 0.88809 0.829165 0.785295 0.732609 0.65831 0.575513 0.512899 0.473607 0.446186 0.424794 0.407268 0.396426 0.395532 0.399085 0.402006 0.417444 0.454143 0.492837 0.523594 0.557207 0.60824 0.653507 0.675255 0.694238 0.708906 0.684942 0.648251 0.629064 0.61119 0.582089 0.547951 0.525144 0.509204 0.471032 0.411652 0.368016 0.335632 0.30892 0.289468 0.279835 0.277619 0.281124 0.296966 0.319959 0.337068 0.350057 0.359253 0.359809 0.355506 0.347917 0.338122 0.326939 0.312685 0.300793 0.295596 0.294554 0.297227 0.305628 0.316033 0.323358 0.327222 0.331066 0.333891 0.330739 0.324674 0.31839 0.310238 0.300233 0.288143 0.275073 0.265715 0.263189 0.264256 0.26575 0.26982 0.275335 0.27848 0.279709 0.279535 0.276787 0.275049 0.278292 0.281451 0.280752 0.282022 0.286062 0.287624 0.28587 0.285832 0.291707 0.298962 0.30133 0.30224 0.306114 0.310942 0.314851 0.318807 0.324493 0.333775 0.345931 0.35927 0.372685 0.380984 0.379747 0.370907 0.357989 0.346044 0.337496 0.3275 0.314784 0.305689 0.301549 0.296355 +30445.38885 41538.7 F:/DATA/135deg 15.0569 43.6148 135.0 Degrees -81.7675 0.0179421 15.2496 0.813532 0.932453 -61.4211 0.0118946 45.0344 1.59749 0.362758 0.365999 0.440015 0.496638 0.564359 0.654793 0.740905 0.819214 0.884796 0.936964 0.990629 1.0253 1.01497 0.980588 0.963645 0.9588 0.95242 0.931435 0.892759 0.839725 0.76759 0.684469 0.605901 0.547412 0.504389 0.468307 0.440755 0.420748 0.408086 0.40592 0.413487 0.426507 0.447507 0.478889 0.512279 0.536953 0.5555 0.594798 0.647955 0.677816 0.693255 0.697742 0.687231 0.659529 0.624584 0.595735 0.574696 0.546532 0.511675 0.477232 0.433303 0.393663 0.368977 0.345967 0.325544 0.31004 0.298911 0.293296 0.293739 0.307858 0.333703 0.352011 0.358578 0.360506 0.362438 0.362047 0.359698 0.354529 0.341936 0.323023 0.308327 0.302042 0.301874 0.306835 0.315179 0.321815 0.326268 0.33061 0.33249 0.330568 0.329372 0.328073 0.322356 0.314339 0.306748 0.297762 0.286124 0.273807 0.266053 0.267067 0.274012 0.282165 0.287391 0.289187 0.290655 0.29102 0.287598 0.283058 0.281469 0.282354 0.283424 0.283345 0.282428 0.28309 0.285216 0.28675 0.289434 0.296319 0.305611 0.311359 0.312518 0.313577 0.316448 0.321949 0.330569 0.338646 0.344684 0.352932 0.364074 0.374051 0.37996 0.37873 0.369088 0.354536 0.338186 0.322516 0.311193 0.306951 0.30644 0.301477 +30442.56870 41541.6 F:/DATA/135deg 14.1485 40.9145 135.0 Degrees -58.7462 0.0122492 14.3206 0.523046 0.905249 -31.2495 0.0104713 41.9134 1.3098 0.551078 0.362506 0.42431 0.483474 0.555827 0.643321 0.723745 0.797505 0.87406 0.946252 1.00287 1.02362 0.999349 0.965943 0.92913 0.897639 0.8773 0.845932 0.804291 0.751793 0.677094 0.597635 0.531359 0.481775 0.441407 0.408499 0.389937 0.38149 0.373911 0.368414 0.372008 0.385622 0.409152 0.438358 0.465221 0.491179 0.528195 0.590136 0.62821 0.629994 0.634744 0.645695 0.642101 0.622475 0.600765 0.578466 0.548766 0.503252 0.463373 0.439866 0.410945 0.37134 0.33978 0.315258 0.296079 0.278928 0.264739 0.258311 0.261611 0.276594 0.294282 0.30759 0.320851 0.334036 0.337852 0.331468 0.320554 0.309609 0.299098 0.285469 0.272167 0.264852 0.264802 0.272599 0.282234 0.288077 0.296675 0.3104 0.317716 0.313999 0.31038 0.307808 0.300002 0.288549 0.277631 0.26912 0.263369 0.257591 0.249937 0.24667 0.250234 0.253378 0.25388 0.255621 0.257824 0.258182 0.258345 0.259936 0.262058 0.262793 0.263169 0.264241 0.263956 0.262274 0.261871 0.263836 0.268362 0.273987 0.277642 0.28046 0.28473 0.289414 0.293796 0.298664 0.306103 0.316412 0.325534 0.331438 0.337454 0.346556 0.355802 0.358921 0.35264 0.337653 0.31839 0.301186 0.288746 0.282395 0.282496 0.281953 +30445.38885 41541.6 F:/DATA/135deg 14.2168 41.8786 135.0 Degrees -75.6612 0.0247058 14.442 1.05734 0.99419 -87.9694 0.00817012 42.7432 1.04339 0.165709 0.365088 0.440271 0.497404 0.567672 0.65651 0.721782 0.776906 0.855485 0.94319 0.996399 0.991826 0.963243 0.957156 0.945359 0.919683 0.904569 0.896784 0.871471 0.818724 0.750061 0.67377 0.594496 0.53221 0.486202 0.449558 0.426752 0.414796 0.406554 0.400798 0.401201 0.41174 0.434354 0.458838 0.477074 0.49636 0.523076 0.57505 0.632194 0.657493 0.661397 0.645714 0.623273 0.617458 0.61944 0.610587 0.577368 0.530479 0.493425 0.45932 0.417305 0.384703 0.359502 0.329322 0.30436 0.289143 0.279825 0.274673 0.274856 0.288605 0.311774 0.327171 0.331064 0.328918 0.330314 0.332712 0.330434 0.322257 0.309002 0.295278 0.286974 0.2845 0.286303 0.290523 0.295618 0.301218 0.307725 0.314978 0.319498 0.31838 0.315693 0.313316 0.30746 0.297921 0.286659 0.276992 0.271773 0.268008 0.26394 0.260854 0.258883 0.258675 0.260581 0.263667 0.266189 0.266595 0.26637 0.267031 0.268828 0.270966 0.271767 0.271811 0.272637 0.274756 0.278331 0.282276 0.285504 0.289044 0.29263 0.292468 0.288659 0.286731 0.288407 0.292602 0.301398 0.312545 0.32085 0.329581 0.341775 0.352343 0.356867 0.355432 0.349165 0.338862 0.324998 0.310462 0.298533 0.288303 0.279743 0.275122 diff --git a/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin_model-results.tab b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin_model-results.tab index d23cf0c89..713fd5f81 100644 --- a/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin_model-results.tab +++ b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin_model-results.tab @@ -1,19 +1,19 @@ -1697.131066748047 1693.2739506872558 1689.416834626465 1685.5597185656738 1681.702602504883 1677.8454864440919 1673.9883703833011 1670.13125432251 1666.2741382617191 1662.417022200928 1658.5599061401367 1654.702790079346 1650.8456740185547 1646.988557957764 1643.1314418969728 1639.274325836182 1635.4172097753908 1631.5600937145996 1627.7029776538088 1623.8458615930176 1619.9887455322269 1616.1316294714356 1612.2745134106449 1608.4173973498537 1604.5602812890625 1600.7031652282717 1596.8460491674805 1592.9889331066897 1589.1318170458985 1585.2747009851078 1581.4175849243165 1577.5604688635258 1573.7033528027346 1569.8462367419434 1565.9891206811526 1562.1320046203614 1558.2748885595706 1554.4177724987794 1550.5606564379887 1546.7035403771974 1542.8464243164062 1538.9893082556155 1535.1321921948243 1531.2750761340335 1527.4179600732423 1523.5608440124515 1519.7037279516603 1515.846611890869 1511.9894958300783 1508.1323797692871 1504.2752637084964 1500.4181476477052 1496.5610315869144 1492.7039155261232 1488.8467994653324 1484.9896834045412 1481.13256734375 1477.2754512829592 1473.418335222168 1469.5612191613773 1465.704103100586 1461.8469870397953 1457.989870979004 1454.1327549182129 1450.275638857422 1446.418522796631 1442.5614067358401 1438.704290675049 1434.8471746142582 1430.990058553467 1427.1329424926757 1423.275826431885 1419.4187103710938 1415.561594310303 1411.7044782495118 1407.847362188721 1403.9902461279298 1400.133130067139 1396.2760140063479 1392.4188979455566 1388.5617818847659 1384.7046658239747 1380.847549763184 1376.9904337023927 1373.133317641602 1369.2762015808107 1365.4190855200195 1361.5619694592287 1357.7048533984375 1353.8477373376468 1349.9906212768556 1346.1335052160648 1342.2763891552736 1338.4192730944824 1334.5621570336916 1330.7050409729004 1326.8479249121096 1322.9908088513184 1319.1336927905277 1315.2765767297365 1311.4194606689457 1307.5623446081545 1303.7052285473633 1299.8481124865725 1295.9909964257813 1292.1338803649905 1288.2767643041993 1284.4196482434086 1280.5625321826174 1276.7054161218261 1272.8483000610354 1268.9911840002442 1265.1340679394534 1261.2769518786622 1257.4198358178714 1253.5627197570802 1249.705603696289 1245.8484876354983 1241.991371574707 1238.1342555139163 1234.277139453125 1230.4200233923343 1226.562907331543 1222.7057912707523 1218.8486752099611 1214.99155914917 1211.1344430883792 1207.277327027588 1203.4202109667972 map_x map_y 1214.0 - 1258.0 1500.0 - 1580.0 Polarisation Angle R-squared (1214.0 - 1258.0) a0 (1214.0 - 1258.0) a1 (1214.0 - 1258.0) a2 (1214.0 - 1258.0) R-squared (1500.0 - 1580.0) a0 (1500.0 - 1580.0) a1 (1500.0 - 1580.0) a2 (1500.0 - 1580.0) -continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous 0.0\ Degrees 45.0\ Degrees 90.0\ Degrees 135.0\ Degrees continuous continuous continuous continuous continuous continuous continuous continuous - meta meta meta meta meta meta meta meta meta meta meta meta meta -0.3711118698120117 0.43782272934913635 0.49062955379486084 0.5547452569007874 0.6374028921127319 0.711500346660614 0.7876919507980347 0.8770861625671387 0.9559172987937927 1.0098530054092407 1.0404753684997559 1.0543735027313232 1.0619465112686157 1.0437582731246948 1.0013220310211182 0.9536964297294617 0.897933840751648 0.8533709645271301 0.8181004524230957 0.7584443688392639 0.6689296364784241 0.5782220363616943 0.513115644454956 0.46961721777915955 0.43171659111976624 0.3991532325744629 0.3810955286026001 0.37965840101242065 0.386007159948349 0.3947145342826843 0.4098324477672577 0.4343760311603546 0.46137940883636475 0.49168214201927185 0.528336226940155 0.5667646527290344 0.6178287267684937 0.6604256629943848 0.6766932010650635 0.6885275840759277 0.6986993551254272 0.6930281519889832 0.6724157929420471 0.6501829028129578 0.6263569593429565 0.5885990858078003 0.5376056432723999 0.5005533695220947 0.4779326319694519 0.4443279504776001 0.39699268341064453 0.36137861013412476 0.33436083793640137 0.30747178196907043 0.2803654670715332 0.2625480592250824 0.2592535614967346 0.27015992999076843 0.29309216141700745 0.31150364875793457 0.3194276988506317 0.328142374753952 0.3443129062652588 0.35353028774261475 0.3476772606372833 0.33774372935295105 0.32855379581451416 0.3200712502002716 0.31163617968559265 0.3032289445400238 0.2943628430366516 0.28816357254981995 0.2909632623195648 0.29872336983680725 0.3025616407394409 0.3057458698749542 0.3115512728691101 0.31618112325668335 0.3176253139972687 0.3175846040248871 0.3153497576713562 0.3088831901550293 0.3000914454460144 0.29377707839012146 0.2888909578323364 0.28027477860450745 0.270122230052948 0.26286780834198 0.2575746774673462 0.2533765435218811 0.2540722191333771 0.26083439588546753 0.2694004774093628 0.27414125204086304 0.2728372812271118 0.26937466859817505 0.2672775387763977 0.2684006989002228 0.2723020315170288 0.27508431673049927 0.2749064266681671 0.274681955575943 0.2775912284851074 0.28367695212364197 0.2893185019493103 0.290900319814682 0.2906703054904938 0.2926110625267029 0.2950325608253479 0.2977401614189148 0.3037301301956177 0.3114270567893982 0.318378210067749 0.32530495524406433 0.3349395990371704 0.3490666151046753 0.3638021945953369 0.3744945526123047 0.3803212642669678 0.3803481459617615 0.37394478917121887 0.3625723719596863 0.34696418046951294 0.3287803828716278 0.31259098649024963 0.3022864758968353 0.2975075840950012 0.2938818633556366 0.2872605323791504 30442.5687 41538.7379 15.009961445779307 43.87936019111817 0.0 Degrees 0.9998996542510169 0.04788184003105633 -0.0930766425798808 15.10229663993498 0.4761749412326489 0.1699951093342037 0.198482528841064 43.874691613741085 -0.388348788022995 0.44867801666259766 0.502106249332428 0.5762503743171692 0.6664558053016663 0.739630937576294 0.8222108483314514 0.9173783659934998 0.9785887002944946 1.0107851028442383 1.0361779928207397 1.0637257099151611 1.0711760520935059 1.0423812866210938 1.025393009185791 0.9986843466758728 0.9373337626457214 0.8785869479179382 0.8271448612213135 0.7655133605003357 0.6908860802650452 0.6117749810218811 0.5471857190132141 0.4971246123313904 0.45541316270828247 0.42525458335876465 0.4062337279319763 0.39754077792167664 0.39981767535209656 0.41045162081718445 0.42612242698669434 0.4495392143726349 0.48013657331466675 0.509360134601593 0.5352477431297302 0.5706249475479126 0.6430520415306091 0.7104148864746094 0.7287077903747559 0.7300795912742615 0.7207353115081787 0.6928030848503113 0.6642997860908508 0.6465807557106018 0.6357985734939575 0.6169293522834778 0.5714240670204163 0.5247028470039368 0.49503496289253235 0.4588204622268677 0.41067439317703247 0.37448638677597046 0.34704023599624634 0.32218214869499207 0.29583585262298584 0.27490201592445374 0.26934197545051575 0.28096309304237366 0.3069058060646057 0.3270772397518158 0.33470597863197327 0.34152284264564514 0.35194724798202515 0.3573232889175415 0.3541431128978729 0.34866204857826233 0.3427005112171173 0.3312859833240509 0.3122206926345825 0.2955722510814667 0.2872144877910614 0.2867285907268524 0.2918354272842407 0.2956002652645111 0.2986833155155182 0.3060479462146759 0.31676867604255676 0.3262639045715332 0.330106645822525 0.32593291997909546 0.31699928641319275 0.30795541405677795 0.3018266558647156 0.29686442017555237 0.28721868991851807 0.2752007842063904 0.2667289972305298 0.2609139084815979 0.25778260827064514 0.2584190368652344 0.2610763907432556 0.2639258801937103 0.26595649123191833 0.26701226830482483 0.2679225206375122 0.2679891288280487 0.2669326663017273 0.2678163945674896 0.2720436155796051 0.2770630121231079 0.28001782298088074 0.27851158380508423 0.2751752436161041 0.276258647441864 0.2823660373687744 0.2899717390537262 0.29827389121055603 0.30697736144065857 0.3102128207683563 0.30654236674308777 0.30582261085510254 0.3128655254840851 0.3222534656524658 0.32939496636390686 0.33602944016456604 0.34821176528930664 0.3637096881866455 0.37178686261177063 0.3715791702270508 0.37046146392822266 0.36934414505958557 0.36342424154281616 0.350017786026001 0.33207470178604126 0.3140036165714264 0.2998875081539154 0.29220956563949585 0.2874009907245636 0.2815419137477875 30445.38885 41538.7379 14.936959331411803 45.349811063094954 0.0 Degrees 0.9324530395726834 0.11528954707161643 -0.3900859865428774 15.249631354870715 0.36275784996581106 0.671080814707999 -0.43318106508974763 45.03441323505067 -0.366887629032135 0.43671754002571106 0.49220016598701477 0.5703327059745789 0.6657547950744629 0.731933057308197 0.7937033176422119 0.8747525215148926 0.9398021697998047 0.9730452299118042 1.0031681060791016 1.0538406372070312 1.0965853929519653 1.0494016408920288 0.9825043678283691 0.9511120319366455 0.9302560687065125 0.8842418789863586 0.8129315972328186 0.7183979153633118 0.6205475330352783 0.5415375232696533 0.48775240778923035 0.44761666655540466 0.41458284854888916 0.39335882663726807 0.3796997666358948 0.36864838004112244 0.36498430371284485 0.3680277466773987 0.3732655644416809 0.38918817043304443 0.42386338114738464 0.46311137080192566 0.4917769134044647 0.5237820148468018 0.5971131920814514 0.6691277027130127 0.6892750859260559 0.7003340125083923 0.7168111801147461 0.6999649405479431 0.6541981101036072 0.6189929246902466 0.5926592946052551 0.5696735382080078 0.5413363575935364 0.5053853988647461 0.465243935585022 0.41113007068634033 0.36086025834083557 0.32808783650398254 0.3003191649913788 0.2793380916118622 0.26471295952796936 0.2541550099849701 0.24993854761123657 0.25305330753326416 0.2655698359012604 0.27899375557899475 0.2841063439846039 0.28888702392578125 0.30285078287124634 0.3161625862121582 0.3197145164012909 0.3178388774394989 0.31100529432296753 0.29754751920700073 0.28191861510276794 0.2750825583934784 0.27559351921081543 0.27823397517204285 0.2830919921398163 0.2850538194179535 0.2825995981693268 0.28359857201576233 0.2883332371711731 0.289949893951416 0.2929544150829315 0.30135759711265564 0.30265331268310547 0.2906714677810669 0.2753030061721802 0.2651992440223694 0.25924843549728394 0.25318726897239685 0.24550479650497437 0.23828820884227753 0.23315896093845367 0.23029816150665283 0.2334306240081787 0.24293583631515503 0.2510787546634674 0.25073981285095215 0.24615781009197235 0.2464907467365265 0.2522513270378113 0.2587389051914215 0.262591689825058 0.263126403093338 0.26156532764434814 0.2589862048625946 0.2572213411331177 0.2594248950481415 0.2655974328517914 0.27193424105644226 0.27772676944732666 0.28423818945884705 0.28888431191444397 0.29118603467941284 0.2921951413154602 0.29164180159568787 0.2948339283466339 0.3066503405570984 0.32164159417152405 0.333238422870636 0.34339842200279236 0.355623722076416 0.36564287543296814 0.36494630575180054 0.35201695561408997 0.3341171145439148 0.3175579309463501 0.30399125814437866 0.2928829789161682 0.28347793221473694 0.2780621647834778 0.276618093252182 0.27352389693260193 30442.5687 41541.616519999996 14.140093941838566 42.63377488797279 0.0 Degrees 0.9052486894719146 0.23198983049333044 -0.12072690257494645 14.320648710203532 0.5510780301748821 0.5808993859007311 0.3024109496913203 41.91339873814995 -0.36428871750831604 0.43003931641578674 0.47958770394325256 0.5450240969657898 0.634536862373352 0.7099695801734924 0.7796786427497864 0.8637834787368774 0.942089855670929 0.9903811812400818 1.0105667114257812 1.0208871364593506 1.005222201347351 0.963545024394989 0.9371297359466553 0.9139838814735413 0.8946059942245483 0.8827653527259827 0.840722918510437 0.7564958333969116 0.6611053943634033 0.5774503946304321 0.5202354192733765 0.48433250188827515 0.45376747846603394 0.4260224401950836 0.4059300422668457 0.3930695950984955 0.38632991909980774 0.3889123797416687 0.4001465141773224 0.4183931052684784 0.4428093135356903 0.47215187549591064 0.5050704479217529 0.5453080534934998 0.6085248589515686 0.658994734287262 0.668915331363678 0.6675289869308472 0.6717699766159058 0.6808158755302429 0.6681414842605591 0.6372467875480652 0.6000738739967346 0.5683797597885132 0.544323742389679 0.516345202922821 0.48224183917045593 0.4387160539627075 0.39499184489250183 0.3595888912677765 0.3304763436317444 0.3092094361782074 0.28860795497894287 0.26972246170043945 0.2605076730251312 0.26343077421188354 0.28140151500701904 0.29994896054267883 0.30823972821235657 0.31485551595687866 0.32437241077423096 0.33080095052719116 0.3303925395011902 0.3248642385005951 0.3165438175201416 0.3061983585357666 0.2946605384349823 0.2872968912124634 0.2868692874908447 0.2896806299686432 0.2909656763076782 0.2920180857181549 0.2945660948753357 0.2972028851509094 0.29964983463287354 0.3004482090473175 0.29766783118247986 0.2939799129962921 0.2927486002445221 0.2923987805843353 0.2889113426208496 0.2816716730594635 0.27281782031059265 0.2626931965351105 0.2514967918395996 0.24271203577518463 0.23827271163463593 0.23637256026268005 0.2380509227514267 0.24506837129592896 0.25348952412605286 0.25623422861099243 0.25412917137145996 0.2532842457294464 0.2547925114631653 0.2577175199985504 0.26068350672721863 0.2616606056690216 0.2597542703151703 0.2559884488582611 0.2536808252334595 0.256541907787323 0.2641761898994446 0.271513968706131 0.2755036950111389 0.27728980779647827 0.27779620885849 0.27858373522758484 0.28195881843566895 0.28836870193481445 0.29790475964546204 0.3091188371181488 0.317819207906723 0.3241935074329376 0.33264613151550293 0.3433806300163269 0.3505949378013611 0.35062962770462036 0.34647127985954285 0.3387751281261444 0.32535696029663086 0.3086860477924347 0.2940033972263336 0.2858646810054779 0.2827148139476776 0.2769644856452942 0.26818761229515076 30445.38885 41541.616519999996 13.949567230311496 43.05058779046659 0.0 Degrees 0.9941901147353087 0.2536980425498405 -0.46382002276927525 14.441964377513065 0.1657092533769018 0.03694686596283513 -0.5203849464554426 42.743246117510395 -0.3773364722728729 0.43966636061668396 0.49002042412757874 0.5639562606811523 0.6609355807304382 0.7364853620529175 0.8136956691741943 0.8985644578933716 0.9468745589256287 0.9731678366661072 0.9914941191673279 0.9854417443275452 0.9628058671951294 0.9528713226318359 0.9546505808830261 0.9532977342605591 0.9257292151451111 0.8693946599960327 0.8010186553001404 0.7217180728912354 0.6436004638671875 0.5754334926605225 0.5214712619781494 0.47915247082710266 0.4447232484817505 0.41765138506889343 0.3990515470504761 0.39321616291999817 0.39747321605682373 0.40612584352493286 0.4184291958808899 0.43992483615875244 0.47834911942481995 0.5266345739364624 0.5672381520271301 0.597634494304657 0.6348262429237366 0.6744903922080994 0.6967960000038147 0.7098262310028076 0.7118614912033081 0.6856943368911743 0.6489338874816895 0.6190053224563599 0.5941586494445801 0.5711410641670227 0.5421783328056335 0.5111346244812012 0.4810764491558075 0.4355677664279938 0.3860788941383362 0.3534643054008484 0.32750168442726135 0.3032616674900055 0.2819446921348572 0.26981374621391296 0.2693929970264435 0.2801830768585205 0.30366891622543335 0.3256083130836487 0.3365386128425598 0.34310561418533325 0.35129883885383606 0.3588528633117676 0.35683950781822205 0.3458286225795746 0.33076736330986023 0.31613433361053467 0.30460110306739807 0.2960743308067322 0.2915134131908417 0.29322516918182373 0.2980576753616333 0.300569623708725 0.3029937744140625 0.3091799318790436 0.3191257119178772 0.32923704385757446 0.3315645456314087 0.3225858509540558 0.31236401200294495 0.3056598901748657 0.2981754243373871 0.2894536256790161 0.2814278304576874 0.2723696827888489 0.26151928305625916 0.2525339126586914 0.25026053190231323 0.2539668083190918 0.25997182726860046 0.26598429679870605 0.27031874656677246 0.27086934447288513 0.2690020799636841 0.26832443475723267 0.2695266008377075 0.2705895006656647 0.2702696919441223 0.27155083417892456 0.2761310338973999 0.28070759773254395 0.2832408547401428 0.2835163474082947 0.28365248441696167 0.2872329354286194 0.29273301362991333 0.29702767729759216 0.2998993694782257 0.30078554153442383 0.3016831874847412 0.30665796995162964 0.31462526321411133 0.32313990592956543 0.3358403742313385 0.3547256886959076 0.3718043267726898 0.3799355626106262 0.3825741112232208 0.383433073759079 0.3778041899204254 0.3644450008869171 0.3474675118923187 0.3291182518005371 0.3145691752433777 0.3077240586280823 0.3049233853816986 0.3022094964981079 0.2970089614391327 30442.5687 41538.7379 15.14943703154183 44.23850067435577 45.0 Degrees 0.9998996542510169 0.04788184003105633 -0.0930766425798808 15.10229663993498 0.4761749412326489 0.1699951093342037 0.198482528841064 43.874691613741085 -0.37337228655815125 0.4396507143974304 0.49107563495635986 0.5586245059967041 0.646790623664856 0.7179062962532043 0.7848191857337952 0.8587467670440674 0.9132012128829956 0.9501560926437378 0.9785140156745911 0.984795868396759 0.9518576860427856 0.9169514179229736 0.9128903150558472 0.9190047979354858 0.9011522531509399 0.8552564978599548 0.7962431311607361 0.7195406556129456 0.6405887007713318 0.5768947005271912 0.5284963250160217 0.48475223779678345 0.44452735781669617 0.4175184965133667 0.4050688147544861 0.4015383720397949 0.4035366475582123 0.4095524847507477 0.41840967535972595 0.43762996792793274 0.4735090136528015 0.5144422650337219 0.5498296618461609 0.5891739130020142 0.6544406414031982 0.7074301838874817 0.721211850643158 0.7253494262695312 0.7205705046653748 0.7011243104934692 0.6794993877410889 0.6561350226402283 0.6234012842178345 0.5791003108024597 0.5371192693710327 0.5127407312393188 0.48728594183921814 0.43710267543792725 0.3880417048931122 0.358508825302124 0.3291686475276947 0.30198532342910767 0.2838975191116333 0.2756803035736084 0.27510562539100647 0.28265753388404846 0.30272212624549866 0.3223998248577118 0.3314470052719116 0.3400789797306061 0.3539663255214691 0.3615642189979553 0.35621216893196106 0.34422820806503296 0.33036601543426514 0.3164904713630676 0.30386441946029663 0.29513826966285706 0.2911766767501831 0.2941439151763916 0.302760511636734 0.30998602509498596 0.31750985980033875 0.32691699266433716 0.33109205961227417 0.3281230330467224 0.32525792717933655 0.32315510511398315 0.3174678683280945 0.31104981899261475 0.3055250942707062 0.297789067029953 0.28920844197273254 0.28300905227661133 0.27708175778388977 0.27133673429489136 0.26787322759628296 0.2659844756126404 0.26673445105552673 0.2708447575569153 0.2750791013240814 0.2769821286201477 0.2775936722755432 0.278523713350296 0.2802591919898987 0.2821207642555237 0.282520055770874 0.28267189860343933 0.2840110957622528 0.28552529215812683 0.28797078132629395 0.2903944253921509 0.29174160957336426 0.2954663932323456 0.30151888728141785 0.30476686358451843 0.30412399768829346 0.30343693494796753 0.30575087666511536 0.31121543049812317 0.3187049329280853 0.3290562331676483 0.3425249457359314 0.3562610149383545 0.36918962001800537 0.3792024254798889 0.3837013840675354 0.3848077654838562 0.3821556568145752 0.3716545104980469 0.3544897437095642 0.33635222911834717 0.3203563988208771 0.30804407596588135 0.3005572259426117 0.2961486577987671 0.29254403710365295 30445.38885 41538.7379 15.287506938801155 44.956915156436416 45.0 Degrees 0.9324530395726834 0.11528954707161643 -0.3900859865428774 15.249631354870715 0.36275784996581106 0.671080814707999 -0.43318106508974763 45.03441323505067 -0.38911929726600647 0.44554373621940613 0.4855414927005768 0.5539154410362244 0.6538650989532471 0.7315957546234131 0.8033648729324341 0.884945809841156 0.9360079765319824 0.954917311668396 0.9649530649185181 0.9849116206169128 1.008013129234314 0.9807816743850708 0.9428510069847107 0.9156916737556458 0.8764055967330933 0.825237512588501 0.7735792994499207 0.705725371837616 0.6241020560264587 0.5504984855651855 0.4957604706287384 0.45222288370132446 0.41255465149879456 0.3828220069408417 0.37051448225975037 0.37108558416366577 0.37338513135910034 0.37661170959472656 0.3874439001083374 0.41331085562705994 0.449747771024704 0.47858643531799316 0.4993457794189453 0.5276702642440796 0.5828417539596558 0.6414362788200378 0.6703454852104187 0.6750879287719727 0.6613235473632812 0.6516115069389343 0.6429095268249512 0.6263266801834106 0.6048684120178223 0.5731279253959656 0.5306711196899414 0.492236465215683 0.45757782459259033 0.40995675325393677 0.3611593246459961 0.33053696155548096 0.3058626651763916 0.2824017405509949 0.2620924711227417 0.24882546067237854 0.24321754276752472 0.24622128903865814 0.2659408152103424 0.29050007462501526 0.3000190854072571 0.30213284492492676 0.3106580674648285 0.3247032165527344 0.3296380937099457 0.3233187794685364 0.3104628324508667 0.29432252049446106 0.2806641161441803 0.2753435969352722 0.2728271782398224 0.270643025636673 0.2736828327178955 0.2805771827697754 0.28472232818603516 0.2870364487171173 0.2909660339355469 0.29421940445899963 0.2940268814563751 0.29415833950042725 0.2929386496543884 0.2845102548599243 0.27148693799972534 0.26009973883628845 0.25316986441612244 0.25014013051986694 0.24763965606689453 0.24328280985355377 0.24036899209022522 0.2429419606924057 0.24842298030853271 0.25228366255760193 0.25561103224754333 0.25914180278778076 0.25783947110176086 0.253574401140213 0.2532463073730469 0.25550371408462524 0.2551080286502838 0.2552626430988312 0.2603242099285126 0.2648930549621582 0.26599374413490295 0.26791733503341675 0.27033597230911255 0.27200937271118164 0.27633726596832275 0.281934916973114 0.28416839241981506 0.2850780189037323 0.28886574506759644 0.29535502195358276 0.30392923951148987 0.3146568834781647 0.3258497714996338 0.3378189206123352 0.3510323464870453 0.3626718819141388 0.3707166612148285 0.37344253063201904 0.3687247931957245 0.3559401333332062 0.336141973733902 0.31635063886642456 0.30404531955718994 0.2972669005393982 0.29117393493652344 0.28547903895378113 0.2802625894546509 30442.5687 41541.616519999996 14.612466406432896 42.07633292374312 45.0 Degrees 0.9052486894719146 0.23198983049333044 -0.12072690257494645 14.320648710203532 0.5510780301748821 0.5808993859007311 0.3024109496913203 41.91339873814995 -0.34738847613334656 0.4179860055446625 0.4664291739463806 0.5296632647514343 0.6272340416908264 0.7056167125701904 0.7561516165733337 0.8085007667541504 0.8644552826881409 0.9050332307815552 0.9181493520736694 0.9111636281013489 0.9073537588119507 0.9109403491020203 0.9062535762786865 0.8872991800308228 0.8642696738243103 0.8446381688117981 0.8067254424095154 0.7335556745529175 0.6443662047386169 0.5644205808639526 0.506117045879364 0.467324823141098 0.43990078568458557 0.4194169044494629 0.4045620858669281 0.39635950326919556 0.3957340121269226 0.40181082487106323 0.4117859899997711 0.4274001121520996 0.4520021080970764 0.48187950253486633 0.5073687434196472 0.5298813581466675 0.5784440636634827 0.6448124051094055 0.6777898669242859 0.6767211556434631 0.648645281791687 0.6306580901145935 0.6294295191764832 0.6141109466552734 0.586581289768219 0.5592874884605408 0.5341745018959045 0.5011913180351257 0.4583965539932251 0.4066646993160248 0.3704123795032501 0.3489791750907898 0.3235110640525818 0.29798153042793274 0.2787266969680786 0.26791489124298096 0.2635549306869507 0.2648940086364746 0.2800384759902954 0.30330970883369446 0.3163895010948181 0.31783244013786316 0.3187214732170105 0.3288123607635498 0.33496859669685364 0.3315340280532837 0.32235997915267944 0.30760458111763 0.289726585149765 0.27839016914367676 0.2739510238170624 0.272896945476532 0.27768412232398987 0.286607027053833 0.29376494884490967 0.30020976066589355 0.3059932589530945 0.30805355310440063 0.3080996572971344 0.30983278155326843 0.30988332629203796 0.3039196729660034 0.29341766238212585 0.28149351477622986 0.2707284390926361 0.2622477412223816 0.25400418043136597 0.2478829324245453 0.2490083873271942 0.2554311156272888 0.26148200035095215 0.26385727524757385 0.26382210850715637 0.26387882232666016 0.26245152950286865 0.26000332832336426 0.2600518763065338 0.2617824673652649 0.26309698820114136 0.26552656292915344 0.2700032591819763 0.2736172676086426 0.2747006118297577 0.2754264175891876 0.2767968773841858 0.2779064476490021 0.279891699552536 0.284357488155365 0.28945451974868774 0.2933834195137024 0.2966553568840027 0.2989789843559265 0.30280598998069763 0.31150293350219727 0.32365909218788147 0.33813759684562683 0.35394054651260376 0.3676077127456665 0.376840740442276 0.3798968195915222 0.37367281317710876 0.3576556146144867 0.3369816541671753 0.31849825382232666 0.30471497774124146 0.29529136419296265 0.2896086275577545 0.2846777141094208 0.2775256037712097 30445.38885 41541.616519999996 14.724239544441382 41.95246636406159 45.0 Degrees 0.9941901147353087 0.2536980425498405 -0.46382002276927525 14.441964377513065 0.1657092533769018 0.03694686596283513 -0.5203849464554426 42.743246117510395 -0.36890196800231934 0.4383719861507416 0.49215278029441833 0.5678848028182983 0.6697624325752258 0.7421551942825317 0.7949410080909729 0.861175537109375 0.9304823279380798 0.9888854622840881 1.0296154022216797 1.0200906991958618 0.9658761620521545 0.9375912547111511 0.9355541467666626 0.9351963996887207 0.9119044542312622 0.8633236289024353 0.8102912902832031 0.7478935718536377 0.6693353056907654 0.5896985530853271 0.5278323888778687 0.47969499230384827 0.4415580630302429 0.4171638786792755 0.40274444222450256 0.3934766352176666 0.3904435634613037 0.39783647656440735 0.41653168201446533 0.4471336603164673 0.4835716187953949 0.5180643796920776 0.5542099475860596 0.5966129302978516 0.6491007804870605 0.6811864972114563 0.6899703741073608 0.6939358711242676 0.6857684850692749 0.6570229530334473 0.6270668506622314 0.6001116633415222 0.5694991946220398 0.5400396585464478 0.5212351679801941 0.5054466128349304 0.4800109267234802 0.4332926869392395 0.38531044125556946 0.35653600096702576 0.33400747179985046 0.3157062530517578 0.3017118573188782 0.29292401671409607 0.2914346158504486 0.2968195676803589 0.3123685419559479 0.3298073410987854 0.3378491699695587 0.3447093665599823 0.35713934898376465 0.36121153831481934 0.354942262172699 0.35000061988830566 0.34591320157051086 0.3377359211444855 0.32351627945899963 0.3089088499546051 0.299715518951416 0.29520851373672485 0.29720360040664673 0.3091683089733124 0.3235648274421692 0.3309069871902466 0.3311137557029724 0.3341479003429413 0.3409155011177063 0.3392958343029022 0.32886332273483276 0.318060964345932 0.31203606724739075 0.30700525641441345 0.2969604432582855 0.2861284911632538 0.2785927355289459 0.27391406893730164 0.2739171087741852 0.27796828746795654 0.2818444073200226 0.28413259983062744 0.28639599680900574 0.28605619072914124 0.28013235330581665 0.27383479475975037 0.27307555079460144 0.27768054604530334 0.2847695052623749 0.29085657000541687 0.28964218497276306 0.2820451259613037 0.2783108055591583 0.28211650252342224 0.28757697343826294 0.2919096350669861 0.2974321246147156 0.30412620306015015 0.3101852238178253 0.31293031573295593 0.31173041462898254 0.31200647354125977 0.31643787026405334 0.3226405680179596 0.33135539293289185 0.3442952632904053 0.3607310354709625 0.37769126892089844 0.38771292567253113 0.3854190707206726 0.37552234530448914 0.36437416076660156 0.35301434993743896 0.34029337763786316 0.3268333971500397 0.31639185547828674 0.31317082047462463 0.31620898842811584 0.31643491983413696 30442.5687 41538.7379 15.196114730939069 43.482395133432554 90.0 Degrees 0.9998996542510169 0.04788184003105633 -0.0930766425798808 15.10229663993498 0.4761749412326489 0.1699951093342037 0.198482528841064 43.874691613741085 -0.37875914573669434 0.4469207227230072 0.49604201316833496 0.5680999159812927 0.6705905199050903 0.7483171224594116 0.80452561378479 0.8658115863800049 0.9279407262802124 0.9807824492454529 1.0223487615585327 1.0514615774154663 1.0463922023773193 1.0112226009368896 0.9982134103775024 1.004634141921997 0.9877952933311462 0.9317412972450256 0.8688726425170898 0.791929304599762 0.6982804536819458 0.6116718649864197 0.5463566184043884 0.4956464171409607 0.4562545120716095 0.43035486340522766 0.41308432817459106 0.4023517668247223 0.40038397908210754 0.4071796238422394 0.4212566614151001 0.44529813528060913 0.47869226336479187 0.5134111642837524 0.5476288199424744 0.5924862027168274 0.6646744608879089 0.7205690741539001 0.7406251430511475 0.7573677897453308 0.7730262279510498 0.7530763149261475 0.701831042766571 0.6527606844902039 0.6117518544197083 0.5808829665184021 0.5582142472267151 0.5362958312034607 0.5081617832183838 0.4623250961303711 0.41480353474617004 0.3816410005092621 0.3512253761291504 0.3229435384273529 0.30036529898643494 0.28829801082611084 0.28772664070129395 0.29815641045570374 0.31810328364372253 0.33310839533805847 0.34295332431793213 0.3576355576515198 0.37281879782676697 0.37368515133857727 0.36629509925842285 0.3603748083114624 0.35585665702819824 0.3474416136741638 0.33159855008125305 0.31616654992103577 0.3076492249965668 0.307073712348938 0.3140259385108948 0.3209126889705658 0.3253902792930603 0.3307969272136688 0.3362623155117035 0.34198322892189026 0.3472789525985718 0.3470509350299835 0.3400651216506958 0.3291180729866028 0.31915709376335144 0.3109745383262634 0.3023119568824768 0.2948138117790222 0.28782516717910767 0.27949029207229614 0.2736770212650299 0.2739221751689911 0.27921369671821594 0.2852224111557007 0.2887378931045532 0.2893288731575012 0.28667038679122925 0.2830811142921448 0.28239449858665466 0.28517019748687744 0.28917649388313293 0.2914784848690033 0.2913095951080322 0.2914259135723114 0.29324576258659363 0.2956298291683197 0.2981545031070709 0.3011481463909149 0.3054879605770111 0.3107515871524811 0.31411612033843994 0.31555652618408203 0.3172118663787842 0.31911471486091614 0.32280173897743225 0.33204859495162964 0.3453712463378906 0.357761949300766 0.3699503242969513 0.38311585783958435 0.39259737730026245 0.395723819732666 0.39234602451324463 0.38097503781318665 0.3659316301345825 0.3534175157546997 0.34347930550575256 0.33371132612228394 0.3236602544784546 0.3152346611022949 0.30779775977134705 30445.38885 41538.7379 15.717131304491499 46.21617319326819 90.0 Degrees 0.9324530395726834 0.11528954707161643 -0.3900859865428774 15.249631354870715 0.36275784996581106 0.671080814707999 -0.43318106508974763 45.03441323505067 -0.3608156144618988 0.4259406626224518 0.47818616032600403 0.5471063256263733 0.6347803473472595 0.7001804113388062 0.7520433068275452 0.8171277642250061 0.8950353264808655 0.9654224514961243 1.013027548789978 1.0263880491256714 0.9852103590965271 0.941172182559967 0.931695818901062 0.9181087017059326 0.8757404685020447 0.8307337164878845 0.7877539992332458 0.7257715463638306 0.6523596048355103 0.5768492817878723 0.5085425972938538 0.456727534532547 0.4192277491092682 0.3939008414745331 0.3818787932395935 0.3828960657119751 0.389323353767395 0.39450258016586304 0.39829221367836 0.40605780482292175 0.4275314211845398 0.4643791615962982 0.505535900592804 0.5479178428649902 0.5994552969932556 0.6376073360443115 0.6582133769989014 0.6799547672271729 0.6931027770042419 0.6702796816825867 0.6343024969100952 0.6056128144264221 0.5789087414741516 0.5561301112174988 0.53394615650177 0.4996113181114197 0.4577721953392029 0.4083678126335144 0.36549386382102966 0.3386378884315491 0.3173430263996124 0.2995651960372925 0.2844037711620331 0.27193325757980347 0.26600706577301025 0.2700923979282379 0.2851560115814209 0.30088505148887634 0.3138630986213684 0.3285767436027527 0.3413139879703522 0.3445935547351837 0.3396775424480438 0.330121785402298 0.3199063241481781 0.30752673745155334 0.2904285490512848 0.27791693806648254 0.2726101279258728 0.27176886796951294 0.2783729135990143 0.2872854471206665 0.29147452116012573 0.29573073983192444 0.30301201343536377 0.3096592128276825 0.3131972551345825 0.31535086035728455 0.3140628933906555 0.3053463399410248 0.2954469323158264 0.2890409231185913 0.280372679233551 0.2706373333930969 0.2643801271915436 0.25798389315605164 0.2508365511894226 0.24706313014030457 0.2483857423067093 0.25367772579193115 0.2591390609741211 0.26199933886528015 0.2643854320049286 0.2681591808795929 0.2714567184448242 0.27293530106544495 0.2729243338108063 0.27181246876716614 0.27032458782196045 0.2693708539009094 0.26829567551612854 0.2665247321128845 0.2669430077075958 0.271585613489151 0.2774175703525543 0.28121861815452576 0.2841823399066925 0.28875136375427246 0.2948462665081024 0.3012498915195465 0.30834972858428955 0.3174125552177429 0.3262895941734314 0.33198782801628113 0.3391663730144501 0.35144802927970886 0.3615659177303314 0.3633808195590973 0.3589021563529968 0.3500611186027527 0.33608290553092957 0.3192422091960907 0.30552980303764343 0.29612672328948975 0.2880210280418396 0.2813362777233124 0.2759957015514374 30442.5687 41541.616519999996 14.381547746983568 42.02895298858711 90.0 Degrees 0.9052486894719146 0.23198983049333044 -0.12072690257494645 14.320648710203532 0.5510780301748821 0.5808993859007311 0.3024109496913203 41.91339873814995 -0.3729221224784851 0.44012895226478577 0.4914250373840332 0.5655630230903625 0.6647416949272156 0.7444058060646057 0.8126416206359863 0.8799846172332764 0.9443001747131348 0.9979190826416016 1.0210847854614258 1.0208030939102173 1.0111762285232544 0.992798924446106 0.9904224276542664 0.99041348695755 0.9595239162445068 0.908574640750885 0.846463143825531 0.7647848725318909 0.6809067726135254 0.6017272472381592 0.5331747531890869 0.48201125860214233 0.44443103671073914 0.41660502552986145 0.3969760835170746 0.38763803243637085 0.38977357745170593 0.4000709354877472 0.41259172558784485 0.4278537333011627 0.45189592242240906 0.48642393946647644 0.5247828960418701 0.5645804405212402 0.612518310546875 0.6483836770057678 0.6727944016456604 0.7076162695884705 0.7434014678001404 0.7206994891166687 0.6666464805603027 0.63228839635849 0.608867883682251 0.5807878971099854 0.5441436171531677 0.5172581076622009 0.4963454604148865 0.45485949516296387 0.401254266500473 0.36339372396469116 0.3367786109447479 0.31736981868743896 0.29844656586647034 0.28279122710227966 0.27746984362602234 0.2811555564403534 0.2927308678627014 0.3071295917034149 0.3210527002811432 0.33639973402023315 0.3501872718334198 0.3525633215904236 0.34586936235427856 0.33730486035346985 0.3312234878540039 0.32529526948928833 0.31066590547561646 0.2939175069332123 0.286742240190506 0.28868338465690613 0.2973419427871704 0.3067079484462738 0.31102290749549866 0.31296807527542114 0.3165799379348755 0.3216167390346527 0.32459816336631775 0.32458773255348206 0.32075992226600647 0.31120601296424866 0.3001273572444916 0.2915954291820526 0.28556665778160095 0.28158968687057495 0.2759927809238434 0.26627132296562195 0.25822049379348755 0.25609999895095825 0.2582840323448181 0.26162636280059814 0.26389646530151367 0.26584580540657043 0.269505113363266 0.2740560472011566 0.2757222354412079 0.2737424373626709 0.27331092953681946 0.2753473222255707 0.2754512131214142 0.2745696008205414 0.27530866861343384 0.2763848900794983 0.27731868624687195 0.2794644236564636 0.28307804465293884 0.2873600125312805 0.29181772470474243 0.29564568400382996 0.29717445373535156 0.2980411946773529 0.30308812856674194 0.31369927525520325 0.3267776072025299 0.3403771221637726 0.3552534282207489 0.3692227900028229 0.3773849606513977 0.37742289900779724 0.3699462413787842 0.3581613600254059 0.3446747362613678 0.3301258683204651 0.3174242079257965 0.3073962330818176 0.2965550720691681 0.28561556339263916 0.27806076407432556 30445.38885 41541.616519999996 14.87720727584366 44.091357683377474 90.0 Degrees 0.9941901147353087 0.2536980425498405 -0.46382002276927525 14.441964377513065 0.1657092533769018 0.03694686596283513 -0.5203849464554426 42.743246117510395 -0.3949830234050751 0.4622531533241272 0.5109723210334778 0.5819476842880249 0.6732906699180603 0.7399584054946899 0.8056941032409668 0.8803262114524841 0.9407079219818115 0.9959824681282043 1.0247737169265747 0.9988774061203003 0.9598121643066406 0.9596822261810303 0.9756194353103638 0.9531159996986389 0.8880895376205444 0.8291646242141724 0.7852953672409058 0.7326091527938843 0.6583097577095032 0.5755128264427185 0.5128992199897766 0.47360721230506897 0.4461856484413147 0.424794465303421 0.40726786851882935 0.39642640948295593 0.3955315947532654 0.3990853428840637 0.40200623869895935 0.41744357347488403 0.4541429877281189 0.4928371012210846 0.523593544960022 0.5572065114974976 0.6082401275634766 0.6535071730613708 0.6752548813819885 0.6942375302314758 0.7089064717292786 0.6849415898323059 0.648251473903656 0.6290637254714966 0.611190140247345 0.5820888876914978 0.5479511022567749 0.5251440405845642 0.5092036724090576 0.4710317552089691 0.41165193915367126 0.368015855550766 0.33563244342803955 0.30891987681388855 0.289467990398407 0.279835045337677 0.2776188254356384 0.281124472618103 0.2969658076763153 0.3199588358402252 0.3370678722858429 0.35005685687065125 0.3592534065246582 0.3598088026046753 0.3555058240890503 0.34791675209999084 0.3381218910217285 0.32693901658058167 0.3126853406429291 0.3007925748825073 0.2955957353115082 0.2945536673069 0.29722654819488525 0.30562835931777954 0.3160330057144165 0.32335811853408813 0.32722195982933044 0.33106622099876404 0.333890825510025 0.3307388126850128 0.32467377185821533 0.31839045882225037 0.3102380931377411 0.30023348331451416 0.28814268112182617 0.2750730514526367 0.26571476459503174 0.2631886601448059 0.2642560303211212 0.2657497227191925 0.2698196768760681 0.2753346860408783 0.27848049998283386 0.27970898151397705 0.2795354127883911 0.2767869830131531 0.27504852414131165 0.2782919108867645 0.28145065903663635 0.2807522118091583 0.2820216417312622 0.28606170415878296 0.2876238524913788 0.2858695089817047 0.28583207726478577 0.29170745611190796 0.2989623248577118 0.3013303577899933 0.3022397756576538 0.3061143457889557 0.31094178557395935 0.31485098600387573 0.3188069462776184 0.32449349761009216 0.333775132894516 0.34593096375465393 0.3592696785926819 0.3726845979690552 0.3809838593006134 0.37974658608436584 0.37090665102005005 0.3579893112182617 0.3460439443588257 0.33749645948410034 0.3274995684623718 0.3147842586040497 0.3056890070438385 0.3015490472316742 0.2963547110557556 30442.5687 41538.7379 15.053673351479718 43.89851045568374 135.0 Degrees 0.9998996542510169 0.04788184003105633 -0.0930766425798808 15.10229663993498 0.4761749412326489 0.1699951093342037 0.198482528841064 43.874691613741085 -0.36599868535995483 0.44001543521881104 0.4966375231742859 0.5643589496612549 0.654793381690979 0.7409048080444336 0.8192135691642761 0.8847960829734802 0.9369638562202454 0.9906289577484131 1.025296688079834 1.0149723291397095 0.9805884957313538 0.9636447429656982 0.9588003158569336 0.9524202942848206 0.9314351677894592 0.8927587270736694 0.8397254943847656 0.7675902843475342 0.6844693422317505 0.6059010624885559 0.5474121570587158 0.5043894052505493 0.468307226896286 0.44075509905815125 0.4207476079463959 0.4080858826637268 0.40591961145401 0.4134867191314697 0.42650675773620605 0.4475072920322418 0.47888901829719543 0.5122790336608887 0.5369526743888855 0.5554997324943542 0.5947977304458618 0.647955060005188 0.6778163313865662 0.6932549476623535 0.6977417469024658 0.6872305870056152 0.659528911113739 0.6245843768119812 0.5957351922988892 0.5746957659721375 0.5465317368507385 0.5116745233535767 0.47723180055618286 0.4333028197288513 0.3936629891395569 0.36897724866867065 0.345966637134552 0.3255443572998047 0.31004011631011963 0.29891106486320496 0.2932963967323303 0.2937392592430115 0.3078584671020508 0.33370327949523926 0.35201096534729004 0.3585779666900635 0.36050570011138916 0.3624379336833954 0.3620472550392151 0.35969817638397217 0.35452911257743835 0.3419364094734192 0.3230227828025818 0.30832669138908386 0.30204203724861145 0.3018741011619568 0.30683496594429016 0.3151794970035553 0.3218154311180115 0.3262678384780884 0.33061009645462036 0.33248963952064514 0.3305680453777313 0.32937225699424744 0.3280726373195648 0.322355717420578 0.3143385052680969 0.30674803256988525 0.2977624237537384 0.28612422943115234 0.27380654215812683 0.26605281233787537 0.2670673131942749 0.27401211857795715 0.2821645736694336 0.28739145398139954 0.289187490940094 0.2906554937362671 0.29101991653442383 0.28759765625 0.28305813670158386 0.28146880865097046 0.2823540270328522 0.2834238111972809 0.28334492444992065 0.28242823481559753 0.2830897569656372 0.285215824842453 0.286749929189682 0.2894335985183716 0.2963193953037262 0.30561134219169617 0.31135934591293335 0.3125182092189789 0.3135771155357361 0.31644806265830994 0.3219490647315979 0.3305686414241791 0.3386459946632385 0.34468361735343933 0.35293155908584595 0.3640737235546112 0.3740508556365967 0.3799596130847931 0.3787302076816559 0.3690877854824066 0.3545362651348114 0.33818575739860535 0.32251599431037903 0.31119340658187866 0.3069508969783783 0.30643993616104126 0.3014766573905945 30445.38885 41538.7379 15.056927844654062 43.61475352701898 135.0 Degrees 0.9324530395726834 0.11528954707161643 -0.3900859865428774 15.249631354870715 0.36275784996581106 0.671080814707999 -0.43318106508974763 45.03441323505067 -0.36250585317611694 0.42431044578552246 0.4834742844104767 0.5558268427848816 0.6433207988739014 0.7237451076507568 0.797504723072052 0.8740603923797607 0.9462519288063049 1.0028680562973022 1.0236170291900635 0.9993492960929871 0.9659426808357239 0.929129958152771 0.8976386189460754 0.8773003220558167 0.845932126045227 0.804290771484375 0.7517927289009094 0.6770941019058228 0.5976353883743286 0.5313588380813599 0.48177453875541687 0.44140711426734924 0.40849852561950684 0.3899365961551666 0.38149017095565796 0.3739112615585327 0.3684139847755432 0.372007817029953 0.38562244176864624 0.40915170311927795 0.4383581876754761 0.46522119641304016 0.4911789894104004 0.5281954407691956 0.5901359915733337 0.6282098889350891 0.6299937963485718 0.6347435712814331 0.6456948518753052 0.6421006917953491 0.6224752068519592 0.6007646918296814 0.5784657001495361 0.5487658381462097 0.5032517313957214 0.4633730351924896 0.4398660957813263 0.41094517707824707 0.3713396489620209 0.3397798538208008 0.315258264541626 0.2960793673992157 0.2789282202720642 0.26473933458328247 0.2583105266094208 0.26161065697669983 0.276593953371048 0.29428234696388245 0.30759015679359436 0.3208509385585785 0.33403608202934265 0.3378518223762512 0.3314681351184845 0.3205536901950836 0.3096092939376831 0.29909756779670715 0.2854691445827484 0.27216678857803345 0.2648516893386841 0.26480165123939514 0.27259862422943115 0.28223392367362976 0.28807657957077026 0.2966751158237457 0.3103998601436615 0.31771647930145264 0.3139994740486145 0.31038033962249756 0.30780771374702454 0.30000224709510803 0.2885487973690033 0.2776309549808502 0.2691199779510498 0.26336920261383057 0.2575911581516266 0.2499367892742157 0.24667014181613922 0.2502342164516449 0.2533777952194214 0.25388017296791077 0.2556212842464447 0.2578236758708954 0.25818225741386414 0.2583445906639099 0.2599364221096039 0.2620580792427063 0.2627926170825958 0.2631688117980957 0.2642405927181244 0.263955682516098 0.2622736394405365 0.2618711590766907 0.2638363242149353 0.2683615982532501 0.2739871144294739 0.27764204144477844 0.2804603576660156 0.28473037481307983 0.28941360116004944 0.2937960624694824 0.2986640930175781 0.30610325932502747 0.316412091255188 0.3255343437194824 0.3314375877380371 0.33745360374450684 0.3465556502342224 0.355802059173584 0.358920693397522 0.35263997316360474 0.33765292167663574 0.3183898329734802 0.30118611454963684 0.2887457013130188 0.28239473700523376 0.2824958264827728 0.2819530665874481 30442.5687 41541.616519999996 14.148486745442884 40.914534151939826 135.0 Degrees 0.9052486894719146 0.23198983049333044 -0.12072690257494645 14.320648710203532 0.5510780301748821 0.5808993859007311 0.3024109496913203 41.91339873814995 -0.3650876581668854 0.44027072191238403 0.49740421772003174 0.5676716566085815 0.6565104126930237 0.7217820286750793 0.776906430721283 0.8554854989051819 0.9431904554367065 0.99639892578125 0.9918259382247925 0.9632425308227539 0.9571559429168701 0.9453587532043457 0.9196834564208984 0.9045694470405579 0.8967841863632202 0.8714707493782043 0.8187240958213806 0.7500607967376709 0.6737703084945679 0.5944964289665222 0.5322104096412659 0.48620209097862244 0.4495582580566406 0.4267524480819702 0.4147963225841522 0.4065539836883545 0.40079763531684875 0.40120112895965576 0.4117395281791687 0.4343542158603668 0.4588378369808197 0.4770737290382385 0.49635985493659973 0.5230758190155029 0.5750504732131958 0.6321943402290344 0.6574925780296326 0.6613973379135132 0.6457144618034363 0.6232727766036987 0.6174584627151489 0.6194400787353516 0.6105873584747314 0.5773681402206421 0.5304786562919617 0.4934249520301819 0.45931971073150635 0.41730549931526184 0.38470304012298584 0.3595018684864044 0.3293219804763794 0.30435964465141296 0.2891426980495453 0.2798253893852234 0.2746725082397461 0.2748556435108185 0.2886051833629608 0.3117738366127014 0.32717078924179077 0.33106401562690735 0.3289177715778351 0.33031389117240906 0.33271220326423645 0.3304341435432434 0.32225725054740906 0.30900219082832336 0.2952777147293091 0.2869744896888733 0.28450044989585876 0.2863030433654785 0.29052266478538513 0.29561755061149597 0.3012177348136902 0.3077249825000763 0.3149780333042145 0.3194979727268219 0.31837978959083557 0.3156931400299072 0.31331557035446167 0.3074597716331482 0.29792141914367676 0.28665927052497864 0.2769920229911804 0.2717728316783905 0.2680080831050873 0.26393961906433105 0.2608543634414673 0.25888293981552124 0.25867512822151184 0.2605808675289154 0.263666570186615 0.26618891954421997 0.2665948271751404 0.2663698196411133 0.2670312225818634 0.26882821321487427 0.27096620202064514 0.2717668414115906 0.2718110680580139 0.2726369798183441 0.27475622296333313 0.2783312201499939 0.2822757363319397 0.285504013299942 0.2890436351299286 0.29262956976890564 0.292468398809433 0.2886587381362915 0.28673070669174194 0.2884071469306946 0.29260167479515076 0.30139777064323425 0.31254521012306213 0.32084983587265015 0.329580694437027 0.34177514910697937 0.35234349966049194 0.3568665683269501 0.3554323613643646 0.3491654396057129 0.3388620913028717 0.32499754428863525 0.3104616105556488 0.29853302240371704 0.28830283880233765 0.27974289655685425 0.27512240409851074 30445.38885 41541.616519999996 14.216843459338445 41.87857263213592 135.0 Degrees 0.9941901147353087 0.2536980425498405 -0.46382002276927525 14.441964377513065 0.1657092533769018 0.03694686596283513 -0.5203849464554426 42.743246117510395 +map_x map_y 1214.0 - 1258.0 1500.0 - 1580.0 Polarisation Angle R-squared (1214.0 - 1258.0) a0 (1214.0 - 1258.0) a1 (1214.0 - 1258.0) a2 (1214.0 - 1258.0) R-squared (1500.0 - 1580.0) a0 (1500.0 - 1580.0) a1 (1500.0 - 1580.0) a2 (1500.0 - 1580.0) 1203.4202109667972 1207.277327027588 1211.1344430883792 1214.99155914917 1218.8486752099611 1222.7057912707523 1226.562907331543 1230.4200233923343 1234.277139453125 1238.1342555139163 1241.991371574707 1245.8484876354983 1249.705603696289 1253.5627197570802 1257.4198358178714 1261.2769518786622 1265.1340679394534 1268.9911840002442 1272.8483000610354 1276.7054161218261 1280.5625321826174 1284.4196482434086 1288.2767643041993 1292.1338803649905 1295.9909964257813 1299.8481124865725 1303.7052285473633 1307.5623446081545 1311.4194606689457 1315.2765767297365 1319.1336927905277 1322.9908088513184 1326.8479249121096 1330.7050409729004 1334.5621570336916 1338.4192730944824 1342.2763891552736 1346.1335052160648 1349.9906212768556 1353.8477373376468 1357.7048533984375 1361.5619694592287 1365.4190855200195 1369.2762015808107 1373.133317641602 1376.9904337023927 1380.847549763184 1384.7046658239747 1388.5617818847659 1392.4188979455566 1396.2760140063479 1400.133130067139 1403.9902461279298 1407.847362188721 1411.7044782495118 1415.561594310303 1419.4187103710938 1423.275826431885 1427.1329424926757 1430.990058553467 1434.8471746142582 1438.704290675049 1442.5614067358401 1446.418522796631 1450.275638857422 1454.1327549182129 1457.989870979004 1461.8469870397953 1465.704103100586 1469.5612191613773 1473.418335222168 1477.2754512829592 1481.13256734375 1484.9896834045412 1488.8467994653324 1492.7039155261232 1496.5610315869144 1500.4181476477052 1504.2752637084964 1508.1323797692871 1511.9894958300783 1515.846611890869 1519.7037279516603 1523.5608440124515 1527.4179600732423 1531.2750761340335 1535.1321921948243 1538.9893082556155 1542.8464243164062 1546.7035403771974 1550.5606564379887 1554.4177724987794 1558.2748885595706 1562.1320046203614 1565.9891206811526 1569.8462367419434 1573.7033528027346 1577.5604688635258 1581.4175849243165 1585.2747009851078 1589.1318170458985 1592.9889331066897 1596.8460491674805 1600.7031652282717 1604.5602812890625 1608.4173973498537 1612.2745134106449 1616.1316294714356 1619.9887455322269 1623.8458615930176 1627.7029776538088 1631.5600937145996 1635.4172097753908 1639.274325836182 1643.1314418969728 1646.988557957764 1650.8456740185547 1654.702790079346 1658.5599061401367 1662.417022200928 1666.2741382617191 1670.13125432251 1673.9883703833011 1677.8454864440919 1681.702602504883 1685.5597185656738 1689.416834626465 1693.2739506872558 1697.131066748047 +continuous continuous continuous continuous 0.0\ Degrees 45.0\ Degrees 90.0\ Degrees 135.0\ Degrees continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous +meta meta meta meta meta meta meta meta meta meta meta meta meta +30442.56870 41538.7 15.01 43.8794 0.0 Degrees 0.9999 0.0478818 -0.0930766 15.1023 0.476175 0.169995 0.198483 43.8747 0.287261 0.293882 0.297508 0.302286 0.312591 0.32878 0.346964 0.362572 0.373945 0.380348 0.380321 0.374495 0.363802 0.349067 0.33494 0.325305 0.318378 0.311427 0.30373 0.29774 0.295033 0.292611 0.29067 0.2909 0.289319 0.283677 0.277591 0.274682 0.274906 0.275084 0.272302 0.268401 0.267278 0.269375 0.272837 0.274141 0.2694 0.260834 0.254072 0.253377 0.257575 0.262868 0.270122 0.280275 0.288891 0.293777 0.300091 0.308883 0.31535 0.317585 0.317625 0.316181 0.311551 0.305746 0.302562 0.298723 0.290963 0.288164 0.294363 0.303229 0.311636 0.320071 0.328554 0.337744 0.347677 0.35353 0.344313 0.328142 0.319428 0.311504 0.293092 0.27016 0.259254 0.262548 0.280365 0.307472 0.334361 0.361379 0.396993 0.444328 0.477933 0.500553 0.537606 0.588599 0.626357 0.650183 0.672416 0.693028 0.698699 0.688528 0.676693 0.660426 0.617829 0.566765 0.528336 0.491682 0.461379 0.434376 0.409832 0.394715 0.386007 0.379658 0.381096 0.399153 0.431717 0.469617 0.513116 0.578222 0.66893 0.758444 0.8181 0.853371 0.897934 0.953696 1.00132 1.04376 1.06195 1.05437 1.04048 1.00985 0.955917 0.877086 0.787692 0.7115 0.637403 0.554745 0.49063 0.437823 0.371112 +30445.38885 41538.7 14.937 45.3498 0.0 Degrees 0.932453 0.11529 -0.390086 15.2496 0.362758 0.671081 -0.433181 45.0344 0.281542 0.287401 0.29221 0.299888 0.314004 0.332075 0.350018 0.363424 0.369344 0.370461 0.371579 0.371787 0.36371 0.348212 0.336029 0.329395 0.322253 0.312866 0.305823 0.306542 0.310213 0.306977 0.298274 0.289972 0.282366 0.276259 0.275175 0.278512 0.280018 0.277063 0.272044 0.267816 0.266933 0.267989 0.267923 0.267012 0.265956 0.263926 0.261076 0.258419 0.257783 0.260914 0.266729 0.275201 0.287219 0.296864 0.301827 0.307955 0.316999 0.325933 0.330107 0.326264 0.316769 0.306048 0.298683 0.2956 0.291835 0.286729 0.287214 0.295572 0.312221 0.331286 0.342701 0.348662 0.354143 0.357323 0.351947 0.341523 0.334706 0.327077 0.306906 0.280963 0.269342 0.274902 0.295836 0.322182 0.34704 0.374486 0.410674 0.45882 0.495035 0.524703 0.571424 0.616929 0.635799 0.646581 0.6643 0.692803 0.720735 0.73008 0.728708 0.710415 0.643052 0.570625 0.535248 0.50936 0.480137 0.449539 0.426122 0.410452 0.399818 0.397541 0.406234 0.425255 0.455413 0.497125 0.547186 0.611775 0.690886 0.765513 0.827145 0.878587 0.937334 0.998684 1.02539 1.04238 1.07118 1.06373 1.03618 1.01079 0.978589 0.917378 0.822211 0.739631 0.666456 0.57625 0.502106 0.448678 0.388349 +30442.56870 41541.6 14.1401 42.6338 0.0 Degrees 0.905249 0.23199 -0.120727 14.3206 0.551078 0.580899 0.302411 41.9134 0.273524 0.276618 0.278062 0.283478 0.292883 0.303991 0.317558 0.334117 0.352017 0.364946 0.365643 0.355624 0.343398 0.333238 0.321642 0.30665 0.294834 0.291642 0.292195 0.291186 0.288884 0.284238 0.277727 0.271934 0.265597 0.259425 0.257221 0.258986 0.261565 0.263126 0.262592 0.258739 0.252251 0.246491 0.246158 0.25074 0.251079 0.242936 0.233431 0.230298 0.233159 0.238288 0.245505 0.253187 0.259248 0.265199 0.275303 0.290671 0.302653 0.301358 0.292954 0.28995 0.288333 0.283599 0.2826 0.285054 0.283092 0.278234 0.275594 0.275083 0.281919 0.297548 0.311005 0.317839 0.319715 0.316163 0.302851 0.288887 0.284106 0.278994 0.26557 0.253053 0.249939 0.254155 0.264713 0.279338 0.300319 0.328088 0.36086 0.41113 0.465244 0.505385 0.541336 0.569674 0.592659 0.618993 0.654198 0.699965 0.716811 0.700334 0.689275 0.669128 0.597113 0.523782 0.491777 0.463111 0.423863 0.389188 0.373266 0.368028 0.364984 0.368648 0.3797 0.393359 0.414583 0.447617 0.487752 0.541538 0.620548 0.718398 0.812932 0.884242 0.930256 0.951112 0.982504 1.0494 1.09659 1.05384 1.00317 0.973045 0.939802 0.874753 0.793703 0.731933 0.665755 0.570333 0.4922 0.436718 0.366888 +30445.38885 41541.6 13.9496 43.0506 0.0 Degrees 0.99419 0.253698 -0.46382 14.442 0.165709 0.0369469 -0.520385 42.7432 0.268188 0.276964 0.282715 0.285865 0.294003 0.308686 0.325357 0.338775 0.346471 0.35063 0.350595 0.343381 0.332646 0.324194 0.317819 0.309119 0.297905 0.288369 0.281959 0.278584 0.277796 0.27729 0.275504 0.271514 0.264176 0.256542 0.253681 0.255988 0.259754 0.261661 0.260684 0.257718 0.254793 0.253284 0.254129 0.256234 0.25349 0.245068 0.238051 0.236373 0.238273 0.242712 0.251497 0.262693 0.272818 0.281672 0.288911 0.292399 0.292749 0.29398 0.297668 0.300448 0.29965 0.297203 0.294566 0.292018 0.290966 0.289681 0.286869 0.287297 0.294661 0.306198 0.316544 0.324864 0.330393 0.330801 0.324372 0.314856 0.30824 0.299949 0.281402 0.263431 0.260508 0.269722 0.288608 0.309209 0.330476 0.359589 0.394992 0.438716 0.482242 0.516345 0.544324 0.56838 0.600074 0.637247 0.668141 0.680816 0.67177 0.667529 0.668915 0.658995 0.608525 0.545308 0.50507 0.472152 0.442809 0.418393 0.400147 0.388912 0.38633 0.39307 0.40593 0.426022 0.453767 0.484333 0.520235 0.57745 0.661105 0.756496 0.840723 0.882765 0.894606 0.913984 0.93713 0.963545 1.00522 1.02089 1.01057 0.990381 0.94209 0.863783 0.779679 0.70997 0.634537 0.545024 0.479588 0.430039 0.364289 +30442.56870 41538.7 15.1494 44.2385 45.0 Degrees 0.9999 0.0478818 -0.0930766 15.1023 0.476175 0.169995 0.198483 43.8747 0.297009 0.302209 0.304923 0.307724 0.314569 0.329118 0.347468 0.364445 0.377804 0.383433 0.382574 0.379936 0.371804 0.354726 0.33584 0.32314 0.314625 0.306658 0.301683 0.300786 0.299899 0.297028 0.292733 0.287233 0.283652 0.283516 0.283241 0.280708 0.276131 0.271551 0.27027 0.27059 0.269527 0.268324 0.269002 0.270869 0.270319 0.265984 0.259972 0.253967 0.250261 0.252534 0.261519 0.27237 0.281428 0.289454 0.298175 0.30566 0.312364 0.322586 0.331565 0.329237 0.319126 0.30918 0.302994 0.30057 0.298058 0.293225 0.291513 0.296074 0.304601 0.316134 0.330767 0.345829 0.35684 0.358853 0.351299 0.343106 0.336539 0.325608 0.303669 0.280183 0.269393 0.269814 0.281945 0.303262 0.327502 0.353464 0.386079 0.435568 0.481076 0.511135 0.542178 0.571141 0.594159 0.619005 0.648934 0.685694 0.711861 0.709826 0.696796 0.67449 0.634826 0.597634 0.567238 0.526635 0.478349 0.439925 0.418429 0.406126 0.397473 0.393216 0.399052 0.417651 0.444723 0.479152 0.521471 0.575433 0.6436 0.721718 0.801019 0.869395 0.925729 0.953298 0.954651 0.952871 0.962806 0.985442 0.991494 0.973168 0.946875 0.898564 0.813696 0.736485 0.660936 0.563956 0.49002 0.439666 0.377336 +30445.38885 41538.7 15.2875 44.9569 45.0 Degrees 0.932453 0.11529 -0.390086 15.2496 0.362758 0.671081 -0.433181 45.0344 0.292544 0.296149 0.300557 0.308044 0.320356 0.336352 0.35449 0.371655 0.382156 0.384808 0.383701 0.379202 0.36919 0.356261 0.342525 0.329056 0.318705 0.311215 0.305751 0.303437 0.304124 0.304767 0.301519 0.295466 0.291742 0.290394 0.287971 0.285525 0.284011 0.282672 0.28252 0.282121 0.280259 0.278524 0.277594 0.276982 0.275079 0.270845 0.266734 0.265984 0.267873 0.271337 0.277082 0.283009 0.289208 0.297789 0.305525 0.31105 0.317468 0.323155 0.325258 0.328123 0.331092 0.326917 0.31751 0.309986 0.302761 0.294144 0.291177 0.295138 0.303864 0.31649 0.330366 0.344228 0.356212 0.361564 0.353966 0.340079 0.331447 0.3224 0.302722 0.282658 0.275106 0.27568 0.283898 0.301985 0.329169 0.358509 0.388042 0.437103 0.487286 0.512741 0.537119 0.5791 0.623401 0.656135 0.679499 0.701124 0.720571 0.725349 0.721212 0.70743 0.654441 0.589174 0.54983 0.514442 0.473509 0.43763 0.41841 0.409552 0.403537 0.401538 0.405069 0.417518 0.444527 0.484752 0.528496 0.576895 0.640589 0.719541 0.796243 0.855256 0.901152 0.919005 0.91289 0.916951 0.951858 0.984796 0.978514 0.950156 0.913201 0.858747 0.784819 0.717906 0.646791 0.558625 0.491076 0.439651 0.373372 +30442.56870 41541.6 14.6125 42.0763 45.0 Degrees 0.905249 0.23199 -0.120727 14.3206 0.551078 0.580899 0.302411 41.9134 0.280263 0.285479 0.291174 0.297267 0.304045 0.316351 0.336142 0.35594 0.368725 0.373443 0.370717 0.362672 0.351032 0.337819 0.32585 0.314657 0.303929 0.295355 0.288866 0.285078 0.284168 0.281935 0.276337 0.272009 0.270336 0.267917 0.265994 0.264893 0.260324 0.255263 0.255108 0.255504 0.253246 0.253574 0.257839 0.259142 0.255611 0.252284 0.248423 0.242942 0.240369 0.243283 0.24764 0.25014 0.25317 0.2601 0.271487 0.28451 0.292939 0.294158 0.294027 0.294219 0.290966 0.287036 0.284722 0.280577 0.273683 0.270643 0.272827 0.275344 0.280664 0.294323 0.310463 0.323319 0.329638 0.324703 0.310658 0.302133 0.300019 0.2905 0.265941 0.246221 0.243218 0.248825 0.262092 0.282402 0.305863 0.330537 0.361159 0.409957 0.457578 0.492236 0.530671 0.573128 0.604868 0.626327 0.64291 0.651612 0.661324 0.675088 0.670345 0.641436 0.582842 0.52767 0.499346 0.478586 0.449748 0.413311 0.387444 0.376612 0.373385 0.371086 0.370514 0.382822 0.412555 0.452223 0.49576 0.550498 0.624102 0.705725 0.773579 0.825238 0.876406 0.915692 0.942851 0.980782 1.00801 0.984912 0.964953 0.954917 0.936008 0.884946 0.803365 0.731596 0.653865 0.553915 0.485541 0.445544 0.389119 +30445.38885 41541.6 14.7242 41.9525 45.0 Degrees 0.99419 0.253698 -0.46382 14.442 0.165709 0.0369469 -0.520385 42.7432 0.277526 0.284678 0.289609 0.295291 0.304715 0.318498 0.336982 0.357656 0.373673 0.379897 0.376841 0.367608 0.353941 0.338138 0.323659 0.311503 0.302806 0.298979 0.296655 0.293383 0.289455 0.284357 0.279892 0.277906 0.276797 0.275426 0.274701 0.273617 0.270003 0.265527 0.263097 0.261782 0.260052 0.260003 0.262452 0.263879 0.263822 0.263857 0.261482 0.255431 0.249008 0.247883 0.254004 0.262248 0.270728 0.281494 0.293418 0.30392 0.309883 0.309833 0.3081 0.308054 0.305993 0.30021 0.293765 0.286607 0.277684 0.272897 0.273951 0.27839 0.289727 0.307605 0.32236 0.331534 0.334969 0.328812 0.318721 0.317832 0.31639 0.30331 0.280038 0.264894 0.263555 0.267915 0.278727 0.297982 0.323511 0.348979 0.370412 0.406665 0.458397 0.501191 0.534175 0.559287 0.586581 0.614111 0.62943 0.630658 0.648645 0.676721 0.67779 0.644812 0.578444 0.529881 0.507369 0.48188 0.452002 0.4274 0.411786 0.401811 0.395734 0.39636 0.404562 0.419417 0.439901 0.467325 0.506117 0.564421 0.644366 0.733556 0.806725 0.844638 0.86427 0.887299 0.906254 0.91094 0.907354 0.911164 0.918149 0.905033 0.864455 0.808501 0.756152 0.705617 0.627234 0.529663 0.466429 0.417986 0.347388 +30442.56870 41538.7 15.1961 43.4824 90.0 Degrees 0.9999 0.0478818 -0.0930766 15.1023 0.476175 0.169995 0.198483 43.8747 0.316435 0.316209 0.313171 0.316392 0.326833 0.340293 0.353014 0.364374 0.375522 0.385419 0.387713 0.377691 0.360731 0.344295 0.331355 0.322641 0.316438 0.312006 0.31173 0.31293 0.310185 0.304126 0.297432 0.29191 0.287577 0.282117 0.278311 0.282045 0.289642 0.290857 0.28477 0.277681 0.273076 0.273835 0.280132 0.286056 0.286396 0.284133 0.281844 0.277968 0.273917 0.273914 0.278593 0.286128 0.29696 0.307005 0.312036 0.318061 0.328863 0.339296 0.340916 0.334148 0.331114 0.330907 0.323565 0.309168 0.297204 0.295209 0.299716 0.308909 0.323516 0.337736 0.345913 0.350001 0.354942 0.361212 0.357139 0.344709 0.337849 0.329807 0.312369 0.29682 0.291435 0.292924 0.301712 0.315706 0.334007 0.356536 0.38531 0.433293 0.480011 0.505447 0.521235 0.54004 0.569499 0.600112 0.627067 0.657023 0.685768 0.693936 0.68997 0.681186 0.649101 0.596613 0.55421 0.518064 0.483572 0.447134 0.416532 0.397836 0.390444 0.393477 0.402744 0.417164 0.441558 0.479695 0.527832 0.589699 0.669335 0.747894 0.810291 0.863324 0.911904 0.935196 0.935554 0.937591 0.965876 1.02009 1.02962 0.988885 0.930482 0.861176 0.794941 0.742155 0.669762 0.567885 0.492153 0.438372 0.368902 +30445.38885 41538.7 15.7171 46.2162 90.0 Degrees 0.932453 0.11529 -0.390086 15.2496 0.362758 0.671081 -0.433181 45.0344 0.307798 0.315235 0.32366 0.333711 0.343479 0.353418 0.365932 0.380975 0.392346 0.395724 0.392597 0.383116 0.36995 0.357762 0.345371 0.332049 0.322802 0.319115 0.317212 0.315557 0.314116 0.310752 0.305488 0.301148 0.298155 0.29563 0.293246 0.291426 0.29131 0.291478 0.289176 0.28517 0.282394 0.283081 0.28667 0.289329 0.288738 0.285222 0.279214 0.273922 0.273677 0.27949 0.287825 0.294814 0.302312 0.310975 0.319157 0.329118 0.340065 0.347051 0.347279 0.341983 0.336262 0.330797 0.32539 0.320913 0.314026 0.307074 0.307649 0.316167 0.331599 0.347442 0.355857 0.360375 0.366295 0.373685 0.372819 0.357636 0.342953 0.333108 0.318103 0.298156 0.287727 0.288298 0.300365 0.322944 0.351225 0.381641 0.414804 0.462325 0.508162 0.536296 0.558214 0.580883 0.611752 0.652761 0.701831 0.753076 0.773026 0.757368 0.740625 0.720569 0.664674 0.592486 0.547629 0.513411 0.478692 0.445298 0.421257 0.40718 0.400384 0.402352 0.413084 0.430355 0.456255 0.495646 0.546357 0.611672 0.69828 0.791929 0.868873 0.931741 0.987795 1.00463 0.998213 1.01122 1.04639 1.05146 1.02235 0.980782 0.927941 0.865812 0.804526 0.748317 0.670591 0.5681 0.496042 0.446921 0.378759 +30442.56870 41541.6 14.3815 42.029 90.0 Degrees 0.905249 0.23199 -0.120727 14.3206 0.551078 0.580899 0.302411 41.9134 0.275996 0.281336 0.288021 0.296127 0.30553 0.319242 0.336083 0.350061 0.358902 0.363381 0.361566 0.351448 0.339166 0.331988 0.32629 0.317413 0.30835 0.30125 0.294846 0.288751 0.284182 0.281219 0.277418 0.271586 0.266943 0.266525 0.268296 0.269371 0.270325 0.271812 0.272924 0.272935 0.271457 0.268159 0.264385 0.261999 0.259139 0.253678 0.248386 0.247063 0.250837 0.257984 0.26438 0.270637 0.280373 0.289041 0.295447 0.305346 0.314063 0.315351 0.313197 0.309659 0.303012 0.295731 0.291475 0.287285 0.278373 0.271769 0.27261 0.277917 0.290429 0.307527 0.319906 0.330122 0.339678 0.344594 0.341314 0.328577 0.313863 0.300885 0.285156 0.270092 0.266007 0.271933 0.284404 0.299565 0.317343 0.338638 0.365494 0.408368 0.457772 0.499611 0.533946 0.55613 0.578909 0.605613 0.634302 0.67028 0.693103 0.679955 0.658213 0.637607 0.599455 0.547918 0.505536 0.464379 0.427531 0.406058 0.398292 0.394503 0.389323 0.382896 0.381879 0.393901 0.419228 0.456728 0.508543 0.576849 0.65236 0.725772 0.787754 0.830734 0.87574 0.918109 0.931696 0.941172 0.98521 1.02639 1.01303 0.965422 0.895035 0.817128 0.752043 0.70018 0.63478 0.547106 0.478186 0.425941 0.360816 +30445.38885 41541.6 14.8772 44.0914 90.0 Degrees 0.99419 0.253698 -0.46382 14.442 0.165709 0.0369469 -0.520385 42.7432 0.278061 0.285616 0.296555 0.307396 0.317424 0.330126 0.344675 0.358161 0.369946 0.377423 0.377385 0.369223 0.355253 0.340377 0.326778 0.313699 0.303088 0.298041 0.297174 0.295646 0.291818 0.28736 0.283078 0.279464 0.277319 0.276385 0.275309 0.27457 0.275451 0.275347 0.273311 0.273742 0.275722 0.274056 0.269505 0.265846 0.263896 0.261626 0.258284 0.2561 0.25822 0.266271 0.275993 0.28159 0.285567 0.291595 0.300127 0.311206 0.32076 0.324588 0.324598 0.321617 0.31658 0.312968 0.311023 0.306708 0.297342 0.288683 0.286742 0.293918 0.310666 0.325295 0.331223 0.337305 0.345869 0.352563 0.350187 0.3364 0.321053 0.30713 0.292731 0.281156 0.27747 0.282791 0.298447 0.31737 0.336779 0.363394 0.401254 0.454859 0.496345 0.517258 0.544144 0.580788 0.608868 0.632288 0.666646 0.720699 0.743401 0.707616 0.672794 0.648384 0.612518 0.56458 0.524783 0.486424 0.451896 0.427854 0.412592 0.400071 0.389774 0.387638 0.396976 0.416605 0.444431 0.482011 0.533175 0.601727 0.680907 0.764785 0.846463 0.908575 0.959524 0.990413 0.990422 0.992799 1.01118 1.0208 1.02108 0.997919 0.9443 0.879985 0.812642 0.744406 0.664742 0.565563 0.491425 0.440129 0.372922 +30442.56870 41538.7 15.0537 43.8985 135.0 Degrees 0.9999 0.0478818 -0.0930766 15.1023 0.476175 0.169995 0.198483 43.8747 0.296355 0.301549 0.305689 0.314784 0.3275 0.337496 0.346044 0.357989 0.370907 0.379747 0.380984 0.372685 0.35927 0.345931 0.333775 0.324493 0.318807 0.314851 0.310942 0.306114 0.30224 0.30133 0.298962 0.291707 0.285832 0.28587 0.287624 0.286062 0.282022 0.280752 0.281451 0.278292 0.275049 0.276787 0.279535 0.279709 0.27848 0.275335 0.26982 0.26575 0.264256 0.263189 0.265715 0.275073 0.288143 0.300233 0.310238 0.31839 0.324674 0.330739 0.333891 0.331066 0.327222 0.323358 0.316033 0.305628 0.297227 0.294554 0.295596 0.300793 0.312685 0.326939 0.338122 0.347917 0.355506 0.359809 0.359253 0.350057 0.337068 0.319959 0.296966 0.281124 0.277619 0.279835 0.289468 0.30892 0.335632 0.368016 0.411652 0.471032 0.509204 0.525144 0.547951 0.582089 0.61119 0.629064 0.648251 0.684942 0.708906 0.694238 0.675255 0.653507 0.60824 0.557207 0.523594 0.492837 0.454143 0.417444 0.402006 0.399085 0.395532 0.396426 0.407268 0.424794 0.446186 0.473607 0.512899 0.575513 0.65831 0.732609 0.785295 0.829165 0.88809 0.953116 0.975619 0.959682 0.959812 0.998877 1.02477 0.995982 0.940708 0.880326 0.805694 0.739958 0.673291 0.581948 0.510972 0.462253 0.394983 +30445.38885 41538.7 15.0569 43.6148 135.0 Degrees 0.932453 0.11529 -0.390086 15.2496 0.362758 0.671081 -0.433181 45.0344 0.301477 0.30644 0.306951 0.311193 0.322516 0.338186 0.354536 0.369088 0.37873 0.37996 0.374051 0.364074 0.352932 0.344684 0.338646 0.330569 0.321949 0.316448 0.313577 0.312518 0.311359 0.305611 0.296319 0.289434 0.28675 0.285216 0.28309 0.282428 0.283345 0.283424 0.282354 0.281469 0.283058 0.287598 0.29102 0.290655 0.289187 0.287391 0.282165 0.274012 0.267067 0.266053 0.273807 0.286124 0.297762 0.306748 0.314339 0.322356 0.328073 0.329372 0.330568 0.33249 0.33061 0.326268 0.321815 0.315179 0.306835 0.301874 0.302042 0.308327 0.323023 0.341936 0.354529 0.359698 0.362047 0.362438 0.360506 0.358578 0.352011 0.333703 0.307858 0.293739 0.293296 0.298911 0.31004 0.325544 0.345967 0.368977 0.393663 0.433303 0.477232 0.511675 0.546532 0.574696 0.595735 0.624584 0.659529 0.687231 0.697742 0.693255 0.677816 0.647955 0.594798 0.5555 0.536953 0.512279 0.478889 0.447507 0.426507 0.413487 0.40592 0.408086 0.420748 0.440755 0.468307 0.504389 0.547412 0.605901 0.684469 0.76759 0.839725 0.892759 0.931435 0.95242 0.9588 0.963645 0.980588 1.01497 1.0253 0.990629 0.936964 0.884796 0.819214 0.740905 0.654793 0.564359 0.496638 0.440015 0.365999 +30442.56870 41541.6 14.1485 40.9145 135.0 Degrees 0.905249 0.23199 -0.120727 14.3206 0.551078 0.580899 0.302411 41.9134 0.281953 0.282496 0.282395 0.288746 0.301186 0.31839 0.337653 0.35264 0.358921 0.355802 0.346556 0.337454 0.331438 0.325534 0.316412 0.306103 0.298664 0.293796 0.289414 0.28473 0.28046 0.277642 0.273987 0.268362 0.263836 0.261871 0.262274 0.263956 0.264241 0.263169 0.262793 0.262058 0.259936 0.258345 0.258182 0.257824 0.255621 0.25388 0.253378 0.250234 0.24667 0.249937 0.257591 0.263369 0.26912 0.277631 0.288549 0.300002 0.307808 0.31038 0.313999 0.317716 0.3104 0.296675 0.288077 0.282234 0.272599 0.264802 0.264852 0.272167 0.285469 0.299098 0.309609 0.320554 0.331468 0.337852 0.334036 0.320851 0.30759 0.294282 0.276594 0.261611 0.258311 0.264739 0.278928 0.296079 0.315258 0.33978 0.37134 0.410945 0.439866 0.463373 0.503252 0.548766 0.578466 0.600765 0.622475 0.642101 0.645695 0.634744 0.629994 0.62821 0.590136 0.528195 0.491179 0.465221 0.438358 0.409152 0.385622 0.372008 0.368414 0.373911 0.38149 0.389937 0.408499 0.441407 0.481775 0.531359 0.597635 0.677094 0.751793 0.804291 0.845932 0.8773 0.897639 0.92913 0.965943 0.999349 1.02362 1.00287 0.946252 0.87406 0.797505 0.723745 0.643321 0.555827 0.483474 0.42431 0.362506 +30445.38885 41541.6 14.2168 41.8786 135.0 Degrees 0.99419 0.253698 -0.46382 14.442 0.165709 0.0369469 -0.520385 42.7432 0.275122 0.279743 0.288303 0.298533 0.310462 0.324998 0.338862 0.349165 0.355432 0.356867 0.352343 0.341775 0.329581 0.32085 0.312545 0.301398 0.292602 0.288407 0.286731 0.288659 0.292468 0.29263 0.289044 0.285504 0.282276 0.278331 0.274756 0.272637 0.271811 0.271767 0.270966 0.268828 0.267031 0.26637 0.266595 0.266189 0.263667 0.260581 0.258675 0.258883 0.260854 0.26394 0.268008 0.271773 0.276992 0.286659 0.297921 0.30746 0.313316 0.315693 0.31838 0.319498 0.314978 0.307725 0.301218 0.295618 0.290523 0.286303 0.2845 0.286974 0.295278 0.309002 0.322257 0.330434 0.332712 0.330314 0.328918 0.331064 0.327171 0.311774 0.288605 0.274856 0.274673 0.279825 0.289143 0.30436 0.329322 0.359502 0.384703 0.417305 0.45932 0.493425 0.530479 0.577368 0.610587 0.61944 0.617458 0.623273 0.645714 0.661397 0.657493 0.632194 0.57505 0.523076 0.49636 0.477074 0.458838 0.434354 0.41174 0.401201 0.400798 0.406554 0.414796 0.426752 0.449558 0.486202 0.53221 0.594496 0.67377 0.750061 0.818724 0.871471 0.896784 0.904569 0.919683 0.945359 0.957156 0.963243 0.991826 0.996399 0.94319 0.855485 0.776906 0.721782 0.65651 0.567672 0.497404 0.440271 0.365088 diff --git a/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin_polar-results.tab b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin_polar-results.tab index 3c29d7aca..cfad53d1a 100644 --- a/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin_polar-results.tab +++ b/orangecontrib/spectroscopy/datasets/polar/4-angle-ftir_multiin_polar-results.tab @@ -1,19 +1,19 @@ -1697.131066748047 1693.2739506872558 1689.416834626465 1685.5597185656738 1681.702602504883 1677.8454864440919 1673.9883703833011 1670.13125432251 1666.2741382617191 1662.417022200928 1658.5599061401367 1654.702790079346 1650.8456740185547 1646.988557957764 1643.1314418969728 1639.274325836182 1635.4172097753908 1631.5600937145996 1627.7029776538088 1623.8458615930176 1619.9887455322269 1616.1316294714356 1612.2745134106449 1608.4173973498537 1604.5602812890625 1600.7031652282717 1596.8460491674805 1592.9889331066897 1589.1318170458985 1585.2747009851078 1581.4175849243165 1577.5604688635258 1573.7033528027346 1569.8462367419434 1565.9891206811526 1562.1320046203614 1558.2748885595706 1554.4177724987794 1550.5606564379887 1546.7035403771974 1542.8464243164062 1538.9893082556155 1535.1321921948243 1531.2750761340335 1527.4179600732423 1523.5608440124515 1519.7037279516603 1515.846611890869 1511.9894958300783 1508.1323797692871 1504.2752637084964 1500.4181476477052 1496.5610315869144 1492.7039155261232 1488.8467994653324 1484.9896834045412 1481.13256734375 1477.2754512829592 1473.418335222168 1469.5612191613773 1465.704103100586 1461.8469870397953 1457.989870979004 1454.1327549182129 1450.275638857422 1446.418522796631 1442.5614067358401 1438.704290675049 1434.8471746142582 1430.990058553467 1427.1329424926757 1423.275826431885 1419.4187103710938 1415.561594310303 1411.7044782495118 1407.847362188721 1403.9902461279298 1400.133130067139 1396.2760140063479 1392.4188979455566 1388.5617818847659 1384.7046658239747 1380.847549763184 1376.9904337023927 1373.133317641602 1369.2762015808107 1365.4190855200195 1361.5619694592287 1357.7048533984375 1353.8477373376468 1349.9906212768556 1346.1335052160648 1342.2763891552736 1338.4192730944824 1334.5621570336916 1330.7050409729004 1326.8479249121096 1322.9908088513184 1319.1336927905277 1315.2765767297365 1311.4194606689457 1307.5623446081545 1303.7052285473633 1299.8481124865725 1295.9909964257813 1292.1338803649905 1288.2767643041993 1284.4196482434086 1280.5625321826174 1276.7054161218261 1272.8483000610354 1268.9911840002442 1265.1340679394534 1261.2769518786622 1257.4198358178714 1253.5627197570802 1249.705603696289 1245.8484876354983 1241.991371574707 1238.1342555139163 1234.277139453125 1230.4200233923343 1226.562907331543 1222.7057912707523 1218.8486752099611 1214.99155914917 1211.1344430883792 1207.277327027588 1203.4202109667972 map_x map_y 1214.0 - 1258.0 1500.0 - 1580.0 Polarisation Angle Azimuth Angle (1214.0 - 1258.0) Hermans Orientation Function (1214.0 - 1258.0) Intensity (1214.0 - 1258.0) Amplitude (1214.0 - 1258.0) R-squared (1214.0 - 1258.0) Azimuth Angle (1500.0 - 1580.0) Hermans Orientation Function (1500.0 - 1580.0) Intensity (1500.0 - 1580.0) Amplitude (1500.0 - 1580.0) R-squared (1500.0 - 1580.0) -continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous 0.0\ Degrees 45.0\ Degrees 90.0\ Degrees 135.0\ Degrees continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous - meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta -0.3711118698120117 0.43782272934913635 0.49062955379486084 0.5547452569007874 0.6374028921127319 0.711500346660614 0.7876919507980347 0.8770861625671387 0.9559172987937927 1.0098530054092407 1.0404753684997559 1.0543735027313232 1.0619465112686157 1.0437582731246948 1.0013220310211182 0.9536964297294617 0.897933840751648 0.8533709645271301 0.8181004524230957 0.7584443688392639 0.6689296364784241 0.5782220363616943 0.513115644454956 0.46961721777915955 0.43171659111976624 0.3991532325744629 0.3810955286026001 0.37965840101242065 0.386007159948349 0.3947145342826843 0.4098324477672577 0.4343760311603546 0.46137940883636475 0.49168214201927185 0.528336226940155 0.5667646527290344 0.6178287267684937 0.6604256629943848 0.6766932010650635 0.6885275840759277 0.6986993551254272 0.6930281519889832 0.6724157929420471 0.6501829028129578 0.6263569593429565 0.5885990858078003 0.5376056432723999 0.5005533695220947 0.4779326319694519 0.4443279504776001 0.39699268341064453 0.36137861013412476 0.33436083793640137 0.30747178196907043 0.2803654670715332 0.2625480592250824 0.2592535614967346 0.27015992999076843 0.29309216141700745 0.31150364875793457 0.3194276988506317 0.328142374753952 0.3443129062652588 0.35353028774261475 0.3476772606372833 0.33774372935295105 0.32855379581451416 0.3200712502002716 0.31163617968559265 0.3032289445400238 0.2943628430366516 0.28816357254981995 0.2909632623195648 0.29872336983680725 0.3025616407394409 0.3057458698749542 0.3115512728691101 0.31618112325668335 0.3176253139972687 0.3175846040248871 0.3153497576713562 0.3088831901550293 0.3000914454460144 0.29377707839012146 0.2888909578323364 0.28027477860450745 0.270122230052948 0.26286780834198 0.2575746774673462 0.2533765435218811 0.2540722191333771 0.26083439588546753 0.2694004774093628 0.27414125204086304 0.2728372812271118 0.26937466859817505 0.2672775387763977 0.2684006989002228 0.2723020315170288 0.27508431673049927 0.2749064266681671 0.274681955575943 0.2775912284851074 0.28367695212364197 0.2893185019493103 0.290900319814682 0.2906703054904938 0.2926110625267029 0.2950325608253479 0.2977401614189148 0.3037301301956177 0.3114270567893982 0.318378210067749 0.32530495524406433 0.3349395990371704 0.3490666151046753 0.3638021945953369 0.3744945526123047 0.3803212642669678 0.3803481459617615 0.37394478917121887 0.3625723719596863 0.34696418046951294 0.3287803828716278 0.31259098649024963 0.3022864758968353 0.2975075840950012 0.2938818633556366 0.2872605323791504 30442.5687 41538.7379 15.009961445779307 43.87936019111817 0.0 Degrees -76.38857262236182 0.004631214554422166 30.204593279869965 0.2093411760614958 0.9998996542510169 -20.289596380815063 0.003978761893197851 87.74938322748216 0.5226610812091969 0.4761749412326489 -0.388348788022995 0.44867801666259766 0.502106249332428 0.5762503743171692 0.6664558053016663 0.739630937576294 0.8222108483314514 0.9173783659934998 0.9785887002944946 1.0107851028442383 1.0361779928207397 1.0637257099151611 1.0711760520935059 1.0423812866210938 1.025393009185791 0.9986843466758728 0.9373337626457214 0.8785869479179382 0.8271448612213135 0.7655133605003357 0.6908860802650452 0.6117749810218811 0.5471857190132141 0.4971246123313904 0.45541316270828247 0.42525458335876465 0.4062337279319763 0.39754077792167664 0.39981767535209656 0.41045162081718445 0.42612242698669434 0.4495392143726349 0.48013657331466675 0.509360134601593 0.5352477431297302 0.5706249475479126 0.6430520415306091 0.7104148864746094 0.7287077903747559 0.7300795912742615 0.7207353115081787 0.6928030848503113 0.6642997860908508 0.6465807557106018 0.6357985734939575 0.6169293522834778 0.5714240670204163 0.5247028470039368 0.49503496289253235 0.4588204622268677 0.41067439317703247 0.37448638677597046 0.34704023599624634 0.32218214869499207 0.29583585262298584 0.27490201592445374 0.26934197545051575 0.28096309304237366 0.3069058060646057 0.3270772397518158 0.33470597863197327 0.34152284264564514 0.35194724798202515 0.3573232889175415 0.3541431128978729 0.34866204857826233 0.3427005112171173 0.3312859833240509 0.3122206926345825 0.2955722510814667 0.2872144877910614 0.2867285907268524 0.2918354272842407 0.2956002652645111 0.2986833155155182 0.3060479462146759 0.31676867604255676 0.3262639045715332 0.330106645822525 0.32593291997909546 0.31699928641319275 0.30795541405677795 0.3018266558647156 0.29686442017555237 0.28721868991851807 0.2752007842063904 0.2667289972305298 0.2609139084815979 0.25778260827064514 0.2584190368652344 0.2610763907432556 0.2639258801937103 0.26595649123191833 0.26701226830482483 0.2679225206375122 0.2679891288280487 0.2669326663017273 0.2678163945674896 0.2720436155796051 0.2770630121231079 0.28001782298088074 0.27851158380508423 0.2751752436161041 0.276258647441864 0.2823660373687744 0.2899717390537262 0.29827389121055603 0.30697736144065857 0.3102128207683563 0.30654236674308777 0.30582261085510254 0.3128655254840851 0.3222534656524658 0.32939496636390686 0.33602944016456604 0.34821176528930664 0.3637096881866455 0.37178686261177063 0.3715791702270508 0.37046146392822266 0.36934414505958557 0.36342424154281616 0.350017786026001 0.33207470178604126 0.3140036165714264 0.2998875081539154 0.29220956563949585 0.2874009907245636 0.2815419137477875 30445.38885 41538.7379 14.936959331411803 45.349811063094954 0.0 Degrees -81.76750236979787 0.017942087761759287 30.49926270974143 0.8135324371187873 0.9324530395726834 -61.4210730982497 0.011894554755490427 90.06882647010134 1.5974921533722033 0.36275784996581106 -0.366887629032135 0.43671754002571106 0.49220016598701477 0.5703327059745789 0.6657547950744629 0.731933057308197 0.7937033176422119 0.8747525215148926 0.9398021697998047 0.9730452299118042 1.0031681060791016 1.0538406372070312 1.0965853929519653 1.0494016408920288 0.9825043678283691 0.9511120319366455 0.9302560687065125 0.8842418789863586 0.8129315972328186 0.7183979153633118 0.6205475330352783 0.5415375232696533 0.48775240778923035 0.44761666655540466 0.41458284854888916 0.39335882663726807 0.3796997666358948 0.36864838004112244 0.36498430371284485 0.3680277466773987 0.3732655644416809 0.38918817043304443 0.42386338114738464 0.46311137080192566 0.4917769134044647 0.5237820148468018 0.5971131920814514 0.6691277027130127 0.6892750859260559 0.7003340125083923 0.7168111801147461 0.6999649405479431 0.6541981101036072 0.6189929246902466 0.5926592946052551 0.5696735382080078 0.5413363575935364 0.5053853988647461 0.465243935585022 0.41113007068634033 0.36086025834083557 0.32808783650398254 0.3003191649913788 0.2793380916118622 0.26471295952796936 0.2541550099849701 0.24993854761123657 0.25305330753326416 0.2655698359012604 0.27899375557899475 0.2841063439846039 0.28888702392578125 0.30285078287124634 0.3161625862121582 0.3197145164012909 0.3178388774394989 0.31100529432296753 0.29754751920700073 0.28191861510276794 0.2750825583934784 0.27559351921081543 0.27823397517204285 0.2830919921398163 0.2850538194179535 0.2825995981693268 0.28359857201576233 0.2883332371711731 0.289949893951416 0.2929544150829315 0.30135759711265564 0.30265331268310547 0.2906714677810669 0.2753030061721802 0.2651992440223694 0.25924843549728394 0.25318726897239685 0.24550479650497437 0.23828820884227753 0.23315896093845367 0.23029816150665283 0.2334306240081787 0.24293583631515503 0.2510787546634674 0.25073981285095215 0.24615781009197235 0.2464907467365265 0.2522513270378113 0.2587389051914215 0.262591689825058 0.263126403093338 0.26156532764434814 0.2589862048625946 0.2572213411331177 0.2594248950481415 0.2655974328517914 0.27193424105644226 0.27772676944732666 0.28423818945884705 0.28888431191444397 0.29118603467941284 0.2921951413154602 0.29164180159568787 0.2948339283466339 0.3066503405570984 0.32164159417152405 0.333238422870636 0.34339842200279236 0.355623722076416 0.36564287543296814 0.36494630575180054 0.35201695561408997 0.3341171145439148 0.3175579309463501 0.30399125814437866 0.2928829789161682 0.28347793221473694 0.2780621647834778 0.276618093252182 0.27352389693260193 30442.5687 41541.616519999996 14.140093941838566 42.63377488797279 0.0 Degrees -58.74617564278722 0.012249198283408431 28.641297420407064 0.5230459500184083 0.9052486894719146 -31.249461838574835 0.010471285030812348 83.8267974762999 1.3098037700862717 0.5510780301748821 -0.36428871750831604 0.43003931641578674 0.47958770394325256 0.5450240969657898 0.634536862373352 0.7099695801734924 0.7796786427497864 0.8637834787368774 0.942089855670929 0.9903811812400818 1.0105667114257812 1.0208871364593506 1.005222201347351 0.963545024394989 0.9371297359466553 0.9139838814735413 0.8946059942245483 0.8827653527259827 0.840722918510437 0.7564958333969116 0.6611053943634033 0.5774503946304321 0.5202354192733765 0.48433250188827515 0.45376747846603394 0.4260224401950836 0.4059300422668457 0.3930695950984955 0.38632991909980774 0.3889123797416687 0.4001465141773224 0.4183931052684784 0.4428093135356903 0.47215187549591064 0.5050704479217529 0.5453080534934998 0.6085248589515686 0.658994734287262 0.668915331363678 0.6675289869308472 0.6717699766159058 0.6808158755302429 0.6681414842605591 0.6372467875480652 0.6000738739967346 0.5683797597885132 0.544323742389679 0.516345202922821 0.48224183917045593 0.4387160539627075 0.39499184489250183 0.3595888912677765 0.3304763436317444 0.3092094361782074 0.28860795497894287 0.26972246170043945 0.2605076730251312 0.26343077421188354 0.28140151500701904 0.29994896054267883 0.30823972821235657 0.31485551595687866 0.32437241077423096 0.33080095052719116 0.3303925395011902 0.3248642385005951 0.3165438175201416 0.3061983585357666 0.2946605384349823 0.2872968912124634 0.2868692874908447 0.2896806299686432 0.2909656763076782 0.2920180857181549 0.2945660948753357 0.2972028851509094 0.29964983463287354 0.3004482090473175 0.29766783118247986 0.2939799129962921 0.2927486002445221 0.2923987805843353 0.2889113426208496 0.2816716730594635 0.27281782031059265 0.2626931965351105 0.2514967918395996 0.24271203577518463 0.23827271163463593 0.23637256026268005 0.2380509227514267 0.24506837129592896 0.25348952412605286 0.25623422861099243 0.25412917137145996 0.2532842457294464 0.2547925114631653 0.2577175199985504 0.26068350672721863 0.2616606056690216 0.2597542703151703 0.2559884488582611 0.2536808252334595 0.256541907787323 0.2641761898994446 0.271513968706131 0.2755036950111389 0.27728980779647827 0.27779620885849 0.27858373522758484 0.28195881843566895 0.28836870193481445 0.29790475964546204 0.3091188371181488 0.317819207906723 0.3241935074329376 0.33264613151550293 0.3433806300163269 0.3505949378013611 0.35062962770462036 0.34647127985954285 0.3387751281261444 0.32535696029663086 0.3086860477924347 0.2940033972263336 0.2858646810054779 0.2827148139476776 0.2769644856452942 0.26818761229515076 30445.38885 41541.616519999996 13.949567230311496 43.05058779046659 0.0 Degrees -75.66121752117968 0.024705796952298773 28.883928755026126 1.0573395108768266 0.9941901147353087 -87.96943280855872 0.008170118041294187 85.4864922350208 1.0433897898712823 0.1657092533769018 -0.3773364722728729 0.43966636061668396 0.49002042412757874 0.5639562606811523 0.6609355807304382 0.7364853620529175 0.8136956691741943 0.8985644578933716 0.9468745589256287 0.9731678366661072 0.9914941191673279 0.9854417443275452 0.9628058671951294 0.9528713226318359 0.9546505808830261 0.9532977342605591 0.9257292151451111 0.8693946599960327 0.8010186553001404 0.7217180728912354 0.6436004638671875 0.5754334926605225 0.5214712619781494 0.47915247082710266 0.4447232484817505 0.41765138506889343 0.3990515470504761 0.39321616291999817 0.39747321605682373 0.40612584352493286 0.4184291958808899 0.43992483615875244 0.47834911942481995 0.5266345739364624 0.5672381520271301 0.597634494304657 0.6348262429237366 0.6744903922080994 0.6967960000038147 0.7098262310028076 0.7118614912033081 0.6856943368911743 0.6489338874816895 0.6190053224563599 0.5941586494445801 0.5711410641670227 0.5421783328056335 0.5111346244812012 0.4810764491558075 0.4355677664279938 0.3860788941383362 0.3534643054008484 0.32750168442726135 0.3032616674900055 0.2819446921348572 0.26981374621391296 0.2693929970264435 0.2801830768585205 0.30366891622543335 0.3256083130836487 0.3365386128425598 0.34310561418533325 0.35129883885383606 0.3588528633117676 0.35683950781822205 0.3458286225795746 0.33076736330986023 0.31613433361053467 0.30460110306739807 0.2960743308067322 0.2915134131908417 0.29322516918182373 0.2980576753616333 0.300569623708725 0.3029937744140625 0.3091799318790436 0.3191257119178772 0.32923704385757446 0.3315645456314087 0.3225858509540558 0.31236401200294495 0.3056598901748657 0.2981754243373871 0.2894536256790161 0.2814278304576874 0.2723696827888489 0.26151928305625916 0.2525339126586914 0.25026053190231323 0.2539668083190918 0.25997182726860046 0.26598429679870605 0.27031874656677246 0.27086934447288513 0.2690020799636841 0.26832443475723267 0.2695266008377075 0.2705895006656647 0.2702696919441223 0.27155083417892456 0.2761310338973999 0.28070759773254395 0.2832408547401428 0.2835163474082947 0.28365248441696167 0.2872329354286194 0.29273301362991333 0.29702767729759216 0.2998993694782257 0.30078554153442383 0.3016831874847412 0.30665796995162964 0.31462526321411133 0.32313990592956543 0.3358403742313385 0.3547256886959076 0.3718043267726898 0.3799355626106262 0.3825741112232208 0.383433073759079 0.3778041899204254 0.3644450008869171 0.3474675118923187 0.3291182518005371 0.3145691752433777 0.3077240586280823 0.3049233853816986 0.3022094964981079 0.2970089614391327 30442.5687 41538.7379 15.14943703154183 44.23850067435577 45.0 Degrees -76.38857262236182 0.004631214554422166 30.204593279869965 0.2093411760614958 0.9998996542510169 -20.289596380815063 0.003978761893197851 87.74938322748216 0.5226610812091969 0.4761749412326489 -0.37337228655815125 0.4396507143974304 0.49107563495635986 0.5586245059967041 0.646790623664856 0.7179062962532043 0.7848191857337952 0.8587467670440674 0.9132012128829956 0.9501560926437378 0.9785140156745911 0.984795868396759 0.9518576860427856 0.9169514179229736 0.9128903150558472 0.9190047979354858 0.9011522531509399 0.8552564978599548 0.7962431311607361 0.7195406556129456 0.6405887007713318 0.5768947005271912 0.5284963250160217 0.48475223779678345 0.44452735781669617 0.4175184965133667 0.4050688147544861 0.4015383720397949 0.4035366475582123 0.4095524847507477 0.41840967535972595 0.43762996792793274 0.4735090136528015 0.5144422650337219 0.5498296618461609 0.5891739130020142 0.6544406414031982 0.7074301838874817 0.721211850643158 0.7253494262695312 0.7205705046653748 0.7011243104934692 0.6794993877410889 0.6561350226402283 0.6234012842178345 0.5791003108024597 0.5371192693710327 0.5127407312393188 0.48728594183921814 0.43710267543792725 0.3880417048931122 0.358508825302124 0.3291686475276947 0.30198532342910767 0.2838975191116333 0.2756803035736084 0.27510562539100647 0.28265753388404846 0.30272212624549866 0.3223998248577118 0.3314470052719116 0.3400789797306061 0.3539663255214691 0.3615642189979553 0.35621216893196106 0.34422820806503296 0.33036601543426514 0.3164904713630676 0.30386441946029663 0.29513826966285706 0.2911766767501831 0.2941439151763916 0.302760511636734 0.30998602509498596 0.31750985980033875 0.32691699266433716 0.33109205961227417 0.3281230330467224 0.32525792717933655 0.32315510511398315 0.3174678683280945 0.31104981899261475 0.3055250942707062 0.297789067029953 0.28920844197273254 0.28300905227661133 0.27708175778388977 0.27133673429489136 0.26787322759628296 0.2659844756126404 0.26673445105552673 0.2708447575569153 0.2750791013240814 0.2769821286201477 0.2775936722755432 0.278523713350296 0.2802591919898987 0.2821207642555237 0.282520055770874 0.28267189860343933 0.2840110957622528 0.28552529215812683 0.28797078132629395 0.2903944253921509 0.29174160957336426 0.2954663932323456 0.30151888728141785 0.30476686358451843 0.30412399768829346 0.30343693494796753 0.30575087666511536 0.31121543049812317 0.3187049329280853 0.3290562331676483 0.3425249457359314 0.3562610149383545 0.36918962001800537 0.3792024254798889 0.3837013840675354 0.3848077654838562 0.3821556568145752 0.3716545104980469 0.3544897437095642 0.33635222911834717 0.3203563988208771 0.30804407596588135 0.3005572259426117 0.2961486577987671 0.29254403710365295 30445.38885 41538.7379 15.287506938801155 44.956915156436416 45.0 Degrees -81.76750236979787 0.017942087761759287 30.49926270974143 0.8135324371187873 0.9324530395726834 -61.4210730982497 0.011894554755490427 90.06882647010134 1.5974921533722033 0.36275784996581106 -0.38911929726600647 0.44554373621940613 0.4855414927005768 0.5539154410362244 0.6538650989532471 0.7315957546234131 0.8033648729324341 0.884945809841156 0.9360079765319824 0.954917311668396 0.9649530649185181 0.9849116206169128 1.008013129234314 0.9807816743850708 0.9428510069847107 0.9156916737556458 0.8764055967330933 0.825237512588501 0.7735792994499207 0.705725371837616 0.6241020560264587 0.5504984855651855 0.4957604706287384 0.45222288370132446 0.41255465149879456 0.3828220069408417 0.37051448225975037 0.37108558416366577 0.37338513135910034 0.37661170959472656 0.3874439001083374 0.41331085562705994 0.449747771024704 0.47858643531799316 0.4993457794189453 0.5276702642440796 0.5828417539596558 0.6414362788200378 0.6703454852104187 0.6750879287719727 0.6613235473632812 0.6516115069389343 0.6429095268249512 0.6263266801834106 0.6048684120178223 0.5731279253959656 0.5306711196899414 0.492236465215683 0.45757782459259033 0.40995675325393677 0.3611593246459961 0.33053696155548096 0.3058626651763916 0.2824017405509949 0.2620924711227417 0.24882546067237854 0.24321754276752472 0.24622128903865814 0.2659408152103424 0.29050007462501526 0.3000190854072571 0.30213284492492676 0.3106580674648285 0.3247032165527344 0.3296380937099457 0.3233187794685364 0.3104628324508667 0.29432252049446106 0.2806641161441803 0.2753435969352722 0.2728271782398224 0.270643025636673 0.2736828327178955 0.2805771827697754 0.28472232818603516 0.2870364487171173 0.2909660339355469 0.29421940445899963 0.2940268814563751 0.29415833950042725 0.2929386496543884 0.2845102548599243 0.27148693799972534 0.26009973883628845 0.25316986441612244 0.25014013051986694 0.24763965606689453 0.24328280985355377 0.24036899209022522 0.2429419606924057 0.24842298030853271 0.25228366255760193 0.25561103224754333 0.25914180278778076 0.25783947110176086 0.253574401140213 0.2532463073730469 0.25550371408462524 0.2551080286502838 0.2552626430988312 0.2603242099285126 0.2648930549621582 0.26599374413490295 0.26791733503341675 0.27033597230911255 0.27200937271118164 0.27633726596832275 0.281934916973114 0.28416839241981506 0.2850780189037323 0.28886574506759644 0.29535502195358276 0.30392923951148987 0.3146568834781647 0.3258497714996338 0.3378189206123352 0.3510323464870453 0.3626718819141388 0.3707166612148285 0.37344253063201904 0.3687247931957245 0.3559401333332062 0.336141973733902 0.31635063886642456 0.30404531955718994 0.2972669005393982 0.29117393493652344 0.28547903895378113 0.2802625894546509 30442.5687 41541.616519999996 14.612466406432896 42.07633292374312 45.0 Degrees -58.74617564278722 0.012249198283408431 28.641297420407064 0.5230459500184083 0.9052486894719146 -31.249461838574835 0.010471285030812348 83.8267974762999 1.3098037700862717 0.5510780301748821 -0.34738847613334656 0.4179860055446625 0.4664291739463806 0.5296632647514343 0.6272340416908264 0.7056167125701904 0.7561516165733337 0.8085007667541504 0.8644552826881409 0.9050332307815552 0.9181493520736694 0.9111636281013489 0.9073537588119507 0.9109403491020203 0.9062535762786865 0.8872991800308228 0.8642696738243103 0.8446381688117981 0.8067254424095154 0.7335556745529175 0.6443662047386169 0.5644205808639526 0.506117045879364 0.467324823141098 0.43990078568458557 0.4194169044494629 0.4045620858669281 0.39635950326919556 0.3957340121269226 0.40181082487106323 0.4117859899997711 0.4274001121520996 0.4520021080970764 0.48187950253486633 0.5073687434196472 0.5298813581466675 0.5784440636634827 0.6448124051094055 0.6777898669242859 0.6767211556434631 0.648645281791687 0.6306580901145935 0.6294295191764832 0.6141109466552734 0.586581289768219 0.5592874884605408 0.5341745018959045 0.5011913180351257 0.4583965539932251 0.4066646993160248 0.3704123795032501 0.3489791750907898 0.3235110640525818 0.29798153042793274 0.2787266969680786 0.26791489124298096 0.2635549306869507 0.2648940086364746 0.2800384759902954 0.30330970883369446 0.3163895010948181 0.31783244013786316 0.3187214732170105 0.3288123607635498 0.33496859669685364 0.3315340280532837 0.32235997915267944 0.30760458111763 0.289726585149765 0.27839016914367676 0.2739510238170624 0.272896945476532 0.27768412232398987 0.286607027053833 0.29376494884490967 0.30020976066589355 0.3059932589530945 0.30805355310440063 0.3080996572971344 0.30983278155326843 0.30988332629203796 0.3039196729660034 0.29341766238212585 0.28149351477622986 0.2707284390926361 0.2622477412223816 0.25400418043136597 0.2478829324245453 0.2490083873271942 0.2554311156272888 0.26148200035095215 0.26385727524757385 0.26382210850715637 0.26387882232666016 0.26245152950286865 0.26000332832336426 0.2600518763065338 0.2617824673652649 0.26309698820114136 0.26552656292915344 0.2700032591819763 0.2736172676086426 0.2747006118297577 0.2754264175891876 0.2767968773841858 0.2779064476490021 0.279891699552536 0.284357488155365 0.28945451974868774 0.2933834195137024 0.2966553568840027 0.2989789843559265 0.30280598998069763 0.31150293350219727 0.32365909218788147 0.33813759684562683 0.35394054651260376 0.3676077127456665 0.376840740442276 0.3798968195915222 0.37367281317710876 0.3576556146144867 0.3369816541671753 0.31849825382232666 0.30471497774124146 0.29529136419296265 0.2896086275577545 0.2846777141094208 0.2775256037712097 30445.38885 41541.616519999996 14.724239544441382 41.95246636406159 45.0 Degrees -75.66121752117968 0.024705796952298773 28.883928755026126 1.0573395108768266 0.9941901147353087 -87.96943280855872 0.008170118041294187 85.4864922350208 1.0433897898712823 0.1657092533769018 -0.36890196800231934 0.4383719861507416 0.49215278029441833 0.5678848028182983 0.6697624325752258 0.7421551942825317 0.7949410080909729 0.861175537109375 0.9304823279380798 0.9888854622840881 1.0296154022216797 1.0200906991958618 0.9658761620521545 0.9375912547111511 0.9355541467666626 0.9351963996887207 0.9119044542312622 0.8633236289024353 0.8102912902832031 0.7478935718536377 0.6693353056907654 0.5896985530853271 0.5278323888778687 0.47969499230384827 0.4415580630302429 0.4171638786792755 0.40274444222450256 0.3934766352176666 0.3904435634613037 0.39783647656440735 0.41653168201446533 0.4471336603164673 0.4835716187953949 0.5180643796920776 0.5542099475860596 0.5966129302978516 0.6491007804870605 0.6811864972114563 0.6899703741073608 0.6939358711242676 0.6857684850692749 0.6570229530334473 0.6270668506622314 0.6001116633415222 0.5694991946220398 0.5400396585464478 0.5212351679801941 0.5054466128349304 0.4800109267234802 0.4332926869392395 0.38531044125556946 0.35653600096702576 0.33400747179985046 0.3157062530517578 0.3017118573188782 0.29292401671409607 0.2914346158504486 0.2968195676803589 0.3123685419559479 0.3298073410987854 0.3378491699695587 0.3447093665599823 0.35713934898376465 0.36121153831481934 0.354942262172699 0.35000061988830566 0.34591320157051086 0.3377359211444855 0.32351627945899963 0.3089088499546051 0.299715518951416 0.29520851373672485 0.29720360040664673 0.3091683089733124 0.3235648274421692 0.3309069871902466 0.3311137557029724 0.3341479003429413 0.3409155011177063 0.3392958343029022 0.32886332273483276 0.318060964345932 0.31203606724739075 0.30700525641441345 0.2969604432582855 0.2861284911632538 0.2785927355289459 0.27391406893730164 0.2739171087741852 0.27796828746795654 0.2818444073200226 0.28413259983062744 0.28639599680900574 0.28605619072914124 0.28013235330581665 0.27383479475975037 0.27307555079460144 0.27768054604530334 0.2847695052623749 0.29085657000541687 0.28964218497276306 0.2820451259613037 0.2783108055591583 0.28211650252342224 0.28757697343826294 0.2919096350669861 0.2974321246147156 0.30412620306015015 0.3101852238178253 0.31293031573295593 0.31173041462898254 0.31200647354125977 0.31643787026405334 0.3226405680179596 0.33135539293289185 0.3442952632904053 0.3607310354709625 0.37769126892089844 0.38771292567253113 0.3854190707206726 0.37552234530448914 0.36437416076660156 0.35301434993743896 0.34029337763786316 0.3268333971500397 0.31639185547828674 0.31317082047462463 0.31620898842811584 0.31643491983413696 30442.5687 41538.7379 15.196114730939069 43.482395133432554 90.0 Degrees -76.38857262236182 0.004631214554422166 30.204593279869965 0.2093411760614958 0.9998996542510169 -20.289596380815063 0.003978761893197851 87.74938322748216 0.5226610812091969 0.4761749412326489 -0.37875914573669434 0.4469207227230072 0.49604201316833496 0.5680999159812927 0.6705905199050903 0.7483171224594116 0.80452561378479 0.8658115863800049 0.9279407262802124 0.9807824492454529 1.0223487615585327 1.0514615774154663 1.0463922023773193 1.0112226009368896 0.9982134103775024 1.004634141921997 0.9877952933311462 0.9317412972450256 0.8688726425170898 0.791929304599762 0.6982804536819458 0.6116718649864197 0.5463566184043884 0.4956464171409607 0.4562545120716095 0.43035486340522766 0.41308432817459106 0.4023517668247223 0.40038397908210754 0.4071796238422394 0.4212566614151001 0.44529813528060913 0.47869226336479187 0.5134111642837524 0.5476288199424744 0.5924862027168274 0.6646744608879089 0.7205690741539001 0.7406251430511475 0.7573677897453308 0.7730262279510498 0.7530763149261475 0.701831042766571 0.6527606844902039 0.6117518544197083 0.5808829665184021 0.5582142472267151 0.5362958312034607 0.5081617832183838 0.4623250961303711 0.41480353474617004 0.3816410005092621 0.3512253761291504 0.3229435384273529 0.30036529898643494 0.28829801082611084 0.28772664070129395 0.29815641045570374 0.31810328364372253 0.33310839533805847 0.34295332431793213 0.3576355576515198 0.37281879782676697 0.37368515133857727 0.36629509925842285 0.3603748083114624 0.35585665702819824 0.3474416136741638 0.33159855008125305 0.31616654992103577 0.3076492249965668 0.307073712348938 0.3140259385108948 0.3209126889705658 0.3253902792930603 0.3307969272136688 0.3362623155117035 0.34198322892189026 0.3472789525985718 0.3470509350299835 0.3400651216506958 0.3291180729866028 0.31915709376335144 0.3109745383262634 0.3023119568824768 0.2948138117790222 0.28782516717910767 0.27949029207229614 0.2736770212650299 0.2739221751689911 0.27921369671821594 0.2852224111557007 0.2887378931045532 0.2893288731575012 0.28667038679122925 0.2830811142921448 0.28239449858665466 0.28517019748687744 0.28917649388313293 0.2914784848690033 0.2913095951080322 0.2914259135723114 0.29324576258659363 0.2956298291683197 0.2981545031070709 0.3011481463909149 0.3054879605770111 0.3107515871524811 0.31411612033843994 0.31555652618408203 0.3172118663787842 0.31911471486091614 0.32280173897743225 0.33204859495162964 0.3453712463378906 0.357761949300766 0.3699503242969513 0.38311585783958435 0.39259737730026245 0.395723819732666 0.39234602451324463 0.38097503781318665 0.3659316301345825 0.3534175157546997 0.34347930550575256 0.33371132612228394 0.3236602544784546 0.3152346611022949 0.30779775977134705 30445.38885 41538.7379 15.717131304491499 46.21617319326819 90.0 Degrees -81.76750236979787 0.017942087761759287 30.49926270974143 0.8135324371187873 0.9324530395726834 -61.4210730982497 0.011894554755490427 90.06882647010134 1.5974921533722033 0.36275784996581106 -0.3608156144618988 0.4259406626224518 0.47818616032600403 0.5471063256263733 0.6347803473472595 0.7001804113388062 0.7520433068275452 0.8171277642250061 0.8950353264808655 0.9654224514961243 1.013027548789978 1.0263880491256714 0.9852103590965271 0.941172182559967 0.931695818901062 0.9181087017059326 0.8757404685020447 0.8307337164878845 0.7877539992332458 0.7257715463638306 0.6523596048355103 0.5768492817878723 0.5085425972938538 0.456727534532547 0.4192277491092682 0.3939008414745331 0.3818787932395935 0.3828960657119751 0.389323353767395 0.39450258016586304 0.39829221367836 0.40605780482292175 0.4275314211845398 0.4643791615962982 0.505535900592804 0.5479178428649902 0.5994552969932556 0.6376073360443115 0.6582133769989014 0.6799547672271729 0.6931027770042419 0.6702796816825867 0.6343024969100952 0.6056128144264221 0.5789087414741516 0.5561301112174988 0.53394615650177 0.4996113181114197 0.4577721953392029 0.4083678126335144 0.36549386382102966 0.3386378884315491 0.3173430263996124 0.2995651960372925 0.2844037711620331 0.27193325757980347 0.26600706577301025 0.2700923979282379 0.2851560115814209 0.30088505148887634 0.3138630986213684 0.3285767436027527 0.3413139879703522 0.3445935547351837 0.3396775424480438 0.330121785402298 0.3199063241481781 0.30752673745155334 0.2904285490512848 0.27791693806648254 0.2726101279258728 0.27176886796951294 0.2783729135990143 0.2872854471206665 0.29147452116012573 0.29573073983192444 0.30301201343536377 0.3096592128276825 0.3131972551345825 0.31535086035728455 0.3140628933906555 0.3053463399410248 0.2954469323158264 0.2890409231185913 0.280372679233551 0.2706373333930969 0.2643801271915436 0.25798389315605164 0.2508365511894226 0.24706313014030457 0.2483857423067093 0.25367772579193115 0.2591390609741211 0.26199933886528015 0.2643854320049286 0.2681591808795929 0.2714567184448242 0.27293530106544495 0.2729243338108063 0.27181246876716614 0.27032458782196045 0.2693708539009094 0.26829567551612854 0.2665247321128845 0.2669430077075958 0.271585613489151 0.2774175703525543 0.28121861815452576 0.2841823399066925 0.28875136375427246 0.2948462665081024 0.3012498915195465 0.30834972858428955 0.3174125552177429 0.3262895941734314 0.33198782801628113 0.3391663730144501 0.35144802927970886 0.3615659177303314 0.3633808195590973 0.3589021563529968 0.3500611186027527 0.33608290553092957 0.3192422091960907 0.30552980303764343 0.29612672328948975 0.2880210280418396 0.2813362777233124 0.2759957015514374 30442.5687 41541.616519999996 14.381547746983568 42.02895298858711 90.0 Degrees -58.74617564278722 0.012249198283408431 28.641297420407064 0.5230459500184083 0.9052486894719146 -31.249461838574835 0.010471285030812348 83.8267974762999 1.3098037700862717 0.5510780301748821 -0.3729221224784851 0.44012895226478577 0.4914250373840332 0.5655630230903625 0.6647416949272156 0.7444058060646057 0.8126416206359863 0.8799846172332764 0.9443001747131348 0.9979190826416016 1.0210847854614258 1.0208030939102173 1.0111762285232544 0.992798924446106 0.9904224276542664 0.99041348695755 0.9595239162445068 0.908574640750885 0.846463143825531 0.7647848725318909 0.6809067726135254 0.6017272472381592 0.5331747531890869 0.48201125860214233 0.44443103671073914 0.41660502552986145 0.3969760835170746 0.38763803243637085 0.38977357745170593 0.4000709354877472 0.41259172558784485 0.4278537333011627 0.45189592242240906 0.48642393946647644 0.5247828960418701 0.5645804405212402 0.612518310546875 0.6483836770057678 0.6727944016456604 0.7076162695884705 0.7434014678001404 0.7206994891166687 0.6666464805603027 0.63228839635849 0.608867883682251 0.5807878971099854 0.5441436171531677 0.5172581076622009 0.4963454604148865 0.45485949516296387 0.401254266500473 0.36339372396469116 0.3367786109447479 0.31736981868743896 0.29844656586647034 0.28279122710227966 0.27746984362602234 0.2811555564403534 0.2927308678627014 0.3071295917034149 0.3210527002811432 0.33639973402023315 0.3501872718334198 0.3525633215904236 0.34586936235427856 0.33730486035346985 0.3312234878540039 0.32529526948928833 0.31066590547561646 0.2939175069332123 0.286742240190506 0.28868338465690613 0.2973419427871704 0.3067079484462738 0.31102290749549866 0.31296807527542114 0.3165799379348755 0.3216167390346527 0.32459816336631775 0.32458773255348206 0.32075992226600647 0.31120601296424866 0.3001273572444916 0.2915954291820526 0.28556665778160095 0.28158968687057495 0.2759927809238434 0.26627132296562195 0.25822049379348755 0.25609999895095825 0.2582840323448181 0.26162636280059814 0.26389646530151367 0.26584580540657043 0.269505113363266 0.2740560472011566 0.2757222354412079 0.2737424373626709 0.27331092953681946 0.2753473222255707 0.2754512131214142 0.2745696008205414 0.27530866861343384 0.2763848900794983 0.27731868624687195 0.2794644236564636 0.28307804465293884 0.2873600125312805 0.29181772470474243 0.29564568400382996 0.29717445373535156 0.2980411946773529 0.30308812856674194 0.31369927525520325 0.3267776072025299 0.3403771221637726 0.3552534282207489 0.3692227900028229 0.3773849606513977 0.37742289900779724 0.3699462413787842 0.3581613600254059 0.3446747362613678 0.3301258683204651 0.3174242079257965 0.3073962330818176 0.2965550720691681 0.28561556339263916 0.27806076407432556 30445.38885 41541.616519999996 14.87720727584366 44.091357683377474 90.0 Degrees -75.66121752117968 0.024705796952298773 28.883928755026126 1.0573395108768266 0.9941901147353087 -87.96943280855872 0.008170118041294187 85.4864922350208 1.0433897898712823 0.1657092533769018 -0.3949830234050751 0.4622531533241272 0.5109723210334778 0.5819476842880249 0.6732906699180603 0.7399584054946899 0.8056941032409668 0.8803262114524841 0.9407079219818115 0.9959824681282043 1.0247737169265747 0.9988774061203003 0.9598121643066406 0.9596822261810303 0.9756194353103638 0.9531159996986389 0.8880895376205444 0.8291646242141724 0.7852953672409058 0.7326091527938843 0.6583097577095032 0.5755128264427185 0.5128992199897766 0.47360721230506897 0.4461856484413147 0.424794465303421 0.40726786851882935 0.39642640948295593 0.3955315947532654 0.3990853428840637 0.40200623869895935 0.41744357347488403 0.4541429877281189 0.4928371012210846 0.523593544960022 0.5572065114974976 0.6082401275634766 0.6535071730613708 0.6752548813819885 0.6942375302314758 0.7089064717292786 0.6849415898323059 0.648251473903656 0.6290637254714966 0.611190140247345 0.5820888876914978 0.5479511022567749 0.5251440405845642 0.5092036724090576 0.4710317552089691 0.41165193915367126 0.368015855550766 0.33563244342803955 0.30891987681388855 0.289467990398407 0.279835045337677 0.2776188254356384 0.281124472618103 0.2969658076763153 0.3199588358402252 0.3370678722858429 0.35005685687065125 0.3592534065246582 0.3598088026046753 0.3555058240890503 0.34791675209999084 0.3381218910217285 0.32693901658058167 0.3126853406429291 0.3007925748825073 0.2955957353115082 0.2945536673069 0.29722654819488525 0.30562835931777954 0.3160330057144165 0.32335811853408813 0.32722195982933044 0.33106622099876404 0.333890825510025 0.3307388126850128 0.32467377185821533 0.31839045882225037 0.3102380931377411 0.30023348331451416 0.28814268112182617 0.2750730514526367 0.26571476459503174 0.2631886601448059 0.2642560303211212 0.2657497227191925 0.2698196768760681 0.2753346860408783 0.27848049998283386 0.27970898151397705 0.2795354127883911 0.2767869830131531 0.27504852414131165 0.2782919108867645 0.28145065903663635 0.2807522118091583 0.2820216417312622 0.28606170415878296 0.2876238524913788 0.2858695089817047 0.28583207726478577 0.29170745611190796 0.2989623248577118 0.3013303577899933 0.3022397756576538 0.3061143457889557 0.31094178557395935 0.31485098600387573 0.3188069462776184 0.32449349761009216 0.333775132894516 0.34593096375465393 0.3592696785926819 0.3726845979690552 0.3809838593006134 0.37974658608436584 0.37090665102005005 0.3579893112182617 0.3460439443588257 0.33749645948410034 0.3274995684623718 0.3147842586040497 0.3056890070438385 0.3015490472316742 0.2963547110557556 30442.5687 41538.7379 15.053673351479718 43.89851045568374 135.0 Degrees -76.38857262236182 0.004631214554422166 30.204593279869965 0.2093411760614958 0.9998996542510169 -20.289596380815063 0.003978761893197851 87.74938322748216 0.5226610812091969 0.4761749412326489 -0.36599868535995483 0.44001543521881104 0.4966375231742859 0.5643589496612549 0.654793381690979 0.7409048080444336 0.8192135691642761 0.8847960829734802 0.9369638562202454 0.9906289577484131 1.025296688079834 1.0149723291397095 0.9805884957313538 0.9636447429656982 0.9588003158569336 0.9524202942848206 0.9314351677894592 0.8927587270736694 0.8397254943847656 0.7675902843475342 0.6844693422317505 0.6059010624885559 0.5474121570587158 0.5043894052505493 0.468307226896286 0.44075509905815125 0.4207476079463959 0.4080858826637268 0.40591961145401 0.4134867191314697 0.42650675773620605 0.4475072920322418 0.47888901829719543 0.5122790336608887 0.5369526743888855 0.5554997324943542 0.5947977304458618 0.647955060005188 0.6778163313865662 0.6932549476623535 0.6977417469024658 0.6872305870056152 0.659528911113739 0.6245843768119812 0.5957351922988892 0.5746957659721375 0.5465317368507385 0.5116745233535767 0.47723180055618286 0.4333028197288513 0.3936629891395569 0.36897724866867065 0.345966637134552 0.3255443572998047 0.31004011631011963 0.29891106486320496 0.2932963967323303 0.2937392592430115 0.3078584671020508 0.33370327949523926 0.35201096534729004 0.3585779666900635 0.36050570011138916 0.3624379336833954 0.3620472550392151 0.35969817638397217 0.35452911257743835 0.3419364094734192 0.3230227828025818 0.30832669138908386 0.30204203724861145 0.3018741011619568 0.30683496594429016 0.3151794970035553 0.3218154311180115 0.3262678384780884 0.33061009645462036 0.33248963952064514 0.3305680453777313 0.32937225699424744 0.3280726373195648 0.322355717420578 0.3143385052680969 0.30674803256988525 0.2977624237537384 0.28612422943115234 0.27380654215812683 0.26605281233787537 0.2670673131942749 0.27401211857795715 0.2821645736694336 0.28739145398139954 0.289187490940094 0.2906554937362671 0.29101991653442383 0.28759765625 0.28305813670158386 0.28146880865097046 0.2823540270328522 0.2834238111972809 0.28334492444992065 0.28242823481559753 0.2830897569656372 0.285215824842453 0.286749929189682 0.2894335985183716 0.2963193953037262 0.30561134219169617 0.31135934591293335 0.3125182092189789 0.3135771155357361 0.31644806265830994 0.3219490647315979 0.3305686414241791 0.3386459946632385 0.34468361735343933 0.35293155908584595 0.3640737235546112 0.3740508556365967 0.3799596130847931 0.3787302076816559 0.3690877854824066 0.3545362651348114 0.33818575739860535 0.32251599431037903 0.31119340658187866 0.3069508969783783 0.30643993616104126 0.3014766573905945 30445.38885 41538.7379 15.056927844654062 43.61475352701898 135.0 Degrees -81.76750236979787 0.017942087761759287 30.49926270974143 0.8135324371187873 0.9324530395726834 -61.4210730982497 0.011894554755490427 90.06882647010134 1.5974921533722033 0.36275784996581106 -0.36250585317611694 0.42431044578552246 0.4834742844104767 0.5558268427848816 0.6433207988739014 0.7237451076507568 0.797504723072052 0.8740603923797607 0.9462519288063049 1.0028680562973022 1.0236170291900635 0.9993492960929871 0.9659426808357239 0.929129958152771 0.8976386189460754 0.8773003220558167 0.845932126045227 0.804290771484375 0.7517927289009094 0.6770941019058228 0.5976353883743286 0.5313588380813599 0.48177453875541687 0.44140711426734924 0.40849852561950684 0.3899365961551666 0.38149017095565796 0.3739112615585327 0.3684139847755432 0.372007817029953 0.38562244176864624 0.40915170311927795 0.4383581876754761 0.46522119641304016 0.4911789894104004 0.5281954407691956 0.5901359915733337 0.6282098889350891 0.6299937963485718 0.6347435712814331 0.6456948518753052 0.6421006917953491 0.6224752068519592 0.6007646918296814 0.5784657001495361 0.5487658381462097 0.5032517313957214 0.4633730351924896 0.4398660957813263 0.41094517707824707 0.3713396489620209 0.3397798538208008 0.315258264541626 0.2960793673992157 0.2789282202720642 0.26473933458328247 0.2583105266094208 0.26161065697669983 0.276593953371048 0.29428234696388245 0.30759015679359436 0.3208509385585785 0.33403608202934265 0.3378518223762512 0.3314681351184845 0.3205536901950836 0.3096092939376831 0.29909756779670715 0.2854691445827484 0.27216678857803345 0.2648516893386841 0.26480165123939514 0.27259862422943115 0.28223392367362976 0.28807657957077026 0.2966751158237457 0.3103998601436615 0.31771647930145264 0.3139994740486145 0.31038033962249756 0.30780771374702454 0.30000224709510803 0.2885487973690033 0.2776309549808502 0.2691199779510498 0.26336920261383057 0.2575911581516266 0.2499367892742157 0.24667014181613922 0.2502342164516449 0.2533777952194214 0.25388017296791077 0.2556212842464447 0.2578236758708954 0.25818225741386414 0.2583445906639099 0.2599364221096039 0.2620580792427063 0.2627926170825958 0.2631688117980957 0.2642405927181244 0.263955682516098 0.2622736394405365 0.2618711590766907 0.2638363242149353 0.2683615982532501 0.2739871144294739 0.27764204144477844 0.2804603576660156 0.28473037481307983 0.28941360116004944 0.2937960624694824 0.2986640930175781 0.30610325932502747 0.316412091255188 0.3255343437194824 0.3314375877380371 0.33745360374450684 0.3465556502342224 0.355802059173584 0.358920693397522 0.35263997316360474 0.33765292167663574 0.3183898329734802 0.30118611454963684 0.2887457013130188 0.28239473700523376 0.2824958264827728 0.2819530665874481 30442.5687 41541.616519999996 14.148486745442884 40.914534151939826 135.0 Degrees -58.74617564278722 0.012249198283408431 28.641297420407064 0.5230459500184083 0.9052486894719146 -31.249461838574835 0.010471285030812348 83.8267974762999 1.3098037700862717 0.5510780301748821 -0.3650876581668854 0.44027072191238403 0.49740421772003174 0.5676716566085815 0.6565104126930237 0.7217820286750793 0.776906430721283 0.8554854989051819 0.9431904554367065 0.99639892578125 0.9918259382247925 0.9632425308227539 0.9571559429168701 0.9453587532043457 0.9196834564208984 0.9045694470405579 0.8967841863632202 0.8714707493782043 0.8187240958213806 0.7500607967376709 0.6737703084945679 0.5944964289665222 0.5322104096412659 0.48620209097862244 0.4495582580566406 0.4267524480819702 0.4147963225841522 0.4065539836883545 0.40079763531684875 0.40120112895965576 0.4117395281791687 0.4343542158603668 0.4588378369808197 0.4770737290382385 0.49635985493659973 0.5230758190155029 0.5750504732131958 0.6321943402290344 0.6574925780296326 0.6613973379135132 0.6457144618034363 0.6232727766036987 0.6174584627151489 0.6194400787353516 0.6105873584747314 0.5773681402206421 0.5304786562919617 0.4934249520301819 0.45931971073150635 0.41730549931526184 0.38470304012298584 0.3595018684864044 0.3293219804763794 0.30435964465141296 0.2891426980495453 0.2798253893852234 0.2746725082397461 0.2748556435108185 0.2886051833629608 0.3117738366127014 0.32717078924179077 0.33106401562690735 0.3289177715778351 0.33031389117240906 0.33271220326423645 0.3304341435432434 0.32225725054740906 0.30900219082832336 0.2952777147293091 0.2869744896888733 0.28450044989585876 0.2863030433654785 0.29052266478538513 0.29561755061149597 0.3012177348136902 0.3077249825000763 0.3149780333042145 0.3194979727268219 0.31837978959083557 0.3156931400299072 0.31331557035446167 0.3074597716331482 0.29792141914367676 0.28665927052497864 0.2769920229911804 0.2717728316783905 0.2680080831050873 0.26393961906433105 0.2608543634414673 0.25888293981552124 0.25867512822151184 0.2605808675289154 0.263666570186615 0.26618891954421997 0.2665948271751404 0.2663698196411133 0.2670312225818634 0.26882821321487427 0.27096620202064514 0.2717668414115906 0.2718110680580139 0.2726369798183441 0.27475622296333313 0.2783312201499939 0.2822757363319397 0.285504013299942 0.2890436351299286 0.29262956976890564 0.292468398809433 0.2886587381362915 0.28673070669174194 0.2884071469306946 0.29260167479515076 0.30139777064323425 0.31254521012306213 0.32084983587265015 0.329580694437027 0.34177514910697937 0.35234349966049194 0.3568665683269501 0.3554323613643646 0.3491654396057129 0.3388620913028717 0.32499754428863525 0.3104616105556488 0.29853302240371704 0.28830283880233765 0.27974289655685425 0.27512240409851074 30445.38885 41541.616519999996 14.216843459338445 41.87857263213592 135.0 Degrees -75.66121752117968 0.024705796952298773 28.883928755026126 1.0573395108768266 0.9941901147353087 -87.96943280855872 0.008170118041294187 85.4864922350208 1.0433897898712823 0.1657092533769018 +map_x map_y 1214.0 - 1258.0 1500.0 - 1580.0 Polarisation Angle Azimuth Angle (1214.0 - 1258.0) Hermans Orientation Function (1214.0 - 1258.0) Intensity (1214.0 - 1258.0) Amplitude (1214.0 - 1258.0) R-squared (1214.0 - 1258.0) Azimuth Angle (1500.0 - 1580.0) Hermans Orientation Function (1500.0 - 1580.0) Intensity (1500.0 - 1580.0) Amplitude (1500.0 - 1580.0) R-squared (1500.0 - 1580.0) 1203.4202109667972 1207.277327027588 1211.1344430883792 1214.99155914917 1218.8486752099611 1222.7057912707523 1226.562907331543 1230.4200233923343 1234.277139453125 1238.1342555139163 1241.991371574707 1245.8484876354983 1249.705603696289 1253.5627197570802 1257.4198358178714 1261.2769518786622 1265.1340679394534 1268.9911840002442 1272.8483000610354 1276.7054161218261 1280.5625321826174 1284.4196482434086 1288.2767643041993 1292.1338803649905 1295.9909964257813 1299.8481124865725 1303.7052285473633 1307.5623446081545 1311.4194606689457 1315.2765767297365 1319.1336927905277 1322.9908088513184 1326.8479249121096 1330.7050409729004 1334.5621570336916 1338.4192730944824 1342.2763891552736 1346.1335052160648 1349.9906212768556 1353.8477373376468 1357.7048533984375 1361.5619694592287 1365.4190855200195 1369.2762015808107 1373.133317641602 1376.9904337023927 1380.847549763184 1384.7046658239747 1388.5617818847659 1392.4188979455566 1396.2760140063479 1400.133130067139 1403.9902461279298 1407.847362188721 1411.7044782495118 1415.561594310303 1419.4187103710938 1423.275826431885 1427.1329424926757 1430.990058553467 1434.8471746142582 1438.704290675049 1442.5614067358401 1446.418522796631 1450.275638857422 1454.1327549182129 1457.989870979004 1461.8469870397953 1465.704103100586 1469.5612191613773 1473.418335222168 1477.2754512829592 1481.13256734375 1484.9896834045412 1488.8467994653324 1492.7039155261232 1496.5610315869144 1500.4181476477052 1504.2752637084964 1508.1323797692871 1511.9894958300783 1515.846611890869 1519.7037279516603 1523.5608440124515 1527.4179600732423 1531.2750761340335 1535.1321921948243 1538.9893082556155 1542.8464243164062 1546.7035403771974 1550.5606564379887 1554.4177724987794 1558.2748885595706 1562.1320046203614 1565.9891206811526 1569.8462367419434 1573.7033528027346 1577.5604688635258 1581.4175849243165 1585.2747009851078 1589.1318170458985 1592.9889331066897 1596.8460491674805 1600.7031652282717 1604.5602812890625 1608.4173973498537 1612.2745134106449 1616.1316294714356 1619.9887455322269 1623.8458615930176 1627.7029776538088 1631.5600937145996 1635.4172097753908 1639.274325836182 1643.1314418969728 1646.988557957764 1650.8456740185547 1654.702790079346 1658.5599061401367 1662.417022200928 1666.2741382617191 1670.13125432251 1673.9883703833011 1677.8454864440919 1681.702602504883 1685.5597185656738 1689.416834626465 1693.2739506872558 1697.131066748047 +continuous continuous continuous continuous 0.0\ Degrees 45.0\ Degrees 90.0\ Degrees 135.0\ Degrees continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous continuous +meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta +30442.56870 41538.7 15.01 43.8794 0.0 Degrees -76.3886 0.00463121 15.1023 0.209341 0.9999 -20.2896 0.00397876 43.8747 0.522661 0.476175 0.287261 0.293882 0.297508 0.302286 0.312591 0.32878 0.346964 0.362572 0.373945 0.380348 0.380321 0.374495 0.363802 0.349067 0.33494 0.325305 0.318378 0.311427 0.30373 0.29774 0.295033 0.292611 0.29067 0.2909 0.289319 0.283677 0.277591 0.274682 0.274906 0.275084 0.272302 0.268401 0.267278 0.269375 0.272837 0.274141 0.2694 0.260834 0.254072 0.253377 0.257575 0.262868 0.270122 0.280275 0.288891 0.293777 0.300091 0.308883 0.31535 0.317585 0.317625 0.316181 0.311551 0.305746 0.302562 0.298723 0.290963 0.288164 0.294363 0.303229 0.311636 0.320071 0.328554 0.337744 0.347677 0.35353 0.344313 0.328142 0.319428 0.311504 0.293092 0.27016 0.259254 0.262548 0.280365 0.307472 0.334361 0.361379 0.396993 0.444328 0.477933 0.500553 0.537606 0.588599 0.626357 0.650183 0.672416 0.693028 0.698699 0.688528 0.676693 0.660426 0.617829 0.566765 0.528336 0.491682 0.461379 0.434376 0.409832 0.394715 0.386007 0.379658 0.381096 0.399153 0.431717 0.469617 0.513116 0.578222 0.66893 0.758444 0.8181 0.853371 0.897934 0.953696 1.00132 1.04376 1.06195 1.05437 1.04048 1.00985 0.955917 0.877086 0.787692 0.7115 0.637403 0.554745 0.49063 0.437823 0.371112 +30445.38885 41538.7 14.937 45.3498 0.0 Degrees -81.7675 0.0179421 15.2496 0.813532 0.932453 -61.4211 0.0118946 45.0344 1.59749 0.362758 0.281542 0.287401 0.29221 0.299888 0.314004 0.332075 0.350018 0.363424 0.369344 0.370461 0.371579 0.371787 0.36371 0.348212 0.336029 0.329395 0.322253 0.312866 0.305823 0.306542 0.310213 0.306977 0.298274 0.289972 0.282366 0.276259 0.275175 0.278512 0.280018 0.277063 0.272044 0.267816 0.266933 0.267989 0.267923 0.267012 0.265956 0.263926 0.261076 0.258419 0.257783 0.260914 0.266729 0.275201 0.287219 0.296864 0.301827 0.307955 0.316999 0.325933 0.330107 0.326264 0.316769 0.306048 0.298683 0.2956 0.291835 0.286729 0.287214 0.295572 0.312221 0.331286 0.342701 0.348662 0.354143 0.357323 0.351947 0.341523 0.334706 0.327077 0.306906 0.280963 0.269342 0.274902 0.295836 0.322182 0.34704 0.374486 0.410674 0.45882 0.495035 0.524703 0.571424 0.616929 0.635799 0.646581 0.6643 0.692803 0.720735 0.73008 0.728708 0.710415 0.643052 0.570625 0.535248 0.50936 0.480137 0.449539 0.426122 0.410452 0.399818 0.397541 0.406234 0.425255 0.455413 0.497125 0.547186 0.611775 0.690886 0.765513 0.827145 0.878587 0.937334 0.998684 1.02539 1.04238 1.07118 1.06373 1.03618 1.01079 0.978589 0.917378 0.822211 0.739631 0.666456 0.57625 0.502106 0.448678 0.388349 +30442.56870 41541.6 14.1401 42.6338 0.0 Degrees -58.7462 0.0122492 14.3206 0.523046 0.905249 -31.2495 0.0104713 41.9134 1.3098 0.551078 0.273524 0.276618 0.278062 0.283478 0.292883 0.303991 0.317558 0.334117 0.352017 0.364946 0.365643 0.355624 0.343398 0.333238 0.321642 0.30665 0.294834 0.291642 0.292195 0.291186 0.288884 0.284238 0.277727 0.271934 0.265597 0.259425 0.257221 0.258986 0.261565 0.263126 0.262592 0.258739 0.252251 0.246491 0.246158 0.25074 0.251079 0.242936 0.233431 0.230298 0.233159 0.238288 0.245505 0.253187 0.259248 0.265199 0.275303 0.290671 0.302653 0.301358 0.292954 0.28995 0.288333 0.283599 0.2826 0.285054 0.283092 0.278234 0.275594 0.275083 0.281919 0.297548 0.311005 0.317839 0.319715 0.316163 0.302851 0.288887 0.284106 0.278994 0.26557 0.253053 0.249939 0.254155 0.264713 0.279338 0.300319 0.328088 0.36086 0.41113 0.465244 0.505385 0.541336 0.569674 0.592659 0.618993 0.654198 0.699965 0.716811 0.700334 0.689275 0.669128 0.597113 0.523782 0.491777 0.463111 0.423863 0.389188 0.373266 0.368028 0.364984 0.368648 0.3797 0.393359 0.414583 0.447617 0.487752 0.541538 0.620548 0.718398 0.812932 0.884242 0.930256 0.951112 0.982504 1.0494 1.09659 1.05384 1.00317 0.973045 0.939802 0.874753 0.793703 0.731933 0.665755 0.570333 0.4922 0.436718 0.366888 +30445.38885 41541.6 13.9496 43.0506 0.0 Degrees -75.6612 0.0247058 14.442 1.05734 0.99419 -87.9694 0.00817012 42.7432 1.04339 0.165709 0.268188 0.276964 0.282715 0.285865 0.294003 0.308686 0.325357 0.338775 0.346471 0.35063 0.350595 0.343381 0.332646 0.324194 0.317819 0.309119 0.297905 0.288369 0.281959 0.278584 0.277796 0.27729 0.275504 0.271514 0.264176 0.256542 0.253681 0.255988 0.259754 0.261661 0.260684 0.257718 0.254793 0.253284 0.254129 0.256234 0.25349 0.245068 0.238051 0.236373 0.238273 0.242712 0.251497 0.262693 0.272818 0.281672 0.288911 0.292399 0.292749 0.29398 0.297668 0.300448 0.29965 0.297203 0.294566 0.292018 0.290966 0.289681 0.286869 0.287297 0.294661 0.306198 0.316544 0.324864 0.330393 0.330801 0.324372 0.314856 0.30824 0.299949 0.281402 0.263431 0.260508 0.269722 0.288608 0.309209 0.330476 0.359589 0.394992 0.438716 0.482242 0.516345 0.544324 0.56838 0.600074 0.637247 0.668141 0.680816 0.67177 0.667529 0.668915 0.658995 0.608525 0.545308 0.50507 0.472152 0.442809 0.418393 0.400147 0.388912 0.38633 0.39307 0.40593 0.426022 0.453767 0.484333 0.520235 0.57745 0.661105 0.756496 0.840723 0.882765 0.894606 0.913984 0.93713 0.963545 1.00522 1.02089 1.01057 0.990381 0.94209 0.863783 0.779679 0.70997 0.634537 0.545024 0.479588 0.430039 0.364289 +30442.56870 41538.7 15.1494 44.2385 45.0 Degrees -76.3886 0.00463121 15.1023 0.209341 0.9999 -20.2896 0.00397876 43.8747 0.522661 0.476175 0.297009 0.302209 0.304923 0.307724 0.314569 0.329118 0.347468 0.364445 0.377804 0.383433 0.382574 0.379936 0.371804 0.354726 0.33584 0.32314 0.314625 0.306658 0.301683 0.300786 0.299899 0.297028 0.292733 0.287233 0.283652 0.283516 0.283241 0.280708 0.276131 0.271551 0.27027 0.27059 0.269527 0.268324 0.269002 0.270869 0.270319 0.265984 0.259972 0.253967 0.250261 0.252534 0.261519 0.27237 0.281428 0.289454 0.298175 0.30566 0.312364 0.322586 0.331565 0.329237 0.319126 0.30918 0.302994 0.30057 0.298058 0.293225 0.291513 0.296074 0.304601 0.316134 0.330767 0.345829 0.35684 0.358853 0.351299 0.343106 0.336539 0.325608 0.303669 0.280183 0.269393 0.269814 0.281945 0.303262 0.327502 0.353464 0.386079 0.435568 0.481076 0.511135 0.542178 0.571141 0.594159 0.619005 0.648934 0.685694 0.711861 0.709826 0.696796 0.67449 0.634826 0.597634 0.567238 0.526635 0.478349 0.439925 0.418429 0.406126 0.397473 0.393216 0.399052 0.417651 0.444723 0.479152 0.521471 0.575433 0.6436 0.721718 0.801019 0.869395 0.925729 0.953298 0.954651 0.952871 0.962806 0.985442 0.991494 0.973168 0.946875 0.898564 0.813696 0.736485 0.660936 0.563956 0.49002 0.439666 0.377336 +30445.38885 41538.7 15.2875 44.9569 45.0 Degrees -81.7675 0.0179421 15.2496 0.813532 0.932453 -61.4211 0.0118946 45.0344 1.59749 0.362758 0.292544 0.296149 0.300557 0.308044 0.320356 0.336352 0.35449 0.371655 0.382156 0.384808 0.383701 0.379202 0.36919 0.356261 0.342525 0.329056 0.318705 0.311215 0.305751 0.303437 0.304124 0.304767 0.301519 0.295466 0.291742 0.290394 0.287971 0.285525 0.284011 0.282672 0.28252 0.282121 0.280259 0.278524 0.277594 0.276982 0.275079 0.270845 0.266734 0.265984 0.267873 0.271337 0.277082 0.283009 0.289208 0.297789 0.305525 0.31105 0.317468 0.323155 0.325258 0.328123 0.331092 0.326917 0.31751 0.309986 0.302761 0.294144 0.291177 0.295138 0.303864 0.31649 0.330366 0.344228 0.356212 0.361564 0.353966 0.340079 0.331447 0.3224 0.302722 0.282658 0.275106 0.27568 0.283898 0.301985 0.329169 0.358509 0.388042 0.437103 0.487286 0.512741 0.537119 0.5791 0.623401 0.656135 0.679499 0.701124 0.720571 0.725349 0.721212 0.70743 0.654441 0.589174 0.54983 0.514442 0.473509 0.43763 0.41841 0.409552 0.403537 0.401538 0.405069 0.417518 0.444527 0.484752 0.528496 0.576895 0.640589 0.719541 0.796243 0.855256 0.901152 0.919005 0.91289 0.916951 0.951858 0.984796 0.978514 0.950156 0.913201 0.858747 0.784819 0.717906 0.646791 0.558625 0.491076 0.439651 0.373372 +30442.56870 41541.6 14.6125 42.0763 45.0 Degrees -58.7462 0.0122492 14.3206 0.523046 0.905249 -31.2495 0.0104713 41.9134 1.3098 0.551078 0.280263 0.285479 0.291174 0.297267 0.304045 0.316351 0.336142 0.35594 0.368725 0.373443 0.370717 0.362672 0.351032 0.337819 0.32585 0.314657 0.303929 0.295355 0.288866 0.285078 0.284168 0.281935 0.276337 0.272009 0.270336 0.267917 0.265994 0.264893 0.260324 0.255263 0.255108 0.255504 0.253246 0.253574 0.257839 0.259142 0.255611 0.252284 0.248423 0.242942 0.240369 0.243283 0.24764 0.25014 0.25317 0.2601 0.271487 0.28451 0.292939 0.294158 0.294027 0.294219 0.290966 0.287036 0.284722 0.280577 0.273683 0.270643 0.272827 0.275344 0.280664 0.294323 0.310463 0.323319 0.329638 0.324703 0.310658 0.302133 0.300019 0.2905 0.265941 0.246221 0.243218 0.248825 0.262092 0.282402 0.305863 0.330537 0.361159 0.409957 0.457578 0.492236 0.530671 0.573128 0.604868 0.626327 0.64291 0.651612 0.661324 0.675088 0.670345 0.641436 0.582842 0.52767 0.499346 0.478586 0.449748 0.413311 0.387444 0.376612 0.373385 0.371086 0.370514 0.382822 0.412555 0.452223 0.49576 0.550498 0.624102 0.705725 0.773579 0.825238 0.876406 0.915692 0.942851 0.980782 1.00801 0.984912 0.964953 0.954917 0.936008 0.884946 0.803365 0.731596 0.653865 0.553915 0.485541 0.445544 0.389119 +30445.38885 41541.6 14.7242 41.9525 45.0 Degrees -75.6612 0.0247058 14.442 1.05734 0.99419 -87.9694 0.00817012 42.7432 1.04339 0.165709 0.277526 0.284678 0.289609 0.295291 0.304715 0.318498 0.336982 0.357656 0.373673 0.379897 0.376841 0.367608 0.353941 0.338138 0.323659 0.311503 0.302806 0.298979 0.296655 0.293383 0.289455 0.284357 0.279892 0.277906 0.276797 0.275426 0.274701 0.273617 0.270003 0.265527 0.263097 0.261782 0.260052 0.260003 0.262452 0.263879 0.263822 0.263857 0.261482 0.255431 0.249008 0.247883 0.254004 0.262248 0.270728 0.281494 0.293418 0.30392 0.309883 0.309833 0.3081 0.308054 0.305993 0.30021 0.293765 0.286607 0.277684 0.272897 0.273951 0.27839 0.289727 0.307605 0.32236 0.331534 0.334969 0.328812 0.318721 0.317832 0.31639 0.30331 0.280038 0.264894 0.263555 0.267915 0.278727 0.297982 0.323511 0.348979 0.370412 0.406665 0.458397 0.501191 0.534175 0.559287 0.586581 0.614111 0.62943 0.630658 0.648645 0.676721 0.67779 0.644812 0.578444 0.529881 0.507369 0.48188 0.452002 0.4274 0.411786 0.401811 0.395734 0.39636 0.404562 0.419417 0.439901 0.467325 0.506117 0.564421 0.644366 0.733556 0.806725 0.844638 0.86427 0.887299 0.906254 0.91094 0.907354 0.911164 0.918149 0.905033 0.864455 0.808501 0.756152 0.705617 0.627234 0.529663 0.466429 0.417986 0.347388 +30442.56870 41538.7 15.1961 43.4824 90.0 Degrees -76.3886 0.00463121 15.1023 0.209341 0.9999 -20.2896 0.00397876 43.8747 0.522661 0.476175 0.316435 0.316209 0.313171 0.316392 0.326833 0.340293 0.353014 0.364374 0.375522 0.385419 0.387713 0.377691 0.360731 0.344295 0.331355 0.322641 0.316438 0.312006 0.31173 0.31293 0.310185 0.304126 0.297432 0.29191 0.287577 0.282117 0.278311 0.282045 0.289642 0.290857 0.28477 0.277681 0.273076 0.273835 0.280132 0.286056 0.286396 0.284133 0.281844 0.277968 0.273917 0.273914 0.278593 0.286128 0.29696 0.307005 0.312036 0.318061 0.328863 0.339296 0.340916 0.334148 0.331114 0.330907 0.323565 0.309168 0.297204 0.295209 0.299716 0.308909 0.323516 0.337736 0.345913 0.350001 0.354942 0.361212 0.357139 0.344709 0.337849 0.329807 0.312369 0.29682 0.291435 0.292924 0.301712 0.315706 0.334007 0.356536 0.38531 0.433293 0.480011 0.505447 0.521235 0.54004 0.569499 0.600112 0.627067 0.657023 0.685768 0.693936 0.68997 0.681186 0.649101 0.596613 0.55421 0.518064 0.483572 0.447134 0.416532 0.397836 0.390444 0.393477 0.402744 0.417164 0.441558 0.479695 0.527832 0.589699 0.669335 0.747894 0.810291 0.863324 0.911904 0.935196 0.935554 0.937591 0.965876 1.02009 1.02962 0.988885 0.930482 0.861176 0.794941 0.742155 0.669762 0.567885 0.492153 0.438372 0.368902 +30445.38885 41538.7 15.7171 46.2162 90.0 Degrees -81.7675 0.0179421 15.2496 0.813532 0.932453 -61.4211 0.0118946 45.0344 1.59749 0.362758 0.307798 0.315235 0.32366 0.333711 0.343479 0.353418 0.365932 0.380975 0.392346 0.395724 0.392597 0.383116 0.36995 0.357762 0.345371 0.332049 0.322802 0.319115 0.317212 0.315557 0.314116 0.310752 0.305488 0.301148 0.298155 0.29563 0.293246 0.291426 0.29131 0.291478 0.289176 0.28517 0.282394 0.283081 0.28667 0.289329 0.288738 0.285222 0.279214 0.273922 0.273677 0.27949 0.287825 0.294814 0.302312 0.310975 0.319157 0.329118 0.340065 0.347051 0.347279 0.341983 0.336262 0.330797 0.32539 0.320913 0.314026 0.307074 0.307649 0.316167 0.331599 0.347442 0.355857 0.360375 0.366295 0.373685 0.372819 0.357636 0.342953 0.333108 0.318103 0.298156 0.287727 0.288298 0.300365 0.322944 0.351225 0.381641 0.414804 0.462325 0.508162 0.536296 0.558214 0.580883 0.611752 0.652761 0.701831 0.753076 0.773026 0.757368 0.740625 0.720569 0.664674 0.592486 0.547629 0.513411 0.478692 0.445298 0.421257 0.40718 0.400384 0.402352 0.413084 0.430355 0.456255 0.495646 0.546357 0.611672 0.69828 0.791929 0.868873 0.931741 0.987795 1.00463 0.998213 1.01122 1.04639 1.05146 1.02235 0.980782 0.927941 0.865812 0.804526 0.748317 0.670591 0.5681 0.496042 0.446921 0.378759 +30442.56870 41541.6 14.3815 42.029 90.0 Degrees -58.7462 0.0122492 14.3206 0.523046 0.905249 -31.2495 0.0104713 41.9134 1.3098 0.551078 0.275996 0.281336 0.288021 0.296127 0.30553 0.319242 0.336083 0.350061 0.358902 0.363381 0.361566 0.351448 0.339166 0.331988 0.32629 0.317413 0.30835 0.30125 0.294846 0.288751 0.284182 0.281219 0.277418 0.271586 0.266943 0.266525 0.268296 0.269371 0.270325 0.271812 0.272924 0.272935 0.271457 0.268159 0.264385 0.261999 0.259139 0.253678 0.248386 0.247063 0.250837 0.257984 0.26438 0.270637 0.280373 0.289041 0.295447 0.305346 0.314063 0.315351 0.313197 0.309659 0.303012 0.295731 0.291475 0.287285 0.278373 0.271769 0.27261 0.277917 0.290429 0.307527 0.319906 0.330122 0.339678 0.344594 0.341314 0.328577 0.313863 0.300885 0.285156 0.270092 0.266007 0.271933 0.284404 0.299565 0.317343 0.338638 0.365494 0.408368 0.457772 0.499611 0.533946 0.55613 0.578909 0.605613 0.634302 0.67028 0.693103 0.679955 0.658213 0.637607 0.599455 0.547918 0.505536 0.464379 0.427531 0.406058 0.398292 0.394503 0.389323 0.382896 0.381879 0.393901 0.419228 0.456728 0.508543 0.576849 0.65236 0.725772 0.787754 0.830734 0.87574 0.918109 0.931696 0.941172 0.98521 1.02639 1.01303 0.965422 0.895035 0.817128 0.752043 0.70018 0.63478 0.547106 0.478186 0.425941 0.360816 +30445.38885 41541.6 14.8772 44.0914 90.0 Degrees -75.6612 0.0247058 14.442 1.05734 0.99419 -87.9694 0.00817012 42.7432 1.04339 0.165709 0.278061 0.285616 0.296555 0.307396 0.317424 0.330126 0.344675 0.358161 0.369946 0.377423 0.377385 0.369223 0.355253 0.340377 0.326778 0.313699 0.303088 0.298041 0.297174 0.295646 0.291818 0.28736 0.283078 0.279464 0.277319 0.276385 0.275309 0.27457 0.275451 0.275347 0.273311 0.273742 0.275722 0.274056 0.269505 0.265846 0.263896 0.261626 0.258284 0.2561 0.25822 0.266271 0.275993 0.28159 0.285567 0.291595 0.300127 0.311206 0.32076 0.324588 0.324598 0.321617 0.31658 0.312968 0.311023 0.306708 0.297342 0.288683 0.286742 0.293918 0.310666 0.325295 0.331223 0.337305 0.345869 0.352563 0.350187 0.3364 0.321053 0.30713 0.292731 0.281156 0.27747 0.282791 0.298447 0.31737 0.336779 0.363394 0.401254 0.454859 0.496345 0.517258 0.544144 0.580788 0.608868 0.632288 0.666646 0.720699 0.743401 0.707616 0.672794 0.648384 0.612518 0.56458 0.524783 0.486424 0.451896 0.427854 0.412592 0.400071 0.389774 0.387638 0.396976 0.416605 0.444431 0.482011 0.533175 0.601727 0.680907 0.764785 0.846463 0.908575 0.959524 0.990413 0.990422 0.992799 1.01118 1.0208 1.02108 0.997919 0.9443 0.879985 0.812642 0.744406 0.664742 0.565563 0.491425 0.440129 0.372922 +30442.56870 41538.7 15.0537 43.8985 135.0 Degrees -76.3886 0.00463121 15.1023 0.209341 0.9999 -20.2896 0.00397876 43.8747 0.522661 0.476175 0.296355 0.301549 0.305689 0.314784 0.3275 0.337496 0.346044 0.357989 0.370907 0.379747 0.380984 0.372685 0.35927 0.345931 0.333775 0.324493 0.318807 0.314851 0.310942 0.306114 0.30224 0.30133 0.298962 0.291707 0.285832 0.28587 0.287624 0.286062 0.282022 0.280752 0.281451 0.278292 0.275049 0.276787 0.279535 0.279709 0.27848 0.275335 0.26982 0.26575 0.264256 0.263189 0.265715 0.275073 0.288143 0.300233 0.310238 0.31839 0.324674 0.330739 0.333891 0.331066 0.327222 0.323358 0.316033 0.305628 0.297227 0.294554 0.295596 0.300793 0.312685 0.326939 0.338122 0.347917 0.355506 0.359809 0.359253 0.350057 0.337068 0.319959 0.296966 0.281124 0.277619 0.279835 0.289468 0.30892 0.335632 0.368016 0.411652 0.471032 0.509204 0.525144 0.547951 0.582089 0.61119 0.629064 0.648251 0.684942 0.708906 0.694238 0.675255 0.653507 0.60824 0.557207 0.523594 0.492837 0.454143 0.417444 0.402006 0.399085 0.395532 0.396426 0.407268 0.424794 0.446186 0.473607 0.512899 0.575513 0.65831 0.732609 0.785295 0.829165 0.88809 0.953116 0.975619 0.959682 0.959812 0.998877 1.02477 0.995982 0.940708 0.880326 0.805694 0.739958 0.673291 0.581948 0.510972 0.462253 0.394983 +30445.38885 41538.7 15.0569 43.6148 135.0 Degrees -81.7675 0.0179421 15.2496 0.813532 0.932453 -61.4211 0.0118946 45.0344 1.59749 0.362758 0.301477 0.30644 0.306951 0.311193 0.322516 0.338186 0.354536 0.369088 0.37873 0.37996 0.374051 0.364074 0.352932 0.344684 0.338646 0.330569 0.321949 0.316448 0.313577 0.312518 0.311359 0.305611 0.296319 0.289434 0.28675 0.285216 0.28309 0.282428 0.283345 0.283424 0.282354 0.281469 0.283058 0.287598 0.29102 0.290655 0.289187 0.287391 0.282165 0.274012 0.267067 0.266053 0.273807 0.286124 0.297762 0.306748 0.314339 0.322356 0.328073 0.329372 0.330568 0.33249 0.33061 0.326268 0.321815 0.315179 0.306835 0.301874 0.302042 0.308327 0.323023 0.341936 0.354529 0.359698 0.362047 0.362438 0.360506 0.358578 0.352011 0.333703 0.307858 0.293739 0.293296 0.298911 0.31004 0.325544 0.345967 0.368977 0.393663 0.433303 0.477232 0.511675 0.546532 0.574696 0.595735 0.624584 0.659529 0.687231 0.697742 0.693255 0.677816 0.647955 0.594798 0.5555 0.536953 0.512279 0.478889 0.447507 0.426507 0.413487 0.40592 0.408086 0.420748 0.440755 0.468307 0.504389 0.547412 0.605901 0.684469 0.76759 0.839725 0.892759 0.931435 0.95242 0.9588 0.963645 0.980588 1.01497 1.0253 0.990629 0.936964 0.884796 0.819214 0.740905 0.654793 0.564359 0.496638 0.440015 0.365999 +30442.56870 41541.6 14.1485 40.9145 135.0 Degrees -58.7462 0.0122492 14.3206 0.523046 0.905249 -31.2495 0.0104713 41.9134 1.3098 0.551078 0.281953 0.282496 0.282395 0.288746 0.301186 0.31839 0.337653 0.35264 0.358921 0.355802 0.346556 0.337454 0.331438 0.325534 0.316412 0.306103 0.298664 0.293796 0.289414 0.28473 0.28046 0.277642 0.273987 0.268362 0.263836 0.261871 0.262274 0.263956 0.264241 0.263169 0.262793 0.262058 0.259936 0.258345 0.258182 0.257824 0.255621 0.25388 0.253378 0.250234 0.24667 0.249937 0.257591 0.263369 0.26912 0.277631 0.288549 0.300002 0.307808 0.31038 0.313999 0.317716 0.3104 0.296675 0.288077 0.282234 0.272599 0.264802 0.264852 0.272167 0.285469 0.299098 0.309609 0.320554 0.331468 0.337852 0.334036 0.320851 0.30759 0.294282 0.276594 0.261611 0.258311 0.264739 0.278928 0.296079 0.315258 0.33978 0.37134 0.410945 0.439866 0.463373 0.503252 0.548766 0.578466 0.600765 0.622475 0.642101 0.645695 0.634744 0.629994 0.62821 0.590136 0.528195 0.491179 0.465221 0.438358 0.409152 0.385622 0.372008 0.368414 0.373911 0.38149 0.389937 0.408499 0.441407 0.481775 0.531359 0.597635 0.677094 0.751793 0.804291 0.845932 0.8773 0.897639 0.92913 0.965943 0.999349 1.02362 1.00287 0.946252 0.87406 0.797505 0.723745 0.643321 0.555827 0.483474 0.42431 0.362506 +30445.38885 41541.6 14.2168 41.8786 135.0 Degrees -75.6612 0.0247058 14.442 1.05734 0.99419 -87.9694 0.00817012 42.7432 1.04339 0.165709 0.275122 0.279743 0.288303 0.298533 0.310462 0.324998 0.338862 0.349165 0.355432 0.356867 0.352343 0.341775 0.329581 0.32085 0.312545 0.301398 0.292602 0.288407 0.286731 0.288659 0.292468 0.29263 0.289044 0.285504 0.282276 0.278331 0.274756 0.272637 0.271811 0.271767 0.270966 0.268828 0.267031 0.26637 0.266595 0.266189 0.263667 0.260581 0.258675 0.258883 0.260854 0.26394 0.268008 0.271773 0.276992 0.286659 0.297921 0.30746 0.313316 0.315693 0.31838 0.319498 0.314978 0.307725 0.301218 0.295618 0.290523 0.286303 0.2845 0.286974 0.295278 0.309002 0.322257 0.330434 0.332712 0.330314 0.328918 0.331064 0.327171 0.311774 0.288605 0.274856 0.274673 0.279825 0.289143 0.30436 0.329322 0.359502 0.384703 0.417305 0.45932 0.493425 0.530479 0.577368 0.610587 0.61944 0.617458 0.623273 0.645714 0.661397 0.657493 0.632194 0.57505 0.523076 0.49636 0.477074 0.458838 0.434354 0.41174 0.401201 0.400798 0.406554 0.414796 0.426752 0.449558 0.486202 0.53221 0.594496 0.67377 0.750061 0.818724 0.871471 0.896784 0.904569 0.919683 0.945359 0.957156 0.963243 0.991826 0.996399 0.94319 0.855485 0.776906 0.721782 0.65651 0.567672 0.497404 0.440271 0.365088 From 6e400ebc891d3050971a371c497d19bd914b6b91 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:47:32 +1100 Subject: [PATCH 70/93] test_owpolar: modified tolerances --- .../spectroscopy/tests/test_owpolar.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/orangecontrib/spectroscopy/tests/test_owpolar.py b/orangecontrib/spectroscopy/tests/test_owpolar.py index 8352145fd..2afc91dd6 100644 --- a/orangecontrib/spectroscopy/tests/test_owpolar.py +++ b/orangecontrib/spectroscopy/tests/test_owpolar.py @@ -76,13 +76,13 @@ def test_multifile_in(self): model = self.get_output("Curve Fit model data") np.testing.assert_allclose(np.asarray(self.multifile_polar.metas, dtype=float), - np.asarray(polar.metas, dtype=float)) + np.asarray(polar.metas, dtype=float), rtol=4e-06) np.testing.assert_allclose(np.asarray(self.multifile_polar.X, dtype=float), - np.asarray(polar.X, dtype=float)) + np.asarray(polar.X, dtype=float), rtol=5e-06) np.testing.assert_allclose(np.asarray(self.multifile_model.metas, dtype=float), - np.asarray(model.metas, dtype=float)) + np.asarray(model.metas, dtype=float), rtol=4e-06) np.testing.assert_allclose(np.asarray(self.multifile_model.X, dtype=float), - np.asarray(model.X, dtype=float)) + np.asarray(model.X, dtype=float), rtol=5e-06) def test_multi_inputs(self): self.send_signal("Data", self.in1, 0, widget=self.widget) @@ -122,18 +122,18 @@ def test_multi_inputs(self): np.testing.assert_allclose( np.asarray(self.multiin_polar.metas[:,np.r_[0:2,3:7]], dtype=float), - np.asarray(polar.metas[:,np.r_[0:2,3:7]], dtype=float)) + np.asarray(polar.metas[:,np.r_[0:2,3:7]], dtype=float), rtol=2e-06) np.testing.assert_allclose( np.asarray(self.multiin_polar.metas[:,7:], dtype=float), - np.asarray(polar.metas[:,7:], dtype=float)) - np.testing.assert_equal(self.multiin_polar.X, np.flip(polar.X, axis=1)) + np.asarray(polar.metas[:,7:], dtype=float), rtol=4e-06) + np.testing.assert_allclose(self.multiin_polar.X, polar.X, rtol=5e-06) np.testing.assert_allclose( np.asarray(self.multiin_model.metas[:,np.r_[0:2,3:7]], dtype=float), - np.asarray(model.metas[:,np.r_[0:2,3:7]], dtype=float)) + np.asarray(model.metas[:,np.r_[0:2,3:7]], dtype=float), rtol=4e-06) np.testing.assert_allclose( np.asarray(self.multiin_model.metas[:,7:], dtype=float), - np.asarray(model.metas[:,7:], dtype=float)) - np.testing.assert_equal(self.multiin_model.X, np.flip(model.X, axis=1)) + np.asarray(model.metas[:,7:], dtype=float), rtol=4e-06) + np.testing.assert_allclose(self.multiin_model.X, model.X, rtol=5e-06) def test_pixelsubset(self): #Test multi in with subset of pixels selected From 8556f0c1ca865aa404e24192717a292f122efe82 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Tue, 29 Oct 2024 16:42:50 +1100 Subject: [PATCH 71/93] owhyper: change vector colour enable/disable --- orangecontrib/spectroscopy/widgets/owhyper.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 52136b458..7a2357fe1 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -1577,7 +1577,6 @@ def setup_vector_plot_controls(self): label="", model = self.vector_pal_opts, callback=self._update_cbyval) self.v_colour_byval_select.setIconSize(QSize(64, 16)) - self.v_colour_byval_select.setEnabled(False) self.v_scale_slider = gui.hSlider(self.vectorbox, self, 'vector_scale', label="Scale", minValue=1, maxValue=1000, step=10, createLabel=False, @@ -1600,21 +1599,21 @@ def setup_vector_plot_controls(self): def update_vector_plot_interface(self): vector_params = ['vector_angle', 'vector_magnitude', 'vector_colour_index', - 'vector_scale', 'vector_width', 'vector_opacity'] + 'vector_scale', 'vector_width', 'vector_opacity', 'v_bin'] for i in vector_params: getattr(self.controls, i).setEnabled(self.show_vector_plot) - if self.vector_colour_index == 8: - self.v_colour_byval.setEnabled(True) - self.v_colour_byval_select.setEnabled(True) + if self.vector_colour_index == 8 and self.show_vector_plot: + self.controls.vcol_byval_index.setEnabled(True) + self.controls.vcol_byval_feat.setEnabled(True) if self.vcol_byval_feat is not None and self.show_vector_plot: self.imageplot.vect_legend.setVisible(True) self.imageplot.vect_legend.adapt_to_size() else: self.imageplot.vect_legend.setVisible(False) else: - self.v_colour_byval.setEnabled(False) - self.v_colour_byval_select.setEnabled(False) + self.controls.vcol_byval_index.setEnabled(False) + self.controls.vcol_byval_feat.setEnabled(False) self.imageplot.vect_legend.setVisible(False) def enable_vector(self): From bbd49d5c1d1ba7984f8d38e642ceb647063a1890 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Tue, 29 Oct 2024 16:43:51 +1100 Subject: [PATCH 72/93] test_owhyper: update tests --- .../spectroscopy/tests/test_owhyper.py | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/orangecontrib/spectroscopy/tests/test_owhyper.py b/orangecontrib/spectroscopy/tests/test_owhyper.py index 6fcd3dda4..8e50e0f2e 100644 --- a/orangecontrib/spectroscopy/tests/test_owhyper.py +++ b/orangecontrib/spectroscopy/tests/test_owhyper.py @@ -791,18 +791,116 @@ def test_enable_disable(self): self.assertFalse(w.controls.vector_magnitude.isEnabled()) self.assertFalse(w.controls.vector_angle.isEnabled()) self.assertFalse(w.controls.vector_colour_index.isEnabled()) + self.assertFalse(w.controls.vcol_byval_index.isEnabled()) + self.assertFalse(w.controls.vcol_byval_feat.isEnabled()) self.assertFalse(w.controls.vector_scale.isEnabled()) + self.assertFalse(w.controls.vector_width.isEnabled()) self.assertFalse(w.controls.vector_opacity.isEnabled()) + self.assertFalse(w.controls.v_bin.isEnabled()) + w.controls.show_vector_plot.click() self.assertTrue(w.show_vector_plot) self.assertTrue(w.controls.vector_magnitude.isEnabled()) self.assertTrue(w.controls.vector_angle.isEnabled()) self.assertTrue(w.controls.vector_colour_index.isEnabled()) self.assertTrue(w.controls.vector_scale.isEnabled()) + self.assertTrue(w.controls.vector_width.isEnabled()) self.assertTrue(w.controls.vector_opacity.isEnabled()) + self.assertTrue(w.controls.v_bin.isEnabled()) + + w.vector_colour_index = 8 + w._update_vector() + self.assertTrue(w.controls.vcol_byval_index.isEnabled()) + self.assertTrue(w.controls.vcol_byval_feat.isEnabled()) + + w.vector_colour_index = 3 + w._update_vector() + self.assertFalse(w.controls.vcol_byval_index.isEnabled()) + self.assertFalse(w.controls.vcol_byval_feat.isEnabled()) + + w.vector_colour_index = 8 + w._update_vector() + self.assertTrue(w.controls.vcol_byval_index.isEnabled()) + self.assertTrue(w.controls.vcol_byval_feat.isEnabled()) + w.controls.show_vector_plot.click() self.assertFalse(w.controls.vector_magnitude.isEnabled()) self.assertFalse(w.controls.vector_angle.isEnabled()) self.assertFalse(w.controls.vector_colour_index.isEnabled()) + self.assertFalse(w.controls.vcol_byval_index.isEnabled()) + self.assertFalse(w.controls.vcol_byval_feat.isEnabled()) self.assertFalse(w.controls.vector_scale.isEnabled()) + self.assertFalse(w.controls.vector_width.isEnabled()) self.assertFalse(w.controls.vector_opacity.isEnabled()) + self.assertFalse(w.controls.v_bin.isEnabled()) + + def test_legend(self): + self.send_signal(self.widget.Inputs.data, self.iris) + self.widget.controls.show_vector_plot.setChecked(True) + self.widget.enable_vector() + self.widget.vector_colour_index = 8 + self.widget._update_vector() + self.assertFalse(self.widget.imageplot.vect_legend.isVisible()) + self.widget.vcol_byval_feat = self.iris.domain.attributes[0] + self.widget._update_cbyval() + self.assertTrue(self.widget.imageplot.vect_legend.isVisible()) + self.widget.vcol_byval_feat = None + self.widget._update_cbyval() + self.assertFalse(self.widget.imageplot.vect_legend.isVisible()) + self.widget.controls.show_vector_plot.setChecked(False) + self.widget.enable_vector() + + def test_vect_colour(self): + feat = self.iris.get_column(self.iris.domain.attributes[0]) + self.send_signal(self.widget.Inputs.data, self.iris) + self.widget.controls.show_vector_plot.setChecked(True) + self.widget.enable_vector() + for i in range(8): + self.widget.vector_colour_index = i + self.widget._update_vector() + self.assertEqual(len(self.widget.get_vector_colour(feat)), 4) + self.widget.vector_colour_index = 8 + self.widget._update_vector() + self.assertEqual(self.widget.get_vector_colour(feat)[0].shape, (feat.shape[0], 4)) + self.widget.controls.show_vector_plot.setChecked(False) + self.widget.enable_vector() + + def test_vect_bin(self): + self.send_signal(self.widget.Inputs.data, self.iris) + self.widget.controls.show_vector_plot.setChecked(True) + self.widget.enable_vector() + self.widget.vector_angle = self.iris.domain.attributes[0] + self.widget.vector_magnitude = self.iris.domain.attributes[0] + self.widget._update_vector_params() + + self.widget.v_bin = 0 + self.widget._update_binsize() + self.widget.imageplot.update_view() + wait_for_image(self.widget) + print(self.widget.imageplot.vector_plot.params[0].shape) + self.assertEqual(self.widget.imageplot.vector_plot.params[0].shape[0], + self.iris.X.shape[0]*2) + self.assertEqual(self.widget.imageplot.vector_plot.params[1].shape[0], + self.iris.X.shape[0]*2) + + self.widget.v_bin = 1 + self.widget._update_binsize() + self.widget.imageplot.update_view() + wait_for_image(self.widget) + self.assertEqual(self.widget.imageplot.vector_plot.params[0].shape[0], 2) + self.assertEqual(self.widget.imageplot.vector_plot.params[1].shape[0], 2) + + self.widget.v_bin = 2 + self.widget._update_binsize() + self.widget.imageplot.update_view() + wait_for_image(self.widget) + self.assertEqual(self.widget.imageplot.vector_plot.params[0].shape[0], 2) + self.assertEqual(self.widget.imageplot.vector_plot.params[1].shape[0], 2) + + self.widget.v_bin = 3 + self.widget._update_binsize() + self.widget.imageplot.update_view() + wait_for_image(self.widget) + self.assertTrue(self.widget.Warning.bin_size_error.is_shown()) + self.assertEqual(self.widget.imageplot.vector_plot.params[0].shape[0], 2) + self.assertEqual(self.widget.imageplot.vector_plot.params[1].shape[0], 2) From 6d3861bc19e34cb7bffaa1bd9617d0bd01094b84 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Tue, 29 Oct 2024 16:48:33 +1100 Subject: [PATCH 73/93] polar: change line endings --- orangecontrib/spectroscopy/widgets/owhyper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 7a2357fe1..69ed8fdfb 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -1141,7 +1141,7 @@ def update_vectors(self): w = self.parent.vector_width th = np.asarray(v[:,0], dtype=float) v_mag = np.asarray(v[:,1], dtype=float) - wy = _shift(lsx)*2 + wy = _shift(lsy)*2 wx = _shift(lsx)*2 if self.parent.v_bin == 0: y = np.linspace(*lsy)[yindex[valid]] From 206abe133f5dfdcedace3fe9d9099bfee883e372 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Wed, 30 Oct 2024 10:20:41 +1100 Subject: [PATCH 74/93] owpolar: add conversion to absorptance spectra --- orangecontrib/spectroscopy/widgets/owpolar.py | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 6620f8d96..0a5b2632a 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -467,6 +467,7 @@ class Outputs: invert_angles = Setting(False, schema_only=True) average = Setting(False, schema_only=True) angles = ContextSetting(None) + spec_type = Setting(0) feats: List[Variable] = ContextSetting([]) class Warning(OWWidget.Warning): @@ -482,6 +483,9 @@ class Warning(OWWidget.Warning): # renamed_variables = Msg("Variables with duplicated names have been renamed.") XYfeat = Msg("Selected feature(s) cannot be the same as XY selection") + class Information(OWWidget.Information): + meta_calc = Msg("Meta and Target variables are not transformed to absorptance during calculations") + def __init__(self): super().__init__() ConcurrentWidgetMixin.__init__(self) @@ -562,6 +566,14 @@ def __init__(self): vbox.layout().addWidget(form) + specbox = gui.widgetBox(vbox, "Spectra Type", + sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) + + self.spec_b1 = gui.radioButtons(specbox, self, 'spec_type', ['Absorptance', 'Absorbance', 'Transmittance'], + callback=self._process_spectype) + + vbox.layout().addWidget(form) + pbox = gui.widgetBox(vbox, sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) gui.lineEdit(pbox, self, "alpha", "Alpha value", callback=self._change_input, valueType=int) @@ -697,6 +709,9 @@ def input_select(self): i.setDisabled(False) self._send_ind_angles() + def _process_spectype(self): + self.commit.deferred() + def check_params(self): self.Warning.nofeat.clear() if self.feats is None or len(self.feats) == 0: @@ -797,6 +812,7 @@ def handleNewSignals(self): def commit(self): self.cancel() self.check_params() + self.Information.meta_calc.clear() if len(self.Warning.active) > 0: return @@ -817,6 +833,16 @@ def commit(self): else: sorted_data = self.sorted_data + if self.spec_type != 0: + if self.spec_type == 1: + for i, j in enumerate(sorted_data): + sorted_data[i].X = 1-np.power(10, j.X*-1) + elif self.spec_type == 2: + for i, j in enumerate(sorted_data): + sorted_data[i].X = 1-j.X + if any(i not in sorted_data[0].domain.attributes for i in self.feats): + self.Information.meta_calc() + self.start(run, sorted_data, list(self.feats), self.alpha, self.map_x, self.map_y, self.invert_angles, list(self.polangles), self.average, self.angles) @@ -829,6 +855,13 @@ def on_done(self, result: Results): if result.errorstate == 1: self.Warning.wrongdata() else: + if self.spec_type != 0: + if self.spec_type == 1: + result.out.X = -np.log10(1-result.out.X) + result.model.X = -np.log10(1-result.model.X) + elif self.spec_type == 2: + result.out.X = 1-result.out.X + result.model.X = 1-result.model.X self.Outputs.polar.send(result.out) self.Outputs.model.send(result.model) From 08096b105eb660546615cad9a561530c407d2fbf Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Wed, 30 Oct 2024 12:11:48 +1100 Subject: [PATCH 75/93] owpolar: fixed feat selection not clearing consistently --- orangecontrib/spectroscopy/widgets/owpolar.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 0a5b2632a..025719f74 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -592,13 +592,13 @@ def __init__(self): def _feat_changed(self): self.Warning.nofeat.clear() rows = self.feat_view.selectionModel().selectedRows() + values = self.feat_view.model()[:] + self.feats = [values[row.row()] for row in sorted(rows)] if len(rows) > 0: self.Warning.nofeat.clear() else: self.Warning.nofeat() return - values = self.feat_view.model()[:] - self.feats = [values[row.row()] for row in sorted(rows)] self.commit.deferred() def init_attr_values(self, data): From ca3fde0b4c279ddf66c1e9e8d5a0dadaf5c690bb Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Wed, 30 Oct 2024 15:17:47 +1100 Subject: [PATCH 76/93] =?UTF-8?q?owpolar:=20change=20=CE=B1=20value/TDM=20?= =?UTF-8?q?tilt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added a validator to only allow integers between 0-90 to be entered. Changed the name from alpha value to TDM tilt to avoid confusion with absorptance Included a tooltip to clarify the meaning of this value --- orangecontrib/spectroscopy/widgets/owpolar.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 025719f74..19f9a47d5 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -10,6 +10,7 @@ import pandas as pd from AnyQt.QtCore import QItemSelectionModel, QItemSelection, QItemSelectionRange from AnyQt.QtWidgets import QFormLayout, QWidget, QListView, QLabel, QSizePolicy +from AnyQt.QtGui import QIntValidator from scipy.optimize import curve_fit @@ -575,8 +576,10 @@ def __init__(self): vbox.layout().addWidget(form) pbox = gui.widgetBox(vbox, sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) - gui.lineEdit(pbox, self, "alpha", "Alpha value", - callback=self._change_input, valueType=int) + gui.lineEdit(pbox, self, "alpha", u"TDM Tilt (\N{DEGREE SIGN})", + callback=self._change_input, valueType=int, + validator=QIntValidator(0, 90), tooltip= \ + "The angle (in degrees) between the long axis of the molecule and the transition dipole moment") gui.checkBox(pbox, self, 'invert_angles', label="Invert Angles", callback=self._change_input) From 8db1c3f388e3291f79982b9d70af15541054d6e1 Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Fri, 22 Nov 2024 12:00:28 +0100 Subject: [PATCH 77/93] HyperSpectra: unify visual image and vector plot controls Also made vector plot controls more compact. --- orangecontrib/spectroscopy/widgets/owhyper.py | 145 ++++++++++++------ 1 file changed, 97 insertions(+), 48 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 69ed8fdfb..e55a75ef0 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -6,7 +6,7 @@ from AnyQt.QtWidgets import QWidget, QPushButton, \ QGridLayout, QFormLayout, QAction, QVBoxLayout, QWidgetAction, QSplitter, \ - QToolTip, QGraphicsRectItem + QToolTip, QGraphicsRectItem, QLabel from AnyQt.QtGui import QColor, QKeySequence, QPainter, QBrush, QStandardItemModel, \ QStandardItem, QLinearGradient, QPixmap, QIcon, QPen @@ -1302,6 +1302,29 @@ class CurvePlotHyper(CurvePlot): viewtype = Setting(AVERAGE) # average view by default +def create_gridbox(widget, box=False, add_space=False): + grid = QGridLayout() + grid.setColumnMinimumWidth(0, 50) + grid.setColumnStretch(1, 1) + b = gui.widgetBox(widget, box=box, orientation=grid) + if not box: + if add_space: + b.setContentsMargins(8, 4, 8, 4) + else: + b.setContentsMargins(0, 0, 0, 0) + # This must come after calling widgetBox, since widgetBox overrides it + grid.setVerticalSpacing(8) + return b + + +def grid_add_labelled_row(grid, label, widget): + if not isinstance(grid, QGridLayout): + grid = grid.layout() + row = grid.rowCount() + grid.addWidget(QLabel(label), row, 0) + grid.addWidget(widget, row, 1) + + class OWHyper(OWWidget, SelectionOutputsMixin): name = "HyperSpectra" @@ -1427,7 +1450,6 @@ def __init__(self): self.box_values_spectra, self, "integration_method", items=(a.name for a in self.integration_methods), callback=self._change_integral_type) - gui.rubber(self.controlArea) gui.appendRadioButton(rbox, "Use feature") @@ -1461,9 +1483,6 @@ def __init__(self): contentsLength=12, searchable=True, callback=self.update_rgb_value, model=self.rgb_value_model) - self.cb_vector = gui.checkBox(rbox, self, "show_vector_plot", label="Show vector plot", - callback=self.enable_vector) - splitter = QSplitter(self) splitter.setOrientation(Qt.Vertical) self.imageplot = ImagePlot(self) @@ -1527,6 +1546,8 @@ def __init__(self): self._setup_plot_parameters() + gui.rubber(self.controlArea) + def _setup_plot_parameters(self): parts_from_spectra = [SpectraParameterSetter.ANNOT_BOX, SpectraParameterSetter.LABELS_BOX, @@ -1539,7 +1560,13 @@ def _setup_plot_parameters(self): def setup_vector_plot_controls(self): - self.vectorbox = gui.widgetBox(self.controlArea, box=True) + mainbox = gui.widgetBox(self.controlArea, box="Vector plot") + + self.cb_vector = gui.checkBox(mainbox, self, "show_vector_plot", + label="Show vector plot", + callback=self.enable_vector) + + self.vectorbox = gui.widgetBox(mainbox, box=False) self.vector_opts = DomainModel(DomainModel.SEPARATED, valid_types=DomainModel.PRIMITIVE, placeholder='None') @@ -1556,47 +1583,65 @@ def setup_vector_plot_controls(self): self.vcol_byval_feat = None self.colour_opts = vector_colour - self.v_angle_select = gui.comboBox(self.vectorbox, self, 'vector_angle', searchable=True, - label="Vector Angle", model=self.vector_opts, - callback=self._update_vector_params) - - self.v_mag_select = gui.comboBox(self.vectorbox, self, 'vector_magnitude', searchable=True, - label="Vector Magnitude", model=self.vector_opts, - callback=self._update_vector_params) - - self.v_colour_select = gui.comboBox(self.vectorbox, self, 'vector_colour_index', - label="Vector Colour", model=self.vector_col_opts, - callback=self._update_vector) - - self.v_colour_byval = gui.comboBox(self.vectorbox, self, 'vcol_byval_feat', - label="Vector Colour by Feature", - model=self.vector_cbyf_opts, - callback=self._update_cbyval) - - self.v_colour_byval_select = gui.comboBox(self.vectorbox, self, 'vcol_byval_index', - label="", model = self.vector_pal_opts, - callback=self._update_cbyval) - self.v_colour_byval_select.setIconSize(QSize(64, 16)) - - self.v_scale_slider = gui.hSlider(self.vectorbox, self, 'vector_scale', label="Scale", - minValue=1, maxValue=1000, step=10, createLabel=False, - callback=self._update_vector) - - self.v_width_slider = gui.hSlider(self.vectorbox, self, 'vector_width', label="Width", - minValue=1, maxValue=20, step=1, createLabel=False, - callback=self._update_vector) - - self.v_opacity_slider = gui.hSlider(self.vectorbox, self, 'vector_opacity', label="Opacity", - minValue=0, maxValue=255, step=5, createLabel=False, - callback=self._update_vector) - - self.v_bin_select = gui.comboBox(self.vectorbox, self, 'v_bin', label = "Pixel Binning", - model = self.vector_bin_opts, - callback = self._update_binsize) + gb = create_gridbox(self.vectorbox, box=False) + + v_angle_select = gui.comboBox(None, self, 'vector_angle', searchable=True, + label="Vector Angle", model=self.vector_opts, + contentsLength=10, + callback=self._update_vector_params) + grid_add_labelled_row(gb, "Angle: ", v_angle_select) + + v_mag_select = gui.comboBox(None, self, 'vector_magnitude', searchable=True, + label="Vector Magnitude", model=self.vector_opts, + contentsLength=10, + callback=self._update_vector_params) + grid_add_labelled_row(gb, "Magnitude: ", v_mag_select) + + v_bin_select = gui.comboBox(None, self, 'v_bin', label="Pixel Binning", + model=self.vector_bin_opts, + contentsLength=10, + callback=self._update_binsize) + grid_add_labelled_row(gb, "Binning: ", v_bin_select) + + v_colour_select = gui.comboBox(None, self, 'vector_colour_index', + label="Vector Colour", model=self.vector_col_opts, + contentsLength=10, + callback=self._update_vector) + grid_add_labelled_row(gb, "Color: ", v_colour_select) + + v_colour_byval = gui.comboBox(None, self, 'vcol_byval_feat', + label="Vector Colour by Feature", + model=self.vector_cbyf_opts, + contentsLength=10, + callback=self._update_cbyval) + grid_add_labelled_row(gb, "Feature: ", v_colour_byval) + + v_colour_byval_select = gui.comboBox(None, self, 'vcol_byval_index', + label="", model=self.vector_pal_opts, + contentsLength=5, + callback=self._update_cbyval) + v_colour_byval_select.setIconSize(QSize(64, 16)) + grid_add_labelled_row(gb, "Palette: ", v_colour_byval_select) + + gb = create_gridbox(self.vectorbox, box=False) + + v_scale_slider = gui.hSlider(None, self, 'vector_scale', label="Scale", + minValue=1, maxValue=1000, step=10, createLabel=False, + callback=self._update_vector) + grid_add_labelled_row(gb, "Scale: ", v_scale_slider) + + v_width_slider = gui.hSlider(None, self, 'vector_width', label="Width", + minValue=1, maxValue=20, step=1, createLabel=False, + callback=self._update_vector) + grid_add_labelled_row(gb, "Width: ", v_width_slider) + + v_opacity_slider = gui.hSlider(None, self, 'vector_opacity', label="Opacity", + minValue=0, maxValue=255, step=5, createLabel=False, + callback=self._update_vector) + grid_add_labelled_row(gb, "Opacity: ", v_opacity_slider) self.enable_vector() - def update_vector_plot_interface(self): vector_params = ['vector_angle', 'vector_magnitude', 'vector_colour_index', 'vector_scale', 'vector_width', 'vector_opacity', 'v_bin'] @@ -1771,16 +1816,19 @@ def init_vector_plot(self, data): self.vector_magnitude = self.vector_angle = self.vcol_byval_feat = None def setup_visible_image_controls(self): - self.visbox = gui.widgetBox(self.controlArea, True) + self.visbox = gui.widgetBox(self.controlArea, box="Visible image") gui.checkBox( self.visbox, self, 'show_visible_image', label='Show visible image', callback=lambda: (self.update_visible_image_interface(), self.update_visible_image())) + self.visboxhide = gui.widgetBox(self.visbox, box=False) + self.visboxhide.hide() + self.visible_image_model = VisibleImageListModel() gui.comboBox( - self.visbox, self, 'visible_image', + self.visboxhide, self, 'visible_image', model=self.visible_image_model, callback=self.update_visible_image) @@ -1791,13 +1839,13 @@ def setup_visible_image_controls(self): ('Difference', QPainter.CompositionMode_Difference) ]) gui.comboBox( - self.visbox, self, 'visible_image_composition', label='Composition mode:', + self.visboxhide, self, 'visible_image_composition', label='Composition mode:', model=PyListModel(self.visual_image_composition_modes.keys()), callback=self.update_visible_image_composition_mode ) gui.hSlider( - self.visbox, self, 'visible_image_opacity', label='Opacity:', + self.visboxhide, self, 'visible_image_opacity', label='Opacity:', minValue=0, maxValue=255, step=10, createLabel=False, callback=self.update_visible_image_opacity ) @@ -1808,6 +1856,7 @@ def setup_visible_image_controls(self): def update_visible_image_interface(self): controlled = ['visible_image', 'visible_image_composition', 'visible_image_opacity'] + self.visboxhide.setVisible(self.show_visible_image) for c in controlled: getattr(self.controls, c).setEnabled(self.show_visible_image) From 694b0203c406baa30dfb9d7b51b7f86026bf39ed Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Fri, 22 Nov 2024 14:35:44 +0100 Subject: [PATCH 78/93] HyperSpectra: move image properties to control area --- orangecontrib/spectroscopy/widgets/owhyper.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index e55a75ef0..8edcce007 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -1491,6 +1491,10 @@ def __init__(self): iabox.layout().addWidget(self.imageplot.axes_settings_box) icbox.layout().addWidget(self.imageplot.color_settings_box) + # add image settings to the main panne after ImagePlot.__init__ + iabox.layout().addWidget(self.imageplot.axes_settings_box) + icbox.layout().addWidget(self.imageplot.color_settings_box) + self.data = None self.setup_vector_plot_controls() From b6d4aac379f564f69167a06475059bc86cabdeaa Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Tue, 26 Nov 2024 16:40:34 +1100 Subject: [PATCH 79/93] owhyper: refractor vector plot --- orangecontrib/spectroscopy/widgets/owhyper.py | 692 +++++++++--------- 1 file changed, 353 insertions(+), 339 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 8edcce007..b7ce8a395 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -321,6 +321,335 @@ def vector_colour_model(colours): model.appendRow([item]) return model +def circular_mean(degs): + sin = np.nansum(np.sin(np.radians(degs*2))) + cos = np.nansum(np.cos(np.radians(degs*2))) + return np.arctan2(sin, cos)/2 + +class VectorSettingMixin: + show_vector_plot = Setting(False) + vector_angle = ContextSetting(None) + vector_magnitude = ContextSetting(None) + vector_colour_index = Setting(0) + vcol_byval_index = Setting(0) + vcol_byval_feat = ContextSetting(None) + vector_scale = Setting(1) + vector_width = Setting(1) + vector_opacity = Setting(255) + v_bin = Setting(0) + + def setup_vector_plot_controls(self): + + box = gui.vBox(self) + + self.cb_vector = gui.checkBox(box, self, "show_vector_plot", + label="Show vector plot", + callback=self.enable_vector) + + self.vectorbox = gui.widgetBox(box, box=False) + + self.vector_opts = DomainModel(DomainModel.SEPARATED, + valid_types=DomainModel.PRIMITIVE, placeholder='None') + + self.vector_cbyf_opts = DomainModel(DomainModel.SEPARATED, + valid_types=(ContinuousVariable,), placeholder='None') + + self.vector_col_opts = vector_colour_model(vector_colour) + self.vector_pal_opts = color_palette_model(_color_palettes, (QSize(64, 16))) + self.vector_bin_opts = vector_colour_model(bins) + + self.vector_angle = None + self.vector_magnitude = None + self.vcol_byval_feat = None + self.colour_opts = vector_colour + + gb = create_gridbox(self.vectorbox, box=False) + + v_angle_select = gui.comboBox(None, self, 'vector_angle', searchable=True, + label="Vector Angle", model=self.vector_opts, + contentsLength=10, + callback=self._update_vector_params) + grid_add_labelled_row(gb, "Angle: ", v_angle_select) + + v_mag_select = gui.comboBox(None, self, 'vector_magnitude', searchable=True, + label="Vector Magnitude", model=self.vector_opts, + contentsLength=10, + callback=self._update_vector_params) + grid_add_labelled_row(gb, "Magnitude: ", v_mag_select) + + v_bin_select = gui.comboBox(None, self, 'v_bin', label="Pixel Binning", + model=self.vector_bin_opts, + contentsLength=10, + callback=self._update_binsize) + grid_add_labelled_row(gb, "Binning: ", v_bin_select) + + v_colour_select = gui.comboBox(None, self, 'vector_colour_index', + label="Vector Colour", model=self.vector_col_opts, + contentsLength=10, + callback=self._update_vector) + grid_add_labelled_row(gb, "Color: ", v_colour_select) + + v_colour_byval = gui.comboBox(None, self, 'vcol_byval_feat', + label="Vector Colour by Feature", + model=self.vector_cbyf_opts, + contentsLength=10, + callback=self._update_cbyval) + grid_add_labelled_row(gb, "Feature: ", v_colour_byval) + + v_colour_byval_select = gui.comboBox(None, self, 'vcol_byval_index', + label="", model=self.vector_pal_opts, + contentsLength=5, + callback=self._update_cbyval) + v_colour_byval_select.setIconSize(QSize(64, 16)) + grid_add_labelled_row(gb, "Palette: ", v_colour_byval_select) + + gb = create_gridbox(self.vectorbox, box=False) + + v_scale_slider = gui.hSlider(None, self, 'vector_scale', label="Scale", + minValue=1, maxValue=1000, step=10, createLabel=False, + callback=self._update_vector) + grid_add_labelled_row(gb, "Scale: ", v_scale_slider) + + v_width_slider = gui.hSlider(None, self, 'vector_width', label="Width", + minValue=1, maxValue=20, step=1, createLabel=False, + callback=self._update_vector) + grid_add_labelled_row(gb, "Width: ", v_width_slider) + + v_opacity_slider = gui.hSlider(None, self, 'vector_opacity', label="Opacity", + minValue=0, maxValue=255, step=5, createLabel=False, + callback=self._update_vector) + grid_add_labelled_row(gb, "Opacity: ", v_opacity_slider) + + self.vectorbox.setVisible(self.show_vector_plot) + self.update_vector_plot_interface() + + return box + + def update_vector_plot_interface(self): + vector_params = ['vector_angle', 'vector_magnitude', 'vector_colour_index', + 'vector_scale', 'vector_width', 'vector_opacity', 'v_bin'] + for i in vector_params: + getattr(self.controls, i).setEnabled(self.show_vector_plot) + + if self.vector_colour_index == 8 and self.show_vector_plot: + self.controls.vcol_byval_index.setEnabled(True) + self.controls.vcol_byval_feat.setEnabled(True) + if self.vcol_byval_feat is not None and self.show_vector_plot: + self.vect_legend.setVisible(True) + self.vect_legend.adapt_to_size() + else: + self.vect_legend.setVisible(False) + else: + self.controls.vcol_byval_index.setEnabled(False) + self.controls.vcol_byval_feat.setEnabled(False) + self.vect_legend.setVisible(False) + + def enable_vector(self): + self.vectorbox.setVisible(self.show_vector_plot) + self._update_vector() + + def _update_vector(self): + self.update_vector_plot_interface() + self.update_vectors() + + def _update_vector_params(self): + self.update_binsize() + self._update_vector() + + def _update_cbyval(self): + self.cols = None + self._update_vector() + + def _update_binsize(self): + self.v_bin_change = 1 + self.cols = None + self.update_binsize() + + def init_vector_plot(self, data): + domain = data.domain if data is not None else None + self.vector_opts.set_domain(domain) + self.vector_cbyf_opts.set_domain(domain) + + # initialize values so that the combo boxes are not in invalid states + if self.vector_opts: + # TODO here we could instead set good default values if available + self.vector_magnitude = self.vector_angle = self.vcol_byval_feat = None + else: + self.vector_magnitude = self.vector_angle = self.vcol_byval_feat = None + +class VectorMixin: + + def __init__(self): + self.a = None + self.th = None + self.cols = None + self.new_xs = None + self.new_ys = None + self.v_bin_change = 0 + + def update_vectors(self): + v = self.get_vector_data() + if self.lsx is None: # image is not shown or is being computed + v = None + if v is None: + self.vector_plot.hide() + else: + valid = self.data_valid_positions + lsx, lsy = self.lsx, self.lsy + xindex, yindex = self.xindex, self.yindex + scale = self.vector_scale + w = self.vector_width + th = np.asarray(v[:,0], dtype=float) + v_mag = np.asarray(v[:,1], dtype=float) + wy = _shift(lsy)*2 + wx = _shift(lsx)*2 + if self.v_bin == 0: + y = np.linspace(*lsy)[yindex[valid]] + x = np.linspace(*lsx)[xindex[valid]] + amp = v_mag / max(v_mag) * (scale/100) + dispx = amp*wx/2*np.cos(np.radians(th)) + dispy = amp*wy/2*np.sin(np.radians(th)) + xcurve = np.empty((dispx.shape[0]*2)) + ycurve = np.empty((dispy.shape[0]*2)) + xcurve[0::2], xcurve[1::2] = x - dispx, x + dispx + ycurve[0::2], ycurve[1::2] = y - dispy, y + dispy + vcols = self.get_vector_colour(v[:,2]) + v_params = [xcurve, ycurve, w, vcols] + self.vector_plot.setData(v_params) + else: + if self.a is None: + self.update_binsize() + amp = self.a / max(self.a) * (scale/100) + dispx = amp*wx/2*np.cos(self.th) + dispy = amp*wy/2*np.sin(self.th) + xcurve = np.empty((dispx.shape[0]*2)) + ycurve = np.empty((dispy.shape[0]*2)) + xcurve[0::2], xcurve[1::2] = self.new_xs - dispx, self.new_xs + dispx + ycurve[0::2], ycurve[1::2] = self.new_ys - dispy, self.new_ys + dispy + vcols = self.get_vector_colour(v[:,2]) + v_params = [xcurve, ycurve, w, vcols] + self.vector_plot.setData(v_params) + self.vector_plot.show() + if self.vector_colour_index == 8 and \ + self.vcol_byval_feat is not None: + self.update_vect_legend() + + def update_vect_legend(self):#feat + if self.v_bin != 0: + feat = self.cols + else: + feat = self.data.get_column(self.vcol_byval_feat) + fmin, fmax = np.min(feat), np.max(feat) + self.vect_legend.set_range(fmin, fmax) + self.vect_legend.set_colors(_color_palettes[self.vcol_byval_index][1][0]) + self.vect_legend.setVisible(True) + self.vect_legend.adapt_to_size() + + def get_vector_data(self): + if self.show_vector_plot is False or self.data is None: + return None + + ang = self.vector_angle + mag = self.vector_magnitude + col = self.vcol_byval_feat + angs = self.data.get_column(ang) if ang else np.full(len(self.data), 0) + mags = self.data.get_column(mag) if mag else np.full(len(self.data), 1) + cols = self.data.get_column(col) if col else np.full(len(self.data), None) + + return np.vstack([angs, mags, cols]).T + + def get_vector_colour(self, feat): + if self.vector_colour_index == 8: + if feat[0] is None: # a feat has not been selected yet + return vector_colour[0][1][0] + (self.vector_opacity,) + else: + if self.v_bin != 0: + if self.cols is None: + self.update_binsize() + feat = self.cols + fmin, fmax = np.min(feat), np.max(feat) + if fmin == fmax: + # put a warning here? + return vector_colour[0][1][0] + (self.vector_opacity,) + feat_idxs = np.asarray(((feat-fmin)/(fmax-fmin))*255, dtype=int) + col_vals = np.asarray(_color_palettes[self.vcol_byval_index][1][0][feat_idxs], + dtype=int) + out = [np.hstack((np.expand_dims(feat_idxs, 1), col_vals)), + self.vector_opacity] + return out + else: + return vector_colour[self.vector_colour_index][1][0] + (self.vector_opacity,) + + def update_binsize(self): + self.parent.Warning.bin_size_error.clear() + if self.v_bin == 0: + self.v_bin_change = 0 + self.update_vectors() + else: + v = self.get_vector_data() + valid = self.data_valid_positions + lsx, lsy = self.lsx, self.lsy + xindex, yindex = self.xindex, self.yindex + if lsx is None: + v = None + if v is None: + self.v_bin_change = 0 + self.vector_plot.hide() + else: + th = np.asarray(v[:,0], dtype=float) + v_mag = np.asarray(v[:,1], dtype=float) + col = np.asarray(v[:,2], dtype=float) + y = np.linspace(*lsy)[yindex] + x = np.linspace(*lsx)[xindex] + df = pd.DataFrame( + [x, y, np.asarray([1 if i else 0 for i in valid]),v_mag, th, col], + index = ['x', 'y', 'valid', 'v_mag', 'th', 'cols']).T + + v_df = df.pivot_table(values = 'valid', columns = 'x', index = 'y', fill_value = 0) + a_df = df.pivot_table(values = 'v_mag', columns = 'x', index = 'y') + th_df = df.pivot_table(values = 'th', columns = 'x', index = 'y') + col_df = df.pivot_table(values = 'cols', columns = 'x', index = 'y') + bin_sz = self.v_bin+1 + if bin_sz > v_df.shape[0] or bin_sz > v_df.shape[1]: + bin_sz = v_df.shape[0] if bin_sz > v_df.shape[0] else v_df.shape[1] + self.Warning.bin_size_error(bin_sz, bin_sz) + x_mod, y_mod = v_df.shape[1] % bin_sz, v_df.shape[0] % bin_sz + st_x_idx = int(np.floor(x_mod/2)) + st_y_idx = int(np.floor(y_mod/2)) + + nvalid = np.zeros((int((v_df.shape[0]-y_mod)/bin_sz), + int((v_df.shape[1]-x_mod)/bin_sz))) + a = np.zeros((int((v_df.shape[0]-y_mod)/bin_sz), + int((v_df.shape[1]-x_mod)/bin_sz))) + th = np.zeros((int((v_df.shape[0]-y_mod)/bin_sz), + int((v_df.shape[1]-x_mod)/bin_sz))) + cols = np.zeros((int((v_df.shape[0]-y_mod)/bin_sz), + int((v_df.shape[1]-x_mod)/bin_sz))) + columns = v_df.columns + rows = v_df.index + new_xs, new_ys = [], [] + for i in range(st_y_idx, v_df.shape[0]-y_mod, bin_sz): + for j in range(st_x_idx, v_df.shape[1]-x_mod, bin_sz): + nvalid[int(i/bin_sz),int(j/bin_sz)] = \ + np.nanmean(v_df.iloc[i:i+bin_sz,j:j+bin_sz].to_numpy()) + a[int(i/bin_sz),int(j/bin_sz)] = \ + np.nanmean(a_df.iloc[i:i+bin_sz,j:j+bin_sz].to_numpy()) + th[int(i/bin_sz),int(j/bin_sz)] = \ + circular_mean(th_df.iloc[i:i+bin_sz,j:j+bin_sz].to_numpy()) + cols[int(i/bin_sz),int(j/bin_sz)] = \ + np.nanmean(col_df.iloc[i:i+bin_sz,j:j+bin_sz].to_numpy()) + new_xs.append(np.sum(columns[j:j+bin_sz])/bin_sz) + new_ys.append(np.sum(rows[i:i+bin_sz])/bin_sz) + nvalid = nvalid.flatten() > 0 & ~np.isnan(nvalid.flatten()) + self.a = a.flatten()[nvalid] + self.th = th.flatten()[nvalid] + self.cols = cols.flatten()[nvalid] + self.new_xs = np.asarray(new_xs)[nvalid] + self.new_ys = np.asarray(new_ys)[nvalid] + if self.v_bin_change == 1: + self.v_bin_change = 0 + self.update_vectors() + class AxesSettingsMixin: def __init__(self): @@ -886,7 +1215,8 @@ def boundingRect(self): class BasicImagePlot(QWidget, OWComponent, SelectionGroupMixin, AxesSettingsMixin, ImageSelectionMixin, ImageColorSettingMixin, ImageRGBSettingMixin, - ImageZoomMixin, ConcurrentMixin): + ImageZoomMixin, ConcurrentMixin, + VectorSettingMixin, VectorMixin): gamma = Setting(0) @@ -902,6 +1232,8 @@ def __init__(self, parent): ImageColorSettingMixin.__init__(self) ImageZoomMixin.__init__(self) ConcurrentMixin.__init__(self) + VectorSettingMixin.__init__(self) + VectorMixin.__init__(self) self.parent = parent self.parameter_setter = ImageParameterSetter(self) @@ -985,10 +1317,12 @@ def __init__(self, parent): self.axes_settings_box = self.setup_axes_settings_box() self.color_settings_box = self.setup_color_settings_box() self.rgb_settings_box = self.setup_rgb_settings_box() + self.vector_settings_box = self.setup_vector_plot_controls() box.layout().addWidget(self.axes_settings_box) box.layout().addWidget(self.color_settings_box) box.layout().addWidget(self.rgb_settings_box) + box.layout().addWidget(self.vector_settings_box) choose_xy.setDefaultWidget(box) view_menu.addAction(choose_xy) @@ -1102,7 +1436,7 @@ def update_view(self): self.data_valid_positions = None self.xindex = None self.yindex = None - self.parent.update_binsize() + self.update_binsize() self.update_vectors() # clears the vector plot self.start(self.compute_image, self.data, self.attr_x, self.attr_y, @@ -1114,65 +1448,18 @@ def set_visible_image(self, img: np.ndarray, rect: QRectF): self.vis_img.setRect(rect) def show_visible_image(self): - if self.vis_img not in self.plot.items: - self.plot.addItem(self.vis_img) - - def hide_visible_image(self): - self.plot.removeItem(self.vis_img) - - def set_visible_image_opacity(self, opacity: int): - """Opacity is an alpha channel intensity integer from 0 to 255""" - self.vis_img.setOpacity(opacity / 255) - - def set_visible_image_comp_mode(self, comp_mode: QPainter.CompositionMode): - self.vis_img.setCompositionMode(comp_mode) - - def update_vectors(self): - v = self.parent.get_vector_data() - if self.lsx is None: # image is not shown or is being computed - v = None - if v is None: - self.vector_plot.hide() - else: - valid = self.data_valid_positions - lsx, lsy = self.lsx, self.lsy - xindex, yindex = self.xindex, self.yindex - scale = self.parent.vector_scale - w = self.parent.vector_width - th = np.asarray(v[:,0], dtype=float) - v_mag = np.asarray(v[:,1], dtype=float) - wy = _shift(lsy)*2 - wx = _shift(lsx)*2 - if self.parent.v_bin == 0: - y = np.linspace(*lsy)[yindex[valid]] - x = np.linspace(*lsx)[xindex[valid]] - amp = v_mag / max(v_mag) * (scale/100) - dispx = amp*wx/2*np.cos(np.radians(th)) - dispy = amp*wy/2*np.sin(np.radians(th)) - xcurve = np.empty((dispx.shape[0]*2)) - ycurve = np.empty((dispy.shape[0]*2)) - xcurve[0::2], xcurve[1::2] = x - dispx, x + dispx - ycurve[0::2], ycurve[1::2] = y - dispy, y + dispy - vcols = self.parent.get_vector_colour(v[:,2]) - v_params = [xcurve, ycurve, w, vcols] - self.vector_plot.setData(v_params) - else: - if self.parent.a is None: - self.parent.update_binsize() - amp = self.parent.a / max(self.parent.a) * (scale/100) - dispx = amp*wx/2*np.cos(self.parent.th) - dispy = amp*wy/2*np.sin(self.parent.th) - xcurve = np.empty((dispx.shape[0]*2)) - ycurve = np.empty((dispy.shape[0]*2)) - xcurve[0::2], xcurve[1::2] = self.parent.new_xs - dispx, self.parent.new_xs + dispx - ycurve[0::2], ycurve[1::2] = self.parent.new_ys - dispy, self.parent.new_ys + dispy - vcols = self.parent.get_vector_colour(v[:,2]) - v_params = [xcurve, ycurve, w, vcols] - self.vector_plot.setData(v_params) - self.vector_plot.show() - if self.parent.vector_colour_index == 8 and \ - self.parent.vcol_byval_feat is not None: - self.parent.update_vect_legend() + if self.vis_img not in self.plot.items: + self.plot.addItem(self.vis_img) + + def hide_visible_image(self): + self.plot.removeItem(self.vis_img) + + def set_visible_image_opacity(self, opacity: int): + """Opacity is an alpha channel intensity integer from 0 to 255""" + self.vis_img.setOpacity(opacity / 255) + + def set_visible_image_comp_mode(self, comp_mode: QPainter.CompositionMode): + self.vis_img.setCompositionMode(comp_mode) @staticmethod def compute_image(data: Orange.data.Table, attr_x, attr_y, @@ -1258,7 +1545,7 @@ def draw(self, res, finished=False): self.yindex = yindex self.xindex = xindex - self.parent.update_binsize() + self.update_binsize() self.update_vectors() # shift centres of the pixels so that the axes are useful @@ -1353,24 +1640,6 @@ class Outputs(SelectionOutputsMixin.Outputs): rgb_green_value = ContextSetting(None) rgb_blue_value = ContextSetting(None) - show_vector_plot = Setting(False) - vector_angle = ContextSetting(None) - vector_magnitude = ContextSetting(None) - vector_colour_index = Setting(0) - vcol_byval_index = Setting(0) - vcol_byval_feat = ContextSetting(None) - vector_scale = Setting(1) - vector_width = Setting(1) - vector_opacity = Setting(255) - v_bin = Setting(0) - - a = None - th = None - cols = None - new_xs = None - new_ys = None - v_bin_change = 0 - show_visible_image = Setting(False) visible_image_name = Setting(None) visible_image_composition = Setting('Normal') @@ -1438,6 +1707,8 @@ def __init__(self): dbox = gui.widgetBox(self.controlArea, "Image values") icbox = gui.widgetBox(self.controlArea, "Image colors") + + ivbox = gui.widgetBox(self.controlArea, "Vector plot") rbox = gui.radioButtons( dbox, self, "value_type", callback=self._change_integration) @@ -1494,9 +1765,9 @@ def __init__(self): # add image settings to the main panne after ImagePlot.__init__ iabox.layout().addWidget(self.imageplot.axes_settings_box) icbox.layout().addWidget(self.imageplot.color_settings_box) + ivbox.layout().addWidget(self.imageplot.vector_settings_box) self.data = None - self.setup_vector_plot_controls() # do not save visible image (a complex structure as a setting; # only save its name) @@ -1562,263 +1833,6 @@ def _setup_plot_parameters(self): VisualSettingsDialog(self, self.imageplot.parameter_setter.initial_settings) - def setup_vector_plot_controls(self): - - mainbox = gui.widgetBox(self.controlArea, box="Vector plot") - - self.cb_vector = gui.checkBox(mainbox, self, "show_vector_plot", - label="Show vector plot", - callback=self.enable_vector) - - self.vectorbox = gui.widgetBox(mainbox, box=False) - - self.vector_opts = DomainModel(DomainModel.SEPARATED, - valid_types=DomainModel.PRIMITIVE, placeholder='None') - - self.vector_cbyf_opts = DomainModel(DomainModel.SEPARATED, - valid_types=(ContinuousVariable,), placeholder='None') - - self.vector_col_opts = vector_colour_model(vector_colour) - self.vector_pal_opts = color_palette_model(_color_palettes, (QSize(64, 16))) - self.vector_bin_opts = vector_colour_model(bins) - - self.vector_angle = None - self.vector_magnitude = None - self.vcol_byval_feat = None - self.colour_opts = vector_colour - - gb = create_gridbox(self.vectorbox, box=False) - - v_angle_select = gui.comboBox(None, self, 'vector_angle', searchable=True, - label="Vector Angle", model=self.vector_opts, - contentsLength=10, - callback=self._update_vector_params) - grid_add_labelled_row(gb, "Angle: ", v_angle_select) - - v_mag_select = gui.comboBox(None, self, 'vector_magnitude', searchable=True, - label="Vector Magnitude", model=self.vector_opts, - contentsLength=10, - callback=self._update_vector_params) - grid_add_labelled_row(gb, "Magnitude: ", v_mag_select) - - v_bin_select = gui.comboBox(None, self, 'v_bin', label="Pixel Binning", - model=self.vector_bin_opts, - contentsLength=10, - callback=self._update_binsize) - grid_add_labelled_row(gb, "Binning: ", v_bin_select) - - v_colour_select = gui.comboBox(None, self, 'vector_colour_index', - label="Vector Colour", model=self.vector_col_opts, - contentsLength=10, - callback=self._update_vector) - grid_add_labelled_row(gb, "Color: ", v_colour_select) - - v_colour_byval = gui.comboBox(None, self, 'vcol_byval_feat', - label="Vector Colour by Feature", - model=self.vector_cbyf_opts, - contentsLength=10, - callback=self._update_cbyval) - grid_add_labelled_row(gb, "Feature: ", v_colour_byval) - - v_colour_byval_select = gui.comboBox(None, self, 'vcol_byval_index', - label="", model=self.vector_pal_opts, - contentsLength=5, - callback=self._update_cbyval) - v_colour_byval_select.setIconSize(QSize(64, 16)) - grid_add_labelled_row(gb, "Palette: ", v_colour_byval_select) - - gb = create_gridbox(self.vectorbox, box=False) - - v_scale_slider = gui.hSlider(None, self, 'vector_scale', label="Scale", - minValue=1, maxValue=1000, step=10, createLabel=False, - callback=self._update_vector) - grid_add_labelled_row(gb, "Scale: ", v_scale_slider) - - v_width_slider = gui.hSlider(None, self, 'vector_width', label="Width", - minValue=1, maxValue=20, step=1, createLabel=False, - callback=self._update_vector) - grid_add_labelled_row(gb, "Width: ", v_width_slider) - - v_opacity_slider = gui.hSlider(None, self, 'vector_opacity', label="Opacity", - minValue=0, maxValue=255, step=5, createLabel=False, - callback=self._update_vector) - grid_add_labelled_row(gb, "Opacity: ", v_opacity_slider) - - self.enable_vector() - - def update_vector_plot_interface(self): - vector_params = ['vector_angle', 'vector_magnitude', 'vector_colour_index', - 'vector_scale', 'vector_width', 'vector_opacity', 'v_bin'] - for i in vector_params: - getattr(self.controls, i).setEnabled(self.show_vector_plot) - - if self.vector_colour_index == 8 and self.show_vector_plot: - self.controls.vcol_byval_index.setEnabled(True) - self.controls.vcol_byval_feat.setEnabled(True) - if self.vcol_byval_feat is not None and self.show_vector_plot: - self.imageplot.vect_legend.setVisible(True) - self.imageplot.vect_legend.adapt_to_size() - else: - self.imageplot.vect_legend.setVisible(False) - else: - self.controls.vcol_byval_index.setEnabled(False) - self.controls.vcol_byval_feat.setEnabled(False) - self.imageplot.vect_legend.setVisible(False) - - def enable_vector(self): - self.vectorbox.setVisible(self.show_vector_plot) - self._update_vector() - - def _update_vector(self): - self.update_vector_plot_interface() - self.imageplot.update_vectors() - - def update_vect_legend(self):#feat - if self.v_bin != 0: - feat = self.cols - else: - feat = self.data.get_column(self.vcol_byval_feat) - fmin, fmax = np.min(feat), np.max(feat) - self.imageplot.vect_legend.set_range(fmin, fmax) - self.imageplot.vect_legend.set_colors(_color_palettes[self.vcol_byval_index][1][0]) - self.imageplot.vect_legend.setVisible(True) - self.imageplot.vect_legend.adapt_to_size() - - def get_vector_data(self): - if self.show_vector_plot is False or self.data is None: - return None - - ang = self.vector_angle - mag = self.vector_magnitude - col = self.vcol_byval_feat - angs = self.data.get_column(ang) if ang else np.full(len(self.data), 0) - mags = self.data.get_column(mag) if mag else np.full(len(self.data), 1) - cols = self.data.get_column(col) if col else np.full(len(self.data), None) - - return np.vstack([angs, mags, cols]).T - - def _update_vector_params(self): - self.update_binsize() - self._update_vector() - - def _update_cbyval(self): - self.cols = None - self._update_vector() - - def get_vector_colour(self, feat): - if self.vector_colour_index == 8: - if feat[0] is None: # a feat has not been selected yet - return vector_colour[0][1][0] + (self.vector_opacity,) - else: - if self.v_bin != 0: - if self.cols is None: - self.update_binsize() - feat = self.cols - fmin, fmax = np.min(feat), np.max(feat) - if fmin == fmax: - # put a warning here? - return vector_colour[0][1][0] + (self.vector_opacity,) - feat_idxs = np.asarray(((feat-fmin)/(fmax-fmin))*255, dtype=int) - col_vals = np.asarray(_color_palettes[self.vcol_byval_index][1][0][feat_idxs], - dtype=int) - out = [np.hstack((np.expand_dims(feat_idxs, 1), col_vals)), - self.vector_opacity] - return out - else: - return vector_colour[self.vector_colour_index][1][0] + (self.vector_opacity,) - - def circular_mean(self, degs): - sin = np.nansum(np.sin(np.radians(degs*2))) - cos = np.nansum(np.cos(np.radians(degs*2))) - return np.arctan2(sin, cos)/2 - - def _update_binsize(self): - self.v_bin_change = 1 - self.cols = None - self.update_binsize() - - def update_binsize(self): - self.Warning.bin_size_error.clear() - if self.v_bin == 0: - self.v_bin_change = 0 - self.imageplot.update_vectors() - else: - v = self.get_vector_data() - valid = self.imageplot.data_valid_positions - lsx, lsy = self.imageplot.lsx, self.imageplot.lsy - xindex, yindex = self.imageplot.xindex, self.imageplot.yindex - if lsx is None: - v = None - if v is None: - self.v_bin_change = 0 - self.imageplot.vector_plot.hide() - else: - th = np.asarray(v[:,0], dtype=float) - v_mag = np.asarray(v[:,1], dtype=float) - col = np.asarray(v[:,2], dtype=float) - y = np.linspace(*lsy)[yindex] - x = np.linspace(*lsx)[xindex] - df = pd.DataFrame( - [x, y, np.asarray([1 if i else 0 for i in valid]),v_mag, th, col], - index = ['x', 'y', 'valid', 'v_mag', 'th', 'cols']).T - - v_df = df.pivot_table(values = 'valid', columns = 'x', index = 'y', fill_value = 0) - a_df = df.pivot_table(values = 'v_mag', columns = 'x', index = 'y') - th_df = df.pivot_table(values = 'th', columns = 'x', index = 'y') - col_df = df.pivot_table(values = 'cols', columns = 'x', index = 'y') - bin_sz = self.v_bin+1 - if bin_sz > v_df.shape[0] or bin_sz > v_df.shape[1]: - bin_sz = v_df.shape[0] if bin_sz > v_df.shape[0] else v_df.shape[1] - self.Warning.bin_size_error(bin_sz, bin_sz) - x_mod, y_mod = v_df.shape[1] % bin_sz, v_df.shape[0] % bin_sz - st_x_idx = int(np.floor(x_mod/2)) - st_y_idx = int(np.floor(y_mod/2)) - - nvalid = np.zeros((int((v_df.shape[0]-y_mod)/bin_sz), - int((v_df.shape[1]-x_mod)/bin_sz))) - a = np.zeros((int((v_df.shape[0]-y_mod)/bin_sz), - int((v_df.shape[1]-x_mod)/bin_sz))) - th = np.zeros((int((v_df.shape[0]-y_mod)/bin_sz), - int((v_df.shape[1]-x_mod)/bin_sz))) - cols = np.zeros((int((v_df.shape[0]-y_mod)/bin_sz), - int((v_df.shape[1]-x_mod)/bin_sz))) - columns = v_df.columns - rows = v_df.index - new_xs, new_ys = [], [] - for i in range(st_y_idx, v_df.shape[0]-y_mod, bin_sz): - for j in range(st_x_idx, v_df.shape[1]-x_mod, bin_sz): - nvalid[int(i/bin_sz),int(j/bin_sz)] = \ - np.nanmean(v_df.iloc[i:i+bin_sz,j:j+bin_sz].to_numpy()) - a[int(i/bin_sz),int(j/bin_sz)] = \ - np.nanmean(a_df.iloc[i:i+bin_sz,j:j+bin_sz].to_numpy()) - th[int(i/bin_sz),int(j/bin_sz)] = \ - self.circular_mean(th_df.iloc[i:i+bin_sz,j:j+bin_sz].to_numpy()) - cols[int(i/bin_sz),int(j/bin_sz)] = \ - np.nanmean(col_df.iloc[i:i+bin_sz,j:j+bin_sz].to_numpy()) - new_xs.append(np.sum(columns[j:j+bin_sz])/bin_sz) - new_ys.append(np.sum(rows[i:i+bin_sz])/bin_sz) - nvalid = nvalid.flatten() > 0 & ~np.isnan(nvalid.flatten()) - self.a = a.flatten()[nvalid] - self.th = th.flatten()[nvalid] - self.cols = cols.flatten()[nvalid] - self.new_xs = np.asarray(new_xs)[nvalid] - self.new_ys = np.asarray(new_ys)[nvalid] - if self.v_bin_change == 1: - self.v_bin_change = 0 - self.imageplot.update_vectors() - - def init_vector_plot(self, data): - domain = data.domain if data is not None else None - self.vector_opts.set_domain(domain) - self.vector_cbyf_opts.set_domain(domain) - - # initialize values so that the combo boxes are not in invalid states - if self.vector_opts: - # TODO here we could instead set good default values if available - self.vector_magnitude = self.vector_angle = self.vcol_byval_feat = None - else: - self.vector_magnitude = self.vector_angle = self.vcol_byval_feat = None - def setup_visible_image_controls(self): self.visbox = gui.widgetBox(self.controlArea, box="Visible image") @@ -1874,7 +1888,7 @@ def update_visible_image_opacity(self): def init_interface_data(self, data): self.init_attr_values(data) self.init_visible_images(data) - self.init_vector_plot(data) + self.imageplot.init_vector_plot(data) def output_image_selection(self): _, selected = self.send_selection(self.data, self.imageplot.selection_group) From 2296b2ee7bc003d3ef880f949bda714d8f96f485 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Tue, 26 Nov 2024 16:51:32 +1100 Subject: [PATCH 80/93] owhyper: colour -> color --- orangecontrib/spectroscopy/widgets/owhyper.py | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index b7ce8a395..70e11c2a0 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -252,7 +252,7 @@ def color_palette_table(colors, underflow=None, overflow=None): ("HSV", {0: pg.colormap.get("hsv", source='matplotlib').getLookupTable(nPts=256)}), ] #r, g, b, c, m, y, k, w -vector_colour = [ +vector_color = [ ("Black", {0: (0,0,0)}), ("White", {0: (255,255,255)}), ("Red", {0: (255,0,0)}), @@ -313,9 +313,9 @@ def color_palette_model(palettes, iconsize=QSize(64, 16)): model.appendRow([item]) return model -def vector_colour_model(colours): +def vector_color_model(colors): model = QStandardItemModel() - for name, palette in colours: + for name, palette in colors: item = QStandardItem(name) item.setData(palette, Qt.UserRole) model.appendRow([item]) @@ -330,7 +330,7 @@ class VectorSettingMixin: show_vector_plot = Setting(False) vector_angle = ContextSetting(None) vector_magnitude = ContextSetting(None) - vector_colour_index = Setting(0) + vector_color_index = Setting(0) vcol_byval_index = Setting(0) vcol_byval_feat = ContextSetting(None) vector_scale = Setting(1) @@ -354,14 +354,14 @@ def setup_vector_plot_controls(self): self.vector_cbyf_opts = DomainModel(DomainModel.SEPARATED, valid_types=(ContinuousVariable,), placeholder='None') - self.vector_col_opts = vector_colour_model(vector_colour) + self.vector_col_opts = vector_color_model(vector_color) self.vector_pal_opts = color_palette_model(_color_palettes, (QSize(64, 16))) - self.vector_bin_opts = vector_colour_model(bins) + self.vector_bin_opts = vector_color_model(bins) self.vector_angle = None self.vector_magnitude = None self.vcol_byval_feat = None - self.colour_opts = vector_colour + self.color_opts = vector_color gb = create_gridbox(self.vectorbox, box=False) @@ -383,25 +383,25 @@ def setup_vector_plot_controls(self): callback=self._update_binsize) grid_add_labelled_row(gb, "Binning: ", v_bin_select) - v_colour_select = gui.comboBox(None, self, 'vector_colour_index', - label="Vector Colour", model=self.vector_col_opts, + v_color_select = gui.comboBox(None, self, 'vector_color_index', + label="Vector color", model=self.vector_col_opts, contentsLength=10, callback=self._update_vector) - grid_add_labelled_row(gb, "Color: ", v_colour_select) + grid_add_labelled_row(gb, "Color: ", v_color_select) - v_colour_byval = gui.comboBox(None, self, 'vcol_byval_feat', - label="Vector Colour by Feature", + v_color_byval = gui.comboBox(None, self, 'vcol_byval_feat', + label="Vector color by Feature", model=self.vector_cbyf_opts, contentsLength=10, callback=self._update_cbyval) - grid_add_labelled_row(gb, "Feature: ", v_colour_byval) + grid_add_labelled_row(gb, "Feature: ", v_color_byval) - v_colour_byval_select = gui.comboBox(None, self, 'vcol_byval_index', + v_color_byval_select = gui.comboBox(None, self, 'vcol_byval_index', label="", model=self.vector_pal_opts, contentsLength=5, callback=self._update_cbyval) - v_colour_byval_select.setIconSize(QSize(64, 16)) - grid_add_labelled_row(gb, "Palette: ", v_colour_byval_select) + v_color_byval_select.setIconSize(QSize(64, 16)) + grid_add_labelled_row(gb, "Palette: ", v_color_byval_select) gb = create_gridbox(self.vectorbox, box=False) @@ -426,12 +426,12 @@ def setup_vector_plot_controls(self): return box def update_vector_plot_interface(self): - vector_params = ['vector_angle', 'vector_magnitude', 'vector_colour_index', + vector_params = ['vector_angle', 'vector_magnitude', 'vector_color_index', 'vector_scale', 'vector_width', 'vector_opacity', 'v_bin'] for i in vector_params: getattr(self.controls, i).setEnabled(self.show_vector_plot) - if self.vector_colour_index == 8 and self.show_vector_plot: + if self.vector_color_index == 8 and self.show_vector_plot: self.controls.vcol_byval_index.setEnabled(True) self.controls.vcol_byval_feat.setEnabled(True) if self.vcol_byval_feat is not None and self.show_vector_plot: @@ -513,7 +513,7 @@ def update_vectors(self): ycurve = np.empty((dispy.shape[0]*2)) xcurve[0::2], xcurve[1::2] = x - dispx, x + dispx ycurve[0::2], ycurve[1::2] = y - dispy, y + dispy - vcols = self.get_vector_colour(v[:,2]) + vcols = self.get_vector_color(v[:,2]) v_params = [xcurve, ycurve, w, vcols] self.vector_plot.setData(v_params) else: @@ -526,11 +526,11 @@ def update_vectors(self): ycurve = np.empty((dispy.shape[0]*2)) xcurve[0::2], xcurve[1::2] = self.new_xs - dispx, self.new_xs + dispx ycurve[0::2], ycurve[1::2] = self.new_ys - dispy, self.new_ys + dispy - vcols = self.get_vector_colour(v[:,2]) + vcols = self.get_vector_color(v[:,2]) v_params = [xcurve, ycurve, w, vcols] self.vector_plot.setData(v_params) self.vector_plot.show() - if self.vector_colour_index == 8 and \ + if self.vector_color_index == 8 and \ self.vcol_byval_feat is not None: self.update_vect_legend() @@ -558,10 +558,10 @@ def get_vector_data(self): return np.vstack([angs, mags, cols]).T - def get_vector_colour(self, feat): - if self.vector_colour_index == 8: + def get_vector_color(self, feat): + if self.vector_color_index == 8: if feat[0] is None: # a feat has not been selected yet - return vector_colour[0][1][0] + (self.vector_opacity,) + return vector_color[0][1][0] + (self.vector_opacity,) else: if self.v_bin != 0: if self.cols is None: @@ -570,7 +570,7 @@ def get_vector_colour(self, feat): fmin, fmax = np.min(feat), np.max(feat) if fmin == fmax: # put a warning here? - return vector_colour[0][1][0] + (self.vector_opacity,) + return vector_color[0][1][0] + (self.vector_opacity,) feat_idxs = np.asarray(((feat-fmin)/(fmax-fmin))*255, dtype=int) col_vals = np.asarray(_color_palettes[self.vcol_byval_index][1][0][feat_idxs], dtype=int) @@ -578,7 +578,7 @@ def get_vector_colour(self, feat): self.vector_opacity] return out else: - return vector_colour[self.vector_colour_index][1][0] + (self.vector_opacity,) + return vector_color[self.vector_color_index][1][0] + (self.vector_opacity,) def update_binsize(self): self.parent.Warning.bin_size_error.clear() From 0114dcaf62f33e244af47a609e8fe5b2ddb215dd Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Tue, 26 Nov 2024 14:23:02 +0100 Subject: [PATCH 81/93] vector plot tests: adapt for refactor --- .../spectroscopy/tests/test_owhyper.py | 163 +++++++++--------- orangecontrib/spectroscopy/widgets/owhyper.py | 2 +- 2 files changed, 83 insertions(+), 82 deletions(-) diff --git a/orangecontrib/spectroscopy/tests/test_owhyper.py b/orangecontrib/spectroscopy/tests/test_owhyper.py index 8e50e0f2e..78d605a68 100644 --- a/orangecontrib/spectroscopy/tests/test_owhyper.py +++ b/orangecontrib/spectroscopy/tests/test_owhyper.py @@ -771,6 +771,7 @@ def test_oldformat(self): w.controls.show_visible_image.setChecked(False) self.assertNotIn(w.imageplot.vis_img, w.imageplot.plot.items) + class TestVectorPlot(WidgetTest): @classmethod @@ -787,94 +788,94 @@ def test_enable_disable(self): w = self.widget for data in [None, self.whitelight, self.iris]: self.send_signal(w.Inputs.data, data) - self.assertFalse(w.show_vector_plot) - self.assertFalse(w.controls.vector_magnitude.isEnabled()) - self.assertFalse(w.controls.vector_angle.isEnabled()) - self.assertFalse(w.controls.vector_colour_index.isEnabled()) - self.assertFalse(w.controls.vcol_byval_index.isEnabled()) - self.assertFalse(w.controls.vcol_byval_feat.isEnabled()) - self.assertFalse(w.controls.vector_scale.isEnabled()) - self.assertFalse(w.controls.vector_width.isEnabled()) - self.assertFalse(w.controls.vector_opacity.isEnabled()) - self.assertFalse(w.controls.v_bin.isEnabled()) - - w.controls.show_vector_plot.click() - self.assertTrue(w.show_vector_plot) - self.assertTrue(w.controls.vector_magnitude.isEnabled()) - self.assertTrue(w.controls.vector_angle.isEnabled()) - self.assertTrue(w.controls.vector_colour_index.isEnabled()) - self.assertTrue(w.controls.vector_scale.isEnabled()) - self.assertTrue(w.controls.vector_width.isEnabled()) - self.assertTrue(w.controls.vector_opacity.isEnabled()) - self.assertTrue(w.controls.v_bin.isEnabled()) - - w.vector_colour_index = 8 - w._update_vector() - self.assertTrue(w.controls.vcol_byval_index.isEnabled()) - self.assertTrue(w.controls.vcol_byval_feat.isEnabled()) - - w.vector_colour_index = 3 - w._update_vector() - self.assertFalse(w.controls.vcol_byval_index.isEnabled()) - self.assertFalse(w.controls.vcol_byval_feat.isEnabled()) - - w.vector_colour_index = 8 - w._update_vector() - self.assertTrue(w.controls.vcol_byval_index.isEnabled()) - self.assertTrue(w.controls.vcol_byval_feat.isEnabled()) - - w.controls.show_vector_plot.click() - self.assertFalse(w.controls.vector_magnitude.isEnabled()) - self.assertFalse(w.controls.vector_angle.isEnabled()) - self.assertFalse(w.controls.vector_colour_index.isEnabled()) - self.assertFalse(w.controls.vcol_byval_index.isEnabled()) - self.assertFalse(w.controls.vcol_byval_feat.isEnabled()) - self.assertFalse(w.controls.vector_scale.isEnabled()) - self.assertFalse(w.controls.vector_width.isEnabled()) - self.assertFalse(w.controls.vector_opacity.isEnabled()) - self.assertFalse(w.controls.v_bin.isEnabled()) + self.assertFalse(w.imageplot.show_vector_plot) + self.assertFalse(w.controls.imageplot.vector_magnitude.isEnabled()) + self.assertFalse(w.controls.imageplot.vector_angle.isEnabled()) + self.assertFalse(w.controls.imageplot.vector_color_index.isEnabled()) + self.assertFalse(w.controls.imageplot.vcol_byval_index.isEnabled()) + self.assertFalse(w.controls.imageplot.vcol_byval_feat.isEnabled()) + self.assertFalse(w.controls.imageplot.vector_scale.isEnabled()) + self.assertFalse(w.controls.imageplot.vector_width.isEnabled()) + self.assertFalse(w.controls.imageplot.vector_opacity.isEnabled()) + self.assertFalse(w.controls.imageplot.v_bin.isEnabled()) + + w.controls.imageplot.show_vector_plot.click() + self.assertTrue(w.imageplot.show_vector_plot) + self.assertTrue(w.controls.imageplot.vector_magnitude.isEnabled()) + self.assertTrue(w.controls.imageplot.vector_angle.isEnabled()) + self.assertTrue(w.controls.imageplot.vector_color_index.isEnabled()) + self.assertTrue(w.controls.imageplot.vector_scale.isEnabled()) + self.assertTrue(w.controls.imageplot.vector_width.isEnabled()) + self.assertTrue(w.controls.imageplot.vector_opacity.isEnabled()) + self.assertTrue(w.controls.imageplot.v_bin.isEnabled()) + + w.imageplot.vector_color_index = 8 + w.imageplot._update_vector() + self.assertTrue(w.controls.imageplot.vcol_byval_index.isEnabled()) + self.assertTrue(w.controls.imageplot.vcol_byval_feat.isEnabled()) + + w.imageplot.vector_color_index = 3 + w.imageplot._update_vector() + self.assertFalse(w.controls.imageplot.vcol_byval_index.isEnabled()) + self.assertFalse(w.controls.imageplot.vcol_byval_feat.isEnabled()) + + w.imageplot.vector_color_index = 8 + w.imageplot._update_vector() + self.assertTrue(w.controls.imageplot.vcol_byval_index.isEnabled()) + self.assertTrue(w.controls.imageplot.vcol_byval_feat.isEnabled()) + + w.controls.imageplot.show_vector_plot.click() + self.assertFalse(w.controls.imageplot.vector_magnitude.isEnabled()) + self.assertFalse(w.controls.imageplot.vector_angle.isEnabled()) + self.assertFalse(w.controls.imageplot.vector_color_index.isEnabled()) + self.assertFalse(w.controls.imageplot.vcol_byval_index.isEnabled()) + self.assertFalse(w.controls.imageplot.vcol_byval_feat.isEnabled()) + self.assertFalse(w.controls.imageplot.vector_scale.isEnabled()) + self.assertFalse(w.controls.imageplot.vector_width.isEnabled()) + self.assertFalse(w.controls.imageplot.vector_opacity.isEnabled()) + self.assertFalse(w.controls.imageplot.v_bin.isEnabled()) def test_legend(self): self.send_signal(self.widget.Inputs.data, self.iris) - self.widget.controls.show_vector_plot.setChecked(True) - self.widget.enable_vector() - self.widget.vector_colour_index = 8 - self.widget._update_vector() + self.widget.controls.imageplot.show_vector_plot.setChecked(True) + self.widget.imageplot.enable_vector() + self.widget.imageplot.vector_color_index = 8 + self.widget.imageplot._update_vector() self.assertFalse(self.widget.imageplot.vect_legend.isVisible()) - self.widget.vcol_byval_feat = self.iris.domain.attributes[0] - self.widget._update_cbyval() + self.widget.imageplot.vcol_byval_feat = self.iris.domain.attributes[0] + self.widget.imageplot._update_cbyval() self.assertTrue(self.widget.imageplot.vect_legend.isVisible()) - self.widget.vcol_byval_feat = None - self.widget._update_cbyval() + self.widget.imageplot.vcol_byval_feat = None + self.widget.imageplot._update_cbyval() self.assertFalse(self.widget.imageplot.vect_legend.isVisible()) - self.widget.controls.show_vector_plot.setChecked(False) - self.widget.enable_vector() + self.widget.controls.imageplot.show_vector_plot.setChecked(False) + self.widget.imageplot.enable_vector() - def test_vect_colour(self): + def test_vect_color(self): feat = self.iris.get_column(self.iris.domain.attributes[0]) self.send_signal(self.widget.Inputs.data, self.iris) - self.widget.controls.show_vector_plot.setChecked(True) - self.widget.enable_vector() + self.widget.controls.imageplot.show_vector_plot.setChecked(True) + self.widget.imageplot.enable_vector() for i in range(8): - self.widget.vector_colour_index = i - self.widget._update_vector() - self.assertEqual(len(self.widget.get_vector_colour(feat)), 4) - self.widget.vector_colour_index = 8 - self.widget._update_vector() - self.assertEqual(self.widget.get_vector_colour(feat)[0].shape, (feat.shape[0], 4)) - self.widget.controls.show_vector_plot.setChecked(False) - self.widget.enable_vector() + self.widget.imageplot.vector_color_index = i + self.widget.imageplot._update_vector() + self.assertEqual(len(self.widget.imageplot.get_vector_color(feat)), 4) + self.widget.imageplot.vector_color_index = 8 + self.widget.imageplot._update_vector() + self.assertEqual(self.widget.imageplot.get_vector_color(feat)[0].shape, (feat.shape[0], 4)) + self.widget.controls.imageplot.show_vector_plot.setChecked(False) + self.widget.imageplot.enable_vector() def test_vect_bin(self): self.send_signal(self.widget.Inputs.data, self.iris) - self.widget.controls.show_vector_plot.setChecked(True) - self.widget.enable_vector() - self.widget.vector_angle = self.iris.domain.attributes[0] - self.widget.vector_magnitude = self.iris.domain.attributes[0] - self.widget._update_vector_params() - - self.widget.v_bin = 0 - self.widget._update_binsize() + self.widget.controls.imageplot.show_vector_plot.setChecked(True) + self.widget.imageplot.enable_vector() + self.widget.imageplot.vector_angle = self.iris.domain.attributes[0] + self.widget.imageplot.vector_magnitude = self.iris.domain.attributes[0] + self.widget.imageplot._update_vector_params() + + self.widget.imageplot.v_bin = 0 + self.widget.imageplot._update_binsize() self.widget.imageplot.update_view() wait_for_image(self.widget) print(self.widget.imageplot.vector_plot.params[0].shape) @@ -883,22 +884,22 @@ def test_vect_bin(self): self.assertEqual(self.widget.imageplot.vector_plot.params[1].shape[0], self.iris.X.shape[0]*2) - self.widget.v_bin = 1 - self.widget._update_binsize() + self.widget.imageplot.v_bin = 1 + self.widget.imageplot._update_binsize() self.widget.imageplot.update_view() wait_for_image(self.widget) self.assertEqual(self.widget.imageplot.vector_plot.params[0].shape[0], 2) self.assertEqual(self.widget.imageplot.vector_plot.params[1].shape[0], 2) - self.widget.v_bin = 2 - self.widget._update_binsize() + self.widget.imageplot.v_bin = 2 + self.widget.imageplot._update_binsize() self.widget.imageplot.update_view() wait_for_image(self.widget) self.assertEqual(self.widget.imageplot.vector_plot.params[0].shape[0], 2) self.assertEqual(self.widget.imageplot.vector_plot.params[1].shape[0], 2) - self.widget.v_bin = 3 - self.widget._update_binsize() + self.widget.imageplot.v_bin = 3 + self.widget.imageplot._update_binsize() self.widget.imageplot.update_view() wait_for_image(self.widget) self.assertTrue(self.widget.Warning.bin_size_error.is_shown()) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index 70e11c2a0..bdeedda8e 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -612,7 +612,7 @@ def update_binsize(self): bin_sz = self.v_bin+1 if bin_sz > v_df.shape[0] or bin_sz > v_df.shape[1]: bin_sz = v_df.shape[0] if bin_sz > v_df.shape[0] else v_df.shape[1] - self.Warning.bin_size_error(bin_sz, bin_sz) + self.parent.Warning.bin_size_error(bin_sz, bin_sz) x_mod, y_mod = v_df.shape[1] % bin_sz, v_df.shape[0] % bin_sz st_x_idx = int(np.floor(x_mod/2)) st_y_idx = int(np.floor(y_mod/2)) From 0526c7d97c2166bcbe0e5e13cdb643be5207bcd4 Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Tue, 26 Nov 2024 14:48:07 +0100 Subject: [PATCH 82/93] hyper: refactor vector plot from BasicImagePlot to ImagePlot --- orangecontrib/spectroscopy/widgets/owhyper.py | 51 ++++++++++++------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index bdeedda8e..a9c592adb 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -313,6 +313,7 @@ def color_palette_model(palettes, iconsize=QSize(64, 16)): model.appendRow([item]) return model + def vector_color_model(colors): model = QStandardItemModel() for name, palette in colors: @@ -321,11 +322,13 @@ def vector_color_model(colors): model.appendRow([item]) return model + def circular_mean(degs): sin = np.nansum(np.sin(np.radians(degs*2))) cos = np.nansum(np.cos(np.radians(degs*2))) return np.arctan2(sin, cos)/2 + class VectorSettingMixin: show_vector_plot = Setting(False) vector_angle = ContextSetting(None) @@ -477,6 +480,7 @@ def init_vector_plot(self, data): else: self.vector_magnitude = self.vector_angle = self.vcol_byval_feat = None + class VectorMixin: def __init__(self): @@ -487,6 +491,14 @@ def __init__(self): self.new_ys = None self.v_bin_change = 0 + ci = self.plotview.centralWidget + self.vector_plot = VectorPlot() + self.vector_plot.hide() + self.plot.addItem(self.vector_plot) + self.vect_legend = ImageColorLegend() + self.vect_legend.setVisible(False) + ci.addItem(self.vect_legend) + def update_vectors(self): v = self.get_vector_data() if self.lsx is None: # image is not shown or is being computed @@ -650,6 +662,7 @@ def update_binsize(self): self.v_bin_change = 0 self.update_vectors() + class AxesSettingsMixin: def __init__(self): @@ -1129,6 +1142,7 @@ def colorbar(self): def vcolorbar(self): return self.master.vect_legend.axis + class VectorPlot(pg.GraphicsObject): def __init__(self): @@ -1212,11 +1226,11 @@ def boundingRect(self): return self._boundingRect + class BasicImagePlot(QWidget, OWComponent, SelectionGroupMixin, AxesSettingsMixin, ImageSelectionMixin, ImageColorSettingMixin, ImageRGBSettingMixin, - ImageZoomMixin, ConcurrentMixin, - VectorSettingMixin, VectorMixin): + ImageZoomMixin, ConcurrentMixin): gamma = Setting(0) @@ -1232,8 +1246,6 @@ def __init__(self, parent): ImageColorSettingMixin.__init__(self) ImageZoomMixin.__init__(self) ConcurrentMixin.__init__(self) - VectorSettingMixin.__init__(self) - VectorMixin.__init__(self) self.parent = parent self.parameter_setter = ImageParameterSetter(self) @@ -1276,13 +1288,6 @@ def __init__(self, parent): self.plot.vb.setAspectLocked() self.plot.scene().sigMouseMoved.connect(self.plot.vb.mouseMovedEvent) - self.vector_plot = VectorPlot() - self.vector_plot.hide() - self.plot.addItem(self.vector_plot) - self.vect_legend = ImageColorLegend() - self.vect_legend.setVisible(False) - ci.addItem(self.vect_legend) - layout = QGridLayout() self.plotview.setLayout(layout) self.button = QPushButton("Menu", self.plotview) @@ -1317,12 +1322,10 @@ def __init__(self, parent): self.axes_settings_box = self.setup_axes_settings_box() self.color_settings_box = self.setup_color_settings_box() self.rgb_settings_box = self.setup_rgb_settings_box() - self.vector_settings_box = self.setup_vector_plot_controls() box.layout().addWidget(self.axes_settings_box) box.layout().addWidget(self.color_settings_box) box.layout().addWidget(self.rgb_settings_box) - box.layout().addWidget(self.vector_settings_box) choose_xy.setDefaultWidget(box) view_menu.addAction(choose_xy) @@ -1436,8 +1439,10 @@ def update_view(self): self.data_valid_positions = None self.xindex = None self.yindex = None - self.update_binsize() - self.update_vectors() # clears the vector plot + + if isinstance(self, VectorMixin): + self.update_binsize() + self.update_vectors() # clears the vector plot self.start(self.compute_image, self.data, self.attr_x, self.attr_y, self.parent.image_values(), @@ -1545,8 +1550,9 @@ def draw(self, res, finished=False): self.yindex = yindex self.xindex = xindex - self.update_binsize() - self.update_vectors() + if isinstance(self, VectorMixin): + self.update_binsize() + self.update_vectors() # shift centres of the pixels so that the axes are useful shiftx = _shift(lsx) @@ -1580,10 +1586,17 @@ def on_exception(self, ex: Exception): raise ex -class ImagePlot(BasicImagePlot): +class ImagePlot(BasicImagePlot, + VectorSettingMixin, VectorMixin): + attr_x = ContextSetting(None, exclude_attributes=True) attr_y = ContextSetting(None, exclude_attributes=True) + def __init__(self, parent): + BasicImagePlot.__init__(self, parent) + VectorSettingMixin.__init__(self) + VectorMixin.__init__(self) + class CurvePlotHyper(CurvePlot): viewtype = Setting(AVERAGE) # average view by default @@ -1765,7 +1778,7 @@ def __init__(self): # add image settings to the main panne after ImagePlot.__init__ iabox.layout().addWidget(self.imageplot.axes_settings_box) icbox.layout().addWidget(self.imageplot.color_settings_box) - ivbox.layout().addWidget(self.imageplot.vector_settings_box) + ivbox.layout().addWidget(self.imageplot.setup_vector_plot_controls()) self.data = None From d4c6827d6277b550953dbe7a4ad8843b878b0838 Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Wed, 27 Nov 2024 21:25:21 +0100 Subject: [PATCH 83/93] Hyper: do not store show_vector_plot into defaults, bump settings version --- orangecontrib/spectroscopy/widgets/owhyper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owhyper.py b/orangecontrib/spectroscopy/widgets/owhyper.py index a9c592adb..349832ae5 100644 --- a/orangecontrib/spectroscopy/widgets/owhyper.py +++ b/orangecontrib/spectroscopy/widgets/owhyper.py @@ -330,7 +330,7 @@ def circular_mean(degs): class VectorSettingMixin: - show_vector_plot = Setting(False) + show_vector_plot = Setting(False, schema_only=True) vector_angle = ContextSetting(None) vector_magnitude = ContextSetting(None) vector_color_index = Setting(0) @@ -1639,7 +1639,7 @@ class Outputs(SelectionOutputsMixin.Outputs): replaces = ["orangecontrib.infrared.widgets.owhyper.OWHyper"] keywords = ["image", "spectral", "chemical", "imaging"] - settings_version = 7 + settings_version = 8 settingsHandler = DomainContextHandler() imageplot = SettingProvider(ImagePlot) From 3b83e4da746a8cbc998a7088cbbf582d6551fb71 Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Wed, 27 Nov 2024 21:32:09 +0100 Subject: [PATCH 84/93] Polar: fix context settings as in #707 --- orangecontrib/spectroscopy/widgets/owpolar.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 19f9a47d5..4ca3b857b 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -463,11 +463,11 @@ class Outputs: resizing_enabled = True alpha = Setting(0, schema_only=True) - map_x = ContextSetting(None) - map_y = ContextSetting(None) + map_x = ContextSetting(None, exclude_attributes=True, exclude_class_vars=True) + map_y = ContextSetting(None, exclude_attributes=True, exclude_class_vars=True) invert_angles = Setting(False, schema_only=True) average = Setting(False, schema_only=True) - angles = ContextSetting(None) + angles = ContextSetting(None, exclude_attributes=True, exclude_class_vars=True) spec_type = Setting(0) feats: List[Variable] = ContextSetting([]) From 6c008e5a5a2b1a3c1265cec4fcae114bbd9abf92 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Thu, 28 Nov 2024 12:29:45 +1100 Subject: [PATCH 85/93] polar: update documentation --- doc/widgets/images/Polar-Example1.PNG | Bin 62023 -> 88378 bytes doc/widgets/images/Polar-Example2.PNG | Bin 58652 -> 78293 bytes doc/widgets/images/Polar-stamped.png | Bin 20137 -> 36233 bytes doc/widgets/polar.md | 19 +++++++++++++++---- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/doc/widgets/images/Polar-Example1.PNG b/doc/widgets/images/Polar-Example1.PNG index 73b8a205c92e86d5b2b7975c218031e4f5d7757a..1d211515b49356b81a39aca885cbd363d6e6630f 100644 GIT binary patch literal 88378 zcmZs?1yGwo*9KarNTFD9C{nz*YjG&EY|n?Uqd$2YNlM@wX}Pu{#wAGI>kJNDP~bs53)Gh z5&Ou?6Ie4_wjs%`??cSHILevWQJJME7+=R-#WxHQ)@ENY^F*M*ZQipTDA zE=-iy$Xe?Zrl?6&C*Bpb858rH(87K9j9J&}fkaoYPD?2HJnOEOAOjZn^!OVc`k0fZ zR7VSh!R}yNBHajil4F}ktpz89Lz5h#I){bO-zAh&JQnx8E;kgaaQk8vAKuSBx#yNJ zq!fH1pi^{FwJqd#!X4^Zz&UR%l#M8Lwx4I))Vt=#wVd)6`nWt3*BIFwj>aMWgTxBM z{2}OA+`8eI-; zT`4$A-Rivmx(!Tb2;Jf!9C_3m63C2oU{$(8^?1dVJFCp9dDq+Ra5r;=#r-@d`_JU) z9A$C0RqHk4IGDS;b{Mt^ak)7&ZAG3BdF>Y_JKtT}HmzW0LfnITrL9s%;IF$mCUKTa ztok5&qnla+kHA3zrxg)a!^XF}S-x!N7Z+6~oj+6lOfCxF>O(o91Q6vFwm9Tz9-!uiB|*ZgG3o9j(Chf?J)#IQ(+De>A=DaZ@f zOLTUw$i9(UjI*{8$=+9HeD%B0rbbZmP9`7vHJ1~Md;5%b>or9^yE1ig^1^&~5u%&w z;eGu}V_*HJ?^yL1C%Le?m0nC)RAtGh2EL^1=4gVVMtC*_>K5?b;laSbz*9o`Qpk1E z%~3NX^=TuzpfFu~#u#j8LP-(0jA<=&5GTwMPsj%7l#DS=L5JL;^NFDx9%7oJByn7p zXUP)eoE|9tcsp9fM{HU@&|md0lEWS(iUU{r{GQkx0Y7fI>$R9eViYC^XN?Ws&vK&d z(Vhs1K-p!HJZq%$-8#!#w!Q;;o$_tU*!*7rV%@=fOe-6Tr^SKM`~1G^uaEgDl)p)u zZ#BxHOxS-SdW@GHkA)h^^STCOf7plW`|T+Opxp8A ziifddj^cXaNWqW+(+ONPp^9vWj0u6OKEbPr!fvX^8-n)h>6Wuy>#Rl?p63Fzihu7sUF zwo~v2Y<0){jM=bR*6mpMZASkNCvhLE_Z8U8S@6H~YFN|O-7U_6UWr>xmj&n3TZniyoseWA69n>!K_CUM}_wj5UN4`_m9y!MVn>k#eUoMK( z-wC^{Kc=0gQnJ$^_}Vjz_NWjX53^H|7j<>IJ1i^AS)9KWCA3R*)}So1rMgnHRhpFN z8h7WeC=h|V1DkGm6}L2;6h|DWzFkPY>75i~ib-0)UC@fp5Yx3H7ZgHshdLSF`b0%x z4GAn5XOl%QJ}`+JSZ4)Rjdkok_4Yq91l|(5Dp*dng*LMWc}GLfHCnyP?=s$Q@o(Ce z=5Ed$LcOfMO3xMXcvwl_(? zxtOVkrORk+X83H$6a3m=TV9o~g**<#BGe4NRq*U1kRAR{0S--yeIS#@b&4|c9iSt9 zT0)F;mN@BWZ% znCBNhcI9iJoF(;B6TrR^Km}ygVf$Ixu+#B)_=PJg=D2?JJ~Ar*YKy;Ne9U7}3qC$4 zBqZ+cpIZ9kowJH6ZG#s`>yU&#**Wb~&j6<;&ho3tV~)vDvww?h?si$l%}zsm;Czks z5Qp-&^C19IN$4EE#%j1L;N-?Bm5-3_Rex(d6!%yy@C!Wc*V{=Tp1g{hYR3Gglv%fu z;!X^ma~OZeEh&>h7$RUIRCQ*R=DsH>;J)?zgXF$EPpakJvQt3*483FyM9>T<;3n`gJ*CY; z#gYb_Tp-6U{MXrZTMC`P@P*}$;_k}Ukf*;kn?m`-H?0-GKs?K<*|6u%_)vqQ3g7l+Ex3tbTx1sQ$3@SC?7D#|5ifPKK?hW zl@L2yN9(6s*1blB*9Q*DoEtB%`i}3iDZQ5#Uc?0vTzP4TO5sHprJ1IUF{#gUkjaWzxEhR#zNQ3%>JUEx@6i)17$lP4l&L66B}0(n>+OG zKa-N&2Z;N;heDebquZ8~W0Ic2xWQ~K(veGDtvSZ&4X)MQvr?Dq_vr1^Y5fod^rGWOJk z`89dGb2a=ZZj1(2F!}5IWuS^`OkWeOJNd%WBsMxAq9N9sR#O^JS%@7^%KR27!OS{2 z*_cWzcp&P2xL@Ff2S{*SUe&odNX>WHL+&G$_e3VWCw4=Z^dOI%^VHFCZK$1qi|QUC z)VdFT7GsX+uV{2FRRSrF>D8$MT{Yu>P1;Dn!&U9IIPn#;7~hJ+iRsZ?5Vl1TaDy}z z$aqxzwTGh%jyRH|l8Fpq{q(Xt5!lzS{L(#t#qOK3)qzBtGu?~%4A-ySMJRZoL@>pc zmpnPYq3a8bD64G#d;;=ez8Z2lcN-<|=Fkt6UUJ8Eomwk47D{^`oNA1m{Fr^YJUOt% zb~!lcAjXX0eQDzR?k;u5s(d4?&xd*!)JuHkf9b{i?1ixfdzs z&Tw}xxK*u}Zu5FliSV?JCo^WqYII2})Mo>#Pdk7d8D5G_75c@&!2S76s+CI603$cw z9;cmXRo{qLx>4=pl5H~zK2Dw;q^9GUog~<(QTf;s$i+l&6oT>^fA^es9$dReGk|PI zGLu7*!QPE~OCr##d8*sBQ>xy4ME0)-7GnhI(%Fvo#OT&L_@fWI?86PiK0w`Fu(IiE z@MW=C^+{Q090P2kYI8!|dW6-mu3YWzxbdDxv)A{da`7e#uwilIJNuR+I(^Jy*l|$k ztcuHWn6{k8#7Bv^R)yFpHA+$p1Zs}D! zo&VZf1u0~Ns)K>-Q5&Y?pMcjdhen1=IY0K4xQPfRd-MRLvl94^1FyGb_sJqTJ!7sq z&1uLfI^XlRy1iLwyoQW&7hj8Lw(o38#xF;VY-`O%C@2l zMfx5+`g0TFkbxJ13_CHAe2zE!H8+#ETo<41Id(}N+%x^Z45nX8AoBc$I8lj2xi6$H zMfszb%;Rad*F$fzc33Lw9_d)!7&J{3Q=7k4+nAfdb-z7L*c!XiK<6#Kdkw{_l{o!P zy|G0>2k`I*-mTf41k%ht_k_Nz7*k>^E(PG%A~_*d?goDtew=BFy_r*XT>iDbN_bN~ zgDh;0+uHg3vSeD|or{%}V6JY@Ws4yAlG$m2=ooZ;+;h8|8G3$bQ!f;!=d6>_c#;iQ z6zBFHqs@QlG=h>wI%3t|$jrSTJNM$EEx0?;b8s!)hDiYgG>mXTvZNh-G)Hd3Wy>u z0oXw#+u!tvvz^9(RX5Qo*<(IH5}?%ZR2JDpjJV*c%Ws=1f$f z+^9MU8!>OSG$jrp!4#z4DXBt0x~;bZCsrEkLo+kx=TxT8=yz*zU<^ZRGiSif#9%$Y zbsEBFl+j|;FM@e#sX?N98FC>HIg)=jFy9T>ZT4t2f|W)x1S59=J_^C8b)Q%~MOD{l z=W8-HFj()mpZ*vp7RZ7Ae)5Gyh-@3t-Fg{Wr#NzC7FL#hFJDBhA^K?+IqVDLKSlW7 z(oLh$B{Q>TUQcQWq&=hEDK7l1do!r7$0P0?i;Cx-fX4vwcl%6)XM>m*um&e~5RhIN zIePDVmfS5@kX>YPzqZ<{2?P(vEc$^?tz9LD7fmi~y6dqYKgdyf2Z<~Hn8+fN&I_A-F%kaCpn0?e;2(pREPrG)FWkaMutVOJdz`m)kHJMDGN>;unmwQU{8O z{Q(;NLccmW3@$R^^%Q5kBw+u*99&$2GjN1vA}S=H@vaMf1EB~cjD1EW+@9$$y3W)$}rL0-P zmqdQoNe0LbhBoxuIM5r%I9Y@_jG#C(BA-h`|G2!_mBeavh6wiOa@Cmu!u{MEOGJEpu#m_c@DB~%kDqQgggW#|-{9J~!>;PZR5kj5sp*&pA~K` zU<`m~xM7x%KPlM%ils37f5ThKskfTB-Bc$H#dlhx=K)Snj07Md0q=>iHYT$l+~Zro z4PWfdQ{R16$rcMvVqb~LA7uh5;xZ&N2P~f@0qde}Z8M#<`kv>NtF)eM^bVp)XA9-{ zHT9Dlx-vQc3NdfH$MiZsW0Y0B$KZV~{09;2TKi@>xMAwr#J%>-b|X2}ZFVtiVvq4* z4#@d{@NF`e6hdxgC$Pho(r=o;1%L{1mXkQ&$3rrKo2@WIa4-=p9dM6VtkUaisG246 zV^!?t`=utSzxX&d)!i{TXrxwp%j>jEyLaeprz`@t5Q*Zh{>x0Ps4a4rW#GM;mtz0D zg1=o7Ookb0Qm+2-u~)z4TZQ@P5;)-A4!OhM(fRl96UUZgzSJZrR=Bv>EgFmJ;FqS9 z?2X|3LSwn7#|-dtMwZ0+k>7+cm;ppJqvwJh#UM2GVM^LVdlO~;uK#!|rsw)0!Wco% zgFH|`?vo@+yWJ@uRnI6I&j%IN&$660bTyu;h`Bq)W`+gmI!;Gy#o8CU0n}51mXgy+ zVQo(S6rBq=8$+J5^$&+FCkzqT?p{fGsIkh4OcRQq;B-1MBz$%)3M)9@ehYaF0tAUgE&d^y4pu+9 zS<3f1eMG*B6@>}&0E#Exj*5kL*B-Sz9|qg@fge1H5kS4jp{>CIh)9F`2)lr|camHO zJh6QzRtzbO+>tnJe{XvI{jJqiT|n$Y`pkM#G*#DT+?MeGgwmgwtZX%Olz(QZ_Hp*@ zce*2==JxbIIQu<947=X|(P;P2x}`@Y6(A+!`_N0FXch405s<>_zoV@VoX4I#=2f2Q zU5Yc$uX?Pc}`&|Ru+z7fH)fuBGw4#Wa9Ry>72!1*obR?IiHE@SH8VT$>PJmkMM zWh(n2&kr<8+dvS$*)O$Xw-Plf4#U~o_o8C^yWMya5(VYQ8hgd{c##5Ln8}uL-Mp;ZqX>yvkIOY}z2OQ-$@=d^ zb)hd?P0d%J0tT!_+4pOl1}7tS0+0YK9GNo!{OH#r@Enva4Frlk9IrmSLBpX;FyCJK z4>gOt7%fxFXlVC;^RN$i__$AIQkrqoO~#%YJ)dVtAA20|?7kyF>&|*KD>&`9>%KLY zqMR-mS;D7&r_17E*;zONR@iN)k?V>`!g)9^zS($enjW;sC@(GPD*8fNfsk3|NA>5{ z3Lbf_e!D0~3CR$waXFu|HM|HhtLy7JW;mQd6lIdoL$d^2jZKe>PoZtSDWXaL9aO3w z@Tv^Z+s-W))6QGm!Jj;x)wEl}Ac<68oSqI3*lNwOJ%ArChL(ZbNdqqU13+6Vuo%xZ z(Nk}n%9ax$Xtp@Ok=uHN9C`5caC2h^Xr=-Y7GSPnZHX=fN5YNb<^&vgic+DUcC|1C z&Gzlsb=n2?mvnco+IJQjK3t7NzdT56fd%qbB3#@Y;e_Gzc&WKymn8eyz)R{B zDuPE6tKU*^*LJ`4lI66So)urzo?v}68q2!|K?7my6S|FN%R4sGH#px*;ph3C1yU)w zX5SxK!rS(x@WN10K+0t|2rO)Y@y)Q2cK9hhGS+K!HhvM6i6O7iDh`Ws2OFV z0x?0|KJTWDG-bM)KT>RScB`JSBjVI-Eq~V}P zHS>;22G>H}Mz*_gT3 z-FA11vj8@l_)w8B5#x2YMg==N4JeZgXZ1cVyjh~~T<>TB(oozoji8f?!>2&B6Q{M{ z7Yq-#O<<*P{y~cNe=9IIE#utO_p~2Ijj_G>o1pTDCe30QeC>Lhia#vCiJPsTm~3id zn4}1|(dEY<>;da;0^SEf9rs~8)kl0G4`*^2A{38*zF9m{S&)NB_6)`NkUv(9En1wy*Dk{YBy-(XL z{XK~rcD_e6pZP#&lvzr+l>l&chs>(izw@TeW;t60UcPuw0Y?k8+qe}vi9GcUNgbpU zXR)xKI9+AQ)DM{Wy{@w`g29jy#2_kVb>#X-RbC>7 z{>LvMHM^}heD;C;`qVA!$#ytH*57FUl`tp&!!L|%DjDQmBOq0=aCkesEk)F~o?Kkc zyg>F^4pwb5=5#YQ?DZIGSAotnVgS+@vmo7}BV15d9RwKRos#&h7be5*m&KDo+9}X? zXlL!bvzth_QFTtJp8PKIt__?Q8wv|N{k8`0K=7($Mg_cG!oKQ?^K$zMbx*JN`y3pf zD(sY%!F16Upc~jVi#E{?<}nsmZ1A|ulgytS(-7uX@>2FP!?Ej_eZe>?hA2N5tnsS4 zH$S~xJC)szd#iJZk#EHi6QrYA@dCF;#m#6y=V-YN{iRlT`9iRVucx`@(+ayj*Zo=V zgFg-w+w(@Y+oux0H%*Fg2H*v~b0?Nx&w5Jdyy;iy)%ue@2*&eWdG8 zv~TAp4*UrnHxXH;^xvUk;u{@Ccm`$PDrydd6T7+&;ZE@xY&rph&2`T|__P!>&#aSF z+Xk4mS_|bXCGd;;PV^nOpQkTvm~hOZ75UTf->>f2s`L`P)<8bh8)XbSJlTlN)OQS0#lf_OS#scr?A=S)!C2 zQ42PS5NsIiYL7Vx^K;h~;z??&2hse&buLGyq=wAi3)TAy!YC6uc%{D98RT8qqw zabd&lg*q@B{2gM>{YN=S=r2ZbE-cle@pLf&qZplD*-Xy9#?&rkv%6_-Lcr@A$l=OB z>O3pMb0MZOor(x_K{J>P(ZWY<1xZO@?yP_LK_I$2TE)Zum)aW^HNrDGN zgO#1+?;5b_)!v~Bhlg99$)w{EA+HhL*C>3Gl<=IKx4j!N_I!|nw+J*&wQ9qqwrAer zLwaZvjUCI^g=?tjDS8jgCT!1UqAc(V={ZYR=^V`pXDBlp@n)06{Ce~mg{1=c&RSFv z;dz{2EKaQJdrQkM3~(Wv+kL7>$OyOJ)Y+4_SH6IcM#fPA?Z=TfGw@RoRcwcAuQpe7 zX3Lk;YI?3J375wv(E`cv)^@K#s2ikBT(Y}kg$d4^g!p`sEG2igCKbEUu-^FswntB= zjISs@cj1DO?s(250n54i#vY(e8{v7tpZs!eN-Z$v>gz8L{xJcgwc93>(POXF>Nvp%Qac>28v{V7%EgWiDs>X z-*oJYxOj)qi6$>i%&%Fi_HiznZ_P@XR0~#RbziVg`oCQ<~OuVX>)hn{E7# zf74g|K0Z9q_N55&Gb{{X?ri7YOb;lZIz66=WvFo*R5G@b&$gNdUvj6e>vqJxuU<{N z4tU5AyczSI`P`u(gu+KJ{L@S{hofW6EC=k^d*%3ERhey*S*D=sCH)l0O%Rv;ZkcBQ z5xC_NW8bqiG$RAze^nMrlTs{3-oBL>=>lV6PXIP#ml;9#-D{^tDETr4#Z*F%UADM{ ztwz|f&7TunWmtTJVs>+IqXU5)_&;Xbq|A4o{rF^`k@3y-DC0ATaA%Y-TA?aI1qo6K zbzu74%{EgiD4grN%-`+pFCjgI;kUKaHXMMmMP3av=fcR;6lzGj5AZX%-6(Jaq|PFAagYQ7#N*tUQJLJus+%jPN6yQ!>8M20 zYIv~QmU=G?w9(EVybQJAm6V(7iT}^|`&4wM(fr|uOWrV@23>RbvE6F)mxn_1Y`l}n zY=?L%gt6itPzHNt|ftDYs9*~#WE|kE%iZhdu%h z9C+^VSocs;iFwKLeJvGLY$Lcs02F|A4{KD}e}~xH7>n&6hq51oz)MvxD;xljX{S4u zK`w`xHmBz+dafT=0OtPIF@utd`$UJf3W&C^1NIOXWeTG<0k=M`CvOOhfADvh+OM{l zBVlXZu^Z#mimjtrqGY_c!4*GSv$};~BYP zK^*?0nc{XqSbm`^IJLi7wG^jpD zDd*_g&JE#6WmrCy{)m#^u(w@mOgKfGrYvnJ4bh8K5NKkK`B8LV%^EiFMS10TQ4|J$r|B5ZIC3pv9TXa<`&PY)!y#d zgcD+cDiSeRi;+5>r(K+LIH?$y$C0_2WzIk0BkL?8V;90~Vt3uh{+1yAj|Y_YvXQ?1 z9!UiFE6IjACJ4Nexn+JKQaySLdbZgHR%$r8pZ0oGeq=P74#5#F8fRkyEF>>vf2$oi zZ1=eqv~wlGQ+C_2*eO=PKBPk!<7UP^;g`StyjvrOjM|Hg)NdTUgVo&D_k3j&a3mM zoR}ZDmp>7gy+J<7yqnO`blD8Xrtqh{*cnL#-kGwsh`431r~JNrc@al-q)Dwz_4C$l zOvoOtN=Gs`>dZ1@QCR*n>WF37d}IgqPo3nuN5XpWsk92Zy0M-L|=u?Aw6H1%-rQrq3gwNc3=lH zQ@82(lNIsv7ai{TEDo%5uajD87iG4Wel>19pCaP4T%h);7Cg;5Mx+#;< z(QunJ50ALJ#?|Asa3ookvh~Nq)rvVb%Dpmvrz0P>Nk{LkUcT;F2Rmt(ZhCnKx*!cHWwf+9 z*Mr57zKsxz_1b{9&p!;|+O>rp^UYsUa=R!sr_i#AvEzW-Op>Mpb4fd`y63Qj1=D)R z22OV}uBjg^NJ>~$#tIll#XPlwzY_*0Z)UtiO6=N8?Y1`VaS=Yt67?hK2w?p!8LkwJ z7z}!`9CaE8!jk&hRQHlmk7e5M=WQreL3j}#JgjX%%jv>kv*HVW-2_-{o_p{}Nje<=@sy_$ zZ?V9SJM#@?H{7X%qJgaPifA+fZGwHw$Cstwu5cWPDucLa{CRiyS!k?+^2fkc;6)9W zhbYb44Ld}$(Ojd|n;CNk$&k08Hn(cZBI73PDJ`Lr+Udj+5}O{`VhlRVdunH8bMR(H z%(#vx-InDHggG;|+4FZCzFAC8pCffN1KtNNvM$aJXDg}slai{;-<=LSv=3&$1%~6r ziq3mzZuiZqydg(Mjfq%5gb7~L&TqnVQX3%AJOelmzsV1P8=4)Uep|%A!wpJyv$zpE z>JobW(OTP>Cc$xc=|F9Xr?9A-XPSWUuSsE@qxG9tW;?VS)E&QZdxa~G>m&WY^?L~? zs3fSQw;u&v^=Y(MER|k+)8*2*_f?RGH&TUm%>o(rQbb`wVpWwSb1H||@#v#{TbrLv zcqQGD3tRo$TSCi#q9GA*-<#~P$R_34kFVYVLX{hwo_XV&nnF0ZNs6uG_xmJW@7Iv! zO8T*k7<{}rUQY(-6Q+datWqkp_??3N>s}uFvdCOrmghX@2|cV2TzwVY4anAhOa3r;Q#$L^=cUe>ZN6sMyv zVY0V}tpG$A{b;I8bc`vP!R(1ZtMeSYPqSTS1fm^&Z$~?Bs{dPu9fHJcc81ar-)>4E z`H(3QnOS2zEsi7TLp`n)mK)R$n!ASP(3Dk%svmQguSTV{o;1_v@rQ@KXFiN#r1=2* z9Kl@I6JA1?5X1c3hgSX;eEJua5}NG0Cb*ZYZhp*G6g+CA{C_*qvBkEF`+LIt?ce=} ziGLO6Y8M|q+udwD*4g@~(gU>UQFs5&t53?Dr2OnWB>lz*#4tBj3l34 ztUsN+jf8-(&vAV?j}nt%ahkS`K*{yAOb;2*~#7bxatHs zUe#rHDo`jonMbtC%jhizJR&M&QKFHkPZ8;61o8E-FQd203@=vi`gQEF9r|>LLAf>s zXPiL=M0v&wY~QAGk0t!4sqnQSP%Kv!DDKqzqF81?odutKG&Op zZ`G0s)%-F(eTM#+t3C%+tq>68dA&FO@uq=KxTCYc-7Gpi)wHu{d5(p-Dr~W=-CcfD zps#ini^A;=tB0XZ-O0G3p+vE&wZ|*)GyLcI4*lm0CW#_m11{YS|Ar1KmOA|%L?wZX zWbHj7UoUr3)rcB04ydF*5v_{ep_9 zU8&edlYH4w>2pTv?cL%BXT|)!*G1a!l2)_hm(*72!ckexwx3lZ1c&X%-?#IK zuA zd@3cl<8Rqjf&6V{)BmUjuI|*v69|t2IX44u8X)T)^T9r%^HlVw^}{()-TAbhIKf%Mg;#`54hPy)dfsuV#Y?g=y^|i$%MVUkqjlmk?;~q>jVXIC7-U^G2vW zpm@=?8YOPKTc+(cvmKH=_3R=L0PSLU|JdtySv5~|4e^MulukHZ*Hi_r&s_+JdVLQj zs2AbWAhhhxR&O^K*aoJy5;-`#V6nL-goz_}a^H)h=tHkyaNQ~;z55bvtjNy^ja|-s zo|IWfv=ajU5AP=vv;%Dfxb9hg5bF!>h`q4Pr)yb#@fp72Zs3U$+Z%eV2ls=PPb{!+ zxm(ZiuLo41Ui=;Mvh+!h4@9jWOX0&G0U@Rn>o>4Xy+0;TV<@9XCB<~=>%N&>6!qvD z?Td-GPH=OB+)qId55RK6CXE@1Evw-?Q>j7lgc3;!3_0j_@#nHjpAmS)+PWS;f5WoA za%nJxLXS2Sg}Jrn4$k;=*n0ijV(!s>%v)h7wN)~kcU}H3GEBPaj6V>&A4Sw1Mve2c zi^)58`&jVr-><)qC#c-0Ngur%H-LH4_6$ zzH7>*y3t@i<2hxr>j>6wDSFNgOJRs)QE#2dc(VPu^%S4~lXMT1#~eTZU-qU%swBv* z7?OJ8bx)T$qn;sZ4B7YMwihbS5(IOk>L(>84u~B8u|)@!75F*{RVeb*SP;`En{q4C z&nm#hP#6j4*^ehyqgfQ(-~{@l8Y`E7+O_{?g;1>^lra7O8U+7;je_re^ife!bWyaH zkQgJ!=0G%@-+)Tt)%z3ALi3bTY}M~w9D*UUsuQ*pz4MzM88Q6bMVshqDXE{DQ4$lO zG^O0OHc?u9W|SAISPg1lXCt>5L<7J8#KP>>`6kt4qhWI=ehvq|L^C`bMSP=#l=P6Z zI|ZSNd;#Cqm`Rw`oIC5z|Mgb<3MCqD!bC@D7nLgGPyD-T^if9${%gMyccXQTsVf#L z3@3#mY9NOK6iy+^{I;TQ{t{c@Q?(zYM zw$s|(6?!#aiDq0x<3Ts=ssu}@d^C!{g5GM*HZvx_@ZC3(AIvFNZ=apKj`{TuGK1y zhs;w>I`IBeY+5AW2NE;t#}qQl6OI%qxrar^ts}lYJ>)aL5HgwdFaH-_DMx>NE_9^R zzDV$@uGY&E@b~!cA2}QKHg^7#79UkNPRi4i4U1^yje9ZTpu45hRUJX-4i z!BG`n>yl-*;=<~Ic=m;tDs@|D{%@NkregCnj9C0ye%*9wzV7V&Tn8q_;&Ie8iy9mc z+sK@0ua7*weEnD2aB#8VO?0ntboK8o^e}(^=Zj3kD;1wMW!0I8Of;q52sLl=x&S=U zzKX2uaN(qoe}VqO;#Oo|+t5;ouX_Hh-Q%Z}H62 zn^Ded&!xudBW@*bKOndI-SyAu3g4OED;7x4ut@Ne%SglX#uvM;B`;WJhYPx@>@)@rw6BpDI@-0{{nSV!7FjRQ5oK9>r z?(1dGO(qA;!M|xU5!p*h4L{l1&vA8khe%s`N++6oyq3#gcCnJorEJ=iQZ>1pVj|qc zE)?VxU~NE!8}*(1k79cH6h4sD5`>)`yU84 zW^?s6{>z81JdV$dmKdSugFp7C@*C7o`0ECSIP!3}3AL|wDsbn!`Ii==22Vpwt@!*U%8Q9ybBE_J%()U?aH;7Q z8trmuhASMUvdGvr4&-t!M(&t&oEHaHNEqqGist*O0py=nRpwFDiRKe8YsPj3c_>*C zA9`@VeOAn57-;}O(0oat;jtLT<{^0Yb9xiMxH9UN5{b(<0%WQ0J-HaZ+1>|ifU4%D zi=Oyb^v!Xhz~%S&?TsfG80t~jXp^6xH}F_|(}*|wBJ97s$2cF+Rx~D5P4q=ZEQBzh zTPx;=SFd8;;5d}4my^(bA-YWxDr@1Ho%!SDz323WUa5N-uay~DeJLja9wm43^QbjF zb#4qh?O&$EeTk;Ed~yjdWuNjnFenm+R&6jHGFuued_$@%l6lPvLbWV4hFPCK&8bK<)lyQkW=OSTPn0OH+xxpHnY2(T8C->WF~&1yZv9;~*DF%{qBn5n%aos>*eFLfb*;PcQsmB ze*B2<>40B98ko*o!b3Q{Zx&u|UQ$MjZ?@3jjWZz_;Z&pUFwx?Ybj2y}%2iE7X05w% zxMAFGd20_{xuL~{)7oeV zV@j(}I-hKl=66hd1GzGlR z=~SfKqvTdE_>jK#BFlj{yO7mr6nlxw?)OM_cKGEBa&eJ6YYhGauRW80ygwGw$6#XW z8oA3%>MSycN5;U<*TW4)pQFy!t+N65OVxRG>5sCbym=1|-!`3(78a}Nks`YC^_d#d zhLx8+@v)KrX)uHWEn93L)*a~&Q}0Q8m1oHQu2_xht#E}C%DYo_Y2B)yQnn40+sFl2 z$X8fogw<>1yLHEGRROAu%V}O97S(fCuv)IH^y!ll4;F}i3hn+Jwlbsct21E*<86pU z`MXb!@v^*;0LK@_CGq2~&hljyF%pOI+iYFel}s>~|DpWy6|tTYoMkU}{W?8iFbhH# z5uv_d9EY4~^~^s=Epx{$;k(9JSN9`09Vd0#XBhLk2=ro2I_AC6aE{(Ky5KMAG@l!_ zx-h4MrHdX4f6XWk91-~1aoO}-bn*iza4FJenIp-*N;M=Ndn2_$N;F`Ld(;b+>(hxPKnV z(o?iTv(>Y8`kUt?R=~Co16y>*9|cmP2h{w;-SXy$bd3Lzil5hKDD$_sA_WQZ zfQnB#BXY*M%{78HG&UV*lz-*5k`z0WJfrdCtGL8W{bRtN;4Vd-kQBm^Q0a|rq`5Ex zRpk4Og>T5emxlhdR2WuZTd=Kc(K@T+K*f*lD52Rhu31bHk<(GDw^a9xi$dA_=V;fR z=p2LAmlWd$98vo7Ca$DW74civk6jpk&mZ$41ILe^_H78OR^JK?ZY+=tW#^9r)BKJaq zd#8kE31X|}PxNv!xb`HG;TG7x4t8w-;BG4s(C4z`{KG{Z*k74V`~em_R7iH$;1qvy(aj>t&5cUUyw`r9 zy?y;+%Mj!8rwV%^piqHqdCWZ7TQ1t_o4K1P0ORvTPa*cr|fparqm zD0i~f>`J?F=&;v;1TEB~h}NB*Opu}D%Tj)A1VQ5%+LsV6C&y{_a0$7Okvd@IM*JTazPWdvXoY|>qEpKd1#eo&`T&Kc_Q&|U;;oWd% z2zu344kTu2>~*VM6n$~pM+`+}OB?dQ`8n+sPDxw`)`JI4wy1A*Nb zEi+#{hsA;vuA9YS9VK0_`jt#vc}6oBr?fqo^Vg9}Cw1uw(Gt)zA3wFq7y%!{kG+X} zhqVCgA_bOfq~o4g#s|rO)W!=;Y5R?;DVi=OEK0f5A8VaKa}Yqzmt;uM%qxON_BnXV z#e5bA$IaTls-zQ#j!w&LYh0vvM!;%@?KEl5%G{}UkktRB{O1Mf)TQ%1zoj6(tYGHr zWIeM$*|BY`X@?r`!^+-Yb@i>Xwsw^0n6nG*Zmj8Co-gu;JwKIO4VTPOK|T@swyfC# z%3&<+cEegXQ)90Rrc>0L>GhjYbb&TqZfy7jZ2j)e2Zv}KidaM2?odovLxyd23&RM` z2&86iuWUwbIZlQ-&EY+QM(+HhxgqPsfM* zhtbRq+H`>Xh*o*n;#1?XIR|qx{-dcF+^j-`~(<*EkG0;PcI zTSv4UqIQrMyzQ8vF&+<#*pG;Jov9P~Vh&%H=0g8h=D_7${AGv(id8^vzvOE~4ag>I zXxb685=97YCr*sh%B;T7ku<>kA!7&NS=OT#C^JU6+lFR87lNz^+v*#jg8K}E3Szy40qxWj>^2DzFtra7OG{)?)Bx29f|8@KBp`FP?v_;9iDvlS1-RM z8nAS0;OX@SeXn^1Tz~q1=5zuHrs^6-*?fFat&81U{xnw}pS-k*HkPf_tKP^ZX9uI! z-l3JZ^wq*7btO+P0`G0#*Uovl?jD%0FW2C9Qj>V6yRXAyN(D|UCNF-$*8?blgw7!w zjZu4AtRg1X#!bW4IDOMXe49Kc%UQ6r>tS9ItCvZBwe+?7kdyIBWQXQjR=v^DYp>B* z#kFk%EoxaNfTg3e97*Q(aO1#tz36l%y}fCUMU>_XVu_7P19JfeAxO>q z35J<~3e_;e!Aj$vn^VoxXr}PZuOLCXi3Qvf1ig>9M@VaJCa?Rt9NB+`ocIzVYcfZA z@0S+`R3`?}e3z;zMp0bw!CDxkenQe|jFO>WdLXSV_*}MhZNaA?XuPGo5K+A_SQ=W0 zwkyy~NNTJW}{-~rU(_p!&hgmt35PJCH+XxFR z+ELQB$XYMOJ^$4>`}Fn%1xN4TP$Z7dkCOJ$^lg=e#mfUDCI0u1t z3~XbA&HdvsNvcdR9F?=`kvwF(apuX6jWD~Jlp_kcQYiS9`zQo>7ayiME@Vg&C3r5Q zL&Vd>7~drxb$ROAQGD3@6nvfPgX~L{c-4~sHdc|*W5|@cn}B^1W=Ve{g7fI2e$et`6_HVhgl!?e0zmd=WTsk6guYDvpaX@ zGT(#HeC)=f=CjdR!UdZT7u$!)ypz8cuLV&JexuTdrc7SquN4-;jQhq@Y#|2EKdkwB;E z_weA2I09O=4QN@2+$C4bify~;Bhhx|B0;oQ3qefBu_HIHbp%$~f`>$0Mn zI35_&M$$Hdq{5D(EOBODiRR0wt-EkRqd)4&IyaGygf?X-lXO;Gv@q^F26#LBb3Lg+ z+o=SXePdkUjt(IRVBNRr00`AFk+F*fe)paI`^ruXXY5C^I%BO>Oa|fiY+p|73E!^% z7&Y2uY(*2@jB+(H6S_{8@2OhBMNo~=uD6Y6s1HarB*oVQO>Tg^_6nAXgv=ok6^?BF z9p-4)Mm4#xYl!jIdi_k?-DF$}OM$O#h8o^?8zYSHloInctMXIKOs(^mF?xDdDu#C0 zW;otOL5;+FQgftG7{E3D)AZ7M>|#j|%o|+}d$bAqz+OZ{9_)*h=U6Uo-Pbb-}UxWv%-_bVt{r<`1mwm;EyEF?VgGi++n}h z@Hr`XGWwl^##E$u2Hlln8u_KD(-v$UJfdVJ1KIVZ6^>A&bK%=^U0yG7O_LqRM6o3k ztst}w7#_A*_K$9cpUg#G)17S(M=ylK16PCbrPs2A$8wGy#<@A-Yc{L`4QkuLgrN_& zfR8#({Dl204Bkcs#w|iYUmf%MhTw_31oF*bAXOm3fEx(b*mX;UOY2FW4zIso>bR?y zi}YLtqGUCD->)WOdLXSEgeTt?faQwo<$78garYCM{QBe^D@_l$vDz$~>Nm@w-fx%Z zjhWT-7+B)hLQ(|3jwzo=;`IvAwH)|D`~CQUDUVn_c=CjXwNfLOYu`a|pFm?Rt4F#c zN?jVio!HHLk<jjn;b9u$g!Q91iMVeyk6XIG zCK?b!F428)_mxt>AP-$x6@nVnb_tb=;~^E0nn}ccf-St!EelcfUN0G&#`(3!?X~6J z7n;QDdYELMO~J8Suy*yU6WM5MAifR6%k6QNvp8)G#Bcc&;W~3({?~g^2jq+J_4 zIdL%k+j$m&O;&n-lfW@vML8X^$Hm?&{(B05-FDZr7912}m;vXmG@xIZ@K`T4pt`uY z6qJ^BQwrWn-co{Oc6bz5>_0n$%q4=o~N7Kau??#(OoC7;eWt1L_{fow)JEjW78N#?tO#xG9j3Yz`1V~*`7_K%pHaB-O?U6wB$&h0{ zA|hfH^DZ_TAm5q^87M>FZk_fLM}@rigHFeCjH5)9dFT@tAbq{K^0>6pza{eFRdkz` z&^?*Do?av%9cqd_OEZ7|v>WR{P%$wv9Ty226B4kz4~>XBr5RiOM?O8BbNN0rNNpir zMv7*Ke89cEUU_p3Vh-E9a3YiVnBQU9WP((uQWU z%|`?X2O&|!eG~>IH1#Sbeo0N|>sc)K@W#m77(3`I&vfQVkDN*k?pf>!2ZG!NJ#T!H zS66qm`Ia)hTnqn{RK?;}k!~-aCDgCde!PWy+WPoJ!I92@$;R--6H-$_`clYfemuY* z?b3U!p0BUubicS<%_?T5F+!V68L|RA9?TOG^F0iBkLw)Eerma`-z2dqtOHe#Il;50WDbK)WObnSeM(;8dbts68X%%yWj@Ip4^8^5n6HvSp$o0 zD>zmm`CmeNmpo|hYP!Z4B?{h_bd1E73Rlb_PmdF zMgngyJmI{y`k7c!Z!3RgQZjk&$Avlsji=%eBrH6CYvCUY9&;Cru3R<6Jh!(;zDG45 zH_>ja48Hp!WOP`NAL6;k!e4C6GpfPAlp-p3oeUn;08+#jb+XAfo5(;}4qP|MPpMbK zuxO6t$UBeF5o{(YG8S@YxwLIX?<`Ia% zvM0Yg1R7=(JeRU1`5u0C4!mtSi!YBeLI!g6NiwW{MxsMhC8|G}(M6@fD73ooh1ABd z4vWXXBkz59r-3Lv*pL%7_D5-1*b~)#JsKNl#*?G1r%yE=HBZ!9hPcI&Fn}gz-d9Wq zreXx9h6|ExqiuLa=S$QQbuxU>)7+Yz(%oq zbQE!9Rk8sopbQ_59S%Cn89{Fd;bx(yI2E;!%(&eHPgI-i`y?%l`WBeUm6LHMH~|w> zC%IEYBO*MWZGe-_W+Jfmq8jE7nX)TtM0rYI!h|Z6c;4$w&}PxgzNhlnaEx7MsF_it zW>$?1L>Zk+E8~%>ZxNvmJ?dP|zDHqL`Ygqrl|`Uh`xrdC!f%?>0^BqcLE)j?EVbkY zXGQ9*Qr+Q*ECy_{G_tW`Xk>Ys?`~@w-$f8l815j&$^^0pOKOkNc zX}wi6YWKK)x7%l#nhmSz3m#@H1Od~+;+KvnRODN2!;MXl-*OY2zc6A^&_D#0 zRuOMy=1*Q#DgSqL%0`omJ)60tl`Tb-jQuJ~T_-4xa-n=xxs%(82&|79tsb`S$Hyi2xTV+_J# z>17+DIwGbqOVZJAsKuRa!la-{y^quP@Q#_akOKT|SbprlUf6lFsV8y}SZN&Q!xAT> zA0cl=L)4M(d1BjWF3rxvdH6omxRAP}mx#KhFPFALDSn0}KQ1qZ9IyBbq2)(aU5^6% zFh}F0!p|t$i0p*s(*q@T_;_LXI^8qBe40PIq*QtkRvZZUru1~J*;ZM=fGv|vCr>8B3GjQuM>c^;<>bl(BK!JabMX z0^+AZd=0hWKVl;qkBNsW{d_ap)M8gcqCr*IVcLQVaiB@L&Ra_wUC*s9&%&)~tPK59 z6(`c3P)e)N+3I+}A0zw{veQ=8q%dN5Zll?@Y@`X)07Bs6eq2mA1UDu%~O#x#(N7#b+z92Z$C*+-hVZ z_hPVhp*78%OK~UyXpTkRZ&5VcbT{$Qw3|r=RuHV!w@x&^M@3}S^!IKAb+Pay_IDjE z=5}}prq4(aZ|Jd5&zqN|9P{}>O##HrbU3^Uq+!oSjH#mAOkSIN-mul812I5B3$J4| z-IF8%AOzG+!5mna*)^@wV7ZtV2*l5CG8>|9ka~A%m;Js$|0?_h1bPSktNiwSsDVJqG@$Rv(!PaX1}%i z@=iJ3!6>PrLgM_MEkBwj4K8G^r3>lSQlv-swNy+Z-_qShu3*40A2O}lrs9S4MNo1F zY`8)tBwLi|W+&fGbHCq{uvS1u-)e7zg8F*DG#HIVafVpLnf0)snoB!qXKh3@;=k&6 z+!H#(KHf_u8~WybzB>J4E;1eL8liUHiSt5xgci~UrqMJ%takWo4PR`(~veCf1WXKpE;=@GhvU|i_uR?U~Y zLyg3XZq>I4Ipz|CLvFq*rpbNV_AsR~nEZ-TK&S?a1G zm7&XGwge)T<>}lk+?72UWB7f5b#lkzN|c8?lJ=>N)#40ET`jvx3~VlULp%J++A^3p z>fQ{hN)@!=%U7-l8~V1C^XDYI_Mz!3HpGU1)r+*>M1WNYC#>xlDXvR~j@{T&(=YPa zYqZIfpH!PO%7#jm3`)7q@0krm@SHEZO&71F zCGWPIu1mxI{7;SF{PRPk4%%t`&FuR1A4eqeoQ~&aD1h2k3lJ3uo#FrdZ>(Yk;>Uo1 zfWz-1)!iU$A%}o8X!HEWLFn$jX2;J^p&u>N&K8(zxp#qpvc1#}5%%x8)Y|Y~?WgL^ z+;5n6H>LKA<+?<28+G*c0}qG4>Rpm_D3-h?EYcR-w)?zeJeNM>D{{?;!+YZYN(uEU zjYkXpjT0Ha^cm_=4HC1kza`$KJgyzo0+(S1wBgXu%qs6k8A{xm1 zWL`A)q})hu1Qn|3na+2vfQ=mE0axhv-w!*HE8y6bWc=c!>XljGx(KP$z2CRX@?LQ% zd+$}~DQUG1m#;Vr3kz!i4L6XH$d$Jf9Rctp>AWn0f&Jt_say~DPHL>PU9PqTPw6@3 zwm{(PF7cOs6xF;l;O}^N7`eE#k9Ev0#LZ!1XGn4{luo8PC!u;bpz1goMA}!uuPc@i|%wK z1q9qGKOnmZj@nH`^2@<9r{(L(8=M`u==l;(`yP=-!<4l@d4j(awj+ZEc3RGdJApPz zmFF+lQ}P$k9zB5l2DGP^EO+n_+Gym`?C=4qqJ3A6AeOpkj5YC{j*5&f?iKrN7yPA) zi>iSNHE18PxCiM_bNZ0L&i1hGC}}c!CDVQvu`4PAy!G7u7Djr)~TR>1uQT%!; zXGZsbxl&jp0oL;o21~P7dm63Q@H#+IONabXWUcDO9hq?1Dady`oN(tXs{##wG{hG7 zP*mNEzQ~^=<>8D)<|@Ms6EI84bCfYZ+fspFg}d1p`i20xZZ$>;GnyGrv0c2~`{)^t zltzIt_9eqYws}a}AJ*0MP}_z3xT(*~zv;G6KI2kJPG2~efKfb7eJZQ9n3HmF zkSX?O_Lo}sbz*$N*QtByH@l_o7c|E+>3ha%kp4gqR8s8=e7-f;7fWUIb|eqU9Wd-N z+Y!4efqHDcc}l}B{!E4D;(&c<#*wK}wxEx*D3*UBQ5@`@DBnuHo7G>sq#w;eF~&&d z9~Mzqxj~88xrq_A`rZW}tA>5!6=tlWh|j{L9$cZ(v!7&{BK~6;|Dyz+=D4DwPTV?|m`P=|52#8zio0e(yWZ1T?|AFM1xxLG?DY6B-NZl#L3h7hhfh!b#?W;b)7m)^7s#%>V$KCbyApDpYxQbJ$i=NN`2~U z8ZO9jw&<-aLfUO=Hr#bw%|BwA2eE5wXbvvHt{I=J-g`I*<(@>Ge6NZ&&8Hy{Bx1Ge zAOcY_xPZ|fY*0@TRV@+ZxbcJ}h@dusZ%76$%uXxl z^&q^z#63xt$LR>NdE}BKlyCOBWFLJ)m4fX?lw%D=xMDU_>tuyaN0>6nw})P!R1wB; zfy3q@vA)7ro=)$R>HC-|;2|pmkiI6=9m7qXRN9)ca+ydo_H8U*zehb9@zqS4=%4ktu4;_C|^LkVZPn9)FtFBF4|`x8}I;j#768p)>Txs~{DvcC{&nev@d5SIaGms?NXSn$-|6FDNkA{lYp58Bml`ogpfiBONDbzp8BNZ#lLc4uOW^ZFS zmcn-VMM2UIyCd@r@&^Oq`F?fss|=BA5}61`?$%0s%p)lNx#hTH%^pyfl1Q zt`rxE5ATOjK2$pJO_CXtLI+^^Z>b9D`&UM}%5KpE9xa-Z71C+$RaYI`EeZIImIl&+ zc41vwO(>HoKLFh6p>;{t=j$Co>pcBs7R*vd3tLE{ypwTh7@>6paasA>; zXBY>Ex@N4S_-ci(NYorui=PI6M`#Mh+hIFke5%8*J#r)0VCg=ab;GuojtHYrCfOIH zy*lk|K-qmX;I$OAa^94I+8#;?0)*N{rxAWwzsLs+@dJRoD>tkbe&e;>CAw$`-lRZ~ zMMK=jf=e;lCZH6c?y7n(=r`qXI=Mgxt!iBo{(5c>IYiAPsmTg15w>u~Hc8Dhw!%gU z7tQ9r|Dvph&7Y*2bIh2^&(}tcrWbxd!>*u3=p9G#xiESuSF&cFhfeHUSo>`8upSO- zyDNo_!&JHW9d?$skvPj1N>+nkDx1JIg%BHB>Dyd|;pSp4U3@JeU3|$bO$&!VEk79s z@>-#Zr2`uRlHo>m?V~$nC?@30`gbN;aO;i14THBQUR~)hphiP~FoWaPO0;3IGL_7W z6M_y1$f%ZC@GpKtV}m_zvmSd^N8*nXK4OoFWhiwmfvX&g{TgbPR5b}j-?1fjUzW`5 z`=+1$EJtglJu z@xPU_%w27GL`b0qYw*`j(^(m@Yn$}EmKPm<-hB(feRk?%+V=li?#h_8S>iV)+yWee z3R<%1-QKkbJn{GM1yb*Vl>1OU7y*wD)uo80ZgB#y(>4N;=PpTHTwH;12#|9BALo_i z+c62+g`hX}MCB#l;7w4z;p!_wYxnRyMSzh;PezcNW@eEdO=X=m^4%QcdX8rn#!fy4 zUGflOhltn%Qp2FLYr4;sCY@f3MgU#vI#A3Q0ngZ?0A~T)YF${d3^jg@R(j1zzMZVV zmt$JtB-6r{*4@e(_Cf4EEQn8`~V;pm&G?WAHe8r5#lBW?e!2WoH9%>^hkVc=f z&juir^w2-`oa9Egt`s(`3xOEC5Fh7>DATi+inB zPw4fblCLlN>(nJdGjqmDJ}m2sdeM7=WL1=mxR;fUxQ|JU|9}=S9n1C6fTOjb)m6Ah z0KDSw&sC#d`n+|5-)6I2xAKXDH4m(>=M+kOkn5?cUxzi8kowYjY48E-)${E#T;kq< zo%qSes>6*YZP8@qhE(mLP2474w(mg+eAB%sHrPZv@5h_B*G1U~_l$o3{LX%o-Gz8L z;P{Q$>m#ZCDP?{S=4*??<^&mLH^bKS$C!RNAX60BPh)Jz$HHQGp-^pcfz!o@XZb@C>`NN<}<1ghOMzCs+oyZ!pk&NsnVAYj)&g%67(Uv@-#^->R zERf$yOd32~ePx-m1GrVX&AESyPzy_|lrjL+=ed_|te-geAwhmo`@ZPHXX@+w3ZC?j2n)Xd0Af?T*bmH1ElTun3j%NfK&a$oyqx$CR`<@bai-_p+SXBHOI zDmySNz{L!_J1dT~{-B);=k?z76VFJCMqZIyfha+_mb$4cChqg}=5QkE$j882Qw~>? zP5hH|;N;l9LKRe9Kj5pEs<7v^ai4G9cgS|@4rzh)O3G-MG?Dt%oYssZ9DMP%f^LoC z^MtQR$p*U;0(hpwLh$eNun{D)J6k!y5G%nfo@eD*_-K?>gY(22+!x2Z%J6h}!9j+z z8xlXZ|A>z0&b=%JUb+0wyycBQK=}W2-imar8T-$?Rl)s+DbhhtMTRBoLG}ld>eE#y zpGw#`h&YNEZE#lygkJB2onK$}Y`ZOe7`{Jk5xc_)68fAy2PoLUWk7B+925>`=XCS> z4wD+6U;^VfL(VwZ^Q6ZXwnpDwXB6P%9$|*?Q;qq+C}*d78cM9H)P#}lqCFdD=2Ir> z{7VtW5-go?`il-oGU+_xYy>$q~b5Z z{qKBJ1rF@V(5r$g@IfYtJ7v}ph_n*>AXJvzH2wh3y)r`;>SM5F^7n>Lq80*%5CD{R zv-C^jB$MM!(qnM+Lb&C;m4Z#a_(B(NtQXd6!W7LH`4bfYBq9!4=^2yD3^DOA&2D~IGrRtP>AaCuB1Z&`fVAlkBny17Hd%XThQpzC3XtGMPuvl~bK8S`mc4c-{PRLl|11{&Uc6IzEUc-@ z$GmU8w;`=BfCZ)xp@Pbf{tu=1cDH`#?UI$XVH9iU{K@7aF>F0!zwCo}XJKVK5g~>>$!SSi??PVG)){utF+UopK>B;tM5J7f7fcM9X5q8YV5?V!;0-hR{%Ufox*oIt7?*8RC8{D9_d!C6g-q7!&8UpfcF3t7!{GCV z4G#VGVuI^-DZ!t5|Byi$p`HUuyT0Q#UXek`Z%aDftw|{(fS?j%Fn_rF`8H0n2x}!Y zWuW{388R-J!>M&IGA|b$$qA7nF^|CSbX*kfGY(l(vnH^9Z(a)LrJww`_4eMGE(i8w zF^f-43ba(U5aEhtt_#aG>-g5rThTJP(YEPqC@6Cs(c7h1l)8bO0kUg@+pj;_sn0O> z?$?1;EoZI}4mffFl2Q=_8!D}v2i?BV7*#9EOwNE1-7(zzZ2-b2WC0o0oXf`eC8_NZz=vHPErnu0xZ z4v}yajIZ(2O=;{n=8JiCsD4JzHGWzPHoXia0;w6!Sp;6HPrP4D2lxsJiczzCvZ1v_ z=a*7!rC^9F4;gF_-c@-w_i>WfxeCX%qcP4ZE@ByN0|xPbGxCD)Xi*Wd)(@g=qM9@?Kl9yEyhl5rs)gk(0ues zGB@vC*zk0oT*Jl8zXt2)4I~!!`E-p~)jD=0{S1frshf{e!C$_JmHb6un=NGIB|rgX zPp|z{K})>!TsHd>2}ynQKkJk^&RFo79GP4=U#|aR1Ql@R#S}lM7OkPe!()TUP@b1s z4!^)d4yHsvY6!Onos(S}#|)>ypdndAtoR=ry^l$e{{H5Q{m% zAYDc8J$1E=kuTJ=O*_#R3B-GxM;##+(U7sfuMvDG&j1U$3QQRWT{Z?|IL#jdM4V|B zEO_1GL@myJ$h7fKH4n)SA#NLT^Bdz5&es7{Sg#yXif+xbFvVG=r6{K*CI(UiL8Q!{ zHFr(A5HZ&GD;#WCoLmqAi^#_6HIIllfJ#~$t)u>Rz@ju!+`gm$H(+?hToQ^Rhd|(3 zXg$BsU1Dm%tHjQ39MXsRJ}UeG;0oyjP<^!7ZKnlk+N-tjEGxj*%|})+gLMTqTa-aH z6%NuXVLU-Bee7~3t|9We+j?wohoS<hip!N{7N|$ z7P(+&M}owC3UagWEuHaG1tp50p2Gq&t^`2^J_~9P5MP8E)27K zD5t>i3XSm&zZ7J9Pb1!_#u6}yqM$c((W+}+Ug}8o)d{?`AsaJDU}J&Sizjqgoe6B< ziMH=^Wek0+*jUJ0%C;&c1}I(B$xv1{UGmh9^c5u ze>eACBj9}5HGo3dA8ynEOs1B~X!&R3_zTvlo#fAsh1ip`T&7#eFkl#!u{8Hi-r?N# z|29{;{BVRsQltH;Ivljl)c(;Fz8tBrK0v&}iyq}mdi+=dgMoLdeVJ*()#Dfg#0GNN zZxLIWFNw+#xf5*ux#?)|BY5#zwZg*9TW~K;<3@D=#0wnK~E?8tQ^Ke;7C|m5MlYdAX zMFdPU?)mw|MV%w`ZOcH?SuvXpk7!A_!QlgI7)JDh8=|J&sn$u@Bw4boeMi7pjlZ1r zWf?=Pz<`AqEN4=Y0@QU1C8^Y8*NLZE-GZS~6rQ~Voh2rYzo>xEuMzx^R3Tv$11L>N zH-W6h3f;N1pt1~8xDi#hRrd-C4mpPGnjl3wSvc`AbeJqHzF#>CupGr^h8Rm}S9gO& zI~*EI>TMwrWCukZ<_lc=7C|gtJ<^9JSZn)o))JPCKn5=8o0BLxTz?tM6y2EZt$B}Y z8BP!U9ZpT6bf8|~5fJ20*pkSKM0*8sNYGbY;TjsH>z<-H)T*CxuN1rG9r~Qgg0txr+upZCW1J-K%v@i6r zv}^eBh`DQ08B0`vXWeBw?PkDim*5GMGqkgP= zV=CMX4!w`@>Qh>+vRgJdZ~=-WUX4Ylu(Ous%+s}%4#ujwq$>_BR8BOkYgqEL0|YjO zVmpC^{k`uQqX9>TiriXJQwu$(&iUA;P_sWc0iY9Rr?|6Ai2PSWfMqFdknX1~D_imD z0HT8v0Z^Ut!(BB-hWk;%kP)Ud*IPn+o*?BRlNd+{x95v1?QO)!Z`2t> z;eLk?P-XbDsD@+x5V@;2`|eBHMwg?LQ)Akqp-yvZ-&6uswz1!wYBu*ri1* zlmytK4}-v2IHsTI(v$kLT3^3qWx)*mq*OCHpAJ6M%$DpUJ(zB4QAqo7Hu4VOvNW|2en;6_ zeXcw)Gqq#&`$D9uxwkC%hhctWlE*v`#nz3t^$3G~f^up@<+hkmk@&Owq2vF`E>AOk z$~@C*O{}qf%M);8-?7yYGoTpBG0!QrC8OuHZzl)Co6?Q5Bic<)Hn5Vj>>PSlufCb7 z702<1TJD+5DXbUJ^MkdWcx`3SHvTjR9+ zolJ87WkAS)m4(o;2 z3vTKYbb_&;eSN`CkWc`k>3m!SxOryXQ0KQegKwQg4Uyr73`HXxEod2aM4L}RWo)+R z$Ik@!*W%j%f|*>}7sAkcA>zhS-$GC@nn1a5(s7Q&M_R*8nB~Us2lc@&NDYLE+T7zE zT#RMGXD13XQVA=wJ$&h~KerZPdyLOETp})*L(iKiy0y)Kd604&QzsNSNkFwv?04EM zF`nYfFyIx_r#%yzI0m6fguPP((KCwN%jM86a2exgqUtitTE`s07ungv#G?13Ip;Mj zmmK^#cZF{UCMRT0)J*H$Nh4TdL-w9MBvon|Z@tWW%eGDp!*@arScdk65G^$$!$J_KN5>0M;Fqa;7at7n*K&$(egiSXWfw9Bov;_<5zk9nBHGj4p2B=BsCp zHRG|0Pl5(x62JNtwhxj=A6IijWiIPAnT{jo<~PRH8W*V(4bv~$Ey~NFnlus(^fpwp z?F}`e2>S1F_a;dt2KaV1teiS+b0!J;Gq}m<=M!VctnbimSuuGHRygD$I(tPY7=caa z|B6nLm>B*yMILWsjlo~DXOwQRUlxsSP=lWrzf5kOqVmQwxOm{RPRwmUL?+B#t!5zs zBb8BW<{8|V*^*&o*_w58Q}DKfED`w+L`6}fxj4>^hU5qLBzO(ALWs73h2 z=ZwkhKQPt9x@Ba;vFpyfh#R)A3-w=+D)MGv6L|dVh)1kcLf?1o7v}2Cz8}~t0btDH z|72?ax>Aw~Lz5Mg1z0o8N{vBrE!cYQ1{V-8YZYfGh8NM}1t30d*(j&g4Mo~M6$x>a0Kn25x) zC*Ll64j+h;>J*y1N#^)?B_J1CKz=TApYx7QE-JvJj-)aU$iv83MO8Dpd`(C&CAhsD zzepJj!ElNjdA7Q9J8c&Lq$|Qj%xX9G$2dj=nekG#v}uP{;2dT^asN~5v`(=NEd2dB z?~;GDHix>Bq=QP`MmfY3c(5EHUBZTu{;5xd6-J5F;@6n`gU?KgY2FV*hGJj{K@Ow* zhZHvGLH-|t7~pka{=UGae2$?IJa~uY^E!_(#3w%^W)>*mhu}A}y|8-~xOVcwvlHC8 z`MDE!GUztcVV}a3f{ZpY_g8Ne;Ww(uOt^pRikUW{=~ccVBW}ffYm4mB6b*!Sehs)4 zmOj6g9^xww+#$h?&Oe;$P}{x=jwgw1 zP1Ik1CUKWxfl;~su*v}`_7@is0IaB1Zpvj7j%j;1#}YvAFof3YucZ}ra$4jrTr*qi zq(WMNfY;|?+qME3S8gD8jONIhW$z5Fe!Xa38vNn(dIQbH={u%H6tbYjYbBEJNByni z7n=CRk?iS4k*$*-VxeZR#BG|Sbs4`uHd1(`i{d~2Jyxxi|6E@2f9Q-c9_E9 zjeTyS`Ah5QdzayfRs?@x!mau0WAE_bW8ns8C>j&zXD3Va!*LH){*FWA6d38W?P`$8 z=&S$Y)px;Cq2ZdRLwO6>rZ#iEWSc8tn(Z$ zejzv5>WjA)s^lRtPat{X7p$+FqN*Xw>Joxw6jBH4{Bl@=AAm15m06Z+-830s&bzzm zI;re5rNg}BV>TS-GJRAt2-T3q{@;!V<{|m@|FRr!EH-|`|BvHAR45Znhx&Iqr`Frm zK&0ZxG|q$m-*zGx*o^nkLwDeW$VLx8cSoZ?F88@lQHBflG6lFd0~3vjOSNW8M>z1b zl`qpOh@gai)$-PGE)Ib0b!=Oo7*2hkKN(;EK=)q+EC1Lt`carzx`kVu82RqQ&funF z1Lj|!xRXdjWiaH;|Ck~U5R*@W4FAlmmw9^EPa$u-6)8C+&fl(ie$Jcy+W5D&25~EL z0qu&V;Q|e?E1z-HeyrS>zXAz&1;ddjnUo#?bvPB8Ho{xAo{SbtNQxh7fHs_GPsCr2 zo<{cl)#OSl3X$wC>D0fIEA*klmfdp=4VBH==?zI`_^=6!1FxGcKNsH4qq`nJdkd3% z_VNY295k*2hW4e2_4=_DVv%TRD0Y1-gZUwvqX^+ZFkO1F`Hxe5Y3o!SF$?5ujVVO_ zFYk)Fze+!0g`1hUnJr@QUy+tc^QkNIeeyb>A?W(%e#H?``Ex%xhHGn2FOd17ikBc8 zVixpGRmnQqC$AMrnjs%_+ORmVfqK&T5y<_N3jU5ggB?!q*}@*`9ue@O7yE5R_;ejv zzi|d{MhV-bg0NB#uThViGV`+e*yuI8vIL6Lw6HaSa@4i>s-=&@a$b)!wa!XLqk>BK z_!XSC{E&cup<>x`&X#Hoenj*5jqs9%c8A)V8NFBBWzvG15pO-L71%ESIGjbrJ>pSt z3=Xq(rJW*BE{Zzt=nd1LYuFVs@}o*4S8 zeg&5IHr^WVJyc6oIfL(9s4&C=yr)&k(1MHmW|OLl7%GQtxic$E)By)H(Y^4r0hOOo zI+026Ms?!S9?qVLX|3l=N*&cin={N_1AL-h3J2OK)bEz<2&`g6IG!JFq0QtCX6R>D z?`W|HSMeFO{q1ZYtWZBG1%^!WJ9U23vbA{$H!a0ZX=r_D*PZ;}y$N3rn%3nApJrDh zXiN&&w&$}EYT37ee=`$&lL1q>Trc3Yi~*3{IPW)TP|I1qnP%{;XynmEP3v3hws`x0 z2To=*1%VI1WXk^IuFkifecY`doGPXgv&6t+R3z0Y##9@2`aT3R;Uq&=*?^zAuSLuQOz=enpB=9BfN<9#i9E=6hF>8UW6(BbAy|pBf)Hdg^EgGDcyw| zWG8HLD2g1?;+p+4T1W0=gXNUQtmu&iqA?bmCNZ2I{c3pAhWxPWMAGSE7I(|Z;Gcr& zx0&1icGzgVJN^ZhZ|aD-{m8uPUq#^4pZB)e001F`41-a}oIMwF-SQ9h><}kVwak`C z@ZR{=wUPlEyvTeq1w%L&f)}TMpoeN_5TIoT`TQ_l zHkaXmwk;GJCCm@7@S7nz_`h0^xAwH(Uq8x92Bx8A2Jz2*cc|8SO}2TPs~Z)~QES!b zVf$}9a^0%&DRmVS401;{=ir~t3T)VY}Nm&KO3KWc&O}5Pn$Tz8`w_TeeT#a53zHIrdNGrGS>rAO9=&9gbh677PxXfbVymoF~@FDl3Jd zh5xp!cj`Ym>dqKMWXp~4Q;*oHPX{d|)~{jPLO->mmki4hpB2 z!jAIJ`2_!R9vsZaQA}7?hT#?UPD+$Cng=MDmfe1Wt_m-ji8|9>`SNlmP0kKD>LwCT z&9TVvQY`IR?efZKZr!7`!xw`2fKg~u$bvIYUz60RLlhdWSv&uXAB=>D`=5RqXphuK z`2Kavyb=$KA^#76xXmqn1`sUB{|{wf9aqKLuB`}2N_R)!=4(Dq^l9*{Y{|$MPk7^ zf+*FwUFMYiDkL=RW#VbolSK*!gb!8725r&!-C!v~|2XwvSZoskOSmr5Q3C%5&zc6&{%8O5adsLlk|k~4YIhYxOnT`f)azik_esYh zpLL=&)c*;@6>Csq@I-n`#jGLBoF->;Q3}$#%v+XZy;`(mAo6{5Xn#7kOTL@`L(Z=; zJ*{#G;{^f(8QOmeFEAOU$T|WRBlrSd*no3TR9MYVPdh8Xm1x#;J@K^XtlRMF%-&TJ zOo2r93#Pai0}M+0rt%~b?T+@=I;C1Ck&3u*UrDURhC7^-uj{{!a}hY7=9;Mu z>ujg*S6dMDf-PsYa%X$KP3I~~iteJX8=6I?exORM@uc7OV4Xy%0Z<7rvr2`p&#?Yf(hP?o(Gio6xG8gEUqf>&>`Ld067}UF6*l?3c%scZhl$*QkR4p2r1{ zB#RChR1{nSaVk2EITqa3bL9v(V|RcCJ)S<-F&9BtIS$8CoAr|!>L$I(ACeDtkOS#I zJLk|qK=y-rV7cV{WUVU6bgKKKJ={+$8DclwO=Jjgoi%bLrrbL`c_%g2rz}#KM83B- zr)NV>MOg2#cE0V#MZRTZ7X2+vqkIfUgOqG=m>Nx-x)n9hfP}$4{C6Vz03_94Qjcky zXQf9AVC3C_)-PU_H|uGUsANJIuJEgKb?iN=$Br2b+uJsn?)iE8)U5!|Z8M&4n~6Zz z*hw~I7qovPqnI9_mBe#YpT3vLJrX`fT-m$<2WSsKh9)MEyP2L0fB5jz-meb+MZ0mF zOfNip?fb6B9PUF*%+meps2UYk%}pt@kK~QO*#XEHpw+}9gyw_AAO{u}9! z_1_GOwnf9att^_Fn#}X#OtH~Q@vQ!2a)TVF4lU7ci%Xt1z@at;M<2?IG@Gm@)RiM&FQ%^w3I3&lHO8 zic?+#33UHjw2XAcSFPCV+n@33Z!tPthDOUos^F|V4$rshzdifK4v?tn5{?+fLNvL( z&ZRdUqO}$hE_FyI4ohOm;6QS@j)0VZa2XLKO!lIS+E%(9Hz-uO<0W7PPR~T>n9;LM zb`VhcgRepa)4$cld60@&?ptG;XSFdJ4$Z5e>JRY!u$<_^%{>fpM-MK;2Kb|$G>Os2n(3o?XP~aXM99$`2|822 z)!{}2&kHCbfroa;U?$8EBhzhfvk=IONg}w0ip|P8)m>dzFUPU&-0azO8)La+SYy)u z9%7uoiOw)zlsnkRHF1T$WAB8A$+jF8NW;eg)*ZlvHPT?rUFOo__e6;{kOWK!1juk^ zD~l)Rl{ON^5~HlFzy{zZP*FdlZy(j2fc`y}19H}nYDgAm$e>b9X`KZ!K_kB1Ao&sg zP>D!ILyRiQ=0}|VIpGB5`T1K+z8spmX{1i|kpJtp3-tv&+5rYmWR@3CkA zGilFh!PEmKinZ;f=pJZ?2#J8DHjLOSq1dtv5cRYdS|{4;;DhSR%0wEH&%nfhA6cl5 z1L|Ah=fK4IPx6{Pav_P=+NuRJ73lv~2#22~_%&8kC~qkLs5fYOM8g)&7yM+JKiEE9 zl<51HkmIaGRv8$PIYNOY6|!)>72{v#DyWp!mx~}rlW9)tP1)6})K~q5(P~+r~Pz{FNju34o$3Bt@PIl%PpCFe}R7 z@@#4}Z=QH|h@RO=n$dY*n7v!?$}%NUk{8Jm0p5WtketLMdyQk;KhO;wFjrdr+Pk}X z!N6ziMB(a91I>)Y`do^h*mSufki&9AhO>Wuk>Qa8v-sV^`TdK?GO8|5)E;%v*ecB^ z5kjR@Y?0&|)|#Lx>A1Wamk*!WY5>2iqV53;`R&R?Mqw2m0ehnGDv0a&KiCjQ=Gu;o zxh}n$wfzD(($K{#sCb)d`fA}mmI@30wN~$g(Mj@(50ud&6PgUc&B9S&sW@3oIYS=( z?A~&9FUJHO)P91HqGs11s+5{uF8*8qX(sSA85l)w=AGGkjv*3EN7MU8no=B?#f>n5 z%zpoRx&;!tLnnbL-|e>|0rF(@Lbo6(DDYCR9b?kwJn3m24`u0=)2w(yUDrj*t28t9 zAq1P43YxaUh1Z%15J=mQLJpRSqsL3-Yc>(I1>D;EPlq}lsokAIrcz(zJC=)wTt}jQ zz_4_+YXxk|$V_oYf_DeQRIRyn!zaJ-mN0e2z zN)NcYxRfLyY$7~glM(wvaR8y@cYjO*P!2IaV*krN(prfjQ5ZOS7!3_LKNO*afF67F z*tm+XWk3K70CXtwpyGY&75ytP<;F2z40f(Uj{Tinf-i4m7uwJ{-crgSD{*r=uMiNd zF;}DUG5o>^uu$**JE6lI`fqv~R@;#>#iiB!vEKpBmR1rrYAvSn3kw8jGyv>F)iAj= z^^7AW%^ETum>_9!FRCh}{^d1VUnD>=5+~V&(9tn67N1??%r+b{=%aTo0Uk-XMQbAr zUS`P%`o;qqV-s$`XPE*9)sa#mGhyQx$Tc4937q>T1x&4prKP1!9?v!hXHcD|m3wT7 zg%}y11SV(9NG{ACpI^UtKl1gC;he&Vq!or_`ZAwph-^ z9WgGGe@8LSf_^L#&+u6d#(ZWFd*V*wCeZI1E-`w$TuK@!c*Ar&Hgy3Nv80xK5Dt-v z@ZDZsw9!hd3p0v&@W$H1>J1708&cfaDrr9C$;}-}L@ScQKuFdVz`sWqG~Wws1t1cW zup%HmO1T!pa~mP{%@I-GyJ5#6cZs0WUIsv7JKaYh{MJ^5k;3wsg2LS`5p1drnxX4I zM-@?>(&X44=koRrvNR`Z<-N>jB(&4#ubO)CaixeO?$An+d;IboaNsoTK8GNl_6f0A zMdW&)X1w(e5ixR4@2`%!9*?6be)%A)&@`3Qv-*xOnW5kffnEPAte7T8W+$2C^S+<4z8fu$)Res@G0#MCMn+c*M_g@%j*nfp{fw#+yuCNa5OX#I zW@jOx{GK37q#H0@sI7c8qQat&=AeIxE5yiv->D2m+4yVmjUDM6cbb+mAlQ|;LXDGQ zk#jI+r?E~5Ej+au0BjD}`=Tkk((chR0ODJc_*D6%n1D+YxA(-CXRyS7qdQXF#}R*1 zb6nji?F*@34+db6Bx754=lkxWE?*!aYiep}>ez$>al##(g6=BKNABuI;j(%eUOL{1l`a-sRjS*69 zIzU6+hjYw%i^T#w-4AfX|PswGh)GqOL;ujUD}&dg%l#A!r}S3<%@( z3iv}org3ZUu`F%llbFFE2gsHz)x7+)xLdx7*&XeT+_qf=Nt8 zHB+M&SC~=e)3y7EUTe>uz>PQWM;w>IXrg3e*xKRH*rJ4(w*SU-mE`zrowDK`jmKe3vPQ5z z#y7B=kpt>~>KWeE7tmpzCSa{64Y=q8dy^NsEDbdNW=>expP!LB)t{i!9@%hk2?h0S zj5`9%Oh3!_(vcjHWe4KiBMT1}Lb_TnatXM2k+9~cV-2WW1+wflI)vJa@GblrXB z2uZorzeV(DW8kw&YdXKYE|*Ma!$2xo+ammiHKO@VEdT{Kx0w*qf0j9i6@4F2#9loR z5ZH*cU}SvK!5zG{fFGgxM2Lg6rU3v(i4%?@Im!t^xP2V9gK<8fjA;Ij%ad*Vo?3bu zA27az8F;b{;Mv0zJ9RR_u+L<_GR3N8K$>l2*Sb(MnvnM(tzjGA|L@!bw+{fG8C_hx zRH~{u6JBW#!&@IV1qcmwTVE!!v_88GAq=zoE2CpkSJB#9#%<=UWPCyw6a_?|@64O@ zRxWe7vA~l|_ehQhmczLrPys)0a(}11?E}dW zZ~e{a-;Zj)HC6pXW-CM`DFn!D>YTXOfe$EjwbQ(5Fs%h=brtZr>FX&!oQPLg+6X)s z_Ys#zq?YE?wazM^zb@jRhfEgQy)yUZ;Ai?82S=O&{s<$>bI!2LcgVBK?a$OPeC4k( zi1{4ssvSntbc5rfU+E*AyugC*&*Q>#$V$$x*D?m_RNARM^Y2|u-I;>G$I{+sAKs3L zECN%~($qiL{-@)Kw_r`R8qzHoWg(Ei`eqv%i9uUcDkiw_IK|ZnuB_RB%DPtW2XT!o zWV{@S-10Q`*}rID?O+-hx^+E3E_1`t!;t}HMDhEvP4gzOa%5JP%HXG^zVFxI2HtKI z&kAu_23ywtJCIP6IoMj@FZY|0*v)wkRpCQaREA@{i7?V?y2KGjg}lwp_>d!@az&d~ z(Si^-LT1%7LlfNRAEk!0jz$htrYusD2YTJ%PhdWAeDLU)8yiQ#1oLViShq^|cT4x> z1dW`=4yl!06AFM#L@b%VZ*1=RL00qGnB9!Q5^#{uq!NAnI5vrEfjW)d+3!S^R-Z(yENSM3fB)15XNSFP7n~R zf6n3k|HjPOw!oX-Yzjk0xP15Km}F)UF@s9E;~U0aH=(7VWbSy_C@mbxSG24N!6+SE zqO(gDQw8tx?{MID@r40_rDgKM_WX>z0#`yEc(y4p=cjeooCK^<3eF*3$E_hMkjz)- zb@PezSQ*FvWm~_0ayP7Ol1)RMnK@O^k+m*6I*921G(?=2 zjW(?9{!cT+s>`u4vXzIeUk|5)=i8&q!1&IjXd3+P%=pH-$t-(<=C&o#yn*LxG;DK~ zd2-&?)h7&e@nqMhYteQ-7inPI#c&1h0~JRp!!Yv{Rj|vE*|{V;D`BrJ3d8+RPlw@S zA%&*fLKm=$M?`<6Ufa)%Q?J)zVq(q5jZ0srr~Q3@?fMR=Y3Pw}wzamZN(VUv0ZUAl z#H43WjOQ?8`k+}=rYC}R6Sn9Q)MIJJw_t28OG>zcC7LP^4Vn{e+L(j?27afSdbE6UZjx{FX<5R0M!&9y-iwb07#dkr+>qYE;THvUAFgB8x z0AA3ta64meV*OM$r^-9Y9Tsn8l0j#1hc!j7M;@nBv?jn05co?7`TV-b%4=_5RvWUk;J;dY0^C>>fs*%`9YPW7 zSWoTbH#Nn9!a`-Ia+Wucu#vEeY!hV(-Z?3naxz4O!63c4@J7KR-TZ z!z_$3e?}K6Caj&y{_MU3OoIBFYB-ekABF;02nCm=A8PEXJl8B*{y=H56u0C$^E5K| z+ob6ul2d2r`ZjK2gAV+k6#{5O>_L9SvButqYRX2WJ-U5>Y zdahOVw02V+^sC4vy0e+*5UW`Z3FKT^G7@jrYQ2JIU#je<`NrrPT;dr>w#&)J>O_ad z?Ra5Z48ZTHtZ~K^9m0N=p(Y{u~YJnj$Hdzt#!MVh&oJk8bg9&DZH%f2g(w zvaPOb{CbsQg|F_Fd=7b;n7F(JFTl+s@RbLI{t>Pf@%V)cm;g=}$ebM-{MHU^$HB#o z+aH7i5mdhZI6_$7F|VDw(Gi1|@{B>`QknH|p+ppTWqvDePY8FVmFNAVda$UCkByC; z*W?7Y{Ovb{d?8wOwK^3_(aUH5#oUp#uH~flaEpwp#ADauDca|flpA)Wd0sHYFK#;~ zPVw4eSknOgIf+S6Y~b6i8_5QAm0qGp~uU!9Wnc zeoa>Z%;p;8T_wJ#|NASd>3ugueN)rs-c%k9n6dOMK0R-f1>9BSB4>D-03%1rlJAJk zK&>_2oZa-YtEBn6Hg(P|AVXe2`@f<7B(>o^y2DMahrT+cJ4b!b#IBUM=ozv85Is&1l%BI9s-8XAK*I-VPq$FQFm4;#MBw+&P6iFIQ4E|t0x5kxlKfWjQ(83=L zq&F_Vppt~GpXzgGwBD>`HZIR@8|87Y&Q4MYJ1gK6=zM~<0l4eJCNUaBfg7LXjmr(? z2dy!H2P@pg&v6UyREu`b&f)i=iPhmQwpG ziz?t1sfY7$PNQ>w=d8BSpCBVpqoKp;MAA{e+pbpmX7!Sxx=#$Uta8d){u zBIGMiapuK;3pZllCP6-nFFsw3KRT+;UX!wj`ZRehXGfpDt`?&y{o`4w5(S;3!P}O1 z{t%V)f;3D~x3t~XREC!*7rkF>q|9Md0>#D>LYTOwpyxQfIg^%rE2PI12JqpOWm8jA z1KJ9Kx4cT7z}O(Svy-rC&8H2YQsRtm>v=ayp@zJQD(In&Y>|J+*nm0r48#d?c>DK? zl2`~WBpWnl1=y9o8v*r5e|SepXG1Eg1~~T^2~#7A{sP3K=(1DZh6%V~rS@7co{|oj z{|u7JB6LTRJ_;C>d9V9GhL?MdXw!A?fE4PXW@G6s%If`5o18Xwb;)5Qf7$ytZi_rPdu3JbGklkB*sYb4mVDiZ+wwG*OEHss}z3wLLJmrC^>~^yv+; zQvQqFZUK>*~>`NET)jVAmfiqq$ESr689OGM&OmF z$+Cr7GO~*)wI~_T!rFe}2l_C8Ky10FV_yxZni^>M{6yP${SXtsdISZidTMxBMV-T7 zUk8138fpfS!ZMWv=|XCffQBfm%fFImeYSXWod>Xiu8J|Bz-%BTEqI>|M|rOdfRl9D zH!uwhO}04xG?5gW{~)ys+jzzwFryk3mk=}vf0D|XS)ezf^JrT{8%QP>spCrJS5S%> zkebg2OMUf7$c51IVxUn`i<@wSiU|3VYYQ@>rRt&Nj;&bG2fb{?(+&*dZK(p3+0(Xp zbtgg(TMmxZ+|k&QCJa$AfejM>uZ+@&Sa+yo61x*!jM^z*%Ijcp)i1zL_<;L22(Cbe zdok$Jjq!d9@bU5X{ma!yPC(g@(4fQ2VGLFh9k6ej0o;H1EI)v*a9$jsh z4(RTFj0gi$FwhmSbcna6U3aht8R=q!f24EU!<3lh?V*>ck+qs-dvHbU{Rg-IVtzYl$<-+*H?mKUP zQRA`L$O`=3M~QHE;%V`3=nNV9GdDQJ0UX{*0n6Vw9_c){G^4CJ*g`LNwBOOQX^vfi z=W4jJGfPwce-WwhPAFM`Obknf^65HR{Lg8{Qic&pat`d9e_^CK>1Nm=*Pd*=+sKe>pFUUe{XCdh7 ze_0R_{C^2jv%!K?IR=t{3F*B~bgSfO{&FS4vjUtx!Co3bWXNBL0GjoGLIkX}*Nb(E zlRxlRtH70Y%%`3S>9W(#+MV?x-MOcXbaR3^IsdMHeSl&1lcU%PmZ>vWqx01o~PZE=~TBZD9KKyYy>I_X%Ia;UG0!@9R zON%R)wv@;yES4PSHjbSXUcAij7BAXPRPcsf*o)H(JwO6-_CGJ^Gf%$qx2ak^w+9H| z^j_JMS`XI7T$HlnB8xv7OjxDdfovtD8S!!_4!}bbEWr#V`JW}2Bs!+G$AJ4(Vz!&T zad}ad+wSws`=9#ZJ3kSmwD@2eq%2*5OWR3HrG;0n}sY#*+8^oyJ_Hy(ko5&(XDZt1-((nn-krcG@bndi~x+5=iom|`3+#oys-ebpi zjI|f*j`tARm_0_ldYs-?2wsEFQ!LhTsxO5rU}4<)Kal;9;J+dJv&NrARv9}iSG|qA-RoqMM(o#Wru*chQUGq#(f&~<{d;6r%k@06 zgXQp5s%HZ;eW6+H!zlr3gUAp)^~6x7Vwzl-&9mn=!*5ljqq65RMg-`l0xg* zgrpMI2h7?y0I#1JHer=--3LZ!wP2nFh(z%-B?b>-$Nop*D$a}AhjAuDBp}2v?C;Fk zcFG5~uo=IG}B0mj|au#*<@*$kXzPUE`z z)-{*Ur8rj;&p8kRdx~TD{bxfUm8njgX8^v8EVAt}GkAOXt8QWd9w`vFSW$qF9jXO1Pv=CKd-fJ)uCj` z&~`#qgVa*ZlFwj`ue0HvavxWvnO4B}aN)1g#Ux$AKD!kWelgX-FARrsTdml}E-a0m zqalw&;0t1YS{x;XL)fWU#y$EcHqs-&__-c1ekS%1_{1?APqCs1Q&2#Ra9k1{%JN(` zvEfL!Sl_#H?J&Y^y3u7h4V&|J#;dnenJY0%FSRAOlga%OPMxOc@i&tf_iD^xKJ^8#xmPHE1 zcu7t`CMo-InAhv}CsoH3kJC=XhxeAhdyxbqn%cMN0jA)+_3dAiE@l^*;3L*Jt2rYsYYR!91&fqd#12sE0c0oEsSaGnr4| zgIQ$j1^uOYA=gXt|}WVxa` zSTVOY+r)HBxn>*qaKySOST-WDKHskQw0M?c_|n`N4=msuS~`KArr|ybxJ1BG9lHdZ zgv&ydm@UhgiwhLh^GtN+XVOHr5ZpZlj5m)dhTQX$tbt#933<9@_25>q3d%cQ(>-Gk z01s>uQQfyKU|wddlt05xL7>I?B|~&GFx|#B{_VuGVn@-(VtyfjrIj&4S>zal0X|!h zC0`hUl^Oqj4(Y$_%-~&NSjxzFv$d3I5%aLH&g0yKkvL6}rRBe$9szd_4*XzmkpZ0& z-IV$)xu_oKvjwe$nvEdvSMhNFE1b2(v2C-5k~==G%u-#hct>|+miVzw25|kQ6wg!^ zJ`qQc0?a@&@hUKwsebwBDq96kgw;Ri{FO+iZqMd6O|Y=eF><4tyUj*50&*&jmrV-* zi_CR3*>eHXa*I@o7T_UKZSe$aIj(E~Z$Szi>YdB?JfqIkGidn0)z6o*tD3Sn5YuSu z&8M8gWb5DXR4Vd3efCo=Xgn2jLY`LyQQcyj8DT$fhZOSTJkSZqQmNaCY+{6|VZo~2 z9j~u8=Ay2QXgSeo#4L+nZWGq^3?O&qu?#L4SgOx635)n_X54J+b2Mq0uZ#d86CD>0 zi&ab9u3ebG-EVpE%mnZRGb=otGLt3f8Ox?<@QipmsY2e-t!7sfdU|{c%eTQX+u&Ya z4uV2#GRlFAMr_j3_k30+?IOxCGC|Cf%(#uiSp!=cWPUSA#Dc+dNXCmp{t(k?I^On` z4euk`oDY?C6RlhE*FJh1dN+q3C!Q~ecwkdGvH@8l?1pa%MiH^3_{>tzn1?Ne<(y})c| z+~`iwp=_h&3FmALc$0bk*M|B}OzP@gvc@dMHH}!?6i!GLrSb%v&T3GOq9%x3gA`Q} zE@5C=?G>*olB-&Bs%Rg*{*M;M;M$h;lu7LCwDWmj*%ZF~>%3?F;z^w$Mf$>%EfCW1 znFU6Mf<<$}UFpQ?Q3XqiuoWGWT#c?*tpk)lsu?{OyvBK~w^-+%q$AuikCT9OD`@aW z?625Mt9Qw<(|GNb-m_>5$Kr{LgCjMRM$jhP{P{JK(OkK1$=rW~LtQb&E*SAz8AF81 zlErczmK~N?v&F`UD5%*H(DV?qh0qo3?H^&bl&a|+D_=JEdrrPPR0OX)y>ltgF55G{ zB_JeD1-W#S&8$OWi$K83?GhNFzI6pcWn26o!DtUSqG(9;V`Ia|_ZNk@blUZjfb&lL zo1N%s*rKZ)r0=>4T^i%R*H)Lld{>&i`N_+{b82qoCU25ylsrtM`lC4B}fMyFKv}1=z7?CK1p_^Hik+z$i?MCs2poQ zVFxvB!qneh<`XS9%fp}+C%co57S6l&i~G)<^iyu93D9sx%SFqsp|j@htiwX8VMbw7 ziR>EQ$CKqyAmF`a`_>&ug=Ml?WW%_qzAKak`2%@R?T_c9BO;O?V@~s1TY2z#oF(1) za(y`18|$-AJFq(IU_GmTK?E7JK@{|U-$*P)`k}>tJht9kB^UrF!E~hZD{eU6euu!I zw_brkmAeOdYBo^Y$>A-It>zp|Q&_95F@t7U`x}=P523fiOA+TnT5OU%?0Y{QvzO)# zcG45sOFJT4%YS`og_K!>ba&N>EY;dYqNc3y=v_1}^m<;4c7>x?rBj9(8iS_RK`yDQg|#2TxP{N< zTC?PIwC8X1f2YehSnS4lxVtftY!!|%i1pi{dW#3dEDJG9goRd5%BQ4kGRX+T5SyT@ z9yKGGds`zGR@uU^@5koFkOm;f$x-dV5C_C4Ii43)_AS|dKxnWKp@jwhWiO%qb|bu( z#Y;L!Y1p2IV712hb+8s{9O)Jhd~Xtiz%l2{cI)h3^+efbEqgDIoSn*oMUWP%GR(X{ z+CD=3#tk8HKkx@}MkGgdXguaoMo}@3q~Eo$8=cQAyFd)zE5w6c^a+wHaONyM(neS? zoC45k_5~u&JfmYa05=kJG{dY6!2L*A((G@S!ljIPrr$Xg)0C%t=5dKBo)2)4Z$7FW zU3Pr@2_J!u27CZ;^_0C7$6~?9jYngafEmVbnV9ZhrgYKl(jH+DOyte!T?MM6Mvk)^(!^=!h)f9Sui&4J(u^Pb zhCMCzEE(g%GCdL!zU4`XvGZS%+uFHHNntD+y(_Pf?w3<}Xfbu`q#4HV3u!g7D3eam z5UfS%d^Br|JCwFv8`^Z3DO*g(UD15sA+&9-YWJmuJRrshxLe4=FvD=3Kc%(cr4Lov zj1#i=As)p-?JXIIRC{earhxY?$K^oqS_opJdTwn4>}-^3N!80%Jzq{5+~npBMo@Mu zG_zA8jZ-zo6T9{;QZL%I;r{{}$gx>*&F4D962^<=d zwf>_(A&0G6jY%VieE(yE2#xqTVn06kl9B6MSq>%?VsOd#v*w{Ac0|3ftWtB3Lu$R( zsS!fgeM=HWQ!Rad>70{SsUDhQ#nu3kk@jT8P+V!HYCWsQgN8waozhkR644=1J;-qu zZC@$$oCV_&#o8KLTPFiQ^^?cv5rwwZ>`ihq*N}M-k4yfz!2b3Z?ch8B->gBJQwxHu7H5z4Jh_U=` zm(#r6!=%f~iJKPhY}RJ7RyBG*;yCZ>m>#~*<*(sTZ5R`^ zn_*C;f61X4)xWx$-AX!lh&t!PqEFSXfp**V`oo!+W|uSRo7SFT8KM+;I^Eqa*RuAM za2<%#!(ZoeK(L-yriE^h%REWwgzM$wyo;@yg$?ORSN`mhL}wc(qvA0I2>E&;Rs(G; zoqNW+lJ|ZuZ?lTrJ~%c!Wd_NnkpFt#xVT*QK9m;L{nKib9g#fuHhPm0wS6w>?l^bW ze3!3ap+Z)sa>P&kD3jcD5fll-`RRt@X~W2LR-vM_-JkU{@=lB%$5<2nbo3 zcj2NkEKpw-ZCJZ94xX2LaR&HmZD-b03Vuibepc|nloXZX*~mzBbj(V_tT7WkCuHYV zKtF~1b4de>^GR+M-Xq`b;ZTx6yl4X|AcFeg5C-Du(h@pM;$9djtnJ)1$ zhEON zou`x3>%@Efv95$mD(!i*7`+|VAjDj|pKIFqrlL>)qcr3mk#vYz?4~MOe;2GCrr>egXuR#NLNCJO zYP@?5_)=pmBG9clBELrBF@tNuDWF>GoEeromm2^WsP{8j%V)JFWF(>{Lk2W%Z$7Vc zCK}^}+Ljjbnrl&KIOKX{gy@hT|VK%5h})9%6bb$XiPbft;si zJfpZ+?vgceqFfTyvqtZ!7$LPCQ{08Om4MmgU?6rcvvK`}P-3>xPIlX#lz}mbQ?$4o z#oIfQD!j^~M6#5#_|f?QQGqhw9uy2EgXqWUEXZL<%rGpCHP2U1xExY&VlO9=ZOSKm z{$VVY_fyIlyV!YeaVtxH8Y3RQ`?Wm2&kt4nlT3e+w4xshf;?}0AE(aTw!0nM&jvea zG|t}ciUk#k5$o*Qw*xoYW12g-Mc6~5_XF8^0SQ{kq?4FvHHE!s?*!B;<7d2NBhN=H z841<&Ce&@b4g=VDEr{m9IBC2JK$P@0tP zgdI?tC6p<_$6YG~QBI0TYKUZe*a6udpF^&h-ajC0jh;`w;cLq$PyukZ-1CUk1MP1v zY-O1=5`Ap0*$fP;M)vi(=l(>d+r>wF{!MTNbP*7A`fvTkgRl$tED!gU9$@+R4q){A z`U;AmB1=4=jBPAFj+ThG;dUM`zNe+Rdh7y@HKI_ak3pIL0~D@xModF^QP~Fdihk9f zRL9P#(>xWjT z>re=vGk%aC{ecXM|8XrZRTVFld64WeSHgINGdfl8%)9&{=V7wHM^f-RH2!CqcO7|s z*EmDL+i}Kb=}|yssx~IEhI?eYl1D;F9#6SGUpJ{(5uFrfj>n7A%7G} zN**UEi}XYIE5)~WM7r39gu{EW232`)kr;TYY>2uhBV@QNva;*bH$p;O zn#TG)oHpL6$0o86Ocjr>rIGbwV+n1$qsyz*%7)!bFa^wif@{rh^DVqRB&V1WXh839Zb_|L4U(j_1U?)k4ld5e;0jH9a)~@w=K7= z*9Z8adyEvG8`_lnOgx8;JI){Z7XrcYt5-PbK(iJ@%CEtNLuDe&$aTgTb?pp}??eLed_2sn9$_K$tSn>X-2m86Ex#lv}paqbt7a~U2x?U=>kx@jg zy+#6G$d|R99lch9ELi^e4{RyWd1ulGfx5DO>O!Ymc zs~VJUCKIwfwv*TU&RRx|+I)x~4d1sr0bP=_0VlHAl;;)<@g~~ts`ppjUj`ckFyZ-Z z-B|{O#3>yge>n>_-aGSg(+fx}7m}IgkM+oLG5%QXY*6Z~N)uib0+@!EW9w=^e%cXu z4%C?YY20vMcSZ580#-j7*ZPK&%Ot}2|ZpFAL z2PC+yDfRx@?4L-x2R8-4f$9PeQT}j9;XZ0ebF`+|~4o`ICs3$ED zc8{{-+{jZL)})yI!S5kB2gOqBCda?r-+mp-t3f~96k+%Ec@m^GBsO*HP_|v1(3$cD zjUmyB^&(FA+>mWaO!7BvrsCzFRC|Ocz?+dSLRfSU>UYTB;qS6Ht$i4)dEmaEymJNW z>P7$brm366oA)QnEpDftYvJ&7w-gWmHNH)k{uIEI3 zBg)>h7sa;n(@fz88Ya8>1d2A+vQIRs;hP%0J6LwcL6Q&%&DY3G7TiX4A~bmt z_Cqz(tR`x^srsC0%y)Y80@2@9n_-@Fc^5c|ieC{7kGfH;F_1m5|-P<-*{FTvs1(Dc*z4s7y0D7Q1QL5}2 z#Kzs%E_JOiP5UrM#9_jc9HG_$bfPd)$$6KxNfaCg@>Bc{mG5SN^y2wrP<(~4REHz# z+)iI;-mdMt{wtXdVy^;LCBG#J&OW6?6fBk~s+PNJQ3bty2(7xOtg}fxTKmuXYdm;Y znCMoL`=*`T{u3=07x3-b#zbBag5O2hSGe6On||IM-<-LAe_3HWxeV+Xd5_>zAkKeJ zRc@H%p=r8YZ|~Ho{WG-M=}9~@p*T=*dG{#WzJ|2J^vjiuDRG=t`4V-kmX%wUv6K}V zoIcJ|RE)!o>+a_YnX%(IeOih3Wqk*+p5#Oi_=p1+tIlj5!kU6F{wM@dF9-FXxR=8Y znMYSnVO7y(CYNVK+>RJ0diGI$3bBw*>^lNtUc6a$=e%C|hH3S>vrcN80ywo=kzv1A zuY(FGPljSi9pZ_Nct0M!Gc_$3;fU+-yfKkFqHsmG{T;kF7w9j+02In{q zw^+1UdwhC2xL=fYQYfX{Xm&dkoArapT<hbB zDEU{j>ks2Kb@=S%P6%2ap6c7B~J zKp@>?RzJPfBD!uRat3qo=Uo5i+l%OCzkfI4sd)7zy%hx@hbO#&iMgc+=> z4LR0I#R7Dq+`pi$0bdc`R9tn;tw{$My>Wp+PLF43eXMi$gCPAj?g+&26<3QNC(#UQ#>iU zc8Z?M{N;m2Rh-RFFOQuMDoS6rN_@k6?0QQ^aVRsKQ6qymJND&H%t>@i z=yq<#Z21qF^NMAy={(EV2;cLC83ILahEjZ+)vUw+>o0FKc%%i3spaZ3jv)#9t>NlrO zR{Of41$Va9%XQWuusyBLk-1&NMm?{w66w{s)x?);NCFwf4hpk}<2&Ot-i*yDqXt~L zig&waN=`~6lw|n(iD_(>%I&+!95r$R@aLo|jYDoP(f28q!6O9TW40SVC5lZs=dE^2 zLuT)L=bNlVIPPc#{ws8Sue1L0U&i4Wclg5)uWElvC0tOVZ*t2vW$<+Q(%yPcTmJ$$ zD^RBZZ+ZEG+NY%w$~!V#;o)kI?T#+Z2R2**Gra{o0j+%;+FccN_`bu+{nhogt*;SB zWlJk6C9Q$&LZIjONA#J>7Tm;r_2xtU@)pk*T-&*^$NXP|d2M|m>R72=RRi#&7bx-< z1a36_Xf<@BKqG2n`40>A1yJ;#NXk?NJo7HLPTv%@V^*npzo;r-{JhW0DDm6e6lXr* zx7KVdySK}$)sMz`Sg-}JugLX^32bjfgAlIb33H>~I7_zIVtnpEq>}s2Xh_?6&nC~U z)|UFUEHL5H=s%`CWQjP6K|dOc=1|1rNci!nGgLV*cRYvnr5>>U8o|)Gj24@Z&sh9XY?R zZZ?^*0;gCq;~R-@V#rP;5hEs&W_nGij&LY}rjao-%HR1BSfwPb6u#CBF5!|jJ|2Ic zpQu2nOK3h)37Y5!mQf%=KR&f+E&Yyo!;3JOq`FA~yxlBcft`sA-u2^^Qy)%g85!y= zn9whNommiAdI2h`?LWDpW(HK7w?D@#xnIGRH$UQIP=Xw=jIKmdI!C&&r7??jFtEsH z8(j9B1}S**4;6&_WIlZjw-GlN%Z<=nLY3J1@Dn!Ae&gc1Ra^RNqy~GSH<{Aha4l~f z)x{^z=8ui)53YLhQ*AP?ZXjYm>77DFP!0H#*?@34(C^P|Mt%fy|xA_$wm1Q@Gg@dt;R%*H$9OE}u~TVC=- z+ce3z|IR?aSU^KKcj_6$GSJjL?h-rGv-s39m7)-IiNHDpSwK$yMH}u1A z@OzL<@U)7K2R2da#VrxZ8%-tXf6GO}V3jZsBv#L-)VwN<(Bw{xVarJ&4cG#`+B@`s zs4Me&bqf(NJ2tBEz8|iJR!QKeibx+<&vu|wdp+&w*<+)ALo}(n?OKpZ<>hr*KU&mK z4e^}`A&BO;^p7It+mMfAecQ^M^4((ct7Wun8R!PRlS>Dcx;TnlP*SvP`z`&^k&WD?)vRXq7bJwMUR>>t4W0`}KRvLWxj; zvrD!zs{bOeZy4S#5uxk~wH0<@$W5`mCAQqq{eOJDby!s0`!{NUfOLbDbc1w*G)hZ% zcL}4?pmcY43W9WZcXtgPLwD!d!}EN9@t*gbf4HuJVP>zr*IxU+KearkW0es4LTVGD z2`ZqtzV_FQ5=8mIVj`ZBy^YV>jBD*2qA-1igvF&%Y1EjKwdTUyXM~cy{NcD_+eA(; zN75b8zm50B9)ZRg0HlLsJeqQIS>Pum_h-hBoG#h~0s5%~nY@Q8%i@d$4e!fkn$SjrvCz z06F_8DcczTzAjH6?X^2Lo(i1G920xbKpeF?hoh_?2h*Wg;^#u)ngvW;aN1-KYt*-S z=2vP{JDhCRnRp@+!t%JhyOyc)mHNdgpQTJo&46dMnoA82hULOR+Ru7-f;3ML0^62s zR8>aOCga0;af~`fA1fs&VC#!4by4-5p4O4<@Y!RJx+ke`0XRa^9>UY4xOS zfv=;jkY04pA{8)bhUEf~mqOQW8II^Uz5WZa*e7>u!@$+hxLetree|rJnsAL4qdr-- zT~&n40|Z_PTrDkNGaUKo+Tw|7d36mRF-ecoudbQcw#?sSZqj{VK0>K1`uOCvouuHe zpJy%OY?&9>nGag!_)i-5kRclu++FAaO_tychDt*sQ`(ypEJt$_VG!%@RKxR>0~c2P zSsHwLx*uTwisq_rom|$z;l_2V{A*dmQBr^}Vbz3kSF9WHMxpp};xP}EdVcQ`bCl#& z6E%E;OOb1&nRRCn!;Y066-?J0IN)Smp6Wj=2o8QZQ)_i&2yuqR$oE@U$HIV0Hv^4PZ>;;R#1>9uH?59nGf2R4CR`hJi!q41Ynu!OHTliG>&u( z|Muo~Qkdgic_iBhzpMAeEIq~;RIt})vUOG_nURPo;V-#%IWT4DiSyPf<+oSBkCJSQ zpEUJsVk>R@Lr8CDbVLhG0N_ldZ+sd=HaIAcrCD}Dvo(wBcE;1Q?GE-Lb<$*#x&Tm= z>>B;U+o7<=_eTA56(1bm<78gNqlrlL{Ng+6Zcd&TIcRlEVMYb2Yl`3v$wB1BaM^`; zL*az4AlE|-QS1XEt;Z!?w&Hdz%uOl$Log?{Jd&rf^9-lvc$B|an01fsK3F$wyp;Ga ze!TuF_+s|&6*7Ny>AK>++&%%f8{40Ii99TVKVbuUjxqOgnqR!GaSQ~Yz`ulM&Qp=- zs6F1}jg?V9?KUUeBwsex=7J;d6AQpg5qwias-SGJ4w?^*x1 zwFR}MI5hYuM~GLXg_d1M|7oaYZ%zp{3%LZyy8DFt&LGzYB_XB-0rBF)Na)9b02#8u z;f~+F;S&7C$~Tnm=vD#PNyQ?F>qNa>S?=ep`Y}T`cp5>yi~eY= z_7Q3rfWCuTP(F;a%x1aS{g58E-1jbxXW=e~*ma*pSw-cKbziTy;ixOxU#XFPXTGs- zrBlxP)%u^}r{KAm(a=}<2jy+r{z{tI#^C<|iOWcnGv_eUujaq9KEZI8S{hPEvny<2 z5bhjimGs>?%_2-rHtdv)vs#p|a%_n2GWtUY!n9;|5f=Jdw25D1p6n|Vx!bU)Zj$t zN;~alvoIN_|J>@-9n`si6Yp(q2P1b`9>S9fC_a9h?9uAv^Ay~%bvh)mxxURk(CPDr zyK?#L;#a;w4h)xFX@v>W%+Hl5RI2S2H<*Gw3%q!@O!UsnDjE<&q)X2CX#+EFxa6~W zBe=io)+f&t4*sRjN8Y(@st#cg((we$omsgGOKe;w{aD|=eKXD#$hnR@iUfouSMDGx zgY?4EtHDjl!9Qul8ut`CFLjlq07&K~ewy=A|3O&Vam^f><;y!NBKZv?kdnx}d73CW zqkNsQ;$Bo_(OWdb#J}ak0Sd*%Cj7j$4YM<@Ad-{=;`T$5xLPpzbG zCQUYBsYuBSVW}<{lhZ?Sq>gh2-KUIB=W%s-cq|fjZQ z2;bnyn^jS{;sX|g1dwk$?ho1hAPKUlv`%s>-ZTy@9KCP+~ND+giQe!f882S!FpowY3jhFhu=q;cKT(Dp9RZh5=ANOaspbD^q9(N=o(Q{ zsmre6$~=DucdO zx=Ln+lYH)rOZqmfg{koVQ`V6q1>TBR?&OmS3It#7y!(M&644}@auG}MQqh_qgn0G5 zy9xxj?!d#XcEciJ^SXn`ua3<;pA_H9mP$I!!!4qS zE3u8~|7?2!3HYPRI*=)!}HT+Lm3%&KSRWUw!mr+qe(&7 zL#-DEfoF_anlQ40wAs$sFnLTPGM_CagA-`mymx;fRbOUz9~5bO{R--Q@x|(fY(p#= z#Z~C%)Q{MV<{oJ>p9m4Zf225^L^iW((_Z7e*d&-@m9=jvKVtQz)Cit)#5s4c<*F5w zpqoq^B=z;CRK7JL%<^9 zTuBAJKitkrBKN@(1f)n2WhOIC>J_G;R*vUH3UVZhr)Xak{;Or7rW?usQ!K6{$u_T@ zyBQF*g)$kK@%HqpGGlDsl}ePlFy(&ATunf+7`Zx&wK>TIk0s!e<#)l$XJ*&oGmaQV z5U0au1WVES$Ba|&dn$p8{2e>-X!DVur#gzWb#pwd;c3NTIdx9JyvbJ>L>K9f(5bz$ zUFpZBFE#9ngA%PZu}y1lk#@{iOXV)igS=%j5-bjt<6U}uE|n~#J|6{#$hX;Z}49p zlCx8LtlBly3a?6BesvG1?+q2Y6$r*(St-LS2J4qE#EEcCG)d}I`$ zIabizJ*Uo?YaB;>icU0&Vy(~6>mBl2T_-NX?)wm#6Y;9FJ!aaWao8lSn?Nh#hr4CQ(!E>|BN zmvU*3OGjnK1{Mu7JA+G4>paUtla>6UsjgmdrF*07xlzShyFA-& zFYh86pLk}ItJG!(YsQ3&XJL~zW=QGC6yPIR>tHYm$mN-2Ei^oorhli*Ahf?wgF2BX zug1bUef)$@#29BiJ6A=uD%SS#X8bk&C+S0bVie z<)CIf@=FO8+{?PRm>@y`F~R4POY>8Dlh(<^RgT!S@N=$0Ea#xT$?EV}wFqets^yC) z)8BrSZEfHCx+tPQ@gUkS-Tews_w~-&J5UxkW7ICV`=>N|u2_a_e+>qvj0k+9f|UHU z+h3i9fImuk^+3ZBP(b=ORR}v&t4W(lE0zCjhL;v)Jp1>leCqsm%$n)f0ZZ$YqwC^! z6(!t%ifFmC94~g!uT@}5whsWVJLGKA08=GxFe&7Dpvhb!i>SG*cu|2TTzu&aW^t-#?EHYOTPRzU&lJ{^azqRr_GsYraU z%pGFO6(2(>V54~Kr>?seAZqX?2V}cxW6GuRu_5QNu7D8*P;&5C;CRhDUos5pw9wS$ zg+tdKc+%|5C-BYe*$%eTW%sng0_Xx4j2i-cwQZvRo-O`Y*9yPsYW??2jXt@v`7YJk z(haUw^tM`cLpUjGC9?H6h10$+PIeK%D{3CJamdLti4dd&+*FtdtXJ>^!(RzRbP_>SKk86F(U$K)v z$1{J>H3C|z@TFIHO_rCia$5#%U+!Mf zus+$^evwaqFUkm^8k(qBpKP(Gon}7W)!nKb1t)XS_)k(5DSU{y&oZ@^J9G+R{|&pv-<0;-L@QFgy0>l8*~N=m z&=-nZF}jLiwH#HP3u;?>6H{-mbtAlao{^XLZVKZQZ(PPD1^JpS0;kUwsjp~equC)e zWl5U3X~XTXKva*A$?NE_;iwzn-hzD*ap{h@B~<_N+fgUI-JskylAVQEiZq+qo)oB_ za}l(F(M2Rqe@UO%?{}s((WSv{bdxiGk4r`ijgyTYnNoj}I{qTf_nW<_b=yOYSzPq! zgWrOciuQze@uRAB>D$21G4X#gsGe)-veqHp(D`~nB&2#;L592fkn6 zgs4K;yHNNMo5W4}5IWV^`B4~M0R zkx#GF&ITiN--hDjteyBDc3dr;k-DwOF!MHEEvRd2LJ3pA2BM+fG_FEIRgOSsufMy5^oW;E;Q*GZ-y%l__>s8J#$e3?xeSD%G<)sg^WJ2$21ugPe< z2D4AFEgwEx?4kTFsPvmD?5&vM8)9kr;RnxuN_2bw*3)eLw{0{B_NV7Pu=J!midtI1 z&{&V!i)k&OHehc0#?KrTbDvfV)f}wjIGeos1tOj=H=W+^%Y01b*8!2~zc|lPA&<=O5S1ZaZEzE}*T$2CR{9I>_<^4=`Mf zPw5}d!tkKR59%5>bngMdup^0-B~kbjr?TG&{_hsn&Nj+FOA7T*36%0Zdgt!?M%`tB zjAY!7cpj0%Qb4d8$fE}&11$H_Ipjsu+bKYse?}*_oA@Gnjv>bmX)`ebw6MF&9FHgT#1A z0U6-B_8^ZkS7ucU)eWLd^U8+g=PN{8v?BZ`7tOqWg{^b}IgyAutn`@sN?h z&&~K<_H>PYWwso{-MvC}Jx2`=@f%dx69u%eSE9Na;*a7aklqK}5L4_4YF^!y8_$ z(KSK41XR>+=8nTB$)U3qo)KO%k9zb9Rj###EXZ)mFOBP$)q-oet2=yUw(DeW$0FF& zJ~?gwQ9v+t)lP`>af(?ws{V~^YiRld=jB?7{aJ@zdvT%kVwe1I;S+xj=4A^K}5css4{xJQhALX*gk(39rw7nBw{gIdwuyq^GB&nj7w+a+pvlz zGr518r!UN?s1na=&-`m-PaiT05-cdo5GXQhX0`_;>WC;4_ zuc!VVkK>5*i3ZOO9^mZ`y$@H*;RLp|FK6^T-7`M9sHw%zdqPnlpdXo#s{QUf@gR}G}eiS0!jkiJ~S?y_1SCDZGVeOgie#0Ne zNfbA;=zdxFM5%k=S=SDTK!Vo8_~e}Tp*EA+(|-Cgn+48I1XFc(7_L0=x z%DE~DEX4st;^#v&#yU^uBXJdMdNr~%`_9s}_|fam%U-0nb1ha)*WOnXOYHd5qk`Xb zmWe)X97?7BLBuIGtDGx@`4uNI|MsNuGR~O~3)YT)Yz7;B1Y;i_6{Mc04 z|Kc7I|5wdT(ReVC{VDM~m-*nFtUO{$%8PA9MOk_Gz=m<_XYW%Q^R#NNn<4oX)ZUa) z-t%c`q^3oy1yVSU%|o#(f6YcqP2_pI*)ysd+pBdXM2b=kGUTiA!NU0;{SpuHNXw5$ zWs1=_`Jm|N%&Epb2^X zkh0ypYK1kqynfwMnTrRHDXkg$v=N_b8sr-MBhTJi9OWNJ6ZYjwY&lNM^dIwX8q#st z>tKwsF>S&8xST_A(LWFpfQ8qosgb!j{>oP%P?H7680t=!B4Z(1GT&3tHvL(-nv>@a z*w5q5_K%0fd~@x!z+`oTA5**c2%h>pa*uRcJi?oB*AvX1P~FbGchPpq2_iTWLa`0T z_@aOWP&w-Gk^^muAUSi)#^E}A^`%OzJuYgo{^_B;vPz4(=r#D{vy>)cl@3Bc{ck^3 zN%Xp6n&(kf%51JtHMXa(@>>&eH|<@C*o_3UO{x;a#lFEOwkXkm+B@8E_4irK^%q-Q z$)8m(_Q0$0H81Gn@xRaaW0N`(b27RqSDn4rgnYV@b7jG;k$O~JJiy(Y4I=r+?I!&% ze2dmRC`|WxY;+Gk=u#7V<~*aY1)Jb6T{Z?ljBf)4AW~&DFV7d!S9t(xd;bq=tEe9O zTQvhzQCKjFrWRyEQ-hO4LtR}r@kgsOQ$Ge%*&{+I5Pp+y)pBuoJTYHEc&HbI@xvB@ zmavgDE}r|9Y{JW(6fNiEFOuW0t34_f5Gf7K&srI4<&*~%kY3l%e0IsjDeAdQZCKR) z3KMaD+7-yGOeUc7cFwbyZU8{KsU*2+MFu$SJGXEorFgt-^do7v313#r!Q^#>Y?^D< z6CEB3Zw4hSHe<;SgmS`Rtj>17yg>&Yq6I{D2tqq;d-11t`viXh&v|+_p@x``T-OWD z$v^KmS7gw2OgJ;yp8X^A$%6>>Wy^H-2bg(O#n~5TArkY`=uh7NrjkjIcD%0}F z(vLuve=l_*K_e7M@oQV3kNOuRE<(ic-!9cfK-&<)W8Vo2=GS%%KI75l^U17Y#0v-( zG_WvyiBaZs6e~O~LJ93T`_rS~O{@sps)uQ3_l0HtRpl$%(yTm_eyBgx*bM{e!OHSW0hxZoj>l1Q47NdJt|^T}59*EY zT}G7U-9yEdDdX3J%DQnbjBJsT`3^b+vN4yq zFJj421VG>(u!ajy%t4^IwsOhBt1)Zg&Hm9Z5GN(#;Peb50=NzJL0DvLQcMJ<1p(fT zHW4F4I2+%LQvQ_$DNTiXA!bqvY)4X6A)lSX``}FDU-c>{b=rUwCvK_Sa&r2jP88Y5 zMtZc)Nwl&~@7W#|Llj0HP|$c|()37lzxl7`hOFRooPLI3%v-L|)Ah4`K&HcPCmcNr ziaG^jMBzv3a%DK3bm6{UmZS!)Y*AfQBd|`6Z|^uj#)^7wPhk)FS;C#ozeBPqUC#d^ z{v2#TsnG`{@8BNt5+OMYPTd}2s}#aoz+VxwO@2eu9RVuJesi&CzA8{4*b9rp`rjPy!hBI z1=eh+lc`k_sNU{O^uA07G&f7cz#@^v)R|#d1uoG&9d~ygOQJgfsCx&wZ;E#dA!(V@ zC!qL)R2H$9-mka_WW}ZXkYCpm{o?zu&FF%0k%AV*$W*^g26n$%ELK1ih0&9jM_oEg zyP}b2E&nMg0z;Wl<`&EXqc|jchWaU`j8JQkSb$3h2W8GnEYec%)AD%GG^50P`@@Nf{%7uK zt^bl5O#|G(NOc=g(jNfg((R&9PaH5yXDm9chuX?d0Le5{X}*2a3#wEtTwx)!l6}as z@bfshpQXeBUPJ%WdMjl_Qx=x+cUVS$!WbcQ=dGWdaMwyTb9dsbza|&LRUJJ(IyBXh zYXO5s%SGPic;xaOdR_aN?YO2S4rS~Woi37>uw8~P6i(Re}nKGH)hdLkNy6f zS-yHbx1sS@7T!f)xqd>$DP%jkgaEc9f1Vwif^E60G-Hiku|u0hg$~?J>3(`8m;O;j z%qP+hH$5L0yl5mAz=mQnyf85&+m4^I@1dpUBl_knJa3JUvH$$MCeY97wH4JYy)%#U z*va+fUZl8bvJIYQ?&@Z=g#FCA6~q5@e>Pn4^dXFpXKkLqu5s1Yaewv~B6FjHiS(8) zu5N3k#f0+UdUe&_NiH@r-IkKs7nztan<5&%qc`(Dk%Me~Z~O#Ab@aCP3Vix7 zdx!{_>7CtSmqyaPxk@0zi&m^%8yA7Wlen5Y)t`)o6fkD|kfO2r8@Nji+^rv4SBF zmxW29N7=1+7m<@1CZXGUwP1Y$S3MU%UdJ_zMK7FXR5{xTu5cGNuuC^LEPg|Ddtd*g z_uv^*`GEzpZ}xUQDa_|5;5_?u26LLBCDEe7KQAcyqw=_XRi15KGaq4|SA;FTwSLb$LzuUwczEC%fZN#*CgG5 z*sA>wt`8OnS@^&bp9ia8JZ>+tAA(R#>953?m@@rk2*G-Q)J$xYwa;LH`fi@E7O8^R z^bhg5RRcqC)kcUl!-7tr>O!#u zMk0mn_VMHpo{j3Rri_>%YbGoY(vqq|0@YL0@HpXb!I^w21vH%6*@zx|j2UN%MG|1UG&UHTAr54ZNudQSAXXZQi^=X4B z5nQQd=cpi?bu~}#5ss-v#jnHA2~nib^-v%yrIcrkxWeYsK}eW;LT!xN7D(mC5baM|p!tv{IsRArl z?T(xVM^k#O$5v_~SRj-h_XkpC?t0l^9*yd|LB3``i*zK{o}j0vm0$u0=J)Twa-e2G z3k+cBjG-0+kKR9;PCM82^mG;R|GNJ;CjJ&`P%-{oJ1(;$zmzvyS;qB5;}Y8KT&}_k z_H$hQ>xseQ2y<1%*mbH3!1T}8gW^sG&^o>i1XNmUqr;>Zr^otYy|RfqK|#wK_O%ea z_cK~}kKfpeeUmc&y~{Z!C=TT(1Z{3_aihPnF>!Kp2i%-N8cd*97f3=e3gWRL+XY)F zV}U40pnWjmI~UEa{odej9j+VQa1KqrtMXjy4mOsRde!qVsgl*ENu3WC^Le4qgc4~^ zDbUjA{EXOR1Vjk`b8-34*FNWR0D5TggoNbdLJf?6ntCagwIH4w*rjU9=TQMXbpljt z`p+MO(Eiiv!_$g@VHNI!iF&JBTG9dLIO_EmWTVTxWcxZnj(_g(>=G**jH^70^lA~U z7vl5B&<(`Ge?dRVxbZz=qD&HdpH44DNKB!|ZI-HE^@|r8#Gk~3l}W&Wq_dCck6574 zV#vV7pD~X)OU!S??mAY{wL-FYmDo`U(YJc82ONa1`(?$s^`1rmuIk13_nhm^%>R20 ziQiN0m})bm3xFJq_*Q)|XUU<^K!klTzg-g$>ys&@s{|yxeC(~l@%ul&4_0@Bim zQvmNtEl_90I8yvG6%ye?BnD5WV0i~d)XL-AtLn>DgXvf#7WQD z!tpT(^Z`=mPumKZP~!l__6^Hc-1Azd?)(_&k+Ei|t^M*`NSFi2tx4Z#G%E%SMp_nK zWd+pQXVoPz*UJFL34izNjCdxt0JSmdpG2gh9VZjv>64twxlc_pu)#r;lj zXWH6#BGe6(UpavY1_YZm08_n>-dX#F$+LJ#qae#z#CU;YP>#>6C|Pm zPz|F+;mfZ?!d)3Xc`twU{}klj5lGI|e9s>aNmpt^hsho4?jmtRLA3*o*9e3_*4iV{ zL{6obI<@89k#DsCWHEn$Qs9Dy_K#$EkR`_1RRKnaz+&Sgk2_1H3gy=A)E(lN*{#>z z&sMKbS|a_G)oprl_WUnzeDizoz{C3v|5rlwkM6>M2vx)P(|&Yk+PJ)^kFVtfE|gP# z%pJ^TYtNCT&LH;&cPKT514|C;T3}DvdL`-_8>W5HgF;hGg*phU#N73> zNy{!FwvQfw920_SYsNI^t=6xpu=@nTVgve!(Dc1A@~7ajjH~z}_;141X-_ZjJ0y=f z^E{3TJ+89l*JXOBJ#5}JrSDu-H*GgNdlS^ykBQ^10zBjoUrju+YZn)nn5#nr{w>k;obP;d_)XjMw=X4b3n(9fvklOga!~ICP_0Se$1O)b& zw>+}ZMl958mI$Q=+^8aQG~%KqXD{aeOB3i_f(#^ieAI4L&i;eF4QA-ie>bH$6*Da6 z`<4pbLQo&@ztNZW7tQFJekJgEW-Wi`ArgJBio3rw60^p=rN=e;wO1@*qeJrM%_7$8 ziqyKz+_)by7Md?F`$DimEFizPris!_budc5W!ltQZdKUXxo0GQLff_k-tTlcOxpRE zfXHZ{<*p$4YmvB4s>4`S?M{IY1K))qb+OAKQcbXc4QFxv&OCa%O<2(aaQRQgY`e7O z5#Q0PniS2D8Hv46LCWYN`n;{Kl1$D<9z~Jn1)qSry>CUN`R>o)zu1u#$jxa3N*}&0 zd8Q9jVTp`(UNJ~e^Sf`uH;3^~-qNF3nlWwv4{ac(ivqJK!Gd*%tcvD6iFLP1t)!oX z%U$1BHBhg`c&Umbd@gVL32DAA{>4Rk`1SpTI6+pjCvocqwI__DA)o5Q)Sv6o1Ivib zB|C#vzNKGm!`!dU(r(1>JI@RkgofJzRkQtJ9mH^0RtUr|Bzo2$=&iSo&n)_)s;cU` zU#;0o%dUxIl;UArx^5JiG^f{I@AI%P;OI7zmg`D^NBuV0Nn+h~4{AJ>064?GYpyb%XxqB*|?QZiwQrykn|8iqh)-3`1(yk_Qn7 zrMee#oC9H`>U3b&t{d;uEB2nJm+srl@$L+e@&csP;0uKrgPiN_jmVa^A~=r#c>|^- z&l^IIZ$lbkN2G3w|b0ela{|OASryEgmeIe2E-GQ(A z#h%@Yj#EQ&8tR5-BuEOVO?ZX>rC4F@-00xHDxN?M-2OIS0tYLVAZ)=gsG$yL9 zv&Ua4ZKwL3?~T@-;`-YmO1ylj{9vaAD*$k+fOK{4`IZgCh1f{sm8gwtno1F1ICYR? zb}+v#CCWZ$sw3BFI@4R&++!@SWV-_Usz0FpE;(iPi$aMtxB2q<4`5%~?kUE~>*<)Y z6ZIyyCjvjvVTw#MNc!ak9V-cBQ*sb3-F#!YWQhdLsl~^y7HAlZ*zyPJt#)7iNvq3U z?#X7EGO9TsQ5gZVLV%4Wd!2>cu1kZ^MWm`rQRC0yr6*Fnf{SBG6aJh6zq8bJzfieK zq*e-xf^!q%Ty~-)<#tuv<8M^E?)l7XSh&DDBIBcd?DjDcQH{lrKf7Jcw4alvlY~U| z&oOGl`TB657C>b(qmZ5Q)?-*QRi@VEWFz0b^b0bcI^ zG#9$BD;oqr0@v+)D%1RI7UL9ZgMqR+t{BfHkkF|$XnT}&hDtu|Z{v>ADHt@uV}iU6 zn8S;kPPz$-1%Rz-Y5_@|O11HSJF#uG8i@5Y$1)6W3;-p6f}neSP+~9tZ>Gs4`j2t! z*=`D|MCX3($bV0fe?@QJB@eL7F8mx%BR*GF)4Jqn_m+EXB~8%W#xEp%6Su?5KgdZF zAADY1C;FIjA94IbwXO$el=BQPQv0{=$v9?4+>iS2e@>xhb1cBhzSWEdc7<)La>|9G z58)I=+P{L9TnPOIX3ehiN^Dz!sK9eF)q4o@%4}|?gWTd2{{w_Zg$E;Uwc=5CrqsQ$ z-Xy_99ratnhqBy6!8!?OEt`xGrPsdngZ{s83i))>6S%Q+2uV*g*CW=`&68X>gzxki zSMfHq!v5(>=vU3r;?HokWq)TO&F~iYyOGiAO1PqMw-H7@5~*Ze&xebgb*R}Mp7zH# zyA=33WdV>@wY9K@27VatE)Ajk`PiYV%;i8wA;Q~VmX)Zx&PFEYf45adjKJaE} z1?NK{BM)X_fm&+#bX0QevT4*DWd1F(Jqo!g-z?U1H*pX9t?% zNwSyf$83q>n)lWgzen~n$35oeWg_k|rnQJTAF6A?uLs!!rEgbO-fxYhAH@M)PT(9m z$g7VKb`ka=LiKb0erc*KeB?hc{Q7Ksy+qQ&Pz)nB%SQSP}U zMf-vWsNjH-`~t^^ap=5{qX1|%{>S%m|HFMs8MN|%d_vg7)Dsiz1uo~)sj;KVK2 zJ%yI8ny&zl3)Xlcg09OBB{q2u_XoB2r_K~|h_`7O z4|i8bJ%Hrho-6eETQ-Q#reNkbuwluU*wjJ{!vKP~%TL=55Piv{<7oVr*K6TrkkW3S zAFTEHuI+C_wF7)cDDWoeG4?SV7>0E)01=wdkNW>R^dLZ-oXQCPRDr`*cJn+`smD@* zbc_G{xG4bY#IL%b^SJ1i_&H$$`X8)x4h&n+=tP&9DSi4|t6gCME*74zki}U?C9Qm- z>tU+c0&X%k?4Z#6ka&HSc3Zft%c0KEiQvpbp#bg=@$O)Bq?xz0t zqGL?|jx5!#0R{{nwCbk(d$w040~uG5Rf> zQEa;Grt(Un?Ck%U0ZL|o=jV$pfl;x~6OCB*at%?jk?QBz<;+R5GcTM`^=RihRsVa? zN9KQZuZmDtsKDC@2XWNfr0hh05_Qtb#pU}qZh`iVp-q1OSls{us&+W=2*tL07=@O~ z>%L}b&TkkQ8LvC31%JUJ;$+m-%^ft6SmmfO$A-dI|G0jh6TY&;u3Mi8T$)yOs&sfT zkq}~D?7rHKktEN`t#cc-8u-fm?z0Z_bIt)xv#l~a)5$zF>Ndy6n&g>dtsP-$qx83k z8kVB{H-3*UulpUtOw@|#dK?)pFE^qDoO1ud=00L74aRV0a4|!e2>5^Q3As=UUU)-} z8%T7#D`L2KpNrkMxHzo$XY*DiU4^xo*$Vl4lFpehnABCmtD_VI!h^Y zjwH=r!$UtfaILIfjJjrbRw8>p7N;7p6h?;oOpI;L1-U%rwQPAr-c~LBMLtcxyP_|nl*X3`k z=FM>Bfmmhd$tNfD@GZr83-<(bB-rMOd*EP>j+t4qOIGOn|Ey@mHVAX1>+ksQk2|<` za-zYq~uvX^_afmGA1JOuLU$xEP@$k4E z)nmH5Rx`yWRRbarT();VoN~yrSG~9;0K2UCUte{yPS6^QQaSZZ=T33F_G4Ioxu>dr=T zK1G8Mk~pluHZFs$r;K6d78g&3mDtH}wr%x2EKy9rutL=UuKDdelHY3KZsuRT`sz#_jjMq1ZbZixIyrz*lHY^{cIntR{mUEZ|9|Y zMlP_;cr!ODnGF4O8%&ILEDFHG<^uvJ6%7D1f|GrICS+&}*RPEw=R;mVh`o@nG zSTe)YaM)ETTvpa#HsjMo1cVr9Qm}ul%uyaBj4yd%#!~b3k}-FS@Ue0!z)rO5eEZ#j zr-}bE@ku>#OVFrK!)%?<4cEqTUj?OW36EHy1k3F6^^WA%r>EMbkPrT^#3-ZP*-`nA zUvSzjg?!(eUX7F_ZiDU+f29Ju9+fM5a$|Ug!_ak^YSdy0fp-||Hsppb4ixe-5otV< zFvz>k7A9e}JC}ZL{a^dLQfZ=fnR+Zoi(E>?DxC%G3iJY`f@P9yq+FXbo9+Q|aYnX8 z?0RBNujEJ9@v!Ov$t-$)8pYtyaix{{)BwJ7=0NIbx%Pa{TRqEgs2bK6Lnsu~a7lQxHGA z7j?`~k=7Z24*YWCAwd3OYb3ek+QQ?bN8^$Ek0EXnn95bp~rP0utBVdq@;gCy$NT;jRxyqJN8}$@no7H)oO;-7JNjM z>UO?63_GannnP0K=7fLWnm1sY{gFd)7um8RRc3yBxkvso{P~_Tu8fF|t>Y-?{Agi8 z3+;1ej3Zg+>QmwVH@yMGghS)&%T9v-JyQHQE9Ftax%t6CY6BJ`PWQ)JFx>r);i<#n zx6YJ7&%13&p&+0TrkCd~f0YYgz8*HPFY5zMWm@!A@IiIo7EK_Wq)(xmLjwsLQ*9CY zO&dNs)0gSAOLML1Ck0X6^~8K4n7{_1Wb;2iaArph<)#rvz2pdh^4}TSivW~07-@im z&OF^(7Ly{}=ezD)l3=RZoz3rw&F1%B#+1b_^4IZ zmX;1jIweh)N%Xue$G*(@F=H(6RzatI)a!sho{lq0`)${UFH^|{i*uy0&%Hvokf~it zi`n7vYRC4$L01SqoA$|X*wpj>IxjimX?9-gTL3zTt2>?$Uq&_7L)U0|dN^8i!a5Z& zJKT)d>o$qk@w)ALD3^j(!iYE^zbDWt9aq#9gEt$GLh;C~F~Yo$4HjdIz=) z@ys|`Mxr?63f;lXq~wYf**qO!?wPN$T2#a6wL*FO@&;Dch0t4OyvIw#1{Yeqk45Nm zFJhYc!QP>_}FfguuQ#p4-MafK287A2)%J$;)TYG zLzvH;Wk#U_)gYuDMnn<46%VibckZHSgQr!?m6&qeZ4bHIW0EA_)xuNYOVyrvuDMP^ zxgFGzBo6w=6v}Mx`w>I0r7ytV2EUG%U%+_IvJ1^WP1iI}5&f8(nSnGHe^f1uAx(Jh znkd{icy@t}kwNK&#uuNRhi}h>p3biOV>!W)a>H~sH5&S9bd1>2v?>}4VDEt~Kqf3q zHBD~qhZjYS$-2mld8(mSa3-Fm6ax9;$2d@hDN!)8 zZuB6(#!NS?$b#zJV>EjAZnHsYcM27L-Y26}|8~d*Z?0c7DBbW{$ZWpbjYNwjMY^sf zXTV7?+~E7Cq!ean^jf667}u-h<$F`Ezef}QPiOA|71g$^3vUA|A|R3_iAazrStMeX}Atg2a6-}mv!DYpUc5^?)*sEudYMvsPuGy=?N$Uf_hRUh7PnLvFqM&jjQ4q}e| zR|%v>`5BARxA;mp(vFvQJg*==C*Wg>6?#@ML(3ImuJzjy?-@D*UP$Dd&{rN!>dkIb zkSoZx%&ACXcMspa6?#~^(f)SGC8=vSz<4<*dQLX?I83l}cw=j(3zR$#Fg=!Dh|lJR z2dk0t;4g7^F)&jdgQFG>y|IowtS)-B9=32^CGOFcySEo_hd=q)WFdiXv(v4FN^j3K z3JCec*Qupdif(>u`MkFB>HzeKy(%S3swy_yt?y)|b(tn?GCU)3z%`Wg3v8ue82x!e zBmORQDQtx;c(SiA&OErJ*o1GIcfxau=X*KqE@=BXp+iK;mpkq41aAm?ftA6s^bpRS ze9E5~IJvFR4KpWC>c!nPsEUhGs7je;v*6%}Bfn53cyAWp5`KIJc0opa($+}iZns?gkLEK~?HIId8ohsTjRSi*c3QM$$@!ea|w#Ryp zL8XOYGB1+pUwM<;FVYY!#$$?UL~F<=k*hRnk(2vDCTEYo&MnY?ak@g5R}b4Dphx3m zUdw|ydzQ&?!QRE8Wnx}NIyiejnclO7POvPWU*DVFyWR;Kmo5cs09}|6k6-IbnFKBe z>kw>$c+SBZJUL~XWXr&tlDn1H*afN}iwWfoLZ<@!rR}*YL&zIxk_MxoATe%?`>Z(b z{1q)`@}865V1;+*az_8-gmS)jJ!TAyz)Bj!5Xm^jwZ2%-&)QeIg{DND!7vO*X+118 z*v)qUu?8q0sV$S|CGPaJSBhPGtTRkZ@t~N2!bRWo2%C7C?(kq@zkgRES_Qo$INP%e zN2qL1cEP-Bvm$%FF{f$f+ZcwS72cnoi3hs8LB~ofJ4mF_jR77?y1@fVT1LRP(@-!0 zR?e0~7@zL59{hbvRHDTWBKJUH9A>`M2iZslVtr=054I=AtM^P54cSZ_X(!A)EUq_M z1S#2r9x5bSvyD{g#^blk&8u|T2|%C@a<8Ag&)@4*iu%3QebC#;Oe`seK5APW!=O7B zaH>OJ1j9u@{}+w+@(EWx9!nVTjpUUvYV|%jP51QSQaVPLxRH)Zgb^Lv-}ecpELvSq z2G19Exr)w)d*HJ_WI1#taj_Gg`$w#mOEl0cKE=TqlS;n$S=749@gft!cLQ_MqX8C_ z%m!Jt8e*MRhIe`k7zIsNo4}3zI;AX#K5hpPYS?PB6})()*on{BAZPUbCjSPCI`MGq zL|8m5d<_{fNa;VD7dar7>VgKQQm$ALN8Slr5elAcSyTu1$!1X`39RI1^W;!Xi8n7l z7iXGIp^NSNK`9}ZsvQRP zw;X^ni6dw*YN7`#_?5eR)AaLA781%C(ZDe62-ZqcC2u?O4_HJCYffzP*G;J{ow=+S z?Dn&SRw0&{O)MW{+Dp8s7lZnRLbG0**!t~l1u!fJg-?9eF_3!SUn{QqMtphs zkuRn-UCGnOcklDHV_vUQ7rj#rvr6KiuGbQEoxh%qjcZBt>`rVq%t_m3;ZE03#5N?< zi98G-=U&n+r^2SRUJ7o&m%}yeI9fUI_#1gBx%~vFmC(CY7U=-5(Z?@=?{RM@58;>f2vH_RESev01R9{2Mdm zvC$q-R$4!5VHPQG3LxdE|F&Y2D-s>GN zeN3^65fkQiT6es)0pe%E(0gAg>#X%t4rBPtOj5IN18x^|%gvsXPf_OI2N3NDeKJPY zKN#M}0*kkW>bzmA8-ANJ*91-lngzKERpvZ{znpZ(DO7z*Q>dz8)CT5}kQ?wJ+qBjx zGjaWO7T6FP796aTvW6k5XgJ|o{j4l+SjiWmsyO3*;iv)N3C(MdoWURHN`1sSJxM2I zFK6a_W=GHt&g}q_)yGUF_|#?vE#fG}RGhr`M)nqWf&!_jS#za#$BjrB;8@ zC(n7sC0v&~A)dF5GyEACb1*zSW|&PCSd-CrA{NHD4Of)uy^z)!#F`oy!)*}IEbEOG z`4xbNj}*SS{vBZ~;cAxxMGvywgf(Z83Im zZZrg>PQGXwhP3O+`*;_1RVmQo`>XQ^Ua{0Efw ze?O}2(#-83iO?MU@ao*lzAO^nF@1^eM0kMaRMYmyLoX#s-OHV4BM(~v+aKOae0=Hg zsM|ka+BhcbpFlMI93qgE*3qZG;JRF4gRIoBY%Inlg95O26wf}B0s&YS%Pp(m?R~)!q0q-c3J@DdKr*dD~ZZI z`j3)gQI-}|Qk>BMCB^Q4N{U6Bj)T6uGXkq(pr$AeH=!!jmi21>$s_^yDwNY)XI)w$ zEf|xP@6{3jKVK)p$YiNer6XtEqe*CEz12ru`9ncoYVeryF)h6shT*hr`WIBi%1iTp zFsOqeW!+?|pD)G*;99e+PM_cHYpEV+h&mxF8p2R*ci=%KBex{>P!6WlFyTKIGrdc6`5Zt!so| zZ^h+KtnmjiZM*kZBj68?R5yr}Xk}l?FvZua%;i{3e0|KMJ={a}Sp4JDz2F8Z0XH^N zpL8)-_$vD9u3#~39cZJgxZMEEx`)=SW$vxTBZa{&pus>f1$JK2$sdAF;65cZc`}iz3RRwz= zTFHM~Sjg=I7hqEzzpBvQE+J=ZEwnSP(q9H%2iOr5CBFvtQRuU@UBg23vwl(up{e<) zvqjgtVQUPjGhdw*r~8rs#8;G5Xp<7)N{wU_=TZ3huGzH4pf;7vo^7FrF^c7(+co%~ z34&8o09$Fx`%PnHWqJ!yJ?Z*WURtCJ_J;roqNjbJk*Ud3tZoqUVAoVTds+0@_G#Lq zSExSUH$weU^ToGMG=|LOl>!`RL%kFi;S<_<{=F1L%VDie%&|Ww!&uAdgp(x+^B!-` zbZ>OP2{-oa9Ejoc_8!RHL9eTGul7fU$tES~KRfQ^vcc{2r8YZq;9j|}#ypqr%KbPc zZh8Nl==2-U>3O*0y1`-Em(?HK0AH6Pw%tpdBAY$7OJpO8V6ve9X0d_(SY+0E* zQ~MP;lOcw|4D|QEwup|dryQ>kpZBoqUSi<+@ajN*Q=iAqJtAgcaP^E&0|5)*vG zyRV#T{lbOUCtKa(jjNf5gayN#1z)WH>@{d}0bdUXTlOEX7#3$fMceyK2&@y zjQq>2J`04FCN=+&{V|=UdE+{u7WrWoCzzQzUAyb~H1&!%;zzu|q6;*K82FJl-W7Qv zTzr%_JoP`te)g8FtpCpug9*;Ef$&)!*{3!78LSNb|kxZ{SEHRxi9O_Mkt)_qa4RNEx#7i z&^z{tkm5G^8QS6c2B4j*hW1Rq$ner*p$QpsOK*s~D*@0i)GytLO-S%?T~Gc_Y9`FFtFk6~n==IUIIwgZSR^1>Zz5 z+QT{_(i1&KG^K2zSnaL}M$tkl)>$YD)O30d8dfTpnGRAE+5C5?YSWZsY!fFp`Zv7) zhpMg8#JfN+OflJ}TB~dIcw+Zh>G+*5GBJ`}JWylxp;@Jo#90}Dd2vT<8EImbR}z** z?mTxqFMfC^Hwv2Sw{9tX@4w(<)GNV1+MkhU=cSN^Xg;Nw72GP-7Q910Z~Rz_jAfuKy#_3n4AC3B<;a?SB`yOt6!ylufO zHrY9+3R#(znsw7$>#@THpZ!%Hjj(+r%Xb=8ZnV~lbS<=@K?Q)T_I6v}Cu<8Dm_>iq z*6}-Z1eZz++SLduLRbk*bqGw0-`30B8n@oDb{@Nrj*dKud2v6H>&qtp!UI~M%WC_G z8@qMOsL<;jWJ6B2zTF_rBo1x3NkjiJ`Z_)C3sl zEDUDO3V7Dn{%GQ!!o%7rp4^euT$KQ&GzL9g9dAa>2fdODd+_MZh0$?UiJpUsrK%Ri zHTGDcCrQfV#&idB?`kA_&t6*4_ONxo=@D$+rS<{mc=McnZb0WdpdQP_$rY-2(C=%K zZ_|_-G4hmieV1RC_aKD<*2XFs-}G7|R>XNbGF_=7Iep=X@x!$c>kgho3D6zzhFKe9 z{4`eY;6lf7@+}b@X?t4}vTAI$AFV4t9q7{ubM+*k(k@fF6BFU^m0>j6hN5IZWnLMFq7!M?u>a`x%!bg@&X>dDe)$RT^x?cv~lSQ--K zB}LG21*9wivit-44b&xwr6&{cvQHN=U>t_}aw4TG*@^J^F@cAU>jWVx8vOQy4MKWY zD3u4XOp*(3ah#S&5!-D<1m!XCQ0T=ijKOfYAiLTffzQkE)XGl3?A(J`SZ#qw_emb>wz<(aF{GI5$F)xiFwGC1o+qeuBEKkW)CWaXIF4q1c3fI4(~g|eBm@G;q!LGF)-g`asDAYFX>|Rh-tj)@@;0y@@#9e*yGVWaE!vMb7bO@%C+u;$(XN{`)?SneZmPWChlm0$uWU~QTgT2 z6=!5`1$jS)&EIvoDy-8mfqSf$@akHL4RAuCT&nbczuQjqhSSs4E#Xhg_GZ-;Y@5aC z$5MB^2EiscBTTBIdTa=kp&Crvi5>T%Bk~jF5)+R*dAvy|op1N;Y7L)P2{kEw{Z-^< z?`sLxP6rq$=2wj8^k19y$3X6gSJo&ri#eYbDOs$XLSb%GRW48gxwb3>%XucKpl(ki zXdQ2C^Uiv?fpmRgQwj3?+^z!oOdu5|Ao&*2RH_!jhNz+iNq2-*n{Wo^yJnShtFzk2x+vi^Dp z&-Z$UF$S{F7vnPIzVC=Zz-FY{{q87MVdv1x{LO7UvbLL?^t zU_QE)LGwD1&*loRzY81~f4G;z@*m&cC47R5$fg>^pH5VaeeaU$QYS)hLET<@Dj^W>X7rb) zE$=S{TT+TED9?NKlM4lc+ z*eduuu}jRdnpDE6Ype$@FnPfB=`*?WGEe9v7Oxf*XJ&(6wYNhYA3jar8&cg@zRC^` z#W1Eh4Kp)q2Dt+DAl#J->Zjq6Vw6vjeKb!kGEbvk=8V;*JDp!)^{2~v*JuQQ0nJqr z*GhK(5B;Kl<5D5J0OWcRxGGvETsvDLCc5naCmt@ouS0u0KGzzV!a7Heq zio`%n2^r4L+-dHnRz*%kwFLR<^kG-hfhZ9(=U({`{m1d$te3+)Lht%VfXH-Vr5FvY zMB3aY#yM7vWq6&keDD#jR5wNP*~Fzfu4bo8mye!~myAuN)LuEa)bV>RZzbvX1l~i| z8Y+nG^#m^DzUznJF4*50-E6N(fD@#(9B9&>_F6i)&TQHal(UF!ZR!elVZ#Da)rs8dz^?RpJ+ z>FPsmIET<-TD@uGuu%gQ0pODrx_pV5Rzvyv?LZ(;-M6_aC1+4_L+z8*3qRK9DFLVc zhqv#UvjN`Rx3&t6v}Z-Oe0+AfKeE)~JM9WwV34Hxd^gbZW$-$e*OoREV)SNm(6U3Z z$`2$eq!;s!y&gh^QL9xwmWe*Zcj)i3w(+SAY}$ zc^p3pTFe!6d{8RCj<;Ds%fo7;JTT1jmQSw9UtB-3I|9h!xm!(K+Qx*!^MB+&vejqH zd8_V?n&x0VDrbo6dKf=g{C8U3b;3)$!`kPx$1hcLtve+*!*)m?^*f%j{+`C893a5j zl-rlnTf)7(H!ai|i zwHWS`q@g4}6&3BrZ14DeTw$GWB<^R0Uzuwg+9Ixs_|S=aKdms0B|O=y=r#cyf8kj1 zjaN>=xYHrp06=|2)Xe}F3&)`;y6ebsb3mD4`Vdb7M`_=MESvtZIOF3lc}(N!+%qk= zEzo36|9L&?*99vvV~LwID+|7)H@DtoZ$1mauqM9&ldunRJ@H?r?FSpG6*5Osvg@NUL}$>7O*{OvfiJI*q2JeXsVAXQdD}&oq?l z4iQwk|8asMjWvNf+<`8CFTAdi2u$%kf#tMKmQhcn@2}h% zSH}6ocRvHAzrO`HlC<1Ll+OGNb@Gp8kdMy>xUsgupqQ2UOZk-j}`q*{B!@4g!TVawf=Qn>DdahSU zev808kTgty#ry~hfCs&Gp4vK|t23sj%{Tx(s3qLVtU<%(0q&Vk{7a8-$IHKaiO{Mg z^*{z1{H1HnaU>YjBD5&NgtRF95v-iWTLI3T%Y`GQ^e_0m$_H+O%9K>)`_FDx3A1-s z-JWFv@wlS(zI0aRTIv+?pvv|wcUv=W{j!F4CAJwCV@X-}PC6j@BNrGIlcU$a^pc>0 z6u}749nN5Aylws55=BTDzWdVQph)qGV-+p64@aBIo(rJ!qry>|GLT|8cR#tc+wQz^ z<3&!Kc&E|Ki3fJ)=Zn(c(WQaRr_&PjbX?P~z1{OiLHvX8Y6M+frGW)i&xZ>LbEUGqX`20Yb*$8#B(|uM^R^)8bAHc~D>D)BAY) zW6HzV$~(Rp3$JfF959@|k+eG2&f{hhkAs{c@Fx{%W)7?` ze@tP`T@JwWt7`iZIYk2n(sW{a$ga5HQotC~9|5EIEBtv$Iiw|^(O z4|ye_{-qaX;C?9gI$(d`eF9t^qbtV+qn$#b9zrxcDBkQya*3ZjJ^)odskVG z+lHm({k98w$Sy{lj4>kPH}!6Y2}N;%&ta5MI3gHmD_`PYs1=Bbh7NJJtR#K zbV~jZ3<7rlt_tn65%4^ps*BO2&?L=I+c$dGupx z{zG6SlCP1B9Mx-xn|u9t=@6UmQdN%37Gld~#}cU@FCO*PjaCn~Vnl&=lh6jWXTXWu zWd-eRFmDFc(lj{{v$KZiRB_SM)3U4xi3g|j_wf5adkQDQ@UVXwA6*b*nAeT7llv{7z&R5&_xoz}el0!T=;ButTb#PecV*BFXF!Y+AuXf^;wR%_4Q~{&`y*(2q$7!LL`vr~nF6ML^ zDWx09ryHr>en&&J4S;NZB@e1>Yx)MolqvnO_v?jryg%v0Q!S~b=|zBp~qX1 z8#qpRFywvO@Yi3Aq%n&2C+;Z4eddmi6V4Geqb!2u&kG#tHXXu#YHY;TzRWC~emC!)O1fZ%KX|dce8n}M(KLJw^3t76Bui}&(o2nY zqNN*5PesoRA=bXjVZN4&-YIGXtk~PU)}?u~B90KnW*B_Ku(*WXJDOB0LiGH}>2{NQ z(=L0zW5W{7d7*}us3pu!KpcY*v7@v|unTtbZ+|U!sSWm6qRkJOFWPSSjvct`vs$a2 z;rHE$3B}iCg5LrT^I&W4{2hc-z*B=nB<>ZryuPRa(D-8P3|pU-FbrLcm zS!A;|EPU^~jFZ$gTg}0M{Qd$hHv#vJ)WE*^dBZxT9KvSyjmhUW%Y8mWxeDmaO-juDC<>tW56xsebvHQ0_quMTc)FLyTUW+`FX@jF;^q3j^LNkd*8NF(9@)o2 zJBgL@o~9LTOx~MkS8dSsPmm=w?te-l1xc1@E`eMs<9o*t<6( zqom=&%bH%SsvBe9j5wK0*e}$GCvv_hi)ian$UmHsjtT#;0X!Nlm)8SI zEbZZ)x@ACG;x`N?WBK3VfCRr?*jV_(<7#4><^Dcfjj=F zBOK2IBNLtCe@!#I(gD*9l$S;aZ@RP|U+an(yWf=+uIqoSaoA!$`@*%9E9PCKVFTXA zX|DRDC>@5T1%dya};)FqUddrqn*Aslk7rx#?=yeOYxj#^s#aLM)K{w=lA1P zYK@%_&a{CZN02U3X3Lod-M|a~HPy&lrlYBJ{p~-1Bw(^ROh@?#nl~Mjf! zR0ht%YO&F8F<>p8N0Tw4Ji%XbyN3y&qn%?6skm8)2_BTToA`Jq{zA$IVD-Yd%7O;+ z@D-SVD$V%FA+yaH*7vSZSJBsOz`^uu-V$l{Zicw(4ww?ZO6HcBIbu~^aZjr99EcZZ zgX4f*nfmuXKb~&`!}HhqPJ17pDRgAthcLvETNgmp8#oMb^3^95nm1KavjrCFPn6@cv_BV|X|12os5M3cH5wYEl<|u3OF%1`C z+1+^zt;51)i4P=v=SW7j!B9SVUaI?xlMGlU)5=5NlEht|T&as&v3J$=7us20^zszsH>~JG4$Xy;gh(~ZYx}2B)tqWIu?9bWP*+uZEruc_mK471oa&Ky9!fEKdBKWB&Zv6f zl|GboRrOS&N`+@K#F0z;2K~R2EJeED9}fzTxlHWJ zJmZZSA_K^6h6$je+ROI@w%$ZeIpZDi!^=5v-HCpkFyqza`XPq&-QSZi);aU~;p8in zu?b`Xv)B74pXjHYUrqM-MN-AFF5u}9b;Br6-}hi>GGgW1rX{h0I$DC#*;S0Ftb_H} zp)*5AXVn*I-|;a*8*$Np^inaZW^Tp+nS-n(k#(zM&ccD zYVC!fsHkJokj$P)G}hU{uE~;%lk2T8wOAI)6pRouK~2U1DpNzwU?zn?GD+7)|nvACTgc z5`d$F+4*n!2cV8M3ke4)xdon4srK`rLILhx)9q)|{*=vqz+nLq(=IWZ{fwGN0l2M` zB=VsH5dHEEg^aQ1q8T{Gms*jS5~lCg5 z2l0hGgMKK83TN)0?=9qrBDWrSCg!v}>x&mw2Cu{HBonoUojb7LX)fuOplLp&#sB*X z$>jn9A`16?9slPg~Ka zr6ab3=0E&E?EPl$WLX$G*FvzgubZbEoA!vQQ zpH152$&(912}5L%^2i>VkcjBp|3r^a9bCcIVZsXvv2?G8JZAaZQr&+Pgvyu*U9X@p z`xAbG6h6BzL!1SkyIBmKAb`fPCIb^D#BDL)qO>9s#U5A2FjkqF9BNC5NNno6In27P%sZzY(?a|{ zO9P>b?#pf4d3yA`efq-Pt(1$L)F8&fw|=&HbKH1SH@6^y$;< zx#QWDq^FTp0!+WYbWxMLKq{SmRa z?_`zbLdvEmtHkM6L{@3(;QG=ua9OheQ~z~1;}QESi<5rT2|){H!2UhU2^fnJ-)P!V zE;eYSh+$Rfsv4450}mx1!(u#;B*;$Db&YfGTVTy+JoeJb;DHNu&*{kjq-ip8sso6| zqaQ^TFW0nY;5cmkYA#ZL4luunqmu*)0Hp`Z=Q1P7A2NDofy>Dv&ibU%t*iCE1cW5c zBNtQrN{|&To~(Ar2cPIFMP8ojUMsls+xQ}&fI~Xni%82XqA-%}iU6yglR~!1C2aR)`Xav9J6ZcSy!Q|?7 zR!K|{jnIgc9Y7_Q`c;vKsSBIFP32!1%%BMz0$MTLb>(>gE7`>by4Yy17>whTSzyj# z^=f_k!UN930EJ8%!N;JT4P0wn@gCaTDT{7k0Q2@Tee3c7(twfG2(b6>mGR$j z@-_?Cx3;#94zi!AtiCIuVmIrPGtt6dMgH&)7Y&BlM%)>*{8`Wb<;t+8rsn*t$7ZK( z-IrXoQC66sLQKU^1OXt6TZ<#*6n92aetlk~J3R{JyJ{bMh*NwxDRPa6!19MO$nK(h z3Dxx&nKr#+G+8Kl3`0Y>-#>Pf8;XFRm_qFA@+{(S{GPZlS{l!u=QNn}so9WjU@Qjd zTn+)-B52Wzy)IU}shaJ(e^20G;zAZmikCy$B1& zvN#fr88v5A3SEFaVty!x5~9=Ck%F?ehR)%pk9T?(Ij7d5OQxEhxap zVzIB+YsMku_JR34Lan%+Q$+$}Mtk4k?@r(xBNsE`PL1OOh#9&d5{bs5zeCta8S`Y2 zLL|x-`onrDx$VY!AC^f^96v0N`Q|{CvMzFGzT`GCryKDHwY`8jis~wf8*0Yrbjj$w ziQMv_d6O9GU0{Pu2*o@&A!yT!LTL6-An3BBiS}!z@&qyP*+v5ti+}nCiC~o7j#l#= zyQnSi;ETXFlZpDZ0`Ta@bG>Ryp6}qF)<55|2K7Hiv)k(1D6k_pT3^G5l9{$0z#wp= zPwDlj23z;iiS@dL;}adzf4-3vH1j={?r`sP?f;y7_X@;_ zEO$y;`N-0<)IRh2M;c3inU3D;{Z)ex`mq&S7o#Ud!NO5fRvSf@SWj6_UsY|piButt z2jw+V>P_YKbo*F$4(CZ_ktMR9vjYd=PzKf+?wQvA%TrwY3$B>~FPI%LOmIS&>9mjh zmivRfT3w$RoYB1ZkAGHuG1`WLnVJ{?U2#%4Q?kc2IDy3B$qz4nrH&+c5gr&CDPOI# z1*Pw>-zQE`gXUP4ZVh@pmN`h~Yyy&pOi}BjbwJuO3qsifm%W?9q9!-Am7z(hGaU7S zB9nbQ?mVcI%434GM9!PHAGeG|D^pMA^91V0rw}!~kjtQDkoU(WT=ab2&*0}!O0a}W z>37XmcNLmqG!N`;)Hc7L6PiCF*&2ME-!FMFrXB_us5&pMQ@SJ(Dmi1e{ z&)H+k=}oy;##r1s)%JQ;ONiE-z(ir4)Kl=D5!p{zK~M%kvV&OA-1hYf>17+%Y1OyA8KfT+Nuu?$*0Z%p~RR1j@fh j2%~-f^Z76T!d);eYm3bm!Il37{*#wcmM)cg?(@F@Tfw+l literal 62023 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 R7Jmf%s48hdKPi~`{2!m*-_Za7 literal 58652 zcmce-2Q*yW7Y8~bL6{%}5m6IFXSC=fx*&+&B1rTuI*BrRi(Z06?(>dhf0E-g;}jyJjtS%)RIAv(Mi9{B{d|t|W5{_Z}_?1iB?BE2#=qkPe3K#@2>z~uD_8`lmLOsBk|6RZUEnJ+R17=fa5NN(!PEz89tHIj2rQQ8*wCI5B&E_tj&x1qiIXACy~awKaH8J!s#tp5wAy$lkAq)N;)j@1LvdQw64wX4o^w0 z;~0ovdx+tCU2f}|@AO9+(6zo4WsTR)8gDh6)jx5lhhK8cD!+ZBZmP~-SGS5xiW?RO zNd0wvWyOSm|J=VE!63g{=helDeh0?kEyWY_Xmp$ zrURV3yi#vYIr_g=p$o46Aym9E%8fkD`yiHKbFY7XL7&I#0F$;+A@*#?I6BR=W!XWX zkEj;RfpE6dw-<1j1)uL0C_+w!lnMY5`F-t+zczJsxA0}KNy}PETadS^Itp28qz);1 zejK!%iYs=2XcrbP<>*o{)vx$|x47Nor}7b`XJw^1E9dVJT|#3qGb>EVcLikBSgToE znm~9haRc?LS#ir}%yGjSF9iA?EUEjhg>I`R6D>608))7&HlEwN_{r7;=Fn>lwuuNU z$p1Uo&a)g7SBtaTBIxl){&DqB92LsqU(!}BX}=3tGthca5ua!K@tZqKLF&?sTQ&^~ z*N7^sZb(9x^R^)T<+16_ktYpiy`=8Kd^tJS{tVg0k`z7jCK4Jx@>0!Lll&U13CzbY zh;Z>jQIbp`r8o$Z#;|mIcL&mR*DF9#p+CKxe&dh-Hi#?)HJI~qIP`@|+-)Z)0Y z;i)NO|8&XAnrF&~3yIlULq_uDQ}RXrT2@bE2{}+@A~bDtb1ODue+44rVCV(Z^l)B0 zlryx<;?^Sj_lW|u!q(fT-Y&%YV-G4cO{n|TNxWGRZ9Hi*2rdq^0vGH~Xk9j8sB_X2 z&$rrU2`ktH)L162sFHJwD|>Qvy=ze6CSQDC*kI|;c6+gerBgcF;4^{7(?c=B<4+0c7XjRwf&t6;ln3)i z%%SD+uWXnWHwHi3G>=!ZwJ9`OJ5IbcxAN4JFC(3;K41TraA6f<^7zA}g>lC1pzjW4 ztj^(OHn%nCdf4i0J$GSd8xys`J3C|-A|Fvx@=oV@QL_(jFfFnVRm6?nd4)1fE~O(`E~6jl{ph+1+opJ^POI2RE0*v-fKH%ptvKFD8~m z6)edvGYMz$Y1`K2g9xw!v<#lIjQp1xIU6GdSQZun_mZ+@B9A__nq8 zC6@>FGhvy5W?- zN6zWXAR)jYogxMN0{W5O@r-(f-RfZLR8rNRaVy7-fnjm<*8Gd@{r11JRVb*Ny6z~Y z4>LDNSK*>J`h^0rc7poTaK1D!#LZmpPm$f}=3MHWy5tj~m}MW74_e@Dd!_FXYd);6 zQ;i>L4bcf);L{z|&vu~_DEU`!Fo)x25cTu>H7%9_y&5y9$*w-(X%fRFk4(Qwvy*j6 z$Qgmpsc|mYQ7fpC9gr7+y!cgi{UJfUnzyby74;OAOmOO|VC2;icy-b6zfgp_aTb`9 z8g0fbpFCp4!%4J^pT%B{Z9QHy(8sxFl4_f;@E1-wpdrAq|INN zndhvfFT`qF)%HMvBW8T5GSo`7-lmg>w~`GU~O`x42z0Wde@ zW^!?>XZU6@aj@xQFqM|Vx3av!dhbyy%0*0J%DcQ#P^PrqDsh@WxPFB4)-3^AB^_0jL1#uxox`D?(jmniAP0Ug1 z$*^cxoJ`!JwM&L+;;yUJv$%gurQon7In^k8Y0JJ$^oA~DTa0aPn|@Y6kb{e|r z^u|_Jl`5oX#(Ar5zH4AYJ=s*t3eT34@oe2GI}CHv2sK^02F zCaxi+@G8^Cc8#1m;!4=G8}_JV~uLpNy*r;ZA;r;^_c$iqVhi0 zk5}cfhh%)%eY3jE`RIVsWpu!JKps`8FE|t+!u4Z=&1IdDb140!^rQxrWGD!hvrYA=Ph3>XyET9D#7F$59ATn{L7SgS&583j#zuF zbaiuAjPJoam4}G_zFTqKq^1XA^=ALTYshW!e%oJ=0J&Z#w=0MkRZQ0PSN^z}t1lBd z_+fwi+8~TlSejo(TAl6h2o^W6elX90bi77DI%XE#WoL~cAD)? zV)ByxdHS7&8ZUX;I!xnUdSVn?hXTKAaXVgn1tqF+Z*7d57yF;bRDj3s3a;vVjGxl> z*J^ymvkY*xxpS?qow&aRC8>FcCn3Trxqr96x8z$lC$bkk4V;l~C{<{C^%mcD^)}y5 zb%=HR_y%xNENzb_GKWL66X}l{dDCP|C+Y$>ChAN7IYINV0I_J|f7Ir1Q>D*=Hkl>B zuH^P??fd0dx-)e~K7_?jG*`ZLm2J>j6Qt2s2f%`1;ed##TYZ^$8`_T@>3Q3r#^MWe zc;E6lcBKsxqxS3+UHxNvKjmLLEw9#yQJKSFo?I_S7XHZEfWJYeD}RG|y$U};A9}7~ zRE}?uutsNXz;XY+Trw;PhJu!29+-EMSZ7AOuuO}wGzBK%61`|Wh{Q7_9i%jSKb&;av$1@G zud#IQp-4)y>OaT+3*XgmTOUQ;ZrNlMR{Dg}*E=7TMUA|5pK~!_Ne744&9BGKSGB$^ zEUU{_%?RC7wM}8m@h?iI^IUEt=cN}x2FjeZRPn8gJd26BtA+Q6OlB#-B%X|^CBN>D zJ*3dclqajg-xUcw=2J)`1Xiu>zkoCFigHKCs9s$woUT_ttG#-MZ(Og&DVqjf$lq_0 zq~owD;`tDJXx1G@WtK4T*T!U=y-X!DAUFx6d52G<8>skQ*Eu6ui|ZB0{ExzIz14%(ki!EjGlDfG?{EMc?{Ix(x~f&} zNr*n?n=$>YV?Mcs#hE$AO3z&-?aSyG?oHpnG}FiqnbR*(m(E9N^WvO9(tCL!*Jmao z?K^-29mX~hb-r}0Bkkx|m@3iu*KxXPIh&MG>6G&A?RPk^bz4m}W_b9xi&=j%Uu{Vf zLQ|dTuTmzdQjn8A3m1dbDU3fU(g`|tH=vphk@1X2<+x?7c+s6UN|YU)7&b|%(&#bd zYzqr>a6HiUa~m?FVht_5t-;nRMYrZ0xoGXUJ!!FdAR`!OLBdxn?DTZ9^XR-vcX{JH zu;9+0xxPNjO9FHEQ4!!_=xeaHc_)}ty$F>_nzWGJF7ds)8}!5TR@ogBQbYU%CX7Y5 zs_TxFdSu8ImvHtEht@nb^sO%^_pP&hjc1; zc+ze*L$c&CKt?r9lDDr*5MGyvI#E=G(89qk$_FL18izECy7!NZ+bqFMlhfVSVxe4b zzL3Nl(tq8ld&$=F8NZoVYp8gGz6T9P-|OAmGsF$r+UXSD&I32l z$ry>nHBE%@R+#KlU=HB3Lx!x?*OHGWCx7ia&1?(c6l+16_F}pT)uMLSk0DVg@fWom zU+d^cV_(|bGN40}@M)1cI-0!bdSmpXNXoMMh3Su?M-i#QEHKma62J0`ub?6B1F|%h z5)PG*Z~D?`f3b;1APB9e)ai_G)+v=^q6HD5-`qxI3VIZ`A;3%*T`@l$Svv|}Xua*t zb4Zim4J365hTxYLE5r=ME{~4-8eaK|P{+ zh7N)UWLapuIBo%f;NROaPgCM35aBhsB*;Hh-kkJh7uVk5IU~y$}(s|z`lC~1~HI^ z&(>s$A!3g~`(fudUVGQBaER#oTVsqE<}8w}&vizg3%l>({2rxSyvLDeccM4mSS`$& zb}?}&?BMvJ$>SxfNf$|6dl{GgO)s!`RatXQ4+n3;b<5lMF)w!!!)F6tM_aUi*8e_n z$!xJ!H}(#CS6nxw*HLCSl?amRxFPB)yIDNOIv`CzEe7DVA+p5;Qbu|I{ZhZ`>*G6x z&1TfXuG32w=cj+R4C_@|=9sTl2;e542y@B@^*YLT*-`%Ru9K<8-&}v3FAvJ&=;0_< zr7QBGbdoD$YCZ`)m~8ZbxNJ^J{pN^8Y=3|MXNXtYYrG0lW8IK_x0iafP%sihxs%bX z`=nSkXcIsl@)&spdUQpmqx7vONQnzoo*Sd_1{bZ3j!O|eU0p#v>*KIL+76aXPhZ*P zWkclLPf=a70MN&%aDqP=d7IJWGz)AiXSuenAhKPk#tNc>iOC=w_PZ&=1W#+MdUuvCUf8SXj%m?V&?cQ_5amUQRQuHw1ky z8hUCSmwt0Qia8esLq@U>{+(&#YNjqvn@-i9aH@$TBRnn>SJGCWp~&jB_$Quj%TVSU zG|dlh8=;tcP^L!;(Naf3Q^)wfrARe!X5?q&T9e^IRfUW-Y-t;*!$mw=mnPX6iqfMSK&{+ z$Og?5tNCY|BuXVVZyh1UFHEC!1CEhTeh22n&s&yUC%lq5{N}ifYH0mEuqNy;B}#u8&ti9PG$?R{>ubL z<+NDX%K`oDV~7As&?=I>cPXr-WMH2b?#0GqYk;?(pZj%gzSf%wE)?lhKm^(eAT?5h zuCov5Kzq>vZk#tRvI&33OrQH~2}}kPGv?*yGX7BiIV`xg%KVXo{Pmc%Sq2t2YqO3o zEnKOCk->cXmp+QR=E-Ap5mbZGS7Ys0wVp}kmXa-UJlSA}^P30$hgWAu_JSSzzE|@=c29qL%SChkIDcEK6^91q@_l z0`E&I81nZ38>;fKpwJ10u+w$K>>b3K7+G`9JxJ@-IiM1v)eThsh}NVBnWS@)FK)20 zUoG!~J_?vRI_vn}hb%~g=dnYwkPG|y0LM9z*M?(yOyvIVC-<3=|M(4j58|HRVZa?K0`FK zHtWr0N;)t=SevJk^W6+;n-CwoIk1)@ISz-x+}iByMix9$2}jtgRE6i*}ah(HyJRi;NSK8G#~`z>`OiS%0VNN0gQV$0`j7X}cI zvbVOG<$HQ$J=j7L50l4&=i8@VsME%XDBtL|*if~|4S>#=fc zFXI8?EAV{+6X?DRS4k?^WlJW$2XpIDMHy|*w+h>vS$5pS*j*dD<5gx~e`i+ca07@B zRVY-MCf3-}b4vD2bzE`2`~dK72JXULah6As%oxGJgOHxjb9tQ!C9wl0eM_;Ai9JNH zA{IV=CQsy$Ck#c>`+x{bbw`qN(rU&ZF&X#>H&7dePH>mm6mC?O(yK!KN{Im}yqGpN zxSAPHZ%3C2fIogO)`SO`bOZYiI;pSYywiD(N4|K9^JOo7cSOGZ8oVva$cER6olIu_ z$X?>R@F$+!8%v=ZN|vRa4{OpgqR0_RrBdJLev)=HvQK)~hUc%&baGXz%o_Nxny{1} z^Y4%7y4n`kA+~fvE=#g6eu`avq!Iiwrv6&>=j$90; zU%VKB^V=?={RBLx1PvGw5Q4FE9MX?;`E21L7w@HUqbff=GM~+5ePdwhaE4JS>1jDM ziY~`trLGo9YeTqQg9V4U-s(6Yd&pfxm8Kt8KbfL6-Zk1sOf>rX=~w!C}HRH;A=eyc@A8AahX^=<7a3UNk}b_rKS8BtI@Vj1b`*Orl2 z4URX965DbCc9B!zJ=kyPz7UGV^k_N%3t%|bqHmCwkeL*khm4p?m5 zIHxSkEi826u0^rYz`0wNeOdfQ;3ps-O+dlk0Z);admlDns>l2 z{f^reu``r`LcrlQcI{98QBNG&5;lDbZieNAPwF-%r3q7NW`j(y|Kt_zfZQbaYh?di zg>%hm>pNx)8lgW~$#-~NoQYf~Y4AdqH8tR@_@6gA8kYV*11r#<T!6{q3RH148sIq-klZz}iFoCaCHLB<#0CS#vebjl=s`+L-_IuchUDDkk`Pt_Q%$ zs{j4z&Cz##COFH_xB0*fKt}f88JMqya^h{X(RP4_K4^2m^>_2j?M0nyb9#B=iYR_P zmemSSAM#Z{OB))QCRhk~Be%5UXGU_cEP`UY*^{TVEYgVN=!%4G{j}2487!Q8b7NjW z2fux()%z* zL~fN!*481U+ZMr0*MCtNg?k+WW`=GsdjWnv;B|OaJOYTM$hY^_lM+R%YQ{8JYQ7A)S<*4jVQsEzwmxtX5|w=JR<$ zS?8=5$M1buPg}}Zqxk(0``2pQa7^yL2s6(0$OiwGiRWI-Z1D5*^XT%WL#f1c3J0^k zCAkcuCtm_IZf0<}Uht4=DumTe7zWZ-FFKu1s4y%HslZrmEpAPDPcn#zSfzwnn_EMw z6=aYtk-hszkq@f7k1z6;H1vG9e+j@UONk>0|7z0c`oo5jft0th)KX^kizbLIl7^%>s340rw|8NRzXwNn^jBw`?agpI_@74b@4HMBGHOf-shw0 zutvp$ieJuUPaVMeUaeYF*qvDl_ya&FS3j_kR};}%w6MbsQuPb>9qVtrNEp9Fuax-r z8Yk>JstGSRW{y{B+i;NOO-0R?3AR#=J9jV8!hel-9g`f3H}e^m1J_P1qvEaJDjk4X?XPbc$2k%3RdQsyG29&y<3$`J(YM_A^@4_>PSYWO;AqLIVYb*y7uRTh-TR~u{eruKur!adC03Qk141_?WV?yj*% zT}fvNLg}Tp?z3U*&qGc=u~zk>m$i%)7iaQeAD#0|_bY2K%}7esL}adH&qM=IB8zX| ziaoLj2|g9_3{O!I0s#x`AxVlj_s1#LK4Cn^_AH9wmqv+zy6X@(q zOMo;q@5Tb*6hU$5Z~ywWEwJ3hu*pL}Ay8$CvN!AG{Z=vl7>lGvK;52|S=1xdPgcW? z02{OL9{k|jrf+bS0 zM<^YKrGD*?$$)qOTbcA}u1A0g9$0s^m2vdDkO|)OdldKbByxgv^mnsvAyJRh>+}W* zv#5wheO}j48~I2?jm3T5jD%484PKvmN^%nz8akeNm<8sTs(gxz3yNbPV}r*D9?fKg z40(JzChxrPrTM~gAUgF^@>bOa{@26jQUJ@6X5qc{S%g#f$kpjVFCr$o%iM*V^S3OW z)e6~dKj%nm*4j_+rMvWd8c%i{>ksiZ_xl*^Vv734J~&vKO3M-3ycN#Vj9?*H!}hMN zYW6&=-#C{)-&{{GAYuCMUe-)2d!V{^-Y>6c(frn1`SHQ!)-i4;I%lNyFjUwE?L3YU zh#3EVEN_k7WE=8}ny&6Is?c%eL*S%lmH|#`#OGIir36+x)7ki*7Z_@ns%!{6#-A0b z1ip(EC3V;K3u0WNM{-(?g-WcYqZ~T-$L4Ald5IGZy-W6kKjZsU<1toUcrJQ>hM%ga zS#Ap-oSoF_q&NFOi)FqCp5KySCP6l}+4ov9a5h(^D}3TP^q@Q!QK`Jtz1fo+f!xuu z7LMPS@f5pJ&9r*jPHO2nm1y5+Q~wMb0xtLtM98y%bV7x0+{2eUv>&H@{IM8^9YONX zS;(sqbj0p7JZa+#J2XuAW$34iFlxkc)uTMO+gZ}VKV^v4#iULHRM^Efs~-yG)EzDS6jw00w(OgaGJ;(aHNxNOsryXHvZo>Uq z;LI+7zuIX5)bw{$>A~H4rH__mKd3K%HfJx1T?l*49{WgLT60+4ZNr3EvBO&=i1WQZ zA4E%@M(%POe4bb{x?SBoia;+JEu6TiTy0maTHGc9^3dP%l7lxLU9SC_(Q2&B?OMy> zt%x=(@?c_mfOig8K4^aT%}l++TFL;R(Umdjii$ zgQH0dTRwmzFi26ou00@1cuu>J+~7_{&-3Wi$WjFe{xpv2g5>&x-~(!p=B>GpcSxPz zR4zvTG)z5J?>}ip`d#f&Oo)$<*21S#pVZ^j$fr&Gd%_nk$_<-b-VvKAPxR8?=k);? zVaUIbADRs=9V<7C8x_t_FTJ!piLrJue-?KntR-RSVUGa>5I~aAZshUUq8Id<=gH{D zUENFXkA0iZzG0Rz+ge%RvQ8CX&03^ha_@(hdzTQT;;5cq(RN7f=u@6cp6iKdS8|3lDiXLxDM4Rg>Nj|@X>`GAmWQ00)|7zRjFYrrN<)kseMHaV!m-ZdR2+4d*TwC=aWzynv- z6GW8^b>ELe-n#;p?x6=Da?BN%G&rjKEr-}dB*-^3tBwG0<244L6A*(tyst{%9_GxE zk&y0_CVCve@q_F_xyk#8Yy~#8&b}ddOB~1f0USqF1{kLd7>0<%(}zaI-V5uqC|Q)z zb8dz<>^DHJh^Z~IGp#@sJBDE8Ae_Q!uEW|E#0DY)kxNId(OXcrT=>z*zSuf{FWLT& zD2;jNJ^g0a*N!M?Ykw%xFd+AFi8@3^a_O=Ys5B}3p?D9F+c26jg&|Sjb8LyIyy;WS z;E=z1OJ`QYZ*t!>4Bvsn%-=8HROasUH&bZ*#n}g$d{KAgb$hjXEPQn*TtB115dF^^FPoaNxcIM41OrY@JKKD zoTM*vm!8Qa?+*0+fPh~CN6Rl>*eiOVi(!PK3SrprP;QseQ6IG&<{_ZE~cF3O&(E- ziiP3U_@3>R*lh<)W!|t9TFDgijGo+3jlsa7O@Q=Zv&X9|oam%TY7b%b3Qq@!G$G{` zb!?p6Ub+WwHOOaC+)K_I=2iX~I~q}P96m$WBe(1R;dPF4u7SZBsx>}T?aipLeY`2H zQdRE^Aia8nfLk$7;31|I1EhI<7*9GMbL_|%BO6|S@P;9%@AVo#qE2adJU!L0iJZfh zvlOCOa=DS4B3EZExaeSx&Xf47$R@snOC0j#la6ct%;hzE-0myw&7U^7_EQB;#8x<5 zP%6qGyBJ+^8!Mt6n>%~HmP{H~i5PzTSC}9z=Yf#`F3@gPmshwQ6EWr)6B8FQMU86upn)83*&eSM+DzDbaC4Exdf1cxRnc%P$V>b!(`3DfLT z!^~i_^d)t@sP|eQF+3dEbO_c_s+pmW8%_o<*LQ_m^VNacjz%%q$VwAU09{mD0=*HZS{RSB4Dq_!7DPQ zw3}C-okCd5%;J_%WEuMT_@|NEr->RZe|5eK3^=4QPdwKb%b0IM++6S)1>WE{?$kF+ zq$ll)2+}+}+B59SUgR6)#9?HC^q8vL?AfHQ8NyH&gI&Uw_z^L}2Z$ofB7su!di>pt z+-&uD3Tzz|eNV|?38G3gT9$mS?pV{l(Nj_csBP67FI56xdv!lgXuk2oKFK%TlrXoD zMaN=fA~LLb(tq$;DG;QIVzh7_>`>7#3*g+LatTba5s~(Q`KMo(`RO4{)=e z(M@QXu~owdvz@S3!ymItdG~qD>Q=Jv^4?f|)WZUs66s3GFiQ_&l@I_x(l@eM=lc0eRS9@0efSEQPoc&>OWzix&Y@8!=-A+G5$bC8 zFB3)ZRLzlPr?zts880jvI1Tqit&8Eet%`7=tcE*RCn$3CnRVvu3|w)~@Uqt@ zOH-6PaB|{8ycZ2&zy=~phM|Juj$q?{avH?<$1 zb(I~9teki|i{Phl5Yms8Xbk-@)l=E`XUjw=C`K|96#Avtk64S9KA*j4%oN20f=5iE zKPz-`w|j3JHQ?KLAL;Hjd#xGooiR3vm!8jKuEvrPU=k{An2xHK5Qr8u)F29zHT#Sc z#v{)m%G0fNrpH$cut`Asi6qol>vLE>!)p`PE?Z@HKR>9OV^!lx|8V#`AM94zw#U$X zBc(o#+&OQh#l6Vkd_rl+DQ)pYH`KpTNxMXs$i!`LDs4&Gqt|ZWyoHx74P1Xc@shvp zMd@m^qq}~A^D#3Q{~X&Fi{VSoZy=C)`Jpi-sSzd8iMuMnXs(`X?NpsZbJasj1Ucid zDTM4-tThuVGGC00xoDW_%})ixMCp!` zc0c+DLZ%oQa_ns%qHN;3sk@ARVG42AUv!5r-V{;^N%|$G`IbIo+2pI8HoJJlJbUI{l@s7iPIPvv!mf>-ahJV;?|;GZBf^}7AiZYD z0#y~^H4x7!cZiLw++%|u7)xZRYf1fd(rN^~;~70IXZw2Ks9C@cmn|VW+@#zm2i%Bf zEdv!+gZNBsp0~I_+&3V4nJ?xwjrJ{FQMExq)C_(%ef;SgaA1{=Iie*8sTlli^CIj04C$=Wg=K?xy#g^3nE=l{-}=J_L5VqcjM27L+!&?K zOP9E}Z)5Na`_g{DK6o7xCQ1L#q{bE&$?-)~3;?c%%K#ZiCjj?mRm;_h)#ThTy$g!M zUORuRNCTIB@sIwuhST z>#ViCt-HcvoP6vQje#h}Lop-04;1|FQ-R+ZX$|*n78`NWL z14^Oz!xS9mq>*Y&Ug< zSAE|sVUrR@gc${8McAo5ebBo((AVBllh4a35+&bVmO3e^7`|Bju;&?o#;&O#<=kIg zAyern&j5Qln~7z2W_ozBVgPkU{UX1rnx$P`y2Jek(ILO3O6?FR-shDd=2sqY>T{s4 z*70oLog|Rb$n%tRQVO6xU3f*6h9sNMu3*=G6E-p{vOdY?>*RjIkOhI!WtKQ-cV$uxb}+y$WeF=Uw|6%T z59!gaaVJLICs$XKU`h)j7<;n8+?b>2IXd91j{PNt6~RfZx9}eFgRTc#`{{=&v(-y@ z4q0%f2#Psj#x(YMH6IE7=+0N0p#|k#CD7SU%{T*^B^Jh~Eq1MIeW=wH_m>9{U3+*Mg0g3bdXL&}u9v}Aw=2(lZAc}5MZvJ!lj|8O3JX+BLu!G$UjDrzvh z7h2>j4qIYT|9)9tttjWTb&u^qiTk-5o^P)h)tzq9562Ht)PO3m!9hUcCOzKhw%b~G z)XdlN?#I#vD|P$G4fSlF$M_Xj5-vAH?}@SL+4-XL)?A_Y7ozkY{<75t zrmiO27Wdri=^+mk+O{b`&v~!R$U&1W!^&Zxhqv>y@<>bRCy~+aRQpfgmV?niX<(ev zZ}Lk_TpcQ>VqV&mFIaljT5`h{4W1ksgT5l(n}Y{D4(L(^@nqW9!XJm zKl_lDSd$}F1$OaS4ISE^xGy-eg%>^JR%hrc#dZUfciqjLd~q(!r3hExtu*C>1xL}z z?egKr?5oDw`TvnGX=t{8nhNT3HV*o#=ZYV%mgH68!r=~n+(${jdfyp{2r9ui{*_7~ zQ@b}yInk@~TPjZ)oZtuV2qPos1V0#%6e*-nE{#xjwjL?e-W;MdWe;u2{V3t9yN! z3yBH)*+93C6iPLyz3v&UXgzBsV$Uy-029(+gY@RTA!&axKyvJD{i`^QFcL7$8*oO@ zYdo85q9b0aZrxu8yAd0F;(ROtV|H z_n|d!0Ck&Y-n?g|;P1A@!qhr(uc1BaB|T8f7!YJ2MC0&$K8l2$7-&di>XHwux`Wsl zoRIH95{Ei#Kj|62!ent;XGTkSgyH)O;cYkJ01a%dSEaap#dpSagk?$76H|V7 zn<=!QGN*Ji>*ePvdOUe z+&J+uN!LE0p=nzP=$4o|ffjt?@!3tVJ%$wRZit=H_xCD24RTH}FJ}ij$+Y-w{WjQp z#~G^ab!540zx38B7{Cla%Gp=oe_l}o3iUJ;Ky4U6e6~vQm+NPb;0)9a9G7Hff>*R_ z!sZ=ZmN>}|>YhA>N;LY#8)YT`QD#*r<7QB%LWa6)IFb$xP{;HzPA2R?GI4=7AADJQ z*_0s*6%f0)fUS%Xx+G~lVFlV0(H}CO6>bbvIBQwO^b4}W###Z;vD;zd-v1@@c9`Hm zV-4Eg4~d&n+*;olo$mIPrRn>jGG$AwVGRb1n>10!7c?l4a%r%QDF16c|rE?E^W^)^;h z-B_F!)aMK?mc8kl!8kFtN6?Z2zcj)i58ceZ4@p{O;tY&==PalZs@J|Mp}_9T6)@klx2k*ZGF{Ig-U&# z+=stLa~cY)V(8WUe}>tF+^MA2Bd6ED&H%sGnS=Xo-LtlRTtX8vcox^_h8Ihz$yjG^bP#bk#s1SQV`>mQgFR2-tC2rZw}YZH|S6^ za+cX9iEyAntvfoqwvY!=cGV&~$tP04W5_Q|lOr&Fx@bY(!R9w>zx^%Bvzc#`cvA#) zdtMvbmoBDENl6JH6i^p#l?6~KW8&uyK$J-aVR6G3(gi=quZu%T)I2Fm*x>Kc0mpCU zu`%_tSeW77n&wTLWm+!Nbu$@Ygf*-t!-gaa4zwQ9B;VZrq+9tm)U%H&l4PnH7o=!l z>e?PcvbRycIdFNFe#s3H?vtVR%8I|1QT?Lc^zP-H&slooCGS=EwJK_6L)nXK@$q%X z`NSJnX>^i7*7%)^*2QUUPX&7C#w`-BM!R~#;W_oFtDZKp(ir5rAy98u-ZtJf{>{&9 zyP87Sbx+IS)Z!awAj0)t&}(G$+|K!Glbs4sQSyumh-!Gu1(o6Vg_6FCx&dTNKtHaM z2rqP@wNj5GaL`U6Zf@ky-Du$V-2U&H9jA3M$LNZ_IL*D)Y4oDD9`%ZPODUoR)Z*mj zUPAP1?L#*veI6;T<*KuNNoYaC<~`asi9ts5D$v@~FKi9i`1iLA@d9Cp)b9w;bIYqD zq;SB!mjfyd>%~qhSZtBfdnPS~8rlOM34RVB@{t}Qa`reW%W*S!+Eb_bdGb|?2I)g8 zQPryNR5|{HtmBnWo2X$j_8+cK4Ece-;OthH=+&x<8rIm+>eo31lX4iW_07f3=+@^i z^j(BqJj*scEPmpKuu<)sozvSOUAJK>fQi7=*pek|@NJ`IpIV&F=^aD*v=7{%ib!tsr`XQ+#*7eIo)T*+=-z>w$ENR!9ca8%s#Fz@f6j{Y& zCZwXbap1hg8W3UM78_94{a*r+U_{&0D};AdHeS&`$$rLk9f(?#z2XCB43imyigV|P zd7RLEABB;Ow%nCga|hxgo2BD)rTLBS##$lbjjj3}$NTK4GV75u5a>g+3%Nm)XKkt` z3^%Zy4Ne{6W9`dUJE7xg=@Q!ix$wG9@cITpZ5W!#pae%3y6<>=8MyaJ=K{_hP*<6b za8pNJ@V!fhh>9wu@Z09#k+J7}xCS)3xKhRFba7(UW6-2r$&$$vD1|{bElTjd4D?jT zY_j3CMcNWdp`o@oQs=DGJ>IROv18bJv}mE{80C7%mY%yg(}7r;kGDD8oXWNJoTI38 zcP^)}Cs&?xdqxAtozUsNmA*z0IhhRv&If;f#6CNDOl>nskDwM^WT9S-+^;A2h7_=4 zYq){gW3a;xM~@W87=C@7V5S*jsCgBgZv>^NqhPpaK z&tw8T6%lEtFAAwz>ax&U8^G}oMRud(A*}z~_==rVBT7Y~md!oaAHyZ++?1|igCfpL z$DX^_cqrbhPQ9nsz-l;N?Kf+S@lHyli_`YaPP`E&QwH=-eb%sT97+E*OFVNXIp<+Z z#W)`dl< zo3OKZQa#kSH5lO%j#^OWRlP6^!{#mAay>e*SuJ62+>^&hob3s5r}APuRGC!N^O!O86ANt zWpbyG`mkN+5j;)X4v|2K+inRndr0v3-Qv>fsASX!MTy~EGd)v=11C-WlFkDM8b>qQ z2qL4L14!7Fn&4ik$yl_}Z5v7(;-q}A!fn2XNLFQ9xB;GnsA*#Vll%0oVBiE1;guVl zP^>ePG~cb85qYBItZ82AT(bsQgW+B^f}4<;@4C-S%MLX3HmvgrKZ@soKUrk%o?|oy zjE=SrV9=Ytf0PkK&!%b`@^CuAsa)0=h zB}Zm@%EI?f)>VxJt0)02Ux0ytSqY7Kam96pUtEs`BSwtU3c(O7*;1=9=h(ovh4^1v zdr(=%A&$~UH-SZBL9964+!7kFko7jBYs|gH@Nsob^GxR>X_;fw#8MLcN`UyCIyVX@ zGV@73uf{D?F4X&Y)sGfil4mm!&WGP5s$D-$6#TSbyssD}W@0dNyYjfI=x38=9B4XP zhFsL=Lb&mCqrPd`VeJ$Q^lJS`?*JNDCDwGQZeV8*Ac=RywJxgK&(7ckp*Kdp>XqPl zke^R5eU0d}pfKri7q{v12QyNx<={B0jxi`bQzw(&bZBaQ$Nw7dneLbV;eP7%oSKL& z4GLSkk6(dMwvsPK7vI%(0pd5VFmk7Z*3Q$%4qe6s{|(JDV!@$-i-#Qzi?2&l{}0aI zIxMQS?Hk4frBMeE1W^!?MoDR<1q39Ake1G&L!||!LsF%?85&{eAtVQ+ySw|n2KU}> z@8^EL?>*k*;BRKFb**(>=Xw4rHIt2*CWkm;>~W*LSgc8a4UXQx>&;L5BrQj{WE#mQ zP=>*5gpXHINe@}gmf8V$@n|eksdI0YK)w1H!!K$iMLG?c*3!k6_Kh!k2;tS)moVCI^@*5^dh)dSCO}JMDxd3C=Ehc}}%D4B+{wdZmAiS@?ur*!+f2nguK)Upwc#fVFd&E3kS7285od0L5_ z(VEIqsXj~N<&{U*GgrHuE*rUK12u5hBL;Y1ttd?DZbxhOs(Ejpr^Ql{!-!HDA5c4f zsa@ji3v;nt`^rf&2>cB^x5wiV-|u&Vwtuww6OMm9`UT?O2nf>JDl^^aBQhENS+CjH zb?fK1T>W@c*Z#9hLH1~H!I%bd*ICe;(Sao+eKhdgvcty_*imSd->nB`ESbW3z|%wq zA5{yx@*K2epghOSy%kR+zkHhu35vunV3*SisV24>s=j|}cZb_i)O4vRI@*;Z1G4I` z?DOhc)XI6$`#EHy)MMmku%LID;=tgo=sDJMCCnu5%Y%=4U$k>qC_lu|{zbcZca?4V zwa#=bfsAVm4TY+jeIyfP67zx8G2Z8PhrhR6Q$>vnG72(uJ9(XP}zoW zuRa|kc9fd#To|c2d)JI#b-c|y+|}c#sVT~IX11=>p5D?ZVbJ7 z%)w7VFi~ADP)h_jV(p8*7U&=Xi#?`M>g^3 zfjQ#~@6XY=b~pSOe{6jJuKFb&eTnHwIQI|yPwWHG07=_4)ccCURA9hrcL_lzM5j7F z60>xYFhL(~L}BEV(ClVGz)*b}X%T!AE7A`=!bBpQ`(IPAM`I!2l}bk9HIIEj2Qd{aEIYMzF$nT z{2&Bqs;v7$mc?KRcz1X)-@2erdeG^KF5W*!quvc8S+m$^Uq>?!g~*12#eW2dZ&sHi0Q^L=U5*dX$OTi+p@5IvCL=)j$j13 z00mQuzu=@^FW^Lxc=FsZLPa<$hiaBE9tJnk`T%#-h|@13Cj+CdY4l?0@+U2Xi z#|!SD8~F7`{qy4=aURPH>m#!uI_KU1O4;?*H!X+=b&wiym?{C`jKf2G2hwQ#M?Zj+zTIC9n#aZ;7qXh|3%zmE1AzHW<=t;nPu2evc zz+!_={iIxGyYmZ+LwB~namSa+Y;Bf%dTY0Jz(A+EA$Ux(vN329H-31xki>=qs(qk% zks%kmpNL^`9qJ)6vZz^C*^!si^+NV6`7IXU-#?RXp$v=<=vrJknqE>VHe=?aK#mG3 z@*c7WdbeLP+Sq+RD5V4zB1rh#F5!Q@0DG{be^(rR*po42EBFB_Qktydzrk~hs^VRm zwbomhR32R|7?nQHp*PKA@P;a!IV%2A=j%EB$l}T~wMMek#D_!onvZT6ess;Cson}W z+EsdO_cvqDO4D{>Xhsed13ix7MFTQ0wrbJ* zUly9hL~p#U>GLGDmX1&|LaxtKAX>=+&BiN?N!tNuij=Pndp1H)N8 zX1OC@liPYEZ;!QqZFlBo#$NzWd7G-9dSLp0U4CTGawvS0>_~eB92(9TUh)i>> zXU7Ex{OS4jABJ<3U0R@6>Zi7{@CYbck{@Dvm4!#&4wx&~cXa)#9~Egru+{vfxK!sC zTn#wTgA+qc#n%Z9s5C3K-tGrIw`Hx_teFoFtP&S^!%U%Fv9#hYt)=Opz!yX6BV&tP z;Xd!Q3xRa$f7~i7DJ1y)(7-&LfY_%(JQFg}|3D079Pvgso}kv;?0Te`p20sqD>4ol z&nQ)u?zOfQ*4LwI3zzUq}WQ;b-fvJH##X^|yq(RuOTW+x1MmT&vp+7s({m|~d z>+uwG&-+zYr-C!)d4ZGNx`F_PD)>~=a74%BIZ)K#PRn~Ayluslms;OfUT$7hntk_l zIiEf`C8ldg$?uYD$jZxL+WR8+7-XIk^@l#BD=B11uXkGES?LeF{^urPOow=v)A8t? ziT@0~FB54$Oz;DJ+&`BZ_7w_WsA7*v_N3r)lMFA9N}32Anon@sym6Rn7H6wJ%`sAH z71>zo;`*4K1D^h_xZ7s0_F35-seX%4xW~mpkKxulzSlksCIP&bn0WOxc$@F2KSzez zo|a0eTkJFM+`3gRS#_$GG+*q%xH2(v6&d>HI~IrYv>N-80AzE+hX%!kw{Td0CSCo6 zY$OfFCq8)2!}*NXcJ;XHi%Y&4RvK&>y|UfC^>O>BNkXdZY3s#BikPIGF{j{GmI%lS z*DxJ?YTFACS9+fwgijpwKB|{Fn`98Hj@9D&aTRa8@xlPTvWCwN^B^E>vc}O=ut-zP zw;%53M?-$<_s47T#&>4-i@+jOl)o^U#5621abrlR(5F=4-LKU;^q^%C$$b|&VRU+Y zPd!)F{dM`&Nyrw@s8620;>c);O7=CUs&|e7Jc$0}$igM7$~oS+u|&Zou`7TY{jZIa zJyd({31c-FWS?m;L46zcifaNmM^4Q}S`+?R6feM`Jrs5UXrbcbY_F{5mot-(_E$FE z91U$->)v-Y=!hwDwGCp57ZAdBo3YtejiO4^^ym>n zeD%iP{HY8p(1g={;|=O7jzMG;k(iUZm2Ef|&9rKimwxke+aQj4(=bjg9e+mWT0P;O z$b2eL^$yBHqmMjIw0`Quq^U&nCB7vDXGs4m>tzv5+N=h#NS~IEs;f?>%(PxFnnSDa zT$UwX>aH$Lzf>>>r=%x@>JPffs0b+u%K zKB*yeK1pu9Q8V{xL0=q=()_dS{jTA_e%AMzYS6Vv>cd0)EZE$rD|>QO%f!ic=-GZv zPm|WE$z%o7M;Nw{+v(%&D*LgNNG&&?^7gN(H>`CXo)_b-1?`Dk-H{&ESK;q}pNuq9 zwF5vTIioc>da>lXVpLR)2=Ejznup2Zoa-^lcv3R*_JDITdE%0t9ac?Ejut~ z1RFu;TC_pu4W;;PKF*ZLt=n*PvHZ^g28x((|FG*a9s`8R#BMo~t@TXScW%Nol~dr9 z{qS|v9BE<&r}>W+pUDjs&Z@0VWYOIjzR3L&*-AGG)x&eH)sDDEYn}sxmuN{8$4gy> zPz7(mY5b0%W=vWG%~8yy6>H=bbv@;XLPD3emkO5h^&`(i$~ckEdO+D=8VmL|sKTO=|!L5@oBvtAUJ$4R!S_JGNODR@bj_*EEfOQKNAu zkT~y4{`)OOuRE9qC>5=Q2)AYzDJW>~-K`eIt~n+;8MmY~GmU>{qv`n3ZDs5f>SS}m zBE4JvEWylNVT;C4wgRPJkyxP|{?>^)l1)ARxt~&*LNZLEg~{Ot zNVkYnHz|AyzKA_RO)wq{+Dgs1*$b+y`>=}1;TNLNk1I&P^wlqS>BLh=H|MM`&^ z)lgd5*LSnUNfzm`+3MwX&#u#@+P{7oUQUwePkD;xx~XfEX4EhqV4j=gxM{2Y$@FA& zvE6p9_P*lvMRZm57v%krboI2CIDM*&+cs;0_#R@*wr2f<+I5VVM(D~O6nGX@JCG2> zfP2&V&in#U4UsuxAEmu!l%*`yNF#R2pGP%tX1P$*`h@nlPJ9c~uEyK|_J$d~wbOUw zcpvxdj^EYbBc3il=OccJN0-sRFl_8lZF9m;_v?7#bTl=uV!U)b|3Ny$T`fWHM67Tn z5lK>W6DIS888+F{k)=?^md7N$MjST#o+$m#xf50F@|qJL->tAIo!&Vn^K@-)`*|3j>UxG^N$BB@O|Xf8+BhS*BxP|M{c$M;R}!54XeKBA z^(OguuCaBe$ObM8->9Y>1>FeDCCgqK_)``836}?p>P`Fa1eS}%Drq~MZq}l1ZNz&F zqg!tvOT67|c~hG$i-zkiVwTwa6+QT~P(iZXV8?x4TURh;=@TYTq2iA@kO5J)z(MXX z4V8K{Hu&7`#s3XOZ|FO`jo&8SjFI#nN|UCnzcfcY>-cVo{2j8s%!?|A!6Uhz$tix4 zhp(=cPvr?8tKuA(rs%j$4L`5Uft*RK7q9Q$^ylwXSakJO2=ty~hYKw8VLCRR_oFyZ zf+il;RdW?zUOE$z8%KV2Z^z*d+DB%j3blE>$E9>wzC`Vd4e!nwgT4GfH|FGLQTvJ! zfMQH2=l#o9dopN$KhjBL9>Lgb9AJRFVl&ktU(4RQ2-Q&)jDapYN+#exZ=cEty+*%h z8JAekXF<4Cwm7{-Gu3cdaOW`Ivo}$^`s8ll`SecGTa4wQ*6dpxv0AOhf@BnyJJ}Mm z(HZjR>HC>EDom;+e*y7r;$qjgms=d}@vD>%ZGr~e$mJXPGyQPy24~>QV_gLo8@W{c z_88rg{Gt#?i2nuL@G6kv#bT>;zlq0Ocl34~ow#+Iud7Z?;{L2vKOGi5%GZoZQ@PjC zpH;eA(_BPpC~0wTMtQ1+nQBc!oG*lAh|=x!%BCk8)nn8n@z~VA0hagJYw<7yrByV0 zcIZEdugB%T-rR9WQEzti>BnO#w!U%GGn%pvSOuQ=yNd_3a5nY!qn>->SAG#S9v~+3 z0VjqI!Qj40UdtavHb>|s;Z3l(g=_KtLIS5}ti^uRmS>-;u|`U4v}XeR=1!E2EetPG z``r@XwRBqJBVb|>1Vw)u8GsaZFF@#^;F=!S^#c*|XWsYmu8OE=bqjr4y!MpfUD9y5 zP2{Lng-Gkd>TXU(GhMESNEFKP8?k%6(_JLnaGK0rY@=^VjI}}9Nirel124eN>z}YL z!ZArN?7-f}AG;tIz-5mmZippw@MMvpjETvnHEF5Rt5Z44tbpud@77CFJV#lbz8kxm z8c?^NpM(wsxz86hEnjco=o?4PkD+KpQvb16{{u=;W$#m;!aHaN;r+6gh9$Ci}$^6kpp zn1yKuRb?H==!0C*56_qxF+&oDA9e{W=QX{7rx+w!b%bLjC0viy4cz>OdJeu5DAJ1K zjjj6XM~O7`1NspJM7bVf_+*l|0b^pGF2{B;x&aw8qcK}IldkS(h~i?reTgX z7m1DsaA{`BIk3u2^~0dqB%i*GmhAjQ=Ix(8T>9c7*fTnsLvd>gkdkw*ykkD&8pp1b zpEq&j?kgu=2gbS6hjtVTuW0TD>Zy5ur0lOOEti1H--ukAc_AShME>guM&XQU7Nl6Z zCQMO>Lw%%4R~=SEtv`!T=hx(EMHA7wulM(;vyl?K;-|Ij(~YMG-U0+^Jzvsdm##lG zye5NPiFZqDxgBL;PT-&WC~zm|$b0 z|D=AQ)6SCe)fi^K_3W|vGG%nzT7;?1*{SPcBWJZxrZTaXMY}%l$2rz_I4G<&#BDL( zs!M8Jx%FR6$pxG>Tj}hzDav8caHUVFQ&Za$VEhnQb;%>+=Jdy5IFNGym3LE+F4!2( zxtd-rEQrLiMzVvQ(B6{;=JaF?jBxa>M@`1YKtW3yCVN_%nDpw@SC7~3Brn<7I10J2 zDUbIpvY2uXBa*KK2#KpRp^TNHxjuPKvw_3v<}#7>MhlGF zhs{&PyD0=>fBlYpVQQ7s^$oQB@5c#3_GIhzwC+lNa~d~l{{6dJfW@fKxp39kxOnzi zQ0%YOqeF8#&h?1P&3WR(LI;4hepCCIb^B&LIB-huHaI@RMkAu2D!Hj3Y>L(_T!D4{ zWVFq$(@0TGDxq8qT7nk4GGFa&B|V7LRx~($zpREQ#1?&iH-FbM5-ECIt6yB0E^tsn zyXl!*Y{QV|owHjk4%}AeL32{)C2yXtBG zP2h1@*+0&U7aM*R2rCF}chuLt_K%b4Gm6-T-S>SX%!a8@@Rf1aXo9DL$t0zA8l$?O zMVN3qJu~qIqEk+vD%kGM-i)i<4fy15tGQ7ZSQe0a?r2T+r+anOU%rN!Q-?Nlo2i?Aq6S`(@?XmWGfFFj6tv9`vg>cE%Uk=EV)0?VR$ z<8`!?g|yt9;xiZS$+E}B6r>xmku$)0xHOiGBy8{fZ0riz%j9Cre{MTF49A8Z58vfR zIN`9`wYM4n6fZ0otfiI*8RRehuN0V#5jyek=cI&DuCi5u$zxd#m?!;M>Dnw-voy(r zXm`Zx()NZ~mWu3cju_FwQ;zM@W5?C8{a6#|nvNY__L8O+qkVpu5pjkcNTo>z^r-mP z@eH9sj3gZDv@IRYHk(|yfYDd`cX6VPp~L1f$Hb_dT>^Y>y5gL>o)vdqj>sGlt2(0C zGK)X-4CoAtxt~~20f$WNiB#$8PRMuSjz7asNtY7OhNvjGm61J}>wRgv?UF)nl0RGS zc&9RlrLl=t&%Y8f2@GQNRI`8cCjYmZQ~Xrt?9LQgJqJFfmyx`r&XPd*zNv3Lz6fJa zW}7#O;C7LnY|_;=mSl6_jxg3h2@^(4u{1vLlhI1JE}0ji#`rx|u{>8ytkV#kqfyDE zX-JZ|M=4(s1T+K6Im){c%2t1rzN@Fp$ec>t5BsNDpf**SjQ=9CZYFu%qxbUFlnFVg zV%buB{OO5spN*gTgF^_N*H9J-Un z8noAXaQe1Q_fJd+$l=nUDsFfg&V)8Row1?vujuysWsn>|-=|h-o_TXR$-`s;Vip(g z?_n&-x)%>o^MFZN3cd}Wj-MEI5H*zYM5m3A*x<1CGd7fmN1^UC?o2$j-Jd3hxx& zU*ps|*7Xi;A9=&D0~aG^`J{<+d;j>`%k(WP6T>c|RiYi~QThO~%WN13n-rwaKetGy z!v95R1m%OUON>24%}1dn@0x#X$m69F+LGRUEDm_7`A3~zInStBA|%n$CRYDYzdA!( z3d7?Ise6VPYZ>ZW&AJkMEfM zbRHlc+Uqas0uJPZ8qVs=PojbCkUo7uysQtL6(`~c9#v8~v}o`)Ibgb%$-7waC2l<; z&YA~S$k=SmWI;M|aC4dnVTQUP0x{o%@(G_n`n^lf>CVB~7tNN4%qK}uAHzq8VKWr` zrFqp8=u=!H-GiwEhHKk-S2_jzJF~wIUl}l0#8ZtFWq=ZlyhfR8P&`5eFEQqb5gpvV zA~H1f^VIi{rr!j2MCO-%u9XHMe$u$J_emiI9IJ)iw6aY`bHOrNT=wL%Ce8^N>ERPU zvxlttX5Xr;`86%s-3el>p)?y@iHsR^8c)lh!m^i*V5}>_D!lA}nOa36Cv0@Wus5~4 zvn*RDY>QXzljGpqn}r1a1Aw$o)Te)#zyIxx04##1BbFXHu44p}k6!W>Q2kSEf0VCY zo>hSe(HMYgdp|jNA}E_z$0KDb zi@TeN?oz^@c?S=MCp7`RT@-9vi}V|C7?W6-RvJ{8J6iZmkSw`5-$D|{?;gyt_H@#I z@KY;5j`~8b06XkzO=bI!{r4E49^qKPzniXB(z=Hgs#g;3#nh)pWqf%rvz*F+}zm;f*q{e z!nGw|7;QIbR(_f_DAXUw*TmKUck#wTHho1oYG`31Xo6(uT7lm$;h{wIubT*8Pir@z z-vAa%Z}KGXQ*M1xsuS!4`~BJWK}5&G|4R7Mo;H| z-3IEW1+8A`IsOjzZi&$CDD*28{dIy6&^8m8zsBs|`3h$CeZ8$cZlFW0J4L^feFY?iWo);+i`oub{THZ!p}TsJL2fKe8vuP7^aMz_!%43eFi0$ zvGY|@SJ|>L`_PmxTdS0{5M~4joOnX#Sp+;X0G0T2i1r{LiqnK?Q@LLm(cxAAQU@I+ z6T>`3g>hr{;wzn5kJks58W}X0tu^E{lCD(Zy2V|6$MdY;gh)xY%f!}Hc6cu%?KExg zk=|1wgTHpNzi%p@j!Ke`n7IdYu|zx;w*tRAoGjdeZZ-#za(Sz`p~;h_pwcMb&!@oo z35YbhHG3huEvHKjC?H;Id4>-cENc>$J+juGzi_h2Tmu9H{>&Yr=;|75*aZIj+4T_w zM<{~Ker<@3BW~e7uvYUP8+~`7eI5{$RsV`B+M#*eQ z3UpcbEIvND!T+iwb zb)0@C#}Od$y1<~XDKuxhSFWj5>|kh+$75mTud=l-&6@oX29YnA4JG9c)YU99u@!>g zBu)!i3??S!sK9OwZ4L^pF5SBD5*u{XFa9K{|2_8t8+11{-z-@Eyw}>3=B85)rga;w>X%T~fJcTGAqH#~?YvpQjVA)$yv>gLwoybe{g~06twL z0705i?V_~})37a$sFCCyyG;&5KbPjbzT1lv62jd|< znxFJdVD^mR`F+G0Gj}X$#plx%^N&RiCrUqoV|=Bu)z7Zrvds1J5zLEhZ3PB4 zh*G72zDI2uk?kg)D6^+3)D;X3HJh2aknos;WkUg}n!O{7Ln6~z!?Pl4OWgcH4Pcv0 zJ~xW!Lyu{<)oeZ6= zYXV`Dw;Dj!Oj_SOMKFVmBj!*2JtL^`!Ds{e5Q3ZYI4v^7Es%XdKH~&YCZemOsqM~zHyIHNyf!k~ zwH}y>i+Z&;yEKvzYF;~OT`pB?tvgR+bz&ZjolR)9@a#P7(auH~C>xC$paj+SDET+V z!VRc$Aix*THuNet@U{EJQb)V(NI12DPKD*t1KNZxT&gnOb%=eOW>*Q4uG~sz4C=5i zXGLt}N>AgOoo9ZlKT#BUA#XJ-6&3~c3f$A&$)QmaUWViO!;l~rsU+&Y)KX42V0+?I z29m;6u77Z+Y4O3qZpS4fk@}RRM(`RaK?(p2`->C)dlUWAw%*(WUmZ>cw6Xc#12^zV z#gu@^9>CBGxi89W>kCvmq0)zIFK!|8f@GD6jer^YWb45Q@EVY*?VB+1e~W|m@O<;;raBf;-?l|6eqzPyYPid*6zfcqG287&o!dU^B&!-vMW~{q-!;RgQMXCMLq! z^&)u`fsKR4DGY(;%c--q-Ip{(Tc-9Uo|DJ_trGpCe86D;UfH?+tr+^sh@jchvAG;f z@vHvPD}`#KyP4I>gq|C6yJ!K#pv)qwQzYl)%{#c|L)Tt5S$uhAk}8ev{^iI{lP*qn zn@(miXJvgauB%m2FH`He-7l1BZbg`AZ$*BMZ$^>G2?Tyvla3L4Ct*#BgQLRyi?jIm z_w(`+9=X5@5}30LDH;WpjwIPr@Jm~`9m&o|x|dmxBx$)=QJhTJSJR_t^ttpojjC~P zX)zD?k&!cGh3Khz6Y6oC!$<$wrCbrUnF}5+uDn87F^69_slpH^u{7D4Xy9x%{s_tBtAoLEn`@pZHLM@m6XG z2-2c};d?8X|DNI#wfrvsFQiZPODQ8W-qF0{|5jPb9wwob%9#CbCqHj<>TPNH60>I4?k+KAE z$UnorbFWPmzVtSuA@QsutkS$xs<KKo)m^I>a~(IgmL5rm^FYhOJ!!h*kvYhv7<) z-=LNrnE!#vb{Jb58?C-H_BZb|y`)U}jXW2L=q-D}1HFD(OZUym zvAbR*sEPQ{Lrs9s{{1ye#$W$j0V0S#jC?}e*#=0HOv^{I2>s9rv7QDt7Y(emAX#Su zMu_5SBSXVZ2ldI^*l~t}WoXhyq?_NTJ@sIi^~eQM2q;O$fux{7A8eKe^1f-1iBGGV zifTZq^fy{Xgv>L)!z6~xi{O;Pi_`F891LBzZrGg<&g)=l!3m3jd804Y#i3k|fDSSH ze%GeiQsX}^^+jpl-sTT!9_vkp?7{pox+4GnB8l{woF6{2v0oMD4%02xZ{y+y{%9UK zLZg7jL-zG$rgNWdjHM|$J!Lo3+VXSAKuDN?TFnR@+-UQJ@-%$x5qYLRP^4j5RQM-O zR_T(KXqnLb9;Qe!A?^+H3_oDIK?(^Y5+{S+bmVR_4XKBz^;FHAmHk*52na&Ou_ix( z@qGYQVU`wyML02^4-V?qpKs7}7JgPbeLJ9uq$^LU++++cSr&LSV-7|y+7L*N< zH-PG6Q4aQd?(+Az{vpE5%sU`IHa$WU!kG!{y-^u-K$FAN{WvWY`r1{s2$jqNwL&a{ z*Pp1#1SfmUr46ad*k;Y6SE~6JH2YWi{{4N!LhDDU{M)g|m(c;AMMi7d+&}u-f%~U= zvR86|$j>lsWmis$oA%*&CU*=}H7a%lgMYXI0dS(0>ki7lwSAqp<_yz)`Q}2xNe_{# zy-H@@h{$0hqFVs#6{wp3Mrm38H$|x5%`#zR8lA~--2yyn@fzV)#SGKK1ivLcR#>>n z3%_vLJ3Eg-PQr`Vh(%55^eiZ|-wfR%cpcF{`cBAc zv#9bCzw~wPqq)8-KxlDZ;R^4w+VgQ#NMfq_i0mI~FxH=NCUjFCZzSx$KcaO%ykxva z5rjISSS-J55w3@18v7ujMb?HQ%TiuBvV$_4~pVTsfWJYe0y0_oIdU)VGtY5l8rxUDcmL3w9#)!_LO6 zN<+QPM7BuY zy6f2(l2FDw;nr;-chZ_n_{@zN+kEbZzd(De6v>0ys+r=C&-QhHZFUvlFCGyc$M3tl z&(YB}^`)G=dg%=V)wsNk0}d$)53^j#e|_cS3o4FWs{X_mQgli>$FuM%^WIp2;|_a$ zQrVuZ4YpbKx)iJ<5H{B}k_gLWu}JiP>>BApI17FBF;F&*u8+!|ZP}P~w#jYDN}O{p z52EGss*swqW9@o}&)r*+=N2&N^6xJu&|k%V+iex^j&0l@K(mo#S#X(hc`+jKsd8wl z@YS-N&t7{VPtN~&ls;+){*d^geTH@j*Ld z^*43qxge-a+Iab_p%q?54vA1}>>t3(?~gF*7Wx3qELqvnw>kQ%yBS~8rvpgAjus<3 z6?j*ZI2n+f8(3*VjSql7KqP4FQ3TNJdWI6U0BLTH8D;D|=GuGen5YKWVop~H77`4V zfW(0J#>G~RTGjVuw~md%bBPVC$JpA=Dv}1(n1XRCS_zVb|1v!K$BOf>`pTo+`-(5k zD|Bg0Egj+$-{NuO1#6> z6U>aHa-bAwB2X^Exv%=m)8~IKXfLDv>PRa4(_N`DJyHWY1FDQCm7n5IkpLsCV~pkp zp5N#|Ig#VR!a5G%P%i6_x@8|en=`Dv?&|V1hs#q1PK51+uQB6E_qfsF{O3? z4Av)QvQIjWSUe3l!nv;~b8hY+>0KePBLW6Tcy~_n?=wI3t`ez|Zlz1+gENrVnrq+K&3eyuesTA31DhJ3-x)O-x7=F=xR0?hE3aiZ zh)A@L>6a%b&?Sr*PMbd{!iXVa$i;^M*}NBSM8mqEw$pb88L>TX_GG)Z2c-Sk)nA3% z?vdM>Jh+_x@|UH|f4boOaSAr`G4SvThC-SFLePNuI46$WukCw_6)V`=1yYwMIB`!mB!&KNp2_V(?0_t4%j~3VvJkYBZ;5D({)m^ z2bmL4-Kp0Rvw>+%^>T)Q^Hq}-WMC{+mQ!NDXGU=llO41ajk;%yr4vcK$f8x@lX;r7 z9!0Er2EU zmDaZf)i7yjoBXh~ZuFIK+upU=+I$s=W6>;`;v%G7r?{r4f7OU84Fw1q)*=Ghw*#iR{I*`_P)Rl>N%AFVHB{oE?4>BI5^ZiDg!Kv$O zvDG2GWci4cLz`70q_NJRI1B>cy}gBL898J<7g41LyNYbk70b-^Mxlm@Tr^&&lwrb! ziQTY#GsY6Pj~_cz3M&11&MVI1F`l)TZQG%!rFWUW0LEEQ@rl}A@uJ#H$aDy?4 z!|hJQR-@6CjvK%4z)!DqLh*KYHsW!(_GS9AdgU&icv zQik5aG_4DNUV!tM-pR(fa!IO!S$!M&!X6OG7PF4ublt9g5P_<&Mc8qx-26A9-=e3& z+nb53fWa914<+NUY= z#x6U>M30V25F;?9cPE0Qi?OzcI@?d3~(&`mN@W#zGY*g5jzTJWIrvS*lFb)ZGD7@fgJ#FFNa zQn53!$7V2$^y-)R=3n}7`mZ?f;`G&W9IZ9uq5?HWg#4#xbNF=lyc~Ip_Sa_u`e%xJ zArks>*m-pf_`&@@4nsREh~``|%Fx8J-v`<&9B#pWW{xg_oFg$O*AByZXJ?=EJwxW6 zEqPzsbo*NP!W_+29k*T655SOR8>;V<4yR>_0yZulXd(lS$MxhH9c&d++`s+>4;*xdj}X zN^?Kv$($}_s@Aa`nFx$4o`5n72+)#!fxpE^w7^Os15vtfiB62jNvM$UZ~@HHFHXSP zi{@}AB z@WuTkKXTqsL_mOe%hu&R$1*pyi0xqG9ousvKTjU7nLsZUs%GbPg$v#$C`jKf%3+fl zh(dBBMiTzba{B#okwzue?pVlA(elgYo^(-mnV|jI`RAn71Q>7}_TURsV`|K6RJ`Sr zFsH2qrta5%WY+}%OQ4zXGwMIHB3C zv#l*-goob7;TW_>6mTXs!+|Iq10A%2A^0CXVq@sY_KN!s^8$2fCDWbOXwCg7a=Z8z zem%m+_NdX!Nk!Nbq>MjDTXu+q0h<}G(x2}TDZjM?vO zv3YWeiC4dz2gqE&__Ok1(S6{9QrL>+-cE5X94|3&vJwiw_PpXEjh97ZJOo$Xj>9)9t^{&Q0YaLV4G2!|`6lL{o`1Mo-6SH_y`nD|ITo`Qw?!2>Y!c z6I~V7P{=jbIiX5H*I<0o60DWkwr;?x?UKIT>#NpmxtCfkey6kjt1fO00cm{dk(cs+ z88c*@XED^qo)7e%_OJ0jgwLS0Bq294=yWO-9xD~1?WS%5GG<%MREy0l95~IW?$4Adeq6i`WlDc>KTZBi zTTUsfmU1^Nd647aR3$q;eeqg|Gik}GfedQ|I1B1(=rQ!shA<-uu7h!VHj`iR6Br!& z9t}yH9F{c~Q!=hY@Ms(cg~#n_9C_DUu~BQZabrRQRu7WYN8P0Rq5B;SVPzoCkNR-JCVPzuw0-C5Tyccok>-Bsj$6H%SJ0SJPx(!H4P z=?7ucacw=oOvsF@eD z#MINCN&|s?E*Cdc!2?PDn3#`_pYyEcLJ7L>soq>N+c31w_D4Q7G#Jd&z`ur?HH zUWoLuf1Zyb^9&R!==iZmI!*d#=V7Jt94~G@qPqn(yNj=>pkOSe+V;A<0bjXPJTX{r=#&_+YGfkr{AgyWaE!Q@TT#|<$S=LAb`Q{q$lcoL)GXc#pX@r{ zIMIAp`R47MBeAlmq35*PVs*|{2A!WsPp%#z9f(oTy8S&j_iygboY1zzRx}dQn zDp#nJav*}kctgvlF6&v&7*F~p3aT?CJSKpKi>Pm~4X;1K1(|K1TUp!_ZdMNjtfd7_ zy=Qd~{&8io;M&s;m6-xOb4DeBQ_?Zml`Q@Jry-~%_k`BE=eaa4RipNWd(V;_vxvA* zCU+Nmx1M<~-S~68SmUo93|N&ad{{^GWkFmqNLJs4#fA;R*7uDRiKqvh$m~MyVLfdg z@{IRfSIETM;ugTmih+wTE_E7OB(Mg4R7@}}?xTIWYsZDs*Qvwlt+fDJl zJCa#z&Z;$TalGw{0?lOqs-6szab#tsyQiy!qDgopLoW>(Egl<3uWAU{+NI+N%(BHl zm?H!xHAerEVzWJsigghM3G$K?>gC#GxMO9&>mwepy{7FLHR0jFL)nUT^qopP&Sf3) z0soZrn|Idvjzh8UpS~M~z5kX#+>-R{V%(5!tX|Z>Ry2$_8|h3reGrr{U5g^JE|?O) zuZ}z%ZdLV(Mg26_0J)%{DxHN)0C%v+7nnPrN&XEzST^sGV}D%$aqXucTJluI#>@7q z-sC*a!=2rwbz$sUV*EnGZCiDlsW5_>oOo8w=CPXh(uIF5TA`?S>OT?o#L@{Tg5qmL zG&RR6NrtK{ARV*JBJx;fRF%^cCc{cYxwr)wZ|W|!w= z?$erVndwB6xWMF5aFcsfi-}*nfJ>Fr$74+{$leAD+Zt{3_Se8JwmcGTND6EOLQErj@9u^4C-2Z0t=y-sccx%0~`Yv-gtc6Fn2(o6hmlN5yuuzkf(hG8|KlK1P z%Z!OeSBd|sfJ+j%-JwL_8w%=xnK#`VSWhJgxsr0R=6KZ&$vNtV3r zMoh`9?+UInVA;Ms^MT{dBWd@s+cWQ)ZZp}qat_VR7BueZ_{Lsk zsUZukj>y}IZbq5ZFugmu!x(AbmYQFJJ5Btrl?T2HJqk})tv{uxn5w>ay#RSnpKPBj zPTzH)_$V_w4R8`WGA|DjPbEL0Y5m2{ZETzolveX5&KZ3Uij=a} ztJvhT5O&+l^#yEVMG5kK>bt^BQshOKHVwxUTn1nRod@;b&-7h2C#D~E=>*h^_CwFcQG=7=VY`~@ARZE%lgdifT<-QVv+GOTztwl= z3JGtX_?R2_5ck@jHmLv2d7@s|xDm#G;F^=V0AQ7vu`w^}Q@kR5mSwJ~hn%R?N4Tbu zl3!*b^Q*~j)Ige?E{)CY9^W>pT16T6PdQNvQv9psSBPZeWk2AJlqR+$)Vxga;dhs`MmGE%t$zcZ|6d4* zf-)N~_s=y67WlwsarJQVXQ&Ocr4$&sQ^DokyyS8IFYUqAZgT@eN8sATMs>RWG|&Mq zGkLUQN4w~xuCe${kt7Knt@sOl2c-B*7zKYNG@$XY*z#a)y03<>;BV;a%F!n4?ZW0> z1I7ncmCy8PyT)@~m%fnQn~6$R>D89ZACt`TR55)PMgYPg`R>+FO)Z!YzA~ZUb$Wr$ z5X#jCrMK;hfkUPP7$zvLGq{@?0VG%+Y0n>1o1^b%toLtO@YR0Wq! zW)5@h5bnWYs*ys;>p~JV z0jt=}q&v`FKa|#5R5lxmDI-iY1C*x7q1NoW;b>d~5Xtsm(kagG9asn9tIufMH}zw| zccT%Bf_lJ7h_WuLe8?r}GQoU~_kp~i4(;)M|B9+#euU1TYc$mFz)2^cNy^tTrtWH= zTBTbIGh(bBzDFeAy5F1$$kXBAxL({ zCmK&`^55N#R=d;lTrDQ;>(}#y*#kPUJ6Q7nLz0dLT|+HM;~}(g>)!cfJVK?BZ)G&V zTK#9VAKJ2?atlaI=w>5yR{0qhcPpfa zge!Z8IGW5N8ylOFFPo&B4vpoc=tY{q&3n+kYAYH=cGz(%HPlz`FRib{?N`m3xjh=S zXE{RK%pYD#TzDdv88LnnQRQd%>h&Yo$mA@z7X=9(pC78A;XDr#`+N3X7NHGH zajIR30_Pbpk@6_4C5Sdn-SD@gMoxEsz)FpI$m~8b)-!nWe`0cMa;%^L)?q|K9KV-k0lK z*WsKQ_Fj9fd#%0Jeg7g`3>A#SD6ANwzak3LdM!)auamNWRX-nQ8#Yfr#>=0F)zf0S z$nL}}+}pQoHH#4Phu#}lrn4Cl(RPwZfII}CHGu;SVEgbS}cJJ#U)GSH24ZHz} zeSTuS=cFWi)aAMOstAzYLxR`R^v>#CmJ`b-{qIaDb}p(l_Q}R*nLRAm?VwGGd(7w1 z-r2oacB_oafyOWXtg{t3M~>6k6dUdA=G2jFVu;y!&q>n%n#*Yhdq)vBsUD$LZ*%`9 zRrsioYto%=E&}TY)V8gYk!1tv#=+OsDse0KMam3B_fflE&2(#CN9E~Sq}Uw+JanWq zRQ!0asXtnUS5e7r6+7_Ngtnooop+X1XWJ)~i&3uMteGqS1n6pXPi^a(Ex2XgQ39tR z+ROVUc>Qa9|EzMLd<*~mqf33<9$%Xa%6yd${w)WVgwUMD4-u+0Jz z6Y)0d)>)AJsjejW6)@oH7PmMm)_StqE=%B6`8=3Uig59{o)|N%%+YfOLSv*t4aeYa z#!kz?hXf05N!CRyn?=t?-r?pBt)-wHrg_`*#^r`?fLnF5UZuF@Y89EngLAWHPQAqL z+5GKWowU<4MlY6rlBmwWLJWzV?m+93`i^sU-XK%eFy($UR@Ky^yOsSnO4-`@M~Kr& zE3c(6I6iJZ%22ZxhSjGyidIv^Md8cqIy$}T-)P=XldZ~Os)Kz2gvTP$EHx`6(Egem zlHC=0w^N2cbK^ar26;ruY1bhD&fBP_ard_z+dMY%nsv)E@H ztzJuuTtQK5tJw%qvoyl%uI+oil=%y4!~kT)UMa{HV%uFY;d@zRlWnb#xpvuVA~RO! zwc%c)$dS^)nA6E~%}BP7g{eVGtI@=sW*ne2-2#YN53`XALvWW&pg8CnJ%Yx|#v6C; z(^WhR^fJh}E&ny4#cgH5vOZ2_c&DYmmys6F#rVgH(0)vW)sV)OT&%V?N3D5GTw3DV zpdxw!R74$Gx;{Ncy`cGW#>EZzo1^oZ_63V?#1d(9MwsG*oveuNXKjY%C;AFShI#7v zfy*#Db4}~&i*NSJc~H*zIm^#1ImQ!1P}GY;(BY0W6lQ_nU)%kW<~4AjV;Yf@bU+KI z2jn(N4_7TZwX4EwzV7zFuIHq}B*>ySRPUYF5iu{p-z+`@SN>?~Hc|s?c8S&-Vdo#X z^K~k*Dkl4IiZWqA(aIp|NYwd7ha7;AW7VmoO-12iRaSke4MOWjd^W$;%Bj8b$OhKu zz?ZeHmW-Z$KMlm_C@h`B5%!B~GKP0)UPR1A5b>6?l=fy^50&!I*GM&;S7|j}k9!N% z64jzHpm=)naXZQ(e`4dQlKlfcw>P_wSt#9Q{qt=9RnGy`W(I_}`^I)%^>v&s?#f3% z`%Z6^EhxnISas62g&n030w3jXLjmM*%ump9U{$tY2Deou1}r5GP~tM|XYwFx6ABV? z2_L4#nb}*}r8!z{s=w?$>@QVv-HXbl#wd&*yos!6;8ix#&_`Of|40Ro^oaHh%JT=R zx4}T)5g{??FhDFAsfJmBSx9(w^!ey00@qvK*hG1|iT_m{m3E3c`vbjzI^A5e6Ke|I zAN>)Nc_`|A>X-s^B31l?H-C-VQ8ARjJQ6i=ko0Ibn|P|ZRB4K}TU4yPvViJ-Oywgd z=Wb0#ikUS~u(dTXSz&7brC|*G^x9E)1b!y?Z4sK(O{TX5iM*l!FRQ3_lLR(ggv^aZ zVi?%$K3ln^lZ)nB<~l6Ca0C)<0)^6OGu<=xD}4m$G3}rTILsks>5}>y4(BYPk{&tf zj@|XhUQ7Wip%Nq4I_5 zEr+NlOO3?5VbId3R7=b2xdDJN>N){3PKRlQ=EsiNc`5AziMTA(Og?5F7vQ6OkZ zidQtpl(oE`XK;6+xU8R&w{`?mCwIRBdOo{mM)0c{fg1rm{3W&g$o-wa;D4b46gw+y z=D{~Dn({=PRq=qLkzWKY(p1c(d>PYS>xPz5=nsH1dUm|>sz7B=W}KeSpEGf*Qx%_j z7qeqwPB>Kxf<`80pXo&4hN4x4AA=o&sDb(?m(-}t$NlRg4AY!%AFVSN*~fG=!NNRo z(_#p3D_yd`)<5m}@S*}#FJhK4jI`tni&HUV(>_V?N3nO#ovC8!w*dQho|DD8#?fr_ z3+aW@Q3eoB*Zw-OhfI1aOCuu92gI|1z++cJDYbcIT`LS()dupma{zi?sOfIe_M)(? z;TipGD|02r=y7|$j94auLo0v!EMazL0oqEBc` zcG4S)G6XCc;E6%}K%&~r%1z`ZKT66To=w;pD0;8dnU23Kc5cCwHqF;3jrvB#pb8(w z8Ml}fy<2SgWzvAApX9gO4qtnAc}5T|cuvC#ZVX7rDwiM^|5bES^DvHF=1MiTMcJY`$oMTMpr{godfcOM$;#!JNzwt^x+V-ptL!z z6|og1m?@b9M&-+7Nd(mUbXC@UMk+W{`uK4Ups1#Ta}U5UAbo&A`0GifLI2!Q{C>o0 zYGE33+G-1XUvoQCq2pnUCT`DcfZ_S+3}K!AZ%?pG@Y#mHiDi3gF!Q9(b{Jv|>p#lh z*Y2mtmlFe|2JpfMR(Jm&^vAK3GgHDQ`$8r^&AliDb`@S&5UPJsay|)iw&{Ed7X)T+ z6;iS1OG@*2O|_0b{s~YR z0fo(Xs0mjTUaU@Xxr1}%0+U4%{`lPOTIgnR-3wKCzML-FoQAG_I3@Q=4NHo^H@Ym0 zclnN~cdYvxm>&Q~M;dg=5$iWQhA{w&RsS}*K+G&F!MIw*vZFEhSXJ}w=M5$Vq?DJU zU|EybT&vC2j)J0anxYGw)tghH2-*4%y4X_ET?S&QHC^>d>r!3kVUf(nDC$F%qoVyw)_;$Gzn! zZ6I!KMi0sG2d^54P7MUPIriUz&EpP1Z~IjAt*nt-EA9~Gp#NM9Q^cp3QTTMc z(n2*l$|u9UJYOMb;K?{V<1X&3sidT|?$Gje>!SsSraP`f;d`xI3>$P%MRK;uj0l<( z<5QyW3CM3q>rJk7WBGjc3>g zI!~)Q-7%d&XuXUCrk>-Kl?2ooiV%Omf7(@Ot->_z#~kjL!Q0dnV-#Tt+bwQO!t_d^ zv6;nq|4#W|Rw0mk)9A&E(HDy4t@_n;Km2@#m(0v~(Nv&LAAj%}nk=I#}zR zy9`c3z})7GnNO-WNhM}S0oZxie=oTwSq4}IHCBLu_Lv@02AU4?J)>9KIR-s)dr4;__E6y zAAQJi`E-S`xc$qr%!zJ!i(!05R>;)y#eHD3+VhEuQ=7A7i>_P_ES{EzQPJdl4BkrP zMz19z`oRgsXD`s|gseSYpp<2@qVA!(`75w{((;LP9-e#R)!6(T8XOpy2}~`4M`_D$ zHV}VcI`>)D)1b_nb0Pl8#wNRD37T3Op1kufSeO$vNE?nvwjK96v&@*RJC%@6%Q;sN z-qYjUFMnG7!2!{hYgk-97`5`HTkB>eeQ9*-%i-v)YTHg?@96>hDH^@MHyXvzp8rb% z;>)HuegKv6t-3TtcFccaU46ZH021}%0pjAuO@&fF>pkzc@?`DA>WAfL^CSXD_xvT0 zwIp2?d=*y865614WA1uEuTo;3EkQ)>3|W$=r4SF3Q|ku>|Gf4M`-f#dU^f>p{yeFndZ@YAc$n^U}+fbVu5H-Q6!X@7J8?vj! zgR6Ki8&Ibkuy^MtIXTeeUl)qOt8DC>b+ac7$qtv+WSuzf<9g^- z3wtLf?I?uf5RovhSsT}p-LTMDS~kwy?}+KQuG{bqt{|UJ^GfjVqwy|ho1mK@%LRLl ze8NMW6qm=ab)Gg@c@4=blOIPgb~_3pecxz(+B%x(Ndl091|s-2@t&x;_rMRQ$-;JR zViNfrd(+~@Jx;*2ryH-tjm$l>%}RuBN*a7P{5W_}&k%Idd@C{JDnrHx(Ef*ibO3Cx z>q{2x-Y6e;IX^$t5T_G-5kCE~?j`rFFnD1{_ojfsz}&~Bp_(VrZUWI_tKr(YV?h&6 z@xF{*G^>Aw7|6{U-I6$b-NBOYt*-N+?S|l@We*S&->l$oea6RIXXwh`xhS2tLe`!n zzG&u+cbROMrj-6dgq{+Dfx$)~`KF*N=dJNlU<6d}o9q096Jlj2Vga`K9`+roSG z?z!$RWShKqw1(STFP2dLtK{u)1NkQG@gQfWPZS`w17kVne71&IvHD1ulLPe=4pmz! z>{d44$_D{1hSGVoU$hxe?ThT1-brEu)ZCfJ+~Of}E%TdKrrk;x=WM`hfqUPK0+XiJ zKmzfw%%M!y;1(y#H@YjVaq#SD_%wh*vfN;K8<9oUe@)SN?kJ{=b16eaU!adFrh8Q- zWP$)^%r zS0>A)YT3Gqji&VP@duj@pzL53X3}Q?+)T6SMijFeoa6mNM(-(?vwa2%@?lRb@pS1> zq`c~6c6J8J*xEm()Cn=$r8?%0u{MsiD&Vmsl#nSvhCPFIS+Qw60N|2KZ{cre;`MVx zH5%;_!&=4Y8VbIhH?5#8)johFnTo!b@o8Yo5~K;dl>*Mm0j7M_c#{q|RGU`-CXbVa zUC;P6isHumbt^vO_W$2M@V3SmEXs0Yyf{g)bLGO|N z)MNkm)z>dYW6YP)UWgihK&DRy1_Y?r{Nu9lkKWerv^}V4%a%QK+8CpegiZa~`hnIgw$n*O)mvYVJUiv15j zZ)VWpM_Je;Nb`baath;rtT=&d%ABR+0Z)*^^TayK=Plh?^H`7r-+KM=3?+fT}v7#>=VzLle0UUlK#0{t)6 z*bLd^UAn9u#+hkDAQjh$-u`HFLKnbrre+IhPISNb%Jn6IS z8pH(fj3k<$=u?mtm=u>tF;0gz-V@Tzv`{jG*N7Gu~+^J#o1!J_?w_!%}`o7 zoZ98YNLW>LV1%VbMgccgw?w9Bm#XaWNV6>j}v&PD}83*{-*o?Th zbBBo()Lf#VS0r;>h2YZ{6{{jX@<&ZnO)dsHU+31>HRfw#`HB1?yl6oF!&~yI_9^i} zlE{HDOnq2Vjan{a!+L1vdN^kr$VWW6^`pix>Qs%v&xhPL>)j(!9YZ>ebd2=epDL1n zL_#fW^$MqhE-EkkJ{+5USKqX6;p_s7L%3ra-2D`n+^tv25Wx~O9SXnSWOm6T_oj{E zK)w5Q?vyvLe!;`exsqQ)UGvgidPkPpuiQ#ZPUdbf;}~a7c+ntfu58t8Y8><*NV!+< z(6IGf)g5+(Dr-LsdPK28S(PFMc_e?v$6~0>nf@qlqq^?RKmF*NN;XD%>c5mgZzDy; zaT^&T`1*#L>5Pkm#4j1_9f`-^8abd)T_GI%W@}enAXhE>6>u0l^Z~YJx1}*7^@r<4 zTk1k8oll!*M}HT?fpr)Ag!T5&$ zVj}@%(EkqiBG#fl*+^OG(|rn0O?%kP-$hn7dx!p;0K>P-O) zPx5Rf+fYR7x-KNB@48mKhZAWSKhC4O*T02bSgSm>#&F=^W%wkU$MN)aN9)@@S*YzV z1jDptRrPG|!qd1`<8(#6jzS6MjztdSw;Usxh-HMAJ{qnre|k&Ud6v9h3qr<&aERuJ zHBc`tLHOUseKwFCePob~|4H|qy_dBt5cEp{$XpyzDnKh-k@u2BJGK7;M-w)%giQJo zJd>heUFrW3?ozj`n|Q=iv^Oi4DAgP7_BBUocIY%#_h_JT?t7_$92Zh!DJ$A)EfD_xxjh_!S2{C~cZpyu%lhgT->TE`e(jb8LD? zP>&N_^zt%=yX7V#AhuG8OKdS<_o!v$HD(p5SlSiLoh##GVmqp+sFii$oFHYj;&{;wDLUaf;@h1 z>I~l`tgbD6^H>qFTa*;QeOu&=m%%3|quuk-pzKgd?-QWSe9K4Z`9V8-j_a8J$^L@` z+KobHkP<7DM_epW;f<&&C?YFer~o(F{}@bGwa25meou&JPHTcfy%f9gGCW?6gN+RXk|y|XOzkV2&lrZst!zERX8Zhbm6Wor!bnlW zy%VH_?v?rNk%z8Q;pZO<|Gtuw*N&mnSm*rf+inFDDw*aC+l#YwD9@tLT6e=HlGR=? z$L!$~WmL^cSn#zUCzTz25wy>f)m6^zoZ|tA(p_X_f?8_y3EwAeOX*%-+_>QxXV}cN zo{`YXhTm?8 zy`1`<`{PHsFeB0}I3A?@!mglm^-2Fuiv==UQ-ry^4&7IOt!Gzw+pakVb%R9)q4Pb+ zJC_+dKtF22bvk(=zZCYP*l+hkgO`3Uu_`Ndl2_73KFnl#1cVJr`hNCv81=UY|nE zrP+aFW&2`_bT4s@1>Av)rHGY}fZ3^UI%m9C$f7-m|339!H8F5VBsG%3M)X-}+N{1n zJ#)({aVo7WbYDu;RQ^CH0`f!8rv` z7F>=!I>Lk^+xS}4#a&#ar92FdN2D@#6uc4?7m54~b+YTeZ1}m-mBI|--{qN14r{pY zLK~|(mM51{<9aKWV>Fe2o!!AHC#I{7>}!qn9D~)+uO|y6a_0g*u0J4K&8=B`nA3X1 z%5D=Tun3_3ljCeJEV%PpAB;bc^xu_Y{qEZSQ$+F~&97H6`L2gx?A5IB!BM(Jenk`U zK>h;7<^|3pgW~5r@&==jwz#&YUm7qr9$Dq513E#=$AO0IG$lD6ot8X(ozmF>sg*Z- zSP9Zow@S)u^wiaL=%`e4^1R1yG`P`Y6WfHy{yQLL%iK;skW401mIZ7TFI!r-@aDSPq4mFF98ul-V5k8aBQ%oy?pR`BAOxy0fSxXf2IJw?N)jAfqVCkrOCDyYk*^Y z*-PW*59Pv19cvCg*^N5X)$QkJcSZAZ?p4Q%f$R%Yt7fX(1rn#OO9|FI$j|FMA z_y%R7^Z(!*XU{a>US)8(uD&3d1SQE-Mp{OQ^1G^5Ydz^g+H!aOG`Ww%Z(bDtc%90h z&wU+N#wCIw=Wgr;QnVv0@ZylV?{}k)Zsad{a}8IEb%*fi^a!Y4xvfvlRx(>xf40^r zXWPcyDSMAt_Rf}V%BM6(AfS?ejq9yOQyw_fr||KWN_OJjD)}|0>4Q{X&WeUxWmB6NcY#f&nOGl;*Fh zEk`5Cgd$yAdJ%M(uC4wZeB0SmX;NZ7MOB6R8J}hHtz&Juo=xVrc)iHYbX7ebz3)dk z6TE)*?N(va+4>Y-t^+%BCK)may;m{gUa*s`mrpib&$q5s@jW_I_)`uCw25SFz$DPY z!GVNhqP5ci?GsIw%OY0u=9_*8$|-H#ts9v(ui1&U5I#2#>IR2?;NFlneP5NXBFOtm zoh>)HH>)u&B@wHxAj`W?-FRr%zi zg_QgzOs%MZl2m2B)72qX`YzI1;fnLW!e#?VPAMX+-Uo1}5&gSn842Y|K}*nj%a!_(Juv2CPkk{+M2AZ>&p_# zb$>MvEkvy7tyQ|B0LBgLpWSfLfA+!wTPew>sJF9oszz-4nIdy@|P zWt5GFlQsCQkS(XvM+YtbOlsIOhEzlx=0d?%BSRV(soW>L0RCwf2L?^I1l^Cs&S+hJ z1kGFkwcr4yo3_vIdmq(a(T}C!s&%bOV>=fp714C?aylsL=Bb zovK8C*0cl=D$4N!yDQR{bxUjnWG`Jl_g+;Q@LtfjydSdk)d9Z|>;n9)(N4CLNQRCy zA|O|q4C3-vGm6KV}f6s(YSw=q);@`%iSnGC=$M{5S_Zrv@L8 z)gqacJq$u$6zx2D)|#`6wj7LNfqbbRg(5wq7cFad)(2BKz}FJb!wS67OK|6-6qEn! zXMsqD3eXmzz9cC~8d}5R?2`4QP3*UELq$2sasloLD5`w`Q)UNDnV%o4fv0EDE^{Zv zFn%Ee=m}@7xUUU5tRN5GNehj;$O+Qye;Q}hHdl>hI+0}|%FAv|)){ zal8sW!~i|7{%Lm`c0>UEVkvxrB}4-doAJE*1I|8s8OE5i3A+YFwl90ULRGye+@S_z zYk>RD*aj}TO9NR=qk3`LFSZjbv<(o0w^c1`6B9H)FaC}b^t8gtn3vy+!h19SL{bgt z;fH)c3JVd++tFrNOD=DQJ^J1}#$Z_wXnK!->Zn zdspG$**74+p50&vj5gEPvw_)s)(tVBKsWJGc)_Z~l)#EaQ6~@HeZo&IXK@A!K>mQw zC1BuW0zqrA-Y2{%x6>6o!}}O1V?YKX>k$G(6)C)N64(MUxE_K)A4E$+ViVm^G^mx+ zyE3jIGBg`S&4BJ(P7*MD0zg;x9o^B%5NyjHNFAOJ(K(B>TAK zFN8Af!6`5Fa zrBugHT|Z=Uw`Mcu3uaF)Zh0z~>qfNJoOr@3Jkj4tMu)5mzc8(qH(+ha0BtqZWC%KQ z2Cn-$ipZ>F3bQ59q;)FHE}GC_JxVJUH@hALdmo6Mu<+1oj{+5ER2MK#e!g@z1h4U( z-u92iI~b_VQ#9vAOuQsn+@{5TsSLCL9`hz#daGVz0v58LlX38D5g;NxJkY&7sxlNY z`Dyw{JD`~L0pW#oMKFx!Tli2=l_=WHV>(B3{VcHQ6nhU^IW%1{U|%zQ)Fg8X1s_M+ zzzXyb;7Q`qPx9ooIuIagSwqv586o@cuL4iO99MgEuNvHvQwX|Unxyqcrw7Ce6Udg_ z#+_BpTmxed*5CaP-2j}6zDu)=(QPF8UEKR2nqa44)YjWuG|uF{{WXv2B8|xJ`DLU> zgM9KeuGaoyb{!4sU;kI!I&)1z%h4^n?oJmIbVE}2_lgwlqCKm{9|9-zwg|yz_ImSl8{6_Gj0jzA-^JDRw+Qb>D!HU2~3*R z-%mma)(@J`AZZIAj(dZf;7{Fu&oT5Of|0n0yrJkFX*I-nlGcgt>a&nT&t3G&N<`+< zC$J;=GsAkW31l4ptXUzzf+d8m3fPb^;zN3I|M@6fgAvdTL%Ch7LT({~x_^9jjNz}1 zNpVvnjMrfTB5iL{n_cRws${P2T{r^9TvvfrOSnOB*CD|iaCkKoUln=`7EY|cE_Vaj z)0xl>s0%SwRRJlTo;07FUcb}xWa%zsA=hD@)u4-7z4ZCr z=j<<49wYqFd)2^%?AM~1?naT25cB>usC`x#mlJ8hYNlLPed(B$h3WWH>w=GMIS4uz zaW@n-BD1)}&DIlkh-;vBt_N)CjDzn1bY>(6EpMg)c|Z1hDWb{g%>{(wuKFgv82x<1 zOFI|Uv4Jr{I9;~btXg_j$wzbvHi_>O}kb>Gv@dey;q0aLx2D^1v-xiB` zEGqYFDNF-n4CY_FFGb)P9)P02Y-N+qBb$0?R`Lz-&UuP?WiIgzfJr!#5X2=qcP>ro zuX`{cJE`#~v%jQV$mP7C-eh@-d6~BDIM$EVmRIYtp`dKX4N#GD=a?aTs^lNp;vnoM z2%aqp7?ObgiLe?=Pw7PfQ025^)=-HW_W25lR|jY7#Nj~eKR8`wBg3uWPQ}P@33F&`{76CsfKjak;#@q%a&tKCc z+0sB=YL220rs@>(l$7MAo zrp`}z!d7u`Twwv6iW zR_5z-=L|O8oPKXuE?uw~L1&sR_8{L>pEuUOH-h#aA^d_~$lELDTu3hDrlxVj)&*w2alCTn;FmHL_l97-xIaafqP+TfklPJulcB4F%H|h>q#~s{+ zXbX>C{zew(9gfBCuRDbR+IOzV)UEsCd=(}!`=s8Jx?GLhlT!G?S+cvN$t?09 zSI3Ta0BdR|yRwIixN+r`#7Lp8tKF-8rPIiHh3B!?>)7eQ&sXy~_NB4)OcaBOgmI~c zYK8bfFm~#F^&1u0yCd)vxp>XDrJjdYZHHRJZ}y)>;x(+|`|8Vna7?O))9fgv6e9*o z8kRY$@0vXIUNX`o=Hnl+`7|u_fYQigWY@%%}Lg*^&qxc_aeK{`7DaxDQ#Tv)jEVTEAi_)5)?WruEA6!pbt)YwQr@Izh*N3Lye zVvQ*OFi>{(!TS(HeO!T;JjAk?{gEbXyEdE4^9gc|peIvewqv+f3%kB_WP@jO;iKO0 zy{bmcsZkS}F{a^N)$-wd2VWSSR>yNq?_5vl z^upr&+%A)iv{qA#blIs*t zN44x_>H7tNF4q8WQB+A?K0cS#5DAKPu$%X2uq0ygd(VsmNljJ-sa| z5bO~p9LTlwKuaOZba^4jP0J?=SnD4SL3sZ-!9X0L@ixmGeMx@?{v@q8XD-?yOmHWf43j~eNv zwfFkQOTBh^3!S^@3MYK7w22%eoksFcU8gQ>#_FBQckzU$S(6Ir26Y` zI6IusO zWAHFlv1-&(2H}_mt~MSr<0D<3J%wFCEDMEhBPZwb`tgT((_ogy^VS(#Q=gV8SaoU? zv5{;w1-FDWg^%@gxxgudwW`#4a|QpojVLi#V9N8su`ep*A~)NB-VhUmub>Fk}JwjF$XKoHGk+!1xS zQrUS-;Or~}B57vW8oqa+K`C6UyEn&4$&F;}{(|3q-BPxHGbO364~nd4v?kw4LTU<_ zCsM4iET>9k2AXC%hN}+W*kfnO-Pui*kWK;&Fj>u`gQ1&`hS}ZA4#ix_AcEiVkXIY7 zNt1U}z>i%wtq6qYPWnj}9(wH|{W_KP>EX`HL&dCHMt$f8XTi&!jurh#=wgq`N`zHg zmPD^o+&N+;gJ~KVwMB7ExoMYKe-OyMCulb#W4H06xsC_KO_UWc)XB-I^7LBv_}fY1 z#nG!Hb*$Y&xq}nwC`J?iBD{|=IZKWq{Uq~3lF#DP*jcurLaoaz+3DRl$P$=o=+KN) zcz?wt@s9R|<-H~3T7GD1Pm&F$g@V^qn}kt=RxA!GYpe>XeXwMEa0!AP2Y5KH`7KT zgk2d}{qDMmzf+yKn3y^K9jmb=XmB_&LS+9(Xk9F&DK)~Egk|*52iab@C6#Pny=GFY z>s*SLad?XsI&3_r;hK`5qkbo@MqkoGS*!SU#1OUhev3+}i7GiFIf(Ix>CmRY>M|S7 z=Z)~~)w0V!zT6jO|NN{M*|gS8FWshh(x4XS+G)K6ni|MXg7_LWX`V*NpVte)g=PJWFvz=q|3Y(>we+Yxri?Rqx4df^?U4VlL-l7tSdTfS>rH7Vg51TtKiI@jbi5Lo3 zA3b!v2vKfvMy{zlh2qB_uOVj+OFcSAcH+IbJKGYkAIl^&sW${ge%JGu&g}X=wo%6} zhe-0ca=^;t!R!cLn)!ox60bJJ5tNHUNLfx<%~{Bkqc9xg@$vD@LSN=g09y@vqSr|| zE>e^DV^D4keD4buHGA!G`)Q1eypYaT$K*PA8D~B3bINB^tFu0Ca`N%>yX)9`30dj5 z%!!3hWu1%cCF1jeFE`k%jPUKc%3MdNFlQJkFQ;8CxCJkx;QhAn+Wh@R$kU{E>{)Ug zl!!i#pgYjo3e)iY8C0$1F~WtR=TdOrdJr_&Xo)}0{pq-D|9}IC=(`me>yE2q7WmYH z&w{9h7EEi$#>PH^fq9H^%i%I2_P9?9@|eN}zBg2C*2SKschb9_PAq6M<-JJWNQq#m zTlWV2DpnucSJgGKW|eDNCFHgf^}rWDIwyx!?a*X1tI)W!!qCo>VP2hF6~;FY)~P|A z=Aq%F);IH}Tq%btl!9u*kONgBF}FJuo0F=PkDZ3zA0%+h3fy9aE{?e(5|WJ<23euQ zC26vzu|sJkL%fwG64(-m+@aGv$YUXKT;ya0+`(2Dnn~QtP2uq7XM4V~vq5~l+*H0V zk5;0ngxv?I1RTxlXEbn-`P+3oxJZn|?V%^-15r2F2H%(0VRoqSI@iG4u$GaF2;A6b zc=F*1QS3{pkBskh7Fa06_VN}hSQJ}0T69{^Z-k2ydaj4_%qu|BZV5vV?=2zoQc4Yw zdE;WzN>90E#Vc|8pOS+~C|19oepNnK<*G$>o^b4_V5={@FCw(`1#n2D=;ofkEFk5( zh`2Lsy^t!!kc3nrK>8@a55ejt`xYOCdu8=zHgD##M#-`OHx)vS2yyP#OLOvmHfK2b zj#6@8b9!Nqebkx`@>lQ6_c?2_Wko;NWLp|%(>C?DCr79#$(fRqVWjd_@RT)IOj>6Y ziTk2bm6Bg|P1?C-Tt^hEmOWD*5LW6`r92`rDQ?fbB5c?xv37p|7t+UIl~KfB064IY z;NK69Mbmcel%U${s2uiMLVP zuFI>Abc=td#T<8yR8B8lnfsxuWcLh|sSQa}_0-GQ6%&#nsY}kvqoP@hnZc!;n$}KI z6eOnftSCinc-2fQus`Zq&&6fYG>d(ZW;AhJ8i1Erja!yj3?o3y`td09M4NK;JAGiy%2WK0{C5M{lYi>N~y)j&+LSmuX_23eDob+ zgoK20F#4_%2a;zh^`+%2Gh}WvpgT%kKqYklK&Cjxl()|^<2!fLhe0o4Y+r##vw=8` zDUVP$p=MkeUy@o!T}P&hkwY3o@{!c|_28^!@@i>xzVE5T?zd|HmtbGL>=?qT%Pjcp zfsOh1EMTo6g|3_eTVmO_I_?k zhrEMibog9mQ1j8r6-gPA;fXQj=`+t5&N(P$L?)19W(; z4^S*7#wH>4<~EH5AI2HF$C zX>EU(5^+3d%|e)|q&%A@rx>3sn$ItH@#%3)T8DCc20`ONvO+uz?3w8L<@yXV+Le>` zAz4GRJaO0YfROf~!eqrIq)`)Du~6oyvVonw1}D#8wds7Z!LlWx-?;kSaTaHzl5K@W zs=|rE#;jll;axFpFWtmGo|U1&72SsW1H#gs_PL4$7LT>eW3|D_r*Lcd^f{c+a=bzS zG?Dl|3p5g^J_d&vw|?@r4KK-J*UGp?k?IvmZ)15fsq|Sw_cdlmX zBo%8!^kb*qsJrpfno~&AB4GV6+|0j@J*f^tEKiO=c1^0&^s_zBzn2wA(yOr$i8R06 z55igdS6iA@UZ56((V?Tsdm%GrGuE)-Wu9rBI^hm{02K}v(5bI|xV+CN-PnM7zXCtJmmzb`q)J}$Y(q|7R+!2sCq|xq3 z%QJ0_LBKhz=gTO{(fi+dy(~~M;E$lCznnjL*J7(Um zXv~KvhTgrZvm!@eVLHbXeKrWeLxyAOA4{n-ksSVgzkOF2+XZ6@@77Co4#Wr_+z*xp z{aE@I8Ob^+JqlBzw>^7IUoF2b&BFO=a+g(cQq7dV==vpm(Y%#(w?&FCe%9$UaiiR3 zyR?oWm{BbH@Bu7+2lM=UOAl;#2^&T83BJOAjrGDJmtL;n18ZLFLqagp!cgC0gHdnz zhxz8_t5aLo>RlTY;9<@xg#P1?>XvOTJ}tkMRA+Vd`Dn$H>o1puaFV|4jLlbiZ?{#Y zcTF{|hd#W&m&`-i%>`lCs6U^7>cB?kCml%Sd!s>^{LuOhdMPOG!Ww(5m%3lkjy1s! zp77P?OKWn3hmOV_xcam283vK__Cxjxw=D}zKMi1gM=4qiz&M3;u|Ip>ybJwu6;F35 zA-q&0;;z^FJG{@xSRiWs)3nD>1Lr^&Ko z8Cr(JeXz?E>9p%a_Hu1wClI}bpdZ9%SsF25A#^MJau?b-mY4Jpy>%Fh&hDwZ$_o8F zW=`1A|9X&LvDbqfzsqmsvvKtd*g+Xh)MIivnadl>b(=bE9*^;K|*S%J^&B(oQvS`Cz=A3*;&DtovthBa%u?kam0-qYeF z5J>ewM8VfFmzi-}daWRrmZ=7#0Vk)Yoji=D5ZgNvU1$YR0CfBqJO z559Bu!+p&g{`0qI{Mg8!zkRbO1doIMc|Q;CdG_1Ap8MpOXTLp9dG*f)CARCVJ2#CE zwq|AJ4?3mhTs$kHISo@xE|Cxp5&?n#pkS~(&};v zzC6W4uGHi|Prn!K_SZ?I1A`*23bj+(kS4{OdH=fSz3iwEc5QC|Az`j) zx%i{ZsE?5NWaSX$fsRY5fwsS|MDbmVD~s{7@NKg5PkE^p#`#`6zR%}$)h0b8T{<;t zF8Qx-_FboNOlZ6Di<$f`1xtC|D{XFX1{0PPwNFI&8^A!$>a(<60VP%g)Gee?gh#g0wnQ6-KLJ@ z-rE*ZNh8ER|JGD=8JX7*_&$P^o0MH5==0ZSe|7Mc-(&oQllDK3-T(1m_;W$%)069; X^Dou+nS2~XH(BzboLG+Nlb8Ps9tarW diff --git a/doc/widgets/images/Polar-stamped.png b/doc/widgets/images/Polar-stamped.png index 4941d5d1365ee750afe12235c5f6fd5fc42cc906..8e3e6fe1beefb9cc2c7f72a1e1d9534ad3c45b30 100644 GIT binary patch literal 36233 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 JPDHLkV1jTwyf**< literal 20137 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 +The **4+ Angle Polarisation** widget allows you to calculate orientation information of selected features using polarised spectroscopy data collected at 4 or more polarisation angles. The implemented algorithm is the same as that outlined by Hikima et al. (2013)1 + +If you use this widget for your data analysis, please cite the articles in which the method (Hikima et al. (2013)1) and widget (Gassner et al. (2025)2) are introduced. ![](images/Polar-stamped.png) @@ -21,8 +23,10 @@ The **4+ Angle Polarisation** widget allows you to calculate orientation informa - *Multiple Inputs*: 1 input per polarisation angle. 2. Features: Select the features to calculate the orientation of. 3. Data XY Selection: Define the attributes for the x and y axes for 2D datasets. -4. Alpha value: The value (α) to use when calculating Herman's orientation function . -5. Invert Angles: Invert the calculated Azimuth Angles about the 0 degree axis (i.e. so that 90 degrees is output as -90 degrees). +4. Spectra Type: The type of spectra on the input. A conversion to *Absorptance* is performed before calculating orientation information when *Absorbance* or *Transmittance* is selected (this does not affect meta and class variables). +5. TDM Tilt (°): The angle of the Transition Dipole Moment with respect to the molecular axis. Used in calculation of the value of Herman's orientation function. +6. Invert Angles: Invert the calculated Azimuth Angles about the 0 degree axis (i.e. so that 90 degrees is output as -90 degrees). +7. Average Spectra: Average all output variables across polarisation angles. Input Examples ------- @@ -35,4 +39,11 @@ Multiple Inputs ![](images/Polar-Example2.PNG) + + +References +------- + + 1. Hikima, Y.; Morikawa, J.; Hashimoto, T., Wavenumber Dependence of FT-IR Image of Molecular Orientation in Banded Spherulites of Poly(3-hydroxybutyrate) and Poly(L-lactic acid). Macromolecules 2013, 46, 1582-1590. +2. Gassner, C.; Vongsvivut, J.; Ryu, M.; Ng, S.H.; Toplak, M.; Takkalkar, P.; Fac, M.L.; Sims, N.A.; Wood, B.R.; Tobin, M.J.; Juodkazis, S.; Morikawa, J., 4+ Angle Polarisation: New Multiple-Angle FTIR Polarisation Widget for Molecular Orientation Analysis in the Open-Source Quasar Platform. From 6408f262398c1cc14891772a746fcaab7dbf544b Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Thu, 28 Nov 2024 13:53:04 +1100 Subject: [PATCH 86/93] polar: add citation information --- orangecontrib/spectroscopy/widgets/owpolar.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 4ca3b857b..91628b280 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -588,6 +588,16 @@ def __init__(self): callback=self._change_input) gui.auto_commit(self.controlArea, self, "autocommit", "Apply", commit=self.commit) + + citation = gui.widgetLabel(self.controlArea) + citation.setOpenExternalLinks(True) + citation.setText('\ + \ + Please consider citing the following articles if using results from this widget:
      \ + Hikima et al. (2013)
      \ + Gassner et al. (2025) \ + ') + self._change_input() self.contextAboutToBeOpened.connect(lambda x: self.init_attr_values(x[0])) From f1a4a7572f8a3aa005f6a547c189b230ae794a2e Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Thu, 28 Nov 2024 12:08:47 +0100 Subject: [PATCH 87/93] Polar: small layout changes --- orangecontrib/spectroscopy/widgets/owpolar.py | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 91628b280..617717bff 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -510,13 +510,13 @@ def __init__(self): hbox = gui.hBox(self.controlArea) #col 1 - vbox2 = gui.vBox(hbox, "Inputs") + vbox2 = gui.vBox(hbox, None) form2 = QWidget() formlayout2 = QFormLayout() form2.setLayout(formlayout2) - self.multifile = gui.widgetBox(vbox2, "All angles in a single input", + self.multifile = gui.widgetBox(vbox2, "Single input (with all angles)", sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) self.anglemetas = DomainModel(DomainModel.METAS, valid_types=DiscreteVariable) @@ -526,7 +526,7 @@ def __init__(self): self.anglesel.setDisabled(True) - self.multiin = gui.widgetBox(vbox2, "Single angle per input", + self.multiin = gui.widgetBox(vbox2, "Multiple inputs (single angle per input)", sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) vbox2.layout().addWidget(form2) @@ -548,7 +548,7 @@ def __init__(self): connector=self._feat_changed)) #col 3 - vbox = gui.vBox(hbox, "Parameters") + vbox = gui.vBox(hbox, None) form = QWidget() formlayout = QFormLayout() @@ -575,7 +575,7 @@ def __init__(self): vbox.layout().addWidget(form) - pbox = gui.widgetBox(vbox, sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) + pbox = gui.widgetBox(vbox, "Parameters", sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) gui.lineEdit(pbox, self, "alpha", u"TDM Tilt (\N{DEGREE SIGN})", callback=self._change_input, valueType=int, validator=QIntValidator(0, 90), tooltip= \ @@ -589,13 +589,15 @@ def __init__(self): gui.auto_commit(self.controlArea, self, "autocommit", "Apply", commit=self.commit) - citation = gui.widgetLabel(self.controlArea) + gui.rubber(vbox2) + cbox = gui.widgetBox(vbox2, "Citations") + citation = gui.widgetLabel(cbox) citation.setOpenExternalLinks(True) citation.setText('\ \ - Please consider citing the following articles if using results from this widget:
      \ - Hikima et al. (2013)
      \ - Gassner et al. (2025) \ + When publishing results, consider citing:
      \ + - Hikima et al. (2013)
      \ + - Gassner et al. (2025) \ ') self._change_input() From d91caa814566658f085d94b814b4f77a63039ecd Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Mon, 9 Dec 2024 17:52:36 +1100 Subject: [PATCH 88/93] polar: add ability to assign unique TDM values --- orangecontrib/spectroscopy/widgets/owpolar.py | 109 ++++++++++++++---- 1 file changed, 89 insertions(+), 20 deletions(-) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index 617717bff..ade16afbc 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -8,9 +8,9 @@ from types import SimpleNamespace import numpy as np import pandas as pd -from AnyQt.QtCore import QItemSelectionModel, QItemSelection, QItemSelectionRange +from AnyQt.QtCore import QItemSelectionModel, QItemSelection, QItemSelectionRange, Qt from AnyQt.QtWidgets import QFormLayout, QWidget, QListView, QLabel, QSizePolicy -from AnyQt.QtGui import QIntValidator +from AnyQt.QtGui import QDoubleValidator from scipy.optimize import curve_fit @@ -28,7 +28,20 @@ from Orange.widgets.data.oweditdomain import disconnected from orangewidget.utils.listview import ListViewSearch +class DiscDomainModel(DomainModel): + def data(self, index, role=Qt.DisplayRole): + value = super().data(index, role) + if role == Qt.DisplayRole: + try: + values = index.data(Qt.UserRole) + except TypeError: + pass # don't have user role (yet) + else: + if type(value) is str: + value += f" ({values})" + return value + def _restore_selected_items(model, view, setting, connector): selection = QItemSelection() sel_model: QItemSelectionModel = view.selectionModel() @@ -90,12 +103,12 @@ def combine_visimg(data, polangles): attsdict = {'visible_images': atts} return attsdict -def run(data, feature, alpha, map_x, map_y, invert_angles, polangles, average, +def run(data, feature, alphas, map_x, map_y, invert_angles, polangles, average, sep, state: TaskState): results = Results() - output, model, spectra, origmetas, errorstate = process_polar_abs(data, alpha, feature, map_x, + output, model, spectra, origmetas, errorstate = process_polar_abs(data, alphas, feature, map_x, map_y, invert_angles, polangles, average, state) @@ -190,7 +203,7 @@ def orfunc(alpha,a0,a1,a2): return ((Dmin-1)/(Dmin+2)*(2/(3*np.cos(np.radians(alpha))**2-1))) return None -def find_az(alpha, params): +def find_az(params): Az0 = calc_angles(params[0],params[1]) Abs0 = azimuth(Az0, *params) Az1 = calc_angles(params[0],params[1])+90 @@ -222,10 +235,10 @@ def compute(xys, yidx, smms, shapes, dtypes, polangles): x = np.asarray(polangles) for i in range(yidx[0], yidx[1]):#y-values(rows) - if vars[1] != 0: + if vars[-1] != 0: break for j in enumerate(xys[0]):#x-values(cols) - if vars[1] != 0: + if vars[-1] != 0: break for l in range(cvs.shape[2]): if np.any(np.isnan(cvs[i,j[0],l,:]), axis=0): @@ -243,12 +256,12 @@ def compute(xys, yidx, smms, shapes, dtypes, polangles): ss_res = np.sum(residuals**2) ss_tot = np.sum((temp-np.mean(temp))**2) if ss_tot == 0: - vars[1] = 1 + vars[-1] = 1 break out[i,j[0],l,6] = 1-(ss_res/ss_tot) mod[i,j[0],l,2] = 1-(ss_res/ss_tot) - out[i,j[0],l,2] = find_az(vars[0], params) - out[i,j[0],l,3] = orfunc(vars[0], *params) + out[i,j[0],l,2] = find_az(params) + out[i,j[0],l,3] = orfunc(vars[l], *params) out[i,j[0],l,4] = params[2] out[i,j[0],l,5] = ampl2(params[0],params[1]) mod[i,j[0],l,3] = params[0] @@ -305,7 +318,7 @@ def start_compute(ulsxs, ulsys, names, shapes, dtypes, polangles, state): # compute(tlsxys, yidx, shapes, dtypes, polangles, i) return threads -def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, average, state): +def process_polar_abs(images, alphas, feature, map_x, map_y, invert, polangles, average, state): state.set_status("Preparing...") ulsxs, ulsys = unique_xys(images, map_x, map_y) @@ -330,7 +343,7 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, a out = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], len(featnames), 7), np.nan) mod = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], len(featnames), 6), np.nan) coords = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0], 2), np.nan) - vars = np.asarray([alpha, 0]) + vars = np.hstack((np.asarray(alphas),0)) fill = np.full((np.shape(ulsys)[0], np.shape(ulsxs)[0]), np.nan) for i, j in enumerate(images): @@ -432,7 +445,7 @@ def process_polar_abs(images, alpha, feature, map_x, map_y, invert, polangles, a spectra = np.concatenate((spectra), axis=0) meta = np.concatenate((met), axis=0) - return outputs, model, spectra, meta, vars[1] + return outputs, model, spectra, meta, vars[-1] class OWPolar(OWWidget, ConcurrentWidgetMixin): @@ -469,6 +482,7 @@ class Outputs: average = Setting(False, schema_only=True) angles = ContextSetting(None, exclude_attributes=True, exclude_class_vars=True) spec_type = Setting(0) + alphas: List[float] = ContextSetting([]) feats: List[Variable] = ContextSetting([]) class Warning(OWWidget.Warning): @@ -534,7 +548,7 @@ def __init__(self): #col 2 vbox1 = gui.vBox(hbox, "Features") - self.featureselect = DomainModel(DomainModel.SEPARATED, + self.featureselect = DiscDomainModel(DomainModel.SEPARATED, valid_types=ContinuousVariable) self.feat_view = ListViewSearch(selectionMode=QListView.ExtendedSelection) self.feat_view.setModel(self.featureselect) @@ -547,6 +561,9 @@ def __init__(self): setting=self.feats, connector=self._feat_changed)) + gui.button(vbox1, self, "Don't use selected features", + callback=self.remove_feat) + #col 3 vbox = gui.vBox(hbox, None) @@ -576,9 +593,9 @@ def __init__(self): vbox.layout().addWidget(form) pbox = gui.widgetBox(vbox, "Parameters", sizePolicy=(QSizePolicy.Minimum, QSizePolicy.Fixed)) - gui.lineEdit(pbox, self, "alpha", u"TDM Tilt (\N{DEGREE SIGN})", - callback=self._change_input, valueType=int, - validator=QIntValidator(0, 90), tooltip= \ + self.alphaedit = gui.lineEdit(pbox, self, "alpha", u"TDM Tilt (\N{DEGREE SIGN})", + callback=self.change_alphas, valueType=float, + validator=QDoubleValidator(0.00, 90.00, 2), tooltip= \ "The angle (in degrees) between the long axis of the molecule and the transition dipole moment") gui.checkBox(pbox, self, 'invert_angles', label="Invert Angles", @@ -603,12 +620,31 @@ def __init__(self): self._change_input() self.contextAboutToBeOpened.connect(lambda x: self.init_attr_values(x[0])) + def sort_row(self, unsorted): + row, feats, alphas = list(zip(*[unsorted])) + return row + + def sort_feats(self): + model = self.feat_view.model() + rows = [model.indexOf(row) for row in self.feats] + featalphas = list(zip(rows, self.feats, self.alphas)) + temp = sorted(featalphas, key=self.sort_row) + rows, feats, alphas = list(zip(*temp)) + self.feats = list(feats) + self.alphas = list(alphas) def _feat_changed(self): self.Warning.nofeat.clear() rows = self.feat_view.selectionModel().selectedRows() - values = self.feat_view.model()[:] - self.feats = [values[row.row()] for row in sorted(rows)] + model = self.feat_view.model() + for row in rows: + if model[:][row.row()] not in self.feats: + self.feats.append(model[:][row.row()]) + self.alphas.append(self.alpha) + model.setData(model.index(row.row()), + f'TDM = {self.alpha}\N{DEGREE SIGN}', + role=Qt.UserRole) + self.sort_feats() if len(rows) > 0: self.Warning.nofeat.clear() else: @@ -616,6 +652,34 @@ def _feat_changed(self): return self.commit.deferred() + def remove_feat(self): + rows = self.feat_view.selectionModel().selectedRows() + model = self.feat_view.model() + for row in rows: + idx = self.feats.index(model[:][row.row()]) + self.feats.remove(model[:][row.row()]) + self.alphas.pop(idx) + model.setData(model.index(row.row()), 'Not used', role=Qt.UserRole) + + def change_alphas(self): + model = self.feat_view.model() + rows = self.feat_view.selectionModel().selectedRows() + for row in rows: + try: + idx = self.feats.index(model[:][row.row()]) + except ValueError: + self._feat_changed() + idx = self.feats.index(model[:][row.row()]) + self.alphas[idx] = self.alpha + model.setData(model.index(row.row()), f"TDM = {self.alpha}\N{DEGREE SIGN}", role=Qt.UserRole) + + def restore_alphas(self): + rows = self.feat_view.selectionModel().selectedRows() + model = self.feat_view.model() + for row in rows: + idx = self.feats.index(model[:][row.row()]) + model.setData(model.index(row.row()), f"TDM = {self.alphas[idx]}\N{DEGREE SIGN}", role=Qt.UserRole) + def init_attr_values(self, data): domain = data.domain if data is not None else None self.featureselect.set_domain(domain) @@ -626,6 +690,7 @@ def init_attr_values(self, data): self.map_x = self.x_axis[0] if self.x_axis else None self.map_y = self.y_axis[1] if len(self.y_axis) >= 2 \ else self.map_x + self.restore_alphas() def _change_input(self): self.commit.deferred() @@ -821,6 +886,10 @@ def handleNewSignals(self): self.sorted_data = [table.transform(domain1) for table in tables] self.openContext(Table.from_domain(domain2)) + for i in range(len(self.feat_view.model())): + self.feat_view.model().setData(self.feat_view.model().index(i), 'Not used', role=Qt.UserRole) + self.restore_alphas() + self.commit.now() @gui.deferred @@ -858,7 +927,7 @@ def commit(self): if any(i not in sorted_data[0].domain.attributes for i in self.feats): self.Information.meta_calc() - self.start(run, sorted_data, list(self.feats), self.alpha, self.map_x, + self.start(run, sorted_data, list(self.feats), self.alphas, self.map_x, self.map_y, self.invert_angles, list(self.polangles), self.average, self.angles) From 4e7393ab2b3eab586f16a6b1819b84c272e81309 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Mon, 9 Dec 2024 17:53:15 +1100 Subject: [PATCH 89/93] polar test: adapt and add test for unique TDMs --- .../spectroscopy/tests/test_owpolar.py | 40 +++++++++++++++++-- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/orangecontrib/spectroscopy/tests/test_owpolar.py b/orangecontrib/spectroscopy/tests/test_owpolar.py index 2afc91dd6..b76f01609 100644 --- a/orangecontrib/spectroscopy/tests/test_owpolar.py +++ b/orangecontrib/spectroscopy/tests/test_owpolar.py @@ -1,5 +1,6 @@ import unittest import numpy as np +from AnyQt.QtCore import QItemSelectionModel, QItemSelection, QItemSelectionRange import Orange from Orange.data import ContinuousVariable, DiscreteVariable, Domain from Orange.widgets.tests.base import WidgetTest @@ -67,7 +68,7 @@ def test_multifile_in(self): self.widget.feat_view.model()[:][3]] self.assertEqual(self.widget.feats[0], self.multifile.domain.metas[3]) self.assertEqual(self.widget.feats[1], self.multifile.domain.metas[4]) - self.widget.alpha = 0 + self.widget.alphas = [0, 0] self.widget.invert_angles = True self.widget.autocommit = True self.commit_and_wait(self.widget, 20000) @@ -112,7 +113,7 @@ def test_multi_inputs(self): self.in1.domain.metas[2].copy(compute_value=None)) self.assertEqual(self.widget.feats[1], self.in1.domain.metas[3].copy(compute_value=None)) - self.widget.alpha = 0 + self.widget.alphas = [0, 0] self.widget.invert_angles = True self.widget.autocommit = True self.commit_and_wait(self.widget, 20000) @@ -150,7 +151,7 @@ def test_pixelsubset(self): self.widget.map_y = self.widget.y_axis[1] self.widget.feats = [self.widget.feat_view.model()[:][2], self.widget.feat_view.model()[:][3]] - self.widget.alpha = 0 + self.widget.alphas = [0, 0] self.widget.invert_angles = True self.widget.autocommit = True self.commit_and_wait(self.widget, 20000) @@ -239,6 +240,7 @@ def test_warnings(self): self.widget.polangles = [0.0,45.0,90.0,135.0] self.widget.feats = [self.widget.feat_view.model()[:][0]] + self.widget.alphas = [0] self.commit_and_wait(self.widget) self.assertTrue(self.widget.Warning.XYfeat.is_shown()) @@ -257,7 +259,7 @@ def test_disconnect(self): self.widget.angles = self.widget.anglemetas[0] self.widget.map_x = self.widget.x_axis[0] self.widget.map_y = self.widget.y_axis[1] - self.widget.alpha = 0 + self.widget.alphas = [0, 0] self.widget.invert_angles = True self.widget.autocommit = True self.widget.feats = [self.widget.feat_view.model()[:][2], @@ -266,6 +268,36 @@ def test_disconnect(self): self.wait_until_stop_blocking() self.send_signal("Data", None, 0, widget=self.widget) + def test_alpha_changes(self): + self.send_signal("Data", self.multifile, 0, widget=self.widget) + self.widget.angles = self.widget.anglemetas[0] + self.widget.map_x = self.widget.x_axis[0] + self.widget.map_y = self.widget.y_axis[1] + self.widget.alpha = 0 + vars = [self.widget.feat_view.model()[:][2], + self.widget.feat_view.model()[:][3]] + view = self.widget.feat_view + model = self.widget.featureselect + update_selection(model, view, vars) + self.widget.change_alphas() + self.assertEqual(self.widget.alphas, [0, 0]) + self.widget.alpha = 90 + update_selection(model, view, [vars[1]]) + self.widget.change_alphas() + self.assertEqual(self.widget.alphas, [0, 90]) + update_selection(model, view, [vars[0]]) + self.widget.change_alphas() + self.assertEqual(self.widget.alphas, [90, 90]) + +def update_selection(model, view, setting): + selection = QItemSelection() + sel_model = view.selectionModel() + model_values = model[:] + for var in setting: + index = model_values.index(var) + model_index = view.model().index(index, 0) + selection.append(QItemSelectionRange(model_index)) + sel_model.select(selection, QItemSelectionModel.ClearAndSelect) # def test_clearangles(self): # #test clearing angles # pass From 77fc1eb24a13ec717f4627b01f10df27a7d84e69 Mon Sep 17 00:00:00 2001 From: Marko Toplak Date: Tue, 17 Dec 2024 11:53:22 +0100 Subject: [PATCH 90/93] add a settings version --- orangecontrib/spectroscopy/widgets/owpolar.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index ade16afbc..a9e29084c 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -460,6 +460,8 @@ class OWPolar(OWWidget, ConcurrentWidgetMixin): icon = "icons/polar.svg" + settings_version = 2 + # Define inputs and outputs class Inputs: data = MultiInput("Data", Orange.data.Table, default=True) From 43e7fd47aa6c1bdd882c5fad03b708a21a60d940 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Wed, 18 Dec 2024 11:03:06 +1100 Subject: [PATCH 91/93] polar: add commit to alpha and feat callback --- orangecontrib/spectroscopy/widgets/owpolar.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index a9e29084c..e8af97cdb 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -662,6 +662,7 @@ def remove_feat(self): self.feats.remove(model[:][row.row()]) self.alphas.pop(idx) model.setData(model.index(row.row()), 'Not used', role=Qt.UserRole) + self.commit.deferred() def change_alphas(self): model = self.feat_view.model() @@ -674,6 +675,7 @@ def change_alphas(self): idx = self.feats.index(model[:][row.row()]) self.alphas[idx] = self.alpha model.setData(model.index(row.row()), f"TDM = {self.alpha}\N{DEGREE SIGN}", role=Qt.UserRole) + self.commit.deferred() def restore_alphas(self): rows = self.feat_view.selectionModel().selectedRows() From 93b6cc7ffc30d8bc098f514a9babcb68a99a4b54 Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Wed, 18 Dec 2024 11:26:19 +1100 Subject: [PATCH 92/93] polar: update docs --- doc/widgets/images/Polar-stamped.png | Bin 36233 -> 51324 bytes doc/widgets/polar.md | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/widgets/images/Polar-stamped.png b/doc/widgets/images/Polar-stamped.png index 8e3e6fe1beefb9cc2c7f72a1e1d9534ad3c45b30..7ac176bebbb182e1ac433c4188137828549585d5 100644 GIT binary patch literal 51324 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 Rri2UT3)mj$Bk+ni{V(Kn1rY!M literal 36233 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 JPDHLkV1jTwyf**< diff --git a/doc/widgets/polar.md b/doc/widgets/polar.md index 82cb2f39f..be1b7dc07 100644 --- a/doc/widgets/polar.md +++ b/doc/widgets/polar.md @@ -21,12 +21,13 @@ If you use this widget for your data analysis, please cite the articles in which 1. Inputs: Define the polarisation angles of the input dataset. Data can be passed to widget with two methods: - *Multifile Input*: A single input with data from all polarisation angles in a single dataset. (Each polarisation angle must be separated with a categorical variable). - *Multiple Inputs*: 1 input per polarisation angle. -2. Features: Select the features to calculate the orientation of. +2. Features: Select the features to calculate the orientation of. Features are selected by clicking on the desired feature(s) and assigning a TDM value (see point 5). A default value is assigned using the current value in the "TDM Tilt (°)" box, changing this value will change the associated value of the selected feature(s). Deselecting features will not remove them from the list to be calculated, only features with ("Not used") will not be calculated (see point 8). 3. Data XY Selection: Define the attributes for the x and y axes for 2D datasets. 4. Spectra Type: The type of spectra on the input. A conversion to *Absorptance* is performed before calculating orientation information when *Absorbance* or *Transmittance* is selected (this does not affect meta and class variables). 5. TDM Tilt (°): The angle of the Transition Dipole Moment with respect to the molecular axis. Used in calculation of the value of Herman's orientation function. 6. Invert Angles: Invert the calculated Azimuth Angles about the 0 degree axis (i.e. so that 90 degrees is output as -90 degrees). 7. Average Spectra: Average all output variables across polarisation angles. +8. Don't use selected features: Remove the selected features from the list to be used in calculations Input Examples ------- From 80fdb4e66604288b8cce0d91a0e33c87d25436de Mon Sep 17 00:00:00 2001 From: callumgassner <94658141+callumgassner@users.noreply.github.com> Date: Wed, 18 Dec 2024 12:14:09 +1100 Subject: [PATCH 93/93] en-AU -> en-US --- doc/widgets/polar.md | 16 ++++++++-------- orangecontrib/spectroscopy/widgets/owpolar.py | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/doc/widgets/polar.md b/doc/widgets/polar.md index be1b7dc07..45ddbf316 100644 --- a/doc/widgets/polar.md +++ b/doc/widgets/polar.md @@ -1,7 +1,7 @@ -4+ Angle Polarisation +4+ Angle Polarization ============ -Calculates vibrational mode orientation from polarised infrared spectroscopy datasets +Calculates vibrational mode orientation from polarized infrared spectroscopy datasets **Inputs** @@ -12,21 +12,21 @@ Calculates vibrational mode orientation from polarised infrared spectroscopy dat - Polar Data: dataset with selected feature(s) orientation information - Curve Fit Model Data: dataset with the optimal parameters of the curve fit model -The **4+ Angle Polarisation** widget allows you to calculate orientation information of selected features using polarised spectroscopy data collected at 4 or more polarisation angles. The implemented algorithm is the same as that outlined by Hikima et al. (2013)1 +The **4+ Angle Polarization** widget allows you to calculate orientation information of selected features using polarized spectroscopy data collected at 4 or more polarization angles. The implemented algorithm is the same as that outlined by Hikima et al. (2013)1 If you use this widget for your data analysis, please cite the articles in which the method (Hikima et al. (2013)1) and widget (Gassner et al. (2025)2) are introduced. ![](images/Polar-stamped.png) -1. Inputs: Define the polarisation angles of the input dataset. Data can be passed to widget with two methods: - - *Multifile Input*: A single input with data from all polarisation angles in a single dataset. (Each polarisation angle must be separated with a categorical variable). - - *Multiple Inputs*: 1 input per polarisation angle. +1. Inputs: Define the polarization angles of the input dataset. Data can be passed to widget with two methods: + - *Multifile Input*: A single input with data from all polarization angles in a single dataset. (Each polarization angle must be separated with a categorical variable). + - *Multiple Inputs*: 1 input per polarization angle. 2. Features: Select the features to calculate the orientation of. Features are selected by clicking on the desired feature(s) and assigning a TDM value (see point 5). A default value is assigned using the current value in the "TDM Tilt (°)" box, changing this value will change the associated value of the selected feature(s). Deselecting features will not remove them from the list to be calculated, only features with ("Not used") will not be calculated (see point 8). 3. Data XY Selection: Define the attributes for the x and y axes for 2D datasets. 4. Spectra Type: The type of spectra on the input. A conversion to *Absorptance* is performed before calculating orientation information when *Absorbance* or *Transmittance* is selected (this does not affect meta and class variables). 5. TDM Tilt (°): The angle of the Transition Dipole Moment with respect to the molecular axis. Used in calculation of the value of Herman's orientation function. 6. Invert Angles: Invert the calculated Azimuth Angles about the 0 degree axis (i.e. so that 90 degrees is output as -90 degrees). -7. Average Spectra: Average all output variables across polarisation angles. +7. Average Spectra: Average all output variables across polarization angles. 8. Don't use selected features: Remove the selected features from the list to be used in calculations Input Examples @@ -47,4 +47,4 @@ References 1. Hikima, Y.; Morikawa, J.; Hashimoto, T., Wavenumber Dependence of FT-IR Image of Molecular Orientation in Banded Spherulites of Poly(3-hydroxybutyrate) and Poly(L-lactic acid). Macromolecules 2013, 46, 1582-1590. -2. Gassner, C.; Vongsvivut, J.; Ryu, M.; Ng, S.H.; Toplak, M.; Takkalkar, P.; Fac, M.L.; Sims, N.A.; Wood, B.R.; Tobin, M.J.; Juodkazis, S.; Morikawa, J., 4+ Angle Polarisation: New Multiple-Angle FTIR Polarisation Widget for Molecular Orientation Analysis in the Open-Source Quasar Platform. +2. Gassner, C.; Vongsvivut, J.; Ryu, M.; Ng, S.H.; Toplak, M.; Takkalkar, P.; Fac, M.L.; Sims, N.A.; Wood, B.R.; Tobin, M.J.; Juodkazis, S.; Morikawa, J., 4+ Angle Polarization: New Multiple-Angle FTIR Polarization Widget for Molecular Orientation Analysis in the Open-Source Quasar Platform. diff --git a/orangecontrib/spectroscopy/widgets/owpolar.py b/orangecontrib/spectroscopy/widgets/owpolar.py index e8af97cdb..08a42580d 100644 --- a/orangecontrib/spectroscopy/widgets/owpolar.py +++ b/orangecontrib/spectroscopy/widgets/owpolar.py @@ -131,7 +131,7 @@ def run(data, feature, alphas, map_x, map_y, invert_angles, polangles, average, ometadom = data[0].domain.metas if average is False: values = tuple(f'{i} Degrees' for i in polangles) - PolAng = DiscreteVariable.make('Polarisation Angle', values=values) + PolAng = DiscreteVariable.make('Polarization Angle', values=values) outmetadom = (ometadom + tuple([PolAng]) + tuple(outaddmetas)) modmetadom = (ometadom + tuple([PolAng]) + tuple(modaddmetas)) output_stack = tuple(output for i in polangles) @@ -451,12 +451,12 @@ def process_polar_abs(images, alphas, feature, map_x, map_y, invert, polangles, class OWPolar(OWWidget, ConcurrentWidgetMixin): # Widget's name as displayed in the canvas - name = "4+ Angle Polarisation" + name = "4+ Angle Polarization" # Short widget description description = ( "Calculate Azimuth Angle, Orientation function, Amplitude and Intensity of " - "vibrational mode(s) using polarised data measured at 4 or more polarisation angles.") + "vibrational mode(s) using polarized data measured at 4 or more polarization angles.") icon = "icons/polar.svg" @@ -492,7 +492,7 @@ class Warning(OWWidget.Warning): # noang = Msg("Must receive 4 angles at specified polarisation") nofeat = Msg("Select one or more Features to calculate orientations with") noxy = Msg("Select X and Y variables") - pol = Msg("Invalid Polarisation angles") + pol = Msg("Invalid Polarization angles") notenough = Msg("Must have >= 4 angles") wrongdata = Msg("Model returns inf. Inappropriate data") # tomany = Msg("Widget must receive data at data input or discrete angles only")