CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Classes | Public Member Functions | Static Public Attributes | Protected Attributes | Private Types | Private Member Functions
VoronoiAlgorithm Class Reference

#include <VoronoiAlgorithm.h>

Classes

class  particle_t
 

Public Member Functions

void clear (void)
 
size_t nedge_pseudorapidity (void) const
 
std::vector< double > particle_area (void)
 
std::vector< std::set< size_t > > particle_incident (void)
 
std::vector< double > perp_fourier (void)
 
void push_back_particle (const double perp, const double pseudorapidity, const double azimuth, const unsigned int reduced_particle_flow_id)
 
std::vector< double > subtracted_equalized_perp (void)
 
std::vector< double > subtracted_unequalized_perp (void)
 
 VoronoiAlgorithm (const double dr_max, const bool isRealData=true, const bool isCalo=false, const std::pair< double, double > equalization_threshold=std::pair< double, double >(5.0, 35.0), const bool remove_nonpositive=true)
 
 ~VoronoiAlgorithm (void)
 

Static Public Attributes

static const size_t nfourier = 5
 
static const size_t nreduced_particle_flow_id = 3
 

Protected Attributes

std::vector< bool > _active
 
std::vector< double > _cms_ecal_edge_pseudorapidity
 
std::vector< double > _cms_hcal_edge_pseudorapidity
 
std::vector< double > _edge_pseudorapidity
 
std::pair< double, double > _equalization_threshold
 
event_t _event
 
std::vector< double > _feature
 
void * _lp_environment
 
void * _lp_problem
 
std::vector< size_t > _nblock_subtract
 
size_t _ncost
 
boost::multi_array< double, 4 > * _perp_fourier
 
double _positive_bound_scale
 
double _radial_distance_square_max
 
std::vector< std::pair< size_t,
size_t > > 
_recombine
 
std::vector< std::vector
< size_t > > 
_recombine_index
 
std::vector< double > _recombine_tie
 
std::vector< std::vector
< size_t > > 
_recombine_unsigned
 
bool _remove_nonpositive
 
bool _subtracted
 
UECalibrationue
 

Private Types

typedef
CGAL::Delaunay_triangulation_2
< CGAL::Exact_predicates_inexact_constructions_kernel > 
delaunay_triangulation_t
 
typedef std::vector< particle_tevent_t
 
typedef
delaunay_triangulation_t::Point 
point_2d_t
 
typedef CGAL::Polygon_2
< CGAL::Exact_predicates_inexact_constructions_kernel > 
polygon_t
 
typedef
CGAL::Voronoi_diagram_2
< delaunay_triangulation_t,
CGAL::Delaunay_triangulation_adaptation_traits_2
< delaunay_triangulation_t >
, CGAL::Delaunay_triangulation_caching_degeneracy_removal_policy_2
< delaunay_triangulation_t > > 
voronoi_diagram_t
 

Private Member Functions

void allocate (void)
 
void deallocate (void)
 
void equalize (void)
 
void event_fourier (void)
 
void feature_extract (void)
 
void initialize_geometry (void)
 
void lp_populate (void *lp_problem)
 
void recombine_link (void)
 
void remove_nonpositive (void)
 
void subtract_if_necessary (void)
 
void subtract_momentum (void)
 
void voronoi_area_incident (void)
 

Detailed Description

Definition at line 19 of file VoronoiAlgorithm.h.

Member Typedef Documentation

typedef CGAL::Delaunay_triangulation_2< CGAL::Exact_predicates_inexact_constructions_kernel> VoronoiAlgorithm::delaunay_triangulation_t
private

Definition at line 24 of file VoronoiAlgorithm.h.

typedef std::vector<particle_t> VoronoiAlgorithm::event_t
private

Definition at line 49 of file VoronoiAlgorithm.h.

Definition at line 25 of file VoronoiAlgorithm.h.

typedef CGAL::Polygon_2< CGAL::Exact_predicates_inexact_constructions_kernel> VoronoiAlgorithm::polygon_t
private

Definition at line 60 of file VoronoiAlgorithm.h.

typedef CGAL::Voronoi_diagram_2< delaunay_triangulation_t, CGAL::Delaunay_triangulation_adaptation_traits_2< delaunay_triangulation_t>, CGAL:: Delaunay_triangulation_caching_degeneracy_removal_policy_2< delaunay_triangulation_t> > VoronoiAlgorithm::voronoi_diagram_t
private

Definition at line 57 of file VoronoiAlgorithm.h.

Constructor & Destructor Documentation

VoronoiAlgorithm::VoronoiAlgorithm ( const double  dr_max,
const bool  isRealData = true,
const bool  isCalo = false,
const std::pair< double, double >  equalization_threshold = std::pair<double, double>(5.0, 35.0),
const bool  remove_nonpositive = true 
)

Definition at line 1812 of file VoronoiAlgorithm.cc.

References _edge_pseudorapidity, allocate(), initialize_geometry(), nedge_pseudorapidity(), and ue.

1819  _equalization_threshold(equalization_threshold),
1820  _radial_distance_square_max(dr_max * dr_max),
1821  _positive_bound_scale(0.2),
1822  _subtracted(false),
1823  ue(NULL)
1824  {
1826  ue = new UECalibration(isRealData, isCalo);
1827  static const size_t nedge_pseudorapidity = 15 + 1;
1828  static const double edge_pseudorapidity[nedge_pseudorapidity] = {
1829  -5.191, -2.650, -2.043, -1.740, -1.479, -1.131, -0.783, -0.522, 0.522, 0.783, 1.131, 1.479, 1.740, 2.043, 2.650, 5.191
1830  };
1831 
1832  _edge_pseudorapidity = std::vector<double>(
1833  edge_pseudorapidity,
1834  edge_pseudorapidity + nedge_pseudorapidity);
1835  allocate();
1836  }
double _positive_bound_scale
void remove_nonpositive(void)
#define NULL
Definition: scimark2.h:8
std::vector< double > _edge_pseudorapidity
void initialize_geometry(void)
double _radial_distance_square_max
UECalibration * ue
std::pair< double, double > _equalization_threshold
size_t nedge_pseudorapidity(void) const
VoronoiAlgorithm::~VoronoiAlgorithm ( void  )

Definition at line 1838 of file VoronoiAlgorithm.cc.

References deallocate().

1839  {
1840  deallocate();
1841  }

Member Function Documentation

void VoronoiAlgorithm::allocate ( void  )
private

Definition at line 905 of file VoronoiAlgorithm.cc.

References _edge_pseudorapidity, _perp_fourier, nfourier, and nreduced_particle_flow_id.

Referenced by VoronoiAlgorithm().

