Changeset 914 in Sophya for trunk/SophyaLib/HiStats


Ignore:
Timestamp:
Apr 13, 2000, 6:04:50 PM (25 years ago)
Author:
ansari
Message:

documentation cmv 13/4/00

Location:
trunk/SophyaLib/HiStats
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/HiStats/hisprof.cc

    r763 r914  
    66#include "perrors.h"
    77
    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*/
    2213HProf::HProf()
    23 //
    24 //      Constructeur par defaut.
    25 //--
    2614: Histo()
    2715, SumY(NULL), SumY2(NULL), SumW(NULL), Ok(false), YMin(1.), YMax(-1.), Opt(0)
     
    3119
    3220/********* 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*/
    3428HProf::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 //--
    4229: Histo(xMin,xMax,nBin)
    4330, SumY(new double[nBin]), SumY2(new double[nBin]), SumW(new double[nBin])
     
    5037
    5138/********* Methode *********/
    52 //++
     39/*!
     40  Constructeur par copie.
     41*/
    5342HProf::HProf(const HProf& H)
    54 //
    55 //      Constructeur par copie.
    56 //--
    5743: Histo(H)
    5844, SumY(new double[H.bins]), SumY2(new double[H.bins]), SumW(new double[H.bins])
     
    6652
    6753/********* Methode *********/
     54/*!
     55  Des-allocation
     56*/
    6857void HProf::Delete()
    6958{
     
    7564
    7665/********* Methode *********/
     66/*!
     67  Destructeur
     68*/
    7769HProf::~HProf()
    7870{
     
    8072}
    8173
    82 //++
    83 // Titre        Methodes
    84 //--
    85 
    86 /********* Methode *********/
    87 //++
     74/********* Methode *********/
     75/*!
     76  Remise a zero
     77*/
    8878void HProf::Zero()
    89 //
    90 //      Remise a zero
    91 //--
    9279{
    9380  memset(SumY,  0, bins*sizeof(double));
     
    9986
    10087/********* 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*/
    102102void 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 dispersion
    106 //      des donnees dans le bin, si = false elle represente l'erreur
    107 //      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)  dispersion
    111 //| ->  e(j) = s(j)/sqrt(L(j)) erreur sur la moyenne
    112 //| 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 //--
    115103{
    116104int opt = (spread) ? 0 : 1;
     
    119107
    120108/********* 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*/
    122120void HProf::UpdateHisto() const
    123 //
    124 //      Pour mettre a jour l'histogramme de profil.
    125 //      Il est important d'appeler cette methode si on veut
    126 //      utiliser les methodes de la classe Histo qui ne sont
    127 //      pas redefinies dans la classe HProf.
    128 //      En effet, pour des raisons de precision la classe
    129 //      HProf travaille avec des tableaux en double precision
    130 //      et seulement au moment ou l'on a besoin de l'histogramme
    131 //      ce dernier est rempli avec les valeurs demandees (moyenne
    132 //      et dispersion/erreur sur la moyenne).
    133 //--
    134121{
    135122
     
    153140
    154141/********* Methode *********/
    155 //++
     142/*!
     143  Addition au contenu de l'histo pour abscisse x de la valeur y et poids w
     144*/
    156145void 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 w
    159 //--
    160146{
    161147  if(YMax>YMin && (y<YMin || YMax<y)) return;
     
    174160
    175161/********* Methode *********/
    176 //++
     162/*!
     163  Addition au contenu de l'histo bin numBin de la valeur y poids w
     164*/
    177165void HProf::AddBin(int numBin, float y, float w)
    178 //
    179 //      Addition au contenu de l'histo bin numBin de la valeur y poids w
    180 //--
    181166{
    182167  if(YMax>YMin && (y<YMin || YMax<y)) return;
     
    194179
    195180/********* Methode *********/
    196 //++
     181/*!
     182  Operateur H = H1
     183*/
    197184HProf& HProf::operator = (const HProf& h)
    198 //
    199 //--
    200185{
    201186if(this == &h) return *this;
     
    218203
    219204/********* 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*/
    221212HProf& HProf::operator += (const HProf& a)
    222 //
    223 //      Attention dans cette addition il n'y a pas de gestion
    224 //      des YMin et YMax. L'addition est faite meme si les limites
    225 //      en Y de ``a'' sont differentes de celles de ``this''.
    226 //--
    227213{
    228214if(bins!=a.bins) THROW(sizeMismatchErr);
     
    240226
    241227/********* Methode *********/
    242 //++
     228/*!
     229  Operateur H = H1 + H2
     230  Meme commentaire que pour l'operateur +=
     231*/
    243232HProf operator + (const HProf& a, const HProf& b)
    244 //
    245 //      Meme commentaire que pour l'operateur +=
    246 //--
    247233{
    248234if (b.NBins()!=a.NBins()) THROW(sizeMismatchErr);
     
    250236return (c += b);
    251237}
    252 
    253 // Rappel des inlines functions pour commentaires
    254 //++
    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 v
    261 //--
    262 //++
    263 // inline void GetError2(Vector& v)
    264 //      Retourne le contenu au carre de la dispersion/erreur dans le vecteur v
    265 //--
    266 //++
    267 // inline float operator()(int i) const
    268 //      Retourne le contenu du bin i
    269 //--
    270 //++
    271 // inline float Error2(int i) const
    272 //      Retourne le carre de la dispersion/erreur du bin i
    273 //--
    274 //++
    275 // inline float Error(int i) const
    276 //      Retourne la dispersion/erreur du bin i
    277 //--
    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::Print
    293 //--
    294 
    295238
    296239///////////////////////////////////////////////////////////
  • trunk/SophyaLib/HiStats/hisprof.h

    r763 r914  
    1010namespace SOPHYA {
    1111
     12/*!
     13  Classe de profil d'histogrammes.
     14*/
    1215class HProf : public Histo {
    1316  friend class ObjFileIO<HProf>;
     
    2831 
    2932  // Acces a l information
     33  //! Retourne l'histogramme de profil.
    3034  inline Histo GetHisto() {if(!Ok) UpdateHisto(); return (Histo) *this;}
     35  //! Retourne le contenu de la moyenne dans le vecteur v
    3136  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
    3238  inline void GetError2(Vector& v) {if(!Ok) UpdateHisto(); Histo::GetError2(v);}
     39  //! Retourne le contenu du bin i
    3340  inline float operator()(int i) const {if(!Ok) UpdateHisto(); return data[i];}
     41  //! Retourne le carre de la dispersion/erreur du bin i
    3442  inline float Error2(int i) const {if(!Ok) UpdateHisto(); return (float) err2[i];}
     43  //! Retourne la dispersion/erreur du bin i
    3544  inline float Error(int i) const
    3645         {if(!Ok) UpdateHisto(); return err2[i]>0. ? (float) sqrt(err2[i]) : 0.f;}
     
    4251
    4352  // Fit
     53  //! Fit du profile par ``gfit''.
    4454  inline int    Fit(GeneralFit& gfit)
    4555         {if(!Ok) UpdateHisto(); return Histo::Fit(gfit,0);}
     56  //! Retourne l'Histogramme des residus par ``gfit''.
    4657  inline Histo  FitResidus(GeneralFit& gfit)
    4758         {if(!Ok) UpdateHisto(); return Histo::FitResidus(gfit);}
     59  //! Retourne l'Histogramme de la fonction fittee par ``gfit''.
    4860  inline Histo  FitFunction(GeneralFit& gfit)
    4961         {if(!Ok) UpdateHisto(); return Histo::FitFunction(gfit);}
    5062
    5163  // Print
     64  //! Print, voir detail dans Histo::Print
    5265  inline void Print(int dyn=100,float hmin=1.,float hmax=-1.,int pflag=0,int il=1,int ih=-1)
    5366                           {if(!Ok) UpdateHisto(); Histo::Print(dyn,hmin,hmax,pflag,il,ih);}
     
    5669  void Delete();
    5770
    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
    6578};
    6679
  • trunk/SophyaLib/HiStats/histos.cc

    r763 r914  
    11//
    2 // $Id: histos.cc,v 1.1.1.1 2000-03-02 16:51:32 ansari Exp $
     2// $Id: histos.cc,v 1.2 2000-04-13 16:04:11 ansari Exp $
    33//
    44
     
    1313#include "generalfit.h"
    1414
    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 */
    2917Histo::Histo()
    30 //
    31 //--
    3218: data(NULL), err2(NULL),
    3319  under(0), over(0), nHist(0), nEntries(0),
     
    3925
    4026/********* Methode *********/
    41 //++
     27/*! Constructeur d'un histo de nBin bins allant de xMin a xMax */
    4228Histo::Histo(float xMin, float xMax, int nBin)
    43 //
    44 //--
    4529: data(new float[nBin]), err2(NULL),
    4630  under(0), over(0), nHist(0), nEntries(0),
     
    5337
    5438/********* Methode *********/
    55 //++
     39/*! Constructeur par copie */
    5640Histo::Histo(const Histo& H)
    57 //
    58 //--
    5941: data(new float[H.bins]), err2(NULL),
    6042  under(H.under), over(H.over), nHist(H.nHist), nEntries(H.nEntries),
     
    7153
    7254/********* Methode *********/
     55/*! Gestion de la des-allocation */
    7356void Histo::Delete()
    7457{
     
    8164
    8265/********* Methode *********/
     66/*! Destructeur */
    8367Histo::~Histo()
    8468{
     
    8670}
    8771
    88 //++
    89 // Titre        Methodes
    90 //--
    91 
    92 /********* Methode *********/
    93 //++
     72/********* Methode *********/
     73/*!
     74  Remise a zero
     75*/
    9476void Histo::Zero()
    95 //
    96 //      Remise a zero
    97 //--
    9877{
    9978  memset(data, 0, bins*sizeof(float));
     
    10584
    10685/********* Methode *********/
    107 //++
     86/*!
     87  Pour avoir le calcul des erreurs
     88*/
    10889void Histo::Errors()
    109 //
    110 //      Pour avoir le calcul des erreurs
    111 //--
    11290{
    11391 if( bins > 0 ) {
     
    11896
    11997/********* Methode *********/
    120 //++
     98/*!
     99  Operateur egal
     100*/
    121101Histo& Histo::operator = (const Histo& h)
    122 //
    123 //--
    124102{
    125103  if(this == &h) return *this;
     
    145123
    146124/********* Methode *********/
    147 //++
     125/*!
     126  Operateur de multiplication par une constante
     127*/
    148128Histo& Histo::operator *= (double b)
    149 //
    150 //--
    151129{
    152130double b2 = b*b;
     
    162140}
    163141
    164 //++
     142/*!
     143  Operateur de division par une constante
     144*/
    165145Histo& Histo::operator /= (double b)
    166 //
    167 //--
    168146{
    169147if (b==0.) THROW(inconsistentErr);
     
    180158}
    181159
    182 //++
     160/*!
     161  Operateur d'addition d'une constante
     162*/
    183163Histo& Histo::operator += (double b)
    184 //
    185 //--
    186164{
    187165for(int i=0;i<bins;i++) data[i] += b;
     
    193171}
    194172
    195 //++
     173/*!
     174  Operateur de soustraction d'une constante
     175*/
    196176Histo& Histo::operator -= (double b)
    197 //
    198 //--
    199177{
    200178for(int i=0;i<bins;i++) data[i] -= b;
     
    207185
    208186/********* Methode *********/
    209 //++
     187/*!
     188  Operateur H2 = H1 * b
     189*/
    210190Histo operator * (const Histo& a, double b)
    211 //
    212 //--
    213191{
    214192  Histo result(a);
     
    216194}
    217195
    218 //++
     196/*!
     197  Operateur H2 = b * H1
     198*/
    219199Histo operator * (double b, const Histo& a)
    220 //
    221 //--
    222200{
    223201  Histo result(a);
     
    225203}
    226204
    227 //++
     205/*!
     206  Operateur H2 = H1 / b
     207*/
    228208Histo operator / (const Histo& a, double b)
    229 //
    230 //--
    231209{
    232210  Histo result(a);
     
    234212}
    235213
    236 //++
     214/*!
     215  Operateur H2 = H1 + b
     216*/
    237217Histo operator + (const Histo& a, double b)
    238 //
    239 //--
    240218{
    241219  Histo result(a);
     
    243221}
    244222
    245 //++
     223/*!
     224  Operateur H2 = b + H1
     225*/
    246226Histo operator + (double b, const Histo& a)
    247 //
    248 //--
    249227{
    250228  Histo result(a);
     
    252230}
    253231
    254 //++
     232/*!
     233  Operateur H2 = H1 - b
     234*/
    255235Histo operator - (const Histo& a, double b)
    256 //
    257 //--
    258236{
    259237  Histo result(a);
     
    261239}
    262240
    263 //++
     241/*!
     242  Operateur H2 = b - H1
     243*/
    264244Histo operator - (double b, const Histo& a)
    265 //
    266 //--
    267245{
    268246  Histo result(a);
     
    272250
    273251/********* Methode *********/
    274 //++
     252/*!
     253  Operateur H += H1
     254*/
    275255Histo& Histo::operator += (const Histo& a)
    276 //
    277 //--
    278256{
    279257if(bins!=a.bins) THROW(sizeMismatchErr);
     
    291269}
    292270
    293 //++
     271/*!
     272  Operateur H -= H1
     273*/
    294274Histo& Histo::operator -= (const Histo& a)
    295 //
    296 //--
    297275{
    298276if(bins!=a.bins) THROW(sizeMismatchErr);
     
    310288}
    311289
    312 //++
     290/*!
     291  Operateur H *= H1
     292*/
    313293Histo& Histo::operator *= (const Histo& a)
    314 //
    315 //--
    316294{
    317295if(bins!=a.bins) THROW(sizeMismatchErr);
     
    331309}
    332310
    333 //++
     311/*!
     312  Operateur H /= H1
     313*/
    334314Histo& Histo::operator /= (const Histo& a)
    335 //
    336 //--
    337315{
    338316if(bins!=a.bins) THROW(sizeMismatchErr);
     
    359337
    360338/********* Methode *********/
    361 //++
     339/*!
     340  Operateur H = H1 + H2
     341*/
    362342Histo operator + (const Histo& a, const Histo& b)
    363 //
    364 //--
    365343{
    366344if (b.NBins()!=a.NBins()) THROW(sizeMismatchErr);
     
    369347}
    370348
    371 //++
     349/*!
     350  Operateur H = H1 - H2
     351*/
    372352Histo operator - (const Histo& a, const Histo& b)
    373 //
    374 //--
    375353{
    376354if (b.NBins()!=a.NBins()) THROW(sizeMismatchErr);
     
    379357}
    380358
    381 //++
     359/*!
     360  Operateur H = H1 * H2
     361*/
    382362Histo operator * (const Histo& a, const Histo& b)
    383 //
    384 //--
    385363{
    386364if (b.NBins()!=a.NBins()) THROW(sizeMismatchErr);
     
    389367}
    390368
    391 //++
     369/*!
     370  Operateur H = H1 / H2
     371*/
    392372Histo operator / (const Histo& a, const Histo& b)
    393 //
    394 //--
    395373{
    396374if (b.NBins()!=a.NBins()) THROW(sizeMismatchErr);
     
    400378
    401379/********* Methode *********/
    402 //++
     380/*!
     381  Remplissage d'un tableau avec la valeur des abscisses
     382*/
    403383void Histo::GetAbsc(Vector &v)
    404 //
    405 //      Remplissage d'un tableau avec la valeur des abscisses
    406 //--
    407384{
    408385v.Realloc(bins);
     
    411388}
    412389
    413 //++
     390/*!
     391  Remplissage d'un tableau avec la valeur du contenu
     392*/
    414393void Histo::GetValue(Vector &v)
    415 //
    416 //      Remplissage d'un tableau avec la valeur du contenu
    417 //--
    418394{
    419395v.Realloc(bins);
     
    422398}
    423399
    424 //++
     400/*!
     401  Remplissage d'un tableau avec la valeur des erreurs au carre
     402*/
    425403void Histo::GetError2(Vector &v)
    426 //
    427 //      Remplissage d'un tableau avec la valeur des erreurs au carre
    428 //--
    429404{
    430405v.Realloc(bins);
     
    434409}
    435410
    436 //++
     411/*!
     412  Remplissage d'un tableau avec la valeur des erreurs
     413*/
    437414void Histo::GetError(Vector &v)
    438 //
    439 //      Remplissage d'un tableau avec la valeur des erreurs
    440 //--
    441415{
    442416v.Realloc(bins);
     
    447421
    448422/********* Methode *********/
    449 //++
     423/*!
     424  Remplissage du contenu de l'histo avec les valeurs d'un vecteur
     425*/
    450426void Histo::PutValue(Vector &v, int ierr)
    451 //
    452 //      Remplissage du contenu de l'histo avec les valeurs d'un vecteur
    453 //--
    454427{
    455428if(v.NElts()<bins) THROW(sizeMismatchErr);
     
    461434}
    462435
    463 //++
     436/*!
     437  Addition du contenu de l'histo avec les valeurs d'un vecteur
     438*/
    464439void Histo::PutValueAdd(Vector &v, int ierr)
    465 //
    466 //      Addition du contenu de l'histo avec les valeurs d'un vecteur
    467 //--
    468440{
    469441if(v.NElts()<bins) THROW(sizeMismatchErr);
     
    475447}
    476448
    477 //++
     449/*!
     450  Remplissage des erreurs au carre de l'histo avec les valeurs d'un vecteur
     451*/
    478452void Histo::PutError2(Vector &v)
    479 //
    480 //      Remplissage des erreurs au carre de l'histo avec les valeurs d'un vecteur
    481 //--
    482453{
    483454if(v.NElts()<bins) THROW(sizeMismatchErr);
     
    487458}
    488459
    489 //++
     460/*!
     461  Addition des erreurs au carre de l'histo avec les valeurs d'un vecteur
     462*/
    490463void Histo::PutError2Add(Vector &v)
    491 //
    492 //      Addition des erreurs au carre de l'histo avec les valeurs d'un vecteur
    493 //--
    494464{
    495465if(v.NElts()<bins) THROW(sizeMismatchErr);
     
    499469}
    500470
    501 //++
     471/*!
     472  Remplissage des erreurs de l'histo avec les valeurs d'un vecteur
     473*/
    502474void Histo::PutError(Vector &v)
    503 //
    504 //      Remplissage des erreurs de l'histo avec les valeurs d'un vecteur
    505 //--
    506475{
    507476if(v.NElts()<bins) THROW(sizeMismatchErr);
     
    513482
    514483/********* Methode *********/
    515 //++
     484/*!
     485  Addition du contenu de l'histo pour abscisse x poids w
     486*/
    516487void Histo::Add(float x, float w)
    517 //
    518 //      Addition du contenu de l'histo pour abscisse x poids w
    519 //--
    520488{
    521489  int numBin = FindBin(x);
     
    531499
    532500/********* Methode *********/
    533 //++
     501/*!
     502  Addition du contenu de l'histo bin numBin poids w
     503*/
    534504void Histo::AddBin(int numBin, float w)
    535 //
    536 //      Addition du contenu de l'histo bin numBin poids w
    537 //--
    538505{
    539506  if (numBin<0) under += w;
     
    548515
    549516/********* Methode *********/
    550 //++
     517/*!
     518  Remplissage du contenu de l'histo pour abscisse x poids w
     519*/
    551520void Histo::SetBin(float x, float w)
    552 //
    553 //      Remplissage du contenu de l'histo pour abscisse x poids w
    554 //--
    555521{
    556522  int numBin = FindBin(x);
     
    559525
    560526/********* Methode *********/
    561 //++
     527/*!
     528  Remplissage du contenu de l'histo pour numBin poids w
     529*/
    562530void Histo::SetBin(int numBin, float w)
    563 //
    564 //      Remplissage du contenu de l'histo pour numBin poids w
    565 //--
    566531{
    567532  if (numBin<0) under = w;
     
    575540
    576541/********* Methode *********/
    577 //++
     542/*!
     543  Remplissage des erreurs au carre pour abscisse x
     544*/
    578545void Histo::SetErr2(float x, double e2)
    579 //
    580 //      Remplissage des erreurs au carre pour abscisse x
    581 //--
    582546{
    583547  int numBin = FindBin(x);
     
    586550
    587551/********* Methode *********/
    588 //++
     552/*!
     553  Remplissage des erreurs au carre pour numBin poids
     554*/
    589555void Histo::SetErr2(int numBin, double e2)
    590 //
    591 //      Remplissage des erreurs au carre pour numBin poids
    592 //--
    593556{
    594557  if( err2==NULL) return;
     
    598561
    599562/********* Methode *********/
    600 //++
     563/*!
     564  Remplissage des erreurs pour abscisse x
     565*/
    601566void Histo::SetErr(float x, float e)
    602 //
    603 //      Remplissage des erreurs pour abscisse x
    604 //--
    605567{
    606568SetErr2(x, (double) e*e);
     
    608570
    609571/********* Methode *********/
    610 //++
     572/*!
     573  Remplissage des erreurs pour numBin
     574*/
    611575void Histo::SetErr(int numBin, float e)
    612 //
    613 //      Remplissage des erreurs pour numBin
    614 //--
    615576{
    616577SetErr2(numBin, (double) e*e);
     
    618579
    619580/********* Methode *********/
    620 //++
     581/*!
     582  Numero du bin ayant le contenu maximum
     583*/
    621584int Histo::IMax() const
    622 //
    623 //      Numero du bin ayant le contenu maximum
    624 //--
    625585{
    626586  int imx=0;
     
    633593
    634594/********* Methode *********/
    635 //++
     595/*!
     596  Numero du bin ayant le contenu minimum
     597*/
    636598int Histo::IMin() const
    637 //
    638 //      Numero du bin ayant le contenu minimum
    639 //--
    640599{
    641600  int imx=0;
     
    648607
    649608/********* Methode *********/
    650 //++
     609/*!
     610  Valeur le contenu maximum
     611*/
    651612float Histo::VMax() const
    652 //
    653 //      Valeur le contenu maximum
    654 //--
    655613{
    656614  float mx=data[0];
     
    661619
    662620/********* Methode *********/
    663 //++
     621/*!
     622  Valeur le contenu minimum
     623*/
    664624float Histo::VMin() const
    665 //
    666 //      Valeur le contenu minimum
    667 //--
    668625{
    669626  float mx=data[0];
     
    674631
    675632/********* Methode *********/
    676 //++
     633/*!
     634  Valeur moyenne
     635*/
    677636float Histo::Mean() const
    678 //
    679 //      Valeur moyenne
    680 //--
    681637{
    682638  double n = 0;
     
    691647
    692648/********* Methode *********/
    693 //++
     649/*!
     650  Valeur du sigma
     651*/
    694652float Histo::Sigma() const
    695 //
    696 //      Valeur du sigma
    697 //--
    698653{
    699654  double n = 0;
     
    714669
    715670/********* Methode *********/
    716 //++
     671/*!
     672  Valeur de la moyenne calculee entre les bin il et ih
     673*/
    717674float Histo::MeanLH(int il,int ih) const
    718 //
    719 //      Valeur de la moyenne calculee entre les bin il et ih
    720 //--
    721675{
    722676  if( ih < il ) { il = 0; ih = bins-1; }
     
    734688
    735689/********* Methode *********/
    736 //++
     690/*!
     691  Valeur de la moyenne calculee entre les bin il et ih
     692*/
    737693float Histo::SigmaLH(int il,int ih) const
    738 //
    739 //      Valeur de la moyenne calculee entre les bin il et ih
    740 //--
    741694{
    742695  if( ih < il ) { il = 0; ih = bins - 1; }
     
    759712
    760713/********* Methode *********/
    761 //++
     714/*!
     715  Valeur de la moyenne calculee entre x0-dx et x0+dx
     716*/
    762717float Histo::Mean(float x0, float dx) const
    763 //
    764 //      Valeur de la moyenne calculee entre x0-dx et x0+dx
    765 //--
    766718{
    767719  double sdata = 0;
     
    780732
    781733/********* Methode *********/
    782 //++
     734/*!
     735  Valeur du sigma calcule entre x0-dx et x0+dx
     736*/
    783737float Histo::Sigma(float x0, float dx) const
    784 //
    785 //      Valeur du sigma calcule entre x0-dx et x0+dx
    786 //--
    787738{
    788739  double sx = 0;
     
    804755
    805756/********* Methode *********/
    806 //++
     757/*!
     758  Valeur de la moyenne et du sigma nettoyes
     759*/
    807760float Histo::CleanedMean(float& sigma) const
    808 //
    809 //      Valeur de la moyenne et du sigma nettoyes
    810 //--
    811761{
    812762  if (!nHist) return 0;
     
    825775
    826776/********* Methode *********/
    827 //++
     777/*!
     778  Valeur de la moyenne nettoyee
     779*/
    828780float Histo::CleanedMean() const
    829 //
    830 //      Valeur de la moyenne nettoyee
    831 //--
    832781{
    833782  if (!nHist) return 0;
     
    837786
    838787/********* Methode *********/
    839 //++
     788/*!
     789  Retourne le nombre de bins non-nul
     790*/
    840791int Histo::BinNonNul() const
    841 //
    842 //      Retourne le nombre de bins non-nul
    843 //--
    844792{
    845793int non=0;
     
    849797
    850798/********* Methode *********/
    851 //++
     799/*!
     800  Retourne le nombre de bins ayant une erreur non-nulle
     801*/
    852802int Histo::ErrNonNul() const
    853 //
    854 //      Retourne le nombre de bins ayant une erreur non-nulle
    855 //--
    856803{
    857804if(err2==NULL) return -1;
     
    862809
    863810/********* 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*/
    865815int Histo::BinPercent(float per) const
    866 //
    867 //      Renvoie le numero de bin tel que il y ait "per" pourcent entrees
    868 //      entre le bin 0 et ce bin (y compris le contenu de ce bin).
    869 //--
    870816{
    871817double n = nHist*per;
     
    881827
    882828/********* 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*/
    884841int 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 x
    888 //|           N1 = nombre d'entrees entre bin 0 et I compris
    889 //|           N2 = nombre d'entrees entre bin I et bins-1 compris
    890 //|    imin = bin tel que nombre d'entrees entre imin et I = N1 * per
    891 //|    imax = bin tel que nombre d'entrees entre I et imax = N2 * per
    892 //|  Return: <0 si echec
    893 //|          min(I-imin,imax-I) si ok
    894 //--
    895842{
    896843imin = imax = -1;
     
    917864
    918865/********* Methode *********/
    919 //++
     866/*!
     867  Idem precedent mais renvoie xmin et xmax
     868*/
    920869int Histo::BinPercent(float x,float per,float& xmin,float& xmax)
    921 //
    922 //      Idem precedent mais renvoie xmin et xmax
    923 //--
    924870{
    925871xmin = xmax = 0.;
     
    931877
    932878/********* Methode *********/
    933 //++
     879/*!
     880  Remplace l'histogramme par son integrale normalise a norm:
     881  si norm <= 0 : pas de normalisation, integration seule
     882*/
    934883void Histo::HInteg(float norm)
    935 //
    936 //      Remplace l'histogramme par son integrale normalise a norm:
    937 //      si norm <= 0 : pas de normalisation, integration seule
    938 //--
    939884{
    940885if(bins>1)
     
    952897
    953898/********* Methode *********/
    954 //++
     899/*!
     900  Remplace l'histogramme par sa derivee
     901*/
    955902void Histo::HDeriv()
    956 //
    957 //      Remplace l'histogramme par sa derivee
    958 //--
    959903{
    960904if( bins <= 1 ) return;
     
    970914
    971915/********* Methode *********/
    972 //++
     916/*!
     917  Pour rebinner l'histogramme sur nbinew bins
     918*/
    973919void Histo::HRebin(int nbinew)
    974 //
    975 //      Pour rebinner l'histogramme sur nbinew bins
    976 //--
    977920{
    978921  if( nbinew <= 0 ) return;
     
    1023966
    1024967/********* 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*/
    1026975int 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 maximum
    1030 //      local (maxn) et sa position (imaxn).
    1031 //      Attention: si un maximum a la meme valeur sur plusieurs bins
    1032 //      consecutifs, le bin le plus a droite est pris.
    1033 //--
    1034976{
    1035977int nml = 0;
     
    10641006
    10651007/********* 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*/
    10671013float Histo::FitMax(int degree, float frac, int debug) const
    1068 //
    1069 //      Fit de la position du maximum de l'histo par un polynome
    1070 //      de degre `degree' a `frac' pourcent du maximum.
    1071 //      L'histo est suppose etre remplit de valeurs positives
    1072 //--
    10731014{
    10741015  if (degree < 2 || degree > 3) degree = 3;
     
    12001141
    12011142/********* 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*/
    12031148float Histo::FindWidth(float frac, int debug) const
    1204 //
    1205 //      Calcul de la largeur a frac pourcent du maximum
    1206 //      autour du bin du maximum.
    1207 //      L'histo est suppose etre remplit de valeurs positives
    1208 //--
    12091149{
    12101150  float xmax = BinCenter( IMax() );
     
    12131153
    12141154/********* 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*/
    12161159float 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 positives
    1220 //--
    12211160{
    12221161  if (frac <= 0 || frac >= 1.) frac = 0.5;
     
    12921231
    12931232/********* Methode *********/
    1294 //++
     1233/*!
     1234  Cf suivant mais im est le bin du maximum de l'histo
     1235*/
    12951236int Histo::EstimeMax(float& xm,int SzPav)
    1296 //
    1297 //      Cf suivant mais im est le bin du maximum de l'histo
    1298 //--
    12991237{
    13001238int im = IMax();
     
    13031241
    13041242/********* 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*/
    13061254int Histo::EstimeMax(int& im,float& xm,int SzPav)
    1307 //
    1308 //      Determine l'abscisses du maximum donne par im
    1309 //      en moyennant dans un pave SzPav  autour du maximum
    1310 //|  Return:
    1311 //|     0 = si fit maximum reussi avec SzPav pixels
    1312 //|     1 = si fit maximum reussi avec moins que SzPav pixels
    1313 //|     2 = si fit maximum echoue et renvoit BinCenter()
    1314 //|    -1 = si echec: SzPav <= 0 ou im hors limites
    1315 //--
    13161255{
    13171256xm = 0;
     
    13411280
    13421281/********* Methode *********/
    1343 //++
     1282/*!
     1283  Determine la largeur a frac% du maximum a gauche (widthG)
     1284  et a droite (widthD)
     1285*/
    13441286void 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 //--
    13491287{
    13501288int i;
     
    13851323
    13861324//////////////////////////////////////////////////////////
    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*/
    13881345int  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 existe
    1393 //|    - sinon 1
    1394 //| typ_err = 1 :
    1395 //|    - erreur attachee au bin si elle existe
    1396 //|    - sinon max( sqrt(abs(bin) ,1 )
    1397 //| typ_err = 2 :
    1398 //|    - erreur forcee a 1
    1399 //| 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 //--
    14071346{
    14081347if(NBins()<=0) return -1000;
     
    14301369}
    14311370
    1432 //++
     1371/*!
     1372  Retourne une classe contenant les residus du fit ``gfit''.
     1373*/
    14331374Histo Histo::FitResidus(GeneralFit& gfit)
    1434 //
    1435 //      Retourne une classe contenant les residus du fit ``gfit''.
    1436 //--
    14371375{
    14381376if(NBins()<=0)
     
    14501388}
    14511389
    1452 //++
     1390/*!
     1391  Retourne une classe contenant la fonction du fit ``gfit''.
     1392*/
    14531393Histo Histo::FitFunction(GeneralFit& gfit)
    1454 //
    1455 //      Retourne une classe contenant la fonction du fit ``gfit''.
    1456 //--
    14571394{
    14581395if(NBins()<=0)
     
    14711408
    14721409/********* 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*/
    14741427void Histo::PrintF(FILE * fp, int hdyn,float hmin, float hmax,int pflag,
    14751428              int il, int ih)
    1476 //
    1477 //      Impression de l'histogramme dans le fichier fp
    1478 //|   hdyn = nombre de colonnes pour imprimer les etoiles
    1479 //|       si =0 alors defaut(100),
    1480 //|       si <0 pas de print histo seulement infos
    1481 //|   hmin = minimum de la dynamique
    1482 //|   hmax = maximum de la dynamique
    1483 //|       si hmax<=hmin           : hmin=VMin() hmax=VMax()
    1484 //|       si hmax<=hmin et hmin=0 : hmin=0 hmax=VMax()
    1485 //|       sinon : hmin hmax
    1486 //|   pflag < 0 : on imprime les informations (nbin,min,...) sans l'histogramme
    1487 //|         = 0 : on imprime  "BinCenter(i) data[i]"  (note "... ...")
    1488 //|         bit 0 on : (v=1): numero_bin "... ..."
    1489 //|         bit 1 on : (v=2): "... ..." erreur
    1490 //--
    14911429{
    14921430
     
    16421580
    16431581/********* Methode *********/
    1644 //++
     1582/*!
     1583  Impression de l'histogramme sur stdout
     1584*/
    16451585void Histo::Print(int hdyn,float hmin, float hmax,int pflag,
    16461586             int il, int ih)
    1647 //
    1648 //      Impression de l'histogramme sur stdout
    1649 //--
    16501587{
    16511588 Histo::PrintF(stdout, hdyn, hmin, hmax, pflag, il, ih);
    16521589}
    1653 
    1654 
    1655 // Rappel des inlines functions pour commentaires
    1656 //++
    1657 // inline float          XMin() const
    1658 //      Retourne l'abscisse minimum
    1659 //--
    1660 //++
    1661 // inline float          XMax() const
    1662 //      Retourne l'abscisse maximum
    1663 //--
    1664 //++
    1665 // inline int            NBins() const
    1666 //      Retourne le nombre de bins
    1667 //--
    1668 //++
    1669 // inline float          BinWidth() const
    1670 //      Retourne la largeur du bin
    1671 //--
    1672 //++
    1673 // inline float*         Bins() const
    1674 //      Retourne le pointeur sur le tableaux des contenus
    1675 //--
    1676 //++
    1677 // inline float          operator()(int i) const
    1678 //      Retourne le contenu du bin i
    1679 //--
    1680 //++
    1681 // inline float&         operator()(int i)
    1682 //      Remplit le contenu du bin i
    1683 //--
    1684 //++
    1685 // inline float          Error(int i) const
    1686 //      Retourne l'erreur du bin i
    1687 //--
    1688 //++
    1689 // inline double         Error2(int i) const
    1690 //      Retourne l'erreur au carre du bin i
    1691 //--
    1692 //++
    1693 // inline double&        Error2(int i)
    1694 //      Remplit l'erreur au carre du bin i
    1695 //--
    1696 //++
    1697 // inline float          NData() const
    1698 //      Retourne la somme ponderee
    1699 //--
    1700 //++
    1701 // inline float          NEntries()
    1702 //      Retourne le nombre d'entrees
    1703 //--
    1704 //++
    1705 // inline float          NOver() const
    1706 //      Retourne le nombre d'overflow
    1707 //--
    1708 //++
    1709 // inline float          NUnder() const
    1710 //      Retourne le nombre d'underflow
    1711 //--
    1712 //++
    1713 // inline float          BinLowEdge(int i)  const
    1714 //      Retourne l'abscisse du bord inferieur du bin i
    1715 //--
    1716 //++
    1717 // inline float          BinCenter(int i)   const
    1718 //      Retourne l'abscisse du centre du bin i
    1719 //--
    1720 //++
    1721 // inline float          BinHighEdge(int i) const
    1722 //      Retourne l'abscisse du bord superieur du bin i
    1723 //--
    1724 //++
    1725 // inline int            FindBin(float x) const   
    1726 //      Retourne le numero du bin contenant l'abscisse x
    1727 //--
    17281590
    17291591
  • trunk/SophyaLib/HiStats/histos.h

    r763 r914  
    11// This may look like C code, but it is really -*- C++ -*-
    22//
    3 // $Id: histos.h,v 1.1.1.1 2000-03-02 16:51:32 ansari Exp $
     3// $Id: histos.h,v 1.2 2000-04-13 16:04:11 ansari Exp $
    44//
    55
     
    1919class GeneralFit;
    2020
     21
     22/*!
     23  Classe d'histogrammes 1D
     24*/
    2125class Histo : public AnyDataObj {
    2226  friend class ObjFileIO<Histo>;
     
    7781
    7882  // INLINES
     83  //! Retourne l'abscisse minimum
    7984  inline float          XMin() const             {return min;}
     85  //! Retourne l'abscisse maximum
    8086  inline float          XMax() const             {return max;}
     87  //! Retourne le nombre de bins
    8188  inline int_4          NBins() const            {return bins;}
     89  //! Retourne la largeur du bin
    8290  inline float          BinWidth() const         {return binWidth;}
     91  //! Retourne le pointeur sur le tableaux des contenus
    8392  inline float*         Bins() const             {return data;}
     93  //! Retourne le contenu du bin i
    8494  inline float          operator()(int i) const  {return data[i];}
     95  //! Remplit le contenu du bin i
    8596  inline float&         operator()(int i)        {return data[i];}
     97  //! retourne "true" si il y a des erreurs stoquees
    8698  inline bool           HasErrors() { if(err2) return true; else return false;}
     99  //! Retourne l'erreur du bin i
    87100  inline float          Error(int i) const
    88101                          {if(err2) {if(err2[i]>0.) return sqrt(err2[i]); else return 0.;}
    89102                           else return 0.;}
     103  //! Retourne l'erreur au carre du bin i
    90104  inline double         Error2(int i) const
    91105                          {if(err2) return err2[i]; else return 0.;}
     106  //! Remplit l'erreur au carre du bin i
    92107  inline double&        Error2(int i) {return err2[i];}
     108  //! Retourne la somme ponderee
    93109  inline float          NData() const            {return (float) nHist;}
     110  //! Retourne le nombre d'entrees
    94111  inline float          NEntries() const         {return nEntries;}
     112  //! Retourne le nombre d'overflow
    95113  inline float          NOver() const            {return over;}
     114  //! Retourne le nombre d'underflow
    96115  inline float          NUnder() const           {return under;}
    97116
     117  //! Retourne l'abscisse du bord inferieur du bin i
    98118  inline float          BinLowEdge(int i)  const {return min + i*binWidth;}
     119  //! Retourne l'abscisse du centre du bin i
    99120  inline float          BinCenter(int i)   const {return min + (i+0.5)*binWidth;}
     121  //! Retourne l'abscisse du bord superieur du bin i
    100122  inline float          BinHighEdge(int i) const {return min + (i+1)*binWidth;}
     123  //! Retourne le numero du bin contenant l'abscisse x
    101124  inline int_4          FindBin(float x) const   
    102125                            {return (int_4) floorf((x - min) / binWidth);}
     
    146169  void Delete();
    147170
    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
    158181};
    159182
  • trunk/SophyaLib/HiStats/histos2.cc

    r763 r914  
    1616#include "generalfit.h"
    1717
    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*/
    3223Histo2D::Histo2D(float xMin, float xMax, int nxBin
    3324                ,float yMin, float yMax, int nyBin)
    34 //
    35 //      Createur d'un histogramme 2D ayant nxBin,nyBin bins
    36 //      entre xMin,xMax et yMin,yMax.
    37 //--
    3825      : data(new float[nxBin*nyBin]), err2(NULL)
    3926      , nHist(0), nEntries(0)
     
    5037}
    5138
    52 //++
     39/*!
     40  Constructeur par copie.
     41*/
    5342Histo2D::Histo2D(const Histo2D& h)
    54 //
    55 //      Constructeur par copie.
    56 //--
    5743{
    5844int i,j;
     
    118104}
    119105
    120 //++
     106/*!
     107  Constructeur par defaut.
     108*/
    121109Histo2D::Histo2D()
    122 //
    123 //      Constructeur par defaut.
    124 //--
    125110      : data(NULL), err2(NULL)
    126111      , nHist(0), nEntries(0)
     
    136121
    137122///////////////////////////////////////////////////////////////////
    138 //++
     123/*!
     124  Desallocation de la place de l'histogramme (fct privee).
     125*/
    139126void Histo2D::Delete()
    140 //
    141 //      Desallocation de la place de l'histogramme (fct privee).
    142 //--
    143127{
    144128  if( data != NULL ) { delete[] data; data = NULL;}
     
    163147}
    164148
    165 //++
     149/*!
     150  Destructeur.
     151*/
    166152Histo2D::~Histo2D()
    167 //
    168 //      Destructeur.
    169 //--
    170153{
    171154Delete();
     
    173156
    174157///////////////////////////////////////////////////////////////////
    175 //++
    176 // Titre        Methodes generales
    177 //--
    178 
    179 //++
     158/*!
     159  Remise a zero du contenu, des erreurs et des valeurs.
     160*/
    180161void Histo2D::Zero()
    181 //
    182 //      Remise a zero du contenu, des erreurs et des valeurs.
    183 //--
    184162{
    185163  nHist = nEntries = 0;
     
    200178
    201179///////////////////////////////////////////////////////////////////
    202 //++
     180/*!
     181  Pour avoir le calcul des erreurs.
     182*/
    203183void Histo2D::Errors()
    204 //
    205 //      Pour avoir le calcul des erreurs.
    206 //--
    207184{
    208185 if( nxy > 0 ) {
     
    213190
    214191///////////////////////////////////////////////////////////////////
    215 //++
     192/*!
     193  Operateur H2 = H1
     194*/
    216195Histo2D& Histo2D::operator = (const Histo2D& h)
    217 //
    218 //--
    219196{
    220197  int i,j,nb;
     
    286263
    287264///////////////////////////////////////////////////////////////////
    288 //++
     265/*!
     266  Operateur H *= b
     267*/
    289268Histo2D& Histo2D::operator *= (double b)
    290 //
    291 //--
    292269{
    293270int i,j;
     
    310287}
    311288
    312 //++
     289/*!
     290  Operateur H /= b
     291*/
    313292Histo2D& Histo2D::operator /= (double b)
    314 //
    315 //--
    316293{
    317294int i,j;
     
    335312}
    336313
    337 //++
     314/*!
     315  Operateur H += b
     316*/
    338317Histo2D& Histo2D::operator += (double b)
    339 //
    340 //--
    341318{
    342319int i,j;
     
    362339}
    363340
    364 //++
     341/*!
     342  Operateur H -= b
     343*/
    365344Histo2D& Histo2D::operator -= (double b)
    366 //
    367 //--
    368345{
    369346int i,j;
     
    390367
    391368///////////////////////////////////////////////////////////////////
    392 //++
     369/*!
     370  Operateur H2 = H1 * b
     371*/
    393372Histo2D operator * (const Histo2D& a, double b)
    394 //
    395 //--
    396373{
    397374  Histo2D result(a);
     
    399376}
    400377
    401 //++
     378/*!
     379  Operateur H2 = b * H1
     380*/
    402381Histo2D operator * (double b, const Histo2D& a)
    403 //
    404 //--
    405382{
    406383  Histo2D result(a);
     
    408385}
    409386
    410 //++
     387/*!
     388  Operateur H2 = H1 / b
     389*/
    411390Histo2D operator / (const Histo2D& a, double b)
    412 //
    413 //--
    414391{
    415392  Histo2D result(a);
     
    417394}
    418395
    419 //++
     396/*!
     397  Operateur H2 = H1 + b
     398*/
    420399Histo2D operator + (const Histo2D& a, double b)
    421 //
    422 //--
    423400{
    424401  Histo2D result(a);
     
    426403}
    427404
    428 //++
     405/*!
     406  Operateur H2 = b + H1
     407*/
    429408Histo2D operator + (double b, const Histo2D& a)
    430 //
    431 //--
    432409{
    433410  Histo2D result(a);
     
    435412}
    436413
    437 //++
     414/*!
     415  Operateur H2 = H1 - b
     416*/
    438417Histo2D operator - (const Histo2D& a, double b)
    439 //
    440 //--
    441418{
    442419  Histo2D result(a);
     
    444421}
    445422
    446 //++
     423/*!
     424  Operateur H2 = b - H1
     425*/
    447426Histo2D operator - (double b, const Histo2D& a)
    448 //
    449 //--
    450427{
    451428  Histo2D result(a);
     
    455432
    456433///////////////////////////////////////////////////////////////////
    457 //++
     434/*!
     435  Operateur H += H1
     436*/
    458437Histo2D& Histo2D::operator += (const Histo2D& a)
    459 //
    460 //--
    461438{
    462439int i,j;
     
    478455}
    479456
    480 //++
     457/*!
     458  Operateur H -= H1
     459*/
    481460Histo2D& Histo2D::operator -= (const Histo2D& a)
    482 //
    483 //--
    484461{
    485462int i,j;
     
    501478}
    502479
    503 //++
     480/*!
     481  Operateur H *= H1
     482*/
    504483Histo2D& Histo2D::operator *= (const Histo2D& a)
    505 //
    506 //--
    507484{
    508485int i,j;
     
    526503}
    527504
    528 //++
     505/*!
     506  Operateur H /= H1
     507*/
    529508Histo2D& Histo2D::operator /= (const Histo2D& a)
    530 //
    531 //--
    532509{
    533510int i,j;
     
    559536
    560537///////////////////////////////////////////////////////////////////
    561 //++
     538/*!
     539  Operateur H = H1 + H2
     540*/
     541
    562542Histo2D operator + (const Histo2D& a, const Histo2D& b)
    563 //
    564 //--
    565543{
    566544if (b.NBinX()!=a.NBinX() || b.NBinY()!=a.NBinY()) THROW(sizeMismatchErr);
     
    569547}
    570548
    571 //++
     549/*!
     550  Operateur H = H1 - H2
     551*/
    572552Histo2D operator - (const Histo2D& a, const Histo2D& b)
    573 //
    574 //--
    575553{
    576554if (b.NBinX()!=a.NBinX() || b.NBinY()!=a.NBinY()) THROW(sizeMismatchErr);
     
    579557}
    580558
    581 //++
     559/*!
     560  Operateur H = H1 * H2
     561*/
    582562Histo2D operator * (const Histo2D& a, const Histo2D& b)
    583 //
    584 //--
    585563{
    586564if (b.NBinX()!=a.NBinX() || b.NBinY()!=a.NBinY()) THROW(sizeMismatchErr);
     
    589567}
    590568
    591 //++
     569/*!
     570  Operateur H = H1 / H2
     571*/
    592572Histo2D operator / (const Histo2D& a, const Histo2D& b)
    593 //
    594 //--
    595573{
    596574if (b.NBinX()!=a.NBinX() || b.NBinY()!=a.NBinY()) THROW(sizeMismatchErr);
     
    600578
    601579///////////////////////////////////////////////////////////////////
    602 //++
     580/*!
     581  Remplissage d'un tableau avec les valeurs des abscisses.
     582*/
    603583void Histo2D::GetXCoor(Vector &v)
    604 //
    605 //      Remplissage d'un tableau avec les valeurs des abscisses.
    606 //--
    607584{
    608585float x,y;
     
    612589}
    613590
    614 //++
     591/*!
     592  Remplissage d'un tableau avec les valeurs des ordonnees.
     593*/
    615594void Histo2D::GetYCoor(Vector &v)
    616 //
    617 //      Remplissage d'un tableau avec les valeurs des ordonnees.
    618 //--
    619595{
    620596float x,y;
     
    624600}
    625601
    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*/
    644605void Histo2D::GetValue(Matrix &v)
    645 //
    646 //      Remplissage d'un tableau avec les valeurs du contenu.
    647 //--
    648606{
    649607v.Realloc(nx,ny);
     
    653611}
    654612
    655 //++
     613/*!
     614  Remplissage d'un tableau avec les valeurs du carre des erreurs.
     615*/
    656616void Histo2D::GetError2(Matrix &v)
    657 //
    658 //      Remplissage d'un tableau avec les valeurs du carre des erreurs.
    659 //--
    660617{
    661618int i,j;
     
    667624}
    668625
    669 //++
     626/*!
     627  Remplissage d'un tableau avec les valeurs des erreurs.
     628*/
    670629void Histo2D::GetError(Matrix &v)
    671 //
    672 //      Remplissage d'un tableau avec les valeurs des erreurs.
    673 //--
    674630{
    675631int i,j;
     
    682638
    683639///////////////////////////////////////////////////////////////////
    684 //++
     640/*!
     641  Remplissage du contenu de l'histo avec les valeurs d'un tableau.
     642*/
    685643void Histo2D::PutValue(Matrix &v, int ierr)
    686 //
    687 //      Remplissage du contenu de l'histo avec les valeurs d'un tableau.
    688 //--
    689644{
    690645int i,j;
     
    697652}
    698653
    699 //++
     654/*!
     655  Addition du contenu de l'histo avec les valeurs d'un tableau.
     656*/
    700657void Histo2D::PutValueAdd(Matrix &v, int ierr)
    701 //
    702 //      Addition du contenu de l'histo avec les valeurs d'un tableau.
    703 //--
    704658{
    705659int i,j;
     
    712666}
    713667
    714 //++
     668/*!
     669  Remplissage des erreurs au carre de l'histo
     670  avec les valeurs d'un tableau.
     671*/
    715672void Histo2D::PutError2(Matrix &v)
    716 //
    717 //      Remplissage des erreurs au carre de l'histo
    718 //      avec les valeurs d'un tableau.
    719 //--
    720673{
    721674int i,j;
     
    726679}
    727680
    728 //++
     681/*!
     682  Addition des erreurs au carre de l'histo
     683  avec les valeurs d'un tableau.
     684*/
    729685void Histo2D::PutError2Add(Matrix &v)
    730 //
    731 //      Addition des erreurs au carre de l'histo
    732 //      avec les valeurs d'un tableau.
    733 //--
    734686{
    735687int i,j;
     
    741693}
    742694
    743 //++
     695/*!
     696  Remplissage des erreurs de l'histo avec les valeurs d'un tableau.
     697*/
    744698void Histo2D::PutError(Matrix &v)
    745 //
    746 //      Remplissage des erreurs de l'histo avec les valeurs d'un tableau.
    747 //--
    748699{
    749700int i,j;
     
    757708///////////////////////////////////////////////////////////////////
    758709/********* Methode *********/
    759 //++
     710/*!
     711  Addition du contenu de l'histo pour x,y poids w.
     712*/
    760713void Histo2D::Add(float x, float y, float w)
    761 //
    762 //      Addition du contenu de l'histo pour x,y poids w.
    763 //--
    764714{
    765715list<bande_slice>::iterator it;
     
    801751
    802752///////////////////////////////////////////////////////////////////
    803 //++
     753/*!
     754  Recherche du bin du maximum dans le pave [il,ih][jl,jh].
     755*/
    804756void 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 //--
    808757{
    809758if( il > ih ) { il = 0; ih = nx-1; }
     
    823772}
    824773
    825 //++
     774/*!
     775  Recherche du bin du minimum dans le pave [il,ih][jl,jh].
     776*/
    826777void 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 //--
    830778{
    831779if( il > ih ) { il = 0; ih = nx-1; }
     
    846794
    847795
    848 //++
     796/*!
     797  Recherche du maximum dans le pave [il,ih][jl,jh].
     798*/
    849799float Histo2D::VMax(int il,int ih,int jl,int jh) const
    850 //
    851 //      Recherche du maximum dans le pave [il,ih][jl,jh].
    852 //--
    853800{
    854801if( il > ih ) { il = 0; ih = nx-1; }
     
    867814}
    868815
    869 //++
     816/*!
     817  Recherche du minimum dans le pave [il,ih][jl,jh].
     818*/
    870819float Histo2D::VMin(int il,int ih,int jl,int jh) const
    871 //
    872 //      Recherche du minimum dans le pave [il,ih][jl,jh].
    873 //--
    874820{
    875821if( il > ih ) { il = 0; ih = nx-1; }
     
    889835
    890836///////////////////////////////////////////////////////////////////
    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*/
    892851float Histo2D::NOver(int i,int j) const
    893 //
    894 //      Renvoie les under.overflow dans les 8 quadrants.
    895 //|  over[3][3]:        20 | 21 | 22
    896 //|                        |    |
    897 //|                    --------------
    898 //|                        |    |
    899 //|                     10 | 11 | 12        11 = all overflow+underflow
    900 //|                        |    |
    901 //|                    --------------
    902 //|                        |    |
    903 //|                     00 | 01 | 02
    904 //--
    905852{
    906853if( i < 0 || i>=3 || j < 0 || j>=3 ) return over[1][1];
     
    910857
    911858///////////////////////////////////////////////////////////////////
    912 //++
     859/*!
     860  Retourne le nombre de bins non-nuls.
     861*/
    913862int Histo2D::BinNonNul() const
    914 //
    915 //      Retourne le nombre de bins non-nuls.
    916 //--
    917863{
    918864int non=0;
     
    921867}
    922868
    923 //++
     869/*!
     870  Retourne le nombre de bins avec erreurs non-nulles.
     871*/
    924872int Histo2D::ErrNonNul() const
    925 //
    926 //      Retourne le nombre de bins avec erreurs non-nulles.
    927 //--
    928873{
    929874if(err2==NULL) return -1;
     
    934879
    935880///////////////////////////////////////////////////////////////////
    936 //++
     881/*!
     882  Idem EstimeMax(int...) mais retourne x,y.
     883*/
    937884int Histo2D::EstimeMax(float& xm,float& ym,int SzPav
    938885                      ,int il,int ih,int jl,int jh)
    939 //
    940 //      Idem EstimeMax(int...) mais retourne x,y.
    941 //--
    942886{
    943887int im,jm;
     
    946890}
    947891
    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*/
    949904int Histo2D::EstimeMax(int im,int jm,float& xm,float& ym,int SzPav)
    950 //
    951 //      Determine les abscisses et ordonnees du maximum donne par im,jm
    952 //      en moyennant dans un pave SzPav x SzPav autour du maximum.
    953 //|  Return:
    954 //|    0 = si fit maximum reussi avec SzPav pixels
    955 //|    1 = si fit maximum reussi avec moins que SzPav pixels
    956 //|                                dans au moins 1 direction
    957 //|    2 = si fit maximum echoue et renvoit BinCenter()
    958 //|   -1 = si echec: SzPav <= 0 ou im,jm hors limites
    959 //--
    960905{
    961906xm = ym = 0;
     
    992937}
    993938
    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*/
    995959int Histo2D::FindMax(int& im,int& jm,int SzPav,float Dz
    996960                    ,int il,int ih,int jl,int jh)
    997 //
    998 //      Pour trouver le maximum de l'histogramme en tenant compte
    999 //      des fluctuations.
    1000 //| Methode:
    1001 //| 1-/ On recherche le bin maximum MAX de l'histogramme
    1002 //| 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 departager
    1008 //|  Dz    = tolerance pour identifier tous les pixels "maximum"
    1009 //| OUTPUT:
    1010 //|  im,jm = pixel maximum trouve
    1011 //| RETURN:
    1012 //|   <0 =  Echec
    1013 //|   >0 =  nombre de pixels possibles pour le maximum
    1014 //--
    1015961{
    1016962if( il > ih ) { il = 0; ih = nx-1; }
     
    1046992
    1047993//////////////////////////////////////////////////////////
    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*/
    10491014int  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 existe
    1054 //|    - sinon 1
    1055 //| typ_err = 1 :
    1056 //|    - erreur attachee au bin si elle existe
    1057 //|    - sinon max( sqrt(abs(bin) ,1 )
    1058 //| typ_err = 2 :
    1059 //|    - erreur forcee a 1
    1060 //| 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 //--
    10681015{
    10691016if(NBinX()*NBinY()<=0) return -1000;
     
    10921039}
    10931040
    1094 //++
     1041/*!
     1042  Retourne une classe contenant les residus du fit ``gfit''.
     1043*/
    10951044Histo2D Histo2D::FitResidus(GeneralFit& gfit)
    1096 //
    1097 //      Retourne une classe contenant les residus du fit ``gfit''.
    1098 //--
    10991045{
    11001046if(NBinX()<=0 || NBinY()<=0)
     
    11141060}
    11151061
    1116 //++
     1062/*!
     1063  Retourne une classe contenant la fonction du fit ``gfit''.
     1064*/
    11171065Histo2D Histo2D::FitFunction(GeneralFit& gfit)
    1118 //
    1119 //      Retourne une classe contenant la fonction du fit ``gfit''.
    1120 //--
    11211066{
    11221067if(NBinX()<=0 || NBinY()<=0)
     
    11371082
    11381083///////////////////////////////////////////////////////////////////
    1139 //++
     1084/*!
     1085  Impression des informations sur l'histogramme.
     1086*/
    11401087void Histo2D::PrintStatus()
    1141 //
    1142 //      Impression des informations sur l'histogramme.
    1143 //--
    11441088{
    11451089printf("~Histo::Print    nHist=%g nEntries=%d\n",nHist,nEntries);
     
    11531097
    11541098///////////////////////////////////////////////////////////////////
    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*/
    11561108void Histo2D::Print(float min,float max
    11571109                   ,int il,int ih,int jl,int jh)
    1158 //
    1159 //      Impression de l'histogramme sur stdout entre [il,ih] et [jl,jh].
    1160 //--
    11611110{
    11621111int ns = 35;
    1163 // numero d'index:  00000000001111111111222222222233333
    1164 //                  01234567890123456789012345678901234
    1165 // valeur entiere:  00000000001111111111222222222233333
    1166 //                  12345678901234567890123456789012345
    11671112const char *s =    "+23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    11681113
     
    12451190}
    12461191
    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///////////////////////////////////////////////////////////////////
    13311193// Titre        Methodes pour gerer les projections
    1332 //--
    1333 
    1334 //++
     1194
     1195/*!
     1196  Pour creer la projection X.
     1197*/
    13351198void Histo2D::SetProjX()
    1336 //
    1337 //      Pour creer la projection X.
    1338 //--
    13391199{
    13401200if( hprojx != NULL ) DelProjX();
     
    13431203}
    13441204
    1345 //++
     1205/*!
     1206  Pour creer la projection Y.
     1207*/
    13461208void Histo2D::SetProjY()
    1347 //
    1348 //      Pour creer la projection Y.
    1349 //--
    13501209{
    13511210if( hprojy != NULL ) DelProjY();
     
    13541213}
    13551214
    1356 //++
     1215/*!
     1216  Pour creer les projections X et Y.
     1217*/
    13571218void Histo2D::SetProj()
    1358 //
    1359 //      Pour creer les projections X et Y.
    1360 //--
    13611219{
    13621220SetProjX();
     
    13641222}
    13651223
    1366 //++
     1224/*!
     1225  Informations sur les projections.
     1226*/
    13671227void Histo2D::ShowProj()
    1368 //
    1369 //      Informations sur les projections.
    1370 //--
    13711228{
    13721229if( hprojx != NULL ) cout << ">>>> Projection X set : "<< hprojx <<endl;
     
    13761233}
    13771234
    1378 //++
     1235/*!
     1236  Destruction de l'histogramme de la projection selon X.
     1237*/
    13791238void Histo2D::DelProjX()
    1380 //
    1381 //      Destruction de l'histogramme de la projection selon X.
    1382 //--
    13831239{
    13841240if( hprojx == NULL ) return;
     
    13871243}
    13881244
    1389 //++
     1245/*!
     1246  Destruction de l'histogramme de la projection selon X.
     1247*/
    13901248void Histo2D::DelProjY()
    1391 //
    1392 //      Destruction de l'histogramme de la projection selon X.
    1393 //--
    13941249{
    13951250if( hprojy == NULL ) return;
     
    13981253}
    13991254
    1400 //++
     1255/*!
     1256  Destruction des histogrammes des projections selon X et Y.
     1257*/
    14011258void Histo2D::DelProj()
    1402 //
    1403 //      Destruction des histogrammes des projections selon X et Y.
    1404 //--
    14051259{
    14061260DelProjX();
     
    14081262}
    14091263
    1410 //++
     1264/*!
     1265  Remise a zero de la projection selon X.
     1266*/
    14111267void Histo2D::ZeroProjX()
    1412 //
    1413 //      Remise a zero de la projection selon X.
    1414 //--
    14151268{
    14161269if( hprojx == NULL ) return;
     
    14181271}
    14191272
    1420 //++
     1273/*!
     1274  Remise a zero de la projection selon Y.
     1275*/
    14211276void Histo2D::ZeroProjY()
    1422 //
    1423 //      Remise a zero de la projection selon Y.
    1424 //--
    14251277{
    14261278if( hprojy == NULL ) return;
     
    14281280}
    14291281
    1430 //++
     1282/*!
     1283  Remise a zero des projections selon X et Y.
     1284*/
    14311285void Histo2D::ZeroProj()
    1432 //
    1433 //      Remise a zero des projections selon X et Y.
    1434 //--
    14351286{
    14361287ZeroProjX();
     
    14381289}
    14391290
    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///////////////////////////////////////////////////////////////////
    14521292// Titre        Methodes pour gerer les bandes
    1453 //--
    1454 
    1455 //++
     1293
     1294/*!
     1295  Pour creer une bande en X entre ybmin et ybmax.
     1296*/
    14561297int Histo2D::SetBandX(float ybmin,float ybmax)
    1457 //
    1458 //      Pour creer une bande en X entre ybmin et ybmax.
    1459 //--
    14601298{
    14611299b_s.num = lbandx.size();
     
    14681306}
    14691307
    1470 //++
     1308/*!
     1309  Pour creer une bande en Y entre xbmin et xbmax.
     1310*/
    14711311int Histo2D::SetBandY(float xbmin,float xbmax)
    1472 //
    1473 //      Pour creer une bande en Y entre xbmin et xbmax.
    1474 //--
    14751312{
    14761313b_s.num = lbandy.size();
     
    14831320}
    14841321
    1485 //++
     1322/*!
     1323  Destruction des histogrammes des bandes selon X.
     1324*/
    14861325void Histo2D::DelBandX()
    1487 //
    1488 //      Destruction des histogrammes des bandes selon X.
    1489 //--
    14901326{
    14911327if( lbandx.size() <= 0 ) return;
     
    14951331}
    14961332
    1497 //++
     1333/*!
     1334  Destruction des histogrammes des bandes selon Y.
     1335*/
    14981336void Histo2D::DelBandY()
    1499 //
    1500 //      Destruction des histogrammes des bandes selon Y.
    1501 //--
    15021337{
    15031338if( lbandy.size() <= 0 ) return;
     
    15071342}
    15081343
    1509 //++
     1344/*!
     1345  Remise a zero des bandes selon X.
     1346*/
    15101347void Histo2D::ZeroBandX()
    1511 //
    1512 //      Remise a zero des bandes selon X.
    1513 //--
    15141348{
    15151349if( lbandx.size() <= 0 ) return;
     
    15191353}
    15201354
    1521 //++
     1355/*!
     1356  Remise a zero des bandes selon Y.
     1357*/
    15221358void Histo2D::ZeroBandY()
    1523 //
    1524 //      Remise a zero des bandes selon Y.
    1525 //--
    15261359{
    15271360if( lbandy.size() <= 0 ) return;
     
    15311364}
    15321365
    1533 //++
     1366/*!
     1367  Retourne un pointeur sur la bande numero `n' selon X.
     1368*/
    15341369Histo* Histo2D::HBandX(int n) const
    1535 //
    1536 //      Retourne un pointeur sur la bande numero `n' selon X.
    1537 //--
    15381370{
    15391371if( lbandx.size() <= 0 || n < 0 || n >= (int) lbandx.size() ) return NULL;
     
    15431375}
    15441376
    1545 //++
     1377/*!
     1378  Retourne un pointeur sur la bande numero `n' selon Y.
     1379*/
    15461380Histo* Histo2D::HBandY(int n) const
    1547 //
    1548 //      Retourne un pointeur sur la bande numero `n' selon Y.
    1549 //--
    15501381{
    15511382if( lbandy.size() <= 0 || n < 0 || n >= (int) lbandy.size() ) return NULL;
     
    15551386}
    15561387
    1557 //++
     1388/*!
     1389  Retourne les limites de la bande numero `n' selon X.
     1390*/
    15581391void Histo2D::GetBandX(int n,float& ybmin,float& ybmax) const
    1559 //
    1560 //      Retourne les limites de la bande numero `n' selon X.
    1561 //--
    15621392{
    15631393ybmin = 0.; ybmax = 0.;
     
    15681398}
    15691399
    1570 //++
     1400/*!
     1401  Retourne les limites de la bande numero `n' selon Y.
     1402*/
    15711403void Histo2D::GetBandY(int n,float& xbmin,float& xbmax) const
    1572 //
    1573 //      Retourne les limites de la bande numero `n' selon Y.
    1574 //--
    15751404{
    15761405xbmin = 0.; xbmax = 0.;
     
    15811410}
    15821411
    1583 //++
     1412/*!
     1413  Informations sur les bandes.
     1414*/
    15841415void Histo2D::ShowBand(int lp)
    1585 //
    1586 //      Informations sur les bandes.
    1587 //--
    15881416{
    15891417  cout << ">>>> Nombre de bande X : " << lbandx.size() << endl;
     
    16081436}
    16091437
    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*/
    16261444int Histo2D::SetSliX(int nsli)
    1627 //
    1628 //      Pour creer `nsli' bandes equidistantes selon X.
    1629 //--
    16301445{
    16311446if( nsli <= 0 ) return -1;
     
    16451460}
    16461461
    1647 //++
     1462/*!
     1463  Pour creer `nsli' bandes equidistantes selon Y.
     1464*/
    16481465int Histo2D::SetSliY(int nsli)
    1649 //
    1650 //      Pour creer `nsli' bandes equidistantes selon Y.
    1651 //--
    16521466{
    16531467if( nsli <= 0 ) return -1;
     
    16671481}
    16681482
    1669 //++
     1483/*!
     1484  Destruction des bandes equidistantes selon X.
     1485*/
    16701486void Histo2D::DelSliX()
    1671 //
    1672 //      Destruction des bandes equidistantes selon X.
    1673 //--
    16741487{
    16751488if( lslix.size() <= 0 ) return;
     
    16791492}
    16801493
    1681 //++
     1494/*!
     1495  Destruction des bandes equidistantes selon Y.
     1496*/
    16821497void Histo2D::DelSliY()
    1683 //
    1684 //      Destruction des bandes equidistantes selon Y.
    1685 //--
    16861498{
    16871499if( lsliy.size() <= 0 ) return;
     
    16911503}
    16921504
    1693 //++
     1505/*!
     1506  Remise a zero des bandes equidistantes selon X.
     1507*/
    16941508void Histo2D::ZeroSliX()
    1695 //
    1696 //      Remise a zero des bandes equidistantes selon X.
    1697 //--
    16981509{
    16991510if( lslix.size() <= 0 ) return;
     
    17031514}
    17041515
    1705 //++
     1516/*!
     1517  Remise a zero des bandes equidistantes selon Y.
     1518*/
    17061519void Histo2D::ZeroSliY()
    1707 //
    1708 //      Remise a zero des bandes equidistantes selon Y.
    1709 //--
    17101520{
    17111521if( lsliy.size() <= 0 ) return;
     
    17151525}
    17161526
    1717 //++
     1527/*!
     1528  Retourne un pointeur sur la bande equidistante numero `n'
     1529  selon X.
     1530*/
    17181531Histo* Histo2D::HSliX(int n) const
    1719 //
    1720 //      Retourne un pointeur sur la bande equidistante numero `n'
    1721 //      selon X.
    1722 //--
    17231532{
    17241533if( lslix.size() <= 0 || n < 0 || n >= (int) lslix.size() ) return NULL;
     
    17281537}
    17291538
    1730 //++
     1539/*!
     1540  Retourne un pointeur sur la bande equidistante numero `n'
     1541  selon Y.
     1542*/
    17311543Histo* Histo2D::HSliY(int n) const
    1732 //
    1733 //      Retourne un pointeur sur la bande equidistante numero `n'
    1734 //      selon Y.
    1735 //--
    17361544{
    17371545if( lsliy.size() <= 0 || n < 0 || n >= (int) lsliy.size() ) return NULL;
     
    17411549}
    17421550
    1743 //++
     1551/*!
     1552  Informations sur les bandes equidistantes.
     1553*/
    17441554void Histo2D::ShowSli(int lp)
    1745 //
    1746 //      Informations sur les bandes equidistantes.
    1747 //--
    17481555{
    17491556list<bande_slice>::iterator i;
     
    17641571  }
    17651572}
    1766 
    1767 // Rappel des inline functions pour commentaires
    1768 //++
    1769 // inline int     NSliX()
    1770 //      Retourne le nombre de slices selon X
    1771 //--
    1772 //++
    1773 // inline int     NSliY()
    1774 //      Retourne le nombre de slices selon Y
    1775 //--
    1776 
    17771573
    17781574///////////////////////////////////////////////////////////
  • trunk/SophyaLib/HiStats/histos2.h

    r763 r914  
    2222class GeneralFit;
    2323
     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*/
    2444class Histo2D : public AnyDataObj {
    2545  friend class ObjFileIO<Histo2D>;
     
    7595
    7696  // INLINES
     97  //! Retourne l'abscisse minimum.
    7798  inline float   XMin() const {return xmin;}
     99  //! Retourne l'abscisse maximum.
    78100  inline float   XMax() const {return xmax;}
     101  //! Retourne l'ordonnee minimum.
    79102  inline float   YMin() const {return ymin;}
     103  //! Retourne l'ordonnee maximum.
    80104  inline float   YMax() const {return ymax;}
     105  //! Retourne le nombre de bins selon X.
    81106  inline int_4   NBinX() const {return nx;}
     107  //! Retourne le nombre de bins selon Y.
    82108  inline int_4   NBinY() const {return ny;}
     109  //! Retourne la largeur du bin selon X.
    83110  inline float   WBinX() const {return wbinx;}
     111  //! Retourne la largeur du bin selon Y.
    84112  inline float   WBinY() const {return wbiny;}
     113  //! Retourne le pointeur sur le tableaux des contenus.
    85114  inline float*  Bins() const  {return data;}
     115  //! Retourne le contenu du bin i,j.
    86116  inline float   operator()(int i,int j) const {return data[j*nx+i];}
     117  //! Remplit le contenu du bin i,j.
    87118  inline float&  operator()(int i,int j)       {return data[j*nx+i];}
     119  //! retourne "true" si il y a des erreurs stoquees
    88120  inline bool    HasErrors() { if(err2) return true; else return false;}
     121  //! Retourne l'erreur du bin i,j.
    89122  inline float   Error(int i,int j)  const
    90123                   {if(err2)
    91124                      {if(err2[j*nx+i]>0.) return sqrt(err2[j*nx+i]); else return 0.;}
    92125                    else return 0.;}
     126  //! Remplit l'erreur au carre du bin i,j.
    93127  inline double  Error2(int i,int j) const
    94128                   {if(err2) return err2[j*nx+i]; else return 0.;}
     129  //! Remplit l'erreur au carre du bin i,j.
    95130  inline double& Error2(int i,int j) {return err2[j*nx+i];}
     131  //! Retourne la somme ponderee.
    96132  inline float   NData() const    {return (float) nHist;}
     133  //! Retourne le nombre d'entrees.
    97134  inline int_4   NEntries() const {return nEntries;}
     135  //! Retourne l'abscisse et l'ordonnee du coin inferieur du bin i,j.
    98136  inline void BinLowEdge(int i,int j,float& x,float& y)
    99137                 {x = xmin + i*wbinx; y = ymin + j*wbiny;}
     138  //! Retourne l'abscisse et l'ordonnee du centre du bin i,j.
    100139  inline void BinCenter(int i,int j,float& x,float& y)
    101140                 {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.
    102142  inline void BinHighEdge(int i,int j,float& x,float& y)
    103143                 {x = xmin + (i+1)*wbinx; y = ymin + (j+1)*wbiny;}
     144  //! Retourne les numeros du bin contenant l'abscisse et l'ordonnee x,y.
    104145  inline void FindBin(float x,float y,int& i,int& j)
    105146    { i = (int) floorf((x - xmin)/wbinx); j = (int) floorf((y - ymin)/wbiny);}
     
    139180  void           ZeroProjY();
    140181  void           ZeroProj();
     182  //! Retourne le pointeur sur l'histo 1D de la projection selon X.
    141183  inline Histo*  HProjX() const {return hprojx;}
     184  //! Retourne le pointeur sur l'histo 1D de la projection selon Y.
    142185  inline Histo*  HProjY() const {return hprojy;}
    143186  void           ShowProj();
    144187
    145188  // BANDES
     189  //! Retourne le nombre de bandes selon X
    146190  inline int     NBandX() const {return lbandx.size();}
     191  //! Retourne le nombre de bandes selon Y
    147192  inline int     NBandY() const {return lbandy.size();}
    148193  int            SetBandX(float ybmin,float ybmax);
     
    159204
    160205  // SLICES
     206  //! Retourne le nombre de slices selon X
    161207  inline int     NSliX() const {return lslix.size();}
     208  //! Retourne le nombre de slices selon Y
    162209  inline int     NSliY() const {return lsliy.size();}
    163210  int            SetSliX(int nsli);
     
    174221protected:
    175222#endif
     223  //! structure de definition des bandes
    176224  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
    180229    STRUCTCOMP(bande_slice)
    181230  };
     
    186235  void Delete();
    187236
    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
    202253
    203254  bande_slice    b_s;
    204255
    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
    210261 
    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
    213264
    214265};
Note: See TracChangeset for help on using the changeset viewer.