Jpp test-rotations-old
the software that should make you happy
Loading...
Searching...
No Matches
JAlignDetector.cc File Reference

Auxiliary program to align two detectors. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <vector>
#include "JMath/JMath.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JModuleRouter.hh"
#include "JDetector/JTripod.hh"
#include "JFit/JSimplex.hh"
#include "JLang/JException.hh"
#include "JSupport/JMeta.hh"
#include "JTools/JRange.hh"
#include "Jeep/JContainer.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Auxiliary program to align two detectors.


Author
mjongen

Definition in file JAlignDetector.cc.

Function Documentation

◆ main()

int main ( int argc,
char ** argv )

Definition at line 289 of file JAlignDetector.cc.

290{
291 using namespace std;
292 using namespace JPP;
293
294 string detectorFile_a;
295 string detectorFile_b;
296 bool overwriteDetector;
297 string tripodFile;
298 double sigma_m;
299 bool option;
300 JRange_t range;
301 int debug;
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") = "";
311 zap['s'] = make_field(sigma_m) = 0.2;
312 zap['O'] = make_field(option, "keep strings vertical");
313 zap['r'] = make_field(range, "range of floors used in fit") = JRange_t();
314 zap['d'] = make_field(debug) = 2;
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
330 JDetector detector_a;
331 JDetector detector_b;
332
333 try {
334 load(detectorFile_a, detector_a);
335 }
336 catch(const JException& error) {
337 FATAL(error);
338 }
339
340 try {
341 load(detectorFile_b, detector_b);
342 }
343 catch(const JException& error) {
344 FATAL(error);
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
359 JSimplex<JModel_t> simplex;
360
363
364 simplex.value = JModel_t(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
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
377 cout << "Number of iterations " << simplex.numberOfIterations << endl;
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
394 detector_a.comment.add(JMeta(argc,argv));
395
396 for (JDetector::iterator module = detector_a.begin(); module != detector_a.end(); ++module) {
397
398 const JPosition3D p1 = module->getPosition();
399 const JPosition3D p2 = fit.getPosition(simplex.value, p1);
400
401 module->add(p2 - p1);
402 }
403
404 try {
405 store(detectorFile_a, detector_a);
406 }
407 catch(const JException& error) {
408 FATAL(error);
409 }
410
412
413 tripods.load(tripodFile.c_str());
414
415 tripods.comment.add(JMeta(argc,argv));
416
417 for (vector<JTripod>::iterator tripod = tripods.begin(); tripod != tripods.end(); ++tripod) {
418
419 const JPosition3D p1 = tripod->getUTMPosition() - detector_a.getUTMPosition();
420 const JPosition3D p2 = fit.getPosition(simplex.value, p1);
421
422 tripod->add(p2 - p1);
423 }
424
425 tripods.store(tripodFile.c_str());
426 }
427}
TPaveText * p1
#define NOTICE(A)
Definition JMessage.hh:64
#define FATAL(A)
Definition JMessage.hh:67
int debug
debug level
Definition JSirene.cc:72
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
Detector data structure.
Definition JDetector.hh:96
Simple fit method based on Powell's algorithm, see reference: Numerical Recipes in C++,...
Definition JSimplex.hh:44
JModel_t value
Definition JSimplex.hh:240
std::vector< JModel_t > step
Definition JSimplex.hh:241
int numberOfIterations
Definition JSimplex.hh:242
Data structure for position in three dimensions.
const JPosition3D & getPosition() const
Get position.
JVector3D & add(const JVector3D &vector)
Add vector.
Definition JVector3D.hh:142
General exception.
Definition JException.hh:24
Utility class to parse command line options.
Definition JParser.hh:1698
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.
Definition JManip.hh:448
Type definition of range.
Definition JHead.hh:43
JComment & add(const std::string &comment)
Add comment.
Definition JComment.hh:100
Auxiliary wrapper for I/O of container with optional comment (see JComment).
Definition JContainer.hh:42
void store(const char *file_name) const
Store to output file.
void load(const char *file_name)
Load from input file.
Auxiliary class for ROOT I/O of application specific meta data.
Definition JMeta.hh:72