def setUp(self): self.chain = SignalProcessor() self.qualUtil = QualityUtil() config = ConfigProvider().getProcessingConfig() self.upperBound = config.get("upperBound") self.lowerBound = config.get("lowerBound") self.minQuality = config.get("minQual") self.maxNaNValues = config.get("maxNaNValues")
class ProcessedSignalPlotter(RawSignalPlotter): def __init__(self, person, eegData, signals, filePath, save=True, plot=True, logScale=False): RawSignalPlotter.__init__(self, person, eegData, signals, filePath, save, plot, logScale, name="processed") self.chain = SignalProcessor() def _getData(self, signal): raw = self.eegData.getColumn(signal) qual = self.eegData.getQuality(signal) raw, _ = self.chain.process(raw, qual) return raw
class DeltaSignalPlotter(RawSignalPlotter): def __init__(self, person, eegData, signals, filePath, save=True, plot=True, logScale=False): RawSignalPlotter.__init__(self, person, eegData, signals, filePath, save, plot, logScale, name="delta") self.chain = SignalProcessor() self.eegUtil = EEGUtil() def _getData(self, signal): raw = self.eegData.getColumn(signal) qual = self.eegData.getQuality(signal) samplingRate = self.eegData.getSamplingRate() proc, _ = self.chain.process(raw, qual) proc = QualityUtil().replaceNans(proc) return self.eegUtil.getDeltaWaves(proc, samplingRate)
def __init__(self, inputQueue, outputQueue): config = ConfigProvider() self.eegFields = config.getEmotivConfig()["eegFields"] self.gyroFields = config.getEmotivConfig()["gyroFields"] self.samplingRate = config.getEmotivConfig()["samplingRate"] self.processingConfig = config.getProcessingConfig() self.preProcessor = SignalPreProcessor() self.signalProcessor = SignalProcessor() self.fftProcessor = FFTProcessor() self.inputQueue = inputQueue self.outputQueue = outputQueue self.runProcess = True self.totalInvalid = 0 self.totalCount = 0
class DataProcessor(object): def __init__(self, inputQueue, outputQueue): config = ConfigProvider() self.eegFields = config.getEmotivConfig()["eegFields"] self.gyroFields = config.getEmotivConfig()["gyroFields"] self.samplingRate = config.getEmotivConfig()["samplingRate"] self.processingConfig = config.getProcessingConfig() self.preProcessor = SignalPreProcessor() self.signalProcessor = SignalProcessor() self.fftProcessor = FFTProcessor() self.inputQueue = inputQueue self.outputQueue = outputQueue self.runProcess = True self.totalInvalid = 0 self.totalCount = 0 def close(self): self.runProcess = False def processData(self): while self.runProcess: try: data = self.inputQueue.get(timeout=1) procData, procInvalid = self.process(data) if not procInvalid: self.outputQueue.put(procData) except Empty: pass def process(self, data): #TODO make me fast and nice eegRaw, gyroRaw = self.splitData(data) eegProc, eegInvalid = self.processEEGData(eegRaw) gyroProc, gyroIvalid = self.processGyroData(gyroRaw) eegProc.update(gyroProc) return eegProc, (eegInvalid or gyroIvalid) def splitData(self, data): '''split eeg and gyro data :param data: all values as dict :return: eegData: eeg values as dict gyroData: gyro values as dict ''' #TODO handle data except eeg and gyro? eegData = {x: data[x] for x in data if x in self.eegFields} gyroData = {x: data[x] for x in data if x in self.gyroFields} return eegData, gyroData def processEEGData(self, eegData): invalidCount = 0 for _, signal in eegData.iteritems(): raw = array(signal["value"]) quality = array(signal["quality"]) proc = self.preProcessor.process(raw) proc, _ = self.signalProcessor.process(proc, quality) chan, fInvalid = self.fftProcessor.process(proc) signal["theta"] = chan["theta"] invalidCount += sum([fInvalid]) if invalidCount > 0: self.totalInvalid += 1 self.totalCount += 1 return eegData, (invalidCount > 0) def processGyroData(self, gyroData): return gyroData, False
class TestSimpleChain(unittest.TestCase): def setUp(self): self.chain = SignalProcessor() self.qualUtil = QualityUtil() config = ConfigProvider().getProcessingConfig() self.upperBound = config.get("upperBound") self.lowerBound = config.get("lowerBound") self.minQuality = config.get("minQual") self.maxNaNValues = config.get("maxNaNValues") def _checkValidData(self, data, invalid): self.assertEqual(invalid, self.maxNaNValues < count_nonzero(isnan(data))) def test_process_sunshine(self): data = [-2.0, -1.0, 0, 1.0, 2.0] qual = [15, 15, 15, 15, 15] proc, invalidData = self.chain.process(data, qual) self._checkValidData(proc, invalidData) assert_allclose(proc, [-1.0, -0.5, 0, 0.5, 1]) def test_process_badQuality(self): data = [-2.0, -1.0, 0, 1.0, 2.0] qual = [15, 0, self.minQuality-1, self.minQuality, self.minQuality+1] proc, invalidData = self.chain.process(data, qual) self._checkValidData(proc, invalidData) assert_allclose(proc, [-1.0, NaN, NaN, 0.5, 1]) def test_process_replaceSequences(self): data = [1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 4.0] qual = [15, 15,15, 15, 15, 15, 15] proc, invalidData = self.chain.process(data, qual) self._checkValidData(proc, invalidData) assert_allclose(proc, [NaN, NaN, NaN, NaN, NaN, 0.5, 1.0]) def test_process_replaceOutliners(self): data = [-5000, self.lowerBound-1, self.lowerBound, self.lowerBound+1, self.upperBound-1, self.upperBound, self.upperBound+1, 5000] qual = [15, 15, 15, 15, 15, 15, 15, 15] proc, invalidData = self.chain.process(data, qual) self._checkValidData(proc, invalidData) self.assertEquals(count_nonzero(isnan(proc)), 4) def test_process_allTogether(self): data = [3.0, 1.0, 1.0, 1.0, 1.0, 1.0, self.lowerBound-1, self.upperBound+1, -8, -4.0, 2.0, 4.0] cp = copy(data[:]) qual = [self.minQuality-1, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15] proc, invalidData = self.chain.process(data, qual) self._checkValidData(proc, invalidData) #make sure we work on copies only assert_allclose(cp, data) assert_allclose(proc, [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, -1.0, -0.5, 0.25, 0.5]) def test_checkValid(self): maxNaNValues = self.maxNaNValues for length in range(0, maxNaNValues+1): data = self._getNaNList(length) qual = [15]*length _, invalidData = self.chain.process(data, qual) self.assertFalse(invalidData, "length %d" % length) for length in range(maxNaNValues+1, maxNaNValues+5): data = self._getNaNList(length) qual = [15]*length _, invalidData = self.chain.process(data, qual) self.assertTrue(invalidData, "length %d" % length) def _getNaNList(self, length): return array([NaN]*length)
def __init__(self, person, eegData, signals, filePath, save=True, plot=True, logScale=False): RawSignalPlotter.__init__(self, person, eegData, signals, filePath, save, plot, logScale, name="processed") self.chain = SignalProcessor()