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

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

impressions inutiles

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