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

Last change on this file since 2844 was 2843, checked in by ansari, 20 years ago

debut modifs nouveau fits pour support I/O chaines de caracteres - Reza 18/11/2005

File size: 6.6 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 */
16void FitsHandler<BaseDataTable>::Write(FitsInOutFile& os)
17{
18
19 if (dobj == NULL)
20 throw NullPtrError("FitsHandler<DataTable>::Write() NULL dobj pointer ");
21
22 DataTable* dt = dynamic_cast< DataTable *> (dobj);
23 if (dt == NULL)
24 throw FitsIOException("FitsHandler<DataTable>::Write() Not a DataTable object");
25
26 int tbltyp = os.GetDef_TableType();
27 vector<string> colnames, tform, tunit;
28 for(sa_size_t k=0; k<dobj->NVar(); k++) {
29 colnames.push_back(dobj->GetColumName(k));
30 tunit.push_back("");
31 switch ( dobj->GetColumType(k) ) {
32 case BaseDataTable::IntegerField :
33 if (tbltyp == ASCII_TBL) tform.push_back("I9");
34 else tform.push_back("J");
35 break;
36 case BaseDataTable::LongField :
37 if (tbltyp == ASCII_TBL) tform.push_back("I12");
38 else tform.push_back("K");
39 break;
40 case BaseDataTable::FloatField :
41 if (tbltyp == ASCII_TBL) tform.push_back("E12.5");
42 else tform.push_back("E");
43 break;
44 case BaseDataTable::DoubleField :
45 if (tbltyp == ASCII_TBL) tform.push_back("D15.8");
46 else tform.push_back("D");
47 break;
48 case BaseDataTable::StringField :
49 cout << "FitsHandler<BaseDataTable>::Write() / Warning StringField not yet supported " << endl;
50 break;
51 default:
52 throw IOExc("FitsHandler<BaseDataTable>::Write() unknown column type ");
53 break;
54 }
55 }
56
57 // On cree la table
58 string extname = "";
59 os.CreateTable(os.GetDef_TableType(), extname, colnames, tform, tunit);
60
61 // Ecriture des donnees des colonnes
62 for(sa_size_t l=0; l<dobj->NEntry(); l+=dobj->SegmentSize()) {
63 sa_size_t icol = 0;
64 sa_size_t sz = dobj->SegmentSize();
65 sa_size_t iseg = l/sz;
66 if ((l+sz) > dobj->NEntry()) sz = dobj->NEntry()-l;
67 for(sa_size_t k=0; k<dobj->NVar(); k++) {
68 sa_size_t sk = dobj->mNames[k].ser;
69 switch ( dobj->GetColumType(k) ) {
70 case BaseDataTable::IntegerField :
71 icol++;
72 FitsBlockRW<int_4>::WriteColumnData(os, icol, l+1, 1,
73 dt->mICols[sk].GetCstSegment(iseg), sz);
74 break;
75 case BaseDataTable::LongField :
76 icol++;
77 FitsBlockRW<int_8>::WriteColumnData(os, icol, l+1, 1,
78 dt->mLCols[sk].GetCstSegment(iseg), sz);
79 break;
80 case BaseDataTable::FloatField :
81 icol++;
82 FitsBlockRW<r_4>::WriteColumnData(os, icol, l+1, 1,
83 dt->mFCols[sk].GetCstSegment(iseg), sz);
84 break;
85 case BaseDataTable::DoubleField :
86 icol++;
87 FitsBlockRW<r_8>::WriteColumnData(os, icol, l+1, 1,
88 dt->mDCols[sk].GetCstSegment(iseg), sz);
89 break;
90 // case BaseDataTable::StringField :
91 default:
92 break;
93 }
94 }
95 }
96 // Ecriture de SegmentSize et autre elements de DVList
97
98 os.WriteHeaderRecords(dobj->Info());
99 MuTyV mtv = dobj->SegmentSize();
100 os.WriteKey("SEGMSIZE",mtv," SOPHYA::DataTable SegmentSize");
101}
102
103
104
105DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
106void FitsHandler<BaseDataTable>::Read(FitsInOutFile& is)
107{
108
109 int hdutyp = is.CurrentHDUType();
110 if ( (hdutyp != BINARY_TBL ) && (hdutyp != ASCII_TBL) )
111 throw FitsIOException("FitsHandler<DataTable>::Read() Not a binary or ascii table HDU");
112
113 sa_size_t segsz = is.GetNbRows() / 16; // Taille de segment par defaut
114 if (segsz > 2048) segsz = 2048;
115 string key = "SEGMSIZE";
116 string ssegsz = is.KeyValue(key);
117 if (ssegsz.length() > 0) segsz = atoi(ssegsz.c_str());
118 if (segsz < 16) segsz = 16;
119
120 if (dobj == NULL) { // On cree la table si besoin
121 dobj = new DataTable(segsz);
122 }
123 else {
124 dobj->Clear(); // On efface la table sinon
125 dobj->mSegSz = segsz;
126 }
127
128 // On gere les DataTable pour le moment ...
129 DataTable* dt = dynamic_cast< DataTable *> (dobj);
130 if (dt == NULL)
131 throw FitsIOException("FitsHandler<DataTable>::Read() Not a DataTable object");
132
133 vector<string> colnames;
134 vector<int> coltypes;
135 vector<long> repcnt, width;
136 vector<long> colpos;
137 is.GetColInfo(colnames, coltypes, repcnt, width);
138 // --ATTENTION-- repcnt (contenu=vecteur) pas pris en compte pour le moment
139 for(sa_size_t k=0; k<colnames.size(); k++) {
140 switch ( coltypes[k] ) {
141 case TBYTE :
142 case TSHORT :
143 case TUSHORT :
144 case TINT :
145 dt->AddIntegerColumn(colnames[k]);
146 colpos.push_back(k+1);
147 break;
148 case TUINT:
149 case TLONG :
150 case TULONG :
151#ifdef TLONGLONG
152 case TLONGLONG :
153#endif
154 dt->AddLongColumn(colnames[k]);
155 colpos.push_back(k+1);
156 break;
157 case TFLOAT :
158 dt->AddFloatColumn(colnames[k]);
159 colpos.push_back(k+1);
160 break;
161 case TDOUBLE :
162 dt->AddDoubleColumn(colnames[k]);
163 colpos.push_back(k+1);
164 break;
165 default:
166 cout << "FitsHandler<BaseDataTable>::Read() NOT handled field type "
167 << coltypes[k] << endl;
168 break;
169 }
170 }
171
172 // ------- Mise a jour des champs Nb d'entrees, nb segments ...
173 dobj->mNEnt = is.GetNbRows();
174 while ((dobj->SegmentSize()*dobj->NbSegments()) < dobj->NEntry())
175 dobj->Extend();
176 // cout << " DBG2 -- dobj->mNSeg = " << dobj->NbSegments() << " SegSize="
177 // << dobj->SegmentSize() << " NEntry=" << dobj->NEntry() << endl;
178
179 // Lecture des donnees des colonnes
180 for(sa_size_t l=0; l<dobj->NEntry(); l+=dobj->SegmentSize()) {
181 sa_size_t icol = 0;
182 sa_size_t sz = dobj->SegmentSize();
183 sa_size_t iseg = l/sz;
184 if ((l+sz) > dobj->NEntry()) sz = dobj->NEntry()-l;
185 for(sa_size_t k=0; k<dobj->NVar(); k++) {
186 sa_size_t sk = dobj->mNames[k].ser;
187 icol = colpos[k];
188 // cout << " DBG-3 , k=" << k << " icol=" << icol << endl;
189 switch ( dobj->GetColumType(k) ) {
190 case BaseDataTable::IntegerField :
191 FitsBlockRW<int_4>::ReadColumnData(is, icol, l+1, 1,
192 dt->mICols[sk].GetSegment(iseg), sz);
193 break;
194 case BaseDataTable::LongField :
195 FitsBlockRW<int_8>::ReadColumnData(is, icol, l+1, 1,
196 dt->mLCols[sk].GetSegment(iseg), sz);
197 break;
198 case BaseDataTable::FloatField :
199 FitsBlockRW<r_4>::ReadColumnData(is, icol, l+1, 1,
200 dt->mFCols[sk].GetSegment(iseg), sz);
201 break;
202 case BaseDataTable::DoubleField :
203 FitsBlockRW<r_8>::ReadColumnData(is, icol, l+1, 1,
204 dt->mDCols[sk].GetSegment(iseg), sz);
205 break;
206 // case BaseDataTable::StringField :
207 default:
208 break;
209 }
210 }
211 }
212
213 // Mise a jour nombre d'entree
214 // Lecture DVList
215 is.GetHeaderRecords(dobj->Info());
216}
217
218
219/*
220int toto()
221{
222 DataTable xx;
223 FitsInOutFile fio("dtoto.fits", FitsInOutFile::Fits_Create);
224 FitsHandler<BaseDataTable> fh(xx);
225 // fio << xx;
226}
227*/
228
229
Note: See TracBrowser for help on using the repository browser.