00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef EXTHDU_H
00010 #define EXTHDU_H 1
00011
00012
00013 #include "CCfits.h"
00014
00015 #include "HDU.h"
00016
00017 #include "FitsError.h"
00018
00019 namespace CCfits {
00020 class Column;
00021
00022 }
00023
00024
00025 namespace CCfits {
00026
00421 class ExtHDU : public HDU
00422 {
00423
00424 public:
00425
00426
00427
00428 class WrongExtensionType : public FitsException
00429 {
00430 public:
00431 WrongExtensionType (const String& msg, bool silent = true);
00432
00433 protected:
00434 private:
00435 private:
00436 };
00437 ExtHDU(const ExtHDU &right);
00438 virtual ~ExtHDU();
00439 friend bool operator<(const ExtHDU &left,const ExtHDU &right);
00440
00441 friend bool operator>(const ExtHDU &left,const ExtHDU &right);
00442
00443 friend bool operator<=(const ExtHDU &left,const ExtHDU &right);
00444
00445 friend bool operator>=(const ExtHDU &left,const ExtHDU &right);
00446
00447 static void readHduName (const fitsfile* fptr, int hduIndex, String& hduName, int& hduVersion);
00448 virtual void readData (bool readFlag = false, const std::vector<String>& keys = std::vector<String>()) = 0;
00449 const String& name () const;
00450 virtual HDU * clone (FITSBase* p) const = 0;
00451
00452
00453
00454
00455
00456 virtual void makeThisCurrent () const;
00457 virtual Column& column (const String& colName, bool caseSensitive = true) const;
00458 virtual Column& column (int colIndex) const;
00459 virtual long rows () const;
00460 virtual void addColumn (ValueType type, const String& columnName, long repeatWidth, const String& colUnit = String(""), long decimals = -1, size_t columnNumber = 0);
00461 virtual void deleteColumn (const String& columnName);
00462 virtual long getRowsize () const;
00463 virtual int numCols () const;
00464 virtual const std::map<string, Column*>& column () const;
00465
00466 bool isCompressed () const;
00467 int version () const;
00468 void version (int value);
00469 static const String& missHDU ();
00470 static void setMissHDU (const String& value);
00471
00472 public:
00473
00474
00475
00476
00477
00478
00479
00480
00481 template <typename S>
00482 void write(const std::vector<long>& first,
00483 long nElements,
00484 const std::valarray<S>& data,
00485 S* nullValue);
00486
00487
00488 template <typename S>
00489 void write(long first,
00490 long nElements,
00491 const std::valarray<S>& data,
00492 S* nullValue);
00493
00494 template <typename S>
00495 void write(const std::vector<long>& first,
00496 long nElements,
00497 const std::valarray<S>& data);
00498
00499
00500 template <typename S>
00501 void write(long first,
00502 long nElements,
00503 const std::valarray<S>& data);
00504
00505 template <typename S>
00506 void write(const std::vector<long>& firstVertex,
00507 const std::vector<long>& lastVertex,
00508 const std::valarray<S>& data);
00509
00510
00511
00512
00513
00514
00515 template <typename S>
00516 void read (std::valarray<S>& image) ;
00517
00518 template<typename S>
00519 void read (std::valarray<S>& image,
00520 long first,
00521 long nElements,
00522 S* nullValue) ;
00523
00524 template<typename S>
00525 void read (std::valarray<S>& image,
00526 const std::vector<long>& first,
00527 long nElements,
00528 S* nullValue) ;
00529
00530 template<typename S>
00531 void read (std::valarray<S>& image,
00532 const std::vector<long>& firstVertex,
00533 const std::vector<long>& lastVertex,
00534 const std::vector<long>& stride) ;
00535
00536 template<typename S>
00537 void read (std::valarray<S>& image,
00538 long first,
00539 long nElements) ;
00540
00541 template<typename S>
00542 void read (std::valarray<S>& image,
00543 const std::vector<long>& first,
00544 long nElements) ;
00545
00546 template<typename S>
00547 void read (std::valarray<S>& image,
00548 const std::vector<long>& firstVertex,
00549 const std::vector<long>& lastVertex,
00550 const std::vector<long>& stride,
00551 S* nullValue) ;
00552
00553 protected:
00554
00555 ExtHDU (FITSBase* p, HduType xtype, const String &hduName, int version);
00556
00557
00558 ExtHDU (FITSBase* p, HduType xtype, const String &hduName, int bitpix, int naxis, const std::vector<long>& axes, int version);
00559
00560
00561
00562 ExtHDU (FITSBase* p, HduType xtype, int number);
00563
00564 virtual std::ostream & put (std::ostream &s) const = 0;
00565 virtual void setColumn (const String& colname, Column* value);
00566 virtual void checkExtensionType () const;
00567 int getVersion ();
00568 long pcount () const;
00569 void pcount (long value);
00570 long gcount () const;
00571 void gcount (long value);
00572 HduType xtension () const;
00573 void xtension (HduType value);
00574
00575
00576
00577 private:
00578 virtual void initRead () = 0;
00579 void checkXtension ();
00580
00581
00582
00583 private:
00584
00585 long m_pcount;
00586 long m_gcount;
00587 int m_version;
00588 HduType m_xtension;
00589 static String s_missHDU;
00590
00591
00592 String m_name;
00593
00594
00595
00596 };
00597
00598
00599
00600
00601
00602 inline bool operator<(const ExtHDU &left,const ExtHDU &right)
00603 {
00604 if (left.m_name < right.m_name) return true;
00605 if (left.m_name > right.m_name) return false;
00606 if (left.m_name == right.m_name)
00607 {
00608 if (left.m_version < right.m_version) return true;
00609 }
00610 return false;
00611 }
00612
00613 inline bool operator>(const ExtHDU &left,const ExtHDU &right)
00614 {
00615 return !operator<=(left,right);
00616 }
00617
00618 inline bool operator<=(const ExtHDU &left,const ExtHDU &right)
00619 {
00620 if (left.m_name <= right.m_name)
00621 {
00622 if (left.m_version <= right.m_version) return true;
00623 }
00624 return false;
00625 }
00626
00627 inline bool operator>=(const ExtHDU &left,const ExtHDU &right)
00628 {
00629 return !operator<(left,right);
00630 }
00631
00632
00633 inline const String& ExtHDU::name () const
00634 {
00635
00636 return m_name;
00637 }
00638
00639 inline long ExtHDU::pcount () const
00640 {
00641 return m_pcount;
00642 }
00643
00644 inline void ExtHDU::pcount (long value)
00645 {
00646 m_pcount = value;
00647 }
00648
00649 inline long ExtHDU::gcount () const
00650 {
00651 return m_gcount;
00652 }
00653
00654 inline void ExtHDU::gcount (long value)
00655 {
00656 m_gcount = value;
00657 }
00658
00659 inline int ExtHDU::version () const
00660 {
00661 return m_version;
00662 }
00663
00664 inline void ExtHDU::version (int value)
00665 {
00666 m_version = value;
00667 }
00668
00669 inline HduType ExtHDU::xtension () const
00670 {
00671 return m_xtension;
00672 }
00673
00674 inline void ExtHDU::xtension (HduType value)
00675 {
00676 m_xtension = value;
00677 }
00678
00679 inline const String& ExtHDU::missHDU ()
00680 {
00681 return s_missHDU;
00682 }
00683
00684 inline void ExtHDU::setMissHDU (const String& value)
00685 {
00686 s_missHDU = value;
00687 }
00688
00689 }
00690
00691
00692 #endif