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