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

Last change on this file since 3031 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
RevLine 
[2688]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
[2808]13 columns can be used for different data types
14 (integer, float, string ...).
15 The whole data set is kept in memory.
[2688]16 \sa SOPHYA::MuTyV
[2849]17 \sa SOPHYA::DataTableRow
[2688]18 \sa SOPHYA::BaseDataTable
[2808]19 \sa SOPHYA::SegDataBlock
[2688]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];
[2849]31 dt.AddRow(x);
[2688]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
[2849]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
[2688]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
[2808]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*/
[2688]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}
[2808]73//! Copy the table structure from \b a and shares the data (columns content)
[2688]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 :
[2831]93 case DateTimeField :
[2688]94 mDCols[sk].Share(a.mDCols[ska]);
95 break;
[2827]96 case ComplexField :
97 mYCols[sk].Share(a.mYCols[ska]);
98 break;
99 case DoubleComplexField :
100 mZCols[sk].Share(a.mZCols[ska]);
101 break;
[2688]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
[2808]112//! Copy the table structure from \b a and duplicate (copy) the data (columns content)
[2688]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 :
[2831]132 case DateTimeField :
[2688]133 mDCols[sk].Clone(a.mDCols[ska], true);
134 break;
[2827]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;
[2688]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}
[2808]150//! Reset (/clear) the table content and structure
[2688]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();
[2827]170 mYColsP.clear();
171 mZColsP.clear();
[2688]172 mSColsP.clear();
173
174 mIColIdx.clear();
175 mLColIdx.clear();
176 mFColIdx.clear();
177 mDColIdx.clear();
[2827]178 mYColIdx.clear();
179 mZColIdx.clear();
[2688]180 mSColIdx.clear();
181
182 mICols.clear();
183 mLCols.clear();
184 mFCols.clear();
185 mDCols.clear();
[2827]186 mYCols.clear();
187 mZCols.clear();
[2688]188 mSCols.clear();
189}
190
191
[2808]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*/
[2688]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 :
[2831]230 case DateTimeField :
[2688]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;
[2827]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;
[2688]254 case StringField :
[2847]255 ser = mSCols.size();
[2688]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);
[2696]271
272 // Tableaux de calcul min-max
273 mMin.push_back(0.);
274 mMax.push_back(0.);
275 mMinMaxNEnt.push_back(0);
276
[2688]277 return NVar();
278}
279
Note: See TracBrowser for help on using the repository browser.