source: Sophya/trunk/SophyaExt/FitsIOServer/fitsxntuple.cc@ 863

Last change on this file since 863 was 860, checked in by ansari, 25 years ago

I/O sur fichier fits

File size: 10.7 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[],int hdunum)
63{
64 WriteF(outputfile, hdunum);
65}
66
67void FITS_XNTuple::ReadFromFits(const 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 cout << " nbcols= " << nbcols << endl;
76 nbentries = 0;
77 for (int k=0; k<nbcols; k++) nbentries=max( nbentries, fn.NentriesFromFits(k) );
78 cout << " nbentries= " << nbentries << endl;
79
80 //
81 // pour mettre les colonnes dans l'ordre double, float, int, char :
82 // tableau de correspondance
83 // DfitsCol(j)= numero dans le fichier fits de la jeme variable double du
84 // xntuple;
85 // FfitsCol(j)= numero dans le fichier fits de la jeme variable float du
86 // xntuple;
87 // etc.
88 vector<int> DfitsCol;
89 vector<int> FfitsCol;
90 vector<int> IfitsCol;
91 vector<int> SfitsCol;
92 for (int k=0; k<nbcols;k++)
93 {
94 char ss= fn.ColTypeFromFits(k);
95 if (ss == 'D') DfitsCol.push_back(k);
96 else if (ss == 'E') FfitsCol.push_back(k);
97 else if (ss == 'I') IfitsCol.push_back(k);
98 else if (ss == 'S') SfitsCol.push_back(k);
99 else {
100 cout << " FITS_XNTuple: colonne fits " << k << " type= " << ss << endl;
101 throw IOExc("type de champ inconnu");
102 }
103 }
104 char ** ColName = new char*[nbcols];
105 int compt=0;
106 for (int k=0; k<DfitsCol.size(); k++)
107 {
108 ColName[compt] = new char[LONNOM+1];
109 strncpy(ColName[compt], fn.ColNameFromFits(DfitsCol[k]).c_str(), LONNOM);
110 ColName[compt++][ LONNOM] = '\0';
111 }
112 for (int k=0; k<FfitsCol.size(); k++)
113 {
114 ColName[compt] = new char[LONNOM+1];
115 strncpy(ColName[compt], fn.ColNameFromFits(FfitsCol[k]).c_str(), LONNOM);
116 ColName[compt++][ LONNOM] = '\0';
117 }
118 for (int k=0; k<IfitsCol.size(); k++)
119 {
120 ColName[compt] = new char[LONNOM+1];
121 strncpy(ColName[compt], fn.ColNameFromFits(IfitsCol[k]).c_str(), LONNOM);
122 ColName[compt++][ LONNOM] = '\0';
123 }
124 for (int k=0; k<SfitsCol.size(); k++)
125 {
126 ColName[compt] = new char[LONNOM+1];
127 strncpy(ColName[compt], fn.ColNameFromFits(SfitsCol[k]).c_str(), LONNOM);
128 ColName[compt++][LONNOM] = '\0';
129 }
130
131
132 if(dobj_ == NULL)
133 {
134 dobj_= new XNTuple(DfitsCol.size(), FfitsCol.size(), IfitsCol.size(), SfitsCol.size(),ColName);
135 ownobj= true;
136 }
137 else
138 {
139 dobj_->clean();
140 (*dobj_)= XNTuple(DfitsCol.size(), FfitsCol.size(), IfitsCol.size(), SfitsCol.size(),ColName);
141 }
142 for (int k=0; k<nbcols;k++)
143 {
144 delete [] ColName[k];
145 }
146 delete [] ColName;
147
148 // j'initialise le NTuple a zero, pour le dimensionner
149 // (SetXVal suppose que le ntuple est deja dimensionne)
150 cout << " nbcol= " << nbcols << endl;
151 r_8* dligne;
152 r_4* fligne;
153 int_4* iligne;
154 char** cligne;
155 if (DfitsCol.size()>0)
156 {
157 cout << " preparation du tabeau dcolumn" << endl;
158 if (dcolumn_ != NULL) delete [] dcolumn_;
159 dcolumn_ = new double[nbentries];
160 dligne = new r_8[DfitsCol.size()];
161 for (int k=0; k<DfitsCol.size(); k++) dligne[k]=0.;
162 }
163 else dligne=NULL;
164 if (FfitsCol.size()>0)
165 {
166 cout << " preparation du tabeau fcolumn" << endl;
167 if (fcolumn_ != NULL) delete [] fcolumn_;
168 fcolumn_ = new float[nbentries];
169 fligne = new r_4[FfitsCol.size()];
170 for (int k=0; k<FfitsCol.size(); k++) fligne[k]=0.;
171 }
172 else fligne=NULL;
173 if (IfitsCol.size()>0)
174 {
175 cout << " preparation du tabeau icolumn" << endl;
176 if (icolumn_ != NULL) delete [] icolumn_;
177 icolumn_ = new int[nbentries];
178 iligne = new int_4[IfitsCol.size()];
179 for (int k=0; k<IfitsCol.size(); k++) iligne[k]=0;
180 }
181 else iligne=NULL;
182 if (SfitsCol.size()>0)
183 {
184 cout << " preparation du tabeau ccolumn" << endl;
185 if (ccolumn_ != NULL)
186 {
187 for (int k=0; k<dobj_->NEntry(); k++) delete [] ccolumn_[k];
188 delete [] ccolumn_;
189 ccolumn_ = NULL;
190 }
191 ccolumn_ = new char*[nbentries];
192 int taille_des_chaines=0;
193 for (int k=0; k< SfitsCol.size(); k++) taille_des_chaines = max( taille_des_chaines, fn.ColStringLengthFromFits(SfitsCol[k]) );
194 cout << " xntu: je dimensionne a taille_des_chaines= " << taille_des_chaines << endl;
195 for (int k=0; k<nbentries;k++) ccolumn_[k]= new char[taille_des_chaines+1];
196 cligne = new char*[SfitsCol.size()];
197 for (int k=0; k<SfitsCol.size(); k++) cligne[k]=" ";
198 }
199 else cligne=NULL;
200
201 for (int k=0; k<nbentries;k++) dobj_->Fill(dligne, fligne, iligne, cligne);
202 cout << " ntuple initialise a zero" << endl;
203 delete [] dligne;
204 delete [] fligne;
205 delete [] iligne;
206 for (int k=0; k< SfitsCol.size(); k++) delete [] cligne[k];
207 delete [] cligne;
208
209 compt=0;
210 for (int k=0; k<DfitsCol.size(); k++)
211 {
212 fn.GetBinTabFCol(dcolumn_, nbentries, DfitsCol[k]);
213 for (int nent=0; nent<nbentries; nent++) dobj_->SetDVal(nent,compt, dcolumn_[nent]);
214 compt++;
215 }
216
217 for (int k=0; k<FfitsCol.size(); k++)
218 {
219 fn.GetBinTabFCol(fcolumn_,nbentries, FfitsCol[k]);
220 for (int nent=0; nent<nbentries; nent++) dobj_->SetFVal(nent,compt, fcolumn_[nent]);
221 compt++;
222 }
223
224 for (int k=0; k<IfitsCol.size(); k++)
225 {
226 fn.GetBinTabFCol(icolumn_,nbentries, IfitsCol[k]);
227 for (int nent=0; nent<nbentries; nent++) dobj_->SetIVal(nent,compt, icolumn_[nent]);
228 compt++;
229 }
230
231 for (int k=0; k<SfitsCol.size(); k++)
232 {
233 fn.GetBinTabFCol(ccolumn_,nbentries, SfitsCol[k]);
234 cout << " chaine recue par xntuple " << endl;
235 for (int nent=0; nent<nbentries; nent++) dobj_->SetSVal(nent,compt, ccolumn_[nent]);
236 compt++;
237 }
238 cout << " valeurs inserees dans xntuple " << endl;
239 dobj_->Info()=fn.DVListFromFits();
240
241}
242void FITS_XNTuple::WriteToFits(const FitsFile& fn)
243{
244 if(dobj_ == NULL)
245 {
246 cout << " WriteToFits:: dobj_= null " << endl;
247 return;
248 }
249
250 // table will have 'ncols' columns
251 int ncols = dobj_->NVar();
252 // table will have 'nrows' rows
253 int nrows = dobj_->NEntry();
254 // get names and values from the join DVList object
255 DVList dvl= dobj_->Info();
256 // extension name
257 char* extname = "XNTuple_Binary_tbl";
258 dvl.Print();
259 char** Noms = new char*[ncols];
260 for (int k=0; k< ncols; k++)
261 {
262 Noms[k]= new char[LONNOM+1];
263 strncpy(Noms[k],dobj_->NomIndex(k).c_str(),LONNOM+1);
264 cout << " nom entre dans ntuple: " << Noms[k] << endl;
265 }
266 char* types=new char[ncols+1];
267 int compt=0;
268 for (int k=0; k<dobj_->NDVar();k++)
269 {
270 types[compt++]='D';
271 }
272 for (int k=0; k<dobj_->NFVar();k++)
273 {
274 types[compt++]='E';
275 }
276 for (int k=0; k<dobj_->NIVar();k++)
277 {
278 types[compt++]='I';
279 }
280 for (int k=0; k<dobj_->NSVar();k++)
281 {
282 types[compt++]='A';
283 }
284 types[ncols]='\0';
285 vector<int> StringSizes(dobj_->NSVar());
286 for (int k=0; k< StringSizes.size(); k++) StringSizes[k]=dobj_->mStrSz;
287 // la librairie fitsio ecrit colonne par colonne
288 fn.makeHeaderBntblOnFits(types, Noms, nrows, ncols, dvl, extname,StringSizes);
289 for (int k=0; k< ncols; k++)
290 {
291 delete [] Noms[k];
292 }
293 delete [] Noms;
294 delete [] types;
295 compt=0;
296 for (int k=0; k<dobj_->NDVar();k++)
297 {
298 putColToFits(compt, dobj_->NEntry(), getColDFromObj(compt));
299 compt++;
300 }
301 for (int k=0; k<dobj_->NFVar();k++)
302 {
303 putColToFits(compt, dobj_->NEntry(), getColFFromObj(compt));
304 compt++;
305 }
306 for (int k=0; k<dobj_->NIVar();k++)
307 {
308 putColToFits(compt, dobj_->NEntry(), getColIFromObj(compt));
309 compt++;
310 }
311 for (int k=0; k<dobj_->NSVar();k++)
312 {
313 putColToFits(compt, dobj_->NEntry(), getColSFromObj(compt));
314 compt++;
315 }
316 cout << " fin d'ecriture "<< endl;
317}
318/*
319void* FITS_XNTuple::getColFromObj(int colNr)
320{
321 if (colNr < dobj_->NDVar()) return (void*)getColDFromObj(colNr);
322 else
323 if (colNr < dobj_->NDVar()+dobj_->NFVar()) return (void*)getColFFromObj(colNr);
324 else
325 if (colNr < dobj_->NDVar()+dobj_->NFVar()+dobj_->NIVar()) return (void*)getColIFromObj(colNr);
326 else return (void*)getColSFromObj(colNr);
327
328}
329*/
330double* FITS_XNTuple::getColDFromObj(int colNr)
331{
332 if (dcolumn_ != NULL)
333 {
334 delete [] dcolumn_;
335 dcolumn_ = NULL;
336 }
337 dcolumn_ = new double[dobj_->NEntry()];
338 for(int j = 0; j < dobj_->NEntry(); j++) dcolumn_[j]= dobj_->GetDVal(j,colNr);
339 return dcolumn_;
340}
341
342float* FITS_XNTuple::getColFFromObj(int colNr)
343{
344 if (fcolumn_ != NULL)
345 {
346 delete [] fcolumn_;
347 fcolumn_ = NULL;
348 }
349 fcolumn_ = new float[dobj_->NEntry()];
350 for(int j = 0; j < dobj_->NEntry(); j++) fcolumn_[j]= dobj_->GetFVal(j,colNr);
351 return fcolumn_;
352}
353
354int* FITS_XNTuple::getColIFromObj(int colNr)
355{
356 if (icolumn_ != NULL)
357 {
358 delete [] icolumn_;
359 icolumn_ = NULL;
360 }
361 icolumn_ = new int[dobj_->NEntry()];
362 for(int j = 0; j < dobj_->NEntry(); j++) icolumn_[j]= dobj_->GetIVal(j,colNr);
363 return icolumn_;
364}
365char** FITS_XNTuple::getColSFromObj(int colNr)
366{
367 if (ccolumn_ != NULL)
368 {
369 for (int k=0; k<dobj_->NEntry(); k++) delete [] ccolumn_[k];
370 delete [] ccolumn_;
371 ccolumn_ = NULL;
372 }
373 ccolumn_ = new char*[dobj_->NEntry()];
374 for(int j = 0; j < dobj_->NEntry(); j++)
375 {
376 string s= dobj_->GetSVal(j,colNr);
377 ccolumn_[j] = new char[dobj_->mStrSz+1];
378 strcpy(ccolumn_[j],s.c_str());
379 // ccolumn_[j][strlen(ccolumn_[j])-1]='\0';
380 cout << " chaine envoyee xntuple: " << ccolumn_[j] << " longueur " << strlen( ccolumn_[j]) << endl;
381 }
382 return ccolumn_;
383}
Note: See TracBrowser for help on using the repository browser.