// Astrophysics Science Division, // NASA/ Goddard Space Flight Center // HEASARC // http://heasarc.gsfc.nasa.gov // e-mail: ccfits@legacy.gsfc.nasa.gov // // Original author: Ben Dorman #ifndef PRIMARYHDU_H #define PRIMARYHDU_H 1 // valarray #include // PHDU #include "PHDU.h" // HDUCreator #include "HDUCreator.h" // Image #include "Image.h" // FITS #include "FITS.h" #include "CCfits.h" #include #include #include namespace CCfits { template class PrimaryHDU : public PHDU //## Inherits: %394E6F870338 { public: virtual PrimaryHDU * clone (FITSBase* p) const; // Read data reads the image if readFlag is true and // optional keywords if supplied. Thus, with no arguments, // readData() does nothing. virtual void readData (bool readFlag = false, const std::vector& keys = std::vector()); const std::valarray& image () const; const std::valarray& readImage (long first, long nElements, T* nullValue); const std::valarray& readImage (const std::vector& firstVertex, const std::vector& lastVertex, const std::vector& stride,T* nullValue); void writeImage (long first, long nElements, const std::valarray& inData, T* nullValue = 0); void writeImage (const std::vector& firstVertex, const std::vector& lastVertex, const std::vector& stride, const std::valarray& inData); virtual void zero (double value); virtual void scale (double value); virtual void suppressScaling(bool toggle = true); virtual void resetImageRead (); // Additional Public Declarations protected: // Constructor for new FITS objects, takes as arguments // the required keywords for a primary HDU. PrimaryHDU (FITSBase* p, const int bitpix, const int naxis, const std::vector& naxes, const std::valarray& data = std::valarray()); // Custom constructor. Allows specification of data to be read and whether to read data at // construction or wait until the image data are requested. The default is 'lazy initialization:' // wait until asked. PrimaryHDU (FITSBase* p, bool readFlag = false, const std::vector& keys = std::vector()); // Additional Protected Declarations private: PrimaryHDU(const PrimaryHDU< T > &right); PrimaryHDU< T > & operator=(const PrimaryHDU< T > &right); virtual std::ostream & put (std::ostream &s) const; const Image& data () const; // Additional Private Declarations private: //## implementation // Data Members for Associations Image m_data; // Additional Implementation Declarations friend class HDUCreator; friend class PHDU; }; // Parameterized Class CCfits::PrimaryHDU template inline std::ostream & PrimaryHDU::put (std::ostream &s) const { s << "PrimaryHDU:: Simple? " << simple() << " Extend?: " << extend() << " Bitpix: " << bitpix() << " naxis = " << axes() << "\n"; s << "Axis Lengths: \n"; for (int i=0; i < axes(); i++) s << " axis[" << i << "] " << axis(i) << "\n"; s << "\nNumber of keywords read: " << keyWord().size() << "\n"; for (std::map::const_iterator ki = keyWord().begin(); ki != keyWord().end(); ki++) { s << *((*ki).second) << std::endl; } s << " HISTORY: " << history() << '\n'; s << " COMMENTS: " < inline const Image& PrimaryHDU::data () const { return m_data; } // Parameterized Class CCfits::PrimaryHDU template PrimaryHDU::PrimaryHDU(const PrimaryHDU &right) : PHDU(right), m_data(right.m_data) { } template PrimaryHDU::PrimaryHDU (FITSBase* p, const int bitpix, const int naxis, const std::vector& naxes, const std::valarray& data) : PHDU(p,bitpix,naxis,naxes),m_data(data) { } template PrimaryHDU::PrimaryHDU (FITSBase* p, bool readFlag, const std::vector& keys) : PHDU(p), m_data() { initRead(); if (readFlag || keys.size()) readData(readFlag,keys); } template PrimaryHDU * PrimaryHDU::clone (FITSBase* p) const { PrimaryHDU* cloned = new PrimaryHDU(*this); cloned->parent() = p; return cloned; } template void PrimaryHDU::readData (bool readFlag, const std::vector& keys) { // Default reading mode. Read everything if readFlag is true. makeThisCurrent(); if ( keys.size() > 0) { std::list keyList(keys.size()); // keys is converted to a list so that any keys not in the header // can be easily erased. internally an exception will be thrown, // on a missing key, and its catch clause will print a message. std::copy(keys.begin(),keys.end(),keyList.begin()); readKeywords(keyList); } // read the entire image, setting null values to the // return value from FitsNullValue. It would be easy to make the null value // a user defined input, but that's not implemented yet. if ( readFlag && (naxis() > 0) ) { FITSUtil::FitsNullValue null; long init(1); T nulValue(null()); long nelements(std::accumulate(naxes().begin(),naxes().end(),init,std::multiplies() )); readImage(1,nelements,&nulValue); } } template const std::valarray& PrimaryHDU::image () const { return m_data.image(); } template const std::valarray& PrimaryHDU::readImage (long first, long nElements, T* nullValue) { makeThisCurrent(); return m_data.readImage(fitsPointer(),first,nElements,nullValue,naxes(),anynul()); } template const std::valarray& PrimaryHDU::readImage (const std::vector& firstVertex, const std::vector& lastVertex, const std::vector& stride,T* nullValue) { makeThisCurrent(); return m_data.readImage(fitsPointer(),firstVertex,lastVertex,stride,nullValue,naxes(),anynul()); } template void PrimaryHDU::writeImage (long first, long nElements, const std::valarray& inData, T* nullValue) { long newNaxisN=0; m_data.writeImage(fitsPointer(),first,nElements,inData,naxes(),newNaxisN,nullValue); if (newNaxisN) naxes(naxes().size()-1,newNaxisN); } template void PrimaryHDU::writeImage (const std::vector& firstVertex, const std::vector& lastVertex, const std::vector& stride, const std::valarray& inData) { long newNaxisN=0; m_data.writeImage(fitsPointer(),firstVertex,lastVertex,stride,inData,naxes(),newNaxisN); if (newNaxisN) naxes(naxes().size()-1,newNaxisN); } template void PrimaryHDU::scale (double value) { PHDU::scale(value); m_data.scalingHasChanged(); } template void PrimaryHDU::zero (double value) { PHDU::zero(value); m_data.scalingHasChanged(); } template void PrimaryHDU::suppressScaling (bool toggle) { HDU::suppressScaling(toggle); m_data.scalingHasChanged(); } template void PrimaryHDU::resetImageRead() { m_data.resetRead(); } // Additional Declarations } // namespace CCfits #endif