2 #include <utl/MathConstants.h>
3 #include <utl/AugerUnits.h>
7 #include <utl/TabulatedFunction.h>
11 using namespace FdEnergyDepositFinderKG;
15 ZetaPixel::ZetaPixel(
const unsigned int pixelId,
16 const double xPos,
const double yPos,
17 const double sideLength,
const double tiltAngle) :
22 fSideLength(sideLength),
23 fTiltAngle(tiltAngle),
24 fCosTiltAngle(cos(tiltAngle)),
25 fSinTiltAngle(sin(tiltAngle))
35 const double circleRadius)
42 return IsInside(circleX, circleY+circleRadius) ? 1 : 0;
44 phiVec.push_back(phiVec.front() + 2*
kPi);
46 double arcLength = 0.;
47 for (
unsigned int i = 0, n = phiVec.size()-1; i < n; ++i) {
48 const double phi1 = phiVec[i];
49 const double phi2 = phiVec[i+1];
50 const double meanPhi = 0.5*(phi1 + phi2);
52 if (
IsInside(circleX + circleRadius*cos(meanPhi),
53 circleY + circleRadius*sin(meanPhi)))
54 arcLength += phi2 - phi1;
56 return 0.5*arcLength/
kPi;
64 const double circleRadius)
67 vector<double> intersectionPhi;
69 const double r = circleRadius;
70 const double r2 = r*r;
76 for (
unsigned int iSide = 0; iSide < 6; ++iSide) {
82 const double dx = x2 - x1;
83 const double dy = y2 - y1;
84 const double dr2 = dx*dx + dy*dy;
85 const double D = x1*y2 - x2*y1;
86 const double D2 = D*D;
87 const double Delta = r2*dr2 - D2;
89 const double signdy = (dy < 0 ? -1 : 1);
90 const double sqrtDelta =
sqrt(Delta);
91 const double tx1 = D*dy;
92 const double tx2 = signdy*dx*sqrtDelta;
93 const double ty1 = -D*dx;
94 const double ty2 = fabs(dy)*sqrtDelta;
96 const double xInter1 = (tx1 + tx2)/dr2 + circleX;
97 const double xInter2 = (tx1 - tx2)/dr2 + circleX;
98 const double yInter1 = (ty1 + ty2)/dr2 + circleY;
99 const double yInter2 = (ty1 - ty2)/dr2 + circleY;
101 double phi = atan2(yInter1-circleY, xInter1-circleX);
104 intersectionPhi.push_back(phi);
107 double phi = atan2(yInter2-circleY, xInter2-circleX);
110 intersectionPhi.push_back(phi);
115 sort(intersectionPhi.begin(), intersectionPhi.end());
117 return intersectionPhi;
126 const double safety = 1e-10;
127 const double cos30 = 0.5*
kSqrt3;
128 const double tan30 = 1/
kSqrt3;
135 const double xMax = cos30*r;
138 return (xxRot <= xMax && yyRot <= r-tan30*xxRot);
147 for (
unsigned int i = 0; i < 7; ++i) {
bool IsInside(const double x, double y) const
check if point (x,y) is inside the hexagon
void CalculateCoordinates()
std::vector< double > CircleIntersections(const double circleX, const double circleY, const double circleRadius) const
get vector of intersections (phi angle) with a circle with
double CalculateInsideArcLength(const double circleX, const double circleY, const double circleRadius) const
calculate arc length of a circle inside hexagon in units of r*2*pi
std::vector< double > fXCoordinates
std::vector< double > fYCoordinates