Skip to content

Commit f7e14d5

Browse files
committed
2nd refactoring to provide more table filters: TargetUID, NightId
PlotChartPanel uses maskOIData1D too, Merger not yet. Selector have a new filterMap<columnName, List<> values)
1 parent 71cfa8c commit f7e14d5

12 files changed

Lines changed: 371 additions & 140 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ NS_MODEL_T3PHIERR D(NWAVE) Model of the error in triple-product phase in degrees
420420
public final static String COLUMN_POS_ANGLE = "POS_ANGLE";
421421
/** SPATIAL_FREQ derived OIData column as double[][] */
422422
public final static String COLUMN_SPATIAL_FREQ = "SPATIAL_FREQ";
423-
/** NIGHT_ID derived OiData column as double[] */
423+
/** NIGHT_ID derived OiData column as int[] */
424424
public final static String COLUMN_NIGHT_ID = "NIGHT_ID";
425425
/** UCOORD_SPATIAL derived OIData column as double[][] */
426426
public final static String COLUMN_UCOORD_SPATIAL = "UCOORD_SPATIAL";

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -233,13 +233,13 @@ private static void merge(final String[] args) throws FitsException, IOException
233233
selector.setNightID(Integer.valueOf(night));
234234
}
235235
if (baselines != null) {
236-
selector.setBaselines(parseStrings(baselines));
236+
selector.addFilter(Selector.FILTER_BASELINE, parseStrings(baselines));
237237
}
238238
if (mjds != null) {
239-
selector.setMJDRanges(parseRanges(mjds));
239+
selector.addFilter(Selector.FILTER_MJD, parseRanges(mjds));
240240
}
241241
if (wavelengths != null) {
242-
selector.setWavelengthRanges(parseRanges(wavelengths));
242+
selector.addFilter(Selector.FILTER_WAVELENGTH, parseRanges(wavelengths));
243243
}
244244

