13 #include "evt/Head.hh"
77 inline bool compare(
const JHitL0& first,
const JHitL0& second)
79 if (std::equal_to<KM3NETDAQ::JDAQPMTIdentifier>()(first, second))
80 return std::less<JTRIGGER::JHit>()(first, second);
82 return std::less<KM3NETDAQ::JDAQPMTIdentifier>()(first, second);
98 int main(
int argc,
char **argv)
105 typedef JParallelFileScanner_t::multi_pointer_type multi_pointer_type;
109 JParallelFileScanner_t inputFile;
116 size_t numberOfPrefits;
122 histogram_type calibrate;
127 JParser<> zap(
"Program to perform PDF fit of muon trajectory to data.");
132 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
134 zap[
'R'] =
make_field(roadWidth_m) = numeric_limits<double>::max();
135 zap[
'B'] =
make_field(R_Hz,
"Default background rate if no summary data are available.") = 6.0e3;
137 zap[
'T'] =
make_field(TTS_ns,
"Time smearing of PDF.");
139 zap[
'E'] =
make_field(E_GeV,
"Default energy if no energy estimate is available.") = 1.0e3;
140 zap[
'z'] =
make_field(z,
"Extension of longitudinal range of muon track.") =
JZRange(0.0, 0.0);
142 zap[
'c'] =
make_field(calibrate,
"Histogram for time calibration per optical module.") = histogram_type();
147 catch(
const exception& error) {
148 FATAL(error.what() << endl);
174 JRegressor_t::T_ns.setRange(-50.0, +450.0);
175 JRegressor_t::Vmax_npe = 10.0;
176 JRegressor_t::MAXIMUM_ITERATIONS = 1000;
178 JRegressor_t fit(pdfFile, TTS_ns);
181 fit.compress(T_compress);
184 fit.parameters.resize(5);
187 fit.parameters[1] = JLine3Z::pY();
188 fit.parameters[2] = JLine3Z::pT();
189 fit.parameters[3] = JLine3Z::pDX();
190 fit.parameters[4] = JLine3Z::pDY();
192 if (fit.getRmax() < roadWidth_m) {
193 roadWidth_m = fit.getRmax();
204 if (calibrate.is_valid()) {
206 if (numberOfPrefits != 1) {
207 WARNING(
"Running in calibration mode but number of prefits " << numberOfPrefits <<
" != " << 1 << endl);
210 ha =
new TH2D (
"ha", NULL, 256, -0.5, 255.5,
211 calibrate.getNumberOfBins(), calibrate.getLowerLimit(), calibrate.getUpperLimit());
212 hb =
new TProfile(
"hb", NULL, 256, -0.5, 255.5);
215 calibrate.getNumberOfBins(), calibrate.getLowerLimit(), calibrate.getUpperLimit());
217 gd = JManager_t(
new TProfile(
"%", NULL,
detector.size(), -0.5,
detector.size() - 0.5));
224 while (inputFile.hasNext()) {
226 STATUS(
"event: " << setw(10) << inputFile.getCounter() <<
'\r');
DEBUG(endl);
228 multi_pointer_type ps = inputFile.next();
234 summaryRouter.
update(*tev);
236 JEvt::iterator __end = evt->end();
242 if (evt->begin() != __end) {
244 copy(evt->begin(), __end, back_inserter(out));
246 if (numberOfPrefits > 0) {
247 advance(__end = evt->begin(), min(numberOfPrefits, out.size()));
250 partial_sort(evt->begin(), __end, evt->end(),
qualitySorter);
252 __end = partition(evt->begin(), __end,
JHistory::is_event(evt->begin()->getHistory()));
257 buildL0(*tev, moduleRouter,
true, back_inserter(dataL0));
260 if (dataL0.size() >= fit.parameters.size()) {
262 for (JEvt::const_iterator track = evt->begin(); track != __end; ++track) {
278 for (JDataL0_t::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
280 double rate_Hz = summaryRouter.
getRate(*i);
282 if (rate_Hz <= 0.0) {
283 rate_Hz = summaryRouter.
getRate();
297 sort(data.begin(), data.end(), compare);
299 JDataW0_t::iterator __end = unique(data.begin(), data.end(), equal_to<JDAQPMTIdentifier>());
302 const int NDF =
distance(data.begin(), __end) - fit.parameters.size();
308 if (track->getE() > 0.1)
309 fit.E_GeV = track->getE();
313 const double chi2 = fit(
JLine3Z(tz), data.begin(), __end);
323 out.rbegin()->setW(track->getW());
325 fit.error.getDY() * fit.error.getDY()));
332 if (calibrate.is_valid()) {
336 for (JDataW0_t::const_iterator hit = data.begin(); hit != __end; ++hit) {
337 buffer.insert(hit->getModuleID());
346 if (
distance(data.begin(), q) - fit.parameters.size() > 0) {
348 fit(ta, data.begin(), q);
350 sort(q, __end, compare);
352 const int index = moduleRouter.
getIndex(*
id);
353 const double t1 = fit.value.getT(q->getPosition());
354 JTrack3D gradient = fit(fit.value, *q).gradient;
358 ha->Fill(q->getToT(), q->getT1() - t1);
359 hb->Fill(q->getToT(), gradient.
getT());
361 h2->Fill(index, q->getT() - t1);
363 gd[
"T"]->Fill(index, gradient.
getT());
364 gd[
"X"]->Fill(index, gradient.
getX());
365 gd[
"Y"]->Fill(index, gradient.
getY());
366 gd[
"Z"]->Fill(index, gradient.
getZ());
383 if (calibrate.is_valid()) {
389 for (JManager_t::const_iterator i = gd.begin(); i != gd.end(); ++i) {