ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/joshmt/MiscUtil.cxx
Revision: 1.4
Committed: Wed May 11 07:53:10 2011 UTC (14 years ago) by joshmt
Content type: text/plain
Branch: MAIN
Changes since 1.3: +11 -1 lines
Log Message:
add more replacements in fortranize

File Contents

# User Rev Content
1 joshmt 1.1 /*
2     a place for very simple functions that don't depend on anything else
3    
4     can be easily #included into other code
5     */
6    
7     #include "TString.h"
8 joshmt 1.3 #include <iostream>
9 joshmt 1.1
10     namespace jmt {
11    
12     //======misc utilities======
13     //gets rid of = > < from cuts in order to be better included in file names
14     TString fortranize(TString cut) {
15    
16     cut.ReplaceAll("==","eq");
17     cut.ReplaceAll(">=","gte");
18     cut.ReplaceAll("<=","lte");
19    
20     cut.ReplaceAll(">","gt");
21     cut.ReplaceAll("<","lt");
22 joshmt 1.4
23     cut.ReplaceAll("/","Over");
24     cut.ReplaceAll("+","Plus");
25     cut.ReplaceAll("*","Times");
26    
27     cut.ReplaceAll("*","Times");
28    
29     //this is pretty ugly
30     cut.ReplaceAll("(","L");
31     cut.ReplaceAll(")","R");
32    
33 joshmt 1.1 return cut;
34     }
35    
36 joshmt 1.3 void weightedMean(Int_t n, Double_t *a, Double_t *e) {
37    
38     Double_t numerator=0;
39     Double_t denominator=0;
40    
41     for (Int_t i=0; i<n; ++i) {
42     Double_t esq = e[i]*e[i];
43     if (esq == 0) {cout<<"Error is zero!"<<endl; return;}
44     numerator += a[i] / esq;
45     denominator += 1.0 / esq;
46     }
47    
48     cout<<"mean = "<<numerator / denominator<<" +/- "<<sqrt(1/denominator)<<endl;
49    
50     }
51    
52     //implemented in TMath in later versions of root, so i'm using the TMath name
53     bool AreEqualAbs( const double & a, const double & b, const double epsilon=0.001) {
54    
55     return ( fabs(a-b) < epsilon ) ;
56    
57     }
58    
59     // == error propagation ==
60    
61     //because not all versions of ROOT have it built in
62     double errOnIntegral(const TH1D* h, int binlow=1, int binhigh=-1) {
63    
64     if (binhigh == -1) binhigh = h->GetNbinsX();
65    
66     double err=0;
67     for (int i = binlow; i<= binhigh; i++) {
68     err += h->GetBinError(i) * h->GetBinError(i);
69     }
70    
71     if (err<0) return err;
72     return sqrt(err);
73     }
74    
75     //return error on a/b
76     double errAoverB(double a, double aerr, double b, double berr) {
77     if (b==0 || a==0) {
78     cout<<"Warning in errAoverB -- a or b is zero!"<<endl;
79     return -1;
80     }
81     return (a/b)*sqrt( pow( aerr/a, 2) + pow( berr/b, 2) );
82     }
83    
84     //return error on a*b
85     double errAtimesB(double a, double aerr, double b, double berr) {
86     if (b==0 || a==0) {
87     cout<<"Warning in errAtimesB -- a or b is zero!"<<endl;
88     return -1;
89     }
90    
91     return a*b*sqrt( pow( aerr/a, 2) + pow( berr/b, 2) );
92     }
93    
94 joshmt 1.2 //======== container for run, lumisection, event number =========
95     class eventID {
96     public:
97     eventID();
98     eventID(ULong64_t RunNumber, ULong64_t LumiSection, ULong64_t EventNumber);
99     ~eventID();
100    
101     bool operator< (const eventID & id) const;
102     bool operator== (const eventID & id) const;
103     bool operator!= (const eventID & id) const;
104    
105     ULong64_t run;
106     ULong64_t ls;
107     ULong64_t ev;
108    
109     };
110    
111     eventID::eventID() : run(0),ls(0),ev(0) {}
112     eventID::eventID(ULong64_t RunNumber, ULong64_t LumiSection, ULong64_t EventNumber) :
113     run(RunNumber),ls(LumiSection),ev(EventNumber) {}
114     eventID::~eventID() {}
115    
116     bool eventID::operator== (const eventID & id) const {
117    
118     if (ev == id.ev &&
119     ls == id.ls &&
120     run == id.run) return true;
121    
122     return false;
123     }
124    
125     bool eventID::operator!= (const eventID & id) const {
126     return !(*this == id);
127     }
128    
129     bool eventID::operator< (const eventID & id) const {
130    
131     if (run < id.run) return true;
132     else if (run > id.run) return false;
133     else { //if run is equal
134    
135     //now compare lumi section
136     if ( ls < id.ls ) return true;
137     else if (ls > id.ls) return false;
138     else { //if ls is equal
139    
140     if ( ev < id.ev ) return true;
141     else if (ev > id.ev) return false;
142    
143     else { //these are the same event!
144     return false;
145     }
146     }
147     }
148    
149     //this shouldn't happen
150     assert(0);
151     return false;
152     }
153    
154     } //end of namespace
155    
156