301{
304
305 const set<string> PARAMETERS = { X_t, Y_t, Z_t, PHI_t, TX_t, TY_t };
306
307 string detectorFile_a;
308 string detectorFile_b;
309 bool overwriteDetector;
310 string tripodFile;
311 double sigma_m;
312 bool option;
316
317 try {
318
319 JParser<> zap(
"Auxiliary program to align two detectors.");
320
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");
330
331 zap(argc, argv);
332 }
333 catch(const exception &error) {
334 FATAL(error.what() << endl);
335 }
336
337
338 if (overwriteDetector) {
339 if (tripodFile == "") {
340 FATAL(
"No tripod file.");
341 }
342 }
343
344 for (const auto& i : parameters) {
345 if (PARAMETERS.count(i) == 0) {
346 FATAL(
"Invalid fit paramater " << i <<
", possible values: " <<
JEEPZ() << PARAMETERS << endl);
347 }
348 }
349
352
353 try {
354 load(detectorFile_a, detector_a);
355 }
358 }
359
360 try {
361 load(detectorFile_b, detector_b);
362 }
365 }
366
367
368 const JFit_t fit(detector_b, sigma_m, option, range);
369
371
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);
375 }
376 }
377
378
380
383
385
386
387 if (parameters.empty()) {
388 parameters = PARAMETERS;
389 }
390
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)); }
397
398
399 const double chi2 = simplex(fit,
data.begin(),
data.end());
400
402 cout <<
"chi2/NDF " <<
FIXED(7,3) << chi2 <<
'/' << (detector_a.size() - simplex.
step.size()) << endl;
403
404 cout << "model:" << endl;
405
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;
412
413
414 if (overwriteDetector) {
415
416 NOTICE(
"Store alignment data on files " << detectorFile_a <<
" and " << tripodFile << endl);
417
419
420 for (JDetector::iterator module = detector_a.begin(); module != detector_a.end(); ++module) {
421
424
425 module->add(p2 - p1);
426 }
427
428 try {
429 store(detectorFile_a, detector_a);
430 }
433 }
434
436
437 tripods.
load(tripodFile.c_str());
438
440
442
445
446 tripod->
add(p2 -
p1);
447 }
448
449 tripods.
store(tripodFile.c_str());
450 }
451}
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Simple fit method based on Powell's algorithm, see reference: Numerical Recipes in C++,...
std::vector< JModel_t > step
Data structure for position in three dimensions.
const JPosition3D & getPosition() const
Get position.
JVector3D & add(const JVector3D &vector)
Add vector.
Utility class to parse command line options.
const JUTMPosition & getUTMPosition() const
Get UTM position.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
void store(const std::string &file_name, const JDetector &detector)
Store detector to output file.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary data structure for floating point format specification.
Type definition of range.
Auxiliary wrapper for I/O of container with optional comment (see JComment).
Auxiliary data structure for streaming of STL containers.
void store(const char *file_name) const
Store to output file.
void load(const char *file_name)
Load from input file.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...