Changeset 3057 in Sophya for trunk/SophyaLib/HiStats/hisprof.cc


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

File:
1 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.
Note: See TracChangeset for help on using the changeset viewer.