CCfits  2.4
PrimaryHDU.h
1 // Astrophysics Science Division,
2 // NASA/ Goddard Space Flight Center
3 // HEASARC
4 // http://heasarc.gsfc.nasa.gov
5 // e-mail: ccfits@legacy.gsfc.nasa.gov
6 //
7 // Original author: Ben Dorman
8 
9 #ifndef PRIMARYHDU_H
10 #define PRIMARYHDU_H 1
11 
12 // valarray
13 #include <valarray>
14 // PHDU
15 #include "PHDU.h"
16 // HDUCreator
17 #include "HDUCreator.h"
18 // Image
19 #include "Image.h"
20 // FITS
21 #include "FITS.h"
22 #include "CCfits.h"
23 #include <functional>
24 #include <numeric>
25 #include <memory>
26 
27 
28 namespace CCfits {
29 
30 
31 
32  template <typename T>
33  class PrimaryHDU : public PHDU //## Inherits: <unnamed>%394E6F870338
34  {
35 
36  public:
37  virtual PrimaryHDU<T> * clone (FITSBase* p) const;
38  // Read data reads the image if readFlag is true and
39  // optional keywords if supplied. Thus, with no arguments,
40  // readData() does nothing.
41  virtual void readData (bool readFlag = false, const std::vector<String>& keys = std::vector<String>());
42  const std::valarray<T>& image () const;
43  std::valarray<T>& image ();
44  void setImage (const std::valarray<T>& inData);
45  // Read data reads the image if readFlag is true and
46  // optional keywords if supplied. Thus, with no arguments,
47  // readData() does nothing.
48  virtual const std::valarray<T>& readImage (long first, long nElements, T* nullValue);
49  // Read data reads the image if readFlag is true and
50  // optional keywords if supplied. Thus, with no arguments,
51  // readData() does nothing.
52  virtual const std::valarray<T>& readImage (const std::vector<long>& firstVertex, const std::vector<long>& lastVertex, const std::vector<long>& stride, T* nullValue);
53  // Read data reads the image if readFlag is true and
54  // optional keywords if supplied. Thus, with no arguments,
55  // readData() does nothing.
56  virtual void writeImage (long first, long nElements, const std::valarray<T>& inData, T* nullValue = 0);
57  // Read data reads the image if readFlag is true and
58  // optional keywords if supplied. Thus, with no arguments,
59  // readData() does nothing.
60  virtual void writeImage (const std::vector<long>& firstVertex, const std::vector<long>& lastVertex, const std::vector<long>& stride, const std::valarray<T>& inData);
61 
62  // Additional Public Declarations
63 
64  protected:
65  // Constructor for new FITS objects, takes as arguments
66  // the required keywords for a primary HDU.
67  PrimaryHDU (FITSBase* p, const int bitpix, const int naxis, const std::vector<long>& naxes, const std::valarray<T>& data = std::valarray<T>());
68  // Custom constructor. Allows specification of data to be read and whether to read data at
69  // construction or wait until the image data are requested. The default is 'lazy initialization:'
70  // wait until asked.
71  PrimaryHDU (FITSBase* p, bool readFlag = false, const std::vector<String>& keys = std::vector<String>());
72 
73  // Additional Protected Declarations
74 
75  private:
76  PrimaryHDU(const PrimaryHDU< T > &right);
77  PrimaryHDU< T > & operator=(const PrimaryHDU< T > &right);
78 
79  virtual std::ostream & put (std::ostream &s) const;
80  const Image<T>& data () const;
81 
82  // Additional Private Declarations
83 
84  private: //## implementation
85  // Data Members for Associations
86  Image<T> m_data;
87 
88  // Additional Implementation Declarations
89  friend class HDUCreator;
90  friend class PHDU;
91  };
92 
93  // Parameterized Class CCfits::PrimaryHDU
94 
95  template <typename T>
96  inline std::ostream & PrimaryHDU<T>::put (std::ostream &s) const
97  {
98  s << "PrimaryHDU:: Simple? " << simple() << " Extend?: " << extend() <<
99  " Bitpix: " << bitpix() << " naxis = " << axes() << "\n";
100  s << "Axis Lengths: \n";
101 
102 
103 
104  for (int i=0; i < axes(); i++)
105  s << " axis[" << i << "] " << axis(i) << "\n";
106 
107  s << "\nNumber of keywords read: " << keyWord().size() << "\n";
108 
109  for (std::map<String,Keyword*>::const_iterator ki = keyWord().begin();
110  ki != keyWord().end(); ki++)
111  {
112  s << *((*ki).second) << std::endl;
113  }
114 
115 
116  s << " HISTORY: " << history() << '\n';
117  s << " COMMENTS: " <<comment() << '\n';
118  return s;
119  }
120 
121  template <typename T>
122  inline const Image<T>& PrimaryHDU<T>::data () const
123  {
124  return m_data;
125  }
126 
127  // Parameterized Class CCfits::PrimaryHDU
128 
129  template <typename T>
130  PrimaryHDU<T>::PrimaryHDU(const PrimaryHDU<T> &right)
131  : PHDU(right), m_data(right.m_data)
132  {
133  }
134 
135  template <typename T>
136  PrimaryHDU<T>::PrimaryHDU (FITSBase* p, const int bitpix, const int naxis, const std::vector<long>& naxes, const std::valarray<T>& data)
137  : PHDU(p,bitpix,naxis,naxes),m_data(data)
138  {
139  }
140 
141  template <typename T>
142  PrimaryHDU<T>::PrimaryHDU (FITSBase* p, bool readFlag, const std::vector<String>& keys)
143  : PHDU(p), m_data()
144  {
145  initRead();
146 
147  if (readFlag || keys.size()) readData(readFlag,keys);
148 
149  }
150 
151 
152  template <typename T>
153  PrimaryHDU<T> * PrimaryHDU<T>::clone (FITSBase* p) const
154  {
155  PrimaryHDU<T>* cloned = new PrimaryHDU<T>(*this);
156  cloned->parent() = p;
157  return cloned;
158  }
159 
160  template <typename T>
161  void PrimaryHDU<T>::readData (bool readFlag, const std::vector<String>& keys)
162  {
163 
164  // Default reading mode. Read everything if readFlag is true.
165  makeThisCurrent();
166 
167  if ( keys.size() > 0)
168  {
169  std::list<String> keyList(keys.size());
170  // keys is converted to a list so that any keys not in the header
171  // can be easily erased. internally an exception will be thrown,
172  // on a missing key, and its catch clause will print a message.
173  std::copy(keys.begin(),keys.end(),keyList.begin());
174  readKeywords(keyList);
175  }
176  // read the entire image, setting null values to the
177  // return value from FitsNullValue<T>. It would be easy to make the null value
178  // a user defined input, but that's not implemented yet.
179  if ( readFlag && (naxis() > 0) )
180  {
181  FITSUtil::FitsNullValue<T> null;
182  long init(1);
183  T nulValue(null());
184  long nelements(std::accumulate(naxes().begin(),naxes().end(),init,std::multiplies<long>() ));
185  readImage(1,nelements,&nulValue);
186 
187  }
188  }
189 
190  template <typename T>
191  const std::valarray<T>& PrimaryHDU<T>::image () const
192  {
193 
194  return m_data.image();
195  }
196 
197  template <typename T>
198  std::valarray<T>& PrimaryHDU<T>::image ()
199  {
200 
201  return m_data.image();
202  }
203 
204  template <typename T>
205  void PrimaryHDU<T>::setImage (const std::valarray<T>& inData)
206  {
207  m_data.image().resize(inData.size());
208  m_data.setImage(inData);
209  }
210 
211  template <typename T>
212  const std::valarray<T>& PrimaryHDU<T>::readImage (long first, long nElements, T* nullValue)
213  {
214  makeThisCurrent();
215  return m_data.readImage(fitsPointer(),first,nElements,nullValue,naxes(),anynul());
216  }
217 
218  template <typename T>
219  const std::valarray<T>& PrimaryHDU<T>::readImage (const std::vector<long>& firstVertex, const std::vector<long>& lastVertex, const std::vector<long>& stride, T* nullValue)
220  {
221  makeThisCurrent();
222  return m_data.readImage(fitsPointer(),firstVertex,lastVertex,stride,nullValue,naxes(),anynul());
223  }
224 
225  template <typename T>
226  void PrimaryHDU<T>::writeImage (long first, long nElements, const std::valarray<T>& inData, T* nullValue)
227  {
228  m_data.writeImage(fitsPointer(),first,nElements,inData,naxes(),nullValue);
229  }
230 
231  template <typename T>
232  void PrimaryHDU<T>::writeImage (const std::vector<long>& firstVertex, const std::vector<long>& lastVertex, const std::vector<long>& stride, const std::valarray<T>& inData)
233  {
234  m_data.writeImage(fitsPointer(),firstVertex,lastVertex,stride,inData,naxes());
235  }
236 
237  // Additional Declarations
238 
239 } // namespace CCfits
240 
241 
242 #endif