#include "sopnamsp.h" #include "machdefs.h" #include #include #include #include #include "fct2dfit.h" #include "perrors.h" #include "nbconst.h" #include "tabmath.h" // define SIMPSON4 c'etait la prod 91-95 rcecile #define SIMPSON9 #include "simps2d.h" // define EXPO exp #define EXPO tabFExp #define MINEXPM (100.) //================================================================ // GeneralFunction 2D pour PSF pixel taille 1x1 //================================================================ ///////////////////////////////////////////////////////////////// /*! \class SOPHYA::GeneralPSF2D \ingroup NTools \anchor GeneralPSF2D Classe de definition d'une PSF 2D a nPar parametres Pour definir une PSF, il faut creer une classe qui herite de ``GeneralPSF2D'' (cf par exemple GauRho2D...). La disposition des parametres definissant la PSF est indifferente, toutefois il est conseille de suivre l'ordre: \verbatim - PSF 2D a NPar parametres: p[0] = Volume (ou hauteur) p[1] = centre X0, p[2] = centre Y0 p[3] = SigmaX , p[4] = SigmaY, p[5] = Rho p[6],p[7],... = autres parametres (eventuels) definissant la PSF. (ex: pour la Moffat p[6] = exposant Beta et NPar=8). p[NPar-1] = Fond \endverbatim L'emploi de certaines classes comme par exemple ``GenMultiPSF2D'' necessite de suivre rigoureusement l'ordre indique ci-dessus pour les parametres. */ GeneralPSF2D::GeneralPSF2D(unsigned int nPar) : GeneralFunction(2,nPar), VolEps(1.e-4) { ASSERT( nPar>0 ); } GeneralPSF2D::~GeneralPSF2D() { } /*! \verbatim ValueH = hauteur*forme(x,y)+fond tq forme(0,0)=1. alors que Value = volume*forme(x,y)+fond tq volume(forme)=1. Dans notre convention le dernier parametre est le fond, le premier le volume et les 2 suivants le centrage x0,y0 ---> Ici parm[0] = hauteur \endverbatim */ double GeneralPSF2D::ValueH(double const xp[], double const* parm) { double x0[2]; int mm1 = mNPar - 1; // point central en [x0,y0] x0[0] = parm[1]; x0[1] = parm[2]; // retour avec hauteur = 1 return (Value(xp,parm) - parm[mm1]) / (Value(x0,parm) - parm[mm1]) * parm[0] + parm[mm1]; } /*! \verbatim Cette fonction calcule le volume d'une PSF de hauteur=1 avec une precision de "VolEps" dans le but de connaitre le coefficient permettant de convertir le volume d'une PSF en son amplitude ou vice-versa: " volume = VolPSF * hauteur " L'integration se fait 1/4 de pixel par 1/4 de pixel ATTENTION: Il s'agit de PSF donc x,y,x0,y0,Sigma.. sont en pixels \endverbatim */ double GeneralPSF2D::VolPSF(double const* parm) { double x[2],step; double vol,volprec; int ecart,i,j,k; int mm1 = mNPar-1; step = 1. / 4.; vol = volprec = 0.; ecart = 1; /* pixel central */ for(k=0;k VolEps ) { volprec = vol; for (i= -ecart;i<=ecart;i++) for(k=0;kNPar()-7: 0) , mPsf2D(psf2d), mNStar(nstar) { ASSERT( nstar>0 && psf2d!=NULL ); mNForme = mPsf2D->NPar() - 7; ASSERT( mNForme>=0 ); mNParm = mPsf2D->NPar(); mParm = new double[mNParm]; mDer = new double[mNParm]; mNParmTot = GeneralPSF2D::NPar(); cout<<"mNStar="<