< Minimal right-to-left gradient value in time-over-threshold peak-search, normalized with respect to the total number of histogram entries
54 using namespace KM3NETDAQ;
65 double LeftMargin = 10.0;
66 double RightMargin = 10.0;
67 double gradientThreshold = -0.005;
86 JParser<> zap(
"Auxiliary program to fit time-over-threshold distributions.");
88 zap[
'f'] =
make_field(inputFile,
"input file (output from JCalibrateToT).");
90 zap[
'a'] =
make_field(detectorFile,
"detector file.");
91 zap[
'P'] =
make_field(pmtFile,
"specify PMT file name that can be given to JTriggerEfficiency.") =
"";
92 zap[
'w'] =
make_field(writeFits,
"write fit results.");
93 zap[
'O'] =
make_field(option,
"ROOT fit options, see TH1::Fit") =
"";
95 zap[
'x'] =
make_field(fitRange,
"ROOT fit range (time-over-threshold).") = JRange_t(0.0, 35.0);
101 catch(
const exception &error) {
102 FATAL(error.what() << endl);
132 if (option.find(
'R') == string::npos) { option +=
'R'; }
133 if (option.find(
'S') == string::npos) { option +=
'S'; }
137 TFile*
in = TFile::Open(inputFile.c_str(),
"exist");
139 if (
in == NULL || !
in->IsOpen()) {
140 FATAL(
"File: " << inputFile <<
" not opened." << endl);
144 TH2D
gain(
"gain", NULL,
147 TH1D chi2(
"chi2", NULL, 100, 0.0, 5.0);
156 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
158 NOTICE(
"Module " << setw(10) << module->getID() <<
' ' << module->getLocation() << endl);
160 if (module->empty()) {
172 WARNING(
"No histogram " << module->getID() <<
"; skip fit." << endl);
177 const double ny = h2s->GetYaxis()->GetNbins();
178 const double ymin = h2s->GetYaxis()->GetXmin();
179 const double ymax = h2s->GetYaxis()->GetXmax();
185 for (
int ix = 1; ix <= h2s->GetXaxis()->GetNbins(); ++ix) {
192 TH1D
h1(name.c_str(), NULL, ny, ymin, ymax);
196 for (
int iy = h2s->GetNbinsY(); iy >= 1; --iy) {
198 const double w =
h1.GetBinWidth (iy);
199 const double y = h2s->GetBinContent(ix, iy);
201 h1.SetBinContent(iy, y/w);
202 h1.SetBinError (iy, sqrt(y)/w);
205 const double weight =
h1.Integral(
h1.FindBin(fitRange.getLowerLimit()),
206 h1.FindBin(fitRange.getUpperLimit()));
208 if (weight <= Wmin) {
210 WARNING(
"Insufficient histogram entries for PMT " <<
id <<
211 "(" << weight <<
" < " << Wmin <<
"); skip fit." << endl);
227 for (
int i =
h1.GetBinCenter(ny-1);
231 const double x =
h1.GetBinCenter (i);
232 const double y =
h1.GetBinContent(i);
234 const double gradient = ( (
h1.GetBinContent(i-1) -
h1.GetBinContent(i+1)) /
235 (
h1.GetBinCenter (i+1) -
h1.GetBinCenter (i-1)) );
242 }
else if (gradient < -fabs(gradientThreshold) *
h1.Integral()) {
252 if (!fitRange.is_valid()) {
253 fitRange.setRange(ToTmode - LeftMargin,
254 ToTmode + RightMargin);
257 fitRange.setRange(std::max(
h1.GetXaxis()->GetXmin(), fitRange.getLowerLimit()),
258 std::min(
h1.GetXaxis()->GetXmax(), fitRange.getUpperLimit()));
266 const double initGain = fit.getCPU().getNPE(ToTmode);
267 const double initGainSpread = initGain / 3.0;
271 WARNING(
"Invalid initial gain for PMT " <<
id <<
"; set default values." << endl);
284 fit.gainSpread = initGainSpread;
286 const TFitResultPtr
result = fit(
h1, option);
288 if (
int(result) < 0 || !result->IsValid()) {
290 WARNING(
"Fit failure for PMT " <<
id <<
"; set initialization values." << endl);
292 h1.GetListOfFunctions()->Clear();
304 if ((ymin < fitRange.getLowerLimit() || ymax > fitRange.getUpperLimit()) &&
305 (option.find(
"0") == string::npos && option.find(
"N") == string::npos)) {
314 JFitToT::getNumberOfModelParameters());
315 f1->SetParameters(fit.GetParameters());
316 f1->SetLineStyle(kDotted);
319 h1.GetListOfFunctions()->Add(f1);
324 const double reducedChi2 = result->Chi2() / result->Ndf();
329 chi2_1d. SetBinContent(ix, reducedChi2);
330 gain_1d. SetBinContent(ix,
values.gain);
331 gain_1d. SetBinError (ix, errors.gain);
332 gainspread_1d.SetBinContent(ix,
values.gainSpread);
333 gainspread_1d.SetBinError (ix, errors.gainSpread);
335 gain.Fill(fit.gain, fit.gainSpread);
336 chi2.Fill(TMath::Log10(reducedChi2));
338 NOTICE(
"PMT " <<
id <<
" chi2 / NDF " << result->Chi2() <<
' ' << result->Ndf() << endl);
349 out << chi2_1d << gain_1d << gainspread_1d;
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)...
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.
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.
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 typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
static const std::string FITTOT_FNAME
std::vector< double > weight