290{
293
294 string detectorFile_a;
295 string detectorFile_b;
296 bool overwriteDetector;
297 string tripodFile;
298 double sigma_m;
299 bool option;
302
303 try {
304
305 JParser<> zap(
"Auxiliary program to align two detectors.");
306
307 zap[
'a'] =
make_field(detectorFile_a,
"detector - subject to alignment (option -A)");
308 zap[
'b'] =
make_field(detectorFile_b,
"detector - reference for alignment");
309 zap[
'A'] =
make_field(overwriteDetector,
"overwrite detector file provided through '-a' with modified positions.");
310 zap[
'T'] =
make_field(tripodFile,
"tripods") =
"";
312 zap[
'O'] =
make_field(option,
"keep strings vertical");
315
316 zap(argc, argv);
317 }
318 catch(const exception &error) {
319 FATAL(error.what() << endl);
320 }
321
322
323 if (overwriteDetector) {
324 if (tripodFile == "") {
325 FATAL(
"No tripod file.");
326 }
327 }
328
329
332
333 try {
334 load(detectorFile_a, detector_a);
335 }
338 }
339
340 try {
341 load(detectorFile_b, detector_b);
342 }
345 }
346
347
348 const JFit_t fit(detector_b, sigma_m, option, range);
349
351
352 for (JDetector::const_iterator module = detector_a.begin(); module != detector_a.end(); ++module) {
353 if (fit.hasModule(module->getID())) {
354 data.push_back(*module);
355 }
356 }
357
358
360
363
365
366 simplex.
step.resize(6);
367
368 simplex.
step[0] =
JModel_t(0.01, 0.00, 0.00, 0.0, 0.0, 0.0);
369 simplex.
step[1] =
JModel_t(0.00, 0.01, 0.00, 0.0, 0.0, 0.0);
370 simplex.
step[2] =
JModel_t(0.00, 0.00, 0.01, 0.0, 0.0, 0.0);
371 simplex.
step[3] =
JModel_t(0.00, 0.00, 0.00, 5.0e-4, 0.0, 0.0);
372 simplex.
step[4] =
JModel_t(0.00, 0.00, 0.00, 0.0, 1.0e-4, 0.0);
373 simplex.
step[5] =
JModel_t(0.00, 0.00, 0.00, 0.0, 0.0, 1.0e-4);
374
375 const double chi2 = simplex(fit,
data.begin(),
data.end());
376
378 cout <<
"chi2/NDF " <<
FIXED(7,3) << chi2 <<
'/' << (detector_a.size() - simplex.
step.size()) << endl;
379
380 cout << "model:" << endl;
381
382 cout <<
"x " <<
FIXED(7,3) << simplex.
value.x << endl;
383 cout <<
"y " <<
FIXED(7,3) << simplex.
value.y << endl;
384 cout <<
"z " <<
FIXED(7,3) << simplex.
value.z << endl;
385 cout <<
"phi " <<
FIXED(9,5) << simplex.
value.phi << endl;
386 cout <<
"Tx " <<
FIXED(9,5) << simplex.
value.tx << endl;
387 cout <<
"Ty " <<
FIXED(9,5) << simplex.
value.ty << endl;
388
389
390 if (overwriteDetector) {
391
392 NOTICE(
"Store alignment data on files " << detectorFile_a <<
" and " << tripodFile << endl);
393
395
396 for (JDetector::iterator module = detector_a.begin(); module != detector_a.end(); ++module) {
397
400
401 module->add(p2 - p1);
402 }
403
404 try {
405 store(detectorFile_a, detector_a);
406 }
409 }
410
412
413 tripods.
load(tripodFile.c_str());
414
416
418
421
422 tripod->
add(p2 -
p1);
423 }
424
425 tripods.
store(tripodFile.c_str());
426 }
427}
#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).
void store(const char *file_name) const
Store to output file.
void load(const char *file_name)
Load from input file.