906  {
907  _perp_fourier = new boost::multi_array<double, 4>(
908  boost::extents[_edge_pseudorapidity.size() - 1]
910  }
std::vector< double > _edge_pseudorapidity
static const size_t nreduced_particle_flow_id
static const size_t nfourier
boost::multi_array< double, 4 > * _perp_fourier
void VoronoiAlgorithm::clear ( void  )

Clears the list of unsubtracted particles

Definition at line 1865 of file VoronoiAlgorithm.cc.

References _event, and _subtracted.

Referenced by VoronoiBackgroundProducer::produce().

1866  {
1867  _event.clear();
1868  _subtracted = false;
1869  }
void VoronoiAlgorithm::deallocate ( void  )
private

Definition at line 911 of file VoronoiAlgorithm.cc.

References _perp_fourier.

Referenced by ~VoronoiAlgorithm().

912  {
913  delete _perp_fourier;
914  }
boost::multi_array< double, 4 > * _perp_fourier
void VoronoiAlgorithm::equalize ( void  )
private

Definition at line 1753 of file VoronoiAlgorithm.cc.

References _event, _lp_environment, _nblock_subtract, _ncost, _recombine, first, roll_playback::k, lp_populate(), pi, recombine_link(), edm::second(), and x.

Referenced by subtract_if_necessary().

1754  {
1755  bpmpd_problem_t lp_problem = reinterpret_cast<bpmpd_environment_t *>(_lp_environment)->problem();
1756 
1757  recombine_link();
1758  lp_populate(&lp_problem);
1759  lp_problem.optimize();
1760 
1761  int solution_status;
1762  double objective_value;
1763  std::vector<double> x;
1764  std::vector<double> pi;
1765 
1766  lp_problem.solve(solution_status, objective_value,
1767  x, pi);
1768 
1769  for (size_t k = _ncost; k < x.size(); k++) {
1770  if (_event[_recombine[k - _ncost].first].
1771  momentum_perp_subtracted < 0 &&
1773  momentum_perp_subtracted >= 0 && x[k] >= 0) {
1774  _event[_recombine[k - _ncost].first].
1775  momentum_perp_subtracted += x[k];
1776  _event[_recombine[k - _ncost].second].
1777  momentum_perp_subtracted -= x[k];
1778  }
1779  }
1780  for (size_t k = 0; k < _event.size(); k++) {
1781  if (_nblock_subtract[k] != 0 &&
1782  x[_nblock_subtract[k]] >= 0) {
1783  _event[k].momentum_perp_subtracted -=
1784  x[_nblock_subtract[k]];
1785  }
1786  }
1787  }
const Double_t pi
U second(std::pair< T, U > const &p)
void lp_populate(void *lp_problem)
std::vector< std::pair< size_t, size_t > > _recombine
std::vector< size_t > _nblock_subtract
bool first
Definition: L1TdeRCT.cc:75
Definition: DDAxes.h:10
void VoronoiAlgorithm::event_fourier ( void  )
private

Definition at line 915 of file VoronoiAlgorithm.cc.

References _edge_pseudorapidity, _event, _perp_fourier, funct::cos(), lumiContext::fill, roll_playback::k, prof2calltree::l, nfourier, and funct::sin().

Referenced by subtract_if_necessary().

916  {
917  std::fill(_perp_fourier->data(),
918  _perp_fourier->data() +
919  _perp_fourier->num_elements(),
920  0);
921 
922  for (std::vector<particle_t>::const_iterator iterator =
923  _event.begin();
924  iterator != _event.end(); iterator++) {
925  const unsigned int reduced_id =
926  iterator->reduced_particle_flow_id;
927 
928  for (size_t k = 1; k < _edge_pseudorapidity.size();
929  k++) {
930  if (iterator->momentum.Eta() >=
931  _edge_pseudorapidity[k - 1] &&
932  iterator->momentum.Eta() <
934  const double azimuth =
935  iterator->momentum.Phi();
936 
937  for (size_t l = 0; l < nfourier; l++) {
938  (*_perp_fourier)[k - 1][reduced_id]
939  [l][0] +=
940  iterator->momentum.Pt() *
941  cos(l * azimuth);
942  (*_perp_fourier)[k - 1][reduced_id]
943  [l][1] +=
944  iterator->momentum.Pt() *
945  sin(l * azimuth);
946  }
947  }
948  }
949  }
950  }
string fill
Definition: lumiContext.py:319
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
std::vector< double > _edge_pseudorapidity
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
static const size_t nfourier
boost::multi_array< double, 4 > * _perp_fourier
void VoronoiAlgorithm::feature_extract ( void  )
private

Definition at line 951 of file VoronoiAlgorithm.cc.

References _edge_pseudorapidity, _feature, j, roll_playback::k, nfourier, nreduced_particle_flow_id, pileupReCalc_HLTpaths::scale, and mathSSE::sqrt().

Referenced by subtract_if_necessary().

952  {
953  const size_t nfeature = 2 * nfourier - 1;
954 
955  _feature.resize(nfeature);
956 
957  // Scale factor to get 95% of the coefficient below 1.0
958  // (where however one order of magnitude tolerance is
959  // acceptable). This is valid for nfourier < 18 (where
960  // interference behavior with the HF geometry starts to
961  // appear)
962 
963  std::vector<double> scale(nfourier, 1.0 / 200.0);
964 
965  if (nfourier >= 1) {
966  scale[0] = 1.0 / 5400.0;
967  }
968  if (nfourier >= 2) {
969  scale[1] = 1.0 / 130.0;
970  }
971  if (nfourier >= 3) {
972  scale[2] = 1.0 / 220.0;
973  }
974 
975  const size_t index_edge_end =
976  _edge_pseudorapidity.size() - 2;
977 
978  _feature[0] = 0;
979  for (size_t j = 0; j < nreduced_particle_flow_id; j++) {
980  _feature[0] += scale[0] *
981  ((*_perp_fourier)[0 ][j][0][0] +
982  (*_perp_fourier)[index_edge_end][j][0][0]);
983  }
984 
985  for (size_t k = 1; k < nfourier; k++) {
986  _feature[2 * k - 1] = 0;
987  for (size_t j = 0; j < nreduced_particle_flow_id; j++) {
988  _feature[2 * k - 1] += scale[k] *
989  ((*_perp_fourier)[0 ][j][k][0] +
990  (*_perp_fourier)[index_edge_end][j][k][0]);
991  }
992  _feature[2 * k] = 0;
993  for (size_t j = 0; j < nreduced_particle_flow_id; j++) {
994  _feature[2 * k] += scale[k] *
995  ((*_perp_fourier)[0 ][j][k][1] +
996  (*_perp_fourier)[index_edge_end][j][k][1]);
997  }
998  }
999 
1000 
1001 #if 0
1002  const double event_plane = atan2(_feature[4], _feature[3]);
1003  const double v2 =
1004  sqrt(_feature[3] * _feature[3] +
1005  _feature[4] * _feature[4]) / _feature[0];
1006 #endif
1007  }
std::vector< double > _edge_pseudorapidity
T sqrt(T t)
Definition: SSEVec.h:48
static const size_t nreduced_particle_flow_id
static const size_t nfourier
int j
Definition: DBlmapReader.cc:9
std::vector< double > _feature
void VoronoiAlgorithm::initialize_geometry ( void  )
private

Definition at line 871 of file VoronoiAlgorithm.cc.

References _cms_ecal_edge_pseudorapidity, _cms_hcal_edge_pseudorapidity, and i.

Referenced by VoronoiAlgorithm().

872  {
873  static const size_t ncms_hcal_edge_pseudorapidity = 82 + 1;
874  static const double cms_hcal_edge_pseudorapidity[
875  ncms_hcal_edge_pseudorapidity] = {
876  -5.191, -4.889, -4.716, -4.538, -4.363, -4.191, -4.013,
877  -3.839, -3.664, -3.489, -3.314, -3.139, -2.964, -2.853,
878  -2.650, -2.500, -2.322, -2.172, -2.043, -1.930, -1.830,
879  -1.740, -1.653, -1.566, -1.479, -1.392, -1.305, -1.218,
880  -1.131, -1.044, -0.957, -0.879, -0.783, -0.696, -0.609,
881  -0.522, -0.435, -0.348, -0.261, -0.174, -0.087,
882  0.000,
883  0.087, 0.174, 0.261, 0.348, 0.435, 0.522, 0.609,
884  0.696, 0.783, 0.879, 0.957, 1.044, 1.131, 1.218,
885  1.305, 1.392, 1.479, 1.566, 1.653, 1.740, 1.830,
886  1.930, 2.043, 2.172, 2.322, 2.500, 2.650, 2.853,
887  2.964, 3.139, 3.314, 3.489, 3.664, 3.839, 4.013,
888  4.191, 4.363, 4.538, 4.716, 4.889, 5.191
889  };
890 
891  _cms_hcal_edge_pseudorapidity = std::vector<double>(
892  cms_hcal_edge_pseudorapidity,
893  cms_hcal_edge_pseudorapidity +
894  ncms_hcal_edge_pseudorapidity);
895 
896  static const size_t ncms_ecal_edge_pseudorapidity = 344 + 1;
897 
898  for (size_t i = 0; i < ncms_ecal_edge_pseudorapidity; i++) {
900  i * (2 * 2.9928 /
901  (ncms_ecal_edge_pseudorapidity - 1)) -
902  2.9928);
903  }
904  }
int i
Definition: DBlmapReader.cc:9
std::vector< double > _cms_ecal_edge_pseudorapidity
std::vector< double > _cms_hcal_edge_pseudorapidity
void VoronoiAlgorithm::lp_populate ( void *  lp_problem)
private

