Changeset 926 in Sophya
- Timestamp:
- Apr 13, 2000, 8:39:39 PM (25 years ago)
- Location:
- trunk/SophyaLib
- Files:
-
- 36 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/HiStats/hisprof.cc
r914 r926 6 6 #include "perrors.h" 7 7 8 /*! 9 \class SOPHYA::HProf 10 \ingroup HiStats 11 Classe de profil d'histogrammes. 12 */ 8 13 9 14 /********* Methode *********/ -
trunk/SophyaLib/HiStats/hisprof.h
r920 r926 10 10 namespace SOPHYA { 11 11 12 /*! 13 \class SOPHYA::HProf 14 \ingroup HiStats 15 Classe de profil d'histogrammes. 16 */ 12 //! 1 dimension profile histograms 17 13 class HProf : public Histo { 18 14 friend class ObjFileIO<HProf>; -
trunk/SophyaLib/HiStats/histinit.h
r763 r926 11 11 namespace SOPHYA { 12 12 13 //! Histograms initiator 13 14 class HiStatsInitiator : public NToolsInitiator { 14 15 private: -
trunk/SophyaLib/HiStats/histos.cc
r914 r926 1 1 // 2 // $Id: histos.cc,v 1. 2 2000-04-13 16:04:11ansari Exp $2 // $Id: histos.cc,v 1.3 2000-04-13 18:38:32 ansari Exp $ 3 3 // 4 4 … … 12 12 #include "strutil.h" 13 13 #include "generalfit.h" 14 15 /*! 16 \class SOPHYA::Histo 17 \ingroup HiStats 18 Classe d'histogrammes 1D 19 */ 14 20 15 21 /********* Methode *********/ -
trunk/SophyaLib/HiStats/histos.h
r920 r926 1 1 // This may look like C code, but it is really -*- C++ -*- 2 2 // 3 // $Id: histos.h,v 1. 3 2000-04-13 16:41:43 ansari Exp $3 // $Id: histos.h,v 1.4 2000-04-13 18:38:33 ansari Exp $ 4 4 // 5 5 … … 19 19 class GeneralFit; 20 20 21 22 /*! 23 \class SOPHYA::Histo 24 \ingroup HiStats 25 Classe d'histogrammes 1D 26 */ 21 //! 1 dimension histograms 27 22 class Histo : public AnyDataObj { 28 23 friend class ObjFileIO<Histo>; -
trunk/SophyaLib/HiStats/histos2.cc
r914 r926 15 15 #include "histos2.h" 16 16 #include "generalfit.h" 17 18 /*! 19 \class SOPHYA::Histo2D 20 \ingroup HiStats 21 Classe d'histogrammes 2D 22 \verbatim 23 Remarque sur les indices: 24 H(i,j) -> i = coord x (0<i<nx), j = coord y (0<j<ny) 25 v(ii,jj) -> ii = ligne (0<i<NRows()), jj = colonne (0<i<NCol()) 26 On fait une correspondance directe i<->ii et j<->jj 27 ce qui, en representation classique des histos2D et des matrices 28 entraine une inversion x<->y cad une symetrie / diagonale principale 29 H(0,...) represente ^ mais v(0,...) represente 30 |x....... |xxxxxxxx| 31 |x....... |........| 32 |x....... |........| 33 |x....... |........| 34 |x....... |........| 35 ---------> 36 colonne no 1 ligne no 1 37 \endverbatim 38 */ 17 39 18 40 /////////////////////////////////////////////////////////////////// -
trunk/SophyaLib/HiStats/histos2.h
r920 r926 22 22 class GeneralFit; 23 23 24 25 /*! 26 \class SOPHYA::Histo2D 27 \ingroup HiStats 28 Classe d'histogrammes 2D 29 \verbatim 30 Remarque sur les indices: 31 H(i,j) -> i = coord x (0<i<nx), j = coord y (0<j<ny) 32 v(ii,jj) -> ii = ligne (0<i<NRows()), jj = colonne (0<i<NCol()) 33 On fait une correspondance directe i<->ii et j<->jj 34 ce qui, en representation classique des histos2D et des matrices 35 entraine une inversion x<->y cad une symetrie / diagonale principale 36 H(0,...) represente ^ mais v(0,...) represente 37 |x....... |xxxxxxxx| 38 |x....... |........| 39 |x....... |........| 40 |x....... |........| 41 |x....... |........| 42 ---------> 43 colonne no 1 ligne no 1 44 \endverbatim 45 */ 24 //! 2 dimensions histograms 46 25 class Histo2D : public AnyDataObj { 47 26 friend class ObjFileIO<Histo2D>; -
trunk/SophyaLib/NTools/fct1dfit.cc
r514 r926 18 18 19 19 ///////////////////////////////////////////////////////////////// 20 //++ 21 // Module Classes de fonctions 1D 22 // Lib Outils++ 23 // include fct1dfit.h 24 //-- 25 ///////////////////////////////////////////////////////////////// 26 27 ///////////////////////////////////////////////////////////////// 28 //++ 29 // Titre Gauss1DPol 30 // \index{Gauss1DPol} 31 // 32 //| Gaussienne+polynome: 33 //| Si polcenter=true: xc=(x-par[1]), sinon xc=x 34 //| f(x) = par[0]*exp[-0.5*( (x-par[1]) / par[2] )**2 ] 35 //| +par[3] + par[4]*xc + .... + par[3+NDegPol]*xc**NDegPol 36 //| NDegPol = degre du polynome, si <0 pas de polynome 37 //-- 38 ///////////////////////////////////////////////////////////////// 39 40 //++ 20 /*! 21 \class SOPHYA::Gauss1DPol 22 \ingroup NTools 23 \anchor Gauss1DPol 24 \verbatim 25 Gaussienne+polynome: 26 Si polcenter=true: xc=(x-par[1]), sinon xc=x 27 f(x) = par[0]*exp[-0.5*( (x-par[1]) / par[2] )**2 ] 28 +par[3] + par[4]*xc + .... + par[3+NDegPol]*xc**NDegPol 29 NDegPol = degre du polynome, si <0 pas de polynome 30 \endverbatim 31 */ 41 32 Gauss1DPol::Gauss1DPol(unsigned int ndegpol,bool polcenter) 42 //43 // Createur.44 //--45 33 : GeneralFunction(1,ndegpol+4), NDegPol(ndegpol), PolCenter(polcenter) 46 34 { 47 35 } 48 36 49 //++50 37 Gauss1DPol::Gauss1DPol(bool polcenter) 51 //52 // Createur.53 //--54 38 : GeneralFunction(1,3), NDegPol(-1), PolCenter(polcenter) 55 39 { … … 107 91 108 92 ///////////////////////////////////////////////////////////////// 109 //++ 110 // Titre GaussN1DPol 111 // \index{GaussN1DPol} 112 // 113 //| Gaussienne_Normalisee+polynome (par[0]=Volume: 114 //| Si polcenter=true: xc=(x-par[1]), sinon xc=x 115 //| f(x) = par[0]/(sqrt(2*Pi)*par[2])*exp[-0.5*((x-par[1])/par[2])**2 ] 116 //| +par[3] + par[4]*xc + .... + par[3+NDegPol]*xc**NDegPol 117 //| NDegPol = degre du polynome, si <0 pas de polynome 118 //-- 119 ///////////////////////////////////////////////////////////////// 120 121 //++ 93 /*! 94 \class SOPHYA::GaussN1DPol 95 \ingroup NTools 96 \anchor GaussN1DPol 97 \verbatim 98 Gaussienne_Normalisee+polynome (par[0]=Volume: 99 Si polcenter=true: xc=(x-par[1]), sinon xc=x 100 f(x) = par[0]/(sqrt(2*Pi)*par[2])*exp[-0.5*((x-par[1])/par[2])**2 ] 101 +par[3] + par[4]*xc + .... + par[3+NDegPol]*xc**NDegPol 102 NDegPol = degre du polynome, si <0 pas de polynome 103 \endverbatim 104 */ 122 105 GaussN1DPol::GaussN1DPol(unsigned int ndegpol,bool polcenter) 123 //124 // Createur.125 //--126 106 : GeneralFunction(1,ndegpol+4), NDegPol(ndegpol), PolCenter(polcenter) 127 107 { 128 108 } 129 109 130 //++131 110 GaussN1DPol::GaussN1DPol(bool polcenter) 132 //133 // Createur.134 //--135 111 : GeneralFunction(1,3), NDegPol(-1), PolCenter(polcenter) 136 112 { … … 189 165 190 166 ///////////////////////////////////////////////////////////////// 191 //++ 192 // Titre Exp1DPol 193 // \index{Exp1DPol} 194 // 195 //| Exponentielle+polynome: 196 //| xx = x - X_Center 197 //| f(x) = exp[par[0]+par[1]*xx] 198 //| +par[2] + par[3]*xx + .... + par[2+NDegPol]*xx**NDegPol 199 //| NDegPol = degre du polynome, si <0 pas de polynome 200 //-- 201 ///////////////////////////////////////////////////////////////// 202 203 //++ 167 /*! 168 \class SOPHYA::Exp1DPol 169 \ingroup NTools 170 \anchor Exp1DPol 171 \verbatim 172 Exponentielle+polynome: 173 xx = x - X_Center 174 f(x) = exp[par[0]+par[1]*xx] 175 +par[2] + par[3]*xx + .... + par[2+NDegPol]*xx**NDegPol 176 NDegPol = degre du polynome, si <0 pas de polynome 177 \endverbatim 178 */ 204 179 Exp1DPol::Exp1DPol(unsigned int ndegpol,double x0) 205 //206 // Createur.207 //--208 180 : GeneralFunction(1,ndegpol+3), NDegPol(ndegpol), X_Center(x0) 209 181 { 210 182 } 211 183 212 //++213 184 Exp1DPol::Exp1DPol(double x0) 214 //215 // Createur.216 //--217 185 : GeneralFunction(1,2), NDegPol(-1), X_Center(x0) 218 186 { … … 259 227 260 228 ///////////////////////////////////////////////////////////////// 261 //++ 262 // Titre Polyn1D 263 // \index{Polyn1D} 264 // 265 //| polynome 1D: 266 //| xx = x - X_Center 267 //| f(x) = par[0] + par[1]*xx + .... + par[NDegPol+1]*xx**NDegPol 268 //| NDegPol = degre du polynome 269 //-- 270 ///////////////////////////////////////////////////////////////// 271 272 //++ 229 /*! 230 \class SOPHYA::Polyn1D 231 \ingroup NTools 232 \anchor Polyn1D 233 \verbatim 234 polynome 1D: 235 xx = x - X_Center 236 f(x) = par[0] + par[1]*xx + .... + par[NDegPol+1]*xx**NDegPol 237 NDegPol = degre du polynome 238 \endverbatim 239 */ 273 240 Polyn1D::Polyn1D(unsigned int ndegpol,double x0) 274 //275 // Createur.276 //--277 241 : GeneralFunction(1,ndegpol+1), NDegPol(ndegpol), X_Center(x0) 278 242 { … … 309 273 310 274 ///////////////////////////////////////////////////////////////// 311 //++ 312 // Titre HarmonieNu 313 // \index{HarmonieNu} 314 // 315 //| Analyse harmonique: 316 //| f(t) = par(1) + Sum[par(2k) *cos(2*pi*k*par(0)*(t-t0)] 317 //| + Sum[par(2k+1)*sin(2*pi*k*par(0)*(t-t0)] 318 //| la somme Sum porte sur l'indice k qui varie de [1,NHarm()+1] 319 //| avec la convention k=1 pour le fondamental 320 //| k>1 pour le (k-1)ieme harmonique 321 //-- 322 //++ 323 //| par(0) = inverse de la periode (frequence) 324 //| par(1) = terme constant 325 //| par(2), par(3) = termes devant le cosinus et le sinus 326 //| du fondamental 327 //| par(2(m+1)), par(2(m+1)+1) = termes devant le cosinus 328 //| et le sinus de l'harmonique m (m>=1). 329 //| NHarm() = nombre d'harmoniques a fitter. 330 //| T0() = centrage des temps, ce n'est pas un parametre du fit. 331 // `Conseil:' Avant de faire un fit avec les `NHarm()' 332 // harmoniques, il est preferable de faire un pre-fit 333 // ou seuls les parametres 1,2 et 3 sont libres et d'injecter 334 // le resultat du fit sur ces 3 parametres comme valeurs 335 // de depart pour le fit global avec les `NHarm()' harmoniques. 336 // De toute facon, le fit ne marchera que si la periode 337 // est initialisee de facon tres precise. 338 //-- 339 ///////////////////////////////////////////////////////////////// 340 341 //++ 275 /*! 276 \class SOPHYA::HarmonieNu 277 \ingroup NTools 278 \anchor HarmonieNu 279 \verbatim 280 Analyse harmonique: 281 f(t) = par(1) + Sum[par(2k) *cos(2*pi*k*par(0)*(t-t0)] 282 + Sum[par(2k+1)*sin(2*pi*k*par(0)*(t-t0)] 283 la somme Sum porte sur l'indice k qui varie de [1,NHarm()+1] 284 avec la convention k=1 pour le fondamental 285 k>1 pour le (k-1)ieme harmonique 286 par(0) = inverse de la periode (frequence) 287 par(1) = terme constant 288 par(2), par(3) = termes devant le cosinus et le sinus 289 du fondamental 290 par(2(m+1)), par(2(m+1)+1) = termes devant le cosinus 291 et le sinus de l'harmonique m (m>=1). 292 NHarm() = nombre d'harmoniques a fitter. 293 T0() = centrage des temps, ce n'est pas un parametre du fit. 294 `Conseil:' Avant de faire un fit avec les `NHarm()' 295 harmoniques, il est preferable de faire un pre-fit 296 ou seuls les parametres 1,2 et 3 sont libres et d'injecter 297 le resultat du fit sur ces 3 parametres comme valeurs 298 de depart pour le fit global avec les `NHarm()' harmoniques. 299 De toute facon, le fit ne marchera que si la periode 300 est initialisee de facon tres precise. 301 \endverbatim 302 */ 342 303 HarmonieNu::HarmonieNu(unsigned int nharm,double t0) 343 //344 // Createur.345 //--346 304 : GeneralFunction(1,4+2*nharm), NHarm(nharm), T0(t0) 347 305 { … … 384 342 385 343 ///////////////////////////////////////////////////////////////// 386 //++ 387 // Titre HarmonieT 388 // \index{HarmonieT} 389 // 390 //| Analyse harmonique: 391 //| f(t) = par(1) + Sum[par(2k) *cos(2*pi*k*(t-t0)/par(0)] 392 //| + Sum[par(2k+1)*sin(2*pi*k*(t-t0)/par(0)] 393 //| la somme Sum porte sur l'indice k qui varie de [1,NHarm()+1] 394 //| avec la convention k=1 pour le fondamental 395 //| k>1 pour le (k-1)ieme harmonique 396 //-- 397 //++ 398 //| par(0) = periode 399 //| par(1) = terme constant 400 //| par(2), par(3) = termes devant le cosinus et le sinus 401 //| du fondamental 402 //| par(2(m+1)), par(2(m+1)+1) = termes devant le cosinus 403 //| et le sinus de l'harmonique m (m>=1). 404 //| NHarm() = nombre d'harmoniques a fitter. 405 //| T0() = centrage des temps, ce n'est pas un parametre du fit. 406 //-- 407 ///////////////////////////////////////////////////////////////// 408 409 //++ 344 /*! 345 \class SOPHYA::HarmonieT 346 \ingroup NTools 347 \anchor HarmonieT 348 \verbatim 349 Analyse harmonique: 350 f(t) = par(1) + Sum[par(2k) *cos(2*pi*k*(t-t0)/par(0)] 351 + Sum[par(2k+1)*sin(2*pi*k*(t-t0)/par(0)] 352 la somme Sum porte sur l'indice k qui varie de [1,NHarm()+1] 353 avec la convention k=1 pour le fondamental 354 k>1 pour le (k-1)ieme harmonique 355 par(0) = periode 356 par(1) = terme constant 357 par(2), par(3) = termes devant le cosinus et le sinus 358 du fondamental 359 par(2(m+1)), par(2(m+1)+1) = termes devant le cosinus 360 et le sinus de l'harmonique m (m>=1). 361 NHarm() = nombre d'harmoniques a fitter. 362 T0() = centrage des temps, ce n'est pas un parametre du fit. 363 \endverbatim 364 */ 410 365 HarmonieT::HarmonieT(unsigned int nharm,double t0) 411 //412 // Createur.413 //--414 366 : GeneralFunction(1,4+2*nharm), NHarm(nharm), T0(t0) 415 367 { … … 455 407 456 408 ///////////////////////////////////////////////////////////////// 457 //++ 458 // Module Classes de fonctions 2D 459 // Lib Outils++ 460 // include fct1dfit.h 461 //-- 462 ///////////////////////////////////////////////////////////////// 463 464 ///////////////////////////////////////////////////////////////// 465 //++ 466 // Titre Polyn2D 467 // \index{Polyn2D} 468 // 469 //| polynome 2D de degre total degre: 470 //| NDegPol = degre du polynome (note N dans la suite) 471 //| x = x - X_Center, y = y - Y_Center 472 //| f(x,y) = p[0] +sum(k=1,n){ sum(i=0,k){ p[ki]*x^i*y^(k-i) }} 473 //| Il y a k+1 termes de degre k (ex: x^i*y^(k-i)) 474 //| terme de degre k avec x^i: p[ki] avec ki = k*(k+1)/2 + i 475 //| C'est a dire: 476 //| deg0: p0 477 //| deg1: + p1*y + p2*x 478 //| deg2: + p3*y^2 + p4*x*y + p5*x^2 479 //| deg3: + p6*y^3 + p7*x*y^2 + p8*x^2*y + p9*x^3 480 //| deg4: + p10*y^4 + p11*x*y^3 + p12*x^2*y^2 + p13*x^3*y + p14*x^4 481 //| deg5: + p15*y^5 + ... ... + ... + p20*x^5 482 //| ... 483 //| degk: + p[k*(k+1)/2]*y^k + ... ... + p[k*(k+3)/2]*x^k 484 //| ... 485 //| degn: + p[n*(n+1)/2]*y^n + ... ... + p[n*(n+3)/2]*x^n 486 //-- 487 ///////////////////////////////////////////////////////////////// 488 489 //++ 409 /*! 410 \class SOPHYA::Polyn2D 411 \ingroup NTools 412 \anchor Polyn2D 413 \verbatim 414 polynome 2D de degre total degre: 415 NDegPol = degre du polynome (note N dans la suite) 416 x = x - X_Center, y = y - Y_Center 417 f(x,y) = p[0] +sum(k=1,n){ sum(i=0,k){ p[ki]*x^i*y^(k-i) }} 418 Il y a k+1 termes de degre k (ex: x^i*y^(k-i)) 419 terme de degre k avec x^i: p[ki] avec ki = k*(k+1)/2 + i 420 C'est a dire: 421 deg0: p0 422 deg1: + p1*y + p2*x 423 deg2: + p3*y^2 + p4*x*y + p5*x^2 424 deg3: + p6*y^3 + p7*x*y^2 + p8*x^2*y + p9*x^3 425 deg4: + p10*y^4 + p11*x*y^3 + p12*x^2*y^2 + p13*x^3*y + p14*x^4 426 deg5: + p15*y^5 + ... ... + ... + p20*x^5 427 ... 428 degk: + p[k*(k+1)/2]*y^k + ... ... + p[k*(k+3)/2]*x^k 429 ... 430 degn: + p[n*(n+1)/2]*y^n + ... ... + p[n*(n+3)/2]*x^n 431 \endverbatim 432 */ 490 433 Polyn2D::Polyn2D(unsigned int ndegpol,double x0,double y0) 491 //492 // Createur.493 //--494 434 : GeneralFunction(2,ndegpol*(ndegpol+3)/2+1), NDegPol(ndegpol), X_Center(x0), Y_Center(y0) 495 435 { -
trunk/SophyaLib/NTools/fct1dfit.h
r552 r926 11 11 12 12 ////////////////////////////////////////////////////////////////// 13 //! Gaussienne + polynome 13 14 class Gauss1DPol : public GeneralFunction { 14 15 public: … … 28 29 29 30 ////////////////////////////////////////////////////////////////// 31 //! Gaussienne_Normalisee+polynome 30 32 class GaussN1DPol : public GeneralFunction { 31 33 public: … … 45 47 46 48 ////////////////////////////////////////////////////////////////// 49 //! Exponentielle + polynome 47 50 class Exp1DPol : public GeneralFunction { 48 51 public: … … 63 66 64 67 ////////////////////////////////////////////////////////////////// 68 //! polynome 1D 65 69 class Polyn1D : public GeneralFunction { 66 70 public: … … 80 84 81 85 ////////////////////////////////////////////////////////////////// 86 //! Analyse harmonique 82 87 class HarmonieNu : public GeneralFunction { 83 88 public: … … 98 103 99 104 ////////////////////////////////////////////////////////////////// 105 //! Analyse harmonique 100 106 class HarmonieT : public GeneralFunction { 101 107 public: … … 120 126 121 127 ////////////////////////////////////////////////////////////////// 128 //! polynome 2D 122 129 class Polyn2D : public GeneralFunction { 123 130 public: -
trunk/SophyaLib/NTools/fct2dfit.cc
r514 r926 22 22 23 23 ///////////////////////////////////////////////////////////////// 24 //++ 25 // Class GeneralPSF2D 26 // Lib Outils++ 27 // include fct2dfit.h 28 // 29 // Classe de definition d'une PSF 2D a nPar parametres 30 // Pour definir une PSF, il faut creer une classe qui herite 31 // de ``GeneralPSF2D'' (cf par exemple GauRho2D...). 32 // La disposition des parametres definissant la PSF est indifferente, 33 // toutefois il est conseille de suivre l'ordre: 34 //-- 35 //++ 36 // - PSF 2D a NPar parametres: 37 // p[0] = Volume (ou hauteur) 38 // p[1] = centre X0, p[2] = centre Y0 39 // p[3] = SigmaX , p[4] = SigmaY, p[5] = Rho 40 // p[6],p[7],... = autres parametres (eventuels) definissant la PSF. 41 // (ex: pour la Moffat p[6] = exposant Beta et NPar=8). 42 // p[NPar-1] = Fond 43 //-- 44 //++ 45 // L'emploi de certaines classes comme par exemple ``GenMultiPSF2D'' 46 // necessite de suivre rigoureusement l'ordre indique ci-dessus 47 // pour les parametres. 48 //-- 49 50 //++ 24 /*! 25 \class SOPHYA::GeneralPSF2D 26 \ingroup NTools 27 \anchor GeneralPSF2D 28 Classe de definition d'une PSF 2D a nPar parametres 29 Pour definir une PSF, il faut creer une classe qui herite 30 de ``GeneralPSF2D'' (cf par exemple GauRho2D...). 31 La disposition des parametres definissant la PSF est indifferente, 32 toutefois il est conseille de suivre l'ordre: 33 \verbatim 34 - PSF 2D a NPar parametres: 35 p[0] = Volume (ou hauteur) 36 p[1] = centre X0, p[2] = centre Y0 37 p[3] = SigmaX , p[4] = SigmaY, p[5] = Rho 38 p[6],p[7],... = autres parametres (eventuels) definissant la PSF. 39 (ex: pour la Moffat p[6] = exposant Beta et NPar=8). 40 p[NPar-1] = Fond 41 \endverbatim 42 L'emploi de certaines classes comme par exemple ``GenMultiPSF2D'' 43 necessite de suivre rigoureusement l'ordre indique ci-dessus 44 pour les parametres. 45 */ 46 51 47 GeneralPSF2D::GeneralPSF2D(unsigned int nPar) 52 //53 //--54 48 : GeneralFunction(2,nPar), VolEps(1.e-4) 55 49 { … … 61 55 } 62 56 63 //++ 57 /*! 58 \verbatim 59 ValueH = hauteur*forme(x,y)+fond tq forme(0,0)=1. 60 alors que Value = volume*forme(x,y)+fond tq volume(forme)=1. 61 Dans notre convention le dernier parametre est le fond, 62 le premier le volume et les 2 suivants le centrage x0,y0 63 ---> Ici parm[0] = hauteur 64 \endverbatim 65 */ 64 66 double GeneralPSF2D::ValueH(double const xp[], double const* parm) 65 //66 //| ValueH = hauteur*forme(x,y)+fond tq forme(0,0)=1.67 //| alors que Value = volume*forme(x,y)+fond tq volume(forme)=1.68 //| Dans notre convention le dernier parametre est le fond,69 //| le premier le volume et les 2 suivants le centrage x0,y070 //| ---> Ici parm[0] = hauteur71 //--72 67 { 73 68 double x0[2]; … … 82 77 } 83 78 84 //++ 79 /*! 80 \verbatim 81 Cette fonction calcule le volume d'une PSF de hauteur=1 82 avec une precision de "VolEps" 83 dans le but de connaitre le coefficient permettant 84 de convertir le volume d'une PSF en son amplitude 85 ou vice-versa: " volume = VolPSF * hauteur " 86 L'integration se fait 1/4 de pixel par 1/4 de pixel 87 ATTENTION: Il s'agit de PSF donc x,y,x0,y0,Sigma.. sont en pixels 88 \endverbatim 89 */ 85 90 double GeneralPSF2D::VolPSF(double const* parm) 86 //87 //| Cette fonction calcule le volume d'une PSF de hauteur=188 //| avec une precision de "VolEps"89 //| dans le but de connaitre le coefficient permettant90 //| de convertir le volume d'une PSF en son amplitude91 //| ou vice-versa: " volume = VolPSF * hauteur "92 //| L'integration se fait 1/4 de pixel par 1/4 de pixel93 //| ATTENTION: Il s'agit de PSF donc x,y,x0,y0,Sigma.. sont en pixels94 //--95 91 { 96 92 double x[2],step; … … 135 131 } 136 132 137 // ++133 //! Definition des defauts des parametres 138 134 void GeneralPSF2D::DefaultParam(double *parm) 139 //140 // Definition des defauts des parametres141 //--142 135 { 143 136 for (int i=0; i<mNPar; i++) parm[i] = 0.; … … 145 138 } 146 139 147 // ++140 //! Definition de la precision sur le calcul du volume 148 141 void GeneralPSF2D::SetVolEps(double const prec) 149 //150 // Definition de la precision sur le calcul du volume151 //--152 142 { 153 143 VolEps = prec; … … 159 149 160 150 ///////////////////////////////////////////////////////////////// 161 / /++162 // ClassGenMultiPSF2D163 // Lib Outils++ 164 // include fct2dfit.h 165 // 166 // Classe de definition d'un ensemble de PSF2D 167 // pour fiter simultanement plusieurs etoiles et un fond constant. 168 // Les parametres de forme de la PSF (Sx, Sy, Rho etc... et Fond) 169 // sont les memes pour toutes les etoiles, seuls le centre 170 // (X0,Y0) et le volume (ou la hauteur) V varient pour chaque etoile. 171 // La disposition des parametres definissant la PSF generique 172 // est obligatoirement la suivante: 173 //-- 174 //++ 175 //| - PSF 2D a NPar parametres: 176 //| p[0] = Volume (ou hauteur) 177 //| p[1] = centre X0, p[2] = centre Y0 178 //| p[3] = SigmaX , p[4] = SigmaY, p[5] = Rho 179 //| p[6],p[7],... = autres parametres (eventuels) definissant la PSF. 180 //| (ex: pour la Moffat p[6] = exposant Beta et NPar=8). 181 //| p[NPar-1] = Fond 182 //| 183 //-- 184 //++ 185 //| - La Multi-PSF a ses parametres arranges dans l'ordre suivant: 186 //| Soit NStar le nombre d'etoiles a fiter simultanement 187 //| NP = le nombre de parametres de la PSF 2D generique188 //| On a NF = NP-7 parametres de forme supplementaires 189 //| (ex: nf=0 pour GauRho2D, nf=1 pour MofRho2D) 190 //| p[0],p[1],p[2] = V0,X0,Y0 pour la premiere etoile 191 //| p[3],p[4],p[5] = V1,X1,Y1 pour la deuxieme etoile 192 //| ... 193 //| p[3*i],p[3*i+1],p[3*i+2] = Vi,Xi,Yi pour la (i+1) ieme etoile 194 //| ... 195 //| p[m*i],p[m*i+1],p[m*i+2] = Vm,Xm,Ym ; m = NStar-1 196 //| pour la NStar ieme et derniere etoile 197 //| p[3*NStar],p[3*NStar+1],p[3*NStar+2] = SigmaX, SigmaY et Rho 198 //| p[3*NStar+3],...,p[3*NStar+2+NF] = parametres de forme 199 //| supplementaires pour definir la PSF 2D 200 / /| p[3*NStar+2+NF+1] = Fond201 //-- 202 203 //++ 151 /*! 152 \class SOPHYA::GenMultiPSF2D 153 \ingroup NTools 154 \anchor GenMultiPSF2D 155 Classe de definition d'un ensemble de PSF2D 156 pour fiter simultanement plusieurs etoiles et un fond constant. 157 Les parametres de forme de la PSF (Sx, Sy, Rho etc... et Fond) 158 sont les memes pour toutes les etoiles, seuls le centre 159 (X0,Y0) et le volume (ou la hauteur) V varient pour chaque etoile. 160 La disposition des parametres definissant la PSF generique 161 est obligatoirement la suivante: 162 \verbatim 163 - PSF 2D a NPar parametres: 164 p[0] = Volume (ou hauteur) 165 p[1] = centre X0, p[2] = centre Y0 166 p[3] = SigmaX , p[4] = SigmaY, p[5] = Rho 167 p[6],p[7],... = autres parametres (eventuels) definissant la PSF. 168 (ex: pour la Moffat p[6] = exposant Beta et NPar=8). 169 p[NPar-1] = Fond 170 171 - La Multi-PSF a ses parametres arranges dans l'ordre suivant: 172 Soit NStar le nombre d'etoiles a fiter simultanement 173 NP = le nombre de parametres de la PSF 2D generique 174 On a NF = NP-7 parametres de forme supplementaires 175 (ex: nf=0 pour GauRho2D, nf=1 pour MofRho2D) 176 p[0],p[1],p[2] = V0,X0,Y0 pour la premiere etoile 177 p[3],p[4],p[5] = V1,X1,Y1 pour la deuxieme etoile 178 ... 179 p[3*i],p[3*i+1],p[3*i+2] = Vi,Xi,Yi pour la (i+1) ieme etoile 180 ... 181 p[m*i],p[m*i+1],p[m*i+2] = Vm,Xm,Ym ; m = NStar-1 182 pour la NStar ieme et derniere etoile 183 p[3*NStar],p[3*NStar+1],p[3*NStar+2] = SigmaX, SigmaY et Rho 184 p[3*NStar+3],...,p[3*NStar+2+NF] = parametres de forme 185 supplementaires pour definir la PSF 2D 186 p[3*NStar+2+NF+1] = Fond 187 \endverbatim 188 */ 189 190 /*! 191 Createur. ``psf2d'' est le nom de la PSF generique a utiliser, 192 et ``nstar'' est le nombre d'etoiles a fiter simultanement. 193 */ 204 194 GenMultiPSF2D::GenMultiPSF2D(GeneralPSF2D* psf2d,unsigned int nstar) 205 //206 // Createur. ``psf2d'' est le nom de la PSF generique a utiliser,207 // et ``nstar'' est le nombre d'etoiles a fiter simultanement.208 //--209 195 : GeneralPSF2D((psf2d!=NULL) ? 3*nstar+4+psf2d->NPar()-7: 0) 210 196 , mPsf2D(psf2d), mNStar(nstar) … … 299 285 300 286 ///////////////////////////////////////////////////////////////// 301 //++ 302 // Module Classes de PSF 2D 303 // Lib Outils++ 304 // include fct2dfit.h 305 //-- 306 ///////////////////////////////////////////////////////////////// 307 308 ///////////////////////////////////////////////////////////////// 309 //++ 310 // Titre GauRho2D 311 // \index{GauRho2D} 312 // 313 //| gaussienne+fond 2D 314 //| Par [0]=vol [1]=x0 [2]=y0 [3]=sigx [4]=sigy [5]=rho [6]=fond 315 //| sigx,sigy,rho = sigma et rho de la gaussienne 316 //| x0,y0 = centre de la gaussienne 317 //| PSF(x,y) = N * exp[ - 1/2 (X**2 + Y**2 -2*rho*X*Y) ] 318 //| avec X = (x-x0)/sigx et Y = (y-y0)/sigy 319 //| N = sqrt(1-rho**2)/(2*Pi*sigx*sigy) 320 //| le volume de cette gaussienne est V=1. 321 //| F(x,y) = Par[0]*PSF(x,y)+Par[6] (volume=Par[0],fond=Par[6]) 322 //-- 323 //++ 324 //| -*- Remarque: De la facon dont est ecrite la PSF gaussienne 325 //| sigx,sigy representent les sigmas des gaussiennes 1D 326 //| qui sont les coupes de la gaussienne 2D pour y=0 et x=0. 327 //| Les moments centres d'ordre 2 sont 328 //| sx = sigx/sqrt(1-ro^2) et sy = sigy/sqrt(1-ro^2) 329 //-- 330 ///////////////////////////////////////////////////////////////// 331 332 //++ 287 /*! 288 \class SOPHYA::GauRho2D 289 \ingroup NTools 290 \anchor GauRho2D 291 \verbatim 292 gaussienne+fond 2D 293 Par [0]=vol [1]=x0 [2]=y0 [3]=sigx [4]=sigy [5]=rho [6]=fond 294 sigx,sigy,rho = sigma et rho de la gaussienne 295 x0,y0 = centre de la gaussienne 296 PSF(x,y) = N * exp[ - 1/2 (X**2 + Y**2 -2*rho*X*Y) ] 297 avec X = (x-x0)/sigx et Y = (y-y0)/sigy 298 N = sqrt(1-rho**2)/(2*Pi*sigx*sigy) 299 le volume de cette gaussienne est V=1. 300 F(x,y) = Par[0]*PSF(x,y)+Par[6] (volume=Par[0],fond=Par[6]) 301 -*- Remarque: De la facon dont est ecrite la PSF gaussienne 302 sigx,sigy representent les sigmas des gaussiennes 1D 303 qui sont les coupes de la gaussienne 2D pour y=0 et x=0. 304 Les moments centres d'ordre 2 sont 305 sx = sigx/sqrt(1-ro^2) et sy = sigy/sqrt(1-ro^2) 306 \endverbatim 307 */ 308 ///////////////////////////////////////////////////////////////// 309 333 310 GauRho2D::GauRho2D() 334 //335 // Createur336 //--337 311 : GeneralPSF2D(7) 338 312 { … … 409 383 410 384 ///////////////////////////////////////////////////////////////// 411 //++ 412 // Titre GauRhInt2D 413 // \index{GauRhInt2D} 414 // 415 //| Cette fonction calcule une approximation a l'integrale d'une 416 //| gaussienne 2D sur un carre de longueur unite (x,y-05 -> x,y+0.5) 417 //-- 418 ///////////////////////////////////////////////////////////////// 419 420 //++ 385 /*! 386 \class SOPHYA::GauRhInt2D 387 \ingroup NTools 388 \anchor GauRhInt2D 389 \verbatim 390 Cette fonction calcule une approximation a l'integrale d'une 391 gaussienne 2D sur un carre de longueur unite (x,y-05 -> x,y+0.5) 392 \endverbatim 393 \sa GauRho2D 394 */ 395 ///////////////////////////////////////////////////////////////// 396 421 397 GauRhInt2D::GauRhInt2D() 422 //423 // Createur424 //--425 398 : GeneralPSF2D(7) 426 399 { … … 519 492 520 493 ///////////////////////////////////////////////////////////////// 521 //++ 522 // Titre GdlRho2D 523 // \index{GdlRho2D} 524 // 525 //| Cette fonction calcule une gaussienne 2D de volume 1 approchee 526 //| par son developpement limite au 3ieme ordre (see dophot) 527 //| Meme commentaire que GauRho2D, cf plus haut sauf que: 528 //| Par [0]=vol [1]=x0 [2]=y0 [3]=sigx [4]=sigy [5]=rho [6]=fond 529 //| z**2 = 1/2 (X**2 + Y**2 -2*rho*X*Y) 530 //| PSF(x,y) = N / [ 1 + z**2 + B4/2 *z**4 + B6/6 *z**6 ] 531 //| N = KB4B6 532 //| le coefficient KB4B6 etant trop dur a calculer analytiquement 533 //| Il doit etre calcule numeriquement et entre dans ce programme 534 //| ATTENTION: dans cette routine B4 et B6 sont imposes et pas fites! 535 //| - DL de la gaussienne: B4=1., B6=1., KB4B6=0.13688679 536 //| le volume de cette gaussienne est V=1. 537 //| F(x,y) = Par[0]*PSF(x,y)+Par[6] (volume=Par[0],fond=Par[6]) 538 //-- 539 ///////////////////////////////////////////////////////////////// 540 541 //++ 494 /*! 495 \class SOPHYA::GdlRho2D 496 \ingroup NTools 497 \anchor GdlRho2D 498 \verbatim 499 Cette fonction calcule une gaussienne 2D de volume 1 approchee 500 par son developpement limite au 3ieme ordre (see dophot) 501 Meme commentaire que GauRho2D, cf plus haut sauf que: 502 Par [0]=vol [1]=x0 [2]=y0 [3]=sigx [4]=sigy [5]=rho [6]=fond 503 z**2 = 1/2 (X**2 + Y**2 -2*rho*X*Y) 504 PSF(x,y) = N / [ 1 + z**2 + B4/2 *z**4 + B6/6 *z**6 ] 505 N = KB4B6 506 le coefficient KB4B6 etant trop dur a calculer analytiquement 507 Il doit etre calcule numeriquement et entre dans ce programme 508 ATTENTION: dans cette routine B4 et B6 sont imposes et pas fites! 509 - DL de la gaussienne: B4=1., B6=1., KB4B6=0.13688679 510 le volume de cette gaussienne est V=1. 511 F(x,y) = Par[0]*PSF(x,y)+Par[6] (volume=Par[0],fond=Par[6]) 512 \endverbatim 513 */ 514 ///////////////////////////////////////////////////////////////// 515 542 516 GdlRho2D::GdlRho2D() 543 //544 // Createur545 //--546 517 : GeneralPSF2D(7) 547 518 { … … 617 588 618 589 ///////////////////////////////////////////////////////////////// 619 / /++620 // TitreGdlRhInt2D621 // \index{GdlRhInt2D} 622 // 623 // fonction integree deGdlRho2d624 //-- 625 /////////////////////////////////////////////////////////////////626 627 //++ 590 /*! 591 \class SOPHYA::GdlRhInt2D 592 \ingroup NTools 593 \anchor GdlRhInt2D 594 Fonction integree de GdlRho2d 595 \sa GdlRho2D 596 */ 597 ///////////////////////////////////////////////////////////////// 598 628 599 GdlRhInt2D::GdlRhInt2D() 629 //630 // Createur631 //--632 600 : GeneralPSF2D(7) 633 601 { … … 732 700 733 701 ///////////////////////////////////////////////////////////////// 734 //++ 735 // Titre Gdl1Rho2D 736 // \index{Gdl1Rho2D} 737 // 738 //| Cette fonction calcule une gaussienne 2D approchee 739 //| par son developpement limite au 2sd ordre (see dophot) 740 //| Meme commentaire que GauRho2D, cf plus haut sauf que: 741 //| z**2 = 1/2 (X**2 + Y**2 -2*rho*X*Y) 742 //| PSF(x,y) = N / [ 1 + z**2 + B4/2 *z**4 ] 743 //| Le coefficient B4 est fitte (6ieme parametres) 744 //| ATTENTION: les normalisations N dependent de B4 745 //| 1-/ B4 est suppose etre toujours positif pour que la PSF tendent 746 //| vers 0+ quand z2 tend vers l'infini 747 //| 2-/ Il y a 3 cas de calcul de K(B4) = int(PSF(x,y)) de 0 a l'infini 748 //| 0<B4<1/2, 1/2<B4, et B4=1/2 749 //| mais pour des raisons d'analyse 750 //| numerique j'ai pris 3 intervalles: 751 //| 0.<B4<0.499, 0.501<B4, 0.499<=B4<=0.501 752 //| dans le 3ieme intervalle, comme K est continue est derivable 753 //| en B4=1/2, j'ai represente K par la droite tangeante 754 //| ce qui, apres verification dans paw est une tres bonne approx. 755 //| (je tiens les calculs a disposition.. me demander) 756 //| Par [0]=vol [1]=x0 [2]=y0 [3]=sigx [4]=sigy [5]=rho [6]=B4 [7]=fond 757 //| F(x,y) = Par[0]*PSF(x,y)+Par[7] 758 //-- 759 ///////////////////////////////////////////////////////////////// 760 761 //++ 702 /*! 703 \class SOPHYA::Gdl1Rho2D 704 \ingroup NTools 705 \anchor Gdl1Rho2D 706 \verbatim 707 Cette fonction calcule une gaussienne 2D approchee 708 par son developpement limite au 2sd ordre (see dophot) 709 Meme commentaire que GauRho2D, cf plus haut sauf que: 710 z**2 = 1/2 (X**2 + Y**2 -2*rho*X*Y) 711 PSF(x,y) = N / [ 1 + z**2 + B4/2 *z**4 ] 712 Le coefficient B4 est fitte (6ieme parametres) 713 ATTENTION: les normalisations N dependent de B4 714 1-/ B4 est suppose etre toujours positif pour que la PSF tendent 715 vers 0+ quand z2 tend vers l'infini 716 2-/ Il y a 3 cas de calcul de K(B4) = int(PSF(x,y)) de 0 a l'infini 717 0<B4<1/2, 1/2<B4, et B4=1/2 718 mais pour des raisons d'analyse 719 numerique j'ai pris 3 intervalles: 720 0.<B4<0.499, 0.501<B4, 0.499<=B4<=0.501 721 dans le 3ieme intervalle, comme K est continue est derivable 722 en B4=1/2, j'ai represente K par la droite tangeante 723 ce qui, apres verification dans paw est une tres bonne approx. 724 (je tiens les calculs a disposition.. me demander) 725 Par [0]=vol [1]=x0 [2]=y0 [3]=sigx [4]=sigy [5]=rho [6]=B4 [7]=fond 726 F(x,y) = Par[0]*PSF(x,y)+Par[7] 727 \endverbatim 728 */ 729 ///////////////////////////////////////////////////////////////// 730 762 731 Gdl1Rho2D::Gdl1Rho2D() 763 //764 // Createur765 //--766 732 : GeneralPSF2D(8) 767 733 { … … 894 860 895 861 ///////////////////////////////////////////////////////////////// 896 / /++897 // TitreGdl1RhInt2D898 // \index{Gdl1RhInt2D} 899 // 900 // fonction integree de Gdl1Rho2D901 //-- 902 /////////////////////////////////////////////////////////////////903 904 //++ 862 /*! 863 \class SOPHYA::Gdl1RhInt2D 864 \ingroup NTools 865 \anchor Gdl1RhInt2D 866 Fonction integree de Gdl1Rho2D 867 \sa Gdl1Rho2D 868 */ 869 ///////////////////////////////////////////////////////////////// 870 905 871 Gdl1RhInt2D::Gdl1RhInt2D() 906 //907 // Createur908 //--909 872 : GeneralPSF2D(8) 910 873 { … … 1058 1021 1059 1022 ///////////////////////////////////////////////////////////////// 1060 / /++1061 // TitreGdl2Rho2D1062 // \index{Gdl2Rho2D} 1063 // 1064 //| Cette fonction calcule une gaussienne 2D de hauteur 1 approchee 1065 //| par son developpement limite ordre 3 (see dophot) 1066 //| Meme commentaire que GauRho2D, cf plus haut sauf que: 1067 //| z**2 = 1/2 (X**2 + Y**2 -2*rho*X*Y) 1068 //| Z**2 = B2*z2 1069 //| PSF(x,y) = h / [ 1 + Z**2 + B4**2/2 *Z**4 + B6**2/6 *Z**6 ] 1070 //| B2,B4,B6 peuvent etre fittes 1071 //| - DL de la gaussienne: B2=B4=B6=1. 1072 //| Par [0]=hauteur [1]=x0 [2]=y0 [3]=sigx [4]=sigy [5]=rho 1073 //| [6]=B4 [7]=B6 [8]=B2 [9]= fond 1074 //| F(x,y) = Par[0]*PSF(x,y)+Par[9] 1075 //-- 1076 ///////////////////////////////////////////////////////////////// 1077 1078 1079 //++ 1023 /*! 1024 \class SOPHYA::Gdl2Rho2D 1025 \ingroup NTools 1026 \anchor Gdl2Rho2D 1027 \verbatim 1028 Cette fonction calcule une gaussienne 2D de hauteur 1 approchee 1029 par son developpement limite ordre 3 (see dophot) 1030 Meme commentaire que GauRho2D, cf plus haut sauf que: 1031 z**2 = 1/2 (X**2 + Y**2 -2*rho*X*Y) 1032 Z**2 = B2*z2 1033 PSF(x,y) = h / [ 1 + Z**2 + B4**2/2 *Z**4 + B6**2/6 *Z**6 ] 1034 B2,B4,B6 peuvent etre fittes 1035 - DL de la gaussienne: B2=B4=B6=1. 1036 Par [0]=hauteur [1]=x0 [2]=y0 [3]=sigx [4]=sigy [5]=rho 1037 [6]=B4 [7]=B6 [8]=B2 [9]= fond 1038 F(x,y) = Par[0]*PSF(x,y)+Par[9] 1039 \endverbatim 1040 */ 1041 ///////////////////////////////////////////////////////////////// 1042 1080 1043 Gdl2Rho2D::Gdl2Rho2D() 1081 //1082 // Createur1083 //--1084 1044 : GeneralPSF2D(10) 1085 1045 { … … 1163 1123 1164 1124 ///////////////////////////////////////////////////////////////// 1165 / /++1166 // TitreGdl2RhInt2D1167 // \index{Gdl2RhInt2D} 1168 // 1169 // fonction integree de Gdl2Rho2d1170 //-- 1171 /////////////////////////////////////////////////////////////////1172 1173 //++ 1125 /*! 1126 \class SOPHYA::Gdl2RhInt2D 1127 \ingroup NTools 1128 \anchor Gdl2RhInt2D 1129 Fonction integree de Gdl2Rho2d 1130 \sa Gdl2Rho2D 1131 */ 1132 ///////////////////////////////////////////////////////////////// 1133 1174 1134 Gdl2RhInt2D::Gdl2RhInt2D() 1175 //1176 // Createur1177 //--1178 1135 : GeneralPSF2D(10) 1179 1136 { … … 1282 1239 1283 1240 ///////////////////////////////////////////////////////////////// 1284 //++ 1285 // Titre MofRho2D 1286 // \index{MofRho2D} 1287 // 1288 //| Cette fonction calcule une Moffat 2D 1289 //| Par [0]=hauteur [1]=x0 [2]=y0 [3]=sigx [4]=sigy [5]=rho 1290 //| [6]=Gm [7]= fond 1291 //| PSF(x,y) = valeur de la Moffat normalisee a un volume = 1 1292 //| PSF(x,y) = N / [ 1. + 0.5*(X**2 + Y**2 -2*rho*X*Y) ]**Gm 1293 //| avec X = (x-x0)/sigx et Y = (y-y0)/sigy et Gm>1 1294 //| N = (1-Gm)*sqrt(1-rho**2)/(2*Pi*sigx*sigy) 1295 //| le volume de cette Moffat est V=1. 1296 //| F(x,y) = Par[0]*PSF(x,y)+Par[7] 1297 //-- 1298 ///////////////////////////////////////////////////////////////// 1299 1300 //++ 1241 /*! 1242 \class SOPHYA::MofRho2D 1243 \ingroup NTools 1244 \anchor MofRho2D 1245 \verbatim 1246 Cette fonction calcule une Moffat 2D 1247 Par [0]=hauteur [1]=x0 [2]=y0 [3]=sigx [4]=sigy [5]=rho 1248 [6]=Gm [7]= fond 1249 PSF(x,y) = valeur de la Moffat normalisee a un volume = 1 1250 PSF(x,y) = N / [ 1. + 0.5*(X**2 + Y**2 -2*rho*X*Y) ]**Gm 1251 avec X = (x-x0)/sigx et Y = (y-y0)/sigy et Gm>1 1252 N = (1-Gm)*sqrt(1-rho**2)/(2*Pi*sigx*sigy) 1253 le volume de cette Moffat est V=1. 1254 F(x,y) = Par[0]*PSF(x,y)+Par[7] 1255 \endverbatim 1256 */ 1257 ///////////////////////////////////////////////////////////////// 1258 1301 1259 MofRho2D::MofRho2D() 1302 //1303 // Createur1304 //--1305 1260 : GeneralPSF2D(8) 1306 1261 { … … 1381 1336 1382 1337 ///////////////////////////////////////////////////////////////// 1383 / /++1384 // TitreMofRhInt2D1385 // \index{MofRhInt2D} 1386 // 1387 // fonction integree de MofRho2d1388 //-- 1389 /////////////////////////////////////////////////////////////////1390 1391 //++ 1338 /*! 1339 \class SOPHYA::MofRhInt2D 1340 \ingroup NTools 1341 \anchor MofRhInt2D 1342 Fonction integree de MofRho2d 1343 \sa MofRho2D 1344 */ 1345 ///////////////////////////////////////////////////////////////// 1346 1392 1347 MofRhInt2D::MofRhInt2D() 1393 //1394 // Createur1395 //--1396 1348 : GeneralPSF2D(8) 1397 1349 { … … 1512 1464 1513 1465 ///////////////////////////////////////////////////////////////// 1514 //++ 1515 // Titre X2-GauRho2D 1516 // \index{X2-GauRho2D} 1517 // 1518 // Chi2 pour une Gaussienne+fond 2D (voir detail dans GauRho2D). 1519 //-- 1520 ///////////////////////////////////////////////////////////////// 1521 1522 //++ 1523 // X2-GauRho2D::X2-GauRho2D() 1524 // Createur 1525 //-- 1466 /*! 1467 \class SOPHYA::X2_GauRho2D 1468 \ingroup NTools 1469 \anchor X2_GauRho2D 1470 Chi2 pour une Gaussienne+fond 2D (voir detail dans GauRho2D). 1471 */ 1472 ///////////////////////////////////////////////////////////////// 1473 1526 1474 X2_GauRho2D::X2_GauRho2D() 1527 1475 : GeneralXi2(7) -
trunk/SophyaLib/NTools/fct2dfit.h
r552 r926 10 10 //================================================================ 11 11 12 //! Classe de definition d'une PSF 2D a nPar parametres 12 13 class GeneralPSF2D : public GeneralFunction { 13 14 public: … … 28 29 //================================================================ 29 30 31 //! Classe de definition d'un ensemble de PSF2D 30 32 class GenMultiPSF2D : public GeneralPSF2D { 31 33 public: … … 51 53 52 54 ////////////////////////////////////////////////////////////////// 55 //! gaussienne + fond 2D 53 56 class GauRho2D : public GeneralPSF2D { 54 57 public: … … 64 67 65 68 ////////////////////////////////////////////////////////////////// 69 //! gaussienne integree + fond 2D 66 70 class GauRhInt2D : public GeneralPSF2D { 67 71 public: … … 77 81 78 82 ////////////////////////////////////////////////////////////////// 83 //! gaussienne 2D de volume 1 approchee par dl au 3ieme ordre 79 84 class GdlRho2D : public GeneralPSF2D { 80 85 public: … … 90 95 91 96 ////////////////////////////////////////////////////////////////// 97 //! gaussienne integree 2D de volume 1 approchee par dl au 3ieme ordre 92 98 class GdlRhInt2D : public GeneralPSF2D { 93 99 public: … … 103 109 104 110 ////////////////////////////////////////////////////////////////// 111 //! gaussienne 2D de volume 1 approchee par dl au 2sd ordre 105 112 class Gdl1Rho2D : public GeneralPSF2D { 106 113 public: … … 116 123 117 124 ////////////////////////////////////////////////////////////////// 125 //! gaussienne ontegree 2D de volume 1 approchee par dl au 2sd ordre 118 126 class Gdl1RhInt2D : public GeneralPSF2D { 119 127 public: … … 129 137 130 138 ////////////////////////////////////////////////////////////////// 139 //! gaussienne 2D de hauteur 1 approchee dl 3ieme 131 140 class Gdl2Rho2D : public GeneralPSF2D { 132 141 public: … … 141 150 142 151 ////////////////////////////////////////////////////////////////// 152 //! gaussienne integree 2D de hauteur 1 approchee dl 3ieme 143 153 class Gdl2RhInt2D : public GeneralPSF2D { 144 154 public: … … 153 163 154 164 ////////////////////////////////////////////////////////////////// 165 //! Moffat 2D 155 166 class MofRho2D : public GeneralPSF2D { 156 167 public: … … 166 177 167 178 ////////////////////////////////////////////////////////////////// 179 //! Moffat integree 2D 168 180 class MofRhInt2D : public GeneralPSF2D { 169 181 public: … … 183 195 184 196 ////////////////////////////////////////////////////////////////// 197 //! Chi2 pour une Gaussienne+fond 2D 185 198 class X2_GauRho2D : public GeneralXi2 { 186 199 public: -
trunk/SophyaLib/NTools/generaldata.cc
r914 r926 18 18 // GeneralFitData 19 19 //================================================================ 20 21 /*! 22 \class SOPHYA::GeneralFitData 23 \ingroup NTools 24 Classe de stoquage de donnees a plusieurs variables avec erreur 25 sur l'ordonnee et sur les abscisses (options) : 26 27 \f$ {x0(i),Ex0(i), x1(i),Ex1(i), x2(i),Ex2(i) ... ; Y(i),EY(i)} \f$ 28 \verbatim 29 Pour memoire, structure du rangement (n=mNVar): 30 - Valeur des abscisses mXP (idem pour mErrXP): 31 x0,x1,x2,...,xn x0,x1,x2,...,xn .... x0,x1,x2,....,xn 32 | 1er point | | 2sd point | .... | point mNData | 33 Donc abscisse J=[0,mNVar[ du point numero I=[0,mNData[: mXP[I*mNVar+J] 34 - Valeur de l'ordonnee mF (idem pour mErr et mOK): 35 f f f 36 | 1er point | | 2sd point | .... | point mNData | 37 Donc point numero I [0,mNData[ : mF[i] 38 \endverbatim 39 */ 20 40 21 41 ////////////////////////////////////////////////////////////////////// -
trunk/SophyaLib/NTools/generaldata.h
r914 r926 19 19 //================================================================ 20 20 21 /*! 22 Classe de stoquage de donnees a plusieurs variables avec erreur 23 sur l'ordonnee et sur les abscisses (options) : 24 25 \f$ {x0(i),Ex0(i), x1(i),Ex1(i), x2(i),Ex2(i) ... ; Y(i),EY(i)} \f$ 26 \verbatim 27 Pour memoire, structure du rangement (n=mNVar): 28 - Valeur des abscisses mXP (idem pour mErrXP): 29 x0,x1,x2,...,xn x0,x1,x2,...,xn .... x0,x1,x2,....,xn 30 | 1er point | | 2sd point | .... | point mNData | 31 Donc abscisse J=[0,mNVar[ du point numero I=[0,mNData[: mXP[I*mNVar+J] 32 - Valeur de l'ordonnee mF (idem pour mErr et mOK): 33 f f f 34 | 1er point | | 2sd point | .... | point mNData | 35 Donc point numero I [0,mNData[ : mF[i] 36 \endverbatim 37 */ 38 21 //! Classe de stoquage de donnees a plusieurs variables avec erreur 39 22 class GeneralFitData : public AnyDataObj , public NTupleInterface { 40 23 friend class GeneralFit; -
trunk/SophyaLib/NTools/generalfit.cc
r914 r926 20 20 // GeneralFunction 21 21 //================================================================ 22 23 /*! 24 \class SOPHYA::GeneralFunction 25 \ingroup NTools 26 Classe de fonctions parametrees a plusieurs variables: 27 \f$ F[x1,x2,x3,...:a1,a2,a3,...] \f$ 28 */ 22 29 23 30 ////////////////////////////////////////////////////////////////////// … … 85 92 // GeneralFunc 86 93 //================================================================ 94 95 /*! 96 \class SOPHYA::GeneralFunc 97 \ingroup NTools 98 Classe de fonctions parametrees a plusieurs variables 99 derivant de ``GeneralFunction''. Permet de definir 100 une fonction a fiter sans passer par une classe derivee 101 en utilisant l'ecriture courante du C. La fonction 102 retournant les derivees par rapport aux parametres du fit 103 peut etre egalement fournie (optionnel). 104 */ 87 105 88 106 ///////////////////////////////////////////////////////////////// … … 161 179 //================================================================ 162 180 181 /*! 182 \class SOPHYA::GeneralXi2 183 \ingroup NTools 184 Classe de Xi2 a plusieurs parametres : 185 \f$ Xi2[a1,a2,a3,...] \f$ 186 */ 187 163 188 ////////////////////////////////////////////////////////////////////// 164 189 /*! … … 263 288 // Christophe 8/11/93 La Silla 264 289 // re-codage C++ 16/01/96 Saclay 290 291 /*! 292 \class SOPHYA::GeneralFit 293 \ingroup NTools 294 Classe de fit d'une GeneralFunction sur une GeneralFitData 295 */ 296 265 297 ////////////////////////////////////////////////////////////////////// 266 298 /*! -
trunk/SophyaLib/NTools/generalfit.h
r914 r926 13 13 //================================================================ 14 14 15 16 /*! 17 Classe de fonctions parametrees a plusieurs variables: 18 \f$ F[x1,x2,x3,...:a1,a2,a3,...] \f$ 19 */ 15 //! Classe de fonctions parametrees a plusieurs variables 20 16 class GeneralFunction { 21 17 public: … … 25 21 //! Valeur de la fonction a definir par l'utilisateur (fct virtuelle pure) 26 22 virtual double Value(double const xp[], double const* parm)=0; 23 //! Valeur de la fonction derivee selon les parametres pouvant etre redefinie 27 24 virtual double Val_Der(double const xp[], double const* parm 28 25 , double* DgDpar); … … 48 45 //================================================================ 49 46 50 /*! 51 Classe de fonctions parametrees a plusieurs variables 52 derivant de ``GeneralFunction''. Permet de definir 53 une fonction a fiter sans passer par une classe derivee 54 en utilisant l'ecriture courante du C. La fonction 55 retournant les derivees par rapport aux parametres du fit 56 peut etre egalement fournie (optionnel). 57 */ 47 //! Classe de fonctions parametrees a plusieurs variables type C 58 48 class GeneralFunc : public GeneralFunction { 59 49 public: … … 78 68 class GeneralFitData; 79 69 80 /*! 81 Classe de Xi2 a plusieurs parametres : 82 \f$ Xi2[a1,a2,a3,...] \f$ 83 */ 70 //! Classe de Xi2 a plusieurs parametres 84 71 class GeneralXi2 { 85 72 public: -
trunk/SophyaLib/NTools/ntoolsinit.cc
r757 r926 12 12 #include "datime.h" 13 13 14 /*! 15 \defgroup NTools NTools module 16 This module contains various tools for Sophya. 17 */ 18 14 19 int NToolsInitiator::FgInit = 0; 15 20 21 /*! 22 \class SOPHYA::NToolsInitiator 23 \ingroup NTools 24 Tools initiator 25 */ 16 26 NToolsInitiator::NToolsInitiator() 17 27 : TArrayInitiator() -
trunk/SophyaLib/NTools/ntoolsinit.h
r757 r926 11 11 namespace SOPHYA { 12 12 13 //! Tools initiator 13 14 class NToolsInitiator : public TArrayInitiator { 14 15 private: -
trunk/SophyaLib/TArray/basarr.cc
r894 r926 7 7 #include "pexceptions.h" 8 8 #include "basarr.h" 9 10 /*! 11 \class SOPHYA::BaseArray 12 \ingroup TArray 13 Base class for template arrays 14 No data are connected to this class. 15 16 Define base methods, enum and defaults for TArray , TMatrix and TVector. 17 */ 9 18 10 19 // Variables statiques globales -
trunk/SophyaLib/TArray/basarr.h
r920 r926 21 21 // ------------ classe template Array ----------- 22 22 //! Base class for template arrays 23 /*!24 \class SOPHYA::BaseArray25 \ingroup TArray26 No data are connected to this class.27 28 Define base methods, enum and defaults for TArray , TMatrix and TVector.29 */30 23 class BaseArray : public AnyDataObj { 31 24 public: -
trunk/SophyaLib/TArray/fioarr.cc
r894 r926 11 11 // Les objets delegues pour la gestion de persistance 12 12 // -------------------------------------------------------- 13 /*! 14 \class SOPHYA::FIO_TArray 15 \ingroup TArray 16 Class for persistent management of TArray 17 18 This class manage also persistence for TMatrix and TVector. 19 \sa TArray TMatrix TVector. 20 */ 13 21 /////////////////////////////////////////////////////////// 14 22 -
trunk/SophyaLib/TArray/fioarr.h
r920 r926 16 16 ///////////////////////////////////////////////////////////////////////// 17 17 //! Class for persistent management of TArray 18 /*!19 \class SOPHYA::FIO_TArray20 \ingroup TArray21 This class manage also persistence for TMatrix and TVector.22 \sa TArray TMatrix TVector.23 */24 18 template <class T> 25 19 class FIO_TArray : public PPersist { -
trunk/SophyaLib/TArray/matharr.cc
r894 r926 10 10 // ---------------------------------------------------- 11 11 12 /*! 13 \class SOPHYA::MathArray 14 \ingroup TArray 15 Class for simple mathematical operation on arrays 16 \warning Instanciated only for \b real and \b double (r_4, r_8) type arrays 17 */ 12 18 13 19 //! Apply Function In Place (function double version) -
trunk/SophyaLib/TArray/matharr.h
r920 r926 13 13 14 14 //! Class for simple mathematical operation on arrays 15 /*!16 \class SOPHYA::MathArray17 \ingroup TArray18 \warning Instanciated only for \b real and \b double (r_4, r_8) type arrays19 */20 15 template <class T> 21 16 class MathArray { -
trunk/SophyaLib/TArray/sopemtx.cc
r813 r926 14 14 // ------------------------------------------------------------- 15 15 //////////////////////////////////////////////////////////////// 16 ///////////////////////////////////////////////////////////////////////// 17 // Classe de lignes/colonnes de matrices 18 enum TRCKind {TmatrixRow=0, TmatrixCol=1, TmatrixDiag=2}; 16 17 //! Class of line, column or diagonal of a TMatrix 18 /*! 19 A TMatrixRC represents a line, a column or the diagonal of a TMatrix 20 */ 19 21 template <class T> 20 22 class TMatrixRC { 21 23 public: 24 //! Define type of TMatrixRC 25 enum TRCKind { 26 TmatrixRow=0, //!< TMatrixRC ligne 27 TmatrixCol=1, //!< TMatrixRC column 28 TmatrixDiag=2 //!< TMatrixRC diagonal 29 }; 22 30 TMatrixRC(); 23 31 TMatrixRC(TMatrix<T>& m, TRCKind kind, uint_4 index=0); … … 39 47 static T* Org(const TMatrix<T>&, TRCKind rckind, uint_4 ind=0); 40 48 49 //! Return the kind of TMatrix (line,column,diagonal) 41 50 TRCKind Kind() const { return kind; } 42 51 uint_4 NElts() const; … … 67 76 static void Swap(TMatrixRC<T>& rc1, TMatrixRC<T>& rc2); 68 77 78 //! Define Absolute value for uint_1 69 79 inline static double Abs_Value(uint_1 v) {return (double) v;} 80 //! Define Absolute value for uint_2 70 81 inline static double Abs_Value(uint_2 v) {return (double) v;} 82 //! Define Absolute value for int_2 71 83 inline static double Abs_Value(int_2 v) {return (v>0)? (double) v: (double) -v;} 84 //! Define Absolute value for int_4 72 85 inline static double Abs_Value(int_4 v) {return (v>0)? (double) v: (double) -v;} 86 //! Define Absolute value for int_8 73 87 inline static double Abs_Value(int_8 v) {return (v>0)? (double) v: (double) -v;} 88 //! Define Absolute value for uint_4 74 89 inline static double Abs_Value(uint_4 v) {return (double) v;} 90 //! Define Absolute value for uint_8 75 91 inline static double Abs_Value(uint_8 v) {return (double) v;} 92 //! Define Absolute value for r_4 76 93 inline static double Abs_Value(r_4 v) {return (double) fabsf(v);} 94 //! Define Absolute value for r_8 77 95 inline static double Abs_Value(r_8 v) {return fabs(v);} 78 inline static double Abs_Value(complex<float> v) 96 //! Define Absolute value for complex r_4 97 inline static double Abs_Value(complex<r_4> v) 79 98 {return sqrt(v.real()*v.real()+v.imag()*v.imag());} 80 inline static double Abs_Value(complex<double> v) 99 //! Define Absolute value for complex r_8 100 inline static double Abs_Value(complex<r_8> v) 81 101 {return sqrt(v.real()*v.real()+v.imag()*v.imag());} 82 102 83 103 protected: 84 TMatrix<T>* matrix; 85 T* data; 86 int_4 index; 87 uint_4 step; 88 TRCKind kind; 104 TMatrix<T>* matrix; //!< pointer to the TMatrix 105 T* data; //!< pointer to the beginnig of interesting datas 106 int_4 index; //!< index of the line/column 107 uint_4 step; //!< step of the line/column 108 TRCKind kind; //!< type: line, column or diagonal 89 109 }; 90 110 91 111 92 112 //! Multiply two TMatrixRC 93 113 template <class T> 94 114 inline T operator * (const TMatrixRC<T>& a, const TMatrixRC<T>& b) … … 103 123 } 104 124 105 125 //! Get the step in datas for a TMatrix for type rckind (line/col/diag) 106 126 template <class T> 107 127 inline uint_4 TMatrixRC<T>::Step(const TMatrix<T>& m, TRCKind rckind) … … 111 131 return 0; } 112 132 133 /*! Get the origin of datas for a TMatrix for type rckind and 134 number index (line/col/diag). ex: origine for line "index". */ 113 135 template <class T> 114 136 inline T* TMatrixRC<T>::Org(const TMatrix<T>& m, TRCKind rckind, uint_4 index) … … 118 140 return NULL; } 119 141 142 //! return number of elements for a TMatrixRC 120 143 template <class T> inline uint_4 TMatrixRC<T>::NElts() const 121 144 { if (!matrix) return 0; … … 125 148 return 0; } 126 149 150 //! access of element \b i 127 151 template <class T> 128 152 inline T& TMatrixRC<T>::operator()(uint_4 i) {return data[i*step];} 153 //! access of element \b i 129 154 template <class T> 130 155 inline T TMatrixRC<T>::operator()(uint_4 i) const {return data[i*step];} 131 156 132 157 //////////////////////////////////////////////////////////////// 133 // Typedef pour simplifier et compatibilite Peida158 //! Typedef to simplifier TMatrixRC<r_8> 134 159 typedef TMatrixRC<r_8> MatrixRC; 135 160 136 161 162 //! Default constructor 137 163 template <class T> TMatrixRC<T>::TMatrixRC() 138 164 : matrix(NULL), data(NULL), index(0), step(0) 139 165 {} 140 166 167 //! Constructor 168 /*! 169 \param m : matrix 170 \param rckind : select line, column or diagonal 171 \param ind : number of the line or column 172 */ 141 173 template <class T> TMatrixRC<T>::TMatrixRC(TMatrix<T>& m,TRCKind rckind,uint_4 ind) 142 174 : matrix(&m), data(Org(m,rckind,ind)), … … 150 182 // Acces aux rangees et colonnes de matrices 151 183 184 //! Return TMatrixRC for line \b r of matrix \b m 152 185 template <class T> 153 186 TMatrixRC<T> TMatrixRC<T>::Row(TMatrix<T> & m, uint_4 r) … … 157 190 } 158 191 192 //! Return TMatrixRC for column \b r of matrix \b m 159 193 template <class T> 160 194 TMatrixRC<T> TMatrixRC<T>::Col(TMatrix<T> & m, uint_4 c) … … 164 198 } 165 199 200 //! Return TMatrixRC for diagonal of matrix \b m 166 201 template <class T> 167 202 TMatrixRC<T> TMatrixRC<T>::Diag(TMatrix<T> & m) … … 197 232 // } 198 233 199 234 //! Set column \b c for this TMatrixRC 200 235 template <class T> int_4 TMatrixRC<T>::SetCol(int_4 c) 201 236 { … … 209 244 } 210 245 246 //! Set line \b r for this TMatrixRC 211 247 template <class T> int_4 TMatrixRC<T>::SetRow(int_4 r) 212 248 { … … 220 256 } 221 257 258 //! Set line diaginal for this TMatrixRC 222 259 template <class T> int_4 TMatrixRC<T>::SetDiag() 223 260 { … … 232 269 } 233 270 234 271 //! Operator = 235 272 template <class T> TMatrixRC<T>& TMatrixRC<T>::operator = (const TMatrixRC<T>& rc) 236 273 { … … 271 308 // } 272 309 273 310 //! Operator to multiply by constant \b x 274 311 template <class T> TMatrixRC<T>& TMatrixRC<T>::operator *= (T x) 275 312 { … … 278 315 } 279 316 317 //! Operator to divide by constant \b x 280 318 template <class T> TMatrixRC<T>& TMatrixRC<T>::operator /= (T x) 281 319 { … … 298 336 // } 299 337 338 //! Linear combination 339 /*! 340 Do : \f$ MRC(i) = MRC(i)*a + rc(i)*b \f$ 341 \return *this 342 */ 300 343 template <class T> 301 344 TMatrixRC<T>& TMatrixRC<T>::LinComb(T a, T b, const TMatrixRC<T>& rc, uint_4 first) … … 309 352 } 310 353 354 //! Linear combination 355 /*! 356 Do : \f$ MRC(i) = MRC(i) + rc(i)*b \f$ 357 */ 311 358 template <class T> 312 359 TMatrixRC<T>& TMatrixRC<T>::LinComb(T b, const TMatrixRC<T>& rc, uint_4 first) … … 320 367 } 321 368 369 //! Find maximum absolute value in TMatrixRC, search begin at \b first 322 370 template <class T> uint_4 TMatrixRC<T>::IMaxAbs(uint_4 first) 323 371 { … … 333 381 } 334 382 383 //! Print on stream \b os 335 384 template <class T> 336 385 void TMatrixRC<T>::Print(ostream & os) const … … 346 395 } 347 396 397 //! Swap two TMatrixRC of the same kind 348 398 template <class T> 349 399 void TMatrixRC<T>::Swap(TMatrixRC<T>& rc1, TMatrixRC<T>& rc2) … … 359 409 360 410 361 362 363 411 //////////////////////////////////////////////////////////////// 412 // ------------------------------------------------------------- 413 // La classe de calcul simple sur les TMatrix 414 // ------------------------------------------------------------- 415 //////////////////////////////////////////////////////////////// 416 364 417 //**** Pour inversion 365 418 #ifndef M_LN2 … … 373 426 #endif 374 427 428 //! Gaussian pivoting 429 /*! 430 Diagonalize matrix \b a, doing the same opreations on matrix \b b 431 \return determinat of \b a 432 */ 375 433 template <class T> 376 434 T SimpleMatrixOperation<T>::GausPiv(TMatrix<T>& a, TMatrix<T>& b) … … 394 452 double nrm = sqrt(vmin*vmax); 395 453 if(nrm > 1.e5 || nrm < 1.e-5) { 396 a /= nrm;397 b /= nrm;454 a /= (T) nrm; 455 b /= (T) nrm; 398 456 //cout << "normalisation matrice " << nrm << endl; 399 457 } else nrm=1; 400 458 401 double det = 1.0;459 T det = 1; 402 460 if(nrm != 1) { 403 461 double ld = a.NRows() * log(nrm); … … 405 463 // cerr << "TMatrix warning, overflow for det" << endl; 406 464 } else { 407 det = exp(ld);408 } 409 } 410 411 TMatrixRC<T> pivRowa(a,T matrixRow);412 TMatrixRC<T> pivRowb(b,T matrixRow);465 det = (T) exp(ld); 466 } 467 } 468 469 TMatrixRC<T> pivRowa(a,TMatrixRC<T>::TmatrixRow); 470 TMatrixRC<T> pivRowb(b,TMatrixRC<T>::TmatrixRow); 413 471 414 472 for(uint_4 k=0; k<n-1; k++) { … … 422 480 TMatrixRC<T>::Swap(bIPiv,bK); 423 481 } 424 doublepivot = a(k,k);425 if (fabs(pivot) < 1.e-50) return 0.0;482 T pivot = a(k,k); 483 if( TMatrixRC<T>::Abs_Value(pivot) < 1.e-50 ) return (T) 0; 426 484 //det *= pivot; 427 485 pivRowa.SetRow(k); // to avoid constructors 428 486 pivRowb.SetRow(k); 429 487 for (uint_4 i=k+1; i<n; i++) { 430 doubler = -a(i,k)/pivot;488 T r = -a(i,k)/pivot; 431 489 TMatrixRC<T>::Row(a, i).LinComb(r, pivRowa); // + rapide que -= r * pivRowa 432 490 TMatrixRC<T>::Row(b, i).LinComb(r, pivRowb); … … 437 495 // on remonte 438 496 for(uint_4 kk=n-1; kk>0; kk--) { 439 doublepivot = a(kk,kk);440 if (fabs(pivot) <= 1.e-50) return 0.0;497 T pivot = a(kk,kk); 498 if( TMatrixRC<T>::Abs_Value(pivot) <= 1.e-50 ) return (T) 0; 441 499 pivRowa.SetRow(kk); // to avoid constructors 442 500 pivRowb.SetRow(kk); 443 501 for(uint_4 jj=0; jj<kk; jj++) { 444 doubler = -a(jj,kk)/pivot;502 T r = -a(jj,kk)/pivot; 445 503 TMatrixRC<T>::Row(a, jj).LinComb(r, pivRowa); 446 504 TMatrixRC<T>::Row(b, jj).LinComb(r, pivRowb); … … 449 507 450 508 for(uint_4 l=0; l<n; l++) { 451 if (fabs((double)a(l,l)) <= 1.e-50) return 0.0;509 if( TMatrixRC<T>::Abs_Value(a(l,l)) <= 1.e-50 ) return (T) 0; 452 510 TMatrixRC<T>::Row(b, l) /= a(l,l); 453 511 } … … 456 514 } 457 515 516 //! Return the inverse matrix of \b A 458 517 template <class T> 459 518 TMatrix<T> SimpleMatrixOperation<T>::Inverse(TMatrix<T> const & A) 460 // Inversion461 519 { 462 520 TMatrix<T> a(A); 463 521 TMatrix<T> b(a.NCols(),a.NRows()); b = IdentityMatrix(1.); 464 if( fabs((double)GausPiv(a,b)) < 1.e-50)465 throw(MathExc("TMatrix Inverse() Singular OMatrix"));522 if( TMatrixRC<T>::Abs_Value(GausPiv(a,b)) < 1.e-50) 523 throw(MathExc("TMatrix Inverse() Singular Matrix")); 466 524 return b; 467 525 } 468 526 527 528 //////////////////////////////////////////////////////////////// 529 // ------------------------------------------------------------- 530 // La classe fit lineaire 531 // ------------------------------------------------------------- 532 //////////////////////////////////////////////////////////////// 469 533 470 534 LinFitter::LinFitter() … … 626 690 #pragma define_template TMatrixRC<r_4> 627 691 #pragma define_template TMatrixRC<r_8> 692 #pragma define_template TMatrixRC< complex<r_4> > 693 #pragma define_template TMatrixRC< complex<r_8> > 628 694 #pragma define_template SimpleMatrixOperation<int_4> 629 695 #pragma define_template SimpleMatrixOperation<r_4> 630 696 #pragma define_template SimpleMatrixOperation<r_8> 697 #pragma define_template SimpleMatrixOperation< complex<r_4> > 698 #pragma define_template SimpleMatrixOperation< complex<r_8> > 631 699 #endif 632 700 … … 636 704 template class TMatrixRC<r_4>; 637 705 template class TMatrixRC<r_8>; 706 template class TMatrixRC< complex<r_4> >; 707 template class TMatrixRC< complex<r_8> >; 638 708 template class SimpleMatrixOperation<int_4>; 639 709 template class SimpleMatrixOperation<r_4>; 640 710 template class SimpleMatrixOperation<r_8>; 711 template class SimpleMatrixOperation< complex<r_4> >; 712 template class SimpleMatrixOperation< complex<r_8> >; 641 713 #endif -
trunk/SophyaLib/TArray/sopemtx.h
r850 r926 7 7 #include "tvector.h" 8 8 9 // doivent imperativement reste avant le namespace SOPHYA ! 10 /*! 11 \class SOPHYA::SimpleMatrixOperation 12 \ingroup TArray 13 Class for simple operation on TMatrix 14 \sa TMatrix TArray 15 */ 16 /*! 17 \class SOPHYA::LinFitter 18 \ingroup TArray 19 Class for linear fitting 20 \sa TMatrix TArray 21 */ 22 9 23 namespace SOPHYA { 10 24 11 12 13 25 //////////////////////////////////////////////////////////////// 26 //! Class for simple operation on TMatrix 14 27 template <class T> 15 28 class SimpleMatrixOperation { 16 29 public: 17 // Pivot de Gauss : diagonalise la matrice A, en effectuant les memes18 // operations sur la matrice B19 30 static TMatrix<T> Inverse(TMatrix<T> const & A); 20 31 static T GausPiv(TMatrix<T>& A, TMatrix<T>& B); 21 32 }; 22 33 34 //////////////////////////////////////////////////////////////// 23 35 // Resolution du systeme A*C = B 36 //! Solve A*C = B for C in place and return determinant 37 /*! \ingroup TArray \fn LinSolveInPlace */ 38 inline r_4 LinSolveInPlace(TMatrix<r_4>& a, TVector<r_4>& b) 39 { 40 if(a.NCols() != b.NRows() || a.NCols() != a.NRows()) 41 throw(SzMismatchError("LinSolveInPlace(TMatrix<r_4>,TVector<r_4>) size mismatch")); 42 return SimpleMatrixOperation<r_4>::GausPiv(a,b); 43 } 44 45 //! Solve A*X = B in place and return determinant 46 /*! \ingroup TArray \fn LinSolveInPlace */ 24 47 inline r_8 LinSolveInPlace(TMatrix<r_8>& a, TVector<r_8>& b) 25 48 { … … 29 52 } 30 53 31 // Resolution du systeme A*C = B, avec C retourne dans B 32 inline r_8 LinSolve(const TMatrix<r_8>& a, const TVector<r_8>& b, TVector<r_8>& c) 33 { 54 //! Solve A*X = B in place and return determinant 55 /*! \ingroup TArray \fn LinSolveInPlace */ 56 inline complex<r_4> LinSolveInPlace(TMatrix< complex<r_4> >& a, TVector< complex<r_4> >& b) 57 { 34 58 if(a.NCols() != b.NRows() || a.NCols() != a.NRows()) 35 throw(SzMismatchError("LinSolve(TMatrix<r_8>,TVector<r_8>) size mismatch")); 36 c = b; 37 TMatrix<r_8> a1(a); 38 return SimpleMatrixOperation<r_8>::GausPiv(a1,c); 59 throw(SzMismatchError("LinSolveInPlace(TMatrix< complex<r_4> >,TVector< complex<r_4> >) size mismatch")); 60 return SimpleMatrixOperation< complex<r_4> >::GausPiv(a,b); 39 61 } 40 62 41 inline r_4 LinSolve(const TMatrix<r_4>& a, const TVector<r_4>& b, TVector<r_4>& c) 42 { 63 //! Solve A*X = B in place and return determinant 64 /*! \ingroup TArray \fn LinSolveInPlace */ 65 inline complex<r_8> LinSolveInPlace(TMatrix< complex<r_8> >& a, TVector< complex<r_8> >& b) 66 { 43 67 if(a.NCols() != b.NRows() || a.NCols() != a.NRows()) 44 throw(SzMismatchError("LinSolve(TMatrix<r_4>,TVector<r_4>) size mismatch")); 45 c = b; 46 TMatrix<r_4> a1(a); 47 return SimpleMatrixOperation<r_4>::GausPiv(a1,c); 68 throw(SzMismatchError("LinSolveInPlace(TMatrix< complex<r_8> >,TVector< complex<r_8> >) size mismatch")); 69 return SimpleMatrixOperation< complex<r_8> >::GausPiv(a,b); 48 70 } 49 71 50 // Inverse d'une matrice 51 inline TMatrix<r_8> Inverse(TMatrix<r_8> const & A) 52 { 53 return SimpleMatrixOperation<r_8>::Inverse(A); 72 //////////////////////////////////////////////////////////////// 73 // Resolution du systeme A*C = B, avec C retourne dans B 74 //! Solve A*C = B and return C and determinant 75 /*! \ingroup TArray \fn LinSolve */ 76 inline r_4 LinSolve(const TMatrix<r_4>& a, const TVector<r_4>& b, TVector<r_4>& c) { 77 if(a.NCols()!=b.NRows() || a.NCols()!=a.NRows()) 78 throw(SzMismatchError("LinSolve(TMatrix<r_4>,TVector<r_4>) size mismatch")); 79 c = b; TMatrix<r_4> a1(a); 80 return SimpleMatrixOperation<r_4>::GausPiv(a1,c); 54 81 } 55 82 56 inline TMatrix<r_4> Inverse(TMatrix<r_4> const & A) 57 { 58 return SimpleMatrixOperation<r_4>::Inverse(A); 83 //! Solve A*C = B and return C and determinant 84 /*! \ingroup TArray \fn LinSolve */ 85 inline r_8 LinSolve(const TMatrix<r_8>& a, const TVector<r_8>& b, TVector<r_8>& c) { 86 if(a.NCols()!=b.NRows() || a.NCols()!=a.NRows()) 87 throw(SzMismatchError("LinSolve(TMatrix<r_8>,TVector<r_8>) size mismatch")); 88 c = b; TMatrix<r_8> a1(a); 89 return SimpleMatrixOperation<r_8>::GausPiv(a1,c); 59 90 } 60 91 92 //! Solve A*C = B and return C and determinant 93 /*! \ingroup TArray \fn LinSolve */ 94 inline complex<r_4> LinSolve(const TMatrix< complex<r_4> >& a, const TVector< complex<r_4> >& b, TVector< complex<r_4> >& c) { 95 if(a.NCols()!=b.NRows() || a.NCols()!=a.NRows()) 96 throw(SzMismatchError("LinSolve(TMatrix< complex<r_4> >,TVector< complex<r_4> >) size mismatch")); 97 c = b; TMatrix< complex<r_4> > a1(a); 98 return SimpleMatrixOperation< complex<r_4> >::GausPiv(a1,c); 99 } 100 101 //! Solve A*C = B and return C and determinant 102 /*! \ingroup TArray \fn LinSolve */ 103 inline complex<r_8> LinSolve(const TMatrix< complex<r_8> >& a, const TVector< complex<r_8> >& b, TVector< complex<r_8> >& c) { 104 if(a.NCols()!=b.NRows() || a.NCols()!=a.NRows()) 105 throw(SzMismatchError("LinSolve(TMatrix< complex<r_8> >,TVector< complex<r_8> >) size mismatch")); 106 c = b; TMatrix< complex<r_8> > a1(a); 107 return SimpleMatrixOperation< complex<r_8> >::GausPiv(a1,c); 108 } 109 110 //////////////////////////////////////////////////////////////// 111 // Inverse d'une matrice 112 //! To inverse a TMatrix 113 /*! \ingroup TArray \fn Inverse */ 114 inline TMatrix<r_4> Inverse(TMatrix<r_4> const & A) 115 {return SimpleMatrixOperation<r_4>::Inverse(A);} 116 //! To inverse a TMatrix 117 /*! \ingroup TArray \fn Inverse */ 118 inline TMatrix<r_8> Inverse(TMatrix<r_8> const & A) 119 {return SimpleMatrixOperation<r_8>::Inverse(A);} 120 //! To inverse a TMatrix 121 /*! \ingroup TArray \fn Inverse */ 122 inline TMatrix< complex<r_4> > Inverse(TMatrix< complex<r_4> > const & A) 123 {return SimpleMatrixOperation< complex<r_4> >::Inverse(A);} 124 //! To inverse a TMatrix 125 /*! \ingroup TArray \fn Inverse */ 126 inline TMatrix< complex<r_8> > Inverse(TMatrix< complex<r_8> > const & A) 127 {return SimpleMatrixOperation< complex<r_8> >::Inverse(A);} 61 128 62 129 //-------------------------------------- … … 64 131 //-------------------------------------- 65 132 133 //! Class for linear fitting 66 134 class LinFitter { 67 135 public : -
trunk/SophyaLib/TArray/tarray.cc
r922 r926 9 9 #include "tarray.h" 10 10 11 12 11 /*! 12 \class SOPHYA::TArray 13 \ingroup TArray 14 Class for template arrays 15 16 This class implements arrays of dimensions up to 17 \ref BASEARRAY_MAXNDIMS "BASEARRAY_MAXNDIMS" 18 */ 13 19 14 20 // ------------------------------------------------------- -
trunk/SophyaLib/TArray/tarray.h
r920 r926 24 24 25 25 //! Class for template arrays 26 /*!27 \class SOPHYA::TArray28 \ingroup TArray29 This class implements arrays of dimensions up to30 \ref BASEARRAY_MAXNDIMS "BASEARRAY_MAXNDIMS"31 */32 26 template <class T> 33 27 class TArray : public BaseArray { -
trunk/SophyaLib/TArray/tarrinit.cc
r920 r926 10 10 */ 11 11 12 int TArrayInitiator::FgInit = 0;13 14 12 /*! 15 13 \class SOPHYA::TArrayInitiator … … 17 15 Array Matrices and Vector initiator 18 16 */ 17 18 int TArrayInitiator::FgInit = 0; 19 19 20 TArrayInitiator::TArrayInitiator() 20 21 : SophyaInitiator() -
trunk/SophyaLib/TArray/tarrinit.h
r894 r926 11 11 namespace SOPHYA { 12 12 13 //! Class to initialize the TArray's classes13 //! Array Matrices and Vector initiator 14 14 class TArrayInitiator : public SophyaInitiator { 15 15 private: -
trunk/SophyaLib/TArray/tmatrix.cc
r894 r926 1 // $Id: tmatrix.cc,v 1. 6 2000-04-12 17:42:21ansari Exp $1 // $Id: tmatrix.cc,v 1.7 2000-04-13 18:39:14 ansari Exp $ 2 2 // C.Magneville 04/99 3 3 #include "machdefs.h" … … 7 7 #include "tmatrix.h" 8 8 9 10 9 /*! 10 \class SOPHYA::TMatrix 11 \ingroup TArray 12 Class of matrixes 13 \sa TArray 14 */ 11 15 12 16 //////////////////////////////////////////////////////////////// -
trunk/SophyaLib/TArray/tmatrix.h
r920 r926 9 9 namespace SOPHYA { 10 10 11 //! Class of matrixes 12 /*! 13 \class SOPHYA::TMatrix 14 \ingroup TArray 15 \sa TArray 16 */ 17 11 //! Class of matrices 18 12 template <class T> 19 13 class TMatrix : public TArray<T> { -
trunk/SophyaLib/TArray/triangmtx.h
r920 r926 7 7 #include "pexceptions.h" 8 8 9 // doit etre mis en dehors du namespace 10 /*! 11 \class SOPHYA::TriangularMatrix 12 \ingroup TArray 13 Class for inferior triangular matrix (base class for the class Alm) 14 */ 15 9 16 namespace SOPHYA { 10 17 11 18 //! Class for inferior triangular matrix (base class for the class Alm) 12 /*!13 \class SOPHYA::TriangularMatrix14 \ingroup TArray15 Class for triangular matrices16 */17 19 template <class T> 18 20 class TriangularMatrix { -
trunk/SophyaLib/TArray/tvector.cc
r914 r926 1 // $Id: tvector.cc,v 1. 5 2000-04-13 16:04:49ansari Exp $1 // $Id: tvector.cc,v 1.6 2000-04-13 18:39:16 ansari Exp $ 2 2 // C.Magneville 04/99 3 3 #include "machdefs.h" … … 5 5 #include "pexceptions.h" 6 6 #include "tvector.h" 7 8 /*! 9 \class SOPHYA::TVector 10 \ingroup TArray 11 Class of vector (line or column) 12 \sa TMatrix TArray 13 */ 7 14 8 15 //////////////////////////////////////////////////////////////// -
trunk/SophyaLib/TArray/tvector.h
r920 r926 9 9 10 10 //! Class of vector (line or column) 11 /*!12 \class SOPHYA::TVector13 \ingroup TArray14 \sa TMatrix TArray15 */16 11 template <class T> 17 12 class TVector : public TMatrix<T> { -
trunk/SophyaLib/TArray/utilarr.cc
r894 r926 9 9 10 10 ////////////////////////////////////////////////////////// 11 /*! 12 \class SOPHYA::RandomSequence 13 \ingroup TArray 14 Class to generate a random sequence of values 15 */ 16 11 17 //! Constructor 12 18 /*! … … 32 38 33 39 ////////////////////////////////////////////////////////// 40 /*! 41 \class SOPHYA::Sequence 42 \ingroup TArray 43 Class to generate a sequence of values 44 */ 45 34 46 //! Constructor 35 47 /*! … … 88 100 89 101 ////////////////////////////////////////////////////////// 102 /*! 103 \class SOPHYA::Range 104 \ingroup TArray 105 Class to define a range of indexes 106 */ 107 90 108 //! Constructor 91 109 /*! … … 126 144 127 145 ////////////////////////////////////////////////////////// 146 /*! 147 \class SOPHYA::IdentityMatrix 148 \ingroup TArray 149 Class to define an identity matrix 150 */ 151 128 152 //! Constructor of a (n,n) diagonal matrix with value diag on the diagonal 129 153 IdentityMatrix::IdentityMatrix(double diag, uint_4 n) -
trunk/SophyaLib/TArray/utilarr.h
r920 r926 20 20 ////////////////////////////////////////////////////////// 21 21 //! Class to generate a random sequence of values 22 /*!23 \class SOPHYA::RandomSequence24 \ingroup TArray25 */26 22 class RandomSequence { 27 23 public: … … 42 38 ////////////////////////////////////////////////////////// 43 39 //! Class to generate a sequence of values 44 /*!45 \class SOPHYA::Sequence46 \ingroup TArray47 */48 40 class Sequence { 49 41 public: … … 66 58 ////////////////////////////////////////////////////////// 67 59 //! Class to define a range of indexes 68 /*!69 \class SOPHYA::Range70 \ingroup TArray71 */72 60 class Range { 73 61 public: … … 90 78 ////////////////////////////////////////////////////////// 91 79 //! Class to define an identity matrix 92 /*!93 \class SOPHYA::IdentityMatrix94 \ingroup TArray95 */96 80 class IdentityMatrix { 97 81 public:
Note:
See TracChangeset
for help on using the changeset viewer.