/* BookAverageMethod.java created 2008-03-22
*
*/
package org.signalml.method.bookaverage;
import static org.signalml.app.util.i18n.SvarogI18n._;
import java.util.LinkedHashSet;
import org.apache.log4j.Logger;
import org.signalml.domain.book.StandardBook;
import org.signalml.domain.book.StandardBookSegment;
import org.signalml.domain.book.WignerMapProvider;
import org.signalml.method.AbstractMethod;
import org.signalml.method.ComputationException;
import org.signalml.method.MethodExecutionTracker;
import org.signalml.method.TrackableMethod;
import org.signalml.plugin.export.SignalMLException;
import org.signalml.plugin.export.method.BaseMethodData;
import org.springframework.validation.Errors;
/**
* BookAverageMethod
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
* (+ fixed by) piotr@develancer.pl
*/
public class BookAverageMethod extends AbstractMethod implements TrackableMethod {
protected static final Logger logger = Logger.getLogger(BookAverageMethod.class);
private static final String UID = "60f2b583-b5d8-491b-9de2-6531b985fec0";
private static final String NAME = "bookAverage";
private static final int[] VERSION = new int[] {1,0};
public BookAverageMethod() throws SignalMLException {
super();
}
public String getUID() {
return UID;
}
public String getName() {
return NAME;
}
public int[] getVersion() {
return VERSION;
}
@Override
public BaseMethodData createData() {
return new BookAverageData();
}
public boolean supportsDataClass(Class<?> clazz) {
return BookAverageData.class.isAssignableFrom(clazz);
}
public Class<?> getResultClass() {
return BookAverageResult.class;
}
@Override
public void validate(Object data, Errors errors) {
super.validate(data, errors);
// TODO validation
}
@Override
public Object doComputation(Object dataObj, final MethodExecutionTracker tracker) throws ComputationException {
BookAverageData data = (BookAverageData) dataObj;
tracker.resetTickers();
StandardBook book = data.getBook();
WignerMapProvider provider = new WignerMapProvider(book.getSamplingFrequency());
int width = data.getWidth();
int height = data.getHeight();
provider.setWidth(width);
provider.setHeight(height);
provider.setMinFrequency(data.getMinFrequency());
provider.setMaxFrequency(data.getMaxFrequency());
provider.setMinPosition(data.getMinPosition());
provider.setMaxPosition(data.getMaxPosition());
LinkedHashSet<Integer> channels = data.getChannels();
int[] channelArr = new int[channels.size()];
int channelCnt = 0;
for (int i : channels) {
channelArr[channelCnt] = i;
channelCnt++;
}
int minSegment = data.getMinSegment();
int maxSegment = Math.min(data.getMaxSegment(), book.getSegmentCount()-1);
int stepCount = (maxSegment+1-minSegment) * channelArr.length;
tracker.setTickerLimits(new int[] {stepCount});
int x;
int y;
float[] averageSignal = null;
boolean averagingNotPossible = false;
double[][] averageMap = new double[width][height];
double[][] normalMap;
int cnt = 0;
StandardBookSegment segment;
float[] signalSamples;
int j;
for (int e=0; e<channelArr.length; e++) {
for (int i=minSegment; i<=maxSegment; i++) {
if (tracker.isRequestingAbort()) {
return null;
}
segment = book.getSegmentAt(i)[channelArr[e]];
provider.setSegment(segment);
normalMap = provider.getMap();
for (x=0; x<width; x++) {
for (y=0; y<height; y++) {
averageMap[x][y] += normalMap[x][y];
}
}
if (!averagingNotPossible) {
if (!segment.hasSignal()) {
averagingNotPossible = true;
averageSignal = null;
} else {
signalSamples = segment.getSignalSamples();
if (averageSignal == null) {
averageSignal = new float[signalSamples.length];
} else {
if (averageSignal.length != signalSamples.length) {
averagingNotPossible = true;
averageSignal = null;
}
}
for (j=0; j<signalSamples.length; j++) {
averageSignal[j] += signalSamples[j];
}
}
}
cnt++;
tracker.setTicker(0, cnt);
}
}
if (cnt > 0) {
for (x=0; x<width; x++) {
for (y=0; y<height; y++) {
averageMap[x][y] /= cnt;
}
}
averageMap = provider.scaleMap(null, averageMap, width, height, data.getScaleType());
if (!averagingNotPossible && averageSignal != null) {
for (j=0; j<averageSignal.length; j++) {
averageSignal[j] /= cnt;
}
}
}
BookAverageResult result = new BookAverageResult();
result.setMap(averageMap);
result.setSignal(averageSignal);
return result;
}
@Override
public int getTickerCount() {
return 1;
}
@Override
public String getTickerLabel(int ticker) {
return _("Segments processed");
}
}