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

Last change on this file since 1351 was 1351, checked in by yvon, 25 years ago

les enums dans les flots cout sont castes en (int)

dominique

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