#include <Hist1d.h>
Public Types | |
| typedef std::vector< Anp::Bin< T > >::const_iterator | BinIter |
| typedef std::vector< Anp::Bin< T > >::iterator | BinIterator |
| typedef std::vector< T >::const_iterator | Iter |
| typedef std::vector< T >::iterator | Iterator |
Public Member Functions | |
| Hist1d () | |
| Hist1d (unsigned int nbin, const T low, const T high) | |
| Hist1d (const std::vector< T > &vec) | |
| Hist1d (const TH1 &h) | |
| ~Hist1d () | |
| unsigned int | Fill (const T value) |
| unsigned int | Fill (const T value, const T weight) |
| unsigned int | Fill (const T value, const T weight, const T width) |
| unsigned int | Fill (const TH1 &h) |
| unsigned int | Merge (const T minvalue) |
| unsigned int | Rebin (unsigned int ngroup) |
| Bin< T > & | operator[] (unsigned int bin) |
| Bin< T > & | GetBin (const T value) |
| const Bin< T > & | operator[] (unsigned int bin) const |
| const Bin< T > & | GetBin (const T value) const |
| T | GetIntegral (const std::string &option="") const |
| unsigned int | GetEntries (const std::string &option="") const |
| unsigned int | GetNbins () const |
| const std::vector< Anp::Bin< T > > & | GetBins () const |
| void | Reset () |
| void | Print (std::ostream &o=std::cout) const |
Private Member Functions | |
| const Bin< T > & | get_bin_const (const T value) const |
| Bin< T > & | get_bin (const T value) |
| void | init_bins () |
| void | init_bins (std::vector< T > vec) |
| void | init_trivial () |
Private Attributes | |
| std::vector< Anp::Bin< T > > | fData |
| unsigned int | fNBin |
| T | fLowEdge |
| T | fHighEdge |
| bool | fSearchBin |
|
|||||
|
Definition at line 86 of file Hist1d.h. Referenced by Anp::Hist1d< T >::get_bin_const(), Anp::Hist1d< T >::GetEntries(), Anp::Hist1d< T >::GetIntegral(), and Anp::Hist1d< T >::Print(). |
|
|||||
|
Definition at line 87 of file Hist1d.h. Referenced by Anp::Hist1d< T >::Fill(), Anp::Hist1d< T >::Merge(), and Anp::Hist1d< T >::Reset(). |
|
|||||
|
|
|
|||||
|
|
|
|||||||||
|
Definition at line 345 of file Hist1d.h. References Anp::Hist1d< T >::init_trivial(). 00346 : fData(), fNBin(0), fLowEdge(), fHighEdge(), fSearchBin(false) 00347 { 00348 init_trivial(); 00349 }
|
|
||||||||||||||||||||
|
Definition at line 353 of file Hist1d.h. References Anp::Hist1d< T >::fNBin, Anp::Hist1d< T >::init_bins(), and Anp::Hist1d< T >::init_trivial(). 00354 : fData(), fNBin(nbin), fLowEdge(low), fHighEdge(high), fSearchBin(false) 00355 { 00356 if(fNBin > 0) 00357 { 00358 init_bins(); 00359 } 00360 else 00361 { 00362 init_trivial(); 00363 } 00364 }
|
|
||||||||||
|
Definition at line 368 of file Hist1d.h. References Anp::Hist1d< T >::init_bins(), and Anp::Hist1d< T >::init_trivial(). 00369 : fData(), fNBin(0), fLowEdge(), fHighEdge(), fSearchBin(true) 00370 { 00371 if(vec.size() > 1) 00372 { 00373 init_bins(vec); 00374 } 00375 else 00376 { 00377 init_trivial(); 00378 } 00379 }
|
|
||||||||||
|
Definition at line 383 of file Hist1d.h. References Anp::Bin< T >::add(), Anp::Hist1d< T >::fData, and NR::sort(). 00384 :fData(), 00385 fNBin(h.GetNbinsX()), 00386 fLowEdge(h.GetXaxis() -> GetXmin()), 00387 fHighEdge(h.GetXaxis() -> GetXmax()), 00388 fSearchBin(true) 00389 { 00390 const int nbin = h.GetNbinsX(); 00391 00392 if(nbin < 2) 00393 { 00394 std::cerr << "Hist1d<T>::Hist1d encountered TH1 without bins" << std::endl; 00395 return; 00396 } 00397 00398 for(int ibin = 1; ibin <= nbin + 1; ++ibin) 00399 { 00400 const double value = h.GetBinContent(ibin); 00401 const double edge = h.GetBinLowEdge(ibin); 00402 00403 if(ibin == 1) 00404 { 00405 fData.push_back(Bin<T>(0, edge)); 00406 } 00407 00408 Bin<T> bin(ibin, edge); 00409 bin.add(value); 00410 00411 fData.push_back(bin); 00412 } 00413 00414 std::sort(fData.begin(), fData.end()); 00415 }
|
|
|||||||||
|
Definition at line 419 of file Hist1d.h. 00419 {}
|
|
||||||||||
|
Definition at line 541 of file Hist1d.h. References Anp::Bin< T >::add(), Anp::Hist1d< T >::fData, and Anp::Hist1d< T >::Fill(). 00542 {
00543 const int nbin = h.GetNbinsX();
00544
00545 assert(nbin > 1 && "Hist1d<T>::Fill encountered TH1 without bins");
00546
00547 for(int ibin = 0; ibin <= nbin + 1; ++ibin)
00548 {
00549 const double value = h.GetBinContent(ibin);
00550 const double center = h.GetBinCenter(ibin);
00551
00552 if(ibin == 0)
00553 {
00554 fData.front().add(value);
00555 }
00556 else if(ibin == nbin + 1)
00557 {
00558 fData.back().add(value);
00559 }
00560 else
00561 {
00562 Fill(center, value);
00563 }
00564 }
00565
00566 return 0;
00567 }
|
|
||||||||||||||||||||
|
Definition at line 441 of file Hist1d.h. References Anp::Bin< T >::add(), Anp::Bin< T >::bin(), Anp::Hist1d< T >::BinIterator, Anp::Hist1d< T >::fData, Anp::Hist1d< T >::Fill(), and Anp::Hist1d< T >::fNBin. 00442 {
00443 if(!(width > 0.0) || fNBin < 1 || fData.empty())
00444 {
00445 return Fill(value, weight);
00446 }
00447
00448 // compute boundaries for non zero kernel coontributions
00449 const T lpos = value - width;
00450 const T rpos = value + width;
00451
00452 // Only overlap with underflow or overflow bins
00453 if(rpos < fData.front())
00454 {
00455 // rpos < underflow bin edge - no contribution to other bins
00456 Bin<T> &bin = fData.front();
00457 bin.add(weight);
00458 return bin.bin();
00459 }
00460 else if(!(lpos < fData.back()))
00461 {
00462 // lpos >= last overflow edge - no contribution to other bins
00463 Bin<T> &bin = fData.back();
00464 bin.add(weight);
00465 return bin.bin();
00466 }
00467
00468 BinIterator lit = std::lower_bound(fData.begin(), fData.end(), lpos);
00469 if(lit == fData.end())
00470 {
00471 std::cerr << "Hist1d<T>::Fill - lower_bound has failed to find correct bin" << std::endl;
00472 return 0;
00473 }
00474
00475 // make copy of beg and end iterators
00476 BinIterator ibeg = fData.begin();
00477 BinIterator iend = fData.end();
00478
00479 //
00480 // special case: compute overlap with underflow bin
00481 //
00482 if(lit == ibeg)
00483 {
00484 if(lpos < ibeg -> edge())
00485 {
00486 ibeg -> add(weight*GetKernelOverlap<T>(lpos, ibeg -> edge(), value, width));
00487 }
00488
00489 lit++;
00490 }
00491 else
00492 {
00493 lit--;
00494 assert(lit != ibeg && "logic error finding underflow bin");
00495 }
00496
00497 for(; lit != iend; ++lit)
00498 {
00499 //
00500 // No more non overlapping bins
00501 //
00502 if(!(lit -> edge() < rpos))
00503 {
00504 break;
00505 }
00506
00507 //
00508 // Overlap with this bin
00509 //
00510 T overlap = 0;
00511
00512 const BinIterator nit = lit + 1;
00513 if(nit == iend)
00514 {
00515 overlap = Anp::GetKernelOverlap<T>(lit -> edge(), rpos, value, width);
00516 }
00517 else
00518 {
00519 //
00520 // kernel is entirely contain in a single bin
00521 //
00522 if(lit -> edge() < lpos && rpos < nit -> edge())
00523 {
00524 lit -> add(weight);
00525 break;
00526 }
00527
00528 overlap = Anp::GetKernelOverlap<T>(std::max<T>(lit -> edge(), lpos),
00529 std::min<T>(nit -> edge(), rpos),
00530 value, width);
00531 }
00532
00533 lit -> add(weight*overlap); // compute overlap fraction with this bin
00534 }
00535
00536 return 0;
00537 }
|
|
||||||||||||||||
|
Definition at line 432 of file Hist1d.h. References Anp::Bin< T >::add(), Anp::Bin< T >::bin(), and Anp::Hist1d< T >::get_bin(). 00433 {
00434 Bin<T> &bin = get_bin(value);
00435 bin.add(weight);
00436 return bin.bin();
00437 }
|
|
||||||||||
|
Definition at line 423 of file Hist1d.h. References Anp::Bin< T >::add(), Anp::Bin< T >::bin(), and Anp::Hist1d< T >::get_bin(). Referenced by Plot::Hist::CreateRatio(), Anp::Hist1d< T >::Fill(), Plot::Hist::GetRatio(), Anp::CountHist::Refill(), and Plot::TestHist(). 00424 {
00425 Bin<T> &bin = get_bin(value);
00426 bin.add();
00427 return bin.bin();
00428 }
|
|
||||||||||
|
Definition at line 896 of file Hist1d.h. References Anp::Hist1d< T >::get_bin_const(). Referenced by Anp::Hist1d< T >::Fill(), and Anp::Hist1d< T >::GetBin(). 00897 {
00898 return const_cast<Bin<T> &>(get_bin_const(value));
00899 }
|
|
||||||||||
|
Definition at line 839 of file Hist1d.h. References Anp::Hist1d< T >::BinIter, Anp::Hist1d< T >::fData, Anp::Hist1d< T >::fHighEdge, and Anp::Hist1d< T >::fNBin. Referenced by Anp::Hist1d< T >::get_bin(), and Anp::Hist1d< T >::GetBin(). 00840 {
00841 assert(!fData.empty() && "Hist1d<T>::get_bin_const() - vector is empty");
00842
00843 if(fData.size() == 1)
00844 {
00845 return fData.front();
00846 }
00847 else if(value < fData.front())
00848 {
00849 // value < underflow bin edge so return underflow bin
00850 return fData.front();
00851 }
00852 else if(!(value < fData.back()))
00853 {
00854 // value >= last overflow edge so return overflow bin
00855 return fData.back();
00856 }
00857
00858 // this point is reached if value >= low edge AND value < high edge
00859 // use stl binary_search to find proper bin, exclude underflow bin
00860
00861 if(fSearchBin)
00862 {
00863 BinIter bit = std::lower_bound(fData.begin() + 1, fData.end(), value);
00864 if(bit == fData.end())
00865 {
00866 std::cerr << "Hist1d<T>::get_bin_const() - lower_bound has failed to find bin" << std::endl;
00867 return fData.back();
00868 }
00869 else if(!(value < *bit) && !(*bit < value))
00870 {
00871 return *bit;
00872 }
00873
00874 return *(bit - 1);
00875 }
00876 else
00877 {
00878 const unsigned int bin =
00879 1 + static_cast<unsigned int>((fNBin*(value - fLowEdge))/(fHighEdge - fLowEdge));
00880
00881 if(bin > fNBin)
00882 {
00883 std::cerr << "Hist1d<T>::get_bin_const() - logic error #1" << std::endl;
00884 return fData.back();
00885 }
00886
00887 return fData[bin];
00888 }
00889
00890 std::cerr << "Hist1d<T>::get_bin_const() - logic error #2" << std::endl;
00891 return fData.front();
00892 }
|
|
||||||||||
|
Definition at line 752 of file Hist1d.h. References Anp::Hist1d< T >::get_bin_const(). 00753 {
00754 return get_bin_const(value);
00755 }
|
|
||||||||||
|
Definition at line 730 of file Hist1d.h. References Anp::Hist1d< T >::get_bin(). 00731 {
00732 return get_bin(value);
00733 }
|
|
|||||||||
|
Definition at line 825 of file Hist1d.h. Referenced by Anp::CreateTH1(). 00825 { return fData; }
|
|
||||||||||
|
Definition at line 759 of file Hist1d.h. References Anp::Hist1d< T >::BinIter, Anp::Hist1d< T >::fData, and option. 00760 {
00761 if(fData.size() < 2)
00762 {
00763 return 0;
00764 }
00765
00766 unsigned int entries = 0;
00767
00768 BinIter beg = fData.begin();
00769 BinIter end = fData.end();
00770
00771 if(option.find("U") == std::string::npos)
00772 {
00773 beg++;
00774 }
00775 if(option.find("O") == std::string::npos)
00776 {
00777 end--;
00778 }
00779
00780 for(BinIter cit = beg; cit != end; ++cit)
00781 {
00782 entries += cit -> entries();
00783 }
00784
00785 return entries;
00786 }
|
|
||||||||||
|
Definition at line 790 of file Hist1d.h. References Anp::Hist1d< T >::BinIter, Anp::Hist1d< T >::fData, and option. Referenced by Anp::CreateTH1(). 00791 {
00792 if(fData.size() < 2)
00793 {
00794 return 0;
00795 }
00796
00797 T integral = 0;
00798
00799 BinIter beg = fData.begin();
00800 BinIter end = fData.end();
00801
00802 if(option.find("U") == std::string::npos)
00803 {
00804 beg++;
00805 }
00806 if(option.find("O") == std::string::npos)
00807 {
00808 end--;
00809 }
00810
00811 for(BinIter cit = beg; cit != end; ++cit)
00812 {
00813 integral += cit -> sum();
00814 }
00815
00816 return integral;
00817 }
|
|
|||||||||
|
Definition at line 821 of file Hist1d.h. 00821 { return fNBin; }
|
|
||||||||||
|
Definition at line 934 of file Hist1d.h. References Anp::Hist1d< T >::fData, Anp::Hist1d< T >::fNBin, and NR::sort(). 00935 {
00936 assert(vec.size() > 1 && "Hist1d<T>::init_bins() encountered small vector");
00937
00938 // sort bin edges
00939 std::sort(vec.begin(), vec.end());
00940
00941 fNBin = vec.size() - 1;
00942 fData.push_back(Bin<T>(0, vec.front()));
00943
00944 for(unsigned int ibin = 0; ibin < vec.size(); ++ibin)
00945 {
00946 fData.push_back(Bin<T>(ibin + 1, vec[ibin]));
00947 }
00948
00949 // sort all but first overflow bin
00950 std::sort(fData.begin() + 1, fData.end());
00951 }
|
|
|||||||||
|
Definition at line 911 of file Hist1d.h. References Anp::Hist1d< T >::fData, Anp::Hist1d< T >::fHighEdge, Anp::Hist1d< T >::fLowEdge, Anp::Hist1d< T >::fNBin, Anp::Hist1d< T >::init_trivial(), and NR::sort(). Referenced by Anp::Hist1d< T >::Hist1d(). 00912 {
00913 if(!(fLowEdge < fHighEdge))
00914 {
00915 std::cerr << "Hist1d<T>::init_bins() - minimum is not larger than maximum" << std::endl;
00916 init_trivial();
00917 return;
00918 }
00919
00920 fData.push_back(Bin<T>(0, fLowEdge));
00921
00922 for(unsigned int ibin = 0; ibin < fNBin + 1; ++ibin)
00923 {
00924 const T edge = fLowEdge + static_cast<T>(((fHighEdge - fLowEdge)*ibin)/fNBin);
00925 fData.push_back(Bin<T>(ibin + 1, edge));
00926 }
00927
00928 // sort all but first overflow bin
00929 std::sort(fData.begin() + 1, fData.end());
00930 }
|
|
|||||||||
|
Definition at line 903 of file Hist1d.h. References Anp::Hist1d< T >::fData, and Anp::Hist1d< T >::fNBin. Referenced by Anp::Hist1d< T >::Hist1d(), and Anp::Hist1d< T >::init_bins().
|
|
||||||||||
|
Definition at line 571 of file Hist1d.h. References Anp::Hist1d< T >::BinIterator, Anp::Hist1d< T >::fData, and Anp::Hist1d< T >::fNBin. Referenced by Anp::CountHist::ComputeRatio(), Plot::Hist::CreateRatio(), and Plot::TestHist(). 00572 {
00573 unsigned int nmerge = 0;
00574
00575 typename std::vector<Bin<T> >::iterator bit = fData.begin();
00576 while(bit != fData.end())
00577 {
00578 if(bit -> sum() > minvalue)
00579 {
00580 ++bit;
00581 continue;
00582 }
00583
00584 if(bit == fData.begin() || bit - 1 == fData.begin())
00585 {
00586 ++bit;
00587 continue;
00588 }
00589
00590 if(bit + 1 == fData.end() || bit + 2 == fData.end())
00591 {
00592 ++bit;
00593 continue;
00594 }
00595
00596 typename std::vector<Bin<T> >::iterator lit = bit - 1;
00597 typename std::vector<Bin<T> >::iterator hit = bit + 1;
00598
00599 if(lit -> sum() < hit -> sum())
00600 {
00601 const Bin<T> newbin(*lit, *bit);
00602
00603 typename std::vector<Bin<T> >::iterator pit = fData.erase(lit, bit + 1);
00604
00605 fData.insert(pit, newbin);
00606 }
00607 else
00608 {
00609 const Bin<T> newbin(*bit, *hit);
00610
00611 typename std::vector<Bin<T> >::iterator pit = fData.erase(bit, hit + 1);
00612
00613 fData.insert(pit, newbin);
00614 }
00615
00616 bit = fData.begin();
00617
00618 ++nmerge;
00619 }
00620
00621 BinIterator pit = fData.begin();
00622 for(BinIterator cit = fData.begin(); cit != fData.end(); ++cit)
00623 {
00624 if(cit == fData.begin() || cit - 1 == fData.begin())
00625 {
00626 pit = cit;
00627 continue;
00628 }
00629
00630 if(!(pit -> edge() < cit -> edge()) || !(pit -> bin() < cit -> bin()))
00631 {
00632 std::cerr << "Hist1d<T>::Merge - logic error for bin " << cit -> bin() << std::endl;
00633 }
00634
00635 pit = cit;
00636
00637 cit -> set_bin(std::distance(fData.begin(), cit));
00638
00639 }
00640
00641 fNBin = fData.size() - 2;
00642
00643 return nmerge;
00644 }
|
|
||||||||||
|
Definition at line 737 of file Hist1d.h. References Anp::Hist1d< T >::fData. 00738 {
00739 assert(!fData.empty() && "empty bin vector in Hist1d<T>::operator[]");
00740
00741 if(bin >= fData.size())
00742 {
00743 std::cerr << "Hist1d<T>::operator[" << bin << "] is out of range" << std::endl;
00744 return fData.back();
00745 }
00746
00747 return fData[bin];
00748 }
|
|
||||||||||
|
Definition at line 715 of file Hist1d.h. References Anp::Hist1d< T >::fData. 00716 {
00717 assert(!fData.empty() && "empty bin vector in Hist1d<T>::operator[]");
00718
00719 if(bin >= fData.size())
00720 {
00721 std::cerr << "Hist1d<T>::operator[" << bin << "] is out of range" << std::endl;
00722 return fData.back();
00723 }
00724
00725 return fData[bin];
00726 }
|
|
||||||||||
|
Definition at line 955 of file Hist1d.h. References Anp::Hist1d< T >::BinIter, Anp::Hist1d< T >::fData, Anp::Hist1d< T >::fNBin, and print(). Referenced by Anp::operator<<(), and Plot::TestHist(). 00956 {
00957 o << "Printing 1d histogram containing " << fNBin << " bins" << std::endl;
00958
00959 short width = 1;
00960 for(short i = 1; i < 10; ++i)
00961 {
00962 if(fNBin < 10^(i))
00963 {
00964 width = i;
00965 break;
00966 }
00967 }
00968 if(width < 4)
00969 {
00970 width = 4;
00971 }
00972
00973 for(BinIter it = fData.begin(); it != fData.end(); ++it)
00974 {
00975 it -> print(o, width, width);
00976 }
00977 }
|
|
||||||||||
|
Definition at line 648 of file Hist1d.h. References Anp::Hist1d< T >::fData, Anp::Hist1d< T >::fNBin, Anp::Hist1d< T >::fSearchBin, Anp::Bin< T >::set_bin(), and NR::sort(). Referenced by Plot::Hist::Rebin(). 00649 {
00650 //
00651 // rebin histogram by adding ngroup bins together
00652 //
00653
00654 if(ngroup < 1 || ngroup >= fNBin || fData.size() < 3)
00655 {
00656 return 0;
00657 }
00658
00659 std::vector<Anp::Bin<T> > data;
00660 bool newbin = true;
00661 Bin<T> bin;
00662
00663 assert(int(fNBin) == int(fData.size()) - 2 && "logic error counting bins");
00664
00665 for(unsigned int ibin = 1; ibin <= fNBin; ++ibin)
00666 {
00667 assert(ibin < fData.size() && "out of bounds access");
00668
00669 if(newbin)
00670 {
00671 bin = fData[ibin];
00672 newbin = false;
00673 continue;
00674 }
00675
00676 bin = Anp::Merge<T>(bin, fData[ibin]);
00677
00678 if(ibin % ngroup == 0)
00679 {
00680 data.push_back(bin);
00681 newbin = true;
00682 }
00683 }
00684
00685 //
00686 // Add last bin
00687 //
00688 if(!newbin) data.push_back(bin);
00689
00690 //
00691 // sort bins
00692 //
00693 std::sort(data.begin(), data.end());
00694
00695 //
00696 // Add overflow and underflow bins
00697 //
00698 data.insert(data.begin(), fData.front());
00699 data.insert(data.end(), fData.back());
00700
00701 for(unsigned int ibin = 0; ibin < data.size(); ibin++)
00702 {
00703 data[ibin].set_bin(ibin);
00704 }
00705
00706 fData = data;
00707 fNBin = data.size() - 2;
00708 fSearchBin = true;
00709
00710 return fNBin;
00711 }
|
|
|||||||||
|
Definition at line 829 of file Hist1d.h. References Anp::Hist1d< T >::BinIterator, and Anp::Hist1d< T >::fData. Referenced by Plot::Hist::CreateRatio(), Plot::Hist::GetRatio(), Anp::CountHist::Refill(), and Plot::TestHist(). 00830 {
00831 for(BinIterator cit = fData.begin(); cit != fData.end(); ++cit)
00832 {
00833 cit -> reset();
00834 }
00835 }
|
|
|||||
|
|||||
|
Definition at line 141 of file Hist1d.h. Referenced by Anp::Hist1d< T >::get_bin_const(), and Anp::Hist1d< T >::init_bins(). |
|
|||||
|
Definition at line 140 of file Hist1d.h. Referenced by Anp::Hist1d< T >::init_bins(). |
|
|||||
|
Definition at line 138 of file Hist1d.h. Referenced by Anp::Hist1d< T >::Fill(), Anp::Hist1d< T >::get_bin_const(), Anp::Hist1d< T >::Hist1d(), Anp::Hist1d< T >::init_bins(), Anp::Hist1d< T >::init_trivial(), Anp::Hist1d< T >::Merge(), Anp::Hist1d< T >::Print(), and Anp::Hist1d< T >::Rebin(). |
|
|||||
|
Definition at line 143 of file Hist1d.h. Referenced by Anp::Hist1d< T >::Rebin(). |
1.3.9.1