28{
   31 
   35  int               NPE;
   36  int               numberOfHits;
   37  double            precision;
   39 
   40  try {
   41 
   42    JParser<> zap(
"Example program to histogram charge distributions.");
 
   43 
   51 
   52    zap(argc, argv);
   53 
   54  }
   55  catch(const exception &error) {
   56    FATAL(error.what() << endl);
 
   57  }
   58 
   60 
   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;
   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 
   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 
  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  
  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  
  142 
  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}
#define DEBUG(A)
Message macros.
 
#define ASSERT(A,...)
Assert macro.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
Auxiliary class for map of PMT parameters.
 
const JPMTParameters & getPMTParameters(const JPMTIdentifier &id) const
Get PMT parameters.
 
Data structure for PMT parameters.
 
double thresholdBand
threshold-band [npe]
 
double threshold
threshold [npe]
 
PMT signal processor interface.
 
Exception for accessing a value in a collection that is outside of its range.
 
Utility class to parse command line options.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
Auxiliary data structure for floating point format specification.
 
PMT analogue signal processor.
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...