00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef PRIMARYHDU_H
00010 #define PRIMARYHDU_H 1
00011
00012
00013 #include <valarray>
00014
00015 #include "PHDU.h"
00016
00017 #include "HDUCreator.h"
00018
00019 #include "Image.h"
00020
00021 #include "FITS.h"
00022 #include "CCfits.h"
00023 #include <functional>
00024 #include <numeric>
00025 #include <memory>
00026
00027
00028 namespace CCfits {
00029
00030
00031
00032 template <typename T>
00033 class PrimaryHDU : public PHDU
00034 {
00035
00036 public:
00037 virtual PrimaryHDU<T> * clone (FITSBase* p) const;
00038
00039
00040
00041 virtual void readData (bool readFlag = false, const std::vector<String>& keys = std::vector<String>());
00042 const std::valarray<T>& image () const;
00043 std::valarray<T>& image ();
00044 void setImage (const std::valarray<T>& inData);
00045
00046
00047
00048 virtual const std::valarray<T>& readImage (long first, long nElements, T* nullValue);
00049
00050
00051
00052 virtual const std::valarray<T>& readImage (const std::vector<long>& firstVertex, const std::vector<long>& lastVertex, const std::vector<long>& stride, T* nullValue);
00053
00054
00055
00056 virtual void writeImage (long first, long nElements, const std::valarray<T>& inData, T* nullValue = 0);
00057
00058
00059
00060 virtual void writeImage (const std::vector<long>& firstVertex, const std::vector<long>& lastVertex, const std::vector<long>& stride, const std::valarray<T>& inData);
00061
00062
00063
00064 protected:
00065
00066
00067 PrimaryHDU (FITSBase* p, const int bitpix, const int naxis, const std::vector<long>& naxes, const std::valarray<T>& data = std::valarray<T>());
00068
00069
00070
00071 PrimaryHDU (FITSBase* p, bool readFlag = false, const std::vector<String>& keys = std::vector<String>());
00072
00073
00074
00075 private:
00076 PrimaryHDU(const PrimaryHDU< T > &right);
00077 PrimaryHDU< T > & operator=(const PrimaryHDU< T > &right);
00078
00079 virtual std::ostream & put (std::ostream &s) const;
00080 const Image<T>& data () const;
00081
00082
00083
00084 private:
00085
00086 Image<T> m_data;
00087
00088
00089 friend class HDUCreator;
00090 friend class PHDU;
00091 };
00092
00093
00094
00095 template <typename T>
00096 inline std::ostream & PrimaryHDU<T>::put (std::ostream &s) const
00097 {
00098 s << "PrimaryHDU:: Simple? " << simple() << " Extend?: " << extend() <<
00099 " Bitpix: " << bitpix() << " naxis = " << axes() << "\n";
00100 s << "Axis Lengths: \n";
00101
00102
00103
00104 for (int i=0; i < axes(); i++)
00105 s << " axis[" << i << "] " << axis(i) << "\n";
00106
00107 s << "\nNumber of keywords read: " << keyWord().size() << "\n";
00108
00109 for (std::map<String,Keyword*>::const_iterator ki = keyWord().begin();
00110 ki != keyWord().end(); ki++)
00111 {
00112 s << *((*ki).second) << std::endl;
00113 }
00114
00115
00116 s << " HISTORY: " << history() << '\n';
00117 s << " COMMENTS: " <<comment() << '\n';
00118 return s;
00119 }
00120
00121 template <typename T>
00122 inline const Image<T>& PrimaryHDU<T>::data () const
00123 {
00124 return m_data;
00125 }
00126
00127
00128
00129 template <typename T>
00130 PrimaryHDU<T>::PrimaryHDU(const PrimaryHDU<T> &right)
00131 : PHDU(right), m_data(right.m_data)
00132 {
00133 }
00134
00135 template <typename T>
00136 PrimaryHDU<T>::PrimaryHDU (FITSBase* p, const int bitpix, const int naxis, const std::vector<long>& naxes, const std::valarray<T>& data)
00137 : PHDU(p,bitpix,naxis,naxes),m_data(data)
00138 {
00139 }
00140
00141 template <typename T>
00142 PrimaryHDU<T>::PrimaryHDU (FITSBase* p, bool readFlag, const std::vector<String>& keys)
00143 : PHDU(p), m_data()
00144 {
00145 initRead();
00146
00147 if (readFlag || keys.size()) readData(readFlag,keys);
00148
00149 }
00150
00151
00152 template <typename T>
00153 PrimaryHDU<T> * PrimaryHDU<T>::clone (FITSBase* p) const
00154 {
00155 PrimaryHDU<T>* cloned = new PrimaryHDU<T>(*this);
00156 cloned->parent() = p;
00157 return cloned;
00158 }
00159
00160 template <typename T>
00161 void PrimaryHDU<T>::readData (bool readFlag, const std::vector<String>& keys)
00162 {
00163
00164
00165 makeThisCurrent();
00166
00167 if ( keys.size() > 0)
00168 {
00169 std::list<String> keyList(keys.size());
00170
00171
00172
00173 std::copy(keys.begin(),keys.end(),keyList.begin());
00174 readKeywords(keyList);
00175 }
00176
00177
00178
00179 if ( readFlag && (naxis() > 0) )
00180 {
00181 FITSUtil::FitsNullValue<T> null;
00182 long init(1);
00183 T nulValue(null());
00184 long nelements(std::accumulate(naxes().begin(),naxes().end(),init,std::multiplies<long>() ));
00185 readImage(1,nelements,&nulValue);
00186
00187 }
00188 }
00189
00190 template <typename T>
00191 const std::valarray<T>& PrimaryHDU<T>::image () const
00192 {
00193
00194 return m_data.image();
00195 }
00196
00197 template <typename T>
00198 std::valarray<T>& PrimaryHDU<T>::image ()
00199 {
00200
00201 return m_data.image();
00202 }
00203
00204 template <typename T>
00205 void PrimaryHDU<T>::setImage (const std::valarray<T>& inData)
00206 {
00207 m_data.image().resize(inData.size());
00208 m_data.setImage(inData);
00209 }
00210
00211 template <typename T>
00212 const std::valarray<T>& PrimaryHDU<T>::readImage (long first, long nElements, T* nullValue)
00213 {
00214 makeThisCurrent();
00215 return m_data.readImage(fitsPointer(),first,nElements,nullValue,naxes(),anynul());
00216 }
00217
00218 template <typename T>
00219 const std::valarray<T>& PrimaryHDU<T>::readImage (const std::vector<long>& firstVertex, const std::vector<long>& lastVertex, const std::vector<long>& stride, T* nullValue)
00220 {
00221 makeThisCurrent();
00222 return m_data.readImage(fitsPointer(),firstVertex,lastVertex,stride,nullValue,naxes(),anynul());
00223 }
00224
00225 template <typename T>
00226 void PrimaryHDU<T>::writeImage (long first, long nElements, const std::valarray<T>& inData, T* nullValue)
00227 {
00228 m_data.writeImage(fitsPointer(),first,nElements,inData,naxes(),nullValue);
00229 }
00230
00231 template <typename T>
00232 void PrimaryHDU<T>::writeImage (const std::vector<long>& firstVertex, const std::vector<long>& lastVertex, const std::vector<long>& stride, const std::valarray<T>& inData)
00233 {
00234 m_data.writeImage(fitsPointer(),firstVertex,lastVertex,stride,inData,naxes());
00235 }
00236
00237
00238
00239 }
00240
00241
00242 #endif