12 #include "evt/Head.hh"
82 const double chi2 = std::numeric_limits<double>::max())
96 return chi2 != std::numeric_limits<double>::max();
128 int main(
int argc,
char **argv)
135 typedef JParallelFileScanner_t::multi_pointer_type multi_pointer_type;
138 JParallelFileScanner_t inputFile;
146 size_t numberOfPrefits;
156 JParser<> zap(
"Program to perform fit of muon energy to data.");
161 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
163 zap[
'R'] =
make_field(roadWidth_m) = numeric_limits<double>::max();
168 zap[
'x'] =
make_field(X) = JEnergyRange(1.0, 8.0);
171 zap[
'M'] =
make_field(mestimator) = EM_NORMAL, EM_LORENTZIAN, EM_LINEAR, EM_NULL;
176 catch(
const exception& error) {
177 FATAL(error.what() << endl);
203 JRegressor_t::T_ns = T_ns;
205 const JEnergy ENERGY_RESOLUTION(0.01);
208 JRegressor_t fit(pdfFile);
210 switch (mestimator) {
213 NOTICE(
"Using the normal M-Estimator." << endl);
218 NOTICE(
"Using the Lorentzian M-Estimator." << endl);
223 NOTICE(
"Using the linear M-Estimator." << endl);
228 NOTICE(
"Using the JEnergy likelihood directly." << endl);
233 FATAL(
"Invalid M-Estimator." << endl);
237 if (fit.getRmax() < roadWidth_m) {
238 roadWidth_m = fit.getRmax();
246 while (inputFile.hasNext()) {
248 STATUS(
"event: " << setw(10) << inputFile.getCounter() <<
'\r');
DEBUG(endl);
250 multi_pointer_type ps = inputFile.next();
256 JEvt::iterator __end = evt->end();
262 if (evt->begin() != __end) {
264 copy(evt->begin(), __end, back_inserter(out));
266 if (numberOfPrefits > 0) {
267 advance(__end = evt->begin(), min(numberOfPrefits, out.size()));
270 partial_sort(evt->begin(), __end, evt->end(),
qualitySorter);
272 __end = partition(evt->begin(), __end,
JHistory::is_event(evt->begin()->getHistory()));
277 buildL0(*tev, moduleRouter,
true, back_inserter(dataL0));
280 for (JEvt::const_iterator track = evt->begin(); track != __end; ++track) {
289 for (JDataL0_t::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
296 top.insert(i->getPMTIdentifier());
306 for (JDetector::const_iterator module = subdetector.begin(); module != subdetector.end(); ++module) {
310 for (
size_t i = 0; i != module->size(); ++i) {
320 buffer.push_back(
JNPEHit(fit.getNPE(*module, rates_Hz), total));
328 if (start.
is_valid() && !buffer.empty()) {
334 if (track_start != buffer.end()) {
338 __begin = lower_bound(data.begin(), data.end(), track_start->getZ(),
make_comparator(&JNPEHit::getZ));
343 const int NDF =
distance(__begin, data.end()) - 1;
354 for (
int i = 0; i != N; ++i) {
355 result[i].x = X.getLowerLimit() + i * (X.getUpperLimit() - X.getLowerLimit()) / (N-1);
362 for (
int i = 0; i != N; ++i) {
406 }
while (
result[4].x -
result[0].x > ENERGY_RESOLUTION);
415 const double chi2 =
result[2].chi2;
416 const double E =
result[2].x.getE();
421 double noise_likelihood = 0.0;
426 noise_likelihood += log10(dom->getP());
427 nhits += dom->getN();
435 out.rbegin()->setE(correct(E));
439 out.rbegin()->setW(track->getW());