ra4_macros  bede988c286599a3a84b77a4d788ac0a971e89f9
plot_poisson_gamma.cxx
Go to the documentation of this file.
1 // plot_trigger: Plots for the trigger section of the RA4 note
2 
3 #include <cstdlib>
4 
5 #include <fstream>
6 #include <sstream>
7 #include <iostream>
8 #include <iomanip>
9 #include <vector>
10 #include <ctime>
11 
12 #include "TMath.h"
13 #include "TChain.h"
14 #include "TH1D.h"
15 #include "TCanvas.h"
16 #include "TLegend.h"
17 #include "TLine.h"
18 #include "TString.h"
19 #include "TRandom3.h"
20 #include "TGraphAsymmErrors.h"
21 
22 #include "styles.hpp"
23 #include "utilities.hpp"
24 #include "utilities_macros.hpp"
25 
26 using namespace std;
27 
28 // entries[Nobs][Nsam] has the entries for each sample for each observable going into kappa
29 // weights[Nobs][Nsam] has the average weight of each observable for each sample
30 // powers[Nobs] defines kappa = Product_obs{ Sum_sam{entries[sam][obs]*weights[sam][obs]}^powers[obs] }
31 double calcPoisson(vector<vector<float> > &entries, vector<vector<float> > &weights, vector<float> &powers, float &uncert);
32 
33 int main(){
34 
35  vector<float> yield;
36  yield.push_back(1);
37  yield.push_back(5);
38  yield.push_back(10);
39  yield.push_back(100);
40  yield.push_back(10000);
41 
42  vector<TString> tags;
43  tags.push_back("$N0$");
44  tags.push_back("$\\frac{N0}{N1}$");
45  tags.push_back("$N2\\times\\frac{N0}{N1}$");
46  tags.push_back("$\\frac{N2}{N3}\\times\\frac{N0}{N1}$");
47 
48  vector<float> ipowers;
49  ipowers.push_back(1.);
50  ipowers.push_back(-1.);
51  ipowers.push_back(1.);
52  ipowers.push_back(-1.);
53 
54  cout<<"\\begin{table}"<<endl;
55  time_t begtime, endtime;
56  time(&begtime);
57  for(unsigned yind(0); yind<yield.size(); yind++){
58 
59  cout<<endl<<"\\begin{tabular}{l | rc | rc | c}\\hline\\hline"<<endl;
60  cout<<" & $N_{\\rm Poisson}$ & $\\Delta N_{\\rm P}$ [\\%] "
61  <<"& $N_{\\Gamma}$ & $\\Delta N_{\\Gamma}$ [\\%] & "
62  <<"$\\Delta N_{\\rm P}/\\Delta N_\\Gamma$ [\\%]\\\\ \\hline"<<endl;
63  vector<vector<float> > entries;
64  vector<vector<float> > weights;
65  vector<float> powers;
66 
67  for(unsigned ind(0); ind<ipowers.size(); ind++){
68  entries.push_back(vector<float>());
69  entries[ind].push_back(yield[yind]);
70  weights.push_back(vector<float>());
71  weights[ind].push_back(1.);
72 
73  TString label(tags[ind]);
74  for(unsigned entry(0); entry<entries.size(); entry++){
75  TString number(""), reptag("N");
76  number += entries[entry][0]; reptag += entry;
77  label.ReplaceAll(reptag, number);
78  }
79  powers.push_back(ipowers[ind]);
80  float k_poi, ek_poi, k_gam, epk_gam, emk_gam;
81  k_poi = calcPoisson(entries, weights, powers, ek_poi);
82  k_gam = calcKappa(entries, weights, powers, emk_gam, epk_gam, false, true);
83 
84  int digits(static_cast<int>(2-log10(k_poi)));
85  if(digits<0) digits=0;
86  cout<<setw(28)<<label<<" & $"<<setw(6)<<RoundNumber(k_poi,digits)<<"\\pm"
87  <<RoundNumber(ek_poi,digits)<<"$ & "<<RoundNumber(ek_poi*100,1,k_poi)
88  <<" & $"<<setw(6)<<RoundNumber(k_gam,digits)<<"^{+"<<RoundNumber(epk_gam,digits)
89  <<"}_{-"<<RoundNumber(emk_gam,digits)
90  <<"}$ & ${}^{+"<<RoundNumber(epk_gam*100,1,k_gam)
91  <<"}_{-"<<RoundNumber(emk_gam*100,1,k_gam)<<"}$ & "
92  <<"${}^{+"<<RoundNumber(ek_poi*100,1,epk_gam)
93  <<"}_{-"<<RoundNumber(ek_poi*100,1,emk_gam)<<"}$ \\\\"<<endl;
94  }
95  cout<<"\\hline\\hline\\end{tabular}\\vspace{0.1in}"<<endl<<endl;
96  }
97  cout<<"\\end{table}"<<endl<<endl;
98  time(&endtime);
99  cout<<endl<<"Calculation took "<<difftime(endtime, begtime)<<" seconds"<<endl<<endl;
100 }
101 
102 double calcPoisson(vector<vector<float> > &entries, vector<vector<float> > &weights, vector<float> &powers, float &uncert){
103  double kappa(1.);
104  for(unsigned obs(0); obs < powers.size(); obs++) {
105  float observed(0.);
106  for(unsigned sam(0); sam < entries[obs].size(); sam++)
107  observed += entries[obs][sam]*weights[obs][sam];
108  if(observed==0 && powers[obs] < 0) return -1.;
109  kappa *= pow(observed, powers[obs]);
110  }
111  uncert = 0;
112  for(unsigned obs(0); obs < powers.size(); obs++) {
113  float observed(0.);
114  for(unsigned sam(0); sam < entries[obs].size(); sam++)
115  observed += entries[obs][sam]*weights[obs][sam];
116  if(observed==0 && powers[obs] < 0) return -1.;
117  if(observed==0) observed=1;
118  uncert += pow(kappa*sqrt(observed+1)/observed, 2);
119  }
120  uncert = sqrt(uncert);
121  return kappa;
122 }
123 
124 
STL namespace.
double calcPoisson(vector< vector< float > > &entries, vector< vector< float > > &weights, vector< float > &powers, float &uncert)
tuple kappa
Definition: parse_card.py:264
TString RoundNumber(double num, int decimals, double denom=1.)
Definition: utilities.cpp:191
int main()
double calcKappa(std::vector< std::vector< float > > &entries, std::vector< std::vector< float > > &weights, std::vector< float > &powers, float &mSigma, float &pSigma, bool do_data=false, bool verbose=false, bool do_plot=false, int nrep=100000)