14 #include "TGraphErrors.h"
15 #include "TGraphSmooth.h"
33 int main(
int argc,
char **argv)
49 JParser<> zap(
"Auxiliary program to model transition time distribution generator from data.");
63 catch(
const exception &error) {
64 FATAL(error.what() << endl);
68 const TRegexp regexp(
"V[0-9]+");
70 TString buffer(inputFile.c_str());
73 Ssiz_t pos = buffer.Index(regexp, &len);
78 buffer = buffer(pos+1, len-1);
79 version = buffer.Atoi();
82 NOTICE(
"File version " << version << endl);
92 ifstream in(inputFile.c_str());
96 for (Double_t
x = 0.0,
y; in >>
y;
x += xbin) {
100 EY.push_back(sqrt(
y));
105 in.ignore(numeric_limits<streamsize>::max(),
'\n');
107 for (Double_t
x,
y, dy, rms; in >>
x >>
y >> dy >> rms; ) {
121 FATAL(
"Not enough points." << endl);
126 xbin = (X[N-1] - X[0]) / (N - 1);
128 NOTICE(
"Bin width [ns] " << xbin << endl);
133 TH1D h1(
"h1", NULL, N, X[0] - 0.5*xbin, X[N-1] + 0.5*xbin);
137 for (
int i = 0; i != N; ++i) {
138 h1.SetBinContent(i+1, Y [i]);
139 h1.SetBinError (i+1, EY[i]);
145 TF1
f1(
"f1",
"[0]*exp(-0.5*(x-[1])*(x-[1])/([2]*[2])) + [3]");
152 Double_t
sigma = 2.0;
155 for (
int i = 0; i != N; ++i) {
162 f1.SetParameter(0, ymax);
163 f1.SetParameter(1, x0);
165 f1.SetParameter(3, ymin);
168 h1.Fit(&
f1,
"LL",
"same", x0 - 5 *
sigma, x0 + 5 *
sigma);
173 ymax =
f1.GetParameter(0);
174 x0 =
f1.GetParameter(1);
176 ymin =
f1.GetParameter(3);
180 for (JVector_t::iterator
x = X.begin();
x != X.end(); ++
x) {
184 f1.SetParameter(1, x0 = 0);
187 f1.SetParameter(3, 1e-4 * ymax);
197 for (
int i = 0; i != N; ++i) {
199 const Double_t
x = X[i];
200 const Double_t
y = Y[i];
206 else if (
x > x0 + 5.0 *
sigma)
210 NOTICE(
"Number of pulses: " << yy << endl);
211 NOTICE(
"Pre-pulses: " << yl / yy << endl);
212 NOTICE(
"Delayed pulses: " << yr / yy << endl);
221 while (n1 != N - 1 && Y[n1] == 0) ++n1;
222 while (n2 != 0 && Y[n2] == 0) --n2;
228 FATAL(
"No non-zero data." << endl);
231 X = JVector_t(X .
data() + n1, X .
data() + n2);
232 Y = JVector_t(Y .
data() + n1, Y .
data() + n2);
233 EX = JVector_t(EX.data() + n1, EX.data() + n2);
234 EY = JVector_t(EY.data() + n1, EY.data() + n2);
239 TGraphErrors g0(N, X.data(), Y.data(), EX.data(), EY.data());
252 for (
int i = 0; i != N; ++i) {
254 const Double_t
x =
g1.GetX()[i];
255 const Double_t f =
f1.Eval(
x);
263 TGraphSmooth gs(
"gs");
265 TGraph* gout = gs.SmoothSuper(&
g1,
"", bass, span,
false,
g1.GetEY());
270 for (
int i = 0; i != N; ++i) {
271 g1.GetY()[i] = gout->GetY()[i];
277 for (
int i = 0; i != N; ++i) {
279 const Double_t
x =
g1.GetX()[i];
280 const Double_t f =
f1.Eval(
x);
293 for (
int i = 0; i != N; ++i) {
299 for (
int i = 0; i != N; ++i) {
303 ofstream out(pdf.c_str());
305 const Double_t
xmin = g2.GetX()[ 0 ];
306 const Double_t
xmax = g2.GetX()[N-1];
312 << showpos <<
FIXED(7,2) <<
x
314 << noshowpos <<
FIXED(6,4) << g2.Eval(
x)
325 for (
int i = 0,
j = 1;
j != N; ++i, ++
j) {
326 g2.GetY()[
j] += g2.GetY()[i];
329 const Double_t ymin = g2.GetY()[ 0 ];
330 const Double_t ymax = g2.GetY()[N-1];
332 for (
int i = 0; i != N; ++i) {
334 const Double_t
x = g2.GetX()[i];
335 const Double_t
y = g2.GetY()[i];
337 g2.GetX()[i] = (
y - ymin) / ymax;
338 g2.GetY()[i] =
x + 0.5 * xbin;
341 ofstream out(cdf.c_str());
343 const Double_t
xmin = 0.0;
344 const Double_t
xmax = 1.0;
350 << noshowpos <<
FIXED(6,4) <<
x
352 << showpos <<
FIXED(9,5) << g2.Eval(
x)
364 const Double_t
xmin = X[ 0 ];
365 const Double_t
xmax = X[N-1];
366 const Double_t dx = (
xmax -
xmin) / N;
368 TH1D h2(
"pmt", NULL, N,
xmin - 0.5*dx,
xmax + 0.5*dx);
374 for (
int i = 0; i != N; ++i) {
380 for (
int i = 0; i != N; ++i) {
382 h2.SetBinContent(i+1, Y [i]/W);
383 h2.SetBinError (i+1, EY[i]/W);
General purpose messaging.
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
I/O formatting auxiliaries.
Double_t g1(const Double_t x)
Function.
int numberOfBins
number of bins for average CDF integral of optical module
int main(int argc, char **argv)
Utility class to parse command line options.
const JPolynome f1(1.0, 2.0, 3.0)
Function.
Auxiliary data structure for floating point format specification.