59   using namespace KM3NETDAQ;
 
   71   double                          LeftMargin        =  10.0;    
 
   72   double                          RightMargin       =  10.0;    
 
   73   double                          gradientThreshold =  -0.005;  
 
   91     JParser<> zap(
"Auxiliary program to fit time-over-threshold distributions.");
 
   93     zap[
'f'] = 
make_field(inputFile,         
"input file (output from JCalibrateToT).");
 
   95     zap[
'a'] = 
make_field(detectorFile,      
"detector file.");
 
   96     zap[
'P'] = 
make_field(pmtFile,           
"specify PMT file name that can be given to JTriggerEfficiency.") = 
"";
 
   97     zap[
'w'] = 
make_field(writeFits,         
"write fit results.");
 
   98     zap[
'O'] = 
make_field(option,            
"ROOT fit options, see TH1::Fit")                                 = 
"";
 
  100     zap[
'x'] = 
make_field(fitRange,          
"ROOT fit range (time-over-threshold).")                          = JRange_t(0.0, 35.0);    
 
  106   catch(
const exception &error) {
 
  107     FATAL(error.what() << endl);
 
  137   if (option.find(
'R') == string::npos) { option += 
'R'; }
 
  138   if (option.find(
'S') == string::npos) { option += 
'S'; }
 
  142   TFile* 
in = TFile::Open(inputFile.c_str(), 
"exist");
 
  144   if (
in == NULL || !
in->IsOpen()) {
 
  145     FATAL(
"File: " << inputFile << 
" not opened." << endl);
 
  149   TH2D 
gain(
"gain", NULL,
 
  152   TH1D chi2(
"chi2", NULL, 100,  0.0, 5.0);
 
  166   for (JDetector::iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
  168     NOTICE(
"Module " << setw(10) << module->getID() << 
' ' << module->getLocation() << endl);
 
  170     if (module->empty()) {
 
  182       WARNING(
"No histogram " << module->getID() << 
"; skip fit." << endl);
 
  187     const double ny   = h2s->GetYaxis()->GetNbins();
 
  188     const double ymin = h2s->GetYaxis()->GetXmin();
 
  189     const double ymax = h2s->GetYaxis()->GetXmax();
 
  195     for (
int ix = 1; ix <= h2s->GetXaxis()->GetNbins(); ++ix) {
 
  201       TH1D 
h1(name.c_str(), NULL, ny, ymin, ymax); 
 
  205       for (
int iy = h2s->GetNbinsY(); iy >= 1; --iy) {
 
  207         const double w = 
h1.GetBinWidth (iy);
 
  208         const double y = h2s->GetBinContent(ix, iy);
 
  210         h1.SetBinContent(iy, y/w);
 
  211         h1.SetBinError  (iy, sqrt(y)/w);
 
  214       JRange_t     
range(fitRange);
 
  217                                         h1.FindBin(
range.getUpperLimit()));
 
  219       if (weight <= Wmin) {
 
  221         WARNING(
"Insufficient histogram entries for PMT "  << 
id <<
 
  222                 "(" << weight << 
" < " << Wmin << 
"); skip fit." << endl);
 
  239             RIGHT(10) << 
"threshold" << 
RIGHT(10) << 
"Mode"   << 
RIGHT(10) << 
"Max" << endl);      
 
  241       for (
int i = 
h1.GetBinCenter(ny-1);
 
  245          const double x = 
h1.GetBinCenter (i);
 
  246          const double y = 
h1.GetBinContent(i);
 
  248          const double gradient = ( (
h1.GetBinContent(i-1) - 
h1.GetBinContent(i+1)) /
 
  249                                    (
h1.GetBinCenter (i+1) - 
h1.GetBinCenter (i-1)) );
 
  252                FIXED(10,1) << -fabs(gradientThreshold) * 
h1.Integral() << 
FIXED(10,1) << ToTmode << 
FIXED(10,1) << max << endl);
 
  260          } 
else if (gradient < -fabs(gradientThreshold) * 
h1.Integral()) {
 
  270       if (!
range.is_valid()) {
 
  271         range.setRange(ToTmode - LeftMargin,
 
  272                        ToTmode + RightMargin);
 
  275       range.setRange(std::max(
h1.GetXaxis()->GetXmin(), 
range.getLowerLimit()),
 
  276                      std::min(
h1.GetXaxis()->GetXmax(), 
range.getUpperLimit()));
 
  286       const double initGain       = fit.getCPU().getNPE(ToTmode);
 
  287       const double initGainSpread = initGain / 3.0;
 
  291         WARNING(
"Invalid initial gain for PMT " << 
id << 
"; set default values." << endl);
 
  304       fit.gainSpread = initGainSpread;
 
  306       const TFitResultPtr 
result = fit(
h1, option);
 
  308       if (
int(result) < 0 || !result->IsValid()) { 
 
  310         WARNING(
"Fit failure for PMT " << 
id << 
"; set initialization values." << endl);
 
  312         h1.GetListOfFunctions()->Clear();
 
  324       if ((ymin < 
range.getLowerLimit()  || ymax > 
range.getUpperLimit()) &&
 
  325           (option.find(
"0") == string::npos && option.find(
"N") == string::npos)) {
 
  334                           JFitToT::getNumberOfModelParameters());
 
  335         f1->SetParameters(fit.GetParameters());
 
  336         f1->SetLineStyle(kDotted);
 
  339         h1.GetListOfFunctions()->Add(f1);
 
  344       const double reducedChi2 = result->Chi2() / result->Ndf();
 
  349       chi2_1d.      SetBinContent(ix, reducedChi2);
 
  350       gain_1d.      SetBinContent(ix, 
values.gain);
 
  351       gain_1d.      SetBinError  (ix, errors.gain);
 
  352       gainspread_1d.SetBinContent(ix, 
values.gainSpread);
 
  353       gainspread_1d.SetBinError  (ix, errors.gainSpread);
 
  355       gain.Fill(fit.gain, fit.gainSpread);
 
  356       chi2.Fill(TMath::Log10(reducedChi2));
 
  358       NOTICE(
"PMT " << 
id << 
" chi2 / NDF " << result->Chi2() << 
' ' << result->Ndf() << endl);
 
  377     const JMeta& meta = *
in.next();
 
Utility class to parse command line options. 
 
double getValue(const JScale_t scale)
Get numerical value corresponding to scale. 
 
TString replace(const TString &target, const TRegexp ®exp, const T &replacement)
Replace regular expression in input by given replacement. 
 
#define gmake_property(A)
macro to convert (template) parameter to JPropertiesElement object 
 
static const double FITTOT_GAIN_MAX
Default maximal gain. 
 
const double TIME_OVER_THRESHOLD_NS
Specification for time-over-threshold corresponding to a one photo-electron pulse. 
 
static const double FITTOT_GAIN_MIN
Default minimal gain. 
 
Utility class to parse parameter values. 
 
*fatal Wrong number of arguments esac JCookie sh typeset Z DETECTOR typeset Z SOURCE_RUN typeset Z TARGET_RUN set_variable PARAMETERS_FILE $WORKDIR parameters
 
#define MAKE_CSTRING(A)
Make C-string. 
 
then for HISTOGRAM in h0 h1
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
 
Auxiliary data structure for floating point format specification. 
 
Parametrisation of time-over-threshold distribution. 
 
Fit parameters for two-fold coincidence rate due to K40. 
 
#define MAKE_STRING(A)
Make string. 
 
static const std::string FITTOT_SUFFIX
 
static const double FITTOT_GAINSPREAD_MAX
Default maximal gain spread. 
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object 
 
Auxiliary class for map of PMT parameters. 
 
Auxiliary data structure for sequence of same character. 
 
z range($ZMAX-$ZMIN)< $MINIMAL_DZ." fi fi typeset -Z 4 STRING typeset -Z 2 FLOOR JPlot1D -f $
 
then $JPP_DIR examples JDetector JToT o $OUTPUT_FILE n N $NPE P gain
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file. 
 
static const char *const _2SToT
Histogram naming. 
 
static const double FITTOT_GAINSPREAD_MIN
Default minimal gain spread. 
 
Object reading from a list of files. 
 
do set_variable DETECTOR_TXT $WORKDIR detector
 
static const int NUMBER_OF_PMTS
Total number of PMTs in module. 
 
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
 
static const std::string FITTOT_FNAME
 
std::vector< double > weight
 
#define DEBUG(A)
Message macros.