1 package nom.tam.fits;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 import java.io.IOException;
35 import java.lang.reflect.Array;
36
37 import nom.tam.fits.header.Bitpix;
38 import nom.tam.fits.header.Standard;
39 import nom.tam.util.ArrayDataInput;
40 import nom.tam.util.ArrayDataOutput;
41 import nom.tam.util.ArrayFuncs;
42 import nom.tam.util.Cursor;
43 import nom.tam.util.FitsEncoder;
44
45
46
47
48
49
50
51
52
53
54
55
56
57 public class RandomGroupsData extends Data {
58
59 private int groups;
60 private Object[] sampleRow;
61 private Object[][] dataArray;
62
63
64
65
66 public RandomGroupsData() {
67 dataArray = new Object[0][];
68 }
69
70
71
72
73
74
75
76
77
78 RandomGroupsData(int gcount, Object[] sampleRow) {
79 this();
80 groups = gcount;
81 this.sampleRow = sampleRow;
82 }
83
84
85
86
87
88
89
90
91
92 public RandomGroupsData(Object[][] x) throws IllegalArgumentException {
93 dataArray = x == null ? new Object[0][] : x;
94 groups = dataArray.length;
95 if (groups > 0) {
96
97 if (dataArray[0].length != 2) {
98 throw new IllegalArgumentException("Second array dimension must be 2");
99 }
100
101 if (Array.getLength(ArrayFuncs.getDimensions(dataArray[0][0])) != 1) {
102 throw new IllegalArgumentException("Expected 1D parameter array.");
103 }
104
105 if (dataArray[0][1] != null) {
106 Class<?> pbase = ArrayFuncs.getBaseClass(dataArray[0][0]);
107 Class<?> dbase = ArrayFuncs.getBaseClass(dataArray[0][1]);
108
109 if (pbase != dbase) {
110 throw new IllegalArgumentException(
111 "Mismatched parameters and data types (" + pbase.getName() + " vs " + dbase.getName() + ")");
112 }
113 }
114
115 sampleRow = new Object[2];
116 sampleRow[0] = ArrayFuncs.deepClone(dataArray[0][0]);
117 sampleRow[1] = ArrayFuncs.deepClone(dataArray[0][1]);
118 }
119 }
120
121
122
123
124
125
126
127
128 public Class<?> getElementType() {
129 return sampleRow == null ? null : ArrayFuncs.getBaseClass(sampleRow[0]);
130 }
131
132
133
134
135
136
137
138
139
140
141 public int getParameterCount() {
142 return sampleRow == null ? -1 : Array.getLength(sampleRow[0]);
143 }
144
145
146
147
148
149
150
151
152
153
154 public int[] getDataDims() {
155 return sampleRow == null ? null : ArrayFuncs.getDimensions(sampleRow[1]);
156 }
157
158 @SuppressWarnings("deprecation")
159 @Override
160 protected void fillHeader(Header h) throws FitsException {
161 if (groups <= 0) {
162 throw new FitsException("Invalid (empty) random group data");
163 }
164 Standard.context(RandomGroupsData.class);
165
166
167
168 h.deleteKey(Standard.XTENSION);
169
170 Cursor<String, HeaderCard> c = h.iterator();
171 c.add(HeaderCard.create(Standard.SIMPLE, true));
172 c.add(HeaderCard.create(Standard.BITPIX, Bitpix.forPrimitiveType(getElementType()).getHeaderValue()));
173
174 int[] dims = getDataDims();
175 c.add(HeaderCard.create(Standard.NAXIS, dims.length + 1));
176 h.addValue(Standard.NAXIS1, 0);
177
178 for (int i = 1; i <= dims.length; i++) {
179 c.add(HeaderCard.create(Standard.NAXISn.n(i + 1), dims[dims.length - i]));
180 }
181
182
183 c.add(HeaderCard.create(Standard.GROUPS, true));
184 c.add(HeaderCard.create(Standard.PCOUNT, getParameterCount()));
185 c.add(HeaderCard.create(Standard.GCOUNT, groups));
186 c.add(HeaderCard.create(Standard.EXTEND, true));
187
188 Standard.context(null);
189 }
190
191 @Override
192 protected long getTrueSize() {
193 if (sampleRow == null) {
194 return 0;
195 }
196 return (FitsEncoder.computeSize(sampleRow[0]) + FitsEncoder.computeSize(sampleRow[1])) * groups;
197 }
198
199 @Override
200 public boolean isEmpty() {
201 return dataArray.length == 0;
202 }
203
204 @Override
205 protected void loadData(ArrayDataInput in) throws IOException {
206 dataArray = new Object[groups][2];
207
208 for (int i = 0; i < groups; i++) {
209 dataArray[i][0] = ((Object[]) ArrayFuncs.deepClone(sampleRow))[0];
210 dataArray[i][1] = ((Object[]) ArrayFuncs.deepClone(sampleRow))[1];
211 }
212
213 in.readImage(dataArray);
214 }
215
216 @Override
217 protected Object[][] getCurrentData() {
218 return dataArray;
219 }
220
221 @Override
222 public Object[][] getData() throws FitsException {
223 return (Object[][]) super.getData();
224 }
225
226 @SuppressWarnings({"resource", "deprecation"})
227 @Override
228 public void write(ArrayDataOutput str) throws FitsException {
229 if (getTrueSize() <= 0) {
230 return;
231 }
232
233 if (str != getRandomAccessInput()) {
234 ensureData();
235 }
236
237 try {
238 str.writeArray(dataArray);
239 FitsUtil.pad(str, getTrueSize());
240 } catch (IOException e) {
241 throw new FitsException("IO error writing random groups data ", e);
242 }
243 }
244
245 @SuppressWarnings("deprecation")
246 @Override
247 public RandomGroupsHDU toHDU() throws FitsException {
248 Header h = new Header();
249 fillHeader(h);
250 return new RandomGroupsHDU(h, this);
251 }
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267 public Object getImage(int group) throws ArrayIndexOutOfBoundsException, FitsException {
268 ensureData();
269 return dataArray[group][1];
270 }
271
272 Object getParameterArray(int group) throws ArrayIndexOutOfBoundsException, FitsException {
273 ensureData();
274 return dataArray[group][0];
275 }
276
277 }