source: Sophya/trunk/SophyaExt/FitsIOServer/fitshdtable.cc@ 2874

Last change on this file since 2874 was 2864, checked in by ansari, 20 years ago

1/ Ajout methode CheckReadability() , retour int pour CheckHandling() ds l'interface FitsHandler et propagation vers handler TArray et DataTable
2/ Correction dans FitsManager et ajout initialiseur de module FitsIOServer (fiosinit.h .cc)
3/ FitsSwapper complete - corrige - full template (suppression de fitsswapper.cc)
4/ MAJ Makefile et objlist.list suite ajout fiosinit.cc et swfitsdtable

Reza , 2 Jan 2006

File size: 9.4 KB
Line 
1#include "machdefs.h"
2#include "sopnamsp.h"
3
4#include <stdio.h>
5#include <string.h>
6#include <iostream>
7#include <typeinfo>
8
9#include "datatable.h"
10#include "fitsblkrw.h"
11#include "fitshandler.h"
12
13// #include "fitshdtable.h"
14
15DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
16int FitsHandler<BaseDataTable>::CheckReadability(FitsInOutFile& is)
17{
18 if (is.CurrentHDUType() == IMAGE_HDU ) return 0;
19 string key = "SOPCLSNM";
20 if (is.KeyValue(key) == "SOPHYA::DataTable") return 2;
21 else return 1;
22}
23
24DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
25void FitsHandler<BaseDataTable>::Write(FitsInOutFile& os)
26{
27
28 if (dobj == NULL)
29 throw NullPtrError("FitsHandler<DataTable>::Write() NULL dobj pointer ");
30
31 DataTable* dt = dynamic_cast< DataTable *> (dobj);
32 if (dt == NULL)
33 throw FitsIOException("FitsHandler<DataTable>::Write() Not a DataTable object");
34
35 int tbltyp = os.GetDef_TableType();
36 string strcoltag;
37 long strwidth = os.GetDef_StrColWidth();
38 if (strwidth < 1) strwidth = 16;
39 char buff[32];
40 if (tbltyp == ASCII_TBL)
41 sprintf(buff, "A%ld",strwidth);
42 else
43 sprintf(buff, "%ldA",strwidth);
44 strcoltag = buff;
45
46 vector<string> colnames, tform, tunit;
47 for(sa_size_t k=0; k<dobj->NVar(); k++) {
48 bool fgoknm = true;
49 bool fgoktun = true;
50 switch ( dobj->GetColumType(k) ) {
51 case BaseDataTable::IntegerField :
52 if (tbltyp == ASCII_TBL) tform.push_back("I9");
53 else tform.push_back("J");
54 break;
55 case BaseDataTable::LongField :
56 if (tbltyp == ASCII_TBL) tform.push_back("I12");
57 else tform.push_back("K");
58 break;
59 case BaseDataTable::FloatField :
60 if (tbltyp == ASCII_TBL) tform.push_back("E12.5");
61 else tform.push_back("E");
62 break;
63 case BaseDataTable::DoubleField :
64 case BaseDataTable::DateTimeField :
65 if (tbltyp == ASCII_TBL) tform.push_back("D15.8");
66 else tform.push_back("D");
67 if (dobj->GetColumType(k) == BaseDataTable::DateTimeField ) {
68 tunit.push_back("Days (DateTimeField)");
69 fgoktun = false;
70 }
71 break;
72 case BaseDataTable::ComplexField :
73 if (tbltyp == ASCII_TBL) {
74 cout << "FitsHandler<BaseDataTable>::Write()/Warning ComplexField not supported for ASCII_TBL "
75 << endl;
76 fgoknm = false;
77 }
78 else tform.push_back("C");
79 break;
80 case BaseDataTable::DoubleComplexField :
81 if (tbltyp == ASCII_TBL) {
82 cout << "FitsHandler<BaseDataTable>::Write()/Warning DoubleComplexField not supported for ASCII_TBL "
83 << endl;
84 fgoknm = false;
85 }
86 else tform.push_back("M");
87 break;
88 case BaseDataTable::StringField :
89 tform.push_back(strcoltag);
90 break;
91 default:
92 throw IOExc("FitsHandler<BaseDataTable>::Write() unknown column type ");
93 break;
94 }
95 if (fgoknm) {
96 colnames.push_back(dobj->GetColumName(k));
97 if (fgoktun) tunit.push_back("");
98 }
99 }
100
101 // On cree la table
102 string extname = os.NextExtensionName();
103 os.CreateTable(os.GetDef_TableType(), extname, colnames, tform, tunit);
104
105 // Ecriture des donnees des colonnes
106 for(sa_size_t l=0; l<dobj->NEntry(); l+=dobj->SegmentSize()) {
107 sa_size_t icol = 0;
108 sa_size_t sz = dobj->SegmentSize();
109 sa_size_t iseg = l/sz;
110 if ((l+sz) > dobj->NEntry()) sz = dobj->NEntry()-l;
111 for(sa_size_t k=0; k<dobj->NVar(); k++) {
112 sa_size_t sk = dobj->mNames[k].ser;
113 //DBG cout << "DBG-A k= " << k << " nom=" << dobj->mNames[k].nom << " ser=" << sk
114 //DBG << " type=" << dobj->GetColumType(k) << endl;
115 switch ( dobj->GetColumType(k) ) {
116 case BaseDataTable::IntegerField :
117 icol++;
118 FitsBlockRW<int_4>::WriteColumnData(os, icol, l+1, 1,
119 dt->mICols[sk].GetCstSegment(iseg), sz);
120 break;
121 case BaseDataTable::LongField :
122 icol++;
123 FitsBlockRW<int_8>::WriteColumnData(os, icol, l+1, 1,
124 dt->mLCols[sk].GetCstSegment(iseg), sz);
125 break;
126 case BaseDataTable::FloatField :
127 icol++;
128 FitsBlockRW<r_4>::WriteColumnData(os, icol, l+1, 1,
129 dt->mFCols[sk].GetCstSegment(iseg), sz);
130 break;
131 case BaseDataTable::DoubleField :
132 case BaseDataTable::DateTimeField :
133 icol++;
134 FitsBlockRW<r_8>::WriteColumnData(os, icol, l+1, 1,
135 dt->mDCols[sk].GetCstSegment(iseg), sz);
136 break;
137 case BaseDataTable::ComplexField :
138 if (tbltyp == BINARY_TBL) {
139 icol++;
140 FitsBlockRW< complex<r_4> >::WriteColumnData(os, icol, l+1, 1,
141 dt->mYCols[sk].GetCstSegment(iseg), sz);
142 }
143 break;
144 case BaseDataTable::DoubleComplexField :
145 if (tbltyp == BINARY_TBL) {
146 icol++;
147 FitsBlockRW< complex<r_8> >::WriteColumnData(os, icol, l+1, 1,
148 dt->mZCols[sk].GetCstSegment(iseg), sz);
149 }
150 break;
151 case BaseDataTable::StringField :
152 icol++;
153 FitsBlockRW<std::string>::WriteColumnData(os, icol, l+1, 1,
154 dt->mSCols[sk].GetCstSegment(iseg), sz);
155 break;
156 default:
157 break;
158 }
159 }
160 }
161 // Ecriture de SegmentSize et autre elements de DVList
162
163 os.WriteHeaderRecords(dobj->Info());
164 MuTyV mtv = dobj->SegmentSize();
165 os.WriteKey("SEGMSIZE",mtv," SOPHYA::DataTable SegmentSize");
166 mtv = "SOPHYA::DataTable";
167 os.WriteKey("SOPCLSNM",mtv," Object class name ");
168}
169
170
171
172DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
173void FitsHandler<BaseDataTable>::Read(FitsInOutFile& is)
174{
175
176 int hdutyp = is.CurrentHDUType();
177 if ( (hdutyp != BINARY_TBL ) && (hdutyp != ASCII_TBL) )
178 throw FitsIOException("FitsHandler<DataTable>::Read() Not a binary or ascii table HDU");
179
180 sa_size_t segsz = is.GetNbRows() / 16; // Taille de segment par defaut
181 if (segsz > 2048) segsz = 2048;
182 string key = "SEGMSIZE";
183 bool knex = false;
184 string ssegsz = is.KeyValue(key, knex);
185 if (!knex && (ssegsz.length() > 0)) segsz = atoi(ssegsz.c_str());
186 if (segsz < 16) segsz = 16;
187
188 if (dobj == NULL) { // On cree la table si besoin
189 dobj = new DataTable(segsz);
190 }
191 else {
192 dobj->Clear(); // On efface la table sinon
193 dobj->mSegSz = segsz;
194 }
195
196 // On gere les DataTable pour le moment ...
197 DataTable* dt = dynamic_cast< DataTable *> (dobj);
198 if (dt == NULL)
199 throw FitsIOException("FitsHandler<DataTable>::Read() Not a DataTable object");
200
201 vector<string> colnames;
202 vector<int> coltypes;
203 vector<long> repcnt, width;
204 vector<long> colpos;
205 is.GetColInfo(colnames, coltypes, repcnt, width);
206 // --ATTENTION-- repcnt (contenu=vecteur) pas pris en compte pour le moment
207 for(sa_size_t k=0; k<colnames.size(); k++) {
208 switch ( coltypes[k] ) {
209 case TBYTE :
210 case TSHORT :
211 case TUSHORT :
212 case TINT :
213 dt->AddIntegerColumn(colnames[k]);
214 colpos.push_back(k+1);
215 break;
216 case TUINT:
217 case TLONG :
218 case TULONG :
219#ifdef TLONGLONG
220 case TLONGLONG :
221#endif
222 dt->AddLongColumn(colnames[k]);
223 colpos.push_back(k+1);
224 break;
225 case TFLOAT :
226 dt->AddFloatColumn(colnames[k]);
227 colpos.push_back(k+1);
228 break;
229 case TDOUBLE :
230 dt->AddDoubleColumn(colnames[k]);
231 colpos.push_back(k+1);
232 break;
233 case TCOMPLEX :
234 dt->AddComplexColumn(colnames[k]);
235 colpos.push_back(k+1);
236 break;
237 case TDBLCOMPLEX :
238 dt->AddDoubleComplexColumn(colnames[k]);
239 colpos.push_back(k+1);
240 break;
241 case TSTRING :
242 dt->AddStringColumn(colnames[k]);
243 colpos.push_back(k+1);
244 break;
245 default:
246 cout << "FitsHandler<BaseDataTable>::Read() NOT handled field type "
247 << coltypes[k] << endl;
248 break;
249 }
250 }
251
252 // ------- Mise a jour des champs Nb d'entrees, nb segments ...
253 dobj->mNEnt = is.GetNbRows();
254 while ((dobj->SegmentSize()*dobj->NbSegments()) < dobj->NEntry())
255 dobj->Extend();
256 //DBG cout << " DBG2 -- dobj->mNSeg = " << dobj->NbSegments() << " SegSize="
257 //DBG << dobj->SegmentSize() << " NEntry=" << dobj->NEntry() << endl;
258
259 // Lecture des donnees des colonnes
260 for(sa_size_t l=0; l<dobj->NEntry(); l+=dobj->SegmentSize()) {
261 sa_size_t icol = 0;
262 sa_size_t sz = dobj->SegmentSize();
263 sa_size_t iseg = l/sz;
264 if ((l+sz) > dobj->NEntry()) sz = dobj->NEntry()-l;
265 for(sa_size_t k=0; k<dobj->NVar(); k++) {
266 sa_size_t sk = dobj->mNames[k].ser;
267 icol = colpos[k];
268 // cout << " DBG-3 , k=" << k << " icol=" << icol << endl;
269 switch ( dobj->GetColumType(k) ) {
270 case BaseDataTable::IntegerField :
271 FitsBlockRW<int_4>::ReadColumnData(is, icol, l+1, 1,
272 dt->mICols[sk].GetSegment(iseg), sz);
273 break;
274 case BaseDataTable::LongField :
275 FitsBlockRW<int_8>::ReadColumnData(is, icol, l+1, 1,
276 dt->mLCols[sk].GetSegment(iseg), sz);
277 break;
278 case BaseDataTable::FloatField :
279 FitsBlockRW<r_4>::ReadColumnData(is, icol, l+1, 1,
280 dt->mFCols[sk].GetSegment(iseg), sz);
281 break;
282 case BaseDataTable::DoubleField :
283 case BaseDataTable::DateTimeField :
284 FitsBlockRW<r_8>::ReadColumnData(is, icol, l+1, 1,
285 dt->mDCols[sk].GetSegment(iseg), sz);
286 break;
287 case BaseDataTable::ComplexField :
288 FitsBlockRW< complex<r_4> >::ReadColumnData(is, icol, l+1, 1,
289 dt->mYCols[sk].GetSegment(iseg), sz);
290 break;
291 case BaseDataTable::DoubleComplexField :
292 FitsBlockRW< complex<r_8> >::ReadColumnData(is, icol, l+1, 1,
293 dt->mZCols[sk].GetSegment(iseg), sz);
294 break;
295 case BaseDataTable::StringField :
296 FitsBlockRW<std::string>::ReadColumnData(is, icol, l+1, 1,
297 dt->mSCols[sk].GetSegment(iseg), sz);
298 break;
299 default:
300 break;
301 }
302 }
303 }
304
305 // Mise a jour nombre d'entree
306 // Lecture DVList
307 is.GetHeaderRecords(dobj->Info());
308}
309
310
311
312
Note: See TracBrowser for help on using the repository browser.