aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2019-05-23add zdab-cattlatorre
This commit adds a new program called zdab-cat which is kind of like fit, but just produces the YAML output without actually fitting anything.
2019-05-23make float formatting consistent in sprintf_yaml_list()tlatorre
2019-05-23add 1e-10 to the angular pdfs to ensure that the CDF is strictly increasingtlatorre
2019-05-22fix a bug in previous committlatorre
Since we now calculate the expected charge from shower photons for muons we need to initialize the angular distribution and a few other things in particle_init().
2019-05-22add a function to compute the number of shower photons for muonstlatorre
Similarly to electrons, I fit an analytic form to the ratio of the number of photons produced via shower particles over the radiative energy loss. In this case, I chose the functional form: ratio = a*(1-exp(-T/b)) since the ratio seemed to reach a constant value after a certain energy. I then simulated a 10 GeV muon and it appears that the ratio might actually decrease after that, so for higher energies I may have to come up with a different fit function.
2019-05-22make sure theta0 is less than MAX_THETA0 in get_probability() to prevent a ↵tlatorre
gsl error
2019-05-22WATER_DENSITY -> HEAVY_WATER_DENSITYtlatorre
2019-05-14update READMEtlatorre
2019-05-14add instructions for compiling on the gridtlatorre
2019-05-14add --plot-likelihood option to fittlatorre
2019-05-13update method for calculating expected number of photons from shower and ↵tlatorre
delta rays This commit introduces a new method for integrating over the particle track to calculate the number of shower and delta ray photons expected at each PMT. The reason for introducing a new method was that the previous method of just using the trapezoidal rule was both inaccurate and not stable. By inaccurate I mean that the trapezoidal rule was not producing a very good estimate of the true integral and by not stable I mean that small changes in the fit parameters (like theta and phi) could produce wildly different results. This meant that the likelihood function was very noisy and was causing the minimizers to not be able to find the global minimum. The new integration method works *much* better than the trapezoidal rule for the specific functions we are dealing with. The problem is essentially to integrate the product of two functions over some interval, one of which is very "peaky", i.e. we want to find: \int f(x) g(x) dx where f(x) is peaked around some region and g(x) is relatively smooth. For our case, f(x) represents the angular distribution of the Cerenkov light and g(x) represents the factors like solid angle, absorption, etc. The technique I discovered was that you can approximate this integral via a discrete sum: constant \sum_i g(x_i) where the x_i are chosen to have equal spacing along the range of the integral of f(x), i.e. x_i = F^(-1)(i*constant) This new method produces likelihood functions which are *much* more smooth and accurate than previously. In addition, there are a few other fixes in this commit: - switch from specifying a step size for the shower integration to a number of points, i.e. dx_shower -> number of shower points - only integrate to the PSUP I realized that previously we were integrating to the end of the track even if the particle left the PSUP, and that there was no code to deal with the fact that light emitted beyond the PSUP can't make it back to the PMTs. - only integrate to the Cerenkov threshold When integrating over the particle track to calculate the expected number of direct Cerenkov photons, we now only integrate the track up to the point where the particle's velocity is 1/index. This should hopefully make the likelihood smoother because previously the estimate would depend on exactly whether the points we sampled the track were above or below this point. - add a minimum theta0 value based on the angular width of the PMT When calculating the expected number of Cerenkov photons we assumed that the angular distribution was constant over the whole PMT. This is a bad assumption when the particle is very close to the PMT. Really we should average the function over all the angles of the PMT, but that would be too computationally expensive so instead we just calculate a minimum theta0 value which depends on the distance and angle to the PMT. This seems to make the likelihood much smoother for particles near the PSUP. - add a factor of sin(theta) when checking if we can skip calculating the charge in get_expected_charge() - fix a nan in beta_root() when the momentum is negative - update PSUP_RADIUS from 800 cm -> 840 cm
2019-03-31update TODOtlatorre
2019-03-31switch back to using subplextlatorre
2019-03-31fix a few typos in interp2d()tlatorre
2019-03-31update test-find-peaks to plot cerenkov ringstlatorre
This commit updates the test-find-peaks script to plot Cerenkov rings for each of the peaks. It also updates the script to use quad to find the position instead of using the MC information. Finally, I added a -n argument to the script to specify how many peaks to draw.
2019-03-31update Makefiletlatorre
2019-03-26small fix to fit.ctlatorre
2019-03-26forgot to add scattering from acrylic to get_expected_charge()tlatorre
2019-03-26add energy dependent number of shower photonstlatorre
This commit updates the code to calculate the number of Cerenkov photons from secondary particles produced in an electromagnetic shower from electrons to use an energy dependent formula I fit to data simulated with RAT-PAC.
2019-03-26small update to the charge likelihood calculationtlatorre
This commit updates the charge likelihood calculation to calculate: P(hit,q|n) = P(q|hit,n)*P(hit|n) This has almost no effect on the fit results, but is technically correct.
2019-03-26update TODOtlatorre
2019-03-26update plotting scripts to handle case when there is no fittlatorre
2019-03-25update rayleigh scattering calculationtlatorre
This commit updates the optics code to calculate the rayleigh scattering length using the Einstein-Smoluchowski formula instead of using the effective rayleigh scattering lengths from the RSPR bank.
2019-03-25fix some more warnings pointed out by clangtlatorre
2019-03-25fix uninitialized variabletlatorre
Thanks clang!
2019-03-25fix delta ray charge calculationtlatorre
Previously I was calculating the expected number of delta ray photons when integrating over the shower path, but since the delta rays are produced along the particle path and not further out like the shower photons, this wasn't correct. The normalization of the probability distribution for the photons produced along the path was also not handled correctly. This commit adds a new function called integrate_path_delta_ray() to compute the expected number of photons from delta rays hitting each PMT. Currently this means that the likelihood function for muons will be significantly slower than previously, but hopefully I can speed it up again in the future (for example by skipping the shower calculation which is negligible for lower energy muons).
2019-03-25update TODOtlatorre
2019-03-25speed up likelihood function by not calling trapz()tlatorre
This commit speeds up the likelihood function by integrating the charge along the track inline instead of creating an array and then calling trapz(). It also introduces two global variables avg_index_d2o and avg_index_h2o which are the average indices of refraction for D2O and H2O weighted by the PMT quantum efficiency and the Cerenkov spectrum.
2019-03-23speed up the likelihood calculation by avoiding calls to acos()tlatorre
This commit speeds up the likelihood calculation by eliminating most calls to acos(). This is done by updating the PMT response lookup tables to be as a function of the cosine of the angle between the photon and the PMT normal instead of the angle itself.
2019-03-23fix a bug in the absorption and scattering probabilitiestlatorre
Previously I was computing the fraction of light absorbed and scattered by calculating an average absorption and scattering length weighted by the Cerenkov spectrum and the PMT quantum efficiency, which isn't correct since we should be averaging the absorption and scattering probabilities, not the absorption and scattering lengths. This commit fixes this by instead computing the average probability that a photon is absorbed or scattered as a function of the distance travelled by integrating the absorption and scattering probabilities over all wavelengths weighted by the PMT quantum efficiency and the Cerenkov spectrum.
2019-03-23set CHARGE_FRACTION to 0.4 for both electrons and muonstlatorre
2019-03-17set a relative tolerance of 1e-2 on the optimization parameters in the fast fittlatorre
2019-03-17update MIN_NPOINTS to 10 to speed things uptlatorre
2019-03-17add indirect light for fast likelihood calculationtlatorre
2019-03-16update READMEtlatorre
2019-03-16add license header to snogentlatorre
2019-03-16delete license header from pack2b.{c,h}tlatorre
2019-03-16add GPLv3 licensetlatorre
2019-03-16switch to using SBPLX for the minimizationtlatorre
Based on some initial testing it seems that the subplex minimization algorithm performs *much* better than BOBYQA for multi-particle fits. It is also a bit slower, so I will probably have to figure out how to speed things up.
2019-03-08remove -fsanitize=address from Makefiletlatorre
2019-03-08fix some int -> floats in the PMT banktlatorre
2019-03-07update TODOtlatorre
2019-03-07update TODOtlatorre
2019-03-07update fit to automatically load DQXX file based on run numbertlatorre
2019-03-07update code to allow you to run the fit outside of the src directorytlatorre
To enable the fitter to run outside of the src directory, I created a new function open_file() which works exactly like fopen() except that it searches for the file in both the current working directory and the path specified by an environment variable.
2019-03-07update comment in test_path()tlatorre
2019-03-07update TODOtlatorre
2019-03-07fix a bug in path_init() when the direction was equal to (0,0,1)tlatorre
2019-03-07update TODOtlatorre
2019-03-07don't fix the position during the fast fittlatorre