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

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

normalisation des DVList

File size: 7.5 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
[1136]25 Read(inputfile,hdunum);
[860]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 if (ownobj_ && dobj_ != NULL) delete dobj_;
[860]44}
[1047]45
46
47void FITS_XNTuple::ReadLines(char inputfile[],int firstLine, int numberOfLines,int hdunum)
48{
49 fistLineToBeRead_ = firstLine;
50 numberOfLinesToBeRead_ = numberOfLines;
[1136]51 Read(inputfile,hdunum);
[1047]52}
53
54
[860]55
[1136]56void FITS_XNTuple::ReadFromFits(FitsInFile& is)
[860]57{
[1136]58 if (!is.IsFitsTable())
[860]59 {
60 throw PException("ReadFromFits: the fits file seems not to be a bintable nor ASCII table");
61 }
62 int nbcols, nbentries;
[1136]63 nbcols = is.NbColsFromFits();
[860]64 nbentries = 0;
[923]65 int k;
[1136]66 for (k=0; k<nbcols; k++) nbentries=max( nbentries, is.NentriesFromFits(k) );
[860]67
68 //
69 // pour mettre les colonnes dans l'ordre double, float, int, char :
70 // tableau de correspondance
71 // DfitsCol(j)= numero dans le fichier fits de la jeme variable double du
72 // xntuple;
73 // FfitsCol(j)= numero dans le fichier fits de la jeme variable float du
74 // xntuple;
75 // etc.
76 vector<int> DfitsCol;
77 vector<int> FfitsCol;
78 vector<int> IfitsCol;
79 vector<int> SfitsCol;
[923]80 for (k=0; k<nbcols;k++)
[860]81 {
[1136]82 char ss= is.ColTypeFromFits(k);
[860]83 if (ss == 'D') DfitsCol.push_back(k);
84 else if (ss == 'E') FfitsCol.push_back(k);
85 else if (ss == 'I') IfitsCol.push_back(k);
86 else if (ss == 'S') SfitsCol.push_back(k);
87 else {
88 cout << " FITS_XNTuple: colonne fits " << k << " type= " << ss << endl;
89 throw IOExc("type de champ inconnu");
90 }
91 }
92 char ** ColName = new char*[nbcols];
93 int compt=0;
[923]94 for (k=0; k<DfitsCol.size(); k++)
[860]95 {
96 ColName[compt] = new char[LONNOM+1];
[1136]97 strncpy(ColName[compt], is.ColNameFromFits(DfitsCol[k]).c_str(), LONNOM);
[860]98 ColName[compt++][ LONNOM] = '\0';
99 }
[923]100 for (k=0; k<FfitsCol.size(); k++)
[860]101 {
102 ColName[compt] = new char[LONNOM+1];
[1136]103 strncpy(ColName[compt], is.ColNameFromFits(FfitsCol[k]).c_str(), LONNOM);
[860]104 ColName[compt++][ LONNOM] = '\0';
105 }
[923]106 for (k=0; k<IfitsCol.size(); k++)
[860]107 {
108 ColName[compt] = new char[LONNOM+1];
[1136]109 strncpy(ColName[compt], is.ColNameFromFits(IfitsCol[k]).c_str(), LONNOM);
[860]110 ColName[compt++][ LONNOM] = '\0';
111 }
[923]112 for (k=0; k<SfitsCol.size(); k++)
[860]113 {
114 ColName[compt] = new char[LONNOM+1];
[1136]115 strncpy(ColName[compt], is.ColNameFromFits(SfitsCol[k]).c_str(), LONNOM);
[860]116 ColName[compt++][LONNOM] = '\0';
117 }
118
119 if(dobj_ == NULL)
120 {
121 dobj_= new XNTuple(DfitsCol.size(), FfitsCol.size(), IfitsCol.size(), SfitsCol.size(),ColName);
[1047]122 ownobj_ = true;
[860]123 }
124 else
125 {
[1047]126 if (ownobj_)
127 {
[860]128 (*dobj_)= XNTuple(DfitsCol.size(), FfitsCol.size(), IfitsCol.size(), SfitsCol.size(),ColName);
[1047]129 }
130 else
131 {
132 if (DfitsCol.size() != dobj_->NDVar() || FfitsCol.size() != dobj_->NFVar() || IfitsCol.size() != dobj_->NIVar() || SfitsCol.size() != dobj_->NSVar())
133
134 throw SzMismatchError("FITS_XNTuple : structure incorrecte du ntuple");
135 }
[860]136 }
[1047]137
[923]138 for (k=0; k<nbcols;k++)
[860]139 {
140 delete [] ColName[k];
141 }
142 delete [] ColName;
143
[1143]144 double* dligne;
145 float* fligne;
146 int* iligne;
[1047]147 char** cligne;
148
[1143]149 if (DfitsCol.size()>0) dligne = new double[DfitsCol.size()];
[860]150 else dligne=NULL;
[1143]151 if (FfitsCol.size()>0) fligne = new float[FfitsCol.size()];
[860]152 else fligne=NULL;
[1143]153 if (IfitsCol.size()>0) iligne = new int[IfitsCol.size()];
[860]154 else iligne=NULL;
155 if (SfitsCol.size()>0)
156 {
[1047]157 cligne = new char*[SfitsCol.size()];
[860]158 int taille_des_chaines=0;
[1136]159 for (k=0; k< SfitsCol.size(); k++) taille_des_chaines = max( taille_des_chaines, is.ColStringLengthFromFits(SfitsCol[k]) );
[1047]160 for (k=0; k<SfitsCol.size(); k++) cligne[k]=new char[taille_des_chaines+1];
[860]161 }
162 else cligne=NULL;
[1047]163 int firstln, lastln;
164 if (numberOfLinesToBeRead_ > 0)
[860]165 {
[1047]166 firstln = fistLineToBeRead_;
167 lastln = firstln + numberOfLinesToBeRead_;
[860]168 }
[1047]169 else
[860]170 {
[1047]171 firstln = 0;
172 lastln = nbentries;
[860]173 }
[1047]174 int numLigne;
175 for (numLigne=firstln; numLigne < lastln; numLigne++)
[860]176 {
[1136]177 is.GetBinTabLine(numLigne, dligne, fligne, iligne, cligne );
[1143]178 dobj_->Fill((r_8*)dligne, (r_4*)fligne, (int_4*)iligne, cligne);
[860]179 }
[1047]180 delete [] dligne;
181 delete [] fligne;
182 delete [] iligne;
183 for (k=0; k< SfitsCol.size(); k++) delete [] cligne[k];
184 delete [] cligne;
[1136]185 dobj_->Info()=is.DVListFromFits();
[860]186
187}
[1136]188void FITS_XNTuple::WriteToFits(FitsOutFile& os)
[860]189{
190 if(dobj_ == NULL)
191 {
192 cout << " WriteToFits:: dobj_= null " << endl;
193 return;
194 }
195
196 // table will have 'ncols' columns
197 int ncols = dobj_->NVar();
198 // table will have 'nrows' rows
199 int nrows = dobj_->NEntry();
200 // get names and values from the join DVList object
201 DVList dvl= dobj_->Info();
202 // extension name
203 char* extname = "XNTuple_Binary_tbl";
204 char** Noms = new char*[ncols];
[923]205 int k;
206 for (k=0; k< ncols; k++)
[860]207 {
208 Noms[k]= new char[LONNOM+1];
209 strncpy(Noms[k],dobj_->NomIndex(k).c_str(),LONNOM+1);
210 }
211 char* types=new char[ncols+1];
212 int compt=0;
[923]213 for (k=0; k<dobj_->NDVar();k++)
[860]214 {
215 types[compt++]='D';
216 }
[923]217 for (k=0; k<dobj_->NFVar();k++)
[860]218 {
219 types[compt++]='E';
220 }
[923]221 for (k=0; k<dobj_->NIVar();k++)
[860]222 {
223 types[compt++]='I';
224 }
[923]225 for (k=0; k<dobj_->NSVar();k++)
[860]226 {
227 types[compt++]='A';
228 }
229 types[ncols]='\0';
230 vector<int> StringSizes(dobj_->NSVar());
[923]231 for (k=0; k< StringSizes.size(); k++) StringSizes[k]=dobj_->mStrSz;
[1136]232 os.makeHeaderBntblOnFits(types, Noms, nrows, ncols, dvl, extname,StringSizes);
[923]233 for (k=0; k< ncols; k++)
[860]234 {
235 delete [] Noms[k];
236 }
237 delete [] Noms;
238 delete [] types;
[1136]239
240
[860]241 compt=0;
[1136]242 if (dobj_->NDVar() > 0)
243 {
244 double* dcolumn = new double[nrows];
245 for (k=0; k<dobj_->NDVar();k++)
246 {
247 for(int j = 0; j < nrows; j++) dcolumn[j]= dobj_->GetDVal(j,compt);
248 os.putColToFits(compt, nrows, dcolumn);
249 compt++;
250 }
251 delete [] dcolumn;
252 }
[860]253
[1136]254 if (dobj_->NFVar() > 0)
255 {
256 float* fcolumn = new float[nrows];
257 for (k=0; k<dobj_->NFVar();k++)
258 {
259 for(int j = 0; j < nrows; j++) fcolumn[j]= dobj_->GetFVal(j,compt);
260 os.putColToFits(compt, nrows, fcolumn);
261 compt++;
262 }
263 delete [] fcolumn;
264 }
265
266 if (dobj_->NIVar() > 0)
267 {
268 int* icolumn = new int[nrows];
269 for (k=0; k<dobj_->NIVar();k++)
270 {
271 for(int j = 0; j < nrows; j++) icolumn[j]= dobj_->GetIVal(j,compt);
272 os.putColToFits(compt, nrows, icolumn);
273 compt++;
274 }
275 delete [] icolumn;
276 }
277
278 if (dobj_->NSVar() > 0)
279 {
280 char** ccolumn = new char*[nrows];
281 for (k=0; k<dobj_->NSVar();k++)
282 {
283 int j;
284 for(j = 0; j < nrows; j++)
285 {
286 string s= dobj_->GetSVal(j,compt);
287 ccolumn[j] = new char[dobj_->mStrSz+1];
288 strcpy(ccolumn[j],s.c_str());
289 }
290 os.putColToFits(compt, nrows, ccolumn);
291 compt++;
292 for(j = 0; j < nrows; j++)
293 {
294 delete [] ccolumn[j];
295 ccolumn[j] = NULL;
296 }
297 }
298 delete [] ccolumn;
299 }
[860]300}
Note: See TracBrowser for help on using the repository browser.