source: Sophya/trunk/SophyaExt/FitsIOServer/fitsarrhand.h@ 3885

Last change on this file since 3885 was 3885, checked in by ansari, 15 years ago

correction petit bug (pb lors de lecture FITS avec NAXIS=1, Reza 23/09/2010

File size: 6.5 KB
RevLine 
[3493]1/*
2 --- SOPHYA software - FitsIOServer module ---
3 R. Ansari , 2005-2008
4 (C) UPS+LAL IN2P3/CNRS (C) DAPNIA-SPP/CEA
5*/
[2820]6#ifndef FITSARRHAND_H
7#define FITSARRHAND_H
8
9#include "machdefs.h"
10#include <string>
11#include "tarray.h"
[2864]12#include "tvector.h"
[2820]13
14#include "fitshandler.h"
[2864]15#include "fitsblkrw.h"
[2820]16
17namespace SOPHYA {
18
19/*!
20 \ingroup FitsIOServer
21 \brief FITS I/O handler for array objects
22*/
23
24template <class T>
25class FitsArrayHandler : public FitsHandlerInterface {
26public :
27 FitsArrayHandler() { dobj=NULL; ownobj=true; }
28 FitsArrayHandler(TArray< T > & obj) { dobj = &obj; ownobj=false; }
29 virtual ~FitsArrayHandler() { if (ownobj && dobj) delete dobj; }
30 virtual AnyDataObj* DataObj() { return(dobj); }
31
[2864]32 virtual int CheckHandling(AnyDataObj & o)
[2820]33 {
[2864]34 if ( (typeid(o) == typeid(TArray<T>)) ||
35 (typeid(o) == typeid(TMatrix<T>)) ||
36 (typeid(o) == typeid(TVector<T>)) ) return 2;
[2820]37 TArray<T> * po = dynamic_cast< TArray<T> * >(& o);
[2864]38 if (po == NULL) return 0;
39 else return 1;
[2820]40 }
[2864]41
[2820]42 virtual void SetDataObj(AnyDataObj & o)
43 {
44 TArray<T> * po = dynamic_cast< TArray<T> * >(& o);
45 if (po == NULL) {
46 string msg = "FitsHandler<T>::SetDataObj() Wrong object type: " ;
47 msg += typeid(o).name();
48 throw TypeMismatchExc(msg);
49 }
50 if (ownobj && dobj) delete dobj; dobj = po; ownobj = false;
51 }
52
[2864]53 virtual int CheckReadability(FitsInOutFile& is)
54 {
55 if (is.CurrentHDUType() != IMAGE_HDU) return 0;
56 T x = 0;
[3167]57 LONGLONG naxes[BASEARRAY_MAXNDIMS];
[2864]58 int naxis=BASEARRAY_MAXNDIMS;
[2898]59 int imgtyp = is.GetImageHDUInfo(naxis, naxes);
60 if (naxis < 1) return 0;
61 if (FitsTypes::ImageType(x) == imgtyp) return 2;
[2864]62 else return 1;
63 }
64
[2820]65 virtual FitsHandlerInterface* Clone()
66 { return new FitsArrayHandler< T >(); }
67
68 inline operator T&() { return(*dobj); }
69
70 //----- Ecriture
[3493]71 //! Writes the complete array as an IMAGE HDU
[2820]72 virtual void Write(FitsInOutFile& os)
73 {
[3493]74 if (( dobj == NULL) || (dobj->Size() < 1))
75 throw NullPtrError("FitsArrayHandler<T>::Write() dobj=NULL or dobj->Size()=0");
76
[3167]77 LONGLONG naxes[BASEARRAY_MAXNDIMS] = {0,0,0,0,0};
[2820]78 for(int_4 id=0; id<dobj->NbDimensions(); id++)
79 naxes[id] = dobj->Size(id);
[2844]80 T x = 0;
[2820]81 os.CreateImageHDU(FitsTypes::ImageType(x), dobj->NbDimensions(), naxes);
82 os.WriteHeaderRecords(dobj->Info());
[2864]83 MuTyV mtv;
84 mtv = "SOPHYA::TArray<T>";
85 os.WriteKey("SOPCLSNM",mtv," Object class name ");
[2820]86 FitsBlockRW<T>::WriteImageData(os, dobj->Data(), dobj->Size());
87 }
88
89 //----- Lecture
[3493]90 //! Resize the array and reads the complete IMAGE HDU to the array
[2820]91 virtual void Read(FitsInOutFile& is)
92 {
[3167]93 LONGLONG naxes[BASEARRAY_MAXNDIMS];
[2820]94 int naxis=BASEARRAY_MAXNDIMS;
95 is.GetImageHDUInfo(naxis, naxes);
[2864]96 if ( dobj == NULL) {
97 if (naxis == 1) dobj = new TVector<T>;
[2907]98 else if (naxis == 2) {
99 if ( (naxes[0] == 1) || (naxes[1] == 1) )
100 dobj = new TVector<T>;
101 else dobj = new TMatrix<T>;
102 }
[2864]103 else dobj = new TArray<T>;
104 ownobj = true;
105 }
[2820]106 sa_size_t sz[BASEARRAY_MAXNDIMS];
[3493]107 if (naxis > BASEARRAY_MAXNDIMS) {
108 cerr << "FitsArrayHandler<T>::Read()/Warning FITS NAXIS=" << naxis
109 << " > BASEARRAY_MAXNDIMS=" << BASEARRAY_MAXNDIMS << endl;
110 naxis = BASEARRAY_MAXNDIMS;
111 }
[2820]112 for(int_4 id=0; id<naxis; id++) sz[id] = naxes[id];
[3885]113 TMatrix<T> * pmx = dynamic_cast< TMatrix<T> * >(dobj);
114 if ((naxis==1)&&(pmx!=NULL)) {
115 TVector<T> * pvec = dynamic_cast< TVector<T> * >(dobj);
116 if (pvec!=NULL) pvec->SetSize(naxes[0]);
117 else pmx->SetSize(1,naxes[0]);
118 }
119 else dobj->SetSize(naxis, sz, 1, false);
[2820]120 FitsBlockRW<T>::ReadImageData(is, dobj->Data(), dobj->Size());
121 is.GetHeaderRecords(dobj->Info());
122 }
123
[3493]124 //----- Lecture avec specification d'offset et taille donnee par le tableau
125 /*! \brief Reads from the fits file into the array, at the specified offset
126
127 The array should be allocated and its size is used to define the number of
128 pixels to be read.
129 \warning The offset should be specified with SOPHYA/C array index convention
130 (starting at zero) - and NOT the cfitsio/fortran convention.
131 The offset should contain as many elements as the fits NAXIS keyword.
132 */
133 virtual void ReadAtOffset(FitsInOutFile& is, sa_size_t* offset)
134 {
135 if (( dobj == NULL) || (dobj->Size() < 1))
136 throw NullPtrError("FitsArrayHandler<T>::ReadAtOffset() dobj=NULL or dobj->Size()=0");
137
138 LONGLONG naxes[BASEARRAY_MAXNDIMS];
139 int naxis=BASEARRAY_MAXNDIMS;
140 is.GetImageHDUInfo(naxis, naxes);
141 LONGLONG fpix[15];
142 int namx = (naxis < 15) ? naxis : 15;
143 for(int i=0; i<namx; i++) fpix[i] = offset[i]+1;
144 FitsBlockRW<T>::ReadImageData(is, dobj->Data(), dobj->Size(), fpix);
145 is.GetHeaderRecords(dobj->Info());
146 }
147
148 //----- Ecriture avec specification d'offset et taille donnee par le tableau
149 /*! \brief Writes the array to the fits file, at the specified offset
150
151 The array should be allocated and its size is used to define the number of
[3850]152 pixels to be written.
[3493]153 \warning The offset should be specified with SOPHYA/C array index convention
154 (starting at zero) - and NOT the cfitsio/fortran convention.
155 The offset should contain as many elements as the fits NAXIS keyword.
156 \warning The IMAGE HDU should be already created using FitsInOutFile::CreateImageHDU().
157 */
158 virtual void WriteAtOffset(FitsInOutFile& os, sa_size_t* offset)
159 {
160 if (( dobj == NULL) || (dobj->Size() < 1))
161 throw NullPtrError("FitsArrayHandler<T>::ReadAtOffset() dobj=NULL or dobj->Size()=0");
162
163 LONGLONG naxes[BASEARRAY_MAXNDIMS];
164 int naxis=BASEARRAY_MAXNDIMS;
165 os.GetImageHDUInfo(naxis, naxes);
166 LONGLONG fpix[15];
167 int namx = (naxis < 15) ? naxis : 15;
168 for(int i=0; i<namx; i++) fpix[i] = offset[i]+1;
169 FitsBlockRW<T>::WriteImageData(os, dobj->Data(), dobj->Size(), fpix);
170 }
171
[2820]172protected :
173 TArray<T> * dobj;
174 bool ownobj; // True si dobj obtenu par new
175};
176
177
[3493]178//! operator << overload to write a TArray<T> to a fits IMAGE HDU
[2820]179template <class T>
180inline FitsInOutFile& operator << (FitsInOutFile& os, TArray<T> const & obj)
181{ FitsArrayHandler<T> fio(const_cast< TArray<T> &>(obj)); fio.Write(os); return os; }
182
[3493]183//! operator >> overload to read a TArray<T> from a fits IMAGE HDU
[2820]184template <class T>
185inline FitsInOutFile& operator >> (FitsInOutFile& is, TArray<T> & obj)
186{ FitsArrayHandler<T> fio(obj); fio.Read(is); is.MoveToNextHDU(); return(is); }
187
188
189} // Fin du namespace
190
191#endif
192
Note: See TracBrowser for help on using the repository browser.