12 #include "PrimaryHDU.h"
20 void PHDU::read (std::valarray<S>& image)
23 long nElements(std::accumulate(
naxes().begin(),
naxes().end(),init,
24 std::multiplies<long>()));
26 read(image,1,nElements,static_cast<S*>(0));
31 void PHDU::read (std::valarray<S>& image,
long first,
long nElements)
33 read(image, first,nElements,static_cast<S*>(0));
37 void PHDU::read (std::valarray<S>& image,
long first,
long nElements, S* nullValue)
40 if ( PrimaryHDU<S>* phdu =
dynamic_cast<PrimaryHDU<S>*
>(
this) )
43 const std::valarray<S>& __tmp = phdu->readImage(first,nElements,nullValue);
44 image.resize(__tmp.size());
51 PrimaryHDU<float>& phdu
52 =
dynamic_cast<PrimaryHDU<float>&
>(*this);
54 if (nullValue) nulVal =
static_cast<float>(*nullValue);
55 FITSUtil::fill(image,phdu.readImage(first,nElements,&nulVal));
58 else if (
bitpix() == Idouble)
60 PrimaryHDU<double>& phdu
61 =
dynamic_cast<PrimaryHDU<double>&
>(*this);
63 if (nullValue) nulVal =
static_cast<double>(*nullValue);
64 FITSUtil::fill(image,phdu.readImage(first,nElements,&nulVal));
67 else if (
bitpix() == Ibyte)
69 PrimaryHDU<unsigned char>& phdu
70 =
dynamic_cast<PrimaryHDU<unsigned char>&
>(*this);
71 unsigned char nulVal(0);
72 if (nullValue) nulVal =
static_cast<unsigned char>(*nullValue);
73 FITSUtil::fill(image,phdu.readImage(first,nElements,&nulVal));
75 else if (
bitpix() == Ilong)
79 PrimaryHDU<unsigned INT32BIT>& phdu
80 =
dynamic_cast<PrimaryHDU<unsigned INT32BIT>&
>(*this);
81 unsigned INT32BIT nulVal(0);
83 =
static_cast<unsigned INT32BIT
>(*nullValue);
85 phdu.readImage(first,nElements,&nulVal));
89 PrimaryHDU<INT32BIT>& phdu
90 =
dynamic_cast<PrimaryHDU<INT32BIT>&
>(*this);
92 if (nullValue) nulVal =
static_cast<INT32BIT
>(*nullValue);
94 phdu.readImage(first,nElements,&nulVal));
97 else if (
bitpix() == Ishort)
101 PrimaryHDU<unsigned short>& phdu
102 =
dynamic_cast<PrimaryHDU<unsigned short>&
>(*this);
103 unsigned short nulVal(0);
104 if (nullValue) nulVal
105 =
static_cast<unsigned short>(*nullValue);
106 FITSUtil::fill(image,
107 phdu.readImage(first,nElements,&nulVal));
111 PrimaryHDU<short>& phdu
112 =
dynamic_cast<PrimaryHDU<short>&
>(*this);
114 if (nullValue) nulVal =
static_cast<short>(*nullValue);
115 FITSUtil::fill(image,
116 phdu.readImage(first,nElements,&nulVal));
129 void PHDU::read (std::valarray<S>& image,
const std::vector<long>& first,
134 long firstElement(0);
136 std::vector<long> inputDimensions(naxis(),1);
137 size_t sNaxis =
static_cast<size_t>(naxis());
138 size_t n(std::min(sNaxis,first.size()));
139 std::copy(&first[0],&first[0]+n,&inputDimensions[0]);
140 for (
long i = 0; i < naxis(); ++i)
143 firstElement += ((inputDimensions[i] - 1)*dimSize);
149 read(image, firstElement,nElements,nullValue);
156 void PHDU::read (std::valarray<S>& image,
const std::vector<long>& first,
159 read(image, first,nElements,static_cast<S*>(0));
164 void PHDU::read (std::valarray<S>& image,
const std::vector<long>& firstVertex,
165 const std::vector<long>& lastVertex,
166 const std::vector<long>& stride,
170 if (PrimaryHDU<S>* phdu =
dynamic_cast<PrimaryHDU<S>*
>(
this))
172 const std::valarray<S>& __tmp
173 = phdu->readImage(firstVertex,lastVertex,stride,nullValue);
174 image.resize(__tmp.size());
183 if (nullValue) nulVal =
static_cast<float>(*nullValue);
184 PrimaryHDU<float>& phdu =
dynamic_cast<PrimaryHDU<float>&
>(*this);
185 FITSUtil::fill(image,
186 phdu.readImage(firstVertex,lastVertex,stride,&nulVal));
188 else if (
bitpix() == Idouble)
190 PrimaryHDU<double>& phdu =
dynamic_cast<PrimaryHDU<double>&
>(*this);
192 if (nullValue) nulVal =
static_cast<double>(*nullValue);
193 FITSUtil::fill(image,
194 phdu.readImage(firstVertex,lastVertex,stride,&nulVal));
196 else if (
bitpix() == Ibyte)
198 PrimaryHDU<unsigned char>& phdu
199 =
dynamic_cast<PrimaryHDU<unsigned char>&
>(*this);
200 unsigned char nulVal(0);
201 if (nullValue) nulVal =
static_cast<unsigned char>(*nullValue);
202 FITSUtil::fill(image,
203 phdu.readImage(firstVertex,lastVertex,stride,&nulVal));
205 else if (
bitpix() == Ilong)
209 PrimaryHDU<unsigned INT32BIT>& phdu
210 =
dynamic_cast<PrimaryHDU<unsigned INT32BIT>&
>(*this);
211 unsigned INT32BIT nulVal(0);
212 if (nullValue) nulVal
213 =
static_cast<unsigned INT32BIT
>(*nullValue);
214 FITSUtil::fill(image,
215 phdu.readImage(firstVertex,lastVertex,stride,&nulVal));
219 PrimaryHDU<INT32BIT>& phdu
220 =
dynamic_cast<PrimaryHDU<INT32BIT>&
>(*this);
222 if (nullValue) nulVal =
static_cast<INT32BIT
>(*nullValue);
223 FITSUtil::fill(image,
224 phdu.readImage(firstVertex,lastVertex,stride,&nulVal));
227 else if (
bitpix() == Ishort)
231 PrimaryHDU<unsigned short>& phdu
232 =
dynamic_cast<PrimaryHDU<unsigned short>&
>(*this);
233 unsigned short nulVal(0);
234 if (nullValue) nulVal
235 =
static_cast<unsigned short>(*nullValue);
236 FITSUtil::fill(image,
237 phdu.readImage(firstVertex,lastVertex,stride,&nulVal));
241 PrimaryHDU<short>& phdu
242 =
dynamic_cast<PrimaryHDU<short>&
>(*this);
244 if (nullValue) nulVal =
static_cast<short>(*nullValue);
245 FITSUtil::fill(image,
246 phdu.readImage(firstVertex,lastVertex,stride,&nulVal));
257 void PHDU::read (std::valarray<S>& image,
const std::vector<long>& firstVertex,
258 const std::vector<long>& lastVertex,
259 const std::vector<long>& stride)
261 read(image, firstVertex,lastVertex,stride,static_cast<S*>(0));
264 template <
typename S>
267 const std::valarray<S>& data,
272 if (PrimaryHDU<S>* image =
dynamic_cast<PrimaryHDU<S>*
>(
this))
274 image->writeImage(first,nElements,data,nullValue);
280 std::valarray<float> __tmp;
281 PrimaryHDU<float>& phdu =
dynamic_cast<PrimaryHDU<float>&
>(*this);
282 FITSUtil::fill(__tmp,data);
283 float* pfNullValue = 0;
284 float fNullValue = 0.0;
287 fNullValue =
static_cast<float>(*nullValue);
288 pfNullValue = &fNullValue;
290 phdu.writeImage(first,nElements,__tmp, pfNullValue);
292 else if (
bitpix() == Idouble)
294 std::valarray<double> __tmp;
295 PrimaryHDU<double>& phdu
296 =
dynamic_cast<PrimaryHDU<double>&
>(*this);
297 FITSUtil::fill(__tmp,data);
298 double* pdNullValue = 0;
299 double dNullValue = 0.0;
302 dNullValue =
static_cast<double>(*nullValue);
303 pdNullValue = &dNullValue;
305 phdu.writeImage(first,nElements,__tmp, pdNullValue);
307 else if (
bitpix() == Ibyte)
309 PrimaryHDU<unsigned char>& phdu
310 =
dynamic_cast<PrimaryHDU<unsigned char>&
>(*this);
311 std::valarray<unsigned char> __tmp;
312 FITSUtil::fill(__tmp,data);
313 unsigned char *pbNull=0;
314 unsigned char bNull=0;
317 bNull =
static_cast<unsigned char>(*nullValue);
320 phdu.writeImage(first,nElements,__tmp, pbNull);
323 else if (
bitpix() == Ilong)
327 PrimaryHDU<unsigned INT32BIT>& phdu
328 =
dynamic_cast<PrimaryHDU<unsigned INT32BIT>&
>(*this);
329 std::valarray<unsigned INT32BIT> __tmp;
331 FITSUtil::fill(__tmp,data);
332 unsigned INT32BIT *plNull=0;
333 unsigned INT32BIT lNull=0;
336 lNull =
static_cast<unsigned INT32BIT
>(*nullValue);
339 phdu.writeImage(first,nElements,__tmp, plNull);
343 PrimaryHDU<INT32BIT>& phdu
344 =
dynamic_cast<PrimaryHDU<INT32BIT>&
>(*this);
345 std::valarray<INT32BIT> __tmp;
347 FITSUtil::fill(__tmp,data);
352 lNull =
static_cast<INT32BIT
>(*nullValue);
355 phdu.writeImage(first,nElements,__tmp, plNull);
358 else if (
bitpix() == Ishort)
362 PrimaryHDU<unsigned short>& phdu
363 =
dynamic_cast<PrimaryHDU<unsigned short>&
>(*this);
364 std::valarray<unsigned short> __tmp;
365 FITSUtil::fill(__tmp,data);
366 unsigned short *psNull=0;
367 unsigned short sNull=0;
370 sNull =
static_cast<unsigned short>(*nullValue);
373 phdu.writeImage(first,nElements,__tmp, psNull);
377 PrimaryHDU<short>& phdu
378 =
dynamic_cast<PrimaryHDU<short>&
>(*this);
379 std::valarray<short> __tmp;
381 FITSUtil::fill(__tmp,data);
386 sNull =
static_cast<short>(*nullValue);
389 phdu.writeImage(first,nElements,__tmp,psNull);
401 template <
typename S>
404 const std::valarray<S>& data)
406 write(first, nElements, data, static_cast<S*>(0));
409 template <
typename S>
412 const std::valarray<S>& data,
416 size_t n(first.size());
417 long firstElement(0);
419 for (
long i = 0; i < first.size(); ++i)
421 firstElement += ((first[i] - 1)*dimSize);
426 write(firstElement,nElements,data,nullValue);
429 template <
typename S>
432 const std::valarray<S>& data)
435 size_t n(first.size());
436 long firstElement(0);
438 for (
long i = 0; i < first.size(); ++i)
441 firstElement += ((first[i] - 1)*dimSize);
446 write(firstElement,nElements,data);
450 template <
typename S>
452 const std::vector<long>& lastVertex,
453 const std::vector<long>& stride,
454 const std::valarray<S>& data)
459 PrimaryHDU<S>& image =
dynamic_cast<PrimaryHDU<S>&
>(*this);
460 image.writeImage(firstVertex,lastVertex,stride,data);
462 catch (std::bad_cast)
468 PrimaryHDU<float>& phdu =
dynamic_cast<PrimaryHDU<float>&
>(*this);
469 size_t n(data.size());
470 std::valarray<float> __tmp(n);
471 for (
size_t j= 0; j < n; ++j) __tmp[j] = data[j];
472 phdu.writeImage(firstVertex,lastVertex,stride,__tmp);
475 else if (
bitpix() == Idouble)
477 PrimaryHDU<double>& phdu
478 =
dynamic_cast<PrimaryHDU<double>&
>(*this);
479 size_t n(data.size());
480 std::valarray<double> __tmp(n);
481 for (
size_t j= 0; j < n; ++j) __tmp[j] = data[j];
482 phdu.writeImage(firstVertex,lastVertex,stride,__tmp);
484 else if (
bitpix() == Ibyte)
486 PrimaryHDU<unsigned char>& phdu
487 =
dynamic_cast<PrimaryHDU<unsigned char>&
>(*this);
488 size_t n(data.size());
489 std::valarray<unsigned char> __tmp(n);
490 for (
size_t j= 0; j < n; ++j) __tmp[j] = data[j];
491 phdu.writeImage(firstVertex,lastVertex,stride,__tmp);
493 else if (
bitpix() == Ilong)
497 PrimaryHDU<unsigned INT32BIT>& phdu
498 =
dynamic_cast<PrimaryHDU<unsigned INT32BIT>&
>(*this);
499 size_t n(data.size());
500 std::valarray<unsigned INT32BIT> __tmp(n);
501 for (
size_t j= 0; j < n; ++j) __tmp[j] = data[j];
502 phdu.writeImage(firstVertex,lastVertex,stride,__tmp);
507 PrimaryHDU<INT32BIT>& phdu
508 =
dynamic_cast<PrimaryHDU<INT32BIT>&
>(*this);
509 size_t n(data.size());
510 std::valarray<INT32BIT> __tmp(n);
511 for (
size_t j= 0; j < n; ++j) __tmp[j] = data[j];
512 phdu.writeImage(firstVertex,lastVertex,stride,__tmp);
515 else if (
bitpix() == Ishort)
519 PrimaryHDU<unsigned short>& phdu
520 =
dynamic_cast<PrimaryHDU<unsigned short>&
>(*this);
521 size_t n(data.size());
522 std::valarray<unsigned short> __tmp(n);
523 for (
size_t j= 0; j < n; ++j) __tmp[j] = data[j];
524 phdu.writeImage(firstVertex,lastVertex,stride,__tmp);
529 PrimaryHDU<short>& phdu
530 =
dynamic_cast<PrimaryHDU<short>&
>(*this);
531 size_t n(data.size());
532 std::valarray<short> __tmp(n);
533 for (
size_t j= 0; j < n; ++j) __tmp[j] = data[j];
534 phdu.writeImage(firstVertex,lastVertex,stride,__tmp);