From 04656e730d1f0a1c55fdee48e8ea9f34552c03d8 Mon Sep 17 00:00:00 2001 From: tlatorre Date: Sun, 21 Oct 2018 11:32:40 -0500 Subject: add a fast solid angle approximation to speed up the fast likelihood calculation --- src/solid_angle.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src/solid_angle.c') diff --git a/src/solid_angle.c b/src/solid_angle.c index a929938..dbac045 100644 --- a/src/solid_angle.c +++ b/src/solid_angle.c @@ -3,6 +3,7 @@ #include #include #include +#include "vector.h" static double hd[11] = {0.1,0.125,0.150,0.175,0.2,0.3,0.4,0.5,0.6,0.8,1.0}; static double Rd[13] = {0.1,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5,2.0}; @@ -23,6 +24,24 @@ static double lookupTable[13][11] = { {1.0041,1.0051,1.0061,1.0070,1.0078,1.0106,1.0120,1.0122,1.0116,1.0097,1.0084} }; +double get_solid_angle_fast(double *pos, double *pmt, double *n, double r) +{ + /* Returns a *very* fast approximation of the solid angle subtended by a + * circular disk of radius r at a position `pmt` with a normal vector `n` from + * a position `pos`. */ + double dir[3]; + double R, cos_theta_pmt; + + SUB(dir,pos,pmt); + + /* Distance to the PMT. */ + R = NORM(dir); + + cos_theta_pmt = fabs(DOT(dir,n)/R); + + return pow(r,2)*cos_theta_pmt/pow(R,2); +} + static double A(double u, double a, double h) { return atan(((a*a-h*h)*u - 2*a*a*h*h)/(2*a*h*sqrt((u-h*h)*(u+a*a)))); -- cgit