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 1839 of file VoronoiAlgorithm.cc.

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

1846  _equalization_threshold(equalization_threshold),
1847  _radial_distance_square_max(dr_max * dr_max),
1848  _positive_bound_scale(0.2),
1849  _subtracted(false),
1850  ue(NULL)
1851  {
1853  ue = new UECalibration(isRealData, isCalo);
1854  static const size_t nedge_pseudorapidity = 15 + 1;
1855  static const double edge_pseudorapidity[nedge_pseudorapidity] = {
1856  -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
1857  };
1858 
1859  _edge_pseudorapidity = std::vector<double>(
1860  edge_pseudorapidity,
1861  edge_pseudorapidity + nedge_pseudorapidity);
1862  allocate();
1863  }
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 1865 of file VoronoiAlgorithm.cc.

References deallocate().

1866  {
1867  deallocate();
1868  }

Member Function Documentation

void VoronoiAlgorithm::allocate ( void  )
private

Definition at line 932 of file VoronoiAlgorithm.cc.

References _edge_pseudorapidity, _perp_fourier, nfourier, and nreduced_particle_flow_id.

Referenced by VoronoiAlgorithm().

933  {
934  _perp_fourier = new boost::multi_array<double, 4>(
935  boost::extents[_edge_pseudorapidity.size() - 1]
937  }
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 1892 of file VoronoiAlgorithm.cc.

References _event, and _subtracted.

Referenced by VoronoiBackgroundProducer::produce().

1893  {
1894  _event.clear();
1895  _subtracted = false;
1896  }
void VoronoiAlgorithm::deallocate ( void  )
private

Definition at line 938 of file VoronoiAlgorithm.cc.

References _perp_fourier.

Referenced by ~VoronoiAlgorithm().

939  {
940  delete _perp_fourier;
941  }
boost::multi_array< double, 4 > * _perp_fourier
void VoronoiAlgorithm::equalize ( void  )
private

Definition at line 1780 of file VoronoiAlgorithm.cc.

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

Referenced by subtract_if_necessary().

1781  {
1782  bpmpd_problem_t lp_problem = reinterpret_cast<bpmpd_environment_t *>(_lp_environment)->problem();
1783 
1784  recombine_link();
1785  lp_populate(&lp_problem);
1786  lp_problem.optimize();
1787 
1788  int solution_status;
1789  double objective_value;
1790  std::vector<double> x;
1791  std::vector<double> pi;
1792 
1793  lp_problem.solve(solution_status, objective_value,
1794  x, pi);
1795 
1796  for (size_t k = _ncost; k < x.size(); k++) {
1797  if (_event[_recombine[k - _ncost].first].
1798  momentum_perp_subtracted < 0 &&
1800  momentum_perp_subtracted >= 0 && x[k] >= 0) {
1801  _event[_recombine[k - _ncost].first].
1802  momentum_perp_subtracted += x[k];
1803  _event[_recombine[k - _ncost].second].
1804  momentum_perp_subtracted -= x[k];
1805  }
1806  }
1807  for (size_t k = 0; k < _event.size(); k++) {
1808  if (_nblock_subtract[k] != 0 &&
1809  x[_nblock_subtract[k]] >= 0) {
1810  _event[k].momentum_perp_subtracted -=
1811  x[_nblock_subtract[k]];
1812  }
1813  }
1814  }
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:94
int k[5][pyjets_maxn]
x
Definition: VDTMath.h:216
void VoronoiAlgorithm::event_fourier ( void  )
private

Definition at line 942 of file VoronoiAlgorithm.cc.

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

Referenced by subtract_if_necessary().

943  {
944  std::fill(_perp_fourier->data(),
945  _perp_fourier->data() +
946  _perp_fourier->num_elements(),
947  0);
948 
949  for (std::vector<particle_t>::const_iterator iterator =
950  _event.begin();
951  iterator != _event.end(); iterator++) {
952  const unsigned int reduced_id =
953  iterator->reduced_particle_flow_id;
954 
955  for (size_t k = 1; k < _edge_pseudorapidity.size();
956  k++) {
957  if (iterator->momentum.Eta() >=
958  _edge_pseudorapidity[k - 1] &&
959  iterator->momentum.Eta() <
961  const double azimuth =
962  iterator->momentum.Phi();
963 
964  for (size_t l = 0; l < nfourier; l++) {
965  (*_perp_fourier)[k - 1][reduced_id]
966  [l][0] +=
967  iterator->momentum.Pt() *
968  cos(l * azimuth);
969  (*_perp_fourier)[k - 1][reduced_id]
970  [l][1] +=
971  iterator->momentum.Pt() *
972  sin(l * azimuth);
973  }
974  }
975  }
976  }
977  }
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
int k[5][pyjets_maxn]
boost::multi_array< double, 4 > * _perp_fourier
void VoronoiAlgorithm::feature_extract ( void  )
private

Definition at line 978 of file VoronoiAlgorithm.cc.

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

Referenced by subtract_if_necessary().

979  {
980  const size_t nfeature = 2 * nfourier - 1;
981 
982  _feature.resize(nfeature);
983 
984  // Scale factor to get 95% of the coefficient below 1.0
985  // (where however one order of magnitude tolerance is
986  // acceptable). This is valid for nfourier < 18 (where
987  // interference behavior with the HF geometry starts to
988  // appear)
989 
990  std::vector<double> scale(nfourier, 1.0 / 200.0);
991 
992  if (nfourier >= 1) {
993  scale[0] = 1.0 / 5400.0;
994  }
995  if (nfourier >= 2) {
996  scale[1] = 1.0 / 130.0;
997  }
998  if (nfourier >= 3) {
999  scale[2] = 1.0 / 220.0;
1000  }
1001 
1002  const size_t index_edge_end =
1003  _edge_pseudorapidity.size() - 2;
1004 
1005  _feature[0] = 0;
1006  for (size_t j = 0; j < nreduced_particle_flow_id; j++) {
1007  _feature[0] += scale[0] *
1008  ((*_perp_fourier)[0 ][j][0][0] +
1009  (*_perp_fourier)[index_edge_end][j][0][0]);
1010  }
1011 
1012  for (size_t k = 1; k < nfourier; k++) {
1013  _feature[2 * k - 1] = 0;
1014  for (size_t j = 0; j < nreduced_particle_flow_id; j++) {
1015  _feature[2 * k - 1] += scale[k] *
1016  ((*_perp_fourier)[0 ][j][k][0] +
1017  (*_perp_fourier)[index_edge_end][j][k][0]);
1018  }
1019  _feature[2 * k] = 0;
1020  for (size_t j = 0; j < nreduced_particle_flow_id; j++) {
1021  _feature[2 * k] += scale[k] *
1022  ((*_perp_fourier)[0 ][j][k][1] +
1023  (*_perp_fourier)[index_edge_end][j][k][1]);
1024  }
1025  }
1026 
1027 
1028 #if 0
1029  const double event_plane = atan2(_feature[4], _feature[3]);
1030  const double v2 =
1031  sqrt(_feature[3] * _feature[3] +
1032  _feature[4] * _feature[4]) / _feature[0];
1033 #endif
1034  }
std::vector< double > _edge_pseudorapidity
T sqrt(T t)
Definition: SSEVec.h:46
static const size_t nreduced_particle_flow_id
static const size_t nfourier
int j
Definition: DBlmapReader.cc:9
std::vector< double > _feature
int k[5][pyjets_maxn]
void VoronoiAlgorithm::initialize_geometry ( void  )
private

Definition at line 898 of file VoronoiAlgorithm.cc.

References _cms_ecal_edge_pseudorapidity, _cms_hcal_edge_pseudorapidity, and i.

Referenced by VoronoiAlgorithm().

899  {
900  static const size_t ncms_hcal_edge_pseudorapidity = 82 + 1;
901  static const double cms_hcal_edge_pseudorapidity[
902  ncms_hcal_edge_pseudorapidity] = {
903  -5.191, -4.889, -4.716, -4.538, -4.363, -4.191, -4.013,
904  -3.839, -3.664, -3.489, -3.314, -3.139, -2.964, -2.853,
905  -2.650, -2.500, -2.322, -2.172, -2.043, -1.930, -1.830,
906  -1.740, -1.653, -1.566, -1.479, -1.392, -1.305, -1.218,
907  -1.131, -1.044, -0.957, -0.879, -0.783, -0.696, -0.609,
908  -0.522, -0.435, -0.348, -0.261, -0.174, -0.087,
909  0.000,
910  0.087, 0.174, 0.261, 0.348, 0.435, 0.522, 0.609,
911  0.696, 0.783, 0.879, 0.957, 1.044, 1.131, 1.218,
912  1.305, 1.392, 1.479, 1.566, 1.653, 1.740, 1.830,
913  1.930, 2.043, 2.172, 2.322, 2.500, 2.650, 2.853,
914  2.964, 3.139, 3.314, 3.489, 3.664, 3.839, 4.013,
915  4.191, 4.363, 4.538, 4.716, 4.889, 5.191
916  };
917 
918  _cms_hcal_edge_pseudorapidity = std::vector<double>(
919  cms_hcal_edge_pseudorapidity,
920  cms_hcal_edge_pseudorapidity +
921  ncms_hcal_edge_pseudorapidity);
922 
923  static const size_t ncms_ecal_edge_pseudorapidity = 344 + 1;
924 
925  for (size_t i = 0; i < ncms_ecal_edge_pseudorapidity; i++) {
927  i * (2 * 2.9928 /
928  (ncms_ecal_edge_pseudorapidity - 1)) -
929  2.9928);
930  }
931  }
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 1411 of file VoronoiAlgorithm.cc.

