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
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 char ss= is.ColTypeFromFits(k);
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;
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 throw SzMismatchError("FITS_XNTuple : structure incorrecte du ntuple");
135 }
136 }
137
138 for (k=0; k<nbcols;k++)
139 {
140 delete [] ColName[k];
141 }
142 delete [] ColName;
143
144 double* dligne;
145 float* fligne;
146 int* iligne;
147 char** cligne;
148
149 if (DfitsCol.size()>0) dligne = new double[DfitsCol.size()];
150 else dligne=NULL;
151 if (FfitsCol.size()>0) fligne = new float[FfitsCol.size()];
152 else fligne=NULL;
153 if (IfitsCol.size()>0) iligne = new int[IfitsCol.size()];
154 else iligne=NULL;
155 if (SfitsCol.size()>0)
156 {
157 cligne = new char*[SfitsCol.size()];
158 int taille_des_chaines=0;
159 for (k=0; k< SfitsCol.size(); k++) taille_des_chaines = max( taille_des_chaines, is.ColStringLengthFromFits(SfitsCol[k]) );
160 for (k=0; k<SfitsCol.size(); k++) cligne[k]=new char[taille_des_chaines+1];
161 }
162 else cligne=NULL;
163 int firstln, lastln;
164 if (numberOfLinesToBeRead_ > 0)
165 {
166 firstln = fistLineToBeRead_;
167 lastln = firstln + numberOfLinesToBeRead_;
168 }
169 else
170 {
171 firstln = 0;
172 lastln = nbentries;
173 }
174 int numLigne;
175 for (numLigne=firstln; numLigne < lastln; numLigne++)
176 {
177 is.GetBinTabLine(numLigne, dligne, fligne, iligne, cligne );
178 dobj_->Fill((r_8*)dligne, (r_4*)fligne, (int_4*)iligne, cligne);
179 }
180 delete [] dligne;
181 delete [] fligne;
182 delete [] iligne;
183 for (k=0; k< SfitsCol.size(); k++) delete [] cligne[k];
184 delete [] cligne;
185 dobj_->Info()=is.DVListFromFits();
186
187}
188void FITS_XNTuple::WriteToFits(FitsOutFile& os)
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];
205 int k;
206 for (k=0; k< ncols; k++)
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;
213 for (k=0; k<dobj_->NDVar();k++)
214 {
215 types[compt++]='D';
216 }
217 for (k=0; k<dobj_->NFVar();k++)
218 {
219 types[compt++]='E';
220 }
221 for (k=0; k<dobj_->NIVar();k++)
222 {
223 types[compt++]='I';
224 }
225 for (k=0; k<dobj_->NSVar();k++)
226 {
227 types[compt++]='A';
228 }
229 types[ncols]='\0';
230 vector<int> StringSizes(dobj_->NSVar());
231 for (k=0; k< StringSizes.size(); k++) StringSizes[k]=dobj_->mStrSz;
232 os.makeHeaderBntblOnFits(types, Noms, nrows, ncols, dvl, extname,StringSizes);
233 for (k=0; k< ncols; k++)
234 {
235 delete [] Noms[k];
236 }
237 delete [] Noms;
238 delete [] types;
239
240
241 compt=0;
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 }
253
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 }
300}
Note: See TracBrowser for help on using the repository browser.