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

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

Ajout de la classe DataTableRow , modifs/ajout interface BaseDataTable - Reza 21/11/2005

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