100 using namespace KM3NETDAQ;
104 string outputFileName;
109 int numberOfOutliers;
110 double gridAngle_deg;
111 size_t numberOfPrefits;
120 JParser<> zap(
"Program to monitor hit time residuals from reconstructed tracks using JPrefit+JSimplex");
123 zap[
'o'] =
make_field(outputFileName) =
"HTR_monitor.root";
125 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
134 zap[
'N'] =
make_field(numberOfPrefits) = numeric_limits<size_t>::max();
141 catch(
const exception& error) {
142 FATAL(error.what() << endl);
149 const int FACTORY_LIMIT = 8;
150 const double STANDARD_DEVIATIONS = 3.0;
151 const double HIT_OFF = 1.0e3 * sigma_ns * sigma_ns;
153 const int MAXIMUM_NUMBER_OF_HITS = 50;
154 const double TMAX_NS = 50.0;
182 const double thetaMin = 0.75*
PI ;
183 const double thetaMax =
PI ;
184 const double rad = thetaMax - thetaMin;
185 const double bin = rad / floor(rad/(gridAngle_deg*
PI/180.0) + 0.5);
187 for (
double theta = thetaMin; theta < thetaMax + 0.5*bin; theta += bin) {
188 omega.push_back(
JAngle3D(theta,0.0));
197 NOTICE(
"Scanning over " << omega.size() <<
"JPrefit directions" <<endl ) ;
201 JRegressor_t fit(sigma_ns);
206 JRegressor_t::MAXIMUM_ITERATIONS = 10000;
208 TFile
outputFile(outputFileName.c_str(),
"recreate");
216 TTree htr_tree(Form(
"%d.htr",excl_mod->getID()),Form(
"%d.htr",excl_mod->getID())) ;
217 htr_tree.Branch(
"dt",&htr_dt) ;
218 htr_tree.Branch(
"bestfit",&bestfit) ;
220 STATUS(
"Excluding DOM "<<excl_mod->getID()<<endl ) ;
222 while (inputFile.hasNext()) {
224 STATUS(
"event: " << setw(10) << inputFile.getCounter() <<
'\r');
DEBUG(endl);
235 JDataL1_t dataL1_excluded;
240 for (JDAQTimeslice::const_iterator i = timeslice.begin(); i != timeslice.end(); ++i) {
242 JModule module = router.getModule(i->getModuleID()) ;
245 if (module.
getID() != excl_mod->getID()) {
247 if (!noInterDU || module.
getString() == excl_mod->getString()) {
249 buildL0(buffer, back_inserter(dataL0));
250 buildL2(buffer, back_inserter(dataL1));
256 buildL2(buffer, back_inserter(dataL1_excluded));
264 JDataL1_t::iterator __end = unique(dataL1.begin(), dataL1.end(), equal_to<JDAQModuleIdentifier>());
269 if (distance(dataL1.begin(), __end) >= minHits && dataL1_excluded.size() > 0) {
271 for (JOmega3D_t::const_iterator dir = omega.begin(); dir != omega.end(); ++dir) {
277 copy(dataL1.begin(), __end, back_inserter(data));
279 for (JDataR1_t::iterator i = data.begin(); i != data.end(); ++i) {
284 JDataR1_t::iterator __end1 = data.end();
289 if (distance(data.begin(), __end1) > MAXIMUM_NUMBER_OF_HITS) {
291 advance(__end1 = data.begin(), MAXIMUM_NUMBER_OF_HITS);
293 partial_sort(data.begin(), __end1, data.end(), cmz);
301 if (distance(data.begin(), __end1) < minHits) {
308 data.erase(__end1, data.end());
310 data.reserve(data.size() + dataL0.size());
314 for (JDataL0_t::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
316 if (find_if(data.begin(), __end1, bind2nd(equal_to<JDAQModuleIdentifier>(), i->getModuleID())) == __end1) {
322 if (count_if(data.begin(), __end1,
JBind2nd(match1D,hit)) >= minHits) {
328 __end1 =
clusterize(__end1, data.end(), match1D);
339 double chi2 = numeric_limits<double>::max();
346 if (distance(data.begin(), __end1) <= FACTORY_LIMIT) {
348 double ymin = numeric_limits<double>::max();
350 JDataR1_t::iterator __end2 = __end1;
354 sort(data.begin(), __end1, compare);
362 V.
set(fit, data.begin(), __end2, gridAngle_deg, sigma_ns);
363 Y.
set(fit, data.begin(), __end2);
370 WARNING(endl <<
"chi2(1) " << y << endl);
371 }
else if (y < ymin) {
383 ymin -= STANDARD_DEVIATIONS * STANDARD_DEVIATIONS;
394 V.
set(fit, data.begin(), __end1, gridAngle_deg, sigma_ns);
395 Y.
set(fit, data.begin(), __end1);
402 for (
int n = 0; n <= number_of_outliers && NDF > 0; ++n, --NDF) {
407 for (
unsigned int i = 0; i != Y.size(); ++i) {
412 WARNING(endl <<
"chi2(2) " << y << endl);
413 }
else if (y > ymax) {
419 if (ymax < STANDARD_DEVIATIONS * STANDARD_DEVIATIONS) {
425 fit.update(data.begin(), __end1, V);
427 Y.
set(fit, data.begin(), __end1);
448 if (numberOfPrefits > 0) {
450 JEvt::iterator __end = out.end();
452 advance(__end = out.begin(), min(numberOfPrefits, out.size()));
456 out.erase(__end, out.end());
467 JEvt::iterator __end = out.end();
469 if (numberOfPrefits > 0) {
470 advance(__end = out.begin(), min(numberOfPrefits, out.size()));
473 for (JEvt::const_iterator track = out.begin(); track != __end; ++track) {
481 for (JDataL1_t::const_iterator i = dataL1.begin(); i != dataL1.end(); ++i) {
494 data.reserve(data.size() + dataL0.size());
496 JDataR1_t::iterator __end1 = data.end();
498 for (JDataL0_t::iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
500 if (find_if(data.begin(), __end1, bind2nd(equal_to<JDAQModuleIdentifier>(), i->getModuleID())) == __end1) {
522 const int NDF =
getCount(data.begin(), data.end()) - fit.step.size();
526 const double chi2 = fit(
JLine3Z(tz), data.begin(), data.end());
546 bestfit = *out2.begin() ;
548 const double t_exp =
getTrack(bestfit).
getT(excl_mod->getPosition()) ;
550 sort(dataL1_excluded.begin(), dataL1_excluded.end()) ;
552 htr_dt = dataL1_excluded.begin()->getT()-t_exp ;
Data structure for angles in three dimensions.
Utility class to parse command line options.
Linear fit of straight line parallel to z-axis to set of hits (objects with position and time)...
Data structure for a composite optical module.
JBinder2nd< JHit_t > JBind2nd(const JMatch< JHit_t > &match, const JHit_t &second)
Auxiliary method to create JBinder2nd object.
void set(const JVector3D &pos, T __begin, T __end, const double alpha, const double sigma)
Set co-variance matrix.
JPosition3D & rotate_back(const JRotation3D &R)
Rotate back.
JTrack3E getTrack(const Trk &track)
Get track.
Template specialisation of L0 builder for JHitL0 data type.
double getCount(TH1D *hptr, int muon_threshold)
Router for direct addressing of module data in detector data structure.
Template specialisation of class JModel to match hit with muon trajectory along z-axis.
Data structure for fit of straight line in positive z-direction.
Direction set covering (part of) solid angle.
Template definition of linear fit.
void update(const unsigned int k, const double extra)
Update inverted matrix at given diagonal element.
JHitIterator_t clusterizeWeight(JHitIterator_t __begin, JHitIterator_t __end, const JMatch< JHit_t > &match)
Partition data according given binary match operator.
JFit getFit(const JHistory &history, const JTrack3D &track, const double Q, const int NDF, const double energy=0.0, const int status=0)
Get fit.
Data structure for track fit results.
Auxiliary class for permutations of L1 hits.
JDetector::const_iterator const_iterator
Auxiliary class for defining the range of iterations of objects.
int getString() const
Get string number.
JHitIterator_t clusterize(JHitIterator_t __begin, JHitIterator_t __end, const JMatch< JHit_t > &match, const int Nmin=1)
Partition data according given binary match operator.
Determination of the time residual vector of hits for a track along z-axis (JFIT::JLine1Z).
Data structure for vector in three dimensions.
Determination of the co-variance matrix of hits for a track along z-axis (JFIT::JLine1Z).
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
int getID() const
Get identifier.
Regressor function object for JLine3Z fit using JSimplex minimiser.
void set(const JLine1Z &track, T __begin, T __end)
Set time residual vector.
void load(const JString &file_name, JDetector &detector)
Load detector from input file.
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
counter_type advance(counter_type &counter, const counter_type value, const counter_type limit=std::numeric_limits< counter_type >::max())
Advance counter.
double getQuality(const double chi2, const int NDF)
Get quality of fit.
Data structure for set of track fit results.
General purpose class for object reading from a list of file names.
Data structure for fit of straight line paralel to z-axis.
bool qualitySorter(const JFIT::JFit &first, const JFIT::JFit &second)
Comparison of fit results.
void copy(const Head &from, JHead &to)
Copy header from from to to.
Reduced data structure for L1 hit.
2-dimensional frame with time calibrated data from one optical module.
JDirection3D getDirection(const Vec &v)
Get direction.
const JLimit & getLimit() const
Get limit.
double getChi2(const double P)
Get chi2 corresponding to given probability.
Data structure for normalised vector in positive z-direction.
Base class for direction set.
JPosition3D & rotate(const JRotation3D &R)
Rotate.
void invert()
Invert matrix.
JTriggerCounter_t next()
Increment trigger counter.
3D match criterion with road width.
#define DEBUG(A)
Message macros.
JPosition3D getPosition(const Vec &v)
Get position.