package test;
import com.interactive.intviewerapi.data.IFieldDesc;
import com.interactive.intviewerapi.data.query.SeismicRangeQuery;
import com.interactive.intviewerapi.data.seismic.ISeismicReader;
import com.interactive.intviewerapi.data.seismic.ISeismicStatistics;
import com.interactive.intviewerapi.data.seismic.ITrace;
/**
* Implementation or new reader. We just return the result from the
* originalReader except in the methods that return the sample rate and the
* number of samples per trace.
*/
public class ResampledReader implements ISeismicReader {
private ISeismicReader originalReader;
private float samplingFactor;
private final ISeismicStatistics stats;
public ResampledReader(ISeismicStatistics stats, ISeismicReader originalReader, float samplingFactor) {
this.originalReader = originalReader;
this.samplingFactor = samplingFactor;
this.stats = stats;
}
@Override
public int getNumberOfTraces() {
return originalReader.getNumberOfTraces();
}
@Override
public ITrace getTrace(int traceIndex) throws IllegalArgumentException {
return new ResampledTrace(originalReader.getTrace(traceIndex));
}
@Override
public IFieldDesc[] getTraceHeaderFields() {
return originalReader.getTraceHeaderFields();
}
@Override
public IFieldDesc getTraceHeaderField(String name) {
return originalReader.getTraceHeaderField(name);
}
@Override
public int findFirstTrace(SeismicRangeQuery query) {
return originalReader.findFirstTrace(query);
}
@Override
public double getPreviousValue(String keyName, double current) {
return originalReader.getPreviousValue(keyName, current);
}
@Override
public double getNextValue(String keyName, double current) {
return originalReader.getNextValue(keyName, current);
}
@Override
public ISeismicStatistics getDataStatistics() {
return stats;
}
/**
* Implementation of trace. The data conversion is done in the getSamples
* method.
*/
private class ResampledTrace implements ITrace {
private ITrace originalTrace;
public ResampledTrace(ITrace originalTrace) {
this.originalTrace = originalTrace;
}
@Override
public Number getHeader(int id) {
return originalTrace.getHeader(id);
}
@Override
public int getSamples(float[] buf) {
int originalSampleCount = originalTrace.getSize();
float[] originalSamples = new float[originalSampleCount];
originalTrace.getSamples(originalSamples);
int newSampleCount = this.getSize();
for (int i = 0; i < newSampleCount; i++) {
int index = (int) (i * samplingFactor + 0.5);
if (index >= originalSampleCount) {
index = originalSampleCount - 1;
}
buf[i] = originalSamples[index];
}
return newSampleCount;
}
@Override
public void setSamples(float[] buf) {
throw new UnsupportedOperationException("We don't support writing here.");
}
@Override
public int getSize() {
return (int) (originalTrace.getSize() * samplingFactor + 0.5);
}
@Override
public void putHeader(Integer intgr, Number number) {
throw new UnsupportedOperationException("We don't support writing here.");
}
}
}