61   using namespace KM3NETDAQ;
 
   73   double                          LeftMargin        =  10.0;                
 
   74   double                          RightMargin       =  10.0;                
 
   75   double                          gradientThreshold =  -0.005;              
 
   99     JParser<> zap(
"Auxiliary program to fit time-over-threshold distributions.");
 
  101     zap[
'f'] = 
make_field(inputFile,         
"input file (output from JCalibrateToT).");
 
  103     zap[
'a'] = 
make_field(detectorFile,      
"detector file.");
 
  104     zap[
'P'] = 
make_field(pmtFile,           
"specify PMT file name that can be given to JTriggerEfficiency.") = 
"";
 
  105     zap[
'w'] = 
make_field(writeFits,         
"write fit results.");
 
  106     zap[
'O'] = 
make_field(option,            
"ROOT fit options, see TH1::Fit")                                 = 
"";
 
  108     zap[
'x'] = 
make_field(ToTfitRange,       
"ROOT fit range (time-over-threshold).")                          = 
JRange_t(0.0, 35.0);    
 
  114   catch(
const exception &error) {
 
  115     FATAL(error.what() << endl);
 
  135   if (!pmtFile.empty()) {
 
  138       parametersMap.
load(pmtFile.c_str()); 
 
  143   parametersMap.comment.add(
JMeta(argc, argv));
 
  146   if (option.find(
'R') == string::npos) { option += 
'R'; }
 
  147   if (option.find(
'S') == string::npos) { option += 
'S'; }
 
  151   TFile* 
in = TFile::Open(inputFile.c_str(), 
"exist");
 
  153   if (
in == NULL || !
in->IsOpen()) {
 
  154     FATAL(
"File: " << inputFile << 
" not opened." << endl);
 
  158   TH2D 
gain(
"gain", NULL,
 
  161   TH1D chi2(
"chi2", NULL, 100,  0.0, 5.0);
 
  175   for (JDetector::iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
  177     NOTICE(
"Module " << setw(10) << module->getID() << 
' ' << module->getLocation() << endl);
 
  179     if (module->empty()) {
 
  191       WARNING(
"No histogram " << module->getID() << 
"; skip fit." << endl);
 
  196     const double ny   = h2s->GetYaxis()->GetNbins();
 
  197     const double ymin = h2s->GetYaxis()->GetXmin();
 
  198     const double ymax = h2s->GetYaxis()->GetXmax();
 
  204     for (
int ix = 1; ix <= h2s->GetXaxis()->GetNbins(); ++ix) {
 
  211       DEBUG(
"Processing histogram " << name << endl);
 
  213       TH1D 
h1(name.c_str(), NULL, ny, ymin, ymax); 
 
  217       for (
int iy = h2s->GetNbinsY(); iy >= 1; --iy) {
 
  219         const double w = 
h1.GetBinWidth (iy);
 
  220         const double y = h2s->GetBinContent(ix, iy);
 
  222         h1.SetBinContent(iy, y/w);
 
  223         h1.SetBinError  (iy, sqrt(y)/w);
 
  229                                         h1.FindBin(
range.getUpperLimit()));
 
  231       if (weight <= Wmin) {
 
  233         WARNING(
"Insufficient histogram entries for PMT "  << 
id <<
 
  234                 "(" << weight << 
" < " << Wmin << 
"); skip fit." << endl);
 
  253             RIGHT(10) << 
"threshold" << 
RIGHT(10) << 
"Mode"   << 
RIGHT(10) << 
"Max" << endl);
 
  255       for (
int i = 
h1.GetBinCenter(ny-1);
 
  259          const double x = 
h1.GetBinCenter (i);
 
  260          const double y = 
h1.GetBinContent(i);
 
  262          const double gradient = ( (
h1.GetBinContent(i-1) - 
h1.GetBinContent(i+1)) /
 
  263                                    (
h1.GetBinCenter (i+1) - 
h1.GetBinCenter (i-1)) );
 
  266                FIXED(10,1) << -fabs(gradientThreshold) * 
h1.Integral() << 
FIXED(10,1) << ToTmode << 
FIXED(10,1) << max << endl);
 
  274          } 
else if (gradient < -fabs(gradientThreshold) * 
h1.Integral()) {
 
  284       if (!
range.is_valid()) {
 
  285         range.setRange(ToTmode - LeftMargin,
 
  286                        ToTmode + RightMargin);
 
  289       range.setRange(std::max(
h1.GetXaxis()->GetXmin(), 
range.getLowerLimit()),
 
  290                      std::min(
h1.GetXaxis()->GetXmax(), 
range.getUpperLimit()));
 
  301                    gainLimits.getLowerLimit(), gainLimits.getUpperLimit());
 
  302       setParLimits(fit, fit.getModelParameter(&JFitToT::JFitToTParameters::gainSpread),
 
  303                    gainSpreadLimits.getLowerLimit(), gainSpreadLimits.getUpperLimit());
 
  305       const double initGain       = fit.getCPU().getNPE(ToTmode);
 
  306       const double initGainSpread = initGain / 3.0;
 
  308       if (!gainLimits(initGain)) { 
 
  310         WARNING(
"Invalid initial gain for PMT " << 
id << 
"; set default values." << endl);
 
  312         parameters.
gain       = gainLimits      .constrain(initGain);
 
  313         parameters.
gainSpread = gainSpreadLimits.constrain(initGainSpread);
 
  323       fit.gainSpread = initGainSpread;
 
  325       const TFitResultPtr 
result = fit(
h1, option);
 
  327       if (result.Get() == NULL) {
 
  328         FATAL(
"Invalid TFitResultPtr " << 
h1.GetName() << endl);
 
  331       if (
int(result) < 0 || !result->IsValid()) { 
 
  333         WARNING(
"Fit failure for PMT " << 
id << 
"; set initialization values." << endl);
 
  335         h1.GetListOfFunctions()->Clear();
 
  337         parameters.
gain       = initGain;
 
  347       if ((ymin < 
range.getLowerLimit()  || ymax > 
range.getUpperLimit()) &&
 
  348           (option.find(
"0") == string::npos && option.find(
"N") == string::npos)) {
 
  357                           JFitToT::getNumberOfModelParameters());
 
  358         f1->SetParameters(fit.GetParameters());
 
  359         f1->SetLineStyle(kDotted);
 
  362         h1.GetListOfFunctions()->Add(f1);
 
  367       const double reducedChi2 = result->Chi2() / result->Ndf();
 
  372       chi2_1d.      SetBinContent(ix, reducedChi2);
 
  373       gain_1d.      SetBinContent(ix, 
values.gain);
 
  374       gain_1d.      SetBinError  (ix, errors.gain);
 
  375       gainspread_1d.SetBinContent(ix, 
values.gainSpread);
 
  376       gainspread_1d.SetBinError  (ix, errors.gainSpread);
 
  378       gain.Fill(fit.gain, fit.gainSpread);
 
  379       chi2.Fill(TMath::Log10(reducedChi2));
 
  381       NOTICE(
"PMT " << 
id << 
" chi2 / NDF " << result->Chi2() << 
' ' << result->Ndf() << endl);
 
  383       parameters.
gain       = fit.gain;
 
  400     const JMeta& meta = *
in.next();
 
  402     parametersMap.comment.add(meta);
 
  413     parametersMap.store(pmtFile.c_str());
 
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 
 
double gainSpread
gain spread [unit] 
 
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. 
 
then echo Enter input within $TIMEOUT_S seconds echo n User name
 
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
 
const JPolynome f1(1.0, 2.0, 3.0)
Function. 
 
Type definition of range. 
 
double mean_ns
mean time-over-threshold of threshold-band hits [ns] 
 
double sigma_ns
time-over-threshold standard deviation of threshold-band hits [ns] 
 
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. 
 
bool setParLimits(TF1 &f1, const Int_t index, Double_t xmin, Double_t xmax)
Set fit parameter limits. 
 
Auxiliary data structure for sequence of same character. 
 
void load(const char *file_name)
Load from input file. 
 
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. 
 
Data structure for PMT parameters. 
 
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 JAcoustics sh $DETECTOR_ID source JAcousticsToolkit sh CHECK_EXIT_CODE typeset A EMITTERS get_tripods $WORKDIR tripod txt EMITTERS get_transmitters $WORKDIR transmitter txt EMITTERS for EMITTER in
 
static const std::string FITTOT_FNAME
 
std::vector< double > weight
 
#define DEBUG(A)
Message macros.