10 #include "TFitResult.h" 
   46   static const char* 
const WILDCARD = 
"%";
 
   57 int main(
int argc, 
char **argv)
 
   61   using namespace KM3NETDAQ;
 
   73   double                          LeftMargin        =  10.0;    
 
   74   double                          RightMargin       =  10.0;    
 
   75   double                          gradientThreshold =  -0.005;  
 
   93     JParser<> zap(
"Auxiliary program to fit time-over-threshold distributions.");
 
   95     zap[
'f'] = 
make_field(inputFile,         
"input file (output from JCalibrateToT).");
 
   97     zap[
'a'] = 
make_field(detectorFile,      
"detector file.");
 
   98     zap[
'P'] = 
make_field(pmtFile,           
"specify PMT file name that can be given to JTriggerEfficiency.") = 
"";
 
   99     zap[
'w'] = 
make_field(writeFits,         
"write fit results.");
 
  100     zap[
'O'] = 
make_field(option,            
"ROOT fit options, see TH1::Fit")                                 = 
"";
 
  102     zap[
'x'] = 
make_field(fitRange,          
"ROOT fit range (time-over-threshold).")                          = JRange_t(0.0, 35.0);    
 
  108   catch(
const exception &error) {
 
  109     FATAL(error.what() << endl);
 
  129   if (!pmtFile.empty()) {
 
  132       parametersMap.
load(pmtFile.c_str()); 
 
  137   parametersMap.comment.add(
JMeta(argc, argv));
 
  140   if (option.find(
'R') == string::npos) { option += 
'R'; }
 
  141   if (option.find(
'S') == string::npos) { option += 
'S'; }
 
  145   TFile* 
in = TFile::Open(inputFile.c_str(), 
"exist");
 
  147   if (
in == NULL || !
in->IsOpen()) {
 
  148     FATAL(
"File: " << inputFile << 
" not opened." << endl);
 
  152   TH2D 
gain(
"gain", NULL,
 
  155   TH1D chi2(
"chi2", NULL, 100,  0.0, 5.0);
 
  169   for (JDetector::iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
  171     NOTICE(
"Module " << setw(10) << module->getID() << 
' ' << module->getLocation() << endl);
 
  173     if (module->empty()) {
 
  185       WARNING(
"No histogram " << module->getID() << 
"; skip fit." << endl);
 
  190     const double ny   = h2s->GetYaxis()->GetNbins();
 
  191     const double ymin = h2s->GetYaxis()->GetXmin();
 
  192     const double ymax = h2s->GetYaxis()->GetXmax();
 
  198     for (
int ix = 1; ix <= h2s->GetXaxis()->GetNbins(); ++ix) {
 
  205       DEBUG(
"Processing histogram " << name << endl);
 
  207       TH1D 
h1(name.c_str(), NULL, ny, ymin, ymax); 
 
  211       for (
int iy = h2s->GetNbinsY(); iy >= 1; --iy) {
 
  213         const double w = 
h1.GetBinWidth (iy);
 
  214         const double y = h2s->GetBinContent(ix, iy);
 
  216         h1.SetBinContent(iy, y/w);
 
  217         h1.SetBinError  (iy, sqrt(y)/w);
 
  220       JRange_t     
range(fitRange);
 
  222       const double weight = 
h1.Integral(
h1.FindBin(range.getLowerLimit()),
 
  223                                         h1.FindBin(range.getUpperLimit()));
 
  225       if (weight <= Wmin) {
 
  227         WARNING(
"Insufficient histogram entries for PMT "  << 
id <<
 
  228                 "(" << weight << 
" < " << Wmin << 
"); skip fit." << endl);
 
  247             RIGHT(10) << 
"threshold" << 
RIGHT(10) << 
"Mode"   << 
RIGHT(10) << 
"Max" << endl);
 
  249       for (
int i = 
h1.GetBinCenter(ny-1);
 
  253          const double x = 
h1.GetBinCenter (i);
 
  254          const double y = 
h1.GetBinContent(i);
 
  256          const double gradient = ( (
h1.GetBinContent(i-1) - 
h1.GetBinContent(i+1)) /
 
  257                                    (
h1.GetBinCenter (i+1) - 
h1.GetBinCenter (i-1)) );
 
  260                FIXED(10,1) << -fabs(gradientThreshold) * 
h1.Integral() << 
FIXED(10,1) << ToTmode << 
FIXED(10,1) << max << endl);
 
  268          } 
else if (gradient < -fabs(gradientThreshold) * 
h1.Integral()) {
 
  278       if (!range.is_valid()) {
 
  279         range.setRange(ToTmode - LeftMargin,
 
  280                        ToTmode + RightMargin);
 
  283       range.setRange(std::max(
h1.GetXaxis()->GetXmin(), range.getLowerLimit()),
 
  284                      std::min(
h1.GetXaxis()->GetXmax(), range.getUpperLimit()));
 
  292       JFitToT fit(parameters, range);
 
  295       const double initGainSpread = initGain / 3.0;
 
  299         WARNING(
"Invalid initial gain for PMT " << 
id << 
"; set default values." << endl);
 
  314       const TFitResultPtr 
result = fit(
h1, option);
 
  316       if (result.Get() == NULL) {
 
  317         FATAL(
"Invalid TFitResultPtr " << 
h1.GetName() << endl);
 
  320       if (
int(result) < 0 || !result->IsValid()) { 
 
  322         WARNING(
"Fit failure for PMT " << 
id << 
"; set initialization values." << endl);
 
  324         h1.GetListOfFunctions()->Clear();
 
  326         parameters.
gain       = initGain;
 
  336       if ((ymin < range.getLowerLimit()  || ymax > range.getUpperLimit()) &&
 
  337           (option.find(
"0") == string::npos && option.find(
"N") == string::npos)) {
 
  346                           JFitToT::getNumberOfModelParameters());
 
  347         f1->SetParameters(fit.GetParameters());
 
  348         f1->SetLineStyle(kDotted);
 
  351         h1.GetListOfFunctions()->Add(f1);
 
  356       const double reducedChi2 = result->Chi2() / result->Ndf();
 
  361       chi2_1d.      SetBinContent(ix, reducedChi2);
 
  362       gain_1d.      SetBinContent(ix, 
values.gain);
 
  363       gain_1d.      SetBinError  (ix, errors.gain);
 
  364       gainspread_1d.SetBinContent(ix, 
values.gainSpread);
 
  365       gainspread_1d.SetBinError  (ix, errors.gainSpread);
 
  368       chi2.Fill(TMath::Log10(reducedChi2));
 
  370       NOTICE(
"PMT " << 
id << 
" chi2 / NDF " << result->Chi2() << 
' ' << result->Ndf() << endl);
 
  389     const JMeta& meta = *
in.next();
 
  391     parametersMap.comment.add(meta);
 
  402     parametersMap.store(pmtFile.c_str());
 
Utility class to parse command line options. 
 
double getValue(const JScale_t scale)
Get numerical value corresponding to scale. 
 
int main(int argc, char *argv[])
 
ROOT TTree parameter settings of various packages. 
 
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. 
 
Double_t gainSpread
PMT gain spread. 
 
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. 
 
Recording of objects on file according a format that follows from the file name extension. 
 
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. 
 
Data structure for detector geometry and calibration. 
 
Fit parameters for two-fold coincidence rate due to K40. 
 
#define MAKE_STRING(A)
Make string. 
 
const JPMTAnalogueSignalProcessor & getCPU() const 
Access method for the analogue signal processor. 
 
static const std::string FITTOT_SUFFIX
 
Scanning of objects from a single file according a format that follows from the extension of each fil...
 
I/O formatting auxiliaries. 
 
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. 
 
General purpose messaging. 
 
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
 
virtual double getNPE(const double tot_ns, const double eps=1.0e-3) const 
Get number of photo-electrons. 
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file. 
 
Auxiliary class to define a range between two values. 
 
Utility class to parse command line options. 
 
then usage $script< input_file >< detector_file > fi set_variable OUTPUT_DIR set_variable SELECTOR JDAQTimesliceL1 set_variable DEBUG case set_variable DEBUG
 
static const char *const _2SToT
Histogram naming. 
 
PMT analogue signal processor. 
 
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
 
KM3NeT DAQ constants, bit handling, etc. 
 
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