Changeset 914 in Sophya
- Timestamp:
- Apr 13, 2000, 6:04:50 PM (25 years ago)
- Location:
- trunk/SophyaLib
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/HiStats/hisprof.cc
r763 r914 6 6 #include "perrors.h" 7 7 8 //++ 9 // Class HProf 10 // Lib Outils++ 11 // include hisprof.h 12 // 13 // Classe de profil d'histogrammes. 14 //-- 15 16 //++ 17 // Titre Constructeurs 18 //-- 19 20 /********* Methode *********/ 21 //++ 8 9 /********* Methode *********/ 10 /*! 11 Constructeur par defaut. 12 */ 22 13 HProf::HProf() 23 //24 // Constructeur par defaut.25 //--26 14 : Histo() 27 15 , SumY(NULL), SumY2(NULL), SumW(NULL), Ok(false), YMin(1.), YMax(-1.), Opt(0) … … 31 19 32 20 /********* Methode *********/ 33 //++ 21 /*! 22 Constructeur. Histogramme de profil de ``nBin'' bins entre ``xMin'' 23 et ``xMax'' avec coupure d'acceptance sur y entre ``yMin'' et ``yMax''. 24 Si yMin>=yMax alors pas de coupure d'acceptance sur y. 25 Par defaut l'erreur du profil represente la dispersion dans le bin, 26 SetErrOpt(1) permet de demander de calculer l'erreur sur la moyenne. 27 */ 34 28 HProf::HProf(float xMin, float xMax, int nBin, float yMin, float yMax) 35 //36 // Constructeur. Histogramme de profil de ``nBin'' bins entre ``xMin''37 // et ``xMax'' avec coupure d'acceptance sur y entre ``yMin'' et ``yMax''.38 // Si yMin>=yMax alors pas de coupure d'acceptance sur y.39 // Par defaut l'erreur du profil represente la dispersion dans le bin,40 // SetErrOpt(1) permet de demander de calculer l'erreur sur la moyenne.41 //--42 29 : Histo(xMin,xMax,nBin) 43 30 , SumY(new double[nBin]), SumY2(new double[nBin]), SumW(new double[nBin]) … … 50 37 51 38 /********* Methode *********/ 52 //++ 39 /*! 40 Constructeur par copie. 41 */ 53 42 HProf::HProf(const HProf& H) 54 //55 // Constructeur par copie.56 //--57 43 : Histo(H) 58 44 , SumY(new double[H.bins]), SumY2(new double[H.bins]), SumW(new double[H.bins]) … … 66 52 67 53 /********* Methode *********/ 54 /*! 55 Des-allocation 56 */ 68 57 void HProf::Delete() 69 58 { … … 75 64 76 65 /********* Methode *********/ 66 /*! 67 Destructeur 68 */ 77 69 HProf::~HProf() 78 70 { … … 80 72 } 81 73 82 //++ 83 // Titre Methodes 84 //-- 85 86 /********* Methode *********/ 87 //++ 74 /********* Methode *********/ 75 /*! 76 Remise a zero 77 */ 88 78 void HProf::Zero() 89 //90 // Remise a zero91 //--92 79 { 93 80 memset(SumY, 0, bins*sizeof(double)); … … 99 86 100 87 /********* Methode *********/ 101 //++ 88 /*! 89 Pour changer l'option de calcul de l'erreur du profile. 90 Si ``spread'' = true alors l'erreur represente la dispersion 91 des donnees dans le bin, si = false elle represente l'erreur 92 sur la moyenne du bin. 93 \verbatim 94 - Pour le bin (j): 95 H(j) = sum(y), E(j) = sum(y^2), L(j) = sum(w) 96 -> s(j) = sqrt(E(j)/L(j) - (H(j)/L(j))^2) dispersion 97 -> e(j) = s(j)/sqrt(L(j)) erreur sur la moyenne 98 spread=true: opt=0 : dispersion des donnees dans le bin = s(j) 99 spread=false: opt=1 : erreur sur la moyenne du bin = e(j) 100 \endverbatim 101 */ 102 102 void HProf::SetErrOpt(bool spread) 103 //104 // Pour changer l'option de calcul de l'erreur du profile.105 // Si ``spread'' = true alors l'erreur represente la dispersion106 // des donnees dans le bin, si = false elle represente l'erreur107 // sur la moyenne du bin.108 //| - Pour le bin (j):109 //| H(j) = sum(y), E(j) = sum(y^2), L(j) = sum(w)110 //| -> s(j) = sqrt(E(j)/L(j) - (H(j)/L(j))^2) dispersion111 //| -> e(j) = s(j)/sqrt(L(j)) erreur sur la moyenne112 //| spread=true: opt=0 : dispersion des donnees dans le bin = s(j)113 //| spread=false: opt=1 : erreur sur la moyenne du bin = e(j)114 //--115 103 { 116 104 int opt = (spread) ? 0 : 1; … … 119 107 120 108 /********* Methode *********/ 121 //++ 109 /*! 110 Pour mettre a jour l'histogramme de profil. 111 Il est important d'appeler cette methode si on veut 112 utiliser les methodes de la classe Histo qui ne sont 113 pas redefinies dans la classe HProf. 114 En effet, pour des raisons de precision la classe 115 HProf travaille avec des tableaux en double precision 116 et seulement au moment ou l'on a besoin de l'histogramme 117 ce dernier est rempli avec les valeurs demandees (moyenne 118 et dispersion/erreur sur la moyenne). 119 */ 122 120 void HProf::UpdateHisto() const 123 //124 // Pour mettre a jour l'histogramme de profil.125 // Il est important d'appeler cette methode si on veut126 // utiliser les methodes de la classe Histo qui ne sont127 // pas redefinies dans la classe HProf.128 // En effet, pour des raisons de precision la classe129 // HProf travaille avec des tableaux en double precision130 // et seulement au moment ou l'on a besoin de l'histogramme131 // ce dernier est rempli avec les valeurs demandees (moyenne132 // et dispersion/erreur sur la moyenne).133 //--134 121 { 135 122 … … 153 140 154 141 /********* Methode *********/ 155 //++ 142 /*! 143 Addition au contenu de l'histo pour abscisse x de la valeur y et poids w 144 */ 156 145 void HProf::Add(float x, float y, float w) 157 //158 // Addition au contenu de l'histo pour abscisse x de la valeur y et poids w159 //--160 146 { 161 147 if(YMax>YMin && (y<YMin || YMax<y)) return; … … 174 160 175 161 /********* Methode *********/ 176 //++ 162 /*! 163 Addition au contenu de l'histo bin numBin de la valeur y poids w 164 */ 177 165 void HProf::AddBin(int numBin, float y, float w) 178 //179 // Addition au contenu de l'histo bin numBin de la valeur y poids w180 //--181 166 { 182 167 if(YMax>YMin && (y<YMin || YMax<y)) return; … … 194 179 195 180 /********* Methode *********/ 196 //++ 181 /*! 182 Operateur H = H1 183 */ 197 184 HProf& HProf::operator = (const HProf& h) 198 //199 //--200 185 { 201 186 if(this == &h) return *this; … … 218 203 219 204 /********* Methode *********/ 220 //++ 205 /*! 206 Operateur H += H1 207 208 Attention dans cette addition il n'y a pas de gestion 209 des YMin et YMax. L'addition est faite meme si les limites 210 en Y de ``a'' sont differentes de celles de ``this''. 211 */ 221 212 HProf& HProf::operator += (const HProf& a) 222 //223 // Attention dans cette addition il n'y a pas de gestion224 // des YMin et YMax. L'addition est faite meme si les limites225 // en Y de ``a'' sont differentes de celles de ``this''.226 //--227 213 { 228 214 if(bins!=a.bins) THROW(sizeMismatchErr); … … 240 226 241 227 /********* Methode *********/ 242 //++ 228 /*! 229 Operateur H = H1 + H2 230 Meme commentaire que pour l'operateur += 231 */ 243 232 HProf operator + (const HProf& a, const HProf& b) 244 //245 // Meme commentaire que pour l'operateur +=246 //--247 233 { 248 234 if (b.NBins()!=a.NBins()) THROW(sizeMismatchErr); … … 250 236 return (c += b); 251 237 } 252 253 // Rappel des inlines functions pour commentaires254 //++255 // inline Histo GetHisto()256 // Retourne l'histogramme de profil.257 //--258 //++259 // inline void GetMean(Vector& v)260 // Retourne le contenu de la moyenne dans le vecteur v261 //--262 //++263 // inline void GetError2(Vector& v)264 // Retourne le contenu au carre de la dispersion/erreur dans le vecteur v265 //--266 //++267 // inline float operator()(int i) const268 // Retourne le contenu du bin i269 //--270 //++271 // inline float Error2(int i) const272 // Retourne le carre de la dispersion/erreur du bin i273 //--274 //++275 // inline float Error(int i) const276 // Retourne la dispersion/erreur du bin i277 //--278 //++279 // inline int Fit(GeneralFit& gfit)280 // Fit du profile par ``gfit''.281 //--282 //++283 // inline Histo* FitResidus(GeneralFit& gfit)284 // Retourne l'Histogramme des residus par ``gfit''.285 //--286 //++287 // inline Histo* FitFunction(GeneralFit& gfit)288 // Retourne l'Histogramme de la fonction fittee par ``gfit''.289 //--290 //++291 // inline void Print(int dyn,float hmin,float hmax,int pflag,int il,int ih)292 // Print, voir detail dans Histo::Print293 //--294 295 238 296 239 /////////////////////////////////////////////////////////// -
trunk/SophyaLib/HiStats/hisprof.h
r763 r914 10 10 namespace SOPHYA { 11 11 12 /*! 13 Classe de profil d'histogrammes. 14 */ 12 15 class HProf : public Histo { 13 16 friend class ObjFileIO<HProf>; … … 28 31 29 32 // Acces a l information 33 //! Retourne l'histogramme de profil. 30 34 inline Histo GetHisto() {if(!Ok) UpdateHisto(); return (Histo) *this;} 35 //! Retourne le contenu de la moyenne dans le vecteur v 31 36 inline void GetMean(Vector& v) {if(!Ok) UpdateHisto(); Histo::GetValue(v);} 37 //! Retourne le contenu au carre de la dispersion/erreur dans le vecteur v 32 38 inline void GetError2(Vector& v) {if(!Ok) UpdateHisto(); Histo::GetError2(v);} 39 //! Retourne le contenu du bin i 33 40 inline float operator()(int i) const {if(!Ok) UpdateHisto(); return data[i];} 41 //! Retourne le carre de la dispersion/erreur du bin i 34 42 inline float Error2(int i) const {if(!Ok) UpdateHisto(); return (float) err2[i];} 43 //! Retourne la dispersion/erreur du bin i 35 44 inline float Error(int i) const 36 45 {if(!Ok) UpdateHisto(); return err2[i]>0. ? (float) sqrt(err2[i]) : 0.f;} … … 42 51 43 52 // Fit 53 //! Fit du profile par ``gfit''. 44 54 inline int Fit(GeneralFit& gfit) 45 55 {if(!Ok) UpdateHisto(); return Histo::Fit(gfit,0);} 56 //! Retourne l'Histogramme des residus par ``gfit''. 46 57 inline Histo FitResidus(GeneralFit& gfit) 47 58 {if(!Ok) UpdateHisto(); return Histo::FitResidus(gfit);} 59 //! Retourne l'Histogramme de la fonction fittee par ``gfit''. 48 60 inline Histo FitFunction(GeneralFit& gfit) 49 61 {if(!Ok) UpdateHisto(); return Histo::FitFunction(gfit);} 50 62 51 63 // Print 64 //! Print, voir detail dans Histo::Print 52 65 inline void Print(int dyn=100,float hmin=1.,float hmax=-1.,int pflag=0,int il=1,int ih=-1) 53 66 {if(!Ok) UpdateHisto(); Histo::Print(dyn,hmin,hmax,pflag,il,ih);} … … 56 69 void Delete(); 57 70 58 double* SumY; 59 double* SumY2; 60 double* SumW; 61 bool Ok; 62 float YMin; 63 float YMax; 64 uint_2 Opt; 71 double* SumY; //!< somme 72 double* SumY2; //!< somme des carres 73 double* SumW; //!< somme des poids 74 bool Ok; //!< true isiupdate fait 75 float YMin; //!< limite minimum Y pour somme 76 float YMax; //!< limite maximum Y pour somme 77 uint_2 Opt; //!< options pour les erreurs 65 78 }; 66 79 -
trunk/SophyaLib/HiStats/histos.cc
r763 r914 1 1 // 2 // $Id: histos.cc,v 1. 1.1.1 2000-03-02 16:51:32ansari Exp $2 // $Id: histos.cc,v 1.2 2000-04-13 16:04:11 ansari Exp $ 3 3 // 4 4 … … 13 13 #include "generalfit.h" 14 14 15 //++ 16 // Class Histo 17 // Lib Outils++ 18 // include histos.h 19 // 20 // Classe d'histogrammes 1D 21 //-- 22 23 //++ 24 // Titre Constructeurs 25 //-- 26 27 /********* Methode *********/ 28 //++ 15 /********* Methode *********/ 16 /*! Constructeur par defaut */ 29 17 Histo::Histo() 30 //31 //--32 18 : data(NULL), err2(NULL), 33 19 under(0), over(0), nHist(0), nEntries(0), … … 39 25 40 26 /********* Methode *********/ 41 / /++27 /*! Constructeur d'un histo de nBin bins allant de xMin a xMax */ 42 28 Histo::Histo(float xMin, float xMax, int nBin) 43 //44 //--45 29 : data(new float[nBin]), err2(NULL), 46 30 under(0), over(0), nHist(0), nEntries(0), … … 53 37 54 38 /********* Methode *********/ 55 / /++39 /*! Constructeur par copie */ 56 40 Histo::Histo(const Histo& H) 57 //58 //--59 41 : data(new float[H.bins]), err2(NULL), 60 42 under(H.under), over(H.over), nHist(H.nHist), nEntries(H.nEntries), … … 71 53 72 54 /********* Methode *********/ 55 /*! Gestion de la des-allocation */ 73 56 void Histo::Delete() 74 57 { … … 81 64 82 65 /********* Methode *********/ 66 /*! Destructeur */ 83 67 Histo::~Histo() 84 68 { … … 86 70 } 87 71 88 //++ 89 // Titre Methodes 90 //-- 91 92 /********* Methode *********/ 93 //++ 72 /********* Methode *********/ 73 /*! 74 Remise a zero 75 */ 94 76 void Histo::Zero() 95 //96 // Remise a zero97 //--98 77 { 99 78 memset(data, 0, bins*sizeof(float)); … … 105 84 106 85 /********* Methode *********/ 107 //++ 86 /*! 87 Pour avoir le calcul des erreurs 88 */ 108 89 void Histo::Errors() 109 //110 // Pour avoir le calcul des erreurs111 //--112 90 { 113 91 if( bins > 0 ) { … … 118 96 119 97 /********* Methode *********/ 120 //++ 98 /*! 99 Operateur egal 100 */ 121 101 Histo& Histo::operator = (const Histo& h) 122 //123 //--124 102 { 125 103 if(this == &h) return *this; … … 145 123 146 124 /********* Methode *********/ 147 //++ 125 /*! 126 Operateur de multiplication par une constante 127 */ 148 128 Histo& Histo::operator *= (double b) 149 //150 //--151 129 { 152 130 double b2 = b*b; … … 162 140 } 163 141 164 //++ 142 /*! 143 Operateur de division par une constante 144 */ 165 145 Histo& Histo::operator /= (double b) 166 //167 //--168 146 { 169 147 if (b==0.) THROW(inconsistentErr); … … 180 158 } 181 159 182 //++ 160 /*! 161 Operateur d'addition d'une constante 162 */ 183 163 Histo& Histo::operator += (double b) 184 //185 //--186 164 { 187 165 for(int i=0;i<bins;i++) data[i] += b; … … 193 171 } 194 172 195 //++ 173 /*! 174 Operateur de soustraction d'une constante 175 */ 196 176 Histo& Histo::operator -= (double b) 197 //198 //--199 177 { 200 178 for(int i=0;i<bins;i++) data[i] -= b; … … 207 185 208 186 /********* Methode *********/ 209 //++ 187 /*! 188 Operateur H2 = H1 * b 189 */ 210 190 Histo operator * (const Histo& a, double b) 211 //212 //--213 191 { 214 192 Histo result(a); … … 216 194 } 217 195 218 //++ 196 /*! 197 Operateur H2 = b * H1 198 */ 219 199 Histo operator * (double b, const Histo& a) 220 //221 //--222 200 { 223 201 Histo result(a); … … 225 203 } 226 204 227 //++ 205 /*! 206 Operateur H2 = H1 / b 207 */ 228 208 Histo operator / (const Histo& a, double b) 229 //230 //--231 209 { 232 210 Histo result(a); … … 234 212 } 235 213 236 //++ 214 /*! 215 Operateur H2 = H1 + b 216 */ 237 217 Histo operator + (const Histo& a, double b) 238 //239 //--240 218 { 241 219 Histo result(a); … … 243 221 } 244 222 245 //++ 223 /*! 224 Operateur H2 = b + H1 225 */ 246 226 Histo operator + (double b, const Histo& a) 247 //248 //--249 227 { 250 228 Histo result(a); … … 252 230 } 253 231 254 //++ 232 /*! 233 Operateur H2 = H1 - b 234 */ 255 235 Histo operator - (const Histo& a, double b) 256 //257 //--258 236 { 259 237 Histo result(a); … … 261 239 } 262 240 263 //++ 241 /*! 242 Operateur H2 = b - H1 243 */ 264 244 Histo operator - (double b, const Histo& a) 265 //266 //--267 245 { 268 246 Histo result(a); … … 272 250 273 251 /********* Methode *********/ 274 //++ 252 /*! 253 Operateur H += H1 254 */ 275 255 Histo& Histo::operator += (const Histo& a) 276 //277 //--278 256 { 279 257 if(bins!=a.bins) THROW(sizeMismatchErr); … … 291 269 } 292 270 293 //++ 271 /*! 272 Operateur H -= H1 273 */ 294 274 Histo& Histo::operator -= (const Histo& a) 295 //296 //--297 275 { 298 276 if(bins!=a.bins) THROW(sizeMismatchErr); … … 310 288 } 311 289 312 //++ 290 /*! 291 Operateur H *= H1 292 */ 313 293 Histo& Histo::operator *= (const Histo& a) 314 //315 //--316 294 { 317 295 if(bins!=a.bins) THROW(sizeMismatchErr); … … 331 309 } 332 310 333 //++ 311 /*! 312 Operateur H /= H1 313 */ 334 314 Histo& Histo::operator /= (const Histo& a) 335 //336 //--337 315 { 338 316 if(bins!=a.bins) THROW(sizeMismatchErr); … … 359 337 360 338 /********* Methode *********/ 361 //++ 339 /*! 340 Operateur H = H1 + H2 341 */ 362 342 Histo operator + (const Histo& a, const Histo& b) 363 //364 //--365 343 { 366 344 if (b.NBins()!=a.NBins()) THROW(sizeMismatchErr); … … 369 347 } 370 348 371 //++ 349 /*! 350 Operateur H = H1 - H2 351 */ 372 352 Histo operator - (const Histo& a, const Histo& b) 373 //374 //--375 353 { 376 354 if (b.NBins()!=a.NBins()) THROW(sizeMismatchErr); … … 379 357 } 380 358 381 //++ 359 /*! 360 Operateur H = H1 * H2 361 */ 382 362 Histo operator * (const Histo& a, const Histo& b) 383 //384 //--385 363 { 386 364 if (b.NBins()!=a.NBins()) THROW(sizeMismatchErr); … … 389 367 } 390 368 391 //++ 369 /*! 370 Operateur H = H1 / H2 371 */ 392 372 Histo operator / (const Histo& a, const Histo& b) 393 //394 //--395 373 { 396 374 if (b.NBins()!=a.NBins()) THROW(sizeMismatchErr); … … 400 378 401 379 /********* Methode *********/ 402 //++ 380 /*! 381 Remplissage d'un tableau avec la valeur des abscisses 382 */ 403 383 void Histo::GetAbsc(Vector &v) 404 //405 // Remplissage d'un tableau avec la valeur des abscisses406 //--407 384 { 408 385 v.Realloc(bins); … … 411 388 } 412 389 413 //++ 390 /*! 391 Remplissage d'un tableau avec la valeur du contenu 392 */ 414 393 void Histo::GetValue(Vector &v) 415 //416 // Remplissage d'un tableau avec la valeur du contenu417 //--418 394 { 419 395 v.Realloc(bins); … … 422 398 } 423 399 424 //++ 400 /*! 401 Remplissage d'un tableau avec la valeur des erreurs au carre 402 */ 425 403 void Histo::GetError2(Vector &v) 426 //427 // Remplissage d'un tableau avec la valeur des erreurs au carre428 //--429 404 { 430 405 v.Realloc(bins); … … 434 409 } 435 410 436 //++ 411 /*! 412 Remplissage d'un tableau avec la valeur des erreurs 413 */ 437 414 void Histo::GetError(Vector &v) 438 //439 // Remplissage d'un tableau avec la valeur des erreurs440 //--441 415 { 442 416 v.Realloc(bins); … … 447 421 448 422 /********* Methode *********/ 449 //++ 423 /*! 424 Remplissage du contenu de l'histo avec les valeurs d'un vecteur 425 */ 450 426 void Histo::PutValue(Vector &v, int ierr) 451 //452 // Remplissage du contenu de l'histo avec les valeurs d'un vecteur453 //--454 427 { 455 428 if(v.NElts()<bins) THROW(sizeMismatchErr); … … 461 434 } 462 435 463 //++ 436 /*! 437 Addition du contenu de l'histo avec les valeurs d'un vecteur 438 */ 464 439 void Histo::PutValueAdd(Vector &v, int ierr) 465 //466 // Addition du contenu de l'histo avec les valeurs d'un vecteur467 //--468 440 { 469 441 if(v.NElts()<bins) THROW(sizeMismatchErr); … … 475 447 } 476 448 477 //++ 449 /*! 450 Remplissage des erreurs au carre de l'histo avec les valeurs d'un vecteur 451 */ 478 452 void Histo::PutError2(Vector &v) 479 //480 // Remplissage des erreurs au carre de l'histo avec les valeurs d'un vecteur481 //--482 453 { 483 454 if(v.NElts()<bins) THROW(sizeMismatchErr); … … 487 458 } 488 459 489 //++ 460 /*! 461 Addition des erreurs au carre de l'histo avec les valeurs d'un vecteur 462 */ 490 463 void Histo::PutError2Add(Vector &v) 491 //492 // Addition des erreurs au carre de l'histo avec les valeurs d'un vecteur493 //--494 464 { 495 465 if(v.NElts()<bins) THROW(sizeMismatchErr); … … 499 469 } 500 470 501 //++ 471 /*! 472 Remplissage des erreurs de l'histo avec les valeurs d'un vecteur 473 */ 502 474 void Histo::PutError(Vector &v) 503 //504 // Remplissage des erreurs de l'histo avec les valeurs d'un vecteur505 //--506 475 { 507 476 if(v.NElts()<bins) THROW(sizeMismatchErr); … … 513 482 514 483 /********* Methode *********/ 515 //++ 484 /*! 485 Addition du contenu de l'histo pour abscisse x poids w 486 */ 516 487 void Histo::Add(float x, float w) 517 //518 // Addition du contenu de l'histo pour abscisse x poids w519 //--520 488 { 521 489 int numBin = FindBin(x); … … 531 499 532 500 /********* Methode *********/ 533 //++ 501 /*! 502 Addition du contenu de l'histo bin numBin poids w 503 */ 534 504 void Histo::AddBin(int numBin, float w) 535 //536 // Addition du contenu de l'histo bin numBin poids w537 //--538 505 { 539 506 if (numBin<0) under += w; … … 548 515 549 516 /********* Methode *********/ 550 //++ 517 /*! 518 Remplissage du contenu de l'histo pour abscisse x poids w 519 */ 551 520 void Histo::SetBin(float x, float w) 552 //553 // Remplissage du contenu de l'histo pour abscisse x poids w554 //--555 521 { 556 522 int numBin = FindBin(x); … … 559 525 560 526 /********* Methode *********/ 561 //++ 527 /*! 528 Remplissage du contenu de l'histo pour numBin poids w 529 */ 562 530 void Histo::SetBin(int numBin, float w) 563 //564 // Remplissage du contenu de l'histo pour numBin poids w565 //--566 531 { 567 532 if (numBin<0) under = w; … … 575 540 576 541 /********* Methode *********/ 577 //++ 542 /*! 543 Remplissage des erreurs au carre pour abscisse x 544 */ 578 545 void Histo::SetErr2(float x, double e2) 579 //580 // Remplissage des erreurs au carre pour abscisse x581 //--582 546 { 583 547 int numBin = FindBin(x); … … 586 550 587 551 /********* Methode *********/ 588 //++ 552 /*! 553 Remplissage des erreurs au carre pour numBin poids 554 */ 589 555 void Histo::SetErr2(int numBin, double e2) 590 //591 // Remplissage des erreurs au carre pour numBin poids592 //--593 556 { 594 557 if( err2==NULL) return; … … 598 561 599 562 /********* Methode *********/ 600 //++ 563 /*! 564 Remplissage des erreurs pour abscisse x 565 */ 601 566 void Histo::SetErr(float x, float e) 602 //603 // Remplissage des erreurs pour abscisse x604 //--605 567 { 606 568 SetErr2(x, (double) e*e); … … 608 570 609 571 /********* Methode *********/ 610 //++ 572 /*! 573 Remplissage des erreurs pour numBin 574 */ 611 575 void Histo::SetErr(int numBin, float e) 612 //613 // Remplissage des erreurs pour numBin614 //--615 576 { 616 577 SetErr2(numBin, (double) e*e); … … 618 579 619 580 /********* Methode *********/ 620 //++ 581 /*! 582 Numero du bin ayant le contenu maximum 583 */ 621 584 int Histo::IMax() const 622 //623 // Numero du bin ayant le contenu maximum624 //--625 585 { 626 586 int imx=0; … … 633 593 634 594 /********* Methode *********/ 635 //++ 595 /*! 596 Numero du bin ayant le contenu minimum 597 */ 636 598 int Histo::IMin() const 637 //638 // Numero du bin ayant le contenu minimum639 //--640 599 { 641 600 int imx=0; … … 648 607 649 608 /********* Methode *********/ 650 //++ 609 /*! 610 Valeur le contenu maximum 611 */ 651 612 float Histo::VMax() const 652 //653 // Valeur le contenu maximum654 //--655 613 { 656 614 float mx=data[0]; … … 661 619 662 620 /********* Methode *********/ 663 //++ 621 /*! 622 Valeur le contenu minimum 623 */ 664 624 float Histo::VMin() const 665 //666 // Valeur le contenu minimum667 //--668 625 { 669 626 float mx=data[0]; … … 674 631 675 632 /********* Methode *********/ 676 //++ 633 /*! 634 Valeur moyenne 635 */ 677 636 float Histo::Mean() const 678 //679 // Valeur moyenne680 //--681 637 { 682 638 double n = 0; … … 691 647 692 648 /********* Methode *********/ 693 //++ 649 /*! 650 Valeur du sigma 651 */ 694 652 float Histo::Sigma() const 695 //696 // Valeur du sigma697 //--698 653 { 699 654 double n = 0; … … 714 669 715 670 /********* Methode *********/ 716 //++ 671 /*! 672 Valeur de la moyenne calculee entre les bin il et ih 673 */ 717 674 float Histo::MeanLH(int il,int ih) const 718 //719 // Valeur de la moyenne calculee entre les bin il et ih720 //--721 675 { 722 676 if( ih < il ) { il = 0; ih = bins-1; } … … 734 688 735 689 /********* Methode *********/ 736 //++ 690 /*! 691 Valeur de la moyenne calculee entre les bin il et ih 692 */ 737 693 float Histo::SigmaLH(int il,int ih) const 738 //739 // Valeur de la moyenne calculee entre les bin il et ih740 //--741 694 { 742 695 if( ih < il ) { il = 0; ih = bins - 1; } … … 759 712 760 713 /********* Methode *********/ 761 //++ 714 /*! 715 Valeur de la moyenne calculee entre x0-dx et x0+dx 716 */ 762 717 float Histo::Mean(float x0, float dx) const 763 //764 // Valeur de la moyenne calculee entre x0-dx et x0+dx765 //--766 718 { 767 719 double sdata = 0; … … 780 732 781 733 /********* Methode *********/ 782 //++ 734 /*! 735 Valeur du sigma calcule entre x0-dx et x0+dx 736 */ 783 737 float Histo::Sigma(float x0, float dx) const 784 //785 // Valeur du sigma calcule entre x0-dx et x0+dx786 //--787 738 { 788 739 double sx = 0; … … 804 755 805 756 /********* Methode *********/ 806 //++ 757 /*! 758 Valeur de la moyenne et du sigma nettoyes 759 */ 807 760 float Histo::CleanedMean(float& sigma) const 808 //809 // Valeur de la moyenne et du sigma nettoyes810 //--811 761 { 812 762 if (!nHist) return 0; … … 825 775 826 776 /********* Methode *********/ 827 //++ 777 /*! 778 Valeur de la moyenne nettoyee 779 */ 828 780 float Histo::CleanedMean() const 829 //830 // Valeur de la moyenne nettoyee831 //--832 781 { 833 782 if (!nHist) return 0; … … 837 786 838 787 /********* Methode *********/ 839 //++ 788 /*! 789 Retourne le nombre de bins non-nul 790 */ 840 791 int Histo::BinNonNul() const 841 //842 // Retourne le nombre de bins non-nul843 //--844 792 { 845 793 int non=0; … … 849 797 850 798 /********* Methode *********/ 851 //++ 799 /*! 800 Retourne le nombre de bins ayant une erreur non-nulle 801 */ 852 802 int Histo::ErrNonNul() const 853 //854 // Retourne le nombre de bins ayant une erreur non-nulle855 //--856 803 { 857 804 if(err2==NULL) return -1; … … 862 809 863 810 /********* Methode *********/ 864 //++ 811 /*! 812 Renvoie le numero de bin tel que il y ait "per" pourcent entrees 813 entre le bin 0 et ce bin (y compris le contenu de ce bin). 814 */ 865 815 int Histo::BinPercent(float per) const 866 //867 // Renvoie le numero de bin tel que il y ait "per" pourcent entrees868 // entre le bin 0 et ce bin (y compris le contenu de ce bin).869 //--870 816 { 871 817 double n = nHist*per; … … 881 827 882 828 /********* Methode *********/ 883 //++ 829 /*! 830 Renvoie les numeros de bins imin,imax (0=<i<bins) tels que: 831 \verbatim 832 notons I = bin contenant l'abscisse x 833 N1 = nombre d'entrees entre bin 0 et I compris 834 N2 = nombre d'entrees entre bin I et bins-1 compris 835 imin = bin tel que nombre d'entrees entre imin et I = N1 * per 836 imax = bin tel que nombre d'entrees entre I et imax = N2 * per 837 Return: <0 si echec 838 min(I-imin,imax-I) si ok 839 \endverbatim 840 */ 884 841 int Histo::BinPercent(float x,float per,int& imin,int& imax) 885 //886 // Renvoie les numeros de bins imin,imax (0=<i<bins) tels que:887 //| notons I = bin contenant l'abscisse x888 //| N1 = nombre d'entrees entre bin 0 et I compris889 //| N2 = nombre d'entrees entre bin I et bins-1 compris890 //| imin = bin tel que nombre d'entrees entre imin et I = N1 * per891 //| imax = bin tel que nombre d'entrees entre I et imax = N2 * per892 //| Return: <0 si echec893 //| min(I-imin,imax-I) si ok894 //--895 842 { 896 843 imin = imax = -1; … … 917 864 918 865 /********* Methode *********/ 919 //++ 866 /*! 867 Idem precedent mais renvoie xmin et xmax 868 */ 920 869 int Histo::BinPercent(float x,float per,float& xmin,float& xmax) 921 //922 // Idem precedent mais renvoie xmin et xmax923 //--924 870 { 925 871 xmin = xmax = 0.; … … 931 877 932 878 /********* Methode *********/ 933 //++ 879 /*! 880 Remplace l'histogramme par son integrale normalise a norm: 881 si norm <= 0 : pas de normalisation, integration seule 882 */ 934 883 void Histo::HInteg(float norm) 935 //936 // Remplace l'histogramme par son integrale normalise a norm:937 // si norm <= 0 : pas de normalisation, integration seule938 //--939 884 { 940 885 if(bins>1) … … 952 897 953 898 /********* Methode *********/ 954 //++ 899 /*! 900 Remplace l'histogramme par sa derivee 901 */ 955 902 void Histo::HDeriv() 956 //957 // Remplace l'histogramme par sa derivee958 //--959 903 { 960 904 if( bins <= 1 ) return; … … 970 914 971 915 /********* Methode *********/ 972 //++ 916 /*! 917 Pour rebinner l'histogramme sur nbinew bins 918 */ 973 919 void Histo::HRebin(int nbinew) 974 //975 // Pour rebinner l'histogramme sur nbinew bins976 //--977 920 { 978 921 if( nbinew <= 0 ) return; … … 1023 966 1024 967 /********* Methode *********/ 1025 //++ 968 /*! 969 Retourne le nombre de maxima locaux, la valeur du maximum (maxi) 970 et sa position (imax), ainsi que la valeur du second maximum 971 local (maxn) et sa position (imaxn). 972 Attention: si un maximum a la meme valeur sur plusieurs bins 973 consecutifs, le bin le plus a droite est pris. 974 */ 1026 975 int Histo::MaxiLocal(float& maxi,int& imax,float& maxn,int& imaxn) 1027 //1028 // Retourne le nombre de maxima locaux, la valeur du maximum (maxi)1029 // et sa position (imax), ainsi que la valeur du second maximum1030 // local (maxn) et sa position (imaxn).1031 // Attention: si un maximum a la meme valeur sur plusieurs bins1032 // consecutifs, le bin le plus a droite est pris.1033 //--1034 976 { 1035 977 int nml = 0; … … 1064 1006 1065 1007 /********* Methode *********/ 1066 //++ 1008 /*! 1009 Fit de la position du maximum de l'histo par un polynome 1010 de degre `degree' a `frac' pourcent du maximum. 1011 L'histo est suppose etre remplit de valeurs positives 1012 */ 1067 1013 float Histo::FitMax(int degree, float frac, int debug) const 1068 //1069 // Fit de la position du maximum de l'histo par un polynome1070 // de degre `degree' a `frac' pourcent du maximum.1071 // L'histo est suppose etre remplit de valeurs positives1072 //--1073 1014 { 1074 1015 if (degree < 2 || degree > 3) degree = 3; … … 1200 1141 1201 1142 /********* Methode *********/ 1202 //++ 1143 /*! 1144 Calcul de la largeur a frac pourcent du maximum 1145 autour du bin du maximum. 1146 L'histo est suppose etre remplit de valeurs positives 1147 */ 1203 1148 float Histo::FindWidth(float frac, int debug) const 1204 //1205 // Calcul de la largeur a frac pourcent du maximum1206 // autour du bin du maximum.1207 // L'histo est suppose etre remplit de valeurs positives1208 //--1209 1149 { 1210 1150 float xmax = BinCenter( IMax() ); … … 1213 1153 1214 1154 /********* Methode *********/ 1215 //++ 1155 /*! 1156 Calcul de la largeur a frac pourcent de la valeur du bin xmax. 1157 L'histo est suppose etre remplit de valeurs positives 1158 */ 1216 1159 float Histo::FindWidth(float xmax,float frac, int debug) const 1217 //1218 // Calcul de la largeur a frac pourcent de la valeur du bin xmax.1219 // L'histo est suppose etre remplit de valeurs positives1220 //--1221 1160 { 1222 1161 if (frac <= 0 || frac >= 1.) frac = 0.5; … … 1292 1231 1293 1232 /********* Methode *********/ 1294 //++ 1233 /*! 1234 Cf suivant mais im est le bin du maximum de l'histo 1235 */ 1295 1236 int Histo::EstimeMax(float& xm,int SzPav) 1296 //1297 // Cf suivant mais im est le bin du maximum de l'histo1298 //--1299 1237 { 1300 1238 int im = IMax(); … … 1303 1241 1304 1242 /********* Methode *********/ 1305 //++ 1243 /*! 1244 Determine l'abscisses du maximum donne par im 1245 en moyennant dans un pave SzPav autour du maximum 1246 \verbatim 1247 Return: 1248 0 = si fit maximum reussi avec SzPav pixels 1249 1 = si fit maximum reussi avec moins que SzPav pixels 1250 2 = si fit maximum echoue et renvoit BinCenter() 1251 -1 = si echec: SzPav <= 0 ou im hors limites 1252 \endverbatim 1253 */ 1306 1254 int Histo::EstimeMax(int& im,float& xm,int SzPav) 1307 //1308 // Determine l'abscisses du maximum donne par im1309 // en moyennant dans un pave SzPav autour du maximum1310 //| Return:1311 //| 0 = si fit maximum reussi avec SzPav pixels1312 //| 1 = si fit maximum reussi avec moins que SzPav pixels1313 //| 2 = si fit maximum echoue et renvoit BinCenter()1314 //| -1 = si echec: SzPav <= 0 ou im hors limites1315 //--1316 1255 { 1317 1256 xm = 0; … … 1341 1280 1342 1281 /********* Methode *********/ 1343 //++ 1282 /*! 1283 Determine la largeur a frac% du maximum a gauche (widthG) 1284 et a droite (widthD) 1285 */ 1344 1286 void Histo::EstimeWidthS(float frac,float& widthG,float& widthD) 1345 //1346 // Determine la largeur a frac% du maximum a gauche (widthG)1347 // et a droite (widthD)1348 //--1349 1287 { 1350 1288 int i; … … 1385 1323 1386 1324 ////////////////////////////////////////////////////////// 1387 //++ 1325 /*! 1326 Fit de l'histogramme par ``gfit''. 1327 \verbatim 1328 typ_err = 0 : 1329 - erreur attachee au bin si elle existe 1330 - sinon 1 1331 typ_err = 1 : 1332 - erreur attachee au bin si elle existe 1333 - sinon max( sqrt(abs(bin) ,1 ) 1334 typ_err = 2 : 1335 - erreur forcee a 1 1336 typ_err = 3 : 1337 - erreur forcee a max( sqrt(abs(bin) ,1 ) 1338 typ_err = 4 : 1339 - erreur forcee a 1, nulle si bin a zero. 1340 typ_err = 5 : 1341 - erreur forcee a max( sqrt(abs(bin) ,1 ), 1342 nulle si bin a zero. 1343 \endverbatim 1344 */ 1388 1345 int Histo::Fit(GeneralFit& gfit,unsigned short typ_err) 1389 //1390 // Fit de l'histogramme par ``gfit''.1391 //| typ_err = 0 :1392 //| - erreur attachee au bin si elle existe1393 //| - sinon 11394 //| typ_err = 1 :1395 //| - erreur attachee au bin si elle existe1396 //| - sinon max( sqrt(abs(bin) ,1 )1397 //| typ_err = 2 :1398 //| - erreur forcee a 11399 //| typ_err = 3 :1400 //| - erreur forcee a max( sqrt(abs(bin) ,1 )1401 //| typ_err = 4 :1402 //| - erreur forcee a 1, nulle si bin a zero.1403 //| typ_err = 5 :1404 //| - erreur forcee a max( sqrt(abs(bin) ,1 ),1405 //| nulle si bin a zero.1406 //--1407 1346 { 1408 1347 if(NBins()<=0) return -1000; … … 1430 1369 } 1431 1370 1432 //++ 1371 /*! 1372 Retourne une classe contenant les residus du fit ``gfit''. 1373 */ 1433 1374 Histo Histo::FitResidus(GeneralFit& gfit) 1434 //1435 // Retourne une classe contenant les residus du fit ``gfit''.1436 //--1437 1375 { 1438 1376 if(NBins()<=0) … … 1450 1388 } 1451 1389 1452 //++ 1390 /*! 1391 Retourne une classe contenant la fonction du fit ``gfit''. 1392 */ 1453 1393 Histo Histo::FitFunction(GeneralFit& gfit) 1454 //1455 // Retourne une classe contenant la fonction du fit ``gfit''.1456 //--1457 1394 { 1458 1395 if(NBins()<=0) … … 1471 1408 1472 1409 /********* Methode *********/ 1473 //++ 1410 /*! 1411 Impression de l'histogramme dans le fichier fp 1412 \verbatim 1413 hdyn = nombre de colonnes pour imprimer les etoiles 1414 si =0 alors defaut(100), 1415 si <0 pas de print histo seulement infos 1416 hmin = minimum de la dynamique 1417 hmax = maximum de la dynamique 1418 si hmax<=hmin : hmin=VMin() hmax=VMax() 1419 si hmax<=hmin et hmin=0 : hmin=0 hmax=VMax() 1420 sinon : hmin hmax 1421 pflag < 0 : on imprime les informations (nbin,min,...) sans l'histogramme 1422 = 0 : on imprime "BinCenter(i) data[i]" (note "... ...") 1423 bit 0 on : (v=1): numero_bin "... ..." 1424 bit 1 on : (v=2): "... ..." erreur 1425 \endverbatim 1426 */ 1474 1427 void Histo::PrintF(FILE * fp, int hdyn,float hmin, float hmax,int pflag, 1475 1428 int il, int ih) 1476 //1477 // Impression de l'histogramme dans le fichier fp1478 //| hdyn = nombre de colonnes pour imprimer les etoiles1479 //| si =0 alors defaut(100),1480 //| si <0 pas de print histo seulement infos1481 //| hmin = minimum de la dynamique1482 //| hmax = maximum de la dynamique1483 //| si hmax<=hmin : hmin=VMin() hmax=VMax()1484 //| si hmax<=hmin et hmin=0 : hmin=0 hmax=VMax()1485 //| sinon : hmin hmax1486 //| pflag < 0 : on imprime les informations (nbin,min,...) sans l'histogramme1487 //| = 0 : on imprime "BinCenter(i) data[i]" (note "... ...")1488 //| bit 0 on : (v=1): numero_bin "... ..."1489 //| bit 1 on : (v=2): "... ..." erreur1490 //--1491 1429 { 1492 1430 … … 1642 1580 1643 1581 /********* Methode *********/ 1644 //++ 1582 /*! 1583 Impression de l'histogramme sur stdout 1584 */ 1645 1585 void Histo::Print(int hdyn,float hmin, float hmax,int pflag, 1646 1586 int il, int ih) 1647 //1648 // Impression de l'histogramme sur stdout1649 //--1650 1587 { 1651 1588 Histo::PrintF(stdout, hdyn, hmin, hmax, pflag, il, ih); 1652 1589 } 1653 1654 1655 // Rappel des inlines functions pour commentaires1656 //++1657 // inline float XMin() const1658 // Retourne l'abscisse minimum1659 //--1660 //++1661 // inline float XMax() const1662 // Retourne l'abscisse maximum1663 //--1664 //++1665 // inline int NBins() const1666 // Retourne le nombre de bins1667 //--1668 //++1669 // inline float BinWidth() const1670 // Retourne la largeur du bin1671 //--1672 //++1673 // inline float* Bins() const1674 // Retourne le pointeur sur le tableaux des contenus1675 //--1676 //++1677 // inline float operator()(int i) const1678 // Retourne le contenu du bin i1679 //--1680 //++1681 // inline float& operator()(int i)1682 // Remplit le contenu du bin i1683 //--1684 //++1685 // inline float Error(int i) const1686 // Retourne l'erreur du bin i1687 //--1688 //++1689 // inline double Error2(int i) const1690 // Retourne l'erreur au carre du bin i1691 //--1692 //++1693 // inline double& Error2(int i)1694 // Remplit l'erreur au carre du bin i1695 //--1696 //++1697 // inline float NData() const1698 // Retourne la somme ponderee1699 //--1700 //++1701 // inline float NEntries()1702 // Retourne le nombre d'entrees1703 //--1704 //++1705 // inline float NOver() const1706 // Retourne le nombre d'overflow1707 //--1708 //++1709 // inline float NUnder() const1710 // Retourne le nombre d'underflow1711 //--1712 //++1713 // inline float BinLowEdge(int i) const1714 // Retourne l'abscisse du bord inferieur du bin i1715 //--1716 //++1717 // inline float BinCenter(int i) const1718 // Retourne l'abscisse du centre du bin i1719 //--1720 //++1721 // inline float BinHighEdge(int i) const1722 // Retourne l'abscisse du bord superieur du bin i1723 //--1724 //++1725 // inline int FindBin(float x) const1726 // Retourne le numero du bin contenant l'abscisse x1727 //--1728 1590 1729 1591 -
trunk/SophyaLib/HiStats/histos.h
r763 r914 1 1 // This may look like C code, but it is really -*- C++ -*- 2 2 // 3 // $Id: histos.h,v 1. 1.1.1 2000-03-02 16:51:32ansari Exp $3 // $Id: histos.h,v 1.2 2000-04-13 16:04:11 ansari Exp $ 4 4 // 5 5 … … 19 19 class GeneralFit; 20 20 21 22 /*! 23 Classe d'histogrammes 1D 24 */ 21 25 class Histo : public AnyDataObj { 22 26 friend class ObjFileIO<Histo>; … … 77 81 78 82 // INLINES 83 //! Retourne l'abscisse minimum 79 84 inline float XMin() const {return min;} 85 //! Retourne l'abscisse maximum 80 86 inline float XMax() const {return max;} 87 //! Retourne le nombre de bins 81 88 inline int_4 NBins() const {return bins;} 89 //! Retourne la largeur du bin 82 90 inline float BinWidth() const {return binWidth;} 91 //! Retourne le pointeur sur le tableaux des contenus 83 92 inline float* Bins() const {return data;} 93 //! Retourne le contenu du bin i 84 94 inline float operator()(int i) const {return data[i];} 95 //! Remplit le contenu du bin i 85 96 inline float& operator()(int i) {return data[i];} 97 //! retourne "true" si il y a des erreurs stoquees 86 98 inline bool HasErrors() { if(err2) return true; else return false;} 99 //! Retourne l'erreur du bin i 87 100 inline float Error(int i) const 88 101 {if(err2) {if(err2[i]>0.) return sqrt(err2[i]); else return 0.;} 89 102 else return 0.;} 103 //! Retourne l'erreur au carre du bin i 90 104 inline double Error2(int i) const 91 105 {if(err2) return err2[i]; else return 0.;} 106 //! Remplit l'erreur au carre du bin i 92 107 inline double& Error2(int i) {return err2[i];} 108 //! Retourne la somme ponderee 93 109 inline float NData() const {return (float) nHist;} 110 //! Retourne le nombre d'entrees 94 111 inline float NEntries() const {return nEntries;} 112 //! Retourne le nombre d'overflow 95 113 inline float NOver() const {return over;} 114 //! Retourne le nombre d'underflow 96 115 inline float NUnder() const {return under;} 97 116 117 //! Retourne l'abscisse du bord inferieur du bin i 98 118 inline float BinLowEdge(int i) const {return min + i*binWidth;} 119 //! Retourne l'abscisse du centre du bin i 99 120 inline float BinCenter(int i) const {return min + (i+0.5)*binWidth;} 121 //! Retourne l'abscisse du bord superieur du bin i 100 122 inline float BinHighEdge(int i) const {return min + (i+1)*binWidth;} 123 //! Retourne le numero du bin contenant l'abscisse x 101 124 inline int_4 FindBin(float x) const 102 125 {return (int_4) floorf((x - min) / binWidth);} … … 146 169 void Delete(); 147 170 148 float* data; 149 double* err2; 150 float under; 151 float over; 152 double nHist; 153 int_4 nEntries; 154 int_4 bins; 155 float min; 156 float max; 157 float binWidth; 171 float* data; //!< donnees 172 double* err2; //!< erreurs carrees 173 float under; //!< underflow 174 float over; //!< overflow 175 double nHist; //!< somme ponderee des entrees 176 int_4 nEntries; //!< nombre d'entrees 177 int_4 bins; //!< nombre de bins 178 float min; //!< abscisse minimum 179 float max; //!< abscisse maximum 180 float binWidth; //!< largeur du bin 158 181 }; 159 182 -
trunk/SophyaLib/HiStats/histos2.cc
r763 r914 16 16 #include "generalfit.h" 17 17 18 //++ 19 // Class Histo2D 20 // Lib Outils++ 21 // include histos2.h 22 // 23 // Classe d'histogrammes 2D 24 //-- 25 26 /////////////////////////////////////////////////////////////////// 27 //++ 28 // Titre Constructeurs 29 //-- 30 31 //++ 18 /////////////////////////////////////////////////////////////////// 19 /*! 20 Createur d'un histogramme 2D ayant nxBin,nyBin bins 21 entre xMin,xMax et yMin,yMax. 22 */ 32 23 Histo2D::Histo2D(float xMin, float xMax, int nxBin 33 24 ,float yMin, float yMax, int nyBin) 34 //35 // Createur d'un histogramme 2D ayant nxBin,nyBin bins36 // entre xMin,xMax et yMin,yMax.37 //--38 25 : data(new float[nxBin*nyBin]), err2(NULL) 39 26 , nHist(0), nEntries(0) … … 50 37 } 51 38 52 //++ 39 /*! 40 Constructeur par copie. 41 */ 53 42 Histo2D::Histo2D(const Histo2D& h) 54 //55 // Constructeur par copie.56 //--57 43 { 58 44 int i,j; … … 118 104 } 119 105 120 //++ 106 /*! 107 Constructeur par defaut. 108 */ 121 109 Histo2D::Histo2D() 122 //123 // Constructeur par defaut.124 //--125 110 : data(NULL), err2(NULL) 126 111 , nHist(0), nEntries(0) … … 136 121 137 122 /////////////////////////////////////////////////////////////////// 138 //++ 123 /*! 124 Desallocation de la place de l'histogramme (fct privee). 125 */ 139 126 void Histo2D::Delete() 140 //141 // Desallocation de la place de l'histogramme (fct privee).142 //--143 127 { 144 128 if( data != NULL ) { delete[] data; data = NULL;} … … 163 147 } 164 148 165 //++ 149 /*! 150 Destructeur. 151 */ 166 152 Histo2D::~Histo2D() 167 //168 // Destructeur.169 //--170 153 { 171 154 Delete(); … … 173 156 174 157 /////////////////////////////////////////////////////////////////// 175 //++ 176 // Titre Methodes generales 177 //-- 178 179 //++ 158 /*! 159 Remise a zero du contenu, des erreurs et des valeurs. 160 */ 180 161 void Histo2D::Zero() 181 //182 // Remise a zero du contenu, des erreurs et des valeurs.183 //--184 162 { 185 163 nHist = nEntries = 0; … … 200 178 201 179 /////////////////////////////////////////////////////////////////// 202 //++ 180 /*! 181 Pour avoir le calcul des erreurs. 182 */ 203 183 void Histo2D::Errors() 204 //205 // Pour avoir le calcul des erreurs.206 //--207 184 { 208 185 if( nxy > 0 ) { … … 213 190 214 191 /////////////////////////////////////////////////////////////////// 215 //++ 192 /*! 193 Operateur H2 = H1 194 */ 216 195 Histo2D& Histo2D::operator = (const Histo2D& h) 217 //218 //--219 196 { 220 197 int i,j,nb; … … 286 263 287 264 /////////////////////////////////////////////////////////////////// 288 //++ 265 /*! 266 Operateur H *= b 267 */ 289 268 Histo2D& Histo2D::operator *= (double b) 290 //291 //--292 269 { 293 270 int i,j; … … 310 287 } 311 288 312 //++ 289 /*! 290 Operateur H /= b 291 */ 313 292 Histo2D& Histo2D::operator /= (double b) 314 //315 //--316 293 { 317 294 int i,j; … … 335 312 } 336 313 337 //++ 314 /*! 315 Operateur H += b 316 */ 338 317 Histo2D& Histo2D::operator += (double b) 339 //340 //--341 318 { 342 319 int i,j; … … 362 339 } 363 340 364 //++ 341 /*! 342 Operateur H -= b 343 */ 365 344 Histo2D& Histo2D::operator -= (double b) 366 //367 //--368 345 { 369 346 int i,j; … … 390 367 391 368 /////////////////////////////////////////////////////////////////// 392 //++ 369 /*! 370 Operateur H2 = H1 * b 371 */ 393 372 Histo2D operator * (const Histo2D& a, double b) 394 //395 //--396 373 { 397 374 Histo2D result(a); … … 399 376 } 400 377 401 //++ 378 /*! 379 Operateur H2 = b * H1 380 */ 402 381 Histo2D operator * (double b, const Histo2D& a) 403 //404 //--405 382 { 406 383 Histo2D result(a); … … 408 385 } 409 386 410 //++ 387 /*! 388 Operateur H2 = H1 / b 389 */ 411 390 Histo2D operator / (const Histo2D& a, double b) 412 //413 //--414 391 { 415 392 Histo2D result(a); … … 417 394 } 418 395 419 //++ 396 /*! 397 Operateur H2 = H1 + b 398 */ 420 399 Histo2D operator + (const Histo2D& a, double b) 421 //422 //--423 400 { 424 401 Histo2D result(a); … … 426 403 } 427 404 428 //++ 405 /*! 406 Operateur H2 = b + H1 407 */ 429 408 Histo2D operator + (double b, const Histo2D& a) 430 //431 //--432 409 { 433 410 Histo2D result(a); … … 435 412 } 436 413 437 //++ 414 /*! 415 Operateur H2 = H1 - b 416 */ 438 417 Histo2D operator - (const Histo2D& a, double b) 439 //440 //--441 418 { 442 419 Histo2D result(a); … … 444 421 } 445 422 446 //++ 423 /*! 424 Operateur H2 = b - H1 425 */ 447 426 Histo2D operator - (double b, const Histo2D& a) 448 //449 //--450 427 { 451 428 Histo2D result(a); … … 455 432 456 433 /////////////////////////////////////////////////////////////////// 457 //++ 434 /*! 435 Operateur H += H1 436 */ 458 437 Histo2D& Histo2D::operator += (const Histo2D& a) 459 //460 //--461 438 { 462 439 int i,j; … … 478 455 } 479 456 480 //++ 457 /*! 458 Operateur H -= H1 459 */ 481 460 Histo2D& Histo2D::operator -= (const Histo2D& a) 482 //483 //--484 461 { 485 462 int i,j; … … 501 478 } 502 479 503 //++ 480 /*! 481 Operateur H *= H1 482 */ 504 483 Histo2D& Histo2D::operator *= (const Histo2D& a) 505 //506 //--507 484 { 508 485 int i,j; … … 526 503 } 527 504 528 //++ 505 /*! 506 Operateur H /= H1 507 */ 529 508 Histo2D& Histo2D::operator /= (const Histo2D& a) 530 //531 //--532 509 { 533 510 int i,j; … … 559 536 560 537 /////////////////////////////////////////////////////////////////// 561 //++ 538 /*! 539 Operateur H = H1 + H2 540 */ 541 562 542 Histo2D operator + (const Histo2D& a, const Histo2D& b) 563 //564 //--565 543 { 566 544 if (b.NBinX()!=a.NBinX() || b.NBinY()!=a.NBinY()) THROW(sizeMismatchErr); … … 569 547 } 570 548 571 //++ 549 /*! 550 Operateur H = H1 - H2 551 */ 572 552 Histo2D operator - (const Histo2D& a, const Histo2D& b) 573 //574 //--575 553 { 576 554 if (b.NBinX()!=a.NBinX() || b.NBinY()!=a.NBinY()) THROW(sizeMismatchErr); … … 579 557 } 580 558 581 //++ 559 /*! 560 Operateur H = H1 * H2 561 */ 582 562 Histo2D operator * (const Histo2D& a, const Histo2D& b) 583 //584 //--585 563 { 586 564 if (b.NBinX()!=a.NBinX() || b.NBinY()!=a.NBinY()) THROW(sizeMismatchErr); … … 589 567 } 590 568 591 //++ 569 /*! 570 Operateur H = H1 / H2 571 */ 592 572 Histo2D operator / (const Histo2D& a, const Histo2D& b) 593 //594 //--595 573 { 596 574 if (b.NBinX()!=a.NBinX() || b.NBinY()!=a.NBinY()) THROW(sizeMismatchErr); … … 600 578 601 579 /////////////////////////////////////////////////////////////////// 602 //++ 580 /*! 581 Remplissage d'un tableau avec les valeurs des abscisses. 582 */ 603 583 void Histo2D::GetXCoor(Vector &v) 604 //605 // Remplissage d'un tableau avec les valeurs des abscisses.606 //--607 584 { 608 585 float x,y; … … 612 589 } 613 590 614 //++ 591 /*! 592 Remplissage d'un tableau avec les valeurs des ordonnees. 593 */ 615 594 void Histo2D::GetYCoor(Vector &v) 616 //617 // Remplissage d'un tableau avec les valeurs des ordonnees.618 //--619 595 { 620 596 float x,y; … … 624 600 } 625 601 626 //++ 627 //| Remarque sur les indices: 628 //| H(i,j) -> i = coord x (0<i<nx), j = coord y (0<j<ny) 629 //| v(ii,jj) -> ii = ligne (0<i<NRows()), jj = colonne (0<i<NCol()) 630 //| On fait une correspondance directe i<->ii et j<->jj 631 //| ce qui, en representation classique des histos2D et des matrices 632 //| entraine une inversion x<->y cad une symetrie / diagonale principale 633 //| H(0,...) represente ^ mais v(0,...) represente 634 //| |x....... |xxxxxxxx| 635 //| |x....... |........| 636 //| |x....... |........| 637 //| |x....... |........| 638 //| |x....... |........| 639 //| ---------> 640 //| colonne no 1 ligne no 1 641 //-- 642 643 //++ 602 /*! 603 Remplissage d'un tableau avec les valeurs du contenu. 604 */ 644 605 void Histo2D::GetValue(Matrix &v) 645 //646 // Remplissage d'un tableau avec les valeurs du contenu.647 //--648 606 { 649 607 v.Realloc(nx,ny); … … 653 611 } 654 612 655 //++ 613 /*! 614 Remplissage d'un tableau avec les valeurs du carre des erreurs. 615 */ 656 616 void Histo2D::GetError2(Matrix &v) 657 //658 // Remplissage d'un tableau avec les valeurs du carre des erreurs.659 //--660 617 { 661 618 int i,j; … … 667 624 } 668 625 669 //++ 626 /*! 627 Remplissage d'un tableau avec les valeurs des erreurs. 628 */ 670 629 void Histo2D::GetError(Matrix &v) 671 //672 // Remplissage d'un tableau avec les valeurs des erreurs.673 //--674 630 { 675 631 int i,j; … … 682 638 683 639 /////////////////////////////////////////////////////////////////// 684 //++ 640 /*! 641 Remplissage du contenu de l'histo avec les valeurs d'un tableau. 642 */ 685 643 void Histo2D::PutValue(Matrix &v, int ierr) 686 //687 // Remplissage du contenu de l'histo avec les valeurs d'un tableau.688 //--689 644 { 690 645 int i,j; … … 697 652 } 698 653 699 //++ 654 /*! 655 Addition du contenu de l'histo avec les valeurs d'un tableau. 656 */ 700 657 void Histo2D::PutValueAdd(Matrix &v, int ierr) 701 //702 // Addition du contenu de l'histo avec les valeurs d'un tableau.703 //--704 658 { 705 659 int i,j; … … 712 666 } 713 667 714 //++ 668 /*! 669 Remplissage des erreurs au carre de l'histo 670 avec les valeurs d'un tableau. 671 */ 715 672 void Histo2D::PutError2(Matrix &v) 716 //717 // Remplissage des erreurs au carre de l'histo718 // avec les valeurs d'un tableau.719 //--720 673 { 721 674 int i,j; … … 726 679 } 727 680 728 //++ 681 /*! 682 Addition des erreurs au carre de l'histo 683 avec les valeurs d'un tableau. 684 */ 729 685 void Histo2D::PutError2Add(Matrix &v) 730 //731 // Addition des erreurs au carre de l'histo732 // avec les valeurs d'un tableau.733 //--734 686 { 735 687 int i,j; … … 741 693 } 742 694 743 //++ 695 /*! 696 Remplissage des erreurs de l'histo avec les valeurs d'un tableau. 697 */ 744 698 void Histo2D::PutError(Matrix &v) 745 //746 // Remplissage des erreurs de l'histo avec les valeurs d'un tableau.747 //--748 699 { 749 700 int i,j; … … 757 708 /////////////////////////////////////////////////////////////////// 758 709 /********* Methode *********/ 759 //++ 710 /*! 711 Addition du contenu de l'histo pour x,y poids w. 712 */ 760 713 void Histo2D::Add(float x, float y, float w) 761 //762 // Addition du contenu de l'histo pour x,y poids w.763 //--764 714 { 765 715 list<bande_slice>::iterator it; … … 801 751 802 752 /////////////////////////////////////////////////////////////////// 803 //++ 753 /*! 754 Recherche du bin du maximum dans le pave [il,ih][jl,jh]. 755 */ 804 756 void Histo2D::IJMax(int& imax,int& jmax,int il,int ih,int jl,int jh) 805 //806 // Recherche du bin du maximum dans le pave [il,ih][jl,jh].807 //--808 757 { 809 758 if( il > ih ) { il = 0; ih = nx-1; } … … 823 772 } 824 773 825 //++ 774 /*! 775 Recherche du bin du minimum dans le pave [il,ih][jl,jh]. 776 */ 826 777 void Histo2D::IJMin(int& imax,int& jmax,int il,int ih,int jl,int jh) 827 //828 // Recherche du bin du minimum dans le pave [il,ih][jl,jh].829 //--830 778 { 831 779 if( il > ih ) { il = 0; ih = nx-1; } … … 846 794 847 795 848 //++ 796 /*! 797 Recherche du maximum dans le pave [il,ih][jl,jh]. 798 */ 849 799 float Histo2D::VMax(int il,int ih,int jl,int jh) const 850 //851 // Recherche du maximum dans le pave [il,ih][jl,jh].852 //--853 800 { 854 801 if( il > ih ) { il = 0; ih = nx-1; } … … 867 814 } 868 815 869 //++ 816 /*! 817 Recherche du minimum dans le pave [il,ih][jl,jh]. 818 */ 870 819 float Histo2D::VMin(int il,int ih,int jl,int jh) const 871 //872 // Recherche du minimum dans le pave [il,ih][jl,jh].873 //--874 820 { 875 821 if( il > ih ) { il = 0; ih = nx-1; } … … 889 835 890 836 /////////////////////////////////////////////////////////////////// 891 //++ 837 /*! 838 Renvoie les under.overflow dans les 8 quadrants. 839 \verbatim 840 over[3][3]: 20 | 21 | 22 841 | | 842 -------------- 843 | | 844 10 | 11 | 12 11 = all overflow+underflow 845 | | 846 -------------- 847 | | 848 00 | 01 | 02 849 \endverbatim 850 */ 892 851 float Histo2D::NOver(int i,int j) const 893 //894 // Renvoie les under.overflow dans les 8 quadrants.895 //| over[3][3]: 20 | 21 | 22896 //| | |897 //| --------------898 //| | |899 //| 10 | 11 | 12 11 = all overflow+underflow900 //| | |901 //| --------------902 //| | |903 //| 00 | 01 | 02904 //--905 852 { 906 853 if( i < 0 || i>=3 || j < 0 || j>=3 ) return over[1][1]; … … 910 857 911 858 /////////////////////////////////////////////////////////////////// 912 //++ 859 /*! 860 Retourne le nombre de bins non-nuls. 861 */ 913 862 int Histo2D::BinNonNul() const 914 //915 // Retourne le nombre de bins non-nuls.916 //--917 863 { 918 864 int non=0; … … 921 867 } 922 868 923 //++ 869 /*! 870 Retourne le nombre de bins avec erreurs non-nulles. 871 */ 924 872 int Histo2D::ErrNonNul() const 925 //926 // Retourne le nombre de bins avec erreurs non-nulles.927 //--928 873 { 929 874 if(err2==NULL) return -1; … … 934 879 935 880 /////////////////////////////////////////////////////////////////// 936 //++ 881 /*! 882 Idem EstimeMax(int...) mais retourne x,y. 883 */ 937 884 int Histo2D::EstimeMax(float& xm,float& ym,int SzPav 938 885 ,int il,int ih,int jl,int jh) 939 //940 // Idem EstimeMax(int...) mais retourne x,y.941 //--942 886 { 943 887 int im,jm; … … 946 890 } 947 891 948 //++ 892 /*! 893 Determine les abscisses et ordonnees du maximum donne par im,jm 894 en moyennant dans un pave SzPav x SzPav autour du maximum. 895 \verbatim 896 Return: 897 0 = si fit maximum reussi avec SzPav pixels 898 1 = si fit maximum reussi avec moins que SzPav pixels 899 dans au moins 1 direction 900 2 = si fit maximum echoue et renvoit BinCenter() 901 -1 = si echec: SzPav <= 0 ou im,jm hors limites 902 \endverbatim 903 */ 949 904 int Histo2D::EstimeMax(int im,int jm,float& xm,float& ym,int SzPav) 950 //951 // Determine les abscisses et ordonnees du maximum donne par im,jm952 // en moyennant dans un pave SzPav x SzPav autour du maximum.953 //| Return:954 //| 0 = si fit maximum reussi avec SzPav pixels955 //| 1 = si fit maximum reussi avec moins que SzPav pixels956 //| dans au moins 1 direction957 //| 2 = si fit maximum echoue et renvoit BinCenter()958 //| -1 = si echec: SzPav <= 0 ou im,jm hors limites959 //--960 905 { 961 906 xm = ym = 0; … … 992 937 } 993 938 994 //++ 939 /*! 940 Pour trouver le maximum de l'histogramme en tenant compte 941 des fluctuations. 942 \verbatim 943 Methode: 944 1-/ On recherche le bin maximum MAX de l'histogramme 945 2-/ On considere que tous les pixels compris entre [MAX-Dz,MAX] 946 peuvent etre des pixels maxima. 947 3-/ On identifie le bin maximum en choissisant le pixel du 2-/ 948 tel que la somme des pixels dans un pave SzPav x SzPav soit maximale. 949 INPUT: 950 SzPav = taille du pave pour departager 951 Dz = tolerance pour identifier tous les pixels "maximum" 952 OUTPUT: 953 im,jm = pixel maximum trouve 954 RETURN: 955 <0 = Echec 956 >0 = nombre de pixels possibles pour le maximum 957 \endverbatim 958 */ 995 959 int Histo2D::FindMax(int& im,int& jm,int SzPav,float Dz 996 960 ,int il,int ih,int jl,int jh) 997 //998 // Pour trouver le maximum de l'histogramme en tenant compte999 // des fluctuations.1000 //| Methode:1001 //| 1-/ On recherche le bin maximum MAX de l'histogramme1002 //| 2-/ On considere que tous les pixels compris entre [MAX-Dz,MAX]1003 //| peuvent etre des pixels maxima.1004 //| 3-/ On identifie le bin maximum en choissisant le pixel du 2-/1005 //| tel que la somme des pixels dans un pave SzPav x SzPav soit maximale.1006 //| INPUT:1007 //| SzPav = taille du pave pour departager1008 //| Dz = tolerance pour identifier tous les pixels "maximum"1009 //| OUTPUT:1010 //| im,jm = pixel maximum trouve1011 //| RETURN:1012 //| <0 = Echec1013 //| >0 = nombre de pixels possibles pour le maximum1014 //--1015 961 { 1016 962 if( il > ih ) { il = 0; ih = nx-1; } … … 1046 992 1047 993 ////////////////////////////////////////////////////////// 1048 //++ 994 /*! 995 Fit de l'histogramme par ``gfit''. 996 \verbatim 997 typ_err = 0 : 998 - erreur attachee au bin si elle existe 999 - sinon 1 1000 typ_err = 1 : 1001 - erreur attachee au bin si elle existe 1002 - sinon max( sqrt(abs(bin) ,1 ) 1003 typ_err = 2 : 1004 - erreur forcee a 1 1005 typ_err = 3 : 1006 - erreur forcee a max( sqrt(abs(bin) ,1 ) 1007 typ_err = 4 : 1008 - erreur forcee a 1, nulle si bin a zero. 1009 typ_err = 5 : 1010 - erreur forcee a max( sqrt(abs(bin) ,1 ), 1011 nulle si bin a zero. 1012 \endverbatim 1013 */ 1049 1014 int Histo2D::Fit(GeneralFit& gfit,unsigned short typ_err) 1050 //1051 // Fit de l'histogramme par ``gfit''.1052 //| typ_err = 0 :1053 //| - erreur attachee au bin si elle existe1054 //| - sinon 11055 //| typ_err = 1 :1056 //| - erreur attachee au bin si elle existe1057 //| - sinon max( sqrt(abs(bin) ,1 )1058 //| typ_err = 2 :1059 //| - erreur forcee a 11060 //| typ_err = 3 :1061 //| - erreur forcee a max( sqrt(abs(bin) ,1 )1062 //| typ_err = 4 :1063 //| - erreur forcee a 1, nulle si bin a zero.1064 //| typ_err = 5 :1065 //| - erreur forcee a max( sqrt(abs(bin) ,1 ),1066 //| nulle si bin a zero.1067 //--1068 1015 { 1069 1016 if(NBinX()*NBinY()<=0) return -1000; … … 1092 1039 } 1093 1040 1094 //++ 1041 /*! 1042 Retourne une classe contenant les residus du fit ``gfit''. 1043 */ 1095 1044 Histo2D Histo2D::FitResidus(GeneralFit& gfit) 1096 //1097 // Retourne une classe contenant les residus du fit ``gfit''.1098 //--1099 1045 { 1100 1046 if(NBinX()<=0 || NBinY()<=0) … … 1114 1060 } 1115 1061 1116 //++ 1062 /*! 1063 Retourne une classe contenant la fonction du fit ``gfit''. 1064 */ 1117 1065 Histo2D Histo2D::FitFunction(GeneralFit& gfit) 1118 //1119 // Retourne une classe contenant la fonction du fit ``gfit''.1120 //--1121 1066 { 1122 1067 if(NBinX()<=0 || NBinY()<=0) … … 1137 1082 1138 1083 /////////////////////////////////////////////////////////////////// 1139 //++ 1084 /*! 1085 Impression des informations sur l'histogramme. 1086 */ 1140 1087 void Histo2D::PrintStatus() 1141 //1142 // Impression des informations sur l'histogramme.1143 //--1144 1088 { 1145 1089 printf("~Histo::Print nHist=%g nEntries=%d\n",nHist,nEntries); … … 1153 1097 1154 1098 /////////////////////////////////////////////////////////////////// 1155 //++ 1099 /*! 1100 Impression de l'histogramme sur stdout entre [il,ih] et [jl,jh]. 1101 \verbatim 1102 numero d'index: 00000000001111111111222222222233333 1103 01234567890123456789012345678901234 1104 valeur entiere: 00000000001111111111222222222233333 1105 12345678901234567890123456789012345 1106 \endverbatim 1107 */ 1156 1108 void Histo2D::Print(float min,float max 1157 1109 ,int il,int ih,int jl,int jh) 1158 //1159 // Impression de l'histogramme sur stdout entre [il,ih] et [jl,jh].1160 //--1161 1110 { 1162 1111 int ns = 35; 1163 // numero d'index: 000000000011111111112222222222333331164 // 012345678901234567890123456789012341165 // valeur entiere: 000000000011111111112222222222333331166 // 123456789012345678901234567890123451167 1112 const char *s = "+23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 1168 1113 … … 1245 1190 } 1246 1191 1247 // Rappel des inline functions pour commentaires 1248 //++ 1249 // inline float XMin() 1250 // Retourne l'abscisse minimum. 1251 //-- 1252 //++ 1253 // inline float XMax() 1254 // Retourne l'abscisse maximum. 1255 //-- 1256 //++ 1257 // inline float YMin() 1258 // Retourne l'ordonnee minimum. 1259 //-- 1260 //++ 1261 // inline float YMax() 1262 // Retourne l'ordonnee maximum. 1263 //-- 1264 //++ 1265 // inline int NBinX() 1266 // Retourne le nombre de bins selon X. 1267 //-- 1268 //++ 1269 // inline int NBinY() 1270 // Retourne le nombre de bins selon Y. 1271 //-- 1272 //++ 1273 // inline float WBinX() 1274 // Retourne la largeur du bin selon X. 1275 //-- 1276 //++ 1277 // inline float WBinY() 1278 // Retourne la largeur du bin selon Y. 1279 //-- 1280 //++ 1281 // inline float* Bins() const 1282 // Retourne le pointeur sur le tableaux des contenus. 1283 //-- 1284 //++ 1285 // inline float operator()(int i,int j) const 1286 // Retourne le contenu du bin i,j. 1287 //-- 1288 //++ 1289 // inline float& operator()(int i,int j) 1290 // Remplit le contenu du bin i,j. 1291 //-- 1292 //++ 1293 // inline float Error(int i,int j) const 1294 // Retourne l'erreur du bin i,j. 1295 //-- 1296 //++ 1297 // inline double Error2(int i,int j) const 1298 // Retourne l'erreur au carre du bin i,j. 1299 //-- 1300 //++ 1301 // inline double& Error2(int i,int j) 1302 // Remplit l'erreur au carre du bin i,j. 1303 //-- 1304 //++ 1305 // inline float NData() const 1306 // Retourne la somme ponderee. 1307 //-- 1308 //++ 1309 // inline int NEntries() const 1310 // Retourne le nombre d'entrees. 1311 //-- 1312 //++ 1313 // inline void BinLowEdge(int i,int j,float& x,float& y) 1314 // Retourne l'abscisse et l'ordonnee du coin inferieur du bin i,j. 1315 //-- 1316 //++ 1317 // inline void BinCenter(int i,int j,float& x,float& y) 1318 // Retourne l'abscisse et l'ordonnee du centre du bin i,j. 1319 //-- 1320 //++ 1321 // inline void BinHighEdge(int i,int j,float& x,float& y) 1322 // Retourne l'abscisse et l'ordonnee du coin superieur du bin i,j. 1323 //-- 1324 //++ 1325 // inline void FindBin(float x,float y,int& i,int& j) 1326 // Retourne les numeros du bin contenant l'abscisse et l'ordonnee x,y. 1327 //-- 1328 1329 /////////////////////////////////////////////////////////////////// 1330 //++ 1192 /////////////////////////////////////////////////////////////////// 1331 1193 // Titre Methodes pour gerer les projections 1332 //-- 1333 1334 //++ 1194 1195 /*! 1196 Pour creer la projection X. 1197 */ 1335 1198 void Histo2D::SetProjX() 1336 //1337 // Pour creer la projection X.1338 //--1339 1199 { 1340 1200 if( hprojx != NULL ) DelProjX(); … … 1343 1203 } 1344 1204 1345 //++ 1205 /*! 1206 Pour creer la projection Y. 1207 */ 1346 1208 void Histo2D::SetProjY() 1347 //1348 // Pour creer la projection Y.1349 //--1350 1209 { 1351 1210 if( hprojy != NULL ) DelProjY(); … … 1354 1213 } 1355 1214 1356 //++ 1215 /*! 1216 Pour creer les projections X et Y. 1217 */ 1357 1218 void Histo2D::SetProj() 1358 //1359 // Pour creer les projections X et Y.1360 //--1361 1219 { 1362 1220 SetProjX(); … … 1364 1222 } 1365 1223 1366 //++ 1224 /*! 1225 Informations sur les projections. 1226 */ 1367 1227 void Histo2D::ShowProj() 1368 //1369 // Informations sur les projections.1370 //--1371 1228 { 1372 1229 if( hprojx != NULL ) cout << ">>>> Projection X set : "<< hprojx <<endl; … … 1376 1233 } 1377 1234 1378 //++ 1235 /*! 1236 Destruction de l'histogramme de la projection selon X. 1237 */ 1379 1238 void Histo2D::DelProjX() 1380 //1381 // Destruction de l'histogramme de la projection selon X.1382 //--1383 1239 { 1384 1240 if( hprojx == NULL ) return; … … 1387 1243 } 1388 1244 1389 //++ 1245 /*! 1246 Destruction de l'histogramme de la projection selon X. 1247 */ 1390 1248 void Histo2D::DelProjY() 1391 //1392 // Destruction de l'histogramme de la projection selon X.1393 //--1394 1249 { 1395 1250 if( hprojy == NULL ) return; … … 1398 1253 } 1399 1254 1400 //++ 1255 /*! 1256 Destruction des histogrammes des projections selon X et Y. 1257 */ 1401 1258 void Histo2D::DelProj() 1402 //1403 // Destruction des histogrammes des projections selon X et Y.1404 //--1405 1259 { 1406 1260 DelProjX(); … … 1408 1262 } 1409 1263 1410 //++ 1264 /*! 1265 Remise a zero de la projection selon X. 1266 */ 1411 1267 void Histo2D::ZeroProjX() 1412 //1413 // Remise a zero de la projection selon X.1414 //--1415 1268 { 1416 1269 if( hprojx == NULL ) return; … … 1418 1271 } 1419 1272 1420 //++ 1273 /*! 1274 Remise a zero de la projection selon Y. 1275 */ 1421 1276 void Histo2D::ZeroProjY() 1422 //1423 // Remise a zero de la projection selon Y.1424 //--1425 1277 { 1426 1278 if( hprojy == NULL ) return; … … 1428 1280 } 1429 1281 1430 //++ 1282 /*! 1283 Remise a zero des projections selon X et Y. 1284 */ 1431 1285 void Histo2D::ZeroProj() 1432 //1433 // Remise a zero des projections selon X et Y.1434 //--1435 1286 { 1436 1287 ZeroProjX(); … … 1438 1289 } 1439 1290 1440 // Rappel des inline functions pour commentaires 1441 //++ 1442 // inline Histo* HProjX() 1443 // Retourne le pointeur sur l'histo 1D de la projection selon X. 1444 //-- 1445 //++ 1446 // inline Histo* HProjY() 1447 // Retourne le pointeur sur l'histo 1D de la projection selon Y. 1448 //-- 1449 1450 /////////////////////////////////////////////////////////////////// 1451 //++ 1291 /////////////////////////////////////////////////////////////////// 1452 1292 // Titre Methodes pour gerer les bandes 1453 //-- 1454 1455 //++ 1293 1294 /*! 1295 Pour creer une bande en X entre ybmin et ybmax. 1296 */ 1456 1297 int Histo2D::SetBandX(float ybmin,float ybmax) 1457 //1458 // Pour creer une bande en X entre ybmin et ybmax.1459 //--1460 1298 { 1461 1299 b_s.num = lbandx.size(); … … 1468 1306 } 1469 1307 1470 //++ 1308 /*! 1309 Pour creer une bande en Y entre xbmin et xbmax. 1310 */ 1471 1311 int Histo2D::SetBandY(float xbmin,float xbmax) 1472 //1473 // Pour creer une bande en Y entre xbmin et xbmax.1474 //--1475 1312 { 1476 1313 b_s.num = lbandy.size(); … … 1483 1320 } 1484 1321 1485 //++ 1322 /*! 1323 Destruction des histogrammes des bandes selon X. 1324 */ 1486 1325 void Histo2D::DelBandX() 1487 //1488 // Destruction des histogrammes des bandes selon X.1489 //--1490 1326 { 1491 1327 if( lbandx.size() <= 0 ) return; … … 1495 1331 } 1496 1332 1497 //++ 1333 /*! 1334 Destruction des histogrammes des bandes selon Y. 1335 */ 1498 1336 void Histo2D::DelBandY() 1499 //1500 // Destruction des histogrammes des bandes selon Y.1501 //--1502 1337 { 1503 1338 if( lbandy.size() <= 0 ) return; … … 1507 1342 } 1508 1343 1509 //++ 1344 /*! 1345 Remise a zero des bandes selon X. 1346 */ 1510 1347 void Histo2D::ZeroBandX() 1511 //1512 // Remise a zero des bandes selon X.1513 //--1514 1348 { 1515 1349 if( lbandx.size() <= 0 ) return; … … 1519 1353 } 1520 1354 1521 //++ 1355 /*! 1356 Remise a zero des bandes selon Y. 1357 */ 1522 1358 void Histo2D::ZeroBandY() 1523 //1524 // Remise a zero des bandes selon Y.1525 //--1526 1359 { 1527 1360 if( lbandy.size() <= 0 ) return; … … 1531 1364 } 1532 1365 1533 //++ 1366 /*! 1367 Retourne un pointeur sur la bande numero `n' selon X. 1368 */ 1534 1369 Histo* Histo2D::HBandX(int n) const 1535 //1536 // Retourne un pointeur sur la bande numero `n' selon X.1537 //--1538 1370 { 1539 1371 if( lbandx.size() <= 0 || n < 0 || n >= (int) lbandx.size() ) return NULL; … … 1543 1375 } 1544 1376 1545 //++ 1377 /*! 1378 Retourne un pointeur sur la bande numero `n' selon Y. 1379 */ 1546 1380 Histo* Histo2D::HBandY(int n) const 1547 //1548 // Retourne un pointeur sur la bande numero `n' selon Y.1549 //--1550 1381 { 1551 1382 if( lbandy.size() <= 0 || n < 0 || n >= (int) lbandy.size() ) return NULL; … … 1555 1386 } 1556 1387 1557 //++ 1388 /*! 1389 Retourne les limites de la bande numero `n' selon X. 1390 */ 1558 1391 void Histo2D::GetBandX(int n,float& ybmin,float& ybmax) const 1559 //1560 // Retourne les limites de la bande numero `n' selon X.1561 //--1562 1392 { 1563 1393 ybmin = 0.; ybmax = 0.; … … 1568 1398 } 1569 1399 1570 //++ 1400 /*! 1401 Retourne les limites de la bande numero `n' selon Y. 1402 */ 1571 1403 void Histo2D::GetBandY(int n,float& xbmin,float& xbmax) const 1572 //1573 // Retourne les limites de la bande numero `n' selon Y.1574 //--1575 1404 { 1576 1405 xbmin = 0.; xbmax = 0.; … … 1581 1410 } 1582 1411 1583 //++ 1412 /*! 1413 Informations sur les bandes. 1414 */ 1584 1415 void Histo2D::ShowBand(int lp) 1585 //1586 // Informations sur les bandes.1587 //--1588 1416 { 1589 1417 cout << ">>>> Nombre de bande X : " << lbandx.size() << endl; … … 1608 1436 } 1609 1437 1610 // Rappel des inline functions pour commentaires 1611 //++ 1612 // inline int NBandX() 1613 // Retourne le nombre de bandes selon X 1614 //-- 1615 //++ 1616 // inline int NBandY() 1617 // Retourne le nombre de bandes selon Y 1618 //-- 1619 1620 /////////////////////////////////////////////////////////////////// 1621 //++ 1622 // Titre Methodes pour gerer les bandes equidistantes 1623 //-- 1624 1625 //++ 1438 /////////////////////////////////////////////////////////////////// 1439 // Titre Methodes pour gerer les bandes equidistantes ou slices 1440 1441 /*! 1442 Pour creer `nsli' bandes equidistantes selon X. 1443 */ 1626 1444 int Histo2D::SetSliX(int nsli) 1627 //1628 // Pour creer `nsli' bandes equidistantes selon X.1629 //--1630 1445 { 1631 1446 if( nsli <= 0 ) return -1; … … 1645 1460 } 1646 1461 1647 //++ 1462 /*! 1463 Pour creer `nsli' bandes equidistantes selon Y. 1464 */ 1648 1465 int Histo2D::SetSliY(int nsli) 1649 //1650 // Pour creer `nsli' bandes equidistantes selon Y.1651 //--1652 1466 { 1653 1467 if( nsli <= 0 ) return -1; … … 1667 1481 } 1668 1482 1669 //++ 1483 /*! 1484 Destruction des bandes equidistantes selon X. 1485 */ 1670 1486 void Histo2D::DelSliX() 1671 //1672 // Destruction des bandes equidistantes selon X.1673 //--1674 1487 { 1675 1488 if( lslix.size() <= 0 ) return; … … 1679 1492 } 1680 1493 1681 //++ 1494 /*! 1495 Destruction des bandes equidistantes selon Y. 1496 */ 1682 1497 void Histo2D::DelSliY() 1683 //1684 // Destruction des bandes equidistantes selon Y.1685 //--1686 1498 { 1687 1499 if( lsliy.size() <= 0 ) return; … … 1691 1503 } 1692 1504 1693 //++ 1505 /*! 1506 Remise a zero des bandes equidistantes selon X. 1507 */ 1694 1508 void Histo2D::ZeroSliX() 1695 //1696 // Remise a zero des bandes equidistantes selon X.1697 //--1698 1509 { 1699 1510 if( lslix.size() <= 0 ) return; … … 1703 1514 } 1704 1515 1705 //++ 1516 /*! 1517 Remise a zero des bandes equidistantes selon Y. 1518 */ 1706 1519 void Histo2D::ZeroSliY() 1707 //1708 // Remise a zero des bandes equidistantes selon Y.1709 //--1710 1520 { 1711 1521 if( lsliy.size() <= 0 ) return; … … 1715 1525 } 1716 1526 1717 //++ 1527 /*! 1528 Retourne un pointeur sur la bande equidistante numero `n' 1529 selon X. 1530 */ 1718 1531 Histo* Histo2D::HSliX(int n) const 1719 //1720 // Retourne un pointeur sur la bande equidistante numero `n'1721 // selon X.1722 //--1723 1532 { 1724 1533 if( lslix.size() <= 0 || n < 0 || n >= (int) lslix.size() ) return NULL; … … 1728 1537 } 1729 1538 1730 //++ 1539 /*! 1540 Retourne un pointeur sur la bande equidistante numero `n' 1541 selon Y. 1542 */ 1731 1543 Histo* Histo2D::HSliY(int n) const 1732 //1733 // Retourne un pointeur sur la bande equidistante numero `n'1734 // selon Y.1735 //--1736 1544 { 1737 1545 if( lsliy.size() <= 0 || n < 0 || n >= (int) lsliy.size() ) return NULL; … … 1741 1549 } 1742 1550 1743 //++ 1551 /*! 1552 Informations sur les bandes equidistantes. 1553 */ 1744 1554 void Histo2D::ShowSli(int lp) 1745 //1746 // Informations sur les bandes equidistantes.1747 //--1748 1555 { 1749 1556 list<bande_slice>::iterator i; … … 1764 1571 } 1765 1572 } 1766 1767 // Rappel des inline functions pour commentaires1768 //++1769 // inline int NSliX()1770 // Retourne le nombre de slices selon X1771 //--1772 //++1773 // inline int NSliY()1774 // Retourne le nombre de slices selon Y1775 //--1776 1777 1573 1778 1574 /////////////////////////////////////////////////////////// -
trunk/SophyaLib/HiStats/histos2.h
r763 r914 22 22 class GeneralFit; 23 23 24 25 /*! 26 Classe d'histogrammes 2D 27 \verbatim 28 Remarque sur les indices: 29 H(i,j) -> i = coord x (0<i<nx), j = coord y (0<j<ny) 30 v(ii,jj) -> ii = ligne (0<i<NRows()), jj = colonne (0<i<NCol()) 31 On fait une correspondance directe i<->ii et j<->jj 32 ce qui, en representation classique des histos2D et des matrices 33 entraine une inversion x<->y cad une symetrie / diagonale principale 34 H(0,...) represente ^ mais v(0,...) represente 35 |x....... |xxxxxxxx| 36 |x....... |........| 37 |x....... |........| 38 |x....... |........| 39 |x....... |........| 40 ---------> 41 colonne no 1 ligne no 1 42 \endverbatim 43 */ 24 44 class Histo2D : public AnyDataObj { 25 45 friend class ObjFileIO<Histo2D>; … … 75 95 76 96 // INLINES 97 //! Retourne l'abscisse minimum. 77 98 inline float XMin() const {return xmin;} 99 //! Retourne l'abscisse maximum. 78 100 inline float XMax() const {return xmax;} 101 //! Retourne l'ordonnee minimum. 79 102 inline float YMin() const {return ymin;} 103 //! Retourne l'ordonnee maximum. 80 104 inline float YMax() const {return ymax;} 105 //! Retourne le nombre de bins selon X. 81 106 inline int_4 NBinX() const {return nx;} 107 //! Retourne le nombre de bins selon Y. 82 108 inline int_4 NBinY() const {return ny;} 109 //! Retourne la largeur du bin selon X. 83 110 inline float WBinX() const {return wbinx;} 111 //! Retourne la largeur du bin selon Y. 84 112 inline float WBinY() const {return wbiny;} 113 //! Retourne le pointeur sur le tableaux des contenus. 85 114 inline float* Bins() const {return data;} 115 //! Retourne le contenu du bin i,j. 86 116 inline float operator()(int i,int j) const {return data[j*nx+i];} 117 //! Remplit le contenu du bin i,j. 87 118 inline float& operator()(int i,int j) {return data[j*nx+i];} 119 //! retourne "true" si il y a des erreurs stoquees 88 120 inline bool HasErrors() { if(err2) return true; else return false;} 121 //! Retourne l'erreur du bin i,j. 89 122 inline float Error(int i,int j) const 90 123 {if(err2) 91 124 {if(err2[j*nx+i]>0.) return sqrt(err2[j*nx+i]); else return 0.;} 92 125 else return 0.;} 126 //! Remplit l'erreur au carre du bin i,j. 93 127 inline double Error2(int i,int j) const 94 128 {if(err2) return err2[j*nx+i]; else return 0.;} 129 //! Remplit l'erreur au carre du bin i,j. 95 130 inline double& Error2(int i,int j) {return err2[j*nx+i];} 131 //! Retourne la somme ponderee. 96 132 inline float NData() const {return (float) nHist;} 133 //! Retourne le nombre d'entrees. 97 134 inline int_4 NEntries() const {return nEntries;} 135 //! Retourne l'abscisse et l'ordonnee du coin inferieur du bin i,j. 98 136 inline void BinLowEdge(int i,int j,float& x,float& y) 99 137 {x = xmin + i*wbinx; y = ymin + j*wbiny;} 138 //! Retourne l'abscisse et l'ordonnee du centre du bin i,j. 100 139 inline void BinCenter(int i,int j,float& x,float& y) 101 140 {x = xmin + (i+0.5)*wbinx; y = ymin + (j+0.5)*wbiny;} 141 //! Retourne l'abscisse et l'ordonnee du coin superieur du bin i,j. 102 142 inline void BinHighEdge(int i,int j,float& x,float& y) 103 143 {x = xmin + (i+1)*wbinx; y = ymin + (j+1)*wbiny;} 144 //! Retourne les numeros du bin contenant l'abscisse et l'ordonnee x,y. 104 145 inline void FindBin(float x,float y,int& i,int& j) 105 146 { i = (int) floorf((x - xmin)/wbinx); j = (int) floorf((y - ymin)/wbiny);} … … 139 180 void ZeroProjY(); 140 181 void ZeroProj(); 182 //! Retourne le pointeur sur l'histo 1D de la projection selon X. 141 183 inline Histo* HProjX() const {return hprojx;} 184 //! Retourne le pointeur sur l'histo 1D de la projection selon Y. 142 185 inline Histo* HProjY() const {return hprojy;} 143 186 void ShowProj(); 144 187 145 188 // BANDES 189 //! Retourne le nombre de bandes selon X 146 190 inline int NBandX() const {return lbandx.size();} 191 //! Retourne le nombre de bandes selon Y 147 192 inline int NBandY() const {return lbandy.size();} 148 193 int SetBandX(float ybmin,float ybmax); … … 159 204 160 205 // SLICES 206 //! Retourne le nombre de slices selon X 161 207 inline int NSliX() const {return lslix.size();} 208 //! Retourne le nombre de slices selon Y 162 209 inline int NSliY() const {return lsliy.size();} 163 210 int SetSliX(int nsli); … … 174 221 protected: 175 222 #endif 223 //! structure de definition des bandes 176 224 struct bande_slice { 177 int num; 178 float min, max; 179 Histo* H; 225 int num; //!< nombre de bandes 226 float min; //!< limite minimum pour remplir la bande 227 float max; //!< limite maximum pour remplir la bande 228 Histo* H; //!< pointer sur l Histo 1D de la bande 180 229 STRUCTCOMP(bande_slice) 181 230 }; … … 186 235 void Delete(); 187 236 188 float* data; 189 double* err2; 190 191 float over[3][3]; 192 double nHist; 193 int_4 nEntries; 194 195 int_4 nx,ny,nxy; 196 float xmin; 197 float xmax; 198 float ymin; 199 float ymax; 200 float wbinx; 201 float wbiny; 237 float* data; //!< donnees 238 double* err2; //!< erreurs carrees 239 240 float over[3][3]; //!< overflow table 241 double nHist; //!< somme ponderee des entrees 242 int_4 nEntries; //!< nombre d'entrees 243 244 int_4 nx; //!< nombre de bins en X 245 int_4 ny; //!< nombre de bins en Y 246 int_4 nxy; //!< nombre de bins total 247 float xmin; //!< abscisse minimum 248 float xmax; //!< abscisse maximum 249 float ymin; //!< ordonnee minimum 250 float ymax; //!< ordonnee maximum 251 float wbinx; //!< largeur du bin en X 252 float wbiny; //!< largeur du bin en Y 202 253 203 254 bande_slice b_s; 204 255 205 Histo* hprojx; 206 Histo* hprojy; 207 208 list<bande_slice> lbandx; 209 list<bande_slice> lbandy; 256 Histo* hprojx; //!< pointer sur Histo des proj X 257 Histo* hprojy; //!< pointer sur Histo des proj Y 258 259 list<bande_slice> lbandx; //!< liste des bandes selon X 260 list<bande_slice> lbandy; //!< liste des bandes selon Y 210 261 211 list<bande_slice> lslix; 212 list<bande_slice> lsliy; 262 list<bande_slice> lslix; //!< liste des slices selon X 263 list<bande_slice> lsliy; //!< liste des slices selon Y 213 264 214 265 }; -
trunk/SophyaLib/NTools/generaldata.cc
r514 r914 19 19 //================================================================ 20 20 21 //++ 22 // Class GeneralFitData 23 // Lib Outils++ 24 // include generaldata.h 25 // 26 // Classe de stoquage de donnees a plusieurs variables avec erreur 27 // sur l'ordonnee et sur les abscisses (options). 28 //| {x0(i),Ex0(i), x1(i),Ex1(i), x2(i),Ex2(i) ... ; Y(i),EY(i)} 29 //-- 30 31 // Pour memoire, structure du rangement (n=mNVar): 32 // - Valeur des abscisses mXP (idem pour mErrXP): 33 // x0,x1,x2,...,xn x0,x1,x2,...,xn .... x0,x1,x2,....,xn 34 // | 1er point | | 2sd point | .... | point mNData | 35 // Donc abscisse J=[0,mNVar[ du point numero I=[0,mNData[: mXP[I*mNVar+J] 36 // - Valeur de l'ordonnee mF (idem pour mErr et mOK): 37 // f f f 38 // | 1er point | | 2sd point | .... | point mNData | 39 // Donc point numero I [0,mNData[ : mF[i] 40 41 ////////////////////////////////////////////////////////////////////// 42 //++ 21 ////////////////////////////////////////////////////////////////////// 22 /*! 23 Constructeur. ``nVar'' represente la dimension de l'espace des abscisses, 24 ``ndatalloc'' le nombre maximum de points et ``errx'' si non nul 25 indique que l'on fournit des erreurs sur les ``nVar'' variables en abscisse. 26 */ 43 27 GeneralFitData::GeneralFitData(unsigned int nVar, unsigned int ndatalloc, uint_2 errx) 44 //45 // Constructeur. ``nVar'' represente la dimension de l'espace des abscisses,46 // ``ndatalloc'' le nombre maximum de points et ``errx'' si non nul47 // indique que l'on fournit des erreurs sur les ``nVar'' variables en abscisse.48 //--49 28 : mNVar(0), mNDataAlloc(0), mNData(0), mNDataGood(0), mOk_EXP(0) 50 29 , mXP(NULL), mErrXP(NULL), mF(NULL), mErr(NULL), mOK(NULL) … … 59 38 } 60 39 61 //++ 40 /*! 41 Constructeur par copie. Si ``clean'' est ``true'' 42 seules les donnees valides de ``data'' sont copiees. 43 Si ``clean'' est ``false'' (defaut) toutes les donnees 44 sont copiees et la taille totale de ``data'' est allouee 45 meme si elle est plus grande que la taille des donnees stoquees. 46 */ 62 47 GeneralFitData::GeneralFitData(const GeneralFitData& data, bool clean) 63 //64 // Constructeur par copie. Si ``clean'' est ``true''65 // seules les donnees valides de ``data'' sont copiees.66 // Si ``clean'' est ``false'' (defaut) toutes les donnees67 // sont copiees et la taille totale de ``data'' est allouee68 // meme si elle est plus grande que la taille des donnees stoquees.69 //--70 48 : mNVar(0), mNDataAlloc(0), mNData(0), mNDataGood(0), mOk_EXP(0) 71 49 , mXP(NULL), mErrXP(NULL), mF(NULL), mErr(NULL), mOK(NULL) … … 98 76 } 99 77 100 //++ 78 /*! 79 Constructeur par defaut. 80 */ 101 81 GeneralFitData::GeneralFitData() 102 //103 // Constructeur par defaut.104 //--105 82 : mNVar(0), mNDataAlloc(0), mNData(0), mNDataGood(0), mOk_EXP(0) 106 83 , mXP(NULL), mErrXP(NULL), mF(NULL), mErr(NULL), mOK(NULL) … … 110 87 } 111 88 112 //++ 89 /*! 90 Destructeur 91 */ 113 92 GeneralFitData::~GeneralFitData() 114 //115 // Destructeur116 //--117 93 { 118 94 Delete(); … … 120 96 121 97 ////////////////////////////////////////////////////////////////////// 122 //++ 98 /*! 99 Pour redefinir la structure de donnees (ou la creer si on a utilise 100 le createur par defaut). Voir les explications des arguments 101 dans les commentaires du constructeur. Si ``errx''\<0 alors 102 la valeur prise est celle definie auparavent. 103 */ 123 104 void GeneralFitData::Alloc(unsigned int nVar, unsigned int ndatalloc, int_2 errx) 124 //125 // Pour redefinir la structure de donnees (ou la creer si on a utilise126 // le createur par defaut). Voir les explications des arguments127 // dans les commentaires du constructeur. Si ``errx''<0 alors128 // la valeur prise est celle definie auparavent.129 //--130 105 { 131 106 ASSERT( nVar>0 && ndatalloc>0 ); … … 151 126 152 127 ////////////////////////////////////////////////////////////////////// 128 /*! 129 Gestion des des-allocations 130 */ 153 131 void GeneralFitData::Delete() 154 132 { … … 163 141 164 142 ////////////////////////////////////////////////////////////////////// 165 //++ 143 /*! 144 Remise a zero de la structure pour nouveau remplissage (pas d'arg) 145 ou remise a la position ``ptr'' (si arg). Les donnees apres ``ptr'' 146 sont sur-ecrites. 147 */ 166 148 void GeneralFitData::SetDataPtr(int ptr) 167 //168 // Remise a zero de la structure pour nouveau remplissage (pas d'arg)169 // ou remise a la position ``ptr'' (si arg). Les donnees apres ``ptr''170 // sont sur-ecrites.171 //--172 149 { 173 150 ASSERT(ptr >= 0 && ptr < mNDataAlloc); … … 179 156 180 157 ////////////////////////////////////////////////////////////////////// 181 //++ 158 /*! 159 Pour tuer un point 160 */ 182 161 void GeneralFitData::KillData(int i) 183 //184 // Pour tuer un point185 //--186 162 { 187 163 ASSERT(i >= 0 && i < mNData); … … 192 168 } 193 169 194 //++ 170 /*! 171 Pour tuer une serie de points 172 */ 195 173 void GeneralFitData::KillData(int i1,int i2) 196 //197 // Pour tuer une serie de points198 //--199 174 { 200 175 ASSERT(i1 >= 0 && i1 < mNData); … … 206 181 207 182 ////////////////////////////////////////////////////////////////////// 208 //++ 183 /*! 184 Pour re-valider le point numero i ([0,NData]). 185 */ 209 186 void GeneralFitData::ValidData(int i) 210 //211 // Pour re-valider le point numero i ([0,NData]).212 //--213 187 { 214 188 ASSERT(i >= 0 && i < mNData); … … 223 197 } 224 198 225 //++ 199 /*! 200 Pour re-valider les points numeros i1 a i2. 201 */ 226 202 void GeneralFitData::ValidData(int i1,int i2) 227 //228 // Pour re-valider les points numeros i1 a i2.229 //--230 203 { 231 204 ASSERT(i1 >= 0 && i1 < mNData); … … 236 209 } 237 210 238 //++ 211 /*! 212 Pour re-valider tous les points. 213 */ 239 214 void GeneralFitData::ValidData() 240 //241 // Pour re-valider tous les points.242 //--243 215 { 244 216 for(int i=0;i<mNData;i++) ValidData(i); … … 246 218 247 219 ////////////////////////////////////////////////////////////////////// 248 //++ 220 /*! 221 Pour redefinir un point a \f$ {x,[errx] ; f,err} \f$ 222 */ 249 223 void GeneralFitData::RedefineData1(int i,double x,double f,double err,double errx) 250 //251 // Pour redefinir un point a252 //| {x,[errx] ; f,err}253 //--254 224 { 255 225 RedefineData(i,&x,f,err,&errx); 256 226 } 257 227 258 //++ 228 /*! 229 Pour redefinir un point a \f$ {x,[errx], y,[erry] ; f,err} \f$ 230 */ 259 231 void GeneralFitData::RedefineData2(int i,double x,double y,double f 260 232 ,double err,double errx,double erry) 261 //262 // Pour redefinir un point a263 //| {x,[errx], y,[erry] ; f,err}264 //--265 233 { 266 234 double xp[2] = {x,y}; … … 269 237 } 270 238 271 //++ 239 /*! 240 Pour redefinir un point a 241 \f$ {xp[0],[errxp[0]], xp[1],[errxp[1]], xp[2],[errxp[2]],... ; f,err} \f$ 242 */ 272 243 void GeneralFitData::RedefineData(int i,double* xp,double f,double err,double* errxp) 273 //274 // Pour redefinir un point a275 //| {xp[0],[errxp[0]], xp[1],[errxp[1]], xp[2],[errxp[2]],... ; f,err}276 //--277 244 { 278 245 ASSERT(i>=0 && i<mNData); … … 300 267 301 268 ////////////////////////////////////////////////////////////////////// 302 //++ 269 /*! 270 Pour ajouter un point \f$ {x,[errx] ; f,err} \f$ 271 */ 303 272 void GeneralFitData::AddData1(double x, double f, double err, double errx) 304 //305 // Pour ajouter un point306 //| {x,[errx] ; f,err}307 //--308 273 { 309 274 AddData(&x,f,err,&errx); 310 275 } 311 276 312 //++ 277 /*! 278 Pour ajouter un point \f$ {x,[errx], y,[erry] ; f,err} \f$ 279 */ 313 280 void GeneralFitData::AddData2(double x, double y, double f 314 281 , double err, double errx, double erry) 315 //316 // Pour ajouter un point317 //| {x,[errx], y,[erry] ; f,err}318 //--319 282 { 320 283 double xp[2] = {x,y}; … … 323 286 } 324 287 325 //++ 288 /*! 289 Pour ajouter un point 290 \f$ {xp[0],[errxp[0]], xp[1],[errxp[1]], xp[2],[errxp[2]],... ; f,err} \f$ 291 */ 326 292 void GeneralFitData::AddData(double* xp, double f, double err,double* errxp) 327 //328 // Pour ajouter un point329 //| {xp[0],[errxp[0]], xp[1],[errxp[1]], xp[2],[errxp[2]],... ; f,err}330 //--331 293 { 332 294 ASSERT(mNData < mNDataAlloc); … … 351 313 } 352 314 353 //++ 315 /*! 316 Pour ajouter un point 317 \f$ {xp[0],[errxp[0]], xp[1],[errxp[1]], xp[2],[errxp[2]],... ; f,err} \f$ 318 */ 354 319 void GeneralFitData::AddData(float* xp, float f, float err, float* errxp) 355 //356 // Pour ajouter un point357 //| {xp[0],[errxp[0]], xp[1],[errxp[1]], xp[2],[errxp[2]],... ; f,err}358 //--359 320 { 360 321 {for(int i=0;i<mNVar;i++) BuffVar[i] = (double) xp[i];} … … 364 325 365 326 ////////////////////////////////////////////////////////////////////// 366 //++ 327 /*! 328 Pour remplir la structure de donnees d'un seul coup avec 329 \f$ {x(i),[errx(i)] ; f(i),err(i)} \f$ 330 */ 367 331 void GeneralFitData::SetData1(int nData 368 332 , double* x, double* f, double *err, double *errx) 369 //370 // Pour remplir la structure de donnees d'un seul coup avec371 //| {x(i),[errx(i)] ; f(i),err(i)}372 //--373 333 { 374 334 ASSERT(nData>0 && mNData+nData<=mNDataAlloc); … … 381 341 } 382 342 383 //++ 343 /*! 344 Pour remplir la structure de donnees d'un seul coup avec 345 \f$ {x(i),[errx(i)] ; f(i),err(i)} \f$ 346 */ 384 347 void GeneralFitData::SetData1(int nData 385 348 , float* x, float* f, float* err, float *errx) 386 //387 // Pour remplir la structure de donnees d'un seul coup avec388 //| {x(i),[errx(i)] ; f(i),err(i)}389 //--390 349 { 391 350 ASSERT(nData>0 && mNData+nData<=mNDataAlloc); … … 398 357 } 399 358 400 //++ 359 /*! 360 Pour remplir la structure de donnees d'un seul coup avec 361 \f$ {x(i),[errx(i)], y(i),[erry(i)], ; f(i),err(i)} \f$ 362 */ 401 363 void GeneralFitData::SetData2(int nData, double* x, double* y, double* f 402 364 ,double *err,double *errx,double *erry) 403 //404 // Pour remplir la structure de donnees d'un seul coup avec405 //| {x(i),[errx(i)], y(i),[erry(i)], ; f(i),err(i)}406 //--407 365 { 408 366 ASSERT(nData>0 && mNData+nData<=mNDataAlloc); … … 416 374 } 417 375 418 //++ 376 /*! 377 Pour remplir la structure de donnees d'un seul coup avec 378 \f$ {x(i),[errx(i)], y(i),[erry(i)], ; f(i),err(i)} \f$ 379 */ 419 380 void GeneralFitData::SetData2(int nData, float* x, float* y, float* f 420 381 ,float *err,float *errx,float *erry) 421 //422 // Pour remplir la structure de donnees d'un seul coup avec423 //| {x(i),[errx(i)], y(i),[erry(i)], ; f(i),err(i)}424 //--425 382 { 426 383 ASSERT(nData>0 && mNData+nData<=mNDataAlloc); … … 434 391 } 435 392 436 //++ 393 /*! 394 Pour remplir la structure de donnees d'un seul coup avec 395 \f$ {X0(i),[EX0(i)], X1(i),[EX1(i)], X2(i),[EX2(i)], ... ; F(i),Err(i)} \f$ 396 397 Attention: si la structure est n'est pas vide, les tableaux sont copies 398 apres les donnees pre-existantes (qui ne sont donc pas detruites). Pour 399 effacer les donnees pre-existantes utiliser SetDataPtr(0). 400 \verbatim 401 Ici **xp est un pointeur sur un tableau de pointeurs tq 402 xp[0] = &X0[0], xp[1] = &X1[0], xp[2] = &X2[0] ... 403 ou X0,X1,X2,... sont les tableaux X0[nData] X1[nData] X2[nData] ... 404 des variables (meme commentaire pour errxp). 405 \endverbatim 406 */ 437 407 void GeneralFitData::SetData(int nData,double** xp, double *f 438 408 , double *err, double** errxp) 439 //440 // Pour remplir la structure de donnees d'un seul coup avec441 //| {X0(i),[EX0(i)], X1(i),[EX1(i)], X2(i),[EX2(i)], ... ; F(i),Err(i)}442 // Attention: si la structure est n'est pas vide, les tableaux sont copies443 // apres les donnees pre-existantes (qui ne sont donc pas detruites). Pour444 // effacer les donnees pre-existantes utiliser SetDataPtr(0).445 //| Ici **xp est un pointeur sur un tableau de pointeurs tq446 //| xp[0] = &X0[0], xp[1] = &X1[0], xp[2] = &X2[0] ...447 //| ou X0,X1,X2,... sont les tableaux X0[nData] X1[nData] X2[nData] ...448 //| des variables (meme commentaire pour errxp).449 //--450 409 { 451 410 ASSERT(nData>0 && mNData+nData<=mNDataAlloc); … … 461 420 } 462 421 463 //++ 422 /*! 423 Voir commentaire ci-dessus. 424 */ 464 425 void GeneralFitData::SetData(int nData,float** xp, float *f 465 426 , float *err, float** errxp) 466 //467 // Voir commentaire ci-dessus.468 //--469 427 { 470 428 ASSERT(nData>0 && mNData+nData<=mNDataAlloc); … … 482 440 483 441 ////////////////////////////////////////////////////////////////////// 484 //++ 442 /*! 443 Impression de l'etat de la structure de donnees 444 */ 485 445 void GeneralFitData::PrintStatus() 486 //487 // Impression de l'etat de la structure de donnees488 //--489 446 { 490 447 cout<<"GeneralFitData:: "<<endl … … 495 452 } 496 453 497 //++ 454 /*! 455 Impression du point i 456 */ 498 457 void GeneralFitData::PrintData(int i) 499 //500 // Impression du point i501 //--502 458 { 503 459 ASSERT(i>=0 && i<mNData); … … 512 468 } 513 469 514 //++ 470 /*! 471 Impression des points i1 a i2 472 */ 515 473 void GeneralFitData::PrintData(int i1,int i2) 516 //517 // Impression des points i1 a i2518 //--519 474 { 520 475 if(i1<0) i1=0; … … 529 484 } 530 485 531 //++ 486 /*! 487 Impression de tous les points 488 */ 532 489 void GeneralFitData::PrintData() 533 //534 // Impression de tous les points535 //--536 490 { 537 491 ASSERT(mNData>0); … … 540 494 } 541 495 542 //++ 496 /*! 497 Impression de l'etat de la structure de donnees avec bornes sur "s" 498 */ 543 499 void GeneralFitData::Show(ostream& os) const 544 //545 // Impression de l'etat de la structure de donnees avec bornes sur "s"546 //--547 500 { 548 501 double min,max; … … 557 510 558 511 ////////////////////////////////////////////////////////////////////// 559 //++ 512 /*! 513 Retourne les numeros des points de valeurs minimum et maximum 514 de la variable ``var'': 515 \verbatim 516 La variable "var" est de la forme : var = AB avec 517 B = 0 : variable d'ordonnee Y (valeur de A indifferente) 518 B = 1 : erreur variable d'ordonnee EY (valeur de A indifferente) 519 B = 2 : variable d'abscisse X numero A #[0,NVar[ 520 B = 3 : erreur variable d'abscisse EX numero A #[0,NVar[ 521 - Return NData checked si ok, -1 si probleme. 522 \endverbatim 523 */ 560 524 int GeneralFitData::GetMnMx(int var,int& imin,int& imax) const 561 //562 // Retourne les numeros des points de valeurs minimum et maximum563 // de la variable ``var'':564 //| La variable "var" est de la forme : var = AB avec565 //| B = 0 : variable d'ordonnee Y (valeur de A indifferente)566 //| B = 1 : erreur variable d'ordonnee EY (valeur de A indifferente)567 //| B = 2 : variable d'abscisse X numero A #[0,NVar[568 //| B = 3 : erreur variable d'abscisse EX numero A #[0,NVar[569 //| - Return NData checked si ok, -1 si probleme.570 //--571 525 { 572 526 imin = imax = -1; … … 592 546 } 593 547 594 //++ 548 /*! 549 Retourne le minimum et le maximum de la variable ``var'' 550 (cf commentaires GetMnMx). 551 */ 595 552 int GeneralFitData::GetMnMx(int var,double& min,double& max) const 596 //597 // Retourne le minimum et le maximum de la variable ``var''598 // (cf commentaires GetMnMx).599 //--600 553 { 601 554 min = 1.; max = -1.; … … 622 575 623 576 ////////////////////////////////////////////////////////////////////// 624 //++ 577 /*! 578 // 579 Retourne la moyenne et le sigma de la variable ``var'' 580 (cf commentaires GetMnMx). 581 \verbatim 582 - Return : nombre de donnees utilisees, -1 si pb, -2 si sigma<0. 583 - Seuls les points valides de valeur entre min,max sont utilises. 584 Si min>=max pas de coupures sur les valeurs. 585 \endverbatim 586 */ 625 587 int GeneralFitData::GetMeanSigma(int var,double& mean,double& sigma,double min,double max) 626 //627 // Retourne la moyenne et le sigma de la variable ``var''628 // (cf commentaires GetMnMx).629 //| - Return : nombre de donnees utilisees, -1 si pb, -2 si sigma<0.630 //| - Seuls les points valides de valeur entre min,max sont utilises.631 //| Si min>=max pas de coupures sur les valeurs.632 //--633 588 { 634 589 mean = sigma = 0.; … … 661 616 } 662 617 663 //++ 618 /*! 619 Retourne le mode de la variable ``var'' 620 (cf commentaires GetMnMx). 621 \verbatim 622 - Return : nombre de donnees utilisees, -1 si pb. 623 - Seuls les points valides de valeur entre min,max sont utilises. 624 Si min>=max pas de coupures sur les valeurs. 625 - Le calcul du mode est approximee par la formule: 626 Mode = Median - coeff*(Mean-Median) (def: coeff=0.8) 627 - Kendall and Stuart donne coeff=2., mais coeff peut etre regle. 628 \endverbatim 629 */ 664 630 int GeneralFitData::GetMoMeMed(int var,double& mode,double& mean,double& median, 665 631 double min,double max,double coeff) 666 //667 // Retourne le mode de la variable ``var''668 // (cf commentaires GetMnMx).669 //| - Return : nombre de donnees utilisees, -1 si pb.670 //| - Seuls les points valides de valeur entre min,max sont utilises.671 //| Si min>=max pas de coupures sur les valeurs.672 //| - Le calcul du mode est approximee par la formule:673 //| Mode = Median - coeff*(Mean-Median) (def: coeff=0.8)674 //| - Kendall and Stuart donne coeff=2., mais coeff peut etre regle.675 //--676 632 { 677 633 mode = mean = median = 0.; … … 716 672 } 717 673 718 //++ 674 /*! 675 Cf description ci-dessus ``GetMoMeMed''. 676 */ 719 677 int GeneralFitData::GetMode(int var,double& mode,double min,double max,double coeff) 720 //721 // Cf description ci-dessus ``GetMoMeMed''.722 //--723 678 { 724 679 double mean,median; … … 727 682 728 683 ////////////////////////////////////////////////////////////////////// 729 //++ 684 /*! 685 Pour fiter un polynome de degre ``degre''. On fite 686 Y=f(X) ou Y=Val et X=Absc(varx). Si ``ey'' est ``true'' 687 le fit prend en compte les erreurs stoquees dans EVal, 688 sinon fit sans erreurs. Le resultat du fit est retourne 689 dans le polynome ``pol''. 690 \verbatim 691 Return: 692 - Res = le residu du fit 693 - -1 si degre<0 694 - -2 si probleme sur numero de variable X 695 - -4 si NDataGood<0 696 - -5 si nombre de data trouves different de NDataGood 697 \endverbatim 698 */ 730 699 double GeneralFitData::PolFit(int varx,Poly& pol,int degre,bool ey) 731 //732 // Pour fiter un polynome de degre ``degre''. On fite733 // Y=f(X) ou Y=Val et X=Absc(varx). Si ``ey'' est ``true''734 // le fit prend en compte les erreurs stoquees dans EVal,735 // sinon fit sans erreurs. Le resultat du fit est retourne736 // dans le polynome ``pol''.737 //| Return:738 //| - Res = le residu du fit739 //| - -1 si degre<0740 //| - -2 si probleme sur numero de variable X741 //| - -4 si NDataGood<0742 //| - -5 si nombre de data trouves different de NDataGood743 //--744 700 { 745 701 if(degre<0) return -1.; … … 769 725 } 770 726 771 //++ 727 /*! 728 Pour fiter un polynome de degre ``degre1''. On fite 729 Z=f(X,Y) ou Z=Val et X=Absc(varx) et Y=Absc(vary). 730 Si ``ey'' est ``true'' le fit prend en compte les erreurs 731 stoquees dans EVal, sinon fit sans erreurs. Si ``degre2'' 732 negatif, le fit determine un polynome en X,Y de degre 733 total ``degre`''. Si ``degre2'' positif ou nul, le fit 734 demande un fit de ``degre1'' pour la variable X et de degre 735 ``degre2'' sur la variable Y. Le resultat du fit est retourne 736 dans le polynome ``pol''. 737 \verbatim 738 Return: 739 - Res = le residu du fit 740 - -1 si degre<0 741 - -2 si probleme sur numero de variable X 742 - -3 si probleme sur numero de variable Y 743 - -4 si NDataGood<0 744 - -5 si nombre de data trouves different de NDataGood 745 \endverbatim 746 */ 772 747 double GeneralFitData::PolFit(int varx,int vary,Poly2& pol,int degre1,int degre2,bool ez) 773 //774 //775 // Pour fiter un polynome de degre ``degre1''. On fite776 // Z=f(X,Y) ou Z=Val et X=Absc(varx) et Y=Absc(vary).777 // Si ``ey'' est ``true'' le fit prend en compte les erreurs778 // stoquees dans EVal, sinon fit sans erreurs. Si ``degre2''779 // negatif, le fit determine un polynome en X,Y de degre780 // total ``degre`''. Si ``degre2'' positif ou nul, le fit781 // demande un fit de ``degre1'' pour la variable X et de degre782 // ``degre2'' sur la variable Y. Le resultat du fit est retourne783 // dans le polynome ``pol''.784 //| Return:785 //| - Res = le residu du fit786 //| - -1 si degre<0787 //| - -2 si probleme sur numero de variable X788 //| - -3 si probleme sur numero de variable Y789 //| - -4 si NDataGood<0790 //| - -5 si nombre de data trouves different de NDataGood791 //--792 748 { 793 749 if(degre1<0) return -1.; … … 823 779 824 780 ////////////////////////////////////////////////////////////////////// 825 //++ 781 /*! 782 Retourne une classe contenant les residus du fit ``gfit''. 783 */ 826 784 GeneralFitData GeneralFitData::FitResidus(GeneralFit& gfit) 827 //828 // Retourne une classe contenant les residus du fit ``gfit''.829 //--830 785 { 831 786 if(gfit.GetNVar()!=mNVar) … … 834 789 } 835 790 836 //++ 791 /*! 792 Retourne une classe contenant la function du fit ``gfit''. 793 */ 837 794 GeneralFitData GeneralFitData::FitFunction(GeneralFit& gfit) 838 //839 // Retourne une classe contenant la function du fit ``gfit''.840 //--841 795 { 842 796 if(gfit.GetNVar()!=mNVar) … … 846 800 847 801 ////////////////////////////////////////////////////////////////////// 848 //++ 802 /*! 803 // 804 Retourne la donnee `n' dans le vecteur de double `ret'. 805 \verbatim 806 Par defaut, ret=NULL et le buffer interne de la classe est retourne 807 - Les donnees sont rangees dans l'ordre: 808 x0,x1,x2,... ; ex0,ex1,ex2,... ; y ; ey ; ok(0/1) 809 |<- NVar ->| + |<- NVar ->| + 1 + 1 + 1 810 Le vecteur ret a la taille 2*NVar+2+1 811 \endverbatim 812 */ 849 813 r_8* GeneralFitData::GetVec(int n, r_8* ret) const 850 //851 // Retourne la donnee `n' dans le vecteur de double `ret'.852 //| Par defaut, ret=NULL et le buffer interne de la classe est retourne853 //| - Les donnees sont rangees dans l'ordre:854 //| x0,x1,x2,... ; ex0,ex1,ex2,... ; y ; ey ; ok(0/1)855 //| |<- NVar ->| + |<- NVar ->| + 1 + 1 + 1856 //| Le vecteur ret a la taille 2*NVar+2+1857 //--858 814 { 859 815 int i; … … 870 826 } 871 827 872 //++ 828 /*! 829 Retourne la donnee `n' dans le vecteur de float `ret' 830 (meme commentaires que pour GetVec). 831 */ 873 832 r_4* GeneralFitData::GetVecR4(int n, r_4* ret) const 874 //875 // Retourne la donnee `n' dans le vecteur de float `ret'876 // (meme commentaires que pour GetVec).877 //--878 833 { 879 834 if (ret == NULL) ret = BuffVarR4; … … 886 841 887 842 ////////////////////////////////////////////////////////////////////// 888 //++889 // int inline int GetSpaceFree() const890 // Retourne la place restante dans la structure (nombre de891 // donnees que l'on peut encore stoquer).892 //--893 //++894 // inline int NVar() const895 // Retourne le nombre de variables Xi896 //--897 //++898 // inline int NData()899 // Retourne le nombre de donnees900 //--901 //++902 // inline int NDataGood() const903 // Retourne le nombre de bonnes donnees (utilisees pour le fit)904 //--905 //++906 // inline int NDataAlloc() const907 // Retourne la place maximale allouee pour les donnees908 //--909 //++910 // inline unsigned short int IsValid(int i) const911 // Retourne 1 si point valide, sinon 0912 //--913 //++914 // inline bool HasXErrors()915 // Retourne ``true'' si il y a des erreurs sur les variables916 // d'abscisse, ``false'' sinon.917 //--918 //++919 // inline double X1(int i) const920 // Retourne l'abscisse pour 1 dimension (y=f(x)) donnee I921 //--922 //++923 // inline double X(int i) const924 // Retourne la 1er abscisse (X) pour (v=f(x,y,z,...)) donnee I925 //--926 //++927 // inline double Y(int i) const928 // Retourne la 2sd abscisse (Y) pour (v=f(x,y,z,...)) donnee I929 //--930 //++931 // inline double Z(int i) const932 // Retourne la 3ieme abscisse (Z) pour (v=f(x,y,z,...)) donnee I933 //--934 //++935 // inline double Absc(int j,int i) const936 // Retourne la Jieme abscisse (Xj) pour (v=f(x0,x1,x2,...)) donnee I937 //--938 //++939 // inline double Val(int i) const940 // Retourne la valeur de la Ieme donnee941 //--942 //++943 // inline double EX1(int i) const944 // Retourne l'erreur (dx) sur l'abscisse pour 1 dimension (y=f(x)) donnee I945 //--946 //++947 // inline double EX(int i) const948 // Retourne l'erreur (dx) sur la 1er abscisse (X) pour (v=f(x,y,z,...)) donnee I949 //--950 //++951 // inline double EY(int i) const952 // Retourne l'erreur (dy) sur la 2sd abscisse (Y) pour (v=f(x,y,z,...)) donnee I953 //--954 //++955 // inline double EZ(int i) const956 // Retourne l'erreur (dz) sur la 3ieme abscisse (Z) pour (v=f(x,y,z,...)) donnee I957 //--958 //++959 // inline double EAbsc(int j,int i) const960 // Retourne l'erreur (dxj) sur la Jieme abscisse (Xj) pour (v=f(x0,x1,x2,...)) donnee I961 //--962 //++963 // inline double EVal(int i) const {return mErr[i];}964 // Retourne l'erreur de la Ieme donnee965 //--966 967 968 //////////////////////////////////////////////////////////////////////969 843 // ------- Implementation de l interface NTuple --------- 970 844 845 /*! 846 Retourne le nombre de ligne = NData() (pour interface NTuple) 847 */ 971 848 uint_4 GeneralFitData::NbLines() const 972 849 { … … 974 851 } 975 852 976 //++ 853 /*! 854 Retourne le nombre de colonnes du ntuple equivalent: 855 \verbatim 856 Exemple: on a une fonction sur un espace a 4 dimensions: 857 "x0,x1,x2,x3 , ex0,ex1,ex2,ex3 , y, ey , ok" 858 0 1 2 3 4 5 6 7 8 9 10 859 | | | | | | | 860 0 nv-1 nv 2*nv-1 2*nv 2*nv+1 2*nv+2 861 soit 2*nvar+3 variables/colonnes. 862 \endverbatim 863 (pour interface NTuple) 864 */ 977 865 uint_4 GeneralFitData::NbColumns() const 978 //979 // Retourne le nombre de colonnes du ntuple equivalent:980 //| Exemple: on a une fonction sur un espace a 4 dimensions:981 //| "x0,x1,x2,x3 , ex0,ex1,ex2,ex3 , y, ey , ok"982 //| 0 1 2 3 4 5 6 7 8 9 10983 //| | | | | | | |984 //| 0 nv-1 nv 2*nv-1 2*nv 2*nv+1 2*nv+2985 //| soit 2*nvar+3 variables/colonnes.986 //--987 866 { 988 867 return(2*NVar()+3); 989 868 } 990 869 870 //! Pour interface NTuple 991 871 r_8 * GeneralFitData::GetLineD(int n) const 992 872 { … … 994 874 } 995 875 876 //! Pour interface NTuple 996 877 r_8 GeneralFitData::GetCell(int n, int k) const 997 878 { … … 1001 882 } 1002 883 884 //! Pour interface NTuple 1003 885 r_8 GeneralFitData::GetCell(int n, string const & nom) const 1004 886 { … … 1007 889 } 1008 890 1009 //++ 891 /*! 892 Retourne le minimum et le maximum de la variable `k' (pour interface NTuple). 893 */ 1010 894 void GeneralFitData::GetMinMax(int k, double& min, double& max) const 1011 //1012 // Retourne le minimum et le maximum de la variable `k'.1013 //--1014 895 { 1015 896 int var; … … 1024 905 } 1025 906 907 //! Pour interface NTuple 1026 908 void GeneralFitData::GetMinMax(string const & nom, double& min, double& max) const 1027 909 { … … 1030 912 } 1031 913 914 //! Pour interface NTuple 1032 915 int GeneralFitData::ColumnIndex(string const & nom) const 1033 916 { … … 1043 926 } 1044 927 928 //! Pour interface NTuple 1045 929 string GeneralFitData::ColumnName(int k) const 1046 930 { … … 1056 940 } 1057 941 1058 //++ 942 /*! 943 Retourne une chaine de caracteres avec la declaration des noms de 944 variables. si "nomx!=NULL" , des instructions d'affectation 945 a partir d'un tableau "nomx[i]" sont ajoutees (pour interface NTuple). 946 */ 1059 947 string GeneralFitData::VarList_C(const char* nomx) const 1060 //1061 // Retourne une chaine de caracteres avec la declaration des noms de1062 // variables. si "nomx!=NULL" , des instructions d'affectation1063 // a partir d'un tableau "nomx[i]" sont ajoutees.1064 //--1065 948 { 1066 949 char buff[256]; -
trunk/SophyaLib/NTools/generaldata.h
r552 r914 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 39 class GeneralFitData : public AnyDataObj , public NTupleInterface { 22 40 friend class GeneralFit; 23 41 friend class ObjFileIO<GeneralFitData>; 24 42 public: 25 enum {Def_ErrF = 1, Def_ErrX = 0}; 43 //! Valeurs par defaut pour l'utilisation des erreurs 44 enum { 45 Def_ErrF = 1, //!< erreurs sur F par defaut 46 Def_ErrX = 0 //!< pas d'erreurs sur les variables X,Y,... par defaut 47 }; 26 48 27 49 GeneralFitData(unsigned int nVar, unsigned int nDataAlloc, uint_2 errx=0); … … 67 89 inline void Show() const {Show(cout);} 68 90 91 //! Retourne la place restante dans la structure (nombre de donnees que l'on peut encore stoquer). 69 92 inline int GetSpaceFree() const { return mNDataAlloc - mNData; } 93 //! Retourne le nombre de variables Xi 70 94 inline int NVar() const {return mNVar;} 95 //! Retourne le nombre de donnees 71 96 inline int NData() const {return mNData;} 97 //! Retourne le nombre de bonnes donnees (utilisees pour le fit) 72 98 inline int NDataGood() const {return mNDataGood;} 99 //! Retourne la place maximale allouee pour les donnees 73 100 inline int NDataAlloc() const {return mNDataAlloc;} 74 101 102 //! Retourne 1 si point valide, sinon 0 75 103 inline unsigned short int IsValid(int i) const 76 104 {if(i>=0 && i<mNData) return mOK[i]; else return 0;} 105 //! Retourne ``true'' si il y a des erreurs sur les variables d'abscisse, ``false'' sinon. 77 106 inline bool HasXErrors() {if(mErrXP) return true; else return false;} 78 107 108 //! Retourne l'abscisse pour 1 dimension (y=f(x)) donnee I 79 109 inline double X1(int i) const 80 110 {if(i>=0 && i<mNData) return mXP[i]; else return 0.;} 111 //! Retourne la 1er abscisse (X) pour (v=f(x,y,z,...)) donnee I 81 112 inline double X(int i) const 82 113 {if(i>=0 && i<mNData) return mXP[i*mNVar]; else return 0.;} 114 //! Retourne la 2sd abscisse (Y) pour (v=f(x,y,z,...)) donnee I 83 115 inline double Y(int i) const 84 116 {if(i>=0 && i<mNData && 1<mNVar) return mXP[i*mNVar+1]; else return 0.;} 117 //! etourne la 3ieme abscisse (Z) pour (v=f(x,y,z,...)) donnee I 85 118 inline double Z(int i) const 86 119 {if(i>=0 && i<mNData && 2<mNVar) return mXP[i*mNVar+2]; else return 0.;} 120 //! Retourne la Jieme abscisse (Xj) pour (v=f(x0,x1,x2,...)) donnee I 87 121 inline double Absc(int j,int i) const 88 122 {if(i>=0 && i<mNData && j<mNVar)return mXP[i*mNVar+j]; else return 0.;} 123 //! Retourne la valeur de la Ieme donnee 89 124 inline double Val(int i) const 90 125 {if(i>=0 && i<mNData) return mF[i]; else return 0.;} 91 126 127 //! Retourne l'erreur (dx) sur l'abscisse pour 1 dimension (y=f(x)) donnee I 92 128 inline double EX1(int i) const 93 129 {if(mErrXP && i>=0 && i<mNData) return mErrXP[i]; else return 0.;} 130 //! Retourne l'erreur (dx) sur la 1er abscisse (X) pour (v=f(x,y,z,...)) donnee I 94 131 inline double EX(int i) const 95 132 {if(mErrXP && i>=0 && i<mNData) return mErrXP[i*mNVar]; else return 0.;} 133 //! Retourne l'erreur (dy) sur la 2sd abscisse (Y) pour (v=f(x,y,z,...)) donnee I 96 134 inline double EY(int i) const 97 135 {if(mErrXP && i>=0 && i<mNData && 1<mNVar) return mErrXP[i*mNVar+1]; 98 136 else return 0.;} 137 //! Retourne l'erreur (dz) sur la 3ieme abscisse (Z) pour (v=f(x,y,z,...)) donnee I 99 138 inline double EZ(int i) const 100 139 {if(mErrXP && i>=0 && i<mNData && 2<mNVar) return mErrXP[i*mNVar+2]; 101 140 else return 0.;} 141 //! Retourne l'erreur (dxj) sur la Jieme abscisse (Xj) pour (v=f(x0,x1,x2,...)) donnee I 102 142 inline double EAbsc(int j,int i) const 103 143 {if(mErrXP && i>=0 && i<mNData && j<mNVar) return mErrXP[i*mNVar+j]; 104 144 else return 0.;} 145 //! Retourne l'erreur de la Ieme donnee 105 146 inline double EVal(int i) const 106 147 {if(i>=0 && i<mNData) return mErr[i]; else return 0.;} … … 139 180 int_4 mNDataGood; 140 181 uint_2 mOk_EXP; 141 r_8* mXP; // x0 y0 z0, x1 y1 z1, ..., xn yn zn142 r_8* mErrXP; // Ex0 Ey0 Ez0, Ex1 Ey1 Ez1, ..., Exn Eyn Ezn143 r_8* mF; // F0, F1, ...., Fn144 r_8* mErr; // EF0, EF1, ...., EFn145 uint_2* mOK; //1 si pt valid, 0 sinon182 r_8* mXP; //!< x0 y0 z0, x1 y1 z1, ..., xn yn zn 183 r_8* mErrXP; //!< Ex0 Ey0 Ez0, Ex1 Ey1 Ez1, ..., Exn Eyn Ezn 184 r_8* mF; //!< F0, F1, ...., Fn 185 r_8* mErr; //!< EF0, EF1, ...., EFn 186 uint_2* mOK; //!< 1 si pt valid, 0 sinon 146 187 r_8* BuffVar; 147 188 r_4* BuffVarR4; -
trunk/SophyaLib/NTools/generalfit.cc
r774 r914 21 21 //================================================================ 22 22 23 //++ 24 // Class GeneralFunction 25 // Lib Outils++ 26 // include generalfit.h 27 // 28 // Classe de fonctions parametrees a plusieurs variables. 29 //| F[x1,x2,x3,...:a1,a2,a3,...] 30 //-- 31 32 ////////////////////////////////////////////////////////////////////// 33 //++ 23 ////////////////////////////////////////////////////////////////////// 24 /*! 25 Creation d'une fonction de `nVar' variables et `nPar' parametres: 26 \f$ F[x(1),x(2),x(3),...x(nVar) : a(1),a(2),a(3),...,a(nPar)] \f$ 27 */ 34 28 GeneralFunction::GeneralFunction(unsigned int nVar, unsigned int nPar) 35 //36 // Creation d'une fonction de `nVar' variables et `nPar' parametres.37 //| F[x(1),x(2),x(3),...x(nVar) : a(1),a(2),a(3),...,a(nPar)]38 //--39 29 : mNVar(nVar), mNPar(nPar) 40 30 { … … 45 35 } 46 36 47 //++48 37 GeneralFunction::~GeneralFunction() 49 //50 //--51 38 { 52 39 delete[] deltaParm; … … 55 42 56 43 ////////////////////////////////////////////////////////////////////// 57 //++ 44 /*! 45 Valeur et Derivees de la fonction (fct virtuelle par defaut). 46 */ 58 47 double GeneralFunction::Val_Der(double const xp[], double const* parm 59 48 , double *DgDpar) 60 //61 // Valeur et Derivees de la fonction (fct virtuelle par defaut).62 //--63 49 { 64 50 for(int i=0;i<mNPar;i++) tmpParm[i] = parm[i]; … … 77 63 78 64 ////////////////////////////////////////////////////////////////////// 79 //++ 65 /*! 66 Definition de la variation du parametre numPar 67 pour calculer la derivee automatiquement. 68 */ 80 69 void GeneralFunction::SetDeltaParm(int numPar, double d) 81 //82 // Definition de la variation du parametre numPar83 // pour calculer la derivee automatiquement.84 //--85 70 { 86 71 ASSERT(numPar >= 0 && numPar < mNPar); … … 88 73 } 89 74 90 //++ 75 76 /*! 77 Idem precedente fonction mais pour tous les parametres 78 */ 91 79 void GeneralFunction::SetDeltaParm(double const* dparam) 92 //93 // Idem precedente fonction mais pour tous les parametres94 //--95 80 { 96 81 for(int i=0;i<mNPar;i++) deltaParm[i] = dparam[i]; 97 82 } 98 99 //////////////////////////////////////////////////////////////////////100 // Rappel des inline functions pour commentaires101 //++102 // virtual double Value(double const xp[], double const* parm)=0;103 // Valeur de la fonction a definir par l'utilisateur (fct virtuelle pure)104 //--105 //++106 // inline int NVar() const107 // Retourne le nombre de variables Xi108 //--109 //++110 // inline int NPar() const111 // Retourne le nombre de parametres Ai112 //--113 83 114 84 //================================================================ … … 116 86 //================================================================ 117 87 118 //++119 // Class GeneralFunc120 // Lib Outils++121 // include generalfit.h122 //123 // Classe de fonctions parametrees a plusieurs variables124 // derivant de ``GeneralFunction''. Permet de definir125 // une fonction a fiter sans passer par une classe derivee126 // en utilisant l'ecriture courante du C. La fonction127 // retournant les derivees par rapport aux parametres du fit128 // peut etre egalement fournie (optionnel).129 //--130 131 88 ///////////////////////////////////////////////////////////////// 132 //++ 133 GeneralFunc::GeneralFunc(unsigned int nvar, unsigned int npar, double (*fun) (double const*, double const*) 134 , double (*funder) (double const*, double const*, double*) ) 135 // 136 // Createur, on passe le nom ``fun'' de la fonction a la mode C. 137 // On peut optionellement egalement passer le nom de la fonction 138 // ``funder'' qui retourne les valeurs des derivees par rapport 139 // aux parametres du fit. 140 //-- 141 //++ 142 //| ---------------------- 143 //| Exemple d'utilisation: 144 //| ---------------------- 145 //| include "generalfit.h" 146 //| ... 147 //| double gaussc(double const* x,double const* p); 148 //| double d_gaussc(double const* x,double const* p,double* dp); 149 //| ... 150 //| main { 151 //| ... 152 //| // Fit SANS calcul automatique des derivees 153 //| GeneralFunc myfunc(2,7,gaussc); 154 //| GeneralFit myfit(&myfunc); 155 //| ... 156 //| myfit.Fit(); 157 //| ... 158 //| // Fit AVEC calcul automatique des derivees 159 //| GeneralFunc myfunc(2,7,gaussc,d_gaussc); 160 //| GeneralFit myfit(&myfunc); 161 //| ... 162 //| myfit.Fit(); 163 //| } 164 //-- 165 //++ 166 //| // Definition de la fonction a fitter a la mode C 167 //| double gaussc(double const* x,double const* p) 168 //| // Fonction: X=(x[0]-p[1])/p[3], Y=(x[1]-p[2])/p[4], 169 //| // f = p[0]*exp{-0.5*[X^2+Y^2-2*p[5]*X*Y]} + p[6] 170 //| { 171 //| double X = (x[0]-p[1])/p[3]; 172 //| double Y = (x[1]-p[2])/p[4]; 173 //| return p[0]*exp(-(X*X+Y*Y-2*p[5]*X*Y)/2)+p[6]; 174 //| } 175 //| // Definition de la fonction des derivees / parametres 176 //| // Cette fonction retourne aussi la valeur de la fonction a fitter. 177 //| double d_gaussc(double const* x,double const* p,double* dp) 178 //| { 179 //| dp[0] = derivee de gaussc par rapport au parametre p[0] 180 //| ... 181 //| dp[6] = derivee de gaussc par rapport au parametre p[6] 182 //| return gaussc(x,p); 183 //| } 184 //-- 89 /*! 90 Createur, on passe le nom ``fun'' de la fonction a la mode C. 91 On peut optionellement egalement passer le nom de la fonction 92 ``funder'' qui retourne les valeurs des derivees par rapport 93 aux parametres du fit. 94 \verbatim 95 ---------------------- 96 Exemple d'utilisation: 97 ---------------------- 98 include "generalfit.h" 99 ... 100 double gaussc(double const* x,double const* p); 101 double d_gaussc(double const* x,double const* p,double* dp); 102 ... 103 main { 104 ... 105 // Fit SANS calcul automatique des derivees 106 GeneralFunc myfunc(2,7,gaussc); 107 GeneralFit myfit(&myfunc); 108 ... 109 myfit.Fit(); 110 ... 111 // Fit AVEC calcul automatique des derivees 112 GeneralFunc myfunc(2,7,gaussc,d_gaussc); 113 GeneralFit myfit(&myfunc); 114 ... 115 myfit.Fit(); 116 } 117 // Definition de la fonction a fitter a la mode C 118 double gaussc(double const* x,double const* p) 119 // Fonction: X=(x[0]-p[1])/p[3], Y=(x[1]-p[2])/p[4], 120 // f = p[0]*exp{-0.5*[X^2+Y^2-2*p[5]*X*Y]} + p[6] 121 { 122 double X = (x[0]-p[1])/p[3]; 123 double Y = (x[1]-p[2])/p[4]; 124 return p[0]*exp(-(X*X+Y*Y-2*p[5]*X*Y)/2)+p[6]; 125 } 126 // Definition de la fonction des derivees / parametres 127 // Cette fonction retourne aussi la valeur de la fonction a fitter. 128 double d_gaussc(double const* x,double const* p,double* dp) 129 { 130 dp[0] = derivee de gaussc par rapport au parametre p[0] 131 ... 132 dp[6] = derivee de gaussc par rapport au parametre p[6] 133 return gaussc(x,p); 134 } 135 \endverbatim 136 */ 137 GeneralFunc::GeneralFunc(unsigned int nvar, unsigned int npar 138 , double (*fun) (double const*, double const*) 139 , double (*funder) (double const*, double const*, double*) ) 185 140 : GeneralFunction(nvar,npar), tmpFun(fun), tmpFunDer(funder) 186 141 { … … 206 161 //================================================================ 207 162 208 //++ 209 // Class GeneralXi2 210 // Lib Outils++ 211 // include generalfit.h 163 ////////////////////////////////////////////////////////////////////// 164 /*! 212 165 // 213 // Classe de Xi2 a plusieurs parametres. 214 //| Xi2[a1,a2,a3,...] 215 //-- 216 217 ////////////////////////////////////////////////////////////////////// 218 //++ 166 Creation d'un Xi2 de `nPar' parametres. 167 \f$ Xi2[a(1),a(2),a(3),...,a(nPar)] \f$ 168 */ 219 169 GeneralXi2::GeneralXi2(unsigned int nPar) 220 //221 // Creation d'un Xi2 de `nPar' parametres.222 //| Xi2[a(1),a(2),a(3),...,a(nPar)]223 //--224 170 : mNPar(nPar) 225 171 { … … 229 175 } 230 176 231 //++232 177 GeneralXi2::~GeneralXi2() 233 //234 //--235 178 { 236 179 delete[] deltaParm; … … 238 181 239 182 ////////////////////////////////////////////////////////////////////// 240 //++ 183 /*! 184 Derivee du Xi2 par rapport au parametre `i' 185 pour les valeurs `parm' des parametres. 186 */ 241 187 double GeneralXi2::Derivee(GeneralFitData& data, int i, double* parm) 242 //243 // Derivee du Xi2 par rapport au parametre `i'244 // pour les valeurs `parm' des parametres.245 //--246 188 { 247 189 int dum; … … 255 197 } 256 198 257 //++ 199 /*! 200 Derivee seconde du Xi2 par rapport aux parametres `i' et `j' 201 pour les valeurs `parm' des parametres. Attention, cette fonction 202 calcule d/di(dC2/dj), valeur qui est numeriquement differente 203 de d/dj(dC2/di). 204 \verbatim 205 206 **** Remarque: Derivee2 = dXi2/dPi.dPj represente le Hessien. 207 Derivee2(k,l)= dXi2/dPk.dPl 208 = 2*SUMi{1/Si^2*[df(xi;P)/dPk * df(xi;P)/dPl] 209 + [yi-f(xi;P)] * df(xi;P)/dPk.dPl } 210 ou (xi,yi) sont les points de mesure. "Si" l'erreur sur le point i 211 SUMi represente la somme sur les points de mesure 212 f(x;P) represente le modele parametrique a fitter 213 "P" represente l'ensemble des parametres et "Pi" le ieme parametre 214 Les composantes du Hessien dependent des derivees 1ere et 2sd du modele 215 a fitter f(x;P) selon les parametres "Pi". La prise en compte des derivees 216 secondes est un facteur destabilisant. De plus le facteur [yi-f(xi;P)] 217 devant la derivee 2sd est seulement l'erreur de mesure aleatoire qui 218 n'est pas correlee avec le modele. Le terme avec la derivee 2sd 219 tend donc a s'annuler et peut donc etre omis. 220 (cf. Numerical Recipes in C, chap 15 Modeling of Data, Nonlinear Models, 221 Calculation of the Gradient and Hessian p682,683) 222 223 **** Conseil: Il est conseille a l'utilisateur de sur-ecrire 224 la fonction virtuelle Derivee2 et de la remplacer par: 225 Derivee2(k,l) = 2*SUMi{1/Si^2*[df(xi;P)/dPk * df(xi;P)/dPl]} 226 \endverbatim 227 */ 258 228 double GeneralXi2::Derivee2(GeneralFitData& data, int i, int j, double* parm) 259 //260 // Derivee seconde du Xi2 par rapport aux parametres `i' et `j'261 // pour les valeurs `parm' des parametres. Attention, cette fonction262 // calcule d/di(dC2/dj), valeur qui est numeriquement differente263 // de d/dj(dC2/di).264 //--265 //++266 //|267 //| **** Remarque: Derivee2 = dXi2/dPi.dPj represente le Hessien.268 //| Derivee2(k,l)= dXi2/dPk.dPl269 //| = 2*SUMi{1/Si^2*[df(xi;P)/dPk * df(xi;P)/dPl]270 //| + [yi-f(xi;P)] * df(xi;P)/dPk.dPl }271 //| ou (xi,yi) sont les points de mesure. "Si" l'erreur sur le point i272 //| SUMi represente la somme sur les points de mesure273 //| f(x;P) represente le modele parametrique a fitter274 //| "P" represente l'ensemble des parametres et "Pi" le ieme parametre275 //| Les composantes du Hessien dependent des derivees 1ere et 2sd du modele276 //| a fitter f(x;P) selon les parametres "Pi". La prise en compte des derivees277 //| secondes est un facteur destabilisant. De plus le facteur [yi-f(xi;P)]278 //| devant la derivee 2sd est seulement l'erreur de mesure aleatoire qui279 //| n'est pas correlee avec le modele. Le terme avec la derivee 2sd280 //| tend donc a s'annuler et peut donc etre omis.281 //| (cf. Numerical Recipes in C, chap 15 Modeling of Data, Nonlinear Models,282 //| Calculation of the Gradient and Hessian p682,683)283 //|284 //| **** Conseil: Il est conseille a l'utilisateur de sur-ecrire285 //| la fonction virtuelle Derivee2 et de la remplacer par:286 //| Derivee2(k,l) = 2*SUMi{1/Si^2*[df(xi;P)/dPk * df(xi;P)/dPl]}287 //--288 229 { 289 230 double d = deltaParm[i]; … … 298 239 299 240 ////////////////////////////////////////////////////////////////////// 300 //++ 241 /*! 242 Definition de la variation 'd' du parametre 'numPar' 243 pour calculer la derivee automatiquement. 244 */ 301 245 void GeneralXi2::SetDeltaParm(int numPar, double d) 302 //303 // Definition de la variation du parametre numPar304 // pour calculer la derivee automatiquement.305 //--306 246 { 307 247 ASSERT(numPar >= 0 && numPar < mNPar); … … 310 250 } 311 251 312 //++ 252 /*! 253 Idem precedente fonction mais pour tous les parametres. 254 */ 313 255 void GeneralXi2::SetDeltaParm(double const* dparam) 314 //315 // Idem precedente fonction mais pour tous les parametres.316 //--317 256 { 318 257 for(int i=0;i<mNPar;i++) deltaParm[i] = dparam[i]; 319 258 } 320 321 //////////////////////////////////////////////////////////////////////322 // Rappel des inline functions pour commentaires323 //++324 // virtual double Value(GeneralFitData& data, double const* parm, int& ndataused)=0;325 // Valeur du Xi2 a definir par l'utilisateur (fct virtuelle pure)326 // a partir des donnees de `data'. l'utilisateur doit egalement327 // retourner le nombre de points de mesure utilises dans le calcul328 // du Xi2 (`ndataused').329 //--330 //++331 // inline int NPar() const332 // Retourne le nombre de parametres Ai.333 //--334 259 335 260 //================================================================ … … 338 263 // Christophe 8/11/93 La Silla 339 264 // re-codage C++ 16/01/96 Saclay 340 341 //++ 342 // Class GeneralFit 343 // Lib Outils++ 344 // include generalfit.h 345 // 346 // Classe de fit d'une GeneralFunction sur une GeneralFitData 347 //-- 348 349 ////////////////////////////////////////////////////////////////////// 350 //++ 265 ////////////////////////////////////////////////////////////////////// 266 /*! 267 Creation d'une classe de fit pour la `GeneralFunction f'. 268 */ 351 269 GeneralFit::GeneralFit(GeneralFunction* f) 352 //353 // Creation d'une classe de fit pour la `GeneralFunction f'.354 //--355 270 : mNVar (f->NVar()), 356 271 mNPar (f->NPar()), … … 385 300 } 386 301 387 //++ 302 /*! 303 Creation d'une classe de fit pour le `GeneralXi2 f'. 304 L'emploi de cette methode n'est pas conseillee car elle 305 calcule automatiquement la derivee 2sd du Xi2 par rapport 306 aux parametres, ce qui entraine un manque de robustesse 307 et qui ne garanti pas que la matrice de covariance soit 308 definie positive (il est possible de surecrire 309 la methode virtuelle Derivee2 pour palier ce probleme). 310 */ 388 311 GeneralFit::GeneralFit(GeneralXi2* f) 389 //390 // Creation d'une classe de fit pour le `GeneralXi2 f'.391 // L'emploi de cette methode n'est pas conseillee car elle392 // calcule automatiquement la derivee 2sd du Xi2 par rapport393 // aux parametres, ce qui entraine un manque de robustesse394 // et qui ne garanti pas que la matrice de covariance soit395 // definie positive (il est possible de surecrire396 // la methode virtuelle Derivee2 pour palier ce probleme).397 //--398 312 : mNVar (0), 399 313 mNPar (f->NPar()), … … 485 399 } 486 400 487 //++488 401 GeneralFit::~GeneralFit() 489 //490 //--491 402 { 492 403 delete[] fixParam; … … 497 408 498 409 ////////////////////////////////////////////////////////////////////// 499 //++ 410 /*! 411 Pour ecrire les iterations dans le fichier filename 412 */ 500 413 void GeneralFit::WriteStep(char *filename) 501 //502 // Pour ecrire les iterations dans le fichier filename503 //--504 414 { 505 415 … … 513 423 } 514 424 515 //++ 425 /*! 426 Niveau de debug 427 (voir aussi la variable d'environnement PDEBUG_GENERALFIT). 428 */ 516 429 void GeneralFit::SetDebug(int level) 517 //518 // Niveau de debug519 // (voir aussi la variable d'environnement PDEBUG_GENERALFIT).520 //--521 430 { 522 431 debugLevel = ( level < 0 ) ? 0: level; … … 524 433 } 525 434 526 //++ 435 /*! 436 Nombre maximum d'iterations permis. 437 */ 527 438 void GeneralFit::SetMaxStep(int n) 528 //529 // Nombre maximum d'iterations permis.530 //--531 439 { 532 440 maxStep = ( n <= 1 ) ? 100: n; … … 534 442 } 535 443 536 //++ 444 /*! 445 Facteur de multiplication/division de Lambda selon 446 que le Chi2 a augmente ou diminue. 447 */ 537 448 void GeneralFit::SetLambda_Fac(double fac) 538 //539 // Facteur de multiplication/division de Lambda selon540 // que le Chi2 a augmente ou diminue.541 //--542 449 { 543 450 Lambda_Fac = (fac>1.) ? fac : 10.; 544 451 } 545 452 546 //++ 453 /*! 454 Critere de convergence sur le Chi2. 455 */ 547 456 void GeneralFit::SetStopChi2(double s) 548 //549 // Critere de convergence sur le Chi2.550 //--551 457 { 552 458 stopChi2 = ( s <= 0. ) ? 0.01: s; … … 554 460 } 555 461 556 //++ 462 /*! 463 Precision des calculs (cf \ref GeneralFit_Fit "descriptif general"). 464 */ 557 465 void GeneralFit::SetEps(double ep) 558 //559 // Precision des calculs (cf descriptif general).560 //--561 466 { 562 467 ep = (ep<=0.) ? EPS_FIT_MIN: ep; … … 565 470 } 566 471 567 //++ 472 /*! 473 Precision des calculs pour le parametre n. 474 */ 568 475 void GeneralFit::SetEps(int n,double ep) 569 //570 // Precision des calculs pour le parametre n.571 //--572 476 { 573 477 ASSERT(n>=0 && n<mNPar); … … 576 480 } 577 481 578 //++ 482 /*! 483 Critere de convergence sur le nombre de stop en chi2 484 dans le cas ou le chi2 augmente de moins de stopchi2 485 (cf \ref GeneralFit_Fit "descriptif general"). 486 487 Si nstopmx<=0, alors ce critere de convergence n'est pas applique. 488 489 Si stopchi2<=0, alors la valeur generale mise par SetStopChi2() 490 est utilisee. 491 */ 579 492 void GeneralFit::SetStopMx(int nstopmx,double stopchi2) 580 //581 // Critere de convergence sur le nombre de stop en chi2582 // dans le cas ou le chi2 augmente de moins de stopchi2583 // (cf descriptif general).584 // Si nstopmx<=0, alors ce critere de convergence n'est pas applique.585 // Si stopchi2<=0, alors la valeur generale mise par SetStopChi2()586 // est utilisee.587 //--588 493 { 589 494 nStopMx = (nstopmx>0) ? nstopmx : 0; … … 593 498 } 594 499 595 //++ 500 /*! 501 Critere de convergence sur le nombre de stop en chi2 502 dans le cas ou le chi2 diminue (cf \ref GeneralFit_Fit "descriptif general"). 503 504 Si nstopl<=0, alors ce critere de convergence n'est pas applique. 505 */ 596 506 void GeneralFit::SetStopLent(int nstoplent) 597 //598 // Critere de convergence sur le nombre de stop en chi2599 // dans le cas ou le chi2 diminue (cf descriptif general).600 // Si nstopl<=0, alors ce critere de convergence n'est pas applique.601 //--602 507 { 603 508 nStopLent = (nstoplent>0) ? nstoplent : 0; … … 606 511 607 512 ////////////////////////////////////////////////////////////////////// 608 //++ 513 /*! 514 Pour changer la fonction a fitter en cours de route 515 (On ne peut passer d'un fit sur une GeneralFunction 516 a un fit sur un GeneralXi2 sans recreer la classe). 517 */ 609 518 void GeneralFit::SetFunction(GeneralFunction* f) 610 //611 // Pour changer la fonction a fitter en cours de route612 // (On ne peut passer d'un fit sur une GeneralFunction613 // a un fit sur un GeneralXi2 sans recreer la classe).614 //--615 519 { 616 520 ASSERT( mFuncXi2 == NULL ); … … 622 526 } 623 527 624 //++ 528 /*! 529 Pour changer le Xi2 a fitter en cours de route 530 (On ne peut passer d'un fit sur une GeneralFunction 531 a un fit sur un GeneralXi2 sans recreer la classe). 532 */ 625 533 void GeneralFit::SetFuncXi2(GeneralXi2* f) 626 //627 // Pour changer le Xi2 a fitter en cours de route628 // (On ne peut passer d'un fit sur une GeneralFunction629 // a un fit sur un GeneralXi2 sans recreer la classe).630 //--631 534 { 632 535 ASSERT( mFunction == NULL ); … … 638 541 639 542 ////////////////////////////////////////////////////////////////////// 640 //++ 543 /*! 544 Pour connecter une structure de donnees. 545 */ 641 546 void GeneralFit::SetData(GeneralFitData* data) 642 //643 // Pour connecter une structure de donnees.644 //--645 547 { 646 548 ASSERT( data->NVar()==mNVar ); … … 652 554 653 555 ////////////////////////////////////////////////////////////////////// 654 //++ 556 /*! 557 Definition du parametre "n" a fitter. 558 */ 655 559 void GeneralFit::SetParam(int n,double value,double step 656 560 ,double min,double max) 657 //658 // Definition du parametre "n" a fitter.659 //--660 561 { 661 562 ASSERT(n>=0 && n<mNPar); … … 679 580 } 680 581 681 //++ 582 /*! 583 Definition du parametre "n" a fitter 584 */ 682 585 void GeneralFit::SetParam(int n, string const& name 683 586 ,double value,double step,double min,double max) 684 //685 // Definition du parametre "n" a fitter686 //--687 587 { 688 588 ASSERT(n>=0 && n<mNPar); … … 692 592 } 693 593 694 //++ 594 /*! 595 Definition du parametre "n" a fitter 596 */ 695 597 void GeneralFit::SetParam(int n,double value) 696 //697 // Definition du parametre "n" a fitter698 //--699 598 { 700 599 ASSERT(n>=0 && n<mNPar); … … 704 603 705 604 ////////////////////////////////////////////////////////////////////// 706 //++ 605 /*! 606 Definition du pas de depart du parametre "n" 607 Si negatif ou nul, parametre fixe. 608 */ 707 609 void GeneralFit::SetStep(int n,double step) 708 //709 // Definition du pas de depart du parametre "n"710 // Si negatif ou nul, parametre fixe.711 //--712 610 { 713 611 ASSERT(n>=0 && n<mNPar); … … 721 619 } 722 620 723 //++ 621 /*! 622 Definition du pas minimum `val' pour le parametre `i' 623 pouvant etre utilise dans le calcul automatique des derivees 624 (soit de la fonction, soit du Xi2 selon les parametres du fit). 625 Si nul pas de limite, si negatif alors `EPS(i)' (cf SetEps). 626 Inutile dans le cas ou les derivees sont donnees 627 par l'utilisateur. 628 */ 724 629 void GeneralFit::SetMinStepDeriv(int i,double val) 725 //726 // Definition du pas minimum `val' pour le parametre `i'727 // pouvant etre utilise dans le calcul automatique des derivees728 // (soit de la fonction, soit du Xi2 selon les parametres du fit).729 // Si nul pas de limite, si negatif alors `EPS(i)' (cf SetEps).730 // Inutile dans le cas ou les derivees sont donnees731 // par l'utilisateur.732 //--733 630 { 734 631 ASSERT(i>=0 && i<mNPar); … … 738 635 } 739 636 740 //++ 637 /*! 638 Definition du pas minimum `val' pour tout les parametres 639 (voir description SetMinStepDeriv ci-dessus). 640 */ 741 641 void GeneralFit::SetMinStepDeriv(double val) 742 //743 // Definition du pas minimum `val' pour tout les parametres744 // (voir description SetMinStepDeriv ci-dessus).745 //--746 642 { 747 643 if(debugLevel>0) cout<<"SetMinStepDeriv "<<val<<endl; … … 750 646 751 647 ////////////////////////////////////////////////////////////////////// 752 //++ 648 /*! 649 Definition des bornes du parametre "n" 650 Si max<=min, parametre non-borne. 651 */ 753 652 void GeneralFit::SetBound(int n, double min, double max) 754 //755 // Definition des bornes du parametre "n"756 // Si max<=min, parametre non-borne.757 //--758 653 { 759 654 ASSERT(n>=0 && n<mNPar && max>min); … … 770 665 } 771 666 772 //++ 667 /*! 668 Pour re-borner le parametre "n" aux bornes par defaut 669 */ 773 670 void GeneralFit::SetBound(int n) 774 //775 // Pour re-borner le parametre "n" aux bornes par defaut776 //--777 671 { 778 672 ASSERT(n>=0 && n<mNPar && maxParam(n)>minParam(n)); … … 780 674 } 781 675 782 //++ 676 /*! 677 Pour ne plus borner le parametre "n" 678 */ 783 679 void GeneralFit::SetUnBound(int n) 784 //785 // Pour ne plus borner le parametre "n"786 //--787 680 { 788 681 ASSERT(n>=0 && n<mNPar); … … 796 689 } 797 690 798 //++ 691 /*! 692 Pour ne plus borner tous les parametres 693 */ 799 694 void GeneralFit::SetUnBound() 800 //801 // Pour ne plus borner tous les parametres802 //--803 695 { 804 696 for(int i=0;i<mNPar;i++) SetUnBound(i); … … 806 698 807 699 ////////////////////////////////////////////////////////////////////// 808 //++ 700 /*! 701 Pour fixer le parametre "n" a la valeur "v" 702 */ 809 703 void GeneralFit::SetFix(int n,double v) 810 //811 // Pour fixer le parametre "n" a la valeur "v"812 //--813 704 { 814 705 ASSERT(n>=0 && n<mNPar); … … 825 716 } 826 717 827 //++ 718 /*! 719 Pour fixer le parametre "n" a la valeur par defaut 720 */ 828 721 void GeneralFit::SetFix(int n) 829 //830 // Pour fixer le parametre "n" a la valeur par defaut831 //--832 722 { 833 723 ASSERT(n>=0 && n<mNPar); … … 835 725 } 836 726 837 //++ 727 /*! 728 Pour liberer le parametre "n" 729 */ 838 730 void GeneralFit::SetFree(int n) 839 //840 // Pour liberer le parametre "n"841 //--842 731 { 843 732 ASSERT(n>=0 && n<mNPar); … … 855 744 } 856 745 857 //++ 746 /*! 747 Pour liberer tous les parametres 748 */ 858 749 void GeneralFit::SetFree() 859 //860 // Pour liberer tous les parametres861 //--862 750 { 863 751 for(int i=0;i<mNPar;i++) SetFree(i); … … 865 753 866 754 ////////////////////////////////////////////////////////////////////// 867 //++ 755 /*! 756 Retourne la valeur du parametre "n" 757 */ 868 758 double GeneralFit::GetParm(int n) 869 //870 // Retourne la valeur du parametre "n"871 //--872 759 { 873 760 ASSERT(n>=0 && n<mNPar); … … 875 762 } 876 763 877 //++ 764 /*! 765 Retourne les valeurs des parametres dans un vecteur. 766 */ 878 767 Vector GeneralFit::GetParm() 879 //880 // Retourne les valeurs des parametres dans un vecteur.881 //--882 768 { 883 769 return Param; 884 770 } 885 771 886 //++ 772 /*! 773 Retourne la valeur de l'erreur du parametre "n" 774 */ 887 775 double GeneralFit::GetParmErr(int n) 888 //889 // Retourne la valeur de l'erreur du parametre "n"890 //--891 776 { 892 777 ASSERT(n>=0 && n<mNPar); … … 894 779 } 895 780 896 //++ 781 /*! 782 Retourne la covariance pour les parametre `i' et `j' 783 */ 897 784 double GeneralFit::GetCoVar(int i,int j) 898 //899 // Retourne la covariance pour les parametre `i' et `j'900 //--901 785 { 902 786 ASSERT(i>=0 && i<mNPar && j>=0 && j<mNPar); … … 905 789 906 790 ////////////////////////////////////////////////////////////////////// 907 //++ 791 /*! 792 Retourne la valeur du pas du parametre "n" 793 */ 908 794 double GeneralFit::GetStep(int n) 909 //910 // Retourne la valeur du pas du parametre "n"911 //--912 795 { 913 796 ASSERT(n>=0 && n<mNPar); … … 915 798 } 916 799 917 //++ 800 /*! 801 Retourne la valeur de la borne superieure du parametre "n" 802 */ 918 803 double GeneralFit::GetMax(int n) 919 //920 // Retourne la valeur de la borne superieure du parametre "n"921 //--922 804 { 923 805 ASSERT(n>=0 && n<mNPar); … … 925 807 } 926 808 927 //++ 809 /*! 810 Retourne la valeur de la borne inferieure du parametre "n" 811 */ 928 812 double GeneralFit::GetMin(int n) 929 //930 // Retourne la valeur de la borne inferieure du parametre "n"931 //--932 813 { 933 814 ASSERT(n>=0 && n<mNPar); … … 936 817 937 818 ////////////////////////////////////////////////////////////////////// 938 //++ 819 /*! 820 Impression du status du fit 821 */ 939 822 void GeneralFit::PrintStatus() 940 //941 // Impression du status du fit942 //--943 823 { 944 824 cout<<"GeneralFit::PrintStatus" … … 962 842 } 963 843 964 //++ 844 /*! 845 Impression des resultats du fit 846 */ 965 847 void GeneralFit::PrintFit() 966 //967 // Impression des resultats du fit968 //--969 848 { 970 849 cout<<"PrintFit: Chi2="<<Chi2 … … 978 857 } 979 858 980 //++ 859 /*! 860 Impression des informations relatives au parametre "n" 861 */ 981 862 void GeneralFit::PrintParm(int n) 982 //983 // Impression des informations relatives au parametre "n"984 //--985 863 { 986 864 ASSERT(n>=0 && n<mNPar); … … 999 877 } 1000 878 1001 //++ 879 /*! 880 Impression des informations relatives a tous les parametres 881 */ 1002 882 void GeneralFit::PrintParm() 1003 //1004 // Impression des informations relatives a tous les parametres1005 //--1006 883 { 1007 884 cout<<"*** Parametres : fix bnd : par err : step min max : eps dmin\n"; … … 1011 888 1012 889 ////////////////////////////////////////////////////////////////////// 1013 //++ 890 /*! 891 Methode de fit. 892 \anchor GeneralFit_Fit 893 \verbatim 894 Fonction de fit de la fonction f(x,y,z,...:p1,p2,...,pn) 895 sur les donnees x[i],y[i],z[i],...,F[i],ErrF[i] 896 - Methode: fit des moindres carres dans le cas non lineaire 897 - Reference: Statistical and Computational Methods in Data Analysis 898 Siegmund Brandt, North-Holland 1970 p 204-206. 899 Introduction des limites pour la variation des parametres (cmv). 900 Increment des parametres selon la methode de Levenberg-Marquardt 901 (Numerical Recipes in C, chap 15 Modeling of Data, Nonlinear Models, 902 Levenberg-Marquardt Method p683) 903 - Gestion des parametres bornes: 904 si p est un parametre borne entre pmin et pmax, le parametre fitte est q 905 tel que q = tang((p-C)/D) .... p = C + D*atan(q) 906 ou C = (pmin+pmax)/2. et D = (pmax-pmin)/Pi 907 On a dq = (1+q**2)/D * dp .... dp = D/(1+q**2) * dq 908 et dF/dq = dF/dp * dp/dq = D/(1+q**2) * dF/dp 909 dF/dp = dF/dq * dq/dp = (1+q**2)/D * dF/dp 910 ^ q 911 | | *| "tang()" 912 | | *| 913 | | *| 914 | | * | 915 | | * | 916 | | * | 917 | | * | 918 Pmin| C| * |Pmax 919 --------------|---------------*---------------|--------------> p 920 -Pi/2| * |0 |Pi/2 921 | * | | 922 | * | | 923 | * | | 924 | * | | 925 |* | | 926 |* | | 927 |* | | 928 <------------------- D ---------> 929 930 - Criteres de convergence, arrets standards: 931 - SOIT: le Chi2 est descendu de moins de stopChi2 932 entre l'iteration n et n+1 933 (stopChi2 est change par SetStopChi2) 934 - SOIT: 1. le chi2 est remonte de moins de stopChi2SMx et 935 2. les parametres libres ont varie de moins de Eps(i) 936 pendant les nStopmx dernieres iterations 937 Si nStopmx<=0, alors ce critere n'est pas applique (def=3). 938 (nStopmx,stopChi2SMx sont changes par SetStopMx, Eps par SetEps) 939 940 - Criteres de convergence, arrets par non-convergence: 941 - plus de "maxStep" iterations. 942 943 - Criteres de convergence, arrets speciaux: 944 - Si l'utilisateur a demande explicitement la methode d'arret 945 "SetStopLent()", arret si : 946 1. le Chi2 est descendu et 947 2. les parametres libres ont varies de moins de Eps 948 pendant les nStopLent dernieres iterations. 949 (nStopLent est change par SetStopLent, Eps par SetEps) 950 951 - Remarques diverses: 952 Les points avec erreurs <=0 ne sont pas utilises dans le fit. 953 Les bornes des parametres ne peuvent etre atteintes 954 - entrees: 955 la fonction est definie par une classe GeneralFunction 956 les donnees sont passees par une classe GeneralFitData 957 le nombre de parametres et le nombre de variables doivent etre 958 coherents entre GeneralFunction GeneralFitData GeneralFit 959 - Return: 960 la function elle meme retourne le nombre d'iterations du fit si succes 961 -1 : si le nombre de degre de liberte est <0 962 -10 : si l'inversion de la matrice des erreurs n'a pas ete possible 963 -11 : si un element diagonal de la matrice des covariances est <=0 964 -20 : si le fit n'a pas converge (nstep>nNstepMX) 965 -100-N : si le parametre "N" est initialise hors limites 966 -200-N : si le parametre "N" atteint sa limite inferieure 967 -300-N : si le parametre "N" atteint sa limite superieure 968 \endverbatim 969 */ 1014 970 int GeneralFit::Fit() 1015 //1016 //--1017 //++1018 //| Fonction de fit de la fonction f(x,y,z,...:p1,p2,...,pn)1019 //| sur les donnees x[i],y[i],z[i],...,F[i],ErrF[i]1020 //| - Methode: fit des moindres carres dans le cas non lineaire1021 //| - Reference: Statistical and Computational Methods in Data Analysis1022 //| Siegmund Brandt, North-Holland 1970 p 204-206.1023 //| Introduction des limites pour la variation des parametres (cmv).1024 //| Increment des parametres selon la methode de Levenberg-Marquardt1025 //| (Numerical Recipes in C, chap 15 Modeling of Data, Nonlinear Models,1026 //| Levenberg-Marquardt Method p683)1027 //--1028 //++1029 //| - Gestion des parametres bornes:1030 //| si p est un parametre borne entre pmin et pmax, le parametre fitte est q1031 //| tel que q = tang((p-C)/D) .... p = C + D*atan(q)1032 //| ou C = (pmin+pmax)/2. et D = (pmax-pmin)/Pi1033 //| On a dq = (1+q**2)/D * dp .... dp = D/(1+q**2) * dq1034 //| et dF/dq = dF/dp * dp/dq = D/(1+q**2) * dF/dp1035 //| dF/dp = dF/dq * dq/dp = (1+q**2)/D * dF/dp1036 //| ^ q1037 //| | | *| "tang()"1038 //| | | *|1039 //| | | *|1040 //| | | * |1041 //| | | * |1042 //| | | * |1043 //| | | * |1044 //| Pmin| C| * |Pmax1045 //| --------------|---------------*---------------|--------------> p1046 //| -Pi/2| * |0 |Pi/21047 //| | * | |1048 //| | * | |1049 //| | * | |1050 //| | * | |1051 //| |* | |1052 //| |* | |1053 //| |* | |1054 //| <------------------- D --------->1055 //--1056 //++1057 //| - Criteres de convergence, arrets standards:1058 //| - SOIT: le Chi2 est descendu de moins de stopChi21059 //| entre l'iteration n et n+11060 //| (stopChi2 est change par SetStopChi2)1061 //| - SOIT: 1. le chi2 est remonte de moins de stopChi2SMx et1062 //| 2. les parametres libres ont varie de moins de Eps(i)1063 //| pendant les nStopmx dernieres iterations1064 //| Si nStopmx<=0, alors ce critere n'est pas applique (def=3).1065 //| (nStopmx,stopChi2SMx sont changes par SetStopMx, Eps par SetEps)1066 //|1067 //| - Criteres de convergence, arrets par non-convergence:1068 //| - plus de "maxStep" iterations.1069 //|1070 //| - Criteres de convergence, arrets speciaux:1071 //| - Si l'utilisateur a demande explicitement la methode d'arret1072 //| "SetStopLent()", arret si :1073 //| 1. le Chi2 est descendu et1074 //| 2. les parametres libres ont varies de moins de Eps1075 //| pendant les nStopLent dernieres iterations.1076 //| (nStopLent est change par SetStopLent, Eps par SetEps)1077 //|1078 //--1079 //++1080 //| - Remarques diverses:1081 //| Les points avec erreurs <=0 ne sont pas utilises dans le fit.1082 //| Les bornes des parametres ne peuvent etre atteintes1083 //| - entrees:1084 //| la fonction est definie par une classe GeneralFunction1085 //| les donnees sont passees par une classe GeneralFitData1086 //| le nombre de parametres et le nombre de variables doivent etre1087 //| coherents entre GeneralFunction GeneralFitData GeneralFit1088 //| - Return:1089 //| la function elle meme retourne le nombre d'iterations du fit si succes1090 //| -1 : si le nombre de degre de liberte est <01091 //| -10 : si l'inversion de la matrice des erreurs n'a pas ete possible1092 //| -11 : si un element diagonal de la matrice des covariances est <=01093 //| -20 : si le fit n'a pas converge (nstep>nNstepMX)1094 //| -100-N : si le parametre "N" est initialise hors limites1095 //| -200-N : si le parametre "N" atteint sa limite inferieure1096 //| -300-N : si le parametre "N" atteint sa limite superieure1097 //--1098 971 { 1099 972 volatile double oldChi2; … … 1385 1258 1386 1259 ////////////////////////////////////////////////////////////////////// 1387 //++ 1260 /*! 1261 Recalcul du Chi2 a partir des parametres courants (`par==NULL') 1262 ou a partir du tableau de parametres `par'. 1263 Retourne le chi2 et le nombre de degres de liberte. 1264 Si nddl<0 probleme. 1265 */ 1388 1266 double GeneralFit::ReCalChi2(int& nddl, double *par) 1389 //1390 // Recalcul du Chi2 a partir des parametres courants (`par==NULL')1391 // ou a partir du tableau de parametres `par'.1392 // Retourne le chi2 et le nombre de degres de liberte.1393 // Si nddl<0 probleme.1394 //--1395 1267 { 1396 1268 double c2 = -1.; … … 1430 1302 1431 1303 ////////////////////////////////////////////////////////////////////// 1432 //++ 1304 /*! 1305 Retourne une structure ``GeneralFitData'' contenant 1306 les residus du fit (val-func) pour les points du fit. 1307 Si ``clean'' est ``true'' 1308 seules les donnees valides de ``data'' sont copiees. 1309 Si ``clean'' est ``false'' (defaut) toutes les donnees 1310 sont copiees et la taille totale de ``data'' est allouee 1311 meme si elle est plus grande que la taille des donnees stoquees. 1312 */ 1433 1313 GeneralFitData GeneralFit::DataResidus(bool clean) 1434 //1435 // Retourne une structure ``GeneralFitData'' contenant1436 // les residus du fit (val-func) pour les points du fit.1437 // Si ``clean'' est ``true''1438 // seules les donnees valides de ``data'' sont copiees.1439 // Si ``clean'' est ``false'' (defaut) toutes les donnees1440 // sont copiees et la taille totale de ``data'' est allouee1441 // meme si elle est plus grande que la taille des donnees stoquees.1442 //--1443 1314 { 1444 1315 if(!mData || !mFunction) … … 1451 1322 1452 1323 ////////////////////////////////////////////////////////////////////// 1453 //++ 1324 /*! 1325 Retourne une structure ``GeneralFitData'' contenant 1326 les valeurs de la fonction fittee pour les points du fit. 1327 (voir commentaires pour ``clean'' dans ``DataResidus'') 1328 */ 1454 1329 GeneralFitData GeneralFit::DataFunction(bool clean) 1455 //1456 // Retourne une structure ``GeneralFitData'' contenant1457 // les valeurs de la fonction fittee pour les points du fit.1458 // (voir commentaires pour ``clean'' dans ``DataResidus'')1459 //--1460 1330 { 1461 1331 if(!mData || !mFunction) … … 1468 1338 1469 1339 ////////////////////////////////////////////////////////////////////// 1470 //++ 1340 /*! 1341 Imprime le commentaire lie a l'erreur rc retournee par Fit() 1342 (voir le commentaire de la methode `Fit()') 1343 */ 1471 1344 void GeneralFit::PrintFitErr(int rc) 1472 //1473 // Imprime le commentaire lie a l'erreur rc retournee par Fit()1474 // (voir le commentaire de la methode `Fit()')1475 //--1476 1345 { 1477 1346 int n; … … 1632 1501 1633 1502 ////////////////////////////////////////////////////////////////////// 1503 /*! 1504 \verbatim 1505 C = (min+max)/2 1506 D = (max-min)/Pi 1507 \endverbatim 1508 */ 1634 1509 void GeneralFit::Set_Bound_C_D(int i) 1635 // C = (min+max)/21636 // D = (max-min)/Pi1637 1510 { 1638 1511 // ASSERT(i>=0 && i<mNPar); … … 1656 1529 1657 1530 ////////////////////////////////////////////////////////////////////// 1531 /*! 1532 \verbatim 1533 tr = tan( (p-C)/D ) 1534 \endverbatim 1535 */ 1658 1536 double GeneralFit::p_vers_tr(int i,double p) 1659 // tr = tan( (p-C)/D )1660 1537 { 1661 1538 // ASSERT(i>=0 && i<mNPar); … … 1687 1564 1688 1565 ////////////////////////////////////////////////////////////////////// 1566 /*! 1567 \verbatim 1568 p = C+D*atan(tr) 1569 \endverbatim 1570 */ 1689 1571 double GeneralFit::tr_vers_p(int i,double tr) 1690 // p = C+D*atan(tr)1691 1572 { 1692 1573 // ASSERT(i>=0 && i<mNPar); … … 1718 1599 1719 1600 ////////////////////////////////////////////////////////////////////// 1601 /*! 1602 \verbatim 1603 dtr = (1+tr**2)/D * dp = (1+tan( (p-C)/D )**2)/D * dp = coeff * dp 1604 attention: df/dp = (1+tr**2)/D * dF/dtr = coeff * dF/dtr 1605 \endverbatim 1606 */ 1720 1607 double GeneralFit::c_dp_vers_dtr(int i,double tr) 1721 // dtr = (1+tr**2)/D * dp = (1+tan( (p-C)/D )**2)/D * dp = coeff * dp1722 // attention: df/dp = (1+tr**2)/D * dF/dtr = coeff * dF/dtr1723 1608 { 1724 1609 // ASSERT(i>=0 && i<mNPar); … … 1750 1635 1751 1636 ////////////////////////////////////////////////////////////////////// 1637 /*! 1638 \verbatim 1639 dp = D/(1+tr**2) * dtr = coeff * dtr 1640 attention: df/dtr = D/(1+tr**2) * dF/dp = coeff * dF/dp 1641 \endverbatim 1642 */ 1752 1643 double GeneralFit::c_dtr_vers_dp(int i,double tr) 1753 // dp = D/(1+tr**2) * dtr = coeff * dtr1754 // attention: df/dtr = D/(1+tr**2) * dF/dp = coeff * dF/dp1755 1644 { 1756 1645 // ASSERT(i>=0 && i<mNPar); … … 1776 1665 1777 1666 ////////////////////////////////////////////////////////////////////// 1667 /*! 1668 \verbatim 1669 1-/ Redefinit dp pour qu'il soit superieur a minStepDeriv 1670 2-/ Redefinit dp pour que p+/-dp reste dans les limites (parametre borne) 1671 Si hors limites alors: 1672 p-dp <= min_p : dp = (p-min_p)*dist 1673 p+dp >= max_p : dp = (max_p-p)*dist 1674 \endverbatim 1675 */ 1778 1676 int GeneralFit::put_in_limits_for_deriv(Vector const& p,Vector& dp,double dist) 1779 // 1-/ Redefinit dp pour qu'il soit superieur a minStepDeriv1780 // 2-/ Redefinit dp pour que p+/-dp reste dans les limites (parametre borne)1781 // Si hors limites alors:1782 // p-dp <= min_p : dp = (p-min_p)*dist1783 // p+dp >= max_p : dp = (max_p-p)*dist1784 1677 { 1785 1678 int nchanged = 0; … … 1826 1719 } 1827 1720 1828 1829 //////////////////////////////////////////////////////////////////////1830 // Rappel des inline functions pour commentaires1831 //++1832 // inline double GetChi2()1833 // Retourne le Chi21834 //--1835 //++1836 // inline double GetChi2Red() const1837 // Retourne le Chi2 reduit1838 //--1839 //++1840 // inline int GetNddl() const1841 // Retourne le nombre de degres de liberte1842 //--1843 //++1844 // inline int GetNStep() const1845 // Retourne le nombre d'iterations1846 //--1847 //++1848 // inline int GetNVar() const1849 // Retourne le nombre de variables1850 //--1851 //++1852 // inline int GetNPar() const1853 // Retourne le nombre de parametres1854 //--1855 //++1856 // inline int GetNFree() const1857 // Retourne le nombre de parametres libres1858 //--1859 //++1860 // inline int GetNBound() const1861 // Retourne le nombre de parametres bornes1862 //--1863 //++1864 // inline int GetNStop() const1865 // Retourne le nstop de convergence1866 //--1867 //++1868 // inline int GetNStopLent() const1869 // Retourne le nstop de convergence lente.1870 //--1871 //++1872 // inline double GetEps(int i)1873 // Retourne la precision de convergence pour le parametre i.1874 //--1875 //++1876 // inline GeneralFunction* GetFunction()1877 // Retourne le pointeur sur la GeneralFunction utilisee.1878 //--1879 //++1880 // inline GeneralFitData* GetGData()1881 // Retourne le pointeur sur la GeneralFitData utilisee.1882 //-- -
trunk/SophyaLib/NTools/generalfit.h
r552 r914 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 20 class GeneralFunction { 16 21 public: … … 18 23 virtual ~GeneralFunction(); 19 24 25 //! Valeur de la fonction a definir par l'utilisateur (fct virtuelle pure) 20 26 virtual double Value(double const xp[], double const* parm)=0; 21 27 virtual double Val_Der(double const xp[], double const* parm … … 25 31 void SetDeltaParm(double const* dparam); 26 32 33 //! Retourne le nombre de variables Xi 27 34 inline int NVar() const {return mNVar;} 35 //! Retourne le nombre de parametres Ai 28 36 inline int NPar() const {return mNPar;} 29 37 30 38 protected: 31 const int mNVar; // nombre de variables f(x,y,z,...)32 const int mNPar; // nombre de parametres39 const int mNVar; //!< nombre de variables f(x,y,z,...) 40 const int mNPar; //!< nombre de parametres 33 41 34 42 double *deltaParm; … … 40 48 //================================================================ 41 49 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 */ 42 58 class GeneralFunc : public GeneralFunction { 43 59 public: … … 62 78 class GeneralFitData; 63 79 80 /*! 81 Classe de Xi2 a plusieurs parametres : 82 \f$ Xi2[a1,a2,a3,...] \f$ 83 */ 64 84 class GeneralXi2 { 65 85 public: … … 67 87 virtual ~GeneralXi2(); 68 88 89 /*! 90 Valeur du Xi2 a definir par l'utilisateur (fct virtuelle pure) 91 a partir des donnees de `data'. l'utilisateur doit egalement 92 retourner le nombre de points de mesure utilises dans le calcul 93 du Xi2 (`ndataused'). 94 */ 69 95 virtual double Value(GeneralFitData& data, double* parm, int& ndataused)=0; 70 96 virtual double Derivee(GeneralFitData& data, int i, double* parm); … … 74 100 void SetDeltaParm(double const* dparam); 75 101 102 //! Retourne le nombre de parametres Ai. 76 103 inline int NPar() const {return mNPar;} 77 104 78 105 protected: 79 const int mNPar; // nombre de parametres106 const int mNPar; //!< nombre de parametres 80 107 81 108 double *deltaParm; … … 86 113 //================================================================ 87 114 115 //! Classe de fit d'une GeneralFunction sur une GeneralFitData 88 116 class GeneralFit { 89 117 public: … … 129 157 double GetMax(int n); 130 158 double GetMin(int n); 159 //! Retourne le Chi2 131 160 inline double GetChi2() const {return Chi2;}; 161 //! Retourne le Chi2 reduit 132 162 inline double GetChi2Red() const { 133 163 if(mNddl<=0) return (double) mNddl; 134 164 return Chi2/(double) mNddl; 135 165 }; 166 //! Retourne la precision de convergence pour le parametre i. 136 167 inline double GetEps(int i) const {return Eps(i);}; 168 //! Retourne le nombre de degres de liberte 137 169 inline int GetNddl() const {return mNddl;}; 170 //! Retourne le nombre d'iterations 138 171 inline int GetNStep() const {return nStep;}; 172 //! Retourne le nombre de variables 139 173 inline int GetNVar() const {return mNVar;}; 174 //! Retourne le nombre de parametres 140 175 inline int GetNPar() const {return mNPar;}; 176 //! Retourne le nombre de parametres libres 141 177 inline int GetNFree() const {return mNParFree;}; 178 //! Retourne le nombre de parametres bornes 142 179 inline int GetNBound() const {return mNParBound;}; 180 //! Retourne le nstop de convergence 143 181 inline int GetNStop() const {return nStop;}; 182 //! Retourne le nstop de convergence lente. 144 183 inline int GetNStopLent() const {return nStopLent;}; 184 //! Retourne le pointeur sur la GeneralFunction utilisee. 145 185 inline GeneralFunction* GetFunction() const {return mFunction;}; 186 //! Retourne le pointeur sur la GeneralFitData utilisee. 146 187 inline GeneralFitData* GetGData() const {return mData;}; 147 188 … … 158 199 159 200 protected: 160 int mNtry; // numero d'appel de la routine de fit.161 int mNVar; // nombre de variables f(x,y,z,...)162 int mNPar; // nombre de parametres163 int mNParFree; // nombre de parametres libres164 int mNParBound; // nombre de parametres bornes201 int mNtry; //!< numero d'appel de la routine de fit. 202 int mNVar; //!< nombre de variables f(x,y,z,...) 203 int mNPar; //!< nombre de parametres 204 int mNParFree; //!< nombre de parametres libres 205 int mNParBound; //!< nombre de parametres bornes 165 206 GeneralFunction* mFunction; 166 207 GeneralXi2* mFuncXi2; -
trunk/SophyaLib/TArray/tmatrix.h
r894 r914 23 23 TMatrix(const TMatrix<T>& a, bool share); 24 24 TMatrix(const TArray<T>& a); 25 TMatrix(const TArray<T>& a, bool share, short mm= CMemoryMapping);25 TMatrix(const TArray<T>& a, bool share, short mm=AutoMemoryMapping); 26 26 virtual ~TMatrix(); 27 27 -
trunk/SophyaLib/TArray/triangmtx.h
r862 r914 1 1 // This may look like C code, but it is really -*- C++ -*- 2 /*! Class for inferior triangular matrix (base class for the class Alm) */3 2 4 3 #ifndef TRIANGMTX_H_SEEN … … 10 9 namespace SOPHYA { 11 10 11 //! Class for inferior triangular matrix (base class for the class Alm) 12 12 template <class T> 13 class TriangularMatrix 14 { 15 16 public : 13 class TriangularMatrix { 14 public : 17 15 16 //! Default constructor 18 17 TriangularMatrix() {}; 19 /* instanciate a triangular matrix from the number of rows */ 18 //! instanciate a triangular matrix from the number of rows 20 19 TriangularMatrix(int rowSize) : long_diag_((uint_4)rowSize) {elem_.ReSize((uint_4) (rowSize*(rowSize+1)/2) ); }; 20 //! Copy constructor (possibility of sharing datas) 21 21 TriangularMatrix(const TriangularMatrix<T>& a, bool share=false) : elem_(a.elem_, share), long_diag_(a.long_diag_) {;} 22 /*! resize the matrix with a new number of rows */ 22 23 //! resize the matrix with a new number of rows 23 24 inline void ReSizeRow(int rowSize) 24 25 { … … 28 29 inline void SetTemp(bool temp=false) const {elem_.SetTemp(temp);} 29 30 31 //! Equal operator 30 32 inline TriangularMatrix<T>& operator = (const TriangularMatrix<T>& a) 31 33 { … … 34 36 return *this; 35 37 } 38 39 //! () operator : access to elements row \b l and column \b m 36 40 inline T& operator()(int l, int m) 37 41 { 38 42 return elem_(adr_ij(l,m)); 39 43 } 44 //! () operator : access to elements row \b l and column \b m 40 45 inline T const& operator()(int l, int m) const 41 46 { 42 47 return *(elem_.Begin()+ adr_ij(l,m)); 43 48 } 44 inline int_4 rowNumber() const {return (int_4)long_diag_;} 45 private: 46 /*! compute the address of an element in the single array representing the matrix */ 49 50 //! Return number of rows 51 inline int_4 rowNumber() const {return (int_4)long_diag_;} 52 53 private: 54 //! compute the address of an element in the single array representing the matrix 47 55 inline uint_4 adr_ij(int i,int j) const 48 56 { … … 56 64 } 57 65 58 uint_4 long_diag_; 59 NDataBlock<T> elem_; 66 uint_4 long_diag_; //!< size of the square matrix 67 NDataBlock<T> elem_; //!< Data block 60 68 61 69 }; -
trunk/SophyaLib/TArray/tvector.cc
r894 r914 1 // $Id: tvector.cc,v 1. 4 2000-04-12 17:42:30ansari Exp $1 // $Id: tvector.cc,v 1.5 2000-04-13 16:04:49 ansari Exp $ 2 2 // C.Magneville 04/99 3 3 #include "machdefs.h" … … 70 70 */ 71 71 template <class T> 72 TVector<T>::TVector(const TArray<T>& a, bool share, short mm, short lcv)72 TVector<T>::TVector(const TArray<T>& a, bool share, short lcv, short mm) 73 73 : TMatrix<T>(a, share, mm) 74 74 { -
trunk/SophyaLib/TArray/tvector.h
r898 r914 17 17 // Creation / destruction 18 18 TVector(); 19 TVector(uint_4 n, short lcv= ColumnVector, short mm=AutoMemoryMapping);19 TVector(uint_4 n, short lcv=AutoVectorType, short mm=AutoMemoryMapping); 20 20 TVector(const TVector<T>& v); 21 21 TVector(const TVector<T>& v, bool share); 22 22 TVector(const TArray<T>& a); 23 TVector(const TArray<T>& a, bool share, short mm=CMemoryMapping, short lcv=ColumnVector);23 TVector(const TArray<T>& a, bool share, short lcv=AutoVectorType, short mm=AutoMemoryMapping); 24 24 25 25 virtual ~TVector(); … … 28 28 inline TVector<T>& operator = (const TVector<T>& a) 29 29 { Set(a); return(*this); } 30 31 30 32 31 // Gestion taille/Remplissage … … 50 49 // Operateur d'affectation 51 50 //! Fill the vector with Sequence \b seq 52 inline T Matrix<T>& operator = (Sequence seq) { SetSeq(seq); return(*this); }51 inline TVector<T>& operator = (Sequence seq) { SetSeq(seq); return(*this); } 53 52 54 53 // Operations diverses avec une constante
Note:
See TracChangeset
for help on using the changeset viewer.