package com.isti.traceview.processing;
import java.io.Reader;
import java.util.Date;
import com.isti.jevalresp.ComplexBlk;
import com.isti.jevalresp.OutputGenerator;
import com.isti.jevalresp.RespFileParser;
import com.isti.jevalresp.RunExt;
import com.isti.traceview.TraceViewException;
import edu.iris.Fissures.IfNetwork.Response;
import edu.sc.seis.fissuresUtil.freq.Cmplx;
/**
* JEvalResp related logic.
*/
public class RunEvalResp extends RunExt {
protected final boolean verboseDebug;
public double frequencyOfSensitivity = 0.0;
public double sensitivity = 0.0;
public int inputUnits = OutputGenerator.UNIT_CONV_DEFIDX;
/**
* Creates a run evalresp object.
*
* @param logSpacingFlag
* log spacing flag
* @param verboseDebug
* true for verbose debug messages
*/
public RunEvalResp(boolean logSpacingFlag, boolean verboseDebug) {
this.logSpacingFlag = logSpacingFlag;
this.verboseDebug = verboseDebug;
}
/**
* Gets the frequencies array.
*
* @return the frequencies array.
*/
public double[] getFrequenciesArray() {
return frequenciesArray;
}
/**
* Gets the frequency of sensitivity.
*
* @return the frequency of sensitivity.
*/
public double getFrequencyOfSensitivity() {
return frequencyOfSensitivity;
}
/**
* Computes complex response
*
* @param minFreqValue
* the minimum frequency to generate output for.
* @param maxFreqValue
* the maximum frequency to generate output for.
* @param numberFreqs
* the number of frequencies to generate output for.
* @param date
* Date for which we want compute response
* @param respReader
* response reader.
* @return an array of amplitude values.
*/
public Cmplx[] generateResponse(double minFreqValue, double maxFreqValue, int numberFreqs, Date date, Reader respReader)
throws TraceViewException {
Cmplx[] spectra = null;
String[] staArr = null;
String[] chaArr = null;
String[] netArr = null;
String[] siteArr = null;
this.minFreqValue = minFreqValue;
this.maxFreqValue = maxFreqValue;
this.numberFreqs = numberFreqs;
if (checkGenerateFreqArray()) // check/generate frequencies array
{
final String inFName = "(reader)";
final RespFileParser parserObj = new RespFileParser(respReader, inFName);
if (parserObj.getErrorFlag()) {
// error creating parser object;
throw new TraceViewException("Error in 'stdin' data: " + parserObj.getErrorMessage());
}
parserObj.findChannelId(staArr, chaArr, netArr, siteArr, date, null);
// read and parse response data from input:
final Response respObj = parserObj.readResponse();
if (respObj == null) {
throw new TraceViewException("Unable to parse response file: " + parserObj.getErrorMessage());
}
// create output generator:
final OutputGenerator outGenObj = new OutputGenerator(respObj);
// check validity of response:
if (!outGenObj.checkResponse()) {
// error in response; set error code & msg
throw new TraceViewException("Error in response from \"" + inFName + "\": " + outGenObj.getErrorMessage());
}
// response checked OK; do normalization:
if (!outGenObj.normalizeResponse(startStageNum, stopStageNum)) {
// normalization error; set error message
throw new TraceViewException("Error normalizing response from \"" + inFName + "\": " + outGenObj.getErrorMessage());
}
// response normalized OK; calculate output:
if (!outGenObj.calculateResponse(frequenciesArray, logSpacingFlag, outUnitsConvIdx, startStageNum, stopStageNum)) {
// calculation error; set error message
throw new TraceViewException("Error calculating response from \"" + inFName + "\": " + outGenObj.getErrorMessage());
}
// get the frequency of sensitivity
frequencyOfSensitivity = outGenObj.getCalcSenseFrequency();
sensitivity = outGenObj.getCalcSensitivity();
inputUnits = OutputGenerator.toUnitConvIndex(outGenObj.getFirstUnitProc());
double[] calcFreqArray = outGenObj.getCalcFreqArray();
// final AmpPhaseBlk ampPhaseArray[] = outGenObj.getAmpPhaseArray();
ComplexBlk[] spectraBlk = outGenObj.getCSpectraArray();
spectra = new Cmplx[spectraBlk.length];
for (int i = 0; i < spectraBlk.length; i++) {
spectra[i] = new Cmplx(spectraBlk[i].real, spectraBlk[i].imag);
if (verboseDebug)
System.out.println("resp[" + i + "]: r= " + spectra[i].r + ", i= " + spectra[i].i + ", freq=" + calcFreqArray[i]);
}
parserObj.close();
System.out.println(outGenObj.getRespInfoString());
System.out.println(outGenObj.getStagesListStr());
}
return spectra;
}
}