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

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

changement de char* en string

File size: 7.2 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
[1194]203 string extname("XNTuple_Binary_tbl");
204 vector<string> Noms(ncols);
[923]205 int k;
206 for (k=0; k< ncols; k++)
[860]207 {
[1194]208 Noms[k] = dobj_->NomIndex(k) ;
[860]209 }
[1194]210 string types;
[923]211 for (k=0; k<dobj_->NDVar();k++)
[860]212 {
[1194]213 types+='D';
[860]214 }
[923]215 for (k=0; k<dobj_->NFVar();k++)
[860]216 {
[1194]217 types+='E';
[860]218 }
[923]219 for (k=0; k<dobj_->NIVar();k++)
[860]220 {
[1194]221 types+='I';
[860]222 }
[923]223 for (k=0; k<dobj_->NSVar();k++)
[860]224 {
[1194]225 types+='A';
[860]226 }
227 vector<int> StringSizes(dobj_->NSVar());
[923]228 for (k=0; k< StringSizes.size(); k++) StringSizes[k]=dobj_->mStrSz;
[1136]229 os.makeHeaderBntblOnFits(types, Noms, nrows, ncols, dvl, extname,StringSizes);
230
[1194]231 int compt=0;
[1136]232 if (dobj_->NDVar() > 0)
233 {
234 double* dcolumn = new double[nrows];
235 for (k=0; k<dobj_->NDVar();k++)
236 {
237 for(int j = 0; j < nrows; j++) dcolumn[j]= dobj_->GetDVal(j,compt);
238 os.putColToFits(compt, nrows, dcolumn);
239 compt++;
240 }
241 delete [] dcolumn;
242 }
[860]243
[1136]244 if (dobj_->NFVar() > 0)
245 {
246 float* fcolumn = new float[nrows];
247 for (k=0; k<dobj_->NFVar();k++)
248 {
249 for(int j = 0; j < nrows; j++) fcolumn[j]= dobj_->GetFVal(j,compt);
250 os.putColToFits(compt, nrows, fcolumn);
251 compt++;
252 }
253 delete [] fcolumn;
254 }
255
256 if (dobj_->NIVar() > 0)
257 {
258 int* icolumn = new int[nrows];
259 for (k=0; k<dobj_->NIVar();k++)
260 {
261 for(int j = 0; j < nrows; j++) icolumn[j]= dobj_->GetIVal(j,compt);
262 os.putColToFits(compt, nrows, icolumn);
263 compt++;
264 }
265 delete [] icolumn;
266 }
267
268 if (dobj_->NSVar() > 0)
269 {
270 char** ccolumn = new char*[nrows];
271 for (k=0; k<dobj_->NSVar();k++)
272 {
273 int j;
274 for(j = 0; j < nrows; j++)
275 {
276 string s= dobj_->GetSVal(j,compt);
277 ccolumn[j] = new char[dobj_->mStrSz+1];
278 strcpy(ccolumn[j],s.c_str());
279 }
280 os.putColToFits(compt, nrows, ccolumn);
281 compt++;
282 for(j = 0; j < nrows; j++)
283 {
284 delete [] ccolumn[j];
285 ccolumn[j] = NULL;
286 }
[1194]287
[1136]288 }
289 delete [] ccolumn;
290 }
[860]291}
Note: See TracBrowser for help on using the repository browser.