source: Sophya/trunk/SophyaLib/HiStats/datatable.cc@ 2831

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

1/ Prise en charge champ de type DateTimeField ds BaseDataTable , DataTable, SwPPFDataTable
2/ Methodes BaseDataTable completees - en particulier Print/WriteASCII, et
decodage de fichiers ASCII

Reza, 8 Nov 2005

File size: 6.8 KB
Line 
1#include "datatable.h"
2#include "sopnamsp.h"
3#include "strutil.h"
4#include "pexceptions.h"
5#include "fiosegdb.h"
6
7
8/*!
9 \class SOPHYA::DataTable
10 \ingroup HiStats
11 This class can be used to organize data in table (row-column) form.
12 Each column holds homogeneous data (same data type), while different
13 columns can be used for different data types
14 (integer, float, string ...).
15 The whole data set is kept in memory.
16 \sa SOPHYA::MuTyV
17 \sa SOPHYA::BaseDataTable
18 \sa SOPHYA::SegDataBlock
19
20 \code
21 #include "datatable.h"
22 // ...
23 DataTable dt(64);
24 dt.AddFloatColumn("X0_f");
25 dt.AddFloatColumn("X1_f");
26 dt.AddDoubleColumn("X0X0pX1X1_d");
27 double x[5];
28 for(int i=0; i<63; i++) {
29 x[0] = (i%9)-4.; x[1] = (i/9)-3.; x[2] = x[0]*x[0]+x[1]*x[1];
30 dt.AddLine(x);
31 }
32 // Printing table info
33 cout << dt ;
34 // Saving object into a PPF file
35 POutPersist po("dtable.ppf");
36 po << dt ;
37 \endcode
38*/
39
40
41//! Default constructor - optional specification of block (or segment) size
42DataTable::DataTable(sa_size_t segsz)
43 : BaseDataTable(segsz)
44{
45}
46
47//! copy constructor
48/*!
49 The copy constructur shares the data if \b share=true.
50 Otherwise, the Clone() method is called to make a complete copy.
51*/
52DataTable::DataTable(DataTable const & a, bool share)
53 : BaseDataTable(a.SegmentSize())
54{
55 if (share) Share(a);
56 else Clone(a);
57 mNEnt = a.mNEnt;
58 mNSeg = a.mNSeg;
59 if (a.mInfo) mInfo = new DVList(*(a.mInfo));
60}
61//! Copy the table structure from \b a and shares the data (columns content)
62void DataTable::Share(DataTable const & a)
63{
64 // On copie la structure de table
65 CopyStructure(a);
66 // Et on partage les donnees des colonnes
67 for (size_t kk=0; kk<mNames.size(); kk++) {
68 sa_size_t sk = mNames[kk].ser;
69 sa_size_t ska = a.mNames[kk].ser;
70 switch (mNames[kk].type) {
71 case IntegerField :
72 mICols[sk].Share(a.mICols[ska]);
73 break;
74 case LongField :
75 mLCols[sk].Share(a.mLCols[ska]);
76 break;
77 case FloatField :
78 mFCols[sk].Share(a.mFCols[ska]);
79 break;
80 case DoubleField :
81 case DateTimeField :
82 mDCols[sk].Share(a.mDCols[ska]);
83 break;
84 case ComplexField :
85 mYCols[sk].Share(a.mYCols[ska]);
86 break;
87 case DoubleComplexField :
88 mZCols[sk].Share(a.mZCols[ska]);
89 break;
90 case StringField :
91 mSCols[sk].Share(a.mSCols[ska]);
92 break;
93 default:
94 throw ForbiddenError("DataTable::Share() : unknown column type ");
95 break;
96 }
97 }
98}
99
100//! Copy the table structure from \b a and duplicate (copy) the data (columns content)
101void DataTable::Clone(DataTable const & a)
102{
103 // On copie la structure de table
104 CopyStructure(a);
105 // Et on partage les donnees des colonnes
106 for (size_t kk=0; kk<mNames.size(); kk++) {
107 sa_size_t sk = mNames[kk].ser;
108 sa_size_t ska = a.mNames[kk].ser;
109 switch (mNames[kk].type) {
110 case IntegerField :
111 mICols[sk].Clone(a.mICols[ska], true);
112 break;
113 case LongField :
114 mLCols[sk].Clone(a.mLCols[ska], true);
115 break;
116 case FloatField :
117 mFCols[sk].Clone(a.mFCols[ska], true);
118 break;
119 case DoubleField :
120 case DateTimeField :
121 mDCols[sk].Clone(a.mDCols[ska], true);
122 break;
123 case ComplexField :
124 mYCols[sk].Clone(a.mYCols[ska], true);
125 break;
126 case DoubleComplexField :
127 mZCols[sk].Clone(a.mZCols[ska], true);
128 break;
129 case StringField :
130 mSCols[sk].Clone(a.mSCols[ska], true);
131 break;
132 default:
133 throw ForbiddenError("DataTable::Clone() : unknown column type ");
134 break;
135 }
136 }
137}
138//! Reset (/clear) the table content and structure
139void DataTable::Clear()
140{
141 if ( (NVar() == 0) && (NEntry() == 0)) return;
142 mNEnt = 0;
143 mNSeg = 0;
144 if (mVarD) delete[] mVarD;
145 mVarD = NULL;
146 if (mVarMTV) delete[] mVarMTV;
147 mVarMTV = NULL;
148 mNames.clear();
149 if (mInfo) delete mInfo;
150 mInfo = NULL;
151 mMin.clear();
152 mMax.clear();
153 mMinMaxNEnt.clear();
154 mIColsP.clear();
155 mLColsP.clear();
156 mFColsP.clear();
157 mDColsP.clear();
158 mYColsP.clear();
159 mZColsP.clear();
160 mSColsP.clear();
161
162 mIColIdx.clear();
163 mLColIdx.clear();
164 mFColIdx.clear();
165 mDColIdx.clear();
166 mYColIdx.clear();
167 mZColIdx.clear();
168 mSColIdx.clear();
169
170 mICols.clear();
171 mLCols.clear();
172 mFCols.clear();
173 mDCols.clear();
174 mYCols.clear();
175 mZCols.clear();
176 mSCols.clear();
177}
178
179
180/*!
181 Implements the action defined in the BaseDataTable interface.
182 In the current implementation, throws an exception (ParmError)
183 if the table contains some data already.
184*/
185sa_size_t DataTable::AddColumn(FieldType ft, string const & cnom)
186{
187 if (NEntry() > 0)
188 throw ParmError("DataTable::AddColumn() Table contains already data ");
189 CheckColName(cnom);
190 sa_size_t ser;
191 sa_size_t idx = NVar();
192 switch (ft) {
193 case IntegerField :
194 ser = mICols.size();
195 mICols.push_back(SegDataBlock<int_4>(mSegSz));
196 mIColIdx.push_back(idx);
197 mIColsP.push_back(NULL);
198 for(sa_size_t kk=0; kk<mICols.size(); kk++)
199 mIColsP[kk] = &(mICols[kk]);
200 break;
201 case LongField :
202 ser = mLCols.size();
203 mLCols.push_back(SegDataBlock<int_8>(mSegSz));
204 mLColIdx.push_back(idx);
205 mLColsP.push_back(NULL);
206 for(sa_size_t kk=0; kk<mLCols.size(); kk++)
207 mLColsP[kk] = &(mLCols[kk]);
208 break;
209 case FloatField :
210 ser = mFCols.size();
211 mFCols.push_back(SegDataBlock<r_4>(mSegSz));
212 mFColIdx.push_back(idx);
213 mFColsP.push_back(NULL);
214 for(sa_size_t kk=0; kk<mFCols.size(); kk++)
215 mFColsP[kk] = &(mFCols[kk]);
216 break;
217 case DoubleField :
218 case DateTimeField :
219 ser = mDCols.size();
220 mDCols.push_back(SegDataBlock<r_8>(mSegSz));
221 mDColIdx.push_back(idx);
222 mDColsP.push_back(NULL);
223 for(sa_size_t kk=0; kk<mDCols.size(); kk++)
224 mDColsP[kk] = &(mDCols[kk]);
225 break;
226 case ComplexField :
227 ser = mYCols.size();
228 mYCols.push_back(SegDataBlock< complex<r_4> >(mSegSz));
229 mYColIdx.push_back(idx);
230 mYColsP.push_back(NULL);
231 for(sa_size_t kk=0; kk<mYCols.size(); kk++)
232 mYColsP[kk] = &(mYCols[kk]);
233 break;
234 case DoubleComplexField :
235 ser = mZCols.size();
236 mZCols.push_back(SegDataBlock< complex<r_8> >(mSegSz));
237 mZColIdx.push_back(idx);
238 mZColsP.push_back(NULL);
239 for(sa_size_t kk=0; kk<mZCols.size(); kk++)
240 mZColsP[kk] = &(mZCols[kk]);
241 break;
242 case StringField :
243 ser = mDCols.size();
244 mSCols.push_back(SegDataBlock<string>(mSegSz));
245 mSColIdx.push_back(idx);
246 mSColsP.push_back(NULL);
247 for(sa_size_t kk=0; kk<mSCols.size(); kk++)
248 mSColsP[kk] = &(mSCols[kk]);
249 break;
250 default:
251 throw ParmError("DataTable::AddColumn() unknown field type ");
252 break;
253 }
254 colst col;
255 col.nom = cnom;
256 col.type = ft;
257 col.ser = ser;
258 mNames.push_back(col);
259
260 // Tableaux de calcul min-max
261 mMin.push_back(0.);
262 mMax.push_back(0.);
263 mMinMaxNEnt.push_back(0);
264
265 return NVar();
266}
267
Note: See TracBrowser for help on using the repository browser.