def test_getSingleWaves(self): eegData = FileUtil().getDto(self.getData32CSV()) eeg = eegData.getColumn("F3") nEeg = len(eeg) samplingRate = eegData.getSamplingRate() waves = self.util.getWaves(eeg, samplingRate) delta = self.util.getDeltaWaves(eeg, samplingRate) self.assertEqual(len(delta), nEeg) self.assertTrue(all([x in waves["delta"] for x in delta])) theta = self.util.getThetaWaves(eeg, samplingRate) self.assertEqual(len(theta), nEeg) self.assertTrue(all([x in waves["theta"] for x in theta])) alpha = self.util.getAlphaWaves(eeg, samplingRate) self.assertEqual(len(alpha), nEeg) self.assertTrue(all([x in waves["alpha"] for x in alpha])) beta = self.util.getBetaWaves(eeg, samplingRate) self.assertEqual(len(beta), nEeg) self.assertTrue(all([x in waves["alpha"] for x in alpha])) gamma = self.util.getGammaWaves(eeg, samplingRate) self.assertEqual(len(gamma), nEeg) self.assertTrue(all([x in waves["gamma"] for x in gamma]))
def test_getWaves(self): eegData = FileUtil().getDto(self.getData32CSV()) eeg = eegData.getColumn("F3") nEeg = len(eeg) waves = self.util.getWaves(eeg, eegData.getSamplingRate()) self.assertEqual(len(waves), 5) for _, wave in waves.iteritems(): self.assertEqual(len(wave), nEeg)
class SignalStatisticUtil(object): ''' class to show some statistical values for a channel ''' def __init__(self, queue, filePath, signals=None, save=True, plot=True, logScale=False, name=""): self.queue = queue self.filePath = filePath self._initStatsDict() self.config = ConfigProvider() self.eegData = FileUtil().getDto(filePath) self._initSignals(signals) self.su = SignalUtil() self.qu = QualityUtil() self.eu = EEGUtil() self.fft = FFTUtil() self._initFields() self.save = save self.plot = plot self.name = name self._initPlotter(logScale) self.ssPrint = SignalStatisticPrinter(filePath) self.preProcessor = SignalPreProcessor() self.processor = SignalProcessor() windowSeconds = self.config.getCollectorConfig().get("windowSeconds") self.windowSize = EEGDataCollector.calcWindowSize(windowSeconds, self.eegData.samplingRate) def _initStatsDict(self): self.stats = OrderedDict() self.stats[GENERAL_KEY] = OrderedDict() self.stats[SIGNALS_KEY] = OrderedDict() def _initFields(self): self.statFields = STAT_FIELDS addMethods(self) def _initSignals(self, signals): if not signals: emoConfig = self.config.getEmotivConfig() signals = emoConfig.get("eegFields") + emoConfig.get("gyroFields") self.signals = signals def _initPlotter(self, logScale): self.plotter = [] for clazz in PLOTTER: plotter = clazz(self.name, self.eegData, self.signals, self.filePath, self.save, self.plot, logScale) thread = Process(target=plotter.doPlot) self.plotter.append(thread) def main(self): self.doPlot() self.collect_stats() self.printStats() #self.plotFFT() [plot.join() for plot in self.plotter] self.queue.put(self.stats) def doPlot(self): for thread in self.plotter: thread.start() def collect_stats(self): self.collectGeneralStats() self.fftData = {} for signal in self.signals: self.stats[SIGNALS_KEY][signal] = {} self.collectRawStats(signal) def plotFFT(self): for freq in FREQ_RANGE: plotter = FrequencyPlotter(str(freq)+"_"+self.name, self.eegData, self.signals, self.filePath, self.fftData, freq, self.save, self.plot) thread = Process(target=plotter.doPlot) self.plotter.append(thread) thread.start() def collectGeneralStats(self): self._addGeneralStatValue("file path", self.filePath) self._addGeneralStatValue("sampleRate", ("%f.2" % self.eegData.getSamplingRate())) self._addGeneralStatValue("dataLength", ("%d" % self.eegData.len)) self._addGeneralStatValue("bound", ("%d - %d" % (self.qu.lowerBound, self.qu.upperBound))) self._addGeneralTimeStat("start time", "getStartTime", TIME_FORMAT_STRING) self._addGeneralTimeStat("end time", "getEndTime", TIME_FORMAT_STRING) self._addGeneralTimeStat("duration", "getDuration", DURATION_FORMAT_STRING) def _addGeneralTimeStat(self, name, method, formatString): time = getattr(self.eegData, method)() value = self._buildFormattedTime(time, formatString) self._addGeneralStatValue(name, value) def _buildFormattedTime(self, time, formatString): value = datetime.fromtimestamp(time).strftime(formatString) return value def _addGeneralStatValue(self, name, value): self.stats[GENERAL_KEY][name] = value def collectRawStats(self, signal): data = self.eegData.getColumn(signal) self._collectSignalStat(signal, RAW_KEY, data) def _collectSignalStat(self, signal, category, data): self.stats[SIGNALS_KEY][signal][category] = OrderedDict() windows = self.getWindows(data) for field, attributes in self.statFields.iteritems(): fieldValues = [] for window in windows: sigStat = self._getSignalStat(attributes["method"], window) fieldValues.append(sigStat) merged = self._mergeValues(fieldValues, field) self._addSignalStatValue(signal, category, field, merged) self._addFFT(signal, category, windows) def _addFFT(self, signal, category, windows): ffts = [] for window in windows: ffts.append(self._getFreqValues(window)) ffts = array(ffts).transpose() fftDict = {} for i, fft in zip(FREQ_RANGE, ffts): fftDict[str(i)] = fft merged = nanmean(fft) self._addSignalStatValue(signal, category, str(i), merged) self.fftData[signal] = fftDict def getWindows(self, raw): windows = [] for start in range(0, len(raw), self.windowSize / 2): end = start + self.windowSize if end <= len(raw): windows.append(raw[start:end]) return windows def _getSignalStat(self, method, raw): return method(raw) def _getFreqValues(self, raw): fft = self.fft.fft(raw) return [fft[freq] for freq in FREQ_RANGE] def _addSignalStatValue(self, signal, category, name, value): self.stats[SIGNALS_KEY][signal][category][name] = value def _mergeValues(self, values, field): typ = self.statFields[field][TYPE] if typ == MAX_TYPE: return nanmax(values) if typ == MIN_TYPE: return nanmin(values) if typ == AGGREGATION_TYPE: return nansum(values) if typ == MEAN_TYPE: return nanmean(values) if typ == DIFF_TYPE: return nanmean(values) def printStats(self): content = self.ssPrint.getSignalStatsString(self.stats) print content if self.save: filePath = getNewFileName(str(self.filePath), "txt", "_" + self.name) self.ssPrint.saveStats(filePath, content)