#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 "fitstarray.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 void NOMAdapter_TMatrix::ReadFits(string const & flnm) { FitsInFile fis(flnm); fis >> (*mMtx); } /* --Methode-- */ template void NOMAdapter_TMatrix::SaveFits(string const & flnm) { FitsOutFile fos(flnm); fos << (*mMtx); } // ---- Specialisation pour complexes ----- DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ void NOMAdapter_TMatrix< complex >::ReadFits(string const & flnm) { cout << " NOMAdapter_TMatrix< complex >::ReadFits() - Error " << " Not supported (complex data type)" << endl; } DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ void NOMAdapter_TMatrix< complex >::SaveFits(string const & flnm) { cout << " NOMAdapter_TMatrix< complex >::SaveFits() - Error " << " Not supported (complex data type)" << endl; } DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ void NOMAdapter_TMatrix< complex >::ReadFits(string const & flnm) { cout << " NOMAdapter_TMatrix< complex >::ReadFits() - Error " << " Not supported (complex data type)" << endl; } DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ void NOMAdapter_TMatrix< complex >::SaveFits(string const & flnm) { cout << " NOMAdapter_TMatrix< complex >::SaveFits() - Error " << " Not supported (complex data type)" << endl; } /* --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) { TVector* v = dynamic_cast *>(mMtx); if (v != NULL) os << (*v); else os << (*mMtx); } /* --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(int 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(int 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< 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< 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< 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< complex >; template class NTupInt_TMatrix< complex >; #endif