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

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

modifs pour introduction lecteur de fits par lignes

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