package edu.colostate.vchill;
import edu.colostate.vchill.chill.ChillFieldInfo;
import edu.colostate.vchill.chill.ChillMomentFieldScale;
/**
* Utility methods for calculating NCP_PLUS
*
* @author Jochen Deyke
* @version 2006-03-15
*/
public class NcpPlusUtil {
public static final ChillMomentFieldScale scale = new ChillMomentFieldScale(ChillFieldInfo.NCP_PLUS, java.awt.event.KeyEvent.VK_U, "", 255, 1, 0);
/**
* access to configuration information
*/
private static final Config config = Config.getInstance();
/**
* private default constructor prevents instantiation
*/
private NcpPlusUtil() {
}
public static double[] calculateNCP_PLUS(final double[] ncp, final double[] prevZdr, final double[] currZdr, final double[] nextZdr) {
double[] ncpPlus = new double[ncp.length];
final int offset = config.getClutterWindowSize(); //size of window to look at
for (int i = 0; i < ncp.length; ++i) { //Standard deviation of ZDR filter
double total = 0;
int count = 0; //the actual number of values averaged
double[] grid = new double[offset * 3];
for (int ii = i - offset / 2; ii < i + offset / 2 + 1; ++ii) {
if (prevZdr != null && -1 < ii && ii < prevZdr.length) {
if (!Double.isNaN(prevZdr[ii])) total += grid[count++] = prevZdr[ii];
}
if (currZdr != null && -1 < ii && ii < currZdr.length) {
if (!Double.isNaN(currZdr[ii])) total += grid[count++] = currZdr[ii];
}
if (nextZdr != null && -1 < ii && ii < nextZdr.length) {
if (!Double.isNaN(nextZdr[ii])) total += grid[count++] = nextZdr[ii];
}
}
double avg = total / count;
total = 0;
for (int ii = 0; ii < count; ++ii) total += Math.pow(grid[ii] - avg, 2);
// If the difference in ZDR values is too high, the NCP is 0.
ncpPlus[i] = Math.sqrt(total / count) > config.getClutterThreshold() ? Double.NaN : ncp[i];
}
double[] tmp = new double[ncpPlus.length];
for (int i = 1; i < ncpPlus.length - 1; ++i) { //despeckle filter
if (Double.isNaN(ncpPlus[i])) {
tmp[i] = ncpPlus[i];
continue;
} //already considered bad
tmp[i] = ncpPlus[i - 1] < 0.25 && ncpPlus[i + 1] < 0.25 ? Double.NaN : ncpPlus[i]; //bad on both sides => bad
}
ncpPlus = tmp;
return ncpPlus;
}
}