305 const set<string> PARAMETERS = { X_t, Y_t, Z_t, PHI_t, TX_t, TY_t };
307 string detectorFile_a;
308 string detectorFile_b;
309 bool overwriteDetector;
319 JParser<> zap(
"Auxiliary program to align two detectors.");
321 zap[
'a'] =
make_field(detectorFile_a,
"detector - subject to alignment (option -A)");
322 zap[
'b'] =
make_field(detectorFile_b,
"detector - reference for alignment");
323 zap[
'A'] =
make_field(overwriteDetector,
"overwrite detector file provided through '-a' with modified positions.");
324 zap[
'T'] =
make_field(tripodFile,
"tripods") =
"";
326 zap[
'O'] =
make_field(option,
"keep strings vertical");
333 catch(
const exception &error) {
334 FATAL(error.what() << endl);
338 if (overwriteDetector) {
339 if (tripodFile ==
"") {
340 FATAL(
"No tripod file.");
344 for (
const auto& i : parameters) {
345 if (PARAMETERS.count(i) == 0) {
346 FATAL(
"Invalid fit paramater " << i <<
", possible values: " <<
JEEPZ() << PARAMETERS << endl);
354 load(detectorFile_a, detector_a);
361 load(detectorFile_b, detector_b);
368 const JFit_t fit(detector_b, sigma_m, option, range);
372 for (JDetector::const_iterator module = detector_a.begin(); module != detector_a.end(); ++module) {
373 if (fit.hasModule(module->
getID())) {
374 data.push_back(*module);
387 if (parameters.empty()) {
388 parameters = PARAMETERS;
391 if (parameters.count(X_t)) { simplex.
step.push_back(
JModel_t(0.01, 0.00, 0.00, 0.0, 0.0, 0.0)); }
392 if (parameters.count(Y_t)) { simplex.
step.push_back(
JModel_t(0.00, 0.01, 0.00, 0.0, 0.0, 0.0)); }
393 if (parameters.count(Z_t)) { simplex.
step.push_back(
JModel_t(0.00, 0.00, 0.01, 0.0, 0.0, 0.0)); }
394 if (parameters.count(PHI_t)) { simplex.
step.push_back(
JModel_t(0.00, 0.00, 0.00, 5.0e-4, 0.0, 0.0)); }
395 if (parameters.count(TX_t)) { simplex.
step.push_back(
JModel_t(0.00, 0.00, 0.00, 0.0, 1.0e-4, 0.0)); }
396 if (parameters.count(TY_t)) { simplex.
step.push_back(
JModel_t(0.00, 0.00, 0.00, 0.0, 0.0, 1.0e-4)); }
399 const double chi2 = simplex(fit, data.begin(), data.end());
402 cout <<
"chi2/NDF " <<
FIXED(7,3) << chi2 <<
'/' << (detector_a.size() - simplex.
step.size()) << endl;
404 cout <<
"model:" << endl;
406 cout <<
"x " <<
FIXED(7,3) << simplex.
value.x << endl;
407 cout <<
"y " <<
FIXED(7,3) << simplex.
value.y << endl;
408 cout <<
"z " <<
FIXED(7,3) << simplex.
value.z << endl;
409 cout <<
"phi " <<
FIXED(9,5) << simplex.
value.phi << endl;
410 cout <<
"Tx " <<
FIXED(9,5) << simplex.
value.tx << endl;
411 cout <<
"Ty " <<
FIXED(9,5) << simplex.
value.ty << endl;
414 if (overwriteDetector) {
416 NOTICE(
"Store alignment data on files " << detectorFile_a <<
" and " << tripodFile << endl);
420 for (JDetector::iterator module = detector_a.begin(); module != detector_a.end(); ++module) {
425 module->add(p2 - p1);
429 store(detectorFile_a, detector_a);
437 tripods.
load(tripodFile.c_str());
446 tripod->add(p2 -
p1);
449 tripods.
store(tripodFile.c_str());