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
RevLine 
[860]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;
[1047]15 InitNull();
16 ownobj_ = true;
[860]17}
18
19FITS_XNTuple::FITS_XNTuple(char inputfile[],int hdunum)
20{
21 dobj_ = new XNTuple;
[1047]22 InitNull();
23 ownobj_ = true;
[860]24
25 ReadF(inputfile,hdunum);
26}
27
28
29FITS_XNTuple::FITS_XNTuple(const XNTuple & obj)
30{
31 dobj_ = new XNTuple(obj);
[1047]32 InitNull();
33 ownobj_ = true;
[860]34}
[1047]35FITS_XNTuple::FITS_XNTuple(XNTuple* obj)
36{
37 dobj_ = obj;
38 InitNull();
39 ownobj_ = false;
40}
[860]41FITS_XNTuple::~FITS_XNTuple()
42{
[1047]43 Clean();
44}
45
46void FITS_XNTuple::Clean()
47{
[860]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 }
[1047]62 if (ownobj_ && dobj_ != NULL) delete dobj_;
[860]63}
[1047]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
[972]79void FITS_XNTuple::Write(char outputfile[], bool OldFile)
[860]80{
[972]81 WriteF(outputfile, OldFile);
[860]82}
83
[1047]84void FITS_XNTuple::ReadFromFits()
[860]85{
[1047]86 // if (!fn.IsFitsTable())
87 if (!IsFitsTable())
[860]88 {
89 throw PException("ReadFromFits: the fits file seems not to be a bintable nor ASCII table");
90 }
91 int nbcols, nbentries;
[1047]92 // nbcols = fn.NbColsFromFits();
93 nbcols = NbColsFromFits();
[860]94 nbentries = 0;
[923]95 int k;
[1047]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) );
[860]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;
[923]111 for (k=0; k<nbcols;k++)
[860]112 {
[1047]113 // char ss= fn.ColTypeFromFits(k);
114 char ss= ColTypeFromFits(k);
[860]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;
[923]126 for (k=0; k<DfitsCol.size(); k++)
[860]127 {
128 ColName[compt] = new char[LONNOM+1];
[1047]129 // strncpy(ColName[compt], fn.ColNameFromFits(DfitsCol[k]).c_str(), LONNOM);
130 strncpy(ColName[compt], ColNameFromFits(DfitsCol[k]).c_str(), LONNOM);
[860]131 ColName[compt++][ LONNOM] = '\0';
132 }
[923]133 for (k=0; k<FfitsCol.size(); k++)
[860]134 {
135 ColName[compt] = new char[LONNOM+1];
[1047]136 // strncpy(ColName[compt], fn.ColNameFromFits(FfitsCol[k]).c_str(), LONNOM);
137 strncpy(ColName[compt], ColNameFromFits(FfitsCol[k]).c_str(), LONNOM);
[860]138 ColName[compt++][ LONNOM] = '\0';
139 }
[923]140 for (k=0; k<IfitsCol.size(); k++)
[860]141 {
142 ColName[compt] = new char[LONNOM+1];
[1047]143 // strncpy(ColName[compt], fn.ColNameFromFits(IfitsCol[k]).c_str(), LONNOM);
144 strncpy(ColName[compt], ColNameFromFits(IfitsCol[k]).c_str(), LONNOM);
[860]145 ColName[compt++][ LONNOM] = '\0';
146 }
[923]147 for (k=0; k<SfitsCol.size(); k++)
[860]148 {
149 ColName[compt] = new char[LONNOM+1];
[1047]150 // strncpy(ColName[compt], fn.ColNameFromFits(SfitsCol[k]).c_str(), LONNOM);
151 strncpy(ColName[compt], ColNameFromFits(SfitsCol[k]).c_str(), LONNOM);
[860]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);
[1047]158 ownobj_ = true;
[860]159 }
160 else
161 {
[1047]162 if (ownobj_)
163 {
[860]164 (*dobj_)= XNTuple(DfitsCol.size(), FfitsCol.size(), IfitsCol.size(), SfitsCol.size(),ColName);
[1047]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 }
[860]172 }
[1047]173
[923]174 for (k=0; k<nbcols;k++)
[860]175 {
176 delete [] ColName[k];
177 }
178 delete [] ColName;
179
[1047]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()];
[860]186 else dligne=NULL;
[1047]187 if (FfitsCol.size()>0) fligne = new r_4[FfitsCol.size()];
[860]188 else fligne=NULL;
[1047]189 if (IfitsCol.size()>0) iligne = new int_4[IfitsCol.size()];
[860]190 else iligne=NULL;
191 if (SfitsCol.size()>0)
192 {
[1047]193 cligne = new char*[SfitsCol.size()];
[860]194 int taille_des_chaines=0;
[1047]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];
[860]198 }
199 else cligne=NULL;
[1047]200 int firstln, lastln;
201 if (numberOfLinesToBeRead_ > 0)
[860]202 {
[1047]203 firstln = fistLineToBeRead_;
204 lastln = firstln + numberOfLinesToBeRead_;
[860]205 }
[1047]206 else
[860]207 {
[1047]208 firstln = 0;
209 lastln = nbentries;
[860]210 }
[1047]211 int numLigne;
212 for (numLigne=firstln; numLigne < lastln; numLigne++)
[860]213 {
[1047]214 // fn.GetBinTabLine(numLigne, dligne, fligne, iligne, cligne );
215 GetBinTabLine(numLigne, dligne, fligne, iligne, cligne );
216 dobj_->Fill(dligne, fligne, iligne, cligne);
[860]217 }
[1047]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();
[860]225
226}
[1047]227void FITS_XNTuple::WriteToFits()
[860]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];
[923]245 int k;
246 for (k=0; k< ncols; k++)
[860]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;
[923]253 for (k=0; k<dobj_->NDVar();k++)
[860]254 {
255 types[compt++]='D';
256 }
[923]257 for (k=0; k<dobj_->NFVar();k++)
[860]258 {
259 types[compt++]='E';
260 }
[923]261 for (k=0; k<dobj_->NIVar();k++)
[860]262 {
263 types[compt++]='I';
264 }
[923]265 for (k=0; k<dobj_->NSVar();k++)
[860]266 {
267 types[compt++]='A';
268 }
269 types[ncols]='\0';
270 vector<int> StringSizes(dobj_->NSVar());
[923]271 for (k=0; k< StringSizes.size(); k++) StringSizes[k]=dobj_->mStrSz;
[860]272 // la librairie fitsio ecrit colonne par colonne
[1047]273 // fn.makeHeaderBntblOnFits(types, Noms, nrows, ncols, dvl, extname,StringSizes);
274 makeHeaderBntblOnFits(types, Noms, nrows, ncols, dvl, extname,StringSizes);
[923]275 for (k=0; k< ncols; k++)
[860]276 {
277 delete [] Noms[k];
278 }
279 delete [] Noms;
280 delete [] types;
281 compt=0;
[923]282 for (k=0; k<dobj_->NDVar();k++)
[860]283 {
284 putColToFits(compt, dobj_->NEntry(), getColDFromObj(compt));
285 compt++;
286 }
[923]287 for (k=0; k<dobj_->NFVar();k++)
[860]288 {
289 putColToFits(compt, dobj_->NEntry(), getColFFromObj(compt));
290 compt++;
291 }
[923]292 for (k=0; k<dobj_->NIVar();k++)
[860]293 {
294 putColToFits(compt, dobj_->NEntry(), getColIFromObj(compt));
295 compt++;
296 }
[923]297 for (k=0; k<dobj_->NSVar();k++)
[860]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.