Changeset 3057 in Sophya for trunk/SophyaLib/HiStats


Ignore:
Timestamp:
Aug 13, 2006, 12:41:09 AM (19 years ago)
Author:
cmv
Message:
  • changement nom variables internes Histo...Histo2D
  • re-arrangement CreateOrResize et operator=
  • protection dans methodes (VMIN etc..) pour Histo 1d+2d vides

cmv 13/8/2006

Location:
trunk/SophyaLib/HiStats
Files:
7 edited

Legend:

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

    r3053 r3057  
    1919HProf::HProf()
    2020: Histo(), mSumY(NULL), mSumY2(NULL), mSumW(NULL)
    21 , Ok(false), YMin(1.), YMax(-1.), Opt(0)
     21, mOk(false), mYMin(1.), mYMax(-1.), mOpt(0)
    2222{
    2323}
     
    5656, mSumY2((H.mBins>0) ? new r_8[H.mBins] : NULL)
    5757, mSumW((H.mBins>0)  ? new r_8[H.mBins] : NULL)
    58 , Ok(H.Ok), YMin(H.YMin), YMax(H.YMax), Opt(H.Opt)
     58, mOk(H.mOk), mYMin(H.mYMin), mYMax(H.mYMax), mOpt(H.mOpt)
    5959{
    6060  if(mBins>0) {
     
    7373{
    7474  //cout<<"HProf::CreateOrResize()"<<endl;
     75  bool samelen = (nBin==mBins)? true: false;
    7576  Histo::CreateOrResize(xMin,xMax,nBin);
    7677  Histo::Errors();
    77   if(mSumY !=NULL) {delete[] mSumY;  mSumY = NULL;}
    78   if(mSumY2!=NULL) {delete[] mSumY2; mSumY2= NULL;}
    79   if(mSumW !=NULL) {delete[] mSumW;  mSumW = NULL;}
    80   if(nBin>0) {
    81     mSumY  = new r_8[nBin]; memset(mSumY, 0, nBin*sizeof(r_8));
    82     mSumY2 = new r_8[nBin]; memset(mSumY2,0, nBin*sizeof(r_8));
    83     mSumW  = new r_8[nBin]; memset(mSumW, 0, nBin*sizeof(r_8));
    84   }
    85   YMin = yMin; YMax = yMax;
    86   Ok = false;
    87   Opt = 0;
     78  if(mSumW!=NULL && !samelen) { //si un est alloue alors les autres aussi
     79    delete[] mSumY;  mSumY = NULL;
     80    delete[] mSumY2; mSumY2= NULL;
     81    delete[] mSumW;  mSumW = NULL;
     82  }
     83  if(nBin>0 && mSumW==NULL) {
     84    mSumY  = new r_8[nBin];
     85    mSumY2 = new r_8[nBin];
     86    mSumW  = new r_8[nBin];
     87  }
     88  if(mSumW) {
     89    memset(mSumY, 0, nBin*sizeof(r_8));
     90    memset(mSumY2,0, nBin*sizeof(r_8));
     91    memset(mSumW, 0, nBin*sizeof(r_8));
     92  }
     93  mYMin = yMin; mYMax = yMax;
     94  mOk = false;
     95  mOpt = 0;
    8896}
    8997
     
    99107  if(mSumY2!= NULL) {delete[] mSumY2; mSumY2 = NULL;}
    100108  if(mSumW != NULL) {delete[] mSumW;  mSumW = NULL;}
    101   Ok = false;
     109  mOk = false;
    102110}
    103111
     
    117125void HProf::UpdateHisto(bool force) const
    118126{
    119 if(!Ok || force) updatehisto();
     127if(!mOk || force) updatehisto();
    120128}
    121129
     
    130138  memset(mSumY2, 0, mBins*sizeof(r_8));
    131139  memset(mSumW,  0, mBins*sizeof(r_8));
    132   Ok = false;
     140  mOk = false;
    133141}
    134142
     
    153161{
    154162uint_2 opt = (spread) ? 0 : 1;
    155 if(opt!=Opt) {Opt=opt; Ok=false;}
     163if(opt!=mOpt) {mOpt=opt; mOk=false;}
    156164}
    157165
     
    177185    m  = mSumY[i]/mSumW[i];
    178186    e2 = mSumY2[i]/mSumW[i] - m*m;
    179     if(Opt) e2 /= mSumW[i];
     187    if(mOpt) e2 /= mSumW[i];
    180188  }
    181189  mData[i] = m;
    182190  mErr2[i] = e2;
    183191}
    184 Ok = true;
     192mOk = true;
    185193// Attention, a cause de "WriteSelf const" updatehisto doit etre "const".
    186 // Comme on veut modifier Ok, on est oblige de faire cette entourloupe:
     194// Comme on veut modifier mOk, on est oblige de faire cette entourloupe:
    187195HProf *buff = (HProf *) this;
    188 buff->Ok = true;
     196buff->mOk = true;
    189197}
    190198
     
    195203void HProf::Add(r_8 x, r_8 y, r_8 w)
    196204{
    197   if(YMax>YMin && (y<YMin || YMax<y)) return;
     205  if(mYMax>mYMin && (y<mYMin || mYMax<y)) return;
    198206  int_4 numBin = FindBin(x);
    199207  if (numBin<0) mUnder += w;
    200208  else if (numBin>=mBins) mOver += w;
    201209  else {
    202     Ok = false;
     210    mOk = false;
    203211    mSumY[numBin]  += y*w;
    204212    mSumY2[numBin] += y*y*w;
     
    215223void HProf::AddBin(int_4 numBin, r_8 y, r_8 w)
    216224{
    217   if(YMax>YMin && (y<YMin || YMax<y)) return;
     225  if(mYMax>mYMin && (y<mYMin || mYMax<y)) return;
    218226  if (numBin<0) mUnder += w;
    219227  else if (numBin>=mBins) mOver += w;
    220228  else {
    221     Ok = false;
     229    mOk = false;
    222230    mSumY[numBin]  += y*w;
    223231    mSumY2[numBin] += y*y*w;
     
    234242HProf& HProf::operator = (const HProf& h)
    235243{
    236 if(this == &h) return *this;
    237 if( h.mBins > mBins ) Delete();
    238 Histo *hthis = (Histo *) this;
    239 *hthis = (Histo) h;
    240 if(!mSumY)  mSumY  = new r_8[mBins];
    241 if(!mSumY2) mSumY2 = new r_8[mBins];
    242 if(!mSumW)  mSumW  = new r_8[mBins];
    243 memcpy(mSumY,  h.mSumY,  mBins*sizeof(r_8));
    244 memcpy(mSumY2, h.mSumY2, mBins*sizeof(r_8));
    245 memcpy(mSumW,  h.mSumW,  mBins*sizeof(r_8));
    246 Ok = h.Ok;
    247 YMin = h.YMin;
    248 YMax = h.YMax;
    249 Opt = h.Opt;
    250 
    251 return *this;
     244 if(this == &h) return *this;
     245 CreateOrResize(h.mMin,h.mMax,h.mBins,h.mYMin,h.mYMax);
     246 if(mData) memcpy(mData,h.mData,mBins*sizeof(r_8));
     247 if(mErr2) memcpy(mErr2,h.mErr2,mBins*sizeof(r_8));
     248 mUnder = h.mUnder; mOver = h.mOver;
     249 nHist = h.nHist; nEntries = h.nEntries;
     250 if(mSumY)  memcpy(mSumY,  h.mSumY,  mBins*sizeof(r_8));
     251 if(mSumY2) memcpy(mSumY2, h.mSumY2, mBins*sizeof(r_8));
     252 if(mSumW)  memcpy(mSumW,  h.mSumW,  mBins*sizeof(r_8));
     253 mOk = h.mOk;
     254 mOpt = h.mOpt;
     255
     256 return *this;
    252257}
    253258
     
    331336  UpdateHisto();
    332337  Histo::Show(os);
    333   os <<"       ymin="<<YMin<<" ymax="<<YMax<<"  opt="<<Opt<< endl;
     338  os <<"       ymin="<<mYMin<<" ymax="<<mYMax<<"  opt="<<mOpt<< endl;
    334339}
    335340
     
    354359// Lecture des valeurs
    355360is.Get(dobj->mBins);
    356 is.Get(dobj->YMin);
    357 is.Get(dobj->YMax);
    358 is.Get(dobj->Opt);
    359 dobj->Ok = true;
     361is.Get(dobj->mYMin);
     362is.Get(dobj->mYMax);
     363is.Get(dobj->mOpt);
     364dobj->mOk = true;
    360365
    361366// Lecture des donnees propres a l'histogramme de profil.
    362367is.GetLine(strg,255);
    363 dobj->mSumY  = new r_8[dobj->mBins];
    364 dobj->mSumY2 = new r_8[dobj->mBins];
    365 dobj->mSumW  = new r_8[dobj->mBins];
     368if(dobj->mBins>0) {
     369  dobj->mSumY  = new r_8[dobj->mBins];
     370  dobj->mSumY2 = new r_8[dobj->mBins];
     371  dobj->mSumW  = new r_8[dobj->mBins];
     372}
    366373is.Get(dobj->mSumY,  dobj->mBins);
    367374is.Get(dobj->mSumY2, dobj->mBins);
     
    383390
    384391// Ecriture entete pour identifier facilement
    385 sprintf(strg,"HProf: YMin=%f  YMax=%f  Opt=%1d",dobj->YMin,dobj->YMax,dobj->Opt);
     392sprintf(strg,"HProf: YMin=%f  YMax=%f  Opt=%1d",dobj->mYMin,dobj->mYMax,dobj->mOpt);
    386393os.PutLine(strg);
    387394
    388395// Ecriture des valeurs
    389396os.Put(dobj->mBins);
    390 os.Put(dobj->YMin);
    391 os.Put(dobj->YMax);
    392 os.Put(dobj->Opt);
     397os.Put(dobj->mYMin);
     398os.Put(dobj->mYMax);
     399os.Put(dobj->mOpt);
    393400
    394401// Ecriture des donnees propres a l'histogramme de profil.
  • trunk/SophyaLib/HiStats/hisprof.h

    r3053 r3057  
    8181  r_8*         mSumY2; //!< somme des carres
    8282  r_8*         mSumW;  //!< somme des poids
    83   mutable bool Ok;    //!< true if update fait
    84   r_8          YMin;  //!< limite minimum Y pour somme
    85   r_8          YMax;  //!< limite maximum Y pour somme
    86   uint_2       Opt;   //!< options pour les erreurs
     83  mutable bool mOk;    //!< true if update fait
     84  r_8          mYMin;  //!< limite minimum Y pour somme
     85  r_8          mYMax;  //!< limite maximum Y pour somme
     86  uint_2       mOpt;   //!< options pour les erreurs
    8787};
    8888
  • trunk/SophyaLib/HiStats/histerr.cc

    r3053 r3057  
    4949{
    5050  //cout<<"HistoErr::CreateOrResize()"<<endl;
     51  bool samelen = (nBin==mBins)? true: false;
    5152  Histo::CreateOrResize(xMin,xMax,nBin);
    5253  Histo::Errors();
    53   allocate_mNData(nBin);
     54  if(mNData!=NULL && !samelen) {delete [] mNData; mNData=NULL;}
     55  if(nBin>0 && mNData==NULL) mNData = new r_8[nBin];
     56  if(mNData) memset(mNData,0,nBin*sizeof(r_8));
    5457  mCorrel = 0;
    55 }
    56 
    57 /********* Methode *********/
    58 /*! Allocation du tableau mNData */
    59 void HistoErr::allocate_mNData(int nbin)
    60 {
    61   if(mNData) {delete [] mNData; mNData=NULL;}
    62   if(nbin<=0) return;
    63   mNData = new r_8[nbin];
    64   memset(mNData,0,nbin*sizeof(r_8));
    6558}
    6659
     
    199192{
    200193  if(this==&h) return *this;
    201   Delete();
    202   if(h.mBins<=0) return *this;
    203 
    204   // Copy the "Histo" part
    205   (Histo)(*this) = Histo::operator=(h);
    206   // Copy the "entries by bin" table
    207   allocate_mNData(h.mBins);
    208   memcpy(mNData,h.mNData,mBins*sizeof(r_8));
     194  CreateOrResize(h.mMin,h.mMax,h.mBins);
     195  if(mData) memcpy(mData,h.mData,mBins*sizeof(r_8));
     196  if(mErr2) memcpy(mErr2,h.mErr2,mBins*sizeof(r_8));
     197  mUnder = h.mUnder; mOver = h.mOver;
     198  nHist = h.nHist; nEntries = h.nEntries;
     199  if(mNData) memcpy(mNData,h.mNData,mBins*sizeof(r_8));
    209200  mCorrel = h.mCorrel;
    210201
     
    244235// Lecture des donnees HistoErr
    245236is.Get(dobj->mBins);
    246   dobj->allocate_mNData(dobj->mBins);
     237if(dobj->mBins>0) dobj->mNData = new r_8[dobj->mBins];
    247238is.Get(dobj->mNData, dobj->mBins);
    248239
  • trunk/SophyaLib/HiStats/histerr.h

    r3053 r3057  
    8383
    8484protected:
    85   void allocate_mNData(int nbin);
    8685  void CreateOrResize(r_8 xMin, r_8 xMax, int_4 nBin);
    8786  void Delete(void);
  • trunk/SophyaLib/HiStats/histos.cc

    r3053 r3057  
    11//
    2 // $Id: histos.cc,v 1.23 2006-08-12 17:29:29 cmv Exp $
     2// $Id: histos.cc,v 1.24 2006-08-12 22:41:08 cmv Exp $
    33//
    44
     
    7070{
    7171  //cout<<"Histo::CreateOrResize()"<<endl;
    72   if(mData != NULL) {delete[] mData; mData = NULL;}
    73   if(mErr2 != NULL) {delete[] mErr2; mErr2 = NULL;}
    74   if(nBin>0) {mData = new r_8[nBin]; memset(mData,0,nBin*sizeof(r_8));}
     72  bool samelen = (nBin==mBins)? true: false;
     73  if(mData!=NULL && !samelen) {delete[] mData; mData = NULL;}
     74  if(mErr2!=NULL) {delete[] mErr2; mErr2 = NULL;} // On des-alloue toujours
     75  if(nBin>0 && mData==NULL) mData = new r_8[nBin];
     76  if(mData) memset(mData,0,nBin*sizeof(r_8));
    7577  mBins = nBin;
    7678  mMin = xMin; mMax = xMax;
     
    142144{
    143145  if(this == &h) return *this;
    144   Delete();
    145   if(h.mBins<=0 || h.mData==NULL) return *this;
    146 
    147   mData = new r_8[h.mBins];
    148   if(h.mErr2) mErr2 = new r_8[h.mBins];
     146  CreateOrResize(h.mMin,h.mMax,h.mBins);
     147  if(h.mErr2) Errors();
     148  if(mData) memcpy(mData,h.mData,mBins*sizeof(r_8));
     149  if(mErr2) memcpy(mErr2,h.mErr2,mBins*sizeof(r_8));
    149150  mUnder = h.mUnder; mOver = h.mOver;
    150   nHist = h.nHist;
    151   nEntries = h.nEntries;
    152   mBins = h.mBins;
    153   mMin = h.mMin; mMax = h.mMax;
    154   binWidth = h.binWidth;
    155  
    156   memcpy(mData,h.mData,mBins*sizeof(r_8));
    157   if(mErr2) memcpy(mErr2,h.mErr2,mBins*sizeof(r_8));
    158 
     151  nHist = h.nHist; nEntries = h.nEntries;
    159152  return *this;
    160153}
     
    532525int_4 Histo::IMax() const
    533526{
     527  if(mBins<=0)  return 0;
    534528  int_4 imx=0;
    535529  if(mBins==1) return imx;
     
    546540int_4 Histo::IMin() const
    547541{
     542  if(mBins<=0)  return 0;
    548543  int_4 imx=0;
    549544  if(mBins==1) return imx;
     
    560555r_8 Histo::VMax() const
    561556{
     557  if(mBins<=0)  return 0.;
    562558  r_8 mx=mData[0];
    563559  if(mBins==1) return mx;
     
    572568r_8 Histo::VMin() const
    573569{
     570  if(mBins<=0)  return 0.;
    574571  r_8 mx=mData[0];
    575572  if(mBins==1) return mx;
     
    584581r_8 Histo::Mean() const
    585582{
     583  if(mBins<=0)  return 0.;
    586584  r_8 n = 0;
    587585  r_8 sx = 0;
     
    600598r_8 Histo::Sigma() const
    601599{
     600  if(mBins<=0)  return 0.;
    602601  r_8 n = 0;
    603602  r_8 sx = 0;
     
    622621r_8 Histo::MeanLH(int_4 il,int_4 ih) const
    623622{
     623  if(mBins<=0)  return 0.;
    624624  if( ih < il ) { il = 0; ih = mBins-1; }
    625625  if( il < 0 ) il = 0;
     
    641641r_8 Histo::SigmaLH(int_4 il,int_4 ih) const
    642642{
     643  if(mBins<=0)  return 0.;
    643644  if( ih < il ) { il = 0; ih = mBins - 1; }
    644645  if( il < 0 ) il = 0;
     
    665666r_8 Histo::Mean(r_8 x0, r_8 dx) const
    666667{
     668  if(mBins<=0)  return 0.;
    667669  r_8 sdata = 0;
    668670  r_8 sx = 0;
     
    685687r_8 Histo::Sigma(r_8 x0, r_8 dx) const
    686688{
     689  if(mBins<=0)  return 0.;
    687690  r_8 sx = 0;
    688691  r_8 sx2= 0;
     
    708711r_8 Histo::CleanedMean(r_8& sigma) const
    709712{
     713  if(mBins<=0)  return 0.;
    710714  if (!nHist) return 0;
    711715  // on fait ca de facon bete, on pourra raffiner apres...
     
    728732r_8 Histo::CleanedMean() const
    729733{
     734  if(mBins<=0)  return 0.;
    730735  if (!nHist) return 0;
    731736  r_8 s=0;
     
    739744int_4 Histo::BinNonNul() const
    740745{
     746if(mBins<=0)  return -1;
    741747int_4 non=0;
    742748for (int_4 i=0;i<mBins;i++) if( mData[i] != 0. ) non++;
     
    763769int_4 Histo::BinPercent(r_8 per) const
    764770{
     771if(mBins<=0)  return -1;
    765772r_8 n = nHist*per;
    766773r_8 s = 0.;
     
    789796int_4 Histo::BinPercent(r_8 x,r_8 per,int_4& imin,int_4& imax) const
    790797{
     798if(mBins<=0)  return -3;
    791799imin = imax = -1;
    792800if( per <= 0. ) return -1;
     
    926934int_4 Histo::MaxiLocal(r_8& maxi,int_4& imax,r_8& maxn,int_4& imaxn) const
    927935{
     936if(mBins<=0)  return -1;
    928937int_4 nml = 0;
    929938imax = imaxn = -1;
     
    964973r_8 Histo::FitMax(int_4 degree, r_8 frac, int_4 debug) const
    965974{
     975  if(mBins<=0)  return mMin;
    966976  if (degree < 2 || degree > 3) degree = 3;
    967977  if (frac <= 0. || frac >= 1.) frac = 0.5;
     
    10991109r_8 Histo::FindWidth(r_8 frac, int_4 debug) const
    11001110{
     1111  if(mBins<=0)  return 0;
    11011112  r_8 xmax = BinCenter( IMax() );
    11021113  return FindWidth(xmax,frac,debug);
     
    11101121r_8 Histo::FindWidth(r_8 xmax,r_8 frac, int_4 debug) const
    11111122{
     1123  if(mBins<=0)  return 0;
    11121124  if (frac <= 0 || frac >= 1.) frac = 0.5;
    11131125
     
    12051217int_4 Histo::EstimeMax(int_4& im,r_8& xm,int_4 SzPav) const
    12061218{
     1219if(mBins<=0)  return -1;
    12071220xm = 0;
    12081221if( SzPav <= 0 ) return -1;
     
    12371250void Histo::EstimeWidthS(r_8 frac,r_8& widthG,r_8& widthD) const
    12381251{
     1252if(mBins<=0) {frac=0.; return;}
    12391253int_4 i;
    12401254widthG = widthD = -1.;
     
    13081322{
    13091323 
     1324 if(mBins<=0) return;
    13101325 if( il > ih ) { il = 0; ih = mBins-1; }
    13111326 if( il < 0 ) il = 0;
     
    14901505
    14911506// Lecture des donnees Histo 1D
    1492 dobj->mData = new r_8[dobj->mBins];
    14931507is.GetLine(strg, 255);
     1508if(dobj->mBins>0) dobj->mData = new r_8[dobj->mBins];
    14941509is.Get(dobj->mData, dobj->mBins);
    14951510
     
    14971512if(errok) {
    14981513  is.GetLine(strg, 255);
    1499   dobj->mErr2 = new r_8[dobj->mBins];
     1514  if(dobj->mBins>0) dobj->mErr2 = new r_8[dobj->mBins];
    15001515  is.Get(dobj->mErr2, dobj->mBins);
    15011516}
  • trunk/SophyaLib/HiStats/histos.h

    r3053 r3057  
    11// This may look like C code, but it is really -*- C++ -*-
    22//
    3 // $Id: histos.h,v 1.23 2006-08-12 17:29:29 cmv Exp $
     3// $Id: histos.h,v 1.24 2006-08-12 22:41:08 cmv Exp $
    44//
    55
  • trunk/SophyaLib/HiStats/histos2.cc

    r3053 r3057  
    153153void Histo2D::CreateOrResize(r_8 xMin,r_8 xMax,int_4 nxBin,r_8 yMin,r_8 yMax,int_4 nyBin)
    154154{
    155  int_8 n = nxBin*nyBin;
    156  if(mData!=NULL) {delete[] mData; mData = NULL;}
    157  if(n>0) {mData = new r_8[n]; memset(mData, 0, n*sizeof(r_8));}
    158  mNx = nxBin; mNy = nyBin; mNxy = nxBin*nyBin;
    159  mXmin = xMin; mXmax = xMax; mYmin = yMin; mYmax = yMax;
    160  mWBinx = (nxBin>0) ? (xMax - xMin)/nxBin: 0.;
    161  mWBiny = (nyBin>0) ? (yMax - yMin)/nyBin: 0.;
    162  nHist = 0; nEntries = 0;
    163  for(int_4 i=0;i<3;i++) for(int_4 j=0;j<3;j++) mOver[i][j]=0.;
    164  mB_s.H = NULL;
     155  int_8 n = nxBin*nyBin;
     156  bool samelen = (n==mNx*mNy)? true: false;
     157  if(mData!=NULL && !samelen) {delete[] mData; mData=NULL;}
     158  if(mErr2!=NULL) {delete[] mErr2; mErr2=NULL;} // On des-alloue toujours
     159  if(n>0 && mData==NULL) mData = new r_8[n];
     160  if(mData) memset(mData, 0, n*sizeof(r_8));
     161  mNx = nxBin; mNy = nyBin; mNxy = nxBin*nyBin;
     162  mXmin = xMin; mXmax = xMax; mYmin = yMin; mYmax = yMax;
     163  mWBinx = (nxBin>0) ? (xMax - xMin)/nxBin: 0.;
     164  mWBiny = (nyBin>0) ? (yMax - yMin)/nyBin: 0.;
     165  nHist = 0; nEntries = 0;
     166  for(int_4 i=0;i<3;i++) for(int_4 j=0;j<3;j++) mOver[i][j]=0.;
     167  mB_s.H = NULL;
    165168}
    166169
     
    230233Histo2D& Histo2D::operator = (const Histo2D& h)
    231234{
    232   int_4 i,j,nb;
    233   r_8 min,max;
    234 
    235235  if(this == &h) return *this;
    236   if( h.mNxy > mNxy ) Delete();
    237   if(!mData) mData = new r_8[h.mNxy];
    238   if( !h.mErr2 && mErr2 ) { delete [] mErr2; mErr2=NULL;}
    239   if( h.mErr2 && !mErr2 ) mErr2 = new r_8[h.mNxy];
    240 
    241   for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j] = h.mOver[i][j];
    242   nHist = h.nHist;
    243   nEntries = h.nEntries;
    244   mNx = h.mNx;  mNy = h.mNy;  mNxy = h.mNxy;
    245   mXmin = h.mXmin; mXmax = h.mXmax; mWBinx = h.mWBinx;
    246   mYmin = h.mYmin; mYmax = h.mYmax; mWBiny = h.mWBiny;
    247  
    248   memcpy(mData, h.mData, mNxy*sizeof(r_8));
     236  CreateOrResize(h.mXmin,h.mXmax,h.mNx,h.mYmin,h.mYmax,h.mNy);
     237  if(h.mErr2) Errors();
     238  if(mData) memcpy(mData, h.mData, mNxy*sizeof(r_8));
    249239  if(mErr2) memcpy(mErr2, h.mErr2, mNxy*sizeof(r_8));
     240
     241  for(int i=0;i<3;i++) for(int j=0;j<3;j++) mOver[i][j] = h.mOver[i][j];
     242  nHist = h.nHist;  nEntries = h.nEntries; 
    250243
    251244  DelProjX();
     
    260253  }
    261254
     255  int_4 nb;
    262256  DelSliX();
    263257  nb = h.NSliX();
    264258  if(nb>0) {
    265259    SetSliX(nb);
    266     for(i=0; i<NSliX();i++) *HSliX(i) = *(h.HSliX(i));
     260    for(int i=0; i<NSliX();i++) *HSliX(i) = *(h.HSliX(i));
    267261  }
    268262  DelSliY();
     
    270264  if(nb>0) {
    271265    SetSliY(nb);
    272     for(i=0; i<NSliY();i++) *HSliY(i) = *(h.HSliY(i));
     266    for(int i=0; i<NSliY();i++) *HSliY(i) = *(h.HSliY(i));
    273267  }
    274268
     
    276270  nb = h.NBandX();
    277271  if(nb>0) {
    278     for(i=0; i<nb;i++) {
     272    for(int i=0; i<nb;i++) {
     273      r_8 min,max;
    279274      h.GetBandX(i,min,max);
    280275      SetBandX(min,max);
    281276      *HBandX(i) = *(h.HBandX(i));
    282277    }
    283     for(i=0; i<NBandX();i++) *HBandX(i) = *(h.HBandX(i));
     278    for(int i=0; i<NBandX();i++) *HBandX(i) = *(h.HBandX(i));
    284279  }
    285280  DelBandY();
    286281  nb = h.NBandY();
    287282  if(nb>0) {
    288     for(i=0; i<nb;i++) {
     283    for(int i=0; i<nb;i++) {
     284      r_8 min,max;
    289285      h.GetBandY(i,min,max);
    290286      SetBandY(min,max);
    291287      *HBandY(i) = *(h.HBandY(i));
    292288    }
    293     for(i=0; i<NBandY();i++) *HBandY(i) = *(h.HBandY(i));
     289    for(int i=0; i<NBandY();i++) *HBandY(i) = *(h.HBandY(i));
    294290  }
    295291
     
    695691void Histo2D::IJMax(int_4& imax,int_4& jmax,int_4 il,int_4 ih,int_4 jl,int_4 jh) const
    696692{
     693if(mNxy<=0) {imax = jmax = -1; return;}
    697694if( il > ih ) { il = 0; ih = mNx-1; }
    698695if( jl > jh ) { jl = 0; jh = mNy-1; }
     
    716713void Histo2D::IJMin(int_4& imax,int_4& jmax,int_4 il,int_4 ih,int_4 jl,int_4 jh) const
    717714{
     715if(mNxy<=0) {imax = jmax = -1; return;}
    718716if( il > ih ) { il = 0; ih = mNx-1; }
    719717if( jl > jh ) { jl = 0; jh = mNy-1; }
     
    738736r_8 Histo2D::VMax(int_4 il,int_4 ih,int_4 jl,int_4 jh) const
    739737{
     738if(mNxy<=0) return 0.;
    740739if( il > ih ) { il = 0; ih = mNx-1; }
    741740if( jl > jh ) { jl = 0; jh = mNy-1; }
     
    758757r_8 Histo2D::VMin(int_4 il,int_4 ih,int_4 jl,int_4 jh) const
    759758{
     759if(mNxy<=0) return 0.;
    760760if( il > ih ) { il = 0; ih = mNx-1; }
    761761if( jl > jh ) { jl = 0; jh = mNy-1; }
     
    801801int_4 Histo2D::BinNonNul() const
    802802{
     803if(mNxy<=0) return -1;
    803804int_4 non=0;
    804805for (int_4 i=0;i<mNxy;i++) if( mData[i] != 0. ) non++;
     
    899900                    ,int_4 il,int_4 ih,int_4 jl,int_4 jh) const
    900901{
     902if(mNxy<=0) return -1;
    901903if( il > ih ) { il = 0; ih = mNx-1; }
    902904if( jl > jh ) { jl = 0; jh = mNy-1; }
     
    969971                   ,int_4 il,int_4 ih,int_4 jl,int_4 jh) const
    970972{
     973if(mNxy<=0) return;
    971974int_4 ns = 35;
    972975const char *s =    "+23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Note: See TracChangeset for help on using the changeset viewer.