#include "sopnamsp.h" #include "machdefs.h" #include #include #include #include #include #include "datatype.h" #include "tvector.h" #include "objfitter.h" #include "nomtmatvecadapter.h" #include "piyfxdrw.h" #include "pitvmaad.h" #include "fioarr.h" #include "nobjmgr.h" //---------------------------------------------------------------- // Class Adaptateur d'objet (Pour NamedObjMgr) d'objet TMatrix //---------------------------------------------------------------- /* --Methode-- */ template NOMAdapter_TMatrix::NOMAdapter_TMatrix(TMatrix* o) : NObjMgrAdapter(o) { mMtx = o; } /* --Methode-- */ template NOMAdapter_TMatrix::~NOMAdapter_TMatrix() { } /* --Methode-- */ template NObjMgrAdapter* NOMAdapter_TMatrix::Clone(AnyDataObj* o) { TMatrix* m = dynamic_cast *>(o); if (m) return ( new NOMAdapter_TMatrix(m) ); return ( new NObjMgrAdapter(o) ); } /* --Methode-- */ template string NOMAdapter_TMatrix::GetDataObjType() { string type = "TMatrix< "; TVector* v = dynamic_cast *>(mMtx); if (v != NULL) type = "TVector< "; // type += DecodeTypeIdName(typeid(T).name()); type += DataTypeInfo::getTypeName(); type += " > "; return(type); } /* --Methode-- */ template AnyDataObj* NOMAdapter_TMatrix::CloneDataObj(bool share) { if (mMtx == NULL) return(NULL); TVector* v = dynamic_cast *>(mMtx); if (v != NULL) return( new TVector(*v, share) ); else return ( new TMatrix(*mMtx, share) ); } /* --Methode-- */ template string NOMAdapter_TMatrix::GetInfoString(vector& opts) { if (opts.size() == 0) return mMtx->InfoString(); else { if (opts[0] == "rank") return string("2"); else if (opts[0] == "sizes") { char buff[64]; TVector* v = dynamic_cast *>(mMtx); if (v != NULL) sprintf(buff, "%ld", (long)mMtx->Size()); else sprintf(buff, "%ld %ld", (long)mMtx->NRows(), (long)mMtx->NCols()); return string(buff); } else if ((opts[0] == "size") || (opts[0] == "nelts")) { char buff[32]; sprintf(buff, "%ld", (long)mMtx->Size()); return string(buff); } else if ((opts[0] == "nrow") || (opts[0] == "nrows")) { char buff[32]; sprintf(buff, "%ld", (long)mMtx->NRows()); return string(buff); } else if ((opts[0] == "ncol") || (opts[0] == "ncols")) { char buff[32]; sprintf(buff, "%ld", (long)mMtx->NCols()); return string(buff); } else if (opts[0] == "sum") { MuTyV mtv(mMtx->Sum()); string s; return mtv.Convert(s); } else return "TMatrix.Att: rank size/nelts nrow/nrows ncol/ncols sum"; } } /* --Methode-- */ template int NOMAdapter_TMatrix::PerformOperation(vector& opts) { bool ok = false; if (opts.size() >= 2) { int_4 kk = atoi(opts[1].c_str()); TVector * vrc = new TVector; char buff[40]; if ((opts[0] == "row") || (opts[0] == "line")) { vrc->Share(mMtx->Row((sa_size_t)kk)); ok = true; sprintf(buff,"row_%ld",(long)kk); cout << "PerformOperation(): Extracting Row(" << kk << ") from matrix" << endl; } else if ((opts[0] == "col") || (opts[0] == "column")) { vrc->Share(mMtx->Column((sa_size_t)kk)); ok = true; sprintf(buff,"col_%ld",(long)kk); cout << "PerformOperation(): Extracting Column(" << kk << ") from matrix" << endl; } if (ok) { string nvrc; if (opts.size() > 2) nvrc = opts[2]; else nvrc = buff; NamedObjMgr omg; omg.AddObj(vrc, nvrc, true); return 0; } } cout << "NOMAdapter_TMatrix::PerformOperation(): Error operation/arguments !" << endl; cout << "...Valid args: row/line r [rowname] , col/column c [rowname]" << endl; return 1; } /* --Methode-- */ template void NOMAdapter_TMatrix::SavePPF(POutPersist& pos, string const & nom) { if (mMtx == NULL) return; TVector* v = dynamic_cast *>(mMtx); if (v != NULL) { FIO_TArray fio(v); fio.Write(pos, nom); } else { FIO_TArray fio(mMtx); fio.Write(pos, nom); } } /* --Methode-- */ template void NOMAdapter_TMatrix::Print(ostream& os, int lev) { if (lev < 3) mMtx->Show(os, false); else mMtx->Show(os, true); if (lev > 0) mMtx->Print(os, 10*lev); } /* --Methode-- */ template PIDrawer* NOMAdapter_TMatrix::GetDrawer(string & dopt) { TVector* v = dynamic_cast *>(mMtx); if (v == NULL) return(NULL); else { dopt = "thinline " + dopt; return( new PIYfXDrawer( new POTVectorAdapter(v, false), NULL, true) ); } } /* --Methode-- */ template P2DArrayAdapter* NOMAdapter_TMatrix::Get2DArray(string &) { return ( new POTMatrixAdapter(mMtx, false) ); } /* --Methode-- */ template NTupleInterface* NOMAdapter_TMatrix::GetNTupleInterface(bool& adel) { adel = true; return( new NTupInt_TMatrix(mMtx) ); } /* --Methode-- */ template GeneralFitData* NOMAdapter_TMatrix::GetGeneralFitData(bool& adel ,GeneralFitData::FitErrType errtype,double errscale,double errmin ,int i1,int i2,int j1,int j2) { adel = false; if(!mMtx) return(NULL); int nx,ny; TVector* vec = dynamic_cast *>(mMtx); if(vec) { // C'est un TVector nx = vec->NElts(); ny = 1; } else { nx = mMtx->NRows(); ny = mMtx->NCol(); if(nx<=0 || ny<=0) return(NULL); } i1 = (i1<0||i1>=nx)? 0: i1; i2 = (i2<0||i2>=nx||i2=ny)? 0: j1; j2 = (j2<0||j2>=ny||j2AddData1(x,f,e); } } else { mGData = new GeneralFitData(2,(i2-i1+1)*(j2-j1+1),0); adel = true; for(int i=i1;i<=i2;i++) for(int j=j1;j<=j2;j++) { double x = (double) i; double y = (double) j; double f = (*mMtx)(i,j); double e = 1.; e = GeneralFitData::ComputeError(f,e,errtype,errscale,errmin); mGData->AddData2(x,y,f,e); } } return mGData; } template AnyDataObj* NOMAdapter_TMatrix::FitResidusObj(GeneralFit& mfit) { TVector* vec = dynamic_cast *>(mMtx); if(vec) { TVector* v = new TVector(ObjectFitter::FitResidus(*vec,mfit),true); return v; } else { TMatrix* m = new TMatrix(ObjectFitter::FitResidus(*mMtx,mfit),true); return m; } } template AnyDataObj* NOMAdapter_TMatrix::FitFunctionObj(GeneralFit& mfit) { TVector* vec = dynamic_cast *>(mMtx); if(vec) { TVector* v = new TVector(ObjectFitter::FitFunction(*vec,mfit),true); return v; } else { TMatrix* m = new TMatrix(ObjectFitter::FitFunction(*mMtx,mfit),true); return m; } } // ---- Specialisation pour complexes ----- DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ GeneralFitData* NOMAdapter_TMatrix< complex >::GetGeneralFitData(bool& adel ,GeneralFitData::FitErrType errtype,double errscale,double errmin ,int i1,int i2,int j1,int j2) { return(NULL); } DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ AnyDataObj* NOMAdapter_TMatrix< complex >::FitResidusObj(GeneralFit& mfit) { return(NULL); } DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ AnyDataObj* NOMAdapter_TMatrix< complex >::FitFunctionObj(GeneralFit& mfit) { return(NULL); } DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ GeneralFitData* NOMAdapter_TMatrix< complex >::GetGeneralFitData(bool& adel ,GeneralFitData::FitErrType errtype,double errscale,double errmin ,int i1,int i2,int j1,int j2) { return(NULL); } DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ AnyDataObj* NOMAdapter_TMatrix< complex >::FitResidusObj(GeneralFit& mfit) { return(NULL); } DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ AnyDataObj* NOMAdapter_TMatrix< complex >::FitFunctionObj(GeneralFit& mfit) { return(NULL); } // ------------------------------------------------------------- /* --Methode-- */ template NTupInt_TMatrix::NTupInt_TMatrix(TMatrix* m) { mMtx = m; } /* --Methode-- */ template NTupInt_TMatrix::~NTupInt_TMatrix() { } /* --Methode-- */ template sa_size_t NTupInt_TMatrix::NbLines() const { return( mMtx->NRows()*mMtx->NCols() ); } /* --Methode-- */ template sa_size_t NTupInt_TMatrix::NbColumns() const { return(8); } /* --Methode-- */ template r_8* NTupInt_TMatrix::GetLineD(sa_size_t n) const { int i,j; if ((n < 0) || (n >= (int)(mMtx->NRows()*mMtx->NCols()) )) { mRet[0] = n; for(i=1; i<8; i++) mRet[i] = 0.; } else { i = n/mMtx->NCols(); j = n%mMtx->NCols(); mRet[0] = n; mRet[1] = i; mRet[2] = j; mRet[3] = (*mMtx)(i,j); mRet[4] = mRet[2]; mRet[5] = 0.; mRet[6] = mRet[2]; mRet[7] = 0.; } return(mRet); } /* --Methode-- */ template string NTupInt_TMatrix::VarList_C(const char* nx) const { string nomx; if (nx) nomx = nx; else nomx = "_xh_"; string vardec = "double n,r,c,val,real,imag,mod,phas; \n"; vardec += "n = " + nomx + "[0]; r = " + nomx + "[1]; c = " + nomx + "[2]; \n"; vardec += "val = " + nomx + "[3]; \n"; vardec += "real = " + nomx + "[4]; imag = " + nomx + "[5]; \n"; vardec += "mod = " + nomx + "[6]; phas = " + nomx + "[7]; \n"; return(vardec); } /* --Methode-- */ DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ r_8* NTupInt_TMatrix< complex >::GetLineD(sa_size_t n) const { int i,j; if ((n < 0) || (n >= (int)(mMtx->NRows()*mMtx->NCols()) )) { mRet[0] = n; for(i=1; i<8; i++) mRet[i] = 0.; } else { i = n/mMtx->NCols(); j = n%mMtx->NCols(); mRet[0] = n; mRet[1] = i; mRet[2] = j; mRet[4] = (*mMtx)(i,j).real(); mRet[5] = (*mMtx)(i,j).imag(); mRet[3] = mRet[6] = sqrt(mRet[4]*mRet[4]+mRet[5]*mRet[5]); mRet[7] = atan2(mRet[5], mRet[4]); } return(mRet); } DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ r_8* NTupInt_TMatrix< complex >::GetLineD(sa_size_t n) const { int i,j; if ((n < 0) || (n >= (int)(mMtx->NRows()*mMtx->NCols()) )) { mRet[0] = n; for(i=1; i<8; i++) mRet[i] = 0.; } else { i = n/mMtx->NCols(); j = n%mMtx->NCols(); mRet[0] = n; mRet[1] = i; mRet[2] = j; mRet[4] = (*mMtx)(i,j).real(); mRet[5] = (*mMtx)(i,j).imag(); mRet[3] = mRet[6] = sqrt(mRet[4]*mRet[4]+mRet[5]*mRet[5]); mRet[7] = atan2(mRet[5], mRet[4]); } return(mRet); } #ifdef __CXX_PRAGMA_TEMPLATES__ #pragma define_template NOMAdapter_TMatrix #pragma define_template NOMAdapter_TMatrix #pragma define_template NOMAdapter_TMatrix #pragma define_template NOMAdapter_TMatrix #pragma define_template NOMAdapter_TMatrix #pragma define_template NOMAdapter_TMatrix #pragma define_template NOMAdapter_TMatrix< complex > #pragma define_template NOMAdapter_TMatrix< complex > #pragma define_template NTupInt_TMatrix #pragma define_template NTupInt_TMatrix #pragma define_template NTupInt_TMatrix #pragma define_template NTupInt_TMatrix #pragma define_template NTupInt_TMatrix #pragma define_template NTupInt_TMatrix #pragma define_template NTupInt_TMatrix< complex > #pragma define_template NTupInt_TMatrix< complex > #endif #if defined(ANSI_TEMPLATES) template class NOMAdapter_TMatrix; template class NOMAdapter_TMatrix; template class NOMAdapter_TMatrix; template class NOMAdapter_TMatrix; template class NOMAdapter_TMatrix; template class NOMAdapter_TMatrix; template class NOMAdapter_TMatrix< complex >; template class NOMAdapter_TMatrix< complex >; template class NTupInt_TMatrix; template class NTupInt_TMatrix; template class NTupInt_TMatrix; template class NTupInt_TMatrix; template class NTupInt_TMatrix; template class NTupInt_TMatrix; template class NTupInt_TMatrix< complex >; template class NTupInt_TMatrix< complex >; #endif