245245
// Call merge
@@ -412,12 +412,13 @@ public static String dumpRanges(List<Range> values) {
412412

413413
public static String generateCLIargs(final Selector selector) {
414414
if (selector != null) {
415+
// TODO: make it generic !
415416
return ((selector.getTargetUID() != null) ? OIFitsProcessor.OPTION_TARGET + " " + selector.getTargetUID() + " " : "")
416417
+ ((selector.getInsModeUID() != null) ? OIFitsProcessor.OPTION_INSNAME + " " + selector.getInsModeUID() + " " : "")
417418
+ ((selector.getNightID() != null) ? OIFitsProcessor.OPTION_NIGHT + " " + selector.getNightID() + " " : "")
418-
+ ((selector.getBaselines() != null) ? OIFitsProcessor.OPTION_BASELINES + " " + dumpStrings(selector.getBaselines()) + " " : "")
419-
+ ((selector.getMJDRanges() != null) ? OIFitsProcessor.OPTION_MJD_RANGES + " " + dumpRanges(selector.getMJDRanges()) + " " : "")
420-
+ ((selector.getWavelengthRanges() != null) ? OIFitsProcessor.OPTION_WL_RANGES + " " + dumpRanges(selector.getWavelengthRanges()) + " " : "");
419+
+ ((selector.hasFilter(Selector.FILTER_BASELINE)) ? OIFitsProcessor.OPTION_BASELINES + " " + dumpStrings(selector.getFilter(Selector.FILTER_BASELINE)) + " " : "")
420+
+ ((selector.hasFilter(Selector.FILTER_MJD)) ? OIFitsProcessor.OPTION_MJD_RANGES + " " + dumpRanges(selector.getFilter(Selector.FILTER_MJD)) + " " : "")
421+
+ ((selector.hasFilter(Selector.FILTER_WAVELENGTH)) ? OIFitsProcessor.OPTION_WL_RANGES + " " + dumpRanges(selector.getFilter(Selector.FILTER_WAVELENGTH)) + " " : "");
421422
}
422423
return "";
423424
}

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

Lines changed: 66 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,16 @@
1919
import fr.jmmc.jmcs.util.NumberUtils;
2020
import fr.jmmc.jmcs.util.ObjectUtils;
2121
import fr.jmmc.jmcs.util.ToStringable;
22-
import fr.jmmc.oitools.OIFitsConstants;
2322
import fr.jmmc.oitools.fits.FitsTable;
2423
import fr.jmmc.oitools.model.Granule.GranuleField;
2524
import fr.jmmc.oitools.model.range.Range;
2625
import fr.jmmc.oitools.processing.Double1DFilter;
2726
import fr.jmmc.oitools.processing.FitsTableFilter;
2827
import fr.jmmc.oitools.processing.FitsTableFilter.FilterState;
28+
import fr.jmmc.oitools.processing.NightIdFilter;
2929
import fr.jmmc.oitools.processing.Selector;
3030
import fr.jmmc.oitools.processing.SelectorResult;
31+
import fr.jmmc.oitools.processing.TargetUIDFilter;
3132
import fr.jmmc.oitools.util.GranuleComparator;
3233
import fr.jmmc.oitools.util.OIFitsFileComparator;
3334
import fr.nom.tam.fits.FitsException;
@@ -423,12 +424,40 @@ public SelectorResult findOIData(final Selector selector, final SelectorResult i
423424
result = (result != null) ? result : new SelectorResult(this);
424425

425426
// Prepare filters (once) in selectorResult:
426-
if ((selector != null) && selector.hasWavelengthRanges()) {
427-
final List<FitsTableFilter<?>> wlFilters = result.getFiltersOIWavelength();
428-
wlFilters.clear();
429-
wlFilters.add(new Double1DFilter(
430-
OIFitsConstants.COLUMN_EFF_WAVE, selector.getWavelengthRanges())
431-
);
427+
if (selector != null) {
428+
// Create the filter chain:
429+
{
430+
// OIData filters:
431+
final List<FitsTableFilter<?>> filtersData1D = result.getFiltersOIData();
432+
filtersData1D.clear();
433+
// subset filters:
434+
if (selector.getTargetUID() != null) {
435+
filtersData1D.add(new TargetUIDFilter(tm, selector.getTargetUID()));
436+
}
437+
// insModeUID: useless as granule already handled this criteria
438+
if (selector.getNightID() != null) {
439+
filtersData1D.add(new NightIdFilter(selector.getNightID()));
440+
}
441+
// table refs: see OIData filtering below
442+
443+
// generic filters:
444+
if (selector.hasFilter(Selector.FILTER_MJD)) {
445+
filtersData1D.add(new Double1DFilter(Selector.FILTER_MJD,
446+
selector.getFilter(Selector.FILTER_MJD)));
447+
}
448+
// TODO: copy generic filters from selector.filters (1D)
449+
}
450+
{
451+
// Wavelength filters:
452+
final List<FitsTableFilter<?>> filtersWL = result.getFiltersOIWavelength();
453+
filtersWL.clear();
454+
455+
if (selector.hasFilter(Selector.FILTER_WAVELENGTH)) {
456+
filtersWL.add(new Double1DFilter(Selector.FILTER_WAVELENGTH,
457+
selector.getFilter(Selector.FILTER_WAVELENGTH)));
458+
}
459+
// TODO: copy generic filters from selector.filters (WLEN only)
460+
}
432461
}
433462

434463
for (Granule g : granules) {
@@ -492,11 +521,10 @@ public SelectorResult findOIData(final Selector selector, final SelectorResult i
492521
* @param oiData the oiData to add, and to read its OIWavelength to compute the IndexMask
493522
*/
494523
private void filterOIData(final SelectorResult result, final Granule g, final OIData oiData) {
495-
496524
logger.log(Level.FINE, "filterOIData: oiData = {0}", oiData);
497525

498526
// apply filters on OIData:
499-
// OIWavelength filters:
527+
// 1. OIWavelength filters:
500528
final OIWavelength oiWavelength = oiData.getOiWavelength();
501529

502530
if (result.hasFiltersOIWavelength()) {
@@ -508,14 +536,18 @@ private void filterOIData(final SelectorResult result, final Granule g, final OI
508536
}
509537
// oiWavelength already processed ?
510538
if (result.getWavelengthMask(oiWavelength) == null) {
511-
final IndexMask wavelengthMask = computeMask1D(
539+
final IndexMask maskWavelength = computeMask1D(
512540
result.getFiltersOIWavelength(), oiWavelength, result.getFiltersUsed()
513541
);
514-
if (wavelengthMask == null) {
542+
if (maskWavelength == null) {
515543
// skip OIData (no remaining row):
516544
return;
517545
}
518-
result.putWavelengthMask(oiWavelength, wavelengthMask);
546+
if (logger.isLoggable(Level.FINE)) {
547+
logger.log(Level.FINE, "wlen filters: {0}", result.getFiltersOIWavelength());
548+
logger.log(Level.FINE, "wlenMask: {0}", maskWavelength);
549+
}
550+
result.putWavelengthMask(oiWavelength, maskWavelength);
519551
}
520552
} else if (oiWavelength != null) {
521553
// oiWavelength already processed ?
@@ -524,6 +556,22 @@ private void filterOIData(final SelectorResult result, final Granule g, final OI
524556
result.putWavelengthMask(oiWavelength, IndexMask.FULL);
525557
}
526558
}
559+
560+
// 2. OIData filters:
561+
if (result.hasFiltersOIData()) {
562+
final IndexMask maskRows = computeMask1D(
563+
result.getFiltersOIData(), oiData, result.getFiltersUsed()
564+
);
565+
if (maskRows == null) {
566+
// skip OIData (no remaining row):
567+
return;
568+
}
569+
if (logger.isLoggable(Level.FINE)) {
570+
logger.log(Level.FINE, "oidata filters: {0}", result.getFiltersOIData());
571+
logger.log(Level.FINE, "maskRows: {0}", maskRows);
572+
}
573+
result.putDataMask1D(oiData, maskRows);
574+
}
527575
result.addOIData(g, oiData);
528576
}
529577

@@ -661,14 +709,16 @@ private List<Granule> findGranules(final Selector selector) {
661709
final Granule pattern = new Granule(target, insMode, nightId);
662710

663711
// Baselines criteria:
664-
if (selector.hasBaselines()) {
665-
pattern.getDistinctStaNames().addAll(selector.getBaselines());
712+
if (selector.hasFilter(Selector.FILTER_BASELINE)) {
713+
pattern.getDistinctStaNames().addAll(selector.getFilter(Selector.FILTER_BASELINE));
666714
}
667715

668716
// MJD & Wavelength ranges criteria:
669717
final GranuleMatcher granuleMatcher = GranuleMatcher.getInstance(
670-
(selector.hasMJDRanges()) ? new LinkedHashSet<Range>(selector.getMJDRanges()) : null,
671-
(selector.hasWavelengthRanges()) ? new LinkedHashSet<Range>(selector.getWavelengthRanges()) : null
718+
(selector.hasFilter(Selector.FILTER_MJD))
719+
? new LinkedHashSet<Range>(selector.getFilter(Selector.FILTER_MJD)) : null,
720+
(selector.hasFilter(Selector.FILTER_WAVELENGTH))
721+
? new LinkedHashSet<Range>(selector.getFilter(Selector.FILTER_WAVELENGTH)) : null
672722
);
673723

674724
if (!pattern.isEmpty() || !granuleMatcher.isEmpty()) {

src/main/java/fr/jmmc/oitools/processing/Double1DFilter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
import java.util.logging.Level;
1212

1313
/**
14-
*
14+
* Generic numeric filter on double[] 1D arrays
1515
* @author bourgesl
1616
*/
17-
public class Double1DFilter extends FitsTableFilter<Range> {
17+
public final class Double1DFilter extends FitsTableFilter<Range> {
1818

1919
// members:
2020
private double[] tableColumn1D = null;

src/main/java/fr/jmmc/oitools/processing/FitsTableFilter.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
package fr.jmmc.oitools.processing;
55

66
import fr.jmmc.oitools.fits.FitsTable;
7+
import fr.jmmc.oitools.model.range.Range;
8+
import java.util.Arrays;
79
import java.util.List;
810
import java.util.logging.Logger;
911

@@ -53,8 +55,22 @@ public boolean is2D() {
5355

5456
@Override
5557
public String toString() {
56-
return "FitsTableFilter{" + "columnName=" + columnName + ", acceptedValues=" + acceptedValues
57-
+ ", is2D= " + is2D() + '}';
58+
return getClass().getSimpleName() + "{columnName=" + columnName + ", acceptedValues=" + acceptedValues
59+
+ ", is2D=" + is2D() + '}';
5860
}
5961

62+
// --- utility methods ---
63+
public static List<String> asList(final String value) {
64+
return Arrays.asList(new String[]{value});
65+
}
66+
67+
public static List<Range> asList(final Range value) {
68+
return Arrays.asList(new Range[]{value});
69+
}
70+
71+
public static void resetFilters(final List<FitsTableFilter<?>> filters) {
72+
for (int f = 0, len = filters.size(); f < len; f++) {
73+
filters.get(f).reset();
74+
}
75+
}
6076
}

src/main/java/fr/jmmc/oitools/processing/Merger.java

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -482,12 +482,12 @@ private static void processOIWavelengths(final Context ctx) {
482482
newOiWavelength.setInsName(newName);
483483

484484
// get the wavelength mask for this wavelength table:
485-
final IndexMask wavelengthMask = selectorResult.getWavelengthMask(oiWavelength);
485+
final IndexMask maskWavelength = selectorResult.getWavelengthMaskNotFull(oiWavelength);
486486

487-
if (wavelengthMask != null && !wavelengthMask.isFull()) {
488-
final int nKeepRows = wavelengthMask.cardinality();
487+
if (maskWavelength != null) {
488+
final int nKeepRows = maskWavelength.cardinality();
489489
// redim the table to the correct row count to prune invalid rows:
490-
newOiWavelength.resizeTable(nKeepRows, wavelengthMask.getBitSet());
490+
newOiWavelength.resizeTable(nKeepRows, maskWavelength.getBitSet());
491491

492492
logger.log(Level.INFO, "Table[{0}] filtered from Table[{1}]",
493493
new Object[]{newOiWavelength, oiWavelength});
@@ -639,8 +639,8 @@ private static void processOIData(final Context ctx) {
639639
final List<Range> gMJDRanges;
640640
final Set<Range> mjdRangeMatchings;
641641

642-
if ((selector != null) && selector.hasMJDRanges()) {
643-
gMJDRanges = selector.getMJDRanges();
642+
if ((selector != null) && selector.hasFilter(Selector.FILTER_MJD)) {
643+
gMJDRanges = selector.getFilter(Selector.FILTER_MJD);
644644
mjdRangeMatchings = new HashSet<Range>();
645645
} else {
646646
gMJDRanges = null;
@@ -652,8 +652,8 @@ private static void processOIData(final Context ctx) {
652652
final Map<String, StaNamesDir> usedStaNamesMap;
653653
final Set<short[]> staIndexMatchings; // identity
654654

655-
if ((selector != null) && selector.hasBaselines()) {
656-
gBaselines = selectorResult.getSelector().getBaselines();
655+
if ((selector != null) && selector.hasFilter(Selector.FILTER_BASELINE)) {
656+
gBaselines = selector.getFilter(Selector.FILTER_BASELINE);
657657
usedStaNamesMap = selectorResult.getOiFitsCollection().getUsedStaNamesMap();
658658
staIndexMatchings = new HashSet<short[]>();
659659
} else {
@@ -681,14 +681,6 @@ private static void processOIData(final Context ctx) {
681681
}
682682
newInsName = newOiWavelength.getInsName();
683683

684-
// get the wavelength mask for the OIData's wavelength table:
685-
final IndexMask wavelengthMask = selectorResult.getWavelengthMask(oiData.getOiWavelength());
686-
687-
logger.log(Level.FINE, "Mask WL: {0}", wavelengthMask);
688-
689-
// check wavelengths:
690-
final boolean checkWavelengths = (wavelengthMask != null && !wavelengthMask.isFull());
691-
692684
// ARRNAME:
693685
final OIArray newOiArray = mapOIArrays.get(oiData.getOiArray());
694686
if (newOiArray == null) {
@@ -785,6 +777,10 @@ private static void processOIData(final Context ctx) {
785777
checkMJDRanges = !Range.matchFully(oiDataMJDRange, mjdRangeMatchings);
786778
}
787779

780+
// get the wavelength mask for the OIData's wavelength table:
781+
final IndexMask maskWavelength = selectorResult.getWavelengthMaskNotFull(oiData.getOiWavelength());
782+
783+
// Copy table and filter out useless rows:
788784
final OIData newOIData = (OIData) resultFile.copyTable(oiData);
789785

790786
// Change INSNAME, ARRNAME & CORRNAME keywords:
@@ -795,7 +791,7 @@ private static void processOIData(final Context ctx) {
795791
boolean filterRows = false;
796792

797793
final BitSet maskRows;
798-
if (checkTargetId || checkNightId || checkBaselines || checkMJDRanges || checkWavelengths) {
794+
if (checkTargetId || checkNightId || checkBaselines || checkMJDRanges || (maskWavelength != null)) {
799795
final int nRows = newOIData.getNbRows();
800796

801797
// prepare mask to indicate rows to keep in output table:
@@ -813,6 +809,7 @@ private static void processOIData(final Context ctx) {
813809
for (int i = 0; i < nRows; i++) {
814810
boolean skip = false;
815811

812+
// TODO: use masks HERE
816813
if (checkTargetId) {
817814
final Short oldTargetId = Short.valueOf(targetIds[i]);
818815
Short newTargetId = mapTargetIds.get(oldTargetId);
@@ -858,7 +855,7 @@ private static void processOIData(final Context ctx) {
858855
// update targetId column before table filter:
859856
newOIData.setTargetId(newTargetIds);
860857

861-
if (filterRows || checkWavelengths) {
858+
if (filterRows || (maskWavelength != null)) {
862859
final int nKeepRows = maskRows.cardinality();
863860

864861
if (nKeepRows <= 0) {
@@ -867,7 +864,7 @@ private static void processOIData(final Context ctx) {
867864
} else {
868865
// redim the table to the correct row count to prune invalid rows:
869866
newOIData.resizeTable(nKeepRows, maskRows,
870-
(wavelengthMask != null) ? wavelengthMask.getBitSet() : null);
867+
(maskWavelength != null) ? maskWavelength.getBitSet() : null);
871868
}
872869
}
873870
}

0 commit comments

Comments
 (0)