294   string             detectorFile_a;
 
  295   string             detectorFile_b;
 
  296   bool               overwriteDetector;
 
  305     JParser<> zap(
"Auxiliary program to align two detectors.");
 
  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");
 
  318   catch(
const exception &error) {
 
  319     FATAL(error.what() << endl);
 
  323   if (overwriteDetector) {
 
  324     if (tripodFile == 
"") {
 
  325       FATAL(
"No tripod file.");
 
  334     load(detectorFile_a, detector_a);
 
  341     load(detectorFile_b, detector_b);
 
  348   const JFit_t fit(detector_b, sigma_m, option, 
range);
 
  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);
 
  366   simplex.step.resize(6);
 
  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);
 
  375   const double chi2 = simplex(fit, 
data.begin(), 
data.end());
 
  377   cout << 
"Number of iterations " << simplex.numberOfIterations << endl;
 
  378   cout << 
"chi2/NDF " << 
FIXED(7,3) << 
chi2 << 
'/' << (detector_a.size() - simplex.step.size()) << endl;
 
  380   cout << 
"model:" << endl;
 
  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;
 
  390   if (overwriteDetector) {
 
  392     NOTICE(
"Store alignment data on files " << detectorFile_a << 
" and " << tripodFile << endl);
 
  394     detector_a.comment.add(
JMeta(argc,argv));
 
  396     for (JDetector::iterator module = detector_a.begin(); module != detector_a.end(); ++module) {
 
  401       module->add(p2 - p1);
 
  405       store(detectorFile_a, detector_a);
 
  413     tripods.
load(tripodFile.c_str());
 
  419       const JPosition3D p1 = tripod->getUTMPosition() - detector_a.getUTMPosition();
 
  422       tripod->
add(p2 - p1);
 
  425     tripods.
store(tripodFile.c_str());
 
Utility class to parse command line options. 
 
Auxiliary data structure for floating point format specification. 
 
Type definition of range. 
 
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. 
 
then if[[!-f $DETECTOR]] then JDetector sh $DETECTOR fi cat $WORKDIR trigger_parameters txt<< EOFtrigger3DMuon.enabled=1;trigger3DMuon.numberOfHits=5;trigger3DMuon.gridAngle_deg=1;ctMin=0.0;TMaxLocal_ns=15.0;EOF set_variable TRIGGEREFFICIENCY_TRIGGERED_EVENTS_ONLY INPUT_FILES=() for((i=1;$i<=$NUMBER_OF_RUNS;++i));do JSirene.sh $DETECTOR $JPP_DATA/genhen.km3net_wpd_V2_0.evt.gz $WORKDIR/sirene_ ${i}.root JTriggerEfficiency.sh $DETECTOR $DETECTOR $WORKDIR/sirene_ ${i}.root $WORKDIR/trigger_efficiency_ ${i}.root $WORKDIR/trigger_parameters.txt $JPP_DATA/PMT_parameters.txt INPUT_FILES+=($WORKDIR/trigger_efficiency_ ${i}.root) done for ANGLE_DEG in $ANGLES_DEG[*];do set_variable SIGMA_NS 3.0 set_variable OUTLIERS 3 set_variable OUTPUT_FILE $WORKDIR/matrix\[${ANGLE_DEG}\deg\].root $JPP_DIR/examples/JReconstruction-f"$INPUT_FILES[*]"-o $OUTPUT_FILE-S ${SIGMA_NS}-A ${ANGLE_DEG}-O ${OUTLIERS}-d ${DEBUG}--!fiif[[$OPTION=="plot"]];then if((0));then for H1 in h0 h1;do JPlot1D-f"$WORKDIR/matrix["${^ANGLES_DEG}" deg].root:${H1}"-y"1 2e3"-Y-L TR-T""-\^"number of events [a.u.]"-> o chi2
 
Data structure for position in three dimensions. 
 
JVector3D & add(const JVector3D &vector)
Add vector.