source: Sophya/trunk/SophyaPI/PIext/nomtmatvecadapter.cc@ 1315

Last change on this file since 1315 was 1315, checked in by ercodmgr, 25 years ago

Adaptateur pour TArray et flag share ds methode CloneDataObj() - Reza 9/11/2000

File size: 9.0 KB
Line 
1#include "machdefs.h"
2#include <stdlib.h>
3#include <typeinfo>
4#include <iostream.h>
5#include <string>
6#include <complex>
7
8#include "datatype.h"
9
10#include "tvector.h"
11#include "objfitter.h"
12#include "nomtmatvecadapter.h"
13#include "piscdrawwdg.h"
14#include "pitvmaad.h"
15
16#include "fioarr.h"
17
18
19
20//----------------------------------------------------------------
21// Class Adaptateur d'objet (Pour NamedObjMgr) d'objet TMatrix<T>
22//----------------------------------------------------------------
23
24
25/* --Methode-- */
26template <class T>
27NOMAdapter_TMatrix<T>::NOMAdapter_TMatrix(TMatrix<T>* o)
28 : NObjMgrAdapter(o)
29{
30mMtx = o;
31}
32
33/* --Methode-- */
34template <class T>
35NOMAdapter_TMatrix<T>::~NOMAdapter_TMatrix()
36{
37}
38
39/* --Methode-- */
40template <class T>
41NObjMgrAdapter* NOMAdapter_TMatrix<T>::Clone(AnyDataObj* o)
42{
43TMatrix<T>* m = dynamic_cast<TMatrix<T> *>(o);
44if (m) return ( new NOMAdapter_TMatrix<T>(m) );
45return ( new NObjMgrAdapter(o) );
46}
47
48/* --Methode-- */
49template <class T>
50string NOMAdapter_TMatrix<T>::GetDataObjType()
51{
52string type = "TMatrix< ";
53
54TVector<T>* v = dynamic_cast<TVector<T> *>(mMtx);
55if (v != NULL) type = "TVector< ";
56
57// type += DecodeTypeIdName(typeid(T).name());
58type += DataTypeInfo<T>::getTypeName();
59type += " > ";
60return(type);
61}
62
63/* --Methode-- */
64template <class T>
65AnyDataObj* NOMAdapter_TMatrix<T>::CloneDataObj(bool share)
66{
67if (mMtx == NULL) return(NULL);
68TVector<T>* v = dynamic_cast<TVector<T> *>(mMtx);
69if (v != NULL) return( new TVector<T>(*v, share) );
70else return ( new TMatrix<T>(*mMtx, share) );
71}
72
73/* --Methode-- */
74template <class T>
75void NOMAdapter_TMatrix<T>::SavePPF(POutPersist& pos, string const & nom)
76{
77if (mMtx == NULL) return;
78TVector<T>* v = dynamic_cast<TVector<T> *>(mMtx);
79if (v != NULL) {
80 FIO_TArray<T> fio(v);
81 fio.Write(pos, nom);
82 }
83else {
84 FIO_TArray<T> fio(mMtx);
85 fio.Write(pos, nom);
86 }
87}
88
89/* --Methode-- */
90template <class T>
91void NOMAdapter_TMatrix<T>::Print(ostream& os)
92{
93TVector<T>* v = dynamic_cast<TVector<T> *>(mMtx);
94if (v != NULL) os << (*v);
95else os << (*mMtx);
96}
97
98/* --Methode-- */
99template <class T>
100PIDrawer* NOMAdapter_TMatrix<T>::GetDrawer(string & dopt)
101{
102TVector<T>* v = dynamic_cast<TVector<T> *>(mMtx);
103if (v == NULL) return(NULL);
104else {
105 dopt = "thinline," + dopt;
106 return( new PIYfXDrawer( new POTVectorAdapter<T>(v, false), NULL, true) );
107 }
108}
109
110/* --Methode-- */
111template <class T>
112P2DArrayAdapter* NOMAdapter_TMatrix<T>::Get2DArray(string &)
113{
114return ( new POTMatrixAdapter<T>(mMtx, false) );
115}
116
117/* --Methode-- */
118template <class T>
119NTupleInterface* NOMAdapter_TMatrix<T>::GetNTupleInterface(bool& adel)
120{
121adel = true;
122return( new NTupInt_TMatrix<T>(mMtx) );
123}
124
125
126/* --Methode-- */
127template <class T>
128GeneralFitData* NOMAdapter_TMatrix<T>::GetGeneralFitData(bool& adel
129 ,GeneralFitData::FitErrType errtype,double errscale,double errmin
130 ,int i1,int i2,int j1,int j2)
131{
132adel = false;
133if(!mMtx) return(NULL);
134
135int nx,ny;
136TVector<T>* vec = dynamic_cast<TVector<T> *>(mMtx);
137
138if(vec) { // C'est un TVector
139 nx = vec->NElts();
140 ny = 1;
141} else {
142 nx = mMtx->NRows();
143 ny = mMtx->NCol();
144 if(nx<=0 || ny<=0) return(NULL);
145}
146
147i1 = (i1<0||i1>=nx)? 0: i1;
148i2 = (i2<0||i2>=nx||i2<i1)? nx-1: i2;
149j1 = (j1<0||j1>=ny)? 0: j1;
150j2 = (j2<0||j2>=ny||j2<j1)? ny-1: j2;
151
152GeneralFitData* mGData = NULL;
153
154if(vec) { // C'est un TVector
155 mGData = new GeneralFitData(1,(i2-i1+1),0);
156 adel = true;
157 for(int i=i1;i<=i2;i++) {
158 double x = (double) i;
159 double f = (*vec)(i);
160 double e = 1.;
161 e = GeneralFitData::ComputeError(f,e,errtype,errscale,errmin);
162 mGData->AddData1(x,f,e);
163 }
164} else {
165 mGData = new GeneralFitData(2,(i2-i1+1)*(j2-j1+1),0);
166 adel = true;
167 for(int i=i1;i<=i2;i++) for(int j=j1;j<=j2;j++) {
168 double x = (double) i;
169 double y = (double) j;
170 double f = (*mMtx)(i,j);
171 double e = 1.;
172 e = GeneralFitData::ComputeError(f,e,errtype,errscale,errmin);
173 mGData->AddData2(x,y,f,e);
174 }
175}
176
177return mGData;
178}
179
180template <class T>
181AnyDataObj* NOMAdapter_TMatrix<T>::FitResidusObj(GeneralFit& mfit)
182{
183TVector<T>* vec = dynamic_cast<TVector<T> *>(mMtx);
184if(vec) {
185 TVector<T>* v = new TVector<T>(ObjectFitter::FitResidus(*vec,mfit),true);
186 return v;
187} else {
188 TMatrix<T>* m = new TMatrix<T>(ObjectFitter::FitResidus(*mMtx,mfit),true);
189 return m;
190}
191}
192
193template <class T>
194AnyDataObj* NOMAdapter_TMatrix<T>::FitFunctionObj(GeneralFit& mfit)
195{
196TVector<T>* vec = dynamic_cast<TVector<T> *>(mMtx);
197if(vec) {
198 TVector<T>* v = new TVector<T>(ObjectFitter::FitFunction(*vec,mfit),true);
199 return v;
200} else {
201 TMatrix<T>* m = new TMatrix<T>(ObjectFitter::FitFunction(*mMtx,mfit),true);
202 return m;
203}
204}
205
206// ---- Specialisation pour complexes -----
207GeneralFitData* NOMAdapter_TMatrix< complex<r_4> >::GetGeneralFitData(bool& adel
208 ,GeneralFitData::FitErrType errtype,double errscale,double errmin
209 ,int i1,int i2,int j1,int j2)
210{
211 return(NULL);
212}
213
214AnyDataObj* NOMAdapter_TMatrix< complex<r_4> >::FitResidusObj(GeneralFit& mfit)
215{
216 return(NULL);
217}
218
219AnyDataObj* NOMAdapter_TMatrix< complex<r_4> >::FitFunctionObj(GeneralFit& mfit)
220{
221 return(NULL);
222}
223
224GeneralFitData* NOMAdapter_TMatrix< complex<r_8> >::GetGeneralFitData(bool& adel
225 ,GeneralFitData::FitErrType errtype,double errscale,double errmin
226 ,int i1,int i2,int j1,int j2)
227{
228 return(NULL);
229}
230
231AnyDataObj* NOMAdapter_TMatrix< complex<r_8> >::FitResidusObj(GeneralFit& mfit)
232{
233 return(NULL);
234}
235
236AnyDataObj* NOMAdapter_TMatrix< complex<r_8> >::FitFunctionObj(GeneralFit& mfit)
237{
238 return(NULL);
239}
240
241// -------------------------------------------------------------
242
243/* --Methode-- */
244template <class T>
245NTupInt_TMatrix<T>::NTupInt_TMatrix(TMatrix<T>* m)
246{
247mMtx = m;
248}
249
250/* --Methode-- */
251template <class T>
252NTupInt_TMatrix<T>::~NTupInt_TMatrix()
253{
254}
255
256/* --Methode-- */
257template <class T>
258uint_4 NTupInt_TMatrix<T>::NbLines() const
259{
260return( mMtx->NRows()*mMtx->NCols() );
261}
262
263/* --Methode-- */
264template <class T>
265uint_4 NTupInt_TMatrix<T>::NbColumns() const
266{
267return(8);
268}
269
270/* --Methode-- */
271template <class T>
272r_8* NTupInt_TMatrix<T>::GetLineD(int n) const
273{
274int i,j;
275if ((n < 0) || (n >= (int)(mMtx->NRows()*mMtx->NCols()) )) {
276 mRet[0] = n;
277 for(i=1; i<8; i++) mRet[i] = 0.;
278}
279else {
280 i = n/mMtx->NCols(); j = n%mMtx->NCols();
281 mRet[0] = n; mRet[1] = i; mRet[2] = j;
282 mRet[3] = (*mMtx)(i,j);
283 mRet[4] = mRet[2]; mRet[5] = 0.;
284 mRet[6] = mRet[2]; mRet[7] = 0.;
285 }
286return(mRet);
287}
288
289/* --Methode-- */
290template <class T>
291string NTupInt_TMatrix<T>::VarList_C(const char* nx) const
292{
293string nomx;
294if (nx) nomx = nx;
295else nomx = "_xh_";
296string vardec = "double n,r,c,val,real,imag,mod,phas; \n";
297vardec += "n = " + nomx + "[0]; r = " + nomx + "[1]; c = " + nomx + "[2]; \n";
298vardec += "val = " + nomx + "[3]; \n";
299vardec += "real = " + nomx + "[4]; imag = " + nomx + "[5]; \n";
300vardec += "mod = " + nomx + "[6]; phas = " + nomx + "[7]; \n";
301return(vardec);
302}
303
304/* --Methode-- */
305r_8* NTupInt_TMatrix< complex<r_4> >::GetLineD(int n) const
306{
307int i,j;
308if ((n < 0) || (n >= (int)(mMtx->NRows()*mMtx->NCols()) )) {
309 mRet[0] = n;
310 for(i=1; i<8; i++) mRet[i] = 0.;
311}
312else {
313 i = n/mMtx->NCols(); j = n%mMtx->NCols();
314 mRet[0] = n; mRet[1] = i; mRet[2] = j;
315 mRet[4] = (*mMtx)(i,j).real(); mRet[5] = (*mMtx)(i,j).imag();
316 mRet[3] = mRet[6] = sqrt(mRet[4]*mRet[4]+mRet[5]*mRet[5]);
317 mRet[7] = atan2(mRet[5], mRet[4]);
318}
319return(mRet);
320}
321
322r_8* NTupInt_TMatrix< complex<r_8> >::GetLineD(int n) const
323{
324int i,j;
325if ((n < 0) || (n >= (int)(mMtx->NRows()*mMtx->NCols()) )) {
326 mRet[0] = n;
327 for(i=1; i<8; i++) mRet[i] = 0.;
328}
329else {
330 i = n/mMtx->NCols(); j = n%mMtx->NCols();
331 mRet[0] = n; mRet[1] = i; mRet[2] = j;
332 mRet[4] = (*mMtx)(i,j).real(); mRet[5] = (*mMtx)(i,j).imag();
333 mRet[3] = mRet[6] = sqrt(mRet[4]*mRet[4]+mRet[5]*mRet[5]);
334 mRet[7] = atan2(mRet[5], mRet[4]);
335}
336return(mRet);
337}
338
339
340#ifdef __CXX_PRAGMA_TEMPLATES__
341//#pragma define_template NOMAdapter_TMatrix<uint_2>
342//#pragma define_template NOMAdapter_TMatrix<int_2>
343#pragma define_template NOMAdapter_TMatrix<int_4>
344#pragma define_template NOMAdapter_TMatrix<r_4>
345#pragma define_template NOMAdapter_TMatrix<r_8>
346#pragma define_template NOMAdapter_TMatrix< complex<r_4> >
347#pragma define_template NOMAdapter_TMatrix< complex<r_8> >
348//#pragma define_template NTupInt_TMatrix<uint_2>
349//#pragma define_template NTupInt_TMatrix<int_2>
350#pragma define_template NTupInt_TMatrix<int_4>
351#pragma define_template NTupInt_TMatrix<r_4>
352#pragma define_template NTupInt_TMatrix<r_8>
353#pragma define_template NTupInt_TMatrix< complex<r_4> >
354#pragma define_template NTupInt_TMatrix< complex<r_8> >
355#endif
356
357#if defined(ANSI_TEMPLATES)
358//template class NOMAdapter_TMatrix<uint_2>;
359//template class NOMAdapter_TMatrix<int_2>;
360template class NOMAdapter_TMatrix<int_4>;
361template class NOMAdapter_TMatrix<r_4>;
362template class NOMAdapter_TMatrix<r_8>;
363template class NOMAdapter_TMatrix< complex<r_4> >;
364template class NOMAdapter_TMatrix< complex<r_8> >;
365// template class NTupInt_TMatrix<uint_2>;
366// template class NTupInt_TMatrix<int_2>;
367template class NTupInt_TMatrix<int_4>;
368template class NTupInt_TMatrix<r_4>;
369template class NTupInt_TMatrix<r_8>;
370template class NTupInt_TMatrix< complex<r_4> >;
371template class NTupInt_TMatrix< complex<r_8> >;
372#endif
Note: See TracBrowser for help on using the repository browser.