Skip to content

Commit b1827a2

Browse files
committed
OIDataListHelper moved into oitools
OIFitsCollection has new methods List<String> getDistinctValues(name) and Range getColumnRange(name)
1 parent 037f185 commit b1827a2

7 files changed

Lines changed: 356 additions & 59 deletions

File tree

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,7 +1044,7 @@ protected final Map<String, Object> getColumnsRangeValue() {
10441044
* @param name column name
10451045
* @return Range instance
10461046
*/
1047-
public final Range getColumnRange(final String name) {
1047+
public Range getColumnRange(final String name) {
10481048
final String key = name + "_RANGE";
10491049

10501050
/* retrieve value in columnsRangeValue map of associated column */
@@ -1245,9 +1245,11 @@ public final Object getMinMaxColumnValue(final String name) {
12451245
default:
12461246
// do nothing
12471247
}
1248+
if (range != null) {
1249+
/* store in associated column range value */
1250+
getColumnsRangeValue().put(name, range);
1251+
}
12481252
}
1249-
/* store in associated column range value */
1250-
getColumnsRangeValue().put(name, range);
12511253
}
12521254
return range;
12531255
}

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,11 +198,12 @@ private void process(final OIData oiData) {
198198
// Fill distinct Night Id:
199199
final Set<NightId> distinctNightId = oiData.getDistinctNightId();
200200
// Fill distinct Granule:
201-
final Map<Granule, Granule> distinctGranules = oiData.getOIFitsFile().getDistinctGranules();
201+
final OIFitsFile oiFitsFile = oiData.getOIFitsFile();
202+
final Map<Granule, Granule> distinctGranules = oiFitsFile.getDistinctGranules();
202203
// Fill oidata tables per (distinct) Granule:
203-
final Map<Granule, Set<OIData>> oiDataPerGranule = oiData.getOIFitsFile().getOiDataPerGranule();
204+
final Map<Granule, Set<OIData>> oiDataPerGranule = oiFitsFile.getOiDataPerGranule();
204205
// Fill used staNames to StaNamesDir (reference StaNames / orientation):
205-
final Map<String, StaNamesDir> usedStaNamesMap = oiData.getOIFitsFile().getUsedStaNamesMap();
206+
final Map<String, StaNamesDir> usedStaNamesMap = oiFitsFile.getUsedStaNamesMap();
206207

207208
// reused NightId:
208209
NightId n = new NightId();
@@ -281,8 +282,6 @@ private void process(final OIData oiData) {
281282
}
282283
// update tables associated to the current granule:
283284
oiDataTables.add(oiData);
284-
285-
// TODO: generate mask(rows = i indices) (BitSet ?) for every table corresponding to the granule ?
286285
}
287286

