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

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

Modifs code BaseDataTable , DataTable et SwPPFDataTable pour la prise en compte
de colonnes de type complex (complex<r_4> ComplexField et complex<r_8> DoubleComplexField ) Reza , 2 Nov 2005

File size: 6.7 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 mDCols[sk].Share(a.mDCols[ska]);
82 break;
83 case ComplexField :
84 mYCols[sk].Share(a.mYCols[ska]);
85 break;
86 case DoubleComplexField :
87 mZCols[sk].Share(a.mZCols[ska]);
88 break;
89 case StringField :
90 mSCols[sk].Share(a.mSCols[ska]);
91 break;
92 default:
93 throw ForbiddenError("DataTable::Share() : unknown column type ");
94 break;
95 }
96 }
97}
98
99//! Copy the table structure from \b a and duplicate (copy) the data (columns content)
100void DataTable::Clone(DataTable const & a)
101{
102 // On copie la structure de table
103 CopyStructure(a);
104 // Et on partage les donnees des colonnes
105 for (size_t kk=0; kk<mNames.size(); kk++) {
106 sa_size_t sk = mNames[kk].ser;
107 sa_size_t ska = a.mNames[kk].ser;
108 switch (mNames[kk].type) {
109 case IntegerField :
110 mICols[sk].Clone(a.mICols[ska], true);
111 break;
112 case LongField :
113 mLCols[sk].Clone(a.mLCols[ska], true);
114 break;
115 case FloatField :
116 mFCols[sk].Clone(a.mFCols[ska], true);
117 break;
118 case DoubleField :
119 mDCols[sk].Clone(a.mDCols[ska], true);
120 break;
121 case ComplexField :
122 mYCols[sk].Clone(a.mYCols[ska], true);
123 break;
124 case DoubleComplexField :
125 mZCols[sk].Clone(a.mZCols[ska], true);
126 break;
127 case StringField :
128 mSCols[sk].Clone(a.mSCols[ska], true);
129 break;
130 default:
131 throw ForbiddenError("DataTable::Clone() : unknown column type ");
132 break;
133 }
134 }
135}
136//! Reset (/clear) the table content and structure
137void DataTable::Clear()
138{
139 if ( (NVar() == 0) && (NEntry() == 0)) return;
140 mNEnt = 0;
141 mNSeg = 0;
142 if (mVarD) delete[] mVarD;
143 mVarD = NULL;
144 if (mVarMTV) delete[] mVarMTV;
145 mVarMTV = NULL;
146 mNames.clear();
147 if (mInfo) delete mInfo;
148 mInfo = NULL;
149 mMin.clear();
150 mMax.clear();
151 mMinMaxNEnt.clear();
152 mIColsP.clear();
153 mLColsP.clear();
154 mFColsP.clear();
155 mDColsP.clear();
156 mYColsP.clear();
157 mZColsP.clear();
158 mSColsP.clear();
159
160 mIColIdx.clear();
161 mLColIdx.clear();
162 mFColIdx.clear();
163 mDColIdx.clear();
164 mYColIdx.clear();
165 mZColIdx.clear();
166 mSColIdx.clear();
167
168 mICols.clear();
169 mLCols.clear();
170 mFCols.clear();
171 mDCols.clear();
172 mYCols.clear();
173 mZCols.clear();
174 mSCols.clear();
175}
176
177
178/*!
179 Implements the action defined in the BaseDataTable interface.
180 In the current implementation, throws an exception (ParmError)
181 if the table contains some data already.
182*/
183sa_size_t DataTable::AddColumn(FieldType ft, string const & cnom)
184{
185 if (NEntry() > 0)
186 throw ParmError("DataTable::AddColumn() Table contains already data ");
187 CheckColName(cnom);
188 sa_size_t ser;
189 sa_size_t idx = NVar();
190 switch (ft) {
191 case IntegerField :
192 ser = mICols.size();
193 mICols.push_back(SegDataBlock<int_4>(mSegSz));
194 mIColIdx.push_back(idx);
195 mIColsP.push_back(NULL);
196 for(sa_size_t kk=0; kk<mICols.size(); kk++)
197 mIColsP[kk] = &(mICols[kk]);
198 break;
199 case LongField :
200 ser = mLCols.size();
201 mLCols.push_back(SegDataBlock<int_8>(mSegSz));
202 mLColIdx.push_back(idx);
203 mLColsP.push_back(NULL);
204 for(sa_size_t kk=0; kk<mLCols.size(); kk++)
205 mLColsP[kk] = &(mLCols[kk]);
206 break;
207 case FloatField :
208 ser = mFCols.size();
209 mFCols.push_back(SegDataBlock<r_4>(mSegSz));
210 mFColIdx.push_back(idx);
211 mFColsP.push_back(NULL);
212 for(sa_size_t kk=0; kk<mFCols.size(); kk++)
213 mFColsP[kk] = &(mFCols[kk]);
214 break;
215 case DoubleField :
216 ser = mDCols.size();
217 mDCols.push_back(SegDataBlock<r_8>(mSegSz));
218 mDColIdx.push_back(idx);
219 mDColsP.push_back(NULL);
220 for(sa_size_t kk=0; kk<mDCols.size(); kk++)
221 mDColsP[kk] = &(mDCols[kk]);
222 break;
223 case ComplexField :
224 ser = mYCols.size();
225 mYCols.push_back(SegDataBlock< complex<r_4> >(mSegSz));
226 mYColIdx.push_back(idx);
227 mYColsP.push_back(NULL);
228 for(sa_size_t kk=0; kk<mYCols.size(); kk++)
229 mYColsP[kk] = &(mYCols[kk]);
230 break;
231 case DoubleComplexField :
232 ser = mZCols.size();
233 mZCols.push_back(SegDataBlock< complex<r_8> >(mSegSz));
234 mZColIdx.push_back(idx);
235 mZColsP.push_back(NULL);
236 for(sa_size_t kk=0; kk<mZCols.size(); kk++)
237 mZColsP[kk] = &(mZCols[kk]);
238 break;
239 case StringField :
240 ser = mDCols.size();
241 mSCols.push_back(SegDataBlock<string>(mSegSz));
242 mSColIdx.push_back(idx);
243 mSColsP.push_back(NULL);
244 for(sa_size_t kk=0; kk<mSCols.size(); kk++)
245 mSColsP[kk] = &(mSCols[kk]);
246 break;
247 default:
248 throw ParmError("DataTable::AddColumn() unknown field type ");
249 break;
250 }
251 colst col;
252 col.nom = cnom;
253 col.type = ft;
254 col.ser = ser;
255 mNames.push_back(col);
256
257 // Tableaux de calcul min-max
258 mMin.push_back(0.);
259 mMax.push_back(0.);
260 mMinMaxNEnt.push_back(0);
261
262 return NVar();
263}
264
Note: See TracBrowser for help on using the repository browser.