LArSoft  v06_85_00
Liquid Argon Software toolkit - http://larsoft.org/
EventUtilitiies.cxx
Go to the documentation of this file.
1 
8 // Framework Includes
9 
13 
14 // std includes
15 #include <string>
16 #include <functional>
17 #include <iostream>
18 #include <memory>
19 #include <queue>
20 
21 //------------------------------------------------------------------------------------------------------------------------------------------
22 // implementation follows
23 
24 namespace voronoi2d {
25 
26 double EventUtilities::computeArcVal(double beachPos, double yPos, const IEvent* arc) const
27 {
28  // Note that if the input arc site point lies on the beach line then the arc position is infinite
29  double arcVal = std::numeric_limits<double>::max();
30  double deltaxLx = arc->xPos() - beachPos;
31 
32  if (std::abs(deltaxLx) > std::numeric_limits<double>::epsilon())
33  {
34  double deltayPy = yPos - arc->yPos();
35  double sumPxLx = arc->xPos() + beachPos;
36 
37  arcVal = 0.5 * (deltayPy * deltayPy / deltaxLx + sumPxLx);
38  }
39 
40  return arcVal;
41 }
42 
43 double EventUtilities::computeBreak(const double beachLinePos, const IEvent* leftArc, const IEvent* rightArc, RootsPair& roots) const
44 {
45  // Given arcs to the left and right of this node (meaning we are a breakpoint), compute the
46  // current coordinates of the breakpoint based on the input beachline position
47  double lx = beachLinePos;
48  double deltaX1 = leftArc->xPos() - lx;
49  double deltaX2 = rightArc->xPos() - lx;
50  double breakPoint = -std::numeric_limits<double>::max();
51 
52  // if the two are the same then the arcs are side-by-side and intersection is right in the middle
53  if (std::abs(deltaX1 - deltaX2) < std::numeric_limits<double>::epsilon()) breakPoint = 0.5 * (rightArc->yPos() + leftArc->yPos());
54 
55  // otherwise, we do the full calculation
56  else
57  {
58  // set up for quadratic equation
59  double p1x = leftArc->xPos();
60  double p1y = leftArc->yPos();
61  double p2x = rightArc->xPos();
62  double p2y = rightArc->yPos();
63  double a = p2x - p1x;
64  double b = 2. * (p2y * deltaX1 - p1y * deltaX2);
65  double c = deltaX2 * (p1y * p1y + deltaX1 * (p1x + lx)) - deltaX1 * (p2y * p2y + deltaX2 * (p2x + lx));
66  double radical = std::max(0.,b * b - 4. * a * c);
67 
68  if (radical > 0.) radical = sqrt(radical);
69 
70  double rootPos = 0.5 * (-b + radical) / a;
71  double rootNeg = 0.5 * (-b - radical) / a;
72 
73  roots.first = std::min(rootPos, rootNeg);
74  roots.second = std::max(rootPos, rootNeg);
75 
76  // Ah yes, the eternal question... which solution?
77  // Generally, we think we want the solution which is "between" the left and the right
78  // However, it can be that the right arc is the remnant of an arc whose center lies to the
79  // left of the center of the left arc, and vice versa.
80  if (p1x < p2x) breakPoint = roots.second;
81  else breakPoint = roots.first;
82  }
83 
84  return breakPoint;
85 }
86 
87 bool EventUtilities::newSiteToLeft(const IEvent* newSite, const IEvent* leftArc, const IEvent* rightArc) const
88 {
89  // Note that the input site is used to give us the position of the sweep line
90  // Using the coordinates of the beach line then recover the current breakpoint between the two
91  // input arcs
92  RootsPair roots;
93 
94  double breakPoint = computeBreak(newSite->xPos()-0.000001, leftArc, rightArc, roots);
95 
96  return newSite->yPos() < breakPoint;
97 }
98 
99 } // namespace lar_cluster3d
Provides some basic functions operating in IEvent class objects.
bool newSiteToLeft(const IEvent *, const IEvent *, const IEvent *) const
Represents the beachline implemented as a self balancing binary search tree.
double computeArcVal(const double, const double, const IEvent *) const
Int_t max
Definition: plot.C:27
virtual double yPos() const =0
virtual double xPos() const =0
Int_t min
Definition: plot.C:26
double computeBreak(const double, const IEvent *, const IEvent *, RootsPair &) const
std::pair< double, double > RootsPair