72 inline bool cmz(
const JHitR1& first,
const JHitR1& second)
91 int main(
int argc,
char **argv)
101 JLimit_t& numberOfEvents = inputFile.getLimit();
107 int numberOfOutliers;
108 double gridAngle_deg;
110 size_t numberOfPrefits;
115 JParser<> zap(
"Program to perform pre-fit of muon trajectory to data.");
120 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
128 zap[
'N'] =
make_field(numberOfPrefits) = numeric_limits<size_t>::max();
133 catch(
const exception& error) {
134 FATAL(error.what() << endl);
141 const int FACTORY_LIMIT = 8;
142 const double STANDARD_DEVIATIONS = 3.0;
143 const double HIT_OFF = 1.0e3 * sigma_ns * sigma_ns;
144 const int NUMBER_OF_L1HITS = (useL0 ? 1 : 4);
145 const int MAXIMUM_NUMBER_OF_HITS = 50;
170 const JOmega3D omega(gridAngle_deg *
PI/180.0);
190 buildL0(
JDAQTimeslice(*tev,
true), router, back_inserter(dataL0));
191 buildL2(
JDAQTimeslice(*tev, !useL0), router, back_inserter(dataL1));
196 JDataL1_t::iterator __end = unique(dataL1.begin(), dataL1.end(), equal_to<JDAQModuleIdentifier>());
201 if (
distance(dataL1.begin(), __end) >= NUMBER_OF_L1HITS) {
207 for (JOmega3D_t::const_iterator dir = omega.begin(); dir != omega.end(); ++dir) {
213 copy(dataL1.begin(), __end, back_inserter(data));
215 for (JDataR1_t::iterator i = data.begin(); i != data.end(); ++i) {
220 JDataR1_t::iterator __end1 = data.end();
225 if (
distance(data.begin(), __end1) > MAXIMUM_NUMBER_OF_HITS) {
227 advance(__end1 = data.begin(), MAXIMUM_NUMBER_OF_HITS);
229 partial_sort(data.begin(), __end1, data.end(), cmz);
237 if (
distance(data.begin(), __end1) < NUMBER_OF_L1HITS) {
244 data.erase(__end1, data.end());
246 data.reserve(data.size() + dataL0.size());
250 for (JDataL0_t::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
252 if (find_if(data.begin(), __end1, bind2nd(equal_to<JDAQModuleIdentifier>(), i->getModuleID())) == __end1) {
258 if (count_if(data.begin(), __end1,
JBind2nd(match1D,hit)) >= NUMBER_OF_L1HITS) {
264 __end1 =
clusterize(__end1, data.end(), match1D);
275 double chi2 = numeric_limits<double>::max();
282 if (
distance(data.begin(), __end1) <= FACTORY_LIMIT) {
284 double ymin = numeric_limits<double>::max();
286 JDataR1_t::iterator __end2 = __end1;
290 sort(data.begin(), __end1, compare);
298 V.
set(fit, data.begin(), __end2, gridAngle_deg, sigma_ns);
299 Y.
set(fit, data.begin(), __end2);
306 WARNING(endl <<
"chi2(1) " << y << endl);
307 }
else if (y < ymin) {
319 ymin -= STANDARD_DEVIATIONS * STANDARD_DEVIATIONS;
330 V.
set(fit, data.begin(), __end1, gridAngle_deg, sigma_ns);
331 Y.
set(fit, data.begin(), __end1);
338 for (
int n = 0; n <= number_of_outliers && NDF > 0; ++
n, --NDF) {
343 for (
unsigned int i = 0; i != Y.size(); ++i) {
348 WARNING(endl <<
"chi2(2) " << y << endl);
349 }
else if (y > ymax) {
355 if (ymax < STANDARD_DEVIATIONS * STANDARD_DEVIATIONS) {
361 fit.update(data.begin(), __end1, V);
363 Y.
set(fit, data.begin(), __end1);
384 if (numberOfPrefits > 0) {
386 JEvt::iterator __end = out.end();
388 advance(__end = out.begin(), min(numberOfPrefits, out.size()));
396 JEvt::iterator __begin = __end;
399 advance(__end = __begin, min(numberOfPrefits, (
size_t)
distance(__begin, __q)));
404 out.erase(__end, out.end());