CMS 3D CMS Logo

HardwareSortingMethods.cc
Go to the documentation of this file.
1 // HardwareSortingMethods.cc
2 // Authors: R. Alex Barbieri
3 // Ben Kreis
4 //
5 // This file should contain the C++ equivalents of the sorting
6 // algorithms used in Hardware. Most C++ methods originally written by
7 // Ben Kreis.
8 
9 #include <iostream>
12 
13 namespace {
14 constexpr bool verbose = false;
15 
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};
18 }
19 
20 namespace l1t{
21  unsigned int pack15bits(int pt, int eta, int phi)
22  {
23  return( ((pt & 0x3f)) + ((eta & 0xf) << 6) + ((phi & 0x1f) << 10));
24  }
25 
26  unsigned int pack16bits(int pt, int eta, int phi)
27  {
28  return( 0x8000 + ((pt & 0x3f)) + ((eta & 0xf) << 6) + ((phi & 0x1f) << 10));
29  }
30 
31  unsigned int pack16bitsEgammaSpecial(int pt, int eta, int phi)
32  {
33  return( 0x8000 + ((pt & 0x3f) << 9) + ((eta & 0xf)) + ((phi & 0x1f) << 4));
34  }
35 }
36 
37 void print2DVector(std::vector<std::vector<l1t::L1Candidate> > const& myVector){
38  int nrows = myVector.size();
39  int ncols = myVector[0].size();
40  std::cout << std::endl;
41  std::cout << "rows: " << nrows << std::endl;
42  std::cout << "cols: " << ncols << std::endl;
43 
44  for(int r=0; r<nrows; r++){
45  for(int c=0; c<ncols; c++){
46  std::cout << std::setw(5) << myVector[r][c].hwPt() << ' ';
47  }
48  std::cout << std::endl;
49  }
50 }
51 
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++){
55  int rank=0;
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++;
58  }//j
59  outputArray[outputArray.size()-1-rank] = inputArray[i];
60  }//i
61  return outputArray;
62 }
63 
64 std::vector<std::vector<l1t::L1Candidate> > presort(std::vector<std::vector<l1t::L1Candidate> > const& energies, int rows, int cols){
65 
66  int row_block_length = energies.size() / cols;
67  if(energies.size() % cols != 0) row_block_length++;
68 
69  l1t::L1Candidate dummyJet;
70  dummyJet.setHwPt(0);
71  dummyJet.setHwPhi(99);
72  dummyJet.setHwEta(99);
73  dummyJet.setHwQual(0x10);
74  std::vector<std::vector<l1t::L1Candidate> > sorted_energies (rows, std::vector<l1t::L1Candidate>(cols, dummyJet));
75  if(verbose) print2DVector( sorted_energies );
76 
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);
80  for(int r=0; r<rows; r++){
81  for(int c=0; c<cols; c++){
82 
83  row = (r % row_block_length)*cols+c;//row goes up to 19 and we pad with zeros
84 
85  if(row < energies.size()){
86  energy_feeder[c] = energies[row][col];
87  }
88  else{
89  energy_feeder[c] = dummyJet;
90  }
91 
92  }//c
93 
94  energy_result = sort_array(energy_feeder);//sort!
95 
96  sorted_energies[r] = energy_result;
97 
98  if(r % row_block_length == row_block_length - 1) col++;
99 
100  }//r
101  if(verbose) print2DVector( sorted_energies );
102 
103  return sorted_energies;
104 }
105 
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));
108  l1t::L1Candidate dummyJet;
109  dummyJet.setHwPt(0);
110  dummyJet.setHwPhi(99);
111  dummyJet.setHwEta(99);
112  dummyJet.setHwQual(0x10);
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];
117  }//j
118  }//i
119  return output_matrix;
120 }
121 
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()));
124 
125  for(unsigned int i=0; i<input_matrix.size(); i++){
126  int rank=0;
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++;
129  }//j
130  output_matrix[input_matrix.size()-1-rank] = input_matrix[i];
131  }//i
132 
133  return output_matrix;
134 }
135 
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()); //constants must make this an integer
138  //std::vector<std::vector<l1t::L1Candidate> > output_matrix(input_matrix.size()+(input_matrix.size() % group_size), std::vector<l1t::L1Candidate> (input_matrix[0].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()));
142 
143  for(int g=0; g<n_groups; g++){
144  std::vector<std::vector<l1t::L1Candidate> > small_output_matrix = extract_sub_jet_energy_position_matrix(input_matrix, g*group_size, (g+1)*group_size-1, 0, input_matrix[0].size()-1 );
145  small_output_matrix = sort_matrix_rows(small_output_matrix);
146 
147  for(unsigned int i=0; i<small_output_matrix.size(); i++){
148  output_matrix[g*group_size+i]=small_output_matrix[i];
149  }
150  }
151 
152  if(verbose) print2DVector( output_matrix );
153  return output_matrix;
154 }
155 
156 std::vector<l1t::L1Candidate> array_from_row_sorted_matrix(std::vector<std::vector<l1t::L1Candidate> > const& input_matrix, unsigned int n_keep){
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;
160 
161  //compute size
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;
164 
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++){
168  //cout << input_matrix[i][j].hwPt() << endl;
169  output_array[array_position] = input_matrix[i][j];
170  array_position++;
171  }//j
172  }//i
173 
174  //fill rest with zeros
175  l1t::L1Candidate dummyJet;
176  dummyJet.setHwPt(0);
177  dummyJet.setHwPhi(99);
178  dummyJet.setHwEta(99);
179  dummyJet.setHwQual(0x10);
180  for(unsigned int k=array_position; k<output_array.size(); k++){
181  output_array[k]=dummyJet;
182  }
183 
184  //printVector(output_array);
185  return output_array;
186 }
187 
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()); //constants must make this an integer
190  std::vector<std::vector<l1t::L1Candidate> > output_matrix(n_groups, std::vector<l1t::L1Candidate>(n_keep));
191 
192  for(unsigned int g=0; g<n_groups; g++){
193  std::vector<std::vector<l1t::L1Candidate> > small_output_matrix = extract_sub_jet_energy_position_matrix(input_matrix, g*group_size, (g+1)*group_size-1, 0, input_matrix[0].size()-1 );
194  std::vector<l1t::L1Candidate> unsorted_array = array_from_row_sorted_matrix(small_output_matrix, n_keep);
195  std::vector<l1t::L1Candidate> unsorted_array_without_largest (unsorted_array.size()-1);//we know first element is the biggest
196  for(unsigned int i=0; i<unsorted_array.size()-1; i++){
197  unsorted_array_without_largest[i] = unsorted_array[1+i];
198  }
199  std::vector<l1t::L1Candidate> sorted_array_without_largest = sort_array(unsorted_array_without_largest);
200 
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];
205  }
206 
207  output_matrix[g] = sorted_array;
208  }//g
209 
210  if(verbose) print2DVector(output_matrix);
211  return output_matrix;
212 }
213 
214 std::vector<std::vector<l1t::L1Candidate> > presort_egamma(std::vector<l1t::L1Candidate> const& input_egamma, int rows, int cols){
215 
216  int row_block_length = input_egamma.size() / cols;
217  if(input_egamma.size() % cols != 0) row_block_length++;
218 
219  //Initialize output
220  l1t::L1Candidate dummyJet;
221  dummyJet.setHwPt(0);
222  dummyJet.setHwPhi(99);
223  dummyJet.setHwEta(99);
224  dummyJet.setHwQual(0x10);
225  std::vector<std::vector<l1t::L1Candidate> > sorted_energies (rows, std::vector<l1t::L1Candidate>(cols, dummyJet));
226  if(verbose) print2DVector( sorted_energies );
227 
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);
231  for(int r=0; r<rows; r++){
232  for(int c=0; c<cols; c++){
233 
234  row = (r % row_block_length)*cols+c;//row goes up to 19 and we pad with zeros
235  //cout << "row, col = " << row << ", " << col << endl;
236 
237  if(row < input_egamma.size()){
238  energy_feeder[c] = input_egamma[row];
239  }
240  else{
241  energy_feeder[c] = dummyJet;
242  }
243 
244  }//c
245 
246  energy_result = sort_array(energy_feeder);//sort!
247 
248  sorted_energies[r] = energy_result;
249 
250  if(r % row_block_length == row_block_length - 1) col++;
251 
252  }//r
253  if(verbose) print2DVector( sorted_energies );
254 
255  return sorted_energies;
256 }
257 
258 
259 namespace l1t{
260  void SortJets(std::vector<l1t::Jet> * input,
261  std::vector<l1t::Jet> * output){
262  //verbose = true;
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;
270 
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;
276 
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;
281 
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));
285 
286  for (std::vector<l1t::Jet>::const_iterator injet = input->begin();
287  injet != input->end(); ++injet){
288  if(injet->hwEta() >= 4 && injet->hwEta() <= 17 )
289  {
290  unsigned int myrow = gt_to_fw_phi_map[injet->hwPhi()];
291  unsigned int mycol = injet->hwEta()-4; //hardcoding is bad
292  cen_input_energy[myrow][mycol] = *injet;
293  }
294  else if(injet->hwEta() < 4)
295  {
296  unsigned int myrow = gt_to_fw_phi_map[injet->hwPhi()];
297  unsigned int mycol = injet->hwEta(); //hardcoding is bad
298  hfm_input_energy[myrow][mycol] = *injet;
299  }
300  else if(injet->hwEta() > 17)
301  {
302  unsigned int myrow = gt_to_fw_phi_map[injet->hwPhi()];
303  unsigned int mycol = injet->hwEta()-18; //hardcoding is bad
304  hfp_input_energy[myrow][mycol] = *injet;
305  }
306  else
307  edm::LogError("HardwareJetSort") << "Region out of bounds: " << injet->hwEta();
308  }
309 
310  for(int i = 0; i < cen_nrows; ++i)
311  for(int j = 0; j < cen_ncols; ++j)
312  {
313  if(cen_input_energy[i][j].hwPt() == 0)
314  {
315  cen_input_energy[i][j].setHwPhi(fw_to_gt_phi_map[i]);
316  cen_input_energy[i][j].setHwEta(4+j);
317  }
318  }
319 
320  for(int i = 0; i < hfm_nrows; ++i)
321  for(int j = 0; j < hfm_ncols; ++j)
322  {
323  if(hfm_input_energy[i][j].hwPt() == 0)
324  {
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);
328  }
329  }
330 
331  for(int i = 0; i < hfp_nrows; ++i)
332  for(int j = 0; j < hfp_ncols; ++j)
333  {
334  if(hfp_input_energy[i][j].hwPt() == 0)
335  {
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);
339  }
340  }
341 
342  //Each CLK is one clock
343 
344  //CLK 1
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);
348 
349  //CLK 2
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);
353 
354  //CLK 3
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);
358 
359  //CLK 4
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);
363 
364  //CLK 5
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);
368 
369  //CLK 6
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);
375 
376  //CLK 7
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);
379 
380  for(unsigned int i = 0; i < 4; ++i)
381  {
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() );
384  }
385  for(unsigned int i = 0; i < 4; ++i)
386  {
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 );
389  }
390  //verbose = false;
391  }
392 
393  void SortEGammas(std::vector<l1t::EGamma> * input,
394  std::vector<l1t::EGamma> * output)
395  {
396  //Initialize
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;
405 
406  //Input
407  //Each egamma: RCT isolation, RCT order, phi index, eta index
408 
409  vector<l1t::L1Candidate> iso_egamma_array_p, iso_egamma_array_m; //reusing objects. should probably rename to something like "object"
410  vector<l1t::L1Candidate> noniso_egamma_array_p, noniso_egamma_array_m;
411 
412  for(int k=0; k<2*N_INPUT_EGAMMAS*FIBER_PAIRS; k++){
413  l1t::L1Candidate dummyJet;
414  dummyJet.setHwPt(0);
415  dummyJet.setHwEta(99);
416  dummyJet.setHwPhi(99);
417  dummyJet.setHwQual(0x10);
418  if(k<N_INPUT_EGAMMAS*FIBER_PAIRS){
419  iso_egamma_array_p.push_back(dummyJet);
420  noniso_egamma_array_p.push_back(dummyJet);
421  }
422  else{
423  iso_egamma_array_m.push_back(dummyJet);
424  noniso_egamma_array_m.push_back(dummyJet);
425  }
426  }
427 
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);
434 
435  // while waiting for firmware LUT, set all iso to true
436  //iso = true;
437 
438  if(iso && minus)
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;
446 
447  }
448 
449  // std::cout << "iso_egamma_array_m" << std::endl;
450  // for(int i = 0; i < (int)iso_egamma_array_m.size(); ++i)
451  // {
452  // std::cout << iso_egamma_array_m[i].hwPt() << " "
453  // << iso_egamma_array_m[i].hwEta() << " "
454  // << iso_egamma_array_m[i].hwPhi() << std::endl;
455  // }
456 
457  // std::cout << "iso_egamma_array_p" << std::endl;
458  // for(int i = 0; i < (int)iso_egamma_array_p.size(); ++i)
459  // {
460  // std::cout << iso_egamma_array_p[i].hwPt() << " "
461  // << iso_egamma_array_p[i].hwEta() << " "
462  // << iso_egamma_array_p[i].hwPhi() << std::endl;
463  // }
464 
465  //verbose = true;
466  //1
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);
471 
472  //2
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);
477 
478  //3
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);
483  //combine plus and minus
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];
491  }
492 
493  //4
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);
496 
497  //5
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);
500 
501  //Prepare output
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];
504 
505  //verbose = false;
506 
507  for(unsigned int i = 0; i < 4; ++i)
508  {
509  auto const& tmp = sorted_iso_egammas[i];
510  output->emplace_back(tmp.p4(), tmp.hwPt(), tmp.hwEta(), tmp.hwPhi(), tmp.hwQual(), 1 /*Iso*/);
511  }
512  for(unsigned int i = 0; i < 4; ++i)
513  {
514  auto const& tmp =sorted_noniso_egammas[i];
515  output->emplace_back(tmp.p4(),tmp.hwPt(), tmp.hwEta(), tmp.hwPhi(), tmp.hwQual(), tmp.hwIso());
516  }
517  }
518 
519  void SortTaus(std::vector<l1t::Tau> * input,
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;
528 
529  const int cen_nrows = 18;
530  const int cen_ncols = 14;
531 
532  std::vector<std::vector<l1t::L1Candidate> > cen_input_energy (cen_nrows, std::vector<l1t::L1Candidate>(cen_ncols));
533 
534  for (std::vector<l1t::Tau>::const_iterator injet = input->begin();
535  injet != input->end(); ++injet){
536  if(injet->hwEta() >= 4 && injet->hwEta() <= 17 )
537  {
538  unsigned int myrow = gt_to_fw_phi_map[injet->hwPhi()];
539  unsigned int mycol = injet->hwEta()-4; //hardcoding is bad
540  cen_input_energy[myrow][mycol] = *injet;
541  }
542  else
543  edm::LogError("HardwareTauSort") << "Region out of bounds: " << injet->hwEta();
544  }
545 
546  for(int i = 0; i < cen_nrows; ++i)
547  for(int j = 0; j < cen_ncols; ++j)
548  {
549  if(cen_input_energy[i][j].hwPt() == 0)
550  {
551  cen_input_energy[i][j].setHwPhi(fw_to_gt_phi_map[i]);
552  cen_input_energy[i][j].setHwEta(4+j);
553  }
554  }
555 
556  //Each CLK is one clock
557 
558  //CLK 1
559  std::vector<std::vector<l1t::L1Candidate> > presorted_energies_matrix_sig = presort(cen_input_energy, N_PRESORTED_ROWS_CENTRAL, PRESORT_DEPTH);
560  //CLK 2
561  std::vector<std::vector<l1t::L1Candidate> > row_presorted_energies_matrix_sig = sort_by_row_in_groups(presorted_energies_matrix_sig, N_PHI_GROUPS);
562  //CLK 3
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);
564  //CLK 4
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);
566  //CLK 5
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);
568  //CLK 6
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);
570  //CLK 7
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);
572 
573  for(unsigned int i = 0; i < 4; ++i)
574  {
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());
577  }
578  }
579 }
size
Write out results.
void print2DVector(std::vector< std::vector< l1t::L1Candidate > > const &myVector)
void setHwQual(int qual)
Definition: L1Candidate.h:44
delete x;
Definition: CaloConfig.h:22
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
Definition: Activities.doc:4
static std::string const input
Definition: EdmProvDump.cc:48
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)
int k[5][pyjets_maxn]
unsigned int pack15bits(int pt, int eta, int phi)
void setHwPhi(int phi)
Definition: L1Candidate.h:43
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
Definition: MVATrainer.cc:100
void setHwPt(int pt)
Definition: L1Candidate.h:41
col
Definition: cuy.py:1010
void setHwEta(int eta)
Definition: L1Candidate.h:42
std::vector< std::vector< l1t::L1Candidate > > presort_egamma(std::vector< l1t::L1Candidate > const &input_egamma, int rows, int cols)
#define constexpr
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)