package org.signalml.plugin.bookreporter.method;
import java.awt.Color;
import java.util.Collection;
import org.apache.log4j.Logger;
import org.jfree.chart.axis.NumberAxis;
import org.signalml.domain.tag.TagStyles;
import org.signalml.method.ComputationException;
import org.signalml.method.MethodExecutionTracker;
import org.signalml.method.TrackableMethod;
import org.signalml.method.iterator.IterableMethod;
import org.signalml.method.iterator.IterableParameter;
import org.signalml.plugin.bookreporter.BookReporterPlugin;
import org.signalml.plugin.bookreporter.chart.BookReporterChartData;
import org.signalml.plugin.bookreporter.chart.preset.BookReporterChartPreset;
import org.signalml.plugin.bookreporter.data.BookReporterData;
import org.signalml.plugin.bookreporter.data.BookReporterResult;
import org.signalml.plugin.bookreporter.data.book.BookReporterAtom;
import org.signalml.plugin.bookreporter.exception.BookReporterBookReaderException;
import org.signalml.plugin.bookreporter.io.BookReporterBookReader;
import org.signalml.plugin.data.PluginConfigForMethod;
import org.signalml.plugin.exception.PluginException;
import org.signalml.plugin.export.method.BaseMethodData;
import org.signalml.plugin.export.signal.SignalSelectionType;
import org.signalml.plugin.export.signal.TagStyle;
import static org.signalml.plugin.i18n.PluginI18n._;
import org.signalml.plugin.method.PluginAbstractMethod;
import org.signalml.plugin.tool.PluginResourceRepository;
/**
* @author piotr@develancer.pl
* (based on Oskar Kapala's NewStagerMethod)
*/
public class BookReporterMethod extends PluginAbstractMethod implements
TrackableMethod, IterableMethod {
protected static final Logger logger = Logger.getLogger(BookReporterMethod.class);
private static final String UID = "c8b4fdc5-2749-4867-96f2-e40b8ed83d25";
private static final int[] VERSION = new int[] { 0, 1 };
@Override
public Object doComputation(Object data, MethodExecutionTracker tracker)
throws ComputationException {
BookReporterData bookReporterData = (BookReporterData) data;
BookReporterBookReader reader = null;
try {
reader = new BookReporterBookReader(bookReporterData.getParameters().bookFilePath);
} catch (BookReporterBookReaderException ex) {
throw new RuntimeException(ex.getMessage());
}
TagStyles tagStyles = new TagStyles();
double signalLength = reader.getTimeLength();
BookReporterChartPreset[] chartPresets = bookReporterData.getParameters().chartPresets;
BookReporterChartData[] chartData = new BookReporterChartData[chartPresets.length];
for (int i=0; i<chartPresets.length; i++) {
TagStyle tagStyle = new TagStyle(SignalSelectionType.CHANNEL, chartPresets[i].getWavesName(), "EEG profiling tag", Color.RED, Color.BLACK, 1.0f);
chartData[i] = chartPresets[i].createEmptyData(signalLength, tagStyle);
tagStyles.addStyle(tagStyle);
}
tracker.setTickerLimit(0, reader.getAllSegmentsCount());
Collection<BookReporterAtom> atomSample;
while ((atomSample = reader.getAtomsFromNextSegment()) != null) {
if (tracker.isRequestingAbort()) {
return null;
}
for (BookReporterChartData chart : chartData) {
chart.process(atomSample);
}
tracker.setTicker(0, reader.getProcessedSegmentsCount());
}
NumberAxis timeAxis = new NumberAxis("time [hours]");
timeAxis.setRange(0.0, signalLength/3600.0);
BookReporterResult result = new BookReporterResult(tagStyles);
result.setTimeAxis(timeAxis);
for (BookReporterChartData chart : chartData) {
result.addPlot(chart.getPlot());
result.addTags(chart.getTagList());
}
return result;
}
@Override
public Object digestIterationResult(int iteration, Object result) {
// TODO Auto-generated method stub
return null;
}
@Override
public IterableParameter[] getIterableParameters(Object data) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getName() {
try {
return ((PluginConfigForMethod) PluginResourceRepository
.GetResource("config", BookReporterPlugin.class))
.getMethodConfig().getMethodName();
} catch (PluginException e) {
return "";
}
}
@Override
public BaseMethodData createData() {
return null;
}
@Override
public boolean supportsDataClass(Class<?> clazz) {
return BookReporterData.class.isAssignableFrom(clazz);
}
@Override
public Class<?> getResultClass() {
return BookReporterResult.class;
}
@Override
public String getUID() {
return UID;
}
@Override
public int[] getVersion() {
return VERSION;
}
@Override
public int getTickerCount() {
return 1;
}
@Override
public String getTickerLabel(int ticker) {
if (ticker == 0) {
return _("EEG profiles");
} else {
throw new IndexOutOfBoundsException("No ticker [" + ticker + "]");
}
}
}