490 FinishInitializingTemporaries * temp_ptr =
new (
buffer) FinishInitializingTemporaries;
492 FinishInitializingTemporaries & temps = *temp_ptr;
494 auto calculate_minima = [&](
float & min_dist_eta,
float & min_dist_phi,
495 const float this_eta,
const float this_phi,
496 const float gridcell_eta,
const float gridcell_phi)
498 if (this_eta >= gridcell_eta && this_eta <= gridcell_eta +
delta_eta())
500 min_dist_eta = this_eta;
504 if (this_eta < gridcell_eta)
506 min_dist_eta = gridcell_eta;
508 #if CALORECGPU_ETA_PHI_MAP_DEBUG
509 else if (this_eta <= gridcell_eta +
delta_eta())
511 printf(
"CALORECGPU ETA PHI MAP DEBUG OUTPUT: Strange things going on with eta distance (%d): %f | %f %f\n",
512 sampling_number, this_eta, gridcell_eta, gridcell_eta +
delta_eta());
517 min_dist_eta = gridcell_eta +
delta_eta();
521 if (this_phi >= gridcell_phi && this_phi <= gridcell_phi +
delta_phi())
523 min_dist_phi = this_phi;
527 const float d1 = fabsf(Helpers::angular_difference(gridcell_phi, this_phi));
528 const float d2 = fabsf(Helpers::angular_difference(gridcell_phi +
delta_phi(), this_phi));
531 min_dist_phi = gridcell_phi;
533 #if CALORECGPU_ETA_PHI_MAP_DEBUG
536 printf(
"CALORECGPU ETA PHI MAP DEBUG OUTPUT: Strange things going on with phi distance (%d): %f | %f %f\n",
537 sampling_number, this_phi, gridcell_phi, gridcell_phi +
delta_phi());
542 min_dist_phi = gridcell_phi +
delta_phi();
547 auto calculate_dist = [](
const float e_1,
const float p_1,
548 const float e_2,
const float p_2)
550 return fabsf(e_1 - e_2) + fabsf(Helpers::angular_difference(p_1, p_2));
559 const float this_eta,
560 const float this_phi,
561 const float min_dist_eta,
562 const float min_dist_phi)
566 int replace_count = 0;
568 const float new_dist_at_new_minimum = calculate_dist(this_eta, this_phi, min_dist_eta, min_dist_phi);
577 if (
cells[
i] == this_cell)
583 const float old_dist_at_new_minimum = calculate_dist(
etas[
i], phis[
i], min_dist_eta, min_dist_phi);
585 if (old_dist_at_new_minimum <= new_dist_at_new_minimum)
591 const float new_dist_at_old_minimum = calculate_dist(this_eta, this_phi, min_etas[
i], min_phis[
i]);
592 const float old_dist_at_old_minimum = calculate_dist(
etas[
i], phis[
i], min_etas[
i], min_phis[
i]);
594 if (new_dist_at_old_minimum < old_dist_at_old_minimum)
597 to_replace[replace_count] =
i;
602 while (replace_count > 0 &&
i > 0)
604 const int orig = to_replace[replace_count - 1];
609 phis [orig] = phis [
i - 1];
610 min_etas [orig] = min_etas [
i - 1];
611 min_phis [orig] = min_phis [
i - 1];
616 if (
i < 0 || (
i == 0 && replace_count > 0))
618 #if CALORECGPU_ETA_PHI_MAP_DEBUG
619 printf(
"CALORECGPU ETA PHI MAP DEBUG OUTPUT: Negative count on cell list update, somehow... (%d)\n", sampling_number);
630 min_etas [
i] = min_dist_eta;
631 min_phis [
i] = min_dist_phi;
634 #if CALORECGPU_ETA_PHI_MAP_DEBUG
637 printf(
"CALORECGPU ETA PHI MAP DEBUG OUTPUT: Warning: overfull list of overlapping cells: %d (%d)\n",
i, sampling_number);
648 const float gridcell_eta,
649 const float gridcell_phi,
653 bool updated =
false;
656 const int this_cell =
m_cells[orig_eta][orig_phi][
i];
666 float min_dist_eta = 0.f, min_dist_phi = 0.f;
668 calculate_minima(min_dist_eta, min_dist_phi, this_eta, this_phi, gridcell_eta, gridcell_phi);
670 updated = updated || update_cell_list(
cells,
etas, phis, min_etas, min_phis,
671 this_cell, this_eta, this_phi, min_dist_eta, min_dist_phi);
678 auto process_cell = [&](
const int eta,
const int phi)
680 const int phi_before = (
phi == 0 ? phi_grid - 1 :
phi - 1);
681 const int phi_after = (
phi == phi_grid - 1 ? 0 :
phi + 1);
682 const int eta_before = (
eta == 0 ||
eta == eta_grid ? -1 :
eta - 1);
683 const int eta_after = (
eta == eta_grid - 1 ||
eta == 2 * eta_grid - 1 ? -1 :
eta + 1);
685 const float this_grid_eta =
eta_value(eta);
686 const float this_grid_phi =
phi_value(phi);
692 if (temps.cells[eta][phi][
i] < 0)
700 calculate_minima(min_etas[
i], min_phis[
i], this_eta, this_phi, this_grid_eta, this_grid_phi);
705 added = added || add_possible_cells(temps.cells[eta][phi],
706 temps.etas[eta][phi], temps.phis[eta][phi],
708 this_grid_eta, this_grid_phi,
710 added = added || add_possible_cells(temps.cells[eta][phi],
711 temps.etas[eta][phi], temps.phis[eta][phi],
713 this_grid_eta, this_grid_phi,
718 added = added || add_possible_cells(temps.cells[eta][phi],
719 temps.etas[eta][phi], temps.phis[eta][phi],
721 this_grid_eta, this_grid_phi,
726 added = added || add_possible_cells(temps.cells[eta][phi],
727 temps.etas[eta][phi], temps.phis[eta][phi],
729 this_grid_eta, this_grid_phi,
737 ret = ret || temps.try_add_next_gridcell(eta, phi_before);
738 ret = ret || temps.try_add_next_gridcell(eta, phi_after);
741 ret = ret || temps.try_add_next_gridcell(eta_before, phi);
745 ret = ret || temps.try_add_next_gridcell(eta_after, phi);
752 temps.counter[0] = 0;
753 temps.counter[1] = 0;
754 temps.select =
false;
760 for (
int phi = 0;
phi < phi_grid; ++
phi)
769 const int phi_before = (
phi == 0 ? phi_grid - 1 :
phi - 1);
770 const int phi_after = (
phi == phi_grid - 1 ? 0 :
phi + 1);
771 const int eta_before = (
eta == 0 ||
eta == eta_grid ? -1 :
eta - 1);
774 temps.try_add_next_gridcell(eta, phi);
776 temps.try_add_next_gridcell(eta, phi_before);
777 temps.try_add_next_gridcell(eta, phi_after);
780 temps.try_add_next_gridcell(eta_before, phi);
784 temps.try_add_next_gridcell(eta_after, phi);
791 temps.clear_next_gridcells();
793 #if CALORECGPU_ETA_PHI_MAP_DEBUG
795 int equal_iter_counter = 0;
798 while (temps.get_counter() > 0)
800 for (
int i = 0;
i < temps.get_counter(); ++
i)
803 temps.get_gridcell(
i, eta, phi);
804 process_cell(eta, phi);
807 #if CALORECGPU_ETA_PHI_MAP_DEBUG
810 printf(
"CALORECGPU ETA PHI MAP DEBUG OUTPUT: Init %d: %d | %d %d (%d)\n",
811 sampling_number, iter_count, temps.get_counter(), temps.get_next_counter(), equal_iter_counter);
813 if (temps.get_counter() == temps.get_next_counter())
817 for (
int i = 0;
i < temps.get_counter(); ++
i)
819 count_same += (temps.get_gridcells()[
i] == temps.get_next_gridcells()[
i]);
821 if (count_same == temps.get_counter())
823 ++equal_iter_counter;
824 if (equal_iter_counter >= 4)
827 temps.clear_next_gridcells();
829 if (temps.get_counter() < 10)
831 for (
int i = 0;
i < temps.get_counter(); ++
i)
834 temps.get_gridcell(
i, eta, phi);
835 printf(
" %d %d", eta, phi);
838 if (temps.cells[eta][phi][j] < 0)
842 printf(
" (%d: %f %f)", temps.cells[eta][phi][j], temps.etas[eta][phi][j], temps.phis[eta][phi][j]);
850 equal_iter_counter = 0;
855 equal_iter_counter = 0;
859 for (
int i = 0;
i < temps.get_counter(); ++
i)
862 temps.get_gridcell(
i, eta, phi);
870 temps.clear_next_gridcells();
874 #if CALORECGPU_ETA_PHI_MAP_DEBUG
875 printf(
"CALORECGPU ETA PHI MAP DEBUG OUTPUT: Finished %d: %d (%d %d)\n",