Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 85 additions & 18 deletions src/firefly/java/edu/caltech/ipac/firefly/server/util/QueryUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -580,9 +580,9 @@ public static DataAccessException createEndUserException(String msg, String deta
private static final int DECI_ENABLE_SIZE = AppProperties.getIntProperty("decimation.enable.size", 5000);
/**
* returns 4 columns; x-column, y-column, rowidx, weight, decimate_key
* @param dg
* @param decimateInfo
* @return
* @param dg input data group
* @param decimateInfo DecimateInfo object
* @return decimated data group
*/
public static DataGroup doDecimation(DataGroup dg, DecimateInfo decimateInfo) {

Expand Down Expand Up @@ -649,8 +649,18 @@ public static DataGroup doDecimation(DataGroup dg, DecimateInfo decimateInfo) {

if (!doDecimation) {
DataObject retrow = new DataObject(retval);
retrow.setDataElement(columns[0], convertData(xColClass,xval));
retrow.setDataElement(columns[1], convertData(yColClass,yval));
String xvalFormatted = xValGetter.getFormattedValue(row);
if (xvalFormatted == null) {
retrow.setDataElement(columns[0], convertData(xColClass, xval));
} else {
retrow.setFormattedData(columns[0], xvalFormatted);
}
String yvalFormatted = yValGetter.getFormattedValue(row);
if (yvalFormatted == null) {
retrow.setDataElement(columns[1], convertData(yColClass, yval));
} else {
retrow.setFormattedData(columns[1], yvalFormatted);
}
retrow.setDataElement(columns[2], rIdx); // natural index
retval.add(retrow);
} else if (checkDeciLimits) {
Expand Down Expand Up @@ -682,7 +692,9 @@ public static DataGroup doDecimation(DataGroup dg, DecimateInfo decimateInfo) {
// because the number of rows in the output
// is less than decimation limit

List<DataGroup.Attribute> attributes = retval.getKeywords();
retval = new DataGroup("decimated results", new DataType[]{columns[0],columns[1],columns[2]});
retval.setAttributes(attributes);

for (int rIdx = 0; rIdx < dg.size(); rIdx++) {
DataObject row = dg.get(rIdx);
Expand All @@ -697,8 +709,18 @@ public static DataGroup doDecimation(DataGroup dg, DecimateInfo decimateInfo) {

if (checkLimits && (xval<xMin || xval>xMax || yval<yMin || yval>yMax)) { continue; }
DataObject retrow = new DataObject(retval);
retrow.setDataElement(columns[0], convertData(xColClass, xval));
retrow.setDataElement(columns[1], convertData(yColClass, yval));
String xvalFormatted = xValGetter.getFormattedValue(row);
if (xvalFormatted == null) {
retrow.setDataElement(columns[0], convertData(xColClass, xval));
} else {
retrow.setFormattedData(columns[0], xvalFormatted);
}
String yvalFormatted = yValGetter.getFormattedValue(row);
if (yvalFormatted == null) {
retrow.setDataElement(columns[1], convertData(yColClass, yval));
} else {
retrow.setFormattedData(columns[1], yvalFormatted);
}
retrow.setDataElement(columns[2], rIdx);
retval.add(retrow);
}
Expand All @@ -719,10 +741,9 @@ public static DataGroup doDecimation(DataGroup dg, DecimateInfo decimateInfo) {

DecimateKey decimateKey = new DecimateKey(xMin, yMin, nXs, nYs, xUnit, yUnit);

HashMap<String, SamplePoint> samples = new HashMap<String, SamplePoint>();
HashMap<String, SamplePoint> samples = new HashMap<>();
// decimating the data now....
for (int idx = 0; idx < dg.size(); idx++) {

DataObject row = dg.get(idx);

double xval = xValGetter.getValue(row);
Expand All @@ -739,13 +760,17 @@ public static DataGroup doDecimation(DataGroup dg, DecimateInfo decimateInfo) {
// representative sample point is a random point from the bin
int numRepRows = pt.getRepresentedRows()+1;
if (Math.random() < 1d/(double)numRepRows) {
SamplePoint replacePt = new SamplePoint(xval, yval, idx, numRepRows);
String xvalFormatted = xValGetter.getFormattedValue(row);
String yvalFormatted = yValGetter.getFormattedValue(row);
SamplePoint replacePt = new SamplePoint(xval, xvalFormatted, yval, yvalFormatted, idx, numRepRows);
samples.put(key, replacePt);
} else {
pt.addRepresentedRow();
}
} else {
SamplePoint pt = new SamplePoint(xval, yval, idx);
String xvalFormatted = xValGetter.getFormattedValue(row);
String yvalFormatted = yValGetter.getFormattedValue(row);
SamplePoint pt = new SamplePoint(xval, xvalFormatted, yval, yvalFormatted, idx);
samples.put(key, pt);
}
}
Expand All @@ -757,8 +782,17 @@ public static DataGroup doDecimation(DataGroup dg, DecimateInfo decimateInfo) {
weight = pt.getRepresentedRows();
if (weight<minWeight) minWeight = weight;
if (weight>maxWeight) maxWeight = weight;
row.setDataElement(columns[0], convertData(xColClass, pt.getX()));
row.setDataElement(columns[1], convertData(yColClass, pt.getY()));

if (pt.getFormattedX() == null) {
row.setDataElement(columns[0], convertData(xColClass, pt.getX()));
} else {
row.setFormattedData(columns[0], pt.getFormattedX());
}
if (pt.getFormattedY() == null) {
row.setDataElement(columns[1], convertData(yColClass, pt.getY()));
} else {
row.setFormattedData(columns[1],pt.getFormattedY());
}
row.setDataElement(columns[2], pt.getRowIdx());
row.setDataElement(columns[3], weight);
row.setDataElement(columns[4], key);
Expand All @@ -783,15 +817,15 @@ public static DataGroup doDecimation(DataGroup dg, DecimateInfo decimateInfo) {

if (xValGetter.isExpression()) {
DataType.FormatInfo fi = columns[0].getFormatInfo();
fi.setDataFormat("%.6f");
fi.setDataFormat(getFormatterString(xMin, xMax, 6));
columns[0].setFormatInfo(fi);
retval.addAttribute(DecimateInfo.DECIMATE_TAG + ".X-EXPR", decimateInfo.getxColumnName());
retval.addAttribute(DecimateInfo.DECIMATE_TAG + ".X-COL", "x");
}

if (yValGetter.isExpression()) {
DataType.FormatInfo fi = columns[1].getFormatInfo();
fi.setDataFormat("%.6f");
fi.setDataFormat(getFormatterString(xMin, xMax, 6));
columns[1].setFormatInfo(fi);
retval.addAttribute(DecimateInfo.DECIMATE_TAG + ".Y-EXPR", decimateInfo.getyColumnName());
retval.addAttribute(DecimateInfo.DECIMATE_TAG + ".Y-COL", "y");
Expand All @@ -802,6 +836,33 @@ public static DataGroup doDecimation(DataGroup dg, DecimateInfo decimateInfo) {
return retval;
}

private static int getFirstSigDigitPos(double num) {
return (int)Math.floor(Math.log10(num))+1;
}

/*
* Get printf-style format string, which would preserve certain number of significant digits
* in the difference between two numbers.
* @param min - minimum number
* @param max - maximum number
* @param numSigDigits - number of the significant digits to preserve in the difference
*/
private static String getFormatterString(double min, double max, int numSigDigits) {
if (!Double.isFinite(min)||!Double.isFinite(max)) {
return "%."+numSigDigits+"g";
}
double range = Math.abs(max-min);
int firstSigDigitPos = 0;
if (range == 0) {
if (min == 0) { return "%d"; }
} else {
firstSigDigitPos = getFirstSigDigitPos(range);
}
int firstSigDigitPosN = getFirstSigDigitPos(Math.max(Math.abs(min), Math.abs(max)));
int needSigDigits = numSigDigits+(Math.abs(firstSigDigitPosN-firstSigDigitPos));
return "%."+needSigDigits+"g";
}

private static Object convertData(Class dataType, double x) {
if (dataType.isAssignableFrom(Double.class)) {
return x;
Expand All @@ -819,17 +880,21 @@ private static Object convertData(Class dataType, double x) {
private static class SamplePoint {
double x;
double y;
String formattedX;
String formattedY;
int rowIdx;
int representedRows;

public SamplePoint(double x, double y, int rowIdx) {
this(x, y, rowIdx, 1);
public SamplePoint(double x, String formattedX, double y, String formattedY, int rowIdx) {
this(x, formattedX, y, formattedY, rowIdx, 1);
}


public SamplePoint(double x, double y, int rowIdx, int representedRows) {
public SamplePoint(double x, String formattedX, double y, String formattedY, int rowIdx, int representedRows) {
this.x = x;
this.y = y;
this.formattedX = formattedX;
this.formattedY = formattedY;
this.rowIdx = rowIdx;
this.representedRows = representedRows;
}
Expand All @@ -840,6 +905,8 @@ public SamplePoint(double x, double y, int rowIdx, int representedRows) {
public int getRowIdx() { return rowIdx; }
public double getX() { return x; }
public double getY() { return y; }
public String getFormattedX() { return formattedX; }
public String getFormattedY() { return formattedY; }

}

Expand Down
16 changes: 13 additions & 3 deletions src/firefly/java/edu/caltech/ipac/util/DataObjectUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ public class DataObjectUtil {

/**
* return Double.NaN if val is null or not a double
* @param val
* @return
* @param val value
* @return double
*/
public static double getDouble(Object val) {
if (val != null) {
Expand Down Expand Up @@ -102,13 +102,23 @@ public double getValue(DataObject row) {
if (colExpr == null) {
val = getDouble(row.getDataElement(col));
} else {
// x is an expression
// col is an expression
for (DataType dt : colDataTypes) {
colExpr.setVariableValue(dt.getKeyName(), getDouble(row.getDataElement(dt)));
}
val = colExpr.getValue();
}
return val;
}

public String getFormattedValue(DataObject row) {
String val;
if (colExpr == null) {
val = row.getFormatedData(col);
} else {
val = null;
}
return val;
}
}
}
4 changes: 2 additions & 2 deletions src/firefly/js/charts/ChartUtil.js
Original file line number Diff line number Diff line change
Expand Up @@ -164,8 +164,8 @@ export function getDefaultXYPlotParams(tbl_id) {

return (xCol && yCol) ?
{
x: {columnOrExpr: xCol.name, label: xCol.name, unit: xCol.units?xCol.units:''},
y: {columnOrExpr: yCol.name, label: yCol.name, unit: yCol.units?yCol.units:''}
x: {columnOrExpr: xCol.name, options: isCatalog ? 'flip' : '_none_'},
y: {columnOrExpr: yCol.name}
} : undefined;
}

Expand Down
Loading