References _active, _equalization_threshold, _event, _nblock_subtract, _ncost, _positive_bound_scale, _recombine_index, _recombine_tie, _recombine_unsigned, alignCSCRings::e, i, infinity, M_PI, max(), min, nedge_pseudorapidity(), AlCaHLTBitMon_ParallelJobs::p, and CommonMethods::weight().

Referenced by equalize().

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

Definition at line 1990 of file VoronoiAlgorithm.cc.

References _edge_pseudorapidity.

Referenced by lp_populate(), and VoronoiAlgorithm().

1991  {
1992  return _edge_pseudorapidity.size();
1993  }
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 1936 of file VoronoiAlgorithm.cc.

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

Referenced by VoronoiBackgroundProducer::produce().

1937  {
1939 
1940  std::vector<double> ret;
1941 
1942  for (std::vector<particle_t>::const_iterator iterator =
1943  _event.begin();
1944  iterator != _event.end(); iterator++) {
1945  ret.push_back(iterator->area);
1946  }
1947 
1948  return ret;
1949  }
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 1958 of file VoronoiAlgorithm.cc.

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

1959  {
1961 
1962  std::vector<std::set<size_t> > ret;
1963 
1964  for (std::vector<particle_t>::const_iterator
1965  iterator_outer = _event.begin();
1966  iterator_outer != _event.end(); iterator_outer++) {
1967  std::set<size_t> e;
1968 
1969  for (std::set<std::vector<particle_t>::iterator>::
1970  const_iterator iterator_inner =
1971  iterator_outer->incident.begin();
1972  iterator_inner != iterator_outer->incident.begin();
1973  iterator_inner++) {
1974  e.insert(*iterator_inner - _event.begin());
1975  }
1976  ret.push_back(e);
1977  }
1978 
1979  return ret;
1980  }
void subtract_if_necessary(void)
void set(const std::string &name, int value)
set the flag, with a run-time name
std::vector< double > VoronoiAlgorithm::perp_fourier ( void  )

