16 constexpr int fw_to_gt_phi_map[] = {4, 3, 2, 1, 0, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5};
17 constexpr int gt_to_fw_phi_map[] = {4, 3, 2, 1, 0, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5};
23 return( ((pt & 0x3f)) + ((eta & 0xf) << 6) + ((phi & 0x1f) << 10));
28 return( 0x8000 + ((pt & 0x3f)) + ((eta & 0xf) << 6) + ((phi & 0x1f) << 10));
33 return( 0x8000 + ((pt & 0x3f) << 9) + ((eta & 0xf)) + ((phi & 0x1f) << 4));
37 void print2DVector(std::vector<std::vector<l1t::L1Candidate> >
const& myVector){
38 int nrows = myVector.size();
39 int ncols = myVector[0].size();
41 std::cout <<
"rows: " << nrows << std::endl;
42 std::cout <<
"cols: " << ncols << std::endl;
44 for(
int r=0;
r<nrows;
r++){
46 std::cout << std::setw(5) << myVector[
r][
c].hwPt() <<
' ';
52 std::vector<l1t::L1Candidate>
sort_array(std::vector<l1t::L1Candidate>
const& inputArray){
53 std::vector<l1t::L1Candidate> outputArray(inputArray.size());
54 for(
unsigned int i=0;
i<inputArray.size();
i++){
56 for(
unsigned int j=0; j<inputArray.size(); j++){
57 if( (inputArray[
i].hwPt() > inputArray[j].hwPt()) || ( (inputArray[
i].hwPt() == inputArray[j].hwPt()) &&
i<j) ) rank++;
59 outputArray[outputArray.size()-1-rank] = inputArray[
i];
64 std::vector<std::vector<l1t::L1Candidate> >
presort(std::vector<std::vector<l1t::L1Candidate> >
const& energies,
int rows,
int cols){
66 int row_block_length = energies.size() / cols;
67 if(energies.size() % cols != 0) row_block_length++;
74 std::vector<std::vector<l1t::L1Candidate> > sorted_energies (rows, std::vector<l1t::L1Candidate>(cols, dummyJet));
77 unsigned int row=0,
col=0;
78 std::vector<l1t::L1Candidate> energy_feeder (cols, dummyJet);
79 std::vector<l1t::L1Candidate> energy_result (cols, dummyJet);
81 for(
int c=0;
c<cols;
c++){
83 row = (
r % row_block_length)*cols+
c;
85 if(row < energies.size()){
86 energy_feeder[
c] = energies[row][
col];
89 energy_feeder[
c] = dummyJet;
96 sorted_energies[
r] = energy_result;
98 if(
r % row_block_length == row_block_length - 1)
col++;
103 return sorted_energies;
106 std::vector<std::vector<l1t::L1Candidate> >
extract_sub_jet_energy_position_matrix(std::vector<std::vector<l1t::L1Candidate> >
const& input_matrix,
unsigned int row_i,
unsigned int row_f,
unsigned int col_i,
unsigned int col_f){
107 std::vector<std::vector<l1t::L1Candidate> > output_matrix(row_f-row_i+1,std::vector<l1t::L1Candidate>(col_f-col_i+1));
113 for(
unsigned int i=0;
i<row_f-row_i+1;
i++){
114 for(
unsigned int j=0; j<col_f-col_i+1; j++){
115 if(row_i+
i > input_matrix.size()-1) output_matrix[
i][j] = dummyJet;
116 else output_matrix[
i][j] = input_matrix[row_i+
i][col_i+j];
119 return output_matrix;
122 std::vector<std::vector<l1t::L1Candidate> >
sort_matrix_rows(std::vector<std::vector<l1t::L1Candidate> >
const& input_matrix){
123 std::vector<std::vector<l1t::L1Candidate> > output_matrix( input_matrix.size(), std::vector<l1t::L1Candidate> (input_matrix[0].size()));
125 for(
unsigned int i=0;
i<input_matrix.size();
i++){
127 for (
unsigned int j=0; j<input_matrix.size(); j++){
128 if( (input_matrix[
i][0].hwPt() > input_matrix[j][0].hwPt()) || ((input_matrix[
i][0].hwPt() == input_matrix[j][0].hwPt()) &&
i<j)) rank++;
130 output_matrix[input_matrix.size()-1-rank] = input_matrix[
i];
133 return output_matrix;
136 std::vector<std::vector<l1t::L1Candidate> >
sort_by_row_in_groups(std::vector<std::vector<l1t::L1Candidate> >
const& input_matrix,
int group_size){
137 int n_groups = input_matrix.size()/group_size + (1 - input_matrix.size()/group_size*group_size/input_matrix.size());
139 std::vector<std::vector<l1t::L1Candidate> > output_matrix(input_matrix.size()
140 +(group_size*(1 - ((input_matrix.size()/group_size)*group_size)/input_matrix.size()))
141 -(input_matrix.size() % group_size), std::vector<l1t::L1Candidate> (input_matrix[0].
size()));
143 for(
int g=0;
g<n_groups;
g++){
147 for(
unsigned int i=0;
i<small_output_matrix.size();
i++){
148 output_matrix[
g*group_size+
i]=small_output_matrix[
i];
153 return output_matrix;
157 std::vector<l1t::L1Candidate> output_array (n_keep*(n_keep+1)/2);
158 unsigned int max_row = n_keep-1;
159 unsigned int max_col = n_keep-1;
162 if(input_matrix.size() < n_keep) max_row = input_matrix.size()-1;
163 if(input_matrix[0].
size() < n_keep) max_col = input_matrix[0].size()-1;
165 unsigned int array_position = 0;
166 for(
unsigned int i=0;
i<=max_row;
i++){
167 for(
unsigned int j=0; j<=max_col-
i; j++){
169 output_array[array_position] = input_matrix[
i][j];
180 for(
unsigned int k=array_position;
k<output_array.size();
k++){
181 output_array[
k]=dummyJet;
188 std::vector<std::vector<l1t::L1Candidate> >
super_sort_matrix_rows(std::vector<std::vector<l1t::L1Candidate> >
const& input_matrix,
unsigned int group_size,
unsigned int n_keep){
189 unsigned int n_groups = input_matrix.size()/group_size + (1 - input_matrix.size()/group_size*group_size/input_matrix.size());
190 std::vector<std::vector<l1t::L1Candidate> > output_matrix(n_groups, std::vector<l1t::L1Candidate>(n_keep));
192 for(
unsigned int g=0;
g<n_groups;
g++){
195 std::vector<l1t::L1Candidate> unsorted_array_without_largest (unsorted_array.size()-1);
196 for(
unsigned int i=0;
i<unsorted_array.size()-1;
i++){
197 unsorted_array_without_largest[
i] = unsorted_array[1+
i];
199 std::vector<l1t::L1Candidate> sorted_array_without_largest =
sort_array(unsorted_array_without_largest);
201 std::vector<l1t::L1Candidate> sorted_array (n_keep);
202 sorted_array[0] = unsorted_array[0];
203 for(
unsigned int i=0;
i<n_keep-1;
i++){
204 sorted_array[1+
i]=sorted_array_without_largest[
i];
207 output_matrix[
g] = sorted_array;
211 return output_matrix;
214 std::vector<std::vector<l1t::L1Candidate> >
presort_egamma(std::vector<l1t::L1Candidate>
const& input_egamma,
int rows,
int cols){
216 int row_block_length = input_egamma.size() / cols;
217 if(input_egamma.size() % cols != 0) row_block_length++;
225 std::vector<std::vector<l1t::L1Candidate> > sorted_energies (rows, std::vector<l1t::L1Candidate>(cols, dummyJet));
228 unsigned int row=0,
col=0;
229 std::vector<l1t::L1Candidate> energy_feeder (cols, dummyJet);
230 std::vector<l1t::L1Candidate> energy_result (cols, dummyJet);
232 for(
int c=0;
c<cols;
c++){
234 row = (
r % row_block_length)*cols+
c;
237 if(row < input_egamma.size()){
238 energy_feeder[
c] = input_egamma[row];
241 energy_feeder[
c] = dummyJet;
248 sorted_energies[
r] = energy_result;
250 if(
r % row_block_length == row_block_length - 1)
col++;
255 return sorted_energies;
261 std::vector<l1t::Jet> *
output){
263 const int CENTRAL_ETA_SLICES = 14;
264 const int N_PHI_GROUPS = 5;
265 const int N_PRESORTED_ROWS_CENTRAL = CENTRAL_ETA_SLICES*N_PHI_GROUPS;
266 const int PRESORT_DEPTH = 4;
267 const int N_KEEP_CENTRAL = 4;
268 const int N_ETA_GROUP_SIZE_CENTRAL = 4;
269 const int N_ETA_GROUPS_CENTRAL = 4;
271 const int HFM_ETA_SLICES = 4;
272 const int HFP_ETA_SLICES = 4;
273 const int N_PRESORTED_ROWS_HFM = HFM_ETA_SLICES*N_PHI_GROUPS;
274 const int N_PRESORTED_ROWS_HFP = HFP_ETA_SLICES*N_PHI_GROUPS;
275 const int N_KEEP_FORWARD = 4;
277 const int cen_nrows = 18;
278 const int cen_ncols = 14;
279 const int hfm_nrows = 18, hfp_nrows = 18;
280 const int hfm_ncols = 4, hfp_ncols = 4;
282 std::vector<std::vector<l1t::L1Candidate> > cen_input_energy (cen_nrows, std::vector<l1t::L1Candidate>(cen_ncols));
283 std::vector<std::vector<l1t::L1Candidate> > hfm_input_energy (hfm_nrows, std::vector<l1t::L1Candidate>(hfm_ncols));
284 std::vector<std::vector<l1t::L1Candidate> > hfp_input_energy (hfp_nrows, std::vector<l1t::L1Candidate>(hfp_ncols));
286 for (std::vector<l1t::Jet>::const_iterator injet = input->begin();
287 injet != input->end(); ++injet){
288 if(injet->hwEta() >= 4 && injet->hwEta() <= 17 )
290 unsigned int myrow = gt_to_fw_phi_map[injet->hwPhi()];
291 unsigned int mycol = injet->hwEta()-4;
292 cen_input_energy[myrow][mycol] = *injet;
294 else if(injet->hwEta() < 4)
296 unsigned int myrow = gt_to_fw_phi_map[injet->hwPhi()];
297 unsigned int mycol = injet->hwEta();
298 hfm_input_energy[myrow][mycol] = *injet;
300 else if(injet->hwEta() > 17)
302 unsigned int myrow = gt_to_fw_phi_map[injet->hwPhi()];
303 unsigned int mycol = injet->hwEta()-18;
304 hfp_input_energy[myrow][mycol] = *injet;
307 edm::LogError(
"HardwareJetSort") <<
"Region out of bounds: " << injet->hwEta();
310 for(
int i = 0;
i < cen_nrows; ++
i)
311 for(
int j = 0; j < cen_ncols; ++j)
313 if(cen_input_energy[
i][j].hwPt() == 0)
315 cen_input_energy[
i][j].setHwPhi(fw_to_gt_phi_map[
i]);
316 cen_input_energy[
i][j].setHwEta(4+j);
320 for(
int i = 0;
i < hfm_nrows; ++
i)
321 for(
int j = 0; j < hfm_ncols; ++j)
323 if(hfm_input_energy[
i][j].hwPt() == 0)
325 hfm_input_energy[
i][j].setHwPhi(fw_to_gt_phi_map[
i]);
326 hfm_input_energy[
i][j].setHwEta(j);
327 hfm_input_energy[
i][j].setHwQual(2);
331 for(
int i = 0;
i < hfp_nrows; ++
i)
332 for(
int j = 0; j < hfp_ncols; ++j)
334 if(hfp_input_energy[
i][j].hwPt() == 0)
336 hfp_input_energy[
i][j].setHwPhi(fw_to_gt_phi_map[
i]);
337 hfp_input_energy[
i][j].setHwEta(j+18);
338 hfp_input_energy[
i][j].setHwQual(2);
345 std::vector<std::vector<l1t::L1Candidate> > presorted_energies_matrix_sig =
presort(cen_input_energy, N_PRESORTED_ROWS_CENTRAL, PRESORT_DEPTH);
346 std::vector<std::vector<l1t::L1Candidate> > hfm_presorted_energies_matrix_sig =
presort(hfm_input_energy, N_PRESORTED_ROWS_HFM, PRESORT_DEPTH);
347 std::vector<std::vector<l1t::L1Candidate> > hfp_presorted_energies_matrix_sig =
presort(hfp_input_energy, N_PRESORTED_ROWS_HFP, PRESORT_DEPTH);
350 std::vector<std::vector<l1t::L1Candidate> > row_presorted_energies_matrix_sig =
sort_by_row_in_groups(presorted_energies_matrix_sig, N_PHI_GROUPS);
351 std::vector<std::vector<l1t::L1Candidate> > hfm_row_presorted_energies_matrix_sig =
sort_by_row_in_groups(hfm_presorted_energies_matrix_sig, N_PHI_GROUPS);
352 std::vector<std::vector<l1t::L1Candidate> > hfp_row_presorted_energies_matrix_sig =
sort_by_row_in_groups(hfp_presorted_energies_matrix_sig, N_PHI_GROUPS);
355 std::vector<std::vector<l1t::L1Candidate> > sorted_eta_slices_energies_matrix_sig =
super_sort_matrix_rows(row_presorted_energies_matrix_sig, N_PHI_GROUPS, N_KEEP_CENTRAL);
356 std::vector<std::vector<l1t::L1Candidate> > hfm_sorted_eta_slices_energies_matrix_sig =
super_sort_matrix_rows(hfm_row_presorted_energies_matrix_sig, N_PHI_GROUPS, N_KEEP_FORWARD);
357 std::vector<std::vector<l1t::L1Candidate> > hfp_sorted_eta_slices_energies_matrix_sig =
super_sort_matrix_rows(hfp_row_presorted_energies_matrix_sig, N_PHI_GROUPS, N_KEEP_FORWARD);
360 std::vector<std::vector<l1t::L1Candidate> > row_presorted_eta_slices_energies_matrix_sig =
sort_by_row_in_groups(sorted_eta_slices_energies_matrix_sig, N_ETA_GROUP_SIZE_CENTRAL);
361 std::vector<std::vector<l1t::L1Candidate> > hfm_row_presorted_eta_slices_energies_matrix_sig =
sort_by_row_in_groups(hfm_sorted_eta_slices_energies_matrix_sig, HFM_ETA_SLICES);
362 std::vector<std::vector<l1t::L1Candidate> > hfp_row_presorted_eta_slices_energies_matrix_sig =
sort_by_row_in_groups(hfp_sorted_eta_slices_energies_matrix_sig, HFP_ETA_SLICES);
365 std::vector<std::vector<l1t::L1Candidate> > sorted_eta_groups_energies_matrix_sig =
super_sort_matrix_rows(row_presorted_eta_slices_energies_matrix_sig, N_ETA_GROUP_SIZE_CENTRAL, N_KEEP_CENTRAL);
366 std::vector<std::vector<l1t::L1Candidate> > hfm_sorted_final_energies_matrix_sig =
super_sort_matrix_rows(hfm_row_presorted_eta_slices_energies_matrix_sig, HFM_ETA_SLICES, N_KEEP_FORWARD);
367 std::vector<std::vector<l1t::L1Candidate> > hfp_sorted_final_energies_matrix_sig =
super_sort_matrix_rows(hfp_row_presorted_eta_slices_energies_matrix_sig, HFP_ETA_SLICES, N_KEEP_FORWARD);
370 std::vector<std::vector<l1t::L1Candidate> > row_presorted_eta_groups_energies_matrix_sig =
sort_by_row_in_groups(sorted_eta_groups_energies_matrix_sig, N_ETA_GROUPS_CENTRAL);
371 std::vector<std::vector<l1t::L1Candidate> > hf_merged_plus_minus_forward_energies_matrix_sig(2, std::vector<l1t::L1Candidate>(N_KEEP_FORWARD));
372 hf_merged_plus_minus_forward_energies_matrix_sig[0] = hfm_sorted_final_energies_matrix_sig[0];
373 hf_merged_plus_minus_forward_energies_matrix_sig[1] = hfp_sorted_final_energies_matrix_sig[0];
374 std::vector<std::vector<l1t::L1Candidate> > hf_row_presorted_merged_plus_minus_forward_energies_matrix_sig =
sort_by_row_in_groups(hf_merged_plus_minus_forward_energies_matrix_sig, 2);
377 std::vector<std::vector<l1t::L1Candidate> > sorted_final_energies_matrix_sig =
super_sort_matrix_rows(row_presorted_eta_groups_energies_matrix_sig, N_ETA_GROUPS_CENTRAL, N_KEEP_CENTRAL);
378 std::vector<std::vector<l1t::L1Candidate> > hf_sorted_final_merged_plus_minus_forward_energies_matrix_sig =
super_sort_matrix_rows(hf_row_presorted_merged_plus_minus_forward_energies_matrix_sig, 2, N_KEEP_FORWARD);
380 for(
unsigned int i = 0;
i < 4; ++
i)
382 auto const&
tmp = sorted_final_energies_matrix_sig[0][
i];
383 output->emplace_back(
tmp.p4(),
tmp.hwPt(),
tmp.hwEta(),
tmp.hwPhi(),
tmp.hwQual() );
385 for(
unsigned int i = 0;
i < 4; ++
i)
387 auto const&
tmp = hf_sorted_final_merged_plus_minus_forward_energies_matrix_sig[0][
i];
388 output->emplace_back(
tmp.p4(),
tmp.hwPt(),
tmp.hwEta(),
tmp.hwPhi(),
tmp.hwQual() | 2 );
394 std::vector<l1t::EGamma> *
output)
397 const int FIBER_PAIRS = 18;
398 const int N_INPUT_EGAMMAS = 4;
399 const int N_PRESORTED_ROWS_EGAMMA = 36;
400 const int PRESORT_DEPTH = 4;
401 const int N_EGAMMA_FIRST_GROUP_SIZE = 6;
402 const int N_EGAMMA_SECOND_GROUP_SIZE = 6;
403 const int N_EGAMMA_FIRST_GROUPS = 6;
404 const int N_KEEP_EGAMMA = 4;
409 vector<l1t::L1Candidate> iso_egamma_array_p, iso_egamma_array_m;
410 vector<l1t::L1Candidate> noniso_egamma_array_p, noniso_egamma_array_m;
412 for(
int k=0;
k<2*N_INPUT_EGAMMAS*FIBER_PAIRS;
k++){
418 if(
k<N_INPUT_EGAMMAS*FIBER_PAIRS){
419 iso_egamma_array_p.push_back(dummyJet);
420 noniso_egamma_array_p.push_back(dummyJet);
423 iso_egamma_array_m.push_back(dummyJet);
424 noniso_egamma_array_m.push_back(dummyJet);
428 for (std::vector<l1t::EGamma>::const_iterator ineg = input->begin();
429 ineg != input->end(); ++ineg){
430 int fiberNum = (
int) floor(gt_to_fw_phi_map[ineg->hwPhi()]/2);
431 int index = ineg->hwQual();
432 bool iso = ineg->hwIso();
433 bool minus = (ineg->hwEta() < 11);
439 iso_egamma_array_m[8*fiberNum+
index] = *ineg;
440 else if (iso && !minus)
441 iso_egamma_array_p[8*fiberNum+
index] = *ineg;
442 else if (!iso && minus)
443 noniso_egamma_array_m[8*fiberNum+
index] = *ineg;
444 else if (!iso && !minus)
445 noniso_egamma_array_p[8*fiberNum+
index] = *ineg;
467 std::vector<std::vector<l1t::L1Candidate> > presorted_iso_matrix_sig_p =
presort_egamma(iso_egamma_array_p, N_PRESORTED_ROWS_EGAMMA/2, PRESORT_DEPTH);
468 std::vector<std::vector<l1t::L1Candidate> > presorted_iso_matrix_sig_m =
presort_egamma(iso_egamma_array_m, N_PRESORTED_ROWS_EGAMMA/2, PRESORT_DEPTH);
469 std::vector<std::vector<l1t::L1Candidate> > presorted_non_iso_matrix_sig_p =
presort_egamma(noniso_egamma_array_p, N_PRESORTED_ROWS_EGAMMA/2, PRESORT_DEPTH);
470 std::vector<std::vector<l1t::L1Candidate> > presorted_non_iso_matrix_sig_m =
presort_egamma(noniso_egamma_array_m, N_PRESORTED_ROWS_EGAMMA/2, PRESORT_DEPTH);
473 std::vector<std::vector<l1t::L1Candidate> > iso_row_presorted_energies_matrix_sig_p =
sort_by_row_in_groups(presorted_iso_matrix_sig_p, N_EGAMMA_FIRST_GROUP_SIZE);
474 std::vector<std::vector<l1t::L1Candidate> > iso_row_presorted_energies_matrix_sig_m =
sort_by_row_in_groups(presorted_iso_matrix_sig_m, N_EGAMMA_FIRST_GROUP_SIZE);
475 std::vector<std::vector<l1t::L1Candidate> > non_iso_row_presorted_energies_matrix_sig_p =
sort_by_row_in_groups(presorted_non_iso_matrix_sig_p, N_EGAMMA_FIRST_GROUP_SIZE);
476 std::vector<std::vector<l1t::L1Candidate> > non_iso_row_presorted_energies_matrix_sig_m =
sort_by_row_in_groups(presorted_non_iso_matrix_sig_m, N_EGAMMA_FIRST_GROUP_SIZE);
479 std::vector<std::vector<l1t::L1Candidate> > iso_super_sorted_energies_matrix_sig_p =
super_sort_matrix_rows(iso_row_presorted_energies_matrix_sig_p, N_EGAMMA_FIRST_GROUP_SIZE, N_KEEP_EGAMMA);
480 std::vector<std::vector<l1t::L1Candidate> > iso_super_sorted_energies_matrix_sig_m =
super_sort_matrix_rows(iso_row_presorted_energies_matrix_sig_m, N_EGAMMA_FIRST_GROUP_SIZE, N_KEEP_EGAMMA);
481 std::vector<std::vector<l1t::L1Candidate> > non_iso_super_sorted_energies_matrix_sig_p =
super_sort_matrix_rows(non_iso_row_presorted_energies_matrix_sig_p, N_EGAMMA_FIRST_GROUP_SIZE, N_KEEP_EGAMMA);
482 std::vector<std::vector<l1t::L1Candidate> > non_iso_super_sorted_energies_matrix_sig_m =
super_sort_matrix_rows(non_iso_row_presorted_energies_matrix_sig_m, N_EGAMMA_FIRST_GROUP_SIZE, N_KEEP_EGAMMA);
484 std::vector<std::vector<l1t::L1Candidate> > iso_super_sorted_energies_matrix_sig (N_EGAMMA_FIRST_GROUPS, std::vector<l1t::L1Candidate>(N_KEEP_EGAMMA) );
485 std::vector<std::vector<l1t::L1Candidate> > non_iso_super_sorted_energies_matrix_sig (N_EGAMMA_FIRST_GROUPS, std::vector<l1t::L1Candidate>(N_KEEP_EGAMMA) );
486 for(
int r=0;
r<N_EGAMMA_FIRST_GROUPS/2;
r++){
487 iso_super_sorted_energies_matrix_sig[
r] = iso_super_sorted_energies_matrix_sig_m[
r];
488 iso_super_sorted_energies_matrix_sig[
r+N_EGAMMA_FIRST_GROUPS/2] = iso_super_sorted_energies_matrix_sig_p[
r];
489 non_iso_super_sorted_energies_matrix_sig[
r] = non_iso_super_sorted_energies_matrix_sig_m[
r];
490 non_iso_super_sorted_energies_matrix_sig[
r+N_EGAMMA_FIRST_GROUPS/2] = non_iso_super_sorted_energies_matrix_sig_p[
r];
494 std::vector<std::vector<l1t::L1Candidate> > iso_stage2_row_sorted_matrix_sig =
sort_by_row_in_groups(iso_super_sorted_energies_matrix_sig, N_EGAMMA_SECOND_GROUP_SIZE);
495 std::vector<std::vector<l1t::L1Candidate> > non_iso_stage2_row_sorted_matrix_sig =
sort_by_row_in_groups(non_iso_super_sorted_energies_matrix_sig, N_EGAMMA_SECOND_GROUP_SIZE);
498 std::vector<std::vector<l1t::L1Candidate> > iso_stage2_super_sorted_matrix_sig =
super_sort_matrix_rows(iso_stage2_row_sorted_matrix_sig, N_EGAMMA_SECOND_GROUP_SIZE, N_KEEP_EGAMMA);
499 std::vector<std::vector<l1t::L1Candidate> > non_iso_stage2_super_sorted_matrix_sig =
super_sort_matrix_rows(non_iso_stage2_row_sorted_matrix_sig, N_EGAMMA_SECOND_GROUP_SIZE, N_KEEP_EGAMMA);
502 std::vector<l1t::L1Candidate> sorted_iso_egammas = iso_stage2_super_sorted_matrix_sig[0];
503 std::vector<l1t::L1Candidate> sorted_noniso_egammas = non_iso_stage2_super_sorted_matrix_sig[0];
507 for(
unsigned int i = 0;
i < 4; ++
i)
509 auto const&
tmp = sorted_iso_egammas[
i];
510 output->emplace_back(
tmp.p4(),
tmp.hwPt(),
tmp.hwEta(),
tmp.hwPhi(),
tmp.hwQual(), 1 );
512 for(
unsigned int i = 0;
i < 4; ++
i)
514 auto const&
tmp =sorted_noniso_egammas[
i];
515 output->emplace_back(
tmp.p4(),
tmp.hwPt(),
tmp.hwEta(),
tmp.hwPhi(),
tmp.hwQual(),
tmp.hwIso());
520 std::vector<l1t::Tau> *
output){
521 const int CENTRAL_ETA_SLICES = 14;
522 const int N_PHI_GROUPS = 5;
523 const int N_PRESORTED_ROWS_CENTRAL = CENTRAL_ETA_SLICES*N_PHI_GROUPS;
524 const int PRESORT_DEPTH = 4;
525 const int N_KEEP_CENTRAL = 4;
526 const int N_ETA_GROUP_SIZE_CENTRAL = 4;
527 const int N_ETA_GROUPS_CENTRAL = 4;
529 const int cen_nrows = 18;
530 const int cen_ncols = 14;
532 std::vector<std::vector<l1t::L1Candidate> > cen_input_energy (cen_nrows, std::vector<l1t::L1Candidate>(cen_ncols));
534 for (std::vector<l1t::Tau>::const_iterator injet = input->begin();
535 injet != input->end(); ++injet){
536 if(injet->hwEta() >= 4 && injet->hwEta() <= 17 )
538 unsigned int myrow = gt_to_fw_phi_map[injet->hwPhi()];
539 unsigned int mycol = injet->hwEta()-4;
540 cen_input_energy[myrow][mycol] = *injet;
543 edm::LogError(
"HardwareTauSort") <<
"Region out of bounds: " << injet->hwEta();
546 for(
int i = 0;
i < cen_nrows; ++
i)
547 for(
int j = 0; j < cen_ncols; ++j)
549 if(cen_input_energy[
i][j].hwPt() == 0)
551 cen_input_energy[
i][j].setHwPhi(fw_to_gt_phi_map[
i]);
552 cen_input_energy[
i][j].setHwEta(4+j);
559 std::vector<std::vector<l1t::L1Candidate> > presorted_energies_matrix_sig =
presort(cen_input_energy, N_PRESORTED_ROWS_CENTRAL, PRESORT_DEPTH);
561 std::vector<std::vector<l1t::L1Candidate> > row_presorted_energies_matrix_sig =
sort_by_row_in_groups(presorted_energies_matrix_sig, N_PHI_GROUPS);
563 std::vector<std::vector<l1t::L1Candidate> > sorted_eta_slices_energies_matrix_sig =
super_sort_matrix_rows(row_presorted_energies_matrix_sig, N_PHI_GROUPS, N_KEEP_CENTRAL);
565 std::vector<std::vector<l1t::L1Candidate> > row_presorted_eta_slices_energies_matrix_sig =
sort_by_row_in_groups(sorted_eta_slices_energies_matrix_sig, N_ETA_GROUP_SIZE_CENTRAL);
567 std::vector<std::vector<l1t::L1Candidate> > sorted_eta_groups_energies_matrix_sig =
super_sort_matrix_rows(row_presorted_eta_slices_energies_matrix_sig, N_ETA_GROUP_SIZE_CENTRAL, N_KEEP_CENTRAL);
569 std::vector<std::vector<l1t::L1Candidate> > row_presorted_eta_groups_energies_matrix_sig =
sort_by_row_in_groups(sorted_eta_groups_energies_matrix_sig, N_ETA_GROUPS_CENTRAL);
571 std::vector<std::vector<l1t::L1Candidate> > sorted_final_energies_matrix_sig =
super_sort_matrix_rows(row_presorted_eta_groups_energies_matrix_sig, N_ETA_GROUPS_CENTRAL, N_KEEP_CENTRAL);
573 for(
unsigned int i = 0;
i < 4; ++
i)
575 auto const&
tmp = sorted_final_energies_matrix_sig[0][
i];
576 output->emplace_back(
tmp.p4(),
tmp.hwPt(),
tmp.hwEta(),
tmp.hwPhi(),
tmp.hwQual(),
tmp.hwIso());
void print2DVector(std::vector< std::vector< l1t::L1Candidate > > const &myVector)
void SortTaus(std::vector< l1t::Tau > *input, std::vector< l1t::Tau > *output)
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
static std::string const input
void SortJets(std::vector< l1t::Jet > *input, std::vector< l1t::Jet > *output)
unsigned int pack16bitsEgammaSpecial(int pt, int eta, int phi)
std::vector< std::vector< l1t::L1Candidate > > sort_by_row_in_groups(std::vector< std::vector< l1t::L1Candidate > > const &input_matrix, int group_size)
void SortEGammas(std::vector< l1t::EGamma > *input, std::vector< l1t::EGamma > *output)
std::vector< l1t::L1Candidate > array_from_row_sorted_matrix(std::vector< std::vector< l1t::L1Candidate > > const &input_matrix, unsigned int n_keep)
unsigned int pack15bits(int pt, int eta, int phi)
std::vector< std::vector< l1t::L1Candidate > > presort(std::vector< std::vector< l1t::L1Candidate > > const &energies, int rows, int cols)
unsigned int pack16bits(int pt, int eta, int phi)
std::vector< l1t::L1Candidate > sort_array(std::vector< l1t::L1Candidate > const &inputArray)
std::vector< std::vector< l1t::L1Candidate > > extract_sub_jet_energy_position_matrix(std::vector< std::vector< l1t::L1Candidate > > const &input_matrix, unsigned int row_i, unsigned int row_f, unsigned int col_i, unsigned int col_f)
std::vector< std::vector< double > > tmp
std::vector< std::vector< l1t::L1Candidate > > presort_egamma(std::vector< l1t::L1Candidate > const &input_egamma, int rows, int cols)
std::vector< std::vector< l1t::L1Candidate > > sort_matrix_rows(std::vector< std::vector< l1t::L1Candidate > > const &input_matrix)
std::vector< std::vector< l1t::L1Candidate > > super_sort_matrix_rows(std::vector< std::vector< l1t::L1Candidate > > const &input_matrix, unsigned int group_size, unsigned int n_keep)