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

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

MAJ documentation - Reza 14/6/2005

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