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


Ignore:
Timestamp:
Jul 26, 2000, 3:15:52 PM (25 years ago)
Author:
ansari
Message:

Histos/Hprof/Histo2D en r_8 cmv 26/7/00

File:
1 edited

Legend:

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

    r1089 r1092  
    3131  SetErrOpt(1) permet de demander de calculer l'erreur sur la moyenne.
    3232*/
    33 HProf::HProf(float xMin, float xMax, int nBin, float yMin, float yMax)
     33HProf::HProf(r_8 xMin, r_8 xMax, int_4 nBin, r_8 yMin, r_8 yMax)
    3434: Histo(xMin,xMax,nBin)
    35 , SumY(new double[nBin]), SumY2(new double[nBin]), SumW(new double[nBin])
     35, SumY( (nBin>0) ? new r_8[nBin] : NULL)
     36, SumY2((nBin>0) ? new r_8[nBin] : NULL)
     37, SumW( (nBin>0) ? new r_8[nBin] : NULL)
    3638, Ok(false), YMin(yMin), YMax(yMax), Opt(0)
    3739{
     
    4345/********* Methode *********/
    4446/*!
     47  Constructeur.
     48*/
     49HProf::HProf(r_4 xMin, r_4 xMax, int_4 nBin, r_4 yMin, r_4 yMax)
     50: Histo((r_8)xMin,(r_8)xMax,nBin)
     51, SumY( (nBin>0) ? new r_8[nBin] : NULL)
     52, SumY2((nBin>0) ? new r_8[nBin] : NULL)
     53, SumW( (nBin>0) ? new r_8[nBin] : NULL)
     54, Ok(false), YMin((r_8)yMin), YMax((r_8)yMax), Opt(0)
     55{
     56  Histo::Errors();
     57  Zero();
     58  END_CONSTRUCTOR
     59}
     60
     61/********* Methode *********/
     62/*!
    4563  Constructeur par copie.
    4664*/
    4765HProf::HProf(const HProf& H)
    4866: Histo(H)
    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)
     67, SumY((H.mBins>0)  ? new r_8[H.mBins] : NULL)
     68, SumY2((H.mBins>0) ? new r_8[H.mBins] : NULL)
     69, SumW((H.mBins>0)  ? new r_8[H.mBins] : NULL)
    5270, Ok(H.Ok), YMin(H.YMin), YMax(H.YMax), Opt(H.Opt)
    5371{
    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));
     72  if(mBins>0) {
     73    memcpy(SumY,  H.SumY,  mBins*sizeof(r_8));
     74    memcpy(SumY2, H.SumY2, mBins*sizeof(r_8));
     75    memcpy(SumW,  H.SumW,  mBins*sizeof(r_8));
    5876  }
    5977  UpdateHisto();
     
    88106void HProf::Zero()
    89107{
    90   memset(SumY,  0, bins*sizeof(double));
    91   memset(SumY2, 0, bins*sizeof(double));
    92   memset(SumW,  0, bins*sizeof(double));
     108  memset(SumY,  0, mBins*sizeof(r_8));
     109  memset(SumY2, 0, mBins*sizeof(r_8));
     110  memset(SumW,  0, mBins*sizeof(r_8));
    93111  Ok = false;
    94112  Histo::Zero();
     
    112130void HProf::SetErrOpt(bool spread)
    113131{
    114 int opt = (spread) ? 0 : 1;
     132uint_2 opt = (spread) ? 0 : 1;
    115133if(opt!=Opt) {Opt=opt; Ok=false;}
    116134}
     
    130148void HProf::updatehisto() const
    131149{
    132 float m,e2;
    133 if(bins>0) for(int i=0;i<bins;i++) {
     150r_8 m,e2;
     151if(mBins>0) for(int_4 i=0;i<mBins;i++) {
    134152  if(SumW[i]<=0.) {
    135153    m = e2 = 0.;
     
    139157    if(Opt) e2 /= SumW[i];
    140158  }
    141   data[i] = m;
    142   err2[i] = e2;
     159  mData[i] = m;
     160  mErr2[i] = e2;
    143161}
    144162Ok = true;
     
    153171  Addition au contenu de l'histo pour abscisse x de la valeur y et poids w
    154172*/
    155 void HProf::Add(float x, float y, float w)
     173void HProf::Add(r_8 x, r_8 y, r_8 w)
    156174{
    157175  if(YMax>YMin && (y<YMin || YMax<y)) return;
    158   int numBin = FindBin(x);
    159   if (numBin<0) under += w;
    160   else if (numBin>=bins) over += w;
     176  int_4 numBin = FindBin(x);
     177  if (numBin<0) mUnder += w;
     178  else if (numBin>=mBins) mOver += w;
    161179  else {
    162180    Ok = false;
     
    173191  Addition au contenu de l'histo bin numBin de la valeur y poids w
    174192*/
    175 void HProf::AddBin(int numBin, float y, float w)
     193void HProf::AddBin(int_4 numBin, r_8 y, r_8 w)
    176194{
    177195  if(YMax>YMin && (y<YMin || YMax<y)) return;
    178   if (numBin<0) under += w;
    179   else if (numBin>=bins) over += w;
     196  if (numBin<0) mUnder += w;
     197  else if (numBin>=mBins) mOver += w;
    180198  else {
    181199    Ok = false;
     
    195213{
    196214if(this == &h) return *this;
    197 if( h.bins > bins ) Delete();
     215if( h.mBins > mBins ) Delete();
    198216Histo *hthis = (Histo *) this;
    199217*hthis = (Histo) h;
    200 if(!SumY)  SumY  = new double[bins];
    201 if(!SumY2) SumY2 = new double[bins];
    202 if(!SumW)  SumW  = new double[bins];
    203 memcpy(SumY,  h.SumY,  bins*sizeof(double));
    204 memcpy(SumY2, h.SumY2, bins*sizeof(double));
    205 memcpy(SumW,  h.SumW,  bins*sizeof(double));
     218if(!SumY)  SumY  = new r_8[mBins];
     219if(!SumY2) SumY2 = new r_8[mBins];
     220if(!SumW)  SumW  = new r_8[mBins];
     221memcpy(SumY,  h.SumY,  mBins*sizeof(r_8));
     222memcpy(SumY2, h.SumY2, mBins*sizeof(r_8));
     223memcpy(SumW,  h.SumW,  mBins*sizeof(r_8));
    206224Ok = h.Ok;
    207225YMin = h.YMin;
     
    222240HProf& HProf::operator += (const HProf& a)
    223241{
    224 if(bins!=a.bins) THROW(sizeMismatchErr);
     242if(mBins!=a.mBins) THROW(sizeMismatchErr);
    225243Histo *hthis = (Histo *) this;
    226244*hthis += (Histo) a;
    227 if(bins>0) for(int i=0;i<bins;i++) {
     245if(mBins>0) for(int_4 i=0;i<mBins;i++) {
    228246  SumY[i]  += a.SumY[i];
    229247  SumY2[i] += a.SumY2[i];
     
    239257  Pour rebinner l'histogramme de profile sur nbinew bins
    240258*/
    241 void HProf::HRebin(int nbinew)
    242 {
    243   if( bins <= 0 ) return; // createur par default
     259void HProf::HRebin(int_4 nbinew)
     260{
     261  if( mBins <= 0 ) return; // createur par default
    244262  if( nbinew <= 0 ) return;
    245263
     
    248266
    249267  // Rebin de la partie Histo
    250   int binold = bins;
     268  int_4 binold = mBins;
    251269  Histo::HRebin(nbinew);
    252270
    253271  // Le nombre de bins est il plus grand ??
    254   if( bins > binold ) {
    255     delete [] SumY;  SumY  = new double[nbinew]; memset(SumY, 0,bins*sizeof(double));
    256     delete [] SumY2; SumY2 = new double[nbinew]; memset(SumY2,0,bins*sizeof(double));
    257     delete [] SumW;  SumW  = new double[nbinew]; memset(SumW, 0,bins*sizeof(double));
     272  if( mBins > binold ) {
     273    delete [] SumY;  SumY  = new r_8[nbinew]; memset(SumY, 0,mBins*sizeof(r_8));
     274    delete [] SumY2; SumY2 = new r_8[nbinew]; memset(SumY2,0,mBins*sizeof(r_8));
     275    delete [] SumW;  SumW  = new r_8[nbinew]; memset(SumW, 0,mBins*sizeof(r_8));
    258276  }
    259277
    260278  // Remplissage des parties propres au HPprof
    261   for(int i=0;i<bins;i++) {
    262     float xmi = BinLowEdge(i);
    263     float xma = BinHighEdge(i);
    264     int imi =  H.FindBin(xmi);
     279  for(int_4 i=0;i<mBins;i++) {
     280    r_8 xmi = BinLowEdge(i);
     281    r_8 xma = BinHighEdge(i);
     282    int_4 imi =  H.FindBin(xmi);
    265283    if( imi < 0 ) imi = 0;
    266     int ima =  H.FindBin(xma);
    267     if( ima >= H.bins ) ima = H.bins-1;
    268     double wY = 0., wY2 = 0., wW = 0.;
     284    int_4 ima =  H.FindBin(xma);
     285    if( ima >= H.mBins ) ima = H.mBins-1;
     286    r_8 wY = 0., wY2 = 0., wW = 0.;
    269287    if( ima == imi ) {
    270288      wY  = H.SumY[imi]  * binWidth/H.binWidth;
     
    278296      wW  += H.SumW[imi]  * (H.BinHighEdge(imi)-xmi)/H.binWidth;
    279297      wW  += H.SumW[ima]  * (xma -H.BinLowEdge(ima))/H.binWidth;
    280       if(ima>imi+1) for(int ii=imi+1;ii<ima;ii++)
     298      if(ima>imi+1) for(int_4 ii=imi+1;ii<ima;ii++)
    281299        {wY += H.SumY[ii]; wY2 += H.SumY2[ii]; wW += H.SumW[ii];}
    282300    }
     
    305323
    306324// Lecture des valeurs
    307 is.Get(dobj->bins);
     325is.Get(dobj->mBins);
    308326is.Get(dobj->YMin);
    309327is.Get(dobj->YMax);
     
    313331// Lecture des donnees propres a l'histogramme de profil.
    314332is.GetLine(strg,255);
    315 dobj->SumY  = new double[dobj->bins];
    316 dobj->SumY2 = new double[dobj->bins];
    317 dobj->SumW  = new double[dobj->bins];
    318 is.Get(dobj->SumY,  dobj->bins);
    319 is.Get(dobj->SumY2, dobj->bins);
    320 is.Get(dobj->SumW,  dobj->bins);
     333dobj->SumY  = new r_8[dobj->mBins];
     334dobj->SumY2 = new r_8[dobj->mBins];
     335dobj->SumW  = new r_8[dobj->mBins];
     336is.Get(dobj->SumY,  dobj->mBins);
     337is.Get(dobj->SumY2, dobj->mBins);
     338is.Get(dobj->SumW,  dobj->mBins);
    321339
    322340// Lecture de l'histogramme
     
    337355
    338356// Ecriture des valeurs
    339 os.Put(dobj->bins);
     357os.Put(dobj->mBins);
    340358os.Put(dobj->YMin);
    341359os.Put(dobj->YMax);
     
    345363sprintf(strg,"HProf: SumY SumY2 SumW");
    346364os.PutLine(strg);
    347 os.Put(dobj->SumY,  dobj->bins);
    348 os.Put(dobj->SumY2, dobj->bins);
    349 os.Put(dobj->SumW,  dobj->bins);
     365os.Put(dobj->SumY,  dobj->mBins);
     366os.Put(dobj->SumY2, dobj->mBins);
     367os.Put(dobj->SumW,  dobj->mBins);
    350368
    351369// Ecriture de l'histogramme
Note: See TracChangeset for help on using the changeset viewer.