Definition at line 1981 of file VoronoiAlgorithm.cc.

References _perp_fourier, and subtract_if_necessary().

Referenced by VoronoiBackgroundProducer::produce().

1982  {
1984 
1985  return std::vector<double>(
1986  _perp_fourier->data(),
1987  _perp_fourier->data() +
1988  _perp_fourier->num_elements());
1989  }
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 1879 of file VoronoiAlgorithm.cc.

References _event, and AlCaHLTBitMon_ParallelJobs::p.

Referenced by VoronoiBackgroundProducer::produce().

1883  {
1884  math::PtEtaPhiELorentzVector p(perp, pseudorapidity, azimuth, NAN);
1885 
1886  p.SetE(p.P());
1887  _event.push_back(particle_t(p, reduced_particle_flow_id));
1888  }
PtEtaPhiELorentzVectorD PtEtaPhiELorentzVector
Lorentz vector with cartesian internal representation.
Definition: LorentzVector.h:28
T perp() const
Magnitude of transverse component.
void VoronoiAlgorithm::recombine_link ( void  )
private

Definition at line 1283 of file VoronoiAlgorithm.cc.

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

Referenced by equalize().

1284  {
1285  boost::multi_array<double, 2> radial_distance_square(
1286  boost::extents[_event.size()][_event.size()]);
1287 
1288  for (std::vector<particle_t>::const_iterator
1289  iterator_outer = _event.begin();
1290  iterator_outer != _event.end(); iterator_outer++) {
1291  radial_distance_square
1292  [iterator_outer - _event.begin()]
1293  [iterator_outer - _event.begin()] = 0;
1294 
1295  for (std::vector<particle_t>::const_iterator
1296  iterator_inner = _event.begin();
1297  iterator_inner != iterator_outer;
1298  iterator_inner++) {
1299  const double deta = iterator_outer->momentum.Eta() -
1300  iterator_inner->momentum.Eta();
1301  const double dphi = angular_range_reduce(
1302  iterator_outer->momentum.Phi() -
1303  iterator_inner->momentum.Phi());
1304 
1305  radial_distance_square
1306  [iterator_outer - _event.begin()]
1307  [iterator_inner - _event.begin()] =
1308  deta * deta + dphi * dphi;
1309  radial_distance_square
1310  [iterator_inner - _event.begin()]
1311  [iterator_outer - _event.begin()] =
1312  radial_distance_square
1313  [iterator_outer - _event.begin()]
1314  [iterator_inner - _event.begin()];
1315  }
1316  }
1317 
1318  _active.clear();
1319 
1320  for (std::vector<particle_t>::const_iterator
1321  iterator_outer = _event.begin();
1322  iterator_outer != _event.end(); iterator_outer++) {
1323  double incident_area_sum = iterator_outer->area;
1324 
1325  for (std::set<std::vector<particle_t>::iterator>::
1326  const_iterator iterator_inner =
1327  iterator_outer->incident.begin();
1328  iterator_inner !=
1329  iterator_outer->incident.end();
1330  iterator_inner++) {
1331  incident_area_sum += (*iterator_inner)->area;
1332  }
1333  _active.push_back(incident_area_sum < 2.0);
1334  }
1335 
1336  _recombine.clear();
1337  _recombine_index = std::vector<std::vector<size_t> >(
1338  _event.size(), std::vector<size_t>());
1339  _recombine_unsigned = std::vector<std::vector<size_t> >(
1340  _event.size(), std::vector<size_t>());
1341  _recombine_tie.clear();
1342 
1343  // 36 cells corresponds to ~ 3 layers, note that for
1344  // hexagonal tiling, cell in proximity = 3 * layer *
1345  // (layer + 1)
1346  static const size_t npair_max = 36;
1347 
1348  for (size_t i = 0; i < _event.size(); i++) {
1349  for (size_t j = 0; j < _event.size(); j++) {
1350  const bool active_i_j = _active[i] && _active[j];
1351  const size_t incident_count =
1352  _event[i].incident.count(_event.begin() + j) +
1353  _event[j].incident.count(_event.begin() + i);
1354 
1355  if (active_i_j &&
1356  (radial_distance_square[i][j] <
1358  incident_count > 0)) {
1359  _recombine_unsigned[i].push_back(j);
1360  }
1361  }
1362 
1363  if (_event[i].momentum_perp_subtracted < 0) {
1364  std::vector<double> radial_distance_square_list;
1365 
1366  for (std::vector<size_t>::const_iterator iterator =
1368  iterator != _recombine_unsigned[i].end();
1369  iterator++) {
1370  const size_t j = *iterator;
1371 
1372  if (_event[j].momentum_perp_subtracted > 0) {
1373  radial_distance_square_list.push_back(
1374  radial_distance_square[i][j]);
1375  }
1376  }
1377 
1378  double radial_distance_square_max_equalization_cut =
1380 
1381  if (radial_distance_square_list.size() >= npair_max) {
1382  std::sort(radial_distance_square_list.begin(),
1383  radial_distance_square_list.end());
1384  radial_distance_square_max_equalization_cut =
1385  radial_distance_square_list[npair_max - 1];
1386  }
1387 
1388  for (std::vector<size_t>::const_iterator iterator =
1390  iterator != _recombine_unsigned[i].end();
1391  iterator++) {
1392  const size_t j = *iterator;
1393 
1394  if (_event[j].momentum_perp_subtracted > 0 &&
1395  radial_distance_square[i][j] <
1396  radial_distance_square_max_equalization_cut) {
1397  _recombine_index[j].push_back(
1398  _recombine.size());
1399  _recombine_index[i].push_back(
1400  _recombine.size());
1401  _recombine.push_back(
1402  std::pair<size_t, size_t>(i, j));
1403  _recombine_tie.push_back(
1404  radial_distance_square[i][j] /
1406  }
1407  }
1408  }
1409  }
1410  }
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:31
void set(const std::string &name, int value)
set the flag, with a run-time name
void VoronoiAlgorithm::remove_nonpositive ( void  )
private

Definition at line 1815 of file VoronoiAlgorithm.cc.

References _event, and max().

Referenced by subtract_if_necessary().

1816  {
1817  for (std::vector<particle_t>::iterator iterator =
1818  _event.begin();
1819  iterator != _event.end(); iterator++) {
1820  iterator->momentum_perp_subtracted = std::max(
1821  0.0, iterator->momentum_perp_subtracted);
1822  }
1823  }
const T & max(const T &a, const T &b)
void VoronoiAlgorithm::subtract_if_necessary ( void  )
private
void VoronoiAlgorithm::subtract_momentum ( void  )
private

Definition at line 1126 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().

1127  {
1128  for (std::vector<particle_t>::iterator iterator =
1129  _event.begin();
1130  iterator != _event.end(); iterator++) {
1131  int predictor_index = -1;
1132  int interpolation_index = -1;
1133  double density = 0;
1134  double pred_0 = 0;
1135 
1136  for (size_t l = 1; l < _edge_pseudorapidity.size(); l++) {
1137  if (iterator->momentum.Eta() >=
1138  _edge_pseudorapidity[l - 1] &&
1139  iterator->momentum.Eta() <
1141  predictor_index = l - 1;
1142  }
1143  }
1144 
1145  for (size_t j = 0; j < nreduced_particle_flow_id; j++) {
1146  if (j == 2) {
1147  // HCAL
1148  for (size_t l = 1;
1149  l < _cms_hcal_edge_pseudorapidity.size(); l++) {
1150  if (iterator->momentum.Eta() >=
1152  iterator->momentum.Eta() <
1154  interpolation_index = l - 1;
1155  }
1156  }
1157  }
1158  else {
1159  // Tracks or ECAL clusters
1160  for (size_t l = 1;
1161  l < _cms_ecal_edge_pseudorapidity.size(); l++) {
1162  if (iterator->momentum.Eta() >=
1164  iterator->momentum.Eta() <
1166  interpolation_index = l - 1;
1167  }
1168  }
1169  }
1170 
1171  if (predictor_index >= 0 && interpolation_index >= 0) {
1172  // Calculate the aggregated prediction and
1173  // interpolation for the pseudorapidity segment
1174 
1175  const double azimuth = iterator->momentum.Phi();
1176  const float (*p)[2][82] =
1177 #ifdef STANDALONE
1178  ue_predictor_pf[j][predictor_index]
1179 #else // STANDALONE
1180  ue->ue_predictor_pf[j][predictor_index]
1181 #endif // STANDALONE
1182  ;
1183  double pred = 0;
1184 
1185  for (size_t l = 0; l < nfourier; l++) {
1186  for (size_t m = 0; m < 2; m++) {
1187  float u = p[l][m][0];
1188 
1189  for (size_t n = 0; n < 2 * nfourier - 1; n++) {
1190  u += (((((((((p[l][m][9 * n + 9]) *
1191  _feature[n] +
1192  p[l][m][9 * n + 8]) *
1193  _feature[n] +
1194  p[l][m][9 * n + 7]) *
1195  _feature[n] +
1196  p[l][m][9 * n + 6]) *
1197  _feature[n] +
1198  p[l][m][9 * n + 5]) *
1199  _feature[n] +
1200  p[l][m][9 * n + 4]) *
1201  _feature[n] +
1202  p[l][m][9 * n + 3]) *
1203  _feature[n] +
1204  p[l][m][9 * n + 2]) *
1205  _feature[n] +
1206  p[l][m][9 * n + 1]) *
1207  _feature[n];
1208  }
1209 
1210  pred += u * (l == 0 ? 1.0 : 2.0) *
1211  (m == 0 ? cos(l * azimuth) :
1212  sin(l * azimuth));
1213  if (l == 0 && m == 0) {
1214  pred_0 += u /
1215  (2.0 * M_PI *
1216  (_edge_pseudorapidity[predictor_index + 1] -
1217  _edge_pseudorapidity[predictor_index]));
1218  }
1219  }
1220  }
1221 
1222  double interp;
1223 
1224 #ifdef STANDALONE
1225  if (j == 0) {
1226  interp =
1227  ue_interpolation_pf0[predictor_index][
1228  interpolation_index];
1229  }
1230  else if (j == 1) {
1231  interp =
1232  ue_interpolation_pf1[predictor_index][
1233  interpolation_index];
1234  }
1235  else if (j == 2) {
1236  interp =
1237  ue_interpolation_pf2[predictor_index][
1238  interpolation_index];
1239  }
1240 #else // STANDALONE
1241  if (j == 0) {
1242  interp =
1243  ue->ue_interpolation_pf0[predictor_index][
1244  interpolation_index];
1245  }
1246  else if (j == 1) {
1247  interp =
1248  ue->ue_interpolation_pf1[predictor_index][
1249  interpolation_index];
1250  }
1251  else if (j == 2) {
1252  interp =
1253  ue->ue_interpolation_pf2[predictor_index][
1254  interpolation_index];
1255  }
1256 #endif // STANDALONE
1257  // Interpolate down to the finely binned
1258  // pseudorapidity
1259 
1260  density += pred /
1261  (2.0 * M_PI *
1262  (_edge_pseudorapidity[predictor_index + 1] -
1263  _edge_pseudorapidity[predictor_index])) *
1264  interp;
1265  }
1266  }
1267 
1268  if (std::isfinite(iterator->area) && density >= 0) {
1269  // Subtract the PF candidate by density times
1270  // Voronoi cell area
1271  iterator->momentum_perp_subtracted =
1272  iterator->momentum.Pt() -
1273  density * iterator->area;
1274  }
1275  else {
1276  iterator->momentum_perp_subtracted =
1277  iterator->momentum.Pt();
1278  }
1279  iterator->momentum_perp_subtracted_unequalized =
1280  iterator->momentum_perp_subtracted;
1281  }
1282  }
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
Definition: BFit3D.cc:3
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 1902 of file VoronoiAlgorithm.cc.

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

Referenced by VoronoiBackgroundProducer::produce().

1903  {
1905 
1906  std::vector<double> ret;
1907 
1908  for (std::vector<particle_t>::const_iterator iterator =
1909  _event.begin();
1910  iterator != _event.end(); iterator++) {
1911  ret.push_back(iterator->momentum_perp_subtracted);
1912  }
1913 
1914  return ret;
1915  }
void subtract_if_necessary(void)
std::vector< double > VoronoiAlgorithm::subtracted_unequalized_perp ( void  )

Definition at line 1916 of file VoronoiAlgorithm.cc.

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

Referenced by VoronoiBackgroundProducer::produce().

1917  {
1919 
1920  std::vector<double> ret;
1921 
1922  for (std::vector<particle_t>::const_iterator iterator =
1923  _event.begin();
1924  iterator != _event.end(); iterator++) {
1925  ret.push_back(iterator->momentum_perp_subtracted_unequalized);
1926  }
1927 
1928  return ret;
1929  }
void subtract_if_necessary(void)
void VoronoiAlgorithm::voronoi_area_incident ( void  )
private

Definition at line 1035 of file VoronoiAlgorithm.cc.

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

Referenced by subtract_if_necessary().

1036  {
1037  // Make the Voronoi diagram
1038 
1039  voronoi_diagram_t diagram;
1040 
1041  // Reverse Voronoi face lookup
1042 #ifdef HAVE_SPARSEHASH
1043  // The "empty" or default value of the hash table
1044  const voronoi_diagram_t::Face face_empty;
1045  google::dense_hash_map<voronoi_diagram_t::Face_handle,
1046  size_t, hash<voronoi_diagram_t::Face_handle> >
1047  face_index;
1048 
1049  face_index.set_empty_key(face_empty);
1050 #else // HAVE_SPARSEHASH
1051  std::map<voronoi_diagram_t::Face_handle, size_t>
1052  face_index;
1053 #endif // HAVE_SPARSEHASH
1054 
1055  for (std::vector<particle_t>::const_iterator iterator =
1056  _event.begin();
1057  iterator != _event.end(); iterator++) {
1058  // Make two additional replicas with azimuth +/- 2 pi
1059  // (and use only the middle) to mimick the azimuthal
1060  // cyclicity
1061  for (int k = -1; k <= 1; k++) {
1062  const point_2d_t p(
1063  iterator->momentum.Eta(),
1064  iterator->momentum.Phi() +
1065  k * (2 * M_PI));
1066  const voronoi_diagram_t::Face_handle handle =
1067  diagram.insert(p);
1068 
1069  face_index[handle] = iterator - _event.begin();
1070  }
1071  }
1072 
1073  // Extract the Voronoi cells as polygon and calculate the
1074  // area associated with individual particles
1075 
1076  for (std::vector<particle_t>::iterator iterator =
1077  _event.begin();
1078  iterator != _event.end(); iterator++) {
1079  const voronoi_diagram_t::Locate_result result =
1080  diagram.locate(*iterator);
1081  const voronoi_diagram_t::Face_handle *face =
1082  boost::get<voronoi_diagram_t::Face_handle>(
1083  &result);
1084  double polygon_area;
1085 
1086  if (face != NULL) {
1087  voronoi_diagram_t::Ccb_halfedge_circulator
1088  circulator_start = (*face)->outer_ccb();
1089  bool unbounded = false;
1090  polygon_t polygon;
1091 
1092  voronoi_diagram_t::Ccb_halfedge_circulator
1093  circulator = circulator_start;
1094 
1095  // Circle around the edges and extract the polygon
1096  // vertices
1097  do {
1098  if (circulator->has_target()) {
1099  polygon.push_back(
1100  circulator->target()->point());
1101  _event[face_index[*face]].incident.
1102  insert(
1103  _event.begin() +
1104  face_index[circulator->twin()->
1105  face()]);
1106  }
1107  else {
1108  unbounded = true;
1109  break;
1110  }
1111  }
1112  while (++circulator != circulator_start);
1113  if (unbounded) {
1114  polygon_area = INFINITY;
1115  }
1116  else {
1117  polygon_area = polygon.area();
1118  }
1119  }
1120  else {
1121  polygon_area = NAN;
1122  }
1123  iterator->area = fabs(polygon_area);
1124  }
1125  }
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
int k[5][pyjets_maxn]
#define M_PI
Definition: BFit3D.cc:3
CGAL::Polygon_2< CGAL::Exact_predicates_inexact_constructions_kernel > polygon_t
bool insert(Storage &, ItemType *, const IdTag &)

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().