Skip to content

Commit 466d3c5

Browse files
committed
Added filter support on 2D numerical columns (mask 2D)
Fixed Merger to set 2D masked values to NaN + fixed CLI inputs/args in HISTORY DataModel improvements
1 parent 5b379a4 commit 466d3c5

21 files changed

Lines changed: 814 additions & 142 deletions

src/main/java/fr/jmmc/oitools/OIFitsProcessor.java

Lines changed: 137 additions & 48 deletions
Large diffs are not rendered by default.

src/main/java/fr/jmmc/oitools/fits/FitsTable.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
import java.util.Collection;
3939
import java.util.HashMap;
4040
import java.util.LinkedHashMap;
41-
import java.util.List;
4241
import java.util.Map;
4342
import java.util.Set;
4443
import java.util.logging.Level;
@@ -590,10 +589,10 @@ public final void getNumericalColumnsNames(final Set<String> columnNames) {
590589
* Return the column descriptors (standard then derived) representing
591590
* numerical values (double arrays)
592591
*
593-
* @return list of numerical column descriptors
592+
* @param columnDescList list to store numerical column descriptors
593+
* @return given columnDescList reference
594594
*/
595-
public final List<ColumnMeta> getNumericalColumnsDescs() {
596-
final ArrayList<ColumnMeta> columnDescList = new ArrayList<ColumnMeta>();
595+
public final ArrayList<ColumnMeta> getNumericalColumnsDescs(final ArrayList<ColumnMeta> columnDescList) {
597596
// Standard columns:
598597
for (Map.Entry<String, ColumnMeta> entry : getColumnsDesc().entrySet()) {
599598
final ColumnMeta meta = entry.getValue();
@@ -621,10 +620,10 @@ public final List<ColumnMeta> getNumericalColumnsDescs() {
621620
* Return the column descriptors (standard then derived) representing
622621
* CHAR/SHORT/INT values (arrays) except "CORRINDX_..." columns
623622
*
624-
* @return list of other column descriptors
623+
* @param columnDescList list to store other column descriptors
624+
* @return given columnDescList reference
625625
*/
626-
public final List<ColumnMeta> getOtherColumnsDescs() {
627-
final ArrayList<ColumnMeta> columnDescList = new ArrayList<ColumnMeta>();
626+
public final ArrayList<ColumnMeta> getOtherColumnsDescs(final ArrayList<ColumnMeta> columnDescList) {
628627
// Standard columns:
629628
for (Map.Entry<String, ColumnMeta> entry : getColumnsDesc().entrySet()) {
630629
final ColumnMeta meta = entry.getValue();

src/main/java/fr/jmmc/oitools/meta/ColumnMeta.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ public class ColumnMeta extends CellMeta {
4444
private final int repeat;
4545
/** optional column name storing error values (may be null) */
4646
private final String errName;
47+
/** optional column name storing data values (may be null) for the error column */
48+
private String dataName = null;
4749
/** optional data range (may be null) */
4850
private final DataRange dataRange;
4951
/** optional column alias ie alternate name (may be null) */
@@ -226,13 +228,27 @@ public int getRepeat() {
226228

227229
/* --- Error relationships --- */
228230
/**
229-
* Return the optional column name storing error values (may be null)
230231
* @return optional column name storing error values (may be null)
231232
*/
232233
public final String getErrorColumnName() {
233234
return errName;
234235
}
235236

237+
/**
238+
* @return optional column name storing error values (may be null)
239+
*/
240+
public String getDataColumnName() {
241+
return dataName;
242+
}
243+
244+
/**
245+
* Define the optional column name storing data values (may be null) for the error column
246+
* @param dataName optional column name storing data values (may be null) for the error column
247+
*/
248+
public void setDataColumnName(final String dataName) {
249+
this.dataName = dataName;
250+
}
251+
236252
/* --- Data range --- */
237253
/**
238254
* Return the optional data range (may be null)

src/main/java/fr/jmmc/oitools/meta/WaveColumnMeta.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
package fr.jmmc.oitools.meta;
2121

2222
import fr.jmmc.oitools.model.OIAbstractData;
23+
import java.util.LinkedHashSet;
24+
import java.util.Set;
2325

2426
/**
2527
* This specific ColumnMeta overrides the getRepeat() method to use the OIWaveLength.getNWave() method
@@ -33,6 +35,8 @@ public final class WaveColumnMeta extends ArrayColumnMeta {
3335
private final OIAbstractData oiAbsData;
3436
/** optional expression to compute derived columns */
3537
private String expression;
38+
/** JEL resolved used variables by the optional expression */
39+
private Set<String> relatedColumnNames = null;
3640

3741
/**
3842
* ColumnMeta class constructor
@@ -216,4 +220,16 @@ public int getRepeat() {
216220
public String getExpression() {
217221
return expression;
218222
}
223+
224+
public boolean hasRelatedColumnNames() {
225+
return (this.relatedColumnNames != null) && !this.relatedColumnNames.isEmpty();
226+
}
227+
228+
public Set<String> getRelatedColumnNames() {
229+
if (this.relatedColumnNames == null) {
230+
this.relatedColumnNames = new LinkedHashSet<>(8);
231+
}
232+
return relatedColumnNames;
233+
}
234+
219235
}

src/main/java/fr/jmmc/oitools/model/DataModel.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ public static synchronized DataModel getInstance(final OIFitsStandard version) {
9696

9797
public static DataModel getInstance(final Collection<OIData> oiDatas) {
9898
if (oiDatas == null || oiDatas.isEmpty()) {
99+
// logger.log(Level.SEVERE, "getInstance: using default :", new Throwable());
99100
return getInstance();
100101
}
101102
return new DataModel(oiDatas, false);
@@ -429,6 +430,9 @@ private static void dumpColumn(final ColumnMeta column, final StringBuilder sb)
429430
if (column.getErrorColumnName() != null) {
430431
sb.append(" <errorcolumn>").append(column.getErrorColumnName()).append("</errorcolumn>\n");
431432
}
433+
if (column.getDataColumnName() != null) {
434+
sb.append(" <datacolumn>").append(column.getDataColumnName()).append("</datacolumn>\n");
435+
}
432436
if (column.getDataRange() != null) {
433437
sb.append(" <datarange>\n");
434438
final DataRange range = column.getDataRange();
@@ -597,9 +601,11 @@ private DataModel(final Collection<OIData> oiDatas, final boolean shared) {
597601
}
598602

599603
private void reset() {
604+
allColumnNames = null;
600605
allNumColumnNames = null;
601606
allNumColumnNames1D = null;
602607
allNumColumnNames2D = null;
608+
allOtherColumnNames = null;
603609
}
604610

605611
public void refresh() {
@@ -712,9 +718,14 @@ private static Set<String> getOtherColumnNames(final Collection<OIData> oiDatas)
712718
private static void getAllNumericalColumnNames(final Collection<OIData> oiDatas, final String extName,
713719
final boolean all, final boolean is2D,
714720
final Set<String> columnNames) {
721+
722+
final ArrayList<ColumnMeta> columnsDescCollection = new ArrayList<ColumnMeta>();
723+
715724
for (final OIData oiData : oiDatas) {
716725
if (extName.equals(oiData.getExtName())) {
717-
for (final ColumnMeta colMeta : oiData.getNumericalColumnsDescs()) {
726+
columnsDescCollection.clear();
727+
728+
for (final ColumnMeta colMeta : oiData.getNumericalColumnsDescs(columnsDescCollection)) {
718729
if (colMeta != null) {
719730
if (colMeta instanceof WaveColumnMeta) {
720731
if (all || is2D) {
@@ -733,9 +744,14 @@ private static void getAllNumericalColumnNames(final Collection<OIData> oiDatas,
733744

734745
private static void getOtherColumnNames(final Collection<OIData> oiDatas, final String extName,
735746
final Set<String> columnNames) {
747+
748+
final ArrayList<ColumnMeta> columnsDescCollection = new ArrayList<ColumnMeta>();
749+
736750
for (final OIData oiData : oiDatas) {
737751
if (extName.equals(oiData.getExtName())) {
738-
for (final ColumnMeta meta : oiData.getOtherColumnsDescs()) {
752+
columnsDescCollection.clear();
753+
754+
for (final ColumnMeta meta : oiData.getOtherColumnsDescs(columnsDescCollection)) {
739755
if (meta != null) {
740756
if (logger.isLoggable(Level.FINE)) {
741757
logger.log(Level.FINE, "Column[{0}] type = {1}",
@@ -772,7 +788,7 @@ public static void main(String[] unused) {
772788
final boolean isNumeric2D = dm.isNumericalColumn2D(name);
773789
final boolean isOther = dm.isOtherColumn(name);
774790

775-
logger.log(Level.WARNING, "column[{0}] : isNumeric={1} isNumeric1D={2} isNumeric2D={3} isOther={4}",
791+
logger.log(Level.WARNING, "column[{0}]:\tisNumeric={1}\tisNumeric1D={2}\tisNumeric2D={3}\tisOther={4}",
776792
new Object[]{name, isNumeric, isNumeric1D, isNumeric2D, isOther});
777793
}
778794
}

src/main/java/fr/jmmc/oitools/model/IndexMask.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,9 @@ public boolean accept(final int rowIndex, final int colIndex) {
120120
public void setAccept(final int rowIndex, final int colIndex, final boolean value) {
121121
if (!vect1D) {
122122
bitSet.set(getBitIndex(rowIndex, colIndex), value);
123+
} else {
124+
throw new IllegalArgumentException("Incompatible mask dimensions (2D) !");
123125
}
124-
throw new IllegalArgumentException("Incompatible mask dimensions (2D) !");
125126
}
126127

127128
private int getBitIndex(final int rowIndex, final int colIndex) {
@@ -132,8 +133,12 @@ public int cardinality() {
132133
return this.bitSet.cardinality();
133134
}
134135

135-
public boolean isFull() {
136-
return (this == FULL);
136+
public static boolean isFull(final IndexMask mask) {
137+
return (mask == FULL);
138+
}
139+
140+
public static boolean isNotFull(final IndexMask mask) {
141+
return (mask != null) && (mask != FULL);
137142
}
138143

139144
@Override
@@ -166,4 +171,17 @@ public BitSet getBitSet() {
166171
return bitSet;
167172
}
168173

174+
public int getIndexNone() {
175+
if (!vect1D) {
176+
return nbCols - 2;
177+
}
178+
return -1;
179+
}
180+
181+
public int getIndexFull() {
182+
if (!vect1D) {
183+
return nbCols - 1;
184+
}
185+
return -1;
186+
}
169187
}

src/main/java/fr/jmmc/oitools/model/JELEval.java

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,16 @@
2020
package fr.jmmc.oitools.model;
2121

2222
import fr.jmmc.oitools.meta.ColumnMeta;
23+
import fr.jmmc.oitools.meta.WaveColumnMeta;
2324
import static fr.jmmc.oitools.model.ModelBase.UNDEFINED_DBL;
2425
import gnu.jel.CompilationException;
2526
import gnu.jel.CompiledExpression;
2627
import gnu.jel.DVMap;
2728
import gnu.jel.Evaluator;
2829
import gnu.jel.Library;
30+
import java.util.ArrayList;
2931
import java.util.Arrays;
3032
import java.util.HashSet;
31-
import java.util.List;
3233
import java.util.Set;
3334
import java.util.logging.Level;
3435
import java.util.logging.Logger;
@@ -37,7 +38,7 @@
3738
* ExpressionEvaluator implementation based on gnu JEL
3839
* @author grosje
3940
*/
40-
public class JELEval extends ExpressionEvaluator {
41+
public final class JELEval extends ExpressionEvaluator {
4142

4243
/** logger */
4344
private final static Logger _logger = Logger.getLogger(JELEval.class.getName());
@@ -56,8 +57,7 @@ public JELEval() {
5657
*/
5758
@Override
5859
public double[][] eval(final OIData oiData, final String colNameEval,
59-
final String expression, final boolean testOnly)
60-
throws RuntimeException {
60+
final String expression, final boolean testOnly) throws RuntimeException {
6161

6262
if (_logger.isLoggable(Level.FINE)) {
6363
_logger.log(Level.FINE, "eval: column= {0} expression= {1}", new Object[]{colNameEval, expression});
@@ -73,7 +73,7 @@ public double[][] eval(final OIData oiData, final String colNameEval,
7373

7474
// Prepare inputs:
7575
// all numerical names (original + derived):
76-
final List<ColumnMeta> columnsDescCollection = oiData.getNumericalColumnsDescs();
76+
final ArrayList<ColumnMeta> columnsDescCollection = oiData.getNumericalColumnsDescs(new ArrayList<ColumnMeta>());
7777

7878
// Create input column names:
7979
int n = 0;
@@ -111,11 +111,13 @@ public double[][] eval(final OIData oiData, final String colNameEval,
111111
final Library lib = new Library(staticLib, dynamicLib, null, resolver, null);
112112

113113
// Math.random():
114+
// may throw CompilationException or Throwable:
114115
lib.markStateDependent("random", null);
115116

116117
// Compile expression
117-
_logger.fine("Compilation ...");
118+
_logger.fine("Compiling expression ...");
118119

120+
// may throw CompilationException or Throwable:
119121
final CompiledExpression expr_c = Evaluator.compile(expression, lib);
120122

121123
// Retrieve values:
@@ -126,6 +128,22 @@ public double[][] eval(final OIData oiData, final String colNameEval,
126128
_logger.log(Level.FINE, "usedNames: {0}", usedNames);
127129
}
128130

131+
// Update related column names for the dynamic column:
132+
final ColumnMeta colMetaExpr = oiData.getColumnDerivedDesc(colNameEval);
133+
134+
if (colMetaExpr instanceof WaveColumnMeta) {
135+
if (_logger.isLoggable(Level.FINE)) {
136+
_logger.log(Level.FINE, "colMetaExpr: {0}", colMetaExpr);
137+
}
138+
final Set<String> relatedColumnNames = ((WaveColumnMeta) colMetaExpr).getRelatedColumnNames();
139+
relatedColumnNames.clear();
140+
relatedColumnNames.addAll(usedNames);
141+
142+
if (_logger.isLoggable(Level.FINE)) {
143+
_logger.log(Level.FINE, "relatedColumnNames: {0}", relatedColumnNames);
144+
}
145+
}
146+
129147
// Create the input column array:
130148
// warning: array must have the same size and indices as the input column names (jelNames):
131149
n = 0;
@@ -181,6 +199,7 @@ public double[][] eval(final OIData oiData, final String colNameEval,
181199
for (int j = 0; j < nWaves; j++) {
182200
varProvider.j = j;
183201

202+
// may throw Throwable:
184203
row[j] = expr_c.evaluate_double(context);
185204
}
186205
}

0 commit comments

Comments
 (0)