1 package nom.tam.fits;
2
3 import java.io.PrintStream;
4
5 import nom.tam.fits.header.IFitsHeader;
6 import nom.tam.fits.header.Standard;
7 import nom.tam.util.ArrayDataOutput;
8 import nom.tam.util.ArrayFuncs;
9 import nom.tam.util.ColumnTable;
10 import nom.tam.util.Cursor;
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 import static nom.tam.fits.header.Standard.NAXIS1;
44 import static nom.tam.fits.header.Standard.NAXIS2;
45 import static nom.tam.fits.header.Standard.TDIMn;
46 import static nom.tam.fits.header.Standard.TDISPn;
47 import static nom.tam.fits.header.Standard.TFIELDS;
48 import static nom.tam.fits.header.Standard.TFORMn;
49 import static nom.tam.fits.header.Standard.TNULLn;
50 import static nom.tam.fits.header.Standard.TSCALn;
51 import static nom.tam.fits.header.Standard.TTYPEn;
52 import static nom.tam.fits.header.Standard.TUNITn;
53 import static nom.tam.fits.header.Standard.TZEROn;
54 import static nom.tam.fits.header.Standard.XTENSION;
55
56 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
57
58
59
60
61
62
63
64 @SuppressWarnings("deprecation")
65 public class BinaryTableHDU extends TableHDU<BinaryTable> {
66
67
68 private static final IFitsHeader[] KEY_STEMS = {TTYPEn, TFORMn, TUNITn, TNULLn, TSCALn, TZEROn, TDISPn, TDIMn};
69
70
71
72
73
74
75
76
77
78 @Deprecated
79 public BinaryTableHDU(Header hdr, BinaryTable datum) {
80 super(hdr, datum);
81 }
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 public static BinaryTableHDU wrap(BinaryTable tab) throws FitsException {
102 BinaryTableHDU hdu = new BinaryTableHDU(new Header(), tab);
103 tab.fillHeader(hdu.myHeader);
104 return hdu;
105 }
106
107 @Override
108 protected final String getCanonicalXtension() {
109 return Standard.XTENSION_BINTABLE;
110 }
111
112
113
114
115
116
117
118
119
120
121
122
123 @Deprecated
124 public static BinaryTable encapsulate(Object o) throws FitsException {
125 if (o instanceof ColumnTable) {
126 return new BinaryTable((ColumnTable<?>) o);
127 }
128 if (o instanceof Object[][]) {
129 return BinaryTable.fromRowMajor((Object[][]) o);
130 }
131 if (o instanceof Object[]) {
132 return BinaryTable.fromColumnMajor((Object[]) o);
133 }
134 throw new FitsException("Unable to encapsulate object of type:" + o.getClass().getName() + " as BinaryTable");
135 }
136
137
138
139
140
141
142
143
144
145
146
147
148 @SuppressFBWarnings(value = "HSM_HIDING_METHOD", justification = "deprecated existing method, kept for compatibility")
149 @Deprecated
150 public static boolean isData(Object o) {
151 return o instanceof nom.tam.util.ColumnTable || o instanceof Object[][] || o instanceof Object[];
152 }
153
154
155
156
157
158
159
160
161
162
163 @SuppressFBWarnings(value = "HSM_HIDING_METHOD", justification = "deprecated existing method, kept for compatibility")
164 @Deprecated
165 public static boolean isHeader(Header header) {
166 String xten = header.getStringValue(XTENSION);
167 if (xten == null) {
168 return false;
169 }
170 xten = xten.trim();
171 return xten.equals(Standard.XTENSION_BINTABLE) || xten.equals("A3DTABLE");
172 }
173
174
175
176
177
178
179
180
181
182
183
184
185 @Deprecated
186 public static BinaryTable manufactureData(Header header) throws FitsException {
187 return new BinaryTable(header);
188 }
189
190
191
192
193
194
195
196
197
198
199
200 @Deprecated
201 public static Header manufactureHeader(Data data) throws FitsException {
202 Header hdr = new Header();
203 data.fillHeader(hdr);
204 return hdr;
205 }
206
207 @Override
208 public int addColumn(Object data) throws FitsException {
209 int n = myData.addColumn(data);
210 myHeader.addValue(Standard.NAXISn.n(1), myData.getRowBytes());
211 Cursor<String, HeaderCard> c = myHeader.iterator();
212 c.end();
213 myData.fillForColumn(myHeader, c, n - 1);
214 return super.addColumn(data);
215 }
216
217
218
219
220
221
222 protected static IFitsHeader[] binaryTableColumnKeyStems() {
223 return KEY_STEMS;
224 }
225
226 @Override
227 protected IFitsHeader[] columnKeyStems() {
228 return BinaryTableHDU.KEY_STEMS;
229 }
230
231 @Override
232 public void info(PrintStream stream) {
233 stream.println(" Binary Table");
234 stream.println(" Header Information:");
235
236 int nhcol = myHeader.getIntValue(TFIELDS, -1);
237 int nrow = myHeader.getIntValue(NAXIS2, -1);
238 int rowsize = myHeader.getIntValue(NAXIS1, -1);
239
240 stream.print(" " + nhcol + " fields");
241 stream.println(", " + nrow + " rows of length " + rowsize);
242
243 for (int i = 1; i <= nhcol; i++) {
244 stream.print(" " + i + ":");
245 prtField(stream, "Name", TTYPEn.n(i).key());
246 prtField(stream, "Format", TFORMn.n(i).key());
247 prtField(stream, "Dimens", TDIMn.n(i).key());
248 stream.println("");
249 }
250
251 stream.println(" Data Information:");
252 stream.println(" Number of rows=" + myData.getNRows());
253 stream.println(" Number of columns=" + myData.getNCols());
254 stream.println(" Heap size is: " + myData.getParameterSize() + " bytes");
255
256 Object[] cols = myData.getFlatColumns();
257 for (int i = 0; i < cols.length; i++) {
258 stream.println(" " + i + ":" + ArrayFuncs.arrayDescription(cols[i]));
259 }
260 }
261
262
263
264
265
266
267
268
269 @Deprecated
270 public boolean isHeader() {
271 return isHeader(myHeader);
272 }
273
274 private void prtField(PrintStream stream, String type, String field) {
275 String val = myHeader.getStringValue(field);
276 if (val != null) {
277 stream.print(type + '=' + val + "; ");
278 }
279 }
280
281
282
283
284
285
286
287
288
289
290
291
292 public BinaryTable.ColumnDesc getColumnDescriptor(int col) {
293 return myData.getDescriptor(col);
294 }
295
296 @Override
297 public void setColumnName(int index, String name, String comment)
298 throws IndexOutOfBoundsException, HeaderCardException {
299 super.setColumnName(index, name, comment);
300 getColumnDescriptor(index).name(name);
301 }
302
303
304
305
306
307
308
309
310
311
312
313
314
315 public final boolean convertToBits(int col) throws FitsException {
316 if (!myData.convertToBits(col)) {
317 return false;
318 }
319
320
321 myHeader.getCard(Standard.TFORMn.n(col + 1)).setValue(getColumnDescriptor(col).getTFORM());
322
323 return true;
324 }
325
326
327
328
329
330
331
332
333
334
335
336
337
338 public boolean setComplexColumn(int index) throws FitsException {
339 if (!myData.setComplexColumn(index)) {
340 return false;
341 }
342
343
344 myHeader.getCard(Standard.TFORMn.n(index + 1)).setValue(getColumnDescriptor(index).getTFORM());
345
346
347 if (myHeader.containsKey(Standard.TDIMn.n(index + 1))) {
348 String tdim = getColumnDescriptor(index).getTDIM();
349 if (tdim != null) {
350 myHeader.getCard(Standard.TDIMn.n(index + 1)).setValue(tdim);
351 } else {
352 myHeader.deleteKey(Standard.TDIMn.n(index + 1));
353 }
354 }
355
356 return true;
357 }
358
359
360 @Override
361 public void write(ArrayDataOutput out) throws FitsException {
362 myData.fillHeader(myHeader, false);
363 super.write(out);
364 }
365 }