Source code for raytraverse.lightfield.sunsensorplanekd
# -*- coding: utf-8 -*-
# Copyright (c) 2020 Stephen Wasilewski, HSLU and EPFL
# =======================================================================
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# =======================================================================
import numpy as np
from raytraverse.lightfield.sensorplanekd import SensorPlaneKD
from raytraverse.lightfield.sets import SensorPointSet
from raytraverse.lightfield.sunsplanekd import SunsPlaneKD
[docs]class SunSensorPlaneKD(SunsPlaneKD):
"""collection of sensorplanes with KDtree structure for sun position query
data has shape (pts * suns, sensors, sources, bands)
"""
@property
def sensors(self):
return self._sensors
def _load_points(self, idx, pts, samplelevel):
self._sensors = None
self._dataload = []
s_pts, s_lev, s_idx, nmz = super()._load_points(idx, pts, samplelevel)
s_idx = (self._dataload, s_idx)
self._dataload = None
return s_pts, s_lev, s_idx, nmz
def _load_point(self, source):
slp = SensorPlaneKD(self.scene, None, self.pm, source)
if self._sensors is None:
self._sensors = slp.sensors
self._dataload.append(slp.data)
spt = slp.vecs
sidx = np.arange(slp.vecs.shape[0])
slev = slp.samplelevel
return spt, sidx, slev
@property
def suns(self):
return self._suns
@property
def data(self):
"""LightPlaneSet"""
return self._data
@data.setter
def data(self, idx):
self._data = SensorPointSet(*idx)
[docs] @staticmethod
def apply_coef(data, coefs):
"""apply coefficient vector to data
Parameters
----------
data: np.array
ndims should match self.data (N, M, nsrcs, nfeatures)
coefs: np.array int float list
shape (L, self.srcn) or broadcastable
Returns
-------
alum: np.array
shape (L, N, M, nfeatures)
"""
features = data.shape[-1]
srcn = data.shape[-2]
if features > 1:
try:
c = np.asarray(coefs).reshape(-1, srcn, features)
except ValueError:
c = np.broadcast_to(coefs, (1, srcn, features))
sstring = 'abc,debc->adec'
else:
try:
c = np.asarray(coefs).reshape(-1, srcn)
except ValueError:
c = np.broadcast_to(coefs, (1, srcn))
sstring = 'ab,debc->adec'
return np.einsum(sstring, c, data)