Jpp - the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
JProcessKexing2D.cc File Reference

Auxiliary program to build supernova background from JKexing2D output. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <map>
#include <cmath>
#include "TROOT.h"
#include "TFile.h"
#include "TH1D.h"
#include "TH2D.h"
#include "TF2.h"
#include "TMath.h"
#include "TFitResult.h"
#include "JPhysics/JConstants.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JROOT/JRootToolkit.hh"
#include "JTools/JRange.hh"
#include "JSupport/JMeta.hh"
#include "JCalibrate/JCalibrateK40.hh"
#include "JCalibrate/JFitK40.hh"
#include "JROOT/JManager.hh"
#include "Jeep/JPrint.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"
#include "JSupernova/JKexing2D.hh"
#include "JMath/JMathToolkit.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Auxiliary program to build supernova background from JKexing2D output.

Author
mlincett

Definition in file JProcessKexing2D.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 44 of file JProcessKexing2D.cc.

44  {
45  using namespace std;
46  using namespace JPP;
47 
48  string inputFile;
49  string outputFile;
50  string summaryFile;
51  int windowSize;
52  double fractionThreshold;
53  int debug;
54  JRange<int> multiplicity;
55 
56  try {
57 
58  JParser<> zap("Auxiliary program to build supernova background from JKexing2D output");
59 
60  zap['f'] = make_field(inputFile, "input file (JKexing2D).");
61  zap['o'] = make_field(outputFile, "output file.") = "sn_background.root";
62  zap['w'] = make_field(windowSize, "size of the sliding window to test") = 5;
63  zap['M'] = make_field(multiplicity, "final multiplicity range") = JRange<int>(7,11);
64  zap['F'] = make_field(fractionThreshold, "minimum fraction of active channels to compute distribution") = 0.99;
65  zap['d'] = make_field(debug) = 1;
66 
67  zap(argc, argv);
68  }
69  catch(const exception &error) {
70  FATAL(error.what() << endl);
71  }
72 
73  typedef JManager<int, TH1D> JManager_i1D_t;
74  typedef JManager<string, TH1D> JManager_s1D_t;
75  typedef JManager<string, TH2D> JManager2D_t;
76 
77  // input
78 
79  TFile in(inputFile.c_str(), "exist");
80 
81  TParameter<int>* runNumber;
82 
83  in.GetObject("RUNNR", runNumber);
84 
85  JManager2D_t MT = JManager2D_t::Read(in, mul_p , '%');
86  JManager_s1D_t ST = JManager_s1D_t::Read(in, status_p, '%');
87 
88  in.Close();
89 
90  // output
91 
92  const int factoryLimit_peak = 250;
93  const int factoryLimit_runs = 10000;
94 
95  // distributions of individual multiplicities
96 
97  vector<string> filters = { "RAW", "TAV", "TA1" };
98 
100 
101  for (vector<string>::const_iterator f = filters.begin(); f != filters.end(); ++f) {
102  string title = "MD_" + (*f) + "_%";
103  mmap[*f] = JManager_i1D_t(new TH1D(title.c_str(), NULL, factoryLimit_peak, 0, factoryLimit_peak));
104  }
105 
106  const int nx = 1 + NUMBER_OF_PMTS;
107  const double xmin = -0.5;
108  const double xmax = nx - 0.5;
109 
110  // distributions of the trigger level
111 
112  JManager_s1D_t TD(new TH1D(Form("SNT_[%d,%d]_", multiplicity.first, multiplicity.second) + TString("%"), NULL, factoryLimit_peak, -0.5, -0.5 + factoryLimit_peak));
113 
114  double epsilon = 1e-4;
115 
116  // bioluminescence benchmarking
117  JManager2D_t BL(new TH2D("BL_%", NULL, 100, epsilon, 1 + epsilon, factoryLimit_peak, -0.5, -0.5 + factoryLimit_peak));
118  JManager2D_t MUL_EFF(new TH2D("MUL_EFF_%", NULL, 100, epsilon, 1 + epsilon, nx, xmin, xmax));
119 
120  // history (value vs run number)
121  JManager_s1D_t H(new TH1D("H_%", NULL, factoryLimit_runs, 0, factoryLimit_runs));
122 
123  // livetime vs fraction of active channels
124 
125  TH1D* LT = new TH1D("LIVETIME_ACF", NULL, 100, epsilon, 1 + epsilon);
126 
127  // fraction of active PMT
128 
129  TGraph* activeChannelFraction = histogramToGraph(*ST["PMT"]);
130 
131  const int nb = activeChannelFraction->GetN();
132  const Double_t* arr_acf_y = activeChannelFraction->GetY();
133 
134  const vector<Double_t> vec_acf_y(arr_acf_y, arr_acf_y + nb);
135 
136  LT->FillN(nb, arr_acf_y, NULL);
137 
138  for (int M = 0; M <= NUMBER_OF_PMTS; M++) {
139 
140  map<string, TGraph*> count_vs_frame;
141 
142  // individual multiplicities
143 
144  for (vector<string>::const_iterator f = filters.begin(); f != filters.end(); ++f) {
145 
146  // number of events with multiplicity M as a function of the frame index
147 
148  count_vs_frame[*f] = histogramToGraph(*projectHistogram(*MT[*f], M, M));
149 
150  // distribution of the number of events with multiplicity M
151  // selection criterion based on the minimum fraction of active PMTs
152 
153  vector<double> select;
154  vector<double> threshold(nb, fractionThreshold);
155 
156  // stores in 'select' the result of the element-wise comparison between 'vec_acf_y' and 'threshold'
157 
158  transform(vec_acf_y.begin(),
159  vec_acf_y.end(),
160  threshold.begin(),
161  back_inserter(select),
162  greater_equal<double> {});
163 
164  mmap[*f][M]->FillN(nb, count_vs_frame[*f]->GetY(), &select[0]);
165 
166  // multiplicity spectrum as a function of number of active PMTs
167 
168  const vector<double> nb_M(nb, M);
169 
170  MUL_EFF[*f]->FillN(nb,
171  arr_acf_y,
172  &nb_M[0],
173  count_vs_frame[*f]->GetY());
174 
175  }
176  }
177 
178  int RUNNR = runNumber->GetVal();
179 
180  for (vector<string>::const_iterator f = filters.begin(); f != filters.end(); ++f) {
181 
182  // distribution of number of events per frame in the selected multiplicity range (A)
183 
184  TGraph* events_per_frame = histogramToGraph( *projectHistogram(*MT[*f], multiplicity.getLowerLimit(), multiplicity.getUpperLimit()));
185 
186  TD[*f]->FillN(events_per_frame->GetN(), events_per_frame->GetY(), NULL);
187 
188  // distribution of number of events per frame in the selected multiplicity range (A)
189  // sliding window applied
190 
191  vector<double> vec(events_per_frame->GetY(), events_per_frame->GetY() + nb);
192  vector<double> ker(windowSize, 1.0);
193 
194  vector<double> events_per_frame_sliding = convolve(vec, ker);
195 
196  TD[(*f) + "_nTS"]->FillN(events_per_frame_sliding.size(),
197  &events_per_frame_sliding[0],
198  NULL);
199 
200  // distribution of number of events per frame in the selected multiplicity range (A)
201  // as a function of the fraction of active channels
202  BL[*f]->FillN(nb,
203  arr_acf_y,
204  events_per_frame->GetY(),
205  NULL, 1);
206 
207  // peak as a function of the run number
208 
209  int peak = projectHistogram(*MT[*f], multiplicity.getLowerLimit(), multiplicity.getUpperLimit())->GetMaximum();
210 
211  H["PK_" + (*f)]->Fill(RUNNR, peak);
212 
213  }
214 
215  // history of bioluminescence
216 
217  double BI = (ST["PMT"]->GetSumOfWeights() / ST["PMT"]->GetEntries());
218 
219  H["BIOLUM"]->Fill(RUNNR, BI);
220 
221  // write output file
222 
223  TFile out(outputFile.c_str(), "recreate");
224 
225  TD.Write(out);
226 
227  TDirectory* bm = out.mkdir("BIOLUM");
228  TDirectory* hs = out.mkdir("HISTORY");
229 
230  H.Write(*hs);
231  BL.Write(*bm);
232 
233  MUL_EFF.Write(*bm);
234 
235  for (vector<string>::const_iterator f = filters.begin(); f != filters.end(); ++f) {
236  string dir_name = "MUL_" + (*f);
237  TDirectory* dir = out.mkdir(dir_name.c_str());
238  mmap[*f].Write(*dir);
239  }
240 
241  LT->Write();
242 
243  out.Close();
244 
245 }
Utility class to parse command line options.
Definition: JParser.hh:1500
do $JPP JMEstimator M
Definition: JMEstimator.sh:37
static const char * mul_p
Definition: JKexing2D.hh:11
static const char * status_p
Definition: JKexing2D.hh:12
static const double H
Planck constant [eV s].
string outputFile
then JPizza f
Definition: JPizza.sh:46
TGraph * histogramToGraph(const TH1 &in)
Converts a 1D histogram to a TGraph with:
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys...
Definition: JManager.hh:43
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1961
TH1 * projectHistogram(const TH2 &in, Double_t inf, Double_t sup, const char coordinate= 'x')
Helper method for ROOT Projection(X|Y) based on a JRange object and a coordinate. ...
int debug
debug level
Definition: JSirene.cc:63
#define FATAL(A)
Definition: JMessage.hh:67
std::vector< T > convolve(const std::vector< T > &input, const std::vector< T > &kernel)
Convolute data with given kernel.
static const int NUMBER_OF_PMTS
Total number of PMTs in module.
Definition: JDAQ.hh:26
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY source JAcoustics sh $DETECTOR_ID CHECK_EXIT_CODE typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
Definition: JCanberra.sh:38