288287
if (isLogDebug) {

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,16 +177,17 @@ public final OIArray getOiArray() {
177177

178178
final String arrName = getArrName();
179179
if (arrName != null) {
180-
final OIArray oiArray = getOIFitsFile().getOiArray(arrName);
180+
final OIFitsFile oiFitsFile = getOIFitsFile();
181+
final OIArray oiArray = oiFitsFile.getOiArray(arrName);
181182

182183
if (oiArray != null) {
183184
if (logger.isLoggable(Level.FINE)) {
184185
logger.log(Level.FINE, "Resolved OI_Array reference [{0}] to {1}",
185186
new Object[]{oiArray.getExtNb(), super.toString()});
186187
}
187188
this.oiArrayRef = oiArray;
188-
} else if (!getOIFitsFile().hasMissingTableName(arrName) && logger.isLoggable(Level.WARNING)) {
189-
getOIFitsFile().addMissingTableName(arrName);
189+
} else if (!oiFitsFile.hasMissingTableName(arrName) && logger.isLoggable(Level.WARNING)) {
190+
oiFitsFile.addMissingTableName(arrName);
190191
logger.log(Level.WARNING, "Missing OI_Array table identified by ARRNAME=''{0}''", arrName);
191192
}
192193
return oiArray;

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

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -697,16 +697,17 @@ public final OIWavelength getOiWavelength() {
697697
}
698698
final String insName = getInsName();
699699
if (insName != null) {
700-
final OIWavelength oiWavelength = getOIFitsFile().getOiWavelength(insName);
700+
final OIFitsFile oiFitsFile = getOIFitsFile();
701+
final OIWavelength oiWavelength = oiFitsFile.getOiWavelength(insName);
701702

702703
if (oiWavelength != null) {
703704
if (logger.isLoggable(Level.FINE)) {
704705
logger.log(Level.FINE, "Resolved OI_WAVELENGTH reference [{0} | NWAVE={1} ] to {2}",
705706
new Object[]{oiWavelength.getExtNb(), oiWavelength.getNWave(), super.toString()});
706707
}
707708
this.oiWavelengthRef = oiWavelength;
708-
} else if (!getOIFitsFile().hasMissingTableName(insName) && logger.isLoggable(Level.WARNING)) {
709-
getOIFitsFile().addMissingTableName(insName);
709+
} else if (!oiFitsFile.hasMissingTableName(insName) && logger.isLoggable(Level.WARNING)) {
710+
oiFitsFile.addMissingTableName(insName);
710711
logger.log(Level.WARNING, "Missing OI_WAVELENGTH table identified by INSNAME=''{0}''", insName);
711712
}
712713
return oiWavelength;
@@ -725,15 +726,16 @@ public final OICorr getOiCorr() {
725726
}
726727
final String corrName = getCorrName();
727728
if (corrName != null) {
728-
final OICorr oiCorr = getOIFitsFile().getOiCorr(corrName);
729+
final OIFitsFile oiFitsFile = getOIFitsFile();
730+
final OICorr oiCorr = oiFitsFile.getOiCorr(corrName);
729731

730732
if (oiCorr != null) {
731733
if (logger.isLoggable(Level.FINE)) {
732734
logger.log(Level.FINE, "Resolved OI_Corr reference [{0}] to {1}", new Object[]{oiCorr.getExtNb(), super.toString()});
733735
}
734736
this.oiCorrRef = oiCorr;
735-
} else if (!getOIFitsFile().hasMissingTableName(corrName) && logger.isLoggable(Level.WARNING)) {
736-
getOIFitsFile().addMissingTableName(corrName);
737+
} else if (!oiFitsFile.hasMissingTableName(corrName) && logger.isLoggable(Level.WARNING)) {
738+
oiFitsFile.addMissingTableName(corrName);
737739
logger.log(Level.WARNING, "Missing OI_Corr table identified by CORRNAME=''{0}''", corrName);
738740
}
739741
return oiCorr;
@@ -962,11 +964,7 @@ public void getMatchingStaConfs(final List<String> selectedStaNames,
962964
* @return wavelenth range
963965
*/
964966
public final Range getEffWaveRange() {
965-
final OIWavelength oiWavelength = getOiWavelength();
966-
if (oiWavelength != null) {
967-
return oiWavelength.getEffWaveRange();
968-
}
969-
return null;
967+
return getColumnRange(OIFitsConstants.COLUMN_EFF_WAVE);
970968
}
971969

972970
/**
@@ -977,6 +975,22 @@ public final Range getMjdRange() {
977975
return getColumnRange(OIFitsConstants.COLUMN_MJD);
978976
}
979977

978+
/**
979+
* Return the column range given its name
980+
*
981+
* @param name column name
982+
* @return Range instance
983+
*/
984+
public final Range getColumnRange(final String name) {
985+
// Intercept EFF_WAVE and EFF_BAND to use OI_WAVELENGTH:
986+
if (OIFitsConstants.COLUMN_EFF_WAVE.equals(name)
987+
|| OIFitsConstants.COLUMN_EFF_BAND.equals(name)) {
988+
final OIWavelength oiWavelength = getOiWavelength();
989+
return (oiWavelength != null) ? oiWavelength.getColumnRange(name) : null;
990+
}
991+
return super.getColumnRange(name);
992+
}
993+
980994
/**
981995
* Return true if the given error value is valid ie. NaN or is positive or equals to 0
982996
* @param checker checker component
Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
/*******************************************************************************
2+
* JMMC project ( http://www.jmmc.fr ) - Copyright (C) CNRS.
3+
******************************************************************************/
4+
package fr.jmmc.oitools.model;
5+
6+
import fr.jmmc.jmcs.util.StringUtils;
7+
import fr.jmmc.oitools.OIFitsConstants;
8+
import fr.jmmc.oitools.model.range.Range;
9+
import fr.jmmc.oitools.util.StationNamesComparator;
10+
import java.util.ArrayList;
11+
import java.util.Collection;
12+
import java.util.Collections;
13+
import java.util.HashSet;
14+
import java.util.List;
15+
import java.util.Map;
16+
import java.util.Set;
17+
import java.util.logging.Level;
18+
import java.util.logging.Logger;
19+
20+
/**
21+
*
22+
* @author bourgesl
23+
*/
24+
public final class OIDataListHelper {
25+
26+
/** logger */
27+
protected final static Logger logger = Logger.getLogger(OIDataListHelper.class.getName());
28+
29+
/* GetOIDataString operators */
30+
public final static GetOIDataString GET_ARR_NAME = new GetOIDataString() {
31+
@Override
32+
public String getString(final OIData oiData) {
33+
return oiData.getArrName();
34+
}
35+
};
36+
37+
public final static GetOIDataString GET_INS_NAME = new GetOIDataString() {
38+
@Override
39+
public String getString(final OIData oiData) {
40+
return oiData.getInsName();
41+
}
42+
};
43+
44+
public final static GetOIDataString GET_DATE_OBS = new GetOIDataString() {
45+
@Override
46+
public String getString(final OIData oiData) {
47+
return oiData.getDateObs();
48+
}
49+
};
50+
51+
private OIDataListHelper() {
52+
super();
53+
}
54+
55+
/**
56+
* Return the unique String values from given operator applied on given OIData tables
57+
* @param oiDataList OIData tables
58+
* @param set set instance to use
59+
* @param operator operator to get String values
60+
* @return unique String values
61+
*/
62+
public static Set<String> getDistinct(final Collection<OIData> oiDataList, final Set<String> set, final GetOIDataString operator) {
63+
String value;
64+
for (OIData oiData : oiDataList) {
65+
value = operator.getString(oiData);
66+
if (value != null) {
67+
logger.log(Level.FINE, "getDistinct: {0}", value);
68+
69+
int pos = value.indexOf('_');
70+
71+
if (pos != -1) {
72+
value = value.substring(0, pos);
73+
}
74+
set.add(value);
75+
}
76+
}
77+
return set;
78+
}
79+
80+
/**
81+
* Return the unique String values from given operator applied on given OIData tables
82+
* @param oiDataList OIData tables
83+
* @param set set instance to use
84+
* @param operator operator to get String values
85+
* @return unique String values
86+
*/
87+
public static Set<String> getDistinctNoSuffix(final Collection<OIData> oiDataList, final Set<String> set, final GetOIDataString operator) {
88+
String value;
89+
for (OIData oiData : oiDataList) {
90+
value = operator.getString(oiData);
91+
if (value != null) {
92+
logger.log(Level.FINE, "getDistinctNoSuffix: {0}", value);
93+
94+
int pos = value.lastIndexOf('_');
95+
96+
if (pos != -1) {
97+
final String suffix = value.substring(pos + 1, value.length());
98+
try {
99+
Integer.parseInt(suffix);
100+
// strip suffix:
101+
value = value.substring(0, pos);
102+
} catch (NumberFormatException nfe) {
103+
if (logger.isLoggable(Level.FINE)) {
104+
logger.log(Level.FINE, "getDistinctNoSuffix: " + suffix, nfe);
105+
}
106+
// use complete value
107+
}
108+
}
109+
set.add(value);
110+
}
111+
}
112+
return set;
113+
}
114+
115+
/**
116+
* Return the unique staNames values (sorted by name) from given OIData tables
117+
* @param oiDataList OIData tables
118+
* @param usedStaNamesMap Map of used staNames to StaNamesDir (reference StaNames / orientation)
119+
* @return given set instance
120+
*/
121+
public static List<String> getDistinctStaNames(final Collection<OIData> oiDataList,
122+
final Map<String, StaNamesDir> usedStaNamesMap) {
123+
124+
final Set<String> set = new HashSet<String>(32);
125+
126+
for (final OIData oiData : oiDataList) {
127+
for (final short[] staIndexes : oiData.getDistinctStaIndex()) {
128+
final String staNames = oiData.getRealStaNames(usedStaNamesMap, staIndexes);
129+
set.add(staNames);
130+
}
131+
}
132+
// Sort by name (consistent naming & colors):
133+
final List<String> sortedList = new ArrayList<String>(set);
134+
Collections.sort(sortedList, StationNamesComparator.INSTANCE);
135+
136+
return sortedList;
137+
}
138+
139+
/**
140+
* Return the unique staConfs values from given OIData tables
141+
* @param oiDataList OIData tables
142+
* @return given set instance
143+
*/
144+
public static List<String> getDistinctStaConfs(final Collection<OIData> oiDataList) {
145+
final Set<String> set = new HashSet<String>(32);
146+
147+
for (OIData oiData : oiDataList) {
148+
for (short[] staConf : oiData.getDistinctStaConf()) {
149+
final String staNames = oiData.getStaNames(staConf);
150+
set.add(staNames);
151+
}
152+
}
153+
// Sort by name (consistent naming & colors):
154+
final List<String> sortedList = new ArrayList<String>(set);
155+
Collections.sort(sortedList, StationNamesComparator.INSTANCE);
156+
157+
logger.log(Level.FINE, "getDistinctStaConfs : {0}", sortedList);
158+
return sortedList;
159+
}
160+
161+
/**
162+
* Return the global column range from given OIData tables
163+
* @param oiDataList OIData tables
164+
* @param name column name to extract values
165+
* @return global column range or Range.UNDEFINED_RANGE when nothing found
166+
*/
167+
public static Range getColumnRange(final Collection<OIData> oiDataList, final String name) {
168+
double min = Double.POSITIVE_INFINITY;
169+
double max = Double.NEGATIVE_INFINITY;
170+
171+
for (OIData oiData : oiDataList) {
172+
final Range range = oiData.getColumnRange(name);
173+
174+
if (range.isFinite()) {
175+
if (range.getMin() < min) {
176+
min = range.getMin();
177+
}
178+
if (range.getMax() > max) {
179+
max = range.getMax();
180+
}
181+
}
182+
}
183+
184+
final Range range = (min < max) ? new Range(min, max) : Range.UNDEFINED_RANGE;
185+
186+
logger.log(Level.WARNING, "getColumnRange : {0}", range);
187+
188+
return range;
189+
}
190+
191+
public static Range getWaveLengthRange(final Collection<OIData> oiDataList) {
192+
return getColumnRange(oiDataList, OIFitsConstants.COLUMN_EFF_WAVE);
193+
}
194+
195+
public static void toString(final Set<String> set, final StringBuilder sb, final String internalSeparator, final String separator) {
196+
toString(set, sb, internalSeparator, separator, Integer.MAX_VALUE);
197+
}
198+
199+
public static void toString(final Set<String> set, final StringBuilder sb, final String internalSeparator, final String separator, final int threshold, final String alternateText) {
200+
// hard coded limit:
201+
if (set.size() > threshold) {
202+
sb.append(alternateText);
203+
} else {
204+
toString(set, sb, internalSeparator, separator, Integer.MAX_VALUE);
205+
}
206+
}
207+
208+
private static void toString(final Set<String> set, final StringBuilder sb, final String internalSeparator, final String separator, final int maxLength) {
209+
int n = 0;
210+
for (String v : set) {
211+
sb.append(StringUtils.replaceWhiteSpaces(v, internalSeparator)).append(separator);
212+
n++;
213+
if (n > maxLength) {
214+
return;
215+
}
216+
}
217+
if (n != 0) {
218+
// remove separator at the end:
219+
sb.setLength(sb.length() - separator.length());
220+
221+
}
222+
}
223+
224+
/**
225+
* Get String operator applied on any OIData table
226+
*/
227+
public interface GetOIDataString {
228+
229+
/**
230+
* Return a String value (keyword for example) for the given OIData table
231+
* @param oiData OIData table
232+
* @return String value
233+
*/
234+
public String getString(final OIData oiData);
235+
}
236+
237+
}

0 commit comments

Comments
 (0)