Definition at line 1384 of file VoronoiAlgorithm.cc.

References _active, _equalization_threshold, _event, _nblock_subtract, _ncost, _positive_bound_scale, _recombine_index, _recombine_tie, _recombine_unsigned, alignCSCRings::e, cond::serialization::equal(), i, infinity, M_PI, bookConverter::max, min(), nedge_pseudorapidity(), AlCaHLTBitMon_ParallelJobs::p, jetcorrextractor::sign(), and histoStyle::weight.

Referenced by equalize().

1385  {
1386  bpmpd_problem_t *p = reinterpret_cast<bpmpd_problem_t *>(lp_problem);
1387 
1388  // The minimax problem is transformed into the LP notation
1389  // using the cost variable trick:
1390  //
1391  // Minimize c
1392  // Subject to:
1393  // c + sum_l t_kl + n_k >= 0 for negative cells n_k
1394  // c - sum_k t_kl + p_l >= 0 for positive cells p_l
1395 
1396  // Common LP mistakes during code development and their
1397  // CPLEX errors when running CPLEX in data checking mode:
1398  //
1399  // Error 1201 (column index ... out of range): Bad column
1400  // indexing, usually index_column out of bound for the
1401  // cost variables.
1402  //
1403  // Error 1222 (duplicate entry): Forgetting to increment
1404  // index_row, or index_column out of bound for the cost
1405  // variables.
1406 
1407  p->set_objective_sense(bpmpd_problem_t::minimize);
1408 
1409  // Rows (RHS of the constraints) of the LP problem
1410 
1411  static const size_t nsector_azimuth = 12;
1412 
1413  // Approximatively 2 pi / nsector_azimuth segmentation of
1414  // the CMS HCAL granularity
1415 
1416  static const size_t ncms_hcal_edge_pseudorapidity = 19 + 1;
1417  static const double cms_hcal_edge_pseudorapidity[
1418  ncms_hcal_edge_pseudorapidity] = {
1419  -5.191, -4.538, -4.013,
1420  -3.489, -2.853, -2.322, -1.830, -1.305, -0.783, -0.261,
1421  0.261, 0.783, 1.305, 1.830, 2.322, 2.853, 3.489,
1422  4.013, 4.538, 5.191
1423  };
1424 
1425  size_t nedge_pseudorapidity;
1426  const double *edge_pseudorapidity;
1427 
1428  nedge_pseudorapidity = ncms_hcal_edge_pseudorapidity;
1429  edge_pseudorapidity = cms_hcal_edge_pseudorapidity;
1430 
1431  const size_t nsuperblock = (nedge_pseudorapidity - 2) *
1432  nsector_azimuth;
1433 
1434  size_t index_row = 0;
1435  for (size_t index_pseudorapidity = 0;
1436  index_pseudorapidity < nedge_pseudorapidity - 2;
1437  index_pseudorapidity++) {
1438  for (size_t index_azimuth = 0;
1439  index_azimuth < nsector_azimuth - 1;
1440  index_azimuth++) {
1441  const size_t index_column =
1442  index_pseudorapidity * nsector_azimuth +
1443  index_azimuth;
1444  p->push_back_row(
1445  bpmpd_problem_t::greater_equal, 0);
1446  p->push_back_coefficient(
1447  index_row, index_column, 1);
1448  p->push_back_coefficient(
1449  index_row, nsuperblock + index_column, -1);
1450  index_row++;
1451  p->push_back_row(
1452  bpmpd_problem_t::greater_equal, 0);
1453  p->push_back_coefficient(
1454  index_row, index_column, 1);
1455  p->push_back_coefficient(
1456  index_row, nsuperblock + index_column + 1, -1);
1457  index_row++;
1458  p->push_back_row(
1459  bpmpd_problem_t::greater_equal, 0);
1460  p->push_back_coefficient(
1461  index_row, index_column, 1);
1462  p->push_back_coefficient(
1463  index_row,
1464  nsuperblock + index_column + nsector_azimuth, -1);
1465  index_row++;
1466  p->push_back_row(
1467  bpmpd_problem_t::greater_equal, 0);
1468  p->push_back_coefficient(
1469  index_row, index_column, 1);
1470  p->push_back_coefficient(
1471  index_row,
1472  nsuperblock + index_column + nsector_azimuth + 1,
1473  -1);
1474  index_row++;
1475  }
1476  const size_t index_column =
1477  index_pseudorapidity * nsector_azimuth +
1478  nsector_azimuth - 1;
1479  p->push_back_row(
1480  bpmpd_problem_t::greater_equal, 0);
1481  p->push_back_coefficient(
1482  index_row, index_column, 1);
1483  p->push_back_coefficient(
1484  index_row, nsuperblock + index_column, -1);
1485  index_row++;
1486  p->push_back_row(
1487  bpmpd_problem_t::greater_equal, 0);
1488  p->push_back_coefficient(
1489  index_row, index_column, 1);
1490  p->push_back_coefficient(
1491  index_row,
1492  nsuperblock + index_column - (nsector_azimuth - 1),
1493  -1);
1494  index_row++;
1495  p->push_back_row(
1496  bpmpd_problem_t::greater_equal, 0);
1497  p->push_back_coefficient(
1498  index_row, index_column, 1);
1499  p->push_back_coefficient(
1500  index_row,
1501  nsuperblock + index_column + nsector_azimuth, -1);
1502  index_row++;
1503  p->push_back_row(
1504  bpmpd_problem_t::greater_equal, 0);
1505  p->push_back_coefficient(
1506  index_row, index_column, 1);
1507  p->push_back_coefficient(
1508  index_row,
1509  nsuperblock + index_column + nsector_azimuth -
1510  (nsector_azimuth - 1),
1511  -1);
1512  index_row++;
1513  }
1514 
1515  const size_t nstaggered_block =
1516  (nedge_pseudorapidity - 1) * nsector_azimuth;
1517  const size_t nblock = nsuperblock + 2 * nstaggered_block;
1518 
1519  _nblock_subtract = std::vector<size_t>(_event.size(), 0);
1520 
1521  std::vector<size_t>
1522  positive_index(_event.size(), _event.size());
1523  size_t positive_count = 0;
1524 
1525  for (std::vector<particle_t>::const_iterator iterator =
1526  _event.begin();
1527  iterator != _event.end(); iterator++) {
1528  if (iterator->momentum_perp_subtracted >= 0) {
1529  positive_index[iterator - _event.begin()] =
1530  positive_count;
1531  positive_count++;
1532  }
1533  }
1534 
1535  _ncost = nblock + positive_count;
1536 
1537  const double sum_unequalized_0 = _equalization_threshold.first;
1538  const double sum_unequalized_1 = (2.0 / 3.0) * _equalization_threshold.first + (1.0 / 3.0) * _equalization_threshold.second;
1539  const double sum_unequalized_2 = (1.0 / 3.0) * _equalization_threshold.first + (2.0 / 3.0) * _equalization_threshold.second;
1540  const double sum_unequalized_3 = _equalization_threshold.second;
1541 
1542  std::vector<particle_t>::const_iterator
1543  iterator_particle = _event.begin();
1544  std::vector<bool>::const_iterator iterator_active =
1545  _active.begin();
1546  std::vector<std::vector<size_t> >::const_iterator
1547  iterator_recombine_index_outer =
1548  _recombine_index.begin();
1549  std::vector<std::vector<size_t> >::const_iterator
1550  iterator_recombine_unsigned_outer =
1551  _recombine_unsigned.begin();
1552  size_t index_column_max = _ncost - 1;
1553  for (; iterator_particle != _event.end();
1554  iterator_particle++, iterator_active++,
1555  iterator_recombine_index_outer++,
1556  iterator_recombine_unsigned_outer++) {
1557  if (*iterator_active) {
1558  int index_pseudorapidity = -1;
1559 
1561  for (size_t i = 1; i < nedge_pseudorapidity; i++) {
1562  if (iterator_particle->momentum.Eta() >= edge_pseudorapidity[i - 1] &&
1563  iterator_particle->momentum.Eta() < edge_pseudorapidity[i]) {
1564  index_pseudorapidity = i - 1;
1565  }
1566  }
1567 
1568  const int index_azimuth = floor(
1569  (iterator_particle->momentum.Phi() + M_PI) *
1570  ((nsector_azimuth >> 1) / M_PI));
1571 
1572  if (index_pseudorapidity != -1) {
1573  // p_i - sum t - u = c_i
1574  // or: c_i + u + sum_t = p_i
1575  // n_i + sum t - u <= 0
1576  // or: u - sum_t >= n_i
1577 
1578  // Inequality RHS
1579  p->push_back_row(
1580  iterator_particle->momentum_perp_subtracted >= 0 ?
1582  bpmpd_problem_t::greater_equal,
1583  iterator_particle->momentum_perp_subtracted);
1584 
1585  // Energy transfer coefficients t_kl
1586  const double sign = iterator_particle->momentum_perp_subtracted >= 0 ? 1 : -1;
1587  const size_t index_column_block_subtract =
1588  nsuperblock +
1589  (nedge_pseudorapidity - 1) * nsector_azimuth +
1590  index_pseudorapidity * nsector_azimuth +
1591  index_azimuth;
1592 
1593  _nblock_subtract[iterator_particle - _event.begin()] =
1594  index_column_block_subtract;
1595 
1596  if (iterator_particle->momentum_perp_subtracted >= 0) {
1597  const size_t index_column_cost =
1598  nblock + positive_index[iterator_particle - _event.begin()];
1599 
1600  p->push_back_coefficient(
1601  index_row, index_column_cost, 1);
1602  index_column_max =
1603  std::max(index_column_max, index_column_cost);
1604  }
1605  p->push_back_coefficient(
1606  index_row, index_column_block_subtract, 1);
1607  index_column_max =
1608  std::max(index_column_max, index_column_block_subtract);
1609 
1610  for (std::vector<size_t>::const_iterator
1611  iterator_recombine_index_inner =
1612  iterator_recombine_index_outer->begin();
1613  iterator_recombine_index_inner !=
1614  iterator_recombine_index_outer->end();
1615  iterator_recombine_index_inner++) {
1616  const size_t index_column =
1617  *iterator_recombine_index_inner +
1618  _ncost;
1619 
1620  p->push_back_coefficient(
1621  index_row, index_column, sign);
1622  index_column_max =
1623  std::max(index_column_max, index_column);
1624  }
1625  index_row++;
1626 
1627  const size_t index_column_block =
1628  nsuperblock +
1629  index_pseudorapidity * nsector_azimuth +
1630  index_azimuth;
1631 
1632  // sum_R c_i - o_i >= -d
1633  // or: d + sum_R c_i >= o_i
1634  // sum_R c_i - o_i <= d
1635  // or: d - sum_R c_i >= -o_i
1636 
1637  double sum_unequalized;
1638 
1639  sum_unequalized = 0;
1640  for (std::vector<size_t>::const_iterator
1641  iterator_recombine_unsigned_inner =
1642  iterator_recombine_unsigned_outer->begin();
1643  iterator_recombine_unsigned_inner !=
1644  iterator_recombine_unsigned_outer->end();
1645  iterator_recombine_unsigned_inner++) {
1646  sum_unequalized +=
1647  _event[*iterator_recombine_unsigned_inner].momentum_perp_subtracted;
1648  }
1649  sum_unequalized = std::max(0.0, sum_unequalized);
1650 
1651  if (sum_unequalized >= sum_unequalized_3 ||
1652  (sum_unequalized >= sum_unequalized_2 &&
1653  (iterator_particle - _event.begin()) % 2 == 0) ||
1654  (sum_unequalized >= sum_unequalized_1 &&
1655  (iterator_particle - _event.begin()) % 4 == 0) ||
1656  (sum_unequalized >= sum_unequalized_0 &&
1657  (iterator_particle - _event.begin()) % 8 == 0)) {
1658 
1659  const double weight = sum_unequalized *
1660  std::min(1.0, std::max(1e-3,
1661  iterator_particle->area));
1662 
1663  if (weight > 0) {
1664  p->push_back_row(
1665  bpmpd_problem_t::greater_equal,
1666  sum_unequalized);
1667 
1668  p->push_back_coefficient(
1669  index_row, index_column_block, 1.0 / weight);
1670 
1671  for (std::vector<size_t>::const_iterator
1672  iterator_recombine_unsigned_inner =
1673  iterator_recombine_unsigned_outer->begin();
1674  iterator_recombine_unsigned_inner !=
1675  iterator_recombine_unsigned_outer->end();
1676  iterator_recombine_unsigned_inner++) {
1677  if (_event[*iterator_recombine_unsigned_inner].momentum_perp_subtracted >= 0) {
1678  const size_t index_column_cost =
1679  nblock +
1680  positive_index[*iterator_recombine_unsigned_inner];
1681 
1682  p->push_back_coefficient(
1683  index_row, index_column_cost, 1);
1684  index_column_max =
1685  std::max(index_column_max, index_column_cost);
1686  }
1687  }
1688  index_row++;
1689 
1690  p->push_back_row(
1691  bpmpd_problem_t::greater_equal,
1692  -sum_unequalized);
1693 
1694  p->push_back_coefficient(
1695  index_row, index_column_block, _positive_bound_scale / weight);
1696 
1697  for (std::vector<size_t>::const_iterator iterator_recombine_unsigned_inner = iterator_recombine_unsigned_outer->begin();
1698  iterator_recombine_unsigned_inner != iterator_recombine_unsigned_outer->end();
1699  iterator_recombine_unsigned_inner++) {
1700  if (_event[*iterator_recombine_unsigned_inner].momentum_perp_subtracted >= 0) {
1701  const size_t index_column_cost =
1702  nblock +
1703  positive_index[*iterator_recombine_unsigned_inner];
1704 
1705  p->push_back_coefficient(
1706  index_row, index_column_cost, -1);
1707  index_column_max =
1708  std::max(index_column_max, index_column_cost);
1709  }
1710  }
1711  index_row++;
1712  }
1713 
1714  }
1715 
1716  }
1717  }
1718  }
1719 
1720  // Epsilon that breaks the degeneracy, in the same units
1721  // as the pT of the event (i.e. GeV)
1722  static const double epsilon_degeneracy = 1e-2;
1723 
1724  // Columns (variables and the objective coefficients) of
1725  // the LP problem
1726  //
1727  // Cost variables (objective coefficient 1)
1728  for (size_t i = 0; i < nsuperblock; i++) {
1729  p->push_back_column(
1731  }
1732  for (size_t i = nsuperblock; i < nsuperblock + nstaggered_block; i++) {
1733  p->push_back_column(
1735  }
1736  for (size_t i = nsuperblock + nstaggered_block; i < nsuperblock + 2 * nstaggered_block; i++) {
1737  p->push_back_column(
1739  }
1740  for (size_t i = nsuperblock + 2 * nstaggered_block; i < _ncost; i++) {
1741  p->push_back_column(
1743  }
1744  //fprintf(stderr, "%s:%d: %lu %lu\n", __FILE__, __LINE__, index_column_max, recombine_tie.size());
1745  // Energy transfer coefficients t_kl (objective
1746  // coefficient 0 + epsilon)
1747  for (size_t i = _ncost; i <= index_column_max; i++) {
1748  p->push_back_column(
1749  epsilon_degeneracy * _recombine_tie[i - _ncost],
1751  }
1752  }
std::vector< bool > _active
std::vector< std::vector< size_t > > _recombine_index
int i
Definition: DBlmapReader.cc:9
double sign(double x)
double _positive_bound_scale
std::vector< double > _recombine_tie
bool equal(const T &first, const T &second)
Definition: Equal.h:34
const double infinity
std::vector< size_t > _nblock_subtract
T min(T a, T b)
Definition: MathUtil.h:58
#define M_PI
std::vector< std::vector< size_t > > _recombine_unsigned
std::pair< double, double > _equalization_threshold
size_t nedge_pseudorapidity(void) const
int weight
Definition: histoStyle.py:50
size_t VoronoiAlgorithm::nedge_pseudorapidity ( void  ) const

Definition at line 1963 of file VoronoiAlgorithm.cc.

References _edge_pseudorapidity.

Referenced by lp_populate(), and VoronoiAlgorithm().

1964  {
1965  return _edge_pseudorapidity.size();
1966  }
std::vector< double > _edge_pseudorapidity
std::vector< double > VoronoiAlgorithm::particle_area ( void  )

Returns the area in the Voronoi diagram diagram occupied by a given particle

Returns
vector of area

Definition at line 1909 of file VoronoiAlgorithm.cc.

References _event, run_regression::ret, and subtract_if_necessary().

Referenced by VoronoiBackgroundProducer::produce().

1910  {
1912 
1913  std::vector<double> ret;
1914 
1915  for (std::vector<particle_t>::const_iterator iterator =
1916  _event.begin();
1917  iterator != _event.end(); iterator++) {
1918  ret.push_back(iterator->area);
1919  }
1920 
1921  return ret;
1922  }
void subtract_if_necessary(void)
std::vector< std::set< size_t > > VoronoiAlgorithm::particle_incident ( void  )

Returns the incident particles in the Delaunay diagram (particles that has a given particle as the nearest neighbor)

Returns
vector of sets of incident particles indices, using the original indexing

Definition at line 1931 of file VoronoiAlgorithm.cc.

References _event, alignCSCRings::e, run_regression::ret, and subtract_if_necessary().

1932  {
1934 
1935  std::vector<std::set<size_t> > ret;
1936 
1937  for (std::vector<particle_t>::const_iterator
1938  iterator_outer = _event.begin();
1939  iterator_outer != _event.end(); iterator_outer++) {
1940  std::set<size_t> e;
1941 
1942  for (std::set<std::vector<particle_t>::iterator>::
1943  const_iterator iterator_inner =
1944  iterator_outer->incident.begin();
1945  iterator_inner != iterator_outer->incident.begin();
1946  iterator_inner++) {
1947  e.insert(*iterator_inner - _event.begin());
1948  }
1949  ret.push_back(e);
1950  }
1951 
1952  return ret;
1953  }
void subtract_if_necessary(void)
std::vector< double > VoronoiAlgorithm::perp_fourier ( void  )

Definition at line 1954 of file VoronoiAlgorithm.cc.

References _perp_fourier, and subtract_if_necessary().

Referenced by VoronoiBackgroundProducer::produce().

1955  {
1957 
1958  return std::vector<double>(
1959  _perp_fourier->data(),
1960  _perp_fourier->data() +
1961  _perp_fourier->num_elements());
1962  }
void subtract_if_necessary(void)
boost::multi_array< double, 4 > * _perp_fourier
void VoronoiAlgorithm::push_back_particle ( const double  perp,
const double  pseudorapidity,
const double  azimuth,
const unsigned int  reduced_particle_flow_id 
)

Add a new unsubtracted particle to the current event

Parameters
[in]perptransverse momentum
[in]pseudorapiditypseudorapidity
[in]azimuthazimuth
[in]reduced_particle_flow_idreduced particle flow ID, between 0 and 2 (inclusive)

Definition at line 1852 of file VoronoiAlgorithm.cc.

References _event, and AlCaHLTBitMon_ParallelJobs::p.

Referenced by VoronoiBackgroundProducer::produce().

1856  {
1857  math::PtEtaPhiELorentzVector p(perp, pseudorapidity, azimuth, NAN);
1858 
1859  p.SetE(p.P());
1860  _event.push_back(particle_t(p, reduced_particle_flow_id));
1861  }
PtEtaPhiELorentzVectorD PtEtaPhiELorentzVector
Lorentz vector with cartesian internal representation.
Definition: LorentzVector.h:27
T perp() const
Magnitude of transverse component.
void VoronoiAlgorithm::recombine_link ( void  )
private

Definition at line 1256 of file VoronoiAlgorithm.cc.

References _active, _event, _radial_distance_square_max, _recombine, _recombine_index, _recombine_tie, _recombine_unsigned, begin, i, j, and python.multivaluedict::sort().

Referenced by equalize().

1257  {
1258  boost::multi_array<double, 2> radial_distance_square(
1259  boost::extents[_event.size()][_event.size()]);
1260 
1261  for (std::vector<particle_t>::const_iterator
1262  iterator_outer = _event.begin();
1263  iterator_outer != _event.end(); iterator_outer++) {
1264  radial_distance_square
1265  [iterator_outer - _event.begin()]
1266  [iterator_outer - _event.begin()] = 0;
1267 
1268  for (std::vector<particle_t>::const_iterator
1269  iterator_inner = _event.begin();
1270  iterator_inner != iterator_outer;
1271  iterator_inner++) {
1272  const double deta = iterator_outer->momentum.Eta() -
1273  iterator_inner->momentum.Eta();
1274  const double dphi = angular_range_reduce(
1275  iterator_outer->momentum.Phi() -
1276  iterator_inner->momentum.Phi());
1277 
1278  radial_distance_square
1279  [iterator_outer - _event.begin()]
1280  [iterator_inner - _event.begin()] =
1281  deta * deta + dphi * dphi;
1282  radial_distance_square
1283  [iterator_inner - _event.begin()]
1284  [iterator_outer - _event.begin()] =
1285  radial_distance_square
1286  [iterator_outer - _event.begin()]
1287  [iterator_inner - _event.begin()];
1288  }
1289  }
1290 
1291  _active.clear();
1292 
1293  for (std::vector<particle_t>::const_iterator
1294  iterator_outer = _event.begin();
1295  iterator_outer != _event.end(); iterator_outer++) {
1296  double incident_area_sum = iterator_outer->area;
1297 
1298  for (std::set<std::vector<particle_t>::iterator>::
1299  const_iterator iterator_inner =
1300  iterator_outer->incident.begin();
1301  iterator_inner !=
1302  iterator_outer->incident.end();
1303  iterator_inner++) {
1304  incident_area_sum += (*iterator_inner)->area;
1305  }
1306  _active.push_back(incident_area_sum < 2.0);
1307  }
1308 
1309  _recombine.clear();
1310  _recombine_index = std::vector<std::vector<size_t> >(
1311  _event.size(), std::vector<size_t>());
1312  _recombine_unsigned = std::vector<std::vector<size_t> >(
1313  _event.size(), std::vector<size_t>());
1314  _recombine_tie.clear();
1315 
1316  // 36 cells corresponds to ~ 3 layers, note that for
1317  // hexagonal tiling, cell in proximity = 3 * layer *
1318  // (layer + 1)
1319  static const size_t npair_max = 36;
1320 
1321  for (size_t i = 0; i < _event.size(); i++) {
1322  for (size_t j = 0; j < _event.size(); j++) {
1323  const bool active_i_j = _active[i] && _active[j];
1324  const size_t incident_count =
1325  _event[i].incident.count(_event.begin() + j) +
1326  _event[j].incident.count(_event.begin() + i);
1327 
1328  if (active_i_j &&
1329  (radial_distance_square[i][j] <
1331  incident_count > 0)) {
1332  _recombine_unsigned[i].push_back(j);
1333  }
1334  }
1335 
1336  if (_event[i].momentum_perp_subtracted < 0) {
1337  std::vector<double> radial_distance_square_list;
1338 
1339  for (std::vector<size_t>::const_iterator iterator =
1341  iterator != _recombine_unsigned[i].end();
1342  iterator++) {
1343  const size_t j = *iterator;
1344 
1345  if (_event[j].momentum_perp_subtracted > 0) {
1346  radial_distance_square_list.push_back(
1347  radial_distance_square[i][j]);
1348  }
1349  }
1350 
1351  double radial_distance_square_max_equalization_cut =
1353 
1354  if (radial_distance_square_list.size() >= npair_max) {
1355  std::sort(radial_distance_square_list.begin(),
1356  radial_distance_square_list.end());
1357  radial_distance_square_max_equalization_cut =
1358  radial_distance_square_list[npair_max - 1];
1359  }
1360 
1361  for (std::vector<size_t>::const_iterator iterator =
1363  iterator != _recombine_unsigned[i].end();
1364  iterator++) {
1365  const size_t j = *iterator;
1366 
1367  if (_event[j].momentum_perp_subtracted > 0 &&
1368  radial_distance_square[i][j] <
1369  radial_distance_square_max_equalization_cut) {
1370  _recombine_index[j].push_back(
1371  _recombine.size());
1372  _recombine_index[i].push_back(
1373  _recombine.size());
1374  _recombine.push_back(
1375  std::pair<size_t, size_t>(i, j));
1376  _recombine_tie.push_back(
1377  radial_distance_square[i][j] /
1379  }
1380  }
1381  }
1382  }
1383  }
std::vector< bool > _active
std::vector< std::vector< size_t > > _recombine_index
int i
Definition: DBlmapReader.cc:9
std::vector< double > _recombine_tie
std::vector< std::pair< size_t, size_t > > _recombine
int j
Definition: DBlmapReader.cc:9
double _radial_distance_square_max
std::vector< std::vector< size_t > > _recombine_unsigned
#define begin
Definition: vmac.h:30
void VoronoiAlgorithm::remove_nonpositive ( void  )
private

Definition at line 1788 of file VoronoiAlgorithm.cc.

References _event, and bookConverter::max.

Referenced by subtract_if_necessary().

1789  {
1790  for (std::vector<particle_t>::iterator iterator =
1791  _event.begin();
1792  iterator != _event.end(); iterator++) {
1793  iterator->momentum_perp_subtracted = std::max(
1794  0.0, iterator->momentum_perp_subtracted);
1795  }
1796  }
void VoronoiAlgorithm::subtract_if_necessary ( void  )
private
void VoronoiAlgorithm::subtract_momentum ( void  )
private

Definition at line 1099 of file VoronoiAlgorithm.cc.

References _cms_ecal_edge_pseudorapidity, _cms_hcal_edge_pseudorapidity, _edge_pseudorapidity, _event, _feature, funct::cos(), j, prof2calltree::l, m, M_PI, n, nfourier, nreduced_particle_flow_id, AlCaHLTBitMon_ParallelJobs::p, funct::sin(), ue, UECalibration::ue_interpolation_pf0, UECalibration::ue_interpolation_pf1, UECalibration::ue_interpolation_pf2, and UECalibration::ue_predictor_pf.

Referenced by subtract_if_necessary().

1100  {
1101  for (std::vector<particle_t>::iterator iterator =
1102  _event.begin();
1103  iterator != _event.end(); iterator++) {
1104  int predictor_index = -1;
1105  int interpolation_index = -1;
1106  double density = 0;
1107  double pred_0 = 0;
1108 
1109  for (size_t l = 1; l < _edge_pseudorapidity.size(); l++) {
1110  if (iterator->momentum.Eta() >=
1111  _edge_pseudorapidity[l - 1] &&
1112  iterator->momentum.Eta() <
1114  predictor_index = l - 1;
1115  }
1116  }
1117 
1118  for (size_t j = 0; j < nreduced_particle_flow_id; j++) {
1119  if (j == 2) {
1120  // HCAL
1121  for (size_t l = 1;
1122  l < _cms_hcal_edge_pseudorapidity.size(); l++) {
1123  if (iterator->momentum.Eta() >=
1125  iterator->momentum.Eta() <
1127  interpolation_index = l - 1;
1128  }
1129  }
1130  }
1131  else {
1132  // Tracks or ECAL clusters
1133  for (size_t l = 1;
1134  l < _cms_ecal_edge_pseudorapidity.size(); l++) {
1135  if (iterator->momentum.Eta() >=
1137  iterator->momentum.Eta() <
1139  interpolation_index = l - 1;
1140  }
1141  }
1142  }
1143 
1144  if (predictor_index >= 0 && interpolation_index >= 0) {
1145  // Calculate the aggregated prediction and
1146  // interpolation for the pseudorapidity segment
1147 
1148  const double azimuth = iterator->momentum.Phi();
1149  const float (*p)[2][82] =
1150 #ifdef STANDALONE
1151  ue_predictor_pf[j][predictor_index]
1152 #else // STANDALONE
1153  ue->ue_predictor_pf[j][predictor_index]
1154 #endif // STANDALONE
1155  ;
1156  double pred = 0;
1157 
1158  for (size_t l = 0; l < nfourier; l++) {
1159  for (size_t m = 0; m < 2; m++) {
1160  float u = p[l][m][0];
1161 
1162  for (size_t n = 0; n < 2 * nfourier - 1; n++) {
1163  u += (((((((((p[l][m][9 * n + 9]) *
1164  _feature[n] +
1165  p[l][m][9 * n + 8]) *
1166  _feature[n] +
1167  p[l][m][9 * n + 7]) *
1168  _feature[n] +
1169  p[l][m][9 * n + 6]) *
1170  _feature[n] +
1171  p[l][m][9 * n + 5]) *
1172  _feature[n] +
1173  p[l][m][9 * n + 4]) *
1174  _feature[n] +
1175  p[l][m][9 * n + 3]) *
1176  _feature[n] +
1177  p[l][m][9 * n + 2]) *
1178  _feature[n] +
1179  p[l][m][9 * n + 1]) *
1180  _feature[n];
1181  }
1182 
1183  pred += u * (l == 0 ? 1.0 : 2.0) *
1184  (m == 0 ? cos(l * azimuth) :
1185  sin(l * azimuth));
1186  if (l == 0 && m == 0) {
1187  pred_0 += u /
1188  (2.0 * M_PI *
1189  (_edge_pseudorapidity[predictor_index + 1] -
1190  _edge_pseudorapidity[predictor_index]));
1191  }
1192  }
1193  }
1194 
1195  double interp;
1196 
1197 #ifdef STANDALONE
1198  if (j == 0) {
1199  interp =
1200  ue_interpolation_pf0[predictor_index][
1201  interpolation_index];
1202  }
1203  else if (j == 1) {
1204  interp =
1205  ue_interpolation_pf1[predictor_index][
1206  interpolation_index];
1207  }
1208  else if (j == 2) {
1209  interp =
1210  ue_interpolation_pf2[predictor_index][
1211  interpolation_index];
1212  }
1213 #else // STANDALONE
1214  if (j == 0) {
1215  interp =
1216  ue->ue_interpolation_pf0[predictor_index][
1217  interpolation_index];
1218  }
1219  else if (j == 1) {
1220  interp =
1221  ue->ue_interpolation_pf1[predictor_index][
1222  interpolation_index];
1223  }
1224  else if (j == 2) {
1225  interp =
1226  ue->ue_interpolation_pf2[predictor_index][
1227  interpolation_index];
1228  }
1229 #endif // STANDALONE
1230  // Interpolate down to the finely binned
1231  // pseudorapidity
1232 
1233  density += pred /
1234  (2.0 * M_PI *
1235  (_edge_pseudorapidity[predictor_index + 1] -
1236  _edge_pseudorapidity[predictor_index])) *
1237  interp;
1238  }
1239  }
1240 
1241  if (std::isfinite(iterator->area) && density >= 0) {
1242  // Subtract the PF candidate by density times
1243  // Voronoi cell area
1244  iterator->momentum_perp_subtracted =
1245  iterator->momentum.Pt() -
1246  density * iterator->area;
1247  }
1248  else {
1249  iterator->momentum_perp_subtracted =
1250  iterator->momentum.Pt();
1251  }
1252  iterator->momentum_perp_subtracted_unequalized =
1253  iterator->momentum_perp_subtracted;
1254  }
1255  }
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
std::vector< double > _edge_pseudorapidity
std::vector< double > _cms_ecal_edge_pseudorapidity
static const size_t nreduced_particle_flow_id
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
static const size_t nfourier
int j
Definition: DBlmapReader.cc:9
std::vector< double > _feature
#define M_PI
UECalibration * ue
float ue_interpolation_pf0[15][344]
Definition: UECalibration.h:90
float ue_predictor_pf[3][15][5][2][82]
Definition: UECalibration.h:90
std::vector< double > _cms_hcal_edge_pseudorapidity
float ue_interpolation_pf1[15][344]
Definition: UECalibration.h:90
float ue_interpolation_pf2[15][82]
Definition: UECalibration.h:90
std::vector< double > VoronoiAlgorithm::subtracted_equalized_perp ( void  )

Returns the transverse momenta of the subtracted particles

Returns
vector of transverse momenta

Definition at line 1875 of file VoronoiAlgorithm.cc.

References _event, run_regression::ret, and subtract_if_necessary().

Referenced by VoronoiBackgroundProducer::produce().

1876  {
1878 
1879  std::vector<double> ret;
1880 
1881  for (std::vector<particle_t>::const_iterator iterator =
1882  _event.begin();
1883  iterator != _event.end(); iterator++) {
1884  ret.push_back(iterator->momentum_perp_subtracted);
1885  }
1886 
1887  return ret;
1888  }
void subtract_if_necessary(void)
std::vector< double > VoronoiAlgorithm::subtracted_unequalized_perp ( void  )

Definition at line 1889 of file VoronoiAlgorithm.cc.

References _event, run_regression::ret, and subtract_if_necessary().

Referenced by VoronoiBackgroundProducer::produce().

1890  {
1892 
1893  std::vector<double> ret;
1894 
1895  for (std::vector<particle_t>::const_iterator iterator =
1896  _event.begin();
1897  iterator != _event.end(); iterator++) {
1898  ret.push_back(iterator->momentum_perp_subtracted_unequalized);
1899  }
1900 
1901  return ret;
1902  }
void subtract_if_necessary(void)
void VoronoiAlgorithm::voronoi_area_incident ( void  )
private

Definition at line 1008 of file VoronoiAlgorithm.cc.

References _event, patZpeak::handle, edm::eventsetup::heterocontainer::insert(), roll_playback::k, M_PI, NULL, AlCaHLTBitMon_ParallelJobs::p, and query::result.

Referenced by subtract_if_necessary().

1009  {
1010  // Make the Voronoi diagram
1011 
1012  voronoi_diagram_t diagram;
1013 
1014  // Reverse Voronoi face lookup
1015 #ifdef HAVE_SPARSEHASH
1016  // The "empty" or default value of the hash table
1017  const voronoi_diagram_t::Face face_empty;
1018  google::dense_hash_map<voronoi_diagram_t::Face_handle,
1019  size_t, hash<voronoi_diagram_t::Face_handle> >
1020  face_index;
1021 
1022  face_index.set_empty_key(face_empty);
1023 #else // HAVE_SPARSEHASH
1024  std::map<voronoi_diagram_t::Face_handle, size_t>
1025  face_index;
1026 #endif // HAVE_SPARSEHASH
1027 
1028  for (std::vector<particle_t>::const_iterator iterator =
1029  _event.begin();
1030  iterator != _event.end(); iterator++) {
1031  // Make two additional replicas with azimuth +/- 2 pi
1032  // (and use only the middle) to mimick the azimuthal
1033  // cyclicity
1034  for (int k = -1; k <= 1; k++) {
1035  const point_2d_t p(
1036  iterator->momentum.Eta(),
1037  iterator->momentum.Phi() +
1038  k * (2 * M_PI));
1039  const voronoi_diagram_t::Face_handle handle =
1040  diagram.insert(p);
1041 
1042  face_index[handle] = iterator - _event.begin();
1043  }
1044  }
1045 
1046  // Extract the Voronoi cells as polygon and calculate the
1047  // area associated with individual particles
1048 
1049  for (std::vector<particle_t>::iterator iterator =
1050  _event.begin();
1051  iterator != _event.end(); iterator++) {
1052  const voronoi_diagram_t::Locate_result result =
1053  diagram.locate(*iterator);
1054  const voronoi_diagram_t::Face_handle *face =
1055  boost::get<voronoi_diagram_t::Face_handle>(
1056  &result);
1057  double polygon_area;
1058 
1059  if (face != NULL) {
1060  voronoi_diagram_t::Ccb_halfedge_circulator
1061  circulator_start = (*face)->outer_ccb();
1062  bool unbounded = false;
1063  polygon_t polygon;
1064 
1065  voronoi_diagram_t::Ccb_halfedge_circulator
1066  circulator = circulator_start;
1067 
1068  // Circle around the edges and extract the polygon
1069  // vertices
1070  do {
1071  if (circulator->has_target()) {
1072  polygon.push_back(
1073  circulator->target()->point());
1074  _event[face_index[*face]].incident.
1075  insert(
1076  _event.begin() +
1077  face_index[circulator->twin()->
1078  face()]);
1079  }
1080  else {
1081  unbounded = true;
1082  break;
1083  }
1084  }
1085  while (++circulator != circulator_start);
1086  if (unbounded) {
1087  polygon_area = INFINITY;
1088  }
1089  else {
1090  polygon_area = polygon.area();
1091  }
1092  }
1093  else {
1094  polygon_area = NAN;
1095  }
1096  iterator->area = fabs(polygon_area);
1097  }
1098  }
CGAL::Voronoi_diagram_2< delaunay_triangulation_t, CGAL::Delaunay_triangulation_adaptation_traits_2< delaunay_triangulation_t >, CGAL::Delaunay_triangulation_caching_degeneracy_removal_policy_2< delaunay_triangulation_t > > voronoi_diagram_t
#define NULL
Definition: scimark2.h:8
delaunay_triangulation_t::Point point_2d_t
tuple result
Definition: query.py:137
tuple handle
Definition: patZpeak.py:22
bool insert(Storage &iStorage, ItemType *iItem, const IdTag &iIdTag)
Definition: HCMethods.h:49
#define M_PI
CGAL::Polygon_2< CGAL::Exact_predicates_inexact_constructions_kernel > polygon_t

Member Data Documentation

std::vector<bool> VoronoiAlgorithm::_active
protected

Definition at line 76 of file VoronoiAlgorithm.h.

Referenced by lp_populate(), and recombine_link().

std::vector<double> VoronoiAlgorithm::_cms_ecal_edge_pseudorapidity
protected

Definition at line 67 of file VoronoiAlgorithm.h.

Referenced by initialize_geometry(), and subtract_momentum().

std::vector<double> VoronoiAlgorithm::_cms_hcal_edge_pseudorapidity
protected

Definition at line 66 of file VoronoiAlgorithm.h.

Referenced by initialize_geometry(), and subtract_momentum().

std::vector<double> VoronoiAlgorithm::_edge_pseudorapidity
protected
std::pair<double, double> VoronoiAlgorithm::_equalization_threshold
protected

Definition at line 69 of file VoronoiAlgorithm.h.

Referenced by lp_populate().

event_t VoronoiAlgorithm::_event
protected
std::vector<double> VoronoiAlgorithm::_feature
protected

Definition at line 75 of file VoronoiAlgorithm.h.

Referenced by feature_extract(), and subtract_momentum().

void* VoronoiAlgorithm::_lp_environment
protected

Definition at line 83 of file VoronoiAlgorithm.h.

Referenced by equalize().

void* VoronoiAlgorithm::_lp_problem
protected

Definition at line 84 of file VoronoiAlgorithm.h.

std::vector<size_t> VoronoiAlgorithm::_nblock_subtract
protected

Definition at line 82 of file VoronoiAlgorithm.h.

Referenced by equalize(), and lp_populate().

size_t VoronoiAlgorithm::_ncost
protected

Definition at line 81 of file VoronoiAlgorithm.h.

Referenced by equalize(), and lp_populate().

boost::multi_array<double, 4>* VoronoiAlgorithm::_perp_fourier
protected

Definition at line 74 of file VoronoiAlgorithm.h.

Referenced by allocate(), deallocate(), event_fourier(), and perp_fourier().

double VoronoiAlgorithm::_positive_bound_scale
protected

Definition at line 71 of file VoronoiAlgorithm.h.

Referenced by lp_populate().

double VoronoiAlgorithm::_radial_distance_square_max
protected

Definition at line 70 of file VoronoiAlgorithm.h.

Referenced by recombine_link().

std::vector<std::pair<size_t, size_t> > VoronoiAlgorithm::_recombine
protected

Definition at line 77 of file VoronoiAlgorithm.h.

Referenced by equalize(), and recombine_link().

std::vector<std::vector<size_t> > VoronoiAlgorithm::_recombine_index
protected

Definition at line 78 of file VoronoiAlgorithm.h.

Referenced by lp_populate(), and recombine_link().

std::vector<double> VoronoiAlgorithm::_recombine_tie
protected

Definition at line 80 of file VoronoiAlgorithm.h.

Referenced by lp_populate(), and recombine_link().

std::vector<std::vector<size_t> > VoronoiAlgorithm::_recombine_unsigned
protected

Definition at line 79 of file VoronoiAlgorithm.h.

Referenced by lp_populate(), and recombine_link().

bool VoronoiAlgorithm::_remove_nonpositive
protected

Definition at line 68 of file VoronoiAlgorithm.h.

Referenced by subtract_if_necessary().

bool VoronoiAlgorithm::_subtracted
protected

Definition at line 72 of file VoronoiAlgorithm.h.

Referenced by clear(), and subtract_if_necessary().

const size_t VoronoiAlgorithm::nfourier = 5
static

Definition at line 63 of file VoronoiAlgorithm.h.

Referenced by allocate(), event_fourier(), feature_extract(), and subtract_momentum().

const size_t VoronoiAlgorithm::nreduced_particle_flow_id = 3
static

Definition at line 62 of file VoronoiAlgorithm.h.

Referenced by allocate(), feature_extract(), and subtract_momentum().

UECalibration* VoronoiAlgorithm::ue
protected

Definition at line 86 of file VoronoiAlgorithm.h.

Referenced by subtract_momentum(), and VoronoiAlgorithm().