- Timestamp:
- Jul 26, 2000, 3:15:52 PM (25 years ago)
- Location:
- trunk
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/HiStats/hbook.h
r763 r1092 9 9 #endif 10 10 11 void hbandx_(int_4 *, float *,float *,float*);12 void hbandy_(int_4 *, float *,float *,float*);11 void hbandx_(int_4 *,r_4 *,r_4 *,r_4 *); 12 void hbandy_(int_4 *,r_4 *,r_4 *,r_4 *); 13 13 14 14 void hbarx_(int_4 *); 15 15 void hbary_(int_4 *); 16 16 17 void hbfun1_(int_4 *,char *,int_4 *, float *,float *,float fun(float*),int_4);18 void hbfun2_(int_4 *,char *,int_4 *, float *,float *,int_4 *,float *,float*19 , float fun(float *,float*),int_4);17 void hbfun1_(int_4 *,char *,int_4 *,r_4 *,r_4 *,r_4 fun(r_4 *),int_4); 18 void hbfun2_(int_4 *,char *,int_4 *,r_4 *,r_4 *,int_4 *,r_4 *,r_4 * 19 ,r_4 fun(r_4 *,r_4 *),int_4); 20 20 void hbigbi_(int_4 *,int_4 *); 21 void hbook1_(int_4 *,char *,int_4 *, float *,float *,float*,int_4);22 void hbook2_(int_4 *,char *,int_4 *, float *,float*23 ,int_4 *, float *,float *,float*,int_4);24 void hbpro_(int_4 *, float*);25 void hbprof_(int_4 *,char *,int_4 *, float *,float*26 , float *,float*,char *,int_4,int_4);27 void hbprox_(int_4 *, float*);28 void hbproy_(int_4 *, float*);29 void hbslix_(int_4 *,int_4 *, float*);30 void hbsliy_(int_4 *,int_4 *, float*);21 void hbook1_(int_4 *,char *,int_4 *,r_4 *,r_4 *,r_4 *,int_4); 22 void hbook2_(int_4 *,char *,int_4 *,r_4 *,r_4 * 23 ,int_4 *,r_4 *,r_4 *,r_4 *,int_4); 24 void hbpro_(int_4 *,r_4 *); 25 void hbprof_(int_4 *,char *,int_4 *,r_4 *,r_4 * 26 ,r_4 *,r_4 *,char *,int_4,int_4); 27 void hbprox_(int_4 *,r_4 *); 28 void hbproy_(int_4 *,r_4 *); 29 void hbslix_(int_4 *,int_4 *,r_4 *); 30 void hbsliy_(int_4 *,int_4 *,r_4 *); 31 31 void hcdir_(char *,char *,int_4,int_4); 32 32 void hdelet_(int_4 *); 33 void hfill_(int_4 *, float *,float *,float*);34 void hfithn_(int_4 *,char *,char *,int_4 *, float*35 , float *,float *,float *,float *,float*,int_4,int_4);36 void hfn_(int_4 *, float*);37 void hfunc_(int_4 *, float fun(float*));38 void hgive_(int_4 *,char *,int_4 *, float *,float*39 ,int_4 *, float *,float*,int_4 *,int_4 *);40 void hgn_(int_4 *,int_4 *,int_4 *, float*,int_4 *);41 void hgnf_(int_4 *,int_4 *, float*,int_4 *);33 void hfill_(int_4 *,r_4 *,r_4 *,r_4 *); 34 void hfithn_(int_4 *,char *,char *,int_4 *,r_4 * 35 ,r_4 *,r_4 *,r_4 *,r_4 *,r_4 *,int_4,int_4); 36 void hfn_(int_4 *,r_4 *); 37 void hfunc_(int_4 *,r_4 fun(r_4 *)); 38 void hgive_(int_4 *,char *,int_4 *,r_4 *,r_4 * 39 ,int_4 *,r_4 *,r_4 *,int_4 *,int_4 *); 40 void hgn_(int_4 *,int_4 *,int_4 *,r_4 *,int_4 *); 41 void hgnf_(int_4 *,int_4 *,r_4 *,int_4 *); 42 42 void hgnpar_(int_4 *,char *,int_4); 43 floathi_(int_4 *,int_4 *);43 r_4 hi_(int_4 *,int_4 *); 44 44 void hidopt_(int_4 *,char *,int_4); 45 floathie_(int_4 *,int_4 *);46 floathif_(int_4 *,int_4 *);47 floathij_(int_4 *,int_4 *,int_4 *);48 void hijxy_(int_4 *,int_4 *,int_4 *, float *,float*);49 void hix_(int_4 *,int_4 *, float*);45 r_4 hie_(int_4 *,int_4 *); 46 r_4 hif_(int_4 *,int_4 *); 47 r_4 hij_(int_4 *,int_4 *,int_4 *); 48 void hijxy_(int_4 *,int_4 *,int_4 *,r_4 *,r_4 *); 49 void hix_(int_4 *,int_4 *,r_4 *); 50 50 void hldir_(char *,char *,int_4,int_4); 51 51 void hmdir_(char *,char *,int_4,int_4); 52 floathmax_(int_4 *);53 void hmaxim_(int_4 *, float*);54 floathmin_(int_4 *);55 void hminim_(int_4 *, float*);56 void hnorma_(int_4 *, float*);52 r_4 hmax_(int_4 *); 53 void hmaxim_(int_4 *,r_4 *); 54 r_4 hmin_(int_4 *); 55 void hminim_(int_4 *,r_4 *); 56 void hnorma_(int_4 *,r_4 *); 57 57 void hnoent_(int_4 *,int_4 *); 58 void hpak_(int_4 *, float*);59 void hpake_(int_4 *, float*);58 void hpak_(int_4 *,r_4 *); 59 void hpake_(int_4 *,r_4 *); 60 60 void hprint_(int_4 *); 61 61 void hrend_(char *,int_4); 62 62 void hrin_(int_4 *,int_4 *,int_4 *); 63 floathrndm1_(int_4 *);64 void hrndm2_(int_4 *, float *,float*);63 r_4 hrndm1_(int_4 *); 64 void hrndm2_(int_4 *,r_4 *,r_4 *); 65 65 void hropen_(int_4 *,char *,char *,char *,int_4 *,int_4 *,int_4,int_4,int_4); 66 66 void hrout_(int_4 *,int_4 *,char *,int_4); 67 void hscale_(int_4 *, float*);68 floathstati_(int_4 *,int_4 *,char *,int_4 *,int_4);69 floathsum_(int_4 *);70 void hunpak_(int_4 *, float*,char *,int_4 *,int_4);71 void hunpke_(int_4 *, float*,char *,int_4 *,int_4);72 float hx_(int_4 *,float*);73 float hxe_(int_4 *,float*);74 float hxi_(int_4 *,float*,int_4 *);75 float hxyij_(int_4 *,float *,float*,int_4 *,int_4 *);76 float hxy_(int_4 *,float *,float*);67 void hscale_(int_4 *,r_4 *); 68 r_4 hstati_(int_4 *,int_4 *,char *,int_4 *,int_4); 69 r_4 hsum_(int_4 *); 70 void hunpak_(int_4 *,r_4 *,char *,int_4 *,int_4); 71 void hunpke_(int_4 *,r_4 *,char *,int_4 *,int_4); 72 r_4 hx_(int_4 *,r_4 *); 73 r_4 hxe_(int_4 *,r_4 *); 74 r_4 hxi_(int_4 *,r_4 *,int_4 *); 75 r_4 hxyij_(int_4 *,r_4 *,r_4 *,int_4 *,int_4 *); 76 r_4 hxy_(int_4 *,r_4 *,r_4 *); 77 77 78 78 #ifdef __cplusplus -
trunk/SophyaLib/HiStats/hisprof.cc
r1089 r1092 31 31 SetErrOpt(1) permet de demander de calculer l'erreur sur la moyenne. 32 32 */ 33 HProf::HProf( float xMin, float xMax, int nBin, float yMin, floatyMax)33 HProf::HProf(r_8 xMin, r_8 xMax, int_4 nBin, r_8 yMin, r_8 yMax) 34 34 : 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) 36 38 , Ok(false), YMin(yMin), YMax(yMax), Opt(0) 37 39 { … … 43 45 /********* Methode *********/ 44 46 /*! 47 Constructeur. 48 */ 49 HProf::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 /*! 45 63 Constructeur par copie. 46 64 */ 47 65 HProf::HProf(const HProf& H) 48 66 : 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) 52 70 , Ok(H.Ok), YMin(H.YMin), YMax(H.YMax), Opt(H.Opt) 53 71 { 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)); 58 76 } 59 77 UpdateHisto(); … … 88 106 void HProf::Zero() 89 107 { 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)); 93 111 Ok = false; 94 112 Histo::Zero(); … … 112 130 void HProf::SetErrOpt(bool spread) 113 131 { 114 intopt = (spread) ? 0 : 1;132 uint_2 opt = (spread) ? 0 : 1; 115 133 if(opt!=Opt) {Opt=opt; Ok=false;} 116 134 } … … 130 148 void HProf::updatehisto() const 131 149 { 132 floatm,e2;133 if( bins>0) for(int i=0;i<bins;i++) {150 r_8 m,e2; 151 if(mBins>0) for(int_4 i=0;i<mBins;i++) { 134 152 if(SumW[i]<=0.) { 135 153 m = e2 = 0.; … … 139 157 if(Opt) e2 /= SumW[i]; 140 158 } 141 data[i] = m;142 err2[i] = e2;159 mData[i] = m; 160 mErr2[i] = e2; 143 161 } 144 162 Ok = true; … … 153 171 Addition au contenu de l'histo pour abscisse x de la valeur y et poids w 154 172 */ 155 void HProf::Add( float x, float y, floatw)173 void HProf::Add(r_8 x, r_8 y, r_8 w) 156 174 { 157 175 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; 161 179 else { 162 180 Ok = false; … … 173 191 Addition au contenu de l'histo bin numBin de la valeur y poids w 174 192 */ 175 void HProf::AddBin(int numBin, float y, floatw)193 void HProf::AddBin(int_4 numBin, r_8 y, r_8 w) 176 194 { 177 195 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; 180 198 else { 181 199 Ok = false; … … 195 213 { 196 214 if(this == &h) return *this; 197 if( h. bins > bins ) Delete();215 if( h.mBins > mBins ) Delete(); 198 216 Histo *hthis = (Histo *) this; 199 217 *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));218 if(!SumY) SumY = new r_8[mBins]; 219 if(!SumY2) SumY2 = new r_8[mBins]; 220 if(!SumW) SumW = new r_8[mBins]; 221 memcpy(SumY, h.SumY, mBins*sizeof(r_8)); 222 memcpy(SumY2, h.SumY2, mBins*sizeof(r_8)); 223 memcpy(SumW, h.SumW, mBins*sizeof(r_8)); 206 224 Ok = h.Ok; 207 225 YMin = h.YMin; … … 222 240 HProf& HProf::operator += (const HProf& a) 223 241 { 224 if( bins!=a.bins) THROW(sizeMismatchErr);242 if(mBins!=a.mBins) THROW(sizeMismatchErr); 225 243 Histo *hthis = (Histo *) this; 226 244 *hthis += (Histo) a; 227 if( bins>0) for(int i=0;i<bins;i++) {245 if(mBins>0) for(int_4 i=0;i<mBins;i++) { 228 246 SumY[i] += a.SumY[i]; 229 247 SumY2[i] += a.SumY2[i]; … … 239 257 Pour rebinner l'histogramme de profile sur nbinew bins 240 258 */ 241 void HProf::HRebin(int nbinew)242 { 243 if( bins <= 0 ) return; // createur par default259 void HProf::HRebin(int_4 nbinew) 260 { 261 if( mBins <= 0 ) return; // createur par default 244 262 if( nbinew <= 0 ) return; 245 263 … … 248 266 249 267 // Rebin de la partie Histo 250 int binold = bins;268 int_4 binold = mBins; 251 269 Histo::HRebin(nbinew); 252 270 253 271 // 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)); 258 276 } 259 277 260 278 // Remplissage des parties propres au HPprof 261 for(int i=0;i<bins;i++) {262 floatxmi = BinLowEdge(i);263 floatxma = 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); 265 283 if( imi < 0 ) imi = 0; 266 int ima = H.FindBin(xma);267 if( ima >= H. bins ) ima = H.bins-1;268 doublewY = 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.; 269 287 if( ima == imi ) { 270 288 wY = H.SumY[imi] * binWidth/H.binWidth; … … 278 296 wW += H.SumW[imi] * (H.BinHighEdge(imi)-xmi)/H.binWidth; 279 297 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++) 281 299 {wY += H.SumY[ii]; wY2 += H.SumY2[ii]; wW += H.SumW[ii];} 282 300 } … … 305 323 306 324 // Lecture des valeurs 307 is.Get(dobj-> bins);325 is.Get(dobj->mBins); 308 326 is.Get(dobj->YMin); 309 327 is.Get(dobj->YMax); … … 313 331 // Lecture des donnees propres a l'histogramme de profil. 314 332 is.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);333 dobj->SumY = new r_8[dobj->mBins]; 334 dobj->SumY2 = new r_8[dobj->mBins]; 335 dobj->SumW = new r_8[dobj->mBins]; 336 is.Get(dobj->SumY, dobj->mBins); 337 is.Get(dobj->SumY2, dobj->mBins); 338 is.Get(dobj->SumW, dobj->mBins); 321 339 322 340 // Lecture de l'histogramme … … 337 355 338 356 // Ecriture des valeurs 339 os.Put(dobj-> bins);357 os.Put(dobj->mBins); 340 358 os.Put(dobj->YMin); 341 359 os.Put(dobj->YMax); … … 345 363 sprintf(strg,"HProf: SumY SumY2 SumW"); 346 364 os.PutLine(strg); 347 os.Put(dobj->SumY, dobj-> bins);348 os.Put(dobj->SumY2, dobj-> bins);349 os.Put(dobj->SumW, dobj-> bins);365 os.Put(dobj->SumY, dobj->mBins); 366 os.Put(dobj->SumY2, dobj->mBins); 367 os.Put(dobj->SumW, dobj->mBins); 350 368 351 369 // Ecriture de l'histogramme -
trunk/SophyaLib/HiStats/hisprof.h
r1089 r1092 17 17 // CREATOR / DESTRUCTOR 18 18 HProf(); 19 HProf(float xMin, float xMax, int nBin=100, float yMin=1., float yMax=-1.); 19 HProf(r_8 xMin, r_8 xMax, int_4 nBin=100, r_8 yMin=1., r_8 yMax=-1.); 20 HProf(r_4 xMin, r_4 xMax, int_4 nBin=100, r_4 yMin=1., r_4 yMax=-1.); 20 21 HProf(const HProf& H); 21 22 virtual ~HProf(); … … 27 28 void SetErrOpt(bool spread = true); 28 29 void Zero(); 29 void Add( float x, float y, floatw = 1.);30 void AddBin(int numBin, float y, floatw = 1.);30 void Add(r_8 x, r_8 y, r_8 w = 1.); 31 void AddBin(int_4 numBin, r_8 y, r_8 w = 1.); 31 32 32 33 // Acces a l information … … 44 45 {UpdateHisto(); Histo::GetError(v);} 45 46 //! Retourne le contenu du bin i 46 inline float operator()(inti) const47 {UpdateHisto(); return data[i];}47 inline r_8 operator()(int_4 i) const 48 {UpdateHisto(); return mData[i];} 48 49 //! Retourne le carre de la dispersion/erreur du bin i 49 inline double Error2(inti) const50 {UpdateHisto(); return (float) err2[i];}50 inline r_8 Error2(int_4 i) const 51 {UpdateHisto(); return mErr2[i];} 51 52 //! Retourne la dispersion/erreur du bin i 52 inline float Error(inti) const53 inline r_8 Error(int_4 i) const 53 54 {UpdateHisto(); 54 return ( err2[i]>0.) ? (float) sqrt(err2[i]) : 0.f;}55 return (mErr2[i]>0.) ? sqrt(mErr2[i]) : 0.;} 55 56 56 57 // Operators … … 59 60 60 61 // Info, statistique et calculs sur les histogrammes 61 virtual void HRebin(int nbinew);62 virtual void HRebin(int_4 nbinew); 62 63 63 64 // Fit 64 65 //! Fit du profile par ``gfit''. 65 inline int Fit(GeneralFit& gfit)66 inline int_4 Fit(GeneralFit& gfit) 66 67 {UpdateHisto(); return Histo::Fit(gfit,0);} 67 68 //! Retourne l'Histogramme des residus par ``gfit''. … … 74 75 // Print 75 76 //! Print, voir detail dans Histo::Print 76 inline void Print(int dyn=100,float hmin=1.,floathmax=-1.77 ,int pflag=0,int il=1,intih=-1)77 inline void Print(int_4 dyn=100,r_8 hmin=1.,r_8 hmax=-1. 78 ,int_4 pflag=0,int_4 il=1,int_4 ih=-1) 78 79 {UpdateHisto(); Histo::Print(dyn,hmin,hmax,pflag,il,ih);} 79 80 //! PrintF, voir detail dans Histo::PrintF 80 inline void PrintF(FILE * fp,int dyn=100,float hmin=1.,floathmax=-1.81 ,int pflag=0,int il=1,intih=-1)81 inline void PrintF(FILE * fp,int_4 dyn=100,r_8 hmin=1.,r_8 hmax=-1. 82 ,int_4 pflag=0,int_4 il=1,int_4 ih=-1) 82 83 {UpdateHisto(); Histo::PrintF(fp,dyn,hmin,hmax,pflag,il,ih);} 83 84 … … 86 87 void updatehisto() const; 87 88 88 double*SumY; //!< somme89 double*SumY2; //!< somme des carres90 double*SumW; //!< somme des poids91 mutable bool 92 floatYMin; //!< limite minimum Y pour somme93 floatYMax; //!< limite maximum Y pour somme94 uint_2 89 r_8* SumY; //!< somme 90 r_8* SumY2; //!< somme des carres 91 r_8* SumW; //!< somme des poids 92 mutable bool Ok; //!< true if update fait 93 r_8 YMin; //!< limite minimum Y pour somme 94 r_8 YMax; //!< limite maximum Y pour somme 95 uint_2 Opt; //!< options pour les erreurs 95 96 }; 96 97 -
trunk/SophyaLib/HiStats/histos.cc
r1064 r1092 1 1 // 2 // $Id: histos.cc,v 1. 9 2000-07-11 18:57:25 ansari Exp $2 // $Id: histos.cc,v 1.10 2000-07-26 13:15:15 ansari Exp $ 3 3 // 4 4 … … 22 22 /*! Constructeur par defaut */ 23 23 Histo::Histo() 24 : data(NULL), err2(NULL),25 under(0), over(0), nHist(0), nEntries(0),26 bins(0), min(0), max(0),24 : mData(NULL), mErr2(NULL), 25 mUnder(0), mOver(0), nHist(0), nEntries(0), 26 mBins(0), mMin(0), mMax(0), 27 27 binWidth(0) 28 28 { … … 32 32 /********* Methode *********/ 33 33 /*! Constructeur d'un histo de nBin bins allant de xMin a xMax */ 34 Histo::Histo(float xMin, float xMax, int nBin) 35 : data(new float[nBin]), err2(NULL), 36 under(0), over(0), nHist(0), nEntries(0), 37 bins(nBin), min(xMin), max(xMax), 38 binWidth((max - min)/nBin) 34 Histo::Histo(r_8 xMin, r_8 xMax, int_4 nBin) 35 : mData((nBin>0) ? new r_8[nBin] : NULL), 36 mErr2(NULL), 37 mUnder(0), mOver(0), nHist(0), nEntries(0), 38 mBins(nBin), mMin(xMin), mMax(xMax), 39 binWidth((nBin>0) ? (mMax-mMin)/nBin : 0) 39 40 { 40 41 Zero(); … … 43 44 44 45 /********* Methode *********/ 46 /*! Constructeur d'un histo de nBin bins allant de xMin a xMax */ 47 Histo::Histo(r_4 xMin, r_4 xMax, int_4 nBin) 48 : mData((nBin>0) ? new r_8[nBin] : NULL), 49 mErr2(NULL), 50 mUnder(0), mOver(0), nHist(0), nEntries(0), 51 mBins(nBin), mMin((r_8)xMin), mMax((r_8)xMax), 52 binWidth((nBin>0) ? (mMax-mMin)/nBin : 0) 53 { 54 Zero(); 55 END_CONSTRUCTOR 56 } 57 58 /********* Methode *********/ 45 59 /*! Constructeur par copie */ 46 60 Histo::Histo(const Histo& H) 47 : data((H.bins>0)? new float[H.bins] : NULL),48 err2(NULL),49 under(H.under), over(H.over), nHist(H.nHist), nEntries(H.nEntries),50 bins(H.bins), min(H.min), max(H.max),61 : mData((H.mBins>0)? new r_8[H.mBins] : NULL), 62 mErr2(NULL), 63 mUnder(H.mUnder), mOver(H.mOver), nHist(H.nHist), nEntries(H.nEntries), 64 mBins(H.mBins), mMin(H.mMin), mMax(H.mMax), 51 65 binWidth(H.binWidth) 52 66 { 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));67 if(mBins>0) { 68 memcpy(mData, H.mData, mBins*sizeof(r_8)); 69 if( H.mErr2 != NULL ) { 70 mErr2 = new r_8[mBins]; 71 memcpy(mErr2, H.mErr2, mBins*sizeof(r_8)); 58 72 } 59 73 } … … 65 79 void Histo::Delete() 66 80 { 67 if( data != NULL ) { delete[] data; data = NULL;}68 if( err2 != NULL ) { delete[] err2; err2 = NULL;}69 under = over = min = max = binWidth= 0.;81 if( mData != NULL ) { delete[] mData; mData = NULL;} 82 if( mErr2 != NULL ) { delete[] mErr2; mErr2 = NULL;} 83 mUnder = mOver = mMin = mMax = binWidth= 0.; 70 84 nHist = 0.; 71 nEntries = bins = 0;85 nEntries = mBins = 0; 72 86 } 73 87 … … 85 99 void Histo::Zero() 86 100 { 87 if( bins<=0) return;88 memset( data, 0, bins*sizeof(float));89 under = over = 0;101 if(mBins<=0) return; 102 memset(mData, 0, mBins*sizeof(r_8)); 103 mUnder = mOver = 0; 90 104 nHist = 0; 91 105 nEntries = 0; 92 if( err2 != NULL ) memset(err2, 0, bins*sizeof(double));106 if( mErr2 != NULL ) memset(mErr2, 0, mBins*sizeof(r_8)); 93 107 } 94 108 … … 99 113 void Histo::Errors() 100 114 { 101 if( bins<=0) return;102 if( err2==NULL) err2 = new double[bins];103 memset( err2, 0, bins*sizeof(double));115 if(mBins<=0) return; 116 if(mErr2==NULL) mErr2 = new r_8[mBins]; 117 memset(mErr2, 0, mBins*sizeof(r_8)); 104 118 } 105 119 … … 111 125 { 112 126 if(this == &h) return *this; 113 if( h. bins <= 0 ) {Delete(); return *this;}114 if( h. bins > bins ) Delete();115 if(!h. err2 && err2 ) { delete [] err2; err2=NULL;}116 if(! data) data = new float[h.bins];117 if(h. err2 && !err2 ) err2 = new double[h.bins];118 119 under = h.under;120 over = h.over;127 if( h.mBins <= 0 ) {Delete(); return *this;} 128 if( h.mBins > mBins ) Delete(); 129 if(!h.mErr2 && mErr2 ) { delete [] mErr2; mErr2=NULL;} 130 if(!mData) mData = new r_8[h.mBins]; 131 if(h.mErr2 && !mErr2 ) mErr2 = new r_8[h.mBins]; 132 133 mUnder = h.mUnder; 134 mOver = h.mOver; 121 135 nHist = h.nHist; 122 136 nEntries = h.nEntries; 123 bins = h.bins;124 m in = h.min;125 m ax = h.max;137 mBins = h.mBins; 138 mMin = h.mMin; 139 mMax = h.mMax; 126 140 binWidth = h.binWidth; 127 141 128 memcpy( data, h.data, bins*sizeof(float));129 if( err2) memcpy(err2, h.err2, bins*sizeof(double));142 memcpy(mData, h.mData, mBins*sizeof(r_8)); 143 if(mErr2) memcpy(mErr2, h.mErr2, mBins*sizeof(r_8)); 130 144 131 145 return *this; … … 136 150 Operateur de multiplication par une constante 137 151 */ 138 Histo& Histo::operator *= ( doubleb)139 { 140 doubleb2 = b*b;141 for(int i=0;i<bins;i++) {142 data[i] *= b;143 if( err2) err2[i] *= b2;144 } 145 under *= b;146 over *= b;152 Histo& Histo::operator *= (r_8 b) 153 { 154 r_8 b2 = b*b; 155 for(int_4 i=0;i<mBins;i++) { 156 mData[i] *= b; 157 if(mErr2) mErr2[i] *= b2; 158 } 159 mUnder *= b; 160 mOver *= b; 147 161 nHist *= b; 148 162 … … 153 167 Operateur de division par une constante 154 168 */ 155 Histo& Histo::operator /= ( doubleb)169 Histo& Histo::operator /= (r_8 b) 156 170 { 157 171 if (b==0.) THROW(inconsistentErr); 158 doubleb2 = b*b;159 for(int i=0;i<bins;i++) {160 data[i] /= b;161 if( err2) err2[i] /= b2;162 } 163 under /= b;164 over /= b;172 r_8 b2 = b*b; 173 for(int_4 i=0;i<mBins;i++) { 174 mData[i] /= b; 175 if(mErr2) mErr2[i] /= b2; 176 } 177 mUnder /= b; 178 mOver /= b; 165 179 nHist /= b; 166 180 … … 171 185 Operateur d'addition d'une constante 172 186 */ 173 Histo& Histo::operator += ( doubleb)174 { 175 for(int i=0;i<bins;i++) data[i] += b;176 under += b;177 over += b;178 nHist += bins*b;187 Histo& Histo::operator += (r_8 b) 188 { 189 for(int_4 i=0;i<mBins;i++) mData[i] += b; 190 mUnder += b; 191 mOver += b; 192 nHist += mBins*b; 179 193 180 194 return *this; … … 184 198 Operateur de soustraction d'une constante 185 199 */ 186 Histo& Histo::operator -= ( doubleb)187 { 188 for(int i=0;i<bins;i++) data[i] -= b;189 under -= b;190 over -= b;191 nHist -= bins*b;200 Histo& Histo::operator -= (r_8 b) 201 { 202 for(int_4 i=0;i<mBins;i++) mData[i] -= b; 203 mUnder -= b; 204 mOver -= b; 205 nHist -= mBins*b; 192 206 193 207 return *this; … … 200 214 Histo& Histo::operator += (const Histo& a) 201 215 { 202 if( bins!=a.bins) THROW(sizeMismatchErr);203 for(int i=0;i<bins;i++) {204 data[i] += a(i);205 if( err2 && a.err2) err2[i] += a.Error2(i);206 } 207 under += a.under;208 over += a.over;216 if(mBins!=a.mBins) THROW(sizeMismatchErr); 217 for(int_4 i=0;i<mBins;i++) { 218 mData[i] += a(i); 219 if(mErr2 && a.mErr2) mErr2[i] += a.Error2(i); 220 } 221 mUnder += a.mUnder; 222 mOver += a.mOver; 209 223 nHist += a.nHist; 210 224 nEntries += a.nEntries; … … 218 232 Histo& Histo::operator -= (const Histo& a) 219 233 { 220 if( bins!=a.bins) THROW(sizeMismatchErr);221 for(int i=0;i<bins;i++) {222 data[i] -= a(i);223 if( err2 && a.err2) err2[i] += a.Error2(i);224 } 225 under -= a.under;226 over -= a.over;234 if(mBins!=a.mBins) THROW(sizeMismatchErr); 235 for(int_4 i=0;i<mBins;i++) { 236 mData[i] -= a(i); 237 if(mErr2 && a.mErr2) mErr2[i] += a.Error2(i); 238 } 239 mUnder -= a.mUnder; 240 mOver -= a.mOver; 227 241 nHist -= a.nHist; 228 242 nEntries += a.nEntries; … … 236 250 Histo& Histo::operator *= (const Histo& a) 237 251 { 238 if( bins!=a.bins) THROW(sizeMismatchErr);252 if(mBins!=a.mBins) THROW(sizeMismatchErr); 239 253 nHist = 0.; 240 for(int i=0;i<bins;i++) {241 if( err2 && a.err2)242 err2[i] = a(i)*a(i)*err2[i] + data[i]*data[i]*a.Error2(i);243 data[i] *= a(i);244 nHist += data[i];245 } 246 under *= a.under;247 over *= a.over;254 for(int_4 i=0;i<mBins;i++) { 255 if(mErr2 && a.mErr2) 256 mErr2[i] = a(i)*a(i)*mErr2[i] + mData[i]*mData[i]*a.Error2(i); 257 mData[i] *= a(i); 258 nHist += mData[i]; 259 } 260 mUnder *= a.mUnder; 261 mOver *= a.mOver; 248 262 nEntries += a.nEntries; 249 263 … … 256 270 Histo& Histo::operator /= (const Histo& a) 257 271 { 258 if( bins!=a.bins) THROW(sizeMismatchErr);272 if(mBins!=a.mBins) THROW(sizeMismatchErr); 259 273 nHist = 0.; 260 for(int i=0;i<bins;i++) {274 for(int_4 i=0;i<mBins;i++) { 261 275 if(a(i)==0.) { 262 data[i]=0.;263 if( err2) err2[i]=0.;276 mData[i]=0.; 277 if(mErr2) mErr2[i]=0.; 264 278 continue; 265 279 } 266 if( err2 && a.err2)267 err2[i] = (err2[i] + data[i]/a(i)*data[i]/a(i)*a.Error2(i))280 if(mErr2 && a.mErr2) 281 mErr2[i] = (mErr2[i] + mData[i]/a(i)*mData[i]/a(i)*a.Error2(i)) 268 282 /(a(i)*a(i)); 269 data[i] /= a(i);270 nHist += data[i];271 } 272 if(a. under!=0.) under /= a.under; else under = 0.;273 if(a. over!=0.) over /= a.over; else over = 0.;283 mData[i] /= a(i); 284 nHist += mData[i]; 285 } 286 if(a.mUnder!=0.) mUnder /= a.mUnder; else mUnder = 0.; 287 if(a.mOver!=0.) mOver /= a.mOver; else mOver = 0.; 274 288 nEntries += a.nEntries; 275 289 … … 283 297 void Histo::GetAbsc(TVector<r_8> &v) 284 298 { 285 v.Realloc( bins);286 for(int i=0;i<bins;i++) v(i) = BinLowEdge(i);299 v.Realloc(mBins); 300 for(int_4 i=0;i<mBins;i++) v(i) = BinLowEdge(i); 287 301 return; 288 302 } … … 293 307 void Histo::GetValue(TVector<r_8> &v) 294 308 { 295 v.Realloc( bins);296 for(int i=0;i<bins;i++) v(i) = data[i];309 v.Realloc(mBins); 310 for(int_4 i=0;i<mBins;i++) v(i) = mData[i]; 297 311 return; 298 312 } … … 303 317 void Histo::GetError2(TVector<r_8> &v) 304 318 { 305 v.Realloc( bins);306 if(! err2) {for(int i=0;i<bins;i++) v(i) = 0.; return;}307 for(int i=0;i<bins;i++) v(i) = err2[i];319 v.Realloc(mBins); 320 if(!mErr2) {for(int_4 i=0;i<mBins;i++) v(i) = 0.; return;} 321 for(int_4 i=0;i<mBins;i++) v(i) = mErr2[i]; 308 322 return; 309 323 } … … 314 328 void Histo::GetError(TVector<r_8> &v) 315 329 { 316 v.Realloc( bins);317 if(! err2) {for(int i=0;i<bins;i++) v(i) = 0.; return;}318 for(int i=0;i<bins;i++) v(i) = Error(i);330 v.Realloc(mBins); 331 if(!mErr2) {for(int_4 i=0;i<mBins;i++) v(i) = 0.; return;} 332 for(int_4 i=0;i<mBins;i++) v(i) = Error(i); 319 333 return; 320 334 } … … 324 338 Remplissage du contenu de l'histo avec les valeurs d'un vecteur 325 339 */ 326 void Histo::PutValue(TVector<r_8> &v, int ierr)327 { 328 //if(v.NElts()<(uint_4) bins) THROW(sizeMismatchErr);329 uint_4 n = (v.NElts()<(uint_4) bins) ? v.NElts(): (uint_4) bins;330 if(n>0) for( inti=0;i<n;i++) {331 data[i] = v(i);332 if( err2&&ierr) err2[i] = fabs(v(i));340 void Histo::PutValue(TVector<r_8> &v, int_4 ierr) 341 { 342 //if(v.NElts()<(uint_4) mBins) THROW(sizeMismatchErr); 343 uint_4 n = (v.NElts()<(uint_4) mBins) ? v.NElts(): (uint_4) mBins; 344 if(n>0) for(uint_4 i=0;i<n;i++) { 345 mData[i] = v(i); 346 if(mErr2&&ierr) mErr2[i] = fabs(v(i)); 333 347 } 334 348 return; … … 338 352 Addition du contenu de l'histo avec les valeurs d'un vecteur 339 353 */ 340 void Histo::PutValueAdd(TVector<r_8> &v, int ierr)341 { 342 //if(v.NElts()<(uint_4) bins) THROW(sizeMismatchErr);343 uint_4 n = (v.NElts()<(uint_4) bins) ? v.NElts(): (uint_4) bins;344 if(n>0) for( inti=0;i<n;i++) {345 data[i] += v(i);346 if( err2 && ierr) err2[i] += fabs(v(i));354 void Histo::PutValueAdd(TVector<r_8> &v, int_4 ierr) 355 { 356 //if(v.NElts()<(uint_4) mBins) THROW(sizeMismatchErr); 357 uint_4 n = (v.NElts()<(uint_4) mBins) ? v.NElts(): (uint_4) mBins; 358 if(n>0) for(uint_4 i=0;i<n;i++) { 359 mData[i] += v(i); 360 if(mErr2 && ierr) mErr2[i] += fabs(v(i)); 347 361 } 348 362 return; … … 354 368 void Histo::PutError2(TVector<r_8> &v) 355 369 { 356 //if(v.NElts()<(uint_4) bins) THROW(sizeMismatchErr);357 uint_4 n = (v.NElts()<(uint_4) bins) ? v.NElts(): (uint_4) bins;370 //if(v.NElts()<(uint_4) mBins) THROW(sizeMismatchErr); 371 uint_4 n = (v.NElts()<(uint_4) mBins) ? v.NElts(): (uint_4) mBins; 358 372 if(n>0) { 359 if(! err2) Errors();360 for( int i=0;i<n;i++) err2[i] = v(i);373 if(!mErr2) Errors(); 374 for(uint_4 i=0;i<n;i++) mErr2[i] = v(i); 361 375 } 362 376 return; … … 368 382 void Histo::PutError2Add(TVector<r_8> &v) 369 383 { 370 //if(v.NElts()<(uint_4) bins) THROW(sizeMismatchErr);371 uint_4 n = (v.NElts()<(uint_4) bins) ? v.NElts(): (uint_4) bins;384 //if(v.NElts()<(uint_4) mBins) THROW(sizeMismatchErr); 385 uint_4 n = (v.NElts()<(uint_4) mBins) ? v.NElts(): (uint_4) mBins; 372 386 if(n>0) { 373 if(! err2) Errors();374 for( int i=0;i<n;i++) if(v(i)>0.) err2[i] += v(i);387 if(!mErr2) Errors(); 388 for(uint_4 i=0;i<n;i++) if(v(i)>0.) mErr2[i] += v(i); 375 389 } 376 390 return; … … 382 396 void Histo::PutError(TVector<r_8> &v) 383 397 { 384 //if(v.NElts()<(uint_4) bins) THROW(sizeMismatchErr);385 uint_4 n = (v.NElts()<(uint_4) bins) ? v.NElts(): (uint_4) bins;398 //if(v.NElts()<(uint_4) mBins) THROW(sizeMismatchErr); 399 uint_4 n = (v.NElts()<(uint_4) mBins) ? v.NElts(): (uint_4) mBins; 386 400 if(n>0) { 387 if(! err2) Errors();388 for( inti=0;i<n;i++)389 if(v(i)>0.) err2[i]=v(i)*v(i); else err2[i]=-v(i)*v(i);401 if(!mErr2) Errors(); 402 for(uint_4 i=0;i<n;i++) 403 if(v(i)>0.) mErr2[i]=v(i)*v(i); else mErr2[i]=-v(i)*v(i); 390 404 } 391 405 return; … … 396 410 Addition du contenu de l'histo pour abscisse x poids w 397 411 */ 398 void Histo::Add( float x, floatw)399 { 400 int numBin = FindBin(x);401 if (numBin<0) under += w;402 else if (numBin>= bins) over += w;412 void Histo::Add(r_8 x, r_8 w) 413 { 414 int_4 numBin = FindBin(x); 415 if (numBin<0) mUnder += w; 416 else if (numBin>=mBins) mOver += w; 403 417 else { 404 data[numBin] += w;405 if( err2!=NULL) err2[numBin] += w*w;418 mData[numBin] += w; 419 if(mErr2!=NULL) mErr2[numBin] += w*w; 406 420 nHist += w; 407 421 nEntries++; … … 413 427 Addition du contenu de l'histo bin numBin poids w 414 428 */ 415 void Histo::AddBin(int numBin, floatw)416 { 417 if (numBin<0) under += w;418 else if (numBin>= bins) over += w;429 void Histo::AddBin(int_4 numBin, r_8 w) 430 { 431 if (numBin<0) mUnder += w; 432 else if (numBin>=mBins) mOver += w; 419 433 else { 420 data[numBin] += w;421 if( err2!=NULL) err2[numBin] += w*w;434 mData[numBin] += w; 435 if(mErr2!=NULL) mErr2[numBin] += w*w; 422 436 nHist += w; 423 437 nEntries++; … … 429 443 Remplissage du contenu de l'histo pour abscisse x poids w 430 444 */ 431 void Histo::SetBin( float x, floatw)432 { 433 int numBin = FindBin(x);445 void Histo::SetBin(r_8 x, r_8 w) 446 { 447 int_4 numBin = FindBin(x); 434 448 SetBin(numBin,w); 435 449 } … … 439 453 Remplissage du contenu de l'histo pour numBin poids w 440 454 */ 441 void Histo::SetBin(int numBin, floatw)442 { 443 if (numBin<0) under = w;444 else if (numBin>= bins) over = w;455 void Histo::SetBin(int_4 numBin, r_8 w) 456 { 457 if (numBin<0) mUnder = w; 458 else if (numBin>=mBins) mOver = w; 445 459 else { 446 nHist -= data[numBin];447 data[numBin] = w;460 nHist -= mData[numBin]; 461 mData[numBin] = w; 448 462 nHist += w; 449 463 } … … 454 468 Remplissage des erreurs au carre pour abscisse x 455 469 */ 456 void Histo::SetErr2( float x, doublee2)457 { 458 int numBin = FindBin(x);470 void Histo::SetErr2(r_8 x, r_8 e2) 471 { 472 int_4 numBin = FindBin(x); 459 473 SetErr2(numBin,e2); 460 474 } … … 464 478 Remplissage des erreurs au carre pour numBin poids 465 479 */ 466 void Histo::SetErr2(int numBin, doublee2)467 { 468 if( err2==NULL) return;469 if ( numBin<0 || numBin>= bins ) return;470 err2[numBin] = e2;480 void Histo::SetErr2(int_4 numBin, r_8 e2) 481 { 482 if( mErr2==NULL) return; 483 if ( numBin<0 || numBin>=mBins ) return; 484 mErr2[numBin] = e2; 471 485 } 472 486 … … 475 489 Remplissage des erreurs pour abscisse x 476 490 */ 477 void Histo::SetErr( float x, floate)478 { 479 SetErr2(x, (double)e*e);491 void Histo::SetErr(r_8 x, r_8 e) 492 { 493 SetErr2(x, e*e); 480 494 } 481 495 … … 484 498 Remplissage des erreurs pour numBin 485 499 */ 486 void Histo::SetErr(int numBin, floate)487 { 488 SetErr2(numBin, (double)e*e);500 void Histo::SetErr(int_4 numBin, r_8 e) 501 { 502 SetErr2(numBin, e*e); 489 503 } 490 504 … … 493 507 Numero du bin ayant le contenu maximum 494 508 */ 495 int Histo::IMax() const496 { 497 int imx=0;498 if( bins==1) return imx;499 float mx=data[0];500 for (int i=1; i<bins; i++)501 if ( data[i]>mx) {imx = i; mx=data[i];}509 int_4 Histo::IMax() const 510 { 511 int_4 imx=0; 512 if(mBins==1) return imx; 513 r_8 mx=mData[0]; 514 for (int_4 i=1; i<mBins; i++) 515 if (mData[i]>mx) {imx = i; mx=mData[i];} 502 516 return imx; 503 517 } … … 507 521 Numero du bin ayant le contenu minimum 508 522 */ 509 int Histo::IMin() const510 { 511 int imx=0;512 if( bins==1) return imx;513 float mx=data[0];514 for (int i=1; i<bins; i++)515 if ( data[i]<mx) {imx = i; mx=data[i];}523 int_4 Histo::IMin() const 524 { 525 int_4 imx=0; 526 if(mBins==1) return imx; 527 r_8 mx=mData[0]; 528 for (int_4 i=1; i<mBins; i++) 529 if (mData[i]<mx) {imx = i; mx=mData[i];} 516 530 return imx; 517 531 } … … 521 535 Valeur le contenu maximum 522 536 */ 523 floatHisto::VMax() const524 { 525 float mx=data[0];526 if( bins==1) return mx;527 for (int i=1;i<bins;i++) if(data[i]>mx) mx=data[i];537 r_8 Histo::VMax() const 538 { 539 r_8 mx=mData[0]; 540 if(mBins==1) return mx; 541 for (int_4 i=1;i<mBins;i++) if(mData[i]>mx) mx=mData[i]; 528 542 return mx; 529 543 } … … 533 547 Valeur le contenu minimum 534 548 */ 535 floatHisto::VMin() const536 { 537 float mx=data[0];538 if( bins==1) return mx;539 for (int i=1;i<bins;i++) if(data[i]<mx) mx=data[i];549 r_8 Histo::VMin() const 550 { 551 r_8 mx=mData[0]; 552 if(mBins==1) return mx; 553 for (int_4 i=1;i<mBins;i++) if(mData[i]<mx) mx=mData[i]; 540 554 return mx; 541 555 } … … 545 559 Valeur moyenne 546 560 */ 547 floatHisto::Mean() const548 { 549 doublen = 0;550 doublesx = 0;551 for (int i=0; i<bins; i++) {552 double v = (data[i]>=0.) ? data[i] : -data[i];561 r_8 Histo::Mean() const 562 { 563 r_8 n = 0; 564 r_8 sx = 0; 565 for (int_4 i=0; i<mBins; i++) { 566 r_8 v = (mData[i]>=0.) ? mData[i] : -mData[i]; 553 567 n += v; 554 568 sx += BinCenter(i)*v; 555 569 } 556 if(n>0.) return sx/n; else return m in;570 if(n>0.) return sx/n; else return mMin; 557 571 } 558 572 … … 561 575 Valeur du sigma 562 576 */ 563 floatHisto::Sigma() const564 { 565 doublen = 0;566 doublesx = 0;567 doublesx2= 0;568 for (int i=0; i<bins; i++) {569 double v = (data[i]>=0.) ? data[i] : -data[i];577 r_8 Histo::Sigma() const 578 { 579 r_8 n = 0; 580 r_8 sx = 0; 581 r_8 sx2= 0; 582 for (int_4 i=0; i<mBins; i++) { 583 r_8 v = (mData[i]>=0.) ? mData[i] : -mData[i]; 570 584 n += v; 571 585 sx += BinCenter(i)*v; … … 583 597 Valeur de la moyenne calculee entre les bin il et ih 584 598 */ 585 float Histo::MeanLH(int il,intih) const586 { 587 if( ih < il ) { il = 0; ih = bins-1; }599 r_8 Histo::MeanLH(int_4 il,int_4 ih) const 600 { 601 if( ih < il ) { il = 0; ih = mBins-1; } 588 602 if( il < 0 ) il = 0; 589 if( ih >= bins ) ih = bins-1;590 doublen = 0;591 doublesx = 0;592 for (int i=il; i<=ih; i++) {593 double v = (data[i]>=0.) ? data[i] : -data[i];603 if( ih >= mBins ) ih = mBins-1; 604 r_8 n = 0; 605 r_8 sx = 0; 606 for (int_4 i=il; i<=ih; i++) { 607 r_8 v = (mData[i]>=0.) ? mData[i] : -mData[i]; 594 608 n += v; 595 609 sx += BinCenter(i)*v; … … 602 616 Valeur de la moyenne calculee entre les bin il et ih 603 617 */ 604 float Histo::SigmaLH(int il,intih) const605 { 606 if( ih < il ) { il = 0; ih = bins - 1; }618 r_8 Histo::SigmaLH(int_4 il,int_4 ih) const 619 { 620 if( ih < il ) { il = 0; ih = mBins - 1; } 607 621 if( il < 0 ) il = 0; 608 if( ih >= bins ) ih = bins - 1;609 doublen = 0;610 doublesx = 0;611 doublesx2= 0;612 for (int i=il; i<=ih; i++) {613 double v = (data[i]>=0.) ? data[i] : -data[i];622 if( ih >= mBins ) ih = mBins - 1; 623 r_8 n = 0; 624 r_8 sx = 0; 625 r_8 sx2= 0; 626 for (int_4 i=il; i<=ih; i++) { 627 r_8 v = (mData[i]>=0.) ? mData[i] : -mData[i]; 614 628 n += v; 615 629 sx += BinCenter(i)*v; … … 626 640 Valeur de la moyenne calculee entre x0-dx et x0+dx 627 641 */ 628 float Histo::Mean(float x0, floatdx) const629 { 630 doublesdata = 0;631 doublesx = 0;632 int iMin = FindBin(x0-dx);642 r_8 Histo::Mean(r_8 x0, r_8 dx) const 643 { 644 r_8 sdata = 0; 645 r_8 sx = 0; 646 int_4 iMin = FindBin(x0-dx); 633 647 if (iMin<0) iMin = 0; 634 int iMax = FindBin(x0+dx);635 if (iMax> bins) iMax=bins;636 for (int i=iMin; i<iMax; i++) {637 double v = (data[i]>=0.) ? data[i] : -data[i];648 int_4 iMax = FindBin(x0+dx); 649 if (iMax>mBins) iMax=mBins; 650 for (int_4 i=iMin; i<iMax; i++) { 651 r_8 v = (mData[i]>=0.) ? mData[i] : -mData[i]; 638 652 sx += BinCenter(i)*v; 639 653 sdata += v; 640 654 } 641 if(sdata>0.) return sx/sdata; else return m in;655 if(sdata>0.) return sx/sdata; else return mMin; 642 656 } 643 657 … … 646 660 Valeur du sigma calcule entre x0-dx et x0+dx 647 661 */ 648 float Histo::Sigma(float x0, floatdx) const649 { 650 doublesx = 0;651 doublesx2= 0;652 doublesdata = 0;653 int iMin = FindBin(x0-dx);662 r_8 Histo::Sigma(r_8 x0, r_8 dx) const 663 { 664 r_8 sx = 0; 665 r_8 sx2= 0; 666 r_8 sdata = 0; 667 int_4 iMin = FindBin(x0-dx); 654 668 if (iMin<0) iMin = 0; 655 int iMax = FindBin(x0+dx);656 if (iMax> bins) iMax=bins;657 for (int i=iMin; i<iMax; i++) {658 double v = (data[i]>=0.) ? data[i] : -data[i];669 int_4 iMax = FindBin(x0+dx); 670 if (iMax>mBins) iMax=mBins; 671 for (int_4 i=iMin; i<iMax; i++) { 672 r_8 v = (mData[i]>=0.) ? mData[i] : -mData[i]; 659 673 sx += BinCenter(i)*v; 660 674 sx2+= BinCenter(i)*BinCenter(i)*v; … … 669 683 Valeur de la moyenne et du sigma nettoyes 670 684 */ 671 float Histo::CleanedMean(float& sigma) const685 r_8 Histo::CleanedMean(r_8& sigma) const 672 686 { 673 687 if (!nHist) return 0; 674 688 // on fait ca de facon bete, on pourra raffiner apres... 675 floatx0 = Mean();676 floats = Sigma()+binWidth;689 r_8 x0 = Mean(); 690 r_8 s = Sigma()+binWidth; 677 691 678 for (int i=0; i<3; i++) {679 floatxx0 = Mean(x0,5*s);692 for (int_4 i=0; i<3; i++) { 693 r_8 xx0 = Mean(x0,5*s); 680 694 s = Sigma(x0,5*s)+binWidth; 681 695 x0 = xx0; … … 689 703 Valeur de la moyenne nettoyee 690 704 */ 691 floatHisto::CleanedMean() const705 r_8 Histo::CleanedMean() const 692 706 { 693 707 if (!nHist) return 0; 694 floats=0;708 r_8 s=0; 695 709 return CleanedMean(s); 696 710 } … … 700 714 Retourne le nombre de bins non-nul 701 715 */ 702 int Histo::BinNonNul() const703 { 704 int non=0;705 for (int i=0;i<bins;i++) if( data[i] != 0. ) non++;716 int_4 Histo::BinNonNul() const 717 { 718 int_4 non=0; 719 for (int_4 i=0;i<mBins;i++) if( mData[i] != 0. ) non++; 706 720 return non; 707 721 } … … 711 725 Retourne le nombre de bins ayant une erreur non-nulle 712 726 */ 713 int Histo::ErrNonNul() const714 { 715 if( err2==NULL) return -1;716 int non=0;717 for (int i=0;i<bins;i++) if( err2[i] != 0. ) non++;727 int_4 Histo::ErrNonNul() const 728 { 729 if(mErr2==NULL) return -1; 730 int_4 non=0; 731 for (int_4 i=0;i<mBins;i++) if( mErr2[i] != 0. ) non++; 718 732 return non; 719 733 } … … 724 738 entre le bin 0 et ce bin (y compris le contenu de ce bin). 725 739 */ 726 int Histo::BinPercent(floatper) const727 { 728 doublen = nHist*per;729 doubles = 0.;730 int i;731 for(i=0; i< bins; i++ ) {732 s += data[i];740 int_4 Histo::BinPercent(r_8 per) const 741 { 742 r_8 n = nHist*per; 743 r_8 s = 0.; 744 int_4 i; 745 for(i=0; i<mBins; i++ ) { 746 s += mData[i]; 733 747 if( s >= n ) break; 734 748 } 735 if( i == bins ) i = bins-1;749 if( i == mBins ) i = mBins-1; 736 750 return i; 737 751 } … … 747 761 imax = bin tel que nombre d'entrees entre I et imax = N2 * per 748 762 Return: <0 si echec 749 m in(I-imin,imax-I) si ok763 mMin(I-imin,imax-I) si ok 750 764 \endverbatim 751 765 */ 752 int Histo::BinPercent(float x,floatper,int& imin,int& imax)766 int_4 Histo::BinPercent(r_8 x,r_8 per,int& imin,int& imax) 753 767 { 754 768 imin = imax = -1; 755 769 if( per <= 0. ) return -1; 756 770 757 int I = FindBin(x);758 if( I<0 || I>= bins ) return -2;759 760 double N1 = 0.; for(int i=0; i<=I; i++) N1 += data[i]; N1 *= per;761 double N2 = 0.; {for(int i=I; i<bins; i++) N2 += data[i]; N2 *= per;}762 763 doublen = 0.;764 for(imin=I; imin>=0; imin--) { n += data[imin]; if(n>=N1) break; }771 int_4 I = FindBin(x); 772 if( I<0 || I>=mBins ) return -2; 773 774 r_8 N1 = 0.; for(int_4 i=0; i<=I; i++) N1 += mData[i]; N1 *= per; 775 r_8 N2 = 0.; {for(int_4 i=I; i<mBins; i++) N2 += mData[i]; N2 *= per;} 776 777 r_8 n = 0.; 778 for(imin=I; imin>=0; imin--) { n += mData[imin]; if(n>=N1) break; } 765 779 if( imin<0 ) imin = 0; 766 780 // cout<<"I="<<I<<" imin="<<imin<<" n="<<n<<" N1="<<N1<<endl; 767 781 768 782 n = 0.; 769 for(imax=I; imax< bins; imax++) { n += data[imax]; if(n>=N2) break; }770 if( imax>= bins ) imax = bins-1;783 for(imax=I; imax<mBins; imax++) { n += mData[imax]; if(n>=N2) break; } 784 if( imax>=mBins ) imax = mBins-1; 771 785 // cout<<"I="<<I<<" imax="<<imax<<" n="<<n<<" N2="<<N2<<endl; 772 786 … … 778 792 Idem precedent mais renvoie xmin et xmax 779 793 */ 780 int Histo::BinPercent(float x,float per,float& xmin,float& xmax)794 int_4 Histo::BinPercent(r_8 x,r_8 per,r_8& xmin,r_8& xmax) 781 795 { 782 796 xmin = xmax = 0.; 783 int imin,imax;784 int rc = BinPercent(x,per,imin,imax);797 int_4 imin,imax; 798 int_4 rc = BinPercent(x,per,imin,imax); 785 799 if( rc >= 0 ) { xmin = BinLowEdge(imin); xmax = BinHighEdge(imax); } 786 800 return rc; … … 792 806 si norm <= 0 : pas de normalisation, integration seule 793 807 */ 794 void Histo::HInteg( floatnorm)795 { 796 if( bins <= 0 ) return; // createur par default797 if( bins>1)798 for(int i=1; i<bins; i++) {799 data[i] += data[i-1];800 if( err2!=NULL) err2[i] += err2[i-1];808 void Histo::HInteg(r_8 norm) 809 { 810 if( mBins <= 0 ) return; // createur par default 811 if(mBins>1) 812 for(int_4 i=1; i<mBins; i++) { 813 mData[i] += mData[i-1]; 814 if(mErr2!=NULL) mErr2[i] += mErr2[i-1]; 801 815 } 802 816 if( norm <= 0. ) return; 803 norm /= data[bins-1];804 for(int i=0; i<bins; i++) {805 data[i] *= norm;806 if( err2!=NULL) err2[i] *= norm*norm;817 norm /= mData[mBins-1]; 818 for(int_4 i=0; i<mBins; i++) { 819 mData[i] *= norm; 820 if(mErr2!=NULL) mErr2[i] *= norm*norm; 807 821 } 808 822 } … … 814 828 void Histo::HDeriv() 815 829 { 816 if( bins <= 0 ) return; // createur par default817 if( bins <= 1 ) return;818 float *temp = new float[bins];819 memcpy(temp, data, bins*sizeof(float));820 if( bins>=3) for(int i=1; i<bins-1; i++)821 temp[i] = ( data[i+1]-data[i-1])/(2.*binWidth);822 temp[0] = ( data[1]-data[0])/binWidth;823 temp[ bins-1] = (data[bins-1]-data[bins-2])/binWidth;824 memcpy( data, temp, bins*sizeof(float));830 if( mBins <= 0 ) return; // createur par default 831 if( mBins <= 1 ) return; 832 r_8 *temp = new r_8[mBins]; 833 memcpy(temp, mData, mBins*sizeof(r_8)); 834 if(mBins>=3) for(int_4 i=1; i<mBins-1; i++) 835 temp[i] = (mData[i+1]-mData[i-1])/(2.*binWidth); 836 temp[0] = (mData[1]-mData[0])/binWidth; 837 temp[mBins-1] = (mData[mBins-1]-mData[mBins-2])/binWidth; 838 memcpy(mData, temp, mBins*sizeof(r_8)); 825 839 delete [] temp; 826 840 } … … 830 844 Pour rebinner l'histogramme sur nbinew bins 831 845 */ 832 void Histo::HRebin(int nbinew)833 { 834 if( bins <= 0 ) return; // createur par default846 void Histo::HRebin(int_4 nbinew) 847 { 848 if( mBins <= 0 ) return; // createur par default 835 849 if( nbinew <= 0 ) return; 836 850 … … 839 853 840 854 // Le nombre de bins est il plus grand ?? 841 if( nbinew > bins ) {842 delete [] data; data = NULL;843 data = new float[nbinew];844 if( err2 != NULL ) {845 delete [] err2; err2 = NULL;846 err2 = new double[nbinew];855 if( nbinew > mBins ) { 856 delete [] mData; mData = NULL; 857 mData = new r_8[nbinew]; 858 if( mErr2 != NULL ) { 859 delete [] mErr2; mErr2 = NULL; 860 mErr2 = new r_8[nbinew]; 847 861 } 848 862 } 849 863 850 864 // remise en forme de this 851 bins = nbinew;865 mBins = nbinew; 852 866 this->Zero(); 853 binWidth = (m ax-min)/bins;867 binWidth = (mMax-mMin)/mBins; 854 868 // On recopie les parametres qui n'ont pas changes 855 under = H.under;856 over = H.over;869 mUnder = H.mUnder; 870 mOver = H.mOver; 857 871 858 872 859 873 // Remplissage 860 for(int i=0;i<bins;i++) {861 floatxmi = BinLowEdge(i);862 floatxma = BinHighEdge(i);863 int imi = H.FindBin(xmi);874 for(int_4 i=0;i<mBins;i++) { 875 r_8 xmi = BinLowEdge(i); 876 r_8 xma = BinHighEdge(i); 877 int_4 imi = H.FindBin(xmi); 864 878 if( imi < 0 ) imi = 0; 865 int ima = H.FindBin(xma);866 if( ima >= H. bins ) ima = H.bins-1;867 doublew = 0.;879 int_4 ima = H.FindBin(xma); 880 if( ima >= H.mBins ) ima = H.mBins-1; 881 r_8 w = 0.; 868 882 if( ima == imi ) { 869 883 w = H(imi) * binWidth/H.binWidth; … … 872 886 w += H(ima) * (xma -H.BinLowEdge(ima))/H.binWidth; 873 887 if( ima > imi+1 ) 874 for(int ii=imi+1;ii<ima;ii++) w += H(ii);888 for(int_4 ii=imi+1;ii<ima;ii++) w += H(ii); 875 889 } 876 AddBin(i, (float)w);890 AddBin(i, w); 877 891 } 878 892 … … 887 901 consecutifs, le bin le plus a droite est pris. 888 902 */ 889 int Histo::MaxiLocal(float& maxi,int& imax,float& maxn,int& imaxn)890 { 891 int nml = 0;903 int_4 Histo::MaxiLocal(r_8& maxi,int& imax,r_8& maxn,int& imaxn) 904 { 905 int_4 nml = 0; 892 906 imax = imaxn = -1; 893 maxi = maxn = -1. f;907 maxi = maxn = -1.; 894 908 895 909 bool up = true; 896 910 bool down = false; 897 for(int i=0;i<bins;i++) {898 if( !up ) if( data[i] > data[i-1] ) up = true;911 for(int_4 i=0;i<mBins;i++) { 912 if( !up ) if( mData[i] > mData[i-1] ) up = true; 899 913 if( up && !down ) { 900 if( i == bins-1 ) down=true;901 else if( data[i] > data[i+1] ) down=true;914 if( i == mBins-1 ) down=true; 915 else if( mData[i] > mData[i+1] ) down=true; 902 916 } 903 917 … … 906 920 up = down = false; 907 921 if( imax < 0 ) { 908 imax = i; maxi = data[i];909 } else if( data[i] >= maxi ) {922 imax = i; maxi = mData[i]; 923 } else if( mData[i] >= maxi ) { 910 924 imaxn = imax; maxn = maxi; 911 imax = i; maxi = data[i];925 imax = i; maxi = mData[i]; 912 926 } else { 913 if( imaxn < 0 || data[i] >= maxn ) { imaxn = i; maxn = data[i]; }927 if( imaxn < 0 || mData[i] >= maxn ) { imaxn = i; maxn = mData[i]; } 914 928 } 915 929 } … … 925 939 L'histo est suppose etre remplit de valeurs positives 926 940 */ 927 float Histo::FitMax(int degree, float frac, intdebug) const941 r_8 Histo::FitMax(int_4 degree, r_8 frac, int_4 debug) const 928 942 { 929 943 if (degree < 2 || degree > 3) degree = 3; … … 935 949 if (NEntries() < 1) THROW(inconsistentErr); 936 950 937 int iMax = IMax();938 floathmax = (*this)(iMax);939 floatxCenter = BinCenter(iMax);951 int_4 iMax = IMax(); 952 r_8 hmax = (*this)(iMax); 953 r_8 xCenter = BinCenter(iMax); 940 954 941 955 if(debug>1) … … 944 958 /* find limits at frac*hmax */ 945 959 946 floatlimit = frac*hmax;947 948 volatile int iLow = iMax;960 r_8 limit = frac*hmax; 961 962 volatile int_4 iLow = iMax; 949 963 while (iLow>0 && (*this)(iLow)>limit) iLow--; 950 964 951 volatile int iHigh = iMax;965 volatile int_4 iHigh = iMax; 952 966 while (iHigh<NBins()-1 && (*this)(iHigh)>limit) iHigh++; 953 967 954 int nLowHigh;968 int_4 nLowHigh; 955 969 for(;;) { 956 970 nLowHigh = 0; 957 for (int i=iLow; i<=iHigh; i++) if((*this)(i)>0) {958 if(! err2) nLowHigh++;971 for (int_4 i=iLow; i<=iHigh; i++) if((*this)(i)>0) { 972 if(!mErr2) nLowHigh++; 959 973 else if(Error2(i)>0.) nLowHigh++; 960 974 } … … 977 991 TVector<r_8> e2Fit(nLowHigh); 978 992 TVector<r_8> errcoef(1); 979 int ii = 0;980 for (int j=iLow; j<=iHigh; j++) {993 int_4 ii = 0; 994 for (int_4 j=iLow; j<=iHigh; j++) { 981 995 if ((*this)(j)>0) { 982 if(! err2) {996 if(!mErr2) { 983 997 xFit(ii) = BinCenter(j)-xCenter; 984 998 yFit(ii) = (*this)(j); … … 994 1008 } 995 1009 if(debug>4) { 996 int k;1010 int_4 k; 997 1011 for(k=0;k<nLowHigh;k++) cout<<" "<<xFit(k); cout<<endl; 998 1012 for(k=0;k<nLowHigh;k++) cout<<" "<<yFit(k); cout<<endl; … … 1009 1023 } ENDTRY 1010 1024 1011 int DPolDeg = pol.Degre();1012 floatfd = 0.;1025 int_4 DPolDeg = pol.Degre(); 1026 r_8 fd = 0.; 1013 1027 1014 1028 if (DPolDeg == 0) { … … 1026 1040 } else if (DPolDeg == 1) { 1027 1041 // on est dans le cas d'un fit de parabole 1028 doubler=0;1042 r_8 r=0; 1029 1043 if (pol.Root1(r)==0) THROW(inconsistentErr); 1030 1044 fd = r + xCenter; 1031 1045 } else if (DPolDeg == 2) { 1032 1046 // on est dans le cas d'un fit de cubique 1033 doubler1=0;1034 doubler2=0;1047 r_8 r1=0; 1048 r_8 r2=0; 1035 1049 if (pol.Root2(r1,r2) == 0) THROW(inconsistentErr); 1036 1050 pol.Derivate(); … … 1041 1055 } 1042 1056 1043 if(fd>m ax) fd = max;1044 if(fd<m in) fd = min;1057 if(fd>mMax) fd = mMax; 1058 if(fd<mMin) fd = mMin; 1045 1059 1046 1060 if (debug>1) … … 1060 1074 L'histo est suppose etre remplit de valeurs positives 1061 1075 */ 1062 float Histo::FindWidth(float frac, intdebug) const1063 { 1064 floatxmax = BinCenter( IMax() );1076 r_8 Histo::FindWidth(r_8 frac, int_4 debug) const 1077 { 1078 r_8 xmax = BinCenter( IMax() ); 1065 1079 return FindWidth(xmax,frac,debug); 1066 1080 } … … 1071 1085 L'histo est suppose etre remplit de valeurs positives 1072 1086 */ 1073 float Histo::FindWidth(float xmax,float frac, intdebug) const1087 r_8 Histo::FindWidth(r_8 xmax,r_8 frac, int_4 debug) const 1074 1088 { 1075 1089 if (frac <= 0 || frac >= 1.) frac = 0.5; … … 1085 1099 if (NBins() < 3) THROW(inconsistentErr); 1086 1100 1087 int iMax = FindBin(xmax);1101 int_4 iMax = FindBin(xmax); 1088 1102 if (iMax<0 || iMax>=NBins()) THROW(inconsistentErr); 1089 float hmax = data[iMax];1090 floatlimit = frac*hmax;1103 r_8 hmax = mData[iMax]; 1104 r_8 limit = frac*hmax; 1091 1105 if (debug > 1) 1092 1106 cout << " Max histo[" << iMax << "] = " << hmax 1093 1107 << ", limite " << limit << endl; 1094 1108 1095 int iLow = iMax;1096 while (iLow>=0 && data[iLow]>limit) iLow--;1109 int_4 iLow = iMax; 1110 while (iLow>=0 && mData[iLow]>limit) iLow--; 1097 1111 if( iLow < 0 ) iLow = 0; 1098 1112 1099 int iHigh = iMax;1100 while (iHigh<NBins() && data[iHigh]>limit) iHigh++;1113 int_4 iHigh = iMax; 1114 while (iHigh<NBins() && mData[iHigh]>limit) iHigh++; 1101 1115 if( iHigh >=NBins() ) iHigh = NBins()-1; 1102 1116 1103 floatxlow = BinCenter(iLow);1104 float ylow = data[iLow];1105 1106 floatxlow1=xlow, ylow1=ylow;1117 r_8 xlow = BinCenter(iLow); 1118 r_8 ylow = mData[iLow]; 1119 1120 r_8 xlow1=xlow, ylow1=ylow; 1107 1121 if(iLow+1<NBins()) { 1108 1122 xlow1 = BinCenter(iLow+1); 1109 ylow1 = data[iLow+1];1110 } 1111 1112 floatxhigh = BinCenter(iHigh);1113 float yhigh = data[iHigh];1114 1115 floatxhigh1=xhigh, yhigh1=yhigh;1123 ylow1 = mData[iLow+1]; 1124 } 1125 1126 r_8 xhigh = BinCenter(iHigh); 1127 r_8 yhigh = mData[iHigh]; 1128 1129 r_8 xhigh1=xhigh, yhigh1=yhigh; 1116 1130 if(iHigh-1>=0) { 1117 1131 xhigh1 = BinCenter(iHigh-1); 1118 yhigh1 = data[iHigh-1];1119 } 1120 1121 floatxlpred,xhpred,wd;1132 yhigh1 = mData[iHigh-1]; 1133 } 1134 1135 r_8 xlpred,xhpred,wd; 1122 1136 1123 1137 if(ylow1>ylow) { … … 1148 1162 Cf suivant mais im est le bin du maximum de l'histo 1149 1163 */ 1150 int Histo::EstimeMax(float& xm,intSzPav)1151 { 1152 int im = IMax();1164 int_4 Histo::EstimeMax(r_8& xm,int_4 SzPav) 1165 { 1166 int_4 im = IMax(); 1153 1167 return EstimeMax(im,xm,SzPav); 1154 1168 } … … 1166 1180 \endverbatim 1167 1181 */ 1168 int Histo::EstimeMax(int& im,float& xm,intSzPav)1182 int_4 Histo::EstimeMax(int& im,r_8& xm,int_4 SzPav) 1169 1183 { 1170 1184 xm = 0; 1171 1185 if( SzPav <= 0 ) return -1; 1172 if( im < 0 || im >= bins ) return -1;1186 if( im < 0 || im >= mBins ) return -1; 1173 1187 1174 1188 if( SzPav%2 == 0 ) SzPav++; 1175 1189 SzPav = (SzPav-1)/2; 1176 1190 1177 int rc = 0;1178 doubledxm = 0, wx = 0;1179 for(int i=im-SzPav;i<=im+SzPav;i++) {1180 if( i<0 || i>= bins ) {rc=1; continue;}1191 int_4 rc = 0; 1192 r_8 dxm = 0, wx = 0; 1193 for(int_4 i=im-SzPav;i<=im+SzPav;i++) { 1194 if( i<0 || i>= mBins ) {rc=1; continue;} 1181 1195 dxm += BinCenter(i) * (*this)(i); 1182 1196 wx += (*this)(i); … … 1198 1212 et a droite (widthD) 1199 1213 */ 1200 void Histo::EstimeWidthS( float frac,float& widthG,float& widthD)1201 { 1202 int i;1214 void Histo::EstimeWidthS(r_8 frac,r_8& widthG,r_8& widthD) 1215 { 1216 int_4 i; 1203 1217 widthG = widthD = -1.; 1204 if( bins<=1 || frac<=0. || frac>=1. ) return;1205 1206 int imax = 0;1207 float maxi = data[0];1208 for(i=1;i< bins;i++) if(data[i]>maxi) {imax=i; maxi=data[i];}1209 floatxmax = BinCenter(imax);1210 floatmaxf = maxi * frac;1218 if( mBins<=1 || frac<=0. || frac>=1. ) return; 1219 1220 int_4 imax = 0; 1221 r_8 maxi = mData[0]; 1222 for(i=1;i<mBins;i++) if(mData[i]>maxi) {imax=i; maxi=mData[i];} 1223 r_8 xmax = BinCenter(imax); 1224 r_8 maxf = maxi * frac; 1211 1225 1212 1226 // recherche du sigma a gauche 1213 1227 widthG = 0.; 1214 for(i=imax;i>=0;i--) if( data[i] <= maxf ) break;1228 for(i=imax;i>=0;i--) if( mData[i] <= maxf ) break; 1215 1229 if(i<0) i=0; 1216 1230 if(i<imax) { 1217 if( data[i+1] != data[i] ) {1231 if( mData[i+1] != mData[i] ) { 1218 1232 widthG = BinCenter(i) + binWidth 1219 * (maxf- data[i])/(data[i+1]-data[i]);1233 * (maxf-mData[i])/(mData[i+1]-mData[i]); 1220 1234 widthG = xmax - widthG; 1221 1235 } else widthG = xmax - BinCenter(i); … … 1224 1238 // recherche du sigma a droite 1225 1239 widthD = 0.; 1226 for(i=imax;i< bins;i++) if( data[i] <= maxf ) break;1227 if(i>= bins) i=bins-1;1240 for(i=imax;i<mBins;i++) if( mData[i] <= maxf ) break; 1241 if(i>=mBins) i=mBins-1; 1228 1242 if(i>imax) { 1229 if( data[i] != data[i-1] ) {1243 if( mData[i] != mData[i-1] ) { 1230 1244 widthD = BinCenter(i) - binWidth 1231 * (maxf- data[i])/(data[i-1]-data[i]);1245 * (maxf-mData[i])/(mData[i-1]-mData[i]); 1232 1246 widthD -= xmax; 1233 1247 } else widthD = BinCenter(i) - xmax; … … 1257 1271 \endverbatim 1258 1272 */ 1259 int Histo::Fit(GeneralFit& gfit,unsigned short typ_err)1273 int_4 Histo::Fit(GeneralFit& gfit,unsigned short typ_err) 1260 1274 { 1261 1275 if(NBins()<=0) return -1000; … … 1264 1278 GeneralFitData mydata(1,NBins()); 1265 1279 1266 for(int i=0;i<NBins();i++) {1267 double x = (double)BinCenter(i);1268 double f = (double)(*this)(i);1269 double saf = sqrt(fabs((double)f)); if(saf<1.) saf=1.;1270 doublee=0.;1280 for(int_4 i=0;i<NBins();i++) { 1281 r_8 x = BinCenter(i); 1282 r_8 f = (*this)(i); 1283 r_8 saf = sqrt(fabs( f)); if(saf<1.) saf=1.; 1284 r_8 e=0.; 1271 1285 if(typ_err==0) {if(HasErrors()) e=Error(i); else e=1.;} 1272 1286 else if(typ_err==1) {if(HasErrors()) e=Error(i); else e=saf;} … … 1295 1309 TVector<r_8> par = gfit.GetParm(); 1296 1310 Histo h(*this); 1297 for(int i=0;i<NBins();i++) {1298 double x = (double)BinCenter(i);1299 h(i) -= (float)f->Value(&x,par.Data());1311 for(int_4 i=0;i<NBins();i++) { 1312 r_8 x = BinCenter(i); 1313 h(i) -= f->Value(&x,par.Data()); 1300 1314 } 1301 1315 return h; … … 1314 1328 TVector<r_8> par = gfit.GetParm(); 1315 1329 Histo h(*this); 1316 for(int i=0;i<NBins();i++) {1317 double x = (double)BinCenter(i);1318 h(i) = (float)f->Value(&x,par.Data());1330 for(int_4 i=0;i<NBins();i++) { 1331 r_8 x = BinCenter(i); 1332 h(i) = f->Value(&x,par.Data()); 1319 1333 } 1320 1334 return h; … … 1334 1348 sinon : hmin hmax 1335 1349 pflag < 0 : on imprime les informations (nbin,min,...) sans l'histogramme 1336 = 0 : on imprime "BinCenter(i) data[i]" (note "... ...")1350 = 0 : on imprime "BinCenter(i) mData[i]" (note "... ...") 1337 1351 bit 0 on : (v=1): numero_bin "... ..." 1338 1352 bit 1 on : (v=2): "... ..." erreur 1339 1353 \endverbatim 1340 1354 */ 1341 void Histo::PrintF(FILE * fp, int hdyn,float hmin, float hmax,intpflag,1342 int il, intih)1355 void Histo::PrintF(FILE * fp, int_4 hdyn,r_8 hmin, r_8 hmax,int_4 pflag, 1356 int_4 il, int_4 ih) 1343 1357 { 1344 1358 1345 if( il > ih ) { il = 0; ih = bins-1; }1359 if( il > ih ) { il = 0; ih = mBins-1; } 1346 1360 if( il < 0 ) il = 0; 1347 if( ih >= bins ) ih = bins-1;1348 1349 double dhmin = (double)hmin;1350 double dhmax = (double)hmax;1351 doublehb,hbmn,hbmx;1361 if( ih >= mBins ) ih = mBins-1; 1362 1363 r_8 dhmin = hmin; 1364 r_8 dhmax = hmax; 1365 r_8 hb,hbmn,hbmx; 1352 1366 1353 1367 if(hdyn==0) hdyn = 100; … … 1355 1369 cout << "~Histo::Print " 1356 1370 << " nHist=" << nHist << " nEntries=" << nEntries 1357 << " under=" << under << " over=" << over << endl;1358 cout << " bins=" << bins1359 << " min=" << m in << " max=" << max1371 << " mUnder=" << mUnder << " mOver=" << mOver << endl; 1372 cout << " mBins=" << mBins 1373 << " min=" << mMin << " mMax=" << mMax 1360 1374 << " binWidth=" << binWidth << endl; 1361 1375 cout << " mean=" << Mean() << " r.m.s=" << Sigma() … … 1364 1378 if(hdyn<0 || pflag<0 ) return; 1365 1379 1366 if(dhmax<=dhmin) { if(hmin != 0.) dhmin = (double)VMin(); else dhmin=0.;1367 dhmax = (double)VMax(); }1380 if(dhmax<=dhmin) { if(hmin != 0.) dhmin = VMin(); else dhmin=0.; 1381 dhmax = VMax(); } 1368 1382 if(dhmin>dhmax) return; 1369 1383 if(dhmin==dhmax) {dhmin -= 1.; dhmax += 1.;} 1370 double wb = (dhmax-dhmin) / (double)hdyn;1384 r_8 wb = (dhmax-dhmin) / hdyn; 1371 1385 1372 1386 // determination de la position de la valeur zero 1373 int i0 = (int)(-dhmin/wb);1387 int_4 i0 = (int_4)(-dhmin/wb); 1374 1388 1375 1389 // si le zero est dans la dynamique, … … 1389 1403 dhmax -= hbmx; 1390 1404 } 1391 wb = (dhmax-dhmin) / (double)hdyn;1392 i0 = (int )(-dhmin/wb);1405 wb = (dhmax-dhmin) / hdyn; 1406 i0 = (int_4)(-dhmin/wb); 1393 1407 } 1394 1408 } … … 1401 1415 1402 1416 // premiere ligne 1403 {for(int i=0;i<hdyn;i++) s[i] = '=';}1417 {for(int_4 i=0;i<hdyn;i++) s[i] = '=';} 1404 1418 if( 0 <= i0 && i0 < hdyn ) s[i0] = '0'; 1405 1419 if(pflag&1) fprintf( fp, "===="); 1406 1420 fprintf( fp, "======================"); 1407 if(pflag&2 && err2!=NULL) fprintf( fp, "===========");1421 if(pflag&2 && mErr2!=NULL) fprintf( fp, "==========="); 1408 1422 fprintf( fp, "==%s\n",s); 1409 1423 1410 1424 // histogramme 1411 {for(int i=il;i<=ih;i++) {1412 for(int k=0;k<hdyn;k++) s[k] = ' ';1425 {for(int_4 i=il;i<=ih;i++) { 1426 for(int_4 k=0;k<hdyn;k++) s[k] = ' '; 1413 1427 hb = (*this)(i); 1414 1428 1415 1429 //choix du bin (hdyn bin entre [dhmin,dhmax[ 1416 int ii = (int)( (hb-dhmin)/wb );1430 int_4 ii = (int_4)( (hb-dhmin)/wb ); 1417 1431 if(ii<0) ii = 0; else if(ii>=hdyn) ii = hdyn-1; 1418 1432 … … 1424 1438 if(i0<0) { 1425 1439 // courbe entierement positive 1426 for(int k=0;k<=ii;k++) s[k] = 'X';1440 for(int_4 k=0;k<=ii;k++) s[k] = 'X'; 1427 1441 } else if(i0>=hdyn) { 1428 1442 // courbe entierement negative 1429 for(int k=hdyn-1;k>=ii;k--) s[k] = 'X';1443 for(int_4 k=hdyn-1;k>=ii;k--) s[k] = 'X'; 1430 1444 } else { 1431 1445 // courbe positive et negative 1432 1446 s[i0] = '|'; 1433 if(ii>i0) for(int k=i0+1;k<=ii;k++) s[k] = 'X';1434 else if(ii<i0) for(int k=ii;k<i0;k++) s[k] = 'X';1447 if(ii>i0) for(int_4 k=i0+1;k<=ii;k++) s[k] = 'X'; 1448 else if(ii<i0) for(int_4 k=ii;k<i0;k++) s[k] = 'X'; 1435 1449 else s[ii] = 'X'; 1436 1450 } 1437 1451 1438 1452 // valeur a mettre dans le bin le plus haut/bas 1439 int ib;1440 if(hb>0.) ib = (int )( 10.*(hb-hbmn)/(hbmx-hbmn) );1441 else if(hb<0.) ib = (int )( 10.*(hbmx-hb)/(hbmx-hbmn) );1453 int_4 ib; 1454 if(hb>0.) ib = (int_4)( 10.*(hb-hbmn)/(hbmx-hbmn) ); 1455 else if(hb<0.) ib = (int_4)( 10.*(hbmx-hb)/(hbmx-hbmn) ); 1442 1456 else ib = -1; 1443 1457 if(ib==-1) s[ii] = '|'; 1444 1458 else if(ib==0) s[ii] = '.'; 1445 else if(ib>0 && ib<10) s[ii] = (char)((int ) '0' + ib);1459 else if(ib>0 && ib<10) s[ii] = (char)((int_4) '0' + ib); 1446 1460 1447 1461 // traitement des saturations +/- … … 1451 1465 if(pflag&1) fprintf( fp, "%3d ",i); 1452 1466 fprintf( fp, "%10.4g %10.4g ",BinCenter(i),hb); 1453 if(pflag&2 && err2!=NULL) fprintf( fp, "%10.4g ",Error(i));1467 if(pflag&2 && mErr2!=NULL) fprintf( fp, "%10.4g ",Error(i)); 1454 1468 fprintf( fp, "= %s\n",s); 1455 1469 }} 1456 1470 1457 1471 // derniere ligne 1458 for(int i=0;i<hdyn;i++) s[i] = '=';1472 for(int_4 i=0;i<hdyn;i++) s[i] = '='; 1459 1473 if( 0 <= i0 && i0 < hdyn ) s[i0] = '0'; 1460 1474 if(pflag&1) fprintf( fp, "===="); 1461 1475 fprintf( fp, "======================"); 1462 if(pflag&2 && err2!=NULL) fprintf( fp, "===========");1476 if(pflag&2 && mErr2!=NULL) fprintf( fp, "==========="); 1463 1477 fprintf( fp, "==%s\n",s); 1464 1478 1465 1479 // valeur basse des bins (sur ["ndig-1" digits + signe] = ndig char (>=3)) 1466 const int ndig = 7;1480 const int_4 ndig = 7; 1467 1481 char sn[2*ndig+10]; 1468 1482 hb = ( fabs(dhmin) > fabs(dhmax) ) ? fabs(dhmin) : fabs(dhmax); 1469 int n;1470 if( hb > 0. ) n = (int )(log10(hb*1.00000001)); else n = 1;1471 double scaledig = pow(10.,(double) ndig-2);1472 double expo = scaledig/pow(10.,(double) n);1483 int_4 n; 1484 if( hb > 0. ) n = (int_4)(log10(hb*1.00000001)); else n = 1; 1485 r_8 scaledig = pow(10.,(r_8) ndig-2); 1486 r_8 expo = scaledig/pow(10.,(r_8) n); 1473 1487 // cout <<"n="<<n<<" hb="<<hb<<" scaledig="<<scaledig<<" expo="<<expo<<endl; 1474 for(int k=0;k<ndig;k++) {1475 for(int i=0;i<hdyn;i++) s[i] = ' ';1476 {for(int i=0;i<hdyn;i++) {1477 n = (int )( (dhmin + i*wb)*expo );1478 for(int j=0;j<2*ndig+10;j++) sn[j] = ' ';1488 for(int_4 k=0;k<ndig;k++) { 1489 for(int_4 i=0;i<hdyn;i++) s[i] = ' '; 1490 {for(int_4 i=0;i<hdyn;i++) { 1491 n = (int_4)( (dhmin + i*wb)*expo ); 1492 for(int_4 j=0;j<2*ndig+10;j++) sn[j] = ' '; 1479 1493 sprintf(sn,"%d%c",n,'\0'); 1480 1494 strip(sn,'B',' '); 1481 1495 // cout <<"n="<<n<<" sn=("<<sn<<") l="<<strlen(sn)<<" k="<<k; 1482 if( (int ) strlen(sn) > k ) s[i] = sn[k];1496 if( (int_4) strlen(sn) > k ) s[i] = sn[k]; 1483 1497 // cout <<" s=("<<s<<")"<<endl; 1484 1498 }} 1485 1499 if(pflag&1) fprintf( fp, " "); 1486 1500 fprintf( fp, " "); 1487 if(pflag&2 && err2!=NULL) fprintf( fp, " ");1501 if(pflag&2 && mErr2!=NULL) fprintf( fp, " "); 1488 1502 fprintf( fp, " %s\n",s); 1489 1503 } … … 1497 1511 Impression de l'histogramme sur stdout 1498 1512 */ 1499 void Histo::Print(int hdyn,float hmin, float hmax,intpflag,1500 int il, intih)1513 void Histo::Print(int_4 hdyn,r_8 hmin, r_8 hmax,int_4 pflag, 1514 int_4 il, int_4 ih) 1501 1515 { 1502 1516 Histo::PrintF(stdout, hdyn, hmin, hmax, pflag, il, ih); … … 1523 1537 1524 1538 // Lecture des valeurs 1525 is.Get(dobj-> bins);1539 is.Get(dobj->mBins); 1526 1540 is.Get(dobj->nEntries); 1527 1541 int_4 errok; … … 1529 1543 1530 1544 is.Get(dobj->binWidth); 1531 is.Get(dobj->m in);1532 is.Get(dobj->m ax);1533 is.Get(dobj-> under);1534 is.Get(dobj-> over);1545 is.Get(dobj->mMin); 1546 is.Get(dobj->mMax); 1547 is.Get(dobj->mUnder); 1548 is.Get(dobj->mOver); 1535 1549 1536 1550 is.Get(dobj->nHist); 1537 1551 1538 1552 // Lecture des donnees Histo 1D 1539 dobj-> data = new float[dobj->bins];1553 dobj->mData = new r_8[dobj->mBins]; 1540 1554 is.GetLine(strg, 255); 1541 is.Get(dobj-> data, dobj->bins);1555 is.Get(dobj->mData, dobj->mBins); 1542 1556 1543 1557 // Lecture des erreurs 1544 1558 if(errok) { 1545 1559 is.GetLine(strg, 255); 1546 dobj-> err2 = new double[dobj->bins];1547 is.Get(dobj-> err2, dobj->bins);1560 dobj->mErr2 = new r_8[dobj->mBins]; 1561 is.Get(dobj->mErr2, dobj->mBins); 1548 1562 } 1549 1563 … … 1557 1571 1558 1572 // Que faut-il ecrire? 1559 int_4 errok = (dobj-> err2) ? 1 : 0;1573 int_4 errok = (dobj->mErr2) ? 1 : 0; 1560 1574 1561 1575 // Ecriture entete pour identifier facilement 1562 sprintf(strg," bins=%6d NEnt=%15d errok=%1d",dobj->bins,dobj->nEntries,errok);1576 sprintf(strg,"mBins=%6d NEnt=%15d errok=%1d",dobj->mBins,dobj->nEntries,errok); 1563 1577 os.PutLine(strg); 1564 sprintf(strg,"binw=%g m in=%g max=%g",dobj->binWidth,dobj->min,dobj->max);1578 sprintf(strg,"binw=%g mMin=%g mMax=%g",dobj->binWidth,dobj->mMin,dobj->mMax); 1565 1579 os.PutLine(strg); 1566 sprintf(strg, " under=%g over=%g nHist=%g",dobj->under,dobj->over,dobj->nHist);1580 sprintf(strg, "mUnder=%g mOver=%g nHist=%g",dobj->mUnder,dobj->mOver,dobj->nHist); 1567 1581 os.PutLine(strg); 1568 1582 1569 1583 // Ecriture des valeurs 1570 os.Put(dobj-> bins);1584 os.Put(dobj->mBins); 1571 1585 os.Put(dobj->nEntries); 1572 1586 os.Put(errok); 1573 1587 1574 1588 os.Put(dobj->binWidth); 1575 os.Put(dobj->m in);1576 os.Put(dobj->m ax);1577 os.Put(dobj-> under);1578 os.Put(dobj-> over);1589 os.Put(dobj->mMin); 1590 os.Put(dobj->mMax); 1591 os.Put(dobj->mUnder); 1592 os.Put(dobj->mOver); 1579 1593 1580 1594 os.Put(dobj->nHist); 1581 1595 1582 1596 // Ecriture des donnees Histo 1D 1583 sprintf(strg,"Histo: Tableau des donnees %d",dobj-> bins);1597 sprintf(strg,"Histo: Tableau des donnees %d",dobj->mBins); 1584 1598 os.PutLine(strg); 1585 os.Put(dobj-> data, dobj->bins);1599 os.Put(dobj->mData, dobj->mBins); 1586 1600 1587 1601 // Ecriture des erreurs 1588 1602 if(errok) { 1589 sprintf(strg,"Histo: Tableau des erreurs %d",dobj-> bins);1603 sprintf(strg,"Histo: Tableau des erreurs %d",dobj->mBins); 1590 1604 os.PutLine(strg); 1591 os.Put(dobj-> err2, dobj->bins);1605 os.Put(dobj->mErr2, dobj->mBins); 1592 1606 } 1593 1607 -
trunk/SophyaLib/HiStats/histos.h
r1089 r1092 1 1 // This may look like C code, but it is really -*- C++ -*- 2 2 // 3 // $Id: histos.h,v 1.1 0 2000-07-25 10:20:43ansari Exp $3 // $Id: histos.h,v 1.11 2000-07-26 13:15:15 ansari Exp $ 4 4 // 5 5 … … 26 26 // CREATOR / DESTRUCTOR 27 27 Histo(); 28 Histo(float xMin, float xMax, int nBin=100); 28 Histo(r_8 xMin, r_8 xMax, int_4 nBin=100); 29 Histo(r_4 xMin, r_4 xMax, int_4 nBin=100); 29 30 Histo(const Histo& H); 30 31 virtual ~Histo(); … … 35 36 // UPDATING or SETTING 36 37 void Zero(); 37 void Add( float x, floatw = 1.);38 void AddBin(int numBin, floatw = 1.);39 void SetBin( float x, floatw = 1.);40 void SetBin(int numBin, floatw = 1.);41 void SetErr2( float x, doublee2);42 void SetErr2(int numBin, doublee2);43 void SetErr( float x, floate);44 void SetErr(int numBin, floate);38 void Add(r_8 x, r_8 w = 1.); 39 void AddBin(int_4 numBin, r_8 w = 1.); 40 void SetBin(r_8 x, r_8 w = 1.); 41 void SetBin(int_4 numBin, r_8 w = 1.); 42 void SetErr2(r_8 x, r_8 e2); 43 void SetErr2(int_4 numBin, r_8 e2); 44 void SetErr(r_8 x, r_8 e); 45 void SetErr(int_4 numBin, r_8 e); 45 46 virtual inline void UpdateHisto() const { return;} 46 47 47 48 // Operators 48 49 Histo& operator = (const Histo& h); 49 Histo& operator *= ( doubleb);50 Histo& operator /= ( doubleb);51 Histo& operator += ( doubleb);52 Histo& operator -= ( doubleb);50 Histo& operator *= (r_8 b); 51 Histo& operator /= (r_8 b); 52 Histo& operator += (r_8 b); 53 Histo& operator -= (r_8 b); 53 54 Histo& operator += (const Histo& a); 54 55 Histo& operator -= (const Histo& a); … … 61 62 void GetError2(TVector<r_8>& v); 62 63 void GetError(TVector<r_8>& v); 63 void PutValue(TVector<r_8>& v, int ierr=0);64 void PutValueAdd(TVector<r_8> &v, int ierr=0);64 void PutValue(TVector<r_8>& v, int_4 ierr=0); 65 void PutValueAdd(TVector<r_8> &v, int_4 ierr=0); 65 66 void PutError2(TVector<r_8>& v); 66 67 void PutError2Add(TVector<r_8>& v); … … 69 70 // INLINES 70 71 //! Retourne l'abscisse minimum 71 inline float XMin() const {return min;}72 inline r_8 XMin() const {return mMin;} 72 73 //! Retourne l'abscisse maximum 73 inline float XMax() const {return max;}74 inline r_8 XMax() const {return mMax;} 74 75 //! Retourne le nombre de bins 75 inline int_4 NBins() const {return bins;}76 inline int_4 NBins() const {return mBins;} 76 77 //! Retourne la largeur du bin 77 inline floatBinWidth() const {return binWidth;}78 inline r_8 BinWidth() const {return binWidth;} 78 79 //! Retourne le pointeur sur le tableaux des contenus 79 inline float* Bins() const {return data;}80 inline r_8* Bins() const {return mData;} 80 81 //! Retourne le contenu du bin i 81 inline float operator()(int i) const {return data[i];}82 inline r_8 operator()(int_4 i) const {return mData[i];} 82 83 //! Remplit le contenu du bin i 83 inline float& operator()(int i) {return data[i];}84 inline r_8& operator()(int_4 i) {return mData[i];} 84 85 //! retourne "true" si il y a des erreurs stoquees 85 86 inline bool HasErrors() 86 {if( err2) return true; else return false;}87 {if(mErr2) return true; else return false;} 87 88 //! Retourne l'erreur du bin i 88 inline float Error(inti) const89 {if( err2) {if(err2[i]>0.) return sqrt(err2[i]); else return 0.;}89 inline r_8 Error(int_4 i) const 90 {if(mErr2) {if(mErr2[i]>0.) return sqrt(mErr2[i]); else return 0.;} 90 91 else return 0.;} 91 92 //! Retourne l'erreur au carre du bin i 92 inline double Error2(inti) const93 {if( err2) return err2[i]; else return 0.;}93 inline r_8 Error2(int_4 i) const 94 {if(mErr2) return mErr2[i]; else return 0.;} 94 95 //! Remplit l'erreur au carre du bin i 95 inline double& Error2(int i) {return err2[i];}96 inline r_8& Error2(int_4 i) {return mErr2[i];} 96 97 //! Retourne la somme ponderee 97 inline float NData() const {return (float)nHist;}98 inline r_8 NData() const {return nHist;} 98 99 //! Retourne le nombre d'entrees 99 inline floatNEntries() const {return nEntries;}100 inline r_8 NEntries() const {return nEntries;} 100 101 //! Retourne le nombre d'overflow 101 inline float NOver() const {return over;}102 inline r_8 NOver() const {return mOver;} 102 103 //! Retourne le nombre d'underflow 103 inline float NUnder() const {return under;}104 inline r_8 NUnder() const {return mUnder;} 104 105 105 106 //! Retourne l'abscisse du bord inferieur du bin i 106 inline float BinLowEdge(int i) const {return min + i*binWidth;}107 inline r_8 BinLowEdge(int_4 i) const {return mMin + i*binWidth;} 107 108 //! Retourne l'abscisse du centre du bin i 108 inline float BinCenter(int i) const {return min + (i+0.5)*binWidth;}109 inline r_8 BinCenter(int_4 i) const {return mMin + (i+0.5)*binWidth;} 109 110 //! Retourne l'abscisse du bord superieur du bin i 110 inline float BinHighEdge(int i) const {return min + (i+1)*binWidth;}111 inline r_8 BinHighEdge(int_4 i) const {return mMin + (i+1)*binWidth;} 111 112 //! Retourne le numero du bin contenant l'abscisse x 112 inline int_4 FindBin( floatx) const113 {return (int_4) floor f((x - min) / binWidth);}113 inline int_4 FindBin(r_8 x) const 114 {return (int_4) floor((x - mMin) / binWidth);} 114 115 115 116 // Info, statistique et calculs sur les histogrammes 116 int 117 int 118 int 119 int 120 floatVMax() const;121 floatVMin() const;122 floatMean() const;123 floatSigma() const;124 float MeanLH(int il,intih) const;125 float SigmaLH(int il,intih) const;126 float Mean(float x0, floatdx) const;127 float Sigma(float x0, floatdx) const;128 floatCleanedMean() const;129 float CleanedMean(float& sigma) const;130 int BinPercent(floatper) const;131 int BinPercent(float x,float per,int& imin,int& imax);132 int BinPercent(float x,float per,float& xmin,float& xmax);133 void HInteg( floatnorm = 0.);117 int_4 BinNonNul() const; 118 int_4 ErrNonNul() const; 119 int_4 IMax() const; 120 int_4 IMin() const; 121 r_8 VMax() const; 122 r_8 VMin() const; 123 r_8 Mean() const; 124 r_8 Sigma() const; 125 r_8 MeanLH(int_4 il,int_4 ih) const; 126 r_8 SigmaLH(int_4 il,int_4 ih) const; 127 r_8 Mean(r_8 x0, r_8 dx) const; 128 r_8 Sigma(r_8 x0, r_8 dx) const; 129 r_8 CleanedMean() const; 130 r_8 CleanedMean(r_8& sigma) const; 131 int_4 BinPercent(r_8 per) const; 132 int_4 BinPercent(r_8 x,r_8 per,int_4& imin,int_4& imax); 133 int_4 BinPercent(r_8 x,r_8 per,r_8& xmin,r_8& xmax); 134 void HInteg(r_8 norm = 0.); 134 135 void HDeriv(); 135 virtual void HRebin(int nbinew);136 137 int MaxiLocal(float& maxi,int& imax,float& maxn,int& imaxn);138 float FitMax(int degree=2, float frac=0.5f, intdebug=0) const;139 float FindWidth(float xmax,float frac=0.5f, intdebug=0) const;140 float FindWidth(float frac=0.5f, intdebug=0) const;141 int EstimeMax(float& xm,intSzPav = 3);142 int EstimeMax(int& im,float& xm,intSzPav = 3);143 void EstimeWidthS( float frac,float& widthG,float& widthD);136 virtual void HRebin(int_4 nbinew); 137 138 int_4 MaxiLocal(r_8& maxi,int_4& imax,r_8& maxn,int_4& imaxn); 139 r_8 FitMax(int_4 degree=2, r_8 frac=0.5f, int_4 debug=0) const; 140 r_8 FindWidth(r_8 xmax,r_8 frac=0.5f, int_4 debug=0) const; 141 r_8 FindWidth(r_8 frac=0.5f, int_4 debug=0) const; 142 int_4 EstimeMax(r_8& xm,int_4 SzPav = 3); 143 int_4 EstimeMax(int_4& im,r_8& xm,int_4 SzPav = 3); 144 void EstimeWidthS(r_8 frac,r_8& widthG,r_8& widthD); 144 145 145 146 // Fit 146 int 147 int_4 Fit(GeneralFit& gfit,unsigned short typ_err=0); 147 148 Histo FitResidus(GeneralFit& gfit); 148 149 Histo FitFunction(GeneralFit& gfit); 149 150 150 151 // Print et Display ASCII 151 void PrintF(FILE * fp, int dyn = 100, float hmin = 1., floathmax = -1.,152 int pflag = 0, int il = 1, intih = -1);153 void Print(int dyn = 100, float hmin = 1., floathmax = -1.,154 int pflag = 0, int il = 1, intih = -1);152 void PrintF(FILE * fp, int_4 dyn = 100, r_8 hmin = 1., r_8 hmax = -1., 153 int_4 pflag = 0, int_4 il = 1, int_4 ih = -1); 154 void Print(int_4 dyn = 100, r_8 hmin = 1., r_8 hmax = -1., 155 int_4 pflag = 0, int_4 il = 1, int_4 ih = -1); 155 156 156 157 protected: 157 158 void Delete(); 158 159 159 float* data;//!< donnees160 double* err2; //!< erreurs carrees161 float under;//!< underflow162 float over;//!< overflow163 doublenHist; //!< somme ponderee des entrees164 int_4 165 int_4 bins;//!< nombre de bins166 float min;//!< abscisse minimum167 float max;//!< abscisse maximum168 floatbinWidth; //!< largeur du bin160 r_8* mData; //!< donnees 161 r_8* mErr2; //!< erreurs carrees 162 r_8 mUnder; //!< underflow 163 r_8 mOver; //!< overflow 164 r_8 nHist; //!< somme ponderee des entrees 165 int_4 nEntries; //!< nombre d'entrees 166 int_4 mBins; //!< nombre de bins 167 r_8 mMin; //!< abscisse minimum 168 r_8 mMax; //!< abscisse maximum 169 r_8 binWidth; //!< largeur du bin 169 170 }; 170 171 … … 182 183 // ObjFileIO<Histo> 183 184 184 /*! \ingroup HiStats \fn operator*(const Histo&, double)185 /*! \ingroup HiStats \fn operator*(const Histo&,r_8) 185 186 \brief Operateur H2 = H1 * b */ 186 inline Histo operator * (const Histo& a, doubleb)187 inline Histo operator * (const Histo& a, r_8 b) 187 188 { 188 189 Histo result(a); … … 190 191 } 191 192 192 /*! \ingroup HiStats \fn operator*( double,const Histo&)193 /*! \ingroup HiStats \fn operator*(r_8,const Histo&) 193 194 \brief Operateur H2 = b * H1 */ 194 inline Histo operator * ( doubleb, const Histo& a)195 inline Histo operator * (r_8 b, const Histo& a) 195 196 { 196 197 Histo result(a); … … 198 199 } 199 200 200 /*! \ingroup HiStats \fn operator/(const Histo&, double)201 /*! \ingroup HiStats \fn operator/(const Histo&,r_8) 201 202 \brief Operateur H2 = H1 / b */ 202 inline Histo operator / (const Histo& a, doubleb)203 inline Histo operator / (const Histo& a, r_8 b) 203 204 { 204 205 Histo result(a); … … 206 207 } 207 208 208 /*! \ingroup HiStats \fn operator+(const Histo&, double)209 /*! \ingroup HiStats \fn operator+(const Histo&,r_8) 209 210 \brief Operateur H2 = H1 + b */ 210 inline Histo operator + (const Histo& a, doubleb)211 inline Histo operator + (const Histo& a, r_8 b) 211 212 { 212 213 Histo result(a); … … 214 215 } 215 216 216 /*! \ingroup HiStats \fn operator+( double,const Histo&)217 /*! \ingroup HiStats \fn operator+(r_8,const Histo&) 217 218 \brief Operateur H2 = b + H1 */ 218 inline Histo operator + ( doubleb, const Histo& a)219 inline Histo operator + (r_8 b, const Histo& a) 219 220 { 220 221 Histo result(a); … … 222 223 } 223 224 224 /*! \ingroup HiStats \fn operator-(const Histo&, double)225 /*! \ingroup HiStats \fn operator-(const Histo&,r_8) 225 226 \brief Operateur H2 = H1 - b */ 226 inline Histo operator - (const Histo& a, doubleb)227 inline Histo operator - (const Histo& a, r_8 b) 227 228 { 228 229 Histo result(a); … … 230 231 } 231 232 232 /*! \ingroup HiStats \fn operator-( double,const Histo&)233 /*! \ingroup HiStats \fn operator-(r_8,const Histo&) 233 234 \brief Operateur H2 = b - H1 */ 234 inline Histo operator - ( doubleb, const Histo& a)235 inline Histo operator - (r_8 b, const Histo& a) 235 236 { 236 237 Histo result(a); -
trunk/SophyaLib/HiStats/histos2.cc
r1064 r1092 43 43 entre xMin,xMax et yMin,yMax. 44 44 */ 45 Histo2D::Histo2D(float xMin, float xMax, int nxBin 46 ,float yMin, float yMax, int nyBin) 47 : data(new float[nxBin*nyBin]), err2(NULL) 45 Histo2D::Histo2D(r_8 xMin,r_8 xMax,int_4 nxBin,r_8 yMin,r_8 yMax,int_4 nyBin) 46 : mData(new r_8[nxBin*nyBin]), mErr2(NULL) 48 47 , nHist(0), nEntries(0) 49 , nx(nxBin), ny(nyBin), nxy(nxBin*nyBin)50 , xmin(xMin), xmax(xMax), ymin(yMin), ymax(yMax)51 , wbinx((xMax - xMin)/nxBin), wbiny((yMax - yMin)/nyBin)52 , hprojx(NULL), hprojy(NULL)48 , mNx(nxBin), mNy(nyBin), mNxy(nxBin*nyBin) 49 , mXmin(xMin), mXmax(xMax), mYmin(yMin), mYmax(yMax) 50 , mWBinx((xMax - xMin)/nxBin), mWBiny((yMax - yMin)/nyBin) 51 , mHprojx(NULL), mHprojy(NULL) 53 52 { 54 53 ASSERT(nxBin>0 && nyBin>0 && xMin<xMax && yMin<yMax); 55 for(int i=0;i<3;i++) for(int j=0;j<3;j++) over[i][j]=0.;54 for(int_4 i=0;i<3;i++) for(int_4 j=0;j<3;j++) mOver[i][j]=0.; 56 55 Zero(); 57 b_s.H = NULL;56 mB_s.H = NULL; 58 57 END_CONSTRUCTOR 59 58 } 60 59 61 60 /*! 61 Createur d'un histogramme 2D ayant nxBin,nyBin bins 62 entre xMin,xMax et yMin,yMax. 63 */ 64 Histo2D::Histo2D(r_4 xMin,r_4 xMax,int_4 nxBin,r_4 yMin,r_4 yMax,int_4 nyBin) 65 : mData(new r_8[nxBin*nyBin]), mErr2(NULL) 66 , nHist(0), nEntries(0) 67 , mNx(nxBin), mNy(nyBin), mNxy(nxBin*nyBin) 68 , mXmin((r_8)xMin), mXmax((r_8)xMax), mYmin((r_8)yMin), mYmax((r_8)yMax) 69 , mWBinx((xMax - xMin)/nxBin), mWBiny((yMax - yMin)/nyBin) 70 , mHprojx(NULL), mHprojy(NULL) 71 { 72 ASSERT(nxBin>0 && nyBin>0 && xMin<xMax && yMin<yMax); 73 for(int_4 i=0;i<3;i++) for(int_4 j=0;j<3;j++) mOver[i][j]=0.; 74 Zero(); 75 mB_s.H = NULL; 76 END_CONSTRUCTOR 77 } 78 79 /*! 62 80 Constructeur par copie. 63 81 */ 64 82 Histo2D::Histo2D(const Histo2D& h) 65 83 { 66 int i,j;67 data = new float[h.nxy];68 memcpy( data, h.data, h.nxy*sizeof(float));69 70 err2 = NULL;71 if(h. err2) {72 err2 = new double[h.nxy];73 memcpy( err2, h.err2, h.nxy*sizeof(double));84 int_4 i,j; 85 mData = new r_8[h.mNxy]; 86 memcpy(mData, h.mData, h.mNxy*sizeof(r_8)); 87 88 mErr2 = NULL; 89 if(h.mErr2) { 90 mErr2 = new r_8[h.mNxy]; 91 memcpy(mErr2, h.mErr2, h.mNxy*sizeof(r_8)); 74 92 } 75 93 76 94 nHist = h.nHist; nEntries = h.nEntries; 77 for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j]=h.over[i][j];78 nx = h.nx; ny = h.ny; nxy = h.nxy;79 xmin = h.xmin; xmax = h.xmax; ymin = h.ymin; ymax = h.ymax;80 wbinx = h.wbinx; wbiny = h.wbiny;81 b_s.H = NULL;82 83 hprojx = hprojy = NULL;84 if(h. hprojx) {95 for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j]=h.mOver[i][j]; 96 mNx = h.mNx; mNy = h.mNy; mNxy = h.mNxy; 97 mXmin = h.mXmin; mXmax = h.mXmax; mYmin = h.mYmin; mYmax = h.mYmax; 98 mWBinx = h.mWBinx; mWBiny = h.mWBiny; 99 mB_s.H = NULL; 100 101 mHprojx = mHprojy = NULL; 102 if(h.mHprojx) { 85 103 SetProjX(); 86 * hprojx = *(h.hprojx);87 } 88 if(h. hprojy) {104 *mHprojx = *(h.mHprojx); 105 } 106 if(h.mHprojy) { 89 107 SetProjY(); 90 * hprojy = *(h.hprojy);91 } 92 93 int nb;94 floatmin,max;108 *mHprojy = *(h.mHprojy); 109 } 110 111 int_4 nb; 112 r_8 min,max; 95 113 nb = h.NSliX(); 96 114 if(nb>0) { … … 130 148 */ 131 149 Histo2D::Histo2D() 132 : data(NULL), err2(NULL)150 : mData(NULL), mErr2(NULL) 133 151 , nHist(0), nEntries(0) 134 , nx(0), ny(0), nxy(0)135 , xmin(0), xmax(0), ymin(0), ymax(0)136 , wbinx(0), wbiny(0)137 , hprojx(NULL), hprojy(NULL)138 { 139 for(int i=0;i<3;i++) for(int j=0;j<3;j++) over[i][j]=0.;140 b_s.H = NULL;152 , mNx(0), mNy(0), mNxy(0) 153 , mXmin(0), mXmax(0), mYmin(0), mYmax(0) 154 , mWBinx(0), mWBiny(0) 155 , mHprojx(NULL), mHprojy(NULL) 156 { 157 for(int_4 i=0;i<3;i++) for(int_4 j=0;j<3;j++) mOver[i][j]=0.; 158 mB_s.H = NULL; 141 159 END_CONSTRUCTOR 142 160 } … … 148 166 void Histo2D::Delete() 149 167 { 150 if( data != NULL ) { delete[] data; data = NULL;}151 152 if( err2 != NULL ) { delete[] err2; err2 = NULL;}168 if( mData != NULL ) { delete[] mData; mData = NULL;} 169 170 if( mErr2 != NULL ) { delete[] mErr2; mErr2 = NULL;} 153 171 154 172 DelProj(); … … 162 180 nHist = 0; 163 181 nEntries = 0; 164 nx = 0; ny = 0; nxy = 0;165 xmin = 0; xmax = 0; ymin = 0; ymax = 0;166 wbinx = 0; wbiny = 0;167 for(int i=0;i<3;i++) for(int j=0;j<3;j++) over[i][j]=0.;168 b_s.H = NULL;182 mNx = 0; mNy = 0; mNxy = 0; 183 mXmin = 0; mXmax = 0; mYmin = 0; mYmax = 0; 184 mWBinx = 0; mWBiny = 0; 185 for(int_4 i=0;i<3;i++) for(int_4 j=0;j<3;j++) mOver[i][j]=0.; 186 mB_s.H = NULL; 169 187 } 170 188 … … 184 202 { 185 203 nHist = nEntries = 0; 186 for(int i=0;i<3;i++) for(int j=0;j<3;j++) over[i][j]=0.;187 memset( data, 0, nxy*sizeof(float));188 memset( over, 0, 9*sizeof(float));189 190 if( err2 != NULL ) memset(err2, 0, nxy*sizeof(double));204 for(int_4 i=0;i<3;i++) for(int_4 j=0;j<3;j++) mOver[i][j]=0.; 205 memset(mData, 0, mNxy*sizeof(r_8)); 206 memset(mOver, 0, 9*sizeof(r_8)); 207 208 if( mErr2 != NULL ) memset(mErr2, 0, mNxy*sizeof(r_8)); 191 209 192 210 ZeroProj(); … … 205 223 void Histo2D::Errors() 206 224 { 207 if( nxy > 0 ) {208 if( err2==NULL) err2 = new double[nxy];209 memset( err2, 0, nxy*sizeof(double));225 if( mNxy > 0 ) { 226 if(mErr2==NULL) mErr2 = new r_8[mNxy]; 227 memset(mErr2, 0, mNxy*sizeof(r_8)); 210 228 } 211 229 } … … 217 235 Histo2D& Histo2D::operator = (const Histo2D& h) 218 236 { 219 int i,j,nb;220 floatmin,max;237 int_4 i,j,nb; 238 r_8 min,max; 221 239 222 240 if(this == &h) return *this; 223 if( h. nxy > nxy ) Delete();224 if(! data) data = new float[h.nxy];225 if( !h. err2 && err2 ) { delete [] err2; err2=NULL;}226 if( h. err2 && !err2 ) err2 = new double[h.nxy];227 228 for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j] = h.over[i][j];241 if( h.mNxy > mNxy ) Delete(); 242 if(!mData) mData = new r_8[h.mNxy]; 243 if( !h.mErr2 && mErr2 ) { delete [] mErr2; mErr2=NULL;} 244 if( h.mErr2 && !mErr2 ) mErr2 = new r_8[h.mNxy]; 245 246 for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j] = h.mOver[i][j]; 229 247 nHist = h.nHist; 230 248 nEntries = h.nEntries; 231 nx = h.nx; ny = h.ny; nxy = h.nxy;232 xmin = h.xmin; xmax = h.xmax; wbinx = h.wbinx;233 ymin = h.ymin; ymax = h.ymax; wbiny = h.wbiny;249 mNx = h.mNx; mNy = h.mNy; mNxy = h.mNxy; 250 mXmin = h.mXmin; mXmax = h.mXmax; mWBinx = h.mWBinx; 251 mYmin = h.mYmin; mYmax = h.mYmax; mWBiny = h.mWBiny; 234 252 235 memcpy( data, h.data, nxy*sizeof(float));236 if( err2) memcpy(err2, h.err2, nxy*sizeof(double));253 memcpy(mData, h.mData, mNxy*sizeof(r_8)); 254 if(mErr2) memcpy(mErr2, h.mErr2, mNxy*sizeof(r_8)); 237 255 238 256 DelProjX(); 239 if(h. hprojx) {257 if(h.mHprojx) { 240 258 SetProjX(); 241 * hprojx = *(h.hprojx);259 *mHprojx = *(h.mHprojx); 242 260 } 243 261 DelProjY(); 244 if(h. hprojy) {262 if(h.mHprojy) { 245 263 SetProjY(); 246 * hprojy = *(h.hprojy);264 *mHprojy = *(h.mHprojy); 247 265 } 248 266 … … 288 306 Operateur H *= b 289 307 */ 290 Histo2D& Histo2D::operator *= ( doubleb)291 { 292 int i,j;293 doubleb2 = b*b;294 for(i=0;i< nxy;i++) {295 data[i] *= b;296 if( err2) err2[i] *= b2;297 } 298 for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j] *= b;308 Histo2D& Histo2D::operator *= (r_8 b) 309 { 310 int_4 i,j; 311 r_8 b2 = b*b; 312 for(i=0;i<mNxy;i++) { 313 mData[i] *= b; 314 if(mErr2) mErr2[i] *= b2; 315 } 316 for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j] *= b; 299 317 nHist *= b; 300 318 301 if( hprojx) *hprojx *= b;302 if( hprojy) *hprojy *= b;319 if(mHprojx) *mHprojx *= b; 320 if(mHprojy) *mHprojy *= b; 303 321 if(NSliX()>0) for(i=0; i<NSliX();i++) *HSliX(i) *= b; 304 322 if(NSliY()>0) for(i=0; i<NSliY();i++) *HSliY(i) *= b; … … 312 330 Operateur H /= b 313 331 */ 314 Histo2D& Histo2D::operator /= ( doubleb)315 { 316 int i,j;332 Histo2D& Histo2D::operator /= (r_8 b) 333 { 334 int_4 i,j; 317 335 if (b==0.) THROW(inconsistentErr); 318 doubleb2 = b*b;319 for(i=0;i< nxy;i++) {320 data[i] /= b;321 if( err2) err2[i] /= b2;322 } 323 for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j] /= b;336 r_8 b2 = b*b; 337 for(i=0;i<mNxy;i++) { 338 mData[i] /= b; 339 if(mErr2) mErr2[i] /= b2; 340 } 341 for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j] /= b; 324 342 nHist /= b; 325 343 326 if( hprojx) *hprojx /= b;327 if( hprojy) *hprojy /= b;344 if(mHprojx) *mHprojx /= b; 345 if(mHprojy) *mHprojy /= b; 328 346 if(NSliX()>0) for(i=0; i<NSliX();i++) *HSliX(i) /= b; 329 347 if(NSliY()>0) for(i=0; i<NSliY();i++) *HSliY(i) /= b; … … 337 355 Operateur H += b 338 356 */ 339 Histo2D& Histo2D::operator += ( doubleb)340 { 341 int i,j;342 floatmin,max;343 for(i=0;i< nxy;i++) data[i] += b;344 for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j] += b;345 nHist += nxy*b;346 347 if( hprojx) *hprojx += b*ny;348 if( hprojy) *hprojy += b*nx;349 if(NSliX()>0) for(i=0; i<NSliX();i++) *HSliX(i) += b* ny/NSliX();350 if(NSliY()>0) for(i=0; i<NSliY();i++) *HSliY(i) += b* nx/NSliY();357 Histo2D& Histo2D::operator += (r_8 b) 358 { 359 int_4 i,j; 360 r_8 min,max; 361 for(i=0;i<mNxy;i++) mData[i] += b; 362 for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j] += b; 363 nHist += mNxy*b; 364 365 if(mHprojx) *mHprojx += b*mNy; 366 if(mHprojy) *mHprojy += b*mNx; 367 if(NSliX()>0) for(i=0; i<NSliX();i++) *HSliX(i) += b*mNy/NSliX(); 368 if(NSliY()>0) for(i=0; i<NSliY();i++) *HSliY(i) += b*mNx/NSliY(); 351 369 if(NBandX()>0) for(i=0; i<NBandX();i++) { 352 370 GetBandX(i,min,max); 353 *HBandX(i) += b*(max-min)/( ymax-ymin)*ny;371 *HBandX(i) += b*(max-min)/(mYmax-mYmin)*mNy; 354 372 } 355 373 if(NBandY()>0) for(i=0; i<NBandY();i++) { 356 374 GetBandY(i,min,max); 357 *HBandY(i) += b*(max-min)/( xmax-xmin)*nx;375 *HBandY(i) += b*(max-min)/(mXmax-mXmin)*mNx; 358 376 } 359 377 … … 364 382 Operateur H -= b 365 383 */ 366 Histo2D& Histo2D::operator -= ( doubleb)367 { 368 int i,j;369 floatmin,max;370 for(i=0;i< nxy;i++) data[i] -= b;371 for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j] -= b;372 nHist -= nxy*b;373 374 if( hprojx) *hprojx -= b*ny;375 if( hprojy) *hprojy -= b*nx;376 if(NSliX()>0) for(i=0; i<NSliX();i++) *HSliX(i) -= b* ny/NSliX();377 if(NSliY()>0) for(i=0; i<NSliY();i++) *HSliY(i) -= b* nx/NSliY();384 Histo2D& Histo2D::operator -= (r_8 b) 385 { 386 int_4 i,j; 387 r_8 min,max; 388 for(i=0;i<mNxy;i++) mData[i] -= b; 389 for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j] -= b; 390 nHist -= mNxy*b; 391 392 if(mHprojx) *mHprojx -= b*mNy; 393 if(mHprojy) *mHprojy -= b*mNx; 394 if(NSliX()>0) for(i=0; i<NSliX();i++) *HSliX(i) -= b*mNy/NSliX(); 395 if(NSliY()>0) for(i=0; i<NSliY();i++) *HSliY(i) -= b*mNx/NSliY(); 378 396 if(NBandX()>0) for(i=0; i<NBandX();i++) { 379 397 GetBandX(i,min,max); 380 *HBandX(i) -= b*(max-min)/( ymax-ymin)*ny;398 *HBandX(i) -= b*(max-min)/(mYmax-mYmin)*mNy; 381 399 } 382 400 if(NBandY()>0) for(i=0; i<NBandY();i++) { 383 401 GetBandY(i,min,max); 384 *HBandY(i) -= b*(max-min)/( xmax-xmin)*nx;402 *HBandY(i) -= b*(max-min)/(mXmax-mXmin)*mNx; 385 403 } 386 404 … … 394 412 Histo2D& Histo2D::operator += (const Histo2D& a) 395 413 { 396 int i,j;397 if( nx!=a.nx || ny!=a.ny) THROW(sizeMismatchErr);398 for(i=0;i< nxy;i++) {399 data[i] += a.data[i];400 if( err2 && a.err2) err2[i] += a.err2[i];401 } 402 for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j] += a.over[i][j];414 int_4 i,j; 415 if(mNx!=a.mNx || mNy!=a.mNy) THROW(sizeMismatchErr); 416 for(i=0;i<mNxy;i++) { 417 mData[i] += a.mData[i]; 418 if(mErr2 && a.mErr2) mErr2[i] += a.mErr2[i]; 419 } 420 for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j] += a.mOver[i][j]; 403 421 nHist += a.nHist; 404 422 nEntries += a.nEntries; 405 423 406 if( hprojx && a.hprojx) *hprojx += *(a.hprojx);407 if( hprojy && a.hprojy) *hprojy += *(a.hprojy);424 if(mHprojx && a.mHprojx) *mHprojx += *(a.mHprojx); 425 if(mHprojy && a.mHprojy) *mHprojy += *(a.mHprojy); 408 426 ZeroSliX(); ZeroSliY(); 409 427 ZeroBandX(); ZeroBandY(); … … 417 435 Histo2D& Histo2D::operator -= (const Histo2D& a) 418 436 { 419 int i,j;420 if( nx!=a.nx || ny!=a.ny) THROW(sizeMismatchErr);421 for(i=0;i< nxy;i++) {422 data[i] -= a.data[i];423 if( err2 && a.err2) err2[i] += a.err2[i];424 } 425 for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j] += a.over[i][j];437 int_4 i,j; 438 if(mNx!=a.mNx || mNy!=a.mNy) THROW(sizeMismatchErr); 439 for(i=0;i<mNxy;i++) { 440 mData[i] -= a.mData[i]; 441 if(mErr2 && a.mErr2) mErr2[i] += a.mErr2[i]; 442 } 443 for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j] += a.mOver[i][j]; 426 444 nHist -= a.nHist; 427 445 nEntries += a.nEntries; 428 446 429 if( hprojx && a.hprojx) *hprojx -= *(a.hprojx);430 if( hprojy && a.hprojy) *hprojy -= *(a.hprojy);447 if(mHprojx && a.mHprojx) *mHprojx -= *(a.mHprojx); 448 if(mHprojy && a.mHprojy) *mHprojy -= *(a.mHprojy); 431 449 ZeroSliX(); ZeroSliY(); 432 450 ZeroBandX(); ZeroBandY(); … … 440 458 Histo2D& Histo2D::operator *= (const Histo2D& a) 441 459 { 442 int i,j;443 if( nx!=a.nx || ny!=a.ny) THROW(sizeMismatchErr);460 int_4 i,j; 461 if(mNx!=a.mNx || mNy!=a.mNy) THROW(sizeMismatchErr); 444 462 nHist = 0.; 445 for(i=0;i< nxy;i++) {446 if( err2 && a.err2)447 err2[i] = a.data[i]*a.data[i]*err2[i] + data[i]*data[i]*a.err2[i];448 data[i] *= a.data[i];449 nHist += data[i];450 } 451 for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j] *= a.over[i][j];463 for(i=0;i<mNxy;i++) { 464 if(mErr2 && a.mErr2) 465 mErr2[i] = a.mData[i]*a.mData[i]*mErr2[i] + mData[i]*mData[i]*a.mErr2[i]; 466 mData[i] *= a.mData[i]; 467 nHist += mData[i]; 468 } 469 for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j] *= a.mOver[i][j]; 452 470 nEntries += a.nEntries; 453 471 454 if( hprojx && a.hprojx) *hprojx *= *(a.hprojx);455 if( hprojy && a.hprojy) *hprojy *= *(a.hprojy);472 if(mHprojx && a.mHprojx) *mHprojx *= *(a.mHprojx); 473 if(mHprojy && a.mHprojy) *mHprojy *= *(a.mHprojy); 456 474 ZeroSliX(); ZeroSliY(); 457 475 ZeroBandX(); ZeroBandY(); … … 465 483 Histo2D& Histo2D::operator /= (const Histo2D& a) 466 484 { 467 int i,j;468 if( nx!=a.nx || ny!=a.ny) THROW(sizeMismatchErr);485 int_4 i,j; 486 if(mNx!=a.mNx || mNy!=a.mNy) THROW(sizeMismatchErr); 469 487 nHist = 0.; 470 for(i=0;i< nxy;i++) {471 if(a. data[i]==0.) {472 data[i]=0.;473 if( err2) err2[i]=0.;488 for(i=0;i<mNxy;i++) { 489 if(a.mData[i]==0.) { 490 mData[i]=0.; 491 if(mErr2) mErr2[i]=0.; 474 492 continue; 475 493 } 476 if( err2 && a.err2)477 err2[i] = (err2[i] + data[i]/a.data[i]*data[i]/a.data[i]*a.err2[i])478 /(a. data[i]*a.data[i]);479 data[i] /= a.data[i];480 nHist += data[i];494 if(mErr2 && a.mErr2) 495 mErr2[i] = (mErr2[i] + mData[i]/a.mData[i]*mData[i]/a.mData[i]*a.mErr2[i]) 496 /(a.mData[i]*a.mData[i]); 497 mData[i] /= a.mData[i]; 498 nHist += mData[i]; 481 499 } 482 500 for(i=0;i<3;i++) for(j=0;j<3;j++) 483 if(a. over[i][j]!=0.) over[i][j] *= a.over[i][j]; else over[i][j] = 0.;501 if(a.mOver[i][j]!=0.) mOver[i][j] *= a.mOver[i][j]; else mOver[i][j] = 0.; 484 502 nEntries += a.nEntries; 485 503 486 if( hprojx && a.hprojx) *hprojx /= *(a.hprojx);487 if( hprojy && a.hprojy) *hprojy /= *(a.hprojy);504 if(mHprojx && a.mHprojx) *mHprojx /= *(a.mHprojx); 505 if(mHprojy && a.mHprojy) *mHprojy /= *(a.mHprojy); 488 506 ZeroSliX(); ZeroSliY(); 489 507 ZeroBandX(); ZeroBandY(); … … 498 516 void Histo2D::GetXCoor(TVector<r_8> &v) 499 517 { 500 floatx,y;501 v.Realloc( nx);502 for(int i=0;i<nx;i++) {BinLowEdge(i,0,x,y); v(i) = x;}518 r_8 x,y; 519 v.Realloc(mNx); 520 for(int_4 i=0;i<mNx;i++) {BinLowEdge(i,0,x,y); v(i) = x;} 503 521 return; 504 522 } … … 509 527 void Histo2D::GetYCoor(TVector<r_8> &v) 510 528 { 511 floatx,y;512 v.Realloc( ny);513 for(int i=0;i<ny;i++) {BinLowEdge(0,i,x,y); v(i) = y;}529 r_8 x,y; 530 v.Realloc(mNy); 531 for(int_4 i=0;i<mNy;i++) {BinLowEdge(0,i,x,y); v(i) = y;} 514 532 return; 515 533 } … … 520 538 void Histo2D::GetValue(TMatrix<r_8> &v) 521 539 { 522 v.Realloc( nx,ny);523 for(int i=0;i<nx;i++)524 for(int j=0;j<ny;j++) v(i,j) = (*this)(i,j);540 v.Realloc(mNx,mNy); 541 for(int_4 i=0;i<mNx;i++) 542 for(int_4 j=0;j<mNy;j++) v(i,j) = (*this)(i,j); 525 543 return; 526 544 } … … 531 549 void Histo2D::GetError2(TMatrix<r_8> &v) 532 550 { 533 int i,j;534 v.Realloc( nx,ny);535 if(! err2)536 {for(i=0;i< nx;i++) for(j=0;j<ny;j++) v(i,j) = 0.; return;}537 for(i=0;i< nx;i++) for(j=0;j<ny;j++) v(i,j) = Error2(i,j);551 int_4 i,j; 552 v.Realloc(mNx,mNy); 553 if(!mErr2) 554 {for(i=0;i<mNx;i++) for(j=0;j<mNy;j++) v(i,j) = 0.; return;} 555 for(i=0;i<mNx;i++) for(j=0;j<mNy;j++) v(i,j) = Error2(i,j); 538 556 return; 539 557 } … … 544 562 void Histo2D::GetError(TMatrix<r_8> &v) 545 563 { 546 int i,j;547 v.Realloc( nx,ny);548 if(! err2)549 {for(i=0;i< nx;i++) for(j=0;j<ny;j++) v(i,j) = 0.; return;}550 for(i=0;i< nx;i++) for(j=0;j<ny;j++) v(i,j) = Error(i,j);564 int_4 i,j; 565 v.Realloc(mNx,mNy); 566 if(!mErr2) 567 {for(i=0;i<mNx;i++) for(j=0;j<mNy;j++) v(i,j) = 0.; return;} 568 for(i=0;i<mNx;i++) for(j=0;j<mNy;j++) v(i,j) = Error(i,j); 551 569 return; 552 570 } … … 556 574 Remplissage du contenu de l'histo avec les valeurs d'un tableau. 557 575 */ 558 void Histo2D::PutValue(TMatrix<r_8> &v, int ierr) 559 { 560 int i,j; 561 //if(v.NRows()!=(uint_4)nx || v.NCol()!=(uint_4)ny) THROW(sizeMismatchErr); 562 uint_4 nnx = (v.NRows()<(uint_4)nx)? v.NRows(): (uint_4)nx; 563 uint_4 nny = (v.NCol() <(uint_4)ny)? v.NCol() : (uint_4)ny; 564 if(nnx>0 && nny>0) for(i=0;i<nnx;i++) for(j=0;j<nny;j++) { 576 void Histo2D::PutValue(TMatrix<r_8> &v, int_4 ierr) 577 { 578 //if(v.NRows()!=(uint_4)mNx || v.NCol()!=(uint_4)mNy) THROW(sizeMismatchErr); 579 uint_4 nnx = (v.NRows()<(uint_4)mNx)? v.NRows(): (uint_4)mNx; 580 uint_4 nny = (v.NCol() <(uint_4)mNy)? v.NCol() : (uint_4)mNy; 581 if(nnx>0 && nny>0) for(uint_4 i=0;i<nnx;i++) for(uint_4 j=0;j<nny;j++) { 565 582 (*this)(i,j) = v(i,j); 566 if( err2 && ierr) Error2(i,j) = fabs(v(i,j));583 if(mErr2 && ierr) Error2(i,j) = fabs(v(i,j)); 567 584 } 568 585 return; … … 572 589 Addition du contenu de l'histo avec les valeurs d'un tableau. 573 590 */ 574 void Histo2D::PutValueAdd(TMatrix<r_8> &v, int ierr) 575 { 576 int i,j; 577 //if(v.NRows()!=(uint_4)nx || v.NCol()!=(uint_4)ny) THROW(sizeMismatchErr); 578 uint_4 nnx = (v.NRows()<(uint_4)nx)? v.NRows(): (uint_4)nx; 579 uint_4 nny = (v.NCol() <(uint_4)ny)? v.NCol() : (uint_4)ny; 580 if(nnx>0 && nny>0) for(i=0;i<nnx;i++) for(j=0;j<nny;j++) { 591 void Histo2D::PutValueAdd(TMatrix<r_8> &v, int_4 ierr) 592 { 593 //if(v.NRows()!=(uint_4)mNx || v.NCol()!=(uint_4)mNy) THROW(sizeMismatchErr); 594 uint_4 nnx = (v.NRows()<(uint_4)mNx)? v.NRows(): (uint_4)mNx; 595 uint_4 nny = (v.NCol() <(uint_4)mNy)? v.NCol() : (uint_4)mNy; 596 if(nnx>0 && nny>0) for(uint_4 i=0;i<nnx;i++) for(uint_4 j=0;j<nny;j++) { 581 597 (*this)(i,j) += v(i,j); 582 if( err2 && ierr) Error2(i,j) += fabs(v(i,j));598 if(mErr2 && ierr) Error2(i,j) += fabs(v(i,j)); 583 599 } 584 600 return; … … 591 607 void Histo2D::PutError2(TMatrix<r_8> &v) 592 608 { 593 int i,j; 594 //if(v.NRows()!=(uint_4)nx || v.NCol()!=(uint_4)ny) THROW(sizeMismatchErr); 595 uint_4 nnx = (v.NRows()<(uint_4)nx)? v.NRows(): (uint_4)nx; 596 uint_4 nny = (v.NCol() <(uint_4)ny)? v.NCol() : (uint_4)ny; 609 //if(v.NRows()!=(uint_4)mNx || v.NCol()!=(uint_4)mNy) THROW(sizeMismatchErr); 610 uint_4 nnx = (v.NRows()<(uint_4)mNx)? v.NRows(): (uint_4)mNx; 611 uint_4 nny = (v.NCol() <(uint_4)mNy)? v.NCol() : (uint_4)mNy; 597 612 if(nnx>0 && nny>0) { 598 if(! err2) Errors();599 for( i=0;i<nnx;i++) for(j=0;j<nny;j++) Error2(i,j) = v(i,j);613 if(!mErr2) Errors(); 614 for(uint_4 i=0;i<nnx;i++) for(uint_4 j=0;j<nny;j++) Error2(i,j) = v(i,j); 600 615 } 601 616 return; … … 608 623 void Histo2D::PutError2Add(TMatrix<r_8> &v) 609 624 { 610 int i,j; 611 //if(v.NRows()!=(uint_4)nx || v.NCol()!=(uint_4)ny) THROW(sizeMismatchErr); 612 uint_4 nnx = (v.NRows()<(uint_4)nx)? v.NRows(): (uint_4)nx; 613 uint_4 nny = (v.NCol() <(uint_4)ny)? v.NCol() : (uint_4)ny; 625 //if(v.NRows()!=(uint_4)mNx || v.NCol()!=(uint_4)mNy) THROW(sizeMismatchErr); 626 uint_4 nnx = (v.NRows()<(uint_4)mNx)? v.NRows(): (uint_4)mNx; 627 uint_4 nny = (v.NCol() <(uint_4)mNy)? v.NCol() : (uint_4)mNy; 614 628 if(nnx>0 && nny>0) { 615 if(! err2) Errors();616 for( i=0;i<nnx;i++) for(j=0;j<nny;j++)629 if(!mErr2) Errors(); 630 for(uint_4 i=0;i<nnx;i++) for(uint_4 j=0;j<nny;j++) 617 631 if(v(i,j)>0.) Error2(i,j) += v(i,j); 618 632 } … … 625 639 void Histo2D::PutError(TMatrix<r_8> &v) 626 640 { 627 int i,j; 628 //if(v.NRows()!=(uint_4)nx || v.NCol()!=(uint_4)ny) THROW(sizeMismatchErr); 629 uint_4 nnx = (v.NRows()<(uint_4)nx)? v.NRows(): (uint_4)nx; 630 uint_4 nny = (v.NCol() <(uint_4)ny)? v.NCol() : (uint_4)ny; 641 //if(v.NRows()!=(uint_4)mNx || v.NCol()!=(uint_4)mNy) THROW(sizeMismatchErr); 642 uint_4 nnx = (v.NRows()<(uint_4)mNx)? v.NRows(): (uint_4)mNx; 643 uint_4 nny = (v.NCol() <(uint_4)mNy)? v.NCol() : (uint_4)mNy; 631 644 if(nnx>0 && nny>0) { 632 if(! err2) Errors();633 for( i=0;i<nnx;i++) for(j=0;j<nny;j++)645 if(!mErr2) Errors(); 646 for(uint_4 i=0;i<nnx;i++) for(uint_4 j=0;j<nny;j++) 634 647 if(v(i,j)>0.) Error2(i,j)=v(i,j)*v(i,j); else Error2(i,j)= -v(i,j)*v(i,j); 635 648 } … … 642 655 Addition du contenu de l'histo pour x,y poids w. 643 656 */ 644 void Histo2D::Add( float x, float y, floatw)657 void Histo2D::Add(r_8 x, r_8 y, r_8 w) 645 658 { 646 659 list<bande_slice>::iterator it; 647 int i,j;660 int_4 i,j; 648 661 FindBin(x,y,i,j); 649 662 650 if( hprojx != NULL ) hprojx->Add(x,w);651 if( hprojy != NULL ) hprojy->Add(y,w);652 653 if( lbandx.size()>0)654 for( it = lbandx.begin(); it != lbandx.end(); it++)663 if( mHprojx != NULL ) mHprojx->Add(x,w); 664 if( mHprojy != NULL ) mHprojy->Add(y,w); 665 666 if(mLBandx.size()>0) 667 for( it = mLBandx.begin(); it != mLBandx.end(); it++) 655 668 if( (*it).min <= y && y < (*it).max ) (*it).H->Add(x,w); 656 669 657 if( lbandy.size()>0)658 for( it = lbandy.begin(); it != lbandy.end(); it++)670 if(mLBandy.size()>0) 671 for( it = mLBandy.begin(); it != mLBandy.end(); it++) 659 672 if( (*it).min <= x && x < (*it).max ) (*it).H->Add(y,w); 660 673 661 if( lslix.size()>0)662 for( it = lslix.begin(); it != lslix.end(); it++)674 if(mLSlix.size()>0) 675 for( it = mLSlix.begin(); it != mLSlix.end(); it++) 663 676 if( (*it).min <= y && y < (*it).max ) (*it).H->Add(x,w); 664 677 665 if( lsliy.size()>0)666 for( it = lsliy.begin(); it != lsliy.end(); it++)678 if(mLSliy.size()>0) 679 for( it = mLSliy.begin(); it != mLSliy.end(); it++) 667 680 if( (*it).min <= x && x < (*it).max ) (*it).H->Add(y,w); 668 681 669 if( i<0 || i>= nx || j<0 || j>=ny ) {670 if(i<0) i=0; else if(i>= nx) i=2; else i=1;671 if(j<0) j=0; else if(j>= ny) j=2; else j=1;672 over[i][j] += w;673 over[1][1] += w;682 if( i<0 || i>=mNx || j<0 || j>=mNy ) { 683 if(i<0) i=0; else if(i>=mNx) i=2; else i=1; 684 if(j<0) j=0; else if(j>=mNy) j=2; else j=1; 685 mOver[i][j] += w; 686 mOver[1][1] += w; 674 687 return; 675 688 } 676 689 677 data[j*nx+i] += w;678 if( err2!=NULL) err2[j*nx+i] += w*w;690 mData[j*mNx+i] += w; 691 if(mErr2!=NULL) mErr2[j*mNx+i] += w*w; 679 692 nHist += w; 680 693 nEntries++; … … 685 698 Recherche du bin du maximum dans le pave [il,ih][jl,jh]. 686 699 */ 687 void Histo2D::IJMax(int & imax,int& jmax,int il,int ih,int jl,intjh)688 { 689 if( il > ih ) { il = 0; ih = nx-1; }690 if( jl > jh ) { jl = 0; jh = ny-1; }700 void Histo2D::IJMax(int_4& imax,int_4& jmax,int_4 il,int_4 ih,int_4 jl,int_4 jh) 701 { 702 if( il > ih ) { il = 0; ih = mNx-1; } 703 if( jl > jh ) { jl = 0; jh = mNy-1; } 691 704 if( il < 0 ) il = 0; 692 705 if( jl < 0 ) jl = 0; 693 if( ih >= nx ) ih = nx-1;694 if( jh >= ny ) jh = ny-1;706 if( ih >= mNx ) ih = mNx-1; 707 if( jh >= mNy ) jh = mNy-1; 695 708 696 709 imax = jmax = 0; 697 if( nxy==1) return;698 699 floatmx=(*this)(il,jl);700 for (int i=il; i<=ih; i++)701 for (int j=jl; j<=jh; j++)710 if(mNxy==1) return; 711 712 r_8 mx=(*this)(il,jl); 713 for (int_4 i=il; i<=ih; i++) 714 for (int_4 j=jl; j<=jh; j++) 702 715 if ((*this)(i,j)>mx) {imax = i; jmax = j; mx=(*this)(i,j);} 703 716 } … … 706 719 Recherche du bin du minimum dans le pave [il,ih][jl,jh]. 707 720 */ 708 void Histo2D::IJMin(int & imax,int& jmax,int il,int ih,int jl,intjh)709 { 710 if( il > ih ) { il = 0; ih = nx-1; }711 if( jl > jh ) { jl = 0; jh = ny-1; }721 void Histo2D::IJMin(int_4& imax,int_4& jmax,int_4 il,int_4 ih,int_4 jl,int_4 jh) 722 { 723 if( il > ih ) { il = 0; ih = mNx-1; } 724 if( jl > jh ) { jl = 0; jh = mNy-1; } 712 725 if( il < 0 ) il = 0; 713 726 if( jl < 0 ) jl = 0; 714 if( ih >= nx ) ih = nx-1;715 if( jh >= ny ) jh = ny-1;727 if( ih >= mNx ) ih = mNx-1; 728 if( jh >= mNy ) jh = mNy-1; 716 729 717 730 imax = jmax = 0; 718 if( nxy==1) return;719 720 floatmx=(*this)(il,jl);721 for (int i=il; i<=ih; i++)722 for (int j=jl; j<=jh; j++)731 if(mNxy==1) return; 732 733 r_8 mx=(*this)(il,jl); 734 for (int_4 i=il; i<=ih; i++) 735 for (int_4 j=jl; j<=jh; j++) 723 736 if ((*this)(i,j)<mx) {imax = i; jmax = j; mx=(*this)(i,j);} 724 737 } … … 728 741 Recherche du maximum dans le pave [il,ih][jl,jh]. 729 742 */ 730 float Histo2D::VMax(int il,int ih,int jl,intjh) const731 { 732 if( il > ih ) { il = 0; ih = nx-1; }733 if( jl > jh ) { jl = 0; jh = ny-1; }743 r_8 Histo2D::VMax(int_4 il,int_4 ih,int_4 jl,int_4 jh) const 744 { 745 if( il > ih ) { il = 0; ih = mNx-1; } 746 if( jl > jh ) { jl = 0; jh = mNy-1; } 734 747 if( il < 0 ) il = 0; 735 748 if( jl < 0 ) jl = 0; 736 if( ih >= nx ) ih = nx-1;737 if( jh >= ny ) jh = ny-1;738 739 floatmx=(*this)(il,jl);740 if( nxy==1) return mx;741 for (int i=il; i<=ih; i++)742 for (int j=jl; j<=jh; j++)749 if( ih >= mNx ) ih = mNx-1; 750 if( jh >= mNy ) jh = mNy-1; 751 752 r_8 mx=(*this)(il,jl); 753 if(mNxy==1) return mx; 754 for (int_4 i=il; i<=ih; i++) 755 for (int_4 j=jl; j<=jh; j++) 743 756 if ((*this)(i,j)>mx) mx=(*this)(i,j); 744 757 return mx; … … 748 761 Recherche du minimum dans le pave [il,ih][jl,jh]. 749 762 */ 750 float Histo2D::VMin(int il,int ih,int jl,intjh) const751 { 752 if( il > ih ) { il = 0; ih = nx-1; }753 if( jl > jh ) { jl = 0; jh = ny-1; }763 r_8 Histo2D::VMin(int_4 il,int_4 ih,int_4 jl,int_4 jh) const 764 { 765 if( il > ih ) { il = 0; ih = mNx-1; } 766 if( jl > jh ) { jl = 0; jh = mNy-1; } 754 767 if( il < 0 ) il = 0; 755 768 if( jl < 0 ) jl = 0; 756 if( ih >= nx ) ih = nx-1;757 if( jh >= ny ) jh = ny-1;758 759 floatmx=(*this)(il,jl);760 if( nxy==1) return mx;761 for (int i=il; i<=ih; i++)762 for (int j=jl; j<=jh; j++)769 if( ih >= mNx ) ih = mNx-1; 770 if( jh >= mNy ) jh = mNy-1; 771 772 r_8 mx=(*this)(il,jl); 773 if(mNxy==1) return mx; 774 for (int_4 i=il; i<=ih; i++) 775 for (int_4 j=jl; j<=jh; j++) 763 776 if ((*this)(i,j)<mx) mx=(*this)(i,j); 764 777 return mx; … … 769 782 Renvoie les under.overflow dans les 8 quadrants. 770 783 \verbatim 771 over[3][3]:20 | 21 | 22784 mOver[3][3]: 20 | 21 | 22 772 785 | | 773 786 -------------- … … 780 793 \endverbatim 781 794 */ 782 float Histo2D::NOver(int i,intj) const783 { 784 if( i < 0 || i>=3 || j < 0 || j>=3 ) return over[1][1];785 return over[i][j];795 r_8 Histo2D::NOver(int_4 i,int_4 j) const 796 { 797 if( i < 0 || i>=3 || j < 0 || j>=3 ) return mOver[1][1]; 798 return mOver[i][j]; 786 799 } 787 800 … … 791 804 Retourne le nombre de bins non-nuls. 792 805 */ 793 int Histo2D::BinNonNul() const794 { 795 int non=0;796 for (int i=0;i<nxy;i++) if( data[i] != 0. ) non++;806 int_4 Histo2D::BinNonNul() const 807 { 808 int_4 non=0; 809 for (int_4 i=0;i<mNxy;i++) if( mData[i] != 0. ) non++; 797 810 return non; 798 811 } … … 801 814 Retourne le nombre de bins avec erreurs non-nulles. 802 815 */ 803 int Histo2D::ErrNonNul() const804 { 805 if( err2==NULL) return -1;806 int non=0;807 for (int i=0;i<nxy;i++) if( err2[i] != 0. ) non++;816 int_4 Histo2D::ErrNonNul() const 817 { 818 if(mErr2==NULL) return -1; 819 int_4 non=0; 820 for (int_4 i=0;i<mNxy;i++) if( mErr2[i] != 0. ) non++; 808 821 return non; 809 822 } … … 813 826 Idem EstimeMax(int...) mais retourne x,y. 814 827 */ 815 int Histo2D::EstimeMax(float& xm,float& ym,intSzPav816 ,int il,int ih,int jl,intjh)817 { 818 int im,jm;828 int_4 Histo2D::EstimeMax(r_8& xm,r_8& ym,int_4 SzPav 829 ,int_4 il,int_4 ih,int_4 jl,int_4 jh) 830 { 831 int_4 im,jm; 819 832 IJMax(im,jm,il,ih,jl,jh); 820 833 return EstimeMax(im,jm,xm,ym,SzPav); … … 833 846 \endverbatim 834 847 */ 835 int Histo2D::EstimeMax(int im,int jm,float& xm,float& ym,intSzPav)848 int_4 Histo2D::EstimeMax(int_4 im,int_4 jm,r_8& xm,r_8& ym,int_4 SzPav) 836 849 { 837 850 xm = ym = 0; 838 851 if( SzPav <= 0 ) return -1; 839 if( im < 0 || im >= nx ) return -1;840 if( jm < 0 || jm >= ny ) return -1;852 if( im < 0 || im >= mNx ) return -1; 853 if( jm < 0 || jm >= mNy ) return -1; 841 854 842 855 if( SzPav%2 == 0 ) SzPav++; 843 856 SzPav = (SzPav-1)/2; 844 857 845 int rc = 0;846 doubledxm = 0, dym = 0, wx = 0;847 for(int i=im-SzPav;i<=im+SzPav;i++) {848 if( i<0 || i>= nx ) {rc=1; continue;}849 for(int j=jm-SzPav;j<=jm+SzPav;j++) {850 if( j<0 || j>= ny ) {rc=1; continue;}851 floatx,y;858 int_4 rc = 0; 859 r_8 dxm = 0, dym = 0, wx = 0; 860 for(int_4 i=im-SzPav;i<=im+SzPav;i++) { 861 if( i<0 || i>= mNx ) {rc=1; continue;} 862 for(int_4 j=jm-SzPav;j<=jm+SzPav;j++) { 863 if( j<0 || j>= mNy ) {rc=1; continue;} 864 r_8 x,y; 852 865 BinCenter(i,j,x,y); 853 866 dxm += x * (*this)(i,j); … … 888 901 \endverbatim 889 902 */ 890 int Histo2D::FindMax(int& im,int& jm,int SzPav,floatDz891 ,int il,int ih,int jl,intjh)892 { 893 if( il > ih ) { il = 0; ih = nx-1; }894 if( jl > jh ) { jl = 0; jh = ny-1; }903 int_4 Histo2D::FindMax(int_4& im,int_4& jm,int_4 SzPav,r_8 Dz 904 ,int_4 il,int_4 ih,int_4 jl,int_4 jh) 905 { 906 if( il > ih ) { il = 0; ih = mNx-1; } 907 if( jl > jh ) { jl = 0; jh = mNy-1; } 895 908 if( il < 0 ) il = 0; 896 909 if( jl < 0 ) jl = 0; 897 if( ih >= nx ) ih = nx-1;898 if( jh >= ny ) jh = ny-1;910 if( ih >= mNx ) ih = mNx-1; 911 if( jh >= mNy ) jh = mNy-1; 899 912 if( SzPav < 0 ) SzPav = 0; 900 913 else { if( SzPav%2 == 0 ) SzPav++; SzPav = (SzPav-1)/2;} 901 914 if( Dz < 0 ) Dz = 0.; 902 floatmax = VMax(il,ih,jl,jh) - Dz;903 int nmax = 0;904 float sumx = -MAXFLOAT;905 for(int i=il;i<=ih;i++) for(intj=jl;j<=jh;j++) {915 r_8 max = VMax(il,ih,jl,jh) - Dz; 916 int_4 nmax = 0; 917 r_8 sumx = -1.e20; 918 for(int_4 i=il;i<=ih;i++) for(int_4 j=jl;j<=jh;j++) { 906 919 if( (*this)(i,j) < max) continue; 907 920 nmax++; 908 floatsum = 0.;909 for(int ii=i-SzPav;ii<=i+SzPav;ii++) {910 if( ii<0 || ii >= nx ) continue;911 for(int jj=j-SzPav;jj<=j+SzPav;jj++) {912 if( jj<0 || jj >= ny ) continue;921 r_8 sum = 0.; 922 for(int_4 ii=i-SzPav;ii<=i+SzPav;ii++) { 923 if( ii<0 || ii >= mNx ) continue; 924 for(int_4 jj=j-SzPav;jj<=j+SzPav;jj++) { 925 if( jj<0 || jj >= mNy ) continue; 913 926 sum += (*this)(ii,jj); 914 927 } 915 928 } 916 if( sum > sumx ) { im = i; jm = j; sumx =sum;}929 if(nmax==1 || sum>sumx) {im=i; jm=j; sumx=sum;} 917 930 } 918 931 if( nmax <= 0 ) { IJMax(im,jm,il,ih,jl,jh); return 1;} … … 943 956 \endverbatim 944 957 */ 945 int Histo2D::Fit(GeneralFit& gfit,unsigned short typ_err)958 int_4 Histo2D::Fit(GeneralFit& gfit,unsigned short typ_err) 946 959 { 947 960 if(NBinX()*NBinY()<=0) return -1000; … … 950 963 GeneralFitData mydata(2,NBinX()*NBinY()); 951 964 952 for(int i=0;i<NBinX();i++) for(intj=0;j<NBinY();j++) {953 floatx,y;965 for(int_4 i=0;i<NBinX();i++) for(int_4 j=0;j<NBinY();j++) { 966 r_8 x,y; 954 967 BinCenter(i,j,x,y); 955 double f = (double)(*this)(i,j);956 doublesaf = sqrt(fabs(f)); if(saf<1.) saf=1.;957 doublee=0.;968 r_8 f = (*this)(i,j); 969 r_8 saf = sqrt(fabs(f)); if(saf<1.) saf=1.; 970 r_8 e=0.; 958 971 if(typ_err==0) {if(HasErrors()) e=Error(i,j); else e=1.;} 959 972 else if(typ_err==1) {if(HasErrors()) e=Error(i,j); else e=saf;} … … 962 975 else if(typ_err==4) e=(f==0.)?0.:1.; 963 976 else if(typ_err==5) e=(f==0.)?0.:saf; 964 mydata.AddData2( (double) x,(double)y,f,e);977 mydata.AddData2(x,y,f,e); 965 978 } 966 979 … … 982 995 TVector<r_8> par = gfit.GetParm(); 983 996 Histo2D h2(*this); 984 for(int i=0;i<NBinX();i++) for(intj=0;j<NBinY();j++) {985 floatxc,yc;997 for(int_4 i=0;i<NBinX();i++) for(int_4 j=0;j<NBinY();j++) { 998 r_8 xc,yc; 986 999 BinCenter(i,j,xc,yc); 987 double x[2] = {(double)xc,(double)yc};988 h2(i,j) -= (float)f->Value(x,par.Data());1000 r_8 x[2] = {xc,yc}; 1001 h2(i,j) -= f->Value(x,par.Data()); 989 1002 } 990 1003 return h2; … … 1003 1016 TVector<r_8> par = gfit.GetParm(); 1004 1017 Histo2D h2(*this); 1005 for(int i=0;i<NBinX();i++) for(intj=0;j<NBinY();j++) {1006 floatxc,yc;1018 for(int_4 i=0;i<NBinX();i++) for(int_4 j=0;j<NBinY();j++) { 1019 r_8 xc,yc; 1007 1020 BinCenter(i,j,xc,yc); 1008 double x[2] = {(double)xc,(double)yc};1009 h2(i,j) = (float)f->Value(x,par.Data());1021 r_8 x[2] = {xc,yc}; 1022 h2(i,j) = f->Value(x,par.Data()); 1010 1023 } 1011 1024 return h2; … … 1020 1033 printf("~Histo::Print nHist=%g nEntries=%d",nHist,nEntries); 1021 1034 if(HasErrors()) printf(" Errors=1\n"); else printf(" Errors=0\n"); 1022 printf(" over: [ %g %g %g // %g %g %g // %g %g %g ]\n"1023 , over[2][0],over[2][1],over[2][2]1024 , over[1][0],over[1][1],over[1][2]1025 , over[0][0],over[0][1],over[0][2]);1026 printf(" nx=%d xmin=%g xmax=%g binx=%g ", nx,xmin,xmax,wbinx);1027 printf(" ny=%d ymin=%g ymax=%g biny=%g\n", ny,ymin,ymax,wbiny);1035 printf("mOver: [ %g %g %g // %g %g %g // %g %g %g ]\n" 1036 ,mOver[2][0],mOver[2][1],mOver[2][2] 1037 ,mOver[1][0],mOver[1][1],mOver[1][2] 1038 ,mOver[0][0],mOver[0][1],mOver[0][2]); 1039 printf(" nx=%d xmin=%g xmax=%g binx=%g ",mNx,mXmin,mXmax,mWBinx); 1040 printf(" ny=%d ymin=%g ymax=%g biny=%g\n",mNy,mYmin,mYmax,mWBiny); 1028 1041 } 1029 1042 … … 1038 1051 \endverbatim 1039 1052 */ 1040 void Histo2D::Print( float min,floatmax1041 ,int il,int ih,int jl,intjh)1042 { 1043 int ns = 35;1053 void Histo2D::Print(r_8 min,r_8 max 1054 ,int_4 il,int_4 ih,int_4 jl,int_4 jh) 1055 { 1056 int_4 ns = 35; 1044 1057 const char *s = "+23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 1045 1058 1046 if( il > ih ) { il = 0; ih = nx-1; }1047 if( jl > jh ) { jl = 0; jh = ny-1; }1059 if( il > ih ) { il = 0; ih = mNx-1; } 1060 if( jl > jh ) { jl = 0; jh = mNy-1; } 1048 1061 if( il < 0 ) il = 0; 1049 1062 if( jl < 0 ) jl = 0; 1050 if( ih >= nx ) ih = nx-1;1051 if( jh >= ny ) jh = ny-1;1063 if( ih >= mNx ) ih = mNx-1; 1064 if( jh >= mNy ) jh = mNy-1; 1052 1065 1053 1066 PrintStatus(); 1054 1067 1055 if( il != 0 || ih != nx-1 || jl != 0 || jh != ny-1 ) {1056 floatxl,xh,yl,yh;1068 if( il != 0 || ih != mNx-1 || jl != 0 || jh != mNy-1 ) { 1069 r_8 xl,xh,yl,yh; 1057 1070 BinLowEdge(il,jl,xl,yl); 1058 1071 BinHighEdge(ih,jh,xh,yh); … … 1072 1085 // imprime numero de bin en colonne 1073 1086 printf("\n"); 1074 if( nx-1 >= 100 ) {1087 if( mNx-1 >= 100 ) { 1075 1088 printf(" "); 1076 for(int i=il;i<=ih;i++) printf("%1d",(int) (i%1000)/100);1089 for(int_4 i=il;i<=ih;i++) printf("%1d",(int_4) (i%1000)/100); 1077 1090 printf("\n"); 1078 1091 } 1079 if( nx-1 >= 10 ) {1092 if( mNx-1 >= 10 ) { 1080 1093 printf(" "); 1081 for(int i=il;i<=ih;i++) printf("%1d",(int) (i%100)/10);1094 for(int_4 i=il;i<=ih;i++) printf("%1d",(int_4) (i%100)/10); 1082 1095 printf("\n"); 1083 1096 } 1084 1097 printf(" "); 1085 for(int i=il;i<=ih;i++) printf("%1d",i%10);1098 for(int_4 i=il;i<=ih;i++) printf("%1d",i%10); 1086 1099 printf("\n"); 1087 printf(" "); {for(int i=il;i<=ih;i++) printf("-"); printf("\n");}1100 printf(" "); {for(int_4 i=il;i<=ih;i++) printf("-"); printf("\n");} 1088 1101 1089 1102 // imprime histogramme 1090 for(int j=jh;j>=jl;j--) {1103 for(int_4 j=jh;j>=jl;j--) { 1091 1104 printf("%3d: ",j); 1092 for(int i=il;i<=ih;i++) {1093 int h;1094 if( 1<=max-min && max-min<=35 ) h = (int )( (*this)(i,j) - min ) - 1;1095 else h = (int )( ((*this)(i,j)-min)/(max-min) * ns ) - 1;1105 for(int_4 i=il;i<=ih;i++) { 1106 int_4 h; 1107 if( 1<=max-min && max-min<=35 ) h = (int_4)( (*this)(i,j) - min ) - 1; 1108 else h = (int_4)( ((*this)(i,j)-min)/(max-min) * ns ) - 1; 1096 1109 char c; 1097 1110 if(h<0 && (*this)(i,j)>min) c = '.'; … … 1105 1118 1106 1119 // imprime numero de bin en colonne 1107 printf(" "); {for(int i=il;i<=ih;i++) printf("-"); printf("\n");}1108 if( nx-1 >= 100 ) {1120 printf(" "); {for(int_4 i=il;i<=ih;i++) printf("-"); printf("\n");} 1121 if( mNx-1 >= 100 ) { 1109 1122 printf(" "); 1110 for(int i=il;i<=ih;i++) printf("%1d",(int) (i%1000)/100);1123 for(int_4 i=il;i<=ih;i++) printf("%1d",(int_4) (i%1000)/100); 1111 1124 printf("\n"); 1112 1125 } 1113 if( nx-1 >= 10 ) {1126 if( mNx-1 >= 10 ) { 1114 1127 printf(" "); 1115 for(int i=il;i<=ih;i++) printf("%1d",(int) (i%100)/10);1128 for(int_4 i=il;i<=ih;i++) printf("%1d",(int_4) (i%100)/10); 1116 1129 printf("\n"); 1117 1130 } 1118 1131 printf(" "); 1119 {for(int i=il;i<=ih;i++) printf("%1d",i%10);}1132 {for(int_4 i=il;i<=ih;i++) printf("%1d",i%10);} 1120 1133 printf("\n"); 1121 1134 … … 1130 1143 void Histo2D::SetProjX() 1131 1144 { 1132 if( hprojx != NULL ) DelProjX();1133 hprojx = new Histo(xmin,xmax,nx);1134 if( err2 != NULL && hprojx != NULL ) hprojx->Errors();1145 if( mHprojx != NULL ) DelProjX(); 1146 mHprojx = new Histo(mXmin,mXmax,mNx); 1147 if( mErr2 != NULL && mHprojx != NULL ) mHprojx->Errors(); 1135 1148 } 1136 1149 … … 1140 1153 void Histo2D::SetProjY() 1141 1154 { 1142 if( hprojy != NULL ) DelProjY();1143 hprojy = new Histo(ymin,ymax,ny);1144 if( err2 != NULL && hprojy != NULL ) hprojy->Errors();1155 if( mHprojy != NULL ) DelProjY(); 1156 mHprojy = new Histo(mYmin,mYmax,mNy); 1157 if( mErr2 != NULL && mHprojy != NULL ) mHprojy->Errors(); 1145 1158 } 1146 1159 … … 1159 1172 void Histo2D::ShowProj() 1160 1173 { 1161 if( hprojx != NULL ) cout << ">>>> Projection X set : "<< hprojx <<endl;1174 if( mHprojx != NULL ) cout << ">>>> Projection X set : "<< mHprojx <<endl; 1162 1175 else cout << ">>>> NO Projection X set"<<endl; 1163 if( hprojy != NULL ) cout << ">>>> Projection Y set : "<< hprojy <<endl;1176 if( mHprojy != NULL ) cout << ">>>> Projection Y set : "<< mHprojy <<endl; 1164 1177 else cout << ">>>> NO Projection Y set"<<endl; 1165 1178 } … … 1170 1183 void Histo2D::DelProjX() 1171 1184 { 1172 if( hprojx == NULL ) return;1173 delete hprojx;1174 hprojx = NULL;1185 if( mHprojx == NULL ) return; 1186 delete mHprojx; 1187 mHprojx = NULL; 1175 1188 } 1176 1189 … … 1180 1193 void Histo2D::DelProjY() 1181 1194 { 1182 if( hprojy == NULL ) return;1183 delete hprojy;1184 hprojy = NULL;1195 if( mHprojy == NULL ) return; 1196 delete mHprojy; 1197 mHprojy = NULL; 1185 1198 } 1186 1199 … … 1199 1212 void Histo2D::ZeroProjX() 1200 1213 { 1201 if( hprojx == NULL ) return;1202 hprojx->Zero();1214 if( mHprojx == NULL ) return; 1215 mHprojx->Zero(); 1203 1216 } 1204 1217 … … 1208 1221 void Histo2D::ZeroProjY() 1209 1222 { 1210 if( hprojy == NULL ) return;1211 hprojy->Zero();1223 if( mHprojy == NULL ) return; 1224 mHprojy->Zero(); 1212 1225 } 1213 1226 … … 1227 1240 Pour creer une bande en X entre ybmin et ybmax. 1228 1241 */ 1229 int Histo2D::SetBandX(float ybmin,floatybmax)1230 { 1231 b_s.num = lbandx.size();1232 b_s.min = ybmin;1233 b_s.max = ybmax;1234 b_s.H = new Histo(xmin,xmax,nx);1235 lbandx.push_back(b_s);1236 b_s.H = NULL;1237 return lbandx.size()-1;1242 int_4 Histo2D::SetBandX(r_8 ybmin,r_8 ybmax) 1243 { 1244 mB_s.num = mLBandx.size(); 1245 mB_s.min = ybmin; 1246 mB_s.max = ybmax; 1247 mB_s.H = new Histo(mXmin,mXmax,mNx); 1248 mLBandx.push_back(mB_s); 1249 mB_s.H = NULL; 1250 return mLBandx.size()-1; 1238 1251 } 1239 1252 … … 1241 1254 Pour creer une bande en Y entre xbmin et xbmax. 1242 1255 */ 1243 int Histo2D::SetBandY(float xbmin,floatxbmax)1244 { 1245 b_s.num = lbandy.size();1246 b_s.min = xbmin;1247 b_s.max = xbmax;1248 b_s.H = new Histo(ymin,ymax,ny);1249 lbandy.push_back(b_s);1250 b_s.H = NULL;1251 return lbandy.size()-1;1256 int_4 Histo2D::SetBandY(r_8 xbmin,r_8 xbmax) 1257 { 1258 mB_s.num = mLBandy.size(); 1259 mB_s.min = xbmin; 1260 mB_s.max = xbmax; 1261 mB_s.H = new Histo(mYmin,mYmax,mNy); 1262 mLBandy.push_back(mB_s); 1263 mB_s.H = NULL; 1264 return mLBandy.size()-1; 1252 1265 } 1253 1266 … … 1257 1270 void Histo2D::DelBandX() 1258 1271 { 1259 if( lbandx.size() <= 0 ) return;1260 for(list<bande_slice>::iterator i = lbandx.begin(); i != lbandx.end(); i++)1272 if( mLBandx.size() <= 0 ) return; 1273 for(list<bande_slice>::iterator i = mLBandx.begin(); i != mLBandx.end(); i++) 1261 1274 if( (*i).H != NULL ) {delete (*i).H; (*i).H=NULL;} 1262 lbandx.erase(lbandx.begin(),lbandx.end());1275 mLBandx.erase(mLBandx.begin(),mLBandx.end()); 1263 1276 } 1264 1277 … … 1268 1281 void Histo2D::DelBandY() 1269 1282 { 1270 if( lbandy.size() <= 0 ) return;1271 for(list<bande_slice>::iterator i = lbandy.begin(); i != lbandy.end(); i++)1283 if( mLBandy.size() <= 0 ) return; 1284 for(list<bande_slice>::iterator i = mLBandy.begin(); i != mLBandy.end(); i++) 1272 1285 if( (*i).H != NULL ) {delete (*i).H; (*i).H=NULL;} 1273 lbandy.erase(lbandy.begin(),lbandy.end());1286 mLBandy.erase(mLBandy.begin(),mLBandy.end()); 1274 1287 } 1275 1288 … … 1279 1292 void Histo2D::ZeroBandX() 1280 1293 { 1281 if( lbandx.size() <= 0 ) return;1294 if( mLBandx.size() <= 0 ) return; 1282 1295 list<bande_slice>::iterator i; 1283 for(i = lbandx.begin(); i != lbandx.end(); i++)1296 for(i = mLBandx.begin(); i != mLBandx.end(); i++) 1284 1297 (*i).H->Zero(); 1285 1298 } … … 1290 1303 void Histo2D::ZeroBandY() 1291 1304 { 1292 if( lbandy.size() <= 0 ) return;1305 if( mLBandy.size() <= 0 ) return; 1293 1306 list<bande_slice>::iterator i; 1294 for(i = lbandy.begin(); i != lbandy.end(); i++)1307 for(i = mLBandy.begin(); i != mLBandy.end(); i++) 1295 1308 (*i).H->Zero(); 1296 1309 } … … 1299 1312 Retourne un pointeur sur la bande numero `n' selon X. 1300 1313 */ 1301 Histo* Histo2D::HBandX(int n) const1302 { 1303 if( lbandx.size() <= 0 || n < 0 || n >= (int) lbandx.size() ) return NULL;1304 for(list<bande_slice>::const_iterator i = lbandx.begin(); i != lbandx.end(); i++)1314 Histo* Histo2D::HBandX(int_4 n) const 1315 { 1316 if( mLBandx.size() <= 0 || n < 0 || n >= (int_4) mLBandx.size() ) return NULL; 1317 for(list<bande_slice>::const_iterator i = mLBandx.begin(); i != mLBandx.end(); i++) 1305 1318 if( (*i).num == n ) return (*i).H; 1306 1319 return NULL; … … 1310 1323 Retourne un pointeur sur la bande numero `n' selon Y. 1311 1324 */ 1312 Histo* Histo2D::HBandY(int n) const1313 { 1314 if( lbandy.size() <= 0 || n < 0 || n >= (int) lbandy.size() ) return NULL;1315 for(list<bande_slice>::const_iterator i = lbandy.begin(); i != lbandy.end(); i++)1325 Histo* Histo2D::HBandY(int_4 n) const 1326 { 1327 if( mLBandy.size() <= 0 || n < 0 || n >= (int_4) mLBandy.size() ) return NULL; 1328 for(list<bande_slice>::const_iterator i = mLBandy.begin(); i != mLBandy.end(); i++) 1316 1329 if( (*i).num == n ) return (*i).H; 1317 1330 return NULL; … … 1321 1334 Retourne les limites de la bande numero `n' selon X. 1322 1335 */ 1323 void Histo2D::GetBandX(int n,float& ybmin,float& ybmax) const1336 void Histo2D::GetBandX(int_4 n,r_8& ybmin,r_8& ybmax) const 1324 1337 { 1325 1338 ybmin = 0.; ybmax = 0.; 1326 if( lbandx.size() <= 0 || n < 0 || n >= (int) lbandx.size() ) return;1327 for(list<bande_slice>::const_iterator i = lbandx.begin(); i != lbandx.end(); i++)1339 if( mLBandx.size() <= 0 || n < 0 || n >= (int_4) mLBandx.size() ) return; 1340 for(list<bande_slice>::const_iterator i = mLBandx.begin(); i != mLBandx.end(); i++) 1328 1341 if( (*i).num == n ) { ybmin = (*i).min; ybmax = (*i).max; return;} 1329 1342 return; … … 1333 1346 Retourne les limites de la bande numero `n' selon Y. 1334 1347 */ 1335 void Histo2D::GetBandY(int n,float& xbmin,float& xbmax) const1348 void Histo2D::GetBandY(int_4 n,r_8& xbmin,r_8& xbmax) const 1336 1349 { 1337 1350 xbmin = 0.; xbmax = 0.; 1338 if( lbandy.size() <= 0 || n < 0 || n >= (int) lbandy.size() ) return;1339 for(list<bande_slice>::const_iterator i = lbandy.begin(); i != lbandy.end(); i++)1351 if( mLBandy.size() <= 0 || n < 0 || n >= (int_4) mLBandy.size() ) return; 1352 for(list<bande_slice>::const_iterator i = mLBandy.begin(); i != mLBandy.end(); i++) 1340 1353 if( (*i).num == n ) { xbmin = (*i).min; xbmax = (*i).max; return;} 1341 1354 return; … … 1345 1358 Informations sur les bandes. 1346 1359 */ 1347 void Histo2D::ShowBand(int lp)1348 { 1349 cout << ">>>> Nombre de bande X : " << lbandx.size() << endl;1350 if( lp>0 && lbandx.size()>0 ) {1360 void Histo2D::ShowBand(int_4 lp) 1361 { 1362 cout << ">>>> Nombre de bande X : " << mLBandx.size() << endl; 1363 if( lp>0 && mLBandx.size()>0 ) { 1351 1364 list<bande_slice>::iterator i; 1352 for(i = lbandx.begin(); i != lbandx.end(); i++) {1365 for(i = mLBandx.begin(); i != mLBandx.end(); i++) { 1353 1366 cout<<" "<<(*i).num<<" de ymin="<<(*i).min<<" a ymax="<<(*i).max; 1354 1367 if(lp>1) cout << " H=" << (*i).H; … … 1357 1370 } 1358 1371 1359 cout << ">>>> Nombre de bande Y : " << lbandy.size() << endl;1360 if( lp>0 && lbandy.size()>0 ) {1372 cout << ">>>> Nombre de bande Y : " << mLBandy.size() << endl; 1373 if( lp>0 && mLBandy.size()>0 ) { 1361 1374 list<bande_slice>::iterator i; 1362 for(i = lbandy.begin(); i != lbandy.end(); i++) {1375 for(i = mLBandy.begin(); i != mLBandy.end(); i++) { 1363 1376 cout<<" "<<(*i).num<<" de xmin="<<(*i).min<<" a xmax="<<(*i).max; 1364 1377 if(lp>1) cout << " H=" << (*i).H; … … 1374 1387 Pour creer `nsli' bandes equidistantes selon X. 1375 1388 */ 1376 int Histo2D::SetSliX(intnsli)1389 int_4 Histo2D::SetSliX(int_4 nsli) 1377 1390 { 1378 1391 if( nsli <= 0 ) return -1; 1379 if( nsli > ny ) nsli = ny;1380 if( lslix.size() > 0 ) DelSliX();1381 float w = (ymax-ymin)/nsli;1382 1383 for(int i=0; i<nsli; i++ ) {1384 b_s.num = i;1385 b_s.min = ymin + i*w;1386 b_s.max = b_s.min + w;1387 b_s.H = new Histo(xmin,xmax,nx);1388 lslix.push_back(b_s);1389 b_s.H = NULL;1390 } 1391 return (int ) lslix.size();1392 if( nsli > mNy ) nsli = mNy; 1393 if( mLSlix.size() > 0 ) DelSliX(); 1394 r_8 w = (mYmax-mYmin)/nsli; 1395 1396 for(int_4 i=0; i<nsli; i++ ) { 1397 mB_s.num = i; 1398 mB_s.min = mYmin + i*w; 1399 mB_s.max = mB_s.min + w; 1400 mB_s.H = new Histo(mXmin,mXmax,mNx); 1401 mLSlix.push_back(mB_s); 1402 mB_s.H = NULL; 1403 } 1404 return (int_4) mLSlix.size(); 1392 1405 } 1393 1406 … … 1395 1408 Pour creer `nsli' bandes equidistantes selon Y. 1396 1409 */ 1397 int Histo2D::SetSliY(intnsli)1410 int_4 Histo2D::SetSliY(int_4 nsli) 1398 1411 { 1399 1412 if( nsli <= 0 ) return -1; 1400 if( nsli > nx ) nsli = nx;1401 if( lsliy.size() > 0 ) DelSliY();1402 float w = (xmax-xmin)/nsli;1403 1404 for(int i=0; i<nsli; i++ ) {1405 b_s.num = i;1406 b_s.min = xmin + i*w;1407 b_s.max = b_s.min + w;1408 b_s.H = new Histo(ymin,ymax,ny);1409 lsliy.push_back(b_s);1410 b_s.H = NULL;1411 } 1412 return (int ) lsliy.size();1413 if( nsli > mNx ) nsli = mNx; 1414 if( mLSliy.size() > 0 ) DelSliY(); 1415 r_8 w = (mXmax-mXmin)/nsli; 1416 1417 for(int_4 i=0; i<nsli; i++ ) { 1418 mB_s.num = i; 1419 mB_s.min = mXmin + i*w; 1420 mB_s.max = mB_s.min + w; 1421 mB_s.H = new Histo(mYmin,mYmax,mNy); 1422 mLSliy.push_back(mB_s); 1423 mB_s.H = NULL; 1424 } 1425 return (int_4) mLSliy.size(); 1413 1426 } 1414 1427 … … 1418 1431 void Histo2D::DelSliX() 1419 1432 { 1420 if( lslix.size() <= 0 ) return;1421 for(list<bande_slice>::iterator i = lslix.begin(); i != lslix.end(); i++)1433 if( mLSlix.size() <= 0 ) return; 1434 for(list<bande_slice>::iterator i = mLSlix.begin(); i != mLSlix.end(); i++) 1422 1435 if( (*i).H != NULL ) {delete (*i).H; (*i).H=NULL;} 1423 lslix.erase(lslix.begin(),lslix.end());1436 mLSlix.erase(mLSlix.begin(),mLSlix.end()); 1424 1437 } 1425 1438 … … 1429 1442 void Histo2D::DelSliY() 1430 1443 { 1431 if( lsliy.size() <= 0 ) return;1432 for(list<bande_slice>::iterator i = lsliy.begin(); i != lsliy.end(); i++)1444 if( mLSliy.size() <= 0 ) return; 1445 for(list<bande_slice>::iterator i = mLSliy.begin(); i != mLSliy.end(); i++) 1433 1446 if( (*i).H != NULL ) {delete (*i).H; (*i).H=NULL;} 1434 lsliy.erase(lsliy.begin(),lsliy.end());1447 mLSliy.erase(mLSliy.begin(),mLSliy.end()); 1435 1448 } 1436 1449 … … 1440 1453 void Histo2D::ZeroSliX() 1441 1454 { 1442 if( lslix.size() <= 0 ) return;1455 if( mLSlix.size() <= 0 ) return; 1443 1456 list<bande_slice>::iterator i; 1444 for(i = lslix.begin(); i != lslix.end(); i++)1457 for(i = mLSlix.begin(); i != mLSlix.end(); i++) 1445 1458 (*i).H->Zero(); 1446 1459 } … … 1451 1464 void Histo2D::ZeroSliY() 1452 1465 { 1453 if( lsliy.size() <= 0 ) return;1466 if( mLSliy.size() <= 0 ) return; 1454 1467 list<bande_slice>::iterator i; 1455 for(i = lsliy.begin(); i != lsliy.end(); i++)1468 for(i = mLSliy.begin(); i != mLSliy.end(); i++) 1456 1469 (*i).H->Zero(); 1457 1470 } … … 1461 1474 selon X. 1462 1475 */ 1463 Histo* Histo2D::HSliX(int n) const1464 { 1465 if( lslix.size() <= 0 || n < 0 || n >= (int) lslix.size() ) return NULL;1466 for(list<bande_slice>::const_iterator i = lslix.begin(); i != lslix.end(); i++)1476 Histo* Histo2D::HSliX(int_4 n) const 1477 { 1478 if( mLSlix.size() <= 0 || n < 0 || n >= (int_4) mLSlix.size() ) return NULL; 1479 for(list<bande_slice>::const_iterator i = mLSlix.begin(); i != mLSlix.end(); i++) 1467 1480 if( (*i).num == n ) return (*i).H; 1468 1481 return NULL; … … 1473 1486 selon Y. 1474 1487 */ 1475 Histo* Histo2D::HSliY(int n) const1476 { 1477 if( lsliy.size() <= 0 || n < 0 || n >= (int) lsliy.size() ) return NULL;1478 for(list<bande_slice>::const_iterator i = lsliy.begin(); i != lsliy.end(); i++)1488 Histo* Histo2D::HSliY(int_4 n) const 1489 { 1490 if( mLSliy.size() <= 0 || n < 0 || n >= (int_4) mLSliy.size() ) return NULL; 1491 for(list<bande_slice>::const_iterator i = mLSliy.begin(); i != mLSliy.end(); i++) 1479 1492 if( (*i).num == n ) return (*i).H; 1480 1493 return NULL; … … 1484 1497 Informations sur les bandes equidistantes. 1485 1498 */ 1486 void Histo2D::ShowSli(int lp)1499 void Histo2D::ShowSli(int_4 lp) 1487 1500 { 1488 1501 list<bande_slice>::iterator i; 1489 cout << ">>>> Nombre de slice X : " << lslix.size() << endl;1490 if( lp>0 && lslix.size() > 0 )1491 for(i = lslix.begin(); i != lslix.end(); i++) {1502 cout << ">>>> Nombre de slice X : " << mLSlix.size() << endl; 1503 if( lp>0 && mLSlix.size() > 0 ) 1504 for(i = mLSlix.begin(); i != mLSlix.end(); i++) { 1492 1505 cout<<" "<<(*i).num<<" de ymin="<<(*i).min<<" a ymax="<<(*i).max; 1493 1506 if(lp>1) cout << " H=" << (*i).H; … … 1495 1508 } 1496 1509 1497 cout << ">>>> Nombre de slice Y : " << lsliy.size() << endl;1498 if( lp>0 && lsliy.size()>0 )1499 for(i = lsliy.begin(); i != lsliy.end(); i++) {1510 cout << ">>>> Nombre de slice Y : " << mLSliy.size() << endl; 1511 if( lp>0 && mLSliy.size()>0 ) 1512 for(i = mLSliy.begin(); i != mLSliy.end(); i++) { 1500 1513 cout<<" "<<(*i).num<<" de xmin="<<(*i).min<<" a xmax="<<(*i).max; 1501 1514 if(lp>1) cout << " H=" << (*i).H; … … 1518 1531 else dobj->Delete(); 1519 1532 1520 floatmin,max;1533 r_8 min,max; 1521 1534 int_4 errok, projx, projy, nslix, nsliy, nbanx, nbany; 1522 1535 … … 1530 1543 1531 1544 // Lecture variables de definitions 1532 is.Get(dobj-> nx);1533 is.Get(dobj-> ny);1534 is.Get(dobj-> nxy);1545 is.Get(dobj->mNx); 1546 is.Get(dobj->mNy); 1547 is.Get(dobj->mNxy); 1535 1548 is.Get(errok); 1536 1549 is.Get(dobj->nEntries); 1537 1550 is.Get(dobj->nHist); 1538 1551 1539 is.Get(dobj-> xmin);1540 is.Get(dobj-> xmax);1541 is.Get(dobj-> ymin);1542 is.Get(dobj-> ymax);1543 is.Get(dobj-> wbinx);1544 is.Get(dobj-> wbiny);1545 1546 is.Get(&(dobj-> over[0][0]),9);1552 is.Get(dobj->mXmin); 1553 is.Get(dobj->mXmax); 1554 is.Get(dobj->mYmin); 1555 is.Get(dobj->mYmax); 1556 is.Get(dobj->mWBinx); 1557 is.Get(dobj->mWBiny); 1558 1559 is.Get(&(dobj->mOver[0][0]),9); 1547 1560 1548 1561 is.Get(projx); … … 1554 1567 1555 1568 // Lecture histo2D 1556 dobj-> data = new float[dobj->nxy];1569 dobj->mData = new r_8[dobj->mNxy]; 1557 1570 is.GetLine(strg, 255); 1558 {for(int j=0;j<dobj->ny;j++) is.Get(dobj->data+j*dobj->nx,dobj->nx);}1571 {for(int_4 j=0;j<dobj->mNy;j++) is.Get(dobj->mData+j*dobj->mNx,dobj->mNx);} 1559 1572 1560 1573 // Lecture erreurs 1561 1574 if(errok) { 1562 1575 is.GetLine(strg, 255); 1563 dobj-> err2 = new double[dobj->nxy];1564 for(int j=0;j<dobj->ny;j++) is.Get(dobj->err2+j*dobj->nx,dobj->nx);1576 dobj->mErr2 = new r_8[dobj->mNxy]; 1577 for(int_4 j=0;j<dobj->mNy;j++) is.Get(dobj->mErr2+j*dobj->mNx,dobj->mNx); 1565 1578 } 1566 1579 … … 1569 1582 is.GetLine(strg, 255); 1570 1583 dobj->SetProjX(); 1571 ObjFileIO<Histo> fio_h(dobj-> hprojx);1584 ObjFileIO<Histo> fio_h(dobj->mHprojx); 1572 1585 fio_h.Read(is); 1573 1586 } … … 1575 1588 is.GetLine(strg, 255); 1576 1589 dobj->SetProjY(); 1577 ObjFileIO<Histo> fio_h(dobj-> hprojy);1590 ObjFileIO<Histo> fio_h(dobj->mHprojy); 1578 1591 fio_h.Read(is); 1579 1592 } … … 1584 1597 dobj->SetSliX(nslix); 1585 1598 ASSERT (nslix==dobj->NSliX()); 1586 for(int j=0;j<dobj->NSliX();j++)1599 for(int_4 j=0;j<dobj->NSliX();j++) 1587 1600 {ObjFileIO<Histo> fio_h(dobj->HSliX(j)); fio_h.Read(is);} 1588 1601 } … … 1591 1604 dobj->SetSliY(nsliy); 1592 1605 ASSERT (nsliy==dobj->NSliY()); 1593 for(int j=0;j<dobj->NSliY();j++)1606 for(int_4 j=0;j<dobj->NSliY();j++) 1594 1607 {ObjFileIO<Histo> fio_h(dobj->HSliY(j)); fio_h.Read(is);} 1595 1608 } … … 1598 1611 if( nbanx>0 ) { 1599 1612 is.GetLine(strg, 255); 1600 {for(int j=0; j<nbanx; j++) {1613 {for(int_4 j=0; j<nbanx; j++) { 1601 1614 is.Get(min); is.Get(max); 1602 1615 dobj->SetBandX(min,max); 1603 1616 }} 1604 1617 ASSERT (nbanx==dobj->NBandX()); 1605 {for(int j=0; j<dobj->NBandX(); j++) {1618 {for(int_4 j=0; j<dobj->NBandX(); j++) { 1606 1619 ObjFileIO<Histo> fio_h(dobj->HBandX(j)); 1607 1620 fio_h.Read(is); … … 1610 1623 if( nbany>0 ) { 1611 1624 is.GetLine(strg, 255); 1612 {for(int j=0; j<nbany; j++) {1625 {for(int_4 j=0; j<nbany; j++) { 1613 1626 is.Get(min); is.Get(max); 1614 1627 dobj->SetBandY(min,max); 1615 1628 }} 1616 1629 ASSERT (nbany==dobj->NBandY()); 1617 {for(int j=0; j<dobj->NBandY(); j++) {1630 {for(int_4 j=0; j<dobj->NBandY(); j++) { 1618 1631 ObjFileIO<Histo> fio_h(dobj->HBandY(j)); 1619 1632 fio_h.Read(is); … … 1630 1643 1631 1644 // Que faut-il ecrire? 1632 int_4 errok = (dobj-> err2) ? 1 : 0;1633 int_4 projx = (dobj-> hprojx) ? 1 : 0;1634 int_4 projy = (dobj-> hprojy) ? 1 : 0;1645 int_4 errok = (dobj->mErr2) ? 1 : 0; 1646 int_4 projx = (dobj->mHprojx) ? 1 : 0; 1647 int_4 projy = (dobj->mHprojy) ? 1 : 0; 1635 1648 int_4 nslix = dobj->NSliX(); 1636 1649 int_4 nsliy = dobj->NSliY(); … … 1640 1653 // Ecriture entete pour identifier facilement 1641 1654 sprintf(strg,"nx=%d ny=%d nxy=%d errok=%1d" 1642 ,dobj-> nx,dobj->ny,dobj->nxy,errok);1655 ,dobj->mNx,dobj->mNy,dobj->mNxy,errok); 1643 1656 os.PutLine(strg); 1644 1657 sprintf(strg,"nHist=%g nEntries=%d",dobj->nHist,dobj->nEntries); 1645 1658 os.PutLine(strg); 1646 sprintf(strg,"wbinx=%g wbiny=%g",dobj-> wbinx,dobj->wbiny);1659 sprintf(strg,"wbinx=%g wbiny=%g",dobj->mWBinx,dobj->mWBiny); 1647 1660 os.PutLine(strg); 1648 1661 sprintf(strg,"xmin=%g xmax=%g ymin=%g ymax=%g" 1649 ,dobj-> xmin,dobj->xmax,dobj->ymin,dobj->ymax);1662 ,dobj->mXmin,dobj->mXmax,dobj->mYmin,dobj->mYmax); 1650 1663 os.PutLine(strg); 1651 1664 sprintf(strg,"projx/y=%d %d nbandx/y=%d %d nbslix/y=%d %d" 1652 1665 ,projx,projy,nbanx,nbany,nslix,nsliy); 1653 1666 os.PutLine(strg); 1654 sprintf(strg," over %g %g %g %g %g %g %g %g %g"1655 ,dobj-> over[0][0],dobj->over[0][1],dobj->over[0][2]1656 ,dobj-> over[1][0],dobj->over[1][1],dobj->over[1][2]1657 ,dobj-> over[2][0],dobj->over[2][1],dobj->over[2][2]);1667 sprintf(strg,"mOver %g %g %g %g %g %g %g %g %g" 1668 ,dobj->mOver[0][0],dobj->mOver[0][1],dobj->mOver[0][2] 1669 ,dobj->mOver[1][0],dobj->mOver[1][1],dobj->mOver[1][2] 1670 ,dobj->mOver[2][0],dobj->mOver[2][1],dobj->mOver[2][2]); 1658 1671 os.PutLine(strg); 1659 1672 1660 1673 // Ecriture variables de definitions 1661 os.Put(dobj-> nx);1662 os.Put(dobj-> ny);1663 os.Put(dobj-> nxy);1674 os.Put(dobj->mNx); 1675 os.Put(dobj->mNy); 1676 os.Put(dobj->mNxy); 1664 1677 os.Put(errok); 1665 1678 os.Put(dobj->nEntries); 1666 1679 os.Put(dobj->nHist); 1667 1680 1668 os.Put(dobj-> xmin);1669 os.Put(dobj-> xmax);1670 os.Put(dobj-> ymin);1671 os.Put(dobj-> ymax);1672 os.Put(dobj-> wbinx);1673 os.Put(dobj-> wbiny);1674 1675 os.Put(&(dobj-> over[0][0]),9);1681 os.Put(dobj->mXmin); 1682 os.Put(dobj->mXmax); 1683 os.Put(dobj->mYmin); 1684 os.Put(dobj->mYmax); 1685 os.Put(dobj->mWBinx); 1686 os.Put(dobj->mWBiny); 1687 1688 os.Put(&(dobj->mOver[0][0]),9); 1676 1689 1677 1690 os.Put(projx); … … 1684 1697 // Ecriture histo2D 1685 1698 sprintf(strg,"Histo2D: Tableau des donnees %d = %d * %d" 1686 ,dobj-> nxy,dobj->nx,dobj->ny);1699 ,dobj->mNxy,dobj->mNx,dobj->mNy); 1687 1700 os.PutLine(strg); 1688 {for(int j=0;j<dobj->ny;j++) os.Put(dobj->data+j*dobj->nx,dobj->nx);}1701 {for(int_4 j=0;j<dobj->mNy;j++) os.Put(dobj->mData+j*dobj->mNx,dobj->mNx);} 1689 1702 1690 1703 // Ecriture erreurs 1691 1704 if(errok) { 1692 1705 sprintf(strg,"Histo2D: Tableau des erreurs %d = %d * %d" 1693 ,dobj-> nxy,dobj->nx,dobj->ny);1706 ,dobj->mNxy,dobj->mNx,dobj->mNy); 1694 1707 os.PutLine(strg); 1695 for(int j=0;j<dobj->ny;j++) os.Put(dobj->err2+j*dobj->nx,dobj->nx);1708 for(int_4 j=0;j<dobj->mNy;j++) os.Put(dobj->mErr2+j*dobj->mNx,dobj->mNx); 1696 1709 } 1697 1710 … … 1700 1713 sprintf(strg,"Histo2D: Projection X"); 1701 1714 os.PutLine(strg); 1702 ObjFileIO<Histo> fio_h(dobj-> hprojx); fio_h.Write(os);1715 ObjFileIO<Histo> fio_h(dobj->mHprojx); fio_h.Write(os); 1703 1716 } 1704 1717 if(projy) { 1705 1718 sprintf(strg,"Histo2D: Projection Y"); 1706 1719 os.PutLine(strg); 1707 ObjFileIO<Histo> fio_h(dobj-> hprojy); fio_h.Write(os);1720 ObjFileIO<Histo> fio_h(dobj->mHprojy); fio_h.Write(os); 1708 1721 } 1709 1722 … … 1712 1725 sprintf(strg,"Histo2D: Slices X %d",nslix); 1713 1726 os.PutLine(strg); 1714 for(int j=0;j<nslix;j++) {1727 for(int_4 j=0;j<nslix;j++) { 1715 1728 Histo* h = dobj->HSliX(j); 1716 1729 ObjFileIO<Histo> fio_h(h); fio_h.Write(os); … … 1720 1733 sprintf(strg,"Histo2D: Slices Y %d",nsliy); 1721 1734 os.PutLine(strg); 1722 for(int j=0;j<nsliy;j++) {1735 for(int_4 j=0;j<nsliy;j++) { 1723 1736 Histo* h = dobj->HSliY(j); 1724 1737 ObjFileIO<Histo> fio_h(h); fio_h.Write(os); … … 1731 1744 os.PutLine(strg); 1732 1745 list<Histo2D::bande_slice>::const_iterator it; 1733 for(it = dobj-> lbandx.begin(); it != dobj->lbandx.end(); it++) {1734 float min = (*it).min; floatmax = (*it).max;1746 for(it = dobj->mLBandx.begin(); it != dobj->mLBandx.end(); it++) { 1747 r_8 min = (*it).min; r_8 max = (*it).max; 1735 1748 os.Put(min); os.Put(max); 1736 1749 } 1737 for(it = dobj-> lbandx.begin(); it != dobj->lbandx.end(); it++) {1750 for(it = dobj->mLBandx.begin(); it != dobj->mLBandx.end(); it++) { 1738 1751 Histo* h = (*it).H; 1739 1752 ObjFileIO<Histo> fio_h(h); fio_h.Write(os); … … 1744 1757 os.PutLine(strg); 1745 1758 list<Histo2D::bande_slice>::const_iterator it; 1746 for(it = dobj-> lbandy.begin(); it != dobj->lbandy.end(); it++) {1747 float min = (*it).min; floatmax = (*it).max;1759 for(it = dobj->mLBandy.begin(); it != dobj->mLBandy.end(); it++) { 1760 r_8 min = (*it).min; r_8 max = (*it).max; 1748 1761 os.Put(min); os.Put(max); 1749 1762 } 1750 for(it = dobj-> lbandy.begin(); it != dobj->lbandy.end(); it++) {1763 for(it = dobj->mLBandy.begin(); it != dobj->mLBandy.end(); it++) { 1751 1764 Histo* h = (*it).H; 1752 1765 ObjFileIO<Histo> fio_h(h); fio_h.Write(os); -
trunk/SophyaLib/HiStats/histos2.h
r1053 r1092 28 28 29 29 // CREATOR / DESTRUCTOR 30 Histo2D( float xMin, float xMax, int nxBin31 ,float yMin, float yMax, intnyBin);30 Histo2D(r_8 xMin,r_8 xMax,int_4 nxBin,r_8 yMin,r_8 yMax,int_4 nyBin); 31 Histo2D(r_4 xMin,r_4 xMax,int_4 nxBin,r_4 yMin,r_4 yMax,int_4 nyBin); 32 32 Histo2D(const Histo2D& h); 33 33 Histo2D(); 34 virtual 34 virtual ~Histo2D(); 35 35 36 36 // OPTIONS 37 void 37 void Errors(); 38 38 39 39 // UPDATING 40 void 41 void Add(float x, float y, floatw = 1.);40 void Zero(); 41 void Add(r_8 x, r_8 y, r_8 w = 1.); 42 42 43 43 // Operators 44 44 Histo2D& operator = (const Histo2D& h); 45 Histo2D& operator *= ( doubleb);46 Histo2D& operator /= ( doubleb);47 Histo2D& operator += ( doubleb);48 Histo2D& operator -= ( doubleb);45 Histo2D& operator *= (r_8 b); 46 Histo2D& operator /= (r_8 b); 47 Histo2D& operator += (r_8 b); 48 Histo2D& operator -= (r_8 b); 49 49 Histo2D& operator += (const Histo2D& a); 50 50 Histo2D& operator -= (const Histo2D& a); … … 58 58 void GetError2(TMatrix<r_8>& v); 59 59 void GetError(TMatrix<r_8>& v); 60 void PutValue(TMatrix<r_8>& v, int ierr=0);61 void PutValueAdd(TMatrix<r_8>& v, int ierr=0);60 void PutValue(TMatrix<r_8>& v, int_4 ierr=0); 61 void PutValueAdd(TMatrix<r_8>& v, int_4 ierr=0); 62 62 void PutError2(TMatrix<r_8>& v); 63 63 void PutError2Add(TMatrix<r_8>& v); … … 66 66 // INLINES 67 67 //! Retourne l'abscisse minimum. 68 inline float XMin() const {return xmin;}68 inline r_8 XMin() const {return mXmin;} 69 69 //! Retourne l'abscisse maximum. 70 inline float XMax() const {return xmax;}70 inline r_8 XMax() const {return mXmax;} 71 71 //! Retourne l'ordonnee minimum. 72 inline float YMin() const {return ymin;}72 inline r_8 YMin() const {return mYmin;} 73 73 //! Retourne l'ordonnee maximum. 74 inline float YMax() const {return ymax;}74 inline r_8 YMax() const {return mYmax;} 75 75 //! Retourne le nombre de bins selon X. 76 inline int_4 NBinX() const {return nx;}76 inline int_4 NBinX() const {return mNx;} 77 77 //! Retourne le nombre de bins selon Y. 78 inline int_4 NBinY() const {return ny;}78 inline int_4 NBinY() const {return mNy;} 79 79 //! Retourne la largeur du bin selon X. 80 inline float WBinX() const {return wbinx;}80 inline r_8 WBinX() const {return mWBinx;} 81 81 //! Retourne la largeur du bin selon Y. 82 inline float WBinY() const {return wbiny;}82 inline r_8 WBinY() const {return mWBiny;} 83 83 //! Retourne le pointeur sur le tableaux des contenus. 84 inline float* Bins() const {return data;}84 inline r_8* Bins() const {return mData;} 85 85 //! Retourne le contenu du bin i,j. 86 inline float operator()(int i,int j) const {return data[j*nx+i];}86 inline r_8 operator()(int_4 i,int_4 j) const {return mData[j*mNx+i];} 87 87 //! Remplit le contenu du bin i,j. 88 inline float& operator()(int i,int j) {return data[j*nx+i];}88 inline r_8& operator()(int_4 i,int_4 j) {return mData[j*mNx+i];} 89 89 //! retourne "true" si il y a des erreurs stoquees 90 inline bool HasErrors() { if(err2) return true; else return false;}90 inline bool HasErrors() { if(mErr2) return true; else return false;} 91 91 //! Retourne l'erreur du bin i,j. 92 inline float Error(int i,intj) const93 {if(err2)94 {if(err2[j*nx+i]>0.) return sqrt(err2[j*nx+i]); else return 0.;}95 92 inline r_8 Error(int_4 i,int_4 j) const 93 {if(mErr2) 94 {if(mErr2[j*mNx+i]>0.) return sqrt(mErr2[j*mNx+i]); else return 0.;} 95 else return 0.;} 96 96 //! Remplit l'erreur au carre du bin i,j. 97 inline double Error2(int i,intj) const98 {if(err2) return err2[j*nx+i]; else return 0.;}97 inline r_8 Error2(int_4 i,int_4 j) const 98 {if(mErr2) return mErr2[j*mNx+i]; else return 0.;} 99 99 //! Remplit l'erreur au carre du bin i,j. 100 inline double& Error2(int i,int j) {return err2[j*nx+i];}100 inline r_8& Error2(int_4 i,int_4 j) {return mErr2[j*mNx+i];} 101 101 //! Retourne la somme ponderee. 102 inline float NData() const {return (float)nHist;}102 inline r_8 NData() const {return nHist;} 103 103 //! Retourne le nombre d'entrees. 104 inline int_4 104 inline int_4 NEntries() const {return nEntries;} 105 105 //! Retourne l'abscisse et l'ordonnee du coin inferieur du bin i,j. 106 inline void BinLowEdge(int i,int j,float& x,float& y) 107 {x = xmin + i*wbinx; y = ymin + j*wbiny;} 106 inline void BinLowEdge(int_4 i,int_4 j,r_8& x,r_8& y) 107 {x = mXmin + i*mWBinx; y = mYmin + j*mWBiny;} 108 //! Retourne l'abscisse et l'ordonnee du coin inferieur du bin i,j. 109 inline void BinLowEdge(int_4 i,int_4 j,r_4& xf,r_4& yf) 110 {r_8 x,y; BinLowEdge(i,j,x,y); xf=x; yf=y;} 108 111 //! Retourne l'abscisse et l'ordonnee du centre du bin i,j. 109 inline void BinCenter(int i,int j,float& x,float& y) 110 {x = xmin + (i+0.5)*wbinx; y = ymin + (j+0.5)*wbiny;} 112 inline void BinCenter(int_4 i,int_4 j,r_8& x,r_8& y) 113 {x = mXmin + (i+0.5)*mWBinx; y = mYmin + (j+0.5)*mWBiny;} 114 //! Retourne l'abscisse et l'ordonnee du centre du bin i,j. 115 inline void BinCenter(int_4 i,int_4 j,r_4& xf,r_4& yf) 116 {r_8 x,y; BinCenter(i,j,x,y); xf=x; yf=y;} 111 117 //! Retourne l'abscisse et l'ordonnee du coin superieur du bin i,j. 112 inline void BinHighEdge(int i,int j,float& x,float& y) 113 {x = xmin + (i+1)*wbinx; y = ymin + (j+1)*wbiny;} 118 inline void BinHighEdge(int_4 i,int_4 j,r_8& x,r_8& y) 119 {x = mXmin + (i+1)*mWBinx; y = mYmin + (j+1)*mWBiny;} 120 //! Retourne l'abscisse et l'ordonnee du coin superieur du bin i,j. 121 inline void BinHighEdge(int_4 i,int_4 j,r_4& xf,r_4& yf) 122 {r_8 x,y; BinHighEdge(i,j,x,y); xf=x; yf=y;} 114 123 //! Retourne les numeros du bin contenant l'abscisse et l'ordonnee x,y. 115 inline void FindBin( float x,float y,int& i,int& j)116 { i = (int) floorf((x - xmin)/wbinx); j = (int) floorf((y - ymin)/wbiny);}124 inline void FindBin(r_8 x,r_8 y,int_4& i,int_4& j) 125 {i=(int_4) floor((x-mXmin)/mWBinx); j=(int_4) floor((y-mYmin)/mWBiny);} 117 126 118 127 // Info, statistique et calculs sur les histogrammes 119 float NOver(int i=-1,intj=-1) const;120 int 121 int 122 void IJMax(int& imax,int& jmax,int il=1,int ih= -1,int jl=1,intjh= -1);123 void IJMin(int& imax,int& jmax,int il=1,int ih= -1,int jl=1,intjh= -1);124 float VMax(int il=1,int ih= -1,int jl=1,intjh= -1) const;125 float VMin(int il=1,int ih= -1,int jl=1,intjh= -1) const;126 int EstimeMax(float& xm,float& ym,intSzPav = 3127 ,int il=1,int ih= -1,int jl=1,intjh= -1);128 int EstimeMax(int im,int jm,float& xm,float& ym,intSzPav = 3);129 int FindMax(int& im,int& jm,int SzPav = 3,floatDz = 0.130 ,int il=1,int ih= -1,int jl=1,intjh= -1);128 r_8 NOver(int_4 i=-1,int_4 j=-1) const; 129 int_4 BinNonNul() const; 130 int_4 ErrNonNul() const; 131 void IJMax(int_4& imax,int_4& jmax,int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1); 132 void IJMin(int_4& imax,int_4& jmax,int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1); 133 r_8 VMax(int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1) const; 134 r_8 VMin(int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1) const; 135 int_4 EstimeMax(r_8& xm,r_8& ym,int_4 SzPav = 3 136 ,int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1); 137 int_4 EstimeMax(int_4 im,int_4 jm,r_8& xm,r_8& ym,int_4 SzPav = 3); 138 int_4 FindMax(int_4& im,int_4& jm,int_4 SzPav = 3,r_8 Dz = 0. 139 ,int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1); 131 140 132 141 // Fit 133 int 134 Histo2D 135 Histo2D 142 int_4 Fit(GeneralFit& gfit,unsigned short typ_err=0); 143 Histo2D FitResidus(GeneralFit& gfit); 144 Histo2D FitFunction(GeneralFit& gfit); 136 145 137 146 // Print et Display ASCII 138 void 139 void Print(float min=1.,floatmax=-1.140 ,int il=1,int ih= -1,int jl=1,intjh= -1);147 void PrintStatus(); 148 void Print(r_8 min=1.,r_8 max=-1. 149 ,int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1); 141 150 142 151 // PROJECTIONS 143 void 144 void 145 void 146 void 147 void 148 void 149 void 150 void 151 void 152 void SetProjX(); 153 void SetProjY(); 154 void SetProj(); 155 void DelProjX(); 156 void DelProjY(); 157 void DelProj(); 158 void ZeroProjX(); 159 void ZeroProjY(); 160 void ZeroProj(); 152 161 //! Retourne le pointeur sur l'histo 1D de la projection selon X. 153 inline Histo* HProjX() const {return hprojx;}162 inline Histo* HProjX() const {return mHprojx;} 154 163 //! Retourne le pointeur sur l'histo 1D de la projection selon Y. 155 inline Histo* HProjY() const {return hprojy;}156 void 164 inline Histo* HProjY() const {return mHprojy;} 165 void ShowProj(); 157 166 158 167 // BANDES 159 168 //! Retourne le nombre de bandes selon X 160 inline int NBandX() const {return lbandx.size();}169 inline int_4 NBandX() const {return mLBandx.size();} 161 170 //! Retourne le nombre de bandes selon Y 162 inline int NBandY() const {return lbandy.size();}163 int SetBandX(float ybmin,floatybmax);164 int SetBandY(float xbmin,floatxbmax);165 void 166 void 167 void 168 void 169 Histo* HBandX(intn) const;170 Histo* HBandY(intn) const;171 void GetBandX(int n,float& ybmin,float& ybmax) const;172 void GetBandY(int n,float& xbmin,float& xbmax) const;173 void ShowBand(intlp = 0);171 inline int_4 NBandY() const {return mLBandy.size();} 172 int_4 SetBandX(r_8 ybmin,r_8 ybmax); 173 int_4 SetBandY(r_8 xbmin,r_8 xbmax); 174 void DelBandX(); 175 void DelBandY(); 176 void ZeroBandX(); 177 void ZeroBandY(); 178 Histo* HBandX(int_4 n) const; 179 Histo* HBandY(int_4 n) const; 180 void GetBandX(int_4 n,r_8& ybmin,r_8& ybmax) const; 181 void GetBandY(int_4 n,r_8& xbmin,r_8& xbmax) const; 182 void ShowBand(int_4 lp = 0); 174 183 175 184 // SLICES 176 185 //! Retourne le nombre de slices selon X 177 inline int NSliX() const {return lslix.size();}186 inline int_4 NSliX() const {return mLSlix.size();} 178 187 //! Retourne le nombre de slices selon Y 179 inline int NSliY() const {return lsliy.size();}180 int SetSliX(intnsli);181 int SetSliY(intnsli);182 void 183 void 184 void 185 void 186 Histo* HSliX(intn) const;187 Histo* HSliY(intn) const;188 void ShowSli(intlp = 0);188 inline int_4 NSliY() const {return mLSliy.size();} 189 int_4 SetSliX(int_4 nsli); 190 int_4 SetSliY(int_4 nsli); 191 void DelSliX(); 192 void DelSliY(); 193 void ZeroSliX(); 194 void ZeroSliY(); 195 Histo* HSliX(int_4 n) const; 196 Histo* HSliY(int_4 n) const; 197 void ShowSli(int_4 lp = 0); 189 198 190 199 #ifndef __DECCXX … … 193 202 //! structure de definition des bandes 194 203 struct bande_slice { 195 int num; //!< nombre de bandes196 float min;//!< limite minimum pour remplir la bande197 float max;//!< limite maximum pour remplir la bande198 Histo* H; //!< pointer sur l Histo 1D de la bande204 int_4 num; //!< nombre de bandes 205 r_8 min; //!< limite minimum pour remplir la bande 206 r_8 max; //!< limite maximum pour remplir la bande 207 Histo* H; //!< pointer sur l Histo 1D de la bande 199 208 STRUCTCOMP(bande_slice) 200 209 }; … … 205 214 void Delete(); 206 215 207 float* data; //!< donnees208 double* err2; //!< erreurs carrees209 210 float over[3][3]; //!< overflow table211 double nHist;//!< somme ponderee des entrees212 int_4 nEntries;//!< nombre d'entrees213 214 int_4 nx; //!< nombre de bins en X215 int_4 ny; //!< nombre de bins en Y216 int_4 nxy; //!< nombre de bins total217 float xmin; //!< abscisse minimum218 float xmax; //!< abscisse maximum219 float ymin; //!< ordonnee minimum220 float ymax; //!< ordonnee maximum221 float wbinx; //!< largeur du bin en X222 float wbiny; //!< largeur du bin en Y223 224 bande_slice b_s;225 226 Histo* hprojx; //!< pointer sur Histo des proj X227 Histo* hprojy; //!< pointer sur Histo des proj Y228 229 list<bande_slice> lbandx; //!< liste des bandes selon X230 list<bande_slice> lbandy; //!< liste des bandes selon Y216 r_8* mData; //!< donnees 217 r_8* mErr2; //!< erreurs carrees 218 219 r_8 mOver[3][3]; //!< overflow table 220 r_8 nHist; //!< somme ponderee des entrees 221 int_4 nEntries; //!< nombre d'entrees 222 223 int_4 mNx; //!< nombre de bins en X 224 int_4 mNy; //!< nombre de bins en Y 225 int_4 mNxy; //!< nombre de bins total 226 r_8 mXmin; //!< abscisse minimum 227 r_8 mXmax; //!< abscisse maximum 228 r_8 mYmin; //!< ordonnee minimum 229 r_8 mYmax; //!< ordonnee maximum 230 r_8 mWBinx; //!< largeur du bin en X 231 r_8 mWBiny; //!< largeur du bin en Y 232 233 bande_slice mB_s; 234 235 Histo* mHprojx; //!< pointer sur Histo des proj X 236 Histo* mHprojy; //!< pointer sur Histo des proj Y 237 238 list<bande_slice> mLBandx; //!< liste des bandes selon X 239 list<bande_slice> mLBandy; //!< liste des bandes selon Y 231 240 232 list<bande_slice> lslix; //!< liste des slices selon X233 list<bande_slice> lsliy; //!< liste des slices selon Y241 list<bande_slice> mLSlix; //!< liste des slices selon X 242 list<bande_slice> mLSliy; //!< liste des slices selon Y 234 243 235 244 }; … … 250 259 // ObjFileIO<Histo2D> 251 260 252 /*! \ingroup HiStats \fn operator*(const Histo2D&, double)261 /*! \ingroup HiStats \fn operator*(const Histo2D&,r_8) 253 262 \brief Operateur H2 = H1 * b */ 254 inline Histo2D operator * (const Histo2D& a, doubleb)263 inline Histo2D operator * (const Histo2D& a, r_8 b) 255 264 { 256 265 Histo2D result(a); … … 258 267 } 259 268 260 /*! \ingroup HiStats \fn operator*( double,const Histo2D&)269 /*! \ingroup HiStats \fn operator*(r_8,const Histo2D&) 261 270 \brief Operateur H2 = b * H1 */ 262 inline Histo2D operator * ( doubleb, const Histo2D& a)271 inline Histo2D operator * (r_8 b, const Histo2D& a) 263 272 { 264 273 Histo2D result(a); … … 266 275 } 267 276 268 /*! \ingroup HiStats \fn operator/(const Histo2D&, double)277 /*! \ingroup HiStats \fn operator/(const Histo2D&,r_8) 269 278 \brief Operateur H2 = H1 / b */ 270 inline Histo2D operator / (const Histo2D& a, doubleb)279 inline Histo2D operator / (const Histo2D& a, r_8 b) 271 280 { 272 281 Histo2D result(a); … … 274 283 } 275 284 276 /*! \ingroup HiStats \fn operator+(const Histo2D&, double)285 /*! \ingroup HiStats \fn operator+(const Histo2D&,r_8) 277 286 \brief Operateur H2 = H1 + b */ 278 inline Histo2D operator + (const Histo2D& a, doubleb)287 inline Histo2D operator + (const Histo2D& a, r_8 b) 279 288 { 280 289 Histo2D result(a); … … 282 291 } 283 292 284 /*! \ingroup HiStats \fn operator+( double,const Histo2D&)293 /*! \ingroup HiStats \fn operator+(r_8,const Histo2D&) 285 294 \brief Operateur H2 = b + H1 */ 286 inline Histo2D operator + ( doubleb, const Histo2D& a)295 inline Histo2D operator + (r_8 b, const Histo2D& a) 287 296 { 288 297 Histo2D result(a); … … 290 299 } 291 300 292 /*! \ingroup HiStats \fn operator-(const Histo2D&, double)301 /*! \ingroup HiStats \fn operator-(const Histo2D&,r_8) 293 302 \brief Operateur H2 = H1 - b */ 294 inline Histo2D operator - (const Histo2D& a, doubleb)303 inline Histo2D operator - (const Histo2D& a, r_8 b) 295 304 { 296 305 Histo2D result(a); … … 298 307 } 299 308 300 /*! \ingroup HiStats \fn operator-( double,const Histo2D&)309 /*! \ingroup HiStats \fn operator-(r_8,const Histo2D&) 301 310 \brief Operateur H2 = b - H1 */ 302 inline Histo2D operator - ( doubleb, const Histo2D& a)311 inline Histo2D operator - (r_8 b, const Histo2D& a) 303 312 { 304 313 Histo2D result(a); -
trunk/SophyaLib/HiStats/ntuple.cc
r1046 r1092 324 324 for(i=0; i<mNVar; i++) { 325 325 GetMinMax(i, min, max); 326 sprintf(buff, "%3d %16s %10 lg %10lg \n", i, mNames+i*LENNAME1, min, max);326 sprintf(buff, "%3d %16s %10g %10g \n", i, mNames+i*LENNAME1, min, max); 327 327 os << (string)buff ; 328 328 } -
trunk/SophyaLib/NTools/cimage.cc
r490 r1092 5 5 // LAL (Orsay) / IN2P3-CNRS DAPNIA/SPP (Saclay) / CEA 6 6 7 // $Id: cimage.cc,v 1. 5 1999-10-21 15:25:42ansari Exp $7 // $Id: cimage.cc,v 1.6 2000-07-26 13:15:29 ansari Exp $ 8 8 9 9 … … 723 723 // redimensionnement de l'histo pour avoir une bonne signification stat. 724 724 for(;;) { 725 floatmax1,max2;726 int imax1,imax2;725 r_8 max1,max2; 726 int_4 imax1,imax2; 727 727 rc = H.MaxiLocal(max1,imax1,max2,imax2); 728 728 float rap = 1.; … … 742 742 743 743 TRY { 744 xbmax = H.FitMax(2,0.5 f,deb-2);744 xbmax = H.FitMax(2,0.5,deb-2); 745 745 if(deb>1) cout<<"H.FitMax = "<<xbmax<<endl; 746 746 } CATCHALL { … … 750 750 751 751 TRY { 752 float sdroit = -2.; 753 H.EstimeWidthS(0.5f,sgbmax,sdroit); 754 if(sgbmax<=0.) sgbmax = H.FindWidth(0.5f,deb-2); 755 sgbmax /= 2.36; 752 r_8 sdroit = -2., dum=sgbmax; 753 H.EstimeWidthS(0.5,dum,sdroit); 754 if(dum<=0.) dum = H.FindWidth(0.5,deb-2); 755 dum /= 2.36; 756 sgbmax = dum; 756 757 if(deb>1) cout<<"H.FindWidth = "<<sgbmax<<" (droit="<<sdroit<<")"<<endl; 757 758 } CATCHALL { -
trunk/SophyaLib/NTools/perandom.cc
r244 r1092 15 15 16 16 //++ 17 FunRan::FunRan(FunRan::Func f, float xMin, float xMax, intnBin)17 FunRan::FunRan(FunRan::Func f, r_8 xMin, r_8 xMax, int_4 nBin) 18 18 // 19 19 // Createur. … … 22 22 { 23 23 (*this)(0) = f(BinLowEdge(0)); 24 for(int i=1; i<nBin; i++)24 for(int_4 i=1; i<nBin; i++) 25 25 (*this)(i) = (*this)(i-1) + f(BinLowEdge(i)); 26 26 27 for(int j=0; j<nBin; j++)27 for(int_4 j=0; j<nBin; j++) 28 28 (*this)(j) /= (*this)(nBin-1); 29 29 END_CONSTRUCTOR … … 31 31 32 32 //++ 33 FunRan::FunRan( double *tab, intnBin)34 // 35 // Createur. 36 //-- 37 : Histo(0, ( float)(nBin), nBin)33 FunRan::FunRan(r_8 *tab, int_4 nBin) 34 // 35 // Createur. 36 //-- 37 : Histo(0, (r_8)(nBin), nBin) 38 38 { 39 39 (*this)(0) = tab[0]; 40 for(int i=1; i<nBin; i++)40 for(int_4 i=1; i<nBin; i++) 41 41 (*this)(i) = (*this)(i-1) + tab[i]; 42 42 … … 46 46 } 47 47 48 for(int j=0; j<nBin; j++)48 for(int_4 j=0; j<nBin; j++) 49 49 (*this)(j) /= (*this)(nBin-1); 50 50 END_CONSTRUCTOR 51 51 } 52 52 53 FunRan::FunRan( double *tab, int nBin, float xMin, floatxMax)53 FunRan::FunRan(r_8 *tab, int_4 nBin, r_8 xMin, r_8 xMax) 54 54 : Histo(xMin, xMax, nBin) 55 55 { 56 56 (*this)(0) = tab[0]; 57 for(int i=1; i<nBin; i++)57 for(int_4 i=1; i<nBin; i++) 58 58 (*this)(i) = (*this)(i-1) + tab[i]; 59 59 … … 63 63 } 64 64 65 for(int j=0; j<nBin; j++)65 for(int_4 j=0; j<nBin; j++) 66 66 (*this)(j) /= (*this)(nBin-1); 67 67 END_CONSTRUCTOR … … 69 69 70 70 //++ 71 int FunRan::BinRandom()71 int_4 FunRan::BinRandom() 72 72 // 73 73 // Tirage avec retour du numero de bin. 74 74 //-- 75 75 { 76 doublez=drand01();76 r_8 z=drand01(); 77 77 if (z <= 0) return 0; 78 if (z >= 1) return bins-1;78 if (z >= 1) return mBins-1; 79 79 80 80 // recherche du premier bin plus grand que z 81 int iBin = 0;82 for (; iBin< bins; iBin++)81 int_4 iBin = 0; 82 for (; iBin<mBins; iBin++) 83 83 if (z < (*this)(iBin)) break; 84 84 … … 87 87 88 88 //++ 89 doubleFunRan::Random()89 r_8 FunRan::Random() 90 90 // 91 91 // Tirage avec retour abscisse du bin interpole. 92 92 //-- 93 93 { 94 doublez=drand01();95 if (z <= 0) return m in;96 if (z >= 1) return m ax;94 r_8 z=drand01(); 95 if (z <= 0) return mMin; 96 if (z >= 1) return mMax; 97 97 // cas z <= tab[0] 98 98 if (z <= (*this)(0)) { 99 double t = min + binWidth/(*this)(0) * z;99 r_8 t = mMin + binWidth/(*this)(0) * z; 100 100 return t; 101 101 } 102 102 103 103 // recherche du premier bin plus grand que z 104 int iBin = 0;105 for (; iBin< bins; iBin++)104 int_4 iBin = 0; 105 for (; iBin<mBins; iBin++) 106 106 if (z < (*this)(iBin)) break; 107 107 108 108 // interpolation pour trouver la valeur du tirage aleatoire 109 doublet1 = (*this)(iBin-1);110 doublex1 = BinLowEdge(iBin-1);111 doublet2 = (*this)(iBin);112 doublex2 = x1 + binWidth;113 doublet = x1 + (x2-x1) / (t2-t1) * (z-t1);114 if (t < m in) t = min;115 if (t > m ax) t = max;109 r_8 t1 = (*this)(iBin-1); 110 r_8 x1 = BinLowEdge(iBin-1); 111 r_8 t2 = (*this)(iBin); 112 r_8 x2 = x1 + binWidth; 113 r_8 t = x1 + (x2-x1) / (t2-t1) * (z-t1); 114 if (t < mMin) t = mMin; 115 if (t > mMax) t = mMax; 116 116 return(t); 117 117 } … … 129 129 130 130 //++ 131 FunRan2D::FunRan2D( double *tab, int nBinX, intnBinY)131 FunRan2D::FunRan2D(r_8 *tab, int_4 nBinX, int_4 nBinY) 132 132 // 133 133 // Createur. … … 135 135 { 136 136 // Tirage en X, somme sur les Y. 137 double* tabX = new double[nBinX];138 for (int i=0; i<nBinX; i++) {137 r_8* tabX = new r_8[nBinX]; 138 for (int_4 i=0; i<nBinX; i++) { 139 139 tabX[i] = 0; 140 for (int j=0; j<nBinY; j++) {140 for (int_4 j=0; j<nBinY; j++) { 141 141 tabX[i] += tab[i*nBinY +j]; 142 142 } … … 147 147 ranY = new(FunRan*[nBinX]); 148 148 149 for (int k=0; k<nBinX; k++)149 for (int_4 k=0; k<nBinX; k++) 150 150 ranY[k] = new FunRan(tab + nBinY*k, nBinY); 151 151 … … 155 155 156 156 //++ 157 FunRan2D::FunRan2D( double **tab, int nBinX, intnBinY)157 FunRan2D::FunRan2D(r_8 **tab, int_4 nBinX, int_4 nBinY) 158 158 // 159 159 // Createur. … … 161 161 { 162 162 // Tirage en X, somme sur les Y. 163 double* tabX = new double[nBinX];164 for (int i=0; i<nBinX; i++) {163 r_8* tabX = new r_8[nBinX]; 164 for (int_4 i=0; i<nBinX; i++) { 165 165 tabX[i] = 0; 166 for (int j=0; j<nBinY; j++) {166 for (int_4 j=0; j<nBinY; j++) { 167 167 tabX[i] += tab[i][j]; 168 168 } … … 172 172 ranY = new(FunRan*[nBinX]); 173 173 174 for (int k=0; k<nBinX; k++)174 for (int_4 k=0; k<nBinX; k++) 175 175 if (tabX[k] != 0) 176 176 ranY[k] = new FunRan(tab[k], nBinY); … … 184 184 FunRan2D::~FunRan2D() 185 185 { 186 for (int i=nx-1; i>=0; i--)186 for (int_4 i=nx-1; i>=0; i--) 187 187 delete ranY[i]; 188 188 … … 193 193 194 194 //++ 195 void FunRan2D::BinRandom(int & x, int& y)195 void FunRan2D::BinRandom(int_4& x, int_4& y) 196 196 // 197 197 // Tirage avec retour du numeros de bin. … … 204 204 205 205 //++ 206 void FunRan2D::Random( double& x, double& y)206 void FunRan2D::Random(r_8& x, r_8& y) 207 207 // 208 208 // Tirage avec retour abscisse et ordonnee … … 211 211 { 212 212 x = ranX->Random(); 213 int i = int(ceil(x));213 int_4 i = int_4(ceil(x)); 214 214 // FAILNIL(ranY[i]); Ne compile pas $CHECK$ Reza 22/04/99 215 215 y = ranY[i]->Random(); -
trunk/SophyaLib/NTools/perandom.h
r244 r1092 13 13 class FunRan : public Histo { 14 14 public: 15 typedef double (*Func)(double);16 FunRan(Func f, float xMin=0.0, float xMax=1.0, intnBin=100);17 FunRan( double *tab, intnBin);18 FunRan( double *tab, int nBin, float xMin, floatxMax);19 void IFunRan( double *tab, intnBin);20 doubleRandom(void);21 int BinRandom(void);15 typedef r_8 (*Func)(r_8); 16 FunRan(Func f, r_8 xMin=0.0, r_8 xMax=1.0, int_4 nBin=100); 17 FunRan(r_8 *tab, int_4 nBin); 18 FunRan(r_8 *tab, int_4 nBin, r_8 xMin, r_8 xMax); 19 void IFunRan(r_8 *tab, int_4 nBin); 20 r_8 Random(void); 21 int_4 BinRandom(void); 22 22 }; 23 23 24 24 class FunRan2D EXC_AWARE { 25 25 public: 26 // typedef double (*Func)(double, double);27 // FunRan2D(Func f, float xMin=0.0, float xMax=1.0, intnBinX=100,28 // float yMin=0.0, float yMax=1.0, intnBinY=100);29 FunRan2D( double *tab, int nBinX, intnBinY);30 FunRan2D( double **tab, int nBinX, intnBinY);26 // typedef r_8 (*Func)(r_8, r_8); 27 // FunRan2D(Func f, r_8 xMin=0.0, r_8 xMax=1.0, int_4 nBinX=100, 28 // r_8 yMin=0.0, r_8 yMax=1.0, int_4 nBinY=100); 29 FunRan2D(r_8 *tab, int_4 nBinX, int_4 nBinY); 30 FunRan2D(r_8 **tab, int_4 nBinX, int_4 nBinY); 31 31 ~FunRan2D(); 32 void Random( double& x, double& y);33 void BinRandom(int & x, int& y);32 void Random(r_8& x, r_8& y); 33 void BinRandom(int_4& x, int_4& y); 34 34 private: 35 35 FunRan* ranX; 36 36 FunRan** ranY; 37 int nx;37 int_4 nx; 38 38 }; 39 39 -
trunk/SophyaProg/Tests/tobjio.cc
r881 r1092 60 60 61 61 { // Objet Histo-2D 62 floatx,y,w;62 r_8 x,y,w; 63 63 int i,j; 64 64 Histo2D* h = new Histo2D(-10.,10.,25,-10.,10.,25); -
trunk/SophyaProg/Tests/tobjio2.cc
r987 r1092 59 59 60 60 { // Objet Histo-2D 61 floatx,y,w;61 r_8 x,y,w; 62 62 int i,j; 63 63 Histo2D* h = new Histo2D(-10.,10.,25,-10.,10.,25);
Note:
See TracChangeset
for help on using the changeset viewer.