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);
226 JRange_t
range(ToTfitRange);
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
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.
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.
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 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