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.