package com.isti.traceview.processing; import java.io.StringReader; import com.isti.traceview.TraceViewException; import com.isti.traceview.common.TimeInterval; import com.isti.traceview.data.PlotData; import com.isti.traceview.data.PlotDataPoint; import com.isti.traceview.data.PlotDataProvider; import com.isti.traceview.data.Segment; import com.isti.traceview.filters.IFilter; import com.isti.traceview.gui.IColorModeState; /** * This class holds all information to remove the instrument gain from a trace * * @author Nick Falco */ public class RemoveGain { public Boolean removestate; public RemoveGain(Boolean removestate){ this.removestate = removestate; } /** * Removes the gain from pixelized data If we have overlap on the trace we take only first * segment. * * @param channel * plot data provider to rotate * @param ti * processed time range * @param pointCount * requested point count in the resulting plotdata * @param filter * filter to apply before removing the gain * @return pixelized rotated data * @throws TraceViewException * if a variety of issue occurs in called methods, this method * throws if the channel type can not be determined. */ public PlotData removegain(PlotDataProvider channel, TimeInterval ti, int pointCount, IFilter filter, IColorModeState colorMode) throws TraceViewException, RemoveGainException{ double minFreqValue = 0.0001; double maxFreqValue = 500.0 / channel.getRawData().get(0).getSampleRate(); int numberFreqs = 500; double sensitivity = 1; if(removestate){ try{ RunEvalResp evalResp = new RunEvalResp(false, false); evalResp.generateResponse(minFreqValue, maxFreqValue, numberFreqs, ti.getStartTime(), new StringReader(channel.getResponse().getContent())); sensitivity = evalResp.sensitivity; } catch(NullPointerException e){ throw new RemoveGainException("Unable to remove gain. No response found."); } } PlotData ret = new PlotData(channel.getName(), channel.getColor()); PlotData toProcess = channel.getPlotData(ti, pointCount, filter, null, colorMode); PlotDataPoint pdp = null; int curPixelIndex = 0; for(Segment segment: channel.getRawData(ti)){ for (int i = 0; curPixelIndex < pointCount && i < segment.getData().data.length; i++) { int value = segment.getData().data[i]; if(toProcess.getPixels().get(curPixelIndex).length > 0) { pdp = toProcess.getPixels().get(curPixelIndex)[0]; pdp = new PlotDataPoint(removestate ? pdp.getTop()/sensitivity : pdp.getTop(), removestate ? pdp.getBottom()/sensitivity : pdp.getBottom(), removestate ? pdp.getMean() / sensitivity : value, pdp.getSegmentNumber(), pdp.getRawDataProviderNumber(), pdp.getContinueAreaNumber(), pdp.getEvents()); PlotDataPoint[] pdpArray = new PlotDataPoint[1]; pdpArray[0] = pdp; ret.addPixel(pdpArray); } curPixelIndex++; } } return ret; } }