source: Sophya/trunk/SophyaExt/FitsIOServer/fitsxntuple.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: 9.4 KB
Line 
1#include "pexceptions.h"
2#include "fitsxntuple.h"
3///////////////////////////////////////////////////////////
4// Les objets delegues pour la gestion de persistance sur fichiers fits
5// pout XNTuple
6///////////////////////////////////////////////////////////
7
8
9#define LONNOM 31
10
11
12FITS_XNTuple::FITS_XNTuple()
13{
14 dobj_ = new XNTuple;
15 dcolumn_ = NULL;
16 fcolumn_ = NULL;
17 icolumn_ = NULL;
18 ccolumn_ = NULL;
19 ownobj=true;
20}
21
22FITS_XNTuple::FITS_XNTuple(char inputfile[],int hdunum)
23{
24 dobj_ = new XNTuple;
25 dcolumn_ = NULL;
26 fcolumn_ = NULL;
27 icolumn_ = NULL;
28 ccolumn_ = NULL;
29 ownobj=true;
30
31 ReadF(inputfile,hdunum);
32}
33
34
35FITS_XNTuple::FITS_XNTuple(const XNTuple & obj)
36{
37 dobj_ = new XNTuple(obj);
38 dcolumn_ = NULL;
39 fcolumn_ = NULL;
40 icolumn_ = NULL;
41 ccolumn_ = NULL;
42 ownobj=true;
43}
44FITS_XNTuple::~FITS_XNTuple()
45{
46 if (dcolumn_ != NULL) delete [] dcolumn_;
47 if (fcolumn_ != NULL) delete [] fcolumn_;
48 if (icolumn_ != NULL) delete [] icolumn_;
49 if (ccolumn_ != NULL)
50 {
51 if (dobj_ != NULL)
52 {
53 for (int k=0; k<dobj_->NEntry(); k++) delete [] ccolumn_[k];
54 delete [] ccolumn_;
55 }
56 else
57 {
58 cout << "FITS_XNTuple, destructeur: bizarre, ccolumn non vide, sans objet?" << endl;; }
59 }
60 if (ownobj && dobj_ != NULL) delete dobj_;
61}
62void FITS_XNTuple::Write(char outputfile[], bool OldFile)
63{
64 WriteF(outputfile, OldFile);
65}
66
67void FITS_XNTuple::ReadFromFits(FitsFile& fn)
68{
69 if (!fn.IsFitsTable())
70 {
71 throw PException("ReadFromFits: the fits file seems not to be a bintable nor ASCII table");
72 }
73 int nbcols, nbentries;
74 nbcols = fn.NbColsFromFits();
75 nbentries = 0;
76 int k;
77 for (k=0; k<nbcols; k++) nbentries=max( nbentries, fn.NentriesFromFits(k) );
78
79 //
80 // pour mettre les colonnes dans l'ordre double, float, int, char :
81 // tableau de correspondance
82 // DfitsCol(j)= numero dans le fichier fits de la jeme variable double du
83 // xntuple;
84 // FfitsCol(j)= numero dans le fichier fits de la jeme variable float du
85 // xntuple;
86 // etc.
87 vector<int> DfitsCol;
88 vector<int> FfitsCol;
89 vector<int> IfitsCol;
90 vector<int> SfitsCol;
91 for (k=0; k<nbcols;k++)
92 {
93 char ss= fn.ColTypeFromFits(k);
94 if (ss == 'D') DfitsCol.push_back(k);
95 else if (ss == 'E') FfitsCol.push_back(k);
96 else if (ss == 'I') IfitsCol.push_back(k);
97 else if (ss == 'S') SfitsCol.push_back(k);
98 else {
99 cout << " FITS_XNTuple: colonne fits " << k << " type= " << ss << endl;
100 throw IOExc("type de champ inconnu");
101 }
102 }
103 char ** ColName = new char*[nbcols];
104 int compt=0;
105 for (k=0; k<DfitsCol.size(); k++)
106 {
107 ColName[compt] = new char[LONNOM+1];
108 strncpy(ColName[compt], fn.ColNameFromFits(DfitsCol[k]).c_str(), LONNOM);
109 ColName[compt++][ LONNOM] = '\0';
110 }
111 for (k=0; k<FfitsCol.size(); k++)
112 {
113 ColName[compt] = new char[LONNOM+1];
114 strncpy(ColName[compt], fn.ColNameFromFits(FfitsCol[k]).c_str(), LONNOM);
115 ColName[compt++][ LONNOM] = '\0';
116 }
117 for (k=0; k<IfitsCol.size(); k++)
118 {
119 ColName[compt] = new char[LONNOM+1];
120 strncpy(ColName[compt], fn.ColNameFromFits(IfitsCol[k]).c_str(), LONNOM);
121 ColName[compt++][ LONNOM] = '\0';
122 }
123 for (k=0; k<SfitsCol.size(); k++)
124 {
125 ColName[compt] = new char[LONNOM+1];
126 strncpy(ColName[compt], fn.ColNameFromFits(SfitsCol[k]).c_str(), LONNOM);
127 ColName[compt++][LONNOM] = '\0';
128 }
129
130
131 if(dobj_ == NULL)
132 {
133 dobj_= new XNTuple(DfitsCol.size(), FfitsCol.size(), IfitsCol.size(), SfitsCol.size(),ColName);
134 ownobj= true;
135 }
136 else
137 {
138 dobj_->clean();
139 (*dobj_)= XNTuple(DfitsCol.size(), FfitsCol.size(), IfitsCol.size(), SfitsCol.size(),ColName);
140 }
141 for (k=0; k<nbcols;k++)
142 {
143 delete [] ColName[k];
144 }
145 delete [] ColName;
146
147 // j'initialise le NTuple a zero, pour le dimensionner
148 // (SetXVal suppose que le ntuple est deja dimensionne)
149 r_8* dligne;
150 r_4* fligne;
151 int_4* iligne;
152 char** cligne;
153 if (DfitsCol.size()>0)
154 {
155 if (dcolumn_ != NULL) delete [] dcolumn_;
156 dcolumn_ = new double[nbentries];
157 dligne = new r_8[DfitsCol.size()];
158 for (k=0; k<DfitsCol.size(); k++) dligne[k]=0.;
159 }
160 else dligne=NULL;
161 if (FfitsCol.size()>0)
162 {
163 if (fcolumn_ != NULL) delete [] fcolumn_;
164 fcolumn_ = new float[nbentries];
165 fligne = new r_4[FfitsCol.size()];
166 for (k=0; k<FfitsCol.size(); k++) fligne[k]=0.;
167 }
168 else fligne=NULL;
169 if (IfitsCol.size()>0)
170 {
171 if (icolumn_ != NULL) delete [] icolumn_;
172 icolumn_ = new int[nbentries];
173 iligne = new int_4[IfitsCol.size()];
174 for (k=0; k<IfitsCol.size(); k++) iligne[k]=0;
175 }
176 else iligne=NULL;
177 if (SfitsCol.size()>0)
178 {
179 if (ccolumn_ != NULL)
180 {
181 for (k=0; k<dobj_->NEntry(); k++) delete [] ccolumn_[k];
182 delete [] ccolumn_;
183 ccolumn_ = NULL;
184 }
185 ccolumn_ = new char*[nbentries];
186 int taille_des_chaines=0;
187 for (k=0; k< SfitsCol.size(); k++) taille_des_chaines = max( taille_des_chaines, fn.ColStringLengthFromFits(SfitsCol[k]) );
188 for (k=0; k<nbentries;k++) ccolumn_[k]= new char[taille_des_chaines+1];
189 cligne = new char*[SfitsCol.size()];
190 for (k=0; k<SfitsCol.size(); k++) cligne[k]=" ";
191 }
192 else cligne=NULL;
193
194 for (k=0; k<nbentries;k++) dobj_->Fill(dligne, fligne, iligne, cligne);
195 delete [] dligne;
196 delete [] fligne;
197 delete [] iligne;
198 for (k=0; k< SfitsCol.size(); k++) delete [] cligne[k];
199 delete [] cligne;
200
201 compt=0;
202 for (k=0; k<DfitsCol.size(); k++)
203 {
204 fn.GetBinTabFCol(dcolumn_, nbentries, DfitsCol[k]);
205 for (int nent=0; nent<nbentries; nent++) dobj_->SetDVal(nent,compt, dcolumn_[nent]);
206 compt++;
207 }
208
209 for (k=0; k<FfitsCol.size(); k++)
210 {
211 fn.GetBinTabFCol(fcolumn_,nbentries, FfitsCol[k]);
212 for (int nent=0; nent<nbentries; nent++) dobj_->SetFVal(nent,compt, fcolumn_[nent]);
213 compt++;
214 }
215
216 for (k=0; k<IfitsCol.size(); k++)
217 {
218 fn.GetBinTabFCol(icolumn_,nbentries, IfitsCol[k]);
219 for (int nent=0; nent<nbentries; nent++) dobj_->SetIVal(nent,compt, icolumn_[nent]);
220 compt++;
221 }
222
223 for (k=0; k<SfitsCol.size(); k++)
224 {
225 fn.GetBinTabFCol(ccolumn_,nbentries, SfitsCol[k]);
226 for (int nent=0; nent<nbentries; nent++) dobj_->SetSVal(nent,compt, ccolumn_[nent]);
227 compt++;
228 }
229 dobj_->Info()=fn.DVListFromFits();
230
231}
232void FITS_XNTuple::WriteToFits(FitsFile& fn)
233{
234 if(dobj_ == NULL)
235 {
236 cout << " WriteToFits:: dobj_= null " << endl;
237 return;
238 }
239
240 // table will have 'ncols' columns
241 int ncols = dobj_->NVar();
242 // table will have 'nrows' rows
243 int nrows = dobj_->NEntry();
244 // get names and values from the join DVList object
245 DVList dvl= dobj_->Info();
246 // extension name
247 char* extname = "XNTuple_Binary_tbl";
248 dvl.Print();
249 char** Noms = new char*[ncols];
250 int k;
251 for (k=0; k< ncols; k++)
252 {
253 Noms[k]= new char[LONNOM+1];
254 strncpy(Noms[k],dobj_->NomIndex(k).c_str(),LONNOM+1);
255 }
256 char* types=new char[ncols+1];
257 int compt=0;
258 for (k=0; k<dobj_->NDVar();k++)
259 {
260 types[compt++]='D';
261 }
262 for (k=0; k<dobj_->NFVar();k++)
263 {
264 types[compt++]='E';
265 }
266 for (k=0; k<dobj_->NIVar();k++)
267 {
268 types[compt++]='I';
269 }
270 for (k=0; k<dobj_->NSVar();k++)
271 {
272 types[compt++]='A';
273 }
274 types[ncols]='\0';
275 vector<int> StringSizes(dobj_->NSVar());
276 for (k=0; k< StringSizes.size(); k++) StringSizes[k]=dobj_->mStrSz;
277 // la librairie fitsio ecrit colonne par colonne
278 fn.makeHeaderBntblOnFits(types, Noms, nrows, ncols, dvl, extname,StringSizes);
279 for (k=0; k< ncols; k++)
280 {
281 delete [] Noms[k];
282 }
283 delete [] Noms;
284 delete [] types;
285 compt=0;
286 for (k=0; k<dobj_->NDVar();k++)
287 {
288 putColToFits(compt, dobj_->NEntry(), getColDFromObj(compt));
289 compt++;
290 }
291 for (k=0; k<dobj_->NFVar();k++)
292 {
293 putColToFits(compt, dobj_->NEntry(), getColFFromObj(compt));
294 compt++;
295 }
296 for (k=0; k<dobj_->NIVar();k++)
297 {
298 putColToFits(compt, dobj_->NEntry(), getColIFromObj(compt));
299 compt++;
300 }
301 for (k=0; k<dobj_->NSVar();k++)
302 {
303 putColToFits(compt, dobj_->NEntry(), getColSFromObj(compt));
304 compt++;
305 }
306}
307double* FITS_XNTuple::getColDFromObj(int colNr)
308{
309 if (dcolumn_ != NULL)
310 {
311 delete [] dcolumn_;
312 dcolumn_ = NULL;
313 }
314 dcolumn_ = new double[dobj_->NEntry()];
315 for(int j = 0; j < dobj_->NEntry(); j++) dcolumn_[j]= dobj_->GetDVal(j,colNr);
316 return dcolumn_;
317}
318
319float* FITS_XNTuple::getColFFromObj(int colNr)
320{
321 if (fcolumn_ != NULL)
322 {
323 delete [] fcolumn_;
324 fcolumn_ = NULL;
325 }
326 fcolumn_ = new float[dobj_->NEntry()];
327 for(int j = 0; j < dobj_->NEntry(); j++) fcolumn_[j]= dobj_->GetFVal(j,colNr);
328 return fcolumn_;
329}
330
331int* FITS_XNTuple::getColIFromObj(int colNr)
332{
333 if (icolumn_ != NULL)
334 {
335 delete [] icolumn_;
336 icolumn_ = NULL;
337 }
338 icolumn_ = new int[dobj_->NEntry()];
339 for(int j = 0; j < dobj_->NEntry(); j++) icolumn_[j]= dobj_->GetIVal(j,colNr);
340 return icolumn_;
341}
342char** FITS_XNTuple::getColSFromObj(int colNr)
343{
344 if (ccolumn_ != NULL)
345 {
346 for (int k=0; k<dobj_->NEntry(); k++) delete [] ccolumn_[k];
347 delete [] ccolumn_;
348 ccolumn_ = NULL;
349 }
350 ccolumn_ = new char*[dobj_->NEntry()];
351 for(int j = 0; j < dobj_->NEntry(); j++)
352 {
353 string s= dobj_->GetSVal(j,colNr);
354 ccolumn_[j] = new char[dobj_->mStrSz+1];
355 strcpy(ccolumn_[j],s.c_str());
356 }
357 return ccolumn_;
358}
Note: See TracBrowser for help on using the repository browser.