Jpp  18.4.0
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JCharge.cc
Go to the documentation of this file.
1 
2 #include <string>
3 #include <iostream>
4 #include <iomanip>
5 #include <map>
6 
7 #include "TROOT.h"
8 #include "TFile.h"
9 #include "TH1D.h"
10 
13 
14 #include "JROOT/JRootToolkit.hh"
15 
16 #include "Jeep/JPrint.hh"
17 #include "Jeep/JParser.hh"
18 #include "Jeep/JMessage.hh"
19 
20 
21 /**
22  * \file
23  *
24  * Example program to histogram charge distributions.
25  * \author mdejong & bjjung
26  */
27 int main(int argc, char **argv)
28 {
29  using namespace std;
30  using namespace JPP;
31 
32  string outputFile;
33  JPMTParametersMap parametersMap;
34  JPMTIdentifier pmt;
35  int NPE;
36  int numberOfHits;
37  double precision;
38  int debug;
39 
40  try {
41 
42  JParser<> zap("Example program to histogram charge distributions.");
43 
44  zap['o'] = make_field(outputFile) = "charge.root";
45  zap['P'] = make_field(parametersMap) = JPARSER::initialised();
46  zap['p'] = make_field(pmt) = JPMTIdentifier(1,0);
47  zap['N'] = make_field(NPE) = 1;
48  zap['n'] = make_field(numberOfHits) = 1000000;
49  zap['e'] = make_field(precision) = 0.01;
50  zap['d'] = make_field(debug) = 0;
51 
52  zap(argc, argv);
53 
54  }
55  catch(const exception &error) {
56  FATAL(error.what() << endl);
57  }
58 
59  const JPMTParameters parameters = parametersMap.getPMTParameters(pmt);
60 
61  map<int, TH1D*> H0;
62  map<int, TH1D*> H1;
63 
64  {
65  const double dx = JPMTSignalProcessorInterface::getQmin();
66  const double xmin = 0.0 - 0.5*dx;
67  const int nx = (int) ((10.0 - xmin) / dx);
68 
69  H0[1] = new TH1D("1.0", NULL, nx, xmin, xmin + nx * dx);
70  H1[1] = new TH1D("1.1", NULL, nx, xmin, xmin + nx * dx);
71  }
72  {
73  const double dx = 0.02;
74  const double xmin = parameters.threshold - parameters.thresholdBand;
75  const int nx = (int) ((10.0 - xmin) / dx);
76 
77  H0[2] = new TH1D("2.0", NULL, nx, xmin, xmin + nx * dx);
78  H1[2] = new TH1D("2.1", NULL, nx, xmin, xmin + nx * dx);
79  }
80 
81  H1[1]->Sumw2();
82  H1[2]->Sumw2();
83 
84  int test = 1;
85 
86  for (JPMTSignalProcessorInterface* cpu : {
87  (JPMTSignalProcessorInterface*) new JPMTSignalProcessorInterface(),
88  (JPMTSignalProcessorInterface*) new JPMTAnalogueSignalProcessor(parameters)
89  }) {
90 
91  for (int i=1; i <= H0[test]->GetNbinsX(); ++i) {
92 
93  const double npe = H0[test]->GetBinCenter(i);
94  const double p = cpu->getChargeProbability(npe,NPE);
95 
96  H0[test]->SetBinContent(i,p);
97  }
98 
99  if (numberOfHits > 0) {
100 
101  int number_of_hits = 0;
102 
103  for (int i = 0; i != numberOfHits; ++i) {
104 
105  const double npe = cpu->getRandomCharge(NPE);
106 
107  try {
108 
109  if (cpu->applyThreshold(npe)) {
110 
111  ++number_of_hits;
112 
113  H1[test]->Fill(npe);
114  }
115 
116  } catch (const JValueOutOfRange& exception) {
117 
118  DEBUG(exception.what());
119  continue;
120  }
121  }
122 
123  const double dx = (H1[test]->GetXaxis()->GetXmax() - H1[test]->GetXaxis()->GetXmin()) / H1[test]->GetXaxis()->GetNbins();
124 
125  H1[test]->Scale(1.0 / (double) number_of_hits / dx);
126 
127  delete cpu;
128 
129  ++test;
130  }
131  }
132 
133  TFile out(outputFile.c_str(), "recreate");
134 
135  for (auto& i : H0) { out << *i.second; }
136  for (auto& i : H1) { out << *i.second; }
137 
138  out.Write();
139  out.Close();
140 
141  // test
142 
143  ASSERT(numberOfHits > 0);
144 
145  for (int i = 1; i != test; ++i) {
146 
147  DEBUG("Test " << i << endl);
148 
149  for (int ix = 1; ix <= H0[i]->GetNbinsX(); ++ix) {
150 
151  const Double_t x = H0[i]->GetBinCenter (ix);
152  const Double_t y0 = H0[i]->GetBinContent(ix);
153  const Double_t y1 = H1[i]->GetBinContent(ix);
154 
155  DEBUG("[" << setw(3) << ix << "]" << ' '
156  << FIXED(5,3) << x << ' '
157  << FIXED(6,4) << y0 << ' '
158  << FIXED(6,4) << y1 << endl);
159 
160  ASSERT(fabs(y0 - y1) < precision);
161  }
162  }
163 
164  return 0;
165 }
Utility class to parse command line options.
Definition: JParser.hh:1514
int main(int argc, char *argv[])
Definition: Main.cc:15
*fatal Wrong number of arguments esac JCookie sh typeset Z DETECTOR typeset Z SOURCE_RUN typeset Z TARGET_RUN set_variable PARAMETERS_FILE $WORKDIR parameters
Definition: diff-Tuna.sh:38
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:83
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:446
string outputFile
#define ASSERT(A,...)
Assert macro.
Definition: JMessage.hh:90
I/O formatting auxiliaries.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1989
General purpose messaging.
#define FATAL(A)
Definition: JMessage.hh:67
const double xmin
Definition: JQuadrature.cc:23
Utility class to parse command line options.
PMT analogue signal processor.
int debug
debug level
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62