293 string detectorFile_a;
294 string detectorFile_b;
295 bool overwriteDetector;
304 JParser<> zap(
"Auxiliary program to align two detectors.");
306 zap[
'a'] =
make_field(detectorFile_a,
"detector - subject to alignment (option -A)");
307 zap[
'b'] =
make_field(detectorFile_b,
"detector - reference for alignment");
308 zap[
'A'] =
make_field(overwriteDetector,
"overwrite detector file provided through '-a' with modified positions.");
309 zap[
'T'] =
make_field(tripodFile,
"tripods") =
"";
311 zap[
'O'] =
make_field(option,
"keep strings vertical");
312 zap[
'r'] =
make_field(
range,
"range of floors used in fit") = JRange_t();
317 catch(
const exception &error) {
318 FATAL(error.what() << endl);
322 if (overwriteDetector) {
323 if (tripodFile ==
"") {
324 FATAL(
"No tripod file.");
333 load(detectorFile_a, detector_a);
340 load(detectorFile_b, detector_b);
347 const JFit_t fit(detector_b, sigma_m, option,
range);
351 for (JDetector::const_iterator module = detector_a.begin(); module != detector_a.end(); ++module) {
352 if (fit.hasModule(module->getID()) && module->getFloor() != 0) {
353 data.push_back(*module);
365 simplex.step.resize(6);
367 simplex.step[0] =
JModel_t(0.01, 0.00, 0.00, 0.0, 0.0, 0.0);
368 simplex.step[1] =
JModel_t(0.00, 0.01, 0.00, 0.0, 0.0, 0.0);
369 simplex.step[2] =
JModel_t(0.00, 0.00, 0.01, 0.0, 0.0, 0.0);
370 simplex.step[3] =
JModel_t(0.00, 0.00, 0.00, 5.0e-4, 0.0, 0.0);
371 simplex.step[4] =
JModel_t(0.00, 0.00, 0.00, 0.0, 1.0e-4, 0.0);
372 simplex.step[5] =
JModel_t(0.00, 0.00, 0.00, 0.0, 0.0, 1.0e-4);
374 const double chi2 = simplex(fit, data.begin(), data.end());
376 cout <<
"Number of iterations " << simplex.numberOfIterations << endl;
377 cout <<
"chi2/NDF " <<
FIXED(7,3) << chi2 <<
'/' << (detector_a.size() - simplex.step.size()) << endl;
379 cout <<
"model:" << endl;
381 cout <<
"x " <<
FIXED(7,3) << simplex.value.x << endl;
382 cout <<
"y " <<
FIXED(7,3) << simplex.value.y << endl;
383 cout <<
"z " <<
FIXED(7,3) << simplex.value.z << endl;
384 cout <<
"phi " <<
FIXED(9,5) << simplex.value.phi << endl;
385 cout <<
"Tx " <<
FIXED(9,5) << simplex.value.tx << endl;
386 cout <<
"Ty " <<
FIXED(9,5) << simplex.value.ty << endl;
389 if (overwriteDetector) {
391 NOTICE(
"Store alignment data on files " << detectorFile_a <<
" and " << tripodFile << endl);
393 detector_a.comment.add(
JMeta(argc,argv));
395 for (JDetector::iterator module = detector_a.begin(); module != detector_a.end(); ++module) {
400 module->add(p2 - p1);
404 store(detectorFile_a, detector_a);
412 tripods.
load(tripodFile.c_str());
418 const JPosition3D p1 = tripod->getUTMPosition() - detector_a.getUTMPosition();
421 tripod->
add(p2 - p1);
424 tripods.
store(tripodFile.c_str());
Utility class to parse command line options.
JFit_t
Enumeration for fit algorithms.
Auxiliary data structure for floating point format specification.
Auxiliary wrapper for I/O of container with optional comment (see JComment).
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
void store(const std::string &file_name, const JDetector &detector)
Store detector to output file.
const JPosition3D & getPosition() const
Get position.
void load(const char *file_name)
Load from input file.
z range($ZMAX-$ZMIN)< $MINIMAL_DZ." fi fi typeset -Z 4 STRING typeset -Z 2 FLOOR JPlot1D -f $
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
Simple fit method based on Powell's algorithm, see reference: Numerical Recipes in C++...
void store(const char *file_name) const
Store to output file.
Data structure for position in three dimensions.
JVector3D & add(const JVector3D &vector)
Add vector.