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

Last change on this file since 3023 was 2907, checked in by ansari, 20 years ago

debug/check fits : gestion NTuple colonnes double + init hdunum_ ds FitsFile(FitsInOutFile&) + correction gestion TArray/TMatrix/TVector ds fitsarrhand.h - Reza 17/01/2006

File size: 3.5 KB
RevLine 
[2820]1#ifndef FITSARRHAND_H
2#define FITSARRHAND_H
3
4#include "machdefs.h"
5#include <string>
6#include "tarray.h"
[2864]7#include "tvector.h"
[2820]8
9#include "fitshandler.h"
[2864]10#include "fitsblkrw.h"
[2820]11
12namespace SOPHYA {
13
14/*!
15 \ingroup FitsIOServer
16 \brief FITS I/O handler for array objects
17*/
18
19template <class T>
20class FitsArrayHandler : public FitsHandlerInterface {
21public :
22 FitsArrayHandler() { dobj=NULL; ownobj=true; }
23 FitsArrayHandler(TArray< T > & obj) { dobj = &obj; ownobj=false; }
24 virtual ~FitsArrayHandler() { if (ownobj && dobj) delete dobj; }
25 virtual AnyDataObj* DataObj() { return(dobj); }
26
[2864]27 virtual int CheckHandling(AnyDataObj & o)
[2820]28 {
[2864]29 if ( (typeid(o) == typeid(TArray<T>)) ||
30 (typeid(o) == typeid(TMatrix<T>)) ||
31 (typeid(o) == typeid(TVector<T>)) ) return 2;
[2820]32 TArray<T> * po = dynamic_cast< TArray<T> * >(& o);
[2864]33 if (po == NULL) return 0;
34 else return 1;
[2820]35 }
[2864]36
[2820]37 virtual void SetDataObj(AnyDataObj & o)
38 {
39 TArray<T> * po = dynamic_cast< TArray<T> * >(& o);
40 if (po == NULL) {
41 string msg = "FitsHandler<T>::SetDataObj() Wrong object type: " ;
42 msg += typeid(o).name();
43 throw TypeMismatchExc(msg);
44 }
45 if (ownobj && dobj) delete dobj; dobj = po; ownobj = false;
46 }
47
[2864]48 virtual int CheckReadability(FitsInOutFile& is)
49 {
50 if (is.CurrentHDUType() != IMAGE_HDU) return 0;
51 T x = 0;
52 long naxes[BASEARRAY_MAXNDIMS];
53 int naxis=BASEARRAY_MAXNDIMS;
[2898]54 int imgtyp = is.GetImageHDUInfo(naxis, naxes);
55 if (naxis < 1) return 0;
56 if (FitsTypes::ImageType(x) == imgtyp) return 2;
[2864]57 else return 1;
58 }
59
[2820]60 virtual FitsHandlerInterface* Clone()
61 { return new FitsArrayHandler< T >(); }
62
63 inline operator T&() { return(*dobj); }
64
65 //----- Ecriture
66 virtual void Write(FitsInOutFile& os)
67 {
68 if ( dobj == NULL)
69 throw NullPtrError("FitsArrayHandler<T>::Write() dobj=NULL ");
70 long naxes[BASEARRAY_MAXNDIMS] = {0,0,0,0,0};
71 for(int_4 id=0; id<dobj->NbDimensions(); id++)
72 naxes[id] = dobj->Size(id);
[2844]73 T x = 0;
[2820]74 os.CreateImageHDU(FitsTypes::ImageType(x), dobj->NbDimensions(), naxes);
75 os.WriteHeaderRecords(dobj->Info());
[2864]76 MuTyV mtv;
77 mtv = "SOPHYA::TArray<T>";
78 os.WriteKey("SOPCLSNM",mtv," Object class name ");
[2820]79 FitsBlockRW<T>::WriteImageData(os, dobj->Data(), dobj->Size());
80 }
81
82 //----- Lecture
83 virtual void Read(FitsInOutFile& is)
84 {
85 long naxes[BASEARRAY_MAXNDIMS];
86 int naxis=BASEARRAY_MAXNDIMS;
87 is.GetImageHDUInfo(naxis, naxes);
[2864]88 if ( dobj == NULL) {
89 if (naxis == 1) dobj = new TVector<T>;
[2907]90 else if (naxis == 2) {
91 if ( (naxes[0] == 1) || (naxes[1] == 1) )
92 dobj = new TVector<T>;
93 else dobj = new TMatrix<T>;
94 }
[2864]95 else dobj = new TArray<T>;
96 ownobj = true;
97 }
[2820]98 sa_size_t sz[BASEARRAY_MAXNDIMS];
99 if (naxis > BASEARRAY_MAXNDIMS) naxis = BASEARRAY_MAXNDIMS;
100 for(int_4 id=0; id<naxis; id++) sz[id] = naxes[id];
101 dobj->SetSize(naxis, sz, 1, false);
102 FitsBlockRW<T>::ReadImageData(is, dobj->Data(), dobj->Size());
103 is.GetHeaderRecords(dobj->Info());
104 }
105
106protected :
107 TArray<T> * dobj;
108 bool ownobj; // True si dobj obtenu par new
109};
110
111
112template <class T>
113inline FitsInOutFile& operator << (FitsInOutFile& os, TArray<T> const & obj)
114{ FitsArrayHandler<T> fio(const_cast< TArray<T> &>(obj)); fio.Write(os); return os; }
115
116template <class T>
117inline FitsInOutFile& operator >> (FitsInOutFile& is, TArray<T> & obj)
118{ FitsArrayHandler<T> fio(obj); fio.Read(is); is.MoveToNextHDU(); return(is); }
119
120
121} // Fin du namespace
122
123#endif
124
Note: See TracBrowser for help on using the repository browser.