ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/Betchart/Book.h
Revision: 1.2
Committed: Mon Jul 20 13:10:06 2009 UTC (15 years, 9 months ago) by bbetchar
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +3 -0 lines
Log Message:
put Sumw2 by default

File Contents

# User Rev Content
1 bbetchar 1.1 #ifndef BOOK_FOR_ROOT_HISTOGRAMS
2     #define BOOK_FOR_ROOT_HISTOGRAMS
3    
4     #include <map>
5     #include <string>
6     #include "poly.h"
7     #include <boost/regex.hpp>
8     #include "TH1.h"
9     #include "TH1D.h"
10     #include "TH2D.h"
11     #include "TH3D.h"
12    
13     class Book {
14    
15     typedef std::map<std::string, TH1*> book_t;
16     book_t book;
17     const std::string _title;
18    
19     typedef const double& double_t;
20     typedef const unsigned long& uint_t;
21    
22     public:
23    
24     Book() : _title("") {}
25     Book(const std::string& t) : _title(t) {}
26    
27     const std::string& title() const {return _title;}
28     TH1* operator()(const std::string& name) { return book[name]; }
29     TH1* operator()(const std::string& name) const { return book.find(name)->second; }
30     bool contains (const std::string& name) const { return book.find(name) != book.end(); }
31    
32     bool empty() const { return book.empty(); }
33     long size () const { return book.size(); }
34    
35     class const_iterator;
36     const_iterator begin(const std::string& re=".*") const {return const_iterator( book.begin(), book.begin(), book.end(), boost::regex(re) ); }
37     const_iterator end(const std::string& re=".*") const {return const_iterator( book.end(), book.begin(), book.end(), boost::regex(re) ); }
38    
39     void fill( double_t X, const poly<std::string>& names, uint_t NbinsX, double_t Xlow, double_t Xup, double_t W=1 )
40     {
41     BOOST_FOREACH(std::string name, std::make_pair(names.begin(),names.end())) {
42     book_t::const_iterator current = book.find(name);
43     if( current == book.end() ) {
44     TH1* histogram = book[name] = new TH1D((_title+"/"+name).c_str(), "", NbinsX, Xlow, Xup);
45     histogram->SetDirectory(0);
46 bbetchar 1.2 histogram->Sumw2();
47 bbetchar 1.1 histogram->Fill(X,W);
48     } else current->second->Fill(X,W);
49     }
50     }
51     void fill( double_t X, double_t Y, const poly<std::string>& names, uint_t NbinsX, double_t Xlow, double_t Xup,
52     uint_t NbinsY, double_t Ylow, double_t Yup, double_t W=1 )
53     {
54     BOOST_FOREACH(std::string name, std::make_pair(names.begin(),names.end())) {
55     book_t::const_iterator current = book.find(name);
56     if( current == book.end() ) {
57     TH1* histogram = book[name] = new TH2D((_title+"/"+name).c_str(), "", NbinsX, Xlow, Xup, NbinsY, Ylow, Yup);
58     histogram->SetDirectory(0);
59 bbetchar 1.2 histogram->Sumw2();
60 bbetchar 1.1 static_cast<TH2*>(histogram)->Fill(X,Y,W);
61     } else static_cast<TH2*>(current->second)->Fill(X,Y,W);
62     }
63     }
64     void fill( double_t X, double_t Y, double_t Z, const poly<std::string>& names, uint_t NbinsX, double_t Xlow, double_t Xup,
65     uint_t NbinsY, double_t Ylow, double_t Yup,
66     uint_t NbinsZ, double_t Zlow, double_t Zup, double_t W=1 )
67     {
68     BOOST_FOREACH(std::string name, std::make_pair(names.begin(),names.end())) {
69     book_t::const_iterator current = book.find(name);
70     if( current == book.end() ) {
71     TH1* histogram = book[name] = new TH3D((_title+"/"+name).c_str(), "", NbinsX, Xlow, Xup, NbinsY, Ylow, Yup, NbinsZ, Zlow, Zup);
72     histogram->SetDirectory(0);
73 bbetchar 1.2 histogram->Sumw2();
74 bbetchar 1.1 static_cast<TH3*>(histogram)->Fill(X,Y,Z,W);
75     } else static_cast<TH3*>(current->second)->Fill(X,Y,Z,W);
76     }
77     }
78    
79     class const_iterator
80     : public boost::iterator_facade< const_iterator, TH1* const, boost::bidirectional_traversal_tag, TH1* const> {
81     friend class boost::iterator_core_access;
82    
83     std::map<std::string, TH1*>::const_iterator base, begin, end;
84     boost::regex expression;
85    
86     void increment() { while( ++base!=end && !regex_match( base->first, expression) ); }
87     void decrement() { while( base!=begin && !regex_match((--base)->first, expression) ); }
88     bool equal(const const_iterator& rhs) const { return base==rhs.base; }
89     TH1* const dereference() const { return base->second; }
90    
91     typedef std::map<std::string,TH1*>::const_iterator base_t;
92     public:
93     const_iterator(const base_t& base, const base_t& begin, const base_t& end, const boost::regex& expression )
94     : base(base), begin(begin), end(end), expression(expression) { if(base!=end && !regex_match(base->first, expression) ) increment();}
95     const std::string& name() {return base->first;}
96     typedef TH1* type;
97     };
98    
99     //long count(const std::string& pattern) const;
100     };
101    
102     #endif