CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 bool verbose = false;
14 
15 int fw_to_gt_phi_map[] = {4, 3, 2, 1, 0, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5};
16 int gt_to_fw_phi_map[] = {4, 3, 2, 1, 0, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5};
17 
18 namespace l1t{
19  unsigned int pack15bits(int pt, int eta, int phi)
20  {
21  return( ((pt & 0x3f)) + ((eta & 0xf) << 6) + ((phi & 0x1f) << 10));
22  }
23 
24  unsigned int pack16bits(int pt, int eta, int phi)
25  {
26  return( 0x8000 + ((pt & 0x3f)) + ((eta & 0xf) << 6) + ((phi & 0x1f) << 10));
27  }
28 
29  unsigned int pack16bitsEgammaSpecial(int pt, int eta, int phi)
30  {
31  return( 0x8000 + ((pt & 0x3f) << 9) + ((eta & 0xf)) + ((phi & 0x1f) << 4));
32  }
33 }
34 
35 void print2DVector(std::vector<std::vector<l1t::L1Candidate> > myVector){
36  int nrows = myVector.size();
37  int ncols = myVector[0].size();
38  std::cout << std::endl;
39  std::cout << "rows: " << nrows << std::endl;
40  std::cout << "cols: " << ncols << std::endl;
41 
42  for(int r=0; r<nrows; r++){
43  for(int c=0; c<ncols; c++){
44  std::cout << std::setw(5) << myVector[r][c].hwPt() << ' ';
45  }
46  std::cout << std::endl;
47  }
48 }
49 
50 std::vector<l1t::L1Candidate> sort_array(std::vector<l1t::L1Candidate> inputArray){
51  std::vector<l1t::L1Candidate> outputArray(inputArray.size());
52  for(unsigned int i=0; i<inputArray.size(); i++){
53  int rank=0;
54  for(unsigned int j=0; j<inputArray.size(); j++){
55  if( (inputArray[i].hwPt() > inputArray[j].hwPt()) || ( (inputArray[i].hwPt() == inputArray[j].hwPt()) && i<j) ) rank++;
56  }//j
57  outputArray[outputArray.size()-1-rank] = inputArray[i];
58  }//i
59  return outputArray;
60 }
61 
62 std::vector<std::vector<l1t::L1Candidate> > presort(std::vector<std::vector<l1t::L1Candidate> > energies, int rows, int cols){
63 
64  int row_block_length = energies.size() / cols;
65  if(energies.size() % cols != 0) row_block_length++;
66 
67  l1t::L1Candidate dummyJet;
68  dummyJet.setHwPt(0);
69  dummyJet.setHwPhi(99);
70  dummyJet.setHwEta(99);
71  dummyJet.setHwQual(0x10);
72  std::vector<std::vector<l1t::L1Candidate> > sorted_energies (rows, std::vector<l1t::L1Candidate>(cols, dummyJet));
73  if(verbose) print2DVector( sorted_energies );
74 
75  unsigned int row=0, col=0;
76  std::vector<l1t::L1Candidate> energy_feeder (cols, dummyJet);
77  std::vector<l1t::L1Candidate> energy_result (cols, dummyJet);
78  for(int r=0; r<rows; r++){
79  for(int c=0; c<cols; c++){
80 
81  row = (r % row_block_length)*cols+c;//row goes up to 19 and we pad with zeros
82 
83  if(row < energies.size()){
84  energy_feeder[c] = energies[row][col];
85  }
86  else{
87  energy_feeder[c] = dummyJet;
88  }
89 
90  }//c
91 
92  energy_result = sort_array(energy_feeder);//sort!
93 
94  sorted_energies[r] = energy_result;
95 
96  if(r % row_block_length == row_block_length - 1) col++;
97 
98  }//r
99  if(verbose) print2DVector( sorted_energies );
100 
101  return sorted_energies;
102 }
103 
104 std::vector<std::vector<l1t::L1Candidate> > extract_sub_jet_energy_position_matrix(std::vector<std::vector<l1t::L1Candidate> > input_matrix, unsigned int row_i, unsigned int row_f, unsigned int col_i, unsigned int col_f){
105  std::vector<std::vector<l1t::L1Candidate> > output_matrix(row_f-row_i+1,std::vector<l1t::L1Candidate>(col_f-col_i+1));
106  l1t::L1Candidate dummyJet;
107  dummyJet.setHwPt(0);
108  dummyJet.setHwPhi(99);
109  dummyJet.setHwEta(99);
110  dummyJet.setHwQual(0x10);
111  for(unsigned int i=0; i<row_f-row_i+1; i++){
112  for(unsigned int j=0; j<col_f-col_i+1; j++){
113  if(row_i+i > input_matrix.size()-1) output_matrix[i][j] = dummyJet;
114  else output_matrix[i][j] = input_matrix[row_i+i][col_i+j];
115  }//j
116  }//i
117  return output_matrix;
118 }
119 
120 std::vector<std::vector<l1t::L1Candidate> > sort_matrix_rows(std::vector<std::vector<l1t::L1Candidate> > input_matrix){
121  std::vector<std::vector<l1t::L1Candidate> > output_matrix( input_matrix.size(), std::vector<l1t::L1Candidate> (input_matrix[0].size()));
122 
123  for(unsigned int i=0; i<input_matrix.size(); i++){
124  int rank=0;
125  for (unsigned int j=0; j<input_matrix.size(); j++){
126  if( (input_matrix[i][0].hwPt() > input_matrix[j][0].hwPt()) || ((input_matrix[i][0].hwPt() == input_matrix[j][0].hwPt()) && i<j)) rank++;
127  }//j
128  output_matrix[input_matrix.size()-1-rank] = input_matrix[i];
129  }//i
130 
131  return output_matrix;
132 }
133 
134 std::vector<std::vector<l1t::L1Candidate> > sort_by_row_in_groups(std::vector<std::vector<l1t::L1Candidate> > input_matrix, int group_size){
135  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
136  //std::vector<std::vector<l1t::L1Candidate> > output_matrix(input_matrix.size()+(input_matrix.size() % group_size), std::vector<l1t::L1Candidate> (input_matrix[0].size()));
137  std::vector<std::vector<l1t::L1Candidate> > output_matrix(input_matrix.size()
138  +(group_size*(1 - ((input_matrix.size()/group_size)*group_size)/input_matrix.size()))
139  -(input_matrix.size() % group_size), std::vector<l1t::L1Candidate> (input_matrix[0].size()));
140 
141  for(int g=0; g<n_groups; g++){
142  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 );
143  small_output_matrix = sort_matrix_rows(small_output_matrix);
144 
145  for(unsigned int i=0; i<small_output_matrix.size(); i++){
146  output_matrix[g*group_size+i]=small_output_matrix[i];
147  }
148  }
149 
150  if(verbose) print2DVector( output_matrix );
151  return output_matrix;
152 }
153 
154 std::vector<l1t::L1Candidate> array_from_row_sorted_matrix(std::vector<std::vector<l1t::L1Candidate> > input_matrix, unsigned int n_keep){
155  std::vector<l1t::L1Candidate> output_array (n_keep*(n_keep+1)/2);
156  unsigned int max_row = n_keep-1;
157  unsigned int max_col = n_keep-1;
158 
159  //compute size
160  if(input_matrix.size() < n_keep) max_row = input_matrix.size()-1;
161  if(input_matrix[0].size() < n_keep) max_col = input_matrix[0].size()-1;
162 
163  unsigned int array_position = 0;
164  for(unsigned int i=0; i<=max_row; i++){
165  for(unsigned int j=0; j<=max_col-i; j++){
166  //cout << input_matrix[i][j].hwPt() << endl;
167  output_array[array_position] = input_matrix[i][j];
168  array_position++;
169  }//j
170  }//i
171 
172  //fill rest with zeros
173  l1t::L1Candidate dummyJet;
174  dummyJet.setHwPt(0);
175  dummyJet.setHwPhi(99);
176  dummyJet.setHwEta(99);
177  dummyJet.setHwQual(0x10);
178  for(unsigned int k=array_position; k<output_array.size(); k++){
179  output_array[k]=dummyJet;
180  }
181 
182  //printVector(output_array);
183  return output_array;
184 }
185 
186 std::vector<std::vector<l1t::L1Candidate> > super_sort_matrix_rows(std::vector<std::vector<l1t::L1Candidate> > input_matrix, unsigned int group_size, unsigned int n_keep){
187  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
188  std::vector<std::vector<l1t::L1Candidate> > output_matrix(n_groups, std::vector<l1t::L1Candidate>(n_keep));
189 
190  for(unsigned int g=0; g<n_groups; g++){
191  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 );
192  std::vector<l1t::L1Candidate> unsorted_array = array_from_row_sorted_matrix(small_output_matrix, n_keep);
193  std::vector<l1t::L1Candidate> unsorted_array_without_largest (unsorted_array.size()-1);//we know first element is the biggest
194  for(unsigned int i=0; i<unsorted_array.size()-1; i++){
195  unsorted_array_without_largest[i] = unsorted_array[1+i];
196  }
197  std::vector<l1t::L1Candidate> sorted_array_without_largest = sort_array(unsorted_array_without_largest);
198 
199  std::vector<l1t::L1Candidate> sorted_array (n_keep);
200  sorted_array[0] = unsorted_array[0];
201  for(unsigned int i=0; i<n_keep-1; i++){
202  sorted_array[1+i]=sorted_array_without_largest[i];
203  }
204 
205  output_matrix[g] = sorted_array;
206  }//g
207 
208  if(verbose) print2DVector(output_matrix);
209  return output_matrix;
210 }
211 
212 std::vector<std::vector<l1t::L1Candidate> > presort_egamma(std::vector<l1t::L1Candidate> input_egamma, int rows, int cols){
213 
214  int row_block_length = input_egamma.size() / cols;
215  if(input_egamma.size() % cols != 0) row_block_length++;
216 
217  //Initialize output
218  l1t::L1Candidate dummyJet;
219  dummyJet.setHwPt(0);
220  dummyJet.setHwPhi(99);
221  dummyJet.setHwEta(99);
222  dummyJet.setHwQual(0x10);
223  std::vector<std::vector<l1t::L1Candidate> > sorted_energies (rows, std::vector<l1t::L1Candidate>(cols, dummyJet));
224  if(verbose) print2DVector( sorted_energies );
225 
226  unsigned int row=0, col=0;
227  std::vector<l1t::L1Candidate> energy_feeder (cols, dummyJet);
228  std::vector<l1t::L1Candidate> energy_result (cols, dummyJet);
229  for(int r=0; r<rows; r++){
230  for(int c=0; c<cols; c++){
231 
232  row = (r % row_block_length)*cols+c;//row goes up to 19 and we pad with zeros
233  //cout << "row, col = " << row << ", " << col << endl;
234 
235  if(row < input_egamma.size()){
236  energy_feeder[c] = input_egamma[row];
237  }
238  else{
239  energy_feeder[c] = dummyJet;
240  }
241 
242  }//c
243 
244  energy_result = sort_array(energy_feeder);//sort!
245 
246  sorted_energies[r] = energy_result;
247 
248  if(r % row_block_length == row_block_length - 1) col++;
249 
250  }//r
251  if(verbose) print2DVector( sorted_energies );
252 
253  return sorted_energies;
254 }
255 
256 
257 namespace l1t{
258  void SortJets(std::vector<l1t::Jet> * input,
259  std::vector<l1t::Jet> * output){
260  //verbose = true;
261  const int CENTRAL_ETA_SLICES = 14;
262  const int N_PHI_GROUPS = 5;
263  const int N_PRESORTED_ROWS_CENTRAL = CENTRAL_ETA_SLICES*N_PHI_GROUPS;
264  const int PRESORT_DEPTH = 4;
265  const int N_KEEP_CENTRAL = 4;
266  const int N_ETA_GROUP_SIZE_CENTRAL = 4;
267  const int N_ETA_GROUPS_CENTRAL = 4;
268 
269  const int HFM_ETA_SLICES = 4;
270  const int HFP_ETA_SLICES = 4;
271  const int N_PRESORTED_ROWS_HFM = HFM_ETA_SLICES*N_PHI_GROUPS;
272  const int N_PRESORTED_ROWS_HFP = HFP_ETA_SLICES*N_PHI_GROUPS;
273  const int N_KEEP_FORWARD = 4;
274 
275  const int cen_nrows = 18;
276  const int cen_ncols = 14;
277  const int hfm_nrows = 18, hfp_nrows = 18;
278  const int hfm_ncols = 4, hfp_ncols = 4;
279 
280  std::vector<std::vector<l1t::L1Candidate> > cen_input_energy (cen_nrows, std::vector<l1t::L1Candidate>(cen_ncols));
281  std::vector<std::vector<l1t::L1Candidate> > hfm_input_energy (hfm_nrows, std::vector<l1t::L1Candidate>(hfm_ncols));
282  std::vector<std::vector<l1t::L1Candidate> > hfp_input_energy (hfp_nrows, std::vector<l1t::L1Candidate>(hfp_ncols));
283 
284  for (std::vector<l1t::Jet>::const_iterator injet = input->begin();
285  injet != input->end(); ++injet){
286  if(injet->hwEta() >= 4 && injet->hwEta() <= 17 )
287  {
288  unsigned int myrow = gt_to_fw_phi_map[injet->hwPhi()];
289  unsigned int mycol = injet->hwEta()-4; //hardcoding is bad
290  cen_input_energy[myrow][mycol] = *injet;
291  }
292  else if(injet->hwEta() < 4)
293  {
294  unsigned int myrow = gt_to_fw_phi_map[injet->hwPhi()];
295  unsigned int mycol = injet->hwEta(); //hardcoding is bad
296  hfm_input_energy[myrow][mycol] = *injet;
297  }
298  else if(injet->hwEta() > 17)
299  {
300  unsigned int myrow = gt_to_fw_phi_map[injet->hwPhi()];
301  unsigned int mycol = injet->hwEta()-18; //hardcoding is bad
302  hfp_input_energy[myrow][mycol] = *injet;
303  }
304  else
305  edm::LogError("HardwareJetSort") << "Region out of bounds: " << injet->hwEta();
306  }
307 
308  for(int i = 0; i < cen_nrows; ++i)
309  for(int j = 0; j < cen_ncols; ++j)
310  {
311  if(cen_input_energy[i][j].hwPt() == 0)
312  {
313  cen_input_energy[i][j].setHwPhi(fw_to_gt_phi_map[i]);
314  cen_input_energy[i][j].setHwEta(4+j);
315  }
316  }
317 
318  for(int i = 0; i < hfm_nrows; ++i)
319  for(int j = 0; j < hfm_ncols; ++j)
320  {
321  if(hfm_input_energy[i][j].hwPt() == 0)
322  {
323  hfm_input_energy[i][j].setHwPhi(fw_to_gt_phi_map[i]);
324  hfm_input_energy[i][j].setHwEta(j);
325  hfm_input_energy[i][j].setHwQual(2);
326  }
327  }
328 
329  for(int i = 0; i < hfp_nrows; ++i)
330  for(int j = 0; j < hfp_ncols; ++j)
331  {
332  if(hfp_input_energy[i][j].hwPt() == 0)
333  {
334  hfp_input_energy[i][j].setHwPhi(fw_to_gt_phi_map[i]);
335  hfp_input_energy[i][j].setHwEta(j+18);
336  hfp_input_energy[i][j].setHwQual(2);
337  }
338  }
339 
340  //Each CLK is one clock
341 
342  //CLK 1
343  std::vector<std::vector<l1t::L1Candidate> > presorted_energies_matrix_sig = presort(cen_input_energy, N_PRESORTED_ROWS_CENTRAL, PRESORT_DEPTH);
344  std::vector<std::vector<l1t::L1Candidate> > hfm_presorted_energies_matrix_sig = presort(hfm_input_energy, N_PRESORTED_ROWS_HFM, PRESORT_DEPTH);
345  std::vector<std::vector<l1t::L1Candidate> > hfp_presorted_energies_matrix_sig = presort(hfp_input_energy, N_PRESORTED_ROWS_HFP, PRESORT_DEPTH);
346 
347  //CLK 2
348  std::vector<std::vector<l1t::L1Candidate> > row_presorted_energies_matrix_sig = sort_by_row_in_groups(presorted_energies_matrix_sig, N_PHI_GROUPS);
349  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);
350  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);
351 
352  //CLK 3
353  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);
354  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);
355  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);
356 
357  //CLK 4
358  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);
359  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);
360  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);
361 
362  //CLK 5
363  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);
364  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);
365  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);
366 
367  //CLK 6
368  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);
369  std::vector<std::vector<l1t::L1Candidate> > hf_merged_plus_minus_forward_energies_matrix_sig(2, std::vector<l1t::L1Candidate>(N_KEEP_FORWARD));
370  hf_merged_plus_minus_forward_energies_matrix_sig[0] = hfm_sorted_final_energies_matrix_sig[0];
371  hf_merged_plus_minus_forward_energies_matrix_sig[1] = hfp_sorted_final_energies_matrix_sig[0];
372  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);
373 
374  //CLK 7
375  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);
376  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);
377 
378  for(unsigned int i = 0; i < 4; ++i)
379  {
380  l1t::Jet *intjet = static_cast<l1t::Jet *>( &sorted_final_energies_matrix_sig[0][i] );
381  output->push_back(*intjet);
382  }
383  for(unsigned int i = 0; i < 4; ++i)
384  {
385  l1t::Jet *intjet = static_cast<l1t::Jet *>( &hf_sorted_final_merged_plus_minus_forward_energies_matrix_sig[0][i] );
386  intjet->setHwQual(intjet->hwQual() | 2);
387  output->push_back(*intjet);
388  }
389  //verbose = false;
390  }
391 
392  void SortEGammas(std::vector<l1t::EGamma> * input,
393  std::vector<l1t::EGamma> * output)
394  {
395  //Initialize
396  const int FIBER_PAIRS = 18;
397  const int N_INPUT_EGAMMAS = 4;
398  const int N_PRESORTED_ROWS_EGAMMA = 36;
399  const int PRESORT_DEPTH = 4;
400  const int N_EGAMMA_FIRST_GROUP_SIZE = 6;
401  const int N_EGAMMA_SECOND_GROUP_SIZE = 6;
402  const int N_EGAMMA_FIRST_GROUPS = 6;
403  const int N_KEEP_EGAMMA = 4;
404 
405  //Input
406  //Each egamma: RCT isolation, RCT order, phi index, eta index
407 
408  vector<l1t::L1Candidate> iso_egamma_array_p, iso_egamma_array_m; //reusing objects. should probably rename to something like "object"
409  vector<l1t::L1Candidate> noniso_egamma_array_p, noniso_egamma_array_m;
410 
411  for(int k=0; k<2*N_INPUT_EGAMMAS*FIBER_PAIRS; k++){
412  l1t::L1Candidate dummyJet;
413  dummyJet.setHwPt(0);
414  dummyJet.setHwEta(99);
415  dummyJet.setHwPhi(99);
416  dummyJet.setHwQual(0x10);
417  if(k<N_INPUT_EGAMMAS*FIBER_PAIRS){
418  iso_egamma_array_p.push_back(dummyJet);
419  noniso_egamma_array_p.push_back(dummyJet);
420  }
421  else{
422  iso_egamma_array_m.push_back(dummyJet);
423  noniso_egamma_array_m.push_back(dummyJet);
424  }
425  }
426 
427  for (std::vector<l1t::EGamma>::const_iterator ineg = input->begin();
428  ineg != input->end(); ++ineg){
429  int fiberNum = (int) floor(gt_to_fw_phi_map[ineg->hwPhi()]/2);
430  int index = ineg->hwQual();
431  bool iso = ineg->hwIso();
432  bool minus = (ineg->hwEta() < 11);
433 
434  // while waiting for firmware LUT, set all iso to true
435  //iso = true;
436 
437  if(iso && minus)
438  iso_egamma_array_m[8*fiberNum+index] = *ineg;
439  else if (iso && !minus)
440  iso_egamma_array_p[8*fiberNum+index] = *ineg;
441  else if (!iso && minus)
442  noniso_egamma_array_m[8*fiberNum+index] = *ineg;
443  else if (!iso && !minus)
444  noniso_egamma_array_p[8*fiberNum+index] = *ineg;
445 
446  }
447 
448  // std::cout << "iso_egamma_array_m" << std::endl;
449  // for(int i = 0; i < (int)iso_egamma_array_m.size(); ++i)
450  // {
451  // std::cout << iso_egamma_array_m[i].hwPt() << " "
452  // << iso_egamma_array_m[i].hwEta() << " "
453  // << iso_egamma_array_m[i].hwPhi() << std::endl;
454  // }
455 
456  // std::cout << "iso_egamma_array_p" << std::endl;
457  // for(int i = 0; i < (int)iso_egamma_array_p.size(); ++i)
458  // {
459  // std::cout << iso_egamma_array_p[i].hwPt() << " "
460  // << iso_egamma_array_p[i].hwEta() << " "
461  // << iso_egamma_array_p[i].hwPhi() << std::endl;
462  // }
463 
464  //verbose = true;
465  //1
466  std::vector<std::vector<l1t::L1Candidate> > presorted_iso_matrix_sig_p = presort_egamma(iso_egamma_array_p, N_PRESORTED_ROWS_EGAMMA/2, PRESORT_DEPTH);
467  std::vector<std::vector<l1t::L1Candidate> > presorted_iso_matrix_sig_m = presort_egamma(iso_egamma_array_m, N_PRESORTED_ROWS_EGAMMA/2, PRESORT_DEPTH);
468  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);
469  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);
470 
471  //2
472  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);
473  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);
474  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);
475  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);
476 
477  //3
478  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);
479  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);
480  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);
481  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);
482  //combine plus and minus
483  std::vector<std::vector<l1t::L1Candidate> > iso_super_sorted_energies_matrix_sig (N_EGAMMA_FIRST_GROUPS, std::vector<l1t::L1Candidate>(N_KEEP_EGAMMA) );
484  std::vector<std::vector<l1t::L1Candidate> > non_iso_super_sorted_energies_matrix_sig (N_EGAMMA_FIRST_GROUPS, std::vector<l1t::L1Candidate>(N_KEEP_EGAMMA) );
485  for(int r=0; r<N_EGAMMA_FIRST_GROUPS/2; r++){
486  iso_super_sorted_energies_matrix_sig[r] = iso_super_sorted_energies_matrix_sig_m[r];
487  iso_super_sorted_energies_matrix_sig[r+N_EGAMMA_FIRST_GROUPS/2] = iso_super_sorted_energies_matrix_sig_p[r];
488  non_iso_super_sorted_energies_matrix_sig[r] = non_iso_super_sorted_energies_matrix_sig_m[r];
489  non_iso_super_sorted_energies_matrix_sig[r+N_EGAMMA_FIRST_GROUPS/2] = non_iso_super_sorted_energies_matrix_sig_p[r];
490  }
491 
492  //4
493  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);
494  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);
495 
496  //5
497  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);
498  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);
499 
500  //Prepare output
501  std::vector<l1t::L1Candidate> sorted_iso_egammas = iso_stage2_super_sorted_matrix_sig[0];
502  std::vector<l1t::L1Candidate> sorted_noniso_egammas = non_iso_stage2_super_sorted_matrix_sig[0];
503 
504  //verbose = false;
505 
506  for(unsigned int i = 0; i < 4; ++i)
507  {
508  l1t::EGamma *ineg = static_cast<l1t::EGamma *>( &sorted_iso_egammas[i] );
509  ineg->setHwIso(1);
510  output->push_back(*ineg);
511  }
512  for(unsigned int i = 0; i < 4; ++i)
513  {
514  l1t::EGamma *ineg = static_cast<l1t::EGamma *>( &sorted_noniso_egammas[i] );
515  output->push_back(*ineg);
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  l1t::Tau *intjet = static_cast<l1t::Tau *>( &sorted_final_energies_matrix_sig[0][i] );
576  output->push_back(*intjet);
577  }
578  }
579 }
int i
Definition: DBlmapReader.cc:9
Definition: Tau.h:13
void setHwQual(int qual)
Definition: L1Candidate.cc:64
void SortTaus(std::vector< l1t::Tau > *input, std::vector< l1t::Tau > *output)
std::vector< std::vector< l1t::L1Candidate > > sort_matrix_rows(std::vector< std::vector< l1t::L1Candidate > > input_matrix)
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:43
void SortJets(std::vector< l1t::Jet > *input, std::vector< l1t::Jet > *output)
unsigned int pack16bitsEgammaSpecial(int pt, int eta, int phi)
Definition: Jet.h:13
void SortEGammas(std::vector< l1t::EGamma > *input, std::vector< l1t::EGamma > *output)
void print2DVector(std::vector< std::vector< l1t::L1Candidate > > myVector)
int fw_to_gt_phi_map[]
int j
Definition: DBlmapReader.cc:9
std::vector< std::vector< l1t::L1Candidate > > extract_sub_jet_energy_position_matrix(std::vector< std::vector< l1t::L1Candidate > > input_matrix, unsigned int row_i, unsigned int row_f, unsigned int col_i, unsigned int col_f)
int hwQual() const
Definition: L1Candidate.cc:89
unsigned int pack15bits(int pt, int eta, int phi)
void setHwPhi(int phi)
Definition: L1Candidate.cc:54
void setHwIso(int iso)
Definition: L1Candidate.cc:59
int gt_to_fw_phi_map[]
std::vector< std::vector< l1t::L1Candidate > > presort_egamma(std::vector< l1t::L1Candidate > input_egamma, int rows, int cols)
unsigned int pack16bits(int pt, int eta, int phi)
std::vector< std::vector< l1t::L1Candidate > > super_sort_matrix_rows(std::vector< std::vector< l1t::L1Candidate > > input_matrix, unsigned int group_size, unsigned int n_keep)
std::vector< l1t::L1Candidate > array_from_row_sorted_matrix(std::vector< std::vector< l1t::L1Candidate > > input_matrix, unsigned int n_keep)
std::vector< std::vector< l1t::L1Candidate > > presort(std::vector< std::vector< l1t::L1Candidate > > energies, int rows, int cols)
std::vector< l1t::L1Candidate > sort_array(std::vector< l1t::L1Candidate > inputArray)
void setHwPt(int pt)
Definition: L1Candidate.cc:44
tuple cout
Definition: gather_cfg.py:121
void setHwEta(int eta)
Definition: L1Candidate.cc:49
int col
Definition: cuy.py:1008
std::vector< std::vector< l1t::L1Candidate > > sort_by_row_in_groups(std::vector< std::vector< l1t::L1Candidate > > input_matrix, int group_size)
tuple size
Write out results.