Skip to content

Commit fad155f

Browse files
committed
added fixing targetId (0=>1) and other references (if single value)
1 parent 065ac82 commit fad155f

File tree

10 files changed

+93
-25
lines changed

10 files changed

+93
-25
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ public interface OIFitsConstants {
2828

2929
/** UNKNOWN value */
3030
public final static String UNKNOWN_VALUE = "UNKNOWN";
31-
31+
/** first short value for ID = 1 */
32+
public final static short FIRST_ID_SHORT = 1;
3233
/* OIFits standard 1.0 */
3334
/** Table OI_ARRAY */
3435
public final static String TABLE_OI_ARRAY = "OI_ARRAY";

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

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

2222
import fr.jmmc.jmcs.util.NumberUtils;
23+
import fr.jmmc.oitools.OIFitsConstants;
2324
import fr.jmmc.oitools.fits.FitsTable;
2425
import fr.jmmc.oitools.model.ModelBase;
2526
import fr.jmmc.oitools.model.OIFitsChecker;
@@ -448,7 +449,10 @@ public final boolean checkColumnFormat(final OIFitsChecker checker, final FitsTa
448449
*/
449450
private void checkValues(final OIFitsChecker checker, final FitsTable table,
450451
final Object value, final int columnRows) {
452+
451453
final String colName = getName();
454+
455+
String acceptedValues = null;
452456
boolean error;
453457

454458
final short[] intAcceptedValues = getIntAcceptedValues();
@@ -457,16 +461,15 @@ private void checkValues(final OIFitsChecker checker, final FitsTable table,
457461
// OIData: STA_INDEX (2D but nCols=[1,2 or 3]) or TARGET_ID (1D)
458462

459463
// Skip checks if the column is missing (from file):
460-
if (checker != null && !checker.hasRule(Rule.GENERIC_COL_MANDATORY, table, colName) || OIFitsChecker.isInspectRules()) {
464+
if ((checker != null) && !checker.hasRule(Rule.GENERIC_COL_MANDATORY, table, colName) || OIFitsChecker.isInspectRules()) {
461465
final boolean isArray = isArray();
462466

463467
if (!isArray) {
464468
// OIData: TARGET_ID (1D)
465469
final short[] sValues = (short[]) value;
466470

467-
short val;
468471
for (int r = 0; r < columnRows; r++) {
469-
val = sValues[r];
472+
final short val = sValues[r];
470473

471474
if (!ModelBase.isUndefined(val) || OIFitsChecker.isInspectRules()) {
472475
error = true;
@@ -481,7 +484,16 @@ private void checkValues(final OIFitsChecker checker, final FitsTable table,
481484
if (error || OIFitsChecker.isInspectRules()) {
482485
// rule [GENERIC_COL_VAL_ACCEPTED_INT] check if column values match the 'accepted' values (integer)
483486
if (checker != null) {
484-
checker.ruleFailed(Rule.GENERIC_COL_VAL_ACCEPTED_INT, table, colName).addValueAt(val, getIntAcceptedValuesAsString(), r);
487+
if (!checker.hasFixRule(Rule.OI_TARGET_TARGETID_MIN) || !OIFitsConstants.COLUMN_TARGET_ID.equals(colName)) {
488+
if (acceptedValues == null) {
489+
acceptedValues = getIntAcceptedValuesAsString();
490+
}
491+
checker.ruleFailed(Rule.GENERIC_COL_VAL_ACCEPTED_INT, table, colName).addValueAt(val, acceptedValues, r);
492+
}
493+
if (OIFitsChecker.FIX_BAD_ACCEPTED_FOR_SINGLE_MATCH && (intAcceptedValues.length == 1)) {
494+
// TODO: use FIX RULE to log change ...
495+
sValues[r] = intAcceptedValues[0];
496+
}
485497
}
486498
}
487499
}
@@ -490,13 +502,11 @@ private void checkValues(final OIFitsChecker checker, final FitsTable table,
490502
// OIData: STA_INDEX (2D but nCols=[1,2 or 3])
491503
final short[][] sValues = (short[][]) value;
492504

493-
short[] values;
494-
short val;
495505
for (int r = 0; r < columnRows; r++) {
496-
values = sValues[r];
506+
final short[] values = sValues[r];
497507

498508
for (int c = 0, rlen = values.length; c < rlen; c++) {
499-
val = values[c];
509+
final short val = values[c];
500510

501511
if (!ModelBase.isUndefined(val) || OIFitsChecker.isInspectRules()) {
502512
error = true;
@@ -511,7 +521,15 @@ private void checkValues(final OIFitsChecker checker, final FitsTable table,
511521
if (error || OIFitsChecker.isInspectRules()) {
512522
// rule [GENERIC_COL_VAL_ACCEPTED_INT] check if column values match the 'accepted' values (integer)
513523
if (checker != null) {
514-
checker.ruleFailed(Rule.GENERIC_COL_VAL_ACCEPTED_INT, table, colName).addColValueAt(val, getIntAcceptedValuesAsString(), r, c);
524+
if (acceptedValues == null) {
525+
acceptedValues = getIntAcceptedValuesAsString();
526+
}
527+
checker.ruleFailed(Rule.GENERIC_COL_VAL_ACCEPTED_INT, table, colName).addColValueAt(val, acceptedValues, r, c);
528+
529+
if (OIFitsChecker.FIX_BAD_ACCEPTED_FOR_SINGLE_MATCH && (intAcceptedValues.length == 1)) {
530+
// TODO: use FIX RULE to log change ...
531+
values[c] = intAcceptedValues[0];
532+
}
515533
}
516534
}
517535
}
@@ -533,11 +551,10 @@ private void checkValues(final OIFitsChecker checker, final FitsTable table,
533551
final String[] sValues = (String[]) value;
534552

535553
String val;
536-
for (int rowNb = 0; rowNb < columnRows; rowNb++) {
554+
for (int r = 0; r < columnRows; r++) {
555+
val = sValues[r];
537556
error = true;
538557

539-
val = sValues[rowNb];
540-
541558
if (val == null) {
542559
val = "";
543560
} else {
@@ -552,7 +569,15 @@ private void checkValues(final OIFitsChecker checker, final FitsTable table,
552569
if (error || OIFitsChecker.isInspectRules()) {
553570
// rule [GENERIC_COL_VAL_ACCEPTED_STR] check if column values match the 'accepted' values (string)
554571
if (checker != null) {
555-
checker.ruleFailed(Rule.GENERIC_COL_VAL_ACCEPTED_STR, table, colName).addValueAt(val, getStringAcceptedValuesAsString(), rowNb);
572+
if (acceptedValues == null) {
573+
acceptedValues = getStringAcceptedValuesAsString();
574+
}
575+
checker.ruleFailed(Rule.GENERIC_COL_VAL_ACCEPTED_STR, table, colName).addValueAt(val, acceptedValues, r);
576+
577+
if (OIFitsChecker.FIX_BAD_ACCEPTED_FOR_SINGLE_MATCH && (stringAcceptedValues.length == 1)) {
578+
// TODO: use FIX RULE to log change ...
579+
sValues[r] = stringAcceptedValues[0];
580+
}
556581
}
557582
}
558583
}

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,6 @@ public final void check(final FitsHDU hdu, final Object value, final OIFitsCheck
140140
*/
141141
private void checkAcceptedValues(final OIFitsChecker checker, final FitsHDU hdu, final Object value) {
142142
final short[] intAcceptedValues = getIntAcceptedValues();
143-
final String[] stringAcceptedValues = getStringAcceptedValues();
144143

145144
if (intAcceptedValues.length != 0) {
146145
final short val = ((Number) value).shortValue();
@@ -155,8 +154,16 @@ private void checkAcceptedValues(final OIFitsChecker checker, final FitsHDU hdu,
155154
// rule [GENERIC_KEYWORD_VAL_ACCEPTED_INT] check if the keyword value matches the 'accepted' values (integer)
156155
if (checker != null) {
157156
checker.ruleFailed(Rule.GENERIC_KEYWORD_VAL_ACCEPTED_INT, hdu, this.getName()).addKeywordValue(val, getIntAcceptedValuesAsString());
157+
158+
if (OIFitsChecker.FIX_BAD_ACCEPTED_FOR_SINGLE_MATCH && (intAcceptedValues.length == 1)) {
159+
// TODO: use FIX RULE to log change ...
160+
hdu.setKeywordInt(this.getName(), intAcceptedValues[0]);
161+
}
158162
}
159163
}
164+
165+
final String[] stringAcceptedValues = getStringAcceptedValues();
166+
160167
if (stringAcceptedValues.length != 0) {
161168
final String val = (String) value;
162169

@@ -170,6 +177,11 @@ private void checkAcceptedValues(final OIFitsChecker checker, final FitsHDU hdu,
170177
// rule [GENERIC_KEYWORD_VAL_ACCEPTED_STR] check if the keyword value matches the 'accepted' values (string)
171178
if (checker != null) {
172179
checker.ruleFailed(Rule.GENERIC_KEYWORD_VAL_ACCEPTED_STR, hdu, this.getName()).addKeywordValue(val, getStringAcceptedValuesAsString());
180+
181+
if (OIFitsChecker.FIX_BAD_ACCEPTED_FOR_SINGLE_MATCH && (stringAcceptedValues.length == 1)) {
182+
// TODO: use FIX RULE to log change ...
183+
hdu.setKeyword(this.getName(), stringAcceptedValues[0]);
184+
}
173185
}
174186
}
175187
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,9 @@ public final short[] getAcceptedStaIndexes() {
215215
return getOIFitsFile().getAcceptedStaIndexes(getOiArray());
216216
}
217217

218-
/* --- Other methods --- */
218+
/*
219+
* --- Checker -------------------------------------------------------------
220+
*/
219221
/**
220222
* Check arrname / oiarray and MJD range in addition to OITable.checkKeywords()
221223
* @param checker checker component
@@ -290,7 +292,7 @@ public final TargetIdMatcher getTargetIdMatcherByUIDs(final TargetManager tm, fi
290292
/**
291293
* Return the targetId Matcher corresponding to the given Target (global) or null if missing
292294
* @param tm TargetManager instance
293-
* @param globalTargets target (global)
295+
* @param globalTarget target (global)
294296
* @return targetId Matcher corresponding to the given Target (global) or null if missing
295297
*/
296298
public final TargetIdMatcher getTargetIdMatcher(final TargetManager tm, final Target globalTarget) {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package fr.jmmc.oitools.model;
2121

2222
import fr.jmmc.oitools.OIFitsConstants;
23+
import static fr.jmmc.oitools.OIFitsConstants.FIRST_ID_SHORT;
2324
import static fr.jmmc.oitools.OIFitsConstants.STA_NAME_SEPARATOR;
2425
import fr.jmmc.oitools.meta.ColumnMeta;
2526
import fr.jmmc.oitools.meta.DataRange;
@@ -452,7 +453,7 @@ public void checkSyntax(final OIFitsChecker checker) {
452453
final short refId = staIndexes[i];
453454
final String refName = staNames[i];
454455
// rule [OI_ARRAY_STA_INDEX_MIN] check if the STA_INDEX values >= 1
455-
if ((refId < 1) || OIFitsChecker.isInspectRules()) {
456+
if ((refId < FIRST_ID_SHORT) || OIFitsChecker.isInspectRules()) {
456457
if (checker != null) {
457458
checker.ruleFailed(Rule.OI_ARRAY_STA_INDEX_MIN, this, OIFitsConstants.COLUMN_STA_INDEX).addValueAt(refId, i);
458459
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package fr.jmmc.oitools.model;
2121

2222
import fr.jmmc.oitools.OIFitsConstants;
23+
import static fr.jmmc.oitools.OIFitsConstants.FIRST_ID_SHORT;
2324
import fr.jmmc.oitools.meta.ColumnMeta;
2425
import fr.jmmc.oitools.meta.DataRange;
2526
import fr.jmmc.oitools.meta.KeywordMeta;
@@ -193,7 +194,7 @@ public void checkSyntax(final OIFitsChecker checker) {
193194
final int idxJ = jIndx[i];
194195

195196
// rule [OI_CORR_IINDEX_MIN] check if the IINDEX values >= 1 (JINDEX >= 2)
196-
if ((idxI < 1) || OIFitsChecker.isInspectRules()) {
197+
if ((idxI < FIRST_ID_SHORT) || OIFitsChecker.isInspectRules()) {
197198
if (checker != null) {
198199
checker.ruleFailed(Rule.OI_CORR_IINDEX_MIN, this, OIFitsConstants.COLUMN_IINDX).addValueAt(idxI, i);
199200
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import fr.jmmc.jmcs.util.NumberUtils;
2323
import fr.jmmc.oitools.OIFitsConstants;
24+
import static fr.jmmc.oitools.OIFitsConstants.FIRST_ID_SHORT;
2425
import fr.jmmc.oitools.fits.FitsConstants;
2526
import fr.jmmc.oitools.fits.FitsHDU;
2627
import static fr.jmmc.oitools.meta.CellMeta.NO_STR_VALUES;
@@ -347,7 +348,7 @@ public void removeExpressionColumn(final String name) {
347348

348349
// anyway clear cached values:
349350
clearColumnsRangeValue(name);
350-
351+
351352
// check if the column has an expression
352353
if (column instanceof WaveColumnMeta) {
353354
final WaveColumnMeta colMeta = (WaveColumnMeta) column;
@@ -892,7 +893,7 @@ protected static void checkCorrIndex(final OIFitsChecker checker, final OICorr o
892893
final int idxI = corrindx[row];
893894

894895
// rule [GENERIC_CORRINDX_MIN] check if the CORRINDX values >= 1
895-
if ((idxI < 1) || OIFitsChecker.isInspectRules()) {
896+
if ((idxI < FIRST_ID_SHORT) || OIFitsChecker.isInspectRules()) {
896897
if (checker != null) {
897898
checker.ruleFailed(Rule.GENERIC_CORRINDX_MIN, oidata, colName).addValueAt(idxI, row);
898899
}

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ public final class OIFitsChecker {
4949

5050
public final static int COMPACT_MAX_VALUES = 10;
5151

52+
/** flag to allow fixing bad integer/string values for single matches */
53+
public final static boolean FIX_BAD_ACCEPTED_FOR_SINGLE_MATCH = true;
54+
5255
/** enable checker flag */
5356
private static boolean ENABLE_CHECKER = "true".equalsIgnoreCase(System.getProperty("oitools.checker", "true"));
5457

@@ -147,6 +150,9 @@ private static boolean shouldSkipRule(final Rule rule) {
147150
/** OIFITS2: temporary state to check correlation indexes (OIFitsCorrChecker) keyed by CORRNAME */
148151
private final Map<String, OIFitsCorrChecker> corrCheckers = new HashMap<String, OIFitsCorrChecker>();
149152

153+
/** temporary state to indicate Rules to fix */
154+
private final Set<Rule> fixRules = new HashSet<Rule>();
155+
150156
/**
151157
* Public constructor
152158
*/
@@ -207,6 +213,7 @@ void cleanup() {
207213
setSkipFormat(false);
208214
fileRefStandards.clear();
209215
corrCheckers.clear();
216+
fixRules.clear();
210217

211218
/* prune failure storage */
212219
for (Map.Entry<RuleFailure, DataLocation> entry : failures.entrySet()) {
@@ -654,6 +661,18 @@ OIFitsCorrChecker getCorrChecker(final String corrName) {
654661
return corrChecker;
655662
}
656663

664+
Set<Rule> getFixRules() {
665+
return fixRules;
666+
}
667+
668+
public boolean hasFixRule(final Rule rule) {
669+
return getFixRules().contains(rule);
670+
}
671+
672+
void addFixRule(final Rule rule) {
673+
getFixRules().add(rule);
674+
}
675+
657676
/**
658677
* Return the current FileRef
659678
* @return current FileRef

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,6 @@ public short[] getAcceptedTargetIds() {
538538
if (oiTarget == null) {
539539
return EMPTY_SHORT_ARRAY;
540540
}
541-
542541
return oiTarget.getTargetId();
543542
}
544543

@@ -707,7 +706,7 @@ public void checkCrossReference(final OITable oiTable, final OIFitsChecker check
707706
if (oiTable instanceof OITarget) {
708707
final OITarget oitarget = (OITarget) oiTable;
709708

710-
if (oitarget.getNbTargets() < 1 || OIFitsChecker.isInspectRules()) {
709+
if ((oitarget.getNbTargets() < 1) || OIFitsChecker.isInspectRules()) {
711710
// rule [OI_TARGET_TARGET_EXIST] check if the OI_TARGET table have at least one target
712711
if (checker != null) {
713712
checker.ruleFailed(Rule.OI_TARGET_TARGET_EXIST, oitarget);

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import fr.jmmc.jmcs.util.NumberUtils;
2323
import fr.jmmc.oitools.OIFitsConstants;
24+
import static fr.jmmc.oitools.OIFitsConstants.FIRST_ID_SHORT;
2425
import fr.jmmc.oitools.meta.ColumnMeta;
2526
import fr.jmmc.oitools.meta.Types;
2627
import fr.jmmc.oitools.meta.Units;
@@ -435,12 +436,18 @@ public void checkSyntax(final OIFitsChecker checker) {
435436
checker.ruleFailed(Rule.OI_TARGET_TARGET, this, OIFitsConstants.COLUMN_TARGET).addValueAt(targetNames[i], i);
436437
}
437438
}
438-
if ((targetNames[i] != null) || OIFitsChecker.isInspectRules()) {
439+
if ((targetIds != null) || OIFitsChecker.isInspectRules()) {
439440
final short refId = targetIds[i];
440-
if ((refId < 1) || OIFitsChecker.isInspectRules()) {
441+
if ((refId < FIRST_ID_SHORT) || OIFitsChecker.isInspectRules()) {
441442
// rule [OI_TARGET_TARGETID_MIN] check if the TARGET_ID values >= 1
442443
if (checker != null) {
443444
checker.ruleFailed(Rule.OI_TARGET_TARGETID_MIN, this, OIFitsConstants.COLUMN_TARGET).addValueAt(refId, i);
445+
446+
// if only 1 target, fix targetIds and tables later:
447+
if (len == 1) {
448+
targetIds[i] = FIRST_ID_SHORT;
449+
checker.addFixRule(Rule.OI_TARGET_TARGETID_MIN);
450+
}
444451
}
445452
}
446453
final String refName = targetNames[i];

0 commit comments

Comments
 (0)