source: Sophya/trunk/SophyaExt/FitsIOServer/fitsntuple.cc@ 985

Last change on this file since 985 was 972, checked in by ansari, 25 years ago

mise a jour 27/04/00 GLM

File size: 3.9 KB
RevLine 
[860]1#include "pexceptions.h"
2#include "fitsntuple.h"
3///////////////////////////////////////////////////////////
4// Les objets delegues pour la gestion de persistance sur fichiers fits
5// pout NTuple
6///////////////////////////////////////////////////////////
7
8
9#define LONNOM 8
10#define LONNOM1 (LONNOM+1)
11
12
13
14FITS_NTuple::FITS_NTuple()
15{
16 dobj_ = new NTuple;
17 column_ = NULL;
18 ownobj=true;
19}
20
21FITS_NTuple::FITS_NTuple(char inputfile[],int hdunum)
22{
23 dobj_ = new NTuple;
24 column_ = NULL;
25 ownobj=true;
26
27 ReadF(inputfile,hdunum);
28}
29
30
31FITS_NTuple::FITS_NTuple(const NTuple & obj)
32{
33 dobj_ = new NTuple(obj);
34 column_ = NULL;
35 ownobj=true;
36}
37
38
39FITS_NTuple::~FITS_NTuple()
40{
41 if (ownobj && dobj_ != NULL) delete dobj_;
42 if (column_ != NULL) delete [] column_;
43}
44
[972]45void FITS_NTuple::Write(char outputfile[], bool OldFile)
[860]46{
[972]47 WriteF(outputfile, OldFile);
[860]48}
49
[972]50void FITS_NTuple::ReadFromFits(FitsFile& fn)
[860]51{
52 if (!fn.IsFitsTable())
53 {
54 throw PException("ReadFromFits: the fits file seems not to be a bintable nor ASCII table");
55 }
56 int nbcols, nbentries;
57 nbcols = fn.NbColsFromFits();
58 nbentries = 0;
[923]59 int k;
60 for (k=0; k<nbcols; k++) nbentries=max( nbentries, fn.NentriesFromFits(k) );
[860]61
62 char ** ColName = new char*[nbcols];
63
[923]64 for (k=0; k<nbcols;k++)
[860]65 {
66 ColName[k] = new char[LONNOM1];
67 strncpy(ColName[k], fn.ColNameFromFits(k).c_str(),LONNOM);
68 ColName[k][LONNOM] = '\0';
69 }
[923]70 for (k=0; k<nbcols;k++)
[860]71 {
72 char ss= fn.ColTypeFromFits(k);
73 string type;
74 if (ss != 'E')
75 {
76 if (ss == 'D') type= string("double");
77 else
78 if (ss == 'I') type= string("integer");
79 else
80 if (ss == 'A') type = string("char*");
81 else
82 type = string("unknown");
83 cout << " WARNING: the column " << k << " on fits file is not float but : " << type << endl;
84 }
85 }
86 if(dobj_ == NULL)
87 {
88 dobj_= new NTuple(nbcols,ColName);
89 ownobj= true;
90 }
91 else
92 {
93 dobj_->Clean();
94 (*dobj_) = NTuple(nbcols,ColName);
95 }
[923]96 for (k=0; k<nbcols;k++)
[860]97 {
98 delete [] ColName[k];
99 }
100 delete [] ColName;
101 if (column_ != NULL) delete [] column_;
102 column_ = new float[nbentries];
103
104 // j'initialise le NTuple a zero, pour le dimensionner
105 // (SetVal suppose que le ntuple est deja dimensionne)
106 r_4* ligne = new r_4[nbcols];
[923]107 for (k=0; k<nbcols; k++) ligne[k]=0.;
108 for (k=0; k<nbentries;k++) dobj_->Fill(ligne);
[860]109 delete [] ligne;
[923]110 for (k=0; k<nbcols;k++)
[860]111 {
112 fn.GetBinTabFCol(column_, nbentries, k);
113 for (int nent=0; nent<nbentries; nent++) dobj_->SetVal(nent,k, column_[nent]);
114 }
115 dobj_->Info()=fn.DVListFromFits();
116}
[972]117void FITS_NTuple::WriteToFits(FitsFile& fn)
[860]118{
119 if(dobj_ == NULL)
120 {
121 cout << " WriteToFits:: dobj_= null " << endl;
122 return;
123 }
124
125 // table will have 'ncols' columns
126 int ncols = dobj_->NVar();
127
128 // table will have 'nrows' rows
129 int nentries = dobj_->NEntry();
130
131 // get names and values from the join DVList object
132 DVList dvl= dobj_->Info();
133 // extension name
134 char* extname = "NTuple_Binary_tbl";
135 dvl.Print();
136
137 char** Noms = new char*[ncols];
[923]138 int k;
139 for (k=0; k< ncols; k++)
[860]140 {
141 Noms[k]= new char[LONNOM1];
142 strncpy(Noms[k],dobj_->NomIndex(k),LONNOM1);
143 }
144 // la librairie fitsio ecrit colonne par colonne
145 char* type= new char[ncols+1];
[923]146 for (k=0;k<ncols+1;k++) type[k]='E';
[860]147 type[ncols]='\0';
148 vector<int> dummy;
149 fn.makeHeaderBntblOnFits(type,Noms, nentries, ncols, dvl, extname, dummy);
[923]150 for (k=0; k< ncols; k++)
[860]151 {
152 delete [] Noms[k];
153 }
154 delete [] Noms;
155 delete [] type;
[923]156 for (k=0; k<ncols;k++) putColToFits(k, nentries, getColFromObj(k));
[860]157
158}
159
160float* FITS_NTuple::getColFromObj(int colNr)
161{
162 if (column_ != NULL)
163 {
164 delete [] column_;
165 column_ = NULL;
166 }
167 column_ = new float[dobj_->NEntry()];
168 for(int j = 0; j < dobj_->NEntry(); j++) column_[j]= dobj_->GetVal(j,colNr);
169 return column_;
170}
Note: See TracBrowser for help on using the repository browser.