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
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 string extname("XNTuple_Binary_tbl");
204 vector<string> Noms(ncols);
205 int k;
206 for (k=0; k< ncols; k++)
207 {
208 Noms[k] = dobj_->NomIndex(k) ;
209 }
210 string types;
211 for (k=0; k<dobj_->NDVar();k++)
212 {
213 types+='D';
214 }
215 for (k=0; k<dobj_->NFVar();k++)
216 {
217 types+='E';
218 }
219 for (k=0; k<dobj_->NIVar();k++)
220 {
221 types+='I';
222 }
223 for (k=0; k<dobj_->NSVar();k++)
224 {
225 types+='A';
226 }
227 vector<int> StringSizes(dobj_->NSVar());
228 for (k=0; k< StringSizes.size(); k++) StringSizes[k]=dobj_->mStrSz;
229 os.makeHeaderBntblOnFits(types, Noms, nrows, ncols, dvl, extname,StringSizes);
230
231 int compt=0;
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 }
243
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 }
287
288 }
289 delete [] ccolumn;
290 }
291}
Note: See TracBrowser for help on using the repository browser.