#!/usr/bin/python # -*- coding: utf-8 -*- # \file Differential.py # \brief TODO # \author Florent Guiotte # \version 0.1 # \date 16 avril 2018 # # TODO details from ld2dap.core import Filter, Stack import numpy as np class Differential(Filter): def __init__(self, overflow='auto'): super().__init__(self.__class__.__name__) self.overflow = overflow def _process(self, data, metadata): self.logger.info('Run differential on stack of size {}'.format(data.shape)) raster_list = list() metadata_new = list() offset = 0 for stack in metadata: self.logger.debug('{}'.format(stack)) overflow = (data[:, :, stack.begin:stack.end-1] > data[:, :, stack.begin+1:stack.end]).any() and \ str(data.dtype).startswith('u') dtype = data.dtype if overflow: self.logger.warn('Overflow detected') if self.overflow == 'auto': dtype = np.dtype(str(data.dtype).lstrip('u')) self.logger.info('Changing dtype from {} to {}'.format( data.dtype, dtype)) raster_list.append(np.subtract(data[:, :, stack.begin+1:stack.end], data[:, :, stack.begin:stack.end-1], dtype=dtype)) size_new = stack.end - stack.begin - 1 stack_new = Stack(offset, size_new) for i in range(len(stack_new.desc)): desc = stack.desc[i].copy() desc.append(':Differential:') desc.extend(stack.desc[i+1]) stack_new.desc[i] = desc metadata_new.append(stack_new) for i in range(len(stack_new.symb)): symb = list() #['D('] symb.extend(stack.symb[i]) symb.append(' - ') symb.extend(stack.symb[i+1]) #symb.append(')') stack_new.symb[i] = symb offset += size_new data = np.dstack(raster_list) return data, metadata_new