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

Last change on this file since 3668 was 3493, checked in by ansari, 17 years ago

1/ Ajout methodes FitsArrayHandler<T>::ReadAtOffset() WriteAtOffset() pour lecture/ecriture de tableaux <> HDU IMAGE par morceaux
2/ Ajout entete commentaire avec copyright LAL+DAPNIA dans les fichiers .h

Reza 30/04/2008

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