25 int main(
int argc, 
char **argv)
 
   31   JPMTParameters parameters;
 
   39     JProperties properties = parameters.getProperties();
 
   41     JParser<> zap(
"Example program to histogram time over threshold distributions.");
 
   52   catch(
const exception &error) {
 
   53     FATAL(error.what() << endl);
 
   58     cout << 
"PMT parameters:" << endl;
 
   62   const JPMTAnalogueSignalProcessor cpu(parameters);
 
   64   const JPMTIdentifier pmt(1,0);
 
   65   const JCalibration   calibration;
 
   67   const JPMTDefaultSimulator simulator(parameters, pmt);
 
   69   JPMTData<JPMTSignal> input;
 
   70   JPMTData<JPMTPulse>  output;
 
   77   const double xmin =  -0.5;
 
   78   const double xmax = 255.5;
 
   79   const double dx   =   1.0;
 
   80   const int    nx   = (int) ((xmax - xmin) / dx);
 
   82   TH1D h0(
"h0", NULL, nx, xmin, xmax);
 
   83   TH1D h1(
"h1", NULL, nx, xmin, xmax);
 
   84   TH1D h2(
"h2", NULL, nx, xmin, xmax);
 
   89   DEBUG(
"    ToT      npe   dP/dnpe dP/dToT" << endl);
 
   91   for (
int i = 1; i <= h0.GetNbinsX(); ++i) {
 
   93     const double x   = h0.GetBinCenter(i);
 
   94     const double npe = cpu.getNPE(x);
 
   95     const double y   = cpu.getProbability(npe, NPE);
 
   96     const double v   = cpu.getDerivative(npe);
 
   99           << 
FIXED(5,1) << x   << 
"   " 
  100           << 
FIXED(7,3) << npe << 
"   " 
  101           << 
FIXED(5,3) << y   << 
"   " 
  102           << 
FIXED(6,4) << y*
v << endl);
 
  104     h0.SetBinContent(i, y*
v);
 
  108   if (numberOfHits > 0) {
 
  110     int number_of_hits = 0;
 
  112     for (
int i = 0; i != numberOfHits; ++i) {
 
  114       const double npe = cpu.getRandomAmplitude(NPE);
 
  116       if (cpu.applyThreshold(npe)) {
 
  118         const double tot_ns = cpu.getTimeOverThreshold(npe);
 
  126     h1.Scale(1.0 / (
double) number_of_hits / dx);
 
  130   if (numberOfHits > 0) {
 
  132     int number_of_hits = 0;
 
  134     const double t_ns = 25.0;
 
  136     for (
int i = 0; i != numberOfHits; ++i) {
 
  141       input.push_back(JPMTSignal(t_ns, NPE));
 
  143       simulator.processHits(pmt, calibration, input, output);
 
  145       for (JPMTData<JPMTPulse>::const_iterator hit = output.begin(); hit != output.end(); ++hit) {
 
  149         h2.Fill(hit->tot_ns);
 
  153     h2.Scale(1.0 / (
double) number_of_hits / dx);
 
  159   for (
int i = 1; i <= h0.GetNbinsX(); ++i) {
 
  161     const Double_t x  = h0.GetBinCenter (i);
 
  162     const Double_t y0 = h0.GetBinContent(i);
 
  163     const Double_t y1 = h1.GetBinContent(i);
 
  164     const Double_t y2 = h2.GetBinContent(i);
 
  166     DEBUG(
"[" << setw(3) << i << 
"]"  << 
' '  
  167           << 
FIXED(5,1) << x  << 
' ' 
  168           << 
FIXED(6,4) << y0 << 
' ' 
  169           << 
FIXED(6,4) << y1 << 
' ' 
  170           << 
FIXED(6,4) << y2 << endl);
 
  172     ASSERT(fabs(y0 - y1) < precision);
 
  173     ASSERT(fabs(y0 - y2) < precision);