24 #include "FitsError.h"
37 Image(
const Image< T > &right);
38 Image (
const std::valarray<T>& imageArray = std::valarray<T>());
40 Image< T > & operator=(
const Image< T > &right);
45 const std::valarray<T>& readImage (fitsfile* fPtr,
long first,
long nElements, T* nullValue,
const std::vector<long>& naxes,
bool& nulls);
49 const std::valarray<T>& readImage (fitsfile* fPtr,
const std::vector<long>& firstVertex,
const std::vector<long>& lastVertex,
const std::vector<long>& stride, T* nullValue,
const std::vector<long>& naxes,
bool& nulls);
53 void writeImage (fitsfile* fPtr,
long first,
long nElements,
const std::valarray<T>& inData,
const std::vector<long>& naxes, T* nullValue = 0);
57 void writeImage (fitsfile* fPtr,
const std::vector<long>& firstVertex,
const std::vector<long>& lastVertex,
const std::vector<long>& stride,
const std::valarray<T>& inData,
const std::vector<long>& naxes);
58 void writeImage (fitsfile* fPtr,
const std::vector<long>& firstVertex,
const std::vector<long>& lastVertex,
const std::valarray<T>& inData,
const std::vector<long>& naxes);
60 void isRead (
bool value);
61 const std::valarray< T >& image ()
const;
62 void setImage (
const std::valarray< T >& value);
63 const T image (
size_t index)
const;
64 void setImage (
size_t index, T value);
72 std::valarray<T>& image ();
73 void prepareForSubset (
const std::vector<long>& naxes,
const std::vector<long>& firstVertex,
const std::vector<long>& lastVertex,
const std::vector<long>& stride,
const std::valarray<T>& inData, std::valarray<T>& subset);
74 void loop (
size_t iDim,
const std::vector<long>& firstVertex,
const std::vector<long>& lastVertex,
const std::vector<long>& stride,
size_t iPos,
const std::vector<size_t>& incr,
const std::valarray<T>& inData,
size_t& iDat,
const std::vector<size_t>& subIncr, std::valarray<T>& subset,
size_t iSub);
83 std::valarray< T > m_image;
92 inline bool Image<T>::isRead ()
const
98 inline void Image<T>::isRead (
bool value)
103 template <
typename T>
104 inline const std::valarray< T >& Image<T>::image ()
const
109 template <
typename T>
110 inline void Image<T>::setImage (
const std::valarray< T >& value)
112 m_image.resize(value.size());
116 template <
typename T>
117 inline const T Image<T>::image (
size_t index)
const
119 return m_image[index];
122 template <
typename T>
123 inline void Image<T>::setImage (
size_t index, T value)
125 m_image[index] = value;
130 template <
typename T>
131 Image<T>::Image(
const Image<T> &right)
132 : m_isRead(right.m_isRead),
133 m_image(right.m_image)
137 template <
typename T>
138 Image<T>::Image (
const std::valarray<T>& imageArray)
145 template <
typename T>
151 template <
typename T>
152 Image<T> & Image<T>::operator=(
const Image<T> &right)
155 m_isRead = right.m_isRead;
156 m_image.resize(right.m_image.size());
157 m_image = right.m_image;
162 template <
typename T>
163 const std::valarray<T>& Image<T>::readImage (fitsfile* fPtr,
long first,
long nElements, T* nullValue,
const std::vector<long>& naxes,
bool& nulls)
165 const size_t N(naxes.size());
170 FITSUtil::MatchType<T> imageType;
171 unsigned long init(1);
172 unsigned long nelements(std::accumulate(naxes.begin(),naxes.end(),init,
173 std::multiplies<long>()));
177 long elementsToRead(std::min(static_cast<unsigned long>(nElements),
178 nelements - first + 1));
179 if ( elementsToRead < nElements)
182 "***CCfits Warning: data request exceeds image size, truncating\n";
184 FITSUtil::FitsNullValue<T> null;
186 if (m_image.size() !=
static_cast<size_t>(elementsToRead))
188 m_image.resize(elementsToRead,null());
190 if (fits_read_img(fPtr,imageType(),first,elementsToRead,
191 nullValue,&m_image[0],&any,&status) != 0)
throw FitsError(status);
194 m_isRead = (first == 1 && nelements ==
static_cast<unsigned long>(nElements));
204 template <
typename T>
205 const std::valarray<T>& Image<T>::readImage (fitsfile* fPtr,
const std::vector<long>& firstVertex,
const std::vector<long>& lastVertex,
const std::vector<long>& stride, T* nullValue,
const std::vector<long>& naxes,
bool& nulls)
210 FITSUtil::CVarray<long> carray;
215 const size_t N(naxes.size());
219 for (
size_t j = 0; j < N; ++j)
221 arraySize *= (lastVertex[j] - firstVertex[j] + 1);
224 FITSUtil::auto_array_ptr<long> pFpixel(carray(firstVertex));
225 FITSUtil::auto_array_ptr<long> pLpixel(carray(lastVertex));
226 FITSUtil::auto_array_ptr<long> pStride(carray(stride));
228 FITSUtil::MatchType<T> imageType;
230 size_t n(m_image.size());
231 if (n != arraySize) m_image.resize(arraySize);
232 if (fits_read_subset(fPtr,imageType(),
233 pFpixel.get(),pLpixel.get(),
234 pStride.get(),nullValue,&m_image[0],&any,&status) != 0)
236 throw FitsError(status);
244 template <
typename T>
245 void Image<T>::writeImage (fitsfile* fPtr,
long first,
long nElements,
const std::valarray<T>& inData,
const std::vector<long>& naxes, T* nullValue)
251 size_t totalSize=
static_cast<size_t>(std::accumulate(naxes.begin(),naxes.end(),init,std::multiplies<long>() ));
252 FITSUtil::FitsNullValue<T> null;
253 if (m_image.size() != totalSize) m_image.resize(totalSize,null());
254 FITSUtil::CAarray<T> convert;
255 FITSUtil::auto_array_ptr<T> pArray(convert(inData));
256 T* array = pArray.get();
259 FITSUtil::MatchType<T> imageType;
260 long type(imageType());
262 if (fits_write_imgnull(fPtr,type,first,nElements,array,
263 nullValue,&status) || fits_flush_file(fPtr,&status) != 0)
265 throw FitsError(status);
271 m_image[std::slice(first-1,nElements,1)] = inData;
274 template <
typename T>
275 void Image<T>::writeImage (fitsfile* fPtr,
const std::vector<long>& firstVertex,
const std::vector<long>& lastVertex,
const std::vector<long>& stride,
const std::valarray<T>& inData,
const std::vector<long>& naxes)
278 const size_t nDim = naxes.size();
279 FITSUtil::auto_array_ptr<long> pFPixel(
new long[nDim]);
280 FITSUtil::auto_array_ptr<long> pLPixel(
new long[nDim]);
281 std::valarray<T> subset;
282 prepareForSubset(naxes,firstVertex,lastVertex,stride,inData,subset);
284 long* fPixel = pFPixel.get();
285 long* lPixel = pLPixel.get();
286 for (
size_t i=0; i<nDim; ++i)
288 fPixel[i] = firstVertex[i];
289 lPixel[i] = lastVertex[i];
292 FITSUtil::CAarray<T> convert;
293 FITSUtil::auto_array_ptr<T> pArray(convert(subset));
294 T* array = pArray.get();
295 FITSUtil::MatchType<T> imageType;
298 if ( fits_write_subset(fPtr,imageType(),fPixel,lPixel,array,&status)
299 || fits_flush_file(fPtr,&status) != 0)
throw FitsError(status);
302 template <
typename T>
303 std::valarray<T>& Image<T>::image ()
309 template <
typename T>
310 void Image<T>::prepareForSubset (
const std::vector<long>& naxes,
const std::vector<long>& firstVertex,
const std::vector<long>& lastVertex,
const std::vector<long>& stride,
const std::valarray<T>& inData, std::valarray<T>& subset)
314 const size_t N = naxes.size();
315 if (N != firstVertex.size() || N != lastVertex.size() || N != stride.size())
317 string errMsg(
"*** CCfits Error: Image write function requires that naxes, firstVertex,");
318 errMsg +=
" \nlastVertex, and stride vectors all be the same size.\n";
320 throw FitsException(errMsg, silent);
322 for (
size_t i=0; i<N; ++i)
327 throw FitsException(
"*** CCfits Error: Invalid naxes value sent to image write function.\n", silent);
329 string rangeErrMsg(
"*** CCfits Error: Out-of-range value sent to image write function in arg: ");
330 if (firstVertex[i] < 1 || firstVertex[i] > naxes[i])
333 rangeErrMsg +=
"firstVertex\n";
334 throw FitsException(rangeErrMsg, silent);
336 if (lastVertex[i] < firstVertex[i] || lastVertex[i] > naxes[i])
339 rangeErrMsg +=
"lastVertex\n";
340 throw FitsException(rangeErrMsg, silent);
345 rangeErrMsg +=
"stride\n";
346 throw FitsException(rangeErrMsg, silent);
353 size_t subSizeWithStride = 1;
355 std::vector<size_t> subIncr(N);
356 for (
size_t i=0; i<N; ++i)
358 subIncr[i] = nPoints;
359 nPoints *=
static_cast<size_t>(1+lastVertex[i]-firstVertex[i]);
360 subSizeWithStride *=
static_cast<size_t>(1+(lastVertex[i]-firstVertex[i])/stride[i]);
362 FITSUtil::FitsNullValue<T> null;
363 subset.resize(nPoints, null());
367 if (subSizeWithStride != inData.size())
370 string errMsg(
"*** CCfits Error: Data array size is not consistent with the values");
371 errMsg +=
"\n in range and stride vectors sent to the image write function.\n";
372 throw FitsException(errMsg, silent);
375 size_t startPoint = 0;
377 std::vector<size_t> incr(N);
378 for (
size_t j = 0; j < N; ++j)
380 startPoint += dimMult*(firstVertex[j]-1);
382 dimMult *=
static_cast<size_t>(naxes[j]);
384 const size_t imageSize = dimMult;
385 m_image.resize(imageSize,null());
387 size_t inDataPos = 0;
389 loop(N-1, firstVertex, lastVertex, stride, startPoint, incr, inData, inDataPos, subIncr, subset, iSub);
392 template <
typename T>
393 void Image<T>::loop (
size_t iDim,
const std::vector<long>& firstVertex,
const std::vector<long>& lastVertex,
const std::vector<long>& stride,
size_t iPos,
const std::vector<size_t>& incr,
const std::valarray<T>& inData,
size_t& iDat,
const std::vector<size_t>& subIncr, std::valarray<T>& subset,
size_t iSub)
395 size_t start =
static_cast<size_t>(firstVertex[iDim]);
396 size_t stop =
static_cast<size_t>(lastVertex[iDim]);
397 size_t skip =
static_cast<size_t>(stride[iDim]);
400 size_t length = stop - start + 1;
401 for (
size_t i=0; i<length; i+=skip)
403 m_image[i+iPos] = inData[iDat];
404 subset[i+iSub] = inData[iDat++];
409 size_t jump = incr[iDim]*skip;
410 size_t subJump = subIncr[iDim]*skip;
411 for (
size_t i=start; i<=stop; i+=skip)
413 loop(iDim-1, firstVertex, lastVertex, stride, iPos, incr, inData, iDat, subIncr, subset, iSub);
420 template <
typename T>
421 void Image<T>::writeImage (fitsfile* fPtr,
const std::vector<long>& firstVertex,
const std::vector<long>& lastVertex,
const std::valarray<T>& inData,
const std::vector<long>& naxes)
423 std::vector<long> stride(firstVertex.size(), 1);
424 writeImage(fPtr, firstVertex, lastVertex, stride, inData, naxes);
Namespace enclosing all CCfits classes and globals definitions.
Definition: AsciiTable.cxx:26