39 double nominal_beam_momentum)
40 : x_parametrisation(5, polynom_type,
"k"),
41 theta_x_parametrisation(5, polynom_type,
"k"),
42 y_parametrisation(5, polynom_type,
"k"),
43 theta_y_parametrisation(5, polynom_type,
"k") {
44 this->SetName(
name.c_str());
45 this->SetTitle(
title.c_str());
48 if (beam_direction ==
"lhcb1")
50 else if (beam_direction ==
"lhcb2")
69 double in_corrected[5];
70 if (
beam ==
lhcb1 || !invert_beam_coord_sytems) {
71 in_corrected[0] =
in[0];
72 in_corrected[1] =
in[1];
73 in_corrected[2] =
in[2];
74 in_corrected[3] =
in[3];
75 in_corrected[4] =
in[4];
77 in_corrected[0] = -
in[0];
78 in_corrected[1] = -
in[1];
79 in_corrected[2] =
in[2];
80 in_corrected[3] =
in[3];
81 in_corrected[4] =
in[4];
88 for (
int i = 0;
i < 5;
i++) {
89 if (in_corrected[
i] < (*min_var)(
i)) {
90 double dist = TMath::Abs(((*min_var)(
i)-in_corrected[
i]) / ((*max_var)(
i) - (*min_var)(
i)));
91 res += 8 * (TMath::Exp(dist) - 1.0);
92 in_corrected[
i] = (*min_var)(
i);
93 }
else if (in_corrected[
i] > (*max_var)(
i)) {
94 double dist = TMath::Abs((in_corrected[
i] - (*max_var)(
i)) / ((*max_var)(
i) - (*min_var)(
i)));
95 res += 8 * (TMath::Exp(dist) - 1.0);
96 in_corrected[
i] = (*max_var)(
i);
104 bool check_apertures,
105 bool invert_beam_coord_sytems)
const {
110 double in_corrected[5];
112 if (
beam ==
lhcb1 || !invert_beam_coord_sytems) {
113 in_corrected[0] =
in[0];
114 in_corrected[1] =
in[1];
115 in_corrected[2] =
in[2];
116 in_corrected[3] =
in[3];
117 in_corrected[4] =
in[4];
124 in_corrected[0] = -
in[0];
125 in_corrected[1] = -
in[1];
126 in_corrected[2] =
in[2];
127 in_corrected[3] =
in[3];
128 in_corrected[4] =
in[4];
136 if (check_apertures) {
146 bool check_apertures,
147 bool invert_beam_coord_sytems)
const 150 if (
in ==
nullptr ||
out ==
nullptr || !trained_)
153 bool res = CheckInputRange(
in);
154 double in_corrected[5];
156 if (
beam == lhcb1 || !invert_beam_coord_sytems) {
157 in_corrected[0] =
in[0];
158 in_corrected[1] =
in[1];
159 in_corrected[2] =
in[2];
160 in_corrected[3] =
in[3];
161 in_corrected[4] =
in[4];
162 out[0] = x_parametrisation.Eval(in_corrected);
163 out[1] = y_parametrisation.Eval(in_corrected);
165 in_corrected[0] = -
in[0];
166 in_corrected[1] = -
in[1];
167 in_corrected[2] =
in[2];
168 in_corrected[3] =
in[3];
169 in_corrected[4] =
in[4];
170 out[0] = -x_parametrisation.Eval(in_corrected);
171 out[1] = y_parametrisation.Eval(in_corrected);
174 if (check_apertures) {
175 for (
unsigned int i = 0;
i < apertures_.size();
i++) {
176 res =
res && apertures_[
i].CheckAperture(
in);
183 double in_momentum[3],
185 double out_momentum[3],
186 bool check_apertures,
187 double z2_z1_dist)
const {
190 double part_mom = 0.0;
191 for (
int i = 0;
i < 3; ++
i)
192 part_mom += in_momentum[
i] * in_momentum[
i];
208 out_pos[2] = in_pos[2] + z2_z1_dist;
213 out_momentum[2] =
std::sqrt(part_out_total_mom * part_out_total_mom - out_momentum[0] * out_momentum[0] -
214 out_momentum[1] * out_momentum[1]);
215 out_momentum[2] = TMath::Sign(out_momentum[2], in_momentum[2]);
222 bool check_apertures,
223 bool invert_beam_coord_sytems)
const {
251 x_parametrisation(org.x_parametrisation),
252 theta_x_parametrisation(org.theta_x_parametrisation),
253 y_parametrisation(org.y_parametrisation),
254 theta_y_parametrisation(org.theta_y_parametrisation) {
295 if (inp_tree ==
nullptr)
317 std::string theta_x_out_lab = data_prefix +
"_theta_x_out";
319 std::string theta_y_out_lab = data_prefix +
"_theta_y_out";
320 std::string ksi_out_lab = data_prefix +
"_ksi_out";
322 std::string valid_out_lab = data_prefix +
"_valid_out";
325 inp_tree->SetBranchStatus(
"*",
false);
326 inp_tree->SetBranchStatus(x_in_lab.c_str(),
true);
327 inp_tree->SetBranchStatus(theta_x_in_lab.c_str(),
true);
328 inp_tree->SetBranchStatus(y_in_lab.c_str(),
true);
329 inp_tree->SetBranchStatus(theta_y_in_lab.c_str(),
true);
330 inp_tree->SetBranchStatus(ksi_in_lab.c_str(),
true);
331 inp_tree->SetBranchStatus(x_out_lab.c_str(),
true);
332 inp_tree->SetBranchStatus(theta_x_out_lab.c_str(),
true);
333 inp_tree->SetBranchStatus(y_out_lab.c_str(),
true);
334 inp_tree->SetBranchStatus(theta_y_out_lab.c_str(),
true);
335 inp_tree->SetBranchStatus(ksi_out_lab.c_str(),
true);
336 inp_tree->SetBranchStatus(valid_out_lab.c_str(),
true);
339 inp_tree->SetBranchAddress(x_in_lab.c_str(), &(in_var[0]));
340 inp_tree->SetBranchAddress(theta_x_in_lab.c_str(), &(in_var[1]));
341 inp_tree->SetBranchAddress(y_in_lab.c_str(), &(in_var[2]));
342 inp_tree->SetBranchAddress(theta_y_in_lab.c_str(), &(in_var[3]));
343 inp_tree->SetBranchAddress(ksi_in_lab.c_str(), &(in_var[4]));
344 inp_tree->SetBranchAddress(s_in_lab.c_str(), &(in_var[5]));
347 inp_tree->SetBranchAddress(x_out_lab.c_str(), &(out_var[0]));
348 inp_tree->SetBranchAddress(theta_x_out_lab.c_str(), &(out_var[1]));
349 inp_tree->SetBranchAddress(y_out_lab.c_str(), &(out_var[2]));
350 inp_tree->SetBranchAddress(theta_y_out_lab.c_str(), &(out_var[3]));
351 inp_tree->SetBranchAddress(ksi_out_lab.c_str(), &(out_var[4]));
352 inp_tree->SetBranchAddress(s_out_lab.c_str(), &(out_var[5]));
353 inp_tree->SetBranchAddress(valid_out_lab.c_str(), &(out_var[6]));
355 Long64_t entries = inp_tree->GetEntries();
357 inp_tree->SetBranchStatus(s_in_lab.c_str(),
true);
358 inp_tree->SetBranchStatus(s_out_lab.c_str(),
true);
359 inp_tree->GetEntry(0);
362 inp_tree->SetBranchStatus(s_in_lab.c_str(),
false);
363 inp_tree->SetBranchStatus(s_out_lab.c_str(),
false);
367 for (Long64_t
i = 0;
i < entries; ++
i) {
368 inp_tree->GetEntry(
i);
381 for (
int i = 0;
i < 4;
i++) {
382 double best_precision = 0.0;
384 best_precision = prec[
i];
417 if (max_degree < 1 || max_degree > 20)
421 Int_t mPowers[] = {1, 1, 0, 0, max_degree};
433 Int_t mPowers[] = {0, 0, 1, 1, max_degree};
449 if (max_degree < 1 || max_degree > 20)
456 std::vector<Int_t> term_literals;
457 term_literals.reserve(5000);
461 for (
int i = 0;
i <= max_degree; ++
i) {
462 term_literals.push_back(1);
463 term_literals.push_back(0);
464 term_literals.push_back(0);
465 term_literals.push_back(0);
466 term_literals.push_back(
i);
469 for (
int i = 0;
i <= max_degree; ++
i) {
470 term_literals.push_back(0);
471 term_literals.push_back(1);
472 term_literals.push_back(0);
473 term_literals.push_back(0);
474 term_literals.push_back(
i);
477 for (
int i = 0;
i <= max_degree; ++
i) {
478 term_literals.push_back(0);
479 term_literals.push_back(2);
480 term_literals.push_back(0);
481 term_literals.push_back(0);
482 term_literals.push_back(
i);
485 for (
int i = 0;
i <= max_degree; ++
i) {
486 term_literals.push_back(0);
487 term_literals.push_back(3);
488 term_literals.push_back(0);
489 term_literals.push_back(0);
490 term_literals.push_back(
i);
493 for (
int i = 0;
i <= max_degree; ++
i) {
494 term_literals.push_back(0);
495 term_literals.push_back(0);
496 term_literals.push_back(0);
497 term_literals.push_back(0);
498 term_literals.push_back(
i);
504 for (
int i = 0;
i <= max_degree; ++
i) {
505 term_literals.push_back(0);
506 term_literals.push_back(0);
507 term_literals.push_back(1);
508 term_literals.push_back(0);
509 term_literals.push_back(
i);
512 for (
int i = 0;
i <= max_degree; ++
i) {
513 term_literals.push_back(0);
514 term_literals.push_back(0);
515 term_literals.push_back(0);
516 term_literals.push_back(1);
517 term_literals.push_back(
i);
520 for (
int i = 0;
i <= max_degree; ++
i) {
521 term_literals.push_back(0);
522 term_literals.push_back(0);
523 term_literals.push_back(0);
524 term_literals.push_back(2);
525 term_literals.push_back(
i);
528 for (
int i = 0;
i <= max_degree; ++
i) {
529 term_literals.push_back(0);
530 term_literals.push_back(0);
531 term_literals.push_back(0);
532 term_literals.push_back(3);
533 term_literals.push_back(
i);
536 for (
int i = 0;
i <= max_degree; ++
i) {
537 term_literals.push_back(0);
538 term_literals.push_back(0);
539 term_literals.push_back(0);
540 term_literals.push_back(0);
541 term_literals.push_back(
i);
547 term_literals.push_back(1), term_literals.push_back(1), term_literals.push_back(0), term_literals.push_back(0),
548 term_literals.push_back(0);
549 term_literals.push_back(1), term_literals.push_back(0), term_literals.push_back(1), term_literals.push_back(0),
550 term_literals.push_back(0);
551 term_literals.push_back(1), term_literals.push_back(0), term_literals.push_back(0), term_literals.push_back(1),
552 term_literals.push_back(0);
553 term_literals.push_back(0), term_literals.push_back(1), term_literals.push_back(1), term_literals.push_back(0),
554 term_literals.push_back(0);
555 term_literals.push_back(0), term_literals.push_back(1), term_literals.push_back(0), term_literals.push_back(1),
556 term_literals.push_back(0);
557 term_literals.push_back(0), term_literals.push_back(0), term_literals.push_back(1), term_literals.push_back(1),
558 term_literals.push_back(0);
560 term_literals.push_back(1), term_literals.push_back(1), term_literals.push_back(0), term_literals.push_back(0),
561 term_literals.push_back(1);
562 term_literals.push_back(1), term_literals.push_back(0), term_literals.push_back(1), term_literals.push_back(0),
563 term_literals.push_back(1);
564 term_literals.push_back(1), term_literals.push_back(0), term_literals.push_back(0), term_literals.push_back(1),
565 term_literals.push_back(1);
566 term_literals.push_back(0), term_literals.push_back(1), term_literals.push_back(1), term_literals.push_back(0),
567 term_literals.push_back(1);
568 term_literals.push_back(0), term_literals.push_back(1), term_literals.push_back(0), term_literals.push_back(1),
569 term_literals.push_back(1);
570 term_literals.push_back(0), term_literals.push_back(0), term_literals.push_back(1), term_literals.push_back(1),
571 term_literals.push_back(1);
573 term_literals.push_back(1), term_literals.push_back(2), term_literals.push_back(0), term_literals.push_back(0),
574 term_literals.push_back(0);
575 term_literals.push_back(1), term_literals.push_back(0), term_literals.push_back(2), term_literals.push_back(0),
576 term_literals.push_back(0);
577 term_literals.push_back(1), term_literals.push_back(0), term_literals.push_back(0), term_literals.push_back(2),
578 term_literals.push_back(0);
579 term_literals.push_back(2), term_literals.push_back(1), term_literals.push_back(0), term_literals.push_back(0),
580 term_literals.push_back(0);
581 term_literals.push_back(0), term_literals.push_back(1), term_literals.push_back(2), term_literals.push_back(0),
582 term_literals.push_back(0);
583 term_literals.push_back(0), term_literals.push_back(1), term_literals.push_back(0), term_literals.push_back(2),
584 term_literals.push_back(0);
585 term_literals.push_back(2), term_literals.push_back(0), term_literals.push_back(1), term_literals.push_back(0),
586 term_literals.push_back(0);
587 term_literals.push_back(0), term_literals.push_back(2), term_literals.push_back(1), term_literals.push_back(0),
588 term_literals.push_back(0);
589 term_literals.push_back(0), term_literals.push_back(0), term_literals.push_back(1), term_literals.push_back(2),
590 term_literals.push_back(0);
591 term_literals.push_back(2), term_literals.push_back(0), term_literals.push_back(0), term_literals.push_back(1),
592 term_literals.push_back(0);
593 term_literals.push_back(0), term_literals.push_back(2), term_literals.push_back(0), term_literals.push_back(1),
594 term_literals.push_back(0);
595 term_literals.push_back(0), term_literals.push_back(0), term_literals.push_back(2), term_literals.push_back(1),
596 term_literals.push_back(0);
598 term_literals.push_back(1), term_literals.push_back(2), term_literals.push_back(0), term_literals.push_back(0),
599 term_literals.push_back(1);
600 term_literals.push_back(1), term_literals.push_back(0), term_literals.push_back(2), term_literals.push_back(0),
601 term_literals.push_back(1);
602 term_literals.push_back(1), term_literals.push_back(0), term_literals.push_back(0), term_literals.push_back(2),
603 term_literals.push_back(1);
604 term_literals.push_back(2), term_literals.push_back(1), term_literals.push_back(0), term_literals.push_back(0),
605 term_literals.push_back(1);
606 term_literals.push_back(0), term_literals.push_back(1), term_literals.push_back(2), term_literals.push_back(0),
607 term_literals.push_back(1);
608 term_literals.push_back(0), term_literals.push_back(1), term_literals.push_back(0), term_literals.push_back(2),
609 term_literals.push_back(1);
610 term_literals.push_back(2), term_literals.push_back(0), term_literals.push_back(1), term_literals.push_back(0),
611 term_literals.push_back(1);
612 term_literals.push_back(0), term_literals.push_back(2), term_literals.push_back(1), term_literals.push_back(0),
613 term_literals.push_back(1);
614 term_literals.push_back(0), term_literals.push_back(0), term_literals.push_back(1), term_literals.push_back(2),
615 term_literals.push_back(1);
616 term_literals.push_back(2), term_literals.push_back(0), term_literals.push_back(0), term_literals.push_back(1),
617 term_literals.push_back(1);
618 term_literals.push_back(0), term_literals.push_back(2), term_literals.push_back(0), term_literals.push_back(1),
619 term_literals.push_back(1);
620 term_literals.push_back(0), term_literals.push_back(0), term_literals.push_back(2), term_literals.push_back(1),
621 term_literals.push_back(1);
624 std::vector<Int_t> powers;
625 powers.resize(term_literals.size());
627 for (
unsigned int i = 0;
i < term_literals.size(); ++
i) {
628 powers[
i] = term_literals[
i];
630 approximator.
SetPowers(&powers[0], term_literals.size() / 5);
634 if (inp_tree ==
nullptr || f_out ==
nullptr)
654 std::string theta_x_out_lab = data_prefix +
"_theta_x_out";
656 std::string theta_y_out_lab = data_prefix +
"_theta_y_out";
657 std::string ksi_out_lab = data_prefix +
"_ksi_out";
659 std::string valid_out_lab = data_prefix +
"_valid_out";
662 inp_tree->SetBranchStatus(
"*",
false);
663 inp_tree->SetBranchStatus(x_in_lab.c_str(),
true);
664 inp_tree->SetBranchStatus(theta_x_in_lab.c_str(),
true);
665 inp_tree->SetBranchStatus(y_in_lab.c_str(),
true);
666 inp_tree->SetBranchStatus(theta_y_in_lab.c_str(),
true);
667 inp_tree->SetBranchStatus(ksi_in_lab.c_str(),
true);
668 inp_tree->SetBranchStatus(x_out_lab.c_str(),
true);
669 inp_tree->SetBranchStatus(theta_x_out_lab.c_str(),
true);
670 inp_tree->SetBranchStatus(y_out_lab.c_str(),
true);
671 inp_tree->SetBranchStatus(theta_y_out_lab.c_str(),
true);
672 inp_tree->SetBranchStatus(ksi_out_lab.c_str(),
true);
673 inp_tree->SetBranchStatus(valid_out_lab.c_str(),
true);
676 inp_tree->SetBranchAddress(x_in_lab.c_str(), &(in_var[0]));
677 inp_tree->SetBranchAddress(theta_x_in_lab.c_str(), &(in_var[1]));
678 inp_tree->SetBranchAddress(y_in_lab.c_str(), &(in_var[2]));
679 inp_tree->SetBranchAddress(theta_y_in_lab.c_str(), &(in_var[3]));
680 inp_tree->SetBranchAddress(ksi_in_lab.c_str(), &(in_var[4]));
681 inp_tree->SetBranchAddress(s_in_lab.c_str(), &(in_var[5]));
684 inp_tree->SetBranchAddress(x_out_lab.c_str(), &(out_var[0]));
685 inp_tree->SetBranchAddress(theta_x_out_lab.c_str(), &(out_var[1]));
686 inp_tree->SetBranchAddress(y_out_lab.c_str(), &(out_var[2]));
687 inp_tree->SetBranchAddress(theta_y_out_lab.c_str(), &(out_var[3]));
688 inp_tree->SetBranchAddress(ksi_out_lab.c_str(), &(out_var[4]));
689 inp_tree->SetBranchAddress(s_out_lab.c_str(), &(out_var[5]));
690 inp_tree->SetBranchAddress(valid_out_lab.c_str(), &(out_var[6]));
694 TH2D *err_inp_cor_hists[4][5];
695 TH2D *err_out_cor_hists[4][5];
701 Long64_t entries = inp_tree->GetEntries();
703 for (Long64_t
i = 0;
i < entries; ++
i) {
705 inp_tree->GetEntry(
i);
717 WriteHistograms(err_hists, err_inp_cor_hists, err_out_cor_hists, f_out, base_out_dir);
725 std::vector<std::string> error_labels;
726 error_labels.push_back(
"x error");
727 error_labels.push_back(
"theta_x error");
728 error_labels.push_back(
"y error");
729 error_labels.push_back(
"theta_y error");
731 for (
int i = 0;
i < 4; ++
i) {
732 err_hists[
i] =
new TH1D(error_labels[
i].c_str(), error_labels[
i].c_str(), 100, -0.0000000001, 0.0000000001);
733 err_hists[
i]->SetXTitle(error_labels[
i].c_str());
734 err_hists[
i]->SetYTitle(
"counts");
735 err_hists[
i]->SetDirectory(
nullptr);
736 err_hists[
i]->SetCanExtend(TH1::kAllAxes);
741 TTree *inp_tree, TTree *out_tree)
743 if (inp_tree ==
nullptr || out_tree ==
nullptr)
746 Long64_t entries = inp_tree->GetEntries();
748 double parametrization_out[5];
750 inp_tree->SetBranchAddress(
"x", &(
entry[0]));
751 inp_tree->SetBranchAddress(
"theta_x", &(
entry[1]));
752 inp_tree->SetBranchAddress(
"y", &(
entry[2]));
753 inp_tree->SetBranchAddress(
"theta_y", &(
entry[3]));
754 inp_tree->SetBranchAddress(
"ksi", &(
entry[4]));
755 inp_tree->SetBranchAddress(
"mad_accept", &(
entry[5]));
756 inp_tree->SetBranchAddress(
"par_accept", &(
entry[6]));
758 out_tree->SetBranchAddress(
"x", &(
entry[0]));
759 out_tree->SetBranchAddress(
"theta_x", &(
entry[1]));
760 out_tree->SetBranchAddress(
"y", &(
entry[2]));
761 out_tree->SetBranchAddress(
"theta_y", &(
entry[3]));
762 out_tree->SetBranchAddress(
"ksi", &(
entry[4]));
763 out_tree->SetBranchAddress(
"mad_accept", &(
entry[5]));
764 out_tree->SetBranchAddress(
"par_accept", &(
entry[6]));
767 for (Long64_t
i = 0;
i < entries; ++
i) {
768 inp_tree->GetEntry(
i);
784 std::vector<std::string> error_labels;
785 std::vector<std::string> data_labels;
787 error_labels.push_back(
"x error");
788 error_labels.push_back(
"theta_x error");
789 error_labels.push_back(
"y error");
790 error_labels.push_back(
"theta_y error");
792 data_labels.push_back(
"x input");
793 data_labels.push_back(
"theta_x input");
794 data_labels.push_back(
"y input");
795 data_labels.push_back(
"theta_y input");
796 data_labels.push_back(
"ksi input");
798 for (
int eri = 0; eri < 4; ++eri) {
799 for (
int dati = 0; dati < 5; ++dati) {
802 err_inp_cor_hists[eri][dati] =
803 new TH2D(
name.c_str(),
title.c_str(), 100, -0.0000000001, 0.0000000001, 100, -0.0000000001, 0.0000000001);
804 err_inp_cor_hists[eri][dati]->SetXTitle(error_labels[eri].c_str());
805 err_inp_cor_hists[eri][dati]->SetYTitle(data_labels[dati].c_str());
806 err_inp_cor_hists[eri][dati]->SetDirectory(
nullptr);
807 err_inp_cor_hists[eri][dati]->SetCanExtend(TH1::kAllAxes);
813 std::vector<std::string> error_labels;
814 std::vector<std::string> data_labels;
816 error_labels.push_back(
"x error");
817 error_labels.push_back(
"theta_x error");
818 error_labels.push_back(
"y error");
819 error_labels.push_back(
"theta_y error");
821 data_labels.push_back(
"x output");
822 data_labels.push_back(
"theta_x output");
823 data_labels.push_back(
"y output");
824 data_labels.push_back(
"theta_y output");
825 data_labels.push_back(
"ksi output");
827 for (
int eri = 0; eri < 4; ++eri) {
828 for (
int dati = 0; dati < 5; ++dati) {
831 err_out_cor_hists[eri][dati] =
832 new TH2D(
name.c_str(),
title.c_str(), 100, -0.0000000001, 0.0000000001, 100, -0.0000000001, 0.0000000001);
833 err_out_cor_hists[eri][dati]->SetXTitle(error_labels[eri].c_str());
834 err_out_cor_hists[eri][dati]->SetYTitle(data_labels[dati].c_str());
835 err_out_cor_hists[eri][dati]->SetDirectory(
nullptr);
836 err_out_cor_hists[eri][dati]->SetCanExtend(TH1::kAllAxes);
842 for (
int i = 0;
i < 4; ++
i) {
848 for (
int eri = 0; eri < 4; ++eri) {
849 for (
int dati = 0; dati < 5; ++dati) {
850 err_cor_hists[eri][dati]->Fill(
errors[eri],
var[dati]);
856 for (
int i = 0;
i < 4; ++
i) {
862 for (
int eri = 0; eri < 4; ++eri) {
863 for (
int dati = 0; dati < 5; ++dati) {
864 delete err_cor_hists[eri][dati];
870 TH2D *err_inp_cor_hists[4][5],
871 TH2D *err_out_cor_hists[4][5],
874 if (f_out ==
nullptr)
878 if (!gDirectory->cd(base_out_dir.c_str()))
879 gDirectory->mkdir(base_out_dir.c_str());
881 gDirectory->cd(base_out_dir.c_str());
882 gDirectory->mkdir(this->GetName());
883 gDirectory->cd(this->GetName());
884 gDirectory->mkdir(
"x");
885 gDirectory->mkdir(
"theta_x");
886 gDirectory->mkdir(
"y");
887 gDirectory->mkdir(
"theta_y");
890 err_hists[0]->Write(
"", TObject::kWriteDelete);
891 for (
int i = 0;
i < 5;
i++) {
892 err_inp_cor_hists[0][
i]->Write(
"", TObject::kWriteDelete);
893 err_out_cor_hists[0][
i]->Write(
"", TObject::kWriteDelete);
896 gDirectory->cd(
"..");
897 gDirectory->cd(
"theta_x");
898 err_hists[1]->Write(
"", TObject::kWriteDelete);
899 for (
int i = 0;
i < 5;
i++) {
900 err_inp_cor_hists[1][
i]->Write(
"", TObject::kWriteDelete);
901 err_out_cor_hists[1][
i]->Write(
"", TObject::kWriteDelete);
904 gDirectory->cd(
"..");
906 err_hists[2]->Write(
"", TObject::kWriteDelete);
907 for (
int i = 0;
i < 5;
i++) {
908 err_inp_cor_hists[2][
i]->Write(
"", TObject::kWriteDelete);
909 err_out_cor_hists[2][
i]->Write(
"", TObject::kWriteDelete);
912 gDirectory->cd(
"..");
913 gDirectory->cd(
"theta_y");
914 err_hists[3]->Write(
"", TObject::kWriteDelete);
915 for (
int i = 0;
i < 5;
i++) {
916 err_inp_cor_hists[3][
i]->Write(
"", TObject::kWriteDelete);
917 err_out_cor_hists[3][
i]->Write(
"", TObject::kWriteDelete);
919 gDirectory->cd(
"..");
920 gDirectory->cd(
"..");
927 edm::LogInfo(
"LHCOpticsApproximator") <<
"Covered input parameters range:" 929 for (
int i = 0;
i < 5;
i++) {
936 bool invert_beam_coord_sytems)
const 938 double in_corrected[5];
939 if (
beam == lhcb1 || !invert_beam_coord_sytems) {
940 in_corrected[0] =
in[0];
941 in_corrected[1] =
in[1];
942 in_corrected[2] =
in[2];
943 in_corrected[3] =
in[3];
944 in_corrected[4] =
in[4];
946 in_corrected[0] = -
in[0];
947 in_corrected[1] = -
in[1];
948 in_corrected[2] =
in[2];
949 in_corrected[3] =
in[3];
950 in_corrected[4] =
in[4];
953 const TVectorD *min_var = x_parametrisation.GetMinVariables();
954 const TVectorD *max_var = x_parametrisation.GetMaxVariables();
957 for (
int i = 0;
i < 5;
i++) {
958 res =
res && in_corrected[
i] >= (*min_var)(
i) && in_corrected[
i] <= (*max_var)(
i);
985 bool invert_beam_coord_sytems)
const 988 bool result = Transport(
in,
out,
false, invert_beam_coord_sytems);
990 if (
result && ap_type_ == ApertureType::RECTELLIPSE) {
992 (
out[0] *
out[0] / (r_el_x_ * r_el_x_) +
out[2] *
out[2] / (r_el_y_ * r_el_y_) < 1);
999 <<
"Linear terms of optical functions:" 1001 for (
int i = 0;
i < 4;
i++) {
1008 const std::vector<std::string> &input_vars) {
1011 double d_out_d_in[5];
1012 double d_par = 1
e-5;
1015 for (
int j = 0;
j < 5;
j++)
1020 for (
int i = 0;
i < 5;
i++) {
1021 for (
int j = 0;
j < 5;
j++)
1028 d_out_d_in[
i] = d_out_d_in[
i] / d_par;
1030 edm::LogInfo(
"LHCOpticsApproximator") << coord_name <<
" = " << bias;
1031 for (
int i = 0;
i < 5;
i++) {
1032 edm::LogInfo(
"LHCOpticsApproximator") <<
" + " << d_out_d_in[
i] <<
"*" << input_vars[
i];
1038 double atPoint[],
double &Cx,
double &Lx,
double &
vx,
double &Cy,
double &Ly,
double &
vy,
double &
D,
double ep) {
1046 for (
int i = 0;
i < 5; ++
i) {
1056 Lx = (
out[0] - Cx) /
ep;
1062 Ly = (
out[1] - Cy) /
ep;
1074 double mad_init_thx,
1076 double mad_init_thy,
1078 TMatrixD &transp_matrix,
1081 double MADX_momentum_correction_factor = 1.0 + mad_init_xi;
1082 transp_matrix.ResizeTo(2, 2);
1085 in[1] = mad_init_thx;
1087 in[3] = mad_init_thy;
1088 in[4] = mad_init_xi;
1096 double thx1 =
out[1];
1098 in[0] = mad_init_x + d_mad_x;
1102 double x2_dx =
out[0];
1103 double thx2_dx =
out[1];
1106 in[1] = mad_init_thx + d_mad_thx;
1110 double x2_dthx =
out[0];
1111 double thx2_dthx =
out[1];
1116 transp_matrix(0, 0) = (x2_dx -
x1) / d_mad_x;
1117 transp_matrix(1, 0) = (thx2_dx - thx1) / (d_mad_x * MADX_momentum_correction_factor);
1118 transp_matrix(0, 1) = MADX_momentum_correction_factor * (x2_dthx -
x1) / d_mad_thx;
1119 transp_matrix(1, 1) = (thx2_dthx - thx1) / d_mad_thx;
1124 double mad_init_thx,
1126 double mad_init_thy,
1128 TMatrixD &transp_matrix,
1131 double MADX_momentum_correction_factor = 1.0 + mad_init_xi;
1132 transp_matrix.ResizeTo(2, 2);
1135 in[1] = mad_init_thx;
1137 in[3] = mad_init_thy;
1138 in[4] = mad_init_xi;
1146 double thy1 =
out[3];
1148 in[2] = mad_init_y + d_mad_y;
1152 double y2_dy =
out[2];
1153 double thy2_dy =
out[3];
1156 in[3] = mad_init_thy + d_mad_thy;
1160 double y2_dthy =
out[2];
1161 double thy2_dthy =
out[3];
1166 transp_matrix(0, 0) = (y2_dy -
y1) / d_mad_y;
1167 transp_matrix(1, 0) = (thy2_dy - thy1) / (d_mad_y * MADX_momentum_correction_factor);
1168 transp_matrix(0, 1) = MADX_momentum_correction_factor * (y2_dthy -
y1) / d_mad_thy;
1169 transp_matrix(1, 1) = (thy2_dthy - thy1) / d_mad_thy;
1174 double mad_init_thx,
1176 double mad_init_thy,
1181 in[1] = mad_init_thx;
1183 in[3] = mad_init_thy;
1184 in[4] = mad_init_xi;
1193 in[4] = mad_init_xi + d_mad_xi;
1197 double x2_dxi =
out[0];
1198 double dispersion = (x2_dxi -
x1) / d_mad_xi;
1206 double mad_init_thx,
1208 double mad_init_thy,
1211 double MADX_momentum_correction_factor = 1.0 + mad_init_xi;
1214 in[1] = mad_init_thx;
1216 in[3] = mad_init_thy;
1217 in[4] = mad_init_xi;
1224 double thx1 =
out[1] / MADX_momentum_correction_factor;
1226 in[4] = mad_init_xi + d_mad_xi;
1230 double thx2_dxi =
out[1] / MADX_momentum_correction_factor;
1231 double dispersion = (thx2_dxi - thx1) / d_mad_xi;
void InitializeApproximators(polynomials_selection mode, int max_degree_x, int max_degree_tx, int max_degree_y, int max_degree_ty, bool common_terms)
void FillErrorDataCorHistograms(double errors[4], double var[5], TH2D *err_cor_hists[4][5])
void DeleteErrorHists(TH1D *err_hists[4])
Basic3DVector & operator=(const Basic3DVector &)=default
Assignment operator.
void TestAperture(TTree *in_tree, TTree *out_tree)
x, theta_x, y, theta_y, ksi, mad_accepted, parametriz_accepted
void SetPowerLimit(Double_t limit=1e-3)
std::vector< LHCApertureApproximator > apertures_
apertures on the way
TMultiDimFet theta_x_parametrisation
polynomial approximation for theta_x
void SetMaxPowers(const Int_t *powers)
void SetMaxTerms(Int_t terms)
double nominal_beam_momentum_
GeV/c.
bool Transport_m_GeV(double in_pos[3], double in_momentum[3], double out_pos[3], double out_momentum[3], bool check_apertures, double z2_z1_dist) const
pos, momentum: x,y,z; pos in m, momentum in GeV/c
void AllocateErrorOutputCorHists(TH2D *err_out_cor_hists[4][5])
void SetTermsManually(TMultiDimFet &approximator, VariableType variable, int max_degree, bool common_terms)
void GetLineariasedTransportMatrixY(double mad_init_x, double mad_init_thx, double mad_init_y, double mad_init_thy, double mad_init_xi, TMatrixD &tr_matrix, double d_mad_y=10e-6, double d_mad_thy=10e-6)
returns linearised transport matrix for y projection | dy_out/dy_in dy_out/dthy_in | | dthy_out/dy_in...
void AddRectEllipseAperture(const LHCOpticsApproximator &in, double rect_x, double rect_y, double r_el_x, double r_el_y)
double s_begin_
begin of transport along the reference orbit
void SetMinRelativeError(Double_t error)
double nominal_beam_energy_
GeV.
virtual Double_t Eval(const Double_t *x, const Double_t *coeff=nullptr) const
static std::string const input
virtual void SetPowers(const Int_t *powers, Int_t terms)
void SetMaxStudy(Int_t n)
bool CheckAperture(const double *in, bool invert_beam_coord_sytems=true) const
TMultiDimFet theta_y_parametrisation
polynomial approximation for theta_y
void AllocateErrorHists(TH1D *err_hists[4])
parametrization
specify parametrization (see SWGuidePATKinematicResolutions for more details)
void GetLinearApproximation(double atPoint[], double &Cx, double &Lx, double &vx, double &Cy, double &Ly, double &vy, double &D, double ep=1E-5)
bool trained_
trained polynomials
void PrintCoordinateOpticalFunctions(TMultiDimFet ¶metrization, const std::string &coord_name, const std::vector< std::string > &input_vars)
LHCApertureApproximator()
std::vector< TMultiDimFet * > out_polynomials
double GetDxds(double mad_init_x, double mad_init_thx, double mad_init_y, double mad_init_thy, double mad_init_xi, double d_mad_xi=0.001)
void Test(TTree *inp_tree, TFile *f_out, std::string data_prefix=std::string("def"), std::string base_out_dir=std::string(""))
double ParameterOutOfRangePenalty(double par_m[], bool invert_beam_coord_sytems=true) const
Class finds the parametrisation of MADX proton transport and transports the protons according to it 5...
virtual void AddRow(const Double_t *x, Double_t D, Double_t E=0)
void GetLineariasedTransportMatrixX(double mad_init_x, double mad_init_thx, double mad_init_y, double mad_init_thy, double mad_init_xi, TMatrixD &tr_matrix, double d_mad_x=10e-6, double d_mad_thx=10e-6)
returns linearised transport matrix for x projection | dx_out/dx_in dx_out/dthx_in | | dthx_out/dx_in...
void DeleteErrorCorHistograms(TH2D *err_cor_hists[4][5])
bool CheckInputRange(const double *in, bool invert_beam_coord_sytems=true) const
Log< level::Info, false > LogInfo
void SetMaxFunctions(Int_t n)
const TVectorD * GetMinVariables() const
void SetDefaultAproximatorSettings(TMultiDimFet &approximator, VariableType var_type, int max_degree)
DecomposeProduct< arg, typename Div::arg > D
double s_end_
end of transport along the reference orbit
bool Transport2D(const double *in, double *out, bool check_apertures=false, bool invert_beam_coord_sytems=true) const
bool Transport(const double *in, double *out, bool check_apertures=false, bool invert_beam_coord_sytems=true) const
void FillErrorHistograms(double errors[4], TH1D *err_hists[4])
const TVectorD * GetMaxVariables() const
double GetDx(double mad_init_x, double mad_init_thx, double mad_init_y, double mad_init_thy, double mad_init_xi, double d_mad_xi=0.001)
void PrintOpticalFunctions()
void AllocateErrorInputCorHists(TH2D *err_inp_cor_hists[4][5])
void SetMinAngle(Double_t angle=1)
ClassImp(LHCOpticsApproximator)
std::vector< std::string > coord_names
pointers to polynomials
TMultiDimFet y_parametrisation
polynomial approximation for y
TMultiDimFet x_parametrisation
polynomial approximation for x
void Train(TTree *inp_tree, std::string data_prefix=std::string("def"), polynomials_selection mode=PREDEFINED, int max_degree_x=10, int max_degree_tx=10, int max_degree_y=10, int max_degree_ty=10, bool common_terms=false, double *prec=nullptr)
void WriteHistograms(TH1D *err_hists[4], TH2D *err_inp_cor_hists[4][5], TH2D *err_out_cor_hists[4][5], TFile *f_out, std::string base_out_dir)
void SetMaxAngle(Double_t angle=0)
const LHCOpticsApproximator & operator=(const LHCOpticsApproximator &org)