#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.) using namespace PlanckDPC; //================================================================ // GeneralFunction 2D pour PSF pixel taille 1x1 //================================================================ ///////////////////////////////////////////////////////////////// //++ // Class GeneralPSF2D // Lib Outils++ // include fct2dfit.h // // 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: //-- //++ // - 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 //-- //++ // 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) { DBASSERT( nPar>0 ); } GeneralPSF2D::~GeneralPSF2D() { } //++ double GeneralPSF2D::ValueH(double const xp[], double const* parm) // //| 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 //-- { 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]; } //++ double GeneralPSF2D::VolPSF(double const* parm) // //| 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 //-- { 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) { DBASSERT( nstar>0 && psf2d!=NULL ); mNForme = mPsf2D->NPar() - 7; DBASSERT( mNForme>=0 ); mNParm = mPsf2D->NPar(); mParm = new double[mNParm]; mDer = new double[mNParm]; mNParmTot = GeneralPSF2D::NPar(); cout<<"mNStar="<