1: # include <hstio.h>
2: # include <stdio.h>
3:
4: void showHdr(Hdr *h, char *title) {
5: int i;
6: printf("%s: number of lines: %d\n",title, h->nlines);
7: if (h->array != NULL)
8: for (i = 0; i < h->nlines; ++i)
9: printf("%s\n",h->array[i]);
10: printf("\n");
11: }
12:
13: void showFloatData(FloatTwoDArray *x, char *title) {
14: int i;
15: printf("%s:\n",title);
16:
17: printf("(%d, 0) %g ",0,PPix(x,0,0));
18: for (i = 1; i < 5; ++i) printf("%g ",PPix(x,i,0));
19: printf(" ... ");
20: printf("(%d, 0) %g ",(x->nx - 5),PPix(x,(x->nx - 5),0));
21: for (i = x->nx - 4; i < x->nx; ++i) printf("%g ",PPix(x,i,0));
22: printf("\n");
23:
24: printf("(%d, 1) %g ",0,PPix(x,0,1));
25: for (i = 1; i < 5; ++i) printf("%g ",PPix(x,i,1));
26: printf(" ... ");
27: printf("(%d, 1) %g ",(x->nx - 5),PPix(x,(x->nx - 5),1));
28: for (i = x->nx - 4; i < x->nx; ++i) printf("%g ",PPix(x,i,1));
29: printf("\n");
30:
31: printf("(%d, max - 2) %g ",0,PPix(x,0,x->ny - 2));
32: for (i = 1; i < 5; ++i) printf("%g ",PPix(x,i,x->ny - 2));
33: printf(" ... ");
34: printf("(%d, max - 2) %g ",(x->nx - 5),PPix(x,(x->nx - 5),x->ny - 2));
35: for (i = x->nx - 4; i < x->nx; ++i) printf("%g ",PPix(x,i,x->ny - 2));
36: printf("\n");
37:
38: printf("(%d, max - 1) %g ",0,PPix(x,0,x->ny - 1));
39: for (i = 1; i < 5; ++i) printf("%g ",PPix(x,i,x->ny - 1));
40: printf(" ... ");
41: printf("(%d, max - 1) %g ",(x->nx - 5),PPix(x,(x->nx - 5),x->ny - 1));
42: for (i = x->nx - 4; i < x->nx; ++i) printf("%g ",PPix(x,i,x->ny - 1));
43: printf("\n");
44: printf("\n");
45: }
46:
47: void showShortData(ShortTwoDArray *x, char *title) {
48: int i;
49: printf("%s:\n",title);
50:
51: printf("(%d, 0) %d ",0,PPix(x,0,0));
52: for (i = 1; i < 5; ++i) printf("%d ",PPix(x,i,0));
53: printf(" ... ");
54: printf("(%d, 0) %d ",(x->nx - 5),PPix(x,(x->nx - 5),0));
55: for (i = x->nx - 4; i < x->nx; ++i) printf("%d ",PPix(x,i,0));
56: printf("\n");
57:
58: printf("(%d, 1) %d ",0,PPix(x,0,1));
59: for (i = 1; i < 5; ++i) printf("%d ",PPix(x,i,1));
60: printf(" ... ");
61: printf("(%d, 1) %d ",(x->nx - 5),PPix(x,(x->nx - 5),1));
62: for (i = x->nx - 4; i < x->nx; ++i) printf("%d ",PPix(x,i,1));
63: printf("\n");
64:
65: printf("(%d, max - 2) %d ",0,PPix(x,0,x->ny - 2));
66: for (i = 1; i < 5; ++i) printf("%d ",PPix(x,i,x->ny - 2));
67: printf(" ... ");
68: printf("(%d, max - 2) %d ",(x->nx - 5),PPix(x,(x->nx - 5),x->ny - 2));
69: for (i = x->nx - 4; i < x->nx; ++i) printf("%d ",PPix(x,i,x->ny - 2));
70: printf("\n");
71:
72: printf("(%d, max - 1) %d ",0,PPix(x,0,x->ny - 1));
73: for (i = 1; i < 5; ++i) printf("%d ",PPix(x,i,x->ny - 1));
74: printf(" ... ");
75: printf("(%d, max - 1) %d ",(x->nx - 5),PPix(x,(x->nx - 5),x->ny - 1));
76: for (i = x->nx - 4; i < x->nx; ++i) printf("%d ",PPix(x,i,x->ny - 1));
77: printf("\n");
78: printf("\n");
79: }
80:
81: void show_iodesc(IODescPtr x) {
82: printf("IODesc: filename = %s extname = %s extver = %d\n\tnaxis1 = %d \
83: naxis2 = %d data type = %d\n", getFilename(x), getExtname(x), getExtver(x),
84: getNaxis1(x), getNaxis2(x), getType(x));
85: }
86:
87: void detect_err() {
88: printf("HSTIO Error (%d): %s\n",hstio_err(),hstio_errmsg());
89: exit(0);
90: }
91:
92: int main(int argc, char **argv) {
93: IODescPtr pri, sci, dq, err;
94: #ifdef EX3
95: IODescPtr outpri, outsci, outdq, outerr;
96: #endif
97:
98: Hdr prihdr, scihdr, dqhdr, errhdr;
99: FloatTwoDArray scidata;
100: ShortTwoDArray dqdata;
101: FloatTwoDArray errdata;
102: int i;
103: char *tmp;
104:
105: SciHdrData scihdrdata;
106: DQHdrData dqhdrdata;
107: ErrHdrData errhdrdata;
108: SingleGroup sg;
109: MultiGroup mg;
110:
111: int A = 1; /* low-level routines */
112: int B = 3; /* high-level XXHdrData routines */
113: int C = 4; /* high-level SingleGroup */
114: int D = 5; /* high-level MultiGroup */
115:
116: /*
117: ** Command line arguments:
118: ** 1. input file name
119: ** 2. output file name
120: */
121: #ifdef EX3
122: if (argc != 3) {
123: printf("Wrong number of input arguments: ex3 input output\n");
124: exit(0);
125: }
126: printf("Executing program ex3 -- test of pipeline I/O routines\n");
127: printf("Input: input file reading 6 groups of Sci, Err, DQ.\n");
128: printf("Output: output file creating 6 groups of Sci, Err, DQ.\n");
129: #else
130: if (argc != 2) {
131: printf("Wrong number of input arguments: ex2 input\n");
132: exit(0);
133: }
134: printf("Executing program ex2 -- test of pipeline I/O routines\n");
135: printf("Input: input file reading 6 groups of Sci, Err, DQ.\n");
136: #endif
137:
138: /* install the error handler */
139: push_hstioerr(detect_err);
140:
141: /*
142: ** Initialize the data structures.
143: */
144: initFloatData(&scidata);
145: initShortData(&dqdata);
146: initFloatData(&errdata);
147: initHdr(&prihdr);
148: initHdr(&scihdr);
149: initHdr(&dqhdr);
150: initHdr(&errhdr);
151:
152: initFloatHdrData(&scihdrdata);
153: initShortHdrData(&dqhdrdata);
154: initFloatHdrData(&errhdrdata);
155: initSingleGroup(&sg);
156: initMultiGroup(&mg);
157:
158: /*
159: ** First, we will use the low-level I/O routines to open
160: ** and read the primary header, and the first three
161: ** extension image arrays.
162: */
163: printf("\n======= Primary header: read =========\n");
164: pri = openInputImage(argv[1],"",0);
165: getHeader(pri,&prihdr);
166: show_iodesc(pri);
167: showHdr(&prihdr,"Primary Header Keywords");
168: printf("======= Primary header: read complete =========\n");
169: #ifdef EX3
170: outpri = openOutputImage(argv[2],"",0,&prihdr, 0, 0, 0);
171: closeImage(outpri);
172: #endif
173: closeImage(pri);
174: freeHdr(&prihdr);
175:
176: for (i = A; i <= A + 1; ++i) {
177: printf("\n======= Science data: read =========\n");
178: sci = openInputImage(argv[1],"SCI",i);
179: getHeader(sci,&scihdr);
180: show_iodesc(sci);
181: showHdr(&scihdr,"Science Header Keywords");
182: getFloatData(sci,&scidata);
183: showFloatData(&scidata,"Selected Science Data");
184: printf("======= Science data: read complete =========\n");
185: #ifdef EX3
186: outsci = openOutputImage(argv[2],"sci",i,&scihdr,
187: getNaxis1(sci), getNaxis2(sci),0);
188: putFloatData(outsci,&scidata);
189: closeImage(outsci);
190: #endif
191: closeImage(sci);
192: freeFloatData(&scidata);
193: freeHdr(&scihdr);
194:
195: printf("\n======= Error data: read =========\n");
196: err = openInputImage(argv[1],"ERR",i);
197: getHeader(err,&errhdr);
198: showHdr(&errhdr,"Error Header Keywords");
199: getFloatData(err,&errdata);
200: show_iodesc(err);
201: showFloatData(&errdata,"Selected Error Data");
202: printf("======= Error data: read complete =========\n");
203: #ifdef EX3
204: outerr = openOutputImage(argv[2],"err",i,&errhdr,
205: errdata.nx, errdata.ny,0);
206: putFloatData(outerr,&errdata);
207: closeImage(outerr);
208: #endif
209: closeImage(err);
210: freeFloatData(&errdata);
211: freeHdr(&errhdr);
212:
213: printf("\n======= Data Quality data: read =========\n");
214: dq = openInputImage(argv[1],"DQ",i);
215: getHeader(dq,&dqhdr);
216: showHdr(&dqhdr,"Data Quality Header Keywords");
217: getShortData(dq,&dqdata);
218: show_iodesc(dq);
219: showShortData(&dqdata,"Selected Data Quality Data");
220: printf("\n======= Data Quality data: read complete =========\n");
221: #ifdef EX3
222: outdq = openOutputImage(argv[2],"dq",i,&dqhdr,
223: dqdata.nx, dqdata.ny,0);
224: putShortData(outdq,&dqdata);
225: closeImage(outdq);
226: #endif
227: closeImage(dq);
228: freeShortData(&dqdata);
229: freeHdr(&dqhdr);
230:
231: }
232:
233: /*
234: ** Now, we will test the high-level routines.
235: ** First, test getSci, getErr, and getDQ.
236: */
237: printf("\n======= Science data: read =========\n");
238: getSci(argv[1],B,&scihdrdata);
239: show_iodesc(scihdrdata.iodesc);
240: showHdr(&scihdrdata.hdr,"Science Header Keywords");
241: showFloatData(&scihdrdata.data,"Science Data");
242: printf("======= Science data: read complete =========\n");
243: #ifdef EX3
244: putSci(argv[2],B,&scihdrdata,0);
245: #endif
246: freeFloatHdrData(&scihdrdata);
247:
248: printf("\n======= Error data: read =========\n");
249: getErr(argv[1],B,&errhdrdata);
250: show_iodesc(errhdrdata.iodesc);
251: showHdr(&errhdrdata.hdr,"Error Header Keywords");
252: showFloatData(&errhdrdata.data,"Error Data");
253: printf("======= Error data: read complete =========\n");
254: #ifdef EX3
255: putErr(argv[2],B,&errhdrdata,0);
256: #endif
257: freeFloatHdrData(&errhdrdata);
258:
259: printf("\n======= Data Quality data: read =========\n");
260: getDQ(argv[1],B,&dqhdrdata);
261: show_iodesc(dqhdrdata.iodesc);
262: showHdr(&dqhdrdata.hdr,"DQ Header Keywords");
263: showShortData(&dqhdrdata.data,"Data Quality Data");
264: printf("======= Data Quality data: read complete =========\n");
265: #ifdef EX3
266: putDQ(argv[2],B,&dqhdrdata,0);
267: #endif
268: freeShortHdrData(&dqhdrdata);
269:
270: /*
271: ** Now, test getSingleGroup.
272: */
273: printf("\n======= Single group data: read =========\n");
274: getSingleGroup(argv[1],C,&sg);
275: printf("Filename: %s group %d\n",sg.filename,sg.group_num);
276: showHdr(sg.globalhdr,"Global header");
277: showHdr(&sg.sci.hdr,"Science Header Keywords");
278: showFloatData(&sg.sci.data,"Science Data");
279: showHdr(&sg.err.hdr,"Error Header Keywords");
280: showFloatData(&sg.err.data, "Error Data");
281: showHdr(&sg.dq.hdr,"DQ Header Keywords");
282: showShortData(&sg.dq.data, "Data Quality Data");
283: printf("======= Single group data: read complete =========\n");
284: #ifdef EX3
285: putSingleGroup(argv[2],C,&sg,0);
286: #endif
287: freeSingleGroup(&sg);
288:
289: /*
290: ** Finally, test getMultiGroup.
291: */
292: printf("\n======= Multiple group data: read =========\n");
293: allocMultiGroup(&mg,4);
294: getMultiGroupHdr(argv[1],&mg);
295: for (i = 0; i < 2; ++i)
296: { getMultiGroup(&mg,i,(i + D)); }
297: printf("Filename: %s\n",mg.group[0].filename);
298: showHdr(mg.group[0].globalhdr,"Global header");
299: for (i = 0; i < 2; ++i) {
300: showHdr(&mg.group[i].sci.hdr,"Science Header Keywords");
301: showFloatData(&mg.group[i].sci.data,"Science Data");
302: showHdr(&mg.group[i].err.hdr,"Error Header Keywords");
303: showFloatData(&mg.group[i].err.data,"Error Data");
304: showHdr(&mg.group[i].dq.hdr,"DQ Header Keywords");
305: showShortData(&mg.group[i].dq.data,"Data Quality Data");
306: }
307: printf("======= Multi group data: read complete =========\n");
308: #ifdef EX3
309: for (i = 0; i < 2; ++i)
310: putMultiGroup(argv[2],(i + D),&mg,i,0);
311: #endif
312: freeMultiGroup(&mg);
313:
314: return 0;
315: }
316: