Index: trunk/SophyaLib/HiStats/histos.cc
===================================================================
--- trunk/SophyaLib/HiStats/histos.cc	(revision 3053)
+++ trunk/SophyaLib/HiStats/histos.cc	(revision 3057)
@@ -1,4 +1,4 @@
 //
-// $Id: histos.cc,v 1.23 2006-08-12 17:29:29 cmv Exp $
+// $Id: histos.cc,v 1.24 2006-08-12 22:41:08 cmv Exp $
 //
 
@@ -70,7 +70,9 @@
 {
   //cout<<"Histo::CreateOrResize()"<<endl;
-  if(mData != NULL) {delete[] mData; mData = NULL;}
-  if(mErr2 != NULL) {delete[] mErr2; mErr2 = NULL;}
-  if(nBin>0) {mData = new r_8[nBin]; memset(mData,0,nBin*sizeof(r_8));}
+  bool samelen = (nBin==mBins)? true: false;
+  if(mData!=NULL && !samelen) {delete[] mData; mData = NULL;}
+  if(mErr2!=NULL) {delete[] mErr2; mErr2 = NULL;} // On des-alloue toujours
+  if(nBin>0 && mData==NULL) mData = new r_8[nBin];
+  if(mData) memset(mData,0,nBin*sizeof(r_8));
   mBins = nBin;
   mMin = xMin; mMax = xMax;
@@ -142,19 +144,10 @@
 {
   if(this == &h) return *this;
-  Delete();
-  if(h.mBins<=0 || h.mData==NULL) return *this;
-
-  mData = new r_8[h.mBins];
-  if(h.mErr2) mErr2 = new r_8[h.mBins];
+  CreateOrResize(h.mMin,h.mMax,h.mBins);
+  if(h.mErr2) Errors();
+  if(mData) memcpy(mData,h.mData,mBins*sizeof(r_8));
+  if(mErr2) memcpy(mErr2,h.mErr2,mBins*sizeof(r_8));
   mUnder = h.mUnder; mOver = h.mOver;
-  nHist = h.nHist;
-  nEntries = h.nEntries;
-  mBins = h.mBins;
-  mMin = h.mMin; mMax = h.mMax;
-  binWidth = h.binWidth;
-  
-  memcpy(mData,h.mData,mBins*sizeof(r_8));
-  if(mErr2) memcpy(mErr2,h.mErr2,mBins*sizeof(r_8));
-
+  nHist = h.nHist; nEntries = h.nEntries;
   return *this;
 }
@@ -532,4 +525,5 @@
 int_4 Histo::IMax() const
 {
+  if(mBins<=0)  return 0;
   int_4 imx=0;
   if(mBins==1) return imx;
@@ -546,4 +540,5 @@
 int_4 Histo::IMin() const
 {
+  if(mBins<=0)  return 0;
   int_4 imx=0;
   if(mBins==1) return imx;
@@ -560,4 +555,5 @@
 r_8 Histo::VMax() const
 {
+  if(mBins<=0)  return 0.;
   r_8 mx=mData[0];
   if(mBins==1) return mx;
@@ -572,4 +568,5 @@
 r_8 Histo::VMin() const
 {
+  if(mBins<=0)  return 0.;
   r_8 mx=mData[0];
   if(mBins==1) return mx;
@@ -584,4 +581,5 @@
 r_8 Histo::Mean() const
 {
+  if(mBins<=0)  return 0.;
   r_8 n = 0;
   r_8 sx = 0;
@@ -600,4 +598,5 @@
 r_8 Histo::Sigma() const
 {
+  if(mBins<=0)  return 0.;
   r_8 n = 0;
   r_8 sx = 0;
@@ -622,4 +621,5 @@
 r_8 Histo::MeanLH(int_4 il,int_4 ih) const
 {
+  if(mBins<=0)  return 0.;
   if( ih < il ) { il = 0; ih = mBins-1; }
   if( il < 0 ) il = 0;
@@ -641,4 +641,5 @@
 r_8 Histo::SigmaLH(int_4 il,int_4 ih) const
 {
+  if(mBins<=0)  return 0.;
   if( ih < il ) { il = 0; ih = mBins - 1; }
   if( il < 0 ) il = 0;
@@ -665,4 +666,5 @@
 r_8 Histo::Mean(r_8 x0, r_8 dx) const
 {
+  if(mBins<=0)  return 0.;
   r_8 sdata = 0;
   r_8 sx = 0;
@@ -685,4 +687,5 @@
 r_8 Histo::Sigma(r_8 x0, r_8 dx) const
 {
+  if(mBins<=0)  return 0.;
   r_8 sx = 0;
   r_8 sx2= 0;
@@ -708,4 +711,5 @@
 r_8 Histo::CleanedMean(r_8& sigma) const
 {
+  if(mBins<=0)  return 0.;
   if (!nHist) return 0;
   // on fait ca de facon bete, on pourra raffiner apres...
@@ -728,4 +732,5 @@
 r_8 Histo::CleanedMean() const
 {
+  if(mBins<=0)  return 0.;
   if (!nHist) return 0;
   r_8 s=0;
@@ -739,4 +744,5 @@
 int_4 Histo::BinNonNul() const
 {
+if(mBins<=0)  return -1;
 int_4 non=0;
 for (int_4 i=0;i<mBins;i++) if( mData[i] != 0. ) non++;
@@ -763,4 +769,5 @@
 int_4 Histo::BinPercent(r_8 per) const
 {
+if(mBins<=0)  return -1;
 r_8 n = nHist*per;
 r_8 s = 0.;
@@ -789,4 +796,5 @@
 int_4 Histo::BinPercent(r_8 x,r_8 per,int_4& imin,int_4& imax) const
 {
+if(mBins<=0)  return -3;
 imin = imax = -1;
 if( per <= 0. ) return -1;
@@ -926,4 +934,5 @@
 int_4 Histo::MaxiLocal(r_8& maxi,int_4& imax,r_8& maxn,int_4& imaxn) const
 {
+if(mBins<=0)  return -1;
 int_4 nml = 0;
 imax = imaxn = -1;
@@ -964,4 +973,5 @@
 r_8 Histo::FitMax(int_4 degree, r_8 frac, int_4 debug) const
 {
+  if(mBins<=0)  return mMin;
   if (degree < 2 || degree > 3) degree = 3;
   if (frac <= 0. || frac >= 1.) frac = 0.5;
@@ -1099,4 +1109,5 @@
 r_8 Histo::FindWidth(r_8 frac, int_4 debug) const
 {
+  if(mBins<=0)  return 0;
   r_8 xmax = BinCenter( IMax() );
   return FindWidth(xmax,frac,debug);
@@ -1110,4 +1121,5 @@
 r_8 Histo::FindWidth(r_8 xmax,r_8 frac, int_4 debug) const
 {
+  if(mBins<=0)  return 0;
   if (frac <= 0 || frac >= 1.) frac = 0.5;
 
@@ -1205,4 +1217,5 @@
 int_4 Histo::EstimeMax(int_4& im,r_8& xm,int_4 SzPav) const
 {
+if(mBins<=0)  return -1;
 xm = 0;
 if( SzPav <= 0 ) return -1;
@@ -1237,4 +1250,5 @@
 void Histo::EstimeWidthS(r_8 frac,r_8& widthG,r_8& widthD) const
 {
+if(mBins<=0) {frac=0.; return;}
 int_4 i;
 widthG = widthD = -1.;
@@ -1308,4 +1322,5 @@
 {
  
+ if(mBins<=0) return;
  if( il > ih ) { il = 0; ih = mBins-1; }
  if( il < 0 ) il = 0;
@@ -1490,6 +1505,6 @@
 
 // Lecture des donnees Histo 1D
-dobj->mData = new r_8[dobj->mBins];
 is.GetLine(strg, 255);
+if(dobj->mBins>0) dobj->mData = new r_8[dobj->mBins];
 is.Get(dobj->mData, dobj->mBins);
 
@@ -1497,5 +1512,5 @@
 if(errok) {
   is.GetLine(strg, 255);
-  dobj->mErr2 = new r_8[dobj->mBins];
+  if(dobj->mBins>0) dobj->mErr2 = new r_8[dobj->mBins];
   is.Get(dobj->mErr2, dobj->mBins);
 }
