Changeset 1056 in Sophya


Ignore:
Timestamp:
Jul 7, 2000, 10:41:11 AM (25 years ago)
Author:
ansari
Message:

cmv 7/7/2000

hisprof.cc,h:

fonction IsOk()
GetMean -> GetValue (mauvais nom)
float Error2() -> double Error2()
nouveau: GetError(TVector<r_8>& v)
HProf::PrintF() sur-ecriture de Histo::PrintF
protection dans createur par copie dans alloc

SumY... pour le cas ou H.bins==0

protection dans UpdateHisto pour HProf cree par defaut (bins==0)
Dans WriteSelf UpdateHisto appele que si necessaire (IsOk()?)

histos2.cc : le Print() dit si les erreurs ont ete demandees
histos.cc,h:

protection dans createur par copie dans alloc

pour le cas ou H.bins==0

protection dans Zero() pour Histo cree par defaut (bins==0)
protection dans operator=() pour Histo cree par defaut (bins==0)
le Print() dit si les erreurs ont ete demandees

cmv 7/7/2000

Location:
trunk/SophyaLib/HiStats
Files:
5 edited

Legend:

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

    r1053 r1056  
    4747HProf::HProf(const HProf& H)
    4848: Histo(H)
    49 , SumY(new double[H.bins]), SumY2(new double[H.bins]), SumW(new double[H.bins])
     49, SumY((H.bins>0)  ? new double[H.bins] : NULL)
     50, SumY2((H.bins>0) ? new double[H.bins] : NULL)
     51, SumW((H.bins>0)  ? new double[H.bins] : NULL)
    5052, Ok(H.Ok), YMin(H.YMin), YMax(H.YMax), Opt(H.Opt)
    5153{
    52   memcpy(SumY,  H.SumY,  bins*sizeof(double));
    53   memcpy(SumY2, H.SumY2, bins*sizeof(double));
    54   memcpy(SumW,  H.SumW,  bins*sizeof(double));
     54  if(bins>0) {
     55    memcpy(SumY,  H.SumY,  bins*sizeof(double));
     56    memcpy(SumY2, H.SumY2, bins*sizeof(double));
     57    memcpy(SumW,  H.SumW,  bins*sizeof(double));
     58  }
    5559  END_CONSTRUCTOR
    5660}
     
    125129void HProf::UpdateHisto() const
    126130{
    127 
    128131float m,e2;
     132if(bins<=0) return;
    129133for(int i=0;i<bins;i++) {
    130134  if(SumW[i]<=0.) {
     
    185189/********* Methode *********/
    186190/*!
    187   Operateur H = H1
     191  Operateur HProf H = H1
    188192*/
    189193HProf& HProf::operator = (const HProf& h)
     
    209213/********* Methode *********/
    210214/*!
    211   Operateur H += H1
     215  Operateur HProf H += H1
    212216
    213217  Attention dans cette addition il n'y a pas de gestion
     
    273277char strg[256];
    274278
    275 dobj->UpdateHisto();
     279if(!(dobj->IsOk())) dobj->UpdateHisto();
    276280
    277281// Ecriture entete pour identifier facilement
  • trunk/SophyaLib/HiStats/hisprof.h

    r1053 r1056  
    2222
    2323  // UPDATING or SETTING
    24   void   Zero();
    25   void   UpdateHisto() const;
    26   void   SetErrOpt(bool spread = true);
    27   void   Add(float x, float y, float w = 1.);
    28   void   AddBin(int numBin, float y, float w = 1.);
     24  void UpdateHisto() const;
     25  void SetErrOpt(bool spread = true);
     26  void Zero();
     27  void Add(float x, float y, float w = 1.);
     28  void AddBin(int numBin, float y, float w = 1.);
    2929 
    3030  // Acces a l information
     31  //! Retourne true si l'histogramme est a jours, false sinon.
     32  inline bool IsOk() const {return Ok;}
    3133  //! Retourne l'histogramme de profil.
    3234  inline Histo GetHisto()
    3335               {if(!Ok) UpdateHisto(); return (Histo) *this;}
    3436  //! Retourne le contenu de la moyenne dans le vecteur v
    35   inline void GetMean(TVector<r_8>& v)
     37  inline void GetValue(TVector<r_8>& v)
    3638              {if(!Ok) UpdateHisto(); Histo::GetValue(v);}
    3739  //! Retourne le contenu au carre de la dispersion/erreur dans le vecteur v
    3840  inline void GetError2(TVector<r_8>& v)
    3941              {if(!Ok) UpdateHisto(); Histo::GetError2(v);}
     42  //! Retourne le contenu au carre de la dispersion/erreur dans le vecteur v
     43  inline void GetError(TVector<r_8>& v)
     44              {if(!Ok) UpdateHisto(); Histo::GetError(v);}
    4045  //! Retourne le contenu du bin i
    4146  inline float operator()(int i) const
    4247               {if(!Ok) UpdateHisto(); return data[i];}
    4348  //! Retourne le carre de la dispersion/erreur du bin i
    44   inline float Error2(int i) const
    45                {if(!Ok) UpdateHisto(); return (float) err2[i];}
     49  inline double Error2(int i) const
     50         {if(!Ok) UpdateHisto(); return (float) err2[i];}
    4651  //! Retourne la dispersion/erreur du bin i
    4752  inline float Error(int i) const
    4853         {if(!Ok) UpdateHisto();
    49           return err2[i]>0. ? (float) sqrt(err2[i]) : 0.f;}
     54          return (err2[i]>0.) ? (float) sqrt(err2[i]) : 0.f;}
    5055
    5156  // Operators
     
    5560  // Fit
    5661  //! Fit du profile par ``gfit''.
    57   inline int    Fit(GeneralFit& gfit)
     62  inline int Fit(GeneralFit& gfit)
    5863         {if(!Ok) UpdateHisto(); return Histo::Fit(gfit,0);}
    5964  //! Retourne l'Histogramme des residus par ``gfit''.
    60   inline Histo  FitResidus(GeneralFit& gfit)
     65  inline Histo FitResidus(GeneralFit& gfit)
    6166         {if(!Ok) UpdateHisto(); return Histo::FitResidus(gfit);}
    6267  //! Retourne l'Histogramme de la fonction fittee par ``gfit''.
    63   inline Histo  FitFunction(GeneralFit& gfit)
     68  inline Histo FitFunction(GeneralFit& gfit)
    6469         {if(!Ok) UpdateHisto(); return Histo::FitFunction(gfit);}
    6570
    6671  // Print
    6772  //! Print, voir detail dans Histo::Print
    68   inline void Print(int dyn=100,float hmin=1.,float hmax=-1.,int pflag=0,int il=1,int ih=-1)
    69               {if(!Ok) UpdateHisto(); Histo::Print(dyn,hmin,hmax,pflag,il,ih);}
     73  inline void Print(int dyn=100,float hmin=1.,float hmax=-1.
     74                   ,int pflag=0,int il=1,int ih=-1)
     75         {if(!Ok) UpdateHisto(); Histo::Print(dyn,hmin,hmax,pflag,il,ih);}
     76  //! PrintF, voir detail dans Histo::PrintF
     77  inline void PrintF(FILE * fp,int dyn=100,float hmin=1.,float hmax=-1.
     78                    ,int pflag=0,int il=1,int ih=-1)
     79         {if(!Ok) UpdateHisto(); Histo::PrintF(fp,dyn,hmin,hmax,pflag,il,ih);}
    7080
    7181protected:
     
    7585  double*        SumY2; //!< somme des carres
    7686  double*        SumW;  //!< somme des poids
    77   bool           Ok;    //!< true isiupdate fait
     87  bool           Ok;    //!< true if update fait
    7888  float          YMin;  //!< limite minimum Y pour somme
    7989  float          YMax;  //!< limite maximum Y pour somme
  • trunk/SophyaLib/HiStats/histos.cc

    r1053 r1056  
    11//
    2 // $Id: histos.cc,v 1.6 2000-06-30 13:21:52 ansari Exp $
     2// $Id: histos.cc,v 1.7 2000-07-07 08:41:11 ansari Exp $
    33//
    44
     
    4545/*! Constructeur par copie */
    4646Histo::Histo(const Histo& H)
    47 : data(new float[H.bins]), err2(NULL),
     47: data((H.bins>0)? new float[H.bins] : NULL),
     48  err2(NULL),
    4849  under(H.under), over(H.over), nHist(H.nHist), nEntries(H.nEntries),
    4950  bins(H.bins), min(H.min), max(H.max),
    5051  binWidth(H.binWidth)
    5152{
    52   memcpy(data, H.data, bins*sizeof(float));
    53   if( H.err2 != NULL ) {
    54     err2 = new double[bins];
    55     memcpy(err2, H.err2, bins*sizeof(double));
     53  if(bins>0) {
     54    memcpy(data, H.data, bins*sizeof(float));
     55    if( H.err2 != NULL ) {
     56      err2 = new double[bins];
     57      memcpy(err2, H.err2, bins*sizeof(double));
     58    }
    5659  }
    5760  END_CONSTRUCTOR
     
    8285void Histo::Zero()
    8386{
     87  if(bins<=0) return;
    8488  memset(data, 0, bins*sizeof(float));
    8589  under = over = 0;
     
    9599void Histo::Errors()
    96100{
    97  if( bins > 0 ) {
    98    if(err2==NULL) err2 = new double[bins];
    99    memset(err2, 0, bins*sizeof(double));
    100  }
    101 }
    102 
    103 /********* Methode *********/
    104 /*!
    105   Operateur egal
     101 if(bins<=0) return;
     102 if(err2==NULL) err2 = new double[bins];
     103 memset(err2, 0, bins*sizeof(double));
     104}
     105
     106/********* Methode *********/
     107/*!
     108  Operateur egal Histo = Histo
    106109*/
    107110Histo& Histo::operator = (const Histo& h)
    108111{
    109112  if(this == &h) return *this;
     113  if( h.bins <= 0 ) {Delete(); return *this;}
    110114  if( h.bins > bins ) Delete();
     115  if(!h.err2 && err2 ) { delete [] err2; err2=NULL;}
    111116  if(!data) data = new float[h.bins];
    112   if( !h.err2 && err2 ) { delete [] err2; err2=NULL;}
    113   if( h.err2 && !err2 ) err2 = new double[h.bins];
     117  if(h.err2 && !err2 ) err2 = new double[h.bins];
    114118
    115119  under = h.under;
     
    817821  if( nbinew <= 0 ) return;
    818822
    819   // memoraisation de l'histogramme original
     823  // memorisation de l'histogramme original
    820824  Histo H(*this);
    821825
     
    13241328              int il, int ih)
    13251329{
    1326 
    13271330 
    13281331 if( il > ih ) { il = 0; ih = bins-1; }
     
    13421345      << "  min=" << min << "  max=" << max
    13431346      << "  binWidth=" << binWidth << endl;
    1344  cout << "       mean=" << Mean() << " r.m.s=" << Sigma() << endl;
     1347 cout << "       mean=" << Mean() << " r.m.s=" << Sigma()
     1348      << "  Errors="<<HasErrors()<< endl;
    13451349
    13461350 if(hdyn<0 || pflag<0 ) return;
  • trunk/SophyaLib/HiStats/histos.h

    r1053 r1056  
    11// This may look like C code, but it is really -*- C++ -*-
    22//
    3 // $Id: histos.h,v 1.7 2000-06-30 13:21:53 ansari Exp $
     3// $Id: histos.h,v 1.8 2000-07-07 08:41:11 ansari Exp $
    44//
    55
     
    2828  Histo(float xMin, float xMax, int nBin=100);
    2929  Histo(const Histo& H);
    30   virtual        ~Histo();
     30  virtual ~Histo();
    3131
    3232  // OPTIONS
    33   void   Errors();
     33  void Errors();
    3434
    3535  // UPDATING or SETTING
    36   void   Zero();
    37   void   Add(float x, float w = 1.);
    38   void   AddBin(int numBin, float w = 1.);
    39   void   SetBin(float x, float w = 1.);
    40   void   SetBin(int numBin, float w = 1.);
    41   void   SetErr2(float x, double e2);
    42   void   SetErr2(int numBin, double e2);
    43   void   SetErr(float x, float e);
     36  void Zero();
     37  void Add(float x, float w = 1.);
     38  void AddBin(int numBin, float w = 1.);
     39  void SetBin(float x, float w = 1.);
     40  void SetBin(int numBin, float w = 1.);
     41  void SetErr2(float x, double e2);
     42  void SetErr2(int numBin, double e2);
     43  void SetErr(float x, float e);
    4444  void   SetErr(int numBin, float e);
    4545
     
    6868  // INLINES
    6969  //! Retourne l'abscisse minimum
    70   inline float          XMin() const            {return min;}
     70  inline float XMin() const {return min;}
    7171  //! Retourne l'abscisse maximum
    72   inline float          XMax() const            {return max;}
     72  inline float XMax() const {return max;}
    7373  //! Retourne le nombre de bins
    74   inline int_4          NBins() const            {return bins;}
     74  inline int_4 NBins() const {return bins;}
    7575  //! Retourne la largeur du bin
    76   inline float          BinWidth() const        {return binWidth;}
     76  inline float BinWidth() const {return binWidth;}
    7777  //! Retourne le pointeur sur le tableaux des contenus
    78   inline float*         Bins() const            {return data;}
     78  inline float* Bins() const {return data;}
    7979  //! Retourne le contenu du bin i
    80   inline float          operator()(int i) const  {return data[i];}
     80  inline float operator()(int i) const  {return data[i];}
    8181  //! Remplit le contenu du bin i
    82   inline float&         operator()(int i)        {return data[i];}
     82  inline float& operator()(int i) {return data[i];}
    8383  //! retourne "true" si il y a des erreurs stoquees
    84   inline bool           HasErrors() { if(err2) return true; else return false;}
     84  inline bool HasErrors()
     85         {if(err2) return true; else return false;}
    8586  //! Retourne l'erreur du bin i
    86   inline float          Error(int i) const
    87                           {if(err2) {if(err2[i]>0.) return sqrt(err2[i]); else return 0.;}
    88                            else return 0.;}
     87  inline float Error(int i) const
     88         {if(err2) {if(err2[i]>0.) return sqrt(err2[i]); else return 0.;}
     89                    else return 0.;}
    8990  //! Retourne l'erreur au carre du bin i
    90   inline double         Error2(int i) const
    91                           {if(err2) return err2[i]; else return 0.;}
     91  inline double Error2(int i) const
     92         {if(err2) return err2[i]; else return 0.;}
    9293  //! Remplit l'erreur au carre du bin i
    93   inline double&        Error2(int i) {return err2[i];}
     94  inline double& Error2(int i) {return err2[i];}
    9495  //! Retourne la somme ponderee
    95   inline float          NData() const            {return (float) nHist;}
     96  inline float NData() const            {return (float) nHist;}
    9697  //! Retourne le nombre d'entrees
    97   inline float          NEntries() const         {return nEntries;}
     98  inline float NEntries() const         {return nEntries;}
    9899  //! Retourne le nombre d'overflow
    99   inline float          NOver() const            {return over;}
     100  inline float NOver() const            {return over;}
    100101  //! Retourne le nombre d'underflow
    101   inline float          NUnder() const           {return under;}
     102  inline float NUnder() const           {return under;}
    102103
    103104  //! Retourne l'abscisse du bord inferieur du bin i
    104   inline float          BinLowEdge(int i)  const {return min + i*binWidth;}
     105  inline float BinLowEdge(int i)  const {return min + i*binWidth;}
    105106  //! Retourne l'abscisse du centre du bin i
    106   inline float          BinCenter(int i)   const {return min + (i+0.5)*binWidth;}
     107  inline float BinCenter(int i)   const {return min + (i+0.5)*binWidth;}
    107108  //! Retourne l'abscisse du bord superieur du bin i
    108   inline float          BinHighEdge(int i) const {return min + (i+1)*binWidth;}
     109  inline float BinHighEdge(int i) const {return min + (i+1)*binWidth;}
    109110  //! Retourne le numero du bin contenant l'abscisse x
    110   inline int_4          FindBin(float x) const   
    111                             {return (int_4) floorf((x - min) / binWidth);}
     111  inline int_4 FindBin(float x) const   
     112         {return (int_4) floorf((x - min) / binWidth);}
    112113
    113114  // Info, statistique et calculs sur les histogrammes
    114   int            BinNonNul() const;
    115   int            ErrNonNul() const;
    116   int            IMax() const;
    117   int            IMin() const;
    118   float          VMax() const;
    119   float          VMin() const;
    120   float          Mean() const;
    121   float          Sigma() const;
    122   float          MeanLH(int il,int ih) const;
    123   float          SigmaLH(int il,int ih) const;
    124   float          Mean(float x0, float dx) const;
    125   float          Sigma(float x0, float dx) const;
    126   float          CleanedMean() const;
    127   float          CleanedMean(float& sigma) const;
    128   int            BinPercent(float per) const;
    129   int            BinPercent(float x,float per,int& imin,int& imax);
    130   int            BinPercent(float x,float per,float& xmin,float& xmax);
    131   void           HInteg(float norm = 0.);
    132   void           HDeriv();
    133   void           HRebin(int nbinew);
    134 
    135   int            MaxiLocal(float& maxi,int& imax,float& maxn,int& imaxn);
    136   float          FitMax(int degree=2, float frac=0.5f, int debug=0) const;
    137   float          FindWidth(float xmax,float frac=0.5f, int debug=0) const;
    138   float          FindWidth(float frac=0.5f, int debug=0) const;
    139   int            EstimeMax(float& xm,int SzPav = 3);
    140   int            EstimeMax(int& im,float& xm,int SzPav = 3);
    141   void           EstimeWidthS(float frac,float& widthG,float& widthD);
     115  int       BinNonNul() const;
     116  int       ErrNonNul() const;
     117  int       IMax() const;
     118  int       IMin() const;
     119  float     VMax() const;
     120  float     VMin() const;
     121  float     Mean() const;
     122  float     Sigma() const;
     123  float     MeanLH(int il,int ih) const;
     124  float     SigmaLH(int il,int ih) const;
     125  float     Mean(float x0, float dx) const;
     126  float     Sigma(float x0, float dx) const;
     127  float     CleanedMean() const;
     128  float     CleanedMean(float& sigma) const;
     129  int       BinPercent(float per) const;
     130  int       BinPercent(float x,float per,int& imin,int& imax);
     131  int       BinPercent(float x,float per,float& xmin,float& xmax);
     132  void      HInteg(float norm = 0.);
     133  void      HDeriv();
     134  void      HRebin(int nbinew);
     135
     136  int       MaxiLocal(float& maxi,int& imax,float& maxn,int& imaxn);
     137  float     FitMax(int degree=2, float frac=0.5f, int debug=0) const;
     138  float     FindWidth(float xmax,float frac=0.5f, int debug=0) const;
     139  float     FindWidth(float frac=0.5f, int debug=0) const;
     140  int       EstimeMax(float& xm,int SzPav = 3);
     141  int       EstimeMax(int& im,float& xm,int SzPav = 3);
     142  void      EstimeWidthS(float frac,float& widthG,float& widthD);
    142143
    143144  // Fit
     
    147148
    148149  // Print et Display ASCII
    149   void           PrintF(FILE * fp, int dyn = 100, float hmin = 1., float hmax = -1.,
    150                         int pflag = 0, int il = 1, int ih = -1);
    151   void           Print(int dyn = 100, float hmin = 1., float hmax = -1.,
    152                         int pflag = 0, int il = 1, int ih = -1);
     150  void PrintF(FILE * fp, int dyn = 100, float hmin = 1., float hmax = -1.,
     151                      int pflag = 0, int il = 1, int ih = -1);
     152  void Print(int dyn = 100, float hmin = 1., float hmax = -1.,
     153                     int pflag = 0, int il = 1, int ih = -1);
    153154
    154155protected:
    155156  void Delete();
    156157
    157   float*         data;     //!< donnees
    158   double*        err2;     //!< erreurs carrees
    159   float          under;    //!< underflow
    160   float          over;     //!< overflow
    161   double         nHist;    //!< somme ponderee des entrees
    162   int_4          nEntries; //!< nombre d'entrees
    163   int_4          bins;     //!< nombre de bins
    164   float          min;      //!< abscisse minimum
    165   float          max;      //!< abscisse maximum
    166   float          binWidth; //!< largeur du bin
     158  float*    data;     //!< donnees
     159  double*   err2;          //!< erreurs carrees
     160  float     under;    //!< underflow
     161  float     over;     //!< overflow
     162  double    nHist;    //!< somme ponderee des entrees
     163  int_4     nEntries; //!< nombre d'entrees
     164  int_4     bins;     //!< nombre de bins
     165  float     min;      //!< abscisse minimum
     166  float     max;      //!< abscisse maximum
     167  float     binWidth; //!< largeur du bin
    167168};
    168169
  • trunk/SophyaLib/HiStats/histos2.cc

    r1053 r1056  
    10021002void Histo2D::PrintStatus()
    10031003{
    1004 printf("~Histo::Print    nHist=%g nEntries=%d\n",nHist,nEntries);
     1004printf("~Histo::Print    nHist=%g nEntries=%d",nHist,nEntries);
     1005if(HasErrors()) printf("  Errors=1\n"); else printf("  Errors=0\n");
    10051006printf("over: [ %g %g %g // %g %g %g  // %g %g %g ]\n"
    10061007      ,over[2][0],over[2][1],over[2][2]
Note: See TracChangeset for help on using the changeset viewer.